IyAtKi0gY29kaW5nOiBsYXRpbi0xIC0qLQoKIiIiSGVhcCBxdWV1ZSBhbGdvcml0aG0gKGEuay5hLiBwcmlvcml0eSBxdWV1ZSkuCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClVzYWdlOgoKaGVhcCA9IFtdICAgICAgICAgICAgIyBjcmVhdGVzIGFuIGVtcHR5IGhlYXAKaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcAppdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcAppdGVtID0gaGVhcFswXSAgICAgICAjIHNtYWxsZXN0IGl0ZW0gb24gdGhlIGhlYXAgd2l0aG91dCBwb3BwaW5nIGl0CmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWUKaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXcgaXRlbTsgdGhlIGhlYXAgc2l6ZSBpcyB1bmNoYW5nZWQKCk91ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOgoKLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZQogIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzcwogIG9idmlvdXMsIGJ1dCBpcyBtb3JlIHN1aXRhYmxlIHNpbmNlIFB5dGhvbiB1c2VzIDAtYmFzZWQgaW5kZXhpbmcuCgotIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC4KClRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0CndpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KCkKbWFpbnRhaW5zIHRoZSBoZWFwIGludmFyaWFudCEKIiIiCgojIE9yaWdpbmFsIGNvZGUgYnkgS2V2aW4gTydDb25ub3IsIGF1Z21lbnRlZCBieSBUaW0gUGV0ZXJzIGFuZCBSYXltb25kIEhldHRpbmdlcgoKX19hYm91dF9fID0gIiIiSGVhcCBxdWV1ZXMKCltleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5CnJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXToKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAoKICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKCiAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNgoKICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNAoKICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzAKCgpJbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJbgphbiB1c3VhbCBiaW5hcnkgdG91cm5hbWVudCB3ZSBzZWUgaW4gc3BvcnRzLCBlYWNoIGNlbGwgaXMgdGhlIHdpbm5lcgpvdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWUKdG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9ucwpvZiBzdWNoIHRvdXJuYW1lbnRzLCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjZSB0aGUgaGlzdG9yeSBvZiBhIHdpbm5lci4KVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG8KcmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lcwp0aGF0IGEgY2VsbCBhbmQgdGhlIHR3byBjZWxscyBpdCB0b3BzIGNvbnRhaW4gdGhyZWUgZGlmZmVyZW50IGl0ZW1zLApidXQgdGhlIHRvcCBjZWxsICJ3aW5zIiBvdmVyIHRoZSB0d28gdG9wcGVkIGNlbGxzLgoKSWYgdGhpcyBoZWFwIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYXQgYWxsIHRpbWUsIGluZGV4IDAgaXMgY2xlYXJseQp0aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmQKZmluZCB0aGUgIm5leHQiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZQpkaWFncmFtIGFib3ZlKSBpbnRvIHRoZSAwIHBvc2l0aW9uLCBhbmQgdGhlbiBwZXJjb2xhdGUgdGhpcyBuZXcgMCBkb3duCnRoZSB0cmVlLCBleGNoYW5naW5nIHZhbHVlcywgdW50aWwgdGhlIGludmFyaWFudCBpcyByZS1lc3RhYmxpc2hlZC4KVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuCkJ5IGl0ZXJhdGluZyBvdmVyIGFsbCBpdGVtcywgeW91IGdldCBhbiBPKG4gbG4gbikgc29ydC4KCkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ldwppdGVtcyB3aGlsZSB0aGUgc29ydCBpcyBnb2luZyBvbiwgcHJvdmlkZWQgdGhhdCB0aGUgaW5zZXJ0ZWQgaXRlbXMgYXJlCm5vdCAiYmV0dGVyIiB0aGFuIHRoZSBsYXN0IDAndGggZWxlbWVudCB5b3UgZXh0cmFjdGVkLiAgVGhpcyBpcwplc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGwKaW5jb21pbmcgZXZlbnRzLCBhbmQgdGhlICJ3aW4iIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkCnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZQpzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJCnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS4KClZhcmlvdXMgc3RydWN0dXJlcyBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgaGF2ZSBiZWVuIGV4dGVuc2l2ZWx5CnN0dWRpZWQsIGFuZCBoZWFwcyBhcmUgZ29vZCBmb3IgdGhpcywgYXMgdGhleSBhcmUgcmVhc29uYWJseSBzcGVlZHksCnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnQKdGhhbiB0aGUgYXZlcmFnZSBjYXNlLiAgSG93ZXZlciwgdGhlcmUgYXJlIG90aGVyIHJlcHJlc2VudGF0aW9ucyB3aGljaAphcmUgbW9yZSBlZmZpY2llbnQgb3ZlcmFsbCwgeWV0IHRoZSB3b3JzdCBjYXNlcyBtaWdodCBiZSB0ZXJyaWJsZS4KCkhlYXBzIGFyZSBhbHNvIHZlcnkgdXNlZnVsIGluIGJpZyBkaXNrIHNvcnRzLiAgWW91IG1vc3QgcHJvYmFibHkgYWxsCmtub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nICJydW5zIiAod2hpY2ggYXJlIHByZS1zb3J0ZWQKc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLApmb2xsb3dlZCBieSBhIG1lcmdpbmcgcGFzc2VzIGZvciB0aGVzZSBydW5zLCB3aGljaCBtZXJnaW5nIGlzIG9mdGVuCnZlcnkgY2xldmVybHkgb3JnYW5pc2VkWzFdLiAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgaW5pdGlhbApzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheQp0byB0aGF0LiAgSWYsIHVzaW5nIGFsbCB0aGUgbWVtb3J5IGF2YWlsYWJsZSB0byBob2xkIGEgdG91cm5hbWVudCwgeW91CnJlcGxhY2UgYW5kIHBlcmNvbGF0ZSBpdGVtcyB0aGF0IGhhcHBlbiB0byBmaXQgdGhlIGN1cnJlbnQgcnVuLCB5b3UnbGwKcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsCmFuZCBtdWNoIGJldHRlciBmb3IgaW5wdXQgZnV6emlseSBvcmRlcmVkLgoKTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2gKbWF5IG5vdCBmaXQgaW4gdGhlIGN1cnJlbnQgdG91cm5hbWVudCAoYmVjYXVzZSB0aGUgdmFsdWUgIndpbnMiIG92ZXIKdGhlIGxhc3Qgb3V0cHV0IHZhbHVlKSwgaXQgY2Fubm90IGZpdCBpbiB0aGUgaGVhcCwgc28gdGhlIHNpemUgb2YgdGhlCmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHkKZm9yIHByb2dyZXNzaXZlbHkgYnVpbGRpbmcgYSBzZWNvbmQgaGVhcCwgd2hpY2ggZ3Jvd3MgYXQgZXhhY3RseSB0aGUKc2FtZSByYXRlIHRoZSBmaXJzdCBoZWFwIGlzIG1lbHRpbmcuICBXaGVuIHRoZSBmaXJzdCBoZWFwIGNvbXBsZXRlbHkKdmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGUKZWZmZWN0aXZlIQoKSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluCmEgZmV3IGFwcGxpY2F0aW9ucywgYW5kIEkgdGhpbmsgaXQgaXMgZ29vZCB0byBrZWVwIGEgYGhlYXAnIG1vZHVsZQphcm91bmQuIDotKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0KWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlCm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmcKY2FwYWJpbGl0aWVzIG9mIHRoZSBkaXNrcy4gIE9uIGRldmljZXMgd2hpY2ggY2Fubm90IHNlZWssIGxpa2UgYmlnCnRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeQpjbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGUKbW9zdCBlZmZlY3RpdmUgcG9zc2libGUgKHRoYXQgaXMsIHdpbGwgYmVzdCBwYXJ0aWNpcGF0ZSBhdAoicHJvZ3Jlc3NpbmciIHRoZSBtZXJnZSkuICBTb21lIHRhcGVzIHdlcmUgZXZlbiBhYmxlIHRvIHJlYWQKYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS4KQmVsaWV2ZSBtZSwgcmVhbCBnb29kIHRhcGUgc29ydHMgd2VyZSBxdWl0ZSBzcGVjdGFjdWxhciB0byB3YXRjaCEKRnJvbSBhbGwgdGltZXMsIHNvcnRpbmcgaGFzIGFsd2F5cyBiZWVuIGEgR3JlYXQgQXJ0ISA6LSkKIiIiCgpfX2FsbF9fID0gWydoZWFwcHVzaCcsICdoZWFwcG9wJywgJ2hlYXBpZnknLCAnaGVhcHJlcGxhY2UnLCAnbWVyZ2UnLAogICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXQoKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZSwgY291bnQsIGltYXAsIGl6aXAsIHRlZSwgY2hhaW4KZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgoKZGVmIGNtcF9sdCh4LCB5KToKICAgICMgVXNlIF9fbHRfXyBpZiBhdmFpbGFibGU7IG90aGVyd2lzZSwgdHJ5IF9fbGVfXy4KICAgICMgSW4gUHkzLngsIG9ubHkgX19sdF9fIHdpbGwgYmUgY2FsbGVkLgogICAgcmV0dXJuICh4IDwgeSkgaWYgaGFzYXR0cih4LCAnX19sdF9fJykgZWxzZSAobm90IHkgPD0geCkKCmRlZiBoZWFwcHVzaChoZWFwLCBpdGVtKToKICAgICIiIlB1c2ggaXRlbSBvbnRvIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iIiIKICAgIGhlYXAuYXBwZW5kKGl0ZW0pCiAgICBfc2lmdGRvd24oaGVhcCwgMCwgbGVuKGhlYXApLTEpCgpkZWYgaGVhcHBvcChoZWFwKToKICAgICIiIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iIiIKICAgIGxhc3RlbHQgPSBoZWFwLnBvcCgpICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eQogICAgaWYgaGVhcDoKICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXQogICAgICAgIGhlYXBbMF0gPSBsYXN0ZWx0CiAgICAgICAgX3NpZnR1cChoZWFwLCAwKQogICAgZWxzZToKICAgICAgICByZXR1cm5pdGVtID0gbGFzdGVsdAogICAgcmV0dXJuIHJldHVybml0ZW0KCmRlZiBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKToKICAgICIiIlBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS4KCiAgICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmUKICAgIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWUKICAgIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZgogICAgdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBjb25kaXRpb25hbCByZXBsYWNlbWVudDoKCiAgICAgICAgaWYgaXRlbSA+IGhlYXBbMF06CiAgICAgICAgICAgIGl0ZW0gPSBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKQogICAgIiIiCiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkKICAgIGhlYXBbMF0gPSBpdGVtCiAgICBfc2lmdHVwKGhlYXAsIDApCiAgICByZXR1cm4gcmV0dXJuaXRlbQoKZGVmIGhlYXBwdXNocG9wKGhlYXAsIGl0ZW0pOgogICAgIiIiRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLiIiIgogICAgaWYgaGVhcCBhbmQgY21wX2x0KGhlYXBbMF0sIGl0ZW0pOgogICAgICAgIGl0ZW0sIGhlYXBbMF0gPSBoZWFwWzBdLCBpdGVtCiAgICAgICAgX3NpZnR1cChoZWFwLCAwKQogICAgcmV0dXJuIGl0ZW0KCmRlZiBoZWFwaWZ5KHgpOgogICAgIiIiVHJhbnNmb3JtIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBPKGxlbih4KSkgdGltZS4iIiIKICAgIG4gPSBsZW4oeCkKICAgICMgVHJhbnNmb3JtIGJvdHRvbS11cC4gIFRoZSBsYXJnZXN0IGluZGV4IHRoZXJlJ3MgYW55IHBvaW50IHRvIGxvb2tpbmcgYXQKICAgICMgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0IGhhdmUgMippICsgMSA8IG4sCiAgICAjIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzICgyKmotMSkvMiA9IGotMS8yIHNvCiAgICAjIGotMSBpcyB0aGUgbGFyZ2VzdCwgd2hpY2ggaXMgbi8vMiAtIDEuICBJZiBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzCiAgICAjICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLgogICAgZm9yIGkgaW4gcmV2ZXJzZWQoeHJhbmdlKG4vLzIpKToKICAgICAgICBfc2lmdHVwKHgsIGkpCgpkZWYgX2hlYXBwdXNocG9wX21heChoZWFwLCBpdGVtKToKICAgICIiIk1heGhlYXAgdmVyc2lvbiBvZiBhIGhlYXBwdXNoIGZvbGxvd2VkIGJ5IGEgaGVhcHBvcC4iIiIKICAgIGlmIGhlYXAgYW5kIGNtcF9sdChpdGVtLCBoZWFwWzBdKToKICAgICAgICBpdGVtLCBoZWFwWzBdID0gaGVhcFswXSwgaXRlbQogICAgICAgIF9zaWZ0dXBfbWF4KGhlYXAsIDApCiAgICByZXR1cm4gaXRlbQoKZGVmIF9oZWFwaWZ5X21heCh4KToKICAgICIiIlRyYW5zZm9ybSBsaXN0IGludG8gYSBtYXhoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuIiIiCiAgICBuID0gbGVuKHgpCiAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShuLy8yKSk6CiAgICAgICAgX3NpZnR1cF9tYXgoeCwgaSkKCmRlZiBubGFyZ2VzdChuLCBpdGVyYWJsZSk6CiAgICAiIiJGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LgoKICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIHJldmVyc2U9VHJ1ZSlbOm5dCiAgICAiIiIKICAgIGlmIG4gPCAwOgogICAgICAgIHJldHVybiBbXQogICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQogICAgcmVzdWx0ID0gbGlzdChpc2xpY2UoaXQsIG4pKQogICAgaWYgbm90IHJlc3VsdDoKICAgICAgICByZXR1cm4gcmVzdWx0CiAgICBoZWFwaWZ5KHJlc3VsdCkKICAgIF9oZWFwcHVzaHBvcCA9IGhlYXBwdXNocG9wCiAgICBmb3IgZWxlbSBpbiBpdDoKICAgICAgICBfaGVhcHB1c2hwb3AocmVzdWx0LCBlbGVtKQogICAgcmVzdWx0LnNvcnQocmV2ZXJzZT1UcnVlKQogICAgcmV0dXJuIHJlc3VsdAoKZGVmIG5zbWFsbGVzdChuLCBpdGVyYWJsZSk6CiAgICAiIiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4KCiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlKVs6bl0KICAgICIiIgogICAgaWYgbiA8IDA6CiAgICAgICAgcmV0dXJuIFtdCiAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCiAgICByZXN1bHQgPSBsaXN0KGlzbGljZShpdCwgbikpCiAgICBpZiBub3QgcmVzdWx0OgogICAgICAgIHJldHVybiByZXN1bHQKICAgIF9oZWFwaWZ5X21heChyZXN1bHQpCiAgICBfaGVhcHB1c2hwb3AgPSBfaGVhcHB1c2hwb3BfbWF4CiAgICBmb3IgZWxlbSBpbiBpdDoKICAgICAgICBfaGVhcHB1c2hwb3AocmVzdWx0LCBlbGVtKQogICAgcmVzdWx0LnNvcnQoKQogICAgcmV0dXJuIHJlc3VsdAoKIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvcwojIGlzIHRoZSBpbmRleCBvZiBhIGxlYWYgd2l0aCBhIHBvc3NpYmx5IG91dC1vZi1vcmRlciB2YWx1ZS4gIFJlc3RvcmUgdGhlCiMgaGVhcCBpbnZhcmlhbnQuCmRlZiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk6CiAgICBuZXdpdGVtID0gaGVhcFtwb3NdCiAgICAjIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nIGEgcGxhY2UKICAgICMgbmV3aXRlbSBmaXRzLgogICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6CiAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDEKICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc10KICAgICAgICBpZiBjbXBfbHQobmV3aXRlbSwgcGFyZW50KToKICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50CiAgICAgICAgICAgIHBvcyA9IHBhcmVudHBvcwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGJyZWFrCiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtCgojIFRoZSBjaGlsZCBpbmRpY2VzIG9mIGhlYXAgaW5kZXggcG9zIGFyZSBhbHJlYWR5IGhlYXBzLCBhbmQgd2Ugd2FudCB0byBtYWtlCiMgYSBoZWFwIGF0IGluZGV4IHBvcyB0b28uICBXZSBkbyB0aGlzIGJ5IGJ1YmJsaW5nIHRoZSBzbWFsbGVyIGNoaWxkIG9mCiMgcG9zIHVwIChhbmQgc28gb24gd2l0aCB0aGF0IGNoaWxkJ3MgY2hpbGRyZW4sIGV0YykgdW50aWwgaGl0dGluZyBhIGxlYWYsCiMgdGhlbiB1c2luZyBfc2lmdGRvd24gdG8gbW92ZSB0aGUgb2RkYmFsbCBvcmlnaW5hbGx5IGF0IGluZGV4IHBvcyBpbnRvIHBsYWNlLgojCiMgV2UgKmNvdWxkKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgYXMgc29vbiBhcyB3ZSBmaW5kIGEgcG9zIHdoZXJlIG5ld2l0ZW0gPD0KIyBib3RoIGl0cyBjaGlsZHJlbiwgYnV0IHR1cm5zIG91dCB0aGF0J3Mgbm90IGEgZ29vZCBpZGVhLCBhbmQgZGVzcGl0ZSB0aGF0CiMgbWFueSBib29rcyB3cml0ZSB0aGUgYWxnb3JpdGhtIHRoYXQgd2F5LiAgRHVyaW5nIGEgaGVhcCBwb3AsIHRoZSBsYXN0IGFycmF5CiMgZWxlbWVudCBpcyBzaWZ0ZWQgaW4sIGFuZCB0aGF0IHRlbmRzIHRvIGJlIGxhcmdlLCBzbyB0aGF0IGNvbXBhcmluZyBpdAojIGFnYWluc3QgdmFsdWVzIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgdXN1YWxseSBkb2Vzbid0IHBheSAoPSB1c3VhbGx5IGRvZXNuJ3QKIyBnZXQgdXMgb3V0IG9mIHRoZSBsb29wIGVhcmx5KS4gIFNlZSBLbnV0aCwgVm9sdW1lIDMsIHdoZXJlIHRoaXMgaXMKIyBleHBsYWluZWQgYW5kIHF1YW50aWZpZWQgaW4gYW4gZXhlcmNpc2UuCiMKIyBDdXR0aW5nIHRoZSAjIG9mIGNvbXBhcmlzb25zIGlzIGltcG9ydGFudCwgc2luY2UgdGhlc2Ugcm91dGluZXMgaGF2ZSBubwojIHdheSB0byBleHRyYWN0ICJ0aGUgcHJpb3JpdHkiIGZyb20gYW4gYXJyYXkgZWxlbWVudCwgc28gdGhhdCBpbnRlbGxpZ2VuY2UKIyBpcyBsaWtlbHkgdG8gYmUgaGlkaW5nIGluIGN1c3RvbSBfX2NtcF9fIG1ldGhvZHMsIG9yIGluIGFycmF5IGVsZW1lbnRzCiMgc3RvcmluZyAocHJpb3JpdHksIHJlY29yZCkgdHVwbGVzLiAgQ29tcGFyaXNvbnMgYXJlIHRodXMgcG90ZW50aWFsbHkKIyBleHBlbnNpdmUuCiMKIyBPbiByYW5kb20gYXJyYXlzIG9mIGxlbmd0aCAxMDAwLCBtYWtpbmcgdGhpcyBjaGFuZ2UgY3V0IHRoZSBudW1iZXIgb2YKIyBjb21wYXJpc29ucyBtYWRlIGJ5IGhlYXBpZnkoKSBhIGxpdHRsZSwgYW5kIHRob3NlIG1hZGUgYnkgZXhoYXVzdGl2ZQojIGhlYXBwb3AoKSBhIGxvdCwgaW4gYWNjb3JkIHdpdGggdGhlb3J5LiAgSGVyZSBhcmUgdHlwaWNhbCByZXN1bHRzIGZyb20gMwojIHJ1bnMgKDMganVzdCB0byBkZW1vbnN0cmF0ZSBob3cgc21hbGwgdGhlIHZhcmlhbmNlIGlzKToKIwojIENvbXBhcmVzIG5lZWRlZCBieSBoZWFwaWZ5ICAgICBDb21wYXJlcyBuZWVkZWQgYnkgMTAwMCBoZWFwcG9wcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDE4MzcgY3V0IHRvIDE2NjMgICAgICAgICAgICAgICAxNDk5NiBjdXQgdG8gODY4MAojIDE4NTUgY3V0IHRvIDE2NTkgICAgICAgICAgICAgICAxNDk2NiBjdXQgdG8gODY3OAojIDE4NDcgY3V0IHRvIDE2NjAgICAgICAgICAgICAgICAxNTAyNCBjdXQgdG8gODcwMwojCiMgQnVpbGRpbmcgdGhlIGhlYXAgYnkgdXNpbmcgaGVhcHB1c2goKSAxMDAwIHRpbWVzIGluc3RlYWQgcmVxdWlyZWQKIyAyMTk4LCAyMTQ4LCBhbmQgMjIxOSBjb21wYXJlczogIGhlYXBpZnkoKSBpcyBtb3JlIGVmZmljaWVudCwgd2hlbgojIHlvdSBjYW4gdXNlIGl0LgojCiMgVGhlIHRvdGFsIGNvbXBhcmVzIG5lZWRlZCBieSBsaXN0LnNvcnQoKSBvbiB0aGUgc2FtZSBsaXN0cyB3ZXJlIDg2MjcsCiMgODYyNywgYW5kIDg2MzIgKHRoaXMgc2hvdWxkIGJlIGNvbXBhcmVkIHRvIHRoZSBzdW0gb2YgaGVhcGlmeSgpIGFuZAojIGhlYXBwb3AoKSBjb21wYXJlcyk6ICBsaXN0LnNvcnQoKSBpcyAodW5zdXJwcmlzaW5nbHkhKSBtb3JlIGVmZmljaWVudAojIGZvciBzb3J0aW5nLgoKZGVmIF9zaWZ0dXAoaGVhcCwgcG9zKToKICAgIGVuZHBvcyA9IGxlbihoZWFwKQogICAgc3RhcnRwb3MgPSBwb3MKICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc10KICAgICMgQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLgogICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbgogICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6CiAgICAgICAgIyBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4KICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMQogICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgY21wX2x0KGhlYXBbY2hpbGRwb3NdLCBoZWFwW3JpZ2h0cG9zXSk6CiAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3MKICAgICAgICAjIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuCiAgICAgICAgaGVhcFtwb3NdID0gaGVhcFtjaGlsZHBvc10KICAgICAgICBwb3MgPSBjaGlsZHBvcwogICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxCiAgICAjIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGJ1YmJsZSBpdCB1cAogICAgIyB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4KICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW0KICAgIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKQoKZGVmIF9zaWZ0ZG93bl9tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk6CiAgICAnTWF4aGVhcCB2YXJpYW50IG9mIF9zaWZ0ZG93bicKICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc10KICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZQogICAgIyBuZXdpdGVtIGZpdHMuCiAgICB3aGlsZSBwb3MgPiBzdGFydHBvczoKICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMQogICAgICAgIHBhcmVudCA9IGhlYXBbcGFyZW50cG9zXQogICAgICAgIGlmIGNtcF9sdChwYXJlbnQsIG5ld2l0ZW0pOgogICAgICAgICAgICBoZWFwW3Bvc10gPSBwYXJlbnQKICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgYnJlYWsKICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW0KCmRlZiBfc2lmdHVwX21heChoZWFwLCBwb3MpOgogICAgJ01heGhlYXAgdmFyaWFudCBvZiBfc2lmdHVwJwogICAgZW5kcG9zID0gbGVuKGhlYXApCiAgICBzdGFydHBvcyA9IHBvcwogICAgbmV3aXRlbSA9IGhlYXBbcG9zXQogICAgIyBCdWJibGUgdXAgdGhlIGxhcmdlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4KICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24KICAgIHdoaWxlIGNoaWxkcG9zIDwgZW5kcG9zOgogICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIGxhcmdlciBjaGlsZC4KICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMQogICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgY21wX2x0KGhlYXBbcmlnaHRwb3NdLCBoZWFwW2NoaWxkcG9zXSk6CiAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3MKICAgICAgICAjIE1vdmUgdGhlIGxhcmdlciBjaGlsZCB1cC4KICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXQogICAgICAgIHBvcyA9IGNoaWxkcG9zCiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDEKICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwCiAgICAjIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLgogICAgaGVhcFtwb3NdID0gbmV3aXRlbQogICAgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKQoKIyBJZiBhdmFpbGFibGUsIHVzZSBDIGltcGxlbWVudGF0aW9uCnRyeToKICAgIGZyb20gX2hlYXBxIGltcG9ydCAqCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKCmRlZiBtZXJnZSgqaXRlcmFibGVzKToKICAgICcnJ01lcmdlIG11bHRpcGxlIHNvcnRlZCBpbnB1dHMgaW50byBhIHNpbmdsZSBzb3J0ZWQgb3V0cHV0LgoKICAgIFNpbWlsYXIgdG8gc29ydGVkKGl0ZXJ0b29scy5jaGFpbigqaXRlcmFibGVzKSkgYnV0IHJldHVybnMgYSBnZW5lcmF0b3IsCiAgICBkb2VzIG5vdCBwdWxsIHRoZSBkYXRhIGludG8gbWVtb3J5IGFsbCBhdCBvbmNlLCBhbmQgYXNzdW1lcyB0aGF0IGVhY2ggb2YKICAgIHRoZSBpbnB1dCBzdHJlYW1zIGlzIGFscmVhZHkgc29ydGVkIChzbWFsbGVzdCB0byBsYXJnZXN0KS4KCiAgICA+Pj4gbGlzdChtZXJnZShbMSwzLDUsN10sIFswLDIsNCw4XSwgWzUsMTAsMTUsMjBdLCBbXSwgWzI1XSkpCiAgICBbMCwgMSwgMiwgMywgNCwgNSwgNSwgNywgOCwgMTAsIDE1LCAyMCwgMjVdCgogICAgJycnCiAgICBfaGVhcHBvcCwgX2hlYXByZXBsYWNlLCBfU3RvcEl0ZXJhdGlvbiA9IGhlYXBwb3AsIGhlYXByZXBsYWNlLCBTdG9wSXRlcmF0aW9uCgogICAgaCA9IFtdCiAgICBoX2FwcGVuZCA9IGguYXBwZW5kCiAgICBmb3IgaXRudW0sIGl0IGluIGVudW1lcmF0ZShtYXAoaXRlciwgaXRlcmFibGVzKSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBuZXh0ID0gaXQubmV4dAogICAgICAgICAgICBoX2FwcGVuZChbbmV4dCgpLCBpdG51bSwgbmV4dF0pCiAgICAgICAgZXhjZXB0IF9TdG9wSXRlcmF0aW9uOgogICAgICAgICAgICBwYXNzCiAgICBoZWFwaWZ5KGgpCgogICAgd2hpbGUgMToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAgICB2LCBpdG51bSwgbmV4dCA9IHMgPSBoWzBdICAgIyByYWlzZXMgSW5kZXhFcnJvciB3aGVuIGggaXMgZW1wdHkKICAgICAgICAgICAgICAgIHlpZWxkIHYKICAgICAgICAgICAgICAgIHNbMF0gPSBuZXh0KCkgICAgICAgICAgICAgICAjIHJhaXNlcyBTdG9wSXRlcmF0aW9uIHdoZW4gZXhoYXVzdGVkCiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UoaCwgcykgICAgICAgICAgIyByZXN0b3JlIGhlYXAgY29uZGl0aW9uCiAgICAgICAgZXhjZXB0IF9TdG9wSXRlcmF0aW9uOgogICAgICAgICAgICBfaGVhcHBvcChoKSAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGVtcHR5IGl0ZXJhdG9yCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgIHJldHVybgoKIyBFeHRlbmQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBuc21hbGxlc3QgYW5kIG5sYXJnZXN0IHRvIHVzZSBhIGtleT0gYXJndW1lbnQKX25zbWFsbGVzdCA9IG5zbWFsbGVzdApkZWYgbnNtYWxsZXN0KG4sIGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CiAgICAiIiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4KCiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl0KICAgICIiIgogICAgIyBTaG9ydC1jdXQgZm9yIG49PTEgaXMgdG8gdXNlIG1pbigpIHdoZW4gbGVuKGl0ZXJhYmxlKT4wCiAgICBpZiBuID09IDE6CiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQogICAgICAgIGhlYWQgPSBsaXN0KGlzbGljZShpdCwgMSkpCiAgICAgICAgaWYgbm90IGhlYWQ6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gW21pbihjaGFpbihoZWFkLCBpdCkpXQogICAgICAgIHJldHVybiBbbWluKGNoYWluKGhlYWQsIGl0KSwga2V5PWtleSldCgogICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKQogICAgdHJ5OgogICAgICAgIHNpemUgPSBsZW4oaXRlcmFibGUpCiAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgaWYgbiA+PSBzaXplOgogICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl0KCiAgICAjIFdoZW4ga2V5IGlzIG5vbmUsIHVzZSBzaW1wbGVyIGRlY29yYXRpb24KICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgIGl0ID0gaXppcChpdGVyYWJsZSwgY291bnQoKSkgICAgICAgICAgICAgICAgICAgICAgICAjIGRlY29yYXRlCiAgICAgICAgcmVzdWx0ID0gX25zbWFsbGVzdChuLCBpdCkKICAgICAgICByZXR1cm4gbWFwKGl0ZW1nZXR0ZXIoMCksIHJlc3VsdCkgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlCgogICAgIyBHZW5lcmFsIGNhc2UsIHNsb3dlc3QgbWV0aG9kCiAgICBpbjEsIGluMiA9IHRlZShpdGVyYWJsZSkKICAgIGl0ID0gaXppcChpbWFwKGtleSwgaW4xKSwgY291bnQoKSwgaW4yKSAgICAgICAgICAgICAgICAgIyBkZWNvcmF0ZQogICAgcmVzdWx0ID0gX25zbWFsbGVzdChuLCBpdCkKICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigyKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlCgpfbmxhcmdlc3QgPSBubGFyZ2VzdApkZWYgbmxhcmdlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKToKICAgICIiIkZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuCgogICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl0KICAgICIiIgoKICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtYXgoKSB3aGVuIGxlbihpdGVyYWJsZSk+MAogICAgaWYgbiA9PSAxOgogICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKICAgICAgICBoZWFkID0gbGlzdChpc2xpY2UoaXQsIDEpKQogICAgICAgIGlmIG5vdCBoZWFkOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIFttYXgoY2hhaW4oaGVhZCwgaXQpKV0KICAgICAgICByZXR1cm4gW21heChjaGFpbihoZWFkLCBpdCksIGtleT1rZXkpXQoKICAgICMgV2hlbiBuPj1zaXplLCBpdCdzIGZhc3RlciB0byB1c2Ugc29ydGVkKCkKICAgIHRyeToKICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKQogICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIGlmIG4gPj0gc2l6ZToKICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl0KCiAgICAjIFdoZW4ga2V5IGlzIG5vbmUsIHVzZSBzaW1wbGVyIGRlY29yYXRpb24KICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgIGl0ID0gaXppcChpdGVyYWJsZSwgY291bnQoMCwtMSkpICAgICAgICAgICAgICAgICAgICAjIGRlY29yYXRlCiAgICAgICAgcmVzdWx0ID0gX25sYXJnZXN0KG4sIGl0KQogICAgICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigwKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAjIHVuZGVjb3JhdGUKCiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2QKICAgIGluMSwgaW4yID0gdGVlKGl0ZXJhYmxlKQogICAgaXQgPSBpemlwKGltYXAoa2V5LCBpbjEpLCBjb3VudCgwLC0xKSwgaW4yKSAgICAgICAgICAgICAjIGRlY29yYXRlCiAgICByZXN1bHQgPSBfbmxhcmdlc3QobiwgaXQpCiAgICByZXR1cm4gbWFwKGl0ZW1nZXR0ZXIoMiksIHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICMgdW5kZWNvcmF0ZQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICMgU2ltcGxlIHNhbml0eSB0ZXN0CiAgICBoZWFwID0gW10KICAgIGRhdGEgPSBbMSwgMywgNSwgNywgOSwgMiwgNCwgNiwgOCwgMF0KICAgIGZvciBpdGVtIGluIGRhdGE6CiAgICAgICAgaGVhcHB1c2goaGVhcCwgaXRlbSkKICAgIHNvcnQgPSBbXQogICAgd2hpbGUgaGVhcDoKICAgICAgICBzb3J0LmFwcGVuZChoZWFwcG9wKGhlYXApKQogICAgcHJpbnQgc29ydAoKICAgIGltcG9ydCBkb2N0ZXN0CiAgICBkb2N0ZXN0LnRlc3Rtb2QoKQo=