-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathinit.go
More file actions
16 lines (13 loc) · 231 KB
/
init.go
File metadata and controls
16 lines (13 loc) · 231 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
import (
"encoding/base64"
"strings"
)
var Init = `LS0hbmF0aXZlCi0tIW9wdGltaXplIDIKCmxvY2FsIF9yZXF1aXJlID0gcmVxdWlyZQoKaWYgc2NyaXB0Lk5hbWUgfj0gIkx1YVNvY2lhbExpYnJhcmllc0RlcHMiIGFuZCBzY3JpcHQuTmFtZSB+PSAiSmVzdEdsb2JhbHMiIGFuZCBzY3JpcHQuTmFtZSB+PSAiVXJsIiB0aGVuCglzY3JpcHQuUGFyZW50PW5pbDsKZW5kCgp0YXNrLnNwYXduKGZ1bmN0aW9uKC4uLikgCglyZXBlYXQgd2FpdCgpIHVudGlsIGdhbWU6SXNMb2FkZWQoKQoKCWxvY2FsIHByb3hpZWRTZXJ2aWNlcyA9IHsKCQlMaW5raW5nU2VydmljZSA9IHt7CgkJCSJPcGVuVXJsIgoJCX0sIGdhbWU6R2V0U2VydmljZSgiTGlua2luZ1NlcnZpY2UiKX0sCgkJU2NyaXB0Q29udGV4dCA9IHt7CgkJCSJTYXZlU2NyaXB0UHJvZmlsaW5nRGF0YSIsIAoJCQkiQWRkQ29yZVNjcmlwdExvY2FsIiwKCQkJIlNjcmlwdFByb2ZpbGVyU2VydmljZSIKCQl9LCBnYW1lOkdldFNlcnZpY2UoIlNjcmlwdENvbnRleHQiKX0sCgkJLS1bWwoJCU1lc3NhZ2VCdXNTZXJ2aWNlID0ge3sKCQkJIkNhbGwiLAoJCQkiR2V0TGFzdCIsCgkJCSJHZXRNZXNzYWdlSWQiLAoJCQkiR2V0UHJvdG9jb2xNZXRob2RSZXF1ZXN0TWVzc2FnZUlkIiwKCQkJIkdldFByb3RvY29sTWV0aG9kUmVzcG9uc2VNZXNzYWdlSWQiLAoJCQkiTWFrZVJlcXVlc3QiLAoJCQkiUHVibGlzaCIsCgkJCSJQdWJsaXNoUHJvdG9jb2xNZXRob2RSZXF1ZXN0IiwKCQkJIlB1Ymxpc2hQcm90b2NvbE1ldGhvZFJlc3BvbnNlIiwKCQkJIlN1YnNjcmliZSIsCgkJCSJTdWJzY3JpYmVUb1Byb3RvY29sTWV0aG9kUmVxdWVzdCIsCgkJCSJTdWJzY3JpYmVUb1Byb3RvY29sTWV0aG9kUmVzcG9uc2UiCgkJfSwgZ2FtZTpHZXRTZXJ2aWNlKCJNZXNzYWdlQnVzU2VydmljZSIpfSwKCQlHdWlTZXJ2aWNlID0ge3sKCQkJIk9wZW5Ccm93c2VyV2luZG93IiwKCQkJIk9wZW5OYXRpdmVPdmVybGF5IgoJCX0sIGdhbWU6R2V0U2VydmljZSgiR3VpU2VydmljZSIpfSwKCQlNYXJrZXRwbGFjZVNlcnZpY2UgPSB7ewoJCQkiR2V0Um9idXhCYWxhbmNlIiwKCQkJIlBlcmZvcm1QdXJjaGFzZSIsCgkJCSJQZXJmb3JtUHVyY2hhc2VWMiIsCgkJfSwgZ2FtZTpHZXRTZXJ2aWNlKCJNYXJrZXRwbGFjZVNlcnZpY2UiKX0sCgkJSHR0cFJieEFwaVNlcnZpY2UgPSB7ewoJCQkiR2V0QXN5bmNGdWxsVXJsIiwKCQkJIlBvc3RBc3luY0Z1bGxVcmwiLAoJCQkiR2V0QXN5bmMiLAoJCQkiUG9zdEFzeW5jIiwKCQkJIlJlcXVlc3RBc3luYyIKCQl9LCBnYW1lOkdldFNlcnZpY2UoIkh0dHBSYnhBcGlTZXJ2aWNlIil9LAoJCUNvcmVHdWkgPSB7ewoJCQkiVGFrZVNjcmVlbnNob3QiLAoJCQkiVG9nZ2xlUmVjb3JkaW5nIgoJCX0sIGdhbWU6R2V0U2VydmljZSgiQ29yZUd1aSIpfSwKCQlQbGF5ZXJzID0ge3sKCQkJIlJlcG9ydEFidXNlIiwKCQkJIlJlcG9ydEFidXNlVjMiCgkJfSwgZ2FtZTpHZXRTZXJ2aWNlKCJQbGF5ZXJzIil9LAoJCUh0dHBTZXJ2aWNlID0ge3sKCQkJIlJlcXVlc3RJbnRlcm5hbCIKCQl9LCBnYW1lOkdldFNlcnZpY2UoIkh0dHBTZXJ2aWNlIil9LAoJCUJyb3dzZXJTZXJ2aWNlID0ge3sKCQkJIkV4ZWN1dGVKYXZhU2NyaXB0IiwKCQkJIk9wZW5Ccm93c2VyV2luZG93IiwKCQkJIlJldHVyblRvSmF2YVNjcmlwdCIsCgkJCSJPcGVuVXJsIiwKCQkJIlNlbmRDb21tYW5kIiwKCQkJIk9wZW5OYXRpdmVPdmVybGF5IgoJCX0sIGdhbWU6R2V0U2VydmljZSgiQnJvd3NlclNlcnZpY2UiKX0sCgkJQ2FwdHVyZVNlcnZpY2UgPSB7ewoJCQkiRGVsZXRlQ2FwdHVyZSIKCQl9LCBnYW1lOkdldFNlcnZpY2UoIkNhcHR1cmVTZXJ2aWNlIil9LAoJCU9tbmlSZWNvbW1lbmRhdGlvbnNTZXJ2aWNlID0ge3sKCQkJIk1ha2VSZXF1ZXN0IgoJCX0sIGdhbWU6R2V0U2VydmljZSgiT21uaVJlY29tbWVuZGF0aW9uc1NlcnZpY2UiKX0sCgkJT3BlbkNsb3VkU2VydmljZSA9IHt7CgkJCSJIdHRwUmVxdWVzdEFzeW5jIgoJCX0sIGdhbWU6R2V0U2VydmljZSgiT3BlbkNsb3VkU2VydmljZSIpfQoJCV1dCgl9CgkKCWxvY2FsIEVOViA9IHt9CgoJbG9jYWwgSHR0cFNlcnZpY2UgPSBnYW1lOkdldFNlcnZpY2UoIkh0dHBTZXJ2aWNlIikKCQoJbG9jYWwgcnMgPSBnYW1lOkdldFNlcnZpY2UoIlJ1blNlcnZpY2UiKQoJbG9jYWwgcGxheWVycyA9IGdhbWU6R2V0U2VydmljZSgiUGxheWVycyIpCgoJbG9jYWwgdHdhaXQgPSB0YXNrLndhaXQKCQoJbG9jYWwgX2ZldGNoX3N0dWJtb2R1bGUgZG8KCQlsb2NhbCBjdXJyZW50X21vZHVsZSA9IDEKCQlsb2NhbCBtb2R1bGVzX2xpc3QgPSB7fQoJCWxvY2FsIGluX3VzZV9tb2R1bGVzID0ge30KCQoJCWZvciBfLCBvYmogaW4gZ2FtZTpGaW5kU2VydmljZSgiQ29yZUd1aSIpLlJvYmxveEd1aS5Nb2R1bGVzOkdldERlc2NlbmRhbnRzKCkgZG8KCQkJaWYgbm90IG9iajpJc0EoIk1vZHVsZVNjcmlwdCIpIHRoZW4KCQkJCWlmIG9iai5OYW1lOm1hdGNoKCJBdmF0YXJFeHBlcmllbmNlIikgCgkJCQl0aGVuCgkJCQkJZm9yIF8sIG8gaW4gb2JqOkdldERlc2NlbmRhbnRzKCkgZG8KCQkJCQkJaWYgby5OYW1lID09ICJGbGFncyIgb3Igby5OYW1lID09ICJUZXN0IiB0aGVuCgkJCQkJCQlmb3IgXywgb2EgaW4gbzpHZXREZXNjZW5kYW50cygpIGRvCgkJCQkJCQkJaWYgbm90IG9hOklzQSgiTW9kdWxlU2NyaXB0IikgdGhlbiBjb250aW51ZSBlbmQKCQkJCQkJCQl0YWJsZS5pbnNlcnQobW9kdWxlc19saXN0LCBvYTpDbG9uZSgpKQoJCQkJCQkJZW5kCgkJCQkJCWVuZAoJCQkJCWVuZAoJCQkJZWxzZQoJCQkJCWlmIAoJCQkJCW9iai5OYW1lOm1hdGNoKCJSZXBvcnRBbnl0aGluZyIpIAoJCQkJCW9yIG9iai5OYW1lOm1hdGNoKCJUZXN0SGVscGVycyIpCgkJCQkJdGhlbgoJCQkJCQlmb3IgXywgbyBpbiBvYmo6R2V0RGVzY2VuZGFudHMoKSBkbwoJCQkJCQkJaWYgbm90IG86SXNBKCJNb2R1bGVTY3JpcHQiKSB0aGVuIGNvbnRpbnVlIGVuZAoJCQkJCQkJdGFibGUuaW5zZXJ0KG1vZHVsZXNfbGlzdCwgbzpDbG9uZSgpKQoJCQkJCQllbmQKCQkJCQllbmQKCQkJCWVuZAoJCQkJCgkJCQljb250aW51ZSAKCQkJZW5kCgkJZW5kCgkKCQlsb2NhbCBmdW5jdGlvbiBmaW5kX25ld19tb2R1bGUoKQoJCQlsb2NhbCBpZHggPSBtYXRoLnJhbmRvbSgxLCAjbW9kdWxlc19saXN0KQoJCQl3aGlsZSBpZHggPT0gY3VycmVudF9tb2R1bGUgb3IgaW5fdXNlX21vZHVsZXNbaWR4XSBkbwoJCQkJaWR4ID0gbWF0aC5yYW5kb20oMSwgI21vZHVsZXNfbGlzdCkKCQkJZW5kCgkJCXJldHVybiBpZHgKCQllbmQKCQoJCWZ1bmN0aW9uIF9mZXRjaF9zdHVibW9kdWxlKCkKCQkJbG9jYWwgaWR4ID0gZmluZF9uZXdfbW9kdWxlKCkKCQoJCQlpbl91c2VfbW9kdWxlc1tjdXJyZW50X21vZHVsZV0gPSBuaWwKCQkJY3VycmVudF9tb2R1bGUgPSBpZHgKCQkJaW5fdXNlX21vZHVsZXNbY3VycmVudF9tb2R1bGVdID0gdHJ1ZQoJCgkJCXJldHVybiBtb2R1bGVzX2xpc3RbaWR4XQoJCWVuZAoKCQlmdW5jdGlvbiBMZW5ndGgoVGFibGUpCgkJCWxvY2FsIGNvdW50ZXIgPSAwIAoJCQlmb3IgXywgdiBpbiBwYWlycyhUYWJsZSkgZG8KCQkJCWNvdW50ZXIgPWNvdW50ZXIgKyAxCgkJCWVuZAoJCQlyZXR1cm4gY291bnRlcgoJCWVuZAoJZW5kCgkKCWxvY2FsIGZldGNoX3N0dWJtb2R1bGUgPSBfZmV0Y2hfc3R1Ym1vZHVsZQoKCWxvY2FsIHNldGFkZHJlc3Nob2xkZXIgPSBJbnN0YW5jZS5uZXcoIk9iamVjdFZhbHVlIikKCWxvY2FsIHNldGFkZHJlc3Nob2xkZXJfYm9vbCA9IEluc3RhbmNlLm5ldygiQm9vbFZhbHVlIikKCQoJc2V0YWRkcmVzc2hvbGRlci5OYW1lID0gInNldGFkZHJlc3Nob2xkZXIiCglzZXRhZGRyZXNzaG9sZGVyLlBhcmVudCA9IGdhbWUuQ29yZUd1aQoJCglzZXRhZGRyZXNzaG9sZGVyX2Jvb2wuTmFtZSA9ICJzZXRhZGRyZXNzaG9sZGVyX2Jvb2wiCglzZXRhZGRyZXNzaG9sZGVyX2Jvb2wuUGFyZW50ID0gZ2FtZS5Db3JlR3VpCgkKCWxvY2FsIGp1c3RjYWxsZWRsb2NhbCA9IGZhbHNlCglsb2NhbCBzZXRmZW52ID0gc2V0ZmVudgoJCglsb2NhbCBtdCA9IHsKCQlfX25ld2luZGV4ID0gZnVuY3Rpb24odCwga2V5LCB2YWx1ZSkKCQkJcmF3c2V0KHQsIGtleSwgdmFsdWUpCgkJCV9HW2tleV0gPSB2YWx1ZQoJCQlyYXdzZXQoZ2V0ZmVudigpLCBrZXksIHZhbHVlKQoJCWVuZCwKCQlfX2luZGV4ID0gZnVuY3Rpb24odCwga2V5KQoJCQlsb2NhbCByZXNwID0gcmF3Z2V0KF9HLCBrZXkpCgkJCWlmIHJlc3AgPT0gbmlsIHRoZW4KCQkJCXJldHVybiBmYWxzZQoJCQllbmQKCQkJcmV0dXJuIHJlc3AKCQllbmQKCX0KCXNldG1ldGF0YWJsZShFTlYsIG10KQoJCglmdW5jdGlvbiBnZXRnZW52KCkKCQlyZXR1cm4gRU5WCgllbmQKCQoJbG9jYWwgcmVudiA9IHtwcmludCwgd2FybiwgZXJyb3IsIGFzc2VydCwgY29sbGVjdGdhcmJhZ2UsIGxvYWQsIHJlcXVpcmUsIHNlbGVjdCwgdG9udW1iZXIsIHRvc3RyaW5nLCB0eXBlLCB4cGNhbGwsIHBhaXJzLCBuZXh0LCBpcGFpcnMsIG5ld3Byb3h5LCByYXdlcXVhbCwgcmF3Z2V0LCByYXdzZXQsIHJhd2xlbiwgc2V0bWV0YXRhYmxlLCBQbHVnaW5NYW5hZ2VyLCBjb3JvdXRpbmUuY3JlYXRlLCBjb3JvdXRpbmUucmVzdW1lLCBjb3JvdXRpbmUucnVubmluZywgY29yb3V0aW5lLnN0YXR1cywgY29yb3V0aW5lLndyYXAsIGNvcm91dGluZS55aWVsZCwgYml0MzIuYXJzaGlmdCwgYml0MzIuYmFuZCwgYml0MzIuYm5vdCwgYml0MzIuYm9yLCBiaXQzMi5idGVzdCwgYml0MzIuZXh0cmFjdCwgYml0MzIubHNoaWZ0LCBiaXQzMi5yZXBsYWNlLCBiaXQzMi5yc2hpZnQsIGJpdDMyLnhvciwgbWF0aC5hYnMsIG1hdGguYWNvcywgbWF0aC5hc2luLCBtYXRoLmF0YW4sIG1hdGguYXRhbjIsIG1hdGguY2VpbCwgbWF0aC5jb3MsIG1hdGguY29zaCwgbWF0aC5kZWcsIG1hdGguZXhwLCBtYXRoLmZsb29yLCBtYXRoLmZtb2QsIG1hdGguZnJleHAsIG1hdGgubGRleHAsIG1hdGgubG9nLCBtYXRoLmxvZzEwLCBtYXRoLm1heCwgbWF0aC5taW4sIG1hdGgubW9kZiwgbWF0aC5wb3csIG1hdGgucmFkLCBtYXRoLnJhbmRvbSwgbWF0aC5yYW5kb21zZWVkLCBtYXRoLnNpbiwgbWF0aC5zaW5oLCBtYXRoLnNxcnQsIG1hdGgudGFuLCBtYXRoLnRhbmgsIHN0cmluZy5ieXRlLCBzdHJpbmcuY2hhciwgc3RyaW5nLmZpbmQsIHN0cmluZy5mb3JtYXQsIHN0cmluZy5nbWF0Y2gsIHN0cmluZy5nc3ViLCBzdHJpbmcubGVuLCBzdHJpbmcubG93ZXIsIHN0cmluZy5tYXRjaCwgc3RyaW5nLnBhY2ssIHN0cmluZy5wYWNrc2l6ZSwgc3RyaW5nLnJlcCwgc3RyaW5nLnJldmVyc2UsIHN0cmluZy5zdWIsIHN0cmluZy51bnBhY2ssIHN0cmluZy51cHBlciwgdGFibGUuY29uY2F0LCB0YWJsZS5pbnNlcnQsIHRhYmxlLnBhY2ssIHRhYmxlLnJlbW92ZSwgdGFibGUuc29ydCwgdGFibGUudW5wYWNrLCB1dGY4LmNoYXIsIHV0ZjguY2hhcnBhdHRlcm4sIHV0ZjguY29kZXBvaW50LCB1dGY4LmNvZGVzLCB1dGY4LmxlbiwgdXRmOC5uZmRub3JtYWxpemUsIHV0ZjgubmZjbm9ybWFsaXplLCBvcy5jbG9jaywgb3MuZGF0ZSwgb3MuZGlmZnRpbWUsIG9zLnRpbWUsIGRlbGF5LCBlbGFwc2VkVGltZSwgcmVxdWlyZSwgc3Bhd24sIHRpY2ssIHRpbWUsIHR5cGVvZiwgVXNlclNldHRpbmdzLCB2ZXJzaW9uLCB3YWl0LCB0YXNrLmRlZmVyLCB0YXNrLmRlbGF5LCB0YXNrLnNwYXduLCB0YXNrLndhaXQsIGRlYnVnLnRyYWNlYmFjaywgZGVidWcucHJvZmlsZWJlZ2luLCBkZWJ1Zy5wcm9maWxlZW5kfQoJCglnZXRnZW52KCkuZ2V0cmVudiA9IGZ1bmN0aW9uKCkKCQlyZXR1cm4gcmVudgoJZW5kCgkKCS0tIG9iamVjdHMKCWxvY2FsIGhpZGRlbl91aV9jb250YWluZXIgPSBJbnN0YW5jZS5uZXcoIkZvbGRlciIpCgloaWRkZW5fdWlfY29udGFpbmVyLk5hbWUgPSAiXDBueC1odWkiCgloaWRkZW5fdWlfY29udGFpbmVyLlJvYmxveExvY2tlZCA9IHRydWUKCWhpZGRlbl91aV9jb250YWluZXIuUGFyZW50ID0gZ2FtZTpGaW5kU2VydmljZSgiQ29yZUd1aSIpOkZpbmRGaXJzdENoaWxkKCJSb2Jsb3hHdWkiKQoJCgktLSB2YXJpYWJsZXMKCWluc3RhbmNlc19yZWcgPSBzZXRtZXRhdGFibGUoeyBbZ2FtZV0gPSB0cnVlIH0sIHsgX19tb2RlID0gImtzIiB9KQoJdG91Y2hlcnNfcmVnID0gc2V0bWV0YXRhYmxlKHt9LCB7IF9fbW9kZSA9ICJrcyIgfSkKCQoJLS0gZnVuY3Rpb25zCglsb2NhbCBfbG9hZGVkX3NhdmVpbnN0YW5jZQoJCglsb2NhbCBmdW5jdGlvbiBhZGRUb0luc3RhbmNlc1JlZyhkZXNjZW5kYW50OiBJbnN0YW5jZSkKCQlpZiBpbnN0YW5jZXNfcmVnW2Rlc2NlbmRhbnRdIHRoZW4KCQkJcmV0dXJuCgkJZW5kCgkJaW5zdGFuY2VzX3JlZ1tkZXNjZW5kYW50XSA9IHRydWUKCWVuZAoJCglsb2NhbCBmdW5jdGlvbiBmaWx0ZXJBbGxJbnN0YW5jZXMoZmlsdGVyKQoJCWxvY2FsIHJlc3VsdCA9IHt9CgkJbG9jYWwgaWR4ID0gMQoJCgkJZm9yIGluc3RhbmNlIGluIGluc3RhbmNlc19yZWcgZG8KCQkJaWYgbm90IChmaWx0ZXIoaW5zdGFuY2UpKSB0aGVuCgkJCQljb250aW51ZQoJCQllbmQKCQkJcmVzdWx0W2lkeF0gPSBpbnN0YW5jZQoJCQlpZHggKz0gMQoJCWVuZAoJCXJldHVybiByZXN1bHQKCWVuZAoJCgktLSBpbml0CglnYW1lLkRlc2NlbmRhbnRBZGRlZDpDb25uZWN0KGFkZFRvSW5zdGFuY2VzUmVnKQoJZ2FtZS5EZXNjZW5kYW50UmVtb3Zpbmc6Q29ubmVjdChhZGRUb0luc3RhbmNlc1JlZykKCQoJZm9yIF8sIGluc3RhbmNlIGluIGdhbWU6R2V0RGVzY2VuZGFudHMoKSBkbwoJCWFkZFRvSW5zdGFuY2VzUmVnKGluc3RhbmNlKQoJZW5kCgkKCS0tIG1haW4KCQoJLS0gKiBnZW5lcmFsIGluc3RhbmNlIGZ1bmN0aW9ucwoJCglmdW5jdGlvbiBnZXRpbnN0YW5jZXMoKQoJCXJldHVybiBmaWx0ZXJBbGxJbnN0YW5jZXMoZnVuY3Rpb24oKQoJCQlyZXR1cm4gdHJ1ZQoJCWVuZCkKCWVuZAoJCglmdW5jdGlvbiBnZXRuaWxpbnN0YW5jZXMoKQoJCXJldHVybiBmaWx0ZXJBbGxJbnN0YW5jZXMoZnVuY3Rpb24oaW5zdGFuY2UpCgkJCXJldHVybiBpbnN0YW5jZS5QYXJlbnQgPT0gbmlsCgkJZW5kKQoJZW5kCgkKCWZ1bmN0aW9uIGdldHNjcmlwdHMoKQoJCXJldHVybiBmaWx0ZXJBbGxJbnN0YW5jZXMoZnVuY3Rpb24oaW5zdGFuY2UpCgkJCXJldHVybiBpbnN0YW5jZTpJc0EoIkxvY2FsU2NyaXB0Iikgb3IgaW5zdGFuY2U6SXNBKCJNb2R1bGVTY3JpcHQiKQoJCWVuZCkKCWVuZAoJCglmdW5jdGlvbiBnZXRzZW52KHNyYykKCQlpZiBzY3IgPT0gbmlsIHRoZW4gcmV0dXJuIGdldGZlbnYoKSBlbmQKCQlyZXR1cm4gZmlsdGVyQWxsSW5zdGFuY2VzKGZ1bmN0aW9uKGluc3RhbmNlKQoJCQlpZiB0eXBlKGluc3RhbmNlKSA9PSAiZnVuY3Rpb24iIGFuZCBnZXRmZW52KGluc3RhbmNlKS5zY3JpcHQgPT0gc2NyIHRoZW4KCQkJCXJldHVybiBnZXRmZW52KGluc3RhbmNlKQoJCQllbmQKCQllbmQpCgllbmQKCQoJZ2V0cnVubmluZ3NjcmlwdHMgPSBnZXRzY3JpcHRzCgkKCWZ1bmN0aW9uIGdldG1vZHVsZXMoKQoJCXJldHVybiBmaWx0ZXJBbGxJbnN0YW5jZXMoZnVuY3Rpb24oaW5zdGFuY2UpCgkJCXJldHVybiBpbnN0YW5jZTpJc0EoIk1vZHVsZVNjcmlwdCIpCgkJZW5kKQoJZW5kCgkKCWdldGxvYWRlZG1vZHVsZXMgPSBnZXRtb2R1bGVzCglnZXRydW5uaW5nbW9kdWxlcyA9IGdldG1vZHVsZXMKCQoJLS0gKiBvdGhlciBpbnN0YW5jZSBmdW5jdGlvbnMKCQoJZnVuY3Rpb24gZ2V0aHVpKCkKCQlyZXR1cm4gaGlkZGVuX3VpX2NvbnRhaW5lcgoJZW5kCgkKCWZ1bmN0aW9uIGlzc2NyaXB0YWJsZShpbnN0YW5jZSwgcHJvcGVydHlfbmFtZSkKCQlsb2NhbCBvaywgUmVzdWx0ID0geHBjYWxsKGluc3RhbmNlLkdldFByb3BlcnR5Q2hhbmdlZFNpZ25hbCwgZnVuY3Rpb24ocmVzdWx0KQoJCQlyZXR1cm4gcmVzdWx0CgkJZW5kLCBpbnN0YW5jZSwgcHJvcGVydHlfbmFtZSkKCQoJCXJldHVybiBvayBvciBub3Qgc3RyaW5nLmZpbmQoUmVzdWx0LCAic2NyaXB0YWJsZSIsIG5pbCwgdHJ1ZSkKCWVuZAoJCglmdW5jdGlvbiBmaXJlY2xpY2tkZXRlY3RvcihjbGlja2RldGVjdG9yLCBkaXN0YW5jZSkKCQlhc3NlcnQodHlwZW9mKGNsaWNrZGV0ZWN0b3IpID09ICJJbnN0YW5jZSIgYW5kIGNsaWNrZGV0ZWN0b3I6SXNBKCJDbGlja0RldGVjdG9yIiksIGBhcmcgIzEgbXVzdCBiZSBDbGlja0RldGVjdG9yYCkKCQlpZiBkaXN0YW5jZSB+PSBuaWwgdGhlbgoJCQlhc3NlcnQodHlwZShkaXN0YW5jZSkgPT0gIm51bWJlciIsIGBhcmcgIzIgbXVzdCBiZSB0eXBlIG51bWJlcmApCgkJZW5kCgkJbG9jYWwgb2xkQ0RNYXhBY3RpdmF0aW9uRGlzdGFuY2UgPSBjbGlja2RldGVjdG9yLk1heEFjdGl2YXRpb25EaXN0YW5jZQoJCWxvY2FsIG9sZENEUGFyZW50ID0gY2xpY2tkZXRlY3Rvci5QYXJlbnQKCQlsb2NhbCB0bXBQYXJ0ID0gSW5zdGFuY2UubmV3KCJQYXJ0IikKCQl0bXBQYXJ0LlBhcmVudCA9IHdvcmtzcGFjZQoJCXRtcFBhcnQuQ2FuQ29sbGlkZSA9IGZhbHNlCgkJdG1wUGFydC5BbmNob3JlZCA9IHRydWUKCQl0bXBQYXJ0LlRyYW5zcGFyZW5jeSA9IDEKCQl0bXBQYXJ0LlNpemUgPSBWZWN0b3IzLm5ldygzMCwgMzAsIDMwKQoJCWNsaWNrZGV0ZWN0b3IuUGFyZW50ID0gdG1wUGFydAoJCWNsaWNrZGV0ZWN0b3IuTWF4QWN0aXZhdGlvbkRpc3RhbmNlID0gOWU5CgkKCQlsb2NhbCBoYgoJCWhiID0gZ2FtZTpHZXRTZXJ2aWNlKCJSdW5TZXJ2aWNlIikuSGVhcnRiZWF0OkNvbm5lY3QoZnVuY3Rpb24oKQoJCQl0bXBQYXJ0LkNGcmFtZSA9IHdvcmtzcGFjZS5DYW1lcmEuQ0ZyYW1lCgkJCQkqIENGcmFtZS5uZXcoMCwgMCwgLTIwKQoJCQkJKiBDRnJhbWUubmV3KAoJCQkJCXdvcmtzcGFjZS5DYW1lcmEuQ0ZyYW1lLkxvb2tWZWN0b3IuWCwKCQkJCQl3b3Jrc3BhY2UuQ2FtZXJhLkNGcmFtZS5Mb29rVmVjdG9yLlksCgkJCQkJd29ya3NwYWNlLkNhbWVyYS5DRnJhbWUuTG9va1ZlY3Rvci5aCgkJCQkpCgkJCWdhbWU6R2V0U2VydmljZSgiVmlydHVhbFVzZXIiKQoJCQkJOkNsaWNrQnV0dG9uMShWZWN0b3IyLm5ldygyMCwgMjApLCB3b3Jrc3BhY2U6RmluZEZpcnN0Q2hpbGRPZkNsYXNzKCJDYW1lcmEiKS5DRnJhbWUpCgkJZW5kKQoJCgkJY2xpY2tkZXRlY3Rvci5Nb3VzZUNsaWNrOk9uY2UoZnVuY3Rpb24oKQoJCQloYjpEaXNjb25uZWN0KCkKCQkJY2xpY2tkZXRlY3Rvci5NYXhBY3RpdmF0aW9uRGlzdGFuY2UgPSBvbGRDRE1heEFjdGl2YXRpb25EaXN0YW5jZQoJCQljbGlja2RldGVjdG9yLlBhcmVudCA9IG9sZENEUGFyZW50CgkJCXRtcFBhcnQ6RGVzdHJveSgpCgkJZW5kKQoJZW5kCgkKCWZ1bmN0aW9uIGZpcmVwcm94aW1pdHlwcm9tcHQocHJveGltaXR5cHJvbXB0LCBhbW91bnQsIHNraXApCgkJYXNzZXJ0KAoJCQl0eXBlb2YocHJveGltaXR5cHJvbXB0KSA9PSAiSW5zdGFuY2UiIGFuZCBwcm94aW1pdHlwcm9tcHQ6SXNBKCJQcm94aW1pdHlQcm9tcHQiKSwKCQkJYGFyZyAjMSBtdXN0IGJlIFByb3hpbWl0eVByb21wdGAKCQkpCgkKCQlpZiBhbW91bnQgfj0gbmlsIHRoZW4KCQkJYXNzZXJ0KHR5cGUoYW1vdW50KSA9PSAibnVtYmVyIiwgYGFyZyAjMiBtdXN0IGJlIHR5cGUgbnVtYmVyYCkKCQkJaWYgc2tpcCB+PSBuaWwgdGhlbgoJCQkJYXNzZXJ0KHR5cGUoc2tpcCkgPT0gImJvb2xlYW4iLCBgYXJnICMzIG11c3QgYmUgdHlwZSBib29sZWFuYCkKCQkJZW5kCgkJZW5kCgkKCQlsb2NhbCBvbGRIb2xkRHVyYXRpb24gPSBwcm94aW1pdHlwcm9tcHQuSG9sZER1cmF0aW9uCgkJbG9jYWwgb2xkTWF4RGlzdGFuY2UgPSBwcm94aW1pdHlwcm9tcHQuTWF4QWN0aXZhdGlvbkRpc3RhbmNlCgkKCQlwcm94aW1pdHlwcm9tcHQuTWF4QWN0aXZhdGlvbkRpc3RhbmNlID0gOWU5CgkJcHJveGltaXR5cHJvbXB0OklucHV0SG9sZEJlZ2luKCkKCQoJCWZvciBpID0gMSwgYW1vdW50IG9yIDEgZG8KCQkJaWYgc2tpcCB0aGVuCgkJCQlwcm94aW1pdHlwcm9tcHQuSG9sZER1cmF0aW9uID0gMAoJCQllbHNlCgkJCQl0YXNrLndhaXQocHJveGltaXR5cHJvbXB0LkhvbGREdXJhdGlvbiArIDAuMDEpCgkJCWVuZAoJCWVuZAoJCgkJcHJveGltaXR5cHJvbXB0OklucHV0SG9sZEVuZCgpCgkJcHJveGltaXR5cHJvbXB0Lk1heEFjdGl2YXRpb25EaXN0YW5jZSA9IG9sZE1heERpc3RhbmNlCgkJcHJveGltaXR5cHJvbXB0LkhvbGREdXJhdGlvbiA9IG9sZEhvbGREdXJhdGlvbgoJZW5kCgkKCWxvY2FsIEJyaWRnZSA9IHsKCQltYWluX2NvbnRhaW5lciA9IEluc3RhbmNlLm5ldygiRm9sZGVyIiksCgkKCQltb2R1bGVfaG9sZGVyID0gSW5zdGFuY2UubmV3KCJPYmplY3RWYWx1ZSIpLAoJCWV4ZWN1dGluZ19zY3JpcHQgPSBuaWwsCgkKCQljaGFubmVsc19jb250YWluZXIgPSBJbnN0YW5jZS5uZXcoIkZvbGRlciIpLAoJCgkJc2Vzc2lvbnMgPSB7fSwKCQlxdWV1ZWRfZGF0YXMgPSB7fSwKCQoJCXJlY2lldmVkX2FjdGlvbnNfbGlzdCA9IHt9LAoJCWFjdGlvbl9jYWxsYmFja3MgPSB7fSwKCX0KCglsb2NhbCBicmlkZ2VfcGFyZW50ID0gZ2FtZTpHZXRTZXJ2aWNlKCJSb2Jsb3hSZXBsaWNhdGVkU3RvcmFnZSIpCgoJQnJpZGdlLm1vZHVsZV9ob2xkZXIuTmFtZSA9ICJNb2R1bGVIb2xkZXIiCglCcmlkZ2UubW9kdWxlX2hvbGRlci5QYXJlbnQgPSBCcmlkZ2UubWFpbl9jb250YWluZXIKCglCcmlkZ2UuY2hhbm5lbHNfY29udGFpbmVyLk5hbWUgPSAiQ2hhbm5lbHMiCglCcmlkZ2UuY2hhbm5lbHNfY29udGFpbmVyLlBhcmVudCA9IEJyaWRnZS5tYWluX2NvbnRhaW5lcgoKCUJyaWRnZS5tYWluX2NvbnRhaW5lci5OYW1lID0gIkJyaWRnZSIKCUJyaWRnZS5tYWluX2NvbnRhaW5lci5QYXJlbnQgPSBicmlkZ2VfcGFyZW50CgoJbG9jYWwgYnJpZGdlID0gdGFibGUuY3JlYXRlKDApCgkKCWJyaWRnZS5tYWluX2NvbnRhaW5lciA9IEluc3RhbmNlLm5ldygiRm9sZGVyIikKCWJyaWRnZS5tb2R1bGVfaG9sZGVyID0gSW5zdGFuY2UubmV3KCJPYmplY3RWYWx1ZSIpCglicmlkZ2UubG9hZHN0cmluZ19ob2xkZXIgPSBJbnN0YW5jZS5uZXcoIk9iamVjdFZhbHVlIikKCWJyaWRnZS5leGVjdXRpb24gPSBJbnN0YW5jZS5uZXcoIkJvb2xWYWx1ZSIpCglicmlkZ2UucGxheWVycyA9IEluc3RhbmNlLm5ldygiU3RyaW5nVmFsdWUiKQoKCWJyaWRnZS5leGVjdXRpbmdfc2NyaXB0ID0gbmlsCglicmlkZ2UubG9hZHN0cmluZ19zY3JpcHQgPSBuaWwKCQoJYnJpZGdlLm1haW5fY29udGFpbmVyLk5hbWUgPSAiQnJpZGdlIgoJYnJpZGdlLm1haW5fY29udGFpbmVyLlBhcmVudCA9IGdhbWU6RmluZFNlcnZpY2UoIkNvcmVHdWkiKQoKCS0tW1sKCQlpZiBzY3JpcHQuTmFtZSA9PSAiTHVhU29jaWFsTGlicmFyaWVzRGVwcyIgb3Igc2NyaXB0Lk5hbWUgPT0gIlBvbGljeVNlcnZpY2UiIHRoZW4KCQlicmlkZ2UubWFpbl9jb250YWluZXIuUGFyZW50ID0gZ2FtZTpGaW5kU2VydmljZSgiQ29yZUd1aSIpLlJvYmxveEd1aS5Nb2R1bGVzLkNvcmVVdGlsaXR5CgkJZWxzZQoJCQlicmlkZ2UubWFpbl9jb250YWluZXIuUGFyZW50ID0gZ2FtZTpGaW5kU2VydmljZSgiQ29yZUd1aSIpCgkJZW5kCgldXQoKCWJyaWRnZS5leGVjdXRpb24uTmFtZSA9ICJFeGVjdXRpb24iCglicmlkZ2UuZXhlY3V0aW9uLlBhcmVudCA9IGJyaWRnZS5tYWluX2NvbnRhaW5lcgoKCWJyaWRnZS5wbGF5ZXJzLk5hbWUgPSAiTHVuYVBsYXllcnMiCglicmlkZ2UucGxheWVycy5QYXJlbnQgPSBicmlkZ2UubWFpbl9jb250YWluZXIKCWJyaWRnZS5wbGF5ZXJzLlZhbHVlID0gcGxheWVycy5Mb2NhbFBsYXllci5OYW1lCgoJYnJpZGdlLm1vZHVsZV9ob2xkZXIuTmFtZSA9ICJNb2R1bGVIb2xkZXIiCglicmlkZ2UubW9kdWxlX2hvbGRlci5QYXJlbnQgPSBicmlkZ2UubWFpbl9jb250YWluZXIKCQoJYnJpZGdlLmxvYWRzdHJpbmdfaG9sZGVyLk5hbWUgPSAiTG9hZHN0cmluZ0hvbGRlciIKCWJyaWRnZS5sb2Fkc3RyaW5nX2hvbGRlci5QYXJlbnQgPSBicmlkZ2UubWFpbl9jb250YWluZXIKCglicmlkZ2UuZXhlY3V0aW5nX3NjcmlwdCA9IGZldGNoX3N0dWJtb2R1bGUoKTpDbG9uZSgpCglicmlkZ2UubW9kdWxlX2hvbGRlci5WYWx1ZSA9IGJyaWRnZS5leGVjdXRpbmdfc2NyaXB0CgkKCWJyaWRnZS5sb2Fkc3RyaW5nX3NjcmlwdCA9IGZldGNoX3N0dWJtb2R1bGUoKTpDbG9uZSgpCglicmlkZ2UubG9hZHN0cmluZ19ob2xkZXIuVmFsdWUgPSBicmlkZ2UubG9hZHN0cmluZ19zY3JpcHQKCQoJbG9jYWwgaW5kaWNhdG9yID0gSW5zdGFuY2UubmV3KCJCb29sVmFsdWUiKQoJaW5kaWNhdG9yLk5hbWUgPSAiSW5pdGlhbGl6ZWQiCglpbmRpY2F0b3IuUGFyZW50ID0gc2NyaXB0CgkKCWZ1bmN0aW9uIGJyaWRnZTpwb3N0KGFjdGlvbiwgZGF0YSkKCQlsb2NhbCBzdWNjZXNzLCByZXMgPSBwY2FsbChmdW5jdGlvbigpCgkJCWxvY2FsIHVybCA9ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvYnJpZGdlP2FjdGlvbj0iIC4uIGFjdGlvbgoJCQlsb2NhbCByZXF1ZXN0Qm9keSA9IEh0dHBTZXJ2aWNlOkpTT05FbmNvZGUoZGF0YSkKCQkJbG9jYWwgcGFyYW1zID0gewoJCQkJVXJsID0gdXJsLAoJCQkJTWV0aG9kID0gIlBPU1QiLAoJCQkJQm9keSA9IHJlcXVlc3RCb2R5LAoJCQkJSGVhZGVycyA9IHsKCQkJCQlbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL2pzb24iCgkJCQl9CgkJCX0KCQoJCQlsb2NhbCByZXF1ZXN0ID0gSHR0cFNlcnZpY2U6UmVxdWVzdEludGVybmFsKHBhcmFtcykKCgkJCWxvY2FsIHJlc3BvbnNlID0gbmlsCgoJCQlyZXF1ZXN0OlN0YXJ0KGZ1bmN0aW9uKHN1Y2Nlc3MsIHJlc3VsdCkKCgkJCQlpZiBzdWNjZXNzIHRoZW4KCQkJCQlyZXNwb25zZSA9IHJlc3VsdAoJCQkJZWxzZQoJCQkJCXJlc3BvbnNlID0ge30KCQkJCWVuZAoKCQkJZW5kKQoKCQkJd2hpbGUgKHJlc3BvbnNlID09IG5pbCkgZG8gCgkJCQl0YXNrLndhaXQoKSAKCQkJZW5kCgoJCQlpZiByZXNwb25zZS5TdGF0dXNNZXNzYWdlID09ICJPSyIgdGhlbiAKCQkJCXJldHVybiBIdHRwU2VydmljZTpKU09ORGVjb2RlKHJlc3BvbnNlLkJvZHkpIAoJCQllbmQKCgkJZW5kKQoJCWlmIG5vdCBzdWNjZXNzIHRoZW4KCQkJcmV0dXJuICJFUlJPUjogIiAuLiB0b3N0cmluZyhyZXMpCgkJZWxzZQoJCQlyZXR1cm4gcmVzCgkJZW5kCgllbmQKCQoJZnVuY3Rpb24gYnJpZGdlOnJlcXVlc3QoZGF0YSwgZnJvbSkKCQlsb2NhbCBzdWNjZXNzLCByZXMgPSBwY2FsbChmdW5jdGlvbigpCgkJCWlmIGRhdGEuTWV0aG9kIHRoZW4gZGF0YS5NZXRob2QgPSBkYXRhLk1ldGhvZDp1cHBlcigpIGVuZAoJCQlsb2NhbCBoZWFkcwoJCQlmb3IgdCwgdiBpbiBkYXRhIGRvCgkJCQlpZiB0Omxvd2VyKCkgPT0gImhlYWRlcnMiIHRoZW4KCQkJCQloZWFkcyA9IHYKCQkJCQlicmVhawoJCQkJZW5kCgkJCWVuZAoJCgkJCWlmIG5vdCBoZWFkcyB0aGVuCgkJCQloZWFkcyA9IHRhYmxlLmNyZWF0ZSgwKQoJCQllbmQKCQoJCQlkYXRhLkhlYWRlcnMgPSBoZWFkcwoJCQlkYXRhLkhlYWRlcnNbIlJvYmxveC1QbGFjZS1JZCJdID0gdG9zdHJpbmcoZ2FtZS5QbGFjZUlkKQoJCQlkYXRhLkhlYWRlcnNbIlJvYmxveC1HYW1lLUlkIl0gPSB0b3N0cmluZyhnYW1lLkpvYklkKQoJCQlkYXRhLkhlYWRlcnNbIlJvYmxveC1TZXNzaW9uLUlkIl0gPSBIdHRwU2VydmljZTpKU09ORW5jb2RlKHsKCQkJCVsiR2FtZUlkIl0gPSB0b3N0cmluZyhnYW1lLkpvYklkKSwKCQkJCVsiUGxhY2VJZCJdID0gdG9zdHJpbmcoZ2FtZS5QbGFjZUlkKQoJCQl9KQoJCgkJCWlmIGZyb20gdGhlbgoJCQkJZGF0YS5IZWFkZXJzWyJVc2VyLUFnZW50Il0gPSAiUm9ibG94L1dpbkluZXQiCgkJCWVuZAoJCgkJCWxvY2FsIHVybCA9ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvYnJpZGdlP2FjdGlvbj1yZXF1ZXN0IgoJCgkJCWxvY2FsIHJlcXVlc3QgPSBIdHRwU2VydmljZTpSZXF1ZXN0SW50ZXJuYWwoewoJCQkJVXJsID0gdXJsLAoJCQkJTWV0aG9kID0gIlBPU1QiLAoJCQkJQm9keSA9IEh0dHBTZXJ2aWNlOkpTT05FbmNvZGUoewoJCQkJCXNvdXJjZT1zb3VyY2UsCgkJCQkJdHlwZT0icmVxdWVzdCIsCgkJCQkJYm9keT1IdHRwU2VydmljZTpKU09ORW5jb2RlKGRhdGEpCgkJCQl9KSwKCQkJCUhlYWRlcnMgPSB7CgkJCQkJWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIiwKCQkJCX0KCQkJfSkKCQoJCQlsb2NhbCByZXNwb25zZSA9IG5pbAoKCQkJcmVxdWVzdDpTdGFydChmdW5jdGlvbihzdWNjZXNzLCByZXN1bHQpCgoJCQkJLS1wcmludChzdWNjZXNzLCByZXN1bHQpCgoJCQkJaWYgc3VjY2VzcyB0aGVuCgkJCQkJcmVzcG9uc2UgPSByZXN1bHQKCQkJCWVsc2UKCQkJCQlyZXNwb25zZSA9IHt9CgkJCQllbmQKCgkJCWVuZCkKCgkJCXdoaWxlIChyZXNwb25zZSA9PSBuaWwpIGRvIAoJCQkJdGFzay53YWl0KCkgCgkJCWVuZAoKCQkJcmV0dXJuIEh0dHBTZXJ2aWNlOkpTT05EZWNvZGUocmVzcG9uc2UuQm9keSkKCQllbmQpCgkJaWYgbm90IHN1Y2Nlc3MgdGhlbgoJCQlyZXR1cm4gIkVSUk9SOiAiIC4uIHRvc3RyaW5nKHJlcykKCQllbHNlCgkJCXJldHVybiByZXMKCQllbmQKCWVuZAoJCglmdW5jdGlvbiBicmlkZ2U6anNvbihyZXNwb25zZSkKCQlsb2NhbCBzdWNjZXNzLCByZXMgPSBwY2FsbChmdW5jdGlvbigpCgkJCXJldHVybiBIdHRwU2VydmljZTpKU09ORGVjb2RlKHJlc3BvbnNlLkJvZHkpIAoJCWVuZCkKCQlyZXR1cm4gcmVzCgllbmQKCQoJZnVuY3Rpb24gYnJpZGdlOnNlbmQoYWN0aW9uLCAuLi4pIAoJCWxvY2FsIGFyZ3MgPSB7Li4ufQoJCWxvY2FsIHN1Y2Nlc3MsIHJlcyA9IHBjYWxsKGZ1bmN0aW9uKCkKCQkJbG9jYWwgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9icmlkZ2U/YWN0aW9uPSIgLi4gYWN0aW9uCgkJCWZvciBpLCBhcmcgaW4gaXBhaXJzKGFyZ3MpIGRvCgkJCQl1cmwgPSB1cmwgLi4gIiYiIC4uIGFyZy5hcmcgLi4gIj0iIC4uIEh0dHBTZXJ2aWNlOlVybEVuY29kZSh0b3N0cmluZyhhcmcudmFsdWUpKQoJCQllbmQKCQoJCQlsb2NhbCBQbGFjZUlkID0gZ2FtZS5QbGFjZUlkCgkJCWxvY2FsIEdhbWVJZCA9IGdhbWUuSm9iSWQKCQoJCQlsb2NhbCBwYXJhbXMgPSB7CgkJCQlVcmwgPSB1cmwsCgkJCQlNZXRob2QgPSAiR0VUIiwKCQkJCUhlYWRlcnMgPSB7CgkJCQkJWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIiwKCQkJCX0KCQkJfQoKCQkJbG9jYWwgcmVxdWVzdCA9IEh0dHBTZXJ2aWNlOlJlcXVlc3RJbnRlcm5hbChwYXJhbXMpCgkJCWxvY2FsIHJlc3BvbnNlID0gbmlsCgoJCQlyZXF1ZXN0OlN0YXJ0KGZ1bmN0aW9uKHN1Y2Nlc3MsIHJlc3VsdCkKCgkJCQlpZiBzdWNjZXNzIHRoZW4KCQkJCQlyZXNwb25zZSA9IHJlc3VsdAoJCQkJZWxzZQoJCQkJCXJlc3BvbnNlID0ge30KCQkJCWVuZAoKCQkJZW5kKQoKCQkJd2hpbGUgKHJlc3BvbnNlID09IG5pbCkgZG8gIAoJCQkJdGFzay53YWl0KCkgCgkJCWVuZAoKCQkJcmV0dXJuIEh0dHBTZXJ2aWNlOkpTT05EZWNvZGUodG9zdHJpbmcocmVzcG9uc2UuQm9keSkpCgkJZW5kKQoJCWlmIG5vdCBzdWNjZXNzIHRoZW4KCQkJcmV0dXJuICJFUlJPUjogIiAuLiB0b3N0cmluZyhyZXMpCgkJZWxzZQoJCQlyZXR1cm4gcmVzCgkJZW5kCgllbmQKCQoJZnVuY3Rpb24gZ2V0b2JqZWN0cyhhc3NldGlkKQoJCWlmIHR5cGUoYXNzZXRpZCkgPT0gIm51bWJlciIgdGhlbgoJCQlhc3NldGlkID0gInJieGFzc2V0aWQ6Ly8iIC4uIGFzc2V0aWQKCQllbmQKCQlyZXR1cm4geyBnYW1lOkdldFNlcnZpY2UoIkluc2VydFNlcnZpY2UiKTpMb2FkTG9jYWxBc3NldChhc3NldGlkKSB9CgllbmQKCQoJbG9jYWwgaHR0cENvbnRlbnRUeXBlVG9IZWFkZXIKCWRvCgkJLS0gKiBLZWVwIHRoaXMgdXBkYXRlZCBodHRwczovL2dpdGh1Yi5jb20vTWF4aW11bUFESEQvUm9ibG94LUNsaWVudC1UcmFja2VyL2Jsb2Ivcm9ibG94L0x1YVBhY2thZ2VzL1BhY2thZ2VzL19JbmRleC9IdHRwU2VydmljZU1vY2svSHR0cFNlcnZpY2VNb2NrL2h0dHBDb250ZW50VHlwZVRvSGVhZGVyLmx1YQoJCS0tICogaHR0cHM6Ly9jcmVhdGUucm9ibG94LmNvbS9kb2NzL3JlZmVyZW5jZS9lbmdpbmUvZW51bXMvSHR0cENvbnRlbnRUeXBlCgkJbG9jYWwgaHR0cENvbnRlbnRUeXBlVG9IZWFkZXJMb29rdXAgPSB7CgkJCVtFbnVtLkh0dHBDb250ZW50VHlwZS5BcHBsaWNhdGlvbkpzb25dID0gImFwcGxpY2F0aW9uL2pzb24iLAoJCQlbRW51bS5IdHRwQ29udGVudFR5cGUuQXBwbGljYXRpb25VcmxFbmNvZGVkXSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAoJCQlbRW51bS5IdHRwQ29udGVudFR5cGUuQXBwbGljYXRpb25YbWxdID0gImFwcGxpY2F0aW9uL3htbCIsCgkJCVtFbnVtLkh0dHBDb250ZW50VHlwZS5UZXh0UGxhaW5dID0gInRleHQvcGxhaW4iLAoJCQlbRW51bS5IdHRwQ29udGVudFR5cGUuVGV4dFhtbF0gPSAidGV4dC94bWwiLAoJCX0KCQoJCWh0dHBDb250ZW50VHlwZVRvSGVhZGVyID0gZnVuY3Rpb24oaHR0cENvbnRlbnRUeXBlOiBFbnVtLkh0dHBDb250ZW50VHlwZSk6IHN0cmluZwoJCQlsb2NhbCB2YWx1ZSA9IGh0dHBDb250ZW50VHlwZVRvSGVhZGVyTG9va3VwW2h0dHBDb250ZW50VHlwZV0KCQkJYXNzZXJ0KHZhbHVlLCAiVW5hYmxlIHRvIG1hcCBFbnVtLkh0dHBDb250ZW50VHlwZSB0byBDb250ZW50LVR5cGUuIFVzZSBhIENvbnRlbnQtVHlwZSBzdHJpbmcgaW5zdGVhZCIpCgkJCXJldHVybiB2YWx1ZQoJCWVuZAoJZW5kCgoJbG9jYWwgZnVuY3Rpb24gZmluZCh0LCB4KQoJCXggPSBzdHJpbmcuZ3N1Yih0b3N0cmluZyh4KSwgJ1wwJywgJycpIC0tIHNvbWV0aW1lcyBwZW9wbGUgd2lsbCB1c2UgbnVsbCBjaGFycyB0byBieXBhc3MKCQlmb3IgaSwgdiBpbiB0IGRvCgkJCWlmIHY6bG93ZXIoKSA9PSB4Omxvd2VyKCkgdGhlbgoJCQkJcmV0dXJuIHRydWUKCQkJZW5kCgkJZW5kCgllbmQKCglsb2NhbCBmdW5jdGlvbiBzZXR1cEJsb2NrZWRTZXJ2aWNlRnVuY3Moc2VydmljZVRhYmxlKQoJCXNlcnZpY2VUYWJsZS5wcm94eSA9IG5ld3Byb3h5KHRydWUpCgkJbG9jYWwgcHJveHlNdCA9IGdldG1ldGF0YWJsZShzZXJ2aWNlVGFibGUucHJveHkpCgkKCQlwcm94eU10Ll9faW5kZXggPSBmdW5jdGlvbihzZWxmLCBpbmRleCkKCQkJaW5kZXggPSBzdHJpbmcuZ3N1Yih0b3N0cmluZyhpbmRleCksICdcMCcsICcnKQoJCQlpZiBmaW5kKHNlcnZpY2VUYWJsZVsxXSwgaW5kZXgpIHRoZW4KCQkJCXJldHVybiBmdW5jdGlvbihzZWxmLCAuLi4pCgkJCQkJZXJyb3IoIkF0dGVtcHQgdG8gY2FsbCBhIGJsb2NrZWQgZnVuY3Rpb246ICIgLi4gaW5kZXgsIDIpCgkJCQllbmQKCQkJZW5kCgkKCQkJaWYgaW5kZXggPT0gIlBhcmVudCIgdGhlbgoJCQkJcmV0dXJuIGdhbWUKCQkJZW5kCgkKCQkJaWYgdHlwZShzZXJ2aWNlVGFibGVbMl1baW5kZXhdKSA9PSAiZnVuY3Rpb24iIHRoZW4KCQkJCXJldHVybiBmdW5jdGlvbihzZWxmLCAuLi4pCgkJCQkJcmV0dXJuIHNlcnZpY2VUYWJsZVsyXVtpbmRleF0oc2VydmljZVRhYmxlWzJdLCAuLi4pCgkJCQllbmQKCQkJZWxzZQoJCQkJcmV0dXJuIHNlcnZpY2VUYWJsZVsyXVtpbmRleF0KCQkJZW5kCgkJZW5kCgkKCQlwcm94eU10Ll9fbmV3aW5kZXggPSBmdW5jdGlvbihzZWxmLCBpbmRleCwgdmFsdWUpCgkJCXNlcnZpY2VUYWJsZVsyXVtpbmRleF0gPSB2YWx1ZQoJCWVuZAoJCgkJcHJveHlNdC5fX3Rvc3RyaW5nID0gZnVuY3Rpb24oc2VsZikKCQkJcmV0dXJuIHNlcnZpY2VUYWJsZVsyXS5OYW1lCgkJZW5kCgkKCQlwcm94eU10Ll9fbWV0YXRhYmxlID0gZ2V0bWV0YXRhYmxlKHNlcnZpY2VUYWJsZVsyXSkKCWVuZAoKCWZvciBpLCBzZXJ2aWNlVGFibGUgaW4gcHJveGllZFNlcnZpY2VzIGRvCgkJc2V0dXBCbG9ja2VkU2VydmljZUZ1bmNzKHNlcnZpY2VUYWJsZSkKCWVuZAoJCglsb2NhbCByZWFsID0ge30KCgktLVtbCglsb2NhbCBXUkFQUEVEID0gc2V0bWV0YXRhYmxlKHt9LCB7IF9fbW9kZSA9ICJrIiB9KQoJbG9jYWwgUkVBTF9PQkpFQ1QgPSBzZXRtZXRhdGFibGUoe30sIHsgX19tb2RlID0gImsiIH0pCglsb2NhbCBvbGRJbnN0YW5jZU5ldyA9IEluc3RhbmNlLm5ldwoJbG9jYWwgVFMgPSBnYW1lOkdldFNlcnZpY2UoIlR3ZWVuU2VydmljZSIpCglsb2NhbCBvbGRDcmVhdGUgPSBUUy5DcmVhdGUKCglsb2NhbCBmdW5jdGlvbiB1bndyYXBJZlByb3h5KHZhbHVlKQoJCXJldHVybiBSRUFMX09CSkVDVFt2YWx1ZV0gb3IgdmFsdWUKCWVuZAoKCWxvY2FsIFNwZWNpYWxIb29rcyA9IHsKCQlIdHRwR2V0ID0gZnVuY3Rpb24odXJsLCBhcmcyLCBhcmczKQoJCQlhc3NlcnQodHlwZSh1cmwpID09ICJzdHJpbmciLCAiYXJnICMxIG11c3QgYmUgdHlwZSBzdHJpbmciKQoJCQlhc3NlcnQodXJsIH49ICIiLCAgICAgICAgICAgICJhcmcgIzEgY2Fubm90IGJlIGVtcHR5IikKCgkJCWxvY2FsIGFyZ3MgPSB7CgkJCQlNZXRob2QgPSAiR0VUIiwKCQkJCVVybCA9IHVybCwKCQkJfQoKCQkJbG9jYWwgYXJnM190eXBlID0gdHlwZW9mKGFyZzMpCgkJCWlmIGFyZzNfdHlwZSA9PSAidGFibGUiIHRoZW4KCQkJCWFyZ3MuSGVhZGVycyA9IGFyZzMKCQkJZWxzZWlmIGFyZzNfdHlwZSA9PSAiRW51bUl0ZW0iIGFuZCBhcmczLkVudW1UeXBlID09IEVudW0uSHR0cFJlcXVlc3RUeXBlIHRoZW4KCQkJCWFyZzIgPSBhcmczCgkJCWVuZAoJCQlpZiB0eXBlb2YoYXJnMikgPT0gImJvb2xlYW4iIGFuZCBhcmcyIHRoZW4KCQkJCWFyZ3MuSGVhZGVycyA9IGFyZ3MuSGVhZGVycyBvciB7fQoJCQkJYXJncy5IZWFkZXJzWyJDYWNoZS1Db250cm9sIl0gPSAibm8tY2FjaGUiCgkJCWVuZAoKCQkJcmV0dXJuIGJyaWRnZTpyZXF1ZXN0KGFyZ3MsIHRydWUpLkJvZHkKCQllbmQsCgoJCUh0dHBQb3N0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBhcmczLCBhcmc0LCBhcmc1KQoJCQlhc3NlcnQodHlwZSh1cmwpID09ICJzdHJpbmciLCAgImFyZyAjMSBtdXN0IGJlIHR5cGUgc3RyaW5nIikKCQkJYXNzZXJ0KHVybCB+PSAiIiwgICAgICAgICAgICAgImFyZyAjMSBjYW5ub3QgYmUgZW1wdHkiKQoKCQkJbG9jYWwgYXJncyA9IHsKCQkJCU1ldGhvZCA9ICJQT1NUIiwKCQkJCVVybCA9IHVybCwKCQkJCUJvZHkgPSBkYXRhLAoJCQl9CgkJCWlmIHR5cGUoYXJnMykgPT0gImJvb2xlYW4iIHRoZW4KCQkJCWFyZzMsIGFyZzQsIGFyZzUgPSBhcmc0LCBhcmc1LCBuaWwKCQkJZW5kCgkJCWlmIGFyZzUgdGhlbgoJCQkJYXJncy5IZWFkZXJzID0gYXJnMwoJCQllbmQKCQkJaWYgYXJnMyB0aGVuCgkJCQlhcmdzLkhlYWRlcnMgPSBhcmdzLkhlYWRlcnMgb3Ige30KCQkJCWFyZ3MuSGVhZGVyc1siQ29udGVudC1UeXBlIl0gPQoJCQkJCSh0eXBlKGFyZzMpID09ICJzdHJpbmciKQoJCQkJCWFuZCBhcmczCgkJCQkJb3IgaHR0cENvbnRlbnRUeXBlVG9IZWFkZXIoYXJnMykKCQkJZW5kCgkJCWlmIHR5cGVvZihhcmc0KSA9PSAiYm9vbGVhbiIgYW5kIGFyZzQgdGhlbgoJCQkJYXJncy5IZWFkZXJzID0gYXJncy5IZWFkZXJzIG9yIHt9CgkJCQlhcmdzLkhlYWRlcnNbIkNvbnRlbnQtRW5jb2RpbmciXSA9ICJnemlwIgoJCQllbmQKCgkJCXJldHVybiBicmlkZ2U6cmVxdWVzdChhcmdzLCB0cnVlKS5Cb2R5CgkJZW5kLAoKCQlHZXRPYmplY3RzID0gZnVuY3Rpb24oYXNzZXRpZCkKCQkJcmV0dXJuIGdldG9iamVjdHMoYXNzZXRpZCkKCQllbmQsCgoJCUNyZWF0ZSA9IGZ1bmN0aW9uKHNlbGYsIHR3ZWVuSW5mbywgcHJvcGVydGllcykKCQkJcHJpbnQoInR3ZWVuIHNlcnZpY2UuLi4iKQoJCQlyZXR1cm4gb2xkQ3JlYXRlKHNlbGYsIHVud3JhcElmUHJveHkodHdlZW5JbmZvKSwgdW53cmFwSWZQcm94eShwcm9wZXJ0aWVzKSkKCQllbmQsCgl9CgoJU3BlY2lhbEhvb2tzLkh0dHBHZXRBc3luYyAgPSBTcGVjaWFsSG9va3MuSHR0cEdldAoJU3BlY2lhbEhvb2tzLkh0dHBQb3N0QXN5bmMgPSBTcGVjaWFsSG9va3MuSHR0cFBvc3QKCglsb2NhbCBmdW5jdGlvbiB3cmFwSWZOZWVkZWQob2JqKQoJCWxvY2FsIGx1YVR5cGUgPSB0eXBlKG9iaikKCQlsb2NhbCByb2Jsb3hUeXBlID0gdHlwZW9mKG9iaikKCgkJaWYgbHVhVHlwZSB+PSAidXNlcmRhdGEiIGFuZCByb2Jsb3hUeXBlIH49ICJJbnN0YW5jZSIgYW5kIG9iaiB+PSBJbnN0YW5jZSBhbmQgb2JqIH49IGdhbWUuVHdlZW5TZXJ2aWNlIHRoZW4KCQkJLS1yZXR1cm4gb2JqCgkJZW5kCgoJCWxvY2FsIGV4aXN0aW5nUHJveHkgPSBXUkFQUEVEW29ial0KCQlpZiBleGlzdGluZ1Byb3h5IHRoZW4KCQkJcmV0dXJuIGV4aXN0aW5nUHJveHkKCQllbmQKCgkJbG9jYWwgcHJveHkgPSBuZXdwcm94eSh0cnVlKQoJCWxvY2FsIG1ldGEgPSBnZXRtZXRhdGFibGUocHJveHkpCgoJCVdSQVBQRURbb2JqXSA9IHByb3h5CgkJUkVBTF9PQkpFQ1RbcHJveHldID0gb2JqCgoJCW1ldGEuX19pbmRleCA9IGZ1bmN0aW9uKHQsIGluZGV4KQoJCQlsb2NhbCBob29rRnVuYyA9IFNwZWNpYWxIb29rc1tpbmRleF0KCQkJaWYgaG9va0Z1bmMgdGhlbgoJCQkJcmV0dXJuIGZ1bmN0aW9uKF8sIC4uLikKCQkJCQlyZXR1cm4gaG9va0Z1bmMoLi4uKQoJCQkJZW5kCgkJCWVuZAoKCQkJbG9jYWwgcmVhbCA9IFJFQUxfT0JKRUNUW3RdCgkJCWxvY2FsIHJhd1ZhbHVlID0gcmVhbFtpbmRleF0KCgkJCWlmIHR5cGUocmF3VmFsdWUpID09ICJmdW5jdGlvbiIgdGhlbgoKCQkJCWlmIGluZGV4ID09ICJuZXciIHRoZW4KCQkJCQlyZXR1cm4gZnVuY3Rpb24oY2xhc3NOYW1lLCBwYXJlbnQpCgkJCQkJCWxvY2FsIHJlYWxPYmogPSBvbGRJbnN0YW5jZU5ldyhjbGFzc05hbWUpCgkJCQkJCWxvY2FsIHByb3h5ID0gd3JhcElmTmVlZGVkKHJlYWxPYmopCgkJCQkJCWlmIHBhcmVudCB0aGVuCgkJCQkJCQlwcm94eS5QYXJlbnQgPSBwYXJlbnQKCQkJCQkJZW5kCgkJCQkJCXJldHVybiBwcm94eQoJCQkJCWVuZAoJCQkJZW5kCgoJCQkJcmV0dXJuIGZ1bmN0aW9uKHNlbGYsIC4uLikKCgkJCQkJaWYgaW5kZXggPT0gIkdldFNlcnZpY2UiIG9yIGluZGV4ID09ICJGaW5kU2VydmljZSIgdGhlbgoJCQkJCQlsb2NhbCBhcmdzID0gey4uLn0KCQkJCQkJaWYgcHJveGllZFNlcnZpY2VzIGFuZCBwcm94aWVkU2VydmljZXNbc3RyaW5nLmdzdWIodG9zdHJpbmcoYXJnc1sxXSksICdcMCcsICcnKV0gdGhlbgoJCQkJCQkJcmV0dXJuIHByb3hpZWRTZXJ2aWNlc1tzdHJpbmcuZ3N1YihhcmdzWzFdLCAnXDAnLCAnJyldLnByb3h5CgkJCQkJCWVuZAoJCQkJCWVuZAoKCQkJCQlpZiBmaW5kKHsKCQkJCQkJIkxvYWQiLAoJCQkJCQkiT3BlblNjcmVlbnNob3RzRm9sZGVyIiwKCQkJCQkJIk9wZW5WaWRlb3NGb2xkZXIiCgkJCQkJfSwgaW5kZXgpIHRoZW4KCQkJCQkJZXJyb3IoIkF0dGVtcHQgdG8gY2FsbCBhIGJsb2NrZWQgZnVuY3Rpb246ICIgLi4gdG9zdHJpbmcoaW5kZXgpLCAyKQoJCQkJCWVuZAoKCQkJCQlsb2NhbCByZXN1bHRzID0geyByYXdWYWx1ZShyZWFsLCAuLi4pIH0KCgkJCQkJZm9yIGkgPSAxLCAjcmVzdWx0cyBkbwoJCQkJCQlyZXN1bHRzW2ldID0gdW53cmFwSWZQcm94eShyZXN1bHRzW2ldKQoJCQkJCWVuZAoKCQkJCQlyZXR1cm4gdGFibGUudW5wYWNrKHJlc3VsdHMpCgoJCQkJCS0tcmV0dXJuIHRvd3JhcFtpbmRleF0odG93cmFwLCAuLi4pCgkJCQllbmQKCQkJZW5kCgoJCQlpZiB0eXBlKHJhd1ZhbHVlKSA9PSAidXNlcmRhdGEiIG9yIHR5cGVvZihyYXdWYWx1ZSkgPT0gIkluc3RhbmNlIiB0aGVuCgkJCQlyZXR1cm4gd3JhcElmTmVlZGVkKHJhd1ZhbHVlKQoJCQllbmQKCgkJCXJldHVybiByYXdWYWx1ZQoJCWVuZAoKCQltZXRhLl9fbmV3aW5kZXggPSBmdW5jdGlvbih0LCBpbmRleCwgbmV3VmFsKQoJCQlsb2NhbCByZWFsID0gUkVBTF9PQkpFQ1RbdF0KCQkJcmVhbFtpbmRleF0gPSB1bndyYXBJZlByb3h5KG5ld1ZhbCkKCQllbmQKCgkJbWV0YS5fX3Rvc3RyaW5nID0gZnVuY3Rpb24oKQoJCQlyZXR1cm4gdG9zdHJpbmcoUkVBTF9PQkpFQ1RbcHJveHldKQoJCWVuZAoKCQltZXRhLl9fbWV0YXRhYmxlID0gZ2V0bWV0YXRhYmxlKFJFQUxfT0JKRUNUW3Byb3h5XSkKCgkJcmV0dXJuIHByb3h5CgllbmQKCgktLSBXcmFwIGNvcmUgZ2xvYmFscwoJZ2V0Z2VudigpLmdhbWUgPSB3cmFwSWZOZWVkZWQoZ2FtZSkKCWdldGdlbnYoKS5HYW1lID0gd3JhcElmTmVlZGVkKEdhbWUpCglnZXRnZW52KCkuV29ya3NwYWNlID0gd3JhcElmTmVlZGVkKFdvcmtzcGFjZSkKCWdldGdlbnYoKS53b3Jrc3BhY2UgPSB3cmFwSWZOZWVkZWQod29ya3NwYWNlKQoJZ2V0Z2VudigpLkluc3RhbmNlID0gd3JhcElmTmVlZGVkKEluc3RhbmNlKQoJZ2V0Z2VudigpLlR3ZWVuU2VydmljZSA9IHdyYXBJZk5lZWRlZChUUykKCV1dCgoJbG9jYWwgU3BlY2lhbEhvb2tzID0gewoJCUh0dHBHZXQgPSBmdW5jdGlvbih1cmwsIGFyZzIsIGFyZzMpCgkJCWFzc2VydCh0eXBlKHVybCkgPT0gInN0cmluZyIsICJhcmcgIzEgbXVzdCBiZSB0eXBlIHN0cmluZyIpCgkJCWFzc2VydCh1cmwgfj0gIiIsICAgICAgICAgICAgImFyZyAjMSBjYW5ub3QgYmUgZW1wdHkiKQoKCQkJbG9jYWwgYXJncyA9IHsKCQkJCU1ldGhvZCA9ICJHRVQiLAoJCQkJVXJsID0gdXJsLAoJCQl9CgoJCQlsb2NhbCBhcmczX3R5cGUgPSB0eXBlb2YoYXJnMykKCQkJaWYgYXJnM190eXBlID09ICJ0YWJsZSIgdGhlbgoJCQkJYXJncy5IZWFkZXJzID0gYXJnMwoJCQllbHNlaWYgYXJnM190eXBlID09ICJFbnVtSXRlbSIgYW5kIGFyZzMuRW51bVR5cGUgPT0gRW51bS5IdHRwUmVxdWVzdFR5cGUgdGhlbgoJCQkJYXJnMiA9IGFyZzMKCQkJZW5kCgkJCWlmIHR5cGVvZihhcmcyKSA9PSAiYm9vbGVhbiIgYW5kIGFyZzIgdGhlbgoJCQkJYXJncy5IZWFkZXJzID0gYXJncy5IZWFkZXJzIG9yIHt9CgkJCQlhcmdzLkhlYWRlcnNbIkNhY2hlLUNvbnRyb2wiXSA9ICJuby1jYWNoZSIKCQkJZW5kCgoJCQlyZXR1cm4gYnJpZGdlOnJlcXVlc3QoYXJncywgdHJ1ZSkuQm9keQoJCWVuZCwKCgkJSHR0cFBvc3QgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGFyZzMsIGFyZzQsIGFyZzUpCgkJCWFzc2VydCh0eXBlKHVybCkgPT0gInN0cmluZyIsICAiYXJnICMxIG11c3QgYmUgdHlwZSBzdHJpbmciKQoJCQlhc3NlcnQodXJsIH49ICIiLCAgICAgICAgICAgICAiYXJnICMxIGNhbm5vdCBiZSBlbXB0eSIpCgoJCQlsb2NhbCBhcmdzID0gewoJCQkJTWV0aG9kID0gIlBPU1QiLAoJCQkJVXJsID0gdXJsLAoJCQkJQm9keSA9IGRhdGEsCgkJCX0KCQkJaWYgdHlwZShhcmczKSA9PSAiYm9vbGVhbiIgdGhlbgoJCQkJYXJnMywgYXJnNCwgYXJnNSA9IGFyZzQsIGFyZzUsIG5pbAoJCQllbmQKCQkJaWYgYXJnNSB0aGVuCgkJCQlhcmdzLkhlYWRlcnMgPSBhcmczCgkJCWVuZAoJCQlpZiBhcmczIHRoZW4KCQkJCWFyZ3MuSGVhZGVycyA9IGFyZ3MuSGVhZGVycyBvciB7fQoJCQkJYXJncy5IZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9CgkJCQkJKHR5cGUoYXJnMykgPT0gInN0cmluZyIpCgkJCQkJYW5kIGFyZzMKCQkJCQlvciBodHRwQ29udGVudFR5cGVUb0hlYWRlcihhcmczKQoJCQllbmQKCQkJaWYgdHlwZW9mKGFyZzQpID09ICJib29sZWFuIiBhbmQgYXJnNCB0aGVuCgkJCQlhcmdzLkhlYWRlcnMgPSBhcmdzLkhlYWRlcnMgb3Ige30KCQkJCWFyZ3MuSGVhZGVyc1siQ29udGVudC1FbmNvZGluZyJdID0gImd6aXAiCgkJCWVuZAoKCQkJcmV0dXJuIGJyaWRnZTpyZXF1ZXN0KGFyZ3MsIHRydWUpLkJvZHkKCQllbmQsCgoJCUdldE9iamVjdHMgPSBmdW5jdGlvbihhc3NldGlkKQoJCQlyZXR1cm4gZ2V0b2JqZWN0cyhhc3NldGlkKQoJCWVuZCwKCX0KCglTcGVjaWFsSG9va3MuSHR0cEdldEFzeW5jICA9IFNwZWNpYWxIb29rcy5IdHRwR2V0CglTcGVjaWFsSG9va3MuSHR0cFBvc3RBc3luYyA9IFNwZWNpYWxIb29rcy5IdHRwUG9zdAoKCWxvY2FsIGZ1bmN0aW9uIHdyYXBJbnN0YW5jZShpbnN0YW5jZSkKCQlpZiB0eXBlb2YoaW5zdGFuY2UpIH49ICJJbnN0YW5jZSIgdGhlbgoJCQlyZXR1cm4gaW5zdGFuY2UKCQllbmQKCQlyZXR1cm4gc2V0bWV0YXRhYmxlKHsKCQkJX19pbnN0YW5jZSA9IGluc3RhbmNlLAoJCQlfX3Byb3hpZWQgPSB0cnVlCgkJfSwgewoJCQlfX2luZGV4ID0gZnVuY3Rpb24oXywga2V5KQoJCQkJbG9jYWwgaG9va0Z1bmMgPSBTcGVjaWFsSG9va3Nba2V5XQoJCQkJaWYgaG9va0Z1bmMgdGhlbgoJCQkJCXJldHVybiBmdW5jdGlvbihfLCAuLi4pCgkJCQkJCXJldHVybiBob29rRnVuYyguLi4pCgkJCQkJZW5kCgkJCQllbmQKCQkJCWxvY2FsIHZhbHVlID0gaW5zdGFuY2Vba2V5XQoJCQkJaWYgdHlwZW9mKHZhbHVlKSA9PSAiZnVuY3Rpb24iIHRoZW4KCQkJCQlyZXR1cm4gZnVuY3Rpb24oc2VsZiwgLi4uKQoJCQkJCQlpZiBrZXkgPT0gIkdldFNlcnZpY2UiIG9yIGtleSA9PSAiRmluZFNlcnZpY2UiIHRoZW4KCQkJCQkJCWxvY2FsIGFyZ3MgPSB7Li4ufQoJCQkJCQkJaWYgcHJveGllZFNlcnZpY2VzW3N0cmluZy5nc3ViKHRvc3RyaW5nKGFyZ3NbMV0pLCAnXDAnLCAnJyldIHRoZW4KCQkJCQkJCQlyZXR1cm4gcHJveGllZFNlcnZpY2VzW3N0cmluZy5nc3ViKGFyZ3NbMV0sICdcMCcsICcnKV0ucHJveHkKCQkJCQkJCWVuZAoJCQkJCQllbmQKCQkJCQkJaWYgZmluZCh7IkxvYWQiLCJPcGVuU2NyZWVuc2hvdHNGb2xkZXIiLCJPcGVuVmlkZW9zRm9sZGVyIn0sIGtleSkgdGhlbgoJCQkJCQkJZXJyb3IoIkF0dGVtcHQgdG8gY2FsbCBhIGJsb2NrZWQgZnVuY3Rpb246ICIgLi4gdG9zdHJpbmcoa2V5KSwgMikKCQkJCQkJZW5kCgkJCQkJCXJldHVybiB0YWJsZS51bnBhY2soeyB2YWx1ZShpbnN0YW5jZSwgLi4uKSB9KQoJCQkJCWVuZAoJCQkJZW5kCgkJCQlpZiBwcm94aWVkU2VydmljZXNba2V5XSB0aGVuCgkJCQkJcmV0dXJuIHByb3hpZWRTZXJ2aWNlc1trZXldLnByb3h5CgkJCQllbmQKCQkJCXJldHVybiB2YWx1ZQoJCQllbmQsCgkJCV9fbmV3aW5kZXggPSBmdW5jdGlvbihfLCBrZXksIHZhbHVlKSBpbnN0YW5jZVtrZXldID0gdmFsdWUgZW5kLAoJCQlfX21ldGF0YWJsZSA9IGdldG1ldGF0YWJsZShpbnN0YW5jZSksCgkJCV9fdG9zdHJpbmcgPSBmdW5jdGlvbigpIHJldHVybiB0b3N0cmluZyhpbnN0YW5jZSkgZW5kCgkJfSkKCWVuZAoKCWdldGdlbnYoKS5nYW1lID0gd3JhcEluc3RhbmNlKGdhbWUpCglnZXRnZW52KCkuR2FtZSA9IHdyYXBJbnN0YW5jZShHYW1lKQoJCglmdW5jdGlvbiBpc3NjcmlwdGFibGUoaW5zdGFuY2UsIHByb3BlcnR5X25hbWUpCgkJbG9jYWwgb2ssIFJlc3VsdCA9IHhwY2FsbChpbnN0YW5jZS5HZXRQcm9wZXJ0eUNoYW5nZWRTaWduYWwsIGZ1bmN0aW9uKHJlc3VsdCkKCQkJcmV0dXJuIHJlc3VsdAoJCWVuZCwgaW5zdGFuY2UsIHByb3BlcnR5X25hbWUpCgoJCXJldHVybiBvayBvciBub3Qgc3RyaW5nLmZpbmQoUmVzdWx0LCAic2NyaXB0YWJsZSIsIG5pbCwgdHJ1ZSkKCWVuZAoJCglmdW5jdGlvbiBzZXRzY3JpcHRhYmxlKGluc3RhbmNlLCBwcm9wZXJ0eV9uYW1lLCBzY3JpcHRhYmxlKQoJCWFzc2VydCh0eXBlb2YoaW5zdGFuY2UpID09ICJJbnN0YW5jZSIsIGBhcmcgIzEgbXVzdCBiZSB0eXBlIEluc3RhbmNlYCkKCQlhc3NlcnQodHlwZShwcm9wZXJ0eV9uYW1lKSA9PSAic3RyaW5nIiwgYGFyZyAjMiBtdXN0IGJlIHR5cGUgc3RyaW5nYCkKCQlhc3NlcnQodHlwZShzY3JpcHRhYmxlKSA9PSAiYm9vbGVhbiIsIGBhcmcgIzMgbXVzdCBiZSB0eXBlIGJvbGVhbmApCgkJaWYgaXNzY3JpcHRhYmxlKGluc3RhbmNlLCBwcm9wZXJ0eV9uYW1lKSB0aGVuCgkJCXJldHVybiBmYWxzZQoJCWVuZAoJCXNldGFkZHJlc3Nob2xkZXIuVmFsdWUgPSBpbnN0YW5jZQoJCXNldGFkZHJlc3Nob2xkZXJfYm9vbC5WYWx1ZSA9IHNjcmlwdGFibGUKCQlsb2NhbCBkYXRhID0gYnJpZGdlOnNlbmQoInNldHNjcmlwdGFibGUiLCB7YXJnPSJ2YWx1ZSIsdmFsdWU9cHJvcGVydHlfbmFtZX0pCgkJcmV0dXJuIGRhdGEuc3RhdHVzCgllbmQKCQoJZnVuY3Rpb24gZ2V0cHJvcGVydGllcyhpbnN0YW5jZSkKCQlhc3NlcnQodHlwZW9mKGluc3RhbmNlKSA9PSAiSW5zdGFuY2UiLCBgYXJnICMxIG11c3QgYmUgdHlwZSBJbnN0YW5jZWApCgkJc2V0YWRkcmVzc2hvbGRlci5WYWx1ZSA9IGluc3RhbmNlCgkKCQlsb2NhbCBkYXRhID0gYnJpZGdlOnNlbmQoImdldHByb3BlcnRpZXMiLCB7YXJnPSJ2YWx1ZSIsdmFsdWU9IjEifSkKCQoJCWxvY2FsIGNvbnRhaW5lciA9IHRhYmxlLmNyZWF0ZSgwKQoJCgkJZm9yIG5hbWUsIHZhbHVlIGluIGRhdGEuY29udGVudCBkbwoJCQlpZiBzdHJpbmcubWF0Y2godmFsdWUsICI6IikgdGhlbgoJCQkJbG9jYWwgbmFtZSwgdmFsdWUgPSB1bnBhY2soKHZhbHVlKTpzcGxpdCgiOiIpKQoJCQkJY29udGFpbmVyW25hbWVdID0gKHZhbHVlID09ICJ0cnVlIikKCQkJZWxzZQoJCQkJY29udGFpbmVyW3ZhbHVlXSA9ICJTVFVCX1ZBTFVFIgoJCQllbmQKCQllbmQKCQoJCXJldHVybiBjb250YWluZXIKCWVuZAoJCglmdW5jdGlvbiBnZXRoaWRkZW5wcm9wZXJ0aWVzKGluc3RhbmNlKQoJCWFzc2VydCh0eXBlb2YoaW5zdGFuY2UpID09ICJJbnN0YW5jZSIsIGBhcmcgIzEgbXVzdCBiZSB0eXBlIEluc3RhbmNlYCkKCQoJCWxvY2FsIGhpZGRlbl9wcm9wZXJ0aWVzID0ge30KCQoJCWZvciBwcm9wZXJ0eV9uYW1lLCB2YWx1ZSBpbiBnZXRwcm9wZXJ0aWVzKGluc3RhbmNlKSBkbwoJCQlpZiBub3QgaXNzY3JpcHRhYmxlKGluc3RhbmNlLCBwcm9wZXJ0eV9uYW1lKSB0aGVuCgkJCQloaWRkZW5fcHJvcGVydGllc1twcm9wZXJ0eV9uYW1lXSA9IHZhbHVlCgkJCWVuZAoJCWVuZAoJCgkJcmV0dXJuIGhpZGRlbl9wcm9wZXJ0aWVzCgllbmQKCQoJZnVuY3Rpb24gZ2V0aGlkZGVucHJvcGVydHkoaW5zdGFuY2UsIHByb3BlcnR5X25hbWUpCgkJYXNzZXJ0KHR5cGVvZihpbnN0YW5jZSkgPT0gIkluc3RhbmNlIiwgYGFyZyAjMSBtdXN0IGJlIHR5cGUgSW5zdGFuY2VgKQoJCWFzc2VydCh0eXBlKHByb3BlcnR5X25hbWUpID09ICJzdHJpbmciLCBgYXJnICMyIG11c3QgYmUgdHlwZSBzdHJpbmdgKQoJCWlmIGlzc2NyaXB0YWJsZShpbnN0YW5jZSwgcHJvcGVydHlfbmFtZSkgdGhlbgoJCQlyZXR1cm4gaW5zdGFuY2VbcHJvcGVydHlfbmFtZV0KCQllbmQKCQoJCXJldHVybiBnZXRoaWRkZW5wcm9wZXJ0aWVzKGluc3RhbmNlKVtwcm9wZXJ0eV9uYW1lXQoJZW5kCgkKCWZ1bmN0aW9uIHNldGhpZGRlbnByb3BlcnR5KGluc3RhbmNlLCBwcm9wZXJ0eV9uYW1lLCB2YWx1ZSkKCQlhc3NlcnQodHlwZW9mKGluc3RhbmNlKSA9PSAiSW5zdGFuY2UiLCBgYXJnICMxIG11c3QgYmUgdHlwZSBJbnN0YW5jZWApCgkJYXNzZXJ0KHR5cGUocHJvcGVydHlfbmFtZSkgPT0gInN0cmluZyIsIGBhcmcgIzIgbXVzdCBiZSB0eXBlIHN0cmluZ2ApCgkKCQlsb2NhbCB3YXNfc2NyaXB0YWJsZSA9IHNldHNjcmlwdGFibGUoaW5zdGFuY2UsIHByb3BlcnR5X25hbWUsIHRydWUpCgkJbG9jYWwgbywgZXJyID0gcGNhbGwoZnVuY3Rpb24oKQoJCQlpbnN0YW5jZVtwcm9wZXJ0eV9uYW1lXSA9IHZhbHVlCgkJZW5kKQoJCWlmIG5vdCB3YXNfc2NyaXB0YWJsZSB0aGVuCgkJCXNldHNjcmlwdGFibGUoaW5zdGFuY2UsIHByb3BlcnR5X25hbWUsIHdhc19zY3JpcHRhYmxlKQoJCWVuZAoJCWlmIG8gdGhlbgoJCQlyZXR1cm4gd2FzX3NjcmlwdGFibGUKCQllbHNlCgkJCWVycm9yKGVyciwgMikKCQllbmQKCWVuZAoJCglmdW5jdGlvbiBpc2NjbG9zdXJlKGZ1bmMpCgkJYXNzZXJ0KHR5cGUoZnVuYykgPT0gImZ1bmN0aW9uIiwgYGFyZyAjMSBtdXN0IGJlIHR5cGUgZnVuY3Rpb25gKQoJCXJldHVybiBkZWJ1Zy5pbmZvKGZ1bmMsICJzIikgPT0gIltDXSIKCWVuZAoJCglmdW5jdGlvbiBpc2xjbG9zdXJlKGZ1bmMpCgkJYXNzZXJ0KHR5cGUoZnVuYykgPT0gImZ1bmN0aW9uIiwgYGFyZyAjMSBtdXN0IGJlIHR5cGUgZnVuY3Rpb25gKQoJCXJldHVybiBkZWJ1Zy5pbmZvKGZ1bmMsICJzIikgfj0gIltDXSIKCWVuZAoJCglmdW5jdGlvbiBnZXRzY3JpcHRoYXNoKHNyYykKCQlyZXR1cm4gc3JjOkdldEhhc2goKQoJZW5kCgkKCWZ1bmN0aW9uIGdldGNhbGxpbmdzY3JpcHQoc3RhY2tDb3VudDogbnVtYmVyKQoJCXN0YWNrQ291bnQgPSBzdGFja0NvdW50IG9yIDMKCQoJCWZvciBzdGFja0x2bCA9IHN0YWNrQ291bnQsIDAsIC0xIGRvCgkJCWxvY2FsIGZ1bmMgPSBkZWJ1Zy5pbmZvKHN0YWNrTHZsLCAiZiIpCgkJCXN0YWNrTHZsIC09IDEKCQkJaWYgbm90IGZ1bmMgdGhlbgoJCQkJY29udGludWUKCQkJZW5kCgkKCQkJbG9jYWwgc2NyaXB0ID0gcmF3Z2V0KGdldGZlbnYoZnVuYyksICJzY3JpcHQiKQoJCgkJCWlmIHR5cGVvZihzY3JpcHQpID09ICJJbnN0YW5jZSIgYW5kIHNjcmlwdDpJc0EoIkJhc2VTY3JpcHQiKSB0aGVuCgkJCQlyZXR1cm4gc2NyaXB0CgkJCWVuZAoJCWVuZAoJZW5kCgkKCWxvY2FsIGZ1bmN0aW9uIG5ld1dyYXBwZWRDQ2xvc3VyZShmdW5jKQoJCWlmIGlzY2Nsb3N1cmUoZnVuYykgdGhlbgoJCQlyZXR1cm4gZnVuYwoJCWVuZAoJCgkJcmV0dXJuIGNvcm91dGluZS53cmFwKGZ1bmN0aW9uKC4uLikKCQkJbG9jYWwgYXJncyA9IHsgLi4uIH0KCQoJCQl3aGlsZSB0cnVlIGRvCgkJCQlhcmdzID0geyBjb3JvdXRpbmUueWllbGQoZnVuYyh1bnBhY2soYXJncykpKSB9CgkJCWVuZAoJCWVuZCkKCWVuZAoJCglmdW5jdGlvbiBuZXdjY2xvc3VyZShmdW5jKQoJCWFzc2VydCh0eXBlKGZ1bmMpID09ICJmdW5jdGlvbiIsIGBhcmcgIzEgbXVzdCBiZSB0eXBlIGZ1bmN0aW9uYCkKCQlyZXR1cm4gbmV3V3JhcHBlZENDbG9zdXJlKGZ1bmMpCgllbmQKCQoJZnVuY3Rpb24gbmV3bGNsb3N1cmUoZnVuYykKCQlyZXR1cm4gZnVuY3Rpb24oLi4uKQoJCQlyZXR1cm4gZnVuYyguLi4pCgkJZW5kCgllbmQKCQoJZnVuY3Rpb24gaXNleGVjdXRvcmNsb3N1cmUoZnVuYykKCQlpZiBpc2NjbG9zdXJlKGZ1bmMpIHRoZW4KCQkJcmV0dXJuIGRlYnVnLmluZm8oZnVuYywgIm4iKSA9PSAiIiAtLSAqIEhvcGVmdWxseSB0aGVyZSBhcmVuJ3QgYW55IGZhbHNlIHBvc2l0aXZlcwoJCWVuZAoJCWxvY2FsIGZfZW52ID0gZ2V0ZmVudihmdW5jKQoJCXJldHVybiBmX2Vudi5zY3JpcHQuUGFyZW50ID09IG5pbCBvciBmX2VudiA9PSBnZXRmZW52KDApIC0tIFRPRE8gVGhlIHNlY29uZCBwYXJ0IGNhbiBiZSBmb29sZWQgaWYgaXNleGVjdXRvcmNsb3N1cmUoSGlqYWNrZWRNb2R1bGUuRnVuY3Rpb24pCgllbmQKCQoJZnVuY3Rpb24gY2xvbmVmdW5jdGlvbihmdW5jKQoJCXJldHVybiBpZiBpc2NjbG9zdXJlKGZ1bmMpIHRoZW4gbmV3Y2Nsb3N1cmUoZnVuYykgZWxzZSBuZXdsY2xvc3VyZShmdW5jKQoJZW5kCgkKCWZ1bmN0aW9uIHNlY3VyZWNhbGwoZnVuYywgc2NyaXB0T3JFbnYsIC4uLik6IC4uLmFueQoJCWFzc2VydCh0eXBlKGZ1bmMpID09ICJmdW5jdGlvbiIsIGBhcmcgIzEgbXVzdCBiZSB0eXBlIGZ1bmN0aW9uYCkKCQoJCWxvY2FsIHR5cGVfc2NyaXB0T3JFbnYgPSB0eXBlb2Yoc2NyaXB0T3JFbnYpCgkJbG9jYWwgdmlydHVhbF9lbnYKCQlkbwoJCQlpZiB0eXBlX3NjcmlwdE9yRW52ID09ICJJbnN0YW5jZSIgYW5kIHNjcmlwdE9yRW52OklzQSgiTHVhU2NyaXB0Q29udGFpbmVyIikgdGhlbgoJCQkJdmlydHVhbF9lbnYgPSBzZXRtZXRhdGFibGUoe30sIHsgX19pbmRleCA9IGdldHJlbnYoKSB9KQoJCQkJdmlydHVhbF9lbnYuc2NyaXB0ID0gc2NyaXB0T3JFbnYKCQkJZWxzZWlmIHR5cGVfc2NyaXB0T3JFbnYgPT0gInRhYmxlIiB0aGVuCgkJCQl2aXJ0dWFsX2VudiA9IHNjcmlwdE9yRW52CgkJCWVsc2UKCQkJCXJldHVybiBlcnJvcihgaW52YWxpZCBhcmd1bWVudCAjMiAoTHVhU291cmNlQ29udGFpbmVyIHwgdGFibGUgZXhwZWN0ZWQsIGdvdCB7dHlwZV9zY3JpcHRPckVudn0pYCwgMikKCQkJZW5kCgkJZW5kCgkKCQlyZXR1cm4gY29yb3V0aW5lLndyYXAoZnVuY3Rpb24oLi4uKQoJCQlzZXRmZW52KDAsIHZpcnR1YWxfZW52KQoJCQlzZXRmZW52KDEsIHZpcnR1YWxfZW52KQoJCgkJCXJldHVybiBmdW5jKC4uLikKCQllbmQpKC4uLikKCWVuZAoJCglnZXR0aHJlYWQgPSBjb3JvdXRpbmUucnVubmluZwoJY2hlY2tjbG9zdXJlID0gaXNleGVjdXRvcmNsb3N1cmUKCWlzb3VyY2xvc3VyZSA9IGlzZXhlY3V0b3JjbG9zdXJlCgoJbG9jYWwgY2FsbGVkZXhlYyA9IGZhbHNlCgoJY29yb3V0aW5lLndyYXAoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJaWYgYnJpZGdlLmV4ZWN1dGlvbi5WYWx1ZSA9PSB0cnVlIHRoZW4KCgkJCQl3aGlsZSBjYWxsZWRleGVjIGRvCgkJCQkJdGFzay53YWl0KCkKCQkJCWVuZAoKCQkJCWxvY2FsIHNjcmlwdF9sb2FkID0gYnJpZGdlLm1vZHVsZV9ob2xkZXIuVmFsdWUKCQkJCWxvY2FsIG9yaWdpbmFsID0gc2NyaXB0X2xvYWQuTmFtZQoKCQkJCXNjcmlwdF9sb2FkLk5hbWUgPSAiTlgiCgkKCQkJCWxvY2FsIHMsIGZ1bmMgPSBwY2FsbChfcmVxdWlyZSwgc2NyaXB0X2xvYWQpCgoJCQkJc2NyaXB0X2xvYWQuTmFtZSA9IG9yaWdpbmFsCgoJCQkJYnJpZGdlLmV4ZWN1dGlvbi5WYWx1ZSA9IGZhbHNlCgkJCQljYWxsZWRleGVjID0gZmFsc2UKCgkJCQlsb2NhbCBuZXdfbW9kdWxlID0gZmV0Y2hfc3R1Ym1vZHVsZSgpOkNsb25lKCkKCQkJCWJyaWRnZS5tb2R1bGVfaG9sZGVyLlZhbHVlID0gbmV3X21vZHVsZQoJCQkJYnJpZGdlLmV4ZWN1dGluZ19zY3JpcHQgPSBuZXdfbW9kdWxlCgkJCQlzY3JpcHRfbG9hZDpEZXN0cm95KCkKCgkJCQlpZiBzIGFuZCB0eXBlKGZ1bmMpID09ICJmdW5jdGlvbiIgdGhlbgoJCQkJCXNldGZlbnYoZnVuYywgIHNldG1ldGF0YWJsZSh7fSwge19faW5kZXggPSBnZXRmZW52KCl9KSkKCQkJCQl0YXNrLmRlZmVyKGZ1bmN0aW9uKCkKCQkJCQkJbG9jYWwgc3VjY2VzcywgZXJyID0gcGNhbGwoZnVuYykKCQkJCQkJaWYgbm90IHN1Y2Nlc3MgdGhlbgoJCQkJCQkJd2FybihlcnIpCgkJCQkJCWVuZAoJCQkJCWVuZCkKCQkJCWVuZAoJCQllbmQKCQkJd2FpdCgwLjAwNSkKCQllbmQKCWVuZCkoKQoJCglsb2Fkc3RyaW5nID0gKGZ1bmN0aW9uKHNvdXJjZSwgY2h1bmtuYW1lKQoKCQlpZiBjaHVua25hbWUgPT0gbmlsIHRoZW4gY2h1bmtuYW1lID0gIk5YIiBlbmQKCQlpZiBjaHVua25hbWUgPT0gIiIgdGhlbiBjaHVua25hbWUgPSAiTlgiIGVuZAoJCQoJCXdoaWxlIGp1c3RjYWxsZWRsb2NhbCBkbwoJCQl0YXNrLndhaXQoKQoJCWVuZAoJCgkJanVzdGNhbGxlZGxvY2FsID0gdHJ1ZQoJCgkJYnJpZGdlOnBvc3QoImxvYWRzdHJpbmciLCB7c291cmNlPXNvdXJjZSx0eXBlPSJsb2Fkc3RyaW5nIn0pCgkKCQlsb2NhbCBzY3JpcHRfbG9hZCA9IGJyaWRnZS5sb2Fkc3RyaW5nX2hvbGRlci5WYWx1ZQoJCWxvY2FsIG9yaWdpbmFsID0gc2NyaXB0X2xvYWQuTmFtZQoJCXNjcmlwdF9sb2FkLk5hbWUgPSBjaHVua25hbWUKCQoJCWxvY2FsIHMsIGZ1bmMgPSBwY2FsbChyZXF1aXJlLCBzY3JpcHRfbG9hZCkKCQlzY3JpcHRfbG9hZC5OYW1lID0gb3JpZ2luYWwKCgkJanVzdGNhbGxlZGxvY2FsID0gZmFsc2UKCgkJbG9jYWwgbmV3X21vZHVsZSA9IGZldGNoX3N0dWJtb2R1bGUoKTpDbG9uZSgpCgkJYnJpZGdlLmxvYWRzdHJpbmdfaG9sZGVyLlZhbHVlID0gbmV3X21vZHVsZQoJCWJyaWRnZS5sb2Fkc3RyaW5nX3NjcmlwdCA9IG5ld19tb2R1bGUKCQlzY3JpcHRfbG9hZDpEZXN0cm95KCkKCQoJCWlmIHMgYW5kIHR5cGUoZnVuYykgPT0gImZ1bmN0aW9uIiB0aGVuCgkJCXNldGZlbnYoZnVuYywgIHNldG1ldGF0YWJsZSh7fSwge19faW5kZXggPSBnZXRmZW52KCl9KSkKCQoJCQlyZXR1cm4gZnVuYwoJCWVuZAoJZW5kKQoKCWZ1bmN0aW9uIHJlcXVpcmUobW9kdWxlU2NyaXB0KQoJCWFzc2VydCh0eXBlb2YobW9kdWxlU2NyaXB0KSA9PSAiSW5zdGFuY2UiLCAiQXR0ZW1wdGVkIHRvIGNhbGwgcmVxdWlyZSB3aXRoIGludmFsaWQgYXJndW1lbnQocykuICIsIDIpCgkJYXNzZXJ0KG1vZHVsZVNjcmlwdC5DbGFzc05hbWUgPT0gIk1vZHVsZVNjcmlwdCIsICJBdHRlbXB0ZWQgdG8gY2FsbCByZXF1aXJlIHdpdGggaW52YWxpZCBhcmd1bWVudChzKS4gIiwgMikKCQoJCWxvY2FsIG9iamVjdFZhbHVlID0gSW5zdGFuY2UubmV3KCJPYmplY3RWYWx1ZSIsIGdhbWUuQ29yZUd1aSkKCQlvYmplY3RWYWx1ZS5OYW1lID0gInJlcXVpcmVUaGlzIgoJCW9iamVjdFZhbHVlLlZhbHVlID0gbW9kdWxlU2NyaXB0CgkKCQlsb2NhbCBkYXRhID0gYnJpZGdlOnBvc3QoInJlcXVpcmUiLCB7dHlwZT0icmVxdWlyZSJ9KQoKCQlpZiB0eXBlKGRhdGEpID09ICJ0YWJsZSIgdGhlbgoJCQlpZiBkYXRhLnN0YXR1cyA9PSBmYWxzZSB0aGVuCgkJCQllcnJvcihkYXRhLmNvbnRlbnQpCgkJCWVuZAoJCWVuZAoKCQlvYmplY3RWYWx1ZTpEZXN0cm95KCkKCQoJCXJldHVybiBfcmVxdWlyZShtb2R1bGVTY3JpcHQpCgllbmQKCQoJaWRlbnRpZnlleGVjdXRvciA9IGZ1bmN0aW9uKCkKCQlyZXR1cm4gIk5YIiwgIjEuMCIKCWVuZAoJZ2V0ZXhlY3V0b3JuYW1lID0gaWRlbnRpZnlleGVjdXRvcgoJCglodHRwID0ge30KCXJlcXVlc3QgPSAoZnVuY3Rpb24oZGF0YSkKCQlyZXR1cm4gYnJpZGdlOnJlcXVlc3QoZGF0YSkKCWVuZCkKCQoJc2V0Y2xpcGJvYXJkID0gZnVuY3Rpb24odGV4dCkKCQlicmlkZ2U6c2VuZCgic2V0Y2xpcGJvYXJkIiwge2FyZz0idmFsdWUiLHZhbHVlPXRleHR9KQoJZW5kCgkKCXRvY2xpcGJvYXJkID0gc2V0Y2xpcGJvYXJkCgoJZnVuY3Rpb24gc2V0cmVhZG9ubHkodCwgbG9jaykKCQlpZiB0YWJsZS5pc2Zyb3plbih0KSB0aGVuCgkJCWlmIGxvY2sgdGhlbgoJCQkJcmV0dXJuCgkJCWVuZAoJCQktLSB1bmxvY2sgY29kZSBoZXJlCgkJZWxzZQoJCQlpZiBub3QgbG9jayB0aGVuCgkJCQlyZXR1cm4KCQkJZW5kCgkJCXRhYmxlLmZyZWV6ZSh0KQoJCWVuZAoJZW5kCgoJaXNyZWFkb25seSA9IHRhYmxlLmlzZnJvemVuCgkKCS0tW1sKCUFEVkFOQ0VEIEVOQ1JZUFRJT04gU1RBTkRBUkQgKEFFUykKCQoJSW1wbGVtZW50YXRpb24gb2Ygc2VjdXJlIHN5bW1ldHJpYy1rZXkgZW5jcnlwdGlvbiBzcGVjaWZpY2FsbHkgaW4gTHVhdQoJSW5jbHVkZXMgRUNCLCBDQkMsIFBDQkMsIENGQiwgT0ZCIGFuZCBDVFIgbW9kZXMgd2l0aG91dCBwYWRkaW5nLgoJTWFkZSBieSBAUm9ibG94R2FtZXJQcm8yMDAwMDcgKHZlcmlmeSB0aGUgb3JpZ2luYWwgYXNzZXQpCgkKCU1PUkUgSU5GT1JNQVRJT046IGh0dHBzOi8vZGV2Zm9ydW0ucm9ibG94LmNvbS90L2FkdmFuY2VkLWVuY3J5cHRpb24tc3RhbmRhcmQtaW4tbHVhdS8yMDA5MTIwCgldXQoJLS0gVGFrZW4gZnJvbSBodHRwczovL2RldmZvcnVtLnJvYmxveC5jb20vdC9hZHZhbmNlZC1lbmNyeXB0aW9uLXN0YW5kYXJkLWluLWx1YXUvIFdJVEggUEFUQ0hFUwoJCgktLSBTVUJTVElUVVRJT04gQk9YRVMKCWxvY2FsIHNfYm94IAk9IHsgOTksIDEyNCwgMTE5LCAxMjMsIDI0MiwgMTA3LCAxMTEsIDE5NywgIDQ4LCAgIDEsIDEwMywgIDQzLCAyNTQsIDIxNSwgMTcxLCAxMTgsIDIwMiwKCQkxMzAsIDIwMSwgMTI1LCAyNTAsICA4OSwgIDcxLCAyNDAsIDE3MywgMjEyLCAxNjIsIDE3NSwgMTU2LCAxNjQsIDExNCwgMTkyLCAxODMsIDI1MywgMTQ3LCAgMzgsICA1NCwKCQk2MywgMjQ3LCAyMDQsICA1MiwgMTY1LCAyMjksIDI0MSwgMTEzLCAyMTYsICA0OSwgIDIxLCAgIDQsIDE5OSwgIDM1LCAxOTUsICAyNCwgMTUwLCAgIDUsIDE1NCwgICA3LAoJCTE4LCAxMjgsIDIyNiwgMjM1LCAgMzksIDE3OCwgMTE3LCAgIDksIDEzMSwgIDQ0LCAgMjYsICAyNywgMTEwLCAgOTAsIDE2MCwgIDgyLCAgNTksIDIxNCwgMTc5LCAgNDEsCgkJMjI3LCAgNDcsIDEzMiwgIDgzLCAyMDksICAgMCwgMjM3LCAgMzIsIDI1MiwgMTc3LCAgOTEsIDEwNiwgMjAzLCAxOTAsICA1NywgIDc0LCAgNzYsICA4OCwgMjA3LCAyMDgsCgkJMjM5LCAxNzAsIDI1MSwgIDY3LCAgNzcsICA1MSwgMTMzLCAgNjksIDI0OSwgICAyLCAxMjcsICA4MCwgIDYwLCAxNTksIDE2OCwgIDgxLCAxNjMsICA2NCwgMTQzLCAxNDYsCgkJMTU3LCAgNTYsIDI0NSwgMTg4LCAxODIsIDIxOCwgIDMzLCAgMTYsIDI1NSwgMjQzLCAyMTAsIDIwNSwgIDEyLCAgMTksIDIzNiwgIDk1LCAxNTEsICA2OCwgIDIzLCAxOTYsCgkJMTY3LCAxMjYsICA2MSwgMTAwLCAgOTMsICAyNSwgMTE1LCAgOTYsIDEyOSwgIDc5LCAyMjAsICAzNCwgIDQyLCAxNDQsIDEzNiwgIDcwLCAyMzgsIDE4NCwgIDIwLCAyMjIsCgkJOTQsICAxMSwgMjE5LCAyMjQsICA1MCwgIDU4LCAgMTAsICA3MywgICA2LCAgMzYsICA5MiwgMTk0LCAyMTEsIDE3MiwgIDk4LCAxNDUsIDE0OSwgMjI4LCAxMjEsIDIzMSwKCQkyMDAsICA1NSwgMTA5LCAxNDEsIDIxMywgIDc4LCAxNjksIDEwOCwgIDg2LCAyNDQsIDIzNCwgMTAxLCAxMjIsIDE3NCwgICA4LCAxODYsIDEyMCwgIDM3LCAgNDYsICAyOCwKCQkxNjYsIDE4MCwgMTk4LCAyMzIsIDIyMSwgMTE2LCAgMzEsICA3NSwgMTg5LCAxMzksIDEzOCwgMTEyLCAgNjIsIDE4MSwgMTAyLCAgNzIsICAgMywgMjQ2LCAgMTQsICA5NywKCQk1MywgIDg3LCAxODUsIDEzNCwgMTkzLCAgMjksIDE1OCwgMjI1LCAyNDgsIDE1MiwgIDE3LCAxMDUsIDIxNywgMTQyLCAxNDgsIDE1NSwgIDMwLCAxMzUsIDIzMywgMjA2LAoJCTg1LCAgNDAsIDIyMywgMTQwLCAxNjEsIDEzNywgIDEzLCAxOTEsIDIzMCwgIDY2LCAxMDQsICA2NSwgMTUzLCAgNDUsICAxNSwgMTc2LCAgODQsIDE4NywgIDIyfQoJbG9jYWwgaW52X3NfYm94CT0geyA4MiwgICA5LCAxMDYsIDIxMywgIDQ4LCAgNTQsIDE2NSwgIDU2LCAxOTEsICA2NCwgMTYzLCAxNTgsIDEyOSwgMjQzLCAyMTUsIDI1MSwgMTI0LAoJCTIyNywgIDU3LCAxMzAsIDE1NSwgIDQ3LCAyNTUsIDEzNSwgIDUyLCAxNDIsICA2NywgIDY4LCAxOTYsIDIyMiwgMjMzLCAyMDMsICA4NCwgMTIzLCAxNDgsICA1MCwgMTY2LAoJCTE5NCwgIDM1LCAgNjEsIDIzOCwgIDc2LCAxNDksICAxMSwgIDY2LCAyNTAsIDE5NSwgIDc4LCAgIDgsICA0NiwgMTYxLCAxMDIsICA0MCwgMjE3LCAgMzYsIDE3OCwgMTE4LAoJCTkxLCAxNjIsICA3MywgMTA5LCAxMzksIDIwOSwgIDM3LCAxMTQsIDI0OCwgMjQ2LCAxMDAsIDEzNCwgMTA0LCAxNTIsICAyMiwgMjEyLCAxNjQsICA5MiwgMjA0LCAgOTMsCgkJMTAxLCAxODIsIDE0NiwgMTA4LCAxMTIsICA3MiwgIDgwLCAyNTMsIDIzNywgMTg1LCAyMTgsICA5NCwgIDIxLCAgNzAsICA4NywgMTY3LCAxNDEsIDE1NywgMTMyLCAxNDQsCgkJMjE2LCAxNzEsICAgMCwgMTQwLCAxODgsIDIxMSwgIDEwLCAyNDcsIDIyOCwgIDg4LCAgIDUsIDE4NCwgMTc5LCAgNjksICAgNiwgMjA4LCAgNDQsICAzMCwgMTQzLCAyMDIsCgkJNjMsICAxNSwgICAyLCAxOTMsIDE3NSwgMTg5LCAgIDMsICAgMSwgIDE5LCAxMzgsIDEwNywgIDU4LCAxNDUsICAxNywgIDY1LCAgNzksIDEwMywgMjIwLCAyMzQsIDE1MSwKCQkyNDIsIDIwNywgMjA2LCAyNDAsIDE4MCwgMjMwLCAxMTUsIDE1MCwgMTcyLCAxMTYsICAzNCwgMjMxLCAxNzMsICA1MywgMTMzLCAyMjYsIDI0OSwgIDU1LCAyMzIsICAyOCwKCQkxMTcsIDIyMywgMTEwLCAgNzEsIDI0MSwgIDI2LCAxMTMsICAyOSwgIDQxLCAxOTcsIDEzNywgMTExLCAxODMsICA5OCwgIDE0LCAxNzAsICAyNCwgMTkwLCAgMjcsIDI1MiwKCQk4NiwgIDYyLCAgNzUsIDE5OCwgMjEwLCAxMjEsICAzMiwgMTU0LCAyMTksIDE5MiwgMjU0LCAxMjAsIDIwNSwgIDkwLCAyNDQsICAzMSwgMjIxLCAxNjgsICA1MSwgMTM2LAoJCTcsIDE5OSwgIDQ5LCAxNzcsICAxOCwgIDE2LCAgODksICAzOSwgMTI4LCAyMzYsICA5NSwgIDk2LCAgODEsIDEyNywgMTY5LCAgMjUsIDE4MSwgIDc0LCAgMTMsICA0NSwKCQkyMjksIDEyMiwgMTU5LCAxNDcsIDIwMSwgMTU2LCAyMzksIDE2MCwgMjI0LCAgNTksICA3NywgMTc0LCAgNDIsIDI0NSwgMTc2LCAyMDAsIDIzNSwgMTg3LCAgNjAsIDEzMSwKCQk4MywgMTUzLCAgOTcsICAyMywgIDQzLCAgIDQsIDEyNiwgMTg2LCAxMTksIDIxNCwgIDM4LCAyMjUsIDEwNSwgIDIwLCAgOTksICA4NSwgIDMzLCAgMTIsIDEyNX0KCQoJLS0gUk9VTkQgQ09OU1RBTlRTIEFSUkFZCglsb2NhbCByY29uID0geyAgMCwgICAxLCAgIDIsICAgNCwgICA4LCAgMTYsICAzMiwgIDY0LCAxMjgsICAyNywgIDU0LCAxMDgsIDIxNiwgMTcxLCAgNzcsIDE1NCwgIDQ3LCAgOTQsCgkJMTg4LCAgOTksIDE5OCwgMTUxLCAgNTMsIDEwNiwgMjEyLCAxNzksIDEyNSwgMjUwLCAyMzksIDE5NywgMTQ1LCAgNTd9CgktLSBNVUxUSVBMSUNBVElPTiBPRiBCSU5BUlkgUE9MWU5PTUlBTAoJbG9jYWwgZnVuY3Rpb24geHRpbWUoeCkKCQlsb2NhbCBpID0gYml0MzIubHNoaWZ0KHgsIDEpCgkJcmV0dXJuIGlmIGJpdDMyLmJhbmQoeCwgMTI4KSA9PSAwIHRoZW4gaSBlbHNlIGJpdDMyLmJ4b3IoaSwgMjcpICUgMjU2CgllbmQKCQoJLS0gVFJBTlNGT1JNQVRJT04gRlVOQ1RJT05TCglsb2NhbCBmdW5jdGlvbiBzdWJCeXRlcwkJKHMsIGludikgCQktLSBQcm9jZXNzZXMgU3RhdGUgdXNpbmcgdGhlIFMtYm94CgkJaW52ID0gaWYgaW52IHRoZW4gaW52X3NfYm94IGVsc2Ugc19ib3gKCQlmb3IgaSA9IDEsIDQgZG8KCQkJZm9yIGogPSAxLCA0IGRvCgkJCQlzW2ldW2pdID0gaW52W3NbaV1bal0gKyAxXQoJCQllbmQKCQllbmQKCWVuZAoJbG9jYWwgZnVuY3Rpb24gc2hpZnRSb3dzCQkocywgaW52KSAJLS0gUHJvY2Vzc2VzIFN0YXRlIGJ5IGNpcmN1bGFybHkgc2hpZnRpbmcgcm93cwoJCXNbMV1bM10sIHNbMl1bM10sIHNbM11bM10sIHNbNF1bM10gPSBzWzNdWzNdLCBzWzRdWzNdLCBzWzFdWzNdLCBzWzJdWzNdCgkJaWYgaW52IHRoZW4KCQkJc1sxXVsyXSwgc1syXVsyXSwgc1szXVsyXSwgc1s0XVsyXSA9IHNbNF1bMl0sIHNbMV1bMl0sIHNbMl1bMl0sIHNbM11bMl0KCQkJc1sxXVs0XSwgc1syXVs0XSwgc1szXVs0XSwgc1s0XVs0XSA9IHNbMl1bNF0sIHNbM11bNF0sIHNbNF1bNF0sIHNbMV1bNF0KCQllbHNlCgkJCXNbMV1bMl0sIHNbMl1bMl0sIHNbM11bMl0sIHNbNF1bMl0gPSBzWzJdWzJdLCBzWzNdWzJdLCBzWzRdWzJdLCBzWzFdWzJdCgkJCXNbMV1bNF0sIHNbMl1bNF0sIHNbM11bNF0sIHNbNF1bNF0gPSBzWzRdWzRdLCBzWzFdWzRdLCBzWzJdWzRdLCBzWzNdWzRdCgkJZW5kCgllbmQKCWxvY2FsIGZ1bmN0aW9uIGFkZFJvdW5kS2V5CShzLCBrKSAJCQktLSBQcm9jZXNzZXMgQ2lwaGVyIGJ5IGFkZGluZyBhIHJvdW5kIGtleSB0byB0aGUgU3RhdGUKCQlmb3IgaSA9IDEsIDQgZG8KCQkJZm9yIGogPSAxLCA0IGRvCgkJCQlzW2ldW2pdID0gYml0MzIuYnhvcihzW2ldW2pdLCBrW2ldW2pdKQoJCQllbmQKCQllbmQKCWVuZAoJbG9jYWwgZnVuY3Rpb24gbWl4Q29sdW1ucwkocywgaW52KSAJCS0tIFByb2Nlc3NlcyBDaXBoZXIgYnkgdGFraW5nIGFuZCBtaXhpbmcgU3RhdGUgY29sdW1ucwoJCWxvY2FsIHQsIHUKCQlpZiBpbnYgdGhlbgoJCQlmb3IgaSA9IDEsIDQgZG8KCQkJCXQgPSB4dGltZSh4dGltZShiaXQzMi5ieG9yKHNbaV1bMV0sIHNbaV1bM10pKSkKCQkJCXUgPSB4dGltZSh4dGltZShiaXQzMi5ieG9yKHNbaV1bMl0sIHNbaV1bNF0pKSkKCQkJCXNbaV1bMV0sIHNbaV1bMl0gPSBiaXQzMi5ieG9yKHNbaV1bMV0sIHQpLCBiaXQzMi5ieG9yKHNbaV1bMl0sIHUpCgkJCQlzW2ldWzNdLCBzW2ldWzRdID0gYml0MzIuYnhvcihzW2ldWzNdLCB0KSwgYml0MzIuYnhvcihzW2ldWzRdLCB1KQoJCQllbmQKCQllbmQKCQoJCWxvY2FsIGkKCQlmb3IgaiA9IDEsIDQgZG8KCQkJaSA9IHNbal0KCQkJdCwgdSA9IGJpdDMyLmJ4b3IJCShpWzFdLCBpWzJdLCBpWzNdLCBpWzRdKSwgaVsxXQoJCQlmb3IgayA9IDEsIDQgZG8KCQkJCWlba10gPSBiaXQzMi5ieG9yCShpW2tdLCB0LCB4dGltZShiaXQzMi5ieG9yKGlba10sIGlbayArIDFdIG9yIHUpKSkKCQkJZW5kCgkJZW5kCgllbmQKCQoJLS0gQllURSBBUlJBWSBVVElMSVRJRVMKCWxvY2FsIGZ1bmN0aW9uIGJ5dGVzVG9NYXRyaXgJKHQsIGMsIGludikgLS0gQ29udmVydHMgYSBieXRlIGFycmF5IHRvIGEgNHg0IG1hdHJpeAoJCWlmIGludiB0aGVuCgkJCXRhYmxlLm1vdmUJCShjWzFdLCAxLCA0LCAxLCB0KQoJCQl0YWJsZS5tb3ZlCQkoY1syXSwgMSwgNCwgNSwgdCkKCQkJdGFibGUubW92ZQkJKGNbM10sIDEsIDQsIDksIHQpCgkJCXRhYmxlLm1vdmUJCShjWzRdLCAxLCA0LCAxMywgdCkKCQllbHNlCgkJCWZvciBpID0gMSwgI2MgLyA0IGRvCgkJCQl0YWJsZS5jbGVhcgkodFtpXSkKCQkJCXRhYmxlLm1vdmUJKGMsIGkgKiA0IC0gMywgaSAqIDQsIDEsIHRbaV0pCgkJCWVuZAoJCWVuZAoJCgkJcmV0dXJuIHQKCWVuZAoJbG9jYWwgZnVuY3Rpb24geG9yQnl0ZXMJCSh0LCBhLCBiKSAJCS0tIFJldHVybnMgYml0d2lzZSBYT1Igb2YgYWxsIHRoZWlyIGJ5dGVzCgkJdGFibGUuY2xlYXIJCSh0KQoJCgkJZm9yIGkgPSAxLCBtYXRoLm1pbigjYSwgI2IpIGRvCgkJCXRhYmxlLmluc2VydCh0LCBiaXQzMi5ieG9yKGFbaV0sIGJbaV0pKQoJCWVuZAoJCXJldHVybiB0CgllbmQKCWxvY2FsIGZ1bmN0aW9uIGluY0J5dGVzCQkoYSwgaW52KQkJLS0gSW5jcmVtZW50IGJ5dGUgYXJyYXkgYnkgb25lCgkJbG9jYWwgbyA9IHRydWUKCQlmb3IgaSA9IGlmIGludiB0aGVuIDEgZWxzZSAjYSwgaWYgaW52IHRoZW4gI2EgZWxzZSAxLCBpZiBpbnYgdGhlbiAxIGVsc2UgLSAxIGRvCgkJCWlmIGFbaV0gPT0gMjU1IHRoZW4KCQkJCWFbaV0gPSAwCgkJCWVsc2UKCQkJCWFbaV0gKz0gMQoJCQkJbyA9IGZhbHNlCgkJCQlicmVhawoJCQllbmQKCQllbmQKCQoJCXJldHVybiBvLCBhCgllbmQKCQoJLS0gTUFJTiBBTEdPUklUSE0KCWxvY2FsIGZ1bmN0aW9uIGV4cGFuZEtleQkoa2V5KSAJCQkJLS0gS2V5IGV4cGFuc2lvbgoJCWxvY2FsIGtjID0gYnl0ZXNUb01hdHJpeChpZiAja2V5ID09IDE2IHRoZW4ge3t9LCB7fSwge30sIHt9fSBlbHNlaWYgI2tleSA9PSAyNCB0aGVuIHt7fSwge30sIHt9LCB7fQoJCQksIHt9LCB7fX0gZWxzZSB7e30sIHt9LCB7fSwge30sIHt9LCB7fSwge30sIHt9fSwga2V5KQoJCWxvY2FsIGlzID0gI2tleSAvIDQKCQlsb2NhbCBpLCB0LCB3ID0gMiwge30sIG5pbAoJCgkJd2hpbGUgI2tjIDwgKCNrZXkgLyA0ICsgNykgKiA0IGRvCgkJCXcgPSB0YWJsZS5jbG9uZQkoa2NbI2tjXSkKCQkJaWYgI2tjICUgaXMgPT0gMCB0aGVuCgkJCQl0YWJsZS5pbnNlcnQodywgdGFibGUucmVtb3ZlKHcsIDEpKQoJCQkJZm9yIGogPSAxLCA0IGRvCgkJCQkJd1tqXSA9IHNfYm94W3dbal0gKyAxXQoJCQkJZW5kCgkJCQl3WzFdCSA9IGJpdDMyLmJ4b3Iod1sxXSwgcmNvbltpXSkKCQkJCWkgCSs9IDEKCQkJZWxzZWlmICNrZXkgPT0gMzIgYW5kICNrYyAlIGlzID09IDQgdGhlbgoJCQkJZm9yIGogPSAxLCA0IGRvCgkJCQkJd1tqXSA9IHNfYm94W3dbal0gKyAxXQoJCQkJZW5kCgkJCWVuZAoJCgkJCXRhYmxlLmNsZWFyCSh0KQoJCQl4b3JCeXRlcwkodywgdGFibGUubW92ZSh3LCAxLCA0LCAxLCB0KSwga2NbI2tjIC0gaXMgKyAxXSkKCQkJdGFibGUuaW5zZXJ0KGtjLCB3KQoJCWVuZAoJCgkJdGFibGUuY2xlYXIJCSh0KQoJCWZvciBpID0gMSwgI2tjIC8gNCBkbwoJCQl0YWJsZS5pbnNlcnQodCwge30pCgkJCXRhYmxlLm1vdmUJKGtjLCBpICogNCAtIDMsIGkgKiA0LCAxLCB0WyN0XSkKCQllbmQKCQlyZXR1cm4gdAoJZW5kCglsb2NhbCBmdW5jdGlvbiBlbmNyeXB0CShrZXksIGttLCBwdCwgcHMsIHIpIAktLSBCbG9jayBjaXBoZXIgZW5jcnlwdGlvbgoJCWJ5dGVzVG9NYXRyaXgJKHBzLCBwdCkKCQlhZGRSb3VuZEtleQkJKHBzLCBrbVsxXSkKCQoJCWZvciBpID0gMiwgI2tleSAvIDQgKyA2IGRvCgkJCXN1YkJ5dGVzCShwcykKCQkJc2hpZnRSb3dzCShwcykKCQkJbWl4Q29sdW1ucwkocHMpCgkJCWFkZFJvdW5kS2V5CShwcywga21baV0pCgkJZW5kCgkJc3ViQnl0ZXMJCShwcykKCQlzaGlmdFJvd3MJCShwcykKCQlhZGRSb3VuZEtleQkJKHBzLCBrbVsja21dKQoJCgkJcmV0dXJuIGJ5dGVzVG9NYXRyaXgociwgcHMsIHRydWUpCgllbmQKCWxvY2FsIGZ1bmN0aW9uIGRlY3J5cHQJKGtleSwga20sIGN0LCBjcywgcikgCS0tIEJsb2NrIGNpcGhlciBkZWNyeXB0aW9uCgkJYnl0ZXNUb01hdHJpeAkoY3MsIGN0KQoJCgkJYWRkUm91bmRLZXkJCShjcywga21bI2ttXSkKCQlzaGlmdFJvd3MJCShjcywgdHJ1ZSkKCQlzdWJCeXRlcwkJKGNzLCB0cnVlKQoJCWZvciBpID0gI2tleSAvIDQgKyA2LCAyLCAtIDEgZG8KCQkJYWRkUm91bmRLZXkJKGNzLCBrbVtpXSkKCQkJbWl4Q29sdW1ucwkoY3MsIHRydWUpCgkJCXNoaWZ0Um93cwkoY3MsIHRydWUpCgkJCXN1YkJ5dGVzCShjcywgdHJ1ZSkKCQllbmQKCQoJCWFkZFJvdW5kS2V5CQkoY3MsIGttWzFdKQoJCXJldHVybiBieXRlc1RvTWF0cml4KHIsIGNzLCB0cnVlKQoJZW5kCgkKCS0tIElOSVRJQUxJWkFUSU9OIEZVTkNUSU9OUwoJbG9jYWwgZnVuY3Rpb24gY29udmVydFR5cGUJKGEpIAkJCQkJLS0gQ29udmVydHMgZGF0YSB0byBieXRlcyBpZiBwb3NzaWJsZQoJCWlmIHR5cGUoYSkgPT0gInN0cmluZyIgdGhlbgoJCQlsb2NhbCByID0ge30KCQoJCQlmb3IgaSA9IDEsIHN0cmluZy5sZW4oYSksIDc5OTcgZG8KCQkJCXRhYmxlLm1vdmUoe3N0cmluZy5ieXRlKGEsIGksIGkgKyA3OTk2KX0sIDEsIDc5OTcsIGksIHIpCgkJCWVuZAoJCQlyZXR1cm4gcgoJCWVsc2VpZiB0eXBlKGEpID09ICJ0YWJsZSIgdGhlbgoJCQlmb3IgXywgaSBpbiBhIGRvCgkJCQlhc3NlcnQodHlwZShpKSA9PSAibnVtYmVyIiBhbmQgbWF0aC5mbG9vcihpKSA9PSBpIGFuZCAwIDw9IGkgYW5kIGkgPCAyNTYsCgkJCQkJIlVuYWJsZSB0byBjYXN0IHZhbHVlIHRvIGJ5dGVzIikKCQkJZW5kCgkJCXJldHVybiBhCgkJZWxzZQoJCQllcnJvcigiVW5hYmxlIHRvIGNhc3QgdmFsdWUgdG8gYnl0ZXMiKQoJCWVuZAoJZW5kCglsb2NhbCBmdW5jdGlvbiBkZWVwQ29weShPcmlnaW5hbCkKCQlsb2NhbCBjb3B5ID0ge30KCQlmb3Iga2V5LCB2YWwgaW4gT3JpZ2luYWwgZG8KCQkJbG9jYWwgVHlwZSA9IHR5cGVvZih2YWwpCgkJCWlmIFR5cGUgPT0gInRhYmxlIiB0aGVuCgkJCQl2YWwgPSBkZWVwQ29weSh2YWwpCgkJCWVuZAoJCQljb3B5W2tleV0gPSB2YWwKCQllbmQKCQlyZXR1cm4gY29weQoJZW5kCglsb2NhbCBmdW5jdGlvbiBpbml0CQkJKGtleSwgdHh0LCBtLCBpdiwgcykgCS0tIEluaXRpYWxpemVzIGZ1bmN0aW9ucyBpZiBwb3NzaWJsZQoJCWtleSA9IGNvbnZlcnRUeXBlKGtleSkKCQlhc3NlcnQoI2tleSA9PSAxNiBvciAja2V5ID09IDI0IG9yICNrZXkgPT0gMzIsICJLZXkgbXVzdCBiZSBlaXRoZXIgMTYsIDI0IG9yIDMyIGJ5dGVzIGxvbmciKQoJCXR4dCA9IGNvbnZlcnRUeXBlKHR4dCkKCQlhc3NlcnQoI3R4dCAlIChzIG9yIDE2KSA9PSAwLCAiSW5wdXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mICIgLi4gKGlmIHMgdGhlbiAic2VnbWVudCBzaXplICIgLi4gcwoJCQllbHNlICIxNiIpIC4uICIgYnl0ZXMgaW4gbGVuZ3RoIikKCQlpZiBtIHRoZW4KCQkJaWYgdHlwZShpdikgPT0gInRhYmxlIiB0aGVuCgkJCQlpdiA9IHRhYmxlLmNsb25lKGl2KQoJCQkJbG9jYWwgbCwgZSAJCT0gaXYuTGVuZ3RoLCBpdi5MaXR0bGVFbmRpYW4KCQkJCWFzc2VydCh0eXBlKGwpID09ICJudW1iZXIiIGFuZCAwIDwgbCBhbmQgbCA8PSAxNiwKCQkJCQkiQ291bnRlciB2YWx1ZSBsZW5ndGggbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDE2IGJ5dGVzIikKCQkJCWl2LlByZWZpeCAJCT0gY29udmVydFR5cGUoaXYuUHJlZml4IG9yIHt9KQoJCQkJaXYuU3VmZml4IAkJPSBjb252ZXJ0VHlwZShpdi5TdWZmaXggb3Ige30pCgkJCQlhc3NlcnQoI2l2LlByZWZpeCArICNpdi5TdWZmaXggKyBsID09IDE2LCAiQ291bnRlciBtdXN0IGJlIDE2IGJ5dGVzIGxvbmciKQoJCQkJaXYuSW5pdFZhbHVlIAk9IGlmIGl2LkluaXRWYWx1ZSA9PSBuaWwgdGhlbiB7MX0gZWxzZSB0YWJsZS5jbG9uZShjb252ZXJ0VHlwZShpdi5Jbml0VmFsdWUKCQkJCSkpCgkJCQlhc3NlcnQoI2l2LkluaXRWYWx1ZSA8PSBsLCAiSW5pdGlhbCB2YWx1ZSBsZW5ndGggbXVzdCBiZSBvZiB0aGUgY291bnRlciB2YWx1ZSIpCgkJCQlpdi5Jbml0T3ZlcmZsb3cgPSBpZiBpdi5Jbml0T3ZlcmZsb3cgPT0gbmlsIHRoZW4gdGFibGUuY3JlYXRlKGwsIDApIGVsc2UgdGFibGUuY2xvbmUoCgkJCQljb252ZXJ0VHlwZShpdi5Jbml0T3ZlcmZsb3cpKQoJCQkJYXNzZXJ0KCNpdi5Jbml0T3ZlcmZsb3cgPD0gbCwKCQkJCQkiSW5pdGlhbCBvdmVyZmxvdyB2YWx1ZSBsZW5ndGggbXVzdCBiZSBvZiB0aGUgY291bnRlciB2YWx1ZSIpCgkJCQlmb3IgXyA9IDEsIGwgLSAjaXYuSW5pdFZhbHVlIGRvCgkJCQkJdGFibGUuaW5zZXJ0KGl2LkluaXRWYWx1ZSwgMSArIGlmIGUgdGhlbiAjaXYuSW5pdFZhbHVlIGVsc2UgMCwgMCkKCQkJCWVuZAoJCQkJZm9yIF8gPSAxLCBsIC0gI2l2LkluaXRPdmVyZmxvdyBkbwoJCQkJCXRhYmxlLmluc2VydChpdi5Jbml0T3ZlcmZsb3csIDEgKyBpZiBlIHRoZW4gI2l2LkluaXRPdmVyZmxvdyBlbHNlIDAsIDApCgkJCQllbmQKCQkJZWxzZWlmIHR5cGUoaXYpIH49ICJmdW5jdGlvbiIgdGhlbgoJCQkJbG9jYWwgaSwgdCA9IGlmIGl2IHRoZW4gY29udmVydFR5cGUoaXYpIGVsc2UgdGFibGUuY3JlYXRlKDE2LCAwKSwge30KCQkJCWFzc2VydCgjaSA9PSAxNiwgIkNvdW50ZXIgbXVzdCBiZSAxNiBieXRlcyBsb25nIikKCQkJCWl2ID0ge0xlbmd0aCA9IDE2LCBQcmVmaXggPSB0LCBTdWZmaXggPSB0LCBJbml0VmFsdWUgPSBpLAoJCQkJCUluaXRPdmVyZmxvdyA9IHRhYmxlLmNyZWF0ZSgxNiwgMCl9CgkJCWVuZAoJCWVsc2VpZiBtID09IGZhbHNlIHRoZW4KCQkJaXYgCT0gaWYgaXYgPT0gbmlsIHRoZW4gIHRhYmxlLmNyZWF0ZSgxNiwgMCkgZWxzZSBjb252ZXJ0VHlwZShpdikKCQkJYXNzZXJ0KCNpdiA9PSAxNiwgIkluaXRpYWxpemF0aW9uIHZlY3RvciBtdXN0IGJlIDE2IGJ5dGVzIGxvbmciKQoJCWVuZAoJCWlmIHMgdGhlbgoJCQlzID0gbWF0aC5mbG9vcih0b251bWJlcihzKSBvciAxKQoJCQlhc3NlcnQodHlwZShzKSA9PSAibnVtYmVyIiBhbmQgMCA8IHMgYW5kIHMgPD0gMTYsICJTZWdtZW50IHNpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDE2IGJ5dGVzIgoJCQkpCgkJZW5kCgkKCQlyZXR1cm4ga2V5LCB0eHQsIGV4cGFuZEtleShrZXkpLCBpdiwgcwoJZW5kCgl0eXBlIGJ5dGVzID0ge251bWJlcn0gLS0gVHlwZSBpbnN0YW5jZSBvZiBhIHZhbGlkIGJ5dGVzIG9iamVjdAoJCgktLSBDSVBIRVIgTU9ERVMgT0YgT1BFUkFUSU9OCglsb2NhbCBhZXMgPSB7CgkJLS0gRWxlY3Ryb25pYyBjb2RlYm9vayAoRUNCKQoJCWVuY3J5cHRfRUNCID0gZnVuY3Rpb24oa2V5IDogYnl0ZXMsIHBsYWluVGV4dCA6IGJ5dGVzLCBpbml0VmVjdG9yIDogYnl0ZXM/KSAJCQkJCQkJCQk6IGJ5dGVzCgkJCWxvY2FsIGttCgkJCWtleSwgcGxhaW5UZXh0LCBrbSwgaW5pdFZlY3RvciA9IGluaXQoa2V5LCBwbGFpblRleHQsIGZhbHNlLCBpbml0VmVjdG9yKQoJCgkJCWxvY2FsIGl2ID0gZGVlcENvcHkoaW5pdFZlY3RvcikKCQkJbG9jYWwgYiwgaywgcywgdCA9IHt9LCB7fSwge3t9LCB7fSwge30sIHt9fSwge30KCQkJZm9yIGkgPSAxLCAjcGxhaW5UZXh0LCAxNiBkbwoJCQkJdGFibGUubW92ZShwbGFpblRleHQsIGksIGkgKyAxNSwgMSwgaykKCQkJCXRhYmxlLm1vdmUoZW5jcnlwdChrZXksIGttLCBrLCBzLCB0KSwgMSwgMTYsIGksIGIpCgkJCWVuZAoJCgkJCXJldHVybiBiLCBpdgoJCWVuZCwKCQlkZWNyeXB0X0VDQiA9IGZ1bmN0aW9uKGtleSA6IGJ5dGVzLCBjaXBoZXJUZXh0IDogYnl0ZXMsIGluaXRWZWN0b3IgOiBieXRlcz8pIAkJCQkJCQkJOiBieXRlcwoJCQlsb2NhbCBrbQoJCQlrZXksIGNpcGhlclRleHQsIGttID0gaW5pdChrZXksIGNpcGhlclRleHQsIGZhbHNlLCBpbml0VmVjdG9yKQoJCgkJCWxvY2FsIGIsIGssIHMsIHQgPSB7fSwge30sIHt7fSwge30sIHt9LCB7fX0sIHt9CgkJCWZvciBpID0gMSwgI2NpcGhlclRleHQsIDE2IGRvCgkJCQl0YWJsZS5tb3ZlKGNpcGhlclRleHQsIGksIGkgKyAxNSwgMSwgaykKCQkJCXRhYmxlLm1vdmUoZGVjcnlwdChrZXksIGttLCBrLCBzLCB0KSwgMSwgMTYsIGksIGIpCgkJCWVuZAoJCgkJCXJldHVybiBiCgkJZW5kLAoJCS0tIENpcGhlciBibG9jayBjaGFpbmluZyAoQ0JDKQoJCWVuY3J5cHRfQ0JDID0gZnVuY3Rpb24oa2V5IDogYnl0ZXMsIHBsYWluVGV4dCA6IGJ5dGVzLCBpbml0VmVjdG9yIDogYnl0ZXM/KSAJCQk6IGJ5dGVzCgkJCWxvY2FsIGttCgkJCWtleSwgcGxhaW5UZXh0LCBrbSwgaW5pdFZlY3RvciA9IGluaXQoa2V5LCBwbGFpblRleHQsIGZhbHNlLCBpbml0VmVjdG9yKQoJCQlsb2NhbCBpdiA9IGRlZXBDb3B5KGluaXRWZWN0b3IpCgkJCWxvY2FsIGIsIGssIHAsIHMsIHQgPSB7fSwge30sIGluaXRWZWN0b3IsIHt7fSwge30sIHt9LCB7fX0sIHt9CgkJCWZvciBpID0gMSwgI3BsYWluVGV4dCwgMTYgZG8KCQkJCXRhYmxlLm1vdmUocGxhaW5UZXh0LCBpLCBpICsgMTUsIDEsIGspCgkJCQl0YWJsZS5tb3ZlKGVuY3J5cHQoa2V5LCBrbSwgeG9yQnl0ZXModCwgaywgcCksIHMsIHApLCAxLCAxNiwgaSwgYikKCQkJZW5kCgkKCQkJcmV0dXJuIGIsIGl2CgkJZW5kLAoJCWRlY3J5cHRfQ0JDID0gZnVuY3Rpb24oa2V5IDogYnl0ZXMsIGNpcGhlclRleHQgOiBieXRlcywgaW5pdFZlY3RvciA6IGJ5dGVzPykgCQkJOiBieXRlcwoJCQlsb2NhbCBrbQoJCQlrZXksIGNpcGhlclRleHQsIGttLCBpbml0VmVjdG9yID0gaW5pdChrZXksIGNpcGhlclRleHQsIGZhbHNlLCBpbml0VmVjdG9yKQoJCgkJCWxvY2FsIGIsIGssIHAsIHMsIHQgPSB7fSwge30sIGluaXRWZWN0b3IsIHt7fSwge30sIHt9LCB7fX0sIHt9CgkJCWZvciBpID0gMSwgI2NpcGhlclRleHQsIDE2IGRvCgkJCQl0YWJsZS5tb3ZlKGNpcGhlclRleHQsIGksIGkgKyAxNSwgMSwgaykKCQkJCXRhYmxlLm1vdmUoeG9yQnl0ZXMoaywgZGVjcnlwdChrZXksIGttLCBrLCBzLCB0KSwgcCksIDEsIDE2LCBpLCBiKQoJCQkJdGFibGUubW92ZShjaXBoZXJUZXh0LCBpLCBpICsgMTUsIDEsIHApCgkJCWVuZAoJCgkJCXJldHVybiBiCgkJZW5kLAoJCS0tIFByb3BhZ2F0aW5nIGNpcGhlciBibG9jayBjaGFpbmluZyAoUENCQykKCQllbmNyeXB0X1BDQkMgPSBmdW5jdGlvbihrZXkgOiBieXRlcywgcGxhaW5UZXh0IDogYnl0ZXMsIGluaXRWZWN0b3IgOiBieXRlcz8pIAkJCTogYnl0ZXMKCQkJbG9jYWwga20KCQkJa2V5LCBwbGFpblRleHQsIGttLCBpbml0VmVjdG9yID0gaW5pdChrZXksIHBsYWluVGV4dCwgZmFsc2UsIGluaXRWZWN0b3IpCgkJCWxvY2FsIGl2ID0gZGVlcENvcHkoaW5pdFZlY3RvcikKCQkJbG9jYWwgYiwgaywgYywgcCwgcywgdCA9IHt9LCB7fSwgaW5pdFZlY3RvciwgdGFibGUuY3JlYXRlKDE2LCAwKSwge3t9LCB7fSwge30sIHt9fSwge30KCQkJZm9yIGkgPSAxLCAjcGxhaW5UZXh0LCAxNiBkbwoJCQkJdGFibGUubW92ZShwbGFpblRleHQsIGksIGkgKyAxNSwgMSwgaykKCQkJCXRhYmxlLm1vdmUoZW5jcnlwdChrZXksIGttLCB4b3JCeXRlcyhrLCB4b3JCeXRlcyh0LCBjLCBrKSwgcCksIHMsIGMpLCAxLCAxNiwgaSwgYikKCQkJCXRhYmxlLm1vdmUocGxhaW5UZXh0LCBpLCBpICsgMTUsIDEsIHApCgkJCWVuZAoJCgkJCXJldHVybiBiLCBpdgoJCWVuZCwKCQlkZWNyeXB0X1BDQkMgPSBmdW5jdGlvbihrZXkgOiBieXRlcywgY2lwaGVyVGV4dCA6IGJ5dGVzLCBpbml0VmVjdG9yIDogYnl0ZXM/KSAJCQk6IGJ5dGVzCgkJCWxvY2FsIGttCgkJCWtleSwgY2lwaGVyVGV4dCwga20sIGluaXRWZWN0b3IgPSBpbml0KGtleSwgY2lwaGVyVGV4dCwgZmFsc2UsIGluaXRWZWN0b3IpCgkKCQkJbG9jYWwgYiwgaywgYywgcCwgcywgdCA9IHt9LCB7fSwgaW5pdFZlY3RvciwgdGFibGUuY3JlYXRlKDE2LCAwKSwge3t9LCB7fSwge30sIHt9fSwge30KCQkJZm9yIGkgPSAxLCAjY2lwaGVyVGV4dCwgMTYgZG8KCQkJCXRhYmxlLm1vdmUoY2lwaGVyVGV4dCwgaSwgaSArIDE1LCAxLCBrKQoJCQkJdGFibGUubW92ZSh4b3JCeXRlcyhwLCBkZWNyeXB0KGtleSwga20sIGssIHMsIHQpLCB4b3JCeXRlcyhrLCBjLCBwKSksIDEsIDE2LCBpLCBiKQoJCQkJdGFibGUubW92ZShjaXBoZXJUZXh0LCBpLCBpICsgMTUsIDEsIGMpCgkJCWVuZAoJCgkJCXJldHVybiBiCgkJZW5kLAoJCS0tIENpcGhlciBmZWVkYmFjayAoQ0ZCKQoJCWVuY3J5cHRfQ0ZCID0gZnVuY3Rpb24oa2V5IDogYnl0ZXMsIHBsYWluVGV4dCA6IGJ5dGVzLCBpbml0VmVjdG9yIDogYnl0ZXM/LCBzZWdtZW50U2l6ZSA6IG51bWJlcj8pCgkJCTogYnl0ZXMKCQkJbG9jYWwga20KCQkJa2V5LCBwbGFpblRleHQsIGttLCBpbml0VmVjdG9yLCBzZWdtZW50U2l6ZSA9IGluaXQoa2V5LCBwbGFpblRleHQsIGZhbHNlLCBpbml0VmVjdG9yLAoJCQkJaWYgc2VnbWVudFNpemUgPT0gbmlsIHRoZW4gMSBlbHNlIHNlZ21lbnRTaXplKQoJCQlsb2NhbCBpdiA9IGRlZXBDb3B5KGluaXRWZWN0b3IpCgkJCWxvY2FsIGIsIGssIHAsIHEsIHMsIHQgPSB7fSwge30sIGluaXRWZWN0b3IsIHt9LCB7e30sIHt9LCB7fSwge319LCB7fQoJCQlmb3IgaSA9IDEsICNwbGFpblRleHQsIHNlZ21lbnRTaXplIGRvCgkJCQl0YWJsZS5tb3ZlKHBsYWluVGV4dCwgaSwgaSArIHNlZ21lbnRTaXplIC0gMSwgMSwgaykKCQkJCXRhYmxlLm1vdmUoeG9yQnl0ZXMocSwgZW5jcnlwdChrZXksIGttLCBwLCBzLCB0KSwgayksIDEsIHNlZ21lbnRTaXplLCBpLCBiKQoJCQkJZm9yIGogPSAxNiwgc2VnbWVudFNpemUgKyAxLCAtIDEgZG8KCQkJCQl0YWJsZS5pbnNlcnQocSwgMSwgcFtqXSkKCQkJCWVuZAoJCQkJdGFibGUubW92ZShxLCAxLCAxNiwgMSwgcCkKCQkJZW5kCgkKCQkJcmV0dXJuIGIsIGl2CgkJZW5kLAoJCWRlY3J5cHRfQ0ZCID0gZnVuY3Rpb24oa2V5IDogYnl0ZXMsIGNpcGhlclRleHQgOiBieXRlcywgaW5pdFZlY3RvciA6IGJ5dGVzLCBzZWdtZW50U2l6ZSA6IG51bWJlcj8pCgkJCTogYnl0ZXMKCQkJbG9jYWwga20KCQkJa2V5LCBjaXBoZXJUZXh0LCBrbSwgaW5pdFZlY3Rvciwgc2VnbWVudFNpemUgPSBpbml0KGtleSwgY2lwaGVyVGV4dCwgZmFsc2UsIGluaXRWZWN0b3IsCgkJCQlpZiBzZWdtZW50U2l6ZSA9PSBuaWwgdGhlbiAxIGVsc2Ugc2VnbWVudFNpemUpCgkKCQkJbG9jYWwgYiwgaywgcCwgcSwgcywgdCA9IHt9LCB7fSwgaW5pdFZlY3Rvciwge30sIHt7fSwge30sIHt9LCB7fX0sIHt9CgkJCWZvciBpID0gMSwgI2NpcGhlclRleHQsIHNlZ21lbnRTaXplIGRvCgkJCQl0YWJsZS5tb3ZlKGNpcGhlclRleHQsIGksIGkgKyBzZWdtZW50U2l6ZSAtIDEsIDEsIGspCgkJCQl0YWJsZS5tb3ZlKHhvckJ5dGVzKHEsIGVuY3J5cHQoa2V5LCBrbSwgcCwgcywgdCksIGspLCAxLCBzZWdtZW50U2l6ZSwgaSwgYikKCQkJCWZvciBqID0gMTYsIHNlZ21lbnRTaXplICsgMSwgLSAxIGRvCgkJCQkJdGFibGUuaW5zZXJ0KGssIDEsIHBbal0pCgkJCQllbmQKCQkJCXRhYmxlLm1vdmUoaywgMSwgMTYsIDEsIHApCgkJCWVuZAoJCgkJCXJldHVybiBiCgkJZW5kLAoJCS0tIE91dHB1dCBmZWVkYmFjayAoT0ZCKQoJCWVuY3J5cHRfT0ZCID0gZnVuY3Rpb24oa2V5IDogYnl0ZXMsIHBsYWluVGV4dCA6IGJ5dGVzLCBpbml0VmVjdG9yIDogYnl0ZXM/KSAJCQk6IGJ5dGVzCgkJCWxvY2FsIGttCgkJCWtleSwgcGxhaW5UZXh0LCBrbSwgaW5pdFZlY3RvciA9IGluaXQoa2V5LCBwbGFpblRleHQsIGZhbHNlLCBpbml0VmVjdG9yKQoJCQlsb2NhbCBpdiA9IGRlZXBDb3B5KGluaXRWZWN0b3IpCgkJCWxvY2FsIGIsIGssIHAsIHMsIHQgPSB7fSwge30sIGluaXRWZWN0b3IsIHt7fSwge30sIHt9LCB7fX0sIHt9CgkJCWZvciBpID0gMSwgI3BsYWluVGV4dCwgMTYgZG8KCQkJCXRhYmxlLm1vdmUocGxhaW5UZXh0LCBpLCBpICsgMTUsIDEsIGspCgkJCQl0YWJsZS5tb3ZlKGVuY3J5cHQoa2V5LCBrbSwgcCwgcywgdCksIDEsIDE2LCAxLCBwKQoJCQkJdGFibGUubW92ZSh4b3JCeXRlcyh0LCBrLCBwKSwgMSwgMTYsIGksIGIpCgkJCWVuZAoJCgkJCXJldHVybiBiLCBpdgoJCWVuZCwKCQktLSBDb3VudGVyIChDVFIpCgkJZW5jcnlwdF9DVFIgPSBmdW5jdGlvbihrZXkgOiBieXRlcywgcGxhaW5UZXh0IDogYnl0ZXMsIGNvdW50ZXIgOiAoKGJ5dGVzKSAtPiBieXRlcykgfCBieXRlcyB8IHsgWwoJCQlzdHJpbmddOiBhbnkgfT8pIDogYnl0ZXMKCQkJbG9jYWwga20KCQkJa2V5LCBwbGFpblRleHQsIGttLCBjb3VudGVyID0gaW5pdChrZXksIHBsYWluVGV4dCwgdHJ1ZSwgY291bnRlcikKCQkJbG9jYWwgaXYgPSBkZWVwQ29weShjb3VudGVyKQoJCQlsb2NhbCBiLCBrLCBjLCBzLCB0LCByLCBuID0ge30sIHt9LCB7fSwge3t9LCB7fSwge30sIHt9fSwge30sIHR5cGUoY291bnRlcikgPT0gInRhYmxlIiwgbmlsCgkJCWZvciBpID0gMSwgI3BsYWluVGV4dCwgMTYgZG8KCQkJCWlmIHIgdGhlbgoJCQkJCWlmIGkgPiAxIGFuZCBpbmNCeXRlcyhjb3VudGVyLkluaXRWYWx1ZSwgY291bnRlci5MaXR0bGVFbmRpYW4pIHRoZW4KCQkJCQkJdGFibGUubW92ZShjb3VudGVyLkluaXRPdmVyZmxvdywgMSwgMTYsIDEsIGNvdW50ZXIuSW5pdFZhbHVlKQoJCQkJCWVuZAoJCQkJCXRhYmxlLmNsZWFyCShjKQoJCQkJCXRhYmxlLm1vdmUJKGNvdW50ZXIuUHJlZml4LCAxLCAjY291bnRlci5QcmVmaXgsIDEsIGMpCgkJCQkJdGFibGUubW92ZQkoY291bnRlci5Jbml0VmFsdWUsIDEsIGNvdW50ZXIuTGVuZ3RoLCAjYyArIDEsIGMpCgkJCQkJdGFibGUubW92ZQkoY291bnRlci5TdWZmaXgsIDEsICNjb3VudGVyLlN1ZmZpeCwgI2MgKyAxLCBjKQoJCQkJZWxzZQoJCQkJCW4gPSBjb252ZXJ0VHlwZShjb3VudGVyKGMsIChpICsgMTUpIC8gMTYpKQoJCQkJCWFzc2VydAkJKCNuID09IDE2LCAiQ291bnRlciBtdXN0IGJlIDE2IGJ5dGVzIGxvbmciKQoJCQkJCXRhYmxlLm1vdmUJKG4sIDEsIDE2LCAxLCBjKQoJCQkJZW5kCgkJCQl0YWJsZS5tb3ZlKHBsYWluVGV4dCwgaSwgaSArIDE1LCAxLCBrKQoJCQkJdGFibGUubW92ZSh4b3JCeXRlcyhjLCBlbmNyeXB0KGtleSwga20sIGMsIHMsIHQpLCBrKSwgMSwgMTYsIGksIGIpCgkJCWVuZAoJCgkJCXJldHVybiBiLCBpdgoJCWVuZAoJfSAtLSBSZXR1cm5zIHRoZSBsaWJyYXJ5CgkKCS0tIW5hdGl2ZQoJLS0hb3B0aW1pemUgMgoJLS0gQ3JlZGl0cyBAUmVzZWxpbQoJCglsb2NhbCBsb29rdXBWYWx1ZVRvQ2hhcmFjdGVyID0gYnVmZmVyLmNyZWF0ZSg2NCkKCWxvY2FsIGxvb2t1cENoYXJhY3RlclRvVmFsdWUgPSBidWZmZXIuY3JlYXRlKDI1NikKCQoJbG9jYWwgYWxwaGFiZXQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIKCWxvY2FsIHBhZGRpbmcgPSBzdHJpbmcuYnl0ZSgiPSIpCgkKCWZvciBpbmRleCA9IDEsIDY0IGRvCgkJbG9jYWwgdmFsdWUgPSBpbmRleCAtIDEKCQlsb2NhbCBjaGFyYWN0ZXIgPSBzdHJpbmcuYnl0ZShhbHBoYWJldCwgaW5kZXgpCgkJCgkJYnVmZmVyLndyaXRldTgobG9va3VwVmFsdWVUb0NoYXJhY3RlciwgdmFsdWUsIGNoYXJhY3RlcikKCQlidWZmZXIud3JpdGV1OChsb29rdXBDaGFyYWN0ZXJUb1ZhbHVlLCBjaGFyYWN0ZXIsIHZhbHVlKQoJZW5kCgkKCWxvY2FsIGZ1bmN0aW9uIGVuY29kZShpbnB1dDogYnVmZmVyKTogYnVmZmVyCgkJbG9jYWwgaW5wdXRMZW5ndGggPSBidWZmZXIubGVuKGlucHV0KQoJCWxvY2FsIGlucHV0Q2h1bmtzID0gbWF0aC5jZWlsKGlucHV0TGVuZ3RoIC8gMykKCQkKCQlsb2NhbCBvdXRwdXRMZW5ndGggPSBpbnB1dENodW5rcyAqIDQKCQlsb2NhbCBvdXRwdXQgPSBidWZmZXIuY3JlYXRlKG91dHB1dExlbmd0aCkKCQkKCQktLSBTaW5jZSB3ZSB1c2UgcmVhZHUzMiBhbmQgY2h1bmtzIGFyZSAzIGJ5dGVzIGxhcmdlLCB3ZSBjYW4ndCByZWFkIHRoZSBsYXN0IGNodW5rIGhlcmUKCQlmb3IgY2h1bmtJbmRleCA9IDEsIGlucHV0Q2h1bmtzIC0gMSBkbwoJCQlsb2NhbCBpbnB1dEluZGV4ID0gKGNodW5rSW5kZXggLSAxKSAqIDMKCQkJbG9jYWwgb3V0cHV0SW5kZXggPSAoY2h1bmtJbmRleCAtIDEpICogNAoJCQkKCQkJbG9jYWwgY2h1bmsgPSBiaXQzMi5ieXRlc3dhcChidWZmZXIucmVhZHUzMihpbnB1dCwgaW5wdXRJbmRleCkpCgkJCQoJCQktLSA4ICsgMjQgLSAoNiAqIGluZGV4KQoJCQlsb2NhbCB2YWx1ZTEgPSBiaXQzMi5yc2hpZnQoY2h1bmssIDI2KQoJCQlsb2NhbCB2YWx1ZTIgPSBiaXQzMi5iYW5kKGJpdDMyLnJzaGlmdChjaHVuaywgMjApLCAwYjExMTExMSkKCQkJbG9jYWwgdmFsdWUzID0gYml0MzIuYmFuZChiaXQzMi5yc2hpZnQoY2h1bmssIDE0KSwgMGIxMTExMTEpCgkJCWxvY2FsIHZhbHVlNCA9IGJpdDMyLmJhbmQoYml0MzIucnNoaWZ0KGNodW5rLCA4KSwgMGIxMTExMTEpCgkJCQoJCQlidWZmZXIud3JpdGV1OChvdXRwdXQsIG91dHB1dEluZGV4LCBidWZmZXIucmVhZHU4KGxvb2t1cFZhbHVlVG9DaGFyYWN0ZXIsIHZhbHVlMSkpCgkJCWJ1ZmZlci53cml0ZXU4KG91dHB1dCwgb3V0cHV0SW5kZXggKyAxLCBidWZmZXIucmVhZHU4KGxvb2t1cFZhbHVlVG9DaGFyYWN0ZXIsIHZhbHVlMikpCgkJCWJ1ZmZlci53cml0ZXU4KG91dHB1dCwgb3V0cHV0SW5kZXggKyAyLCBidWZmZXIucmVhZHU4KGxvb2t1cFZhbHVlVG9DaGFyYWN0ZXIsIHZhbHVlMykpCgkJCWJ1ZmZlci53cml0ZXU4KG91dHB1dCwgb3V0cHV0SW5kZXggKyAzLCBidWZmZXIucmVhZHU4KGxvb2t1cFZhbHVlVG9DaGFyYWN0ZXIsIHZhbHVlNCkpCgkJZW5kCgkJCgkJbG9jYWwgaW5wdXRSZW1haW5kZXIgPSBpbnB1dExlbmd0aCAlIDMKCQkKCQlpZiBpbnB1dFJlbWFpbmRlciA9PSAxIHRoZW4KCQkJbG9jYWwgY2h1bmsgPSBidWZmZXIucmVhZHU4KGlucHV0LCBpbnB1dExlbmd0aCAtIDEpCgkJCQoJCQlsb2NhbCB2YWx1ZTEgPSBiaXQzMi5yc2hpZnQoY2h1bmssIDIpCgkJCWxvY2FsIHZhbHVlMiA9IGJpdDMyLmJhbmQoYml0MzIubHNoaWZ0KGNodW5rLCA0KSwgMGIxMTExMTEpCgkKCQkJYnVmZmVyLndyaXRldTgob3V0cHV0LCBvdXRwdXRMZW5ndGggLSA0LCBidWZmZXIucmVhZHU4KGxvb2t1cFZhbHVlVG9DaGFyYWN0ZXIsIHZhbHVlMSkpCgkJCWJ1ZmZlci53cml0ZXU4KG91dHB1dCwgb3V0cHV0TGVuZ3RoIC0gMywgYnVmZmVyLnJlYWR1OChsb29rdXBWYWx1ZVRvQ2hhcmFjdGVyLCB2YWx1ZTIpKQoJCQlidWZmZXIud3JpdGV1OChvdXRwdXQsIG91dHB1dExlbmd0aCAtIDIsIHBhZGRpbmcpCgkJCWJ1ZmZlci53cml0ZXU4KG91dHB1dCwgb3V0cHV0TGVuZ3RoIC0gMSwgcGFkZGluZykKCQllbHNlaWYgaW5wdXRSZW1haW5kZXIgPT0gMiB0aGVuCgkJCWxvY2FsIGNodW5rID0gYml0MzIuYm9yKAoJCQkJYml0MzIubHNoaWZ0KGJ1ZmZlci5yZWFkdTgoaW5wdXQsIGlucHV0TGVuZ3RoIC0gMiksIDgpLAoJCQkJYnVmZmVyLnJlYWR1OChpbnB1dCwgaW5wdXRMZW5ndGggLSAxKQoJCQkpCgkKCQkJbG9jYWwgdmFsdWUxID0gYml0MzIucnNoaWZ0KGNodW5rLCAxMCkKCQkJbG9jYWwgdmFsdWUyID0gYml0MzIuYmFuZChiaXQzMi5yc2hpZnQoY2h1bmssIDQpLCAwYjExMTExMSkKCQkJbG9jYWwgdmFsdWUzID0gYml0MzIuYmFuZChiaXQzMi5sc2hpZnQoY2h1bmssIDIpLCAwYjExMTExMSkKCQkJCgkJCWJ1ZmZlci53cml0ZXU4KG91dHB1dCwgb3V0cHV0TGVuZ3RoIC0gNCwgYnVmZmVyLnJlYWR1OChsb29rdXBWYWx1ZVRvQ2hhcmFjdGVyLCB2YWx1ZTEpKQoJCQlidWZmZXIud3JpdGV1OChvdXRwdXQsIG91dHB1dExlbmd0aCAtIDMsIGJ1ZmZlci5yZWFkdTgobG9va3VwVmFsdWVUb0NoYXJhY3RlciwgdmFsdWUyKSkKCQkJYnVmZmVyLndyaXRldTgob3V0cHV0LCBvdXRwdXRMZW5ndGggLSAyLCBidWZmZXIucmVhZHU4KGxvb2t1cFZhbHVlVG9DaGFyYWN0ZXIsIHZhbHVlMykpCgkJCWJ1ZmZlci53cml0ZXU4KG91dHB1dCwgb3V0cHV0TGVuZ3RoIC0gMSwgcGFkZGluZykKCQllbHNlaWYgaW5wdXRSZW1haW5kZXIgPT0gMCBhbmQgaW5wdXRMZW5ndGggfj0gMCB0aGVuCgkJCWxvY2FsIGNodW5rID0gYml0MzIuYm9yKAoJCQkJYml0MzIubHNoaWZ0KGJ1ZmZlci5yZWFkdTgoaW5wdXQsIGlucHV0TGVuZ3RoIC0gMyksIDE2KSwKCQkJCWJpdDMyLmxzaGlmdChidWZmZXIucmVhZHU4KGlucHV0LCBpbnB1dExlbmd0aCAtIDIpLCA4KSwKCQkJCWJ1ZmZlci5yZWFkdTgoaW5wdXQsIGlucHV0TGVuZ3RoIC0gMSkKCQkJKQoJCgkJCWxvY2FsIHZhbHVlMSA9IGJpdDMyLnJzaGlmdChjaHVuaywgMTgpCgkJCWxvY2FsIHZhbHVlMiA9IGJpdDMyLmJhbmQoYml0MzIucnNoaWZ0KGNodW5rLCAxMiksIDBiMTExMTExKQoJCQlsb2NhbCB2YWx1ZTMgPSBiaXQzMi5iYW5kKGJpdDMyLnJzaGlmdChjaHVuaywgNiksIDBiMTExMTExKQoJCQlsb2NhbCB2YWx1ZTQgPSBiaXQzMi5iYW5kKGNodW5rLCAwYjExMTExMSkKCQoJCQlidWZmZXIud3JpdGV1OChvdXRwdXQsIG91dHB1dExlbmd0aCAtIDQsIGJ1ZmZlci5yZWFkdTgobG9va3VwVmFsdWVUb0NoYXJhY3RlciwgdmFsdWUxKSkKCQkJYnVmZmVyLndyaXRldTgob3V0cHV0LCBvdXRwdXRMZW5ndGggLSAzLCBidWZmZXIucmVhZHU4KGxvb2t1cFZhbHVlVG9DaGFyYWN0ZXIsIHZhbHVlMikpCgkJCWJ1ZmZlci53cml0ZXU4KG91dHB1dCwgb3V0cHV0TGVuZ3RoIC0gMiwgYnVmZmVyLnJlYWR1OChsb29rdXBWYWx1ZVRvQ2hhcmFjdGVyLCB2YWx1ZTMpKQoJCQlidWZmZXIud3JpdGV1OChvdXRwdXQsIG91dHB1dExlbmd0aCAtIDEsIGJ1ZmZlci5yZWFkdTgobG9va3VwVmFsdWVUb0NoYXJhY3RlciwgdmFsdWU0KSkKCQllbmQKCQkKCQlyZXR1cm4gb3V0cHV0CgllbmQKCQoJbG9jYWwgZnVuY3Rpb24gZGVjb2RlKGlucHV0OiBidWZmZXIpOiBidWZmZXIKCQlsb2NhbCBpbnB1dExlbmd0aCA9IGJ1ZmZlci5sZW4oaW5wdXQpCgkJbG9jYWwgaW5wdXRDaHVua3MgPSBtYXRoLmNlaWwoaW5wdXRMZW5ndGggLyA0KQoJCQoJCS0tIFRPRE86IFN1cHBvcnQgaW5wdXQgd2l0aG91dCBwYWRkaW5nCgkJbG9jYWwgaW5wdXRQYWRkaW5nID0gMAoJCWlmIGlucHV0TGVuZ3RoIH49IDAgdGhlbgoJCQlpZiBidWZmZXIucmVhZHU4KGlucHV0LCBpbnB1dExlbmd0aCAtIDEpID09IHBhZGRpbmcgdGhlbiBpbnB1dFBhZGRpbmcgKz0gMSBlbmQKCQkJaWYgYnVmZmVyLnJlYWR1OChpbnB1dCwgaW5wdXRMZW5ndGggLSAyKSA9PSBwYWRkaW5nIHRoZW4gaW5wdXRQYWRkaW5nICs9IDEgZW5kCgkJZW5kCgkKCQlsb2NhbCBvdXRwdXRMZW5ndGggPSBpbnB1dENodW5rcyAqIDMgLSBpbnB1dFBhZGRpbmcKCQlsb2NhbCBvdXRwdXQgPSBidWZmZXIuY3JlYXRlKG91dHB1dExlbmd0aCkKCQkKCQlmb3IgY2h1bmtJbmRleCA9IDEsIGlucHV0Q2h1bmtzIC0gMSBkbwoJCQlsb2NhbCBpbnB1dEluZGV4ID0gKGNodW5rSW5kZXggLSAxKSAqIDQKCQkJbG9jYWwgb3V0cHV0SW5kZXggPSAoY2h1bmtJbmRleCAtIDEpICogMwoJCQkKCQkJbG9jYWwgdmFsdWUxID0gYnVmZmVyLnJlYWR1OChsb29rdXBDaGFyYWN0ZXJUb1ZhbHVlLCBidWZmZXIucmVhZHU4KGlucHV0LCBpbnB1dEluZGV4KSkKCQkJbG9jYWwgdmFsdWUyID0gYnVmZmVyLnJlYWR1OChsb29rdXBDaGFyYWN0ZXJUb1ZhbHVlLCBidWZmZXIucmVhZHU4KGlucHV0LCBpbnB1dEluZGV4ICsgMSkpCgkJCWxvY2FsIHZhbHVlMyA9IGJ1ZmZlci5yZWFkdTgobG9va3VwQ2hhcmFjdGVyVG9WYWx1ZSwgYnVmZmVyLnJlYWR1OChpbnB1dCwgaW5wdXRJbmRleCArIDIpKQoJCQlsb2NhbCB2YWx1ZTQgPSBidWZmZXIucmVhZHU4KGxvb2t1cENoYXJhY3RlclRvVmFsdWUsIGJ1ZmZlci5yZWFkdTgoaW5wdXQsIGlucHV0SW5kZXggKyAzKSkKCQkJCgkJCWxvY2FsIGNodW5rID0gYml0MzIuYm9yKAoJCQkJYml0MzIubHNoaWZ0KHZhbHVlMSwgMTgpLAoJCQkJYml0MzIubHNoaWZ0KHZhbHVlMiwgMTIpLAoJCQkJYml0MzIubHNoaWZ0KHZhbHVlMywgNiksCgkJCQl2YWx1ZTQKCQkJKQoJCQkKCQkJbG9jYWwgY2hhcmFjdGVyMSA9IGJpdDMyLnJzaGlmdChjaHVuaywgMTYpCgkJCWxvY2FsIGNoYXJhY3RlcjIgPSBiaXQzMi5iYW5kKGJpdDMyLnJzaGlmdChjaHVuaywgOCksIDBiMTExMTExMTEpCgkJCWxvY2FsIGNoYXJhY3RlcjMgPSBiaXQzMi5iYW5kKGNodW5rLCAwYjExMTExMTExKQoJCQkKCQkJYnVmZmVyLndyaXRldTgob3V0cHV0LCBvdXRwdXRJbmRleCwgY2hhcmFjdGVyMSkKCQkJYnVmZmVyLndyaXRldTgob3V0cHV0LCBvdXRwdXRJbmRleCArIDEsIGNoYXJhY3RlcjIpCgkJCWJ1ZmZlci53cml0ZXU4KG91dHB1dCwgb3V0cHV0SW5kZXggKyAyLCBjaGFyYWN0ZXIzKQoJCWVuZAoJCQoJCWlmIGlucHV0TGVuZ3RoIH49IDAgdGhlbgoJCQlsb2NhbCBsYXN0SW5wdXRJbmRleCA9IChpbnB1dENodW5rcyAtIDEpICogNAoJCQlsb2NhbCBsYXN0T3V0cHV0SW5kZXggPSAoaW5wdXRDaHVua3MgLSAxKSAqIDMKCQkJCgkJCWxvY2FsIGxhc3RWYWx1ZTEgPSBidWZmZXIucmVhZHU4KGxvb2t1cENoYXJhY3RlclRvVmFsdWUsIGJ1ZmZlci5yZWFkdTgoaW5wdXQsIGxhc3RJbnB1dEluZGV4KSkKCQkJbG9jYWwgbGFzdFZhbHVlMiA9IGJ1ZmZlci5yZWFkdTgobG9va3VwQ2hhcmFjdGVyVG9WYWx1ZSwgYnVmZmVyLnJlYWR1OChpbnB1dCwgbGFzdElucHV0SW5kZXggKyAxKSkKCQkJbG9jYWwgbGFzdFZhbHVlMyA9IGJ1ZmZlci5yZWFkdTgobG9va3VwQ2hhcmFjdGVyVG9WYWx1ZSwgYnVmZmVyLnJlYWR1OChpbnB1dCwgbGFzdElucHV0SW5kZXggKyAyKSkKCQkJbG9jYWwgbGFzdFZhbHVlNCA9IGJ1ZmZlci5yZWFkdTgobG9va3VwQ2hhcmFjdGVyVG9WYWx1ZSwgYnVmZmVyLnJlYWR1OChpbnB1dCwgbGFzdElucHV0SW5kZXggKyAzKSkKCQoJCQlsb2NhbCBsYXN0Q2h1bmsgPSBiaXQzMi5ib3IoCgkJCQliaXQzMi5sc2hpZnQobGFzdFZhbHVlMSwgMTgpLAoJCQkJYml0MzIubHNoaWZ0KGxhc3RWYWx1ZTIsIDEyKSwKCQkJCWJpdDMyLmxzaGlmdChsYXN0VmFsdWUzLCA2KSwKCQkJCWxhc3RWYWx1ZTQKCQkJKQoJCQkKCQkJaWYgaW5wdXRQYWRkaW5nIDw9IDIgdGhlbgoJCQkJbG9jYWwgbGFzdENoYXJhY3RlcjEgPSBiaXQzMi5yc2hpZnQobGFzdENodW5rLCAxNikKCQkJCWJ1ZmZlci53cml0ZXU4KG91dHB1dCwgbGFzdE91dHB1dEluZGV4LCBsYXN0Q2hhcmFjdGVyMSkKCQkJCQoJCQkJaWYgaW5wdXRQYWRkaW5nIDw9IDEgdGhlbgoJCQkJCWxvY2FsIGxhc3RDaGFyYWN0ZXIyID0gYml0MzIuYmFuZChiaXQzMi5yc2hpZnQobGFzdENodW5rLCA4KSwgMGIxMTExMTExMSkKCQkJCQlidWZmZXIud3JpdGV1OChvdXRwdXQsIGxhc3RPdXRwdXRJbmRleCArIDEsIGxhc3RDaGFyYWN0ZXIyKQoJCQkJCQoJCQkJCWlmIGlucHV0UGFkZGluZyA9PSAwIHRoZW4KCQkJCQkJbG9jYWwgbGFzdENoYXJhY3RlcjMgPSBiaXQzMi5iYW5kKGxhc3RDaHVuaywgMGIxMTExMTExMSkKCQkJCQkJYnVmZmVyLndyaXRldTgob3V0cHV0LCBsYXN0T3V0cHV0SW5kZXggKyAyLCBsYXN0Q2hhcmFjdGVyMykKCQkJCQllbmQKCQkJCWVuZAoJCQllbmQKCQllbmQKCQkKCQlyZXR1cm4gb3V0cHV0CgllbmQKCQoJYmFzZTY0ID0gewoJCWVuY29kZSA9IGVuY29kZSwKCQlkZWNvZGUgPSBkZWNvZGUsCgl9CgkKCWxvY2FsIGJpdDMyX2JhbmQgPSBiaXQzMi5iYW5kIC0tIDIgYXJndW1lbnRzCglsb2NhbCBiaXQzMl9ib3IgPSBiaXQzMi5ib3IgLS0gMiBhcmd1bWVudHMKCWxvY2FsIGJpdDMyX2J4b3IgPSBiaXQzMi5ieG9yIC0tIDIuLjUgYXJndW1lbnRzCglsb2NhbCBiaXQzMl9sc2hpZnQgPSBiaXQzMi5sc2hpZnQgLS0gc2Vjb25kIGFyZ3VtZW50IGlzIGludGVnZXIgMC4uMzEKCWxvY2FsIGJpdDMyX3JzaGlmdCA9IGJpdDMyLnJzaGlmdCAtLSBzZWNvbmQgYXJndW1lbnQgaXMgaW50ZWdlciAwLi4zMQoJbG9jYWwgYml0MzJfbHJvdGF0ZSA9IGJpdDMyLmxyb3RhdGUgLS0gc2Vjb25kIGFyZ3VtZW50IGlzIGludGVnZXIgMC4uMzEKCWxvY2FsIGJpdDMyX3Jyb3RhdGUgPSBiaXQzMi5ycm90YXRlIC0tIHNlY29uZCBhcmd1bWVudCBpcyBpbnRlZ2VyIDAuLjMxCgkKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgktLSBDUkVBVElORyBPUFRJTUlaRUQgSU5ORVIgTE9PUAoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS0tIEFycmF5cyBvZiBTSEEyICJtYWdpYyBudW1iZXJzIiAoaW4gIklOVDY0IiBhbmQgIkZGSSIgYnJhbmNoZXMgIipfbG8iIGFycmF5cyBjb250YWluIDY0LWJpdCB2YWx1ZXMpCglsb2NhbCBzaGEyX0tfbG8sIHNoYTJfS19oaSwgc2hhMl9IX2xvLCBzaGEyX0hfaGksIHNoYTNfUkNfbG8sIHNoYTNfUkNfaGkgPSB7fSwge30sIHt9LCB7fSwge30sIHt9Cglsb2NhbCBzaGEyX0hfZXh0MjU2ID0gewoJCVsyMjRdID0ge307CgkJWzI1Nl0gPSBzaGEyX0hfaGk7Cgl9CgkKCWxvY2FsIHNoYTJfSF9leHQ1MTJfbG8sIHNoYTJfSF9leHQ1MTJfaGkgPSB7CgkJWzM4NF0gPSB7fTsKCQlbNTEyXSA9IHNoYTJfSF9sbzsKCX0sIHsKCQlbMzg0XSA9IHt9OwoJCVs1MTJdID0gc2hhMl9IX2hpOwoJfQoJCglsb2NhbCBtZDVfSywgbWQ1X3NoYTFfSCA9IHt9LCB7MHg2NzQ1MjMwMSwgMHhFRkNEQUI4OSwgMHg5OEJBRENGRSwgMHgxMDMyNTQ3NiwgMHhDM0QyRTFGMH0KCWxvY2FsIG1kNV9uZXh0X3NoaWZ0ID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDI4LCAyNSwgMjYsIDI3LCAwLCAwLCAxMCwgOSwgMTEsIDEyLCAwLCAxNSwgMTYsIDE3LCAxOCwgMCwgMjAsIDIyLCAyMywgMjF9Cglsb2NhbCBIRVg2NCwgWE9SNjRBNSwgbGFuZXNfaW5kZXhfYmFzZSAtLSBkZWZpbmVkIG9ubHkgZm9yIGJyYW5jaGVzIHRoYXQgaW50ZXJuYWxseSB1c2UgNjQtYml0IGludGVnZXJzOiAiSU5UNjQiIGFuZCAiRkZJIgoJbG9jYWwgY29tbW9uX1cgPSB7fSAtLSB0ZW1wb3JhcnkgdGFibGUgc2hhcmVkIGJldHdlZW4gYWxsIGNhbGN1bGF0aW9ucyAodG8gYXZvaWQgY3JlYXRpbmcgbmV3IHRlbXBvcmFyeSB0YWJsZSBldmVyeSB0aW1lKQoJbG9jYWwgS19sb19tb2R1bG8sIGhpX2ZhY3RvciwgaGlfZmFjdG9yX2tlY2NhayA9IDQyOTQ5NjcyOTYsIDAsIDAKCQoJbG9jYWwgVFdPX1BPV19ORUdfNTYgPSAyIF4gLTU2Cglsb2NhbCBUV09fUE9XX05FR18xNyA9IDIgXiAtMTcKCQoJbG9jYWwgVFdPX1BPV18yID0gMiBeIDIKCWxvY2FsIFRXT19QT1dfMyA9IDIgXiAzCglsb2NhbCBUV09fUE9XXzQgPSAyIF4gNAoJbG9jYWwgVFdPX1BPV181ID0gMiBeIDUKCWxvY2FsIFRXT19QT1dfNiA9IDIgXiA2Cglsb2NhbCBUV09fUE9XXzcgPSAyIF4gNwoJbG9jYWwgVFdPX1BPV184ID0gMiBeIDgKCWxvY2FsIFRXT19QT1dfOSA9IDIgXiA5Cglsb2NhbCBUV09fUE9XXzEwID0gMiBeIDEwCglsb2NhbCBUV09fUE9XXzExID0gMiBeIDExCglsb2NhbCBUV09fUE9XXzEyID0gMiBeIDEyCglsb2NhbCBUV09fUE9XXzEzID0gMiBeIDEzCglsb2NhbCBUV09fUE9XXzE0ID0gMiBeIDE0Cglsb2NhbCBUV09fUE9XXzE1ID0gMiBeIDE1Cglsb2NhbCBUV09fUE9XXzE2ID0gMiBeIDE2Cglsb2NhbCBUV09fUE9XXzE3ID0gMiBeIDE3Cglsb2NhbCBUV09fUE9XXzE4ID0gMiBeIDE4Cglsb2NhbCBUV09fUE9XXzE5ID0gMiBeIDE5Cglsb2NhbCBUV09fUE9XXzIwID0gMiBeIDIwCglsb2NhbCBUV09fUE9XXzIxID0gMiBeIDIxCglsb2NhbCBUV09fUE9XXzIyID0gMiBeIDIyCglsb2NhbCBUV09fUE9XXzIzID0gMiBeIDIzCglsb2NhbCBUV09fUE9XXzI0ID0gMiBeIDI0Cglsb2NhbCBUV09fUE9XXzI1ID0gMiBeIDI1Cglsb2NhbCBUV09fUE9XXzI2ID0gMiBeIDI2Cglsb2NhbCBUV09fUE9XXzI3ID0gMiBeIDI3Cglsb2NhbCBUV09fUE9XXzI4ID0gMiBeIDI4Cglsb2NhbCBUV09fUE9XXzI5ID0gMiBeIDI5Cglsb2NhbCBUV09fUE9XXzMwID0gMiBeIDMwCglsb2NhbCBUV09fUE9XXzMxID0gMiBeIDMxCglsb2NhbCBUV09fUE9XXzMyID0gMiBeIDMyCglsb2NhbCBUV09fUE9XXzQwID0gMiBeIDQwCgkKCWxvY2FsIFRXTzU2X1BPV183ID0gMjU2IF4gNwoJCgktLSBJbXBsZW1lbnRhdGlvbiBmb3IgTHVhIDUuMS81LjIgKHdpdGggb3Igd2l0aG91dCBiaXR3aXNlIGxpYnJhcnkgYXZhaWxhYmxlKQoJbG9jYWwgZnVuY3Rpb24gc2hhMjU2X2ZlZWRfNjQoSCwgc3RyLCBvZmZzLCBzaXplKQoJCS0tIG9mZnMgPj0gMCwgc2l6ZSA+PSAwLCBzaXplIGlzIG11bHRpcGxlIG9mIDY0CgkJbG9jYWwgVywgSyA9IGNvbW1vbl9XLCBzaGEyX0tfaGkKCQlsb2NhbCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBoNywgaDggPSBIWzFdLCBIWzJdLCBIWzNdLCBIWzRdLCBIWzVdLCBIWzZdLCBIWzddLCBIWzhdCgkJZm9yIHBvcyA9IG9mZnMsIG9mZnMgKyBzaXplIC0gMSwgNjQgZG8KCQkJZm9yIGogPSAxLCAxNiBkbwoJCQkJcG9zID0gcG9zICsgNAoJCQkJbG9jYWwgYSwgYiwgYywgZCA9IHN0cmluZy5ieXRlKHN0ciwgcG9zIC0gMywgcG9zKQoJCQkJV1tqXSA9ICgoYSAqIDI1NiArIGIpICogMjU2ICsgYykgKiAyNTYgKyBkCgkJCWVuZAoJCgkJCWZvciBqID0gMTcsIDY0IGRvCgkJCQlsb2NhbCBhLCBiID0gV1tqIC0gMTVdLCBXW2ogLSAyXQoJCQkJV1tqXSA9IGJpdDMyX2J4b3IoYml0MzJfcnJvdGF0ZShhLCA3KSwgYml0MzJfbHJvdGF0ZShhLCAxNCksIGJpdDMyX3JzaGlmdChhLCAzKSkgKyBiaXQzMl9ieG9yKGJpdDMyX2xyb3RhdGUoYiwgMTUpLCBiaXQzMl9scm90YXRlKGIsIDEzKSwgYml0MzJfcnNoaWZ0KGIsIDEwKSkgKyBXW2ogLSA3XSArIFdbaiAtIDE2XQoJCQllbmQKCQoJCQlsb2NhbCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoID0gaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaDcsIGg4CgkJCWZvciBqID0gMSwgNjQgZG8KCQkJCWxvY2FsIHogPSBiaXQzMl9ieG9yKGJpdDMyX3Jyb3RhdGUoZSwgNiksIGJpdDMyX3Jyb3RhdGUoZSwgMTEpLCBiaXQzMl9scm90YXRlKGUsIDcpKSArIGJpdDMyX2JhbmQoZSwgZikgKyBiaXQzMl9iYW5kKC0xIC0gZSwgZykgKyBoICsgS1tqXSArIFdbal0KCQkJCWggPSBnCgkJCQlnID0gZgoJCQkJZiA9IGUKCQkJCWUgPSB6ICsgZAoJCQkJZCA9IGMKCQkJCWMgPSBiCgkJCQliID0gYQoJCQkJYSA9IHogKyBiaXQzMl9iYW5kKGQsIGMpICsgYml0MzJfYmFuZChhLCBiaXQzMl9ieG9yKGQsIGMpKSArIGJpdDMyX2J4b3IoYml0MzJfcnJvdGF0ZShhLCAyKSwgYml0MzJfcnJvdGF0ZShhLCAxMyksIGJpdDMyX2xyb3RhdGUoYSwgMTApKQoJCQllbmQKCQoJCQloMSwgaDIsIGgzLCBoNCA9IChhICsgaDEpICUgNDI5NDk2NzI5NiwgKGIgKyBoMikgJSA0Mjk0OTY3Mjk2LCAoYyArIGgzKSAlIDQyOTQ5NjcyOTYsIChkICsgaDQpICUgNDI5NDk2NzI5NgoJCQloNSwgaDYsIGg3LCBoOCA9IChlICsgaDUpICUgNDI5NDk2NzI5NiwgKGYgKyBoNikgJSA0Mjk0OTY3Mjk2LCAoZyArIGg3KSAlIDQyOTQ5NjcyOTYsIChoICsgaDgpICUgNDI5NDk2NzI5NgoJCWVuZAoJCgkJSFsxXSwgSFsyXSwgSFszXSwgSFs0XSwgSFs1XSwgSFs2XSwgSFs3XSwgSFs4XSA9IGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIGg3LCBoOAoJZW5kCgkKCWxvY2FsIGZ1bmN0aW9uIHNoYTUxMl9mZWVkXzEyOChIX2xvLCBIX2hpLCBzdHIsIG9mZnMsIHNpemUpCgkJLS0gb2ZmcyA+PSAwLCBzaXplID49IDAsIHNpemUgaXMgbXVsdGlwbGUgb2YgMTI4CgkJLS0gVzFfaGksIFcxX2xvLCBXMl9oaSwgVzJfbG8sIC4uLiAgIFdrX2hpID0gV1syKmstMV0sIFdrX2xvID0gV1syKmtdCgkJbG9jYWwgVywgS19sbywgS19oaSA9IGNvbW1vbl9XLCBzaGEyX0tfbG8sIHNoYTJfS19oaQoJCWxvY2FsIGgxX2xvLCBoMl9sbywgaDNfbG8sIGg0X2xvLCBoNV9sbywgaDZfbG8sIGg3X2xvLCBoOF9sbyA9IEhfbG9bMV0sIEhfbG9bMl0sIEhfbG9bM10sIEhfbG9bNF0sIEhfbG9bNV0sIEhfbG9bNl0sIEhfbG9bN10sIEhfbG9bOF0KCQlsb2NhbCBoMV9oaSwgaDJfaGksIGgzX2hpLCBoNF9oaSwgaDVfaGksIGg2X2hpLCBoN19oaSwgaDhfaGkgPSBIX2hpWzFdLCBIX2hpWzJdLCBIX2hpWzNdLCBIX2hpWzRdLCBIX2hpWzVdLCBIX2hpWzZdLCBIX2hpWzddLCBIX2hpWzhdCgkJZm9yIHBvcyA9IG9mZnMsIG9mZnMgKyBzaXplIC0gMSwgMTI4IGRvCgkJCWZvciBqID0gMSwgMTYgKiAyIGRvCgkJCQlwb3MgPSBwb3MgKyA0CgkJCQlsb2NhbCBhLCBiLCBjLCBkID0gc3RyaW5nLmJ5dGUoc3RyLCBwb3MgLSAzLCBwb3MpCgkJCQlXW2pdID0gKChhICogMjU2ICsgYikgKiAyNTYgKyBjKSAqIDI1NiArIGQKCQkJZW5kCgkKCQkJZm9yIGpqID0gMzQsIDE2MCwgMiBkbwoJCQkJbG9jYWwgYV9sbywgYV9oaSwgYl9sbywgYl9oaSA9IFdbamogLSAzMF0sIFdbamogLSAzMV0sIFdbamogLSA0XSwgV1tqaiAtIDVdCgkJCQlsb2NhbCB0bXAxID0gYml0MzJfYnhvcihiaXQzMl9yc2hpZnQoYV9sbywgMSkgKyBiaXQzMl9sc2hpZnQoYV9oaSwgMzEpLCBiaXQzMl9yc2hpZnQoYV9sbywgOCkgKyBiaXQzMl9sc2hpZnQoYV9oaSwgMjQpLCBiaXQzMl9yc2hpZnQoYV9sbywgNykgKyBiaXQzMl9sc2hpZnQoYV9oaSwgMjUpKSAlIDQyOTQ5NjcyOTYgKwoJCQkJCWJpdDMyX2J4b3IoYml0MzJfcnNoaWZ0KGJfbG8sIDE5KSArIGJpdDMyX2xzaGlmdChiX2hpLCAxMyksIGJpdDMyX2xzaGlmdChiX2xvLCAzKSArIGJpdDMyX3JzaGlmdChiX2hpLCAyOSksIGJpdDMyX3JzaGlmdChiX2xvLCA2KSArIGJpdDMyX2xzaGlmdChiX2hpLCAyNikpICUgNDI5NDk2NzI5NiArCgkJCQkJV1tqaiAtIDE0XSArIFdbamogLSAzMl0KCQoJCQkJbG9jYWwgdG1wMiA9IHRtcDEgJSA0Mjk0OTY3Mjk2CgkJCQlXW2pqIC0gMV0gPSBiaXQzMl9ieG9yKGJpdDMyX3JzaGlmdChhX2hpLCAxKSArIGJpdDMyX2xzaGlmdChhX2xvLCAzMSksIGJpdDMyX3JzaGlmdChhX2hpLCA4KSArIGJpdDMyX2xzaGlmdChhX2xvLCAyNCksIGJpdDMyX3JzaGlmdChhX2hpLCA3KSkgKwoJCQkJCWJpdDMyX2J4b3IoYml0MzJfcnNoaWZ0KGJfaGksIDE5KSArIGJpdDMyX2xzaGlmdChiX2xvLCAxMyksIGJpdDMyX2xzaGlmdChiX2hpLCAzKSArIGJpdDMyX3JzaGlmdChiX2xvLCAyOSksIGJpdDMyX3JzaGlmdChiX2hpLCA2KSkgKwoJCQkJCVdbamogLSAxNV0gKyBXW2pqIC0gMzNdICsgKHRtcDEgLSB0bXAyKSAvIDQyOTQ5NjcyOTYKCQoJCQkJV1tqal0gPSB0bXAyCgkJCWVuZAoJCgkJCWxvY2FsIGFfbG8sIGJfbG8sIGNfbG8sIGRfbG8sIGVfbG8sIGZfbG8sIGdfbG8sIGhfbG8gPSBoMV9sbywgaDJfbG8sIGgzX2xvLCBoNF9sbywgaDVfbG8sIGg2X2xvLCBoN19sbywgaDhfbG8KCQkJbG9jYWwgYV9oaSwgYl9oaSwgY19oaSwgZF9oaSwgZV9oaSwgZl9oaSwgZ19oaSwgaF9oaSA9IGgxX2hpLCBoMl9oaSwgaDNfaGksIGg0X2hpLCBoNV9oaSwgaDZfaGksIGg3X2hpLCBoOF9oaQoJCQlmb3IgaiA9IDEsIDgwIGRvCgkJCQlsb2NhbCBqaiA9IDIgKiBqCgkJCQlsb2NhbCB0bXAxID0gYml0MzJfYnhvcihiaXQzMl9yc2hpZnQoZV9sbywgMTQpICsgYml0MzJfbHNoaWZ0KGVfaGksIDE4KSwgYml0MzJfcnNoaWZ0KGVfbG8sIDE4KSArIGJpdDMyX2xzaGlmdChlX2hpLCAxNCksIGJpdDMyX2xzaGlmdChlX2xvLCAyMykgKyBiaXQzMl9yc2hpZnQoZV9oaSwgOSkpICUgNDI5NDk2NzI5NiArCgkJCQkJKGJpdDMyX2JhbmQoZV9sbywgZl9sbykgKyBiaXQzMl9iYW5kKC0xIC0gZV9sbywgZ19sbykpICUgNDI5NDk2NzI5NiArCgkJCQkJaF9sbyArIEtfbG9bal0gKyBXW2pqXQoJCgkJCQlsb2NhbCB6X2xvID0gdG1wMSAlIDQyOTQ5NjcyOTYKCQkJCWxvY2FsIHpfaGkgPSBiaXQzMl9ieG9yKGJpdDMyX3JzaGlmdChlX2hpLCAxNCkgKyBiaXQzMl9sc2hpZnQoZV9sbywgMTgpLCBiaXQzMl9yc2hpZnQoZV9oaSwgMTgpICsgYml0MzJfbHNoaWZ0KGVfbG8sIDE0KSwgYml0MzJfbHNoaWZ0KGVfaGksIDIzKSArIGJpdDMyX3JzaGlmdChlX2xvLCA5KSkgKwoJCQkJCWJpdDMyX2JhbmQoZV9oaSwgZl9oaSkgKyBiaXQzMl9iYW5kKC0xIC0gZV9oaSwgZ19oaSkgKwoJCQkJCWhfaGkgKyBLX2hpW2pdICsgV1tqaiAtIDFdICsKCQkJCQkodG1wMSAtIHpfbG8pIC8gNDI5NDk2NzI5NgoJCgkJCQloX2xvID0gZ19sbwoJCQkJaF9oaSA9IGdfaGkKCQkJCWdfbG8gPSBmX2xvCgkJCQlnX2hpID0gZl9oaQoJCQkJZl9sbyA9IGVfbG8KCQkJCWZfaGkgPSBlX2hpCgkJCQl0bXAxID0gel9sbyArIGRfbG8KCQkJCWVfbG8gPSB0bXAxICUgNDI5NDk2NzI5NgoJCQkJZV9oaSA9IHpfaGkgKyBkX2hpICsgKHRtcDEgLSBlX2xvKSAvIDQyOTQ5NjcyOTYKCQkJCWRfbG8gPSBjX2xvCgkJCQlkX2hpID0gY19oaQoJCQkJY19sbyA9IGJfbG8KCQkJCWNfaGkgPSBiX2hpCgkJCQliX2xvID0gYV9sbwoJCQkJYl9oaSA9IGFfaGkKCQkJCXRtcDEgPSB6X2xvICsgKGJpdDMyX2JhbmQoZF9sbywgY19sbykgKyBiaXQzMl9iYW5kKGJfbG8sIGJpdDMyX2J4b3IoZF9sbywgY19sbykpKSAlIDQyOTQ5NjcyOTYgKyBiaXQzMl9ieG9yKGJpdDMyX3JzaGlmdChiX2xvLCAyOCkgKyBiaXQzMl9sc2hpZnQoYl9oaSwgNCksIGJpdDMyX2xzaGlmdChiX2xvLCAzMCkgKyBiaXQzMl9yc2hpZnQoYl9oaSwgMiksIGJpdDMyX2xzaGlmdChiX2xvLCAyNSkgKyBiaXQzMl9yc2hpZnQoYl9oaSwgNykpICUgNDI5NDk2NzI5NgoJCQkJYV9sbyA9IHRtcDEgJSA0Mjk0OTY3Mjk2CgkJCQlhX2hpID0gel9oaSArIChiaXQzMl9iYW5kKGRfaGksIGNfaGkpICsgYml0MzJfYmFuZChiX2hpLCBiaXQzMl9ieG9yKGRfaGksIGNfaGkpKSkgKyBiaXQzMl9ieG9yKGJpdDMyX3JzaGlmdChiX2hpLCAyOCkgKyBiaXQzMl9sc2hpZnQoYl9sbywgNCksIGJpdDMyX2xzaGlmdChiX2hpLCAzMCkgKyBiaXQzMl9yc2hpZnQoYl9sbywgMiksIGJpdDMyX2xzaGlmdChiX2hpLCAyNSkgKyBiaXQzMl9yc2hpZnQoYl9sbywgNykpICsgKHRtcDEgLSBhX2xvKSAvIDQyOTQ5NjcyOTYKCQkJZW5kCgkKCQkJYV9sbyA9IGgxX2xvICsgYV9sbwoJCQloMV9sbyA9IGFfbG8gJSA0Mjk0OTY3Mjk2CgkJCWgxX2hpID0gKGgxX2hpICsgYV9oaSArIChhX2xvIC0gaDFfbG8pIC8gNDI5NDk2NzI5NikgJSA0Mjk0OTY3Mjk2CgkJCWFfbG8gPSBoMl9sbyArIGJfbG8KCQkJaDJfbG8gPSBhX2xvICUgNDI5NDk2NzI5NgoJCQloMl9oaSA9IChoMl9oaSArIGJfaGkgKyAoYV9sbyAtIGgyX2xvKSAvIDQyOTQ5NjcyOTYpICUgNDI5NDk2NzI5NgoJCQlhX2xvID0gaDNfbG8gKyBjX2xvCgkJCWgzX2xvID0gYV9sbyAlIDQyOTQ5NjcyOTYKCQkJaDNfaGkgPSAoaDNfaGkgKyBjX2hpICsgKGFfbG8gLSBoM19sbykgLyA0Mjk0OTY3Mjk2KSAlIDQyOTQ5NjcyOTYKCQkJYV9sbyA9IGg0X2xvICsgZF9sbwoJCQloNF9sbyA9IGFfbG8gJSA0Mjk0OTY3Mjk2CgkJCWg0X2hpID0gKGg0X2hpICsgZF9oaSArIChhX2xvIC0gaDRfbG8pIC8gNDI5NDk2NzI5NikgJSA0Mjk0OTY3Mjk2CgkJCWFfbG8gPSBoNV9sbyArIGVfbG8KCQkJaDVfbG8gPSBhX2xvICUgNDI5NDk2NzI5NgoJCQloNV9oaSA9IChoNV9oaSArIGVfaGkgKyAoYV9sbyAtIGg1X2xvKSAvIDQyOTQ5NjcyOTYpICUgNDI5NDk2NzI5NgoJCQlhX2xvID0gaDZfbG8gKyBmX2xvCgkJCWg2X2xvID0gYV9sbyAlIDQyOTQ5NjcyOTYKCQkJaDZfaGkgPSAoaDZfaGkgKyBmX2hpICsgKGFfbG8gLSBoNl9sbykgLyA0Mjk0OTY3Mjk2KSAlIDQyOTQ5NjcyOTYKCQkJYV9sbyA9IGg3X2xvICsgZ19sbwoJCQloN19sbyA9IGFfbG8gJSA0Mjk0OTY3Mjk2CgkJCWg3X2hpID0gKGg3X2hpICsgZ19oaSArIChhX2xvIC0gaDdfbG8pIC8gNDI5NDk2NzI5NikgJSA0Mjk0OTY3Mjk2CgkJCWFfbG8gPSBoOF9sbyArIGhfbG8KCQkJaDhfbG8gPSBhX2xvICUgNDI5NDk2NzI5NgoJCQloOF9oaSA9IChoOF9oaSArIGhfaGkgKyAoYV9sbyAtIGg4X2xvKSAvIDQyOTQ5NjcyOTYpICUgNDI5NDk2NzI5NgoJCWVuZAoJCgkJSF9sb1sxXSwgSF9sb1syXSwgSF9sb1szXSwgSF9sb1s0XSwgSF9sb1s1XSwgSF9sb1s2XSwgSF9sb1s3XSwgSF9sb1s4XSA9IGgxX2xvLCBoMl9sbywgaDNfbG8sIGg0X2xvLCBoNV9sbywgaDZfbG8sIGg3X2xvLCBoOF9sbwoJCUhfaGlbMV0sIEhfaGlbMl0sIEhfaGlbM10sIEhfaGlbNF0sIEhfaGlbNV0sIEhfaGlbNl0sIEhfaGlbN10sIEhfaGlbOF0gPSBoMV9oaSwgaDJfaGksIGgzX2hpLCBoNF9oaSwgaDVfaGksIGg2X2hpLCBoN19oaSwgaDhfaGkKCWVuZAoJCglsb2NhbCBmdW5jdGlvbiBtZDVfZmVlZF82NChILCBzdHIsIG9mZnMsIHNpemUpCgkJLS0gb2ZmcyA+PSAwLCBzaXplID49IDAsIHNpemUgaXMgbXVsdGlwbGUgb2YgNjQKCQlsb2NhbCBXLCBLLCBtZDVfbmV4dF9zaGlmdCA9IGNvbW1vbl9XLCBtZDVfSywgbWQ1X25leHRfc2hpZnQKCQlsb2NhbCBoMSwgaDIsIGgzLCBoNCA9IEhbMV0sIEhbMl0sIEhbM10sIEhbNF0KCQlmb3IgcG9zID0gb2Zmcywgb2ZmcyArIHNpemUgLSAxLCA2NCBkbwoJCQlmb3IgaiA9IDEsIDE2IGRvCgkJCQlwb3MgPSBwb3MgKyA0CgkJCQlsb2NhbCBhLCBiLCBjLCBkID0gc3RyaW5nLmJ5dGUoc3RyLCBwb3MgLSAzLCBwb3MpCgkJCQlXW2pdID0gKChkICogMjU2ICsgYykgKiAyNTYgKyBiKSAqIDI1NiArIGEKCQkJZW5kCgkKCQkJbG9jYWwgYSwgYiwgYywgZCA9IGgxLCBoMiwgaDMsIGg0CgkJCWxvY2FsIHMgPSAyNQoJCQlmb3IgaiA9IDEsIDE2IGRvCgkJCQlsb2NhbCBGID0gYml0MzJfcnJvdGF0ZShiaXQzMl9iYW5kKGIsIGMpICsgYml0MzJfYmFuZCgtMSAtIGIsIGQpICsgYSArIEtbal0gKyBXW2pdLCBzKSArIGIKCQkJCXMgPSBtZDVfbmV4dF9zaGlmdFtzXQoJCQkJYSA9IGQKCQkJCWQgPSBjCgkJCQljID0gYgoJCQkJYiA9IEYKCQkJZW5kCgkKCQkJcyA9IDI3CgkJCWZvciBqID0gMTcsIDMyIGRvCgkJCQlsb2NhbCBGID0gYml0MzJfcnJvdGF0ZShiaXQzMl9iYW5kKGQsIGIpICsgYml0MzJfYmFuZCgtMSAtIGQsIGMpICsgYSArIEtbal0gKyBXWyg1ICogaiAtIDQpICUgMTYgKyAxXSwgcykgKyBiCgkJCQlzID0gbWQ1X25leHRfc2hpZnRbc10KCQkJCWEgPSBkCgkJCQlkID0gYwoJCQkJYyA9IGIKCQkJCWIgPSBGCgkJCWVuZAoJCgkJCXMgPSAyOAoJCQlmb3IgaiA9IDMzLCA0OCBkbwoJCQkJbG9jYWwgRiA9IGJpdDMyX3Jyb3RhdGUoYml0MzJfYnhvcihiaXQzMl9ieG9yKGIsIGMpLCBkKSArIGEgKyBLW2pdICsgV1soMyAqIGogKyAyKSAlIDE2ICsgMV0sIHMpICsgYgoJCQkJcyA9IG1kNV9uZXh0X3NoaWZ0W3NdCgkJCQlhID0gZAoJCQkJZCA9IGMKCQkJCWMgPSBiCgkJCQliID0gRgoJCQllbmQKCQoJCQlzID0gMjYKCQkJZm9yIGogPSA0OSwgNjQgZG8KCQkJCWxvY2FsIEYgPSBiaXQzMl9ycm90YXRlKGJpdDMyX2J4b3IoYywgYml0MzJfYm9yKGIsIC0xIC0gZCkpICsgYSArIEtbal0gKyBXWyhqICogNyAtIDcpICUgMTYgKyAxXSwgcykgKyBiCgkJCQlzID0gbWQ1X25leHRfc2hpZnRbc10KCQkJCWEgPSBkCgkJCQlkID0gYwoJCQkJYyA9IGIKCQkJCWIgPSBGCgkJCWVuZAoJCgkJCWgxID0gKGEgKyBoMSkgJSA0Mjk0OTY3Mjk2CgkJCWgyID0gKGIgKyBoMikgJSA0Mjk0OTY3Mjk2CgkJCWgzID0gKGMgKyBoMykgJSA0Mjk0OTY3Mjk2CgkJCWg0ID0gKGQgKyBoNCkgJSA0Mjk0OTY3Mjk2CgkJZW5kCgkKCQlIWzFdLCBIWzJdLCBIWzNdLCBIWzRdID0gaDEsIGgyLCBoMywgaDQKCWVuZAoJCglsb2NhbCBmdW5jdGlvbiBzaGExX2ZlZWRfNjQoSCwgc3RyLCBvZmZzLCBzaXplKQoJCS0tIG9mZnMgPj0gMCwgc2l6ZSA+PSAwLCBzaXplIGlzIG11bHRpcGxlIG9mIDY0CgkJbG9jYWwgVyA9IGNvbW1vbl9XCgkJbG9jYWwgaDEsIGgyLCBoMywgaDQsIGg1ID0gSFsxXSwgSFsyXSwgSFszXSwgSFs0XSwgSFs1XQoJCWZvciBwb3MgPSBvZmZzLCBvZmZzICsgc2l6ZSAtIDEsIDY0IGRvCgkJCWZvciBqID0gMSwgMTYgZG8KCQkJCXBvcyA9IHBvcyArIDQKCQkJCWxvY2FsIGEsIGIsIGMsIGQgPSBzdHJpbmcuYnl0ZShzdHIsIHBvcyAtIDMsIHBvcykKCQkJCVdbal0gPSAoKGEgKiAyNTYgKyBiKSAqIDI1NiArIGMpICogMjU2ICsgZAoJCQllbmQKCQoJCQlmb3IgaiA9IDE3LCA4MCBkbwoJCQkJV1tqXSA9IGJpdDMyX2xyb3RhdGUoYml0MzJfYnhvcihXW2ogLSAzXSwgV1tqIC0gOF0sIFdbaiAtIDE0XSwgV1tqIC0gMTZdKSwgMSkKCQkJZW5kCgkKCQkJbG9jYWwgYSwgYiwgYywgZCwgZSA9IGgxLCBoMiwgaDMsIGg0LCBoNQoJCQlmb3IgaiA9IDEsIDIwIGRvCgkJCQlsb2NhbCB6ID0gYml0MzJfbHJvdGF0ZShhLCA1KSArIGJpdDMyX2JhbmQoYiwgYykgKyBiaXQzMl9iYW5kKC0xIC0gYiwgZCkgKyAweDVBODI3OTk5ICsgV1tqXSArIGUgLS0gY29uc3RhbnQgPSBtYXRoLmZsb29yKFRXT19QT1dfMzAgKiBzcXJ0KDIpKQoJCQkJZSA9IGQKCQkJCWQgPSBjCgkJCQljID0gYml0MzJfcnJvdGF0ZShiLCAyKQoJCQkJYiA9IGEKCQkJCWEgPSB6CgkJCWVuZAoJCgkJCWZvciBqID0gMjEsIDQwIGRvCgkJCQlsb2NhbCB6ID0gYml0MzJfbHJvdGF0ZShhLCA1KSArIGJpdDMyX2J4b3IoYiwgYywgZCkgKyAweDZFRDlFQkExICsgV1tqXSArIGUgLS0gVFdPX1BPV18zMCAqIHNxcnQoMykKCQkJCWUgPSBkCgkJCQlkID0gYwoJCQkJYyA9IGJpdDMyX3Jyb3RhdGUoYiwgMikKCQkJCWIgPSBhCgkJCQlhID0gegoJCQllbmQKCQoJCQlmb3IgaiA9IDQxLCA2MCBkbwoJCQkJbG9jYWwgeiA9IGJpdDMyX2xyb3RhdGUoYSwgNSkgKyBiaXQzMl9iYW5kKGQsIGMpICsgYml0MzJfYmFuZChiLCBiaXQzMl9ieG9yKGQsIGMpKSArIDB4OEYxQkJDREMgKyBXW2pdICsgZSAtLSBUV09fUE9XXzMwICogc3FydCg1KQoJCQkJZSA9IGQKCQkJCWQgPSBjCgkJCQljID0gYml0MzJfcnJvdGF0ZShiLCAyKQoJCQkJYiA9IGEKCQkJCWEgPSB6CgkJCWVuZAoJCgkJCWZvciBqID0gNjEsIDgwIGRvCgkJCQlsb2NhbCB6ID0gYml0MzJfbHJvdGF0ZShhLCA1KSArIGJpdDMyX2J4b3IoYiwgYywgZCkgKyAweENBNjJDMUQ2ICsgV1tqXSArIGUgLS0gVFdPX1BPV18zMCAqIHNxcnQoMTApCgkJCQllID0gZAoJCQkJZCA9IGMKCQkJCWMgPSBiaXQzMl9ycm90YXRlKGIsIDIpCgkJCQliID0gYQoJCQkJYSA9IHoKCQkJZW5kCgkKCQkJaDEgPSAoYSArIGgxKSAlIDQyOTQ5NjcyOTYKCQkJaDIgPSAoYiArIGgyKSAlIDQyOTQ5NjcyOTYKCQkJaDMgPSAoYyArIGgzKSAlIDQyOTQ5NjcyOTYKCQkJaDQgPSAoZCArIGg0KSAlIDQyOTQ5NjcyOTYKCQkJaDUgPSAoZSArIGg1KSAlIDQyOTQ5NjcyOTYKCQllbmQKCQoJCUhbMV0sIEhbMl0sIEhbM10sIEhbNF0sIEhbNV0gPSBoMSwgaDIsIGgzLCBoNCwgaDUKCWVuZAoJCglsb2NhbCBmdW5jdGlvbiBrZWNjYWtfZmVlZChsYW5lc19sbywgbGFuZXNfaGksIHN0ciwgb2Zmcywgc2l6ZSwgYmxvY2tfc2l6ZV9pbl9ieXRlcykKCQktLSBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBMdWEgZnVuY3Rpb24gaGF2aW5nIDc5IGxvY2FsIHZhcmlhYmxlcyA6LSkKCQktLSBvZmZzID49IDAsIHNpemUgPj0gMCwgc2l6ZSBpcyBtdWx0aXBsZSBvZiBibG9ja19zaXplX2luX2J5dGVzLCBibG9ja19zaXplX2luX2J5dGVzIGlzIHBvc2l0aXZlIG11bHRpcGxlIG9mIDgKCQlsb2NhbCBSQ19sbywgUkNfaGkgPSBzaGEzX1JDX2xvLCBzaGEzX1JDX2hpCgkJbG9jYWwgcXdvcmRzX3F0eSA9IGJsb2NrX3NpemVfaW5fYnl0ZXMgLyA4CgkJZm9yIHBvcyA9IG9mZnMsIG9mZnMgKyBzaXplIC0gMSwgYmxvY2tfc2l6ZV9pbl9ieXRlcyBkbwoJCQlmb3IgaiA9IDEsIHF3b3Jkc19xdHkgZG8KCQkJCWxvY2FsIGEsIGIsIGMsIGQgPSBzdHJpbmcuYnl0ZShzdHIsIHBvcyArIDEsIHBvcyArIDQpCgkJCQlsYW5lc19sb1tqXSA9IGJpdDMyX2J4b3IobGFuZXNfbG9bal0sICgoZCAqIDI1NiArIGMpICogMjU2ICsgYikgKiAyNTYgKyBhKQoJCQkJcG9zID0gcG9zICsgOAoJCQkJYSwgYiwgYywgZCA9IHN0cmluZy5ieXRlKHN0ciwgcG9zIC0gMywgcG9zKQoJCQkJbGFuZXNfaGlbal0gPSBiaXQzMl9ieG9yKGxhbmVzX2hpW2pdLCAoKGQgKiAyNTYgKyBjKSAqIDI1NiArIGIpICogMjU2ICsgYSkKCQkJZW5kCgkKCQkJbG9jYWwgTDAxX2xvLCBMMDFfaGksIEwwMl9sbywgTDAyX2hpLCBMMDNfbG8sIEwwM19oaSwgTDA0X2xvLCBMMDRfaGksIEwwNV9sbywgTDA1X2hpLCBMMDZfbG8sIEwwNl9oaSwgTDA3X2xvLCBMMDdfaGksIEwwOF9sbywgTDA4X2hpLCBMMDlfbG8sIEwwOV9oaSwgTDEwX2xvLCBMMTBfaGksIEwxMV9sbywgTDExX2hpLCBMMTJfbG8sIEwxMl9oaSwgTDEzX2xvLCBMMTNfaGksIEwxNF9sbywgTDE0X2hpLCBMMTVfbG8sIEwxNV9oaSwgTDE2X2xvLCBMMTZfaGksIEwxN19sbywgTDE3X2hpLCBMMThfbG8sIEwxOF9oaSwgTDE5X2xvLCBMMTlfaGksIEwyMF9sbywgTDIwX2hpLCBMMjFfbG8sIEwyMV9oaSwgTDIyX2xvLCBMMjJfaGksIEwyM19sbywgTDIzX2hpLCBMMjRfbG8sIEwyNF9oaSwgTDI1X2xvLCBMMjVfaGkgPSBsYW5lc19sb1sxXSwgbGFuZXNfaGlbMV0sIGxhbmVzX2xvWzJdLCBsYW5lc19oaVsyXSwgbGFuZXNfbG9bM10sIGxhbmVzX2hpWzNdLCBsYW5lc19sb1s0XSwgbGFuZXNfaGlbNF0sIGxhbmVzX2xvWzVdLCBsYW5lc19oaVs1XSwgbGFuZXNfbG9bNl0sIGxhbmVzX2hpWzZdLCBsYW5lc19sb1s3XSwgbGFuZXNfaGlbN10sIGxhbmVzX2xvWzhdLCBsYW5lc19oaVs4XSwgbGFuZXNfbG9bOV0sIGxhbmVzX2hpWzldLCBsYW5lc19sb1sxMF0sIGxhbmVzX2hpWzEwXSwgbGFuZXNfbG9bMTFdLCBsYW5lc19oaVsxMV0sIGxhbmVzX2xvWzEyXSwgbGFuZXNfaGlbMTJdLCBsYW5lc19sb1sxM10sIGxhbmVzX2hpWzEzXSwgbGFuZXNfbG9bMTRdLCBsYW5lc19oaVsxNF0sIGxhbmVzX2xvWzE1XSwgbGFuZXNfaGlbMTVdLCBsYW5lc19sb1sxNl0sIGxhbmVzX2hpWzE2XSwgbGFuZXNfbG9bMTddLCBsYW5lc19oaVsxN10sIGxhbmVzX2xvWzE4XSwgbGFuZXNfaGlbMThdLCBsYW5lc19sb1sxOV0sIGxhbmVzX2hpWzE5XSwgbGFuZXNfbG9bMjBdLCBsYW5lc19oaVsyMF0sIGxhbmVzX2xvWzIxXSwgbGFuZXNfaGlbMjFdLCBsYW5lc19sb1syMl0sIGxhbmVzX2hpWzIyXSwgbGFuZXNfbG9bMjNdLCBsYW5lc19oaVsyM10sIGxhbmVzX2xvWzI0XSwgbGFuZXNfaGlbMjRdLCBsYW5lc19sb1syNV0sIGxhbmVzX2hpWzI1XQoJCgkJCWZvciByb3VuZF9pZHggPSAxLCAyNCBkbwoJCQkJbG9jYWwgQzFfbG8gPSBiaXQzMl9ieG9yKEwwMV9sbywgTDA2X2xvLCBMMTFfbG8sIEwxNl9sbywgTDIxX2xvKQoJCQkJbG9jYWwgQzFfaGkgPSBiaXQzMl9ieG9yKEwwMV9oaSwgTDA2X2hpLCBMMTFfaGksIEwxNl9oaSwgTDIxX2hpKQoJCQkJbG9jYWwgQzJfbG8gPSBiaXQzMl9ieG9yKEwwMl9sbywgTDA3X2xvLCBMMTJfbG8sIEwxN19sbywgTDIyX2xvKQoJCQkJbG9jYWwgQzJfaGkgPSBiaXQzMl9ieG9yKEwwMl9oaSwgTDA3X2hpLCBMMTJfaGksIEwxN19oaSwgTDIyX2hpKQoJCQkJbG9jYWwgQzNfbG8gPSBiaXQzMl9ieG9yKEwwM19sbywgTDA4X2xvLCBMMTNfbG8sIEwxOF9sbywgTDIzX2xvKQoJCQkJbG9jYWwgQzNfaGkgPSBiaXQzMl9ieG9yKEwwM19oaSwgTDA4X2hpLCBMMTNfaGksIEwxOF9oaSwgTDIzX2hpKQoJCQkJbG9jYWwgQzRfbG8gPSBiaXQzMl9ieG9yKEwwNF9sbywgTDA5X2xvLCBMMTRfbG8sIEwxOV9sbywgTDI0X2xvKQoJCQkJbG9jYWwgQzRfaGkgPSBiaXQzMl9ieG9yKEwwNF9oaSwgTDA5X2hpLCBMMTRfaGksIEwxOV9oaSwgTDI0X2hpKQoJCQkJbG9jYWwgQzVfbG8gPSBiaXQzMl9ieG9yKEwwNV9sbywgTDEwX2xvLCBMMTVfbG8sIEwyMF9sbywgTDI1X2xvKQoJCQkJbG9jYWwgQzVfaGkgPSBiaXQzMl9ieG9yKEwwNV9oaSwgTDEwX2hpLCBMMTVfaGksIEwyMF9oaSwgTDI1X2hpKQoJCgkJCQlsb2NhbCBEX2xvID0gYml0MzJfYnhvcihDMV9sbywgQzNfbG8gKiAyICsgKEMzX2hpICUgVFdPX1BPV18zMiAtIEMzX2hpICUgVFdPX1BPV18zMSkgLyBUV09fUE9XXzMxKQoJCQkJbG9jYWwgRF9oaSA9IGJpdDMyX2J4b3IoQzFfaGksIEMzX2hpICogMiArIChDM19sbyAlIFRXT19QT1dfMzIgLSBDM19sbyAlIFRXT19QT1dfMzEpIC8gVFdPX1BPV18zMSkKCQoJCQkJbG9jYWwgVDBfbG8gPSBiaXQzMl9ieG9yKERfbG8sIEwwMl9sbykKCQkJCWxvY2FsIFQwX2hpID0gYml0MzJfYnhvcihEX2hpLCBMMDJfaGkpCgkJCQlsb2NhbCBUMV9sbyA9IGJpdDMyX2J4b3IoRF9sbywgTDA3X2xvKQoJCQkJbG9jYWwgVDFfaGkgPSBiaXQzMl9ieG9yKERfaGksIEwwN19oaSkKCQkJCWxvY2FsIFQyX2xvID0gYml0MzJfYnhvcihEX2xvLCBMMTJfbG8pCgkJCQlsb2NhbCBUMl9oaSA9IGJpdDMyX2J4b3IoRF9oaSwgTDEyX2hpKQoJCQkJbG9jYWwgVDNfbG8gPSBiaXQzMl9ieG9yKERfbG8sIEwxN19sbykKCQkJCWxvY2FsIFQzX2hpID0gYml0MzJfYnhvcihEX2hpLCBMMTdfaGkpCgkJCQlsb2NhbCBUNF9sbyA9IGJpdDMyX2J4b3IoRF9sbywgTDIyX2xvKQoJCQkJbG9jYWwgVDRfaGkgPSBiaXQzMl9ieG9yKERfaGksIEwyMl9oaSkKCQoJCQkJTDAyX2xvID0gKFQxX2xvICUgVFdPX1BPV18zMiAtIFQxX2xvICUgVFdPX1BPV18yMCkgLyBUV09fUE9XXzIwICsgVDFfaGkgKiBUV09fUE9XXzEyCgkJCQlMMDJfaGkgPSAoVDFfaGkgJSBUV09fUE9XXzMyIC0gVDFfaGkgJSBUV09fUE9XXzIwKSAvIFRXT19QT1dfMjAgKyBUMV9sbyAqIFRXT19QT1dfMTIKCQkJCUwwN19sbyA9IChUM19sbyAlIFRXT19QT1dfMzIgLSBUM19sbyAlIFRXT19QT1dfMTkpIC8gVFdPX1BPV18xOSArIFQzX2hpICogVFdPX1BPV18xMwoJCQkJTDA3X2hpID0gKFQzX2hpICUgVFdPX1BPV18zMiAtIFQzX2hpICUgVFdPX1BPV18xOSkgLyBUV09fUE9XXzE5ICsgVDNfbG8gKiBUV09fUE9XXzEzCgkJCQlMMTJfbG8gPSBUMF9sbyAqIDIgKyAoVDBfaGkgJSBUV09fUE9XXzMyIC0gVDBfaGkgJSBUV09fUE9XXzMxKSAvIFRXT19QT1dfMzEKCQkJCUwxMl9oaSA9IFQwX2hpICogMiArIChUMF9sbyAlIFRXT19QT1dfMzIgLSBUMF9sbyAlIFRXT19QT1dfMzEpIC8gVFdPX1BPV18zMQoJCQkJTDE3X2xvID0gVDJfbG8gKiBUV09fUE9XXzEwICsgKFQyX2hpICUgVFdPX1BPV18zMiAtIFQyX2hpICUgVFdPX1BPV18yMikgLyBUV09fUE9XXzIyCgkJCQlMMTdfaGkgPSBUMl9oaSAqIFRXT19QT1dfMTAgKyAoVDJfbG8gJSBUV09fUE9XXzMyIC0gVDJfbG8gJSBUV09fUE9XXzIyKSAvIFRXT19QT1dfMjIKCQkJCUwyMl9sbyA9IFQ0X2xvICogVFdPX1BPV18yICsgKFQ0X2hpICUgVFdPX1BPV18zMiAtIFQ0X2hpICUgVFdPX1BPV18zMCkgLyBUV09fUE9XXzMwCgkJCQlMMjJfaGkgPSBUNF9oaSAqIFRXT19QT1dfMiArIChUNF9sbyAlIFRXT19QT1dfMzIgLSBUNF9sbyAlIFRXT19QT1dfMzApIC8gVFdPX1BPV18zMAoJCgkJCQlEX2xvID0gYml0MzJfYnhvcihDMl9sbywgQzRfbG8gKiAyICsgKEM0X2hpICUgVFdPX1BPV18zMiAtIEM0X2hpICUgVFdPX1BPV18zMSkgLyBUV09fUE9XXzMxKQoJCQkJRF9oaSA9IGJpdDMyX2J4b3IoQzJfaGksIEM0X2hpICogMiArIChDNF9sbyAlIFRXT19QT1dfMzIgLSBDNF9sbyAlIFRXT19QT1dfMzEpIC8gVFdPX1BPV18zMSkKCQoJCQkJVDBfbG8gPSBiaXQzMl9ieG9yKERfbG8sIEwwM19sbykKCQkJCVQwX2hpID0gYml0MzJfYnhvcihEX2hpLCBMMDNfaGkpCgkJCQlUMV9sbyA9IGJpdDMyX2J4b3IoRF9sbywgTDA4X2xvKQoJCQkJVDFfaGkgPSBiaXQzMl9ieG9yKERfaGksIEwwOF9oaSkKCQkJCVQyX2xvID0gYml0MzJfYnhvcihEX2xvLCBMMTNfbG8pCgkJCQlUMl9oaSA9IGJpdDMyX2J4b3IoRF9oaSwgTDEzX2hpKQoJCQkJVDNfbG8gPSBiaXQzMl9ieG9yKERfbG8sIEwxOF9sbykKCQkJCVQzX2hpID0gYml0MzJfYnhvcihEX2hpLCBMMThfaGkpCgkJCQlUNF9sbyA9IGJpdDMyX2J4b3IoRF9sbywgTDIzX2xvKQoJCQkJVDRfaGkgPSBiaXQzMl9ieG9yKERfaGksIEwyM19oaSkKCQoJCQkJTDAzX2xvID0gKFQyX2xvICUgVFdPX1BPV18zMiAtIFQyX2xvICUgVFdPX1BPV18yMSkgLyBUV09fUE9XXzIxICsgVDJfaGkgKiBUV09fUE9XXzExCgkJCQlMMDNfaGkgPSAoVDJfaGkgJSBUV09fUE9XXzMyIC0gVDJfaGkgJSBUV09fUE9XXzIxKSAvIFRXT19QT1dfMjEgKyBUMl9sbyAqIFRXT19QT1dfMTEKCQkJCUwwOF9sbyA9IChUNF9sbyAlIFRXT19QT1dfMzIgLSBUNF9sbyAlIFRXT19QT1dfMykgLyBUV09fUE9XXzMgKyBUNF9oaSAqIFRXT19QT1dfMjkgJSBUV09fUE9XXzMyCgkJCQlMMDhfaGkgPSAoVDRfaGkgJSBUV09fUE9XXzMyIC0gVDRfaGkgJSBUV09fUE9XXzMpIC8gVFdPX1BPV18zICsgVDRfbG8gKiBUV09fUE9XXzI5ICUgVFdPX1BPV18zMgoJCQkJTDEzX2xvID0gVDFfbG8gKiBUV09fUE9XXzYgKyAoVDFfaGkgJSBUV09fUE9XXzMyIC0gVDFfaGkgJSBUV09fUE9XXzI2KSAvIFRXT19QT1dfMjYKCQkJCUwxM19oaSA9IFQxX2hpICogVFdPX1BPV182ICsgKFQxX2xvICUgVFdPX1BPV18zMiAtIFQxX2xvICUgVFdPX1BPV18yNikgLyBUV09fUE9XXzI2CgkJCQlMMThfbG8gPSBUM19sbyAqIFRXT19QT1dfMTUgKyAoVDNfaGkgJSBUV09fUE9XXzMyIC0gVDNfaGkgJSBUV09fUE9XXzE3KSAvIFRXT19QT1dfMTcKCQkJCUwxOF9oaSA9IFQzX2hpICogVFdPX1BPV18xNSArIChUM19sbyAlIFRXT19QT1dfMzIgLSBUM19sbyAlIFRXT19QT1dfMTcpIC8gVFdPX1BPV18xNwoJCQkJTDIzX2xvID0gKFQwX2xvICUgVFdPX1BPV18zMiAtIFQwX2xvICUgVFdPX1BPV18yKSAvIFRXT19QT1dfMiArIFQwX2hpICogVFdPX1BPV18zMCAlIFRXT19QT1dfMzIKCQkJCUwyM19oaSA9IChUMF9oaSAlIFRXT19QT1dfMzIgLSBUMF9oaSAlIFRXT19QT1dfMikgLyBUV09fUE9XXzIgKyBUMF9sbyAqIFRXT19QT1dfMzAgJSBUV09fUE9XXzMyCgkKCQkJCURfbG8gPSBiaXQzMl9ieG9yKEMzX2xvLCBDNV9sbyAqIDIgKyAoQzVfaGkgJSBUV09fUE9XXzMyIC0gQzVfaGkgJSBUV09fUE9XXzMxKSAvIFRXT19QT1dfMzEpCgkJCQlEX2hpID0gYml0MzJfYnhvcihDM19oaSwgQzVfaGkgKiAyICsgKEM1X2xvICUgVFdPX1BPV18zMiAtIEM1X2xvICUgVFdPX1BPV18zMSkgLyBUV09fUE9XXzMxKQoJCgkJCQlUMF9sbyA9IGJpdDMyX2J4b3IoRF9sbywgTDA0X2xvKQoJCQkJVDBfaGkgPSBiaXQzMl9ieG9yKERfaGksIEwwNF9oaSkKCQkJCVQxX2xvID0gYml0MzJfYnhvcihEX2xvLCBMMDlfbG8pCgkJCQlUMV9oaSA9IGJpdDMyX2J4b3IoRF9oaSwgTDA5X2hpKQoJCQkJVDJfbG8gPSBiaXQzMl9ieG9yKERfbG8sIEwxNF9sbykKCQkJCVQyX2hpID0gYml0MzJfYnhvcihEX2hpLCBMMTRfaGkpCgkJCQlUM19sbyA9IGJpdDMyX2J4b3IoRF9sbywgTDE5X2xvKQoJCQkJVDNfaGkgPSBiaXQzMl9ieG9yKERfaGksIEwxOV9oaSkKCQkJCVQ0X2xvID0gYml0MzJfYnhvcihEX2xvLCBMMjRfbG8pCgkJCQlUNF9oaSA9IGJpdDMyX2J4b3IoRF9oaSwgTDI0X2hpKQoJCgkJCQlMMDRfbG8gPSBUM19sbyAqIFRXT19QT1dfMjEgJSBUV09fUE9XXzMyICsgKFQzX2hpICUgVFdPX1BPV18zMiAtIFQzX2hpICUgVFdPX1BPV18xMSkgLyBUV09fUE9XXzExCgkJCQlMMDRfaGkgPSBUM19oaSAqIFRXT19QT1dfMjEgJSBUV09fUE9XXzMyICsgKFQzX2xvICUgVFdPX1BPV18zMiAtIFQzX2xvICUgVFdPX1BPV18xMSkgLyBUV09fUE9XXzExCgkJCQlMMDlfbG8gPSBUMF9sbyAqIFRXT19QT1dfMjggJSBUV09fUE9XXzMyICsgKFQwX2hpICUgVFdPX1BPV18zMiAtIFQwX2hpICUgVFdPX1BPV180KSAvIFRXT19QT1dfNAoJCQkJTDA5X2hpID0gVDBfaGkgKiBUV09fUE9XXzI4ICUgVFdPX1BPV18zMiArIChUMF9sbyAlIFRXT19QT1dfMzIgLSBUMF9sbyAlIFRXT19QT1dfNCkgLyBUV09fUE9XXzQKCQkJCUwxNF9sbyA9IFQyX2xvICogVFdPX1BPV18yNSAlIFRXT19QT1dfMzIgKyAoVDJfaGkgJSBUV09fUE9XXzMyIC0gVDJfaGkgJSBUV09fUE9XXzcpIC8gVFdPX1BPV183CgkJCQlMMTRfaGkgPSBUMl9oaSAqIFRXT19QT1dfMjUgJSBUV09fUE9XXzMyICsgKFQyX2xvICUgVFdPX1BPV18zMiAtIFQyX2xvICUgVFdPX1BPV183KSAvIFRXT19QT1dfNwoJCQkJTDE5X2xvID0gKFQ0X2xvICUgVFdPX1BPV18zMiAtIFQ0X2xvICUgVFdPX1BPV184KSAvIFRXT19QT1dfOCArIFQ0X2hpICogVFdPX1BPV18yNCAlIFRXT19QT1dfMzIKCQkJCUwxOV9oaSA9IChUNF9oaSAlIFRXT19QT1dfMzIgLSBUNF9oaSAlIFRXT19QT1dfOCkgLyBUV09fUE9XXzggKyBUNF9sbyAqIFRXT19QT1dfMjQgJSBUV09fUE9XXzMyCgkJCQlMMjRfbG8gPSAoVDFfbG8gJSBUV09fUE9XXzMyIC0gVDFfbG8gJSBUV09fUE9XXzkpIC8gVFdPX1BPV185ICsgVDFfaGkgKiBUV09fUE9XXzIzICUgVFdPX1BPV18zMgoJCQkJTDI0X2hpID0gKFQxX2hpICUgVFdPX1BPV18zMiAtIFQxX2hpICUgVFdPX1BPV185KSAvIFRXT19QT1dfOSArIFQxX2xvICogVFdPX1BPV18yMyAlIFRXT19QT1dfMzIKCQoJCQkJRF9sbyA9IGJpdDMyX2J4b3IoQzRfbG8sIEMxX2xvICogMiArIChDMV9oaSAlIFRXT19QT1dfMzIgLSBDMV9oaSAlIFRXT19QT1dfMzEpIC8gVFdPX1BPV18zMSkKCQkJCURfaGkgPSBiaXQzMl9ieG9yKEM0X2hpLCBDMV9oaSAqIDIgKyAoQzFfbG8gJSBUV09fUE9XXzMyIC0gQzFfbG8gJSBUV09fUE9XXzMxKSAvIFRXT19QT1dfMzEpCgkKCQkJCVQwX2xvID0gYml0MzJfYnhvcihEX2xvLCBMMDVfbG8pCgkJCQlUMF9oaSA9IGJpdDMyX2J4b3IoRF9oaSwgTDA1X2hpKQoJCQkJVDFfbG8gPSBiaXQzMl9ieG9yKERfbG8sIEwxMF9sbykKCQkJCVQxX2hpID0gYml0MzJfYnhvcihEX2hpLCBMMTBfaGkpCgkJCQlUMl9sbyA9IGJpdDMyX2J4b3IoRF9sbywgTDE1X2xvKQoJCQkJVDJfaGkgPSBiaXQzMl9ieG9yKERfaGksIEwxNV9oaSkKCQkJCVQzX2xvID0gYml0MzJfYnhvcihEX2xvLCBMMjBfbG8pCgkJCQlUM19oaSA9IGJpdDMyX2J4b3IoRF9oaSwgTDIwX2hpKQoJCQkJVDRfbG8gPSBiaXQzMl9ieG9yKERfbG8sIEwyNV9sbykKCQkJCVQ0X2hpID0gYml0MzJfYnhvcihEX2hpLCBMMjVfaGkpCgkKCQkJCUwwNV9sbyA9IFQ0X2xvICogVFdPX1BPV18xNCArIChUNF9oaSAlIFRXT19QT1dfMzIgLSBUNF9oaSAlIFRXT19QT1dfMTgpIC8gVFdPX1BPV18xOAoJCQkJTDA1X2hpID0gVDRfaGkgKiBUV09fUE9XXzE0ICsgKFQ0X2xvICUgVFdPX1BPV18zMiAtIFQ0X2xvICUgVFdPX1BPV18xOCkgLyBUV09fUE9XXzE4CgkJCQlMMTBfbG8gPSBUMV9sbyAqIFRXT19QT1dfMjAgJSBUV09fUE9XXzMyICsgKFQxX2hpICUgVFdPX1BPV18zMiAtIFQxX2hpICUgVFdPX1BPV18xMikgLyBUV09fUE9XXzEyCgkJCQlMMTBfaGkgPSBUMV9oaSAqIFRXT19QT1dfMjAgJSBUV09fUE9XXzMyICsgKFQxX2xvICUgVFdPX1BPV18zMiAtIFQxX2xvICUgVFdPX1BPV18xMikgLyBUV09fUE9XXzEyCgkJCQlMMTVfbG8gPSBUM19sbyAqIFRXT19QT1dfOCArIChUM19oaSAlIFRXT19QT1dfMzIgLSBUM19oaSAlIFRXT19QT1dfMjQpIC8gVFdPX1BPV18yNAoJCQkJTDE1X2hpID0gVDNfaGkgKiBUV09fUE9XXzggKyAoVDNfbG8gJSBUV09fUE9XXzMyIC0gVDNfbG8gJSBUV09fUE9XXzI0KSAvIFRXT19QT1dfMjQKCQkJCUwyMF9sbyA9IFQwX2xvICogVFdPX1BPV18yNyAlIFRXT19QT1dfMzIgKyAoVDBfaGkgJSBUV09fUE9XXzMyIC0gVDBfaGkgJSBUV09fUE9XXzUpIC8gVFdPX1BPV181CgkJCQlMMjBfaGkgPSBUMF9oaSAqIFRXT19QT1dfMjcgJSBUV09fUE9XXzMyICsgKFQwX2xvICUgVFdPX1BPV18zMiAtIFQwX2xvICUgVFdPX1BPV181KSAvIFRXT19QT1dfNQoJCQkJTDI1X2xvID0gKFQyX2xvICUgVFdPX1BPV18zMiAtIFQyX2xvICUgVFdPX1BPV18yNSkgLyBUV09fUE9XXzI1ICsgVDJfaGkgKiBUV09fUE9XXzcKCQkJCUwyNV9oaSA9IChUMl9oaSAlIFRXT19QT1dfMzIgLSBUMl9oaSAlIFRXT19QT1dfMjUpIC8gVFdPX1BPV18yNSArIFQyX2xvICogVFdPX1BPV183CgkKCQkJCURfbG8gPSBiaXQzMl9ieG9yKEM1X2xvLCBDMl9sbyAqIDIgKyAoQzJfaGkgJSBUV09fUE9XXzMyIC0gQzJfaGkgJSBUV09fUE9XXzMxKSAvIFRXT19QT1dfMzEpCgkJCQlEX2hpID0gYml0MzJfYnhvcihDNV9oaSwgQzJfaGkgKiAyICsgKEMyX2xvICUgVFdPX1BPV18zMiAtIEMyX2xvICUgVFdPX1BPV18zMSkgLyBUV09fUE9XXzMxKQoJCgkJCQlUMV9sbyA9IGJpdDMyX2J4b3IoRF9sbywgTDA2X2xvKQoJCQkJVDFfaGkgPSBiaXQzMl9ieG9yKERfaGksIEwwNl9oaSkKCQkJCVQyX2xvID0gYml0MzJfYnhvcihEX2xvLCBMMTFfbG8pCgkJCQlUMl9oaSA9IGJpdDMyX2J4b3IoRF9oaSwgTDExX2hpKQoJCQkJVDNfbG8gPSBiaXQzMl9ieG9yKERfbG8sIEwxNl9sbykKCQkJCVQzX2hpID0gYml0MzJfYnhvcihEX2hpLCBMMTZfaGkpCgkJCQlUNF9sbyA9IGJpdDMyX2J4b3IoRF9sbywgTDIxX2xvKQoJCQkJVDRfaGkgPSBiaXQzMl9ieG9yKERfaGksIEwyMV9oaSkKCQoJCQkJTDA2X2xvID0gVDJfbG8gKiBUV09fUE9XXzMgKyAoVDJfaGkgJSBUV09fUE9XXzMyIC0gVDJfaGkgJSBUV09fUE9XXzI5KSAvIFRXT19QT1dfMjkKCQkJCUwwNl9oaSA9IFQyX2hpICogVFdPX1BPV18zICsgKFQyX2xvICUgVFdPX1BPV18zMiAtIFQyX2xvICUgVFdPX1BPV18yOSkgLyBUV09fUE9XXzI5CgkJCQlMMTFfbG8gPSBUNF9sbyAqIFRXT19QT1dfMTggKyAoVDRfaGkgJSBUV09fUE9XXzMyIC0gVDRfaGkgJSBUV09fUE9XXzE0KSAvIFRXT19QT1dfMTQKCQkJCUwxMV9oaSA9IFQ0X2hpICogVFdPX1BPV18xOCArIChUNF9sbyAlIFRXT19QT1dfMzIgLSBUNF9sbyAlIFRXT19QT1dfMTQpIC8gVFdPX1BPV18xNAoJCQkJTDE2X2xvID0gKFQxX2xvICUgVFdPX1BPV18zMiAtIFQxX2xvICUgVFdPX1BPV18yOCkgLyBUV09fUE9XXzI4ICsgVDFfaGkgKiBUV09fUE9XXzQKCQkJCUwxNl9oaSA9IChUMV9oaSAlIFRXT19QT1dfMzIgLSBUMV9oaSAlIFRXT19QT1dfMjgpIC8gVFdPX1BPV18yOCArIFQxX2xvICogVFdPX1BPV180CgkJCQlMMjFfbG8gPSAoVDNfbG8gJSBUV09fUE9XXzMyIC0gVDNfbG8gJSBUV09fUE9XXzIzKSAvIFRXT19QT1dfMjMgKyBUM19oaSAqIFRXT19QT1dfOQoJCQkJTDIxX2hpID0gKFQzX2hpICUgVFdPX1BPV18zMiAtIFQzX2hpICUgVFdPX1BPV18yMykgLyBUV09fUE9XXzIzICsgVDNfbG8gKiBUV09fUE9XXzkKCQoJCQkJTDAxX2xvID0gYml0MzJfYnhvcihEX2xvLCBMMDFfbG8pCgkJCQlMMDFfaGkgPSBiaXQzMl9ieG9yKERfaGksIEwwMV9oaSkKCQkJCUwwMV9sbywgTDAyX2xvLCBMMDNfbG8sIEwwNF9sbywgTDA1X2xvID0gYml0MzJfYnhvcihMMDFfbG8sIGJpdDMyX2JhbmQoLTEgLSBMMDJfbG8sIEwwM19sbykpLCBiaXQzMl9ieG9yKEwwMl9sbywgYml0MzJfYmFuZCgtMSAtIEwwM19sbywgTDA0X2xvKSksIGJpdDMyX2J4b3IoTDAzX2xvLCBiaXQzMl9iYW5kKC0xIC0gTDA0X2xvLCBMMDVfbG8pKSwgYml0MzJfYnhvcihMMDRfbG8sIGJpdDMyX2JhbmQoLTEgLSBMMDVfbG8sIEwwMV9sbykpLCBiaXQzMl9ieG9yKEwwNV9sbywgYml0MzJfYmFuZCgtMSAtIEwwMV9sbywgTDAyX2xvKSkKCQkJCUwwMV9oaSwgTDAyX2hpLCBMMDNfaGksIEwwNF9oaSwgTDA1X2hpID0gYml0MzJfYnhvcihMMDFfaGksIGJpdDMyX2JhbmQoLTEgLSBMMDJfaGksIEwwM19oaSkpLCBiaXQzMl9ieG9yKEwwMl9oaSwgYml0MzJfYmFuZCgtMSAtIEwwM19oaSwgTDA0X2hpKSksIGJpdDMyX2J4b3IoTDAzX2hpLCBiaXQzMl9iYW5kKC0xIC0gTDA0X2hpLCBMMDVfaGkpKSwgYml0MzJfYnhvcihMMDRfaGksIGJpdDMyX2JhbmQoLTEgLSBMMDVfaGksIEwwMV9oaSkpLCBiaXQzMl9ieG9yKEwwNV9oaSwgYml0MzJfYmFuZCgtMSAtIEwwMV9oaSwgTDAyX2hpKSkKCQkJCUwwNl9sbywgTDA3X2xvLCBMMDhfbG8sIEwwOV9sbywgTDEwX2xvID0gYml0MzJfYnhvcihMMDlfbG8sIGJpdDMyX2JhbmQoLTEgLSBMMTBfbG8sIEwwNl9sbykpLCBiaXQzMl9ieG9yKEwxMF9sbywgYml0MzJfYmFuZCgtMSAtIEwwNl9sbywgTDA3X2xvKSksIGJpdDMyX2J4b3IoTDA2X2xvLCBiaXQzMl9iYW5kKC0xIC0gTDA3X2xvLCBMMDhfbG8pKSwgYml0MzJfYnhvcihMMDdfbG8sIGJpdDMyX2JhbmQoLTEgLSBMMDhfbG8sIEwwOV9sbykpLCBiaXQzMl9ieG9yKEwwOF9sbywgYml0MzJfYmFuZCgtMSAtIEwwOV9sbywgTDEwX2xvKSkKCQkJCUwwNl9oaSwgTDA3X2hpLCBMMDhfaGksIEwwOV9oaSwgTDEwX2hpID0gYml0MzJfYnhvcihMMDlfaGksIGJpdDMyX2JhbmQoLTEgLSBMMTBfaGksIEwwNl9oaSkpLCBiaXQzMl9ieG9yKEwxMF9oaSwgYml0MzJfYmFuZCgtMSAtIEwwNl9oaSwgTDA3X2hpKSksIGJpdDMyX2J4b3IoTDA2X2hpLCBiaXQzMl9iYW5kKC0xIC0gTDA3X2hpLCBMMDhfaGkpKSwgYml0MzJfYnhvcihMMDdfaGksIGJpdDMyX2JhbmQoLTEgLSBMMDhfaGksIEwwOV9oaSkpLCBiaXQzMl9ieG9yKEwwOF9oaSwgYml0MzJfYmFuZCgtMSAtIEwwOV9oaSwgTDEwX2hpKSkKCQkJCUwxMV9sbywgTDEyX2xvLCBMMTNfbG8sIEwxNF9sbywgTDE1X2xvID0gYml0MzJfYnhvcihMMTJfbG8sIGJpdDMyX2JhbmQoLTEgLSBMMTNfbG8sIEwxNF9sbykpLCBiaXQzMl9ieG9yKEwxM19sbywgYml0MzJfYmFuZCgtMSAtIEwxNF9sbywgTDE1X2xvKSksIGJpdDMyX2J4b3IoTDE0X2xvLCBiaXQzMl9iYW5kKC0xIC0gTDE1X2xvLCBMMTFfbG8pKSwgYml0MzJfYnhvcihMMTVfbG8sIGJpdDMyX2JhbmQoLTEgLSBMMTFfbG8sIEwxMl9sbykpLCBiaXQzMl9ieG9yKEwxMV9sbywgYml0MzJfYmFuZCgtMSAtIEwxMl9sbywgTDEzX2xvKSkKCQkJCUwxMV9oaSwgTDEyX2hpLCBMMTNfaGksIEwxNF9oaSwgTDE1X2hpID0gYml0MzJfYnhvcihMMTJfaGksIGJpdDMyX2JhbmQoLTEgLSBMMTNfaGksIEwxNF9oaSkpLCBiaXQzMl9ieG9yKEwxM19oaSwgYml0MzJfYmFuZCgtMSAtIEwxNF9oaSwgTDE1X2hpKSksIGJpdDMyX2J4b3IoTDE0X2hpLCBiaXQzMl9iYW5kKC0xIC0gTDE1X2hpLCBMMTFfaGkpKSwgYml0MzJfYnhvcihMMTVfaGksIGJpdDMyX2JhbmQoLTEgLSBMMTFfaGksIEwxMl9oaSkpLCBiaXQzMl9ieG9yKEwxMV9oaSwgYml0MzJfYmFuZCgtMSAtIEwxMl9oaSwgTDEzX2hpKSkKCQkJCUwxNl9sbywgTDE3X2xvLCBMMThfbG8sIEwxOV9sbywgTDIwX2xvID0gYml0MzJfYnhvcihMMjBfbG8sIGJpdDMyX2JhbmQoLTEgLSBMMTZfbG8sIEwxN19sbykpLCBiaXQzMl9ieG9yKEwxNl9sbywgYml0MzJfYmFuZCgtMSAtIEwxN19sbywgTDE4X2xvKSksIGJpdDMyX2J4b3IoTDE3X2xvLCBiaXQzMl9iYW5kKC0xIC0gTDE4X2xvLCBMMTlfbG8pKSwgYml0MzJfYnhvcihMMThfbG8sIGJpdDMyX2JhbmQoLTEgLSBMMTlfbG8sIEwyMF9sbykpLCBiaXQzMl9ieG9yKEwxOV9sbywgYml0MzJfYmFuZCgtMSAtIEwyMF9sbywgTDE2X2xvKSkKCQkJCUwxNl9oaSwgTDE3X2hpLCBMMThfaGksIEwxOV9oaSwgTDIwX2hpID0gYml0MzJfYnhvcihMMjBfaGksIGJpdDMyX2JhbmQoLTEgLSBMMTZfaGksIEwxN19oaSkpLCBiaXQzMl9ieG9yKEwxNl9oaSwgYml0MzJfYmFuZCgtMSAtIEwxN19oaSwgTDE4X2hpKSksIGJpdDMyX2J4b3IoTDE3X2hpLCBiaXQzMl9iYW5kKC0xIC0gTDE4X2hpLCBMMTlfaGkpKSwgYml0MzJfYnhvcihMMThfaGksIGJpdDMyX2JhbmQoLTEgLSBMMTlfaGksIEwyMF9oaSkpLCBiaXQzMl9ieG9yKEwxOV9oaSwgYml0MzJfYmFuZCgtMSAtIEwyMF9oaSwgTDE2X2hpKSkKCQkJCUwyMV9sbywgTDIyX2xvLCBMMjNfbG8sIEwyNF9sbywgTDI1X2xvID0gYml0MzJfYnhvcihMMjNfbG8sIGJpdDMyX2JhbmQoLTEgLSBMMjRfbG8sIEwyNV9sbykpLCBiaXQzMl9ieG9yKEwyNF9sbywgYml0MzJfYmFuZCgtMSAtIEwyNV9sbywgTDIxX2xvKSksIGJpdDMyX2J4b3IoTDI1X2xvLCBiaXQzMl9iYW5kKC0xIC0gTDIxX2xvLCBMMjJfbG8pKSwgYml0MzJfYnhvcihMMjFfbG8sIGJpdDMyX2JhbmQoLTEgLSBMMjJfbG8sIEwyM19sbykpLCBiaXQzMl9ieG9yKEwyMl9sbywgYml0MzJfYmFuZCgtMSAtIEwyM19sbywgTDI0X2xvKSkKCQkJCUwyMV9oaSwgTDIyX2hpLCBMMjNfaGksIEwyNF9oaSwgTDI1X2hpID0gYml0MzJfYnhvcihMMjNfaGksIGJpdDMyX2JhbmQoLTEgLSBMMjRfaGksIEwyNV9oaSkpLCBiaXQzMl9ieG9yKEwyNF9oaSwgYml0MzJfYmFuZCgtMSAtIEwyNV9oaSwgTDIxX2hpKSksIGJpdDMyX2J4b3IoTDI1X2hpLCBiaXQzMl9iYW5kKC0xIC0gTDIxX2hpLCBMMjJfaGkpKSwgYml0MzJfYnhvcihMMjFfaGksIGJpdDMyX2JhbmQoLTEgLSBMMjJfaGksIEwyM19oaSkpLCBiaXQzMl9ieG9yKEwyMl9oaSwgYml0MzJfYmFuZCgtMSAtIEwyM19oaSwgTDI0X2hpKSkKCQkJCUwwMV9sbyA9IGJpdDMyX2J4b3IoTDAxX2xvLCBSQ19sb1tyb3VuZF9pZHhdKQoJCQkJTDAxX2hpID0gTDAxX2hpICsgUkNfaGlbcm91bmRfaWR4XSAtLSBSQ19oaVtdIGlzIGVpdGhlciAwIG9yIDB4ODAwMDAwMDAsIHNvIHdlIGNvdWxkIHVzZSBmYXN0IGFkZGl0aW9uIGluc3RlYWQgb2Ygc2xvdyBYT1IKCQkJZW5kCgkKCQkJbGFuZXNfbG9bMV0gPSBMMDFfbG8KCQkJbGFuZXNfaGlbMV0gPSBMMDFfaGkKCQkJbGFuZXNfbG9bMl0gPSBMMDJfbG8KCQkJbGFuZXNfaGlbMl0gPSBMMDJfaGkKCQkJbGFuZXNfbG9bM10gPSBMMDNfbG8KCQkJbGFuZXNfaGlbM10gPSBMMDNfaGkKCQkJbGFuZXNfbG9bNF0gPSBMMDRfbG8KCQkJbGFuZXNfaGlbNF0gPSBMMDRfaGkKCQkJbGFuZXNfbG9bNV0gPSBMMDVfbG8KCQkJbGFuZXNfaGlbNV0gPSBMMDVfaGkKCQkJbGFuZXNfbG9bNl0gPSBMMDZfbG8KCQkJbGFuZXNfaGlbNl0gPSBMMDZfaGkKCQkJbGFuZXNfbG9bN10gPSBMMDdfbG8KCQkJbGFuZXNfaGlbN10gPSBMMDdfaGkKCQkJbGFuZXNfbG9bOF0gPSBMMDhfbG8KCQkJbGFuZXNfaGlbOF0gPSBMMDhfaGkKCQkJbGFuZXNfbG9bOV0gPSBMMDlfbG8KCQkJbGFuZXNfaGlbOV0gPSBMMDlfaGkKCQkJbGFuZXNfbG9bMTBdID0gTDEwX2xvCgkJCWxhbmVzX2hpWzEwXSA9IEwxMF9oaQoJCQlsYW5lc19sb1sxMV0gPSBMMTFfbG8KCQkJbGFuZXNfaGlbMTFdID0gTDExX2hpCgkJCWxhbmVzX2xvWzEyXSA9IEwxMl9sbwoJCQlsYW5lc19oaVsxMl0gPSBMMTJfaGkKCQkJbGFuZXNfbG9bMTNdID0gTDEzX2xvCgkJCWxhbmVzX2hpWzEzXSA9IEwxM19oaQoJCQlsYW5lc19sb1sxNF0gPSBMMTRfbG8KCQkJbGFuZXNfaGlbMTRdID0gTDE0X2hpCgkJCWxhbmVzX2xvWzE1XSA9IEwxNV9sbwoJCQlsYW5lc19oaVsxNV0gPSBMMTVfaGkKCQkJbGFuZXNfbG9bMTZdID0gTDE2X2xvCgkJCWxhbmVzX2hpWzE2XSA9IEwxNl9oaQoJCQlsYW5lc19sb1sxN10gPSBMMTdfbG8KCQkJbGFuZXNfaGlbMTddID0gTDE3X2hpCgkJCWxhbmVzX2xvWzE4XSA9IEwxOF9sbwoJCQlsYW5lc19oaVsxOF0gPSBMMThfaGkKCQkJbGFuZXNfbG9bMTldID0gTDE5X2xvCgkJCWxhbmVzX2hpWzE5XSA9IEwxOV9oaQoJCQlsYW5lc19sb1syMF0gPSBMMjBfbG8KCQkJbGFuZXNfaGlbMjBdID0gTDIwX2hpCgkJCWxhbmVzX2xvWzIxXSA9IEwyMV9sbwoJCQlsYW5lc19oaVsyMV0gPSBMMjFfaGkKCQkJbGFuZXNfbG9bMjJdID0gTDIyX2xvCgkJCWxhbmVzX2hpWzIyXSA9IEwyMl9oaQoJCQlsYW5lc19sb1syM10gPSBMMjNfbG8KCQkJbGFuZXNfaGlbMjNdID0gTDIzX2hpCgkJCWxhbmVzX2xvWzI0XSA9IEwyNF9sbwoJCQlsYW5lc19oaVsyNF0gPSBMMjRfaGkKCQkJbGFuZXNfbG9bMjVdID0gTDI1X2xvCgkJCWxhbmVzX2hpWzI1XSA9IEwyNV9oaQoJCWVuZAoJZW5kCgkKCWRvCgkJbG9jYWwgZnVuY3Rpb24gbXVsKHNyYzEsIHNyYzIsIGZhY3RvciwgcmVzdWx0X2xlbmd0aCkKCQkJbG9jYWwgcmVzdWx0LCBjYXJyeSwgdmFsdWUsIHdlaWdodCA9IHRhYmxlLmNyZWF0ZShyZXN1bHRfbGVuZ3RoKSwgMCwgMCwgMQoJCQlmb3IgaiA9IDEsIHJlc3VsdF9sZW5ndGggZG8KCQkJCWZvciBrID0gbWF0aC5tYXgoMSwgaiArIDEgLSAjc3JjMiksIG1hdGgubWluKGosICNzcmMxKSBkbwoJCQkJCWNhcnJ5ID0gY2FycnkgKyBmYWN0b3IgKiBzcmMxW2tdICogc3JjMltqICsgMSAtIGtdIC0tICJpbnQzMiIgaXMgbm90IGVub3VnaCBmb3IgbXVsdGlwbGljYXRpb24gcmVzdWx0LCB0aGF0J3Mgd2h5ICJmYWN0b3IiIG11c3QgYmUgb2YgdHlwZSAiZG91YmxlIgoJCQkJZW5kCgkKCQkJCWxvY2FsIGRpZ2l0ID0gY2FycnkgJSBUV09fUE9XXzI0CgkJCQlyZXN1bHRbal0gPSBtYXRoLmZsb29yKGRpZ2l0KQoJCQkJY2FycnkgPSAoY2FycnkgLSBkaWdpdCkgLyBUV09fUE9XXzI0CgkJCQl2YWx1ZSA9IHZhbHVlICsgZGlnaXQgKiB3ZWlnaHQKCQkJCXdlaWdodCA9IHdlaWdodCAqIFRXT19QT1dfMjQKCQkJZW5kCgkKCQkJcmV0dXJuIHJlc3VsdCwgdmFsdWUKCQllbmQKCQoJCWxvY2FsIGlkeCwgc3RlcCwgcCwgb25lLCBzcXJ0X2hpLCBzcXJ0X2xvID0gMCwgezQsIDEsIDIsIC0yLCAyfSwgNCwgezF9LCBzaGEyX0hfaGksIHNoYTJfSF9sbwoJCXJlcGVhdAoJCQlwID0gcCArIHN0ZXBbcCAlIDZdCgkJCWxvY2FsIGQgPSAxCgkJCXJlcGVhdAoJCQkJZCA9IGQgKyBzdGVwW2QgJSA2XQoJCQkJaWYgZCAqIGQgPiBwIHRoZW4KCQkJCQktLSBuZXh0IHByaW1lIG51bWJlciBpcyBmb3VuZAoJCQkJCWxvY2FsIHJvb3QgPSBwIF4gKDEgLyAzKQoJCQkJCWxvY2FsIFIgPSByb290ICogVFdPX1BPV180MAoJCQkJCVIgPSBtdWwodGFibGUuY3JlYXRlKDEsIG1hdGguZmxvb3IoUikpLCBvbmUsIDEsIDIpCgkJCQkJbG9jYWwgXywgZGVsdGEgPSBtdWwoUiwgbXVsKFIsIFIsIDEsIDQpLCAtMSwgNCkKCQkJCQlsb2NhbCBoaSA9IFJbMl0gJSA2NTUzNiAqIDY1NTM2ICsgbWF0aC5mbG9vcihSWzFdIC8gMjU2KQoJCQkJCWxvY2FsIGxvID0gUlsxXSAlIDI1NiAqIDE2Nzc3MjE2ICsgbWF0aC5mbG9vcihkZWx0YSAqIChUV09fUE9XX05FR181NiAvIDMpICogcm9vdCAvIHApCgkKCQkJCQlpZiBpZHggPCAxNiB0aGVuCgkJCQkJCXJvb3QgPSBtYXRoLnNxcnQocCkKCQkJCQkJUiA9IHJvb3QgKiBUV09fUE9XXzQwCgkJCQkJCVIgPSBtdWwodGFibGUuY3JlYXRlKDEsIG1hdGguZmxvb3IoUikpLCBvbmUsIDEsIDIpCgkJCQkJCV8sIGRlbHRhID0gbXVsKFIsIFIsIC0xLCAyKQoJCQkJCQlsb2NhbCBoaSA9IFJbMl0gJSA2NTUzNiAqIDY1NTM2ICsgbWF0aC5mbG9vcihSWzFdIC8gMjU2KQoJCQkJCQlsb2NhbCBsbyA9IFJbMV0gJSAyNTYgKiAxNjc3NzIxNiArIG1hdGguZmxvb3IoZGVsdGEgKiBUV09fUE9XX05FR18xNyAvIHJvb3QpCgkJCQkJCWxvY2FsIGlkeCA9IGlkeCAlIDggKyAxCgkJCQkJCXNoYTJfSF9leHQyNTZbMjI0XVtpZHhdID0gbG8KCQkJCQkJc3FydF9oaVtpZHhdLCBzcXJ0X2xvW2lkeF0gPSBoaSwgbG8gKyBoaSAqIGhpX2ZhY3RvcgoJCQkJCQlpZiBpZHggPiA3IHRoZW4KCQkJCQkJCXNxcnRfaGksIHNxcnRfbG8gPSBzaGEyX0hfZXh0NTEyX2hpWzM4NF0sIHNoYTJfSF9leHQ1MTJfbG9bMzg0XQoJCQkJCQllbmQKCQkJCQllbmQKCQoJCQkJCWlkeCA9IGlkeCArIDEKCQkJCQlzaGEyX0tfaGlbaWR4XSwgc2hhMl9LX2xvW2lkeF0gPSBoaSwgbG8gJSBLX2xvX21vZHVsbyArIGhpICogaGlfZmFjdG9yCgkJCQkJYnJlYWsKCQkJCWVuZAoJCQl1bnRpbCBwICUgZCA9PSAwCgkJdW50aWwgaWR4ID4gNzkKCWVuZAoJCgktLSBDYWxjdWxhdGluZyBJVnMgZm9yIFNIQTUxMi8yMjQgYW5kIFNIQTUxMi8yNTYKCWZvciB3aWR0aCA9IDIyNCwgMjU2LCAzMiBkbwoJCWxvY2FsIEhfbG8sIEhfaGkgPSB7fSwgbmlsCgkJaWYgWE9SNjRBNSB0aGVuCgkJCWZvciBqID0gMSwgOCBkbwoJCQkJSF9sb1tqXSA9IFhPUjY0QTUoc2hhMl9IX2xvW2pdKQoJCQllbmQKCQllbHNlCgkJCUhfaGkgPSB7fQoJCQlmb3IgaiA9IDEsIDggZG8KCQkJCUhfbG9bal0gPSBiaXQzMl9ieG9yKHNoYTJfSF9sb1tqXSwgMHhBNUE1QTVBNSkgJSA0Mjk0OTY3Mjk2CgkJCQlIX2hpW2pdID0gYml0MzJfYnhvcihzaGEyX0hfaGlbal0sIDB4QTVBNUE1QTUpICUgNDI5NDk2NzI5NgoJCQllbmQKCQllbmQKCQoJCXNoYTUxMl9mZWVkXzEyOChIX2xvLCBIX2hpLCAiU0hBLTUxMi8iIC4uIHRvc3RyaW5nKHdpZHRoKSAuLiAiXDEyOCIgLi4gc3RyaW5nLnJlcCgiXDAiLCAxMTUpIC4uICJcODgiLCAwLCAxMjgpCgkJc2hhMl9IX2V4dDUxMl9sb1t3aWR0aF0gPSBIX2xvCgkJc2hhMl9IX2V4dDUxMl9oaVt3aWR0aF0gPSBIX2hpCgllbmQKCQoJLS0gQ29uc3RhbnRzIGZvciBNRDUKCWRvCgkJZm9yIGlkeCA9IDEsIDY0IGRvCgkJCS0tIHdlIGNhbid0IHVzZSBmb3JtdWxhIG1hdGguZmxvb3IoYWJzKHNpbihpZHgpKSpUV09fUE9XXzMyKSBiZWNhdXNlIGl0cyByZXN1bHQgbWF5IGJlIGJleW9uZCBpbnRlZ2VyIHJhbmdlIG9uIEx1YSBidWlsdCB3aXRoIDMyLWJpdCBpbnRlZ2VycwoJCQlsb2NhbCBoaSwgbG8gPSBtYXRoLm1vZGYobWF0aC5hYnMobWF0aC5zaW4oaWR4KSkgKiBUV09fUE9XXzE2KQoJCQltZDVfS1tpZHhdID0gaGkgKiA2NTUzNiArIG1hdGguZmxvb3IobG8gKiBUV09fUE9XXzE2KQoJCWVuZAoJZW5kCgkKCS0tIENvbnN0YW50cyBmb3IgU0hBMwoJZG8KCQlsb2NhbCBzaF9yZWcgPSAyOQoJCWxvY2FsIGZ1bmN0aW9uIG5leHRfYml0KCkKCQkJbG9jYWwgciA9IHNoX3JlZyAlIDIKCQkJc2hfcmVnID0gYml0MzJfYnhvcigoc2hfcmVnIC0gcikgLyAyLCAxNDIgKiByKQoJCQlyZXR1cm4gcgoJCWVuZAoJCgkJZm9yIGlkeCA9IDEsIDI0IGRvCgkJCWxvY2FsIGxvLCBtID0gMCwgbmlsCgkJCWZvciBfID0gMSwgNiBkbwoJCQkJbSA9IG0gYW5kIG0gKiBtICogMiBvciAxCgkJCQlsbyA9IGxvICsgbmV4dF9iaXQoKSAqIG0KCQkJZW5kCgkKCQkJbG9jYWwgaGkgPSBuZXh0X2JpdCgpICogbQoJCQlzaGEzX1JDX2hpW2lkeF0sIHNoYTNfUkNfbG9baWR4XSA9IGhpLCBsbyArIGhpICogaGlfZmFjdG9yX2tlY2NhawoJCWVuZAoJZW5kCgkKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgktLSBNQUlOIEZVTkNUSU9OUwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWxvY2FsIGZ1bmN0aW9uIHNoYTI1NmV4dCh3aWR0aCwgbWVzc2FnZSkKCQktLSBDcmVhdGUgYW4gaW5zdGFuY2UgKHByaXZhdGUgb2JqZWN0cyBmb3IgY3VycmVudCBjYWxjdWxhdGlvbikKCQlsb2NhbCBBcnJheTI1NiA9IHNoYTJfSF9leHQyNTZbd2lkdGhdIC0tICMgPT0gOAoJCWxvY2FsIGxlbmd0aCwgdGFpbCA9IDAsICIiCgkJbG9jYWwgSCA9IHRhYmxlLmNyZWF0ZSg4KQoJCUhbMV0sIEhbMl0sIEhbM10sIEhbNF0sIEhbNV0sIEhbNl0sIEhbN10sIEhbOF0gPSBBcnJheTI1NlsxXSwgQXJyYXkyNTZbMl0sIEFycmF5MjU2WzNdLCBBcnJheTI1Nls0XSwgQXJyYXkyNTZbNV0sIEFycmF5MjU2WzZdLCBBcnJheTI1Nls3XSwgQXJyYXkyNTZbOF0KCQoJCWxvY2FsIGZ1bmN0aW9uIHBhcnRpYWwobWVzc2FnZV9wYXJ0KQoJCQlpZiBtZXNzYWdlX3BhcnQgdGhlbgoJCQkJbG9jYWwgcGFydExlbmd0aCA9ICNtZXNzYWdlX3BhcnQKCQkJCWlmIHRhaWwgdGhlbgoJCQkJCWxlbmd0aCA9IGxlbmd0aCArIHBhcnRMZW5ndGgKCQkJCQlsb2NhbCBvZmZzID0gMAoJCQkJCWxvY2FsIHRhaWxMZW5ndGggPSAjdGFpbAoJCQkJCWlmIHRhaWwgfj0gIiIgYW5kIHRhaWxMZW5ndGggKyBwYXJ0TGVuZ3RoID49IDY0IHRoZW4KCQkJCQkJb2ZmcyA9IDY0IC0gdGFpbExlbmd0aAoJCQkJCQlzaGEyNTZfZmVlZF82NChILCB0YWlsIC4uIHN0cmluZy5zdWIobWVzc2FnZV9wYXJ0LCAxLCBvZmZzKSwgMCwgNjQpCgkJCQkJCXRhaWwgPSAiIgoJCQkJCWVuZAoJCgkJCQkJbG9jYWwgc2l6ZSA9IHBhcnRMZW5ndGggLSBvZmZzCgkJCQkJbG9jYWwgc2l6ZV90YWlsID0gc2l6ZSAlIDY0CgkJCQkJc2hhMjU2X2ZlZWRfNjQoSCwgbWVzc2FnZV9wYXJ0LCBvZmZzLCBzaXplIC0gc2l6ZV90YWlsKQoJCQkJCXRhaWwgPSB0YWlsIC4uIHN0cmluZy5zdWIobWVzc2FnZV9wYXJ0LCBwYXJ0TGVuZ3RoICsgMSAtIHNpemVfdGFpbCkKCQkJCQlyZXR1cm4gcGFydGlhbAoJCQkJZWxzZQoJCQkJCWVycm9yKCJBZGRpbmcgbW9yZSBjaHVua3MgaXMgbm90IGFsbG93ZWQgYWZ0ZXIgcmVjZWl2aW5nIHRoZSByZXN1bHQiLCAyKQoJCQkJZW5kCgkJCWVsc2UKCQkJCWlmIHRhaWwgdGhlbgoJCQkJCWxvY2FsIGZpbmFsX2Jsb2NrcyA9IHRhYmxlLmNyZWF0ZSgxMCkgLS17dGFpbCwgIlwxMjgiLCBzdHJpbmcucmVwKCJcMCIsICgtOSAtIGxlbmd0aCkgJSA2NCArIDEpfQoJCQkJCWZpbmFsX2Jsb2Nrc1sxXSA9IHRhaWwKCQkJCQlmaW5hbF9ibG9ja3NbMl0gPSAiXDEyOCIKCQkJCQlmaW5hbF9ibG9ja3NbM10gPSBzdHJpbmcucmVwKCJcMCIsICgtOSAtIGxlbmd0aCkgJSA2NCArIDEpCgkKCQkJCQl0YWlsID0gbmlsCgkJCQkJLS0gQXNzdW1pbmcgdXNlciBkYXRhIGxlbmd0aCBpcyBzaG9ydGVyIHRoYW4gKFRXT19QT1dfNTMpLTkgYnl0ZXMKCQkJCQktLSBBbnl3YXksIGl0IGxvb2tzIHZlcnkgdW5yZWFsaXN0aWMgdGhhdCBzb21lb25lIHdvdWxkIHNwZW5kIG1vcmUgdGhhbiBhIHllYXIgb2YgY2FsY3VsYXRpb25zIHRvIHByb2Nlc3MgVFdPX1BPV181MyBieXRlcyBvZiBkYXRhIGJ5IHVzaW5nIHRoaXMgTHVhIHNjcmlwdCA6LSkKCQkJCQktLSBUV09fUE9XXzUzIGJ5dGVzID0gVFdPX1BPV181NiBiaXRzLCBzbyAiYml0LWNvdW50ZXIiIGZpdHMgaW4gNyBieXRlcwoJCQkJCWxlbmd0aCA9IGxlbmd0aCAqICg4IC8gVFdPNTZfUE9XXzcpIC0tIGNvbnZlcnQgImJ5dGUtY291bnRlciIgdG8gImJpdC1jb3VudGVyIiBhbmQgbW92ZSBkZWNpbWFsIHBvaW50IHRvIHRoZSBsZWZ0CgkJCQkJZm9yIGogPSA0LCAxMCBkbwoJCQkJCQlsZW5ndGggPSBsZW5ndGggJSAxICogMjU2CgkJCQkJCWZpbmFsX2Jsb2Nrc1tqXSA9IHN0cmluZy5jaGFyKG1hdGguZmxvb3IobGVuZ3RoKSkKCQkJCQllbmQKCQoJCQkJCWZpbmFsX2Jsb2NrcyA9IHRhYmxlLmNvbmNhdChmaW5hbF9ibG9ja3MpCgkJCQkJc2hhMjU2X2ZlZWRfNjQoSCwgZmluYWxfYmxvY2tzLCAwLCAjZmluYWxfYmxvY2tzKQoJCQkJCWxvY2FsIG1heF9yZWcgPSB3aWR0aCAvIDMyCgkJCQkJZm9yIGogPSAxLCBtYXhfcmVnIGRvCgkJCQkJCUhbal0gPSBzdHJpbmcuZm9ybWF0KCIlMDh4IiwgSFtqXSAlIDQyOTQ5NjcyOTYpCgkJCQkJZW5kCgkKCQkJCQlIID0gdGFibGUuY29uY2F0KEgsICIiLCAxLCBtYXhfcmVnKQoJCQkJZW5kCgkKCQkJCXJldHVybiBICgkJCWVuZAoJCWVuZAoJCgkJaWYgbWVzc2FnZSB0aGVuCgkJCS0tIEFjdHVhbGx5IHBlcmZvcm0gY2FsY3VsYXRpb25zIGFuZCByZXR1cm4gdGhlIFNIQTI1NiBkaWdlc3Qgb2YgYSBtZXNzYWdlCgkJCXJldHVybiBwYXJ0aWFsKG1lc3NhZ2UpKCkKCQllbHNlCgkJCS0tIFJldHVybiBmdW5jdGlvbiBmb3IgY2h1bmstYnktY2h1bmsgbG9hZGluZwoJCQktLSBVc2VyIHNob3VsZCBmZWVkIGV2ZXJ5IGNodW5rIG9mIGlucHV0IGRhdGEgYXMgc2luZ2xlIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24gYW5kIGZpbmFsbHkgZ2V0IFNIQTI1NiBkaWdlc3QgYnkgaW52b2tpbmcgdGhpcyBmdW5jdGlvbiB3aXRob3V0IGFuIGFyZ3VtZW50CgkJCXJldHVybiBwYXJ0aWFsCgkJZW5kCgllbmQKCQoJbG9jYWwgZnVuY3Rpb24gc2hhNTEyZXh0KHdpZHRoLCBtZXNzYWdlKQoJCgkJLS0gQ3JlYXRlIGFuIGluc3RhbmNlIChwcml2YXRlIG9iamVjdHMgZm9yIGN1cnJlbnQgY2FsY3VsYXRpb24pCgkJbG9jYWwgbGVuZ3RoLCB0YWlsLCBIX2xvLCBIX2hpID0gMCwgIiIsIHRhYmxlLnBhY2sodGFibGUudW5wYWNrKHNoYTJfSF9leHQ1MTJfbG9bd2lkdGhdKSksIG5vdCBIRVg2NCBhbmQgdGFibGUucGFjayh0YWJsZS51bnBhY2soc2hhMl9IX2V4dDUxMl9oaVt3aWR0aF0pKQoJCgkJbG9jYWwgZnVuY3Rpb24gcGFydGlhbChtZXNzYWdlX3BhcnQpCgkJCWlmIG1lc3NhZ2VfcGFydCB0aGVuCgkJCQlsb2NhbCBwYXJ0TGVuZ3RoID0gI21lc3NhZ2VfcGFydAoJCQkJaWYgdGFpbCB0aGVuCgkJCQkJbGVuZ3RoID0gbGVuZ3RoICsgcGFydExlbmd0aAoJCQkJCWxvY2FsIG9mZnMgPSAwCgkJCQkJaWYgdGFpbCB+PSAiIiBhbmQgI3RhaWwgKyBwYXJ0TGVuZ3RoID49IDEyOCB0aGVuCgkJCQkJCW9mZnMgPSAxMjggLSAjdGFpbAoJCQkJCQlzaGE1MTJfZmVlZF8xMjgoSF9sbywgSF9oaSwgdGFpbCAuLiBzdHJpbmcuc3ViKG1lc3NhZ2VfcGFydCwgMSwgb2ZmcyksIDAsIDEyOCkKCQkJCQkJdGFpbCA9ICIiCgkJCQkJZW5kCgkKCQkJCQlsb2NhbCBzaXplID0gcGFydExlbmd0aCAtIG9mZnMKCQkJCQlsb2NhbCBzaXplX3RhaWwgPSBzaXplICUgMTI4CgkJCQkJc2hhNTEyX2ZlZWRfMTI4KEhfbG8sIEhfaGksIG1lc3NhZ2VfcGFydCwgb2Zmcywgc2l6ZSAtIHNpemVfdGFpbCkKCQkJCQl0YWlsID0gdGFpbCAuLiBzdHJpbmcuc3ViKG1lc3NhZ2VfcGFydCwgcGFydExlbmd0aCArIDEgLSBzaXplX3RhaWwpCgkJCQkJcmV0dXJuIHBhcnRpYWwKCQkJCWVsc2UKCQkJCQllcnJvcigiQWRkaW5nIG1vcmUgY2h1bmtzIGlzIG5vdCBhbGxvd2VkIGFmdGVyIHJlY2VpdmluZyB0aGUgcmVzdWx0IiwgMikKCQkJCWVuZAoJCQllbHNlCgkJCQlpZiB0YWlsIHRoZW4KCQkJCQlsb2NhbCBmaW5hbF9ibG9ja3MgPSB0YWJsZS5jcmVhdGUoMykgLS17dGFpbCwgIlwxMjgiLCBzdHJpbmcucmVwKCJcMCIsICgtMTctbGVuZ3RoKSAlIDEyOCArIDkpfQoJCQkJCWZpbmFsX2Jsb2Nrc1sxXSA9IHRhaWwKCQkJCQlmaW5hbF9ibG9ja3NbMl0gPSAiXDEyOCIKCQkJCQlmaW5hbF9ibG9ja3NbM10gPSBzdHJpbmcucmVwKCJcMCIsICgtMTcgLSBsZW5ndGgpICUgMTI4ICsgOSkKCQoJCQkJCXRhaWwgPSBuaWwKCQkJCQktLSBBc3N1bWluZyB1c2VyIGRhdGEgbGVuZ3RoIGlzIHNob3J0ZXIgdGhhbiAoVFdPX1BPV181MyktMTcgYnl0ZXMKCQkJCQktLSBUV09fUE9XXzUzIGJ5dGVzID0gVFdPX1BPV181NiBiaXRzLCBzbyAiYml0LWNvdW50ZXIiIGZpdHMgaW4gNyBieXRlcwoJCQkJCWxlbmd0aCA9IGxlbmd0aCAqICg4IC8gVFdPNTZfUE9XXzcpIC0tIGNvbnZlcnQgImJ5dGUtY291bnRlciIgdG8gImJpdC1jb3VudGVyIiBhbmQgbW92ZSBmbG9hdGluZyBwb2ludCB0byB0aGUgbGVmdAoJCQkJCWZvciBqID0gNCwgMTAgZG8KCQkJCQkJbGVuZ3RoID0gbGVuZ3RoICUgMSAqIDI1NgoJCQkJCQlmaW5hbF9ibG9ja3Nbal0gPSBzdHJpbmcuY2hhcihtYXRoLmZsb29yKGxlbmd0aCkpCgkJCQkJZW5kCgkKCQkJCQlmaW5hbF9ibG9ja3MgPSB0YWJsZS5jb25jYXQoZmluYWxfYmxvY2tzKQoJCQkJCXNoYTUxMl9mZWVkXzEyOChIX2xvLCBIX2hpLCBmaW5hbF9ibG9ja3MsIDAsICNmaW5hbF9ibG9ja3MpCgkJCQkJbG9jYWwgbWF4X3JlZyA9IG1hdGguY2VpbCh3aWR0aCAvIDY0KQoJCgkJCQkJaWYgSEVYNjQgdGhlbgoJCQkJCQlmb3IgaiA9IDEsIG1heF9yZWcgZG8KCQkJCQkJCUhfbG9bal0gPSBIRVg2NChIX2xvW2pdKQoJCQkJCQllbmQKCQkJCQllbHNlCgkJCQkJCWZvciBqID0gMSwgbWF4X3JlZyBkbwoJCQkJCQkJSF9sb1tqXSA9IHN0cmluZy5mb3JtYXQoIiUwOHgiLCBIX2hpW2pdICUgNDI5NDk2NzI5NikgLi4gc3RyaW5nLmZvcm1hdCgiJTA4eCIsIEhfbG9bal0gJSA0Mjk0OTY3Mjk2KQoJCQkJCQllbmQKCQoJCQkJCQlIX2hpID0gbmlsCgkJCQkJZW5kCgkKCQkJCQlIX2xvID0gc3RyaW5nLnN1Yih0YWJsZS5jb25jYXQoSF9sbywgIiIsIDEsIG1heF9yZWcpLCAxLCB3aWR0aCAvIDQpCgkJCQllbmQKCQoJCQkJcmV0dXJuIEhfbG8KCQkJZW5kCgkJZW5kCgkKCQlpZiBtZXNzYWdlIHRoZW4KCQkJLS0gQWN0dWFsbHkgcGVyZm9ybSBjYWxjdWxhdGlvbnMgYW5kIHJldHVybiB0aGUgU0hBNTEyIGRpZ2VzdCBvZiBhIG1lc3NhZ2UKCQkJcmV0dXJuIHBhcnRpYWwobWVzc2FnZSkoKQoJCWVsc2UKCQkJLS0gUmV0dXJuIGZ1bmN0aW9uIGZvciBjaHVuay1ieS1jaHVuayBsb2FkaW5nCgkJCS0tIFVzZXIgc2hvdWxkIGZlZWQgZXZlcnkgY2h1bmsgb2YgaW5wdXQgZGF0YSBhcyBzaW5nbGUgYXJndW1lbnQgdG8gdGhpcyBmdW5jdGlvbiBhbmQgZmluYWxseSBnZXQgU0hBNTEyIGRpZ2VzdCBieSBpbnZva2luZyB0aGlzIGZ1bmN0aW9uIHdpdGhvdXQgYW4gYXJndW1lbnQKCQkJcmV0dXJuIHBhcnRpYWwKCQllbmQKCWVuZAoJCglsb2NhbCBmdW5jdGlvbiBtZDUobWVzc2FnZSkKCQoJCS0tIENyZWF0ZSBhbiBpbnN0YW5jZSAocHJpdmF0ZSBvYmplY3RzIGZvciBjdXJyZW50IGNhbGN1bGF0aW9uKQoJCWxvY2FsIEgsIGxlbmd0aCwgdGFpbCA9IHRhYmxlLmNyZWF0ZSg0KSwgMCwgIiIKCQlIWzFdLCBIWzJdLCBIWzNdLCBIWzRdID0gbWQ1X3NoYTFfSFsxXSwgbWQ1X3NoYTFfSFsyXSwgbWQ1X3NoYTFfSFszXSwgbWQ1X3NoYTFfSFs0XQoJCgkJbG9jYWwgZnVuY3Rpb24gcGFydGlhbChtZXNzYWdlX3BhcnQpCgkJCWlmIG1lc3NhZ2VfcGFydCB0aGVuCgkJCQlsb2NhbCBwYXJ0TGVuZ3RoID0gI21lc3NhZ2VfcGFydAoJCQkJaWYgdGFpbCB0aGVuCgkJCQkJbGVuZ3RoID0gbGVuZ3RoICsgcGFydExlbmd0aAoJCQkJCWxvY2FsIG9mZnMgPSAwCgkJCQkJaWYgdGFpbCB+PSAiIiBhbmQgI3RhaWwgKyBwYXJ0TGVuZ3RoID49IDY0IHRoZW4KCQkJCQkJb2ZmcyA9IDY0IC0gI3RhaWwKCQkJCQkJbWQ1X2ZlZWRfNjQoSCwgdGFpbCAuLiBzdHJpbmcuc3ViKG1lc3NhZ2VfcGFydCwgMSwgb2ZmcyksIDAsIDY0KQoJCQkJCQl0YWlsID0gIiIKCQkJCQllbmQKCQoJCQkJCWxvY2FsIHNpemUgPSBwYXJ0TGVuZ3RoIC0gb2ZmcwoJCQkJCWxvY2FsIHNpemVfdGFpbCA9IHNpemUgJSA2NAoJCQkJCW1kNV9mZWVkXzY0KEgsIG1lc3NhZ2VfcGFydCwgb2Zmcywgc2l6ZSAtIHNpemVfdGFpbCkKCQkJCQl0YWlsID0gdGFpbCAuLiBzdHJpbmcuc3ViKG1lc3NhZ2VfcGFydCwgcGFydExlbmd0aCArIDEgLSBzaXplX3RhaWwpCgkJCQkJcmV0dXJuIHBhcnRpYWwKCQkJCWVsc2UKCQkJCQllcnJvcigiQWRkaW5nIG1vcmUgY2h1bmtzIGlzIG5vdCBhbGxvd2VkIGFmdGVyIHJlY2VpdmluZyB0aGUgcmVzdWx0IiwgMikKCQkJCWVuZAoJCQllbHNlCgkJCQlpZiB0YWlsIHRoZW4KCQkJCQlsb2NhbCBmaW5hbF9ibG9ja3MgPSB0YWJsZS5jcmVhdGUoMykgLS17dGFpbCwgIlwxMjgiLCBzdHJpbmcucmVwKCJcMCIsICgtOSAtIGxlbmd0aCkgJSA2NCl9CgkJCQkJZmluYWxfYmxvY2tzWzFdID0gdGFpbAoJCQkJCWZpbmFsX2Jsb2Nrc1syXSA9ICJcMTI4IgoJCQkJCWZpbmFsX2Jsb2Nrc1szXSA9IHN0cmluZy5yZXAoIlwwIiwgKC05IC0gbGVuZ3RoKSAlIDY0KQoJCQkJCXRhaWwgPSBuaWwKCQkJCQlsZW5ndGggPSBsZW5ndGggKiA4IC0tIGNvbnZlcnQgImJ5dGUtY291bnRlciIgdG8gImJpdC1jb3VudGVyIgoJCQkJCWZvciBqID0gNCwgMTEgZG8KCQkJCQkJbG9jYWwgbG93X2J5dGUgPSBsZW5ndGggJSAyNTYKCQkJCQkJZmluYWxfYmxvY2tzW2pdID0gc3RyaW5nLmNoYXIobG93X2J5dGUpCgkJCQkJCWxlbmd0aCA9IChsZW5ndGggLSBsb3dfYnl0ZSkgLyAyNTYKCQkJCQllbmQKCQoJCQkJCWZpbmFsX2Jsb2NrcyA9IHRhYmxlLmNvbmNhdChmaW5hbF9ibG9ja3MpCgkJCQkJbWQ1X2ZlZWRfNjQoSCwgZmluYWxfYmxvY2tzLCAwLCAjZmluYWxfYmxvY2tzKQoJCQkJCWZvciBqID0gMSwgNCBkbwoJCQkJCQlIW2pdID0gc3RyaW5nLmZvcm1hdCgiJTA4eCIsIEhbal0gJSA0Mjk0OTY3Mjk2KQoJCQkJCWVuZAoJCgkJCQkJSCA9IHN0cmluZy5nc3ViKHRhYmxlLmNvbmNhdChIKSwgIiguLikoLi4pKC4uKSguLikiLCAiJTQlMyUyJTEiKQoJCQkJZW5kCgkKCQkJCXJldHVybiBICgkJCWVuZAoJCWVuZAoJCgkJaWYgbWVzc2FnZSB0aGVuCgkJCS0tIEFjdHVhbGx5IHBlcmZvcm0gY2FsY3VsYXRpb25zIGFuZCByZXR1cm4gdGhlIE1ENSBkaWdlc3Qgb2YgYSBtZXNzYWdlCgkJCXJldHVybiBwYXJ0aWFsKG1lc3NhZ2UpKCkKCQllbHNlCgkJCS0tIFJldHVybiBmdW5jdGlvbiBmb3IgY2h1bmstYnktY2h1bmsgbG9hZGluZwoJCQktLSBVc2VyIHNob3VsZCBmZWVkIGV2ZXJ5IGNodW5rIG9mIGlucHV0IGRhdGEgYXMgc2luZ2xlIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24gYW5kIGZpbmFsbHkgZ2V0IE1ENSBkaWdlc3QgYnkgaW52b2tpbmcgdGhpcyBmdW5jdGlvbiB3aXRob3V0IGFuIGFyZ3VtZW50CgkJCXJldHVybiBwYXJ0aWFsCgkJZW5kCgllbmQKCQoJbG9jYWwgZnVuY3Rpb24gc2hhMShtZXNzYWdlKQoJCS0tIENyZWF0ZSBhbiBpbnN0YW5jZSAocHJpdmF0ZSBvYmplY3RzIGZvciBjdXJyZW50IGNhbGN1bGF0aW9uKQoJCWxvY2FsIEgsIGxlbmd0aCwgdGFpbCA9IHRhYmxlLnBhY2sodGFibGUudW5wYWNrKG1kNV9zaGExX0gpKSwgMCwgIiIKCQoJCWxvY2FsIGZ1bmN0aW9uIHBhcnRpYWwobWVzc2FnZV9wYXJ0KQoJCQlpZiBtZXNzYWdlX3BhcnQgdGhlbgoJCQkJbG9jYWwgcGFydExlbmd0aCA9ICNtZXNzYWdlX3BhcnQKCQkJCWlmIHRhaWwgdGhlbgoJCQkJCWxlbmd0aCA9IGxlbmd0aCArIHBhcnRMZW5ndGgKCQkJCQlsb2NhbCBvZmZzID0gMAoJCQkJCWlmIHRhaWwgfj0gIiIgYW5kICN0YWlsICsgcGFydExlbmd0aCA+PSA2NCB0aGVuCgkJCQkJCW9mZnMgPSA2NCAtICN0YWlsCgkJCQkJCXNoYTFfZmVlZF82NChILCB0YWlsIC4uIHN0cmluZy5zdWIobWVzc2FnZV9wYXJ0LCAxLCBvZmZzKSwgMCwgNjQpCgkJCQkJCXRhaWwgPSAiIgoJCQkJCWVuZAoJCgkJCQkJbG9jYWwgc2l6ZSA9IHBhcnRMZW5ndGggLSBvZmZzCgkJCQkJbG9jYWwgc2l6ZV90YWlsID0gc2l6ZSAlIDY0CgkJCQkJc2hhMV9mZWVkXzY0KEgsIG1lc3NhZ2VfcGFydCwgb2Zmcywgc2l6ZSAtIHNpemVfdGFpbCkKCQkJCQl0YWlsID0gdGFpbCAuLiBzdHJpbmcuc3ViKG1lc3NhZ2VfcGFydCwgcGFydExlbmd0aCArIDEgLSBzaXplX3RhaWwpCgkJCQkJcmV0dXJuIHBhcnRpYWwKCQkJCWVsc2UKCQkJCQllcnJvcigiQWRkaW5nIG1vcmUgY2h1bmtzIGlzIG5vdCBhbGxvd2VkIGFmdGVyIHJlY2VpdmluZyB0aGUgcmVzdWx0IiwgMikKCQkJCWVuZAoJCQllbHNlCgkJCQlpZiB0YWlsIHRoZW4KCQkJCQlsb2NhbCBmaW5hbF9ibG9ja3MgPSB0YWJsZS5jcmVhdGUoMTApIC0te3RhaWwsICJcMTI4Iiwgc3RyaW5nLnJlcCgiXDAiLCAoLTkgLSBsZW5ndGgpICUgNjQgKyAxKX0KCQkJCQlmaW5hbF9ibG9ja3NbMV0gPSB0YWlsCgkJCQkJZmluYWxfYmxvY2tzWzJdID0gIlwxMjgiCgkJCQkJZmluYWxfYmxvY2tzWzNdID0gc3RyaW5nLnJlcCgiXDAiLCAoLTkgLSBsZW5ndGgpICUgNjQgKyAxKQoJCQkJCXRhaWwgPSBuaWwKCQoJCQkJCS0tIEFzc3VtaW5nIHVzZXIgZGF0YSBsZW5ndGggaXMgc2hvcnRlciB0aGFuIChUV09fUE9XXzUzKS05IGJ5dGVzCgkJCQkJLS0gVFdPX1BPV181MyBieXRlcyA9IFRXT19QT1dfNTYgYml0cywgc28gImJpdC1jb3VudGVyIiBmaXRzIGluIDcgYnl0ZXMKCQkJCQlsZW5ndGggPSBsZW5ndGggKiAoOCAvIFRXTzU2X1BPV183KSAtLSBjb252ZXJ0ICJieXRlLWNvdW50ZXIiIHRvICJiaXQtY291bnRlciIgYW5kIG1vdmUgZGVjaW1hbCBwb2ludCB0byB0aGUgbGVmdAoJCQkJCWZvciBqID0gNCwgMTAgZG8KCQkJCQkJbGVuZ3RoID0gbGVuZ3RoICUgMSAqIDI1NgoJCQkJCQlmaW5hbF9ibG9ja3Nbal0gPSBzdHJpbmcuY2hhcihtYXRoLmZsb29yKGxlbmd0aCkpCgkJCQkJZW5kCgkKCQkJCQlmaW5hbF9ibG9ja3MgPSB0YWJsZS5jb25jYXQoZmluYWxfYmxvY2tzKQoJCQkJCXNoYTFfZmVlZF82NChILCBmaW5hbF9ibG9ja3MsIDAsICNmaW5hbF9ibG9ja3MpCgkJCQkJZm9yIGogPSAxLCA1IGRvCgkJCQkJCUhbal0gPSBzdHJpbmcuZm9ybWF0KCIlMDh4IiwgSFtqXSAlIDQyOTQ5NjcyOTYpCgkJCQkJZW5kCgkKCQkJCQlIID0gdGFibGUuY29uY2F0KEgpCgkJCQllbmQKCQoJCQkJcmV0dXJuIEgKCQkJZW5kCgkJZW5kCgkKCQlpZiBtZXNzYWdlIHRoZW4KCQkJLS0gQWN0dWFsbHkgcGVyZm9ybSBjYWxjdWxhdGlvbnMgYW5kIHJldHVybiB0aGUgU0hBLTEgZGlnZXN0IG9mIGEgbWVzc2FnZQoJCQlyZXR1cm4gcGFydGlhbChtZXNzYWdlKSgpCgkJZWxzZQoJCQktLSBSZXR1cm4gZnVuY3Rpb24gZm9yIGNodW5rLWJ5LWNodW5rIGxvYWRpbmcKCQkJLS0gVXNlciBzaG91bGQgZmVlZCBldmVyeSBjaHVuayBvZiBpbnB1dCBkYXRhIGFzIHNpbmdsZSBhcmd1bWVudCB0byB0aGlzIGZ1bmN0aW9uIGFuZCBmaW5hbGx5IGdldCBTSEEtMSBkaWdlc3QgYnkgaW52b2tpbmcgdGhpcyBmdW5jdGlvbiB3aXRob3V0IGFuIGFyZ3VtZW50CgkJCXJldHVybiBwYXJ0aWFsCgkJZW5kCgllbmQKCQoJbG9jYWwgZnVuY3Rpb24ga2VjY2FrKGJsb2NrX3NpemVfaW5fYnl0ZXMsIGRpZ2VzdF9zaXplX2luX2J5dGVzLCBpc19TSEFLRSwgbWVzc2FnZSkKCQktLSAiYmxvY2tfc2l6ZV9pbl9ieXRlcyIgaXMgbXVsdGlwbGUgb2YgOAoJCWlmIHR5cGUoZGlnZXN0X3NpemVfaW5fYnl0ZXMpIH49ICJudW1iZXIiIHRoZW4KCQkJLS0gYXJndW1lbnRzIGluIFNIQUtFIGFyZSBzd2FwcGVkOgoJCQktLSAgICBOSVNUIEZJUFMgMjAyIGRlZmluZXMgU0hBS0UobWVzc2FnZSxudW1fYml0cykKCQkJLS0gICAgdGhpcyBtb2R1bGUgICBkZWZpbmVzIFNIQUtFKG51bV9ieXRlcyxtZXNzYWdlKQoJCQktLSBpdCdzIGVhc3kgdG8gZm9yZ2V0IGFib3V0IHRoaXMgc3dhcCwgaGVuY2UgdGhlIGNoZWNrCgkJCWVycm9yKCJBcmd1bWVudCAnZGlnZXN0X3NpemVfaW5fYnl0ZXMnIG11c3QgYmUgYSBudW1iZXIiLCAyKQoJCWVuZAoJCgkJLS0gQ3JlYXRlIGFuIGluc3RhbmNlIChwcml2YXRlIG9iamVjdHMgZm9yIGN1cnJlbnQgY2FsY3VsYXRpb24pCgkJbG9jYWwgdGFpbCwgbGFuZXNfbG8sIGxhbmVzX2hpID0gIiIsIHRhYmxlLmNyZWF0ZSgyNSwgMCksIGhpX2ZhY3Rvcl9rZWNjYWsgPT0gMCBhbmQgdGFibGUuY3JlYXRlKDI1LCAwKQoJCWxvY2FsIHJlc3VsdAoJCgkJLS1+ICAgICBwYWQgdGhlIGlucHV0IE4gdXNpbmcgdGhlIHBhZCBmdW5jdGlvbiwgeWllbGRpbmcgYSBwYWRkZWQgYml0IHN0cmluZyBQIHdpdGggYSBsZW5ndGggZGl2aXNpYmxlIGJ5IHIgKHN1Y2ggdGhhdCBuID0gbGVuKFApL3IgaXMgaW50ZWdlciksCgkJLS1+ICAgICBicmVhayBQIGludG8gbiBjb25zZWN1dGl2ZSByLWJpdCBwaWVjZXMgUDAsIC4uLiwgUG4tMSAobGFzdCBpcyB6ZXJvLXBhZGRlZCkKCQktLX4gICAgIGluaXRpYWxpemUgdGhlIHN0YXRlIFMgdG8gYSBzdHJpbmcgb2YgYiAwIGJpdHMuCgkJLS1+ICAgICBhYnNvcmIgdGhlIGlucHV0IGludG8gdGhlIHN0YXRlOiBGb3IgZWFjaCBibG9jayBQaSwKCQktLX4gICAgICAgICBleHRlbmQgUGkgYXQgdGhlIGVuZCBieSBhIHN0cmluZyBvZiBjIDAgYml0cywgeWllbGRpbmcgb25lIG9mIGxlbmd0aCBiLAoJCS0tfiAgICAgICAgIFhPUiB0aGF0IHdpdGggUyBhbmQKCQktLX4gICAgICAgICBhcHBseSB0aGUgYmxvY2sgcGVybXV0YXRpb24gZiB0byB0aGUgcmVzdWx0LCB5aWVsZGluZyBhIG5ldyBzdGF0ZSBTCgkJLS1+ICAgICBpbml0aWFsaXplIFogdG8gYmUgdGhlIGVtcHR5IHN0cmluZwoJCS0tfiAgICAgd2hpbGUgdGhlIGxlbmd0aCBvZiBaIGlzIGxlc3MgdGhhbiBkOgoJCS0tfiAgICAgICAgIGFwcGVuZCB0aGUgZmlyc3QgciBiaXRzIG9mIFMgdG8gWgoJCS0tfiAgICAgICAgIGlmIFogaXMgc3RpbGwgbGVzcyB0aGFuIGQgYml0cyBsb25nLCBhcHBseSBmIHRvIFMsIHlpZWxkaW5nIGEgbmV3IHN0YXRlIFMuCgkJLS1+ICAgICB0cnVuY2F0ZSBaIHRvIGQgYml0cwoJCWxvY2FsIGZ1bmN0aW9uIHBhcnRpYWwobWVzc2FnZV9wYXJ0KQoJCQlpZiBtZXNzYWdlX3BhcnQgdGhlbgoJCQkJbG9jYWwgcGFydExlbmd0aCA9ICNtZXNzYWdlX3BhcnQKCQkJCWlmIHRhaWwgdGhlbgoJCQkJCWxvY2FsIG9mZnMgPSAwCgkJCQkJaWYgdGFpbCB+PSAiIiBhbmQgI3RhaWwgKyBwYXJ0TGVuZ3RoID49IGJsb2NrX3NpemVfaW5fYnl0ZXMgdGhlbgoJCQkJCQlvZmZzID0gYmxvY2tfc2l6ZV9pbl9ieXRlcyAtICN0YWlsCgkJCQkJCWtlY2Nha19mZWVkKGxhbmVzX2xvLCBsYW5lc19oaSwgdGFpbCAuLiBzdHJpbmcuc3ViKG1lc3NhZ2VfcGFydCwgMSwgb2ZmcyksIDAsIGJsb2NrX3NpemVfaW5fYnl0ZXMsIGJsb2NrX3NpemVfaW5fYnl0ZXMpCgkJCQkJCXRhaWwgPSAiIgoJCQkJCWVuZAoJCgkJCQkJbG9jYWwgc2l6ZSA9IHBhcnRMZW5ndGggLSBvZmZzCgkJCQkJbG9jYWwgc2l6ZV90YWlsID0gc2l6ZSAlIGJsb2NrX3NpemVfaW5fYnl0ZXMKCQkJCQlrZWNjYWtfZmVlZChsYW5lc19sbywgbGFuZXNfaGksIG1lc3NhZ2VfcGFydCwgb2Zmcywgc2l6ZSAtIHNpemVfdGFpbCwgYmxvY2tfc2l6ZV9pbl9ieXRlcykKCQkJCQl0YWlsID0gdGFpbCAuLiBzdHJpbmcuc3ViKG1lc3NhZ2VfcGFydCwgcGFydExlbmd0aCArIDEgLSBzaXplX3RhaWwpCgkJCQkJcmV0dXJuIHBhcnRpYWwKCQkJCWVsc2UKCQkJCQllcnJvcigiQWRkaW5nIG1vcmUgY2h1bmtzIGlzIG5vdCBhbGxvd2VkIGFmdGVyIHJlY2VpdmluZyB0aGUgcmVzdWx0IiwgMikKCQkJCWVuZAoJCQllbHNlCgkJCQlpZiB0YWlsIHRoZW4KCQkJCQktLSBhcHBlbmQgdGhlIGZvbGxvd2luZyBiaXRzIHRvIHRoZSBtZXNzYWdlOiBmb3IgdXN1YWwgU0hBMzogMDExKDAqKTEsIGZvciBTSEFLRTogMTExMTEoMCopMQoJCQkJCWxvY2FsIGdhcF9zdGFydCA9IGlzX1NIQUtFIGFuZCAzMSBvciA2CgkJCQkJdGFpbCA9IHRhaWwgLi4gKCN0YWlsICsgMSA9PSBibG9ja19zaXplX2luX2J5dGVzIGFuZCBzdHJpbmcuY2hhcihnYXBfc3RhcnQgKyAxMjgpIG9yIHN0cmluZy5jaGFyKGdhcF9zdGFydCkgLi4gc3RyaW5nLnJlcCgiXDAiLCAoLTIgLSAjdGFpbCkgJSBibG9ja19zaXplX2luX2J5dGVzKSAuLiAiXDEyOCIpCgkJCQkJa2VjY2FrX2ZlZWQobGFuZXNfbG8sIGxhbmVzX2hpLCB0YWlsLCAwLCAjdGFpbCwgYmxvY2tfc2l6ZV9pbl9ieXRlcykKCQkJCQl0YWlsID0gbmlsCgkKCQkJCQlsb2NhbCBsYW5lc191c2VkID0gMAoJCQkJCWxvY2FsIHRvdGFsX2xhbmVzID0gbWF0aC5mbG9vcihibG9ja19zaXplX2luX2J5dGVzIC8gOCkKCQkJCQlsb2NhbCBxd29yZHMgPSB7fQoJCgkJCQkJbG9jYWwgZnVuY3Rpb24gZ2V0X25leHRfcXdvcmRzX29mX2RpZ2VzdChxd29yZHNfcXR5KQoJCQkJCQktLSByZXR1cm5zIG5vdCBtb3JlIHRoYW4gJ3F3b3Jkc19xdHknIHF3b3JkcyAoJ3F3b3Jkc19xdHknIG1pZ2h0IGJlIG5vbi1pbnRlZ2VyKQoJCQkJCQktLSBkb2Vzbid0IGdvIGFjcm9zcyBrZWNjYWstYnVmZmVyIGJvdW5kYXJ5CgkJCQkJCS0tIGJsb2NrX3NpemVfaW5fYnl0ZXMgaXMgYSBtdWx0aXBsZSBvZiA4LCBzbywga2VjY2FrLWJ1ZmZlciBjb250YWlucyBpbnRlZ2VyIG51bWJlciBvZiBxd29yZHMKCQkJCQkJaWYgbGFuZXNfdXNlZCA+PSB0b3RhbF9sYW5lcyB0aGVuCgkJCQkJCQlrZWNjYWtfZmVlZChsYW5lc19sbywgbGFuZXNfaGksICJcMFwwXDBcMFwwXDBcMFwwIiwgMCwgOCwgOCkKCQkJCQkJCWxhbmVzX3VzZWQgPSAwCgkJCQkJCWVuZAoJCgkJCQkJCXF3b3Jkc19xdHkgPSBtYXRoLmZsb29yKG1hdGgubWluKHF3b3Jkc19xdHksIHRvdGFsX2xhbmVzIC0gbGFuZXNfdXNlZCkpCgkJCQkJCWlmIGhpX2ZhY3Rvcl9rZWNjYWsgfj0gMCB0aGVuCgkJCQkJCQlmb3IgaiA9IDEsIHF3b3Jkc19xdHkgZG8KCQkJCQkJCQlxd29yZHNbal0gPSBIRVg2NChsYW5lc19sb1tsYW5lc191c2VkICsgaiAtIDEgKyBsYW5lc19pbmRleF9iYXNlXSkKCQkJCQkJCWVuZAoJCQkJCQllbHNlCgkJCQkJCQlmb3IgaiA9IDEsIHF3b3Jkc19xdHkgZG8KCQkJCQkJCQlxd29yZHNbal0gPSBzdHJpbmcuZm9ybWF0KCIlMDh4IiwgbGFuZXNfaGlbbGFuZXNfdXNlZCArIGpdICUgNDI5NDk2NzI5NikgLi4gc3RyaW5nLmZvcm1hdCgiJTA4eCIsIGxhbmVzX2xvW2xhbmVzX3VzZWQgKyBqXSAlIDQyOTQ5NjcyOTYpCgkJCQkJCQllbmQKCQkJCQkJZW5kCgkKCQkJCQkJbGFuZXNfdXNlZCA9IGxhbmVzX3VzZWQgKyBxd29yZHNfcXR5CgkJCQkJCXJldHVybiBzdHJpbmcuZ3N1Yih0YWJsZS5jb25jYXQocXdvcmRzLCAiIiwgMSwgcXdvcmRzX3F0eSksICIoLi4pKC4uKSguLikoLi4pKC4uKSguLikoLi4pKC4uKSIsICIlOCU3JTYlNSU0JTMlMiUxIiksIHF3b3Jkc19xdHkgKiA4CgkJCQkJZW5kCgkKCQkJCQlsb2NhbCBwYXJ0cyA9IHt9IC0tIGRpZ2VzdCBwYXJ0cwoJCQkJCWxvY2FsIGxhc3RfcGFydCwgbGFzdF9wYXJ0X3NpemUgPSAiIiwgMAoJCgkJCQkJbG9jYWwgZnVuY3Rpb24gZ2V0X25leHRfcGFydF9vZl9kaWdlc3QoYnl0ZXNfbmVlZGVkKQoJCQkJCQktLSByZXR1cm5zICdieXRlc19uZWVkZWQnIGJ5dGVzLCBmb3IgYXJiaXRyYXJ5IGludGVnZXIgJ2J5dGVzX25lZWRlZCcKCQkJCQkJYnl0ZXNfbmVlZGVkID0gYnl0ZXNfbmVlZGVkIG9yIDEKCQkJCQkJaWYgYnl0ZXNfbmVlZGVkIDw9IGxhc3RfcGFydF9zaXplIHRoZW4KCQkJCQkJCWxhc3RfcGFydF9zaXplID0gbGFzdF9wYXJ0X3NpemUgLSBieXRlc19uZWVkZWQKCQkJCQkJCWxvY2FsIHBhcnRfc2l6ZV9pbl9uaWJibGVzID0gYnl0ZXNfbmVlZGVkICogMgoJCQkJCQkJbG9jYWwgcmVzdWx0ID0gc3RyaW5nLnN1YihsYXN0X3BhcnQsIDEsIHBhcnRfc2l6ZV9pbl9uaWJibGVzKQoJCQkJCQkJbGFzdF9wYXJ0ID0gc3RyaW5nLnN1YihsYXN0X3BhcnQsIHBhcnRfc2l6ZV9pbl9uaWJibGVzICsgMSkKCQkJCQkJCXJldHVybiByZXN1bHQKCQkJCQkJZW5kCgkKCQkJCQkJbG9jYWwgcGFydHNfcXR5ID0gMAoJCQkJCQlpZiBsYXN0X3BhcnRfc2l6ZSA+IDAgdGhlbgoJCQkJCQkJcGFydHNfcXR5ID0gMQoJCQkJCQkJcGFydHNbcGFydHNfcXR5XSA9IGxhc3RfcGFydAoJCQkJCQkJYnl0ZXNfbmVlZGVkID0gYnl0ZXNfbmVlZGVkIC0gbGFzdF9wYXJ0X3NpemUKCQkJCQkJZW5kCgkKCQkJCQkJLS0gcmVwZWF0cyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGVub3VnaAoJCQkJCQl3aGlsZSBieXRlc19uZWVkZWQgPj0gOCBkbwoJCQkJCQkJbG9jYWwgbmV4dF9wYXJ0LCBuZXh0X3BhcnRfc2l6ZSA9IGdldF9uZXh0X3F3b3Jkc19vZl9kaWdlc3QoYnl0ZXNfbmVlZGVkIC8gOCkKCQkJCQkJCXBhcnRzX3F0eSA9IHBhcnRzX3F0eSArIDEKCQkJCQkJCXBhcnRzW3BhcnRzX3F0eV0gPSBuZXh0X3BhcnQKCQkJCQkJCWJ5dGVzX25lZWRlZCA9IGJ5dGVzX25lZWRlZCAtIG5leHRfcGFydF9zaXplCgkJCQkJCWVuZAoJCgkJCQkJCWlmIGJ5dGVzX25lZWRlZCA+IDAgdGhlbgoJCQkJCQkJbGFzdF9wYXJ0LCBsYXN0X3BhcnRfc2l6ZSA9IGdldF9uZXh0X3F3b3Jkc19vZl9kaWdlc3QoMSkKCQkJCQkJCXBhcnRzX3F0eSA9IHBhcnRzX3F0eSArIDEKCQkJCQkJCXBhcnRzW3BhcnRzX3F0eV0gPSBnZXRfbmV4dF9wYXJ0X29mX2RpZ2VzdChieXRlc19uZWVkZWQpCgkJCQkJCWVsc2UKCQkJCQkJCWxhc3RfcGFydCwgbGFzdF9wYXJ0X3NpemUgPSAiIiwgMAoJCQkJCQllbmQKCQoJCQkJCQlyZXR1cm4gdGFibGUuY29uY2F0KHBhcnRzLCAiIiwgMSwgcGFydHNfcXR5KQoJCQkJCWVuZAoJCgkJCQkJaWYgZGlnZXN0X3NpemVfaW5fYnl0ZXMgPCAwIHRoZW4KCQkJCQkJcmVzdWx0ID0gZ2V0X25leHRfcGFydF9vZl9kaWdlc3QKCQkJCQllbHNlCgkJCQkJCXJlc3VsdCA9IGdldF9uZXh0X3BhcnRfb2ZfZGlnZXN0KGRpZ2VzdF9zaXplX2luX2J5dGVzKQoJCQkJCWVuZAoJCgkJCQllbmQKCQoJCQkJcmV0dXJuIHJlc3VsdAoJCQllbmQKCQllbmQKCQoJCWlmIG1lc3NhZ2UgdGhlbgoJCQktLSBBY3R1YWxseSBwZXJmb3JtIGNhbGN1bGF0aW9ucyBhbmQgcmV0dXJuIHRoZSBTSEEzIGRpZ2VzdCBvZiBhIG1lc3NhZ2UKCQkJcmV0dXJuIHBhcnRpYWwobWVzc2FnZSkoKQoJCWVsc2UKCQkJLS0gUmV0dXJuIGZ1bmN0aW9uIGZvciBjaHVuay1ieS1jaHVuayBsb2FkaW5nCgkJCS0tIFVzZXIgc2hvdWxkIGZlZWQgZXZlcnkgY2h1bmsgb2YgaW5wdXQgZGF0YSBhcyBzaW5nbGUgYXJndW1lbnQgdG8gdGhpcyBmdW5jdGlvbiBhbmQgZmluYWxseSBnZXQgU0hBMyBkaWdlc3QgYnkgaW52b2tpbmcgdGhpcyBmdW5jdGlvbiB3aXRob3V0IGFuIGFyZ3VtZW50CgkJCXJldHVybiBwYXJ0aWFsCgkJZW5kCgllbmQKCQoJbG9jYWwgZnVuY3Rpb24gSGV4VG9CaW5GdW5jdGlvbihoaCkKCQlyZXR1cm4gc3RyaW5nLmNoYXIodG9udW1iZXIoaGgsIDE2KSkKCWVuZAoJCglsb2NhbCBmdW5jdGlvbiBoZXgyYmluKGhleF9zdHJpbmcpCgkJcmV0dXJuIChzdHJpbmcuZ3N1YihoZXhfc3RyaW5nLCAiJXgleCIsIEhleFRvQmluRnVuY3Rpb24pKQoJZW5kCgkKCWxvY2FsIGJhc2U2NF9zeW1ib2xzID0gewoJCVsiKyJdID0gNjIsIFsiLSJdID0gNjIsIFs2Ml0gPSAiKyI7CgkJWyIvIl0gPSA2MywgWyJfIl0gPSA2MywgWzYzXSA9ICIvIjsKCQlbIj0iXSA9IC0xLCBbIi4iXSA9IC0xLCBbLTFdID0gIj0iOwoJfQoJCglsb2NhbCBzeW1ib2xfaW5kZXggPSAwCglmb3IgaiwgcGFpciBpbiB7IkFaIiwgImF6IiwgIjA5In0gZG8KCQlmb3IgYXNjaWkgPSBzdHJpbmcuYnl0ZShwYWlyKSwgc3RyaW5nLmJ5dGUocGFpciwgMikgZG8KCQkJbG9jYWwgY2ggPSBzdHJpbmcuY2hhcihhc2NpaSkKCQkJYmFzZTY0X3N5bWJvbHNbY2hdID0gc3ltYm9sX2luZGV4CgkJCWJhc2U2NF9zeW1ib2xzW3N5bWJvbF9pbmRleF0gPSBjaAoJCQlzeW1ib2xfaW5kZXggPSBzeW1ib2xfaW5kZXggKyAxCgkJZW5kCgllbmQKCQoJbG9jYWwgZnVuY3Rpb24gYmluMmJhc2U2NChiaW5hcnlfc3RyaW5nKQoJCWxvY2FsIHN0cmluZ0xlbmd0aCA9ICNiaW5hcnlfc3RyaW5nCgkJbG9jYWwgcmVzdWx0ID0gdGFibGUuY3JlYXRlKG1hdGguY2VpbChzdHJpbmdMZW5ndGggLyAzKSkKCQlsb2NhbCBsZW5ndGggPSAwCgkKCQlmb3IgcG9zID0gMSwgI2JpbmFyeV9zdHJpbmcsIDMgZG8KCQkJbG9jYWwgYzEsIGMyLCBjMywgYzQgPSBzdHJpbmcuYnl0ZShzdHJpbmcuc3ViKGJpbmFyeV9zdHJpbmcsIHBvcywgcG9zICsgMikgLi4gJ1wwJywgMSwgLTEpCgkJCWxlbmd0aCA9IGxlbmd0aCArIDEKCQkJcmVzdWx0W2xlbmd0aF0gPQoJCQkJYmFzZTY0X3N5bWJvbHNbbWF0aC5mbG9vcihjMSAvIDQpXSAuLgoJCQkJYmFzZTY0X3N5bWJvbHNbYzEgJSA0ICogMTYgKyBtYXRoLmZsb29yKGMyIC8gMTYpXSAuLgoJCQkJYmFzZTY0X3N5bWJvbHNbYzMgYW5kIGMyICUgMTYgKiA0ICsgbWF0aC5mbG9vcihjMyAvIDY0KSBvciAtMV0gLi4KCQkJCWJhc2U2NF9zeW1ib2xzW2M0IGFuZCBjMyAlIDY0IG9yIC0xXQoJCWVuZAoJCgkJcmV0dXJuIHRhYmxlLmNvbmNhdChyZXN1bHQpCgllbmQKCQoJbG9jYWwgZnVuY3Rpb24gYmFzZTY0MmJpbihiYXNlNjRfc3RyaW5nKQoJCWxvY2FsIHJlc3VsdCwgY2hhcnNfcXR5ID0ge30sIDMKCQlmb3IgcG9zLCBjaCBpbiBzdHJpbmcuZ21hdGNoKHN0cmluZy5nc3ViKGJhc2U2NF9zdHJpbmcsICIlcysiLCAiIiksICIoKSguKSIpIGRvCgkJCWxvY2FsIGNvZGUgPSBiYXNlNjRfc3ltYm9sc1tjaF0KCQkJaWYgY29kZSA8IDAgdGhlbgoJCQkJY2hhcnNfcXR5ID0gY2hhcnNfcXR5IC0gMQoJCQkJY29kZSA9IDAKCQkJZW5kCgkKCQkJbG9jYWwgaWR4ID0gcG9zICUgNAoJCQlpZiBpZHggPiAwIHRoZW4KCQkJCXJlc3VsdFstaWR4XSA9IGNvZGUKCQkJZWxzZQoJCQkJbG9jYWwgYzEgPSByZXN1bHRbLTFdICogNCArIG1hdGguZmxvb3IocmVzdWx0Wy0yXSAvIDE2KQoJCQkJbG9jYWwgYzIgPSAocmVzdWx0Wy0yXSAlIDE2KSAqIDE2ICsgbWF0aC5mbG9vcihyZXN1bHRbLTNdIC8gNCkKCQkJCWxvY2FsIGMzID0gKHJlc3VsdFstM10gJSA0KSAqIDY0ICsgY29kZQoJCQkJcmVzdWx0WyNyZXN1bHQgKyAxXSA9IHN0cmluZy5zdWIoc3RyaW5nLmNoYXIoYzEsIGMyLCBjMyksIDEsIGNoYXJzX3F0eSkKCQkJZW5kCgkJZW5kCgkKCQlyZXR1cm4gdGFibGUuY29uY2F0KHJlc3VsdCkKCWVuZAoJCglsb2NhbCBibG9ja19zaXplX2Zvcl9ITUFDIC0tIHRoaXMgdGFibGUgd2lsbCBiZSBpbml0aWFsaXplZCBhdCB0aGUgZW5kIG9mIHRoZSBtb2R1bGUKCS0tbG9jYWwgZnVuY3Rpb24gcGFkX2FuZF94b3Ioc3RyLCByZXN1bHRfbGVuZ3RoLCBieXRlX2Zvcl94b3IpCgktLQlyZXR1cm4gc3RyaW5nLmdzdWIoc3RyLCAiLiIsIGZ1bmN0aW9uKGMpCgktLQkJcmV0dXJuIHN0cmluZy5jaGFyKGJpdDMyX2J4b3Ioc3RyaW5nLmJ5dGUoYyksIGJ5dGVfZm9yX3hvcikpCgktLQllbmQpIC4uIHN0cmluZy5yZXAoc3RyaW5nLmNoYXIoYnl0ZV9mb3JfeG9yKSwgcmVzdWx0X2xlbmd0aCAtICNzdHIpCgktLWVuZAoJCgktLSBGb3IgdGhlIHNha2Ugb2Ygc3BlZWQgb2YgY29udmVydGluZyBoZXhlcyB0byBzdHJpbmdzLCB0aGVyZSdzIGEgbWFwIG9mIHRoZSBjb252ZXJzaW9ucyBoZXJlCglsb2NhbCBCaW5hcnlTdHJpbmdNYXAgPSB7fQoJZm9yIEluZGV4ID0gMCwgMjU1IGRvCgkJQmluYXJ5U3RyaW5nTWFwW3N0cmluZy5mb3JtYXQoIiUwMngiLCBJbmRleCldID0gc3RyaW5nLmNoYXIoSW5kZXgpCgllbmQKCQoJLS0gVXBkYXRlIDAyLjE0LjIwIC0gYWRkZWQgQXNCaW5hcnkgZm9yIGVhc3kgR2FtZUFuYWx5dGljcyByZXBsYWNlbWVudC4KCWxvY2FsIGZ1bmN0aW9uIGhtYWMoaGFzaF9mdW5jLCBrZXksIG1lc3NhZ2UsIEFzQmluYXJ5KQoJCS0tIENyZWF0ZSBhbiBpbnN0YW5jZSAocHJpdmF0ZSBvYmplY3RzIGZvciBjdXJyZW50IGNhbGN1bGF0aW9uKQoJCWxvY2FsIGJsb2NrX3NpemUgPSBibG9ja19zaXplX2Zvcl9ITUFDW2hhc2hfZnVuY10KCQlpZiBub3QgYmxvY2tfc2l6ZSB0aGVuCgkJCWVycm9yKCJVbmtub3duIGhhc2ggZnVuY3Rpb24iLCAyKQoJCWVuZAoJCgkJbG9jYWwgS2V5TGVuZ3RoID0gI2tleQoJCWlmIEtleUxlbmd0aCA+IGJsb2NrX3NpemUgdGhlbgoJCQlrZXkgPSBzdHJpbmcuZ3N1YihoYXNoX2Z1bmMoa2V5KSwgIiV4JXgiLCBIZXhUb0JpbkZ1bmN0aW9uKQoJCQlLZXlMZW5ndGggPSAja2V5CgkJZW5kCgkKCQlsb2NhbCBhcHBlbmQgPSBoYXNoX2Z1bmMoKShzdHJpbmcuZ3N1YihrZXksICIuIiwgZnVuY3Rpb24oYykKCQkJcmV0dXJuIHN0cmluZy5jaGFyKGJpdDMyX2J4b3Ioc3RyaW5nLmJ5dGUoYyksIDB4MzYpKQoJCWVuZCkgLi4gc3RyaW5nLnJlcCgiNiIsIGJsb2NrX3NpemUgLSBLZXlMZW5ndGgpKSAtLSA2ID0gc3RyaW5nLmNoYXIoMHgzNikKCQoJCWxvY2FsIHJlc3VsdAoJCgkJbG9jYWwgZnVuY3Rpb24gcGFydGlhbChtZXNzYWdlX3BhcnQpCgkJCWlmIG5vdCBtZXNzYWdlX3BhcnQgdGhlbgoJCQkJcmVzdWx0ID0gcmVzdWx0IG9yIGhhc2hfZnVuYygKCQkJCQlzdHJpbmcuZ3N1YihrZXksICIuIiwgZnVuY3Rpb24oYykKCQkJCQkJcmV0dXJuIHN0cmluZy5jaGFyKGJpdDMyX2J4b3Ioc3RyaW5nLmJ5dGUoYyksIDB4NWMpKQoJCQkJCWVuZCkgLi4gc3RyaW5nLnJlcCgiXFwiLCBibG9ja19zaXplIC0gS2V5TGVuZ3RoKSAtLSBcID0gc3RyaW5nLmNoYXIoMHg1YykKCQkJCQkuLiAoc3RyaW5nLmdzdWIoYXBwZW5kKCksICIleCV4IiwgSGV4VG9CaW5GdW5jdGlvbikpCgkJCQkpCgkKCQkJCXJldHVybiByZXN1bHQKCQkJZWxzZWlmIHJlc3VsdCB0aGVuCgkJCQllcnJvcigiQWRkaW5nIG1vcmUgY2h1bmtzIGlzIG5vdCBhbGxvd2VkIGFmdGVyIHJlY2VpdmluZyB0aGUgcmVzdWx0IiwgMikKCQkJZWxzZQoJCQkJYXBwZW5kKG1lc3NhZ2VfcGFydCkKCQkJCXJldHVybiBwYXJ0aWFsCgkJCWVuZAoJCWVuZAoJCgkJaWYgbWVzc2FnZSB0aGVuCgkJCS0tIEFjdHVhbGx5IHBlcmZvcm0gY2FsY3VsYXRpb25zIGFuZCByZXR1cm4gdGhlIEhNQUMgb2YgYSBtZXNzYWdlCgkJCWxvY2FsIEZpbmFsTWVzc2FnZSA9IHBhcnRpYWwobWVzc2FnZSkoKQoJCQlyZXR1cm4gQXNCaW5hcnkgYW5kIChzdHJpbmcuZ3N1YihGaW5hbE1lc3NhZ2UsICIleCV4IiwgQmluYXJ5U3RyaW5nTWFwKSkgb3IgRmluYWxNZXNzYWdlCgkJZWxzZQoJCQktLSBSZXR1cm4gZnVuY3Rpb24gZm9yIGNodW5rLWJ5LWNodW5rIGxvYWRpbmcgb2YgYSBtZXNzYWdlCgkJCS0tIFVzZXIgc2hvdWxkIGZlZWQgZXZlcnkgY2h1bmsgb2YgdGhlIG1lc3NhZ2UgYXMgc2luZ2xlIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24gYW5kIGZpbmFsbHkgZ2V0IEhNQUMgYnkgaW52b2tpbmcgdGhpcyBmdW5jdGlvbiB3aXRob3V0IGFuIGFyZ3VtZW50CgkJCXJldHVybiBwYXJ0aWFsCgkJZW5kCgllbmQKCQoJc2hhID0gewoJCW1kNSA9IG1kNSwKCQlzaGExID0gc2hhMSwKCQktLSBTSEEyIGhhc2ggZnVuY3Rpb25zOgoJCXNoYTIyNCA9IGZ1bmN0aW9uKG1lc3NhZ2UpCgkJCXJldHVybiBzaGEyNTZleHQoMjI0LCBtZXNzYWdlKQoJCWVuZDsKCQoJCXNoYTI1NiA9IGZ1bmN0aW9uKG1lc3NhZ2UpCgkJCXJldHVybiBzaGEyNTZleHQoMjU2LCBtZXNzYWdlKQoJCWVuZDsKCQoJCXNoYTUxMl8yMjQgPSBmdW5jdGlvbihtZXNzYWdlKQoJCQlyZXR1cm4gc2hhNTEyZXh0KDIyNCwgbWVzc2FnZSkKCQllbmQ7CgkKCQlzaGE1MTJfMjU2ID0gZnVuY3Rpb24obWVzc2FnZSkKCQkJcmV0dXJuIHNoYTUxMmV4dCgyNTYsIG1lc3NhZ2UpCgkJZW5kOwoJCgkJc2hhMzg0ID0gZnVuY3Rpb24obWVzc2FnZSkKCQkJcmV0dXJuIHNoYTUxMmV4dCgzODQsIG1lc3NhZ2UpCgkJZW5kOwoJCgkJc2hhNTEyID0gZnVuY3Rpb24obWVzc2FnZSkKCQkJcmV0dXJuIHNoYTUxMmV4dCg1MTIsIG1lc3NhZ2UpCgkJZW5kOwoJCgkJLS0gU0hBMyBoYXNoIGZ1bmN0aW9uczoKCQlzaGEzXzIyNCA9IGZ1bmN0aW9uKG1lc3NhZ2UpCgkJCXJldHVybiBrZWNjYWsoKDE2MDAgLSAyICogMjI0KSAvIDgsIDIyNCAvIDgsIGZhbHNlLCBtZXNzYWdlKQoJCWVuZDsKCQoJCXNoYTNfMjU2ID0gZnVuY3Rpb24obWVzc2FnZSkKCQkJcmV0dXJuIGtlY2NhaygoMTYwMCAtIDIgKiAyNTYpIC8gOCwgMjU2IC8gOCwgZmFsc2UsIG1lc3NhZ2UpCgkJZW5kOwoJCgkJc2hhM18zODQgPSBmdW5jdGlvbihtZXNzYWdlKQoJCQlyZXR1cm4ga2VjY2FrKCgxNjAwIC0gMiAqIDM4NCkgLyA4LCAzODQgLyA4LCBmYWxzZSwgbWVzc2FnZSkKCQllbmQ7CgkKCQlzaGEzXzUxMiA9IGZ1bmN0aW9uKG1lc3NhZ2UpCgkJCXJldHVybiBrZWNjYWsoKDE2MDAgLSAyICogNTEyKSAvIDgsIDUxMiAvIDgsIGZhbHNlLCBtZXNzYWdlKQoJCWVuZDsKCQoJCXNoYWtlMTI4ID0gZnVuY3Rpb24obWVzc2FnZSwgZGlnZXN0X3NpemVfaW5fYnl0ZXMpCgkJCXJldHVybiBrZWNjYWsoKDE2MDAgLSAyICogMTI4KSAvIDgsIGRpZ2VzdF9zaXplX2luX2J5dGVzLCB0cnVlLCBtZXNzYWdlKQoJCWVuZDsKCQoJCXNoYWtlMjU2ID0gZnVuY3Rpb24obWVzc2FnZSwgZGlnZXN0X3NpemVfaW5fYnl0ZXMpCgkJCXJldHVybiBrZWNjYWsoKDE2MDAgLSAyICogMjU2KSAvIDgsIGRpZ2VzdF9zaXplX2luX2J5dGVzLCB0cnVlLCBtZXNzYWdlKQoJCWVuZDsKCQoJCS0tIG1pc2MgdXRpbGl0aWVzOgoJCWhtYWMgPSBobWFjOyAtLSBITUFDKGhhc2hfZnVuYywga2V5LCBtZXNzYWdlKSBpcyBhcHBsaWNhYmxlIHRvIGFueSBoYXNoIGZ1bmN0aW9uIGZyb20gdGhpcyBtb2R1bGUgZXhjZXB0IFNIQUtFKgoJCWhleF90b19iaW4gPSBoZXgyYmluOyAtLSBjb252ZXJ0cyBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiB0byBiaW5hcnkgc3RyaW5nCgkJYmFzZTY0X3RvX2JpbiA9IGJhc2U2NDJiaW47IC0tIGNvbnZlcnRzIGJhc2U2NCByZXByZXNlbnRhdGlvbiB0byBiaW5hcnkgc3RyaW5nCgkJYmluX3RvX2Jhc2U2NCA9IGJpbjJiYXNlNjQ7IC0tIGNvbnZlcnRzIGJpbmFyeSBzdHJpbmcgdG8gYmFzZTY0IHJlcHJlc2VudGF0aW9uCgkJLS1iYXNlNjRfZW5jb2RlID0gQmFzZTY0LkVuY29kZTsKCQktLWJhc2U2NF9kZWNvZGUgPSBCYXNlNjQuRGVjb2RlOwoJfQoJCglibG9ja19zaXplX2Zvcl9ITUFDID0gewoJCVtzaGEubWQ1XSA9IDY0OwoJCVtzaGEuc2hhMV0gPSA2NDsKCQlbc2hhLnNoYTIyNF0gPSA2NDsKCQlbc2hhLnNoYTI1Nl0gPSA2NDsKCQlbc2hhLnNoYTUxMl8yMjRdID0gMTI4OwoJCVtzaGEuc2hhNTEyXzI1Nl0gPSAxMjg7CgkJW3NoYS5zaGEzODRdID0gMTI4OwoJCVtzaGEuc2hhNTEyXSA9IDEyODsKCQlbc2hhLnNoYTNfMjI0XSA9ICgxNjAwIC0gMiAqIDIyNCkgLyA4OwoJCVtzaGEuc2hhM18yNTZdID0gKDE2MDAgLSAyICogMjU2KSAvIDg7CgkJW3NoYS5zaGEzXzM4NF0gPSAoMTYwMCAtIDIgKiAzODQpIC8gODsKCQlbc2hhLnNoYTNfNTEyXSA9ICgxNjAwIC0gMiAqIDUxMikgLyA4OwoJfQoJCglsb2NhbCBoYXNobGliID0gc2hhCgkKCS0tIXN0cmljdAoJLS0gbWV0YXRhYmxlY2F0IDIwMjIKCQoJbHo0ID0ge30KCQoJdHlwZSBTdHJlYW1lciA9IHsKCQlPZmZzZXQ6IG51bWJlciwKCQlTb3VyY2U6IHN0cmluZywKCQlMZW5ndGg6IG51bWJlciwKCQlJc0ZpbmlzaGVkOiBib29sZWFuLAoJCUxhc3RVbnJlYWRCeXRlczogbnVtYmVyLAoJCgkJcmVhZDogKFN0cmVhbWVyLCBsZW46IG51bWJlcj8sIHNoaWZ0T2Zmc2V0OiBib29sZWFuPykgLT4gc3RyaW5nLAoJCXNlZWs6IChTdHJlYW1lciwgbGVuOiBudW1iZXIpIC0+ICgpLAoJCWFwcGVuZDogKFN0cmVhbWVyLCBuZXdEYXRhOiBzdHJpbmcpIC0+ICgpLAoJCXRvRW5kOiAoU3RyZWFtZXIpIC0+ICgpCgl9CgkKCXR5cGUgQmxvY2tEYXRhID0gewoJCVtudW1iZXJdOiB7CgkJCUxpdGVyYWw6IHN0cmluZywKCQkJTGl0ZXJhbExlbmd0aDogbnVtYmVyLAoJCQlNYXRjaE9mZnNldDogbnVtYmVyPywKCQkJTWF0Y2hMZW5ndGg6IG51bWJlcj8KCQl9Cgl9CgkKCWxvY2FsIGZ1bmN0aW9uIHBsYWluRmluZChzdHIsIHBhdCkKCQlyZXR1cm4gc3RyaW5nLmZpbmQoc3RyLCBwYXQsIDAsIHRydWUpCgllbmQKCQoJbG9jYWwgZnVuY3Rpb24gc3RyZWFtZXIoc3RyKTogU3RyZWFtZXIKCQlsb2NhbCBTdHJlYW0gPSB7fQoJCVN0cmVhbS5PZmZzZXQgPSAwCgkJU3RyZWFtLlNvdXJjZSA9IHN0cgoJCVN0cmVhbS5MZW5ndGggPSBzdHJpbmcubGVuKHN0cikKCQlTdHJlYW0uSXNGaW5pc2hlZCA9IGZhbHNlCQoJCVN0cmVhbS5MYXN0VW5yZWFkQnl0ZXMgPSAwCgkKCQlmdW5jdGlvbiBTdHJlYW0ucmVhZChzZWxmOiBTdHJlYW1lciwgbGVuOiBudW1iZXI/LCBzaGlmdDogYm9vbGVhbj8pOiBzdHJpbmcKCQkJbG9jYWwgbGVuID0gbGVuIG9yIDEKCQkJbG9jYWwgc2hpZnQgPSBpZiBzaGlmdCB+PSBuaWwgdGhlbiBzaGlmdCBlbHNlIHRydWUKCQkJbG9jYWwgZGF0ID0gc3RyaW5nLnN1YihzZWxmLlNvdXJjZSwgc2VsZi5PZmZzZXQgKyAxLCBzZWxmLk9mZnNldCArIGxlbikKCQoJCQlsb2NhbCBkYXRhTGVuZ3RoID0gc3RyaW5nLmxlbihkYXQpCgkJCWxvY2FsIHVucmVhZEJ5dGVzID0gbGVuIC0gZGF0YUxlbmd0aAoJCgkJCWlmIHNoaWZ0IHRoZW4KCQkJCXNlbGY6c2VlayhsZW4pCgkJCWVuZAoJCgkJCXNlbGYuTGFzdFVucmVhZEJ5dGVzID0gdW5yZWFkQnl0ZXMKCQkJcmV0dXJuIGRhdAoJCWVuZAoJCgkJZnVuY3Rpb24gU3RyZWFtLnNlZWsoc2VsZjogU3RyZWFtZXIsIGxlbjogbnVtYmVyKQoJCQlsb2NhbCBsZW4gPSBsZW4gb3IgMQoJCgkJCXNlbGYuT2Zmc2V0ID0gbWF0aC5jbGFtcChzZWxmLk9mZnNldCArIGxlbiwgMCwgc2VsZi5MZW5ndGgpCgkJCXNlbGYuSXNGaW5pc2hlZCA9IHNlbGYuT2Zmc2V0ID49IHNlbGYuTGVuZ3RoCgkJZW5kCgkKCQlmdW5jdGlvbiBTdHJlYW0uYXBwZW5kKHNlbGY6IFN0cmVhbWVyLCBuZXdEYXRhOiBzdHJpbmcpCgkJCS0tIGFkZHMgbmV3IGRhdGEgdG8gdGhlIGVuZCBvZiBhIHN0cmVhbQoJCQlzZWxmLlNvdXJjZSAuLj0gbmV3RGF0YQoJCQlzZWxmLkxlbmd0aCA9IHN0cmluZy5sZW4oc2VsZi5Tb3VyY2UpCgkJCXNlbGY6c2VlaygwKSAtLWhhY2t5IGJ1dCBmb3JjZXMgYSByZWNhbGN1bGF0aW9uIG9mIHRoZSBpc0ZpbmlzaGVkIGZsYWcKCQllbmQKCQoJCWZ1bmN0aW9uIFN0cmVhbS50b0VuZChzZWxmOiBTdHJlYW1lcikKCQkJc2VsZjpzZWVrKHNlbGYuTGVuZ3RoKQoJCWVuZAoJCgkJcmV0dXJuIFN0cmVhbQoJZW5kCgkKCWZ1bmN0aW9uIGx6NC5jb21wcmVzcyhzdHI6IHN0cmluZyk6IHN0cmluZwoJCWxvY2FsIGJsb2NrczogQmxvY2tEYXRhID0ge30KCQlsb2NhbCBpb3N0cmVhbSA9IHN0cmVhbWVyKHN0cikKCQoJCWlmIGlvc3RyZWFtLkxlbmd0aCA+IDEyIHRoZW4KCQkJbG9jYWwgZmlyc3RGb3VyID0gaW9zdHJlYW06cmVhZCg0KQoJCgkJCWxvY2FsIHByb2Nlc3NlZCA9IGZpcnN0Rm91cgoJCQlsb2NhbCBsaXQgPSBmaXJzdEZvdXIKCQkJbG9jYWwgbWF0Y2ggPSAiIgoJCQlsb2NhbCBMaXRlcmFsUHVzaFZhbHVlID0gIiIKCQkJbG9jYWwgcHVzaFRvTGl0ZXJhbCA9IHRydWUKCQoJCQlyZXBlYXQKCQkJCXB1c2hUb0xpdGVyYWwgPSB0cnVlCgkJCQlsb2NhbCBuZXh0Qnl0ZSA9IGlvc3RyZWFtOnJlYWQoKQoJCgkJCQlpZiBwbGFpbkZpbmQocHJvY2Vzc2VkLCBuZXh0Qnl0ZSkgdGhlbgoJCQkJCWxvY2FsIG5leHQzID0gaW9zdHJlYW06cmVhZCgzLCBmYWxzZSkKCQoJCQkJCWlmIHN0cmluZy5sZW4obmV4dDMpIDwgMyB0aGVuCgkJCQkJCS0tcHVzaCBieXRlcyB0byBsaXRlcmFsIGJsb2NrIHRoZW4gYnJlYWsKCQkJCQkJTGl0ZXJhbFB1c2hWYWx1ZSA9IG5leHRCeXRlIC4uIG5leHQzCgkJCQkJCWlvc3RyZWFtOnNlZWsoMykKCQkJCQllbHNlCgkJCQkJCW1hdGNoID0gbmV4dEJ5dGUgLi4gbmV4dDMKCQoJCQkJCQlsb2NhbCBtYXRjaFBvcyA9IHBsYWluRmluZChwcm9jZXNzZWQsIG1hdGNoKQoJCQkJCQlpZiBtYXRjaFBvcyB0aGVuCgkJCQkJCQlpb3N0cmVhbTpzZWVrKDMpCgkJCQkJCQlyZXBlYXQKCQkJCQkJCQlsb2NhbCBuZXh0TWF0Y2hCeXRlID0gaW9zdHJlYW06cmVhZCgxLCBmYWxzZSkKCQkJCQkJCQlsb2NhbCBuZXdSZXN1bHQgPSBtYXRjaCAuLiBuZXh0TWF0Y2hCeXRlCgkKCQkJCQkJCQlsb2NhbCByZXBvcyA9IHBsYWluRmluZChwcm9jZXNzZWQsIG5ld1Jlc3VsdCkgCgkJCQkJCQkJaWYgcmVwb3MgdGhlbgoJCQkJCQkJCQltYXRjaCA9IG5ld1Jlc3VsdAoJCQkJCQkJCQltYXRjaFBvcyA9IHJlcG9zCgkJCQkJCQkJCWlvc3RyZWFtOnNlZWsoMSkKCQkJCQkJCQllbmQKCQkJCQkJCXVudGlsIG5vdCBwbGFpbkZpbmQocHJvY2Vzc2VkLCBuZXdSZXN1bHQpIG9yIGlvc3RyZWFtLklzRmluaXNoZWQKCQoJCQkJCQkJbG9jYWwgbWF0Y2hMZW4gPSBzdHJpbmcubGVuKG1hdGNoKQoJCQkJCQkJbG9jYWwgcHVzaE1hdGNoID0gdHJ1ZQoJCgkJCQkJCQlpZiBpb3N0cmVhbS5MZW5ndGggLSBpb3N0cmVhbS5PZmZzZXQgPD0gNSB0aGVuCgkJCQkJCQkJTGl0ZXJhbFB1c2hWYWx1ZSA9IG1hdGNoCgkJCQkJCQkJcHVzaE1hdGNoID0gZmFsc2UKCQkJCQkJCQktLWJldHRlciBzYWZlIGhlcmUsIGRvbnQgYm90aGVyIHB1c2hpbmcgdG8gbWF0Y2ggZXZlcgoJCQkJCQkJZW5kCgkKCQkJCQkJCWlmIHB1c2hNYXRjaCB0aGVuCgkJCQkJCQkJcHVzaFRvTGl0ZXJhbCA9IGZhbHNlCgkKCQkJCQkJCQktLSBnZXRzIHRoZSBwb3NpdGlvbiBmcm9tIHRoZSBlbmQgb2YgcHJvY2Vzc2VkLCB0aGVuIHNsYXBzIGl0IG9udG8gcHJvY2Vzc2VkCgkJCQkJCQkJbG9jYWwgcmVhbFBvc2l0aW9uID0gc3RyaW5nLmxlbihwcm9jZXNzZWQpIC0gbWF0Y2hQb3MKCQkJCQkJCQlwcm9jZXNzZWQgPSBwcm9jZXNzZWQgLi4gbWF0Y2gKCQoJCQkJCQkJCXRhYmxlLmluc2VydChibG9ja3MsIHsKCQkJCQkJCQkJTGl0ZXJhbCA9IGxpdCwKCQkJCQkJCQkJTGl0ZXJhbExlbmd0aCA9IHN0cmluZy5sZW4obGl0KSwKCQkJCQkJCQkJTWF0Y2hPZmZzZXQgPSByZWFsUG9zaXRpb24gKyAxLAoJCQkJCQkJCQlNYXRjaExlbmd0aCA9IG1hdGNoTGVuLAoJCQkJCQkJCX0pCgkJCQkJCQkJbGl0ID0gIiIKCQkJCQkJCWVuZAoJCQkJCQllbHNlCgkJCQkJCQlMaXRlcmFsUHVzaFZhbHVlID0gbmV4dEJ5dGUKCQkJCQkJZW5kCgkJCQkJZW5kCgkJCQllbHNlCgkJCQkJTGl0ZXJhbFB1c2hWYWx1ZSA9IG5leHRCeXRlCgkJCQllbmQKCQoJCQkJaWYgcHVzaFRvTGl0ZXJhbCB0aGVuCgkJCQkJbGl0ID0gbGl0IC4uIExpdGVyYWxQdXNoVmFsdWUKCQkJCQlwcm9jZXNzZWQgPSBwcm9jZXNzZWQgLi4gbmV4dEJ5dGUKCQkJCWVuZAoJCQl1bnRpbCBpb3N0cmVhbS5Jc0ZpbmlzaGVkCgkJCXRhYmxlLmluc2VydChibG9ja3MsIHsKCQkJCUxpdGVyYWwgPSBsaXQsCgkJCQlMaXRlcmFsTGVuZ3RoID0gc3RyaW5nLmxlbihsaXQpCgkJCX0pCgkJZWxzZQoJCQlsb2NhbCBzdHIgPSBpb3N0cmVhbS5Tb3VyY2UKCQkJYmxvY2tzWzFdID0gewoJCQkJTGl0ZXJhbCA9IHN0ciwKCQkJCUxpdGVyYWxMZW5ndGggPSBzdHJpbmcubGVuKHN0cikKCQkJfQoJCWVuZAoJCgkJLS0gZ2VuZXJhdGUgdGhlIG91dHB1dCBjaHVuawoJCS0tICVzIGlzIGZvciBhZGRpbmcgaGVhZGVyCgkJbG9jYWwgb3V0cHV0ID0gc3RyaW5nLnJlcCgiXHgwMCIsIDQpCgkJbG9jYWwgZnVuY3Rpb24gd3JpdGUoY2hhcikKCQkJb3V0cHV0ID0gb3V0cHV0IC4uIGNoYXIKCQllbmQKCQktLSBiZWdpbiB3b3JraW5nIHRocm91Z2ggY2h1bmtzCgkJZm9yIGNodW5rTnVtLCBjaHVuayBpbiBibG9ja3MgZG8KCQkJbG9jYWwgbGl0TGVuID0gY2h1bmsuTGl0ZXJhbExlbmd0aAoJCQlsb2NhbCBtYXRMZW4gPSAoY2h1bmsuTWF0Y2hMZW5ndGggb3IgNCkgLSA0CgkKCQkJLS0gY3JlYXRlIHRva2VuCgkJCWxvY2FsIHRva2VuTGl0ID0gbWF0aC5jbGFtcChsaXRMZW4sIDAsIDE1KQoJCQlsb2NhbCB0b2tlbk1hdCA9IG1hdGguY2xhbXAobWF0TGVuLCAwLCAxNSkKCQoJCQlsb2NhbCB0b2tlbiA9IGJpdDMyLmxzaGlmdCh0b2tlbkxpdCwgNCkgKyB0b2tlbk1hdAoJCQl3cml0ZShzdHJpbmcucGFjaygiPEkxIiwgdG9rZW4pKQoJCgkJCWlmIGxpdExlbiA+PSAxNSB0aGVuCgkJCQlsaXRMZW4gPSBsaXRMZW4gLSAxNQoJCQkJLS1iZWdpbiBwYWNraW5nIGV4dHJhIGJ5dGVzCgkJCQlyZXBlYXQKCQkJCQlsb2NhbCBuZXh0VG9rZW4gPSBtYXRoLmNsYW1wKGxpdExlbiwgMCwgMHhGRikKCQkJCQl3cml0ZShzdHJpbmcucGFjaygiPEkxIiwgbmV4dFRva2VuKSkKCQkJCQlpZiBuZXh0VG9rZW4gPT0gMHhGRiB0aGVuCgkJCQkJCWxpdExlbiA9IGxpdExlbiAtIDI1NQoJCQkJCWVuZAoJCQkJdW50aWwgbmV4dFRva2VuIDwgMHhGRgoJCQllbmQKCQoJCQktLSBwdXNoIHJhdyBsaXQgZGF0YQoJCQl3cml0ZShjaHVuay5MaXRlcmFsKQoJCgkJCWlmIGNodW5rTnVtIH49ICNibG9ja3MgdGhlbgoJCQkJLS0gcHVzaCBvZmZzZXQgYXMgdTE2CgkJCQl3cml0ZShzdHJpbmcucGFjaygiPEkyIiwgY2h1bmsuTWF0Y2hPZmZzZXQpKQoJCgkJCQktLSBwYWNrIGV4dHJhIG1hdGNoIGJ5dGVzCgkJCQlpZiBtYXRMZW4gPj0gMTUgdGhlbgoJCQkJCW1hdExlbiA9IG1hdExlbiAtIDE1CgkKCQkJCQlyZXBlYXQKCQkJCQkJbG9jYWwgbmV4dFRva2VuID0gbWF0aC5jbGFtcChtYXRMZW4sIDAsIDB4RkYpCgkJCQkJCXdyaXRlKHN0cmluZy5wYWNrKCI8STEiLCBuZXh0VG9rZW4pKQoJCQkJCQlpZiBuZXh0VG9rZW4gPT0gMHhGRiB0aGVuCgkJCQkJCQltYXRMZW4gPSBtYXRMZW4gLSAyNTUKCQkJCQkJZW5kCgkJCQkJdW50aWwgbmV4dFRva2VuIDwgMHhGRgoJCQkJZW5kCgkJCWVuZAoJCWVuZAoJCS0tYXBwZW5kIGNodW5rcwoJCWxvY2FsIGNvbXBMZW4gPSBzdHJpbmcubGVuKG91dHB1dCkgLSA0CgkJbG9jYWwgZGVjb21wTGVuID0gaW9zdHJlYW0uTGVuZ3RoCgkKCQlyZXR1cm4gc3RyaW5nLnBhY2soIjxJNCIsIGNvbXBMZW4pIC4uIHN0cmluZy5wYWNrKCI8STQiLCBkZWNvbXBMZW4pIC4uIG91dHB1dAoJZW5kCgkKCWZ1bmN0aW9uIGx6NC5kZWNvbXByZXNzKGx6NGRhdGE6IHN0cmluZyk6IHN0cmluZwoJCWxvY2FsIGlucHV0U3RyZWFtID0gc3RyZWFtZXIobHo0ZGF0YSkKCQoJCWxvY2FsIGNvbXByZXNzZWRMZW4gPSBzdHJpbmcudW5wYWNrKCI8STQiLCBpbnB1dFN0cmVhbTpyZWFkKDQpKQoJCWxvY2FsIGRlY29tcHJlc3NlZExlbiA9IHN0cmluZy51bnBhY2soIjxJNCIsIGlucHV0U3RyZWFtOnJlYWQoNCkpCgkJbG9jYWwgcmVzZXJ2ZWQgPSBzdHJpbmcudW5wYWNrKCI8STQiLCBpbnB1dFN0cmVhbTpyZWFkKDQpKQoJCgkJaWYgY29tcHJlc3NlZExlbiA9PSAwIHRoZW4KCQkJcmV0dXJuIGlucHV0U3RyZWFtOnJlYWQoZGVjb21wcmVzc2VkTGVuKQoJCWVuZAoJCgkJbG9jYWwgb3V0cHV0U3RyZWFtID0gc3RyZWFtZXIoIiIpCgkKCQlyZXBlYXQKCQkJbG9jYWwgdG9rZW4gPSBzdHJpbmcuYnl0ZShpbnB1dFN0cmVhbTpyZWFkKCkpCgkJCWxvY2FsIGxpdExlbiA9IGJpdDMyLnJzaGlmdCh0b2tlbiwgNCkKCQkJbG9jYWwgbWF0TGVuID0gYml0MzIuYmFuZCh0b2tlbiwgMTUpICsgNAoJCgkJCWlmIGxpdExlbiA+PSAxNSB0aGVuCgkJCQlyZXBlYXQKCQkJCQlsb2NhbCBuZXh0Qnl0ZSA9IHN0cmluZy5ieXRlKGlucHV0U3RyZWFtOnJlYWQoKSkKCQkJCQlsaXRMZW4gKz0gbmV4dEJ5dGUKCQkJCXVudGlsIG5leHRCeXRlIH49IDB4RkYKCQkJZW5kCgkKCQkJbG9jYWwgbGl0ZXJhbCA9IGlucHV0U3RyZWFtOnJlYWQobGl0TGVuKQoJCQlvdXRwdXRTdHJlYW06YXBwZW5kKGxpdGVyYWwpCgkJCW91dHB1dFN0cmVhbTp0b0VuZCgpCgkJCWlmIG91dHB1dFN0cmVhbS5MZW5ndGggPCBkZWNvbXByZXNzZWRMZW4gdGhlbgoJCQkJLS1tYXRjaAoJCQkJbG9jYWwgb2Zmc2V0ID0gc3RyaW5nLnVucGFjaygiPEkyIiwgaW5wdXRTdHJlYW06cmVhZCgyKSkKCQkJCWlmIG1hdExlbiA+PSAxOSB0aGVuCgkJCQkJcmVwZWF0CgkJCQkJCWxvY2FsIG5leHRCeXRlID0gc3RyaW5nLmJ5dGUoaW5wdXRTdHJlYW06cmVhZCgpKQoJCQkJCQltYXRMZW4gKz0gbmV4dEJ5dGUKCQkJCQl1bnRpbCBuZXh0Qnl0ZSB+PSAweEZGCgkJCQllbmQKCQoJCQkJb3V0cHV0U3RyZWFtOnNlZWsoLW9mZnNldCkKCQkJCWxvY2FsIHBvcyA9IG91dHB1dFN0cmVhbS5PZmZzZXQKCQkJCWxvY2FsIG1hdGNoID0gb3V0cHV0U3RyZWFtOnJlYWQobWF0TGVuKQoJCQkJbG9jYWwgdW5yZWFkQnl0ZXMgPSBvdXRwdXRTdHJlYW0uTGFzdFVucmVhZEJ5dGVzCgkJCQlsb2NhbCBleHRyYQoJCQkJaWYgdW5yZWFkQnl0ZXMgdGhlbgoJCQkJCXJlcGVhdAoJCQkJCQlvdXRwdXRTdHJlYW0uT2Zmc2V0ID0gcG9zCgkJCQkJCWV4dHJhID0gb3V0cHV0U3RyZWFtOnJlYWQodW5yZWFkQnl0ZXMpCgkJCQkJCXVucmVhZEJ5dGVzID0gb3V0cHV0U3RyZWFtLkxhc3RVbnJlYWRCeXRlcwoJCQkJCQltYXRjaCAuLj0gZXh0cmEKCQkJCQl1bnRpbCB1bnJlYWRCeXRlcyA8PSAwCgkJCQllbmQKCQoJCQkJb3V0cHV0U3RyZWFtOmFwcGVuZChtYXRjaCkKCQkJCW91dHB1dFN0cmVhbTp0b0VuZCgpCgkJCWVuZAoJCgkJdW50aWwgb3V0cHV0U3RyZWFtLkxlbmd0aCA+PSBkZWNvbXByZXNzZWRMZW4KCQoJCXJldHVybiBvdXRwdXRTdHJlYW0uU291cmNlCgllbmQKCQoJbG9jYWwgbHo0ID0gbHo0CgkKCWNyeXB0ID0ge30KCQoJZG8KCQlsb2NhbCBiNjQgPSB7CgkJCWVuY29kZSA9IGZ1bmN0aW9uKGlucHV0KQoJCQkJbG9jYWwgVHlwZSA9IHR5cGUoaW5wdXQpCgkJCQlpZiBUeXBlIH49ICJzdHJpbmciIGFuZCBUeXBlIH49ICJudW1iZXIiIHRoZW4KCQkJCQlyZXR1cm4gZXJyb3IoImFyZyAjMSBtdXN0IGJlIHR5cGUgc3RyaW5nIG9yIG51bWJlciIsIDIpCgkJCQllbmQKCQoJCQkJcmV0dXJuIGlmIGlucHV0ID09ICIiIHRoZW4gaW5wdXQgZWxzZSBidWZmZXIudG9zdHJpbmcoYmFzZTY0LmVuY29kZShidWZmZXIuZnJvbXN0cmluZyhpbnB1dCkpKQoJCQllbmQsCgkJCWRlY29kZSA9IGZ1bmN0aW9uKGlucHV0KQoJCQkJbG9jYWwgVHlwZSA9IHR5cGUoaW5wdXQpCgkJCQlpZiBUeXBlIH49ICJzdHJpbmciIGFuZCBUeXBlIH49ICJudW1iZXIiIHRoZW4KCQkJCQlyZXR1cm4gZXJyb3IoImFyZyAjMSBtdXN0IGJlIHR5cGUgc3RyaW5nIG9yIG51bWJlciIsIDIpCgkJCQllbmQKCQoJCQkJcmV0dXJuIGlmIGlucHV0ID09ICIiIHRoZW4gaW5wdXQgZWxzZSBidWZmZXIudG9zdHJpbmcoYmFzZTY0LmRlY29kZShidWZmZXIuZnJvbXN0cmluZyhpbnB1dCkpKQoJCQllbmQsCgkJfQoJCWNyeXB0LmJhc2U2NCA9IGI2NAoJCgkJY3J5cHQuYmFzZTY0ZW5jb2RlID0gYjY0LmVuY29kZQoJCWNyeXB0LmJhc2U2NF9lbmNvZGUgPSBiNjQuZW5jb2RlCgkKCQljcnlwdC5iYXNlNjRkZWNvZGUgPSBiNjQuZGVjb2RlCgkJY3J5cHQuYmFzZTY0X2RlY29kZSA9IGI2NC5kZWNvZGUKCWVuZAoJCglkbwoJCWxvY2FsIG1vZGVzID0ge30KCQoJCWZvciBfLCBjaXBoZXJtb2RlIGluIHsgIkVDQiIsICJDQkMiLCAiUENCQyIsICJDRkIiLCAiT0ZCIiwgIkNUUiIgfSBkbyAtLSBNaXNzaW5nOiBHQ00gKGltcG9ydGFudCkKCQkJbG9jYWwgZW5jcnlwdCA9IGFlc1siZW5jcnlwdF8iIC4uIGNpcGhlcm1vZGVdCgkJCWxvY2FsIGRlY3J5cHQgPSBhZXNbImRlY3J5cHRfIiAuLiBjaXBoZXJtb2RlXQoJCgkJCW1vZGVzW3N0cmluZy5sb3dlcihjaXBoZXJtb2RlKV0gPSB7IGVuY3J5cHQgPSBlbmNyeXB0LCBkZWNyeXB0ID0gZGVjcnlwdCBvciBlbmNyeXB0IH0KCQllbmQKCQoJCS0tIEZ1bmN0aW9uIHRvIGFkZCBQS0NTIzcgcGFkZGluZyB0byBhIHN0cmluZwoJCWxvY2FsIGZ1bmN0aW9uIFBLQ1M3X3VucGFkKGlucHV0U3RyaW5nKQoJCQlsb2NhbCBibG9ja1NpemUgPSAxNgoJCQlsb2NhbCBsZW5ndGggPSAoI2lucHV0U3RyaW5nICUgYmxvY2tTaXplKQoJCgkJCS0tIE9ubHkgYWRkIHBhZGRpbmcgaWYgbmVlZGVkCgkJCWlmIDAgPT0gbGVuZ3RoIHRoZW4KCQkJCXJldHVybiBpbnB1dFN0cmluZwoJCQllbmQKCQoJCQlsb2NhbCBwYWRkaW5nU2l6ZSA9IGJsb2NrU2l6ZSAtIGxlbmd0aAoJCgkJCWxvY2FsIHBhZGRpbmcgPSBzdHJpbmcucmVwKHN0cmluZy5jaGFyKHBhZGRpbmdTaXplKSwgcGFkZGluZ1NpemUpCgkJCXJldHVybiBpbnB1dFN0cmluZyAuLiBwYWRkaW5nCgkJZW5kCgkKCQktLSBGdW5jdGlvbiB0byByZW1vdmUgUEtDUyM3IHBhZGRpbmcgZnJvbSBhIHBhZGRlZCBzdHJpbmcKCQlsb2NhbCBmdW5jdGlvbiBQS0NTN19wYWQocGFkZGVkU3RyaW5nKQoJCQlsb2NhbCBsYXN0Qnl0ZSA9IHN0cmluZy5ieXRlKHBhZGRlZFN0cmluZywgLTEpCgkKCQkJLS0gQ2hlY2sgaWYgcGFkZGluZyBpcyBwcmVzZW50CgkJCWlmIGxhc3RCeXRlIDw9IDE2IGFuZCAwIDwgbGFzdEJ5dGUgdGhlbgoJCQkJcmV0dXJuIHN0cmluZy5zdWIocGFkZGVkU3RyaW5nLCAxLCAtbGFzdEJ5dGUgLSAxKQoJCQllbHNlCgkJCQlyZXR1cm4gcGFkZGVkU3RyaW5nCgkJCWVuZAoJCWVuZAoJCgkJbG9jYWwgZnVuY3Rpb24gdGFibGVfdHlwZSh0KQoJCQlsb2NhbCBjdCA9IDEKCQkJZm9yIGkgaW4gdCBkbwoJCQkJaWYgaSB+PSBjdCB0aGVuCgkJCQkJcmV0dXJuICJkaWN0aW9uYXJ5IgoJCQkJZW5kCgkJCQljdCArPSAxCgkJCWVuZAoJCQlyZXR1cm4gImFycmF5IgoJCWVuZAoJCgkJbG9jYWwgZnVuY3Rpb24gYnl0ZXNfdG9fY2hhcih0KQoJCQlyZXR1cm4gc3RyaW5nLmNoYXIodW5wYWNrKHQpKQoJCWVuZAoJCgkJbG9jYWwgZnVuY3Rpb24gY3J5cHRfZ2VuZXJhbGl6ZWQoYWN0aW9uOiBzdHJpbmc/KQoJCQlyZXR1cm4gZnVuY3Rpb24oZGF0YTogc3RyaW5nLCBrZXk6IHN0cmluZywgaXY6IHN0cmluZz8sIG1vZGU6IHN0cmluZz8pOiAoc3RyaW5nLCBzdHJpbmcpCgkJCQlpZiBtb2RlIGFuZCB0eXBlKG1vZGUpID09ICJzdHJpbmciIHRoZW4KCQkJCQltb2RlID0gc3RyaW5nLmxvd2VyKG1vZGUpCgkJCQkJbW9kZSA9IG1vZGVzW21vZGVdCgkJCQllbHNlCgkJCQkJbW9kZSA9IG1vZGVzLmNiYyAtLSBEZWZhdWx0CgkJCQllbmQKCQoJCQkJaWYgaXYgdGhlbgoJCQkJCWl2ID0gY3J5cHQuYmFzZTY0ZGVjb2RlKGl2KQoJCQkJCXBjYWxsKGZ1bmN0aW9uKCkKCQkJCQkJaXYgPSBnYW1lOkdldFNlcnZpY2UoIkh0dHBTZXJ2aWNlIik6SlNPTkRlY29kZShpdikKCQkJCQllbmQpCgkJCQkJaWYgMTYgPCAjaXYgdGhlbgoJCQkJCQlpdiA9IHN0cmluZy5zdWIoaXYsIDEsIDE2KQoJCQkJCWVsc2VpZiAjaXYgPCAxNiB0aGVuCgkJCQkJCWl2ID0gUEtDUzdfdW5wYWQoaXYpCgkJCQkJZW5kCgkJCQllbmQKCQoJCQkJcGNhbGwoZnVuY3Rpb24oKQoJCQkJCWtleSA9IGNyeXB0LmJhc2U2NGRlY29kZShrZXkpCgkJCQllbmQpCgkKCQkJCS0tIFRPRE8gVGhpcyBjb2RlIGJlbG93IGlzIGV2ZW4gd29yc2UKCQkJCWxvY2FsIGNyeXB0X2YgPSBtb2RlW2FjdGlvbl0KCQkJCWRhdGEsIGl2ID0gY3J5cHRfZihrZXksIGlmIGFjdGlvbiA9PSAiZW5jcnlwdCIgdGhlbiBQS0NTN191bnBhZChkYXRhKSBlbHNlIGNyeXB0LmJhc2U2NGRlY29kZShkYXRhKSwgaXYpCgkKCQkJCWRhdGEgPSBieXRlc190b19jaGFyKGRhdGEpCgkKCQkJCWlmIGFjdGlvbiA9PSAiZGVjcnlwdCIgdGhlbgoJCQkJCWRhdGEgPSBQS0NTN19wYWQoZGF0YSkKCQkJCWVsc2UKCQkJCQlpZiB0YWJsZV90eXBlKGl2KSA9PSAiYXJyYXkiIHRoZW4KCQkJCQkJaXYgPSBieXRlc190b19jaGFyKGl2KQoJCQkJCWVsc2UKCQkJCQkJaXYgPSBnYW1lOkdldFNlcnZpY2UoIkh0dHBTZXJ2aWNlIik6SlNPTkVuY29kZShpdikKCQkJCQllbmQKCQkJCQlpdiA9IGNyeXB0LmJhc2U2NGVuY29kZShpdikKCQkJCQlkYXRhID0gY3J5cHQuYmFzZTY0ZW5jb2RlKGRhdGEpCgkJCQllbmQKCQoJCQkJcmV0dXJuIGRhdGEsIGl2CgkJCWVuZAoJCWVuZAoJCgkJY3J5cHQuZW5jcnlwdCA9IGNyeXB0X2dlbmVyYWxpemVkKCJlbmNyeXB0IikKCQljcnlwdC5kZWNyeXB0ID0gY3J5cHRfZ2VuZXJhbGl6ZWQoImRlY3J5cHQiKQoJCgkJLS0gKiBUZXN0cwoJCS0tIGZvciBtb2RlIGluIHsgIkVDQiIsICJDQkMiLCAiUENCQyIsICJDRkIiLCAiT0ZCIiwgIkNUUiIgfSBkbwoJCS0tICAgICBsb2NhbCBrZXkgPSAiMTBzeWZoT1ZlTVdbRiNPamJxanZbKVI3LEFkPWRpTkIiCgkJLS0gICAgIGxvY2FsIGRhdGEgPSAidGVzdCBsb3JlbSBpcHNcMSIgLS0gInh0ZXN0IGxvcmVtIGlwc1wxIiBicmVha3Mgb3VyIHBhZGRpbmcgYWxnb3JpdGhtIHNhZGx5IGxvbAoJCS0tICAgICBsb2NhbCBlbmNyeXB0ZWQsIGl2ID0gY3J5cHQuZW5jcnlwdChkYXRhLCBrZXksIG5pbCwgbW9kZSkKCQoJCS0tICAgICBhc3NlcnQoaXYsICJjcnlwdC5lbmNyeXB0IHNob3VsZCByZXR1cm4gYW4gSVYiKQoJCS0tICAgICBsb2NhbCBkZWNyeXB0ZWQgPSBjcnlwdC5kZWNyeXB0KGVuY3J5cHRlZCwga2V5LCBpdiwgbW9kZSkKCQoJCS0tICAgICBhc3NlcnQoZGVjcnlwdGVkID09IGRhdGEsICJGYWlsZWQgdG8gZGVjcnlwdCByYXcgc3RyaW5nIGZyb20gZW5jcnlwdGVkIGRhdGEiKQoJCS0tIGVuZAoJZW5kCgkKCWZ1bmN0aW9uIGNyeXB0LmdlbmVyYXRlYnl0ZXMoc2l6ZTogbnVtYmVyKTogc3RyaW5nCgkJbG9jYWwgcmFuZG9tQnl0ZXMgPSB0YWJsZS5jcmVhdGUoc2l6ZSkKCQlmb3IgaSA9IDEsIHNpemUgZG8KCQkJcmFuZG9tQnl0ZXNbaV0gPSBzdHJpbmcuY2hhcihtYXRoLnJhbmRvbSgwLCAyNTUpKQoJCWVuZAoJCgkJcmV0dXJuIGNyeXB0LmJhc2U2NGVuY29kZSh0YWJsZS5jb25jYXQocmFuZG9tQnl0ZXMpKQoJZW5kCgkKCWZ1bmN0aW9uIGNyeXB0LmdlbmVyYXRla2V5KCkKCQlyZXR1cm4gY3J5cHQuZ2VuZXJhdGVieXRlcygzMikKCWVuZAoJCglmdW5jdGlvbiBjcnlwdC5oYXNoKGRhdGE6IHN0cmluZywgYWxnb3JpdGhtOiBzdHJpbmcpOiBzdHJpbmcKCQlyZXR1cm4gaGFzaGxpYltzdHJpbmcuZ3N1YihhbGdvcml0aG0sICItIiwgIl8iKV0oZGF0YSkKCWVuZAoJCglmdW5jdGlvbiBjcnlwdC5obWFjKGRhdGE6IHN0cmluZywga2V5OiBzdHJpbmcsIGFzQmluYXJ5OiBib29sZWFuKTogc3RyaW5nCgkJLS0qIHNoYTUxMl8yNTYgYmVjYXVzZSBzeW5hcHNlIHVzZXMgaXQgLSBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAyMzEwMzAxOTI5MDYvaHR0cHM6Ly9zeW5sbGMuZ2l0aHViLmlvL3N5bmFwc2UteC1kb2N1bWVudGF0aW9uL3JlZmVyZW5jZS9uYW1lc3BhY2Uvc3luLmNyeXB0Lmh0bWwjaG1hYyAtIGh0dHBzOi8vbGlic29kaXVtLmdpdGJvb2suaW8vZG9jL3NlY3JldC1rZXlfY3J5cHRvZ3JhcGh5L3NlY3JldC1rZXlfYXV0aGVudGljYXRpb24jYWxnb3JpdGhtLWRldGFpbHMKCQoJCXJldHVybiBoYXNobGliLmhtYWMoaGFzaGxpYi5zaGE1MTJfMjU2LCBkYXRhLCBrZXksIGFzQmluYXJ5KQoJZW5kCgkKCWNyeXB0Lmx6NCA9IGx6NAoJY3J5cHQubHo0Y29tcHJlc3MgPSBsejQuY29tcHJlc3MKCWNyeXB0Lmx6NGRlY29tcHJlc3MgPSBsejQuZGVjb21wcmVzcwoJbHo0Y29tcHJlc3MgPSBsejQuY29tcHJlc3MKCWx6NGRlY29tcHJlc3MgPSBsejQuZGVjb21wcmVzcwoJYmFzZTY0X2VuY29kZSA9IGJhc2U2NC5lbmNvZGUKCWJhc2U2NF9kZWNvZGUgPSBiYXNlNjQuZGVjb2RlCglsb2NhbCBSdW5TZXJ2aWNlID0gZ2FtZTpHZXRTZXJ2aWNlKCJSdW5TZXJ2aWNlIikKCWxvY2FsIENhcHBlZCwgRnJhY3Rpb25PZkFTZWNvbmQKCWxvY2FsIEhlYXJ0YmVhdCA9IFJ1blNlcnZpY2UuSGVhcnRiZWF0CgkKCWZ1bmN0aW9uIHNldGZwc2NhcChmcHNfY2FwKQoJCWlmIGZwc19jYXAgPT0gMCBvciBmcHNfY2FwID09IG5pbCBvciAxZTQgPD0gZnBzX2NhcCB0aGVuIC0tIH43ayBmcHMgaXMgdGhlIGhpZ2hlc3QgcGVvcGxlIGhhdmUgZ290dGVuOyAtLT9tYXliZSBjb21wYXJlIHRvIGdldGZwc21heCBpbnN0ZWFkPyAoYnV0IHdlIGhhdmUgdG8gZW5zdXJlIGdldGZwc21heCBpcyBhY2N1cmF0ZSBmaXJzdCkKCQkJaWYgQ2FwcGVkIHRoZW4KCQkJCXRhc2suY2FuY2VsKENhcHBlZCkKCQkJCUNhcHBlZCA9IG5pbAoJCQkJRnJhY3Rpb25PZkFTZWNvbmQgPSBuaWwKCQkJZW5kCgkJCXJldHVybgoJCWVuZAoJCgkJRnJhY3Rpb25PZkFTZWNvbmQgPSAxIC8gZnBzX2NhcAoJCWlmIENhcHBlZCB0aGVuCgkJCXJldHVybgoJCWVuZAoJCWxvY2FsIGZ1bmN0aW9uIENhcHBlcigpCgkJCS0tICogTW9kaWZpZWQgdmVyc2lvbiBvZiBodHRwczovL2dpdGh1Yi5jb20vTWF4aW11bUFESEQvU3VwZXItTm9zdGFsZ2lhLVpvbmUvYmxvYi81NDAyMjFiYzk0NWE4ZmMzYTQ1YmFmNTFiNDBlMDIyNzJhMjEzMjlkL0NsaWVudC9GcHNDYXAuY2xpZW50Lmx1YSMKCQkJbG9jYWwgdDAgPSBvcy5jbG9jaygpCgkJCUhlYXJ0YmVhdDpXYWl0KCkKCQkJLS0gcmVwZWF0IHVudGlsIHQwICsgdDEgPCB0aWNrKCkKCQkJLS0gbG9jYWwgY291bnQgPSAwCgkJCXdoaWxlIG9zLmNsb2NrKCkgPD0gdDAgKyBGcmFjdGlvbk9mQVNlY29uZCBkbyAtLSAqIG5vdCB1c2luZyByZXBlYXQgdG8gYXZvaWQgdW5yZWFzb25hYmxlIGV4dHJhIGl0ZXJhdGlvbnMKCQkJCS0tIGNvdW50Kz0xCgkJCWVuZAoJCQktLSB0YXNrLnNwYXduKHByaW50LGNvdW50KQoJCWVuZAoJCUNhcHBlcigpIC0tIFlpZWxkIHVudGlsIGl0IGtpY2tzIGluIGJhc2ljYWxseQoJCUNhcHBlZCA9IHRhc2suc3Bhd24oZnVuY3Rpb24oKQoJCQktLSBjYXBwaW5nID0gdHJ1ZSAtLSAqIHRoaXMgd29ya3MgdG9vCgkJCXdoaWxlIHRydWUgZG8KCQkJCUNhcHBlcigpCgkJCWVuZAoJCWVuZCkKCWVuZAoJCgkKCWxvY2FsIGRlYnVnX2xpYiA9IHRhYmxlLmNsb25lKGRlYnVnKQoJCglkZWJ1Z19saWIuZ2V0aW5mbyA9IGZ1bmN0aW9uKGYsIG9wdGlvbnMpCgkJaWYgdHlwZShvcHRpb25zKSA9PSAic3RyaW5nIiB0aGVuCgkJCW9wdGlvbnMgPSBzdHJpbmcubG93ZXIob3B0aW9ucykgLS0gaWYgc29tZW9uZSBhZGRzICJMIiBmb3IgYWN0aXZlbGluZXMgYW5kICJsIiBmb3IgY3VycmVudGxpbmUgdGhlbiB0aGF0cyBvbiB0aGVtIChpdCB3aWxsIGp1c3Qgc2xvdyBkb3duIHRoaXMgZnVuY3Rpb24gYmVjYXVzZSBkdXBsaWNhdGUgZGVidWcuaW5mb3MpCgkJZWxzZQoJCQlvcHRpb25zID0gInNmbG51IgoJCWVuZAoJCgkJbG9jYWwgcmVzdWx0ID0ge30KCQoJCWZvciBpbmRleCA9IDEsICNvcHRpb25zIGRvCgkJCWxvY2FsIG9wdGlvbiA9IHN0cmluZy5zdWIob3B0aW9ucywgaW5kZXgsIGluZGV4KQoJCQlpZiAicyIgPT0gb3B0aW9uIHRoZW4KCQkJCWxvY2FsIHNob3J0X3NyYyA9IGRlYnVnLmluZm8oZiwgInMiKQoJCgkJCQlyZXN1bHQuc2hvcnRfc3JjID0gc2hvcnRfc3JjCgkJCQlyZXN1bHQuc291cmNlID0gIkAiIC4uIHNob3J0X3NyYwoJCQkJcmVzdWx0LndoYXQgPSBpZiBzaG9ydF9zcmMgPT0gIltDXSIgdGhlbiAiQyIgZWxzZSAiTHVhIgoJCQllbHNlaWYgImYiID09IG9wdGlvbiB0aGVuCgkJCQlyZXN1bHQuZnVuYyA9IGRlYnVnLmluZm8oZiwgImYiKQoJCQllbHNlaWYgImwiID09IG9wdGlvbiB0aGVuCgkJCQlyZXN1bHQuY3VycmVudGxpbmUgPSBkZWJ1Zy5pbmZvKGYsICJsIikKCQkJZWxzZWlmICJuIiA9PSBvcHRpb24gdGhlbgoJCQkJcmVzdWx0Lm5hbWUgPSBkZWJ1Zy5pbmZvKGYsICJuIikKCQkJZWxzZWlmICJ1IiA9PSBvcHRpb24gb3Igb3B0aW9uID09ICJhIiB0aGVuCgkJCQlsb2NhbCBudW1wYXJhbXMsIGlzX3ZhcmFyZyA9IGRlYnVnLmluZm8oZiwgImEiKQoJCQkJcmVzdWx0Lm51bXBhcmFtcyA9IG51bXBhcmFtcwoJCQkJcmVzdWx0LmlzX3ZhcmFyZyA9IGlmIGlzX3ZhcmFyZyB0aGVuIDEgZWxzZSAwCgkKCQkJCWlmICJ1IiA9PSBvcHRpb24gdGhlbgoJCQkJCXJlc3VsdC5udXBzID0gLTEgLS0jZGVidWcuZ2V0dXB2YWx1ZXMoZikKCQkJCWVuZAoJCQllbmQKCQllbmQKCQoJCXJldHVybiByZXN1bHQKCWVuZAoJCglkZWJ1Z19saWIuZ2V0bWV0YXRhYmxlID0gZnVuY3Rpb24odGFibGVfb3JfdXNlcmRhdGEpCgkJbG9jYWwgcmVzdWx0ID0gZ2V0bWV0YXRhYmxlKHRhYmxlX29yX3VzZXJkYXRhKQoJCWlmIHJlc3VsdCA9PSBuaWwgdGhlbiAtLSBObyBtZXRhCgkJCXJldHVybgoJCWVuZAoJCWlmIHR5cGUocmVzdWx0KSA9PSAidGFibGUiIGFuZCBwY2FsbChzZXRtZXRhdGFibGUsIHRhYmxlX29yX3VzZXJkYXRhLCByZXN1bHQpIHRoZW4KCQkJcmV0dXJuIHJlc3VsdAoJCWVuZAoJCWxvY2FsIHJlYWxfbWV0YW1ldGhvZHMgPSB7fQoJCXhwY2FsbChmdW5jdGlvbigpCgkJCXJldHVybiB0YWJsZV9vcl91c2VyZGF0YS5fCgkJZW5kLCBmdW5jdGlvbigpCgkJCXJlYWxfbWV0YW1ldGhvZHMuX19pbmRleCA9IGRlYnVnLmluZm8oMiwgImYiKQoJCWVuZCkKCQl4cGNhbGwoZnVuY3Rpb24oKQoJCQl0YWJsZV9vcl91c2VyZGF0YS5fID0gdGFibGVfb3JfdXNlcmRhdGEKCQllbmQsIGZ1bmN0aW9uKCkKCQkJcmVhbF9tZXRhbWV0aG9kcy5fX25ld2luZGV4ID0gZGVidWcuaW5mbygyLCAiZiIpCgkJZW5kKQoJCXhwY2FsbChmdW5jdGlvbigpCgkJCXJldHVybiB0YWJsZV9vcl91c2VyZGF0YTpfX18oKQoJCWVuZCwgZnVuY3Rpb24oKQoJCQlyZWFsX21ldGFtZXRob2RzLl9fbmFtZWNhbGwgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkKCQkJdGFibGVfb3JfdXNlcmRhdGEoKQoJCWVuZCwgZnVuY3Rpb24oKQoJCQlyZWFsX21ldGFtZXRob2RzLl9fY2FsbCA9IGRlYnVnLmluZm8oMiwgImYiKQoJCWVuZCkKCQl4cGNhbGwoZnVuY3Rpb24oKSAtLSAqIExVQVUKCQkJZm9yIF8gaW4gdGFibGVfb3JfdXNlcmRhdGEgZG8KCQkJZW5kCgkJZW5kLCBmdW5jdGlvbigpCgkJCXJlYWxfbWV0YW1ldGhvZHMuX19pdGVyID0gZGVidWcuaW5mbygyLCAiZiIpCgkJZW5kKQoJCXhwY2FsbChmdW5jdGlvbigpCgkJCXJldHVybiAjdGFibGVfb3JfdXNlcmRhdGEKCQllbmQsIGZ1bmN0aW9uKCkKCQkJcmVhbF9tZXRhbWV0aG9kcy5fX2xlbiA9IGRlYnVnLmluZm8oMiwgImYiKQoJCWVuZCkKCQlsb2NhbCB0eXBlX2NoZWNrX3NlbWlieXBhc3MgPSB7fQoJCXhwY2FsbChmdW5jdGlvbigpCgkJCXJldHVybiB0YWJsZV9vcl91c2VyZGF0YSA9PSB0YWJsZV9vcl91c2VyZGF0YQoJCWVuZCwgZnVuY3Rpb24oKQoJCQlyZWFsX21ldGFtZXRob2RzLl9fZXEgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkKCQkJcmV0dXJuIHRhYmxlX29yX3VzZXJkYXRhICsgdHlwZV9jaGVja19zZW1pYnlwYXNzCgkJZW5kLCBmdW5jdGlvbigpCgkJCXJlYWxfbWV0YW1ldGhvZHMuX19hZGQgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkKCQkJcmV0dXJuIHRhYmxlX29yX3VzZXJkYXRhIC0gdHlwZV9jaGVja19zZW1pYnlwYXNzCgkJZW5kLCBmdW5jdGlvbigpCgkJCXJlYWxfbWV0YW1ldGhvZHMuX19zdWIgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkKCQkJcmV0dXJuIHRhYmxlX29yX3VzZXJkYXRhICogdHlwZV9jaGVja19zZW1pYnlwYXNzCgkJZW5kLCBmdW5jdGlvbigpCgkJCXJlYWxfbWV0YW1ldGhvZHMuX19tdWwgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkKCQkJcmV0dXJuIHRhYmxlX29yX3VzZXJkYXRhIC8gdHlwZV9jaGVja19zZW1pYnlwYXNzCgkJZW5kLCBmdW5jdGlvbigpCgkJCXJlYWxfbWV0YW1ldGhvZHMuX19kaXYgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkgLS0gKiBMVUFVCgkJCXJldHVybiB0YWJsZV9vcl91c2VyZGF0YSAvLyB0eXBlX2NoZWNrX3NlbWlieXBhc3MKCQllbmQsIGZ1bmN0aW9uKCkKCQkJcmVhbF9tZXRhbWV0aG9kcy5fX2lkaXYgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkKCQkJcmV0dXJuIHRhYmxlX29yX3VzZXJkYXRhICUgdHlwZV9jaGVja19zZW1pYnlwYXNzCgkJZW5kLCBmdW5jdGlvbigpCgkJCXJlYWxfbWV0YW1ldGhvZHMuX19tb2QgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkKCQkJcmV0dXJuIHRhYmxlX29yX3VzZXJkYXRhIF4gdHlwZV9jaGVja19zZW1pYnlwYXNzCgkJZW5kLCBmdW5jdGlvbigpCgkJCXJlYWxfbWV0YW1ldGhvZHMuX19wb3cgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkKCQkJcmV0dXJuIC10YWJsZV9vcl91c2VyZGF0YQoJCWVuZCwgZnVuY3Rpb24oKQoJCQlyZWFsX21ldGFtZXRob2RzLl9fdW5tID0gZGVidWcuaW5mbygyLCAiZiIpCgkJZW5kKQoJCXhwY2FsbChmdW5jdGlvbigpCgkJCXJldHVybiB0YWJsZV9vcl91c2VyZGF0YSA8IHR5cGVfY2hlY2tfc2VtaWJ5cGFzcwoJCWVuZCwgZnVuY3Rpb24oKQoJCQlyZWFsX21ldGFtZXRob2RzLl9fbHQgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkKCQkJcmV0dXJuIHRhYmxlX29yX3VzZXJkYXRhIDw9IHR5cGVfY2hlY2tfc2VtaWJ5cGFzcwoJCWVuZCwgZnVuY3Rpb24oKQoJCQlyZWFsX21ldGFtZXRob2RzLl9fbGUgPSBkZWJ1Zy5pbmZvKDIsICJmIikKCQllbmQpCgkJeHBjYWxsKGZ1bmN0aW9uKCkKCQkJcmV0dXJuIHRhYmxlX29yX3VzZXJkYXRhIC4uIHR5cGVfY2hlY2tfc2VtaWJ5cGFzcwoJCWVuZCwgZnVuY3Rpb24oKQoJCQlyZWFsX21ldGFtZXRob2RzLl9fY29uY2F0ID0gZGVidWcuaW5mbygyLCAiZiIpCgkJZW5kKQoJCXJlYWxfbWV0YW1ldGhvZHMuX190eXBlID0gdHlwZW9mKHRhYmxlX29yX3VzZXJkYXRhKQoJCXJlYWxfbWV0YW1ldGhvZHMuX19tZXRhdGFibGUgPSBnZXRtZXRhdGFibGUoZ2FtZSkKCQlyZWFsX21ldGFtZXRob2RzLl9fdG9zdHJpbmcgPSBmdW5jdGlvbigpCgkJCXJldHVybiB0b3N0cmluZyh0YWJsZV9vcl91c2VyZGF0YSkKCQllbmQKCQlyZXR1cm4gcmVhbF9tZXRhbWV0aG9kcwoJZW5kCgoJZGVidWdfbGliLnNldG1ldGF0YWJsZSA9IHNldG1ldGF0YWJsZQoJCgkKCWRlYnVnID0gZGVidWdfbGliCgoJZnVuY3Rpb24gZ2V0cmF3bWV0YXRhYmxlKG9iamVjdCkKCQlhc3NlcnQodHlwZShvYmplY3QpID09ICJ0YWJsZSIgb3IgdHlwZShvYmplY3QpID09ICJ1c2VyZGF0YSIsICJpbnZhbGlkIGFyZ3VtZW50ICMxIHRvICdnZXRyYXdtZXRhdGFibGUnICh0YWJsZSBvciB1c2VyZGF0YSBleHBlY3RlZCwgZ290ICIgLi4gdHlwZShvYmplY3QpIC4uICIpIiwgMikKCQlsb2NhbCByYXdfbXQgPSBkZWJ1Zy5nZXRtZXRhdGFibGUob2JqZWN0KQoJCWlmIHJhd19tdCBhbmQgcmF3X210Ll9fbWV0YXRhYmxlIHRoZW4KCQkJcmF3X210Ll9fbWV0YXRhYmxlID0gbmlsIAoJCQlsb2NhbCByZXN1bHRfbXQgPSBkZWJ1Zy5nZXRtZXRhdGFibGUob2JqZWN0KQoJCQlyYXdfbXQuX19tZXRhdGFibGUgPSAiTG9ja2VkISIKCQkJcmV0dXJuIHJlc3VsdF9tdAoJCWVuZAoJCXJldHVybiByYXdfbXQKCWVuZAoKCWZ1bmN0aW9uIHNldHJhd21ldGF0YWJsZShvYmplY3QsIG5ld21ldGF0YmwpCgkJYXNzZXJ0KHR5cGUob2JqZWN0KSA9PSAidGFibGUiIG9yIHR5cGUob2JqZWN0KSA9PSAidXNlcmRhdGEiLCAiaW52YWxpZCBhcmd1bWVudCAjMSB0byAnc2V0cmF3bWV0YXRhYmxlJyAodGFibGUgb3IgdXNlcmRhdGEgZXhwZWN0ZWQsIGdvdCAiIC4uIHR5cGUob2JqZWN0KSAuLiAiKSIsIDIpCgkJYXNzZXJ0KHR5cGUobmV3bWV0YXRibCkgPT0gInRhYmxlIiBvciB0eXBlKG5ld21ldGF0YmwpID09IG5pbCwgImludmFsaWQgYXJndW1lbnQgIzIgdG8gJ3NldHJhd21ldGF0YWJsZScgKHRhYmxlIG9yIG5pbCBleHBlY3RlZCwgZ290ICIgLi4gdHlwZShvYmplY3QpIC4uICIpIiwgMikKCQlsb2NhbCByYXdfbXQgPSBkZWJ1Zy5nZXRtZXRhdGFibGUob2JqZWN0KQoJCWlmIHJhd19tdCBhbmQgcmF3X210Ll9fbWV0YXRhYmxlIHRoZW4KCQkJbG9jYWwgb2xkX21ldGF0YWJsZSA9IHJhd19tdC5fX21ldGF0YWJsZQoJCQlyYXdfbXQuX19tZXRhdGFibGUgPSBuaWwgIAoJCQlsb2NhbCBzdWNjZXNzLCBlcnIgPSBwY2FsbChzZXRtZXRhdGFibGUsIG9iamVjdCwgbmV3bWV0YXRibCkKCQkJcmF3X210Ll9fbWV0YXRhYmxlID0gb2xkX21ldGF0YWJsZQoJCQlpZiBub3Qgc3VjY2VzcyB0aGVuCgkJCQllcnJvcigiZmFpbGVkIHRvIHNldCBtZXRhdGFibGUgOiAiIC4uIHRvc3RyaW5nKGVyciksIDIpCgkJCWVuZAoJCQlyZXR1cm4gdHJ1ZSAgCgkJZW5kCgkJc2V0bWV0YXRhYmxlKG9iamVjdCwgbmV3bWV0YXRibCkKCQlyZXR1cm4gdHJ1ZQoJZW5kCgkKCWNhY2hlID0ge30KCQoJbG9jYWwgQ2xvbmVSZWZzID0geyBDbG9uZXMgPSBzZXRtZXRhdGFibGUoe30sIHsgX19tb2RlID0gImtzIiB9KSwgT3JpZ2luYWxzID0gc2V0bWV0YXRhYmxlKHt9LCB7IF9fbW9kZSA9ICJ2cyIgfSkgfSAtLSpzIG1lYW5zIHNocmlua2FibGUsIHdlYWsga2V5cyBmb3IgQ2xvbmVzIGJlY2F1c2Ugc3RydWN0dXJlIGlzIHtDbG9uZSA9IE9yaWdpbmFsc1tPcmlnaW5hbEluc3RhbmNlXX0gc28gd2hlbiBjbG9uZSBnZXRzIGdhcmJhZ2UgY29sbGVjdGVkIHRoZSBvbmx5IHJlZiB0byB2YWx1ZSBpbnNpZGUgT3JpZ2luYWxzIHRhYmxlIGlzIGdhcmJhZ2UgY29sbGVjdGVkIHRvbyBiZWNhdXNlIE9yaWdpbmFscyBoYXMgd2VhayB2YWx1ZXMKCQoJZG8KCQlsb2NhbCBmdW5jdGlvbiBSZXR1cm5PcmlnaW5hbChpbnN0YW5jZSkgLS0hIFRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgbmVlZGVkIHRvIGNhbGwgaW4gb3RoZXIgZnVuY3Rpb25zICh0ZXN0aW5nIHJlcXVpcmVkKQoJCQlsb2NhbCBDbG9uZUluZm8gPSBDbG9uZVJlZnMuQ2xvbmVzW2luc3RhbmNlXSAtLSAqQ2hlY2tzIGlmIGl0cyBhIGNsb25lIGFuZCBub3QgYSByZWFsIGluc3RhbmNlCgkKCQkJaWYgQ2xvbmVJbmZvIHRoZW4KCQkJCXJldHVybiBDbG9uZUluZm8uT3JpZ2luYWwgLS0gKkdyYWJzIHRoZSBvcmlnaW5hbCBpbnN0YW5jZSB0aGVuCgkJCWVuZAoJCWVuZAoJCgkJCgkKCQlmdW5jdGlvbiBjYWNoZS5jbG9uZXJlZihpbnN0YW5jZSkKCQkJbG9jYWwgT3JpZ2luYWwgPSBSZXR1cm5PcmlnaW5hbChpbnN0YW5jZSkKCQkJaWYgT3JpZ2luYWwgdGhlbgoJCQkJaW5zdGFuY2UgPSBPcmlnaW5hbAoJCQllbmQKCQoJCQlsb2NhbCBDbG9uZSA9IG5ld3Byb3h5KHRydWUpCgkJCWxvY2FsIE10X0Nsb25lID0gZ2V0bWV0YXRhYmxlKENsb25lKQoJCQlsb2NhbCBNdF9SZWFsID0gZ2V0cmF3bWV0YXRhYmxlKGluc3RhbmNlKQoJCgkJCWxvY2FsIENsb25lSW5mbyA9IENsb25lUmVmcy5PcmlnaW5hbHNbaW5zdGFuY2VdIC0tKiBJZiB0aGlzIGV4aXN0cyB0aGVuIEluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gY2xvbmVkIGF0IGxlYXN0IG9uY2UKCQkJaWYgbm90IENsb25lSW5mbyB0aGVuCgkJCQlDbG9uZUluZm8gPSB7IE9yaWdpbmFsID0gaW5zdGFuY2UsIF9fdHlwZSA9IE10X1JlYWwuX190eXBlIH0KCQkJCUNsb25lUmVmcy5PcmlnaW5hbHNbaW5zdGFuY2VdID0gQ2xvbmVJbmZvCgkJCWVuZAoJCgkJCUNsb25lUmVmcy5DbG9uZXNbQ2xvbmVdID0gQ2xvbmVJbmZvIC0tKiBBbGwgY2xvbmVzIG9mIHRoZSBzYW1lIGluc3RhbmNlIHBvaW50IHRvIHRoZSBzYW1lIHRhYmxlCgkKCQkJZm9yIE1ldGFtZXRob2QsIFZhbHVlIGluIE10X1JlYWwgZG8KCQkJCU10X0Nsb25lW01ldGFtZXRob2RdID0gdHlwZShWYWx1ZSkgPT0gImZ1bmN0aW9uIgoJCQkJCQlhbmQgZnVuY3Rpb24oc2VsZiwgLi4uKQoJCQkJCQkJcmV0dXJuIFZhbHVlKGluc3RhbmNlLCAuLi4pCgkJCQkJCWVuZAoJCQkJCW9yIFZhbHVlCgkJCWVuZAoJCgkJCXJldHVybiBDbG9uZSAtLSwgaWYgTXRfQ2xvbmUgdGhlbiBNdF9DbG9uZSBlbHNlIG5pbCAtLSBNYWtlIHN1cmUgdGhpcyBvbmx5IHdvcmtzIGluc2lkZSBpbml0IHNjcmlwdAoJCWVuZAoJCWZ1bmN0aW9uIGNhY2hlLmNvbXBhcmVpbnN0YW5jZXMoaW5zdGFuY2UsIGluc3RhbmNlMikKCQkJLS0gYXNzZXJ0KHR5cGVvZihpbnN0YW5jZSkgPT0gIkluc3RhbmNlIiwgYGFyZyAjMSBtdXN0IGJlIHR5cGUgSW5zdGFuY2VgKSAtLSBVbmNvbW1lbnQgd2hlbiB3ZSBzdGFydCBob29raW5nIHR5cGVvZgoJCQktLSBhc3NlcnQodHlwZW9mKGluc3RhbmNlMikgPT0gIkluc3RhbmNlIiwgYGFyZyAjMiBtdXN0IGJlIHR5cGUgSW5zdGFuY2VgKSAtLSBVbmNvbW1lbnQgd2hlbiB3ZSBzdGFydCBob29raW5nIHR5cGVvZgoJCgkJCWxvY2FsIENsb25lSW5mbyA9IENsb25lUmVmcy5DbG9uZXNbaW5zdGFuY2VdIC0tICpDaGVja3MgaWYgaXRzIGEgY2xvbmUgYW5kIG5vdCBhIHJlYWwgaW5zdGFuY2UKCQkJbG9jYWwgQ2xvbmVJbmZvMiA9IENsb25lUmVmcy5DbG9uZXNbaW5zdGFuY2UyXSAtLSAqQ2hlY2tzIGlmIGl0cyBhIGNsb25lIGFuZCBub3QgYSByZWFsIGluc3RhbmNlCgkJCWlmIENsb25lSW5mbyB0aGVuCgkJCQlpbnN0YW5jZSA9IENsb25lSW5mby5PcmlnaW5hbAoJCQllbmQKCQkJaWYgQ2xvbmVJbmZvMiB0aGVuCgkJCQlpbnN0YW5jZTIgPSBDbG9uZUluZm8yLk9yaWdpbmFsCgkJCWVuZAoJCgkJCXJldHVybiBpbnN0YW5jZSA9PSBpbnN0YW5jZTIKCQllbmQKCQoJCWNhY2hlLmlzY2FjaGVkID0gZnVuY3Rpb24odGhpbmcpCgkJCWlmIGNhY2hlW3RoaW5nXSA9PSAnUkVNT1ZFJyB0aGVuIHJldHVybiBmYWxzZSBlbmQKCQkJcmV0dXJuIHR5cGVvZih0aGluZykgPT0gIkluc3RhbmNlIgoJCWVuZAoJCWNhY2hlLmludmFsaWRhdGUgPSBmdW5jdGlvbih0aGluZykKCQkJY2FjaGVbdGhpbmddID0gJ1JFTU9WRScKCQkJdGhpbmcuUGFyZW50ID0gbmlsCgkJZW5kCgkJY2FjaGUucmVwbGFjZSA9IGZ1bmN0aW9uKGEsIGIpCgkJCWlmIGNhY2hlW2FdIHRoZW4KCQkJCWNhY2hlW2FdID0gYgoJCQllbmQKCQkJbG9jYWwgbiwgcCA9IGEuTmFtZSwgYS5QYXJlbnQgLS0gbmFtZSwgcGFyZW50CgkJCWIuUGFyZW50ID0gcAoJCQliLk5hbWUgPSBuCgkJCWEuUGFyZW50ID0gbmlsCgkJZW5kCgkKCQlpc2NhY2hlZCA9IGNhY2hlLmlzY2FjaGVkCgkJY2xvbmVyZWYgPSBjYWNoZS5jbG9uZXJlZgoJCWludmFsaWRhdGUgPSBjYWNoZS5pbnZhbGlkYXRlCgkJcmVwbGFjZSA9IGNhY2hlLnJlcGxhY2UKCQljb21wYXJlaW5zdGFuY2VzID0gY2FjaGUuY29tcGFyZWluc3RhbmNlcwoJCgllbmQKCQoJLS0gb2JqZWN0cwoJbG9jYWwgY2FtZXJhID0gd29ya3NwYWNlLkN1cnJlbnRDYW1lcmEKCQoJZHJhd2luZ19jb250YWluZXIgPSBJbnN0YW5jZS5uZXcoIlNjcmVlbkd1aSIpCglkcmF3aW5nX2NvbnRhaW5lci5OYW1lID0gIkRyYXdpbmciCglkcmF3aW5nX2NvbnRhaW5lci5JZ25vcmVHdWlJbnNldCA9IHRydWUKCWRyYXdpbmdfY29udGFpbmVyLkRpc3BsYXlPcmRlciA9IDB4N2ZmZmZmZmYKCQoJbG9jYWwgd2VkZ2VfdGVtcGxhdGUgPSBJbnN0YW5jZS5uZXcoIkltYWdlTGFiZWwiKQoJd2VkZ2VfdGVtcGxhdGUuQmFja2dyb3VuZFRyYW5zcGFyZW5jeSA9IDEKCXdlZGdlX3RlbXBsYXRlLkFuY2hvclBvaW50ID0gVmVjdG9yMi5vbmUgLyAyCgl3ZWRnZV90ZW1wbGF0ZS5Cb3JkZXJTaXplUGl4ZWwgPSAwCgl3ZWRnZV90ZW1wbGF0ZS5JbWFnZSA9ICJyYnhhc3NldGlkOi8vMCIKCXdlZGdlX3RlbXBsYXRlLkltYWdlQ29sb3IzID0gQ29sb3IzLm5ldygpCgl3ZWRnZV90ZW1wbGF0ZS5aSW5kZXggPSAwCgkKCS0tIHZhcmlhYmxlcwoJbG9jYWwgdmVjdDJfaGFsZiA9IFZlY3RvcjIub25lIC8gMgoJbG9jYWwgZHJhd2luZ19pZHggPSAwCgkKCWRyYXdpbmdfb2JqX3JlZyA9IHt9CgkKCWxvY2FsIGJhc2VfZHJhd2luZ19vYmogPSBzZXRtZXRhdGFibGUoewoJCVZpc2libGUgPSB0cnVlLAoJCVpJbmRleCA9IDAsCgkJVHJhbnNwYXJlbmN5ID0gMSwKCQlDb2xvciA9IENvbG9yMy5uZXcoKSwKCQlSZW1vdmUgPSBmdW5jdGlvbihzZWxmKQoJCQlzZXRtZXRhdGFibGUoc2VsZiwgbmlsKQoJCgkJCWxvY2FsIG9ial9pZHggPSB0YWJsZS5maW5kKGRyYXdpbmdfb2JqX3JlZywgc2VsZikKCQkJaWYgb2JqX2lkeCB0aGVuCgkJCQl0YWJsZS5yZW1vdmUoZHJhd2luZ19vYmpfcmVnLCBvYmpfaWR4KQoJCQllbmQKCQllbmQsCgl9LCB7CgkJX19hZGQgPSBmdW5jdGlvbih0MSwgdDIpCgkJCWxvY2FsIHJlc3VsdCA9IHRhYmxlLmNsb25lKHQxKQoJCgkJCWZvciBpbmRleCwgdmFsdWUgaW4gdDIgZG8KCQkJCXJlc3VsdFtpbmRleF0gPSB2YWx1ZQoJCQllbmQKCQkJcmV0dXJuIHJlc3VsdAoJCWVuZCwKCX0pCgkKCWxvY2FsIGRyYXdpbmdfZm9udHNfbGlzdCA9IHsKCQlbMF0gPSBGb250LmZyb21FbnVtKEVudW0uRm9udC5CdWlsZGVyU2FucyksCgkJRm9udC5mcm9tRW51bShFbnVtLkZvbnQuQXJpYWwpLAoJCUZvbnQuZnJvbUVudW0oRW51bS5Gb250Lk51bml0byksCgkJRm9udC5mcm9tRW51bShFbnVtLkZvbnQuUm9ib3RvTW9ubyksCgl9CgkKCWxvY2FsIHRyaWFuZ2xlX2Fzc2V0cyA9IHsKCQlsZWZ0ID0gInJieGFzc2V0aWQ6Ly8zMTk2OTIxNzEiLAoJCXJpZ2h0ID0gInJieGFzc2V0aWQ6Ly8zMTk2OTIxNTEiLAoJfQoJCgktLSBmdW5jdGlvbgoJbG9jYWwgZnVuY3Rpb24gZ2V0X2ZvbnRfZnJvbV9pZHgoZm9udF9pZHg6IG51bWJlcik6IEZvbnQKCQlyZXR1cm4gZHJhd2luZ19mb250c19saXN0W2ZvbnRfaWR4XQoJZW5kCgkKCWxvY2FsIGZ1bmN0aW9uIGNvbnZlcnRfZHRyYW5zcGFyZW5jeSh0cmFuc3BhcmVuY3k6IG51bWJlcik6IG51bWJlcgoJCXJldHVybiBtYXRoLmNsYW1wKDEgLSB0cmFuc3BhcmVuY3ksIDAsIDEpCgllbmQKCQoJLS0gZnJvbSBlZ29tb29zZTogaHR0cHM6Ly9naXRodWIuY29tL0Vnb01vb3NlL0FydGljbGVzL2Jsb2IvbWFzdGVyLzJkJTIwdHJpYW5nbGVzLzJkJTIwdHJpYW5nbGVzLm1kCglsb2NhbCBmdW5jdGlvbiBuZXdfMmRfdHJpYW5nbGUocGFyZW50KQoJCWxvY2FsIHdlZGdlcyA9IHsKCQkJdzEgPSB3ZWRnZV90ZW1wbGF0ZTpDbG9uZSgpLAoJCQl3MiA9IHdlZGdlX3RlbXBsYXRlOkNsb25lKCksCgkJfQoJCWxvY2FsIGlzX2Rlc3Ryb3llZCA9IGZhbHNlCgkKCQl3ZWRnZXMudzEuUGFyZW50ID0gcGFyZW50CgkJd2VkZ2VzLncyLlBhcmVudCA9IHBhcmVudAoJCgkJbG9jYWwgZnVuY3Rpb24gY29uc3RydWN0X3RyaWFuZ2xlKHBvaW50X2EsIHBvaW50X2IsIHBvaW50X2MpCgkJCWlmIG5vdCAod2VkZ2VzLncxLlZpc2libGUgYW5kIHdlZGdlcy53Mi5WaXNpYmxlKSB0aGVuCgkJCQlyZXR1cm4KCQkJZW5kCgkKCQkJaWYgaXNfZGVzdHJveWVkIHRoZW4KCQkJCXJldHVybgoJCQllbmQKCQoJCQlsb2NhbCBhYiwgYWMsIGJjID0gcG9pbnRfYiAtIHBvaW50X2EsIHBvaW50X2MgLSBwb2ludF9hLCBwb2ludF9jIC0gcG9pbnRfYgoJCQlsb2NhbCBhYmQsIGFjZCwgYmNkID0gYWI6RG90KGFiKSwgYWM6RG90KGFjKSwgYmM6RG90KGJjKQoJCgkJCWlmIGFiZCA+IGFjZCBhbmQgYWJkID4gYmNkIHRoZW4KCQkJCXBvaW50X2MsIHBvaW50X2EgPSBwb2ludF9hLCBwb2ludF9jCgkJCWVsc2VpZiBhY2QgPiBiY2QgYW5kIGFjZCA+IGFiZCB0aGVuCgkJCQlwb2ludF9hLCBwb2ludF9iID0gcG9pbnRfYiwgcG9pbnRfYQoJCQllbmQKCQoJCQlhYiwgYWMsIGJjID0gKHBvaW50X2IgLSBwb2ludF9hKSwgKHBvaW50X2MgLSBwb2ludF9hKSwgKHBvaW50X2MgLSBwb2ludF9iKQoJCgkJCWxvY2FsIHVuaXQgPSBiYy5Vbml0CgkJCWxvY2FsIGhlaWdodCA9IHVuaXQ6Q3Jvc3MoYWIpCgkJCWxvY2FsIGZsaXAgPSAoaGVpZ2h0ID49IDApCgkJCWxvY2FsIHRoZXRhID0gbWF0aC5kZWcobWF0aC5hdGFuMih1bml0LnksIHVuaXQueCkpICsgKGlmIGZsaXAgdGhlbiAwIGVsc2UgMTgwKQoJCgkJCWxvY2FsIG0xID0gKHBvaW50X2EgKyBwb2ludF9iKSAvIDIKCQkJbG9jYWwgbTIgPSAocG9pbnRfYSArIHBvaW50X2MpIC8gMgoJCgkJCXdlZGdlcy53MS5JbWFnZSA9IChpZiBmbGlwIHRoZW4gdHJpYW5nbGVfYXNzZXRzLnJpZ2h0IGVsc2UgdHJpYW5nbGVfYXNzZXRzLmxlZnQpCgkJCXdlZGdlcy53MS5BbmNob3JQb2ludCA9IHZlY3QyX2hhbGYKCQkJd2VkZ2VzLncxLlNpemUgPSBVRGltMi5mcm9tT2Zmc2V0KG1hdGguYWJzKHVuaXQ6RG90KGFiKSksIGhlaWdodCkKCQkJd2VkZ2VzLncxLlBvc2l0aW9uID0gVURpbTIuZnJvbU9mZnNldChtMS54LCBtMS55KQoJCQl3ZWRnZXMudzEuUm90YXRpb24gPSB0aGV0YQoJCgkJCXdlZGdlcy53Mi5JbWFnZSA9IChpZiBmbGlwIHRoZW4gdHJpYW5nbGVfYXNzZXRzLmxlZnQgZWxzZSB0cmlhbmdsZV9hc3NldHMucmlnaHQpCgkJCXdlZGdlcy53Mi5BbmNob3JQb2ludCA9IHZlY3QyX2hhbGYKCQkJd2VkZ2VzLncyLlNpemUgPSBVRGltMi5mcm9tT2Zmc2V0KG1hdGguYWJzKHVuaXQ6RG90KGFjKSksIGhlaWdodCkKCQkJd2VkZ2VzLncyLlBvc2l0aW9uID0gVURpbTIuZnJvbU9mZnNldChtMi54LCBtMi55KQoJCQl3ZWRnZXMudzIuUm90YXRpb24gPSB0aGV0YQoJCWVuZAoJCgkJbG9jYWwgZnVuY3Rpb24gZGVzdHJveV90cmlhbmdsZSgpCgkJCWlzX2Rlc3Ryb3llZCA9IHRydWUKCQoJCQlmb3IgXywgb2JqIGluIHdlZGdlcyBkbwoJCQkJb2JqOkRlc3Ryb3koKQoJCQllbmQKCQkJdGFibGUuY2xlYXIod2VkZ2VzKQoJCWVuZAoJCXJldHVybiBjb25zdHJ1Y3RfdHJpYW5nbGUsIGRlc3Ryb3lfdHJpYW5nbGUsIHdlZGdlcwoJZW5kCgktLSBtYWluCglsb2NhbCBkcmF3aW5nX2xpYiA9IHt9CglkcmF3aW5nX2xpYi5Gb250cyA9IHsKCQlbIlVJIl0gPSAwLAoJCVsiU3lzdGVtIl0gPSAxLAoJCVsiUGxleCJdID0gMiwKCQlbIk1vbm9zcGFjZSJdID0gMywKCX0KCWRvCgkJbG9jYWwgZnVuY3Rpb24gbmV3KGRyYXdpbmdfdHlwZSkKCQkJZHJhd2luZ19pZHggKz0gMQoJCQlsb2NhbCBkcmF3aW5nX29iaiA9IHt9CgkKCQkJaWYgZHJhd2luZ190eXBlID09ICJMaW5lIiB0aGVuCgkJCQlsb2NhbCBkcmF3aW5nX2luZm8gPSAoCgkJCQkJewoJCQkJCQlGcm9tID0gVmVjdG9yMi56ZXJvLAoJCQkJCQlUbyA9IFZlY3RvcjIuemVybywKCQkJCQkJVGhpY2tuZXNzID0gMSwKCQkJCQl9ICsgYmFzZV9kcmF3aW5nX29iagoJCQkJKQoJCgkJCQlsb2NhbCBsaW5lRnJhbWUgPSBJbnN0YW5jZS5uZXcoIkZyYW1lIikKCQkJCWxpbmVGcmFtZS5OYW1lID0gZHJhd2luZ19pZHgKCQkJCWxpbmVGcmFtZS5BbmNob3JQb2ludCA9IChWZWN0b3IyLm9uZSAqIDAuNSkKCQkJCWxpbmVGcmFtZS5Cb3JkZXJTaXplUGl4ZWwgPSAwCgkKCQkJCWxpbmVGcmFtZS5CYWNrZ3JvdW5kQ29sb3IzID0gZHJhd2luZ19pbmZvLkNvbG9yCgkJCQlsaW5lRnJhbWUuVmlzaWJsZSA9IGRyYXdpbmdfaW5mby5WaXNpYmxlCgkJCQlsaW5lRnJhbWUuWkluZGV4ID0gZHJhd2luZ19pbmZvLlpJbmRleAoJCQkJbGluZUZyYW1lLkJhY2tncm91bmRUcmFuc3BhcmVuY3kgPSBjb252ZXJ0X2R0cmFuc3BhcmVuY3koZHJhd2luZ19pbmZvLlRyYW5zcGFyZW5jeSkKCQoJCQkJbGluZUZyYW1lLlNpemUgPSBVRGltMi5uZXcoKQoJCgkJCQlsaW5lRnJhbWUuUGFyZW50ID0gZHJhd2luZ19jb250YWluZXIKCQoJCQkJcmV0dXJuIHNldG1ldGF0YWJsZShkcmF3aW5nX29iaiwgewoJCQkJCV9fbmV3aW5kZXggPSBmdW5jdGlvbihfLCBpbmRleCwgdmFsdWUpCgkJCQkJCWlmIHR5cGUoZHJhd2luZ19pbmZvW2luZGV4XSkgPT0gIm5pbCIgdGhlbgoJCQkJCQkJcmV0dXJuCgkJCQkJCWVuZAoJCgkJCQkJCWlmIGluZGV4ID09ICJGcm9tIiB0aGVuCgkJCQkJCQlsb2NhbCBkaXJlY3Rpb24gPSAoZHJhd2luZ19pbmZvLlRvIC0gdmFsdWUpCgkJCQkJCQlsb2NhbCBjZW50ZXIgPSAoZHJhd2luZ19pbmZvLlRvICsgdmFsdWUpIC8gMgoJCQkJCQkJbG9jYWwgZGlzdGFuY2UgPSBkaXJlY3Rpb24uTWFnbml0dWRlCgkJCQkJCQlsb2NhbCB0aGV0YSA9IG1hdGguZGVnKG1hdGguYXRhbjIoZGlyZWN0aW9uLlksIGRpcmVjdGlvbi5YKSkKCQoJCQkJCQkJbGluZUZyYW1lLlBvc2l0aW9uID0gVURpbTIuZnJvbU9mZnNldChjZW50ZXIuWCwgY2VudGVyLlkpCgkJCQkJCQlsaW5lRnJhbWUuUm90YXRpb24gPSB0aGV0YQoJCQkJCQkJbGluZUZyYW1lLlNpemUgPSBVRGltMi5mcm9tT2Zmc2V0KGRpc3RhbmNlLCBkcmF3aW5nX2luZm8uVGhpY2tuZXNzKQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIlRvIiB0aGVuCgkJCQkJCQlsb2NhbCBkaXJlY3Rpb24gPSAodmFsdWUgLSBkcmF3aW5nX2luZm8uRnJvbSkKCQkJCQkJCWxvY2FsIGNlbnRlciA9ICh2YWx1ZSArIGRyYXdpbmdfaW5mby5Gcm9tKSAvIDIKCQkJCQkJCWxvY2FsIGRpc3RhbmNlID0gZGlyZWN0aW9uLk1hZ25pdHVkZQoJCQkJCQkJbG9jYWwgdGhldGEgPSBtYXRoLmRlZyhtYXRoLmF0YW4yKGRpcmVjdGlvbi5ZLCBkaXJlY3Rpb24uWCkpCgkKCQkJCQkJCWxpbmVGcmFtZS5Qb3NpdGlvbiA9IFVEaW0yLmZyb21PZmZzZXQoY2VudGVyLlgsIGNlbnRlci5ZKQoJCQkJCQkJbGluZUZyYW1lLlJvdGF0aW9uID0gdGhldGEKCQkJCQkJCWxpbmVGcmFtZS5TaXplID0gVURpbTIuZnJvbU9mZnNldChkaXN0YW5jZSwgZHJhd2luZ19pbmZvLlRoaWNrbmVzcykKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJUaGlja25lc3MiIHRoZW4KCQkJCQkJCWxvY2FsIGRpc3RhbmNlID0gKGRyYXdpbmdfaW5mby5UbyAtIGRyYXdpbmdfaW5mby5Gcm9tKS5NYWduaXR1ZGUKCQoJCQkJCQkJbGluZUZyYW1lLlNpemUgPSBVRGltMi5mcm9tT2Zmc2V0KGRpc3RhbmNlLCB2YWx1ZSkKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJWaXNpYmxlIiB0aGVuCgkJCQkJCQlsaW5lRnJhbWUuVmlzaWJsZSA9IHZhbHVlCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiWkluZGV4IiB0aGVuCgkJCQkJCQlsaW5lRnJhbWUuWkluZGV4ID0gdmFsdWUKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJUcmFuc3BhcmVuY3kiIHRoZW4KCQkJCQkJCWxpbmVGcmFtZS5CYWNrZ3JvdW5kVHJhbnNwYXJlbmN5ID0gY29udmVydF9kdHJhbnNwYXJlbmN5KHZhbHVlKQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIkNvbG9yIiB0aGVuCgkJCQkJCQlsaW5lRnJhbWUuQmFja2dyb3VuZENvbG9yMyA9IHZhbHVlCgkJCQkJCWVuZAoJCQkJCQlkcmF3aW5nX2luZm9baW5kZXhdID0gdmFsdWUKCQkJCQllbmQsCgkJCQkJX19pbmRleCA9IGZ1bmN0aW9uKHNlbGYsIGluZGV4KQoJCQkJCQlpZiBpbmRleCA9PSAiUmVtb3ZlIiBvciBpbmRleCA9PSAiRGVzdHJveSIgdGhlbgoJCQkJCQkJcmV0dXJuIGZ1bmN0aW9uKCkKCQkJCQkJCQlsaW5lRnJhbWU6RGVzdHJveSgpCgkJCQkJCQkJZHJhd2luZ19pbmZvLlJlbW92ZShzZWxmKQoJCQkJCQkJCXJldHVybiBkcmF3aW5nX2luZm86UmVtb3ZlKCkKCQkJCQkJCWVuZAoJCQkJCQllbmQKCQkJCQkJcmV0dXJuIGRyYXdpbmdfaW5mb1tpbmRleF0KCQkJCQllbmQsCgkJCQl9KQoJCQllbHNlaWYgZHJhd2luZ190eXBlID09ICJUZXh0IiB0aGVuCgkJCQlsb2NhbCBkcmF3aW5nX2luZm8gPSAoCgkJCQkJewoJCQkJCQlUZXh0ID0gIiIsCgkJCQkJCUZvbnQgPSBkcmF3aW5nX2xpYi5Gb250cy5VSSwKCQkJCQkJU2l6ZSA9IDAsCgkJCQkJCVBvc2l0aW9uID0gVmVjdG9yMi56ZXJvLAoJCQkJCQlDZW50ZXIgPSBmYWxzZSwKCQkJCQkJT3V0bGluZSA9IGZhbHNlLAoJCQkJCQlPdXRsaW5lQ29sb3IgPSBDb2xvcjMubmV3KCksCgkJCQkJfSArIGJhc2VfZHJhd2luZ19vYmoKCQkJCSkKCQoJCQkJbG9jYWwgdGV4dExhYmVsLCB1aVN0cm9rZSA9IEluc3RhbmNlLm5ldygiVGV4dExhYmVsIiksIEluc3RhbmNlLm5ldygiVUlTdHJva2UiKQoJCQkJdGV4dExhYmVsLk5hbWUgPSBkcmF3aW5nX2lkeAoJCQkJdGV4dExhYmVsLkFuY2hvclBvaW50ID0gKFZlY3RvcjIub25lICogMC41KQoJCQkJdGV4dExhYmVsLkJvcmRlclNpemVQaXhlbCA9IDAKCQkJCXRleHRMYWJlbC5CYWNrZ3JvdW5kVHJhbnNwYXJlbmN5ID0gMQoJCgkJCQl0ZXh0TGFiZWwuVmlzaWJsZSA9IGRyYXdpbmdfaW5mby5WaXNpYmxlCgkJCQl0ZXh0TGFiZWwuVGV4dENvbG9yMyA9IGRyYXdpbmdfaW5mby5Db2xvcgoJCQkJdGV4dExhYmVsLlRleHRUcmFuc3BhcmVuY3kgPSBjb252ZXJ0X2R0cmFuc3BhcmVuY3koZHJhd2luZ19pbmZvLlRyYW5zcGFyZW5jeSkKCQkJCXRleHRMYWJlbC5aSW5kZXggPSBkcmF3aW5nX2luZm8uWkluZGV4CgkKCQkJCXRleHRMYWJlbC5Gb250RmFjZSA9IGdldF9mb250X2Zyb21faWR4KGRyYXdpbmdfaW5mby5Gb250KQoJCQkJdGV4dExhYmVsLlRleHRTaXplID0gZHJhd2luZ19pbmZvLlNpemUKCQoJCQkJdGV4dExhYmVsOkdldFByb3BlcnR5Q2hhbmdlZFNpZ25hbCgiVGV4dEJvdW5kcyIpOkNvbm5lY3QoZnVuY3Rpb24oKQoJCQkJCWxvY2FsIHRleHRCb3VuZHMgPSB0ZXh0TGFiZWwuVGV4dEJvdW5kcwoJCQkJCWxvY2FsIG9mZnNldCA9IHRleHRCb3VuZHMgLyAyCgkKCQkJCQl0ZXh0TGFiZWwuU2l6ZSA9IFVEaW0yLmZyb21PZmZzZXQodGV4dEJvdW5kcy5YLCB0ZXh0Qm91bmRzLlkpCgkJCQkJdGV4dExhYmVsLlBvc2l0aW9uID0gVURpbTIuZnJvbU9mZnNldCgKCQkJCQkJZHJhd2luZ19pbmZvLlBvc2l0aW9uLlggKyAoaWYgbm90IGRyYXdpbmdfaW5mby5DZW50ZXIgdGhlbiBvZmZzZXQuWCBlbHNlIDApLAoJCQkJCQlkcmF3aW5nX2luZm8uUG9zaXRpb24uWSArIG9mZnNldC5ZCgkJCQkJKQoJCQkJZW5kKQoJCgkJCQl1aVN0cm9rZS5UaGlja25lc3MgPSAxCgkJCQl1aVN0cm9rZS5FbmFibGVkID0gZHJhd2luZ19pbmZvLk91dGxpbmUKCQkJCXVpU3Ryb2tlLkNvbG9yID0gZHJhd2luZ19pbmZvLkNvbG9yCgkKCQkJCXRleHRMYWJlbC5QYXJlbnQsIHVpU3Ryb2tlLlBhcmVudCA9IGRyYXdpbmdfY29udGFpbmVyLCB0ZXh0TGFiZWwKCQkJCXJldHVybiBzZXRtZXRhdGFibGUoZHJhd2luZ19vYmosIHsKCQkJCQlfX25ld2luZGV4ID0gZnVuY3Rpb24oXywgaW5kZXgsIHZhbHVlKQoJCQkJCQlpZiB0eXBlKGRyYXdpbmdfaW5mb1tpbmRleF0pID09ICJuaWwiIHRoZW4KCQkJCQkJCXJldHVybgoJCQkJCQllbmQKCQoJCQkJCQlpZiBpbmRleCA9PSAiVGV4dCIgdGhlbgoJCQkJCQkJdGV4dExhYmVsLlRleHQgPSB2YWx1ZQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIkZvbnQiIHRoZW4KCQkJCQkJCXZhbHVlID0gbWF0aC5jbGFtcCh2YWx1ZSwgMCwgMykKCQkJCQkJCXRleHRMYWJlbC5Gb250RmFjZSA9IGdldF9mb250X2Zyb21faWR4KHZhbHVlKQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIlNpemUiIHRoZW4KCQkJCQkJCXRleHRMYWJlbC5UZXh0U2l6ZSA9IHZhbHVlCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiUG9zaXRpb24iIHRoZW4KCQkJCQkJCWxvY2FsIG9mZnNldCA9IHRleHRMYWJlbC5UZXh0Qm91bmRzIC8gMgoJCgkJCQkJCQl0ZXh0TGFiZWwuUG9zaXRpb24gPSBVRGltMi5mcm9tT2Zmc2V0KAoJCQkJCQkJCXZhbHVlLlggKyAoaWYgbm90IGRyYXdpbmdfaW5mby5DZW50ZXIgdGhlbiBvZmZzZXQuWCBlbHNlIDApLAoJCQkJCQkJCXZhbHVlLlkgKyBvZmZzZXQuWQoJCQkJCQkJKQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIkNlbnRlciIgdGhlbgoJCQkJCQkJbG9jYWwgcG9zaXRpb24gPSAoaWYgdmFsdWUgdGhlbiBjYW1lcmEuVmlld3BvcnRTaXplIC8gMiBlbHNlIGRyYXdpbmdfaW5mby5Qb3NpdGlvbikKCQoJCQkJCQkJdGV4dExhYmVsLlBvc2l0aW9uID0gVURpbTIuZnJvbU9mZnNldChwb3NpdGlvbi5YLCBwb3NpdGlvbi5ZKQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIk91dGxpbmUiIHRoZW4KCQkJCQkJCXVpU3Ryb2tlLkVuYWJsZWQgPSB2YWx1ZQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIk91dGxpbmVDb2xvciIgdGhlbgoJCQkJCQkJdWlTdHJva2UuQ29sb3IgPSB2YWx1ZQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIlZpc2libGUiIHRoZW4KCQkJCQkJCXRleHRMYWJlbC5WaXNpYmxlID0gdmFsdWUKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJaSW5kZXgiIHRoZW4KCQkJCQkJCXRleHRMYWJlbC5aSW5kZXggPSB2YWx1ZQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIlRyYW5zcGFyZW5jeSIgdGhlbgoJCQkJCQkJbG9jYWwgdHJhbnNwYXJlbmN5ID0gY29udmVydF9kdHJhbnNwYXJlbmN5KHZhbHVlKQoJCgkJCQkJCQl0ZXh0TGFiZWwuVGV4dFRyYW5zcGFyZW5jeSA9IHRyYW5zcGFyZW5jeQoJCQkJCQkJdWlTdHJva2UuVHJhbnNwYXJlbmN5ID0gdHJhbnNwYXJlbmN5CgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiQ29sb3IiIHRoZW4KCQkJCQkJCXRleHRMYWJlbC5UZXh0Q29sb3IzID0gdmFsdWUKCQkJCQkJZW5kCgkJCQkJCWRyYXdpbmdfaW5mb1tpbmRleF0gPSB2YWx1ZQoJCQkJCWVuZCwKCQkJCQlfX2luZGV4ID0gZnVuY3Rpb24oc2VsZiwgaW5kZXgpCgkJCQkJCWlmIGluZGV4ID09ICJSZW1vdmUiIG9yIGluZGV4ID09ICJEZXN0cm95IiB0aGVuCgkJCQkJCQlyZXR1cm4gZnVuY3Rpb24oKQoJCQkJCQkJCXRleHRMYWJlbDpEZXN0cm95KCkKCQkJCQkJCQlkcmF3aW5nX2luZm8uUmVtb3ZlKHNlbGYpCgkJCQkJCQkJcmV0dXJuIGRyYXdpbmdfaW5mbzpSZW1vdmUoKQoJCQkJCQkJZW5kCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiVGV4dEJvdW5kcyIgdGhlbgoJCQkJCQkJcmV0dXJuIHRleHRMYWJlbC5UZXh0Qm91bmRzCgkJCQkJCWVuZAoJCQkJCQlyZXR1cm4gZHJhd2luZ19pbmZvW2luZGV4XQoJCQkJCWVuZCwKCQkJCX0pCgkJCWVsc2VpZiBkcmF3aW5nX3R5cGUgPT0gIkNpcmNsZSIgdGhlbgoJCQkJbG9jYWwgZHJhd2luZ19pbmZvID0gKAoJCQkJCXsKCQkJCQkJUmFkaXVzID0gMTUwLAoJCQkJCQlQb3NpdGlvbiA9IFZlY3RvcjIuemVybywKCQkJCQkJVGhpY2tuZXNzID0gMC43LAoJCQkJCQlGaWxsZWQgPSBmYWxzZSwKCQkJCQl9ICsgYmFzZV9kcmF3aW5nX29iagoJCQkJKQoJCgkJCQlsb2NhbCBjaXJjbGVGcmFtZSwgdWlDb3JuZXIsIHVpU3Ryb2tlID0KCQkJCQlJbnN0YW5jZS5uZXcoIkZyYW1lIiksIEluc3RhbmNlLm5ldygiVUlDb3JuZXIiKSwgSW5zdGFuY2UubmV3KCJVSVN0cm9rZSIpCgkJCQljaXJjbGVGcmFtZS5OYW1lID0gZHJhd2luZ19pZHgKCQkJCWNpcmNsZUZyYW1lLkFuY2hvclBvaW50ID0gKFZlY3RvcjIub25lICogMC41KQoJCQkJY2lyY2xlRnJhbWUuQm9yZGVyU2l6ZVBpeGVsID0gMAoJCgkJCQljaXJjbGVGcmFtZS5CYWNrZ3JvdW5kVHJhbnNwYXJlbmN5ID0gKAoJCQkJCWlmIGRyYXdpbmdfaW5mby5GaWxsZWQgdGhlbiBjb252ZXJ0X2R0cmFuc3BhcmVuY3koZHJhd2luZ19pbmZvLlRyYW5zcGFyZW5jeSkgZWxzZSAxCgkJCQkpCgkJCQljaXJjbGVGcmFtZS5CYWNrZ3JvdW5kQ29sb3IzID0gZHJhd2luZ19pbmZvLkNvbG9yCgkJCQljaXJjbGVGcmFtZS5WaXNpYmxlID0gZHJhd2luZ19pbmZvLlZpc2libGUKCQkJCWNpcmNsZUZyYW1lLlpJbmRleCA9IGRyYXdpbmdfaW5mby5aSW5kZXgKCQoJCQkJdWlDb3JuZXIuQ29ybmVyUmFkaXVzID0gVURpbS5uZXcoMSwgMCkKCQkJCWNpcmNsZUZyYW1lLlNpemUgPSBVRGltMi5mcm9tT2Zmc2V0KGRyYXdpbmdfaW5mby5SYWRpdXMsIGRyYXdpbmdfaW5mby5SYWRpdXMpCgkKCQkJCXVpU3Ryb2tlLlRoaWNrbmVzcyA9IGRyYXdpbmdfaW5mby5UaGlja25lc3MKCQkJCXVpU3Ryb2tlLkVuYWJsZWQgPSBub3QgZHJhd2luZ19pbmZvLkZpbGxlZAoJCQkJdWlTdHJva2UuQXBwbHlTdHJva2VNb2RlID0gRW51bS5BcHBseVN0cm9rZU1vZGUuQm9yZGVyCgkKCQkJCWNpcmNsZUZyYW1lLlBhcmVudCwgdWlDb3JuZXIuUGFyZW50LCB1aVN0cm9rZS5QYXJlbnQgPSBkcmF3aW5nX2NvbnRhaW5lciwgY2lyY2xlRnJhbWUsIGNpcmNsZUZyYW1lCgkJCQlyZXR1cm4gc2V0bWV0YXRhYmxlKGRyYXdpbmdfb2JqLCB7CgkJCQkJX19uZXdpbmRleCA9IGZ1bmN0aW9uKF8sIGluZGV4LCB2YWx1ZSkKCQkJCQkJaWYgdHlwZShkcmF3aW5nX2luZm9baW5kZXhdKSA9PSAibmlsIiB0aGVuCgkJCQkJCQlyZXR1cm4KCQkJCQkJZW5kCgkKCQkJCQkJaWYgaW5kZXggPT0gIlJhZGl1cyIgdGhlbgoJCQkJCQkJbG9jYWwgcmFkaXVzID0gdmFsdWUgKiAyCgkJCQkJCQljaXJjbGVGcmFtZS5TaXplID0gVURpbTIuZnJvbU9mZnNldChyYWRpdXMsIHJhZGl1cykKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJQb3NpdGlvbiIgdGhlbgoJCQkJCQkJY2lyY2xlRnJhbWUuUG9zaXRpb24gPSBVRGltMi5mcm9tT2Zmc2V0KHZhbHVlLlgsIHZhbHVlLlkpCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiVGhpY2tuZXNzIiB0aGVuCgkJCQkJCQl2YWx1ZSA9IG1hdGguY2xhbXAodmFsdWUsIDAuNiwgMHg3ZmZmZmZmZikKCQkJCQkJCXVpU3Ryb2tlLlRoaWNrbmVzcyA9IHZhbHVlCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiRmlsbGVkIiB0aGVuCgkJCQkJCQljaXJjbGVGcmFtZS5CYWNrZ3JvdW5kVHJhbnNwYXJlbmN5ID0gKAoJCQkJCQkJCWlmIHZhbHVlIHRoZW4gY29udmVydF9kdHJhbnNwYXJlbmN5KGRyYXdpbmdfaW5mby5UcmFuc3BhcmVuY3kpIGVsc2UgMQoJCQkJCQkJKQoJCQkJCQkJdWlTdHJva2UuRW5hYmxlZCA9IG5vdCB2YWx1ZQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIlZpc2libGUiIHRoZW4KCQkJCQkJCWNpcmNsZUZyYW1lLlZpc2libGUgPSB2YWx1ZQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIlpJbmRleCIgdGhlbgoJCQkJCQkJY2lyY2xlRnJhbWUuWkluZGV4ID0gdmFsdWUKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJUcmFuc3BhcmVuY3kiIHRoZW4KCQkJCQkJCWxvY2FsIHRyYW5zcGFyZW5jeSA9IGNvbnZlcnRfZHRyYW5zcGFyZW5jeSh2YWx1ZSkKCQoJCQkJCQkJY2lyY2xlRnJhbWUuQmFja2dyb3VuZFRyYW5zcGFyZW5jeSA9IChpZiBkcmF3aW5nX2luZm8uRmlsbGVkIHRoZW4gdHJhbnNwYXJlbmN5IGVsc2UgMSkKCQkJCQkJCXVpU3Ryb2tlLlRyYW5zcGFyZW5jeSA9IHRyYW5zcGFyZW5jeQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIkNvbG9yIiB0aGVuCgkJCQkJCQljaXJjbGVGcmFtZS5CYWNrZ3JvdW5kQ29sb3IzID0gdmFsdWUKCQkJCQkJCXVpU3Ryb2tlLkNvbG9yID0gdmFsdWUKCQkJCQkJZW5kCgkJCQkJCWRyYXdpbmdfaW5mb1tpbmRleF0gPSB2YWx1ZQoJCQkJCWVuZCwKCQkJCQlfX2luZGV4ID0gZnVuY3Rpb24oc2VsZiwgaW5kZXgpCgkJCQkJCWlmIGluZGV4ID09ICJSZW1vdmUiIG9yIGluZGV4ID09ICJEZXN0cm95IiB0aGVuCgkJCQkJCQlyZXR1cm4gZnVuY3Rpb24oKQoJCQkJCQkJCWNpcmNsZUZyYW1lOkRlc3Ryb3koKQoJCQkJCQkJCWRyYXdpbmdfaW5mby5SZW1vdmUoc2VsZikKCQkJCQkJCQlyZXR1cm4gZHJhd2luZ19pbmZvOlJlbW92ZSgpCgkJCQkJCQllbmQKCQkJCQkJZW5kCgkJCQkJCXJldHVybiBkcmF3aW5nX2luZm9baW5kZXhdCgkJCQkJZW5kLAoJCQkJfSkKCQkJZWxzZWlmIGRyYXdpbmdfdHlwZSA9PSAiU3F1YXJlIiB0aGVuCgkJCQlsb2NhbCBkcmF3aW5nX2luZm8gPSAoCgkJCQkJewoJCQkJCQlTaXplID0gVmVjdG9yMi56ZXJvLAoJCQkJCQlQb3NpdGlvbiA9IFZlY3RvcjIuemVybywKCQkJCQkJVGhpY2tuZXNzID0gMC43LAoJCQkJCQlGaWxsZWQgPSBmYWxzZSwKCQkJCQl9ICsgYmFzZV9kcmF3aW5nX29iagoJCQkJKQoJCgkJCQlsb2NhbCBzcXVhcmVGcmFtZSwgdWlTdHJva2UgPSBJbnN0YW5jZS5uZXcoIkZyYW1lIiksIEluc3RhbmNlLm5ldygiVUlTdHJva2UiKQoJCQkJc3F1YXJlRnJhbWUuTmFtZSA9IGRyYXdpbmdfaWR4CgkJCQlzcXVhcmVGcmFtZS5Cb3JkZXJTaXplUGl4ZWwgPSAwCgkKCQkJCXNxdWFyZUZyYW1lLkJhY2tncm91bmRUcmFuc3BhcmVuY3kgPSAoCgkJCQkJaWYgZHJhd2luZ19pbmZvLkZpbGxlZCB0aGVuIGNvbnZlcnRfZHRyYW5zcGFyZW5jeShkcmF3aW5nX2luZm8uVHJhbnNwYXJlbmN5KSBlbHNlIDEKCQkJCSkKCQkJCXNxdWFyZUZyYW1lLlpJbmRleCA9IGRyYXdpbmdfaW5mby5aSW5kZXgKCQkJCXNxdWFyZUZyYW1lLkJhY2tncm91bmRDb2xvcjMgPSBkcmF3aW5nX2luZm8uQ29sb3IKCQkJCXNxdWFyZUZyYW1lLlZpc2libGUgPSBkcmF3aW5nX2luZm8uVmlzaWJsZQoJCgkJCQl1aVN0cm9rZS5UaGlja25lc3MgPSBkcmF3aW5nX2luZm8uVGhpY2tuZXNzCgkJCQl1aVN0cm9rZS5FbmFibGVkID0gbm90IGRyYXdpbmdfaW5mby5GaWxsZWQKCQkJCXVpU3Ryb2tlLkxpbmVKb2luTW9kZSA9IEVudW0uTGluZUpvaW5Nb2RlLk1pdGVyCgkKCQkJCXNxdWFyZUZyYW1lLlBhcmVudCwgdWlTdHJva2UuUGFyZW50ID0gZHJhd2luZ19jb250YWluZXIsIHNxdWFyZUZyYW1lCgkJCQlyZXR1cm4gc2V0bWV0YXRhYmxlKGRyYXdpbmdfb2JqLCB7CgkJCQkJX19uZXdpbmRleCA9IGZ1bmN0aW9uKF8sIGluZGV4LCB2YWx1ZSkKCQkJCQkJaWYgdHlwZShkcmF3aW5nX2luZm9baW5kZXhdKSA9PSAibmlsIiB0aGVuCgkJCQkJCQlyZXR1cm4KCQkJCQkJZW5kCgkKCQkJCQkJaWYgaW5kZXggPT0gIlNpemUiIHRoZW4KCQkJCQkJCXNxdWFyZUZyYW1lLlNpemUgPSBVRGltMi5mcm9tT2Zmc2V0KHZhbHVlLlgsIHZhbHVlLlkpCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiUG9zaXRpb24iIHRoZW4KCQkJCQkJCXNxdWFyZUZyYW1lLlBvc2l0aW9uID0gVURpbTIuZnJvbU9mZnNldCh2YWx1ZS5YLCB2YWx1ZS5ZKQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIlRoaWNrbmVzcyIgdGhlbgoJCQkJCQkJdmFsdWUgPSBtYXRoLmNsYW1wKHZhbHVlLCAwLjYsIDB4N2ZmZmZmZmYpCgkJCQkJCQl1aVN0cm9rZS5UaGlja25lc3MgPSB2YWx1ZQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIkZpbGxlZCIgdGhlbgoJCQkJCQkJc3F1YXJlRnJhbWUuQmFja2dyb3VuZFRyYW5zcGFyZW5jeSA9ICgKCQkJCQkJCQlpZiB2YWx1ZSB0aGVuIGNvbnZlcnRfZHRyYW5zcGFyZW5jeShkcmF3aW5nX2luZm8uVHJhbnNwYXJlbmN5KSBlbHNlIDEKCQkJCQkJCSkKCQkJCQkJCXVpU3Ryb2tlLkVuYWJsZWQgPSBub3QgdmFsdWUKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJWaXNpYmxlIiB0aGVuCgkJCQkJCQlzcXVhcmVGcmFtZS5WaXNpYmxlID0gdmFsdWUKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJaSW5kZXgiIHRoZW4KCQkJCQkJCXNxdWFyZUZyYW1lLlpJbmRleCA9IHZhbHVlCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiVHJhbnNwYXJlbmN5IiB0aGVuCgkJCQkJCQlsb2NhbCB0cmFuc3BhcmVuY3kgPSBjb252ZXJ0X2R0cmFuc3BhcmVuY3kodmFsdWUpCgkKCQkJCQkJCXNxdWFyZUZyYW1lLkJhY2tncm91bmRUcmFuc3BhcmVuY3kgPSAoaWYgZHJhd2luZ19pbmZvLkZpbGxlZCB0aGVuIHRyYW5zcGFyZW5jeSBlbHNlIDEpCgkJCQkJCQl1aVN0cm9rZS5UcmFuc3BhcmVuY3kgPSB0cmFuc3BhcmVuY3kKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJDb2xvciIgdGhlbgoJCQkJCQkJdWlTdHJva2UuQ29sb3IgPSB2YWx1ZQoJCQkJCQkJc3F1YXJlRnJhbWUuQmFja2dyb3VuZENvbG9yMyA9IHZhbHVlCgkJCQkJCWVuZAoJCQkJCQlkcmF3aW5nX2luZm9baW5kZXhdID0gdmFsdWUKCQkJCQllbmQsCgkJCQkJX19pbmRleCA9IGZ1bmN0aW9uKHNlbGYsIGluZGV4KQoJCQkJCQlpZiBpbmRleCA9PSAiUmVtb3ZlIiBvciBpbmRleCA9PSAiRGVzdHJveSIgdGhlbgoJCQkJCQkJcmV0dXJuIGZ1bmN0aW9uKCkKCQkJCQkJCQlzcXVhcmVGcmFtZTpEZXN0cm95KCkKCQkJCQkJCQlkcmF3aW5nX2luZm8uUmVtb3ZlKHNlbGYpCgkJCQkJCQkJcmV0dXJuIGRyYXdpbmdfaW5mbzpSZW1vdmUoKQoJCQkJCQkJZW5kCgkJCQkJCWVuZAoJCQkJCQlyZXR1cm4gZHJhd2luZ19pbmZvW2luZGV4XQoJCQkJCWVuZCwKCQkJCX0pCgkJCWVsc2VpZiBkcmF3aW5nX3R5cGUgPT0gIkltYWdlIiB0aGVuCgkJCQlsb2NhbCBkcmF3aW5nX2luZm8gPSAoCgkJCQkJewoJCQkJCQlEYXRhID0gIiIsCgkJCQkJCURhdGFVUkwgPSAicmJ4YXNzZXRpZDovLzAiLAoJCQkJCQlTaXplID0gVmVjdG9yMi56ZXJvLAoJCQkJCQlQb3NpdGlvbiA9IFZlY3RvcjIuemVybywKCQkJCQl9ICsgYmFzZV9kcmF3aW5nX29iagoJCQkJKQoJCgkJCQlsb2NhbCBpbWFnZUZyYW1lID0gSW5zdGFuY2UubmV3KCJJbWFnZUxhYmVsIikKCQkJCWltYWdlRnJhbWUuTmFtZSA9IGRyYXdpbmdfaWR4CgkJCQlpbWFnZUZyYW1lLkJvcmRlclNpemVQaXhlbCA9IDAKCQkJCWltYWdlRnJhbWUuU2NhbGVUeXBlID0gRW51bS5TY2FsZVR5cGUuU3RyZXRjaAoJCQkJaW1hZ2VGcmFtZS5CYWNrZ3JvdW5kVHJhbnNwYXJlbmN5ID0gMQoJCgkJCQlpbWFnZUZyYW1lLlZpc2libGUgPSBkcmF3aW5nX2luZm8uVmlzaWJsZQoJCQkJaW1hZ2VGcmFtZS5aSW5kZXggPSBkcmF3aW5nX2luZm8uWkluZGV4CgkJCQlpbWFnZUZyYW1lLkltYWdlVHJhbnNwYXJlbmN5ID0gY29udmVydF9kdHJhbnNwYXJlbmN5KGRyYXdpbmdfaW5mby5UcmFuc3BhcmVuY3kpCgkJCQlpbWFnZUZyYW1lLkltYWdlQ29sb3IzID0gZHJhd2luZ19pbmZvLkNvbG9yCgkKCQkJCWltYWdlRnJhbWUuUGFyZW50ID0gZHJhd2luZ19jb250YWluZXIKCQkJCXJldHVybiBzZXRtZXRhdGFibGUoZHJhd2luZ19vYmosIHsKCQkJCQlfX25ld2luZGV4ID0gZnVuY3Rpb24oXywgaW5kZXgsIHZhbHVlKQoJCQkJCQlpZiB0eXBlKGRyYXdpbmdfaW5mb1tpbmRleF0pID09ICJuaWwiIHRoZW4KCQkJCQkJCXJldHVybgoJCQkJCQllbmQKCQoJCQkJCQlpZiBpbmRleCA9PSAiRGF0YVVSTCIgdGhlbiAtLSB0ZW1wb3JhcnkgcHJvcGVydHkKCQkJCQkJCWltYWdlRnJhbWUuSW1hZ2UgPSB2YWx1ZQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIlNpemUiIHRoZW4KCQkJCQkJCWltYWdlRnJhbWUuU2l6ZSA9IFVEaW0yLmZyb21PZmZzZXQodmFsdWUuWCwgdmFsdWUuWSkKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJQb3NpdGlvbiIgdGhlbgoJCQkJCQkJaW1hZ2VGcmFtZS5Qb3NpdGlvbiA9IFVEaW0yLmZyb21PZmZzZXQodmFsdWUuWCwgdmFsdWUuWSkKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJWaXNpYmxlIiB0aGVuCgkJCQkJCQlpbWFnZUZyYW1lLlZpc2libGUgPSB2YWx1ZQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIlpJbmRleCIgdGhlbgoJCQkJCQkJaW1hZ2VGcmFtZS5aSW5kZXggPSB2YWx1ZQoJCQkJCQllbHNlaWYgaW5kZXggPT0gIlRyYW5zcGFyZW5jeSIgdGhlbgoJCQkJCQkJaW1hZ2VGcmFtZS5JbWFnZVRyYW5zcGFyZW5jeSA9IGNvbnZlcnRfZHRyYW5zcGFyZW5jeSh2YWx1ZSkKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJDb2xvciIgdGhlbgoJCQkJCQkJaW1hZ2VGcmFtZS5JbWFnZUNvbG9yMyA9IHZhbHVlCgkJCQkJCWVuZAoJCQkJCQlkcmF3aW5nX2luZm9baW5kZXhdID0gdmFsdWUKCQkJCQllbmQsCgkJCQkJX19pbmRleCA9IGZ1bmN0aW9uKHNlbGYsIGluZGV4KQoJCQkJCQlpZiBpbmRleCA9PSAiUmVtb3ZlIiBvciBpbmRleCA9PSAiRGVzdHJveSIgdGhlbgoJCQkJCQkJcmV0dXJuIGZ1bmN0aW9uKCkKCQkJCQkJCQlpbWFnZUZyYW1lOkRlc3Ryb3koKQoJCQkJCQkJCWRyYXdpbmdfaW5mby5SZW1vdmUoc2VsZikKCQkJCQkJCQlyZXR1cm4gZHJhd2luZ19pbmZvOlJlbW92ZSgpCgkJCQkJCQllbmQKCQkJCQkJZW5kCgkJCQkJCXJldHVybiBkcmF3aW5nX2luZm9baW5kZXhdCgkJCQkJZW5kLAoJCQkJfSkKCQkJZWxzZWlmIGRyYXdpbmdfdHlwZSA9PSAiUXVhZCIgdGhlbgoJCQkJbG9jYWwgZHJhd2luZ19pbmZvID0gKAoJCQkJCXsKCQkJCQkJUG9pbnRBID0gVmVjdG9yMi56ZXJvLAoJCQkJCQlQb2ludEIgPSBWZWN0b3IyLnplcm8sCgkJCQkJCVBvaW50QyA9IFZlY3RvcjIuemVybywKCQkJCQkJUG9pbnREID0gVmVjdG9yMi56ZXJvLAoJCQkJCQlUaGlja25lc3MgPSAxLAoJCQkJCQlGaWxsZWQgPSBmYWxzZSwKCQkJCQl9ICsgYmFzZV9kcmF3aW5nX29iagoJCQkJKQoJCgkJCQlsb2NhbCBsaW5lX3BvaW50cyA9IHt9CgkJCQlsaW5lX3BvaW50cy5BID0gZHJhd2luZ19saWIubmV3KCJMaW5lIikKCQkJCWxpbmVfcG9pbnRzLkIgPSBkcmF3aW5nX2xpYi5uZXcoIkxpbmUiKQoJCQkJbGluZV9wb2ludHMuQyA9IGRyYXdpbmdfbGliLm5ldygiTGluZSIpCgkJCQlsaW5lX3BvaW50cy5EID0gZHJhd2luZ19saWIubmV3KCJMaW5lIikKCQoJCQkJbG9jYWwgY29uc3RydWN0X3RyaTEsIHJlbW92ZV90cmkxLCB3ZWRnZXMxID0gbmV3XzJkX3RyaWFuZ2xlKGRyYXdpbmdfY29udGFpbmVyKQoJCQkJbG9jYWwgY29uc3RydWN0X3RyaTIsIHJlbW92ZV90cmkyLCB3ZWRnZXMyID0gbmV3XzJkX3RyaWFuZ2xlKGRyYXdpbmdfY29udGFpbmVyKQoJCgkJCQljb25zdHJ1Y3RfdHJpMShkcmF3aW5nX2luZm8uUG9pbnRBLCBkcmF3aW5nX2luZm8uUG9pbnRCLCBkcmF3aW5nX2luZm8uUG9pbnRDKQoJCQkJY29uc3RydWN0X3RyaTIoZHJhd2luZ19pbmZvLlBvaW50QSwgZHJhd2luZ19pbmZvLlBvaW50QywgZHJhd2luZ19pbmZvLlBvaW50RCkKCQkJCXdlZGdlczEudzEuVmlzaWJsZSA9IGRyYXdpbmdfaW5mby5GaWxsZWQKCQkJCXdlZGdlczEudzIuVmlzaWJsZSA9IGRyYXdpbmdfaW5mby5GaWxsZWQKCQkJCXdlZGdlczIudzEuVmlzaWJsZSA9IGRyYXdpbmdfaW5mby5GaWxsZWQKCQkJCXdlZGdlczIudzIuVmlzaWJsZSA9IGRyYXdpbmdfaW5mby5GaWxsZWQKCQoJCQkJcmV0dXJuIHNldG1ldGF0YWJsZShkcmF3aW5nX29iaiwgewoJCQkJCV9fbmV3aW5kZXggPSBmdW5jdGlvbihfLCBpbmRleCwgdmFsdWUpCgkJCQkJCWlmIHR5cGUoZHJhd2luZ19pbmZvW2luZGV4XSkgPT0gIm5pbCIgdGhlbgoJCQkJCQkJcmV0dXJuCgkJCQkJCWVuZAoJCgkJCQkJCWlmIGluZGV4ID09ICJQb2ludEEiIHRoZW4KCQkJCQkJCWxpbmVfcG9pbnRzLkEuRnJvbSA9IHZhbHVlCgkJCQkJCQlsaW5lX3BvaW50cy5CLlRvID0gdmFsdWUKCQkJCQkJCWNvbnN0cnVjdF90cmkxKHZhbHVlLCBkcmF3aW5nX2luZm8uUG9pbnRCLCBkcmF3aW5nX2luZm8uUG9pbnRDKQoJCQkJCQkJY29uc3RydWN0X3RyaTIodmFsdWUsIGRyYXdpbmdfaW5mby5Qb2ludEMsIGRyYXdpbmdfaW5mby5Qb2ludEQpCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiUG9pbnRCIiB0aGVuCgkJCQkJCQlsaW5lX3BvaW50cy5CLkZyb20gPSB2YWx1ZQoJCQkJCQkJbGluZV9wb2ludHMuQy5UbyA9IHZhbHVlCgkJCQkJCQljb25zdHJ1Y3RfdHJpMShkcmF3aW5nX2luZm8uUG9pbnRBLCB2YWx1ZSwgZHJhd2luZ19pbmZvLlBvaW50QykKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJQb2ludEMiIHRoZW4KCQkJCQkJCWxpbmVfcG9pbnRzLkMuRnJvbSA9IHZhbHVlCgkJCQkJCQlsaW5lX3BvaW50cy5ELlRvID0gdmFsdWUKCQkJCQkJCWNvbnN0cnVjdF90cmkxKGRyYXdpbmdfaW5mby5Qb2ludEEsIGRyYXdpbmdfaW5mby5Qb2ludEIsIHZhbHVlKQoJCQkJCQkJY29uc3RydWN0X3RyaTIoZHJhd2luZ19pbmZvLlBvaW50QSwgdmFsdWUsIGRyYXdpbmdfaW5mby5Qb2ludEQpCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiUG9pbnREIiB0aGVuCgkJCQkJCQlsaW5lX3BvaW50cy5ELkZyb20gPSB2YWx1ZQoJCQkJCQkJbGluZV9wb2ludHMuQS5UbyA9IHZhbHVlCgkJCQkJCQljb25zdHJ1Y3RfdHJpMihkcmF3aW5nX2luZm8uUG9pbnRBLCBkcmF3aW5nX2luZm8uUG9pbnRDLCB2YWx1ZSkKCQkJCQkJZWxzZWlmCgkJCQkJCQlpbmRleCA9PSAiVGhpY2tuZXNzIgoJCQkJCQkJb3IgaW5kZXggPT0gIlZpc2libGUiCgkJCQkJCQlvciBpbmRleCA9PSAiQ29sb3IiCgkJCQkJCQlvciBpbmRleCA9PSAiVHJhbnNwYXJlbmN5IgoJCQkJCQkJb3IgaW5kZXggPT0gIlpJbmRleCIKCQkJCQkJdGhlbgoJCQkJCQkJZm9yIF8sIGxpbmVfb2JqIGluIGxpbmVfcG9pbnRzIGRvCgkJCQkJCQkJbGluZV9vYmpbaW5kZXhdID0gdmFsdWUKCQkJCQkJCWVuZAoJCgkJCQkJCQlpZiBpbmRleCA9PSAiVmlzaWJsZSIgdGhlbgoJCQkJCQkJCXdlZGdlczEudzEuVmlzaWJsZSA9IChkcmF3aW5nX2luZm8uRmlsbGVkIGFuZCB2YWx1ZSkKCQkJCQkJCQl3ZWRnZXMxLncyLlZpc2libGUgPSAoZHJhd2luZ19pbmZvLkZpbGxlZCBhbmQgdmFsdWUpCgkJCQkJCQkJd2VkZ2VzMi53MS5WaXNpYmxlID0gKGRyYXdpbmdfaW5mby5GaWxsZWQgYW5kIHZhbHVlKQoJCQkJCQkJCXdlZGdlczIudzIuVmlzaWJsZSA9IChkcmF3aW5nX2luZm8uRmlsbGVkIGFuZCB2YWx1ZSkKCQkJCQkJCWVsc2VpZiBpbmRleCA9PSAiWkluZGV4IiB0aGVuCgkJCQkJCQkJd2VkZ2VzMS53MS5aSW5kZXggPSB2YWx1ZQoJCQkJCQkJCXdlZGdlczEudzIuWkluZGV4ID0gdmFsdWUKCQkJCQkJCQl3ZWRnZXMyLncxLlpJbmRleCA9IHZhbHVlCgkJCQkJCQkJd2VkZ2VzMi53Mi5aSW5kZXggPSB2YWx1ZQoJCQkJCQkJZWxzZWlmIGluZGV4ID09ICJDb2xvciIgdGhlbgoJCQkJCQkJCXdlZGdlczEudzEuSW1hZ2VDb2xvcjMgPSB2YWx1ZQoJCQkJCQkJCXdlZGdlczEudzIuSW1hZ2VDb2xvcjMgPSB2YWx1ZQoJCQkJCQkJCXdlZGdlczIudzEuSW1hZ2VDb2xvcjMgPSB2YWx1ZQoJCQkJCQkJCXdlZGdlczIudzIuSW1hZ2VDb2xvcjMgPSB2YWx1ZQoJCQkJCQkJZWxzZWlmIGluZGV4ID09ICJUcmFuc3BhcmVuY3kiIHRoZW4KCQkJCQkJCQl3ZWRnZXMxLncxLkltYWdlVHJhbnNwYXJlbmN5ID0gY29udmVydF9kdHJhbnNwYXJlbmN5KHZhbHVlKQoJCQkJCQkJCXdlZGdlczEudzIuSW1hZ2VUcmFuc3BhcmVuY3kgPSBjb252ZXJ0X2R0cmFuc3BhcmVuY3kodmFsdWUpCgkJCQkJCQkJd2VkZ2VzMi53MS5JbWFnZVRyYW5zcGFyZW5jeSA9IGNvbnZlcnRfZHRyYW5zcGFyZW5jeSh2YWx1ZSkKCQkJCQkJCQl3ZWRnZXMyLncyLkltYWdlVHJhbnNwYXJlbmN5ID0gY29udmVydF9kdHJhbnNwYXJlbmN5KHZhbHVlKQoJCQkJCQkJZW5kCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiRmlsbGVkIiB0aGVuCgkJCQkJCQl3ZWRnZXMxLncxLlZpc2libGUgPSAoZHJhd2luZ19pbmZvLlZpc2libGUgYW5kIHZhbHVlKQoJCQkJCQkJd2VkZ2VzMS53Mi5WaXNpYmxlID0gKGRyYXdpbmdfaW5mby5WaXNpYmxlIGFuZCB2YWx1ZSkKCQkJCQkJCXdlZGdlczIudzEuVmlzaWJsZSA9IChkcmF3aW5nX2luZm8uVmlzaWJsZSBhbmQgdmFsdWUpCgkJCQkJCQl3ZWRnZXMyLncyLlZpc2libGUgPSAoZHJhd2luZ19pbmZvLlZpc2libGUgYW5kIHZhbHVlKQoJCQkJCQllbmQKCQkJCQkJZHJhd2luZ19pbmZvW2luZGV4XSA9IHZhbHVlCgkJCQkJZW5kLAoJCQkJCV9faW5kZXggPSBmdW5jdGlvbihzZWxmLCBpbmRleCkKCQkJCQkJaWYgaW5kZXggPT0gIlJlbW92ZSIgb3IgaW5kZXggPT0gIkRlc3Ryb3kiIHRoZW4KCQkJCQkJCXJldHVybiBmdW5jdGlvbigpCgkJCQkJCQkJZm9yIF8sIGxpbmVfb2JqIGluIGxpbmVfcG9pbnRzIGRvCgkJCQkJCQkJCWxpbmVfb2JqOlJlbW92ZSgpCgkJCQkJCQkJZW5kCgkKCQkJCQkJCQlyZW1vdmVfdHJpMSgpCgkJCQkJCQkJcmVtb3ZlX3RyaTIoKQoJCQkJCQkJCWRyYXdpbmdfaW5mby5SZW1vdmUoc2VsZikKCQkJCQkJCQlyZXR1cm4gZHJhd2luZ19pbmZvOlJlbW92ZSgpCgkJCQkJCQllbmQKCQkJCQkJZW5kCgkJCQkJCXJldHVybiBkcmF3aW5nX2luZm9baW5kZXhdCgkJCQkJZW5kLAoJCQkJfSkKCQkJZWxzZWlmIGRyYXdpbmdfdHlwZSA9PSAiVHJpYW5nbGUiIHRoZW4KCQkJCWxvY2FsIGRyYXdpbmdfaW5mbyA9ICgKCQkJCQl7CgkJCQkJCVBvaW50QSA9IFZlY3RvcjIuemVybywKCQkJCQkJUG9pbnRCID0gVmVjdG9yMi56ZXJvLAoJCQkJCQlQb2ludEMgPSBWZWN0b3IyLnplcm8sCgkJCQkJCVRoaWNrbmVzcyA9IDEsCgkJCQkJCUZpbGxlZCA9IGZhbHNlLAoJCQkJCX0gKyBiYXNlX2RyYXdpbmdfb2JqCgkJCQkpCgkKCQkJCWxvY2FsIGxpbmVfcG9pbnRzID0ge30KCQkJCWxpbmVfcG9pbnRzLkEgPSBkcmF3aW5nX2xpYi5uZXcoIkxpbmUiKQoJCQkJbGluZV9wb2ludHMuQiA9IGRyYXdpbmdfbGliLm5ldygiTGluZSIpCgkJCQlsaW5lX3BvaW50cy5DID0gZHJhd2luZ19saWIubmV3KCJMaW5lIikKCQoJCQkJbG9jYWwgY29uc3RydWN0X3RyaTEsIHJlbW92ZV90cmkxLCB3ZWRnZXMxID0gbmV3XzJkX3RyaWFuZ2xlKGRyYXdpbmdfY29udGFpbmVyKQoJCgkJCQljb25zdHJ1Y3RfdHJpMShkcmF3aW5nX2luZm8uUG9pbnRBLCBkcmF3aW5nX2luZm8uUG9pbnRCLCBkcmF3aW5nX2luZm8uUG9pbnRDKQoJCQkJd2VkZ2VzMS53MS5WaXNpYmxlID0gZHJhd2luZ19pbmZvLkZpbGxlZAoJCQkJd2VkZ2VzMS53Mi5WaXNpYmxlID0gZHJhd2luZ19pbmZvLkZpbGxlZAoJCgkJCQlyZXR1cm4gc2V0bWV0YXRhYmxlKGRyYXdpbmdfb2JqLCB7CgkJCQkJX19uZXdpbmRleCA9IGZ1bmN0aW9uKF8sIGluZGV4LCB2YWx1ZSkKCQkJCQkJaWYgdHlwZShkcmF3aW5nX2luZm9baW5kZXhdKSA9PSAibmlsIiB0aGVuCgkJCQkJCQlyZXR1cm4KCQkJCQkJZW5kCgkKCQkJCQkJaWYgaW5kZXggPT0gIlBvaW50QSIgdGhlbgoJCQkJCQkJbGluZV9wb2ludHMuQS5Gcm9tID0gdmFsdWUKCQkJCQkJCWxpbmVfcG9pbnRzLkIuVG8gPSB2YWx1ZQoJCQkJCQkJY29uc3RydWN0X3RyaTEodmFsdWUsIGRyYXdpbmdfaW5mby5Qb2ludEIsIGRyYXdpbmdfaW5mby5Qb2ludEMpCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiUG9pbnRCIiB0aGVuCgkJCQkJCQlsaW5lX3BvaW50cy5CLkZyb20gPSB2YWx1ZQoJCQkJCQkJbGluZV9wb2ludHMuQy5UbyA9IHZhbHVlCgkJCQkJCQljb25zdHJ1Y3RfdHJpMShkcmF3aW5nX2luZm8uUG9pbnRBLCB2YWx1ZSwgZHJhd2luZ19pbmZvLlBvaW50QykKCQkJCQkJZWxzZWlmIGluZGV4ID09ICJQb2ludEMiIHRoZW4KCQkJCQkJCWxpbmVfcG9pbnRzLkMuRnJvbSA9IHZhbHVlCgkJCQkJCQlsaW5lX3BvaW50cy5BLlRvID0gdmFsdWUKCQkJCQkJCWNvbnN0cnVjdF90cmkxKGRyYXdpbmdfaW5mby5Qb2ludEEsIGRyYXdpbmdfaW5mby5Qb2ludEIsIHZhbHVlKQoJCQkJCQllbHNlaWYKCQkJCQkJCWluZGV4ID09ICJUaGlja25lc3MiCgkJCQkJCQlvciBpbmRleCA9PSAiVmlzaWJsZSIKCQkJCQkJCW9yIGluZGV4ID09ICJDb2xvciIKCQkJCQkJCW9yIGluZGV4ID09ICJUcmFuc3BhcmVuY3kiCgkJCQkJCQlvciBpbmRleCA9PSAiWkluZGV4IgoJCQkJCQl0aGVuCgkJCQkJCQlmb3IgXywgbGluZV9vYmogaW4gbGluZV9wb2ludHMgZG8KCQkJCQkJCQlsaW5lX29ialtpbmRleF0gPSB2YWx1ZQoJCQkJCQkJZW5kCgkKCQkJCQkJCWlmIGluZGV4ID09ICJWaXNpYmxlIiB0aGVuCgkJCQkJCQkJd2VkZ2VzMS53MS5WaXNpYmxlID0gKGRyYXdpbmdfaW5mby5GaWxsZWQgYW5kIHZhbHVlKQoJCQkJCQkJCXdlZGdlczEudzIuVmlzaWJsZSA9IChkcmF3aW5nX2luZm8uRmlsbGVkIGFuZCB2YWx1ZSkKCQkJCQkJCWVsc2VpZiBpbmRleCA9PSAiWkluZGV4IiB0aGVuCgkJCQkJCQkJd2VkZ2VzMS53MS5aSW5kZXggPSB2YWx1ZQoJCQkJCQkJCXdlZGdlczEudzIuWkluZGV4ID0gdmFsdWUKCQkJCQkJCWVsc2VpZiBpbmRleCA9PSAiQ29sb3IiIHRoZW4KCQkJCQkJCQl3ZWRnZXMxLncxLkltYWdlQ29sb3IzID0gdmFsdWUKCQkJCQkJCQl3ZWRnZXMxLncyLkltYWdlQ29sb3IzID0gdmFsdWUKCQkJCQkJCWVsc2VpZiBpbmRleCA9PSAiVHJhbnNwYXJlbmN5IiB0aGVuCgkJCQkJCQkJd2VkZ2VzMS53MS5JbWFnZVRyYW5zcGFyZW5jeSA9IGNvbnZlcnRfZHRyYW5zcGFyZW5jeSh2YWx1ZSkKCQkJCQkJCQl3ZWRnZXMxLncyLkltYWdlVHJhbnNwYXJlbmN5ID0gY29udmVydF9kdHJhbnNwYXJlbmN5KHZhbHVlKQoJCQkJCQkJZW5kCgkJCQkJCWVsc2VpZiBpbmRleCA9PSAiRmlsbGVkIiB0aGVuCgkJCQkJCQl3ZWRnZXMxLncxLlZpc2libGUgPSAoZHJhd2luZ19pbmZvLlZpc2libGUgYW5kIHZhbHVlKQoJCQkJCQkJd2VkZ2VzMS53Mi5WaXNpYmxlID0gKGRyYXdpbmdfaW5mby5WaXNpYmxlIGFuZCB2YWx1ZSkKCQkJCQkJZW5kCgkJCQkJCWRyYXdpbmdfaW5mb1tpbmRleF0gPSB2YWx1ZQoJCQkJCWVuZCwKCQkJCQlfX2luZGV4ID0gZnVuY3Rpb24oc2VsZiwgaW5kZXgpCgkJCQkJCWlmIGluZGV4ID09ICJSZW1vdmUiIG9yIGluZGV4ID09ICJEZXN0cm95IiB0aGVuCgkJCQkJCQlyZXR1cm4gZnVuY3Rpb24oKQoJCQkJCQkJCWZvciBfLCBsaW5lX29iaiBpbiBsaW5lX3BvaW50cyBkbwoJCQkJCQkJCQlsaW5lX29iajpSZW1vdmUoKQoJCQkJCQkJCWVuZAoJCgkJCQkJCQkJcmVtb3ZlX3RyaTEoKQoJCQkJCQkJCWRyYXdpbmdfaW5mby5SZW1vdmUoc2VsZikKCQkJCQkJCQlyZXR1cm4gZHJhd2luZ19pbmZvOlJlbW92ZSgpCgkJCQkJCQllbmQKCQkJCQkJZW5kCgkJCQkJCXJldHVybiBkcmF3aW5nX2luZm9baW5kZXhdCgkJCQkJZW5kLAoJCQkJfSkKCQkJZW5kCgkJCXJldHVybiBlcnJvcihgRHJhd2luZyBvYmplY3QgIntkcmF3aW5nX3R5cGV9IiBkb2Vzbid0IGV4aXN0YCwgMikKCQllbmQKCQoJCWZ1bmN0aW9uIGRyYXdpbmdfbGliLm5ldyguLi4pCgkJCWxvY2FsIGRyYXdpbmdfb2JqID0gbmV3KC4uLikKCQkJdGFibGUuaW5zZXJ0KGRyYXdpbmdfb2JqX3JlZywgZHJhd2luZ19vYmopCgkJCXJldHVybiBkcmF3aW5nX29iagoJCWVuZAoJZW5kCgktLSAqIG1pc2MgZHJhd2luZyBmdW5jcwoJCglsb2NhbCBmdW5jdGlvbiBjbGVhckRyYXdDYWNoZSgpCgkJZHJhd2luZ19jb250YWluZXI6Q2xlYXJBbGxDaGlsZHJlbigpCgkJZm9yIF8sIGRyYXdpbmdfb2JqIGluIGRyYXdpbmdfb2JqX3JlZyBkbwoJCQlpZiBub3QgZHJhd2luZ19vYmogdGhlbgoJCQkJY29udGludWUKCQkJZW5kCgkJCWRyYXdpbmdfb2JqOlJlbW92ZSgpCgkJZW5kCgkJdGFibGUuY2xlYXIoZHJhd2luZ19vYmpfcmVnKQoJZW5kCgkKCWxvY2FsIGZ1bmN0aW9uIGlzUmVuZGVyT2JqZWN0KG9iamVjdCk6IGJvb2xlYW4KCQlsb2NhbCBvYmpQb3MgPSB0YWJsZS5maW5kKGRyYXdpbmdfb2JqX3JlZywgb2JqZWN0KQoJCgkJcmV0dXJuIChpZiBvYmpQb3MgdGhlbiAodHlwZShkcmF3aW5nX29ial9yZWdbb2JqUG9zXSkgPT0gInRhYmxlIikgZWxzZSBmYWxzZSkKCWVuZAoJCglsb2NhbCBmdW5jdGlvbiBnZXRSZW5kZXJQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5OiBzdHJpbmcpOiBhbnkKCQlsb2NhbCBvYmpQb3MgPSB0YWJsZS5maW5kKGRyYXdpbmdfb2JqX3JlZywgb2JqZWN0KQoJCWlmIG5vdCBvYmpQb3MgdGhlbgoJCQlyZXR1cm4gZXJyb3IoYGFyZyAjMSBub3QgYSB2YWxpZCByZW5kZXIgb2JqZWN0YCkKCQllbmQKCQoJCXJldHVybiBvYmplY3RbcHJvcGVydHldCgllbmQKCQoJbG9jYWwgZnVuY3Rpb24gc2V0UmVuZGVyUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KQoJCWxvY2FsIG9ialBvcyA9IHRhYmxlLmZpbmQoZHJhd2luZ19vYmpfcmVnLCBvYmplY3QpCgkJaWYgbm90IG9ialBvcyB0aGVuCgkJCXJldHVybiBlcnJvcihgYXJnICMxIG5vdCBhIHZhbGlkIHJlbmRlciBvYmplY3RgKQoJCWVuZAoJCgkJaWYgdHlwZShvYmplY3RbcHJvcGVydHldKSA9PSAibmlsIiB0aGVuCgkJCXJldHVybiBlcnJvcihgJ3twcm9wZXJ0eX0nIGlzIG5vdCBhIHZhbGlkIHJlbmRlciBwcm9wZXJ0eWApCgkJZW5kCgkKCQlvYmplY3RbcHJvcGVydHldID0gdmFsdWUKCWVuZAoJCglkcmF3aW5nX2NvbnRhaW5lci5QYXJlbnQgPSBnZXRodWkoKQoJRHJhd2luZyA9IGRyYXdpbmdfbGliCglEcmF3aW5nLmNsZWFyID0gY2xlYXJEcmF3Q2FjaGUKCWNsZWFyZHJhd2NhY2hlID0gY2xlYXJEcmF3Q2FjaGUKCWlzcmVuZGVyb2JqID0gaXNSZW5kZXJPYmplY3QKCWdldHJlbmRlcnByb3BlcnR5ID0gZ2V0UmVuZGVyUHJvcGVydHkKCXNldHJlbmRlcnByb3BlcnR5ID0gc2V0UmVuZGVyUHJvcGVydHkKCQoJbG9jYWwgVXNlcklucHV0U2VydmljZSA9IGdhbWU6R2V0U2VydmljZSgiVXNlcklucHV0U2VydmljZSIpCglsb2NhbCBWaXJ0dWFsSW5wdXRNYW5hZ2VyID0gSW5zdGFuY2UubmV3KCJWaXJ0dWFsSW5wdXRNYW5hZ2VyIikKCQoJaW5wdXQsIGFsaWFzID0KCQl7fSwgewoJCQlbImlzcmJ4YWN0aXZlIl0gPSB7ICJpc2dhbWVhY3RpdmUiLCAiaXN3aW5kb3dhY3RpdmUiIH0sCgkJCVsia2V5Y2xpY2siXSA9IHsgImhpdGtleSIgfSwKCQl9CgkKCWRvIC0tIElzRm9jdXNlZAoJCWxvY2FsIHdpbmRvd19mb2N1c2VkID0gdHJ1ZSAtLSBUT0RPIEZpbmQgYSBiZXR0ZXIgd2F5IGluc3RlYWQgb2YgQXNzdW1pbmcgKE1heWJlIHdlIGNvdWxkIGZvcmNlIGZvY3VzKQoJCgkJVXNlcklucHV0U2VydmljZS5XaW5kb3dGb2N1c1JlbGVhc2VkOkNvbm5lY3QoZnVuY3Rpb24oKQoJCQl3aW5kb3dfZm9jdXNlZCA9IGZhbHNlCgkJZW5kKQoJCVVzZXJJbnB1dFNlcnZpY2UuV2luZG93Rm9jdXNlZDpDb25uZWN0KGZ1bmN0aW9uKCkKCQkJd2luZG93X2ZvY3VzZWQgPSB0cnVlCgkJZW5kKQoJCgkJZnVuY3Rpb24gaXNyYnhhY3RpdmUoKQoJCQlyZXR1cm4gd2luZG93X2ZvY3VzZWQKCQllbmQKCWVuZAoJCglpc2dhbWVhY3RpdmUgPSBpc3JieGFjdGl2ZQoJaXN3aW5kb3dhY3RpdmUgPSBpc3JieGFjdGl2ZQoJCgktLSBRdW90ZWREb3VibGUgSGFzaCBEb2xsYXIgUGVyY2VudCBBbXBlcnNhbmQgTGVmdFBhcmVudGhlc2lzIFJpZ2h0UGFyZW50aGVzaXMgQXN0ZXJpc2sgVW5kZXJzY29yZSBUaWxkZSBDb2xvbiBQbHVzIFBpcGUgTGVzc1RoYW4gR3JlYXRlclRoYW4gUXVlc3Rpb24gQXQgQ2FyZXQgTGVmdEN1cmx5IFJpZ2h0Q3VybHkgYXJlIGFsbCBkZXByZWNhdGVkCgkKCS0tIGJhc2ljIHZpcnR1YWwga2V5IGNvZGUgLT4gcm9ibG94IEtleUNvZGUgbWFwIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpCgktLSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL2Rlc2t0b3AvaW5wdXRkZXYvdmlydHVhbC1rZXktY29kZXMKCS0tIGh0dHBzOi8vZGV2ZWxvcGVyLnJvYmxveC5jb20vYXBpLXJlZmVyZW5jZS9lbnVtL0tleUNvZGUKCQoJLS1bWyAtLVRPRE8gTWFwIHRoZXNlIHRvIG1vdXNlIGZ1bmN0aW9ucz8KCQoJVktfTEJVVFRPTiAJMHgwMSAJTGVmdCBtb3VzZSBidXR0b24KCVZLX1JCVVRUT04gCTB4MDIgCVJpZ2h0IG1vdXNlIGJ1dHRvbgoJCglWS19NQlVUVE9OIAkweDA0IAlNaWRkbGUgbW91c2UgYnV0dG9uCglWS19YQlVUVE9OMSAJMHgwNSAJWDEgbW91c2UgYnV0dG9uCglWS19YQlVUVE9OMiAJMHgwNiAJWDIgbW91c2UgYnV0dG9uCgkKCV1dCgkKCWxvY2FsIG1hcCA9IHsKCQktLSBbMHgwM10gPSBFbnVtLktleUNvZGUuTGVmdENvbnRyb2wgKyBFbnVtLktleUNvZGUuQnJlYWsKCQoJCVsweDEwXSA9IEVudW0uS2V5Q29kZS5MZWZ0U2hpZnQsIC0tIEFtYmlndWF0aW9uIFNoaWZ0CgkJWzB4MTFdID0gRW51bS5LZXlDb2RlLkxlZnRDb250cm9sLCAtLSBBbWJpZ3VhdGlvbiBDdHJsCgkJWzB4MTJdID0gRW51bS5LZXlDb2RlLkxlZnRBbHQsIC0tIEFtYmlndWF0aW9uIEFsdAoJCgkJLS0gVE9ETyBUaGVzZSBuZWVkIHRvIG9ubHkgYXBwZWFyIG9uY2UgKGl0IHdpbGwgYmUgYSBwcm9ibGVtIGlmIHdlIG1vdmUgc29tZSBrZXljb2RlIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgY3VycmVudGx5IHdlIG9ubHkgbmVlZCB0byBkbyB0aGUgb3Bwb3NpdGUgbHVja2lseSkKCQlbMHgxNF0gPSBFbnVtLktleUNvZGUuQ2Fwc0xvY2ssCgkKCQlbMHgxRl0gPSBFbnVtLktleUNvZGUuTW9kZSwKCQoJCVsweDIxXSA9IEVudW0uS2V5Q29kZS5QYWdlVXAsCgkJWzB4MjJdID0gRW51bS5LZXlDb2RlLlBhZ2VEb3duLAoJCVsweDIzXSA9IEVudW0uS2V5Q29kZS5FbmQsCgkJWzB4MjRdID0gRW51bS5LZXlDb2RlLkhvbWUsCgkJWzB4MjVdID0gRW51bS5LZXlDb2RlLkxlZnQsCgkJWzB4MjZdID0gRW51bS5LZXlDb2RlLlVwLAoJCVsweDI3XSA9IEVudW0uS2V5Q29kZS5SaWdodCwKCQlbMHgyOF0gPSBFbnVtLktleUNvZGUuRG93biwKCQlbMHgyOV0gPSBmYWxzZSwKCQlbMHgyQV0gPSBFbnVtLktleUNvZGUuUHJpbnQsIC0tIE5vdCBzdXJlCgkJWzB4MkJdID0gZmFsc2UsCgkJWzB4MkNdID0gRW51bS5LZXlDb2RlLlByaW50LAoJCVsweDJEXSA9IEVudW0uS2V5Q29kZS5JbnNlcnQsCgkJWzB4MkVdID0gRW51bS5LZXlDb2RlLkRlbGV0ZSwKCQlbMHgyRl0gPSBFbnVtLktleUNvZGUuSGVscCwKCQoJCVsweDVCXSA9IEVudW0uS2V5Q29kZS5MZWZ0U3VwZXIsCgkJWzB4NUNdID0gRW51bS5LZXlDb2RlLlJpZ2h0U3VwZXIsCgkJWzB4NURdID0gRW51bS5LZXlDb2RlLk1lbnUsIC0tIE5vdCBzdXJlCgkJWzB4NUVdID0gZmFsc2UsCgkJWzB4NUZdID0gZmFsc2UsCgkKCQlbMHg2QV0gPSBFbnVtLktleUNvZGUuS2V5cGFkTXVsdGlwbHksCgkJWzB4NkJdID0gRW51bS5LZXlDb2RlLktleXBhZFBsdXMsCgkJWzB4NkNdID0gZmFsc2UsCgkJWzB4NkRdID0gRW51bS5LZXlDb2RlLktleXBhZE1pbnVzLAoJCVsweDZFXSA9IEVudW0uS2V5Q29kZS5LZXlwYWRQZXJpb2QsCgkJWzB4NkZdID0gRW51bS5LZXlDb2RlLktleXBhZERpdmlkZSwKCQoJCVsweDdGXSA9IGZhbHNlLAoJCgkJWzB4OTBdID0gRW51bS5LZXlDb2RlLk51bUxvY2ssCgkJWzB4OTFdID0gRW51bS5LZXlDb2RlLlNjcm9sbExvY2ssCgkKCQlbMHhBMF0gPSBFbnVtLktleUNvZGUuTGVmdFNoaWZ0LAoJCVsweEExXSA9IEVudW0uS2V5Q29kZS5SaWdodFNoaWZ0LAoJCVsweEEyXSA9IEVudW0uS2V5Q29kZS5MZWZ0Q29udHJvbCwKCQlbMHhBM10gPSBFbnVtLktleUNvZGUuUmlnaHRDb250cm9sLAoJCVsweEE0XSA9IEVudW0uS2V5Q29kZS5MZWZ0QWx0LAoJCVsweEE1XSA9IEVudW0uS2V5Q29kZS5SaWdodEFsdCwKCQoJCVsweEJBXSA9IEVudW0uS2V5Q29kZS5TZW1pY29sb24sCgkJWzB4QkJdID0gRW51bS5LZXlDb2RlLlBsdXMsCgkJWzB4QkNdID0gRW51bS5LZXlDb2RlLkNvbW1hLAoJCVsweEJEXSA9IEVudW0uS2V5Q29kZS5NaW51cywKCQlbMHhCRV0gPSBFbnVtLktleUNvZGUuUGVyaW9kLAoJCVsweEJGXSA9IEVudW0uS2V5Q29kZS5TbGFzaCwKCQoJCVsweEMwXSA9IEVudW0uS2V5Q29kZS5CYWNrcXVvdGUsCgkKCQlbMHhEQl0gPSBFbnVtLktleUNvZGUuTGVmdEJyYWNrZXQsCgkJWzB4RENdID0gRW51bS5LZXlDb2RlLkJhY2tTbGFzaCwKCQlbMHhERF0gPSBFbnVtLktleUNvZGUuUmlnaHRCcmFja2V0LAoJCVsweERFXSA9IEVudW0uS2V5Q29kZS5RdW90ZSwKCQoJCVsweEUyXSA9IEVudW0uS2V5Q29kZS5MZXNzVGhhbiwKCQoJCVsweEZFXSA9IEVudW0uS2V5Q29kZS5DbGVhciwgLS0gTm90IHN1cmUKCX0KCWRvIC0tIE1hcCBWaXJ0dWFsIEtleXMgdG8gS2V5Q29kZSBFbnVtCgkJbG9jYWwgZnVuY3Rpb24gdmlydHVhbF90b19rZXljb2RlKHZhbHVlKQoJCQlmb3IgaSwgdiBpbiBFbnVtLktleUNvZGU6R2V0RW51bUl0ZW1zKCkgZG8KCQkJCWlmIHYuVmFsdWUgPT0gdmFsdWUgdGhlbgoJCQkJCXJldHVybiB2CgkJCQllbmQKCQkJZW5kCgkJZW5kCgkJLS0gUmUtTWFwCgkJZm9yIGkgPSAwLCAyNSBkbwoJCQltYXBbaSArIDB4NDFdID0gdmlydHVhbF90b19rZXljb2RlKGkgKyA5NykKCQllbmQgLS0gQS1aCgkJZm9yIGkgPSAwLCA5IGRvCgkJCW1hcFtpICsgMHg2MF0gPSB2aXJ0dWFsX3RvX2tleWNvZGUoaSArIDI1NikKCQllbmQgLS0gS2V5cGFkIDAtOQoJCWZvciBpID0gMCwgMTQgZG8KCQkJbWFwW2kgKyAweDcwXSA9IHZpcnR1YWxfdG9fa2V5Y29kZShpICsgMjgyKQoJCWVuZCAtLSBGdW5jdGlvbiAxLTE1CgkKCQlmb3IgaSwgdiBpbiBFbnVtLktleUNvZGU6R2V0RW51bUl0ZW1zKCkgZG8gLS0gPyBNYXliZSBibGFja2xpc3QgRW51bSdzIGNvbnRhaW5pbmcgIldvcmxkIiBpbiB0aGUgbmFtZQoJCQlsb2NhbCBPdmVycmlkZSA9IG1hcFt2LlZhbHVlXQoJCgkJCWlmIE92ZXJyaWRlID09IG5pbCB0aGVuCgkJCQlpZiBzdHJpbmcuZmluZCh2Lk5hbWUsICJXb3JsZCIsIG5pbCwgdHJ1ZSkgdGhlbgoJCQkJCWNvbnRpbnVlCgkJCQllbmQKCQkJCW1hcFt2LlZhbHVlXSA9IHYKCQkJZWxzZWlmIE92ZXJyaWRlID09IGZhbHNlIHRoZW4KCQkJCW1hcFt2LlZhbHVlXSA9IG5pbAoJCQllbmQKCQllbmQKCWVuZAoJCglkbyAtLSBLZXlib2FyZAoJCWxvY2FsIGZ1bmN0aW9uIGdldF9rZXljb2RlKGtleSkKCQkJbG9jYWwgVHlwZSA9IHR5cGVvZihrZXkpCgkJCWlmIFR5cGUgfj0gIkVudW1JdGVtIiB0aGVuCgkJCQlpZiBUeXBlID09ICJzdHJpbmciIHRoZW4KCQkJCQlrZXkgPSB0b251bWJlcihrZXkpCgkJCQllbmQKCQkJCWtleSA9IG1hcFtrZXldCgkJCQlhc3NlcnQoa2V5LCAiVW5hYmxlIHRvIG1hcCBrZXkgdG8gRW51bS5LZXlDb2RlLiBVc2UgYSBFbnVtLktleUNvZGUgaW5zdGVhZCIpIC0tID8gV2UgY291bGQgYWxzbyByZXR1cm4gVW5rbm93biBrZXljb2RlIGluc3RlYWQgb2YgdGhpcwoJCQllbmQKCQkJcmV0dXJuIGtleQoJCWVuZAoJCgkJZnVuY3Rpb24ga2V5cHJlc3Moa2V5LCBpc1JlcGVhdGVkS2V5KQoJCQlWaXJ0dWFsSW5wdXRNYW5hZ2VyOlNlbmRLZXlFdmVudCh0cnVlLCBnZXRfa2V5Y29kZShrZXkpLCBpc1JlcGVhdGVkS2V5IG9yIGZhbHNlLCBuaWwpCgkJZW5kCgkKCQlmdW5jdGlvbiBrZXlyZWxlYXNlKGtleSwgaXNSZXBlYXRlZEtleSkKCQkJVmlydHVhbElucHV0TWFuYWdlcjpTZW5kS2V5RXZlbnQoZmFsc2UsIGdldF9rZXljb2RlKGtleSksIGlzUmVwZWF0ZWRLZXkgb3IgZmFsc2UsIG5pbCkKCQllbmQKCQoJCWZ1bmN0aW9uIGtleWNsaWNrKC4uLikKCQkJaW5wdXQua2V5cHJlc3MoLi4uKQoJCQlpbnB1dC5rZXlyZWxlYXNlKC4uLikKCQllbmQKCWVuZAoJCgkKCQoJbG9jYWwgSW5wdXQgPSB7CgkJS2V5UHJlc3MgPSBrZXljbGljaywKCQlLZXlEb3duID0ga2V5cHJlc3MsCgkJS2V5VXAgPSBrZXlyZWxlYXNlLAoJfQoJCgloaXRrZXkgPSBrZXljbGljawoJCglkbyAtLSBNb3VzZQoJCS0tIFZpcnR1YWxJbnB1dE1hbmFnZXIgaXMgdHlwZWQgdG8gZGlzYWxsb3cgYSBuaWwgd2luZG93LCBidXQgaXQgZG9lcyBub3QKCQktLSB0aHJvdyBlcnJvcnMgYW5kIHRlc3RzIHJlbHkgb24gaXQgYG5pbGAgYmVpbmcgYWxsb3dlZAoJCWxvY2FsIGZ1bmN0aW9uIG1vdXNlX2dlbmVyYWxpemVkKG1vdXNlQnV0dG9uLCBpc0Rvd24pCgkJCXJldHVybiBmdW5jdGlvbih4LCB5LCByZXBlYXRDb3VudCkKCQkJCVZpcnR1YWxJbnB1dE1hbmFnZXI6U2VuZE1vdXNlQnV0dG9uRXZlbnQoCgkJCQkJeCBvciBVc2VySW5wdXRTZXJ2aWNlOkdldE1vdXNlTG9jYXRpb24oKS5YLAoJCQkJCXkgb3IgVXNlcklucHV0U2VydmljZTpHZXRNb3VzZUxvY2F0aW9uKCkuWSwKCQkJCQltb3VzZUJ1dHRvbiwKCQkJCQlpc0Rvd24sCgkJCQkJbmlsLAoJCQkJCXJlcGVhdENvdW50IG9yIDAKCQkJCSkKCQkJZW5kCgkJZW5kCgkKCQlsb2NhbCBtb3VzZV9tYXAgPSB7ICJMZWZ0Q2xpY2siLCAiUmlnaHRDbGljayIsICJNaWRkbGVDbGljayIgfQoJCgkJZm9yIGkgPSAwLCAyIGRvCgkJCWxvY2FsIGx1YV9pbmRleCA9IGkgKyAxCgkJCWxvY2FsIGJhc2VfbmFtZSA9ICJtb3VzZSIgLi4gbHVhX2luZGV4CgkJCWxvY2FsIHByZXNzLCByZWxlYXNlID0gbW91c2VfZ2VuZXJhbGl6ZWQoaSwgdHJ1ZSksIG1vdXNlX2dlbmVyYWxpemVkKGksIGZhbHNlKQoJCgkJCWxvY2FsIGZ1bmN0aW9uIGNsaWNrKC4uLikKCQkJCXByZXNzKC4uLikKCQkJCXJlbGVhc2UoLi4uKQoJCQllbmQKCQoJCQlsb2NhbCB1cF9uYW1lLCBkb3duX25hbWUgPSBiYXNlX25hbWUgLi4gInByZXNzIiwgYmFzZV9uYW1lIC4uICJyZWxlYXNlIgoJCQlpbnB1dFt1cF9uYW1lXSA9IHByZXNzCgkJCWlucHV0W2Rvd25fbmFtZV0gPSByZWxlYXNlCgkJCWlucHV0W2Jhc2VfbmFtZSAuLiAiY2xpY2siXSA9IGNsaWNrCgkKCQkJSW5wdXRbbW91c2VfbWFwW2x1YV9pbmRleF1dID0gZnVuY3Rpb24oYWN0aW9uKQoJCQkJaWYgMSA9PSBhY3Rpb24gdGhlbgoJCQkJCXByZXNzKCkKCQkJCWVsc2VpZiAyID09IGFjdGlvbiB0aGVuCgkJCQkJcmVsZWFzZSgpCgkJCQllbHNlCgkJCQkJY2xpY2soKQoJCQkJZW5kCgkJCWVuZAoJCgkJCWFsaWFzW3VwX25hbWVdID0geyBiYXNlX25hbWUgLi4gInVwIiB9CgkJCWFsaWFzW2Rvd25fbmFtZV0gPSB7IGJhc2VfbmFtZSAuLiAiZG93biIgfQoJCWVuZAoJCgkJZnVuY3Rpb24gbW91c2Vtb3ZlYWJzKHgsIHkpCgkJCVZpcnR1YWxJbnB1dE1hbmFnZXI6U2VuZE1vdXNlTW92ZUV2ZW50KAoJCQkJeCBvciBVc2VySW5wdXRTZXJ2aWNlOkdldE1vdXNlTG9jYXRpb24oKS5YLAoJCQkJeSBvciBVc2VySW5wdXRTZXJ2aWNlOkdldE1vdXNlTG9jYXRpb24oKS5ZLAoJCQkJbmlsCgkJCSkKCQllbmQKCQoJCWZ1bmN0aW9uIG1vdXNlbW92ZXJlbCh4LCB5KQoJCQktLSB4LHkgbmVlZCB0byBiZSBzcGVjaWZpZWQgaGVyZSBvciB3ZSBuZWVkIGEgZmFsbGJhY2sgKDApCgkJCW1vdXNlbW92ZWFicygKCQkJCXggYW5kIFVzZXJJbnB1dFNlcnZpY2U6R2V0TW91c2VMb2NhdGlvbigpLlggKyB4LAoJCQkJeSBhbmQgVXNlcklucHV0U2VydmljZTpHZXRNb3VzZUxvY2F0aW9uKCkuWSArIHkKCQkJKQoJCWVuZAoJCgkJZnVuY3Rpb24gbW91c2VzY3JvbGwocGl4ZWxzLCB4LCB5KQoJCQlpZiB0eXBlKHBpeGVscykgPT0gImJvb2xlYW4iIHRoZW4KCQkJCXBpeGVscyA9IHBpeGVscyBhbmQgMTIwIG9yIC0xMjAKCQkJZW5kCgkKCQkJbG9jYWwgaXNGb3J3YXJkU2Nyb2xsID0gcGl4ZWxzID49IDAgLS0gaW5wdXQuUG9zaXRpb24uWiBpcyAxIHdoZW4gZm9yd2FyZCwgLTEgb3RoZXJ3aXNlCgkKCQkJZm9yIGkgPSAxLCBtYXRoLmFicyhwaXhlbHMgLy8gMTIwKSBkbwoJCQkJVmlydHVhbElucHV0TWFuYWdlcjpTZW5kTW91c2VXaGVlbEV2ZW50KAoJCQkJCXggb3IgVXNlcklucHV0U2VydmljZTpHZXRNb3VzZUxvY2F0aW9uKCkuWCwKCQkJCQl5IG9yIFVzZXJJbnB1dFNlcnZpY2U6R2V0TW91c2VMb2NhdGlvbigpLlksCgkJCQkJaXNGb3J3YXJkU2Nyb2xsLAoJCQkJCW5pbAoJCQkJKQoJCQkJVmlydHVhbElucHV0TWFuYWdlcjpXYWl0Rm9ySW5wdXRFdmVudHNQcm9jZXNzZWQoKQoJCQllbmQKCQllbmQKCWVuZAoJCgktLQoJCgkKCWZ1bmN0aW9uIHJlYWRmaWxlKGZpbGUpCgkJZGF0YSA9IGJyaWRnZTpzZW5kKCJyZWFkZmlsZSIsIHthcmc9ImZpbGUiLCB2YWx1ZT1maWxlfSkKCQlpZiBkYXRhID09IG5pbCB0aGVuCgkJCXJldHVybiAiIgoJCWVuZAoJCWlmIG5vdCBkYXRhLnN0YXR1cyB0aGVuCgkJCWVycm9yKGRhdGEuY29udGVudCkKCQllbmQKCQlyZXR1cm4gZGF0YS5jb250ZW50CgllbmQKCQoJZnVuY3Rpb24gbGlzdGZpbGVzKGZpbGUpCgkJZGF0YSA9IGJyaWRnZTpzZW5kKCJsaXN0ZmlsZXMiLCB7YXJnPSJmaWxlIiwgdmFsdWU9ZmlsZX0pCgkJaWYgZGF0YSA9PSBuaWwgdGhlbgoJCQlyZXR1cm4ge30KCQllbmQKCQlpZiB0eXBlb2YoZGF0YS5jb250ZW50KSAgPT0gInRhYmxlIiB0aGVuCgkJCXJldHVybiBkYXRhLmNvbnRlbnQKCQllbHNlCgkJCXJldHVybiB7fQoJCWVuZAoJZW5kCgkKCWZ1bmN0aW9uIGlzZmlsZShwYXRoKQoJCWRhdGEgPSBicmlkZ2U6cG9zdCgiaXNmaWxlIiwge3R5cGU9ImlzZmlsZSIsZmlsZW5hbWU9cGF0aH0pCgkJaWYgZGF0YSA9PSBuaWwgdGhlbgoJCQlyZXR1cm4gZmFsc2UKCQllbmQKCQlyZXR1cm4gZGF0YS5zdGF0dXMKCWVuZAoJCglmdW5jdGlvbiBnZXRjdXN0b21hc3NldChhc3NldE5hbWUpCgkJZGF0YSA9IGJyaWRnZTpwb3N0KCJnZXRjdXN0b21hc3NldCIsIHt0eXBlPSJnZXRjdXN0b21hc3NldCIsZmlsZW5hbWU9YXNzZXROYW1lfSkKCQlpZiBkYXRhID09IG5pbCB0aGVuCgkJCXJldHVybiBmYWxzZQoJCWVuZAoJCXJldHVybiBkYXRhLmNvbnRlbnQKCWVuZAoKCWRlbGZvbGRlciA9IGZ1bmN0aW9uKHBhdGgpCgkJZGF0YSA9IGJyaWRnZTpwb3N0KCJkZWxmb2xkZXIiLCB7dHlwZT0iZGVsZm9sZGVyIixmaWxlbmFtZT1wYXRofSkKCWVuZAoJCglmdW5jdGlvbiBkZWxmaWxlKHBhdGgpCgkJZGF0YSA9IGJyaWRnZTpwb3N0KCJkZWxmaWxlIiwge3R5cGU9ImRlbGZpbGUiLGZpbGVuYW1lPXBhdGh9KQoJCWlmIGRhdGEgPT0gbmlsIHRoZW4KCQkJcmV0dXJuIGZhbHNlCgkJZW5kCgkJcmV0dXJuIGRhdGEuc3RhdHVzCgllbmQKCQoJZnVuY3Rpb24gZ2V0aHdpZCgpCgkJZGF0YSA9IGJyaWRnZTpzZW5kKCJnZXRod2lkIiwge2FyZz0iZ2V0aHdpZCIsIHZhbHVlPSIxIn0pCgkJaWYgZGF0YSA9PSBuaWwgdGhlbgoJCQlyZXR1cm4gIiIKCQllbmQKCQlyZXR1cm4gZGF0YS5jb250ZW50CgllbmQKCQoJZnVuY3Rpb24gd3JpdGVmaWxlKGZpbGUsIGRhdGEpCgkJZGF0YSA9IGJyaWRnZTpwb3N0KCJ3cml0ZWZpbGUiLCB7c291cmNlPWRhdGEsdHlwZT0id3JpdGVmaWxlIixmaWxlbmFtZT1maWxlfSkKCQlpZiBkYXRhID09IG5pbCB0aGVuCgkJCXJldHVybiBmYWxzZQoJCWVuZAoJCXJldHVybiBkYXRhLnN0YXR1cwoJZW5kCgkKCS0tCgkKCWZ1bmN0aW9uIGxybV9sb2FkX3NjcmlwdChzY3JpcHRfaWQpCgkJbG9jYWwgY29kZSA9IFtbCgkKCWNlX2xpa2VfbG9hZHN0cmluZ19mbiA9IGxvYWRzdHJpbmc7Cglsb2Fkc3RyaW5nID0gbmlsOwoJCgldXSAuLiBnYW1lOkh0dHBHZXQoImh0dHBzOi8vYXBpLmx1YXJtb3IubmV0L2ZpbGVzL3YzL2wvIiAuLiBzY3JpcHRfaWQgLi4gIi5sdWEiKQoJCXJldHVybiBsb2Fkc3RyaW5nKGNvZGUpKHsgT3JpZ2luID0gIk5YIiB9KQoJZW5kCgkKCWZ1bmN0aW9uIG1ha2Vmb2xkZXIoZmlsZSkKCQlkYXRhID0gYnJpZGdlOnNlbmQoIm1ha2Vmb2xkZXIiLCB7YXJnPSJmaWxlIiwgdmFsdWU9ZmlsZX0pCgkJaWYgZGF0YSA9PSBuaWwgdGhlbgoJCQlyZXR1cm4gZmFsc2UKCQllbmQKCQlyZXR1cm4gZGF0YS5zdGF0dXMKCWVuZAoJCglmdW5jdGlvbiBhcHBlbmRmaWxlKHBhdGgsIGRhdGEpCgkJZGF0YSA9IGJyaWRnZTpwb3N0KCJhcHBlbmRmaWxlIiwge3NvdXJjZT1kYXRhLHR5cGU9ImFwcGVuZGZpbGUiLGZpbGVuYW1lPXBhdGh9KQoJCWlmIGRhdGEgPT0gbmlsIHRoZW4KCQkJcmV0dXJuIGZhbHNlCgkJZW5kCgkJcmV0dXJuIGRhdGEuc3RhdHVzCgllbmQKCQoJZnVuY3Rpb24gaXNmb2xkZXIocGF0aCkKCQlkYXRhID0gYnJpZGdlOnNlbmQoImlzZm9sZGVyIiwge2FyZz0iZmlsZSIsIHZhbHVlPXBhdGh9KQoJCWlmIGRhdGEgPT0gbmlsIHRoZW4KCQkJcmV0dXJuIGZhbHNlCgkJZW5kCgkJcmV0dXJuIGRhdGEuc3RhdHVzCgllbmQKCQoJZnVuY3Rpb24gZ2V0ZXhlY3V0aW9uY29udGV4dCgpCgkJbG9jYWwgUnVuU2VydmljZSA9IGdhbWU6R2V0U2VydmljZSgiUnVuU2VydmljZSIpCgkJcmV0dXJuIGlmIFJ1blNlcnZpY2U6SXNDbGllbnQoKQoJCQl0aGVuICJDbGllbnQiCgkJCWVsc2VpZiBSdW5TZXJ2aWNlOklzU2VydmVyKCkgdGhlbiAiU2VydmVyIgoJCQllbHNlIGlmIFJ1blNlcnZpY2U6SXNTdHVkaW8oKSB0aGVuICJTdHVkaW8iIGVsc2UgIlVua25vd24iCgllbmQKCglsb2NhbCBnZXRzY3JpcHQgPSBJbnN0YW5jZS5uZXcoIk9iamVjdFZhbHVlIikKCglnZXRzY3JpcHQuTmFtZSA9ICJnZXRieXRlY29kZW9iamVjdCIKCWdldHNjcmlwdC5QYXJlbnQgPSBnYW1lLkNvcmVHdWkKCglmdW5jdGlvbiBnZXRzY3JpcHRieXRlY29kZShpbnN0YW5jZSkKCQlhc3NlcnQodHlwZW9mKGluc3RhbmNlKSA9PSAiSW5zdGFuY2UiIGFuZCBpbnN0YW5jZTpJc0EoIkx1YVNvdXJjZUNvbnRhaW5lciIpLCBgYXJnICMxIG11c3QgYmUgTHVhU291cmNlQ29udGFpbmVyYCkKCQoJCWdldHNjcmlwdC5WYWx1ZSA9IGluc3RhbmNlCgkKCQlkYXRhID0gYnJpZGdlOnNlbmQoImdldHNjcmlwdGJ5dGVjb2RlIiwge2FyZz0iZ2V0c2NyaXB0Ynl0ZWNvZGUiLCB2YWx1ZT0id293In0pCgkJaWYgZGF0YSA9PSBuaWwgdGhlbgoJCQlyZXR1cm4gIiIKCQllbmQKCQlyZXR1cm4gZGF0YS5jb250ZW50CgllbmQKCglkdW1wc3RyaW5nID0gZ2V0c2NyaXB0Ynl0ZWNvZGUKCQoJZnVuY3Rpb24gZ2V0c2NyaXB0aGFzaChpbnN0YW5jZSkKCQlhc3NlcnQodHlwZW9mKGluc3RhbmNlKSA9PSAiSW5zdGFuY2UiIGFuZCBpbnN0YW5jZTpJc0EoIkx1YVNvdXJjZUNvbnRhaW5lciIpLCBgYXJnICMxIG11c3QgYmUgTHVhU291cmNlQ29udGFpbmVyYCkKCQoJCXJldHVybiBpZiBpbnN0YW5jZTpJc0EoIlNjcmlwdCIpIHRoZW4gaW5zdGFuY2U6R2V0SGFzaCgpIGVsc2UgaW5zdGFuY2U6R2V0RGVidWdJZCgwKQoJZW5kCgkKCS0tIG1haW4KCQoJaWYgZ2FtZS5QbGF5ZXJzLkxvY2FsUGxheWVyIHRoZW4KCQlicmlkZ2U6c2VuZCgiZ2FtZWVudGVyZWQiLCB7YXJnPSJuYW1lIiwgdmFsdWU9Z2FtZS5QbGF5ZXJzLkxvY2FsUGxheWVyLk5hbWV9KQoJZW5kCgkKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgktLSAgICAgICAgICAgICAgIEJhdGNoZWQgWWllbGQtU2FmZSBTaWduYWwgSW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAtLQoJLS0gVGhpcyBpcyBhIFNpZ25hbCBjbGFzcyB3aGljaCBoYXMgZWZmZWN0aXZlbHkgaWRlbnRpY2FsIGJlaGF2aW9yIHRvIGEgICAgICAgLS0KCS0tIG5vcm1hbCBSQlhTY3JpcHRTaWduYWwsIHdpdGggdGhlIG9ubHkgZGlmZmVyZW5jZSBiZWluZyBhIGNvdXBsZSBleHRyYSAgICAgIC0tCgktLSBzdGFjayBmcmFtZXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sgdHJhY2Ugd2hlbiBhbiBlcnJvciBpcyB0aHJvd24uICAgICAtLQoJLS0gVGhpcyBpbXBsZW1lbnRhdGlvbiBjYWNoZXMgcnVubmVyIGNvcm91dGluZXMsIHNvIHRoZSBhYmlsaXR5IHRvIHlpZWxkIGluICAgLS0KCS0tIHRoZSBzaWduYWwgaGFuZGxlcnMgY29tZXMgYXQgbWluaW1hbCBleHRyYSBjb3N0IG92ZXIgYSBuYWl2ZSBzaWduYWwgICAgICAgIC0tCgktLSBpbXBsZW1lbnRhdGlvbiB0aGF0IGVpdGhlciBhbHdheXMgb3IgbmV2ZXIgc3Bhd25zIGEgdGhyZWFkLiAgICAgICAgICAgICAgICAtLQoJLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KCS0tIEFQSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCgktLSAgIGxvY2FsIFNpZ25hbCA9IHJlcXVpcmUoVEhJUyBNT0RVTEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQoJLS0gICBsb2NhbCBzaWcgPSBTaWduYWwubmV3KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KCS0tICAgbG9jYWwgY29ubmVjdGlvbiA9IHNpZzpDb25uZWN0KGZ1bmN0aW9uKGFyZzEsIGFyZzIsIC4uLikgLi4uIGVuZCkgICAgICAgIC0tCgktLSAgIHNpZzpGaXJlKGFyZzEsIGFyZzIsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQoJLS0gICBjb25uZWN0aW9uOkRpc2Nvbm5lY3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KCS0tICAgc2lnOkRpc2Nvbm5lY3RBbGwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCgktLSAgIGxvY2FsIGFyZzEsIGFyZzIsIC4uLiA9IHNpZzpXYWl0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQoJLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KCS0tIExpY2VuY2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCgktLSAgIExpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQoJLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KCS0tIEF1dGhvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCgktLSAgIHN0cmF2YW50IC0gSnVseSAzMXN0LCAyMDIxIC0gQ3JlYXRlZCB0aGUgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAtLQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJLS0gVGhlIGN1cnJlbnRseSBpZGxlIHRocmVhZCB0byBydW4gdGhlIG5leHQgaGFuZGxlciBvbgoJbG9jYWwgZnJlZVJ1bm5lclRocmVhZCA9IG5pbAoJCgktLSBGdW5jdGlvbiB3aGljaCBhY3F1aXJlcyB0aGUgY3VycmVudGx5IGlkbGUgaGFuZGxlciBydW5uZXIgdGhyZWFkLCBydW5zIHRoZQoJLS0gZnVuY3Rpb24gZm4gb24gaXQsIGFuZCB0aGVuIHJlbGVhc2VzIHRoZSB0aHJlYWQsIHJldHVybmluZyBpdCB0byBiZWluZyB0aGUKCS0tIGN1cnJlbnRseSBpZGxlIG9uZS4KCS0tIElmIHRoZXJlIHdhcyBhIGN1cnJlbnRseSBpZGxlIHJ1bm5lciB0aHJlYWQgYWxyZWFkeSwgdGhhdCdzIG9rYXksIHRoYXQgb2xkCgktLSBvbmUgd2lsbCBqdXN0IGdldCB0aHJvd24gYW5kIGV2ZW50dWFsbHkgR0NlZC4KCWxvY2FsIGZ1bmN0aW9uIGFjcXVpcmVSdW5uZXJUaHJlYWRBbmRDYWxsRXZlbnRIYW5kbGVyKGZuLCAuLi4pCgkJbG9jYWwgYWNxdWlyZWRSdW5uZXJUaHJlYWQgPSBmcmVlUnVubmVyVGhyZWFkCgkJZnJlZVJ1bm5lclRocmVhZCA9IG5pbAoJCWZuKC4uLikKCQktLSBUaGUgaGFuZGxlciBmaW5pc2hlZCBydW5uaW5nLCB0aGlzIHJ1bm5lciB0aHJlYWQgaXMgZnJlZSBhZ2Fpbi4KCQlmcmVlUnVubmVyVGhyZWFkID0gYWNxdWlyZWRSdW5uZXJUaHJlYWQKCWVuZAoJCgktLSBDb3JvdXRpbmUgcnVubmVyIHRoYXQgd2UgY3JlYXRlIGNvcm91dGluZXMgb2YuIFRoZSBjb3JvdXRpbmUgY2FuIGJlIAoJLS0gcmVwZWF0ZWRseSByZXN1bWVkIHdpdGggZnVuY3Rpb25zIHRvIHJ1biBmb2xsb3dlZCBieSB0aGUgYXJndW1lbnQgdG8gcnVuCgktLSB0aGVtIHdpdGguCglsb2NhbCBmdW5jdGlvbiBydW5FdmVudEhhbmRsZXJJbkZyZWVUaHJlYWQoKQoJCS0tIE5vdGU6IFdlIGNhbm5vdCB1c2UgdGhlIGluaXRpYWwgc2V0IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8KCQktLSBydW5FdmVudEhhbmRsZXJJbkZyZWVUaHJlYWQgZm9yIGEgY2FsbCB0byB0aGUgaGFuZGxlciwgYmVjYXVzZSB0aG9zZQoJCS0tIGFyZ3VtZW50cyB3b3VsZCBzdGF5IG9uIHRoZSBzdGFjayBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB0aHJlYWQncwoJCS0tIGV4aXN0ZW5jZSwgdGVtcG9yYXJpbHkgbGVha2luZyByZWZlcmVuY2VzLiBXaXRob3V0IGFjY2VzcyB0byByYXcgYnl0ZWNvZGUKCQktLSB0aGVyZSdzIG5vIHdheSBmb3IgdXMgdG8gY2xlYXIgdGhlICIuLi4iIHJlZmVyZW5jZXMgZnJvbSB0aGUgc3RhY2suCgkJd2hpbGUgdHJ1ZSBkbwoJCQlhY3F1aXJlUnVubmVyVGhyZWFkQW5kQ2FsbEV2ZW50SGFuZGxlcihjb3JvdXRpbmUueWllbGQoKSkKCQllbmQKCWVuZAoJCgktLSBDb25uZWN0aW9uIGNsYXNzCglsb2NhbCBDb25uZWN0aW9uID0ge30KCUNvbm5lY3Rpb24uX19pbmRleCA9IENvbm5lY3Rpb24KCQoJZnVuY3Rpb24gQ29ubmVjdGlvbi5uZXcoc2lnbmFsLCBmbikKCQlyZXR1cm4gc2V0bWV0YXRhYmxlKHsKCQkJX2Nvbm5lY3RlZCA9IHRydWUsCgkJCV9zaWduYWwgPSBzaWduYWwsCgkJCV9mbiA9IGZuLAoJCQlfbmV4dCA9IGZhbHNlLAoJCX0sIENvbm5lY3Rpb24pCgllbmQKCQoJZnVuY3Rpb24gQ29ubmVjdGlvbjpEaXNjb25uZWN0KCkKCQlzZWxmLl9jb25uZWN0ZWQgPSBmYWxzZQoJCgkJLS0gVW5ob29rIHRoZSBub2RlLCBidXQgRE9OJ1QgY2xlYXIgaXQuIFRoYXQgd2F5IGFueSBmaXJlIGNhbGxzIHRoYXQgYXJlCgkJLS0gY3VycmVudGx5IHNpdHRpbmcgb24gdGhpcyBub2RlIHdpbGwgYmUgYWJsZSB0byBpdGVyYXRlIGZvcndhcmRzIG9mZiBvZgoJCS0tIGl0LCBidXQgYW55IHN1YnNlcXVlbnQgZmlyZSBjYWxscyB3aWxsIG5vdCBoaXQgaXQsIGFuZCBpdCB3aWxsIGJlIEdDZWQKCQktLSB3aGVuIG5vIG1vcmUgZmlyZSBjYWxscyBhcmUgc2l0dGluZyBvbiBpdC4KCQlpZiBzZWxmLl9zaWduYWwuX2hhbmRsZXJMaXN0SGVhZCA9PSBzZWxmIHRoZW4KCQkJc2VsZi5fc2lnbmFsLl9oYW5kbGVyTGlzdEhlYWQgPSBzZWxmLl9uZXh0CgkJZWxzZQoJCQlsb2NhbCBwcmV2ID0gc2VsZi5fc2lnbmFsLl9oYW5kbGVyTGlzdEhlYWQKCQkJd2hpbGUgcHJldiBhbmQgcHJldi5fbmV4dCB+PSBzZWxmIGRvCgkJCQlwcmV2ID0gcHJldi5fbmV4dAoJCQllbmQKCQkJaWYgcHJldiB0aGVuCgkJCQlwcmV2Ll9uZXh0ID0gc2VsZi5fbmV4dAoJCQllbmQKCQllbmQKCWVuZAoJCgktLSBNYWtlIENvbm5lY3Rpb24gc3RyaWN0CglzZXRtZXRhdGFibGUoQ29ubmVjdGlvbiwgewoJCV9faW5kZXggPSBmdW5jdGlvbih0Yiwga2V5KQoJCQllcnJvcigoIkF0dGVtcHQgdG8gZ2V0IENvbm5lY3Rpb246OiVzIChub3QgYSB2YWxpZCBtZW1iZXIpIik6Zm9ybWF0KHRvc3RyaW5nKGtleSkpLCAyKQoJCWVuZCwKCQlfX25ld2luZGV4ID0gZnVuY3Rpb24odGIsIGtleSwgdmFsdWUpCgkJCWVycm9yKCgiQXR0ZW1wdCB0byBzZXQgQ29ubmVjdGlvbjo6JXMgKG5vdCBhIHZhbGlkIG1lbWJlcikiKTpmb3JtYXQodG9zdHJpbmcoa2V5KSksIDIpCgkJZW5kCgl9KQoJCgktLSBTaWduYWwgY2xhc3MKCWxvY2FsIFNpZ25hbCA9IHt9CglTaWduYWwuX19pbmRleCA9IFNpZ25hbAoJCglmdW5jdGlvbiBTaWduYWwubmV3KCkKCQlyZXR1cm4gc2V0bWV0YXRhYmxlKHsKCQkJX2hhbmRsZXJMaXN0SGVhZCA9IGZhbHNlLAoJCX0sIFNpZ25hbCkKCWVuZAoJCglmdW5jdGlvbiBTaWduYWw6Q29ubmVjdChmbikKCQlsb2NhbCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbi5uZXcoc2VsZiwgZm4pCgkJaWYgc2VsZi5faGFuZGxlckxpc3RIZWFkIHRoZW4KCQkJY29ubmVjdGlvbi5fbmV4dCA9IHNlbGYuX2hhbmRsZXJMaXN0SGVhZAoJCQlzZWxmLl9oYW5kbGVyTGlzdEhlYWQgPSBjb25uZWN0aW9uCgkJZWxzZQoJCQlzZWxmLl9oYW5kbGVyTGlzdEhlYWQgPSBjb25uZWN0aW9uCgkJZW5kCgkJcmV0dXJuIGNvbm5lY3Rpb24KCWVuZAoJCgktLSBEaXNjb25uZWN0IGFsbCBoYW5kbGVycy4gU2luY2Ugd2UgdXNlIGEgbGlua2VkIGxpc3QgaXQgc3VmZmljZXMgdG8gY2xlYXIgdGhlCgktLSByZWZlcmVuY2UgdG8gdGhlIGhlYWQgaGFuZGxlci4KCWZ1bmN0aW9uIFNpZ25hbDpEaXNjb25uZWN0QWxsKCkKCQlzZWxmLl9oYW5kbGVyTGlzdEhlYWQgPSBmYWxzZQoJZW5kCgkKCS0tIFNpZ25hbDpGaXJlKC4uLikgaW1wbGVtZW50ZWQgYnkgcnVubmluZyB0aGUgaGFuZGxlciBmdW5jdGlvbnMgb24gdGhlCgktLSBjb1J1bm5lclRocmVhZCwgYW5kIGFueSB0aW1lIHRoZSByZXN1bHRpbmcgdGhyZWFkIHlpZWxkZWQgd2l0aG91dCByZXR1cm5pbmcKCS0tIHRvIHVzLCB0aGF0IG1lYW5zIHRoYXQgaXQgeWllbGRlZCB0byB0aGUgUm9ibG94IHNjaGVkdWxlciBhbmQgaGFzIGJlZW4gdGFrZW4KCS0tIG92ZXIgYnkgUm9ibG94IHNjaGVkdWxpbmcsIG1lYW5pbmcgd2UgaGF2ZSB0byBtYWtlIGEgbmV3IGNvcm91dGluZSBydW5uZXIuCglmdW5jdGlvbiBTaWduYWw6RmlyZSguLi4pCgkJbG9jYWwgaXRlbSA9IHNlbGYuX2hhbmRsZXJMaXN0SGVhZAoJCXdoaWxlIGl0ZW0gZG8KCQkJaWYgaXRlbS5fY29ubmVjdGVkIHRoZW4KCQkJCWlmIG5vdCBmcmVlUnVubmVyVGhyZWFkIHRoZW4KCQkJCQlmcmVlUnVubmVyVGhyZWFkID0gY29yb3V0aW5lLmNyZWF0ZShydW5FdmVudEhhbmRsZXJJbkZyZWVUaHJlYWQpCgkJCQkJLS0gR2V0IHRoZSBmcmVlUnVubmVyVGhyZWFkIHRvIHRoZSBmaXJzdCB5aWVsZAoJCQkJCWNvcm91dGluZS5yZXN1bWUoZnJlZVJ1bm5lclRocmVhZCkKCQkJCWVuZAoJCQkJdGFzay5zcGF3bihmcmVlUnVubmVyVGhyZWFkLCBpdGVtLl9mbiwgLi4uKQoJCQllbmQKCQkJaXRlbSA9IGl0ZW0uX25leHQKCQllbmQKCWVuZAoJCgktLSBJbXBsZW1lbnQgU2lnbmFsOldhaXQoKSBpbiB0ZXJtcyBvZiBhIHRlbXBvcmFyeSBjb25uZWN0aW9uIHVzaW5nCgktLSBhIFNpZ25hbDpDb25uZWN0KCkgd2hpY2ggZGlzY29ubmVjdHMgaXRzZWxmLgoJZnVuY3Rpb24gU2lnbmFsOldhaXQoKQoJCWxvY2FsIHdhaXRpbmdDb3JvdXRpbmUgPSBjb3JvdXRpbmUucnVubmluZygpCgkJbG9jYWwgY247CgkJY24gPSBzZWxmOkNvbm5lY3QoZnVuY3Rpb24oLi4uKQoJCQljbjpEaXNjb25uZWN0KCkKCQkJdGFzay5zcGF3bih3YWl0aW5nQ29yb3V0aW5lLCAuLi4pCgkJZW5kKQoJCXJldHVybiBjb3JvdXRpbmUueWllbGQoKQoJZW5kCgkKCS0tIEltcGxlbWVudCBTaWduYWw6T25jZSgpIGluIHRlcm1zIG9mIGEgY29ubmVjdGlvbiB3aGljaCBkaXNjb25uZWN0cwoJLS0gaXRzZWxmIGJlZm9yZSBydW5uaW5nIHRoZSBoYW5kbGVyLgoJZnVuY3Rpb24gU2lnbmFsOk9uY2UoZm4pCgkJbG9jYWwgY247CgkJY24gPSBzZWxmOkNvbm5lY3QoZnVuY3Rpb24oLi4uKQoJCQlpZiBjbi5fY29ubmVjdGVkIHRoZW4KCQkJCWNuOkRpc2Nvbm5lY3QoKQoJCQllbmQKCQkJZm4oLi4uKQoJCWVuZCkKCQlyZXR1cm4gY24KCWVuZAoJCgktLSBNYWtlIHNpZ25hbCBzdHJpY3QKCXNldG1ldGF0YWJsZShTaWduYWwsIHsKCQlfX2luZGV4ID0gZnVuY3Rpb24odGIsIGtleSkKCQkJZXJyb3IoKCJBdHRlbXB0IHRvIGdldCBTaWduYWw6OiVzIChub3QgYSB2YWxpZCBtZW1iZXIpIik6Zm9ybWF0KHRvc3RyaW5nKGtleSkpLCAyKQoJCWVuZCwKCQlfX25ld2luZGV4ID0gZnVuY3Rpb24odGIsIGtleSwgdmFsdWUpCgkJCWVycm9yKCgiQXR0ZW1wdCB0byBzZXQgU2lnbmFsOjolcyAobm90IGEgdmFsaWQgbWVtYmVyKSIpOmZvcm1hdCh0b3N0cmluZyhrZXkpKSwgMikKCQllbmQKCX0pCgkKCWdvb2RzaWduYWwgPSBTaWduYWwKCQoJZG8gLS0gV2Vic29ja2V0cwoJCVdlYlNvY2tldCA9IHsgY29ubmVjdCA9IG5pbCB9CgkKCQlsb2NhbCB3ZWJzb2NrZXRfbXQgPSB7CgkJCV9faW5kZXggPSBmdW5jdGlvbihzZWxmLCBpbmRleCkKCQkJCWlmIG5vdCByYXdnZXQoc2VsZiwgIl9fT0JKRUNUX0FDVElWRSIpIHRoZW4KCQkJCQllcnJvcigiV2ViU29ja2V0IGlzIGNsb3NlZC4iKQoJCQkJZW5kCgkKCQkJCWlmIGluZGV4ID09ICJPbk1lc3NhZ2UiIHRoZW4KCQkJCQlpZiBub3QgcmF3Z2V0KHNlbGYsICJfX09CSkVDVF9BQ1RJVkUiKSB0aGVuCgkJCQkJCWVycm9yKCJXZWJTb2NrZXQgaXMgY2xvc2VkLiIpCgkJCQkJZW5kCgkKCQkJCQlyZXR1cm4gcmF3Z2V0KHNlbGYsICJfX09CSkVDVF9NRVNTQUdFIikKCQkJCWVuZAoJCgkJCQlpZiBpbmRleCA9PSAiT25DbG9zZSIgdGhlbgoJCQkJCWlmIG5vdCByYXdnZXQoc2VsZiwgIl9fT0JKRUNUX0FDVElWRSIpIHRoZW4KCQkJCQkJZXJyb3IoIldlYlNvY2tldCBpcyBjbG9zZWQuIikKCQkJCQllbmQKCQoJCQkJCXJldHVybiByYXdnZXQoc2VsZiwgIl9fT0JKRUNUX0NMT1NFIikKCQkJCWVuZAoJCgkJCQlpZiBpbmRleCA9PSAiU2VuZCIgdGhlbgoJCQkJCXJldHVybiBmdW5jdGlvbihfLCBtZXNzYWdlLCBpc19iaW5hcnkpCgkJCQkJCWlmIG5vdCByYXdnZXQoc2VsZiwgIl9fT0JKRUNUX0FDVElWRSIpIHRoZW4KCQkJCQkJCWVycm9yKCJXZWJTb2NrZXQgaXMgY2xvc2VkLiIpCgkJCQkJCWVuZAoJCQkJCQlicmlkZ2U6cG9zdCgid2Vic29ja2V0c2VuZCIsIHt0eXBlPSJ3ZWJzb2NrZXRzZW5kIix3ZWJzb2NrZXQ9ewoJCQkJCQkJdXJsPXJhd2dldChzZWxmLCAiX19PQkpFQ1QiKSwKCQkJCQkJCW1lc3NhZ2U9bWVzc2FnZSwKCQkJCQkJCWJpbmFyeT1pc19iaW5hcnksCgkJCQkJCQljbG9zdXJlPWZhbHNlCgkJCQkJCX19KQoJCQkJCWVuZAoJCQkJZW5kCgkKCQkJCWlmIGluZGV4ID09ICJDbG9zZSIgdGhlbgoJCQkJCXJldHVybiBmdW5jdGlvbihfKQoJCQkJCQlpZiBub3QgcmF3Z2V0KHNlbGYsICJfX09CSkVDVF9BQ1RJVkUiKSB0aGVuCgkJCQkJCQllcnJvcigiV2ViU29ja2V0IGlzIGNsb3NlZC4iKQoJCQkJCQllbmQKCQkJCQkJcmF3c2V0KHNlbGYsICJfX09CSkVDVF9BQ1RJVkUiLCBmYWxzZSkKCQkJCQkJYnJpZGdlOnBvc3QoIndlYnNvY2tldGNsb3NlIiwge3R5cGU9IndlYnNvY2tldGNsb3NlIix3ZWJzb2NrZXQ9ewoJCQkJCQkJdXJsPXJhd2dldChzZWxmLCAiX19PQkpFQ1QiKSwKCQkJCQkJCWNsb3N1cmU9dHJ1ZQoJCQkJCQl9fSkKCQkJCQllbmQKCQkJCWVuZAoJCQllbmQsCgkJCV9fbmV3aW5kZXggPSBmdW5jdGlvbigpCgkJCQllcnJvcigiV2ViU29ja2V0IGlzIHJlYWRvbmx5LiIpCgkJCWVuZCwKCQkJX190eXBlID0gIldlYlNvY2tldCIsCgkJfQoJCgkJZnVuY3Rpb24gV2ViU29ja2V0LmNvbm5lY3QodXJsOiBzdHJpbmcpCgkKCQkJbG9jYWwgZGF0YSA9IGJyaWRnZTpwb3N0KCJ3ZWJzb2NrZXQiLCB7dHlwZT0id2Vic29ja2V0Iix3ZWJzb2NrZXQ9ewoJCQkJdXJsPXVybCwKCQkJCW1lc3NhZ2U9bWVzc2FnZSwKCQkJCWJpbmFyeT1pc19iaW5hcnksCgkJCQljbG9zdXJlPWZhbHNlCgkJCX19KQoJCQkKCQkJbG9jYWwgc3VjY2VzcyA9IGRhdGEuc3RhdHVzCgkJCWlmIG5vdCBzdWNjZXNzIHRoZW4KCQkJCWVycm9yKGRhdGEuY29udGVudCwgMikKCQkJZW5kCgkKCQkJbG9jYWwgd2Vic29ja2V0X2Nvbm5lY3Rpb24gPSBzZXRtZXRhdGFibGUoewoJCQkJQ2xhc3NOYW1lID0gIldlYlNvY2tldCIsCgkJCQlfX09CSkVDVCA9IHVybCwKCQkJCV9fT0JKRUNUX0FDVElWRSA9IHRydWUsCgkJCQlfX09CSkVDVF9NRVNTQUdFID0gZ29vZHNpZ25hbC5uZXcoKSwKCQkJCV9fT0JKRUNUX0NMT1NFID0gZ29vZHNpZ25hbC5uZXcoKSwKCQkJfSwgd2Vic29ja2V0X210KQoJCgkJCXdlYnNvY2tldF9jb25uZWN0aW9uLl9fT0JKRUNUX0NMT1NFOkNvbm5lY3QoZnVuY3Rpb24oKQoJCQkJd2Vic29ja2V0X2Nvbm5lY3Rpb24uX19PQkpFQ1RfQUNUSVZFID0gZmFsc2UKCQkJZW5kKQoJCgkJCWdhbWU6R2V0U2VydmljZSgiUGxheWVycyIpLkxvY2FsUGxheWVyLk9uVGVsZXBvcnQ6Q29ubmVjdChmdW5jdGlvbih0ZWxlcG9ydFN0YXRlKQoJCQkJaWYgdGVsZXBvcnRTdGF0ZSA9PSBFbnVtLlRlbGVwb3J0U3RhdGUuU3RhcnRlZCBhbmQgd2Vic29ja2V0X2Nvbm5lY3Rpb24uX19PQkpFQ1RfQUNUSVZFIHRoZW4KCQkJCQl3ZWJzb2NrZXRfY29ubmVjdGlvbjpDbG9zZSgpCgkJCQllbmQKCQkJZW5kKQoJCgkJCWNvcm91dGluZS53cmFwKGZ1bmN0aW9uKCkKCQkJCXdoaWxlIHRydWUgZG8KCQkJCQl0YXNrLndhaXQoMC4xMDApCgkJCQkJaWYgd2Vic29ja2V0X2Nvbm5lY3Rpb24uX19PQkpFQ1RfQUNUSVZFID09IGZhbHNlIHRoZW4KCQkJCQkJYnJlYWsKCQkJCQllbmQKCQkJCQlsb2NhbCByZXNwID0gZ2FtZTpIdHRwR2V0KCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYnJpZGdlP2FjdGlvbj0iLi4gdXJsIC4uICJfbWVzc2FnZSIpCgkJCQkJaWYgcmVzcCB0aGVuCgkJCQkJCWxvY2FsIGRhdGEgPSBIdHRwU2VydmljZTpKU09ORGVjb2RlKHJlc3ApCgkJCQkJCWlmIGRhdGEuc3RhdHVzID09IHRydWUgdGhlbgoJCQkJCQkJZm9yIF8sIHZhbHVlIGluIGRhdGEuY29udGVudCBkbwoJCQkJCQkJCXdlYnNvY2tldF9jb25uZWN0aW9uLl9fT0JKRUNUX01FU1NBR0U6RmlyZSh2YWx1ZSkKCQkJCQkJCWVuZAoJCQkJCQllbmQKCQkJCQllbHNlCgkJCQkJCWJyZWFrCgkJCQkJZW5kCgkJCQllbmQKCQkJZW5kKSgpCgkKCQkJY29yb3V0aW5lLndyYXAoZnVuY3Rpb24oKQoJCQkJd2hpbGUgdHJ1ZSBkbwoJCQkJCXRhc2sud2FpdCgwLjEwMCkKCQkJCQlpZiB3ZWJzb2NrZXRfY29ubmVjdGlvbi5fX09CSkVDVF9BQ1RJVkUgPT0gZmFsc2UgdGhlbgoJCQkJCQlicmVhawoJCQkJCWVuZAoJCQkJCWxvY2FsIHJlc3AgPSBnYW1lOkh0dHBHZXQoImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9icmlkZ2U/YWN0aW9uPSIuLiB1cmwgLi4gIl9jbG9zZSIpCgkJCQkJaWYgcmVzcCB0aGVuCgkJCQkJCWxvY2FsIGRhdGEgPSBIdHRwU2VydmljZTpKU09ORGVjb2RlKHJlc3ApCgkJCQkJCWlmIGRhdGEuc3RhdHVzID09IHRydWUgdGhlbgoJCQkJCQkJd2Vic29ja2V0X2Nvbm5lY3Rpb24uX19PQkpFQ1RfQ0xPU0U6RmlyZSgiIikKCQkJCQkJCWJyZWFrCgkJCQkJCWVuZAoJCQkJCWVsc2UKCQkJCQkJd2Vic29ja2V0X2Nvbm5lY3Rpb24uX19PQkpFQ1RfQ0xPU0U6RmlyZSgiIikKCQkJCQkJYnJlYWsKCQkJCQllbmQKCQkJCWVuZAoJCQllbmQpKCkKCQkJcmV0dXJuIHdlYnNvY2tldF9jb25uZWN0aW9uCgkJZW5kCgllbmQKCQoJaHR0cC5yZXF1ZXN0ID0gcmVxdWVzdAoJaHR0cF9yZXF1ZXN0ID0gcmVxdWVzdAoKCS0tW1sKCXNoYTM4NCA9IHNoYS5zaGEzODQKCWJhc2U2NGVuY29kZSA9IGNyeXB0LmJhc2U2NGVuY29kZQoJCglsb2NhbCBkaXNhc3NlbWJsZSA9IGxvYWRzdHJpbmcoZ2FtZTpIdHRwR2V0KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vc3VmZnovbHVuYS9yZWZzL2hlYWRzL21haW4vZGVjb21waWxlLmx1YXUiKSkoKQoJZGVjb21waWxlID0gZnVuY3Rpb24oYTEpIAoJCXJldHVybiBkaXNhc3NlbWJsZShhMSkKCWVuZAoJCglsb2NhbCBQYXJhbXMgPSB7CgkJUmVwb1VSTCA9ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbHVhdS9Vbml2ZXJzYWxTeW5TYXZlSW5zdGFuY2UvbWFpbi8iLAoJCVNTSSA9ICJzYXZlaW5zdGFuY2UiLAoJfQoJbG9jYWwgc3luc2F2ZWluc3RhbmNlID0gbG9hZHN0cmluZyhnYW1lOkh0dHBHZXQoUGFyYW1zLlJlcG9VUkwgLi4gUGFyYW1zLlNTSSAuLiAiLmx1YXUiLCB0cnVlKSwgUGFyYW1zLlNTSSkoKQoJCglzYXZlaW5zdGFuY2UgPSBmdW5jdGlvbihPcHRpb25zKQoJCXJldHVybiBzeW5zYXZlaW5zdGFuY2UoT3B0aW9ucykKCWVuZAoJc2F2ZWdhbWUgPSBmdW5jdGlvbigpCgkJcmV0dXJuIHN5bnNhdmVpbnN0YW5jZShnYW1lKQoJZW5kCgldXQoKCWdldGNvbm5lY3Rpb25zID0gZnVuY3Rpb24oKSByZXR1cm4ge30gZW5kCgkKCWhvb2ttZXRhbWV0aG9kID0gKGZ1bmN0aW9uKHNlbGYsIG1ldGhvZCwgZnVuYykKCQlsb2NhbCBvID0gdAoJCWxvY2FsIG10ID0gZGVidWcuZ2V0bWV0YXRhYmxlKHQpCgkJbXRbaW5kZXhdID0gZnVuYwoJCXQgPSBtdAoJCXJldHVybiBvCgllbmQpCgoJZ2V0Y2FsbGJhY2t2YWx1ZSA9IChmdW5jdGlvbihiaW5kYWJsZSwgb25pbnZva2UpCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRleHQsIC4uLikKICAgICAgICAgICAgcmV0dXJuIGJpbmRhYmxlOkludm9rZSh0ZXh0LCAuLi4pCiAgICAgICAgZW5kCgllbmQpCgoJbG9hZGZpbGUgPSAoZnVuY3Rpb24oZmlsZW5hbWUpCgkJcmV0dXJuIGxvYWRzdHJpbmcocmVhZGZpbGUoZmlsZW5hbWUpKQoJZW5kKQoKCWZ1bmN0aW9uIGdldHRocmVhZGlkZW50aXR5KCkKCQlkYXRhID0gYnJpZGdlOnNlbmQoImdldHRocmVhZGlkZW50aXR5Iiwge2FyZz0iaWRlbnRpdHkiLCB2YWx1ZT0iMSJ9KQoJCWlmIGRhdGEgPT0gbmlsIHRoZW4KCQkJcmV0dXJuIGZhbHNlCgkJZW5kCgkJcmV0dXJuIGRhdGEuY29udGVudAoJZW5kCgoJZ2V0aWRlbnRpdHkgPSBnZXR0aHJlYWRpZGVudGl0eQoJZ2V0dGhyZWFkY29udGV4dCA9IGdldHRocmVhZGlkZW50aXR5CgoJZnVuY3Rpb24gY2hlY2tjYWxsZXIoKQoJCXJldHVybiAzIDw9IGdldHRocmVhZGlkZW50aXR5KCkKCWVuZAoKCWZ1bmN0aW9uIHNldHRocmVhZGlkZW50aXR5KGlkZW50aXR5KQoJCWRhdGEgPSBicmlkZ2U6c2VuZCgic2V0dGhyZWFkaWRlbnRpdHkiLCB7YXJnPSJpZGVudGl0eSIsIHZhbHVlPWlkZW50aXR5fSkKCQlpZiBkYXRhID09IG5pbCB0aGVuCgkJCXJldHVybiBmYWxzZQoJCWVuZAoJCXJldHVybiBkYXRhLnN0YXR1cwoJZW5kCgoJc2V0aWRlbnRpdHkgPSBzZXR0aHJlYWRpZGVudGl0eQoKCWxvY2FsIGxhc3RfY2FsbCA9IDAKCWxvY2FsIGZ1bmN0aW9uIGtvbnN0X2NhbGwoa29uc3RhbnRUeXBlOiBzdHJpbmcsIHNjcmlwdFBhdGg6IFNjcmlwdCB8IE1vZHVsZVNjcmlwdCB8IExvY2FsU2NyaXB0KTogc3RyaW5nCgkJbG9jYWwgc3VjY2VzczogYm9vbGVhbiwgYnl0ZWNvZGU6IHN0cmluZyA9IHBjYWxsKGdldHNjcmlwdGJ5dGVjb2RlLCBzY3JpcHRQYXRoKQoKCQlpZiAobm90IHN1Y2Nlc3MpIHRoZW4KCQkJcmV0dXJuIGAtLSBGYWlsZWQgdG8gZ2V0IHNjcmlwdCBieXRlY29kZSwgZXJyb3I6XG5cbi0tW1tcbntieXRlY29kZX1cbi0tXV1gCgkJZW5kCgoJCWxvY2FsIHRpbWVfZWxhcHNlZCA9IG9zLmNsb2NrKCkgLSBsYXN0X2NhbGwKCQlpZiB0aW1lX2VsYXBzZWQgPD0gLjUgdGhlbgoJCQl0YXNrLndhaXQoLjUgLSB0aW1lX2VsYXBzZWQpCgkJZW5kCgkJbG9jYWwgaHR0cFJlc3VsdCA9IHJlcXVlc3QoewoJCQlVcmwgPSAiaHR0cDovL2FwaS5wbHVzZ2lhbnQ1LmNvbSIgLi4ga29uc3RhbnRUeXBlLAoJCQlCb2R5ID0gYnl0ZWNvZGUsCgkJCU1ldGhvZCA9ICJQT1NUIiwKCQkJSGVhZGVycyA9IHsKCQkJCVsiQ29udGVudC1UeXBlIl0gPSAidGV4dC9wbGFpbiIKCQkJfSwKCQl9KQoJCWxhc3RfY2FsbCA9IG9zLmNsb2NrKCkKCgkJaWYgKGh0dHBSZXN1bHQuU3RhdHVzQ29kZSB+PSAyMDApIHRoZW4KCQkJcmV0dXJuIGAtLSBFcnJvciBvY2N1cmVkIHdoaWxlIHJlcXVlc3RpbmcgdGhlIEFQSSwgZXJyb3I6XG5cbi0tW1tcbntodHRwUmVzdWx0LkJvZHl9XG4tLV1dYAoJCWVsc2UKCQkJcmV0dXJuIGh0dHBSZXN1bHQuQm9keQoJCWVuZAoJZW5kCgoJZnVuY3Rpb24gRGVjb21waWxlKHNjcmlwdF9pbnN0YW5jZSkKCQlpZiB0eXBlb2Yoc2NyaXB0X2luc3RhbmNlKSB+PSAiSW5zdGFuY2UiIHRoZW4KCQkJcmV0dXJuICItLSBpbnZhbGlkIGFyZ3VtZW50ICMxIHRvICdEZWNvbXBpbGUnIChJbnN0YW5jZSBleHBlY3RlZCwgZ290ICIgLi4gdHlwZW9mKHNjcmlwdF9pbnN0YW5jZSkgLi4gIikiCgkJZW5kCgkJaWYgc2NyaXB0X2luc3RhbmNlLkNsYXNzTmFtZSB+PSAiTG9jYWxTY3JpcHQiIGFuZCBzY3JpcHRfaW5zdGFuY2UuQ2xhc3NOYW1lIH49ICJNb2R1bGVTY3JpcHQiIHRoZW4KCQkJcmV0dXJuICItLSBPbmx5IExvY2FsU2NyaXB0IGFuZCBNb2R1bGVTY3JpcHQgaXMgc3VwcG9ydGVkIGJ1dCBnb3QgXCIiIC4uIHNjcmlwdF9pbnN0YW5jZS5DbGFzc05hbWUgLi4gIlwiIgoJCWVuZAoJCXJldHVybiB0b3N0cmluZyhrb25zdF9jYWxsKCIva29uc3RhbnQvZGVjb21waWxlIiwgc2NyaXB0X2luc3RhbmNlKSk6Z3N1YigiXHQiLCAiICAgICIpCgllbmQKCWRlY29tcGlsZSA9IGRlY29tcGlsZQoKCWZ1bmN0aW9uIF9fRGlzYXNzZW1ibGUoc2NyaXB0X2luc3RhbmNlKQoJCWlmIHR5cGVvZihzY3JpcHRfaW5zdGFuY2UpIH49ICJJbnN0YW5jZSIgdGhlbgoJCQlyZXR1cm4gIi0tIGludmFsaWQgYXJndW1lbnQgIzEgdG8gJ2Rpc2Fzc2VtYmxlJyAoSW5zdGFuY2UgZXhwZWN0ZWQsIGdvdCAiIC4uIHR5cGVvZihzY3JpcHRfaW5zdGFuY2UpIC4uICIpIgoJCWVuZAoJCWlmIHNjcmlwdF9pbnN0YW5jZS5DbGFzc05hbWUgfj0gIkxvY2FsU2NyaXB0IiBhbmQgc2NyaXB0X2luc3RhbmNlLkNsYXNzTmFtZSB+PSAiTW9kdWxlU2NyaXB0IiB0aGVuCgkJCXJldHVybiAiLS0gT25seSBMb2NhbFNjcmlwdCBhbmQgTW9kdWxlU2NyaXB0IGlzIHN1cHBvcnRlZCBidXQgZ290IFwiIiAuLiBzY3JpcHRfaW5zdGFuY2UuQ2xhc3NOYW1lIC4uICJcIiIKCQllbmQKCQlyZXR1cm4gdG9zdHJpbmcoa29uc3RfY2FsbCgiL2tvbnN0YW50L2Rpc2Fzc2VtYmxlIiwgc2NyaXB0X2luc3RhbmNlKSk6Z3N1YigiXHQiLCAiICAgICIpCgllbmQKCV9fZGlzYXNzZW1ibGUgPSBfX0Rpc2Fzc2VtYmxlCgoJYnJpZGdlOnBvc3QoImpvaW5lZGdhbWUiLCB7c291cmNlPWdhbWUuUGxhY2VJZCx0eXBlPSJqb2luZWRnYW1lIn0pCmVuZCkKCndhaXQoKQoKaWYgc2NyaXB0Lk5hbWUgPT0gIkx1YVNvY2lhbExpYnJhcmllc0RlcHMiIHRoZW4KCXJldHVybiBfcmVxdWlyZShnYW1lOkdldFNlcnZpY2UoIkNvcmVQYWNrYWdlcyIpLldvcmtzcGFjZS5QYWNrYWdlcy5MdWFTb2NpYWxMaWJyYXJpZXNEZXBzKQplbmQKCmlmIHNjcmlwdC5OYW1lID09ICJKZXN0R2xvYmFscyIgdGhlbgoJcmV0dXJuIF9yZXF1aXJlKHNjcmlwdCkKZW5kCmlmIHNjcmlwdC5OYW1lID09ICJVcmwiIHRoZW4KCWxvY2FsIGE9e30KCWxvY2FsIGI9Z2FtZTpHZXRTZXJ2aWNlKCJDb250ZW50UHJvdmlkZXIiKQoJbG9jYWwgZnVuY3Rpb24gYyhkKQoJCWxvY2FsIGUsZj1kOmZpbmQoIiUuIikKCQlsb2NhbCBnPWQ6c3ViKGYrMSkKCQlpZiBnOnN1YigtMSl+PSIvInRoZW4KCQkJZz1nLi4iLyIKCQllbmQ7CgkJcmV0dXJuIGcKCWVuZDsKCWxvY2FsIGQ9Yi5CYXNlVXJsCglsb2NhbCBnPWMoZCkKCWxvY2FsIGg9c3RyaW5nLmZvcm1hdCgiaHR0cHM6Ly9nYW1lcy4lcyIsZykKCWxvY2FsIGk9c3RyaW5nLmZvcm1hdCgiaHR0cHM6Ly9hcGlzLnJjcy4lcyIsZykKCWxvY2FsIGo9c3RyaW5nLmZvcm1hdCgiaHR0cHM6Ly9hcGlzLiVzIixnKQoJbG9jYWwgaz1zdHJpbmcuZm9ybWF0KCJodHRwczovL2FjY291bnRzZXR0aW5ncy4lcyIsZykKCWxvY2FsIGw9c3RyaW5nLmZvcm1hdCgiaHR0cHM6Ly9nYW1laW50ZXJuYXRpb25hbGl6YXRpb24uJXMiLGcpCglsb2NhbCBtPXN0cmluZy5mb3JtYXQoImh0dHBzOi8vbG9jYWxlLiVzIixnKQoJbG9jYWwgbj1zdHJpbmcuZm9ybWF0KCJodHRwczovL3VzZXJzLiVzIixnKQoJbG9jYWwgbz17R0FNRV9VUkw9aCxSQ1NfVVJMPWksQVBJU19VUkw9aixBQ0NPVU5UX1NFVFRJTkdTX1VSTD1rLEdBTUVfSU5URVJOQVRJT05BTElaQVRJT05fVVJMPWwsTE9DQUxFX1VSTD1tLFJPTEVTX1VSTD1ufXNldG1ldGF0YWJsZShhLHtfX25ld2luZGV4PWZ1bmN0aW9uKHAscSxyKWVuZCxfX2luZGV4PWZ1bmN0aW9uKHAscilyZXR1cm4gb1tyXWVuZH0pCglyZXR1cm4gYQplbmQKCndoaWxlIHdhaXQoOWU5KSBkbyAKCXdhaXQoOWU5KQplbmQ=`
func getInit() string {
resp, err := base64.RawStdEncoding.DecodeString(strings.ReplaceAll(Init, "=", ""))
if err == nil {
return string(resp)
}
return err.Error()
}