IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQoiIiIgUHl0aG9uICdlc2NhcGUnIENvZGVjCgoKV3JpdHRlbiBieSBNYXJ0aW4gdi4gTPZ3aXMgKG1hcnRpbkB2LmxvZXdpcy5kZSkuCgoiIiIKaW1wb3J0IGNvZGVjcwoKY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKCiAgICBlbmNvZGUgPSBjb2RlY3MuZXNjYXBlX2VuY29kZQogICAgZGVjb2RlID0gY29kZWNzLmVzY2FwZV9kZWNvZGUKCmNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKICAgICAgICByZXR1cm4gY29kZWNzLmVzY2FwZV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQoKY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgogICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgogICAgICAgIHJldHVybiBjb2RlY3MuZXNjYXBlX2RlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCgpjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CiAgICBwYXNzCgpjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CiAgICBwYXNzCgpkZWYgZ2V0cmVnZW50cnkoKToKICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAogICAgICAgIG5hbWU9J3N0cmluZy1lc2NhcGUnLAogICAgICAgIGVuY29kZT1Db2RlYy5lbmNvZGUsCiAgICAgICAgZGVjb2RlPUNvZGVjLmRlY29kZSwKICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAogICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCiAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAogICAgKQo=