IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkezErJEB9IgoKIyBDb3B5cmlnaHQgKEMpIDIwMDUgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdpdGRpciB7fSB7CiAgICBnbG9iYWwgZW52CiAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCXJldHVybiAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJcmV0dXJuICIuZ2l0IgogICAgfQp9Cgpwcm9jIGdldGNvbW1pdHMge3JhcmdzfSB7CiAgICBnbG9iYWwgY29tbWl0cyBjb21tZmQgcGhhc2UgY2FudiBtYWluZm9udCBlbnYKICAgIGdsb2JhbCBzdGFydG1zZWNzIG5leHR1cGRhdGUgbmNtdXBkYXRlCiAgICBnbG9iYWwgY3RleHQgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGxlZnRvdmVyCgogICAgIyBjaGVjayB0aGF0IHdlIGNhbiBmaW5kIGEgLmdpdCBkaXJlY3Rvcnkgc29tZXdoZXJlLi4uCiAgICBzZXQgZ2l0ZGlyIFtnaXRkaXJdCiAgICBpZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRnaXRkaXJdfSB7CgllcnJvcl9wb3B1cCAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3RvcnkgXCIkZ2l0ZGlyXCIuIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgY29tbWl0cyB7fQogICAgc2V0IHBoYXNlIGdldGNvbW1pdHMKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByICRzdGFydG1zZWNzICsgMTAwXQogICAgc2V0IG5jbXVwZGF0ZSAxCiAgICBpZiBbY2F0Y2ggewoJc2V0IHBhcnNlX2FyZ3MgW2NvbmNhdCAtLWRlZmF1bHQgSEVBRCAkcmFyZ3NdCglzZXQgcGFyc2VkX2FyZ3MgW3NwbGl0IFtldmFsIGV4ZWMgZ2l0LXJldi1wYXJzZSAkcGFyc2VfYXJnc10gIlxuIl0KICAgIH1dIHsKCSMgaWYgZ2l0LXJldi1wYXJzZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLi4uCglpZiB7JHJhcmdzID09IHt9fSB7CgkgICAgc2V0IHJhcmdzIEhFQUQKCX0KCXNldCBwYXJzZWRfYXJncyAkcmFyZ3MKICAgIH0KICAgIGlmIFtjYXRjaCB7CglzZXQgY29tbWZkIFtvcGVuICJ8Z2l0LXJldi1saXN0IC0taGVhZGVyIC0tdG9wby1vcmRlciAtLXBhcmVudHMgJHBhcnNlZF9hcmdzIiByXQogICAgfSBlcnJdIHsKCXB1dHMgc3RkZXJyICJFcnJvciBleGVjdXRpbmcgZ2l0LXJldi1saXN0OiAkZXJyIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgbGVmdG92ZXIge30KICAgIGZjb25maWd1cmUgJGNvbW1mZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYKICAgIGZpbGVldmVudCAkY29tbWZkIHJlYWRhYmxlIFtsaXN0IGdldGNvbW1pdGxpbmVzICRjb21tZmRdCiAgICAkY2FudiBkZWxldGUgYWxsCiAgICAkY2FudiBjcmVhdGUgdGV4dCAzIDMgLWFuY2hvciBudyAtdGV4dCAiUmVhZGluZyBjb21taXRzLi4uIiBcCgktZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGV4dGl0ZW1zCiAgICAuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCiAgICBzZXR0ZXh0Y3Vyc29yIHdhdGNoCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2NvbW1mZH0gIHsKICAgIGdsb2JhbCBjb21taXRzIHBhcmVudHMgY2RhdGUgY2hpbGRyZW4KICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgcGhhc2UgY29tbWl0aW5mbyBuZXh0dXBkYXRlCiAgICBnbG9iYWwgc3RvcHBlZCByZWRpc3BsYXlpbmcgbGVmdG92ZXIKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGNvbW1mZF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkY29tbWZkXX0gcmV0dXJuCgkjIHNldCBpdCBibG9ja2luZyBzbyB3ZSB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byB0ZXJtaW5hdGUKCWZjb25maWd1cmUgJGNvbW1mZCAtYmxvY2tpbmcgMQoJaWYgeyFbY2F0Y2gge2Nsb3NlICRjb21tZmR9IGVycl19IHsKCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKCSAgICByZXR1cm4KCX0KCWlmIHtbc3RyaW5nIHJhbmdlICRlcnIgMCA0XSA9PSAidXNhZ2UifSB7CgkgICAgc2V0IGVyciBcCntHaXRrOiBlcnJvciByZWFkaW5nIGNvbW1pdHM6IGJhZCBhcmd1bWVudHMgdG8gZ2l0LXJldi1saXN0LgooTm90ZTogYXJndW1lbnRzIHRvIGdpdGsgYXJlIHBhc3NlZCB0byBnaXQtcmV2LWxpc3QKdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGNvbW1pdHMgdG8gYmUgZGlzcGxheWVkLil9Cgl9IGVsc2UgewoJICAgIHNldCBlcnIgIkVycm9yIHJlYWRpbmcgY29tbWl0czogJGVyciIKCX0KCWVycm9yX3BvcHVwICRlcnIKCWV4aXQgMQogICAgfQogICAgc2V0IHN0YXJ0IDAKICAgIHdoaWxlIDEgewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXDAiICRzdHVmZiAkc3RhcnRdCglpZiB7JGkgPCAwfSB7CgkgICAgYXBwZW5kIGxlZnRvdmVyIFtzdHJpbmcgcmFuZ2UgJHN0dWZmICRzdGFydCBlbmRdCgkgICAgcmV0dXJuCgl9CglzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQoJaWYgeyRzdGFydCA9PSAwfSB7CgkgICAgc2V0IGNtaXQgIiRsZWZ0b3ZlciRjbWl0IgoJICAgIHNldCBsZWZ0b3ZlciB7fQoJfQoJc2V0IHN0YXJ0IFtleHByIHskaSArIDF9XQoJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQoJc2V0IG9rIDAKCWlmIHskaiA+PSAwfSB7CgkgICAgc2V0IGlkcyBbc3RyaW5nIHJhbmdlICRjbWl0IDAgW2V4cHIgeyRqIC0gMX1dXQoJICAgIHNldCBvayAxCgkgICAgZm9yZWFjaCBpZCAkaWRzIHsKCQlpZiB7IVtyZWdleHAge15bMC05YS1mXXs0MH0kfSAkaWRdfSB7CgkJICAgIHNldCBvayAwCgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCX0KCWlmIHshJG9rfSB7CgkgICAgc2V0IHNob3J0Y21pdCAkY21pdAoJICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hvcnRjbWl0XSA+IDgwfSB7CgkJc2V0IHNob3J0Y21pdCAiW3N0cmluZyByYW5nZSAkc2hvcnRjbWl0IDAgODBdLi4uIgoJICAgIH0KCSAgICBlcnJvcl9wb3B1cCAiQ2FuJ3QgcGFyc2UgZ2l0LXJldi1saXN0IG91dHB1dDogeyRzaG9ydGNtaXR9IgoJICAgIGV4aXQgMQoJfQoJc2V0IGlkIFtsaW5kZXggJGlkcyAwXQoJc2V0IG9sZHMgW2xyYW5nZSAkaWRzIDEgZW5kXQoJc2V0IGNtaXQgW3N0cmluZyByYW5nZSAkY21pdCBbZXhwciB7JGogKyAxfV0gZW5kXQoJbGFwcGVuZCBjb21taXRzICRpZAoJc2V0IGNvbW1pdGxpc3RlZCgkaWQpIDEKCXBhcnNlY29tbWl0ICRpZCAkY21pdCAxIFtscmFuZ2UgJGlkcyAxIGVuZF0KCWRyYXdjb21taXQgJGlkCglpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJICAgIGRvdXBkYXRlIDEKCX0KCXdoaWxlIHskcmVkaXNwbGF5aW5nfSB7CgkgICAgc2V0IHJlZGlzcGxheWluZyAwCgkgICAgaWYgeyRzdG9wcGVkID09IDF9IHsKCQlzZXQgc3RvcHBlZCAwCgkJc2V0IHBoYXNlICJnZXRjb21taXRzIgoJCWZvcmVhY2ggaWQgJGNvbW1pdHMgewoJCSAgICBkcmF3Y29tbWl0ICRpZAoJCSAgICBpZiB7JHN0b3BwZWR9IGJyZWFrCgkJICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CgkJCWRvdXBkYXRlIDEKCQkgICAgfQoJCX0KCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZG91cGRhdGUge3JlYWRpbmd9IHsKICAgIGdsb2JhbCBjb21tZmQgbmV4dHVwZGF0ZSBudW1jb21taXRzIG5jbXVwZGF0ZQoKICAgIGlmIHskcmVhZGluZ30gewoJZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUge30KICAgIH0KICAgIHVwZGF0ZQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQogICAgaWYgeyRudW1jb21taXRzIDwgMTAwfSB7CglzZXQgbmNtdXBkYXRlIFtleHByIHskbnVtY29tbWl0cyArIDF9XQogICAgfSBlbHNlaWYgeyRudW1jb21taXRzIDwgMTAwMDB9IHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMTB9XQogICAgfSBlbHNlIHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMTAwfV0KICAgIH0KICAgIGlmIHskcmVhZGluZ30gewoJZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUgW2xpc3QgZ2V0Y29tbWl0bGluZXMgJGNvbW1mZF0KICAgIH0KfQoKcHJvYyByZWFkY29tbWl0IHtpZH0gewogICAgaWYgW2NhdGNoIHtzZXQgY29udGVudHMgW2V4ZWMgZ2l0LWNhdC1maWxlIGNvbW1pdCAkaWRdfV0gcmV0dXJuCiAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAge30KfQoKcHJvYyBwYXJzZWNvbW1pdCB7aWQgY29udGVudHMgbGlzdGVkIG9sZHN9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvIGNoaWxkcmVuIG5jaGlsZHJlbiBwYXJlbnRzIG5wYXJlbnRzIGNkYXRlIG5jbGVmdAoKICAgIHNldCBpbmhkciAxCiAgICBzZXQgY29tbWVudCB7fQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICBzZXQgYXVuYW1lIHt9CiAgICBzZXQgYXVkYXRlIHt9CiAgICBzZXQgY29tbmFtZSB7fQogICAgc2V0IGNvbWRhdGUge30KICAgIGlmIHshW2luZm8gZXhpc3RzIG5jaGlsZHJlbigkaWQpXX0gewoJc2V0IGNoaWxkcmVuKCRpZCkge30KCXNldCBuY2hpbGRyZW4oJGlkKSAwCglzZXQgbmNsZWZ0KCRpZCkgMAogICAgfQogICAgc2V0IHBhcmVudHMoJGlkKSAkb2xkcwogICAgc2V0IG5wYXJlbnRzKCRpZCkgW2xsZW5ndGggJG9sZHNdCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRwKV19IHsKCSAgICBzZXQgY2hpbGRyZW4oJHApIFtsaXN0ICRpZF0KCSAgICBzZXQgbmNoaWxkcmVuKCRwKSAxCgkgICAgc2V0IG5jbGVmdCgkcCkgMQoJfSBlbHNlaWYge1tsc2VhcmNoIC1leGFjdCAkY2hpbGRyZW4oJHApICRpZF0gPCAwfSB7CgkgICAgbGFwcGVuZCBjaGlsZHJlbigkcCkgJGlkCgkgICAgaW5jciBuY2hpbGRyZW4oJHApCgkgICAgaW5jciBuY2xlZnQoJHApCgl9CiAgICB9CiAgICBmb3JlYWNoIGxpbmUgW3NwbGl0ICRjb250ZW50cyAiXG4iXSB7CglpZiB7JGluaGRyfSB7CgkgICAgaWYgeyRsaW5lID09IHt9fSB7CgkJc2V0IGluaGRyIDAKCSAgICB9IGVsc2UgewoJCXNldCB0YWcgW2xpbmRleCAkbGluZSAwXQoJCWlmIHskdGFnID09ICJhdXRob3IifSB7CgkJICAgIHNldCB4IFtleHByIHtbbGxlbmd0aCAkbGluZV0gLSAyfV0KCQkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lICR4XQoJCSAgICBzZXQgYXVuYW1lIFtscmFuZ2UgJGxpbmUgMSBbZXhwciB7JHggLSAxfV1dCgkJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCQkgICAgc2V0IHggW2V4cHIge1tsbGVuZ3RoICRsaW5lXSAtIDJ9XQoJCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lICR4XQoJCSAgICBzZXQgY29tbmFtZSBbbHJhbmdlICRsaW5lIDEgW2V4cHIgeyR4IC0gMX1dXQoJCX0KCSAgICB9Cgl9IGVsc2UgewoJICAgIGlmIHskY29tbWVudCA9PSB7fX0gewoJCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCgkgICAgfSBlbHNlIHsKCQlhcHBlbmQgY29tbWVudCAiXG4iCgkgICAgfQoJICAgIGlmIHshJGxpc3RlZH0gewoJCSMgZ2l0LXJldi1saXN0IGluZGVudHMgdGhlIGNvbW1lbnQgYnkgNCBzcGFjZXM7CgkJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0LWNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCgkJYXBwZW5kIGNvbW1lbnQgIiAgICAiCgkgICAgfQoJICAgIGFwcGVuZCBjb21tZW50ICRsaW5lCgl9CiAgICB9CiAgICBpZiB7JGF1ZGF0ZSAhPSB7fX0gewoJc2V0IGF1ZGF0ZSBbY2xvY2sgZm9ybWF0ICRhdWRhdGUgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQogICAgfQogICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CglzZXQgY2RhdGUoJGlkKSAkY29tZGF0ZQoJc2V0IGNvbWRhdGUgW2Nsb2NrIGZvcm1hdCAkY29tZGF0ZSAtZm9ybWF0ICIlWS0lbS0lZCAlSDolTTolUyJdCiAgICB9CiAgICBzZXQgY29tbWl0aW5mbygkaWQpIFtsaXN0ICRoZWFkbGluZSAkYXVuYW1lICRhdWRhdGUgXAoJCQkgICAgICRjb21uYW1lICRjb21kYXRlICRjb21tZW50XQp9Cgpwcm9jIHJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCB0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyB0YWdjb250ZW50cwoKICAgIHNldCB0YWdzIFtnbG9iIC1ub2NvbXBsYWluIC10eXBlcyBmIFtnaXRkaXJdL3JlZnMvdGFncy8qXQogICAgZm9yZWFjaCBmICR0YWdzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmRdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBkaXJlY3QgW2ZpbGUgdGFpbCAkZl0KCQlzZXQgdGFnaWRzKCRkaXJlY3QpICRpZAoJCWxhcHBlbmQgaWR0YWdzKCRpZCkgJGRpcmVjdAoJCXNldCB0YWdibG9iIFtleGVjIGdpdC1jYXQtZmlsZSB0YWcgJGlkXQoJCXNldCBjb250ZW50cyBbc3BsaXQgJHRhZ2Jsb2IgIlxuIl0KCQlzZXQgb2JqIHt9CgkJc2V0IHR5cGUge30KCQlzZXQgdGFnIHt9CgkJZm9yZWFjaCBsICRjb250ZW50cyB7CgkJICAgIGlmIHskbCA9PSB7fX0gYnJlYWsKCQkgICAgc3dpdGNoIC0tIFtsaW5kZXggJGwgMF0gewoJCQkib2JqZWN0IiB7c2V0IG9iaiBbbGluZGV4ICRsIDFdfQoJCQkidHlwZSIge3NldCB0eXBlIFtsaW5kZXggJGwgMV19CgkJCSJ0YWciIHtzZXQgdGFnIFtzdHJpbmcgcmFuZ2UgJGwgNCBlbmRdfQoJCSAgICB9CgkJfQoJCWlmIHskb2JqICE9IHt9ICYmICR0eXBlID09ICJjb21taXQiICYmICR0YWcgIT0ge319IHsKCQkgICAgc2V0IHRhZ2lkcygkdGFnKSAkb2JqCgkJICAgIGxhcHBlbmQgaWR0YWdzKCRvYmopICR0YWcKCQkgICAgc2V0IHRhZ2NvbnRlbnRzKCR0YWcpICR0YWdibG9iCgkJfQoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KICAgIHNldCBoZWFkcyBbZ2xvYiAtbm9jb21wbGFpbiAtdHlwZXMgZiBbZ2l0ZGlyXS9yZWZzL2hlYWRzLypdCiAgICBmb3JlYWNoIGYgJGhlYWRzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmQgNDBdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBoZWFkIFtmaWxlIHRhaWwgJGZdCgkJc2V0IGhlYWRpZHMoJGhlYWQpICRsaW5lCgkJbGFwcGVuZCBpZGhlYWRzKCRsaW5lKSAkaGVhZAoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KICAgIHJlYWRvdGhlcnJlZnMgcmVmcyB7fSB7dGFncyBoZWFkc30KfQoKcHJvYyByZWFkb3RoZXJyZWZzIHtiYXNlIGRuYW1lIGV4Y2x9IHsKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcwoKICAgIHNldCBnaXQgW2dpdGRpcl0KICAgIHNldCBmaWxlcyBbZ2xvYiAtbm9jb21wbGFpbiAtdHlwZXMgZiBbZmlsZSBqb2luICRnaXQgJGJhc2UgKl1dCiAgICBmb3JlYWNoIGYgJGZpbGVzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmQgNDBdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBuYW1lICIkZG5hbWVbZmlsZSB0YWlsICRmXSIKCQlzZXQgb3RoZXJyZWZpZHMoJG5hbWUpICRpZAoJCWxhcHBlbmQgaWRvdGhlcnJlZnMoJGlkKSAkbmFtZQoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KICAgIHNldCBkaXJzIFtnbG9iIC1ub2NvbXBsYWluIC10eXBlcyBkIFtmaWxlIGpvaW4gJGdpdCAkYmFzZSAqXV0KICAgIGZvcmVhY2ggZCAkZGlycyB7CglzZXQgZGlyIFtmaWxlIHRhaWwgJGRdCglpZiB7W2xzZWFyY2ggLWV4YWN0ICRleGNsICRkaXJdID49IDB9IGNvbnRpbnVlCglyZWFkb3RoZXJyZWZzIFtmaWxlIGpvaW4gJGJhc2UgJGRpcl0gIiRkbmFtZSRkaXIvIiB7fQogICAgfQp9Cgpwcm9jIGVycm9yX3BvcHVwIG1zZyB7CiAgICBzZXQgdyAuZXJyb3IKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKICAgIHRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBtYWtld2luZG93IHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGxpbmVzcGMgY2hhcnNwYyBjdGV4dCBjZmxpc3QgdGV4dGZvbnQKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kdHlwZW1lbnUgZmluZGxvYyBmaW5kc3RyaW5nIGZzdHJpbmcgZ2VvbWV0cnkKICAgIGdsb2JhbCBlbnRyaWVzIHNoYTFlbnRyeSBzaGExc3RyaW5nIHNoYTFidXQKICAgIGdsb2JhbCBtYWluY3Vyc29yIHRleHRjdXJzb3IgY3VydGV4dGN1cnNvcgogICAgZ2xvYmFsIHJvd2N0eG1lbnUgZ2F1ZHlkaWZmIG1lcmdlbWF4CgogICAgbWVudSAuYmFyCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRmlsZSIgLW1lbnUgLmJhci5maWxlCiAgICBtZW51IC5iYXIuZmlsZQogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUmVyZWFkIHJlZmVyZW5jZXMiIC1jb21tYW5kIHJlcmVhZHJlZnMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlF1aXQiIC1jb21tYW5kIGRvcXVpdAogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciA0NSAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnYyKSBbZXhwciAzMCAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciAxNSAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciAyNSAqICRsaW5lc3BjICsgNF0KCXNldCBnZW9tZXRyeShjdGV4dHcpIDgwCglzZXQgZ2VvbWV0cnkoY3RleHRoKSAzMAoJc2V0IGdlb21ldHJ5KGNmbGlzdHcpIDMwCiAgICB9CiAgICBwYW5lZHdpbmRvdyAuY3RvcCAtb3JpZW50IHZlcnRpY2FsCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KHdpZHRoKV19IHsKCS5jdG9wIGNvbmYgLXdpZHRoICRnZW9tZXRyeSh3aWR0aCkgLWhlaWdodCAkZ2VvbWV0cnkoaGVpZ2h0KQoJc2V0IHRleHRoIFtleHByIHskZ2VvbWV0cnkoaGVpZ2h0KSAtICRnZW9tZXRyeShjYW52aCkgLSA1Nn1dCglzZXQgZ2VvbWV0cnkoY3RleHRoKSBbZXhwciB7KCR0ZXh0aCAtIDgpIC8KCQkJCSAgICBbZm9udCBtZXRyaWNzICR0ZXh0Zm9udCAtbGluZXNwYWNlXX1dCiAgICB9CiAgICBmcmFtZSAuY3RvcC50b3AKICAgIGZyYW1lIC5jdG9wLnRvcC5iYXIKICAgIHBhY2sgLmN0b3AudG9wLmJhciAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgc2V0IGNzY3JvbGwgLmN0b3AudG9wLmNzYgogICAgc2Nyb2xsYmFyICRjc2Nyb2xsIC1jb21tYW5kIHthbGxjYW52cyB5dmlld30gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCiAgICBwYWNrICRjc2Nyb2xsIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhbmVkd2luZG93IC5jdG9wLnRvcC5jbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CiAgICBwYWNrIC5jdG9wLnRvcC5jbGlzdCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wIGFkZCAuY3RvcC50b3AKICAgIHNldCBjYW52IC5jdG9wLnRvcC5jbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjEpIFwKCS1iZyB3aGl0ZSAtYmQgMCBcCgkteXNjcm9sbGluY3IgJGxpbmVzcGMgLXlzY3JvbGxjb21tYW5kICIkY3Njcm9sbCBzZXQiCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52CiAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCiAgICBjYW52YXMgJGNhbnYyIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYyKSBcCgktYmcgd2hpdGUgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC5jdG9wLnRvcC5jbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MykgXAoJLWJnIHdoaXRlIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYwogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudjMKICAgIGJpbmQgLmN0b3AudG9wLmNsaXN0IDxDb25maWd1cmU+IHtyZXNpemVjbGlzdHBhbmVzICVXICV3fQoKICAgIHNldCBzaGExZW50cnkgLmN0b3AudG9wLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOAogICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQogICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CiAgICBlbnRyeSAkc2hhMWVudHJ5IC13aWR0aCA0MCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzaGExc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCiAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCgogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1sZWZ0IC1kYXRhIHsKCSNkZWZpbmUgbGVmdF93aWR0aCAxNgoJI2RlZmluZSBsZWZ0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVmdF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAwLCAweDcwLCAweDAwLCAweDM4LCAweDAwLCAweDFjLCAweDAwLAoJMHgwZSwgMHgwMCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwZSwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MzgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4YzAsIDB4MDF9OwogICAgfQogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1yaWdodCAtZGF0YSB7CgkjZGVmaW5lIHJpZ2h0X3dpZHRoIDE2CgkjZGVmaW5lIHJpZ2h0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmlnaHRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHg4MCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwZSwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MzgsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsCgkweDAwLCAweDBlLCAweDAwLCAweDA3LCAweDgwLCAweDAzLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmxlZnRidXQgLWltYWdlIGJtLWxlZnQgLWNvbW1hbmQgZ29iYWNrIFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5sZWZ0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLWltYWdlIGJtLXJpZ2h0IC1jb21tYW5kIGdvZm9ydyBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtdGV4dCAiRmluZCIgLWNvbW1hbmQgZG9maW5kCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtc2lkZSBsZWZ0CiAgICBzZXQgZmluZHN0cmluZyB7fQogICAgc2V0IGZzdHJpbmcgLmN0b3AudG9wLmJhci5maW5kc3RyaW5nCiAgICBsYXBwZW5kIGVudHJpZXMgJGZzdHJpbmcKICAgIGVudHJ5ICRmc3RyaW5nIC13aWR0aCAzMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBmaW5kc3RyaW5nCiAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBmaW5kdHlwZSBFeGFjdAogICAgc2V0IGZpbmR0eXBlbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIFwKCQkJICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlciBGaWxlcyBQaWNrYXhlCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CiAgICAjIGZvciBtYWtpbmcgc3VyZSB0eXBlPT1FeGFjdCB3aGVuZXZlciBsb2M9PVBpY2theGUKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRsb2NjaGFuZ2UKCiAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAogICAgLmN0b3AgYWRkIC5jdG9wLmNkZXQKICAgIGZyYW1lIC5jdG9wLmNkZXQubGVmdAogICAgc2V0IGN0ZXh0IC5jdG9wLmNkZXQubGVmdC5jdGV4dAogICAgdGV4dCAkY3RleHQgLWJnIHdoaXRlIC1zdGF0ZSBkaXNhYmxlZCAtZm9udCAkdGV4dGZvbnQgXAoJLXdpZHRoICRnZW9tZXRyeShjdGV4dHcpIC1oZWlnaHQgJGdlb21ldHJ5KGN0ZXh0aCkgXAoJLXlzY3JvbGxjb21tYW5kICIuY3RvcC5jZGV0LmxlZnQuc2Igc2V0IiAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQubGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKCiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtYmFjayBibHVlIC1mb3JlIHdoaXRlCgkkY3RleHQgdGFnIGNvbmYgZDAgLWJhY2sgIiNmZjgwODAiCgkkY3RleHQgdGFnIGNvbmYgZDEgLWJhY2sgZ3JlZW4KICAgIH0gZWxzZSB7CgkkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZSBibHVlCgkkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmUgcmVkCgkkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmUgIiMwMGEwMDAiCgkkY3RleHQgdGFnIGNvbmYgbTAgLWZvcmUgcmVkCgkkY3RleHQgdGFnIGNvbmYgbTEgLWZvcmUgYmx1ZQoJJGN0ZXh0IHRhZyBjb25mIG0yIC1mb3JlIGdyZWVuCgkkY3RleHQgdGFnIGNvbmYgbTMgLWZvcmUgcHVycGxlCgkkY3RleHQgdGFnIGNvbmYgbTQgLWZvcmUgYnJvd24KCSRjdGV4dCB0YWcgY29uZiBtbWF4IC1mb3JlIGRhcmtncmV5CglzZXQgbWVyZ2VtYXggNQoJJGN0ZXh0IHRhZyBjb25mIG1yZXN1bHQgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KCSRjdGV4dCB0YWcgY29uZiBtc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCgkkY3RleHQgdGFnIGNvbmYgZm91bmQgLWJhY2sgeWVsbG93CiAgICB9CgogICAgZnJhbWUgLmN0b3AuY2RldC5yaWdodAogICAgc2V0IGNmbGlzdCAuY3RvcC5jZGV0LnJpZ2h0LmNmaWxlcwogICAgbGlzdGJveCAkY2ZsaXN0IC1iZyB3aGl0ZSAtc2VsZWN0bW9kZSBleHRlbmRlZCAtd2lkdGggJGdlb21ldHJ5KGNmbGlzdHcpIFwKCS15c2Nyb2xsY29tbWFuZCAiLmN0b3AuY2RldC5yaWdodC5zYiBzZXQiCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5yaWdodC5zYiAtY29tbWFuZCAiJGNmbGlzdCB5dmlldyIKICAgIHBhY2sgLmN0b3AuY2RldC5yaWdodC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AuY2RldCBhZGQgLmN0b3AuY2RldC5yaWdodAogICAgYmluZCAuY3RvcC5jZGV0IDxDb25maWd1cmU+IHtyZXNpemVjZGV0cGFuZXMgJVcgJXd9CgogICAgcGFjayAuY3RvcCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKCiAgICBiaW5kYWxsIDwxPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICAjYmluZGFsbCA8QjEtTW90aW9uPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTU+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgNSB1bml0cyIKICAgIGJpbmRhbGwgPDI+ICJhbGxjYW52cyBzY2FuIG1hcmsgMCAleSIKICAgIGJpbmRhbGwgPEIyLU1vdGlvbj4gImFsbGNhbnZzIHNjYW4gZHJhZ3RvIDAgJXkiCiAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgogICAgYmluZCAuIDxLZXktRG93bj4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5kIC4gPEtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmQgLiA8S2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1EZWxldGU+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LUJhY2tTcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IHAgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBuICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSBkICIkY3RleHQgeXZpZXcgc2Nyb2xsIDE4IHVuaXRzIgogICAgYmluZGtleSB1ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xOCB1bml0cyIKICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KICAgIGJpbmRrZXkgPEtleS1SZXR1cm4+IHtmaW5kbmV4dCAwfQogICAgYmluZGtleSA/IGZpbmRwcmV2CiAgICBiaW5ka2V5IGYgbmV4dGZpbGUKICAgIGJpbmQgLiA8Q29udHJvbC1xPiBkb3F1aXQKICAgIGJpbmQgLiA8Q29udHJvbC1mPiBkb2ZpbmQKICAgIGJpbmQgLiA8Q29udHJvbC1nPiB7ZmluZG5leHQgMH0KICAgIGJpbmQgLiA8Q29udHJvbC1yPiBmaW5kcHJldgogICAgYmluZCAuIDxDb250cm9sLWVxdWFsPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9BZGQ+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLW1pbnVzPiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfU3VidHJhY3Q+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgJGNmbGlzdCA8PExpc3Rib3hTZWxlY3Q+PiBsaXN0Ym94c2VsCiAgICBiaW5kIC4gPERlc3Ryb3k+IHtzYXZlc3R1ZmYgJVd9CiAgICBiaW5kIC4gPEJ1dHRvbi0xPiAiY2xpY2sgJVciCiAgICBiaW5kICRmc3RyaW5nIDxLZXktUmV0dXJuPiBkb2ZpbmQKICAgIGJpbmQgJHNoYTFlbnRyeSA8S2V5LVJldHVybj4gZ290b2NvbW1pdAogICAgYmluZCAkc2hhMWVudHJ5IDw8UGFzdGVTZWxlY3Rpb24+PiBjbGVhcnNoYTEKCiAgICBzZXQgbWFpbmN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgdGV4dGN1cnNvciBbJGN0ZXh0IGNnZXQgLWN1cnNvcl0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCgogICAgc2V0IHJvd2N0eG1lbnUgLnJvd2N0eG1lbnUKICAgIG1lbnUgJHJvd2N0eG1lbnUgLXRlYXJvZmYgMAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHRoaXMgLT4gc2VsZWN0ZWQiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMH0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiBzZWxlY3RlZCAtPiB0aGlzIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDF9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIk1ha2UgcGF0Y2giIC1jb21tYW5kIG1rcGF0Y2gKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIHRhZyIgLWNvbW1hbmQgbWt0YWcKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiIC1jb21tYW5kIHdyaXRlY29tbWl0Cn0KCiMgd2hlbiB3ZSBtYWtlIGEga2V5IGJpbmRpbmcgZm9yIHRoZSB0b3BsZXZlbCwgbWFrZSBzdXJlCiMgaXQgZG9lc24ndCBnZXQgdHJpZ2dlcmVkIHdoZW4gdGhhdCBrZXkgaXMgcHJlc3NlZCBpbiB0aGUKIyBmaW5kIHN0cmluZyBlbnRyeSB3aWRnZXQuCnByb2MgYmluZGtleSB7ZXYgc2NyaXB0fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgYmluZCAuICRldiAkc2NyaXB0CiAgICBzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSAkZXZdCiAgICBpZiB7JGVzY3JpcHQgPT0ge319IHsKCXNldCBlc2NyaXB0IFtiaW5kIEVudHJ5IDxLZXk+XQogICAgfQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWJpbmQgJGUgJGV2ICIkZXNjcmlwdDsgYnJlYWsiCiAgICB9Cn0KCiMgc2V0IHRoZSBmb2N1cyBiYWNrIHRvIHRoZSB0b3BsZXZlbCBmb3IgYW55IGNsaWNrIG91dHNpZGUKIyB0aGUgZW50cnkgd2lkZ2V0cwpwcm9jIGNsaWNrIHt3fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWlmIHskdyA9PSAkZX0gcmV0dXJuCiAgICB9CiAgICBmb2N1cyAuCn0KCnByb2Mgc2F2ZXN0dWZmIHt3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjZmxpc3QgbWFpbmZvbnQgdGV4dGZvbnQKICAgIGdsb2JhbCBzdHVmZnNhdmVkIGZpbmRtZXJnZWZpbGVzIGdhdWR5ZGlmZiBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG1heHdpZHRoCgogICAgaWYgeyRzdHVmZnNhdmVkfSByZXR1cm4KICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlIC5dfSByZXR1cm4KICAgIGNhdGNoIHsKCXNldCBmIFtvcGVuICJ+Ly5naXRrLW5ldyIgd10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1haW5mb250ICRtYWluZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZpbmRtZXJnZWZpbGVzICRmaW5kbWVyZ2VmaWxlc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGdhdWR5ZGlmZiAkZ2F1ZHlkaWZmXQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4Z3JhcGhwY3QgJG1heGdyYXBocGN0XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4d2lkdGggJG1heHdpZHRoXQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHdpZHRoKSBbd2luZm8gd2lkdGggLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGhlaWdodCkgW3dpbmZvIGhlaWdodCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjEpIFtleHByIFt3aW5mbyB3aWR0aCAkY2Fudl0tMl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIFt3aW5mbyB3aWR0aCAkY2FudjJdLTJdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciBbd2luZm8gd2lkdGggJGNhbnYzXS0yXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIgW3dpbmZvIGhlaWdodCAkY2Fudl0tMl0iCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjdGV4dF0gLSA4KSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSAkdGV4dGZvbnQgIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY3RleHR3KSAkd2lkIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY2ZsaXN0XSAtIDExKSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSBbJGNmbGlzdCBjZ2V0IC1mb250XSAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjZmxpc3R3KSAkd2lkIgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIFtpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3LzIgLSAyKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMxIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDMwfSB7CgkJc2V0IHNhc2gwIDMwCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPCAkc2FzaDAgKyAyMH0gewoJCXNldCBzYXNoMSBbZXhwciAkc2FzaDAgKyAyMF0KCSAgICB9CgkgICAgaWYgeyRzYXNoMSA+ICR3IC0gMTB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgJHcgLSAxMF0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByICRzYXNoMSAtIDIwXQoJCX0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KCSR3aW4gc2FzaCBwbGFjZSAxICRzYXNoMSBbbGluZGV4ICRzMSAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiBbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildIHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3KjMvNCAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCA0NX0gewoJCXNldCBzYXNoMCA0NQoJICAgIH0KCSAgICBpZiB7JHNhc2gwID4gJHcgLSAxNX0gewoJCXNldCBzYXNoMCBbZXhwciAkdyAtIDE1XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgdmVyc2lvbiAxLjIKCkNvcHlyaWdodCCpIDIwMDUgUGF1bCBNYWNrZXJyYXMKClVzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKcHJvYyBhc3NpZ25jb2xvciB7aWR9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvIGNvbG9ybWFwIGNvbW1jb2xvcnMgY29sb3JzIG5leHRjb2xvcgogICAgZ2xvYmFsIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4gbmNoaWxkcmVuCiAgICBnbG9iYWwgY29ybmVyY3Jvc3NpbmdzIGNyb3NzaW5ncwoKICAgIGlmIFtpbmZvIGV4aXN0cyBjb2xvcm1hcCgkaWQpXSByZXR1cm4KICAgIHNldCBuY29sb3JzIFtsbGVuZ3RoICRjb2xvcnNdCiAgICBpZiB7JG5wYXJlbnRzKCRpZCkgPD0gMSAmJiAkbmNoaWxkcmVuKCRpZCkgPT0gMX0gewoJc2V0IGNoaWxkIFtsaW5kZXggJGNoaWxkcmVuKCRpZCkgMF0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCSAgICAmJiAkbnBhcmVudHMoJGNoaWxkKSA9PSAxfSB7CgkgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBiYWRjb2xvcnMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldfSB7Cglmb3JlYWNoIHggJGNvcm5lcmNyb3NzaW5ncygkaWQpIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCgkgICAgfQoJfQoJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IGJhZGNvbG9ycyB7fQoJfQogICAgfQogICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7CglpZiB7W2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXX0gewoJICAgIGZvcmVhY2ggeCAkY3Jvc3NpbmdzKCRpZCkgewoJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJCX0KCSAgICB9CgkgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAoJICAgIH0KCX0KCXNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKQoJICAgIH0KCSAgICBpZiB7W2luZm8gZXhpc3RzIHBhcmVudHMoJGNoaWxkKV19IHsKCQlmb3JlYWNoIHAgJHBhcmVudHMoJGNoaWxkKSB7CgkJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQoJCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHApXSA8IDB9IHsKCQkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQoJCSAgICB9CgkJfQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCX0KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRuY29sb3JzfSB7aW5jciBpfSB7CglzZXQgYyBbbGluZGV4ICRjb2xvcnMgJG5leHRjb2xvcl0KCWlmIHtbaW5jciBuZXh0Y29sb3JdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IG5leHRjb2xvciAwCgl9CglpZiB7W2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNdfSBicmVhawogICAgfQogICAgc2V0IGNvbG9ybWFwKCRpZCkgJGMKfQoKcHJvYyBpbml0Z3JhcGgge30gewogICAgZ2xvYmFsIGNhbnZ5IGNhbnZ5MCBsaW5lbm8gbnVtY29tbWl0cyBuZXh0Y29sb3IgbGluZXNwYwogICAgZ2xvYmFsIG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzCiAgICBnbG9iYWwgbmNoaWxkcmVuIG5jbGVmdAogICAgZ2xvYmFsIGRpc3BsaXN0IG5oeXBlcnNwYWNlCgogICAgYWxsY2FudnMgZGVsZXRlIGFsbAogICAgc2V0IG5leHRjb2xvciAwCiAgICBzZXQgY2FudnkgJGNhbnZ5MAogICAgc2V0IGxpbmVubyAtMQogICAgc2V0IG51bWNvbW1pdHMgMAogICAgY2F0Y2gge3Vuc2V0IG1haW5saW5lfQogICAgY2F0Y2gge3Vuc2V0IG1haW5saW5lYXJyb3d9CiAgICBjYXRjaCB7dW5zZXQgc2lkZWxpbmVzfQogICAgZm9yZWFjaCBpZCBbYXJyYXkgbmFtZXMgbmNoaWxkcmVuXSB7CglzZXQgbmNsZWZ0KCRpZCkgJG5jaGlsZHJlbigkaWQpCiAgICB9CiAgICBzZXQgZGlzcGxpc3Qge30KICAgIHNldCBuaHlwZXJzcGFjZSAwCn0KCnByb2MgYmluZGxpbmUge3QgaWR9IHsKICAgIGdsb2JhbCBjYW52CgogICAgJGNhbnYgYmluZCAkdCA8RW50ZXI+ICJsaW5lZW50ZXIgJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TW90aW9uPiAibGluZW1vdGlvbiAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxMZWF2ZT4gImxpbmVsZWF2ZSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxCdXR0b24tMT4gImxpbmVjbGljayAleCAleSAkaWQgMSIKfQoKcHJvYyBkcmF3bGluZXMge2lkIHh0cmF9IHsKICAgIGdsb2JhbCBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcyBsdGhpY2tuZXNzIGNvbG9ybWFwIGNhbnYKCiAgICAkY2FudiBkZWxldGUgbGluZXMuJGlkCiAgICBpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CglzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJG1haW5saW5lKCRpZCkgXAoJCSAgIC13aWR0aCBbZXhwciB7KCR4dHJhICsgMSkgKiAkbHRoaWNrbmVzc31dIFwKCQkgICAtZmlsbCAkY29sb3JtYXAoJGlkKSAtdGFncyBsaW5lcy4kaWQgXAoJCSAgIC1hcnJvdyAkbWFpbmxpbmVhcnJvdygkaWQpXQoJJGNhbnYgbG93ZXIgJHQKCWJpbmRsaW5lICR0ICRpZAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBzaWRlbGluZXMoJGlkKV19IHsKCWZvcmVhY2ggbHMgJHNpZGVsaW5lcygkaWQpIHsKCSAgICBzZXQgY29vcmRzIFtsaW5kZXggJGxzIDBdCgkgICAgc2V0IHRoaWNrIFtsaW5kZXggJGxzIDFdCgkgICAgc2V0IGFycm93IFtsaW5kZXggJGxzIDJdCgkgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRjb29yZHMgLWZpbGwgJGNvbG9ybWFwKCRpZCkgXAoJCSAgICAgICAtd2lkdGggW2V4cHIgeygkdGhpY2sgKyAkeHRyYSkgKiAkbHRoaWNrbmVzc31dIFwKCQkgICAgICAgLWFycm93ICRhcnJvdyAtdGFncyBsaW5lcy4kaWRdCgkgICAgJGNhbnYgbG93ZXIgJHQKCSAgICBiaW5kbGluZSAkdCAkaWQKCX0KICAgIH0KfQoKIyBsZXZlbCBoZXJlIGlzIGFuIGluZGV4IGluIGRpc3BsaXN0CnByb2MgZHJhd2NvbW1pdGxpbmUge2xldmVsfSB7CiAgICBnbG9iYWwgcGFyZW50cyBjaGlsZHJlbiBucGFyZW50cyBkaXNwbGlzdAogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbWFpbmZvbnQgbmFtZWZvbnQgY2FudnkgbGluZXNwYwogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZyBjb21taXRpbmZvCiAgICBnbG9iYWwgY29sb3JtYXAgbnVtY29tbWl0cyBjdXJyZW50cGFyZW50cyBkdXBwYXJlbnRzCiAgICBnbG9iYWwgaWR0YWdzIGlkbGluZSBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgbGluZW5vIGx0aGlja25lc3MgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgcm93dGV4dHggaWRwb3MgbGFzdHVzZSBkaXNwbGlzdAogICAgZ2xvYmFsIG9sZG5saW5lcyBvbGRkbGV2ZWwgb2xkZGlzcGxpc3QKCiAgICBpbmNyIG51bWNvbW1pdHMKICAgIGluY3IgbGluZW5vCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxpc3QgJGxldmVsXQogICAgc2V0IGxhc3R1c2UoJGlkKSAkbGluZW5vCiAgICBzZXQgbGluZWlkKCRsaW5lbm8pICRpZAogICAgc2V0IGlkbGluZSgkaWQpICRsaW5lbm8KICAgIHNldCBvZmlsbCBbZXhwciB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXT8gImJsdWUiOiAid2hpdGUifV0KICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJICAgIHNldCBucGFyZW50cygkaWQpIDAKCX0KICAgIH0KICAgIGFzc2lnbmNvbG9yICRpZAogICAgc2V0IGN1cnJlbnRwYXJlbnRzIHt9CiAgICBzZXQgZHVwcGFyZW50cyB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV0gJiYgW2luZm8gZXhpc3RzIHBhcmVudHMoJGlkKV19IHsKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRjdXJyZW50cGFyZW50cyAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjdXJyZW50cGFyZW50cyAkcAoJICAgIH0gZWxzZSB7CgkJIyByZW1lbWJlciB0aGF0IHRoaXMgcGFyZW50IHdhcyBsaXN0ZWQgdHdpY2UKCQlsYXBwZW5kIGR1cHBhcmVudHMgJHAKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgeCBbeGNvb3JkICRsZXZlbCAkbGV2ZWwgJGxpbmVub10KICAgIHNldCB5MSAkY2FudnkKICAgIHNldCBjYW52eSBbZXhwciAkY2FudnkgKyAkbGluZXNwY10KICAgIGFsbGNhbnZzIGNvbmYgLXNjcm9sbHJlZ2lvbiBcCglbbGlzdCAwIDAgMCBbZXhwciAkeTEgKyAwLjUgKiAkbGluZXNwYyArIDJdXQogICAgaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJbGFwcGVuZCBtYWlubGluZSgkaWQpICR4ICR5MQoJaWYgeyRtYWlubGluZWFycm93KCRpZCkgbmUgIm5vbmUifSB7CgkgICAgc2V0IG1haW5saW5lKCRpZCkgW3RyaW1kaWFnc3RhcnQgJG1haW5saW5lKCRpZCldCgl9CiAgICB9CiAgICBkcmF3bGluZXMgJGlkIDAKICAgIHNldCBvcmFkIFtleHByIHskbGluZXNwYyAvIDN9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBvdmFsIFtleHByICR4IC0gJG9yYWRdIFtleHByICR5MSAtICRvcmFkXSBcCgkgICAgICAgW2V4cHIgJHggKyAkb3JhZCAtIDFdIFtleHByICR5MSArICRvcmFkIC0gMV0gXAoJICAgICAgIC1maWxsICRvZmlsbCAtb3V0bGluZSBibGFjayAtd2lkdGggMV0KICAgICRjYW52IHJhaXNlICR0CiAgICAkY2FudiBiaW5kICR0IDwxPiB7c2VsY2FudmxpbmUge30gJXggJXl9CiAgICBzZXQgeHQgW3hjb29yZCBbbGxlbmd0aCAkZGlzcGxpc3RdICRsZXZlbCAkbGluZW5vXQogICAgaWYge1tsbGVuZ3RoICRjdXJyZW50cGFyZW50c10gPiAyfSB7CglzZXQgeHQgW2V4cHIgeyR4dCArIChbbGxlbmd0aCAkY3VycmVudHBhcmVudHNdIC0gMikgKiAkbGluZXNwY31dCiAgICB9CiAgICBzZXQgcm93dGV4dHgoJGxpbmVubykgJHh0CiAgICBzZXQgaWRwb3MoJGlkKSBbbGlzdCAkeCAkeHQgJHkxXQogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV0gfHwgW2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV0KCXx8IFtpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHh0IFtkcmF3dGFncyAkaWQgJHggJHh0ICR5MV0KICAgIH0KICAgIHNldCBoZWFkbGluZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMF0KICAgIHNldCBuYW1lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAxXQogICAgc2V0IGRhdGUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDJdCiAgICBzZXQgbGluZWh0YWcoJGxpbmVubykgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4dCAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRoZWFkbGluZSAtZm9udCAkbWFpbmZvbnQgXQogICAgJGNhbnYgYmluZCAkbGluZWh0YWcoJGxpbmVubykgPEJ1dHRvbi0zPiAicm93bWVudSAlWCAlWSAkaWQiCiAgICBzZXQgbGluZW50YWcoJGxpbmVubykgWyRjYW52MiBjcmVhdGUgdGV4dCAzICR5MSAtYW5jaG9yIHcgXAoJCQkgICAgICAgLXRleHQgJG5hbWUgLWZvbnQgJG5hbWVmb250XQogICAgc2V0IGxpbmVkdGFnKCRsaW5lbm8pIFskY2FudjMgY3JlYXRlIHRleHQgMyAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRkYXRlIC1mb250ICRtYWluZm9udF0KCiAgICBzZXQgb2xkZGxldmVsICRsZXZlbAogICAgc2V0IG9sZGRpc3BsaXN0ICRkaXNwbGlzdAogICAgc2V0IG9sZG5saW5lcyBbbGxlbmd0aCAkZGlzcGxpc3RdCn0KCnByb2MgZHJhd3RhZ3Mge2lkIHggeHQgeTF9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgaWRsaW5lIHJvd3RleHR4CgogICAgc2V0IG1hcmtzIHt9CiAgICBzZXQgbnRhZ3MgMAogICAgc2V0IG5oZWFkcyAwCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IG1hcmtzICRpZHRhZ3MoJGlkKQoJc2V0IG50YWdzIFtsbGVuZ3RoICRtYXJrc10KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZGhlYWRzKCRpZCldCglzZXQgbmhlYWRzIFtsbGVuZ3RoICRpZGhlYWRzKCRpZCldCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgbWFya3MgW2NvbmNhdCAkbWFya3MgJGlkb3RoZXJyZWZzKCRpZCldCiAgICB9CiAgICBpZiB7JG1hcmtzIGVxIHt9fSB7CglyZXR1cm4gJHh0CiAgICB9CgogICAgc2V0IGRlbHRhIFtleHByIHtpbnQoMC41ICogKCRsaW5lc3BjIC0gJGx0aGlja25lc3MpKX1dCiAgICBzZXQgeXQgW2V4cHIgJHkxIC0gMC41ICogJGxpbmVzcGNdCiAgICBzZXQgeWIgW2V4cHIgJHl0ICsgJGxpbmVzcGMgLSAxXQogICAgc2V0IHh2YWxzIHt9CiAgICBzZXQgd3ZhbHMge30KICAgIGZvcmVhY2ggdGFnICRtYXJrcyB7CglzZXQgd2lkIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0YWddCglsYXBwZW5kIHh2YWxzICR4dAoJbGFwcGVuZCB3dmFscyAkd2lkCglzZXQgeHQgW2V4cHIgeyR4dCArICRkZWx0YSArICR3aWQgKyAkbHRoaWNrbmVzcyArICRsaW5lc3BjfV0KICAgIH0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkeCAkeTEgW2xpbmRleCAkeHZhbHMgZW5kXSAkeTEgXAoJICAgICAgIC13aWR0aCAkbHRoaWNrbmVzcyAtZmlsbCBibGFjayAtdGFncyB0YWcuJGlkXQogICAgJGNhbnYgbG93ZXIgJHQKICAgIGZvcmVhY2ggdGFnICRtYXJrcyB4ICR4dmFscyB3aWQgJHd2YWxzIHsKCXNldCB4bCBbZXhwciAkeCArICRkZWx0YV0KCXNldCB4ciBbZXhwciAkeCArICRkZWx0YSArICR3aWQgKyAkbHRoaWNrbmVzc10KCWlmIHtbaW5jciBudGFncyAtMV0gPj0gMH0gewoJICAgICMgZHJhdyBhIHRhZwoJICAgIHNldCB0IFskY2FudiBjcmVhdGUgcG9seWdvbiAkeCBbZXhwciAkeXQgKyAkZGVsdGFdICR4bCAkeXQgXAoJCSAgICAgICAkeHIgJHl0ICR4ciAkeWIgJHhsICR5YiAkeCBbZXhwciAkeWIgLSAkZGVsdGFdIFwKCQkgICAgICAgLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgeWVsbG93IC10YWdzIHRhZy4kaWRdCgkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCgkgICAgc2V0IHJvd3RleHR4KCRpZGxpbmUoJGlkKSkgW2V4cHIgeyR4ciArICRsaW5lc3BjfV0KCX0gZWxzZSB7CgkgICAgIyBkcmF3IGEgaGVhZCBvciBvdGhlciByZWYKCSAgICBpZiB7W2luY3IgbmhlYWRzIC0xXSA+PSAwfSB7CgkJc2V0IGNvbCBncmVlbgoJICAgIH0gZWxzZSB7CgkJc2V0IGNvbCAiI2RkZGRmZiIKCSAgICB9CgkgICAgc2V0IHhsIFtleHByICR4bCAtICRkZWx0YS8yXQoJICAgICRjYW52IGNyZWF0ZSBwb2x5Z29uICR4ICR5dCAkeHIgJHl0ICR4ciAkeWIgJHggJHliIFwKCQktd2lkdGggMSAtb3V0bGluZSBibGFjayAtZmlsbCAkY29sIC10YWdzIHRhZy4kaWQKCX0KCXNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeGwgJHkxIC1hbmNob3IgdyAtdGV4dCAkdGFnIFwKCQkgICAtZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGFnLiRpZF0KCWlmIHskbnRhZ3MgPj0gMH0gewoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJfQogICAgfQogICAgcmV0dXJuICR4dAp9Cgpwcm9jIG5vdGVjcm9zc2luZ3Mge2lkIGxvIGhpIGNvcm5lcn0gewogICAgZ2xvYmFsIG9sZGRpc3BsaXN0IGNyb3NzaW5ncyBjb3JuZXJjcm9zc2luZ3MKCiAgICBmb3Ige3NldCBpICRsb30ge1tpbmNyIGldIDwgJGhpfSB7fSB7CglzZXQgcCBbbGluZGV4ICRvbGRkaXNwbGlzdCAkaV0KCWlmIHskcCA9PSB7fX0gY29udGludWUKCWlmIHskaSA9PSAkY29ybmVyfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjb3JuZXJjcm9zc2luZ3MoJGlkKSAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjb3JuZXJjcm9zc2luZ3MoJGlkKSAkcAoJICAgIH0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb3JuZXJjcm9zc2luZ3MoJHApXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY29ybmVyY3Jvc3NpbmdzKCRwKSAkaWRdIDwgMH0gewoJCWxhcHBlbmQgY29ybmVyY3Jvc3NpbmdzKCRwKSAkaWQKCSAgICB9Cgl9IGVsc2UgewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY3Jvc3NpbmdzKCRpZCkgJHBdIDwgMH0gewoJCWxhcHBlbmQgY3Jvc3NpbmdzKCRpZCkgJHAKCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY3Jvc3NpbmdzKCRwKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNyb3NzaW5ncygkcCkgJGlkXSA8IDB9IHsKCQlsYXBwZW5kIGNyb3NzaW5ncygkcCkgJGlkCgkgICAgfQoJfQogICAgfQp9Cgpwcm9jIHhjb29yZCB7aSBsZXZlbCBsbn0gewogICAgZ2xvYmFsIGNhbnZ4MCB4c3BjMSB4c3BjMgoKICAgIHNldCB4IFtleHByIHskY2FudngwICsgJGkgKiAkeHNwYzEoJGxuKX1dCiAgICBpZiB7JGkgPiAwICYmICRpID09ICRsZXZlbH0gewoJc2V0IHggW2V4cHIgeyR4ICsgMC41ICogKCR4c3BjMiAtICR4c3BjMSgkbG4pKX1dCiAgICB9IGVsc2VpZiB7JGkgPiAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArICR4c3BjMiAtICR4c3BjMSgkbG4pfV0KICAgIH0KICAgIHJldHVybiAkeAp9CgojIGl0IHNlZW1zIFRrIGNhbid0IGRyYXcgYXJyb3dzIG9uIHRoZSBlbmQgb2YgZGlhZ29uYWwgbGluZSBzZWdtZW50cy4uLgpwcm9jIHRyaW1kaWFnZW5kIHtsaW5lfSB7CiAgICB3aGlsZSB7W2xsZW5ndGggJGxpbmVdID4gNH0gewoJc2V0IHgxIFtsaW5kZXggJGxpbmUgZW5kLTNdCglzZXQgeTEgW2xpbmRleCAkbGluZSBlbmQtMl0KCXNldCB4MiBbbGluZGV4ICRsaW5lIGVuZC0xXQoJc2V0IHkyIFtsaW5kZXggJGxpbmUgZW5kXQoJaWYgeygkeDEgPT0gJHgyKSAhPSAoJHkxID09ICR5Mil9IGJyZWFrCglzZXQgbGluZSBbbHJlcGxhY2UgJGxpbmUgZW5kLTEgZW5kXQogICAgfQogICAgcmV0dXJuICRsaW5lCn0KCnByb2MgdHJpbWRpYWdzdGFydCB7bGluZX0gewogICAgd2hpbGUge1tsbGVuZ3RoICRsaW5lXSA+IDR9IHsKCXNldCB4MSBbbGluZGV4ICRsaW5lIDBdCglzZXQgeTEgW2xpbmRleCAkbGluZSAxXQoJc2V0IHgyIFtsaW5kZXggJGxpbmUgMl0KCXNldCB5MiBbbGluZGV4ICRsaW5lIDNdCglpZiB7KCR4MSA9PSAkeDIpICE9ICgkeTEgPT0gJHkyKX0gYnJlYWsKCXNldCBsaW5lIFtscmVwbGFjZSAkbGluZSAwIDFdCiAgICB9CiAgICByZXR1cm4gJGxpbmUKfQoKcHJvYyBkcmF3c2xhbnRzIHtpZCBuZWVkb25zY3JlZW4gbm9oc30gewogICAgZ2xvYmFsIGNhbnYgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMKICAgIGdsb2JhbCBjYW52eDAgY2FudnkgeHNwYzEgeHNwYzIgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGN1cnJlbnRwYXJlbnRzIGR1cHBhcmVudHMKICAgIGdsb2JhbCBsdGhpY2tuZXNzIGxpbmVzcGMgY2FudnkgY29sb3JtYXAgbGluZW5vIGdlb21ldHJ5CiAgICBnbG9iYWwgbWF4Z3JhcGhwY3QgbWF4d2lkdGgKICAgIGdsb2JhbCBkaXNwbGlzdCBvbnNjcmVlbiBsYXN0dXNlCiAgICBnbG9iYWwgcGFyZW50cyBjb21taXRsaXN0ZWQKICAgIGdsb2JhbCBvbGRubGluZXMgb2xkZGxldmVsIG9sZGRpc3BsaXN0CiAgICBnbG9iYWwgbmh5cGVyc3BhY2UgbnVtY29tbWl0cyBubmV3cGFyZW50cwoKICAgIGlmIHskbGluZW5vIDwgMH0gewoJbGFwcGVuZCBkaXNwbGlzdCAkaWQKCXNldCBvbnNjcmVlbigkaWQpIDEKCXJldHVybiAwCiAgICB9CgogICAgc2V0IHkxIFtleHByIHskY2FudnkgLSAkbGluZXNwY31dCiAgICBzZXQgeTIgJGNhbnZ5CgogICAgIyB3b3JrIG91dCB3aGF0IHdlIG5lZWQgdG8gZ2V0IGJhY2sgb24gc2NyZWVuCiAgICBzZXQgcmVpbnMge30KICAgIGlmIHskb25zY3JlZW4oJGlkKSA8IDB9IHsKCSMgbmV4dCB0byBkbyBpc24ndCBkaXNwbGF5ZWQsIGJldHRlciBnZXQgaXQgb24gc2NyZWVuLi4uCglsYXBwZW5kIHJlaW5zIFtsaXN0ICRpZCAwXQogICAgfQogICAgIyBtYWtlIHN1cmUgYWxsIHRoZSBwcmV2aW91cyBjb21taXRzJ3MgcGFyZW50cyBhcmUgb24gdGhlIHNjcmVlbgogICAgZm9yZWFjaCBwICRjdXJyZW50cGFyZW50cyB7CglpZiB7JG9uc2NyZWVuKCRwKSA8IDB9IHsKCSAgICBsYXBwZW5kIHJlaW5zIFtsaXN0ICRwIDBdCgl9CiAgICB9CiAgICAjIGJyaW5nIGJhY2sgYW55dGhpbmcgcmVxdWVzdGVkIGJ5IGNhbGxlcgogICAgaWYgeyRuZWVkb25zY3JlZW4gbmUge319IHsKCWxhcHBlbmQgcmVpbnMgJG5lZWRvbnNjcmVlbgogICAgfQoKICAgICMgdHJ5IHRoZSBzaG9ydGN1dAogICAgaWYgeyRjdXJyZW50cGFyZW50cyA9PSAkaWQgJiYgJG9uc2NyZWVuKCRpZCkgPT0gMCAmJiAkcmVpbnMgZXEge319IHsKCXNldCBkbGV2ZWwgJG9sZGRsZXZlbAoJc2V0IHggW3hjb29yZCAkZGxldmVsICRkbGV2ZWwgJGxpbmVub10KCXNldCBtYWlubGluZSgkaWQpIFtsaXN0ICR4ICR5MV0KCXNldCBtYWlubGluZWFycm93KCRpZCkgbm9uZQoJc2V0IGxhc3R1c2UoJGlkKSAkbGluZW5vCglzZXQgZGlzcGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkZGxldmVsICRkbGV2ZWwgJGlkXQoJc2V0IG9uc2NyZWVuKCRpZCkgMQoJc2V0IHhzcGMxKFtleHByIHskbGluZW5vICsgMX1dKSAkeHNwYzEoJGxpbmVubykKCXJldHVybiAkZGxldmVsCiAgICB9CgogICAgIyB1cGRhdGUgZGlzcGxpc3QKICAgIHNldCBkaXNwbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRvbGRkbGV2ZWwgJG9sZGRsZXZlbF0KICAgIHNldCBqICRvbGRkbGV2ZWwKICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJc2V0IGxhc3R1c2UoJHApICRsaW5lbm8KCWlmIHskb25zY3JlZW4oJHApID09IDB9IHsKCSAgICBzZXQgZGlzcGxpc3QgW2xpbnNlcnQgJGRpc3BsaXN0ICRqICRwXQoJICAgIHNldCBvbnNjcmVlbigkcCkgMQoJICAgIGluY3IgagoJfQogICAgfQogICAgaWYgeyRvbnNjcmVlbigkaWQpID09IDB9IHsKCWxhcHBlbmQgZGlzcGxpc3QgJGlkCglzZXQgb25zY3JlZW4oJGlkKSAxCiAgICB9CgogICAgIyByZW1vdmUgdGhlIG51bGwgZW50cnkgaWYgcHJlc2VudAogICAgc2V0IG51bGxlbnRyeSBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0IHt9XQogICAgaWYgeyRudWxsZW50cnkgPj0gMH0gewoJc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJG51bGxlbnRyeSAkbnVsbGVudHJ5XQogICAgfQoKICAgICMgYnJpbmcgYmFjayB0aGUgb25lcyB3ZSBuZWVkIG5vdyAoaWYgd2UgZGlkIGl0IGVhcmxpZXIKICAgICMgaXQgd291bGQgY2hhbmdlIGRpc3BsaXN0IGFuZCBpbnZhbGlkYXRlIG9sZGRsZXZlbCkKICAgIGZvcmVhY2ggcGkgJHJlaW5zIHsKCSMgdGVzdCBhZ2FpbiBpbiBjYXNlIG9mIGR1cGxpY2F0ZXMgaW4gcmVpbnMKCXNldCBwIFtsaW5kZXggJHBpIDBdCglpZiB7JG9uc2NyZWVuKCRwKSA8IDB9IHsKCSAgICBzZXQgb25zY3JlZW4oJHApIDEKCSAgICBzZXQgbGFzdHVzZSgkcCkgJGxpbmVubwoJICAgIHNldCBkaXNwbGlzdCBbbGluc2VydCAkZGlzcGxpc3QgW2xpbmRleCAkcGkgMV0gJHBdCgkgICAgaW5jciBuaHlwZXJzcGFjZSAtMQoJfQogICAgfQoKICAgIHNldCBsYXN0dXNlKCRpZCkgJGxpbmVubwoKICAgICMgc2VlIGlmIHdlIG5lZWQgdG8gbWFrZSBhbnkgbGluZXMganVtcCBvZmYgaW50byBoeXBlcnNwYWNlCiAgICBzZXQgZGlzcGwgW2xsZW5ndGggJGRpc3BsaXN0XQogICAgaWYgeyRkaXNwbCA+ICRtYXh3aWR0aH0gewoJc2V0IGFnZXMge30KCWZvcmVhY2ggeCAkZGlzcGxpc3QgewoJICAgIGxhcHBlbmQgYWdlcyBbbGlzdCAkbGFzdHVzZSgkeCkgJHhdCgl9CglzZXQgYWdlcyBbbHNvcnQgLWludGVnZXIgLWluZGV4IDAgJGFnZXNdCglzZXQgayAwCgl3aGlsZSB7JGRpc3BsID4gJG1heHdpZHRofSB7CgkgICAgc2V0IHVzZSBbbGluZGV4ICRhZ2VzICRrIDBdCgkgICAgc2V0IHZpY3RpbSBbbGluZGV4ICRhZ2VzICRrIDFdCgkgICAgaWYgeyR1c2UgPj0gJGxpbmVubyAtIDV9IGJyZWFrCgkgICAgaW5jciBrCgkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkbm9ocyAkdmljdGltXSA+PSAwfSBjb250aW51ZQoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3QgJHZpY3RpbV0KCSAgICBzZXQgZGlzcGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkaSAkaV0KCSAgICBzZXQgb25zY3JlZW4oJHZpY3RpbSkgLTEKCSAgICBpbmNyIG5oeXBlcnNwYWNlCgkgICAgaW5jciBkaXNwbCAtMQoJICAgIGlmIHskaSA8ICRudWxsZW50cnl9IHsKCQlpbmNyIG51bGxlbnRyeSAtMQoJICAgIH0KCSAgICBzZXQgeCBbbGluZGV4ICRtYWlubGluZSgkdmljdGltKSBlbmQtMV0KCSAgICBsYXBwZW5kIG1haW5saW5lKCR2aWN0aW0pICR4ICR5MQoJICAgIHNldCBsaW5lIFt0cmltZGlhZ2VuZCAkbWFpbmxpbmUoJHZpY3RpbSldCgkgICAgc2V0IGFycm93ICJsYXN0IgoJICAgIGlmIHskbWFpbmxpbmVhcnJvdygkdmljdGltKSBuZSAibm9uZSJ9IHsKCQlzZXQgbGluZSBbdHJpbWRpYWdzdGFydCAkbGluZV0KCQlzZXQgYXJyb3cgImJvdGgiCgkgICAgfQoJICAgIGxhcHBlbmQgc2lkZWxpbmVzKCR2aWN0aW0pIFtsaXN0ICRsaW5lIDEgJGFycm93XQoJICAgIHVuc2V0IG1haW5saW5lKCR2aWN0aW0pCgl9CiAgICB9CgogICAgc2V0IGRsZXZlbCBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICRpZF0KCiAgICAjIElmIHdlIGFyZSByZWR1Y2luZywgcHV0IGluIGEgbnVsbCBlbnRyeQogICAgaWYgeyRkaXNwbCA8ICRvbGRubGluZXN9IHsKCSMgZG9lcyB0aGUgbmV4dCBsaW5lIGxvb2sgbGlrZSBhIG1lcmdlPwoJIyBpLmUuIGRvZXMgaXQgaGF2ZSA+IDEgbmV3IHBhcmVudD8KCWlmIHskbm5ld3BhcmVudHMoJGlkKSA+IDF9IHsKCSAgICBzZXQgaSBbZXhwciB7JGRsZXZlbCArIDF9XQoJfSBlbHNlaWYgeyRubmV3cGFyZW50cyhbbGluZGV4ICRvbGRkaXNwbGlzdCAkb2xkZGxldmVsXSkgPT0gMH0gewoJICAgIHNldCBpICRvbGRkbGV2ZWwKCSAgICBpZiB7JG51bGxlbnRyeSA+PSAwICYmICRudWxsZW50cnkgPCAkaX0gewoJCWluY3IgaSAtMQoJICAgIH0KCX0gZWxzZWlmIHskbnVsbGVudHJ5ID49IDB9IHsKCSAgICBzZXQgaSAkbnVsbGVudHJ5CgkgICAgd2hpbGUgeyRpIDwgJGRpc3BsCgkJICAgJiYgW2xpbmRleCAkb2xkZGlzcGxpc3QgJGldID09IFtsaW5kZXggJGRpc3BsaXN0ICRpXX0gewoJCWluY3IgaQoJICAgIH0KCX0gZWxzZSB7CgkgICAgc2V0IGkgJG9sZGRsZXZlbAoJICAgIGlmIHskZGxldmVsID49ICRpfSB7CgkJaW5jciBpCgkgICAgfQoJfQoJaWYgeyRpIDwgJGRpc3BsfSB7CgkgICAgc2V0IGRpc3BsaXN0IFtsaW5zZXJ0ICRkaXNwbGlzdCAkaSB7fV0KCSAgICBpbmNyIGRpc3BsCgkgICAgaWYgeyRkbGV2ZWwgPj0gJGl9IHsKCQlpbmNyIGRsZXZlbAoJICAgIH0KCX0KICAgIH0KCiAgICAjIGRlY2lkZSBvbiB0aGUgbGluZSBzcGFjaW5nIGZvciB0aGUgbmV4dCBsaW5lCiAgICBzZXQgbGogW2V4cHIgeyRsaW5lbm8gKyAxfV0KICAgIHNldCBtYXh3IFtleHByIHskbWF4Z3JhcGhwY3QgKiAkZ2VvbWV0cnkoY2FudjEpIC8gMTAwfV0KICAgIGlmIHskZGlzcGwgPD0gMSB8fCAkY2FudngwICsgJGRpc3BsICogJHhzcGMyIDw9ICRtYXh3fSB7CglzZXQgeHNwYzEoJGxqKSAkeHNwYzIKICAgIH0gZWxzZSB7CglzZXQgeHNwYzEoJGxqKSBbZXhwciB7KCRtYXh3IC0gJGNhbnZ4MCAtICR4c3BjMikgLyAoJGRpc3BsIC0gMSl9XQoJaWYgeyR4c3BjMSgkbGopIDwgJGx0aGlja25lc3N9IHsKCSAgICBzZXQgeHNwYzEoJGxqKSAkbHRoaWNrbmVzcwoJfQogICAgfQoKICAgIGZvcmVhY2ggaWRpICRyZWlucyB7CglzZXQgaWQgW2xpbmRleCAkaWRpIDBdCglzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICRpZF0KCXNldCB4aiBbeGNvb3JkICRqICRkbGV2ZWwgJGxqXQoJc2V0IG1haW5saW5lKCRpZCkgW2xpc3QgJHhqICR5Ml0KCXNldCBtYWlubGluZWFycm93KCRpZCkgZmlyc3QKICAgIH0KCiAgICBzZXQgaSAtMQogICAgZm9yZWFjaCBpZCAkb2xkZGlzcGxpc3QgewoJaW5jciBpCglpZiB7JGlkID09IHt9fSBjb250aW51ZQoJaWYgeyRvbnNjcmVlbigkaWQpIDw9IDB9IGNvbnRpbnVlCglzZXQgeGkgW3hjb29yZCAkaSAkb2xkZGxldmVsICRsaW5lbm9dCglpZiB7JGkgPT0gJG9sZGRsZXZlbH0gewoJICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3QgJHBdCgkJc2V0IGNvb3JkcyBbbGlzdCAkeGkgJHkxXQoJCXNldCB4aiBbeGNvb3JkICRqICRkbGV2ZWwgJGxqXQoJCWlmIHskeGogPCAkeGkgLSAkbGluZXNwY30gewoJCSAgICBsYXBwZW5kIGNvb3JkcyBbZXhwciB7JHhqICsgJGxpbmVzcGN9XSAkeTEKCQkgICAgbm90ZWNyb3NzaW5ncyAkcCAkaiAkaSBbZXhwciB7JGogKyAxfV0KCQl9IGVsc2VpZiB7JHhqID4gJHhpICsgJGxpbmVzcGN9IHsKCQkgICAgbGFwcGVuZCBjb29yZHMgW2V4cHIgeyR4aiAtICRsaW5lc3BjfV0gJHkxCgkJICAgIG5vdGVjcm9zc2luZ3MgJHAgJGkgJGogW2V4cHIgeyRqIC0gMX1dCgkJfQoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGR1cHBhcmVudHMgJHBdID49IDB9IHsKCQkgICAgIyBkcmF3IGEgZG91YmxlLXdpZHRoIGxpbmUgdG8gaW5kaWNhdGUgdGhlIGRvdWJsZWQgcGFyZW50CgkJICAgIGxhcHBlbmQgY29vcmRzICR4aiAkeTIKCQkgICAgbGFwcGVuZCBzaWRlbGluZXMoJHApIFtsaXN0ICRjb29yZHMgMiBub25lXQoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYWlubGluZSgkcCldfSB7CgkJCXNldCBtYWlubGluZSgkcCkgW2xpc3QgJHhqICR5Ml0KCQkJc2V0IG1haW5saW5lYXJyb3coJHApIG5vbmUKCQkgICAgfQoJCX0gZWxzZSB7CgkJICAgICMgbm9ybWFsIGNhc2UsIG5vIHBhcmVudCBkdXBsaWNhdGVkCgkJICAgIHNldCB5YiAkeTIKCQkgICAgc2V0IGR4IFtleHByIHthYnMoJHhpIC0gJHhqKX1dCgkJICAgIGlmIHswICYmICRkeCA8ICRsaW5lc3BjfSB7CgkJCXNldCB5YiBbZXhwciB7JHkxICsgJGR4fV0KCQkgICAgfQoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYWlubGluZSgkcCldfSB7CgkJCWlmIHskeGkgIT0gJHhqfSB7CgkJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHliCgkJCX0KCQkJc2V0IG1haW5saW5lKCRwKSAkY29vcmRzCgkJCXNldCBtYWlubGluZWFycm93KCRwKSBub25lCgkJICAgIH0gZWxzZSB7CgkJCWxhcHBlbmQgY29vcmRzICR4aiAkeWIKCQkJaWYgeyR5YiA8ICR5Mn0gewoJCQkgICAgbGFwcGVuZCBjb29yZHMgJHhqICR5MgoJCQl9CgkJCWxhcHBlbmQgc2lkZWxpbmVzKCRwKSBbbGlzdCAkY29vcmRzIDEgbm9uZV0KCQkgICAgfQoJCX0KCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBqICRpCgkgICAgaWYge1tsaW5kZXggJGRpc3BsaXN0ICRpXSAhPSAkaWR9IHsKCQlzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICRpZF0KCSAgICB9CgkgICAgaWYgeyRqICE9ICRpIHx8ICR4c3BjMSgkbGluZW5vKSAhPSAkeHNwYzEoJGxqKQoJCXx8ICgkb2xkZGxldmVsIDwgJGkgJiYgJGkgPCAkZGxldmVsKQoJCXx8ICgkZGxldmVsIDwgJGkgJiYgJGkgPCAkb2xkZGxldmVsKX0gewoJCXNldCB4aiBbeGNvb3JkICRqICRkbGV2ZWwgJGxqXQoJCWxhcHBlbmQgbWFpbmxpbmUoJGlkKSAkeGkgJHkxICR4aiAkeTIKCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gJGRsZXZlbAp9CgojIHNlYXJjaCBmb3IgeCBpbiBhIGxpc3Qgb2YgbGlzdHMKcHJvYyBsbHNlYXJjaCB7bGxpc3QgeH0gewogICAgc2V0IGkgMAogICAgZm9yZWFjaCBsICRsbGlzdCB7CglpZiB7JGwgPT0gJHggfHwgW2xzZWFyY2ggLWV4YWN0ICRsICR4XSA+PSAwfSB7CgkgICAgcmV0dXJuICRpCgl9CglpbmNyIGkKICAgIH0KICAgIHJldHVybiAtMQp9Cgpwcm9jIGRyYXdtb3JlIHtyZWFkaW5nfSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIG51bWNvbW1pdHMgbmNtdXBkYXRlIG5leHR1cGRhdGUKICAgIGdsb2JhbCBzdG9wcGVkIG5oeXBlcnNwYWNlIHBhcmVudHMgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgbWF4d2lkdGggb25zY3JlZW4gZGlzcGxpc3QgY3VycmVudHBhcmVudHMgb2xkZGxldmVsCgogICAgc2V0IG4gW2xsZW5ndGggJGRpc3BsYXlvcmRlcl0KICAgIHdoaWxlIHskbnVtY29tbWl0cyA8ICRufSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRudW1jb21taXRzXQoJc2V0IGN0eGVuZCBbZXhwciB7JG51bWNvbW1pdHMgKyAxMH1dCglpZiB7ISRyZWFkaW5nICYmICRjdHhlbmQgPiAkbn0gewoJICAgIHNldCBjdHhlbmQgJG4KCX0KCXNldCBkbGlzdCB7fQoJaWYgeyRudW1jb21taXRzID4gMH0gewoJICAgIHNldCBkbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRvbGRkbGV2ZWwgJG9sZGRsZXZlbF0KCSAgICBzZXQgaSAkb2xkZGxldmVsCgkgICAgZm9yZWFjaCBwICRjdXJyZW50cGFyZW50cyB7CgkJaWYgeyRvbnNjcmVlbigkcCkgPT0gMH0gewoJCSAgICBzZXQgZGxpc3QgW2xpbnNlcnQgJGRsaXN0ICRpICRwXQoJCSAgICBpbmNyIGkKCQl9CgkgICAgfQoJfQoJc2V0IG5vaHMge30KCXNldCByZWlucyB7fQoJc2V0IGlzZmF0IFtleHByIHtbbGxlbmd0aCAkZGxpc3RdID4gJG1heHdpZHRofV0KCWlmIHskbmh5cGVyc3BhY2UgPiAwIHx8ICRpc2ZhdH0gewoJICAgIGlmIHskY3R4ZW5kID4gJG59IGJyZWFrCgkgICAgIyB3b3JrIG91dCB3aGF0IHRvIGJyaW5nIGJhY2sgYW5kCgkgICAgIyB3aGF0IHdlIHdhbnQgdG8gZG9uJ3Qgd2FudCB0byBzZW5kIGludG8gaHlwZXJzcGFjZQoJICAgIHNldCByb29tIDEKCSAgICBmb3Ige3NldCBrICRudW1jb21taXRzfSB7JGsgPCAkY3R4ZW5kfSB7aW5jciBrfSB7CgkJc2V0IHggW2xpbmRleCAkZGlzcGxheW9yZGVyICRrXQoJCXNldCBpIFtsbHNlYXJjaCAkZGxpc3QgJHhdCgkJaWYgeyRpIDwgMH0gewoJCSAgICBzZXQgaSBbbGxlbmd0aCAkZGxpc3RdCgkJICAgIGxhcHBlbmQgZGxpc3QgJHgKCQl9CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkbm9ocyAkeF0gPCAwfSB7CgkJICAgIGxhcHBlbmQgbm9ocyAkeAoJCX0KCQlpZiB7JHJlaW5zIGVxIHt9ICYmICRvbnNjcmVlbigkeCkgPCAwICYmICRyb29tfSB7CgkJICAgIHNldCByZWlucyBbbGlzdCAkeCAkaV0KCQl9CgkJc2V0IG5ld3Age30KCQlpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkeCldfSB7CgkJICAgIHNldCByaWdodCAwCgkJICAgIGZvcmVhY2ggcCAkcGFyZW50cygkeCkgewoJCQlpZiB7W2xsc2VhcmNoICRkbGlzdCAkcF0gPCAwfSB7CgkJCSAgICBsYXBwZW5kIG5ld3AgJHAKCQkJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJG5vaHMgJHBdIDwgMH0gewoJCQkJbGFwcGVuZCBub2hzICRwCgkJCSAgICB9CgkJCSAgICBpZiB7JHJlaW5zIGVxIHt9ICYmICRvbnNjcmVlbigkcCkgPCAwICYmICRyb29tfSB7CgkJCQlzZXQgcmVpbnMgW2xpc3QgJHAgW2V4cHIgeyRpICsgJHJpZ2h0fV1dCgkJCSAgICB9CgkJCX0KCQkJc2V0IHJpZ2h0IDEKCQkgICAgfQoJCX0KCQlzZXQgbCBbbGluZGV4ICRkbGlzdCAkaV0KCQlpZiB7W2xsZW5ndGggJGxdID09IDF9IHsKCQkgICAgc2V0IGwgJG5ld3AKCQl9IGVsc2UgewoJCSAgICBzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGwgJHhdCgkJICAgIHNldCBsIFtjb25jYXQgW2xyZXBsYWNlICRsICRqICRqXSAkbmV3cF0KCQl9CgkJc2V0IGRsaXN0IFtscmVwbGFjZSAkZGxpc3QgJGkgJGkgJGxdCgkJaWYgeyRyb29tICYmICRpc2ZhdCAmJiBbbGxlbmd0aCAkbmV3cF0gPD0gMX0gewoJCSAgICBzZXQgcm9vbSAwCgkJfQoJICAgIH0KCX0KCglzZXQgZGxldmVsIFtkcmF3c2xhbnRzICRpZCAkcmVpbnMgJG5vaHNdCglkcmF3Y29tbWl0bGluZSAkZGxldmVsCglpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZQoJICAgICYmICRudW1jb21taXRzID49ICRuY211cGRhdGV9IHsKCSAgICBkb3VwZGF0ZSAkcmVhZGluZwoJICAgIGlmIHskc3RvcHBlZH0gYnJlYWsKCX0KICAgIH0KfQoKIyBsZXZlbCBoZXJlIGlzIGFuIGluZGV4IGluIHRvZG8KcHJvYyB1cGRhdGV0b2RvIHtsZXZlbCBub3Nob3J0Y3V0fSB7CiAgICBnbG9iYWwgbmNsZWZ0IHRvZG8gbm5ld3BhcmVudHMKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgcGFyZW50cyBvbnNjcmVlbgoKICAgIHNldCBpZCBbbGluZGV4ICR0b2RvICRsZXZlbF0KICAgIHNldCBvbGRzIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXX0gewoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJG9sZHMgJHBdIDwgMH0gewoJCWxhcHBlbmQgb2xkcyAkcAoJICAgIH0KCX0KICAgIH0KICAgIGlmIHshJG5vc2hvcnRjdXQgJiYgW2xsZW5ndGggJG9sZHNdID09IDF9IHsKCXNldCBwIFtsaW5kZXggJG9sZHMgMF0KCWlmIHskbmNsZWZ0KCRwKSA9PSAxICYmIFtsc2VhcmNoIC1leGFjdCAkdG9kbyAkcF0gPCAwfSB7CgkgICAgc2V0IG5jbGVmdCgkcCkgMAoJICAgIHNldCB0b2RvIFtscmVwbGFjZSAkdG9kbyAkbGV2ZWwgJGxldmVsICRwXQoJICAgIHNldCBvbnNjcmVlbigkcCkgMAoJICAgIHNldCBubmV3cGFyZW50cygkaWQpIDEKCSAgICByZXR1cm4gMAoJfQogICAgfQoKICAgIHNldCB0b2RvIFtscmVwbGFjZSAkdG9kbyAkbGV2ZWwgJGxldmVsXQogICAgc2V0IGkgJGxldmVsCiAgICBzZXQgbiAwCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJaW5jciBuY2xlZnQoJHApIC0xCglzZXQgayBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJHBdCglpZiB7JGsgPCAwfSB7CgkgICAgc2V0IHRvZG8gW2xpbnNlcnQgJHRvZG8gJGkgJHBdCgkgICAgc2V0IG9uc2NyZWVuKCRwKSAwCgkgICAgaW5jciBpCgkgICAgaW5jciBuCgl9CiAgICB9CiAgICBzZXQgbm5ld3BhcmVudHMoJGlkKSAkbgoKICAgIHJldHVybiAxCn0KCnByb2MgZGVjaWRlbmV4dCB7e25vcmVhZCAwfX0gewogICAgZ2xvYmFsIG5jbGVmdCB0b2RvCiAgICBnbG9iYWwgZGF0ZW1vZGUgY2RhdGUKICAgIGdsb2JhbCBjb21taXRpbmZvCgogICAgIyBjaG9vc2Ugd2hpY2ggb25lIHRvIGRvIG5leHQgdGltZSBhcm91bmQKICAgIHNldCB0b2RvbCBbbGxlbmd0aCAkdG9kb10KICAgIHNldCBsZXZlbCAtMQogICAgc2V0IGxhdGVzdCB7fQogICAgZm9yIHtzZXQgayAkdG9kb2x9IHtbaW5jciBrIC0xXSA+PSAwfSB7fSB7CglzZXQgcCBbbGluZGV4ICR0b2RvICRrXQoJaWYgeyRuY2xlZnQoJHApID09IDB9IHsKCSAgICBpZiB7JGRhdGVtb2RlfSB7CgkJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkcCldfSB7CgkJICAgIGlmIHskbm9yZWFkfSB7CgkJCXJldHVybiB7fQoJCSAgICB9CgkJICAgIHJlYWRjb21taXQgJHAKCQl9CgkJaWYgeyRsYXRlc3QgPT0ge30gfHwgJGNkYXRlKCRwKSA+ICRsYXRlc3R9IHsKCQkgICAgc2V0IGxldmVsICRrCgkJICAgIHNldCBsYXRlc3QgJGNkYXRlKCRwKQoJCX0KCSAgICB9IGVsc2UgewoJCXNldCBsZXZlbCAkawoJCWJyZWFrCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRsZXZlbCA8IDB9IHsKCWlmIHskdG9kbyAhPSB7fX0gewoJICAgIHB1dHMgIkVSUk9SOiBub25lIG9mIHRoZSBwZW5kaW5nIGNvbW1pdHMgY2FuIGJlIGRvbmUgeWV0OiIKCSAgICBmb3JlYWNoIHAgJHRvZG8gewoJCXB1dHMgIiAgJHAgKCRuY2xlZnQoJHApKSIKCSAgICB9Cgl9CglyZXR1cm4gLTEKICAgIH0KCiAgICByZXR1cm4gJGxldmVsCn0KCnByb2MgZHJhd2NvbW1pdCB7aWR9IHsKICAgIGdsb2JhbCBwaGFzZSB0b2RvIG5jaGlsZHJlbiBkYXRlbW9kZSBuZXh0dXBkYXRlCiAgICBnbG9iYWwgbnVtY29tbWl0cyBuY211cGRhdGUgZGlzcGxheW9yZGVyIHRvZG8gb25zY3JlZW4KCiAgICBpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCXNldCBwaGFzZSBpbmNyZHJhdwoJc2V0IGRpc3BsYXlvcmRlciB7fQoJc2V0IHRvZG8ge30KCWluaXRncmFwaAogICAgfQogICAgaWYgeyRuY2hpbGRyZW4oJGlkKSA9PSAwfSB7CglsYXBwZW5kIHRvZG8gJGlkCglzZXQgb25zY3JlZW4oJGlkKSAwCiAgICB9CiAgICBzZXQgbGV2ZWwgW2RlY2lkZW5leHQgMV0KICAgIGlmIHskbGV2ZWwgPT0ge30gfHwgJGlkICE9IFtsaW5kZXggJHRvZG8gJGxldmVsXX0gewoJcmV0dXJuCiAgICB9CiAgICB3aGlsZSAxIHsKCWxhcHBlbmQgZGlzcGxheW9yZGVyIFtsaW5kZXggJHRvZG8gJGxldmVsXQoJaWYge1t1cGRhdGV0b2RvICRsZXZlbCAkZGF0ZW1vZGVdfSB7CgkgICAgc2V0IGxldmVsIFtkZWNpZGVuZXh0IDFdCgkgICAgaWYgeyRsZXZlbCA9PSB7fX0gYnJlYWsKCX0KCXNldCBpZCBbbGluZGV4ICR0b2RvICRsZXZlbF0KCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXX0gewoJICAgIGJyZWFrCgl9CiAgICB9CiAgICBkcmF3bW9yZSAxCn0KCnByb2MgZmluaXNoY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgcGhhc2UKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGN0ZXh0IG1haW5jdXJzb3IgdGV4dGN1cnNvcgoKICAgIGlmIHskcGhhc2UgIT0gImluY3JkcmF3In0gewoJJGNhbnYgZGVsZXRlIGFsbAoJJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiIFwKCSAgICAtZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGV4dGl0ZW1zCglzZXQgcGhhc2Uge30KICAgIH0gZWxzZSB7CglkcmF3cmVzdAogICAgfQogICAgLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgogICAgc2V0dGV4dGN1cnNvciAkdGV4dGN1cnNvcgp9CgojIERvbid0IGNoYW5nZSB0aGUgdGV4dCBwYW5lIGN1cnNvciBpZiBpdCBpcyBjdXJyZW50bHkgdGhlIGhhbmQgY3Vyc29yLAojIHNob3dpbmcgdGhhdCB3ZSBhcmUgb3ZlciBhIHNoYTEgSUQgbGluay4KcHJvYyBzZXR0ZXh0Y3Vyc29yIHtjfSB7CiAgICBnbG9iYWwgY3RleHQgY3VydGV4dGN1cnNvcgoKICAgIGlmIHtbJGN0ZXh0IGNnZXQgLWN1cnNvcl0gPT0gJGN1cnRleHRjdXJzb3J9IHsKCSRjdGV4dCBjb25maWcgLWN1cnNvciAkYwogICAgfQogICAgc2V0IGN1cnRleHRjdXJzb3IgJGMKfQoKcHJvYyBkcmF3Z3JhcGgge30gewogICAgZ2xvYmFsIG5leHR1cGRhdGUgc3RhcnRtc2VjcyBuY211cGRhdGUKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgb25zY3JlZW4KCiAgICBpZiB7JGRpc3BsYXlvcmRlciA9PSB7fX0gcmV0dXJuCiAgICBzZXQgc3RhcnRtc2VjcyBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciAkc3RhcnRtc2VjcyArIDEwMF0KICAgIHNldCBuY211cGRhdGUgMQogICAgaW5pdGdyYXBoCiAgICBmb3JlYWNoIGlkICRkaXNwbGF5b3JkZXIgewoJc2V0IG9uc2NyZWVuKCRpZCkgMAogICAgfQogICAgZHJhd21vcmUgMAp9Cgpwcm9jIGRyYXdyZXN0IHt9IHsKICAgIGdsb2JhbCBwaGFzZSBzdG9wcGVkIHJlZGlzcGxheWluZyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBkYXRlbW9kZSB0b2RvIGRpc3BsYXlvcmRlcgogICAgZ2xvYmFsIG51bWNvbW1pdHMgbmNtdXBkYXRlCiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBzdGFydG1zZWNzCgogICAgc2V0IGxldmVsIFtkZWNpZGVuZXh0XQogICAgaWYgeyRsZXZlbCA+PSAwfSB7CglzZXQgcGhhc2UgZHJhd2dyYXBoCgl3aGlsZSAxIHsKCSAgICBsYXBwZW5kIGRpc3BsYXlvcmRlciBbbGluZGV4ICR0b2RvICRsZXZlbF0KCSAgICBzZXQgaGFyZCBbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXQoJICAgIGlmIHskaGFyZH0gewoJCXNldCBsZXZlbCBbZGVjaWRlbmV4dF0KCQlpZiB7JGxldmVsIDwgMH0gYnJlYWsKCSAgICB9Cgl9CglkcmF3bW9yZSAwCiAgICB9CiAgICBzZXQgcGhhc2Uge30KICAgIHNldCBkcmF3bXNlY3MgW2V4cHIgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzXQogICAgI3B1dHMgIm92ZXJhbGwgJGRyYXdtc2VjcyBtcyBmb3IgJG51bWNvbW1pdHMgY29tbWl0cyIKICAgIGlmIHskcmVkaXNwbGF5aW5nfSB7CglpZiB7JHN0b3BwZWQgPT0gMCAmJiBbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJICAgIHNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCgl9CglpZiB7JHN0b3BwZWQgPT0gMX0gewoJICAgIHNldCBzdG9wcGVkIDAKCSAgICBhZnRlciBpZGxlIGRyYXdncmFwaAoJfSBlbHNlIHsKCSAgICBzZXQgcmVkaXNwbGF5aW5nIDAKCX0KICAgIH0KfQoKcHJvYyBmaW5kbWF0Y2hlcyB7Zn0gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCiAgICBpZiB7JGZpbmR0eXBlID09ICJSZWdleHAifSB7CglzZXQgbWF0Y2hlcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSAkZm91bmRzdHJpbmcgJGZdCiAgICB9IGVsc2UgewoJaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgc3RyIFtzdHJpbmcgdG9sb3dlciAkZl0KCX0gZWxzZSB7CgkgICAgc2V0IHN0ciAkZgoJfQoJc2V0IG1hdGNoZXMge30KCXNldCBpIDAKCXdoaWxlIHtbc2V0IGogW3N0cmluZyBmaXJzdCAkZm91bmRzdHJpbmcgJHN0ciAkaV1dID49IDB9IHsKCSAgICBsYXBwZW5kIG1hdGNoZXMgW2xpc3QgJGogW2V4cHIgJGorJGZvdW5kc3RybGVuLTFdXQoJICAgIHNldCBpIFtleHByICRqICsgJGZvdW5kc3RybGVuXQoJfQogICAgfQogICAgcmV0dXJuICRtYXRjaGVzCn0KCnByb2MgZG9maW5kIHt9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kbG9jIGZpbmRzdHJpbmcgbWFya2VkbWF0Y2hlcyBjb21taXRpbmZvCiAgICBnbG9iYWwgbnVtY29tbWl0cyBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBtYWluZm9udCBuYW1lZm9udCBjYW52IGNhbnYyIGNhbnYzIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZm91bmRzdHJpbmcgZm91bmRzdHJsZW4KCiAgICBzdG9wZmluZHByb2MKICAgIHVubWFya21hdGNoZXMKICAgIGZvY3VzIC4KICAgIHNldCBtYXRjaGluZ2xpbmVzIHt9CiAgICBpZiB7JGZpbmRsb2MgPT0gIlBpY2theGUifSB7CglmaW5kcGF0Y2hlcwoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJc2V0IGZvdW5kc3RyaW5nIFtzdHJpbmcgdG9sb3dlciAkZmluZHN0cmluZ10KICAgIH0gZWxzZSB7CglzZXQgZm91bmRzdHJpbmcgJGZpbmRzdHJpbmcKICAgIH0KICAgIHNldCBmb3VuZHN0cmxlbiBbc3RyaW5nIGxlbmd0aCAkZmluZHN0cmluZ10KICAgIGlmIHskZm91bmRzdHJsZW4gPT0gMH0gcmV0dXJuCiAgICBpZiB7JGZpbmRsb2MgPT0gIkZpbGVzIn0gewoJZmluZGZpbGVzCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBvbGRzZWwgLTEKICAgIH0gZWxzZSB7CglzZXQgb2xkc2VsICRzZWxlY3RlZGxpbmUKICAgIH0KICAgIHNldCBkaWRzZWwgMAogICAgc2V0IGZsZHR5cGVzIHtIZWFkbGluZSBBdXRob3IgRGF0ZSBDb21taXR0ZXIgQ0RhdGUgQ29tbWVudH0KICAgIGZvciB7c2V0IGwgMH0geyRsIDwgJG51bWNvbW1pdHN9IHtpbmNyIGx9IHsKCXNldCBpZCAkbGluZWlkKCRsKQoJc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQoJc2V0IGRvZXNtYXRjaCAwCglmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCSAgICBpZiB7JGZpbmRsb2MgIT0gIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jICE9ICR0eX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCSAgICBpZiB7JG1hdGNoZXMgPT0ge319IGNvbnRpbnVlCgkgICAgc2V0IGRvZXNtYXRjaCAxCgkgICAgaWYgeyR0eSA9PSAiSGVhZGxpbmUifSB7CgkJbWFya21hdGNoZXMgJGNhbnYgJGwgJGYgJGxpbmVodGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9IGVsc2VpZiB7JHR5ID09ICJBdXRob3IifSB7CgkJbWFya21hdGNoZXMgJGNhbnYyICRsICRmICRsaW5lbnRhZygkbCkgJG1hdGNoZXMgJG5hbWVmb250CgkgICAgfSBlbHNlaWYgeyR0eSA9PSAiRGF0ZSJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudjMgJGwgJGYgJGxpbmVkdGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9Cgl9CglpZiB7JGRvZXNtYXRjaH0gewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJICAgIGlmIHshJGRpZHNlbCAmJiAkbCA+ICRvbGRzZWx9IHsKCQlmaW5kc2VsZWN0bGluZSAkbAoJCXNldCBkaWRzZWwgMQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbWF0Y2hpbmdsaW5lcyA9PSB7fX0gewoJYmVsbAogICAgfSBlbHNlaWYgeyEkZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdCiAgICB9Cn0KCnByb2MgZmluZHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQKICAgIHNlbGVjdGxpbmUgJGwgMQogICAgaWYgeyRmaW5kbG9jID09ICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyA9PSAiQ29tbWVudHMifSB7CgkjIGhpZ2hsaWdodCB0aGUgbWF0Y2hlcyBpbiB0aGUgY29tbWVudHMKCXNldCBmIFskY3RleHQgZ2V0IDEuMCAkY29tbWVudGVuZF0KCXNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCWZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJICAgIHNldCBlbmQgW2V4cHIgW2xpbmRleCAkbWF0Y2ggMV0gKyAxXQoJICAgICRjdGV4dCB0YWcgYWRkIGZvdW5kICIxLjAgKyAkc3RhcnQgYyIgIjEuMCArICRlbmQgYyIKCX0KICAgIH0KfQoKcHJvYyBmaW5kbmV4dCB7cmVzdGFydH0gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJaWYgeyRyZXN0YXJ0fSB7CgkgICAgZG9maW5kCgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgZm9yZWFjaCBsICRtYXRjaGluZ2xpbmVzIHsKCWlmIHskbCA+ICRzZWxlY3RlZGxpbmV9IHsKCSAgICBmaW5kc2VsZWN0bGluZSAkbAoJICAgIHJldHVybgoJfQogICAgfQogICAgYmVsbAp9Cgpwcm9jIGZpbmRwcmV2IHt9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbWF0Y2hpbmdsaW5lc119IHsKCWRvZmluZAoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBwcmV2IHt9CiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID49ICRzZWxlY3RlZGxpbmV9IGJyZWFrCglzZXQgcHJldiAkbAogICAgfQogICAgaWYgeyRwcmV2ICE9IHt9fSB7CglmaW5kc2VsZWN0bGluZSAkcHJldgogICAgfSBlbHNlIHsKCWJlbGwKICAgIH0KfQoKcHJvYyBmaW5kbG9jY2hhbmdlIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgZmluZGxvYyBmaW5kdHlwZSBmaW5kdHlwZW1lbnUKICAgIGlmIHskZmluZGxvYyA9PSAiUGlja2F4ZSJ9IHsKCXNldCBmaW5kdHlwZSBFeGFjdAoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgJGZpbmR0eXBlbWVudSBlbnRyeWNvbmYgMSAtc3RhdGUgJHN0YXRlCiAgICAkZmluZHR5cGVtZW51IGVudHJ5Y29uZiAyIC1zdGF0ZSAkc3RhdGUKfQoKcHJvYyBzdG9wZmluZHByb2Mge3tkb25lIDB9fSB7CiAgICBnbG9iYWwgZmluZHByb2NwaWQgZmluZHByb2NmaWxlIGZpbmRpZHMKICAgIGdsb2JhbCBjdGV4dCBmaW5kb2xkY3Vyc29yIHBoYXNlIG1haW5jdXJzb3IgdGV4dGN1cnNvcgogICAgZ2xvYmFsIGZpbmRpbnByb2dyZXNzCgogICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRwcm9jcGlkXX0gewoJaWYgeyEkZG9uZX0gewoJICAgIGNhdGNoIHtleGVjIGtpbGwgJGZpbmRwcm9jcGlkfQoJfQoJY2F0Y2gge2Nsb3NlICRmaW5kcHJvY2ZpbGV9Cgl1bnNldCBmaW5kcHJvY3BpZAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kaW5wcm9ncmVzc119IHsKCXVuc2V0IGZpbmRpbnByb2dyZXNzCglpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCSAgICAuIGNvbmZpZyAtY3Vyc29yICRtYWluY3Vyc29yCgkgICAgc2V0dGV4dGN1cnNvciAkdGV4dGN1cnNvcgoJfQogICAgfQp9Cgpwcm9jIGZpbmRwYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBmaW5kc3RyaW5nIHNlbGVjdGVkbGluZSBudW1jb21taXRzCiAgICBnbG9iYWwgZmluZHByb2NwaWQgZmluZHByb2NmaWxlCiAgICBnbG9iYWwgZmluZGRpZHNlbCBjdGV4dCBsaW5laWQgZmluZGlucHJvZ3Jlc3MKICAgIGdsb2JhbCBmaW5kaW5zZXJ0cG9zCgogICAgaWYgeyRudW1jb21taXRzID09IDB9IHJldHVybgoKICAgICMgbWFrZSBhIGxpc3Qgb2YgYWxsIHRoZSBpZHMgdG8gc2VhcmNoLCBzdGFydGluZyBhdCB0aGUgb25lCiAgICAjIGFmdGVyIHRoZSBzZWxlY3RlZCBsaW5lIChpZiBhbnkpCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBsICRzZWxlY3RlZGxpbmUKICAgIH0gZWxzZSB7CglzZXQgbCAtMQogICAgfQogICAgc2V0IGlucHV0aWRzIHt9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRudW1jb21taXRzfSB7aW5jciBpfSB7CglpZiB7W2luY3IgbF0gPj0gJG51bWNvbW1pdHN9IHsKCSAgICBzZXQgbCAwCgl9CglhcHBlbmQgaW5wdXRpZHMgJGxpbmVpZCgkbCkgIlxuIgogICAgfQoKICAgIGlmIHtbY2F0Y2ggewoJc2V0IGYgW29wZW4gW2xpc3QgfCBnaXQtZGlmZi10cmVlIC0tc3RkaW4gLXMgLXIgLVMkZmluZHN0cmluZyBcCgkJCSA8PCAkaW5wdXRpZHNdIHJdCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBzdGFydGluZyBzZWFyY2ggcHJvY2VzczogJGVyciIKCXJldHVybgogICAgfQoKICAgIHNldCBmaW5kaW5zZXJ0cG9zIGVuZAogICAgc2V0IGZpbmRwcm9jZmlsZSAkZgogICAgc2V0IGZpbmRwcm9jcGlkIFtwaWQgJGZdCiAgICBmY29uZmlndXJlICRmIC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGYgcmVhZGFibGUgcmVhZGZpbmRwcm9jCiAgICBzZXQgZmluZGRpZHNlbCAwCiAgICAuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCiAgICBzZXR0ZXh0Y3Vyc29yIHdhdGNoCiAgICBzZXQgZmluZGlucHJvZ3Jlc3MgMQp9Cgpwcm9jIHJlYWRmaW5kcHJvYyB7fSB7CiAgICBnbG9iYWwgZmluZHByb2NmaWxlIGZpbmRkaWRzZWwKICAgIGdsb2JhbCBpZGxpbmUgbWF0Y2hpbmdsaW5lcyBmaW5kaW5zZXJ0cG9zCgogICAgc2V0IG4gW2dldHMgJGZpbmRwcm9jZmlsZSBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJGZpbmRwcm9jZmlsZV19IHsKCSAgICBzdG9wZmluZHByb2MgMQoJICAgIGlmIHshJGZpbmRkaWRzZWx9IHsKCQliZWxsCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJZXJyb3JfcG9wdXAgIkNhbid0IHBhcnNlIGdpdC1kaWZmLXRyZWUgb3V0cHV0OiAkbGluZSIKCXN0b3BmaW5kcHJvYwoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXB1dHMgc3RkZXJyICJzcHVyaW91cyBpZDogJGlkIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgbCAkaWRsaW5lKCRpZCkKICAgIGluc2VydG1hdGNoICRsICRpZAp9Cgpwcm9jIGluc2VydG1hdGNoIHtsIGlkfSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmaW5kaW5zZXJ0cG9zIGZpbmRkaWRzZWwKCiAgICBpZiB7JGZpbmRpbnNlcnRwb3MgPT0gImVuZCJ9IHsKCWlmIHskbWF0Y2hpbmdsaW5lcyAhPSB7fSAmJiAkbCA8IFtsaW5kZXggJG1hdGNoaW5nbGluZXMgMF19IHsKCSAgICBzZXQgbWF0Y2hpbmdsaW5lcyBbbGluc2VydCAkbWF0Y2hpbmdsaW5lcyAwICRsXQoJICAgIHNldCBmaW5kaW5zZXJ0cG9zIDEKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCBtYXRjaGluZ2xpbmVzICRsCgl9CiAgICB9IGVsc2UgewoJc2V0IG1hdGNoaW5nbGluZXMgW2xpbnNlcnQgJG1hdGNoaW5nbGluZXMgJGZpbmRpbnNlcnRwb3MgJGxdCglpbmNyIGZpbmRpbnNlcnRwb3MKICAgIH0KICAgIG1hcmtoZWFkbGluZSAkbCAkaWQKICAgIGlmIHshJGZpbmRkaWRzZWx9IHsKCWZpbmRzZWxlY3RsaW5lICRsCglzZXQgZmluZGRpZHNlbCAxCiAgICB9Cn0KCnByb2MgZmluZGZpbGVzIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cyBsaW5laWQgY3RleHQKICAgIGdsb2JhbCBmZmlsZWxpbmUgZmluZGRpZHNlbCBwYXJlbnRzIG5wYXJlbnRzCiAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MgZmluZHN0YXJ0bGluZSBmaW5kaW5zZXJ0cG9zCiAgICBnbG9iYWwgdHJlZWRpZmZzIGZkaWZmaWRzIGZkaWZmc25lZWRlZCBmZGlmZnBvcwogICAgZ2xvYmFsIGZpbmRtZXJnZWZpbGVzCgogICAgaWYgeyRudW1jb21taXRzID09IDB9IHJldHVybgoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAxfV0KICAgIH0gZWxzZSB7CglzZXQgbCAwCiAgICB9CiAgICBzZXQgZmZpbGVsaW5lICRsCiAgICBzZXQgZmluZHN0YXJ0bGluZSAkbAogICAgc2V0IGRpZmZzbmVlZGVkIHt9CiAgICBzZXQgZmRpZmZzbmVlZGVkIHt9CiAgICB3aGlsZSAxIHsKCXNldCBpZCAkbGluZWlkKCRsKQoJaWYgeyRmaW5kbWVyZ2VmaWxlcyB8fCAkbnBhcmVudHMoJGlkKSA9PSAxfSB7CgkgICAgZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJCWlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcyhbbGlzdCAkaWQgJHBdKV19IHsKCQkgICAgYXBwZW5kIGRpZmZzbmVlZGVkICIkaWQgJHBcbiIKCQkgICAgbGFwcGVuZCBmZGlmZnNuZWVkZWQgW2xpc3QgJGlkICRwXQoJCX0KCSAgICB9Cgl9CglpZiB7W2luY3IgbF0gPj0gJG51bWNvbW1pdHN9IHsKCSAgICBzZXQgbCAwCgl9CglpZiB7JGwgPT0gJGZpbmRzdGFydGxpbmV9IGJyZWFrCiAgICB9CgogICAgIyBzdGFydCBvZmYgYSBnaXQtZGlmZi10cmVlIHByb2Nlc3MgaWYgbmVlZGVkCiAgICBpZiB7JGRpZmZzbmVlZGVkIG5lIHt9fSB7CglpZiB7W2NhdGNoIHsKCSAgICBzZXQgZGYgW29wZW4gW2xpc3QgfCBnaXQtZGlmZi10cmVlIC1yIC0tc3RkaW4gPDwgJGRpZmZzbmVlZGVkXSByXQoJfSBlcnIgXX0gewoJICAgIGVycm9yX3BvcHVwICJFcnJvciBzdGFydGluZyBzZWFyY2ggcHJvY2VzczogJGVyciIKCSAgICByZXR1cm4KCX0KCWNhdGNoIHt1bnNldCBmZGlmZmlkc30KCXNldCBmZGlmZnBvcyAwCglmY29uZmlndXJlICRkZiAtYmxvY2tpbmcgMAoJZmlsZWV2ZW50ICRkZiByZWFkYWJsZSBbbGlzdCByZWFkZmlsZWRpZmZzICRkZl0KICAgIH0KCiAgICBzZXQgZmluZGRpZHNlbCAwCiAgICBzZXQgZmluZGluc2VydHBvcyBlbmQKICAgIHNldCBpZCAkbGluZWlkKCRsKQogICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpIDBdCiAgICAuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCiAgICBzZXR0ZXh0Y3Vyc29yIHdhdGNoCiAgICBzZXQgZmluZGlucHJvZ3Jlc3MgMQogICAgZmluZGNvbnQgW2xpc3QgJGlkICRwXQogICAgdXBkYXRlCn0KCnByb2MgcmVhZGZpbGVkaWZmcyB7ZGZ9IHsKICAgIGdsb2JhbCBmaW5kaWRzIGZkaWZmaWRzIGZkaWZmcwoKICAgIHNldCBuIFtnZXRzICRkZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJGRmXX0gewoJICAgIGRvbmVmaWxlZGlmZgoJICAgIGlmIHtbY2F0Y2gge2Nsb3NlICRkZn0gZXJyXX0gewoJCXN0b3BmaW5kcHJvYwoJCWJlbGwKCQllcnJvcl9wb3B1cCAiRXJyb3IgaW4gZ2l0LWRpZmYtdHJlZTogJGVyciIKCSAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGZpbmRpZHNdfSB7CgkJc2V0IGlkcyAkZmluZGlkcwoJCXN0b3BmaW5kcHJvYwoJCWJlbGwKCQllcnJvcl9wb3B1cCAiQ291bGRuJ3QgZmluZCBkaWZmcyBmb3IgeyRpZHN9IgoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYge1tyZWdleHAge14oWzAtOWEtZl17NDB9KSBcKGZyb20gKFswLTlhLWZdezQwfSlcKX0gJGxpbmUgbWF0Y2ggaWQgcF19IHsKCSMgc3RhcnQgb2YgYSBuZXcgc3RyaW5nIG9mIGRpZmZzCglkb25lZmlsZWRpZmYKCXNldCBmZGlmZmlkcyBbbGlzdCAkaWQgJHBdCglzZXQgZmRpZmZzIHt9CiAgICB9IGVsc2VpZiB7W3N0cmluZyBtYXRjaCAiOioiICRsaW5lXX0gewoJbGFwcGVuZCBmZGlmZnMgW2xpbmRleCAkbGluZSA1XQogICAgfQp9Cgpwcm9jIGRvbmVmaWxlZGlmZiB7fSB7CiAgICBnbG9iYWwgZmRpZmZpZHMgZmRpZmZzIHRyZWVkaWZmcyBmaW5kaWRzCiAgICBnbG9iYWwgZmRpZmZzbmVlZGVkIGZkaWZmcG9zCgogICAgaWYge1tpbmZvIGV4aXN0cyBmZGlmZmlkc119IHsKCXdoaWxlIHtbbGluZGV4ICRmZGlmZnNuZWVkZWQgJGZkaWZmcG9zXSBuZSAkZmRpZmZpZHMKCSAgICAgICAmJiAkZmRpZmZwb3MgPCBbbGxlbmd0aCAkZmRpZmZzbmVlZGVkXX0gewoJICAgICMgZ2l0LWRpZmYtdHJlZSBkb2Vzbid0IG91dHB1dCBhbnl0aGluZyBmb3IgYSBjb21taXQKCSAgICAjIHdoaWNoIGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nCgkgICAgc2V0IG51bGxpZHMgW2xpbmRleCAkZmRpZmZzbmVlZGVkICRmZGlmZnBvc10KCSAgICBzZXQgdHJlZWRpZmZzKCRudWxsaWRzKSB7fQoJICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZGlkc10gJiYgJG51bGxpZHMgZXEgJGZpbmRpZHN9IHsKCQl1bnNldCBmaW5kaWRzCgkJZmluZGNvbnQgJG51bGxpZHMKCSAgICB9CgkgICAgaW5jciBmZGlmZnBvcwoJfQoJaW5jciBmZGlmZnBvcwoKCWlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkZmRpZmZpZHMpXX0gewoJICAgIHNldCB0cmVlZGlmZnMoJGZkaWZmaWRzKSAkZmRpZmZzCgl9CglpZiB7W2luZm8gZXhpc3RzIGZpbmRpZHNdICYmICRmZGlmZmlkcyBlcSAkZmluZGlkc30gewoJICAgIHVuc2V0IGZpbmRpZHMKCSAgICBmaW5kY29udCAkZmRpZmZpZHMKCX0KICAgIH0KfQoKcHJvYyBmaW5kY29udCB7aWRzfSB7CiAgICBnbG9iYWwgZmluZGlkcyB0cmVlZGlmZnMgcGFyZW50cyBucGFyZW50cwogICAgZ2xvYmFsIGZmaWxlbGluZSBmaW5kc3RhcnRsaW5lIGZpbmRkaWRzZWwKICAgIGdsb2JhbCBsaW5laWQgbnVtY29tbWl0cyBtYXRjaGluZ2xpbmVzIGZpbmRpbnByb2dyZXNzCiAgICBnbG9iYWwgZmluZG1lcmdlZmlsZXMKCiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIHNldCBwaSBbbHNlYXJjaCAtZXhhY3QgJHBhcmVudHMoJGlkKSAkcF0KICAgIHNldCBsICRmZmlsZWxpbmUKICAgIHdoaWxlIDEgewoJaWYgeyRmaW5kbWVyZ2VmaWxlcyB8fCAkbnBhcmVudHMoJGlkKSA9PSAxfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0gewoJCXNldCBmaW5kaWRzICRpZHMKCQlzZXQgZmZpbGVsaW5lICRsCgkJcmV0dXJuCgkgICAgfQoJICAgIHNldCBkb2VzbWF0Y2ggMAoJICAgIGZvcmVhY2ggZiAkdHJlZWRpZmZzKCRpZHMpIHsKCQlzZXQgeCBbZmluZG1hdGNoZXMgJGZdCgkJaWYgeyR4ICE9IHt9fSB7CgkJICAgIHNldCBkb2VzbWF0Y2ggMQoJCSAgICBicmVhawoJCX0KCSAgICB9CgkgICAgaWYgeyRkb2VzbWF0Y2h9IHsKCQlpbnNlcnRtYXRjaCAkbCAkaWQKCQlzZXQgcGkgJG5wYXJlbnRzKCRpZCkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBwaSAkbnBhcmVudHMoJGlkKQoJfQoJaWYge1tpbmNyIHBpXSA+PSAkbnBhcmVudHMoJGlkKX0gewoJICAgIHNldCBwaSAwCgkgICAgaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkJc2V0IGwgMAoJICAgIH0KCSAgICBpZiB7JGwgPT0gJGZpbmRzdGFydGxpbmV9IGJyZWFrCgkgICAgc2V0IGlkICRsaW5laWQoJGwpCgl9CglzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRpZCkgJHBpXQoJc2V0IGlkcyBbbGlzdCAkaWQgJHBdCiAgICB9CiAgICBzdG9wZmluZHByb2MKICAgIGlmIHshJGZpbmRkaWRzZWx9IHsKCWJlbGwKICAgIH0KfQoKIyBtYXJrIGEgY29tbWl0IGFzIG1hdGNoaW5nIGJ5IHB1dHRpbmcgYSB5ZWxsb3cgYmFja2dyb3VuZAojIGJlaGluZCB0aGUgaGVhZGxpbmUKcHJvYyBtYXJraGVhZGxpbmUge2wgaWR9IHsKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGxpbmVodGFnIGNvbW1pdGluZm8KCiAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0ICRiYm94IC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQogICAgJGNhbnYgbG93ZXIgJHQKfQoKIyBtYXJrIHRoZSBiaXRzIG9mIGEgaGVhZGxpbmUsIGF1dGhvciBvciBkYXRlIHRoYXQgbWF0Y2ggYSBmaW5kIHN0cmluZwpwcm9jIG1hcmttYXRjaGVzIHtjYW52IGwgc3RyIHRhZyBtYXRjaGVzIGZvbnR9IHsKICAgIHNldCBiYm94IFskY2FudiBiYm94ICR0YWddCiAgICBzZXQgeDAgW2xpbmRleCAkYmJveCAwXQogICAgc2V0IHkwIFtsaW5kZXggJGJib3ggMV0KICAgIHNldCB5MSBbbGluZGV4ICRiYm94IDNdCiAgICBmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKCXNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJc2V0IGVuZCBbbGluZGV4ICRtYXRjaCAxXQoJaWYgeyRzdGFydCA+ICRlbmR9IGNvbnRpbnVlCglzZXQgeG9mZiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByICRzdGFydC0xXV1dCglzZXQgeGxlbiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByICRlbmRdXV0KCXNldCB0IFskY2FudiBjcmVhdGUgcmVjdCBbZXhwciAkeDArJHhvZmZdICR5MCBbZXhwciAkeDArJHhsZW4rMl0gJHkxIFwKCQkgICAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KCSRjYW52IGxvd2VyICR0CiAgICB9Cn0KCnByb2MgdW5tYXJrbWF0Y2hlcyB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmaW5kaWRzCiAgICBhbGxjYW52cyBkZWxldGUgbWF0Y2hlcwogICAgY2F0Y2gge3Vuc2V0IG1hdGNoaW5nbGluZXN9CiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KfQoKcHJvYyBzZWxjYW52bGluZSB7dyB4IHl9IHsKICAgIGdsb2JhbCBjYW52IGNhbnZ5MCBjdGV4dCBsaW5lc3BjCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnIHJvd3RleHR4CiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQogICAgc2V0IGwgW2V4cHIge2ludCgoJHkgLSAkY2FudnkwKSAvICRsaW5lc3BjICsgMC41KX1dCiAgICBpZiB7JGwgPCAwfSB7CglzZXQgbCAwCiAgICB9CiAgICBpZiB7JHcgZXEgJGNhbnZ9IHsKCWlmIHshW2luZm8gZXhpc3RzIHJvd3RleHR4KCRsKV0gfHwgJHggPCAkcm93dGV4dHgoJGwpfSByZXR1cm4KICAgIH0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIGNvbW1pdF9kZXNjcmlwdG9yIHtwfSB7CiAgICBnbG9iYWwgY29tbWl0aW5mbwogICAgc2V0IGwgIi4uLiIKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkcCldfSB7CglzZXQgbCBbbGluZGV4ICRjb21taXRpbmZvKCRwKSAwXQogICAgfQogICAgcmV0dXJuICIkcCAoJGwpIgp9CgojIGFwcGVuZCBzb21lIHRleHQgdG8gdGhlIGN0ZXh0IHdpZGdldCwgYW5kIG1ha2UgYW55IFNIQTEgSUQKIyB0aGF0IHdlIGtub3cgYWJvdXQgYmUgYSBjbGlja2FibGUgbGluay4KcHJvYyBhcHBlbmR3aXRobGlua3Mge3RleHR9IHsKICAgIGdsb2JhbCBjdGV4dCBpZGxpbmUgbGlua251bQoKICAgIHNldCBzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkdGV4dAogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgc2V0IGxpbmtzIFtyZWdleHAgLWluZGljZXMgLWFsbCAtaW5saW5lIHtbMC05YS1mXXs0MH19ICR0ZXh0XQogICAgZm9yZWFjaCBsICRsaW5rcyB7CglzZXQgcyBbbGluZGV4ICRsIDBdCglzZXQgZSBbbGluZGV4ICRsIDFdCglzZXQgbGlua2lkIFtzdHJpbmcgcmFuZ2UgJHRleHQgJHMgJGVdCglpZiB7IVtpbmZvIGV4aXN0cyBpZGxpbmUoJGxpbmtpZCldfSBjb250aW51ZQoJaW5jciBlCgkkY3RleHQgdGFnIGFkZCBsaW5rICIkc3RhcnQgKyAkcyBjIiAiJHN0YXJ0ICsgJGUgYyIKCSRjdGV4dCB0YWcgYWRkIGxpbmskbGlua251bSAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGJpbmQgbGluayRsaW5rbnVtIDwxPiBbbGlzdCBzZWxlY3RsaW5lICRpZGxpbmUoJGxpbmtpZCkgMV0KCWluY3IgbGlua251bQogICAgfQogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQp9Cgpwcm9jIHNlbGVjdGxpbmUge2wgaXNuZXd9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNvbW1pdGluZm8gc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMgcGFyZW50cyBucGFyZW50cyBjaGlsZHJlbgogICAgZ2xvYmFsIGNmbGlzdCBjdXJyZW50aWQgc2hhMWVudHJ5CiAgICBnbG9iYWwgY29tbWVudGVuZCBpZHRhZ3MgaWRsaW5lIGxpbmtudW0KCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgIG5vcm1hbGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIGxpbmVpZCgkbCldIHx8ICFbaW5mbyBleGlzdHMgbGluZWh0YWcoJGwpXX0gcmV0dXJuCiAgICAkY2FudiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYgbG93ZXIgJHQKICAgICRjYW52MiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjIgY3JlYXRlIHJlY3QgWyRjYW52MiBiYm94ICRsaW5lbnRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYyIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYyIGxvd2VyICR0CiAgICAkY2FudjMgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYzIGNyZWF0ZSByZWN0IFskY2FudjMgYmJveCAkbGluZWR0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MyBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52MyBsb3dlciAkdAogICAgc2V0IHkgW2V4cHIgeyRjYW52eTAgKyAkbCAqICRsaW5lc3BjfV0KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIHNldCB5dG9wIFtleHByIHskeSAtICRsaW5lc3BjIC0gMX1dCiAgICBzZXQgeWJvdCBbZXhwciB7JHkgKyAkbGluZXNwYyArIDF9XQogICAgc2V0IHdub3cgWyRjYW52IHl2aWV3XQogICAgc2V0IHd0b3AgW2V4cHIgW2xpbmRleCAkd25vdyAwXSAqICR5bWF4XQogICAgc2V0IHdib3QgW2V4cHIgW2xpbmRleCAkd25vdyAxXSAqICR5bWF4XQogICAgc2V0IHdoIFtleHByIHskd2JvdCAtICR3dG9wfV0KICAgIHNldCBuZXd0b3AgJHd0b3AKICAgIGlmIHskeXRvcCA8ICR3dG9wfSB7CglpZiB7JHlib3QgPCAkd3RvcH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCAkeXRvcAoJICAgIGlmIHskbmV3dG9wID4gJHd0b3AgLSAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wIC0gJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0gZWxzZWlmIHskeWJvdCA+ICR3Ym90fSB7CglpZiB7JHl0b3AgPiAkd2JvdH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHlib3QgLSAkd2h9XQoJICAgIGlmIHskbmV3dG9wIDwgJHd0b3AgKyAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wICsgJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbmV3dG9wICE9ICR3dG9wfSB7CglpZiB7JG5ld3RvcCA8IDB9IHsKCSAgICBzZXQgbmV3dG9wIDAKCX0KCWFsbGNhbnZzIHl2aWV3IG1vdmV0byBbZXhwciAkbmV3dG9wICogMS4wIC8gJHltYXhdCiAgICB9CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNlbGVjdGxpbmUgJGwgMF0KICAgIH0KCiAgICBzZXQgc2VsZWN0ZWRsaW5lICRsCgogICAgc2V0IGlkICRsaW5laWQoJGwpCiAgICBzZXQgY3VycmVudGlkICRpZAogICAgJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgICRzaGExZW50cnkgaW5zZXJ0IDAgJGlkCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiBmcm9tIDAKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIHRvIGVuZAoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgc2V0IGxpbmtudW0gMAogICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLjAgMC4wCiAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLjAgbGVmdAogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkF1dGhvcjogW2xpbmRleCAkaW5mbyAxXSAgW2xpbmRleCAkaW5mbyAyXVxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogW2xpbmRleCAkaW5mbyAzXSAgW2xpbmRleCAkaW5mbyA0XVxuIgogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJUYWdzOiIKCWZvcmVhY2ggdGFnICRpZHRhZ3MoJGlkKSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkdGFnIgoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgfQogCiAgICBzZXQgY29tbWVudCB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBwYXJlbnRzKCRpZCldfSB7Cglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgYXBwZW5kIGNvbW1lbnQgIlBhcmVudDogW2NvbW1pdF9kZXNjcmlwdG9yICRwXVxuIgoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBjaGlsZHJlbigkaWQpXX0gewoJZm9yZWFjaCBjICRjaGlsZHJlbigkaWQpIHsKCSAgICBhcHBlbmQgY29tbWVudCAiQ2hpbGQ6ICBbY29tbWl0X2Rlc2NyaXB0b3IgJGNdXG4iCgl9CiAgICB9CiAgICBhcHBlbmQgY29tbWVudCAiXG4iCiAgICBhcHBlbmQgY29tbWVudCBbbGluZGV4ICRpbmZvIDVdCgogICAgIyBtYWtlIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIFNIQTEgSUQgYmUgYSBjbGlja2FibGUgbGluawogICAgYXBwZW5kd2l0aGxpbmtzICRjb21tZW50CgogICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IGNvbW1lbnRlbmQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCiAgICAkY2ZsaXN0IGluc2VydCBlbmQgIkNvbW1lbnRzIgogICAgaWYgeyRucGFyZW50cygkaWQpID09IDF9IHsKCXN0YXJ0ZGlmZiBbY29uY2F0ICRpZCAkcGFyZW50cygkaWQpXQogICAgfSBlbHNlaWYgeyRucGFyZW50cygkaWQpID4gMX0gewoJbWVyZ2VkaWZmICRpZAogICAgfQp9Cgpwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgJHNlbGVjdGVkbGluZSArICRkaXJdCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyB1bnNlbGVjdGxpbmUge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIGNhdGNoIHt1bnNldCBzZWxlY3RlZGxpbmV9CiAgICBhbGxjYW52cyBkZWxldGUgc2Vjc2VsCn0KCnByb2MgYWRkdG9oaXN0b3J5IHtjbWR9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMAoJJiYgW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0gPT0gJGNtZH0gewoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBoaXN0b3J5IFtscmVwbGFjZSAkaGlzdG9yeSAkaGlzdG9yeWluZGV4IGVuZCAkY21kXQogICAgfSBlbHNlIHsKCWxhcHBlbmQgaGlzdG9yeSAkY21kCiAgICB9CiAgICBpbmNyIGhpc3RvcnlpbmRleAogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9IGVsc2UgewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9CiAgICAuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgZ29iYWNrIHt9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJaW5jciBoaXN0b3J5aW5kZXggLTEKCXNldCBjbWQgW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0KCWV2YWwgJGNtZAoJLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4IDw9IDF9IHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIGdvZm9ydyB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJc2V0IGNtZCBbbGluZGV4ICRoaXN0b3J5ICRoaXN0b3J5aW5kZXhdCglpbmNyIGhpc3RvcnlpbmRleAoJZXZhbCAkY21kCgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA+PSBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCS5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBtZXJnZWRpZmYge2lkfSB7CiAgICBnbG9iYWwgcGFyZW50cyBkaWZmbWVyZ2VpZCBkaWZmbWVyZ2VnY2EgbWVyZ2VmaWxlbGlzdCBkaWZmcGluZGV4CgogICAgc2V0IGRpZmZtZXJnZWlkICRpZAogICAgc2V0IGRpZmZwaW5kZXggLTEKICAgIHNldCBkaWZmbWVyZ2VnY2EgW2ZpbmRnY2EgJHBhcmVudHMoJGlkKV0KICAgIGlmIHtbaW5mbyBleGlzdHMgbWVyZ2VmaWxlbGlzdCgkaWQpXX0gewoJaWYgeyRtZXJnZWZpbGVsaXN0KCRpZCkgbmUge319IHsKCSAgICBzaG93bWVyZ2VkaWZmCgl9CiAgICB9IGVsc2UgewoJY29udG1lcmdlZGlmZiB7fQogICAgfQp9Cgpwcm9jIGZpbmRnY2Ege2lkc30gewogICAgc2V0IGdjYSB7fQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWlmIHskZ2NhIGVxIHt9fSB7CgkgICAgc2V0IGdjYSAkaWQKCX0gZWxzZSB7CgkgICAgaWYge1tjYXRjaCB7CgkJc2V0IGdjYSBbZXhlYyBnaXQtbWVyZ2UtYmFzZSAkZ2NhICRpZF0KCSAgICB9IGVycl19IHsKCQlyZXR1cm4ge30KCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gJGdjYQp9Cgpwcm9jIGNvbnRtZXJnZWRpZmYge2lkc30gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGRpZmZwaW5kZXggcGFyZW50cyBucGFyZW50cyBkaWZmbWVyZ2VnY2EKICAgIGdsb2JhbCB0cmVlZGlmZnMgbWVyZ2VmaWxlbGlzdCBkaWZmaWRzIHRyZWVwZW5kaW5nCgogICAgIyBkaWZmIHRoZSBjaGlsZCBhZ2FpbnN0IGVhY2ggb2YgdGhlIHBhcmVudHMsIGFuZCBkaWZmCiAgICAjIGVhY2ggb2YgdGhlIHBhcmVudHMgYWdhaW5zdCB0aGUgR0NBLgogICAgd2hpbGUgMSB7CglpZiB7W2xpbmRleCAkaWRzIDBdID09ICRkaWZmbWVyZ2VpZCAmJiAkZGlmZm1lcmdlZ2NhIG5lIHt9fSB7CgkgICAgc2V0IGlkcyBbbGlzdCBbbGluZGV4ICRpZHMgMV0gJGRpZmZtZXJnZWdjYV0KCX0gZWxzZSB7CgkgICAgaWYge1tpbmNyIGRpZmZwaW5kZXhdID49ICRucGFyZW50cygkZGlmZm1lcmdlaWQpfSBicmVhawoJICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGRpZmZtZXJnZWlkKSAkZGlmZnBpbmRleF0KCSAgICBzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0KCX0KCWlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCSAgICBzZXQgZGlmZmlkcyAkaWRzCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkJZ2V0dHJlZWRpZmZzICRpZHMKCSAgICB9CgkgICAgcmV0dXJuCgl9CiAgICB9CgogICAgIyBJZiBhIGZpbGUgaW4gc29tZSBwYXJlbnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGNoaWxkIGFuZCBhbHNvCiAgICAjIGRpZmZlcmVudCBmcm9tIHRoZSBHQ0EsIHRoZW4gaXQncyBpbnRlcmVzdGluZy4KICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhIEdDQSwgdGhlbiBhIGZpbGUgaXMgaW50ZXJlc3RpbmcgaWYgaXQgaXMKICAgICMgZGlmZmVyZW50IGZyb20gdGhlIGNoaWxkIGluIGFsbCB0aGUgcGFyZW50cy4KICAgIGlmIHskZGlmZm1lcmdlZ2NhIG5lIHt9fSB7CglzZXQgZmlsZXMge30KCWZvcmVhY2ggcCAkcGFyZW50cygkZGlmZm1lcmdlaWQpIHsKCSAgICBzZXQgZ2NhZGlmZnMgJHRyZWVkaWZmcyhbbGlzdCAkcCAkZGlmZm1lcmdlZ2NhXSkKCSAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcyhbbGlzdCAkZGlmZm1lcmdlaWQgJHBdKSB7CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZmlsZXMgJGZdIDwgMAoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGdjYWRpZmZzICRmXSA+PSAwfSB7CgkJICAgIGxhcHBlbmQgZmlsZXMgJGYKCQl9CgkgICAgfQoJfQoJc2V0IGZpbGVzIFtsc29ydCAkZmlsZXNdCiAgICB9IGVsc2UgewoJc2V0IHAgW2xpbmRleCAkcGFyZW50cygkZGlmZm1lcmdlaWQpIDBdCglzZXQgZmlsZXMgJHRyZWVkaWZmcyhbbGlzdCAkZGlmZm1lcmdlaWQgJHBdKQoJZm9yIHtzZXQgaSAxfSB7JGkgPCAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKSAmJiAkZmlsZXMgbmUge319IHtpbmNyIGl9IHsKCSAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJGldCgkgICAgc2V0IGRmICR0cmVlZGlmZnMoW2xpc3QgJGRpZmZtZXJnZWlkICRwXSkKCSAgICBzZXQgbmYge30KCSAgICBmb3JlYWNoIGYgJGZpbGVzIHsKCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRkZiAkZl0gPj0gMH0gewoJCSAgICBsYXBwZW5kIG5mICRmCgkJfQoJICAgIH0KCSAgICBzZXQgZmlsZXMgJG5mCgl9CiAgICB9CgogICAgc2V0IG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKSAkZmlsZXMKICAgIGlmIHskZmlsZXMgbmUge319IHsKCXNob3dtZXJnZWRpZmYKICAgIH0KfQoKcHJvYyBzaG93bWVyZ2VkaWZmIHt9IHsKICAgIGdsb2JhbCBjZmxpc3QgZGlmZm1lcmdlaWQgbWVyZ2VmaWxlbGlzdCBwYXJlbnRzCiAgICBnbG9iYWwgZGlmZm9wdHMgZGlmZmluaHVuayBjdXJyZW50ZmlsZSBjdXJyZW50aHVuayBmaWxlbGluZXMKICAgIGdsb2JhbCBkaWZmYmxvY2tlZCBncm91cGZpbGVsYXN0IG1lcmdlZmRzIGdyb3VwZmlsZW51bSBncm91cGh1bmtzCgogICAgc2V0IGZpbGVzICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkKICAgIGZvcmVhY2ggZiAkZmlsZXMgewoJJGNmbGlzdCBpbnNlcnQgZW5kICRmCiAgICB9CiAgICBzZXQgZW52KEdJVF9ESUZGX09QVFMpICRkaWZmb3B0cwogICAgc2V0IGZsaXN0IHt9CiAgICBjYXRjaCB7dW5zZXQgY3VycmVudGZpbGV9CiAgICBjYXRjaCB7dW5zZXQgY3VycmVudGh1bmt9CiAgICBjYXRjaCB7dW5zZXQgZmlsZWxpbmVzfQogICAgY2F0Y2gge3Vuc2V0IGdyb3VwZmlsZW51bX0KICAgIGNhdGNoIHt1bnNldCBncm91cGh1bmtzfQogICAgc2V0IGdyb3VwZmlsZWxhc3QgLTEKICAgIGZvcmVhY2ggcCAkcGFyZW50cygkZGlmZm1lcmdlaWQpIHsKCXNldCBjbWQgW2xpc3QgfCBnaXQtZGlmZi10cmVlIC1wICRwICRkaWZmbWVyZ2VpZF0KCXNldCBjbWQgW2NvbmNhdCAkY21kICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCldCglpZiB7W2NhdGNoIHtzZXQgZiBbb3BlbiAkY21kIHJdfSBlcnJdfSB7CgkgICAgZXJyb3JfcG9wdXAgIkVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCgkgICAgZm9yZWFjaCBmICRmbGlzdCB7CgkJY2F0Y2gge2Nsb3NlICRmfQoJICAgIH0KCSAgICByZXR1cm4KCX0KCWxhcHBlbmQgZmxpc3QgJGYKCXNldCBpZHMgW2xpc3QgJGRpZmZtZXJnZWlkICRwXQoJc2V0IG1lcmdlZmRzKCRpZHMpICRmCglzZXQgZGlmZmluaHVuaygkaWRzKSAwCglzZXQgZGlmZmJsb2NrZWQoJGlkcykgMAoJZmNvbmZpZ3VyZSAkZiAtYmxvY2tpbmcgMAoJZmlsZWV2ZW50ICRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJGYgJGlkcyAkZGlmZm1lcmdlaWRdCiAgICB9Cn0KCnByb2MgZ2V0bWVyZ2VkaWZmbGluZSB7ZiBpZHMgaWR9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBkaWZmaW5odW5rIGRpZmZvbGRsaW5lcyBkaWZmbmV3bGluZXMKICAgIGdsb2JhbCBjdXJyZW50ZmlsZSBjdXJyZW50aHVuawogICAgZ2xvYmFsIGRpZmZvbGRzdGFydCBkaWZmbmV3c3RhcnQgZGlmZm9sZGxubyBkaWZmbmV3bG5vCiAgICBnbG9iYWwgZGlmZmJsb2NrZWQgbWVyZ2VmaWxlbGlzdAogICAgZ2xvYmFsIG5vbGRsaW5lcyBubmV3bGluZXMgZGlmZmxjb3VudHMgZmlsZWxpbmVzCgogICAgc2V0IG4gW2dldHMgJGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHshW2VvZiAkZl19IHJldHVybgogICAgfQoKICAgIGlmIHshKFtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF0gJiYgJGRpZmZtZXJnZWlkID09ICRpZCl9IHsKCWlmIHskbiA8IDB9IHsKCSAgICBjbG9zZSAkZgoJfQoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRkaWZmaW5odW5rKCRpZHMpICE9IDB9IHsKCXNldCBmaSAkY3VycmVudGZpbGUoJGlkcykKCWlmIHskbiA+IDAgJiYgW3JlZ2V4cCB7XlstKyBcXF19ICRsaW5lIG1hdGNoXX0gewoJICAgICMgY29udGludWluZyBhbiBleGlzdGluZyBodW5rCgkgICAgc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxIGVuZF0KCSAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KCSAgICBpZiB7JG1hdGNoIGVxICItIiB8fCAkbWF0Y2ggZXEgIiAifSB7CgkJc2V0IGZpbGVsaW5lcygkcCwkZmksJGRpZmZvbGRsbm8oJGlkcykpICRsaW5lCgkJaW5jciBkaWZmb2xkbG5vKCRpZHMpCgkgICAgfQoJICAgIGlmIHskbWF0Y2ggZXEgIisiIHx8ICRtYXRjaCBlcSAiICJ9IHsKCQlzZXQgZmlsZWxpbmVzKCRpZCwkZmksJGRpZmZuZXdsbm8oJGlkcykpICRsaW5lCgkJaW5jciBkaWZmbmV3bG5vKCRpZHMpCgkgICAgfQoJICAgIGlmIHskbWF0Y2ggZXEgIiAifSB7CgkJaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDJ9IHsKCQkgICAgbGFwcGVuZCBkaWZmbGNvdW50cygkaWRzKSBcCgkJCVtsaXN0ICRub2xkbGluZXMoJGlkcykgJG5uZXdsaW5lcygkaWRzKV0KCQkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkJICAgIHNldCBkaWZmaW5odW5rKCRpZHMpIDEKCQl9CgkJaW5jciBub2xkbGluZXMoJGlkcykKCSAgICB9IGVsc2VpZiB7JG1hdGNoIGVxICItIiB8fCAkbWF0Y2ggZXEgIisifSB7CgkJaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDF9IHsKCQkgICAgbGFwcGVuZCBkaWZmbGNvdW50cygkaWRzKSBbbGlzdCAkbm9sZGxpbmVzKCRpZHMpXQoJCSAgICBzZXQgbm9sZGxpbmVzKCRpZHMpIDAKCQkgICAgc2V0IG5uZXdsaW5lcygkaWRzKSAwCgkJICAgIHNldCBkaWZmaW5odW5rKCRpZHMpIDIKCQl9CgkJaWYgeyRtYXRjaCBlcSAiLSJ9IHsKCQkgICAgaW5jciBub2xkbGluZXMoJGlkcykKCQl9IGVsc2UgewoJCSAgICBpbmNyIG5uZXdsaW5lcygkaWRzKQoJCX0KCSAgICB9CgkgICAgIyBhbmQgaWYgaXQncyBcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGxpbmUsIHRoZW4gd2hhdD8KCSAgICByZXR1cm4KCX0KCSMgZW5kIG9mIGEgaHVuawoJaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDEgJiYgJG5vbGRsaW5lcygkaWRzKSAhPSAwfSB7CgkgICAgbGFwcGVuZCBkaWZmbGNvdW50cygkaWRzKSBbbGlzdCAkbm9sZGxpbmVzKCRpZHMpXQoJfSBlbHNlaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDIKCQkgICYmICgkbm9sZGxpbmVzKCRpZHMpICE9IDAgfHwgJG5uZXdsaW5lcygkaWRzKSAhPSAwKX0gewoJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKSAkbm5ld2xpbmVzKCRpZHMpXQoJfQoJc2V0IGN1cnJlbnRodW5rKCRpZHMpIFtsaXN0ICRjdXJyZW50ZmlsZSgkaWRzKSBcCgkJCQkgICAkZGlmZm9sZHN0YXJ0KCRpZHMpICRkaWZmbmV3c3RhcnQoJGlkcykgXAoJCQkJICAgJGRpZmZvbGRsbm8oJGlkcykgJGRpZmZuZXdsbm8oJGlkcykgXAoJCQkJICAgJGRpZmZsY291bnRzKCRpZHMpXQoJc2V0IGRpZmZpbmh1bmsoJGlkcykgMAoJIyAtMSA9IG5lZWQgdG8gYmxvY2ssIDAgPSB1bmJsb2NrZWQsIDEgPSBpcyBibG9ja2VkCglzZXQgZGlmZmJsb2NrZWQoJGlkcykgLTEKCXByb2Nlc3NodW5rcwoJaWYgeyRkaWZmYmxvY2tlZCgkaWRzKSA9PSAtMX0gewoJICAgIGZpbGVldmVudCAkZiByZWFkYWJsZSB7fQoJICAgIHNldCBkaWZmYmxvY2tlZCgkaWRzKSAxCgl9CiAgICB9CgogICAgaWYgeyRuIDwgMH0gewoJIyBlb2YKCWlmIHshJGRpZmZibG9ja2VkKCRpZHMpfSB7CgkgICAgY2xvc2UgJGYKCSAgICBzZXQgY3VycmVudGZpbGUoJGlkcykgW2xsZW5ndGggJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKV0KCSAgICBzZXQgY3VycmVudGh1bmsoJGlkcykgW2xpc3QgJGN1cnJlbnRmaWxlKCRpZHMpIDAgMCAwIDAge31dCgkgICAgcHJvY2Vzc2h1bmtzCgl9CiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XmRpZmYgLS1naXQgYS8oLiopIGIvfSAkbGluZSBtYXRjaCBmbmFtZV19IHsKCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJc2V0IGN1cnJlbnRmaWxlKCRpZHMpIFwKCSAgICBbbHNlYXJjaCAtZXhhY3QgJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKSAkZm5hbWVdCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAIC0oWzAtOV0rKSwoWzAtOV0rKSBcKyhbMC05XSspLChbMC05XSspIEBAKC4qKX0gXAoJCSAgICRsaW5lIG1hdGNoIGYxbCBmMWMgZjJsIGYyYyByZXN0XX0gewoJaWYge1tpbmZvIGV4aXN0cyBjdXJyZW50ZmlsZSgkaWRzKV0gJiYgJGN1cnJlbnRmaWxlKCRpZHMpID49IDB9IHsKCSAgICAjIHN0YXJ0IG9mIGEgbmV3IGh1bmsKCSAgICBpZiB7JGYxbCA9PSAwICYmICRmMWMgPT0gMH0gewoJCXNldCBmMWwgMQoJICAgIH0KCSAgICBpZiB7JGYybCA9PSAwICYmICRmMmMgPT0gMH0gewoJCXNldCBmMmwgMQoJICAgIH0KCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAxCgkgICAgc2V0IGRpZmZvbGRzdGFydCgkaWRzKSAkZjFsCgkgICAgc2V0IGRpZmZuZXdzdGFydCgkaWRzKSAkZjJsCgkgICAgc2V0IGRpZmZvbGRsbm8oJGlkcykgJGYxbAoJICAgIHNldCBkaWZmbmV3bG5vKCRpZHMpICRmMmwKCSAgICBzZXQgZGlmZmxjb3VudHMoJGlkcykge30KCSAgICBzZXQgbm9sZGxpbmVzKCRpZHMpIDAKCSAgICBzZXQgbm5ld2xpbmVzKCRpZHMpIDAKCX0KICAgIH0KfQoKcHJvYyBwcm9jZXNzaHVua3Mge30gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIHBhcmVudHMgbnBhcmVudHMgY3VycmVudGh1bmsKICAgIGdsb2JhbCBtZXJnZWZpbGVsaXN0IGRpZmZibG9ja2VkIG1lcmdlZmRzCiAgICBnbG9iYWwgZ3JvdXBodW5rcyBncm91cGxpbmVzdGFydCBncm91cGxpbmVlbmQgZ3JvdXBmaWxlbnVtCgogICAgc2V0IG5maWxlcyBbbGxlbmd0aCAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpXQogICAgd2hpbGUgMSB7CglzZXQgZmkgJG5maWxlcwoJc2V0IGxubyAwCgkjIGxvb2sgZm9yIHRoZSBlYXJsaWVzdCBodW5rCglmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGh1bmsoJGlkcyldfSByZXR1cm4KCSAgICBzZXQgaSBbbGluZGV4ICRjdXJyZW50aHVuaygkaWRzKSAwXQoJICAgIHNldCBsIFtsaW5kZXggJGN1cnJlbnRodW5rKCRpZHMpIDJdCgkgICAgaWYgeyRpIDwgJGZpIHx8ICgkaSA9PSAkZmkgJiYgJGwgPCAkbG5vKX0gewoJCXNldCBmaSAkaQoJCXNldCBsbm8gJGwKCQlzZXQgcGkgJHAKCSAgICB9Cgl9CgoJaWYgeyRmaSA8ICRuZmlsZXN9IHsKCSAgICBzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VpZCAkcGldCgkgICAgc2V0IGh1bmsgJGN1cnJlbnRodW5rKCRpZHMpCgkgICAgdW5zZXQgY3VycmVudGh1bmsoJGlkcykKCSAgICBpZiB7JGRpZmZibG9ja2VkKCRpZHMpID4gMH0gewoJCWZpbGVldmVudCAkbWVyZ2VmZHMoJGlkcykgcmVhZGFibGUgXAoJCSAgICBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRtZXJnZWZkcygkaWRzKSAkaWRzICRkaWZmbWVyZ2VpZF0KCSAgICB9CgkgICAgc2V0IGRpZmZibG9ja2VkKCRpZHMpIDAKCgkgICAgaWYge1tpbmZvIGV4aXN0cyBncm91cGZpbGVudW1dICYmICRncm91cGZpbGVudW0gPT0gJGZpCgkJJiYgJGxubyA8PSAkZ3JvdXBsaW5lZW5kfSB7CgkJIyBhZGQgdGhpcyBodW5rIHRvIHRoZSBwZW5kaW5nIGdyb3VwCgkJbGFwcGVuZCBncm91cGh1bmtzKCRwaSkgJGh1bmsKCQlzZXQgZW5kbG4gW2xpbmRleCAkaHVuayA0XQoJCWlmIHskZW5kbG4gPiAkZ3JvdXBsaW5lZW5kfSB7CgkJICAgIHNldCBncm91cGxpbmVlbmQgJGVuZGxuCgkJfQoJCWNvbnRpbnVlCgkgICAgfQoJfQoKCSMgc3VjY2VlZGluZyBzdHVmZiBkb2Vzbid0IGJlbG9uZyBpbiB0aGlzIGdyb3VwLCBzbwoJIyBwcm9jZXNzIHRoZSBncm91cCBub3cKCWlmIHtbaW5mbyBleGlzdHMgZ3JvdXBmaWxlbnVtXX0gewoJICAgIHByb2Nlc3Nncm91cAoJICAgIHVuc2V0IGdyb3VwZmlsZW51bQoJICAgIHVuc2V0IGdyb3VwaHVua3MKCX0KCglpZiB7JGZpID49ICRuZmlsZXN9IGJyZWFrCgoJIyBzdGFydCBhIG5ldyBncm91cAoJc2V0IGdyb3VwZmlsZW51bSAkZmkKCXNldCBncm91cGh1bmtzKCRwaSkgW2xpc3QgJGh1bmtdCglzZXQgZ3JvdXBsaW5lc3RhcnQgJGxubwoJc2V0IGdyb3VwbGluZWVuZCBbbGluZGV4ICRodW5rIDRdCiAgICB9Cn0KCnByb2MgcHJvY2Vzc2dyb3VwIHt9IHsKICAgIGdsb2JhbCBncm91cGZpbGVsYXN0IGdyb3VwZmlsZW51bSBkaWZmZmlsZXN0YXJ0CiAgICBnbG9iYWwgbWVyZ2VmaWxlbGlzdCBkaWZmbWVyZ2VpZCBjdGV4dCBmaWxlbGluZXMKICAgIGdsb2JhbCBwYXJlbnRzIGRpZmZtZXJnZWlkIGRpZmZvZmZzZXQKICAgIGdsb2JhbCBncm91cGh1bmtzIGdyb3VwbGluZXN0YXJ0IGdyb3VwbGluZWVuZCBucGFyZW50cwogICAgZ2xvYmFsIG1lcmdlbWF4CgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgc2V0IGlkICRkaWZmbWVyZ2VpZAogICAgc2V0IGYgJGdyb3VwZmlsZW51bQogICAgaWYgeyRncm91cGZpbGVsYXN0ICE9ICRmfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCglzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgZGlmZmZpbGVzdGFydCgkZikgJGhlcmUKCXNldCBtYXJrIGZtYXJrLltleHByIHskZiArIDF9XQoJJGN0ZXh0IG1hcmsgc2V0ICRtYXJrICRoZXJlCgkkY3RleHQgbWFyayBncmF2aXR5ICRtYXJrIGxlZnQKCXNldCBoZWFkZXIgW2xpbmRleCAkbWVyZ2VmaWxlbGlzdCgkaWQpICRmXQoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRoZWFkZXJdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGhlYWRlciAkcGFkXG4iIGZpbGVzZXAKCXNldCBncm91cGZpbGVsYXN0ICRmCglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgc2V0IGRpZmZvZmZzZXQoJHApIDAKCX0KICAgIH0KCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQEAiIG1zZXAKICAgIHNldCBubGluZXMgW2V4cHIgeyRncm91cGxpbmVlbmQgLSAkZ3JvdXBsaW5lc3RhcnR9XQogICAgc2V0IGV2ZW50cyB7fQogICAgc2V0IHBudW0gMAogICAgZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJc2V0IHN0YXJ0bGluZSBbZXhwciB7JGdyb3VwbGluZXN0YXJ0ICsgJGRpZmZvZmZzZXQoJHApfV0KCXNldCBvbCAkc3RhcnRsaW5lCglzZXQgbmwgJGdyb3VwbGluZXN0YXJ0CglpZiB7W2luZm8gZXhpc3RzIGdyb3VwaHVua3MoJHApXX0gewoJICAgIGZvcmVhY2ggaCAkZ3JvdXBodW5rcygkcCkgewoJCXNldCBsIFtsaW5kZXggJGggMl0KCQlpZiB7JG5sIDwgJGx9IHsKCQkgICAgZm9yIHt9IHskbmwgPCAkbH0ge2luY3Igbmx9IHsKCQkJc2V0IGZpbGVsaW5lcygkcCwkZiwkb2wpICRmaWxlbGluZXMoJGlkLCRmLCRubCkKCQkJaW5jciBvbAoJCSAgICB9CgkJfQoJCWZvcmVhY2ggY2h1bmsgW2xpbmRleCAkaCA1XSB7CgkJICAgIGlmIHtbbGxlbmd0aCAkY2h1bmtdID09IDJ9IHsKCQkJc2V0IG9sYyBbbGluZGV4ICRjaHVuayAwXQoJCQlzZXQgbmxjIFtsaW5kZXggJGNodW5rIDFdCgkJCXNldCBubmwgW2V4cHIgeyRubCArICRubGN9XQoJCQlsYXBwZW5kIGV2ZW50cyBbbGlzdCAkbmwgJG5ubCAkcG51bSAkb2xjICRubGNdCgkJCWluY3Igb2wgJG9sYwoJCQlzZXQgbmwgJG5ubAoJCSAgICB9IGVsc2UgewoJCQlpbmNyIG9sIFtsaW5kZXggJGNodW5rIDBdCgkJCWluY3IgbmwgW2xpbmRleCAkY2h1bmsgMF0KCQkgICAgfQoJCX0KCSAgICB9Cgl9CglpZiB7JG5sIDwgJGdyb3VwbGluZWVuZH0gewoJICAgIGZvciB7fSB7JG5sIDwgJGdyb3VwbGluZWVuZH0ge2luY3Igbmx9IHsKCQlzZXQgZmlsZWxpbmVzKCRwLCRmLCRvbCkgJGZpbGVsaW5lcygkaWQsJGYsJG5sKQoJCWluY3Igb2wKCSAgICB9Cgl9CglzZXQgbmxpbmVzIFtleHByIHskb2wgLSAkc3RhcnRsaW5lfV0KCSRjdGV4dCBpbnNlcnQgZW5kICIgLSRzdGFydGxpbmUsJG5saW5lcyIgbXNlcAoJaW5jciBwbnVtCiAgICB9CgogICAgc2V0IG5saW5lcyBbZXhwciB7JGdyb3VwbGluZWVuZCAtICRncm91cGxpbmVzdGFydH1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICskZ3JvdXBsaW5lc3RhcnQsJG5saW5lcyBAQFxuIiBtc2VwCgogICAgc2V0IGV2ZW50cyBbbHNvcnQgLWludGVnZXIgLWluZGV4IDAgJGV2ZW50c10KICAgIHNldCBuZXZlbnRzIFtsbGVuZ3RoICRldmVudHNdCiAgICBzZXQgbm1lcmdlICRucGFyZW50cygkZGlmZm1lcmdlaWQpCiAgICBzZXQgbCAkZ3JvdXBsaW5lc3RhcnQKICAgIGZvciB7c2V0IGkgMH0geyRpIDwgJG5ldmVudHN9IHtzZXQgaSAkan0gewoJc2V0IG5sIFtsaW5kZXggJGV2ZW50cyAkaSAwXQoJd2hpbGUgeyRsIDwgJG5sfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIKCSAgICBpbmNyIGwKCX0KCXNldCBlIFtsaW5kZXggJGV2ZW50cyAkaV0KCXNldCBlbmwgW2xpbmRleCAkZSAxXQoJc2V0IGogJGkKCXNldCBhY3RpdmUge30KCXdoaWxlIDEgewoJICAgIHNldCBwbnVtIFtsaW5kZXggJGUgMl0KCSAgICBzZXQgb2xjIFtsaW5kZXggJGUgM10KCSAgICBzZXQgbmxjIFtsaW5kZXggJGUgNF0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZWx0YSgkcG51bSldfSB7CgkJc2V0IGRlbHRhKCRwbnVtKSBbZXhwciB7JG9sYyAtICRubGN9XQoJCWxhcHBlbmQgYWN0aXZlICRwbnVtCgkgICAgfSBlbHNlIHsKCQlpbmNyIGRlbHRhKCRwbnVtKSBbZXhwciB7JG9sYyAtICRubGN9XQoJICAgIH0KCSAgICBpZiB7W2luY3Igal0gPj0gJG5ldmVudHN9IGJyZWFrCgkgICAgc2V0IGUgW2xpbmRleCAkZXZlbnRzICRqXQoJICAgIGlmIHtbbGluZGV4ICRlIDBdID49ICRlbmx9IGJyZWFrCgkgICAgaWYge1tsaW5kZXggJGUgMV0gPiAkZW5sfSB7CgkJc2V0IGVubCBbbGluZGV4ICRlIDFdCgkgICAgfQoJfQoJc2V0IG5sYyBbZXhwciB7JGVubCAtICRsfV0KCXNldCBuY29sIG1yZXN1bHQKCXNldCBiZXN0cG4gLTEKCWlmIHtbbGxlbmd0aCAkYWN0aXZlXSA9PSAkbm1lcmdlIC0gMX0gewoJICAgICMgbm8gZGlmZiBmb3Igb25lIG9mIHRoZSBwYXJlbnRzLCBpLmUuIGl0J3MgaWRlbnRpY2FsCgkgICAgZm9yIHtzZXQgcG51bSAwfSB7JHBudW0gPCAkbm1lcmdlfSB7aW5jciBwbnVtfSB7CgkJaWYgeyFbaW5mbyBleGlzdHMgZGVsdGEoJHBudW0pXX0gewoJCSAgICBpZiB7JHBudW0gPCAkbWVyZ2VtYXh9IHsKCQkJbGFwcGVuZCBuY29sIG0kcG51bQoJCSAgICB9IGVsc2UgewoJCQlsYXBwZW5kIG5jb2wgbW1heAoJCSAgICB9CgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCX0gZWxzZWlmIHtbbGxlbmd0aCAkYWN0aXZlXSA9PSAkbm1lcmdlfSB7CgkgICAgIyBhbGwgcGFyZW50cyBhcmUgZGlmZmVyZW50LCBzZWUgaWYgb25lIGlzIHZlcnkgc2ltaWxhcgoJICAgIHNldCBiZXN0c2ltIDMwCgkgICAgZm9yIHtzZXQgcG51bSAwfSB7JHBudW0gPCAkbm1lcmdlfSB7aW5jciBwbnVtfSB7CgkJc2V0IHNpbSBbc2ltaWxhcml0eSAkcG51bSAkbCAkbmxjICRmIFwKCQkJICAgICBbbHJhbmdlICRldmVudHMgJGkgW2V4cHIgeyRqLTF9XV1dCgkJaWYgeyRzaW0gPiAkYmVzdHNpbX0gewoJCSAgICBzZXQgYmVzdHNpbSAkc2ltCgkJICAgIHNldCBiZXN0cG4gJHBudW0KCQl9CgkgICAgfQoJICAgIGlmIHskYmVzdHBuID49IDB9IHsKCQlsYXBwZW5kIG5jb2wgbSRiZXN0cG4KCSAgICB9Cgl9CglzZXQgcG51bSAtMQoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGluY3IgcG51bQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGRlbHRhKCRwbnVtKV0gfHwgJHBudW0gPT0gJGJlc3Rwbn0gY29udGludWUKCSAgICBzZXQgb2xjIFtleHByIHskbmxjICsgJGRlbHRhKCRwbnVtKX1dCgkgICAgc2V0IG9sIFtleHByIHskbCArICRkaWZmb2Zmc2V0KCRwKX1dCgkgICAgaW5jciBkaWZmb2Zmc2V0KCRwKSAkZGVsdGEoJHBudW0pCgkgICAgdW5zZXQgZGVsdGEoJHBudW0pCgkgICAgZm9yIHt9IHskb2xjID4gMH0ge2luY3Igb2xjIC0xfSB7CgkJJGN0ZXh0IGluc2VydCBlbmQgIi0kZmlsZWxpbmVzKCRwLCRmLCRvbClcbiIgbSRwbnVtCgkJaW5jciBvbAoJICAgIH0KCX0KCXNldCBlbmRsIFtleHByIHskbCArICRubGN9XQoJaWYgeyRiZXN0cG4gPj0gMH0gewoJICAgICMgc2hvdyB0aGlzIHByZXR0eSBtdWNoIGFzIGEgbm9ybWFsIGRpZmYKCSAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRpZCkgJGJlc3Rwbl0KCSAgICBzZXQgb2wgW2V4cHIgeyRsICsgJGRpZmZvZmZzZXQoJHApfV0KCSAgICBpbmNyIGRpZmZvZmZzZXQoJHApICRkZWx0YSgkYmVzdHBuKQoJICAgIHVuc2V0IGRlbHRhKCRiZXN0cG4pCgkgICAgZm9yIHtzZXQgayAkaX0geyRrIDwgJGp9IHtpbmNyIGt9IHsKCQlzZXQgZSBbbGluZGV4ICRldmVudHMgJGtdCgkJaWYge1tsaW5kZXggJGUgMl0gIT0gJGJlc3Rwbn0gY29udGludWUKCQlzZXQgbmwgW2xpbmRleCAkZSAwXQoJCXNldCBvbCBbZXhwciB7JG9sICsgJG5sIC0gJGx9XQoJCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCQkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiskZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIgJG5jb2wKCQl9CgkJc2V0IGMgW2xpbmRleCAkZSAzXQoJCWZvciB7fSB7JGMgPiAwfSB7aW5jciBjIC0xfSB7CgkJICAgICRjdGV4dCBpbnNlcnQgZW5kICItJGZpbGVsaW5lcygkcCwkZiwkb2wpXG4iIG0kYmVzdHBuCgkJICAgIGluY3Igb2wKCQl9CgkJc2V0IG5sIFtsaW5kZXggJGUgMV0KCQlmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iIG1yZXN1bHQKCQl9CgkgICAgfQoJfQoJZm9yIHt9IHskbCA8ICRlbmRsfSB7aW5jciBsfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiskZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIgJG5jb2wKCX0KICAgIH0KICAgIHdoaWxlIHskbCA8ICRncm91cGxpbmVlbmR9IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIgJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iCglpbmNyIGwKICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHNpbWlsYXJpdHkge3BudW0gbCBubGMgZiBldmVudHN9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBwYXJlbnRzIGRpZmZvZmZzZXQgZmlsZWxpbmVzCgogICAgc2V0IGlkICRkaWZmbWVyZ2VpZAogICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRwbnVtXQogICAgc2V0IG9sIFtleHByIHskbCArICRkaWZmb2Zmc2V0KCRwKX1dCiAgICBzZXQgZW5kbCBbZXhwciB7JGwgKyAkbmxjfV0KICAgIHNldCBzYW1lIDAKICAgIHNldCBkaWZmIDAKICAgIGZvcmVhY2ggZSAkZXZlbnRzIHsKCWlmIHtbbGluZGV4ICRlIDJdICE9ICRwbnVtfSBjb250aW51ZQoJc2V0IG5sIFtsaW5kZXggJGUgMF0KCXNldCBvbCBbZXhwciB7JG9sICsgJG5sIC0gJGx9XQoJZm9yIHt9IHskbCA8ICRubH0ge2luY3IgbH0gewoJICAgIGluY3Igc2FtZSBbc3RyaW5nIGxlbmd0aCAkZmlsZWxpbmVzKCRpZCwkZiwkbCldCgkgICAgaW5jciBzYW1lCgl9CglzZXQgb2MgW2xpbmRleCAkZSAzXQoJZm9yIHt9IHskb2MgPiAwfSB7aW5jciBvYyAtMX0gewoJICAgIGluY3IgZGlmZiBbc3RyaW5nIGxlbmd0aCAkZmlsZWxpbmVzKCRwLCRmLCRvbCldCgkgICAgaW5jciBkaWZmCgkgICAgaW5jciBvbAoJfQoJc2V0IG5sIFtsaW5kZXggJGUgMV0KCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCSAgICBpbmNyIGRpZmYgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkaWQsJGYsJGwpXQoJICAgIGluY3IgZGlmZgoJfQogICAgfQogICAgZm9yIHt9IHskbCA8ICRlbmRsfSB7aW5jciBsfSB7CglpbmNyIHNhbWUgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkaWQsJGYsJGwpXQoJaW5jciBzYW1lCiAgICB9CiAgICBpZiB7JHNhbWUgPT0gMH0gewoJcmV0dXJuIDAKICAgIH0KICAgIHJldHVybiBbZXhwciB7MjAwICogJHNhbWUgLyAoMiAqICRzYW1lICsgJGRpZmYpfV0KfQoKcHJvYyBzdGFydGRpZmYge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBkaWZmaWRzIHRyZWVwZW5kaW5nIGRpZmZtZXJnZWlkCgogICAgc2V0IGRpZmZpZHMgJGlkcwogICAgY2F0Y2gge3Vuc2V0IGRpZmZtZXJnZWlkfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRpZHMKCX0KICAgIH0gZWxzZSB7CglhZGR0b2NmbGlzdCAkaWRzCiAgICB9Cn0KCnByb2MgYWRkdG9jZmxpc3Qge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBjZmxpc3QKICAgIGZvcmVhY2ggZiAkdHJlZWRpZmZzKCRpZHMpIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZgogICAgfQogICAgZ2V0YmxvYmRpZmZzICRpZHMKfQoKcHJvYyBnZXR0cmVlZGlmZnMge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmIHBhcmVudHMgdHJlZXBlbmRpbmcKICAgIHNldCB0cmVlcGVuZGluZyAkaWRzCiAgICBzZXQgdHJlZWRpZmYge30KICAgIHNldCBpZCBbbGluZGV4ICRpZHMgMF0KICAgIHNldCBwIFtsaW5kZXggJGlkcyAxXQogICAgaWYgW2NhdGNoIHtzZXQgZ2R0ZiBbb3BlbiAifGdpdC1kaWZmLXRyZWUgLXIgJHAgJGlkIiByXX1dIHJldHVybgogICAgZmNvbmZpZ3VyZSAkZ2R0ZiAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRnZHRmIHJlYWRhYmxlIFtsaXN0IGdldHRyZWVkaWZmbGluZSAkZ2R0ZiAkaWRzXQp9Cgpwcm9jIGdldHRyZWVkaWZmbGluZSB7Z2R0ZiBpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiB0cmVlZGlmZnMgdHJlZXBlbmRpbmcgZGlmZmlkcyBkaWZmbWVyZ2VpZAoKICAgIHNldCBuIFtnZXRzICRnZHRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7IVtlb2YgJGdkdGZdfSByZXR1cm4KCWNsb3NlICRnZHRmCglzZXQgdHJlZWRpZmZzKCRpZHMpICR0cmVlZGlmZgoJdW5zZXQgdHJlZXBlbmRpbmcKCWlmIHskaWRzICE9ICRkaWZmaWRzfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRkaWZmaWRzCgl9IGVsc2UgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdfSB7CgkJY29udG1lcmdlZGlmZiAkaWRzCgkgICAgfSBlbHNlIHsKCQlhZGR0b2NmbGlzdCAkaWRzCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBzZXQgZmlsZSBbbGluZGV4ICRsaW5lIDVdCiAgICBsYXBwZW5kIHRyZWVkaWZmICRmaWxlCn0KCnByb2MgZ2V0YmxvYmRpZmZzIHtpZHN9IHsKICAgIGdsb2JhbCBkaWZmb3B0cyBibG9iZGlmZmZkIGRpZmZpZHMgZW52IGN1cmRpZmZ0YWcgY3VydGFnc3RhcnQKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBpZCBbbGluZGV4ICRpZHMgMF0KICAgIHNldCBwIFtsaW5kZXggJGlkcyAxXQogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBjbWQgW2xpc3QgfCBnaXQtZGlmZi10cmVlIC1yIC1wIC1DICRwICRpZF0KICAgIGlmIHtbY2F0Y2gge3NldCBiZGYgW29wZW4gJGNtZCByXX0gZXJyXX0gewoJcHV0cyAiZXJyb3IgZ2V0dGluZyBkaWZmczogJGVyciIKCXJldHVybgogICAgfQogICAgc2V0IGRpZmZpbmhkciAwCiAgICBmY29uZmlndXJlICRiZGYgLWJsb2NraW5nIDAKICAgIHNldCBibG9iZGlmZmZkKCRpZHMpICRiZGYKICAgIHNldCBjdXJkaWZmdGFnIENvbW1lbnRzCiAgICBzZXQgY3VydGFnc3RhcnQgMC4wCiAgICBjYXRjaCB7dW5zZXQgZGlmZmZpbGVzdGFydH0KICAgIGZpbGVldmVudCAkYmRmIHJlYWRhYmxlIFtsaXN0IGdldGJsb2JkaWZmbGluZSAkYmRmICRkaWZmaWRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQp9Cgpwcm9jIGdldGJsb2JkaWZmbGluZSB7YmRmIGlkc30gewogICAgZ2xvYmFsIGRpZmZpZHMgYmxvYmRpZmZmZCBjdGV4dCBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgZGlmZm5leHRoZWFkIGRpZmZuZXh0bm90ZSBkaWZmZmlsZXN0YXJ0CiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBkaWZmaW5oZHIgdHJlZWRpZmZzCiAgICBnbG9iYWwgZ2F1ZHlkaWZmCgogICAgc2V0IG4gW2dldHMgJGJkZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJGJkZl19IHsKCSAgICBjbG9zZSAkYmRmCgkgICAgaWYgeyRpZHMgPT0gJGRpZmZpZHMgJiYgJGJkZiA9PSAkYmxvYmRpZmZmZCgkaWRzKX0gewoJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHskaWRzICE9ICRkaWZmaWRzIHx8ICRiZGYgIT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYge1tyZWdleHAge15kaWZmIC0tZ2l0IGEvKC4qKSBiLyguKil9ICRsaW5lIG1hdGNoIGZuYW1lIG5ld25hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCXNldCBjdXJ0YWdzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgaGVhZGVyICRuZXduYW1lCglzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkZGlmZmlkcykgJGZuYW1lXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgZGlmZmZpbGVzdGFydCgkaSkgJGhlcmUKCSAgICBpbmNyIGkKCSAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuJGkgJGhlcmUKCSAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLiRpIGxlZnQKCX0KCWlmIHskbmV3bmFtZSAhPSAkZm5hbWV9IHsKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkZGlmZmlkcykgJG5ld25hbWVdCgkgICAgaWYgeyRpID49IDB9IHsKCQlzZXQgZGlmZmZpbGVzdGFydCgkaSkgJGhlcmUKCQlpbmNyIGkKCQkkY3RleHQgbWFyayBzZXQgZm1hcmsuJGkgJGhlcmUKCQkkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLiRpIGxlZnQKCSAgICB9Cgl9CglzZXQgY3VyZGlmZnRhZyAiZjokZm5hbWUiCgkkY3RleHQgdGFnIGRlbGV0ZSAkY3VyZGlmZnRhZwoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRoZWFkZXJdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGhlYWRlciAkcGFkXG4iIGZpbGVzZXAKCXNldCBkaWZmaW5oZHIgMQogICAgfSBlbHNlaWYge1tyZWdleHAge14oLS0tfFwrXCtcKyl9ICRsaW5lXX0gewoJc2V0IGRpZmZpbmhkciAwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAIC0oWzAtOV0rKSwoWzAtOV0rKSBcKyhbMC05XSspLChbMC05XSspIEBAKC4qKX0gXAoJCSAgICRsaW5lIG1hdGNoIGYxbCBmMWMgZjJsIGYyYyByZXN0XX0gewoJaWYgeyRnYXVkeWRpZmZ9IHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHQiIGh1bmtzZXAKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICAgICRmMWwgICAgIiBkMCAiICAgICRmMmwgICAgIiBkMQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgICAgJHJlc3QgXG4iIGh1bmtzZXAKCX0gZWxzZSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGh1bmtzZXAKCX0KCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlIHsKCXNldCB4IFtzdHJpbmcgcmFuZ2UgJGxpbmUgMCAwXQoJaWYgeyR4ID09ICItIiB8fCAkeCA9PSAiKyJ9IHsKCSAgICBzZXQgdGFnIFtleHByIHskeCA9PSAiKyJ9XQoJICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkJc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxIGVuZF0KCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGQkdGFnCgl9IGVsc2VpZiB7JHggPT0gIiAifSB7CgkgICAgaWYgeyRnYXVkeWRpZmZ9IHsKCQlzZXQgbGluZSBbc3RyaW5nIHJhbmdlICRsaW5lIDEgZW5kXQoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIKCX0gZWxzZWlmIHskZGlmZmluaGRyIHx8ICR4ID09ICJcXCJ9IHsKCSAgICAjIGUuZy4gIlwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfSBlbHNlIHsKCSAgICAjIFNvbWV0aGluZyBlbHNlIHdlIGRvbid0IHJlY29nbml6ZQoJICAgIGlmIHskY3VyZGlmZnRhZyAhPSAiQ29tbWVudHMifSB7CgkJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCQlzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJCXNldCBjdXJkaWZmdGFnIENvbW1lbnRzCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CglpbmNyIG5leHR1cGRhdGUgMTAwCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSB7fQoJdXBkYXRlCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSAiZ2V0YmxvYmRpZmZsaW5lICRiZGYgeyRpZHN9IgogICAgfQp9Cgpwcm9jIG5leHRmaWxlIHt9IHsKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IGN0ZXh0CiAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCiAgICBmb3Ige3NldCBpIDB9IHtbaW5mbyBleGlzdHMgZGlmZmZpbGVzdGFydCgkaSldfSB7aW5jciBpfSB7CglpZiB7WyRjdGV4dCBjb21wYXJlICRkaWZmZmlsZXN0YXJ0KCRpKSA+ICRoZXJlXX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHBvc10KCQl8fCBbJGN0ZXh0IGNvbXBhcmUgJGRpZmZmaWxlc3RhcnQoJGkpIDwgJHBvc119IHsKCQlzZXQgcG9zICRkaWZmZmlsZXN0YXJ0KCRpKQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgcG9zXX0gewoJJGN0ZXh0IHl2aWV3ICRwb3MKICAgIH0KfQoKcHJvYyBsaXN0Ym94c2VsIHt9IHsKICAgIGdsb2JhbCBjdGV4dCBjZmxpc3QgY3VycmVudGlkCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBzZWwgW2xzb3J0IFskY2ZsaXN0IGN1cnNlbGVjdGlvbl1dCiAgICBpZiB7JHNlbCBlcSB7fX0gcmV0dXJuCiAgICBzZXQgZmlyc3QgW2xpbmRleCAkc2VsIDBdCiAgICBjYXRjaCB7JGN0ZXh0IHl2aWV3IGZtYXJrLiRmaXJzdH0KfQoKcHJvYyBzZXRjb29yZHMge30gewogICAgZ2xvYmFsIGxpbmVzcGMgY2hhcnNwYyBjYW52eDAgY2FudnkwIG1haW5mb250CiAgICBnbG9iYWwgeHNwYzEgeHNwYzIgbHRoaWNrbmVzcwoKICAgIHNldCBsaW5lc3BjIFtmb250IG1ldHJpY3MgJG1haW5mb250IC1saW5lc3BhY2VdCiAgICBzZXQgY2hhcnNwYyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAibSJdCiAgICBzZXQgY2FudnkwIFtleHByIDMgKyAwLjUgKiAkbGluZXNwY10KICAgIHNldCBjYW52eDAgW2V4cHIgMyArIDAuNSAqICRsaW5lc3BjXQogICAgc2V0IGx0aGlja25lc3MgW2V4cHIge2ludCgkbGluZXNwYyAvIDkpICsgMX1dCiAgICBzZXQgeHNwYzEoMCkgJGxpbmVzcGMKICAgIHNldCB4c3BjMiAkbGluZXNwYwp9Cgpwcm9jIHJlZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgc3RvcHBlZCByZWRpc3BsYXlpbmcgcGhhc2UKICAgIGlmIHskc3RvcHBlZCA+IDF9IHJldHVybgogICAgaWYgeyRwaGFzZSA9PSAiZ2V0Y29tbWl0cyJ9IHJldHVybgogICAgc2V0IHJlZGlzcGxheWluZyAxCiAgICBpZiB7JHBoYXNlID09ICJkcmF3Z3JhcGgiIHx8ICRwaGFzZSA9PSAiaW5jcmRyYXcifSB7CglzZXQgc3RvcHBlZCAxCiAgICB9IGVsc2UgewoJZHJhd2dyYXBoCiAgICB9Cn0KCnByb2MgaW5jcmZvbnQge2luY30gewogICAgZ2xvYmFsIG1haW5mb250IG5hbWVmb250IHRleHRmb250IGN0ZXh0IGNhbnYgcGhhc2UKICAgIGdsb2JhbCBzdG9wcGVkIGVudHJpZXMKICAgIHVubWFya21hdGNoZXMKICAgIHNldCBtYWluZm9udCBbbHJlcGxhY2UgJG1haW5mb250IDEgMSBbZXhwciB7W2xpbmRleCAkbWFpbmZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXQgbmFtZWZvbnQgW2xyZXBsYWNlICRuYW1lZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG5hbWVmb250IDFdICsgJGluY31dXQogICAgc2V0IHRleHRmb250IFtscmVwbGFjZSAkdGV4dGZvbnQgMSAxIFtleHByIHtbbGluZGV4ICR0ZXh0Zm9udCAxXSArICRpbmN9XV0KICAgIHNldGNvb3JkcwogICAgJGN0ZXh0IGNvbmYgLWZvbnQgJHRleHRmb250CiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCSRlIGNvbmYgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIn0gewoJJGNhbnYgaXRlbWNvbmYgdGV4dGl0ZW1zIC1mb250ICRtYWluZm9udAogICAgfQogICAgcmVkaXNwbGF5Cn0KCnByb2MgY2xlYXJzaGExIHt9IHsKICAgIGdsb2JhbCBzaGExZW50cnkgc2hhMXN0cmluZwogICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaGExc3RyaW5nXSA9PSA0MH0gewoJJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgIH0KfQoKcHJvYyBzaGExY2hhbmdlIHtuMSBuMiBvcH0gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIHNoYTFidXQKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7WyRzaGExYnV0IGNnZXQgLXN0YXRlXSA9PSAkc3RhdGV9IHJldHVybgogICAgaWYgeyRzdGF0ZSA9PSAibm9ybWFsIn0gewoJJHNoYTFidXQgY29uZiAtc3RhdGUgbm9ybWFsIC1yZWxpZWYgcmFpc2VkIC10ZXh0ICJHb3RvOiAiCiAgICB9IGVsc2UgewoJJHNoYTFidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IC10ZXh0ICJTSEExIElEOiAiCiAgICB9Cn0KCnByb2MgZ290b2NvbW1pdCB7fSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgaWRsaW5lIHRhZ2lkcwogICAgZ2xvYmFsIGxpbmVpZCBudW1jb21taXRzCgogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHJldHVybgogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICR0YWdpZHMoJHNoYTFzdHJpbmcpCiAgICB9IGVsc2UgewoJc2V0IGlkIFtzdHJpbmcgdG9sb3dlciAkc2hhMXN0cmluZ10KCWlmIHtbcmVnZXhwIHteWzAtOWEtZl17NCwzOX0kfSAkaWRdfSB7CgkgICAgc2V0IG1hdGNoZXMge30KCSAgICBmb3Ige3NldCBsIDB9IHskbCA8ICRudW1jb21taXRzfSB7aW5jciBsfSB7CgkJaWYge1tzdHJpbmcgbWF0Y2ggJGlkKiAkbGluZWlkKCRsKV19IHsKCQkgICAgbGFwcGVuZCBtYXRjaGVzICRsaW5laWQoJGwpCgkJfQoJICAgIH0KCSAgICBpZiB7JG1hdGNoZXMgbmUge319IHsKCQlpZiB7W2xsZW5ndGggJG1hdGNoZXNdID4gMX0gewoJCSAgICBlcnJvcl9wb3B1cCAiU2hvcnQgU0hBMSBpZCAkaWQgaXMgYW1iaWd1b3VzIgoJCSAgICByZXR1cm4KCQl9CgkJc2V0IGlkIFtsaW5kZXggJG1hdGNoZXMgMF0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gewoJc2VsZWN0bGluZSAkaWRsaW5lKCRpZCkgMQoJcmV0dXJuCiAgICB9CiAgICBpZiB7W3JlZ2V4cCB7XlswLTlhLWZBLUZdezQsfSR9ICRzaGExc3RyaW5nXX0gewoJc2V0IHR5cGUgIlNIQTEgaWQiCiAgICB9IGVsc2UgewoJc2V0IHR5cGUgIlRhZyIKICAgIH0KICAgIGVycm9yX3BvcHVwICIkdHlwZSAkc2hhMXN0cmluZyBpcyBub3Qga25vd24iCn0KCnByb2MgbGluZWVudGVyIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2FudgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHJldHVybgogICAgc2V0IGhvdmVyeCAkeAogICAgc2V0IGhvdmVyeSAkeQogICAgc2V0IGhvdmVyaWQgJGlkCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CglhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKICAgIH0KICAgIHNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCn0KCnByb2MgbGluZW1vdGlvbiB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJc2V0IGhvdmVyeCAkeAoJc2V0IGhvdmVyeSAkeQoJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJICAgIGFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgoJfQoJc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICB9Cn0KCnByb2MgbGluZWxlYXZlIHtpZH0gewogICAgZ2xvYmFsIGhvdmVyaWQgaG92ZXJ0aW1lciBjYW52CgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCSRjYW52IGRlbGV0ZSBob3ZlcgoJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJICAgIGFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgoJICAgIHVuc2V0IGhvdmVydGltZXIKCX0KCXVuc2V0IGhvdmVyaWQKICAgIH0KfQoKcHJvYyBsaW5laG92ZXIge30gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCiAgICBnbG9iYWwgY2FudiBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjb21taXRpbmZvIG1haW5mb250CgogICAgc2V0IHRleHQgW2xpbmRleCAkY29tbWl0aW5mbygkaG92ZXJpZCkgMF0KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCiAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCiAgICBzZXQgeCBbZXhwciB7JGhvdmVyeCArIDIgKiAkbGluZXNwY31dCiAgICBzZXQgeSBbZXhwciB7JGhvdmVyeSArICR5ZnJhYyAqICR5bWF4IC0gJGxpbmVzcGMgLyAyfV0KICAgIHNldCB4MCBbZXhwciB7JHggLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkwIFtleHByIHskeSAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeDEgW2V4cHIgeyR4ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRleHRdICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MSBbZXhwciB7JHkgKyAkbGluZXNwYyArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3RhbmdsZSAkeDAgJHkwICR4MSAkeTEgXAoJICAgICAgIC1maWxsIFwjZmZmZjgwIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxIC10YWdzIGhvdmVyXQogICAgJGNhbnYgcmFpc2UgJHQKICAgIHNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeCAkeSAtYW5jaG9yIG53IC10ZXh0ICR0ZXh0IC10YWdzIGhvdmVyXQogICAgJGNhbnYgcmFpc2UgJHQKfQoKcHJvYyBjbGlja2lzb25hcnJvdyB7aWQgeX0gewogICAgZ2xvYmFsIG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzIGx0aGlja25lc3MKCiAgICBzZXQgdGhyZXNoIFtleHByIHsyICogJGx0aGlja25lc3MgKyA2fV0KICAgIGlmIHtbaW5mbyBleGlzdHMgbWFpbmxpbmUoJGlkKV19IHsKCWlmIHskbWFpbmxpbmVhcnJvdygkaWQpIG5lICJub25lIn0gewoJICAgIGlmIHthYnMoW2xpbmRleCAkbWFpbmxpbmUoJGlkKSAxXSAtICR5KSA8ICR0aHJlc2h9IHsKCQlyZXR1cm4gInVwIgoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7Cglmb3JlYWNoIGxzICRzaWRlbGluZXMoJGlkKSB7CgkgICAgc2V0IGNvb3JkcyBbbGluZGV4ICRscyAwXQoJICAgIHNldCBhcnJvdyBbbGluZGV4ICRscyAyXQoJICAgIGlmIHskYXJyb3cgZXEgImZpcnN0IiB8fCAkYXJyb3cgZXEgImJvdGgifSB7CgkJaWYge2FicyhbbGluZGV4ICRjb29yZHMgMV0gLSAkeSkgPCAkdGhyZXNofSB7CgkJICAgIHJldHVybiAidXAiCgkJfQoJICAgIH0KCSAgICBpZiB7JGFycm93IGVxICJsYXN0IiB8fCAkYXJyb3cgZXEgImJvdGgifSB7CgkJaWYge2FicyhbbGluZGV4ICRjb29yZHMgZW5kXSAtICR5KSA8ICR0aHJlc2h9IHsKCQkgICAgcmV0dXJuICJkb3duIgoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4ge30KfQoKcHJvYyBhcnJvd2p1bXAge2lkIGRpcm4geX0gewogICAgZ2xvYmFsIG1haW5saW5lIHNpZGVsaW5lcyBjYW52CgogICAgc2V0IHl0IHt9CiAgICBpZiB7JGRpcm4gZXEgImRvd24ifSB7CglpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CgkgICAgc2V0IHkxIFtsaW5kZXggJG1haW5saW5lKCRpZCkgMV0KCSAgICBpZiB7JHkxID4gJHl9IHsKCQlzZXQgeXQgJHkxCgkgICAgfQoJfQoJaWYge1tpbmZvIGV4aXN0cyBzaWRlbGluZXMoJGlkKV19IHsKCSAgICBmb3JlYWNoIGxzICRzaWRlbGluZXMoJGlkKSB7CgkJc2V0IHkxIFtsaW5kZXggJGxzIDAgMV0KCQlpZiB7JHkxID4gJHkgJiYgKCR5dCBlcSB7fSB8fCAkeTEgPCAkeXQpfSB7CgkJICAgIHNldCB5dCAkeTEKCQl9CgkgICAgfQoJfQogICAgfSBlbHNlIHsKCWlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7CgkgICAgZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJCXNldCB5MSBbbGluZGV4ICRscyAwIGVuZF0KCQlpZiB7JHkxIDwgJHkgJiYgKCR5dCBlcSB7fSB8fCAkeTEgPiAkeXQpfSB7CgkJICAgIHNldCB5dCAkeTEKCQl9CgkgICAgfQoJfQogICAgfQogICAgaWYgeyR5dCBlcSB7fX0gcmV0dXJuCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPD0gMH0gcmV0dXJuCiAgICBzZXQgdmlldyBbJGNhbnYgeXZpZXddCiAgICBzZXQgeXNwYW4gW2V4cHIge1tsaW5kZXggJHZpZXcgMV0gLSBbbGluZGV4ICR2aWV3IDBdfV0KICAgIHNldCB5ZnJhYyBbZXhwciB7JHl0IC8gJHltYXggLSAkeXNwYW4gLyAyfV0KICAgIGlmIHskeWZyYWMgPCAwfSB7CglzZXQgeWZyYWMgMAogICAgfQogICAgJGNhbnYgeXZpZXcgbW92ZXRvICR5ZnJhYwp9Cgpwcm9jIGxpbmVjbGljayB7eCB5IGlkIGlzbmV3fSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0aW5mbyBjaGlsZHJlbiBjZmxpc3QgY2FudiB0aGlja2VybGluZQoKICAgIHVubWFya21hdGNoZXMKICAgIHVuc2VsZWN0bGluZQogICAgbm9ybWFsbGluZQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICAjIGRyYXcgdGhpcyBsaW5lIHRoaWNrZXIgdGhhbiBub3JtYWwKICAgIGRyYXdsaW5lcyAkaWQgMQogICAgc2V0IHRoaWNrZXJsaW5lICRpZAogICAgaWYgeyRpc25ld30gewoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJaWYgeyR5bWF4IGVxIHt9fSByZXR1cm4KCXNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KCXNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIH0KICAgIHNldCBkaXJuIFtjbGlja2lzb25hcnJvdyAkaWQgJHldCiAgICBpZiB7JGRpcm4gbmUge319IHsKCWFycm93anVtcCAkaWQgJGRpcm4gJHkKCXJldHVybgogICAgfQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBsaW5lY2xpY2sgJHggJHkgJGlkIDBdCiAgICB9CiAgICAjIGZpbGwgdGhlIGRldGFpbHMgcGFuZSB3aXRoIGluZm8gYWJvdXQgdGhpcyBsaW5lCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6XHQiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkaWRdCiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdERhdGU6XHRbbGluZGV4ICRpbmZvIDJdXG4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGNoaWxkcmVuKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5DaGlsZHJlbjoiCglzZXQgaSAwCglmb3JlYWNoIGNoaWxkICRjaGlsZHJlbigkaWQpIHsKCSAgICBpbmNyIGkKCSAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkY2hpbGQpCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHQiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgJGNoaWxkIFtsaXN0IGxpbmsgbGluayRpXQoJICAgICRjdGV4dCB0YWcgYmluZCBsaW5rJGkgPDE+IFtsaXN0IHNlbGJ5aWQgJGNoaWxkXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV0iCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHREYXRlOlx0W2xpbmRleCAkaW5mbyAyXVxuIgoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCgogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKfQoKcHJvYyBub3JtYWxsaW5lIHt9IHsKICAgIGdsb2JhbCB0aGlja2VybGluZQogICAgaWYge1tpbmZvIGV4aXN0cyB0aGlja2VybGluZV19IHsKCWRyYXdsaW5lcyAkdGhpY2tlcmxpbmUgMAoJdW5zZXQgdGhpY2tlcmxpbmUKICAgIH0KfQoKcHJvYyBzZWxieWlkIHtpZH0gewogICAgZ2xvYmFsIGlkbGluZQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXNlbGVjdGxpbmUgJGlkbGluZSgkaWQpIDEKICAgIH0KfQoKcHJvYyBtc3RpbWUge30gewogICAgZ2xvYmFsIHN0YXJ0bXN0aW1lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzdGFydG1zdGltZV19IHsKCXNldCBzdGFydG1zdGltZSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICB9CiAgICByZXR1cm4gW2Zvcm1hdCAiJS4zZiIgW2V4cHIgeyhbY2xvY2sgY2xpY2sgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc3RpbWUpIC8gMTAwMC4wfV1dCn0KCnByb2Mgcm93bWVudSB7eCB5IGlkfSB7CiAgICBnbG9iYWwgcm93Y3R4bWVudSBpZGxpbmUgc2VsZWN0ZWRsaW5lIHJvd21lbnVpZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gfHwgJGlkbGluZSgkaWQpIGVxICRzZWxlY3RlZGxpbmV9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDAgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMSAtc3RhdGUgJHN0YXRlCiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAyIC1zdGF0ZSAkc3RhdGUKICAgIHNldCByb3dtZW51aWQgJGlkCiAgICB0a19wb3B1cCAkcm93Y3R4bWVudSAkeCAkeQp9Cgpwcm9jIGRpZmZ2c3NlbCB7ZGlybn0gewogICAgZ2xvYmFsIHJvd21lbnVpZCBzZWxlY3RlZGxpbmUgbGluZWlkCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBpZiB7JGRpcm59IHsKCXNldCBvbGRpZCAkbGluZWlkKCRzZWxlY3RlZGxpbmUpCglzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgfSBlbHNlIHsKCXNldCBvbGRpZCAkcm93bWVudWlkCglzZXQgbmV3aWQgJGxpbmVpZCgkc2VsZWN0ZWRsaW5lKQogICAgfQogICAgYWRkdG9oaXN0b3J5IFtsaXN0IGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkXQogICAgZG9zZWxkaWZmICRvbGRpZCAkbmV3aWQKfQoKcHJvYyBkb3NlbGRpZmYge29sZGlkIG5ld2lkfSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0CiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLjAgMC4wCiAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLjAgbGVmdAogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKICAgICRjZmxpc3QgaW5zZXJ0IGVuZCAiVG9wIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkZyb20gIgogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmswIDwxPiBbbGlzdCBzZWxieWlkICRvbGRpZF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICRvbGRpZCBbbGlzdCBsaW5rIGxpbmswXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblxuVG8gICAiCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazEgPDE+IFtsaXN0IHNlbGJ5aWQgJG5ld2lkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG5ld2lkIFtsaXN0IGxpbmsgbGluazFdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY3RleHQgdGFnIGRlbGV0ZSBDb21tZW50cwogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgc3RhcnRkaWZmIFtsaXN0ICRuZXdpZCAkb2xkaWRdCn0KCnByb2MgbWtwYXRjaCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIGN1cnJlbnRpZCBjb21taXRpbmZvIHBhdGNodG9wIHBhdGNobnVtCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgb2xkaWQgJGN1cnJlbnRpZAogICAgc2V0IG9sZGhlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICBzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgc2V0IG5ld2hlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICBzZXQgdG9wIC5wYXRjaAogICAgc2V0IHBhdGNodG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJHZW5lcmF0ZSBwYXRjaCIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZyb20gLXRleHQgIkZyb206IgogICAgZW50cnkgJHRvcC5mcm9tc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21zaGExIGluc2VydCAwICRvbGRpZAogICAgJHRvcC5mcm9tc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmZyb20gJHRvcC5mcm9tc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuZnJvbWhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9taGVhZCBpbnNlcnQgMCAkb2xkaGVhZAogICAgJHRvcC5mcm9taGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuZnJvbWhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRvIC10ZXh0ICJUbzoiCiAgICBlbnRyeSAkdG9wLnRvc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvc2hhMSBpbnNlcnQgMCAkbmV3aWQKICAgICR0b3AudG9zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AudG8gJHRvcC50b3NoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLnRvaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvaGVhZCBpbnNlcnQgMCAkbmV3aGVhZAogICAgJHRvcC50b2hlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLnRvaGVhZCAtc3RpY2t5IHcKICAgIGJ1dHRvbiAkdG9wLnJldiAtdGV4dCAiUmV2ZXJzZSIgLWNvbW1hbmQgbWtwYXRjaHJldiAtcGFkeCA1CiAgICBncmlkICR0b3AucmV2IHggLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJwYXRjaCRwYXRjaG51bS5wYXRjaCJdCiAgICBpbmNyIHBhdGNobnVtCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiR2VuZXJhdGUiIC1jb21tYW5kIG1rcGF0Y2hnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWtwYXRjaGNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2MgbWtwYXRjaHJldiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgb2xkaGVhZCBbJHBhdGNodG9wLmZyb21oZWFkIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgbmV3aGVhZCBbJHBhdGNodG9wLnRvaGVhZCBnZXRdCiAgICBmb3JlYWNoIGUgW2xpc3QgZnJvbXNoYTEgZnJvbWhlYWQgdG9zaGExIHRvaGVhZF0gXAoJICAgIHYgW2xpc3QgJG5ld2lkICRuZXdoZWFkICRvbGRpZCAkb2xkaGVhZF0gewoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIG5vcm1hbAoJJHBhdGNodG9wLiRlIGRlbGV0ZSAwIGVuZAoJJHBhdGNodG9wLiRlIGluc2VydCAwICR2CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIH0KfQoKcHJvYyBta3BhdGNoZ28ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBmbmFtZSBbJHBhdGNodG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgZ2l0LWRpZmYtdHJlZSAtcCAkb2xkaWQgJG5ld2lkID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHBhdGNoOiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3BhdGNoY2FuIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWt0YWcge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBta3RhZ3RvcCBjb21taXRpbmZvCgogICAgc2V0IHRvcCAubWFrZXRhZwogICAgc2V0IG1rdGFndG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJDcmVhdGUgdGFnIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRsYWIgLXRleHQgIlRhZyBuYW1lOiIKICAgIGVudHJ5ICR0b3AudGFnIC13aWR0aCA2MAogICAgZ3JpZCAkdG9wLnRsYWIgJHRvcC50YWcgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJDcmVhdGUiIC1jb21tYW5kIG1rdGFnZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rdGFnY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AudGFnCn0KCnByb2MgZG9ta3RhZyB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AgZW52IHRhZ2lkcyBpZHRhZ3MKCiAgICBzZXQgaWQgWyRta3RhZ3RvcC5zaGExIGdldF0KICAgIHNldCB0YWcgWyRta3RhZ3RvcC50YWcgZ2V0XQogICAgaWYgeyR0YWcgPT0ge319IHsKCWVycm9yX3BvcHVwICJObyB0YWcgbmFtZSBzcGVjaWZpZWQiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCR0YWcpXX0gewoJZXJyb3JfcG9wdXAgIlRhZyBcIiR0YWdcIiBhbHJlYWR5IGV4aXN0cyIKCXJldHVybgogICAgfQogICAgaWYge1tjYXRjaCB7CglzZXQgZGlyIFtnaXRkaXJdCglzZXQgZm5hbWUgW2ZpbGUgam9pbiAkZGlyICJyZWZzL3RhZ3MiICR0YWddCglzZXQgZiBbb3BlbiAkZm5hbWUgd10KCXB1dHMgJGYgJGlkCgljbG9zZSAkZgogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgdGFnOiAkZXJyIgoJcmV0dXJuCiAgICB9CgogICAgc2V0IHRhZ2lkcygkdGFnKSAkaWQKICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJHRhZwogICAgcmVkcmF3dGFncyAkaWQKfQoKcHJvYyByZWRyYXd0YWdzIHtpZH0gewogICAgZ2xvYmFsIGNhbnYgbGluZWh0YWcgaWRsaW5lIGlkcG9zIHNlbGVjdGVkbGluZQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gcmV0dXJuCiAgICAkY2FudiBkZWxldGUgdGFnLiRpZAogICAgc2V0IHh0IFtldmFsIGRyYXd0YWdzICRpZCAkaWRwb3MoJGlkKV0KICAgICRjYW52IGNvb3JkcyAkbGluZWh0YWcoJGlkbGluZSgkaWQpKSAkeHQgW2xpbmRleCAkaWRwb3MoJGlkKSAyXQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRzZWxlY3RlZGxpbmUgPT0gJGlkbGluZSgkaWQpfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAogICAgfQp9Cgpwcm9jIG1rdGFnY2FuIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRta3RhZ3RvcH0KICAgIHVuc2V0IG1rdGFndG9wCn0KCnByb2MgbWt0YWdnbyB7fSB7CiAgICBkb21rdGFnCiAgICBta3RhZ2Nhbgp9Cgpwcm9jIHdyaXRlY29tbWl0IHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgd3Jjb210b3AgY29tbWl0aW5mbyB3cmNvbWNtZAoKICAgIHNldCB0b3AgLndyaXRlY29tbWl0CiAgICBzZXQgd3Jjb210b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIldyaXRlIGNvbW1pdCB0byBmaWxlIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmNsYWIgLXRleHQgIkNvbW1hbmQ6IgogICAgZW50cnkgJHRvcC5jbWQgLXdpZHRoIDYwIC10ZXh0dmFyaWFibGUgd3Jjb21jbWQKICAgIGdyaWQgJHRvcC5jbGFiICR0b3AuY21kIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgImNvbW1pdC1bc3RyaW5nIHJhbmdlICRyb3dtZW51aWQgMCA2XSJdCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiV3JpdGUiIC1jb21tYW5kIHdyY29tZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHdyY29tY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyB3cmNvbWdvIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIHNldCBpZCBbJHdyY29tdG9wLnNoYTEgZ2V0XQogICAgc2V0IGNtZCAiZWNobyAkaWQgfCBbJHdyY29tdG9wLmNtZCBnZXRdIgogICAgc2V0IGZuYW1lIFskd3Jjb210b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBzaCAtYyAkY21kID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIHdyaXRpbmcgY29tbWl0OiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyB3cmNvbWNhbiB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIGxpc3RyZWZzIHtpZH0gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCgogICAgc2V0IHgge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgeCAkaWR0YWdzKCRpZCkKICAgIH0KICAgIHNldCB5IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCB5ICRpZGhlYWRzKCRpZCkKICAgIH0KICAgIHNldCB6IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgeiAkaWRvdGhlcnJlZnMoJGlkKQogICAgfQogICAgcmV0dXJuIFtsaXN0ICR4ICR5ICR6XQp9Cgpwcm9jIHJlcmVhZHJlZnMge30gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgdGFnaWRzIGhlYWRpZHMgb3RoZXJyZWZpZHMKCiAgICBzZXQgcmVmaWRzIFtjb25jYXQgW2FycmF5IG5hbWVzIGlkdGFnc10gXAoJCSAgICBbYXJyYXkgbmFtZXMgaWRoZWFkc10gW2FycmF5IG5hbWVzIGlkb3RoZXJyZWZzXV0KICAgIGZvcmVhY2ggaWQgJHJlZmlkcyB7CglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV19IHsKCSAgICBzZXQgcmVmKCRpZCkgW2xpc3RyZWZzICRpZF0KCX0KICAgIH0KICAgIGZvcmVhY2ggdiB7dGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KICAgIHJlYWRyZWZzCiAgICBzZXQgcmVmaWRzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJHJlZmlkcyBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCgkJCVthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXV0KICAgIGZvcmVhY2ggaWQgJHJlZmlkcyB7CglzZXQgdiBbbGlzdHJlZnMgJGlkXQoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldIHx8ICRyZWYoJGlkKSAhPSAkdn0gewoJICAgIHJlZHJhd3RhZ3MgJGlkCgl9CiAgICB9Cn0KCnByb2Mgc2hvd3RhZyB7dGFnIGlzbmV3fSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0IHRhZ2NvbnRlbnRzIHRhZ2lkcyBsaW5rbnVtCgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNob3d0YWcgJHRhZyAwXQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICBzZXQgbGlua251bSAwCiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2NvbnRlbnRzKCR0YWcpXX0gewoJc2V0IHRleHQgJHRhZ2NvbnRlbnRzKCR0YWcpCiAgICB9IGVsc2UgewoJc2V0IHRleHQgIlRhZzogJHRhZ1xuSWQ6ICAkdGFnaWRzKCR0YWcpIgogICAgfQogICAgYXBwZW5kd2l0aGxpbmtzICR0ZXh0CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCn0KCnByb2MgZG9xdWl0IHt9IHsKICAgIGdsb2JhbCBzdG9wcGVkCiAgICBzZXQgc3RvcHBlZCAxMDAKICAgIGRlc3Ryb3kgLgp9CgojIGRlZmF1bHRzLi4uCnNldCBkYXRlbW9kZSAwCnNldCBib2xkbmFtZXMgMApzZXQgZGlmZm9wdHMgIi1VIDUgLXAiCnNldCB3cmNvbWNtZCAiZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC1wIC0tcHJldHR5IgoKc2V0IG1haW5mb250IHtIZWx2ZXRpY2EgOX0Kc2V0IHRleHRmb250IHtDb3VyaWVyIDl9CnNldCBmaW5kbWVyZ2VmaWxlcyAwCnNldCBnYXVkeWRpZmYgMApzZXQgbWF4Z3JhcGhwY3QgNTAKc2V0IG1heHdpZHRoIDE2CgpzZXQgY29sb3JzIHtncmVlbiByZWQgYmx1ZSBtYWdlbnRhIGRhcmtncmV5IGJyb3duIG9yYW5nZX0KCmNhdGNoIHtzb3VyY2Ugfi8uZ2l0a30KCnNldCBuYW1lZm9udCAkbWFpbmZvbnQKaWYgeyRib2xkbmFtZXN9IHsKICAgIGxhcHBlbmQgbmFtZWZvbnQgYm9sZAp9CgpzZXQgcmV2dHJlZWFyZ3Mge30KZm9yZWFjaCBhcmcgJGFyZ3YgewogICAgc3dpdGNoIC1yZWdleHAgLS0gJGFyZyB7CgkiXiQiIHsgfQoJIl4tYiIgeyBzZXQgYm9sZG5hbWVzIDEgfQoJIl4tZCIgeyBzZXQgZGF0ZW1vZGUgMSB9CglkZWZhdWx0IHsKCSAgICBsYXBwZW5kIHJldnRyZWVhcmdzICRhcmcKCX0KICAgIH0KfQoKc2V0IGhpc3Rvcnkge30Kc2V0IGhpc3RvcnlpbmRleCAwCgpzZXQgc3RvcHBlZCAwCnNldCByZWRpc3BsYXlpbmcgMApzZXQgc3R1ZmZzYXZlZCAwCnNldCBwYXRjaG51bSAwCnNldGNvb3JkcwptYWtld2luZG93CnJlYWRyZWZzCmdldGNvbW1pdHMgJHJldnRyZWVhcmdzCg==