IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgaXQgbWF5IGJlIHVzZWQsIGNvcGllZCwgbW9kaWZpZWQKIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwKIyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKcHJvYyBnaXRkaXIge30gewogICAgZ2xvYmFsIGVudgogICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoR0lUX0RJUildfSB7CglyZXR1cm4gJGVudihHSVRfRElSKQogICAgfSBlbHNlIHsKCXJldHVybiAiLmdpdCIKICAgIH0KfQoKcHJvYyBwYXJzZV9hcmdzIHtyYXJnc30gewogICAgZ2xvYmFsIHBhcnNlZF9hcmdzCgogICAgaWYge1tjYXRjaCB7CglzZXQgcGFyc2VfYXJncyBbY29uY2F0IC0tZGVmYXVsdCBIRUFEICRyYXJnc10KCXNldCBwYXJzZWRfYXJncyBbc3BsaXQgW2V2YWwgZXhlYyBnaXQtcmV2LXBhcnNlICRwYXJzZV9hcmdzXSAiXG4iXQogICAgfV19IHsKCSMgaWYgZ2l0LXJldi1wYXJzZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLi4uCglpZiB7JHJhcmdzID09IHt9fSB7CgkgICAgc2V0IHJhcmdzIEhFQUQKCX0KCXNldCBwYXJzZWRfYXJncyAkcmFyZ3MKICAgIH0KICAgIHJldHVybiAkcGFyc2VkX2FyZ3MKfQoKcHJvYyBzdGFydF9yZXZfbGlzdCB7cmxhcmdzfSB7CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlIG5jbXVwZGF0ZQogICAgZ2xvYmFsIGNvbW1mZCBsZWZ0b3ZlciB0Y2xlbmNvZGluZyBkYXRlbW9kZQoKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHskc3RhcnRtc2VjcyArIDEwMH1dCiAgICBzZXQgbmNtdXBkYXRlIDEKICAgIGluaXRsYXlvdXQKICAgIHNldCBvcmRlciAiLS10b3BvLW9yZGVyIgogICAgaWYgeyRkYXRlbW9kZX0gewoJc2V0IG9yZGVyICItLWRhdGUtb3JkZXIiCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBjb21tZmQgW29wZW4gW2NvbmNhdCB8IGdpdC1yZXYtbGlzdCAtLWhlYWRlciAkb3JkZXIgXAoJCQkgICAgICAtLXBhcmVudHMgJHJsYXJnc10gcl0KICAgIH0gZXJyXX0gewoJcHV0cyBzdGRlcnIgIkVycm9yIGV4ZWN1dGluZyBnaXQtcmV2LWxpc3Q6ICRlcnIiCglleGl0IDEKICAgIH0KICAgIHNldCBsZWZ0b3ZlciB7fQogICAgZmNvbmZpZ3VyZSAkY29tbWZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBsZgogICAgaWYgeyR0Y2xlbmNvZGluZyAhPSB7fX0gewoJZmNvbmZpZ3VyZSAkY29tbWZkIC1lbmNvZGluZyAkdGNsZW5jb2RpbmcKICAgIH0KICAgIGZpbGVldmVudCAkY29tbWZkIHJlYWRhYmxlIFtsaXN0IGdldGNvbW1pdGxpbmVzICRjb21tZmRdCiAgICAuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCiAgICBzZXR0ZXh0Y3Vyc29yIHdhdGNoCn0KCnByb2MgZ2V0Y29tbWl0cyB7cmFyZ3N9IHsKICAgIGdsb2JhbCBwaGFzZSBjYW52IG1haW5mb250CgogICAgc2V0IHBoYXNlIGdldGNvbW1pdHMKICAgIHN0YXJ0X3Jldl9saXN0IFtwYXJzZV9hcmdzICRyYXJnc10KICAgICRjYW52IGRlbGV0ZSBhbGwKICAgICRjYW52IGNyZWF0ZSB0ZXh0IDMgMyAtYW5jaG9yIG53IC10ZXh0ICJSZWFkaW5nIGNvbW1pdHMuLi4iIFwKCS1mb250ICRtYWluZm9udCAtdGFncyB0ZXh0aXRlbXMKfQoKcHJvYyBnZXRjb21taXRsaW5lcyB7Y29tbWZkfSAgewogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCBuZXh0dXBkYXRlCiAgICBnbG9iYWwgbGVmdG92ZXIKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0aWR4IGNvbW1pdHJvdyBjb21taXRkYXRhCgogICAgc2V0IHN0dWZmIFtyZWFkICRjb21tZmRdCiAgICBpZiB7JHN0dWZmID09IHt9fSB7CglpZiB7IVtlb2YgJGNvbW1mZF19IHJldHVybgoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRjb21tZmQgLWJsb2NraW5nIDEKCWlmIHshW2NhdGNoIHtjbG9zZSAkY29tbWZkfSBlcnJdfSB7CgkgICAgYWZ0ZXIgaWRsZSBmaW5pc2hjb21taXRzCgkgICAgcmV0dXJuCgl9CglpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJICAgIHNldCBlcnIgXAoJCSJHaXRrOiBlcnJvciByZWFkaW5nIGNvbW1pdHM6IGJhZCBhcmd1bWVudHMgdG8gZ2l0LXJldi1saXN0LlwKCQkoTm90ZTogYXJndW1lbnRzIHRvIGdpdGsgYXJlIHBhc3NlZCB0byBnaXQtcmV2LWxpc3RcCgkJdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGNvbW1pdHMgdG8gYmUgZGlzcGxheWVkLikiCgl9IGVsc2UgewoJICAgIHNldCBlcnIgIkVycm9yIHJlYWRpbmcgY29tbWl0czogJGVyciIKCX0KCWVycm9yX3BvcHVwICRlcnIKCWV4aXQgMQogICAgfQogICAgc2V0IHN0YXJ0IDAKICAgIHNldCBnb3Rzb21lIDAKICAgIHdoaWxlIDEgewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXDAiICRzdHVmZiAkc3RhcnRdCglpZiB7JGkgPCAwfSB7CgkgICAgYXBwZW5kIGxlZnRvdmVyIFtzdHJpbmcgcmFuZ2UgJHN0dWZmICRzdGFydCBlbmRdCgkgICAgYnJlYWsKCX0KCWlmIHskc3RhcnQgPT0gMH0gewoJICAgIHNldCBjbWl0ICRsZWZ0b3ZlcgoJICAgIGFwcGVuZCBjbWl0IFtzdHJpbmcgcmFuZ2UgJHN0dWZmIDAgW2V4cHIgeyRpIC0gMX1dXQoJICAgIHNldCBsZWZ0b3ZlciB7fQoJfSBlbHNlIHsKCSAgICBzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQoJfQoJc2V0IHN0YXJ0IFtleHByIHskaSArIDF9XQoJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQoJc2V0IG9rIDAKCWlmIHskaiA+PSAwfSB7CgkgICAgc2V0IGlkcyBbc3RyaW5nIHJhbmdlICRjbWl0IDAgW2V4cHIgeyRqIC0gMX1dXQoJICAgIHNldCBvayAxCgkgICAgZm9yZWFjaCBpZCAkaWRzIHsKCQlpZiB7W3N0cmluZyBsZW5ndGggJGlkXSAhPSA0MH0gewoJCSAgICBzZXQgb2sgMAoJCSAgICBicmVhawoJCX0KCSAgICB9Cgl9CglpZiB7ISRva30gewoJICAgIHNldCBzaG9ydGNtaXQgJGNtaXQKCSAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNob3J0Y21pdF0gPiA4MH0gewoJCXNldCBzaG9ydGNtaXQgIltzdHJpbmcgcmFuZ2UgJHNob3J0Y21pdCAwIDgwXS4uLiIKCSAgICB9CgkgICAgZXJyb3JfcG9wdXAgIkNhbid0IHBhcnNlIGdpdC1yZXYtbGlzdCBvdXRwdXQ6IHskc2hvcnRjbWl0fSIKCSAgICBleGl0IDEKCX0KCXNldCBpZCBbbGluZGV4ICRpZHMgMF0KCXNldCBvbGRzIFtscmFuZ2UgJGlkcyAxIGVuZF0KCXNldCBjb21taXRsaXN0ZWQoJGlkKSAxCgl1cGRhdGVjaGlsZHJlbiAkaWQgJG9sZHMKCXNldCBjb21taXRkYXRhKCRpZCkgW3N0cmluZyByYW5nZSAkY21pdCBbZXhwciB7JGogKyAxfV0gZW5kXQoJc2V0IGNvbW1pdHJvdygkaWQpICRjb21taXRpZHgKCWluY3IgY29tbWl0aWR4CglsYXBwZW5kIGRpc3BsYXlvcmRlciAkaWQKCXNldCBnb3Rzb21lIDEKICAgIH0KICAgIGlmIHskZ290c29tZX0gewoJbGF5b3V0bW9yZQogICAgfQogICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCWRvdXBkYXRlIDEKICAgIH0KfQoKcHJvYyBkb3VwZGF0ZSB7cmVhZGluZ30gewogICAgZ2xvYmFsIGNvbW1mZCBuZXh0dXBkYXRlIG51bWNvbW1pdHMgbmNtdXBkYXRlCgogICAgaWYgeyRyZWFkaW5nfSB7CglmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSB7fQogICAgfQogICAgdXBkYXRlCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCiAgICBpZiB7JG51bWNvbW1pdHMgPCAxMDB9IHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMX1dCiAgICB9IGVsc2VpZiB7JG51bWNvbW1pdHMgPCAxMDAwMH0gewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMH1dCiAgICB9IGVsc2UgewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMDB9XQogICAgfQogICAgaWYgeyRyZWFkaW5nfSB7CglmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkY29tbWZkXQogICAgfQp9Cgpwcm9jIHJlYWRjb21taXQge2lkfSB7CiAgICBpZiB7W2NhdGNoIHtzZXQgY29udGVudHMgW2V4ZWMgZ2l0LWNhdC1maWxlIGNvbW1pdCAkaWRdfV19IHJldHVybgogICAgdXBkYXRlY2hpbGRyZW4gJGlkIHt9CiAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAKfQoKcHJvYyB1cGRhdGVjb21taXRzIHtyYXJnc30gewogICAgc3RvcGZpbmRwcm9jCiAgICBmb3JlYWNoIHYge2NoaWxkcmVuIG5jaGlsZHJlbiBwYXJlbnRzIG5wYXJlbnRzIGNvbW1pdGxpc3RlZAoJY29sb3JtYXAgc2VsZWN0ZWRsaW5lIG1hdGNoaW5nbGluZXMgdHJlZWRpZmZzCgltZXJnZWZpbGVsaXN0IGN1cnJlbnRpZCByb3d0ZXh0eCBjb21taXRyb3cKCXJvd2lkbGlzdCByb3dvZmZzZXRzIGlkcm93cmFuZ2VzIGlkcmFuZ2VkcmF3biBpZGRyYXduCglsaW5lc2VnZW5kcyBjcm9zc2luZ3MgY29ybmVyY3Jvc3NpbmdzfSB7CglnbG9iYWwgJHYKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIHJlYWRyZWZzCiAgICBnZXRjb21taXRzICRyYXJncwp9Cgpwcm9jIHVwZGF0ZWNoaWxkcmVuIHtpZCBvbGRzfSB7CiAgICBnbG9iYWwgY2hpbGRyZW4gbmNoaWxkcmVuIHBhcmVudHMgbnBhcmVudHMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBuY2hpbGRyZW4oJGlkKV19IHsKCXNldCBjaGlsZHJlbigkaWQpIHt9CglzZXQgbmNoaWxkcmVuKCRpZCkgMAogICAgfQogICAgc2V0IHBhcmVudHMoJGlkKSAkb2xkcwogICAgc2V0IG5wYXJlbnRzKCRpZCkgW2xsZW5ndGggJG9sZHNdCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRwKV19IHsKCSAgICBzZXQgY2hpbGRyZW4oJHApIFtsaXN0ICRpZF0KCSAgICBzZXQgbmNoaWxkcmVuKCRwKSAxCgl9IGVsc2VpZiB7W2xzZWFyY2ggLWV4YWN0ICRjaGlsZHJlbigkcCkgJGlkXSA8IDB9IHsKCSAgICBsYXBwZW5kIGNoaWxkcmVuKCRwKSAkaWQKCSAgICBpbmNyIG5jaGlsZHJlbigkcCkKCX0KICAgIH0KfQoKcHJvYyBwYXJzZWNvbW1pdCB7aWQgY29udGVudHMgbGlzdGVkfSB7CiAgICBnbG9iYWwgY29tbWl0aW5mbyBjZGF0ZQoKICAgIHNldCBpbmhkciAxCiAgICBzZXQgY29tbWVudCB7fQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICBzZXQgYXVuYW1lIHt9CiAgICBzZXQgYXVkYXRlIHt9CiAgICBzZXQgY29tbmFtZSB7fQogICAgc2V0IGNvbWRhdGUge30KICAgIHNldCBoZHJlbmQgW3N0cmluZyBmaXJzdCAiXG5cbiIgJGNvbnRlbnRzXQogICAgaWYgeyRoZHJlbmQgPCAwfSB7CgkjIHNob3VsZCBuZXZlciBoYXBwZW4uLi4KCXNldCBoZHJlbmQgW3N0cmluZyBsZW5ndGggJGNvbnRlbnRzXQogICAgfQogICAgc2V0IGhlYWRlciBbc3RyaW5nIHJhbmdlICRjb250ZW50cyAwIFtleHByIHskaGRyZW5kIC0gMX1dXQogICAgc2V0IGNvbW1lbnQgW3N0cmluZyByYW5nZSAkY29udGVudHMgW2V4cHIgeyRoZHJlbmQgKyAyfV0gZW5kXQogICAgZm9yZWFjaCBsaW5lIFtzcGxpdCAkaGVhZGVyICJcbiJdIHsKCXNldCB0YWcgW2xpbmRleCAkbGluZSAwXQoJaWYgeyR0YWcgPT0gImF1dGhvciJ9IHsKCSAgICBzZXQgYXVkYXRlIFtsaW5kZXggJGxpbmUgZW5kLTFdCgkgICAgc2V0IGF1bmFtZSBbbHJhbmdlICRsaW5lIDEgZW5kLTJdCgl9IGVsc2VpZiB7JHRhZyA9PSAiY29tbWl0dGVyIn0gewoJICAgIHNldCBjb21kYXRlIFtsaW5kZXggJGxpbmUgZW5kLTFdCgkgICAgc2V0IGNvbW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfQogICAgfQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICAjIHRha2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1lbnQgYXMgdGhlIGhlYWRsaW5lCiAgICBzZXQgaSBbc3RyaW5nIGZpcnN0ICJcbiIgJGNvbW1lbnRdCiAgICBpZiB7JGkgPj0gMH0gewoJc2V0IGhlYWRsaW5lIFtzdHJpbmcgdHJpbSBbc3RyaW5nIHJhbmdlICRjb21tZW50IDAgJGldXQogICAgfSBlbHNlIHsKCXNldCBoZWFkbGluZSAkY29tbWVudAogICAgfQogICAgaWYgeyEkbGlzdGVkfSB7CgkjIGdpdC1yZXYtbGlzdCBpbmRlbnRzIHRoZSBjb21tZW50IGJ5IDQgc3BhY2VzOwoJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0LWNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCglzZXQgbmV3Y29tbWVudCB7fQoJZm9yZWFjaCBsaW5lIFtzcGxpdCAkY29tbWVudCAiXG4iXSB7CgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIiAgICAiCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgJGxpbmUKCSAgICBhcHBlbmQgbmV3Y29tbWVudCAiXG4iCgl9CglzZXQgY29tbWVudCAkbmV3Y29tbWVudAogICAgfQogICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CglzZXQgY2RhdGUoJGlkKSAkY29tZGF0ZQogICAgfQogICAgc2V0IGNvbW1pdGluZm8oJGlkKSBbbGlzdCAkaGVhZGxpbmUgJGF1bmFtZSAkYXVkYXRlIFwKCQkJICAgICAkY29tbmFtZSAkY29tZGF0ZSAkY29tbWVudF0KfQoKcHJvYyBnZXRjb21taXQge2lkfSB7CiAgICBnbG9iYWwgY29tbWl0ZGF0YSBjb21taXRpbmZvIG5wYXJlbnRzCgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRkYXRhKCRpZCldfSB7CglwYXJzZWNvbW1pdCAkaWQgJGNvbW1pdGRhdGEoJGlkKSAxCiAgICB9IGVsc2UgewoJcmVhZGNvbW1pdCAkaWQKCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCSAgICBzZXQgY29tbWl0aW5mbygkaWQpIHsiTm8gY29tbWl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSJ9CgkgICAgc2V0IG5wYXJlbnRzKCRpZCkgMAoJfQogICAgfQogICAgcmV0dXJuIDEKfQoKcHJvYyByZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcwoKICAgIGZvcmVhY2ggdiB7dGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KICAgIHNldCByZWZkIFtvcGVuIFtsaXN0IHwgZ2l0LWxzLXJlbW90ZSBbZ2l0ZGlyXV0gcl0KICAgIHdoaWxlIHswIDw9IFtzZXQgbiBbZ2V0cyAkcmVmZCBsaW5lXV19IHsKCWlmIHshW3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pCXJlZnMvKFteXl0qKSR9ICRsaW5lIFwKCSAgICBtYXRjaCBpZCBwYXRoXX0gewoJICAgIGNvbnRpbnVlCgl9CglpZiB7IVtyZWdleHAge14odGFnc3xoZWFkcykvKC4qKSR9ICRwYXRoIG1hdGNoIHR5cGUgbmFtZV19IHsKCSAgICBzZXQgdHlwZSBvdGhlcnMKCSAgICBzZXQgbmFtZSAkcGF0aAoJfQoJaWYgeyR0eXBlID09ICJ0YWdzIn0gewoJICAgIHNldCB0YWdpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJG5hbWUKCSAgICBzZXQgb2JqIHt9CgkgICAgc2V0IHR5cGUge30KCSAgICBzZXQgdGFnIHt9CgkgICAgY2F0Y2ggewoJCXNldCBjb21taXQgW2V4ZWMgZ2l0LXJldi1wYXJzZSAiJGlkXjAiXQoJCWlmIHsiJGNvbW1pdCIgIT0gIiRpZCJ9IHsKCQkgICAgc2V0IHRhZ2lkcygkbmFtZSkgJGNvbW1pdAoJCSAgICBsYXBwZW5kIGlkdGFncygkY29tbWl0KSAkbmFtZQoJCX0KCSAgICB9CQkKCSAgICBjYXRjaCB7CgkgICAgICAgIHNldCB0YWdjb250ZW50cygkbmFtZSkgW2V4ZWMgZ2l0LWNhdC1maWxlIHRhZyAiJGlkIl0KCSAgICB9Cgl9IGVsc2VpZiB7ICR0eXBlID09ICJoZWFkcyIgfSB7CgkgICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWRoZWFkcygkaWQpICRuYW1lCgl9IGVsc2UgewoJICAgIHNldCBvdGhlcnJlZmlkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZG90aGVycmVmcygkaWQpICRuYW1lCgl9CiAgICB9CiAgICBjbG9zZSAkcmVmZAp9Cgpwcm9jIGVycm9yX3BvcHVwIG1zZyB7CiAgICBzZXQgdyAuZXJyb3IKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKICAgIGJpbmQgJHcgPEtleS1SZXR1cm4+ICJkZXN0cm95ICR3IgogICAgdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIG1ha2V3aW5kb3cge3JhcmdzfSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBsaW5lc3BjIGNoYXJzcGMgY3RleHQgY2ZsaXN0IHRleHRmb250CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CiAgICBnbG9iYWwgZW50cmllcyBzaGExZW50cnkgc2hhMXN0cmluZyBzaGExYnV0CiAgICBnbG9iYWwgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGN1cnRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51IG1lcmdlbWF4CgogICAgbWVudSAuYmFyCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRmlsZSIgLW1lbnUgLmJhci5maWxlCiAgICBtZW51IC5iYXIuZmlsZQogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiVXBkYXRlIiAtY29tbWFuZCBbbGlzdCB1cGRhdGVjb21taXRzICRyYXJnc10KICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlJlcmVhZCByZWZlcmVuY2VzIiAtY29tbWFuZCByZXJlYWRyZWZzCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJRdWl0IiAtY29tbWFuZCBkb3F1aXQKICAgIG1lbnUgLmJhci5lZGl0CiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRWRpdCIgLW1lbnUgLmJhci5lZGl0CiAgICAuYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsICJQcmVmZXJlbmNlcyIgLWNvbW1hbmQgZG9wcmVmcwogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciB7NDUgKiAkY2hhcnNwY31dCglzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHszMCAqICRjaGFyc3BjfV0KCXNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgezE1ICogJGNoYXJzcGN9XQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciB7MjUgKiAkbGluZXNwYyArIDR9XQoJc2V0IGdlb21ldHJ5KGN0ZXh0dykgODAKCXNldCBnZW9tZXRyeShjdGV4dGgpIDMwCglzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgMzAKICAgIH0KICAgIHBhbmVkd2luZG93IC5jdG9wIC1vcmllbnQgdmVydGljYWwKICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkod2lkdGgpXX0gewoJLmN0b3AgY29uZiAtd2lkdGggJGdlb21ldHJ5KHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShoZWlnaHQpCglzZXQgdGV4dGggW2V4cHIgeyRnZW9tZXRyeShoZWlnaHQpIC0gJGdlb21ldHJ5KGNhbnZoKSAtIDU2fV0KCXNldCBnZW9tZXRyeShjdGV4dGgpIFtleHByIHsoJHRleHRoIC0gOCkgLwoJCQkJICAgIFtmb250IG1ldHJpY3MgJHRleHRmb250IC1saW5lc3BhY2VdfV0KICAgIH0KICAgIGZyYW1lIC5jdG9wLnRvcAogICAgZnJhbWUgLmN0b3AudG9wLmJhcgogICAgcGFjayAuY3RvcC50b3AuYmFyIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBzZXQgY3Njcm9sbCAuY3RvcC50b3AuY3NiCiAgICBzY3JvbGxiYXIgJGNzY3JvbGwgLWNvbW1hbmQge2FsbGNhbnZzIHl2aWV3fSAtaGlnaGxpZ2h0dGhpY2tuZXNzIDAKICAgIHBhY2sgJGNzY3JvbGwgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFuZWR3aW5kb3cgLmN0b3AudG9wLmNsaXN0IC1vcmllbnQgaG9yaXpvbnRhbCAtc2FzaHBhZCAwIC1oYW5kbGVzaXplIDQKICAgIHBhY2sgLmN0b3AudG9wLmNsaXN0IC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AgYWRkIC5jdG9wLnRvcAogICAgc2V0IGNhbnYgLmN0b3AudG9wLmNsaXN0LmNhbnYKICAgIGNhbnZhcyAkY2FudiAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MSkgXAoJLWJnIHdoaXRlIC1iZCAwIFwKCS15c2Nyb2xsaW5jciAkbGluZXNwYyAteXNjcm9sbGNvbW1hbmQgInNjcm9sbGNhbnYgJGNzY3JvbGwiCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52CiAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCiAgICBjYW52YXMgJGNhbnYyIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYyKSBcCgktYmcgd2hpdGUgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC5jdG9wLnRvcC5jbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MykgXAoJLWJnIHdoaXRlIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYwogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudjMKICAgIGJpbmQgLmN0b3AudG9wLmNsaXN0IDxDb25maWd1cmU+IHtyZXNpemVjbGlzdHBhbmVzICVXICV3fQoKICAgIHNldCBzaGExZW50cnkgLmN0b3AudG9wLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOAogICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQogICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CiAgICBlbnRyeSAkc2hhMWVudHJ5IC13aWR0aCA0MCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzaGExc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCiAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCgogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1sZWZ0IC1kYXRhIHsKCSNkZWZpbmUgbGVmdF93aWR0aCAxNgoJI2RlZmluZSBsZWZ0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVmdF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAwLCAweDcwLCAweDAwLCAweDM4LCAweDAwLCAweDFjLCAweDAwLAoJMHgwZSwgMHgwMCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwZSwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MzgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4YzAsIDB4MDF9OwogICAgfQogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1yaWdodCAtZGF0YSB7CgkjZGVmaW5lIHJpZ2h0X3dpZHRoIDE2CgkjZGVmaW5lIHJpZ2h0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmlnaHRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHg4MCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwZSwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MzgsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsCgkweDAwLCAweDBlLCAweDAwLCAweDA3LCAweDgwLCAweDAzLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmxlZnRidXQgLWltYWdlIGJtLWxlZnQgLWNvbW1hbmQgZ29iYWNrIFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5sZWZ0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLWltYWdlIGJtLXJpZ2h0IC1jb21tYW5kIGdvZm9ydyBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtdGV4dCAiRmluZCIgLWNvbW1hbmQgZG9maW5kCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtc2lkZSBsZWZ0CiAgICBzZXQgZmluZHN0cmluZyB7fQogICAgc2V0IGZzdHJpbmcgLmN0b3AudG9wLmJhci5maW5kc3RyaW5nCiAgICBsYXBwZW5kIGVudHJpZXMgJGZzdHJpbmcKICAgIGVudHJ5ICRmc3RyaW5nIC13aWR0aCAzMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBmaW5kc3RyaW5nCiAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBmaW5kdHlwZSBFeGFjdAogICAgc2V0IGZpbmR0eXBlbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIFwKCQkJICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlciBGaWxlcyBQaWNrYXhlCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CiAgICAjIGZvciBtYWtpbmcgc3VyZSB0eXBlPT1FeGFjdCB3aGVuZXZlciBsb2M9PVBpY2theGUKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRsb2NjaGFuZ2UKCiAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAogICAgLmN0b3AgYWRkIC5jdG9wLmNkZXQKICAgIGZyYW1lIC5jdG9wLmNkZXQubGVmdAogICAgc2V0IGN0ZXh0IC5jdG9wLmNkZXQubGVmdC5jdGV4dAogICAgdGV4dCAkY3RleHQgLWJnIHdoaXRlIC1zdGF0ZSBkaXNhYmxlZCAtZm9udCAkdGV4dGZvbnQgXAoJLXdpZHRoICRnZW9tZXRyeShjdGV4dHcpIC1oZWlnaHQgJGdlb21ldHJ5KGN0ZXh0aCkgXAoJLXlzY3JvbGxjb21tYW5kICIuY3RvcC5jZGV0LmxlZnQuc2Igc2V0IiAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQubGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKCiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKICAgICRjdGV4dCB0YWcgY29uZiBodW5rc2VwIC1mb3JlIGJsdWUKICAgICRjdGV4dCB0YWcgY29uZiBkMCAtZm9yZSByZWQKICAgICRjdGV4dCB0YWcgY29uZiBkMSAtZm9yZSAiIzAwYTAwMCIKICAgICRjdGV4dCB0YWcgY29uZiBtMCAtZm9yZSByZWQKICAgICRjdGV4dCB0YWcgY29uZiBtMSAtZm9yZSBibHVlCiAgICAkY3RleHQgdGFnIGNvbmYgbTIgLWZvcmUgZ3JlZW4KICAgICRjdGV4dCB0YWcgY29uZiBtMyAtZm9yZSBwdXJwbGUKICAgICRjdGV4dCB0YWcgY29uZiBtNCAtZm9yZSBicm93bgogICAgJGN0ZXh0IHRhZyBjb25mIG01IC1mb3JlICIjMDA5MDkwIgogICAgJGN0ZXh0IHRhZyBjb25mIG02IC1mb3JlIG1hZ2VudGEKICAgICRjdGV4dCB0YWcgY29uZiBtNyAtZm9yZSAiIzgwODAwMCIKICAgICRjdGV4dCB0YWcgY29uZiBtOCAtZm9yZSAiIzAwOTAwMCIKICAgICRjdGV4dCB0YWcgY29uZiBtOSAtZm9yZSAiI2ZmMDA4MCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTAgLWZvcmUgY3lhbgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMSAtZm9yZSAiI2IwNzA3MCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTIgLWZvcmUgIiM3MGIwZjAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTEzIC1mb3JlICIjNzBmMGIwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xNCAtZm9yZSAiI2YwYjA3MCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTUgLWZvcmUgIiNmZjcwYjAiCiAgICAkY3RleHQgdGFnIGNvbmYgbW1heCAtZm9yZSBkYXJrZ3JleQogICAgc2V0IG1lcmdlbWF4IDE2CiAgICAkY3RleHQgdGFnIGNvbmYgbXJlc3VsdCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgJGN0ZXh0IHRhZyBjb25mIG1zZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgICRjdGV4dCB0YWcgY29uZiBmb3VuZCAtYmFjayB5ZWxsb3cKCiAgICBmcmFtZSAuY3RvcC5jZGV0LnJpZ2h0CiAgICBzZXQgY2ZsaXN0IC5jdG9wLmNkZXQucmlnaHQuY2ZpbGVzCiAgICBsaXN0Ym94ICRjZmxpc3QgLWJnIHdoaXRlIC1zZWxlY3Rtb2RlIGV4dGVuZGVkIC13aWR0aCAkZ2VvbWV0cnkoY2ZsaXN0dykgXAoJLXlzY3JvbGxjb21tYW5kICIuY3RvcC5jZGV0LnJpZ2h0LnNiIHNldCIKICAgIHNjcm9sbGJhciAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1jb21tYW5kICIkY2ZsaXN0IHl2aWV3IgogICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhY2sgJGNmbGlzdCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LnJpZ2h0CiAgICBiaW5kIC5jdG9wLmNkZXQgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNkZXRwYW5lcyAlVyAld30KCiAgICBwYWNrIC5jdG9wIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQoKICAgIGJpbmRhbGwgPDE+IHtzZWxjYW52bGluZSAlVyAleCAleX0KICAgICNiaW5kYWxsIDxCMS1Nb3Rpb24+IHtzZWxjYW52bGluZSAlVyAleCAleX0KICAgIGJpbmRhbGwgPEJ1dHRvblJlbGVhc2UtND4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtNSB1bml0cyIKICAgIGJpbmRhbGwgPEJ1dHRvblJlbGVhc2UtNT4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCA1IHVuaXRzIgogICAgYmluZGFsbCA8Mj4gImFsbGNhbnZzIHNjYW4gbWFyayAwICV5IgogICAgYmluZGFsbCA8QjItTW90aW9uPiAiYWxsY2FudnMgc2NhbiBkcmFndG8gMCAleSIKICAgIGJpbmQgLiA8S2V5LVVwPiAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5kIC4gPEtleS1Eb3duPiAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmQgLiA8S2V5LVJpZ2h0PiAiZ29mb3J3IgogICAgYmluZCAuIDxLZXktTGVmdD4gImdvYmFjayIKICAgIGJpbmQgLiA8S2V5LVByaW9yPiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZCAuIDxLZXktTmV4dD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LURlbGV0ZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktQmFja1NwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1zcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgcCAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IG4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IHogImdvYmFjayIKICAgIGJpbmRrZXkgeCAiZ29mb3J3IgogICAgYmluZGtleSBpICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmRrZXkgayAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmRrZXkgaiAiZ29iYWNrIgogICAgYmluZGtleSBsICJnb2ZvcnciCiAgICBiaW5ka2V5IGIgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IGQgIiRjdGV4dCB5dmlldyBzY3JvbGwgMTggdW5pdHMiCiAgICBiaW5ka2V5IHUgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTE4IHVuaXRzIgogICAgYmluZGtleSAvIHtmaW5kbmV4dCAxfQogICAgYmluZGtleSA8S2V5LVJldHVybj4ge2ZpbmRuZXh0IDB9CiAgICBiaW5ka2V5ID8gZmluZHByZXYKICAgIGJpbmRrZXkgZiBuZXh0ZmlsZQogICAgYmluZCAuIDxDb250cm9sLXE+IGRvcXVpdAogICAgYmluZCAuIDxDb250cm9sLWY+IGRvZmluZAogICAgYmluZCAuIDxDb250cm9sLWc+IHtmaW5kbmV4dCAwfQogICAgYmluZCAuIDxDb250cm9sLXI+IGZpbmRwcmV2CiAgICBiaW5kIC4gPENvbnRyb2wtZXF1YWw+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLUtQX0FkZD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtbWludXM+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9TdWJ0cmFjdD4ge2luY3Jmb250IC0xfQogICAgYmluZCAkY2ZsaXN0IDw8TGlzdGJveFNlbGVjdD4+IGxpc3Rib3hzZWwKICAgIGJpbmQgLiA8RGVzdHJveT4ge3NhdmVzdHVmZiAlV30KICAgIGJpbmQgLiA8QnV0dG9uLTE+ICJjbGljayAlVyIKICAgIGJpbmQgJGZzdHJpbmcgPEtleS1SZXR1cm4+IGRvZmluZAogICAgYmluZCAkc2hhMWVudHJ5IDxLZXktUmV0dXJuPiBnb3RvY29tbWl0CiAgICBiaW5kICRzaGExZW50cnkgPDxQYXN0ZVNlbGVjdGlvbj4+IGNsZWFyc2hhMQoKICAgIHNldCBtYWluY3Vyc29yIFsuIGNnZXQgLWN1cnNvcl0KICAgIHNldCB0ZXh0Y3Vyc29yIFskY3RleHQgY2dldCAtY3Vyc29yXQogICAgc2V0IGN1cnRleHRjdXJzb3IgJHRleHRjdXJzb3IKCiAgICBzZXQgcm93Y3R4bWVudSAucm93Y3R4bWVudQogICAgbWVudSAkcm93Y3R4bWVudSAtdGVhcm9mZiAwCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgdGhpcyAtPiBzZWxlY3RlZCIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAwfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHNlbGVjdGVkIC0+IHRoaXMiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMX0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiTWFrZSBwYXRjaCIgLWNvbW1hbmQgbWtwYXRjaAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDcmVhdGUgdGFnIiAtY29tbWFuZCBta3RhZwogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJXcml0ZSBjb21taXQgdG8gZmlsZSIgLWNvbW1hbmQgd3JpdGVjb21taXQKfQoKcHJvYyBzY3JvbGxjYW52IHtjc2Nyb2xsIGYwIGYxfSB7CiAgICAkY3Njcm9sbCBzZXQgJGYwICRmMQogICAgZHJhd2ZyYWMgJGYwICRmMQp9CgojIHdoZW4gd2UgbWFrZSBhIGtleSBiaW5kaW5nIGZvciB0aGUgdG9wbGV2ZWwsIG1ha2Ugc3VyZQojIGl0IGRvZXNuJ3QgZ2V0IHRyaWdnZXJlZCB3aGVuIHRoYXQga2V5IGlzIHByZXNzZWQgaW4gdGhlCiMgZmluZCBzdHJpbmcgZW50cnkgd2lkZ2V0Lgpwcm9jIGJpbmRrZXkge2V2IHNjcmlwdH0gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGJpbmQgLiAkZXYgJHNjcmlwdAogICAgc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgJGV2XQogICAgaWYgeyRlc2NyaXB0ID09IHt9fSB7CglzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSA8S2V5Pl0KICAgIH0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgliaW5kICRlICRldiAiJGVzY3JpcHQ7IGJyZWFrIgogICAgfQp9CgojIHNldCB0aGUgZm9jdXMgYmFjayB0byB0aGUgdG9wbGV2ZWwgZm9yIGFueSBjbGljayBvdXRzaWRlCiMgdGhlIGVudHJ5IHdpZGdldHMKcHJvYyBjbGljayB7d30gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CglpZiB7JHcgPT0gJGV9IHJldHVybgogICAgfQogICAgZm9jdXMgLgp9Cgpwcm9jIHNhdmVzdHVmZiB7d30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY2ZsaXN0IG1haW5mb250IHRleHRmb250CiAgICBnbG9iYWwgc3R1ZmZzYXZlZCBmaW5kbWVyZ2VmaWxlcyBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG1heHdpZHRoCgogICAgaWYgeyRzdHVmZnNhdmVkfSByZXR1cm4KICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlIC5dfSByZXR1cm4KICAgIGNhdGNoIHsKCXNldCBmIFtvcGVuICJ+Ly5naXRrLW5ldyIgd10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1haW5mb250ICRtYWluZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZpbmRtZXJnZWZpbGVzICRmaW5kbWVyZ2VmaWxlc10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heGdyYXBocGN0ICRtYXhncmFwaHBjdF0KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heHdpZHRoICRtYXh3aWR0aF0KCXB1dHMgJGYgInNldCBnZW9tZXRyeSh3aWR0aCkgW3dpbmZvIHdpZHRoIC5jdG9wXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShoZWlnaHQpIFt3aW5mbyBoZWlnaHQgLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52XS0yfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnYyXS0yfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjMpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnYzXS0yfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudmgpIFtleHByIHtbd2luZm8gaGVpZ2h0ICRjYW52XS0yfV0iCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjdGV4dF0gLSA4KSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSAkdGV4dGZvbnQgIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY3RleHR3KSAkd2lkIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY2ZsaXN0XSAtIDExKSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSBbJGNmbGlzdCBjZ2V0IC1mb250XSAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjZmxpc3R3KSAkd2lkIgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJc2V0IHMxIFskd2luIHNhc2ggY29vcmQgMV0KCWlmIHskdyA8IDYwfSB7CgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcvMiAtIDIpfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkdyo1LzYgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczEgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgMzB9IHsKCQlzZXQgc2FzaDAgMzAKCSAgICB9CgkgICAgaWYgeyRzYXNoMSA8ICRzYXNoMCArIDIwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskc2FzaDAgKyAyMH1dCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPiAkdyAtIDEwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskdyAtIDEwfV0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByIHskc2FzaDEgLSAyMH1dCgkJfQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQoJJHdpbiBzYXNoIHBsYWNlIDEgJHNhc2gxIFtsaW5kZXggJHMxIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyByZXNpemVjZGV0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdyozLzQgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgNDV9IHsKCQlzZXQgc2FzaDAgNDUKCSAgICB9CgkgICAgaWYgeyRzYXNoMCA+ICR3IC0gMTV9IHsKCQlzZXQgc2FzaDAgW2V4cHIgeyR3IC0gMTV9XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgLSBhIGNvbW1pdCB2aWV3ZXIgZm9yIGdpdAoKQ29weXJpZ2h0IKkgMjAwNS0yMDA2IFBhdWwgTWFja2VycmFzCgpVc2UgYW5kIHJlZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlfSBcCgkgICAgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCn0KCnByb2Mgc2hvcnRpZHMge2lkc30gewogICAgc2V0IHJlcyB7fQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWlmIHtbbGxlbmd0aCAkaWRdID4gMX0gewoJICAgIGxhcHBlbmQgcmVzIFtzaG9ydGlkcyAkaWRdCgl9IGVsc2VpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IHsKCSAgICBsYXBwZW5kIHJlcyBbc3RyaW5nIHJhbmdlICRpZCAwIDddCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgcmVzICRpZAoJfQogICAgfQogICAgcmV0dXJuICRyZXMKfQoKcHJvYyBpbmNyYW5nZSB7bCB4IG99IHsKICAgIHNldCBuIFtsbGVuZ3RoICRsXQogICAgd2hpbGUgeyR4IDwgJG59IHsKCXNldCBlIFtsaW5kZXggJGwgJHhdCglpZiB7JGUgbmUge319IHsKCSAgICBsc2V0IGwgJHggW2V4cHIgeyRlICsgJG99XQoJfQoJaW5jciB4CiAgICB9CiAgICByZXR1cm4gJGwKfQoKcHJvYyBudGltZXMge24gb30gewogICAgc2V0IHJldCB7fQogICAgZm9yIHt9IHskbiA+IDB9IHtpbmNyIG4gLTF9IHsKCWxhcHBlbmQgcmV0ICRvCiAgICB9CiAgICByZXR1cm4gJHJldAp9Cgpwcm9jIHVzZWRpbnJhbmdlIHtpZCBsMSBsMn0gewogICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRpZCldfSB7CglzZXQgciAkY29tbWl0cm93KCRpZCkKCWlmIHskbDEgPD0gJHIgJiYgJHIgPD0gJGwyfSB7CgkgICAgcmV0dXJuIFtleHByIHskciAtICRsMSArIDF9XQoJfQogICAgfQogICAgZm9yZWFjaCBjICRjaGlsZHJlbigkaWQpIHsKCWlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjKV19IHsKCSAgICBzZXQgciAkY29tbWl0cm93KCRjKQoJICAgIGlmIHskbDEgPD0gJHIgJiYgJHIgPD0gJGwyfSB7CgkJcmV0dXJuIFtleHByIHskciAtICRsMSArIDF9XQoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAwCn0KCnByb2Mgc2FuaXR5IHtyb3cge2Z1bGwgMH19IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cwoKICAgIHNldCBjb2wgLTEKICAgIHNldCBpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICBmb3JlYWNoIGlkICRpZHMgewoJaW5jciBjb2wKCWlmIHskaWQgZXEge319IGNvbnRpbnVlCglpZiB7JGNvbCA8IFtsbGVuZ3RoICRpZHNdIC0gMSAmJgoJICAgIFtsc2VhcmNoIC1leGFjdCAtc3RhcnQgW2V4cHIgeyRjb2wrMX1dICRpZHMgJGlkXSA+PSAwfSB7CgkgICAgcHV0cyAib29wczogW3Nob3J0aWRzICRpZF0gcmVwZWF0ZWQgaW4gcm93ICRyb3cgY29sICRjb2w6IHtbc2hvcnRpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXX0iCgl9CglzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3cgJGNvbF0KCXNldCB5ICRyb3cKCXNldCB4ICRjb2wKCXdoaWxlIHskbyBuZSB7fX0gewoJICAgIGluY3IgeSAtMQoJICAgIGluY3IgeCAkbwoJICAgIGlmIHtbbGluZGV4ICRyb3dpZGxpc3QgJHkgJHhdICE9ICRpZH0gewoJCXB1dHMgIm9vcHM6IHJvd29mZnNldHMgd3JvbmcgYXQgcm93IFtleHByIHskeSsxfV0gY29sIFtleHByIHskeC0kb31dIgoJCXB1dHMgIiAgaWQ9W3Nob3J0aWRzICRpZF0gY2hlY2sgc3RhcnRlZCBhdCByb3cgJHJvdyIKCQlmb3Ige3NldCBpICRyb3d9IHskaSA+PSAkeX0ge2luY3IgaSAtMX0gewoJCSAgICBwdXRzICIgIHJvdyAkaSBpZHM9e1tzaG9ydGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJGldXX0gb2Zmcz17W2xpbmRleCAkcm93b2Zmc2V0cyAkaV19IgoJCX0KCQlicmVhawoJICAgIH0KCSAgICBpZiB7ISRmdWxsfSBicmVhawoJICAgIHNldCBvIFtsaW5kZXggJHJvd29mZnNldHMgJHkgJHhdCgl9CiAgICB9Cn0KCnByb2MgbWFrZXVwYXJyb3cge29pZCB4IHkgen0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIHVwYXJyb3dsZW4gaWRyb3dyYW5nZXMKCiAgICBmb3Ige3NldCBpIDF9IHskaSA8ICR1cGFycm93bGVuICYmICR5ID4gMX0ge2luY3IgaX0gewoJaW5jciB5IC0xCglpbmNyIHggJHoKCXNldCBvZmYwIFtsaW5kZXggJHJvd29mZnNldHMgJHldCglmb3Ige3NldCB4MCAkeH0gezF9IHtpbmNyIHgwfSB7CgkgICAgaWYgeyR4MCA+PSBbbGxlbmd0aCAkb2ZmMF19IHsKCQlzZXQgeDAgW2xsZW5ndGggW2xpbmRleCAkcm93b2Zmc2V0cyBbZXhwciB7JHktMX1dXV0KCQlicmVhawoJICAgIH0KCSAgICBzZXQgeiBbbGluZGV4ICRvZmYwICR4MF0KCSAgICBpZiB7JHogbmUge319IHsKCQlpbmNyIHgwICR6CgkJYnJlYWsKCSAgICB9Cgl9CglzZXQgeiBbZXhwciB7JHgwIC0gJHh9XQoJbHNldCByb3dpZGxpc3QgJHkgW2xpbnNlcnQgW2xpbmRleCAkcm93aWRsaXN0ICR5XSAkeCAkb2lkXQoJbHNldCByb3dvZmZzZXRzICR5IFtsaW5zZXJ0IFtsaW5kZXggJHJvd29mZnNldHMgJHldICR4ICR6XQogICAgfQogICAgc2V0IHRtcCBbbHJlcGxhY2UgW2xpbmRleCAkcm93b2Zmc2V0cyAkeV0gJHggJHgge31dCiAgICBsc2V0IHJvd29mZnNldHMgJHkgW2luY3JhbmdlICR0bXAgW2V4cHIgeyR4KzF9XSAtMV0KICAgIGxhcHBlbmQgaWRyb3dyYW5nZXMoJG9pZCkgJHkKfQoKcHJvYyBpbml0bGF5b3V0IHt9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCByb3dsYWlkb3V0IHJvd29wdGltCiAgICBnbG9iYWwgaWRpbmxpc3Qgcm93Y2hrCiAgICBnbG9iYWwgY29tbWl0aWR4IG51bWNvbW1pdHMKICAgIGdsb2JhbCBuZXh0Y29sb3IKCiAgICBzZXQgY29tbWl0aWR4IDAKICAgIHNldCBudW1jb21taXRzIDAKICAgIHNldCBkaXNwbGF5b3JkZXIge30KICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IHJvd2lkbGlzdCB7e319CiAgICBzZXQgcm93b2Zmc2V0cyB7e319CiAgICBjYXRjaCB7dW5zZXQgaWRpbmxpc3R9CiAgICBjYXRjaCB7dW5zZXQgcm93Y2hrfQogICAgc2V0IHJvd2xhaWRvdXQgMAogICAgc2V0IHJvd29wdGltIDAKfQoKcHJvYyB2aXNpYmxlcm93cyB7fSB7CiAgICBnbG9iYWwgY2FudiBudW1jb21taXRzIGxpbmVzcGMKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgZiBbJGNhbnYgeXZpZXddCiAgICBzZXQgeTAgW2V4cHIge2ludChbbGluZGV4ICRmIDBdICogJHltYXgpfV0KICAgIHNldCByMCBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQogICAgaWYgeyRyMCA8IDB9IHsKCXNldCByMCAwCiAgICB9CiAgICBzZXQgeTEgW2V4cHIge2ludChbbGluZGV4ICRmIDFdICogJHltYXgpfV0KICAgIHNldCByMSBbZXhwciB7aW50KCgkeTEgLSAzKSAvICRsaW5lc3BjKSArIDF9XQogICAgaWYgeyRyMSA+PSAkbnVtY29tbWl0c30gewoJc2V0IHIxIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQogICAgfQogICAgcmV0dXJuIFtsaXN0ICRyMCAkcjFdCn0KCnByb2MgbGF5b3V0bW9yZSB7fSB7CiAgICBnbG9iYWwgcm93bGFpZG91dCByb3dvcHRpbSBjb21taXRpZHggbnVtY29tbWl0cyBvcHRpbV9kZWxheQogICAgZ2xvYmFsIHVwYXJyb3dsZW4KCiAgICBzZXQgcm93ICRyb3dsYWlkb3V0CiAgICBzZXQgcm93bGFpZG91dCBbbGF5b3V0cm93cyAkcm93ICRjb21taXRpZHggMF0KICAgIHNldCBvcm93IFtleHByIHskcm93bGFpZG91dCAtICR1cGFycm93bGVuIC0gMX1dCiAgICBpZiB7JG9yb3cgPiAkcm93b3B0aW19IHsKCWNoZWNrY3Jvc3NpbmdzICRyb3dvcHRpbSAkb3JvdwoJb3B0aW1pemVfcm93cyAkcm93b3B0aW0gMCAkb3JvdwoJc2V0IHJvd29wdGltICRvcm93CiAgICB9CiAgICBzZXQgY2Fuc2hvdyBbZXhwciB7JHJvd29wdGltIC0gJG9wdGltX2RlbGF5fV0KICAgIGlmIHskY2Fuc2hvdyA+ICRudW1jb21taXRzfSB7CglzaG93c3R1ZmYgJGNhbnNob3cKICAgIH0KfQoKcHJvYyBzaG93c3R1ZmYge2NhbnNob3d9IHsKICAgIGdsb2JhbCBudW1jb21taXRzCiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMKICAgIGdsb2JhbCBsaW5lc2VnZW5kcyBpZHJvd3JhbmdlcyBpZHJhbmdlZHJhd24KCiAgICBpZiB7JG51bWNvbW1pdHMgPT0gMH0gewoJZ2xvYmFsIHBoYXNlCglzZXQgcGhhc2UgImluY3JkcmF3IgoJYWxsY2FudnMgZGVsZXRlIGFsbAogICAgfQogICAgc2V0IHJvdyAkbnVtY29tbWl0cwogICAgc2V0IG51bWNvbW1pdHMgJGNhbnNob3cKICAgIGFsbGNhbnZzIGNvbmYgLXNjcm9sbHJlZ2lvbiBcCglbbGlzdCAwIDAgMCBbZXhwciB7JGNhbnZ5MCArICgkbnVtY29tbWl0cyAtIDAuNSkgKiAkbGluZXNwYyArIDJ9XV0KICAgIHNldCByb3dzIFt2aXNpYmxlcm93c10KICAgIHNldCByMCBbbGluZGV4ICRyb3dzIDBdCiAgICBzZXQgcjEgW2xpbmRleCAkcm93cyAxXQogICAgZm9yIHtzZXQgciAkcm93fSB7JHIgPCAkY2Fuc2hvd30ge2luY3Igcn0gewoJaWYge1tpbmZvIGV4aXN0cyBsaW5lc2VnZW5kcygkcildfSB7CgkgICAgZm9yZWFjaCBpZCAkbGluZXNlZ2VuZHMoJHIpIHsKCQlzZXQgaSAtMQoJCWZvcmVhY2gge3MgZX0gJGlkcm93cmFuZ2VzKCRpZCkgewoJCSAgICBpbmNyIGkKCQkgICAgaWYgeyRlIG5lIHt9ICYmICRlIDwgJG51bWNvbW1pdHMgJiYgJHMgPD0gJHIxICYmICRlID49ICRyMAoJCQkmJiAhW2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0gewoJCQlkcmF3bGluZXNlZyAkaWQgJGkKCQkJc2V0IGlkcmFuZ2VkcmF3bigkaWQsJGkpIDEKCQkgICAgfQoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JGNhbnNob3cgPiAkcjF9IHsKCXNldCBjYW5zaG93ICRyMQogICAgfQogICAgd2hpbGUgeyRyb3cgPCAkY2Fuc2hvd30gewoJZHJhd2NtaXRyb3cgJHJvdwoJaW5jciByb3cKICAgIH0KfQoKcHJvYyBsYXlvdXRyb3dzIHtyb3cgZW5kcm93IGxhc3R9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCB1cGFycm93bGVuIGRvd25hcnJvd2xlbiBtYXh3aWR0aCBtaW5nYXBsZW4KICAgIGdsb2JhbCBuY2hpbGRyZW4gcGFyZW50cyBucGFyZW50cwogICAgZ2xvYmFsIGlkcm93cmFuZ2VzIGxpbmVzZWdlbmRzCiAgICBnbG9iYWwgY29tbWl0aWR4CiAgICBnbG9iYWwgaWRpbmxpc3Qgcm93Y2hrCgogICAgc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KICAgIHNldCBvZmZzIFtsaW5kZXggJHJvd29mZnNldHMgJHJvd10KICAgIHdoaWxlIHskcm93IDwgJGVuZHJvd30gewoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQoJc2V0IG9sZG9sZHMge30KCXNldCBuZXdvbGRzIHt9Cglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgaWRpbmxpc3QoJHApXX0gewoJCWxhcHBlbmQgbmV3b2xkcyAkcAoJICAgIH0gZWxzZWlmIHshJGlkaW5saXN0KCRwKX0gewoJCWxhcHBlbmQgb2xkb2xkcyAkcAoJICAgIH0KCX0KCXNldCBuZXYgW2V4cHIge1tsbGVuZ3RoICRpZGxpc3RdICsgW2xsZW5ndGggJG5ld29sZHNdCgkJICAgICAgICsgW2xsZW5ndGggJG9sZG9sZHNdIC0gJG1heHdpZHRoICsgMX1dCglpZiB7JG5ldiA+IDB9IHsKCSAgICBpZiB7ISRsYXN0ICYmICRyb3cgKyAkdXBhcnJvd2xlbiArICRtaW5nYXBsZW4gPj0gJGNvbW1pdGlkeH0gYnJlYWsKCSAgICBmb3Ige3NldCB4IFtsbGVuZ3RoICRpZGxpc3RdfSB7W2luY3IgeCAtMV0gPj0gMH0ge30gewoJCXNldCBpIFtsaW5kZXggJGlkbGlzdCAkeF0KCQlpZiB7IVtpbmZvIGV4aXN0cyByb3djaGsoJGkpXSB8fCAkcm93ID49ICRyb3djaGsoJGkpfSB7CgkJICAgIHNldCByIFt1c2VkaW5yYW5nZSAkaSBbZXhwciB7JHJvdyAtICRkb3duYXJyb3dsZW59XSBcCgkJCSAgICAgICBbZXhwciB7JHJvdyArICR1cGFycm93bGVuICsgJG1pbmdhcGxlbn1dXQoJCSAgICBpZiB7JHIgPT0gMH0gewoJCQlzZXQgaWRsaXN0IFtscmVwbGFjZSAkaWRsaXN0ICR4ICR4XQoJCQlzZXQgb2ZmcyBbbHJlcGxhY2UgJG9mZnMgJHggJHhdCgkJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkeCAxXQoJCQlzZXQgaWRpbmxpc3QoJGkpIDAKCQkJc2V0IHJtMSBbZXhwciB7JHJvdyAtIDF9XQoJCQlsYXBwZW5kIGxpbmVzZWdlbmRzKCRybTEpICRpCgkJCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGkpICRybTEKCQkJaWYge1tpbmNyIG5ldiAtMV0gPD0gMH0gYnJlYWsKCQkJY29udGludWUKCQkgICAgfQoJCSAgICBzZXQgcm93Y2hrKCRpZCkgW2V4cHIgeyRyb3cgKyAkcn1dCgkJfQoJICAgIH0KCSAgICBsc2V0IHJvd2lkbGlzdCAkcm93ICRpZGxpc3QKCSAgICBsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwoJfQoJc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgJGlkbGlzdCAkaWRdCglpZiB7JGNvbCA8IDB9IHsKCSAgICBzZXQgY29sIFtsbGVuZ3RoICRpZGxpc3RdCgkgICAgbGFwcGVuZCBpZGxpc3QgJGlkCgkgICAgbHNldCByb3dpZGxpc3QgJHJvdyAkaWRsaXN0CgkgICAgc2V0IHoge30KCSAgICBpZiB7JG5jaGlsZHJlbigkaWQpID4gMH0gewoJCXNldCB6IFtleHByIHtbbGxlbmd0aCBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRyb3ctMX1dXV0gLSAkY29sfV0KCQl1bnNldCBpZGlubGlzdCgkaWQpCgkgICAgfQoJICAgIGxhcHBlbmQgb2ZmcyAkegoJICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCgkgICAgaWYgeyR6IG5lIHt9fSB7CgkJbWFrZXVwYXJyb3cgJGlkICRjb2wgJHJvdyAkegoJICAgIH0KCX0gZWxzZSB7CgkgICAgdW5zZXQgaWRpbmxpc3QoJGlkKQoJfQoJaWYge1tpbmZvIGV4aXN0cyBpZHJvd3JhbmdlcygkaWQpXX0gewoJICAgIGxhcHBlbmQgaWRyb3dyYW5nZXMoJGlkKSAkcm93Cgl9CglpbmNyIHJvdwoJc2V0IG9mZnMgW250aW1lcyBbbGxlbmd0aCAkaWRsaXN0XSAwXQoJc2V0IGwgW2xsZW5ndGggJG5ld29sZHNdCglzZXQgaWRsaXN0IFtldmFsIGxyZXBsYWNlIFwkaWRsaXN0ICRjb2wgJGNvbCAkbmV3b2xkc10KCXNldCBvIDAKCWlmIHskbCAhPSAxfSB7CgkgICAgc2V0IG9mZnMgW2xyYW5nZSAkb2ZmcyAwIFtleHByIHskY29sIC0gMX1dXQoJICAgIGZvcmVhY2ggeCAkbmV3b2xkcyB7CgkJbGFwcGVuZCBvZmZzIHt9CgkJaW5jciBvIC0xCgkgICAgfQoJICAgIGluY3IgbwoJICAgIHNldCB0bXAgW2V4cHIge1tsbGVuZ3RoICRpZGxpc3RdIC0gW2xsZW5ndGggJG9mZnNdfV0KCSAgICBpZiB7JHRtcCA+IDB9IHsKCQlzZXQgb2ZmcyBbY29uY2F0ICRvZmZzIFtudGltZXMgJHRtcCAkb11dCgkgICAgfQoJfSBlbHNlIHsKCSAgICBsc2V0IG9mZnMgJGNvbCB7fQoJfQoJZm9yZWFjaCBpICRuZXdvbGRzIHsKCSAgICBzZXQgaWRpbmxpc3QoJGkpIDEKCSAgICBzZXQgaWRyb3dyYW5nZXMoJGkpICRyb3cKCX0KCWluY3IgY29sICRsCglmb3JlYWNoIG9pZCAkb2xkb2xkcyB7CgkgICAgc2V0IGlkaW5saXN0KCRvaWQpIDEKCSAgICBzZXQgaWRsaXN0IFtsaW5zZXJ0ICRpZGxpc3QgJGNvbCAkb2lkXQoJICAgIHNldCBvZmZzIFtsaW5zZXJ0ICRvZmZzICRjb2wgJG9dCgkgICAgbWFrZXVwYXJyb3cgJG9pZCAkY29sICRyb3cgJG8KCSAgICBpbmNyIGNvbAoJfQoJbGFwcGVuZCByb3dpZGxpc3QgJGlkbGlzdAoJbGFwcGVuZCByb3dvZmZzZXRzICRvZmZzCiAgICB9CiAgICByZXR1cm4gJHJvdwp9Cgpwcm9jIGFkZGV4dHJhaWQge2lkIHJvd30gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBjb21taXRyb3cgY29tbWl0aW5mbyBucGFyZW50cwogICAgZ2xvYmFsIGNvbW1pdGlkeAoKICAgIGluY3IgY29tbWl0aWR4CiAgICBsYXBwZW5kIGRpc3BsYXlvcmRlciAkaWQKICAgIHNldCBjb21taXRyb3coJGlkKSAkcm93CiAgICByZWFkY29tbWl0ICRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJc2V0IG5wYXJlbnRzKCRpZCkgMAogICAgfQp9Cgpwcm9jIGxheW91dHRhaWwge30gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIGlkaW5saXN0IGNvbW1pdGlkeAogICAgZ2xvYmFsIGlkcm93cmFuZ2VzCgogICAgc2V0IHJvdyAkY29tbWl0aWR4CiAgICBzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQogICAgd2hpbGUgeyRpZGxpc3QgbmUge319IHsKCXNldCBjb2wgW2V4cHIge1tsbGVuZ3RoICRpZGxpc3RdIC0gMX1dCglzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCglhZGRleHRyYWlkICRpZCAkcm93Cgl1bnNldCBpZGlubGlzdCgkaWQpCglsYXBwZW5kIGlkcm93cmFuZ2VzKCRpZCkgJHJvdwoJaW5jciByb3cKCXNldCBvZmZzIFtudGltZXMgJGNvbCAwXQoJc2V0IGlkbGlzdCBbbHJlcGxhY2UgJGlkbGlzdCAkY29sICRjb2xdCglsYXBwZW5kIHJvd2lkbGlzdCAkaWRsaXN0CglsYXBwZW5kIHJvd29mZnNldHMgJG9mZnMKICAgIH0KCiAgICBmb3JlYWNoIGlkIFthcnJheSBuYW1lcyBpZGlubGlzdF0gewoJYWRkZXh0cmFpZCAkaWQgJHJvdwoJbHNldCByb3dpZGxpc3QgJHJvdyBbbGlzdCAkaWRdCglsc2V0IHJvd29mZnNldHMgJHJvdyAwCgltYWtldXBhcnJvdyAkaWQgMCAkcm93IDAKCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGlkKSAkcm93CglpbmNyIHJvdwoJbGFwcGVuZCByb3dpZGxpc3Qge30KCWxhcHBlbmQgcm93b2Zmc2V0cyB7fQogICAgfQp9Cgpwcm9jIGluc2VydF9wYWQge3JvdyBjb2wgbnBhZH0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzCgogICAgc2V0IHBhZCBbbnRpbWVzICRucGFkIHt9XQogICAgbHNldCByb3dpZGxpc3QgJHJvdyBbZXZhbCBsaW5zZXJ0IFtsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XV0gJGNvbCAkcGFkXQogICAgc2V0IHRtcCBbZXZhbCBsaW5zZXJ0IFtsaXN0IFtsaW5kZXggJHJvd29mZnNldHMgJHJvd11dICRjb2wgJHBhZF0KICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93IFtpbmNyYW5nZSAkdG1wIFtleHByIHskY29sICsgJG5wYWR9XSBbZXhwciB7LSRucGFkfV1dCn0KCnByb2Mgb3B0aW1pemVfcm93cyB7cm93IGNvbCBlbmRyb3d9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBpZHJvd3JhbmdlcyBsaW5lc2VnZW5kcyBkaXNwbGF5b3JkZXIKCiAgICBmb3Ige30geyRyb3cgPCAkZW5kcm93fSB7aW5jciByb3d9IHsKCXNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCglzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCglzZXQgaGFzcGFkIDAKCXNldCBkb3duYXJyb3djb2xzIHt9CglpZiB7W2luZm8gZXhpc3RzIGxpbmVzZWdlbmRzKCRyb3cpXX0gewoJICAgIHNldCBkb3duYXJyb3djb2xzICRsaW5lc2VnZW5kcygkcm93KQoJICAgIGlmIHskY29sID4gMH0gewoJCXdoaWxlIHskZG93bmFycm93Y29scyBuZSB7fX0gewoJCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGlkbGlzdCBbbGluZGV4ICRkb3duYXJyb3djb2xzIDBdXQoJCSAgICBpZiB7JGkgPCAwIHx8ICRpID49ICRjb2x9IGJyZWFrCgkJICAgIHNldCBkb3duYXJyb3djb2xzIFtscmFuZ2UgJGRvd25hcnJvd2NvbHMgMSBlbmRdCgkJfQoJICAgIH0KCX0KCWZvciB7fSB7JGNvbCA8IFtsbGVuZ3RoICRvZmZzXX0ge2luY3IgY29sfSB7CgkgICAgaWYge1tsaW5kZXggJGlkbGlzdCAkY29sXSBlcSB7fX0gewoJCXNldCBoYXNwYWQgMQoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCB6IFtsaW5kZXggJG9mZnMgJGNvbF0KCSAgICBpZiB7JHogZXEge319IGNvbnRpbnVlCgkgICAgc2V0IGlzYXJyb3cgMAoJICAgIHNldCB4MCBbZXhwciB7JGNvbCArICR6fV0KCSAgICBzZXQgeTAgW2V4cHIgeyRyb3cgLSAxfV0KCSAgICBzZXQgejAgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTAgJHgwXQoJICAgIGlmIHskejAgZXEge319IHsKCQlzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCgkJaWYge1tpbmZvIGV4aXN0cyBpZHJvd3JhbmdlcygkaWQpXSAmJgoJCSAgICAkeTAgPiBbbGluZGV4ICRpZHJvd3JhbmdlcygkaWQpIDBdfSB7CgkJICAgIHNldCBpc2Fycm93IDEKCQl9CgkgICAgfSBlbHNlaWYgeyRkb3duYXJyb3djb2xzIG5lIHt9ICYmCgkJICAgICAgW2xpbmRleCAkaWRsaXN0ICRjb2xdIGVxIFtsaW5kZXggJGRvd25hcnJvd2NvbHMgMF19IHsKCQlzZXQgZG93bmFycm93Y29scyBbbHJhbmdlICRkb3duYXJyb3djb2xzIDEgZW5kXQoJCXNldCBpc2Fycm93IDEKCSAgICB9CgkgICAgaWYgeyR6IDwgLTEgfHwgKCR6IDwgMCAmJiAkaXNhcnJvdyl9IHsKCQlzZXQgbnBhZCBbZXhwciB7LTEgLSAkeiArICRpc2Fycm93fV0KCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJG9mZnMgJGNvbCAkbnBhZF0KCQlpbnNlcnRfcGFkICR5MCAkeDAgJG5wYWQKCQlpZiB7JHkwID4gMH0gewoJCSAgICBvcHRpbWl6ZV9yb3dzICR5MCAkeDAgJHJvdwoJCX0KCQlzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkJc2V0IHgwIFtleHByIHskY29sICsgJHp9XQoJCXNldCB6MCBbbGluZGV4ICRyb3dvZmZzZXRzICR5MCAkeDBdCgkgICAgfSBlbHNlaWYgeyR6ID4gMSB8fCAoJHogPiAwICYmICRpc2Fycm93KX0gewoJCXNldCBucGFkIFtleHByIHskeiAtIDEgKyAkaXNhcnJvd31dCgkJc2V0IHkxIFtleHByIHskcm93ICsgMX1dCgkJc2V0IG9mZnMyIFtsaW5kZXggJHJvd29mZnNldHMgJHkxXQoJCXNldCB4MSAtMQoJCWZvcmVhY2ggeiAkb2ZmczIgewoJCSAgICBpbmNyIHgxCgkJICAgIGlmIHskeiBlcSB7fSB8fCAkeDEgKyAkeiA8ICRjb2x9IGNvbnRpbnVlCgkJICAgIGlmIHskeDEgKyAkeiA+ICRjb2x9IHsKCQkJaW5jciBucGFkCgkJICAgIH0KCQkgICAgbHNldCByb3dvZmZzZXRzICR5MSBbaW5jcmFuZ2UgJG9mZnMyICR4MSAkbnBhZF0KCQkgICAgYnJlYWsKCQl9CgkJc2V0IHBhZCBbbnRpbWVzICRucGFkIHt9XQoJCXNldCBpZGxpc3QgW2V2YWwgbGluc2VydCBcJGlkbGlzdCAkY29sICRwYWRdCgkJc2V0IHRtcCBbZXZhbCBsaW5zZXJ0IFwkb2ZmcyAkY29sICRwYWRdCgkJaW5jciBjb2wgJG5wYWQKCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJHRtcCAkY29sIFtleHByIHstJG5wYWR9XV0KCQlzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkJc2V0IGhhc3BhZCAxCgkgICAgfQoJICAgIGlmIHskejAgZXEge30gJiYgISRpc2Fycm93fSB7CgkJIyB0aGlzIGxpbmUgbGlua3MgdG8gaXRzIGZpcnN0IGNoaWxkIG9uIHJvdyAkcm93LTIKCQlzZXQgcm0yIFtleHByIHskcm93IC0gMn1dCgkJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm0yXQoJCXNldCB4YyBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRybTJdICRpZF0KCQlpZiB7JHhjID49IDB9IHsKCQkgICAgc2V0IHowIFtleHByIHskeGMgLSAkeDB9XQoJCX0KCSAgICB9CgkgICAgaWYgeyR6MCBuZSB7fSAmJiAkeiA8IDAgJiYgJHowID4gMH0gewoJCWluc2VydF9wYWQgJHkwICR4MCAxCgkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICRjb2wgMV0KCQlvcHRpbWl6ZV9yb3dzICR5MCBbZXhwciB7JHgwICsgMX1dICRyb3cKCSAgICB9Cgl9CglpZiB7ISRoYXNwYWR9IHsKCSAgICBzZXQgbyB7fQoJICAgIGZvciB7c2V0IGNvbCBbbGxlbmd0aCAkaWRsaXN0XX0ge1tpbmNyIGNvbCAtMV0gPj0gMH0ge30gewoJCXNldCBvIFtsaW5kZXggJG9mZnMgJGNvbF0KCQlpZiB7JG8gZXEge319IHsKCQkgICAgIyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsaW5rIHRvIHRoZSBmaXJzdCBjaGlsZAoJCSAgICBzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCgkJICAgIGlmIHtbaW5mbyBleGlzdHMgaWRyb3dyYW5nZXMoJGlkKV0gJiYKCQkJJHJvdyA9PSBbbGluZGV4ICRpZHJvd3JhbmdlcygkaWQpIDBdfSB7CgkJCSMgaXQgaXMsIHdvcmsgb3V0IG9mZnNldCB0byBjaGlsZAoJCQlzZXQgeTAgW2V4cHIgeyRyb3cgLSAxfV0KCQkJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkeTBdCgkJCXNldCB4MCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICR5MF0gJGlkXQoJCQlpZiB7JHgwID49IDB9IHsKCQkJICAgIHNldCBvIFtleHByIHskeDAgLSAkY29sfV0KCQkJfQoJCSAgICB9CgkJfQoJCWlmIHskbyBlcSB7fSB8fCAkbyA8PSAwfSBicmVhawoJICAgIH0KCSAgICBpZiB7JG8gbmUge30gJiYgW2luY3IgY29sXSA8IFtsbGVuZ3RoICRpZGxpc3RdfSB7CgkJc2V0IHkxIFtleHByIHskcm93ICsgMX1dCgkJc2V0IG9mZnMyIFtsaW5kZXggJHJvd29mZnNldHMgJHkxXQoJCXNldCB4MSAtMQoJCWZvcmVhY2ggeiAkb2ZmczIgewoJCSAgICBpbmNyIHgxCgkJICAgIGlmIHskeiBlcSB7fSB8fCAkeDEgKyAkeiA8ICRjb2x9IGNvbnRpbnVlCgkJICAgIGxzZXQgcm93b2Zmc2V0cyAkeTEgW2luY3JhbmdlICRvZmZzMiAkeDEgMV0KCQkgICAgYnJlYWsKCQl9CgkJc2V0IGlkbGlzdCBbbGluc2VydCAkaWRsaXN0ICRjb2wge31dCgkJc2V0IHRtcCBbbGluc2VydCAkb2ZmcyAkY29sIHt9XQoJCWluY3IgY29sCgkJc2V0IG9mZnMgW2luY3JhbmdlICR0bXAgJGNvbCAtMV0KCSAgICB9Cgl9Cglsc2V0IHJvd2lkbGlzdCAkcm93ICRpZGxpc3QKCWxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCglzZXQgY29sIDAKICAgIH0KfQoKcHJvYyB4YyB7cm93IGNvbH0gewogICAgZ2xvYmFsIGNhbnZ4MCBsaW5lc3BjCiAgICByZXR1cm4gW2V4cHIgeyRjYW52eDAgKyAkY29sICogJGxpbmVzcGN9XQp9Cgpwcm9jIHljIHtyb3d9IHsKICAgIGdsb2JhbCBjYW52eTAgbGluZXNwYwogICAgcmV0dXJuIFtleHByIHskY2FudnkwICsgJHJvdyAqICRsaW5lc3BjfV0KfQoKcHJvYyBsaW5ld2lkdGgge2lkfSB7CiAgICBnbG9iYWwgdGhpY2tlcmxpbmUgbHRoaWNrbmVzcwoKICAgIHNldCB3aWQgJGx0aGlja25lc3MKICAgIGlmIHtbaW5mbyBleGlzdHMgdGhpY2tlcmxpbmVdICYmICRpZCBlcSAkdGhpY2tlcmxpbmV9IHsKCXNldCB3aWQgW2V4cHIgezIgKiAkbHRoaWNrbmVzc31dCiAgICB9CiAgICByZXR1cm4gJHdpZAp9Cgpwcm9jIGRyYXdsaW5lc2VnIHtpZCBpfSB7CiAgICBnbG9iYWwgcm93b2Zmc2V0cyByb3dpZGxpc3QgaWRyb3dyYW5nZXMKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCBjYW52IGNvbG9ybWFwCgogICAgc2V0IHN0YXJ0cm93IFtsaW5kZXggJGlkcm93cmFuZ2VzKCRpZCkgW2V4cHIgezIgKiAkaX1dXQogICAgc2V0IHJvdyBbbGluZGV4ICRpZHJvd3JhbmdlcygkaWQpIFtleHByIHsyICogJGkgKyAxfV1dCiAgICBpZiB7JHN0YXJ0cm93ID09ICRyb3d9IHJldHVybgogICAgYXNzaWduY29sb3IgJGlkCiAgICBzZXQgY29vcmRzIHt9CiAgICBzZXQgY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGlkXQogICAgaWYgeyRjb2wgPCAwfSB7CglwdXRzICJvb3BzOiBkcmF3bGluZTogaWQgJGlkIG5vdCBvbiByb3cgJHJvdyIKCXJldHVybgogICAgfQogICAgc2V0IGxhc3RvIHt9CiAgICBzZXQgbnMgMAogICAgd2hpbGUgezF9IHsKCXNldCBvIFtsaW5kZXggJHJvd29mZnNldHMgJHJvdyAkY29sXQoJaWYgeyRvIGVxIHt9fSBicmVhawoJaWYgeyRvIG5lICRsYXN0b30gewoJICAgICMgY2hhbmdpbmcgZGlyZWN0aW9uCgkgICAgc2V0IHggW3hjICRyb3cgJGNvbF0KCSAgICBzZXQgeSBbeWMgJHJvd10KCSAgICBsYXBwZW5kIGNvb3JkcyAkeCAkeQoJICAgIHNldCBsYXN0byAkbwoJfQoJaW5jciBjb2wgJG8KCWluY3Igcm93IC0xCiAgICB9CiAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQogICAgc2V0IHkgW3ljICRyb3ddCiAgICBsYXBwZW5kIGNvb3JkcyAkeCAkeQogICAgaWYgeyRpID09IDB9IHsKCSMgZHJhdyB0aGUgbGluayB0byB0aGUgZmlyc3QgY2hpbGQgYXMgcGFydCBvZiB0aGlzIGxpbmUKCWluY3Igcm93IC0xCglzZXQgY2hpbGQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCglzZXQgY2NvbCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRjaGlsZF0KCWlmIHskY2NvbCA+PSAwfSB7CgkgICAgc2V0IHggW3hjICRyb3cgJGNjb2xdCgkgICAgc2V0IHkgW3ljICRyb3ddCgkgICAgaWYgeyRjY29sIDwgJGNvbCAtIDF9IHsKCQlsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGNvbCAtIDF9XV0gW3ljICRyb3ddCgkgICAgfSBlbHNlaWYgeyRjY29sID4gJGNvbCArIDF9IHsKCQlsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGNvbCArIDF9XV0gW3ljICRyb3ddCgkgICAgfQoJICAgIGxhcHBlbmQgY29vcmRzICR4ICR5Cgl9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGNvb3Jkc10gPCA0fSByZXR1cm4KICAgIHNldCBsYXN0IFtleHByIHtbbGxlbmd0aCAkaWRyb3dyYW5nZXMoJGlkKV0gLyAyIC0gMX1dCiAgICBzZXQgYXJyb3cgW2V4cHIgezIgKiAoJGkgPiAwKSArICgkaSA8ICRsYXN0KX1dCiAgICBzZXQgYXJyb3cgW2xpbmRleCB7bm9uZSBmaXJzdCBsYXN0IGJvdGh9ICRhcnJvd10KICAgIHNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC13aWR0aCBbbGluZXdpZHRoICRpZF0gXAoJICAgICAgIC1maWxsICRjb2xvcm1hcCgkaWQpIC10YWdzIGxpbmVzLiRpZCAtYXJyb3cgJGFycm93XQogICAgJGNhbnYgbG93ZXIgJHQKICAgIGJpbmRsaW5lICR0ICRpZAp9Cgpwcm9jIGRyYXdwYXJlbnRsaW5rcyB7aWQgcm93IGNvbCBvbGRzfSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IGNhbnYgY29sb3JtYXAgaWRyb3dyYW5nZXMKCiAgICBzZXQgcm93MiBbZXhwciB7JHJvdyArIDF9XQogICAgc2V0IHggW3hjICRyb3cgJGNvbF0KICAgIHNldCB5IFt5YyAkcm93XQogICAgc2V0IHkyIFt5YyAkcm93Ml0KICAgIHNldCBpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3cyXQogICAgIyBybXggPSByaWdodC1tb3N0IFggY29vcmQgdXNlZAogICAgc2V0IHJteCAwCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJaWYge1tpbmZvIGV4aXN0cyBpZHJvd3JhbmdlcygkcCldICYmCgkgICAgJHJvdzIgPT0gW2xpbmRleCAkaWRyb3dyYW5nZXMoJHApIDBdICYmCgkgICAgJHJvdzIgPCBbbGluZGV4ICRpZHJvd3JhbmdlcygkcCkgMV19IHsKCSAgICAjIGRyYXdsaW5lc2VnIHdpbGwgZG8gdGhpcyBvbmUgZm9yIHVzCgkgICAgY29udGludWUKCX0KCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRzICRwXQoJaWYgeyRpIDwgMH0gewoJICAgIHB1dHMgIm9vcHMsIHBhcmVudCAkcCBvZiAkaWQgbm90IGluIGxpc3QiCgkgICAgY29udGludWUKCX0KCWFzc2lnbmNvbG9yICRwCgkjIHNob3VsZCBoYW5kbGUgZHVwbGljYXRlZCBwYXJlbnRzIGhlcmUuLi4KCXNldCBjb29yZHMgW2xpc3QgJHggJHldCglpZiB7JGkgPCAkY29sIC0gMX0gewoJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskaSArIDF9XV0gJHkKCX0gZWxzZWlmIHskaSA+ICRjb2wgKyAxfSB7CgkgICAgbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRpIC0gMX1dXSAkeQoJfQoJc2V0IHgyIFt4YyAkcm93MiAkaV0KCWlmIHskeDIgPiAkcm14fSB7CgkgICAgc2V0IHJteCAkeDIKCX0KCWxhcHBlbmQgY29vcmRzICR4MiAkeTIKCXNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC13aWR0aCBbbGluZXdpZHRoICRwXSBcCgkJICAgLWZpbGwgJGNvbG9ybWFwKCRwKSAtdGFncyBsaW5lcy4kcF0KCSRjYW52IGxvd2VyICR0CgliaW5kbGluZSAkdCAkcAogICAgfQogICAgcmV0dXJuICRybXgKfQoKcHJvYyBkcmF3bGluZXMge2lkfSB7CiAgICBnbG9iYWwgY29sb3JtYXAgY2FudgogICAgZ2xvYmFsIGlkcm93cmFuZ2VzIGlkcmFuZ2VkcmF3bgogICAgZ2xvYmFsIGNoaWxkcmVuIGlkZHJhd24gY29tbWl0cm93IHJvd2lkbGlzdAoKICAgICRjYW52IGRlbGV0ZSBsaW5lcy4kaWQKICAgIHNldCBuciBbZXhwciB7W2xsZW5ndGggJGlkcm93cmFuZ2VzKCRpZCldIC8gMn1dCiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRucn0ge2luY3IgaX0gewoJaWYge1tpbmZvIGV4aXN0cyBpZHJhbmdlZHJhd24oJGlkLCRpKV19IHsKCSAgICBkcmF3bGluZXNlZyAkaWQgJGkKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGlkKV19IHsKCWZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRpZCkgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkY2hpbGQpXX0gewoJCXNldCByb3cgJGNvbW1pdHJvdygkY2hpbGQpCgkJc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRjaGlsZF0KCQlpZiB7JGNvbCA+PSAwfSB7CgkJICAgIGRyYXdwYXJlbnRsaW5rcyAkY2hpbGQgJHJvdyAkY29sIFtsaXN0ICRpZF0KCQl9CgkgICAgfQoJfQogICAgfQp9Cgpwcm9jIGRyYXdjbWl0dGV4dCB7aWQgcm93IGNvbCBybXh9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNhbnYgY2FudjIgY2FudjMgY2FudnkwCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIGNvbW1pdGluZm8gcm93aWRsaXN0CiAgICBnbG9iYWwgcm93dGV4dHggaWRwb3MgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIG1haW5mb250IG5hbWVmb250CgogICAgc2V0IG9maWxsIFtleHByIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldPyAiYmx1ZSI6ICJ3aGl0ZSJ9XQogICAgc2V0IHggW3hjICRyb3cgJGNvbF0KICAgIHNldCB5IFt5YyAkcm93XQogICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIG92YWwgW2V4cHIgeyR4IC0gJG9yYWR9XSBbZXhwciB7JHkgLSAkb3JhZH1dIFwKCSAgICAgICBbZXhwciB7JHggKyAkb3JhZCAtIDF9XSBbZXhwciB7JHkgKyAkb3JhZCAtIDF9XSBcCgkgICAgICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxXQogICAgJGNhbnYgcmFpc2UgJHQKICAgICRjYW52IGJpbmQgJHQgPDE+IHtzZWxjYW52bGluZSB7fSAleCAleX0KICAgIHNldCB4dCBbeGMgJHJvdyBbbGxlbmd0aCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd11dXQogICAgaWYgeyR4dCA8ICRybXh9IHsKCXNldCB4dCAkcm14CiAgICB9CiAgICBzZXQgcm93dGV4dHgoJHJvdykgJHh0CiAgICBzZXQgaWRwb3MoJGlkKSBbbGlzdCAkeCAkeHQgJHldCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXSB8fCBbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXQoJfHwgW2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgeHQgW2RyYXd0YWdzICRpZCAkeCAkeHQgJHldCiAgICB9CiAgICBzZXQgaGVhZGxpbmUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDBdCiAgICBzZXQgbmFtZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMV0KICAgIHNldCBkYXRlIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAyXQogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgJGRhdGVdCiAgICBzZXQgbGluZWh0YWcoJHJvdykgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4dCAkeSAtYW5jaG9yIHcgXAoJCQkgICAgLXRleHQgJGhlYWRsaW5lIC1mb250ICRtYWluZm9udCBdCiAgICAkY2FudiBiaW5kICRsaW5laHRhZygkcm93KSA8QnV0dG9uLTM+ICJyb3dtZW51ICVYICVZICRpZCIKICAgIHNldCBsaW5lbnRhZygkcm93KSBbJGNhbnYyIGNyZWF0ZSB0ZXh0IDMgJHkgLWFuY2hvciB3IFwKCQkJICAgIC10ZXh0ICRuYW1lIC1mb250ICRuYW1lZm9udF0KICAgIHNldCBsaW5lZHRhZygkcm93KSBbJGNhbnYzIGNyZWF0ZSB0ZXh0IDMgJHkgLWFuY2hvciB3IFwKCQkJICAgIC10ZXh0ICRkYXRlIC1mb250ICRtYWluZm9udF0KfQoKcHJvYyBkcmF3Y21pdHJvdyB7cm93fSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHJvd2lkbGlzdAogICAgZ2xvYmFsIGlkcm93cmFuZ2VzIGlkcmFuZ2VkcmF3biBpZGRyYXduCiAgICBnbG9iYWwgY29tbWl0aW5mbyBjb21taXRsaXN0ZWQgcGFyZW50cyBudW1jb21taXRzCgogICAgaWYgeyRyb3cgPj0gJG51bWNvbW1pdHN9IHJldHVybgogICAgZm9yZWFjaCBpZCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gewoJaWYgeyFbaW5mbyBleGlzdHMgaWRyb3dyYW5nZXMoJGlkKV19IGNvbnRpbnVlCglzZXQgaSAtMQoJZm9yZWFjaCB7cyBlfSAkaWRyb3dyYW5nZXMoJGlkKSB7CgkgICAgaW5jciBpCgkgICAgaWYgeyRyb3cgPCAkc30gY29udGludWUKCSAgICBpZiB7JGUgZXEge319IGJyZWFrCgkgICAgaWYgeyRyb3cgPD0gJGV9IHsKCQlpZiB7JGUgPCAkbnVtY29tbWl0cyAmJiAhW2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0gewoJCSAgICBkcmF3bGluZXNlZyAkaWQgJGkKCQkgICAgc2V0IGlkcmFuZ2VkcmF3bigkaWQsJGkpIDEKCQl9CgkJYnJlYWsKCSAgICB9Cgl9CiAgICB9CgogICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldfSByZXR1cm4KICAgIHNldCBjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkaWRdCiAgICBpZiB7JGNvbCA8IDB9IHsKCXB1dHMgIm9vcHMsIHJvdyAkcm93IGlkICRpZCBub3QgaW4gbGlzdCIKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJZ2V0Y29tbWl0ICRpZAogICAgfQogICAgYXNzaWduY29sb3IgJGlkCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXSAmJiBbaW5mbyBleGlzdHMgcGFyZW50cygkaWQpXQoJJiYgJHBhcmVudHMoJGlkKSBuZSB7fX0gewoJc2V0IHJteCBbZHJhd3BhcmVudGxpbmtzICRpZCAkcm93ICRjb2wgJHBhcmVudHMoJGlkKV0KICAgIH0gZWxzZSB7CglzZXQgcm14IDAKICAgIH0KICAgIGRyYXdjbWl0dGV4dCAkaWQgJHJvdyAkY29sICRybXgKICAgIHNldCBpZGRyYXduKCRpZCkgMQp9Cgpwcm9jIGRyYXdmcmFjIHtmMCBmMX0gewogICAgZ2xvYmFsIG51bWNvbW1pdHMgY2FudgogICAgZ2xvYmFsIGxpbmVzcGMKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgeTAgW2V4cHIge2ludCgkZjAgKiAkeW1heCl9XQogICAgc2V0IHJvdyBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQogICAgaWYgeyRyb3cgPCAwfSB7CglzZXQgcm93IDAKICAgIH0KICAgIHNldCB5MSBbZXhwciB7aW50KCRmMSAqICR5bWF4KX1dCiAgICBzZXQgZW5kcm93IFtleHByIHtpbnQoKCR5MSAtIDMpIC8gJGxpbmVzcGMpICsgMX1dCiAgICBpZiB7JGVuZHJvdyA+PSAkbnVtY29tbWl0c30gewoJc2V0IGVuZHJvdyBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KICAgIH0KICAgIGZvciB7fSB7JHJvdyA8PSAkZW5kcm93fSB7aW5jciByb3d9IHsKCWRyYXdjbWl0cm93ICRyb3cKICAgIH0KfQoKcHJvYyBkcmF3dmlzaWJsZSB7fSB7CiAgICBnbG9iYWwgY2FudgogICAgZXZhbCBkcmF3ZnJhYyBbJGNhbnYgeXZpZXddCn0KCnByb2MgY2xlYXJfZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgaWRkcmF3biBpZHJhbmdlZHJhd24KCiAgICBhbGxjYW52cyBkZWxldGUgYWxsCiAgICBjYXRjaCB7dW5zZXQgaWRkcmF3bn0KICAgIGNhdGNoIHt1bnNldCBpZHJhbmdlZHJhd259Cn0KCnByb2MgYXNzaWduY29sb3Ige2lkfSB7CiAgICBnbG9iYWwgY29sb3JtYXAgY29sb3JzIG5leHRjb2xvcgogICAgZ2xvYmFsIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4gbmNoaWxkcmVuCiAgICBnbG9iYWwgY29ybmVyY3Jvc3NpbmdzIGNyb3NzaW5ncwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGlkKV19IHJldHVybgogICAgc2V0IG5jb2xvcnMgW2xsZW5ndGggJGNvbG9yc10KICAgIGlmIHskbmNoaWxkcmVuKCRpZCkgPT0gMX0gewoJc2V0IGNoaWxkIFtsaW5kZXggJGNoaWxkcmVuKCRpZCkgMF0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCSAgICAmJiAkbnBhcmVudHMoJGNoaWxkKSA9PSAxfSB7CgkgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBiYWRjb2xvcnMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldfSB7Cglmb3JlYWNoIHggJGNvcm5lcmNyb3NzaW5ncygkaWQpIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCgkgICAgfQoJfQoJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IGJhZGNvbG9ycyB7fQoJfQogICAgfQogICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7CglpZiB7W2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXX0gewoJICAgIGZvcmVhY2ggeCAkY3Jvc3NpbmdzKCRpZCkgewoJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJCX0KCSAgICB9CgkgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAoJICAgIH0KCX0KCXNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKQoJICAgIH0KCSAgICBpZiB7W2luZm8gZXhpc3RzIHBhcmVudHMoJGNoaWxkKV19IHsKCQlmb3JlYWNoIHAgJHBhcmVudHMoJGNoaWxkKSB7CgkJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQoJCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHApXSA8IDB9IHsKCQkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQoJCSAgICB9CgkJfQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCX0KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRuY29sb3JzfSB7aW5jciBpfSB7CglzZXQgYyBbbGluZGV4ICRjb2xvcnMgJG5leHRjb2xvcl0KCWlmIHtbaW5jciBuZXh0Y29sb3JdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IG5leHRjb2xvciAwCgl9CglpZiB7W2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNdfSBicmVhawogICAgfQogICAgc2V0IGNvbG9ybWFwKCRpZCkgJGMKfQoKcHJvYyBiaW5kbGluZSB7dCBpZH0gewogICAgZ2xvYmFsIGNhbnYKCiAgICAkY2FudiBiaW5kICR0IDxFbnRlcj4gImxpbmVlbnRlciAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxNb3Rpb24+ICJsaW5lbW90aW9uICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPExlYXZlPiAibGluZWxlYXZlICRpZCIKICAgICRjYW52IGJpbmQgJHQgPEJ1dHRvbi0xPiAibGluZWNsaWNrICV4ICV5ICRpZCAxIgp9Cgpwcm9jIGRyYXd0YWdzIHtpZCB4IHh0IHkxfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGNvbW1pdHJvdyByb3d0ZXh0eAoKICAgIHNldCBtYXJrcyB7fQogICAgc2V0IG50YWdzIDAKICAgIHNldCBuaGVhZHMgMAogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCBtYXJrcyAkaWR0YWdzKCRpZCkKCXNldCBudGFncyBbbGxlbmd0aCAkbWFya3NdCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRoZWFkcygkaWQpXQoJc2V0IG5oZWFkcyBbbGxlbmd0aCAkaWRoZWFkcygkaWQpXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZG90aGVycmVmcygkaWQpXQogICAgfQogICAgaWYgeyRtYXJrcyBlcSB7fX0gewoJcmV0dXJuICR4dAogICAgfQoKICAgIHNldCBkZWx0YSBbZXhwciB7aW50KDAuNSAqICgkbGluZXNwYyAtICRsdGhpY2tuZXNzKSl9XQogICAgc2V0IHl0IFtleHByIHskeTEgLSAwLjUgKiAkbGluZXNwY31dCiAgICBzZXQgeWIgW2V4cHIgeyR5dCArICRsaW5lc3BjIC0gMX1dCiAgICBzZXQgeHZhbHMge30KICAgIHNldCB3dmFscyB7fQogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHsKCXNldCB3aWQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRhZ10KCWxhcHBlbmQgeHZhbHMgJHh0CglsYXBwZW5kIHd2YWxzICR3aWQKCXNldCB4dCBbZXhwciB7JHh0ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzICsgJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICR4ICR5MSBbbGluZGV4ICR4dmFscyBlbmRdICR5MSBcCgkgICAgICAgLXdpZHRoICRsdGhpY2tuZXNzIC1maWxsIGJsYWNrIC10YWdzIHRhZy4kaWRdCiAgICAkY2FudiBsb3dlciAkdAogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHggJHh2YWxzIHdpZCAkd3ZhbHMgewoJc2V0IHhsIFtleHByIHskeCArICRkZWx0YX1dCglzZXQgeHIgW2V4cHIgeyR4ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzfV0KCWlmIHtbaW5jciBudGFncyAtMV0gPj0gMH0gewoJICAgICMgZHJhdyBhIHRhZwoJICAgIHNldCB0IFskY2FudiBjcmVhdGUgcG9seWdvbiAkeCBbZXhwciB7JHl0ICsgJGRlbHRhfV0gJHhsICR5dCBcCgkJICAgICAgICR4ciAkeXQgJHhyICR5YiAkeGwgJHliICR4IFtleHByIHskeWIgLSAkZGVsdGF9XSBcCgkJICAgICAgIC13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkXQoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJICAgIHNldCByb3d0ZXh0eCgkY29tbWl0cm93KCRpZCkpIFtleHByIHskeHIgKyAkbGluZXNwY31dCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQgb3Igb3RoZXIgcmVmCgkgICAgaWYge1tpbmNyIG5oZWFkcyAtMV0gPj0gMH0gewoJCXNldCBjb2wgZ3JlZW4KCSAgICB9IGVsc2UgewoJCXNldCBjb2wgIiNkZGRkZmYiCgkgICAgfQoJICAgIHNldCB4bCBbZXhwciB7JHhsIC0gJGRlbHRhLzJ9XQoJICAgICRjYW52IGNyZWF0ZSBwb2x5Z29uICR4ICR5dCAkeHIgJHl0ICR4ciAkeWIgJHggJHliIFwKCQktd2lkdGggMSAtb3V0bGluZSBibGFjayAtZmlsbCAkY29sIC10YWdzIHRhZy4kaWQKCX0KCXNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeGwgJHkxIC1hbmNob3IgdyAtdGV4dCAkdGFnIFwKCQkgICAtZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGFnLiRpZF0KCWlmIHskbnRhZ3MgPj0gMH0gewoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJfQogICAgfQogICAgcmV0dXJuICR4dAp9Cgpwcm9jIGNoZWNrY3Jvc3NpbmdzIHtyb3cgZW5kcm93fSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHBhcmVudHMgcm93aWRsaXN0CgogICAgZm9yIHt9IHskcm93IDwgJGVuZHJvd30ge2luY3Igcm93fSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRpZF0KCWlmIHskaSA8IDB9IGNvbnRpbnVlCglzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCBbZXhwciB7JHJvdysxfV1dCglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRpZGxpc3QgJHBdCgkgICAgaWYgeyRqID4gMH0gewoJCWlmIHskaiA8ICRpIC0gMX0gewoJCSAgICBub3RlY3Jvc3NpbmdzICRyb3cgJHAgJGogJGkgW2V4cHIgeyRqKzF9XQoJCX0gZWxzZWlmIHskaiA+ICRpICsgMX0gewoJCSAgICBub3RlY3Jvc3NpbmdzICRyb3cgJHAgJGkgJGogW2V4cHIgeyRqLTF9XQoJCX0KCSAgICB9Cgl9CiAgICB9Cn0KCnByb2Mgbm90ZWNyb3NzaW5ncyB7cm93IGlkIGxvIGhpIGNvcm5lcn0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCBjcm9zc2luZ3MgY29ybmVyY3Jvc3NpbmdzCgogICAgZm9yIHtzZXQgaSAkbG99IHtbaW5jciBpXSA8ICRoaX0ge30gewoJc2V0IHAgW2xpbmRleCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGldCglpZiB7JHAgPT0ge319IGNvbnRpbnVlCglpZiB7JGkgPT0gJGNvcm5lcn0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkaWQpXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY29ybmVyY3Jvc3NpbmdzKCRpZCkgJHBdIDwgMH0gewoJCWxhcHBlbmQgY29ybmVyY3Jvc3NpbmdzKCRpZCkgJHAKCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRwKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNvcm5lcmNyb3NzaW5ncygkcCkgJGlkXSA8IDB9IHsKCQlsYXBwZW5kIGNvcm5lcmNyb3NzaW5ncygkcCkgJGlkCgkgICAgfQoJfSBlbHNlIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJGlkKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNyb3NzaW5ncygkaWQpICRwXSA8IDB9IHsKCQlsYXBwZW5kIGNyb3NzaW5ncygkaWQpICRwCgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNyb3NzaW5ncygkcCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjcm9zc2luZ3MoJHApICRpZF0gPCAwfSB7CgkJbGFwcGVuZCBjcm9zc2luZ3MoJHApICRpZAoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyB4Y29vcmQge2kgbGV2ZWwgbG59IHsKICAgIGdsb2JhbCBjYW52eDAgeHNwYzEgeHNwYzIKCiAgICBzZXQgeCBbZXhwciB7JGNhbnZ4MCArICRpICogJHhzcGMxKCRsbil9XQogICAgaWYgeyRpID4gMCAmJiAkaSA9PSAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArIDAuNSAqICgkeHNwYzIgLSAkeHNwYzEoJGxuKSl9XQogICAgfSBlbHNlaWYgeyRpID4gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAkeHNwYzIgLSAkeHNwYzEoJGxuKX1dCiAgICB9CiAgICByZXR1cm4gJHgKfQoKcHJvYyBmaW5pc2hjb21taXRzIHt9IHsKICAgIGdsb2JhbCBjb21taXRpZHggcGhhc2UKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGN0ZXh0IG1haW5jdXJzb3IgdGV4dGN1cnNvcgogICAgZ2xvYmFsIGZpbmRpbnByb2dyZXNzCgogICAgaWYgeyRjb21taXRpZHggPiAwfSB7CglkcmF3cmVzdAogICAgfSBlbHNlIHsKCSRjYW52IGRlbGV0ZSBhbGwKCSRjYW52IGNyZWF0ZSB0ZXh0IDMgMyAtYW5jaG9yIG53IC10ZXh0ICJObyBjb21taXRzIHNlbGVjdGVkIiBcCgkgICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgZmluZGlucHJvZ3Jlc3NdfSB7CgkuIGNvbmZpZyAtY3Vyc29yICRtYWluY3Vyc29yCglzZXR0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCiAgICB9CiAgICBzZXQgcGhhc2Uge30KfQoKIyBEb24ndCBjaGFuZ2UgdGhlIHRleHQgcGFuZSBjdXJzb3IgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBoYW5kIGN1cnNvciwKIyBzaG93aW5nIHRoYXQgd2UgYXJlIG92ZXIgYSBzaGExIElEIGxpbmsuCnByb2Mgc2V0dGV4dGN1cnNvciB7Y30gewogICAgZ2xvYmFsIGN0ZXh0IGN1cnRleHRjdXJzb3IKCiAgICBpZiB7WyRjdGV4dCBjZ2V0IC1jdXJzb3JdID09ICRjdXJ0ZXh0Y3Vyc29yfSB7CgkkY3RleHQgY29uZmlnIC1jdXJzb3IgJGMKICAgIH0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICRjCn0KCnByb2MgZHJhd3Jlc3Qge30gewogICAgZ2xvYmFsIG51bWNvbW1pdHMKICAgIGdsb2JhbCBzdGFydG1zZWNzCiAgICBnbG9iYWwgY2FudnkwIG51bWNvbW1pdHMgbGluZXNwYwogICAgZ2xvYmFsIHJvd2xhaWRvdXQgY29tbWl0aWR4CgogICAgc2V0IHJvdyAkcm93bGFpZG91dAogICAgbGF5b3V0cm93cyAkcm93bGFpZG91dCAkY29tbWl0aWR4IDEKICAgIGxheW91dHRhaWwKICAgIG9wdGltaXplX3Jvd3MgJHJvdyAwICRjb21taXRpZHgKICAgIHNob3dzdHVmZiAkY29tbWl0aWR4CgogICAgc2V0IGRyYXdtc2VjcyBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzfV0KICAgICNwdXRzICJvdmVyYWxsICRkcmF3bXNlY3MgbXMgZm9yICRudW1jb21taXRzIGNvbW1pdHMiCn0KCnByb2MgZmluZG1hdGNoZXMge2Z9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgogICAgaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0gewoJc2V0IG1hdGNoZXMgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUgJGZvdW5kc3RyaW5nICRmXQogICAgfSBlbHNlIHsKCWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CgkgICAgc2V0IHN0ciBbc3RyaW5nIHRvbG93ZXIgJGZdCgl9IGVsc2UgewoJICAgIHNldCBzdHIgJGYKCX0KCXNldCBtYXRjaGVzIHt9CglzZXQgaSAwCgl3aGlsZSB7W3NldCBqIFtzdHJpbmcgZmlyc3QgJGZvdW5kc3RyaW5nICRzdHIgJGldXSA+PSAwfSB7CgkgICAgbGFwcGVuZCBtYXRjaGVzIFtsaXN0ICRqIFtleHByIHskaiskZm91bmRzdHJsZW4tMX1dXQoJICAgIHNldCBpIFtleHByIHskaiArICRmb3VuZHN0cmxlbn1dCgl9CiAgICB9CiAgICByZXR1cm4gJG1hdGNoZXMKfQoKcHJvYyBkb2ZpbmQge30gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZpbmRsb2MgZmluZHN0cmluZyBtYXJrZWRtYXRjaGVzIGNvbW1pdGluZm8KICAgIGdsb2JhbCBudW1jb21taXRzIGRpc3BsYXlvcmRlciBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIG1haW5mb250IG5hbWVmb250IGNhbnYgY2FudjIgY2FudjMgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbiBtYXRjaHN0cmluZwogICAgZ2xvYmFsIGNvbW1pdGRhdGEKCiAgICBzdG9wZmluZHByb2MKICAgIHVubWFya21hdGNoZXMKICAgIGZvY3VzIC4KICAgIHNldCBtYXRjaGluZ2xpbmVzIHt9CiAgICBpZiB7JGZpbmRsb2MgPT0gIlBpY2theGUifSB7CglmaW5kcGF0Y2hlcwoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJc2V0IGZvdW5kc3RyaW5nIFtzdHJpbmcgdG9sb3dlciAkZmluZHN0cmluZ10KICAgIH0gZWxzZSB7CglzZXQgZm91bmRzdHJpbmcgJGZpbmRzdHJpbmcKICAgIH0KICAgIHNldCBmb3VuZHN0cmxlbiBbc3RyaW5nIGxlbmd0aCAkZmluZHN0cmluZ10KICAgIGlmIHskZm91bmRzdHJsZW4gPT0gMH0gcmV0dXJuCiAgICByZWdzdWIgLWFsbCB7Wyo/XFtcXF19ICRmb3VuZHN0cmluZyB7XFwmfSBtYXRjaHN0cmluZwogICAgc2V0IG1hdGNoc3RyaW5nICIqJG1hdGNoc3RyaW5nKiIKICAgIGlmIHskZmluZGxvYyA9PSAiRmlsZXMifSB7CglmaW5kZmlsZXMKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IG9sZHNlbCAtMQogICAgfSBlbHNlIHsKCXNldCBvbGRzZWwgJHNlbGVjdGVkbGluZQogICAgfQogICAgc2V0IGRpZHNlbCAwCiAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50fQogICAgc2V0IGwgLTEKICAgIGZvcmVhY2ggaWQgJGRpc3BsYXlvcmRlciB7CglzZXQgZCAkY29tbWl0ZGF0YSgkaWQpCglpbmNyIGwKCWlmIHskZmluZHR5cGUgPT0gIlJlZ2V4cCJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtyZWdleHAgJGZvdW5kc3RyaW5nICRkXQoJfSBlbHNlaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggLW5vY2FzZSAkbWF0Y2hzdHJpbmcgJGRdCgl9IGVsc2UgewoJICAgIHNldCBkb2VzbWF0Y2ggW3N0cmluZyBtYXRjaCAkbWF0Y2hzdHJpbmcgJGRdCgl9CglpZiB7ISRkb2VzbWF0Y2h9IGNvbnRpbnVlCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgZ2V0Y29tbWl0ICRpZAoJfQoJc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQoJc2V0IGRvZXNtYXRjaCAwCglmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCSAgICBpZiB7JGZpbmRsb2MgIT0gIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jICE9ICR0eX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCSAgICBpZiB7JG1hdGNoZXMgPT0ge319IGNvbnRpbnVlCgkgICAgc2V0IGRvZXNtYXRjaCAxCgkgICAgaWYgeyR0eSA9PSAiSGVhZGxpbmUifSB7CgkJZHJhd2NtaXRyb3cgJGwKCQltYXJrbWF0Y2hlcyAkY2FudiAkbCAkZiAkbGluZWh0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkF1dGhvciJ9IHsKCQlkcmF3Y21pdHJvdyAkbAoJCW1hcmttYXRjaGVzICRjYW52MiAkbCAkZiAkbGluZW50YWcoJGwpICRtYXRjaGVzICRuYW1lZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkRhdGUifSB7CgkJZHJhd2NtaXRyb3cgJGwKCQltYXJrbWF0Y2hlcyAkY2FudjMgJGwgJGYgJGxpbmVkdGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9Cgl9CglpZiB7JGRvZXNtYXRjaH0gewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJICAgIGlmIHshJGRpZHNlbCAmJiAkbCA+ICRvbGRzZWx9IHsKCQlmaW5kc2VsZWN0bGluZSAkbAoJCXNldCBkaWRzZWwgMQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbWF0Y2hpbmdsaW5lcyA9PSB7fX0gewoJYmVsbAogICAgfSBlbHNlaWYgeyEkZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdCiAgICB9Cn0KCnByb2MgZmluZHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQKICAgIHNlbGVjdGxpbmUgJGwgMQogICAgaWYgeyRmaW5kbG9jID09ICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyA9PSAiQ29tbWVudHMifSB7CgkjIGhpZ2hsaWdodCB0aGUgbWF0Y2hlcyBpbiB0aGUgY29tbWVudHMKCXNldCBmIFskY3RleHQgZ2V0IDEuMCAkY29tbWVudGVuZF0KCXNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCWZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJICAgIHNldCBlbmQgW2V4cHIge1tsaW5kZXggJG1hdGNoIDFdICsgMX1dCgkgICAgJGN0ZXh0IHRhZyBhZGQgZm91bmQgIjEuMCArICRzdGFydCBjIiAiMS4wICsgJGVuZCBjIgoJfQogICAgfQp9Cgpwcm9jIGZpbmRuZXh0IHtyZXN0YXJ0fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7CglpZiB7JHJlc3RhcnR9IHsKCSAgICBkb2ZpbmQKCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID4gJHNlbGVjdGVkbGluZX0gewoJICAgIGZpbmRzZWxlY3RsaW5lICRsCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBiZWxsCn0KCnByb2MgZmluZHByZXYge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJZG9maW5kCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IHByZXYge30KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPj0gJHNlbGVjdGVkbGluZX0gYnJlYWsKCXNldCBwcmV2ICRsCiAgICB9CiAgICBpZiB7JHByZXYgIT0ge319IHsKCWZpbmRzZWxlY3RsaW5lICRwcmV2CiAgICB9IGVsc2UgewoJYmVsbAogICAgfQp9Cgpwcm9jIGZpbmRsb2NjaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGZpbmR0eXBlIGZpbmR0eXBlbWVudQogICAgaWYgeyRmaW5kbG9jID09ICJQaWNrYXhlIn0gewoJc2V0IGZpbmR0eXBlIEV4YWN0CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkZmluZHR5cGVtZW51IGVudHJ5Y29uZiAxIC1zdGF0ZSAkc3RhdGUKICAgICRmaW5kdHlwZW1lbnUgZW50cnljb25mIDIgLXN0YXRlICRzdGF0ZQp9Cgpwcm9jIHN0b3BmaW5kcHJvYyB7e2RvbmUgMH19IHsKICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUgZmluZGlkcwogICAgZ2xvYmFsIGN0ZXh0IGZpbmRvbGRjdXJzb3IgcGhhc2UgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MKCiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZHByb2NwaWRdfSB7CglpZiB7ISRkb25lfSB7CgkgICAgY2F0Y2gge2V4ZWMga2lsbCAkZmluZHByb2NwaWR9Cgl9CgljYXRjaCB7Y2xvc2UgJGZpbmRwcm9jZmlsZX0KCXVuc2V0IGZpbmRwcm9jcGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRpbnByb2dyZXNzXX0gewoJdW5zZXQgZmluZGlucHJvZ3Jlc3MKCWlmIHskcGhhc2UgIT0gImluY3JkcmF3In0gewoJICAgIC4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKCSAgICBzZXR0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCgl9CiAgICB9Cn0KCnByb2MgZmluZHBhdGNoZXMge30gewogICAgZ2xvYmFsIGZpbmRzdHJpbmcgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMKICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUKICAgIGdsb2JhbCBmaW5kZGlkc2VsIGN0ZXh0IGRpc3BsYXlvcmRlciBmaW5kaW5wcm9ncmVzcwogICAgZ2xvYmFsIGZpbmRpbnNlcnRwb3MKCiAgICBpZiB7JG51bWNvbW1pdHMgPT0gMH0gcmV0dXJuCgogICAgIyBtYWtlIGEgbGlzdCBvZiBhbGwgdGhlIGlkcyB0byBzZWFyY2gsIHN0YXJ0aW5nIGF0IHRoZSBvbmUKICAgICMgYWZ0ZXIgdGhlIHNlbGVjdGVkIGxpbmUgKGlmIGFueSkKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IGwgJHNlbGVjdGVkbGluZQogICAgfSBlbHNlIHsKCXNldCBsIC0xCiAgICB9CiAgICBzZXQgaW5wdXRpZHMge30KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgJG51bWNvbW1pdHN9IHtpbmNyIGl9IHsKCWlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBsIDAKCX0KCWFwcGVuZCBpbnB1dGlkcyBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGxdICJcbiIKICAgIH0KCiAgICBpZiB7W2NhdGNoIHsKCXNldCBmIFtvcGVuIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC1zIC1yIC1TJGZpbmRzdHJpbmcgXAoJCQkgPDwgJGlucHV0aWRzXSByXQogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igc3RhcnRpbmcgc2VhcmNoIHByb2Nlc3M6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgZmluZGluc2VydHBvcyBlbmQKICAgIHNldCBmaW5kcHJvY2ZpbGUgJGYKICAgIHNldCBmaW5kcHJvY3BpZCBbcGlkICRmXQogICAgZmNvbmZpZ3VyZSAkZiAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRmIHJlYWRhYmxlIHJlYWRmaW5kcHJvYwogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKfQoKcHJvYyByZWFkZmluZHByb2Mge30gewogICAgZ2xvYmFsIGZpbmRwcm9jZmlsZSBmaW5kZGlkc2VsCiAgICBnbG9iYWwgY29tbWl0cm93IG1hdGNoaW5nbGluZXMgZmluZGluc2VydHBvcwoKICAgIHNldCBuIFtnZXRzICRmaW5kcHJvY2ZpbGUgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRmaW5kcHJvY2ZpbGVdfSB7CgkgICAgc3RvcGZpbmRwcm9jIDEKCSAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CgkJYmVsbAoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbcmVnZXhwIHteWzAtOWEtZl17NDB9fSAkbGluZSBpZF19IHsKCWVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQtZGlmZi10cmVlIG91dHB1dDogJGxpbmUiCglzdG9wZmluZHByb2MKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRpZCldfSB7CglwdXRzIHN0ZGVyciAic3B1cmlvdXMgaWQ6ICRpZCIKCXJldHVybgogICAgfQogICAgc2V0IGwgJGNvbW1pdHJvdygkaWQpCiAgICBpbnNlcnRtYXRjaCAkbCAkaWQKfQoKcHJvYyBpbnNlcnRtYXRjaCB7bCBpZH0gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGluc2VydHBvcyBmaW5kZGlkc2VsCgogICAgaWYgeyRmaW5kaW5zZXJ0cG9zID09ICJlbmQifSB7CglpZiB7JG1hdGNoaW5nbGluZXMgIT0ge30gJiYgJGwgPCBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdfSB7CgkgICAgc2V0IG1hdGNoaW5nbGluZXMgW2xpbnNlcnQgJG1hdGNoaW5nbGluZXMgMCAkbF0KCSAgICBzZXQgZmluZGluc2VydHBvcyAxCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJfQogICAgfSBlbHNlIHsKCXNldCBtYXRjaGluZ2xpbmVzIFtsaW5zZXJ0ICRtYXRjaGluZ2xpbmVzICRmaW5kaW5zZXJ0cG9zICRsXQoJaW5jciBmaW5kaW5zZXJ0cG9zCiAgICB9CiAgICBtYXJraGVhZGxpbmUgJGwgJGlkCiAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSAkbAoJc2V0IGZpbmRkaWRzZWwgMQogICAgfQp9Cgpwcm9jIGZpbmRmaWxlcyB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMgZGlzcGxheW9yZGVyIGN0ZXh0CiAgICBnbG9iYWwgZmZpbGVsaW5lIGZpbmRkaWRzZWwgcGFyZW50cyBucGFyZW50cwogICAgZ2xvYmFsIGZpbmRpbnByb2dyZXNzIGZpbmRzdGFydGxpbmUgZmluZGluc2VydHBvcwogICAgZ2xvYmFsIHRyZWVkaWZmcyBmZGlmZmlkIGZkaWZmc25lZWRlZCBmZGlmZnBvcwogICAgZ2xvYmFsIGZpbmRtZXJnZWZpbGVzCgogICAgaWYgeyRudW1jb21taXRzID09IDB9IHJldHVybgoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAxfV0KICAgIH0gZWxzZSB7CglzZXQgbCAwCiAgICB9CiAgICBzZXQgZmZpbGVsaW5lICRsCiAgICBzZXQgZmluZHN0YXJ0bGluZSAkbAogICAgc2V0IGRpZmZzbmVlZGVkIHt9CiAgICBzZXQgZmRpZmZzbmVlZGVkIHt9CiAgICB3aGlsZSAxIHsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGxdCglpZiB7JGZpbmRtZXJnZWZpbGVzIHx8ICRucGFyZW50cygkaWQpID09IDF9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkKV19IHsKCQlhcHBlbmQgZGlmZnNuZWVkZWQgIiRpZFxuIgoJCWxhcHBlbmQgZmRpZmZzbmVlZGVkICRpZAoJICAgIH0KCX0KCWlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBsIDAKCX0KCWlmIHskbCA9PSAkZmluZHN0YXJ0bGluZX0gYnJlYWsKICAgIH0KCiAgICAjIHN0YXJ0IG9mZiBhIGdpdC1kaWZmLXRyZWUgcHJvY2VzcyBpZiBuZWVkZWQKICAgIGlmIHskZGlmZnNuZWVkZWQgbmUge319IHsKCWlmIHtbY2F0Y2ggewoJICAgIHNldCBkZiBbb3BlbiBbbGlzdCB8IGdpdC1kaWZmLXRyZWUgLXIgLS1zdGRpbiA8PCAkZGlmZnNuZWVkZWRdIHJdCgl9IGVyciBdfSB7CgkgICAgZXJyb3JfcG9wdXAgIkVycm9yIHN0YXJ0aW5nIHNlYXJjaCBwcm9jZXNzOiAkZXJyIgoJICAgIHJldHVybgoJfQoJY2F0Y2gge3Vuc2V0IGZkaWZmaWR9CglzZXQgZmRpZmZwb3MgMAoJZmNvbmZpZ3VyZSAkZGYgLWJsb2NraW5nIDAKCWZpbGVldmVudCAkZGYgcmVhZGFibGUgW2xpc3QgcmVhZGZpbGVkaWZmcyAkZGZdCiAgICB9CgogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgc2V0IGZpbmRpbnNlcnRwb3MgZW5kCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRsXQogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKICAgIGZpbmRjb250ICRpZAogICAgdXBkYXRlCn0KCnByb2MgcmVhZGZpbGVkaWZmcyB7ZGZ9IHsKICAgIGdsb2JhbCBmaW5kaWQgZmRpZmZpZCBmZGlmZnMKCiAgICBzZXQgbiBbZ2V0cyAkZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRkZl19IHsKCSAgICBkb25lZmlsZWRpZmYKCSAgICBpZiB7W2NhdGNoIHtjbG9zZSAkZGZ9IGVycl19IHsKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkVycm9yIGluIGdpdC1kaWZmLXRyZWU6ICRlcnIiCgkgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRdfSB7CgkJc2V0IGlkICRmaW5kaWQKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkNvdWxkbid0IGZpbmQgZGlmZnMgZm9yICRpZCIKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteKFswLTlhLWZdezQwfSkkfSAkbGluZSBtYXRjaCBpZF19IHsKCSMgc3RhcnQgb2YgYSBuZXcgc3RyaW5nIG9mIGRpZmZzCglkb25lZmlsZWRpZmYKCXNldCBmZGlmZmlkICRpZAoJc2V0IGZkaWZmcyB7fQogICAgfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2ggIjoqIiAkbGluZV19IHsKCWxhcHBlbmQgZmRpZmZzIFtsaW5kZXggJGxpbmUgNV0KICAgIH0KfQoKcHJvYyBkb25lZmlsZWRpZmYge30gewogICAgZ2xvYmFsIGZkaWZmaWQgZmRpZmZzIHRyZWVkaWZmcyBmaW5kaWQKICAgIGdsb2JhbCBmZGlmZnNuZWVkZWQgZmRpZmZwb3MKCiAgICBpZiB7W2luZm8gZXhpc3RzIGZkaWZmaWRdfSB7Cgl3aGlsZSB7W2xpbmRleCAkZmRpZmZzbmVlZGVkICRmZGlmZnBvc10gbmUgJGZkaWZmaWQKCSAgICAgICAmJiAkZmRpZmZwb3MgPCBbbGxlbmd0aCAkZmRpZmZzbmVlZGVkXX0gewoJICAgICMgZ2l0LWRpZmYtdHJlZSBkb2Vzbid0IG91dHB1dCBhbnl0aGluZyBmb3IgYSBjb21taXQKCSAgICAjIHdoaWNoIGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nCgkgICAgc2V0IG51bGxpZCBbbGluZGV4ICRmZGlmZnNuZWVkZWQgJGZkaWZmcG9zXQoJICAgIHNldCB0cmVlZGlmZnMoJG51bGxpZCkge30KCSAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRpZF0gJiYgJG51bGxpZCBlcSAkZmluZGlkfSB7CgkJdW5zZXQgZmluZGlkCgkJZmluZGNvbnQgJG51bGxpZAoJICAgIH0KCSAgICBpbmNyIGZkaWZmcG9zCgl9CglpbmNyIGZkaWZmcG9zCgoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRmZGlmZmlkKV19IHsKCSAgICBzZXQgdHJlZWRpZmZzKCRmZGlmZmlkKSAkZmRpZmZzCgl9CglpZiB7W2luZm8gZXhpc3RzIGZpbmRpZF0gJiYgJGZkaWZmaWQgZXEgJGZpbmRpZH0gewoJICAgIHVuc2V0IGZpbmRpZAoJICAgIGZpbmRjb250ICRmZGlmZmlkCgl9CiAgICB9Cn0KCnByb2MgZmluZGNvbnQge2lkfSB7CiAgICBnbG9iYWwgZmluZGlkIHRyZWVkaWZmcyBwYXJlbnRzIG5wYXJlbnRzCiAgICBnbG9iYWwgZmZpbGVsaW5lIGZpbmRzdGFydGxpbmUgZmluZGRpZHNlbAogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBudW1jb21taXRzIG1hdGNoaW5nbGluZXMgZmluZGlucHJvZ3Jlc3MKICAgIGdsb2JhbCBmaW5kbWVyZ2VmaWxlcwoKICAgIHNldCBsICRmZmlsZWxpbmUKICAgIHdoaWxlIDEgewoJaWYgeyRmaW5kbWVyZ2VmaWxlcyB8fCAkbnBhcmVudHMoJGlkKSA9PSAxfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZCldfSB7CgkJc2V0IGZpbmRpZCAkaWQKCQlzZXQgZmZpbGVsaW5lICRsCgkJcmV0dXJuCgkgICAgfQoJICAgIHNldCBkb2VzbWF0Y2ggMAoJICAgIGZvcmVhY2ggZiAkdHJlZWRpZmZzKCRpZCkgewoJCXNldCB4IFtmaW5kbWF0Y2hlcyAkZl0KCQlpZiB7JHggIT0ge319IHsKCQkgICAgc2V0IGRvZXNtYXRjaCAxCgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCSAgICBpZiB7JGRvZXNtYXRjaH0gewoJCWluc2VydG1hdGNoICRsICRpZAoJICAgIH0KCX0KCWlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBsIDAKCX0KCWlmIHskbCA9PSAkZmluZHN0YXJ0bGluZX0gYnJlYWsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGxdCiAgICB9CiAgICBzdG9wZmluZHByb2MKICAgIGlmIHshJGZpbmRkaWRzZWx9IHsKCWJlbGwKICAgIH0KfQoKIyBtYXJrIGEgY29tbWl0IGFzIG1hdGNoaW5nIGJ5IHB1dHRpbmcgYSB5ZWxsb3cgYmFja2dyb3VuZAojIGJlaGluZCB0aGUgaGVhZGxpbmUKcHJvYyBtYXJraGVhZGxpbmUge2wgaWR9IHsKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGxpbmVodGFnCgogICAgZHJhd2NtaXRyb3cgJGwKICAgIHNldCBiYm94IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgJGJib3ggLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCiAgICAkY2FudiBsb3dlciAkdAp9CgojIG1hcmsgdGhlIGJpdHMgb2YgYSBoZWFkbGluZSwgYXV0aG9yIG9yIGRhdGUgdGhhdCBtYXRjaCBhIGZpbmQgc3RyaW5nCnByb2MgbWFya21hdGNoZXMge2NhbnYgbCBzdHIgdGFnIG1hdGNoZXMgZm9udH0gewogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJHRhZ10KICAgIHNldCB4MCBbbGluZGV4ICRiYm94IDBdCiAgICBzZXQgeTAgW2xpbmRleCAkYmJveCAxXQogICAgc2V0IHkxIFtsaW5kZXggJGJib3ggM10KICAgIGZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCglzZXQgZW5kIFtsaW5kZXggJG1hdGNoIDFdCglpZiB7JHN0YXJ0ID4gJGVuZH0gY29udGludWUKCXNldCB4b2ZmIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgeyRzdGFydC0xfV1dXQoJc2V0IHhsZW4gW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JGVuZH1dXV0KCXNldCB0IFskY2FudiBjcmVhdGUgcmVjdCBbZXhwciB7JHgwKyR4b2ZmfV0gJHkwIFwKCQkgICBbZXhwciB7JHgwKyR4bGVuKzJ9XSAkeTEgXAoJCSAgIC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bm1hcmttYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpZHMKICAgIGFsbGNhbnZzIGRlbGV0ZSBtYXRjaGVzCiAgICBjYXRjaCB7dW5zZXQgbWF0Y2hpbmdsaW5lc30KICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQp9Cgpwcm9jIHNlbGNhbnZsaW5lIHt3IHggeX0gewogICAgZ2xvYmFsIGNhbnYgY2FudnkwIGN0ZXh0IGxpbmVzcGMKICAgIGdsb2JhbCByb3d0ZXh0eAogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIHNldCBsIFtleHByIHtpbnQoKCR5IC0gJGNhbnZ5MCkgLyAkbGluZXNwYyArIDAuNSl9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfQogICAgaWYgeyR3IGVxICRjYW52fSB7CglpZiB7IVtpbmZvIGV4aXN0cyByb3d0ZXh0eCgkbCldIHx8ICR4IDwgJHJvd3RleHR4KCRsKX0gcmV0dXJuCiAgICB9CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyBjb21taXRfZGVzY3JpcHRvciB7cH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8KICAgIHNldCBsICIuLi4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJc2V0IGwgW2xpbmRleCAkY29tbWl0aW5mbygkcCkgMF0KICAgIH0KICAgIHJldHVybiAiJHAgKCRsKSIKfQoKIyBhcHBlbmQgc29tZSB0ZXh0IHRvIHRoZSBjdGV4dCB3aWRnZXQsIGFuZCBtYWtlIGFueSBTSEExIElECiMgdGhhdCB3ZSBrbm93IGFib3V0IGJlIGEgY2xpY2thYmxlIGxpbmsuCnByb2MgYXBwZW5kd2l0aGxpbmtzIHt0ZXh0fSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0cm93IGxpbmtudW0KCiAgICBzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJHRleHQKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIHNldCBsaW5rcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSB7WzAtOWEtZl17NDB9fSAkdGV4dF0KICAgIGZvcmVhY2ggbCAkbGlua3MgewoJc2V0IHMgW2xpbmRleCAkbCAwXQoJc2V0IGUgW2xpbmRleCAkbCAxXQoJc2V0IGxpbmtpZCBbc3RyaW5nIHJhbmdlICR0ZXh0ICRzICRlXQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRsaW5raWQpXX0gY29udGludWUKCWluY3IgZQoJJGN0ZXh0IHRhZyBhZGQgbGluayAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGFkZCBsaW5rJGxpbmtudW0gIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBiaW5kIGxpbmskbGlua251bSA8MT4gW2xpc3Qgc2VsZWN0bGluZSAkY29tbWl0cm93KCRsaW5raWQpIDFdCglpbmNyIGxpbmtudW0KICAgIH0KICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KfQoKcHJvYyBzZWxlY3RsaW5lIHtsIGlzbmV3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjb21taXRpbmZvIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4KICAgIGdsb2JhbCBjZmxpc3QgY3VycmVudGlkIHNoYTFlbnRyeQogICAgZ2xvYmFsIGNvbW1lbnRlbmQgaWR0YWdzIGxpbmtudW0KICAgIGdsb2JhbCBtZXJnZW1heCBudW1jb21taXRzCgogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICBub3JtYWxsaW5lCiAgICBpZiB7JGwgPCAwIHx8ICRsID49ICRudW1jb21taXRzfSByZXR1cm4KICAgIHNldCB5IFtleHByIHskY2FudnkwICsgJGwgKiAkbGluZXNwY31dCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBzZXQgeXRvcCBbZXhwciB7JHkgLSAkbGluZXNwYyAtIDF9XQogICAgc2V0IHlib3QgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAxfV0KICAgIHNldCB3bm93IFskY2FudiB5dmlld10KICAgIHNldCB3dG9wIFtleHByIHtbbGluZGV4ICR3bm93IDBdICogJHltYXh9XQogICAgc2V0IHdib3QgW2V4cHIge1tsaW5kZXggJHdub3cgMV0gKiAkeW1heH1dCiAgICBzZXQgd2ggW2V4cHIgeyR3Ym90IC0gJHd0b3B9XQogICAgc2V0IG5ld3RvcCAkd3RvcAogICAgaWYgeyR5dG9wIDwgJHd0b3B9IHsKCWlmIHskeWJvdCA8ICR3dG9wfSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wICR5dG9wCgkgICAgaWYgeyRuZXd0b3AgPiAkd3RvcCAtICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgLSAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfSBlbHNlaWYgeyR5Ym90ID4gJHdib3R9IHsKCWlmIHskeXRvcCA+ICR3Ym90fSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeWJvdCAtICR3aH1dCgkgICAgaWYgeyRuZXd0b3AgPCAkd3RvcCArICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRuZXd0b3AgIT0gJHd0b3B9IHsKCWlmIHskbmV3dG9wIDwgMH0gewoJICAgIHNldCBuZXd0b3AgMAoJfQoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByIHskbmV3dG9wICogMS4wIC8gJHltYXh9XQoJZHJhd3Zpc2libGUKICAgIH0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBsaW5laHRhZygkbCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52IGNyZWF0ZSByZWN0IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudiBsb3dlciAkdAogICAgJGNhbnYyIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjIgbG93ZXIgJHQKICAgICRjYW52MyBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjMgY3JlYXRlIHJlY3QgWyRjYW52MyBiYm94ICRsaW5lZHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYzIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYzIGxvd2VyICR0CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNlbGVjdGxpbmUgJGwgMF0KICAgIH0KCiAgICBzZXQgc2VsZWN0ZWRsaW5lICRsCgogICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkbF0KICAgIHNldCBjdXJyZW50aWQgJGlkCiAgICAkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgJHNoYTFlbnRyeSBpbnNlcnQgMCAkaWQKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIGZyb20gMAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gdG8gZW5kCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICBzZXQgbGlua251bSAwCiAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuMCAwLjAKICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuMCBsZWZ0CiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkF1dGhvcjogW2xpbmRleCAkaW5mbyAxXSAgJGRhdGVcbiIKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gNF1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQ29tbWl0dGVyOiBbbGluZGV4ICRpbmZvIDNdICAkZGF0ZVxuIgogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJUYWdzOiIKCWZvcmVhY2ggdGFnICRpZHRhZ3MoJGlkKSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkdGFnIgoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgfQogCiAgICBzZXQgY29tbWVudCB7fQogICAgaWYgeyRucGFyZW50cygkaWQpID4gMX0gewoJc2V0IG5wIDAKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpZiB7JG5wID49ICRtZXJnZW1heH0gewoJCXNldCB0YWcgbW1heAoJICAgIH0gZWxzZSB7CgkJc2V0IHRhZyBtJG5wCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6ICIgJHRhZwoJICAgIGFwcGVuZHdpdGhsaW5rcyBbY29tbWl0X2Rlc2NyaXB0b3IgJHBdCgkgICAgaW5jciBucAoJfQogICAgfSBlbHNlIHsKCWlmIHtbaW5mbyBleGlzdHMgcGFyZW50cygkaWQpXX0gewoJICAgIGZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCQlhcHBlbmQgY29tbWVudCAiUGFyZW50OiBbY29tbWl0X2Rlc2NyaXB0b3IgJHBdXG4iCgkgICAgfQoJfQogICAgfQoKICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGlkKV19IHsKCWZvcmVhY2ggYyAkY2hpbGRyZW4oJGlkKSB7CgkgICAgYXBwZW5kIGNvbW1lbnQgIkNoaWxkOiAgW2NvbW1pdF9kZXNjcmlwdG9yICRjXVxuIgoJfQogICAgfQogICAgYXBwZW5kIGNvbW1lbnQgIlxuIgogICAgYXBwZW5kIGNvbW1lbnQgW2xpbmRleCAkaW5mbyA1XQoKICAgICMgbWFrZSBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBTSEExIElEIGJlIGEgY2xpY2thYmxlIGxpbmsKICAgIGFwcGVuZHdpdGhsaW5rcyAkY29tbWVudAoKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBjb21tZW50ZW5kIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAogICAgJGNmbGlzdCBpbnNlcnQgZW5kICJDb21tZW50cyIKICAgIGlmIHskbnBhcmVudHMoJGlkKSA9PSAxfSB7CglzdGFydGRpZmYgJGlkCiAgICB9IGVsc2VpZiB7JG5wYXJlbnRzKCRpZCkgPiAxfSB7CgltZXJnZWRpZmYgJGlkCiAgICB9Cn0KCnByb2Mgc2VsbmV4dGxpbmUge2Rpcn0gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgbCBbZXhwciB7JHNlbGVjdGVkbGluZSArICRkaXJ9XQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2MgdW5zZWxlY3RsaW5lIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKCiAgICBjYXRjaCB7dW5zZXQgc2VsZWN0ZWRsaW5lfQogICAgYWxsY2FudnMgZGVsZXRlIHNlY3NlbAp9Cgpwcm9jIGFkZHRvaGlzdG9yeSB7Y21kfSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDAKCSYmIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dID09ICRjbWR9IHsKCXJldHVybgogICAgfQoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgaGlzdG9yeSBbbHJlcGxhY2UgJGhpc3RvcnkgJGhpc3RvcnlpbmRleCBlbmQgJGNtZF0KICAgIH0gZWxzZSB7CglsYXBwZW5kIGhpc3RvcnkgJGNtZAogICAgfQogICAgaW5jciBoaXN0b3J5aW5kZXgKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfSBlbHNlIHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQogICAgLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIGdvYmFjayB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKCWluY3IgaGlzdG9yeWluZGV4IC0xCglzZXQgY21kIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dCglldmFsICRjbWQKCS5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA8PSAxfSB7CgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBnb2Zvcncge30gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBjbWQgW2xpbmRleCAkaGlzdG9yeSAkaGlzdG9yeWluZGV4XQoJaW5jciBoaXN0b3J5aW5kZXgKCWV2YWwgJGNtZAoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYgeyRoaXN0b3J5aW5kZXggPj0gW2xsZW5ndGggJGhpc3RvcnldfSB7CgkuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9Cn0KCnByb2MgbWVyZ2VkaWZmIHtpZH0gewogICAgZ2xvYmFsIHBhcmVudHMgZGlmZm1lcmdlaWQgZGlmZm9wdHMgbWRpZmZmZAogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQgZGlmZmlkcwoKICAgIHNldCBkaWZmbWVyZ2VpZCAkaWQKICAgIHNldCBkaWZmaWRzICRpZAogICAgY2F0Y2gge3Vuc2V0IGRpZmZmaWxlc3RhcnR9CiAgICAjIHRoaXMgZG9lc24ndCBzZWVtIHRvIGFjdHVhbGx5IGFmZmVjdCBhbnl0aGluZy4uLgogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdC1kaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLS1jYyAkaWRdCiAgICBpZiB7W2NhdGNoIHtzZXQgbWRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBnZXR0aW5nIG1lcmdlIGRpZmZzOiAkZXJyIgoJcmV0dXJuCiAgICB9CiAgICBmY29uZmlndXJlICRtZGYgLWJsb2NraW5nIDAKICAgIHNldCBtZGlmZmZkKCRpZCkgJG1kZgogICAgZmlsZWV2ZW50ICRtZGYgcmVhZGFibGUgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWRmICRpZF0KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KfQoKcHJvYyBnZXRtZXJnZWRpZmZsaW5lIHttZGYgaWR9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBjdGV4dCBjZmxpc3QgbmV4dHVwZGF0ZSBucGFyZW50cyBtZXJnZW1heAogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQgbWRpZmZmZAoKICAgIHNldCBuIFtnZXRzICRtZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRtZGZdfSB7CgkgICAgY2xvc2UgJG1kZgoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF0gfHwgJGlkICE9ICRkaWZmbWVyZ2VpZAoJfHwgJG1kZiAhPSAkbWRpZmZmZCgkaWQpfSB7CglyZXR1cm4KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHtbcmVnZXhwIHteZGlmZiAtLWNjICguKil9ICRsaW5lIG1hdGNoIGZuYW1lXX0gewoJIyBzdGFydCBvZiBhIG5ldyBmaWxlCgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCglzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgaSBbJGNmbGlzdCBpbmRleCBlbmRdCgkkY3RleHQgbWFyayBzZXQgZm1hcmsuJGkgJGhlcmUKCSRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuJGkgbGVmdAoJc2V0IGRpZmZmaWxlc3RhcnQoW2V4cHIgeyRpLTF9XSkgJGhlcmUKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZm5hbWUKCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkZm5hbWVdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGZuYW1lICRwYWRcbiIgZmlsZXNlcAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQH0gJGxpbmVdfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgaHVua3NlcAogICAgfSBlbHNlaWYge1tyZWdleHAge15bMC05YS1mXXs0MH0kfSAkbGluZV0gfHwgW3JlZ2V4cCB7XmluZGV4fSAkbGluZV19IHsKCSMgZG8gbm90aGluZwogICAgfSBlbHNlIHsKCSMgcGFyc2UgdGhlIHByZWZpeCAtIG9uZSAnICcsICctJyBvciAnKycgZm9yIGVhY2ggcGFyZW50CglzZXQgbnAgJG5wYXJlbnRzKCRpZCkKCXNldCBzcGFjZXMge30KCXNldCBtaW51c2VzIHt9CglzZXQgcGx1c2VzIHt9CglzZXQgaXNiYWQgMAoJZm9yIHtzZXQgaiAwfSB7JGogPCAkbnB9IHtpbmNyIGp9IHsKCSAgICBzZXQgYyBbc3RyaW5nIHJhbmdlICRsaW5lICRqICRqXQoJICAgIGlmIHskYyA9PSAiICJ9IHsKCQlsYXBwZW5kIHNwYWNlcyAkagoJICAgIH0gZWxzZWlmIHskYyA9PSAiLSJ9IHsKCQlsYXBwZW5kIG1pbnVzZXMgJGoKCSAgICB9IGVsc2VpZiB7JGMgPT0gIisifSB7CgkJbGFwcGVuZCBwbHVzZXMgJGoKCSAgICB9IGVsc2UgewoJCXNldCBpc2JhZCAxCgkJYnJlYWsKCSAgICB9Cgl9CglzZXQgdGFncyB7fQoJc2V0IG51bSB7fQoJaWYgeyEkaXNiYWQgJiYgJG1pbnVzZXMgbmUge30gJiYgJHBsdXNlcyBlcSB7fX0gewoJICAgICMgbGluZSBkb2Vzbid0IGFwcGVhciBpbiByZXN1bHQsIHBhcmVudHMgaW4gJG1pbnVzZXMgaGF2ZSB0aGUgbGluZQoJICAgIHNldCBudW0gW2xpbmRleCAkbWludXNlcyAwXQoJfSBlbHNlaWYgeyEkaXNiYWQgJiYgJHBsdXNlcyBuZSB7fSAmJiAkbWludXNlcyBlcSB7fX0gewoJICAgICMgbGluZSBhcHBlYXJzIGluIHJlc3VsdCwgcGFyZW50cyBpbiAkcGx1c2VzIGRvbid0IGhhdmUgdGhlIGxpbmUKCSAgICBsYXBwZW5kIHRhZ3MgbXJlc3VsdAoJICAgIHNldCBudW0gW2xpbmRleCAkc3BhY2VzIDBdCgl9CglpZiB7JG51bSBuZSB7fX0gewoJICAgIGlmIHskbnVtID49ICRtZXJnZW1heH0gewoJCXNldCBudW0gIm1heCIKCSAgICB9CgkgICAgbGFwcGVuZCB0YWdzIG0kbnVtCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgJHRhZ3MKICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCWluY3IgbmV4dHVwZGF0ZSAxMDAKCWZpbGVldmVudCAkbWRmIHJlYWRhYmxlIHt9Cgl1cGRhdGUKCWZpbGVldmVudCAkbWRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJG1kZiAkaWRdCiAgICB9Cn0KCnByb2Mgc3RhcnRkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgZGlmZmlkcyB0cmVlcGVuZGluZyBkaWZmbWVyZ2VpZAoKICAgIHNldCBkaWZmaWRzICRpZHMKICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCWlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJICAgIGdldHRyZWVkaWZmcyAkaWRzCgl9CiAgICB9IGVsc2UgewoJYWRkdG9jZmxpc3QgJGlkcwogICAgfQp9Cgpwcm9jIGFkZHRvY2ZsaXN0IHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgY2ZsaXN0CiAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcygkaWRzKSB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGYKICAgIH0KICAgIGdldGJsb2JkaWZmcyAkaWRzCn0KCnByb2MgZ2V0dHJlZWRpZmZzIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiBwYXJlbnRzIHRyZWVwZW5kaW5nCiAgICBzZXQgdHJlZXBlbmRpbmcgJGlkcwogICAgc2V0IHRyZWVkaWZmIHt9CiAgICBpZiB7W2NhdGNoIFwKCSB7c2V0IGdkdGYgW29wZW4gW2NvbmNhdCB8IGdpdC1kaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLXIgJGlkc10gcl19IFwKCV19IHJldHVybgogICAgZmNvbmZpZ3VyZSAkZ2R0ZiAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRnZHRmIHJlYWRhYmxlIFtsaXN0IGdldHRyZWVkaWZmbGluZSAkZ2R0ZiAkaWRzXQp9Cgpwcm9jIGdldHRyZWVkaWZmbGluZSB7Z2R0ZiBpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiB0cmVlZGlmZnMgdHJlZXBlbmRpbmcgZGlmZmlkcyBkaWZmbWVyZ2VpZAoKICAgIHNldCBuIFtnZXRzICRnZHRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7IVtlb2YgJGdkdGZdfSByZXR1cm4KCWNsb3NlICRnZHRmCglzZXQgdHJlZWRpZmZzKCRpZHMpICR0cmVlZGlmZgoJdW5zZXQgdHJlZXBlbmRpbmcKCWlmIHskaWRzICE9ICRkaWZmaWRzfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdfSB7CgkJZ2V0dHJlZWRpZmZzICRkaWZmaWRzCgkgICAgfQoJfSBlbHNlIHsKCSAgICBhZGR0b2NmbGlzdCAkaWRzCgl9CglyZXR1cm4KICAgIH0KICAgIHNldCBmaWxlIFtsaW5kZXggJGxpbmUgNV0KICAgIGxhcHBlbmQgdHJlZWRpZmYgJGZpbGUKfQoKcHJvYyBnZXRibG9iZGlmZnMge2lkc30gewogICAgZ2xvYmFsIGRpZmZvcHRzIGJsb2JkaWZmZmQgZGlmZmlkcyBlbnYgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQgbmV4dHVwZGF0ZSBkaWZmaW5oZHIgdHJlZWRpZmZzCgogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdC1kaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLXIgLXAgLUMgJGlkc10KICAgIGlmIHtbY2F0Y2gge3NldCBiZGYgW29wZW4gJGNtZCByXX0gZXJyXX0gewoJcHV0cyAiZXJyb3IgZ2V0dGluZyBkaWZmczogJGVyciIKCXJldHVybgogICAgfQogICAgc2V0IGRpZmZpbmhkciAwCiAgICBmY29uZmlndXJlICRiZGYgLWJsb2NraW5nIDAKICAgIHNldCBibG9iZGlmZmZkKCRpZHMpICRiZGYKICAgIHNldCBjdXJkaWZmdGFnIENvbW1lbnRzCiAgICBzZXQgY3VydGFnc3RhcnQgMC4wCiAgICBjYXRjaCB7dW5zZXQgZGlmZmZpbGVzdGFydH0KICAgIGZpbGVldmVudCAkYmRmIHJlYWRhYmxlIFtsaXN0IGdldGJsb2JkaWZmbGluZSAkYmRmICRkaWZmaWRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQp9Cgpwcm9jIGdldGJsb2JkaWZmbGluZSB7YmRmIGlkc30gewogICAgZ2xvYmFsIGRpZmZpZHMgYmxvYmRpZmZmZCBjdGV4dCBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgZGlmZm5leHRoZWFkIGRpZmZuZXh0bm90ZSBkaWZmZmlsZXN0YXJ0CiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBkaWZmaW5oZHIgdHJlZWRpZmZzCgogICAgc2V0IG4gW2dldHMgJGJkZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJGJkZl19IHsKCSAgICBjbG9zZSAkYmRmCgkgICAgaWYgeyRpZHMgPT0gJGRpZmZpZHMgJiYgJGJkZiA9PSAkYmxvYmRpZmZmZCgkaWRzKX0gewoJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHskaWRzICE9ICRkaWZmaWRzIHx8ICRiZGYgIT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYge1tyZWdleHAge15kaWZmIC0tZ2l0IGEvKC4qKSBiLyguKil9ICRsaW5lIG1hdGNoIGZuYW1lIG5ld25hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCXNldCBjdXJ0YWdzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgaGVhZGVyICRuZXduYW1lCglzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkZGlmZmlkcykgJGZuYW1lXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgZGlmZmZpbGVzdGFydCgkaSkgJGhlcmUKCSAgICBpbmNyIGkKCSAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuJGkgJGhlcmUKCSAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLiRpIGxlZnQKCX0KCWlmIHskbmV3bmFtZSAhPSAkZm5hbWV9IHsKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkZGlmZmlkcykgJG5ld25hbWVdCgkgICAgaWYgeyRpID49IDB9IHsKCQlzZXQgZGlmZmZpbGVzdGFydCgkaSkgJGhlcmUKCQlpbmNyIGkKCQkkY3RleHQgbWFyayBzZXQgZm1hcmsuJGkgJGhlcmUKCQkkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLiRpIGxlZnQKCSAgICB9Cgl9CglzZXQgY3VyZGlmZnRhZyAiZjokZm5hbWUiCgkkY3RleHQgdGFnIGRlbGV0ZSAkY3VyZGlmZnRhZwoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRoZWFkZXJdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGhlYWRlciAkcGFkXG4iIGZpbGVzZXAKCXNldCBkaWZmaW5oZHIgMQogICAgfSBlbHNlaWYgeyRkaWZmaW5oZHIgJiYgW3N0cmluZyBjb21wYXJlIC1sZW5ndGggMyAkbGluZSAiLS0tIl0gPT0gMH0gewoJIyBkbyBub3RoaW5nCiAgICB9IGVsc2VpZiB7JGRpZmZpbmhkciAmJiBbc3RyaW5nIGNvbXBhcmUgLWxlbmd0aCAzICRsaW5lICIrKysiXSA9PSAwfSB7CglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteQEAgLShbMC05XSspLChbMC05XSspIFwrKFswLTldKyksKFswLTldKykgQEAoLiopfSBcCgkJICAgJGxpbmUgbWF0Y2ggZjFsIGYxYyBmMmwgZjJjIHJlc3RdfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgaHVua3NlcAoJc2V0IGRpZmZpbmhkciAwCiAgICB9IGVsc2UgewoJc2V0IHggW3N0cmluZyByYW5nZSAkbGluZSAwIDBdCglpZiB7JHggPT0gIi0iIHx8ICR4ID09ICIrIn0gewoJICAgIHNldCB0YWcgW2V4cHIgeyR4ID09ICIrIn1dCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGQkdGFnCgl9IGVsc2VpZiB7JHggPT0gIiAifSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iCgl9IGVsc2VpZiB7JGRpZmZpbmhkciB8fCAkeCA9PSAiXFwifSB7CgkgICAgIyBlLmcuICJcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKCX0gZWxzZSB7CgkgICAgIyBTb21ldGhpbmcgZWxzZSB3ZSBkb24ndCByZWNvZ25pemUKCSAgICBpZiB7JGN1cmRpZmZ0YWcgIT0gIkNvbW1lbnRzIn0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkJc2V0IGN1cnRhZ3N0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCQlzZXQgY3VyZGlmZnRhZyBDb21tZW50cwoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJaW5jciBuZXh0dXBkYXRlIDEwMAoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUge30KCXVwZGF0ZQoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgImdldGJsb2JkaWZmbGluZSAkYmRmIHskaWRzfSIKICAgIH0KfQoKcHJvYyBuZXh0ZmlsZSB7fSB7CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAogICAgc2V0IGhlcmUgWyRjdGV4dCBpbmRleCBAMCwwXQogICAgZm9yIHtzZXQgaSAwfSB7W2luZm8gZXhpc3RzIGRpZmZmaWxlc3RhcnQoJGkpXX0ge2luY3IgaX0gewoJaWYge1skY3RleHQgY29tcGFyZSAkZGlmZmZpbGVzdGFydCgkaSkgPiAkaGVyZV19IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBwb3NdCgkJfHwgWyRjdGV4dCBjb21wYXJlICRkaWZmZmlsZXN0YXJ0KCRpKSA8ICRwb3NdfSB7CgkJc2V0IHBvcyAkZGlmZmZpbGVzdGFydCgkaSkKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHBvc119IHsKCSRjdGV4dCB5dmlldyAkcG9zCiAgICB9Cn0KCnByb2MgbGlzdGJveHNlbCB7fSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0IGN1cnJlbnRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgc2VsIFtsc29ydCBbJGNmbGlzdCBjdXJzZWxlY3Rpb25dXQogICAgaWYgeyRzZWwgZXEge319IHJldHVybgogICAgc2V0IGZpcnN0IFtsaW5kZXggJHNlbCAwXQogICAgY2F0Y2ggeyRjdGV4dCB5dmlldyBmbWFyay4kZmlyc3R9Cn0KCnByb2Mgc2V0Y29vcmRzIHt9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAogICAgZ2xvYmFsIHhzcGMxIHhzcGMyIGx0aGlja25lc3MKCiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQogICAgc2V0IGNhbnZ4MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQogICAgc2V0IGx0aGlja25lc3MgW2V4cHIge2ludCgkbGluZXNwYyAvIDkpICsgMX1dCiAgICBzZXQgeHNwYzEoMCkgJGxpbmVzcGMKICAgIHNldCB4c3BjMiAkbGluZXNwYwp9Cgpwcm9jIHJlZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgY2FudiBjYW52eTAgbGluZXNwYyBudW1jb21taXRzCiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4ID09IDB9IHJldHVybgogICAgc2V0IHNwYW4gWyRjYW52IHl2aWV3XQogICAgY2xlYXJfZGlzcGxheQogICAgYWxsY2FudnMgY29uZiAtc2Nyb2xscmVnaW9uIFwKCVtsaXN0IDAgMCAwIFtleHByIHskY2FudnkwICsgKCRudW1jb21taXRzIC0gMC41KSAqICRsaW5lc3BjICsgMn1dXQogICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtsaW5kZXggJHNwYW4gMF0KICAgIGRyYXd2aXNpYmxlCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCiAgICB9Cn0KCnByb2MgaW5jcmZvbnQge2luY30gewogICAgZ2xvYmFsIG1haW5mb250IG5hbWVmb250IHRleHRmb250IGN0ZXh0IGNhbnYgcGhhc2UKICAgIGdsb2JhbCBzdG9wcGVkIGVudHJpZXMKICAgIHVubWFya21hdGNoZXMKICAgIHNldCBtYWluZm9udCBbbHJlcGxhY2UgJG1haW5mb250IDEgMSBbZXhwciB7W2xpbmRleCAkbWFpbmZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXQgbmFtZWZvbnQgW2xyZXBsYWNlICRuYW1lZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG5hbWVmb250IDFdICsgJGluY31dXQogICAgc2V0IHRleHRmb250IFtscmVwbGFjZSAkdGV4dGZvbnQgMSAxIFtleHByIHtbbGluZGV4ICR0ZXh0Zm9udCAxXSArICRpbmN9XV0KICAgIHNldGNvb3JkcwogICAgJGN0ZXh0IGNvbmYgLWZvbnQgJHRleHRmb250CiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCSRlIGNvbmYgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIn0gewoJJGNhbnYgaXRlbWNvbmYgdGV4dGl0ZW1zIC1mb250ICRtYWluZm9udAogICAgfQogICAgcmVkaXNwbGF5Cn0KCnByb2MgY2xlYXJzaGExIHt9IHsKICAgIGdsb2JhbCBzaGExZW50cnkgc2hhMXN0cmluZwogICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaGExc3RyaW5nXSA9PSA0MH0gewoJJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgIH0KfQoKcHJvYyBzaGExY2hhbmdlIHtuMSBuMiBvcH0gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIHNoYTFidXQKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7WyRzaGExYnV0IGNnZXQgLXN0YXRlXSA9PSAkc3RhdGV9IHJldHVybgogICAgaWYgeyRzdGF0ZSA9PSAibm9ybWFsIn0gewoJJHNoYTFidXQgY29uZiAtc3RhdGUgbm9ybWFsIC1yZWxpZWYgcmFpc2VkIC10ZXh0ICJHb3RvOiAiCiAgICB9IGVsc2UgewoJJHNoYTFidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IC10ZXh0ICJTSEExIElEOiAiCiAgICB9Cn0KCnByb2MgZ290b2NvbW1pdCB7fSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgY29tbWl0cm93IHRhZ2lkcwogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBudW1jb21taXRzCgogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHJldHVybgogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICR0YWdpZHMoJHNoYTFzdHJpbmcpCiAgICB9IGVsc2UgewoJc2V0IGlkIFtzdHJpbmcgdG9sb3dlciAkc2hhMXN0cmluZ10KCWlmIHtbcmVnZXhwIHteWzAtOWEtZl17NCwzOX0kfSAkaWRdfSB7CgkgICAgc2V0IG1hdGNoZXMge30KCSAgICBmb3JlYWNoIGkgJGRpc3BsYXlvcmRlciB7CgkJaWYge1tzdHJpbmcgbWF0Y2ggJGlkKiAkaV19IHsKCQkgICAgbGFwcGVuZCBtYXRjaGVzICRpCgkJfQoJICAgIH0KCSAgICBpZiB7JG1hdGNoZXMgbmUge319IHsKCQlpZiB7W2xsZW5ndGggJG1hdGNoZXNdID4gMX0gewoJCSAgICBlcnJvcl9wb3B1cCAiU2hvcnQgU0hBMSBpZCAkaWQgaXMgYW1iaWd1b3VzIgoJCSAgICByZXR1cm4KCQl9CgkJc2V0IGlkIFtsaW5kZXggJG1hdGNoZXMgMF0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkaWQpXX0gewoJc2VsZWN0bGluZSAkY29tbWl0cm93KCRpZCkgMQoJcmV0dXJuCiAgICB9CiAgICBpZiB7W3JlZ2V4cCB7XlswLTlhLWZBLUZdezQsfSR9ICRzaGExc3RyaW5nXX0gewoJc2V0IHR5cGUgIlNIQTEgaWQiCiAgICB9IGVsc2UgewoJc2V0IHR5cGUgIlRhZyIKICAgIH0KICAgIGVycm9yX3BvcHVwICIkdHlwZSAkc2hhMXN0cmluZyBpcyBub3Qga25vd24iCn0KCnByb2MgbGluZWVudGVyIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2FudgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV0gJiYgIVtnZXRjb21taXQgJGlkXX0gcmV0dXJuCiAgICBzZXQgaG92ZXJ4ICR4CiAgICBzZXQgaG92ZXJ5ICR5CiAgICBzZXQgaG92ZXJpZCAkaWQKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCWFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgogICAgfQogICAgc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICAkY2FudiBkZWxldGUgaG92ZXIKfQoKcHJvYyBsaW5lbW90aW9uIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CglzZXQgaG92ZXJ4ICR4CglzZXQgaG92ZXJ5ICR5CglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgl9CglzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgIH0KfQoKcHJvYyBsaW5lbGVhdmUge2lkfSB7CiAgICBnbG9iYWwgaG92ZXJpZCBob3ZlcnRpbWVyIGNhbnYKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJJGNhbnYgZGVsZXRlIGhvdmVyCglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgkgICAgdW5zZXQgaG92ZXJ0aW1lcgoJfQoJdW5zZXQgaG92ZXJpZAogICAgfQp9Cgpwcm9jIGxpbmVob3ZlciB7fSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNvbW1pdGluZm8gbWFpbmZvbnQKCiAgICBzZXQgdGV4dCBbbGluZGV4ICRjb21taXRpbmZvKCRob3ZlcmlkKSAwXQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB4IFtleHByIHskaG92ZXJ4ICsgMiAqICRsaW5lc3BjfV0KICAgIHNldCB5IFtleHByIHskaG92ZXJ5ICsgJHlmcmFjICogJHltYXggLSAkbGluZXNwYyAvIDJ9XQogICAgc2V0IHgwIFtleHByIHskeCAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTAgW2V4cHIgeyR5IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB4MSBbZXhwciB7JHggKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGV4dF0gKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkxIFtleHByIHskeSArICRsaW5lc3BjICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdGFuZ2xlICR4MCAkeTAgJHgxICR5MSBcCgkgICAgICAgLWZpbGwgXCNmZmZmODAgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDEgLXRhZ3MgaG92ZXJdCiAgICAkY2FudiByYWlzZSAkdAogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4ICR5IC1hbmNob3IgbncgLXRleHQgJHRleHQgLXRhZ3MgaG92ZXIgLWZvbnQgJG1haW5mb250XQogICAgJGNhbnYgcmFpc2UgJHQKfQoKcHJvYyBjbGlja2lzb25hcnJvdyB7aWQgeX0gewogICAgZ2xvYmFsIGx0aGlja25lc3MgaWRyb3dyYW5nZXMKCiAgICBzZXQgdGhyZXNoIFtleHByIHsyICogJGx0aGlja25lc3MgKyA2fV0KICAgIHNldCBuIFtleHByIHtbbGxlbmd0aCAkaWRyb3dyYW5nZXMoJGlkKV0gLSAxfV0KICAgIGZvciB7c2V0IGkgMX0geyRpIDwgJG59IHtpbmNyIGl9IHsKCXNldCByb3cgW2xpbmRleCAkaWRyb3dyYW5nZXMoJGlkKSAkaV0KCWlmIHthYnMoW3ljICRyb3ddIC0gJHkpIDwgJHRocmVzaH0gewoJICAgIHJldHVybiAkaQoJfQogICAgfQogICAgcmV0dXJuIHt9Cn0KCnByb2MgYXJyb3dqdW1wIHtpZCBuIHl9IHsKICAgIGdsb2JhbCBpZHJvd3JhbmdlcyBjYW52CgogICAgIyAxIDwtPiAyLCAzIDwtPiA0LCBldGMuLi4KICAgIHNldCBuIFtleHByIHsoKCRuIC0gMSkgXiAxKSArIDF9XQogICAgc2V0IHJvdyBbbGluZGV4ICRpZHJvd3JhbmdlcygkaWQpICRuXQogICAgc2V0IHl0IFt5YyAkcm93XQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4IDw9IDB9IHJldHVybgogICAgc2V0IHZpZXcgWyRjYW52IHl2aWV3XQogICAgc2V0IHlzcGFuIFtleHByIHtbbGluZGV4ICR2aWV3IDFdIC0gW2xpbmRleCAkdmlldyAwXX1dCiAgICBzZXQgeWZyYWMgW2V4cHIgeyR5dCAvICR5bWF4IC0gJHlzcGFuIC8gMn1dCiAgICBpZiB7JHlmcmFjIDwgMH0gewoJc2V0IHlmcmFjIDAKICAgIH0KICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byAkeWZyYWMKfQoKcHJvYyBsaW5lY2xpY2sge3ggeSBpZCBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdGluZm8gY2hpbGRyZW4gY2ZsaXN0IGNhbnYgdGhpY2tlcmxpbmUKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldICYmICFbZ2V0Y29tbWl0ICRpZF19IHJldHVybgogICAgdW5tYXJrbWF0Y2hlcwogICAgdW5zZWxlY3RsaW5lCiAgICBub3JtYWxsaW5lCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgICMgZHJhdyB0aGlzIGxpbmUgdGhpY2tlciB0aGFuIG5vcm1hbAogICAgc2V0IHRoaWNrZXJsaW5lICRpZAogICAgZHJhd2xpbmVzICRpZAogICAgaWYgeyRpc25ld30gewoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJaWYgeyR5bWF4IGVxIHt9fSByZXR1cm4KCXNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KCXNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIH0KICAgIHNldCBkaXJuIFtjbGlja2lzb25hcnJvdyAkaWQgJHldCiAgICBpZiB7JGRpcm4gbmUge319IHsKCWFycm93anVtcCAkaWQgJGRpcm4gJHkKCXJldHVybgogICAgfQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBsaW5lY2xpY2sgJHggJHkgJGlkIDBdCiAgICB9CiAgICAjIGZpbGwgdGhlIGRldGFpbHMgcGFuZSB3aXRoIGluZm8gYWJvdXQgdGhpcyBsaW5lCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6XHQiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkaWRdCiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV1cbiIKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHREYXRlOlx0JGRhdGVcbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJcbkNoaWxkcmVuOiIKCXNldCBpIDAKCWZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRpZCkgewoJICAgIGluY3IgaQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGNoaWxkKV0gJiYgIVtnZXRjb21taXQgJGNoaWxkXX0gY29udGludWUKCSAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkY2hpbGQpCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHQiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgJGNoaWxkIFtsaXN0IGxpbmsgbGluayRpXQoJICAgICRjdGV4dCB0YWcgYmluZCBsaW5rJGkgPDE+IFtsaXN0IHNlbGJ5aWQgJGNoaWxkXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV0iCgkgICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdERhdGU6XHQkZGF0ZVxuIgoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCgogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKfQoKcHJvYyBub3JtYWxsaW5lIHt9IHsKICAgIGdsb2JhbCB0aGlja2VybGluZQogICAgaWYge1tpbmZvIGV4aXN0cyB0aGlja2VybGluZV19IHsKCXNldCBpZCAkdGhpY2tlcmxpbmUKCXVuc2V0IHRoaWNrZXJsaW5lCglkcmF3bGluZXMgJGlkCiAgICB9Cn0KCnByb2Mgc2VsYnlpZCB7aWR9IHsKICAgIGdsb2JhbCBjb21taXRyb3cKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRpZCldfSB7CglzZWxlY3RsaW5lICRjb21taXRyb3coJGlkKSAxCiAgICB9Cn0KCnByb2MgbXN0aW1lIHt9IHsKICAgIGdsb2JhbCBzdGFydG1zdGltZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc3RhcnRtc3RpbWVdfSB7CglzZXQgc3RhcnRtc3RpbWUgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgfQogICAgcmV0dXJuIFtmb3JtYXQgIiUuM2YiIFtleHByIHsoW2Nsb2NrIGNsaWNrIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXN0aW1lKSAvIDEwMDAuMH1dXQp9Cgpwcm9jIHJvd21lbnUge3ggeSBpZH0gewogICAgZ2xvYmFsIHJvd2N0eG1lbnUgY29tbWl0cm93IHNlbGVjdGVkbGluZSByb3dtZW51aWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8ICRjb21taXRyb3coJGlkKSBlcSAkc2VsZWN0ZWRsaW5lfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAwIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDEgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMiAtc3RhdGUgJHN0YXRlCiAgICBzZXQgcm93bWVudWlkICRpZAogICAgdGtfcG9wdXAgJHJvd2N0eG1lbnUgJHggJHkKfQoKcHJvYyBkaWZmdnNzZWwge2Rpcm59IHsKICAgIGdsb2JhbCByb3dtZW51aWQgc2VsZWN0ZWRsaW5lIGRpc3BsYXlvcmRlcgoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgaWYgeyRkaXJufSB7CglzZXQgb2xkaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRzZWxlY3RlZGxpbmVdCglzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgfSBlbHNlIHsKCXNldCBvbGRpZCAkcm93bWVudWlkCglzZXQgbmV3aWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRzZWxlY3RlZGxpbmVdCiAgICB9CiAgICBhZGR0b2hpc3RvcnkgW2xpc3QgZG9zZWxkaWZmICRvbGRpZCAkbmV3aWRdCiAgICBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZAp9Cgpwcm9jIGRvc2VsZGlmZiB7b2xkaWQgbmV3aWR9IHsKICAgIGdsb2JhbCBjdGV4dCBjZmxpc3QKICAgIGdsb2JhbCBjb21taXRpbmZvCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuMCAwLjAKICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuMCBsZWZ0CiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAogICAgJGNmbGlzdCBpbnNlcnQgZW5kICJUb3AiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiRnJvbSAiCiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJG9sZGlkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG9sZGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXG5UbyAgICIKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMSA8MT4gW2xpc3Qgc2VsYnlpZCAkbmV3aWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkbmV3aWQgW2xpc3QgbGluayBsaW5rMV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBzdGFydGRpZmYgW2xpc3QgJG9sZGlkICRuZXdpZF0KfQoKcHJvYyBta3BhdGNoIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgY3VycmVudGlkIGNvbW1pdGluZm8gcGF0Y2h0b3AgcGF0Y2hudW0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBvbGRpZCAkY3VycmVudGlkCiAgICBzZXQgb2xkaGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgIHNldCBuZXdpZCAkcm93bWVudWlkCiAgICBzZXQgbmV3aGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgIHNldCB0b3AgLnBhdGNoCiAgICBzZXQgcGF0Y2h0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkdlbmVyYXRlIHBhdGNoIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZnJvbSAtdGV4dCAiRnJvbToiCiAgICBlbnRyeSAkdG9wLmZyb21zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbXNoYTEgaW5zZXJ0IDAgJG9sZGlkCiAgICAkdG9wLmZyb21zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuZnJvbSAkdG9wLmZyb21zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5mcm9taGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21oZWFkIGluc2VydCAwICRvbGRoZWFkCiAgICAkdG9wLmZyb21oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5mcm9taGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudG8gLXRleHQgIlRvOiIKICAgIGVudHJ5ICR0b3AudG9zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9zaGExIGluc2VydCAwICRuZXdpZAogICAgJHRvcC50b3NoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC50byAkdG9wLnRvc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AudG9oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9oZWFkIGluc2VydCAwICRuZXdoZWFkCiAgICAkdG9wLnRvaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AudG9oZWFkIC1zdGlja3kgdwogICAgYnV0dG9uICR0b3AucmV2IC10ZXh0ICJSZXZlcnNlIiAtY29tbWFuZCBta3BhdGNocmV2IC1wYWR4IDUKICAgIGdyaWQgJHRvcC5yZXYgeCAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgInBhdGNoJHBhdGNobnVtLnBhdGNoIl0KICAgIGluY3IgcGF0Y2hudW0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJHZW5lcmF0ZSIgLWNvbW1hbmQgbWtwYXRjaGdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3BhdGNoY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyBta3BhdGNocmV2IHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBvbGRoZWFkIFskcGF0Y2h0b3AuZnJvbWhlYWQgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBuZXdoZWFkIFskcGF0Y2h0b3AudG9oZWFkIGdldF0KICAgIGZvcmVhY2ggZSBbbGlzdCBmcm9tc2hhMSBmcm9taGVhZCB0b3NoYTEgdG9oZWFkXSBcCgkgICAgdiBbbGlzdCAkbmV3aWQgJG5ld2hlYWQgJG9sZGlkICRvbGRoZWFkXSB7CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgbm9ybWFsCgkkcGF0Y2h0b3AuJGUgZGVsZXRlIDAgZW5kCgkkcGF0Y2h0b3AuJGUgaW5zZXJ0IDAgJHYKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgfQp9Cgpwcm9jIG1rcGF0Y2hnbyB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IGZuYW1lIFskcGF0Y2h0b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQtZGlmZi10cmVlIC1wICRvbGRpZCAkbmV3aWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgcGF0Y2g6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rcGF0Y2hjYW4ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3RhZyB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIG1rdGFndG9wIGNvbW1pdGluZm8KCiAgICBzZXQgdG9wIC5tYWtldGFnCiAgICBzZXQgbWt0YWd0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSB0YWciCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudGxhYiAtdGV4dCAiVGFnIG5hbWU6IgogICAgZW50cnkgJHRvcC50YWcgLXdpZHRoIDYwCiAgICBncmlkICR0b3AudGxhYiAkdG9wLnRhZyAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgbWt0YWdnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWt0YWdjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC50YWcKfQoKcHJvYyBkb21rdGFnIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcCBlbnYgdGFnaWRzIGlkdGFncwoKICAgIHNldCBpZCBbJG1rdGFndG9wLnNoYTEgZ2V0XQogICAgc2V0IHRhZyBbJG1rdGFndG9wLnRhZyBnZXRdCiAgICBpZiB7JHRhZyA9PSB7fX0gewoJZXJyb3JfcG9wdXAgIk5vIHRhZyBuYW1lIHNwZWNpZmllZCIKCXJldHVybgogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHRhZyldfSB7CgllcnJvcl9wb3B1cCAiVGFnIFwiJHRhZ1wiIGFscmVhZHkgZXhpc3RzIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBkaXIgW2dpdGRpcl0KCXNldCBmbmFtZSBbZmlsZSBqb2luICRkaXIgInJlZnMvdGFncyIgJHRhZ10KCXNldCBmIFtvcGVuICRmbmFtZSB3XQoJcHV0cyAkZiAkaWQKCWNsb3NlICRmCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyB0YWc6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgdGFnaWRzKCR0YWcpICRpZAogICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkdGFnCiAgICByZWRyYXd0YWdzICRpZAp9Cgpwcm9jIHJlZHJhd3RhZ3Mge2lkfSB7CiAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBjb21taXRyb3cgaWRwb3Mgc2VsZWN0ZWRsaW5lCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRpZCldfSByZXR1cm4KICAgIGRyYXdjbWl0cm93ICRjb21taXRyb3coJGlkKQogICAgJGNhbnYgZGVsZXRlIHRhZy4kaWQKICAgIHNldCB4dCBbZXZhbCBkcmF3dGFncyAkaWQgJGlkcG9zKCRpZCldCiAgICAkY2FudiBjb29yZHMgJGxpbmVodGFnKCRjb21taXRyb3coJGlkKSkgJHh0IFtsaW5kZXggJGlkcG9zKCRpZCkgMl0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkc2VsZWN0ZWRsaW5lID09ICRjb21taXRyb3coJGlkKX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKICAgIH0KfQoKcHJvYyBta3RhZ2NhbiB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkbWt0YWd0b3B9CiAgICB1bnNldCBta3RhZ3RvcAp9Cgpwcm9jIG1rdGFnZ28ge30gewogICAgZG9ta3RhZwogICAgbWt0YWdjYW4KfQoKcHJvYyB3cml0ZWNvbW1pdCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHdyY29tdG9wIGNvbW1pdGluZm8gd3Jjb21jbWQKCiAgICBzZXQgdG9wIC53cml0ZWNvbW1pdAogICAgc2V0IHdyY29tdG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJXcml0ZSBjb21taXQgdG8gZmlsZSIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5jbGFiIC10ZXh0ICJDb21tYW5kOiIKICAgIGVudHJ5ICR0b3AuY21kIC13aWR0aCA2MCAtdGV4dHZhcmlhYmxlIHdyY29tY21kCiAgICBncmlkICR0b3AuY2xhYiAkdG9wLmNtZCAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJjb21taXQtW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgNl0iXQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIldyaXRlIiAtY29tbWFuZCB3cmNvbWdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB3cmNvbWNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2Mgd3Jjb21nbyB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBzZXQgaWQgWyR3cmNvbXRvcC5zaGExIGdldF0KICAgIHNldCBjbWQgImVjaG8gJGlkIHwgWyR3cmNvbXRvcC5jbWQgZ2V0XSIKICAgIHNldCBmbmFtZSBbJHdyY29tdG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgJGNtZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciB3cml0aW5nIGNvbW1pdDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2Mgd3Jjb21jYW4ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyBsaXN0cmVmcyB7aWR9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwoKICAgIHNldCB4IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IHggJGlkdGFncygkaWQpCiAgICB9CiAgICBzZXQgeSB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgeSAkaWRoZWFkcygkaWQpCiAgICB9CiAgICBzZXQgeiB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHogJGlkb3RoZXJyZWZzKCRpZCkKICAgIH0KICAgIHJldHVybiBbbGlzdCAkeCAkeSAkel0KfQoKcHJvYyByZXJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIHRhZ2lkcyBoZWFkaWRzIG90aGVycmVmaWRzCgogICAgc2V0IHJlZmlkcyBbY29uY2F0IFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkgICAgW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldfSB7CgkgICAgc2V0IHJlZigkaWQpIFtsaXN0cmVmcyAkaWRdCgl9CiAgICB9CiAgICByZWFkcmVmcwogICAgc2V0IHJlZmlkcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRyZWZpZHMgW2FycmF5IG5hbWVzIGlkdGFnc10gXAoJCQlbYXJyYXkgbmFtZXMgaWRoZWFkc10gW2FycmF5IG5hbWVzIGlkb3RoZXJyZWZzXV1dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJc2V0IHYgW2xpc3RyZWZzICRpZF0KCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXSB8fCAkcmVmKCRpZCkgIT0gJHZ9IHsKCSAgICByZWRyYXd0YWdzICRpZAoJfQogICAgfQp9Cgpwcm9jIHNob3d0YWcge3RhZyBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdCB0YWdjb250ZW50cyB0YWdpZHMgbGlua251bQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzaG93dGFnICR0YWcgMF0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgc2V0IGxpbmtudW0gMAogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdjb250ZW50cygkdGFnKV19IHsKCXNldCB0ZXh0ICR0YWdjb250ZW50cygkdGFnKQogICAgfSBlbHNlIHsKCXNldCB0ZXh0ICJUYWc6ICR0YWdcbklkOiAgJHRhZ2lkcygkdGFnKSIKICAgIH0KICAgIGFwcGVuZHdpdGhsaW5rcyAkdGV4dAogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAp9Cgpwcm9jIGRvcXVpdCB7fSB7CiAgICBnbG9iYWwgc3RvcHBlZAogICAgc2V0IHN0b3BwZWQgMTAwCiAgICBkZXN0cm95IC4KfQoKcHJvYyBkb3ByZWZzIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cyBmaW5kbWVyZ2VmaWxlcwogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wCgogICAgc2V0IHRvcCAuZ2l0a3ByZWZzCiAgICBzZXQgcHJlZnN0b3AgJHRvcAogICAgaWYge1t3aW5mbyBleGlzdHMgJHRvcF19IHsKCXJhaXNlICR0b3AKCXJldHVybgogICAgfQogICAgZm9yZWFjaCB2IHttYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cyBmaW5kbWVyZ2VmaWxlc30gewoJc2V0IG9sZHByZWZzKCR2KSBbc2V0ICR2XQogICAgfQogICAgdG9wbGV2ZWwgJHRvcAogICAgd20gdGl0bGUgJHRvcCAiR2l0ayBwcmVmZXJlbmNlcyIKICAgIGxhYmVsICR0b3AubGRpc3AgLXRleHQgIkNvbW1pdCBsaXN0IGRpc3BsYXkgb3B0aW9ucyIKICAgIGdyaWQgJHRvcC5sZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5zcGFjZXIgLXRleHQgIiAiCiAgICBsYWJlbCAkdG9wLm1heHdpZHRobCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAobGluZXMpIiBcCgktZm9udCBvcHRpb25mb250CiAgICBzcGluYm94ICR0b3AubWF4d2lkdGggLWZyb20gMCAtdG8gMTAwIC13aWR0aCA0IC10ZXh0dmFyaWFibGUgbWF4d2lkdGgKICAgIGdyaWQgJHRvcC5zcGFjZXIgJHRvcC5tYXh3aWR0aGwgJHRvcC5tYXh3aWR0aCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AubWF4cGN0bCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAoJSBvZiBwYW5lKSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgc3BpbmJveCAkdG9wLm1heHBjdCAtZnJvbSAxIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXhncmFwaHBjdAogICAgZ3JpZCB4ICR0b3AubWF4cGN0bCAkdG9wLm1heHBjdCAtc3RpY2t5IHcKICAgIGNoZWNrYnV0dG9uICR0b3AuZmluZG0gLXZhcmlhYmxlIGZpbmRtZXJnZWZpbGVzCiAgICBsYWJlbCAkdG9wLmZpbmRtbCAtdGV4dCAiSW5jbHVkZSBtZXJnZXMgZm9yIFwiRmluZFwiIGluIFwiRmlsZXNcIiIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgZ3JpZCAkdG9wLmZpbmRtICR0b3AuZmluZG1sIC0gLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmRkaXNwIC10ZXh0ICJEaWZmIGRpc3BsYXkgb3B0aW9ucyIKICAgIGdyaWQgJHRvcC5kZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5kaWZmb3B0bCAtdGV4dCAiT3B0aW9ucyBmb3IgZGlmZiBwcm9ncmFtIiBcCgktZm9udCBvcHRpb25mb250CiAgICBlbnRyeSAkdG9wLmRpZmZvcHQgLXdpZHRoIDIwIC10ZXh0dmFyaWFibGUgZGlmZm9wdHMKICAgIGdyaWQgeCAkdG9wLmRpZmZvcHRsICR0b3AuZGlmZm9wdCAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5vayAtdGV4dCAiT0siIC1jb21tYW5kIHByZWZzb2sKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHByZWZzY2FuCiAgICBncmlkICR0b3AuYnV0cy5vayAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLSAtcGFkeSAxMCAtc3RpY2t5IGV3Cn0KCnByb2MgcHJlZnNjYW4ge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIGZpbmRtZXJnZWZpbGVzCiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3AKCiAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIGZpbmRtZXJnZWZpbGVzfSB7CglzZXQgJHYgJG9sZHByZWZzKCR2KQogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQogICAgdW5zZXQgcHJlZnN0b3AKfQoKcHJvYyBwcmVmc29rIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQogICAgdW5zZXQgcHJlZnN0b3AKICAgIGlmIHskbWF4d2lkdGggIT0gJG9sZHByZWZzKG1heHdpZHRoKQoJfHwgJG1heGdyYXBocGN0ICE9ICRvbGRwcmVmcyhtYXhncmFwaHBjdCl9IHsKCXJlZGlzcGxheQogICAgfQp9Cgpwcm9jIGZvcm1hdGRhdGUge2R9IHsKICAgIHJldHVybiBbY2xvY2sgZm9ybWF0ICRkIC1mb3JtYXQgIiVZLSVtLSVkICVIOiVNOiVTIl0KfQoKIyBUaGlzIGxpc3Qgb2YgZW5jb2RpbmcgbmFtZXMgYW5kIGFsaWFzZXMgaXMgZGlzdGlsbGVkIGZyb20KIyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzLgojIE5vdCBhbGwgb2YgdGhlbSBhcmUgc3VwcG9ydGVkIGJ5IFRjbC4Kc2V0IGVuY29kaW5nX2FsaWFzZXMgewogICAgeyBBTlNJX1gzLjQtMTk2OCBpc28taXItNiBBTlNJX1gzLjQtMTk4NiBJU09fNjQ2LmlydjoxOTkxIEFTQ0lJCiAgICAgIElTTzY0Ni1VUyBVUy1BU0NJSSB1cyBJQk0zNjcgY3AzNjcgY3NBU0NJSSB9CiAgICB7IElTTy0xMDY0Ni1VVEYtMSBjc0lTTzEwNjQ2VVRGMSB9CiAgICB7IElTT182NDYuYmFzaWM6MTk4MyByZWYgY3NJU082NDZiYXNpYzE5ODMgfQogICAgeyBJTlZBUklBTlQgY3NJTlZBUklBTlQgfQogICAgeyBJU09fNjQ2LmlydjoxOTgzIGlzby1pci0yIGlydiBjc0lTTzJJbnRsUmVmVmVyc2lvbiB9CiAgICB7IEJTXzQ3MzAgaXNvLWlyLTQgSVNPNjQ2LUdCIGdiIHVrIGNzSVNPNFVuaXRlZEtpbmdkb20gfQogICAgeyBOQVRTLVNFRkkgaXNvLWlyLTgtMSBjc05BVFNTRUZJIH0KICAgIHsgTkFUUy1TRUZJLUFERCBpc28taXItOC0yIGNzTkFUU1NFRklBREQgfQogICAgeyBOQVRTLURBTk8gaXNvLWlyLTktMSBjc05BVFNEQU5PIH0KICAgIHsgTkFUUy1EQU5PLUFERCBpc28taXItOS0yIGNzTkFUU0RBTk9BREQgfQogICAgeyBTRU5fODUwMjAwX0IgaXNvLWlyLTEwIEZJIElTTzY0Ni1GSSBJU082NDYtU0Ugc2UgY3NJU08xMFN3ZWRpc2ggfQogICAgeyBTRU5fODUwMjAwX0MgaXNvLWlyLTExIElTTzY0Ni1TRTIgc2UyIGNzSVNPMTFTd2VkaXNoRm9yTmFtZXMgfQogICAgeyBLU19DXzU2MDEtMTk4NyBpc28taXItMTQ5IEtTX0NfNTYwMS0xOTg5IEtTQ181NjAxIGtvcmVhbiBjc0tTQzU2MDExOTg3IH0KICAgIHsgSVNPLTIwMjItS1IgY3NJU08yMDIyS1IgfQogICAgeyBFVUMtS1IgY3NFVUNLUiB9CiAgICB7IElTTy0yMDIyLUpQIGNzSVNPMjAyMkpQIH0KICAgIHsgSVNPLTIwMjItSlAtMiBjc0lTTzIwMjJKUDIgfQogICAgeyBKSVNfQzYyMjAtMTk2OS1qcCBKSVNfQzYyMjAtMTk2OSBpc28taXItMTMga2F0YWthbmEgeDAyMDEtNwogICAgICBjc0lTTzEzSklTQzYyMjBqcCB9CiAgICB7IEpJU19DNjIyMC0xOTY5LXJvIGlzby1pci0xNCBqcCBJU082NDYtSlAgY3NJU08xNEpJU0M2MjIwcm8gfQogICAgeyBJVCBpc28taXItMTUgSVNPNjQ2LUlUIGNzSVNPMTVJdGFsaWFuIH0KICAgIHsgUFQgaXNvLWlyLTE2IElTTzY0Ni1QVCBjc0lTTzE2UG9ydHVndWVzZSB9CiAgICB7IEVTIGlzby1pci0xNyBJU082NDYtRVMgY3NJU08xN1NwYW5pc2ggfQogICAgeyBncmVlazctb2xkIGlzby1pci0xOCBjc0lTTzE4R3JlZWs3T2xkIH0KICAgIHsgbGF0aW4tZ3JlZWsgaXNvLWlyLTE5IGNzSVNPMTlMYXRpbkdyZWVrIH0KICAgIHsgRElOXzY2MDAzIGlzby1pci0yMSBkZSBJU082NDYtREUgY3NJU08yMUdlcm1hbiB9CiAgICB7IE5GX1pfNjItMDEwXygxOTczKSBpc28taXItMjUgSVNPNjQ2LUZSMSBjc0lTTzI1RnJlbmNoIH0KICAgIHsgTGF0aW4tZ3JlZWstMSBpc28taXItMjcgY3NJU08yN0xhdGluR3JlZWsxIH0KICAgIHsgSVNPXzU0MjcgaXNvLWlyLTM3IGNzSVNPNTQyN0N5cmlsbGljIH0KICAgIHsgSklTX0M2MjI2LTE5NzggaXNvLWlyLTQyIGNzSVNPNDJKSVNDNjIyNjE5NzggfQogICAgeyBCU192aWV3ZGF0YSBpc28taXItNDcgY3NJU080N0JTVmlld2RhdGEgfQogICAgeyBJTklTIGlzby1pci00OSBjc0lTTzQ5SU5JUyB9CiAgICB7IElOSVMtOCBpc28taXItNTAgY3NJU081MElOSVM4IH0KICAgIHsgSU5JUy1jeXJpbGxpYyBpc28taXItNTEgY3NJU081MUlOSVNDeXJpbGxpYyB9CiAgICB7IElTT181NDI3OjE5ODEgaXNvLWlyLTU0IElTTzU0MjdDeXJpbGxpYzE5ODEgfQogICAgeyBJU09fNTQyODoxOTgwIGlzby1pci01NSBjc0lTTzU0MjhHcmVlayB9CiAgICB7IEdCXzE5ODgtODAgaXNvLWlyLTU3IGNuIElTTzY0Ni1DTiBjc0lTTzU3R0IxOTg4IH0KICAgIHsgR0JfMjMxMi04MCBpc28taXItNTggY2hpbmVzZSBjc0lTTzU4R0IyMzEyODAgfQogICAgeyBOU180NTUxLTEgaXNvLWlyLTYwIElTTzY0Ni1OTyBubyBjc0lTTzYwRGFuaXNoTm9yd2VnaWFuCiAgICAgIGNzSVNPNjBOb3J3ZWdpYW4xIH0KICAgIHsgTlNfNDU1MS0yIElTTzY0Ni1OTzIgaXNvLWlyLTYxIG5vMiBjc0lTTzYxTm9yd2VnaWFuMiB9CiAgICB7IE5GX1pfNjItMDEwIGlzby1pci02OSBJU082NDYtRlIgZnIgY3NJU082OUZyZW5jaCB9CiAgICB7IHZpZGVvdGV4LXN1cHBsIGlzby1pci03MCBjc0lTTzcwVmlkZW90ZXhTdXBwMSB9CiAgICB7IFBUMiBpc28taXItODQgSVNPNjQ2LVBUMiBjc0lTTzg0UG9ydHVndWVzZTIgfQogICAgeyBFUzIgaXNvLWlyLTg1IElTTzY0Ni1FUzIgY3NJU084NVNwYW5pc2gyIH0KICAgIHsgTVNaXzc3OTUuMyBpc28taXItODYgSVNPNjQ2LUhVIGh1IGNzSVNPODZIdW5nYXJpYW4gfQogICAgeyBKSVNfQzYyMjYtMTk4MyBpc28taXItODcgeDAyMDggSklTX1gwMjA4LTE5ODMgY3NJU084N0pJU1gwMjA4IH0KICAgIHsgZ3JlZWs3IGlzby1pci04OCBjc0lTTzg4R3JlZWs3IH0KICAgIHsgQVNNT180NDkgSVNPXzkwMzYgYXJhYmljNyBpc28taXItODkgY3NJU084OUFTTU80NDkgfQogICAgeyBpc28taXItOTAgY3NJU085MCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWEgaXNvLWlyLTkxIGpwLW9jci1hIGNzSVNPOTFKSVNDNjIyOTE5ODRhIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYiBpc28taXItOTIgSVNPNjQ2LUpQLU9DUi1CIGpwLW9jci1iCiAgICAgIGNzSVNPOTJKSVNDNjI5OTE5ODRiIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYi1hZGQgaXNvLWlyLTkzIGpwLW9jci1iLWFkZCBjc0lTTzkzSklTNjIyOTE5ODRiYWRkIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZCBpc28taXItOTQganAtb2NyLWhhbmQgY3NJU085NEpJUzYyMjkxOTg0aGFuZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWhhbmQtYWRkIGlzby1pci05NSBqcC1vY3ItaGFuZC1hZGQKICAgICAgY3NJU085NUpJUzYyMjkxOTg0aGFuZGFkZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWthbmEgaXNvLWlyLTk2IGNzSVNPOTZKSVNDNjIyOTE5ODRrYW5hIH0KICAgIHsgSVNPXzIwMzMtMTk4MyBpc28taXItOTggZTEzYiBjc0lTTzIwMzMgfQogICAgeyBBTlNJX1gzLjExMC0xOTgzIGlzby1pci05OSBDU0FfVDUwMC0xOTgzIE5BUExQUyBjc0lTTzk5TkFQTFBTIH0KICAgIHsgSVNPXzg4NTktMToxOTg3IGlzby1pci0xMDAgSVNPXzg4NTktMSBJU08tODg1OS0xIGxhdGluMSBsMSBJQk04MTkKICAgICAgQ1A4MTkgY3NJU09MYXRpbjEgfQogICAgeyBJU09fODg1OS0yOjE5ODcgaXNvLWlyLTEwMSBJU09fODg1OS0yIElTTy04ODU5LTIgbGF0aW4yIGwyIGNzSVNPTGF0aW4yIH0KICAgIHsgVC42MS03Yml0IGlzby1pci0xMDIgY3NJU08xMDJUNjE3Yml0IH0KICAgIHsgVC42MS04Yml0IFQuNjEgaXNvLWlyLTEwMyBjc0lTTzEwM1Q2MThiaXQgfQogICAgeyBJU09fODg1OS0zOjE5ODggaXNvLWlyLTEwOSBJU09fODg1OS0zIElTTy04ODU5LTMgbGF0aW4zIGwzIGNzSVNPTGF0aW4zIH0KICAgIHsgSVNPXzg4NTktNDoxOTg4IGlzby1pci0xMTAgSVNPXzg4NTktNCBJU08tODg1OS00IGxhdGluNCBsNCBjc0lTT0xhdGluNCB9CiAgICB7IEVDTUEtY3lyaWxsaWMgaXNvLWlyLTExMSBLT0k4LUUgY3NJU08xMTFFQ01BQ3lyaWxsaWMgfQogICAgeyBDU0FfWjI0My40LTE5ODUtMSBpc28taXItMTIxIElTTzY0Ni1DQSBjc2E3LTEgY2EgY3NJU08xMjFDYW5hZGlhbjEgfQogICAgeyBDU0FfWjI0My40LTE5ODUtMiBpc28taXItMTIyIElTTzY0Ni1DQTIgY3NhNy0yIGNzSVNPMTIyQ2FuYWRpYW4yIH0KICAgIHsgQ1NBX1oyNDMuNC0xOTg1LWdyIGlzby1pci0xMjMgY3NJU08xMjNDU0FaMjQzNDE5ODVnciB9CiAgICB7IElTT184ODU5LTY6MTk4NyBpc28taXItMTI3IElTT184ODU5LTYgSVNPLTg4NTktNiBFQ01BLTExNCBBU01PLTcwOAogICAgICBhcmFiaWMgY3NJU09MYXRpbkFyYWJpYyB9CiAgICB7IElTT184ODU5LTYtRSBjc0lTTzg4NTk2RSBJU08tODg1OS02LUUgfQogICAgeyBJU09fODg1OS02LUkgY3NJU084ODU5NkkgSVNPLTg4NTktNi1JIH0KICAgIHsgSVNPXzg4NTktNzoxOTg3IGlzby1pci0xMjYgSVNPXzg4NTktNyBJU08tODg1OS03IEVMT1RfOTI4IEVDTUEtMTE4CiAgICAgIGdyZWVrIGdyZWVrOCBjc0lTT0xhdGluR3JlZWsgfQogICAgeyBULjEwMS1HMiBpc28taXItMTI4IGNzSVNPMTI4VDEwMUcyIH0KICAgIHsgSVNPXzg4NTktODoxOTg4IGlzby1pci0xMzggSVNPXzg4NTktOCBJU08tODg1OS04IGhlYnJldwogICAgICBjc0lTT0xhdGluSGVicmV3IH0KICAgIHsgSVNPXzg4NTktOC1FIGNzSVNPODg1OThFIElTTy04ODU5LTgtRSB9CiAgICB7IElTT184ODU5LTgtSSBjc0lTTzg4NTk4SSBJU08tODg1OS04LUkgfQogICAgeyBDU05fMzY5MTAzIGlzby1pci0xMzkgY3NJU08xMzlDU04zNjkxMDMgfQogICAgeyBKVVNfSS5CMS4wMDIgaXNvLWlyLTE0MSBJU082NDYtWVUganMgeXUgY3NJU08xNDFKVVNJQjEwMDIgfQogICAgeyBJU09fNjkzNy0yLWFkZCBpc28taXItMTQyIGNzSVNPVGV4dENvbW0gfQogICAgeyBJRUNfUDI3LTEgaXNvLWlyLTE0MyBjc0lTTzE0M0lFQ1AyNzEgfQogICAgeyBJU09fODg1OS01OjE5ODggaXNvLWlyLTE0NCBJU09fODg1OS01IElTTy04ODU5LTUgY3lyaWxsaWMKICAgICAgY3NJU09MYXRpbkN5cmlsbGljIH0KICAgIHsgSlVTX0kuQjEuMDAzLXNlcmIgaXNvLWlyLTE0NiBzZXJiaWFuIGNzSVNPMTQ2U2VyYmlhbiB9CiAgICB7IEpVU19JLkIxLjAwMy1tYWMgbWFjZWRvbmlhbiBpc28taXItMTQ3IGNzSVNPMTQ3TWFjZWRvbmlhbiB9CiAgICB7IElTT184ODU5LTk6MTk4OSBpc28taXItMTQ4IElTT184ODU5LTkgSVNPLTg4NTktOSBsYXRpbjUgbDUgY3NJU09MYXRpbjUgfQogICAgeyBncmVlay1jY2l0dCBpc28taXItMTUwIGNzSVNPMTUwIGNzSVNPMTUwR3JlZWtDQ0lUVCB9CiAgICB7IE5DX05DMDAtMTA6ODEgY3ViYSBpc28taXItMTUxIElTTzY0Ni1DVSBjc0lTTzE1MUN1YmEgfQogICAgeyBJU09fNjkzNy0yLTI1IGlzby1pci0xNTIgY3NJU082OTM3QWRkIH0KICAgIHsgR09TVF8xOTc2OC03NCBTVF9TRVZfMzU4LTg4IGlzby1pci0xNTMgY3NJU08xNTNHT1NUMTk3Njg3NCB9CiAgICB7IElTT184ODU5LXN1cHAgaXNvLWlyLTE1NCBsYXRpbjEtMi01IGNzSVNPODg1OVN1cHAgfQogICAgeyBJU09fMTAzNjctYm94IGlzby1pci0xNTUgY3NJU08xMDM2N0JveCB9CiAgICB7IElTTy04ODU5LTEwIGlzby1pci0xNTcgbDYgSVNPXzg4NTktMTA6MTk5MiBjc0lTT0xhdGluNiBsYXRpbjYgfQogICAgeyBsYXRpbi1sYXAgbGFwIGlzby1pci0xNTggY3NJU08xNThMYXAgfQogICAgeyBKSVNfWDAyMTItMTk5MCB4MDIxMiBpc28taXItMTU5IGNzSVNPMTU5SklTWDAyMTIxOTkwIH0KICAgIHsgRFNfMjA4OSBEUzIwODkgSVNPNjQ2LURLIGRrIGNzSVNPNjQ2RGFuaXNoIH0KICAgIHsgdXMtZGsgY3NVU0RLIH0KICAgIHsgZGstdXMgY3NES1VTIH0KICAgIHsgSklTX1gwMjAxIFgwMjAxIGNzSGFsZldpZHRoS2F0YWthbmEgfQogICAgeyBLU0M1NjM2IElTTzY0Ni1LUiBjc0tTQzU2MzYgfQogICAgeyBJU08tMTA2NDYtVUNTLTIgY3NVbmljb2RlIH0KICAgIHsgSVNPLTEwNjQ2LVVDUy00IGNzVUNTNCB9CiAgICB7IERFQy1NQ1MgZGVjIGNzREVDTUNTIH0KICAgIHsgaHAtcm9tYW44IHJvbWFuOCByOCBjc0hQUm9tYW44IH0KICAgIHsgbWFjaW50b3NoIG1hYyBjc01hY2ludG9zaCB9CiAgICB7IElCTTAzNyBjcDAzNyBlYmNkaWMtY3AtdXMgZWJjZGljLWNwLWNhIGViY2RpYy1jcC13dCBlYmNkaWMtY3AtbmwKICAgICAgY3NJQk0wMzcgfQogICAgeyBJQk0wMzggRUJDRElDLUlOVCBjcDAzOCBjc0lCTTAzOCB9CiAgICB7IElCTTI3MyBDUDI3MyBjc0lCTTI3MyB9CiAgICB7IElCTTI3NCBFQkNESUMtQkUgQ1AyNzQgY3NJQk0yNzQgfQogICAgeyBJQk0yNzUgRUJDRElDLUJSIGNwMjc1IGNzSUJNMjc1IH0KICAgIHsgSUJNMjc3IEVCQ0RJQy1DUC1ESyBFQkNESUMtQ1AtTk8gY3NJQk0yNzcgfQogICAgeyBJQk0yNzggQ1AyNzggZWJjZGljLWNwLWZpIGViY2RpYy1jcC1zZSBjc0lCTTI3OCB9CiAgICB7IElCTTI4MCBDUDI4MCBlYmNkaWMtY3AtaXQgY3NJQk0yODAgfQogICAgeyBJQk0yODEgRUJDRElDLUpQLUUgY3AyODEgY3NJQk0yODEgfQogICAgeyBJQk0yODQgQ1AyODQgZWJjZGljLWNwLWVzIGNzSUJNMjg0IH0KICAgIHsgSUJNMjg1IENQMjg1IGViY2RpYy1jcC1nYiBjc0lCTTI4NSB9CiAgICB7IElCTTI5MCBjcDI5MCBFQkNESUMtSlAta2FuYSBjc0lCTTI5MCB9CiAgICB7IElCTTI5NyBjcDI5NyBlYmNkaWMtY3AtZnIgY3NJQk0yOTcgfQogICAgeyBJQk00MjAgY3A0MjAgZWJjZGljLWNwLWFyMSBjc0lCTTQyMCB9CiAgICB7IElCTTQyMyBjcDQyMyBlYmNkaWMtY3AtZ3IgY3NJQk00MjMgfQogICAgeyBJQk00MjQgY3A0MjQgZWJjZGljLWNwLWhlIGNzSUJNNDI0IH0KICAgIHsgSUJNNDM3IGNwNDM3IDQzNyBjc1BDOENvZGVQYWdlNDM3IH0KICAgIHsgSUJNNTAwIENQNTAwIGViY2RpYy1jcC1iZSBlYmNkaWMtY3AtY2ggY3NJQk01MDAgfQogICAgeyBJQk03NzUgY3A3NzUgY3NQQzc3NUJhbHRpYyB9CiAgICB7IElCTTg1MCBjcDg1MCA4NTAgY3NQQzg1ME11bHRpbGluZ3VhbCB9CiAgICB7IElCTTg1MSBjcDg1MSA4NTEgY3NJQk04NTEgfQogICAgeyBJQk04NTIgY3A4NTIgODUyIGNzUENwODUyIH0KICAgIHsgSUJNODU1IGNwODU1IDg1NSBjc0lCTTg1NSB9CiAgICB7IElCTTg1NyBjcDg1NyA4NTcgY3NJQk04NTcgfQogICAgeyBJQk04NjAgY3A4NjAgODYwIGNzSUJNODYwIH0KICAgIHsgSUJNODYxIGNwODYxIDg2MSBjcC1pcyBjc0lCTTg2MSB9CiAgICB7IElCTTg2MiBjcDg2MiA4NjIgY3NQQzg2MkxhdGluSGVicmV3IH0KICAgIHsgSUJNODYzIGNwODYzIDg2MyBjc0lCTTg2MyB9CiAgICB7IElCTTg2NCBjcDg2NCBjc0lCTTg2NCB9CiAgICB7IElCTTg2NSBjcDg2NSA4NjUgY3NJQk04NjUgfQogICAgeyBJQk04NjYgY3A4NjYgODY2IGNzSUJNODY2IH0KICAgIHsgSUJNODY4IENQODY4IGNwLWFyIGNzSUJNODY4IH0KICAgIHsgSUJNODY5IGNwODY5IDg2OSBjcC1nciBjc0lCTTg2OSB9CiAgICB7IElCTTg3MCBDUDg3MCBlYmNkaWMtY3Atcm9lY2UgZWJjZGljLWNwLXl1IGNzSUJNODcwIH0KICAgIHsgSUJNODcxIENQODcxIGViY2RpYy1jcC1pcyBjc0lCTTg3MSB9CiAgICB7IElCTTg4MCBjcDg4MCBFQkNESUMtQ3lyaWxsaWMgY3NJQk04ODAgfQogICAgeyBJQk04OTEgY3A4OTEgY3NJQk04OTEgfQogICAgeyBJQk05MDMgY3A5MDMgY3NJQk05MDMgfQogICAgeyBJQk05MDQgY3A5MDQgOTA0IGNzSUJCTTkwNCB9CiAgICB7IElCTTkwNSBDUDkwNSBlYmNkaWMtY3AtdHIgY3NJQk05MDUgfQogICAgeyBJQk05MTggQ1A5MTggZWJjZGljLWNwLWFyMiBjc0lCTTkxOCB9CiAgICB7IElCTTEwMjYgQ1AxMDI2IGNzSUJNMTAyNiB9CiAgICB7IEVCQ0RJQy1BVC1ERSBjc0lCTUVCQ0RJQ0FUREUgfQogICAgeyBFQkNESUMtQVQtREUtQSBjc0VCQ0RJQ0FUREVBIH0KICAgIHsgRUJDRElDLUNBLUZSIGNzRUJDRElDQ0FGUiB9CiAgICB7IEVCQ0RJQy1ESy1OTyBjc0VCQ0RJQ0RLTk8gfQogICAgeyBFQkNESUMtREstTk8tQSBjc0VCQ0RJQ0RLTk9BIH0KICAgIHsgRUJDRElDLUZJLVNFIGNzRUJDRElDRklTRSB9CiAgICB7IEVCQ0RJQy1GSS1TRS1BIGNzRUJDRElDRklTRUEgfQogICAgeyBFQkNESUMtRlIgY3NFQkNESUNGUiB9CiAgICB7IEVCQ0RJQy1JVCBjc0VCQ0RJQ0lUIH0KICAgIHsgRUJDRElDLVBUIGNzRUJDRElDUFQgfQogICAgeyBFQkNESUMtRVMgY3NFQkNESUNFUyB9CiAgICB7IEVCQ0RJQy1FUy1BIGNzRUJDRElDRVNBIH0KICAgIHsgRUJDRElDLUVTLVMgY3NFQkNESUNFU1MgfQogICAgeyBFQkNESUMtVUsgY3NFQkNESUNVSyB9CiAgICB7IEVCQ0RJQy1VUyBjc0VCQ0RJQ1VTIH0KICAgIHsgVU5LTk9XTi04QklUIGNzVW5rbm93bjhCaVQgfQogICAgeyBNTkVNT05JQyBjc01uZW1vbmljIH0KICAgIHsgTU5FTSBjc01uZW0gfQogICAgeyBWSVNDSUkgY3NWSVNDSUkgfQogICAgeyBWSVFSIGNzVklRUiB9CiAgICB7IEtPSTgtUiBjc0tPSThSIH0KICAgIHsgSUJNMDA4NTggQ0NTSUQwMDg1OCBDUDAwODU4IFBDLU11bHRpbGluZ3VhbC04NTArZXVybyB9CiAgICB7IElCTTAwOTI0IENDU0lEMDA5MjQgQ1AwMDkyNCBlYmNkaWMtTGF0aW45LS1ldXJvIH0KICAgIHsgSUJNMDExNDAgQ0NTSUQwMTE0MCBDUDAxMTQwIGViY2RpYy11cy0zNytldXJvIH0KICAgIHsgSUJNMDExNDEgQ0NTSUQwMTE0MSBDUDAxMTQxIGViY2RpYy1kZS0yNzMrZXVybyB9CiAgICB7IElCTTAxMTQyIENDU0lEMDExNDIgQ1AwMTE0MiBlYmNkaWMtZGstMjc3K2V1cm8gZWJjZGljLW5vLTI3NytldXJvIH0KICAgIHsgSUJNMDExNDMgQ0NTSUQwMTE0MyBDUDAxMTQzIGViY2RpYy1maS0yNzgrZXVybyBlYmNkaWMtc2UtMjc4K2V1cm8gfQogICAgeyBJQk0wMTE0NCBDQ1NJRDAxMTQ0IENQMDExNDQgZWJjZGljLWl0LTI4MCtldXJvIH0KICAgIHsgSUJNMDExNDUgQ0NTSUQwMTE0NSBDUDAxMTQ1IGViY2RpYy1lcy0yODQrZXVybyB9CiAgICB7IElCTTAxMTQ2IENDU0lEMDExNDYgQ1AwMTE0NiBlYmNkaWMtZ2ItMjg1K2V1cm8gfQogICAgeyBJQk0wMTE0NyBDQ1NJRDAxMTQ3IENQMDExNDcgZWJjZGljLWZyLTI5NytldXJvIH0KICAgIHsgSUJNMDExNDggQ0NTSUQwMTE0OCBDUDAxMTQ4IGViY2RpYy1pbnRlcm5hdGlvbmFsLTUwMCtldXJvIH0KICAgIHsgSUJNMDExNDkgQ0NTSUQwMTE0OSBDUDAxMTQ5IGViY2RpYy1pcy04NzErZXVybyB9CiAgICB7IElCTTEwNDcgSUJNLTEwNDcgfQogICAgeyBQVENQMTU0IGNzUFRDUDE1NCBQVDE1NCBDUDE1NCBDeXJpbGxpYy1Bc2lhbiB9CiAgICB7IEFtaWdhLTEyNTEgQW1pMTI1MSBBbWlnYTEyNTEgQW1pLTEyNTEgfQogICAgeyBVTklDT0RFLTEtMSBjc1VuaWNvZGUxMSB9CiAgICB7IENFU1UtOCBjc0NFU1UtOCB9CiAgICB7IEJPQ1UtMSBjc0JPQ1UtMSB9CiAgICB7IFVOSUNPREUtMS0xLVVURi03IGNzVW5pY29kZTExVVRGNyB9CiAgICB7IElTTy04ODU5LTE0IGlzby1pci0xOTkgSVNPXzg4NTktMTQ6MTk5OCBJU09fODg1OS0xNCBsYXRpbjggaXNvLWNlbHRpYwogICAgICBsOCB9CiAgICB7IElTTy04ODU5LTE1IElTT184ODU5LTE1IExhdGluLTkgfQogICAgeyBJU08tODg1OS0xNiBpc28taXItMjI2IElTT184ODU5LTE2OjIwMDEgSVNPXzg4NTktMTYgbGF0aW4xMCBsMTAgfQogICAgeyBHQksgQ1A5MzYgTVM5MzYgd2luZG93cy05MzYgfQogICAgeyBKSVNfRW5jb2RpbmcgY3NKSVNFbmNvZGluZyB9CiAgICB7IFNoaWZ0X0pJUyBNU19LYW5qaSBjc1NoaWZ0SklTIH0KICAgIHsgRXh0ZW5kZWRfVU5JWF9Db2RlX1BhY2tlZF9Gb3JtYXRfZm9yX0phcGFuZXNlIGNzRVVDUGtkRm10SmFwYW5lc2UKICAgICAgRVVDLUpQIH0KICAgIHsgRXh0ZW5kZWRfVU5JWF9Db2RlX0ZpeGVkX1dpZHRoX2Zvcl9KYXBhbmVzZSBjc0VVQ0ZpeFdpZEphcGFuZXNlIH0KICAgIHsgSVNPLTEwNjQ2LVVDUy1CYXNpYyBjc1VuaWNvZGVBU0NJSSB9CiAgICB7IElTTy0xMDY0Ni1Vbmljb2RlLUxhdGluMSBjc1VuaWNvZGVMYXRpbjEgSVNPLTEwNjQ2IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjEgY3NVbmljb2RlSUJNMTI2MSB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY4IGNzVW5pY29kZUlCTTEyNjggfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI3NiBjc1VuaWNvZGVJQk0xMjc2IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjQgY3NVbmljb2RlSUJNMTI2NCB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY1IGNzVW5pY29kZUlCTTEyNjUgfQogICAgeyBJU08tODg1OS0xLVdpbmRvd3MtMy4wLUxhdGluLTEgY3NXaW5kb3dzMzBMYXRpbjEgfQogICAgeyBJU08tODg1OS0xLVdpbmRvd3MtMy4xLUxhdGluLTEgY3NXaW5kb3dzMzFMYXRpbjEgfQogICAgeyBJU08tODg1OS0yLVdpbmRvd3MtTGF0aW4tMiBjc1dpbmRvd3MzMUxhdGluMiB9CiAgICB7IElTTy04ODU5LTktV2luZG93cy1MYXRpbi01IGNzV2luZG93czMxTGF0aW41IH0KICAgIHsgQWRvYmUtU3RhbmRhcmQtRW5jb2RpbmcgY3NBZG9iZVN0YW5kYXJkRW5jb2RpbmcgfQogICAgeyBWZW50dXJhLVVTIGNzVmVudHVyYVVTIH0KICAgIHsgVmVudHVyYS1JbnRlcm5hdGlvbmFsIGNzVmVudHVyYUludGVybmF0aW9uYWwgfQogICAgeyBQQzgtRGFuaXNoLU5vcndlZ2lhbiBjc1BDOERhbmlzaE5vcndlZ2lhbiB9CiAgICB7IFBDOC1UdXJraXNoIGNzUEM4VHVya2lzaCB9CiAgICB7IElCTS1TeW1ib2xzIGNzSUJNU3ltYm9scyB9CiAgICB7IElCTS1UaGFpIGNzSUJNVGhhaSB9CiAgICB7IEhQLUxlZ2FsIGNzSFBMZWdhbCB9CiAgICB7IEhQLVBpLWZvbnQgY3NIUFBpRm9udCB9CiAgICB7IEhQLU1hdGg4IGNzSFBNYXRoOCB9CiAgICB7IEFkb2JlLVN5bWJvbC1FbmNvZGluZyBjc0hQUFNNYXRoIH0KICAgIHsgSFAtRGVza1RvcCBjc0hQRGVza3RvcCB9CiAgICB7IFZlbnR1cmEtTWF0aCBjc1ZlbnR1cmFNYXRoIH0KICAgIHsgTWljcm9zb2Z0LVB1Ymxpc2hpbmcgY3NNaWNyb3NvZnRQdWJsaXNoaW5nIH0KICAgIHsgV2luZG93cy0zMUogY3NXaW5kb3dzMzFKIH0KICAgIHsgR0IyMzEyIGNzR0IyMzEyIH0KICAgIHsgQmlnNSBjc0JpZzUgfQp9Cgpwcm9jIHRjbF9lbmNvZGluZyB7ZW5jfSB7CiAgICBnbG9iYWwgZW5jb2RpbmdfYWxpYXNlcwogICAgc2V0IG5hbWVzIFtlbmNvZGluZyBuYW1lc10KICAgIHNldCBsY25hbWVzIFtzdHJpbmcgdG9sb3dlciAkbmFtZXNdCiAgICBzZXQgZW5jIFtzdHJpbmcgdG9sb3dlciAkZW5jXQogICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlbmNdCiAgICBpZiB7JGkgPCAwfSB7CgkjIGxvb2sgZm9yICJpc29ubm4iIGluc3RlYWQgb2YgImlzby1ubm4iIG9yICJpc29fbm5uIgoJaWYge1tyZWdzdWIge15pc29bLV9dfSAkZW5jIGlzbyBlbmN4XX0gewoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZW5jeF0KCX0KICAgIH0KICAgIGlmIHskaSA8IDB9IHsKCWZvcmVhY2ggbCAkZW5jb2RpbmdfYWxpYXNlcyB7CgkgICAgc2V0IGxsIFtzdHJpbmcgdG9sb3dlciAkbF0KCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRsbCAkZW5jXSA8IDB9IGNvbnRpbnVlCgkgICAgIyBsb29rIHRocm91Z2ggdGhlIGFsaWFzZXMgZm9yIG9uZSB0aGF0IHRjbCBrbm93cyBhYm91dAoJICAgIGZvcmVhY2ggZSAkbGwgewoJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZV0KCQlpZiB7JGkgPCAwfSB7CgkJICAgIGlmIHtbcmVnc3ViIHteaXNvWy1fXX0gJGUgaXNvIGV4XX0gewoJCQlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGV4XQoJCSAgICB9CgkJfQoJCWlmIHskaSA+PSAwfSBicmVhawoJICAgIH0KCSAgICBicmVhawoJfQogICAgfQogICAgaWYgeyRpID49IDB9IHsKCXJldHVybiBbbGluZGV4ICRuYW1lcyAkaV0KICAgIH0KICAgIHJldHVybiB7fQp9CgojIGRlZmF1bHRzLi4uCnNldCBkYXRlbW9kZSAwCnNldCBkaWZmb3B0cyAiLVUgNSAtcCIKc2V0IHdyY29tY21kICJnaXQtZGlmZi10cmVlIC0tc3RkaW4gLXAgLS1wcmV0dHkiCgpzZXQgZ2l0ZW5jb2Rpbmcge30KY2F0Y2ggewogICAgc2V0IGdpdGVuY29kaW5nIFtleGVjIGdpdC1yZXBvLWNvbmZpZyAtLWdldCBpMThuLmNvbW1pdGVuY29kaW5nXQp9CmlmIHskZ2l0ZW5jb2RpbmcgPT0gIiJ9IHsKICAgIHNldCBnaXRlbmNvZGluZyAidXRmLTgiCn0Kc2V0IHRjbGVuY29kaW5nIFt0Y2xfZW5jb2RpbmcgJGdpdGVuY29kaW5nXQppZiB7JHRjbGVuY29kaW5nID09IHt9fSB7CiAgICBwdXRzIHN0ZGVyciAiV2FybmluZzogZW5jb2RpbmcgJGdpdGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgVGNsL1RrIgp9CgpzZXQgbWFpbmZvbnQge0hlbHZldGljYSA5fQpzZXQgdGV4dGZvbnQge0NvdXJpZXIgOX0Kc2V0IGZpbmRtZXJnZWZpbGVzIDAKc2V0IG1heGdyYXBocGN0IDUwCnNldCBtYXh3aWR0aCAxNgpzZXQgcmV2bGlzdG9yZGVyIDAKc2V0IGZhc3RkYXRlIDAKc2V0IHVwYXJyb3dsZW4gNwpzZXQgZG93bmFycm93bGVuIDcKc2V0IG1pbmdhcGxlbiAzMAoKc2V0IGNvbG9ycyB7Z3JlZW4gcmVkIGJsdWUgbWFnZW50YSBkYXJrZ3JleSBicm93biBvcmFuZ2V9CgpjYXRjaCB7c291cmNlIH4vLmdpdGt9CgpzZXQgbmFtZWZvbnQgJG1haW5mb250Cgpmb250IGNyZWF0ZSBvcHRpb25mb250IC1mYW1pbHkgc2Fucy1zZXJpZiAtc2l6ZSAtMTIKCnNldCByZXZ0cmVlYXJncyB7fQpmb3JlYWNoIGFyZyAkYXJndiB7CiAgICBzd2l0Y2ggLXJlZ2V4cCAtLSAkYXJnIHsKCSJeJCIgeyB9CgkiXi1kIiB7IHNldCBkYXRlbW9kZSAxIH0KCWRlZmF1bHQgewoJICAgIGxhcHBlbmQgcmV2dHJlZWFyZ3MgJGFyZwoJfQogICAgfQp9CgojIGNoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYSAuZ2l0IGRpcmVjdG9yeSBzb21ld2hlcmUuLi4Kc2V0IGdpdGRpciBbZ2l0ZGlyXQppZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRnaXRkaXJdfSB7CiAgICBlcnJvcl9wb3B1cCAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3RvcnkgXCIkZ2l0ZGlyXCIuIgogICAgZXhpdCAxCn0KCnNldCBoaXN0b3J5IHt9CnNldCBoaXN0b3J5aW5kZXggMAoKc2V0IG9wdGltX2RlbGF5IDE2CgpzZXQgc3RvcHBlZCAwCnNldCBzdHVmZnNhdmVkIDAKc2V0IHBhdGNobnVtIDAKc2V0Y29vcmRzCm1ha2V3aW5kb3cgJHJldnRyZWVhcmdzCnJlYWRyZWZzCmdldGNvbW1pdHMgJHJldnRyZWVhcmdzCg==