IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCnNldCBhcHB2ZXJzIHtAQEdJVEdVSV9WRVJTSU9OQEB9CnNldCBjb3B5cmlnaHQgewpDb3B5cmlnaHQgqSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZSwgZXQuIGFsLgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyByZWFkIG9ubHkgZ2xvYmFscwoKc2V0IF9hcHBuYW1lIFtsaW5kZXggW2ZpbGUgc3BsaXQgJGFyZ3YwXSBlbmRdCnNldCBfZ2l0ZGlyIHt9CnNldCBfZ2l0ZXhlYyB7fQpzZXQgX3JlcG9uYW1lIHt9CnNldCBfaXNjeWd3aW4ge30KCnByb2MgYXBwbmFtZSB7fSB7CglnbG9iYWwgX2FwcG5hbWUKCXJldHVybiAkX2FwcG5hbWUKfQoKcHJvYyBnaXRkaXIge2FyZ3N9IHsKCWdsb2JhbCBfZ2l0ZGlyCglpZiB7JGFyZ3MgZXEge319IHsKCQlyZXR1cm4gJF9naXRkaXIKCX0KCXJldHVybiBbZXZhbCBbY29uY2F0IFtsaXN0IGZpbGUgam9pbiAkX2dpdGRpcl0gJGFyZ3NdXQp9Cgpwcm9jIGdpdGV4ZWMge2FyZ3N9IHsKCWdsb2JhbCBfZ2l0ZXhlYwoJaWYgeyRfZ2l0ZXhlYyBlcSB7fX0gewoJCWlmIHtbY2F0Y2gge3NldCBfZ2l0ZXhlYyBbZ2l0IC0tZXhlYy1wYXRoXX0gZXJyXX0gewoJCQllcnJvciAiR2l0IG5vdCBpbnN0YWxsZWQ/XG5cbiRlcnIiCgkJfQoJfQoJaWYgeyRhcmdzIGVxIHt9fSB7CgkJcmV0dXJuICRfZ2l0ZXhlYwoJfQoJcmV0dXJuIFtldmFsIFtjb25jYXQgW2xpc3QgZmlsZSBqb2luICRfZ2l0ZXhlY10gJGFyZ3NdXQp9Cgpwcm9jIHJlcG9uYW1lIHt9IHsKCWdsb2JhbCBfcmVwb25hbWUKCXJldHVybiAkX3JlcG9uYW1lCn0KCnByb2MgaXNfTWFjT1NYIHt9IHsKCWdsb2JhbCB0Y2xfcGxhdGZvcm0gdGtfbGlicmFyeQoJaWYge1t0ayB3aW5kb3dpbmdzeXN0ZW1dIGVxIHthcXVhfX0gewoJCXJldHVybiAxCgl9CglyZXR1cm4gMAp9Cgpwcm9jIGlzX1dpbmRvd3Mge30gewoJZ2xvYmFsIHRjbF9wbGF0Zm9ybQoJaWYgeyR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pIGVxIHt3aW5kb3dzfX0gewoJCXJldHVybiAxCgl9CglyZXR1cm4gMAp9Cgpwcm9jIGlzX0N5Z3dpbiB7fSB7CglnbG9iYWwgdGNsX3BsYXRmb3JtIF9pc2N5Z3dpbgoJaWYgeyRfaXNjeWd3aW4gZXEge319IHsKCQlpZiB7JHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgZXEge3dpbmRvd3N9fSB7CgkJCWlmIHtbY2F0Y2gge3NldCBwIFtleGVjIGN5Z3BhdGggLS13aW5kaXJdfSBlcnJdfSB7CgkJCQlzZXQgX2lzY3lnd2luIDAKCQkJfSBlbHNlIHsKCQkJCXNldCBfaXNjeWd3aW4gMQoJCQl9CgkJfSBlbHNlIHsKCQkJc2V0IF9pc2N5Z3dpbiAwCgkJfQoJfQoJcmV0dXJuICRfaXNjeWd3aW4KfQoKcHJvYyBpc19lbmFibGVkIHtvcHRpb259IHsKCWdsb2JhbCBlbmFibGVkX29wdGlvbnMKCWlmIHtbY2F0Y2gge3NldCBvbiAkZW5hYmxlZF9vcHRpb25zKCRvcHRpb24pfV19IHtyZXR1cm4gMH0KCXJldHVybiAkb24KfQoKcHJvYyBlbmFibGVfb3B0aW9uIHtvcHRpb259IHsKCWdsb2JhbCBlbmFibGVkX29wdGlvbnMKCXNldCBlbmFibGVkX29wdGlvbnMoJG9wdGlvbikgMQp9Cgpwcm9jIGRpc2FibGVfb3B0aW9uIHtvcHRpb259IHsKCWdsb2JhbCBlbmFibGVkX29wdGlvbnMKCXNldCBlbmFibGVkX29wdGlvbnMoJG9wdGlvbikgMAp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGNvbmZpZwoKcHJvYyBpc19tYW55X2NvbmZpZyB7bmFtZX0gewoJc3dpdGNoIC1nbG9iIC0tICRuYW1lIHsKCXJlbW90ZS4qLmZldGNoIC0KCXJlbW90ZS4qLnB1c2gKCQl7cmV0dXJuIDF9CgkqCgkJe3JldHVybiAwfQoJfQp9Cgpwcm9jIGlzX2NvbmZpZ190cnVlIHtuYW1lfSB7CglnbG9iYWwgcmVwb19jb25maWcKCWlmIHtbY2F0Y2gge3NldCB2ICRyZXBvX2NvbmZpZygkbmFtZSl9XX0gewoJCXJldHVybiAwCgl9IGVsc2VpZiB7JHYgZXEge3RydWV9IHx8ICR2IGVxIHsxfSB8fCAkdiBlcSB7eWVzfX0gewoJCXJldHVybiAxCgl9IGVsc2UgewoJCXJldHVybiAwCgl9Cn0KCnByb2MgbG9hZF9jb25maWcge2luY2x1ZGVfZ2xvYmFsfSB7CglnbG9iYWwgcmVwb19jb25maWcgZ2xvYmFsX2NvbmZpZyBkZWZhdWx0X2NvbmZpZwoKCWFycmF5IHVuc2V0IGdsb2JhbF9jb25maWcKCWlmIHskaW5jbHVkZV9nbG9iYWx9IHsKCQljYXRjaCB7CgkJCXNldCBmZF9yYyBbb3BlbiAifCBnaXQgY29uZmlnIC0tZ2xvYmFsIC0tbGlzdCIgcl0KCQkJd2hpbGUge1tnZXRzICRmZF9yYyBsaW5lXSA+PSAwfSB7CgkJCQlpZiB7W3JlZ2V4cCB7XihbXj1dKyk9KC4qKSR9ICRsaW5lIGxpbmUgbmFtZSB2YWx1ZV19IHsKCQkJCQlpZiB7W2lzX21hbnlfY29uZmlnICRuYW1lXX0gewoJCQkJCQlsYXBwZW5kIGdsb2JhbF9jb25maWcoJG5hbWUpICR2YWx1ZQoJCQkJCX0gZWxzZSB7CgkJCQkJCXNldCBnbG9iYWxfY29uZmlnKCRuYW1lKSAkdmFsdWUKCQkJCQl9CgkJCQl9CgkJCX0KCQkJY2xvc2UgJGZkX3JjCgkJfQoJfQoKCWFycmF5IHVuc2V0IHJlcG9fY29uZmlnCgljYXRjaCB7CgkJc2V0IGZkX3JjIFtvcGVuICJ8IGdpdCBjb25maWcgLS1saXN0IiByXQoJCXdoaWxlIHtbZ2V0cyAkZmRfcmMgbGluZV0gPj0gMH0gewoJCQlpZiB7W3JlZ2V4cCB7XihbXj1dKyk9KC4qKSR9ICRsaW5lIGxpbmUgbmFtZSB2YWx1ZV19IHsKCQkJCWlmIHtbaXNfbWFueV9jb25maWcgJG5hbWVdfSB7CgkJCQkJbGFwcGVuZCByZXBvX2NvbmZpZygkbmFtZSkgJHZhbHVlCgkJCQl9IGVsc2UgewoJCQkJCXNldCByZXBvX2NvbmZpZygkbmFtZSkgJHZhbHVlCgkJCQl9CgkJCX0KCQl9CgkJY2xvc2UgJGZkX3JjCgl9CgoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBkZWZhdWx0X2NvbmZpZ10gewoJCWlmIHtbY2F0Y2gge3NldCB2ICRnbG9iYWxfY29uZmlnKCRuYW1lKX1dfSB7CgkJCXNldCBnbG9iYWxfY29uZmlnKCRuYW1lKSAkZGVmYXVsdF9jb25maWcoJG5hbWUpCgkJfQoJCWlmIHtbY2F0Y2gge3NldCB2ICRyZXBvX2NvbmZpZygkbmFtZSl9XX0gewoJCQlzZXQgcmVwb19jb25maWcoJG5hbWUpICRkZWZhdWx0X2NvbmZpZygkbmFtZSkKCQl9Cgl9Cn0KCnByb2Mgc2F2ZV9jb25maWcge30gewoJZ2xvYmFsIGRlZmF1bHRfY29uZmlnIGZvbnRfZGVzY3MKCWdsb2JhbCByZXBvX2NvbmZpZyBnbG9iYWxfY29uZmlnCglnbG9iYWwgcmVwb19jb25maWdfbmV3IGdsb2JhbF9jb25maWdfbmV3CgoJZm9yZWFjaCBvcHRpb24gJGZvbnRfZGVzY3MgewoJCXNldCBuYW1lIFtsaW5kZXggJG9wdGlvbiAwXQoJCXNldCBmb250IFtsaW5kZXggJG9wdGlvbiAxXQoJCWZvbnQgY29uZmlndXJlICRmb250IFwKCQkJLWZhbWlseSAkZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5mYW1pbHkpIFwKCQkJLXNpemUgJGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5ec2l6ZSkKCQlmb250IGNvbmZpZ3VyZSAke2ZvbnR9Ym9sZCBcCgkJCS1mYW1pbHkgJGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KSBcCgkJCS1zaXplICRnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXnNpemUpCgkJc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kbmFtZSkgW2ZvbnQgY29uZmlndXJlICRmb250XQoJCXVuc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KQoJCXVuc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5ec2l6ZSkKCX0KCglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGRlZmF1bHRfY29uZmlnXSB7CgkJc2V0IHZhbHVlICRnbG9iYWxfY29uZmlnX25ldygkbmFtZSkKCQlpZiB7JHZhbHVlIG5lICRnbG9iYWxfY29uZmlnKCRuYW1lKX0gewoJCQlpZiB7JHZhbHVlIGVxICRkZWZhdWx0X2NvbmZpZygkbmFtZSl9IHsKCQkJCWNhdGNoIHtnaXQgY29uZmlnIC0tZ2xvYmFsIC0tdW5zZXQgJG5hbWV9CgkJCX0gZWxzZSB7CgkJCQlyZWdzdWIgLWFsbCAiXFt7fVxdIiAkdmFsdWUgeyJ9IHZhbHVlCgkJCQlnaXQgY29uZmlnIC0tZ2xvYmFsICRuYW1lICR2YWx1ZQoJCQl9CgkJCXNldCBnbG9iYWxfY29uZmlnKCRuYW1lKSAkdmFsdWUKCQkJaWYgeyR2YWx1ZSBlcSAkcmVwb19jb25maWcoJG5hbWUpfSB7CgkJCQljYXRjaCB7Z2l0IGNvbmZpZyAtLXVuc2V0ICRuYW1lfQoJCQkJc2V0IHJlcG9fY29uZmlnKCRuYW1lKSAkdmFsdWUKCQkJfQoJCX0KCX0KCglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGRlZmF1bHRfY29uZmlnXSB7CgkJc2V0IHZhbHVlICRyZXBvX2NvbmZpZ19uZXcoJG5hbWUpCgkJaWYgeyR2YWx1ZSBuZSAkcmVwb19jb25maWcoJG5hbWUpfSB7CgkJCWlmIHskdmFsdWUgZXEgJGdsb2JhbF9jb25maWcoJG5hbWUpfSB7CgkJCQljYXRjaCB7Z2l0IGNvbmZpZyAtLXVuc2V0ICRuYW1lfQoJCQl9IGVsc2UgewoJCQkJcmVnc3ViIC1hbGwgIlxbe31cXSIgJHZhbHVlIHsifSB2YWx1ZQoJCQkJZ2l0IGNvbmZpZyAkbmFtZSAkdmFsdWUKCQkJfQoJCQlzZXQgcmVwb19jb25maWcoJG5hbWUpICR2YWx1ZQoJCX0KCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBoYW5keSB1dGlscwoKcHJvYyBnaXQge2FyZ3N9IHsKCXJldHVybiBbZXZhbCBleGVjIGdpdCAkYXJnc10KfQoKcHJvYyBlcnJvcl9wb3B1cCB7bXNnfSB7CglzZXQgdGl0bGUgW2FwcG5hbWVdCglpZiB7W3JlcG9uYW1lXSBuZSB7fX0gewoJCWFwcGVuZCB0aXRsZSAiIChbcmVwb25hbWVdKSIKCX0KCXNldCBjbWQgW2xpc3QgdGtfbWVzc2FnZUJveCBcCgkJLWljb24gZXJyb3IgXAoJCS10eXBlIG9rIFwKCQktdGl0bGUgIiR0aXRsZTogZXJyb3IiIFwKCQktbWVzc2FnZSAkbXNnXQoJaWYge1t3aW5mbyBpc21hcHBlZCAuXX0gewoJCWxhcHBlbmQgY21kIC1wYXJlbnQgLgoJfQoJZXZhbCAkY21kCn0KCnByb2Mgd2Fybl9wb3B1cCB7bXNnfSB7CglzZXQgdGl0bGUgW2FwcG5hbWVdCglpZiB7W3JlcG9uYW1lXSBuZSB7fX0gewoJCWFwcGVuZCB0aXRsZSAiIChbcmVwb25hbWVdKSIKCX0KCXNldCBjbWQgW2xpc3QgdGtfbWVzc2FnZUJveCBcCgkJLWljb24gd2FybmluZyBcCgkJLXR5cGUgb2sgXAoJCS10aXRsZSAiJHRpdGxlOiB3YXJuaW5nIiBcCgkJLW1lc3NhZ2UgJG1zZ10KCWlmIHtbd2luZm8gaXNtYXBwZWQgLl19IHsKCQlsYXBwZW5kIGNtZCAtcGFyZW50IC4KCX0KCWV2YWwgJGNtZAp9Cgpwcm9jIGluZm9fcG9wdXAge21zZyB7cGFyZW50IC59fSB7CglzZXQgdGl0bGUgW2FwcG5hbWVdCglpZiB7W3JlcG9uYW1lXSBuZSB7fX0gewoJCWFwcGVuZCB0aXRsZSAiIChbcmVwb25hbWVdKSIKCX0KCXRrX21lc3NhZ2VCb3ggXAoJCS1wYXJlbnQgJHBhcmVudCBcCgkJLWljb24gaW5mbyBcCgkJLXR5cGUgb2sgXAoJCS10aXRsZSAkdGl0bGUgXAoJCS1tZXNzYWdlICRtc2cKfQoKcHJvYyBhc2tfcG9wdXAge21zZ30gewoJc2V0IHRpdGxlIFthcHBuYW1lXQoJaWYge1tyZXBvbmFtZV0gbmUge319IHsKCQlhcHBlbmQgdGl0bGUgIiAoW3JlcG9uYW1lXSkiCgl9CglyZXR1cm4gW3RrX21lc3NhZ2VCb3ggXAoJCS1wYXJlbnQgLiBcCgkJLWljb24gcXVlc3Rpb24gXAoJCS10eXBlIHllc25vIFwKCQktdGl0bGUgJHRpdGxlIFwKCQktbWVzc2FnZSAkbXNnXQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHZlcnNpb24gY2hlY2sKCmlmIHt7LS12ZXJzaW9ufSBlcSAkYXJndiB8fCB7dmVyc2lvbn0gZXEgJGFyZ3Z9IHsKCXB1dHMgImdpdC1ndWkgdmVyc2lvbiAkYXBwdmVycyIKCWV4aXQKfQoKc2V0IHJlcV9tYWogMQpzZXQgcmVxX21pbiA1CgppZiB7W2NhdGNoIHtzZXQgdiBbZ2l0IC0tdmVyc2lvbl19IGVycl19IHsKCWNhdGNoIHt3bSB3aXRoZHJhdyAufQoJZXJyb3JfcG9wdXAgIkNhbm5vdCBkZXRlcm1pbmUgR2l0IHZlcnNpb246CgokZXJyCgpbYXBwbmFtZV0gcmVxdWlyZXMgR2l0ICRyZXFfbWFqLiRyZXFfbWluIG9yIGxhdGVyLiIKCWV4aXQgMQp9CmlmIHtbcmVnZXhwIHteZ2l0IHZlcnNpb24gKFxkKylcLihcZCspfSAkdiBfanVuayBhY3RfbWFqIGFjdF9taW5dfSB7CglpZiB7JGFjdF9tYWogPCAkcmVxX21hagoJCXx8ICgkYWN0X21haiA9PSAkcmVxX21haiAmJiAkYWN0X21pbiA8ICRyZXFfbWluKX0gewoJCWNhdGNoIHt3bSB3aXRoZHJhdyAufQoJCWVycm9yX3BvcHVwICJbYXBwbmFtZV0gcmVxdWlyZXMgR2l0ICRyZXFfbWFqLiRyZXFfbWluIG9yIGxhdGVyLgoKWW91IGFyZSB1c2luZyAkdi4iCgkJZXhpdCAxCgl9Cn0gZWxzZSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCWVycm9yX3BvcHVwICJDYW5ub3QgcGFyc2UgR2l0IHZlcnNpb24gc3RyaW5nOlxuXG4kdiIKCWV4aXQgMQp9CnVuc2V0IC1ub2NvbXBsYWluIHYgX2p1bmsgYWN0X21haiBhY3RfbWluIHJlcV9tYWogcmVxX21pbgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyByZXBvc2l0b3J5IHNldHVwCgppZiB7ICAgW2NhdGNoIHtzZXQgX2dpdGRpciAkZW52KEdJVF9ESVIpfV0KCSYmIFtjYXRjaCB7c2V0IF9naXRkaXIgW2dpdCByZXYtcGFyc2UgLS1naXQtZGlyXX0gZXJyXX0gewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3Rvcnk6XG5cbiRlcnIiCglleGl0IDEKfQppZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRfZ2l0ZGlyXSAmJiBbaXNfQ3lnd2luXX0gewoJY2F0Y2gge3NldCBfZ2l0ZGlyIFtleGVjIGN5Z3BhdGggLS11bml4ICRfZ2l0ZGlyXX0KfQppZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRfZ2l0ZGlyXX0gewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiR2l0IGRpcmVjdG9yeSBub3QgZm91bmQ6XG5cbiRfZ2l0ZGlyIgoJZXhpdCAxCn0KaWYge1tsaW5kZXggW2ZpbGUgc3BsaXQgJF9naXRkaXJdIGVuZF0gbmUgey5naXR9fSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCWVycm9yX3BvcHVwICJDYW5ub3QgdXNlIGZ1bm55IC5naXQgZGlyZWN0b3J5OlxuXG4kX2dpdGRpciIKCWV4aXQgMQp9CmlmIHtbY2F0Y2gge2NkIFtmaWxlIGRpcm5hbWUgJF9naXRkaXJdfSBlcnJdfSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCWVycm9yX3BvcHVwICJObyB3b3JraW5nIGRpcmVjdG9yeSBbZmlsZSBkaXJuYW1lICRfZ2l0ZGlyXTpcblxuJGVyciIKCWV4aXQgMQp9CnNldCBfcmVwb25hbWUgW2xpbmRleCBbZmlsZSBzcGxpdCBcCglbZmlsZSBub3JtYWxpemUgW2ZpbGUgZGlybmFtZSAkX2dpdGRpcl1dXSBcCgllbmRdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGdsb2JhbCBpbml0CgpzZXQgY3VycmVudF9kaWZmX3BhdGgge30Kc2V0IGN1cnJlbnRfZGlmZl9zaWRlIHt9CnNldCBkaWZmX2FjdGlvbnMgW2xpc3RdCnNldCB1aV9zdGF0dXNfdmFsdWUge0luaXRpYWxpemluZy4uLn0KCnNldCBIRUFEIHt9CnNldCBQQVJFTlQge30Kc2V0IE1FUkdFX0hFQUQgW2xpc3RdCnNldCBjb21taXRfdHlwZSB7fQpzZXQgZW1wdHlfdHJlZSB7fQpzZXQgY3VycmVudF9icmFuY2gge30Kc2V0IGN1cnJlbnRfZGlmZl9wYXRoIHt9CnNldCBzZWxlY3RlZF9jb21taXRfdHlwZSBuZXcKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgdGFzayBtYW5hZ2VtZW50CgpzZXQgcmVzY2FuX2FjdGl2ZSAwCnNldCBkaWZmX2FjdGl2ZSAwCnNldCBsYXN0X2NsaWNrZWQge30KCnNldCBkaXNhYmxlX29uX2xvY2sgW2xpc3RdCnNldCBpbmRleF9sb2NrX3R5cGUgbm9uZQoKcHJvYyBsb2NrX2luZGV4IHt0eXBlfSB7CglnbG9iYWwgaW5kZXhfbG9ja190eXBlIGRpc2FibGVfb25fbG9jawoKCWlmIHskaW5kZXhfbG9ja190eXBlIGVxIHtub25lfX0gewoJCXNldCBpbmRleF9sb2NrX3R5cGUgJHR5cGUKCQlmb3JlYWNoIHcgJGRpc2FibGVfb25fbG9jayB7CgkJCXVwbGV2ZWwgIzAgJHcgZGlzYWJsZWQKCQl9CgkJcmV0dXJuIDEKCX0gZWxzZWlmIHskaW5kZXhfbG9ja190eXBlIGVxICJiZWdpbi0kdHlwZSJ9IHsKCQlzZXQgaW5kZXhfbG9ja190eXBlICR0eXBlCgkJcmV0dXJuIDEKCX0KCXJldHVybiAwCn0KCnByb2MgdW5sb2NrX2luZGV4IHt9IHsKCWdsb2JhbCBpbmRleF9sb2NrX3R5cGUgZGlzYWJsZV9vbl9sb2NrCgoJc2V0IGluZGV4X2xvY2tfdHlwZSBub25lCglmb3JlYWNoIHcgJGRpc2FibGVfb25fbG9jayB7CgkJdXBsZXZlbCAjMCAkdyBub3JtYWwKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBzdGF0dXMKCnByb2MgcmVwb3NpdG9yeV9zdGF0ZSB7Y3R2YXIgaGR2YXIgbWh2YXJ9IHsKCWdsb2JhbCBjdXJyZW50X2JyYW5jaAoJdXB2YXIgJGN0dmFyIGN0ICRoZHZhciBoZCAkbWh2YXIgbWgKCglzZXQgbWggW2xpc3RdCgoJaWYge1tjYXRjaCB7c2V0IGN1cnJlbnRfYnJhbmNoIFtnaXQgc3ltYm9saWMtcmVmIEhFQURdfV19IHsKCQlzZXQgY3VycmVudF9icmFuY2gge30KCX0gZWxzZSB7CgkJcmVnc3ViIF5yZWZzLygoaGVhZHN8dGFnc3xyZW1vdGVzKS8pPyBcCgkJCSRjdXJyZW50X2JyYW5jaCBcCgkJCXt9IFwKCQkJY3VycmVudF9icmFuY2gKCX0KCglpZiB7W2NhdGNoIHtzZXQgaGQgW2dpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRF19XX0gewoJCXNldCBoZCB7fQoJCXNldCBjdCBpbml0aWFsCgkJcmV0dXJuCgl9CgoJc2V0IG1lcmdlX2hlYWQgW2dpdGRpciBNRVJHRV9IRUFEXQoJaWYge1tmaWxlIGV4aXN0cyAkbWVyZ2VfaGVhZF19IHsKCQlzZXQgY3QgbWVyZ2UKCQlzZXQgZmRfbWggW29wZW4gJG1lcmdlX2hlYWQgcl0KCQl3aGlsZSB7W2dldHMgJGZkX21oIGxpbmVdID49IDB9IHsKCQkJbGFwcGVuZCBtaCAkbGluZQoJCX0KCQljbG9zZSAkZmRfbWgKCQlyZXR1cm4KCX0KCglzZXQgY3Qgbm9ybWFsCn0KCnByb2MgUEFSRU5UIHt9IHsKCWdsb2JhbCBQQVJFTlQgZW1wdHlfdHJlZQoKCXNldCBwIFtsaW5kZXggJFBBUkVOVCAwXQoJaWYgeyRwIG5lIHt9fSB7CgkJcmV0dXJuICRwCgl9CglpZiB7JGVtcHR5X3RyZWUgZXEge319IHsKCQlzZXQgZW1wdHlfdHJlZSBbZ2l0IG1rdHJlZSA8PCB7fV0KCX0KCXJldHVybiAkZW1wdHlfdHJlZQp9Cgpwcm9jIHJlc2NhbiB7YWZ0ZXIge2hvbm9yX3RydXN0bXRpbWUgMX19IHsKCWdsb2JhbCBIRUFEIFBBUkVOVCBNRVJHRV9IRUFEIGNvbW1pdF90eXBlCglnbG9iYWwgdWlfaW5kZXggdWlfd29ya2RpciB1aV9zdGF0dXNfdmFsdWUgdWlfY29tbQoJZ2xvYmFsIHJlc2Nhbl9hY3RpdmUgZmlsZV9zdGF0ZXMKCWdsb2JhbCByZXBvX2NvbmZpZwoKCWlmIHskcmVzY2FuX2FjdGl2ZSA+IDAgfHwgIVtsb2NrX2luZGV4IHJlYWRdfSByZXR1cm4KCglyZXBvc2l0b3J5X3N0YXRlIG5ld1R5cGUgbmV3SEVBRCBuZXdNRVJHRV9IRUFECglpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXQoJCSYmICRuZXdUeXBlIGVxIHtub3JtYWx9CgkJJiYgJG5ld0hFQUQgZXEgJEhFQUR9IHsKCX0gZWxzZSB7CgkJc2V0IEhFQUQgJG5ld0hFQUQKCQlzZXQgUEFSRU5UICRuZXdIRUFECgkJc2V0IE1FUkdFX0hFQUQgJG5ld01FUkdFX0hFQUQKCQlzZXQgY29tbWl0X3R5cGUgJG5ld1R5cGUKCX0KCglhcnJheSB1bnNldCBmaWxlX3N0YXRlcwoKCWlmIHshWyR1aV9jb21tIGVkaXQgbW9kaWZpZWRdCgkJfHwgW3N0cmluZyB0cmltIFskdWlfY29tbSBnZXQgMC4wIGVuZF1dIGVxIHt9fSB7CgkJaWYge1tsb2FkX21lc3NhZ2UgR0lUR1VJX01TR119IHsKCQl9IGVsc2VpZiB7W2xvYWRfbWVzc2FnZSBNRVJHRV9NU0ddfSB7CgkJfSBlbHNlaWYge1tsb2FkX21lc3NhZ2UgU1FVQVNIX01TR119IHsKCQl9CgkJJHVpX2NvbW0gZWRpdCByZXNldAoJCSR1aV9jb21tIGVkaXQgbW9kaWZpZWQgZmFsc2UKCX0KCglpZiB7W2lzX2VuYWJsZWQgYnJhbmNoXX0gewoJCWxvYWRfYWxsX2hlYWRzCgkJcG9wdWxhdGVfYnJhbmNoX21lbnUKCX0KCglpZiB7JGhvbm9yX3RydXN0bXRpbWUgJiYgJHJlcG9fY29uZmlnKGd1aS50cnVzdG10aW1lKSBlcSB7dHJ1ZX19IHsKCQlyZXNjYW5fc3RhZ2UyIHt9ICRhZnRlcgoJfSBlbHNlIHsKCQlzZXQgcmVzY2FuX2FjdGl2ZSAxCgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVmcmVzaGluZyBmaWxlIHN0YXR1cy4uLn0KCQlzZXQgY21kIFtsaXN0IGdpdCB1cGRhdGUtaW5kZXhdCgkJbGFwcGVuZCBjbWQgLXEKCQlsYXBwZW5kIGNtZCAtLXVubWVyZ2VkCgkJbGFwcGVuZCBjbWQgLS1pZ25vcmUtbWlzc2luZwoJCWxhcHBlbmQgY21kIC0tcmVmcmVzaAoJCXNldCBmZF9yZiBbb3BlbiAifCAkY21kIiByXQoJCWZjb25maWd1cmUgJGZkX3JmIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCQlmaWxlZXZlbnQgJGZkX3JmIHJlYWRhYmxlIFwKCQkJW2xpc3QgcmVzY2FuX3N0YWdlMiAkZmRfcmYgJGFmdGVyXQoJfQp9Cgpwcm9jIHJlc2Nhbl9zdGFnZTIge2ZkIGFmdGVyfSB7CglnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlCglnbG9iYWwgcmVzY2FuX2FjdGl2ZSBidWZfcmRpIGJ1Zl9yZGYgYnVmX3JsbwoKCWlmIHskZmQgbmUge319IHsKCQlyZWFkICRmZAoJCWlmIHshW2VvZiAkZmRdfSByZXR1cm4KCQljbG9zZSAkZmQKCX0KCglzZXQgbHNfb3RoZXJzIFtsaXN0IHwgZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC16IFwKCQktLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlXQoJc2V0IGluZm9fZXhjbHVkZSBbZ2l0ZGlyIGluZm8gZXhjbHVkZV0KCWlmIHtbZmlsZSByZWFkYWJsZSAkaW5mb19leGNsdWRlXX0gewoJCWxhcHBlbmQgbHNfb3RoZXJzICItLWV4Y2x1ZGUtZnJvbT0kaW5mb19leGNsdWRlIgoJfQoKCXNldCBidWZfcmRpIHt9CglzZXQgYnVmX3JkZiB7fQoJc2V0IGJ1Zl9ybG8ge30KCglzZXQgcmVzY2FuX2FjdGl2ZSAzCglzZXQgdWlfc3RhdHVzX3ZhbHVlIHtTY2FubmluZyBmb3IgbW9kaWZpZWQgZmlsZXMgLi4ufQoJc2V0IGZkX2RpIFtvcGVuICJ8IGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIC16IFtQQVJFTlRdIiByXQoJc2V0IGZkX2RmIFtvcGVuICJ8IGdpdCBkaWZmLWZpbGVzIC16IiByXQoJc2V0IGZkX2xvIFtvcGVuICRsc19vdGhlcnMgcl0KCglmY29uZmlndXJlICRmZF9kaSAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKCWZjb25maWd1cmUgJGZkX2RmIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVuY29kaW5nIGJpbmFyeQoJZmNvbmZpZ3VyZSAkZmRfbG8gLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeSAtZW5jb2RpbmcgYmluYXJ5CglmaWxlZXZlbnQgJGZkX2RpIHJlYWRhYmxlIFtsaXN0IHJlYWRfZGlmZl9pbmRleCAkZmRfZGkgJGFmdGVyXQoJZmlsZWV2ZW50ICRmZF9kZiByZWFkYWJsZSBbbGlzdCByZWFkX2RpZmZfZmlsZXMgJGZkX2RmICRhZnRlcl0KCWZpbGVldmVudCAkZmRfbG8gcmVhZGFibGUgW2xpc3QgcmVhZF9sc19vdGhlcnMgJGZkX2xvICRhZnRlcl0KfQoKcHJvYyBsb2FkX21lc3NhZ2Uge2ZpbGV9IHsKCWdsb2JhbCB1aV9jb21tCgoJc2V0IGYgW2dpdGRpciAkZmlsZV0KCWlmIHtbZmlsZSBpc2ZpbGUgJGZdfSB7CgkJaWYge1tjYXRjaCB7c2V0IGZkIFtvcGVuICRmIHJdfV19IHsKCQkJcmV0dXJuIDAKCQl9CgkJc2V0IGNvbnRlbnQgW3N0cmluZyB0cmltIFtyZWFkICRmZF1dCgkJY2xvc2UgJGZkCgkJcmVnc3ViIC1hbGwgLWxpbmUge1sgXHJcdF0rJH0gJGNvbnRlbnQge30gY29udGVudAoJCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkJJHVpX2NvbW0gaW5zZXJ0IGVuZCAkY29udGVudAoJCXJldHVybiAxCgl9CglyZXR1cm4gMAp9Cgpwcm9jIHJlYWRfZGlmZl9pbmRleCB7ZmQgYWZ0ZXJ9IHsKCWdsb2JhbCBidWZfcmRpCgoJYXBwZW5kIGJ1Zl9yZGkgW3JlYWQgJGZkXQoJc2V0IGMgMAoJc2V0IG4gW3N0cmluZyBsZW5ndGggJGJ1Zl9yZGldCgl3aGlsZSB7JGMgPCAkbn0gewoJCXNldCB6MSBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGkgJGNdCgkJaWYgeyR6MSA9PSAtMX0gYnJlYWsKCQlpbmNyIHoxCgkJc2V0IHoyIFtzdHJpbmcgZmlyc3QgIlwwIiAkYnVmX3JkaSAkejFdCgkJaWYgeyR6MiA9PSAtMX0gYnJlYWsKCgkJaW5jciBjCgkJc2V0IGkgW3NwbGl0IFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGkgJGMgW2V4cHIgeyR6MSAtIDJ9XV0geyB9XQoJCXNldCBwIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGkgJHoxIFtleHByIHskejIgLSAxfV1dCgkJbWVyZ2Vfc3RhdGUgXAoJCQlbZW5jb2RpbmcgY29udmVydGZyb20gJHBdIFwKCQkJW2xpbmRleCAkaSA0XT8gXAoJCQlbbGlzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMl1dIFwKCQkJW2xpc3RdCgkJc2V0IGMgJHoyCgkJaW5jciBjCgl9CglpZiB7JGMgPCAkbn0gewoJCXNldCBidWZfcmRpIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGkgJGMgZW5kXQoJfSBlbHNlIHsKCQlzZXQgYnVmX3JkaSB7fQoJfQoKCXJlc2Nhbl9kb25lICRmZCBidWZfcmRpICRhZnRlcgp9Cgpwcm9jIHJlYWRfZGlmZl9maWxlcyB7ZmQgYWZ0ZXJ9IHsKCWdsb2JhbCBidWZfcmRmCgoJYXBwZW5kIGJ1Zl9yZGYgW3JlYWQgJGZkXQoJc2V0IGMgMAoJc2V0IG4gW3N0cmluZyBsZW5ndGggJGJ1Zl9yZGZdCgl3aGlsZSB7JGMgPCAkbn0gewoJCXNldCB6MSBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGYgJGNdCgkJaWYgeyR6MSA9PSAtMX0gYnJlYWsKCQlpbmNyIHoxCgkJc2V0IHoyIFtzdHJpbmcgZmlyc3QgIlwwIiAkYnVmX3JkZiAkejFdCgkJaWYgeyR6MiA9PSAtMX0gYnJlYWsKCgkJaW5jciBjCgkJc2V0IGkgW3NwbGl0IFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGYgJGMgW2V4cHIgeyR6MSAtIDJ9XV0geyB9XQoJCXNldCBwIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGYgJHoxIFtleHByIHskejIgLSAxfV1dCgkJbWVyZ2Vfc3RhdGUgXAoJCQlbZW5jb2RpbmcgY29udmVydGZyb20gJHBdIFwKCQkJP1tsaW5kZXggJGkgNF0gXAoJCQlbbGlzdF0gXAoJCQlbbGlzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMl1dCgkJc2V0IGMgJHoyCgkJaW5jciBjCgl9CglpZiB7JGMgPCAkbn0gewoJCXNldCBidWZfcmRmIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGYgJGMgZW5kXQoJfSBlbHNlIHsKCQlzZXQgYnVmX3JkZiB7fQoJfQoKCXJlc2Nhbl9kb25lICRmZCBidWZfcmRmICRhZnRlcgp9Cgpwcm9jIHJlYWRfbHNfb3RoZXJzIHtmZCBhZnRlcn0gewoJZ2xvYmFsIGJ1Zl9ybG8KCglhcHBlbmQgYnVmX3JsbyBbcmVhZCAkZmRdCglzZXQgcGNrIFtzcGxpdCAkYnVmX3JsbyAiXDAiXQoJc2V0IGJ1Zl9ybG8gW2xpbmRleCAkcGNrIGVuZF0KCWZvcmVhY2ggcCBbbHJhbmdlICRwY2sgMCBlbmQtMV0gewoJCW1lcmdlX3N0YXRlIFtlbmNvZGluZyBjb252ZXJ0ZnJvbSAkcF0gP08KCX0KCXJlc2Nhbl9kb25lICRmZCBidWZfcmxvICRhZnRlcgp9Cgpwcm9jIHJlc2Nhbl9kb25lIHtmZCBidWYgYWZ0ZXJ9IHsKCWdsb2JhbCByZXNjYW5fYWN0aXZlCglnbG9iYWwgZmlsZV9zdGF0ZXMgcmVwb19jb25maWcKCXVwdmFyICRidWYgdG9fY2xlYXIKCglpZiB7IVtlb2YgJGZkXX0gcmV0dXJuCglzZXQgdG9fY2xlYXIge30KCWNsb3NlICRmZAoJaWYge1tpbmNyIHJlc2Nhbl9hY3RpdmUgLTFdID4gMH0gcmV0dXJuCgoJcHJ1bmVfc2VsZWN0aW9uCgl1bmxvY2tfaW5kZXgKCWRpc3BsYXlfYWxsX2ZpbGVzCglyZXNob3dfZGlmZgoJdXBsZXZlbCAjMCAkYWZ0ZXIKfQoKcHJvYyBwcnVuZV9zZWxlY3Rpb24ge30gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIHNlbGVjdGVkX3BhdGhzCgoJZm9yZWFjaCBwYXRoIFthcnJheSBuYW1lcyBzZWxlY3RlZF9wYXRoc10gewoJCWlmIHtbY2F0Y2gge3NldCBzdGlsbF9oZXJlICRmaWxlX3N0YXRlcygkcGF0aCl9XX0gewoJCQl1bnNldCBzZWxlY3RlZF9wYXRocygkcGF0aCkKCQl9Cgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgZGlmZgoKcHJvYyBjbGVhcl9kaWZmIHt9IHsKCWdsb2JhbCB1aV9kaWZmIGN1cnJlbnRfZGlmZl9wYXRoIGN1cnJlbnRfZGlmZl9oZWFkZXIKCWdsb2JhbCB1aV9pbmRleCB1aV93b3JrZGlyCgoJJHVpX2RpZmYgY29uZiAtc3RhdGUgbm9ybWFsCgkkdWlfZGlmZiBkZWxldGUgMC4wIGVuZAoJJHVpX2RpZmYgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglzZXQgY3VycmVudF9kaWZmX3BhdGgge30KCXNldCBjdXJyZW50X2RpZmZfaGVhZGVyIHt9CgoJJHVpX2luZGV4IHRhZyByZW1vdmUgaW5fZGlmZiAwLjAgZW5kCgkkdWlfd29ya2RpciB0YWcgcmVtb3ZlIGluX2RpZmYgMC4wIGVuZAp9Cgpwcm9jIHJlc2hvd19kaWZmIHt9IHsKCWdsb2JhbCB1aV9zdGF0dXNfdmFsdWUgZmlsZV9zdGF0ZXMgZmlsZV9saXN0cwoJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIGN1cnJlbnRfZGlmZl9zaWRlCgoJc2V0IHAgJGN1cnJlbnRfZGlmZl9wYXRoCglpZiB7JHAgZXEge319IHsKCQkjIE5vIGRpZmYgaXMgYmVpbmcgc2hvd24uCgl9IGVsc2VpZiB7JGN1cnJlbnRfZGlmZl9zaWRlIGVxIHt9CgkJfHwgW2NhdGNoIHtzZXQgcyAkZmlsZV9zdGF0ZXMoJHApfV0KCQl8fCBbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkZmlsZV9saXN0cygkY3VycmVudF9kaWZmX3NpZGUpICRwXSA9PSAtMX0gewoJCWNsZWFyX2RpZmYKCX0gZWxzZSB7CgkJc2hvd19kaWZmICRwICRjdXJyZW50X2RpZmZfc2lkZQoJfQp9Cgpwcm9jIGhhbmRsZV9lbXB0eV9kaWZmIHt9IHsKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBmaWxlX3N0YXRlcyBmaWxlX2xpc3RzCgoJc2V0IHBhdGggJGN1cnJlbnRfZGlmZl9wYXRoCglzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCglpZiB7W2xpbmRleCAkcyAwXSBuZSB7X019fSByZXR1cm4KCglpbmZvX3BvcHVwICJObyBkaWZmZXJlbmNlcyBkZXRlY3RlZC4KCltzaG9ydF9wYXRoICRwYXRoXSBoYXMgbm8gY2hhbmdlcy4KClRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGZpbGUgd2FzIHVwZGF0ZWQKYnkgYW5vdGhlciBhcHBsaWNhdGlvbiwgYnV0IHRoZSBjb250ZW50IHdpdGhpbgp0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQuCgpBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB0byBmaW5kCm90aGVyIGZpbGVzIHdoaWNoIG1heSBoYXZlIHRoZSBzYW1lIHN0YXRlLiIKCgljbGVhcl9kaWZmCglkaXNwbGF5X2ZpbGUgJHBhdGggX18KCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0gMAp9Cgpwcm9jIHNob3dfZGlmZiB7cGF0aCB3IHtsbm8ge319fSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMgZmlsZV9saXN0cwoJZ2xvYmFsIGlzXzN3YXlfZGlmZiBkaWZmX2FjdGl2ZSByZXBvX2NvbmZpZwoJZ2xvYmFsIHVpX2RpZmYgdWlfc3RhdHVzX3ZhbHVlIHVpX2luZGV4IHVpX3dvcmtkaXIKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBjdXJyZW50X2RpZmZfc2lkZSBjdXJyZW50X2RpZmZfaGVhZGVyCgoJaWYgeyRkaWZmX2FjdGl2ZSB8fCAhW2xvY2tfaW5kZXggcmVhZF19IHJldHVybgoKCWNsZWFyX2RpZmYKCWlmIHskbG5vID09IHt9fSB7CgkJc2V0IGxubyBbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkZmlsZV9saXN0cygkdykgJHBhdGhdCgkJaWYgeyRsbm8gPj0gMH0gewoJCQlpbmNyIGxubwoJCX0KCX0KCWlmIHskbG5vID49IDF9IHsKCQkkdyB0YWcgYWRkIGluX2RpZmYgJGxuby4wIFtleHByIHskbG5vICsgMX1dLjAKCX0KCglzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCglzZXQgbSBbbGluZGV4ICRzIDBdCglzZXQgaXNfM3dheV9kaWZmIDAKCXNldCBkaWZmX2FjdGl2ZSAxCglzZXQgY3VycmVudF9kaWZmX3BhdGggJHBhdGgKCXNldCBjdXJyZW50X2RpZmZfc2lkZSAkdwoJc2V0IGN1cnJlbnRfZGlmZl9oZWFkZXIge30KCXNldCB1aV9zdGF0dXNfdmFsdWUgIkxvYWRpbmcgZGlmZiBvZiBbZXNjYXBlX3BhdGggJHBhdGhdLi4uIgoKCSMgLSBHaXQgd29uJ3QgZ2l2ZSB1cyB0aGUgZGlmZiwgdGhlcmUncyBub3RoaW5nIHRvIGNvbXBhcmUgdG8hCgkjCglpZiB7JG0gZXEge19PfX0gewoJCXNldCBtYXhfc3ogW2V4cHIgezEyOCAqIDEwMjR9XQoJCWlmIHtbY2F0Y2ggewoJCQkJc2V0IGZkIFtvcGVuICRwYXRoIHJdCgkJCQlzZXQgY29udGVudCBbcmVhZCAkZmQgJG1heF9zel0KCQkJCWNsb3NlICRmZAoJCQkJc2V0IHN6IFtmaWxlIHNpemUgJHBhdGhdCgkJCX0gZXJyIF19IHsKCQkJc2V0IGRpZmZfYWN0aXZlIDAKCQkJdW5sb2NrX2luZGV4CgkJCXNldCB1aV9zdGF0dXNfdmFsdWUgIlVuYWJsZSB0byBkaXNwbGF5IFtlc2NhcGVfcGF0aCAkcGF0aF0iCgkJCWVycm9yX3BvcHVwICJFcnJvciBsb2FkaW5nIGZpbGU6XG5cbiRlcnIiCgkJCXJldHVybgoJCX0KCQkkdWlfZGlmZiBjb25mIC1zdGF0ZSBub3JtYWwKCQlpZiB7IVtjYXRjaCB7c2V0IHR5cGUgW2V4ZWMgZmlsZSAkcGF0aF19XX0gewoJCQlzZXQgbiBbc3RyaW5nIGxlbmd0aCAkcGF0aF0KCQkJaWYge1tzdHJpbmcgZXF1YWwgLWxlbmd0aCAkbiAkcGF0aCAkdHlwZV19IHsKCQkJCXNldCB0eXBlIFtzdHJpbmcgcmFuZ2UgJHR5cGUgJG4gZW5kXQoJCQkJcmVnc3ViIHteOj9ccyp9ICR0eXBlIHt9IHR5cGUKCQkJfQoJCQkkdWlfZGlmZiBpbnNlcnQgZW5kICIqICR0eXBlXG4iIGRfQAoJCX0KCQlpZiB7W3N0cmluZyBmaXJzdCAiXDAiICRjb250ZW50XSAhPSAtMX0gewoJCQkkdWlfZGlmZiBpbnNlcnQgZW5kIFwKCQkJCSIqIEJpbmFyeSBmaWxlIChub3Qgc2hvd2luZyBjb250ZW50KS4iIFwKCQkJCWRfQAoJCX0gZWxzZSB7CgkJCWlmIHskc3ogPiAkbWF4X3N6fSB7CgkJCQkkdWlfZGlmZiBpbnNlcnQgZW5kIFwKIiogVW50cmFja2VkIGZpbGUgaXMgJHN6IGJ5dGVzLgoqIFNob3dpbmcgb25seSBmaXJzdCAkbWF4X3N6IGJ5dGVzLgoiIGRfQAoJCQl9CgkJCSR1aV9kaWZmIGluc2VydCBlbmQgJGNvbnRlbnQKCQkJaWYgeyRzeiA+ICRtYXhfc3p9IHsKCQkJCSR1aV9kaWZmIGluc2VydCBlbmQgIgoqIFVudHJhY2tlZCBmaWxlIGNsaXBwZWQgaGVyZSBieSBbYXBwbmFtZV0uCiogVG8gc2VlIHRoZSBlbnRpcmUgZmlsZSwgdXNlIGFuIGV4dGVybmFsIGVkaXRvci4KIiBkX0AKCQkJfQoJCX0KCQkkdWlfZGlmZiBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJCXNldCBkaWZmX2FjdGl2ZSAwCgkJdW5sb2NrX2luZGV4CgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufQoJCXJldHVybgoJfQoKCXNldCBjbWQgW2xpc3QgfCBnaXRdCglpZiB7JHcgZXEgJHVpX2luZGV4fSB7CgkJbGFwcGVuZCBjbWQgZGlmZi1pbmRleAoJCWxhcHBlbmQgY21kIC0tY2FjaGVkCgl9IGVsc2VpZiB7JHcgZXEgJHVpX3dvcmtkaXJ9IHsKCQlpZiB7W3N0cmluZyBpbmRleCAkbSAwXSBlcSB7VX19IHsKCQkJbGFwcGVuZCBjbWQgZGlmZgoJCX0gZWxzZSB7CgkJCWxhcHBlbmQgY21kIGRpZmYtZmlsZXMKCQl9Cgl9CgoJbGFwcGVuZCBjbWQgLXAKCWxhcHBlbmQgY21kIC0tbm8tY29sb3IKCWlmIHskcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSA+IDB9IHsKCQlsYXBwZW5kIGNtZCAiLVUkcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSIKCX0KCWlmIHskdyBlcSAkdWlfaW5kZXh9IHsKCQlsYXBwZW5kIGNtZCBbUEFSRU5UXQoJfQoJbGFwcGVuZCBjbWQgLS0KCWxhcHBlbmQgY21kICRwYXRoCgoJaWYge1tjYXRjaCB7c2V0IGZkIFtvcGVuICRjbWQgcl19IGVycl19IHsKCQlzZXQgZGlmZl9hY3RpdmUgMAoJCXVubG9ja19pbmRleAoJCXNldCB1aV9zdGF0dXNfdmFsdWUgIlVuYWJsZSB0byBkaXNwbGF5IFtlc2NhcGVfcGF0aCAkcGF0aF0iCgkJZXJyb3JfcG9wdXAgIkVycm9yIGxvYWRpbmcgZGlmZjpcblxuJGVyciIKCQlyZXR1cm4KCX0KCglmY29uZmlndXJlICRmZCBcCgkJLWJsb2NraW5nIDAgXAoJCS1lbmNvZGluZyBiaW5hcnkgXAoJCS10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgcmVhZF9kaWZmICRmZF0KfQoKcHJvYyByZWFkX2RpZmYge2ZkfSB7CglnbG9iYWwgdWlfZGlmZiB1aV9zdGF0dXNfdmFsdWUgZGlmZl9hY3RpdmUKCWdsb2JhbCBpc18zd2F5X2RpZmYgY3VycmVudF9kaWZmX2hlYWRlcgoKCSR1aV9kaWZmIGNvbmYgLXN0YXRlIG5vcm1hbAoJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CgkJIyAtLSBDbGVhbnVwIHVuaW50ZXJlc3RpbmcgZGlmZiBoZWFkZXIgbGluZXMuCgkJIwoJCWlmIHsgICBbc3RyaW5nIG1hdGNoIHtkaWZmIC0tZ2l0ICp9ICAgICAgJGxpbmVdCgkJCXx8IFtzdHJpbmcgbWF0Y2gge2RpZmYgLS1jYyAqfSAgICAgICAkbGluZV0KCQkJfHwgW3N0cmluZyBtYXRjaCB7ZGlmZiAtLWNvbWJpbmVkICp9ICRsaW5lXQoJCQl8fCBbc3RyaW5nIG1hdGNoIHstLS0gKn0gICAgICAgICAgICAgJGxpbmVdCgkJCXx8IFtzdHJpbmcgbWF0Y2ggeysrKyAqfSAgICAgICAgICAgICAkbGluZV19IHsKCQkJYXBwZW5kIGN1cnJlbnRfZGlmZl9oZWFkZXIgJGxpbmUgIlxuIgoJCQljb250aW51ZQoJCX0KCQlpZiB7W3N0cmluZyBtYXRjaCB7aW5kZXggKn0gJGxpbmVdfSBjb250aW51ZQoJCWlmIHskbGluZSBlcSB7ZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwfX0gewoJCQlzZXQgbGluZSAiZGVsZXRlZCBzeW1saW5rIgoJCX0KCgkJIyAtLSBBdXRvbWF0aWNhbGx5IGRldGVjdCBpZiB0aGlzIGlzIGEgMyB3YXkgZGlmZi4KCQkjCgkJaWYge1tzdHJpbmcgbWF0Y2gge0BAQCAqfSAkbGluZV19IHtzZXQgaXNfM3dheV9kaWZmIDF9CgoJCWlmIHtbc3RyaW5nIG1hdGNoIHttb2RlICp9ICRsaW5lXQoJCQl8fCBbc3RyaW5nIG1hdGNoIHtuZXcgZmlsZSAqfSAkbGluZV0KCQkJfHwgW3N0cmluZyBtYXRjaCB7ZGVsZXRlZCBmaWxlICp9ICRsaW5lXQoJCQl8fCBbc3RyaW5nIG1hdGNoIHtCaW5hcnkgZmlsZXMgKiBhbmQgKiBkaWZmZXJ9ICRsaW5lXQoJCQl8fCAkbGluZSBlcSB7XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlfQoJCQl8fCBbcmVnZXhwIHteXCogVW5tZXJnZWQgcGF0aCB9ICRsaW5lXX0gewoJCQlzZXQgdGFncyB7fQoJCX0gZWxzZWlmIHskaXNfM3dheV9kaWZmfSB7CgkJCXNldCBvcCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMV0KCQkJc3dpdGNoIC0tICRvcCB7CgkJCXsgIH0ge3NldCB0YWdzIHt9fQoJCQl7QEB9IHtzZXQgdGFncyBkX0B9CgkJCXsgK30ge3NldCB0YWdzIGRfcyt9CgkJCXsgLX0ge3NldCB0YWdzIGRfcy19CgkJCXsrIH0ge3NldCB0YWdzIGRfK3N9CgkJCXstIH0ge3NldCB0YWdzIGRfLXN9CgkJCXstLX0ge3NldCB0YWdzIGRfLS19CgkJCXsrK30gewoJCQkJaWYge1tyZWdleHAge15cK1wrKFs8Pl17N30gfD17N30pfSAkbGluZSBfZyBvcF19IHsKCQkJCQlzZXQgbGluZSBbc3RyaW5nIHJlcGxhY2UgJGxpbmUgMCAxIHsgIH1dCgkJCQkJc2V0IHRhZ3MgZCRvcAoJCQkJfSBlbHNlIHsKCQkJCQlzZXQgdGFncyBkXysrCgkJCQl9CgkJCX0KCQkJZGVmYXVsdCB7CgkJCQlwdXRzICJlcnJvcjogVW5oYW5kbGVkIDMgd2F5IGRpZmYgbWFya2VyOiB7JG9wfSIKCQkJCXNldCB0YWdzIHt9CgkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNldCBvcCBbc3RyaW5nIGluZGV4ICRsaW5lIDBdCgkJCXN3aXRjaCAtLSAkb3AgewoJCQl7IH0ge3NldCB0YWdzIHt9fQoJCQl7QH0ge3NldCB0YWdzIGRfQH0KCQkJey19IHtzZXQgdGFncyBkXy19CgkJCXsrfSB7CgkJCQlpZiB7W3JlZ2V4cCB7XlwrKFs8Pl17N30gfD17N30pfSAkbGluZSBfZyBvcF19IHsKCQkJCQlzZXQgbGluZSBbc3RyaW5nIHJlcGxhY2UgJGxpbmUgMCAwIHsgfV0KCQkJCQlzZXQgdGFncyBkJG9wCgkJCQl9IGVsc2UgewoJCQkJCXNldCB0YWdzIGRfKwoJCQkJfQoJCQl9CgkJCWRlZmF1bHQgewoJCQkJcHV0cyAiZXJyb3I6IFVuaGFuZGxlZCAyIHdheSBkaWZmIG1hcmtlcjogeyRvcH0iCgkJCQlzZXQgdGFncyB7fQoJCQl9CgkJCX0KCQl9CgkJJHVpX2RpZmYgaW5zZXJ0IGVuZCAkbGluZSAkdGFncwoJCWlmIHtbc3RyaW5nIGluZGV4ICRsaW5lIGVuZF0gZXEgIlxyIn0gewoJCQkkdWlfZGlmZiB0YWcgYWRkIGRfY3Ige2VuZCAtIDJjfQoJCX0KCQkkdWlfZGlmZiBpbnNlcnQgZW5kICJcbiIgJHRhZ3MKCX0KCSR1aV9kaWZmIGNvbmYgLXN0YXRlIGRpc2FibGVkCgoJaWYge1tlb2YgJGZkXX0gewoJCWNsb3NlICRmZAoJCXNldCBkaWZmX2FjdGl2ZSAwCgkJdW5sb2NrX2luZGV4CgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufQoKCQlpZiB7WyR1aV9kaWZmIGluZGV4IGVuZF0gZXEgezIuMH19IHsKCQkJaGFuZGxlX2VtcHR5X2RpZmYKCQl9Cgl9Cn0KCnByb2MgYXBwbHlfaHVuayB7eCB5fSB7CglnbG9iYWwgY3VycmVudF9kaWZmX3BhdGggY3VycmVudF9kaWZmX2hlYWRlciBjdXJyZW50X2RpZmZfc2lkZQoJZ2xvYmFsIHVpX2RpZmYgdWlfaW5kZXggZmlsZV9zdGF0ZXMKCglpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIGVxIHt9IHx8ICRjdXJyZW50X2RpZmZfaGVhZGVyIGVxIHt9fSByZXR1cm4KCWlmIHshW2xvY2tfaW5kZXggYXBwbHlfaHVua119IHJldHVybgoKCXNldCBhcHBseV9jbWQge2dpdCBhcHBseSAtLWNhY2hlZCAtLXdoaXRlc3BhY2U9bm93YXJufQoJc2V0IG1pIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRjdXJyZW50X2RpZmZfcGF0aCkgMF0KCWlmIHskY3VycmVudF9kaWZmX3NpZGUgZXEgJHVpX2luZGV4fSB7CgkJc2V0IG1vZGUgdW5zdGFnZQoJCWxhcHBlbmQgYXBwbHlfY21kIC0tcmV2ZXJzZQoJCWlmIHtbc3RyaW5nIGluZGV4ICRtaSAwXSBuZSB7TX19IHsKCQkJdW5sb2NrX2luZGV4CgkJCXJldHVybgoJCX0KCX0gZWxzZSB7CgkJc2V0IG1vZGUgc3RhZ2UKCQlpZiB7W3N0cmluZyBpbmRleCAkbWkgMV0gbmUge019fSB7CgkJCXVubG9ja19pbmRleAoJCQlyZXR1cm4KCQl9Cgl9CgoJc2V0IHNfbG5vIFtsaW5kZXggW3NwbGl0IFskdWlfZGlmZiBpbmRleCBAJHgsJHldIC5dIDBdCglzZXQgc19sbm8gWyR1aV9kaWZmIHNlYXJjaCAtYmFja3dhcmRzIC1yZWdleHAgXkBAICRzX2xuby4wIDAuMF0KCWlmIHskc19sbm8gZXEge319IHsKCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCglzZXQgZV9sbm8gWyR1aV9kaWZmIHNlYXJjaCAtZm9yd2FyZHMgLXJlZ2V4cCBeQEAgIiRzX2xubyArIDEgbGluZXMiIGVuZF0KCWlmIHskZV9sbm8gZXEge319IHsKCQlzZXQgZV9sbm8gZW5kCgl9CgoJaWYge1tjYXRjaCB7CgkJc2V0IHAgW29wZW4gInwgJGFwcGx5X2NtZCIgd10KCQlmY29uZmlndXJlICRwIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVuY29kaW5nIGJpbmFyeQoJCXB1dHMgLW5vbmV3bGluZSAkcCAkY3VycmVudF9kaWZmX2hlYWRlcgoJCXB1dHMgLW5vbmV3bGluZSAkcCBbJHVpX2RpZmYgZ2V0ICRzX2xubyAkZV9sbm9dCgkJY2xvc2UgJHB9IGVycl19IHsKCQllcnJvcl9wb3B1cCAiRmFpbGVkIHRvICRtb2RlIHNlbGVjdGVkIGh1bmsuXG5cbiRlcnIiCgkJdW5sb2NrX2luZGV4CgkJcmV0dXJuCgl9CgoJJHVpX2RpZmYgY29uZiAtc3RhdGUgbm9ybWFsCgkkdWlfZGlmZiBkZWxldGUgJHNfbG5vICRlX2xubwoJJHVpX2RpZmYgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglpZiB7WyR1aV9kaWZmIGdldCAxLjAgZW5kXSBlcSAiXG4ifSB7CgkJc2V0IG8gXwoJfSBlbHNlIHsKCQlzZXQgbyA/Cgl9CgoJaWYgeyRjdXJyZW50X2RpZmZfc2lkZSBlcSAkdWlfaW5kZXh9IHsKCQlzZXQgbWkgJHtvfU0KCX0gZWxzZWlmIHtbc3RyaW5nIGluZGV4ICRtaSAwXSBlcSB7X319IHsKCQlzZXQgbWkgTSRvCgl9IGVsc2UgewoJCXNldCBtaSA/JG8KCX0KCXVubG9ja19pbmRleAoJZGlzcGxheV9maWxlICRjdXJyZW50X2RpZmZfcGF0aCAkbWkKCWlmIHskbyBlcSB7X319IHsKCQljbGVhcl9kaWZmCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgY29tbWl0Cgpwcm9jIGxvYWRfbGFzdF9jb21taXQge30gewoJZ2xvYmFsIEhFQUQgUEFSRU5UIE1FUkdFX0hFQUQgY29tbWl0X3R5cGUgdWlfY29tbQoJZ2xvYmFsIHJlcG9fY29uZmlnCgoJaWYge1tsbGVuZ3RoICRQQVJFTlRdID09IDB9IHsKCQllcnJvcl9wb3B1cCB7VGhlcmUgaXMgbm90aGluZyB0byBhbWVuZC4KCllvdSBhcmUgYWJvdXQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIGNvbW1pdC4KVGhlcmUgaXMgbm8gY29tbWl0IGJlZm9yZSB0aGlzIHRvIGFtZW5kLgp9CgkJcmV0dXJuCgl9CgoJcmVwb3NpdG9yeV9zdGF0ZSBjdXJUeXBlIGN1ckhFQUQgY3VyTUVSR0VfSEVBRAoJaWYgeyRjdXJUeXBlIGVxIHttZXJnZX19IHsKCQllcnJvcl9wb3B1cCB7Q2Fubm90IGFtZW5kIHdoaWxlIG1lcmdpbmcuCgpZb3UgYXJlIGN1cnJlbnRseSBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UgdGhhdApoYXMgbm90IGJlZW4gZnVsbHkgY29tcGxldGVkLiAgWW91IGNhbm5vdCBhbWVuZAp0aGUgcHJpb3IgY29tbWl0IHVubGVzcyB5b3UgZmlyc3QgYWJvcnQgdGhlCmN1cnJlbnQgbWVyZ2UgYWN0aXZpdHkuCn0KCQlyZXR1cm4KCX0KCglzZXQgbXNnIHt9CglzZXQgcGFyZW50cyBbbGlzdF0KCWlmIHtbY2F0Y2ggewoJCQlzZXQgZmQgW29wZW4gInwgZ2l0IGNhdC1maWxlIGNvbW1pdCAkY3VySEVBRCIgcl0KCQkJZmNvbmZpZ3VyZSAkZmQgLWVuY29kaW5nIGJpbmFyeSAtdHJhbnNsYXRpb24gbGYKCQkJaWYge1tjYXRjaCB7c2V0IGVuYyAkcmVwb19jb25maWcoaTE4bi5jb21taXRlbmNvZGluZyl9XX0gewoJCQkJc2V0IGVuYyB1dGYtOAoJCQl9CgkJCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPiAwfSB7CgkJCQlpZiB7W3N0cmluZyBtYXRjaCB7cGFyZW50ICp9ICRsaW5lXX0gewoJCQkJCWxhcHBlbmQgcGFyZW50cyBbc3RyaW5nIHJhbmdlICRsaW5lIDcgZW5kXQoJCQkJfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2gge2VuY29kaW5nICp9ICRsaW5lXX0gewoJCQkJCXNldCBlbmMgW3N0cmluZyB0b2xvd2VyIFtzdHJpbmcgcmFuZ2UgJGxpbmUgOSBlbmRdXQoJCQkJfQoJCQl9CgkJCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyAkZW5jCgkJCXNldCBtc2cgW3N0cmluZyB0cmltIFtyZWFkICRmZF1dCgkJCWNsb3NlICRmZAoJCX0gZXJyXX0gewoJCWVycm9yX3BvcHVwICJFcnJvciBsb2FkaW5nIGNvbW1pdCBkYXRhIGZvciBhbWVuZDpcblxuJGVyciIKCQlyZXR1cm4KCX0KCglzZXQgSEVBRCAkY3VySEVBRAoJc2V0IFBBUkVOVCAkcGFyZW50cwoJc2V0IE1FUkdFX0hFQUQgW2xpc3RdCglzd2l0Y2ggLS0gW2xsZW5ndGggJHBhcmVudHNdIHsKCTAgICAgICAge3NldCBjb21taXRfdHlwZSBhbWVuZC1pbml0aWFsfQoJMSAgICAgICB7c2V0IGNvbW1pdF90eXBlIGFtZW5kfQoJZGVmYXVsdCB7c2V0IGNvbW1pdF90eXBlIGFtZW5kLW1lcmdlfQoJfQoKCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkkdWlfY29tbSBpbnNlcnQgZW5kICRtc2cKCSR1aV9jb21tIGVkaXQgcmVzZXQKCSR1aV9jb21tIGVkaXQgbW9kaWZpZWQgZmFsc2UKCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0KfQoKcHJvYyBjcmVhdGVfbmV3X2NvbW1pdCB7fSB7CglnbG9iYWwgY29tbWl0X3R5cGUgdWlfY29tbQoKCXNldCBjb21taXRfdHlwZSBub3JtYWwKCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkkdWlfY29tbSBlZGl0IHJlc2V0CgkkdWlfY29tbSBlZGl0IG1vZGlmaWVkIGZhbHNlCglyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19Cn0KCnNldCBHSVRfQ09NTUlUVEVSX0lERU5UIHt9Cgpwcm9jIGNvbW1pdHRlcl9pZGVudCB7fSB7CglnbG9iYWwgR0lUX0NPTU1JVFRFUl9JREVOVAoKCWlmIHskR0lUX0NPTU1JVFRFUl9JREVOVCBlcSB7fX0gewoJCWlmIHtbY2F0Y2gge3NldCBtZSBbZ2l0IHZhciBHSVRfQ09NTUlUVEVSX0lERU5UXX0gZXJyXX0gewoJCQllcnJvcl9wb3B1cCAiVW5hYmxlIHRvIG9idGFpbiB5b3VyIGlkZW50aXR5OlxuXG4kZXJyIgoJCQlyZXR1cm4ge30KCQl9CgkJaWYgeyFbcmVnZXhwIHteKC4qKSBbMC05XSsgWy0rMC05XSskfSBcCgkJCSRtZSBtZSBHSVRfQ09NTUlUVEVSX0lERU5UXX0gewoJCQllcnJvcl9wb3B1cCAiSW52YWxpZCBHSVRfQ09NTUlUVEVSX0lERU5UOlxuXG4kbWUiCgkJCXJldHVybiB7fQoJCX0KCX0KCglyZXR1cm4gJEdJVF9DT01NSVRURVJfSURFTlQKfQoKcHJvYyBjb21taXRfdHJlZSB7fSB7CglnbG9iYWwgSEVBRCBjb21taXRfdHlwZSBmaWxlX3N0YXRlcyB1aV9jb21tIHJlcG9fY29uZmlnCglnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlIHBjaF9lcnJvcgoKCWlmIHtbY29tbWl0dGVyX2lkZW50XSBlcSB7fX0gcmV0dXJuCglpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgoKCSMgLS0gT3VyIGluIG1lbW9yeSBzdGF0ZSBzaG91bGQgbWF0Y2ggdGhlIHJlcG9zaXRvcnkuCgkjCglyZXBvc2l0b3J5X3N0YXRlIGN1clR5cGUgY3VySEVBRCBjdXJNRVJHRV9IRUFECglpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXQoJCSYmICRjdXJUeXBlIGVxIHtub3JtYWx9CgkJJiYgJGN1ckhFQUQgZXEgJEhFQUR9IHsKCX0gZWxzZWlmIHskY29tbWl0X3R5cGUgbmUgJGN1clR5cGUgfHwgJEhFQUQgbmUgJGN1ckhFQUR9IHsKCQlpbmZvX3BvcHVwIHtMYXN0IHNjYW5uZWQgc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVwb3NpdG9yeSBzdGF0ZS4KCkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeQpzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSByZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQKYmVmb3JlIGFub3RoZXIgY29tbWl0IGNhbiBiZSBjcmVhdGVkLgoKVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuCn0KCQl1bmxvY2tfaW5kZXgKCQlyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19CgkJcmV0dXJuCgl9CgoJIyAtLSBBdCBsZWFzdCBvbmUgZmlsZSBzaG91bGQgZGlmZmVyIGluIHRoZSBpbmRleC4KCSMKCXNldCBmaWxlc19yZWFkeSAwCglmb3JlYWNoIHBhdGggW2FycmF5IG5hbWVzIGZpbGVfc3RhdGVzXSB7CgkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwYXRoKSAwXSB7CgkJXz8ge2NvbnRpbnVlfQoJCUE/IC0KCQlEPyAtCgkJTT8ge3NldCBmaWxlc19yZWFkeSAxfQoJCVU/IHsKCQkJZXJyb3JfcG9wdXAgIlVubWVyZ2VkIGZpbGVzIGNhbm5vdCBiZSBjb21taXR0ZWQuCgpGaWxlIFtzaG9ydF9wYXRoICRwYXRoXSBoYXMgbWVyZ2UgY29uZmxpY3RzLgpZb3UgbXVzdCByZXNvbHZlIHRoZW0gYW5kIGFkZCB0aGUgZmlsZSBiZWZvcmUgY29tbWl0dGluZy4KIgoJCQl1bmxvY2tfaW5kZXgKCQkJcmV0dXJuCgkJfQoJCWRlZmF1bHQgewoJCQllcnJvcl9wb3B1cCAiVW5rbm93biBmaWxlIHN0YXRlIFtsaW5kZXggJHMgMF0gZGV0ZWN0ZWQuCgpGaWxlIFtzaG9ydF9wYXRoICRwYXRoXSBjYW5ub3QgYmUgY29tbWl0dGVkIGJ5IHRoaXMgcHJvZ3JhbS4KIgoJCX0KCQl9Cgl9CglpZiB7ISRmaWxlc19yZWFkeSAmJiAhW3N0cmluZyBtYXRjaCAqbWVyZ2UgJGN1clR5cGVdfSB7CgkJaW5mb19wb3B1cCB7Tm8gY2hhbmdlcyB0byBjb21taXQuCgpZb3UgbXVzdCBhZGQgYXQgbGVhc3QgMSBmaWxlIGJlZm9yZSB5b3UgY2FuIGNvbW1pdC4KfQoJCXVubG9ja19pbmRleAoJCXJldHVybgoJfQoKCSMgLS0gQSBtZXNzYWdlIGlzIHJlcXVpcmVkLgoJIwoJc2V0IG1zZyBbc3RyaW5nIHRyaW0gWyR1aV9jb21tIGdldCAxLjAgZW5kXV0KCXJlZ3N1YiAtYWxsIC1saW5lIHtbIFx0XHJdKyR9ICRtc2cge30gbXNnCglpZiB7JG1zZyBlcSB7fX0gewoJCWVycm9yX3BvcHVwIHtQbGVhc2Ugc3VwcGx5IGEgY29tbWl0IG1lc3NhZ2UuCgpBIGdvb2QgY29tbWl0IG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgoKLSBGaXJzdCBsaW5lOiBEZXNjcmliZSBpbiBvbmUgc2VudGFuY2Ugd2hhdCB5b3UgZGlkLgotIFNlY29uZCBsaW5lOiBCbGFuawotIFJlbWFpbmluZyBsaW5lczogRGVzY3JpYmUgd2h5IHRoaXMgY2hhbmdlIGlzIGdvb2QuCn0KCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCgkjIC0tIFJ1biB0aGUgcHJlLWNvbW1pdCBob29rLgoJIwoJc2V0IHBjaG9vayBbZ2l0ZGlyIGhvb2tzIHByZS1jb21taXRdCgoJIyBPbiBDeWd3aW4gW2ZpbGUgZXhlY3V0YWJsZV0gbWlnaHQgbGllIHNvIHdlIG5lZWQgdG8gYXNrCgkjIHRoZSBzaGVsbCBpZiB0aGUgaG9vayBpcyBleGVjdXRhYmxlLiAgWWVzIHRoYXQncyBhbm5veWluZy4KCSMKCWlmIHtbaXNfQ3lnd2luXSAmJiBbZmlsZSBpc2ZpbGUgJHBjaG9va119IHsKCQlzZXQgcGNob29rIFtsaXN0IHNoIC1jIFtjb25jYXQgXAoJCQkiaWYgdGVzdCAteCBcIiRwY2hvb2tcIjsiIFwKCQkJInRoZW4gZXhlYyBcIiRwY2hvb2tcIiAyPiYxOyIgXAoJCQkiZmkiXV0KCX0gZWxzZWlmIHtbZmlsZSBleGVjdXRhYmxlICRwY2hvb2tdfSB7CgkJc2V0IHBjaG9vayBbbGlzdCAkcGNob29rIHwmIGNhdF0KCX0gZWxzZSB7CgkJY29tbWl0X3dyaXRldHJlZSAkY3VySEVBRCAkbXNnCgkJcmV0dXJuCgl9CgoJc2V0IHVpX3N0YXR1c192YWx1ZSB7Q2FsbGluZyBwcmUtY29tbWl0IGhvb2suLi59CglzZXQgcGNoX2Vycm9yIHt9CglzZXQgZmRfcGggW29wZW4gInwgJHBjaG9vayIgcl0KCWZjb25maWd1cmUgJGZkX3BoIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmRfcGggcmVhZGFibGUgXAoJCVtsaXN0IGNvbW1pdF9wcmVob29rX3dhaXQgJGZkX3BoICRjdXJIRUFEICRtc2ddCn0KCnByb2MgY29tbWl0X3ByZWhvb2tfd2FpdCB7ZmRfcGggY3VySEVBRCBtc2d9IHsKCWdsb2JhbCBwY2hfZXJyb3IgdWlfc3RhdHVzX3ZhbHVlCgoJYXBwZW5kIHBjaF9lcnJvciBbcmVhZCAkZmRfcGhdCglmY29uZmlndXJlICRmZF9waCAtYmxvY2tpbmcgMQoJaWYge1tlb2YgJGZkX3BoXX0gewoJCWlmIHtbY2F0Y2gge2Nsb3NlICRmZF9waH1dfSB7CgkJCXNldCB1aV9zdGF0dXNfdmFsdWUge0NvbW1pdCBkZWNsaW5lZCBieSBwcmUtY29tbWl0IGhvb2sufQoJCQlob29rX2ZhaWxlZF9wb3B1cCBwcmUtY29tbWl0ICRwY2hfZXJyb3IKCQkJdW5sb2NrX2luZGV4CgkJfSBlbHNlIHsKCQkJY29tbWl0X3dyaXRldHJlZSAkY3VySEVBRCAkbXNnCgkJfQoJCXNldCBwY2hfZXJyb3Ige30KCQlyZXR1cm4KCX0KCWZjb25maWd1cmUgJGZkX3BoIC1ibG9ja2luZyAwCn0KCnByb2MgY29tbWl0X3dyaXRldHJlZSB7Y3VySEVBRCBtc2d9IHsKCWdsb2JhbCB1aV9zdGF0dXNfdmFsdWUKCglzZXQgdWlfc3RhdHVzX3ZhbHVlIHtDb21taXR0aW5nIGNoYW5nZXMuLi59CglzZXQgZmRfd3QgW29wZW4gInwgZ2l0IHdyaXRlLXRyZWUiIHJdCglmaWxlZXZlbnQgJGZkX3d0IHJlYWRhYmxlIFwKCQlbbGlzdCBjb21taXRfY29tbWl0dHJlZSAkZmRfd3QgJGN1ckhFQUQgJG1zZ10KfQoKcHJvYyBjb21taXRfY29tbWl0dHJlZSB7ZmRfd3QgY3VySEVBRCBtc2d9IHsKCWdsb2JhbCBIRUFEIFBBUkVOVCBNRVJHRV9IRUFEIGNvbW1pdF90eXBlCglnbG9iYWwgYWxsX2hlYWRzIGN1cnJlbnRfYnJhbmNoCglnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlIHVpX2NvbW0gc2VsZWN0ZWRfY29tbWl0X3R5cGUKCWdsb2JhbCBmaWxlX3N0YXRlcyBzZWxlY3RlZF9wYXRocyByZXNjYW5fYWN0aXZlCglnbG9iYWwgcmVwb19jb25maWcKCglnZXRzICRmZF93dCB0cmVlX2lkCglpZiB7JHRyZWVfaWQgZXEge30gfHwgW2NhdGNoIHtjbG9zZSAkZmRfd3R9IGVycl19IHsKCQllcnJvcl9wb3B1cCAid3JpdGUtdHJlZSBmYWlsZWQ6XG5cbiRlcnIiCgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7Q29tbWl0IGZhaWxlZC59CgkJdW5sb2NrX2luZGV4CgkJcmV0dXJuCgl9CgoJIyAtLSBWZXJpZnkgdGhpcyB3YXNuJ3QgYW4gZW1wdHkgY2hhbmdlLgoJIwoJaWYgeyRjb21taXRfdHlwZSBlcSB7bm9ybWFsfX0gewoJCXNldCBvbGRfdHJlZSBbZ2l0IHJldi1wYXJzZSAiJFBBUkVOVF57dHJlZX0iXQoJCWlmIHskdHJlZV9pZCBlcSAkb2xkX3RyZWV9IHsKCQkJaW5mb19wb3B1cCB7Tm8gY2hhbmdlcyB0byBjb21taXQuCgpObyBmaWxlcyB3ZXJlIG1vZGlmaWVkIGJ5IHRoaXMgY29tbWl0IGFuZCBpdAp3YXMgbm90IGEgbWVyZ2UgY29tbWl0LgoKQSByZXNjYW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgbm93Lgp9CgkJCXVubG9ja19pbmRleAoJCQlyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge05vIGNoYW5nZXMgdG8gY29tbWl0Ln19CgkJCXJldHVybgoJCX0KCX0KCgkjIC0tIEJ1aWxkIHRoZSBtZXNzYWdlLgoJIwoJc2V0IG1zZ19wIFtnaXRkaXIgQ09NTUlUX0VESVRNU0ddCglzZXQgbXNnX3d0IFtvcGVuICRtc2dfcCB3XQoJaWYge1tjYXRjaCB7c2V0IGVuYyAkcmVwb19jb25maWcoaTE4bi5jb21taXRlbmNvZGluZyl9XX0gewoJCXNldCBlbmMgdXRmLTgKCX0KCWZjb25maWd1cmUgJG1zZ193dCAtZW5jb2RpbmcgJGVuYyAtdHJhbnNsYXRpb24gYmluYXJ5CglwdXRzIC1ub25ld2xpbmUgJG1zZ193dCAkbXNnCgljbG9zZSAkbXNnX3d0CgoJIyAtLSBDcmVhdGUgdGhlIGNvbW1pdC4KCSMKCXNldCBjbWQgW2xpc3QgZ2l0IGNvbW1pdC10cmVlICR0cmVlX2lkXQoJZm9yZWFjaCBwIFtjb25jYXQgJFBBUkVOVCAkTUVSR0VfSEVBRF0gewoJCWxhcHBlbmQgY21kIC1wICRwCgl9CglsYXBwZW5kIGNtZCA8JG1zZ19wCglpZiB7W2NhdGNoIHtzZXQgY210X2lkIFtldmFsIGV4ZWMgJGNtZF19IGVycl19IHsKCQllcnJvcl9wb3B1cCAiY29tbWl0LXRyZWUgZmFpbGVkOlxuXG4kZXJyIgoJCXNldCB1aV9zdGF0dXNfdmFsdWUge0NvbW1pdCBmYWlsZWQufQoJCXVubG9ja19pbmRleAoJCXJldHVybgoJfQoKCSMgLS0gVXBkYXRlIHRoZSBIRUFEIHJlZi4KCSMKCXNldCByZWZsb2dtIGNvbW1pdAoJaWYgeyRjb21taXRfdHlwZSBuZSB7bm9ybWFsfX0gewoJCWFwcGVuZCByZWZsb2dtICIgKCRjb21taXRfdHlwZSkiCgl9CglzZXQgaSBbc3RyaW5nIGZpcnN0ICJcbiIgJG1zZ10KCWlmIHskaSA+PSAwfSB7CgkJYXBwZW5kIHJlZmxvZ20gezogfSBbc3RyaW5nIHJhbmdlICRtc2cgMCBbZXhwciB7JGkgLSAxfV1dCgl9IGVsc2UgewoJCWFwcGVuZCByZWZsb2dtIHs6IH0gJG1zZwoJfQoJc2V0IGNtZCBbbGlzdCBnaXQgdXBkYXRlLXJlZiAtbSAkcmVmbG9nbSBIRUFEICRjbXRfaWQgJGN1ckhFQURdCglpZiB7W2NhdGNoIHtldmFsIGV4ZWMgJGNtZH0gZXJyXX0gewoJCWVycm9yX3BvcHVwICJ1cGRhdGUtcmVmIGZhaWxlZDpcblxuJGVyciIKCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtDb21taXQgZmFpbGVkLn0KCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCgkjIC0tIENsZWFudXAgYWZ0ZXIgb3Vyc2VsdmVzLgoJIwoJY2F0Y2gge2ZpbGUgZGVsZXRlICRtc2dfcH0KCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIE1FUkdFX0hFQURdfQoJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgTUVSR0VfTVNHXX0KCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIFNRVUFTSF9NU0ddfQoJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgR0lUR1VJX01TR119CgoJIyAtLSBMZXQgcmVyZXJlIGRvIGl0cyB0aGluZy4KCSMKCWlmIHtbZmlsZSBpc2RpcmVjdG9yeSBbZ2l0ZGlyIHJyLWNhY2hlXV19IHsKCQljYXRjaCB7Z2l0IHJlcmVyZX0KCX0KCgkjIC0tIFJ1biB0aGUgcG9zdC1jb21taXQgaG9vay4KCSMKCXNldCBwY2hvb2sgW2dpdGRpciBob29rcyBwb3N0LWNvbW1pdF0KCWlmIHtbaXNfQ3lnd2luXSAmJiBbZmlsZSBpc2ZpbGUgJHBjaG9va119IHsKCQlzZXQgcGNob29rIFtsaXN0IHNoIC1jIFtjb25jYXQgXAoJCQkiaWYgdGVzdCAteCBcIiRwY2hvb2tcIjsiIFwKCQkJInRoZW4gZXhlYyBcIiRwY2hvb2tcIjsiIFwKCQkJImZpIl1dCgl9IGVsc2VpZiB7IVtmaWxlIGV4ZWN1dGFibGUgJHBjaG9va119IHsKCQlzZXQgcGNob29rIHt9Cgl9CglpZiB7JHBjaG9vayBuZSB7fX0gewoJCWNhdGNoIHtleGVjICRwY2hvb2sgJn0KCX0KCgkkdWlfY29tbSBkZWxldGUgMC4wIGVuZAoJJHVpX2NvbW0gZWRpdCByZXNldAoJJHVpX2NvbW0gZWRpdCBtb2RpZmllZCBmYWxzZQoKCWlmIHtbaXNfZW5hYmxlZCBzaW5nbGVjb21taXRdfSBkb19xdWl0CgoJIyAtLSBNYWtlIHN1cmUgb3VyIGN1cnJlbnQgYnJhbmNoIGV4aXN0cy4KCSMKCWlmIHskY29tbWl0X3R5cGUgZXEge2luaXRpYWx9fSB7CgkJbGFwcGVuZCBhbGxfaGVhZHMgJGN1cnJlbnRfYnJhbmNoCgkJc2V0IGFsbF9oZWFkcyBbbHNvcnQgLXVuaXF1ZSAkYWxsX2hlYWRzXQoJCXBvcHVsYXRlX2JyYW5jaF9tZW51Cgl9CgoJIyAtLSBVcGRhdGUgaW4gbWVtb3J5IHN0YXR1cwoJIwoJc2V0IHNlbGVjdGVkX2NvbW1pdF90eXBlIG5ldwoJc2V0IGNvbW1pdF90eXBlIG5vcm1hbAoJc2V0IEhFQUQgJGNtdF9pZAoJc2V0IFBBUkVOVCAkY210X2lkCglzZXQgTUVSR0VfSEVBRCBbbGlzdF0KCglmb3JlYWNoIHBhdGggW2FycmF5IG5hbWVzIGZpbGVfc3RhdGVzXSB7CgkJc2V0IHMgJGZpbGVfc3RhdGVzKCRwYXRoKQoJCXNldCBtIFtsaW5kZXggJHMgMF0KCQlzd2l0Y2ggLWdsb2IgLS0gJG0gewoJCV9PIC0KCQlfTSAtCgkJX0Qge2NvbnRpbnVlfQoJCV9fIC0KCQlBXyAtCgkJTV8gLQoJCURfIHsKCQkJdW5zZXQgZmlsZV9zdGF0ZXMoJHBhdGgpCgkJCWNhdGNoIHt1bnNldCBzZWxlY3RlZF9wYXRocygkcGF0aCl9CgkJfQoJCURPIHsKCQkJc2V0IGZpbGVfc3RhdGVzKCRwYXRoKSBbbGlzdCBfTyBbbGluZGV4ICRzIDFdIHt9IHt9XQoJCX0KCQlBTSAtCgkJQUQgLQoJCU1NIC0KCQlNRCB7CgkJCXNldCBmaWxlX3N0YXRlcygkcGF0aCkgW2xpc3QgXAoJCQkJX1tzdHJpbmcgaW5kZXggJG0gMV0gXAoJCQkJW2xpbmRleCAkcyAxXSBcCgkJCQlbbGluZGV4ICRzIDNdIFwKCQkJCXt9XQoJCX0KCQl9Cgl9CgoJZGlzcGxheV9hbGxfZmlsZXMKCXVubG9ja19pbmRleAoJcmVzaG93X2RpZmYKCXNldCB1aV9zdGF0dXNfdmFsdWUgXAoJCSJDaGFuZ2VzIGNvbW1pdHRlZCBhcyBbc3RyaW5nIHJhbmdlICRjbXRfaWQgMCA3XS4iCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgZmV0Y2ggcHVzaAoKcHJvYyBmZXRjaF9mcm9tIHtyZW1vdGV9IHsKCXNldCB3IFtuZXdfY29uc29sZSBcCgkJImZldGNoICRyZW1vdGUiIFwKCQkiRmV0Y2hpbmcgbmV3IGNoYW5nZXMgZnJvbSAkcmVtb3RlIl0KCXNldCBjbWQgW2xpc3QgZ2l0IGZldGNoXQoJbGFwcGVuZCBjbWQgJHJlbW90ZQoJY29uc29sZV9leGVjICR3ICRjbWQgY29uc29sZV9kb25lCn0KCnByb2MgcHVzaF90byB7cmVtb3RlfSB7CglzZXQgdyBbbmV3X2NvbnNvbGUgXAoJCSJwdXNoICRyZW1vdGUiIFwKCQkiUHVzaGluZyBjaGFuZ2VzIHRvICRyZW1vdGUiXQoJc2V0IGNtZCBbbGlzdCBnaXQgcHVzaF0KCWxhcHBlbmQgY21kIC12CglsYXBwZW5kIGNtZCAkcmVtb3RlCgljb25zb2xlX2V4ZWMgJHcgJGNtZCBjb25zb2xlX2RvbmUKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyB1aSBoZWxwZXJzCgpwcm9jIG1hcGljb24ge3cgc3RhdGUgcGF0aH0gewoJZ2xvYmFsIGFsbF9pY29ucwoKCWlmIHtbY2F0Y2gge3NldCByICRhbGxfaWNvbnMoJHN0YXRlJHcpfV19IHsKCQlwdXRzICJlcnJvcjogbm8gaWNvbiBmb3IgJHcgc3RhdGU9eyRzdGF0ZX0gJHBhdGgiCgkJcmV0dXJuIGZpbGVfcGxhaW4KCX0KCXJldHVybiAkcgp9Cgpwcm9jIG1hcGRlc2Mge3N0YXRlIHBhdGh9IHsKCWdsb2JhbCBhbGxfZGVzY3MKCglpZiB7W2NhdGNoIHtzZXQgciAkYWxsX2Rlc2NzKCRzdGF0ZSl9XX0gewoJCXB1dHMgImVycm9yOiBubyBkZXNjIGZvciBzdGF0ZT17JHN0YXRlfSAkcGF0aCIKCQlyZXR1cm4gJHN0YXRlCgl9CglyZXR1cm4gJHIKfQoKcHJvYyBlc2NhcGVfcGF0aCB7cGF0aH0gewoJcmVnc3ViIC1hbGwge1xcfSAkcGF0aCAiXFxcXCIgcGF0aAoJcmVnc3ViIC1hbGwgIlxuIiAkcGF0aCAiXFxuIiBwYXRoCglyZXR1cm4gJHBhdGgKfQoKcHJvYyBzaG9ydF9wYXRoIHtwYXRofSB7CglyZXR1cm4gW2VzY2FwZV9wYXRoIFtsaW5kZXggW2ZpbGUgc3BsaXQgJHBhdGhdIGVuZF1dCn0KCnNldCBuZXh0X2ljb25faWQgMApzZXQgbnVsbF9zaGExIFtzdHJpbmcgcmVwZWF0IDAgNDBdCgpwcm9jIG1lcmdlX3N0YXRlIHtwYXRoIG5ld19zdGF0ZSB7aGVhZF9pbmZvIHt9fSB7aW5kZXhfaW5mbyB7fX19IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBuZXh0X2ljb25faWQgbnVsbF9zaGExCgoJc2V0IHMwIFtzdHJpbmcgaW5kZXggJG5ld19zdGF0ZSAwXQoJc2V0IHMxIFtzdHJpbmcgaW5kZXggJG5ld19zdGF0ZSAxXQoKCWlmIHtbY2F0Y2gge3NldCBpbmZvICRmaWxlX3N0YXRlcygkcGF0aCl9XX0gewoJCXNldCBzdGF0ZSBfXwoJCXNldCBpY29uIG5baW5jciBuZXh0X2ljb25faWRdCgl9IGVsc2UgewoJCXNldCBzdGF0ZSBbbGluZGV4ICRpbmZvIDBdCgkJc2V0IGljb24gW2xpbmRleCAkaW5mbyAxXQoJCWlmIHskaGVhZF9pbmZvIGVxIHt9fSAge3NldCBoZWFkX2luZm8gIFtsaW5kZXggJGluZm8gMl19CgkJaWYgeyRpbmRleF9pbmZvIGVxIHt9fSB7c2V0IGluZGV4X2luZm8gW2xpbmRleCAkaW5mbyAzXX0KCX0KCglpZiAgICAgeyRzMCBlcSB7P319IHtzZXQgczAgW3N0cmluZyBpbmRleCAkc3RhdGUgMF19IFwKCWVsc2VpZiB7JHMwIGVxIHtffX0ge3NldCBzMCBffQoKCWlmICAgICB7JHMxIGVxIHs/fX0ge3NldCBzMSBbc3RyaW5nIGluZGV4ICRzdGF0ZSAxXX0gXAoJZWxzZWlmIHskczEgZXEge199fSB7c2V0IHMxIF99CgoJaWYgeyRzMCBlcSB7QX0gJiYgJHMxIGVxIHtffSAmJiAkaGVhZF9pbmZvIGVxIHt9fSB7CgkJc2V0IGhlYWRfaW5mbyBbbGlzdCAwICRudWxsX3NoYTFdCgl9IGVsc2VpZiB7JHMwIG5lIHtffSAmJiBbc3RyaW5nIGluZGV4ICRzdGF0ZSAwXSBlcSB7X30KCQkmJiAkaGVhZF9pbmZvIGVxIHt9fSB7CgkJc2V0IGhlYWRfaW5mbyAkaW5kZXhfaW5mbwoJfQoKCXNldCBmaWxlX3N0YXRlcygkcGF0aCkgW2xpc3QgJHMwJHMxICRpY29uIFwKCQkkaGVhZF9pbmZvICRpbmRleF9pbmZvIFwKCQldCglyZXR1cm4gJHN0YXRlCn0KCnByb2MgZGlzcGxheV9maWxlX2hlbHBlciB7dyBwYXRoIGljb25fbmFtZSBvbGRfbSBuZXdfbX0gewoJZ2xvYmFsIGZpbGVfbGlzdHMKCglpZiB7JG5ld19tIGVxIHtffX0gewoJCXNldCBsbm8gW2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGZpbGVfbGlzdHMoJHcpICRwYXRoXQoJCWlmIHskbG5vID49IDB9IHsKCQkJc2V0IGZpbGVfbGlzdHMoJHcpIFtscmVwbGFjZSAkZmlsZV9saXN0cygkdykgJGxubyAkbG5vXQoJCQlpbmNyIGxubwoJCQkkdyBjb25mIC1zdGF0ZSBub3JtYWwKCQkJJHcgZGVsZXRlICRsbm8uMCBbZXhwciB7JGxubyArIDF9XS4wCgkJCSR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCgkJfQoJfSBlbHNlaWYgeyRvbGRfbSBlcSB7X30gJiYgJG5ld19tIG5lIHtffX0gewoJCWxhcHBlbmQgZmlsZV9saXN0cygkdykgJHBhdGgKCQlzZXQgZmlsZV9saXN0cygkdykgW2xzb3J0IC11bmlxdWUgJGZpbGVfbGlzdHMoJHcpXQoJCXNldCBsbm8gW2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGZpbGVfbGlzdHMoJHcpICRwYXRoXQoJCWluY3IgbG5vCgkJJHcgY29uZiAtc3RhdGUgbm9ybWFsCgkJJHcgaW1hZ2UgY3JlYXRlICRsbm8uMCBcCgkJCS1hbGlnbiBjZW50ZXIgLXBhZHggNSAtcGFkeSAxIFwKCQkJLW5hbWUgJGljb25fbmFtZSBcCgkJCS1pbWFnZSBbbWFwaWNvbiAkdyAkbmV3X20gJHBhdGhdCgkJJHcgaW5zZXJ0ICRsbm8uMSAiW2VzY2FwZV9wYXRoICRwYXRoXVxuIgoJCSR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCgl9IGVsc2VpZiB7JG9sZF9tIG5lICRuZXdfbX0gewoJCSR3IGNvbmYgLXN0YXRlIG5vcm1hbAoJCSR3IGltYWdlIGNvbmYgJGljb25fbmFtZSAtaW1hZ2UgW21hcGljb24gJHcgJG5ld19tICRwYXRoXQoJCSR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCgl9Cn0KCnByb2MgZGlzcGxheV9maWxlIHtwYXRoIHN0YXRlfSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMgc2VsZWN0ZWRfcGF0aHMKCWdsb2JhbCB1aV9pbmRleCB1aV93b3JrZGlyCgoJc2V0IG9sZF9tIFttZXJnZV9zdGF0ZSAkcGF0aCAkc3RhdGVdCglzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCglzZXQgbmV3X20gW2xpbmRleCAkcyAwXQoJc2V0IGljb25fbmFtZSBbbGluZGV4ICRzIDFdCgoJc2V0IG8gW3N0cmluZyBpbmRleCAkb2xkX20gMF0KCXNldCBuIFtzdHJpbmcgaW5kZXggJG5ld19tIDBdCglpZiB7JG8gZXEge1V9fSB7CgkJc2V0IG8gXwoJfQoJaWYgeyRuIGVxIHtVfX0gewoJCXNldCBuIF8KCX0KCWRpc3BsYXlfZmlsZV9oZWxwZXIJJHVpX2luZGV4ICRwYXRoICRpY29uX25hbWUgJG8gJG4KCglpZiB7W3N0cmluZyBpbmRleCAkb2xkX20gMF0gZXEge1V9fSB7CgkJc2V0IG8gVQoJfSBlbHNlIHsKCQlzZXQgbyBbc3RyaW5nIGluZGV4ICRvbGRfbSAxXQoJfQoJaWYge1tzdHJpbmcgaW5kZXggJG5ld19tIDBdIGVxIHtVfX0gewoJCXNldCBuIFUKCX0gZWxzZSB7CgkJc2V0IG4gW3N0cmluZyBpbmRleCAkbmV3X20gMV0KCX0KCWRpc3BsYXlfZmlsZV9oZWxwZXIJJHVpX3dvcmtkaXIgJHBhdGggJGljb25fbmFtZSAkbyAkbgoKCWlmIHskbmV3X20gZXEge19ffX0gewoJCXVuc2V0IGZpbGVfc3RhdGVzKCRwYXRoKQoJCWNhdGNoIHt1bnNldCBzZWxlY3RlZF9wYXRocygkcGF0aCl9Cgl9Cn0KCnByb2MgZGlzcGxheV9hbGxfZmlsZXNfaGVscGVyIHt3IHBhdGggaWNvbl9uYW1lIG19IHsKCWdsb2JhbCBmaWxlX2xpc3RzCgoJbGFwcGVuZCBmaWxlX2xpc3RzKCR3KSAkcGF0aAoJc2V0IGxubyBbZXhwciB7W2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IGVuZF0gLl0gMF0gLSAxfV0KCSR3IGltYWdlIGNyZWF0ZSBlbmQgXAoJCS1hbGlnbiBjZW50ZXIgLXBhZHggNSAtcGFkeSAxIFwKCQktbmFtZSAkaWNvbl9uYW1lIFwKCQktaW1hZ2UgW21hcGljb24gJHcgJG0gJHBhdGhdCgkkdyBpbnNlcnQgZW5kICJbZXNjYXBlX3BhdGggJHBhdGhdXG4iCn0KCnByb2MgZGlzcGxheV9hbGxfZmlsZXMge30gewoJZ2xvYmFsIHVpX2luZGV4IHVpX3dvcmtkaXIKCWdsb2JhbCBmaWxlX3N0YXRlcyBmaWxlX2xpc3RzCglnbG9iYWwgbGFzdF9jbGlja2VkCgoJJHVpX2luZGV4IGNvbmYgLXN0YXRlIG5vcm1hbAoJJHVpX3dvcmtkaXIgY29uZiAtc3RhdGUgbm9ybWFsCgoJJHVpX2luZGV4IGRlbGV0ZSAwLjAgZW5kCgkkdWlfd29ya2RpciBkZWxldGUgMC4wIGVuZAoJc2V0IGxhc3RfY2xpY2tlZCB7fQoKCXNldCBmaWxlX2xpc3RzKCR1aV9pbmRleCkgW2xpc3RdCglzZXQgZmlsZV9saXN0cygkdWlfd29ya2RpcikgW2xpc3RdCgoJZm9yZWFjaCBwYXRoIFtsc29ydCBbYXJyYXkgbmFtZXMgZmlsZV9zdGF0ZXNdXSB7CgkJc2V0IHMgJGZpbGVfc3RhdGVzKCRwYXRoKQoJCXNldCBtIFtsaW5kZXggJHMgMF0KCQlzZXQgaWNvbl9uYW1lIFtsaW5kZXggJHMgMV0KCgkJc2V0IHMgW3N0cmluZyBpbmRleCAkbSAwXQoJCWlmIHskcyBuZSB7VX0gJiYgJHMgbmUge199fSB7CgkJCWRpc3BsYXlfYWxsX2ZpbGVzX2hlbHBlciAkdWlfaW5kZXggJHBhdGggXAoJCQkJJGljb25fbmFtZSAkcwoJCX0KCgkJaWYge1tzdHJpbmcgaW5kZXggJG0gMF0gZXEge1V9fSB7CgkJCXNldCBzIFUKCQl9IGVsc2UgewoJCQlzZXQgcyBbc3RyaW5nIGluZGV4ICRtIDFdCgkJfQoJCWlmIHskcyBuZSB7X319IHsKCQkJZGlzcGxheV9hbGxfZmlsZXNfaGVscGVyICR1aV93b3JrZGlyICRwYXRoIFwKCQkJCSRpY29uX25hbWUgJHMKCQl9Cgl9CgoJJHVpX2luZGV4IGNvbmYgLXN0YXRlIGRpc2FibGVkCgkkdWlfd29ya2RpciBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHVwZGF0ZV9pbmRleGluZm8ge21zZyBwYXRoTGlzdCBhZnRlcn0gewoJZ2xvYmFsIHVwZGF0ZV9pbmRleF9jcCB1aV9zdGF0dXNfdmFsdWUKCglpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgoKCXNldCB1cGRhdGVfaW5kZXhfY3AgMAoJc2V0IHBhdGhMaXN0IFtsc29ydCAkcGF0aExpc3RdCglzZXQgdG90YWxDbnQgW2xsZW5ndGggJHBhdGhMaXN0XQoJc2V0IGJhdGNoIFtleHByIHtpbnQoJHRvdGFsQ250ICogLjAxKSArIDF9XQoJaWYgeyRiYXRjaCA+IDI1fSB7c2V0IGJhdGNoIDI1fQoKCXNldCB1aV9zdGF0dXNfdmFsdWUgW2Zvcm1hdCBcCgkJIiRtc2cuLi4gJWkvJWkgZmlsZXMgKCUuMmYlJSkiIFwKCQkkdXBkYXRlX2luZGV4X2NwIFwKCQkkdG90YWxDbnQgXAoJCTAuMF0KCXNldCBmZCBbb3BlbiAifCBnaXQgdXBkYXRlLWluZGV4IC16IC0taW5kZXgtaW5mbyIgd10KCWZjb25maWd1cmUgJGZkIFwKCQktYmxvY2tpbmcgMCBcCgkJLWJ1ZmZlcmluZyBmdWxsIFwKCQktYnVmZmVyc2l6ZSA1MTIgXAoJCS1lbmNvZGluZyBiaW5hcnkgXAoJCS10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmQgd3JpdGFibGUgW2xpc3QgXAoJCXdyaXRlX3VwZGF0ZV9pbmRleGluZm8gXAoJCSRmZCBcCgkJJHBhdGhMaXN0IFwKCQkkdG90YWxDbnQgXAoJCSRiYXRjaCBcCgkJJG1zZyBcCgkJJGFmdGVyIFwKCQldCn0KCnByb2Mgd3JpdGVfdXBkYXRlX2luZGV4aW5mbyB7ZmQgcGF0aExpc3QgdG90YWxDbnQgYmF0Y2ggbXNnIGFmdGVyfSB7CglnbG9iYWwgdXBkYXRlX2luZGV4X2NwIHVpX3N0YXR1c192YWx1ZQoJZ2xvYmFsIGZpbGVfc3RhdGVzIGN1cnJlbnRfZGlmZl9wYXRoCgoJaWYgeyR1cGRhdGVfaW5kZXhfY3AgPj0gJHRvdGFsQ250fSB7CgkJY2xvc2UgJGZkCgkJdW5sb2NrX2luZGV4CgkJdXBsZXZlbCAjMCAkYWZ0ZXIKCQlyZXR1cm4KCX0KCglmb3Ige3NldCBpICRiYXRjaH0gXAoJCXskdXBkYXRlX2luZGV4X2NwIDwgJHRvdGFsQ250ICYmICRpID4gMH0gXAoJCXtpbmNyIGkgLTF9IHsKCQlzZXQgcGF0aCBbbGluZGV4ICRwYXRoTGlzdCAkdXBkYXRlX2luZGV4X2NwXQoJCWluY3IgdXBkYXRlX2luZGV4X2NwCgoJCXNldCBzICRmaWxlX3N0YXRlcygkcGF0aCkKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkcyAwXSB7CgkJQT8ge3NldCBuZXcgX099CgkJTT8ge3NldCBuZXcgX019CgkJRF8ge3NldCBuZXcgX0R9CgkJRD8ge3NldCBuZXcgXz99CgkJPz8ge2NvbnRpbnVlfQoJCX0KCQlzZXQgaW5mbyBbbGluZGV4ICRzIDJdCgkJaWYgeyRpbmZvIGVxIHt9fSBjb250aW51ZQoKCQlwdXRzIC1ub25ld2xpbmUgJGZkICIkaW5mb1x0W2VuY29kaW5nIGNvbnZlcnR0byAkcGF0aF1cMCIKCQlkaXNwbGF5X2ZpbGUgJHBhdGggJG5ldwoJfQoKCXNldCB1aV9zdGF0dXNfdmFsdWUgW2Zvcm1hdCBcCgkJIiRtc2cuLi4gJWkvJWkgZmlsZXMgKCUuMmYlJSkiIFwKCQkkdXBkYXRlX2luZGV4X2NwIFwKCQkkdG90YWxDbnQgXAoJCVtleHByIHsxMDAuMCAqICR1cGRhdGVfaW5kZXhfY3AgLyAkdG90YWxDbnR9XV0KfQoKcHJvYyB1cGRhdGVfaW5kZXgge21zZyBwYXRoTGlzdCBhZnRlcn0gewoJZ2xvYmFsIHVwZGF0ZV9pbmRleF9jcCB1aV9zdGF0dXNfdmFsdWUKCglpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgoKCXNldCB1cGRhdGVfaW5kZXhfY3AgMAoJc2V0IHBhdGhMaXN0IFtsc29ydCAkcGF0aExpc3RdCglzZXQgdG90YWxDbnQgW2xsZW5ndGggJHBhdGhMaXN0XQoJc2V0IGJhdGNoIFtleHByIHtpbnQoJHRvdGFsQ250ICogLjAxKSArIDF9XQoJaWYgeyRiYXRjaCA+IDI1fSB7c2V0IGJhdGNoIDI1fQoKCXNldCB1aV9zdGF0dXNfdmFsdWUgW2Zvcm1hdCBcCgkJIiRtc2cuLi4gJWkvJWkgZmlsZXMgKCUuMmYlJSkiIFwKCQkkdXBkYXRlX2luZGV4X2NwIFwKCQkkdG90YWxDbnQgXAoJCTAuMF0KCXNldCBmZCBbb3BlbiAifCBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIC16IC0tc3RkaW4iIHddCglmY29uZmlndXJlICRmZCBcCgkJLWJsb2NraW5nIDAgXAoJCS1idWZmZXJpbmcgZnVsbCBcCgkJLWJ1ZmZlcnNpemUgNTEyIFwKCQktZW5jb2RpbmcgYmluYXJ5IFwKCQktdHJhbnNsYXRpb24gYmluYXJ5CglmaWxlZXZlbnQgJGZkIHdyaXRhYmxlIFtsaXN0IFwKCQl3cml0ZV91cGRhdGVfaW5kZXggXAoJCSRmZCBcCgkJJHBhdGhMaXN0IFwKCQkkdG90YWxDbnQgXAoJCSRiYXRjaCBcCgkJJG1zZyBcCgkJJGFmdGVyIFwKCQldCn0KCnByb2Mgd3JpdGVfdXBkYXRlX2luZGV4IHtmZCBwYXRoTGlzdCB0b3RhbENudCBiYXRjaCBtc2cgYWZ0ZXJ9IHsKCWdsb2JhbCB1cGRhdGVfaW5kZXhfY3AgdWlfc3RhdHVzX3ZhbHVlCglnbG9iYWwgZmlsZV9zdGF0ZXMgY3VycmVudF9kaWZmX3BhdGgKCglpZiB7JHVwZGF0ZV9pbmRleF9jcCA+PSAkdG90YWxDbnR9IHsKCQljbG9zZSAkZmQKCQl1bmxvY2tfaW5kZXgKCQl1cGxldmVsICMwICRhZnRlcgoJCXJldHVybgoJfQoKCWZvciB7c2V0IGkgJGJhdGNofSBcCgkJeyR1cGRhdGVfaW5kZXhfY3AgPCAkdG90YWxDbnQgJiYgJGkgPiAwfSBcCgkJe2luY3IgaSAtMX0gewoJCXNldCBwYXRoIFtsaW5kZXggJHBhdGhMaXN0ICR1cGRhdGVfaW5kZXhfY3BdCgkJaW5jciB1cGRhdGVfaW5kZXhfY3AKCgkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwYXRoKSAwXSB7CgkJQUQge3NldCBuZXcgX199CgkJP0Qge3NldCBuZXcgRF99CgkJX08gLQoJCUFNIHtzZXQgbmV3IEFffQoJCVU/IHsKCQkJaWYge1tmaWxlIGV4aXN0cyAkcGF0aF19IHsKCQkJCXNldCBuZXcgTV8KCQkJfSBlbHNlIHsKCQkJCXNldCBuZXcgRF8KCQkJfQoJCX0KCQk/TSB7c2V0IG5ldyBNX30KCQk/PyB7Y29udGludWV9CgkJfQoJCXB1dHMgLW5vbmV3bGluZSAkZmQgIltlbmNvZGluZyBjb252ZXJ0dG8gJHBhdGhdXDAiCgkJZGlzcGxheV9maWxlICRwYXRoICRuZXcKCX0KCglzZXQgdWlfc3RhdHVzX3ZhbHVlIFtmb3JtYXQgXAoJCSIkbXNnLi4uICVpLyVpIGZpbGVzICglLjJmJSUpIiBcCgkJJHVwZGF0ZV9pbmRleF9jcCBcCgkJJHRvdGFsQ250IFwKCQlbZXhwciB7MTAwLjAgKiAkdXBkYXRlX2luZGV4X2NwIC8gJHRvdGFsQ250fV1dCn0KCnByb2MgY2hlY2tvdXRfaW5kZXgge21zZyBwYXRoTGlzdCBhZnRlcn0gewoJZ2xvYmFsIHVwZGF0ZV9pbmRleF9jcCB1aV9zdGF0dXNfdmFsdWUKCglpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgoKCXNldCB1cGRhdGVfaW5kZXhfY3AgMAoJc2V0IHBhdGhMaXN0IFtsc29ydCAkcGF0aExpc3RdCglzZXQgdG90YWxDbnQgW2xsZW5ndGggJHBhdGhMaXN0XQoJc2V0IGJhdGNoIFtleHByIHtpbnQoJHRvdGFsQ250ICogLjAxKSArIDF9XQoJaWYgeyRiYXRjaCA+IDI1fSB7c2V0IGJhdGNoIDI1fQoKCXNldCB1aV9zdGF0dXNfdmFsdWUgW2Zvcm1hdCBcCgkJIiRtc2cuLi4gJWkvJWkgZmlsZXMgKCUuMmYlJSkiIFwKCQkkdXBkYXRlX2luZGV4X2NwIFwKCQkkdG90YWxDbnQgXAoJCTAuMF0KCXNldCBjbWQgW2xpc3QgZ2l0IGNoZWNrb3V0LWluZGV4XQoJbGFwcGVuZCBjbWQgLS1pbmRleAoJbGFwcGVuZCBjbWQgLS1xdWlldAoJbGFwcGVuZCBjbWQgLS1mb3JjZQoJbGFwcGVuZCBjbWQgLXoKCWxhcHBlbmQgY21kIC0tc3RkaW4KCXNldCBmZCBbb3BlbiAifCAkY21kICIgd10KCWZjb25maWd1cmUgJGZkIFwKCQktYmxvY2tpbmcgMCBcCgkJLWJ1ZmZlcmluZyBmdWxsIFwKCQktYnVmZmVyc2l6ZSA1MTIgXAoJCS1lbmNvZGluZyBiaW5hcnkgXAoJCS10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmQgd3JpdGFibGUgW2xpc3QgXAoJCXdyaXRlX2NoZWNrb3V0X2luZGV4IFwKCQkkZmQgXAoJCSRwYXRoTGlzdCBcCgkJJHRvdGFsQ250IFwKCQkkYmF0Y2ggXAoJCSRtc2cgXAoJCSRhZnRlciBcCgkJXQp9Cgpwcm9jIHdyaXRlX2NoZWNrb3V0X2luZGV4IHtmZCBwYXRoTGlzdCB0b3RhbENudCBiYXRjaCBtc2cgYWZ0ZXJ9IHsKCWdsb2JhbCB1cGRhdGVfaW5kZXhfY3AgdWlfc3RhdHVzX3ZhbHVlCglnbG9iYWwgZmlsZV9zdGF0ZXMgY3VycmVudF9kaWZmX3BhdGgKCglpZiB7JHVwZGF0ZV9pbmRleF9jcCA+PSAkdG90YWxDbnR9IHsKCQljbG9zZSAkZmQKCQl1bmxvY2tfaW5kZXgKCQl1cGxldmVsICMwICRhZnRlcgoJCXJldHVybgoJfQoKCWZvciB7c2V0IGkgJGJhdGNofSBcCgkJeyR1cGRhdGVfaW5kZXhfY3AgPCAkdG90YWxDbnQgJiYgJGkgPiAwfSBcCgkJe2luY3IgaSAtMX0gewoJCXNldCBwYXRoIFtsaW5kZXggJHBhdGhMaXN0ICR1cGRhdGVfaW5kZXhfY3BdCgkJaW5jciB1cGRhdGVfaW5kZXhfY3AKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlVPyB7Y29udGludWV9CgkJP00gLQoJCT9EIHsKCQkJcHV0cyAtbm9uZXdsaW5lICRmZCAiW2VuY29kaW5nIGNvbnZlcnR0byAkcGF0aF1cMCIKCQkJZGlzcGxheV9maWxlICRwYXRoID9fCgkJfQoJCX0KCX0KCglzZXQgdWlfc3RhdHVzX3ZhbHVlIFtmb3JtYXQgXAoJCSIkbXNnLi4uICVpLyVpIGZpbGVzICglLjJmJSUpIiBcCgkJJHVwZGF0ZV9pbmRleF9jcCBcCgkJJHRvdGFsQ250IFwKCQlbZXhwciB7MTAwLjAgKiAkdXBkYXRlX2luZGV4X2NwIC8gJHRvdGFsQ250fV1dCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgYnJhbmNoIG1hbmFnZW1lbnQKCnByb2MgaXNfdHJhY2tpbmdfYnJhbmNoIHtuYW1lfSB7CglnbG9iYWwgdHJhY2tpbmdfYnJhbmNoZXMKCglpZiB7IVtjYXRjaCB7c2V0IGluZm8gJHRyYWNraW5nX2JyYW5jaGVzKCRuYW1lKX1dfSB7CgkJcmV0dXJuIDEKCX0KCWZvcmVhY2ggdCBbYXJyYXkgbmFtZXMgdHJhY2tpbmdfYnJhbmNoZXNdIHsKCQlpZiB7W3N0cmluZyBtYXRjaCB7Ki9cKn0gJHRdICYmIFtzdHJpbmcgbWF0Y2ggJHQgJG5hbWVdfSB7CgkJCXJldHVybiAxCgkJfQoJfQoJcmV0dXJuIDAKfQoKcHJvYyBsb2FkX2FsbF9oZWFkcyB7fSB7CglnbG9iYWwgYWxsX2hlYWRzCgoJc2V0IGFsbF9oZWFkcyBbbGlzdF0KCXNldCBmZCBbb3BlbiAifCBnaXQgZm9yLWVhY2gtcmVmIC0tZm9ybWF0PSUocmVmbmFtZSkgcmVmcy9oZWFkcyIgcl0KCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPiAwfSB7CgkJaWYge1tpc190cmFja2luZ19icmFuY2ggJGxpbmVdfSBjb250aW51ZQoJCWlmIHshW3JlZ3N1YiBecmVmcy9oZWFkcy8gJGxpbmUge30gbmFtZV19IGNvbnRpbnVlCgkJbGFwcGVuZCBhbGxfaGVhZHMgJG5hbWUKCX0KCWNsb3NlICRmZAoKCXNldCBhbGxfaGVhZHMgW2xzb3J0ICRhbGxfaGVhZHNdCn0KCnByb2MgcG9wdWxhdGVfYnJhbmNoX21lbnUge30gewoJZ2xvYmFsIGFsbF9oZWFkcyBkaXNhYmxlX29uX2xvY2sKCglzZXQgbSAubWJhci5icmFuY2gKCXNldCBsYXN0IFskbSBpbmRleCBsYXN0XQoJZm9yIHtzZXQgaSAwfSB7JGkgPD0gJGxhc3R9IHtpbmNyIGl9IHsKCQlpZiB7WyRtIHR5cGUgJGldIGVxIHtzZXBhcmF0b3J9fSB7CgkJCSRtIGRlbGV0ZSAkaSBsYXN0CgkJCXNldCBuZXdfZG9sIFtsaXN0XQoJCQlmb3JlYWNoIGEgJGRpc2FibGVfb25fbG9jayB7CgkJCQlpZiB7W2xpbmRleCAkYSAwXSBuZSAkbSB8fCBbbGluZGV4ICRhIDJdIDwgJGl9IHsKCQkJCQlsYXBwZW5kIG5ld19kb2wgJGEKCQkJCX0KCQkJfQoJCQlzZXQgZGlzYWJsZV9vbl9sb2NrICRuZXdfZG9sCgkJCWJyZWFrCgkJfQoJfQoKCWlmIHskYWxsX2hlYWRzIG5lIHt9fSB7CgkJJG0gYWRkIHNlcGFyYXRvcgoJfQoJZm9yZWFjaCBiICRhbGxfaGVhZHMgewoJCSRtIGFkZCByYWRpb2J1dHRvbiBcCgkJCS1sYWJlbCAkYiBcCgkJCS1jb21tYW5kIFtsaXN0IHN3aXRjaF9icmFuY2ggJGJdIFwKCQkJLXZhcmlhYmxlIGN1cnJlbnRfYnJhbmNoIFwKCQkJLXZhbHVlICRiIFwKCQkJLWZvbnQgZm9udF91aQoJCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQkJW2xpc3QgJG0gZW50cnljb25mIFskbSBpbmRleCBsYXN0XSAtc3RhdGVdCgl9Cn0KCnByb2MgYWxsX3RyYWNraW5nX2JyYW5jaGVzIHt9IHsKCWdsb2JhbCB0cmFja2luZ19icmFuY2hlcwoKCXNldCBhbGxfdHJhY2tpbmdzIHt9CglzZXQgY21kIHt9Cglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIHRyYWNraW5nX2JyYW5jaGVzXSB7CgkJaWYge1tyZWdzdWIgey9cKiR9ICRuYW1lIHt9IG5hbWVdfSB7CgkJCWxhcHBlbmQgY21kICRuYW1lCgkJfSBlbHNlIHsKCQkJcmVnc3ViIF5yZWZzLyhoZWFkc3xyZW1vdGVzKS8gJG5hbWUge30gbmFtZQoJCQlsYXBwZW5kIGFsbF90cmFja2luZ3MgJG5hbWUKCQl9Cgl9CgoJaWYgeyRjbWQgbmUge319IHsKCQlzZXQgZmQgW29wZW4gInwgZ2l0IGZvci1lYWNoLXJlZiAtLWZvcm1hdD0lKHJlZm5hbWUpICRjbWQiIHJdCgkJd2hpbGUge1tnZXRzICRmZCBuYW1lXSA+IDB9IHsKCQkJcmVnc3ViIF5yZWZzLyhoZWFkc3xyZW1vdGVzKS8gJG5hbWUge30gbmFtZQoJCQlsYXBwZW5kIGFsbF90cmFja2luZ3MgJG5hbWUKCQl9CgkJY2xvc2UgJGZkCgl9CgoJcmV0dXJuIFtsc29ydCAtdW5pcXVlICRhbGxfdHJhY2tpbmdzXQp9Cgpwcm9jIGxvYWRfYWxsX3RhZ3Mge30gewoJc2V0IGFsbF90YWdzIFtsaXN0XQoJc2V0IGZkIFtvcGVuICJ8IGdpdCBmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JShyZWZuYW1lKSByZWZzL3RhZ3MiIHJdCgl3aGlsZSB7W2dldHMgJGZkIGxpbmVdID4gMH0gewoJCWlmIHshW3JlZ3N1YiBecmVmcy90YWdzLyAkbGluZSB7fSBuYW1lXX0gY29udGludWUKCQlsYXBwZW5kIGFsbF90YWdzICRuYW1lCgl9CgljbG9zZSAkZmQKCglyZXR1cm4gW2xzb3J0ICRhbGxfdGFnc10KfQoKcHJvYyBkb19jcmVhdGVfYnJhbmNoX2FjdGlvbiB7d30gewoJZ2xvYmFsIGFsbF9oZWFkcyBudWxsX3NoYTEgcmVwb19jb25maWcKCWdsb2JhbCBjcmVhdGVfYnJhbmNoX2NoZWNrb3V0IGNyZWF0ZV9icmFuY2hfcmV2dHlwZQoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfaGVhZCBjcmVhdGVfYnJhbmNoX3RyYWNraW5naGVhZAoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfbmFtZSBjcmVhdGVfYnJhbmNoX3JldmV4cAoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfdGFnCgoJc2V0IG5ld2JyYW5jaCAkY3JlYXRlX2JyYW5jaF9uYW1lCglpZiB7JG5ld2JyYW5jaCBlcSB7fQoJCXx8ICRuZXdicmFuY2ggZXEgJHJlcG9fY29uZmlnKGd1aS5uZXdicmFuY2h0ZW1wbGF0ZSl9IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJQbGVhc2Ugc3VwcGx5IGEgYnJhbmNoIG5hbWUuIgoJCWZvY3VzICR3LmRlc2MubmFtZV90CgkJcmV0dXJuCgl9CglpZiB7IVtjYXRjaCB7Z2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tICJyZWZzL2hlYWRzLyRuZXdicmFuY2gifV19IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJCcmFuY2ggJyRuZXdicmFuY2gnIGFscmVhZHkgZXhpc3RzLiIKCQlmb2N1cyAkdy5kZXNjLm5hbWVfdAoJCXJldHVybgoJfQoJaWYge1tjYXRjaCB7Z2l0IGNoZWNrLXJlZi1mb3JtYXQgImhlYWRzLyRuZXdicmFuY2gifV19IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJXZSBkbyBub3QgbGlrZSAnJG5ld2JyYW5jaCcgYXMgYSBicmFuY2ggbmFtZS4iCgkJZm9jdXMgJHcuZGVzYy5uYW1lX3QKCQlyZXR1cm4KCX0KCglzZXQgcmV2IHt9Cglzd2l0Y2ggLS0gJGNyZWF0ZV9icmFuY2hfcmV2dHlwZSB7CgloZWFkIHtzZXQgcmV2ICRjcmVhdGVfYnJhbmNoX2hlYWR9Cgl0cmFja2luZyB7c2V0IHJldiAkY3JlYXRlX2JyYW5jaF90cmFja2luZ2hlYWR9Cgl0YWcge3NldCByZXYgJGNyZWF0ZV9icmFuY2hfdGFnfQoJZXhwcmVzc2lvbiB7c2V0IHJldiAkY3JlYXRlX2JyYW5jaF9yZXZleHB9Cgl9CglpZiB7W2NhdGNoIHtzZXQgY210IFtnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIke3Jldn1eMCJdfV19IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJJbnZhbGlkIHN0YXJ0aW5nIHJldmlzaW9uOiAkcmV2IgoJCXJldHVybgoJfQoJc2V0IGNtZCBbbGlzdCBnaXQgdXBkYXRlLXJlZl0KCWxhcHBlbmQgY21kIC1tCglsYXBwZW5kIGNtZCAiYnJhbmNoOiBDcmVhdGVkIGZyb20gJHJldiIKCWxhcHBlbmQgY21kICJyZWZzL2hlYWRzLyRuZXdicmFuY2giCglsYXBwZW5kIGNtZCAkY210CglsYXBwZW5kIGNtZCAkbnVsbF9zaGExCglpZiB7W2NhdGNoIHtldmFsIGV4ZWMgJGNtZH0gZXJyXX0gewoJCXRrX21lc3NhZ2VCb3ggXAoJCQktaWNvbiBlcnJvciBcCgkJCS10eXBlIG9rIFwKCQkJLXRpdGxlIFt3bSB0aXRsZSAkd10gXAoJCQktcGFyZW50ICR3IFwKCQkJLW1lc3NhZ2UgIkZhaWxlZCB0byBjcmVhdGUgJyRuZXdicmFuY2gnLlxuXG4kZXJyIgoJCXJldHVybgoJfQoKCWxhcHBlbmQgYWxsX2hlYWRzICRuZXdicmFuY2gKCXNldCBhbGxfaGVhZHMgW2xzb3J0ICRhbGxfaGVhZHNdCglwb3B1bGF0ZV9icmFuY2hfbWVudQoJZGVzdHJveSAkdwoJaWYgeyRjcmVhdGVfYnJhbmNoX2NoZWNrb3V0fSB7CgkJc3dpdGNoX2JyYW5jaCAkbmV3YnJhbmNoCgl9Cn0KCnByb2MgcmFkaW9fc2VsZWN0b3Ige3Zhcm5hbWUgdmFsdWUgYXJnc30gewoJdXB2YXIgIzAgJHZhcm5hbWUgdmFyCglzZXQgdmFyICR2YWx1ZQp9Cgp0cmFjZSBhZGQgdmFyaWFibGUgY3JlYXRlX2JyYW5jaF9oZWFkIHdyaXRlIFwKCVtsaXN0IHJhZGlvX3NlbGVjdG9yIGNyZWF0ZV9icmFuY2hfcmV2dHlwZSBoZWFkXQp0cmFjZSBhZGQgdmFyaWFibGUgY3JlYXRlX2JyYW5jaF90cmFja2luZ2hlYWQgd3JpdGUgXAoJW2xpc3QgcmFkaW9fc2VsZWN0b3IgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIHRyYWNraW5nXQp0cmFjZSBhZGQgdmFyaWFibGUgY3JlYXRlX2JyYW5jaF90YWcgd3JpdGUgXAoJW2xpc3QgcmFkaW9fc2VsZWN0b3IgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIHRhZ10KCnRyYWNlIGFkZCB2YXJpYWJsZSBkZWxldGVfYnJhbmNoX2hlYWQgd3JpdGUgXAoJW2xpc3QgcmFkaW9fc2VsZWN0b3IgZGVsZXRlX2JyYW5jaF9jaGVja3R5cGUgaGVhZF0KdHJhY2UgYWRkIHZhcmlhYmxlIGRlbGV0ZV9icmFuY2hfdHJhY2tpbmdoZWFkIHdyaXRlIFwKCVtsaXN0IHJhZGlvX3NlbGVjdG9yIGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIHRyYWNraW5nXQoKcHJvYyBkb19jcmVhdGVfYnJhbmNoIHt9IHsKCWdsb2JhbCBhbGxfaGVhZHMgY3VycmVudF9icmFuY2ggcmVwb19jb25maWcKCWdsb2JhbCBjcmVhdGVfYnJhbmNoX2NoZWNrb3V0IGNyZWF0ZV9icmFuY2hfcmV2dHlwZQoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfaGVhZCBjcmVhdGVfYnJhbmNoX3RyYWNraW5naGVhZAoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfbmFtZSBjcmVhdGVfYnJhbmNoX3JldmV4cAoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfdGFnCgoJc2V0IHcgLmJyYW5jaF9lZGl0b3IKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IHtDcmVhdGUgTmV3IEJyYW5jaH0gXAoJCS1mb250IGZvbnRfdWlib2xkCglwYWNrICR3LmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeAoKCWZyYW1lICR3LmJ1dHRvbnMKCWJ1dHRvbiAkdy5idXR0b25zLmNyZWF0ZSAtdGV4dCBDcmVhdGUgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1kZWZhdWx0IGFjdGl2ZSBcCgkJLWNvbW1hbmQgW2xpc3QgZG9fY3JlYXRlX2JyYW5jaF9hY3Rpb24gJHddCglwYWNrICR3LmJ1dHRvbnMuY3JlYXRlIC1zaWRlIHJpZ2h0CglidXR0b24gJHcuYnV0dG9ucy5jYW5jZWwgLXRleHQge0NhbmNlbH0gXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCglwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAxMCAtcGFkeCAxMAoKCWxhYmVsZnJhbWUgJHcuZGVzYyBcCgkJLXRleHQge0JyYW5jaCBEZXNjcmlwdGlvbn0gXAoJCS1mb250IGZvbnRfdWkKCWxhYmVsICR3LmRlc2MubmFtZV9sIC10ZXh0IHtOYW1lOn0gLWZvbnQgZm9udF91aQoJZW50cnkgJHcuZGVzYy5uYW1lX3QgXAoJCS1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLXdpZHRoIDQwIFwKCQktdGV4dHZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfbmFtZSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLXZhbGlkYXRlIGtleSBcCgkJLXZhbGlkYXRlY29tbWFuZCB7CgkJCWlmIHslZCA9PSAxICYmIFtyZWdleHAge1t+Xjo/KlxbXDAtIF19ICVTXX0ge3JldHVybiAwfQoJCQlyZXR1cm4gMQoJCX0KCWdyaWQgJHcuZGVzYy5uYW1lX2wgJHcuZGVzYy5uYW1lX3QgLXN0aWNreSB3ZSAtcGFkeCB7MCA1fQoJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcuZGVzYyAxIC13ZWlnaHQgMQoJcGFjayAkdy5kZXNjIC1hbmNob3IgbncgLWZpbGwgeCAtcGFkeSA1IC1wYWR4IDUKCglsYWJlbGZyYW1lICR3LmZyb20gXAoJCS10ZXh0IHtTdGFydGluZyBSZXZpc2lvbn0gXAoJCS1mb250IGZvbnRfdWkKCXJhZGlvYnV0dG9uICR3LmZyb20uaGVhZF9yIFwKCQktdGV4dCB7TG9jYWwgQnJhbmNoOn0gXAoJCS12YWx1ZSBoZWFkIFwKCQktdmFyaWFibGUgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIFwKCQktZm9udCBmb250X3VpCglldmFsIHRrX29wdGlvbk1lbnUgJHcuZnJvbS5oZWFkX20gY3JlYXRlX2JyYW5jaF9oZWFkICRhbGxfaGVhZHMKCWdyaWQgJHcuZnJvbS5oZWFkX3IgJHcuZnJvbS5oZWFkX20gLXN0aWNreSB3CglzZXQgYWxsX3RyYWNraW5ncyBbYWxsX3RyYWNraW5nX2JyYW5jaGVzXQoJaWYgeyRhbGxfdHJhY2tpbmdzIG5lIHt9fSB7CgkJc2V0IGNyZWF0ZV9icmFuY2hfdHJhY2tpbmdoZWFkIFtsaW5kZXggJGFsbF90cmFja2luZ3MgMF0KCQlyYWRpb2J1dHRvbiAkdy5mcm9tLnRyYWNraW5nX3IgXAoJCQktdGV4dCB7VHJhY2tpbmcgQnJhbmNoOn0gXAoJCQktdmFsdWUgdHJhY2tpbmcgXAoJCQktdmFyaWFibGUgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIFwKCQkJLWZvbnQgZm9udF91aQoJCWV2YWwgdGtfb3B0aW9uTWVudSAkdy5mcm9tLnRyYWNraW5nX20gXAoJCQljcmVhdGVfYnJhbmNoX3RyYWNraW5naGVhZCBcCgkJCSRhbGxfdHJhY2tpbmdzCgkJZ3JpZCAkdy5mcm9tLnRyYWNraW5nX3IgJHcuZnJvbS50cmFja2luZ19tIC1zdGlja3kgdwoJfQoJc2V0IGFsbF90YWdzIFtsb2FkX2FsbF90YWdzXQoJaWYgeyRhbGxfdGFncyBuZSB7fX0gewoJCXNldCBjcmVhdGVfYnJhbmNoX3RhZyBbbGluZGV4ICRhbGxfdGFncyAwXQoJCXJhZGlvYnV0dG9uICR3LmZyb20udGFnX3IgXAoJCQktdGV4dCB7VGFnOn0gXAoJCQktdmFsdWUgdGFnIFwKCQkJLXZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfcmV2dHlwZSBcCgkJCS1mb250IGZvbnRfdWkKCQlldmFsIHRrX29wdGlvbk1lbnUgJHcuZnJvbS50YWdfbSBcCgkJCWNyZWF0ZV9icmFuY2hfdGFnIFwKCQkJJGFsbF90YWdzCgkJZ3JpZCAkdy5mcm9tLnRhZ19yICR3LmZyb20udGFnX20gLXN0aWNreSB3Cgl9CglyYWRpb2J1dHRvbiAkdy5mcm9tLmV4cF9yIFwKCQktdGV4dCB7UmV2aXNpb24gRXhwcmVzc2lvbjp9IFwKCQktdmFsdWUgZXhwcmVzc2lvbiBcCgkJLXZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfcmV2dHlwZSBcCgkJLWZvbnQgZm9udF91aQoJZW50cnkgJHcuZnJvbS5leHBfdCBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktd2lkdGggNTAgXAoJCS10ZXh0dmFyaWFibGUgY3JlYXRlX2JyYW5jaF9yZXZleHAgXAoJCS1mb250IGZvbnRfdWkgXAoJCS12YWxpZGF0ZSBrZXkgXAoJCS12YWxpZGF0ZWNvbW1hbmQgewoJCQlpZiB7JWQgPT0gMSAmJiBbcmVnZXhwIHtcc30gJVNdfSB7cmV0dXJuIDB9CgkJCWlmIHslZCA9PSAxICYmIFtzdHJpbmcgbGVuZ3RoICVTXSA+IDB9IHsKCQkJCXNldCBjcmVhdGVfYnJhbmNoX3JldnR5cGUgZXhwcmVzc2lvbgoJCQl9CgkJCXJldHVybiAxCgkJfQoJZ3JpZCAkdy5mcm9tLmV4cF9yICR3LmZyb20uZXhwX3QgLXN0aWNreSB3ZSAtcGFkeCB7MCA1fQoJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcuZnJvbSAxIC13ZWlnaHQgMQoJcGFjayAkdy5mcm9tIC1hbmNob3IgbncgLWZpbGwgeCAtcGFkeSA1IC1wYWR4IDUKCglsYWJlbGZyYW1lICR3LnBvc3RBY3Rpb25zIFwKCQktdGV4dCB7UG9zdCBDcmVhdGlvbiBBY3Rpb25zfSBcCgkJLWZvbnQgZm9udF91aQoJY2hlY2tidXR0b24gJHcucG9zdEFjdGlvbnMuY2hlY2tvdXQgXAoJCS10ZXh0IHtDaGVja291dCBhZnRlciBjcmVhdGlvbn0gXAoJCS12YXJpYWJsZSBjcmVhdGVfYnJhbmNoX2NoZWNrb3V0IFwKCQktZm9udCBmb250X3VpCglwYWNrICR3LnBvc3RBY3Rpb25zLmNoZWNrb3V0IC1hbmNob3IgbncKCXBhY2sgJHcucG9zdEFjdGlvbnMgLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQoKCXNldCBjcmVhdGVfYnJhbmNoX2NoZWNrb3V0IDEKCXNldCBjcmVhdGVfYnJhbmNoX2hlYWQgJGN1cnJlbnRfYnJhbmNoCglzZXQgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIGhlYWQKCXNldCBjcmVhdGVfYnJhbmNoX25hbWUgJHJlcG9fY29uZmlnKGd1aS5uZXdicmFuY2h0ZW1wbGF0ZSkKCXNldCBjcmVhdGVfYnJhbmNoX3JldmV4cCB7fQoKCWJpbmQgJHcgPFZpc2liaWxpdHk+ICIKCQlncmFiICR3CgkJJHcuZGVzYy5uYW1lX3QgaWN1cnNvciBlbmQKCQlmb2N1cyAkdy5kZXNjLm5hbWVfdAoJIgoJYmluZCAkdyA8S2V5LUVzY2FwZT4gImRlc3Ryb3kgJHciCgliaW5kICR3IDxLZXktUmV0dXJuPiAiZG9fY3JlYXRlX2JyYW5jaF9hY3Rpb24gJHc7YnJlYWsiCgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogQ3JlYXRlIEJyYW5jaCIKCXRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBkb19kZWxldGVfYnJhbmNoX2FjdGlvbiB7d30gewoJZ2xvYmFsIGFsbF9oZWFkcwoJZ2xvYmFsIGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIGRlbGV0ZV9icmFuY2hfaGVhZCBkZWxldGVfYnJhbmNoX3RyYWNraW5naGVhZAoKCXNldCBjaGVja19yZXYge30KCXN3aXRjaCAtLSAkZGVsZXRlX2JyYW5jaF9jaGVja3R5cGUgewoJaGVhZCB7c2V0IGNoZWNrX3JldiAkZGVsZXRlX2JyYW5jaF9oZWFkfQoJdHJhY2tpbmcge3NldCBjaGVja19yZXYgJGRlbGV0ZV9icmFuY2hfdHJhY2tpbmdoZWFkfQoJYWx3YXlzIHtzZXQgY2hlY2tfcmV2IHs6bm9uZX19Cgl9CglpZiB7JGNoZWNrX3JldiBlcSB7Om5vbmV9fSB7CgkJc2V0IGNoZWNrX2NtdCB7fQoJfSBlbHNlaWYge1tjYXRjaCB7c2V0IGNoZWNrX2NtdCBbZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJHtjaGVja19yZXZ9XjAiXX1dfSB7CgkJdGtfbWVzc2FnZUJveCBcCgkJCS1pY29uIGVycm9yIFwKCQkJLXR5cGUgb2sgXAoJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCgkJCS1wYXJlbnQgJHcgXAoJCQktbWVzc2FnZSAiSW52YWxpZCBjaGVjayByZXZpc2lvbjogJGNoZWNrX3JldiIKCQlyZXR1cm4KCX0KCglzZXQgdG9fZGVsZXRlIFtsaXN0XQoJc2V0IG5vdF9tZXJnZWQgW2xpc3RdCglmb3JlYWNoIGkgWyR3Lmxpc3QubCBjdXJzZWxlY3Rpb25dIHsKCQlzZXQgYiBbJHcubGlzdC5sIGdldCAkaV0KCQlpZiB7W2NhdGNoIHtzZXQgbyBbZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAkYl19XX0gY29udGludWUKCQlpZiB7JGNoZWNrX2NtdCBuZSB7fX0gewoJCQlpZiB7JGIgZXEgJGNoZWNrX3Jldn0gY29udGludWUKCQkJaWYge1tjYXRjaCB7c2V0IG0gW2dpdCBtZXJnZS1iYXNlICRvICRjaGVja19jbXRdfV19IGNvbnRpbnVlCgkJCWlmIHskbyBuZSAkbX0gewoJCQkJbGFwcGVuZCBub3RfbWVyZ2VkICRiCgkJCQljb250aW51ZQoJCQl9CgkJfQoJCWxhcHBlbmQgdG9fZGVsZXRlIFtsaXN0ICRiICRvXQoJfQoJaWYgeyRub3RfbWVyZ2VkIG5lIHt9fSB7CgkJc2V0IG1zZyAiVGhlIGZvbGxvd2luZyBicmFuY2hlcyBhcmUgbm90IGNvbXBsZXRlbHkgbWVyZ2VkIGludG8gJGNoZWNrX3JldjoKCiAtIFtqb2luICRub3RfbWVyZ2VkICJcbiAtICJdIgoJCXRrX21lc3NhZ2VCb3ggXAoJCQktaWNvbiBpbmZvIFwKCQkJLXR5cGUgb2sgXAoJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCgkJCS1wYXJlbnQgJHcgXAoJCQktbWVzc2FnZSAkbXNnCgl9CglpZiB7JHRvX2RlbGV0ZSBlcSB7fX0gcmV0dXJuCglpZiB7JGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIGVxIHthbHdheXN9fSB7CgkJc2V0IG1zZyB7UmVjb3ZlcmluZyBkZWxldGVkIGJyYW5jaGVzIGlzIGRpZmZpY3VsdC4KCkRlbGV0ZSB0aGUgc2VsZWN0ZWQgYnJhbmNoZXM/fQoJCWlmIHtbdGtfbWVzc2FnZUJveCBcCgkJCS1pY29uIHdhcm5pbmcgXAoJCQktdHlwZSB5ZXNubyBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICRtc2ddIG5lIHllc30gewoJCQlyZXR1cm4KCQl9Cgl9CgoJc2V0IGZhaWxlZCB7fQoJZm9yZWFjaCBpICR0b19kZWxldGUgewoJCXNldCBiIFtsaW5kZXggJGkgMF0KCQlzZXQgbyBbbGluZGV4ICRpIDFdCgkJaWYge1tjYXRjaCB7Z2l0IHVwZGF0ZS1yZWYgLWQgInJlZnMvaGVhZHMvJGIiICRvfSBlcnJdfSB7CgkJCWFwcGVuZCBmYWlsZWQgIiAtICRiOiAkZXJyXG4iCgkJfSBlbHNlIHsKCQkJc2V0IHggW2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGFsbF9oZWFkcyAkYl0KCQkJaWYgeyR4ID49IDB9IHsKCQkJCXNldCBhbGxfaGVhZHMgW2xyZXBsYWNlICRhbGxfaGVhZHMgJHggJHhdCgkJCX0KCQl9Cgl9CgoJaWYgeyRmYWlsZWQgbmUge319IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJGYWlsZWQgdG8gZGVsZXRlIGJyYW5jaGVzOlxuJGZhaWxlZCIKCX0KCglzZXQgYWxsX2hlYWRzIFtsc29ydCAkYWxsX2hlYWRzXQoJcG9wdWxhdGVfYnJhbmNoX21lbnUKCWRlc3Ryb3kgJHcKfQoKcHJvYyBkb19kZWxldGVfYnJhbmNoIHt9IHsKCWdsb2JhbCBhbGxfaGVhZHMgdHJhY2tpbmdfYnJhbmNoZXMgY3VycmVudF9icmFuY2gKCWdsb2JhbCBkZWxldGVfYnJhbmNoX2NoZWNrdHlwZSBkZWxldGVfYnJhbmNoX2hlYWQgZGVsZXRlX2JyYW5jaF90cmFja2luZ2hlYWQKCglzZXQgdyAuYnJhbmNoX2VkaXRvcgoJdG9wbGV2ZWwgJHcKCXdtIGdlb21ldHJ5ICR3ICIrW3dpbmZvIHJvb3R4IC5dK1t3aW5mbyByb290eSAuXSIKCglsYWJlbCAkdy5oZWFkZXIgLXRleHQge0RlbGV0ZSBMb2NhbCBCcmFuY2h9IFwKCQktZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zCglidXR0b24gJHcuYnV0dG9ucy5jcmVhdGUgLXRleHQgRGVsZXRlIFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCBkb19kZWxldGVfYnJhbmNoX2FjdGlvbiAkd10KCXBhY2sgJHcuYnV0dG9ucy5jcmVhdGUgLXNpZGUgcmlnaHQKCWJ1dHRvbiAkdy5idXR0b25zLmNhbmNlbCAtdGV4dCB7Q2FuY2VsfSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KCXBhY2sgJHcuYnV0dG9ucy5jYW5jZWwgLXNpZGUgcmlnaHQgLXBhZHggNQoJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCgoJbGFiZWxmcmFtZSAkdy5saXN0IFwKCQktdGV4dCB7TG9jYWwgQnJhbmNoZXN9IFwKCQktZm9udCBmb250X3VpCglsaXN0Ym94ICR3Lmxpc3QubCBcCgkJLWhlaWdodCAxMCBcCgkJLXdpZHRoIDcwIFwKCQktc2VsZWN0bW9kZSBleHRlbmRlZCBcCgkJLXlzY3JvbGxjb21tYW5kIFtsaXN0ICR3Lmxpc3Quc2J5IHNldF0gXAoJCS1mb250IGZvbnRfdWkKCWZvcmVhY2ggaCAkYWxsX2hlYWRzIHsKCQlpZiB7JGggbmUgJGN1cnJlbnRfYnJhbmNofSB7CgkJCSR3Lmxpc3QubCBpbnNlcnQgZW5kICRoCgkJfQoJfQoJc2Nyb2xsYmFyICR3Lmxpc3Quc2J5IC1jb21tYW5kIFtsaXN0ICR3Lmxpc3QubCB5dmlld10KCXBhY2sgJHcubGlzdC5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5saXN0LmwgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5saXN0IC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR5IDUgLXBhZHggNQoKCWxhYmVsZnJhbWUgJHcudmFsaWRhdGUgXAoJCS10ZXh0IHtEZWxldGUgT25seSBJZn0gXAoJCS1mb250IGZvbnRfdWkKCXJhZGlvYnV0dG9uICR3LnZhbGlkYXRlLmhlYWRfciBcCgkJLXRleHQge01lcmdlZCBJbnRvIExvY2FsIEJyYW5jaDp9IFwKCQktdmFsdWUgaGVhZCBcCgkJLXZhcmlhYmxlIGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIFwKCQktZm9udCBmb250X3VpCglldmFsIHRrX29wdGlvbk1lbnUgJHcudmFsaWRhdGUuaGVhZF9tIGRlbGV0ZV9icmFuY2hfaGVhZCAkYWxsX2hlYWRzCglncmlkICR3LnZhbGlkYXRlLmhlYWRfciAkdy52YWxpZGF0ZS5oZWFkX20gLXN0aWNreSB3CglzZXQgYWxsX3RyYWNraW5ncyBbYWxsX3RyYWNraW5nX2JyYW5jaGVzXQoJaWYgeyRhbGxfdHJhY2tpbmdzIG5lIHt9fSB7CgkJc2V0IGRlbGV0ZV9icmFuY2hfdHJhY2tpbmdoZWFkIFtsaW5kZXggJGFsbF90cmFja2luZ3MgMF0KCQlyYWRpb2J1dHRvbiAkdy52YWxpZGF0ZS50cmFja2luZ19yIFwKCQkJLXRleHQge01lcmdlZCBJbnRvIFRyYWNraW5nIEJyYW5jaDp9IFwKCQkJLXZhbHVlIHRyYWNraW5nIFwKCQkJLXZhcmlhYmxlIGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIFwKCQkJLWZvbnQgZm9udF91aQoJCWV2YWwgdGtfb3B0aW9uTWVudSAkdy52YWxpZGF0ZS50cmFja2luZ19tIFwKCQkJZGVsZXRlX2JyYW5jaF90cmFja2luZ2hlYWQgXAoJCQkkYWxsX3RyYWNraW5ncwoJCWdyaWQgJHcudmFsaWRhdGUudHJhY2tpbmdfciAkdy52YWxpZGF0ZS50cmFja2luZ19tIC1zdGlja3kgdwoJfQoJcmFkaW9idXR0b24gJHcudmFsaWRhdGUuYWx3YXlzX3IgXAoJCS10ZXh0IHtBbHdheXMgKERvIG5vdCBwZXJmb3JtIG1lcmdlIGNoZWNrcyl9IFwKCQktdmFsdWUgYWx3YXlzIFwKCQktdmFyaWFibGUgZGVsZXRlX2JyYW5jaF9jaGVja3R5cGUgXAoJCS1mb250IGZvbnRfdWkKCWdyaWQgJHcudmFsaWRhdGUuYWx3YXlzX3IgLWNvbHVtbnNwYW4gMiAtc3RpY2t5IHcKCWdyaWQgY29sdW1uY29uZmlndXJlICR3LnZhbGlkYXRlIDEgLXdlaWdodCAxCglwYWNrICR3LnZhbGlkYXRlIC1hbmNob3IgbncgLWZpbGwgeCAtcGFkeSA1IC1wYWR4IDUKCglzZXQgZGVsZXRlX2JyYW5jaF9oZWFkICRjdXJyZW50X2JyYW5jaAoJc2V0IGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIGhlYWQKCgliaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCgliaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKCXdtIHRpdGxlICR3ICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBEZWxldGUgQnJhbmNoIgoJdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIHN3aXRjaF9icmFuY2gge25ld19icmFuY2h9IHsKCWdsb2JhbCBIRUFEIGNvbW1pdF90eXBlIGN1cnJlbnRfYnJhbmNoIHJlcG9fY29uZmlnCgoJaWYgeyFbbG9ja19pbmRleCBzd2l0Y2hdfSByZXR1cm4KCgkjIC0tIE91ciBpbiBtZW1vcnkgc3RhdGUgc2hvdWxkIG1hdGNoIHRoZSByZXBvc2l0b3J5LgoJIwoJcmVwb3NpdG9yeV9zdGF0ZSBjdXJUeXBlIGN1ckhFQUQgY3VyTUVSR0VfSEVBRAoJaWYge1tzdHJpbmcgbWF0Y2ggYW1lbmQqICRjb21taXRfdHlwZV0KCQkmJiAkY3VyVHlwZSBlcSB7bm9ybWFsfQoJCSYmICRjdXJIRUFEIGVxICRIRUFEfSB7Cgl9IGVsc2VpZiB7JGNvbW1pdF90eXBlIG5lICRjdXJUeXBlIHx8ICRIRUFEIG5lICRjdXJIRUFEfSB7CgkJaW5mb19wb3B1cCB7TGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuCgpBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkKc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgcmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkCmJlZm9yZSB0aGUgY3VycmVudCBicmFuY2ggY2FuIGJlIGNoYW5nZWQuCgpUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy4KfQoJCXVubG9ja19pbmRleAoJCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0KCQlyZXR1cm4KCX0KCgkjIC0tIERvbid0IGRvIGEgcG9pbnRsZXNzIHN3aXRjaC4KCSMKCWlmIHskY3VycmVudF9icmFuY2ggZXEgJG5ld19icmFuY2h9IHsKCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCglpZiB7JHJlcG9fY29uZmlnKGd1aS50cnVzdG10aW1lKSBlcSB7dHJ1ZX19IHsKCQlzd2l0Y2hfYnJhbmNoX3N0YWdlMiB7fSAkbmV3X2JyYW5jaAoJfSBlbHNlIHsKCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWZyZXNoaW5nIGZpbGUgc3RhdHVzLi4ufQoJCXNldCBjbWQgW2xpc3QgZ2l0IHVwZGF0ZS1pbmRleF0KCQlsYXBwZW5kIGNtZCAtcQoJCWxhcHBlbmQgY21kIC0tdW5tZXJnZWQKCQlsYXBwZW5kIGNtZCAtLWlnbm9yZS1taXNzaW5nCgkJbGFwcGVuZCBjbWQgLS1yZWZyZXNoCgkJc2V0IGZkX3JmIFtvcGVuICJ8ICRjbWQiIHJdCgkJZmNvbmZpZ3VyZSAkZmRfcmYgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeQoJCWZpbGVldmVudCAkZmRfcmYgcmVhZGFibGUgXAoJCQlbbGlzdCBzd2l0Y2hfYnJhbmNoX3N0YWdlMiAkZmRfcmYgJG5ld19icmFuY2hdCgl9Cn0KCnByb2Mgc3dpdGNoX2JyYW5jaF9zdGFnZTIge2ZkX3JmIG5ld19icmFuY2h9IHsKCWdsb2JhbCB1aV9zdGF0dXNfdmFsdWUgSEVBRAoKCWlmIHskZmRfcmYgbmUge319IHsKCQlyZWFkICRmZF9yZgoJCWlmIHshW2VvZiAkZmRfcmZdfSByZXR1cm4KCQljbG9zZSAkZmRfcmYKCX0KCglzZXQgdWlfc3RhdHVzX3ZhbHVlICJVcGRhdGluZyB3b3JraW5nIGRpcmVjdG9yeSB0byAnJG5ld19icmFuY2gnLi4uIgoJc2V0IGNtZCBbbGlzdCBnaXQgcmVhZC10cmVlXQoJbGFwcGVuZCBjbWQgLW0KCWxhcHBlbmQgY21kIC11CglsYXBwZW5kIGNtZCAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlCglsYXBwZW5kIGNtZCAkSEVBRAoJbGFwcGVuZCBjbWQgJG5ld19icmFuY2gKCXNldCBmZF9ydCBbb3BlbiAifCAkY21kIiByXQoJZmNvbmZpZ3VyZSAkZmRfcnQgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeQoJZmlsZWV2ZW50ICRmZF9ydCByZWFkYWJsZSBcCgkJW2xpc3Qgc3dpdGNoX2JyYW5jaF9yZWFkdHJlZV93YWl0ICRmZF9ydCAkbmV3X2JyYW5jaF0KfQoKcHJvYyBzd2l0Y2hfYnJhbmNoX3JlYWR0cmVlX3dhaXQge2ZkX3J0IG5ld19icmFuY2h9IHsKCWdsb2JhbCBzZWxlY3RlZF9jb21taXRfdHlwZSBjb21taXRfdHlwZSBIRUFEIE1FUkdFX0hFQUQgUEFSRU5UCglnbG9iYWwgY3VycmVudF9icmFuY2gKCWdsb2JhbCB1aV9jb21tIHVpX3N0YXR1c192YWx1ZQoKCSMgLS0gV2UgbmV2ZXIgZ2V0IGludGVyZXN0aW5nIG91dHB1dCBvbiBzdGRvdXQ7IG9ubHkgc3RkZXJyLgoJIwoJcmVhZCAkZmRfcnQKCWZjb25maWd1cmUgJGZkX3J0IC1ibG9ja2luZyAxCglpZiB7IVtlb2YgJGZkX3J0XX0gewoJCWZjb25maWd1cmUgJGZkX3J0IC1ibG9ja2luZyAwCgkJcmV0dXJuCgl9CgoJIyAtLSBUaGUgd29ya2luZyBkaXJlY3Rvcnkgd2Fzbid0IGluIHN5bmMgd2l0aCB0aGUgaW5kZXggYW5kCgkjICAgIHdlJ2QgaGF2ZSB0byBvdmVyd3JpdGUgc29tZXRoaW5nIHRvIG1ha2UgdGhlIHN3aXRjaC4gQQoJIyAgICBtZXJnZSBpcyByZXF1aXJlZC4KCSMKCWlmIHtbY2F0Y2gge2Nsb3NlICRmZF9ydH0gZXJyXX0gewoJCXJlZ3N1YiB7XmZhdGFsOiB9ICRlcnIge30gZXJyCgkJd2Fybl9wb3B1cCAiRmlsZSBsZXZlbCBtZXJnZSByZXF1aXJlZC4KCiRlcnIKClN0YXlpbmcgb24gYnJhbmNoICckY3VycmVudF9icmFuY2gnLiIKCQlzZXQgdWlfc3RhdHVzX3ZhbHVlICJBYm9ydGVkIGNoZWNrb3V0IG9mICckbmV3X2JyYW5jaCcgKGZpbGUgbGV2ZWwgbWVyZ2luZyBpcyByZXF1aXJlZCkuIgoJCXVubG9ja19pbmRleAoJCXJldHVybgoJfQoKCSMgLS0gVXBkYXRlIHRoZSBzeW1ib2xpYyByZWYuICBDb3JlIGdpdCBkb2Vzbid0IGV2ZW4gY2hlY2sgZm9yIGZhaWx1cmUKCSMgICAgaGVyZSwgaXQgSnVzdCBXb3Jrcyh0bSkuICBJZiBpdCBkb2Vzbid0IHdlIGFyZSBpbiBzb21lIHJlYWxseSB1Z2x5CgkjICAgIHN0YXRlIHRoYXQgaXMgZGlmZmljdWx0IHRvIHJlY292ZXIgZnJvbSB3aXRoaW4gZ2l0LWd1aS4KCSMKCWlmIHtbY2F0Y2gge2dpdCBzeW1ib2xpYy1yZWYgSEVBRCAicmVmcy9oZWFkcy8kbmV3X2JyYW5jaCJ9IGVycl19IHsKCQllcnJvcl9wb3B1cCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IGJyYW5jaC4KClRoaXMgd29ya2luZyBkaXJlY3RvcnkgaXMgb25seSBwYXJ0aWFsbHkgc3dpdGNoZWQuCldlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHlvdXIgZmlsZXMsIGJ1dCBmYWlsZWQgdG8KdXBkYXRlIGFuIGludGVybmFsIEdpdCBmaWxlLgoKVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuICBbYXBwbmFtZV0gd2lsbCBub3cKY2xvc2UgYW5kIGdpdmUgdXAuCgokZXJyIgoJCWRvX3F1aXQKCQlyZXR1cm4KCX0KCgkjIC0tIFVwZGF0ZSBvdXIgcmVwb3NpdG9yeSBzdGF0ZS4gIElmIHdlIHdlcmUgcHJldmlvdXNseSBpbiBhbWVuZCBtb2RlCgkjICAgIHdlIG5lZWQgdG8gdG9zcyB0aGUgY3VycmVudCBidWZmZXIgYW5kIGRvIGEgZnVsbCByZXNjYW4gdG8gdXBkYXRlCgkjICAgIG91ciBmaWxlIGxpc3RzLiAgSWYgd2Ugd2VyZW4ndCBpbiBhbWVuZCBtb2RlIG91ciBmaWxlIGxpc3RzIGFyZQoJIyAgICBhY2N1cmF0ZSBhbmQgd2UgY2FuIGF2b2lkIHRoZSByZXNjYW4uCgkjCgl1bmxvY2tfaW5kZXgKCXNldCBzZWxlY3RlZF9jb21taXRfdHlwZSBuZXcKCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJJHVpX2NvbW0gZGVsZXRlIDAuMCBlbmQKCQkkdWlfY29tbSBlZGl0IHJlc2V0CgkJJHVpX2NvbW0gZWRpdCBtb2RpZmllZCBmYWxzZQoJCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSAiQ2hlY2tlZCBvdXQgYnJhbmNoICckY3VycmVudF9icmFuY2gnLiJ9Cgl9IGVsc2UgewoJCXJlcG9zaXRvcnlfc3RhdGUgY29tbWl0X3R5cGUgSEVBRCBNRVJHRV9IRUFECgkJc2V0IFBBUkVOVCAkSEVBRAoJCXNldCB1aV9zdGF0dXNfdmFsdWUgIkNoZWNrZWQgb3V0IGJyYW5jaCAnJGN1cnJlbnRfYnJhbmNoJy4iCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgcmVtb3RlIG1hbmFnZW1lbnQKCnByb2MgbG9hZF9hbGxfcmVtb3RlcyB7fSB7CglnbG9iYWwgcmVwb19jb25maWcKCWdsb2JhbCBhbGxfcmVtb3RlcyB0cmFja2luZ19icmFuY2hlcwoKCXNldCBhbGxfcmVtb3RlcyBbbGlzdF0KCWFycmF5IHVuc2V0IHRyYWNraW5nX2JyYW5jaGVzCgoJc2V0IHJtX2RpciBbZ2l0ZGlyIHJlbW90ZXNdCglpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJHJtX2Rpcl19IHsKCQlzZXQgYWxsX3JlbW90ZXMgW2dsb2IgXAoJCQktdHlwZXMgZiBcCgkJCS10YWlscyBcCgkJCS1ub2NvbXBsYWluIFwKCQkJLWRpcmVjdG9yeSAkcm1fZGlyICpdCgoJCWZvcmVhY2ggbmFtZSAkYWxsX3JlbW90ZXMgewoJCQljYXRjaCB7CgkJCQlzZXQgZmQgW29wZW4gW2ZpbGUgam9pbiAkcm1fZGlyICRuYW1lXSByXQoJCQkJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CgkJCQkJaWYgeyFbcmVnZXhwIHteUHVsbDpbIAldKihbXjpdKyk6KC4rKSR9IFwKCQkJCQkJJGxpbmUgbGluZSBzcmMgZHN0XX0gY29udGludWUKCQkJCQlpZiB7IVtyZWdleHAgXnJlZnMvICRkc3RdfSB7CgkJCQkJCXNldCBkc3QgInJlZnMvaGVhZHMvJGRzdCIKCQkJCQl9CgkJCQkJc2V0IHRyYWNraW5nX2JyYW5jaGVzKCRkc3QpIFtsaXN0ICRuYW1lICRzcmNdCgkJCQl9CgkJCQljbG9zZSAkZmQKCQkJfQoJCX0KCX0KCglmb3JlYWNoIGxpbmUgW2FycmF5IG5hbWVzIHJlcG9fY29uZmlnIHJlbW90ZS4qLnVybF0gewoJCWlmIHshW3JlZ2V4cCBecmVtb3RlXC4oLiopXC51cmxcJCAkbGluZSBsaW5lIG5hbWVdfSBjb250aW51ZQoJCWxhcHBlbmQgYWxsX3JlbW90ZXMgJG5hbWUKCgkJaWYge1tjYXRjaCB7c2V0IGZsICRyZXBvX2NvbmZpZyhyZW1vdGUuJG5hbWUuZmV0Y2gpfV19IHsKCQkJc2V0IGZsIHt9CgkJfQoJCWZvcmVhY2ggbGluZSAkZmwgewoJCQlpZiB7IVtyZWdleHAge14oW146XSspOiguKykkfSAkbGluZSBsaW5lIHNyYyBkc3RdfSBjb250aW51ZQoJCQlpZiB7IVtyZWdleHAgXnJlZnMvICRkc3RdfSB7CgkJCQlzZXQgZHN0ICJyZWZzL2hlYWRzLyRkc3QiCgkJCX0KCQkJc2V0IHRyYWNraW5nX2JyYW5jaGVzKCRkc3QpIFtsaXN0ICRuYW1lICRzcmNdCgkJfQoJfQoKCXNldCBhbGxfcmVtb3RlcyBbbHNvcnQgLXVuaXF1ZSAkYWxsX3JlbW90ZXNdCn0KCnByb2MgcG9wdWxhdGVfZmV0Y2hfbWVudSB7fSB7CglnbG9iYWwgYWxsX3JlbW90ZXMgcmVwb19jb25maWcKCglzZXQgbSAubWJhci5mZXRjaAoJZm9yZWFjaCByICRhbGxfcmVtb3RlcyB7CgkJc2V0IGVuYWJsZSAwCgkJaWYgeyFbY2F0Y2gge3NldCBhICRyZXBvX2NvbmZpZyhyZW1vdGUuJHIudXJsKX1dfSB7CgkJCWlmIHshW2NhdGNoIHtzZXQgYSAkcmVwb19jb25maWcocmVtb3RlLiRyLmZldGNoKX1dfSB7CgkJCQlzZXQgZW5hYmxlIDEKCQkJfQoJCX0gZWxzZSB7CgkJCWNhdGNoIHsKCQkJCXNldCBmZCBbb3BlbiBbZ2l0ZGlyIHJlbW90ZXMgJHJdIHJdCgkJCQl3aGlsZSB7W2dldHMgJGZkIG5dID49IDB9IHsKCQkJCQlpZiB7W3JlZ2V4cCB7XlB1bGw6WyBcdF0qKFteOl0rKTp9ICRuXX0gewoJCQkJCQlzZXQgZW5hYmxlIDEKCQkJCQkJYnJlYWsKCQkJCQl9CgkJCQl9CgkJCQljbG9zZSAkZmQKCQkJfQoJCX0KCgkJaWYgeyRlbmFibGV9IHsKCQkJJG0gYWRkIGNvbW1hbmQgXAoJCQkJLWxhYmVsICJGZXRjaCBmcm9tICRyLi4uIiBcCgkJCQktY29tbWFuZCBbbGlzdCBmZXRjaF9mcm9tICRyXSBcCgkJCQktZm9udCBmb250X3VpCgkJfQoJfQp9Cgpwcm9jIHBvcHVsYXRlX3B1c2hfbWVudSB7fSB7CglnbG9iYWwgYWxsX3JlbW90ZXMgcmVwb19jb25maWcKCglzZXQgbSAubWJhci5wdXNoCglzZXQgZmFzdF9jb3VudCAwCglmb3JlYWNoIHIgJGFsbF9yZW1vdGVzIHsKCQlzZXQgZW5hYmxlIDAKCQlpZiB7IVtjYXRjaCB7c2V0IGEgJHJlcG9fY29uZmlnKHJlbW90ZS4kci51cmwpfV19IHsKCQkJaWYgeyFbY2F0Y2gge3NldCBhICRyZXBvX2NvbmZpZyhyZW1vdGUuJHIucHVzaCl9XX0gewoJCQkJc2V0IGVuYWJsZSAxCgkJCX0KCQl9IGVsc2UgewoJCQljYXRjaCB7CgkJCQlzZXQgZmQgW29wZW4gW2dpdGRpciByZW1vdGVzICRyXSByXQoJCQkJd2hpbGUge1tnZXRzICRmZCBuXSA+PSAwfSB7CgkJCQkJaWYge1tyZWdleHAge15QdXNoOlsgXHRdKihbXjpdKyk6fSAkbl19IHsKCQkJCQkJc2V0IGVuYWJsZSAxCgkJCQkJCWJyZWFrCgkJCQkJfQoJCQkJfQoJCQkJY2xvc2UgJGZkCgkJCX0KCQl9CgoJCWlmIHskZW5hYmxlfSB7CgkJCWlmIHshJGZhc3RfY291bnR9IHsKCQkJCSRtIGFkZCBzZXBhcmF0b3IKCQkJfQoJCQkkbSBhZGQgY29tbWFuZCBcCgkJCQktbGFiZWwgIlB1c2ggdG8gJHIuLi4iIFwKCQkJCS1jb21tYW5kIFtsaXN0IHB1c2hfdG8gJHJdIFwKCQkJCS1mb250IGZvbnRfdWkKCQkJaW5jciBmYXN0X2NvdW50CgkJfQoJfQp9Cgpwcm9jIHN0YXJ0X3B1c2hfYW55d2hlcmVfYWN0aW9uIHt3fSB7CglnbG9iYWwgcHVzaF91cmx0eXBlIHB1c2hfcmVtb3RlIHB1c2hfdXJsIHB1c2hfdGhpbiBwdXNoX3RhZ3MKCglzZXQgcl91cmwge30KCXN3aXRjaCAtLSAkcHVzaF91cmx0eXBlIHsKCXJlbW90ZSB7c2V0IHJfdXJsICRwdXNoX3JlbW90ZX0KCXVybCB7c2V0IHJfdXJsICRwdXNoX3VybH0KCX0KCWlmIHskcl91cmwgZXEge319IHJldHVybgoKCXNldCBjbWQgW2xpc3QgZ2l0IHB1c2hdCglsYXBwZW5kIGNtZCAtdgoJaWYgeyRwdXNoX3RoaW59IHsKCQlsYXBwZW5kIGNtZCAtLXRoaW4KCX0KCWlmIHskcHVzaF90YWdzfSB7CgkJbGFwcGVuZCBjbWQgLS10YWdzCgl9CglsYXBwZW5kIGNtZCAkcl91cmwKCXNldCBjbnQgMAoJZm9yZWFjaCBpIFskdy5zb3VyY2UubCBjdXJzZWxlY3Rpb25dIHsKCQlzZXQgYiBbJHcuc291cmNlLmwgZ2V0ICRpXQoJCWxhcHBlbmQgY21kICJyZWZzL2hlYWRzLyRiOnJlZnMvaGVhZHMvJGIiCgkJaW5jciBjbnQKCX0KCWlmIHskY250ID09IDB9IHsKCQlyZXR1cm4KCX0gZWxzZWlmIHskY250ID09IDF9IHsKCQlzZXQgdW5pdCBicmFuY2gKCX0gZWxzZSB7CgkJc2V0IHVuaXQgYnJhbmNoZXMKCX0KCglzZXQgY29ucyBbbmV3X2NvbnNvbGUgInB1c2ggJHJfdXJsIiAiUHVzaGluZyAkY250ICR1bml0IHRvICRyX3VybCJdCgljb25zb2xlX2V4ZWMgJGNvbnMgJGNtZCBjb25zb2xlX2RvbmUKCWRlc3Ryb3kgJHcKfQoKdHJhY2UgYWRkIHZhcmlhYmxlIHB1c2hfcmVtb3RlIHdyaXRlIFwKCVtsaXN0IHJhZGlvX3NlbGVjdG9yIHB1c2hfdXJsdHlwZSByZW1vdGVdCgpwcm9jIGRvX3B1c2hfYW55d2hlcmUge30gewoJZ2xvYmFsIGFsbF9oZWFkcyBhbGxfcmVtb3RlcyBjdXJyZW50X2JyYW5jaAoJZ2xvYmFsIHB1c2hfdXJsdHlwZSBwdXNoX3JlbW90ZSBwdXNoX3VybCBwdXNoX3RoaW4gcHVzaF90YWdzCgoJc2V0IHcgLnB1c2hfc2V0dXAKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IHtQdXNoIEJyYW5jaGVzfSAtZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zCglidXR0b24gJHcuYnV0dG9ucy5jcmVhdGUgLXRleHQgUHVzaCBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3Qgc3RhcnRfcHVzaF9hbnl3aGVyZV9hY3Rpb24gJHddCglwYWNrICR3LmJ1dHRvbnMuY3JlYXRlIC1zaWRlIHJpZ2h0CglidXR0b24gJHcuYnV0dG9ucy5jYW5jZWwgLXRleHQge0NhbmNlbH0gXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCglwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAxMCAtcGFkeCAxMAoKCWxhYmVsZnJhbWUgJHcuc291cmNlIFwKCQktdGV4dCB7U291cmNlIEJyYW5jaGVzfSBcCgkJLWZvbnQgZm9udF91aQoJbGlzdGJveCAkdy5zb3VyY2UubCBcCgkJLWhlaWdodCAxMCBcCgkJLXdpZHRoIDcwIFwKCQktc2VsZWN0bW9kZSBleHRlbmRlZCBcCgkJLXlzY3JvbGxjb21tYW5kIFtsaXN0ICR3LnNvdXJjZS5zYnkgc2V0XSBcCgkJLWZvbnQgZm9udF91aQoJZm9yZWFjaCBoICRhbGxfaGVhZHMgewoJCSR3LnNvdXJjZS5sIGluc2VydCBlbmQgJGgKCQlpZiB7JGggZXEgJGN1cnJlbnRfYnJhbmNofSB7CgkJCSR3LnNvdXJjZS5sIHNlbGVjdCBzZXQgZW5kCgkJfQoJfQoJc2Nyb2xsYmFyICR3LnNvdXJjZS5zYnkgLWNvbW1hbmQgW2xpc3QgJHcuc291cmNlLmwgeXZpZXddCglwYWNrICR3LnNvdXJjZS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5zb3VyY2UubCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCglwYWNrICR3LnNvdXJjZSAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeSA1IC1wYWR4IDUKCglsYWJlbGZyYW1lICR3LmRlc3QgXAoJCS10ZXh0IHtEZXN0aW5hdGlvbiBSZXBvc2l0b3J5fSBcCgkJLWZvbnQgZm9udF91aQoJaWYgeyRhbGxfcmVtb3RlcyBuZSB7fX0gewoJCXJhZGlvYnV0dG9uICR3LmRlc3QucmVtb3RlX3IgXAoJCQktdGV4dCB7UmVtb3RlOn0gXAoJCQktdmFsdWUgcmVtb3RlIFwKCQkJLXZhcmlhYmxlIHB1c2hfdXJsdHlwZSBcCgkJCS1mb250IGZvbnRfdWkKCQlldmFsIHRrX29wdGlvbk1lbnUgJHcuZGVzdC5yZW1vdGVfbSBwdXNoX3JlbW90ZSAkYWxsX3JlbW90ZXMKCQlncmlkICR3LmRlc3QucmVtb3RlX3IgJHcuZGVzdC5yZW1vdGVfbSAtc3RpY2t5IHcKCQlpZiB7W2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGFsbF9yZW1vdGVzIG9yaWdpbl0gIT0gLTF9IHsKCQkJc2V0IHB1c2hfcmVtb3RlIG9yaWdpbgoJCX0gZWxzZSB7CgkJCXNldCBwdXNoX3JlbW90ZSBbbGluZGV4ICRhbGxfcmVtb3RlcyAwXQoJCX0KCQlzZXQgcHVzaF91cmx0eXBlIHJlbW90ZQoJfSBlbHNlIHsKCQlzZXQgcHVzaF91cmx0eXBlIHVybAoJfQoJcmFkaW9idXR0b24gJHcuZGVzdC51cmxfciBcCgkJLXRleHQge0FyYml0cmFyeSBVUkw6fSBcCgkJLXZhbHVlIHVybCBcCgkJLXZhcmlhYmxlIHB1c2hfdXJsdHlwZSBcCgkJLWZvbnQgZm9udF91aQoJZW50cnkgJHcuZGVzdC51cmxfdCBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktd2lkdGggNTAgXAoJCS10ZXh0dmFyaWFibGUgcHVzaF91cmwgXAoJCS1mb250IGZvbnRfdWkgXAoJCS12YWxpZGF0ZSBrZXkgXAoJCS12YWxpZGF0ZWNvbW1hbmQgewoJCQlpZiB7JWQgPT0gMSAmJiBbcmVnZXhwIHtcc30gJVNdfSB7cmV0dXJuIDB9CgkJCWlmIHslZCA9PSAxICYmIFtzdHJpbmcgbGVuZ3RoICVTXSA+IDB9IHsKCQkJCXNldCBwdXNoX3VybHR5cGUgdXJsCgkJCX0KCQkJcmV0dXJuIDEKCQl9CglncmlkICR3LmRlc3QudXJsX3IgJHcuZGVzdC51cmxfdCAtc3RpY2t5IHdlIC1wYWR4IHswIDV9CglncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy5kZXN0IDEgLXdlaWdodCAxCglwYWNrICR3LmRlc3QgLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQoKCWxhYmVsZnJhbWUgJHcub3B0aW9ucyBcCgkJLXRleHQge1RyYW5zZmVyIE9wdGlvbnN9IFwKCQktZm9udCBmb250X3VpCgljaGVja2J1dHRvbiAkdy5vcHRpb25zLnRoaW4gXAoJCS10ZXh0IHtVc2UgdGhpbiBwYWNrIChmb3Igc2xvdyBuZXR3b3JrIGNvbm5lY3Rpb25zKX0gXAoJCS12YXJpYWJsZSBwdXNoX3RoaW4gXAoJCS1mb250IGZvbnRfdWkKCWdyaWQgJHcub3B0aW9ucy50aGluIC1jb2x1bW5zcGFuIDIgLXN0aWNreSB3CgljaGVja2J1dHRvbiAkdy5vcHRpb25zLnRhZ3MgXAoJCS10ZXh0IHtJbmNsdWRlIHRhZ3N9IFwKCQktdmFyaWFibGUgcHVzaF90YWdzIFwKCQktZm9udCBmb250X3VpCglncmlkICR3Lm9wdGlvbnMudGFncyAtY29sdW1uc3BhbiAyIC1zdGlja3kgdwoJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcub3B0aW9ucyAxIC13ZWlnaHQgMQoJcGFjayAkdy5vcHRpb25zIC1hbmNob3IgbncgLWZpbGwgeCAtcGFkeSA1IC1wYWR4IDUKCglzZXQgcHVzaF91cmwge30KCXNldCBwdXNoX3RoaW4gMAoJc2V0IHB1c2hfdGFncyAwCgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHciCgliaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKCXdtIHRpdGxlICR3ICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBQdXNoIgoJdGt3YWl0IHdpbmRvdyAkdwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIG1lcmdlCgpwcm9jIGNhbl9tZXJnZSB7fSB7CglnbG9iYWwgSEVBRCBjb21taXRfdHlwZSBmaWxlX3N0YXRlcwoKCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJaW5mb19wb3B1cCB7Q2Fubm90IG1lcmdlIHdoaWxlIGFtZW5kaW5nLgoKWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0IGJlZm9yZQpzdGFydGluZyBhbnkgdHlwZSBvZiBtZXJnZS4KfQoJCXJldHVybiAwCgl9CgoJaWYge1tjb21taXR0ZXJfaWRlbnRdIGVxIHt9fSB7cmV0dXJuIDB9CglpZiB7IVtsb2NrX2luZGV4IG1lcmdlXX0ge3JldHVybiAwfQoKCSMgLS0gT3VyIGluIG1lbW9yeSBzdGF0ZSBzaG91bGQgbWF0Y2ggdGhlIHJlcG9zaXRvcnkuCgkjCglyZXBvc2l0b3J5X3N0YXRlIGN1clR5cGUgY3VySEVBRCBjdXJNRVJHRV9IRUFECglpZiB7JGNvbW1pdF90eXBlIG5lICRjdXJUeXBlIHx8ICRIRUFEIG5lICRjdXJIRUFEfSB7CgkJaW5mb19wb3B1cCB7TGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuCgpBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkKc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgcmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkCmJlZm9yZSBhIG1lcmdlIGNhbiBiZSBwZXJmb3JtZWQuCgpUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy4KfQoJCXVubG9ja19pbmRleAoJCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0KCQlyZXR1cm4gMAoJfQoKCWZvcmVhY2ggcGF0aCBbYXJyYXkgbmFtZXMgZmlsZV9zdGF0ZXNdIHsKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlfTyB7CgkJCWNvbnRpbnVlOyAjIGFuZCBwcmF5IGl0IHdvcmtzIQoJCX0KCQlVPyB7CgkJCWVycm9yX3BvcHVwICJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25mbGljdGVkIG1lcmdlLgoKRmlsZSBbc2hvcnRfcGF0aCAkcGF0aF0gaGFzIG1lcmdlIGNvbmZsaWN0cy4KCllvdSBtdXN0IHJlc29sdmUgdGhlbSwgYWRkIHRoZSBmaWxlLCBhbmQgY29tbWl0IHRvCmNvbXBsZXRlIHRoZSBjdXJyZW50IG1lcmdlLiAgT25seSB0aGVuIGNhbiB5b3UKYmVnaW4gYW5vdGhlciBtZXJnZS4KIgoJCQl1bmxvY2tfaW5kZXgKCQkJcmV0dXJuIDAKCQl9CgkJPz8gewoJCQllcnJvcl9wb3B1cCAiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhbmdlLgoKRmlsZSBbc2hvcnRfcGF0aCAkcGF0aF0gaXMgbW9kaWZpZWQuCgpZb3Ugc2hvdWxkIGNvbXBsZXRlIHRoZSBjdXJyZW50IGNvbW1pdCBiZWZvcmUKc3RhcnRpbmcgYSBtZXJnZS4gIERvaW5nIHNvIHdpbGwgaGVscCB5b3UgYWJvcnQKYSBmYWlsZWQgbWVyZ2UsIHNob3VsZCB0aGUgbmVlZCBhcmlzZS4KIgoJCQl1bmxvY2tfaW5kZXgKCQkJcmV0dXJuIDAKCQl9CgkJfQoJfQoKCXJldHVybiAxCn0KCnByb2MgdmlzdWFsaXplX2xvY2FsX21lcmdlIHt3fSB7CglzZXQgcmV2cyB7fQoJZm9yZWFjaCBpIFskdy5zb3VyY2UubCBjdXJzZWxlY3Rpb25dIHsKCQlsYXBwZW5kIHJldnMgWyR3LnNvdXJjZS5sIGdldCAkaV0KCX0KCWlmIHskcmV2cyBlcSB7fX0gcmV0dXJuCglsYXBwZW5kIHJldnMgLS1ub3QgSEVBRAoJZG9fZ2l0ayAkcmV2cwp9Cgpwcm9jIHN0YXJ0X2xvY2FsX21lcmdlX2FjdGlvbiB7d30gewoJZ2xvYmFsIEhFQUQgdWlfc3RhdHVzX3ZhbHVlIGN1cnJlbnRfYnJhbmNoCgoJc2V0IGNtZCBbbGlzdCBnaXQgbWVyZ2VdCglzZXQgbmFtZXMge30KCXNldCByZXZjbnQgMAoJZm9yZWFjaCBpIFskdy5zb3VyY2UubCBjdXJzZWxlY3Rpb25dIHsKCQlzZXQgYiBbJHcuc291cmNlLmwgZ2V0ICRpXQoJCWxhcHBlbmQgY21kICRiCgkJbGFwcGVuZCBuYW1lcyAkYgoJCWluY3IgcmV2Y250Cgl9CgoJaWYgeyRyZXZjbnQgPT0gMH0gewoJCXJldHVybgoJfSBlbHNlaWYgeyRyZXZjbnQgPT0gMX0gewoJCXNldCB1bml0IGJyYW5jaAoJfSBlbHNlaWYgeyRyZXZjbnQgPD0gMTV9IHsKCQlzZXQgdW5pdCBicmFuY2hlcwoJfSBlbHNlIHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJUb28gbWFueSBicmFuY2hlcyBzZWxlY3RlZC4KCllvdSBoYXZlIHJlcXVlc3RlZCB0byBtZXJnZSAkcmV2Y250IGJyYW5jaGVzCmluIGFuIG9jdG9wdXMgbWVyZ2UuICBUaGlzIGV4Y2VlZHMgR2l0J3MKaW50ZXJuYWwgbGltaXQgb2YgMTUgYnJhbmNoZXMgcGVyIG1lcmdlLgoKUGxlYXNlIHNlbGVjdCBmZXdlciBicmFuY2hlcy4gIFRvIG1lcmdlIG1vcmUKdGhhbiAxNSBicmFuY2hlcywgbWVyZ2UgdGhlIGJyYW5jaGVzIGluIGJhdGNoZXMuCiIKCQlyZXR1cm4KCX0KCglzZXQgbXNnICJNZXJnaW5nICRjdXJyZW50X2JyYW5jaCwgW2pvaW4gJG5hbWVzIHssIH1dIgoJc2V0IHVpX3N0YXR1c192YWx1ZSAiJG1zZy4uLiIKCXNldCBjb25zIFtuZXdfY29uc29sZSAiTWVyZ2UiICRtc2ddCgljb25zb2xlX2V4ZWMgJGNvbnMgJGNtZCBbbGlzdCBmaW5pc2hfbWVyZ2UgJHJldmNudF0KCWJpbmQgJHcgPERlc3Ryb3k+IHt9CglkZXN0cm95ICR3Cn0KCnByb2MgZmluaXNoX21lcmdlIHtyZXZjbnQgdyBva30gewoJY29uc29sZV9kb25lICR3ICRvawoJaWYgeyRva30gewoJCXNldCBtc2cge01lcmdlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkufQoJfSBlbHNlIHsKCQlpZiB7JHJldmNudCAhPSAxfSB7CgkJCWluZm9fcG9wdXAgIk9jdG9wdXMgbWVyZ2UgZmFpbGVkLgoKWW91ciBtZXJnZSBvZiAkcmV2Y250IGJyYW5jaGVzIGhhcyBmYWlsZWQuCgpUaGVyZSBhcmUgZmlsZS1sZXZlbCBjb25mbGljdHMgYmV0d2VlbiB0aGUKYnJhbmNoZXMgd2hpY2ggbXVzdCBiZSByZXNvbHZlZCBtYW51YWxseS4KClRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aWxsIG5vdyBiZSByZXNldC4KCllvdSBjYW4gYXR0ZW1wdCB0aGlzIG1lcmdlIGFnYWluCmJ5IG1lcmdpbmcgb25seSBvbmUgYnJhbmNoIGF0IGEgdGltZS4iICR3CgoJCQlzZXQgZmQgW29wZW4gInwgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQiIHJdCgkJCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCQkJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCByZXNldF9oYXJkX3dhaXQgJGZkXQoJCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtBYm9ydGluZy4uLiBwbGVhc2Ugd2FpdC4uLn0KCQkJcmV0dXJuCgkJfQoKCQlzZXQgbXNnIHtNZXJnZSBmYWlsZWQuICBDb25mbGljdCByZXNvbHV0aW9uIGlzIHJlcXVpcmVkLn0KCX0KCXVubG9ja19pbmRleAoJcmVzY2FuIFtsaXN0IHNldCB1aV9zdGF0dXNfdmFsdWUgJG1zZ10KfQoKcHJvYyBkb19sb2NhbF9tZXJnZSB7fSB7CglnbG9iYWwgY3VycmVudF9icmFuY2gKCglpZiB7IVtjYW5fbWVyZ2VdfSByZXR1cm4KCglzZXQgdyAubWVyZ2Vfc2V0dXAKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIFwKCQktdGV4dCAiTWVyZ2UgSW50byAkY3VycmVudF9icmFuY2giIFwKCQktZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zCglidXR0b24gJHcuYnV0dG9ucy52aXN1YWxpemUgLXRleHQgVmlzdWFsaXplIFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCB2aXN1YWxpemVfbG9jYWxfbWVyZ2UgJHddCglwYWNrICR3LmJ1dHRvbnMudmlzdWFsaXplIC1zaWRlIGxlZnQKCWJ1dHRvbiAkdy5idXR0b25zLmNyZWF0ZSAtdGV4dCBNZXJnZSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3Qgc3RhcnRfbG9jYWxfbWVyZ2VfYWN0aW9uICR3XQoJcGFjayAkdy5idXR0b25zLmNyZWF0ZSAtc2lkZSByaWdodAoJYnV0dG9uICR3LmJ1dHRvbnMuY2FuY2VsIC10ZXh0IHtDYW5jZWx9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCBkZXN0cm95ICR3XQoJcGFjayAkdy5idXR0b25zLmNhbmNlbCAtc2lkZSByaWdodCAtcGFkeCA1CglwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKCglsYWJlbGZyYW1lICR3LnNvdXJjZSBcCgkJLXRleHQge1NvdXJjZSBCcmFuY2hlc30gXAoJCS1mb250IGZvbnRfdWkKCWxpc3Rib3ggJHcuc291cmNlLmwgXAoJCS1oZWlnaHQgMTAgXAoJCS13aWR0aCA3MCBcCgkJLXNlbGVjdG1vZGUgZXh0ZW5kZWQgXAoJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5zb3VyY2Uuc2J5IHNldF0gXAoJCS1mb250IGZvbnRfdWkKCXNjcm9sbGJhciAkdy5zb3VyY2Uuc2J5IC1jb21tYW5kIFtsaXN0ICR3LnNvdXJjZS5sIHl2aWV3XQoJcGFjayAkdy5zb3VyY2Uuc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKCXBhY2sgJHcuc291cmNlLmwgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5zb3VyY2UgLWZpbGwgYm90aCAtZXhwYW5kIDEgLXBhZHkgNSAtcGFkeCA1CgoJc2V0IGNtZCBbbGlzdCBnaXQgZm9yLWVhY2gtcmVmXQoJbGFwcGVuZCBjbWQgey0tZm9ybWF0PSUob2JqZWN0bmFtZSkgJSgqb2JqZWN0bmFtZSkgJShyZWZuYW1lKX0KCWxhcHBlbmQgY21kIHJlZnMvaGVhZHMKCWxhcHBlbmQgY21kIHJlZnMvcmVtb3RlcwoJbGFwcGVuZCBjbWQgcmVmcy90YWdzCglzZXQgZnJfZmQgW29wZW4gInwgJGNtZCIgcl0KCWZjb25maWd1cmUgJGZyX2ZkIC10cmFuc2xhdGlvbiBiaW5hcnkKCXdoaWxlIHtbZ2V0cyAkZnJfZmQgbGluZV0gPiAwfSB7CgkJc2V0IGxpbmUgW3NwbGl0ICRsaW5lIHsgfV0KCQlzZXQgc2hhMShbbGluZGV4ICRsaW5lIDBdKSBbbGluZGV4ICRsaW5lIDJdCgkJc2V0IHNoYTEoW2xpbmRleCAkbGluZSAxXSkgW2xpbmRleCAkbGluZSAyXQoJfQoJY2xvc2UgJGZyX2ZkCgoJc2V0IHRvX3Nob3cge30KCXNldCBmcl9mZCBbb3BlbiAifCBnaXQgcmV2LWxpc3QgLS1hbGwgLS1ub3QgSEVBRCJdCgl3aGlsZSB7W2dldHMgJGZyX2ZkIGxpbmVdID4gMH0gewoJCWlmIHtbY2F0Y2gge3NldCByZWYgJHNoYTEoJGxpbmUpfV19IGNvbnRpbnVlCgkJcmVnc3ViIF5yZWZzLyhoZWFkc3xyZW1vdGVzfHRhZ3MpLyAkcmVmIHt9IHJlZgoJCWxhcHBlbmQgdG9fc2hvdyAkcmVmCgl9CgljbG9zZSAkZnJfZmQKCglmb3JlYWNoIHJlZiBbbHNvcnQgLXVuaXF1ZSAkdG9fc2hvd10gewoJCSR3LnNvdXJjZS5sIGluc2VydCBlbmQgJHJlZgoJfQoKCWJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3IgoJYmluZCAkdyA8S2V5LUVzY2FwZT4gInVubG9ja19pbmRleDtkZXN0cm95ICR3IgoJYmluZCAkdyA8RGVzdHJveT4gdW5sb2NrX2luZGV4Cgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogTWVyZ2UiCgl0a3dhaXQgd2luZG93ICR3Cn0KCnByb2MgZG9fcmVzZXRfaGFyZCB7fSB7CglnbG9iYWwgSEVBRCBjb21taXRfdHlwZSBmaWxlX3N0YXRlcwoKCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJaW5mb19wb3B1cCB7Q2Fubm90IGFib3J0IHdoaWxlIGFtZW5kaW5nLgoKWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0Lgp9CgkJcmV0dXJuCgl9CgoJaWYgeyFbbG9ja19pbmRleCBhYm9ydF19IHJldHVybgoKCWlmIHtbc3RyaW5nIG1hdGNoICptZXJnZSogJGNvbW1pdF90eXBlXX0gewoJCXNldCBvcCBtZXJnZQoJfSBlbHNlIHsKCQlzZXQgb3AgY29tbWl0Cgl9CgoJaWYge1thc2tfcG9wdXAgIkFib3J0ICRvcD8KCkFib3J0aW5nIHRoZSBjdXJyZW50ICRvcCB3aWxsIGNhdXNlCipBTEwqIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYmUgbG9zdC4KCkNvbnRpbnVlIHdpdGggYWJvcnRpbmcgdGhlIGN1cnJlbnQgJG9wPyJdIGVxIHt5ZXN9fSB7CgkJc2V0IGZkIFtvcGVuICJ8IGdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEIiByXQoJCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCQlmaWxlZXZlbnQgJGZkIHJlYWRhYmxlIFtsaXN0IHJlc2V0X2hhcmRfd2FpdCAkZmRdCgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7QWJvcnRpbmcuLi4gcGxlYXNlIHdhaXQuLi59Cgl9IGVsc2UgewoJCXVubG9ja19pbmRleAoJfQp9Cgpwcm9jIHJlc2V0X2hhcmRfd2FpdCB7ZmR9IHsKCWdsb2JhbCB1aV9jb21tCgoJcmVhZCAkZmQKCWlmIHtbZW9mICRmZF19IHsKCQljbG9zZSAkZmQKCQl1bmxvY2tfaW5kZXgKCgkJJHVpX2NvbW0gZGVsZXRlIDAuMCBlbmQKCQkkdWlfY29tbSBlZGl0IG1vZGlmaWVkIGZhbHNlCgoJCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIE1FUkdFX0hFQURdfQoJCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIHJyLWNhY2hlIE1FUkdFX1JSXX0KCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBTUVVBU0hfTVNHXX0KCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBNRVJHRV9NU0ddfQoJCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIEdJVEdVSV9NU0ddfQoKCQlyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge0Fib3J0IGNvbXBsZXRlZC4gIFJlYWR5Ln19Cgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgYnJvd3NlcgoKc2V0IG5leHRfYnJvd3Nlcl9pZCAwCgpwcm9jIG5ld19icm93c2VyIHtjb21taXR9IHsKCWdsb2JhbCBuZXh0X2Jyb3dzZXJfaWQgY3Vyc29yX3B0ciBNMUIKCWdsb2JhbCBicm93c2VyX2NvbW1pdCBicm93c2VyX3N0YXR1cyBicm93c2VyX3N0YWNrIGJyb3dzZXJfcGF0aCBicm93c2VyX2J1c3kKCglpZiB7W3dpbmZvIGlzbWFwcGVkIC5dfSB7CgkJc2V0IHcgLmJyb3dzZXJbaW5jciBuZXh0X2Jyb3dzZXJfaWRdCgkJc2V0IHRsICR3CgkJdG9wbGV2ZWwgJHcKCX0gZWxzZSB7CgkJc2V0IHcge30KCQlzZXQgdGwgLgoJfQoJc2V0IHdfbGlzdCAkdy5saXN0LmwKCXNldCBicm93c2VyX2NvbW1pdCgkd19saXN0KSAkY29tbWl0CglzZXQgYnJvd3Nlcl9zdGF0dXMoJHdfbGlzdCkge1N0YXJ0aW5nLi4ufQoJc2V0IGJyb3dzZXJfc3RhY2soJHdfbGlzdCkge30KCXNldCBicm93c2VyX3BhdGgoJHdfbGlzdCkgJGJyb3dzZXJfY29tbWl0KCR3X2xpc3QpOgoJc2V0IGJyb3dzZXJfYnVzeSgkd19saXN0KSAxCgoJbGFiZWwgJHcucGF0aCAtdGV4dHZhcmlhYmxlIGJyb3dzZXJfcGF0aCgkd19saXN0KSBcCgkJLWFuY2hvciB3IFwKCQktanVzdGlmeSBsZWZ0IFwKCQktYm9yZGVyd2lkdGggMSBcCgkJLXJlbGllZiBzdW5rZW4gXAoJCS1mb250IGZvbnRfdWlib2xkCglwYWNrICR3LnBhdGggLWFuY2hvciB3IC1zaWRlIHRvcCAtZmlsbCB4CgoJZnJhbWUgJHcubGlzdAoJdGV4dCAkd19saXN0IC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCQktY3Vyc29yICRjdXJzb3JfcHRyIFwKCQktc3RhdGUgZGlzYWJsZWQgXAoJCS13cmFwIG5vbmUgXAoJCS1oZWlnaHQgMjAgXAoJCS13aWR0aCA3MCBcCgkJLXhzY3JvbGxjb21tYW5kIFtsaXN0ICR3Lmxpc3Quc2J4IHNldF0gXAoJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5saXN0LnNieSBzZXRdIFwKCQktZm9udCBmb250X3VpCgkkd19saXN0IHRhZyBjb25mIGluX3NlbCBcCgkJLWJhY2tncm91bmQgWyR3X2xpc3QgY2dldCAtZm9yZWdyb3VuZF0gXAoJCS1mb3JlZ3JvdW5kIFskd19saXN0IGNnZXQgLWJhY2tncm91bmRdCglzY3JvbGxiYXIgJHcubGlzdC5zYnggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR3X2xpc3QgeHZpZXddCglzY3JvbGxiYXIgJHcubGlzdC5zYnkgLW9yaWVudCB2IC1jb21tYW5kIFtsaXN0ICR3X2xpc3QgeXZpZXddCglwYWNrICR3Lmxpc3Quc2J4IC1zaWRlIGJvdHRvbSAtZmlsbCB4CglwYWNrICR3Lmxpc3Quc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKCXBhY2sgJHdfbGlzdCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCglwYWNrICR3Lmxpc3QgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCgoJbGFiZWwgJHcuc3RhdHVzIC10ZXh0dmFyaWFibGUgYnJvd3Nlcl9zdGF0dXMoJHdfbGlzdCkgXAoJCS1hbmNob3IgdyBcCgkJLWp1c3RpZnkgbGVmdCBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktZm9udCBmb250X3VpCglwYWNrICR3LnN0YXR1cyAtYW5jaG9yIHcgLXNpZGUgYm90dG9tIC1maWxsIHgKCgliaW5kICR3X2xpc3QgPEJ1dHRvbi0xPiAgICAgICAgImJyb3dzZXJfY2xpY2sgMCAkd19saXN0IEAleCwleTticmVhayIKCWJpbmQgJHdfbGlzdCA8RG91YmxlLUJ1dHRvbi0xPiAiYnJvd3Nlcl9jbGljayAxICR3X2xpc3QgQCV4LCV5O2JyZWFrIgoJYmluZCAkd19saXN0IDwkTTFCLVVwPiAgICAgICAgICJicm93c2VyX3BhcmVudCAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDwkTTFCLUxlZnQ+ICAgICAgICJicm93c2VyX3BhcmVudCAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxVcD4gICAgICAgICAgICAgICJicm93c2VyX21vdmUgLTEgJHdfbGlzdDticmVhayIKCWJpbmQgJHdfbGlzdCA8RG93bj4gICAgICAgICAgICAiYnJvd3Nlcl9tb3ZlIDEgJHdfbGlzdDticmVhayIKCWJpbmQgJHdfbGlzdCA8JE0xQi1SaWdodD4gICAgICAiYnJvd3Nlcl9lbnRlciAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxSZXR1cm4+ICAgICAgICAgICJicm93c2VyX2VudGVyICR3X2xpc3Q7YnJlYWsiCgliaW5kICR3X2xpc3QgPFByaW9yPiAgICAgICAgICAgImJyb3dzZXJfcGFnZSAtMSAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxOZXh0PiAgICAgICAgICAgICJicm93c2VyX3BhZ2UgMSAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxMZWZ0PiAgICAgICAgICAgIGJyZWFrCgliaW5kICR3X2xpc3QgPFJpZ2h0PiAgICAgICAgICAgYnJlYWsKCgliaW5kICR0bCA8VmlzaWJpbGl0eT4gImZvY3VzICR3IgoJYmluZCAkdGwgPERlc3Ryb3k+ICIKCQlhcnJheSB1bnNldCBicm93c2VyX2J1ZmZlciAkd19saXN0CgkJYXJyYXkgdW5zZXQgYnJvd3Nlcl9maWxlcyAkd19saXN0CgkJYXJyYXkgdW5zZXQgYnJvd3Nlcl9zdGF0dXMgJHdfbGlzdAoJCWFycmF5IHVuc2V0IGJyb3dzZXJfc3RhY2sgJHdfbGlzdAoJCWFycmF5IHVuc2V0IGJyb3dzZXJfcGF0aCAkd19saXN0CgkJYXJyYXkgdW5zZXQgYnJvd3Nlcl9jb21taXQgJHdfbGlzdAoJCWFycmF5IHVuc2V0IGJyb3dzZXJfYnVzeSAkd19saXN0CgkiCgl3bSB0aXRsZSAkdGwgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6IEZpbGUgQnJvd3NlciIKCWxzX3RyZWUgJHdfbGlzdCAkYnJvd3Nlcl9jb21taXQoJHdfbGlzdCkge30KfQoKcHJvYyBicm93c2VyX21vdmUge2RpciB3fSB7CglnbG9iYWwgYnJvd3Nlcl9maWxlcyBicm93c2VyX2J1c3kKCglpZiB7JGJyb3dzZXJfYnVzeSgkdyl9IHJldHVybgoJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggaW5fc2VsLmZpcnN0XSAuXSAwXQoJaW5jciBsbm8gJGRpcgoJaWYge1tsaW5kZXggJGJyb3dzZXJfZmlsZXMoJHcpIFtleHByIHskbG5vIC0gMX1dXSBuZSB7fX0gewoJCSR3IHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCQkkdyB0YWcgYWRkIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJCSR3IHNlZSAkbG5vLjAKCX0KfQoKcHJvYyBicm93c2VyX3BhZ2Uge2RpciB3fSB7CglnbG9iYWwgYnJvd3Nlcl9maWxlcyBicm93c2VyX2J1c3kKCglpZiB7JGJyb3dzZXJfYnVzeSgkdyl9IHJldHVybgoJJHcgeXZpZXcgc2Nyb2xsICRkaXIgcGFnZXMKCXNldCBsbm8gW2V4cHIge2ludCgKCQkgIFtsaW5kZXggWyR3IHl2aWV3XSAwXQoJCSogW2xsZW5ndGggJGJyb3dzZXJfZmlsZXMoJHcpXQoJCSsgMSl9XQoJaWYge1tsaW5kZXggJGJyb3dzZXJfZmlsZXMoJHcpIFtleHByIHskbG5vIC0gMX1dXSBuZSB7fX0gewoJCSR3IHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCQkkdyB0YWcgYWRkIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJCSR3IHNlZSAkbG5vLjAKCX0KfQoKcHJvYyBicm93c2VyX3BhcmVudCB7d30gewoJZ2xvYmFsIGJyb3dzZXJfZmlsZXMgYnJvd3Nlcl9zdGF0dXMgYnJvd3Nlcl9wYXRoCglnbG9iYWwgYnJvd3Nlcl9zdGFjayBicm93c2VyX2J1c3kKCglpZiB7JGJyb3dzZXJfYnVzeSgkdyl9IHJldHVybgoJc2V0IGluZm8gW2xpbmRleCAkYnJvd3Nlcl9maWxlcygkdykgMF0KCWlmIHtbbGluZGV4ICRpbmZvIDBdIGVxIHtwYXJlbnR9fSB7CgkJc2V0IHBhcmVudCBbbGluZGV4ICRicm93c2VyX3N0YWNrKCR3KSBlbmQtMV0KCQlzZXQgYnJvd3Nlcl9zdGFjaygkdykgW2xyYW5nZSAkYnJvd3Nlcl9zdGFjaygkdykgMCBlbmQtMl0KCQlpZiB7JGJyb3dzZXJfc3RhY2soJHcpIGVxIHt9fSB7CgkJCXJlZ3N1YiB7Oi4qJH0gJGJyb3dzZXJfcGF0aCgkdykgezp9IGJyb3dzZXJfcGF0aCgkdykKCQl9IGVsc2UgewoJCQlyZWdzdWIgey9bXi9dKyR9ICRicm93c2VyX3BhdGgoJHcpIHt9IGJyb3dzZXJfcGF0aCgkdykKCQl9CgkJc2V0IGJyb3dzZXJfc3RhdHVzKCR3KSAiTG9hZGluZyAkYnJvd3Nlcl9wYXRoKCR3KS4uLiIKCQlsc190cmVlICR3IFtsaW5kZXggJHBhcmVudCAwXSBbbGluZGV4ICRwYXJlbnQgMV0KCX0KfQoKcHJvYyBicm93c2VyX2VudGVyIHt3fSB7CglnbG9iYWwgYnJvd3Nlcl9maWxlcyBicm93c2VyX3N0YXR1cyBicm93c2VyX3BhdGgKCWdsb2JhbCBicm93c2VyX2NvbW1pdCBicm93c2VyX3N0YWNrIGJyb3dzZXJfYnVzeQoKCWlmIHskYnJvd3Nlcl9idXN5KCR3KX0gcmV0dXJuCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBpbl9zZWwuZmlyc3RdIC5dIDBdCglzZXQgaW5mbyBbbGluZGV4ICRicm93c2VyX2ZpbGVzKCR3KSBbZXhwciB7JGxubyAtIDF9XV0KCWlmIHskaW5mbyBuZSB7fX0gewoJCXN3aXRjaCAtLSBbbGluZGV4ICRpbmZvIDBdIHsKCQlwYXJlbnQgewoJCQlicm93c2VyX3BhcmVudCAkdwoJCX0KCQl0cmVlIHsKCQkJc2V0IG5hbWUgW2xpbmRleCAkaW5mbyAyXQoJCQlzZXQgZXNjbiBbZXNjYXBlX3BhdGggJG5hbWVdCgkJCXNldCBicm93c2VyX3N0YXR1cygkdykgIkxvYWRpbmcgJGVzY24uLi4iCgkJCWFwcGVuZCBicm93c2VyX3BhdGgoJHcpICRlc2NuCgkJCWxzX3RyZWUgJHcgW2xpbmRleCAkaW5mbyAxXSAkbmFtZQoJCX0KCQlibG9iIHsKCQkJc2V0IG5hbWUgW2xpbmRleCAkaW5mbyAyXQoJCQlzZXQgcCB7fQoJCQlmb3JlYWNoIG4gJGJyb3dzZXJfc3RhY2soJHcpIHsKCQkJCWFwcGVuZCBwIFtsaW5kZXggJG4gMV0KCQkJfQoJCQlhcHBlbmQgcCAkbmFtZQoJCQlzaG93X2JsYW1lICRicm93c2VyX2NvbW1pdCgkdykgJHAKCQl9CgkJfQoJfQp9Cgpwcm9jIGJyb3dzZXJfY2xpY2sge3dhc19kb3VibGVfY2xpY2sgdyBwb3N9IHsKCWdsb2JhbCBicm93c2VyX2ZpbGVzIGJyb3dzZXJfYnVzeQoKCWlmIHskYnJvd3Nlcl9idXN5KCR3KX0gcmV0dXJuCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCAkcG9zXSAuXSAwXQoJZm9jdXMgJHcKCglpZiB7W2xpbmRleCAkYnJvd3Nlcl9maWxlcygkdykgW2V4cHIgeyRsbm8gLSAxfV1dIG5lIHt9fSB7CgkJJHcgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoJCSR3IHRhZyBhZGQgaW5fc2VsICRsbm8uMCBbZXhwciB7JGxubyArIDF9XS4wCgkJaWYgeyR3YXNfZG91YmxlX2NsaWNrfSB7CgkJCWJyb3dzZXJfZW50ZXIgJHcKCQl9Cgl9Cn0KCnByb2MgbHNfdHJlZSB7dyB0cmVlX2lkIG5hbWV9IHsKCWdsb2JhbCBicm93c2VyX2J1ZmZlciBicm93c2VyX2ZpbGVzIGJyb3dzZXJfc3RhY2sgYnJvd3Nlcl9idXN5CgoJc2V0IGJyb3dzZXJfYnVmZmVyKCR3KSB7fQoJc2V0IGJyb3dzZXJfZmlsZXMoJHcpIHt9CglzZXQgYnJvd3Nlcl9idXN5KCR3KSAxCgoJJHcgY29uZiAtc3RhdGUgbm9ybWFsCgkkdyB0YWcgcmVtb3ZlIGluX3NlbCAwLjAgZW5kCgkkdyBkZWxldGUgMC4wIGVuZAoJaWYgeyRicm93c2VyX3N0YWNrKCR3KSBuZSB7fX0gewoJCSR3IGltYWdlIGNyZWF0ZSBlbmQgXAoJCQktYWxpZ24gY2VudGVyIC1wYWR4IDUgLXBhZHkgMSBcCgkJCS1uYW1lIGljb24wIFwKCQkJLWltYWdlIGZpbGVfdXBsZXZlbAoJCSR3IGluc2VydCBlbmQge1tVcCBUbyBQYXJlbnRdfQoJCWxhcHBlbmQgYnJvd3Nlcl9maWxlcygkdykgcGFyZW50Cgl9CglsYXBwZW5kIGJyb3dzZXJfc3RhY2soJHcpIFtsaXN0ICR0cmVlX2lkICRuYW1lXQoJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglzZXQgY21kIFtsaXN0IGdpdCBscy10cmVlIC16ICR0cmVlX2lkXQoJc2V0IGZkIFtvcGVuICJ8ICRjbWQiIHJdCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKCWZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgcmVhZF9sc190cmVlICRmZCAkd10KfQoKcHJvYyByZWFkX2xzX3RyZWUge2ZkIHd9IHsKCWdsb2JhbCBicm93c2VyX2J1ZmZlciBicm93c2VyX2ZpbGVzIGJyb3dzZXJfc3RhdHVzIGJyb3dzZXJfYnVzeQoKCWlmIHshW3dpbmZvIGV4aXN0cyAkd119IHsKCQljYXRjaCB7Y2xvc2UgJGZkfQoJCXJldHVybgoJfQoKCWFwcGVuZCBicm93c2VyX2J1ZmZlcigkdykgW3JlYWQgJGZkXQoJc2V0IHBjayBbc3BsaXQgJGJyb3dzZXJfYnVmZmVyKCR3KSAiXDAiXQoJc2V0IGJyb3dzZXJfYnVmZmVyKCR3KSBbbGluZGV4ICRwY2sgZW5kXQoKCXNldCBuIFtsbGVuZ3RoICRicm93c2VyX2ZpbGVzKCR3KV0KCSR3IGNvbmYgLXN0YXRlIG5vcm1hbAoJZm9yZWFjaCBwIFtscmFuZ2UgJHBjayAwIGVuZC0xXSB7CgkJc2V0IGluZm8gW3NwbGl0ICRwICJcdCJdCgkJc2V0IHBhdGggW2xpbmRleCAkaW5mbyAxXQoJCXNldCBpbmZvIFtzcGxpdCBbbGluZGV4ICRpbmZvIDBdIHsgfV0KCQlzZXQgdHlwZSBbbGluZGV4ICRpbmZvIDFdCgkJc2V0IG9iamVjdCBbbGluZGV4ICRpbmZvIDJdCgoJCXN3aXRjaCAtLSAkdHlwZSB7CgkJYmxvYiB7CgkJCXNldCBpbWFnZSBmaWxlX21vZAoJCX0KCQl0cmVlIHsKCQkJc2V0IGltYWdlIGZpbGVfZGlyCgkJCWFwcGVuZCBwYXRoIC8KCQl9CgkJZGVmYXVsdCB7CgkJCXNldCBpbWFnZSBmaWxlX3F1ZXN0aW9uCgkJfQoJCX0KCgkJaWYgeyRuID4gMH0geyR3IGluc2VydCBlbmQgIlxuIn0KCQkkdyBpbWFnZSBjcmVhdGUgZW5kIFwKCQkJLWFsaWduIGNlbnRlciAtcGFkeCA1IC1wYWR5IDEgXAoJCQktbmFtZSBpY29uW2luY3Igbl0gXAoJCQktaW1hZ2UgJGltYWdlCgkJJHcgaW5zZXJ0IGVuZCBbZXNjYXBlX3BhdGggJHBhdGhdCgkJbGFwcGVuZCBicm93c2VyX2ZpbGVzKCR3KSBbbGlzdCAkdHlwZSAkb2JqZWN0ICRwYXRoXQoJfQoJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglpZiB7W2VvZiAkZmRdfSB7CgkJY2xvc2UgJGZkCgkJc2V0IGJyb3dzZXJfc3RhdHVzKCR3KSBSZWFkeS4KCQlzZXQgYnJvd3Nlcl9idXN5KCR3KSAwCgkJYXJyYXkgdW5zZXQgYnJvd3Nlcl9idWZmZXIgJHcKCQlpZiB7JG4gPiAwfSB7CgkJCSR3IHRhZyBhZGQgaW5fc2VsIDEuMCAyLjAKCQkJZm9jdXMgLWZvcmNlICR3CgkJfQoJfQp9Cgpwcm9jIHNob3dfYmxhbWUge2NvbW1pdCBwYXRofSB7CglnbG9iYWwgbmV4dF9icm93c2VyX2lkIGJsYW1lX3N0YXR1cyBibGFtZV9kYXRhCgoJaWYge1t3aW5mbyBpc21hcHBlZCAuXX0gewoJCXNldCB3IC5icm93c2VyW2luY3IgbmV4dF9icm93c2VyX2lkXQoJCXNldCB0bCAkdwoJCXRvcGxldmVsICR3Cgl9IGVsc2UgewoJCXNldCB3IHt9CgkJc2V0IHRsIC4KCX0KCXNldCBibGFtZV9zdGF0dXMoJHcpIHtMb2FkaW5nIGN1cnJlbnQgZmlsZSBjb250ZW50Li4ufQoKCWxhYmVsICR3LnBhdGggLXRleHQgIiRjb21taXQ6JHBhdGgiIFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLWZvbnQgZm9udF91aWJvbGQKCXBhY2sgJHcucGF0aCAtc2lkZSB0b3AgLWZpbGwgeAoKCWZyYW1lICR3Lm91dAoJdGV4dCAkdy5vdXQubG9hZGVkX3QgXAoJCS1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCQktc3RhdGUgZGlzYWJsZWQgXAoJCS13cmFwIG5vbmUgXAoJCS1oZWlnaHQgNDAgXAoJCS13aWR0aCAxIFwKCQktZm9udCBmb250X2RpZmYKCSR3Lm91dC5sb2FkZWRfdCB0YWcgY29uZiBhbm5vdGF0ZWQgLWJhY2tncm91bmQgZ3JleQoKCXRleHQgJHcub3V0LmxpbmVudW1iZXJfdCBcCgkJLWJhY2tncm91bmQgd2hpdGUgLWJvcmRlcndpZHRoIDAgXAoJCS1zdGF0ZSBkaXNhYmxlZCBcCgkJLXdyYXAgbm9uZSBcCgkJLWhlaWdodCA0MCBcCgkJLXdpZHRoIDUgXAoJCS1mb250IGZvbnRfZGlmZgoJJHcub3V0LmxpbmVudW1iZXJfdCB0YWcgY29uZiBsaW5lbnVtYmVyIC1qdXN0aWZ5IHJpZ2h0CgoJdGV4dCAkdy5vdXQuZmlsZV90IFwKCQktYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgkJLXN0YXRlIGRpc2FibGVkIFwKCQktd3JhcCBub25lIFwKCQktaGVpZ2h0IDQwIFwKCQktd2lkdGggODAgXAoJCS14c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5vdXQuc2J4IHNldF0gXAoJCS1mb250IGZvbnRfZGlmZgoKCXNjcm9sbGJhciAkdy5vdXQuc2J4IC1vcmllbnQgaCAtY29tbWFuZCBbbGlzdCAkdy5vdXQuZmlsZV90IHh2aWV3XQoJc2Nyb2xsYmFyICR3Lm91dC5zYnkgLW9yaWVudCB2IFwKCQktY29tbWFuZCBbbGlzdCBzY3JvbGxiYXIybWFueSBbbGlzdCBcCgkJJHcub3V0LmxvYWRlZF90IFwKCQkkdy5vdXQubGluZW51bWJlcl90IFwKCQkkdy5vdXQuZmlsZV90IFwKCQldIHl2aWV3XQoJZ3JpZCBcCgkJJHcub3V0LmxpbmVudW1iZXJfdCBcCgkJJHcub3V0LmxvYWRlZF90IFwKCQkkdy5vdXQuZmlsZV90IFwKCQkkdy5vdXQuc2J5IFwKCQktc3RpY2t5IG5zZXcKCWdyaWQgY29uZiAkdy5vdXQuc2J4IC1jb2x1bW4gMiAtc3RpY2t5IHdlCglncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy5vdXQgMiAtd2VpZ2h0IDEKCWdyaWQgcm93Y29uZmlndXJlICR3Lm91dCAwIC13ZWlnaHQgMQoJcGFjayAkdy5vdXQgLWZpbGwgYm90aCAtZXhwYW5kIDEKCglsYWJlbCAkdy5zdGF0dXMgLXRleHR2YXJpYWJsZSBibGFtZV9zdGF0dXMoJHcpIFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLWZvbnQgZm9udF91aQoJcGFjayAkdy5zdGF0dXMgLXNpZGUgYm90dG9tIC1maWxsIHgKCglmcmFtZSAkdy5jbQoJdGV4dCAkdy5jbS50IFwKCQktYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgkJLXN0YXRlIGRpc2FibGVkIFwKCQktd3JhcCBub25lIFwKCQktaGVpZ2h0IDEwIFwKCQktd2lkdGggODAgXAoJCS14c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5jbS5zYnggc2V0XSBcCgkJLXlzY3JvbGxjb21tYW5kIFtsaXN0ICR3LmNtLnNieSBzZXRdIFwKCQktZm9udCBmb250X2RpZmYKCXNjcm9sbGJhciAkdy5jbS5zYnggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR3LmNtLnQgeHZpZXddCglzY3JvbGxiYXIgJHcuY20uc2J5IC1vcmllbnQgdiAtY29tbWFuZCBbbGlzdCAkdy5jbS50IHl2aWV3XQoJcGFjayAkdy5jbS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5jbS5zYnggLXNpZGUgYm90dG9tIC1maWxsIHgKCXBhY2sgJHcuY20udCAtZXhwYW5kIDEgLWZpbGwgYm90aAoJcGFjayAkdy5jbSAtc2lkZSBib3R0b20gLWZpbGwgeAoKCW1lbnUgJHcuY3R4bSAtdGVhcm9mZiAwCgkkdy5jdHhtIGFkZCBjb21tYW5kIC1sYWJlbCAiQ29weSBDb21taXQiIFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCAiYmxhbWVfY29weWNvbW1pdCAkdyBcJGN1cnNvclcgQFwkY3Vyc29yWCxcJGN1cnNvclkiCgoJZm9yZWFjaCBpIFtsaXN0IFwKCQkkdy5vdXQubG9hZGVkX3QgXAoJCSR3Lm91dC5saW5lbnVtYmVyX3QgXAoJCSR3Lm91dC5maWxlX3RdIHsKCQkkaSB0YWcgY29uZiBpbl9zZWwgXAoJCQktYmFja2dyb3VuZCBbJGkgY2dldCAtZm9yZWdyb3VuZF0gXAoJCQktZm9yZWdyb3VuZCBbJGkgY2dldCAtYmFja2dyb3VuZF0KCQkkaSBjb25mIC15c2Nyb2xsY29tbWFuZCBcCgkJCVtsaXN0IG1hbnkyc2Nyb2xsYmFyIFtsaXN0IFwKCQkJJHcub3V0LmxvYWRlZF90IFwKCQkJJHcub3V0LmxpbmVudW1iZXJfdCBcCgkJCSR3Lm91dC5maWxlX3QgXAoJCQldIHl2aWV3ICR3Lm91dC5zYnldCgkJYmluZCAkaSA8QnV0dG9uLTE+ICIKCQkJYmxhbWVfY2xpY2sgeyR3fSBcXAoJCQkJJHcuY20udCBcXAoJCQkJJHcub3V0LmxpbmVudW1iZXJfdCBcXAoJCQkJJHcub3V0LmZpbGVfdCBcXAoJCQkJJGkgQCV4LCV5CgkJCWZvY3VzICRpCgkJIgoJCWJpbmRfYnV0dG9uMyAkaSAiCgkJCXNldCBjdXJzb3JYICV4CgkJCXNldCBjdXJzb3JZICV5CgkJCXNldCBjdXJzb3JXICVXCgkJCXRrX3BvcHVwICR3LmN0eG0gJVggJVkKCQkiCgl9CgoJYmluZCAkdy5jbS50IDxCdXR0b24tMT4gImZvY3VzICR3LmNtLnQiCgliaW5kICR0bCA8VmlzaWJpbGl0eT4gImZvY3VzICR0bCIKCWJpbmQgJHRsIDxEZXN0cm95PiAiCgkJYXJyYXkgdW5zZXQgYmxhbWVfc3RhdHVzIHskd30KCQlhcnJheSB1bnNldCBibGFtZV9kYXRhICR3LCoKCSIKCXdtIHRpdGxlICR0bCAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogRmlsZSBWaWV3ZXIiCgoJc2V0IGJsYW1lX2RhdGEoJHcsY29tbWl0X2NvdW50KSAwCglzZXQgYmxhbWVfZGF0YSgkdyxjb21taXRfbGlzdCkge30KCXNldCBibGFtZV9kYXRhKCR3LHRvdGFsX2xpbmVzKSAwCglzZXQgYmxhbWVfZGF0YSgkdyxibGFtZV9saW5lcykgMAoJc2V0IGJsYW1lX2RhdGEoJHcsaGlnaGxpZ2h0X2NvbW1pdCkge30KCXNldCBibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKSAtMQoKCXNldCBjbWQgW2xpc3QgZ2l0IGNhdC1maWxlIGJsb2IgIiRjb21taXQ6JHBhdGgiXQoJc2V0IGZkIFtvcGVuICJ8ICRjbWQiIHJdCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYgLWVuY29kaW5nIGJpbmFyeQoJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCByZWFkX2JsYW1lX2NhdGZpbGUgXAoJCSRmZCAkdyAkY29tbWl0ICRwYXRoIFwKCQkkdy5jbS50ICR3Lm91dC5sb2FkZWRfdCAkdy5vdXQubGluZW51bWJlcl90ICR3Lm91dC5maWxlX3RdCn0KCnByb2MgcmVhZF9ibGFtZV9jYXRmaWxlIHtmZCB3IGNvbW1pdCBwYXRoIHdfY21pdCB3X2xvYWQgd19saW5lIHdfZmlsZX0gewoJZ2xvYmFsIGJsYW1lX3N0YXR1cyBibGFtZV9kYXRhCgoJaWYgeyFbd2luZm8gZXhpc3RzICR3X2ZpbGVdfSB7CgkJY2F0Y2gge2Nsb3NlICRmZH0KCQlyZXR1cm4KCX0KCglzZXQgbiAkYmxhbWVfZGF0YSgkdyx0b3RhbF9saW5lcykKCSR3X2xvYWQgY29uZiAtc3RhdGUgbm9ybWFsCgkkd19saW5lIGNvbmYgLXN0YXRlIG5vcm1hbAoJJHdfZmlsZSBjb25mIC1zdGF0ZSBub3JtYWwKCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPj0gMH0gewoJCXJlZ3N1YiAiXHJcJCIgJGxpbmUge30gbGluZQoJCWluY3IgbgoJCSR3X2xvYWQgaW5zZXJ0IGVuZCAiXG4iCgkJJHdfbGluZSBpbnNlcnQgZW5kICIkblxuIiBsaW5lbnVtYmVyCgkJJHdfZmlsZSBpbnNlcnQgZW5kICIkbGluZVxuIgoJfQoJJHdfbG9hZCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJJHdfbGluZSBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJJHdfZmlsZSBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJc2V0IGJsYW1lX2RhdGEoJHcsdG90YWxfbGluZXMpICRuCgoJaWYge1tlb2YgJGZkXX0gewoJCWNsb3NlICRmZAoJCWJsYW1lX2luY3JlbWVudGFsX3N0YXR1cyAkdwoJCXNldCBjbWQgW2xpc3QgZ2l0IGJsYW1lIC1NIC1DIC0taW5jcmVtZW50YWxdCgkJbGFwcGVuZCBjbWQgJGNvbW1pdCAtLSAkcGF0aAoJCXNldCBmZCBbb3BlbiAifCAkY21kIiByXQoJCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBsZiAtZW5jb2RpbmcgYmluYXJ5CgkJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCByZWFkX2JsYW1lX2luY3JlbWVudGFsICRmZCAkdyBcCgkJCSR3X2xvYWQgJHdfY21pdCAkd19saW5lICR3X2ZpbGVdCgl9Cn0KCnByb2MgcmVhZF9ibGFtZV9pbmNyZW1lbnRhbCB7ZmQgdyB3X2xvYWQgd19jbWl0IHdfbGluZSB3X2ZpbGV9IHsKCWdsb2JhbCBibGFtZV9zdGF0dXMgYmxhbWVfZGF0YQoKCWlmIHshW3dpbmZvIGV4aXN0cyAkd19maWxlXX0gewoJCWNhdGNoIHtjbG9zZSAkZmR9CgkJcmV0dXJuCgl9CgoJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CgkJaWYge1tyZWdleHAge14oW2EtejAtOV17NDB9KSAoXGQrKSAoXGQrKSAoXGQrKSR9ICRsaW5lIGxpbmUgXAoJCQljbWl0IG9yaWdpbmFsX2xpbmUgZmluYWxfbGluZSBsaW5lX2NvdW50XX0gewoJCQlzZXQgYmxhbWVfZGF0YSgkdyxjb21taXQpICRjbWl0CgkJCXNldCBibGFtZV9kYXRhKCR3LG9yaWdpbmFsX2xpbmUpICRvcmlnaW5hbF9saW5lCgkJCXNldCBibGFtZV9kYXRhKCR3LGZpbmFsX2xpbmUpICRmaW5hbF9saW5lCgkJCXNldCBibGFtZV9kYXRhKCR3LGxpbmVfY291bnQpICRsaW5lX2NvdW50CgoJCQlpZiB7W2NhdGNoIHtzZXQgZyAkYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcil9XX0gewoJCQkJJHdfbGluZSB0YWcgY29uZiBnJGNtaXQKCQkJCSR3X2ZpbGUgdGFnIGNvbmYgZyRjbWl0CgkJCQkkd19saW5lIHRhZyByYWlzZSBpbl9zZWwKCQkJCSR3X2ZpbGUgdGFnIHJhaXNlIGluX3NlbAoJCQkJJHdfZmlsZSB0YWcgcmFpc2Ugc2VsCgkJCQlzZXQgYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcikgJGJsYW1lX2RhdGEoJHcsY29tbWl0X2NvdW50KQoJCQkJaW5jciBibGFtZV9kYXRhKCR3LGNvbW1pdF9jb3VudCkKCQkJCWxhcHBlbmQgYmxhbWVfZGF0YSgkdyxjb21taXRfbGlzdCkgJGNtaXQKCQkJfQoJCX0gZWxzZWlmIHtbc3RyaW5nIG1hdGNoIHtmaWxlbmFtZSAqfSAkbGluZV19IHsKCQkJc2V0IGZpbGUgW3N0cmluZyByYW5nZSAkbGluZSA5IGVuZF0KCQkJc2V0IG4gJGJsYW1lX2RhdGEoJHcsbGluZV9jb3VudCkKCQkJc2V0IGxubyAkYmxhbWVfZGF0YSgkdyxmaW5hbF9saW5lKQoJCQlzZXQgY21pdCAkYmxhbWVfZGF0YSgkdyxjb21taXQpCgoJCQl3aGlsZSB7JG4gPiAwfSB7CgkJCQlpZiB7W2NhdGNoIHtzZXQgZyBnJGJsYW1lX2RhdGEoJHcsbGluZSRsbm8sY29tbWl0KX1dfSB7CgkJCQkJJHdfbG9hZCB0YWcgYWRkIGFubm90YXRlZCAkbG5vLjAgIiRsbm8uMCBsaW5lZW5kICsgMWMiCgkJCQl9IGVsc2UgewoJCQkJCSR3X2xpbmUgdGFnIHJlbW92ZSBnJGcgJGxuby4wICIkbG5vLjAgbGluZWVuZCArIDFjIgoJCQkJCSR3X2ZpbGUgdGFnIHJlbW92ZSBnJGcgJGxuby4wICIkbG5vLjAgbGluZWVuZCArIDFjIgoJCQkJfQoKCQkJCXNldCBibGFtZV9kYXRhKCR3LGxpbmUkbG5vLGNvbW1pdCkgJGNtaXQKCQkJCXNldCBibGFtZV9kYXRhKCR3LGxpbmUkbG5vLGZpbGUpICRmaWxlCgkJCQkkd19saW5lIHRhZyBhZGQgZyRjbWl0ICRsbm8uMCAiJGxuby4wIGxpbmVlbmQgKyAxYyIKCQkJCSR3X2ZpbGUgdGFnIGFkZCBnJGNtaXQgJGxuby4wICIkbG5vLjAgbGluZWVuZCArIDFjIgoKCQkJCWlmIHskYmxhbWVfZGF0YSgkdyxoaWdobGlnaHRfbGluZSkgPT0gLTF9IHsKCQkJCQlpZiB7W2xpbmRleCBbJHdfZmlsZSB5dmlld10gMF0gPT0gMH0gewoJCQkJCQkkd19maWxlIHNlZSAkbG5vLjAKCQkJCQkJYmxhbWVfc2hvd2NvbW1pdCAkdyAkd19jbWl0ICR3X2xpbmUgJHdfZmlsZSAkbG5vCgkJCQkJfQoJCQkJfSBlbHNlaWYgeyRibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKSA9PSAkbG5vfSB7CgkJCQkJYmxhbWVfc2hvd2NvbW1pdCAkdyAkd19jbWl0ICR3X2xpbmUgJHdfZmlsZSAkbG5vCgkJCQl9CgoJCQkJaW5jciBuIC0xCgkJCQlpbmNyIGxubwoJCQkJaW5jciBibGFtZV9kYXRhKCR3LGJsYW1lX2xpbmVzKQoJCQl9CgoJCQlzZXQgaGMgJGJsYW1lX2RhdGEoJHcsaGlnaGxpZ2h0X2NvbW1pdCkKCQkJaWYgeyRoYyBuZSB7fQoJCQkJJiYgW2V4cHIgeyRibGFtZV9kYXRhKCR3LCRoYyxvcmRlcikgKyAxfV0KCQkJCQk9PSAkYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcil9IHsKCQkJCWJsYW1lX3Nob3djb21taXQgJHcgJHdfY21pdCAkd19saW5lICR3X2ZpbGUgXAoJCQkJCSRibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKQoJCQl9CgkJfSBlbHNlaWYge1tyZWdleHAge14oW2Etei1dKykgKC4qKSR9ICRsaW5lIGxpbmUgaGVhZGVyIGRhdGFdfSB7CgkJCXNldCBibGFtZV9kYXRhKCR3LCRibGFtZV9kYXRhKCR3LGNvbW1pdCksJGhlYWRlcikgJGRhdGEKCQl9Cgl9CgoJaWYge1tlb2YgJGZkXX0gewoJCWNsb3NlICRmZAoJCXNldCBibGFtZV9zdGF0dXMoJHcpIHtBbm5vdGF0aW9uIGNvbXBsZXRlLn0KCX0gZWxzZSB7CgkJYmxhbWVfaW5jcmVtZW50YWxfc3RhdHVzICR3Cgl9Cn0KCnByb2MgYmxhbWVfaW5jcmVtZW50YWxfc3RhdHVzIHt3fSB7CglnbG9iYWwgYmxhbWVfc3RhdHVzIGJsYW1lX2RhdGEKCglzZXQgaGF2ZSAgJGJsYW1lX2RhdGEoJHcsYmxhbWVfbGluZXMpCglzZXQgdG90YWwgJGJsYW1lX2RhdGEoJHcsdG90YWxfbGluZXMpCglzZXQgcGRvbmUgMAoJaWYgeyR0b3RhbH0ge3NldCBwZG9uZSBbZXhwciB7MTAwICogJGhhdmUgLyAkdG90YWx9XX0KCglzZXQgYmxhbWVfc3RhdHVzKCR3KSBbZm9ybWF0IFwKCQkiTG9hZGluZyBhbm5vdGF0aW9ucy4uLiAlaSBvZiAlaSBsaW5lcyBhbm5vdGF0ZWQgKCUyaSUlKSIgXAoJCSRoYXZlICR0b3RhbCAkcGRvbmVdCn0KCnByb2MgYmxhbWVfY2xpY2sge3cgd19jbWl0IHdfbGluZSB3X2ZpbGUgY3VyX3cgcG9zfSB7CglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskY3VyX3cgaW5kZXggJHBvc10gLl0gMF0KCWlmIHskbG5vIGVxIHt9fSByZXR1cm4KCgkkd19saW5lIHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCSR3X2ZpbGUgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoJJHdfbGluZSB0YWcgYWRkIGluX3NlbCAkbG5vLjAgIiRsbm8uMCArIDEgbGluZSIKCSR3X2ZpbGUgdGFnIGFkZCBpbl9zZWwgJGxuby4wICIkbG5vLjAgKyAxIGxpbmUiCgoJYmxhbWVfc2hvd2NvbW1pdCAkdyAkd19jbWl0ICR3X2xpbmUgJHdfZmlsZSAkbG5vCn0KCnNldCBibGFtZV9jb2xvcnMgewoJI2ZmNDA0MAoJI2ZmNDBmZgoJIzQwNDBmZgp9Cgpwcm9jIGJsYW1lX3Nob3djb21taXQge3cgd19jbWl0IHdfbGluZSB3X2ZpbGUgbG5vfSB7CglnbG9iYWwgYmxhbWVfY29sb3JzIGJsYW1lX2RhdGEgcmVwb19jb25maWcKCglzZXQgY21pdCAkYmxhbWVfZGF0YSgkdyxoaWdobGlnaHRfY29tbWl0KQoJaWYgeyRjbWl0IG5lIHt9fSB7CgkJc2V0IGlkeCAkYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcikKCQlzZXQgaSAwCgkJZm9yZWFjaCBjICRibGFtZV9jb2xvcnMgewoJCQlzZXQgaCBbbGluZGV4ICRibGFtZV9kYXRhKCR3LGNvbW1pdF9saXN0KSBbZXhwciB7JGlkeCAtIDEgKyAkaX1dXQoJCQkkd19saW5lIHRhZyBjb25mIGckaCAtYmFja2dyb3VuZCB3aGl0ZQoJCQkkd19maWxlIHRhZyBjb25mIGckaCAtYmFja2dyb3VuZCB3aGl0ZQoJCQlpbmNyIGkKCQl9Cgl9CgoJJHdfY21pdCBjb25mIC1zdGF0ZSBub3JtYWwKCSR3X2NtaXQgZGVsZXRlIDAuMCBlbmQKCWlmIHtbY2F0Y2gge3NldCBjbWl0ICRibGFtZV9kYXRhKCR3LGxpbmUkbG5vLGNvbW1pdCl9XX0gewoJCXNldCBjbWl0IHt9CgkJJHdfY21pdCBpbnNlcnQgZW5kICJMb2FkaW5nIGFubm90YXRpb24uLi4iCgl9IGVsc2UgewoJCXNldCBpZHggJGJsYW1lX2RhdGEoJHcsJGNtaXQsb3JkZXIpCgkJc2V0IGkgMAoJCWZvcmVhY2ggYyAkYmxhbWVfY29sb3JzIHsKCQkJc2V0IGggW2xpbmRleCAkYmxhbWVfZGF0YSgkdyxjb21taXRfbGlzdCkgW2V4cHIgeyRpZHggLSAxICsgJGl9XV0KCQkJJHdfbGluZSB0YWcgY29uZiBnJGggLWJhY2tncm91bmQgJGMKCQkJJHdfZmlsZSB0YWcgY29uZiBnJGggLWJhY2tncm91bmQgJGMKCQkJaW5jciBpCgkJfQoKCQlpZiB7W2NhdGNoIHtzZXQgbXNnICRibGFtZV9kYXRhKCR3LCRjbWl0LG1lc3NhZ2UpfV19IHsKCQkJc2V0IG1zZyB7fQoJCQljYXRjaCB7CgkJCQlzZXQgZmQgW29wZW4gInwgZ2l0IGNhdC1maWxlIGNvbW1pdCAkY21pdCIgcl0KCQkJCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyBiaW5hcnkgLXRyYW5zbGF0aW9uIGxmCgkJCQlpZiB7W2NhdGNoIHtzZXQgZW5jICRyZXBvX2NvbmZpZyhpMThuLmNvbW1pdGVuY29kaW5nKX1dfSB7CgkJCQkJc2V0IGVuYyB1dGYtOAoJCQkJfQoJCQkJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+IDB9IHsKCQkJCQlpZiB7W3N0cmluZyBtYXRjaCB7ZW5jb2RpbmcgKn0gJGxpbmVdfSB7CgkJCQkJCXNldCBlbmMgW3N0cmluZyB0b2xvd2VyIFtzdHJpbmcgcmFuZ2UgJGxpbmUgOSBlbmRdXQoJCQkJCX0KCQkJCX0KCQkJCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyAkZW5jCgkJCQlzZXQgbXNnIFtzdHJpbmcgdHJpbSBbcmVhZCAkZmRdXQoJCQkJY2xvc2UgJGZkCgkJCX0KCQkJc2V0IGJsYW1lX2RhdGEoJHcsJGNtaXQsbWVzc2FnZSkgJG1zZwoJCX0KCgkJc2V0IGF1dGhvcl9uYW1lIHt9CgkJc2V0IGF1dGhvcl9lbWFpbCB7fQoJCXNldCBhdXRob3JfdGltZSB7fQoJCWNhdGNoIHtzZXQgYXV0aG9yX25hbWUgJGJsYW1lX2RhdGEoJHcsJGNtaXQsYXV0aG9yKX0KCQljYXRjaCB7c2V0IGF1dGhvcl9lbWFpbCAkYmxhbWVfZGF0YSgkdywkY21pdCxhdXRob3ItbWFpbCl9CgkJY2F0Y2gge3NldCBhdXRob3JfdGltZSBbY2xvY2sgZm9ybWF0ICRibGFtZV9kYXRhKCR3LCRjbWl0LGF1dGhvci10aW1lKV19CgoJCXNldCBjb21taXR0ZXJfbmFtZSB7fQoJCXNldCBjb21taXR0ZXJfZW1haWwge30KCQlzZXQgY29tbWl0dGVyX3RpbWUge30KCQljYXRjaCB7c2V0IGNvbW1pdHRlcl9uYW1lICRibGFtZV9kYXRhKCR3LCRjbWl0LGNvbW1pdHRlcil9CgkJY2F0Y2gge3NldCBjb21taXR0ZXJfZW1haWwgJGJsYW1lX2RhdGEoJHcsJGNtaXQsY29tbWl0dGVyLW1haWwpfQoJCWNhdGNoIHtzZXQgY29tbWl0dGVyX3RpbWUgW2Nsb2NrIGZvcm1hdCAkYmxhbWVfZGF0YSgkdywkY21pdCxjb21taXR0ZXItdGltZSldfQoKCQkkd19jbWl0IGluc2VydCBlbmQgImNvbW1pdCAkY21pdFxuIgoJCSR3X2NtaXQgaW5zZXJ0IGVuZCAiQXV0aG9yOiAkYXV0aG9yX25hbWUgJGF1dGhvcl9lbWFpbCAkYXV0aG9yX3RpbWVcbiIKCQkkd19jbWl0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogJGNvbW1pdHRlcl9uYW1lICRjb21taXR0ZXJfZW1haWwgJGNvbW1pdHRlcl90aW1lXG4iCgkJJHdfY21pdCBpbnNlcnQgZW5kICJPcmlnaW5hbCBGaWxlOiBbZXNjYXBlX3BhdGggJGJsYW1lX2RhdGEoJHcsbGluZSRsbm8sZmlsZSldXG4iCgkJJHdfY21pdCBpbnNlcnQgZW5kICJcbiIKCQkkd19jbWl0IGluc2VydCBlbmQgJG1zZwoJfQoJJHdfY21pdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoKCXNldCBibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKSAkbG5vCglzZXQgYmxhbWVfZGF0YSgkdyxoaWdobGlnaHRfY29tbWl0KSAkY21pdAp9Cgpwcm9jIGJsYW1lX2NvcHljb21taXQge3cgaSBwb3N9IHsKCWdsb2JhbCBibGFtZV9kYXRhCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskaSBpbmRleCAkcG9zXSAuXSAwXQoJaWYgeyFbY2F0Y2gge3NldCBjb21taXQgJGJsYW1lX2RhdGEoJHcsbGluZSRsbm8sY29tbWl0KX1dfSB7CgkJY2xpcGJvYXJkIGNsZWFyCgkJY2xpcGJvYXJkIGFwcGVuZCBcCgkJCS1mb3JtYXQgU1RSSU5HIFwKCQkJLXR5cGUgU1RSSU5HIFwKCQkJLS0gJGNvbW1pdAoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGljb25zCgpzZXQgZmlsZW1hc2sgewojZGVmaW5lIG1hc2tfd2lkdGggMTQKI2RlZmluZSBtYXNrX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBtYXNrX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwKICAgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwKICAgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZn07Cn0KCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9wbGFpbiAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCBibGFjayAtZGF0YSB7CiNkZWZpbmUgcGxhaW5fd2lkdGggMTQKI2RlZmluZSBwbGFpbl9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgcGxhaW5fYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDAzLCAweDAyLCAweDA1LCAweDAyLCAweDA5LCAweDAyLCAweDFmLCAweDAyLCAweDEwLAogICAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLAogICAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfbW9kIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgewojZGVmaW5lIG1vZF93aWR0aCAxNAojZGVmaW5lIG1vZF9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgbW9kX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHg3YSwgMHgwNSwgMHgwMiwgMHgwOSwgMHg3YSwgMHgxZiwgMHgwMiwgMHgxMCwKICAgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwKICAgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX2Z1bGx0aWNrIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kICIjMDA3MDAwIiAtZGF0YSB7CiNkZWZpbmUgZmlsZV9mdWxsdGlja193aWR0aCAxNAojZGVmaW5lIGZpbGVfZnVsbHRpY2tfaGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIGZpbGVfZnVsbHRpY2tfYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDFhLCAweDAyLCAweDBjLCAweDAyLCAweDBjLCAweDAyLCAweDE2LCAweDAyLCAweDE2LAogICAweDAyLCAweDEzLCAweDAwLCAweDEzLCAweDg2LCAweDExLCAweDhjLCAweDExLCAweGQ4LCAweDEwLCAweGYyLCAweDEwLAogICAweDYyLCAweDEwLCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfcGFydHRpY2sgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgIiMwMDUwNTAiIC1kYXRhIHsKI2RlZmluZSBwYXJ0dGlja193aWR0aCAxNAojZGVmaW5lIHBhcnR0aWNrX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBwYXJ0dGlja19iaXRzW10gPSB7CiAgIDB4ZmUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4N2EsIDB4MDUsIDB4MDIsIDB4MDksIDB4N2EsIDB4MWYsIDB4MDIsIDB4MTAsCiAgIDB4N2EsIDB4MTQsIDB4MDIsIDB4MTYsIDB4MDIsIDB4MTMsIDB4OGEsIDB4MTEsIDB4ZGEsIDB4MTAsIDB4NzIsIDB4MTAsCiAgIDB4MjIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9Owp9IC1tYXNrZGF0YSAkZmlsZW1hc2sKCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9xdWVzdGlvbiAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCBibGFjayAtZGF0YSB7CiNkZWZpbmUgZmlsZV9xdWVzdGlvbl93aWR0aCAxNAojZGVmaW5lIGZpbGVfcXVlc3Rpb25faGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIGZpbGVfcXVlc3Rpb25fYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDAyLCAweGUyLCAweDA0LCAweGYyLCAweDA5LCAweDFhLCAweDFiLCAweDBhLCAweDEzLAogICAweDgyLCAweDExLCAweGMyLCAweDEwLCAweDYyLCAweDEwLCAweDYyLCAweDEwLCAweDAyLCAweDEwLCAweDYyLCAweDEwLAogICAweDYyLCAweDEwLCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfcmVtb3ZlZCAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCByZWQgLWRhdGEgewojZGVmaW5lIGZpbGVfcmVtb3ZlZF93aWR0aCAxNAojZGVmaW5lIGZpbGVfcmVtb3ZlZF9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlsZV9yZW1vdmVkX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMiwgMHgwNSwgMHgwMiwgMHgwOSwgMHgwMiwgMHgxZiwgMHgwMiwgMHgxMCwKICAgMHgxYSwgMHgxNiwgMHgzMiwgMHgxMywgMHhlMiwgMHgxMSwgMHhjMiwgMHgxMCwgMHhlMiwgMHgxMSwgMHgzMiwgMHgxMywKICAgMHgxYSwgMHgxNiwgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX21lcmdlIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgewojZGVmaW5lIGZpbGVfbWVyZ2Vfd2lkdGggMTQKI2RlZmluZSBmaWxlX21lcmdlX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBmaWxlX21lcmdlX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHg2MiwgMHgwNSwgMHg2MiwgMHgwOSwgMHg2MiwgMHgxZiwgMHg2MiwgMHgxMCwKICAgMHhmYSwgMHgxMSwgMHhmMiwgMHgxMCwgMHg2MiwgMHgxMCwgMHgwMiwgMHgxMCwgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwKICAgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKc2V0IGZpbGVfZGlyX2RhdGEgewojZGVmaW5lIGZpbGVfd2lkdGggMTgKI2RlZmluZSBmaWxlX2hlaWdodCAxOApzdGF0aWMgdW5zaWduZWQgY2hhciBmaWxlX2JpdHNbXSA9IHsKICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY4LCAweDAzLCAweDAwLAogIDB4MGMsIDB4MDMsIDB4MDAsIDB4MDQsIDB4ZmUsIDB4MDAsIDB4MDYsIDB4ODAsIDB4MDAsIDB4ZmYsIDB4OWYsIDB4MDAsCiAgMHgwMywgMHg5OCwgMHgwMCwgMHgwMiwgMHg5MCwgMHgwMCwgMHgwNiwgMHhiMCwgMHgwMCwgMHgwNCwgMHhhMCwgMHgwMCwKICAweDBjLCAweGUwLCAweDAwLCAweDA4LCAweGMwLCAweDAwLCAweGY4LCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Owp9CmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9kaXIgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgYmx1ZSBcCgktZGF0YSAkZmlsZV9kaXJfZGF0YSAtbWFza2RhdGEgJGZpbGVfZGlyX2RhdGEKdW5zZXQgZmlsZV9kaXJfZGF0YQoKc2V0IGZpbGVfdXBsZXZlbF9kYXRhIHsKI2RlZmluZSB1cF93aWR0aCAxNQojZGVmaW5lIHVwX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciB1cF9iaXRzW10gPSB7CiAgMHg4MCwgMHgwMCwgMHhjMCwgMHgwMSwgMHhlMCwgMHgwMywgMHhmMCwgMHgwNywgMHhmOCwgMHgwZiwgMHhmYywgMHgxZiwKICAweGZlLCAweDNmLCAweGMwLCAweDAxLCAweGMwLCAweDAxLCAweGMwLCAweDAxLCAweGMwLCAweDAxLCAweGMwLCAweDAxLAogIDB4YzAsIDB4MDEsIDB4YzAsIDB4MDEsIDB4MDAsIDB4MDB9Owp9CmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV91cGxldmVsIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIHJlZCBcCgktZGF0YSAkZmlsZV91cGxldmVsX2RhdGEgLW1hc2tkYXRhICRmaWxlX3VwbGV2ZWxfZGF0YQp1bnNldCBmaWxlX3VwbGV2ZWxfZGF0YQoKc2V0IHVpX2luZGV4IC52cGFuZS5maWxlcy5pbmRleC5saXN0CnNldCB1aV93b3JrZGlyIC52cGFuZS5maWxlcy53b3JrZGlyLmxpc3QKCnNldCBhbGxfaWNvbnMoXyR1aV9pbmRleCkgICBmaWxlX3BsYWluCnNldCBhbGxfaWNvbnMoQSR1aV9pbmRleCkgICBmaWxlX2Z1bGx0aWNrCnNldCBhbGxfaWNvbnMoTSR1aV9pbmRleCkgICBmaWxlX2Z1bGx0aWNrCnNldCBhbGxfaWNvbnMoRCR1aV9pbmRleCkgICBmaWxlX3JlbW92ZWQKc2V0IGFsbF9pY29ucyhVJHVpX2luZGV4KSAgIGZpbGVfbWVyZ2UKCnNldCBhbGxfaWNvbnMoXyR1aV93b3JrZGlyKSBmaWxlX3BsYWluCnNldCBhbGxfaWNvbnMoTSR1aV93b3JrZGlyKSBmaWxlX21vZApzZXQgYWxsX2ljb25zKEQkdWlfd29ya2RpcikgZmlsZV9xdWVzdGlvbgpzZXQgYWxsX2ljb25zKFUkdWlfd29ya2RpcikgZmlsZV9tZXJnZQpzZXQgYWxsX2ljb25zKE8kdWlfd29ya2RpcikgZmlsZV9wbGFpbgoKc2V0IG1heF9zdGF0dXNfZGVzYyAwCmZvcmVhY2ggaSB7CgkJe19fICJVbm1vZGlmaWVkIn0KCgkJe19NICJNb2RpZmllZCwgbm90IHN0YWdlZCJ9CgkJe01fICJTdGFnZWQgZm9yIGNvbW1pdCJ9CgkJe01NICJQb3J0aW9ucyBzdGFnZWQgZm9yIGNvbW1pdCJ9CgkJe01EICJTdGFnZWQgZm9yIGNvbW1pdCwgbWlzc2luZyJ9CgoJCXtfTyAiVW50cmFja2VkLCBub3Qgc3RhZ2VkIn0KCQl7QV8gIlN0YWdlZCBmb3IgY29tbWl0In0KCQl7QU0gIlBvcnRpb25zIHN0YWdlZCBmb3IgY29tbWl0In0KCQl7QUQgIlN0YWdlZCBmb3IgY29tbWl0LCBtaXNzaW5nIn0KCgkJe19EICJNaXNzaW5nIn0KCQl7RF8gIlN0YWdlZCBmb3IgcmVtb3ZhbCJ9CgkJe0RPICJTdGFnZWQgZm9yIHJlbW92YWwsIHN0aWxsIHByZXNlbnQifQoKCQl7VV8gIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24ifQoJCXtVVSAiUmVxdWlyZXMgbWVyZ2UgcmVzb2x1dGlvbiJ9CgkJe1VNICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIn0KCQl7VUQgIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24ifQoJfSB7CglpZiB7JG1heF9zdGF0dXNfZGVzYyA8IFtzdHJpbmcgbGVuZ3RoIFtsaW5kZXggJGkgMV1dfSB7CgkJc2V0IG1heF9zdGF0dXNfZGVzYyBbc3RyaW5nIGxlbmd0aCBbbGluZGV4ICRpIDFdXQoJfQoJc2V0IGFsbF9kZXNjcyhbbGluZGV4ICRpIDBdKSBbbGluZGV4ICRpIDFdCn0KdW5zZXQgaQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyB1dGlsCgpwcm9jIGJpbmRfYnV0dG9uMyB7dyBjbWR9IHsKCWJpbmQgJHcgPEFueS1CdXR0b24tMz4gJGNtZAoJaWYge1tpc19NYWNPU1hdfSB7CgkJYmluZCAkdyA8Q29udHJvbC1CdXR0b24tMT4gJGNtZAoJfQp9Cgpwcm9jIHNjcm9sbGJhcjJtYW55IHtsaXN0IG1vZGUgYXJnc30gewoJZm9yZWFjaCB3ICRsaXN0IHtldmFsICR3ICRtb2RlICRhcmdzfQp9Cgpwcm9jIG1hbnkyc2Nyb2xsYmFyIHtsaXN0IG1vZGUgc2IgdG9wIGJvdHRvbX0gewoJJHNiIHNldCAkdG9wICRib3R0b20KCWZvcmVhY2ggdyAkbGlzdCB7JHcgJG1vZGUgbW92ZXRvICR0b3B9Cn0KCnByb2MgaW5jcl9mb250X3NpemUge2ZvbnQge2FtdCAxfX0gewoJc2V0IHN6IFtmb250IGNvbmZpZ3VyZSAkZm9udCAtc2l6ZV0KCWluY3Igc3ogJGFtdAoJZm9udCBjb25maWd1cmUgJGZvbnQgLXNpemUgJHN6Cglmb250IGNvbmZpZ3VyZSAke2ZvbnR9Ym9sZCAtc2l6ZSAkc3oKfQoKcHJvYyBob29rX2ZhaWxlZF9wb3B1cCB7aG9vayBtc2d9IHsKCXNldCB3IC5ob29rZmFpbAoJdG9wbGV2ZWwgJHcKCglmcmFtZSAkdy5tCglsYWJlbCAkdy5tLmwxIC10ZXh0ICIkaG9vayBob29rIGZhaWxlZDoiIFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1mb250IGZvbnRfdWlib2xkCgl0ZXh0ICR3Lm0udCBcCgkJLWJhY2tncm91bmQgd2hpdGUgLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktd2lkdGggODAgLWhlaWdodCAxMCBcCgkJLWZvbnQgZm9udF9kaWZmIFwKCQkteXNjcm9sbGNvbW1hbmQgW2xpc3QgJHcubS5zYnkgc2V0XQoJbGFiZWwgJHcubS5sMiBcCgkJLXRleHQge1lvdSBtdXN0IGNvcnJlY3QgdGhlIGFib3ZlIGVycm9ycyBiZWZvcmUgY29tbWl0dGluZy59IFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1mb250IGZvbnRfdWlib2xkCglzY3JvbGxiYXIgJHcubS5zYnkgLWNvbW1hbmQgW2xpc3QgJHcubS50IHl2aWV3XQoJcGFjayAkdy5tLmwxIC1zaWRlIHRvcCAtZmlsbCB4CglwYWNrICR3Lm0ubDIgLXNpZGUgYm90dG9tIC1maWxsIHgKCXBhY2sgJHcubS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5tLnQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeCA1IC1wYWR5IDEwCgoJJHcubS50IGluc2VydCAxLjAgJG1zZwoJJHcubS50IGNvbmYgLXN0YXRlIGRpc2FibGVkCgoJYnV0dG9uICR3Lm9rIC10ZXh0IE9LIFwKCQktd2lkdGggMTUgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kICJkZXN0cm95ICR3IgoJcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWFuY2hvciBlIC1wYWR5IDEwIC1wYWR4IDEwCgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgoJYmluZCAkdyA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHciCgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogZXJyb3IiCgl0a3dhaXQgd2luZG93ICR3Cn0KCnNldCBuZXh0X2NvbnNvbGVfaWQgMAoKcHJvYyBuZXdfY29uc29sZSB7c2hvcnRfdGl0bGUgbG9uZ190aXRsZX0gewoJZ2xvYmFsIG5leHRfY29uc29sZV9pZCBjb25zb2xlX2RhdGEKCXNldCB3IC5jb25zb2xlW2luY3IgbmV4dF9jb25zb2xlX2lkXQoJc2V0IGNvbnNvbGVfZGF0YSgkdykgW2xpc3QgJHNob3J0X3RpdGxlICRsb25nX3RpdGxlXQoJcmV0dXJuIFtjb25zb2xlX2luaXQgJHddCn0KCnByb2MgY29uc29sZV9pbml0IHt3fSB7CglnbG9iYWwgY29uc29sZV9jciBjb25zb2xlX2RhdGEgTTFCCgoJc2V0IGNvbnNvbGVfY3IoJHcpIDEuMAoJdG9wbGV2ZWwgJHcKCWZyYW1lICR3Lm0KCWxhYmVsICR3Lm0ubDEgLXRleHQgIltsaW5kZXggJGNvbnNvbGVfZGF0YSgkdykgMV06IiBcCgkJLWFuY2hvciB3IFwKCQktanVzdGlmeSBsZWZ0IFwKCQktZm9udCBmb250X3VpYm9sZAoJdGV4dCAkdy5tLnQgXAoJCS1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLXdpZHRoIDgwIC1oZWlnaHQgMTAgXAoJCS1mb250IGZvbnRfZGlmZiBcCgkJLXN0YXRlIGRpc2FibGVkIFwKCQkteXNjcm9sbGNvbW1hbmQgW2xpc3QgJHcubS5zYnkgc2V0XQoJbGFiZWwgJHcubS5zIC10ZXh0IHtXb3JraW5nLi4uIHBsZWFzZSB3YWl0Li4ufSBcCgkJLWFuY2hvciB3IFwKCQktanVzdGlmeSBsZWZ0IFwKCQktZm9udCBmb250X3VpYm9sZAoJc2Nyb2xsYmFyICR3Lm0uc2J5IC1jb21tYW5kIFtsaXN0ICR3Lm0udCB5dmlld10KCXBhY2sgJHcubS5sMSAtc2lkZSB0b3AgLWZpbGwgeAoJcGFjayAkdy5tLnMgLXNpZGUgYm90dG9tIC1maWxsIHgKCXBhY2sgJHcubS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5tLnQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeCA1IC1wYWR5IDEwCgoJbWVudSAkdy5jdHhtIC10ZWFyb2ZmIDAKCSR3LmN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsICJDb3B5IiBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgInRrX3RleHRDb3B5ICR3Lm0udCIKCSR3LmN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsICJTZWxlY3QgQWxsIiBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgImZvY3VzICR3Lm0udDskdy5tLnQgdGFnIGFkZCBzZWwgMC4wIGVuZCIKCSR3LmN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsICJDb3B5IEFsbCIgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kICIKCQkJJHcubS50IHRhZyBhZGQgc2VsIDAuMCBlbmQKCQkJdGtfdGV4dENvcHkgJHcubS50CgkJCSR3Lm0udCB0YWcgcmVtb3ZlIHNlbCAwLjAgZW5kCgkJIgoKCWJ1dHRvbiAkdy5vayAtdGV4dCB7Q2xvc2V9IFwKCQktZm9udCBmb250X3VpIFwKCQktc3RhdGUgZGlzYWJsZWQgXAoJCS1jb21tYW5kICJkZXN0cm95ICR3IgoJcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWFuY2hvciBlIC1wYWR5IDEwIC1wYWR4IDEwCgoJYmluZF9idXR0b24zICR3Lm0udCAidGtfcG9wdXAgJHcuY3R4bSAlWCAlWSIKCWJpbmQgJHcubS50IDwkTTFCLUtleS1hPiAiJHcubS50IHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWsiCgliaW5kICR3Lm0udCA8JE0xQi1LZXktQT4gIiR3Lm0udCB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrIgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImZvY3VzICR3IgoJd20gdGl0bGUgJHcgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6IFtsaW5kZXggJGNvbnNvbGVfZGF0YSgkdykgMF0iCglyZXR1cm4gJHcKfQoKcHJvYyBjb25zb2xlX2V4ZWMge3cgY21kIGFmdGVyfSB7CgkjIC0tIEN5Z3dpbidzIFRjbCB0b3NzZXMgdGhlIGVudmlyb21lbnQgd2hlbiB3ZSBleGVjIG91ciBjaGlsZC4KCSMgICAgQnV0IG1vc3QgdXNlcnMgbmVlZCB0aGF0IHNvIHdlIGhhdmUgdG8gcmVsb2dpbi4gOi0oCgkjCglpZiB7W2lzX0N5Z3dpbl19IHsKCQlzZXQgY21kIFtsaXN0IHNoIC0tbG9naW4gLWMgImNkIFwiW3B3ZF1cIiAmJiBbam9pbiAkY21kIHsgfV0iXQoJfQoKCSMgLS0gVGNsIHdvbid0IGxldCB1cyByZWRpcmVjdCBib3RoIHN0ZG91dCBhbmQgc3RkZXJyIHRvCgkjICAgIHRoZSBzYW1lIHBpcGUuICBTbyBwYXNzIGl0IHRocm91Z2ggY2F0Li4uCgkjCglzZXQgY21kIFtjb25jYXQgfCAkY21kIHwmIGNhdF0KCglzZXQgZmRfZiBbb3BlbiAkY21kIHJdCglmY29uZmlndXJlICRmZF9mIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmRfZiByZWFkYWJsZSBbbGlzdCBjb25zb2xlX3JlYWQgJHcgJGZkX2YgJGFmdGVyXQp9Cgpwcm9jIGNvbnNvbGVfcmVhZCB7dyBmZCBhZnRlcn0gewoJZ2xvYmFsIGNvbnNvbGVfY3IKCglzZXQgYnVmIFtyZWFkICRmZF0KCWlmIHskYnVmIG5lIHt9fSB7CgkJaWYgeyFbd2luZm8gZXhpc3RzICR3XX0ge2NvbnNvbGVfaW5pdCAkd30KCQkkdy5tLnQgY29uZiAtc3RhdGUgbm9ybWFsCgkJc2V0IGMgMAoJCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRidWZdCgkJd2hpbGUgeyRjIDwgJG59IHsKCQkJc2V0IGNyIFtzdHJpbmcgZmlyc3QgIlxyIiAkYnVmICRjXQoJCQlzZXQgbGYgW3N0cmluZyBmaXJzdCAiXG4iICRidWYgJGNdCgkJCWlmIHskY3IgPCAwfSB7c2V0IGNyIFtleHByIHskbiArIDF9XX0KCQkJaWYgeyRsZiA8IDB9IHtzZXQgbGYgW2V4cHIgeyRuICsgMX1dfQoKCQkJaWYgeyRsZiA8ICRjcn0gewoJCQkJJHcubS50IGluc2VydCBlbmQgW3N0cmluZyByYW5nZSAkYnVmICRjICRsZl0KCQkJCXNldCBjb25zb2xlX2NyKCR3KSBbJHcubS50IGluZGV4IHtlbmQgLTFjfV0KCQkJCXNldCBjICRsZgoJCQkJaW5jciBjCgkJCX0gZWxzZSB7CgkJCQkkdy5tLnQgZGVsZXRlICRjb25zb2xlX2NyKCR3KSBlbmQKCQkJCSR3Lm0udCBpbnNlcnQgZW5kICJcbiIKCQkJCSR3Lm0udCBpbnNlcnQgZW5kIFtzdHJpbmcgcmFuZ2UgJGJ1ZiAkYyAkY3JdCgkJCQlzZXQgYyAkY3IKCQkJCWluY3IgYwoJCQl9CgkJfQoJCSR3Lm0udCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJCSR3Lm0udCBzZWUgZW5kCgl9CgoJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDEKCWlmIHtbZW9mICRmZF19IHsKCQlpZiB7W2NhdGNoIHtjbG9zZSAkZmR9XX0gewoJCQlzZXQgb2sgMAoJCX0gZWxzZSB7CgkJCXNldCBvayAxCgkJfQoJCXVwbGV2ZWwgIzAgJGFmdGVyICR3ICRvawoJCXJldHVybgoJfQoJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDAKfQoKcHJvYyBjb25zb2xlX2NoYWluIHtjbWRsaXN0IHcge29rIDF9fSB7CglpZiB7JG9rfSB7CgkJaWYge1tsbGVuZ3RoICRjbWRsaXN0XSA9PSAwfSB7CgkJCWNvbnNvbGVfZG9uZSAkdyAkb2sKCQkJcmV0dXJuCgkJfQoKCQlzZXQgY21kIFtsaW5kZXggJGNtZGxpc3QgMF0KCQlzZXQgY21kbGlzdCBbbHJhbmdlICRjbWRsaXN0IDEgZW5kXQoKCQlpZiB7W2xpbmRleCAkY21kIDBdIGVxIHtjb25zb2xlX2V4ZWN9fSB7CgkJCWNvbnNvbGVfZXhlYyAkdyBcCgkJCQlbbGluZGV4ICRjbWQgMV0gXAoJCQkJW2xpc3QgY29uc29sZV9jaGFpbiAkY21kbGlzdF0KCQl9IGVsc2UgewoJCQl1cGxldmVsICMwICRjbWQgJGNtZGxpc3QgJHcgJG9rCgkJfQoJfSBlbHNlIHsKCQljb25zb2xlX2RvbmUgJHcgJG9rCgl9Cn0KCnByb2MgY29uc29sZV9kb25lIHthcmdzfSB7CglnbG9iYWwgY29uc29sZV9jciBjb25zb2xlX2RhdGEKCglzd2l0Y2ggLS0gW2xsZW5ndGggJGFyZ3NdIHsKCTIgewoJCXNldCB3IFtsaW5kZXggJGFyZ3MgMF0KCQlzZXQgb2sgW2xpbmRleCAkYXJncyAxXQoJfQoJMyB7CgkJc2V0IHcgW2xpbmRleCAkYXJncyAxXQoJCXNldCBvayBbbGluZGV4ICRhcmdzIDJdCgl9CglkZWZhdWx0IHsKCQllcnJvciAid3JvbmcgbnVtYmVyIG9mIGFyZ3M6IGNvbnNvbGVfZG9uZSA/aWdub3JlZD8gdyBvayIKCX0KCX0KCglpZiB7JG9rfSB7CgkJaWYge1t3aW5mbyBleGlzdHMgJHddfSB7CgkJCSR3Lm0ucyBjb25mIC1iYWNrZ3JvdW5kIGdyZWVuIC10ZXh0IHtTdWNjZXNzfQoJCQkkdy5vayBjb25mIC1zdGF0ZSBub3JtYWwKCQl9Cgl9IGVsc2UgewoJCWlmIHshW3dpbmZvIGV4aXN0cyAkd119IHsKCQkJY29uc29sZV9pbml0ICR3CgkJfQoJCSR3Lm0ucyBjb25mIC1iYWNrZ3JvdW5kIHJlZCAtdGV4dCB7RXJyb3I6IENvbW1hbmQgRmFpbGVkfQoJCSR3Lm9rIGNvbmYgLXN0YXRlIG5vcm1hbAoJfQoKCWFycmF5IHVuc2V0IGNvbnNvbGVfY3IgJHcKCWFycmF5IHVuc2V0IGNvbnNvbGVfZGF0YSAkdwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHVpIGNvbW1hbmRzCgpzZXQgc3RhcnRpbmdfZ2l0a19tc2cge1N0YXJ0aW5nIGdpdGsuLi4gcGxlYXNlIHdhaXQuLi59Cgpwcm9jIGRvX2dpdGsge3JldnN9IHsKCWdsb2JhbCBlbnYgdWlfc3RhdHVzX3ZhbHVlIHN0YXJ0aW5nX2dpdGtfbXNnCgoJIyAtLSBBbHdheXMgc3RhcnQgZ2l0ayB0aHJvdWdoIHdoYXRldmVyIHdlIHdlcmUgbG9hZGVkIHdpdGguICBUaGlzCgkjICAgIGxldHMgdXMgYnlwYXNzIHVzaW5nIHNoZWxsIHByb2Nlc3Mgb24gV2luZG93cyBzeXN0ZW1zLgoJIwoJc2V0IGNtZCBbbGlzdCBbaW5mbyBuYW1lb2ZleGVjdXRhYmxlXV0KCWxhcHBlbmQgY21kIFtnaXRleGVjIGdpdGtdCglpZiB7JHJldnMgbmUge319IHsKCQlhcHBlbmQgY21kIHsgfQoJCWFwcGVuZCBjbWQgJHJldnMKCX0KCglpZiB7W2NhdGNoIHtldmFsIGV4ZWMgJGNtZCAmfSBlcnJdfSB7CgkJZXJyb3JfcG9wdXAgIkZhaWxlZCB0byBzdGFydCBnaXRrOlxuXG4kZXJyIgoJfSBlbHNlIHsKCQlzZXQgdWlfc3RhdHVzX3ZhbHVlICRzdGFydGluZ19naXRrX21zZwoJCWFmdGVyIDEwMDAwIHsKCQkJaWYgeyR1aV9zdGF0dXNfdmFsdWUgZXEgJHN0YXJ0aW5nX2dpdGtfbXNnfSB7CgkJCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59CgkJCX0KCQl9Cgl9Cn0KCnByb2MgZG9fc3RhdHMge30gewoJc2V0IGZkIFtvcGVuICJ8IGdpdCBjb3VudC1vYmplY3RzIC12IiByXQoJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+IDB9IHsKCQlpZiB7W3JlZ2V4cCB7XihbXjpdKyk6IChcZCspJH0gJGxpbmUgXyBuYW1lIHZhbHVlXX0gewoJCQlzZXQgc3RhdHMoJG5hbWUpICR2YWx1ZQoJCX0KCX0KCWNsb3NlICRmZAoKCXNldCBwYWNrZWRfc3ogMAoJZm9yZWFjaCBwIFtnbG9iIC1kaXJlY3RvcnkgW2dpdGRpciBvYmplY3RzIHBhY2tdIFwKCQktdHlwZSBmIFwKCQktbm9jb21wbGFpbiAtLSAqXSB7CgkJaW5jciBwYWNrZWRfc3ogW2ZpbGUgc2l6ZSAkcF0KCX0KCWlmIHskcGFja2VkX3N6ID4gMH0gewoJCXNldCBzdGF0cyhzaXplLXBhY2spIFtleHByIHskcGFja2VkX3N6IC8gMTAyNH1dCgl9CgoJc2V0IHcgLnN0YXRzX3ZpZXcKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IHtEYXRhYmFzZSBTdGF0aXN0aWNzfSBcCgkJLWZvbnQgZm9udF91aWJvbGQKCXBhY2sgJHcuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CgoJZnJhbWUgJHcuYnV0dG9ucyAtYm9yZGVyIDEKCWJ1dHRvbiAkdy5idXR0b25zLmNsb3NlIC10ZXh0IENsb3NlIFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCBkZXN0cm95ICR3XQoJYnV0dG9uICR3LmJ1dHRvbnMuZ2MgLXRleHQge0NvbXByZXNzIERhdGFiYXNlfSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgImRlc3Ryb3kgJHc7ZG9fZ2MiCglwYWNrICR3LmJ1dHRvbnMuY2xvc2UgLXNpZGUgcmlnaHQKCXBhY2sgJHcuYnV0dG9ucy5nYyAtc2lkZSBsZWZ0CglwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKCglmcmFtZSAkdy5zdGF0IC1ib3JkZXJ3aWR0aCAxIC1yZWxpZWYgc29saWQKCWZvcmVhY2ggcyB7CgkJe2NvdW50ICAgICAgICAgICB7TnVtYmVyIG9mIGxvb3NlIG9iamVjdHN9fQoJCXtzaXplICAgICAgICAgICAge0Rpc2sgc3BhY2UgdXNlZCBieSBsb29zZSBvYmplY3RzfSB7IEtpQn19CgkJe2luLXBhY2sgICAgICAgICB7TnVtYmVyIG9mIHBhY2tlZCBvYmplY3RzfX0KCQl7cGFja3MgICAgICAgICAgIHtOdW1iZXIgb2YgcGFja3N9fQoJCXtzaXplLXBhY2sgICAgICAge0Rpc2sgc3BhY2UgdXNlZCBieSBwYWNrZWQgb2JqZWN0c30geyBLaUJ9fQoJCXtwcnVuZS1wYWNrYWJsZSAge1BhY2tlZCBvYmplY3RzIHdhaXRpbmcgZm9yIHBydW5pbmd9fQoJCXtnYXJiYWdlICAgICAgICAge0dhcmJhZ2UgZmlsZXN9fQoJCX0gewoJCXNldCBuYW1lIFtsaW5kZXggJHMgMF0KCQlzZXQgbGFiZWwgW2xpbmRleCAkcyAxXQoJCWlmIHtbY2F0Y2gge3NldCB2YWx1ZSAkc3RhdHMoJG5hbWUpfV19IGNvbnRpbnVlCgkJaWYge1tsbGVuZ3RoICRzXSA+IDJ9IHsKCQkJc2V0IHZhbHVlICIkdmFsdWVbbGluZGV4ICRzIDJdIgoJCX0KCgkJbGFiZWwgJHcuc3RhdC5sXyRuYW1lIC10ZXh0ICIkbGFiZWw6IiAtYW5jaG9yIHcgLWZvbnQgZm9udF91aQoJCWxhYmVsICR3LnN0YXQudl8kbmFtZSAtdGV4dCAkdmFsdWUgLWFuY2hvciB3IC1mb250IGZvbnRfdWkKCQlncmlkICR3LnN0YXQubF8kbmFtZSAkdy5zdGF0LnZfJG5hbWUgLXN0aWNreSB3ZSAtcGFkeCB7MCA1fQoJfQoJcGFjayAkdy5zdGF0IC1wYWR5IDEwIC1wYWR4IDEwCgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgoJYmluZCAkdyA8S2V5LUVzY2FwZT4gW2xpc3QgZGVzdHJveSAkd10KCWJpbmQgJHcgPEtleS1SZXR1cm4+IFtsaXN0IGRlc3Ryb3kgJHddCgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogRGF0YWJhc2UgU3RhdGlzdGljcyIKCXRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBkb19nYyB7fSB7CglzZXQgdyBbbmV3X2NvbnNvbGUge2djfSB7Q29tcHJlc3NpbmcgdGhlIG9iamVjdCBkYXRhYmFzZX1dCgljb25zb2xlX2NoYWluIHsKCQl7Y29uc29sZV9leGVjIHtnaXQgcGFjay1yZWZzIC0tcHJ1bmV9fQoJCXtjb25zb2xlX2V4ZWMge2dpdCByZWZsb2cgZXhwaXJlIC0tYWxsfX0KCQl7Y29uc29sZV9leGVjIHtnaXQgcmVwYWNrIC1hIC1kIC1sfX0KCQl7Y29uc29sZV9leGVjIHtnaXQgcmVyZXJlIGdjfX0KCX0gJHcKfQoKcHJvYyBkb19mc2NrX29iamVjdHMge30gewoJc2V0IHcgW25ld19jb25zb2xlIHtmc2NrLW9iamVjdHN9IFwKCQl7VmVyaWZ5aW5nIHRoZSBvYmplY3QgZGF0YWJhc2Ugd2l0aCBmc2NrLW9iamVjdHN9XQoJc2V0IGNtZCBbbGlzdCBnaXQgZnNjay1vYmplY3RzXQoJbGFwcGVuZCBjbWQgLS1mdWxsCglsYXBwZW5kIGNtZCAtLWNhY2hlCglsYXBwZW5kIGNtZCAtLXN0cmljdAoJY29uc29sZV9leGVjICR3ICRjbWQgY29uc29sZV9kb25lCn0KCnNldCBpc19xdWl0dGluZyAwCgpwcm9jIGRvX3F1aXQge30gewoJZ2xvYmFsIHVpX2NvbW0gaXNfcXVpdHRpbmcgcmVwb19jb25maWcgY29tbWl0X3R5cGUKCglpZiB7JGlzX3F1aXR0aW5nfSByZXR1cm4KCXNldCBpc19xdWl0dGluZyAxCgoJaWYge1t3aW5mbyBleGlzdHMgJHVpX2NvbW1dfSB7CgkJIyAtLSBTdGFzaCBvdXIgY3VycmVudCBjb21taXQgYnVmZmVyLgoJCSMKCQlzZXQgc2F2ZSBbZ2l0ZGlyIEdJVEdVSV9NU0ddCgkJc2V0IG1zZyBbc3RyaW5nIHRyaW0gWyR1aV9jb21tIGdldCAwLjAgZW5kXV0KCQlyZWdzdWIgLWFsbCAtbGluZSB7WyBcclx0XSskfSAkbXNnIHt9IG1zZwoJCWlmIHsoIVtzdHJpbmcgbWF0Y2ggYW1lbmQqICRjb21taXRfdHlwZV0KCQkJfHwgWyR1aV9jb21tIGVkaXQgbW9kaWZpZWRdKQoJCQkmJiAkbXNnIG5lIHt9fSB7CgkJCWNhdGNoIHsKCQkJCXNldCBmZCBbb3BlbiAkc2F2ZSB3XQoJCQkJcHV0cyAtbm9uZXdsaW5lICRmZCAkbXNnCgkJCQljbG9zZSAkZmQKCQkJfQoJCX0gZWxzZSB7CgkJCWNhdGNoIHtmaWxlIGRlbGV0ZSAkc2F2ZX0KCQl9CgoJCSMgLS0gU3Rhc2ggb3VyIGN1cnJlbnQgd2luZG93IGdlb21ldHJ5IGludG8gdGhpcyByZXBvc2l0b3J5LgoJCSMKCQlzZXQgY2ZnX2dlb21ldHJ5IFtsaXN0XQoJCWxhcHBlbmQgY2ZnX2dlb21ldHJ5IFt3bSBnZW9tZXRyeSAuXQoJCWxhcHBlbmQgY2ZnX2dlb21ldHJ5IFtsaW5kZXggWy52cGFuZSBzYXNoIGNvb3JkIDBdIDFdCgkJbGFwcGVuZCBjZmdfZ2VvbWV0cnkgW2xpbmRleCBbLnZwYW5lLmZpbGVzIHNhc2ggY29vcmQgMF0gMF0KCQlpZiB7W2NhdGNoIHtzZXQgcmNfZ2VvbWV0cnkgJHJlcG9fY29uZmlnKGd1aS5nZW9tZXRyeSl9XX0gewoJCQlzZXQgcmNfZ2VvbWV0cnkge30KCQl9CgkJaWYgeyRjZmdfZ2VvbWV0cnkgbmUgJHJjX2dlb21ldHJ5fSB7CgkJCWNhdGNoIHtnaXQgY29uZmlnIGd1aS5nZW9tZXRyeSAkY2ZnX2dlb21ldHJ5fQoJCX0KCX0KCglkZXN0cm95IC4KfQoKcHJvYyBkb19yZXNjYW4ge30gewoJcmVzY2FuIHtzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59fQp9Cgpwcm9jIHVuc3RhZ2VfaGVscGVyIHt0eHQgcGF0aHN9IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBjdXJyZW50X2RpZmZfcGF0aAoKCWlmIHshW2xvY2tfaW5kZXggYmVnaW4tdXBkYXRlXX0gcmV0dXJuCgoJc2V0IHBhdGhMaXN0IFtsaXN0XQoJc2V0IGFmdGVyIHt9Cglmb3JlYWNoIHBhdGggJHBhdGhzIHsKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlBPyAtCgkJTT8gLQoJCUQ/IHsKCQkJbGFwcGVuZCBwYXRoTGlzdCAkcGF0aAoJCQlpZiB7JHBhdGggZXEgJGN1cnJlbnRfZGlmZl9wYXRofSB7CgkJCQlzZXQgYWZ0ZXIge3Jlc2hvd19kaWZmO30KCQkJfQoJCX0KCQl9Cgl9CglpZiB7JHBhdGhMaXN0IGVxIHt9fSB7CgkJdW5sb2NrX2luZGV4Cgl9IGVsc2UgewoJCXVwZGF0ZV9pbmRleGluZm8gXAoJCQkkdHh0IFwKCQkJJHBhdGhMaXN0IFwKCQkJW2NvbmNhdCAkYWZ0ZXIge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19XQoJfQp9Cgpwcm9jIGRvX3Vuc3RhZ2Vfc2VsZWN0aW9uIHt9IHsKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBzZWxlY3RlZF9wYXRocwoKCWlmIHtbYXJyYXkgc2l6ZSBzZWxlY3RlZF9wYXRoc10gPiAwfSB7CgkJdW5zdGFnZV9oZWxwZXIgXAoJCQl7VW5zdGFnaW5nIHNlbGVjdGVkIGZpbGVzIGZyb20gY29tbWl0fSBcCgkJCVthcnJheSBuYW1lcyBzZWxlY3RlZF9wYXRoc10KCX0gZWxzZWlmIHskY3VycmVudF9kaWZmX3BhdGggbmUge319IHsKCQl1bnN0YWdlX2hlbHBlciBcCgkJCSJVbnN0YWdpbmcgW3Nob3J0X3BhdGggJGN1cnJlbnRfZGlmZl9wYXRoXSBmcm9tIGNvbW1pdCIgXAoJCQlbbGlzdCAkY3VycmVudF9kaWZmX3BhdGhdCgl9Cn0KCnByb2MgYWRkX2hlbHBlciB7dHh0IHBhdGhzfSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMgY3VycmVudF9kaWZmX3BhdGgKCglpZiB7IVtsb2NrX2luZGV4IGJlZ2luLXVwZGF0ZV19IHJldHVybgoKCXNldCBwYXRoTGlzdCBbbGlzdF0KCXNldCBhZnRlciB7fQoJZm9yZWFjaCBwYXRoICRwYXRocyB7CgkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwYXRoKSAwXSB7CgkJX08gLQoJCT9NIC0KCQk/RCAtCgkJVT8gewoJCQlsYXBwZW5kIHBhdGhMaXN0ICRwYXRoCgkJCWlmIHskcGF0aCBlcSAkY3VycmVudF9kaWZmX3BhdGh9IHsKCQkJCXNldCBhZnRlciB7cmVzaG93X2RpZmY7fQoJCQl9CgkJfQoJCX0KCX0KCWlmIHskcGF0aExpc3QgZXEge319IHsKCQl1bmxvY2tfaW5kZXgKCX0gZWxzZSB7CgkJdXBkYXRlX2luZGV4IFwKCQkJJHR4dCBcCgkJCSRwYXRoTGlzdCBcCgkJCVtjb25jYXQgJGFmdGVyIHtzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeSB0byBjb21taXQufX1dCgl9Cn0KCnByb2MgZG9fYWRkX3NlbGVjdGlvbiB7fSB7CglnbG9iYWwgY3VycmVudF9kaWZmX3BhdGggc2VsZWN0ZWRfcGF0aHMKCglpZiB7W2FycmF5IHNpemUgc2VsZWN0ZWRfcGF0aHNdID4gMH0gewoJCWFkZF9oZWxwZXIgXAoJCQl7QWRkaW5nIHNlbGVjdGVkIGZpbGVzfSBcCgkJCVthcnJheSBuYW1lcyBzZWxlY3RlZF9wYXRoc10KCX0gZWxzZWlmIHskY3VycmVudF9kaWZmX3BhdGggbmUge319IHsKCQlhZGRfaGVscGVyIFwKCQkJIkFkZGluZyBbc2hvcnRfcGF0aCAkY3VycmVudF9kaWZmX3BhdGhdIiBcCgkJCVtsaXN0ICRjdXJyZW50X2RpZmZfcGF0aF0KCX0KfQoKcHJvYyBkb19hZGRfYWxsIHt9IHsKCWdsb2JhbCBmaWxlX3N0YXRlcwoKCXNldCBwYXRocyBbbGlzdF0KCWZvcmVhY2ggcGF0aCBbYXJyYXkgbmFtZXMgZmlsZV9zdGF0ZXNdIHsKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlVPyB7Y29udGludWV9CgkJP00gLQoJCT9EIHtsYXBwZW5kIHBhdGhzICRwYXRofQoJCX0KCX0KCWFkZF9oZWxwZXIge0FkZGluZyBhbGwgY2hhbmdlZCBmaWxlc30gJHBhdGhzCn0KCnByb2MgcmV2ZXJ0X2hlbHBlciB7dHh0IHBhdGhzfSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMgY3VycmVudF9kaWZmX3BhdGgKCglpZiB7IVtsb2NrX2luZGV4IGJlZ2luLXVwZGF0ZV19IHJldHVybgoKCXNldCBwYXRoTGlzdCBbbGlzdF0KCXNldCBhZnRlciB7fQoJZm9yZWFjaCBwYXRoICRwYXRocyB7CgkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwYXRoKSAwXSB7CgkJVT8ge2NvbnRpbnVlfQoJCT9NIC0KCQk/RCB7CgkJCWxhcHBlbmQgcGF0aExpc3QgJHBhdGgKCQkJaWYgeyRwYXRoIGVxICRjdXJyZW50X2RpZmZfcGF0aH0gewoJCQkJc2V0IGFmdGVyIHtyZXNob3dfZGlmZjt9CgkJCX0KCQl9CgkJfQoJfQoKCXNldCBuIFtsbGVuZ3RoICRwYXRoTGlzdF0KCWlmIHskbiA9PSAwfSB7CgkJdW5sb2NrX2luZGV4CgkJcmV0dXJuCgl9IGVsc2VpZiB7JG4gPT0gMX0gewoJCXNldCBzICJbc2hvcnRfcGF0aCBbbGluZGV4ICRwYXRoTGlzdF1dIgoJfSBlbHNlIHsKCQlzZXQgcyAidGhlc2UgJG4gZmlsZXMiCgl9CgoJc2V0IHJlcGx5IFt0a19kaWFsb2cgXAoJCS5jb25maXJtX3JldmVydCBcCgkJIlthcHBuYW1lXSAoW3JlcG9uYW1lXSkiIFwKCQkiUmV2ZXJ0IGNoYW5nZXMgaW4gJHM/CgpBbnkgdW5hZGRlZCBjaGFuZ2VzIHdpbGwgYmUgcGVybWFuZW50bHkgbG9zdCBieSB0aGUgcmV2ZXJ0LiIgXAoJCXF1ZXN0aW9uIFwKCQkxIFwKCQl7RG8gTm90aGluZ30gXAoJCXtSZXZlcnQgQ2hhbmdlc30gXAoJCV0KCWlmIHskcmVwbHkgPT0gMX0gewoJCWNoZWNrb3V0X2luZGV4IFwKCQkJJHR4dCBcCgkJCSRwYXRoTGlzdCBcCgkJCVtjb25jYXQgJGFmdGVyIHtzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59fV0KCX0gZWxzZSB7CgkJdW5sb2NrX2luZGV4Cgl9Cn0KCnByb2MgZG9fcmV2ZXJ0X3NlbGVjdGlvbiB7fSB7CglnbG9iYWwgY3VycmVudF9kaWZmX3BhdGggc2VsZWN0ZWRfcGF0aHMKCglpZiB7W2FycmF5IHNpemUgc2VsZWN0ZWRfcGF0aHNdID4gMH0gewoJCXJldmVydF9oZWxwZXIgXAoJCQl7UmV2ZXJ0aW5nIHNlbGVjdGVkIGZpbGVzfSBcCgkJCVthcnJheSBuYW1lcyBzZWxlY3RlZF9wYXRoc10KCX0gZWxzZWlmIHskY3VycmVudF9kaWZmX3BhdGggbmUge319IHsKCQlyZXZlcnRfaGVscGVyIFwKCQkJIlJldmVydGluZyBbc2hvcnRfcGF0aCAkY3VycmVudF9kaWZmX3BhdGhdIiBcCgkJCVtsaXN0ICRjdXJyZW50X2RpZmZfcGF0aF0KCX0KfQoKcHJvYyBkb19zaWdub2ZmIHt9IHsKCWdsb2JhbCB1aV9jb21tCgoJc2V0IG1lIFtjb21taXR0ZXJfaWRlbnRdCglpZiB7JG1lIGVxIHt9fSByZXR1cm4KCglzZXQgc29iICJTaWduZWQtb2ZmLWJ5OiAkbWUiCglzZXQgbGFzdCBbJHVpX2NvbW0gZ2V0IHtlbmQgLTFjIGxpbmVzdGFydH0ge2VuZCAtMWN9XQoJaWYgeyRsYXN0IG5lICRzb2J9IHsKCQkkdWlfY29tbSBlZGl0IHNlcGFyYXRvcgoJCWlmIHskbGFzdCBuZSB7fQoJCQkmJiAhW3JlZ2V4cCB7XltBLVpdW0EtWmEtel0qLVtBLVphLXotXSs6ICp9ICRsYXN0XX0gewoJCQkkdWlfY29tbSBpbnNlcnQgZW5kICJcbiIKCQl9CgkJJHVpX2NvbW0gaW5zZXJ0IGVuZCAiXG4kc29iIgoJCSR1aV9jb21tIGVkaXQgc2VwYXJhdG9yCgkJJHVpX2NvbW0gc2VlIGVuZAoJfQp9Cgpwcm9jIGRvX3NlbGVjdF9jb21taXRfdHlwZSB7fSB7CglnbG9iYWwgY29tbWl0X3R5cGUgc2VsZWN0ZWRfY29tbWl0X3R5cGUKCglpZiB7JHNlbGVjdGVkX2NvbW1pdF90eXBlIGVxIHtuZXd9CgkJJiYgW3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXX0gewoJCWNyZWF0ZV9uZXdfY29tbWl0Cgl9IGVsc2VpZiB7JHNlbGVjdGVkX2NvbW1pdF90eXBlIGVxIHthbWVuZH0KCQkmJiAhW3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXX0gewoJCWxvYWRfbGFzdF9jb21taXQKCgkJIyBUaGUgYW1lbmQgcmVxdWVzdCB3YXMgcmVqZWN0ZWQuLi4KCQkjCgkJaWYgeyFbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJCXNldCBzZWxlY3RlZF9jb21taXRfdHlwZSBuZXcKCQl9Cgl9Cn0KCnByb2MgZG9fY29tbWl0IHt9IHsKCWNvbW1pdF90cmVlCn0KCnByb2MgZG9fYWJvdXQge30gewoJZ2xvYmFsIGFwcHZlcnMgY29weXJpZ2h0CglnbG9iYWwgdGNsX3BhdGNoTGV2ZWwgdGtfcGF0Y2hMZXZlbAoKCXNldCB3IC5hYm91dF9kaWFsb2cKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0ICJBYm91dCBbYXBwbmFtZV0iIFwKCQktZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zCglidXR0b24gJHcuYnV0dG9ucy5jbG9zZSAtdGV4dCB7Q2xvc2V9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCBkZXN0cm95ICR3XQoJcGFjayAkdy5idXR0b25zLmNsb3NlIC1zaWRlIHJpZ2h0CglwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKCglsYWJlbCAkdy5kZXNjIFwKCQktdGV4dCAiZ2l0LWd1aSAtIGEgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIGZvciBHaXQuCiRjb3B5cmlnaHQiIFwKCQktcGFkeCA1IC1wYWR5IDUgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1hbmNob3IgdyBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc29saWQgXAoJCS1mb250IGZvbnRfdWkKCXBhY2sgJHcuZGVzYyAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCA1IC1wYWR5IDUKCglzZXQgdiB7fQoJYXBwZW5kIHYgImdpdC1ndWkgdmVyc2lvbiAkYXBwdmVyc1xuIgoJYXBwZW5kIHYgIltnaXQgdmVyc2lvbl1cbiIKCWFwcGVuZCB2ICJcbiIKCWlmIHskdGNsX3BhdGNoTGV2ZWwgZXEgJHRrX3BhdGNoTGV2ZWx9IHsKCQlhcHBlbmQgdiAiVGNsL1RrIHZlcnNpb24gJHRjbF9wYXRjaExldmVsIgoJfSBlbHNlIHsKCQlhcHBlbmQgdiAiVGNsIHZlcnNpb24gJHRjbF9wYXRjaExldmVsIgoJCWFwcGVuZCB2ICIsIFRrIHZlcnNpb24gJHRrX3BhdGNoTGV2ZWwiCgl9CgoJbGFiZWwgJHcudmVycyBcCgkJLXRleHQgJHYgXAoJCS1wYWR4IDUgLXBhZHkgNSBcCgkJLWp1c3RpZnkgbGVmdCBcCgkJLWFuY2hvciB3IFwKCQktYm9yZGVyd2lkdGggMSBcCgkJLXJlbGllZiBzb2xpZCBcCgkJLWZvbnQgZm9udF91aQoJcGFjayAkdy52ZXJzIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDUgLXBhZHkgNQoKCW1lbnUgJHcuY3R4bSAtdGVhcm9mZiAwCgkkdy5jdHhtIGFkZCBjb21tYW5kIFwKCQktbGFiZWwge0NvcHl9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCAiCgkJY2xpcGJvYXJkIGNsZWFyCgkJY2xpcGJvYXJkIGFwcGVuZCAtZm9ybWF0IFNUUklORyAtdHlwZSBTVFJJTkcgLS0gXFskdy52ZXJzIGNnZXQgLXRleHRcXQoJIgoKCWJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKCWJpbmQgJHcgPEtleS1Fc2NhcGU+ICJkZXN0cm95ICR3IgoJYmluZF9idXR0b24zICR3LnZlcnMgInRrX3BvcHVwICR3LmN0eG0gJVggJVk7IGdyYWIgJHc7IGZvY3VzICR3IgoJd20gdGl0bGUgJHcgIkFib3V0IFthcHBuYW1lXSIKCXRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBkb19vcHRpb25zIHt9IHsKCWdsb2JhbCByZXBvX2NvbmZpZyBnbG9iYWxfY29uZmlnIGZvbnRfZGVzY3MKCWdsb2JhbCByZXBvX2NvbmZpZ19uZXcgZ2xvYmFsX2NvbmZpZ19uZXcKCglhcnJheSB1bnNldCByZXBvX2NvbmZpZ19uZXcKCWFycmF5IHVuc2V0IGdsb2JhbF9jb25maWdfbmV3Cglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIHJlcG9fY29uZmlnXSB7CgkJc2V0IHJlcG9fY29uZmlnX25ldygkbmFtZSkgJHJlcG9fY29uZmlnKCRuYW1lKQoJfQoJbG9hZF9jb25maWcgMQoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyByZXBvX2NvbmZpZ10gewoJCXN3aXRjaCAtLSAkbmFtZSB7CgkJZ3VpLmRpZmZjb250ZXh0IHtjb250aW51ZX0KCQl9CgkJc2V0IHJlcG9fY29uZmlnX25ldygkbmFtZSkgJHJlcG9fY29uZmlnKCRuYW1lKQoJfQoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBnbG9iYWxfY29uZmlnXSB7CgkJc2V0IGdsb2JhbF9jb25maWdfbmV3KCRuYW1lKSAkZ2xvYmFsX2NvbmZpZygkbmFtZSkKCX0KCglzZXQgdyAub3B0aW9uc19lZGl0b3IKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0ICJPcHRpb25zIiBcCgkJLWZvbnQgZm9udF91aWJvbGQKCXBhY2sgJHcuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CgoJZnJhbWUgJHcuYnV0dG9ucwoJYnV0dG9uICR3LmJ1dHRvbnMucmVzdG9yZSAtdGV4dCB7UmVzdG9yZSBEZWZhdWx0c30gXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIGRvX3Jlc3RvcmVfZGVmYXVsdHMKCXBhY2sgJHcuYnV0dG9ucy5yZXN0b3JlIC1zaWRlIGxlZnQKCWJ1dHRvbiAkdy5idXR0b25zLnNhdmUgLXRleHQgU2F2ZSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3QgZG9fc2F2ZV9jb25maWcgJHddCglwYWNrICR3LmJ1dHRvbnMuc2F2ZSAtc2lkZSByaWdodAoJYnV0dG9uICR3LmJ1dHRvbnMuY2FuY2VsIC10ZXh0IHtDYW5jZWx9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCBkZXN0cm95ICR3XQoJcGFjayAkdy5idXR0b25zLmNhbmNlbCAtc2lkZSByaWdodCAtcGFkeCA1CglwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKCglsYWJlbGZyYW1lICR3LnJlcG8gLXRleHQgIltyZXBvbmFtZV0gUmVwb3NpdG9yeSIgXAoJCS1mb250IGZvbnRfdWkKCWxhYmVsZnJhbWUgJHcuZ2xvYmFsIC10ZXh0IHtHbG9iYWwgKEFsbCBSZXBvc2l0b3JpZXMpfSBcCgkJLWZvbnQgZm9udF91aQoJcGFjayAkdy5yZXBvIC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEgLXBhZHkgNSAtcGFkeCA1CglwYWNrICR3Lmdsb2JhbCAtc2lkZSByaWdodCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeSA1IC1wYWR4IDUKCglzZXQgb3B0aWQgMAoJZm9yZWFjaCBvcHRpb24gewoJCXt0IHVzZXIubmFtZSB7VXNlciBOYW1lfX0KCQl7dCB1c2VyLmVtYWlsIHtFbWFpbCBBZGRyZXNzfX0KCgkJe2IgbWVyZ2Uuc3VtbWFyeSB7U3VtbWFyaXplIE1lcmdlIENvbW1pdHN9fQoJCXtpLTEuLjUgbWVyZ2UudmVyYm9zaXR5IHtNZXJnZSBWZXJib3NpdHl9fQoKCQl7YiBndWkudHJ1c3RtdGltZSAge1RydXN0IEZpbGUgTW9kaWZpY2F0aW9uIFRpbWVzdGFtcHN9fQoJCXtpLTEuLjk5IGd1aS5kaWZmY29udGV4dCB7TnVtYmVyIG9mIERpZmYgQ29udGV4dCBMaW5lc319CgkJe3QgZ3VpLm5ld2JyYW5jaHRlbXBsYXRlIHtOZXcgQnJhbmNoIE5hbWUgVGVtcGxhdGV9fQoJCX0gewoJCXNldCB0eXBlIFtsaW5kZXggJG9wdGlvbiAwXQoJCXNldCBuYW1lIFtsaW5kZXggJG9wdGlvbiAxXQoJCXNldCB0ZXh0IFtsaW5kZXggJG9wdGlvbiAyXQoJCWluY3Igb3B0aWQKCQlmb3JlYWNoIGYge3JlcG8gZ2xvYmFsfSB7CgkJCXN3aXRjaCAtZ2xvYiAtLSAkdHlwZSB7CgkJCWIgewoJCQkJY2hlY2tidXR0b24gJHcuJGYuJG9wdGlkIC10ZXh0ICR0ZXh0IFwKCQkJCQktdmFyaWFibGUgJHtmfV9jb25maWdfbmV3KCRuYW1lKSBcCgkJCQkJLW9udmFsdWUgdHJ1ZSBcCgkJCQkJLW9mZnZhbHVlIGZhbHNlIFwKCQkJCQktZm9udCBmb250X3VpCgkJCQlwYWNrICR3LiRmLiRvcHRpZCAtc2lkZSB0b3AgLWFuY2hvciB3CgkJCX0KCQkJaS0qIHsKCQkJCXJlZ2V4cCAtLSB7LShcZCspXC5cLihcZCspJH0gJHR5cGUgX2p1bmsgbWluIG1heAoJCQkJZnJhbWUgJHcuJGYuJG9wdGlkCgkJCQlsYWJlbCAkdy4kZi4kb3B0aWQubCAtdGV4dCAiJHRleHQ6IiAtZm9udCBmb250X3VpCgkJCQlwYWNrICR3LiRmLiRvcHRpZC5sIC1zaWRlIGxlZnQgLWFuY2hvciB3IC1maWxsIHgKCQkJCXNwaW5ib3ggJHcuJGYuJG9wdGlkLnYgXAoJCQkJCS10ZXh0dmFyaWFibGUgJHtmfV9jb25maWdfbmV3KCRuYW1lKSBcCgkJCQkJLWZyb20gJG1pbiBcCgkJCQkJLXRvICRtYXggXAoJCQkJCS1pbmNyZW1lbnQgMSBcCgkJCQkJLXdpZHRoIFtleHByIHsxICsgW3N0cmluZyBsZW5ndGggJG1heF19XSBcCgkJCQkJLWZvbnQgZm9udF91aQoJCQkJYmluZCAkdy4kZi4kb3B0aWQudiA8Rm9jdXNJbj4geyVXIHNlbGVjdGlvbiByYW5nZSAwIGVuZH0KCQkJCXBhY2sgJHcuJGYuJG9wdGlkLnYgLXNpZGUgcmlnaHQgLWFuY2hvciBlIC1wYWR4IDUKCQkJCXBhY2sgJHcuJGYuJG9wdGlkIC1zaWRlIHRvcCAtYW5jaG9yIHcgLWZpbGwgeAoJCQl9CgkJCXQgewoJCQkJZnJhbWUgJHcuJGYuJG9wdGlkCgkJCQlsYWJlbCAkdy4kZi4kb3B0aWQubCAtdGV4dCAiJHRleHQ6IiAtZm9udCBmb250X3VpCgkJCQllbnRyeSAkdy4kZi4kb3B0aWQudiBcCgkJCQkJLWJvcmRlcndpZHRoIDEgXAoJCQkJCS1yZWxpZWYgc3Vua2VuIFwKCQkJCQktd2lkdGggMjAgXAoJCQkJCS10ZXh0dmFyaWFibGUgJHtmfV9jb25maWdfbmV3KCRuYW1lKSBcCgkJCQkJLWZvbnQgZm9udF91aQoJCQkJcGFjayAkdy4kZi4kb3B0aWQubCAtc2lkZSBsZWZ0IC1hbmNob3IgdwoJCQkJcGFjayAkdy4kZi4kb3B0aWQudiAtc2lkZSBsZWZ0IC1hbmNob3IgdyBcCgkJCQkJLWZpbGwgeCAtZXhwYW5kIDEgXAoJCQkJCS1wYWR4IDUKCQkJCXBhY2sgJHcuJGYuJG9wdGlkIC1zaWRlIHRvcCAtYW5jaG9yIHcgLWZpbGwgeAoJCQl9CgkJCX0KCQl9Cgl9CgoJc2V0IGFsbF9mb250cyBbbHNvcnQgW2ZvbnQgZmFtaWxpZXNdXQoJZm9yZWFjaCBvcHRpb24gJGZvbnRfZGVzY3MgewoJCXNldCBuYW1lIFtsaW5kZXggJG9wdGlvbiAwXQoJCXNldCBmb250IFtsaW5kZXggJG9wdGlvbiAxXQoJCXNldCB0ZXh0IFtsaW5kZXggJG9wdGlvbiAyXQoKCQlzZXQgZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5mYW1pbHkpIFwKCQkJW2ZvbnQgY29uZmlndXJlICRmb250IC1mYW1pbHldCgkJc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5ec2l6ZSkgXAoJCQlbZm9udCBjb25maWd1cmUgJGZvbnQgLXNpemVdCgoJCWZyYW1lICR3Lmdsb2JhbC4kbmFtZQoJCWxhYmVsICR3Lmdsb2JhbC4kbmFtZS5sIC10ZXh0ICIkdGV4dDoiIC1mb250IGZvbnRfdWkKCQlwYWNrICR3Lmdsb2JhbC4kbmFtZS5sIC1zaWRlIGxlZnQgLWFuY2hvciB3IC1maWxsIHgKCQlldmFsIHRrX29wdGlvbk1lbnUgJHcuZ2xvYmFsLiRuYW1lLmZhbWlseSBcCgkJCWdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KSBcCgkJCSRhbGxfZm9udHMKCQlzcGluYm94ICR3Lmdsb2JhbC4kbmFtZS5zaXplIFwKCQkJLXRleHR2YXJpYWJsZSBnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXnNpemUpIFwKCQkJLWZyb20gMiAtdG8gODAgLWluY3JlbWVudCAxIFwKCQkJLXdpZHRoIDMgXAoJCQktZm9udCBmb250X3VpCgkJYmluZCAkdy5nbG9iYWwuJG5hbWUuc2l6ZSA8Rm9jdXNJbj4geyVXIHNlbGVjdGlvbiByYW5nZSAwIGVuZH0KCQlwYWNrICR3Lmdsb2JhbC4kbmFtZS5zaXplIC1zaWRlIHJpZ2h0IC1hbmNob3IgZQoJCXBhY2sgJHcuZ2xvYmFsLiRuYW1lLmZhbWlseSAtc2lkZSByaWdodCAtYW5jaG9yIGUKCQlwYWNrICR3Lmdsb2JhbC4kbmFtZSAtc2lkZSB0b3AgLWFuY2hvciB3IC1maWxsIHgKCX0KCgliaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCgliaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKCXdtIHRpdGxlICR3ICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBPcHRpb25zIgoJdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIGRvX3Jlc3RvcmVfZGVmYXVsdHMge30gewoJZ2xvYmFsIGZvbnRfZGVzY3MgZGVmYXVsdF9jb25maWcgcmVwb19jb25maWcKCWdsb2JhbCByZXBvX2NvbmZpZ19uZXcgZ2xvYmFsX2NvbmZpZ19uZXcKCglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGRlZmF1bHRfY29uZmlnXSB7CgkJc2V0IHJlcG9fY29uZmlnX25ldygkbmFtZSkgJGRlZmF1bHRfY29uZmlnKCRuYW1lKQoJCXNldCBnbG9iYWxfY29uZmlnX25ldygkbmFtZSkgJGRlZmF1bHRfY29uZmlnKCRuYW1lKQoJfQoKCWZvcmVhY2ggb3B0aW9uICRmb250X2Rlc2NzIHsKCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMF0KCQlzZXQgcmVwb19jb25maWcoZ3VpLiRuYW1lKSAkZGVmYXVsdF9jb25maWcoZ3VpLiRuYW1lKQoJfQoJYXBwbHlfY29uZmlnCgoJZm9yZWFjaCBvcHRpb24gJGZvbnRfZGVzY3MgewoJCXNldCBuYW1lIFtsaW5kZXggJG9wdGlvbiAwXQoJCXNldCBmb250IFtsaW5kZXggJG9wdGlvbiAxXQoJCXNldCBnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXmZhbWlseSkgXAoJCQlbZm9udCBjb25maWd1cmUgJGZvbnQgLWZhbWlseV0KCQlzZXQgZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5zaXplKSBcCgkJCVtmb250IGNvbmZpZ3VyZSAkZm9udCAtc2l6ZV0KCX0KfQoKcHJvYyBkb19zYXZlX2NvbmZpZyB7d30gewoJaWYge1tjYXRjaCB7c2F2ZV9jb25maWd9IGVycl19IHsKCQllcnJvcl9wb3B1cCAiRmFpbGVkIHRvIGNvbXBsZXRlbHkgc2F2ZSBvcHRpb25zOlxuXG4kZXJyIgoJfQoJcmVzaG93X2RpZmYKCWRlc3Ryb3kgJHcKfQoKcHJvYyBkb193aW5kb3dzX3Nob3J0Y3V0IHt9IHsKCWdsb2JhbCBhcmd2MAoKCXNldCBmbiBbdGtfZ2V0U2F2ZUZpbGUgXAoJCS1wYXJlbnQgLiBcCgkJLXRpdGxlICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBDcmVhdGUgRGVza3RvcCBJY29uIiBcCgkJLWluaXRpYWxmaWxlICJHaXQgW3JlcG9uYW1lXS5iYXQiXQoJaWYgeyRmbiAhPSB7fX0gewoJCWlmIHtbY2F0Y2ggewoJCQkJc2V0IGZkIFtvcGVuICRmbiB3XQoJCQkJcHV0cyAkZmQgIkBFQ0hPIEVudGVyaW5nIFtyZXBvbmFtZV0iCgkJCQlwdXRzICRmZCAiQEVDSE8gU3RhcnRpbmcgZ2l0LWd1aS4uLiBwbGVhc2Ugd2FpdC4uLiIKCQkJCXB1dHMgJGZkICJAU0VUIFBBVEg9W2ZpbGUgbm9ybWFsaXplIFtnaXRleGVjXV07JVBBVEglIgoJCQkJcHV0cyAkZmQgIkBTRVQgR0lUX0RJUj1bZmlsZSBub3JtYWxpemUgW2dpdGRpcl1dIgoJCQkJcHV0cyAtbm9uZXdsaW5lICRmZCAiQFwiW2luZm8gbmFtZW9mZXhlY3V0YWJsZV1cIiIKCQkJCXB1dHMgJGZkICIgXCJbZmlsZSBub3JtYWxpemUgJGFyZ3YwXVwiIgoJCQkJY2xvc2UgJGZkCgkJCX0gZXJyXX0gewoJCQllcnJvcl9wb3B1cCAiQ2Fubm90IHdyaXRlIHNjcmlwdDpcblxuJGVyciIKCQl9Cgl9Cn0KCnByb2MgZG9fY3lnd2luX3Nob3J0Y3V0IHt9IHsKCWdsb2JhbCBhcmd2MAoKCWlmIHtbY2F0Y2ggewoJCXNldCBkZXNrdG9wIFtleGVjIGN5Z3BhdGggXAoJCQktLXdpbmRvd3MgXAoJCQktLWFic29sdXRlIFwKCQkJLS1sb25nLW5hbWUgXAoJCQktLWRlc2t0b3BdCgkJfV19IHsKCQkJc2V0IGRlc2t0b3AgLgoJfQoJc2V0IGZuIFt0a19nZXRTYXZlRmlsZSBcCgkJLXBhcmVudCAuIFwKCQktdGl0bGUgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6IENyZWF0ZSBEZXNrdG9wIEljb24iIFwKCQktaW5pdGlhbGRpciAkZGVza3RvcCBcCgkJLWluaXRpYWxmaWxlICJHaXQgW3JlcG9uYW1lXS5iYXQiXQoJaWYgeyRmbiAhPSB7fX0gewoJCWlmIHtbY2F0Y2ggewoJCQkJc2V0IGZkIFtvcGVuICRmbiB3XQoJCQkJc2V0IHNoIFtleGVjIGN5Z3BhdGggXAoJCQkJCS0td2luZG93cyBcCgkJCQkJLS1hYnNvbHV0ZSBcCgkJCQkJL2Jpbi9zaF0KCQkJCXNldCBtZSBbZXhlYyBjeWdwYXRoIFwKCQkJCQktLXVuaXggXAoJCQkJCS0tYWJzb2x1dGUgXAoJCQkJCSRhcmd2MF0KCQkJCXNldCBnZCBbZXhlYyBjeWdwYXRoIFwKCQkJCQktLXVuaXggXAoJCQkJCS0tYWJzb2x1dGUgXAoJCQkJCVtnaXRkaXJdXQoJCQkJc2V0IGd3IFtleGVjIGN5Z3BhdGggXAoJCQkJCS0td2luZG93cyBcCgkJCQkJLS1hYnNvbHV0ZSBcCgkJCQkJW2ZpbGUgZGlybmFtZSBbZ2l0ZGlyXV1dCgkJCQlyZWdzdWIgLWFsbCAnICRtZSAiJ1xcJyciIG1lCgkJCQlyZWdzdWIgLWFsbCAnICRnZCAiJ1xcJyciIGdkCgkJCQlwdXRzICRmZCAiQEVDSE8gRW50ZXJpbmcgJGd3IgoJCQkJcHV0cyAkZmQgIkBFQ0hPIFN0YXJ0aW5nIGdpdC1ndWkuLi4gcGxlYXNlIHdhaXQuLi4iCgkJCQlwdXRzIC1ub25ld2xpbmUgJGZkICJAXCIkc2hcIiAtLWxvZ2luIC1jIFwiIgoJCQkJcHV0cyAtbm9uZXdsaW5lICRmZCAiR0lUX0RJUj0nJGdkJyIKCQkJCXB1dHMgLW5vbmV3bGluZSAkZmQgIiAnJG1lJyIKCQkJCXB1dHMgJGZkICImXCIiCgkJCQljbG9zZSAkZmQKCQkJfSBlcnJdfSB7CgkJCWVycm9yX3BvcHVwICJDYW5ub3Qgd3JpdGUgc2NyaXB0OlxuXG4kZXJyIgoJCX0KCX0KfQoKcHJvYyBkb19tYWNvc3hfYXBwIHt9IHsKCWdsb2JhbCBhcmd2MCBlbnYKCglzZXQgZm4gW3RrX2dldFNhdmVGaWxlIFwKCQktcGFyZW50IC4gXAoJCS10aXRsZSAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogQ3JlYXRlIERlc2t0b3AgSWNvbiIgXAoJCS1pbml0aWFsZGlyIFtmaWxlIGpvaW4gJGVudihIT01FKSBEZXNrdG9wXSBcCgkJLWluaXRpYWxmaWxlICJHaXQgW3JlcG9uYW1lXS5hcHAiXQoJaWYgeyRmbiAhPSB7fX0gewoJCWlmIHtbY2F0Y2ggewoJCQkJc2V0IENvbnRlbnRzIFtmaWxlIGpvaW4gJGZuIENvbnRlbnRzXQoJCQkJc2V0IE1hY09TIFtmaWxlIGpvaW4gJENvbnRlbnRzIE1hY09TXQoJCQkJc2V0IGV4ZSBbZmlsZSBqb2luICRNYWNPUyBnaXQtZ3VpXQoKCQkJCWZpbGUgbWtkaXIgJE1hY09TCgoJCQkJc2V0IGZkIFtvcGVuIFtmaWxlIGpvaW4gJENvbnRlbnRzIEluZm8ucGxpc3RdIHddCgkJCQlwdXRzICRmZCB7PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+CjxwbGlzdCB2ZXJzaW9uPSIxLjAiPgo8ZGljdD4KCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgoJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+Cgk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgoJPHN0cmluZz5naXQtZ3VpPC9zdHJpbmc+Cgk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgoJPHN0cmluZz5vcmcuc3BlYXJjZS5naXQtZ3VpPC9zdHJpbmc+Cgk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+Cgk8c3RyaW5nPjYuMDwvc3RyaW5nPgoJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+Cgk8c3RyaW5nPkFQUEw8L3N0cmluZz4KCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgoJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KCTxzdHJpbmc+MS4wPC9zdHJpbmc+Cgk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KCTxzdHJpbmc+TlNBcHBsaWNhdGlvbjwvc3RyaW5nPgo8L2RpY3Q+CjwvcGxpc3Q+fQoJCQkJY2xvc2UgJGZkCgoJCQkJc2V0IGZkIFtvcGVuICRleGUgd10KCQkJCXNldCBnZCBbZmlsZSBub3JtYWxpemUgW2dpdGRpcl1dCgkJCQlzZXQgZXAgW2ZpbGUgbm9ybWFsaXplIFtnaXRleGVjXV0KCQkJCXJlZ3N1YiAtYWxsICcgJGdkICInXFwnJyIgZ2QKCQkJCXJlZ3N1YiAtYWxsICcgJGVwICInXFwnJyIgZXAKCQkJCXB1dHMgJGZkICIjIS9iaW4vc2giCgkJCQlmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGVudl0gewoJCQkJCWlmIHtbc3RyaW5nIG1hdGNoIEdJVF8qICRuYW1lXX0gewoJCQkJCQlyZWdzdWIgLWFsbCAnICRlbnYoJG5hbWUpICInXFwnJyIgdgoJCQkJCQlwdXRzICRmZCAiZXhwb3J0ICRuYW1lPSckdiciCgkJCQkJfQoJCQkJfQoJCQkJcHV0cyAkZmQgImV4cG9ydCBQQVRIPSckZXAnOlwkUEFUSCIKCQkJCXB1dHMgJGZkICJleHBvcnQgR0lUX0RJUj0nJGdkJyIKCQkJCXB1dHMgJGZkICJleGVjIFtmaWxlIG5vcm1hbGl6ZSAkYXJndjBdIgoJCQkJY2xvc2UgJGZkCgoJCQkJZmlsZSBhdHRyaWJ1dGVzICRleGUgLXBlcm1pc3Npb25zIHUreCxnK3gsbyt4CgkJCX0gZXJyXX0gewoJCQllcnJvcl9wb3B1cCAiQ2Fubm90IHdyaXRlIGljb246XG5cbiRlcnIiCgkJfQoJfQp9Cgpwcm9jIHRvZ2dsZV9vcl9kaWZmIHt3IHggeX0gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIGZpbGVfbGlzdHMgY3VycmVudF9kaWZmX3BhdGggdWlfaW5kZXggdWlfd29ya2RpcgoJZ2xvYmFsIGxhc3RfY2xpY2tlZCBzZWxlY3RlZF9wYXRocwoKCXNldCBwb3MgW3NwbGl0IFskdyBpbmRleCBAJHgsJHldIC5dCglzZXQgbG5vIFtsaW5kZXggJHBvcyAwXQoJc2V0IGNvbCBbbGluZGV4ICRwb3MgMV0KCXNldCBwYXRoIFtsaW5kZXggJGZpbGVfbGlzdHMoJHcpIFtleHByIHskbG5vIC0gMX1dXQoJaWYgeyRwYXRoIGVxIHt9fSB7CgkJc2V0IGxhc3RfY2xpY2tlZCB7fQoJCXJldHVybgoJfQoKCXNldCBsYXN0X2NsaWNrZWQgW2xpc3QgJHcgJGxub10KCWFycmF5IHVuc2V0IHNlbGVjdGVkX3BhdGhzCgkkdWlfaW5kZXggdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoJJHVpX3dvcmtkaXIgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoKCWlmIHskY29sID09IDB9IHsKCQlpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIGVxICRwYXRofSB7CgkJCXNldCBhZnRlciB7cmVzaG93X2RpZmY7fQoJCX0gZWxzZSB7CgkJCXNldCBhZnRlciB7fQoJCX0KCQlpZiB7JHcgZXEgJHVpX2luZGV4fSB7CgkJCXVwZGF0ZV9pbmRleGluZm8gXAoJCQkJIlVuc3RhZ2luZyBbc2hvcnRfcGF0aCAkcGF0aF0gZnJvbSBjb21taXQiIFwKCQkJCVtsaXN0ICRwYXRoXSBcCgkJCQlbY29uY2F0ICRhZnRlciB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX1dCgkJfSBlbHNlaWYgeyR3IGVxICR1aV93b3JrZGlyfSB7CgkJCXVwZGF0ZV9pbmRleCBcCgkJCQkiQWRkaW5nIFtzaG9ydF9wYXRoICRwYXRoXSIgXAoJCQkJW2xpc3QgJHBhdGhdIFwKCQkJCVtjb25jYXQgJGFmdGVyIHtzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59fV0KCQl9Cgl9IGVsc2UgewoJCXNob3dfZGlmZiAkcGF0aCAkdyAkbG5vCgl9Cn0KCnByb2MgYWRkX29uZV90b19zZWxlY3Rpb24ge3cgeCB5fSB7CglnbG9iYWwgZmlsZV9saXN0cyBsYXN0X2NsaWNrZWQgc2VsZWN0ZWRfcGF0aHMKCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBAJHgsJHldIC5dIDBdCglzZXQgcGF0aCBbbGluZGV4ICRmaWxlX2xpc3RzKCR3KSBbZXhwciB7JGxubyAtIDF9XV0KCWlmIHskcGF0aCBlcSB7fX0gewoJCXNldCBsYXN0X2NsaWNrZWQge30KCQlyZXR1cm4KCX0KCglpZiB7JGxhc3RfY2xpY2tlZCBuZSB7fQoJCSYmIFtsaW5kZXggJGxhc3RfY2xpY2tlZCAwXSBuZSAkd30gewoJCWFycmF5IHVuc2V0IHNlbGVjdGVkX3BhdGhzCgkJW2xpbmRleCAkbGFzdF9jbGlja2VkIDBdIHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCX0KCglzZXQgbGFzdF9jbGlja2VkIFtsaXN0ICR3ICRsbm9dCglpZiB7W2NhdGNoIHtzZXQgaW5fc2VsICRzZWxlY3RlZF9wYXRocygkcGF0aCl9XX0gewoJCXNldCBpbl9zZWwgMAoJfQoJaWYgeyRpbl9zZWx9IHsKCQl1bnNldCBzZWxlY3RlZF9wYXRocygkcGF0aCkKCQkkdyB0YWcgcmVtb3ZlIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJfSBlbHNlIHsKCQlzZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpIDEKCQkkdyB0YWcgYWRkIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJfQp9Cgpwcm9jIGFkZF9yYW5nZV90b19zZWxlY3Rpb24ge3cgeCB5fSB7CglnbG9iYWwgZmlsZV9saXN0cyBsYXN0X2NsaWNrZWQgc2VsZWN0ZWRfcGF0aHMKCglpZiB7W2xpbmRleCAkbGFzdF9jbGlja2VkIDBdIG5lICR3fSB7CgkJdG9nZ2xlX29yX2RpZmYgJHcgJHggJHkKCQlyZXR1cm4KCX0KCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBAJHgsJHldIC5dIDBdCglzZXQgbGMgW2xpbmRleCAkbGFzdF9jbGlja2VkIDFdCglpZiB7JGxjIDwgJGxub30gewoJCXNldCBiZWdpbiAkbGMKCQlzZXQgZW5kICRsbm8KCX0gZWxzZSB7CgkJc2V0IGJlZ2luICRsbm8KCQlzZXQgZW5kICRsYwoJfQoKCWZvcmVhY2ggcGF0aCBbbHJhbmdlICRmaWxlX2xpc3RzKCR3KSBcCgkJW2V4cHIgeyRiZWdpbiAtIDF9XSBcCgkJW2V4cHIgeyRlbmQgLSAxfV1dIHsKCQlzZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpIDEKCX0KCSR3IHRhZyBhZGQgaW5fc2VsICRiZWdpbi4wIFtleHByIHskZW5kICsgMX1dLjAKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBjb25maWcgZGVmYXVsdHMKCnNldCBjdXJzb3JfcHRyIGFycm93CmZvbnQgY3JlYXRlIGZvbnRfZGlmZiAtZmFtaWx5IENvdXJpZXIgLXNpemUgMTAKZm9udCBjcmVhdGUgZm9udF91aQpjYXRjaCB7CglsYWJlbCAuZHVtbXkKCWV2YWwgZm9udCBjb25maWd1cmUgZm9udF91aSBbZm9udCBhY3R1YWwgWy5kdW1teSBjZ2V0IC1mb250XV0KCWRlc3Ryb3kgLmR1bW15Cn0KCmZvbnQgY3JlYXRlIGZvbnRfdWlib2xkCmZvbnQgY3JlYXRlIGZvbnRfZGlmZmJvbGQKCmlmIHtbaXNfV2luZG93c119IHsKCXNldCBNMUIgQ29udHJvbAoJc2V0IE0xVCBDdHJsCn0gZWxzZWlmIHtbaXNfTWFjT1NYXX0gewoJc2V0IE0xQiBNMQoJc2V0IE0xVCBDbWQKfSBlbHNlIHsKCXNldCBNMUIgTTEKCXNldCBNMVQgTTEKfQoKcHJvYyBhcHBseV9jb25maWcge30gewoJZ2xvYmFsIHJlcG9fY29uZmlnIGZvbnRfZGVzY3MKCglmb3JlYWNoIG9wdGlvbiAkZm9udF9kZXNjcyB7CgkJc2V0IG5hbWUgW2xpbmRleCAkb3B0aW9uIDBdCgkJc2V0IGZvbnQgW2xpbmRleCAkb3B0aW9uIDFdCgkJaWYge1tjYXRjaCB7CgkJCWZvcmVhY2gge2NuIGN2fSAkcmVwb19jb25maWcoZ3VpLiRuYW1lKSB7CgkJCQlmb250IGNvbmZpZ3VyZSAkZm9udCAkY24gJGN2CgkJCX0KCQkJfSBlcnJdfSB7CgkJCWVycm9yX3BvcHVwICJJbnZhbGlkIGZvbnQgc3BlY2lmaWVkIGluIGd1aS4kbmFtZTpcblxuJGVyciIKCQl9CgkJZm9yZWFjaCB7Y24gY3Z9IFtmb250IGNvbmZpZ3VyZSAkZm9udF0gewoJCQlmb250IGNvbmZpZ3VyZSAke2ZvbnR9Ym9sZCAkY24gJGN2CgkJfQoJCWZvbnQgY29uZmlndXJlICR7Zm9udH1ib2xkIC13ZWlnaHQgYm9sZAoJfQp9CgpzZXQgZGVmYXVsdF9jb25maWcobWVyZ2Uuc3VtbWFyeSkgZmFsc2UKc2V0IGRlZmF1bHRfY29uZmlnKG1lcmdlLnZlcmJvc2l0eSkgMgpzZXQgZGVmYXVsdF9jb25maWcodXNlci5uYW1lKSB7fQpzZXQgZGVmYXVsdF9jb25maWcodXNlci5lbWFpbCkge30KCnNldCBkZWZhdWx0X2NvbmZpZyhndWkudHJ1c3RtdGltZSkgZmFsc2UKc2V0IGRlZmF1bHRfY29uZmlnKGd1aS5kaWZmY29udGV4dCkgNQpzZXQgZGVmYXVsdF9jb25maWcoZ3VpLm5ld2JyYW5jaHRlbXBsYXRlKSB7fQpzZXQgZGVmYXVsdF9jb25maWcoZ3VpLmZvbnR1aSkgW2ZvbnQgY29uZmlndXJlIGZvbnRfdWldCnNldCBkZWZhdWx0X2NvbmZpZyhndWkuZm9udGRpZmYpIFtmb250IGNvbmZpZ3VyZSBmb250X2RpZmZdCnNldCBmb250X2Rlc2NzIHsKCXtmb250dWkgICBmb250X3VpICAge01haW4gRm9udH19Cgl7Zm9udGRpZmYgZm9udF9kaWZmIHtEaWZmL0NvbnNvbGUgRm9udH19Cn0KbG9hZF9jb25maWcgMAphcHBseV9jb25maWcKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgZmVhdHVyZSBvcHRpb24gc2VsZWN0aW9uCgppZiB7W3JlZ2V4cCB7XmdpdC0oLispJH0gW2FwcG5hbWVdIF9qdW5rIHN1YmNvbW1hbmRdfSB7Cgl1bnNldCBfanVuawp9IGVsc2UgewoJc2V0IHN1YmNvbW1hbmQgZ3VpCn0KaWYgeyRzdWJjb21tYW5kIGVxIHtndWkuc2h9fSB7CglzZXQgc3ViY29tbWFuZCBndWkKfQppZiB7JHN1YmNvbW1hbmQgZXEge2d1aX0gJiYgW2xsZW5ndGggJGFyZ3ZdID4gMH0gewoJc2V0IHN1YmNvbW1hbmQgW2xpbmRleCAkYXJndiAwXQoJc2V0IGFyZ3YgW2xyYW5nZSAkYXJndiAxIGVuZF0KfQoKZW5hYmxlX29wdGlvbiBtdWx0aWNvbW1pdAplbmFibGVfb3B0aW9uIGJyYW5jaAplbmFibGVfb3B0aW9uIHRyYW5zcG9ydAoKc3dpdGNoIC0tICRzdWJjb21tYW5kIHsKYnJvd3NlciAtCmJsYW1lIHsKCWRpc2FibGVfb3B0aW9uIG11bHRpY29tbWl0CglkaXNhYmxlX29wdGlvbiBicmFuY2gKCWRpc2FibGVfb3B0aW9uIHRyYW5zcG9ydAp9CmNpdG9vbCB7CgllbmFibGVfb3B0aW9uIHNpbmdsZWNvbW1pdAoKCWRpc2FibGVfb3B0aW9uIG11bHRpY29tbWl0CglkaXNhYmxlX29wdGlvbiBicmFuY2gKCWRpc2FibGVfb3B0aW9uIHRyYW5zcG9ydAp9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgdWkgY29uc3RydWN0aW9uCgpzZXQgdWlfY29tbSB7fQoKIyAtLSBNZW51IEJhcgojCm1lbnUgLm1iYXIgLXRlYXJvZmYgMAoubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgUmVwb3NpdG9yeSAtbWVudSAubWJhci5yZXBvc2l0b3J5Ci5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBFZGl0IC1tZW51IC5tYmFyLmVkaXQKaWYge1tpc19lbmFibGVkIGJyYW5jaF19IHsKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBCcmFuY2ggLW1lbnUgLm1iYXIuYnJhbmNoCn0KaWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XSB8fCBbaXNfZW5hYmxlZCBzaW5nbGVjb21taXRdfSB7CgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgQ29tbWl0IC1tZW51IC5tYmFyLmNvbW1pdAp9CmlmIHtbaXNfZW5hYmxlZCB0cmFuc3BvcnRdfSB7CgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgTWVyZ2UgLW1lbnUgLm1iYXIubWVyZ2UKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBGZXRjaCAtbWVudSAubWJhci5mZXRjaAoJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIFB1c2ggLW1lbnUgLm1iYXIucHVzaAp9Ci4gY29uZmlndXJlIC1tZW51IC5tYmFyCgojIC0tIFJlcG9zaXRvcnkgTWVudQojCm1lbnUgLm1iYXIucmVwb3NpdG9yeQoKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0Jyb3dzZSBDdXJyZW50IEJyYW5jaH0gXAoJLWNvbW1hbmQge25ld19icm93c2VyICRjdXJyZW50X2JyYW5jaH0gXAoJLWZvbnQgZm9udF91aQp0cmFjZSBhZGQgdmFyaWFibGUgY3VycmVudF9icmFuY2ggd3JpdGUgIi5tYmFyLnJlcG9zaXRvcnkgZW50cnljb25mIFsubWJhci5yZXBvc2l0b3J5IGluZGV4IGxhc3RdIC1sYWJlbCBcIkJyb3dzZSBcJGN1cnJlbnRfYnJhbmNoXCIgOyMiCi5tYmFyLnJlcG9zaXRvcnkgYWRkIHNlcGFyYXRvcgoKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Zpc3VhbGl6ZSBDdXJyZW50IEJyYW5jaH0gXAoJLWNvbW1hbmQge2RvX2dpdGsgJGN1cnJlbnRfYnJhbmNofSBcCgktZm9udCBmb250X3VpCnRyYWNlIGFkZCB2YXJpYWJsZSBjdXJyZW50X2JyYW5jaCB3cml0ZSAiLm1iYXIucmVwb3NpdG9yeSBlbnRyeWNvbmYgWy5tYmFyLnJlcG9zaXRvcnkgaW5kZXggbGFzdF0gLWxhYmVsIFwiVmlzdWFsaXplIFwkY3VycmVudF9icmFuY2hcIiA7IyIKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Zpc3VhbGl6ZSBBbGwgQnJhbmNoZXN9IFwKCS1jb21tYW5kIHtkb19naXRrIC0tYWxsfSBcCgktZm9udCBmb250X3VpCi5tYmFyLnJlcG9zaXRvcnkgYWRkIHNlcGFyYXRvcgoKaWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XX0gewoJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCAtbGFiZWwge0RhdGFiYXNlIFN0YXRpc3RpY3N9IFwKCQktY29tbWFuZCBkb19zdGF0cyBcCgkJLWZvbnQgZm9udF91aQoKCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgLWxhYmVsIHtDb21wcmVzcyBEYXRhYmFzZX0gXAoJCS1jb21tYW5kIGRvX2djIFwKCQktZm9udCBmb250X3VpCgoJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCAtbGFiZWwge1ZlcmlmeSBEYXRhYmFzZX0gXAoJCS1jb21tYW5kIGRvX2ZzY2tfb2JqZWN0cyBcCgkJLWZvbnQgZm9udF91aQoKCS5tYmFyLnJlcG9zaXRvcnkgYWRkIHNlcGFyYXRvcgoKCWlmIHtbaXNfQ3lnd2luXX0gewoJCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAoJCQktbGFiZWwge0NyZWF0ZSBEZXNrdG9wIEljb259IFwKCQkJLWNvbW1hbmQgZG9fY3lnd2luX3Nob3J0Y3V0IFwKCQkJLWZvbnQgZm9udF91aQoJfSBlbHNlaWYge1tpc19XaW5kb3dzXX0gewoJCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAoJCQktbGFiZWwge0NyZWF0ZSBEZXNrdG9wIEljb259IFwKCQkJLWNvbW1hbmQgZG9fd2luZG93c19zaG9ydGN1dCBcCgkJCS1mb250IGZvbnRfdWkKCX0gZWxzZWlmIHtbaXNfTWFjT1NYXX0gewoJCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAoJCQktbGFiZWwge0NyZWF0ZSBEZXNrdG9wIEljb259IFwKCQkJLWNvbW1hbmQgZG9fbWFjb3N4X2FwcCBcCgkJCS1mb250IGZvbnRfdWkKCX0KfQoKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCAtbGFiZWwgUXVpdCBcCgktY29tbWFuZCBkb19xdWl0IFwKCS1hY2NlbGVyYXRvciAkTTFULVEgXAoJLWZvbnQgZm9udF91aQoKIyAtLSBFZGl0IE1lbnUKIwptZW51IC5tYmFyLmVkaXQKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgVW5kbyBcCgktY29tbWFuZCB7Y2F0Y2gge1tmb2N1c10gZWRpdCB1bmRvfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtWiBcCgktZm9udCBmb250X3VpCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIFJlZG8gXAoJLWNvbW1hbmQge2NhdGNoIHtbZm9jdXNdIGVkaXQgcmVkb319IFwKCS1hY2NlbGVyYXRvciAkTTFULVkgXAoJLWZvbnQgZm9udF91aQoubWJhci5lZGl0IGFkZCBzZXBhcmF0b3IKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgQ3V0IFwKCS1jb21tYW5kIHtjYXRjaCB7dGtfdGV4dEN1dCBbZm9jdXNdfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtWCBcCgktZm9udCBmb250X3VpCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIENvcHkgXAoJLWNvbW1hbmQge2NhdGNoIHt0a190ZXh0Q29weSBbZm9jdXNdfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtQyBcCgktZm9udCBmb250X3VpCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIFBhc3RlIFwKCS1jb21tYW5kIHtjYXRjaCB7dGtfdGV4dFBhc3RlIFtmb2N1c107IFtmb2N1c10gc2VlIGluc2VydH19IFwKCS1hY2NlbGVyYXRvciAkTTFULVYgXAoJLWZvbnQgZm9udF91aQoubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBEZWxldGUgXAoJLWNvbW1hbmQge2NhdGNoIHtbZm9jdXNdIGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3R9fSBcCgktYWNjZWxlcmF0b3IgRGVsIFwKCS1mb250IGZvbnRfdWkKLm1iYXIuZWRpdCBhZGQgc2VwYXJhdG9yCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtTZWxlY3QgQWxsfSBcCgktY29tbWFuZCB7Y2F0Y2gge1tmb2N1c10gdGFnIGFkZCBzZWwgMC4wIGVuZH19IFwKCS1hY2NlbGVyYXRvciAkTTFULUEgXAoJLWZvbnQgZm9udF91aQoKIyAtLSBCcmFuY2ggTWVudQojCmlmIHtbaXNfZW5hYmxlZCBicmFuY2hdfSB7CgltZW51IC5tYmFyLmJyYW5jaAoKCS5tYmFyLmJyYW5jaCBhZGQgY29tbWFuZCAtbGFiZWwge0NyZWF0ZS4uLn0gXAoJCS1jb21tYW5kIGRvX2NyZWF0ZV9icmFuY2ggXAoJCS1hY2NlbGVyYXRvciAkTTFULU4gXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFtsaXN0IC5tYmFyLmJyYW5jaCBlbnRyeWNvbmYgXAoJCVsubWJhci5icmFuY2ggaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmJyYW5jaCBhZGQgY29tbWFuZCAtbGFiZWwge0RlbGV0ZS4uLn0gXAoJCS1jb21tYW5kIGRvX2RlbGV0ZV9icmFuY2ggXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFtsaXN0IC5tYmFyLmJyYW5jaCBlbnRyeWNvbmYgXAoJCVsubWJhci5icmFuY2ggaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmJyYW5jaCBhZGQgY29tbWFuZCAtbGFiZWwge1Jlc2V0Li4ufSBcCgkJLWNvbW1hbmQgZG9fcmVzZXRfaGFyZCBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgW2xpc3QgLm1iYXIuYnJhbmNoIGVudHJ5Y29uZiBcCgkJWy5tYmFyLmJyYW5jaCBpbmRleCBsYXN0XSAtc3RhdGVdCn0KCiMgLS0gQ29tbWl0IE1lbnUKIwppZiB7W2lzX2VuYWJsZWQgbXVsdGljb21taXRdIHx8IFtpc19lbmFibGVkIHNpbmdsZWNvbW1pdF19IHsKCW1lbnUgLm1iYXIuY29tbWl0CgoJLm1iYXIuY29tbWl0IGFkZCByYWRpb2J1dHRvbiBcCgkJLWxhYmVsIHtOZXcgQ29tbWl0fSBcCgkJLWNvbW1hbmQgZG9fc2VsZWN0X2NvbW1pdF90eXBlIFwKCQktdmFyaWFibGUgc2VsZWN0ZWRfY29tbWl0X3R5cGUgXAoJCS12YWx1ZSBuZXcgXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgcmFkaW9idXR0b24gXAoJCS1sYWJlbCB7QW1lbmQgTGFzdCBDb21taXR9IFwKCQktY29tbWFuZCBkb19zZWxlY3RfY29tbWl0X3R5cGUgXAoJCS12YXJpYWJsZSBzZWxlY3RlZF9jb21taXRfdHlwZSBcCgkJLXZhbHVlIGFtZW5kIFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIHNlcGFyYXRvcgoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwgUmVzY2FuIFwKCQktY29tbWFuZCBkb19yZXNjYW4gXAoJCS1hY2NlbGVyYXRvciBGNSBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCB7QWRkIFRvIENvbW1pdH0gXAoJCS1jb21tYW5kIGRvX2FkZF9zZWxlY3Rpb24gXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwge0FkZCBFeGlzdGluZyBUbyBDb21taXR9IFwKCQktY29tbWFuZCBkb19hZGRfYWxsIFwKCQktYWNjZWxlcmF0b3IgJE0xVC1JIFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtVbnN0YWdlIEZyb20gQ29tbWl0fSBcCgkJLWNvbW1hbmQgZG9fdW5zdGFnZV9zZWxlY3Rpb24gXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwge1JldmVydCBDaGFuZ2VzfSBcCgkJLWNvbW1hbmQgZG9fcmV2ZXJ0X3NlbGVjdGlvbiBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCBzZXBhcmF0b3IKCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtTaWduIE9mZn0gXAoJCS1jb21tYW5kIGRvX3NpZ25vZmYgXAoJCS1hY2NlbGVyYXRvciAkTTFULVMgXAoJCS1mb250IGZvbnRfdWkKCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIENvbW1pdCBcCgkJLWNvbW1hbmQgZG9fY29tbWl0IFwKCQktYWNjZWxlcmF0b3IgJE0xVC1SZXR1cm4gXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQp9CgojIC0tIE1lcmdlIE1lbnUKIwppZiB7W2lzX2VuYWJsZWQgYnJhbmNoXX0gewoJbWVudSAubWJhci5tZXJnZQoJLm1iYXIubWVyZ2UgYWRkIGNvbW1hbmQgLWxhYmVsIHtMb2NhbCBNZXJnZS4uLn0gXAoJCS1jb21tYW5kIGRvX2xvY2FsX21lcmdlIFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIubWVyZ2UgZW50cnljb25mIFsubWJhci5tZXJnZSBpbmRleCBsYXN0XSAtc3RhdGVdCgkubWJhci5tZXJnZSBhZGQgY29tbWFuZCAtbGFiZWwge0Fib3J0IE1lcmdlLi4ufSBcCgkJLWNvbW1hbmQgZG9fcmVzZXRfaGFyZCBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLm1lcmdlIGVudHJ5Y29uZiBbLm1iYXIubWVyZ2UgaW5kZXggbGFzdF0gLXN0YXRlXQoKfQoKIyAtLSBUcmFuc3BvcnQgTWVudQojCmlmIHtbaXNfZW5hYmxlZCB0cmFuc3BvcnRdfSB7CgltZW51IC5tYmFyLmZldGNoCgoJbWVudSAubWJhci5wdXNoCgkubWJhci5wdXNoIGFkZCBjb21tYW5kIC1sYWJlbCB7UHVzaC4uLn0gXAoJCS1jb21tYW5kIGRvX3B1c2hfYW55d2hlcmUgXAoJCS1mb250IGZvbnRfdWkKfQoKaWYge1tpc19NYWNPU1hdfSB7CgkjIC0tIEFwcGxlIE1lbnUgKE1hYyBPUyBYIG9ubHkpCgkjCgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgQXBwbGUgLW1lbnUgLm1iYXIuYXBwbGUKCW1lbnUgLm1iYXIuYXBwbGUKCgkubWJhci5hcHBsZSBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IFthcHBuYW1lXSIgXAoJCS1jb21tYW5kIGRvX2Fib3V0IFwKCQktZm9udCBmb250X3VpCgkubWJhci5hcHBsZSBhZGQgY29tbWFuZCAtbGFiZWwgIk9wdGlvbnMuLi4iIFwKCQktY29tbWFuZCBkb19vcHRpb25zIFwKCQktZm9udCBmb250X3VpCn0gZWxzZSB7CgkjIC0tIEVkaXQgTWVudQoJIwoJLm1iYXIuZWRpdCBhZGQgc2VwYXJhdG9yCgkubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCB7T3B0aW9ucy4uLn0gXAoJCS1jb21tYW5kIGRvX29wdGlvbnMgXAoJCS1mb250IGZvbnRfdWkKCgkjIC0tIFRvb2xzIE1lbnUKCSMKCWlmIHtbZmlsZSBleGlzdHMgL3Vzci9sb2NhbC9taWdhL2xpYi9ndWktbWlnYV0KCQkmJiBbZmlsZSBleGlzdHMgLnB2Y3NyY119IHsKCXByb2MgZG9fbWlnYSB7fSB7CgkJZ2xvYmFsIHVpX3N0YXR1c192YWx1ZQoJCWlmIHshW2xvY2tfaW5kZXggdXBkYXRlXX0gcmV0dXJuCgkJc2V0IGNtZCBbbGlzdCBzaCAtLWxvZ2luIC1jICIvdXNyL2xvY2FsL21pZ2EvbGliL2d1aS1taWdhIFwiW3B3ZF1cIiJdCgkJc2V0IG1pZ2FfZmQgW29wZW4gInwkY21kIiByXQoJCWZjb25maWd1cmUgJG1pZ2FfZmQgLWJsb2NraW5nIDAKCQlmaWxlZXZlbnQgJG1pZ2FfZmQgcmVhZGFibGUgW2xpc3QgbWlnYV9kb25lICRtaWdhX2ZkXQoJCXNldCB1aV9zdGF0dXNfdmFsdWUge1J1bm5pbmcgbWlnYS4uLn0KCX0KCXByb2MgbWlnYV9kb25lIHtmZH0gewoJCXJlYWQgJGZkIDUxMgoJCWlmIHtbZW9mICRmZF19IHsKCQkJY2xvc2UgJGZkCgkJCXVubG9ja19pbmRleAoJCQlyZXNjYW4gW2xpc3Qgc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufV0KCQl9Cgl9CgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgVG9vbHMgLW1lbnUgLm1iYXIudG9vbHMKCW1lbnUgLm1iYXIudG9vbHMKCS5tYmFyLnRvb2xzIGFkZCBjb21tYW5kIC1sYWJlbCAiTWlncmF0ZSIgXAoJCS1jb21tYW5kIGRvX21pZ2EgXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci50b29scyBlbnRyeWNvbmYgWy5tYmFyLnRvb2xzIGluZGV4IGxhc3RdIC1zdGF0ZV0KCX0KfQoKIyAtLSBIZWxwIE1lbnUKIwoubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgSGVscCAtbWVudSAubWJhci5oZWxwCm1lbnUgLm1iYXIuaGVscAoKaWYgeyFbaXNfTWFjT1NYXX0gewoJLm1iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IFthcHBuYW1lXSIgXAoJCS1jb21tYW5kIGRvX2Fib3V0IFwKCQktZm9udCBmb250X3VpCn0KCnNldCBicm93c2VyIHt9CmNhdGNoIHtzZXQgYnJvd3NlciAkcmVwb19jb25maWcoaW5zdGF3ZWIuYnJvd3Nlcil9CnNldCBkb2NfcGF0aCBbZmlsZSBkaXJuYW1lIFtnaXRleGVjXV0Kc2V0IGRvY19wYXRoIFtmaWxlIGpvaW4gJGRvY19wYXRoIERvY3VtZW50YXRpb24gaW5kZXguaHRtbF0KCmlmIHtbaXNfQ3lnd2luXX0gewoJc2V0IGRvY19wYXRoIFtleGVjIGN5Z3BhdGggLS1taXhlZCAkZG9jX3BhdGhdCn0KCmlmIHskYnJvd3NlciBlcSB7fX0gewoJaWYge1tpc19NYWNPU1hdfSB7CgkJc2V0IGJyb3dzZXIgb3BlbgoJfSBlbHNlaWYge1tpc19DeWd3aW5dfSB7CgkJc2V0IHByb2dyYW1fZmlsZXMgW2ZpbGUgZGlybmFtZSBbZXhlYyBjeWdwYXRoIC0td2luZGlyXV0KCQlzZXQgcHJvZ3JhbV9maWxlcyBbZmlsZSBqb2luICRwcm9ncmFtX2ZpbGVzIHtQcm9ncmFtIEZpbGVzfV0KCQlzZXQgZmlyZWZveCBbZmlsZSBqb2luICRwcm9ncmFtX2ZpbGVzIHtNb3ppbGxhIEZpcmVmb3h9IGZpcmVmb3guZXhlXQoJCXNldCBpZSBbZmlsZSBqb2luICRwcm9ncmFtX2ZpbGVzIHtJbnRlcm5ldCBFeHBsb3Jlcn0gSUVYUExPUkUuRVhFXQoJCWlmIHtbZmlsZSBleGlzdHMgJGZpcmVmb3hdfSB7CgkJCXNldCBicm93c2VyICRmaXJlZm94CgkJfSBlbHNlaWYge1tmaWxlIGV4aXN0cyAkaWVdfSB7CgkJCXNldCBicm93c2VyICRpZQoJCX0KCQl1bnNldCBwcm9ncmFtX2ZpbGVzIGZpcmVmb3ggaWUKCX0KfQoKaWYge1tmaWxlIGlzZmlsZSAkZG9jX3BhdGhdfSB7CglzZXQgZG9jX3VybCAiZmlsZTokZG9jX3BhdGgiCn0gZWxzZSB7CglzZXQgZG9jX3VybCB7aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvfQp9CgppZiB7JGJyb3dzZXIgbmUge319IHsKCS5tYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsIHtPbmxpbmUgRG9jdW1lbnRhdGlvbn0gXAoJCS1jb21tYW5kIFtsaXN0IGV4ZWMgJGJyb3dzZXIgJGRvY191cmwgJl0gXAoJCS1mb250IGZvbnRfdWkKfQp1bnNldCBicm93c2VyIGRvY19wYXRoIGRvY191cmwKCiMgLS0gU3RhbmRhcmQgYmluZGluZ3MKIwpiaW5kIC4gICA8RGVzdHJveT4gZG9fcXVpdApiaW5kIGFsbCA8JE0xQi1LZXktcT4gZG9fcXVpdApiaW5kIGFsbCA8JE0xQi1LZXktUT4gZG9fcXVpdApiaW5kIGFsbCA8JE0xQi1LZXktdz4ge2Rlc3Ryb3kgW3dpbmZvIHRvcGxldmVsICVXXX0KYmluZCBhbGwgPCRNMUItS2V5LVc+IHtkZXN0cm95IFt3aW5mbyB0b3BsZXZlbCAlV119CgojIC0tIE5vdCBhIG5vcm1hbCBjb21taXQgdHlwZSBpbnZvY2F0aW9uPyAgRG8gdGhhdCBpbnN0ZWFkIQojCnN3aXRjaCAtLSAkc3ViY29tbWFuZCB7CmJyb3dzZXIgewoJaWYge1tsbGVuZ3RoICRhcmd2XSAhPSAxfSB7CgkJcHV0cyBzdGRlcnIgInVzYWdlOiAkYXJndjAgYnJvd3NlciBjb21taXQiCgkJZXhpdCAxCgl9CglzZXQgY3VycmVudF9icmFuY2ggW2xpbmRleCAkYXJndiAwXQoJbmV3X2Jyb3dzZXIgJGN1cnJlbnRfYnJhbmNoCglyZXR1cm4KfQpibGFtZSB7CglpZiB7W2xsZW5ndGggJGFyZ3ZdICE9IDJ9IHsKCQlwdXRzIHN0ZGVyciAidXNhZ2U6ICRhcmd2MCBibGFtZSBjb21taXQgcGF0aCIKCQlleGl0IDEKCX0KCXNldCBjdXJyZW50X2JyYW5jaCBbbGluZGV4ICRhcmd2IDBdCglzaG93X2JsYW1lICRjdXJyZW50X2JyYW5jaCBbbGluZGV4ICRhcmd2IDFdCglyZXR1cm4KfQpjaXRvb2wgLQpndWkgewoJaWYge1tsbGVuZ3RoICRhcmd2XSAhPSAwfSB7CgkJcHV0cyAtbm9uZXdsaW5lIHN0ZGVyciAidXNhZ2U6ICRhcmd2MCIKCQlpZiB7JHN1YmNvbW1hbmQgbmUge2d1aX0gJiYgW2FwcG5hbWVdIG5lICJnaXQtJHN1YmNvbW1hbmQifSB7CgkJCXB1dHMgLW5vbmV3bGluZSBzdGRlcnIgIiAkc3ViY29tbWFuZCIKCQl9CgkJcHV0cyBzdGRlcnIge30KCQlleGl0IDEKCX0KCSMgZmFsbCB0aHJvdWdoIHRvIHNldHVwIFVJIGZvciBjb21taXRzCn0KZGVmYXVsdCB7CglwdXRzIHN0ZGVyciAidXNhZ2U6ICRhcmd2MCBcW3tibGFtZXxicm93c2VyfGNpdG9vbH1cXSIKCWV4aXQgMQp9Cn0KCiMgLS0gQnJhbmNoIENvbnRyb2wKIwpmcmFtZSAuYnJhbmNoIFwKCS1ib3JkZXJ3aWR0aCAxIFwKCS1yZWxpZWYgc3Vua2VuCmxhYmVsIC5icmFuY2gubDEgXAoJLXRleHQge0N1cnJlbnQgQnJhbmNoOn0gXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpsYWJlbCAuYnJhbmNoLmNiIFwKCS10ZXh0dmFyaWFibGUgY3VycmVudF9icmFuY2ggXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpwYWNrIC5icmFuY2gubDEgLXNpZGUgbGVmdApwYWNrIC5icmFuY2guY2IgLXNpZGUgbGVmdCAtZmlsbCB4CnBhY2sgLmJyYW5jaCAtc2lkZSB0b3AgLWZpbGwgeAoKIyAtLSBNYWluIFdpbmRvdyBMYXlvdXQKIwpwYW5lZHdpbmRvdyAudnBhbmUgLW9yaWVudCB2ZXJ0aWNhbApwYW5lZHdpbmRvdyAudnBhbmUuZmlsZXMgLW9yaWVudCBob3Jpem9udGFsCi52cGFuZSBhZGQgLnZwYW5lLmZpbGVzIC1zdGlja3kgbnNldyAtaGVpZ2h0IDEwMCAtd2lkdGggMjAwCnBhY2sgLnZwYW5lIC1hbmNob3IgbiAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKCiMgLS0gSW5kZXggRmlsZSBMaXN0CiMKZnJhbWUgLnZwYW5lLmZpbGVzLmluZGV4IC1oZWlnaHQgMTAwIC13aWR0aCAyMDAKbGFiZWwgLnZwYW5lLmZpbGVzLmluZGV4LnRpdGxlIC10ZXh0IHtDaGFuZ2VzIFRvIEJlIENvbW1pdHRlZH0gXAoJLWJhY2tncm91bmQgZ3JlZW4gXAoJLWZvbnQgZm9udF91aQp0ZXh0ICR1aV9pbmRleCAtYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgktd2lkdGggMjAgLWhlaWdodCAxMCBcCgktd3JhcCBub25lIFwKCS1mb250IGZvbnRfdWkgXAoJLWN1cnNvciAkY3Vyc29yX3B0ciBcCgkteHNjcm9sbGNvbW1hbmQgey52cGFuZS5maWxlcy5pbmRleC5zeCBzZXR9IFwKCS15c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmZpbGVzLmluZGV4LnN5IHNldH0gXAoJLXN0YXRlIGRpc2FibGVkCnNjcm9sbGJhciAudnBhbmUuZmlsZXMuaW5kZXguc3ggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR1aV9pbmRleCB4dmlld10Kc2Nyb2xsYmFyIC52cGFuZS5maWxlcy5pbmRleC5zeSAtb3JpZW50IHYgLWNvbW1hbmQgW2xpc3QgJHVpX2luZGV4IHl2aWV3XQpwYWNrIC52cGFuZS5maWxlcy5pbmRleC50aXRsZSAtc2lkZSB0b3AgLWZpbGwgeApwYWNrIC52cGFuZS5maWxlcy5pbmRleC5zeCAtc2lkZSBib3R0b20gLWZpbGwgeApwYWNrIC52cGFuZS5maWxlcy5pbmRleC5zeSAtc2lkZSByaWdodCAtZmlsbCB5CnBhY2sgJHVpX2luZGV4IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKLnZwYW5lLmZpbGVzIGFkZCAudnBhbmUuZmlsZXMuaW5kZXggLXN0aWNreSBuc2V3CgojIC0tIFdvcmtpbmcgRGlyZWN0b3J5IEZpbGUgTGlzdAojCmZyYW1lIC52cGFuZS5maWxlcy53b3JrZGlyIC1oZWlnaHQgMTAwIC13aWR0aCAyMDAKbGFiZWwgLnZwYW5lLmZpbGVzLndvcmtkaXIudGl0bGUgLXRleHQge0NoYW5nZWQgQnV0IE5vdCBVcGRhdGVkfSBcCgktYmFja2dyb3VuZCByZWQgXAoJLWZvbnQgZm9udF91aQp0ZXh0ICR1aV93b3JrZGlyIC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCS13aWR0aCAyMCAtaGVpZ2h0IDEwIFwKCS13cmFwIG5vbmUgXAoJLWZvbnQgZm9udF91aSBcCgktY3Vyc29yICRjdXJzb3JfcHRyIFwKCS14c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmZpbGVzLndvcmtkaXIuc3ggc2V0fSBcCgkteXNjcm9sbGNvbW1hbmQgey52cGFuZS5maWxlcy53b3JrZGlyLnN5IHNldH0gXAoJLXN0YXRlIGRpc2FibGVkCnNjcm9sbGJhciAudnBhbmUuZmlsZXMud29ya2Rpci5zeCAtb3JpZW50IGggLWNvbW1hbmQgW2xpc3QgJHVpX3dvcmtkaXIgeHZpZXddCnNjcm9sbGJhciAudnBhbmUuZmlsZXMud29ya2Rpci5zeSAtb3JpZW50IHYgLWNvbW1hbmQgW2xpc3QgJHVpX3dvcmtkaXIgeXZpZXddCnBhY2sgLnZwYW5lLmZpbGVzLndvcmtkaXIudGl0bGUgLXNpZGUgdG9wIC1maWxsIHgKcGFjayAudnBhbmUuZmlsZXMud29ya2Rpci5zeCAtc2lkZSBib3R0b20gLWZpbGwgeApwYWNrIC52cGFuZS5maWxlcy53b3JrZGlyLnN5IC1zaWRlIHJpZ2h0IC1maWxsIHkKcGFjayAkdWlfd29ya2RpciAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCi52cGFuZS5maWxlcyBhZGQgLnZwYW5lLmZpbGVzLndvcmtkaXIgLXN0aWNreSBuc2V3Cgpmb3JlYWNoIGkgW2xpc3QgJHVpX2luZGV4ICR1aV93b3JrZGlyXSB7CgkkaSB0YWcgY29uZiBpbl9kaWZmIC1mb250IGZvbnRfdWlib2xkCgkkaSB0YWcgY29uZiBpbl9zZWwgXAoJCS1iYWNrZ3JvdW5kIFskaSBjZ2V0IC1mb3JlZ3JvdW5kXSBcCgkJLWZvcmVncm91bmQgWyRpIGNnZXQgLWJhY2tncm91bmRdCn0KdW5zZXQgaQoKIyAtLSBEaWZmIGFuZCBDb21taXQgQXJlYQojCmZyYW1lIC52cGFuZS5sb3dlciAtaGVpZ2h0IDMwMCAtd2lkdGggNDAwCmZyYW1lIC52cGFuZS5sb3dlci5jb21tYXJlYQpmcmFtZSAudnBhbmUubG93ZXIuZGlmZiAtcmVsaWVmIHN1bmtlbiAtYm9yZGVyd2lkdGggMQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYSAtc2lkZSB0b3AgLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5kaWZmIC1zaWRlIGJvdHRvbSAtZmlsbCBib3RoIC1leHBhbmQgMQoudnBhbmUgYWRkIC52cGFuZS5sb3dlciAtc3RpY2t5IG5zZXcKCiMgLS0gQ29tbWl0IEFyZWEgQnV0dG9ucwojCmZyYW1lIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zCmxhYmVsIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmwgLXRleHQge30gXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmwgLXNpZGUgdG9wIC1maWxsIHgKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucyAtc2lkZSBsZWZ0IC1maWxsIHkKCmJ1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5yZXNjYW4gLXRleHQge1Jlc2Nhbn0gXAoJLWNvbW1hbmQgZG9fcmVzY2FuIFwKCS1mb250IGZvbnRfdWkKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5yZXNjYW4gLXNpZGUgdG9wIC1maWxsIHgKbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJey52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnJlc2NhbiBjb25mIC1zdGF0ZX0KCmJ1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5pbmNhbGwgLXRleHQge0FkZCBFeGlzdGluZ30gXAoJLWNvbW1hbmQgZG9fYWRkX2FsbCBcCgktZm9udCBmb250X3VpCnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuaW5jYWxsIC1zaWRlIHRvcCAtZmlsbCB4CmxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCXsudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5pbmNhbGwgY29uZiAtc3RhdGV9CgpidXR0b24gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuc2lnbm9mZiAtdGV4dCB7U2lnbiBPZmZ9IFwKCS1jb21tYW5kIGRvX3NpZ25vZmYgXAoJLWZvbnQgZm9udF91aQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnNpZ25vZmYgLXNpZGUgdG9wIC1maWxsIHgKCmJ1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5jb21taXQgLXRleHQge0NvbW1pdH0gXAoJLWNvbW1hbmQgZG9fY29tbWl0IFwKCS1mb250IGZvbnRfdWkKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5jb21taXQgLXNpZGUgdG9wIC1maWxsIHgKbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJey52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmNvbW1pdCBjb25mIC1zdGF0ZX0KCiMgLS0gQ29tbWl0IE1lc3NhZ2UgQnVmZmVyCiMKZnJhbWUgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlcgpmcmFtZSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlcgpzZXQgdWlfY29tbSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLnQKc2V0IHVpX2NvbWwgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIubApyYWRpb2J1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5uZXcgXAoJLXRleHQge05ldyBDb21taXR9IFwKCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCgktdmFyaWFibGUgc2VsZWN0ZWRfY29tbWl0X3R5cGUgXAoJLXZhbHVlIG5ldyBcCgktZm9udCBmb250X3VpCmxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCVtsaXN0IC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLm5ldyBjb25mIC1zdGF0ZV0KcmFkaW9idXR0b24gLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIuYW1lbmQgXAoJLXRleHQge0FtZW5kIExhc3QgQ29tbWl0fSBcCgktY29tbWFuZCBkb19zZWxlY3RfY29tbWl0X3R5cGUgXAoJLXZhcmlhYmxlIHNlbGVjdGVkX2NvbW1pdF90eXBlIFwKCS12YWx1ZSBhbWVuZCBcCgktZm9udCBmb250X3VpCmxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCVtsaXN0IC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLmFtZW5kIGNvbmYgLXN0YXRlXQpsYWJlbCAkdWlfY29tbCBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdCBcCgktZm9udCBmb250X3VpCnByb2MgdHJhY2VfY29tbWl0X3R5cGUge3Zhcm5hbWUgYXJnc30gewoJZ2xvYmFsIHVpX2NvbWwgY29tbWl0X3R5cGUKCXN3aXRjaCAtZ2xvYiAtLSAkY29tbWl0X3R5cGUgewoJaW5pdGlhbCAgICAgICB7c2V0IHR4dCB7SW5pdGlhbCBDb21taXQgTWVzc2FnZTp9fQoJYW1lbmQgICAgICAgICB7c2V0IHR4dCB7QW1lbmRlZCBDb21taXQgTWVzc2FnZTp9fQoJYW1lbmQtaW5pdGlhbCB7c2V0IHR4dCB7QW1lbmRlZCBJbml0aWFsIENvbW1pdCBNZXNzYWdlOn19CglhbWVuZC1tZXJnZSAgIHtzZXQgdHh0IHtBbWVuZGVkIE1lcmdlIENvbW1pdCBNZXNzYWdlOn19CgltZXJnZSAgICAgICAgIHtzZXQgdHh0IHtNZXJnZSBDb21taXQgTWVzc2FnZTp9fQoJKiAgICAgICAgICAgICB7c2V0IHR4dCB7Q29tbWl0IE1lc3NhZ2U6fX0KCX0KCSR1aV9jb21sIGNvbmYgLXRleHQgJHR4dAp9CnRyYWNlIGFkZCB2YXJpYWJsZSBjb21taXRfdHlwZSB3cml0ZSB0cmFjZV9jb21taXRfdHlwZQpwYWNrICR1aV9jb21sIC1zaWRlIGxlZnQgLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLmFtZW5kIC1zaWRlIHJpZ2h0CnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIubmV3IC1zaWRlIHJpZ2h0Cgp0ZXh0ICR1aV9jb21tIC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAxIFwKCS11bmRvIHRydWUgXAoJLW1heHVuZG8gMjAgXAoJLWF1dG9zZXBhcmF0b3JzIHRydWUgXAoJLXJlbGllZiBzdW5rZW4gXAoJLXdpZHRoIDc1IC1oZWlnaHQgOSAtd3JhcCBub25lIFwKCS1mb250IGZvbnRfZGlmZiBcCgkteXNjcm9sbGNvbW1hbmQgey52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuc2J5IHNldH0Kc2Nyb2xsYmFyIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuc2J5IFwKCS1jb21tYW5kIFtsaXN0ICR1aV9jb21tIHl2aWV3XQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQpwYWNrICR1aV9jb21tIC1zaWRlIGxlZnQgLWZpbGwgeQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIgLXNpZGUgbGVmdCAtZmlsbCB5CgojIC0tIENvbW1pdCBNZXNzYWdlIEJ1ZmZlciBDb250ZXh0IE1lbnUKIwpzZXQgY3R4bSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmN0eG0KbWVudSAkY3R4bSAtdGVhcm9mZiAwCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7Q3V0fSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHt0a190ZXh0Q3V0ICR1aV9jb21tfQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHl9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQge3RrX3RleHRDb3B5ICR1aV9jb21tfQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Bhc3RlfSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHt0a190ZXh0UGFzdGUgJHVpX2NvbW19CiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7RGVsZXRlfSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHskdWlfY29tbSBkZWxldGUgc2VsLmZpcnN0IHNlbC5sYXN0fQokY3R4bSBhZGQgc2VwYXJhdG9yCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7U2VsZWN0IEFsbH0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7Zm9jdXMgJHVpX2NvbW07JHVpX2NvbW0gdGFnIGFkZCBzZWwgMC4wIGVuZH0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtDb3B5IEFsbH0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7CgkJJHVpX2NvbW0gdGFnIGFkZCBzZWwgMC4wIGVuZAoJCXRrX3RleHRDb3B5ICR1aV9jb21tCgkJJHVpX2NvbW0gdGFnIHJlbW92ZSBzZWwgMC4wIGVuZAoJfQokY3R4bSBhZGQgc2VwYXJhdG9yCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7U2lnbiBPZmZ9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQgZG9fc2lnbm9mZgpiaW5kX2J1dHRvbjMgJHVpX2NvbW0gInRrX3BvcHVwICRjdHhtICVYICVZIgoKIyAtLSBEaWZmIEhlYWRlcgojCnByb2MgdHJhY2VfY3VycmVudF9kaWZmX3BhdGgge3Zhcm5hbWUgYXJnc30gewoJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIGRpZmZfYWN0aW9ucyBmaWxlX3N0YXRlcwoJaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBlcSB7fX0gewoJCXNldCBzIHt9CgkJc2V0IGYge30KCQlzZXQgcCB7fQoJCXNldCBvIGRpc2FibGVkCgl9IGVsc2UgewoJCXNldCBwICRjdXJyZW50X2RpZmZfcGF0aAoJCXNldCBzIFttYXBkZXNjIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwKSAwXSAkcF0KCQlzZXQgZiB7RmlsZTp9CgkJc2V0IHAgW2VzY2FwZV9wYXRoICRwXQoJCXNldCBvIG5vcm1hbAoJfQoKCS52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5zdGF0dXMgY29uZmlndXJlIC10ZXh0ICRzCgkudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuZmlsZSBjb25maWd1cmUgLXRleHQgJGYKCS52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5wYXRoIGNvbmZpZ3VyZSAtdGV4dCAkcAoJZm9yZWFjaCB3ICRkaWZmX2FjdGlvbnMgewoJCXVwbGV2ZWwgIzAgJHcgJG8KCX0KfQp0cmFjZSBhZGQgdmFyaWFibGUgY3VycmVudF9kaWZmX3BhdGggd3JpdGUgdHJhY2VfY3VycmVudF9kaWZmX3BhdGgKCmZyYW1lIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlciAtYmFja2dyb3VuZCBvcmFuZ2UKbGFiZWwgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnN0YXR1cyBcCgktYmFja2dyb3VuZCBvcmFuZ2UgXAoJLXdpZHRoICRtYXhfc3RhdHVzX2Rlc2MgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpsYWJlbCAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuZmlsZSBcCgktYmFja2dyb3VuZCBvcmFuZ2UgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpsYWJlbCAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIucGF0aCBcCgktYmFja2dyb3VuZCBvcmFuZ2UgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWZvbnQgZm9udF91aQpwYWNrIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5zdGF0dXMgLXNpZGUgbGVmdApwYWNrIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5maWxlIC1zaWRlIGxlZnQKcGFjayAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIucGF0aCAtZmlsbCB4CnNldCBjdHhtIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5jdHhtCm1lbnUgJGN0eG0gLXRlYXJvZmYgMAokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHl9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQgewoJCWNsaXBib2FyZCBjbGVhcgoJCWNsaXBib2FyZCBhcHBlbmQgXAoJCQktZm9ybWF0IFNUUklORyBcCgkJCS10eXBlIFNUUklORyBcCgkJCS0tICRjdXJyZW50X2RpZmZfcGF0aAoJfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KYmluZF9idXR0b24zIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5wYXRoICJ0a19wb3B1cCAkY3R4bSAlWCAlWSIKCiMgLS0gRGlmZiBCb2R5CiMKZnJhbWUgLnZwYW5lLmxvd2VyLmRpZmYuYm9keQpzZXQgdWlfZGlmZiAudnBhbmUubG93ZXIuZGlmZi5ib2R5LnQKdGV4dCAkdWlfZGlmZiAtYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgktd2lkdGggODAgLWhlaWdodCAxNSAtd3JhcCBub25lIFwKCS1mb250IGZvbnRfZGlmZiBcCgkteHNjcm9sbGNvbW1hbmQgey52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J4IHNldH0gXAoJLXlzY3JvbGxjb21tYW5kIHsudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieSBzZXR9IFwKCS1zdGF0ZSBkaXNhYmxlZApzY3JvbGxiYXIgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnggLW9yaWVudCBob3Jpem9udGFsIFwKCS1jb21tYW5kIFtsaXN0ICR1aV9kaWZmIHh2aWV3XQpzY3JvbGxiYXIgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnkgLW9yaWVudCB2ZXJ0aWNhbCBcCgktY29tbWFuZCBbbGlzdCAkdWlfZGlmZiB5dmlld10KcGFjayAudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieCAtc2lkZSBib3R0b20gLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKcGFjayAkdWlfZGlmZiAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYuYm9keSAtc2lkZSBib3R0b20gLWZpbGwgYm90aCAtZXhwYW5kIDEKCiR1aV9kaWZmIHRhZyBjb25mIGRfY3IgLWVsaWRlIHRydWUKJHVpX2RpZmYgdGFnIGNvbmYgZF9AIC1mb3JlZ3JvdW5kIGJsdWUgLWZvbnQgZm9udF9kaWZmYm9sZAokdWlfZGlmZiB0YWcgY29uZiBkXysgLWZvcmVncm91bmQgeyMwMGEwMDB9CiR1aV9kaWZmIHRhZyBjb25mIGRfLSAtZm9yZWdyb3VuZCByZWQKCiR1aV9kaWZmIHRhZyBjb25mIGRfKysgLWZvcmVncm91bmQgeyMwMGEwMDB9CiR1aV9kaWZmIHRhZyBjb25mIGRfLS0gLWZvcmVncm91bmQgcmVkCiR1aV9kaWZmIHRhZyBjb25mIGRfK3MgXAoJLWZvcmVncm91bmQgeyMwMGEwMDB9IFwKCS1iYWNrZ3JvdW5kIHsjZTJlZmZhfQokdWlfZGlmZiB0YWcgY29uZiBkXy1zIFwKCS1mb3JlZ3JvdW5kIHJlZCBcCgktYmFja2dyb3VuZCB7I2UyZWZmYX0KJHVpX2RpZmYgdGFnIGNvbmYgZF9zKyBcCgktZm9yZWdyb3VuZCB7IzAwYTAwMH0gXAoJLWJhY2tncm91bmQgaXZvcnkxCiR1aV9kaWZmIHRhZyBjb25mIGRfcy0gXAoJLWZvcmVncm91bmQgcmVkIFwKCS1iYWNrZ3JvdW5kIGl2b3J5MQoKJHVpX2RpZmYgdGFnIGNvbmYgZDw8PDw8PDwgXAoJLWZvcmVncm91bmQgb3JhbmdlIFwKCS1mb250IGZvbnRfZGlmZmJvbGQKJHVpX2RpZmYgdGFnIGNvbmYgZD09PT09PT0gXAoJLWZvcmVncm91bmQgb3JhbmdlIFwKCS1mb250IGZvbnRfZGlmZmJvbGQKJHVpX2RpZmYgdGFnIGNvbmYgZD4+Pj4+Pj4gXAoJLWZvcmVncm91bmQgb3JhbmdlIFwKCS1mb250IGZvbnRfZGlmZmJvbGQKCiR1aV9kaWZmIHRhZyByYWlzZSBzZWwKCiMgLS0gRGlmZiBCb2R5IENvbnRleHQgTWVudQojCnNldCBjdHhtIC52cGFuZS5sb3dlci5kaWZmLmJvZHkuY3R4bQptZW51ICRjdHhtIC10ZWFyb2ZmIDAKJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtSZWZyZXNofSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHJlc2hvd19kaWZmCmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHl9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQge3RrX3RleHRDb3B5ICR1aV9kaWZmfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtTZWxlY3QgQWxsfSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHtmb2N1cyAkdWlfZGlmZjskdWlfZGlmZiB0YWcgYWRkIHNlbCAwLjAgZW5kfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtDb3B5IEFsbH0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7CgkJJHVpX2RpZmYgdGFnIGFkZCBzZWwgMC4wIGVuZAoJCXRrX3RleHRDb3B5ICR1aV9kaWZmCgkJJHVpX2RpZmYgdGFnIHJlbW92ZSBzZWwgMC4wIGVuZAoJfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0FwcGx5L1JldmVyc2UgSHVua30gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7YXBwbHlfaHVuayAkY3Vyc29yWCAkY3Vyc29yWX0Kc2V0IHVpX2RpZmZfYXBwbHlodW5rIFskY3R4bSBpbmRleCBsYXN0XQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgJHVpX2RpZmZfYXBwbHlodW5rIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0RlY3JlYXNlIEZvbnQgU2l6ZX0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7aW5jcl9mb250X3NpemUgZm9udF9kaWZmIC0xfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtJbmNyZWFzZSBGb250IFNpemV9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQge2luY3JfZm9udF9zaXplIGZvbnRfZGlmZiAxfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Nob3cgTGVzcyBDb250ZXh0fSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHtpZiB7JHJlcG9fY29uZmlnKGd1aS5kaWZmY29udGV4dCkgPj0gMn0gewoJCWluY3IgcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSAtMQoJCXJlc2hvd19kaWZmCgl9fQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtTaG93IE1vcmUgQ29udGV4dH0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7CgkJaW5jciByZXBvX2NvbmZpZyhndWkuZGlmZmNvbnRleHQpCgkJcmVzaG93X2RpZmYKCX0KbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCiRjdHhtIGFkZCBzZXBhcmF0b3IKJGN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsIHtPcHRpb25zLi4ufSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIGRvX29wdGlvbnMKYmluZF9idXR0b24zICR1aV9kaWZmICIKCXNldCBjdXJzb3JYICV4CglzZXQgY3Vyc29yWSAleQoJaWYge1wkdWlfaW5kZXggZXEgXCRjdXJyZW50X2RpZmZfc2lkZX0gewoJCSRjdHhtIGVudHJ5Y29uZiAkdWlfZGlmZl9hcHBseWh1bmsgLWxhYmVsIHtVbnN0YWdlIEh1bmsgRnJvbSBDb21taXR9Cgl9IGVsc2UgewoJCSRjdHhtIGVudHJ5Y29uZiAkdWlfZGlmZl9hcHBseWh1bmsgLWxhYmVsIHtTdGFnZSBIdW5rIEZvciBDb21taXR9Cgl9Cgl0a19wb3B1cCAkY3R4bSAlWCAlWQoiCnVuc2V0IHVpX2RpZmZfYXBwbHlodW5rCgojIC0tIFN0YXR1cyBCYXIKIwpsYWJlbCAuc3RhdHVzIC10ZXh0dmFyaWFibGUgdWlfc3RhdHVzX3ZhbHVlIFwKCS1hbmNob3IgdyBcCgktanVzdGlmeSBsZWZ0IFwKCS1ib3JkZXJ3aWR0aCAxIFwKCS1yZWxpZWYgc3Vua2VuIFwKCS1mb250IGZvbnRfdWkKcGFjayAuc3RhdHVzIC1hbmNob3IgdyAtc2lkZSBib3R0b20gLWZpbGwgeAoKIyAtLSBMb2FkIGdlb21ldHJ5CiMKY2F0Y2ggewpzZXQgZ20gJHJlcG9fY29uZmlnKGd1aS5nZW9tZXRyeSkKd20gZ2VvbWV0cnkgLiBbbGluZGV4ICRnbSAwXQoudnBhbmUgc2FzaCBwbGFjZSAwIFwKCVtsaW5kZXggWy52cGFuZSBzYXNoIGNvb3JkIDBdIDBdIFwKCVtsaW5kZXggJGdtIDFdCi52cGFuZS5maWxlcyBzYXNoIHBsYWNlIDAgXAoJW2xpbmRleCAkZ20gMl0gXAoJW2xpbmRleCBbLnZwYW5lLmZpbGVzIHNhc2ggY29vcmQgMF0gMV0KdW5zZXQgZ20KfQoKIyAtLSBLZXkgQmluZGluZ3MKIwpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1SZXR1cm4+IHtkb19jb21taXQ7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LWk+IHtkb19hZGRfYWxsO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1JPiB7ZG9fYWRkX2FsbDticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXkteD4ge3RrX3RleHRDdXQgJVc7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LVg+IHt0a190ZXh0Q3V0ICVXO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1jPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LUM+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktdj4ge3RrX3RleHRQYXN0ZSAlVzsgJVcgc2VlIGluc2VydDsgYnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LVY+IHt0a190ZXh0UGFzdGUgJVc7ICVXIHNlZSBpbnNlcnQ7IGJyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1hPiB7JVcgdGFnIGFkZCBzZWwgMC4wIGVuZDticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktQT4geyVXIHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWt9CgpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS14PiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LVg+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktYz4ge3RrX3RleHRDb3B5ICVXO2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1DPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LXY+IHticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktVj4ge2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1hPiB7JVcgdGFnIGFkZCBzZWwgMC4wIGVuZDticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktQT4geyVXIHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEtleS1VcD4gICAgIHtjYXRjaCB7JVcgeXZpZXcgc2Nyb2xsIC0xIHVuaXRzfTticmVha30KYmluZCAkdWlfZGlmZiA8S2V5LURvd24+ICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxLZXktTGVmdD4gICB7Y2F0Y2ggeyVXIHh2aWV3IHNjcm9sbCAtMSB1bml0c307YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEtleS1SaWdodD4gIHtjYXRjaCB7JVcgeHZpZXcgc2Nyb2xsICAxIHVuaXRzfTticmVha30KYmluZCAkdWlfZGlmZiA8QnV0dG9uLTE+ICAge2ZvY3VzICVXfQoKaWYge1tpc19lbmFibGVkIGJyYW5jaF19IHsKCWJpbmQgLiA8JE0xQi1LZXktbj4gZG9fY3JlYXRlX2JyYW5jaAoJYmluZCAuIDwkTTFCLUtleS1OPiBkb19jcmVhdGVfYnJhbmNoCn0KCmJpbmQgYWxsIDxLZXktRjU+IGRvX3Jlc2NhbgpiaW5kIGFsbCA8JE0xQi1LZXktcj4gZG9fcmVzY2FuCmJpbmQgYWxsIDwkTTFCLUtleS1SPiBkb19yZXNjYW4KYmluZCAuICAgPCRNMUItS2V5LXM+IGRvX3NpZ25vZmYKYmluZCAuICAgPCRNMUItS2V5LVM+IGRvX3NpZ25vZmYKYmluZCAuICAgPCRNMUItS2V5LWk+IGRvX2FkZF9hbGwKYmluZCAuICAgPCRNMUItS2V5LUk+IGRvX2FkZF9hbGwKYmluZCAuICAgPCRNMUItS2V5LVJldHVybj4gZG9fY29tbWl0CmZvcmVhY2ggaSBbbGlzdCAkdWlfaW5kZXggJHVpX3dvcmtkaXJdIHsKCWJpbmQgJGkgPEJ1dHRvbi0xPiAgICAgICAidG9nZ2xlX29yX2RpZmYgICAgICAgICAkaSAleCAleTsgYnJlYWsiCgliaW5kICRpIDwkTTFCLUJ1dHRvbi0xPiAgImFkZF9vbmVfdG9fc2VsZWN0aW9uICAgJGkgJXggJXk7IGJyZWFrIgoJYmluZCAkaSA8U2hpZnQtQnV0dG9uLTE+ICJhZGRfcmFuZ2VfdG9fc2VsZWN0aW9uICRpICV4ICV5OyBicmVhayIKfQp1bnNldCBpCgpzZXQgZmlsZV9saXN0cygkdWlfaW5kZXgpIFtsaXN0XQpzZXQgZmlsZV9saXN0cygkdWlfd29ya2RpcikgW2xpc3RdCgp3bSB0aXRsZSAuICJbYXBwbmFtZV0gKFtmaWxlIG5vcm1hbGl6ZSBbZmlsZSBkaXJuYW1lIFtnaXRkaXJdXV0pIgpmb2N1cyAtZm9yY2UgJHVpX2NvbW0KCiMgLS0gV2FybiB0aGUgdXNlciBhYm91dCBlbnZpcm9ubWVudGFsIHByb2JsZW1zLiAgQ3lnd2luJ3MgVGNsCiMgICAgZG9lcyAqbm90KiBwYXNzIGl0cyBlbnYgYXJyYXkgb250byBhbnkgcHJvY2Vzc2VzIGl0IHNwYXducy4KIyAgICBUaGlzIG1lYW5zIHRoYXQgZ2l0IHByb2Nlc3NlcyBnZXQgbm9uZSBvZiBvdXIgZW52aXJvbm1lbnQuCiMKaWYge1tpc19DeWd3aW5dfSB7CglzZXQgaWdub3JlZF9lbnYgMAoJc2V0IHN1Z2dlc3RfdXNlciB7fQoJc2V0IG1zZyAiUG9zc2libGUgZW52aXJvbm1lbnQgaXNzdWVzIGV4aXN0LgoKVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb2JhYmx5CmdvaW5nIHRvIGJlIGlnbm9yZWQgYnkgYW55IEdpdCBzdWJwcm9jZXNzIHJ1bgpieSBbYXBwbmFtZV06CgoiCglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGVudl0gewoJCXN3aXRjaCAtcmVnZXhwIC0tICRuYW1lIHsKCQl7XkdJVF9JTkRFWF9GSUxFJH0gLQoJCXteR0lUX09CSkVDVF9ESVJFQ1RPUlkkfSAtCgkJe15HSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUyR9IC0KCQl7XkdJVF9ESUZGX09QVFMkfSAtCgkJe15HSVRfRVhURVJOQUxfRElGRiR9IC0KCQl7XkdJVF9QQUdFUiR9IC0KCQl7XkdJVF9UUkFDRSR9IC0KCQl7XkdJVF9DT05GSUckfSAtCgkJe15HSVRfQ09ORklHX0xPQ0FMJH0gLQoJCXteR0lUXyhBVVRIT1J8Q09NTUlUVEVSKV9EQVRFJH0gewoJCQlhcHBlbmQgbXNnICIgLSAkbmFtZVxuIgoJCQlpbmNyIGlnbm9yZWRfZW52CgkJfQoJCXteR0lUXyhBVVRIT1J8Q09NTUlUVEVSKV8oTkFNRXxFTUFJTCkkfSB7CgkJCWFwcGVuZCBtc2cgIiAtICRuYW1lXG4iCgkJCWluY3IgaWdub3JlZF9lbnYKCQkJc2V0IHN1Z2dlc3RfdXNlciAkbmFtZQoJCX0KCQl9Cgl9CglpZiB7JGlnbm9yZWRfZW52ID4gMH0gewoJCWFwcGVuZCBtc2cgIgpUaGlzIGlzIGR1ZSB0byBhIGtub3duIGlzc3VlIHdpdGggdGhlClRjbCBiaW5hcnkgZGlzdHJpYnV0ZWQgYnkgQ3lnd2luLiIKCgkJaWYgeyRzdWdnZXN0X3VzZXIgbmUge319IHsKCQkJYXBwZW5kIG1zZyAiCgpBIGdvb2QgcmVwbGFjZW1lbnQgZm9yICRzdWdnZXN0X3VzZXIKaXMgcGxhY2luZyB2YWx1ZXMgZm9yIHRoZSB1c2VyLm5hbWUgYW5kCnVzZXIuZW1haWwgc2V0dGluZ3MgaW50byB5b3VyIHBlcnNvbmFsCn4vLmdpdGNvbmZpZyBmaWxlLgoiCgkJfQoJCXdhcm5fcG9wdXAgJG1zZwoJfQoJdW5zZXQgaWdub3JlZF9lbnYgbXNnIHN1Z2dlc3RfdXNlciBuYW1lCn0KCiMgLS0gT25seSBpbml0aWFsaXplIGNvbXBsZXggVUkgaWYgd2UgYXJlIGdvaW5nIHRvIHN0YXkgcnVubmluZy4KIwppZiB7W2lzX2VuYWJsZWQgdHJhbnNwb3J0XX0gewoJbG9hZF9hbGxfcmVtb3RlcwoJbG9hZF9hbGxfaGVhZHMKCglwb3B1bGF0ZV9icmFuY2hfbWVudQoJcG9wdWxhdGVfZmV0Y2hfbWVudQoJcG9wdWxhdGVfcHVzaF9tZW51Cn0KCiMgLS0gT25seSBzdWdnZXN0IGEgZ2MgcnVuIGlmIHdlIGFyZSBnb2luZyB0byBzdGF5IHJ1bm5pbmcuCiMKaWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XX0gewoJc2V0IG9iamVjdF9saW1pdCAyMDAwCglpZiB7W2lzX1dpbmRvd3NdfSB7c2V0IG9iamVjdF9saW1pdCAyMDB9CglyZWdleHAge14oWzAtOV0rKSBvYmplY3RzLH0gW2dpdCBjb3VudC1vYmplY3RzXSBfanVuayBvYmplY3RzX2N1cnJlbnQKCWlmIHskb2JqZWN0c19jdXJyZW50ID49ICRvYmplY3RfbGltaXR9IHsKCQlpZiB7W2Fza19wb3B1cCBcCgkJCSJUaGlzIHJlcG9zaXRvcnkgY3VycmVudGx5IGhhcyAkb2JqZWN0c19jdXJyZW50IGxvb3NlIG9iamVjdHMuCgpUbyBtYWludGFpbiBvcHRpbWFsIHBlcmZvcm1hbmNlIGl0IGlzIHN0cm9uZ2x5CnJlY29tbWVuZGVkIHRoYXQgeW91IGNvbXByZXNzIHRoZSBkYXRhYmFzZQp3aGVuIG1vcmUgdGhhbiAkb2JqZWN0X2xpbWl0IGxvb3NlIG9iamVjdHMgZXhpc3QuCgpDb21wcmVzcyB0aGUgZGF0YWJhc2Ugbm93PyJdIGVxIHllc30gewoJCQlkb19nYwoJCX0KCX0KCXVuc2V0IG9iamVjdF9saW1pdCBfanVuayBvYmplY3RzX2N1cnJlbnQKfQoKbG9ja19pbmRleCBiZWdpbi1yZWFkCmFmdGVyIDEgZG9fcmVzY2FuCg==