IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgaXQgbWF5IGJlIHVzZWQsIGNvcGllZCwgbW9kaWZpZWQKIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwKIyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKcHJvYyBnaXRkaXIge30gewogICAgZ2xvYmFsIGVudgogICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoR0lUX0RJUildfSB7CglyZXR1cm4gJGVudihHSVRfRElSKQogICAgfSBlbHNlIHsKCXJldHVybiAiLmdpdCIKICAgIH0KfQoKcHJvYyBnZXRjb21taXRzIHtyYXJnc30gewogICAgZ2xvYmFsIGNvbW1pdHMgY29tbWZkIHBoYXNlIGNhbnYgbWFpbmZvbnQgZW52CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlIG5jbXVwZGF0ZQogICAgZ2xvYmFsIGN0ZXh0IG1haW5jdXJzb3IgdGV4dGN1cnNvciBsZWZ0b3ZlcgoKICAgICMgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhIC5naXQgZGlyZWN0b3J5IHNvbWV3aGVyZS4uLgogICAgc2V0IGdpdGRpciBbZ2l0ZGlyXQogICAgaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSAkZ2l0ZGlyXX0gewoJZXJyb3JfcG9wdXAgIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5IFwiJGdpdGRpclwiLiIKCWV4aXQgMQogICAgfQogICAgc2V0IGNvbW1pdHMge30KICAgIHNldCBwaGFzZSBnZXRjb21taXRzCiAgICBzZXQgc3RhcnRtc2VjcyBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciAkc3RhcnRtc2VjcyArIDEwMF0KICAgIHNldCBuY211cGRhdGUgMQogICAgaWYgW2NhdGNoIHsKCXNldCBwYXJzZV9hcmdzIFtjb25jYXQgLS1kZWZhdWx0IEhFQUQgJHJhcmdzXQoJc2V0IHBhcnNlZF9hcmdzIFtzcGxpdCBbZXZhbCBleGVjIGdpdC1yZXYtcGFyc2UgJHBhcnNlX2FyZ3NdICJcbiJdCiAgICB9XSB7CgkjIGlmIGdpdC1yZXYtcGFyc2UgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4uLgoJaWYgeyRyYXJncyA9PSB7fX0gewoJICAgIHNldCByYXJncyBIRUFECgl9CglzZXQgcGFyc2VkX2FyZ3MgJHJhcmdzCiAgICB9CiAgICBpZiBbY2F0Y2ggewoJc2V0IGNvbW1mZCBbb3BlbiAifGdpdC1yZXYtbGlzdCAtLWhlYWRlciAtLXRvcG8tb3JkZXIgLS1wYXJlbnRzICRwYXJzZWRfYXJncyIgcl0KICAgIH0gZXJyXSB7CglwdXRzIHN0ZGVyciAiRXJyb3IgZXhlY3V0aW5nIGdpdC1yZXYtbGlzdDogJGVyciIKCWV4aXQgMQogICAgfQogICAgc2V0IGxlZnRvdmVyIHt9CiAgICBmY29uZmlndXJlICRjb21tZmQgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGxmCiAgICBmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkY29tbWZkXQogICAgJGNhbnYgZGVsZXRlIGFsbAogICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIlJlYWRpbmcgY29tbWl0cy4uLiIgXAoJLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAp9Cgpwcm9jIGdldGNvbW1pdGxpbmVzIHtjb21tZmR9ICB7CiAgICBnbG9iYWwgY29tbWl0cyBwYXJlbnRzIGNkYXRlIGNoaWxkcmVuCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBoYXNlIG5leHR1cGRhdGUKICAgIGdsb2JhbCBzdG9wcGVkIHJlZGlzcGxheWluZyBsZWZ0b3ZlcgoKICAgIHNldCBzdHVmZiBbcmVhZCAkY29tbWZkXQogICAgaWYgeyRzdHVmZiA9PSB7fX0gewoJaWYgeyFbZW9mICRjb21tZmRdfSByZXR1cm4KCSMgc2V0IGl0IGJsb2NraW5nIHNvIHdlIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIHRlcm1pbmF0ZQoJZmNvbmZpZ3VyZSAkY29tbWZkIC1ibG9ja2luZyAxCglpZiB7IVtjYXRjaCB7Y2xvc2UgJGNvbW1mZH0gZXJyXX0gewoJICAgIGFmdGVyIGlkbGUgZmluaXNoY29tbWl0cwoJICAgIHJldHVybgoJfQoJaWYge1tzdHJpbmcgcmFuZ2UgJGVyciAwIDRdID09ICJ1c2FnZSJ9IHsKCSAgICBzZXQgZXJyIFwKe0dpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0czogYmFkIGFyZ3VtZW50cyB0byBnaXQtcmV2LWxpc3QuCihOb3RlOiBhcmd1bWVudHMgdG8gZ2l0ayBhcmUgcGFzc2VkIHRvIGdpdC1yZXYtbGlzdAp0byBhbGxvdyBzZWxlY3Rpb24gb2YgY29tbWl0cyB0byBiZSBkaXNwbGF5ZWQuKX0KCX0gZWxzZSB7CgkgICAgc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzOiAkZXJyIgoJfQoJZXJyb3JfcG9wdXAgJGVycgoJZXhpdCAxCiAgICB9CiAgICBzZXQgc3RhcnQgMAogICAgd2hpbGUgMSB7CglzZXQgaSBbc3RyaW5nIGZpcnN0ICJcMCIgJHN0dWZmICRzdGFydF0KCWlmIHskaSA8IDB9IHsKCSAgICBhcHBlbmQgbGVmdG92ZXIgW3N0cmluZyByYW5nZSAkc3R1ZmYgJHN0YXJ0IGVuZF0KCSAgICByZXR1cm4KCX0KCXNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJHN0dWZmICRzdGFydCBbZXhwciB7JGkgLSAxfV1dCglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAiJGxlZnRvdmVyJGNtaXQiCgkgICAgc2V0IGxlZnRvdmVyIHt9Cgl9CglzZXQgc3RhcnQgW2V4cHIgeyRpICsgMX1dCglzZXQgaiBbc3RyaW5nIGZpcnN0ICJcbiIgJGNtaXRdCglzZXQgb2sgMAoJaWYgeyRqID49IDB9IHsKCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCgkgICAgc2V0IG9rIDEKCSAgICBmb3JlYWNoIGlkICRpZHMgewoJCWlmIHshW3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQtcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCgkgICAgZXhpdCAxCgl9CglzZXQgaWQgW2xpbmRleCAkaWRzIDBdCglzZXQgb2xkcyBbbHJhbmdlICRpZHMgMSBlbmRdCglzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRjbWl0IFtleHByIHskaiArIDF9XSBlbmRdCglsYXBwZW5kIGNvbW1pdHMgJGlkCglzZXQgY29tbWl0bGlzdGVkKCRpZCkgMQoJcGFyc2Vjb21taXQgJGlkICRjbWl0IDEgW2xyYW5nZSAkaWRzIDEgZW5kXQoJZHJhd2NvbW1pdCAkaWQKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CgkgICAgZG91cGRhdGUgMQoJfQoJd2hpbGUgeyRyZWRpc3BsYXlpbmd9IHsKCSAgICBzZXQgcmVkaXNwbGF5aW5nIDAKCSAgICBpZiB7JHN0b3BwZWQgPT0gMX0gewoJCXNldCBzdG9wcGVkIDAKCQlzZXQgcGhhc2UgImdldGNvbW1pdHMiCgkJZm9yZWFjaCBpZCAkY29tbWl0cyB7CgkJICAgIGRyYXdjb21taXQgJGlkCgkJICAgIGlmIHskc3RvcHBlZH0gYnJlYWsKCQkgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCQkJZG91cGRhdGUgMQoJCSAgICB9CgkJfQoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyBkb3VwZGF0ZSB7cmVhZGluZ30gewogICAgZ2xvYmFsIGNvbW1mZCBuZXh0dXBkYXRlIG51bWNvbW1pdHMgbmNtdXBkYXRlCgogICAgaWYgeyRyZWFkaW5nfSB7CglmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSB7fQogICAgfQogICAgdXBkYXRlCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCiAgICBpZiB7JG51bWNvbW1pdHMgPCAxMDB9IHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMX1dCiAgICB9IGVsc2VpZiB7JG51bWNvbW1pdHMgPCAxMDAwMH0gewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMH1dCiAgICB9IGVsc2UgewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMDB9XQogICAgfQogICAgaWYgeyRyZWFkaW5nfSB7CglmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkY29tbWZkXQogICAgfQp9Cgpwcm9jIHJlYWRjb21taXQge2lkfSB7CiAgICBpZiBbY2F0Y2gge3NldCBjb250ZW50cyBbZXhlYyBnaXQtY2F0LWZpbGUgY29tbWl0ICRpZF19XSByZXR1cm4KICAgIHBhcnNlY29tbWl0ICRpZCAkY29udGVudHMgMCB7fQp9Cgpwcm9jIHBhcnNlY29tbWl0IHtpZCBjb250ZW50cyBsaXN0ZWQgb2xkc30gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2hpbGRyZW4gbmNoaWxkcmVuIHBhcmVudHMgbnBhcmVudHMgY2RhdGUgbmNsZWZ0CgogICAgc2V0IGluaGRyIDEKICAgIHNldCBjb21tZW50IHt9CiAgICBzZXQgaGVhZGxpbmUge30KICAgIHNldCBhdW5hbWUge30KICAgIHNldCBhdWRhdGUge30KICAgIHNldCBjb21uYW1lIHt9CiAgICBzZXQgY29tZGF0ZSB7fQogICAgaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRpZCldfSB7CglzZXQgY2hpbGRyZW4oJGlkKSB7fQoJc2V0IG5jaGlsZHJlbigkaWQpIDAKCXNldCBuY2xlZnQoJGlkKSAwCiAgICB9CiAgICBzZXQgcGFyZW50cygkaWQpICRvbGRzCiAgICBzZXQgbnBhcmVudHMoJGlkKSBbbGxlbmd0aCAkb2xkc10KICAgIGZvcmVhY2ggcCAkb2xkcyB7CglpZiB7IVtpbmZvIGV4aXN0cyBuY2hpbGRyZW4oJHApXX0gewoJICAgIHNldCBjaGlsZHJlbigkcCkgW2xpc3QgJGlkXQoJICAgIHNldCBuY2hpbGRyZW4oJHApIDEKCSAgICBzZXQgbmNsZWZ0KCRwKSAxCgl9IGVsc2VpZiB7W2xzZWFyY2ggLWV4YWN0ICRjaGlsZHJlbigkcCkgJGlkXSA8IDB9IHsKCSAgICBsYXBwZW5kIGNoaWxkcmVuKCRwKSAkaWQKCSAgICBpbmNyIG5jaGlsZHJlbigkcCkKCSAgICBpbmNyIG5jbGVmdCgkcCkKCX0KICAgIH0KICAgIHNldCBoZHJlbmQgW3N0cmluZyBmaXJzdCAiXG5cbiIgJGNvbnRlbnRzXQogICAgaWYgeyRoZHJlbmQgPCAwfSB7CgkjIHNob3VsZCBuZXZlciBoYXBwZW4uLi4KCXNldCBoZHJlbmQgW3N0cmluZyBsZW5ndGggJGNvbnRlbnRzXQogICAgfQogICAgc2V0IGhlYWRlciBbc3RyaW5nIHJhbmdlICRjb250ZW50cyAwIFtleHByIHskaGRyZW5kIC0gMX1dXQogICAgc2V0IGNvbW1lbnQgW3N0cmluZyByYW5nZSAkY29udGVudHMgW2V4cHIgeyRoZHJlbmQgKyAyfV0gZW5kXQogICAgZm9yZWFjaCBsaW5lIFtzcGxpdCAkaGVhZGVyICJcbiJdIHsKCXNldCB0YWcgW2xpbmRleCAkbGluZSAwXQoJaWYgeyR0YWcgPT0gImF1dGhvciJ9IHsKCSAgICBzZXQgYXVkYXRlIFtsaW5kZXggJGxpbmUgZW5kLTFdCgkgICAgc2V0IGF1bmFtZSBbbHJhbmdlICRsaW5lIDEgZW5kLTJdCgl9IGVsc2VpZiB7JHRhZyA9PSAiY29tbWl0dGVyIn0gewoJICAgIHNldCBjb21kYXRlIFtsaW5kZXggJGxpbmUgZW5kLTFdCgkgICAgc2V0IGNvbW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfQogICAgfQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICAjIHRha2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1lbnQgYXMgdGhlIGhlYWRsaW5lCiAgICBzZXQgaSBbc3RyaW5nIGZpcnN0ICJcbiIgJGNvbW1lbnRdCiAgICBpZiB7JGkgPj0gMH0gewoJc2V0IGhlYWRsaW5lIFtzdHJpbmcgdHJpbSBbc3RyaW5nIHJhbmdlICRjb21tZW50IDAgJGldXQogICAgfSBlbHNlIHsKCXNldCBoZWFkbGluZSAkY29tbWVudAogICAgfQogICAgaWYgeyEkbGlzdGVkfSB7CgkjIGdpdC1yZXYtbGlzdCBpbmRlbnRzIHRoZSBjb21tZW50IGJ5IDQgc3BhY2VzOwoJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0LWNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCglzZXQgbmV3Y29tbWVudCB7fQoJZm9yZWFjaCBsaW5lIFtzcGxpdCAkY29tbWVudCAiXG4iXSB7CgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIiAgICAiCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgJGxpbmUKCSAgICBhcHBlbmQgbmV3Y29tbWVudCAiXG4iCgl9CglzZXQgY29tbWVudCAkbmV3Y29tbWVudAogICAgfQogICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CglzZXQgY2RhdGUoJGlkKSAkY29tZGF0ZQogICAgfQogICAgc2V0IGNvbW1pdGluZm8oJGlkKSBbbGlzdCAkaGVhZGxpbmUgJGF1bmFtZSAkYXVkYXRlIFwKCQkJICAgICAkY29tbmFtZSAkY29tZGF0ZSAkY29tbWVudF0KfQoKcHJvYyByZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcwoKICAgIHNldCByZWZkIFtvcGVuIFtsaXN0IHwgZ2l0LWxzLXJlbW90ZSBbZ2l0ZGlyXV0gcl0KICAgIHdoaWxlIHswIDw9IFtzZXQgbiBbZ2V0cyAkcmVmZCBsaW5lXV19IHsKCWlmIHshW3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pCXJlZnMvKFteXl0qKSR9ICRsaW5lIFwKCSAgICBtYXRjaCBpZCBwYXRoXX0gewoJICAgIGNvbnRpbnVlCgl9CglpZiB7IVtyZWdleHAge14odGFnc3xoZWFkcykvKC4qKSR9ICRwYXRoIG1hdGNoIHR5cGUgbmFtZV19IHsKCSAgICBzZXQgdHlwZSBvdGhlcnMKCSAgICBzZXQgbmFtZSAkcGF0aAoJfQoJaWYgeyR0eXBlID09ICJ0YWdzIn0gewoJICAgIHNldCB0YWdpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJG5hbWUKCSAgICBzZXQgb2JqIHt9CgkgICAgc2V0IHR5cGUge30KCSAgICBzZXQgdGFnIHt9CgkgICAgY2F0Y2ggewoJCXNldCBjb21taXQgW2V4ZWMgZ2l0LXJldi1wYXJzZSAiJGlkXjAiXQoJCWlmIHsiJGNvbW1pdCIgIT0gIiRpZCJ9IHsKCQkgICAgc2V0IHRhZ2lkcygkbmFtZSkgJGNvbW1pdAoJCSAgICBsYXBwZW5kIGlkdGFncygkY29tbWl0KSAkbmFtZQoJCX0KCSAgICB9CQkKCSAgICBjYXRjaCB7CgkgICAgICAgIHNldCB0YWdjb250ZW50cygkbmFtZSkgW2V4ZWMgZ2l0LWNhdC1maWxlIHRhZyAiJGlkIl0KCSAgICB9Cgl9IGVsc2VpZiB7ICR0eXBlID09ICJoZWFkcyIgfSB7CgkgICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWRoZWFkcygkaWQpICRuYW1lCgl9IGVsc2UgewoJICAgIHNldCBvdGhlcnJlZmlkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZG90aGVycmVmcygkaWQpICRuYW1lCgl9CiAgICB9CiAgICBjbG9zZSAkcmVmZAp9Cgpwcm9jIGVycm9yX3BvcHVwIG1zZyB7CiAgICBzZXQgdyAuZXJyb3IKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKICAgIHRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBtYWtld2luZG93IHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGxpbmVzcGMgY2hhcnNwYyBjdGV4dCBjZmxpc3QgdGV4dGZvbnQKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kdHlwZW1lbnUgZmluZGxvYyBmaW5kc3RyaW5nIGZzdHJpbmcgZ2VvbWV0cnkKICAgIGdsb2JhbCBlbnRyaWVzIHNoYTFlbnRyeSBzaGExc3RyaW5nIHNoYTFidXQKICAgIGdsb2JhbCBtYWluY3Vyc29yIHRleHRjdXJzb3IgY3VydGV4dGN1cnNvcgogICAgZ2xvYmFsIHJvd2N0eG1lbnUgZ2F1ZHlkaWZmIG1lcmdlbWF4CgogICAgbWVudSAuYmFyCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRmlsZSIgLW1lbnUgLmJhci5maWxlCiAgICBtZW51IC5iYXIuZmlsZQogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUmVyZWFkIHJlZmVyZW5jZXMiIC1jb21tYW5kIHJlcmVhZHJlZnMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlF1aXQiIC1jb21tYW5kIGRvcXVpdAogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciA0NSAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnYyKSBbZXhwciAzMCAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciAxNSAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciAyNSAqICRsaW5lc3BjICsgNF0KCXNldCBnZW9tZXRyeShjdGV4dHcpIDgwCglzZXQgZ2VvbWV0cnkoY3RleHRoKSAzMAoJc2V0IGdlb21ldHJ5KGNmbGlzdHcpIDMwCiAgICB9CiAgICBwYW5lZHdpbmRvdyAuY3RvcCAtb3JpZW50IHZlcnRpY2FsCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KHdpZHRoKV19IHsKCS5jdG9wIGNvbmYgLXdpZHRoICRnZW9tZXRyeSh3aWR0aCkgLWhlaWdodCAkZ2VvbWV0cnkoaGVpZ2h0KQoJc2V0IHRleHRoIFtleHByIHskZ2VvbWV0cnkoaGVpZ2h0KSAtICRnZW9tZXRyeShjYW52aCkgLSA1Nn1dCglzZXQgZ2VvbWV0cnkoY3RleHRoKSBbZXhwciB7KCR0ZXh0aCAtIDgpIC8KCQkJCSAgICBbZm9udCBtZXRyaWNzICR0ZXh0Zm9udCAtbGluZXNwYWNlXX1dCiAgICB9CiAgICBmcmFtZSAuY3RvcC50b3AKICAgIGZyYW1lIC5jdG9wLnRvcC5iYXIKICAgIHBhY2sgLmN0b3AudG9wLmJhciAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgc2V0IGNzY3JvbGwgLmN0b3AudG9wLmNzYgogICAgc2Nyb2xsYmFyICRjc2Nyb2xsIC1jb21tYW5kIHthbGxjYW52cyB5dmlld30gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCiAgICBwYWNrICRjc2Nyb2xsIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhbmVkd2luZG93IC5jdG9wLnRvcC5jbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CiAgICBwYWNrIC5jdG9wLnRvcC5jbGlzdCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wIGFkZCAuY3RvcC50b3AKICAgIHNldCBjYW52IC5jdG9wLnRvcC5jbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjEpIFwKCS1iZyB3aGl0ZSAtYmQgMCBcCgkteXNjcm9sbGluY3IgJGxpbmVzcGMgLXlzY3JvbGxjb21tYW5kICIkY3Njcm9sbCBzZXQiCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52CiAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCiAgICBjYW52YXMgJGNhbnYyIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYyKSBcCgktYmcgd2hpdGUgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC5jdG9wLnRvcC5jbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MykgXAoJLWJnIHdoaXRlIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYwogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudjMKICAgIGJpbmQgLmN0b3AudG9wLmNsaXN0IDxDb25maWd1cmU+IHtyZXNpemVjbGlzdHBhbmVzICVXICV3fQoKICAgIHNldCBzaGExZW50cnkgLmN0b3AudG9wLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOAogICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQogICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CiAgICBlbnRyeSAkc2hhMWVudHJ5IC13aWR0aCA0MCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzaGExc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCiAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCgogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1sZWZ0IC1kYXRhIHsKCSNkZWZpbmUgbGVmdF93aWR0aCAxNgoJI2RlZmluZSBsZWZ0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVmdF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAwLCAweDcwLCAweDAwLCAweDM4LCAweDAwLCAweDFjLCAweDAwLAoJMHgwZSwgMHgwMCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwZSwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MzgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4YzAsIDB4MDF9OwogICAgfQogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1yaWdodCAtZGF0YSB7CgkjZGVmaW5lIHJpZ2h0X3dpZHRoIDE2CgkjZGVmaW5lIHJpZ2h0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmlnaHRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHg4MCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwZSwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MzgsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsCgkweDAwLCAweDBlLCAweDAwLCAweDA3LCAweDgwLCAweDAzLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmxlZnRidXQgLWltYWdlIGJtLWxlZnQgLWNvbW1hbmQgZ29iYWNrIFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5sZWZ0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLWltYWdlIGJtLXJpZ2h0IC1jb21tYW5kIGdvZm9ydyBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtdGV4dCAiRmluZCIgLWNvbW1hbmQgZG9maW5kCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtc2lkZSBsZWZ0CiAgICBzZXQgZmluZHN0cmluZyB7fQogICAgc2V0IGZzdHJpbmcgLmN0b3AudG9wLmJhci5maW5kc3RyaW5nCiAgICBsYXBwZW5kIGVudHJpZXMgJGZzdHJpbmcKICAgIGVudHJ5ICRmc3RyaW5nIC13aWR0aCAzMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBmaW5kc3RyaW5nCiAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBmaW5kdHlwZSBFeGFjdAogICAgc2V0IGZpbmR0eXBlbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIFwKCQkJICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlciBGaWxlcyBQaWNrYXhlCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CiAgICAjIGZvciBtYWtpbmcgc3VyZSB0eXBlPT1FeGFjdCB3aGVuZXZlciBsb2M9PVBpY2theGUKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRsb2NjaGFuZ2UKCiAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAogICAgLmN0b3AgYWRkIC5jdG9wLmNkZXQKICAgIGZyYW1lIC5jdG9wLmNkZXQubGVmdAogICAgc2V0IGN0ZXh0IC5jdG9wLmNkZXQubGVmdC5jdGV4dAogICAgdGV4dCAkY3RleHQgLWJnIHdoaXRlIC1zdGF0ZSBkaXNhYmxlZCAtZm9udCAkdGV4dGZvbnQgXAoJLXdpZHRoICRnZW9tZXRyeShjdGV4dHcpIC1oZWlnaHQgJGdlb21ldHJ5KGN0ZXh0aCkgXAoJLXlzY3JvbGxjb21tYW5kICIuY3RvcC5jZGV0LmxlZnQuc2Igc2V0IiAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQubGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKCiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtYmFjayBibHVlIC1mb3JlIHdoaXRlCgkkY3RleHQgdGFnIGNvbmYgZDAgLWJhY2sgIiNmZjgwODAiCgkkY3RleHQgdGFnIGNvbmYgZDEgLWJhY2sgZ3JlZW4KICAgIH0gZWxzZSB7CgkkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZSBibHVlCgkkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmUgcmVkCgkkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmUgIiMwMGEwMDAiCgkkY3RleHQgdGFnIGNvbmYgbTAgLWZvcmUgcmVkCgkkY3RleHQgdGFnIGNvbmYgbTEgLWZvcmUgYmx1ZQoJJGN0ZXh0IHRhZyBjb25mIG0yIC1mb3JlIGdyZWVuCgkkY3RleHQgdGFnIGNvbmYgbTMgLWZvcmUgcHVycGxlCgkkY3RleHQgdGFnIGNvbmYgbTQgLWZvcmUgYnJvd24KCSRjdGV4dCB0YWcgY29uZiBtbWF4IC1mb3JlIGRhcmtncmV5CglzZXQgbWVyZ2VtYXggNQoJJGN0ZXh0IHRhZyBjb25mIG1yZXN1bHQgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KCSRjdGV4dCB0YWcgY29uZiBtc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCgkkY3RleHQgdGFnIGNvbmYgZm91bmQgLWJhY2sgeWVsbG93CiAgICB9CgogICAgZnJhbWUgLmN0b3AuY2RldC5yaWdodAogICAgc2V0IGNmbGlzdCAuY3RvcC5jZGV0LnJpZ2h0LmNmaWxlcwogICAgbGlzdGJveCAkY2ZsaXN0IC1iZyB3aGl0ZSAtc2VsZWN0bW9kZSBleHRlbmRlZCAtd2lkdGggJGdlb21ldHJ5KGNmbGlzdHcpIFwKCS15c2Nyb2xsY29tbWFuZCAiLmN0b3AuY2RldC5yaWdodC5zYiBzZXQiCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5yaWdodC5zYiAtY29tbWFuZCAiJGNmbGlzdCB5dmlldyIKICAgIHBhY2sgLmN0b3AuY2RldC5yaWdodC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AuY2RldCBhZGQgLmN0b3AuY2RldC5yaWdodAogICAgYmluZCAuY3RvcC5jZGV0IDxDb25maWd1cmU+IHtyZXNpemVjZGV0cGFuZXMgJVcgJXd9CgogICAgcGFjayAuY3RvcCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKCiAgICBiaW5kYWxsIDwxPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICAjYmluZGFsbCA8QjEtTW90aW9uPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTU+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgNSB1bml0cyIKICAgIGJpbmRhbGwgPDI+ICJhbGxjYW52cyBzY2FuIG1hcmsgMCAleSIKICAgIGJpbmRhbGwgPEIyLU1vdGlvbj4gImFsbGNhbnZzIHNjYW4gZHJhZ3RvIDAgJXkiCiAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgogICAgYmluZCAuIDxLZXktRG93bj4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5kIC4gPEtleS1SaWdodD4gImdvZm9ydyIKICAgIGJpbmQgLiA8S2V5LUxlZnQ+ICJnb2JhY2siCiAgICBiaW5kIC4gPEtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmQgLiA8S2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1EZWxldGU+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LUJhY2tTcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IHAgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBuICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSB6ICJnb2JhY2siCiAgICBiaW5ka2V5IHggImdvZm9ydyIKICAgIGJpbmRrZXkgaSAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IGsgInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IGogImdvYmFjayIKICAgIGJpbmRrZXkgbCAiZ29mb3J3IgogICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSBkICIkY3RleHQgeXZpZXcgc2Nyb2xsIDE4IHVuaXRzIgogICAgYmluZGtleSB1ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xOCB1bml0cyIKICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KICAgIGJpbmRrZXkgPEtleS1SZXR1cm4+IHtmaW5kbmV4dCAwfQogICAgYmluZGtleSA/IGZpbmRwcmV2CiAgICBiaW5ka2V5IGYgbmV4dGZpbGUKICAgIGJpbmQgLiA8Q29udHJvbC1xPiBkb3F1aXQKICAgIGJpbmQgLiA8Q29udHJvbC1mPiBkb2ZpbmQKICAgIGJpbmQgLiA8Q29udHJvbC1nPiB7ZmluZG5leHQgMH0KICAgIGJpbmQgLiA8Q29udHJvbC1yPiBmaW5kcHJldgogICAgYmluZCAuIDxDb250cm9sLWVxdWFsPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9BZGQ+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLW1pbnVzPiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfU3VidHJhY3Q+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgJGNmbGlzdCA8PExpc3Rib3hTZWxlY3Q+PiBsaXN0Ym94c2VsCiAgICBiaW5kIC4gPERlc3Ryb3k+IHtzYXZlc3R1ZmYgJVd9CiAgICBiaW5kIC4gPEJ1dHRvbi0xPiAiY2xpY2sgJVciCiAgICBiaW5kICRmc3RyaW5nIDxLZXktUmV0dXJuPiBkb2ZpbmQKICAgIGJpbmQgJHNoYTFlbnRyeSA8S2V5LVJldHVybj4gZ290b2NvbW1pdAogICAgYmluZCAkc2hhMWVudHJ5IDw8UGFzdGVTZWxlY3Rpb24+PiBjbGVhcnNoYTEKCiAgICBzZXQgbWFpbmN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgdGV4dGN1cnNvciBbJGN0ZXh0IGNnZXQgLWN1cnNvcl0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCgogICAgc2V0IHJvd2N0eG1lbnUgLnJvd2N0eG1lbnUKICAgIG1lbnUgJHJvd2N0eG1lbnUgLXRlYXJvZmYgMAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHRoaXMgLT4gc2VsZWN0ZWQiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMH0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiBzZWxlY3RlZCAtPiB0aGlzIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDF9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIk1ha2UgcGF0Y2giIC1jb21tYW5kIG1rcGF0Y2gKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIHRhZyIgLWNvbW1hbmQgbWt0YWcKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiIC1jb21tYW5kIHdyaXRlY29tbWl0Cn0KCiMgd2hlbiB3ZSBtYWtlIGEga2V5IGJpbmRpbmcgZm9yIHRoZSB0b3BsZXZlbCwgbWFrZSBzdXJlCiMgaXQgZG9lc24ndCBnZXQgdHJpZ2dlcmVkIHdoZW4gdGhhdCBrZXkgaXMgcHJlc3NlZCBpbiB0aGUKIyBmaW5kIHN0cmluZyBlbnRyeSB3aWRnZXQuCnByb2MgYmluZGtleSB7ZXYgc2NyaXB0fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgYmluZCAuICRldiAkc2NyaXB0CiAgICBzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSAkZXZdCiAgICBpZiB7JGVzY3JpcHQgPT0ge319IHsKCXNldCBlc2NyaXB0IFtiaW5kIEVudHJ5IDxLZXk+XQogICAgfQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWJpbmQgJGUgJGV2ICIkZXNjcmlwdDsgYnJlYWsiCiAgICB9Cn0KCiMgc2V0IHRoZSBmb2N1cyBiYWNrIHRvIHRoZSB0b3BsZXZlbCBmb3IgYW55IGNsaWNrIG91dHNpZGUKIyB0aGUgZW50cnkgd2lkZ2V0cwpwcm9jIGNsaWNrIHt3fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWlmIHskdyA9PSAkZX0gcmV0dXJuCiAgICB9CiAgICBmb2N1cyAuCn0KCnByb2Mgc2F2ZXN0dWZmIHt3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjZmxpc3QgbWFpbmZvbnQgdGV4dGZvbnQKICAgIGdsb2JhbCBzdHVmZnNhdmVkIGZpbmRtZXJnZWZpbGVzIGdhdWR5ZGlmZiBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG1heHdpZHRoCgogICAgaWYgeyRzdHVmZnNhdmVkfSByZXR1cm4KICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlIC5dfSByZXR1cm4KICAgIGNhdGNoIHsKCXNldCBmIFtvcGVuICJ+Ly5naXRrLW5ldyIgd10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1haW5mb250ICRtYWluZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZpbmRtZXJnZWZpbGVzICRmaW5kbWVyZ2VmaWxlc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGdhdWR5ZGlmZiAkZ2F1ZHlkaWZmXQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4Z3JhcGhwY3QgJG1heGdyYXBocGN0XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4d2lkdGggJG1heHdpZHRoXQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHdpZHRoKSBbd2luZm8gd2lkdGggLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGhlaWdodCkgW3dpbmZvIGhlaWdodCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjEpIFtleHByIFt3aW5mbyB3aWR0aCAkY2Fudl0tMl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIFt3aW5mbyB3aWR0aCAkY2FudjJdLTJdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciBbd2luZm8gd2lkdGggJGNhbnYzXS0yXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIgW3dpbmZvIGhlaWdodCAkY2Fudl0tMl0iCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjdGV4dF0gLSA4KSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSAkdGV4dGZvbnQgIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY3RleHR3KSAkd2lkIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY2ZsaXN0XSAtIDExKSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSBbJGNmbGlzdCBjZ2V0IC1mb250XSAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjZmxpc3R3KSAkd2lkIgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIFtpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3LzIgLSAyKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMxIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDMwfSB7CgkJc2V0IHNhc2gwIDMwCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPCAkc2FzaDAgKyAyMH0gewoJCXNldCBzYXNoMSBbZXhwciAkc2FzaDAgKyAyMF0KCSAgICB9CgkgICAgaWYgeyRzYXNoMSA+ICR3IC0gMTB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgJHcgLSAxMF0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByICRzYXNoMSAtIDIwXQoJCX0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KCSR3aW4gc2FzaCBwbGFjZSAxICRzYXNoMSBbbGluZGV4ICRzMSAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiBbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildIHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3KjMvNCAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCA0NX0gewoJCXNldCBzYXNoMCA0NQoJICAgIH0KCSAgICBpZiB7JHNhc2gwID4gJHcgLSAxNX0gewoJCXNldCBzYXNoMCBbZXhwciAkdyAtIDE1XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgdmVyc2lvbiAxLjIKCkNvcHlyaWdodCCpIDIwMDUgUGF1bCBNYWNrZXJyYXMKClVzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKcHJvYyBhc3NpZ25jb2xvciB7aWR9IHsKICAgIGdsb2JhbCBjb2xvcm1hcCBjb21tY29sb3JzIGNvbG9ycyBuZXh0Y29sb3IKICAgIGdsb2JhbCBwYXJlbnRzIG5wYXJlbnRzIGNoaWxkcmVuIG5jaGlsZHJlbgogICAgZ2xvYmFsIGNvcm5lcmNyb3NzaW5ncyBjcm9zc2luZ3MKCiAgICBpZiBbaW5mbyBleGlzdHMgY29sb3JtYXAoJGlkKV0gcmV0dXJuCiAgICBzZXQgbmNvbG9ycyBbbGxlbmd0aCAkY29sb3JzXQogICAgaWYgeyRucGFyZW50cygkaWQpIDw9IDEgJiYgJG5jaGlsZHJlbigkaWQpID09IDF9IHsKCXNldCBjaGlsZCBbbGluZGV4ICRjaGlsZHJlbigkaWQpIDBdCglpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRjaGlsZCldCgkgICAgJiYgJG5wYXJlbnRzKCRjaGlsZCkgPT0gMX0gewoJICAgIHNldCBjb2xvcm1hcCgkaWQpICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYmFkY29sb3JzIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkaWQpXX0gewoJZm9yZWFjaCB4ICRjb3JuZXJjcm9zc2luZ3MoJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkeCldCgkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KV0gPCAwfSB7CgkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMge30KCX0KICAgIH0KICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJaWYge1tpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJGlkKV19IHsKCSAgICBmb3JlYWNoIHggJGNyb3NzaW5ncygkaWQpIHsKCQlpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KV0gPCAwfSB7CgkJICAgIGxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkeCkKCQl9CgkgICAgfQoJICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJCXNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCSAgICB9Cgl9CglzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPCAkbmNvbG9ycyAtIDF9IHsKCWZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRpZCkgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKV0gPCAwfSB7CgkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICB9CgkgICAgaWYge1tpbmZvIGV4aXN0cyBwYXJlbnRzKCRjaGlsZCldfSB7CgkJZm9yZWFjaCBwICRwYXJlbnRzKCRjaGlsZCkgewoJCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRwKV0KCQkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKV0gPCAwfSB7CgkJCWxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkcCkKCQkgICAgfQoJCX0KCSAgICB9Cgl9CglpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgYmFkY29sb3JzICRvcmlnYmFkCgl9CiAgICB9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8PSAkbmNvbG9yc30ge2luY3IgaX0gewoJc2V0IGMgW2xpbmRleCAkY29sb3JzICRuZXh0Y29sb3JdCglpZiB7W2luY3IgbmV4dGNvbG9yXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBuZXh0Y29sb3IgMAoJfQoJaWYge1tsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjXX0gYnJlYWsKICAgIH0KICAgIHNldCBjb2xvcm1hcCgkaWQpICRjCn0KCnByb2MgaW5pdGdyYXBoIHt9IHsKICAgIGdsb2JhbCBjYW52eSBjYW52eTAgbGluZW5vIG51bWNvbW1pdHMgbmV4dGNvbG9yIGxpbmVzcGMKICAgIGdsb2JhbCBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcwogICAgZ2xvYmFsIG5jaGlsZHJlbiBuY2xlZnQKICAgIGdsb2JhbCBkaXNwbGlzdCBuaHlwZXJzcGFjZQoKICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ5ICRjYW52eTAKICAgIHNldCBsaW5lbm8gLTEKICAgIHNldCBudW1jb21taXRzIDAKICAgIGNhdGNoIHt1bnNldCBtYWlubGluZX0KICAgIGNhdGNoIHt1bnNldCBtYWlubGluZWFycm93fQogICAgY2F0Y2gge3Vuc2V0IHNpZGVsaW5lc30KICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIG5jaGlsZHJlbl0gewoJc2V0IG5jbGVmdCgkaWQpICRuY2hpbGRyZW4oJGlkKQogICAgfQogICAgc2V0IGRpc3BsaXN0IHt9CiAgICBzZXQgbmh5cGVyc3BhY2UgMAp9Cgpwcm9jIGJpbmRsaW5lIHt0IGlkfSB7CiAgICBnbG9iYWwgY2FudgoKICAgICRjYW52IGJpbmQgJHQgPEVudGVyPiAibGluZWVudGVyICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPE1vdGlvbj4gImxpbmVtb3Rpb24gJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TGVhdmU+ICJsaW5lbGVhdmUgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTE+ICJsaW5lY2xpY2sgJXggJXkgJGlkIDEiCn0KCnByb2MgZHJhd2xpbmVzIHtpZCB4dHJhIGRlbG9sZH0gewogICAgZ2xvYmFsIG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzIGx0aGlja25lc3MgY29sb3JtYXAgY2FudgoKICAgIGlmIHskZGVsb2xkfSB7CgkkY2FudiBkZWxldGUgbGluZXMuJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CglzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJG1haW5saW5lKCRpZCkgXAoJCSAgIC13aWR0aCBbZXhwciB7KCR4dHJhICsgMSkgKiAkbHRoaWNrbmVzc31dIFwKCQkgICAtZmlsbCAkY29sb3JtYXAoJGlkKSAtdGFncyBsaW5lcy4kaWQgXAoJCSAgIC1hcnJvdyAkbWFpbmxpbmVhcnJvdygkaWQpXQoJJGNhbnYgbG93ZXIgJHQKCWJpbmRsaW5lICR0ICRpZAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBzaWRlbGluZXMoJGlkKV19IHsKCWZvcmVhY2ggbHMgJHNpZGVsaW5lcygkaWQpIHsKCSAgICBzZXQgY29vcmRzIFtsaW5kZXggJGxzIDBdCgkgICAgc2V0IHRoaWNrIFtsaW5kZXggJGxzIDFdCgkgICAgc2V0IGFycm93IFtsaW5kZXggJGxzIDJdCgkgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRjb29yZHMgLWZpbGwgJGNvbG9ybWFwKCRpZCkgXAoJCSAgICAgICAtd2lkdGggW2V4cHIgeygkdGhpY2sgKyAkeHRyYSkgKiAkbHRoaWNrbmVzc31dIFwKCQkgICAgICAgLWFycm93ICRhcnJvdyAtdGFncyBsaW5lcy4kaWRdCgkgICAgJGNhbnYgbG93ZXIgJHQKCSAgICBiaW5kbGluZSAkdCAkaWQKCX0KICAgIH0KfQoKIyBsZXZlbCBoZXJlIGlzIGFuIGluZGV4IGluIGRpc3BsaXN0CnByb2MgZHJhd2NvbW1pdGxpbmUge2xldmVsfSB7CiAgICBnbG9iYWwgcGFyZW50cyBjaGlsZHJlbiBucGFyZW50cyBkaXNwbGlzdAogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbWFpbmZvbnQgbmFtZWZvbnQgY2FudnkgbGluZXNwYwogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZyBjb21taXRpbmZvCiAgICBnbG9iYWwgY29sb3JtYXAgbnVtY29tbWl0cyBjdXJyZW50cGFyZW50cyBkdXBwYXJlbnRzCiAgICBnbG9iYWwgaWR0YWdzIGlkbGluZSBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgbGluZW5vIGx0aGlja25lc3MgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgcm93dGV4dHggaWRwb3MgbGFzdHVzZSBkaXNwbGlzdAogICAgZ2xvYmFsIG9sZG5saW5lcyBvbGRkbGV2ZWwgb2xkZGlzcGxpc3QKCiAgICBpbmNyIG51bWNvbW1pdHMKICAgIGluY3IgbGluZW5vCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxpc3QgJGxldmVsXQogICAgc2V0IGxhc3R1c2UoJGlkKSAkbGluZW5vCiAgICBzZXQgbGluZWlkKCRsaW5lbm8pICRpZAogICAgc2V0IGlkbGluZSgkaWQpICRsaW5lbm8KICAgIHNldCBvZmlsbCBbZXhwciB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXT8gImJsdWUiOiAid2hpdGUifV0KICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJICAgIHNldCBucGFyZW50cygkaWQpIDAKCX0KICAgIH0KICAgIGFzc2lnbmNvbG9yICRpZAogICAgc2V0IGN1cnJlbnRwYXJlbnRzIHt9CiAgICBzZXQgZHVwcGFyZW50cyB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV0gJiYgW2luZm8gZXhpc3RzIHBhcmVudHMoJGlkKV19IHsKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRjdXJyZW50cGFyZW50cyAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjdXJyZW50cGFyZW50cyAkcAoJICAgIH0gZWxzZSB7CgkJIyByZW1lbWJlciB0aGF0IHRoaXMgcGFyZW50IHdhcyBsaXN0ZWQgdHdpY2UKCQlsYXBwZW5kIGR1cHBhcmVudHMgJHAKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgeCBbeGNvb3JkICRsZXZlbCAkbGV2ZWwgJGxpbmVub10KICAgIHNldCB5MSAkY2FudnkKICAgIHNldCBjYW52eSBbZXhwciAkY2FudnkgKyAkbGluZXNwY10KICAgIGFsbGNhbnZzIGNvbmYgLXNjcm9sbHJlZ2lvbiBcCglbbGlzdCAwIDAgMCBbZXhwciAkeTEgKyAwLjUgKiAkbGluZXNwYyArIDJdXQogICAgaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJbGFwcGVuZCBtYWlubGluZSgkaWQpICR4ICR5MQoJaWYgeyRtYWlubGluZWFycm93KCRpZCkgbmUgIm5vbmUifSB7CgkgICAgc2V0IG1haW5saW5lKCRpZCkgW3RyaW1kaWFnc3RhcnQgJG1haW5saW5lKCRpZCldCgl9CiAgICB9CiAgICBkcmF3bGluZXMgJGlkIDAgMAogICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIG92YWwgW2V4cHIgJHggLSAkb3JhZF0gW2V4cHIgJHkxIC0gJG9yYWRdIFwKCSAgICAgICBbZXhwciAkeCArICRvcmFkIC0gMV0gW2V4cHIgJHkxICsgJG9yYWQgLSAxXSBcCgkgICAgICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxXQogICAgJGNhbnYgcmFpc2UgJHQKICAgICRjYW52IGJpbmQgJHQgPDE+IHtzZWxjYW52bGluZSB7fSAleCAleX0KICAgIHNldCB4dCBbeGNvb3JkIFtsbGVuZ3RoICRkaXNwbGlzdF0gJGxldmVsICRsaW5lbm9dCiAgICBpZiB7W2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSA+IDJ9IHsKCXNldCB4dCBbZXhwciB7JHh0ICsgKFtsbGVuZ3RoICRjdXJyZW50cGFyZW50c10gLSAyKSAqICRsaW5lc3BjfV0KICAgIH0KICAgIHNldCByb3d0ZXh0eCgkbGluZW5vKSAkeHQKICAgIHNldCBpZHBvcygkaWQpIFtsaXN0ICR4ICR4dCAkeTFdCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXSB8fCBbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXQoJfHwgW2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgeHQgW2RyYXd0YWdzICRpZCAkeCAkeHQgJHkxXQogICAgfQogICAgc2V0IGhlYWRsaW5lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAwXQogICAgc2V0IG5hbWUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDFdCiAgICBzZXQgZGF0ZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMl0KICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlICRkYXRlXQogICAgc2V0IGxpbmVodGFnKCRsaW5lbm8pIFskY2FudiBjcmVhdGUgdGV4dCAkeHQgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkaGVhZGxpbmUgLWZvbnQgJG1haW5mb250IF0KICAgICRjYW52IGJpbmQgJGxpbmVodGFnKCRsaW5lbm8pIDxCdXR0b24tMz4gInJvd21lbnUgJVggJVkgJGlkIgogICAgc2V0IGxpbmVudGFnKCRsaW5lbm8pIFskY2FudjIgY3JlYXRlIHRleHQgMyAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRuYW1lIC1mb250ICRuYW1lZm9udF0KICAgIHNldCBsaW5lZHRhZygkbGluZW5vKSBbJGNhbnYzIGNyZWF0ZSB0ZXh0IDMgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkZGF0ZSAtZm9udCAkbWFpbmZvbnRdCgogICAgc2V0IG9sZGRsZXZlbCAkbGV2ZWwKICAgIHNldCBvbGRkaXNwbGlzdCAkZGlzcGxpc3QKICAgIHNldCBvbGRubGluZXMgW2xsZW5ndGggJGRpc3BsaXN0XQp9Cgpwcm9jIGRyYXd0YWdzIHtpZCB4IHh0IHkxfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGlkbGluZSByb3d0ZXh0eAoKICAgIHNldCBtYXJrcyB7fQogICAgc2V0IG50YWdzIDAKICAgIHNldCBuaGVhZHMgMAogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCBtYXJrcyAkaWR0YWdzKCRpZCkKCXNldCBudGFncyBbbGxlbmd0aCAkbWFya3NdCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRoZWFkcygkaWQpXQoJc2V0IG5oZWFkcyBbbGxlbmd0aCAkaWRoZWFkcygkaWQpXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZG90aGVycmVmcygkaWQpXQogICAgfQogICAgaWYgeyRtYXJrcyBlcSB7fX0gewoJcmV0dXJuICR4dAogICAgfQoKICAgIHNldCBkZWx0YSBbZXhwciB7aW50KDAuNSAqICgkbGluZXNwYyAtICRsdGhpY2tuZXNzKSl9XQogICAgc2V0IHl0IFtleHByICR5MSAtIDAuNSAqICRsaW5lc3BjXQogICAgc2V0IHliIFtleHByICR5dCArICRsaW5lc3BjIC0gMV0KICAgIHNldCB4dmFscyB7fQogICAgc2V0IHd2YWxzIHt9CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgewoJc2V0IHdpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGFnXQoJbGFwcGVuZCB4dmFscyAkeHQKCWxhcHBlbmQgd3ZhbHMgJHdpZAoJc2V0IHh0IFtleHByIHskeHQgKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3MgKyAkbGluZXNwY31dCiAgICB9CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJHggJHkxIFtsaW5kZXggJHh2YWxzIGVuZF0gJHkxIFwKCSAgICAgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgYmxhY2sgLXRhZ3MgdGFnLiRpZF0KICAgICRjYW52IGxvd2VyICR0CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgeCAkeHZhbHMgd2lkICR3dmFscyB7CglzZXQgeGwgW2V4cHIgJHggKyAkZGVsdGFdCglzZXQgeHIgW2V4cHIgJHggKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3NdCglpZiB7W2luY3IgbnRhZ3MgLTFdID49IDB9IHsKCSAgICAjIGRyYXcgYSB0YWcKCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggW2V4cHIgJHl0ICsgJGRlbHRhXSAkeGwgJHl0IFwKCQkgICAgICAgJHhyICR5dCAkeHIgJHliICR4bCAkeWIgJHggW2V4cHIgJHliIC0gJGRlbHRhXSBcCgkJICAgICAgIC13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkXQoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJICAgIHNldCByb3d0ZXh0eCgkaWRsaW5lKCRpZCkpIFtleHByIHskeHIgKyAkbGluZXNwY31dCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQgb3Igb3RoZXIgcmVmCgkgICAgaWYge1tpbmNyIG5oZWFkcyAtMV0gPj0gMH0gewoJCXNldCBjb2wgZ3JlZW4KCSAgICB9IGVsc2UgewoJCXNldCBjb2wgIiNkZGRkZmYiCgkgICAgfQoJICAgIHNldCB4bCBbZXhwciAkeGwgLSAkZGVsdGEvMl0KCSAgICAkY2FudiBjcmVhdGUgcG9seWdvbiAkeCAkeXQgJHhyICR5dCAkeHIgJHliICR4ICR5YiBcCgkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgJGNvbCAtdGFncyB0YWcuJGlkCgl9CglzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHhsICR5MSAtYW5jaG9yIHcgLXRleHQgJHRhZyBcCgkJICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRhZy4kaWRdCglpZiB7JG50YWdzID49IDB9IHsKCSAgICAkY2FudiBiaW5kICR0IDwxPiBbbGlzdCBzaG93dGFnICR0YWcgMV0KCX0KICAgIH0KICAgIHJldHVybiAkeHQKfQoKcHJvYyBub3RlY3Jvc3NpbmdzIHtpZCBsbyBoaSBjb3JuZXJ9IHsKICAgIGdsb2JhbCBvbGRkaXNwbGlzdCBjcm9zc2luZ3MgY29ybmVyY3Jvc3NpbmdzCgogICAgZm9yIHtzZXQgaSAkbG99IHtbaW5jciBpXSA8ICRoaX0ge30gewoJc2V0IHAgW2xpbmRleCAkb2xkZGlzcGxpc3QgJGldCglpZiB7JHAgPT0ge319IGNvbnRpbnVlCglpZiB7JGkgPT0gJGNvcm5lcn0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkaWQpXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY29ybmVyY3Jvc3NpbmdzKCRpZCkgJHBdIDwgMH0gewoJCWxhcHBlbmQgY29ybmVyY3Jvc3NpbmdzKCRpZCkgJHAKCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRwKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNvcm5lcmNyb3NzaW5ncygkcCkgJGlkXSA8IDB9IHsKCQlsYXBwZW5kIGNvcm5lcmNyb3NzaW5ncygkcCkgJGlkCgkgICAgfQoJfSBlbHNlIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJGlkKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNyb3NzaW5ncygkaWQpICRwXSA8IDB9IHsKCQlsYXBwZW5kIGNyb3NzaW5ncygkaWQpICRwCgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNyb3NzaW5ncygkcCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjcm9zc2luZ3MoJHApICRpZF0gPCAwfSB7CgkJbGFwcGVuZCBjcm9zc2luZ3MoJHApICRpZAoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyB4Y29vcmQge2kgbGV2ZWwgbG59IHsKICAgIGdsb2JhbCBjYW52eDAgeHNwYzEgeHNwYzIKCiAgICBzZXQgeCBbZXhwciB7JGNhbnZ4MCArICRpICogJHhzcGMxKCRsbil9XQogICAgaWYgeyRpID4gMCAmJiAkaSA9PSAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArIDAuNSAqICgkeHNwYzIgLSAkeHNwYzEoJGxuKSl9XQogICAgfSBlbHNlaWYgeyRpID4gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAkeHNwYzIgLSAkeHNwYzEoJGxuKX1dCiAgICB9CiAgICByZXR1cm4gJHgKfQoKIyBpdCBzZWVtcyBUayBjYW4ndCBkcmF3IGFycm93cyBvbiB0aGUgZW5kIG9mIGRpYWdvbmFsIGxpbmUgc2VnbWVudHMuLi4KcHJvYyB0cmltZGlhZ2VuZCB7bGluZX0gewogICAgd2hpbGUge1tsbGVuZ3RoICRsaW5lXSA+IDR9IHsKCXNldCB4MSBbbGluZGV4ICRsaW5lIGVuZC0zXQoJc2V0IHkxIFtsaW5kZXggJGxpbmUgZW5kLTJdCglzZXQgeDIgW2xpbmRleCAkbGluZSBlbmQtMV0KCXNldCB5MiBbbGluZGV4ICRsaW5lIGVuZF0KCWlmIHsoJHgxID09ICR4MikgIT0gKCR5MSA9PSAkeTIpfSBicmVhawoJc2V0IGxpbmUgW2xyZXBsYWNlICRsaW5lIGVuZC0xIGVuZF0KICAgIH0KICAgIHJldHVybiAkbGluZQp9Cgpwcm9jIHRyaW1kaWFnc3RhcnQge2xpbmV9IHsKICAgIHdoaWxlIHtbbGxlbmd0aCAkbGluZV0gPiA0fSB7CglzZXQgeDEgW2xpbmRleCAkbGluZSAwXQoJc2V0IHkxIFtsaW5kZXggJGxpbmUgMV0KCXNldCB4MiBbbGluZGV4ICRsaW5lIDJdCglzZXQgeTIgW2xpbmRleCAkbGluZSAzXQoJaWYgeygkeDEgPT0gJHgyKSAhPSAoJHkxID09ICR5Mil9IGJyZWFrCglzZXQgbGluZSBbbHJlcGxhY2UgJGxpbmUgMCAxXQogICAgfQogICAgcmV0dXJuICRsaW5lCn0KCnByb2MgZHJhd3NsYW50cyB7aWQgbmVlZG9uc2NyZWVuIG5vaHN9IHsKICAgIGdsb2JhbCBjYW52IG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzCiAgICBnbG9iYWwgY2FudngwIGNhbnZ5IHhzcGMxIHhzcGMyIGx0aGlja25lc3MKICAgIGdsb2JhbCBjdXJyZW50cGFyZW50cyBkdXBwYXJlbnRzCiAgICBnbG9iYWwgbHRoaWNrbmVzcyBsaW5lc3BjIGNhbnZ5IGNvbG9ybWFwIGxpbmVubyBnZW9tZXRyeQogICAgZ2xvYmFsIG1heGdyYXBocGN0IG1heHdpZHRoCiAgICBnbG9iYWwgZGlzcGxpc3Qgb25zY3JlZW4gbGFzdHVzZQogICAgZ2xvYmFsIHBhcmVudHMgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgb2xkbmxpbmVzIG9sZGRsZXZlbCBvbGRkaXNwbGlzdAogICAgZ2xvYmFsIG5oeXBlcnNwYWNlIG51bWNvbW1pdHMgbm5ld3BhcmVudHMKCiAgICBpZiB7JGxpbmVubyA8IDB9IHsKCWxhcHBlbmQgZGlzcGxpc3QgJGlkCglzZXQgb25zY3JlZW4oJGlkKSAxCglyZXR1cm4gMAogICAgfQoKICAgIHNldCB5MSBbZXhwciB7JGNhbnZ5IC0gJGxpbmVzcGN9XQogICAgc2V0IHkyICRjYW52eQoKICAgICMgd29yayBvdXQgd2hhdCB3ZSBuZWVkIHRvIGdldCBiYWNrIG9uIHNjcmVlbgogICAgc2V0IHJlaW5zIHt9CiAgICBpZiB7JG9uc2NyZWVuKCRpZCkgPCAwfSB7CgkjIG5leHQgdG8gZG8gaXNuJ3QgZGlzcGxheWVkLCBiZXR0ZXIgZ2V0IGl0IG9uIHNjcmVlbi4uLgoJbGFwcGVuZCByZWlucyBbbGlzdCAkaWQgMF0KICAgIH0KICAgICMgbWFrZSBzdXJlIGFsbCB0aGUgcHJldmlvdXMgY29tbWl0cydzIHBhcmVudHMgYXJlIG9uIHRoZSBzY3JlZW4KICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJaWYgeyRvbnNjcmVlbigkcCkgPCAwfSB7CgkgICAgbGFwcGVuZCByZWlucyBbbGlzdCAkcCAwXQoJfQogICAgfQogICAgIyBicmluZyBiYWNrIGFueXRoaW5nIHJlcXVlc3RlZCBieSBjYWxsZXIKICAgIGlmIHskbmVlZG9uc2NyZWVuIG5lIHt9fSB7CglsYXBwZW5kIHJlaW5zICRuZWVkb25zY3JlZW4KICAgIH0KCiAgICAjIHRyeSB0aGUgc2hvcnRjdXQKICAgIGlmIHskY3VycmVudHBhcmVudHMgPT0gJGlkICYmICRvbnNjcmVlbigkaWQpID09IDAgJiYgJHJlaW5zIGVxIHt9fSB7CglzZXQgZGxldmVsICRvbGRkbGV2ZWwKCXNldCB4IFt4Y29vcmQgJGRsZXZlbCAkZGxldmVsICRsaW5lbm9dCglzZXQgbWFpbmxpbmUoJGlkKSBbbGlzdCAkeCAkeTFdCglzZXQgbWFpbmxpbmVhcnJvdygkaWQpIG5vbmUKCXNldCBsYXN0dXNlKCRpZCkgJGxpbmVubwoJc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJGRsZXZlbCAkZGxldmVsICRpZF0KCXNldCBvbnNjcmVlbigkaWQpIDEKCXNldCB4c3BjMShbZXhwciB7JGxpbmVubyArIDF9XSkgJHhzcGMxKCRsaW5lbm8pCglyZXR1cm4gJGRsZXZlbAogICAgfQoKICAgICMgdXBkYXRlIGRpc3BsaXN0CiAgICBzZXQgZGlzcGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkb2xkZGxldmVsICRvbGRkbGV2ZWxdCiAgICBzZXQgaiAkb2xkZGxldmVsCiAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCXNldCBsYXN0dXNlKCRwKSAkbGluZW5vCglpZiB7JG9uc2NyZWVuKCRwKSA9PSAwfSB7CgkgICAgc2V0IGRpc3BsaXN0IFtsaW5zZXJ0ICRkaXNwbGlzdCAkaiAkcF0KCSAgICBzZXQgb25zY3JlZW4oJHApIDEKCSAgICBpbmNyIGoKCX0KICAgIH0KICAgIGlmIHskb25zY3JlZW4oJGlkKSA9PSAwfSB7CglsYXBwZW5kIGRpc3BsaXN0ICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMQogICAgfQoKICAgICMgcmVtb3ZlIHRoZSBudWxsIGVudHJ5IGlmIHByZXNlbnQKICAgIHNldCBudWxsZW50cnkgW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCB7fV0KICAgIGlmIHskbnVsbGVudHJ5ID49IDB9IHsKCXNldCBkaXNwbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRudWxsZW50cnkgJG51bGxlbnRyeV0KICAgIH0KCiAgICAjIGJyaW5nIGJhY2sgdGhlIG9uZXMgd2UgbmVlZCBub3cgKGlmIHdlIGRpZCBpdCBlYXJsaWVyCiAgICAjIGl0IHdvdWxkIGNoYW5nZSBkaXNwbGlzdCBhbmQgaW52YWxpZGF0ZSBvbGRkbGV2ZWwpCiAgICBmb3JlYWNoIHBpICRyZWlucyB7CgkjIHRlc3QgYWdhaW4gaW4gY2FzZSBvZiBkdXBsaWNhdGVzIGluIHJlaW5zCglzZXQgcCBbbGluZGV4ICRwaSAwXQoJaWYgeyRvbnNjcmVlbigkcCkgPCAwfSB7CgkgICAgc2V0IG9uc2NyZWVuKCRwKSAxCgkgICAgc2V0IGxhc3R1c2UoJHApICRsaW5lbm8KCSAgICBzZXQgZGlzcGxpc3QgW2xpbnNlcnQgJGRpc3BsaXN0IFtsaW5kZXggJHBpIDFdICRwXQoJICAgIGluY3Igbmh5cGVyc3BhY2UgLTEKCX0KICAgIH0KCiAgICBzZXQgbGFzdHVzZSgkaWQpICRsaW5lbm8KCiAgICAjIHNlZSBpZiB3ZSBuZWVkIHRvIG1ha2UgYW55IGxpbmVzIGp1bXAgb2ZmIGludG8gaHlwZXJzcGFjZQogICAgc2V0IGRpc3BsIFtsbGVuZ3RoICRkaXNwbGlzdF0KICAgIGlmIHskZGlzcGwgPiAkbWF4d2lkdGh9IHsKCXNldCBhZ2VzIHt9Cglmb3JlYWNoIHggJGRpc3BsaXN0IHsKCSAgICBsYXBwZW5kIGFnZXMgW2xpc3QgJGxhc3R1c2UoJHgpICR4XQoJfQoJc2V0IGFnZXMgW2xzb3J0IC1pbnRlZ2VyIC1pbmRleCAwICRhZ2VzXQoJc2V0IGsgMAoJd2hpbGUgeyRkaXNwbCA+ICRtYXh3aWR0aH0gewoJICAgIHNldCB1c2UgW2xpbmRleCAkYWdlcyAkayAwXQoJICAgIHNldCB2aWN0aW0gW2xpbmRleCAkYWdlcyAkayAxXQoJICAgIGlmIHskdXNlID49ICRsaW5lbm8gLSA1fSBicmVhawoJICAgIGluY3IgawoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJG5vaHMgJHZpY3RpbV0gPj0gMH0gY29udGludWUKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICR2aWN0aW1dCgkgICAgc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJGkgJGldCgkgICAgc2V0IG9uc2NyZWVuKCR2aWN0aW0pIC0xCgkgICAgaW5jciBuaHlwZXJzcGFjZQoJICAgIGluY3IgZGlzcGwgLTEKCSAgICBpZiB7JGkgPCAkbnVsbGVudHJ5fSB7CgkJaW5jciBudWxsZW50cnkgLTEKCSAgICB9CgkgICAgc2V0IHggW2xpbmRleCAkbWFpbmxpbmUoJHZpY3RpbSkgZW5kLTFdCgkgICAgbGFwcGVuZCBtYWlubGluZSgkdmljdGltKSAkeCAkeTEKCSAgICBzZXQgbGluZSBbdHJpbWRpYWdlbmQgJG1haW5saW5lKCR2aWN0aW0pXQoJICAgIHNldCBhcnJvdyAibGFzdCIKCSAgICBpZiB7JG1haW5saW5lYXJyb3coJHZpY3RpbSkgbmUgIm5vbmUifSB7CgkJc2V0IGxpbmUgW3RyaW1kaWFnc3RhcnQgJGxpbmVdCgkJc2V0IGFycm93ICJib3RoIgoJICAgIH0KCSAgICBsYXBwZW5kIHNpZGVsaW5lcygkdmljdGltKSBbbGlzdCAkbGluZSAxICRhcnJvd10KCSAgICB1bnNldCBtYWlubGluZSgkdmljdGltKQoJfQogICAgfQoKICAgIHNldCBkbGV2ZWwgW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCgogICAgIyBJZiB3ZSBhcmUgcmVkdWNpbmcsIHB1dCBpbiBhIG51bGwgZW50cnkKICAgIGlmIHskZGlzcGwgPCAkb2xkbmxpbmVzfSB7CgkjIGRvZXMgdGhlIG5leHQgbGluZSBsb29rIGxpa2UgYSBtZXJnZT8KCSMgaS5lLiBkb2VzIGl0IGhhdmUgPiAxIG5ldyBwYXJlbnQ/CglpZiB7JG5uZXdwYXJlbnRzKCRpZCkgPiAxfSB7CgkgICAgc2V0IGkgW2V4cHIgeyRkbGV2ZWwgKyAxfV0KCX0gZWxzZWlmIHskbm5ld3BhcmVudHMoW2xpbmRleCAkb2xkZGlzcGxpc3QgJG9sZGRsZXZlbF0pID09IDB9IHsKCSAgICBzZXQgaSAkb2xkZGxldmVsCgkgICAgaWYgeyRudWxsZW50cnkgPj0gMCAmJiAkbnVsbGVudHJ5IDwgJGl9IHsKCQlpbmNyIGkgLTEKCSAgICB9Cgl9IGVsc2VpZiB7JG51bGxlbnRyeSA+PSAwfSB7CgkgICAgc2V0IGkgJG51bGxlbnRyeQoJICAgIHdoaWxlIHskaSA8ICRkaXNwbAoJCSAgICYmIFtsaW5kZXggJG9sZGRpc3BsaXN0ICRpXSA9PSBbbGluZGV4ICRkaXNwbGlzdCAkaV19IHsKCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBpICRvbGRkbGV2ZWwKCSAgICBpZiB7JGRsZXZlbCA+PSAkaX0gewoJCWluY3IgaQoJICAgIH0KCX0KCWlmIHskaSA8ICRkaXNwbH0gewoJICAgIHNldCBkaXNwbGlzdCBbbGluc2VydCAkZGlzcGxpc3QgJGkge31dCgkgICAgaW5jciBkaXNwbAoJICAgIGlmIHskZGxldmVsID49ICRpfSB7CgkJaW5jciBkbGV2ZWwKCSAgICB9Cgl9CiAgICB9CgogICAgIyBkZWNpZGUgb24gdGhlIGxpbmUgc3BhY2luZyBmb3IgdGhlIG5leHQgbGluZQogICAgc2V0IGxqIFtleHByIHskbGluZW5vICsgMX1dCiAgICBzZXQgbWF4dyBbZXhwciB7JG1heGdyYXBocGN0ICogJGdlb21ldHJ5KGNhbnYxKSAvIDEwMH1dCiAgICBpZiB7JGRpc3BsIDw9IDEgfHwgJGNhbnZ4MCArICRkaXNwbCAqICR4c3BjMiA8PSAkbWF4d30gewoJc2V0IHhzcGMxKCRsaikgJHhzcGMyCiAgICB9IGVsc2UgewoJc2V0IHhzcGMxKCRsaikgW2V4cHIgeygkbWF4dyAtICRjYW52eDAgLSAkeHNwYzIpIC8gKCRkaXNwbCAtIDEpfV0KCWlmIHskeHNwYzEoJGxqKSA8ICRsdGhpY2tuZXNzfSB7CgkgICAgc2V0IHhzcGMxKCRsaikgJGx0aGlja25lc3MKCX0KICAgIH0KCiAgICBmb3JlYWNoIGlkaSAkcmVpbnMgewoJc2V0IGlkIFtsaW5kZXggJGlkaSAwXQoJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCglzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCXNldCBtYWlubGluZSgkaWQpIFtsaXN0ICR4aiAkeTJdCglzZXQgbWFpbmxpbmVhcnJvdygkaWQpIGZpcnN0CiAgICB9CgogICAgc2V0IGkgLTEKICAgIGZvcmVhY2ggaWQgJG9sZGRpc3BsaXN0IHsKCWluY3IgaQoJaWYgeyRpZCA9PSB7fX0gY29udGludWUKCWlmIHskb25zY3JlZW4oJGlkKSA8PSAwfSBjb250aW51ZQoJc2V0IHhpIFt4Y29vcmQgJGkgJG9sZGRsZXZlbCAkbGluZW5vXQoJaWYgeyRpID09ICRvbGRkbGV2ZWx9IHsKCSAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCQlzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICRwXQoJCXNldCBjb29yZHMgW2xpc3QgJHhpICR5MV0KCQlzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCQlpZiB7JHhqIDwgJHhpIC0gJGxpbmVzcGN9IHsKCQkgICAgbGFwcGVuZCBjb29yZHMgW2V4cHIgeyR4aiArICRsaW5lc3BjfV0gJHkxCgkJICAgIG5vdGVjcm9zc2luZ3MgJHAgJGogJGkgW2V4cHIgeyRqICsgMX1dCgkJfSBlbHNlaWYgeyR4aiA+ICR4aSArICRsaW5lc3BjfSB7CgkJICAgIGxhcHBlbmQgY29vcmRzIFtleHByIHskeGogLSAkbGluZXNwY31dICR5MQoJCSAgICBub3RlY3Jvc3NpbmdzICRwICRpICRqIFtleHByIHskaiAtIDF9XQoJCX0KCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRkdXBwYXJlbnRzICRwXSA+PSAwfSB7CgkJICAgICMgZHJhdyBhIGRvdWJsZS13aWR0aCBsaW5lIHRvIGluZGljYXRlIHRoZSBkb3VibGVkIHBhcmVudAoJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHkyCgkJICAgIGxhcHBlbmQgc2lkZWxpbmVzKCRwKSBbbGlzdCAkY29vcmRzIDIgbm9uZV0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbWFpbmxpbmUoJHApXX0gewoJCQlzZXQgbWFpbmxpbmUoJHApIFtsaXN0ICR4aiAkeTJdCgkJCXNldCBtYWlubGluZWFycm93KCRwKSBub25lCgkJICAgIH0KCQl9IGVsc2UgewoJCSAgICAjIG5vcm1hbCBjYXNlLCBubyBwYXJlbnQgZHVwbGljYXRlZAoJCSAgICBzZXQgeWIgJHkyCgkJICAgIHNldCBkeCBbZXhwciB7YWJzKCR4aSAtICR4ail9XQoJCSAgICBpZiB7MCAmJiAkZHggPCAkbGluZXNwY30gewoJCQlzZXQgeWIgW2V4cHIgeyR5MSArICRkeH1dCgkJICAgIH0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbWFpbmxpbmUoJHApXX0gewoJCQlpZiB7JHhpICE9ICR4an0gewoJCQkgICAgbGFwcGVuZCBjb29yZHMgJHhqICR5YgoJCQl9CgkJCXNldCBtYWlubGluZSgkcCkgJGNvb3JkcwoJCQlzZXQgbWFpbmxpbmVhcnJvdygkcCkgbm9uZQoJCSAgICB9IGVsc2UgewoJCQlsYXBwZW5kIGNvb3JkcyAkeGogJHliCgkJCWlmIHskeWIgPCAkeTJ9IHsKCQkJICAgIGxhcHBlbmQgY29vcmRzICR4aiAkeTIKCQkJfQoJCQlsYXBwZW5kIHNpZGVsaW5lcygkcCkgW2xpc3QgJGNvb3JkcyAxIG5vbmVdCgkJICAgIH0KCQl9CgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgaiAkaQoJICAgIGlmIHtbbGluZGV4ICRkaXNwbGlzdCAkaV0gIT0gJGlkfSB7CgkJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCgkgICAgfQoJICAgIGlmIHskaiAhPSAkaSB8fCAkeHNwYzEoJGxpbmVubykgIT0gJHhzcGMxKCRsaikKCQl8fCAoJG9sZGRsZXZlbCA8ICRpICYmICRpIDwgJGRsZXZlbCkKCQl8fCAoJGRsZXZlbCA8ICRpICYmICRpIDwgJG9sZGRsZXZlbCl9IHsKCQlzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCQlsYXBwZW5kIG1haW5saW5lKCRpZCkgJHhpICR5MSAkeGogJHkyCgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRkbGV2ZWwKfQoKIyBzZWFyY2ggZm9yIHggaW4gYSBsaXN0IG9mIGxpc3RzCnByb2MgbGxzZWFyY2gge2xsaXN0IHh9IHsKICAgIHNldCBpIDAKICAgIGZvcmVhY2ggbCAkbGxpc3QgewoJaWYgeyRsID09ICR4IHx8IFtsc2VhcmNoIC1leGFjdCAkbCAkeF0gPj0gMH0gewoJICAgIHJldHVybiAkaQoJfQoJaW5jciBpCiAgICB9CiAgICByZXR1cm4gLTEKfQoKcHJvYyBkcmF3bW9yZSB7cmVhZGluZ30gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBudW1jb21taXRzIG5jbXVwZGF0ZSBuZXh0dXBkYXRlCiAgICBnbG9iYWwgc3RvcHBlZCBuaHlwZXJzcGFjZSBwYXJlbnRzIGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIG1heHdpZHRoIG9uc2NyZWVuIGRpc3BsaXN0IGN1cnJlbnRwYXJlbnRzIG9sZGRsZXZlbAoKICAgIHNldCBuIFtsbGVuZ3RoICRkaXNwbGF5b3JkZXJdCiAgICB3aGlsZSB7JG51bWNvbW1pdHMgPCAkbn0gewoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkbnVtY29tbWl0c10KCXNldCBjdHhlbmQgW2V4cHIgeyRudW1jb21taXRzICsgMTB9XQoJaWYgeyEkcmVhZGluZyAmJiAkY3R4ZW5kID4gJG59IHsKCSAgICBzZXQgY3R4ZW5kICRuCgl9CglzZXQgZGxpc3Qge30KCWlmIHskbnVtY29tbWl0cyA+IDB9IHsKCSAgICBzZXQgZGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkb2xkZGxldmVsICRvbGRkbGV2ZWxdCgkgICAgc2V0IGkgJG9sZGRsZXZlbAoJICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJCWlmIHskb25zY3JlZW4oJHApID09IDB9IHsKCQkgICAgc2V0IGRsaXN0IFtsaW5zZXJ0ICRkbGlzdCAkaSAkcF0KCQkgICAgaW5jciBpCgkJfQoJICAgIH0KCX0KCXNldCBub2hzIHt9CglzZXQgcmVpbnMge30KCXNldCBpc2ZhdCBbZXhwciB7W2xsZW5ndGggJGRsaXN0XSA+ICRtYXh3aWR0aH1dCglpZiB7JG5oeXBlcnNwYWNlID4gMCB8fCAkaXNmYXR9IHsKCSAgICBpZiB7JGN0eGVuZCA+ICRufSBicmVhawoJICAgICMgd29yayBvdXQgd2hhdCB0byBicmluZyBiYWNrIGFuZAoJICAgICMgd2hhdCB3ZSB3YW50IHRvIGRvbid0IHdhbnQgdG8gc2VuZCBpbnRvIGh5cGVyc3BhY2UKCSAgICBzZXQgcm9vbSAxCgkgICAgZm9yIHtzZXQgayAkbnVtY29tbWl0c30geyRrIDwgJGN0eGVuZH0ge2luY3Iga30gewoJCXNldCB4IFtsaW5kZXggJGRpc3BsYXlvcmRlciAka10KCQlzZXQgaSBbbGxzZWFyY2ggJGRsaXN0ICR4XQoJCWlmIHskaSA8IDB9IHsKCQkgICAgc2V0IGkgW2xsZW5ndGggJGRsaXN0XQoJCSAgICBsYXBwZW5kIGRsaXN0ICR4CgkJfQoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJG5vaHMgJHhdIDwgMH0gewoJCSAgICBsYXBwZW5kIG5vaHMgJHgKCQl9CgkJaWYgeyRyZWlucyBlcSB7fSAmJiAkb25zY3JlZW4oJHgpIDwgMCAmJiAkcm9vbX0gewoJCSAgICBzZXQgcmVpbnMgW2xpc3QgJHggJGldCgkJfQoJCXNldCBuZXdwIHt9CgkJaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJHgpXX0gewoJCSAgICBzZXQgcmlnaHQgMAoJCSAgICBmb3JlYWNoIHAgJHBhcmVudHMoJHgpIHsKCQkJaWYge1tsbHNlYXJjaCAkZGxpc3QgJHBdIDwgMH0gewoJCQkgICAgbGFwcGVuZCBuZXdwICRwCgkJCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRub2hzICRwXSA8IDB9IHsKCQkJCWxhcHBlbmQgbm9ocyAkcAoJCQkgICAgfQoJCQkgICAgaWYgeyRyZWlucyBlcSB7fSAmJiAkb25zY3JlZW4oJHApIDwgMCAmJiAkcm9vbX0gewoJCQkJc2V0IHJlaW5zIFtsaXN0ICRwIFtleHByIHskaSArICRyaWdodH1dXQoJCQkgICAgfQoJCQl9CgkJCXNldCByaWdodCAxCgkJICAgIH0KCQl9CgkJc2V0IGwgW2xpbmRleCAkZGxpc3QgJGldCgkJaWYge1tsbGVuZ3RoICRsXSA9PSAxfSB7CgkJICAgIHNldCBsICRuZXdwCgkJfSBlbHNlIHsKCQkgICAgc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRsICR4XQoJCSAgICBzZXQgbCBbY29uY2F0IFtscmVwbGFjZSAkbCAkaiAkal0gJG5ld3BdCgkJfQoJCXNldCBkbGlzdCBbbHJlcGxhY2UgJGRsaXN0ICRpICRpICRsXQoJCWlmIHskcm9vbSAmJiAkaXNmYXQgJiYgW2xsZW5ndGggJG5ld3BdIDw9IDF9IHsKCQkgICAgc2V0IHJvb20gMAoJCX0KCSAgICB9Cgl9CgoJc2V0IGRsZXZlbCBbZHJhd3NsYW50cyAkaWQgJHJlaW5zICRub2hzXQoJZHJhd2NvbW1pdGxpbmUgJGRsZXZlbAoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGUKCSAgICAmJiAkbnVtY29tbWl0cyA+PSAkbmNtdXBkYXRlfSB7CgkgICAgZG91cGRhdGUgJHJlYWRpbmcKCSAgICBpZiB7JHN0b3BwZWR9IGJyZWFrCgl9CiAgICB9Cn0KCiMgbGV2ZWwgaGVyZSBpcyBhbiBpbmRleCBpbiB0b2RvCnByb2MgdXBkYXRldG9kbyB7bGV2ZWwgbm9zaG9ydGN1dH0gewogICAgZ2xvYmFsIG5jbGVmdCB0b2RvIG5uZXdwYXJlbnRzCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBhcmVudHMgb25zY3JlZW4KCiAgICBzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCiAgICBzZXQgb2xkcyB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV19IHsKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRvbGRzICRwXSA8IDB9IHsKCQlsYXBwZW5kIG9sZHMgJHAKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7ISRub3Nob3J0Y3V0ICYmIFtsbGVuZ3RoICRvbGRzXSA9PSAxfSB7CglzZXQgcCBbbGluZGV4ICRvbGRzIDBdCglpZiB7JG5jbGVmdCgkcCkgPT0gMSAmJiBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJHBdIDwgMH0gewoJICAgIHNldCBuY2xlZnQoJHApIDAKCSAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbCAkcF0KCSAgICBzZXQgb25zY3JlZW4oJHApIDAKCSAgICBzZXQgbm5ld3BhcmVudHMoJGlkKSAxCgkgICAgcmV0dXJuIDAKCX0KICAgIH0KCiAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbF0KICAgIHNldCBpICRsZXZlbAogICAgc2V0IG4gMAogICAgZm9yZWFjaCBwICRvbGRzIHsKCWluY3IgbmNsZWZ0KCRwKSAtMQoJc2V0IGsgW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRwXQoJaWYgeyRrIDwgMH0gewoJICAgIHNldCB0b2RvIFtsaW5zZXJ0ICR0b2RvICRpICRwXQoJICAgIHNldCBvbnNjcmVlbigkcCkgMAoJICAgIGluY3IgaQoJICAgIGluY3IgbgoJfQogICAgfQogICAgc2V0IG5uZXdwYXJlbnRzKCRpZCkgJG4KCiAgICByZXR1cm4gMQp9Cgpwcm9jIGRlY2lkZW5leHQge3tub3JlYWQgMH19IHsKICAgIGdsb2JhbCBuY2xlZnQgdG9kbwogICAgZ2xvYmFsIGRhdGVtb2RlIGNkYXRlCiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgICMgY2hvb3NlIHdoaWNoIG9uZSB0byBkbyBuZXh0IHRpbWUgYXJvdW5kCiAgICBzZXQgdG9kb2wgW2xsZW5ndGggJHRvZG9dCiAgICBzZXQgbGV2ZWwgLTEKICAgIHNldCBsYXRlc3Qge30KICAgIGZvciB7c2V0IGsgJHRvZG9sfSB7W2luY3IgayAtMV0gPj0gMH0ge30gewoJc2V0IHAgW2xpbmRleCAkdG9kbyAka10KCWlmIHskbmNsZWZ0KCRwKSA9PSAwfSB7CgkgICAgaWYgeyRkYXRlbW9kZX0gewoJCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJCSAgICBpZiB7JG5vcmVhZH0gewoJCQlyZXR1cm4ge30KCQkgICAgfQoJCSAgICByZWFkY29tbWl0ICRwCgkJfQoJCWlmIHskbGF0ZXN0ID09IHt9IHx8ICRjZGF0ZSgkcCkgPiAkbGF0ZXN0fSB7CgkJICAgIHNldCBsZXZlbCAkawoJCSAgICBzZXQgbGF0ZXN0ICRjZGF0ZSgkcCkKCQl9CgkgICAgfSBlbHNlIHsKCQlzZXQgbGV2ZWwgJGsKCQlicmVhawoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbGV2ZWwgPCAwfSB7CglpZiB7JHRvZG8gIT0ge319IHsKCSAgICBwdXRzICJFUlJPUjogbm9uZSBvZiB0aGUgcGVuZGluZyBjb21taXRzIGNhbiBiZSBkb25lIHlldDoiCgkgICAgZm9yZWFjaCBwICR0b2RvIHsKCQlwdXRzICIgICRwICgkbmNsZWZ0KCRwKSkiCgkgICAgfQoJfQoJcmV0dXJuIC0xCiAgICB9CgogICAgcmV0dXJuICRsZXZlbAp9Cgpwcm9jIGRyYXdjb21taXQge2lkfSB7CiAgICBnbG9iYWwgcGhhc2UgdG9kbyBuY2hpbGRyZW4gZGF0ZW1vZGUgbmV4dHVwZGF0ZSByZXZsaXN0b3JkZXIKICAgIGdsb2JhbCBudW1jb21taXRzIG5jbXVwZGF0ZSBkaXNwbGF5b3JkZXIgdG9kbyBvbnNjcmVlbiBwYXJlbnRzCgogICAgaWYgeyRwaGFzZSAhPSAiaW5jcmRyYXcifSB7CglzZXQgcGhhc2UgaW5jcmRyYXcKCXNldCBkaXNwbGF5b3JkZXIge30KCXNldCB0b2RvIHt9Cglpbml0Z3JhcGgKICAgIH0KICAgIGlmIHskbmNoaWxkcmVuKCRpZCkgPT0gMH0gewoJbGFwcGVuZCB0b2RvICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMAogICAgfQogICAgaWYgeyRyZXZsaXN0b3JkZXJ9IHsKCXNldCBsZXZlbCBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJGlkXQoJaWYgeyRsZXZlbCA8IDB9IHsKCSAgICBlcnJvcl9wb3B1cCAib29wcywgJGlkIGlzbid0IGluIHRvZG8iCgkgICAgcmV0dXJuCgl9CglsYXBwZW5kIGRpc3BsYXlvcmRlciAkaWQKCXVwZGF0ZXRvZG8gJGxldmVsIDAKICAgIH0gZWxzZSB7CglzZXQgbGV2ZWwgW2RlY2lkZW5leHQgMV0KCWlmIHskbGV2ZWwgPT0ge30gfHwgJGlkICE9IFtsaW5kZXggJHRvZG8gJGxldmVsXX0gewoJICAgIHJldHVybgoJfQoJd2hpbGUgMSB7CgkgICAgbGFwcGVuZCBkaXNwbGF5b3JkZXIgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCgkgICAgaWYge1t1cGRhdGV0b2RvICRsZXZlbCAkZGF0ZW1vZGVdfSB7CgkJc2V0IGxldmVsIFtkZWNpZGVuZXh0IDFdCgkJaWYgeyRsZXZlbCA9PSB7fX0gYnJlYWsKCSAgICB9CgkgICAgc2V0IGlkIFtsaW5kZXggJHRvZG8gJGxldmVsXQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXX0gewoJCWJyZWFrCgkgICAgfQoJfQogICAgfQogICAgZHJhd21vcmUgMQp9Cgpwcm9jIGZpbmlzaGNvbW1pdHMge30gewogICAgZ2xvYmFsIHBoYXNlCiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBjdGV4dCBtYWluY3Vyc29yIHRleHRjdXJzb3IKCiAgICBpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCSRjYW52IGRlbGV0ZSBhbGwKCSRjYW52IGNyZWF0ZSB0ZXh0IDMgMyAtYW5jaG9yIG53IC10ZXh0ICJObyBjb21taXRzIHNlbGVjdGVkIiBcCgkgICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwoJc2V0IHBoYXNlIHt9CiAgICB9IGVsc2UgewoJZHJhd3Jlc3QKICAgIH0KICAgIC4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKICAgIHNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKfQoKIyBEb24ndCBjaGFuZ2UgdGhlIHRleHQgcGFuZSBjdXJzb3IgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBoYW5kIGN1cnNvciwKIyBzaG93aW5nIHRoYXQgd2UgYXJlIG92ZXIgYSBzaGExIElEIGxpbmsuCnByb2Mgc2V0dGV4dGN1cnNvciB7Y30gewogICAgZ2xvYmFsIGN0ZXh0IGN1cnRleHRjdXJzb3IKCiAgICBpZiB7WyRjdGV4dCBjZ2V0IC1jdXJzb3JdID09ICRjdXJ0ZXh0Y3Vyc29yfSB7CgkkY3RleHQgY29uZmlnIC1jdXJzb3IgJGMKICAgIH0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICRjCn0KCnByb2MgZHJhd2dyYXBoIHt9IHsKICAgIGdsb2JhbCBuZXh0dXBkYXRlIHN0YXJ0bXNlY3MgbmNtdXBkYXRlCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIG9uc2NyZWVuCgogICAgaWYgeyRkaXNwbGF5b3JkZXIgPT0ge319IHJldHVybgogICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIgJHN0YXJ0bXNlY3MgKyAxMDBdCiAgICBzZXQgbmNtdXBkYXRlIDEKICAgIGluaXRncmFwaAogICAgZm9yZWFjaCBpZCAkZGlzcGxheW9yZGVyIHsKCXNldCBvbnNjcmVlbigkaWQpIDAKICAgIH0KICAgIGRyYXdtb3JlIDAKfQoKcHJvYyBkcmF3cmVzdCB7fSB7CiAgICBnbG9iYWwgcGhhc2Ugc3RvcHBlZCByZWRpc3BsYXlpbmcgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgZGF0ZW1vZGUgdG9kbyBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCBudW1jb21taXRzIG5jbXVwZGF0ZQogICAgZ2xvYmFsIG5leHR1cGRhdGUgc3RhcnRtc2VjcyByZXZsaXN0b3JkZXIKCiAgICBzZXQgbGV2ZWwgW2RlY2lkZW5leHRdCiAgICBpZiB7JGxldmVsID49IDB9IHsKCXNldCBwaGFzZSBkcmF3Z3JhcGgKCXdoaWxlIDEgewoJICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyIFtsaW5kZXggJHRvZG8gJGxldmVsXQoJICAgIHNldCBoYXJkIFt1cGRhdGV0b2RvICRsZXZlbCAkZGF0ZW1vZGVdCgkgICAgaWYgeyRoYXJkfSB7CgkJc2V0IGxldmVsIFtkZWNpZGVuZXh0XQoJCWlmIHskbGV2ZWwgPCAwfSBicmVhawoJICAgIH0KCX0KICAgIH0KICAgIGRyYXdtb3JlIDAKICAgIHNldCBwaGFzZSB7fQogICAgc2V0IGRyYXdtc2VjcyBbZXhwciBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXNlY3NdCiAgICAjcHV0cyAib3ZlcmFsbCAkZHJhd21zZWNzIG1zIGZvciAkbnVtY29tbWl0cyBjb21taXRzIgogICAgaWYgeyRyZWRpc3BsYXlpbmd9IHsKCWlmIHskc3RvcHBlZCA9PSAwICYmIFtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CgkgICAgc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKCX0KCWlmIHskc3RvcHBlZCA9PSAxfSB7CgkgICAgc2V0IHN0b3BwZWQgMAoJICAgIGFmdGVyIGlkbGUgZHJhd2dyYXBoCgl9IGVsc2UgewoJICAgIHNldCByZWRpc3BsYXlpbmcgMAoJfQogICAgfQp9Cgpwcm9jIGZpbmRtYXRjaGVzIHtmfSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZm91bmRzdHJpbmcgZm91bmRzdHJsZW4KICAgIGlmIHskZmluZHR5cGUgPT0gIlJlZ2V4cCJ9IHsKCXNldCBtYXRjaGVzIFtyZWdleHAgLWluZGljZXMgLWFsbCAtaW5saW5lICRmb3VuZHN0cmluZyAkZl0KICAgIH0gZWxzZSB7CglpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJICAgIHNldCBzdHIgW3N0cmluZyB0b2xvd2VyICRmXQoJfSBlbHNlIHsKCSAgICBzZXQgc3RyICRmCgl9CglzZXQgbWF0Y2hlcyB7fQoJc2V0IGkgMAoJd2hpbGUge1tzZXQgaiBbc3RyaW5nIGZpcnN0ICRmb3VuZHN0cmluZyAkc3RyICRpXV0gPj0gMH0gewoJICAgIGxhcHBlbmQgbWF0Y2hlcyBbbGlzdCAkaiBbZXhwciAkaiskZm91bmRzdHJsZW4tMV1dCgkgICAgc2V0IGkgW2V4cHIgJGogKyAkZm91bmRzdHJsZW5dCgl9CiAgICB9CiAgICByZXR1cm4gJG1hdGNoZXMKfQoKcHJvYyBkb2ZpbmQge30gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZpbmRsb2MgZmluZHN0cmluZyBtYXJrZWRtYXRjaGVzIGNvbW1pdGluZm8KICAgIGdsb2JhbCBudW1jb21taXRzIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIG1haW5mb250IG5hbWVmb250IGNhbnYgY2FudjIgY2FudjMgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgoKICAgIHN0b3BmaW5kcHJvYwogICAgdW5tYXJrbWF0Y2hlcwogICAgZm9jdXMgLgogICAgc2V0IG1hdGNoaW5nbGluZXMge30KICAgIGlmIHskZmluZGxvYyA9PSAiUGlja2F4ZSJ9IHsKCWZpbmRwYXRjaGVzCglyZXR1cm4KICAgIH0KICAgIGlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CglzZXQgZm91bmRzdHJpbmcgW3N0cmluZyB0b2xvd2VyICRmaW5kc3RyaW5nXQogICAgfSBlbHNlIHsKCXNldCBmb3VuZHN0cmluZyAkZmluZHN0cmluZwogICAgfQogICAgc2V0IGZvdW5kc3RybGVuIFtzdHJpbmcgbGVuZ3RoICRmaW5kc3RyaW5nXQogICAgaWYgeyRmb3VuZHN0cmxlbiA9PSAwfSByZXR1cm4KICAgIGlmIHskZmluZGxvYyA9PSAiRmlsZXMifSB7CglmaW5kZmlsZXMKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IG9sZHNlbCAtMQogICAgfSBlbHNlIHsKCXNldCBvbGRzZWwgJHNlbGVjdGVkbGluZQogICAgfQogICAgc2V0IGRpZHNlbCAwCiAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50fQogICAgZm9yIHtzZXQgbCAwfSB7JGwgPCAkbnVtY29tbWl0c30ge2luY3IgbH0gewoJc2V0IGlkICRsaW5laWQoJGwpCglzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCglzZXQgZG9lc21hdGNoIDAKCWZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgewoJICAgIGlmIHskZmluZGxvYyAhPSAiQWxsIGZpZWxkcyIgJiYgJGZpbmRsb2MgIT0gJHR5fSB7CgkJY29udGludWUKCSAgICB9CgkgICAgc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQoJICAgIGlmIHskbWF0Y2hlcyA9PSB7fX0gY29udGludWUKCSAgICBzZXQgZG9lc21hdGNoIDEKCSAgICBpZiB7JHR5ID09ICJIZWFkbGluZSJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudiAkbCAkZiAkbGluZWh0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkF1dGhvciJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudjIgJGwgJGYgJGxpbmVudGFnKCRsKSAkbWF0Y2hlcyAkbmFtZWZvbnQKCSAgICB9IGVsc2VpZiB7JHR5ID09ICJEYXRlIn0gewoJCW1hcmttYXRjaGVzICRjYW52MyAkbCAkZiAkbGluZWR0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0KCX0KCWlmIHskZG9lc21hdGNofSB7CgkgICAgbGFwcGVuZCBtYXRjaGluZ2xpbmVzICRsCgkgICAgaWYgeyEkZGlkc2VsICYmICRsID4gJG9sZHNlbH0gewoJCWZpbmRzZWxlY3RsaW5lICRsCgkJc2V0IGRpZHNlbCAxCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRtYXRjaGluZ2xpbmVzID09IHt9fSB7CgliZWxsCiAgICB9IGVsc2VpZiB7ISRkaWRzZWx9IHsKCWZpbmRzZWxlY3RsaW5lIFtsaW5kZXggJG1hdGNoaW5nbGluZXMgMF0KICAgIH0KfQoKcHJvYyBmaW5kc2VsZWN0bGluZSB7bH0gewogICAgZ2xvYmFsIGZpbmRsb2MgY29tbWVudGVuZCBjdGV4dAogICAgc2VsZWN0bGluZSAkbCAxCiAgICBpZiB7JGZpbmRsb2MgPT0gIkFsbCBmaWVsZHMiIHx8ICRmaW5kbG9jID09ICJDb21tZW50cyJ9IHsKCSMgaGlnaGxpZ2h0IHRoZSBtYXRjaGVzIGluIHRoZSBjb21tZW50cwoJc2V0IGYgWyRjdGV4dCBnZXQgMS4wICRjb21tZW50ZW5kXQoJc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQoJZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CgkgICAgc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCgkgICAgc2V0IGVuZCBbZXhwciBbbGluZGV4ICRtYXRjaCAxXSArIDFdCgkgICAgJGN0ZXh0IHRhZyBhZGQgZm91bmQgIjEuMCArICRzdGFydCBjIiAiMS4wICsgJGVuZCBjIgoJfQogICAgfQp9Cgpwcm9jIGZpbmRuZXh0IHtyZXN0YXJ0fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7CglpZiB7JHJlc3RhcnR9IHsKCSAgICBkb2ZpbmQKCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID4gJHNlbGVjdGVkbGluZX0gewoJICAgIGZpbmRzZWxlY3RsaW5lICRsCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBiZWxsCn0KCnByb2MgZmluZHByZXYge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJZG9maW5kCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IHByZXYge30KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPj0gJHNlbGVjdGVkbGluZX0gYnJlYWsKCXNldCBwcmV2ICRsCiAgICB9CiAgICBpZiB7JHByZXYgIT0ge319IHsKCWZpbmRzZWxlY3RsaW5lICRwcmV2CiAgICB9IGVsc2UgewoJYmVsbAogICAgfQp9Cgpwcm9jIGZpbmRsb2NjaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGZpbmR0eXBlIGZpbmR0eXBlbWVudQogICAgaWYgeyRmaW5kbG9jID09ICJQaWNrYXhlIn0gewoJc2V0IGZpbmR0eXBlIEV4YWN0CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkZmluZHR5cGVtZW51IGVudHJ5Y29uZiAxIC1zdGF0ZSAkc3RhdGUKICAgICRmaW5kdHlwZW1lbnUgZW50cnljb25mIDIgLXN0YXRlICRzdGF0ZQp9Cgpwcm9jIHN0b3BmaW5kcHJvYyB7e2RvbmUgMH19IHsKICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUgZmluZGlkcwogICAgZ2xvYmFsIGN0ZXh0IGZpbmRvbGRjdXJzb3IgcGhhc2UgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MKCiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZHByb2NwaWRdfSB7CglpZiB7ISRkb25lfSB7CgkgICAgY2F0Y2gge2V4ZWMga2lsbCAkZmluZHByb2NwaWR9Cgl9CgljYXRjaCB7Y2xvc2UgJGZpbmRwcm9jZmlsZX0KCXVuc2V0IGZpbmRwcm9jcGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRpbnByb2dyZXNzXX0gewoJdW5zZXQgZmluZGlucHJvZ3Jlc3MKCWlmIHskcGhhc2UgIT0gImluY3JkcmF3In0gewoJICAgIC4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKCSAgICBzZXR0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCgl9CiAgICB9Cn0KCnByb2MgZmluZHBhdGNoZXMge30gewogICAgZ2xvYmFsIGZpbmRzdHJpbmcgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMKICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUKICAgIGdsb2JhbCBmaW5kZGlkc2VsIGN0ZXh0IGxpbmVpZCBmaW5kaW5wcm9ncmVzcwogICAgZ2xvYmFsIGZpbmRpbnNlcnRwb3MKCiAgICBpZiB7JG51bWNvbW1pdHMgPT0gMH0gcmV0dXJuCgogICAgIyBtYWtlIGEgbGlzdCBvZiBhbGwgdGhlIGlkcyB0byBzZWFyY2gsIHN0YXJ0aW5nIGF0IHRoZSBvbmUKICAgICMgYWZ0ZXIgdGhlIHNlbGVjdGVkIGxpbmUgKGlmIGFueSkKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IGwgJHNlbGVjdGVkbGluZQogICAgfSBlbHNlIHsKCXNldCBsIC0xCiAgICB9CiAgICBzZXQgaW5wdXRpZHMge30KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgJG51bWNvbW1pdHN9IHtpbmNyIGl9IHsKCWlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBsIDAKCX0KCWFwcGVuZCBpbnB1dGlkcyAkbGluZWlkKCRsKSAiXG4iCiAgICB9CgogICAgaWYge1tjYXRjaCB7CglzZXQgZiBbb3BlbiBbbGlzdCB8IGdpdC1kaWZmLXRyZWUgLS1zdGRpbiAtcyAtciAtUyRmaW5kc3RyaW5nIFwKCQkJIDw8ICRpbnB1dGlkc10gcl0KICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIHN0YXJ0aW5nIHNlYXJjaCBwcm9jZXNzOiAkZXJyIgoJcmV0dXJuCiAgICB9CgogICAgc2V0IGZpbmRpbnNlcnRwb3MgZW5kCiAgICBzZXQgZmluZHByb2NmaWxlICRmCiAgICBzZXQgZmluZHByb2NwaWQgW3BpZCAkZl0KICAgIGZjb25maWd1cmUgJGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZiByZWFkYWJsZSByZWFkZmluZHByb2MKICAgIHNldCBmaW5kZGlkc2VsIDAKICAgIC4gY29uZmlnIC1jdXJzb3Igd2F0Y2gKICAgIHNldHRleHRjdXJzb3Igd2F0Y2gKICAgIHNldCBmaW5kaW5wcm9ncmVzcyAxCn0KCnByb2MgcmVhZGZpbmRwcm9jIHt9IHsKICAgIGdsb2JhbCBmaW5kcHJvY2ZpbGUgZmluZGRpZHNlbAogICAgZ2xvYmFsIGlkbGluZSBtYXRjaGluZ2xpbmVzIGZpbmRpbnNlcnRwb3MKCiAgICBzZXQgbiBbZ2V0cyAkZmluZHByb2NmaWxlIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkZmluZHByb2NmaWxlXX0gewoJICAgIHN0b3BmaW5kcHJvYyAxCgkgICAgaWYgeyEkZmluZGRpZHNlbH0gewoJCWJlbGwKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHshW3JlZ2V4cCB7XlswLTlhLWZdezQwfX0gJGxpbmUgaWRdfSB7CgllcnJvcl9wb3B1cCAiQ2FuJ3QgcGFyc2UgZ2l0LWRpZmYtdHJlZSBvdXRwdXQ6ICRsaW5lIgoJc3RvcGZpbmRwcm9jCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gewoJcHV0cyBzdGRlcnIgInNwdXJpb3VzIGlkOiAkaWQiCglyZXR1cm4KICAgIH0KICAgIHNldCBsICRpZGxpbmUoJGlkKQogICAgaW5zZXJ0bWF0Y2ggJGwgJGlkCn0KCnByb2MgaW5zZXJ0bWF0Y2gge2wgaWR9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpbnNlcnRwb3MgZmluZGRpZHNlbAoKICAgIGlmIHskZmluZGluc2VydHBvcyA9PSAiZW5kIn0gewoJaWYgeyRtYXRjaGluZ2xpbmVzICE9IHt9ICYmICRsIDwgW2xpbmRleCAkbWF0Y2hpbmdsaW5lcyAwXX0gewoJICAgIHNldCBtYXRjaGluZ2xpbmVzIFtsaW5zZXJ0ICRtYXRjaGluZ2xpbmVzIDAgJGxdCgkgICAgc2V0IGZpbmRpbnNlcnRwb3MgMQoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIG1hdGNoaW5nbGluZXMgJGwKCX0KICAgIH0gZWxzZSB7CglzZXQgbWF0Y2hpbmdsaW5lcyBbbGluc2VydCAkbWF0Y2hpbmdsaW5lcyAkZmluZGluc2VydHBvcyAkbF0KCWluY3IgZmluZGluc2VydHBvcwogICAgfQogICAgbWFya2hlYWRsaW5lICRsICRpZAogICAgaWYgeyEkZmluZGRpZHNlbH0gewoJZmluZHNlbGVjdGxpbmUgJGwKCXNldCBmaW5kZGlkc2VsIDEKICAgIH0KfQoKcHJvYyBmaW5kZmlsZXMge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBudW1jb21taXRzIGxpbmVpZCBjdGV4dAogICAgZ2xvYmFsIGZmaWxlbGluZSBmaW5kZGlkc2VsIHBhcmVudHMgbnBhcmVudHMKICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcyBmaW5kc3RhcnRsaW5lIGZpbmRpbnNlcnRwb3MKICAgIGdsb2JhbCB0cmVlZGlmZnMgZmRpZmZpZHMgZmRpZmZzbmVlZGVkIGZkaWZmcG9zCiAgICBnbG9iYWwgZmluZG1lcmdlZmlsZXMKCiAgICBpZiB7JG51bWNvbW1pdHMgPT0gMH0gcmV0dXJuCgogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgbCBbZXhwciB7JHNlbGVjdGVkbGluZSArIDF9XQogICAgfSBlbHNlIHsKCXNldCBsIDAKICAgIH0KICAgIHNldCBmZmlsZWxpbmUgJGwKICAgIHNldCBmaW5kc3RhcnRsaW5lICRsCiAgICBzZXQgZGlmZnNuZWVkZWQge30KICAgIHNldCBmZGlmZnNuZWVkZWQge30KICAgIHdoaWxlIDEgewoJc2V0IGlkICRsaW5laWQoJGwpCglpZiB7JGZpbmRtZXJnZWZpbGVzIHx8ICRucGFyZW50cygkaWQpID09IDF9IHsKCSAgICBmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkJaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKFtsaXN0ICRpZCAkcF0pXX0gewoJCSAgICBhcHBlbmQgZGlmZnNuZWVkZWQgIiRpZCAkcFxuIgoJCSAgICBsYXBwZW5kIGZkaWZmc25lZWRlZCBbbGlzdCAkaWQgJHBdCgkJfQoJICAgIH0KCX0KCWlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBsIDAKCX0KCWlmIHskbCA9PSAkZmluZHN0YXJ0bGluZX0gYnJlYWsKICAgIH0KCiAgICAjIHN0YXJ0IG9mZiBhIGdpdC1kaWZmLXRyZWUgcHJvY2VzcyBpZiBuZWVkZWQKICAgIGlmIHskZGlmZnNuZWVkZWQgbmUge319IHsKCWlmIHtbY2F0Y2ggewoJICAgIHNldCBkZiBbb3BlbiBbbGlzdCB8IGdpdC1kaWZmLXRyZWUgLXIgLS1zdGRpbiA8PCAkZGlmZnNuZWVkZWRdIHJdCgl9IGVyciBdfSB7CgkgICAgZXJyb3JfcG9wdXAgIkVycm9yIHN0YXJ0aW5nIHNlYXJjaCBwcm9jZXNzOiAkZXJyIgoJICAgIHJldHVybgoJfQoJY2F0Y2gge3Vuc2V0IGZkaWZmaWRzfQoJc2V0IGZkaWZmcG9zIDAKCWZjb25maWd1cmUgJGRmIC1ibG9ja2luZyAwCglmaWxlZXZlbnQgJGRmIHJlYWRhYmxlIFtsaXN0IHJlYWRmaWxlZGlmZnMgJGRmXQogICAgfQoKICAgIHNldCBmaW5kZGlkc2VsIDAKICAgIHNldCBmaW5kaW5zZXJ0cG9zIGVuZAogICAgc2V0IGlkICRsaW5laWQoJGwpCiAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRpZCkgMF0KICAgIC4gY29uZmlnIC1jdXJzb3Igd2F0Y2gKICAgIHNldHRleHRjdXJzb3Igd2F0Y2gKICAgIHNldCBmaW5kaW5wcm9ncmVzcyAxCiAgICBmaW5kY29udCBbbGlzdCAkaWQgJHBdCiAgICB1cGRhdGUKfQoKcHJvYyByZWFkZmlsZWRpZmZzIHtkZn0gewogICAgZ2xvYmFsIGZpbmRpZHMgZmRpZmZpZHMgZmRpZmZzCgogICAgc2V0IG4gW2dldHMgJGRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkZGZdfSB7CgkgICAgZG9uZWZpbGVkaWZmCgkgICAgaWYge1tjYXRjaCB7Y2xvc2UgJGRmfSBlcnJdfSB7CgkJc3RvcGZpbmRwcm9jCgkJYmVsbAoJCWVycm9yX3BvcHVwICJFcnJvciBpbiBnaXQtZGlmZi10cmVlOiAkZXJyIgoJICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgZmluZGlkc119IHsKCQlzZXQgaWRzICRmaW5kaWRzCgkJc3RvcGZpbmRwcm9jCgkJYmVsbAoJCWVycm9yX3BvcHVwICJDb3VsZG4ndCBmaW5kIGRpZmZzIGZvciB7JGlkc30iCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7W3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pIFwoZnJvbSAoWzAtOWEtZl17NDB9KVwpfSAkbGluZSBtYXRjaCBpZCBwXX0gewoJIyBzdGFydCBvZiBhIG5ldyBzdHJpbmcgb2YgZGlmZnMKCWRvbmVmaWxlZGlmZgoJc2V0IGZkaWZmaWRzIFtsaXN0ICRpZCAkcF0KCXNldCBmZGlmZnMge30KICAgIH0gZWxzZWlmIHtbc3RyaW5nIG1hdGNoICI6KiIgJGxpbmVdfSB7CglsYXBwZW5kIGZkaWZmcyBbbGluZGV4ICRsaW5lIDVdCiAgICB9Cn0KCnByb2MgZG9uZWZpbGVkaWZmIHt9IHsKICAgIGdsb2JhbCBmZGlmZmlkcyBmZGlmZnMgdHJlZWRpZmZzIGZpbmRpZHMKICAgIGdsb2JhbCBmZGlmZnNuZWVkZWQgZmRpZmZwb3MKCiAgICBpZiB7W2luZm8gZXhpc3RzIGZkaWZmaWRzXX0gewoJd2hpbGUge1tsaW5kZXggJGZkaWZmc25lZWRlZCAkZmRpZmZwb3NdIG5lICRmZGlmZmlkcwoJICAgICAgICYmICRmZGlmZnBvcyA8IFtsbGVuZ3RoICRmZGlmZnNuZWVkZWRdfSB7CgkgICAgIyBnaXQtZGlmZi10cmVlIGRvZXNuJ3Qgb3V0cHV0IGFueXRoaW5nIGZvciBhIGNvbW1pdAoJICAgICMgd2hpY2ggZG9lc24ndCBjaGFuZ2UgYW55dGhpbmcKCSAgICBzZXQgbnVsbGlkcyBbbGluZGV4ICRmZGlmZnNuZWVkZWQgJGZkaWZmcG9zXQoJICAgIHNldCB0cmVlZGlmZnMoJG51bGxpZHMpIHt9CgkgICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXSAmJiAkbnVsbGlkcyBlcSAkZmluZGlkc30gewoJCXVuc2V0IGZpbmRpZHMKCQlmaW5kY29udCAkbnVsbGlkcwoJICAgIH0KCSAgICBpbmNyIGZkaWZmcG9zCgl9CglpbmNyIGZkaWZmcG9zCgoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRmZGlmZmlkcyldfSB7CgkgICAgc2V0IHRyZWVkaWZmcygkZmRpZmZpZHMpICRmZGlmZnMKCX0KCWlmIHtbaW5mbyBleGlzdHMgZmluZGlkc10gJiYgJGZkaWZmaWRzIGVxICRmaW5kaWRzfSB7CgkgICAgdW5zZXQgZmluZGlkcwoJICAgIGZpbmRjb250ICRmZGlmZmlkcwoJfQogICAgfQp9Cgpwcm9jIGZpbmRjb250IHtpZHN9IHsKICAgIGdsb2JhbCBmaW5kaWRzIHRyZWVkaWZmcyBwYXJlbnRzIG5wYXJlbnRzCiAgICBnbG9iYWwgZmZpbGVsaW5lIGZpbmRzdGFydGxpbmUgZmluZGRpZHNlbAogICAgZ2xvYmFsIGxpbmVpZCBudW1jb21taXRzIG1hdGNoaW5nbGluZXMgZmluZGlucHJvZ3Jlc3MKICAgIGdsb2JhbCBmaW5kbWVyZ2VmaWxlcwoKICAgIHNldCBpZCBbbGluZGV4ICRpZHMgMF0KICAgIHNldCBwIFtsaW5kZXggJGlkcyAxXQogICAgc2V0IHBpIFtsc2VhcmNoIC1leGFjdCAkcGFyZW50cygkaWQpICRwXQogICAgc2V0IGwgJGZmaWxlbGluZQogICAgd2hpbGUgMSB7CglpZiB7JGZpbmRtZXJnZWZpbGVzIHx8ICRucGFyZW50cygkaWQpID09IDF9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CgkJc2V0IGZpbmRpZHMgJGlkcwoJCXNldCBmZmlsZWxpbmUgJGwKCQlyZXR1cm4KCSAgICB9CgkgICAgc2V0IGRvZXNtYXRjaCAwCgkgICAgZm9yZWFjaCBmICR0cmVlZGlmZnMoJGlkcykgewoJCXNldCB4IFtmaW5kbWF0Y2hlcyAkZl0KCQlpZiB7JHggIT0ge319IHsKCQkgICAgc2V0IGRvZXNtYXRjaCAxCgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCSAgICBpZiB7JGRvZXNtYXRjaH0gewoJCWluc2VydG1hdGNoICRsICRpZAoJCXNldCBwaSAkbnBhcmVudHMoJGlkKQoJICAgIH0KCX0gZWxzZSB7CgkgICAgc2V0IHBpICRucGFyZW50cygkaWQpCgl9CglpZiB7W2luY3IgcGldID49ICRucGFyZW50cygkaWQpfSB7CgkgICAgc2V0IHBpIDAKCSAgICBpZiB7W2luY3IgbF0gPj0gJG51bWNvbW1pdHN9IHsKCQlzZXQgbCAwCgkgICAgfQoJICAgIGlmIHskbCA9PSAkZmluZHN0YXJ0bGluZX0gYnJlYWsKCSAgICBzZXQgaWQgJGxpbmVpZCgkbCkKCX0KCXNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAkcGldCglzZXQgaWRzIFtsaXN0ICRpZCAkcF0KICAgIH0KICAgIHN0b3BmaW5kcHJvYwogICAgaWYgeyEkZmluZGRpZHNlbH0gewoJYmVsbAogICAgfQp9CgojIG1hcmsgYSBjb21taXQgYXMgbWF0Y2hpbmcgYnkgcHV0dGluZyBhIHllbGxvdyBiYWNrZ3JvdW5kCiMgYmVoaW5kIHRoZSBoZWFkbGluZQpwcm9jIG1hcmtoZWFkbGluZSB7bCBpZH0gewogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgbGluZWh0YWcgY29tbWl0aW5mbwoKICAgIHNldCBiYm94IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgJGJib3ggLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCiAgICAkY2FudiBsb3dlciAkdAp9CgojIG1hcmsgdGhlIGJpdHMgb2YgYSBoZWFkbGluZSwgYXV0aG9yIG9yIGRhdGUgdGhhdCBtYXRjaCBhIGZpbmQgc3RyaW5nCnByb2MgbWFya21hdGNoZXMge2NhbnYgbCBzdHIgdGFnIG1hdGNoZXMgZm9udH0gewogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJHRhZ10KICAgIHNldCB4MCBbbGluZGV4ICRiYm94IDBdCiAgICBzZXQgeTAgW2xpbmRleCAkYmJveCAxXQogICAgc2V0IHkxIFtsaW5kZXggJGJib3ggM10KICAgIGZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCglzZXQgZW5kIFtsaW5kZXggJG1hdGNoIDFdCglpZiB7JHN0YXJ0ID4gJGVuZH0gY29udGludWUKCXNldCB4b2ZmIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgJHN0YXJ0LTFdXV0KCXNldCB4bGVuIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgJGVuZF1dXQoJc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0IFtleHByICR4MCskeG9mZl0gJHkwIFtleHByICR4MCskeGxlbisyXSAkeTEgXAoJCSAgIC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bm1hcmttYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpZHMKICAgIGFsbGNhbnZzIGRlbGV0ZSBtYXRjaGVzCiAgICBjYXRjaCB7dW5zZXQgbWF0Y2hpbmdsaW5lc30KICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQp9Cgpwcm9jIHNlbGNhbnZsaW5lIHt3IHggeX0gewogICAgZ2xvYmFsIGNhbnYgY2FudnkwIGN0ZXh0IGxpbmVzcGMKICAgIGdsb2JhbCBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcgcm93dGV4dHgKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCiAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCiAgICBzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCiAgICBzZXQgbCBbZXhwciB7aW50KCgkeSAtICRjYW52eTApIC8gJGxpbmVzcGMgKyAwLjUpfV0KICAgIGlmIHskbCA8IDB9IHsKCXNldCBsIDAKICAgIH0KICAgIGlmIHskdyBlcSAkY2Fudn0gewoJaWYgeyFbaW5mbyBleGlzdHMgcm93dGV4dHgoJGwpXSB8fCAkeCA8ICRyb3d0ZXh0eCgkbCl9IHJldHVybgogICAgfQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2MgY29tbWl0X2Rlc2NyaXB0b3Ige3B9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvCiAgICBzZXQgbCAiLi4uIgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRwKV19IHsKCXNldCBsIFtsaW5kZXggJGNvbW1pdGluZm8oJHApIDBdCiAgICB9CiAgICByZXR1cm4gIiRwICgkbCkiCn0KCiMgYXBwZW5kIHNvbWUgdGV4dCB0byB0aGUgY3RleHQgd2lkZ2V0LCBhbmQgbWFrZSBhbnkgU0hBMSBJRAojIHRoYXQgd2Uga25vdyBhYm91dCBiZSBhIGNsaWNrYWJsZSBsaW5rLgpwcm9jIGFwcGVuZHdpdGhsaW5rcyB7dGV4dH0gewogICAgZ2xvYmFsIGN0ZXh0IGlkbGluZSBsaW5rbnVtCgogICAgc2V0IHN0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KICAgICRjdGV4dCBpbnNlcnQgZW5kICR0ZXh0CiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICBzZXQgbGlua3MgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUge1swLTlhLWZdezQwfX0gJHRleHRdCiAgICBmb3JlYWNoIGwgJGxpbmtzIHsKCXNldCBzIFtsaW5kZXggJGwgMF0KCXNldCBlIFtsaW5kZXggJGwgMV0KCXNldCBsaW5raWQgW3N0cmluZyByYW5nZSAkdGV4dCAkcyAkZV0KCWlmIHshW2luZm8gZXhpc3RzIGlkbGluZSgkbGlua2lkKV19IGNvbnRpbnVlCglpbmNyIGUKCSRjdGV4dCB0YWcgYWRkIGxpbmsgIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBhZGQgbGluayRsaW5rbnVtICIkc3RhcnQgKyAkcyBjIiAiJHN0YXJ0ICsgJGUgYyIKCSRjdGV4dCB0YWcgYmluZCBsaW5rJGxpbmtudW0gPDE+IFtsaXN0IHNlbGVjdGxpbmUgJGlkbGluZSgkbGlua2lkKSAxXQoJaW5jciBsaW5rbnVtCiAgICB9CiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9Cn0KCnByb2Mgc2VsZWN0bGluZSB7bCBpc25ld30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY29tbWl0aW5mbyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBjYW52eTAgbGluZXNwYyBwYXJlbnRzIG5wYXJlbnRzIGNoaWxkcmVuCiAgICBnbG9iYWwgY2ZsaXN0IGN1cnJlbnRpZCBzaGExZW50cnkKICAgIGdsb2JhbCBjb21tZW50ZW5kIGlkdGFncyBpZGxpbmUgbGlua251bQoKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgbm9ybWFsbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbGluZWlkKCRsKV0gfHwgIVtpbmZvIGV4aXN0cyBsaW5laHRhZygkbCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52IGNyZWF0ZSByZWN0IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudiBsb3dlciAkdAogICAgJGNhbnYyIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjIgbG93ZXIgJHQKICAgICRjYW52MyBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjMgY3JlYXRlIHJlY3QgWyRjYW52MyBiYm94ICRsaW5lZHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYzIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYzIGxvd2VyICR0CiAgICBzZXQgeSBbZXhwciB7JGNhbnZ5MCArICRsICogJGxpbmVzcGN9XQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgc2V0IHl0b3AgW2V4cHIgeyR5IC0gJGxpbmVzcGMgLSAxfV0KICAgIHNldCB5Ym90IFtleHByIHskeSArICRsaW5lc3BjICsgMX1dCiAgICBzZXQgd25vdyBbJGNhbnYgeXZpZXddCiAgICBzZXQgd3RvcCBbZXhwciBbbGluZGV4ICR3bm93IDBdICogJHltYXhdCiAgICBzZXQgd2JvdCBbZXhwciBbbGluZGV4ICR3bm93IDFdICogJHltYXhdCiAgICBzZXQgd2ggW2V4cHIgeyR3Ym90IC0gJHd0b3B9XQogICAgc2V0IG5ld3RvcCAkd3RvcAogICAgaWYgeyR5dG9wIDwgJHd0b3B9IHsKCWlmIHskeWJvdCA8ICR3dG9wfSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wICR5dG9wCgkgICAgaWYgeyRuZXd0b3AgPiAkd3RvcCAtICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgLSAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfSBlbHNlaWYgeyR5Ym90ID4gJHdib3R9IHsKCWlmIHskeXRvcCA+ICR3Ym90fSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeWJvdCAtICR3aH1dCgkgICAgaWYgeyRuZXd0b3AgPCAkd3RvcCArICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRuZXd0b3AgIT0gJHd0b3B9IHsKCWlmIHskbmV3dG9wIDwgMH0gewoJICAgIHNldCBuZXd0b3AgMAoJfQoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByICRuZXd0b3AgKiAxLjAgLyAkeW1heF0KICAgIH0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3Qgc2VsZWN0bGluZSAkbCAwXQogICAgfQoKICAgIHNldCBzZWxlY3RlZGxpbmUgJGwKCiAgICBzZXQgaWQgJGxpbmVpZCgkbCkKICAgIHNldCBjdXJyZW50aWQgJGlkCiAgICAkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgJHNoYTFlbnRyeSBpbnNlcnQgMCAkaWQKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIGZyb20gMAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gdG8gZW5kCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICBzZXQgbGlua251bSAwCiAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuMCAwLjAKICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuMCBsZWZ0CiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkF1dGhvcjogW2xpbmRleCAkaW5mbyAxXSAgJGRhdGVcbiIKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gNF1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQ29tbWl0dGVyOiBbbGluZGV4ICRpbmZvIDNdICAkZGF0ZVxuIgogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJUYWdzOiIKCWZvcmVhY2ggdGFnICRpZHRhZ3MoJGlkKSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkdGFnIgoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgfQogCiAgICBzZXQgY29tbWVudCB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBwYXJlbnRzKCRpZCldfSB7Cglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgYXBwZW5kIGNvbW1lbnQgIlBhcmVudDogW2NvbW1pdF9kZXNjcmlwdG9yICRwXVxuIgoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBjaGlsZHJlbigkaWQpXX0gewoJZm9yZWFjaCBjICRjaGlsZHJlbigkaWQpIHsKCSAgICBhcHBlbmQgY29tbWVudCAiQ2hpbGQ6ICBbY29tbWl0X2Rlc2NyaXB0b3IgJGNdXG4iCgl9CiAgICB9CiAgICBhcHBlbmQgY29tbWVudCAiXG4iCiAgICBhcHBlbmQgY29tbWVudCBbbGluZGV4ICRpbmZvIDVdCgogICAgIyBtYWtlIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIFNIQTEgSUQgYmUgYSBjbGlja2FibGUgbGluawogICAgYXBwZW5kd2l0aGxpbmtzICRjb21tZW50CgogICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IGNvbW1lbnRlbmQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCiAgICAkY2ZsaXN0IGluc2VydCBlbmQgIkNvbW1lbnRzIgogICAgaWYgeyRucGFyZW50cygkaWQpID09IDF9IHsKCXN0YXJ0ZGlmZiBbY29uY2F0ICRpZCAkcGFyZW50cygkaWQpXQogICAgfSBlbHNlaWYgeyRucGFyZW50cygkaWQpID4gMX0gewoJbWVyZ2VkaWZmICRpZAogICAgfQp9Cgpwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgJHNlbGVjdGVkbGluZSArICRkaXJdCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyB1bnNlbGVjdGxpbmUge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIGNhdGNoIHt1bnNldCBzZWxlY3RlZGxpbmV9CiAgICBhbGxjYW52cyBkZWxldGUgc2Vjc2VsCn0KCnByb2MgYWRkdG9oaXN0b3J5IHtjbWR9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMAoJJiYgW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0gPT0gJGNtZH0gewoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBoaXN0b3J5IFtscmVwbGFjZSAkaGlzdG9yeSAkaGlzdG9yeWluZGV4IGVuZCAkY21kXQogICAgfSBlbHNlIHsKCWxhcHBlbmQgaGlzdG9yeSAkY21kCiAgICB9CiAgICBpbmNyIGhpc3RvcnlpbmRleAogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9IGVsc2UgewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9CiAgICAuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgZ29iYWNrIHt9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJaW5jciBoaXN0b3J5aW5kZXggLTEKCXNldCBjbWQgW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0KCWV2YWwgJGNtZAoJLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4IDw9IDF9IHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIGdvZm9ydyB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJc2V0IGNtZCBbbGluZGV4ICRoaXN0b3J5ICRoaXN0b3J5aW5kZXhdCglpbmNyIGhpc3RvcnlpbmRleAoJZXZhbCAkY21kCgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA+PSBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCS5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBtZXJnZWRpZmYge2lkfSB7CiAgICBnbG9iYWwgcGFyZW50cyBkaWZmbWVyZ2VpZCBkaWZmbWVyZ2VnY2EgbWVyZ2VmaWxlbGlzdCBkaWZmcGluZGV4CgogICAgc2V0IGRpZmZtZXJnZWlkICRpZAogICAgc2V0IGRpZmZwaW5kZXggLTEKICAgIHNldCBkaWZmbWVyZ2VnY2EgW2ZpbmRnY2EgJHBhcmVudHMoJGlkKV0KICAgIGlmIHtbaW5mbyBleGlzdHMgbWVyZ2VmaWxlbGlzdCgkaWQpXX0gewoJaWYgeyRtZXJnZWZpbGVsaXN0KCRpZCkgbmUge319IHsKCSAgICBzaG93bWVyZ2VkaWZmCgl9CiAgICB9IGVsc2UgewoJY29udG1lcmdlZGlmZiB7fQogICAgfQp9Cgpwcm9jIGZpbmRnY2Ege2lkc30gewogICAgc2V0IGdjYSB7fQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWlmIHskZ2NhIGVxIHt9fSB7CgkgICAgc2V0IGdjYSAkaWQKCX0gZWxzZSB7CgkgICAgaWYge1tjYXRjaCB7CgkJc2V0IGdjYSBbZXhlYyBnaXQtbWVyZ2UtYmFzZSAkZ2NhICRpZF0KCSAgICB9IGVycl19IHsKCQlyZXR1cm4ge30KCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gJGdjYQp9Cgpwcm9jIGNvbnRtZXJnZWRpZmYge2lkc30gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGRpZmZwaW5kZXggcGFyZW50cyBucGFyZW50cyBkaWZmbWVyZ2VnY2EKICAgIGdsb2JhbCB0cmVlZGlmZnMgbWVyZ2VmaWxlbGlzdCBkaWZmaWRzIHRyZWVwZW5kaW5nCgogICAgIyBkaWZmIHRoZSBjaGlsZCBhZ2FpbnN0IGVhY2ggb2YgdGhlIHBhcmVudHMsIGFuZCBkaWZmCiAgICAjIGVhY2ggb2YgdGhlIHBhcmVudHMgYWdhaW5zdCB0aGUgR0NBLgogICAgd2hpbGUgMSB7CglpZiB7W2xpbmRleCAkaWRzIDBdID09ICRkaWZmbWVyZ2VpZCAmJiAkZGlmZm1lcmdlZ2NhIG5lIHt9fSB7CgkgICAgc2V0IGlkcyBbbGlzdCBbbGluZGV4ICRpZHMgMV0gJGRpZmZtZXJnZWdjYV0KCX0gZWxzZSB7CgkgICAgaWYge1tpbmNyIGRpZmZwaW5kZXhdID49ICRucGFyZW50cygkZGlmZm1lcmdlaWQpfSBicmVhawoJICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGRpZmZtZXJnZWlkKSAkZGlmZnBpbmRleF0KCSAgICBzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0KCX0KCWlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCSAgICBzZXQgZGlmZmlkcyAkaWRzCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkJZ2V0dHJlZWRpZmZzICRpZHMKCSAgICB9CgkgICAgcmV0dXJuCgl9CiAgICB9CgogICAgIyBJZiBhIGZpbGUgaW4gc29tZSBwYXJlbnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGNoaWxkIGFuZCBhbHNvCiAgICAjIGRpZmZlcmVudCBmcm9tIHRoZSBHQ0EsIHRoZW4gaXQncyBpbnRlcmVzdGluZy4KICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhIEdDQSwgdGhlbiBhIGZpbGUgaXMgaW50ZXJlc3RpbmcgaWYgaXQgaXMKICAgICMgZGlmZmVyZW50IGZyb20gdGhlIGNoaWxkIGluIGFsbCB0aGUgcGFyZW50cy4KICAgIGlmIHskZGlmZm1lcmdlZ2NhIG5lIHt9fSB7CglzZXQgZmlsZXMge30KCWZvcmVhY2ggcCAkcGFyZW50cygkZGlmZm1lcmdlaWQpIHsKCSAgICBzZXQgZ2NhZGlmZnMgJHRyZWVkaWZmcyhbbGlzdCAkcCAkZGlmZm1lcmdlZ2NhXSkKCSAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcyhbbGlzdCAkZGlmZm1lcmdlaWQgJHBdKSB7CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZmlsZXMgJGZdIDwgMAoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGdjYWRpZmZzICRmXSA+PSAwfSB7CgkJICAgIGxhcHBlbmQgZmlsZXMgJGYKCQl9CgkgICAgfQoJfQoJc2V0IGZpbGVzIFtsc29ydCAkZmlsZXNdCiAgICB9IGVsc2UgewoJc2V0IHAgW2xpbmRleCAkcGFyZW50cygkZGlmZm1lcmdlaWQpIDBdCglzZXQgZmlsZXMgJHRyZWVkaWZmcyhbbGlzdCAkZGlmZm1lcmdlaWQgJHBdKQoJZm9yIHtzZXQgaSAxfSB7JGkgPCAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKSAmJiAkZmlsZXMgbmUge319IHtpbmNyIGl9IHsKCSAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJGldCgkgICAgc2V0IGRmICR0cmVlZGlmZnMoW2xpc3QgJGRpZmZtZXJnZWlkICRwXSkKCSAgICBzZXQgbmYge30KCSAgICBmb3JlYWNoIGYgJGZpbGVzIHsKCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRkZiAkZl0gPj0gMH0gewoJCSAgICBsYXBwZW5kIG5mICRmCgkJfQoJICAgIH0KCSAgICBzZXQgZmlsZXMgJG5mCgl9CiAgICB9CgogICAgc2V0IG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKSAkZmlsZXMKICAgIGlmIHskZmlsZXMgbmUge319IHsKCXNob3dtZXJnZWRpZmYKICAgIH0KfQoKcHJvYyBzaG93bWVyZ2VkaWZmIHt9IHsKICAgIGdsb2JhbCBjZmxpc3QgZGlmZm1lcmdlaWQgbWVyZ2VmaWxlbGlzdCBwYXJlbnRzCiAgICBnbG9iYWwgZGlmZm9wdHMgZGlmZmluaHVuayBjdXJyZW50ZmlsZSBjdXJyZW50aHVuayBmaWxlbGluZXMKICAgIGdsb2JhbCBkaWZmYmxvY2tlZCBncm91cGZpbGVsYXN0IG1lcmdlZmRzIGdyb3VwZmlsZW51bSBncm91cGh1bmtzCgogICAgc2V0IGZpbGVzICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkKICAgIGZvcmVhY2ggZiAkZmlsZXMgewoJJGNmbGlzdCBpbnNlcnQgZW5kICRmCiAgICB9CiAgICBzZXQgZW52KEdJVF9ESUZGX09QVFMpICRkaWZmb3B0cwogICAgc2V0IGZsaXN0IHt9CiAgICBjYXRjaCB7dW5zZXQgY3VycmVudGZpbGV9CiAgICBjYXRjaCB7dW5zZXQgY3VycmVudGh1bmt9CiAgICBjYXRjaCB7dW5zZXQgZmlsZWxpbmVzfQogICAgY2F0Y2gge3Vuc2V0IGdyb3VwZmlsZW51bX0KICAgIGNhdGNoIHt1bnNldCBncm91cGh1bmtzfQogICAgc2V0IGdyb3VwZmlsZWxhc3QgLTEKICAgIGZvcmVhY2ggcCAkcGFyZW50cygkZGlmZm1lcmdlaWQpIHsKCXNldCBjbWQgW2xpc3QgfCBnaXQtZGlmZi10cmVlIC1wICRwICRkaWZmbWVyZ2VpZF0KCXNldCBjbWQgW2NvbmNhdCAkY21kICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCldCglpZiB7W2NhdGNoIHtzZXQgZiBbb3BlbiAkY21kIHJdfSBlcnJdfSB7CgkgICAgZXJyb3JfcG9wdXAgIkVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCgkgICAgZm9yZWFjaCBmICRmbGlzdCB7CgkJY2F0Y2gge2Nsb3NlICRmfQoJICAgIH0KCSAgICByZXR1cm4KCX0KCWxhcHBlbmQgZmxpc3QgJGYKCXNldCBpZHMgW2xpc3QgJGRpZmZtZXJnZWlkICRwXQoJc2V0IG1lcmdlZmRzKCRpZHMpICRmCglzZXQgZGlmZmluaHVuaygkaWRzKSAwCglzZXQgZGlmZmJsb2NrZWQoJGlkcykgMAoJZmNvbmZpZ3VyZSAkZiAtYmxvY2tpbmcgMAoJZmlsZWV2ZW50ICRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJGYgJGlkcyAkZGlmZm1lcmdlaWRdCiAgICB9Cn0KCnByb2MgZ2V0bWVyZ2VkaWZmbGluZSB7ZiBpZHMgaWR9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBkaWZmaW5odW5rIGRpZmZvbGRsaW5lcyBkaWZmbmV3bGluZXMKICAgIGdsb2JhbCBjdXJyZW50ZmlsZSBjdXJyZW50aHVuawogICAgZ2xvYmFsIGRpZmZvbGRzdGFydCBkaWZmbmV3c3RhcnQgZGlmZm9sZGxubyBkaWZmbmV3bG5vCiAgICBnbG9iYWwgZGlmZmJsb2NrZWQgbWVyZ2VmaWxlbGlzdAogICAgZ2xvYmFsIG5vbGRsaW5lcyBubmV3bGluZXMgZGlmZmxjb3VudHMgZmlsZWxpbmVzCgogICAgc2V0IG4gW2dldHMgJGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHshW2VvZiAkZl19IHJldHVybgogICAgfQoKICAgIGlmIHshKFtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF0gJiYgJGRpZmZtZXJnZWlkID09ICRpZCl9IHsKCWlmIHskbiA8IDB9IHsKCSAgICBjbG9zZSAkZgoJfQoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRkaWZmaW5odW5rKCRpZHMpICE9IDB9IHsKCXNldCBmaSAkY3VycmVudGZpbGUoJGlkcykKCWlmIHskbiA+IDAgJiYgW3JlZ2V4cCB7XlstKyBcXF19ICRsaW5lIG1hdGNoXX0gewoJICAgICMgY29udGludWluZyBhbiBleGlzdGluZyBodW5rCgkgICAgc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxIGVuZF0KCSAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KCSAgICBpZiB7JG1hdGNoIGVxICItIiB8fCAkbWF0Y2ggZXEgIiAifSB7CgkJc2V0IGZpbGVsaW5lcygkcCwkZmksJGRpZmZvbGRsbm8oJGlkcykpICRsaW5lCgkJaW5jciBkaWZmb2xkbG5vKCRpZHMpCgkgICAgfQoJICAgIGlmIHskbWF0Y2ggZXEgIisiIHx8ICRtYXRjaCBlcSAiICJ9IHsKCQlzZXQgZmlsZWxpbmVzKCRpZCwkZmksJGRpZmZuZXdsbm8oJGlkcykpICRsaW5lCgkJaW5jciBkaWZmbmV3bG5vKCRpZHMpCgkgICAgfQoJICAgIGlmIHskbWF0Y2ggZXEgIiAifSB7CgkJaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDJ9IHsKCQkgICAgbGFwcGVuZCBkaWZmbGNvdW50cygkaWRzKSBcCgkJCVtsaXN0ICRub2xkbGluZXMoJGlkcykgJG5uZXdsaW5lcygkaWRzKV0KCQkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkJICAgIHNldCBkaWZmaW5odW5rKCRpZHMpIDEKCQl9CgkJaW5jciBub2xkbGluZXMoJGlkcykKCSAgICB9IGVsc2VpZiB7JG1hdGNoIGVxICItIiB8fCAkbWF0Y2ggZXEgIisifSB7CgkJaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDF9IHsKCQkgICAgbGFwcGVuZCBkaWZmbGNvdW50cygkaWRzKSBbbGlzdCAkbm9sZGxpbmVzKCRpZHMpXQoJCSAgICBzZXQgbm9sZGxpbmVzKCRpZHMpIDAKCQkgICAgc2V0IG5uZXdsaW5lcygkaWRzKSAwCgkJICAgIHNldCBkaWZmaW5odW5rKCRpZHMpIDIKCQl9CgkJaWYgeyRtYXRjaCBlcSAiLSJ9IHsKCQkgICAgaW5jciBub2xkbGluZXMoJGlkcykKCQl9IGVsc2UgewoJCSAgICBpbmNyIG5uZXdsaW5lcygkaWRzKQoJCX0KCSAgICB9CgkgICAgIyBhbmQgaWYgaXQncyBcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGxpbmUsIHRoZW4gd2hhdD8KCSAgICByZXR1cm4KCX0KCSMgZW5kIG9mIGEgaHVuawoJaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDEgJiYgJG5vbGRsaW5lcygkaWRzKSAhPSAwfSB7CgkgICAgbGFwcGVuZCBkaWZmbGNvdW50cygkaWRzKSBbbGlzdCAkbm9sZGxpbmVzKCRpZHMpXQoJfSBlbHNlaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDIKCQkgICYmICgkbm9sZGxpbmVzKCRpZHMpICE9IDAgfHwgJG5uZXdsaW5lcygkaWRzKSAhPSAwKX0gewoJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKSAkbm5ld2xpbmVzKCRpZHMpXQoJfQoJc2V0IGN1cnJlbnRodW5rKCRpZHMpIFtsaXN0ICRjdXJyZW50ZmlsZSgkaWRzKSBcCgkJCQkgICAkZGlmZm9sZHN0YXJ0KCRpZHMpICRkaWZmbmV3c3RhcnQoJGlkcykgXAoJCQkJICAgJGRpZmZvbGRsbm8oJGlkcykgJGRpZmZuZXdsbm8oJGlkcykgXAoJCQkJICAgJGRpZmZsY291bnRzKCRpZHMpXQoJc2V0IGRpZmZpbmh1bmsoJGlkcykgMAoJIyAtMSA9IG5lZWQgdG8gYmxvY2ssIDAgPSB1bmJsb2NrZWQsIDEgPSBpcyBibG9ja2VkCglzZXQgZGlmZmJsb2NrZWQoJGlkcykgLTEKCXByb2Nlc3NodW5rcwoJaWYgeyRkaWZmYmxvY2tlZCgkaWRzKSA9PSAtMX0gewoJICAgIGZpbGVldmVudCAkZiByZWFkYWJsZSB7fQoJICAgIHNldCBkaWZmYmxvY2tlZCgkaWRzKSAxCgl9CiAgICB9CgogICAgaWYgeyRuIDwgMH0gewoJIyBlb2YKCWlmIHshJGRpZmZibG9ja2VkKCRpZHMpfSB7CgkgICAgY2xvc2UgJGYKCSAgICBzZXQgY3VycmVudGZpbGUoJGlkcykgW2xsZW5ndGggJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKV0KCSAgICBzZXQgY3VycmVudGh1bmsoJGlkcykgW2xpc3QgJGN1cnJlbnRmaWxlKCRpZHMpIDAgMCAwIDAge31dCgkgICAgcHJvY2Vzc2h1bmtzCgl9CiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XmRpZmYgLS1naXQgYS8oLiopIGIvfSAkbGluZSBtYXRjaCBmbmFtZV19IHsKCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJc2V0IGN1cnJlbnRmaWxlKCRpZHMpIFwKCSAgICBbbHNlYXJjaCAtZXhhY3QgJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKSAkZm5hbWVdCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAIC0oWzAtOV0rKSwoWzAtOV0rKSBcKyhbMC05XSspLChbMC05XSspIEBAKC4qKX0gXAoJCSAgICRsaW5lIG1hdGNoIGYxbCBmMWMgZjJsIGYyYyByZXN0XX0gewoJaWYge1tpbmZvIGV4aXN0cyBjdXJyZW50ZmlsZSgkaWRzKV0gJiYgJGN1cnJlbnRmaWxlKCRpZHMpID49IDB9IHsKCSAgICAjIHN0YXJ0IG9mIGEgbmV3IGh1bmsKCSAgICBpZiB7JGYxbCA9PSAwICYmICRmMWMgPT0gMH0gewoJCXNldCBmMWwgMQoJICAgIH0KCSAgICBpZiB7JGYybCA9PSAwICYmICRmMmMgPT0gMH0gewoJCXNldCBmMmwgMQoJICAgIH0KCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAxCgkgICAgc2V0IGRpZmZvbGRzdGFydCgkaWRzKSAkZjFsCgkgICAgc2V0IGRpZmZuZXdzdGFydCgkaWRzKSAkZjJsCgkgICAgc2V0IGRpZmZvbGRsbm8oJGlkcykgJGYxbAoJICAgIHNldCBkaWZmbmV3bG5vKCRpZHMpICRmMmwKCSAgICBzZXQgZGlmZmxjb3VudHMoJGlkcykge30KCSAgICBzZXQgbm9sZGxpbmVzKCRpZHMpIDAKCSAgICBzZXQgbm5ld2xpbmVzKCRpZHMpIDAKCX0KICAgIH0KfQoKcHJvYyBwcm9jZXNzaHVua3Mge30gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIHBhcmVudHMgbnBhcmVudHMgY3VycmVudGh1bmsKICAgIGdsb2JhbCBtZXJnZWZpbGVsaXN0IGRpZmZibG9ja2VkIG1lcmdlZmRzCiAgICBnbG9iYWwgZ3JvdXBodW5rcyBncm91cGxpbmVzdGFydCBncm91cGxpbmVlbmQgZ3JvdXBmaWxlbnVtCgogICAgc2V0IG5maWxlcyBbbGxlbmd0aCAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpXQogICAgd2hpbGUgMSB7CglzZXQgZmkgJG5maWxlcwoJc2V0IGxubyAwCgkjIGxvb2sgZm9yIHRoZSBlYXJsaWVzdCBodW5rCglmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGh1bmsoJGlkcyldfSByZXR1cm4KCSAgICBzZXQgaSBbbGluZGV4ICRjdXJyZW50aHVuaygkaWRzKSAwXQoJICAgIHNldCBsIFtsaW5kZXggJGN1cnJlbnRodW5rKCRpZHMpIDJdCgkgICAgaWYgeyRpIDwgJGZpIHx8ICgkaSA9PSAkZmkgJiYgJGwgPCAkbG5vKX0gewoJCXNldCBmaSAkaQoJCXNldCBsbm8gJGwKCQlzZXQgcGkgJHAKCSAgICB9Cgl9CgoJaWYgeyRmaSA8ICRuZmlsZXN9IHsKCSAgICBzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VpZCAkcGldCgkgICAgc2V0IGh1bmsgJGN1cnJlbnRodW5rKCRpZHMpCgkgICAgdW5zZXQgY3VycmVudGh1bmsoJGlkcykKCSAgICBpZiB7JGRpZmZibG9ja2VkKCRpZHMpID4gMH0gewoJCWZpbGVldmVudCAkbWVyZ2VmZHMoJGlkcykgcmVhZGFibGUgXAoJCSAgICBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRtZXJnZWZkcygkaWRzKSAkaWRzICRkaWZmbWVyZ2VpZF0KCSAgICB9CgkgICAgc2V0IGRpZmZibG9ja2VkKCRpZHMpIDAKCgkgICAgaWYge1tpbmZvIGV4aXN0cyBncm91cGZpbGVudW1dICYmICRncm91cGZpbGVudW0gPT0gJGZpCgkJJiYgJGxubyA8PSAkZ3JvdXBsaW5lZW5kfSB7CgkJIyBhZGQgdGhpcyBodW5rIHRvIHRoZSBwZW5kaW5nIGdyb3VwCgkJbGFwcGVuZCBncm91cGh1bmtzKCRwaSkgJGh1bmsKCQlzZXQgZW5kbG4gW2xpbmRleCAkaHVuayA0XQoJCWlmIHskZW5kbG4gPiAkZ3JvdXBsaW5lZW5kfSB7CgkJICAgIHNldCBncm91cGxpbmVlbmQgJGVuZGxuCgkJfQoJCWNvbnRpbnVlCgkgICAgfQoJfQoKCSMgc3VjY2VlZGluZyBzdHVmZiBkb2Vzbid0IGJlbG9uZyBpbiB0aGlzIGdyb3VwLCBzbwoJIyBwcm9jZXNzIHRoZSBncm91cCBub3cKCWlmIHtbaW5mbyBleGlzdHMgZ3JvdXBmaWxlbnVtXX0gewoJICAgIHByb2Nlc3Nncm91cAoJICAgIHVuc2V0IGdyb3VwZmlsZW51bQoJICAgIHVuc2V0IGdyb3VwaHVua3MKCX0KCglpZiB7JGZpID49ICRuZmlsZXN9IGJyZWFrCgoJIyBzdGFydCBhIG5ldyBncm91cAoJc2V0IGdyb3VwZmlsZW51bSAkZmkKCXNldCBncm91cGh1bmtzKCRwaSkgW2xpc3QgJGh1bmtdCglzZXQgZ3JvdXBsaW5lc3RhcnQgJGxubwoJc2V0IGdyb3VwbGluZWVuZCBbbGluZGV4ICRodW5rIDRdCiAgICB9Cn0KCnByb2MgcHJvY2Vzc2dyb3VwIHt9IHsKICAgIGdsb2JhbCBncm91cGZpbGVsYXN0IGdyb3VwZmlsZW51bSBkaWZmZmlsZXN0YXJ0CiAgICBnbG9iYWwgbWVyZ2VmaWxlbGlzdCBkaWZmbWVyZ2VpZCBjdGV4dCBmaWxlbGluZXMKICAgIGdsb2JhbCBwYXJlbnRzIGRpZmZtZXJnZWlkIGRpZmZvZmZzZXQKICAgIGdsb2JhbCBncm91cGh1bmtzIGdyb3VwbGluZXN0YXJ0IGdyb3VwbGluZWVuZCBucGFyZW50cwogICAgZ2xvYmFsIG1lcmdlbWF4CgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgc2V0IGlkICRkaWZmbWVyZ2VpZAogICAgc2V0IGYgJGdyb3VwZmlsZW51bQogICAgaWYgeyRncm91cGZpbGVsYXN0ICE9ICRmfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCglzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgZGlmZmZpbGVzdGFydCgkZikgJGhlcmUKCXNldCBtYXJrIGZtYXJrLltleHByIHskZiArIDF9XQoJJGN0ZXh0IG1hcmsgc2V0ICRtYXJrICRoZXJlCgkkY3RleHQgbWFyayBncmF2aXR5ICRtYXJrIGxlZnQKCXNldCBoZWFkZXIgW2xpbmRleCAkbWVyZ2VmaWxlbGlzdCgkaWQpICRmXQoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRoZWFkZXJdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGhlYWRlciAkcGFkXG4iIGZpbGVzZXAKCXNldCBncm91cGZpbGVsYXN0ICRmCglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgc2V0IGRpZmZvZmZzZXQoJHApIDAKCX0KICAgIH0KCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQEAiIG1zZXAKICAgIHNldCBubGluZXMgW2V4cHIgeyRncm91cGxpbmVlbmQgLSAkZ3JvdXBsaW5lc3RhcnR9XQogICAgc2V0IGV2ZW50cyB7fQogICAgc2V0IHBudW0gMAogICAgZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJc2V0IHN0YXJ0bGluZSBbZXhwciB7JGdyb3VwbGluZXN0YXJ0ICsgJGRpZmZvZmZzZXQoJHApfV0KCXNldCBvbCAkc3RhcnRsaW5lCglzZXQgbmwgJGdyb3VwbGluZXN0YXJ0CglpZiB7W2luZm8gZXhpc3RzIGdyb3VwaHVua3MoJHApXX0gewoJICAgIGZvcmVhY2ggaCAkZ3JvdXBodW5rcygkcCkgewoJCXNldCBsIFtsaW5kZXggJGggMl0KCQlpZiB7JG5sIDwgJGx9IHsKCQkgICAgZm9yIHt9IHskbmwgPCAkbH0ge2luY3Igbmx9IHsKCQkJc2V0IGZpbGVsaW5lcygkcCwkZiwkb2wpICRmaWxlbGluZXMoJGlkLCRmLCRubCkKCQkJaW5jciBvbAoJCSAgICB9CgkJfQoJCWZvcmVhY2ggY2h1bmsgW2xpbmRleCAkaCA1XSB7CgkJICAgIGlmIHtbbGxlbmd0aCAkY2h1bmtdID09IDJ9IHsKCQkJc2V0IG9sYyBbbGluZGV4ICRjaHVuayAwXQoJCQlzZXQgbmxjIFtsaW5kZXggJGNodW5rIDFdCgkJCXNldCBubmwgW2V4cHIgeyRubCArICRubGN9XQoJCQlsYXBwZW5kIGV2ZW50cyBbbGlzdCAkbmwgJG5ubCAkcG51bSAkb2xjICRubGNdCgkJCWluY3Igb2wgJG9sYwoJCQlzZXQgbmwgJG5ubAoJCSAgICB9IGVsc2UgewoJCQlpbmNyIG9sIFtsaW5kZXggJGNodW5rIDBdCgkJCWluY3IgbmwgW2xpbmRleCAkY2h1bmsgMF0KCQkgICAgfQoJCX0KCSAgICB9Cgl9CglpZiB7JG5sIDwgJGdyb3VwbGluZWVuZH0gewoJICAgIGZvciB7fSB7JG5sIDwgJGdyb3VwbGluZWVuZH0ge2luY3Igbmx9IHsKCQlzZXQgZmlsZWxpbmVzKCRwLCRmLCRvbCkgJGZpbGVsaW5lcygkaWQsJGYsJG5sKQoJCWluY3Igb2wKCSAgICB9Cgl9CglzZXQgbmxpbmVzIFtleHByIHskb2wgLSAkc3RhcnRsaW5lfV0KCSRjdGV4dCBpbnNlcnQgZW5kICIgLSRzdGFydGxpbmUsJG5saW5lcyIgbXNlcAoJaW5jciBwbnVtCiAgICB9CgogICAgc2V0IG5saW5lcyBbZXhwciB7JGdyb3VwbGluZWVuZCAtICRncm91cGxpbmVzdGFydH1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICskZ3JvdXBsaW5lc3RhcnQsJG5saW5lcyBAQFxuIiBtc2VwCgogICAgc2V0IGV2ZW50cyBbbHNvcnQgLWludGVnZXIgLWluZGV4IDAgJGV2ZW50c10KICAgIHNldCBuZXZlbnRzIFtsbGVuZ3RoICRldmVudHNdCiAgICBzZXQgbm1lcmdlICRucGFyZW50cygkZGlmZm1lcmdlaWQpCiAgICBzZXQgbCAkZ3JvdXBsaW5lc3RhcnQKICAgIGZvciB7c2V0IGkgMH0geyRpIDwgJG5ldmVudHN9IHtzZXQgaSAkan0gewoJc2V0IG5sIFtsaW5kZXggJGV2ZW50cyAkaSAwXQoJd2hpbGUgeyRsIDwgJG5sfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIKCSAgICBpbmNyIGwKCX0KCXNldCBlIFtsaW5kZXggJGV2ZW50cyAkaV0KCXNldCBlbmwgW2xpbmRleCAkZSAxXQoJc2V0IGogJGkKCXNldCBhY3RpdmUge30KCXdoaWxlIDEgewoJICAgIHNldCBwbnVtIFtsaW5kZXggJGUgMl0KCSAgICBzZXQgb2xjIFtsaW5kZXggJGUgM10KCSAgICBzZXQgbmxjIFtsaW5kZXggJGUgNF0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZWx0YSgkcG51bSldfSB7CgkJc2V0IGRlbHRhKCRwbnVtKSBbZXhwciB7JG9sYyAtICRubGN9XQoJCWxhcHBlbmQgYWN0aXZlICRwbnVtCgkgICAgfSBlbHNlIHsKCQlpbmNyIGRlbHRhKCRwbnVtKSBbZXhwciB7JG9sYyAtICRubGN9XQoJICAgIH0KCSAgICBpZiB7W2luY3Igal0gPj0gJG5ldmVudHN9IGJyZWFrCgkgICAgc2V0IGUgW2xpbmRleCAkZXZlbnRzICRqXQoJICAgIGlmIHtbbGluZGV4ICRlIDBdID49ICRlbmx9IGJyZWFrCgkgICAgaWYge1tsaW5kZXggJGUgMV0gPiAkZW5sfSB7CgkJc2V0IGVubCBbbGluZGV4ICRlIDFdCgkgICAgfQoJfQoJc2V0IG5sYyBbZXhwciB7JGVubCAtICRsfV0KCXNldCBuY29sIG1yZXN1bHQKCXNldCBiZXN0cG4gLTEKCWlmIHtbbGxlbmd0aCAkYWN0aXZlXSA9PSAkbm1lcmdlIC0gMX0gewoJICAgICMgbm8gZGlmZiBmb3Igb25lIG9mIHRoZSBwYXJlbnRzLCBpLmUuIGl0J3MgaWRlbnRpY2FsCgkgICAgZm9yIHtzZXQgcG51bSAwfSB7JHBudW0gPCAkbm1lcmdlfSB7aW5jciBwbnVtfSB7CgkJaWYgeyFbaW5mbyBleGlzdHMgZGVsdGEoJHBudW0pXX0gewoJCSAgICBpZiB7JHBudW0gPCAkbWVyZ2VtYXh9IHsKCQkJbGFwcGVuZCBuY29sIG0kcG51bQoJCSAgICB9IGVsc2UgewoJCQlsYXBwZW5kIG5jb2wgbW1heAoJCSAgICB9CgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCX0gZWxzZWlmIHtbbGxlbmd0aCAkYWN0aXZlXSA9PSAkbm1lcmdlfSB7CgkgICAgIyBhbGwgcGFyZW50cyBhcmUgZGlmZmVyZW50LCBzZWUgaWYgb25lIGlzIHZlcnkgc2ltaWxhcgoJICAgIHNldCBiZXN0c2ltIDMwCgkgICAgZm9yIHtzZXQgcG51bSAwfSB7JHBudW0gPCAkbm1lcmdlfSB7aW5jciBwbnVtfSB7CgkJc2V0IHNpbSBbc2ltaWxhcml0eSAkcG51bSAkbCAkbmxjICRmIFwKCQkJICAgICBbbHJhbmdlICRldmVudHMgJGkgW2V4cHIgeyRqLTF9XV1dCgkJaWYgeyRzaW0gPiAkYmVzdHNpbX0gewoJCSAgICBzZXQgYmVzdHNpbSAkc2ltCgkJICAgIHNldCBiZXN0cG4gJHBudW0KCQl9CgkgICAgfQoJICAgIGlmIHskYmVzdHBuID49IDB9IHsKCQlsYXBwZW5kIG5jb2wgbSRiZXN0cG4KCSAgICB9Cgl9CglzZXQgcG51bSAtMQoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGluY3IgcG51bQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGRlbHRhKCRwbnVtKV0gfHwgJHBudW0gPT0gJGJlc3Rwbn0gY29udGludWUKCSAgICBzZXQgb2xjIFtleHByIHskbmxjICsgJGRlbHRhKCRwbnVtKX1dCgkgICAgc2V0IG9sIFtleHByIHskbCArICRkaWZmb2Zmc2V0KCRwKX1dCgkgICAgaW5jciBkaWZmb2Zmc2V0KCRwKSAkZGVsdGEoJHBudW0pCgkgICAgdW5zZXQgZGVsdGEoJHBudW0pCgkgICAgZm9yIHt9IHskb2xjID4gMH0ge2luY3Igb2xjIC0xfSB7CgkJJGN0ZXh0IGluc2VydCBlbmQgIi0kZmlsZWxpbmVzKCRwLCRmLCRvbClcbiIgbSRwbnVtCgkJaW5jciBvbAoJICAgIH0KCX0KCXNldCBlbmRsIFtleHByIHskbCArICRubGN9XQoJaWYgeyRiZXN0cG4gPj0gMH0gewoJICAgICMgc2hvdyB0aGlzIHByZXR0eSBtdWNoIGFzIGEgbm9ybWFsIGRpZmYKCSAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRpZCkgJGJlc3Rwbl0KCSAgICBzZXQgb2wgW2V4cHIgeyRsICsgJGRpZmZvZmZzZXQoJHApfV0KCSAgICBpbmNyIGRpZmZvZmZzZXQoJHApICRkZWx0YSgkYmVzdHBuKQoJICAgIHVuc2V0IGRlbHRhKCRiZXN0cG4pCgkgICAgZm9yIHtzZXQgayAkaX0geyRrIDwgJGp9IHtpbmNyIGt9IHsKCQlzZXQgZSBbbGluZGV4ICRldmVudHMgJGtdCgkJaWYge1tsaW5kZXggJGUgMl0gIT0gJGJlc3Rwbn0gY29udGludWUKCQlzZXQgbmwgW2xpbmRleCAkZSAwXQoJCXNldCBvbCBbZXhwciB7JG9sICsgJG5sIC0gJGx9XQoJCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCQkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiskZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIgJG5jb2wKCQl9CgkJc2V0IGMgW2xpbmRleCAkZSAzXQoJCWZvciB7fSB7JGMgPiAwfSB7aW5jciBjIC0xfSB7CgkJICAgICRjdGV4dCBpbnNlcnQgZW5kICItJGZpbGVsaW5lcygkcCwkZiwkb2wpXG4iIG0kYmVzdHBuCgkJICAgIGluY3Igb2wKCQl9CgkJc2V0IG5sIFtsaW5kZXggJGUgMV0KCQlmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iIG1yZXN1bHQKCQl9CgkgICAgfQoJfQoJZm9yIHt9IHskbCA8ICRlbmRsfSB7aW5jciBsfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiskZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIgJG5jb2wKCX0KICAgIH0KICAgIHdoaWxlIHskbCA8ICRncm91cGxpbmVlbmR9IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIgJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iCglpbmNyIGwKICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHNpbWlsYXJpdHkge3BudW0gbCBubGMgZiBldmVudHN9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBwYXJlbnRzIGRpZmZvZmZzZXQgZmlsZWxpbmVzCgogICAgc2V0IGlkICRkaWZmbWVyZ2VpZAogICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRwbnVtXQogICAgc2V0IG9sIFtleHByIHskbCArICRkaWZmb2Zmc2V0KCRwKX1dCiAgICBzZXQgZW5kbCBbZXhwciB7JGwgKyAkbmxjfV0KICAgIHNldCBzYW1lIDAKICAgIHNldCBkaWZmIDAKICAgIGZvcmVhY2ggZSAkZXZlbnRzIHsKCWlmIHtbbGluZGV4ICRlIDJdICE9ICRwbnVtfSBjb250aW51ZQoJc2V0IG5sIFtsaW5kZXggJGUgMF0KCXNldCBvbCBbZXhwciB7JG9sICsgJG5sIC0gJGx9XQoJZm9yIHt9IHskbCA8ICRubH0ge2luY3IgbH0gewoJICAgIGluY3Igc2FtZSBbc3RyaW5nIGxlbmd0aCAkZmlsZWxpbmVzKCRpZCwkZiwkbCldCgkgICAgaW5jciBzYW1lCgl9CglzZXQgb2MgW2xpbmRleCAkZSAzXQoJZm9yIHt9IHskb2MgPiAwfSB7aW5jciBvYyAtMX0gewoJICAgIGluY3IgZGlmZiBbc3RyaW5nIGxlbmd0aCAkZmlsZWxpbmVzKCRwLCRmLCRvbCldCgkgICAgaW5jciBkaWZmCgkgICAgaW5jciBvbAoJfQoJc2V0IG5sIFtsaW5kZXggJGUgMV0KCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCSAgICBpbmNyIGRpZmYgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkaWQsJGYsJGwpXQoJICAgIGluY3IgZGlmZgoJfQogICAgfQogICAgZm9yIHt9IHskbCA8ICRlbmRsfSB7aW5jciBsfSB7CglpbmNyIHNhbWUgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkaWQsJGYsJGwpXQoJaW5jciBzYW1lCiAgICB9CiAgICBpZiB7JHNhbWUgPT0gMH0gewoJcmV0dXJuIDAKICAgIH0KICAgIHJldHVybiBbZXhwciB7MjAwICogJHNhbWUgLyAoMiAqICRzYW1lICsgJGRpZmYpfV0KfQoKcHJvYyBzdGFydGRpZmYge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBkaWZmaWRzIHRyZWVwZW5kaW5nIGRpZmZtZXJnZWlkCgogICAgc2V0IGRpZmZpZHMgJGlkcwogICAgY2F0Y2gge3Vuc2V0IGRpZmZtZXJnZWlkfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRpZHMKCX0KICAgIH0gZWxzZSB7CglhZGR0b2NmbGlzdCAkaWRzCiAgICB9Cn0KCnByb2MgYWRkdG9jZmxpc3Qge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBjZmxpc3QKICAgIGZvcmVhY2ggZiAkdHJlZWRpZmZzKCRpZHMpIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZgogICAgfQogICAgZ2V0YmxvYmRpZmZzICRpZHMKfQoKcHJvYyBnZXR0cmVlZGlmZnMge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmIHBhcmVudHMgdHJlZXBlbmRpbmcKICAgIHNldCB0cmVlcGVuZGluZyAkaWRzCiAgICBzZXQgdHJlZWRpZmYge30KICAgIHNldCBpZCBbbGluZGV4ICRpZHMgMF0KICAgIGlmIFtjYXRjaCB7c2V0IGdkdGYgW29wZW4gInxnaXQtZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC1yICRpZCIgcl19XSByZXR1cm4KICAgIGZjb25maWd1cmUgJGdkdGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlZGlmZmxpbmUgJGdkdGYgJGlkc10KfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMgZGlmZm1lcmdlaWQKCiAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRnZHRmXX0gcmV0dXJuCgljbG9zZSAkZ2R0ZgoJc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKCXVuc2V0IHRyZWVwZW5kaW5nCglpZiB7JGlkcyAhPSAkZGlmZmlkc30gewoJICAgIGdldHRyZWVkaWZmcyAkZGlmZmlkcwoJfSBlbHNlIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXX0gewoJCWNvbnRtZXJnZWRpZmYgJGlkcwoJICAgIH0gZWxzZSB7CgkJYWRkdG9jZmxpc3QgJGlkcwoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgc2V0IGZpbGUgW2xpbmRleCAkbGluZSA1XQogICAgbGFwcGVuZCB0cmVlZGlmZiAkZmlsZQp9Cgpwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm9wdHMgYmxvYmRpZmZmZCBkaWZmaWRzIGVudiBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKCiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgZW52KEdJVF9ESUZGX09QVFMpICRkaWZmb3B0cwogICAgc2V0IGNtZCBbbGlzdCB8IGdpdC1kaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLXIgLXAgLUMgJGlkXQogICAgaWYge1tjYXRjaCB7c2V0IGJkZiBbb3BlbiAkY21kIHJdfSBlcnJdfSB7CglwdXRzICJlcnJvciBnZXR0aW5nIGRpZmZzOiAkZXJyIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgZGlmZmluaGRyIDAKICAgIGZjb25maWd1cmUgJGJkZiAtYmxvY2tpbmcgMAogICAgc2V0IGJsb2JkaWZmZmQoJGlkcykgJGJkZgogICAgc2V0IGN1cmRpZmZ0YWcgQ29tbWVudHMKICAgIHNldCBjdXJ0YWdzdGFydCAwLjAKICAgIGNhdGNoIHt1bnNldCBkaWZmZmlsZXN0YXJ0fQogICAgZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgW2xpc3QgZ2V0YmxvYmRpZmZsaW5lICRiZGYgJGRpZmZpZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCn0KCnByb2MgZ2V0YmxvYmRpZmZsaW5lIHtiZGYgaWRzfSB7CiAgICBnbG9iYWwgZGlmZmlkcyBibG9iZGlmZmZkIGN0ZXh0IGN1cmRpZmZ0YWcgY3VydGFnc3RhcnQKICAgIGdsb2JhbCBkaWZmbmV4dGhlYWQgZGlmZm5leHRub3RlIGRpZmZmaWxlc3RhcnQKICAgIGdsb2JhbCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKICAgIGdsb2JhbCBnYXVkeWRpZmYKCiAgICBzZXQgbiBbZ2V0cyAkYmRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkYmRmXX0gewoJICAgIGNsb3NlICRiZGYKCSAgICBpZiB7JGlkcyA9PSAkZGlmZmlkcyAmJiAkYmRmID09ICRibG9iZGlmZmZkKCRpZHMpfSB7CgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyRpZHMgIT0gJGRpZmZpZHMgfHwgJGJkZiAhPSAkYmxvYmRpZmZmZCgkaWRzKX0gewoJcmV0dXJuCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7W3JlZ2V4cCB7XmRpZmYgLS1naXQgYS8oLiopIGIvKC4qKX0gJGxpbmUgbWF0Y2ggZm5hbWUgbmV3bmFtZV19IHsKCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJc2V0IGN1cnRhZ3N0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCXNldCBoZWFkZXIgJG5ld25hbWUKCXNldCBoZXJlIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkdHJlZWRpZmZzKCRkaWZmaWRzKSAkZm5hbWVdCglpZiB7JGkgPj0gMH0gewoJICAgIHNldCBkaWZmZmlsZXN0YXJ0KCRpKSAkaGVyZQoJICAgIGluY3IgaQoJICAgICRjdGV4dCBtYXJrIHNldCBmbWFyay4kaSAkaGVyZQoJICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuJGkgbGVmdAoJfQoJaWYgeyRuZXduYW1lICE9ICRmbmFtZX0gewoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkdHJlZWRpZmZzKCRkaWZmaWRzKSAkbmV3bmFtZV0KCSAgICBpZiB7JGkgPj0gMH0gewoJCXNldCBkaWZmZmlsZXN0YXJ0KCRpKSAkaGVyZQoJCWluY3IgaQoJCSRjdGV4dCBtYXJrIHNldCBmbWFyay4kaSAkaGVyZQoJCSRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuJGkgbGVmdAoJICAgIH0KCX0KCXNldCBjdXJkaWZmdGFnICJmOiRmbmFtZSIKCSRjdGV4dCB0YWcgZGVsZXRlICRjdXJkaWZmdGFnCglzZXQgbCBbZXhwciB7KDc4IC0gW3N0cmluZyBsZW5ndGggJGhlYWRlcl0pIC8gMn1dCglzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCgkkY3RleHQgaW5zZXJ0IGVuZCAiJHBhZCAkaGVhZGVyICRwYWRcbiIgZmlsZXNlcAoJc2V0IGRpZmZpbmhkciAxCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XigtLS18XCtcK1wrKX0gJGxpbmVdfSB7CglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteQEAgLShbMC05XSspLChbMC05XSspIFwrKFswLTldKyksKFswLTldKykgQEAoLiopfSBcCgkJICAgJGxpbmUgbWF0Y2ggZjFsIGYxYyBmMmwgZjJjIHJlc3RdfSB7CglpZiB7JGdhdWR5ZGlmZn0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdCIgaHVua3NlcAoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgICAgJGYxbCAgICAiIGQwICIgICAgJGYybCAgICAiIGQxCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAgICAkcmVzdCBcbiIgaHVua3NlcAoJfSBlbHNlIHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgaHVua3NlcAoJfQoJc2V0IGRpZmZpbmhkciAwCiAgICB9IGVsc2UgewoJc2V0IHggW3N0cmluZyByYW5nZSAkbGluZSAwIDBdCglpZiB7JHggPT0gIi0iIHx8ICR4ID09ICIrIn0gewoJICAgIHNldCB0YWcgW2V4cHIgeyR4ID09ICIrIn1dCgkgICAgaWYgeyRnYXVkeWRpZmZ9IHsKCQlzZXQgbGluZSBbc3RyaW5nIHJhbmdlICRsaW5lIDEgZW5kXQoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZCR0YWcKCX0gZWxzZWlmIHskeCA9PSAiICJ9IHsKCSAgICBpZiB7JGdhdWR5ZGlmZn0gewoJCXNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMSBlbmRdCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgoJfSBlbHNlaWYgeyRkaWZmaW5oZHIgfHwgJHggPT0gIlxcIn0gewoJICAgICMgZS5nLiAiXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlIgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9IGVsc2UgewoJICAgICMgU29tZXRoaW5nIGVsc2Ugd2UgZG9uJ3QgcmVjb2duaXplCgkgICAgaWYgeyRjdXJkaWZmdGFnICE9ICJDb21tZW50cyJ9IHsKCQkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJCXNldCBjdXJ0YWdzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCgkJc2V0IGN1cmRpZmZ0YWcgQ29tbWVudHMKCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCWluY3IgbmV4dHVwZGF0ZSAxMDAKCWZpbGVldmVudCAkYmRmIHJlYWRhYmxlIHt9Cgl1cGRhdGUKCWZpbGVldmVudCAkYmRmIHJlYWRhYmxlICJnZXRibG9iZGlmZmxpbmUgJGJkZiB7JGlkc30iCiAgICB9Cn0KCnByb2MgbmV4dGZpbGUge30gewogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQgY3RleHQKICAgIHNldCBoZXJlIFskY3RleHQgaW5kZXggQDAsMF0KICAgIGZvciB7c2V0IGkgMH0ge1tpbmZvIGV4aXN0cyBkaWZmZmlsZXN0YXJ0KCRpKV19IHtpbmNyIGl9IHsKCWlmIHtbJGN0ZXh0IGNvbXBhcmUgJGRpZmZmaWxlc3RhcnQoJGkpID4gJGhlcmVdfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgcG9zXQoJCXx8IFskY3RleHQgY29tcGFyZSAkZGlmZmZpbGVzdGFydCgkaSkgPCAkcG9zXX0gewoJCXNldCBwb3MgJGRpZmZmaWxlc3RhcnQoJGkpCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBwb3NdfSB7CgkkY3RleHQgeXZpZXcgJHBvcwogICAgfQp9Cgpwcm9jIGxpc3Rib3hzZWwge30gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdCBjdXJyZW50aWQKICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRpZF19IHJldHVybgogICAgc2V0IHNlbCBbbHNvcnQgWyRjZmxpc3QgY3Vyc2VsZWN0aW9uXV0KICAgIGlmIHskc2VsIGVxIHt9fSByZXR1cm4KICAgIHNldCBmaXJzdCBbbGluZGV4ICRzZWwgMF0KICAgIGNhdGNoIHskY3RleHQgeXZpZXcgZm1hcmsuJGZpcnN0fQp9Cgpwcm9jIHNldGNvb3JkcyB7fSB7CiAgICBnbG9iYWwgbGluZXNwYyBjaGFyc3BjIGNhbnZ4MCBjYW52eTAgbWFpbmZvbnQKICAgIGdsb2JhbCB4c3BjMSB4c3BjMiBsdGhpY2tuZXNzCgogICAgc2V0IGxpbmVzcGMgW2ZvbnQgbWV0cmljcyAkbWFpbmZvbnQgLWxpbmVzcGFjZV0KICAgIHNldCBjaGFyc3BjIFtmb250IG1lYXN1cmUgJG1haW5mb250ICJtIl0KICAgIHNldCBjYW52eTAgW2V4cHIgMyArIDAuNSAqICRsaW5lc3BjXQogICAgc2V0IGNhbnZ4MCBbZXhwciAzICsgMC41ICogJGxpbmVzcGNdCiAgICBzZXQgbHRoaWNrbmVzcyBbZXhwciB7aW50KCRsaW5lc3BjIC8gOSkgKyAxfV0KICAgIHNldCB4c3BjMSgwKSAkbGluZXNwYwogICAgc2V0IHhzcGMyICRsaW5lc3BjCn0KCnByb2MgcmVkaXNwbGF5IHt9IHsKICAgIGdsb2JhbCBzdG9wcGVkIHJlZGlzcGxheWluZyBwaGFzZQogICAgaWYgeyRzdG9wcGVkID4gMX0gcmV0dXJuCiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIn0gcmV0dXJuCiAgICBzZXQgcmVkaXNwbGF5aW5nIDEKICAgIGlmIHskcGhhc2UgPT0gImRyYXdncmFwaCIgfHwgJHBoYXNlID09ICJpbmNyZHJhdyJ9IHsKCXNldCBzdG9wcGVkIDEKICAgIH0gZWxzZSB7CglkcmF3Z3JhcGgKICAgIH0KfQoKcHJvYyBpbmNyZm9udCB7aW5jfSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgbmFtZWZvbnQgdGV4dGZvbnQgY3RleHQgY2FudiBwaGFzZQogICAgZ2xvYmFsIHN0b3BwZWQgZW50cmllcwogICAgdW5tYXJrbWF0Y2hlcwogICAgc2V0IG1haW5mb250IFtscmVwbGFjZSAkbWFpbmZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRtYWluZm9udCAxXSArICRpbmN9XV0KICAgIHNldCBuYW1lZm9udCBbbHJlcGxhY2UgJG5hbWVmb250IDEgMSBbZXhwciB7W2xpbmRleCAkbmFtZWZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXQgdGV4dGZvbnQgW2xyZXBsYWNlICR0ZXh0Zm9udCAxIDEgW2V4cHIge1tsaW5kZXggJHRleHRmb250IDFdICsgJGluY31dXQogICAgc2V0Y29vcmRzCiAgICAkY3RleHQgY29uZiAtZm9udCAkdGV4dGZvbnQKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJJGUgY29uZiAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIGlmIHskcGhhc2UgPT0gImdldGNvbW1pdHMifSB7CgkkY2FudiBpdGVtY29uZiB0ZXh0aXRlbXMgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICByZWRpc3BsYXkKfQoKcHJvYyBjbGVhcnNoYTEge30gewogICAgZ2xvYmFsIHNoYTFlbnRyeSBzaGExc3RyaW5nCiAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNoYTFzdHJpbmddID09IDQwfSB7Cgkkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgfQp9Cgpwcm9jIHNoYTFjaGFuZ2Uge24xIG4yIG9wfSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgc2hhMWJ1dAogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHtbJHNoYTFidXQgY2dldCAtc3RhdGVdID09ICRzdGF0ZX0gcmV0dXJuCiAgICBpZiB7JHN0YXRlID09ICJub3JtYWwifSB7Cgkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBub3JtYWwgLXJlbGllZiByYWlzZWQgLXRleHQgIkdvdG86ICIKICAgIH0gZWxzZSB7Cgkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgLXRleHQgIlNIQTEgSUQ6ICIKICAgIH0KfQoKcHJvYyBnb3RvY29tbWl0IHt9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBpZGxpbmUgdGFnaWRzCiAgICBnbG9iYWwgbGluZWlkIG51bWNvbW1pdHMKCiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gcmV0dXJuCiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lkcygkc2hhMXN0cmluZyldfSB7CglzZXQgaWQgJHRhZ2lkcygkc2hhMXN0cmluZykKICAgIH0gZWxzZSB7CglzZXQgaWQgW3N0cmluZyB0b2xvd2VyICRzaGExc3RyaW5nXQoJaWYge1tyZWdleHAge15bMC05YS1mXXs0LDM5fSR9ICRpZF19IHsKCSAgICBzZXQgbWF0Y2hlcyB7fQoJICAgIGZvciB7c2V0IGwgMH0geyRsIDwgJG51bWNvbW1pdHN9IHtpbmNyIGx9IHsKCQlpZiB7W3N0cmluZyBtYXRjaCAkaWQqICRsaW5laWQoJGwpXX0gewoJCSAgICBsYXBwZW5kIG1hdGNoZXMgJGxpbmVpZCgkbCkKCQl9CgkgICAgfQoJICAgIGlmIHskbWF0Y2hlcyBuZSB7fX0gewoJCWlmIHtbbGxlbmd0aCAkbWF0Y2hlc10gPiAxfSB7CgkJICAgIGVycm9yX3BvcHVwICJTaG9ydCBTSEExIGlkICRpZCBpcyBhbWJpZ3VvdXMiCgkJICAgIHJldHVybgoJCX0KCQlzZXQgaWQgW2xpbmRleCAkbWF0Y2hlcyAwXQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglzZWxlY3RsaW5lICRpZGxpbmUoJGlkKSAxCglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteWzAtOWEtZkEtRl17NCx9JH0gJHNoYTFzdHJpbmddfSB7CglzZXQgdHlwZSAiU0hBMSBpZCIKICAgIH0gZWxzZSB7CglzZXQgdHlwZSAiVGFnIgogICAgfQogICAgZXJyb3JfcG9wdXAgIiR0eXBlICRzaGExc3RyaW5nIGlzIG5vdCBrbm93biIKfQoKcHJvYyBsaW5lZW50ZXIge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCiAgICBnbG9iYWwgY29tbWl0aW5mbyBjYW52CgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gcmV0dXJuCiAgICBzZXQgaG92ZXJ4ICR4CiAgICBzZXQgaG92ZXJ5ICR5CiAgICBzZXQgaG92ZXJpZCAkaWQKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCWFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgogICAgfQogICAgc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICAkY2FudiBkZWxldGUgaG92ZXIKfQoKcHJvYyBsaW5lbW90aW9uIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CglzZXQgaG92ZXJ4ICR4CglzZXQgaG92ZXJ5ICR5CglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgl9CglzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgIH0KfQoKcHJvYyBsaW5lbGVhdmUge2lkfSB7CiAgICBnbG9iYWwgaG92ZXJpZCBob3ZlcnRpbWVyIGNhbnYKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJJGNhbnYgZGVsZXRlIGhvdmVyCglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgkgICAgdW5zZXQgaG92ZXJ0aW1lcgoJfQoJdW5zZXQgaG92ZXJpZAogICAgfQp9Cgpwcm9jIGxpbmVob3ZlciB7fSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNvbW1pdGluZm8gbWFpbmZvbnQKCiAgICBzZXQgdGV4dCBbbGluZGV4ICRjb21taXRpbmZvKCRob3ZlcmlkKSAwXQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB4IFtleHByIHskaG92ZXJ4ICsgMiAqICRsaW5lc3BjfV0KICAgIHNldCB5IFtleHByIHskaG92ZXJ5ICsgJHlmcmFjICogJHltYXggLSAkbGluZXNwYyAvIDJ9XQogICAgc2V0IHgwIFtleHByIHskeCAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTAgW2V4cHIgeyR5IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB4MSBbZXhwciB7JHggKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGV4dF0gKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkxIFtleHByIHskeSArICRsaW5lc3BjICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdGFuZ2xlICR4MCAkeTAgJHgxICR5MSBcCgkgICAgICAgLWZpbGwgXCNmZmZmODAgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDEgLXRhZ3MgaG92ZXJdCiAgICAkY2FudiByYWlzZSAkdAogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4ICR5IC1hbmNob3IgbncgLXRleHQgJHRleHQgLXRhZ3MgaG92ZXIgLWZvbnQgJG1haW5mb250XQogICAgJGNhbnYgcmFpc2UgJHQKfQoKcHJvYyBjbGlja2lzb25hcnJvdyB7aWQgeX0gewogICAgZ2xvYmFsIG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzIGx0aGlja25lc3MKCiAgICBzZXQgdGhyZXNoIFtleHByIHsyICogJGx0aGlja25lc3MgKyA2fV0KICAgIGlmIHtbaW5mbyBleGlzdHMgbWFpbmxpbmUoJGlkKV19IHsKCWlmIHskbWFpbmxpbmVhcnJvdygkaWQpIG5lICJub25lIn0gewoJICAgIGlmIHthYnMoW2xpbmRleCAkbWFpbmxpbmUoJGlkKSAxXSAtICR5KSA8ICR0aHJlc2h9IHsKCQlyZXR1cm4gInVwIgoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7Cglmb3JlYWNoIGxzICRzaWRlbGluZXMoJGlkKSB7CgkgICAgc2V0IGNvb3JkcyBbbGluZGV4ICRscyAwXQoJICAgIHNldCBhcnJvdyBbbGluZGV4ICRscyAyXQoJICAgIGlmIHskYXJyb3cgZXEgImZpcnN0IiB8fCAkYXJyb3cgZXEgImJvdGgifSB7CgkJaWYge2FicyhbbGluZGV4ICRjb29yZHMgMV0gLSAkeSkgPCAkdGhyZXNofSB7CgkJICAgIHJldHVybiAidXAiCgkJfQoJICAgIH0KCSAgICBpZiB7JGFycm93IGVxICJsYXN0IiB8fCAkYXJyb3cgZXEgImJvdGgifSB7CgkJaWYge2FicyhbbGluZGV4ICRjb29yZHMgZW5kXSAtICR5KSA8ICR0aHJlc2h9IHsKCQkgICAgcmV0dXJuICJkb3duIgoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4ge30KfQoKcHJvYyBhcnJvd2p1bXAge2lkIGRpcm4geX0gewogICAgZ2xvYmFsIG1haW5saW5lIHNpZGVsaW5lcyBjYW52IGNhbnYyIGNhbnYzCgogICAgc2V0IHl0IHt9CiAgICBpZiB7JGRpcm4gZXEgImRvd24ifSB7CglpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CgkgICAgc2V0IHkxIFtsaW5kZXggJG1haW5saW5lKCRpZCkgMV0KCSAgICBpZiB7JHkxID4gJHl9IHsKCQlzZXQgeXQgJHkxCgkgICAgfQoJfQoJaWYge1tpbmZvIGV4aXN0cyBzaWRlbGluZXMoJGlkKV19IHsKCSAgICBmb3JlYWNoIGxzICRzaWRlbGluZXMoJGlkKSB7CgkJc2V0IHkxIFtsaW5kZXggJGxzIDAgMV0KCQlpZiB7JHkxID4gJHkgJiYgKCR5dCBlcSB7fSB8fCAkeTEgPCAkeXQpfSB7CgkJICAgIHNldCB5dCAkeTEKCQl9CgkgICAgfQoJfQogICAgfSBlbHNlIHsKCWlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7CgkgICAgZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJCXNldCB5MSBbbGluZGV4ICRscyAwIGVuZF0KCQlpZiB7JHkxIDwgJHkgJiYgKCR5dCBlcSB7fSB8fCAkeTEgPiAkeXQpfSB7CgkJICAgIHNldCB5dCAkeTEKCQl9CgkgICAgfQoJfQogICAgfQogICAgaWYgeyR5dCBlcSB7fX0gcmV0dXJuCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPD0gMH0gcmV0dXJuCiAgICBzZXQgdmlldyBbJGNhbnYgeXZpZXddCiAgICBzZXQgeXNwYW4gW2V4cHIge1tsaW5kZXggJHZpZXcgMV0gLSBbbGluZGV4ICR2aWV3IDBdfV0KICAgIHNldCB5ZnJhYyBbZXhwciB7JHl0IC8gJHltYXggLSAkeXNwYW4gLyAyfV0KICAgIGlmIHskeWZyYWMgPCAwfSB7CglzZXQgeWZyYWMgMAogICAgfQogICAgJGNhbnYgeXZpZXcgbW92ZXRvICR5ZnJhYwogICAgJGNhbnYyIHl2aWV3IG1vdmV0byAkeWZyYWMKICAgICRjYW52MyB5dmlldyBtb3ZldG8gJHlmcmFjCn0KCnByb2MgbGluZWNsaWNrIHt4IHkgaWQgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRpbmZvIGNoaWxkcmVuIGNmbGlzdCBjYW52IHRoaWNrZXJsaW5lCgogICAgdW5tYXJrbWF0Y2hlcwogICAgdW5zZWxlY3RsaW5lCiAgICBub3JtYWxsaW5lCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgICMgZHJhdyB0aGlzIGxpbmUgdGhpY2tlciB0aGFuIG5vcm1hbAogICAgZHJhd2xpbmVzICRpZCAxIDEKICAgIHNldCB0aGlja2VybGluZSAkaWQKICAgIGlmIHskaXNuZXd9IHsKCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCWlmIHskeW1heCBlcSB7fX0gcmV0dXJuCglzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCglzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCiAgICB9CiAgICBzZXQgZGlybiBbY2xpY2tpc29uYXJyb3cgJGlkICR5XQogICAgaWYgeyRkaXJuIG5lIHt9fSB7CglhcnJvd2p1bXAgJGlkICRkaXJuICR5CglyZXR1cm4KICAgIH0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3QgbGluZWNsaWNrICR4ICR5ICRpZCAwXQogICAgfQogICAgIyBmaWxsIHRoZSBkZXRhaWxzIHBhbmUgd2l0aCBpbmZvIGFib3V0IHRoaXMgbGluZQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50Olx0IgogICAgJGN0ZXh0IGluc2VydCBlbmQgJGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJGlkXQogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0RGF0ZTpcdCRkYXRlXG4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGNoaWxkcmVuKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5DaGlsZHJlbjoiCglzZXQgaSAwCglmb3JlYWNoIGNoaWxkICRjaGlsZHJlbigkaWQpIHsKCSAgICBpbmNyIGkKCSAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkY2hpbGQpCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHQiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgJGNoaWxkIFtsaXN0IGxpbmsgbGluayRpXQoJICAgICRjdGV4dCB0YWcgYmluZCBsaW5rJGkgPDE+IFtsaXN0IHNlbGJ5aWQgJGNoaWxkXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV0iCgkgICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdERhdGU6XHQkZGF0ZVxuIgoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCgogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKfQoKcHJvYyBub3JtYWxsaW5lIHt9IHsKICAgIGdsb2JhbCB0aGlja2VybGluZQogICAgaWYge1tpbmZvIGV4aXN0cyB0aGlja2VybGluZV19IHsKCWRyYXdsaW5lcyAkdGhpY2tlcmxpbmUgMCAxCgl1bnNldCB0aGlja2VybGluZQogICAgfQp9Cgpwcm9jIHNlbGJ5aWQge2lkfSB7CiAgICBnbG9iYWwgaWRsaW5lCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gewoJc2VsZWN0bGluZSAkaWRsaW5lKCRpZCkgMQogICAgfQp9Cgpwcm9jIG1zdGltZSB7fSB7CiAgICBnbG9iYWwgc3RhcnRtc3RpbWUKICAgIGlmIHshW2luZm8gZXhpc3RzIHN0YXJ0bXN0aW1lXX0gewoJc2V0IHN0YXJ0bXN0aW1lIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIH0KICAgIHJldHVybiBbZm9ybWF0ICIlLjNmIiBbZXhwciB7KFtjbG9jayBjbGljayAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zdGltZSkgLyAxMDAwLjB9XV0KfQoKcHJvYyByb3dtZW51IHt4IHkgaWR9IHsKICAgIGdsb2JhbCByb3djdHhtZW51IGlkbGluZSBzZWxlY3RlZGxpbmUgcm93bWVudWlkCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSB8fCAkaWRsaW5lKCRpZCkgZXEgJHNlbGVjdGVkbGluZX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMCAtc3RhdGUgJHN0YXRlCiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAxIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDIgLXN0YXRlICRzdGF0ZQogICAgc2V0IHJvd21lbnVpZCAkaWQKICAgIHRrX3BvcHVwICRyb3djdHhtZW51ICR4ICR5Cn0KCnByb2MgZGlmZnZzc2VsIHtkaXJufSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHNlbGVjdGVkbGluZSBsaW5laWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGlmIHskZGlybn0gewoJc2V0IG9sZGlkICRsaW5laWQoJHNlbGVjdGVkbGluZSkKCXNldCBuZXdpZCAkcm93bWVudWlkCiAgICB9IGVsc2UgewoJc2V0IG9sZGlkICRyb3dtZW51aWQKCXNldCBuZXdpZCAkbGluZWlkKCRzZWxlY3RlZGxpbmUpCiAgICB9CiAgICBhZGR0b2hpc3RvcnkgW2xpc3QgZG9zZWxkaWZmICRvbGRpZCAkbmV3aWRdCiAgICBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZAp9Cgpwcm9jIGRvc2VsZGlmZiB7b2xkaWQgbmV3aWR9IHsKICAgIGdsb2JhbCBjdGV4dCBjZmxpc3QKICAgIGdsb2JhbCBjb21taXRpbmZvCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuMCAwLjAKICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuMCBsZWZ0CiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAogICAgJGNmbGlzdCBpbnNlcnQgZW5kICJUb3AiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiRnJvbSAiCiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJG9sZGlkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG9sZGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXG5UbyAgICIKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMSA8MT4gW2xpc3Qgc2VsYnlpZCAkbmV3aWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkbmV3aWQgW2xpc3QgbGluayBsaW5rMV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBzdGFydGRpZmYgW2xpc3QgJG5ld2lkICRvbGRpZF0KfQoKcHJvYyBta3BhdGNoIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgY3VycmVudGlkIGNvbW1pdGluZm8gcGF0Y2h0b3AgcGF0Y2hudW0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBvbGRpZCAkY3VycmVudGlkCiAgICBzZXQgb2xkaGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgIHNldCBuZXdpZCAkcm93bWVudWlkCiAgICBzZXQgbmV3aGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgIHNldCB0b3AgLnBhdGNoCiAgICBzZXQgcGF0Y2h0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkdlbmVyYXRlIHBhdGNoIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZnJvbSAtdGV4dCAiRnJvbToiCiAgICBlbnRyeSAkdG9wLmZyb21zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbXNoYTEgaW5zZXJ0IDAgJG9sZGlkCiAgICAkdG9wLmZyb21zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuZnJvbSAkdG9wLmZyb21zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5mcm9taGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21oZWFkIGluc2VydCAwICRvbGRoZWFkCiAgICAkdG9wLmZyb21oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5mcm9taGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudG8gLXRleHQgIlRvOiIKICAgIGVudHJ5ICR0b3AudG9zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9zaGExIGluc2VydCAwICRuZXdpZAogICAgJHRvcC50b3NoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC50byAkdG9wLnRvc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AudG9oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9oZWFkIGluc2VydCAwICRuZXdoZWFkCiAgICAkdG9wLnRvaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AudG9oZWFkIC1zdGlja3kgdwogICAgYnV0dG9uICR0b3AucmV2IC10ZXh0ICJSZXZlcnNlIiAtY29tbWFuZCBta3BhdGNocmV2IC1wYWR4IDUKICAgIGdyaWQgJHRvcC5yZXYgeCAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgInBhdGNoJHBhdGNobnVtLnBhdGNoIl0KICAgIGluY3IgcGF0Y2hudW0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJHZW5lcmF0ZSIgLWNvbW1hbmQgbWtwYXRjaGdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3BhdGNoY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyBta3BhdGNocmV2IHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBvbGRoZWFkIFskcGF0Y2h0b3AuZnJvbWhlYWQgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBuZXdoZWFkIFskcGF0Y2h0b3AudG9oZWFkIGdldF0KICAgIGZvcmVhY2ggZSBbbGlzdCBmcm9tc2hhMSBmcm9taGVhZCB0b3NoYTEgdG9oZWFkXSBcCgkgICAgdiBbbGlzdCAkbmV3aWQgJG5ld2hlYWQgJG9sZGlkICRvbGRoZWFkXSB7CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgbm9ybWFsCgkkcGF0Y2h0b3AuJGUgZGVsZXRlIDAgZW5kCgkkcGF0Y2h0b3AuJGUgaW5zZXJ0IDAgJHYKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgfQp9Cgpwcm9jIG1rcGF0Y2hnbyB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IGZuYW1lIFskcGF0Y2h0b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQtZGlmZi10cmVlIC1wICRvbGRpZCAkbmV3aWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgcGF0Y2g6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rcGF0Y2hjYW4ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3RhZyB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIG1rdGFndG9wIGNvbW1pdGluZm8KCiAgICBzZXQgdG9wIC5tYWtldGFnCiAgICBzZXQgbWt0YWd0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSB0YWciCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudGxhYiAtdGV4dCAiVGFnIG5hbWU6IgogICAgZW50cnkgJHRvcC50YWcgLXdpZHRoIDYwCiAgICBncmlkICR0b3AudGxhYiAkdG9wLnRhZyAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgbWt0YWdnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWt0YWdjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC50YWcKfQoKcHJvYyBkb21rdGFnIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcCBlbnYgdGFnaWRzIGlkdGFncwoKICAgIHNldCBpZCBbJG1rdGFndG9wLnNoYTEgZ2V0XQogICAgc2V0IHRhZyBbJG1rdGFndG9wLnRhZyBnZXRdCiAgICBpZiB7JHRhZyA9PSB7fX0gewoJZXJyb3JfcG9wdXAgIk5vIHRhZyBuYW1lIHNwZWNpZmllZCIKCXJldHVybgogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHRhZyldfSB7CgllcnJvcl9wb3B1cCAiVGFnIFwiJHRhZ1wiIGFscmVhZHkgZXhpc3RzIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBkaXIgW2dpdGRpcl0KCXNldCBmbmFtZSBbZmlsZSBqb2luICRkaXIgInJlZnMvdGFncyIgJHRhZ10KCXNldCBmIFtvcGVuICRmbmFtZSB3XQoJcHV0cyAkZiAkaWQKCWNsb3NlICRmCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyB0YWc6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgdGFnaWRzKCR0YWcpICRpZAogICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkdGFnCiAgICByZWRyYXd0YWdzICRpZAp9Cgpwcm9jIHJlZHJhd3RhZ3Mge2lkfSB7CiAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBpZGxpbmUgaWRwb3Mgc2VsZWN0ZWRsaW5lCgogICAgaWYgeyFbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSB0YWcuJGlkCiAgICBzZXQgeHQgW2V2YWwgZHJhd3RhZ3MgJGlkICRpZHBvcygkaWQpXQogICAgJGNhbnYgY29vcmRzICRsaW5laHRhZygkaWRsaW5lKCRpZCkpICR4dCBbbGluZGV4ICRpZHBvcygkaWQpIDJdCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgJHNlbGVjdGVkbGluZSA9PSAkaWRsaW5lKCRpZCl9IHsKCXNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCiAgICB9Cn0KCnByb2MgbWt0YWdjYW4ge30gewogICAgZ2xvYmFsIG1rdGFndG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJG1rdGFndG9wfQogICAgdW5zZXQgbWt0YWd0b3AKfQoKcHJvYyBta3RhZ2dvIHt9IHsKICAgIGRvbWt0YWcKICAgIG1rdGFnY2FuCn0KCnByb2Mgd3JpdGVjb21taXQge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCB3cmNvbXRvcCBjb21taXRpbmZvIHdyY29tY21kCgogICAgc2V0IHRvcCAud3JpdGVjb21taXQKICAgIHNldCB3cmNvbXRvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuY2xhYiAtdGV4dCAiQ29tbWFuZDoiCiAgICBlbnRyeSAkdG9wLmNtZCAtd2lkdGggNjAgLXRleHR2YXJpYWJsZSB3cmNvbWNtZAogICAgZ3JpZCAkdG9wLmNsYWIgJHRvcC5jbWQgLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKICAgIGVudHJ5ICR0b3AuZm5hbWUgLXdpZHRoIDYwCiAgICAkdG9wLmZuYW1lIGluc2VydCAwIFtmaWxlIG5vcm1hbGl6ZSAiY29tbWl0LVtzdHJpbmcgcmFuZ2UgJHJvd21lbnVpZCAwIDZdIl0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJXcml0ZSIgLWNvbW1hbmQgd3Jjb21nbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgd3Jjb21jYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5mbmFtZQp9Cgpwcm9jIHdyY29tZ28ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgc2V0IGlkIFskd3Jjb210b3Auc2hhMSBnZXRdCiAgICBzZXQgY21kICJlY2hvICRpZCB8IFskd3Jjb210b3AuY21kIGdldF0iCiAgICBzZXQgZm5hbWUgWyR3cmNvbXRvcC5mbmFtZSBnZXRdCiAgICBpZiB7W2NhdGNoIHtleGVjIHNoIC1jICRjbWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igd3JpdGluZyBjb21taXQ6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIHdyY29tY2FuIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2MgbGlzdHJlZnMge2lkfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKCiAgICBzZXQgeCB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCB4ICRpZHRhZ3MoJGlkKQogICAgfQogICAgc2V0IHkge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IHkgJGlkaGVhZHMoJGlkKQogICAgfQogICAgc2V0IHoge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB6ICRpZG90aGVycmVmcygkaWQpCiAgICB9CiAgICByZXR1cm4gW2xpc3QgJHggJHkgJHpdCn0KCnByb2MgcmVyZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCB0YWdpZHMgaGVhZGlkcyBvdGhlcnJlZmlkcwoKICAgIHNldCByZWZpZHMgW2NvbmNhdCBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCgkJICAgIFthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXX0gewoJICAgIHNldCByZWYoJGlkKSBbbGlzdHJlZnMgJGlkXQoJfQogICAgfQogICAgZm9yZWFjaCB2IHt0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyBvdGhlcnJlZmlkcyBpZG90aGVycmVmc30gewoJY2F0Y2gge3Vuc2V0ICR2fQogICAgfQogICAgcmVhZHJlZnMKICAgIHNldCByZWZpZHMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkcmVmaWRzIFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkJW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCXNldCB2IFtsaXN0cmVmcyAkaWRdCglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV0gfHwgJHJlZigkaWQpICE9ICR2fSB7CgkgICAgcmVkcmF3dGFncyAkaWQKCX0KICAgIH0KfQoKcHJvYyBzaG93dGFnIHt0YWcgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCBjZmxpc3QgdGFnY29udGVudHMgdGFnaWRzIGxpbmtudW0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3Qgc2hvd3RhZyAkdGFnIDBdCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgIHNldCBsaW5rbnVtIDAKICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnY29udGVudHMoJHRhZyldfSB7CglzZXQgdGV4dCAkdGFnY29udGVudHMoJHRhZykKICAgIH0gZWxzZSB7CglzZXQgdGV4dCAiVGFnOiAkdGFnXG5JZDogICR0YWdpZHMoJHRhZykiCiAgICB9CiAgICBhcHBlbmR3aXRobGlua3MgJHRleHQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKfQoKcHJvYyBkb3F1aXQge30gewogICAgZ2xvYmFsIHN0b3BwZWQKICAgIHNldCBzdG9wcGVkIDEwMAogICAgZGVzdHJveSAuCn0KCnByb2MgZm9ybWF0ZGF0ZSB7ZH0gewogICAgZ2xvYmFsIGhvdXJzIG5ob3VycyB0ZmQgZmFzdGRhdGUKCiAgICBpZiB7ISRmYXN0ZGF0ZX0gewoJcmV0dXJuIFtjbG9jayBmb3JtYXQgJGQgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQogICAgfQogICAgc2V0IGhyIFtleHByIHskZCAvIDM2MDB9XQogICAgc2V0IG1zIFtleHByIHskZCAlIDM2MDB9XQogICAgaWYgeyFbaW5mbyBleGlzdHMgaG91cnMoJGhyKV19IHsKCXNldCBob3VycygkaHIpIFtjbG9jayBmb3JtYXQgJGQgLWZvcm1hdCAiJVktJW0tJWQgJUgiXQoJc2V0IG5ob3VycygkaHIpIDAKICAgIH0KICAgIGluY3IgbmhvdXJzKCRocikKICAgIHNldCBtaW5zZWMgW2Zvcm1hdCAiJS4yZDolLjJkIiBbZXhwciB7JG1zLzYwfV0gW2V4cHIgeyRtcyU2MH1dXQogICAgcmV0dXJuICIkaG91cnMoJGhyKTokbWluc2VjIgp9CgojIGRlZmF1bHRzLi4uCnNldCBkYXRlbW9kZSAwCnNldCBib2xkbmFtZXMgMApzZXQgZGlmZm9wdHMgIi1VIDUgLXAiCnNldCB3cmNvbWNtZCAiZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC1wIC0tcHJldHR5IgoKc2V0IG1haW5mb250IHtIZWx2ZXRpY2EgOX0Kc2V0IHRleHRmb250IHtDb3VyaWVyIDl9CnNldCBmaW5kbWVyZ2VmaWxlcyAwCnNldCBnYXVkeWRpZmYgMApzZXQgbWF4Z3JhcGhwY3QgNTAKc2V0IG1heHdpZHRoIDE2CnNldCByZXZsaXN0b3JkZXIgMApzZXQgZmFzdGRhdGUgMAoKc2V0IGNvbG9ycyB7Z3JlZW4gcmVkIGJsdWUgbWFnZW50YSBkYXJrZ3JleSBicm93biBvcmFuZ2V9CgpjYXRjaCB7c291cmNlIH4vLmdpdGt9CgpzZXQgbmFtZWZvbnQgJG1haW5mb250CmlmIHskYm9sZG5hbWVzfSB7CiAgICBsYXBwZW5kIG5hbWVmb250IGJvbGQKfQoKc2V0IHJldnRyZWVhcmdzIHt9CmZvcmVhY2ggYXJnICRhcmd2IHsKICAgIHN3aXRjaCAtcmVnZXhwIC0tICRhcmcgewoJIl4kIiB7IH0KCSJeLWIiIHsgc2V0IGJvbGRuYW1lcyAxIH0KCSJeLWQiIHsgc2V0IGRhdGVtb2RlIDEgfQoJIl4tciIgeyBzZXQgcmV2bGlzdG9yZGVyIDEgfQoJZGVmYXVsdCB7CgkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCgl9CiAgICB9Cn0KCnNldCBoaXN0b3J5IHt9CnNldCBoaXN0b3J5aW5kZXggMAoKc2V0IHN0b3BwZWQgMApzZXQgcmVkaXNwbGF5aW5nIDAKc2V0IHN0dWZmc2F2ZWQgMApzZXQgcGF0Y2hudW0gMApzZXRjb29yZHMKbWFrZXdpbmRvdwpyZWFkcmVmcwpnZXRjb21taXRzICRyZXZ0cmVlYXJncwo=