IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQ0KIiIiIFB5dGhvbiAnZXNjYXBlJyBDb2RlYw0KDQoNCldyaXR0ZW4gYnkgTWFydGluIHYuIEz2d2lzIChtYXJ0aW5Adi5sb2V3aXMuZGUpLg0KDQoiIiINCmltcG9ydCBjb2RlY3MNCg0KY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToNCg0KICAgIGVuY29kZSA9IGNvZGVjcy5lc2NhcGVfZW5jb2RlDQogICAgZGVjb2RlID0gY29kZWNzLmVzY2FwZV9kZWNvZGUNCg0KY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOg0KICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToNCiAgICAgICAgcmV0dXJuIGNvZGVjcy5lc2NhcGVfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0NCg0KY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOg0KICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToNCiAgICAgICAgcmV0dXJuIGNvZGVjcy5lc2NhcGVfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0NCg0KY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOg0KICAgIHBhc3MNCg0KY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOg0KICAgIHBhc3MNCg0KZGVmIGdldHJlZ2VudHJ5KCk6DQogICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oDQogICAgICAgIG5hbWU9J3N0cmluZy1lc2NhcGUnLA0KICAgICAgICBlbmNvZGU9Q29kZWMuZW5jb2RlLA0KICAgICAgICBkZWNvZGU9Q29kZWMuZGVjb2RlLA0KICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLA0KICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLA0KICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLA0KICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLA0KICAgICkNCg==