IyAtKi0gY29kaW5nOiBsYXRpbi0xIC0qLQoKIiIiSGVhcCBxdWV1ZSBhbGdvcml0aG0gKGEuay5hLiBwcmlvcml0eSBxdWV1ZSkuCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClVzYWdlOgoKaGVhcCA9IFtdICAgICAgICAgICAgIyBjcmVhdGVzIGFuIGVtcHR5IGhlYXAKaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcAppdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcAppdGVtID0gaGVhcFswXSAgICAgICAjIHNtYWxsZXN0IGl0ZW0gb24gdGhlIGhlYXAgd2l0aG91dCBwb3BwaW5nIGl0CmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWUKaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXcgaXRlbTsgdGhlIGhlYXAgc2l6ZSBpcyB1bmNoYW5nZWQKCk91ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOgoKLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZQogIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzcwogIG9idmlvdXMsIGJ1dCBpcyBtb3JlIHN1aXRhYmxlIHNpbmNlIFB5dGhvbiB1c2VzIDAtYmFzZWQgaW5kZXhpbmcuCgotIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC4KClRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0CndpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KCkKbWFpbnRhaW5zIHRoZSBoZWFwIGludmFyaWFudCEKIiIiCgojIE9yaWdpbmFsIGNvZGUgYnkgS2V2aW4gTydDb25ub3IsIGF1Z21lbnRlZCBieSBUaW0gUGV0ZXJzIGFuZCBSYXltb25kIEhldHRpbmdlcgoKX19hYm91dF9fID0gIiIiSGVhcCBxdWV1ZXMKCltleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5CnJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXToKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAoKICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKCiAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNgoKICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNAoKICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzAKCgpJbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJbgphbiB1c3VhbCBiaW5hcnkgdG91cm5hbWVudCB3ZSBzZWUgaW4gc3BvcnRzLCBlYWNoIGNlbGwgaXMgdGhlIHdpbm5lcgpvdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWUKdG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9ucwpvZiBzdWNoIHRvdXJuYW1lbnRzLCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjZSB0aGUgaGlzdG9yeSBvZiBhIHdpbm5lci4KVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG8KcmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lcwp0aGF0IGEgY2VsbCBhbmQgdGhlIHR3byBjZWxscyBpdCB0b3BzIGNvbnRhaW4gdGhyZWUgZGlmZmVyZW50IGl0ZW1zLApidXQgdGhlIHRvcCBjZWxsICJ3aW5zIiBvdmVyIHRoZSB0d28gdG9wcGVkIGNlbGxzLgoKSWYgdGhpcyBoZWFwIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYXQgYWxsIHRpbWUsIGluZGV4IDAgaXMgY2xlYXJseQp0aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmQKZmluZCB0aGUgIm5leHQiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZQpkaWFncmFtIGFib3ZlKSBpbnRvIHRoZSAwIHBvc2l0aW9uLCBhbmQgdGhlbiBwZXJjb2xhdGUgdGhpcyBuZXcgMCBkb3duCnRoZSB0cmVlLCBleGNoYW5naW5nIHZhbHVlcywgdW50aWwgdGhlIGludmFyaWFudCBpcyByZS1lc3RhYmxpc2hlZC4KVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuCkJ5IGl0ZXJhdGluZyBvdmVyIGFsbCBpdGVtcywgeW91IGdldCBhbiBPKG4gbG4gbikgc29ydC4KCkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ldwppdGVtcyB3aGlsZSB0aGUgc29ydCBpcyBnb2luZyBvbiwgcHJvdmlkZWQgdGhhdCB0aGUgaW5zZXJ0ZWQgaXRlbXMgYXJlCm5vdCAiYmV0dGVyIiB0aGFuIHRoZSBsYXN0IDAndGggZWxlbWVudCB5b3UgZXh0cmFjdGVkLiAgVGhpcyBpcwplc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGwKaW5jb21pbmcgZXZlbnRzLCBhbmQgdGhlICJ3aW4iIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkCnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZQpzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJCnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS4KClZhcmlvdXMgc3RydWN0dXJlcyBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgaGF2ZSBiZWVuIGV4dGVuc2l2ZWx5CnN0dWRpZWQsIGFuZCBoZWFwcyBhcmUgZ29vZCBmb3IgdGhpcywgYXMgdGhleSBhcmUgcmVhc29uYWJseSBzcGVlZHksCnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnQKdGhhbiB0aGUgYXZlcmFnZSBjYXNlLiAgSG93ZXZlciwgdGhlcmUgYXJlIG90aGVyIHJlcHJlc2VudGF0aW9ucyB3aGljaAphcmUgbW9yZSBlZmZpY2llbnQgb3ZlcmFsbCwgeWV0IHRoZSB3b3JzdCBjYXNlcyBtaWdodCBiZSB0ZXJyaWJsZS4KCkhlYXBzIGFyZSBhbHNvIHZlcnkgdXNlZnVsIGluIGJpZyBkaXNrIHNvcnRzLiAgWW91IG1vc3QgcHJvYmFibHkgYWxsCmtub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nICJydW5zIiAod2hpY2ggYXJlIHByZS1zb3J0ZWQKc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLApmb2xsb3dlZCBieSBhIG1lcmdpbmcgcGFzc2VzIGZvciB0aGVzZSBydW5zLCB3aGljaCBtZXJnaW5nIGlzIG9mdGVuCnZlcnkgY2xldmVybHkgb3JnYW5pc2VkWzFdLiAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgaW5pdGlhbApzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheQp0byB0aGF0LiAgSWYsIHVzaW5nIGFsbCB0aGUgbWVtb3J5IGF2YWlsYWJsZSB0byBob2xkIGEgdG91cm5hbWVudCwgeW91CnJlcGxhY2UgYW5kIHBlcmNvbGF0ZSBpdGVtcyB0aGF0IGhhcHBlbiB0byBmaXQgdGhlIGN1cnJlbnQgcnVuLCB5b3UnbGwKcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsCmFuZCBtdWNoIGJldHRlciBmb3IgaW5wdXQgZnV6emlseSBvcmRlcmVkLgoKTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2gKbWF5IG5vdCBmaXQgaW4gdGhlIGN1cnJlbnQgdG91cm5hbWVudCAoYmVjYXVzZSB0aGUgdmFsdWUgIndpbnMiIG92ZXIKdGhlIGxhc3Qgb3V0cHV0IHZhbHVlKSwgaXQgY2Fubm90IGZpdCBpbiB0aGUgaGVhcCwgc28gdGhlIHNpemUgb2YgdGhlCmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHkKZm9yIHByb2dyZXNzaXZlbHkgYnVpbGRpbmcgYSBzZWNvbmQgaGVhcCwgd2hpY2ggZ3Jvd3MgYXQgZXhhY3RseSB0aGUKc2FtZSByYXRlIHRoZSBmaXJzdCBoZWFwIGlzIG1lbHRpbmcuICBXaGVuIHRoZSBmaXJzdCBoZWFwIGNvbXBsZXRlbHkKdmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGUKZWZmZWN0aXZlIQoKSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluCmEgZmV3IGFwcGxpY2F0aW9ucywgYW5kIEkgdGhpbmsgaXQgaXMgZ29vZCB0byBrZWVwIGEgYGhlYXAnIG1vZHVsZQphcm91bmQuIDotKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0KWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlCm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmcKY2FwYWJpbGl0aWVzIG9mIHRoZSBkaXNrcy4gIE9uIGRldmljZXMgd2hpY2ggY2Fubm90IHNlZWssIGxpa2UgYmlnCnRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeQpjbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGUKbW9zdCBlZmZlY3RpdmUgcG9zc2libGUgKHRoYXQgaXMsIHdpbGwgYmVzdCBwYXJ0aWNpcGF0ZSBhdAoicHJvZ3Jlc3NpbmciIHRoZSBtZXJnZSkuICBTb21lIHRhcGVzIHdlcmUgZXZlbiBhYmxlIHRvIHJlYWQKYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS4KQmVsaWV2ZSBtZSwgcmVhbCBnb29kIHRhcGUgc29ydHMgd2VyZSBxdWl0ZSBzcGVjdGFjdWxhciB0byB3YXRjaCEKRnJvbSBhbGwgdGltZXMsIHNvcnRpbmcgaGFzIGFsd2F5cyBiZWVuIGEgR3JlYXQgQXJ0ISA6LSkKIiIiCgpfX2FsbF9fID0gWydoZWFwcHVzaCcsICdoZWFwcG9wJywgJ2hlYXBpZnknLCAnaGVhcHJlcGxhY2UnLCAnbWVyZ2UnLAogICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXQoKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZSwgcmVwZWF0LCBjb3VudCwgaW1hcCwgaXppcCwgdGVlLCBjaGFpbgpmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyCmltcG9ydCBiaXNlY3QKCmRlZiBjbXBfbHQoeCwgeSk6CiAgICAjIFVzZSBfX2x0X18gaWYgYXZhaWxhYmxlOyBvdGhlcndpc2UsIHRyeSBfX2xlX18uCiAgICAjIEluIFB5My54LCBvbmx5IF9fbHRfXyB3aWxsIGJlIGNhbGxlZC4KICAgIHJldHVybiAoeCA8IHkpIGlmIGhhc2F0dHIoeCwgJ19fbHRfXycpIGVsc2UgKG5vdCB5IDw9IHgpCgpkZWYgaGVhcHB1c2goaGVhcCwgaXRlbSk6CiAgICAiIiJQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIiIiCiAgICBoZWFwLmFwcGVuZChpdGVtKQogICAgX3NpZnRkb3duKGhlYXAsIDAsIGxlbihoZWFwKS0xKQoKZGVmIGhlYXBwb3AoaGVhcCk6CiAgICAiIiJQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIiIiCiAgICBsYXN0ZWx0ID0gaGVhcC5wb3AoKSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkKICAgIGlmIGhlYXA6CiAgICAgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0KICAgICAgICBoZWFwWzBdID0gbGFzdGVsdAogICAgICAgIF9zaWZ0dXAoaGVhcCwgMCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuaXRlbSA9IGxhc3RlbHQKICAgIHJldHVybiByZXR1cm5pdGVtCgpkZWYgaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSk6CiAgICAiIiJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uCgogICAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlCiAgICBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZC1zaXplIGhlYXAuICBOb3RlIHRoYXQgdGhlIHZhbHVlCiAgICByZXR1cm5lZCBtYXkgYmUgbGFyZ2VyIHRoYW4gaXRlbSEgIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZXMgb2YKICAgIHRoaXMgcm91dGluZSB1bmxlc3Mgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgcmVwbGFjZW1lbnQ6CgogICAgICAgIGlmIGl0ZW0gPiBoZWFwWzBdOgogICAgICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkKICAgICIiIgogICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0gICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5CiAgICBoZWFwWzBdID0gaXRlbQogICAgX3NpZnR1cChoZWFwLCAwKQogICAgcmV0dXJuIHJldHVybml0ZW0KCmRlZiBoZWFwcHVzaHBvcChoZWFwLCBpdGVtKToKICAgICIiIkZhc3QgdmVyc2lvbiBvZiBhIGhlYXBwdXNoIGZvbGxvd2VkIGJ5IGEgaGVhcHBvcC4iIiIKICAgIGlmIGhlYXAgYW5kIGNtcF9sdChoZWFwWzBdLCBpdGVtKToKICAgICAgICBpdGVtLCBoZWFwWzBdID0gaGVhcFswXSwgaXRlbQogICAgICAgIF9zaWZ0dXAoaGVhcCwgMCkKICAgIHJldHVybiBpdGVtCgpkZWYgaGVhcGlmeSh4KToKICAgICIiIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuIiIiCiAgICBuID0gbGVuKHgpCiAgICAjIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0byBsb29raW5nIGF0CiAgICAjIGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdCBoYXZlIDIqaSArIDEgPCBuLAogICAgIyBvciBpIDwgKG4tMSkvMi4gIElmIG4gaXMgZXZlbiA9IDIqaiwgdGhpcyBpcyAoMipqLTEpLzIgPSBqLTEvMiBzbwogICAgIyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpcwogICAgIyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LCBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS4KICAgIGZvciBpIGluIHJldmVyc2VkKHhyYW5nZShuLy8yKSk6CiAgICAgICAgX3NpZnR1cCh4LCBpKQoKZGVmIG5sYXJnZXN0KG4sIGl0ZXJhYmxlKToKICAgICIiIkZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuCgogICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwgcmV2ZXJzZT1UcnVlKVs6bl0KICAgICIiIgogICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQogICAgcmVzdWx0ID0gbGlzdChpc2xpY2UoaXQsIG4pKQogICAgaWYgbm90IHJlc3VsdDoKICAgICAgICByZXR1cm4gcmVzdWx0CiAgICBoZWFwaWZ5KHJlc3VsdCkKICAgIF9oZWFwcHVzaHBvcCA9IGhlYXBwdXNocG9wCiAgICBmb3IgZWxlbSBpbiBpdDoKICAgICAgICBfaGVhcHB1c2hwb3AocmVzdWx0LCBlbGVtKQogICAgcmVzdWx0LnNvcnQocmV2ZXJzZT1UcnVlKQogICAgcmV0dXJuIHJlc3VsdAoKZGVmIG5zbWFsbGVzdChuLCBpdGVyYWJsZSk6CiAgICAiIiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4KCiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlKVs6bl0KICAgICIiIgogICAgaWYgaGFzYXR0cihpdGVyYWJsZSwgJ19fbGVuX18nKSBhbmQgbiAqIDEwIDw9IGxlbihpdGVyYWJsZSk6CiAgICAgICAgIyBGb3Igc21hbGxlciB2YWx1ZXMgb2YgbiwgdGhlIGJpc2VjdCBtZXRob2QgaXMgZmFzdGVyIHRoYW4gYSBtaW5oZWFwLgogICAgICAgICMgSXQgaXMgYWxzbyBtZW1vcnkgZWZmaWNpZW50LCBjb25zdW1pbmcgb25seSBuIGVsZW1lbnRzIG9mIHNwYWNlLgogICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKICAgICAgICByZXN1bHQgPSBzb3J0ZWQoaXNsaWNlKGl0LCAwLCBuKSkKICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgaW5zb3J0ID0gYmlzZWN0Lmluc29ydAogICAgICAgIHBvcCA9IHJlc3VsdC5wb3AKICAgICAgICBsb3MgPSByZXN1bHRbLTFdICAgICMgbG9zIC0tPiBMYXJnZXN0IG9mIHRoZSBuc21hbGxlc3QKICAgICAgICBmb3IgZWxlbSBpbiBpdDoKICAgICAgICAgICAgaWYgY21wX2x0KGVsZW0sIGxvcyk6CiAgICAgICAgICAgICAgICBpbnNvcnQocmVzdWx0LCBlbGVtKQogICAgICAgICAgICAgICAgcG9wKCkKICAgICAgICAgICAgICAgIGxvcyA9IHJlc3VsdFstMV0KICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAjIEFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIG1hbmlmZXN0cyB0aGUgd2hvbGUgaXRlcmFibGUgaW4gbWVtb3J5IGJ1dAogICAgIyBzYXZlcyBjb21wYXJpc29ucyBieSBoZWFwaWZ5aW5nIGFsbCBhdCBvbmNlLiAgQWxzbywgc2F2ZXMgdGltZQogICAgIyBvdmVyIGJpc2VjdC5pbnNvcnQoKSB3aGljaCBoYXMgTyhuKSBkYXRhIG1vdmVtZW50IHRpbWUgZm9yIGV2ZXJ5CiAgICAjIGluc2VydGlvbi4gIEZpbmRpbmcgdGhlIG4gc21hbGxlc3Qgb2YgYW4gbSBsZW5ndGggaXRlcmFibGUgcmVxdWlyZXMKICAgICMgICAgTyhtKSArIE8obiBsb2cgbSkgY29tcGFyaXNvbnMuCiAgICBoID0gbGlzdChpdGVyYWJsZSkKICAgIGhlYXBpZnkoaCkKICAgIHJldHVybiBtYXAoaGVhcHBvcCwgcmVwZWF0KGgsIG1pbihuLCBsZW4oaCkpKSkKCiMgJ2hlYXAnIGlzIGEgaGVhcCBhdCBhbGwgaW5kaWNlcyA+PSBzdGFydHBvcywgZXhjZXB0IHBvc3NpYmx5IGZvciBwb3MuICBwb3MKIyBpcyB0aGUgaW5kZXggb2YgYSBsZWFmIHdpdGggYSBwb3NzaWJseSBvdXQtb2Ytb3JkZXIgdmFsdWUuICBSZXN0b3JlIHRoZQojIGhlYXAgaW52YXJpYW50LgpkZWYgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOgogICAgbmV3aXRlbSA9IGhlYXBbcG9zXQogICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlCiAgICAjIG5ld2l0ZW0gZml0cy4KICAgIHdoaWxlIHBvcyA+IHN0YXJ0cG9zOgogICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxCiAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdCiAgICAgICAgaWYgY21wX2x0KG5ld2l0ZW0sIHBhcmVudCk6CiAgICAgICAgICAgIGhlYXBbcG9zXSA9IHBhcmVudAogICAgICAgICAgICBwb3MgPSBwYXJlbnRwb3MKICAgICAgICAgICAgY29udGludWUKICAgICAgICBicmVhawogICAgaGVhcFtwb3NdID0gbmV3aXRlbQoKIyBUaGUgY2hpbGQgaW5kaWNlcyBvZiBoZWFwIGluZGV4IHBvcyBhcmUgYWxyZWFkeSBoZWFwcywgYW5kIHdlIHdhbnQgdG8gbWFrZQojIGEgaGVhcCBhdCBpbmRleCBwb3MgdG9vLiAgV2UgZG8gdGhpcyBieSBidWJibGluZyB0aGUgc21hbGxlciBjaGlsZCBvZgojIHBvcyB1cCAoYW5kIHNvIG9uIHdpdGggdGhhdCBjaGlsZCdzIGNoaWxkcmVuLCBldGMpIHVudGlsIGhpdHRpbmcgYSBsZWFmLAojIHRoZW4gdXNpbmcgX3NpZnRkb3duIHRvIG1vdmUgdGhlIG9kZGJhbGwgb3JpZ2luYWxseSBhdCBpbmRleCBwb3MgaW50byBwbGFjZS4KIwojIFdlICpjb3VsZCogYnJlYWsgb3V0IG9mIHRoZSBsb29wIGFzIHNvb24gYXMgd2UgZmluZCBhIHBvcyB3aGVyZSBuZXdpdGVtIDw9CiMgYm90aCBpdHMgY2hpbGRyZW4sIGJ1dCB0dXJucyBvdXQgdGhhdCdzIG5vdCBhIGdvb2QgaWRlYSwgYW5kIGRlc3BpdGUgdGhhdAojIG1hbnkgYm9va3Mgd3JpdGUgdGhlIGFsZ29yaXRobSB0aGF0IHdheS4gIER1cmluZyBhIGhlYXAgcG9wLCB0aGUgbGFzdCBhcnJheQojIGVsZW1lbnQgaXMgc2lmdGVkIGluLCBhbmQgdGhhdCB0ZW5kcyB0byBiZSBsYXJnZSwgc28gdGhhdCBjb21wYXJpbmcgaXQKIyBhZ2FpbnN0IHZhbHVlcyBzdGFydGluZyBmcm9tIHRoZSByb290IHVzdWFsbHkgZG9lc24ndCBwYXkgKD0gdXN1YWxseSBkb2Vzbid0CiMgZ2V0IHVzIG91dCBvZiB0aGUgbG9vcCBlYXJseSkuICBTZWUgS251dGgsIFZvbHVtZSAzLCB3aGVyZSB0aGlzIGlzCiMgZXhwbGFpbmVkIGFuZCBxdWFudGlmaWVkIGluIGFuIGV4ZXJjaXNlLgojCiMgQ3V0dGluZyB0aGUgIyBvZiBjb21wYXJpc29ucyBpcyBpbXBvcnRhbnQsIHNpbmNlIHRoZXNlIHJvdXRpbmVzIGhhdmUgbm8KIyB3YXkgdG8gZXh0cmFjdCAidGhlIHByaW9yaXR5IiBmcm9tIGFuIGFycmF5IGVsZW1lbnQsIHNvIHRoYXQgaW50ZWxsaWdlbmNlCiMgaXMgbGlrZWx5IHRvIGJlIGhpZGluZyBpbiBjdXN0b20gX19jbXBfXyBtZXRob2RzLCBvciBpbiBhcnJheSBlbGVtZW50cwojIHN0b3JpbmcgKHByaW9yaXR5LCByZWNvcmQpIHR1cGxlcy4gIENvbXBhcmlzb25zIGFyZSB0aHVzIHBvdGVudGlhbGx5CiMgZXhwZW5zaXZlLgojCiMgT24gcmFuZG9tIGFycmF5cyBvZiBsZW5ndGggMTAwMCwgbWFraW5nIHRoaXMgY2hhbmdlIGN1dCB0aGUgbnVtYmVyIG9mCiMgY29tcGFyaXNvbnMgbWFkZSBieSBoZWFwaWZ5KCkgYSBsaXR0bGUsIGFuZCB0aG9zZSBtYWRlIGJ5IGV4aGF1c3RpdmUKIyBoZWFwcG9wKCkgYSBsb3QsIGluIGFjY29yZCB3aXRoIHRoZW9yeS4gIEhlcmUgYXJlIHR5cGljYWwgcmVzdWx0cyBmcm9tIDMKIyBydW5zICgzIGp1c3QgdG8gZGVtb25zdHJhdGUgaG93IHNtYWxsIHRoZSB2YXJpYW5jZSBpcyk6CiMKIyBDb21wYXJlcyBuZWVkZWQgYnkgaGVhcGlmeSAgICAgQ29tcGFyZXMgbmVlZGVkIGJ5IDEwMDAgaGVhcHBvcHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAxODM3IGN1dCB0byAxNjYzICAgICAgICAgICAgICAgMTQ5OTYgY3V0IHRvIDg2ODAKIyAxODU1IGN1dCB0byAxNjU5ICAgICAgICAgICAgICAgMTQ5NjYgY3V0IHRvIDg2NzgKIyAxODQ3IGN1dCB0byAxNjYwICAgICAgICAgICAgICAgMTUwMjQgY3V0IHRvIDg3MDMKIwojIEJ1aWxkaW5nIHRoZSBoZWFwIGJ5IHVzaW5nIGhlYXBwdXNoKCkgMTAwMCB0aW1lcyBpbnN0ZWFkIHJlcXVpcmVkCiMgMjE5OCwgMjE0OCwgYW5kIDIyMTkgY29tcGFyZXM6ICBoZWFwaWZ5KCkgaXMgbW9yZSBlZmZpY2llbnQsIHdoZW4KIyB5b3UgY2FuIHVzZSBpdC4KIwojIFRoZSB0b3RhbCBjb21wYXJlcyBuZWVkZWQgYnkgbGlzdC5zb3J0KCkgb24gdGhlIHNhbWUgbGlzdHMgd2VyZSA4NjI3LAojIDg2MjcsIGFuZCA4NjMyICh0aGlzIHNob3VsZCBiZSBjb21wYXJlZCB0byB0aGUgc3VtIG9mIGhlYXBpZnkoKSBhbmQKIyBoZWFwcG9wKCkgY29tcGFyZXMpOiAgbGlzdC5zb3J0KCkgaXMgKHVuc3VycHJpc2luZ2x5ISkgbW9yZSBlZmZpY2llbnQKIyBmb3Igc29ydGluZy4KCmRlZiBfc2lmdHVwKGhlYXAsIHBvcyk6CiAgICBlbmRwb3MgPSBsZW4oaGVhcCkKICAgIHN0YXJ0cG9zID0gcG9zCiAgICBuZXdpdGVtID0gaGVhcFtwb3NdCiAgICAjIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4KICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24KICAgIHdoaWxlIGNoaWxkcG9zIDwgZW5kcG9zOgogICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuCiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDEKICAgICAgICBpZiByaWdodHBvcyA8IGVuZHBvcyBhbmQgbm90IGNtcF9sdChoZWFwW2NoaWxkcG9zXSwgaGVhcFtyaWdodHBvc10pOgogICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zCiAgICAgICAgIyBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLgogICAgICAgIGhlYXBbcG9zXSA9IGhlYXBbY2hpbGRwb3NdCiAgICAgICAgcG9zID0gY2hpbGRwb3MKICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMQogICAgIyBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBidWJibGUgaXQgdXAKICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuCiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtCiAgICBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcykKCiMgSWYgYXZhaWxhYmxlLCB1c2UgQyBpbXBsZW1lbnRhdGlvbgp0cnk6CiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgKgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCgpkZWYgbWVyZ2UoKml0ZXJhYmxlcyk6CiAgICAnJydNZXJnZSBtdWx0aXBsZSBzb3J0ZWQgaW5wdXRzIGludG8gYSBzaW5nbGUgc29ydGVkIG91dHB1dC4KCiAgICBTaW1pbGFyIHRvIHNvcnRlZChpdGVydG9vbHMuY2hhaW4oKml0ZXJhYmxlcykpIGJ1dCByZXR1cm5zIGEgZ2VuZXJhdG9yLAogICAgZG9lcyBub3QgcHVsbCB0aGUgZGF0YSBpbnRvIG1lbW9yeSBhbGwgYXQgb25jZSwgYW5kIGFzc3VtZXMgdGhhdCBlYWNoIG9mCiAgICB0aGUgaW5wdXQgc3RyZWFtcyBpcyBhbHJlYWR5IHNvcnRlZCAoc21hbGxlc3QgdG8gbGFyZ2VzdCkuCgogICAgPj4+IGxpc3QobWVyZ2UoWzEsMyw1LDddLCBbMCwyLDQsOF0sIFs1LDEwLDE1LDIwXSwgW10sIFsyNV0pKQogICAgWzAsIDEsIDIsIDMsIDQsIDUsIDUsIDcsIDgsIDEwLCAxNSwgMjAsIDI1XQoKICAgICcnJwogICAgX2hlYXBwb3AsIF9oZWFwcmVwbGFjZSwgX1N0b3BJdGVyYXRpb24gPSBoZWFwcG9wLCBoZWFwcmVwbGFjZSwgU3RvcEl0ZXJhdGlvbgoKICAgIGggPSBbXQogICAgaF9hcHBlbmQgPSBoLmFwcGVuZAogICAgZm9yIGl0bnVtLCBpdCBpbiBlbnVtZXJhdGUobWFwKGl0ZXIsIGl0ZXJhYmxlcykpOgogICAgICAgIHRyeToKICAgICAgICAgICAgbmV4dCA9IGl0Lm5leHQKICAgICAgICAgICAgaF9hcHBlbmQoW25leHQoKSwgaXRudW0sIG5leHRdKQogICAgICAgIGV4Y2VwdCBfU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgcGFzcwogICAgaGVhcGlmeShoKQoKICAgIHdoaWxlIDE6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgdiwgaXRudW0sIG5leHQgPSBzID0gaFswXSAgICMgcmFpc2VzIEluZGV4RXJyb3Igd2hlbiBoIGlzIGVtcHR5CiAgICAgICAgICAgICAgICB5aWVsZCB2CiAgICAgICAgICAgICAgICBzWzBdID0gbmV4dCgpICAgICAgICAgICAgICAgIyByYWlzZXMgU3RvcEl0ZXJhdGlvbiB3aGVuIGV4aGF1c3RlZAogICAgICAgICAgICAgICAgX2hlYXByZXBsYWNlKGgsIHMpICAgICAgICAgICMgcmVzdG9yZSBoZWFwIGNvbmRpdGlvbgogICAgICAgIGV4Y2VwdCBfU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgX2hlYXBwb3AoaCkgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBlbXB0eSBpdGVyYXRvcgogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICByZXR1cm4KCiMgRXh0ZW5kIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgbnNtYWxsZXN0IGFuZCBubGFyZ2VzdCB0byB1c2UgYSBrZXk9IGFyZ3VtZW50Cl9uc21hbGxlc3QgPSBuc21hbGxlc3QKZGVmIG5zbWFsbGVzdChuLCBpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgIiIiRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuCgogICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSlbOm5dCiAgICAiIiIKICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtaW4oKSB3aGVuIGxlbihpdGVyYWJsZSk+MAogICAgaWYgbiA9PSAxOgogICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKICAgICAgICBoZWFkID0gbGlzdChpc2xpY2UoaXQsIDEpKQogICAgICAgIGlmIG5vdCBoZWFkOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIFttaW4oY2hhaW4oaGVhZCwgaXQpKV0KICAgICAgICByZXR1cm4gW21pbihjaGFpbihoZWFkLCBpdCksIGtleT1rZXkpXQoKICAgICMgV2hlbiBuPj1zaXplLCBpdCdzIGZhc3RlciB0byB1c2Ugc29ydGVkKCkKICAgIHRyeToKICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKQogICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIGlmIG4gPj0gc2l6ZToKICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSlbOm5dCgogICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uCiAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICBpdCA9IGl6aXAoaXRlcmFibGUsIGNvdW50KCkpICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWNvcmF0ZQogICAgICAgIHJlc3VsdCA9IF9uc21hbGxlc3QobiwgaXQpCiAgICAgICAgcmV0dXJuIG1hcChpdGVtZ2V0dGVyKDApLCByZXN1bHQpICAgICAgICAgICAgICAgICAgICMgdW5kZWNvcmF0ZQoKICAgICMgR2VuZXJhbCBjYXNlLCBzbG93ZXN0IG1ldGhvZAogICAgaW4xLCBpbjIgPSB0ZWUoaXRlcmFibGUpCiAgICBpdCA9IGl6aXAoaW1hcChrZXksIGluMSksIGNvdW50KCksIGluMikgICAgICAgICAgICAgICAgICMgZGVjb3JhdGUKICAgIHJlc3VsdCA9IF9uc21hbGxlc3QobiwgaXQpCiAgICByZXR1cm4gbWFwKGl0ZW1nZXR0ZXIoMiksIHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICMgdW5kZWNvcmF0ZQoKX25sYXJnZXN0ID0gbmxhcmdlc3QKZGVmIG5sYXJnZXN0KG4sIGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CiAgICAiIiJGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LgoKICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dCiAgICAiIiIKCiAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWF4KCkgd2hlbiBsZW4oaXRlcmFibGUpPjAKICAgIGlmIG4gPT0gMToKICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCiAgICAgICAgaGVhZCA9IGxpc3QoaXNsaWNlKGl0LCAxKSkKICAgICAgICBpZiBub3QgaGVhZDoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBbbWF4KGNoYWluKGhlYWQsIGl0KSldCiAgICAgICAgcmV0dXJuIFttYXgoY2hhaW4oaGVhZCwgaXQpLCBrZXk9a2V5KV0KCiAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpCiAgICB0cnk6CiAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSkKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICBpZiBuID49IHNpemU6CiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dCgogICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uCiAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICBpdCA9IGl6aXAoaXRlcmFibGUsIGNvdW50KDAsLTEpKSAgICAgICAgICAgICAgICAgICAgIyBkZWNvcmF0ZQogICAgICAgIHJlc3VsdCA9IF9ubGFyZ2VzdChuLCBpdCkKICAgICAgICByZXR1cm4gbWFwKGl0ZW1nZXR0ZXIoMCksIHJlc3VsdCkgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlCgogICAgIyBHZW5lcmFsIGNhc2UsIHNsb3dlc3QgbWV0aG9kCiAgICBpbjEsIGluMiA9IHRlZShpdGVyYWJsZSkKICAgIGl0ID0gaXppcChpbWFwKGtleSwgaW4xKSwgY291bnQoMCwtMSksIGluMikgICAgICAgICAgICAgIyBkZWNvcmF0ZQogICAgcmVzdWx0ID0gX25sYXJnZXN0KG4sIGl0KQogICAgcmV0dXJuIG1hcChpdGVtZ2V0dGVyKDIpLCByZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAjIHVuZGVjb3JhdGUKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAjIFNpbXBsZSBzYW5pdHkgdGVzdAogICAgaGVhcCA9IFtdCiAgICBkYXRhID0gWzEsIDMsIDUsIDcsIDksIDIsIDQsIDYsIDgsIDBdCiAgICBmb3IgaXRlbSBpbiBkYXRhOgogICAgICAgIGhlYXBwdXNoKGhlYXAsIGl0ZW0pCiAgICBzb3J0ID0gW10KICAgIHdoaWxlIGhlYXA6CiAgICAgICAgc29ydC5hcHBlbmQoaGVhcHBvcChoZWFwKSkKICAgIHByaW50IHNvcnQKCiAgICBpbXBvcnQgZG9jdGVzdAogICAgZG9jdGVzdC50ZXN0bW9kKCkK