LyogLSotIGxwYyAtKi0gKi8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyAgIG1vcnBoLmMKLy8KLy8gICAoYykgVHJveSAodHJveUBtZy5tdWQuZGUpCi8vICAgS29waWVyZW4sIFZlcmFlbmRlcm4gb2RlciBXZWl0ZXJnYWJlOiBuYSBrbGFyLCBpbW1lciB6dSwgamUgc2NobGltbWVyIAovLyAgIHVtIHNvIGJlc3NlcgovLwovLyAgIE9iamVrdCBlcnN0ZWxsdDogMTQuMDguMDEsIFRyb3kKLy8KLy8gICBEaWVzZXIgc2hhZG93IGltcGxlbWVudGllcnQgZ2VuZXJpc2NoZSBWZXJ3YW5kbHVuZ2VuLiBJbSBHZWdlbnNhdHogb2RlcgovLyAgIGluIEVyZ+RuenVuZyB6dW0gVGFybmhlbG0gc2luZCBkaWVzZSBuaWNodCBhdWYgZGllIEJlc2NocmVpYnVuZwovLyAgIGJlc2NocuRua3QsIHNvbmRlcm4gc2NobGFnZW4gc2ljaCBhdWNoIGluIGFuZGVyZW4gUHJvcGVydGllcyBuaWVkZXIuCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpbmNsdWRlIDxtb3ZpbmcuaD4KI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KI2luY2x1ZGUgPHdpemxldmVscy5oPgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdmFyYXJncyBpbnQgcmVtb3ZlKCBpbnQgc2lsZW50ICk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgUHJvcGVydHktRWluc3RlbGx1bmdlbiBqZSBuYWNoIFJhc3NlCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnByaXZhdGUgbWFwcGluZyBtb3JwaF9wcm9wZXJ0aWVzOwoKcHJpdmF0ZSBvYmplY3QgcGw7IC8vIGRlciBzY2hhdHRpZXJ0ZSBTcGllbGVyCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgc3RhcnRfc2hhZG93KCBTcGllbGVyLCBQcm9wZXJ0aWVzICkKLy8KLy8gICBTdGFydGV0IGRhcyBTaGFkb3dpbmcgdm9uIFNwaWVsZXIuIFByb3BlcnRpZXMgaXN0IGVpbiBNYXBwaW5nIG1pdAovLyAgIGRlbiB6dSDkbmRlcm5kZW4gUHJvcGVydGllcy4gRG9ydCBuaWNodCB2b3JoYW5kZW5lIFByb3BlcnRpZXMgd2VyZGVuCi8vICAgenVtIFNwaWVsZXIgZHVyY2hnZXJlaWNodC4gRXMgd2VyZGVuIGRvcnQgZW50d2VkZXIgZWluemVsbmUgV2VydGUKLy8gICBlcndhcnRldCAoQmVpc3BpZWw6IChbIFBfR0VOREVSOiBNQUxFIF0pKSwgZGllIGRhbm4gZvxyIGFsbGUgUmFzc2VuCi8vICAgZ2VsdGVuLCBvZGVyIGNsb3N1cmVzLCBkaWUgZGFubiBhdXNnZWb8aHJ0IHdlcmRlbiB1bnRlciDcYmVyZ2FiZSBkZXIKLy8gICBTcGllbGVycmFzc2UgYWxzIFBhcmFtZXRlciBvZGVyIGFiZXIgTWFwcGluZ3MgbWl0IGRlbiBSYXNzZW5uYW1lbgovLyAgIChCZWlzcGllbDogKFsgUF9HRU5ERVI6IChbICJNZW5zY2giOiBORVVURVIsICJFbGYiOiBGRU1BTEUsCi8vICAgIlp3ZXJnIjogTUFMRSwgLi4uIF0poF0pKS4gSXN0IGVpbmUgUmFzc2UgaW4gZGVtIFJhc3Nlbm1hcHBpbmcgbmljaHQKLy8gICB2b3JoYW5kZW4sIHNvIHdpcmQgZGFzIFByb3BlcnR5IHp1bSBTcGllbGVyIGR1cmNoZ2VyZWljaHQuIFNwZXppZWxsCi8vICAgYmVoYW5kZWx0IHdlcmRlbiBQX0lEUyAoc2llaGUgX3F1ZXJ5X2lkcygpKSB1bmQgUF9OQU1FIChzaWVoZQovLyAgIF9xdWVyeV9uYW1lKCkpLiAKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgc3RhcnRfc2hhZG93KCBvYmplY3QgX3BsLCBtYXBwaW5nIHByZXNldCApCnsKICBpZiAoICFjbG9uZXAoIHRoaXNfb2JqZWN0KCkgKSApCiAgICByZXR1cm4gMTsKICBpZiAoICFfcGwgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoIF9wbCApICkKICAgIHJldHVybiByZW1vdmUoKTsKICBwbCA9IF9wbDsKICBtb3JwaF9wcm9wZXJ0aWVzID0gZGVlcF9jb3B5KCBwcmVzZXQgKTsKICBzaGFkb3coIHBsLCAxICk7CiAgcmV0dXJuIDE7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBzdG9wX3NoYWRvdygpCi8vCi8vICAgQmVlbmRldCBkYXMgU2hhZG93aW5nIHVuZCB6ZXJzdPZydCBkaWVzZXMgT2JqZWt0Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IHN0b3Bfc2hhZG93KCAvKiB2b2lkICovICkKewogIGlmICggIWNsb25lcCggdGhpc19vYmplY3QoKSApICkKICAgIHJldHVybiAwOwogIHVuc2hhZG93KCk7CiAgcmV0dXJuIHJlbW92ZSgpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgX3F1ZXJ5X3Byb3BlcnR5KCBQcm9wZXJ0eSApCi8vCi8vICAgR2VuZXJpc2NoZSBQcm9wZXJ0eS1NYXNraWVydW5nLiBsaWVmZXJ0IGF1cyBtb3JwaF9wcm9wZXJ0aWVzIGRlbiB6dXIKLy8gICBSYXNzZSBkZXMgVHLkZ2VycyBwYXNzZW5kZW4gRWludHJhZy4KLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpub21hc2sgc3RhdGljIG1peGVkIF9xdWVyeV9wcm9wZXJ0eSggc3RyaW5nIHByb3AgKQp7CiAgc3RyaW5nIHJhY2U7CgogIC8vIFJhc3NlIGhvbGVuLgogIGlmICggSVNfTEVBUk5FUihwbCkgKQogICAgcmFjZSA9ICJNYWdpZXIiOwogIGVsc2UgLy8gX3F1ZXJ5X3JhY2UoKSBpc3Qgbm90d2VuZGlnLCB1bSBjbG9zdXJlcyB6dSB1bWdlaGVuLgogICAgcmFjZSA9IHBsLT5fcXVlcnlfcmFjZSgpOwoKICBpZiAoIG1lbWJlciggbW9ycGhfcHJvcGVydGllcywgcHJvcCApID09IDAgKQogICAgcmV0dXJuIHBsLT5RdWVyeSggcHJvcCApOwogIGlmICggY2xvc3VyZXAoIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXSApICkKICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF0sIHJhY2UgKTsKICBpZiAoIG1hcHBpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF0gKSApCiAgewogICAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXSwgcmFjZSApID09IDAgKQogICAgICByZXR1cm4gcGwtPlF1ZXJ5KCBwcm9wICk7CiAgICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF1bIHJhY2UgXSApICkKICAgICAgcmV0dXJuIGZ1bmNhbGwoIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXVsgcmFjZSBdICk7CgogICAgcmV0dXJuIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXVsgcmFjZSBdOwogIH0KICByZXR1cm4gbW9ycGhfcHJvcGVydGllc1sgcHJvcCBdOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgX3F1ZXJ5X2FydGljbGUoKQovLwovLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQVJUSUNMRQovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBfcXVlcnlfYXJ0aWNsZSggLyogdm9pZCAqLyApCnsKICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfQVJUSUNMRSApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgX3F1ZXJ5X2F2ZXJhZ2Vfc2l6ZSgpCi8vCi8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9BVkVSQUdFX1NJWkUKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgX3F1ZXJ5X2F2ZXJhZ2Vfc2l6ZSggLyogdm9pZCAqLyApCnsKICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfQVZFUkFHRV9TSVpFICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBfcXVlcnlfYXZlcmFnZV93ZWlnaHQoKQovLwovLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQVZFUkFHRV9XRUlHSFQKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgX3F1ZXJ5X2F2ZXJhZ2Vfd2VpZ2h0KCAvKiB2b2lkICovICkKewogIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9BVkVSQUdFX1dFSUdIVCApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgX3F1ZXJ5X2JvZHkoKQovLwovLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQk9EWQovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBfcXVlcnlfYm9keSggLyogdm9pZCAqLyApCnsKICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfQk9EWSApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgX3F1ZXJ5X2dlbmRlcigpCi8vCi8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9HRU5ERVIKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgX3F1ZXJ5X2dlbmRlciggLyogdm9pZCAqLyApCnsKICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfR0VOREVSICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBfcXVlcnlfaGFuZHMoKQovLwovLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfSEFORFMKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptaXhlZCBfcXVlcnlfaGFuZHMoIC8qIHZvaWQgKi8gKQp7CiAgcmV0dXJuIF9xdWVyeV9wcm9wZXJ0eSggUF9IQU5EUyApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgX3F1ZXJ5X2lkcygpCi8vCi8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9JRFMgLSBOaWNodC1TdGFuZGFyZCwgZGEgamUgbmFjaCBVcnNwcnVuZ3MtCi8vICAgZ2VzY2hsZWNodCBkZXMgU3BpZWxlcnMgenVz5HR6bGljaGUgaWRzIGbkbGxpZyB3ZXJkZW4uIEFibGF1ZjogRXMgZ2lidAovLyAgIDUgU2Nocml0dGUsIGJlaSBkZXJlbiBqZXdlaWxpZ2VtIFZlcnNhZ2VuIGRpZSBpZHMgZGVzIFNwaWVsZXJzIGR1cmNoLQovLyAgIGdlcmVpY2h0IHdlcmRlbjoKLy8gICAxLiBQX0lEUyBpc3QgaW0gcHJvcGVydHktbWFwcGluZyB2b3JoYW5kZW4KLy8gICAyLiBhKSBlcyBpc3QgZWluIHN0cmluZyBvZGVyIGVpbiBhcnJheTogZXMgd2lyZCBhbiBkaWUgaWRzIGRlcyBTcGllbGVycwovLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KLy8gICAgICBiKSBlcyBpc3QgZWluZSBjbG9zdXJlLiBEaWVzZSB3aXJkIGF1c2dlZvxocnQgdW50ZXIg3GJlcmdhYmUgZGVyCi8vICAgICAgICAgU3BpZWxlci1pZHMsIGRlciBSYXNzZSBkZXMgU3BpZWxlcnMgdW5kIGRlciBHZXNjaGxlY2h0ZXIKLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKLy8gICAgICAgICB3aXJkIGRpcmVrdCB6dXL8Y2tnZWdlYmVuLgovLyAgICAgIGMpIGVzIGlzdCBlaW4gbWFwcGluZy4gSGllciBuZWhtZW4gd2lyIG51biBkYXMg/GJsaWNoZSBSYXNzZW5uYW1lbi0KLy8gICAgICAgICBtYXBwaW5nIGFuIC0+IDMuKQovLyAgIDMuIEb8ciBkaWUgUmFzc2UgZGVzIFNwaWVsZXJzIHdpcmQgZWluIEVpbnRyYWcgZ2VzdWNodAovLyAgICAgIGEpIGVyIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlciB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCi8vICAgICAgICAgYW5nZWjkbmd0IHVuZCB6dXL8Y2tnZWdlYmVuLgovLyAgICAgIGIpIGVyIGlzdCBlaW5lIGNsb3N1cmUuIERpZXNlIHdpcmQgYXVzZ2Vm/GhydCB1bnRlciDcYmVyZ2FiZSBkZXIKLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgovLyAgICAgICAgIChkaWVzZXMgT2JqZWt0cyB1bmQgZGVzIFNwaWVsZXJzKS4gRGVyIEVyZ2Vibmlzd2VydCBkZXIgY2xvc3VyZQovLyAgICAgICAgIHdpcmQgZGlyZWt0IHp1cvxja2dlZ2ViZW4uCi8vICAgICAgYykgZXIgaXN0IGVpbiBtYXBwaW5nLiBFcyB3aXJkIGFuZ2Vub21tZW4sIGRhc3MgamUgR2VzY2hsZWNodCBESUVTRVMKLy8gICAgICAgICBPYmpla3RzIGVpbiBFaW50cmFnIHZvcmhhbmRlbiBpc3QuIC0+IDQuKQovLyAgIDQuIEb8ciBkYXMgR2VzY2hsZWNodCBkaWVzZXMgT2JqZWt0cyB3aXJkIGVpbiBFaW50cmFnIGdlc3VjaHQKLy8gICAgICBhKSBlciBpc3QgZWluIHN0cmluZyBvZGVyIGVpbiBhcnJheTogZXIgd2lyZCBhbiBkaWUgaWRzIGRlcyBTcGllbGVycwovLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KLy8gICAgICBiKSBlciBpc3QgZWluZSBjbG9zdXJlLiBEaWVzZSB3aXJkIGF1c2dlZvxocnQgdW50ZXIg3GJlcmdhYmUgZGVyCi8vICAgICAgICAgU3BpZWxlci1pZHMsIGRlciBSYXNzZSBkZXMgU3BpZWxlcnMgdW5kIGRlciBHZXNjaGxlY2h0ZXIKLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKLy8gICAgICAgICB3aXJkIGRpcmVrdCB6dXL8Y2tnZWdlYmVuLgovLyAgICAgIGMpIGVyIGlzdCBlaW4gbWFwcGluZy4gRXMgd2lyZCBhbmdlbm9tbWVuLCBkYXNzIGplIEdlc2NobGVjaHQgREVTCi8vICAgICAgICAgU3BpZWxlcnMgZWluIEVpbnRyYWcgdm9yaGFuZGVuIGlzdC4gLT4gNS4pCi8vICAgNS4gRvxyIGRhcyBHZXNjaGxlY2h0IGRlcyBTcGllbGVycyB3aXJkIGVpbiBFaW50cmFnIGdlc3VjaHQKLy8gICAgICBhKSBlciBpc3QgZWluIHN0cmluZyBvZGVyIGVpbiBhcnJheTogZXIgd2lyZCBhbiBkaWUgaWRzIGRlcyBTcGllbGVycwovLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KLy8gICAgICBiKSBlciBpc3QgZWluZSBjbG9zdXJlLiBEaWVzZSB3aXJkIGF1c2dlZvxocnQgdW50ZXIg3GJlcmdhYmUgZGVyCi8vICAgICAgICAgU3BpZWxlci1pZHMsIGRlciBSYXNzZSBkZXMgU3BpZWxlcnMgdW5kIGRlciBHZXNjaGxlY2h0ZXIKLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKLy8gICAgICAgICB3aXJkIGRpcmVrdCB6dXL8Y2tnZWdlYmVuLgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1peGVkIF9xdWVyeV9pZHMoIC8qIHZvaWQgKi8gKQp7CiAgc3RyaW5nIHJhY2U7CiAgbWl4ZWQgaWRzOwogIGludCBnZW5kZXIsIHNnZW5kZXI7CgogIC8vIFRlc3QgMS4KICBpZHMgPSBwbC0+UXVlcnkoIFBfSURTICk7CiAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXMsIFBfSURTICkgPT0gMCApCiAgICByZXR1cm4gaWRzOwoKICAvLyBSYXNzZSBob2xlbi4KICBpZiAoIElTX0xFQVJORVIocGwpICkKICAgIHJhY2UgPSAiTWFnaWVyIjsKICBlbHNlIC8vIF9xdWVyeV9yYWNlKCkgaXN0IG5vdHdlbmRpZywgdW0gY2xvc3VyZXMgenUgdW1nZWhlbi4KICAgIHJhY2UgPSBwbC0+X3F1ZXJ5X3JhY2UoKTsKCiAgLy8gR2VzY2hsZWNodGVyIGhvbGVuCiAgZ2VuZGVyID0gX3F1ZXJ5X2dlbmRlcigpOwogIHNnZW5kZXIgPSBwbC0+UXVlcnkoIFBfR0VOREVSICk7CgogIC8vIFRlc3QgMi4KICAvLyBzdHJpbmc/IERhbm4gZWluZmFjaCBkZW4gbm9ybWFsZW4gaWRzIGRhenUsIGdlbmF1c28gbWl0IGFycmF5CiAgaWYgKCBzdHJpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQogICAgcmV0dXJuIGlkcyArICh7IG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF0gfSk7CiAgaWYgKCBwb2ludGVycCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXSApICkKICAgIHJldHVybiBpZHMgKyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdOwogIGlmICggY2xvc3VyZXAoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF0gKSApCiAgICByZXR1cm4gZnVuY2FsbCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXSwgaWRzLCByYWNlLCBnZW5kZXIsIHNnZW5kZXIgKTsKICAvLyBmYWxscyBrZWluIG1hcHBpbmcsIGRhbm4gcmF1cwogIGlmICggIW1hcHBpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQogICAgcmV0dXJuIGlkczsKCiAgLy8gVGVzdCAzLgogIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdLCByYWNlICkgPT0gMCApCiAgICByZXR1cm4gaWRzOwogIGlmICggc3RyaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdICkgKQogICAgcmV0dXJuIGlkcyArICh7IG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXSB9KTsKICBpZiAoIHBvaW50ZXJwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0gKSApCiAgICByZXR1cm4gaWRzICsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdOwogIGlmICggY2xvc3VyZXAoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXSApICkKICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0sIGlkcywgcmFjZSwgZ2VuZGVyLCBzZ2VuZGVyICk7CiAgLy8gZmFsbHMga2VpbiBtYXBwaW5nLCBkYW5uIHJhdXMKICBpZiAoICFtYXBwaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdICkgKQogICAgcmV0dXJuIGlkczsKCiAgLy8gVGVzdCA0LgogIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0sIGdlbmRlciApID09IDAgKQogICAgcmV0dXJuIGlkczsKICBpZiAoIHN0cmluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF0gKSApCiAgICByZXR1cm4gaWRzICsgKHsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSB9KTsKICBpZiAoIHBvaW50ZXJwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdICkgKQogICAgcmV0dXJuIGlkcyArIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF07CiAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdLAoJCSAgICBpZHMsIHJhY2UsIGdlbmRlciwgc2dlbmRlciApOwogIC8vIGZhbGxzIGtlaW4gbWFwcGluZywgZGFubiByYXVzCiAgaWYgKCAhbWFwcGluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF0gKSApCiAgICByZXR1cm4gaWRzOwoKICAvLyBUZXN0IDUuCiAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF0sIHNnZW5kZXIgKSA9PSAwICkKICAgIHJldHVybiBpZHM7CiAgaWYgKCBzdHJpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdWyBzZ2VuZGVyIF0gKSApCiAgICByZXR1cm4gaWRzICsgKHsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXVsgc2dlbmRlciBdIH0pOwogIGlmICggcG9pbnRlcnAoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF1bIHNnZW5kZXIgXSApICkKICAgIHJldHVybiBpZHMgKyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdWyBzZ2VuZGVyIF07CiAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXVsgc2dlbmRlciBdICkgKQogICAgcmV0dXJuIGZ1bmNhbGwoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF1bIHNnZW5kZXIgXSwKCQkgICAgaWRzLCByYWNlLCBnZW5kZXIsIHNnZW5kZXIgKTsKCiAgcmV0dXJuIGlkczsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyAgIF9xdWVyeV9pc19tb3JwaGVkKCkKLy8KLy8gICBQcm9wZXJ0eS1NZXRob2RlIGb8ciAiaXNfbW9ycGhlZCIKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgX3F1ZXJ5X2lzX21vcnBoZWQoIC8qIHZvaWQgKi8gKQp7CiAgcmV0dXJuIDE7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBfcXVlcnlfbWF4X2hhbmRzKCkKLy8KLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX01BWF9IQU5EUwovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBfcXVlcnlfbWF4X2hhbmRzKCAvKiB2b2lkICovICkKewogIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9NQVhfSEFORFMgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyAgIF9xdWVyeV9tbXNnaW4oKQovLwovLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfTU1TR0lOCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RyaW5nIF9xdWVyeV9tbXNnaW4oIC8qIHZvaWQgKi8gKQp7CiAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NTVNHSU4gKSB8fCAiIik7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBfcXVlcnlfbW1zZ291dCgpCi8vCi8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9NTVNHT1VUCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RyaW5nIF9xdWVyeV9tbXNnb3V0KCAvKiB2b2lkICovICkKewogIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfTU1TR09VVCApIHx8ICIiKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyAgIF9xdWVyeV9tc2dpbigpCi8vCi8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9NU0dJTgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0cmluZyBfcXVlcnlfbXNnaW4oIC8qIHZvaWQgKi8gKQp7CiAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NU0dJTiApIHx8ICIiKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyAgIF9xdWVyeV9tc2dvdXQoKQovLwovLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfTVNHT1VUCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RyaW5nIF9xdWVyeV9tc2dvdXQoIC8qIHZvaWQgKi8gKQp7CiAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NU0dPVVQgKSB8fCAiIik7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBfcXVlcnlfbmFtZSgpCi8vCi8vICAgUHJvcGVydHktTWV0aG9kZSBm/HIgUF9OQU1FLiBMZWlkZXIgaXN0IGRpZSBwbGF5ZXItc2hlbGwgc28gZ3JvdHRpZywKLy8gICBkYXNzIPxiZXJhbGwgYW5nZW5vbW1lbiB3aXJkLCBRdWVyeVByb3AoUF9OQU1FKSBsaWVmZXJlIGVpbmVuIFN0cmluZyA6LXwKLy8gICBWb2xsc3TkbmRpZ2VzIFByb3BlcnR5IGRhaGVyIHVudGVyIF9xdWVyeV9uYW1lX2Z1bGwoKS4KLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdHJpbmcgX3F1ZXJ5X25hbWUoIC8qIHZvaWQgKi8gKQp7CiAgbWl4ZWQgcHJvcDsKICBwcm9wID0gX3F1ZXJ5X3Byb3BlcnR5KCBQX05BTUUgKTsKICBpZiAoIHN0cmluZ3AoIHByb3AgKSApCiAgICByZXR1cm4gc3ByaW50ZiggcHJvcCwgcGwtPlF1ZXJ5KCBQX05BTUUgKSApOwogIGlmICggcG9pbnRlcnAoIHByb3AgKSApCiAgICByZXR1cm4gbWFwKCBwcm9wLAoJCSAgICAgIGxhbWJkYSggKHsgJ2VsLCAncyB9KSwKCQkJICAgICAgKHsjJ3NwcmludGYsICdlbCwgJ3N9KSApLAoJCSAgICAgIHBsLT5RdWVyeSggUF9OQU1FICkgKVsgV0VSIF07CiAgcmV0dXJuIHBsLT5RdWVyeSggUF9OQU1FICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBfcXVlcnlfbmFtZV9mdWxsKCkKLy8KLy8gICBQcm9wZXJ0eS1NZXRob2RlIGb8ciAibmFtZV9mdWxsIi4KLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptaXhlZCBfcXVlcnlfbmFtZV9mdWxsKCAvKiB2b2lkICovICkKewogIG1peGVkIHByb3A7CiAgcHJvcCA9IF9xdWVyeV9wcm9wZXJ0eSggUF9OQU1FICk7CiAgaWYgKCBzdHJpbmdwKCBwcm9wICkgKQogICAgcmV0dXJuIHNwcmludGYoIHByb3AsIHBsLT5RdWVyeSggUF9OQU1FICkgKTsKICBpZiAoIHBvaW50ZXJwKCBwcm9wICkgKQogICAgcmV0dXJuIG1hcCggcHJvcCwKCQkgICAgICBsYW1iZGEoICh7ICdlbCwgJ3MgfSksCgkJCSAgICAgICh7IydzcHJpbnRmLCAnZWwsICdzfSkgKSwKCQkgICAgICBwbC0+UXVlcnkoIFBfTkFNRSApICk7CiAgcmV0dXJuIHBsLT5RdWVyeSggUF9OQU1FICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBfcXVlcnlfcHJlc2F5KCkKLy8KLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX1BSRVNBWQovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0cmluZyBfcXVlcnlfcHJlc2F5KCAvKiB2b2lkICovICkKewogIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfUFJFU0FZICkgfHwgIiIpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgX3F1ZXJ5X3JhY2UoKQovLwovLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfUkFDRQovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0cmluZyBfcXVlcnlfcmFjZSggLyogdm9pZCAqLyApCnsKICByZXR1cm4gKHN0cmluZykoX3F1ZXJ5X3Byb3BlcnR5KCBQX1JBQ0UgKSB8fCAiIik7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBfcXVlcnlfcmFjZXN0cmluZygpCi8vCi8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9SQUNFU1RSSU5HCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RyaW5nKiBfcXVlcnlfcmFjZXN0cmluZyggLyogdm9pZCAqLyApCnsKICByZXR1cm4gKHN0cmluZyopX3F1ZXJ5X3Byb3BlcnR5KCBQX1JBQ0VTVFJJTkcgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyAgIF9xdWVyeV9zaXplKCkKLy8KLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX1NJWkUKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgX3F1ZXJ5X3NpemUoIC8qIHZvaWQgKi8gKQp7CiAgcmV0dXJuIChpbnQpX3F1ZXJ5X3Byb3BlcnR5KCBQX1NJWkUgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyAgIF9xdWVyeV90aXRsZSgpCi8vCi8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9USVRMRQovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0cmluZyBfcXVlcnlfdGl0bGUoIC8qIHZvaWQgKi8gKQp7CiAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9USVRMRSApIHx8ICIiKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyAgIF9xdWVyeV93ZWlnaHQoKQovLwovLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfV0VJR0hUCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IF9xdWVyeV93ZWlnaHQoIC8qIHZvaWQgKi8gKQp7CiAgcmV0dXJuIChpbnQpKF9xdWVyeV9wcm9wZXJ0eSggUF9XRUlHSFQgKSB8fCAiIik7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBpZCggVGV4dCwgTGV2ZWwpCi8vCi8vICAgRGllIElkZW50aWZpemllcnVuZyBzcGlubnQgbWl0IFBfTkFNRS1BcnJheXMKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2YXJhcmdzIGludCBpZCggc3RyaW5nIHN0ciwgaW50IGx2bCApCnsKICBzdHJpbmcgcGxuYW1lOwoKICBpZiAoIHBsLT5RdWVyeVByb3AoIFBfR0hPU1QgKSApCiAgICBpZiAoIHN0ciA9PSAiZ2Vpc3QiICkKICAgICAgcmV0dXJuIDE7CiAgICBlbHNlIGlmICggKCBzc2NhbmYoIHN0ciwgImdlaXN0IHZvbiAlcyIsIHBsbmFtZSApID09IDEgKSAmJgoJICAgICAgcGwtPmlkKCBwbG5hbWUgKSApCiAgICAgIHJldHVybiAxOwogICAgZWxzZSBpZiAoICggc3NjYW5mKCBzdHIsICJnZWlzdCAlcyIsIHBsbmFtZSApID09IDEgKSAmJgoJICAgICAgcGwtPmlkKCBwbG5hbWUgKSApCiAgICAgIHJldHVybiAxOwoKICByZXR1cm4gcGwtPmlkKCBzdHIsIGx2bCApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgbG9uZygpCi8vCi8vICAgRGllIExhbmdiZXNjaHJlaWJ1bmcgaW0gU3BpZWxlciBoYWRlcnQgbWl0IGRlbSBHZXNjaGxlY2h0IE5FVVRFUi4uLgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZhcmFyZ3Mgc3RyaW5nIGxvbmcoIC8qIHZvaWQgKi8gKQp7CiAgc3RyaW5nIHNsb25nOwogIHNsb25nID0gcGwtPmxvbmcoKTsKCiAgaWYgKCBfcXVlcnlfZ2VuZGVyKCkgPT0gTkVVVEVSICkKICB7CiAgICBzdHJpbmcgKmFsb25nOwogICAgaW50IGk7CgogICAgLy8gYWxsZSBFci1zIHVuZCBlci1zIHN1Y2hlbi4uLgogICAgYWxvbmcgPSByZWdleHBsb2RlKCBzbG9uZywgIlxcPFtFZV1yXFw+IiApOwogICAgLy8gLi4uIHVuZCBkYXMgciBkdXJjaCBlaW4gcyBlcnNldHplbi4KICAgIGZvciAoIGkgPSAxIDsgaSA8IHNpemVvZiggYWxvbmcgKSA7IGkgKz0gMiApCiAgICAgIGFsb25nWyBpIF1bIDEgXSA9ICdzJzsKICAgIHNsb25nID0gaW1wbG9kZSggYWxvbmcsICIiICk7CiAgfQoKICByZXR1cm4gc2xvbmc7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gICBzaG9ydCgpCi8vCi8vICAgRGllIEt1cnpiZXNjaHJlaWJ1bmcgaW0gU3BpZWxlciBoYXQgZWluIFByb2JsZW0gbWl0IFBfTkFNRS1BcnJheXMKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdHJpbmcgc2hvcnQoIC8qIHZvaWQgKi8gKQp7CiAgbWl4ZWQgbmFtZXM7CiAgc3RyaW5nIGFuc3dlcjsKICBzdHJpbmcgdGl0bGU7CgogIGlmICggcGwtPlF1ZXJ5UHJvcCggUF9JTlZJUyApICkKICAgIGlmICggaW50ZXJhY3RpdmUoIHByZXZpb3VzX29iamVjdCgpICkgJiYKCSBJU19MRUFSTklORyggcHJldmlvdXNfb2JqZWN0KCkgKSApCiAgICAgIHJldHVybiAiKCIgKyBwbC0+UXVlcnkoIFBfTkFNRSApICsgIikgXG4iOwogICAgZWxzZQogICAgICByZXR1cm4gKHN0cmluZykwOwoKICBuYW1lcyA9IF9xdWVyeV9uYW1lX2Z1bGwoKTsKICBpZiAoIHN0cmluZ3AoIG5hbWVzICkgKQogICAgbmFtZXMgPSAoeyBuYW1lcywgbmFtZXMsIG5hbWVzLCBuYW1lcyB9KTsKCiAgaWYgKCBwbC0+UXVlcnlQcm9wKCBQX0dIT1NUICkgKQogICAgYW5zd2VyID0gIkRlciBHZWlzdCAiICsgcGwtPlF1ZXJ5QXJ0aWNsZSggV0VTU0VOLCAwICkgKyBuYW1lc1sgV0VTU0VOIF07CiAgZWxzZQogICAgYW5zd2VyID0gcGwtPlF1ZXJ5QXJ0aWNsZSggV0VSLCAwICkgKyBuYW1lc1sgV0VSIF07CiAgaWYgKCAoIHRpdGxlID0gcGwtPlF1ZXJ5UHJvcCggUF9USVRMRSApICkgJiYKICAgICAgICggdGl0bGUgIT0gIiIgKSApCiAgICAgYW5zd2VyICs9ICIgIiArIHRpdGxlOwogIGlmICggIWludGVyYWN0aXZlKCBwbCApICkKICAgICBhbnN3ZXIgKz0gIiAobmV0enRvdCkiOwogIHJldHVybiBjYXBpdGFsaXplKCBhbnN3ZXIgKSArICIuXG4iOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vICAgcmVtb3ZlKCBTY2huYXV6ZSApCi8vCi8vICAgYXVmcuR1bWVuCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdmFyYXJncyBpbnQgcmVtb3ZlKCBpbnQgc2lsZW50ICkKewogIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CiAgcmV0dXJuIDE7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAtLSBFTkRFIC0tCg==