IyEvYmluL2Jhc2gKCmV4cG9ydCBDSEVDS0VSSE9NRT1gcHdkYApleHBvcnQgQ09ERUZJTEVTPSIke0NIRUNLRVJIT01FfS9DT0RFRklMRVMiCmV4cG9ydCBIRUFERVJGSUxFUz0iJHtDSEVDS0VSSE9NRX0vSEVBREVSRklMRVMiCiNleHBvcnQgTFBDRklMRVM9IiR7SEVBREVSRklMRVN9ICR7Q09ERUZJTEVTfSIKZXhwb3J0IExQQ0ZJTEVTPSIke0NIRUNLRVJIT01FfS9MUENGSUxFUyIKZXhwb3J0IE1VRExJQj0iLi4vbXVkbGliIgpleHBvcnQgTE9HUz0iJHtDSEVDS0VSSE9NRX0vbG9ncyIKCkxFVkVMMT0iY2hhbmdlX3JlcXVpcmVkIgpMRVZFTDI9ImZvcm1hdHRpbmciCkxFVkVMNT0icGxlYXNlX2NoZWNrIgpMRVZFTDEwPSJjb3NtZXRpY3MiCgplY2hvIC1uZSAiTFBDLVNvdXJjZSBDaGVja2VyIFYwLjMgKDIwMDgtMDEtMDkpXG5cbiIKCnVzYWdlKCkgewogICAgZWNobyAtbmUgInVzYWdlOiAuL2NoZWNrIDxyZWdpb24+IDxsb2dmaWxlPlxuIgogICAgZXhpdAp9CgojIFBhcmFtZXRlciBwcnVlZmVuLCBhbnNvbnN0ZW4gdXNhZ2UgYXVzZ2ViZW4KaWYgWyAteiAkezF9IF0gfHwgWyAteiAkezJ9IF0KdGhlbgoJdXNhZ2UKZmkKCiMgZ3Vja2VuIG9iIGRhcyBMb2d2ZXJ6ZWljaG5pcyBkYSBpc3QsIHdlbm4gbmVpbiwgZGFubiBhbmxlZ2VuCmlmIFsgISAtZCAke0xPR1N9IF0KdGhlbgoJbWtkaXIgLXAgJHtMT0dTfQpmaQoKIyBydWRpbWVudGFlcmVyIGNoZWNrIG9iIGRpZSBNdWRsaWIgZGEgbGllZ3QsIHdvICR7TVVETElCfSBoaW56ZWlndAppZiBbICEgLWQgJHtNVURMSUJ9IF0KdGhlbgoJZWNobyAtbmUgIk5vIG11ZGxpYiBmb3VuZCBpbiAke01VRExJQn1cbiIKCWV4aXQKZmkKCiMgYWx0ZW4gS3JhbSBlbnRzb3JnZW4KaWYgWyAtZiAke0NPREVGSUxFU30gXQp0aGVuCglybSAke0NPREVGSUxFU30KZmkKCmlmIFsgLWYgJHtIRUFERVJGSUxFU30gXQp0aGVuCglybSAke0hFQURFUkZJTEVTfQpmaQoKaWYgWyAtZiAke0xQQ0ZJTEVTfSBdCnRoZW4KCXJtICR7TFBDRklMRVN9CmZpCgplY2hvIC1uZSAiQ2hlY2tpbmcgdGhlIE1vcmdlbkdyYXVlbiBNdWRsaWIgaW4gJHtNVURMSUJ9XG4iCmVjaG8gLW5lICJDaGVja2luZyBpbiAkezF9ICgke01VRExJQn0kezF9KVxuIgoKY2QgJHtNVURMSUJ9CgojIERhdGVpbGlzdGUgZXJzdGVsbGVuCmVjaG8gLW5lICJDcmVhdGluZyBmaWxlIGxpc3QuLi5cbiIKCmZpbmQgLi8kezF9IC10eXBlIGYgLW5hbWUgIiouYyIgLXByaW50ID4gJHtDT0RFRklMRVN9CmZpbmQgLi8kezF9IC10eXBlIGYgLW5hbWUgIiouaCIgLXByaW50ID4gJHtIRUFERVJGSUxFU30KCiMgaXJnZW5kd2llIHVuc2Nob2VuCmNhdCAke0NPREVGSUxFU30gJHtIRUFERVJGSUxFU30gPiAke0xQQ0ZJTEVTfQoKIyBlaWdlbnRsaWNoIGhhZXR0ZSBtYW4gZGFzIGFsbGVzIGluIGVpbmVtIGFiZmFja2VsbiBrb2VubmVuLCBhYmVyIGRhbm4gZ2FlYmUKIyBlcyBrZWluZSBVZWJlcnNjaHJpZnRlbiB1ZWJlciBkZW4gZWluemVsbmVuIFB1bmt0ZW4KCiMgTEVWRUwgMSBDSEVDS1MgKGNoYW5nZSByZXF1aXJlZCkKCiMgVW1sYXV0ZQplY2hvIC1uZSAiXG5cblBydWVmZSBhdWYgVW1sYXV0ZS4uLlxuIiB8IHRlZSAtYSAke0xPR1N9LyR7Mn0uJHtMRVZFTDF9CndoaWxlIHJlYWQgbGluZQpkbwoJZ3JlcCAtSG4gJ1v89uTc1sTfXScgJGxpbmUgfCBjdXQgLWQgOiAtZiAxLTIgPj4gJHtMT0dTfS8kezJ9LiR7TEVWRUwxfQpkb25lIDwgJHtMUENGSUxFU30KCiMgbGFtYmRhKCkKZWNobyAtbmUgIlxuXG5QcnVlZmUgYXVmIGxhbWJkYSgpLi4uXG4iIHwgdGVlIC1hICR7TE9HU30vJHsyfS4ke0xFVkVMMX0Kd2hpbGUgcmVhZCBsaW5lCmRvCglncmVwIC1IbiAnbGFtYmRhKCcgJGxpbmV8IGN1dCAtZCA6IC1mIDEtMiA+PiAke0xPR1N9LyR7Mn0uJHtMRVZFTDF9CmRvbmUgPCAke0xQQ0ZJTEVTfQoKIyBQZmFkZSBpbiAvcGxheWVycy8KZWNobyAtbmUgIlxuXG5QcnVlZmUgYXVmIFBmYWRlIGluIC9wbGF5ZXJzLy4uLlxuIiB8IHRlZSAtYSAke0xPR1N9LyR7Mn0uJHtMRVZFTDF9IAp3aGlsZSByZWFkIGxpbmUKZG8KCWdyZXAgLUhuICcvcGxheWVycy8nICRsaW5lfCBjdXQgLWQgOiAtZiAxLTIgPj4gJHtMT0dTfS8kezJ9LiR7TEVWRUwxfSAKZG9uZSA8ICR7TFBDRklMRVN9CgojIGZlaGxlbmRlICNwcmFnbWEgc3Ryb25nX3R5cGVzL3N0cmljdF90eXBlcwplY2hvIC1uZSAiXG5cbkZpbGVzIG9obmUgI3ByYWdtYSBzdHJvbmdfdHlwZXMgb2RlciBzdHJpY3RfdHlwZXMuLi5cbiIgfCB0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwxfSAKd2hpbGUgcmVhZCBsaW5lCmRvCglncmVwIC1MICcjcHJhZ21hLlwoc3Ryb25nXHxzdHJpY3RcKV90eXBlcycgJGxpbmUgfCBzb3J0IFwKCQk+PiAke0xPR1N9LyR7Mn0uJHtMRVZFTDF9IApkb25lIDwgJHtDT0RFRklMRVN9CgojIGRpcmVrdGUgVmVyd2VuZHVuZyB2b24gZG9fZGFtYWdlKCkKZWNobyAtbmUgIlxuXG5QcnVlZmUgYXVmIGRpcmVrdGUgVmVyd2VuZHVuZyB2b24gZG9fZGFtYWdlKCkuLi5cbiIgfFwKCSAgICAgdGVlIC1hICR7TE9HU30vJHsyfS4ke0xFVkVMMX0Kd2hpbGUgcmVhZCBsaW5lCmRvCglncmVwIC1IbiAnZG9fZGFtYWdlKCcgJGxpbmUgfCBjdXQgLWQgOiAtZiAxLTIgPj4gJHtMT0dTfS8kezJ9LiR7TEVWRUwxfQpkb25lIDwgJHtMUENGSUxFU30KCiMgVW5lcnd1ZW5zY2h0ZSBvZGVyIG9ic29sZXRlIGxmdW5zCmVjaG8gLW5lICJcblxuUHJ1ZWZlIGF1ZiB1bmVyd3VlbnNjaHRlIG9kZXIgb2Jzb2xldGUgbGZ1bnMuLi5cbiIgfFwKCXRlZSAtYSAke0xPR1N9LyR7Mn0uJHtMRVZFTDF9CndoaWxlIHJlYWQgbGluZQpkbwoJZ3JlcCAtSG4gLWYgJHtDSEVDS0VSSE9NRX0vYmFkX2xmdW4ubGlzdCAkbGluZSA+PiAke0xPR1N9LyR7Mn0uJHtMRVZFTDF9CmRvbmUgPCAke0xQQ0ZJTEVTfQoKIyBVbmVyd3VlbnNjaHRlIG9kZXIgb2Jzb2xldGUgZWZ1bnMKZWNobyAtbmUgIlxuXG5QcnVlZmUgYXVmIHVuZXJ3dWVuc2NodGUgb2RlciBvYnNvbGV0ZSBlZnVucy4uLlxuIiB8XAoJdGVlIC1hICR7TE9HU30vJHsyfS4ke0xFVkVMMX0Kd2hpbGUgcmVhZCBsaW5lCmRvCglncmVwIC1IbiAtZiAke0NIRUNLRVJIT01FfS9iYWRfZWZ1bi5saXN0ICRsaW5lID4+ICR7TE9HU30vJHsyfS4ke0xFVkVMMX0KZG9uZSA8ICR7TFBDRklMRVN9CgojIFVuZXJ3dWVuc2NodGUgb2RlciBvYnNvbGV0ZSBQcm9wZXJ0aWVzCmVjaG8gLW5lICJcblxuUHJ1ZWZlIGF1ZiB1bmVyd3VlbnNjaHRlIG9kZXIgb2Jzb2xldGUgUHJvcGVydGllcy4uLlxuIiB8XAoJdGVlIC1hICR7TE9HU30vJHsyfS4ke0xFVkVMMX0Kd2hpbGUgcmVhZCBsaW5lCmRvCglncmVwIC1IbiAtZiAke0NIRUNLRVJIT01FfS9iYWRfcHJvcC5saXN0ICRsaW5lID4+ICR7TE9HU30vJHsyfS4ke0xFVkVMMX0KZG9uZSA8ICR7TFBDRklMRVN9CgojIFVuZXJ3dWVuc2NodGUgRXZlbnRzCmVjaG8gLW5lICJcblxuUHJ1ZWZlIGF1ZiB1bmVyd3VlbnNjaHRlIEV2ZW50bmFtZW4uLi5cbiIgfCB0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwxfQp3aGlsZSByZWFkIGxpbmUKZG8KCWdyZXAgLUhuIC1mICR7Q0hFQ0tFUkhPTUV9L2JhZF9ldmVudHMubGlzdCAkbGluZSA+PiAke0xPR1N9LyR7Mn0uJHtMRVZFTDF9CmRvbmUgPCAke0xQQ0ZJTEVTfQoKIyBLZWluZSBjbG9uZXMgdm9uIC9zdGQvdGhpbmcKZWNobyAtbmUgIlxuXG5QcnVlZmUgYXVmIENsb25lcyB2b24gL3N0ZC90aGluZy4uLlxuIiB8XAoJICAgICB0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwxfQp3aGlsZSByZWFkIGxpbmUKZG8KCWdyZXAgLUhuICdjbG9uZV9vYmplY3QoLiovc3RkL3RoaW5nLiopJyAkbGluZSB8IGN1dCAtZCA6IC1mIDEtMiBcCgkgICAgID4+ICR7TE9HU30vJHsyfS4ke0xFVkVMMX0KZG9uZSA8ICR7TFBDRklMRVN9CgojIHVlYmVyc2NocmllYmVuZXMgbW92ZSgpCmVjaG8gLW5lICJcblxuUHJ1ZWZlIGF1ZiB1ZWJlcnNjaHJpZWJlbmVzIG1vdmUoKSAoZGVwcmVjYXRlZCkuLi5cbiIgfFwKCSAgICB0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwxfQp3aGlsZSByZWFkIGxpbmUKZG8KCWdyZXAgLUhuICdpbnQuKm1vdmUoLiptaXhlZC4qaW50LiopJyAkbGluZSB8IGN1dCAtZCA6IC1mIDEtMiBcCgkgICAgID4+ICR7TE9HU30vJHsyfS4ke0xFVkVMMX0KZG9uZSA8ICR7TFBDRklMRVN9CgojIHdpcmQgZ2VlcmJ0ZXMgUHJldmVudE1vdmUgZ2VydWZlbj8KZWNobyAtbmUgIlxuXG5VZWJlcnNjaHJpZWJlbmVzIFByZXZlbnRNb3ZlKCkgb2huZSBnZWVyYmV0ZXMgenUgcnVmZW4uLi5cbiIgfFwKCSAgICAgdGVlIC1hICR7TE9HU30vJHsyfS4ke0xFVkVMMX0Kd2hpbGUgcmVhZCBsaW5lCmRvCglncmVwICdQcmV2ZW50TW92ZSguKm9iamVjdC4qb2JqZWN0LippbnQuKiknICRsaW5lID4gJHtDSEVDS0VSSE9NRX0vY2hlY2sudG1wCglncmVwIC1MICc6OlByZXZlbnRNb3ZlKCcgJGxpbmUgPiAke0NIRUNLRVJIT01FfS9jaGVjay50bXAyCmRvbmUgIDwgJHtMUENGSUxFU30KIyBudXIgWmVpbGVuIGF1c2dlYmVuLCBkaWUgbmljaHQgaW0gMi4gRmlsZSB2b3Jrb21tZW4KZ3JlcCAtdiAtZiAke0NIRUNLRVJIT01FfS9jaGVjay50bXAyICR7Q0hFQ0tFUkhPTUV9L2NoZWNrLnRtcCB8IFwKCXRlZSAtYSAke0xPR1N9LyR7Mn0uJHtMRVZFTDF9CnJtICR7Q0hFQ0tFUkhPTUV9L2NoZWNrLnRtcCoKCmVjaG8gLW5lICJcblxuVWViZXJzY2hyaWViZW5lcyBpbml0KCkgb2huZSBnZWVyYnRlcyB6dSBydWZlbi4uLlxuIiB8XAoJICAgICB0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwxfQp3aGlsZSByZWFkIGxpbmUKZG8KCWdyZXAgJ2luaXQoXChvYmplY3QuKlwpXD8pJyAkbGluZSA+ICR7Q0hFQ0tFUkhPTUV9L2NoZWNrLnRtcAoJZ3JlcCAtTCAnOjppbml0KCcgJGxpbmUgPiAke0NIRUNLRVJIT01FfS9jaGVjay50bXAyCmRvbmUgPCAke0xQQ0ZJTEVTfQpncmVwIC12IC1mICR7Q0hFQ0tFUkhPTUV9L2NoZWNrLnRtcDIgJHtDSEVDS0VSSE9NRX0vY2hlY2sudG1wIFwKCT4+ICR7TE9HU30vJHsyfS4ke0xFVkVMMX0Kcm0gJHtDSEVDS0VSSE9NRX0vY2hlY2sudG1wKgoKZWNobyAtbmUgIlxuXG5VZWJlcnNjaHJpZWJlbmVzIE5vdGlmeU1vdmUoKSBvaG5lIGdlZXJiZXRlcyB6dSBydWZlbi4uLlxuIiB8XAoJICAgICB0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwxfQp3aGlsZSByZWFkIGxpbmUKZG8KCWdyZXAgJ05vdGlmeU1vdmUoLipvYmplY3QuKm9iamVjdC4qaW50LiopJyAkbGluZSA+ICR7Q0hFQ0tFUkhPTUV9L2NoZWNrLnRtcAoJZ3JlcCAtTCAnOjpOb3RpZnlNb3ZlKCcgJGxpbmUgPiAke0NIRUNLRVJIT01FfS9jaGVjay50bXAyCmRvbmUgPCAke0xQQ0ZJTEVTfQpncmVwIC12IC1mICR7Q0hFQ0tFUkhPTUV9L2NoZWNrLnRtcDIgJHtDSEVDS0VSSE9NRX0vY2hlY2sudG1wIFwKCT4+ICR7TE9HU30vJHsyfS4ke0xFVkVMMX0Kcm0gJHtDSEVDS0VSSE9NRX0vY2hlY2sudG1wKgoKIyBjYWxsX290aGVyKHgsICI/Pz8iKSBpc3Qgb2Jzb2xldAplY2hvIC1uZSAiXG5cblBydWVmZSBhdWYgY2FsbF9vdGhlcih4LCAiPz8/IikgKG9ic29sZXQpLi4uXG4iIHxcCgl0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwxfQp3aGlsZSByZWFkIGxpbmUKZG8KCWdyZXAgLUhuICdjYWxsX290aGVyKC4qPz8/LiopJyAkbGluZSB8IGN1dCAtZCA6IC1mIDEtMiBcCgk+PiAke0xPR1N9LyR7Mn0uJHtMRVZFTDF9CmRvbmUgPCAke0xQQ0ZJTEVTfQoKIyBBbHRlIFN5bnRheCBkZXIgSW5saW5lLUNsb3N1cmVzCmVjaG8gLW5lICJcblxuUHJ1ZWZlIGF1ZiBvYnNvbGV0ZSBJbmxpbmUtQ2xvc3VyZXMgKCAoOiA6KSApLi4uXG4iIHwgXAoJICAgICB0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwxfQp3aGlsZSByZWFkIGxpbmUKZG8KCWdyZXAgLUhuICcoOiAnICRsaW5lIHwgY3V0IC1kIDogLWYgMS0yIFwKCQkJPj4gJHtMT0dTfS8kezJ9LiR7TEVWRUwxfQpkb25lIDwgJHtMUENGSUxFU30KCiMgTEVWRUwgMiBDSEVDS1MKIyBUYWJ1bGF0b3JlbgplY2hvIC1uZSAiXG5cblBydWVmZSBhdWYgVGFidWxhdG9yZW4uLi5cbiIgfCB0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwyfQp3aGlsZSByZWFkIGxpbmUKZG8KCWdyZXAgLUhuICQnXHQnICRsaW5lIHwgY3V0IC1kIDogLWYgMS0yID4+ICR7TE9HU30vJHsyfS4ke0xFVkVMMn0KZG9uZSA8ICR7TFBDRklMRVN9CgojIFplaWxlbiA+IDc4IFplaWNoZW4KZWNobyAtbmUgIlxuXG5QcnVlZmUgYXVmIFplaWxlbiA+IDc4IFplaWNoZW4uLi5cbiIgfCB0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwyfQp3aGlsZSByZWFkIGxpbmUKZG8KCWdyZXAgLUhuICcuXHs3OSxcfScgJGxpbmV8IGN1dCAtZCA6IC1mIDEtMiA+PiAke0xPR1N9LyR7Mn0uJHtMRVZFTDJ9CmRvbmUgPCAke0xQQ0ZJTEVTfQoKIyBMRVZFTCA1IENIRUNLUwojIEhlYWRlciBtaXQgI3ByYWdtYXMKZWNobyAtbmUgIlxuXG5IZWFkZXIgKCouaCkgbWl0ICNwcmFnbWFzLi4uXG4iIHwgdGVlIC1hICR7TE9HU30vJHsyfS4ke0xFVkVMNX0Kd2hpbGUgcmVhZCBsaW5lCmRvCglncmVwIC1sICcjcHJhZ21hJyAkbGluZSA+PiAke0xPR1N9LyR7Mn0uJHtMRVZFTDV9CmRvbmUgPCAke0hFQURFUkZJTEVTfQoKIyBlZnVucywgVmVyd2VuZHVuZyBiZWFjaHRlbgplY2hvIC1uZSAiXG5cblBydWVmZSBhdWYgZWZ1bnMsIGRlcmVuIFZlcndlbmR1bmcgYmVvYmFjaHRldCB3ZXJkZW4gc29sbHRlLi4uXG4iIHxcCgkgICAgdGVlIC1hICR7TE9HU30vJHsyfS4ke0xFVkVMNX0Kd2hpbGUgcmVhZCBsaW5lCmRvCglncmVwIC1IbiAtZiAke0NIRUNLRVJIT01FfS93YXJuX2VmdW4ubGlzdCAkbGluZSBcCgk+PiAke0xPR1N9LyR7Mn0uJHtMRVZFTDV9CmRvbmUgPCAke0xQQ0ZJTEVTfQoKIyBQcm9wZXJ0aWVzLCBWZXJ3ZW5kdW5nIGJlYWNodGVuCmVjaG8gLW5lICJcblxuUHJ1ZWZlIGF1ZiBQcm9wZXJ0aWVzLCBkZXJlbiBWZXJ3ZW5kdW5nIGJlb2JhY2h0ZXQgd2VyZGVuCnNvbGx0ZS4uLlxuIiB8IHRlZSAtYSAke0xPR1N9LyR7Mn0uJHtMRVZFTDV9CndoaWxlIHJlYWQgbGluZQpkbwoJZ3JlcCAtRUhuIC1mICR7Q0hFQ0tFUkhPTUV9L3dhcm5fcHJvcC5saXN0ICRsaW5lIFwKCT4+ICR7TE9HU30vJHsyfS4ke0xFVkVMNX0KZG9uZSA8ICR7TFBDRklMRVN9CgkKIyBQcnVlZnVuZyBhdWYgc3RhdGljIC0+IHByb3RlY3RlZAplY2hvIC1uZSAiXG5cblBydWVmZSBhdWYgJ3N0YXRpYycgKC0+ICdwcm90ZWN0ZWQnKS4uLlxuIiB8XAoJICAgIHRlZSAtYSAke0xPR1N9LyR7Mn0uJHtMRVZFTDV9CndoaWxlIHJlYWQgbGluZQpkbwoJZ3JlcCAtSG4gJ3N0YXRpYycgJGxpbmUgPj4gJHtMT0dTfS8kezJ9LiR7TEVWRUw1fQpkb25lIDwgJHtMUENGSUxFU30KCgojIExFVkVMIDEwIENIRUNLUwojIEFsdGUgUmVjaHRzY2hyZWlidW5nIHJ1bGVzCmVjaG8gLW5lICJcblxuS2xlaW5nZXNjaHJpZWJlbmVzIER1L0Rpci9EaWNoLi4uXG4iIHxcCgl0ZWUgLWEgJHtMT0dTfS8kezJ9LiR7TEVWRUwxMH0Kd2hpbGUgcmVhZCBsaW5lCmRvCglncmVwIC1IbiAnIFwoZHVcfGRpY2hcfGRpclwpICcgJGxpbmUgfCBjdXQgLWQgOiAtZiAxLTIgfCBzb3J0IHwgXAoJdW5pcSA+PiAke0xPR1N9LyR7Mn0uJHtMRVZFTDEwfQpkb25lIDwgJHtMUENGSUxFU30KCiMgUGZhZG5hbWVuIGJlcmVpbmlnZW4Kc2VkIC1pIC1lICdzIy4vLyMvI2cnICR7TE9HU30vJHsyfS4qCgplY2hvIC1uZSAiXG5DaGVjayBmaW5pc2hlZCFcbiIK