IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCnNldCBhcHB2ZXJzIHtAQEdJVEdVSV9WRVJTSU9OQEB9CnNldCBjb3B5cmlnaHQgewpDb3B5cmlnaHQgqSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZSwgZXQuIGFsLgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBjb25maWd1cmUgb3VyIGxpYnJhcnkKCnNldCBvZ3VpbGliIHtAQEdJVEdVSV9MSUJESVJAQH0Kc2V0IG9ndWlyZWwge0BAR0lUR1VJX1JFTEFUSVZFQEB9CmlmIHskb2d1aXJlbCBlcSB7MX19IHsKCXNldCBvZ3VpbGliIFtmaWxlIGRpcm5hbWUgW2ZpbGUgZGlybmFtZSBbZmlsZSBub3JtYWxpemUgJGFyZ3YwXV1dCglzZXQgb2d1aWxpYiBbZmlsZSBqb2luICRvZ3VpbGliIHNoYXJlIGdpdC1ndWkgbGliXQp9IGVsc2VpZiB7W3N0cmluZyBtYXRjaCBAQCogJG9ndWlyZWxdfSB7CglzZXQgb2d1aWxpYiBbZmlsZSBqb2luIFtmaWxlIGRpcm5hbWUgW2ZpbGUgbm9ybWFsaXplICRhcmd2MF1dIGxpYl0KfQpzZXQgaWR4IFtmaWxlIGpvaW4gJG9ndWlsaWIgdGNsSW5kZXhdCmNhdGNoIHsKCXNldCBmZCBbb3BlbiAkaWR4IHJdCglpZiB7W2dldHMgJGZkXSBlcSB7IyBBdXRvZ2VuZXJhdGVkIGJ5IGdpdC1ndWkgTWFrZWZpbGV9fSB7CgkJc2V0IGlkeCBbbGlzdF0KCQl3aGlsZSB7W2dldHMgJGZkIG5dID49IDB9IHsKCQkJaWYgeyRuIG5lIHt9ICYmICFbc3RyaW5nIG1hdGNoICMqICRuXX0gewoJCQkJbGFwcGVuZCBpZHggJG4KCQkJfQoJCX0KCX0gZWxzZSB7CgkJc2V0IGlkeCB7fQoJfQoJY2xvc2UgJGZkCn0KaWYgeyRpZHggbmUge319IHsKCXNldCBsb2FkZWQgW2xpc3RdCglmb3JlYWNoIHAgJGlkeCB7CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkbG9hZGVkICRwXSA+PSAwfSBjb250aW51ZQoJCXB1dHMgJHAKCQlzb3VyY2UgW2ZpbGUgam9pbiAkb2d1aWxpYiAkcF0KCQlsYXBwZW5kIGxvYWRlZCAkcAoJfQoJdW5zZXQgbG9hZGVkIHAKfSBlbHNlIHsKCXNldCBhdXRvX3BhdGggW2NvbmNhdCBbbGlzdCAkb2d1aWxpYl0gJGF1dG9fcGF0aF0KfQp1bnNldCAtbm9jb21wbGFpbiBvZ3VpbGliIG9ndWlyZWwgaWR4IGZkCgppZiB7IVtjYXRjaCB7c2V0IF92ZXJib3NlICRlbnYoR0lUR1VJX1ZFUkJPU0UpfV19IHsKCXVuc2V0IF92ZXJib3NlCglyZW5hbWUgYXV0b19sb2FkIHJlYWxfX2F1dG9fbG9hZAoJcHJvYyBhdXRvX2xvYWQge25hbWUgYXJnc30gewoJCXB1dHMgc3RkZXJyICJhdXRvX2xvYWQgJG5hbWUiCgkJcmV0dXJuIFt1cGxldmVsIDEgcmVhbF9fYXV0b19sb2FkICRuYW1lICRhcmdzXQoJfQoJcmVuYW1lIHNvdXJjZSByZWFsX19zb3VyY2UKCXByb2Mgc291cmNlIHtuYW1lfSB7CgkJcHV0cyBzdGRlcnIgInNvdXJjZSAgICAkbmFtZSIKCQl1cGxldmVsIDEgcmVhbF9fc291cmNlICRuYW1lCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgcmVhZCBvbmx5IGdsb2JhbHMKCnNldCBfYXBwbmFtZSBbbGluZGV4IFtmaWxlIHNwbGl0ICRhcmd2MF0gZW5kXQpzZXQgX2dpdGRpciB7fQpzZXQgX2dpdGV4ZWMge30Kc2V0IF9yZXBvbmFtZSB7fQpzZXQgX2lzY3lnd2luIHt9Cgpwcm9jIGFwcG5hbWUge30gewoJZ2xvYmFsIF9hcHBuYW1lCglyZXR1cm4gJF9hcHBuYW1lCn0KCnByb2MgZ2l0ZGlyIHthcmdzfSB7CglnbG9iYWwgX2dpdGRpcgoJaWYgeyRhcmdzIGVxIHt9fSB7CgkJcmV0dXJuICRfZ2l0ZGlyCgl9CglyZXR1cm4gW2V2YWwgW2NvbmNhdCBbbGlzdCBmaWxlIGpvaW4gJF9naXRkaXJdICRhcmdzXV0KfQoKcHJvYyBnaXRleGVjIHthcmdzfSB7CglnbG9iYWwgX2dpdGV4ZWMKCWlmIHskX2dpdGV4ZWMgZXEge319IHsKCQlpZiB7W2NhdGNoIHtzZXQgX2dpdGV4ZWMgW2dpdCAtLWV4ZWMtcGF0aF19IGVycl19IHsKCQkJZXJyb3IgIkdpdCBub3QgaW5zdGFsbGVkP1xuXG4kZXJyIgoJCX0KCX0KCWlmIHskYXJncyBlcSB7fX0gewoJCXJldHVybiAkX2dpdGV4ZWMKCX0KCXJldHVybiBbZXZhbCBbY29uY2F0IFtsaXN0IGZpbGUgam9pbiAkX2dpdGV4ZWNdICRhcmdzXV0KfQoKcHJvYyByZXBvbmFtZSB7fSB7CglnbG9iYWwgX3JlcG9uYW1lCglyZXR1cm4gJF9yZXBvbmFtZQp9Cgpwcm9jIGlzX01hY09TWCB7fSB7CglnbG9iYWwgdGNsX3BsYXRmb3JtIHRrX2xpYnJhcnkKCWlmIHtbdGsgd2luZG93aW5nc3lzdGVtXSBlcSB7YXF1YX19IHsKCQlyZXR1cm4gMQoJfQoJcmV0dXJuIDAKfQoKcHJvYyBpc19XaW5kb3dzIHt9IHsKCWdsb2JhbCB0Y2xfcGxhdGZvcm0KCWlmIHskdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSBlcSB7d2luZG93c319IHsKCQlyZXR1cm4gMQoJfQoJcmV0dXJuIDAKfQoKcHJvYyBpc19DeWd3aW4ge30gewoJZ2xvYmFsIHRjbF9wbGF0Zm9ybSBfaXNjeWd3aW4KCWlmIHskX2lzY3lnd2luIGVxIHt9fSB7CgkJaWYgeyR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pIGVxIHt3aW5kb3dzfX0gewoJCQlpZiB7W2NhdGNoIHtzZXQgcCBbZXhlYyBjeWdwYXRoIC0td2luZGlyXX0gZXJyXX0gewoJCQkJc2V0IF9pc2N5Z3dpbiAwCgkJCX0gZWxzZSB7CgkJCQlzZXQgX2lzY3lnd2luIDEKCQkJfQoJCX0gZWxzZSB7CgkJCXNldCBfaXNjeWd3aW4gMAoJCX0KCX0KCXJldHVybiAkX2lzY3lnd2luCn0KCnByb2MgaXNfZW5hYmxlZCB7b3B0aW9ufSB7CglnbG9iYWwgZW5hYmxlZF9vcHRpb25zCglpZiB7W2NhdGNoIHtzZXQgb24gJGVuYWJsZWRfb3B0aW9ucygkb3B0aW9uKX1dfSB7cmV0dXJuIDB9CglyZXR1cm4gJG9uCn0KCnByb2MgZW5hYmxlX29wdGlvbiB7b3B0aW9ufSB7CglnbG9iYWwgZW5hYmxlZF9vcHRpb25zCglzZXQgZW5hYmxlZF9vcHRpb25zKCRvcHRpb24pIDEKfQoKcHJvYyBkaXNhYmxlX29wdGlvbiB7b3B0aW9ufSB7CglnbG9iYWwgZW5hYmxlZF9vcHRpb25zCglzZXQgZW5hYmxlZF9vcHRpb25zKCRvcHRpb24pIDAKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBjb25maWcKCnByb2MgaXNfbWFueV9jb25maWcge25hbWV9IHsKCXN3aXRjaCAtZ2xvYiAtLSAkbmFtZSB7CglyZW1vdGUuKi5mZXRjaCAtCglyZW1vdGUuKi5wdXNoCgkJe3JldHVybiAxfQoJKgoJCXtyZXR1cm4gMH0KCX0KfQoKcHJvYyBpc19jb25maWdfdHJ1ZSB7bmFtZX0gewoJZ2xvYmFsIHJlcG9fY29uZmlnCglpZiB7W2NhdGNoIHtzZXQgdiAkcmVwb19jb25maWcoJG5hbWUpfV19IHsKCQlyZXR1cm4gMAoJfSBlbHNlaWYgeyR2IGVxIHt0cnVlfSB8fCAkdiBlcSB7MX0gfHwgJHYgZXEge3llc319IHsKCQlyZXR1cm4gMQoJfSBlbHNlIHsKCQlyZXR1cm4gMAoJfQp9Cgpwcm9jIGxvYWRfY29uZmlnIHtpbmNsdWRlX2dsb2JhbH0gewoJZ2xvYmFsIHJlcG9fY29uZmlnIGdsb2JhbF9jb25maWcgZGVmYXVsdF9jb25maWcKCglhcnJheSB1bnNldCBnbG9iYWxfY29uZmlnCglpZiB7JGluY2x1ZGVfZ2xvYmFsfSB7CgkJY2F0Y2ggewoJCQlzZXQgZmRfcmMgW29wZW4gInwgZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWxpc3QiIHJdCgkJCXdoaWxlIHtbZ2V0cyAkZmRfcmMgbGluZV0gPj0gMH0gewoJCQkJaWYge1tyZWdleHAge14oW149XSspPSguKikkfSAkbGluZSBsaW5lIG5hbWUgdmFsdWVdfSB7CgkJCQkJaWYge1tpc19tYW55X2NvbmZpZyAkbmFtZV19IHsKCQkJCQkJbGFwcGVuZCBnbG9iYWxfY29uZmlnKCRuYW1lKSAkdmFsdWUKCQkJCQl9IGVsc2UgewoJCQkJCQlzZXQgZ2xvYmFsX2NvbmZpZygkbmFtZSkgJHZhbHVlCgkJCQkJfQoJCQkJfQoJCQl9CgkJCWNsb3NlICRmZF9yYwoJCX0KCX0KCglhcnJheSB1bnNldCByZXBvX2NvbmZpZwoJY2F0Y2ggewoJCXNldCBmZF9yYyBbb3BlbiAifCBnaXQgY29uZmlnIC0tbGlzdCIgcl0KCQl3aGlsZSB7W2dldHMgJGZkX3JjIGxpbmVdID49IDB9IHsKCQkJaWYge1tyZWdleHAge14oW149XSspPSguKikkfSAkbGluZSBsaW5lIG5hbWUgdmFsdWVdfSB7CgkJCQlpZiB7W2lzX21hbnlfY29uZmlnICRuYW1lXX0gewoJCQkJCWxhcHBlbmQgcmVwb19jb25maWcoJG5hbWUpICR2YWx1ZQoJCQkJfSBlbHNlIHsKCQkJCQlzZXQgcmVwb19jb25maWcoJG5hbWUpICR2YWx1ZQoJCQkJfQoJCQl9CgkJfQoJCWNsb3NlICRmZF9yYwoJfQoKCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgZGVmYXVsdF9jb25maWddIHsKCQlpZiB7W2NhdGNoIHtzZXQgdiAkZ2xvYmFsX2NvbmZpZygkbmFtZSl9XX0gewoJCQlzZXQgZ2xvYmFsX2NvbmZpZygkbmFtZSkgJGRlZmF1bHRfY29uZmlnKCRuYW1lKQoJCX0KCQlpZiB7W2NhdGNoIHtzZXQgdiAkcmVwb19jb25maWcoJG5hbWUpfV19IHsKCQkJc2V0IHJlcG9fY29uZmlnKCRuYW1lKSAkZGVmYXVsdF9jb25maWcoJG5hbWUpCgkJfQoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGhhbmR5IHV0aWxzCgpwcm9jIGdpdCB7YXJnc30gewoJcmV0dXJuIFtldmFsIGV4ZWMgZ2l0ICRhcmdzXQp9CgphdXRvX2xvYWQgdGtfb3B0aW9uTWVudQpyZW5hbWUgdGtfb3B0aW9uTWVudSByZWFsX190a09wdGlvbk1lbnUKcHJvYyB0a19vcHRpb25NZW51IHt3IHZhck5hbWUgYXJnc30gewoJc2V0IG0gW2V2YWwgcmVhbF9fdGtPcHRpb25NZW51ICR3ICR2YXJOYW1lICRhcmdzXQoJJG0gY29uZmlndXJlIC1mb250IGZvbnRfdWkKCSR3IGNvbmZpZ3VyZSAtZm9udCBmb250X3VpCglyZXR1cm4gJG0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyB2ZXJzaW9uIGNoZWNrCgppZiB7ey0tdmVyc2lvbn0gZXEgJGFyZ3YgfHwge3ZlcnNpb259IGVxICRhcmd2fSB7CglwdXRzICJnaXQtZ3VpIHZlcnNpb24gJGFwcHZlcnMiCglleGl0Cn0KCnNldCByZXFfbWFqIDEKc2V0IHJlcV9taW4gNQoKaWYge1tjYXRjaCB7c2V0IHYgW2dpdCAtLXZlcnNpb25dfSBlcnJdfSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCWVycm9yX3BvcHVwICJDYW5ub3QgZGV0ZXJtaW5lIEdpdCB2ZXJzaW9uOgoKJGVycgoKW2FwcG5hbWVdIHJlcXVpcmVzIEdpdCAkcmVxX21hai4kcmVxX21pbiBvciBsYXRlci4iCglleGl0IDEKfQppZiB7W3JlZ2V4cCB7XmdpdCB2ZXJzaW9uIChcZCspXC4oXGQrKX0gJHYgX2p1bmsgYWN0X21haiBhY3RfbWluXX0gewoJaWYgeyRhY3RfbWFqIDwgJHJlcV9tYWoKCQl8fCAoJGFjdF9tYWogPT0gJHJlcV9tYWogJiYgJGFjdF9taW4gPCAkcmVxX21pbil9IHsKCQljYXRjaCB7d20gd2l0aGRyYXcgLn0KCQllcnJvcl9wb3B1cCAiW2FwcG5hbWVdIHJlcXVpcmVzIEdpdCAkcmVxX21hai4kcmVxX21pbiBvciBsYXRlci4KCllvdSBhcmUgdXNpbmcgJHYuIgoJCWV4aXQgMQoJfQp9IGVsc2UgewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiQ2Fubm90IHBhcnNlIEdpdCB2ZXJzaW9uIHN0cmluZzpcblxuJHYiCglleGl0IDEKfQp1bnNldCAtbm9jb21wbGFpbiB2IF9qdW5rIGFjdF9tYWogYWN0X21pbiByZXFfbWFqIHJlcV9taW4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgcmVwb3NpdG9yeSBzZXR1cAoKaWYge1tjYXRjaCB7CgkJc2V0IF9naXRkaXIgJGVudihHSVRfRElSKQoJCXNldCBfcHJlZml4IHt9CgkJfV0KCSYmIFtjYXRjaCB7CgkJc2V0IF9naXRkaXIgW2dpdCByZXYtcGFyc2UgLS1naXQtZGlyXQoJCXNldCBfcHJlZml4IFtnaXQgcmV2LXBhcnNlIC0tc2hvdy1wcmVmaXhdCgl9IGVycl19IHsKCWNhdGNoIHt3bSB3aXRoZHJhdyAufQoJZXJyb3JfcG9wdXAgIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5OlxuXG4kZXJyIgoJZXhpdCAxCn0KaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSAkX2dpdGRpcl0gJiYgW2lzX0N5Z3dpbl19IHsKCWNhdGNoIHtzZXQgX2dpdGRpciBbZXhlYyBjeWdwYXRoIC0tdW5peCAkX2dpdGRpcl19Cn0KaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSAkX2dpdGRpcl19IHsKCWNhdGNoIHt3bSB3aXRoZHJhdyAufQoJZXJyb3JfcG9wdXAgIkdpdCBkaXJlY3Rvcnkgbm90IGZvdW5kOlxuXG4kX2dpdGRpciIKCWV4aXQgMQp9CmlmIHtbbGluZGV4IFtmaWxlIHNwbGl0ICRfZ2l0ZGlyXSBlbmRdIG5lIHsuZ2l0fX0gewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiQ2Fubm90IHVzZSBmdW5ueSAuZ2l0IGRpcmVjdG9yeTpcblxuJF9naXRkaXIiCglleGl0IDEKfQppZiB7W2NhdGNoIHtjZCBbZmlsZSBkaXJuYW1lICRfZ2l0ZGlyXX0gZXJyXX0gewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiTm8gd29ya2luZyBkaXJlY3RvcnkgW2ZpbGUgZGlybmFtZSAkX2dpdGRpcl06XG5cbiRlcnIiCglleGl0IDEKfQpzZXQgX3JlcG9uYW1lIFtsaW5kZXggW2ZpbGUgc3BsaXQgXAoJW2ZpbGUgbm9ybWFsaXplIFtmaWxlIGRpcm5hbWUgJF9naXRkaXJdXV0gXAoJZW5kXQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBnbG9iYWwgaW5pdAoKc2V0IGN1cnJlbnRfZGlmZl9wYXRoIHt9CnNldCBjdXJyZW50X2RpZmZfc2lkZSB7fQpzZXQgZGlmZl9hY3Rpb25zIFtsaXN0XQpzZXQgdWlfc3RhdHVzX3ZhbHVlIHtJbml0aWFsaXppbmcuLi59CgpzZXQgSEVBRCB7fQpzZXQgUEFSRU5UIHt9CnNldCBNRVJHRV9IRUFEIFtsaXN0XQpzZXQgY29tbWl0X3R5cGUge30Kc2V0IGVtcHR5X3RyZWUge30Kc2V0IGN1cnJlbnRfYnJhbmNoIHt9CnNldCBjdXJyZW50X2RpZmZfcGF0aCB7fQpzZXQgc2VsZWN0ZWRfY29tbWl0X3R5cGUgbmV3CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHRhc2sgbWFuYWdlbWVudAoKc2V0IHJlc2Nhbl9hY3RpdmUgMApzZXQgZGlmZl9hY3RpdmUgMApzZXQgbGFzdF9jbGlja2VkIHt9CgpzZXQgZGlzYWJsZV9vbl9sb2NrIFtsaXN0XQpzZXQgaW5kZXhfbG9ja190eXBlIG5vbmUKCnByb2MgbG9ja19pbmRleCB7dHlwZX0gewoJZ2xvYmFsIGluZGV4X2xvY2tfdHlwZSBkaXNhYmxlX29uX2xvY2sKCglpZiB7JGluZGV4X2xvY2tfdHlwZSBlcSB7bm9uZX19IHsKCQlzZXQgaW5kZXhfbG9ja190eXBlICR0eXBlCgkJZm9yZWFjaCB3ICRkaXNhYmxlX29uX2xvY2sgewoJCQl1cGxldmVsICMwICR3IGRpc2FibGVkCgkJfQoJCXJldHVybiAxCgl9IGVsc2VpZiB7JGluZGV4X2xvY2tfdHlwZSBlcSAiYmVnaW4tJHR5cGUifSB7CgkJc2V0IGluZGV4X2xvY2tfdHlwZSAkdHlwZQoJCXJldHVybiAxCgl9CglyZXR1cm4gMAp9Cgpwcm9jIHVubG9ja19pbmRleCB7fSB7CglnbG9iYWwgaW5kZXhfbG9ja190eXBlIGRpc2FibGVfb25fbG9jawoKCXNldCBpbmRleF9sb2NrX3R5cGUgbm9uZQoJZm9yZWFjaCB3ICRkaXNhYmxlX29uX2xvY2sgewoJCXVwbGV2ZWwgIzAgJHcgbm9ybWFsCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgc3RhdHVzCgpwcm9jIHJlcG9zaXRvcnlfc3RhdGUge2N0dmFyIGhkdmFyIG1odmFyfSB7CglnbG9iYWwgY3VycmVudF9icmFuY2gKCXVwdmFyICRjdHZhciBjdCAkaGR2YXIgaGQgJG1odmFyIG1oCgoJc2V0IG1oIFtsaXN0XQoKCWlmIHtbY2F0Y2gge3NldCBjdXJyZW50X2JyYW5jaCBbZ2l0IHN5bWJvbGljLXJlZiBIRUFEXX1dfSB7CgkJc2V0IGN1cnJlbnRfYnJhbmNoIHt9Cgl9IGVsc2UgewoJCXJlZ3N1YiBecmVmcy8oKGhlYWRzfHRhZ3N8cmVtb3RlcykvKT8gXAoJCQkkY3VycmVudF9icmFuY2ggXAoJCQl7fSBcCgkJCWN1cnJlbnRfYnJhbmNoCgl9CgoJaWYge1tjYXRjaCB7c2V0IGhkIFtnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURdfV19IHsKCQlzZXQgaGQge30KCQlzZXQgY3QgaW5pdGlhbAoJCXJldHVybgoJfQoKCXNldCBtZXJnZV9oZWFkIFtnaXRkaXIgTUVSR0VfSEVBRF0KCWlmIHtbZmlsZSBleGlzdHMgJG1lcmdlX2hlYWRdfSB7CgkJc2V0IGN0IG1lcmdlCgkJc2V0IGZkX21oIFtvcGVuICRtZXJnZV9oZWFkIHJdCgkJd2hpbGUge1tnZXRzICRmZF9taCBsaW5lXSA+PSAwfSB7CgkJCWxhcHBlbmQgbWggJGxpbmUKCQl9CgkJY2xvc2UgJGZkX21oCgkJcmV0dXJuCgl9CgoJc2V0IGN0IG5vcm1hbAp9Cgpwcm9jIFBBUkVOVCB7fSB7CglnbG9iYWwgUEFSRU5UIGVtcHR5X3RyZWUKCglzZXQgcCBbbGluZGV4ICRQQVJFTlQgMF0KCWlmIHskcCBuZSB7fX0gewoJCXJldHVybiAkcAoJfQoJaWYgeyRlbXB0eV90cmVlIGVxIHt9fSB7CgkJc2V0IGVtcHR5X3RyZWUgW2dpdCBta3RyZWUgPDwge31dCgl9CglyZXR1cm4gJGVtcHR5X3RyZWUKfQoKcHJvYyByZXNjYW4ge2FmdGVyIHtob25vcl90cnVzdG10aW1lIDF9fSB7CglnbG9iYWwgSEVBRCBQQVJFTlQgTUVSR0VfSEVBRCBjb21taXRfdHlwZQoJZ2xvYmFsIHVpX2luZGV4IHVpX3dvcmtkaXIgdWlfc3RhdHVzX3ZhbHVlIHVpX2NvbW0KCWdsb2JhbCByZXNjYW5fYWN0aXZlIGZpbGVfc3RhdGVzCglnbG9iYWwgcmVwb19jb25maWcKCglpZiB7JHJlc2Nhbl9hY3RpdmUgPiAwIHx8ICFbbG9ja19pbmRleCByZWFkXX0gcmV0dXJuCgoJcmVwb3NpdG9yeV9zdGF0ZSBuZXdUeXBlIG5ld0hFQUQgbmV3TUVSR0VfSEVBRAoJaWYge1tzdHJpbmcgbWF0Y2ggYW1lbmQqICRjb21taXRfdHlwZV0KCQkmJiAkbmV3VHlwZSBlcSB7bm9ybWFsfQoJCSYmICRuZXdIRUFEIGVxICRIRUFEfSB7Cgl9IGVsc2UgewoJCXNldCBIRUFEICRuZXdIRUFECgkJc2V0IFBBUkVOVCAkbmV3SEVBRAoJCXNldCBNRVJHRV9IRUFEICRuZXdNRVJHRV9IRUFECgkJc2V0IGNvbW1pdF90eXBlICRuZXdUeXBlCgl9CgoJYXJyYXkgdW5zZXQgZmlsZV9zdGF0ZXMKCglpZiB7IVskdWlfY29tbSBlZGl0IG1vZGlmaWVkXQoJCXx8IFtzdHJpbmcgdHJpbSBbJHVpX2NvbW0gZ2V0IDAuMCBlbmRdXSBlcSB7fX0gewoJCWlmIHtbbG9hZF9tZXNzYWdlIEdJVEdVSV9NU0ddfSB7CgkJfSBlbHNlaWYge1tsb2FkX21lc3NhZ2UgTUVSR0VfTVNHXX0gewoJCX0gZWxzZWlmIHtbbG9hZF9tZXNzYWdlIFNRVUFTSF9NU0ddfSB7CgkJfQoJCSR1aV9jb21tIGVkaXQgcmVzZXQKCQkkdWlfY29tbSBlZGl0IG1vZGlmaWVkIGZhbHNlCgl9CgoJaWYge1tpc19lbmFibGVkIGJyYW5jaF19IHsKCQlsb2FkX2FsbF9oZWFkcwoJCXBvcHVsYXRlX2JyYW5jaF9tZW51Cgl9CgoJaWYgeyRob25vcl90cnVzdG10aW1lICYmICRyZXBvX2NvbmZpZyhndWkudHJ1c3RtdGltZSkgZXEge3RydWV9fSB7CgkJcmVzY2FuX3N0YWdlMiB7fSAkYWZ0ZXIKCX0gZWxzZSB7CgkJc2V0IHJlc2Nhbl9hY3RpdmUgMQoJCXNldCB1aV9zdGF0dXNfdmFsdWUge1JlZnJlc2hpbmcgZmlsZSBzdGF0dXMuLi59CgkJc2V0IGNtZCBbbGlzdCBnaXQgdXBkYXRlLWluZGV4XQoJCWxhcHBlbmQgY21kIC1xCgkJbGFwcGVuZCBjbWQgLS11bm1lcmdlZAoJCWxhcHBlbmQgY21kIC0taWdub3JlLW1pc3NpbmcKCQlsYXBwZW5kIGNtZCAtLXJlZnJlc2gKCQlzZXQgZmRfcmYgW29wZW4gInwgJGNtZCIgcl0KCQlmY29uZmlndXJlICRmZF9yZiAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5CgkJZmlsZWV2ZW50ICRmZF9yZiByZWFkYWJsZSBcCgkJCVtsaXN0IHJlc2Nhbl9zdGFnZTIgJGZkX3JmICRhZnRlcl0KCX0KfQoKcHJvYyByZXNjYW5fc3RhZ2UyIHtmZCBhZnRlcn0gewoJZ2xvYmFsIHVpX3N0YXR1c192YWx1ZQoJZ2xvYmFsIHJlc2Nhbl9hY3RpdmUgYnVmX3JkaSBidWZfcmRmIGJ1Zl9ybG8KCglpZiB7JGZkIG5lIHt9fSB7CgkJcmVhZCAkZmQKCQlpZiB7IVtlb2YgJGZkXX0gcmV0dXJuCgkJY2xvc2UgJGZkCgl9CgoJc2V0IGxzX290aGVycyBbbGlzdCB8IGdpdCBscy1maWxlcyAtLW90aGVycyAteiBcCgkJLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZV0KCXNldCBpbmZvX2V4Y2x1ZGUgW2dpdGRpciBpbmZvIGV4Y2x1ZGVdCglpZiB7W2ZpbGUgcmVhZGFibGUgJGluZm9fZXhjbHVkZV19IHsKCQlsYXBwZW5kIGxzX290aGVycyAiLS1leGNsdWRlLWZyb209JGluZm9fZXhjbHVkZSIKCX0KCglzZXQgYnVmX3JkaSB7fQoJc2V0IGJ1Zl9yZGYge30KCXNldCBidWZfcmxvIHt9CgoJc2V0IHJlc2Nhbl9hY3RpdmUgMwoJc2V0IHVpX3N0YXR1c192YWx1ZSB7U2Nhbm5pbmcgZm9yIG1vZGlmaWVkIGZpbGVzIC4uLn0KCXNldCBmZF9kaSBbb3BlbiAifCBnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCAteiBbUEFSRU5UXSIgcl0KCXNldCBmZF9kZiBbb3BlbiAifCBnaXQgZGlmZi1maWxlcyAteiIgcl0KCXNldCBmZF9sbyBbb3BlbiAkbHNfb3RoZXJzIHJdCgoJZmNvbmZpZ3VyZSAkZmRfZGkgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeSAtZW5jb2RpbmcgYmluYXJ5CglmY29uZmlndXJlICRmZF9kZiAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKCWZjb25maWd1cmUgJGZkX2xvIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVuY29kaW5nIGJpbmFyeQoJZmlsZWV2ZW50ICRmZF9kaSByZWFkYWJsZSBbbGlzdCByZWFkX2RpZmZfaW5kZXggJGZkX2RpICRhZnRlcl0KCWZpbGVldmVudCAkZmRfZGYgcmVhZGFibGUgW2xpc3QgcmVhZF9kaWZmX2ZpbGVzICRmZF9kZiAkYWZ0ZXJdCglmaWxlZXZlbnQgJGZkX2xvIHJlYWRhYmxlIFtsaXN0IHJlYWRfbHNfb3RoZXJzICRmZF9sbyAkYWZ0ZXJdCn0KCnByb2MgbG9hZF9tZXNzYWdlIHtmaWxlfSB7CglnbG9iYWwgdWlfY29tbQoKCXNldCBmIFtnaXRkaXIgJGZpbGVdCglpZiB7W2ZpbGUgaXNmaWxlICRmXX0gewoJCWlmIHtbY2F0Y2gge3NldCBmZCBbb3BlbiAkZiByXX1dfSB7CgkJCXJldHVybiAwCgkJfQoJCXNldCBjb250ZW50IFtzdHJpbmcgdHJpbSBbcmVhZCAkZmRdXQoJCWNsb3NlICRmZAoJCXJlZ3N1YiAtYWxsIC1saW5lIHtbIFxyXHRdKyR9ICRjb250ZW50IHt9IGNvbnRlbnQKCQkkdWlfY29tbSBkZWxldGUgMC4wIGVuZAoJCSR1aV9jb21tIGluc2VydCBlbmQgJGNvbnRlbnQKCQlyZXR1cm4gMQoJfQoJcmV0dXJuIDAKfQoKcHJvYyByZWFkX2RpZmZfaW5kZXgge2ZkIGFmdGVyfSB7CglnbG9iYWwgYnVmX3JkaQoKCWFwcGVuZCBidWZfcmRpIFtyZWFkICRmZF0KCXNldCBjIDAKCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRidWZfcmRpXQoJd2hpbGUgeyRjIDwgJG59IHsKCQlzZXQgejEgW3N0cmluZyBmaXJzdCAiXDAiICRidWZfcmRpICRjXQoJCWlmIHskejEgPT0gLTF9IGJyZWFrCgkJaW5jciB6MQoJCXNldCB6MiBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGkgJHoxXQoJCWlmIHskejIgPT0gLTF9IGJyZWFrCgoJCWluY3IgYwoJCXNldCBpIFtzcGxpdCBbc3RyaW5nIHJhbmdlICRidWZfcmRpICRjIFtleHByIHskejEgLSAyfV1dIHsgfV0KCQlzZXQgcCBbc3RyaW5nIHJhbmdlICRidWZfcmRpICR6MSBbZXhwciB7JHoyIC0gMX1dXQoJCW1lcmdlX3N0YXRlIFwKCQkJW2VuY29kaW5nIGNvbnZlcnRmcm9tICRwXSBcCgkJCVtsaW5kZXggJGkgNF0/IFwKCQkJW2xpc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDJdXSBcCgkJCVtsaXN0XQoJCXNldCBjICR6MgoJCWluY3IgYwoJfQoJaWYgeyRjIDwgJG59IHsKCQlzZXQgYnVmX3JkaSBbc3RyaW5nIHJhbmdlICRidWZfcmRpICRjIGVuZF0KCX0gZWxzZSB7CgkJc2V0IGJ1Zl9yZGkge30KCX0KCglyZXNjYW5fZG9uZSAkZmQgYnVmX3JkaSAkYWZ0ZXIKfQoKcHJvYyByZWFkX2RpZmZfZmlsZXMge2ZkIGFmdGVyfSB7CglnbG9iYWwgYnVmX3JkZgoKCWFwcGVuZCBidWZfcmRmIFtyZWFkICRmZF0KCXNldCBjIDAKCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRidWZfcmRmXQoJd2hpbGUgeyRjIDwgJG59IHsKCQlzZXQgejEgW3N0cmluZyBmaXJzdCAiXDAiICRidWZfcmRmICRjXQoJCWlmIHskejEgPT0gLTF9IGJyZWFrCgkJaW5jciB6MQoJCXNldCB6MiBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGYgJHoxXQoJCWlmIHskejIgPT0gLTF9IGJyZWFrCgoJCWluY3IgYwoJCXNldCBpIFtzcGxpdCBbc3RyaW5nIHJhbmdlICRidWZfcmRmICRjIFtleHByIHskejEgLSAyfV1dIHsgfV0KCQlzZXQgcCBbc3RyaW5nIHJhbmdlICRidWZfcmRmICR6MSBbZXhwciB7JHoyIC0gMX1dXQoJCW1lcmdlX3N0YXRlIFwKCQkJW2VuY29kaW5nIGNvbnZlcnRmcm9tICRwXSBcCgkJCT9bbGluZGV4ICRpIDRdIFwKCQkJW2xpc3RdIFwKCQkJW2xpc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDJdXQoJCXNldCBjICR6MgoJCWluY3IgYwoJfQoJaWYgeyRjIDwgJG59IHsKCQlzZXQgYnVmX3JkZiBbc3RyaW5nIHJhbmdlICRidWZfcmRmICRjIGVuZF0KCX0gZWxzZSB7CgkJc2V0IGJ1Zl9yZGYge30KCX0KCglyZXNjYW5fZG9uZSAkZmQgYnVmX3JkZiAkYWZ0ZXIKfQoKcHJvYyByZWFkX2xzX290aGVycyB7ZmQgYWZ0ZXJ9IHsKCWdsb2JhbCBidWZfcmxvCgoJYXBwZW5kIGJ1Zl9ybG8gW3JlYWQgJGZkXQoJc2V0IHBjayBbc3BsaXQgJGJ1Zl9ybG8gIlwwIl0KCXNldCBidWZfcmxvIFtsaW5kZXggJHBjayBlbmRdCglmb3JlYWNoIHAgW2xyYW5nZSAkcGNrIDAgZW5kLTFdIHsKCQltZXJnZV9zdGF0ZSBbZW5jb2RpbmcgY29udmVydGZyb20gJHBdID9PCgl9CglyZXNjYW5fZG9uZSAkZmQgYnVmX3JsbyAkYWZ0ZXIKfQoKcHJvYyByZXNjYW5fZG9uZSB7ZmQgYnVmIGFmdGVyfSB7CglnbG9iYWwgcmVzY2FuX2FjdGl2ZSBjdXJyZW50X2RpZmZfcGF0aAoJZ2xvYmFsIGZpbGVfc3RhdGVzIHJlcG9fY29uZmlnCgl1cHZhciAkYnVmIHRvX2NsZWFyCgoJaWYgeyFbZW9mICRmZF19IHJldHVybgoJc2V0IHRvX2NsZWFyIHt9CgljbG9zZSAkZmQKCWlmIHtbaW5jciByZXNjYW5fYWN0aXZlIC0xXSA+IDB9IHJldHVybgoKCXBydW5lX3NlbGVjdGlvbgoJdW5sb2NrX2luZGV4CglkaXNwbGF5X2FsbF9maWxlcwoJaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBuZSB7fX0gcmVzaG93X2RpZmYKCXVwbGV2ZWwgIzAgJGFmdGVyCn0KCnByb2MgcHJ1bmVfc2VsZWN0aW9uIHt9IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBzZWxlY3RlZF9wYXRocwoKCWZvcmVhY2ggcGF0aCBbYXJyYXkgbmFtZXMgc2VsZWN0ZWRfcGF0aHNdIHsKCQlpZiB7W2NhdGNoIHtzZXQgc3RpbGxfaGVyZSAkZmlsZV9zdGF0ZXMoJHBhdGgpfV19IHsKCQkJdW5zZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpCgkJfQoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHVpIGhlbHBlcnMKCnByb2MgbWFwaWNvbiB7dyBzdGF0ZSBwYXRofSB7CglnbG9iYWwgYWxsX2ljb25zCgoJaWYge1tjYXRjaCB7c2V0IHIgJGFsbF9pY29ucygkc3RhdGUkdyl9XX0gewoJCXB1dHMgImVycm9yOiBubyBpY29uIGZvciAkdyBzdGF0ZT17JHN0YXRlfSAkcGF0aCIKCQlyZXR1cm4gZmlsZV9wbGFpbgoJfQoJcmV0dXJuICRyCn0KCnByb2MgbWFwZGVzYyB7c3RhdGUgcGF0aH0gewoJZ2xvYmFsIGFsbF9kZXNjcwoKCWlmIHtbY2F0Y2gge3NldCByICRhbGxfZGVzY3MoJHN0YXRlKX1dfSB7CgkJcHV0cyAiZXJyb3I6IG5vIGRlc2MgZm9yIHN0YXRlPXskc3RhdGV9ICRwYXRoIgoJCXJldHVybiAkc3RhdGUKCX0KCXJldHVybiAkcgp9Cgpwcm9jIGVzY2FwZV9wYXRoIHtwYXRofSB7CglyZWdzdWIgLWFsbCB7XFx9ICRwYXRoICJcXFxcIiBwYXRoCglyZWdzdWIgLWFsbCAiXG4iICRwYXRoICJcXG4iIHBhdGgKCXJldHVybiAkcGF0aAp9Cgpwcm9jIHNob3J0X3BhdGgge3BhdGh9IHsKCXJldHVybiBbZXNjYXBlX3BhdGggW2xpbmRleCBbZmlsZSBzcGxpdCAkcGF0aF0gZW5kXV0KfQoKc2V0IG5leHRfaWNvbl9pZCAwCnNldCBudWxsX3NoYTEgW3N0cmluZyByZXBlYXQgMCA0MF0KCnByb2MgbWVyZ2Vfc3RhdGUge3BhdGggbmV3X3N0YXRlIHtoZWFkX2luZm8ge319IHtpbmRleF9pbmZvIHt9fX0gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIG5leHRfaWNvbl9pZCBudWxsX3NoYTEKCglzZXQgczAgW3N0cmluZyBpbmRleCAkbmV3X3N0YXRlIDBdCglzZXQgczEgW3N0cmluZyBpbmRleCAkbmV3X3N0YXRlIDFdCgoJaWYge1tjYXRjaCB7c2V0IGluZm8gJGZpbGVfc3RhdGVzKCRwYXRoKX1dfSB7CgkJc2V0IHN0YXRlIF9fCgkJc2V0IGljb24gbltpbmNyIG5leHRfaWNvbl9pZF0KCX0gZWxzZSB7CgkJc2V0IHN0YXRlIFtsaW5kZXggJGluZm8gMF0KCQlzZXQgaWNvbiBbbGluZGV4ICRpbmZvIDFdCgkJaWYgeyRoZWFkX2luZm8gZXEge319ICB7c2V0IGhlYWRfaW5mbyAgW2xpbmRleCAkaW5mbyAyXX0KCQlpZiB7JGluZGV4X2luZm8gZXEge319IHtzZXQgaW5kZXhfaW5mbyBbbGluZGV4ICRpbmZvIDNdfQoJfQoKCWlmICAgICB7JHMwIGVxIHs/fX0ge3NldCBzMCBbc3RyaW5nIGluZGV4ICRzdGF0ZSAwXX0gXAoJZWxzZWlmIHskczAgZXEge199fSB7c2V0IHMwIF99CgoJaWYgICAgIHskczEgZXEgez99fSB7c2V0IHMxIFtzdHJpbmcgaW5kZXggJHN0YXRlIDFdfSBcCgllbHNlaWYgeyRzMSBlcSB7X319IHtzZXQgczEgX30KCglpZiB7JHMwIGVxIHtBfSAmJiAkczEgZXEge199ICYmICRoZWFkX2luZm8gZXEge319IHsKCQlzZXQgaGVhZF9pbmZvIFtsaXN0IDAgJG51bGxfc2hhMV0KCX0gZWxzZWlmIHskczAgbmUge199ICYmIFtzdHJpbmcgaW5kZXggJHN0YXRlIDBdIGVxIHtffQoJCSYmICRoZWFkX2luZm8gZXEge319IHsKCQlzZXQgaGVhZF9pbmZvICRpbmRleF9pbmZvCgl9CgoJc2V0IGZpbGVfc3RhdGVzKCRwYXRoKSBbbGlzdCAkczAkczEgJGljb24gXAoJCSRoZWFkX2luZm8gJGluZGV4X2luZm8gXAoJCV0KCXJldHVybiAkc3RhdGUKfQoKcHJvYyBkaXNwbGF5X2ZpbGVfaGVscGVyIHt3IHBhdGggaWNvbl9uYW1lIG9sZF9tIG5ld19tfSB7CglnbG9iYWwgZmlsZV9saXN0cwoKCWlmIHskbmV3X20gZXEge199fSB7CgkJc2V0IGxubyBbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkZmlsZV9saXN0cygkdykgJHBhdGhdCgkJaWYgeyRsbm8gPj0gMH0gewoJCQlzZXQgZmlsZV9saXN0cygkdykgW2xyZXBsYWNlICRmaWxlX2xpc3RzKCR3KSAkbG5vICRsbm9dCgkJCWluY3IgbG5vCgkJCSR3IGNvbmYgLXN0YXRlIG5vcm1hbAoJCQkkdyBkZWxldGUgJGxuby4wIFtleHByIHskbG5vICsgMX1dLjAKCQkJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCQl9Cgl9IGVsc2VpZiB7JG9sZF9tIGVxIHtffSAmJiAkbmV3X20gbmUge199fSB7CgkJbGFwcGVuZCBmaWxlX2xpc3RzKCR3KSAkcGF0aAoJCXNldCBmaWxlX2xpc3RzKCR3KSBbbHNvcnQgLXVuaXF1ZSAkZmlsZV9saXN0cygkdyldCgkJc2V0IGxubyBbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkZmlsZV9saXN0cygkdykgJHBhdGhdCgkJaW5jciBsbm8KCQkkdyBjb25mIC1zdGF0ZSBub3JtYWwKCQkkdyBpbWFnZSBjcmVhdGUgJGxuby4wIFwKCQkJLWFsaWduIGNlbnRlciAtcGFkeCA1IC1wYWR5IDEgXAoJCQktbmFtZSAkaWNvbl9uYW1lIFwKCQkJLWltYWdlIFttYXBpY29uICR3ICRuZXdfbSAkcGF0aF0KCQkkdyBpbnNlcnQgJGxuby4xICJbZXNjYXBlX3BhdGggJHBhdGhdXG4iCgkJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCX0gZWxzZWlmIHskb2xkX20gbmUgJG5ld19tfSB7CgkJJHcgY29uZiAtc3RhdGUgbm9ybWFsCgkJJHcgaW1hZ2UgY29uZiAkaWNvbl9uYW1lIC1pbWFnZSBbbWFwaWNvbiAkdyAkbmV3X20gJHBhdGhdCgkJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCX0KfQoKcHJvYyBkaXNwbGF5X2ZpbGUge3BhdGggc3RhdGV9IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBzZWxlY3RlZF9wYXRocwoJZ2xvYmFsIHVpX2luZGV4IHVpX3dvcmtkaXIKCglzZXQgb2xkX20gW21lcmdlX3N0YXRlICRwYXRoICRzdGF0ZV0KCXNldCBzICRmaWxlX3N0YXRlcygkcGF0aCkKCXNldCBuZXdfbSBbbGluZGV4ICRzIDBdCglzZXQgaWNvbl9uYW1lIFtsaW5kZXggJHMgMV0KCglzZXQgbyBbc3RyaW5nIGluZGV4ICRvbGRfbSAwXQoJc2V0IG4gW3N0cmluZyBpbmRleCAkbmV3X20gMF0KCWlmIHskbyBlcSB7VX19IHsKCQlzZXQgbyBfCgl9CglpZiB7JG4gZXEge1V9fSB7CgkJc2V0IG4gXwoJfQoJZGlzcGxheV9maWxlX2hlbHBlcgkkdWlfaW5kZXggJHBhdGggJGljb25fbmFtZSAkbyAkbgoKCWlmIHtbc3RyaW5nIGluZGV4ICRvbGRfbSAwXSBlcSB7VX19IHsKCQlzZXQgbyBVCgl9IGVsc2UgewoJCXNldCBvIFtzdHJpbmcgaW5kZXggJG9sZF9tIDFdCgl9CglpZiB7W3N0cmluZyBpbmRleCAkbmV3X20gMF0gZXEge1V9fSB7CgkJc2V0IG4gVQoJfSBlbHNlIHsKCQlzZXQgbiBbc3RyaW5nIGluZGV4ICRuZXdfbSAxXQoJfQoJZGlzcGxheV9maWxlX2hlbHBlcgkkdWlfd29ya2RpciAkcGF0aCAkaWNvbl9uYW1lICRvICRuCgoJaWYgeyRuZXdfbSBlcSB7X199fSB7CgkJdW5zZXQgZmlsZV9zdGF0ZXMoJHBhdGgpCgkJY2F0Y2gge3Vuc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKX0KCX0KfQoKcHJvYyBkaXNwbGF5X2FsbF9maWxlc19oZWxwZXIge3cgcGF0aCBpY29uX25hbWUgbX0gewoJZ2xvYmFsIGZpbGVfbGlzdHMKCglsYXBwZW5kIGZpbGVfbGlzdHMoJHcpICRwYXRoCglzZXQgbG5vIFtleHByIHtbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggZW5kXSAuXSAwXSAtIDF9XQoJJHcgaW1hZ2UgY3JlYXRlIGVuZCBcCgkJLWFsaWduIGNlbnRlciAtcGFkeCA1IC1wYWR5IDEgXAoJCS1uYW1lICRpY29uX25hbWUgXAoJCS1pbWFnZSBbbWFwaWNvbiAkdyAkbSAkcGF0aF0KCSR3IGluc2VydCBlbmQgIltlc2NhcGVfcGF0aCAkcGF0aF1cbiIKfQoKcHJvYyBkaXNwbGF5X2FsbF9maWxlcyB7fSB7CglnbG9iYWwgdWlfaW5kZXggdWlfd29ya2RpcgoJZ2xvYmFsIGZpbGVfc3RhdGVzIGZpbGVfbGlzdHMKCWdsb2JhbCBsYXN0X2NsaWNrZWQKCgkkdWlfaW5kZXggY29uZiAtc3RhdGUgbm9ybWFsCgkkdWlfd29ya2RpciBjb25mIC1zdGF0ZSBub3JtYWwKCgkkdWlfaW5kZXggZGVsZXRlIDAuMCBlbmQKCSR1aV93b3JrZGlyIGRlbGV0ZSAwLjAgZW5kCglzZXQgbGFzdF9jbGlja2VkIHt9CgoJc2V0IGZpbGVfbGlzdHMoJHVpX2luZGV4KSBbbGlzdF0KCXNldCBmaWxlX2xpc3RzKCR1aV93b3JrZGlyKSBbbGlzdF0KCglmb3JlYWNoIHBhdGggW2xzb3J0IFthcnJheSBuYW1lcyBmaWxlX3N0YXRlc11dIHsKCQlzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCgkJc2V0IG0gW2xpbmRleCAkcyAwXQoJCXNldCBpY29uX25hbWUgW2xpbmRleCAkcyAxXQoKCQlzZXQgcyBbc3RyaW5nIGluZGV4ICRtIDBdCgkJaWYgeyRzIG5lIHtVfSAmJiAkcyBuZSB7X319IHsKCQkJZGlzcGxheV9hbGxfZmlsZXNfaGVscGVyICR1aV9pbmRleCAkcGF0aCBcCgkJCQkkaWNvbl9uYW1lICRzCgkJfQoKCQlpZiB7W3N0cmluZyBpbmRleCAkbSAwXSBlcSB7VX19IHsKCQkJc2V0IHMgVQoJCX0gZWxzZSB7CgkJCXNldCBzIFtzdHJpbmcgaW5kZXggJG0gMV0KCQl9CgkJaWYgeyRzIG5lIHtffX0gewoJCQlkaXNwbGF5X2FsbF9maWxlc19oZWxwZXIgJHVpX3dvcmtkaXIgJHBhdGggXAoJCQkJJGljb25fbmFtZSAkcwoJCX0KCX0KCgkkdWlfaW5kZXggY29uZiAtc3RhdGUgZGlzYWJsZWQKCSR1aV93b3JrZGlyIGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgaWNvbnMKCnNldCBmaWxlbWFzayB7CiNkZWZpbmUgbWFza193aWR0aCAxNAojZGVmaW5lIG1hc2tfaGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIG1hc2tfYml0c1tdID0gewogICAweGZlLCAweDFmLCAweGZlLCAweDFmLCAweGZlLCAweDFmLCAweGZlLCAweDFmLCAweGZlLCAweDFmLCAweGZlLCAweDFmLAogICAweGZlLCAweDFmLCAweGZlLCAweDFmLCAweGZlLCAweDFmLCAweGZlLCAweDFmLCAweGZlLCAweDFmLCAweGZlLCAweDFmLAogICAweGZlLCAweDFmLCAweGZlLCAweDFmLCAweGZlLCAweDFmfTsKfQoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX3BsYWluIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsYWNrIC1kYXRhIHsKI2RlZmluZSBwbGFpbl93aWR0aCAxNAojZGVmaW5lIHBsYWluX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBwbGFpbl9iaXRzW10gPSB7CiAgIDB4ZmUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDIsIDB4MDUsIDB4MDIsIDB4MDksIDB4MDIsIDB4MWYsIDB4MDIsIDB4MTAsCiAgIDB4MDIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4MDIsIDB4MTAsCiAgIDB4MDIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9Owp9IC1tYXNrZGF0YSAkZmlsZW1hc2sKCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9tb2QgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiNkZWZpbmUgbW9kX3dpZHRoIDE0CiNkZWZpbmUgbW9kX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBtb2RfYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDAzLCAweDdhLCAweDA1LCAweDAyLCAweDA5LCAweDdhLCAweDFmLCAweDAyLCAweDEwLAogICAweGZhLCAweDE3LCAweDAyLCAweDEwLCAweGZhLCAweDE3LCAweDAyLCAweDEwLCAweGZhLCAweDE3LCAweDAyLCAweDEwLAogICAweGZhLCAweDE3LCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfZnVsbHRpY2sgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgIiMwMDcwMDAiIC1kYXRhIHsKI2RlZmluZSBmaWxlX2Z1bGx0aWNrX3dpZHRoIDE0CiNkZWZpbmUgZmlsZV9mdWxsdGlja19oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlsZV9mdWxsdGlja19iaXRzW10gPSB7CiAgIDB4ZmUsIDB4MDEsIDB4MDIsIDB4MWEsIDB4MDIsIDB4MGMsIDB4MDIsIDB4MGMsIDB4MDIsIDB4MTYsIDB4MDIsIDB4MTYsCiAgIDB4MDIsIDB4MTMsIDB4MDAsIDB4MTMsIDB4ODYsIDB4MTEsIDB4OGMsIDB4MTEsIDB4ZDgsIDB4MTAsIDB4ZjIsIDB4MTAsCiAgIDB4NjIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9Owp9IC1tYXNrZGF0YSAkZmlsZW1hc2sKCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9wYXJ0dGljayAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCAiIzAwNTA1MCIgLWRhdGEgewojZGVmaW5lIHBhcnR0aWNrX3dpZHRoIDE0CiNkZWZpbmUgcGFydHRpY2tfaGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhcnR0aWNrX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHg3YSwgMHgwNSwgMHgwMiwgMHgwOSwgMHg3YSwgMHgxZiwgMHgwMiwgMHgxMCwKICAgMHg3YSwgMHgxNCwgMHgwMiwgMHgxNiwgMHgwMiwgMHgxMywgMHg4YSwgMHgxMSwgMHhkYSwgMHgxMCwgMHg3MiwgMHgxMCwKICAgMHgyMiwgMHgxMCwgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX3F1ZXN0aW9uIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsYWNrIC1kYXRhIHsKI2RlZmluZSBmaWxlX3F1ZXN0aW9uX3dpZHRoIDE0CiNkZWZpbmUgZmlsZV9xdWVzdGlvbl9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlsZV9xdWVzdGlvbl9iaXRzW10gPSB7CiAgIDB4ZmUsIDB4MDEsIDB4MDIsIDB4MDIsIDB4ZTIsIDB4MDQsIDB4ZjIsIDB4MDksIDB4MWEsIDB4MWIsIDB4MGEsIDB4MTMsCiAgIDB4ODIsIDB4MTEsIDB4YzIsIDB4MTAsIDB4NjIsIDB4MTAsIDB4NjIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4NjIsIDB4MTAsCiAgIDB4NjIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9Owp9IC1tYXNrZGF0YSAkZmlsZW1hc2sKCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9yZW1vdmVkIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIHJlZCAtZGF0YSB7CiNkZWZpbmUgZmlsZV9yZW1vdmVkX3dpZHRoIDE0CiNkZWZpbmUgZmlsZV9yZW1vdmVkX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBmaWxlX3JlbW92ZWRfYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDAzLCAweDAyLCAweDA1LCAweDAyLCAweDA5LCAweDAyLCAweDFmLCAweDAyLCAweDEwLAogICAweDFhLCAweDE2LCAweDMyLCAweDEzLCAweGUyLCAweDExLCAweGMyLCAweDEwLCAweGUyLCAweDExLCAweDMyLCAweDEzLAogICAweDFhLCAweDE2LCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfbWVyZ2UgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiNkZWZpbmUgZmlsZV9tZXJnZV93aWR0aCAxNAojZGVmaW5lIGZpbGVfbWVyZ2VfaGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIGZpbGVfbWVyZ2VfYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDAzLCAweDYyLCAweDA1LCAweDYyLCAweDA5LCAweDYyLCAweDFmLCAweDYyLCAweDEwLAogICAweGZhLCAweDExLCAweGYyLCAweDEwLCAweDYyLCAweDEwLCAweDAyLCAweDEwLCAweGZhLCAweDE3LCAweDAyLCAweDEwLAogICAweGZhLCAweDE3LCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgpzZXQgZmlsZV9kaXJfZGF0YSB7CiNkZWZpbmUgZmlsZV93aWR0aCAxOAojZGVmaW5lIGZpbGVfaGVpZ2h0IDE4CnN0YXRpYyB1bnNpZ25lZCBjaGFyIGZpbGVfYml0c1tdID0gewogIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4MDMsIDB4MDAsCiAgMHgwYywgMHgwMywgMHgwMCwgMHgwNCwgMHhmZSwgMHgwMCwgMHgwNiwgMHg4MCwgMHgwMCwgMHhmZiwgMHg5ZiwgMHgwMCwKICAweDAzLCAweDk4LCAweDAwLCAweDAyLCAweDkwLCAweDAwLCAweDA2LCAweGIwLCAweDAwLCAweDA0LCAweGEwLCAweDAwLAogIDB4MGMsIDB4ZTAsIDB4MDAsIDB4MDgsIDB4YzAsIDB4MDAsIDB4ZjgsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Cn0KaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX2RpciAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCBibHVlIFwKCS1kYXRhICRmaWxlX2Rpcl9kYXRhIC1tYXNrZGF0YSAkZmlsZV9kaXJfZGF0YQp1bnNldCBmaWxlX2Rpcl9kYXRhCgpzZXQgZmlsZV91cGxldmVsX2RhdGEgewojZGVmaW5lIHVwX3dpZHRoIDE1CiNkZWZpbmUgdXBfaGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIHVwX2JpdHNbXSA9IHsKICAweDgwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAzLCAweGYwLCAweDA3LCAweGY4LCAweDBmLCAweGZjLCAweDFmLAogIDB4ZmUsIDB4M2YsIDB4YzAsIDB4MDEsIDB4YzAsIDB4MDEsIDB4YzAsIDB4MDEsIDB4YzAsIDB4MDEsIDB4YzAsIDB4MDEsCiAgMHhjMCwgMHgwMSwgMHhjMCwgMHgwMSwgMHgwMCwgMHgwMH07Cn0KaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX3VwbGV2ZWwgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgcmVkIFwKCS1kYXRhICRmaWxlX3VwbGV2ZWxfZGF0YSAtbWFza2RhdGEgJGZpbGVfdXBsZXZlbF9kYXRhCnVuc2V0IGZpbGVfdXBsZXZlbF9kYXRhCgpzZXQgdWlfaW5kZXggLnZwYW5lLmZpbGVzLmluZGV4Lmxpc3QKc2V0IHVpX3dvcmtkaXIgLnZwYW5lLmZpbGVzLndvcmtkaXIubGlzdAoKc2V0IGFsbF9pY29ucyhfJHVpX2luZGV4KSAgIGZpbGVfcGxhaW4Kc2V0IGFsbF9pY29ucyhBJHVpX2luZGV4KSAgIGZpbGVfZnVsbHRpY2sKc2V0IGFsbF9pY29ucyhNJHVpX2luZGV4KSAgIGZpbGVfZnVsbHRpY2sKc2V0IGFsbF9pY29ucyhEJHVpX2luZGV4KSAgIGZpbGVfcmVtb3ZlZApzZXQgYWxsX2ljb25zKFUkdWlfaW5kZXgpICAgZmlsZV9tZXJnZQoKc2V0IGFsbF9pY29ucyhfJHVpX3dvcmtkaXIpIGZpbGVfcGxhaW4Kc2V0IGFsbF9pY29ucyhNJHVpX3dvcmtkaXIpIGZpbGVfbW9kCnNldCBhbGxfaWNvbnMoRCR1aV93b3JrZGlyKSBmaWxlX3F1ZXN0aW9uCnNldCBhbGxfaWNvbnMoVSR1aV93b3JrZGlyKSBmaWxlX21lcmdlCnNldCBhbGxfaWNvbnMoTyR1aV93b3JrZGlyKSBmaWxlX3BsYWluCgpzZXQgbWF4X3N0YXR1c19kZXNjIDAKZm9yZWFjaCBpIHsKCQl7X18gIlVubW9kaWZpZWQifQoKCQl7X00gIk1vZGlmaWVkLCBub3Qgc3RhZ2VkIn0KCQl7TV8gIlN0YWdlZCBmb3IgY29tbWl0In0KCQl7TU0gIlBvcnRpb25zIHN0YWdlZCBmb3IgY29tbWl0In0KCQl7TUQgIlN0YWdlZCBmb3IgY29tbWl0LCBtaXNzaW5nIn0KCgkJe19PICJVbnRyYWNrZWQsIG5vdCBzdGFnZWQifQoJCXtBXyAiU3RhZ2VkIGZvciBjb21taXQifQoJCXtBTSAiUG9ydGlvbnMgc3RhZ2VkIGZvciBjb21taXQifQoJCXtBRCAiU3RhZ2VkIGZvciBjb21taXQsIG1pc3NpbmcifQoKCQl7X0QgIk1pc3NpbmcifQoJCXtEXyAiU3RhZ2VkIGZvciByZW1vdmFsIn0KCQl7RE8gIlN0YWdlZCBmb3IgcmVtb3ZhbCwgc3RpbGwgcHJlc2VudCJ9CgoJCXtVXyAiUmVxdWlyZXMgbWVyZ2UgcmVzb2x1dGlvbiJ9CgkJe1VVICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIn0KCQl7VU0gIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24ifQoJCXtVRCAiUmVxdWlyZXMgbWVyZ2UgcmVzb2x1dGlvbiJ9Cgl9IHsKCWlmIHskbWF4X3N0YXR1c19kZXNjIDwgW3N0cmluZyBsZW5ndGggW2xpbmRleCAkaSAxXV19IHsKCQlzZXQgbWF4X3N0YXR1c19kZXNjIFtzdHJpbmcgbGVuZ3RoIFtsaW5kZXggJGkgMV1dCgl9CglzZXQgYWxsX2Rlc2NzKFtsaW5kZXggJGkgMF0pIFtsaW5kZXggJGkgMV0KfQp1bnNldCBpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHV0aWwKCnByb2MgYmluZF9idXR0b24zIHt3IGNtZH0gewoJYmluZCAkdyA8QW55LUJ1dHRvbi0zPiAkY21kCglpZiB7W2lzX01hY09TWF19IHsKCQliaW5kICR3IDxDb250cm9sLUJ1dHRvbi0xPiAkY21kCgl9Cn0KCnByb2Mgc2Nyb2xsYmFyMm1hbnkge2xpc3QgbW9kZSBhcmdzfSB7Cglmb3JlYWNoIHcgJGxpc3Qge2V2YWwgJHcgJG1vZGUgJGFyZ3N9Cn0KCnByb2MgbWFueTJzY3JvbGxiYXIge2xpc3QgbW9kZSBzYiB0b3AgYm90dG9tfSB7Cgkkc2Igc2V0ICR0b3AgJGJvdHRvbQoJZm9yZWFjaCB3ICRsaXN0IHskdyAkbW9kZSBtb3ZldG8gJHRvcH0KfQoKcHJvYyBpbmNyX2ZvbnRfc2l6ZSB7Zm9udCB7YW10IDF9fSB7CglzZXQgc3ogW2ZvbnQgY29uZmlndXJlICRmb250IC1zaXplXQoJaW5jciBzeiAkYW10Cglmb250IGNvbmZpZ3VyZSAkZm9udCAtc2l6ZSAkc3oKCWZvbnQgY29uZmlndXJlICR7Zm9udH1ib2xkIC1zaXplICRzegp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHVpIGNvbW1hbmRzCgpzZXQgc3RhcnRpbmdfZ2l0a19tc2cge1N0YXJ0aW5nIGdpdGsuLi4gcGxlYXNlIHdhaXQuLi59Cgpwcm9jIGRvX2dpdGsge3JldnN9IHsKCWdsb2JhbCBlbnYgdWlfc3RhdHVzX3ZhbHVlIHN0YXJ0aW5nX2dpdGtfbXNnCgoJIyAtLSBBbHdheXMgc3RhcnQgZ2l0ayB0aHJvdWdoIHdoYXRldmVyIHdlIHdlcmUgbG9hZGVkIHdpdGguICBUaGlzCgkjICAgIGxldHMgdXMgYnlwYXNzIHVzaW5nIHNoZWxsIHByb2Nlc3Mgb24gV2luZG93cyBzeXN0ZW1zLgoJIwoJc2V0IGNtZCBbbGlzdCBbaW5mbyBuYW1lb2ZleGVjdXRhYmxlXV0KCWxhcHBlbmQgY21kIFtnaXRleGVjIGdpdGtdCglpZiB7JHJldnMgbmUge319IHsKCQlhcHBlbmQgY21kIHsgfQoJCWFwcGVuZCBjbWQgJHJldnMKCX0KCglpZiB7W2NhdGNoIHtldmFsIGV4ZWMgJGNtZCAmfSBlcnJdfSB7CgkJZXJyb3JfcG9wdXAgIkZhaWxlZCB0byBzdGFydCBnaXRrOlxuXG4kZXJyIgoJfSBlbHNlIHsKCQlzZXQgdWlfc3RhdHVzX3ZhbHVlICRzdGFydGluZ19naXRrX21zZwoJCWFmdGVyIDEwMDAwIHsKCQkJaWYgeyR1aV9zdGF0dXNfdmFsdWUgZXEgJHN0YXJ0aW5nX2dpdGtfbXNnfSB7CgkJCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59CgkJCX0KCQl9Cgl9Cn0KCnNldCBpc19xdWl0dGluZyAwCgpwcm9jIGRvX3F1aXQge30gewoJZ2xvYmFsIHVpX2NvbW0gaXNfcXVpdHRpbmcgcmVwb19jb25maWcgY29tbWl0X3R5cGUKCglpZiB7JGlzX3F1aXR0aW5nfSByZXR1cm4KCXNldCBpc19xdWl0dGluZyAxCgoJaWYge1t3aW5mbyBleGlzdHMgJHVpX2NvbW1dfSB7CgkJIyAtLSBTdGFzaCBvdXIgY3VycmVudCBjb21taXQgYnVmZmVyLgoJCSMKCQlzZXQgc2F2ZSBbZ2l0ZGlyIEdJVEdVSV9NU0ddCgkJc2V0IG1zZyBbc3RyaW5nIHRyaW0gWyR1aV9jb21tIGdldCAwLjAgZW5kXV0KCQlyZWdzdWIgLWFsbCAtbGluZSB7WyBcclx0XSskfSAkbXNnIHt9IG1zZwoJCWlmIHsoIVtzdHJpbmcgbWF0Y2ggYW1lbmQqICRjb21taXRfdHlwZV0KCQkJfHwgWyR1aV9jb21tIGVkaXQgbW9kaWZpZWRdKQoJCQkmJiAkbXNnIG5lIHt9fSB7CgkJCWNhdGNoIHsKCQkJCXNldCBmZCBbb3BlbiAkc2F2ZSB3XQoJCQkJcHV0cyAtbm9uZXdsaW5lICRmZCAkbXNnCgkJCQljbG9zZSAkZmQKCQkJfQoJCX0gZWxzZSB7CgkJCWNhdGNoIHtmaWxlIGRlbGV0ZSAkc2F2ZX0KCQl9CgoJCSMgLS0gU3Rhc2ggb3VyIGN1cnJlbnQgd2luZG93IGdlb21ldHJ5IGludG8gdGhpcyByZXBvc2l0b3J5LgoJCSMKCQlzZXQgY2ZnX2dlb21ldHJ5IFtsaXN0XQoJCWxhcHBlbmQgY2ZnX2dlb21ldHJ5IFt3bSBnZW9tZXRyeSAuXQoJCWxhcHBlbmQgY2ZnX2dlb21ldHJ5IFtsaW5kZXggWy52cGFuZSBzYXNoIGNvb3JkIDBdIDFdCgkJbGFwcGVuZCBjZmdfZ2VvbWV0cnkgW2xpbmRleCBbLnZwYW5lLmZpbGVzIHNhc2ggY29vcmQgMF0gMF0KCQlpZiB7W2NhdGNoIHtzZXQgcmNfZ2VvbWV0cnkgJHJlcG9fY29uZmlnKGd1aS5nZW9tZXRyeSl9XX0gewoJCQlzZXQgcmNfZ2VvbWV0cnkge30KCQl9CgkJaWYgeyRjZmdfZ2VvbWV0cnkgbmUgJHJjX2dlb21ldHJ5fSB7CgkJCWNhdGNoIHtnaXQgY29uZmlnIGd1aS5nZW9tZXRyeSAkY2ZnX2dlb21ldHJ5fQoJCX0KCX0KCglkZXN0cm95IC4KfQoKcHJvYyBkb19yZXNjYW4ge30gewoJcmVzY2FuIHtzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59fQp9Cgpwcm9jIGRvX2NvbW1pdCB7fSB7Cgljb21taXRfdHJlZQp9Cgpwcm9jIHRvZ2dsZV9vcl9kaWZmIHt3IHggeX0gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIGZpbGVfbGlzdHMgY3VycmVudF9kaWZmX3BhdGggdWlfaW5kZXggdWlfd29ya2RpcgoJZ2xvYmFsIGxhc3RfY2xpY2tlZCBzZWxlY3RlZF9wYXRocwoKCXNldCBwb3MgW3NwbGl0IFskdyBpbmRleCBAJHgsJHldIC5dCglzZXQgbG5vIFtsaW5kZXggJHBvcyAwXQoJc2V0IGNvbCBbbGluZGV4ICRwb3MgMV0KCXNldCBwYXRoIFtsaW5kZXggJGZpbGVfbGlzdHMoJHcpIFtleHByIHskbG5vIC0gMX1dXQoJaWYgeyRwYXRoIGVxIHt9fSB7CgkJc2V0IGxhc3RfY2xpY2tlZCB7fQoJCXJldHVybgoJfQoKCXNldCBsYXN0X2NsaWNrZWQgW2xpc3QgJHcgJGxub10KCWFycmF5IHVuc2V0IHNlbGVjdGVkX3BhdGhzCgkkdWlfaW5kZXggdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoJJHVpX3dvcmtkaXIgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoKCWlmIHskY29sID09IDB9IHsKCQlpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIGVxICRwYXRofSB7CgkJCXNldCBhZnRlciB7cmVzaG93X2RpZmY7fQoJCX0gZWxzZSB7CgkJCXNldCBhZnRlciB7fQoJCX0KCQlpZiB7JHcgZXEgJHVpX2luZGV4fSB7CgkJCXVwZGF0ZV9pbmRleGluZm8gXAoJCQkJIlVuc3RhZ2luZyBbc2hvcnRfcGF0aCAkcGF0aF0gZnJvbSBjb21taXQiIFwKCQkJCVtsaXN0ICRwYXRoXSBcCgkJCQlbY29uY2F0ICRhZnRlciB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX1dCgkJfSBlbHNlaWYgeyR3IGVxICR1aV93b3JrZGlyfSB7CgkJCXVwZGF0ZV9pbmRleCBcCgkJCQkiQWRkaW5nIFtzaG9ydF9wYXRoICRwYXRoXSIgXAoJCQkJW2xpc3QgJHBhdGhdIFwKCQkJCVtjb25jYXQgJGFmdGVyIHtzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59fV0KCQl9Cgl9IGVsc2UgewoJCXNob3dfZGlmZiAkcGF0aCAkdyAkbG5vCgl9Cn0KCnByb2MgYWRkX29uZV90b19zZWxlY3Rpb24ge3cgeCB5fSB7CglnbG9iYWwgZmlsZV9saXN0cyBsYXN0X2NsaWNrZWQgc2VsZWN0ZWRfcGF0aHMKCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBAJHgsJHldIC5dIDBdCglzZXQgcGF0aCBbbGluZGV4ICRmaWxlX2xpc3RzKCR3KSBbZXhwciB7JGxubyAtIDF9XV0KCWlmIHskcGF0aCBlcSB7fX0gewoJCXNldCBsYXN0X2NsaWNrZWQge30KCQlyZXR1cm4KCX0KCglpZiB7JGxhc3RfY2xpY2tlZCBuZSB7fQoJCSYmIFtsaW5kZXggJGxhc3RfY2xpY2tlZCAwXSBuZSAkd30gewoJCWFycmF5IHVuc2V0IHNlbGVjdGVkX3BhdGhzCgkJW2xpbmRleCAkbGFzdF9jbGlja2VkIDBdIHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCX0KCglzZXQgbGFzdF9jbGlja2VkIFtsaXN0ICR3ICRsbm9dCglpZiB7W2NhdGNoIHtzZXQgaW5fc2VsICRzZWxlY3RlZF9wYXRocygkcGF0aCl9XX0gewoJCXNldCBpbl9zZWwgMAoJfQoJaWYgeyRpbl9zZWx9IHsKCQl1bnNldCBzZWxlY3RlZF9wYXRocygkcGF0aCkKCQkkdyB0YWcgcmVtb3ZlIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJfSBlbHNlIHsKCQlzZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpIDEKCQkkdyB0YWcgYWRkIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJfQp9Cgpwcm9jIGFkZF9yYW5nZV90b19zZWxlY3Rpb24ge3cgeCB5fSB7CglnbG9iYWwgZmlsZV9saXN0cyBsYXN0X2NsaWNrZWQgc2VsZWN0ZWRfcGF0aHMKCglpZiB7W2xpbmRleCAkbGFzdF9jbGlja2VkIDBdIG5lICR3fSB7CgkJdG9nZ2xlX29yX2RpZmYgJHcgJHggJHkKCQlyZXR1cm4KCX0KCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBAJHgsJHldIC5dIDBdCglzZXQgbGMgW2xpbmRleCAkbGFzdF9jbGlja2VkIDFdCglpZiB7JGxjIDwgJGxub30gewoJCXNldCBiZWdpbiAkbGMKCQlzZXQgZW5kICRsbm8KCX0gZWxzZSB7CgkJc2V0IGJlZ2luICRsbm8KCQlzZXQgZW5kICRsYwoJfQoKCWZvcmVhY2ggcGF0aCBbbHJhbmdlICRmaWxlX2xpc3RzKCR3KSBcCgkJW2V4cHIgeyRiZWdpbiAtIDF9XSBcCgkJW2V4cHIgeyRlbmQgLSAxfV1dIHsKCQlzZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpIDEKCX0KCSR3IHRhZyBhZGQgaW5fc2VsICRiZWdpbi4wIFtleHByIHskZW5kICsgMX1dLjAKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBjb25maWcgZGVmYXVsdHMKCnNldCBjdXJzb3JfcHRyIGFycm93CmZvbnQgY3JlYXRlIGZvbnRfZGlmZiAtZmFtaWx5IENvdXJpZXIgLXNpemUgMTAKZm9udCBjcmVhdGUgZm9udF91aQpjYXRjaCB7CglsYWJlbCAuZHVtbXkKCWV2YWwgZm9udCBjb25maWd1cmUgZm9udF91aSBbZm9udCBhY3R1YWwgWy5kdW1teSBjZ2V0IC1mb250XV0KCWRlc3Ryb3kgLmR1bW15Cn0KCmZvbnQgY3JlYXRlIGZvbnRfdWlib2xkCmZvbnQgY3JlYXRlIGZvbnRfZGlmZmJvbGQKCmZvcmVhY2ggY2xhc3Mge0J1dHRvbiBDaGVja2J1dHRvbiBFbnRyeSBMYWJlbAoJCUxhYmVsZnJhbWUgTGlzdGJveCBNZW51IE1lc3NhZ2UKCQlSYWRpb2J1dHRvbiBUZXh0fSB7CglvcHRpb24gYWRkICokY2xhc3MuZm9udCBmb250X3VpCn0KdW5zZXQgY2xhc3MKCmlmIHtbaXNfTWFjT1NYXX0gewoJc2V0IE0xQiBNMQoJc2V0IE0xVCBDbWQKfSBlbHNlIHsKCXNldCBNMUIgQ29udHJvbAoJc2V0IE0xVCBDdHJsCn0KCnByb2MgYXBwbHlfY29uZmlnIHt9IHsKCWdsb2JhbCByZXBvX2NvbmZpZyBmb250X2Rlc2NzCgoJZm9yZWFjaCBvcHRpb24gJGZvbnRfZGVzY3MgewoJCXNldCBuYW1lIFtsaW5kZXggJG9wdGlvbiAwXQoJCXNldCBmb250IFtsaW5kZXggJG9wdGlvbiAxXQoJCWlmIHtbY2F0Y2ggewoJCQlmb3JlYWNoIHtjbiBjdn0gJHJlcG9fY29uZmlnKGd1aS4kbmFtZSkgewoJCQkJZm9udCBjb25maWd1cmUgJGZvbnQgJGNuICRjdgoJCQl9CgkJCX0gZXJyXX0gewoJCQllcnJvcl9wb3B1cCAiSW52YWxpZCBmb250IHNwZWNpZmllZCBpbiBndWkuJG5hbWU6XG5cbiRlcnIiCgkJfQoJCWZvcmVhY2gge2NuIGN2fSBbZm9udCBjb25maWd1cmUgJGZvbnRdIHsKCQkJZm9udCBjb25maWd1cmUgJHtmb250fWJvbGQgJGNuICRjdgoJCX0KCQlmb250IGNvbmZpZ3VyZSAke2ZvbnR9Ym9sZCAtd2VpZ2h0IGJvbGQKCX0KfQoKc2V0IGRlZmF1bHRfY29uZmlnKG1lcmdlLnN1bW1hcnkpIGZhbHNlCnNldCBkZWZhdWx0X2NvbmZpZyhtZXJnZS52ZXJib3NpdHkpIDIKc2V0IGRlZmF1bHRfY29uZmlnKHVzZXIubmFtZSkge30Kc2V0IGRlZmF1bHRfY29uZmlnKHVzZXIuZW1haWwpIHt9CgpzZXQgZGVmYXVsdF9jb25maWcoZ3VpLnRydXN0bXRpbWUpIGZhbHNlCnNldCBkZWZhdWx0X2NvbmZpZyhndWkuZGlmZmNvbnRleHQpIDUKc2V0IGRlZmF1bHRfY29uZmlnKGd1aS5uZXdicmFuY2h0ZW1wbGF0ZSkge30Kc2V0IGRlZmF1bHRfY29uZmlnKGd1aS5mb250dWkpIFtmb250IGNvbmZpZ3VyZSBmb250X3VpXQpzZXQgZGVmYXVsdF9jb25maWcoZ3VpLmZvbnRkaWZmKSBbZm9udCBjb25maWd1cmUgZm9udF9kaWZmXQpzZXQgZm9udF9kZXNjcyB7Cgl7Zm9udHVpICAgZm9udF91aSAgIHtNYWluIEZvbnR9fQoJe2ZvbnRkaWZmIGZvbnRfZGlmZiB7RGlmZi9Db25zb2xlIEZvbnR9fQp9CmxvYWRfY29uZmlnIDAKYXBwbHlfY29uZmlnCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGZlYXR1cmUgb3B0aW9uIHNlbGVjdGlvbgoKaWYge1tyZWdleHAge15naXQtKC4rKSR9IFthcHBuYW1lXSBfanVuayBzdWJjb21tYW5kXX0gewoJdW5zZXQgX2p1bmsKfSBlbHNlIHsKCXNldCBzdWJjb21tYW5kIGd1aQp9CmlmIHskc3ViY29tbWFuZCBlcSB7Z3VpLnNofX0gewoJc2V0IHN1YmNvbW1hbmQgZ3VpCn0KaWYgeyRzdWJjb21tYW5kIGVxIHtndWl9ICYmIFtsbGVuZ3RoICRhcmd2XSA+IDB9IHsKCXNldCBzdWJjb21tYW5kIFtsaW5kZXggJGFyZ3YgMF0KCXNldCBhcmd2IFtscmFuZ2UgJGFyZ3YgMSBlbmRdCn0KCmVuYWJsZV9vcHRpb24gbXVsdGljb21taXQKZW5hYmxlX29wdGlvbiBicmFuY2gKZW5hYmxlX29wdGlvbiB0cmFuc3BvcnQKCnN3aXRjaCAtLSAkc3ViY29tbWFuZCB7CmJyb3dzZXIgLQpibGFtZSB7CglkaXNhYmxlX29wdGlvbiBtdWx0aWNvbW1pdAoJZGlzYWJsZV9vcHRpb24gYnJhbmNoCglkaXNhYmxlX29wdGlvbiB0cmFuc3BvcnQKfQpjaXRvb2wgewoJZW5hYmxlX29wdGlvbiBzaW5nbGVjb21taXQKCglkaXNhYmxlX29wdGlvbiBtdWx0aWNvbW1pdAoJZGlzYWJsZV9vcHRpb24gYnJhbmNoCglkaXNhYmxlX29wdGlvbiB0cmFuc3BvcnQKfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHVpIGNvbnN0cnVjdGlvbgoKc2V0IHVpX2NvbW0ge30KCiMgLS0gTWVudSBCYXIKIwptZW51IC5tYmFyIC10ZWFyb2ZmIDAKLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIFJlcG9zaXRvcnkgLW1lbnUgLm1iYXIucmVwb3NpdG9yeQoubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgRWRpdCAtbWVudSAubWJhci5lZGl0CmlmIHtbaXNfZW5hYmxlZCBicmFuY2hdfSB7CgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgQnJhbmNoIC1tZW51IC5tYmFyLmJyYW5jaAp9CmlmIHtbaXNfZW5hYmxlZCBtdWx0aWNvbW1pdF0gfHwgW2lzX2VuYWJsZWQgc2luZ2xlY29tbWl0XX0gewoJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIENvbW1pdCAtbWVudSAubWJhci5jb21taXQKfQppZiB7W2lzX2VuYWJsZWQgdHJhbnNwb3J0XX0gewoJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIE1lcmdlIC1tZW51IC5tYmFyLm1lcmdlCgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgRmV0Y2ggLW1lbnUgLm1iYXIuZmV0Y2gKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBQdXNoIC1tZW51IC5tYmFyLnB1c2gKfQouIGNvbmZpZ3VyZSAtbWVudSAubWJhcgoKIyAtLSBSZXBvc2l0b3J5IE1lbnUKIwptZW51IC5tYmFyLnJlcG9zaXRvcnkKCi5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtCcm93c2UgQ3VycmVudCBCcmFuY2h9IFwKCS1jb21tYW5kIHticm93c2VyOjpuZXcgJGN1cnJlbnRfYnJhbmNofQp0cmFjZSBhZGQgdmFyaWFibGUgY3VycmVudF9icmFuY2ggd3JpdGUgIi5tYmFyLnJlcG9zaXRvcnkgZW50cnljb25mIFsubWJhci5yZXBvc2l0b3J5IGluZGV4IGxhc3RdIC1sYWJlbCBcIkJyb3dzZSBcJGN1cnJlbnRfYnJhbmNoXCIgOyMiCi5tYmFyLnJlcG9zaXRvcnkgYWRkIHNlcGFyYXRvcgoKLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Zpc3VhbGl6ZSBDdXJyZW50IEJyYW5jaH0gXAoJLWNvbW1hbmQge2RvX2dpdGsgJGN1cnJlbnRfYnJhbmNofQp0cmFjZSBhZGQgdmFyaWFibGUgY3VycmVudF9icmFuY2ggd3JpdGUgIi5tYmFyLnJlcG9zaXRvcnkgZW50cnljb25mIFsubWJhci5yZXBvc2l0b3J5IGluZGV4IGxhc3RdIC1sYWJlbCBcIlZpc3VhbGl6ZSBcJGN1cnJlbnRfYnJhbmNoXCIgOyMiCi5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtWaXN1YWxpemUgQWxsIEJyYW5jaGVzfSBcCgktY29tbWFuZCB7ZG9fZ2l0ayAtLWFsbH0KLm1iYXIucmVwb3NpdG9yeSBhZGQgc2VwYXJhdG9yCgppZiB7W2lzX2VuYWJsZWQgbXVsdGljb21taXRdfSB7CgkubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIC1sYWJlbCB7RGF0YWJhc2UgU3RhdGlzdGljc30gXAoJCS1jb21tYW5kIGRvX3N0YXRzCgoJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCAtbGFiZWwge0NvbXByZXNzIERhdGFiYXNlfSBcCgkJLWNvbW1hbmQgZG9fZ2MKCgkubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIC1sYWJlbCB7VmVyaWZ5IERhdGFiYXNlfSBcCgkJLWNvbW1hbmQgZG9fZnNja19vYmplY3RzCgoJLm1iYXIucmVwb3NpdG9yeSBhZGQgc2VwYXJhdG9yCgoJaWYge1tpc19DeWd3aW5dfSB7CgkJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgkJCS1sYWJlbCB7Q3JlYXRlIERlc2t0b3AgSWNvbn0gXAoJCQktY29tbWFuZCBkb19jeWd3aW5fc2hvcnRjdXQKCX0gZWxzZWlmIHtbaXNfV2luZG93c119IHsKCQkubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIFwKCQkJLWxhYmVsIHtDcmVhdGUgRGVza3RvcCBJY29ufSBcCgkJCS1jb21tYW5kIGRvX3dpbmRvd3Nfc2hvcnRjdXQKCX0gZWxzZWlmIHtbaXNfTWFjT1NYXX0gewoJCS5tYmFyLnJlcG9zaXRvcnkgYWRkIGNvbW1hbmQgXAoJCQktbGFiZWwge0NyZWF0ZSBEZXNrdG9wIEljb259IFwKCQkJLWNvbW1hbmQgZG9fbWFjb3N4X2FwcAoJfQp9CgoubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIC1sYWJlbCBRdWl0IFwKCS1jb21tYW5kIGRvX3F1aXQgXAoJLWFjY2VsZXJhdG9yICRNMVQtUQoKIyAtLSBFZGl0IE1lbnUKIwptZW51IC5tYmFyLmVkaXQKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgVW5kbyBcCgktY29tbWFuZCB7Y2F0Y2gge1tmb2N1c10gZWRpdCB1bmRvfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtWgoubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBSZWRvIFwKCS1jb21tYW5kIHtjYXRjaCB7W2ZvY3VzXSBlZGl0IHJlZG99fSBcCgktYWNjZWxlcmF0b3IgJE0xVC1ZCi5tYmFyLmVkaXQgYWRkIHNlcGFyYXRvcgoubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBDdXQgXAoJLWNvbW1hbmQge2NhdGNoIHt0a190ZXh0Q3V0IFtmb2N1c119fSBcCgktYWNjZWxlcmF0b3IgJE0xVC1YCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIENvcHkgXAoJLWNvbW1hbmQge2NhdGNoIHt0a190ZXh0Q29weSBbZm9jdXNdfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtQwoubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBQYXN0ZSBcCgktY29tbWFuZCB7Y2F0Y2gge3RrX3RleHRQYXN0ZSBbZm9jdXNdOyBbZm9jdXNdIHNlZSBpbnNlcnR9fSBcCgktYWNjZWxlcmF0b3IgJE0xVC1WCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIERlbGV0ZSBcCgktY29tbWFuZCB7Y2F0Y2gge1tmb2N1c10gZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdH19IFwKCS1hY2NlbGVyYXRvciBEZWwKLm1iYXIuZWRpdCBhZGQgc2VwYXJhdG9yCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtTZWxlY3QgQWxsfSBcCgktY29tbWFuZCB7Y2F0Y2gge1tmb2N1c10gdGFnIGFkZCBzZWwgMC4wIGVuZH19IFwKCS1hY2NlbGVyYXRvciAkTTFULUEKCiMgLS0gQnJhbmNoIE1lbnUKIwppZiB7W2lzX2VuYWJsZWQgYnJhbmNoXX0gewoJbWVudSAubWJhci5icmFuY2gKCgkubWJhci5icmFuY2ggYWRkIGNvbW1hbmQgLWxhYmVsIHtDcmVhdGUuLi59IFwKCQktY29tbWFuZCBkb19jcmVhdGVfYnJhbmNoIFwKCQktYWNjZWxlcmF0b3IgJE0xVC1OCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBbbGlzdCAubWJhci5icmFuY2ggZW50cnljb25mIFwKCQlbLm1iYXIuYnJhbmNoIGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5icmFuY2ggYWRkIGNvbW1hbmQgLWxhYmVsIHtEZWxldGUuLi59IFwKCQktY29tbWFuZCBkb19kZWxldGVfYnJhbmNoCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBbbGlzdCAubWJhci5icmFuY2ggZW50cnljb25mIFwKCQlbLm1iYXIuYnJhbmNoIGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5icmFuY2ggYWRkIGNvbW1hbmQgLWxhYmVsIHtSZXNldC4uLn0gXAoJCS1jb21tYW5kIG1lcmdlOjpyZXNldF9oYXJkCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBbbGlzdCAubWJhci5icmFuY2ggZW50cnljb25mIFwKCQlbLm1iYXIuYnJhbmNoIGluZGV4IGxhc3RdIC1zdGF0ZV0KfQoKIyAtLSBDb21taXQgTWVudQojCmlmIHtbaXNfZW5hYmxlZCBtdWx0aWNvbW1pdF0gfHwgW2lzX2VuYWJsZWQgc2luZ2xlY29tbWl0XX0gewoJbWVudSAubWJhci5jb21taXQKCgkubWJhci5jb21taXQgYWRkIHJhZGlvYnV0dG9uIFwKCQktbGFiZWwge05ldyBDb21taXR9IFwKCQktY29tbWFuZCBkb19zZWxlY3RfY29tbWl0X3R5cGUgXAoJCS12YXJpYWJsZSBzZWxlY3RlZF9jb21taXRfdHlwZSBcCgkJLXZhbHVlIG5ldwoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCByYWRpb2J1dHRvbiBcCgkJLWxhYmVsIHtBbWVuZCBMYXN0IENvbW1pdH0gXAoJCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCgkJLXZhcmlhYmxlIHNlbGVjdGVkX2NvbW1pdF90eXBlIFwKCQktdmFsdWUgYW1lbmQKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgc2VwYXJhdG9yCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCBSZXNjYW4gXAoJCS1jb21tYW5kIGRvX3Jlc2NhbiBcCgkJLWFjY2VsZXJhdG9yIEY1CglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtBZGQgVG8gQ29tbWl0fSBcCgkJLWNvbW1hbmQgZG9fYWRkX3NlbGVjdGlvbgoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCB7QWRkIEV4aXN0aW5nIFRvIENvbW1pdH0gXAoJCS1jb21tYW5kIGRvX2FkZF9hbGwgXAoJCS1hY2NlbGVyYXRvciAkTTFULUkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwge1Vuc3RhZ2UgRnJvbSBDb21taXR9IFwKCQktY29tbWFuZCBkb191bnN0YWdlX3NlbGVjdGlvbgoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCB7UmV2ZXJ0IENoYW5nZXN9IFwKCQktY29tbWFuZCBkb19yZXZlcnRfc2VsZWN0aW9uCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIHNlcGFyYXRvcgoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwge1NpZ24gT2ZmfSBcCgkJLWNvbW1hbmQgZG9fc2lnbm9mZiBcCgkJLWFjY2VsZXJhdG9yICRNMVQtUwoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwgQ29tbWl0IFwKCQktY29tbWFuZCBkb19jb21taXQgXAoJCS1hY2NlbGVyYXRvciAkTTFULVJldHVybgoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCn0KCiMgLS0gTWVyZ2UgTWVudQojCmlmIHtbaXNfZW5hYmxlZCBicmFuY2hdfSB7CgltZW51IC5tYmFyLm1lcmdlCgkubWJhci5tZXJnZSBhZGQgY29tbWFuZCAtbGFiZWwge0xvY2FsIE1lcmdlLi4ufSBcCgkJLWNvbW1hbmQgbWVyZ2U6OmRpYWxvZwoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLm1lcmdlIGVudHJ5Y29uZiBbLm1iYXIubWVyZ2UgaW5kZXggbGFzdF0gLXN0YXRlXQoJLm1iYXIubWVyZ2UgYWRkIGNvbW1hbmQgLWxhYmVsIHtBYm9ydCBNZXJnZS4uLn0gXAoJCS1jb21tYW5kIG1lcmdlOjpyZXNldF9oYXJkCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIubWVyZ2UgZW50cnljb25mIFsubWJhci5tZXJnZSBpbmRleCBsYXN0XSAtc3RhdGVdCgp9CgojIC0tIFRyYW5zcG9ydCBNZW51CiMKaWYge1tpc19lbmFibGVkIHRyYW5zcG9ydF19IHsKCW1lbnUgLm1iYXIuZmV0Y2gKCgltZW51IC5tYmFyLnB1c2gKCS5tYmFyLnB1c2ggYWRkIGNvbW1hbmQgLWxhYmVsIHtQdXNoLi4ufSBcCgkJLWNvbW1hbmQgZG9fcHVzaF9hbnl3aGVyZQp9CgppZiB7W2lzX01hY09TWF19IHsKCSMgLS0gQXBwbGUgTWVudSAoTWFjIE9TIFggb25seSkKCSMKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBBcHBsZSAtbWVudSAubWJhci5hcHBsZQoJbWVudSAubWJhci5hcHBsZQoKCS5tYmFyLmFwcGxlIGFkZCBjb21tYW5kIC1sYWJlbCAiQWJvdXQgW2FwcG5hbWVdIiBcCgkJLWNvbW1hbmQgZG9fYWJvdXQKCS5tYmFyLmFwcGxlIGFkZCBjb21tYW5kIC1sYWJlbCAiT3B0aW9ucy4uLiIgXAoJCS1jb21tYW5kIGRvX29wdGlvbnMKfSBlbHNlIHsKCSMgLS0gRWRpdCBNZW51CgkjCgkubWJhci5lZGl0IGFkZCBzZXBhcmF0b3IKCS5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtPcHRpb25zLi4ufSBcCgkJLWNvbW1hbmQgZG9fb3B0aW9ucwoKCSMgLS0gVG9vbHMgTWVudQoJIwoJaWYge1tmaWxlIGV4aXN0cyAvdXNyL2xvY2FsL21pZ2EvbGliL2d1aS1taWdhXQoJCSYmIFtmaWxlIGV4aXN0cyAucHZjc3JjXX0gewoJcHJvYyBkb19taWdhIHt9IHsKCQlnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlCgkJaWYgeyFbbG9ja19pbmRleCB1cGRhdGVdfSByZXR1cm4KCQlzZXQgY21kIFtsaXN0IHNoIC0tbG9naW4gLWMgIi91c3IvbG9jYWwvbWlnYS9saWIvZ3VpLW1pZ2EgXCJbcHdkXVwiIl0KCQlzZXQgbWlnYV9mZCBbb3BlbiAifCRjbWQiIHJdCgkJZmNvbmZpZ3VyZSAkbWlnYV9mZCAtYmxvY2tpbmcgMAoJCWZpbGVldmVudCAkbWlnYV9mZCByZWFkYWJsZSBbbGlzdCBtaWdhX2RvbmUgJG1pZ2FfZmRdCgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UnVubmluZyBtaWdhLi4ufQoJfQoJcHJvYyBtaWdhX2RvbmUge2ZkfSB7CgkJcmVhZCAkZmQgNTEyCgkJaWYge1tlb2YgJGZkXX0gewoJCQljbG9zZSAkZmQKCQkJdW5sb2NrX2luZGV4CgkJCXJlc2NhbiBbbGlzdCBzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59XQoJCX0KCX0KCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBUb29scyAtbWVudSAubWJhci50b29scwoJbWVudSAubWJhci50b29scwoJLm1iYXIudG9vbHMgYWRkIGNvbW1hbmQgLWxhYmVsICJNaWdyYXRlIiBcCgkJLWNvbW1hbmQgZG9fbWlnYQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLnRvb2xzIGVudHJ5Y29uZiBbLm1iYXIudG9vbHMgaW5kZXggbGFzdF0gLXN0YXRlXQoJfQp9CgojIC0tIEhlbHAgTWVudQojCi5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBIZWxwIC1tZW51IC5tYmFyLmhlbHAKbWVudSAubWJhci5oZWxwCgppZiB7IVtpc19NYWNPU1hdfSB7CgkubWJhci5oZWxwIGFkZCBjb21tYW5kIC1sYWJlbCAiQWJvdXQgW2FwcG5hbWVdIiBcCgkJLWNvbW1hbmQgZG9fYWJvdXQKfQoKc2V0IGJyb3dzZXIge30KY2F0Y2gge3NldCBicm93c2VyICRyZXBvX2NvbmZpZyhpbnN0YXdlYi5icm93c2VyKX0Kc2V0IGRvY19wYXRoIFtmaWxlIGRpcm5hbWUgW2dpdGV4ZWNdXQpzZXQgZG9jX3BhdGggW2ZpbGUgam9pbiAkZG9jX3BhdGggRG9jdW1lbnRhdGlvbiBpbmRleC5odG1sXQoKaWYge1tpc19DeWd3aW5dfSB7CglzZXQgZG9jX3BhdGggW2V4ZWMgY3lncGF0aCAtLW1peGVkICRkb2NfcGF0aF0KfQoKaWYgeyRicm93c2VyIGVxIHt9fSB7CglpZiB7W2lzX01hY09TWF19IHsKCQlzZXQgYnJvd3NlciBvcGVuCgl9IGVsc2VpZiB7W2lzX0N5Z3dpbl19IHsKCQlzZXQgcHJvZ3JhbV9maWxlcyBbZmlsZSBkaXJuYW1lIFtleGVjIGN5Z3BhdGggLS13aW5kaXJdXQoJCXNldCBwcm9ncmFtX2ZpbGVzIFtmaWxlIGpvaW4gJHByb2dyYW1fZmlsZXMge1Byb2dyYW0gRmlsZXN9XQoJCXNldCBmaXJlZm94IFtmaWxlIGpvaW4gJHByb2dyYW1fZmlsZXMge01vemlsbGEgRmlyZWZveH0gZmlyZWZveC5leGVdCgkJc2V0IGllIFtmaWxlIGpvaW4gJHByb2dyYW1fZmlsZXMge0ludGVybmV0IEV4cGxvcmVyfSBJRVhQTE9SRS5FWEVdCgkJaWYge1tmaWxlIGV4aXN0cyAkZmlyZWZveF19IHsKCQkJc2V0IGJyb3dzZXIgJGZpcmVmb3gKCQl9IGVsc2VpZiB7W2ZpbGUgZXhpc3RzICRpZV19IHsKCQkJc2V0IGJyb3dzZXIgJGllCgkJfQoJCXVuc2V0IHByb2dyYW1fZmlsZXMgZmlyZWZveCBpZQoJfQp9CgppZiB7W2ZpbGUgaXNmaWxlICRkb2NfcGF0aF19IHsKCXNldCBkb2NfdXJsICJmaWxlOiRkb2NfcGF0aCIKfSBlbHNlIHsKCXNldCBkb2NfdXJsIHtodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy99Cn0KCmlmIHskYnJvd3NlciBuZSB7fX0gewoJLm1iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwge09ubGluZSBEb2N1bWVudGF0aW9ufSBcCgkJLWNvbW1hbmQgW2xpc3QgZXhlYyAkYnJvd3NlciAkZG9jX3VybCAmXQp9CnVuc2V0IGJyb3dzZXIgZG9jX3BhdGggZG9jX3VybAoKIyAtLSBTdGFuZGFyZCBiaW5kaW5ncwojCmJpbmQgLiAgIDxEZXN0cm95PiBkb19xdWl0CmJpbmQgYWxsIDwkTTFCLUtleS1xPiBkb19xdWl0CmJpbmQgYWxsIDwkTTFCLUtleS1RPiBkb19xdWl0CmJpbmQgYWxsIDwkTTFCLUtleS13PiB7ZGVzdHJveSBbd2luZm8gdG9wbGV2ZWwgJVddfQpiaW5kIGFsbCA8JE0xQi1LZXktVz4ge2Rlc3Ryb3kgW3dpbmZvIHRvcGxldmVsICVXXX0KCnNldCBzdWJjb21tYW5kX2FyZ3Mge30KcHJvYyB1c2FnZSB7fSB7CglwdXRzIHN0ZGVyciAidXNhZ2U6ICQ6OmFyZ3YwICQ6OnN1YmNvbW1hbmQgJDo6c3ViY29tbWFuZF9hcmdzIgoJZXhpdCAxCn0KCiMgLS0gTm90IGEgbm9ybWFsIGNvbW1pdCB0eXBlIGludm9jYXRpb24/ICBEbyB0aGF0IGluc3RlYWQhCiMKc3dpdGNoIC0tICRzdWJjb21tYW5kIHsKYnJvd3NlciB7CglzZXQgc3ViY29tbWFuZF9hcmdzIHtyZXY/fQoJc3dpdGNoIFtsbGVuZ3RoICRhcmd2XSB7CgkwIHsKCQlzZXQgY3VycmVudF9icmFuY2ggW2dpdCBzeW1ib2xpYy1yZWYgSEVBRF0KCQlyZWdzdWIgXnJlZnMvKChoZWFkc3x0YWdzfHJlbW90ZXMpLyk/IFwKCQkJJGN1cnJlbnRfYnJhbmNoIHt9IGN1cnJlbnRfYnJhbmNoCgl9CgkxIHsKCQlzZXQgY3VycmVudF9icmFuY2ggW2xpbmRleCAkYXJndiAwXQoJfQoJZGVmYXVsdCB1c2FnZQoJfQoJYnJvd3Nlcjo6bmV3ICRjdXJyZW50X2JyYW5jaAoJcmV0dXJuCn0KYmxhbWUgewoJc2V0IHN1YmNvbW1hbmRfYXJncyB7cmV2PyBwYXRoP30KCXNldCBoZWFkIHt9CglzZXQgcGF0aCB7fQoJc2V0IGlzX3BhdGggMAoJZm9yZWFjaCBhICRhcmd2IHsKCQlpZiB7JGlzX3BhdGggfHwgW2ZpbGUgZXhpc3RzICRfcHJlZml4JGFdfSB7CgkJCWlmIHskcGF0aCBuZSB7fX0gdXNhZ2UKCQkJc2V0IHBhdGggJF9wcmVmaXgkYQoJCQlicmVhawoJCX0gZWxzZWlmIHskYSBlcSB7LS19fSB7CgkJCWlmIHskcGF0aCBuZSB7fX0gewoJCQkJaWYgeyRoZWFkIG5lIHt9fSB1c2FnZQoJCQkJc2V0IGhlYWQgJHBhdGgKCQkJCXNldCBwYXRoIHt9CgkJCX0KCQkJc2V0IGlzX3BhdGggMQoJCX0gZWxzZWlmIHskaGVhZCBlcSB7fX0gewoJCQlpZiB7JGhlYWQgbmUge319IHVzYWdlCgkJCXNldCBoZWFkICRhCgkJfSBlbHNlIHsKCQkJdXNhZ2UKCQl9Cgl9Cgl1bnNldCBpc19wYXRoCgoJaWYgeyRoZWFkIGVxIHt9fSB7CgkJc2V0IGN1cnJlbnRfYnJhbmNoIFtnaXQgc3ltYm9saWMtcmVmIEhFQURdCgkJcmVnc3ViIF5yZWZzLygoaGVhZHN8dGFnc3xyZW1vdGVzKS8pPyBcCgkJCSRjdXJyZW50X2JyYW5jaCB7fSBjdXJyZW50X2JyYW5jaAoJfSBlbHNlIHsKCQlzZXQgY3VycmVudF9icmFuY2ggJGhlYWQKCX0KCglpZiB7JHBhdGggZXEge319IHVzYWdlCglibGFtZTo6bmV3ICRoZWFkICRwYXRoCglyZXR1cm4KfQpjaXRvb2wgLQpndWkgewoJaWYge1tsbGVuZ3RoICRhcmd2XSAhPSAwfSB7CgkJcHV0cyAtbm9uZXdsaW5lIHN0ZGVyciAidXNhZ2U6ICRhcmd2MCIKCQlpZiB7JHN1YmNvbW1hbmQgbmUge2d1aX0gJiYgW2FwcG5hbWVdIG5lICJnaXQtJHN1YmNvbW1hbmQifSB7CgkJCXB1dHMgLW5vbmV3bGluZSBzdGRlcnIgIiAkc3ViY29tbWFuZCIKCQl9CgkJcHV0cyBzdGRlcnIge30KCQlleGl0IDEKCX0KCSMgZmFsbCB0aHJvdWdoIHRvIHNldHVwIFVJIGZvciBjb21taXRzCn0KZGVmYXVsdCB7CglwdXRzIHN0ZGVyciAidXNhZ2U6ICRhcmd2MCBcW3tibGFtZXxicm93c2VyfGNpdG9vbH1cXSIKCWV4aXQgMQp9Cn0KCiMgLS0gQnJhbmNoIENvbnRyb2wKIwpmcmFtZSAuYnJhbmNoIFwKCS1ib3JkZXJ3aWR0aCAxIFwKCS1yZWxpZWYgc3Vua2VuCmxhYmVsIC5icmFuY2gubDEgXAoJLXRleHQge0N1cnJlbnQgQnJhbmNoOn0gXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQKbGFiZWwgLmJyYW5jaC5jYiBcCgktdGV4dHZhcmlhYmxlIGN1cnJlbnRfYnJhbmNoIFwKCS1hbmNob3IgdyBcCgktanVzdGlmeSBsZWZ0CnBhY2sgLmJyYW5jaC5sMSAtc2lkZSBsZWZ0CnBhY2sgLmJyYW5jaC5jYiAtc2lkZSBsZWZ0IC1maWxsIHgKcGFjayAuYnJhbmNoIC1zaWRlIHRvcCAtZmlsbCB4CgojIC0tIE1haW4gV2luZG93IExheW91dAojCnBhbmVkd2luZG93IC52cGFuZSAtb3JpZW50IHZlcnRpY2FsCnBhbmVkd2luZG93IC52cGFuZS5maWxlcyAtb3JpZW50IGhvcml6b250YWwKLnZwYW5lIGFkZCAudnBhbmUuZmlsZXMgLXN0aWNreSBuc2V3IC1oZWlnaHQgMTAwIC13aWR0aCAyMDAKcGFjayAudnBhbmUgLWFuY2hvciBuIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQoKIyAtLSBJbmRleCBGaWxlIExpc3QKIwpmcmFtZSAudnBhbmUuZmlsZXMuaW5kZXggLWhlaWdodCAxMDAgLXdpZHRoIDIwMApsYWJlbCAudnBhbmUuZmlsZXMuaW5kZXgudGl0bGUgLXRleHQge1N0YWdlZCBDaGFuZ2VzIChXaWxsIEJlIENvbW1pdHRlZCl9IFwKCS1iYWNrZ3JvdW5kIGdyZWVuCnRleHQgJHVpX2luZGV4IC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCS13aWR0aCAyMCAtaGVpZ2h0IDEwIFwKCS13cmFwIG5vbmUgXAoJLWN1cnNvciAkY3Vyc29yX3B0ciBcCgkteHNjcm9sbGNvbW1hbmQgey52cGFuZS5maWxlcy5pbmRleC5zeCBzZXR9IFwKCS15c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmZpbGVzLmluZGV4LnN5IHNldH0gXAoJLXN0YXRlIGRpc2FibGVkCnNjcm9sbGJhciAudnBhbmUuZmlsZXMuaW5kZXguc3ggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR1aV9pbmRleCB4dmlld10Kc2Nyb2xsYmFyIC52cGFuZS5maWxlcy5pbmRleC5zeSAtb3JpZW50IHYgLWNvbW1hbmQgW2xpc3QgJHVpX2luZGV4IHl2aWV3XQpwYWNrIC52cGFuZS5maWxlcy5pbmRleC50aXRsZSAtc2lkZSB0b3AgLWZpbGwgeApwYWNrIC52cGFuZS5maWxlcy5pbmRleC5zeCAtc2lkZSBib3R0b20gLWZpbGwgeApwYWNrIC52cGFuZS5maWxlcy5pbmRleC5zeSAtc2lkZSByaWdodCAtZmlsbCB5CnBhY2sgJHVpX2luZGV4IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKLnZwYW5lLmZpbGVzIGFkZCAudnBhbmUuZmlsZXMuaW5kZXggLXN0aWNreSBuc2V3CgojIC0tIFdvcmtpbmcgRGlyZWN0b3J5IEZpbGUgTGlzdAojCmZyYW1lIC52cGFuZS5maWxlcy53b3JrZGlyIC1oZWlnaHQgMTAwIC13aWR0aCAyMDAKbGFiZWwgLnZwYW5lLmZpbGVzLndvcmtkaXIudGl0bGUgLXRleHQge1Vuc3RhZ2VkIENoYW5nZXMgKFdpbGwgTm90IEJlIENvbW1pdHRlZCl9IFwKCS1iYWNrZ3JvdW5kIHJlZAp0ZXh0ICR1aV93b3JrZGlyIC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCS13aWR0aCAyMCAtaGVpZ2h0IDEwIFwKCS13cmFwIG5vbmUgXAoJLWN1cnNvciAkY3Vyc29yX3B0ciBcCgkteHNjcm9sbGNvbW1hbmQgey52cGFuZS5maWxlcy53b3JrZGlyLnN4IHNldH0gXAoJLXlzY3JvbGxjb21tYW5kIHsudnBhbmUuZmlsZXMud29ya2Rpci5zeSBzZXR9IFwKCS1zdGF0ZSBkaXNhYmxlZApzY3JvbGxiYXIgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3ggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR1aV93b3JrZGlyIHh2aWV3XQpzY3JvbGxiYXIgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3kgLW9yaWVudCB2IC1jb21tYW5kIFtsaXN0ICR1aV93b3JrZGlyIHl2aWV3XQpwYWNrIC52cGFuZS5maWxlcy53b3JrZGlyLnRpdGxlIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3ggLXNpZGUgYm90dG9tIC1maWxsIHgKcGFjayAudnBhbmUuZmlsZXMud29ya2Rpci5zeSAtc2lkZSByaWdodCAtZmlsbCB5CnBhY2sgJHVpX3dvcmtkaXIgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoudnBhbmUuZmlsZXMgYWRkIC52cGFuZS5maWxlcy53b3JrZGlyIC1zdGlja3kgbnNldwoKZm9yZWFjaCBpIFtsaXN0ICR1aV9pbmRleCAkdWlfd29ya2Rpcl0gewoJJGkgdGFnIGNvbmYgaW5fZGlmZiAtZm9udCBmb250X3VpYm9sZAoJJGkgdGFnIGNvbmYgaW5fc2VsIFwKCQktYmFja2dyb3VuZCBbJGkgY2dldCAtZm9yZWdyb3VuZF0gXAoJCS1mb3JlZ3JvdW5kIFskaSBjZ2V0IC1iYWNrZ3JvdW5kXQp9CnVuc2V0IGkKCiMgLS0gRGlmZiBhbmQgQ29tbWl0IEFyZWEKIwpmcmFtZSAudnBhbmUubG93ZXIgLWhlaWdodCAzMDAgLXdpZHRoIDQwMApmcmFtZSAudnBhbmUubG93ZXIuY29tbWFyZWEKZnJhbWUgLnZwYW5lLmxvd2VyLmRpZmYgLXJlbGllZiBzdW5rZW4gLWJvcmRlcndpZHRoIDEKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEgLXNpZGUgdG9wIC1maWxsIHgKcGFjayAudnBhbmUubG93ZXIuZGlmZiAtc2lkZSBib3R0b20gLWZpbGwgYm90aCAtZXhwYW5kIDEKLnZwYW5lIGFkZCAudnBhbmUubG93ZXIgLXN0aWNreSBuc2V3CgojIC0tIENvbW1pdCBBcmVhIEJ1dHRvbnMKIwpmcmFtZSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucwpsYWJlbCAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5sIC10ZXh0IHt9IFwKCS1hbmNob3IgdyBcCgktanVzdGlmeSBsZWZ0CnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMubCAtc2lkZSB0b3AgLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zIC1zaWRlIGxlZnQgLWZpbGwgeQoKYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnJlc2NhbiAtdGV4dCB7UmVzY2FufSBcCgktY29tbWFuZCBkb19yZXNjYW4KcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5yZXNjYW4gLXNpZGUgdG9wIC1maWxsIHgKbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJey52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnJlc2NhbiBjb25mIC1zdGF0ZX0KCmJ1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5pbmNhbGwgLXRleHQge0FkZCBFeGlzdGluZ30gXAoJLWNvbW1hbmQgZG9fYWRkX2FsbApwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmluY2FsbCAtc2lkZSB0b3AgLWZpbGwgeApsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgl7LnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuaW5jYWxsIGNvbmYgLXN0YXRlfQoKYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnNpZ25vZmYgLXRleHQge1NpZ24gT2ZmfSBcCgktY29tbWFuZCBkb19zaWdub2ZmCnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuc2lnbm9mZiAtc2lkZSB0b3AgLWZpbGwgeAoKYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmNvbW1pdCAtdGV4dCB7Q29tbWl0fSBcCgktY29tbWFuZCBkb19jb21taXQKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5jb21taXQgLXNpZGUgdG9wIC1maWxsIHgKbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJey52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmNvbW1pdCBjb25mIC1zdGF0ZX0KCiMgLS0gQ29tbWl0IE1lc3NhZ2UgQnVmZmVyCiMKZnJhbWUgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlcgpmcmFtZSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlcgpzZXQgdWlfY29tbSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLnQKc2V0IHVpX2NvbWwgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIubApyYWRpb2J1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5uZXcgXAoJLXRleHQge05ldyBDb21taXR9IFwKCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCgktdmFyaWFibGUgc2VsZWN0ZWRfY29tbWl0X3R5cGUgXAoJLXZhbHVlIG5ldwpsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCglbbGlzdCAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5uZXcgY29uZiAtc3RhdGVdCnJhZGlvYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLmFtZW5kIFwKCS10ZXh0IHtBbWVuZCBMYXN0IENvbW1pdH0gXAoJLWNvbW1hbmQgZG9fc2VsZWN0X2NvbW1pdF90eXBlIFwKCS12YXJpYWJsZSBzZWxlY3RlZF9jb21taXRfdHlwZSBcCgktdmFsdWUgYW1lbmQKbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJW2xpc3QgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIuYW1lbmQgY29uZiAtc3RhdGVdCmxhYmVsICR1aV9jb21sIFwKCS1hbmNob3IgdyBcCgktanVzdGlmeSBsZWZ0CnByb2MgdHJhY2VfY29tbWl0X3R5cGUge3Zhcm5hbWUgYXJnc30gewoJZ2xvYmFsIHVpX2NvbWwgY29tbWl0X3R5cGUKCXN3aXRjaCAtZ2xvYiAtLSAkY29tbWl0X3R5cGUgewoJaW5pdGlhbCAgICAgICB7c2V0IHR4dCB7SW5pdGlhbCBDb21taXQgTWVzc2FnZTp9fQoJYW1lbmQgICAgICAgICB7c2V0IHR4dCB7QW1lbmRlZCBDb21taXQgTWVzc2FnZTp9fQoJYW1lbmQtaW5pdGlhbCB7c2V0IHR4dCB7QW1lbmRlZCBJbml0aWFsIENvbW1pdCBNZXNzYWdlOn19CglhbWVuZC1tZXJnZSAgIHtzZXQgdHh0IHtBbWVuZGVkIE1lcmdlIENvbW1pdCBNZXNzYWdlOn19CgltZXJnZSAgICAgICAgIHtzZXQgdHh0IHtNZXJnZSBDb21taXQgTWVzc2FnZTp9fQoJKiAgICAgICAgICAgICB7c2V0IHR4dCB7Q29tbWl0IE1lc3NhZ2U6fX0KCX0KCSR1aV9jb21sIGNvbmYgLXRleHQgJHR4dAp9CnRyYWNlIGFkZCB2YXJpYWJsZSBjb21taXRfdHlwZSB3cml0ZSB0cmFjZV9jb21taXRfdHlwZQpwYWNrICR1aV9jb21sIC1zaWRlIGxlZnQgLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLmFtZW5kIC1zaWRlIHJpZ2h0CnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIubmV3IC1zaWRlIHJpZ2h0Cgp0ZXh0ICR1aV9jb21tIC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAxIFwKCS11bmRvIHRydWUgXAoJLW1heHVuZG8gMjAgXAoJLWF1dG9zZXBhcmF0b3JzIHRydWUgXAoJLXJlbGllZiBzdW5rZW4gXAoJLXdpZHRoIDc1IC1oZWlnaHQgOSAtd3JhcCBub25lIFwKCS1mb250IGZvbnRfZGlmZiBcCgkteXNjcm9sbGNvbW1hbmQgey52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuc2J5IHNldH0Kc2Nyb2xsYmFyIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuc2J5IFwKCS1jb21tYW5kIFtsaXN0ICR1aV9jb21tIHl2aWV3XQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQpwYWNrICR1aV9jb21tIC1zaWRlIGxlZnQgLWZpbGwgeQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIgLXNpZGUgbGVmdCAtZmlsbCB5CgojIC0tIENvbW1pdCBNZXNzYWdlIEJ1ZmZlciBDb250ZXh0IE1lbnUKIwpzZXQgY3R4bSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmN0eG0KbWVudSAkY3R4bSAtdGVhcm9mZiAwCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7Q3V0fSBcCgktY29tbWFuZCB7dGtfdGV4dEN1dCAkdWlfY29tbX0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtDb3B5fSBcCgktY29tbWFuZCB7dGtfdGV4dENvcHkgJHVpX2NvbW19CiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7UGFzdGV9IFwKCS1jb21tYW5kIHt0a190ZXh0UGFzdGUgJHVpX2NvbW19CiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7RGVsZXRlfSBcCgktY29tbWFuZCB7JHVpX2NvbW0gZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdH0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1NlbGVjdCBBbGx9IFwKCS1jb21tYW5kIHtmb2N1cyAkdWlfY29tbTskdWlfY29tbSB0YWcgYWRkIHNlbCAwLjAgZW5kfQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHkgQWxsfSBcCgktY29tbWFuZCB7CgkJJHVpX2NvbW0gdGFnIGFkZCBzZWwgMC4wIGVuZAoJCXRrX3RleHRDb3B5ICR1aV9jb21tCgkJJHVpX2NvbW0gdGFnIHJlbW92ZSBzZWwgMC4wIGVuZAoJfQokY3R4bSBhZGQgc2VwYXJhdG9yCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7U2lnbiBPZmZ9IFwKCS1jb21tYW5kIGRvX3NpZ25vZmYKYmluZF9idXR0b24zICR1aV9jb21tICJ0a19wb3B1cCAkY3R4bSAlWCAlWSIKCiMgLS0gRGlmZiBIZWFkZXIKIwpwcm9jIHRyYWNlX2N1cnJlbnRfZGlmZl9wYXRoIHt2YXJuYW1lIGFyZ3N9IHsKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBkaWZmX2FjdGlvbnMgZmlsZV9zdGF0ZXMKCWlmIHskY3VycmVudF9kaWZmX3BhdGggZXEge319IHsKCQlzZXQgcyB7fQoJCXNldCBmIHt9CgkJc2V0IHAge30KCQlzZXQgbyBkaXNhYmxlZAoJfSBlbHNlIHsKCQlzZXQgcCAkY3VycmVudF9kaWZmX3BhdGgKCQlzZXQgcyBbbWFwZGVzYyBbbGluZGV4ICRmaWxlX3N0YXRlcygkcCkgMF0gJHBdCgkJc2V0IGYge0ZpbGU6fQoJCXNldCBwIFtlc2NhcGVfcGF0aCAkcF0KCQlzZXQgbyBub3JtYWwKCX0KCgkudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuc3RhdHVzIGNvbmZpZ3VyZSAtdGV4dCAkcwoJLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLmZpbGUgY29uZmlndXJlIC10ZXh0ICRmCgkudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIucGF0aCBjb25maWd1cmUgLXRleHQgJHAKCWZvcmVhY2ggdyAkZGlmZl9hY3Rpb25zIHsKCQl1cGxldmVsICMwICR3ICRvCgl9Cn0KdHJhY2UgYWRkIHZhcmlhYmxlIGN1cnJlbnRfZGlmZl9wYXRoIHdyaXRlIHRyYWNlX2N1cnJlbnRfZGlmZl9wYXRoCgpmcmFtZSAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIgLWJhY2tncm91bmQgb3JhbmdlCmxhYmVsIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5zdGF0dXMgXAoJLWJhY2tncm91bmQgb3JhbmdlIFwKCS13aWR0aCAkbWF4X3N0YXR1c19kZXNjIFwKCS1hbmNob3IgdyBcCgktanVzdGlmeSBsZWZ0CmxhYmVsIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5maWxlIFwKCS1iYWNrZ3JvdW5kIG9yYW5nZSBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdApsYWJlbCAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIucGF0aCBcCgktYmFja2dyb3VuZCBvcmFuZ2UgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQKcGFjayAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuc3RhdHVzIC1zaWRlIGxlZnQKcGFjayAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuZmlsZSAtc2lkZSBsZWZ0CnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnBhdGggLWZpbGwgeApzZXQgY3R4bSAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuY3R4bQptZW51ICRjdHhtIC10ZWFyb2ZmIDAKJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtDb3B5fSBcCgktY29tbWFuZCB7CgkJY2xpcGJvYXJkIGNsZWFyCgkJY2xpcGJvYXJkIGFwcGVuZCBcCgkJCS1mb3JtYXQgU1RSSU5HIFwKCQkJLXR5cGUgU1RSSU5HIFwKCQkJLS0gJGN1cnJlbnRfZGlmZl9wYXRoCgl9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQpiaW5kX2J1dHRvbjMgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnBhdGggInRrX3BvcHVwICRjdHhtICVYICVZIgoKIyAtLSBEaWZmIEJvZHkKIwpmcmFtZSAudnBhbmUubG93ZXIuZGlmZi5ib2R5CnNldCB1aV9kaWZmIC52cGFuZS5sb3dlci5kaWZmLmJvZHkudAp0ZXh0ICR1aV9kaWZmIC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCS13aWR0aCA4MCAtaGVpZ2h0IDE1IC13cmFwIG5vbmUgXAoJLWZvbnQgZm9udF9kaWZmIFwKCS14c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnggc2V0fSBcCgkteXNjcm9sbGNvbW1hbmQgey52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J5IHNldH0gXAoJLXN0YXRlIGRpc2FibGVkCnNjcm9sbGJhciAudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieCAtb3JpZW50IGhvcml6b250YWwgXAoJLWNvbW1hbmQgW2xpc3QgJHVpX2RpZmYgeHZpZXddCnNjcm9sbGJhciAudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieSAtb3JpZW50IHZlcnRpY2FsIFwKCS1jb21tYW5kIFtsaXN0ICR1aV9kaWZmIHl2aWV3XQpwYWNrIC52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J4IC1zaWRlIGJvdHRvbSAtZmlsbCB4CnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQpwYWNrICR1aV9kaWZmIC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKcGFjayAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKcGFjayAudnBhbmUubG93ZXIuZGlmZi5ib2R5IC1zaWRlIGJvdHRvbSAtZmlsbCBib3RoIC1leHBhbmQgMQoKJHVpX2RpZmYgdGFnIGNvbmYgZF9jciAtZWxpZGUgdHJ1ZQokdWlfZGlmZiB0YWcgY29uZiBkX0AgLWZvcmVncm91bmQgYmx1ZSAtZm9udCBmb250X2RpZmZib2xkCiR1aV9kaWZmIHRhZyBjb25mIGRfKyAtZm9yZWdyb3VuZCB7IzAwYTAwMH0KJHVpX2RpZmYgdGFnIGNvbmYgZF8tIC1mb3JlZ3JvdW5kIHJlZAoKJHVpX2RpZmYgdGFnIGNvbmYgZF8rKyAtZm9yZWdyb3VuZCB7IzAwYTAwMH0KJHVpX2RpZmYgdGFnIGNvbmYgZF8tLSAtZm9yZWdyb3VuZCByZWQKJHVpX2RpZmYgdGFnIGNvbmYgZF8rcyBcCgktZm9yZWdyb3VuZCB7IzAwYTAwMH0gXAoJLWJhY2tncm91bmQgeyNlMmVmZmF9CiR1aV9kaWZmIHRhZyBjb25mIGRfLXMgXAoJLWZvcmVncm91bmQgcmVkIFwKCS1iYWNrZ3JvdW5kIHsjZTJlZmZhfQokdWlfZGlmZiB0YWcgY29uZiBkX3MrIFwKCS1mb3JlZ3JvdW5kIHsjMDBhMDAwfSBcCgktYmFja2dyb3VuZCBpdm9yeTEKJHVpX2RpZmYgdGFnIGNvbmYgZF9zLSBcCgktZm9yZWdyb3VuZCByZWQgXAoJLWJhY2tncm91bmQgaXZvcnkxCgokdWlfZGlmZiB0YWcgY29uZiBkPDw8PDw8PCBcCgktZm9yZWdyb3VuZCBvcmFuZ2UgXAoJLWZvbnQgZm9udF9kaWZmYm9sZAokdWlfZGlmZiB0YWcgY29uZiBkPT09PT09PSBcCgktZm9yZWdyb3VuZCBvcmFuZ2UgXAoJLWZvbnQgZm9udF9kaWZmYm9sZAokdWlfZGlmZiB0YWcgY29uZiBkPj4+Pj4+PiBcCgktZm9yZWdyb3VuZCBvcmFuZ2UgXAoJLWZvbnQgZm9udF9kaWZmYm9sZAoKJHVpX2RpZmYgdGFnIHJhaXNlIHNlbAoKIyAtLSBEaWZmIEJvZHkgQ29udGV4dCBNZW51CiMKc2V0IGN0eG0gLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5jdHhtCm1lbnUgJGN0eG0gLXRlYXJvZmYgMAokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1JlZnJlc2h9IFwKCS1jb21tYW5kIHJlc2hvd19kaWZmCmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHl9IFwKCS1jb21tYW5kIHt0a190ZXh0Q29weSAkdWlfZGlmZn0KbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7U2VsZWN0IEFsbH0gXAoJLWNvbW1hbmQge2ZvY3VzICR1aV9kaWZmOyR1aV9kaWZmIHRhZyBhZGQgc2VsIDAuMCBlbmR9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHkgQWxsfSBcCgktY29tbWFuZCB7CgkJJHVpX2RpZmYgdGFnIGFkZCBzZWwgMC4wIGVuZAoJCXRrX3RleHRDb3B5ICR1aV9kaWZmCgkJJHVpX2RpZmYgdGFnIHJlbW92ZSBzZWwgMC4wIGVuZAoJfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0FwcGx5L1JldmVyc2UgSHVua30gXAoJLWNvbW1hbmQge2FwcGx5X2h1bmsgJGN1cnNvclggJGN1cnNvcll9CnNldCB1aV9kaWZmX2FwcGx5aHVuayBbJGN0eG0gaW5kZXggbGFzdF0KbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mICR1aV9kaWZmX2FwcGx5aHVuayAtc3RhdGVdCiRjdHhtIGFkZCBzZXBhcmF0b3IKJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtEZWNyZWFzZSBGb250IFNpemV9IFwKCS1jb21tYW5kIHtpbmNyX2ZvbnRfc2l6ZSBmb250X2RpZmYgLTF9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0luY3JlYXNlIEZvbnQgU2l6ZX0gXAoJLWNvbW1hbmQge2luY3JfZm9udF9zaXplIGZvbnRfZGlmZiAxfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Nob3cgTGVzcyBDb250ZXh0fSBcCgktY29tbWFuZCB7aWYgeyRyZXBvX2NvbmZpZyhndWkuZGlmZmNvbnRleHQpID49IDJ9IHsKCQlpbmNyIHJlcG9fY29uZmlnKGd1aS5kaWZmY29udGV4dCkgLTEKCQlyZXNob3dfZGlmZgoJfX0KbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7U2hvdyBNb3JlIENvbnRleHR9IFwKCS1jb21tYW5kIHsKCQlpbmNyIHJlcG9fY29uZmlnKGd1aS5kaWZmY29udGV4dCkKCQlyZXNob3dfZGlmZgoJfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCAtbGFiZWwge09wdGlvbnMuLi59IFwKCS1jb21tYW5kIGRvX29wdGlvbnMKYmluZF9idXR0b24zICR1aV9kaWZmICIKCXNldCBjdXJzb3JYICV4CglzZXQgY3Vyc29yWSAleQoJaWYge1wkdWlfaW5kZXggZXEgXCRjdXJyZW50X2RpZmZfc2lkZX0gewoJCSRjdHhtIGVudHJ5Y29uZiAkdWlfZGlmZl9hcHBseWh1bmsgLWxhYmVsIHtVbnN0YWdlIEh1bmsgRnJvbSBDb21taXR9Cgl9IGVsc2UgewoJCSRjdHhtIGVudHJ5Y29uZiAkdWlfZGlmZl9hcHBseWh1bmsgLWxhYmVsIHtTdGFnZSBIdW5rIEZvciBDb21taXR9Cgl9Cgl0a19wb3B1cCAkY3R4bSAlWCAlWQoiCnVuc2V0IHVpX2RpZmZfYXBwbHlodW5rCgojIC0tIFN0YXR1cyBCYXIKIwpsYWJlbCAuc3RhdHVzIC10ZXh0dmFyaWFibGUgdWlfc3RhdHVzX3ZhbHVlIFwKCS1hbmNob3IgdyBcCgktanVzdGlmeSBsZWZ0IFwKCS1ib3JkZXJ3aWR0aCAxIFwKCS1yZWxpZWYgc3Vua2VuCnBhY2sgLnN0YXR1cyAtYW5jaG9yIHcgLXNpZGUgYm90dG9tIC1maWxsIHgKCiMgLS0gTG9hZCBnZW9tZXRyeQojCmNhdGNoIHsKc2V0IGdtICRyZXBvX2NvbmZpZyhndWkuZ2VvbWV0cnkpCndtIGdlb21ldHJ5IC4gW2xpbmRleCAkZ20gMF0KLnZwYW5lIHNhc2ggcGxhY2UgMCBcCglbbGluZGV4IFsudnBhbmUgc2FzaCBjb29yZCAwXSAwXSBcCglbbGluZGV4ICRnbSAxXQoudnBhbmUuZmlsZXMgc2FzaCBwbGFjZSAwIFwKCVtsaW5kZXggJGdtIDJdIFwKCVtsaW5kZXggWy52cGFuZS5maWxlcyBzYXNoIGNvb3JkIDBdIDFdCnVuc2V0IGdtCn0KCiMgLS0gS2V5IEJpbmRpbmdzCiMKYmluZCAkdWlfY29tbSA8JE0xQi1LZXktUmV0dXJuPiB7ZG9fY29tbWl0O2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1pPiB7ZG9fYWRkX2FsbDticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktST4ge2RvX2FkZF9hbGw7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LXg+IHt0a190ZXh0Q3V0ICVXO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1YPiB7dGtfdGV4dEN1dCAlVzticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktYz4ge3RrX3RleHRDb3B5ICVXO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1DPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LXY+IHt0a190ZXh0UGFzdGUgJVc7ICVXIHNlZSBpbnNlcnQ7IGJyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1WPiB7dGtfdGV4dFBhc3RlICVXOyAlVyBzZWUgaW5zZXJ0OyBicmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktYT4geyVXIHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LUE+IHslVyB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrfQoKYmluZCAkdWlfZGlmZiA8JE0xQi1LZXkteD4ge3RrX3RleHRDb3B5ICVXO2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1YPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LWM+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktQz4ge3RrX3RleHRDb3B5ICVXO2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS12PiB7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LVY+IHticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktYT4geyVXIHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LUE+IHslVyB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrfQpiaW5kICR1aV9kaWZmIDxLZXktVXA+ICAgICB7Y2F0Y2ggeyVXIHl2aWV3IHNjcm9sbCAtMSB1bml0c307YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEtleS1Eb3duPiAgIHtjYXRjaCB7JVcgeXZpZXcgc2Nyb2xsICAxIHVuaXRzfTticmVha30KYmluZCAkdWlfZGlmZiA8S2V5LUxlZnQ+ICAge2NhdGNoIHslVyB4dmlldyBzY3JvbGwgLTEgdW5pdHN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxLZXktUmlnaHQ+ICB7Y2F0Y2ggeyVXIHh2aWV3IHNjcm9sbCAgMSB1bml0c307YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEtleS1rPiAgICAgICAgIHtjYXRjaCB7JVcgeXZpZXcgc2Nyb2xsIC0xIHVuaXRzfTticmVha30KYmluZCAkdWlfZGlmZiA8S2V5LWo+ICAgICAgICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxLZXktaD4gICAgICAgICB7Y2F0Y2ggeyVXIHh2aWV3IHNjcm9sbCAtMSB1bml0c307YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEtleS1sPiAgICAgICAgIHtjYXRjaCB7JVcgeHZpZXcgc2Nyb2xsICAxIHVuaXRzfTticmVha30KYmluZCAkdWlfZGlmZiA8Q29udHJvbC1LZXktYj4ge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgLTEgcGFnZXN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxDb250cm9sLUtleS1mPiB7Y2F0Y2ggeyVXIHl2aWV3IHNjcm9sbCAgMSBwYWdlc307YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEJ1dHRvbi0xPiAgIHtmb2N1cyAlV30KCmlmIHtbaXNfZW5hYmxlZCBicmFuY2hdfSB7CgliaW5kIC4gPCRNMUItS2V5LW4+IGRvX2NyZWF0ZV9icmFuY2gKCWJpbmQgLiA8JE0xQi1LZXktTj4gZG9fY3JlYXRlX2JyYW5jaAp9CgpiaW5kIGFsbCA8S2V5LUY1PiBkb19yZXNjYW4KYmluZCBhbGwgPCRNMUItS2V5LXI+IGRvX3Jlc2NhbgpiaW5kIGFsbCA8JE0xQi1LZXktUj4gZG9fcmVzY2FuCmJpbmQgLiAgIDwkTTFCLUtleS1zPiBkb19zaWdub2ZmCmJpbmQgLiAgIDwkTTFCLUtleS1TPiBkb19zaWdub2ZmCmJpbmQgLiAgIDwkTTFCLUtleS1pPiBkb19hZGRfYWxsCmJpbmQgLiAgIDwkTTFCLUtleS1JPiBkb19hZGRfYWxsCmJpbmQgLiAgIDwkTTFCLUtleS1SZXR1cm4+IGRvX2NvbW1pdApmb3JlYWNoIGkgW2xpc3QgJHVpX2luZGV4ICR1aV93b3JrZGlyXSB7CgliaW5kICRpIDxCdXR0b24tMT4gICAgICAgInRvZ2dsZV9vcl9kaWZmICAgICAgICAgJGkgJXggJXk7IGJyZWFrIgoJYmluZCAkaSA8JE0xQi1CdXR0b24tMT4gICJhZGRfb25lX3RvX3NlbGVjdGlvbiAgICRpICV4ICV5OyBicmVhayIKCWJpbmQgJGkgPFNoaWZ0LUJ1dHRvbi0xPiAiYWRkX3JhbmdlX3RvX3NlbGVjdGlvbiAkaSAleCAleTsgYnJlYWsiCn0KdW5zZXQgaQoKc2V0IGZpbGVfbGlzdHMoJHVpX2luZGV4KSBbbGlzdF0Kc2V0IGZpbGVfbGlzdHMoJHVpX3dvcmtkaXIpIFtsaXN0XQoKd20gdGl0bGUgLiAiW2FwcG5hbWVdIChbcmVwb25hbWVdKSBbZmlsZSBub3JtYWxpemUgW2ZpbGUgZGlybmFtZSBbZ2l0ZGlyXV1dIgpmb2N1cyAtZm9yY2UgJHVpX2NvbW0KCiMgLS0gV2FybiB0aGUgdXNlciBhYm91dCBlbnZpcm9ubWVudGFsIHByb2JsZW1zLiAgQ3lnd2luJ3MgVGNsCiMgICAgZG9lcyAqbm90KiBwYXNzIGl0cyBlbnYgYXJyYXkgb250byBhbnkgcHJvY2Vzc2VzIGl0IHNwYXducy4KIyAgICBUaGlzIG1lYW5zIHRoYXQgZ2l0IHByb2Nlc3NlcyBnZXQgbm9uZSBvZiBvdXIgZW52aXJvbm1lbnQuCiMKaWYge1tpc19DeWd3aW5dfSB7CglzZXQgaWdub3JlZF9lbnYgMAoJc2V0IHN1Z2dlc3RfdXNlciB7fQoJc2V0IG1zZyAiUG9zc2libGUgZW52aXJvbm1lbnQgaXNzdWVzIGV4aXN0LgoKVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb2JhYmx5CmdvaW5nIHRvIGJlIGlnbm9yZWQgYnkgYW55IEdpdCBzdWJwcm9jZXNzIHJ1bgpieSBbYXBwbmFtZV06CgoiCglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGVudl0gewoJCXN3aXRjaCAtcmVnZXhwIC0tICRuYW1lIHsKCQl7XkdJVF9JTkRFWF9GSUxFJH0gLQoJCXteR0lUX09CSkVDVF9ESVJFQ1RPUlkkfSAtCgkJe15HSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUyR9IC0KCQl7XkdJVF9ESUZGX09QVFMkfSAtCgkJe15HSVRfRVhURVJOQUxfRElGRiR9IC0KCQl7XkdJVF9QQUdFUiR9IC0KCQl7XkdJVF9UUkFDRSR9IC0KCQl7XkdJVF9DT05GSUckfSAtCgkJe15HSVRfQ09ORklHX0xPQ0FMJH0gLQoJCXteR0lUXyhBVVRIT1J8Q09NTUlUVEVSKV9EQVRFJH0gewoJCQlhcHBlbmQgbXNnICIgLSAkbmFtZVxuIgoJCQlpbmNyIGlnbm9yZWRfZW52CgkJfQoJCXteR0lUXyhBVVRIT1J8Q09NTUlUVEVSKV8oTkFNRXxFTUFJTCkkfSB7CgkJCWFwcGVuZCBtc2cgIiAtICRuYW1lXG4iCgkJCWluY3IgaWdub3JlZF9lbnYKCQkJc2V0IHN1Z2dlc3RfdXNlciAkbmFtZQoJCX0KCQl9Cgl9CglpZiB7JGlnbm9yZWRfZW52ID4gMH0gewoJCWFwcGVuZCBtc2cgIgpUaGlzIGlzIGR1ZSB0byBhIGtub3duIGlzc3VlIHdpdGggdGhlClRjbCBiaW5hcnkgZGlzdHJpYnV0ZWQgYnkgQ3lnd2luLiIKCgkJaWYgeyRzdWdnZXN0X3VzZXIgbmUge319IHsKCQkJYXBwZW5kIG1zZyAiCgpBIGdvb2QgcmVwbGFjZW1lbnQgZm9yICRzdWdnZXN0X3VzZXIKaXMgcGxhY2luZyB2YWx1ZXMgZm9yIHRoZSB1c2VyLm5hbWUgYW5kCnVzZXIuZW1haWwgc2V0dGluZ3MgaW50byB5b3VyIHBlcnNvbmFsCn4vLmdpdGNvbmZpZyBmaWxlLgoiCgkJfQoJCXdhcm5fcG9wdXAgJG1zZwoJfQoJdW5zZXQgaWdub3JlZF9lbnYgbXNnIHN1Z2dlc3RfdXNlciBuYW1lCn0KCiMgLS0gT25seSBpbml0aWFsaXplIGNvbXBsZXggVUkgaWYgd2UgYXJlIGdvaW5nIHRvIHN0YXkgcnVubmluZy4KIwppZiB7W2lzX2VuYWJsZWQgdHJhbnNwb3J0XX0gewoJbG9hZF9hbGxfcmVtb3RlcwoJbG9hZF9hbGxfaGVhZHMKCglwb3B1bGF0ZV9icmFuY2hfbWVudQoJcG9wdWxhdGVfZmV0Y2hfbWVudQoJcG9wdWxhdGVfcHVzaF9tZW51Cn0KCiMgLS0gT25seSBzdWdnZXN0IGEgZ2MgcnVuIGlmIHdlIGFyZSBnb2luZyB0byBzdGF5IHJ1bm5pbmcuCiMKaWYge1tpc19lbmFibGVkIG11bHRpY29tbWl0XX0gewoJc2V0IG9iamVjdF9saW1pdCAyMDAwCglpZiB7W2lzX1dpbmRvd3NdfSB7c2V0IG9iamVjdF9saW1pdCAyMDB9CglyZWdleHAge14oWzAtOV0rKSBvYmplY3RzLH0gW2dpdCBjb3VudC1vYmplY3RzXSBfanVuayBvYmplY3RzX2N1cnJlbnQKCWlmIHskb2JqZWN0c19jdXJyZW50ID49ICRvYmplY3RfbGltaXR9IHsKCQlpZiB7W2Fza19wb3B1cCBcCgkJCSJUaGlzIHJlcG9zaXRvcnkgY3VycmVudGx5IGhhcyAkb2JqZWN0c19jdXJyZW50IGxvb3NlIG9iamVjdHMuCgpUbyBtYWludGFpbiBvcHRpbWFsIHBlcmZvcm1hbmNlIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgeW91IGNvbXByZXNzIHRoZSBkYXRhYmFzZSB3aGVuIG1vcmUgdGhhbiAkb2JqZWN0X2xpbWl0IGxvb3NlIG9iamVjdHMgZXhpc3QuCgpDb21wcmVzcyB0aGUgZGF0YWJhc2Ugbm93PyJdIGVxIHllc30gewoJCQlkb19nYwoJCX0KCX0KCXVuc2V0IG9iamVjdF9saW1pdCBfanVuayBvYmplY3RzX2N1cnJlbnQKfQoKbG9ja19pbmRleCBiZWdpbi1yZWFkCmFmdGVyIDEgZG9fcmVzY2FuCg==