IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgaXQgbWF5IGJlIHVzZWQsIGNvcGllZCwgbW9kaWZpZWQKIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwKIyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKcHJvYyBnaXRkaXIge30gewogICAgZ2xvYmFsIGVudgogICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoR0lUX0RJUildfSB7CglyZXR1cm4gJGVudihHSVRfRElSKQogICAgfSBlbHNlIHsKCXJldHVybiAiLmdpdCIKICAgIH0KfQoKcHJvYyBwYXJzZV9hcmdzIHtyYXJnc30gewogICAgZ2xvYmFsIHBhcnNlZF9hcmdzCgogICAgaWYge1tjYXRjaCB7CglzZXQgcGFyc2VfYXJncyBbY29uY2F0IC0tZGVmYXVsdCBIRUFEICRyYXJnc10KCXNldCBwYXJzZWRfYXJncyBbc3BsaXQgW2V2YWwgZXhlYyBnaXQtcmV2LXBhcnNlICRwYXJzZV9hcmdzXSAiXG4iXQogICAgfV19IHsKCSMgaWYgZ2l0LXJldi1wYXJzZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLi4uCglpZiB7JHJhcmdzID09IHt9fSB7CgkgICAgc2V0IHJhcmdzIEhFQUQKCX0KCXNldCBwYXJzZWRfYXJncyAkcmFyZ3MKICAgIH0KICAgIHJldHVybiAkcGFyc2VkX2FyZ3MKfQoKcHJvYyBzdGFydF9yZXZfbGlzdCB7cmxhcmdzfSB7CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlIG5jbXVwZGF0ZQogICAgZ2xvYmFsIGNvbW1mZCBsZWZ0b3ZlciB0Y2xlbmNvZGluZwoKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHskc3RhcnRtc2VjcyArIDEwMH1dCiAgICBzZXQgbmNtdXBkYXRlIDEKICAgIGlmIHtbY2F0Y2ggewoJc2V0IGNvbW1mZCBbb3BlbiBbY29uY2F0IHwgZ2l0LXJldi1saXN0IC0taGVhZGVyIC0tdG9wby1vcmRlciBcCgkJCSAgICAgIC0tcGFyZW50cyAkcmxhcmdzXSByXQogICAgfSBlcnJdfSB7CglwdXRzIHN0ZGVyciAiRXJyb3IgZXhlY3V0aW5nIGdpdC1yZXYtbGlzdDogJGVyciIKCWV4aXQgMQogICAgfQogICAgc2V0IGxlZnRvdmVyIHt9CiAgICBmY29uZmlndXJlICRjb21tZmQgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGxmCiAgICBpZiB7JHRjbGVuY29kaW5nICE9IHt9fSB7CglmY29uZmlndXJlICRjb21tZmQgLWVuY29kaW5nICR0Y2xlbmNvZGluZwogICAgfQogICAgZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUgW2xpc3QgZ2V0Y29tbWl0bGluZXMgJGNvbW1mZF0KICAgIC4gY29uZmlnIC1jdXJzb3Igd2F0Y2gKICAgIHNldHRleHRjdXJzb3Igd2F0Y2gKfQoKcHJvYyBnZXRjb21taXRzIHtyYXJnc30gewogICAgZ2xvYmFsIG9sZGNvbW1pdHMgY29tbWl0cyBwaGFzZSBjYW52IG1haW5mb250IGVudgoKICAgICMgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhIC5naXQgZGlyZWN0b3J5IHNvbWV3aGVyZS4uLgogICAgc2V0IGdpdGRpciBbZ2l0ZGlyXQogICAgaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSAkZ2l0ZGlyXX0gewoJZXJyb3JfcG9wdXAgIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5IFwiJGdpdGRpclwiLiIKCWV4aXQgMQogICAgfQogICAgc2V0IG9sZGNvbW1pdHMge30KICAgIHNldCBjb21taXRzIHt9CiAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwogICAgc3RhcnRfcmV2X2xpc3QgW3BhcnNlX2FyZ3MgJHJhcmdzXQogICAgJGNhbnYgZGVsZXRlIGFsbAogICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIlJlYWRpbmcgY29tbWl0cy4uLiIgXAoJLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwp9Cgpwcm9jIGdldGNvbW1pdGxpbmVzIHtjb21tZmR9ICB7CiAgICBnbG9iYWwgb2xkY29tbWl0cyBjb21taXRzIHBhcmVudHMgY2RhdGUgY2hpbGRyZW4gbmNoaWxkcmVuCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBoYXNlIG5leHR1cGRhdGUKICAgIGdsb2JhbCBzdG9wcGVkIHJlZGlzcGxheWluZyBsZWZ0b3ZlcgogICAgZ2xvYmFsIGNhbnYKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGNvbW1mZF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkY29tbWZkXX0gcmV0dXJuCgkjIHNldCBpdCBibG9ja2luZyBzbyB3ZSB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byB0ZXJtaW5hdGUKCWZjb25maWd1cmUgJGNvbW1mZCAtYmxvY2tpbmcgMQoJaWYgeyFbY2F0Y2gge2Nsb3NlICRjb21tZmR9IGVycl19IHsKCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKCSAgICByZXR1cm4KCX0KCWlmIHtbc3RyaW5nIHJhbmdlICRlcnIgMCA0XSA9PSAidXNhZ2UifSB7CgkgICAgc2V0IGVyciBcCgkJIkdpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0czogYmFkIGFyZ3VtZW50cyB0byBnaXQtcmV2LWxpc3QuXAoJCShOb3RlOiBhcmd1bWVudHMgdG8gZ2l0ayBhcmUgcGFzc2VkIHRvIGdpdC1yZXYtbGlzdFwKCQl0byBhbGxvdyBzZWxlY3Rpb24gb2YgY29tbWl0cyB0byBiZSBkaXNwbGF5ZWQuKSIKCX0gZWxzZSB7CgkgICAgc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzOiAkZXJyIgoJfQoJZXJyb3JfcG9wdXAgJGVycgoJZXhpdCAxCiAgICB9CiAgICBzZXQgc3RhcnQgMAogICAgd2hpbGUgMSB7CglzZXQgaSBbc3RyaW5nIGZpcnN0ICJcMCIgJHN0dWZmICRzdGFydF0KCWlmIHskaSA8IDB9IHsKCSAgICBhcHBlbmQgbGVmdG92ZXIgW3N0cmluZyByYW5nZSAkc3R1ZmYgJHN0YXJ0IGVuZF0KCSAgICByZXR1cm4KCX0KCXNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJHN0dWZmICRzdGFydCBbZXhwciB7JGkgLSAxfV1dCglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAiJGxlZnRvdmVyJGNtaXQiCgkgICAgc2V0IGxlZnRvdmVyIHt9Cgl9CglzZXQgc3RhcnQgW2V4cHIgeyRpICsgMX1dCglzZXQgaiBbc3RyaW5nIGZpcnN0ICJcbiIgJGNtaXRdCglzZXQgb2sgMAoJaWYgeyRqID49IDB9IHsKCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCgkgICAgc2V0IG9rIDEKCSAgICBmb3JlYWNoIGlkICRpZHMgewoJCWlmIHshW3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQtcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCgkgICAgZXhpdCAxCgl9CglzZXQgaWQgW2xpbmRleCAkaWRzIDBdCglzZXQgb2xkcyBbbHJhbmdlICRpZHMgMSBlbmRdCglzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRjbWl0IFtleHByIHskaiArIDF9XSBlbmRdCglsYXBwZW5kIGNvbW1pdHMgJGlkCglzZXQgY29tbWl0bGlzdGVkKCRpZCkgMQoJcGFyc2Vjb21taXQgJGlkICRjbWl0IDEgW2xyYW5nZSAkaWRzIDEgZW5kXQoJZHJhd2NvbW1pdCAkaWQgMQoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCSAgICBkb3VwZGF0ZSAxCgl9Cgl3aGlsZSB7JHJlZGlzcGxheWluZ30gewoJICAgIHNldCByZWRpc3BsYXlpbmcgMAoJICAgIGlmIHskc3RvcHBlZCA9PSAxfSB7CgkJc2V0IHN0b3BwZWQgMAoJCXNldCBwaGFzZSAiZ2V0Y29tbWl0cyIKCQlmb3JlYWNoIGlkICRjb21taXRzIHsKCQkgICAgZHJhd2NvbW1pdCAkaWQgMQoJCSAgICBpZiB7JHN0b3BwZWR9IGJyZWFrCgkJICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CgkJCWRvdXBkYXRlIDEKCQkgICAgfQoJCX0KCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZG91cGRhdGUge3JlYWRpbmd9IHsKICAgIGdsb2JhbCBjb21tZmQgbmV4dHVwZGF0ZSBudW1jb21taXRzIG5jbXVwZGF0ZQoKICAgIGlmIHskcmVhZGluZ30gewoJZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUge30KICAgIH0KICAgIHVwZGF0ZQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQogICAgaWYgeyRudW1jb21taXRzIDwgMTAwfSB7CglzZXQgbmNtdXBkYXRlIFtleHByIHskbnVtY29tbWl0cyArIDF9XQogICAgfSBlbHNlaWYgeyRudW1jb21taXRzIDwgMTAwMDB9IHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMTB9XQogICAgfSBlbHNlIHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMTAwfV0KICAgIH0KICAgIGlmIHskcmVhZGluZ30gewoJZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUgW2xpc3QgZ2V0Y29tbWl0bGluZXMgJGNvbW1mZF0KICAgIH0KfQoKcHJvYyByZWFkY29tbWl0IHtpZH0gewogICAgaWYge1tjYXRjaCB7c2V0IGNvbnRlbnRzIFtleGVjIGdpdC1jYXQtZmlsZSBjb21taXQgJGlkXX1dfSByZXR1cm4KICAgIHBhcnNlY29tbWl0ICRpZCAkY29udGVudHMgMCB7fQp9Cgpwcm9jIHVwZGF0ZWNvbW1pdHMge3JhcmdzfSB7CiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIGNvbW1mZCBwaGFzZQogICAgZ2xvYmFsIHN0YXJ0bXNlY3MgbmV4dHVwZGF0ZSBuY211cGRhdGUKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIGxlZnRvdmVyCiAgICBnbG9iYWwgcGFyc2VkX2FyZ3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250CiAgICBnbG9iYWwgb2xkY29tbWl0cyBjb21taXRzCiAgICBnbG9iYWwgcGFyZW50cyBuY2hpbGRyZW4gY2hpbGRyZW4gbmNsZWZ0CgogICAgc2V0IG9sZF9hcmdzICRwYXJzZWRfYXJncwogICAgcGFyc2VfYXJncyAkcmFyZ3MKCiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIiB8fCAkcGhhc2UgPT0gImluY3JkcmF3In0gewoJIyBoYXZlbnQgcmVhZCBhbGwgdGhlIG9sZCBjb21taXRzLCBqdXN0IHN0YXJ0IGFnYWluIGZyb20gc2NyYXRjaAoJc3RvcGZpbmRwcm9jCglzZXQgb2xkY29tbWl0cyB7fQoJc2V0IGNvbW1pdHMge30KCWZvcmVhY2ggdiB7Y2hpbGRyZW4gbmNoaWxkcmVuIHBhcmVudHMgY29tbWl0bGlzdGVkIGNvbW1pdGluZm8KCQkgICBzZWxlY3RlZGxpbmUgbWF0Y2hpbmdsaW5lcyB0cmVlZGlmZnMKCQkgICBtZXJnZWZpbGVsaXN0IGN1cnJlbnRpZCByb3d0ZXh0eH0gewoJICAgIGdsb2JhbCAkdgoJICAgIGNhdGNoIHt1bnNldCAkdn0KCX0KCXJlYWRyZWZzCglpZiB7JHBoYXNlID09ICJpbmNyZHJhdyJ9IHsKCSAgICBhbGxjYW52cyBkZWxldGUgYWxsCgkgICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIlJlYWRpbmcgY29tbWl0cy4uLiIgXAoJCS1mb250ICRtYWluZm9udCAtdGFncyB0ZXh0aXRlbXMKCSAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwoJfQoJc3RhcnRfcmV2X2xpc3QgJHBhcnNlZF9hcmdzCglyZXR1cm4KICAgIH0KCiAgICBmb3JlYWNoIGlkICRvbGRfYXJncyB7CglpZiB7IVtyZWdleHAge15bMC05YS1mXXs0MH0kfSAkaWRdfSBjb250aW51ZQoJaWYge1tpbmZvIGV4aXN0cyBvbGRyZWYoJGlkKV19IGNvbnRpbnVlCglzZXQgb2xkcmVmKCRpZCkgJGlkCglsYXBwZW5kIGlnbm9yZW9sZCAiXiRpZCIKICAgIH0KICAgIGZvcmVhY2ggaWQgJHBhcnNlZF9hcmdzIHsKCWlmIHshW3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IGNvbnRpbnVlCglpZiB7W2luZm8gZXhpc3RzIHJlZigkaWQpXX0gY29udGludWUKCXNldCByZWYoJGlkKSAkaWQKCWxhcHBlbmQgaWdub3JlbmV3ICJeJGlkIgogICAgfQoKICAgIGZvcmVhY2ggYSAkb2xkX2FyZ3MgewoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRhKV19IHsKCSAgICBsYXBwZW5kIGlnbm9yZW5ldyAkYQoJfQogICAgfQoKICAgIHNldCBwaGFzZSB1cGRhdGVjb21taXRzCiAgICBzZXQgb2xkY29tbWl0cyAkY29tbWl0cwogICAgc2V0IGNvbW1pdHMge30KICAgIHNldCByZW1vdmVkX2NvbW1pdHMgW3NwbGl0IFtldmFsIGV4ZWMgZ2l0LXJldi1saXN0ICRpZ25vcmVuZXddICJcbiIgXQogICAgaWYge1tsbGVuZ3RoICRyZW1vdmVkX2NvbW1pdHNdID4gMH0gewoJYWxsY2FudnMgZGVsZXRlIGFsbAoJZm9yZWFjaCBjICRyZW1vdmVkX2NvbW1pdHMgewoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkb2xkY29tbWl0cyAkY10KCSAgICBpZiB7JGkgPj0gMH0gewoJCXNldCBvbGRjb21taXRzIFtscmVwbGFjZSAkb2xkY29tbWl0cyAkaSAkaV0KCQl1bnNldCBjb21taXRsaXN0ZWQoJGMpCgkJZm9yZWFjaCBwICRwYXJlbnRzKCRjKSB7CgkJICAgIGlmIHtbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRwKV19IHsKCQkJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRjaGlsZHJlbigkcCkgJGNdCgkJCWlmIHskaiA+PSAwfSB7CgkJCSAgICBzZXQgY2hpbGRyZW4oJHApIFtscmVwbGFjZSAkY2hpbGRyZW4oJHApICRqICRqXQoJCQkgICAgaW5jciBuY2hpbGRyZW4oJHApIC0xCgkJCX0KCQkgICAgfQoJCX0KCSAgICB9Cgl9CglzZXQgcGhhc2UgcmVtb3ZlY29tbWl0cwogICAgfQoKICAgIHNldCBhcmdzIHt9CiAgICBmb3JlYWNoIGEgJHBhcnNlZF9hcmdzIHsKCWlmIHshW2luZm8gZXhpc3RzIG9sZHJlZigkYSldfSB7CgkgICAgbGFwcGVuZCBhcmdzICRhCgl9CiAgICB9CgogICAgcmVhZHJlZnMKICAgIHN0YXJ0X3Jldl9saXN0IFtjb25jYXQgJGlnbm9yZW9sZCAkYXJnc10KfQoKcHJvYyB1cGRhdGVjaGlsZHJlbiB7aWQgb2xkc30gewogICAgZ2xvYmFsIGNoaWxkcmVuIG5jaGlsZHJlbiBwYXJlbnRzIG5wYXJlbnRzIG5jbGVmdAoKICAgIGlmIHshW2luZm8gZXhpc3RzIG5jaGlsZHJlbigkaWQpXX0gewoJc2V0IGNoaWxkcmVuKCRpZCkge30KCXNldCBuY2hpbGRyZW4oJGlkKSAwCglzZXQgbmNsZWZ0KCRpZCkgMAogICAgfQogICAgc2V0IHBhcmVudHMoJGlkKSAkb2xkcwogICAgc2V0IG5wYXJlbnRzKCRpZCkgW2xsZW5ndGggJG9sZHNdCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRwKV19IHsKCSAgICBzZXQgY2hpbGRyZW4oJHApIFtsaXN0ICRpZF0KCSAgICBzZXQgbmNoaWxkcmVuKCRwKSAxCgkgICAgc2V0IG5jbGVmdCgkcCkgMQoJfSBlbHNlaWYge1tsc2VhcmNoIC1leGFjdCAkY2hpbGRyZW4oJHApICRpZF0gPCAwfSB7CgkgICAgbGFwcGVuZCBjaGlsZHJlbigkcCkgJGlkCgkgICAgaW5jciBuY2hpbGRyZW4oJHApCgkgICAgaW5jciBuY2xlZnQoJHApCgl9CiAgICB9Cn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZCBvbGRzfSB7CiAgICBnbG9iYWwgY29tbWl0aW5mbyBjZGF0ZQoKICAgIHNldCBpbmhkciAxCiAgICBzZXQgY29tbWVudCB7fQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICBzZXQgYXVuYW1lIHt9CiAgICBzZXQgYXVkYXRlIHt9CiAgICBzZXQgY29tbmFtZSB7fQogICAgc2V0IGNvbWRhdGUge30KICAgIHVwZGF0ZWNoaWxkcmVuICRpZCAkb2xkcwogICAgc2V0IGhkcmVuZCBbc3RyaW5nIGZpcnN0ICJcblxuIiAkY29udGVudHNdCiAgICBpZiB7JGhkcmVuZCA8IDB9IHsKCSMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgoJc2V0IGhkcmVuZCBbc3RyaW5nIGxlbmd0aCAkY29udGVudHNdCiAgICB9CiAgICBzZXQgaGVhZGVyIFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIDAgW2V4cHIgeyRoZHJlbmQgLSAxfV1dCiAgICBzZXQgY29tbWVudCBbc3RyaW5nIHJhbmdlICRjb250ZW50cyBbZXhwciB7JGhkcmVuZCArIDJ9XSBlbmRdCiAgICBmb3JlYWNoIGxpbmUgW3NwbGl0ICRoZWFkZXIgIlxuIl0gewoJc2V0IHRhZyBbbGluZGV4ICRsaW5lIDBdCglpZiB7JHRhZyA9PSAiYXV0aG9yIn0gewoJICAgIHNldCBhdWRhdGUgW2xpbmRleCAkbGluZSBlbmQtMV0KCSAgICBzZXQgYXVuYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KCX0gZWxzZWlmIHskdGFnID09ICJjb21taXR0ZXIifSB7CgkgICAgc2V0IGNvbWRhdGUgW2xpbmRleCAkbGluZSBlbmQtMV0KCSAgICBzZXQgY29tbmFtZSBbbHJhbmdlICRsaW5lIDEgZW5kLTJdCgl9CiAgICB9CiAgICBzZXQgaGVhZGxpbmUge30KICAgICMgdGFrZSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgY29tbWVudCBhcyB0aGUgaGVhZGxpbmUKICAgIHNldCBpIFtzdHJpbmcgZmlyc3QgIlxuIiAkY29tbWVudF0KICAgIGlmIHskaSA+PSAwfSB7CglzZXQgaGVhZGxpbmUgW3N0cmluZyB0cmltIFtzdHJpbmcgcmFuZ2UgJGNvbW1lbnQgMCAkaV1dCiAgICB9IGVsc2UgewoJc2V0IGhlYWRsaW5lICRjb21tZW50CiAgICB9CiAgICBpZiB7ISRsaXN0ZWR9IHsKCSMgZ2l0LXJldi1saXN0IGluZGVudHMgdGhlIGNvbW1lbnQgYnkgNCBzcGFjZXM7CgkjIGlmIHdlIGdvdCB0aGlzIHZpYSBnaXQtY2F0LWZpbGUsIGFkZCB0aGUgaW5kZW50YXRpb24KCXNldCBuZXdjb21tZW50IHt9Cglmb3JlYWNoIGxpbmUgW3NwbGl0ICRjb21tZW50ICJcbiJdIHsKCSAgICBhcHBlbmQgbmV3Y29tbWVudCAiICAgICIKCSAgICBhcHBlbmQgbmV3Y29tbWVudCAkbGluZQoJICAgIGFwcGVuZCBuZXdjb21tZW50ICJcbiIKCX0KCXNldCBjb21tZW50ICRuZXdjb21tZW50CiAgICB9CiAgICBpZiB7JGNvbWRhdGUgIT0ge319IHsKCXNldCBjZGF0ZSgkaWQpICRjb21kYXRlCiAgICB9CiAgICBzZXQgY29tbWl0aW5mbygkaWQpIFtsaXN0ICRoZWFkbGluZSAkYXVuYW1lICRhdWRhdGUgXAoJCQkgICAgICRjb21uYW1lICRjb21kYXRlICRjb21tZW50XQp9Cgpwcm9jIHJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCB0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyB0YWdjb250ZW50cwogICAgZ2xvYmFsIG90aGVycmVmaWRzIGlkb3RoZXJyZWZzCgogICAgZm9yZWFjaCB2IHt0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyBvdGhlcnJlZmlkcyBpZG90aGVycmVmc30gewoJY2F0Y2gge3Vuc2V0ICR2fQogICAgfQogICAgc2V0IHJlZmQgW29wZW4gW2xpc3QgfCBnaXQtbHMtcmVtb3RlIFtnaXRkaXJdXSByXQogICAgd2hpbGUgezAgPD0gW3NldCBuIFtnZXRzICRyZWZkIGxpbmVdXX0gewoJaWYgeyFbcmVnZXhwIHteKFswLTlhLWZdezQwfSkJcmVmcy8oW15eXSopJH0gJGxpbmUgXAoJICAgIG1hdGNoIGlkIHBhdGhdfSB7CgkgICAgY29udGludWUKCX0KCWlmIHshW3JlZ2V4cCB7Xih0YWdzfGhlYWRzKS8oLiopJH0gJHBhdGggbWF0Y2ggdHlwZSBuYW1lXX0gewoJICAgIHNldCB0eXBlIG90aGVycwoJICAgIHNldCBuYW1lICRwYXRoCgl9CglpZiB7JHR5cGUgPT0gInRhZ3MifSB7CgkgICAgc2V0IHRhZ2lkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkbmFtZQoJICAgIHNldCBvYmoge30KCSAgICBzZXQgdHlwZSB7fQoJICAgIHNldCB0YWcge30KCSAgICBjYXRjaCB7CgkJc2V0IGNvbW1pdCBbZXhlYyBnaXQtcmV2LXBhcnNlICIkaWReMCJdCgkJaWYgeyIkY29tbWl0IiAhPSAiJGlkIn0gewoJCSAgICBzZXQgdGFnaWRzKCRuYW1lKSAkY29tbWl0CgkJICAgIGxhcHBlbmQgaWR0YWdzKCRjb21taXQpICRuYW1lCgkJfQoJICAgIH0JCQoJICAgIGNhdGNoIHsKCSAgICAgICAgc2V0IHRhZ2NvbnRlbnRzKCRuYW1lKSBbZXhlYyBnaXQtY2F0LWZpbGUgdGFnICIkaWQiXQoJICAgIH0KCX0gZWxzZWlmIHsgJHR5cGUgPT0gImhlYWRzIiB9IHsKCSAgICBzZXQgaGVhZGlkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZGhlYWRzKCRpZCkgJG5hbWUKCX0gZWxzZSB7CgkgICAgc2V0IG90aGVycmVmaWRzKCRuYW1lKSAkaWQKCSAgICBsYXBwZW5kIGlkb3RoZXJyZWZzKCRpZCkgJG5hbWUKCX0KICAgIH0KICAgIGNsb3NlICRyZWZkCn0KCnByb2MgZXJyb3JfcG9wdXAgbXNnIHsKICAgIHNldCB3IC5lcnJvcgogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRyYW5zaWVudCAkdyAuCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgJG1zZyAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgogICAgdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIG1ha2V3aW5kb3cge3JhcmdzfSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBsaW5lc3BjIGNoYXJzcGMgY3RleHQgY2ZsaXN0IHRleHRmb250CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CiAgICBnbG9iYWwgZW50cmllcyBzaGExZW50cnkgc2hhMXN0cmluZyBzaGExYnV0CiAgICBnbG9iYWwgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGN1cnRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51IG1lcmdlbWF4CgogICAgbWVudSAuYmFyCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRmlsZSIgLW1lbnUgLmJhci5maWxlCiAgICBtZW51IC5iYXIuZmlsZQogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiVXBkYXRlIiAtY29tbWFuZCBbbGlzdCB1cGRhdGVjb21taXRzICRyYXJnc10KICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlJlcmVhZCByZWZlcmVuY2VzIiAtY29tbWFuZCByZXJlYWRyZWZzCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJRdWl0IiAtY29tbWFuZCBkb3F1aXQKICAgIG1lbnUgLmJhci5lZGl0CiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRWRpdCIgLW1lbnUgLmJhci5lZGl0CiAgICAuYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsICJQcmVmZXJlbmNlcyIgLWNvbW1hbmQgZG9wcmVmcwogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciB7NDUgKiAkY2hhcnNwY31dCglzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHszMCAqICRjaGFyc3BjfV0KCXNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgezE1ICogJGNoYXJzcGN9XQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciB7MjUgKiAkbGluZXNwYyArIDR9XQoJc2V0IGdlb21ldHJ5KGN0ZXh0dykgODAKCXNldCBnZW9tZXRyeShjdGV4dGgpIDMwCglzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgMzAKICAgIH0KICAgIHBhbmVkd2luZG93IC5jdG9wIC1vcmllbnQgdmVydGljYWwKICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkod2lkdGgpXX0gewoJLmN0b3AgY29uZiAtd2lkdGggJGdlb21ldHJ5KHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShoZWlnaHQpCglzZXQgdGV4dGggW2V4cHIgeyRnZW9tZXRyeShoZWlnaHQpIC0gJGdlb21ldHJ5KGNhbnZoKSAtIDU2fV0KCXNldCBnZW9tZXRyeShjdGV4dGgpIFtleHByIHsoJHRleHRoIC0gOCkgLwoJCQkJICAgIFtmb250IG1ldHJpY3MgJHRleHRmb250IC1saW5lc3BhY2VdfV0KICAgIH0KICAgIGZyYW1lIC5jdG9wLnRvcAogICAgZnJhbWUgLmN0b3AudG9wLmJhcgogICAgcGFjayAuY3RvcC50b3AuYmFyIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBzZXQgY3Njcm9sbCAuY3RvcC50b3AuY3NiCiAgICBzY3JvbGxiYXIgJGNzY3JvbGwgLWNvbW1hbmQge2FsbGNhbnZzIHl2aWV3fSAtaGlnaGxpZ2h0dGhpY2tuZXNzIDAKICAgIHBhY2sgJGNzY3JvbGwgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFuZWR3aW5kb3cgLmN0b3AudG9wLmNsaXN0IC1vcmllbnQgaG9yaXpvbnRhbCAtc2FzaHBhZCAwIC1oYW5kbGVzaXplIDQKICAgIHBhY2sgLmN0b3AudG9wLmNsaXN0IC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AgYWRkIC5jdG9wLnRvcAogICAgc2V0IGNhbnYgLmN0b3AudG9wLmNsaXN0LmNhbnYKICAgIGNhbnZhcyAkY2FudiAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MSkgXAoJLWJnIHdoaXRlIC1iZCAwIFwKCS15c2Nyb2xsaW5jciAkbGluZXNwYyAteXNjcm9sbGNvbW1hbmQgIiRjc2Nyb2xsIHNldCIKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYKICAgIHNldCBjYW52MiAuY3RvcC50b3AuY2xpc3QuY2FudjIKICAgIGNhbnZhcyAkY2FudjIgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjIpIFwKCS1iZyB3aGl0ZSAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYyCiAgICBzZXQgY2FudjMgLmN0b3AudG9wLmNsaXN0LmNhbnYzCiAgICBjYW52YXMgJGNhbnYzIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYzKSBcCgktYmcgd2hpdGUgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MwogICAgYmluZCAuY3RvcC50b3AuY2xpc3QgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNsaXN0cGFuZXMgJVcgJXd9CgogICAgc2V0IHNoYTFlbnRyeSAuY3RvcC50b3AuYmFyLnNoYTEKICAgIHNldCBlbnRyaWVzICRzaGExZW50cnkKICAgIHNldCBzaGExYnV0IC5jdG9wLnRvcC5iYXIuc2hhMWxhYmVsCiAgICBidXR0b24gJHNoYTFidXQgLXRleHQgIlNIQTEgSUQ6ICIgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCBcCgktY29tbWFuZCBnb3RvY29tbWl0IC13aWR0aCA4CiAgICAkc2hhMWJ1dCBjb25mIC1kaXNhYmxlZGZvcmVncm91bmQgWyRzaGExYnV0IGNnZXQgLWZvcmVncm91bmRdCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuc2hhMWxhYmVsIC1zaWRlIGxlZnQKICAgIGVudHJ5ICRzaGExZW50cnkgLXdpZHRoIDQwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNoYTFzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzaGExc3RyaW5nIHdyaXRlIHNoYTFjaGFuZ2UKICAgIHBhY2sgJHNoYTFlbnRyeSAtc2lkZSBsZWZ0IC1wYWR5IDIKCiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLWxlZnQgLWRhdGEgewoJI2RlZmluZSBsZWZ0X3dpZHRoIDE2CgkjZGVmaW5lIGxlZnRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciBsZWZ0X2JpdHNbXSA9IHsKCTB4MDAsIDB4MDAsIDB4YzAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsIDB4MDAsCgkweDBlLCAweDAwLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweDBlLCAweDAwLCAweDFjLCAweDAwLAoJMHgzOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhlMCwgMHgwMCwgMHhjMCwgMHgwMX07CiAgICB9CiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLXJpZ2h0IC1kYXRhIHsKCSNkZWZpbmUgcmlnaHRfd2lkdGggMTYKCSNkZWZpbmUgcmlnaHRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciByaWdodF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweDgwLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweDBlLCAweDAwLCAweDFjLAoJMHgwMCwgMHgzOCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MGUsIDB4MDAsIDB4MDcsIDB4ODAsIDB4MDMsIDB4YzAsIDB4MDF9OwogICAgfQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIubGVmdGJ1dCAtaW1hZ2UgYm0tbGVmdCAtY29tbWFuZCBnb2JhY2sgXAoJLXN0YXRlIGRpc2FibGVkIC13aWR0aCAyNgogICAgcGFjayAuY3RvcC50b3AuYmFyLmxlZnRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBidXR0b24gLmN0b3AudG9wLmJhci5yaWdodGJ1dCAtaW1hZ2UgYm0tcmlnaHQgLWNvbW1hbmQgZ29mb3J3IFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5yaWdodGJ1dCAtc2lkZSBsZWZ0IC1maWxsIHkKCiAgICBidXR0b24gLmN0b3AudG9wLmJhci5maW5kYnV0IC10ZXh0ICJGaW5kIiAtY29tbWFuZCBkb2ZpbmQKICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kYnV0IC1zaWRlIGxlZnQKICAgIHNldCBmaW5kc3RyaW5nIHt9CiAgICBzZXQgZnN0cmluZyAuY3RvcC50b3AuYmFyLmZpbmRzdHJpbmcKICAgIGxhcHBlbmQgZW50cmllcyAkZnN0cmluZwogICAgZW50cnkgJGZzdHJpbmcgLXdpZHRoIDMwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIGZpbmRzdHJpbmcKICAgIHBhY2sgJGZzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAogICAgc2V0IGZpbmR0eXBlIEV4YWN0CiAgICBzZXQgZmluZHR5cGVtZW51IFt0a19vcHRpb25NZW51IC5jdG9wLnRvcC5iYXIuZmluZHR5cGUgXAoJCQkgIGZpbmR0eXBlIEV4YWN0IElnbkNhc2UgUmVnZXhwXQogICAgc2V0IGZpbmRsb2MgIkFsbCBmaWVsZHMiCiAgICB0a19vcHRpb25NZW51IC5jdG9wLnRvcC5iYXIuZmluZGxvYyBmaW5kbG9jICJBbGwgZmllbGRzIiBIZWFkbGluZSBcCglDb21tZW50cyBBdXRob3IgQ29tbWl0dGVyIEZpbGVzIFBpY2theGUKICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kbG9jIC1zaWRlIHJpZ2h0CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZHR5cGUgLXNpZGUgcmlnaHQKICAgICMgZm9yIG1ha2luZyBzdXJlIHR5cGU9PUV4YWN0IHdoZW5ldmVyIGxvYz09UGlja2F4ZQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRsb2Mgd3JpdGUgZmluZGxvY2NoYW5nZQoKICAgIHBhbmVkd2luZG93IC5jdG9wLmNkZXQgLW9yaWVudCBob3Jpem9udGFsCiAgICAuY3RvcCBhZGQgLmN0b3AuY2RldAogICAgZnJhbWUgLmN0b3AuY2RldC5sZWZ0CiAgICBzZXQgY3RleHQgLmN0b3AuY2RldC5sZWZ0LmN0ZXh0CiAgICB0ZXh0ICRjdGV4dCAtYmcgd2hpdGUgLXN0YXRlIGRpc2FibGVkIC1mb250ICR0ZXh0Zm9udCBcCgktd2lkdGggJGdlb21ldHJ5KGN0ZXh0dykgLWhlaWdodCAkZ2VvbWV0cnkoY3RleHRoKSBcCgkteXNjcm9sbGNvbW1hbmQgIi5jdG9wLmNkZXQubGVmdC5zYiBzZXQiIC13cmFwIG5vbmUKICAgIHNjcm9sbGJhciAuY3RvcC5jZGV0LmxlZnQuc2IgLWNvbW1hbmQgIiRjdGV4dCB5dmlldyIKICAgIHBhY2sgLmN0b3AuY2RldC5sZWZ0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhY2sgJGN0ZXh0IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wLmNkZXQgYWRkIC5jdG9wLmNkZXQubGVmdAoKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdIC1iYWNrICIjYWFhYWFhIgogICAgJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWZvcmUgYmx1ZQogICAgJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlIHJlZAogICAgJGN0ZXh0IHRhZyBjb25mIGQxIC1mb3JlICIjMDBhMDAwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0wIC1mb3JlIHJlZAogICAgJGN0ZXh0IHRhZyBjb25mIG0xIC1mb3JlIGJsdWUKICAgICRjdGV4dCB0YWcgY29uZiBtMiAtZm9yZSBncmVlbgogICAgJGN0ZXh0IHRhZyBjb25mIG0zIC1mb3JlIHB1cnBsZQogICAgJGN0ZXh0IHRhZyBjb25mIG00IC1mb3JlIGJyb3duCiAgICAkY3RleHQgdGFnIGNvbmYgbTUgLWZvcmUgIiMwMDkwOTAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTYgLWZvcmUgbWFnZW50YQogICAgJGN0ZXh0IHRhZyBjb25mIG03IC1mb3JlICIjODA4MDAwIgogICAgJGN0ZXh0IHRhZyBjb25mIG04IC1mb3JlICIjMDA5MDAwIgogICAgJGN0ZXh0IHRhZyBjb25mIG05IC1mb3JlICIjZmYwMDgwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMCAtZm9yZSBjeWFuCiAgICAkY3RleHQgdGFnIGNvbmYgbTExIC1mb3JlICIjYjA3MDcwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMiAtZm9yZSAiIzcwYjBmMCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTMgLWZvcmUgIiM3MGYwYjAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTE0IC1mb3JlICIjZjBiMDcwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xNSAtZm9yZSAiI2ZmNzBiMCIKICAgICRjdGV4dCB0YWcgY29uZiBtbWF4IC1mb3JlIGRhcmtncmV5CiAgICBzZXQgbWVyZ2VtYXggMTYKICAgICRjdGV4dCB0YWcgY29uZiBtcmVzdWx0IC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICAkY3RleHQgdGFnIGNvbmYgbXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgJGN0ZXh0IHRhZyBjb25mIGZvdW5kIC1iYWNrIHllbGxvdwoKICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQKICAgIHNldCBjZmxpc3QgLmN0b3AuY2RldC5yaWdodC5jZmlsZXMKICAgIGxpc3Rib3ggJGNmbGlzdCAtYmcgd2hpdGUgLXNlbGVjdG1vZGUgZXh0ZW5kZWQgLXdpZHRoICRnZW9tZXRyeShjZmxpc3R3KSBcCgkteXNjcm9sbGNvbW1hbmQgIi5jdG9wLmNkZXQucmlnaHQuc2Igc2V0IgogICAgc2Nyb2xsYmFyIC5jdG9wLmNkZXQucmlnaHQuc2IgLWNvbW1hbmQgIiRjZmxpc3QgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQucmlnaHQuc2IgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFjayAkY2ZsaXN0IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wLmNkZXQgYWRkIC5jdG9wLmNkZXQucmlnaHQKICAgIGJpbmQgLmN0b3AuY2RldCA8Q29uZmlndXJlPiB7cmVzaXplY2RldHBhbmVzICVXICV3fQoKICAgIHBhY2sgLmN0b3AgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCgogICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgI2JpbmRhbGwgPEIxLU1vdGlvbj4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS00PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC01IHVuaXRzIgogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS01PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDUgdW5pdHMiCiAgICBiaW5kYWxsIDwyPiAiYWxsY2FudnMgc2NhbiBtYXJrIDAgJXkiCiAgICBiaW5kYWxsIDxCMi1Nb3Rpb24+ICJhbGxjYW52cyBzY2FuIGRyYWd0byAwICV5IgogICAgYmluZCAuIDxLZXktVXA+ICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmQgLiA8S2V5LURvd24+ICJzZWxuZXh0bGluZSAxIgogICAgYmluZCAuIDxLZXktUmlnaHQ+ICJnb2ZvcnciCiAgICBiaW5kIC4gPEtleS1MZWZ0PiAiZ29iYWNrIgogICAgYmluZCAuIDxLZXktUHJpb3I+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5kIC4gPEtleS1OZXh0PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktRGVsZXRlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1CYWNrU3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LXNwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSBwICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmRrZXkgbiAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmRrZXkgeiAiZ29iYWNrIgogICAgYmluZGtleSB4ICJnb2ZvcnciCiAgICBiaW5ka2V5IGkgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBrICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSBqICJnb2JhY2siCiAgICBiaW5ka2V5IGwgImdvZm9ydyIKICAgIGJpbmRrZXkgYiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgZCAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAxOCB1bml0cyIKICAgIGJpbmRrZXkgdSAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMTggdW5pdHMiCiAgICBiaW5ka2V5IC8ge2ZpbmRuZXh0IDF9CiAgICBiaW5ka2V5IDxLZXktUmV0dXJuPiB7ZmluZG5leHQgMH0KICAgIGJpbmRrZXkgPyBmaW5kcHJldgogICAgYmluZGtleSBmIG5leHRmaWxlCiAgICBiaW5kIC4gPENvbnRyb2wtcT4gZG9xdWl0CiAgICBiaW5kIC4gPENvbnRyb2wtZj4gZG9maW5kCiAgICBiaW5kIC4gPENvbnRyb2wtZz4ge2ZpbmRuZXh0IDB9CiAgICBiaW5kIC4gPENvbnRyb2wtcj4gZmluZHByZXYKICAgIGJpbmQgLiA8Q29udHJvbC1lcXVhbD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfQWRkPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1taW51cz4ge2luY3Jmb250IC0xfQogICAgYmluZCAuIDxDb250cm9sLUtQX1N1YnRyYWN0PiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kICRjZmxpc3QgPDxMaXN0Ym94U2VsZWN0Pj4gbGlzdGJveHNlbAogICAgYmluZCAuIDxEZXN0cm95PiB7c2F2ZXN0dWZmICVXfQogICAgYmluZCAuIDxCdXR0b24tMT4gImNsaWNrICVXIgogICAgYmluZCAkZnN0cmluZyA8S2V5LVJldHVybj4gZG9maW5kCiAgICBiaW5kICRzaGExZW50cnkgPEtleS1SZXR1cm4+IGdvdG9jb21taXQKICAgIGJpbmQgJHNoYTFlbnRyeSA8PFBhc3RlU2VsZWN0aW9uPj4gY2xlYXJzaGExCgogICAgc2V0IG1haW5jdXJzb3IgWy4gY2dldCAtY3Vyc29yXQogICAgc2V0IHRleHRjdXJzb3IgWyRjdGV4dCBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgY3VydGV4dGN1cnNvciAkdGV4dGN1cnNvcgoKICAgIHNldCByb3djdHhtZW51IC5yb3djdHhtZW51CiAgICBtZW51ICRyb3djdHhtZW51IC10ZWFyb2ZmIDAKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiB0aGlzIC0+IHNlbGVjdGVkIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDB9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgc2VsZWN0ZWQgLT4gdGhpcyIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAxfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJNYWtlIHBhdGNoIiAtY29tbWFuZCBta3BhdGNoCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNyZWF0ZSB0YWciIC1jb21tYW5kIG1rdGFnCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIldyaXRlIGNvbW1pdCB0byBmaWxlIiAtY29tbWFuZCB3cml0ZWNvbW1pdAp9CgojIHdoZW4gd2UgbWFrZSBhIGtleSBiaW5kaW5nIGZvciB0aGUgdG9wbGV2ZWwsIG1ha2Ugc3VyZQojIGl0IGRvZXNuJ3QgZ2V0IHRyaWdnZXJlZCB3aGVuIHRoYXQga2V5IGlzIHByZXNzZWQgaW4gdGhlCiMgZmluZCBzdHJpbmcgZW50cnkgd2lkZ2V0Lgpwcm9jIGJpbmRrZXkge2V2IHNjcmlwdH0gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGJpbmQgLiAkZXYgJHNjcmlwdAogICAgc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgJGV2XQogICAgaWYgeyRlc2NyaXB0ID09IHt9fSB7CglzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSA8S2V5Pl0KICAgIH0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgliaW5kICRlICRldiAiJGVzY3JpcHQ7IGJyZWFrIgogICAgfQp9CgojIHNldCB0aGUgZm9jdXMgYmFjayB0byB0aGUgdG9wbGV2ZWwgZm9yIGFueSBjbGljayBvdXRzaWRlCiMgdGhlIGVudHJ5IHdpZGdldHMKcHJvYyBjbGljayB7d30gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CglpZiB7JHcgPT0gJGV9IHJldHVybgogICAgfQogICAgZm9jdXMgLgp9Cgpwcm9jIHNhdmVzdHVmZiB7d30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY2ZsaXN0IG1haW5mb250IHRleHRmb250CiAgICBnbG9iYWwgc3R1ZmZzYXZlZCBmaW5kbWVyZ2VmaWxlcyBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG1heHdpZHRoCgogICAgaWYgeyRzdHVmZnNhdmVkfSByZXR1cm4KICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlIC5dfSByZXR1cm4KICAgIGNhdGNoIHsKCXNldCBmIFtvcGVuICJ+Ly5naXRrLW5ldyIgd10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1haW5mb250ICRtYWluZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZpbmRtZXJnZWZpbGVzICRmaW5kbWVyZ2VmaWxlc10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heGdyYXBocGN0ICRtYXhncmFwaHBjdF0KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heHdpZHRoICRtYXh3aWR0aF0KCXB1dHMgJGYgInNldCBnZW9tZXRyeSh3aWR0aCkgW3dpbmZvIHdpZHRoIC5jdG9wXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShoZWlnaHQpIFt3aW5mbyBoZWlnaHQgLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52XS0yfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnYyXS0yfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjMpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnYzXS0yfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudmgpIFtleHByIHtbd2luZm8gaGVpZ2h0ICRjYW52XS0yfV0iCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjdGV4dF0gLSA4KSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSAkdGV4dGZvbnQgIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY3RleHR3KSAkd2lkIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY2ZsaXN0XSAtIDExKSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSBbJGNmbGlzdCBjZ2V0IC1mb250XSAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjZmxpc3R3KSAkd2lkIgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJc2V0IHMxIFskd2luIHNhc2ggY29vcmQgMV0KCWlmIHskdyA8IDYwfSB7CgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcvMiAtIDIpfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkdyo1LzYgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczEgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgMzB9IHsKCQlzZXQgc2FzaDAgMzAKCSAgICB9CgkgICAgaWYgeyRzYXNoMSA8ICRzYXNoMCArIDIwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskc2FzaDAgKyAyMH1dCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPiAkdyAtIDEwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskdyAtIDEwfV0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByIHskc2FzaDEgLSAyMH1dCgkJfQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQoJJHdpbiBzYXNoIHBsYWNlIDEgJHNhc2gxIFtsaW5kZXggJHMxIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyByZXNpemVjZGV0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdyozLzQgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgNDV9IHsKCQlzZXQgc2FzaDAgNDUKCSAgICB9CgkgICAgaWYgeyRzYXNoMCA+ICR3IC0gMTV9IHsKCQlzZXQgc2FzaDAgW2V4cHIgeyR3IC0gMTV9XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgdmVyc2lvbiAxLjIKCkNvcHlyaWdodCCpIDIwMDUgUGF1bCBNYWNrZXJyYXMKClVzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKcHJvYyBhc3NpZ25jb2xvciB7aWR9IHsKICAgIGdsb2JhbCBjb2xvcm1hcCBjb21tY29sb3JzIGNvbG9ycyBuZXh0Y29sb3IKICAgIGdsb2JhbCBwYXJlbnRzIG5wYXJlbnRzIGNoaWxkcmVuIG5jaGlsZHJlbgogICAgZ2xvYmFsIGNvcm5lcmNyb3NzaW5ncyBjcm9zc2luZ3MKCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRpZCldfSByZXR1cm4KICAgIHNldCBuY29sb3JzIFtsbGVuZ3RoICRjb2xvcnNdCiAgICBpZiB7JG5wYXJlbnRzKCRpZCkgPD0gMSAmJiAkbmNoaWxkcmVuKCRpZCkgPT0gMX0gewoJc2V0IGNoaWxkIFtsaW5kZXggJGNoaWxkcmVuKCRpZCkgMF0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCSAgICAmJiAkbnBhcmVudHMoJGNoaWxkKSA9PSAxfSB7CgkgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBiYWRjb2xvcnMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldfSB7Cglmb3JlYWNoIHggJGNvcm5lcmNyb3NzaW5ncygkaWQpIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCgkgICAgfQoJfQoJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IGJhZGNvbG9ycyB7fQoJfQogICAgfQogICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7CglpZiB7W2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXX0gewoJICAgIGZvcmVhY2ggeCAkY3Jvc3NpbmdzKCRpZCkgewoJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJCX0KCSAgICB9CgkgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAoJICAgIH0KCX0KCXNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKQoJICAgIH0KCSAgICBpZiB7W2luZm8gZXhpc3RzIHBhcmVudHMoJGNoaWxkKV19IHsKCQlmb3JlYWNoIHAgJHBhcmVudHMoJGNoaWxkKSB7CgkJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQoJCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHApXSA8IDB9IHsKCQkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQoJCSAgICB9CgkJfQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCX0KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRuY29sb3JzfSB7aW5jciBpfSB7CglzZXQgYyBbbGluZGV4ICRjb2xvcnMgJG5leHRjb2xvcl0KCWlmIHtbaW5jciBuZXh0Y29sb3JdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IG5leHRjb2xvciAwCgl9CglpZiB7W2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNdfSBicmVhawogICAgfQogICAgc2V0IGNvbG9ybWFwKCRpZCkgJGMKfQoKcHJvYyBpbml0Z3JhcGgge30gewogICAgZ2xvYmFsIGNhbnZ5IGNhbnZ5MCBsaW5lbm8gbnVtY29tbWl0cyBuZXh0Y29sb3IgbGluZXNwYwogICAgZ2xvYmFsIG5jaGlsZHJlbiBuY2xlZnQKICAgIGdsb2JhbCBkaXNwbGlzdCBuaHlwZXJzcGFjZQoKICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ5ICRjYW52eTAKICAgIHNldCBsaW5lbm8gLTEKICAgIHNldCBudW1jb21taXRzIDAKICAgIGZvcmVhY2ggdiB7bWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMgY29sb3JtYXAgY29ybmVyY3Jvc3NpbmdzCgkJY3Jvc3NpbmdzIGlkbGluZSBsaW5laWR9IHsKCWdsb2JhbCAkdgoJY2F0Y2gge3Vuc2V0ICR2fQogICAgfQogICAgZm9yZWFjaCBpZCBbYXJyYXkgbmFtZXMgbmNoaWxkcmVuXSB7CglzZXQgbmNsZWZ0KCRpZCkgJG5jaGlsZHJlbigkaWQpCiAgICB9CiAgICBzZXQgZGlzcGxpc3Qge30KICAgIHNldCBuaHlwZXJzcGFjZSAwCn0KCnByb2MgYmluZGxpbmUge3QgaWR9IHsKICAgIGdsb2JhbCBjYW52CgogICAgJGNhbnYgYmluZCAkdCA8RW50ZXI+ICJsaW5lZW50ZXIgJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TW90aW9uPiAibGluZW1vdGlvbiAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxMZWF2ZT4gImxpbmVsZWF2ZSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxCdXR0b24tMT4gImxpbmVjbGljayAleCAleSAkaWQgMSIKfQoKcHJvYyBkcmF3bGluZXMge2lkIHh0cmEgZGVsb2xkfSB7CiAgICBnbG9iYWwgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMgbHRoaWNrbmVzcyBjb2xvcm1hcCBjYW52CgogICAgaWYgeyRkZWxvbGR9IHsKCSRjYW52IGRlbGV0ZSBsaW5lcy4kaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgbWFpbmxpbmUoJGlkKV19IHsKCXNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkbWFpbmxpbmUoJGlkKSBcCgkJICAgLXdpZHRoIFtleHByIHsoJHh0cmEgKyAxKSAqICRsdGhpY2tuZXNzfV0gXAoJCSAgIC1maWxsICRjb2xvcm1hcCgkaWQpIC10YWdzIGxpbmVzLiRpZCBcCgkJICAgLWFycm93ICRtYWlubGluZWFycm93KCRpZCldCgkkY2FudiBsb3dlciAkdAoJYmluZGxpbmUgJHQgJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJICAgIHNldCBjb29yZHMgW2xpbmRleCAkbHMgMF0KCSAgICBzZXQgdGhpY2sgW2xpbmRleCAkbHMgMV0KCSAgICBzZXQgYXJyb3cgW2xpbmRleCAkbHMgMl0KCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtZmlsbCAkY29sb3JtYXAoJGlkKSBcCgkJICAgICAgIC13aWR0aCBbZXhwciB7KCR0aGljayArICR4dHJhKSAqICRsdGhpY2tuZXNzfV0gXAoJCSAgICAgICAtYXJyb3cgJGFycm93IC10YWdzIGxpbmVzLiRpZF0KCSAgICAkY2FudiBsb3dlciAkdAoJICAgIGJpbmRsaW5lICR0ICRpZAoJfQogICAgfQp9CgojIGxldmVsIGhlcmUgaXMgYW4gaW5kZXggaW4gZGlzcGxpc3QKcHJvYyBkcmF3Y29tbWl0bGluZSB7bGV2ZWx9IHsKICAgIGdsb2JhbCBwYXJlbnRzIGNoaWxkcmVuIG5wYXJlbnRzIGRpc3BsaXN0CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBtYWluZm9udCBuYW1lZm9udCBjYW52eSBsaW5lc3BjCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnIGNvbW1pdGluZm8KICAgIGdsb2JhbCBjb2xvcm1hcCBudW1jb21taXRzIGN1cnJlbnRwYXJlbnRzIGR1cHBhcmVudHMKICAgIGdsb2JhbCBpZHRhZ3MgaWRsaW5lIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5lbm8gbHRoaWNrbmVzcyBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcwogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCByb3d0ZXh0eCBpZHBvcyBsYXN0dXNlIGRpc3BsaXN0CiAgICBnbG9iYWwgb2xkbmxpbmVzIG9sZGRsZXZlbCBvbGRkaXNwbGlzdAoKICAgIGluY3IgbnVtY29tbWl0cwogICAgaW5jciBsaW5lbm8KICAgIHNldCBpZCBbbGluZGV4ICRkaXNwbGlzdCAkbGV2ZWxdCiAgICBzZXQgbGFzdHVzZSgkaWQpICRsaW5lbm8KICAgIHNldCBsaW5laWQoJGxpbmVubykgJGlkCiAgICBzZXQgaWRsaW5lKCRpZCkgJGxpbmVubwogICAgc2V0IG9maWxsIFtleHByIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldPyAiYmx1ZSI6ICJ3aGl0ZSJ9XQogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJcmVhZGNvbW1pdCAkaWQKCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCSAgICBzZXQgY29tbWl0aW5mbygkaWQpIHsiTm8gY29tbWl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSJ9CgkgICAgc2V0IG5wYXJlbnRzKCRpZCkgMAoJfQogICAgfQogICAgYXNzaWduY29sb3IgJGlkCiAgICBzZXQgY3VycmVudHBhcmVudHMge30KICAgIHNldCBkdXBwYXJlbnRzIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXSAmJiBbaW5mbyBleGlzdHMgcGFyZW50cygkaWQpXX0gewoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGN1cnJlbnRwYXJlbnRzICRwXSA8IDB9IHsKCQlsYXBwZW5kIGN1cnJlbnRwYXJlbnRzICRwCgkgICAgfSBlbHNlIHsKCQkjIHJlbWVtYmVyIHRoYXQgdGhpcyBwYXJlbnQgd2FzIGxpc3RlZCB0d2ljZQoJCWxhcHBlbmQgZHVwcGFyZW50cyAkcAoJICAgIH0KCX0KICAgIH0KICAgIHNldCB4IFt4Y29vcmQgJGxldmVsICRsZXZlbCAkbGluZW5vXQogICAgc2V0IHkxICRjYW52eQogICAgc2V0IGNhbnZ5IFtleHByIHskY2FudnkgKyAkbGluZXNwY31dCiAgICBhbGxjYW52cyBjb25mIC1zY3JvbGxyZWdpb24gXAoJW2xpc3QgMCAwIDAgW2V4cHIgeyR5MSArIDAuNSAqICRsaW5lc3BjICsgMn1dXQogICAgaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJbGFwcGVuZCBtYWlubGluZSgkaWQpICR4ICR5MQoJaWYgeyRtYWlubGluZWFycm93KCRpZCkgbmUgIm5vbmUifSB7CgkgICAgc2V0IG1haW5saW5lKCRpZCkgW3RyaW1kaWFnc3RhcnQgJG1haW5saW5lKCRpZCldCgl9CiAgICB9CiAgICBkcmF3bGluZXMgJGlkIDAgMAogICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIG92YWwgW2V4cHIgeyR4IC0gJG9yYWR9XSBbZXhwciB7JHkxIC0gJG9yYWR9XSBcCgkgICAgICAgW2V4cHIgeyR4ICsgJG9yYWQgLSAxfV0gW2V4cHIgeyR5MSArICRvcmFkIC0gMX1dIFwKCSAgICAgICAtZmlsbCAkb2ZpbGwgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDFdCiAgICAkY2FudiByYWlzZSAkdAogICAgJGNhbnYgYmluZCAkdCA8MT4ge3NlbGNhbnZsaW5lIHt9ICV4ICV5fQogICAgc2V0IHh0IFt4Y29vcmQgW2xsZW5ndGggJGRpc3BsaXN0XSAkbGV2ZWwgJGxpbmVub10KICAgIGlmIHtbbGxlbmd0aCAkY3VycmVudHBhcmVudHNdID4gMn0gewoJc2V0IHh0IFtleHByIHskeHQgKyAoW2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSAtIDIpICogJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHJvd3RleHR4KCRsaW5lbm8pICR4dAogICAgc2V0IGlkcG9zKCRpZCkgW2xpc3QgJHggJHh0ICR5MV0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldIHx8IFtpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldCgl8fCBbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB4dCBbZHJhd3RhZ3MgJGlkICR4ICR4dCAkeTFdCiAgICB9CiAgICBzZXQgaGVhZGxpbmUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDBdCiAgICBzZXQgbmFtZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMV0KICAgIHNldCBkYXRlIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAyXQogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgJGRhdGVdCiAgICBzZXQgbGluZWh0YWcoJGxpbmVubykgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4dCAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRoZWFkbGluZSAtZm9udCAkbWFpbmZvbnQgXQogICAgJGNhbnYgYmluZCAkbGluZWh0YWcoJGxpbmVubykgPEJ1dHRvbi0zPiAicm93bWVudSAlWCAlWSAkaWQiCiAgICBzZXQgbGluZW50YWcoJGxpbmVubykgWyRjYW52MiBjcmVhdGUgdGV4dCAzICR5MSAtYW5jaG9yIHcgXAoJCQkgICAgICAgLXRleHQgJG5hbWUgLWZvbnQgJG5hbWVmb250XQogICAgc2V0IGxpbmVkdGFnKCRsaW5lbm8pIFskY2FudjMgY3JlYXRlIHRleHQgMyAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRkYXRlIC1mb250ICRtYWluZm9udF0KCiAgICBzZXQgb2xkZGxldmVsICRsZXZlbAogICAgc2V0IG9sZGRpc3BsaXN0ICRkaXNwbGlzdAogICAgc2V0IG9sZG5saW5lcyBbbGxlbmd0aCAkZGlzcGxpc3RdCn0KCnByb2MgZHJhd3RhZ3Mge2lkIHggeHQgeTF9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgaWRsaW5lIHJvd3RleHR4CgogICAgc2V0IG1hcmtzIHt9CiAgICBzZXQgbnRhZ3MgMAogICAgc2V0IG5oZWFkcyAwCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IG1hcmtzICRpZHRhZ3MoJGlkKQoJc2V0IG50YWdzIFtsbGVuZ3RoICRtYXJrc10KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZGhlYWRzKCRpZCldCglzZXQgbmhlYWRzIFtsbGVuZ3RoICRpZGhlYWRzKCRpZCldCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgbWFya3MgW2NvbmNhdCAkbWFya3MgJGlkb3RoZXJyZWZzKCRpZCldCiAgICB9CiAgICBpZiB7JG1hcmtzIGVxIHt9fSB7CglyZXR1cm4gJHh0CiAgICB9CgogICAgc2V0IGRlbHRhIFtleHByIHtpbnQoMC41ICogKCRsaW5lc3BjIC0gJGx0aGlja25lc3MpKX1dCiAgICBzZXQgeXQgW2V4cHIgeyR5MSAtIDAuNSAqICRsaW5lc3BjfV0KICAgIHNldCB5YiBbZXhwciB7JHl0ICsgJGxpbmVzcGMgLSAxfV0KICAgIHNldCB4dmFscyB7fQogICAgc2V0IHd2YWxzIHt9CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgewoJc2V0IHdpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGFnXQoJbGFwcGVuZCB4dmFscyAkeHQKCWxhcHBlbmQgd3ZhbHMgJHdpZAoJc2V0IHh0IFtleHByIHskeHQgKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3MgKyAkbGluZXNwY31dCiAgICB9CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJHggJHkxIFtsaW5kZXggJHh2YWxzIGVuZF0gJHkxIFwKCSAgICAgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgYmxhY2sgLXRhZ3MgdGFnLiRpZF0KICAgICRjYW52IGxvd2VyICR0CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgeCAkeHZhbHMgd2lkICR3dmFscyB7CglzZXQgeGwgW2V4cHIgeyR4ICsgJGRlbHRhfV0KCXNldCB4ciBbZXhwciB7JHggKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3N9XQoJaWYge1tpbmNyIG50YWdzIC0xXSA+PSAwfSB7CgkgICAgIyBkcmF3IGEgdGFnCgkgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBwb2x5Z29uICR4IFtleHByIHskeXQgKyAkZGVsdGF9XSAkeGwgJHl0IFwKCQkgICAgICAgJHhyICR5dCAkeHIgJHliICR4bCAkeWIgJHggW2V4cHIgeyR5YiAtICRkZWx0YX1dIFwKCQkgICAgICAgLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgeWVsbG93IC10YWdzIHRhZy4kaWRdCgkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCgkgICAgc2V0IHJvd3RleHR4KCRpZGxpbmUoJGlkKSkgW2V4cHIgeyR4ciArICRsaW5lc3BjfV0KCX0gZWxzZSB7CgkgICAgIyBkcmF3IGEgaGVhZCBvciBvdGhlciByZWYKCSAgICBpZiB7W2luY3IgbmhlYWRzIC0xXSA+PSAwfSB7CgkJc2V0IGNvbCBncmVlbgoJICAgIH0gZWxzZSB7CgkJc2V0IGNvbCAiI2RkZGRmZiIKCSAgICB9CgkgICAgc2V0IHhsIFtleHByIHskeGwgLSAkZGVsdGEvMn1dCgkgICAgJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggJHl0ICR4ciAkeXQgJHhyICR5YiAkeCAkeWIgXAoJCS13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsICRjb2wgLXRhZ3MgdGFnLiRpZAoJfQoJc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4bCAkeTEgLWFuY2hvciB3IC10ZXh0ICR0YWcgXAoJCSAgIC1mb250ICRtYWluZm9udCAtdGFncyB0YWcuJGlkXQoJaWYgeyRudGFncyA+PSAwfSB7CgkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCgl9CiAgICB9CiAgICByZXR1cm4gJHh0Cn0KCnByb2Mgbm90ZWNyb3NzaW5ncyB7aWQgbG8gaGkgY29ybmVyfSB7CiAgICBnbG9iYWwgb2xkZGlzcGxpc3QgY3Jvc3NpbmdzIGNvcm5lcmNyb3NzaW5ncwoKICAgIGZvciB7c2V0IGkgJGxvfSB7W2luY3IgaV0gPCAkaGl9IHt9IHsKCXNldCBwIFtsaW5kZXggJG9sZGRpc3BsaXN0ICRpXQoJaWYgeyRwID09IHt9fSBjb250aW51ZQoJaWYgeyRpID09ICRjb3JuZXJ9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb3JuZXJjcm9zc2luZ3MoJGlkKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNvcm5lcmNyb3NzaW5ncygkaWQpICRwXSA8IDB9IHsKCQlsYXBwZW5kIGNvcm5lcmNyb3NzaW5ncygkaWQpICRwCgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkcCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjb3JuZXJjcm9zc2luZ3MoJHApICRpZF0gPCAwfSB7CgkJbGFwcGVuZCBjb3JuZXJjcm9zc2luZ3MoJHApICRpZAoJICAgIH0KCX0gZWxzZSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY3Jvc3NpbmdzKCRpZCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjcm9zc2luZ3MoJGlkKSAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjcm9zc2luZ3MoJGlkKSAkcAoJICAgIH0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJHApXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY3Jvc3NpbmdzKCRwKSAkaWRdIDwgMH0gewoJCWxhcHBlbmQgY3Jvc3NpbmdzKCRwKSAkaWQKCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgeGNvb3JkIHtpIGxldmVsIGxufSB7CiAgICBnbG9iYWwgY2FudngwIHhzcGMxIHhzcGMyCgogICAgc2V0IHggW2V4cHIgeyRjYW52eDAgKyAkaSAqICR4c3BjMSgkbG4pfV0KICAgIGlmIHskaSA+IDAgJiYgJGkgPT0gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAwLjUgKiAoJHhzcGMyIC0gJHhzcGMxKCRsbikpfV0KICAgIH0gZWxzZWlmIHskaSA+ICRsZXZlbH0gewoJc2V0IHggW2V4cHIgeyR4ICsgJHhzcGMyIC0gJHhzcGMxKCRsbil9XQogICAgfQogICAgcmV0dXJuICR4Cn0KCiMgaXQgc2VlbXMgVGsgY2FuJ3QgZHJhdyBhcnJvd3Mgb24gdGhlIGVuZCBvZiBkaWFnb25hbCBsaW5lIHNlZ21lbnRzLi4uCnByb2MgdHJpbWRpYWdlbmQge2xpbmV9IHsKICAgIHdoaWxlIHtbbGxlbmd0aCAkbGluZV0gPiA0fSB7CglzZXQgeDEgW2xpbmRleCAkbGluZSBlbmQtM10KCXNldCB5MSBbbGluZGV4ICRsaW5lIGVuZC0yXQoJc2V0IHgyIFtsaW5kZXggJGxpbmUgZW5kLTFdCglzZXQgeTIgW2xpbmRleCAkbGluZSBlbmRdCglpZiB7KCR4MSA9PSAkeDIpICE9ICgkeTEgPT0gJHkyKX0gYnJlYWsKCXNldCBsaW5lIFtscmVwbGFjZSAkbGluZSBlbmQtMSBlbmRdCiAgICB9CiAgICByZXR1cm4gJGxpbmUKfQoKcHJvYyB0cmltZGlhZ3N0YXJ0IHtsaW5lfSB7CiAgICB3aGlsZSB7W2xsZW5ndGggJGxpbmVdID4gNH0gewoJc2V0IHgxIFtsaW5kZXggJGxpbmUgMF0KCXNldCB5MSBbbGluZGV4ICRsaW5lIDFdCglzZXQgeDIgW2xpbmRleCAkbGluZSAyXQoJc2V0IHkyIFtsaW5kZXggJGxpbmUgM10KCWlmIHsoJHgxID09ICR4MikgIT0gKCR5MSA9PSAkeTIpfSBicmVhawoJc2V0IGxpbmUgW2xyZXBsYWNlICRsaW5lIDAgMV0KICAgIH0KICAgIHJldHVybiAkbGluZQp9Cgpwcm9jIGRyYXdzbGFudHMge2lkIG5lZWRvbnNjcmVlbiBub2hzfSB7CiAgICBnbG9iYWwgY2FudiBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcwogICAgZ2xvYmFsIGNhbnZ4MCBjYW52eSB4c3BjMSB4c3BjMiBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY3VycmVudHBhcmVudHMgZHVwcGFyZW50cwogICAgZ2xvYmFsIGx0aGlja25lc3MgbGluZXNwYyBjYW52eSBjb2xvcm1hcCBsaW5lbm8gZ2VvbWV0cnkKICAgIGdsb2JhbCBtYXhncmFwaHBjdCBtYXh3aWR0aAogICAgZ2xvYmFsIGRpc3BsaXN0IG9uc2NyZWVuIGxhc3R1c2UKICAgIGdsb2JhbCBwYXJlbnRzIGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIG9sZG5saW5lcyBvbGRkbGV2ZWwgb2xkZGlzcGxpc3QKICAgIGdsb2JhbCBuaHlwZXJzcGFjZSBudW1jb21taXRzIG5uZXdwYXJlbnRzCgogICAgaWYgeyRsaW5lbm8gPCAwfSB7CglsYXBwZW5kIGRpc3BsaXN0ICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMQoJcmV0dXJuIDAKICAgIH0KCiAgICBzZXQgeTEgW2V4cHIgeyRjYW52eSAtICRsaW5lc3BjfV0KICAgIHNldCB5MiAkY2FudnkKCiAgICAjIHdvcmsgb3V0IHdoYXQgd2UgbmVlZCB0byBnZXQgYmFjayBvbiBzY3JlZW4KICAgIHNldCByZWlucyB7fQogICAgaWYgeyRvbnNjcmVlbigkaWQpIDwgMH0gewoJIyBuZXh0IHRvIGRvIGlzbid0IGRpc3BsYXllZCwgYmV0dGVyIGdldCBpdCBvbiBzY3JlZW4uLi4KCWxhcHBlbmQgcmVpbnMgW2xpc3QgJGlkIDBdCiAgICB9CiAgICAjIG1ha2Ugc3VyZSBhbGwgdGhlIHByZXZpb3VzIGNvbW1pdHMncyBwYXJlbnRzIGFyZSBvbiB0aGUgc2NyZWVuCiAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCWlmIHskb25zY3JlZW4oJHApIDwgMH0gewoJICAgIGxhcHBlbmQgcmVpbnMgW2xpc3QgJHAgMF0KCX0KICAgIH0KICAgICMgYnJpbmcgYmFjayBhbnl0aGluZyByZXF1ZXN0ZWQgYnkgY2FsbGVyCiAgICBpZiB7JG5lZWRvbnNjcmVlbiBuZSB7fX0gewoJbGFwcGVuZCByZWlucyAkbmVlZG9uc2NyZWVuCiAgICB9CgogICAgIyB0cnkgdGhlIHNob3J0Y3V0CiAgICBpZiB7JGN1cnJlbnRwYXJlbnRzID09ICRpZCAmJiAkb25zY3JlZW4oJGlkKSA9PSAwICYmICRyZWlucyBlcSB7fX0gewoJc2V0IGRsZXZlbCAkb2xkZGxldmVsCglzZXQgeCBbeGNvb3JkICRkbGV2ZWwgJGRsZXZlbCAkbGluZW5vXQoJc2V0IG1haW5saW5lKCRpZCkgW2xpc3QgJHggJHkxXQoJc2V0IG1haW5saW5lYXJyb3coJGlkKSBub25lCglzZXQgbGFzdHVzZSgkaWQpICRsaW5lbm8KCXNldCBkaXNwbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRkbGV2ZWwgJGRsZXZlbCAkaWRdCglzZXQgb25zY3JlZW4oJGlkKSAxCglzZXQgeHNwYzEoW2V4cHIgeyRsaW5lbm8gKyAxfV0pICR4c3BjMSgkbGluZW5vKQoJcmV0dXJuICRkbGV2ZWwKICAgIH0KCiAgICAjIHVwZGF0ZSBkaXNwbGlzdAogICAgc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJG9sZGRsZXZlbCAkb2xkZGxldmVsXQogICAgc2V0IGogJG9sZGRsZXZlbAogICAgZm9yZWFjaCBwICRjdXJyZW50cGFyZW50cyB7CglzZXQgbGFzdHVzZSgkcCkgJGxpbmVubwoJaWYgeyRvbnNjcmVlbigkcCkgPT0gMH0gewoJICAgIHNldCBkaXNwbGlzdCBbbGluc2VydCAkZGlzcGxpc3QgJGogJHBdCgkgICAgc2V0IG9uc2NyZWVuKCRwKSAxCgkgICAgaW5jciBqCgl9CiAgICB9CiAgICBpZiB7JG9uc2NyZWVuKCRpZCkgPT0gMH0gewoJbGFwcGVuZCBkaXNwbGlzdCAkaWQKCXNldCBvbnNjcmVlbigkaWQpIDEKICAgIH0KCiAgICAjIHJlbW92ZSB0aGUgbnVsbCBlbnRyeSBpZiBwcmVzZW50CiAgICBzZXQgbnVsbGVudHJ5IFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3Qge31dCiAgICBpZiB7JG51bGxlbnRyeSA+PSAwfSB7CglzZXQgZGlzcGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkbnVsbGVudHJ5ICRudWxsZW50cnldCiAgICB9CgogICAgIyBicmluZyBiYWNrIHRoZSBvbmVzIHdlIG5lZWQgbm93IChpZiB3ZSBkaWQgaXQgZWFybGllcgogICAgIyBpdCB3b3VsZCBjaGFuZ2UgZGlzcGxpc3QgYW5kIGludmFsaWRhdGUgb2xkZGxldmVsKQogICAgZm9yZWFjaCBwaSAkcmVpbnMgewoJIyB0ZXN0IGFnYWluIGluIGNhc2Ugb2YgZHVwbGljYXRlcyBpbiByZWlucwoJc2V0IHAgW2xpbmRleCAkcGkgMF0KCWlmIHskb25zY3JlZW4oJHApIDwgMH0gewoJICAgIHNldCBvbnNjcmVlbigkcCkgMQoJICAgIHNldCBsYXN0dXNlKCRwKSAkbGluZW5vCgkgICAgc2V0IGRpc3BsaXN0IFtsaW5zZXJ0ICRkaXNwbGlzdCBbbGluZGV4ICRwaSAxXSAkcF0KCSAgICBpbmNyIG5oeXBlcnNwYWNlIC0xCgl9CiAgICB9CgogICAgc2V0IGxhc3R1c2UoJGlkKSAkbGluZW5vCgogICAgIyBzZWUgaWYgd2UgbmVlZCB0byBtYWtlIGFueSBsaW5lcyBqdW1wIG9mZiBpbnRvIGh5cGVyc3BhY2UKICAgIHNldCBkaXNwbCBbbGxlbmd0aCAkZGlzcGxpc3RdCiAgICBpZiB7JGRpc3BsID4gJG1heHdpZHRofSB7CglzZXQgYWdlcyB7fQoJZm9yZWFjaCB4ICRkaXNwbGlzdCB7CgkgICAgbGFwcGVuZCBhZ2VzIFtsaXN0ICRsYXN0dXNlKCR4KSAkeF0KCX0KCXNldCBhZ2VzIFtsc29ydCAtaW50ZWdlciAtaW5kZXggMCAkYWdlc10KCXNldCBrIDAKCXdoaWxlIHskZGlzcGwgPiAkbWF4d2lkdGh9IHsKCSAgICBzZXQgdXNlIFtsaW5kZXggJGFnZXMgJGsgMF0KCSAgICBzZXQgdmljdGltIFtsaW5kZXggJGFnZXMgJGsgMV0KCSAgICBpZiB7JHVzZSA+PSAkbGluZW5vIC0gNX0gYnJlYWsKCSAgICBpbmNyIGsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRub2hzICR2aWN0aW1dID49IDB9IGNvbnRpbnVlCgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkdmljdGltXQoJICAgIHNldCBkaXNwbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRpICRpXQoJICAgIHNldCBvbnNjcmVlbigkdmljdGltKSAtMQoJICAgIGluY3Igbmh5cGVyc3BhY2UKCSAgICBpbmNyIGRpc3BsIC0xCgkgICAgaWYgeyRpIDwgJG51bGxlbnRyeX0gewoJCWluY3IgbnVsbGVudHJ5IC0xCgkgICAgfQoJICAgIHNldCB4IFtsaW5kZXggJG1haW5saW5lKCR2aWN0aW0pIGVuZC0xXQoJICAgIGxhcHBlbmQgbWFpbmxpbmUoJHZpY3RpbSkgJHggJHkxCgkgICAgc2V0IGxpbmUgW3RyaW1kaWFnZW5kICRtYWlubGluZSgkdmljdGltKV0KCSAgICBzZXQgYXJyb3cgImxhc3QiCgkgICAgaWYgeyRtYWlubGluZWFycm93KCR2aWN0aW0pIG5lICJub25lIn0gewoJCXNldCBsaW5lIFt0cmltZGlhZ3N0YXJ0ICRsaW5lXQoJCXNldCBhcnJvdyAiYm90aCIKCSAgICB9CgkgICAgbGFwcGVuZCBzaWRlbGluZXMoJHZpY3RpbSkgW2xpc3QgJGxpbmUgMSAkYXJyb3ddCgkgICAgdW5zZXQgbWFpbmxpbmUoJHZpY3RpbSkKCX0KICAgIH0KCiAgICBzZXQgZGxldmVsIFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3QgJGlkXQoKICAgICMgSWYgd2UgYXJlIHJlZHVjaW5nLCBwdXQgaW4gYSBudWxsIGVudHJ5CiAgICBpZiB7JGRpc3BsIDwgJG9sZG5saW5lc30gewoJIyBkb2VzIHRoZSBuZXh0IGxpbmUgbG9vayBsaWtlIGEgbWVyZ2U/CgkjIGkuZS4gZG9lcyBpdCBoYXZlID4gMSBuZXcgcGFyZW50PwoJaWYgeyRubmV3cGFyZW50cygkaWQpID4gMX0gewoJICAgIHNldCBpIFtleHByIHskZGxldmVsICsgMX1dCgl9IGVsc2VpZiB7JG5uZXdwYXJlbnRzKFtsaW5kZXggJG9sZGRpc3BsaXN0ICRvbGRkbGV2ZWxdKSA9PSAwfSB7CgkgICAgc2V0IGkgJG9sZGRsZXZlbAoJICAgIGlmIHskbnVsbGVudHJ5ID49IDAgJiYgJG51bGxlbnRyeSA8ICRpfSB7CgkJaW5jciBpIC0xCgkgICAgfQoJfSBlbHNlaWYgeyRudWxsZW50cnkgPj0gMH0gewoJICAgIHNldCBpICRudWxsZW50cnkKCSAgICB3aGlsZSB7JGkgPCAkZGlzcGwKCQkgICAmJiBbbGluZGV4ICRvbGRkaXNwbGlzdCAkaV0gPT0gW2xpbmRleCAkZGlzcGxpc3QgJGldfSB7CgkJaW5jciBpCgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgaSAkb2xkZGxldmVsCgkgICAgaWYgeyRkbGV2ZWwgPj0gJGl9IHsKCQlpbmNyIGkKCSAgICB9Cgl9CglpZiB7JGkgPCAkZGlzcGx9IHsKCSAgICBzZXQgZGlzcGxpc3QgW2xpbnNlcnQgJGRpc3BsaXN0ICRpIHt9XQoJICAgIGluY3IgZGlzcGwKCSAgICBpZiB7JGRsZXZlbCA+PSAkaX0gewoJCWluY3IgZGxldmVsCgkgICAgfQoJfQogICAgfQoKICAgICMgZGVjaWRlIG9uIHRoZSBsaW5lIHNwYWNpbmcgZm9yIHRoZSBuZXh0IGxpbmUKICAgIHNldCBsaiBbZXhwciB7JGxpbmVubyArIDF9XQogICAgc2V0IG1heHcgW2V4cHIgeyRtYXhncmFwaHBjdCAqICRnZW9tZXRyeShjYW52MSkgLyAxMDB9XQogICAgaWYgeyRkaXNwbCA8PSAxIHx8ICRjYW52eDAgKyAkZGlzcGwgKiAkeHNwYzIgPD0gJG1heHd9IHsKCXNldCB4c3BjMSgkbGopICR4c3BjMgogICAgfSBlbHNlIHsKCXNldCB4c3BjMSgkbGopIFtleHByIHsoJG1heHcgLSAkY2FudngwIC0gJHhzcGMyKSAvICgkZGlzcGwgLSAxKX1dCglpZiB7JHhzcGMxKCRsaikgPCAkbHRoaWNrbmVzc30gewoJICAgIHNldCB4c3BjMSgkbGopICRsdGhpY2tuZXNzCgl9CiAgICB9CgogICAgZm9yZWFjaCBpZGkgJHJlaW5zIHsKCXNldCBpZCBbbGluZGV4ICRpZGkgMF0KCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3QgJGlkXQoJc2V0IHhqIFt4Y29vcmQgJGogJGRsZXZlbCAkbGpdCglzZXQgbWFpbmxpbmUoJGlkKSBbbGlzdCAkeGogJHkyXQoJc2V0IG1haW5saW5lYXJyb3coJGlkKSBmaXJzdAogICAgfQoKICAgIHNldCBpIC0xCiAgICBmb3JlYWNoIGlkICRvbGRkaXNwbGlzdCB7CglpbmNyIGkKCWlmIHskaWQgPT0ge319IGNvbnRpbnVlCglpZiB7JG9uc2NyZWVuKCRpZCkgPD0gMH0gY29udGludWUKCXNldCB4aSBbeGNvb3JkICRpICRvbGRkbGV2ZWwgJGxpbmVub10KCWlmIHskaSA9PSAkb2xkZGxldmVsfSB7CgkgICAgZm9yZWFjaCBwICRjdXJyZW50cGFyZW50cyB7CgkJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkcF0KCQlzZXQgY29vcmRzIFtsaXN0ICR4aSAkeTFdCgkJc2V0IHhqIFt4Y29vcmQgJGogJGRsZXZlbCAkbGpdCgkJaWYgeyR4aiA8ICR4aSAtICRsaW5lc3BjfSB7CgkJICAgIGxhcHBlbmQgY29vcmRzIFtleHByIHskeGogKyAkbGluZXNwY31dICR5MQoJCSAgICBub3RlY3Jvc3NpbmdzICRwICRqICRpIFtleHByIHskaiArIDF9XQoJCX0gZWxzZWlmIHskeGogPiAkeGkgKyAkbGluZXNwY30gewoJCSAgICBsYXBwZW5kIGNvb3JkcyBbZXhwciB7JHhqIC0gJGxpbmVzcGN9XSAkeTEKCQkgICAgbm90ZWNyb3NzaW5ncyAkcCAkaSAkaiBbZXhwciB7JGogLSAxfV0KCQl9CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZHVwcGFyZW50cyAkcF0gPj0gMH0gewoJCSAgICAjIGRyYXcgYSBkb3VibGUtd2lkdGggbGluZSB0byBpbmRpY2F0ZSB0aGUgZG91YmxlZCBwYXJlbnQKCQkgICAgbGFwcGVuZCBjb29yZHMgJHhqICR5MgoJCSAgICBsYXBwZW5kIHNpZGVsaW5lcygkcCkgW2xpc3QgJGNvb3JkcyAyIG5vbmVdCgkJICAgIGlmIHshW2luZm8gZXhpc3RzIG1haW5saW5lKCRwKV19IHsKCQkJc2V0IG1haW5saW5lKCRwKSBbbGlzdCAkeGogJHkyXQoJCQlzZXQgbWFpbmxpbmVhcnJvdygkcCkgbm9uZQoJCSAgICB9CgkJfSBlbHNlIHsKCQkgICAgIyBub3JtYWwgY2FzZSwgbm8gcGFyZW50IGR1cGxpY2F0ZWQKCQkgICAgc2V0IHliICR5MgoJCSAgICBzZXQgZHggW2V4cHIge2FicygkeGkgLSAkeGopfV0KCQkgICAgaWYgezAgJiYgJGR4IDwgJGxpbmVzcGN9IHsKCQkJc2V0IHliIFtleHByIHskeTEgKyAkZHh9XQoJCSAgICB9CgkJICAgIGlmIHshW2luZm8gZXhpc3RzIG1haW5saW5lKCRwKV19IHsKCQkJaWYgeyR4aSAhPSAkeGp9IHsKCQkJICAgIGxhcHBlbmQgY29vcmRzICR4aiAkeWIKCQkJfQoJCQlzZXQgbWFpbmxpbmUoJHApICRjb29yZHMKCQkJc2V0IG1haW5saW5lYXJyb3coJHApIG5vbmUKCQkgICAgfSBlbHNlIHsKCQkJbGFwcGVuZCBjb29yZHMgJHhqICR5YgoJCQlpZiB7JHliIDwgJHkyfSB7CgkJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHkyCgkJCX0KCQkJbGFwcGVuZCBzaWRlbGluZXMoJHApIFtsaXN0ICRjb29yZHMgMSBub25lXQoJCSAgICB9CgkJfQoJICAgIH0KCX0gZWxzZSB7CgkgICAgc2V0IGogJGkKCSAgICBpZiB7W2xpbmRleCAkZGlzcGxpc3QgJGldICE9ICRpZH0gewoJCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3QgJGlkXQoJICAgIH0KCSAgICBpZiB7JGogIT0gJGkgfHwgJHhzcGMxKCRsaW5lbm8pICE9ICR4c3BjMSgkbGopCgkJfHwgKCRvbGRkbGV2ZWwgPCAkaSAmJiAkaSA8ICRkbGV2ZWwpCgkJfHwgKCRkbGV2ZWwgPCAkaSAmJiAkaSA8ICRvbGRkbGV2ZWwpfSB7CgkJc2V0IHhqIFt4Y29vcmQgJGogJGRsZXZlbCAkbGpdCgkJbGFwcGVuZCBtYWlubGluZSgkaWQpICR4aSAkeTEgJHhqICR5MgoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAkZGxldmVsCn0KCiMgc2VhcmNoIGZvciB4IGluIGEgbGlzdCBvZiBsaXN0cwpwcm9jIGxsc2VhcmNoIHtsbGlzdCB4fSB7CiAgICBzZXQgaSAwCiAgICBmb3JlYWNoIGwgJGxsaXN0IHsKCWlmIHskbCA9PSAkeCB8fCBbbHNlYXJjaCAtZXhhY3QgJGwgJHhdID49IDB9IHsKCSAgICByZXR1cm4gJGkKCX0KCWluY3IgaQogICAgfQogICAgcmV0dXJuIC0xCn0KCnByb2MgZHJhd21vcmUge3JlYWRpbmd9IHsKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgbnVtY29tbWl0cyBuY211cGRhdGUgbmV4dHVwZGF0ZQogICAgZ2xvYmFsIHN0b3BwZWQgbmh5cGVyc3BhY2UgcGFyZW50cyBjb21taXRsaXN0ZWQKICAgIGdsb2JhbCBtYXh3aWR0aCBvbnNjcmVlbiBkaXNwbGlzdCBjdXJyZW50cGFyZW50cyBvbGRkbGV2ZWwKCiAgICBzZXQgbiBbbGxlbmd0aCAkZGlzcGxheW9yZGVyXQogICAgd2hpbGUgeyRudW1jb21taXRzIDwgJG59IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJG51bWNvbW1pdHNdCglzZXQgY3R4ZW5kIFtleHByIHskbnVtY29tbWl0cyArIDEwfV0KCWlmIHshJHJlYWRpbmcgJiYgJGN0eGVuZCA+ICRufSB7CgkgICAgc2V0IGN0eGVuZCAkbgoJfQoJc2V0IGRsaXN0IHt9CglpZiB7JG51bWNvbW1pdHMgPiAwfSB7CgkgICAgc2V0IGRsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJG9sZGRsZXZlbCAkb2xkZGxldmVsXQoJICAgIHNldCBpICRvbGRkbGV2ZWwKCSAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCQlpZiB7JG9uc2NyZWVuKCRwKSA9PSAwfSB7CgkJICAgIHNldCBkbGlzdCBbbGluc2VydCAkZGxpc3QgJGkgJHBdCgkJICAgIGluY3IgaQoJCX0KCSAgICB9Cgl9CglzZXQgbm9ocyB7fQoJc2V0IHJlaW5zIHt9CglzZXQgaXNmYXQgW2V4cHIge1tsbGVuZ3RoICRkbGlzdF0gPiAkbWF4d2lkdGh9XQoJaWYgeyRuaHlwZXJzcGFjZSA+IDAgfHwgJGlzZmF0fSB7CgkgICAgaWYgeyRjdHhlbmQgPiAkbn0gYnJlYWsKCSAgICAjIHdvcmsgb3V0IHdoYXQgdG8gYnJpbmcgYmFjayBhbmQKCSAgICAjIHdoYXQgd2Ugd2FudCB0byBkb24ndCB3YW50IHRvIHNlbmQgaW50byBoeXBlcnNwYWNlCgkgICAgc2V0IHJvb20gMQoJICAgIGZvciB7c2V0IGsgJG51bWNvbW1pdHN9IHskayA8ICRjdHhlbmR9IHtpbmNyIGt9IHsKCQlzZXQgeCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGtdCgkJc2V0IGkgW2xsc2VhcmNoICRkbGlzdCAkeF0KCQlpZiB7JGkgPCAwfSB7CgkJICAgIHNldCBpIFtsbGVuZ3RoICRkbGlzdF0KCQkgICAgbGFwcGVuZCBkbGlzdCAkeAoJCX0KCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRub2hzICR4XSA8IDB9IHsKCQkgICAgbGFwcGVuZCBub2hzICR4CgkJfQoJCWlmIHskcmVpbnMgZXEge30gJiYgJG9uc2NyZWVuKCR4KSA8IDAgJiYgJHJvb219IHsKCQkgICAgc2V0IHJlaW5zIFtsaXN0ICR4ICRpXQoJCX0KCQlzZXQgbmV3cCB7fQoJCWlmIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCR4KV19IHsKCQkgICAgc2V0IHJpZ2h0IDAKCQkgICAgZm9yZWFjaCBwICRwYXJlbnRzKCR4KSB7CgkJCWlmIHtbbGxzZWFyY2ggJGRsaXN0ICRwXSA8IDB9IHsKCQkJICAgIGxhcHBlbmQgbmV3cCAkcAoJCQkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkbm9ocyAkcF0gPCAwfSB7CgkJCQlsYXBwZW5kIG5vaHMgJHAKCQkJICAgIH0KCQkJICAgIGlmIHskcmVpbnMgZXEge30gJiYgJG9uc2NyZWVuKCRwKSA8IDAgJiYgJHJvb219IHsKCQkJCXNldCByZWlucyBbbGlzdCAkcCBbZXhwciB7JGkgKyAkcmlnaHR9XV0KCQkJICAgIH0KCQkJfQoJCQlzZXQgcmlnaHQgMQoJCSAgICB9CgkJfQoJCXNldCBsIFtsaW5kZXggJGRsaXN0ICRpXQoJCWlmIHtbbGxlbmd0aCAkbF0gPT0gMX0gewoJCSAgICBzZXQgbCAkbmV3cAoJCX0gZWxzZSB7CgkJICAgIHNldCBqIFtsc2VhcmNoIC1leGFjdCAkbCAkeF0KCQkgICAgc2V0IGwgW2NvbmNhdCBbbHJlcGxhY2UgJGwgJGogJGpdICRuZXdwXQoJCX0KCQlzZXQgZGxpc3QgW2xyZXBsYWNlICRkbGlzdCAkaSAkaSAkbF0KCQlpZiB7JHJvb20gJiYgJGlzZmF0ICYmIFtsbGVuZ3RoICRuZXdwXSA8PSAxfSB7CgkJICAgIHNldCByb29tIDAKCQl9CgkgICAgfQoJfQoKCXNldCBkbGV2ZWwgW2RyYXdzbGFudHMgJGlkICRyZWlucyAkbm9oc10KCWRyYXdjb21taXRsaW5lICRkbGV2ZWwKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlCgkgICAgJiYgJG51bWNvbW1pdHMgPj0gJG5jbXVwZGF0ZX0gewoJICAgIGRvdXBkYXRlICRyZWFkaW5nCgkgICAgaWYgeyRzdG9wcGVkfSBicmVhawoJfQogICAgfQp9CgojIGxldmVsIGhlcmUgaXMgYW4gaW5kZXggaW4gdG9kbwpwcm9jIHVwZGF0ZXRvZG8ge2xldmVsIG5vc2hvcnRjdXR9IHsKICAgIGdsb2JhbCBuY2xlZnQgdG9kbyBubmV3cGFyZW50cwogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCBwYXJlbnRzIG9uc2NyZWVuCgogICAgc2V0IGlkIFtsaW5kZXggJHRvZG8gJGxldmVsXQogICAgc2V0IG9sZHMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldfSB7Cglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkb2xkcyAkcF0gPCAwfSB7CgkJbGFwcGVuZCBvbGRzICRwCgkgICAgfQoJfQogICAgfQogICAgaWYgeyEkbm9zaG9ydGN1dCAmJiBbbGxlbmd0aCAkb2xkc10gPT0gMX0gewoJc2V0IHAgW2xpbmRleCAkb2xkcyAwXQoJaWYgeyRuY2xlZnQoJHApID09IDEgJiYgW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRwXSA8IDB9IHsKCSAgICBzZXQgbmNsZWZ0KCRwKSAwCgkgICAgc2V0IHRvZG8gW2xyZXBsYWNlICR0b2RvICRsZXZlbCAkbGV2ZWwgJHBdCgkgICAgc2V0IG9uc2NyZWVuKCRwKSAwCgkgICAgc2V0IG5uZXdwYXJlbnRzKCRpZCkgMQoJICAgIHJldHVybiAwCgl9CiAgICB9CgogICAgc2V0IHRvZG8gW2xyZXBsYWNlICR0b2RvICRsZXZlbCAkbGV2ZWxdCiAgICBzZXQgaSAkbGV2ZWwKICAgIHNldCBuIDAKICAgIGZvcmVhY2ggcCAkb2xkcyB7CglpbmNyIG5jbGVmdCgkcCkgLTEKCXNldCBrIFtsc2VhcmNoIC1leGFjdCAkdG9kbyAkcF0KCWlmIHskayA8IDB9IHsKCSAgICBzZXQgdG9kbyBbbGluc2VydCAkdG9kbyAkaSAkcF0KCSAgICBzZXQgb25zY3JlZW4oJHApIDAKCSAgICBpbmNyIGkKCSAgICBpbmNyIG4KCX0KICAgIH0KICAgIHNldCBubmV3cGFyZW50cygkaWQpICRuCgogICAgcmV0dXJuIDEKfQoKcHJvYyBkZWNpZGVuZXh0IHt7bm9yZWFkIDB9fSB7CiAgICBnbG9iYWwgbmNsZWZ0IHRvZG8KICAgIGdsb2JhbCBkYXRlbW9kZSBjZGF0ZQogICAgZ2xvYmFsIGNvbW1pdGluZm8KCiAgICAjIGNob29zZSB3aGljaCBvbmUgdG8gZG8gbmV4dCB0aW1lIGFyb3VuZAogICAgc2V0IHRvZG9sIFtsbGVuZ3RoICR0b2RvXQogICAgc2V0IGxldmVsIC0xCiAgICBzZXQgbGF0ZXN0IHt9CiAgICBmb3Ige3NldCBrICR0b2RvbH0ge1tpbmNyIGsgLTFdID49IDB9IHt9IHsKCXNldCBwIFtsaW5kZXggJHRvZG8gJGtdCglpZiB7JG5jbGVmdCgkcCkgPT0gMH0gewoJICAgIGlmIHskZGF0ZW1vZGV9IHsKCQlpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRwKV19IHsKCQkgICAgaWYgeyRub3JlYWR9IHsKCQkJcmV0dXJuIHt9CgkJICAgIH0KCQkgICAgcmVhZGNvbW1pdCAkcAoJCX0KCQlpZiB7JGxhdGVzdCA9PSB7fSB8fCAkY2RhdGUoJHApID4gJGxhdGVzdH0gewoJCSAgICBzZXQgbGV2ZWwgJGsKCQkgICAgc2V0IGxhdGVzdCAkY2RhdGUoJHApCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGxldmVsICRrCgkJYnJlYWsKCSAgICB9Cgl9CiAgICB9CgogICAgcmV0dXJuICRsZXZlbAp9Cgpwcm9jIGRyYXdjb21taXQge2lkIHJlYWRpbmd9IHsKICAgIGdsb2JhbCBwaGFzZSB0b2RvIG5jaGlsZHJlbiBkYXRlbW9kZSBuZXh0dXBkYXRlIHJldmxpc3RvcmRlciBuY2xlZnQKICAgIGdsb2JhbCBudW1jb21taXRzIG5jbXVwZGF0ZSBkaXNwbGF5b3JkZXIgdG9kbyBvbnNjcmVlbiBwYXJlbnRzCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIGNvbW1pdG9yZGVyZWQKCiAgICBpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCXNldCBwaGFzZSBpbmNyZHJhdwoJc2V0IGRpc3BsYXlvcmRlciB7fQoJc2V0IHRvZG8ge30KCWluaXRncmFwaAoJY2F0Y2gge3Vuc2V0IGNvbW1pdG9yZGVyZWR9CiAgICB9CiAgICBzZXQgY29tbWl0b3JkZXJlZCgkaWQpIDEKICAgIGlmIHskbmNoaWxkcmVuKCRpZCkgPT0gMH0gewoJbGFwcGVuZCB0b2RvICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMAogICAgfQogICAgaWYgeyRyZXZsaXN0b3JkZXJ9IHsKCXNldCBsZXZlbCBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJGlkXQoJaWYgeyRsZXZlbCA8IDB9IHsKCSAgICBlcnJvcl9wb3B1cCAib29wcywgJGlkIGlzbid0IGluIHRvZG8iCgkgICAgcmV0dXJuCgl9CglsYXBwZW5kIGRpc3BsYXlvcmRlciAkaWQKCXVwZGF0ZXRvZG8gJGxldmVsIDAKICAgIH0gZWxzZSB7CglzZXQgbGV2ZWwgW2RlY2lkZW5leHQgMV0KCWlmIHskbGV2ZWwgPT0ge30gfHwgJGxldmVsIDwgMH0gcmV0dXJuCgl3aGlsZSAxIHsKCSAgICBzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0b3JkZXJlZCgkaWQpXX0gewoJCWJyZWFrCgkgICAgfQoJICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyIFtsaW5kZXggJHRvZG8gJGxldmVsXQoJICAgIGlmIHtbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXX0gewoJCXNldCBsZXZlbCBbZGVjaWRlbmV4dCAxXQoJCWlmIHskbGV2ZWwgPT0ge30gfHwgJGxldmVsIDwgMH0gYnJlYWsKCSAgICB9Cgl9CiAgICB9CiAgICBkcmF3bW9yZSAkcmVhZGluZwp9Cgpwcm9jIGZpbmlzaGNvbW1pdHMge30gewogICAgZ2xvYmFsIHBoYXNlIG9sZGNvbW1pdHMgY29tbWl0cwogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgY3RleHQgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgcGFyZW50cyBkaXNwbGF5b3JkZXIgdG9kbwoKICAgIGlmIHskcGhhc2UgPT0gImluY3JkcmF3IiB8fCAkcGhhc2UgPT0gInJlbW92ZWNvbW1pdHMifSB7Cglmb3JlYWNoIGlkICRvbGRjb21taXRzIHsKCSAgICBsYXBwZW5kIGNvbW1pdHMgJGlkCgkgICAgZHJhd2NvbW1pdCAkaWQgMAoJfQoJc2V0IG9sZGNvbW1pdHMge30KCWRyYXdyZXN0CiAgICB9IGVsc2VpZiB7JHBoYXNlID09ICJ1cGRhdGVjb21taXRzIn0gewoJIyB0aGVyZSB3ZXJlIG5vIG5ldyBjb21taXRzLCBpbiBmYWN0CglzZXQgY29tbWl0cyAkb2xkY29tbWl0cwoJc2V0IG9sZGNvbW1pdHMge30KCXNldCBwaGFzZSB7fQogICAgfSBlbHNlIHsKCSRjYW52IGRlbGV0ZSBhbGwKCSRjYW52IGNyZWF0ZSB0ZXh0IDMgMyAtYW5jaG9yIG53IC10ZXh0ICJObyBjb21taXRzIHNlbGVjdGVkIiBcCgkgICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwoJc2V0IHBoYXNlIHt9CiAgICB9CiAgICAuIGNvbmZpZyAtY3Vyc29yICRtYWluY3Vyc29yCiAgICBzZXR0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCn0KCiMgRG9uJ3QgY2hhbmdlIHRoZSB0ZXh0IHBhbmUgY3Vyc29yIGlmIGl0IGlzIGN1cnJlbnRseSB0aGUgaGFuZCBjdXJzb3IsCiMgc2hvd2luZyB0aGF0IHdlIGFyZSBvdmVyIGEgc2hhMSBJRCBsaW5rLgpwcm9jIHNldHRleHRjdXJzb3Ige2N9IHsKICAgIGdsb2JhbCBjdGV4dCBjdXJ0ZXh0Y3Vyc29yCgogICAgaWYge1skY3RleHQgY2dldCAtY3Vyc29yXSA9PSAkY3VydGV4dGN1cnNvcn0gewoJJGN0ZXh0IGNvbmZpZyAtY3Vyc29yICRjCiAgICB9CiAgICBzZXQgY3VydGV4dGN1cnNvciAkYwp9Cgpwcm9jIGRyYXdncmFwaCB7fSB7CiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBzdGFydG1zZWNzIG5jbXVwZGF0ZQogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBvbnNjcmVlbgoKICAgIGlmIHskZGlzcGxheW9yZGVyID09IHt9fSByZXR1cm4KICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHskc3RhcnRtc2VjcyArIDEwMH1dCiAgICBzZXQgbmNtdXBkYXRlIDEKICAgIGluaXRncmFwaAogICAgZm9yZWFjaCBpZCAkZGlzcGxheW9yZGVyIHsKCXNldCBvbnNjcmVlbigkaWQpIDAKICAgIH0KICAgIGRyYXdtb3JlIDAKfQoKcHJvYyBkcmF3cmVzdCB7fSB7CiAgICBnbG9iYWwgcGhhc2Ugc3RvcHBlZCByZWRpc3BsYXlpbmcgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgZGF0ZW1vZGUgdG9kbyBkaXNwbGF5b3JkZXIgbmNsZWZ0CiAgICBnbG9iYWwgbnVtY29tbWl0cyBuY211cGRhdGUKICAgIGdsb2JhbCBuZXh0dXBkYXRlIHN0YXJ0bXNlY3MgcmV2bGlzdG9yZGVyCgogICAgc2V0IGxldmVsIFtkZWNpZGVuZXh0XQogICAgaWYgeyRsZXZlbCA+PSAwfSB7CglzZXQgcGhhc2UgZHJhd2dyYXBoCgl3aGlsZSAxIHsKCSAgICBsYXBwZW5kIGRpc3BsYXlvcmRlciBbbGluZGV4ICR0b2RvICRsZXZlbF0KCSAgICBzZXQgaGFyZCBbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXQoJICAgIGlmIHskaGFyZH0gewoJCXNldCBsZXZlbCBbZGVjaWRlbmV4dF0KCQlpZiB7JGxldmVsIDwgMH0gYnJlYWsKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JHRvZG8gIT0ge319IHsKCXB1dHMgIkVSUk9SOiBub25lIG9mIHRoZSBwZW5kaW5nIGNvbW1pdHMgY2FuIGJlIGRvbmUgeWV0OiIKCWZvcmVhY2ggcCAkdG9kbyB7CgkgICAgcHV0cyAiICAkcCAoJG5jbGVmdCgkcCkpIgoJfQogICAgfQoKICAgIGRyYXdtb3JlIDAKICAgIHNldCBwaGFzZSB7fQogICAgc2V0IGRyYXdtc2VjcyBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzfV0KICAgICNwdXRzICJvdmVyYWxsICRkcmF3bXNlY3MgbXMgZm9yICRudW1jb21taXRzIGNvbW1pdHMiCiAgICBpZiB7JHJlZGlzcGxheWluZ30gewoJaWYgeyRzdG9wcGVkID09IDAgJiYgW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCSAgICBzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAoJfQoJaWYgeyRzdG9wcGVkID09IDF9IHsKCSAgICBzZXQgc3RvcHBlZCAwCgkgICAgYWZ0ZXIgaWRsZSBkcmF3Z3JhcGgKCX0gZWxzZSB7CgkgICAgc2V0IHJlZGlzcGxheWluZyAwCgl9CiAgICB9Cn0KCnByb2MgZmluZG1hdGNoZXMge2Z9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgogICAgaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0gewoJc2V0IG1hdGNoZXMgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUgJGZvdW5kc3RyaW5nICRmXQogICAgfSBlbHNlIHsKCWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CgkgICAgc2V0IHN0ciBbc3RyaW5nIHRvbG93ZXIgJGZdCgl9IGVsc2UgewoJICAgIHNldCBzdHIgJGYKCX0KCXNldCBtYXRjaGVzIHt9CglzZXQgaSAwCgl3aGlsZSB7W3NldCBqIFtzdHJpbmcgZmlyc3QgJGZvdW5kc3RyaW5nICRzdHIgJGldXSA+PSAwfSB7CgkgICAgbGFwcGVuZCBtYXRjaGVzIFtsaXN0ICRqIFtleHByIHskaiskZm91bmRzdHJsZW4tMX1dXQoJICAgIHNldCBpIFtleHByIHskaiArICRmb3VuZHN0cmxlbn1dCgl9CiAgICB9CiAgICByZXR1cm4gJG1hdGNoZXMKfQoKcHJvYyBkb2ZpbmQge30gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZpbmRsb2MgZmluZHN0cmluZyBtYXJrZWRtYXRjaGVzIGNvbW1pdGluZm8KICAgIGdsb2JhbCBudW1jb21taXRzIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIG1haW5mb250IG5hbWVmb250IGNhbnYgY2FudjIgY2FudjMgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgoKICAgIHN0b3BmaW5kcHJvYwogICAgdW5tYXJrbWF0Y2hlcwogICAgZm9jdXMgLgogICAgc2V0IG1hdGNoaW5nbGluZXMge30KICAgIGlmIHskZmluZGxvYyA9PSAiUGlja2F4ZSJ9IHsKCWZpbmRwYXRjaGVzCglyZXR1cm4KICAgIH0KICAgIGlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CglzZXQgZm91bmRzdHJpbmcgW3N0cmluZyB0b2xvd2VyICRmaW5kc3RyaW5nXQogICAgfSBlbHNlIHsKCXNldCBmb3VuZHN0cmluZyAkZmluZHN0cmluZwogICAgfQogICAgc2V0IGZvdW5kc3RybGVuIFtzdHJpbmcgbGVuZ3RoICRmaW5kc3RyaW5nXQogICAgaWYgeyRmb3VuZHN0cmxlbiA9PSAwfSByZXR1cm4KICAgIGlmIHskZmluZGxvYyA9PSAiRmlsZXMifSB7CglmaW5kZmlsZXMKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IG9sZHNlbCAtMQogICAgfSBlbHNlIHsKCXNldCBvbGRzZWwgJHNlbGVjdGVkbGluZQogICAgfQogICAgc2V0IGRpZHNlbCAwCiAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50fQogICAgZm9yIHtzZXQgbCAwfSB7JGwgPCAkbnVtY29tbWl0c30ge2luY3IgbH0gewoJc2V0IGlkICRsaW5laWQoJGwpCglzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCglzZXQgZG9lc21hdGNoIDAKCWZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgewoJICAgIGlmIHskZmluZGxvYyAhPSAiQWxsIGZpZWxkcyIgJiYgJGZpbmRsb2MgIT0gJHR5fSB7CgkJY29udGludWUKCSAgICB9CgkgICAgc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQoJICAgIGlmIHskbWF0Y2hlcyA9PSB7fX0gY29udGludWUKCSAgICBzZXQgZG9lc21hdGNoIDEKCSAgICBpZiB7JHR5ID09ICJIZWFkbGluZSJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudiAkbCAkZiAkbGluZWh0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkF1dGhvciJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudjIgJGwgJGYgJGxpbmVudGFnKCRsKSAkbWF0Y2hlcyAkbmFtZWZvbnQKCSAgICB9IGVsc2VpZiB7JHR5ID09ICJEYXRlIn0gewoJCW1hcmttYXRjaGVzICRjYW52MyAkbCAkZiAkbGluZWR0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0KCX0KCWlmIHskZG9lc21hdGNofSB7CgkgICAgbGFwcGVuZCBtYXRjaGluZ2xpbmVzICRsCgkgICAgaWYgeyEkZGlkc2VsICYmICRsID4gJG9sZHNlbH0gewoJCWZpbmRzZWxlY3RsaW5lICRsCgkJc2V0IGRpZHNlbCAxCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRtYXRjaGluZ2xpbmVzID09IHt9fSB7CgliZWxsCiAgICB9IGVsc2VpZiB7ISRkaWRzZWx9IHsKCWZpbmRzZWxlY3RsaW5lIFtsaW5kZXggJG1hdGNoaW5nbGluZXMgMF0KICAgIH0KfQoKcHJvYyBmaW5kc2VsZWN0bGluZSB7bH0gewogICAgZ2xvYmFsIGZpbmRsb2MgY29tbWVudGVuZCBjdGV4dAogICAgc2VsZWN0bGluZSAkbCAxCiAgICBpZiB7JGZpbmRsb2MgPT0gIkFsbCBmaWVsZHMiIHx8ICRmaW5kbG9jID09ICJDb21tZW50cyJ9IHsKCSMgaGlnaGxpZ2h0IHRoZSBtYXRjaGVzIGluIHRoZSBjb21tZW50cwoJc2V0IGYgWyRjdGV4dCBnZXQgMS4wICRjb21tZW50ZW5kXQoJc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQoJZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CgkgICAgc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCgkgICAgc2V0IGVuZCBbZXhwciB7W2xpbmRleCAkbWF0Y2ggMV0gKyAxfV0KCSAgICAkY3RleHQgdGFnIGFkZCBmb3VuZCAiMS4wICsgJHN0YXJ0IGMiICIxLjAgKyAkZW5kIGMiCgl9CiAgICB9Cn0KCnByb2MgZmluZG5leHQge3Jlc3RhcnR9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbWF0Y2hpbmdsaW5lc119IHsKCWlmIHskcmVzdGFydH0gewoJICAgIGRvZmluZAoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPiAkc2VsZWN0ZWRsaW5lfSB7CgkgICAgZmluZHNlbGVjdGxpbmUgJGwKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIGJlbGwKfQoKcHJvYyBmaW5kcHJldiB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7Cglkb2ZpbmQKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgcHJldiB7fQogICAgZm9yZWFjaCBsICRtYXRjaGluZ2xpbmVzIHsKCWlmIHskbCA+PSAkc2VsZWN0ZWRsaW5lfSBicmVhawoJc2V0IHByZXYgJGwKICAgIH0KICAgIGlmIHskcHJldiAhPSB7fX0gewoJZmluZHNlbGVjdGxpbmUgJHByZXYKICAgIH0gZWxzZSB7CgliZWxsCiAgICB9Cn0KCnByb2MgZmluZGxvY2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGZpbmRsb2MgZmluZHR5cGUgZmluZHR5cGVtZW51CiAgICBpZiB7JGZpbmRsb2MgPT0gIlBpY2theGUifSB7CglzZXQgZmluZHR5cGUgRXhhY3QKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgICRmaW5kdHlwZW1lbnUgZW50cnljb25mIDEgLXN0YXRlICRzdGF0ZQogICAgJGZpbmR0eXBlbWVudSBlbnRyeWNvbmYgMiAtc3RhdGUgJHN0YXRlCn0KCnByb2Mgc3RvcGZpbmRwcm9jIHt7ZG9uZSAwfX0gewogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZSBmaW5kaWRzCiAgICBnbG9iYWwgY3RleHQgZmluZG9sZGN1cnNvciBwaGFzZSBtYWluY3Vyc29yIHRleHRjdXJzb3IKICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcwoKICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kcHJvY3BpZF19IHsKCWlmIHshJGRvbmV9IHsKCSAgICBjYXRjaCB7ZXhlYyBraWxsICRmaW5kcHJvY3BpZH0KCX0KCWNhdGNoIHtjbG9zZSAkZmluZHByb2NmaWxlfQoJdW5zZXQgZmluZHByb2NwaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZGlucHJvZ3Jlc3NdfSB7Cgl1bnNldCBmaW5kaW5wcm9ncmVzcwoJaWYgeyRwaGFzZSAhPSAiaW5jcmRyYXcifSB7CgkgICAgLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgoJICAgIHNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKCX0KICAgIH0KfQoKcHJvYyBmaW5kcGF0Y2hlcyB7fSB7CiAgICBnbG9iYWwgZmluZHN0cmluZyBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cwogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZQogICAgZ2xvYmFsIGZpbmRkaWRzZWwgY3RleHQgbGluZWlkIGZpbmRpbnByb2dyZXNzCiAgICBnbG9iYWwgZmluZGluc2VydHBvcwoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSByZXR1cm4KCiAgICAjIG1ha2UgYSBsaXN0IG9mIGFsbCB0aGUgaWRzIHRvIHNlYXJjaCwgc3RhcnRpbmcgYXQgdGhlIG9uZQogICAgIyBhZnRlciB0aGUgc2VsZWN0ZWQgbGluZSAoaWYgYW55KQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgbCAkc2VsZWN0ZWRsaW5lCiAgICB9IGVsc2UgewoJc2V0IGwgLTEKICAgIH0KICAgIHNldCBpbnB1dGlkcyB7fQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCAkbnVtY29tbWl0c30ge2luY3IgaX0gewoJaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGwgMAoJfQoJYXBwZW5kIGlucHV0aWRzICRsaW5laWQoJGwpICJcbiIKICAgIH0KCiAgICBpZiB7W2NhdGNoIHsKCXNldCBmIFtvcGVuIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC1zIC1yIC1TJGZpbmRzdHJpbmcgXAoJCQkgPDwgJGlucHV0aWRzXSByXQogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igc3RhcnRpbmcgc2VhcmNoIHByb2Nlc3M6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgZmluZGluc2VydHBvcyBlbmQKICAgIHNldCBmaW5kcHJvY2ZpbGUgJGYKICAgIHNldCBmaW5kcHJvY3BpZCBbcGlkICRmXQogICAgZmNvbmZpZ3VyZSAkZiAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRmIHJlYWRhYmxlIHJlYWRmaW5kcHJvYwogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKfQoKcHJvYyByZWFkZmluZHByb2Mge30gewogICAgZ2xvYmFsIGZpbmRwcm9jZmlsZSBmaW5kZGlkc2VsCiAgICBnbG9iYWwgaWRsaW5lIG1hdGNoaW5nbGluZXMgZmluZGluc2VydHBvcwoKICAgIHNldCBuIFtnZXRzICRmaW5kcHJvY2ZpbGUgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRmaW5kcHJvY2ZpbGVdfSB7CgkgICAgc3RvcGZpbmRwcm9jIDEKCSAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CgkJYmVsbAoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbcmVnZXhwIHteWzAtOWEtZl17NDB9fSAkbGluZSBpZF19IHsKCWVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQtZGlmZi10cmVlIG91dHB1dDogJGxpbmUiCglzdG9wZmluZHByb2MKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglwdXRzIHN0ZGVyciAic3B1cmlvdXMgaWQ6ICRpZCIKCXJldHVybgogICAgfQogICAgc2V0IGwgJGlkbGluZSgkaWQpCiAgICBpbnNlcnRtYXRjaCAkbCAkaWQKfQoKcHJvYyBpbnNlcnRtYXRjaCB7bCBpZH0gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGluc2VydHBvcyBmaW5kZGlkc2VsCgogICAgaWYgeyRmaW5kaW5zZXJ0cG9zID09ICJlbmQifSB7CglpZiB7JG1hdGNoaW5nbGluZXMgIT0ge30gJiYgJGwgPCBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdfSB7CgkgICAgc2V0IG1hdGNoaW5nbGluZXMgW2xpbnNlcnQgJG1hdGNoaW5nbGluZXMgMCAkbF0KCSAgICBzZXQgZmluZGluc2VydHBvcyAxCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJfQogICAgfSBlbHNlIHsKCXNldCBtYXRjaGluZ2xpbmVzIFtsaW5zZXJ0ICRtYXRjaGluZ2xpbmVzICRmaW5kaW5zZXJ0cG9zICRsXQoJaW5jciBmaW5kaW5zZXJ0cG9zCiAgICB9CiAgICBtYXJraGVhZGxpbmUgJGwgJGlkCiAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSAkbAoJc2V0IGZpbmRkaWRzZWwgMQogICAgfQp9Cgpwcm9jIGZpbmRmaWxlcyB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMgbGluZWlkIGN0ZXh0CiAgICBnbG9iYWwgZmZpbGVsaW5lIGZpbmRkaWRzZWwgcGFyZW50cyBucGFyZW50cwogICAgZ2xvYmFsIGZpbmRpbnByb2dyZXNzIGZpbmRzdGFydGxpbmUgZmluZGluc2VydHBvcwogICAgZ2xvYmFsIHRyZWVkaWZmcyBmZGlmZmlkcyBmZGlmZnNuZWVkZWQgZmRpZmZwb3MKICAgIGdsb2JhbCBmaW5kbWVyZ2VmaWxlcwoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSByZXR1cm4KCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgMX1dCiAgICB9IGVsc2UgewoJc2V0IGwgMAogICAgfQogICAgc2V0IGZmaWxlbGluZSAkbAogICAgc2V0IGZpbmRzdGFydGxpbmUgJGwKICAgIHNldCBkaWZmc25lZWRlZCB7fQogICAgc2V0IGZkaWZmc25lZWRlZCB7fQogICAgd2hpbGUgMSB7CglzZXQgaWQgJGxpbmVpZCgkbCkKCWlmIHskZmluZG1lcmdlZmlsZXMgfHwgJG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJICAgIGZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCQlpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoW2xpc3QgJGlkICRwXSldfSB7CgkJICAgIGFwcGVuZCBkaWZmc25lZWRlZCAiJGlkICRwXG4iCgkJICAgIGxhcHBlbmQgZmRpZmZzbmVlZGVkIFtsaXN0ICRpZCAkcF0KCQl9CgkgICAgfQoJfQoJaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGwgMAoJfQoJaWYgeyRsID09ICRmaW5kc3RhcnRsaW5lfSBicmVhawogICAgfQoKICAgICMgc3RhcnQgb2ZmIGEgZ2l0LWRpZmYtdHJlZSBwcm9jZXNzIGlmIG5lZWRlZAogICAgaWYgeyRkaWZmc25lZWRlZCBuZSB7fX0gewoJaWYge1tjYXRjaCB7CgkgICAgc2V0IGRmIFtvcGVuIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtciAtLXN0ZGluIDw8ICRkaWZmc25lZWRlZF0gcl0KCX0gZXJyIF19IHsKCSAgICBlcnJvcl9wb3B1cCAiRXJyb3Igc3RhcnRpbmcgc2VhcmNoIHByb2Nlc3M6ICRlcnIiCgkgICAgcmV0dXJuCgl9CgljYXRjaCB7dW5zZXQgZmRpZmZpZHN9CglzZXQgZmRpZmZwb3MgMAoJZmNvbmZpZ3VyZSAkZGYgLWJsb2NraW5nIDAKCWZpbGVldmVudCAkZGYgcmVhZGFibGUgW2xpc3QgcmVhZGZpbGVkaWZmcyAkZGZdCiAgICB9CgogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgc2V0IGZpbmRpbnNlcnRwb3MgZW5kCiAgICBzZXQgaWQgJGxpbmVpZCgkbCkKICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAwXQogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKICAgIGZpbmRjb250IFtsaXN0ICRpZCAkcF0KICAgIHVwZGF0ZQp9Cgpwcm9jIHJlYWRmaWxlZGlmZnMge2RmfSB7CiAgICBnbG9iYWwgZmluZGlkcyBmZGlmZmlkcyBmZGlmZnMKCiAgICBzZXQgbiBbZ2V0cyAkZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRkZl19IHsKCSAgICBkb25lZmlsZWRpZmYKCSAgICBpZiB7W2NhdGNoIHtjbG9zZSAkZGZ9IGVycl19IHsKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkVycm9yIGluIGdpdC1kaWZmLXRyZWU6ICRlcnIiCgkgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXX0gewoJCXNldCBpZHMgJGZpbmRpZHMKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkNvdWxkbid0IGZpbmQgZGlmZnMgZm9yIHskaWRzfSIKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteKFswLTlhLWZdezQwfSkgXChmcm9tIChbMC05YS1mXXs0MH0pXCl9ICRsaW5lIG1hdGNoIGlkIHBdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IHN0cmluZyBvZiBkaWZmcwoJZG9uZWZpbGVkaWZmCglzZXQgZmRpZmZpZHMgW2xpc3QgJGlkICRwXQoJc2V0IGZkaWZmcyB7fQogICAgfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2ggIjoqIiAkbGluZV19IHsKCWxhcHBlbmQgZmRpZmZzIFtsaW5kZXggJGxpbmUgNV0KICAgIH0KfQoKcHJvYyBkb25lZmlsZWRpZmYge30gewogICAgZ2xvYmFsIGZkaWZmaWRzIGZkaWZmcyB0cmVlZGlmZnMgZmluZGlkcwogICAgZ2xvYmFsIGZkaWZmc25lZWRlZCBmZGlmZnBvcwoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmRpZmZpZHNdfSB7Cgl3aGlsZSB7W2xpbmRleCAkZmRpZmZzbmVlZGVkICRmZGlmZnBvc10gbmUgJGZkaWZmaWRzCgkgICAgICAgJiYgJGZkaWZmcG9zIDwgW2xsZW5ndGggJGZkaWZmc25lZWRlZF19IHsKCSAgICAjIGdpdC1kaWZmLXRyZWUgZG9lc24ndCBvdXRwdXQgYW55dGhpbmcgZm9yIGEgY29tbWl0CgkgICAgIyB3aGljaCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZwoJICAgIHNldCBudWxsaWRzIFtsaW5kZXggJGZkaWZmc25lZWRlZCAkZmRpZmZwb3NdCgkgICAgc2V0IHRyZWVkaWZmcygkbnVsbGlkcykge30KCSAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRpZHNdICYmICRudWxsaWRzIGVxICRmaW5kaWRzfSB7CgkJdW5zZXQgZmluZGlkcwoJCWZpbmRjb250ICRudWxsaWRzCgkgICAgfQoJICAgIGluY3IgZmRpZmZwb3MKCX0KCWluY3IgZmRpZmZwb3MKCglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGZkaWZmaWRzKV19IHsKCSAgICBzZXQgdHJlZWRpZmZzKCRmZGlmZmlkcykgJGZkaWZmcwoJfQoJaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXSAmJiAkZmRpZmZpZHMgZXEgJGZpbmRpZHN9IHsKCSAgICB1bnNldCBmaW5kaWRzCgkgICAgZmluZGNvbnQgJGZkaWZmaWRzCgl9CiAgICB9Cn0KCnByb2MgZmluZGNvbnQge2lkc30gewogICAgZ2xvYmFsIGZpbmRpZHMgdHJlZWRpZmZzIHBhcmVudHMgbnBhcmVudHMKICAgIGdsb2JhbCBmZmlsZWxpbmUgZmluZHN0YXJ0bGluZSBmaW5kZGlkc2VsCiAgICBnbG9iYWwgbGluZWlkIG51bWNvbW1pdHMgbWF0Y2hpbmdsaW5lcyBmaW5kaW5wcm9ncmVzcwogICAgZ2xvYmFsIGZpbmRtZXJnZWZpbGVzCgogICAgc2V0IGlkIFtsaW5kZXggJGlkcyAwXQogICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCiAgICBzZXQgcGkgW2xzZWFyY2ggLWV4YWN0ICRwYXJlbnRzKCRpZCkgJHBdCiAgICBzZXQgbCAkZmZpbGVsaW5lCiAgICB3aGlsZSAxIHsKCWlmIHskZmluZG1lcmdlZmlsZXMgfHwgJG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCQlzZXQgZmluZGlkcyAkaWRzCgkJc2V0IGZmaWxlbGluZSAkbAoJCXJldHVybgoJICAgIH0KCSAgICBzZXQgZG9lc21hdGNoIDAKCSAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcygkaWRzKSB7CgkJc2V0IHggW2ZpbmRtYXRjaGVzICRmXQoJCWlmIHskeCAhPSB7fX0gewoJCSAgICBzZXQgZG9lc21hdGNoIDEKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJICAgIGlmIHskZG9lc21hdGNofSB7CgkJaW5zZXJ0bWF0Y2ggJGwgJGlkCgkJc2V0IHBpICRucGFyZW50cygkaWQpCgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgcGkgJG5wYXJlbnRzKCRpZCkKCX0KCWlmIHtbaW5jciBwaV0gPj0gJG5wYXJlbnRzKCRpZCl9IHsKCSAgICBzZXQgcGkgMAoJICAgIGlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJCXNldCBsIDAKCSAgICB9CgkgICAgaWYgeyRsID09ICRmaW5kc3RhcnRsaW5lfSBicmVhawoJICAgIHNldCBpZCAkbGluZWlkKCRsKQoJfQoJc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRwaV0KCXNldCBpZHMgW2xpc3QgJGlkICRwXQogICAgfQogICAgc3RvcGZpbmRwcm9jCiAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CgliZWxsCiAgICB9Cn0KCiMgbWFyayBhIGNvbW1pdCBhcyBtYXRjaGluZyBieSBwdXR0aW5nIGEgeWVsbG93IGJhY2tncm91bmQKIyBiZWhpbmQgdGhlIGhlYWRsaW5lCnByb2MgbWFya2hlYWRsaW5lIHtsIGlkfSB7CiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBsaW5laHRhZyBjb21taXRpbmZvCgogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdCAkYmJveCAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KICAgICRjYW52IGxvd2VyICR0Cn0KCiMgbWFyayB0aGUgYml0cyBvZiBhIGhlYWRsaW5lLCBhdXRob3Igb3IgZGF0ZSB0aGF0IG1hdGNoIGEgZmluZCBzdHJpbmcKcHJvYyBtYXJrbWF0Y2hlcyB7Y2FudiBsIHN0ciB0YWcgbWF0Y2hlcyBmb250fSB7CiAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkdGFnXQogICAgc2V0IHgwIFtsaW5kZXggJGJib3ggMF0KICAgIHNldCB5MCBbbGluZGV4ICRiYm94IDFdCiAgICBzZXQgeTEgW2xpbmRleCAkYmJveCAzXQogICAgZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CglzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCXNldCBlbmQgW2xpbmRleCAkbWF0Y2ggMV0KCWlmIHskc3RhcnQgPiAkZW5kfSBjb250aW51ZQoJc2V0IHhvZmYgW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JHN0YXJ0LTF9XV1dCglzZXQgeGxlbiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByIHskZW5kfV1dXQoJc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0IFtleHByIHskeDArJHhvZmZ9XSAkeTAgXAoJCSAgIFtleHByIHskeDArJHhsZW4rMn1dICR5MSBcCgkJICAgLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCgkkY2FudiBsb3dlciAkdAogICAgfQp9Cgpwcm9jIHVubWFya21hdGNoZXMge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGlkcwogICAgYWxsY2FudnMgZGVsZXRlIG1hdGNoZXMKICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQogICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9Cn0KCnByb2Mgc2VsY2FudmxpbmUge3cgeCB5fSB7CiAgICBnbG9iYWwgY2FudiBjYW52eTAgY3RleHQgbGluZXNwYwogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZyByb3d0ZXh0eAogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIHNldCBsIFtleHByIHtpbnQoKCR5IC0gJGNhbnZ5MCkgLyAkbGluZXNwYyArIDAuNSl9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfQogICAgaWYgeyR3IGVxICRjYW52fSB7CglpZiB7IVtpbmZvIGV4aXN0cyByb3d0ZXh0eCgkbCldIHx8ICR4IDwgJHJvd3RleHR4KCRsKX0gcmV0dXJuCiAgICB9CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyBjb21taXRfZGVzY3JpcHRvciB7cH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8KICAgIHNldCBsICIuLi4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJc2V0IGwgW2xpbmRleCAkY29tbWl0aW5mbygkcCkgMF0KICAgIH0KICAgIHJldHVybiAiJHAgKCRsKSIKfQoKIyBhcHBlbmQgc29tZSB0ZXh0IHRvIHRoZSBjdGV4dCB3aWRnZXQsIGFuZCBtYWtlIGFueSBTSEExIElECiMgdGhhdCB3ZSBrbm93IGFib3V0IGJlIGEgY2xpY2thYmxlIGxpbmsuCnByb2MgYXBwZW5kd2l0aGxpbmtzIHt0ZXh0fSB7CiAgICBnbG9iYWwgY3RleHQgaWRsaW5lIGxpbmtudW0KCiAgICBzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJHRleHQKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIHNldCBsaW5rcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSB7WzAtOWEtZl17NDB9fSAkdGV4dF0KICAgIGZvcmVhY2ggbCAkbGlua3MgewoJc2V0IHMgW2xpbmRleCAkbCAwXQoJc2V0IGUgW2xpbmRleCAkbCAxXQoJc2V0IGxpbmtpZCBbc3RyaW5nIHJhbmdlICR0ZXh0ICRzICRlXQoJaWYgeyFbaW5mbyBleGlzdHMgaWRsaW5lKCRsaW5raWQpXX0gY29udGludWUKCWluY3IgZQoJJGN0ZXh0IHRhZyBhZGQgbGluayAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGFkZCBsaW5rJGxpbmtudW0gIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBiaW5kIGxpbmskbGlua251bSA8MT4gW2xpc3Qgc2VsZWN0bGluZSAkaWRsaW5lKCRsaW5raWQpIDFdCglpbmNyIGxpbmtudW0KICAgIH0KICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KfQoKcHJvYyBzZWxlY3RsaW5lIHtsIGlzbmV3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjb21taXRpbmZvIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4KICAgIGdsb2JhbCBjZmxpc3QgY3VycmVudGlkIHNoYTFlbnRyeQogICAgZ2xvYmFsIGNvbW1lbnRlbmQgaWR0YWdzIGlkbGluZSBsaW5rbnVtCiAgICBnbG9iYWwgbWVyZ2VtYXgKCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgIG5vcm1hbGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIGxpbmVpZCgkbCldIHx8ICFbaW5mbyBleGlzdHMgbGluZWh0YWcoJGwpXX0gcmV0dXJuCiAgICAkY2FudiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYgbG93ZXIgJHQKICAgICRjYW52MiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjIgY3JlYXRlIHJlY3QgWyRjYW52MiBiYm94ICRsaW5lbnRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYyIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYyIGxvd2VyICR0CiAgICAkY2FudjMgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYzIGNyZWF0ZSByZWN0IFskY2FudjMgYmJveCAkbGluZWR0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MyBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52MyBsb3dlciAkdAogICAgc2V0IHkgW2V4cHIgeyRjYW52eTAgKyAkbCAqICRsaW5lc3BjfV0KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIHNldCB5dG9wIFtleHByIHskeSAtICRsaW5lc3BjIC0gMX1dCiAgICBzZXQgeWJvdCBbZXhwciB7JHkgKyAkbGluZXNwYyArIDF9XQogICAgc2V0IHdub3cgWyRjYW52IHl2aWV3XQogICAgc2V0IHd0b3AgW2V4cHIge1tsaW5kZXggJHdub3cgMF0gKiAkeW1heH1dCiAgICBzZXQgd2JvdCBbZXhwciB7W2xpbmRleCAkd25vdyAxXSAqICR5bWF4fV0KICAgIHNldCB3aCBbZXhwciB7JHdib3QgLSAkd3RvcH1dCiAgICBzZXQgbmV3dG9wICR3dG9wCiAgICBpZiB7JHl0b3AgPCAkd3RvcH0gewoJaWYgeyR5Ym90IDwgJHd0b3B9IHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeSAtICR3aCAvIDIuMH1dCgl9IGVsc2UgewoJICAgIHNldCBuZXd0b3AgJHl0b3AKCSAgICBpZiB7JG5ld3RvcCA+ICR3dG9wIC0gJGxpbmVzcGN9IHsKCQlzZXQgbmV3dG9wIFtleHByIHskd3RvcCAtICRsaW5lc3BjfV0KCSAgICB9Cgl9CiAgICB9IGVsc2VpZiB7JHlib3QgPiAkd2JvdH0gewoJaWYgeyR5dG9wID4gJHdib3R9IHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeSAtICR3aCAvIDIuMH1dCgl9IGVsc2UgewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5Ym90IC0gJHdofV0KCSAgICBpZiB7JG5ld3RvcCA8ICR3dG9wICsgJGxpbmVzcGN9IHsKCQlzZXQgbmV3dG9wIFtleHByIHskd3RvcCArICRsaW5lc3BjfV0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JG5ld3RvcCAhPSAkd3RvcH0gewoJaWYgeyRuZXd0b3AgPCAwfSB7CgkgICAgc2V0IG5ld3RvcCAwCgl9CglhbGxjYW52cyB5dmlldyBtb3ZldG8gW2V4cHIgeyRuZXd0b3AgKiAxLjAgLyAkeW1heH1dCiAgICB9CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNlbGVjdGxpbmUgJGwgMF0KICAgIH0KCiAgICBzZXQgc2VsZWN0ZWRsaW5lICRsCgogICAgc2V0IGlkICRsaW5laWQoJGwpCiAgICBzZXQgY3VycmVudGlkICRpZAogICAgJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgICRzaGExZW50cnkgaW5zZXJ0IDAgJGlkCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiBmcm9tIDAKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIHRvIGVuZAoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgc2V0IGxpbmtudW0gMAogICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLjAgMC4wCiAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLjAgbGVmdAogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJBdXRob3I6IFtsaW5kZXggJGluZm8gMV0gICRkYXRlXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDRdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogW2xpbmRleCAkaW5mbyAzXSAgJGRhdGVcbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiVGFnczoiCglmb3JlYWNoIHRhZyAkaWR0YWdzKCRpZCkgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJHRhZyIKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KIAogICAgc2V0IGNvbW1lbnQge30KICAgIGlmIHskbnBhcmVudHMoJGlkKSA+IDF9IHsKCXNldCBucCAwCglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgaWYgeyRucCA+PSAkbWVyZ2VtYXh9IHsKCQlzZXQgdGFnIG1tYXgKCSAgICB9IGVsc2UgewoJCXNldCB0YWcgbSRucAoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50OiAiICR0YWcKCSAgICBhcHBlbmR3aXRobGlua3MgW2NvbW1pdF9kZXNjcmlwdG9yICRwXQoJICAgIGluY3IgbnAKCX0KICAgIH0gZWxzZSB7CglpZiB7W2luZm8gZXhpc3RzIHBhcmVudHMoJGlkKV19IHsKCSAgICBmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkJYXBwZW5kIGNvbW1lbnQgIlBhcmVudDogW2NvbW1pdF9kZXNjcmlwdG9yICRwXVxuIgoJICAgIH0KCX0KICAgIH0KCiAgICBpZiB7W2luZm8gZXhpc3RzIGNoaWxkcmVuKCRpZCldfSB7Cglmb3JlYWNoIGMgJGNoaWxkcmVuKCRpZCkgewoJICAgIGFwcGVuZCBjb21tZW50ICJDaGlsZDogIFtjb21taXRfZGVzY3JpcHRvciAkY11cbiIKCX0KICAgIH0KICAgIGFwcGVuZCBjb21tZW50ICJcbiIKICAgIGFwcGVuZCBjb21tZW50IFtsaW5kZXggJGluZm8gNV0KCiAgICAjIG1ha2UgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgU0hBMSBJRCBiZSBhIGNsaWNrYWJsZSBsaW5rCiAgICBhcHBlbmR3aXRobGlua3MgJGNvbW1lbnQKCiAgICAkY3RleHQgdGFnIGRlbGV0ZSBDb21tZW50cwogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgY29tbWVudGVuZCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCgogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKICAgICRjZmxpc3QgaW5zZXJ0IGVuZCAiQ29tbWVudHMiCiAgICBpZiB7JG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJc3RhcnRkaWZmICRpZAogICAgfSBlbHNlaWYgeyRucGFyZW50cygkaWQpID4gMX0gewoJbWVyZ2VkaWZmICRpZAogICAgfQp9Cgpwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlyfV0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHVuc2VsZWN0bGluZSB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCgogICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KICAgIGFsbGNhbnZzIGRlbGV0ZSBzZWNzZWwKfQoKcHJvYyBhZGR0b2hpc3Rvcnkge2NtZH0gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAwCgkmJiBbbGluZGV4ICRoaXN0b3J5IFtleHByIHskaGlzdG9yeWluZGV4IC0gMX1dXSA9PSAkY21kfSB7CglyZXR1cm4KICAgIH0KCiAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJc2V0IGhpc3RvcnkgW2xyZXBsYWNlICRoaXN0b3J5ICRoaXN0b3J5aW5kZXggZW5kICRjbWRdCiAgICB9IGVsc2UgewoJbGFwcGVuZCBoaXN0b3J5ICRjbWQKICAgIH0KICAgIGluY3IgaGlzdG9yeWluZGV4CiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0gZWxzZSB7CgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KICAgIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBnb2JhY2sge30gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CglpbmNyIGhpc3RvcnlpbmRleCAtMQoJc2V0IGNtZCBbbGluZGV4ICRoaXN0b3J5IFtleHByIHskaGlzdG9yeWluZGV4IC0gMX1dXQoJZXZhbCAkY21kCgkuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYgeyRoaXN0b3J5aW5kZXggPD0gMX0gewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9Cn0KCnByb2MgZ29mb3J3IHt9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgY21kIFtsaW5kZXggJGhpc3RvcnkgJGhpc3RvcnlpbmRleF0KCWluY3IgaGlzdG9yeWluZGV4CglldmFsICRjbWQKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4ID49IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIG1lcmdlZGlmZiB7aWR9IHsKICAgIGdsb2JhbCBwYXJlbnRzIGRpZmZtZXJnZWlkIGRpZmZvcHRzIG1kaWZmZmQKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0CgogICAgc2V0IGRpZmZtZXJnZWlkICRpZAogICAgY2F0Y2gge3Vuc2V0IGRpZmZmaWxlc3RhcnR9CiAgICAjIHRoaXMgZG9lc24ndCBzZWVtIHRvIGFjdHVhbGx5IGFmZmVjdCBhbnl0aGluZy4uLgogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdC1kaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLS1jYyAkaWRdCiAgICBpZiB7W2NhdGNoIHtzZXQgbWRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBnZXR0aW5nIG1lcmdlIGRpZmZzOiAkZXJyIgoJcmV0dXJuCiAgICB9CiAgICBmY29uZmlndXJlICRtZGYgLWJsb2NraW5nIDAKICAgIHNldCBtZGlmZmZkKCRpZCkgJG1kZgogICAgZmlsZWV2ZW50ICRtZGYgcmVhZGFibGUgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWRmICRpZF0KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KfQoKcHJvYyBnZXRtZXJnZWRpZmZsaW5lIHttZGYgaWR9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBjdGV4dCBjZmxpc3QgbmV4dHVwZGF0ZSBucGFyZW50cyBtZXJnZW1heAogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQKCiAgICBzZXQgbiBbZ2V0cyAkbWRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkbWRmXX0gewoJICAgIGNsb3NlICRtZGYKCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdIHx8ICRpZCAhPSAkZGlmZm1lcmdlaWR9IHsKCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYge1tyZWdleHAge15kaWZmIC0tY2MgKC4qKX0gJGxpbmUgbWF0Y2ggZm5hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCXNldCBoZXJlIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCXNldCBpIFskY2ZsaXN0IGluZGV4IGVuZF0KCSRjdGV4dCBtYXJrIHNldCBmbWFyay4kaSAkaGVyZQoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0CglzZXQgZGlmZmZpbGVzdGFydChbZXhwciB7JGktMX1dKSAkaGVyZQoJJGNmbGlzdCBpbnNlcnQgZW5kICRmbmFtZQoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRmbmFtZV0pIC8gMn1dCglzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCgkkY3RleHQgaW5zZXJ0IGVuZCAiJHBhZCAkZm5hbWUgJHBhZFxuIiBmaWxlc2VwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAfSAkbGluZV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRsaW5lXSB8fCBbcmVnZXhwIHteaW5kZXh9ICRsaW5lXX0gewoJIyBkbyBub3RoaW5nCiAgICB9IGVsc2UgewoJIyBwYXJzZSB0aGUgcHJlZml4IC0gb25lICcgJywgJy0nIG9yICcrJyBmb3IgZWFjaCBwYXJlbnQKCXNldCBucCAkbnBhcmVudHMoJGlkKQoJc2V0IHNwYWNlcyB7fQoJc2V0IG1pbnVzZXMge30KCXNldCBwbHVzZXMge30KCXNldCBpc2JhZCAwCglmb3Ige3NldCBqIDB9IHskaiA8ICRucH0ge2luY3Igan0gewoJICAgIHNldCBjIFtzdHJpbmcgcmFuZ2UgJGxpbmUgJGogJGpdCgkgICAgaWYgeyRjID09ICIgIn0gewoJCWxhcHBlbmQgc3BhY2VzICRqCgkgICAgfSBlbHNlaWYgeyRjID09ICItIn0gewoJCWxhcHBlbmQgbWludXNlcyAkagoJICAgIH0gZWxzZWlmIHskYyA9PSAiKyJ9IHsKCQlsYXBwZW5kIHBsdXNlcyAkagoJICAgIH0gZWxzZSB7CgkJc2V0IGlzYmFkIDEKCQlicmVhawoJICAgIH0KCX0KCXNldCB0YWdzIHt9CglzZXQgbnVtIHt9CglpZiB7ISRpc2JhZCAmJiAkbWludXNlcyBuZSB7fSAmJiAkcGx1c2VzIGVxIHt9fSB7CgkgICAgIyBsaW5lIGRvZXNuJ3QgYXBwZWFyIGluIHJlc3VsdCwgcGFyZW50cyBpbiAkbWludXNlcyBoYXZlIHRoZSBsaW5lCgkgICAgc2V0IG51bSBbbGluZGV4ICRtaW51c2VzIDBdCgl9IGVsc2VpZiB7ISRpc2JhZCAmJiAkcGx1c2VzIG5lIHt9ICYmICRtaW51c2VzIGVxIHt9fSB7CgkgICAgIyBsaW5lIGFwcGVhcnMgaW4gcmVzdWx0LCBwYXJlbnRzIGluICRwbHVzZXMgZG9uJ3QgaGF2ZSB0aGUgbGluZQoJICAgIGxhcHBlbmQgdGFncyBtcmVzdWx0CgkgICAgc2V0IG51bSBbbGluZGV4ICRzcGFjZXMgMF0KCX0KCWlmIHskbnVtIG5lIHt9fSB7CgkgICAgaWYgeyRudW0gPj0gJG1lcmdlbWF4fSB7CgkJc2V0IG51bSAibWF4IgoJICAgIH0KCSAgICBsYXBwZW5kIHRhZ3MgbSRudW0KCX0KCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiAkdGFncwogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJaW5jciBuZXh0dXBkYXRlIDEwMAoJZmlsZWV2ZW50ICRtZGYgcmVhZGFibGUge30KCXVwZGF0ZQoJZmlsZWV2ZW50ICRtZGYgcmVhZGFibGUgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWRmICRpZF0KICAgIH0KfQoKcHJvYyBzdGFydGRpZmYge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBkaWZmaWRzIHRyZWVwZW5kaW5nIGRpZmZtZXJnZWlkCgogICAgc2V0IGRpZmZpZHMgJGlkcwogICAgY2F0Y2gge3Vuc2V0IGRpZmZtZXJnZWlkfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRpZHMKCX0KICAgIH0gZWxzZSB7CglhZGR0b2NmbGlzdCAkaWRzCiAgICB9Cn0KCnByb2MgYWRkdG9jZmxpc3Qge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBjZmxpc3QKICAgIGZvcmVhY2ggZiAkdHJlZWRpZmZzKCRpZHMpIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZgogICAgfQogICAgZ2V0YmxvYmRpZmZzICRpZHMKfQoKcHJvYyBnZXR0cmVlZGlmZnMge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmIHBhcmVudHMgdHJlZXBlbmRpbmcKICAgIHNldCB0cmVlcGVuZGluZyAkaWRzCiAgICBzZXQgdHJlZWRpZmYge30KICAgIGlmIHtbY2F0Y2ggXAoJIHtzZXQgZ2R0ZiBbb3BlbiBbY29uY2F0IHwgZ2l0LWRpZmYtdHJlZSAtLW5vLWNvbW1pdC1pZCAtciAkaWRzXSByXX0gXAoJXX0gcmV0dXJuCiAgICBmY29uZmlndXJlICRnZHRmIC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGdkdGYgcmVhZGFibGUgW2xpc3QgZ2V0dHJlZWRpZmZsaW5lICRnZHRmICRpZHNdCn0KCnByb2MgZ2V0dHJlZWRpZmZsaW5lIHtnZHRmIGlkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmIHRyZWVkaWZmcyB0cmVlcGVuZGluZyBkaWZmaWRzIGRpZmZtZXJnZWlkCgogICAgc2V0IG4gW2dldHMgJGdkdGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHshW2VvZiAkZ2R0Zl19IHJldHVybgoJY2xvc2UgJGdkdGYKCXNldCB0cmVlZGlmZnMoJGlkcykgJHRyZWVkaWZmCgl1bnNldCB0cmVlcGVuZGluZwoJaWYgeyRpZHMgIT0gJGRpZmZpZHN9IHsKCSAgICBnZXR0cmVlZGlmZnMgJGRpZmZpZHMKCX0gZWxzZSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF19IHsKCQljb250bWVyZ2VkaWZmICRpZHMKCSAgICB9IGVsc2UgewoJCWFkZHRvY2ZsaXN0ICRpZHMKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIHNldCBmaWxlIFtsaW5kZXggJGxpbmUgNV0KICAgIGxhcHBlbmQgdHJlZWRpZmYgJGZpbGUKfQoKcHJvYyBnZXRibG9iZGlmZnMge2lkc30gewogICAgZ2xvYmFsIGRpZmZvcHRzIGJsb2JkaWZmZmQgZGlmZmlkcyBlbnYgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQgbmV4dHVwZGF0ZSBkaWZmaW5oZHIgdHJlZWRpZmZzCgogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdC1kaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLXIgLXAgLUMgJGlkc10KICAgIGlmIHtbY2F0Y2gge3NldCBiZGYgW29wZW4gJGNtZCByXX0gZXJyXX0gewoJcHV0cyAiZXJyb3IgZ2V0dGluZyBkaWZmczogJGVyciIKCXJldHVybgogICAgfQogICAgc2V0IGRpZmZpbmhkciAwCiAgICBmY29uZmlndXJlICRiZGYgLWJsb2NraW5nIDAKICAgIHNldCBibG9iZGlmZmZkKCRpZHMpICRiZGYKICAgIHNldCBjdXJkaWZmdGFnIENvbW1lbnRzCiAgICBzZXQgY3VydGFnc3RhcnQgMC4wCiAgICBjYXRjaCB7dW5zZXQgZGlmZmZpbGVzdGFydH0KICAgIGZpbGVldmVudCAkYmRmIHJlYWRhYmxlIFtsaXN0IGdldGJsb2JkaWZmbGluZSAkYmRmICRkaWZmaWRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQp9Cgpwcm9jIGdldGJsb2JkaWZmbGluZSB7YmRmIGlkc30gewogICAgZ2xvYmFsIGRpZmZpZHMgYmxvYmRpZmZmZCBjdGV4dCBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgZGlmZm5leHRoZWFkIGRpZmZuZXh0bm90ZSBkaWZmZmlsZXN0YXJ0CiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBkaWZmaW5oZHIgdHJlZWRpZmZzCgogICAgc2V0IG4gW2dldHMgJGJkZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJGJkZl19IHsKCSAgICBjbG9zZSAkYmRmCgkgICAgaWYgeyRpZHMgPT0gJGRpZmZpZHMgJiYgJGJkZiA9PSAkYmxvYmRpZmZmZCgkaWRzKX0gewoJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHskaWRzICE9ICRkaWZmaWRzIHx8ICRiZGYgIT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYge1tyZWdleHAge15kaWZmIC0tZ2l0IGEvKC4qKSBiLyguKil9ICRsaW5lIG1hdGNoIGZuYW1lIG5ld25hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCXNldCBjdXJ0YWdzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgaGVhZGVyICRuZXduYW1lCglzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkZGlmZmlkcykgJGZuYW1lXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgZGlmZmZpbGVzdGFydCgkaSkgJGhlcmUKCSAgICBpbmNyIGkKCSAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuJGkgJGhlcmUKCSAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLiRpIGxlZnQKCX0KCWlmIHskbmV3bmFtZSAhPSAkZm5hbWV9IHsKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkZGlmZmlkcykgJG5ld25hbWVdCgkgICAgaWYgeyRpID49IDB9IHsKCQlzZXQgZGlmZmZpbGVzdGFydCgkaSkgJGhlcmUKCQlpbmNyIGkKCQkkY3RleHQgbWFyayBzZXQgZm1hcmsuJGkgJGhlcmUKCQkkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLiRpIGxlZnQKCSAgICB9Cgl9CglzZXQgY3VyZGlmZnRhZyAiZjokZm5hbWUiCgkkY3RleHQgdGFnIGRlbGV0ZSAkY3VyZGlmZnRhZwoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRoZWFkZXJdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGhlYWRlciAkcGFkXG4iIGZpbGVzZXAKCXNldCBkaWZmaW5oZHIgMQogICAgfSBlbHNlaWYge1tyZWdleHAge14oLS0tfFwrXCtcKyl9ICRsaW5lXX0gewoJc2V0IGRpZmZpbmhkciAwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAIC0oWzAtOV0rKSwoWzAtOV0rKSBcKyhbMC05XSspLChbMC05XSspIEBAKC4qKX0gXAoJCSAgICRsaW5lIG1hdGNoIGYxbCBmMWMgZjJsIGYyYyByZXN0XX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGh1bmtzZXAKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlIHsKCXNldCB4IFtzdHJpbmcgcmFuZ2UgJGxpbmUgMCAwXQoJaWYgeyR4ID09ICItIiB8fCAkeCA9PSAiKyJ9IHsKCSAgICBzZXQgdGFnIFtleHByIHskeCA9PSAiKyJ9XQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBkJHRhZwoJfSBlbHNlaWYgeyR4ID09ICIgIn0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgoJfSBlbHNlaWYgeyRkaWZmaW5oZHIgfHwgJHggPT0gIlxcIn0gewoJICAgICMgZS5nLiAiXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlIgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9IGVsc2UgewoJICAgICMgU29tZXRoaW5nIGVsc2Ugd2UgZG9uJ3QgcmVjb2duaXplCgkgICAgaWYgeyRjdXJkaWZmdGFnICE9ICJDb21tZW50cyJ9IHsKCQkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJCXNldCBjdXJ0YWdzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCgkJc2V0IGN1cmRpZmZ0YWcgQ29tbWVudHMKCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCWluY3IgbmV4dHVwZGF0ZSAxMDAKCWZpbGVldmVudCAkYmRmIHJlYWRhYmxlIHt9Cgl1cGRhdGUKCWZpbGVldmVudCAkYmRmIHJlYWRhYmxlICJnZXRibG9iZGlmZmxpbmUgJGJkZiB7JGlkc30iCiAgICB9Cn0KCnByb2MgbmV4dGZpbGUge30gewogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQgY3RleHQKICAgIHNldCBoZXJlIFskY3RleHQgaW5kZXggQDAsMF0KICAgIGZvciB7c2V0IGkgMH0ge1tpbmZvIGV4aXN0cyBkaWZmZmlsZXN0YXJ0KCRpKV19IHtpbmNyIGl9IHsKCWlmIHtbJGN0ZXh0IGNvbXBhcmUgJGRpZmZmaWxlc3RhcnQoJGkpID4gJGhlcmVdfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgcG9zXQoJCXx8IFskY3RleHQgY29tcGFyZSAkZGlmZmZpbGVzdGFydCgkaSkgPCAkcG9zXX0gewoJCXNldCBwb3MgJGRpZmZmaWxlc3RhcnQoJGkpCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBwb3NdfSB7CgkkY3RleHQgeXZpZXcgJHBvcwogICAgfQp9Cgpwcm9jIGxpc3Rib3hzZWwge30gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdCBjdXJyZW50aWQKICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRpZF19IHJldHVybgogICAgc2V0IHNlbCBbbHNvcnQgWyRjZmxpc3QgY3Vyc2VsZWN0aW9uXV0KICAgIGlmIHskc2VsIGVxIHt9fSByZXR1cm4KICAgIHNldCBmaXJzdCBbbGluZGV4ICRzZWwgMF0KICAgIGNhdGNoIHskY3RleHQgeXZpZXcgZm1hcmsuJGZpcnN0fQp9Cgpwcm9jIHNldGNvb3JkcyB7fSB7CiAgICBnbG9iYWwgbGluZXNwYyBjaGFyc3BjIGNhbnZ4MCBjYW52eTAgbWFpbmZvbnQKICAgIGdsb2JhbCB4c3BjMSB4c3BjMiBsdGhpY2tuZXNzCgogICAgc2V0IGxpbmVzcGMgW2ZvbnQgbWV0cmljcyAkbWFpbmZvbnQgLWxpbmVzcGFjZV0KICAgIHNldCBjaGFyc3BjIFtmb250IG1lYXN1cmUgJG1haW5mb250ICJtIl0KICAgIHNldCBjYW52eTAgW2V4cHIgezMgKyAwLjUgKiAkbGluZXNwY31dCiAgICBzZXQgY2FudngwIFtleHByIHszICsgMC41ICogJGxpbmVzcGN9XQogICAgc2V0IGx0aGlja25lc3MgW2V4cHIge2ludCgkbGluZXNwYyAvIDkpICsgMX1dCiAgICBzZXQgeHNwYzEoMCkgJGxpbmVzcGMKICAgIHNldCB4c3BjMiAkbGluZXNwYwp9Cgpwcm9jIHJlZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgc3RvcHBlZCByZWRpc3BsYXlpbmcgcGhhc2UKICAgIGlmIHskc3RvcHBlZCA+IDF9IHJldHVybgogICAgaWYgeyRwaGFzZSA9PSAiZ2V0Y29tbWl0cyJ9IHJldHVybgogICAgc2V0IHJlZGlzcGxheWluZyAxCiAgICBpZiB7JHBoYXNlID09ICJkcmF3Z3JhcGgiIHx8ICRwaGFzZSA9PSAiaW5jcmRyYXcifSB7CglzZXQgc3RvcHBlZCAxCiAgICB9IGVsc2UgewoJZHJhd2dyYXBoCiAgICB9Cn0KCnByb2MgaW5jcmZvbnQge2luY30gewogICAgZ2xvYmFsIG1haW5mb250IG5hbWVmb250IHRleHRmb250IGN0ZXh0IGNhbnYgcGhhc2UKICAgIGdsb2JhbCBzdG9wcGVkIGVudHJpZXMKICAgIHVubWFya21hdGNoZXMKICAgIHNldCBtYWluZm9udCBbbHJlcGxhY2UgJG1haW5mb250IDEgMSBbZXhwciB7W2xpbmRleCAkbWFpbmZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXQgbmFtZWZvbnQgW2xyZXBsYWNlICRuYW1lZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG5hbWVmb250IDFdICsgJGluY31dXQogICAgc2V0IHRleHRmb250IFtscmVwbGFjZSAkdGV4dGZvbnQgMSAxIFtleHByIHtbbGluZGV4ICR0ZXh0Zm9udCAxXSArICRpbmN9XV0KICAgIHNldGNvb3JkcwogICAgJGN0ZXh0IGNvbmYgLWZvbnQgJHRleHRmb250CiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCSRlIGNvbmYgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIn0gewoJJGNhbnYgaXRlbWNvbmYgdGV4dGl0ZW1zIC1mb250ICRtYWluZm9udAogICAgfQogICAgcmVkaXNwbGF5Cn0KCnByb2MgY2xlYXJzaGExIHt9IHsKICAgIGdsb2JhbCBzaGExZW50cnkgc2hhMXN0cmluZwogICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaGExc3RyaW5nXSA9PSA0MH0gewoJJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgIH0KfQoKcHJvYyBzaGExY2hhbmdlIHtuMSBuMiBvcH0gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIHNoYTFidXQKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7WyRzaGExYnV0IGNnZXQgLXN0YXRlXSA9PSAkc3RhdGV9IHJldHVybgogICAgaWYgeyRzdGF0ZSA9PSAibm9ybWFsIn0gewoJJHNoYTFidXQgY29uZiAtc3RhdGUgbm9ybWFsIC1yZWxpZWYgcmFpc2VkIC10ZXh0ICJHb3RvOiAiCiAgICB9IGVsc2UgewoJJHNoYTFidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IC10ZXh0ICJTSEExIElEOiAiCiAgICB9Cn0KCnByb2MgZ290b2NvbW1pdCB7fSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgaWRsaW5lIHRhZ2lkcwogICAgZ2xvYmFsIGxpbmVpZCBudW1jb21taXRzCgogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHJldHVybgogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICR0YWdpZHMoJHNoYTFzdHJpbmcpCiAgICB9IGVsc2UgewoJc2V0IGlkIFtzdHJpbmcgdG9sb3dlciAkc2hhMXN0cmluZ10KCWlmIHtbcmVnZXhwIHteWzAtOWEtZl17NCwzOX0kfSAkaWRdfSB7CgkgICAgc2V0IG1hdGNoZXMge30KCSAgICBmb3Ige3NldCBsIDB9IHskbCA8ICRudW1jb21taXRzfSB7aW5jciBsfSB7CgkJaWYge1tzdHJpbmcgbWF0Y2ggJGlkKiAkbGluZWlkKCRsKV19IHsKCQkgICAgbGFwcGVuZCBtYXRjaGVzICRsaW5laWQoJGwpCgkJfQoJICAgIH0KCSAgICBpZiB7JG1hdGNoZXMgbmUge319IHsKCQlpZiB7W2xsZW5ndGggJG1hdGNoZXNdID4gMX0gewoJCSAgICBlcnJvcl9wb3B1cCAiU2hvcnQgU0hBMSBpZCAkaWQgaXMgYW1iaWd1b3VzIgoJCSAgICByZXR1cm4KCQl9CgkJc2V0IGlkIFtsaW5kZXggJG1hdGNoZXMgMF0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gewoJc2VsZWN0bGluZSAkaWRsaW5lKCRpZCkgMQoJcmV0dXJuCiAgICB9CiAgICBpZiB7W3JlZ2V4cCB7XlswLTlhLWZBLUZdezQsfSR9ICRzaGExc3RyaW5nXX0gewoJc2V0IHR5cGUgIlNIQTEgaWQiCiAgICB9IGVsc2UgewoJc2V0IHR5cGUgIlRhZyIKICAgIH0KICAgIGVycm9yX3BvcHVwICIkdHlwZSAkc2hhMXN0cmluZyBpcyBub3Qga25vd24iCn0KCnByb2MgbGluZWVudGVyIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2FudgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHJldHVybgogICAgc2V0IGhvdmVyeCAkeAogICAgc2V0IGhvdmVyeSAkeQogICAgc2V0IGhvdmVyaWQgJGlkCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CglhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKICAgIH0KICAgIHNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCn0KCnByb2MgbGluZW1vdGlvbiB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJc2V0IGhvdmVyeCAkeAoJc2V0IGhvdmVyeSAkeQoJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJICAgIGFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgoJfQoJc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICB9Cn0KCnByb2MgbGluZWxlYXZlIHtpZH0gewogICAgZ2xvYmFsIGhvdmVyaWQgaG92ZXJ0aW1lciBjYW52CgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCSRjYW52IGRlbGV0ZSBob3ZlcgoJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJICAgIGFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgoJICAgIHVuc2V0IGhvdmVydGltZXIKCX0KCXVuc2V0IGhvdmVyaWQKICAgIH0KfQoKcHJvYyBsaW5laG92ZXIge30gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCiAgICBnbG9iYWwgY2FudiBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjb21taXRpbmZvIG1haW5mb250CgogICAgc2V0IHRleHQgW2xpbmRleCAkY29tbWl0aW5mbygkaG92ZXJpZCkgMF0KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCiAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCiAgICBzZXQgeCBbZXhwciB7JGhvdmVyeCArIDIgKiAkbGluZXNwY31dCiAgICBzZXQgeSBbZXhwciB7JGhvdmVyeSArICR5ZnJhYyAqICR5bWF4IC0gJGxpbmVzcGMgLyAyfV0KICAgIHNldCB4MCBbZXhwciB7JHggLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkwIFtleHByIHskeSAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeDEgW2V4cHIgeyR4ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRleHRdICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MSBbZXhwciB7JHkgKyAkbGluZXNwYyArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3RhbmdsZSAkeDAgJHkwICR4MSAkeTEgXAoJICAgICAgIC1maWxsIFwjZmZmZjgwIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxIC10YWdzIGhvdmVyXQogICAgJGNhbnYgcmFpc2UgJHQKICAgIHNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeCAkeSAtYW5jaG9yIG53IC10ZXh0ICR0ZXh0IC10YWdzIGhvdmVyIC1mb250ICRtYWluZm9udF0KICAgICRjYW52IHJhaXNlICR0Cn0KCnByb2MgY2xpY2tpc29uYXJyb3cge2lkIHl9IHsKICAgIGdsb2JhbCBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcyBsdGhpY2tuZXNzCgogICAgc2V0IHRocmVzaCBbZXhwciB7MiAqICRsdGhpY2tuZXNzICsgNn1dCiAgICBpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CglpZiB7JG1haW5saW5lYXJyb3coJGlkKSBuZSAibm9uZSJ9IHsKCSAgICBpZiB7YWJzKFtsaW5kZXggJG1haW5saW5lKCRpZCkgMV0gLSAkeSkgPCAkdGhyZXNofSB7CgkJcmV0dXJuICJ1cCIKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJICAgIHNldCBjb29yZHMgW2xpbmRleCAkbHMgMF0KCSAgICBzZXQgYXJyb3cgW2xpbmRleCAkbHMgMl0KCSAgICBpZiB7JGFycm93IGVxICJmaXJzdCIgfHwgJGFycm93IGVxICJib3RoIn0gewoJCWlmIHthYnMoW2xpbmRleCAkY29vcmRzIDFdIC0gJHkpIDwgJHRocmVzaH0gewoJCSAgICByZXR1cm4gInVwIgoJCX0KCSAgICB9CgkgICAgaWYgeyRhcnJvdyBlcSAibGFzdCIgfHwgJGFycm93IGVxICJib3RoIn0gewoJCWlmIHthYnMoW2xpbmRleCAkY29vcmRzIGVuZF0gLSAkeSkgPCAkdGhyZXNofSB7CgkJICAgIHJldHVybiAiZG93biIKCQl9CgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuIHt9Cn0KCnByb2MgYXJyb3dqdW1wIHtpZCBkaXJuIHl9IHsKICAgIGdsb2JhbCBtYWlubGluZSBzaWRlbGluZXMgY2FudiBjYW52MiBjYW52MwoKICAgIHNldCB5dCB7fQogICAgaWYgeyRkaXJuIGVxICJkb3duIn0gewoJaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJICAgIHNldCB5MSBbbGluZGV4ICRtYWlubGluZSgkaWQpIDFdCgkgICAgaWYgeyR5MSA+ICR5fSB7CgkJc2V0IHl0ICR5MQoJICAgIH0KCX0KCWlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7CgkgICAgZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJCXNldCB5MSBbbGluZGV4ICRscyAwIDFdCgkJaWYgeyR5MSA+ICR5ICYmICgkeXQgZXEge30gfHwgJHkxIDwgJHl0KX0gewoJCSAgICBzZXQgeXQgJHkxCgkJfQoJICAgIH0KCX0KICAgIH0gZWxzZSB7CglpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJICAgIGZvcmVhY2ggbHMgJHNpZGVsaW5lcygkaWQpIHsKCQlzZXQgeTEgW2xpbmRleCAkbHMgMCBlbmRdCgkJaWYgeyR5MSA8ICR5ICYmICgkeXQgZXEge30gfHwgJHkxID4gJHl0KX0gewoJCSAgICBzZXQgeXQgJHkxCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskeXQgZXEge319IHJldHVybgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4IDw9IDB9IHJldHVybgogICAgc2V0IHZpZXcgWyRjYW52IHl2aWV3XQogICAgc2V0IHlzcGFuIFtleHByIHtbbGluZGV4ICR2aWV3IDFdIC0gW2xpbmRleCAkdmlldyAwXX1dCiAgICBzZXQgeWZyYWMgW2V4cHIgeyR5dCAvICR5bWF4IC0gJHlzcGFuIC8gMn1dCiAgICBpZiB7JHlmcmFjIDwgMH0gewoJc2V0IHlmcmFjIDAKICAgIH0KICAgICRjYW52IHl2aWV3IG1vdmV0byAkeWZyYWMKICAgICRjYW52MiB5dmlldyBtb3ZldG8gJHlmcmFjCiAgICAkY2FudjMgeXZpZXcgbW92ZXRvICR5ZnJhYwp9Cgpwcm9jIGxpbmVjbGljayB7eCB5IGlkIGlzbmV3fSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0aW5mbyBjaGlsZHJlbiBjZmxpc3QgY2FudiB0aGlja2VybGluZQoKICAgIHVubWFya21hdGNoZXMKICAgIHVuc2VsZWN0bGluZQogICAgbm9ybWFsbGluZQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICAjIGRyYXcgdGhpcyBsaW5lIHRoaWNrZXIgdGhhbiBub3JtYWwKICAgIGRyYXdsaW5lcyAkaWQgMSAxCiAgICBzZXQgdGhpY2tlcmxpbmUgJGlkCiAgICBpZiB7JGlzbmV3fSB7CglzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCglpZiB7JHltYXggZXEge319IHJldHVybgoJc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQoJc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQogICAgfQogICAgc2V0IGRpcm4gW2NsaWNraXNvbmFycm93ICRpZCAkeV0KICAgIGlmIHskZGlybiBuZSB7fX0gewoJYXJyb3dqdW1wICRpZCAkZGlybiAkeQoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IGxpbmVjbGljayAkeCAkeSAkaWQgMF0KICAgIH0KICAgICMgZmlsbCB0aGUgZGV0YWlscyBwYW5lIHdpdGggaW5mbyBhYm91dCB0aGlzIGxpbmUKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlBhcmVudDpcdCIKICAgICRjdGV4dCBpbnNlcnQgZW5kICRpZCBbbGlzdCBsaW5rIGxpbmswXQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmswIDwxPiBbbGlzdCBzZWxieWlkICRpZF0KICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXVxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0QXV0aG9yOlx0W2xpbmRleCAkaW5mbyAxXVxuIgogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdERhdGU6XHQkZGF0ZVxuIgogICAgaWYge1tpbmZvIGV4aXN0cyBjaGlsZHJlbigkaWQpXX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlxuQ2hpbGRyZW46IgoJc2V0IGkgMAoJZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGlkKSB7CgkgICAgaW5jciBpCgkgICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGNoaWxkKQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0IgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICRjaGlsZCBbbGlzdCBsaW5rIGxpbmskaV0KCSAgICAkY3RleHQgdGFnIGJpbmQgbGluayRpIDwxPiBbbGlzdCBzZWxieWlkICRjaGlsZF0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF0iCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdIgoJICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHREYXRlOlx0JGRhdGVcbiIKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCn0KCnByb2Mgbm9ybWFsbGluZSB7fSB7CiAgICBnbG9iYWwgdGhpY2tlcmxpbmUKICAgIGlmIHtbaW5mbyBleGlzdHMgdGhpY2tlcmxpbmVdfSB7CglkcmF3bGluZXMgJHRoaWNrZXJsaW5lIDAgMQoJdW5zZXQgdGhpY2tlcmxpbmUKICAgIH0KfQoKcHJvYyBzZWxieWlkIHtpZH0gewogICAgZ2xvYmFsIGlkbGluZQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXNlbGVjdGxpbmUgJGlkbGluZSgkaWQpIDEKICAgIH0KfQoKcHJvYyBtc3RpbWUge30gewogICAgZ2xvYmFsIHN0YXJ0bXN0aW1lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzdGFydG1zdGltZV19IHsKCXNldCBzdGFydG1zdGltZSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICB9CiAgICByZXR1cm4gW2Zvcm1hdCAiJS4zZiIgW2V4cHIgeyhbY2xvY2sgY2xpY2sgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc3RpbWUpIC8gMTAwMC4wfV1dCn0KCnByb2Mgcm93bWVudSB7eCB5IGlkfSB7CiAgICBnbG9iYWwgcm93Y3R4bWVudSBpZGxpbmUgc2VsZWN0ZWRsaW5lIHJvd21lbnVpZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gfHwgJGlkbGluZSgkaWQpIGVxICRzZWxlY3RlZGxpbmV9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDAgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMSAtc3RhdGUgJHN0YXRlCiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAyIC1zdGF0ZSAkc3RhdGUKICAgIHNldCByb3dtZW51aWQgJGlkCiAgICB0a19wb3B1cCAkcm93Y3R4bWVudSAkeCAkeQp9Cgpwcm9jIGRpZmZ2c3NlbCB7ZGlybn0gewogICAgZ2xvYmFsIHJvd21lbnVpZCBzZWxlY3RlZGxpbmUgbGluZWlkCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBpZiB7JGRpcm59IHsKCXNldCBvbGRpZCAkbGluZWlkKCRzZWxlY3RlZGxpbmUpCglzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgfSBlbHNlIHsKCXNldCBvbGRpZCAkcm93bWVudWlkCglzZXQgbmV3aWQgJGxpbmVpZCgkc2VsZWN0ZWRsaW5lKQogICAgfQogICAgYWRkdG9oaXN0b3J5IFtsaXN0IGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkXQogICAgZG9zZWxkaWZmICRvbGRpZCAkbmV3aWQKfQoKcHJvYyBkb3NlbGRpZmYge29sZGlkIG5ld2lkfSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0CiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLjAgMC4wCiAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLjAgbGVmdAogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKICAgICRjZmxpc3QgaW5zZXJ0IGVuZCAiVG9wIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkZyb20gIgogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmswIDwxPiBbbGlzdCBzZWxieWlkICRvbGRpZF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICRvbGRpZCBbbGlzdCBsaW5rIGxpbmswXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblxuVG8gICAiCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazEgPDE+IFtsaXN0IHNlbGJ5aWQgJG5ld2lkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG5ld2lkIFtsaXN0IGxpbmsgbGluazFdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY3RleHQgdGFnIGRlbGV0ZSBDb21tZW50cwogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgc3RhcnRkaWZmIFtsaXN0ICRvbGRpZCAkbmV3aWRdCn0KCnByb2MgbWtwYXRjaCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIGN1cnJlbnRpZCBjb21taXRpbmZvIHBhdGNodG9wIHBhdGNobnVtCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgb2xkaWQgJGN1cnJlbnRpZAogICAgc2V0IG9sZGhlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICBzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgc2V0IG5ld2hlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICBzZXQgdG9wIC5wYXRjaAogICAgc2V0IHBhdGNodG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJHZW5lcmF0ZSBwYXRjaCIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZyb20gLXRleHQgIkZyb206IgogICAgZW50cnkgJHRvcC5mcm9tc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21zaGExIGluc2VydCAwICRvbGRpZAogICAgJHRvcC5mcm9tc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmZyb20gJHRvcC5mcm9tc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuZnJvbWhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9taGVhZCBpbnNlcnQgMCAkb2xkaGVhZAogICAgJHRvcC5mcm9taGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuZnJvbWhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRvIC10ZXh0ICJUbzoiCiAgICBlbnRyeSAkdG9wLnRvc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvc2hhMSBpbnNlcnQgMCAkbmV3aWQKICAgICR0b3AudG9zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AudG8gJHRvcC50b3NoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLnRvaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvaGVhZCBpbnNlcnQgMCAkbmV3aGVhZAogICAgJHRvcC50b2hlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLnRvaGVhZCAtc3RpY2t5IHcKICAgIGJ1dHRvbiAkdG9wLnJldiAtdGV4dCAiUmV2ZXJzZSIgLWNvbW1hbmQgbWtwYXRjaHJldiAtcGFkeCA1CiAgICBncmlkICR0b3AucmV2IHggLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJwYXRjaCRwYXRjaG51bS5wYXRjaCJdCiAgICBpbmNyIHBhdGNobnVtCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiR2VuZXJhdGUiIC1jb21tYW5kIG1rcGF0Y2hnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWtwYXRjaGNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2MgbWtwYXRjaHJldiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgb2xkaGVhZCBbJHBhdGNodG9wLmZyb21oZWFkIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgbmV3aGVhZCBbJHBhdGNodG9wLnRvaGVhZCBnZXRdCiAgICBmb3JlYWNoIGUgW2xpc3QgZnJvbXNoYTEgZnJvbWhlYWQgdG9zaGExIHRvaGVhZF0gXAoJICAgIHYgW2xpc3QgJG5ld2lkICRuZXdoZWFkICRvbGRpZCAkb2xkaGVhZF0gewoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIG5vcm1hbAoJJHBhdGNodG9wLiRlIGRlbGV0ZSAwIGVuZAoJJHBhdGNodG9wLiRlIGluc2VydCAwICR2CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIH0KfQoKcHJvYyBta3BhdGNoZ28ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBmbmFtZSBbJHBhdGNodG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgZ2l0LWRpZmYtdHJlZSAtcCAkb2xkaWQgJG5ld2lkID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHBhdGNoOiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3BhdGNoY2FuIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWt0YWcge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBta3RhZ3RvcCBjb21taXRpbmZvCgogICAgc2V0IHRvcCAubWFrZXRhZwogICAgc2V0IG1rdGFndG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJDcmVhdGUgdGFnIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRsYWIgLXRleHQgIlRhZyBuYW1lOiIKICAgIGVudHJ5ICR0b3AudGFnIC13aWR0aCA2MAogICAgZ3JpZCAkdG9wLnRsYWIgJHRvcC50YWcgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJDcmVhdGUiIC1jb21tYW5kIG1rdGFnZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rdGFnY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AudGFnCn0KCnByb2MgZG9ta3RhZyB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AgZW52IHRhZ2lkcyBpZHRhZ3MKCiAgICBzZXQgaWQgWyRta3RhZ3RvcC5zaGExIGdldF0KICAgIHNldCB0YWcgWyRta3RhZ3RvcC50YWcgZ2V0XQogICAgaWYgeyR0YWcgPT0ge319IHsKCWVycm9yX3BvcHVwICJObyB0YWcgbmFtZSBzcGVjaWZpZWQiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCR0YWcpXX0gewoJZXJyb3JfcG9wdXAgIlRhZyBcIiR0YWdcIiBhbHJlYWR5IGV4aXN0cyIKCXJldHVybgogICAgfQogICAgaWYge1tjYXRjaCB7CglzZXQgZGlyIFtnaXRkaXJdCglzZXQgZm5hbWUgW2ZpbGUgam9pbiAkZGlyICJyZWZzL3RhZ3MiICR0YWddCglzZXQgZiBbb3BlbiAkZm5hbWUgd10KCXB1dHMgJGYgJGlkCgljbG9zZSAkZgogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgdGFnOiAkZXJyIgoJcmV0dXJuCiAgICB9CgogICAgc2V0IHRhZ2lkcygkdGFnKSAkaWQKICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJHRhZwogICAgcmVkcmF3dGFncyAkaWQKfQoKcHJvYyByZWRyYXd0YWdzIHtpZH0gewogICAgZ2xvYmFsIGNhbnYgbGluZWh0YWcgaWRsaW5lIGlkcG9zIHNlbGVjdGVkbGluZQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gcmV0dXJuCiAgICAkY2FudiBkZWxldGUgdGFnLiRpZAogICAgc2V0IHh0IFtldmFsIGRyYXd0YWdzICRpZCAkaWRwb3MoJGlkKV0KICAgICRjYW52IGNvb3JkcyAkbGluZWh0YWcoJGlkbGluZSgkaWQpKSAkeHQgW2xpbmRleCAkaWRwb3MoJGlkKSAyXQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRzZWxlY3RlZGxpbmUgPT0gJGlkbGluZSgkaWQpfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAogICAgfQp9Cgpwcm9jIG1rdGFnY2FuIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRta3RhZ3RvcH0KICAgIHVuc2V0IG1rdGFndG9wCn0KCnByb2MgbWt0YWdnbyB7fSB7CiAgICBkb21rdGFnCiAgICBta3RhZ2Nhbgp9Cgpwcm9jIHdyaXRlY29tbWl0IHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgd3Jjb210b3AgY29tbWl0aW5mbyB3cmNvbWNtZAoKICAgIHNldCB0b3AgLndyaXRlY29tbWl0CiAgICBzZXQgd3Jjb210b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIldyaXRlIGNvbW1pdCB0byBmaWxlIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmNsYWIgLXRleHQgIkNvbW1hbmQ6IgogICAgZW50cnkgJHRvcC5jbWQgLXdpZHRoIDYwIC10ZXh0dmFyaWFibGUgd3Jjb21jbWQKICAgIGdyaWQgJHRvcC5jbGFiICR0b3AuY21kIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgImNvbW1pdC1bc3RyaW5nIHJhbmdlICRyb3dtZW51aWQgMCA2XSJdCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiV3JpdGUiIC1jb21tYW5kIHdyY29tZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHdyY29tY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyB3cmNvbWdvIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIHNldCBpZCBbJHdyY29tdG9wLnNoYTEgZ2V0XQogICAgc2V0IGNtZCAiZWNobyAkaWQgfCBbJHdyY29tdG9wLmNtZCBnZXRdIgogICAgc2V0IGZuYW1lIFskd3Jjb210b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBzaCAtYyAkY21kID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIHdyaXRpbmcgY29tbWl0OiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyB3cmNvbWNhbiB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIGxpc3RyZWZzIHtpZH0gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCgogICAgc2V0IHgge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgeCAkaWR0YWdzKCRpZCkKICAgIH0KICAgIHNldCB5IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCB5ICRpZGhlYWRzKCRpZCkKICAgIH0KICAgIHNldCB6IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgeiAkaWRvdGhlcnJlZnMoJGlkKQogICAgfQogICAgcmV0dXJuIFtsaXN0ICR4ICR5ICR6XQp9Cgpwcm9jIHJlcmVhZHJlZnMge30gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgdGFnaWRzIGhlYWRpZHMgb3RoZXJyZWZpZHMKCiAgICBzZXQgcmVmaWRzIFtjb25jYXQgW2FycmF5IG5hbWVzIGlkdGFnc10gXAoJCSAgICBbYXJyYXkgbmFtZXMgaWRoZWFkc10gW2FycmF5IG5hbWVzIGlkb3RoZXJyZWZzXV0KICAgIGZvcmVhY2ggaWQgJHJlZmlkcyB7CglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV19IHsKCSAgICBzZXQgcmVmKCRpZCkgW2xpc3RyZWZzICRpZF0KCX0KICAgIH0KICAgIHJlYWRyZWZzCiAgICBzZXQgcmVmaWRzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJHJlZmlkcyBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCgkJCVthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXV0KICAgIGZvcmVhY2ggaWQgJHJlZmlkcyB7CglzZXQgdiBbbGlzdHJlZnMgJGlkXQoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldIHx8ICRyZWYoJGlkKSAhPSAkdn0gewoJICAgIHJlZHJhd3RhZ3MgJGlkCgl9CiAgICB9Cn0KCnByb2Mgc2hvd3RhZyB7dGFnIGlzbmV3fSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0IHRhZ2NvbnRlbnRzIHRhZ2lkcyBsaW5rbnVtCgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNob3d0YWcgJHRhZyAwXQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICBzZXQgbGlua251bSAwCiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2NvbnRlbnRzKCR0YWcpXX0gewoJc2V0IHRleHQgJHRhZ2NvbnRlbnRzKCR0YWcpCiAgICB9IGVsc2UgewoJc2V0IHRleHQgIlRhZzogJHRhZ1xuSWQ6ICAkdGFnaWRzKCR0YWcpIgogICAgfQogICAgYXBwZW5kd2l0aGxpbmtzICR0ZXh0CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCn0KCnByb2MgZG9xdWl0IHt9IHsKICAgIGdsb2JhbCBzdG9wcGVkCiAgICBzZXQgc3RvcHBlZCAxMDAKICAgIGRlc3Ryb3kgLgp9Cgpwcm9jIGRvcHJlZnMge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIGZpbmRtZXJnZWZpbGVzCiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3AKCiAgICBzZXQgdG9wIC5naXRrcHJlZnMKICAgIHNldCBwcmVmc3RvcCAkdG9wCiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0gewoJcmFpc2UgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIGZpbmRtZXJnZWZpbGVzfSB7CglzZXQgb2xkcHJlZnMoJHYpIFtzZXQgJHZdCiAgICB9CiAgICB0b3BsZXZlbCAkdG9wCiAgICB3bSB0aXRsZSAkdG9wICJHaXRrIHByZWZlcmVuY2VzIgogICAgbGFiZWwgJHRvcC5sZGlzcCAtdGV4dCAiQ29tbWl0IGxpc3QgZGlzcGxheSBvcHRpb25zIgogICAgZ3JpZCAkdG9wLmxkaXNwIC0gLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLnNwYWNlciAtdGV4dCAiICIKICAgIGxhYmVsICR0b3AubWF4d2lkdGhsIC10ZXh0ICJNYXhpbXVtIGdyYXBoIHdpZHRoIChsaW5lcykiIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIHNwaW5ib3ggJHRvcC5tYXh3aWR0aCAtZnJvbSAwIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXh3aWR0aAogICAgZ3JpZCAkdG9wLnNwYWNlciAkdG9wLm1heHdpZHRobCAkdG9wLm1heHdpZHRoIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5tYXhwY3RsIC10ZXh0ICJNYXhpbXVtIGdyYXBoIHdpZHRoICglIG9mIHBhbmUpIiBcCgktZm9udCBvcHRpb25mb250CiAgICBzcGluYm94ICR0b3AubWF4cGN0IC1mcm9tIDEgLXRvIDEwMCAtd2lkdGggNCAtdGV4dHZhcmlhYmxlIG1heGdyYXBocGN0CiAgICBncmlkIHggJHRvcC5tYXhwY3RsICR0b3AubWF4cGN0IC1zdGlja3kgdwogICAgY2hlY2tidXR0b24gJHRvcC5maW5kbSAtdmFyaWFibGUgZmluZG1lcmdlZmlsZXMKICAgIGxhYmVsICR0b3AuZmluZG1sIC10ZXh0ICJJbmNsdWRlIG1lcmdlcyBmb3IgXCJGaW5kXCIgaW4gXCJGaWxlc1wiIiBcCgktZm9udCBvcHRpb25mb250CiAgICBncmlkICR0b3AuZmluZG0gJHRvcC5maW5kbWwgLSAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuZGRpc3AgLXRleHQgIkRpZmYgZGlzcGxheSBvcHRpb25zIgogICAgZ3JpZCAkdG9wLmRkaXNwIC0gLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmRpZmZvcHRsIC10ZXh0ICJPcHRpb25zIGZvciBkaWZmIHByb2dyYW0iIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIGVudHJ5ICR0b3AuZGlmZm9wdCAtd2lkdGggMjAgLXRleHR2YXJpYWJsZSBkaWZmb3B0cwogICAgZ3JpZCB4ICR0b3AuZGlmZm9wdGwgJHRvcC5kaWZmb3B0IC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLm9rIC10ZXh0ICJPSyIgLWNvbW1hbmQgcHJlZnNvawogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgcHJlZnNjYW4KICAgIGdyaWQgJHRvcC5idXRzLm9rICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtIC1wYWR5IDEwIC1zdGlja3kgZXcKfQoKcHJvYyBwcmVmc2NhbiB7fSB7CiAgICBnbG9iYWwgbWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgZmluZG1lcmdlZmlsZXMKICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcAoKICAgIGZvcmVhY2ggdiB7bWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgZmluZG1lcmdlZmlsZXN9IHsKCXNldCAkdiAkb2xkcHJlZnMoJHYpCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcHJlZnN0b3B9CiAgICB1bnNldCBwcmVmc3RvcAp9Cgpwcm9jIHByZWZzb2sge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0CiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkcHJlZnN0b3B9CiAgICB1bnNldCBwcmVmc3RvcAogICAgaWYgeyRtYXh3aWR0aCAhPSAkb2xkcHJlZnMobWF4d2lkdGgpCgl8fCAkbWF4Z3JhcGhwY3QgIT0gJG9sZHByZWZzKG1heGdyYXBocGN0KX0gewoJcmVkaXNwbGF5CiAgICB9Cn0KCnByb2MgZm9ybWF0ZGF0ZSB7ZH0gewogICAgcmV0dXJuIFtjbG9jayBmb3JtYXQgJGQgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQp9CgojIFRoaXMgbGlzdCBvZiBlbmNvZGluZyBuYW1lcyBhbmQgYWxpYXNlcyBpcyBkaXN0aWxsZWQgZnJvbQojIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMuCiMgTm90IGFsbCBvZiB0aGVtIGFyZSBzdXBwb3J0ZWQgYnkgVGNsLgpzZXQgZW5jb2RpbmdfYWxpYXNlcyB7CiAgICB7IEFOU0lfWDMuNC0xOTY4IGlzby1pci02IEFOU0lfWDMuNC0xOTg2IElTT182NDYuaXJ2OjE5OTEgQVNDSUkKICAgICAgSVNPNjQ2LVVTIFVTLUFTQ0lJIHVzIElCTTM2NyBjcDM2NyBjc0FTQ0lJIH0KICAgIHsgSVNPLTEwNjQ2LVVURi0xIGNzSVNPMTA2NDZVVEYxIH0KICAgIHsgSVNPXzY0Ni5iYXNpYzoxOTgzIHJlZiBjc0lTTzY0NmJhc2ljMTk4MyB9CiAgICB7IElOVkFSSUFOVCBjc0lOVkFSSUFOVCB9CiAgICB7IElTT182NDYuaXJ2OjE5ODMgaXNvLWlyLTIgaXJ2IGNzSVNPMkludGxSZWZWZXJzaW9uIH0KICAgIHsgQlNfNDczMCBpc28taXItNCBJU082NDYtR0IgZ2IgdWsgY3NJU080VW5pdGVkS2luZ2RvbSB9CiAgICB7IE5BVFMtU0VGSSBpc28taXItOC0xIGNzTkFUU1NFRkkgfQogICAgeyBOQVRTLVNFRkktQUREIGlzby1pci04LTIgY3NOQVRTU0VGSUFERCB9CiAgICB7IE5BVFMtREFOTyBpc28taXItOS0xIGNzTkFUU0RBTk8gfQogICAgeyBOQVRTLURBTk8tQUREIGlzby1pci05LTIgY3NOQVRTREFOT0FERCB9CiAgICB7IFNFTl84NTAyMDBfQiBpc28taXItMTAgRkkgSVNPNjQ2LUZJIElTTzY0Ni1TRSBzZSBjc0lTTzEwU3dlZGlzaCB9CiAgICB7IFNFTl84NTAyMDBfQyBpc28taXItMTEgSVNPNjQ2LVNFMiBzZTIgY3NJU08xMVN3ZWRpc2hGb3JOYW1lcyB9CiAgICB7IEtTX0NfNTYwMS0xOTg3IGlzby1pci0xNDkgS1NfQ181NjAxLTE5ODkgS1NDXzU2MDEga29yZWFuIGNzS1NDNTYwMTE5ODcgfQogICAgeyBJU08tMjAyMi1LUiBjc0lTTzIwMjJLUiB9CiAgICB7IEVVQy1LUiBjc0VVQ0tSIH0KICAgIHsgSVNPLTIwMjItSlAgY3NJU08yMDIySlAgfQogICAgeyBJU08tMjAyMi1KUC0yIGNzSVNPMjAyMkpQMiB9CiAgICB7IEpJU19DNjIyMC0xOTY5LWpwIEpJU19DNjIyMC0xOTY5IGlzby1pci0xMyBrYXRha2FuYSB4MDIwMS03CiAgICAgIGNzSVNPMTNKSVNDNjIyMGpwIH0KICAgIHsgSklTX0M2MjIwLTE5Njktcm8gaXNvLWlyLTE0IGpwIElTTzY0Ni1KUCBjc0lTTzE0SklTQzYyMjBybyB9CiAgICB7IElUIGlzby1pci0xNSBJU082NDYtSVQgY3NJU08xNUl0YWxpYW4gfQogICAgeyBQVCBpc28taXItMTYgSVNPNjQ2LVBUIGNzSVNPMTZQb3J0dWd1ZXNlIH0KICAgIHsgRVMgaXNvLWlyLTE3IElTTzY0Ni1FUyBjc0lTTzE3U3BhbmlzaCB9CiAgICB7IGdyZWVrNy1vbGQgaXNvLWlyLTE4IGNzSVNPMThHcmVlazdPbGQgfQogICAgeyBsYXRpbi1ncmVlayBpc28taXItMTkgY3NJU08xOUxhdGluR3JlZWsgfQogICAgeyBESU5fNjYwMDMgaXNvLWlyLTIxIGRlIElTTzY0Ni1ERSBjc0lTTzIxR2VybWFuIH0KICAgIHsgTkZfWl82Mi0wMTBfKDE5NzMpIGlzby1pci0yNSBJU082NDYtRlIxIGNzSVNPMjVGcmVuY2ggfQogICAgeyBMYXRpbi1ncmVlay0xIGlzby1pci0yNyBjc0lTTzI3TGF0aW5HcmVlazEgfQogICAgeyBJU09fNTQyNyBpc28taXItMzcgY3NJU081NDI3Q3lyaWxsaWMgfQogICAgeyBKSVNfQzYyMjYtMTk3OCBpc28taXItNDIgY3NJU080MkpJU0M2MjI2MTk3OCB9CiAgICB7IEJTX3ZpZXdkYXRhIGlzby1pci00NyBjc0lTTzQ3QlNWaWV3ZGF0YSB9CiAgICB7IElOSVMgaXNvLWlyLTQ5IGNzSVNPNDlJTklTIH0KICAgIHsgSU5JUy04IGlzby1pci01MCBjc0lTTzUwSU5JUzggfQogICAgeyBJTklTLWN5cmlsbGljIGlzby1pci01MSBjc0lTTzUxSU5JU0N5cmlsbGljIH0KICAgIHsgSVNPXzU0Mjc6MTk4MSBpc28taXItNTQgSVNPNTQyN0N5cmlsbGljMTk4MSB9CiAgICB7IElTT181NDI4OjE5ODAgaXNvLWlyLTU1IGNzSVNPNTQyOEdyZWVrIH0KICAgIHsgR0JfMTk4OC04MCBpc28taXItNTcgY24gSVNPNjQ2LUNOIGNzSVNPNTdHQjE5ODggfQogICAgeyBHQl8yMzEyLTgwIGlzby1pci01OCBjaGluZXNlIGNzSVNPNThHQjIzMTI4MCB9CiAgICB7IE5TXzQ1NTEtMSBpc28taXItNjAgSVNPNjQ2LU5PIG5vIGNzSVNPNjBEYW5pc2hOb3J3ZWdpYW4KICAgICAgY3NJU082ME5vcndlZ2lhbjEgfQogICAgeyBOU180NTUxLTIgSVNPNjQ2LU5PMiBpc28taXItNjEgbm8yIGNzSVNPNjFOb3J3ZWdpYW4yIH0KICAgIHsgTkZfWl82Mi0wMTAgaXNvLWlyLTY5IElTTzY0Ni1GUiBmciBjc0lTTzY5RnJlbmNoIH0KICAgIHsgdmlkZW90ZXgtc3VwcGwgaXNvLWlyLTcwIGNzSVNPNzBWaWRlb3RleFN1cHAxIH0KICAgIHsgUFQyIGlzby1pci04NCBJU082NDYtUFQyIGNzSVNPODRQb3J0dWd1ZXNlMiB9CiAgICB7IEVTMiBpc28taXItODUgSVNPNjQ2LUVTMiBjc0lTTzg1U3BhbmlzaDIgfQogICAgeyBNU1pfNzc5NS4zIGlzby1pci04NiBJU082NDYtSFUgaHUgY3NJU084Nkh1bmdhcmlhbiB9CiAgICB7IEpJU19DNjIyNi0xOTgzIGlzby1pci04NyB4MDIwOCBKSVNfWDAyMDgtMTk4MyBjc0lTTzg3SklTWDAyMDggfQogICAgeyBncmVlazcgaXNvLWlyLTg4IGNzSVNPODhHcmVlazcgfQogICAgeyBBU01PXzQ0OSBJU09fOTAzNiBhcmFiaWM3IGlzby1pci04OSBjc0lTTzg5QVNNTzQ0OSB9CiAgICB7IGlzby1pci05MCBjc0lTTzkwIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYSBpc28taXItOTEganAtb2NyLWEgY3NJU085MUpJU0M2MjI5MTk4NGEgfQogICAgeyBKSVNfQzYyMjktMTk4NC1iIGlzby1pci05MiBJU082NDYtSlAtT0NSLUIganAtb2NyLWIKICAgICAgY3NJU085MkpJU0M2Mjk5MTk4NGIgfQogICAgeyBKSVNfQzYyMjktMTk4NC1iLWFkZCBpc28taXItOTMganAtb2NyLWItYWRkIGNzSVNPOTNKSVM2MjI5MTk4NGJhZGQgfQogICAgeyBKSVNfQzYyMjktMTk4NC1oYW5kIGlzby1pci05NCBqcC1vY3ItaGFuZCBjc0lTTzk0SklTNjIyOTE5ODRoYW5kIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZC1hZGQgaXNvLWlyLTk1IGpwLW9jci1oYW5kLWFkZAogICAgICBjc0lTTzk1SklTNjIyOTE5ODRoYW5kYWRkIH0KICAgIHsgSklTX0M2MjI5LTE5ODQta2FuYSBpc28taXItOTYgY3NJU085NkpJU0M2MjI5MTk4NGthbmEgfQogICAgeyBJU09fMjAzMy0xOTgzIGlzby1pci05OCBlMTNiIGNzSVNPMjAzMyB9CiAgICB7IEFOU0lfWDMuMTEwLTE5ODMgaXNvLWlyLTk5IENTQV9UNTAwLTE5ODMgTkFQTFBTIGNzSVNPOTlOQVBMUFMgfQogICAgeyBJU09fODg1OS0xOjE5ODcgaXNvLWlyLTEwMCBJU09fODg1OS0xIElTTy04ODU5LTEgbGF0aW4xIGwxIElCTTgxOQogICAgICBDUDgxOSBjc0lTT0xhdGluMSB9CiAgICB7IElTT184ODU5LTI6MTk4NyBpc28taXItMTAxIElTT184ODU5LTIgSVNPLTg4NTktMiBsYXRpbjIgbDIgY3NJU09MYXRpbjIgfQogICAgeyBULjYxLTdiaXQgaXNvLWlyLTEwMiBjc0lTTzEwMlQ2MTdiaXQgfQogICAgeyBULjYxLThiaXQgVC42MSBpc28taXItMTAzIGNzSVNPMTAzVDYxOGJpdCB9CiAgICB7IElTT184ODU5LTM6MTk4OCBpc28taXItMTA5IElTT184ODU5LTMgSVNPLTg4NTktMyBsYXRpbjMgbDMgY3NJU09MYXRpbjMgfQogICAgeyBJU09fODg1OS00OjE5ODggaXNvLWlyLTExMCBJU09fODg1OS00IElTTy04ODU5LTQgbGF0aW40IGw0IGNzSVNPTGF0aW40IH0KICAgIHsgRUNNQS1jeXJpbGxpYyBpc28taXItMTExIEtPSTgtRSBjc0lTTzExMUVDTUFDeXJpbGxpYyB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS0xIGlzby1pci0xMjEgSVNPNjQ2LUNBIGNzYTctMSBjYSBjc0lTTzEyMUNhbmFkaWFuMSB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS0yIGlzby1pci0xMjIgSVNPNjQ2LUNBMiBjc2E3LTIgY3NJU08xMjJDYW5hZGlhbjIgfQogICAgeyBDU0FfWjI0My40LTE5ODUtZ3IgaXNvLWlyLTEyMyBjc0lTTzEyM0NTQVoyNDM0MTk4NWdyIH0KICAgIHsgSVNPXzg4NTktNjoxOTg3IGlzby1pci0xMjcgSVNPXzg4NTktNiBJU08tODg1OS02IEVDTUEtMTE0IEFTTU8tNzA4CiAgICAgIGFyYWJpYyBjc0lTT0xhdGluQXJhYmljIH0KICAgIHsgSVNPXzg4NTktNi1FIGNzSVNPODg1OTZFIElTTy04ODU5LTYtRSB9CiAgICB7IElTT184ODU5LTYtSSBjc0lTTzg4NTk2SSBJU08tODg1OS02LUkgfQogICAgeyBJU09fODg1OS03OjE5ODcgaXNvLWlyLTEyNiBJU09fODg1OS03IElTTy04ODU5LTcgRUxPVF85MjggRUNNQS0xMTgKICAgICAgZ3JlZWsgZ3JlZWs4IGNzSVNPTGF0aW5HcmVlayB9CiAgICB7IFQuMTAxLUcyIGlzby1pci0xMjggY3NJU08xMjhUMTAxRzIgfQogICAgeyBJU09fODg1OS04OjE5ODggaXNvLWlyLTEzOCBJU09fODg1OS04IElTTy04ODU5LTggaGVicmV3CiAgICAgIGNzSVNPTGF0aW5IZWJyZXcgfQogICAgeyBJU09fODg1OS04LUUgY3NJU084ODU5OEUgSVNPLTg4NTktOC1FIH0KICAgIHsgSVNPXzg4NTktOC1JIGNzSVNPODg1OThJIElTTy04ODU5LTgtSSB9CiAgICB7IENTTl8zNjkxMDMgaXNvLWlyLTEzOSBjc0lTTzEzOUNTTjM2OTEwMyB9CiAgICB7IEpVU19JLkIxLjAwMiBpc28taXItMTQxIElTTzY0Ni1ZVSBqcyB5dSBjc0lTTzE0MUpVU0lCMTAwMiB9CiAgICB7IElTT182OTM3LTItYWRkIGlzby1pci0xNDIgY3NJU09UZXh0Q29tbSB9CiAgICB7IElFQ19QMjctMSBpc28taXItMTQzIGNzSVNPMTQzSUVDUDI3MSB9CiAgICB7IElTT184ODU5LTU6MTk4OCBpc28taXItMTQ0IElTT184ODU5LTUgSVNPLTg4NTktNSBjeXJpbGxpYwogICAgICBjc0lTT0xhdGluQ3lyaWxsaWMgfQogICAgeyBKVVNfSS5CMS4wMDMtc2VyYiBpc28taXItMTQ2IHNlcmJpYW4gY3NJU08xNDZTZXJiaWFuIH0KICAgIHsgSlVTX0kuQjEuMDAzLW1hYyBtYWNlZG9uaWFuIGlzby1pci0xNDcgY3NJU08xNDdNYWNlZG9uaWFuIH0KICAgIHsgSVNPXzg4NTktOToxOTg5IGlzby1pci0xNDggSVNPXzg4NTktOSBJU08tODg1OS05IGxhdGluNSBsNSBjc0lTT0xhdGluNSB9CiAgICB7IGdyZWVrLWNjaXR0IGlzby1pci0xNTAgY3NJU08xNTAgY3NJU08xNTBHcmVla0NDSVRUIH0KICAgIHsgTkNfTkMwMC0xMDo4MSBjdWJhIGlzby1pci0xNTEgSVNPNjQ2LUNVIGNzSVNPMTUxQ3ViYSB9CiAgICB7IElTT182OTM3LTItMjUgaXNvLWlyLTE1MiBjc0lTTzY5MzdBZGQgfQogICAgeyBHT1NUXzE5NzY4LTc0IFNUX1NFVl8zNTgtODggaXNvLWlyLTE1MyBjc0lTTzE1M0dPU1QxOTc2ODc0IH0KICAgIHsgSVNPXzg4NTktc3VwcCBpc28taXItMTU0IGxhdGluMS0yLTUgY3NJU084ODU5U3VwcCB9CiAgICB7IElTT18xMDM2Ny1ib3ggaXNvLWlyLTE1NSBjc0lTTzEwMzY3Qm94IH0KICAgIHsgSVNPLTg4NTktMTAgaXNvLWlyLTE1NyBsNiBJU09fODg1OS0xMDoxOTkyIGNzSVNPTGF0aW42IGxhdGluNiB9CiAgICB7IGxhdGluLWxhcCBsYXAgaXNvLWlyLTE1OCBjc0lTTzE1OExhcCB9CiAgICB7IEpJU19YMDIxMi0xOTkwIHgwMjEyIGlzby1pci0xNTkgY3NJU08xNTlKSVNYMDIxMjE5OTAgfQogICAgeyBEU18yMDg5IERTMjA4OSBJU082NDYtREsgZGsgY3NJU082NDZEYW5pc2ggfQogICAgeyB1cy1kayBjc1VTREsgfQogICAgeyBkay11cyBjc0RLVVMgfQogICAgeyBKSVNfWDAyMDEgWDAyMDEgY3NIYWxmV2lkdGhLYXRha2FuYSB9CiAgICB7IEtTQzU2MzYgSVNPNjQ2LUtSIGNzS1NDNTYzNiB9CiAgICB7IElTTy0xMDY0Ni1VQ1MtMiBjc1VuaWNvZGUgfQogICAgeyBJU08tMTA2NDYtVUNTLTQgY3NVQ1M0IH0KICAgIHsgREVDLU1DUyBkZWMgY3NERUNNQ1MgfQogICAgeyBocC1yb21hbjggcm9tYW44IHI4IGNzSFBSb21hbjggfQogICAgeyBtYWNpbnRvc2ggbWFjIGNzTWFjaW50b3NoIH0KICAgIHsgSUJNMDM3IGNwMDM3IGViY2RpYy1jcC11cyBlYmNkaWMtY3AtY2EgZWJjZGljLWNwLXd0IGViY2RpYy1jcC1ubAogICAgICBjc0lCTTAzNyB9CiAgICB7IElCTTAzOCBFQkNESUMtSU5UIGNwMDM4IGNzSUJNMDM4IH0KICAgIHsgSUJNMjczIENQMjczIGNzSUJNMjczIH0KICAgIHsgSUJNMjc0IEVCQ0RJQy1CRSBDUDI3NCBjc0lCTTI3NCB9CiAgICB7IElCTTI3NSBFQkNESUMtQlIgY3AyNzUgY3NJQk0yNzUgfQogICAgeyBJQk0yNzcgRUJDRElDLUNQLURLIEVCQ0RJQy1DUC1OTyBjc0lCTTI3NyB9CiAgICB7IElCTTI3OCBDUDI3OCBlYmNkaWMtY3AtZmkgZWJjZGljLWNwLXNlIGNzSUJNMjc4IH0KICAgIHsgSUJNMjgwIENQMjgwIGViY2RpYy1jcC1pdCBjc0lCTTI4MCB9CiAgICB7IElCTTI4MSBFQkNESUMtSlAtRSBjcDI4MSBjc0lCTTI4MSB9CiAgICB7IElCTTI4NCBDUDI4NCBlYmNkaWMtY3AtZXMgY3NJQk0yODQgfQogICAgeyBJQk0yODUgQ1AyODUgZWJjZGljLWNwLWdiIGNzSUJNMjg1IH0KICAgIHsgSUJNMjkwIGNwMjkwIEVCQ0RJQy1KUC1rYW5hIGNzSUJNMjkwIH0KICAgIHsgSUJNMjk3IGNwMjk3IGViY2RpYy1jcC1mciBjc0lCTTI5NyB9CiAgICB7IElCTTQyMCBjcDQyMCBlYmNkaWMtY3AtYXIxIGNzSUJNNDIwIH0KICAgIHsgSUJNNDIzIGNwNDIzIGViY2RpYy1jcC1nciBjc0lCTTQyMyB9CiAgICB7IElCTTQyNCBjcDQyNCBlYmNkaWMtY3AtaGUgY3NJQk00MjQgfQogICAgeyBJQk00MzcgY3A0MzcgNDM3IGNzUEM4Q29kZVBhZ2U0MzcgfQogICAgeyBJQk01MDAgQ1A1MDAgZWJjZGljLWNwLWJlIGViY2RpYy1jcC1jaCBjc0lCTTUwMCB9CiAgICB7IElCTTc3NSBjcDc3NSBjc1BDNzc1QmFsdGljIH0KICAgIHsgSUJNODUwIGNwODUwIDg1MCBjc1BDODUwTXVsdGlsaW5ndWFsIH0KICAgIHsgSUJNODUxIGNwODUxIDg1MSBjc0lCTTg1MSB9CiAgICB7IElCTTg1MiBjcDg1MiA4NTIgY3NQQ3A4NTIgfQogICAgeyBJQk04NTUgY3A4NTUgODU1IGNzSUJNODU1IH0KICAgIHsgSUJNODU3IGNwODU3IDg1NyBjc0lCTTg1NyB9CiAgICB7IElCTTg2MCBjcDg2MCA4NjAgY3NJQk04NjAgfQogICAgeyBJQk04NjEgY3A4NjEgODYxIGNwLWlzIGNzSUJNODYxIH0KICAgIHsgSUJNODYyIGNwODYyIDg2MiBjc1BDODYyTGF0aW5IZWJyZXcgfQogICAgeyBJQk04NjMgY3A4NjMgODYzIGNzSUJNODYzIH0KICAgIHsgSUJNODY0IGNwODY0IGNzSUJNODY0IH0KICAgIHsgSUJNODY1IGNwODY1IDg2NSBjc0lCTTg2NSB9CiAgICB7IElCTTg2NiBjcDg2NiA4NjYgY3NJQk04NjYgfQogICAgeyBJQk04NjggQ1A4NjggY3AtYXIgY3NJQk04NjggfQogICAgeyBJQk04NjkgY3A4NjkgODY5IGNwLWdyIGNzSUJNODY5IH0KICAgIHsgSUJNODcwIENQODcwIGViY2RpYy1jcC1yb2VjZSBlYmNkaWMtY3AteXUgY3NJQk04NzAgfQogICAgeyBJQk04NzEgQ1A4NzEgZWJjZGljLWNwLWlzIGNzSUJNODcxIH0KICAgIHsgSUJNODgwIGNwODgwIEVCQ0RJQy1DeXJpbGxpYyBjc0lCTTg4MCB9CiAgICB7IElCTTg5MSBjcDg5MSBjc0lCTTg5MSB9CiAgICB7IElCTTkwMyBjcDkwMyBjc0lCTTkwMyB9CiAgICB7IElCTTkwNCBjcDkwNCA5MDQgY3NJQkJNOTA0IH0KICAgIHsgSUJNOTA1IENQOTA1IGViY2RpYy1jcC10ciBjc0lCTTkwNSB9CiAgICB7IElCTTkxOCBDUDkxOCBlYmNkaWMtY3AtYXIyIGNzSUJNOTE4IH0KICAgIHsgSUJNMTAyNiBDUDEwMjYgY3NJQk0xMDI2IH0KICAgIHsgRUJDRElDLUFULURFIGNzSUJNRUJDRElDQVRERSB9CiAgICB7IEVCQ0RJQy1BVC1ERS1BIGNzRUJDRElDQVRERUEgfQogICAgeyBFQkNESUMtQ0EtRlIgY3NFQkNESUNDQUZSIH0KICAgIHsgRUJDRElDLURLLU5PIGNzRUJDRElDREtOTyB9CiAgICB7IEVCQ0RJQy1ESy1OTy1BIGNzRUJDRElDREtOT0EgfQogICAgeyBFQkNESUMtRkktU0UgY3NFQkNESUNGSVNFIH0KICAgIHsgRUJDRElDLUZJLVNFLUEgY3NFQkNESUNGSVNFQSB9CiAgICB7IEVCQ0RJQy1GUiBjc0VCQ0RJQ0ZSIH0KICAgIHsgRUJDRElDLUlUIGNzRUJDRElDSVQgfQogICAgeyBFQkNESUMtUFQgY3NFQkNESUNQVCB9CiAgICB7IEVCQ0RJQy1FUyBjc0VCQ0RJQ0VTIH0KICAgIHsgRUJDRElDLUVTLUEgY3NFQkNESUNFU0EgfQogICAgeyBFQkNESUMtRVMtUyBjc0VCQ0RJQ0VTUyB9CiAgICB7IEVCQ0RJQy1VSyBjc0VCQ0RJQ1VLIH0KICAgIHsgRUJDRElDLVVTIGNzRUJDRElDVVMgfQogICAgeyBVTktOT1dOLThCSVQgY3NVbmtub3duOEJpVCB9CiAgICB7IE1ORU1PTklDIGNzTW5lbW9uaWMgfQogICAgeyBNTkVNIGNzTW5lbSB9CiAgICB7IFZJU0NJSSBjc1ZJU0NJSSB9CiAgICB7IFZJUVIgY3NWSVFSIH0KICAgIHsgS09JOC1SIGNzS09JOFIgfQogICAgeyBJQk0wMDg1OCBDQ1NJRDAwODU4IENQMDA4NTggUEMtTXVsdGlsaW5ndWFsLTg1MCtldXJvIH0KICAgIHsgSUJNMDA5MjQgQ0NTSUQwMDkyNCBDUDAwOTI0IGViY2RpYy1MYXRpbjktLWV1cm8gfQogICAgeyBJQk0wMTE0MCBDQ1NJRDAxMTQwIENQMDExNDAgZWJjZGljLXVzLTM3K2V1cm8gfQogICAgeyBJQk0wMTE0MSBDQ1NJRDAxMTQxIENQMDExNDEgZWJjZGljLWRlLTI3MytldXJvIH0KICAgIHsgSUJNMDExNDIgQ0NTSUQwMTE0MiBDUDAxMTQyIGViY2RpYy1kay0yNzcrZXVybyBlYmNkaWMtbm8tMjc3K2V1cm8gfQogICAgeyBJQk0wMTE0MyBDQ1NJRDAxMTQzIENQMDExNDMgZWJjZGljLWZpLTI3OCtldXJvIGViY2RpYy1zZS0yNzgrZXVybyB9CiAgICB7IElCTTAxMTQ0IENDU0lEMDExNDQgQ1AwMTE0NCBlYmNkaWMtaXQtMjgwK2V1cm8gfQogICAgeyBJQk0wMTE0NSBDQ1NJRDAxMTQ1IENQMDExNDUgZWJjZGljLWVzLTI4NCtldXJvIH0KICAgIHsgSUJNMDExNDYgQ0NTSUQwMTE0NiBDUDAxMTQ2IGViY2RpYy1nYi0yODUrZXVybyB9CiAgICB7IElCTTAxMTQ3IENDU0lEMDExNDcgQ1AwMTE0NyBlYmNkaWMtZnItMjk3K2V1cm8gfQogICAgeyBJQk0wMTE0OCBDQ1NJRDAxMTQ4IENQMDExNDggZWJjZGljLWludGVybmF0aW9uYWwtNTAwK2V1cm8gfQogICAgeyBJQk0wMTE0OSBDQ1NJRDAxMTQ5IENQMDExNDkgZWJjZGljLWlzLTg3MStldXJvIH0KICAgIHsgSUJNMTA0NyBJQk0tMTA0NyB9CiAgICB7IFBUQ1AxNTQgY3NQVENQMTU0IFBUMTU0IENQMTU0IEN5cmlsbGljLUFzaWFuIH0KICAgIHsgQW1pZ2EtMTI1MSBBbWkxMjUxIEFtaWdhMTI1MSBBbWktMTI1MSB9CiAgICB7IFVOSUNPREUtMS0xIGNzVW5pY29kZTExIH0KICAgIHsgQ0VTVS04IGNzQ0VTVS04IH0KICAgIHsgQk9DVS0xIGNzQk9DVS0xIH0KICAgIHsgVU5JQ09ERS0xLTEtVVRGLTcgY3NVbmljb2RlMTFVVEY3IH0KICAgIHsgSVNPLTg4NTktMTQgaXNvLWlyLTE5OSBJU09fODg1OS0xNDoxOTk4IElTT184ODU5LTE0IGxhdGluOCBpc28tY2VsdGljCiAgICAgIGw4IH0KICAgIHsgSVNPLTg4NTktMTUgSVNPXzg4NTktMTUgTGF0aW4tOSB9CiAgICB7IElTTy04ODU5LTE2IGlzby1pci0yMjYgSVNPXzg4NTktMTY6MjAwMSBJU09fODg1OS0xNiBsYXRpbjEwIGwxMCB9CiAgICB7IEdCSyBDUDkzNiBNUzkzNiB3aW5kb3dzLTkzNiB9CiAgICB7IEpJU19FbmNvZGluZyBjc0pJU0VuY29kaW5nIH0KICAgIHsgU2hpZnRfSklTIE1TX0thbmppIGNzU2hpZnRKSVMgfQogICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfUGFja2VkX0Zvcm1hdF9mb3JfSmFwYW5lc2UgY3NFVUNQa2RGbXRKYXBhbmVzZQogICAgICBFVUMtSlAgfQogICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfRml4ZWRfV2lkdGhfZm9yX0phcGFuZXNlIGNzRVVDRml4V2lkSmFwYW5lc2UgfQogICAgeyBJU08tMTA2NDYtVUNTLUJhc2ljIGNzVW5pY29kZUFTQ0lJIH0KICAgIHsgSVNPLTEwNjQ2LVVuaWNvZGUtTGF0aW4xIGNzVW5pY29kZUxhdGluMSBJU08tMTA2NDYgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2MSBjc1VuaWNvZGVJQk0xMjYxIH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjggY3NVbmljb2RlSUJNMTI2OCB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjc2IGNzVW5pY29kZUlCTTEyNzYgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2NCBjc1VuaWNvZGVJQk0xMjY0IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjUgY3NVbmljb2RlSUJNMTI2NSB9CiAgICB7IElTTy04ODU5LTEtV2luZG93cy0zLjAtTGF0aW4tMSBjc1dpbmRvd3MzMExhdGluMSB9CiAgICB7IElTTy04ODU5LTEtV2luZG93cy0zLjEtTGF0aW4tMSBjc1dpbmRvd3MzMUxhdGluMSB9CiAgICB7IElTTy04ODU5LTItV2luZG93cy1MYXRpbi0yIGNzV2luZG93czMxTGF0aW4yIH0KICAgIHsgSVNPLTg4NTktOS1XaW5kb3dzLUxhdGluLTUgY3NXaW5kb3dzMzFMYXRpbjUgfQogICAgeyBBZG9iZS1TdGFuZGFyZC1FbmNvZGluZyBjc0Fkb2JlU3RhbmRhcmRFbmNvZGluZyB9CiAgICB7IFZlbnR1cmEtVVMgY3NWZW50dXJhVVMgfQogICAgeyBWZW50dXJhLUludGVybmF0aW9uYWwgY3NWZW50dXJhSW50ZXJuYXRpb25hbCB9CiAgICB7IFBDOC1EYW5pc2gtTm9yd2VnaWFuIGNzUEM4RGFuaXNoTm9yd2VnaWFuIH0KICAgIHsgUEM4LVR1cmtpc2ggY3NQQzhUdXJraXNoIH0KICAgIHsgSUJNLVN5bWJvbHMgY3NJQk1TeW1ib2xzIH0KICAgIHsgSUJNLVRoYWkgY3NJQk1UaGFpIH0KICAgIHsgSFAtTGVnYWwgY3NIUExlZ2FsIH0KICAgIHsgSFAtUGktZm9udCBjc0hQUGlGb250IH0KICAgIHsgSFAtTWF0aDggY3NIUE1hdGg4IH0KICAgIHsgQWRvYmUtU3ltYm9sLUVuY29kaW5nIGNzSFBQU01hdGggfQogICAgeyBIUC1EZXNrVG9wIGNzSFBEZXNrdG9wIH0KICAgIHsgVmVudHVyYS1NYXRoIGNzVmVudHVyYU1hdGggfQogICAgeyBNaWNyb3NvZnQtUHVibGlzaGluZyBjc01pY3Jvc29mdFB1Ymxpc2hpbmcgfQogICAgeyBXaW5kb3dzLTMxSiBjc1dpbmRvd3MzMUogfQogICAgeyBHQjIzMTIgY3NHQjIzMTIgfQogICAgeyBCaWc1IGNzQmlnNSB9Cn0KCnByb2MgdGNsX2VuY29kaW5nIHtlbmN9IHsKICAgIGdsb2JhbCBlbmNvZGluZ19hbGlhc2VzCiAgICBzZXQgbmFtZXMgW2VuY29kaW5nIG5hbWVzXQogICAgc2V0IGxjbmFtZXMgW3N0cmluZyB0b2xvd2VyICRuYW1lc10KICAgIHNldCBlbmMgW3N0cmluZyB0b2xvd2VyICRlbmNdCiAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVuY10KICAgIGlmIHskaSA8IDB9IHsKCSMgbG9vayBmb3IgImlzb25ubiIgaW5zdGVhZCBvZiAiaXNvLW5ubiIgb3IgImlzb19ubm4iCglpZiB7W3JlZ3N1YiB7Xmlzb1stX119ICRlbmMgaXNvIGVuY3hdfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlbmN4XQoJfQogICAgfQogICAgaWYgeyRpIDwgMH0gewoJZm9yZWFjaCBsICRlbmNvZGluZ19hbGlhc2VzIHsKCSAgICBzZXQgbGwgW3N0cmluZyB0b2xvd2VyICRsXQoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGxsICRlbmNdIDwgMH0gY29udGludWUKCSAgICAjIGxvb2sgdGhyb3VnaCB0aGUgYWxpYXNlcyBmb3Igb25lIHRoYXQgdGNsIGtub3dzIGFib3V0CgkgICAgZm9yZWFjaCBlICRsbCB7CgkJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlXQoJCWlmIHskaSA8IDB9IHsKCQkgICAgaWYge1tyZWdzdWIge15pc29bLV9dfSAkZSBpc28gZXhdfSB7CgkJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZXhdCgkJICAgIH0KCQl9CgkJaWYgeyRpID49IDB9IGJyZWFrCgkgICAgfQoJICAgIGJyZWFrCgl9CiAgICB9CiAgICBpZiB7JGkgPj0gMH0gewoJcmV0dXJuIFtsaW5kZXggJG5hbWVzICRpXQogICAgfQogICAgcmV0dXJuIHt9Cn0KCiMgZGVmYXVsdHMuLi4Kc2V0IGRhdGVtb2RlIDAKc2V0IGRpZmZvcHRzICItVSA1IC1wIgpzZXQgd3Jjb21jbWQgImdpdC1kaWZmLXRyZWUgLS1zdGRpbiAtcCAtLXByZXR0eSIKCnNldCBnaXRlbmNvZGluZyB7fQpjYXRjaCB7CiAgICBzZXQgZ2l0ZW5jb2RpbmcgW2V4ZWMgZ2l0LXJlcG8tY29uZmlnIC0tZ2V0IGkxOG4uY29tbWl0ZW5jb2RpbmddCn0KaWYgeyRnaXRlbmNvZGluZyA9PSAiIn0gewogICAgc2V0IGdpdGVuY29kaW5nICJ1dGYtOCIKfQpzZXQgdGNsZW5jb2RpbmcgW3RjbF9lbmNvZGluZyAkZ2l0ZW5jb2RpbmddCmlmIHskdGNsZW5jb2RpbmcgPT0ge319IHsKICAgIHB1dHMgc3RkZXJyICJXYXJuaW5nOiBlbmNvZGluZyAkZ2l0ZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSBUY2wvVGsiCn0KCnNldCBtYWluZm9udCB7SGVsdmV0aWNhIDl9CnNldCB0ZXh0Zm9udCB7Q291cmllciA5fQpzZXQgZmluZG1lcmdlZmlsZXMgMApzZXQgbWF4Z3JhcGhwY3QgNTAKc2V0IG1heHdpZHRoIDE2CnNldCByZXZsaXN0b3JkZXIgMApzZXQgZmFzdGRhdGUgMAoKc2V0IGNvbG9ycyB7Z3JlZW4gcmVkIGJsdWUgbWFnZW50YSBkYXJrZ3JleSBicm93biBvcmFuZ2V9CgpjYXRjaCB7c291cmNlIH4vLmdpdGt9CgpzZXQgbmFtZWZvbnQgJG1haW5mb250Cgpmb250IGNyZWF0ZSBvcHRpb25mb250IC1mYW1pbHkgc2Fucy1zZXJpZiAtc2l6ZSAtMTIKCnNldCByZXZ0cmVlYXJncyB7fQpmb3JlYWNoIGFyZyAkYXJndiB7CiAgICBzd2l0Y2ggLXJlZ2V4cCAtLSAkYXJnIHsKCSJeJCIgeyB9CgkiXi1kIiB7IHNldCBkYXRlbW9kZSAxIH0KCSJeLXIiIHsgc2V0IHJldmxpc3RvcmRlciAxIH0KCWRlZmF1bHQgewoJICAgIGxhcHBlbmQgcmV2dHJlZWFyZ3MgJGFyZwoJfQogICAgfQp9CgpzZXQgaGlzdG9yeSB7fQpzZXQgaGlzdG9yeWluZGV4IDAKCnNldCBzdG9wcGVkIDAKc2V0IHJlZGlzcGxheWluZyAwCnNldCBzdHVmZnNhdmVkIDAKc2V0IHBhdGNobnVtIDAKc2V0Y29vcmRzCm1ha2V3aW5kb3cgJHJldnRyZWVhcmdzCnJlYWRyZWZzCmdldGNvbW1pdHMgJHJldnRyZWVhcmdzCg==