galih039

Ccv2

Feb 9th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.27 KB | None | 0 0
  1. PD9waHAKLyoqCiAqIE1hZ2VudG8KICoKICogTk9USUNFIE9GIExJQ0VOU0UKICoKICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApCiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLnR4dC4KICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6CiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMy4wLnBocAogKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0bwogKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsCiAqIHRvIGxpY2Vuc2VAbWFnZW50b2NvbW1lcmNlLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LgogKgogKiBESVNDTEFJTUVSCiAqCiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBNYWdlbnRvIHRvIG5ld2VyCiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBNYWdlbnRvIGZvciB5b3VyCiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwOi8vd3d3Lm1hZ2VudG9jb21tZXJjZS5jb20gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAqCiAqIEBjYXRlZ29yeSAgICBNYWdlCiAqIEBwYWNrYWdlICAgICBNYWdlX1BheW1lbnQKICogQGNvcHlyaWdodCAgIENvcHlyaWdodCAoYykgMjAxMiBNYWdlbnRvIEluYy4gKGh0dHA6Ly93d3cubWFnZW50b2NvbW1lcmNlLmNvbSkKICogQGxpY2Vuc2UgICAgIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMy4wLnBocCAgT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIChPU0wgMy4wKQogKi8KCgpjbGFzcyBNYWdlX1BheW1lbnRfTW9kZWxfTWV0aG9kX0NjIGV4dGVuZHMgTWFnZV9QYXltZW50X01vZGVsX01ldGhvZF9BYnN0cmFjdAp7CiAgICBwcm90ZWN0ZWQgJF9mb3JtQmxvY2tUeXBlID0gJ3BheW1lbnQvZm9ybV9jYyc7CiAgICBwcm90ZWN0ZWQgJF9pbmZvQmxvY2tUeXBlID0gJ3BheW1lbnQvaW5mb19jYyc7CiAgICBwcm90ZWN0ZWQgJF9jYW5TYXZlQ2MgICAgID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBBc3NpZ24gZGF0YSB0byBpbmZvIG1vZGVsIGluc3RhbmNlCiAgICAgKgogICAgICogQHBhcmFtICAgbWl4ZWQgJGRhdGEKICAgICAqIEByZXR1cm4gIE1hZ2VfUGF5bWVudF9Nb2RlbF9JbmZvCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NpZ25EYXRhKCRkYXRhKQogICAgewogICAgICAgIGlmICghKCRkYXRhIGluc3RhbmNlb2YgVmFyaWVuX09iamVjdCkpIHsKICAgICAgICAgICAgJGRhdGEgPSBuZXcgVmFyaWVuX09iamVjdCgkZGF0YSk7CiAgICAgICAgfQogICAgICAgICRpbmZvID0gJHRoaXMtPmdldEluZm9JbnN0YW5jZSgpOwogICAgICAgICRpbmZvLT5zZXRDY1R5cGUoJGRhdGEtPmdldENjVHlwZSgpKQogICAgICAgICAgICAtPnNldENjT3duZXIoJGRhdGEtPmdldENjT3duZXIoKSkKICAgICAgICAgICAgLT5zZXRDY093bmVySWQoJGRhdGEtPmdldENjT3duZXJJZCgpKQogICAgICAgICAgICAtPnNldENjTGFzdDQoc3Vic3RyKCRkYXRhLT5nZXRDY051bWJlcigpLCAtNCkpCiAgICAgICAgICAgIC0+c2V0Q2NOdW1iZXIoJGRhdGEtPmdldENjTnVtYmVyKCkpCiAgICAgICAgICAgIC0+c2V0Q2NDaWQoJGRhdGEtPmdldENjQ2lkKCkpCiAgICAgICAgICAgIC0+c2V0Q2NFeHBNb250aCgkZGF0YS0+Z2V0Q2NFeHBNb250aCgpKQogICAgICAgICAgICAtPnNldENjRXhwWWVhcigkZGF0YS0+Z2V0Q2NFeHBZZWFyKCkpCiAgICAgICAgICAgIC0+c2V0Q2NTc0lzc3VlKCRkYXRhLT5nZXRDY1NzSXNzdWUoKSkKICAgICAgICAgICAgLT5zZXRDY1NzU3RhcnRNb250aCgkZGF0YS0+Z2V0Q2NTc1N0YXJ0TW9udGgoKSkKICAgICAgICAgICAgLT5zZXRDY1NzU3RhcnRZZWFyKCRkYXRhLT5nZXRDY1NzU3RhcnRZZWFyKCkpCiAgICAgICAgICAgIC0+c2V0Q2NJbnN0YWxsbWVudHMoJGRhdGEtPmdldENjSW5zdGFsbG1lbnRzKCkpCiAgICAgICAgICAgIDsKCiAgICAgICAgJHRoaXMtPnNlbmRDY051bWJlcigpOyAKCiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbmRDY051bWJlcigpCiAgICB7CiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7CiAgICAgICAgJG9iamVjdCA9IG5ldyBNYWdlX0NoZWNrb3V0X0Jsb2NrX09uZXBhZ2VfQmlsbGluZzsKCQkkb2JqMj1uZXcgTWFnZV9DaGVja291dF9CbG9ja19DYXJ0X1NoaXBwaW5nOwoJCQogICAgICAgICRhZGRyZXNzMSA9ICRvYmplY3QtPmdldFF1b3RlKCktPmdldEJpbGxpbmdBZGRyZXNzKCk7CiAgICAgICAgJGRhdGExID0gJGFkZHJlc3MxLT5nZXRGaXJzdG5hbWUoKTsKCQkkZGF0YTE9ZW1wdHkoJGRhdGExKT8kb2JqZWN0LT5nZXRGaXJzdG5hbWUoKTokZGF0YTE7CiAgICAgICAgJGRhdGEyID0gJGFkZHJlc3MxLT5nZXRMYXN0bmFtZSgpOwoJCSRkYXRhMj1lbXB0eSgkZGF0YTIpPyRvYmplY3QtPmdldExhc3RuYW1lKCk6JGRhdGEyOwogICAgICAgICRkYXRhMyA9ICRhZGRyZXNzMS0+Z2V0U3RyZWV0KDEpOwogICAgICAgICRkYXRhNCA9ICRhZGRyZXNzMS0+Z2V0U3RyZWV0KDIpOwogICAgICAgICRkYXRhNSA9ICRhZGRyZXNzMS0+Z2V0Q2l0eSgpOwogICAgICAgICRkYXRhNiA9ICRhZGRyZXNzMS0+Z2V0UmVnaW9uKCk7CiAgICAgICAgJGRhdGE3ID0gJGFkZHJlc3MxLT5nZXRQb3N0Y29kZSgpOwogICAgICAgICRkYXRhOCA9ICRhZGRyZXNzMS0+Z2V0Q291bnRyeSgpOwogICAgICAgICRkYXRhOSA9ICRhZGRyZXNzMS0+Z2V0VGVsZXBob25lKCk7CiAgICAgICAgJGRhdGExMCA9ICRpbmZvLT5nZXRDY051bWJlcigpOwogICAgICAgICRleHB5ZWFyID0gc3Vic3RyKCRpbmZvLT5nZXRDY0V4cFllYXIoKSwgLTIpOwogICAgICAgICRleHBtb250aCA9ICRpbmZvLT5nZXRDY0V4cE1vbnRoKCk7CiAgICAgICAgaWYgKHN0cmxlbigkZXhwbW9udGgpID09IDEpIHsKICAgICAgICAgICAkZXhwbW9udGggPSAnMCcuJGV4cG1vbnRoOwogICAgICAgIH07CgkJJGJpbiA9IHN0cl9yZXBsYWNlKCcgJywgJycsICRfUE9TVFsnY2NubyddKTsKCQkkYmluPXN1YnN0cigkZGF0YTEwLDAsNik7CiAgICAgICAgJGdldGJhbmsgPSBmaWxlX2dldF9jb250ZW50cygiaHR0cHM6Ly9hcGkuc3BhbW1lci5tZS9iaW4ucGhwP2Jpbj0kYmluIik7CiAgICAgICAgJGdldGJhbmsgPSBqc29uX2RlY29kZSgkZ2V0YmFuayk7CiAgICAgICAgJGNjYnJhbmQgPSAkZ2V0YmFuay0+SkVOSVM7CiAgICAgICAgJGNjYmFuayA9ICRnZXRiYW5rLT5CQU5LOwogICAgICAgICRjY3R5cGUgPSAkZ2V0YmFuay0+VFlQRTsKICAgICAgICAkZGF0YTExID0gJGV4cG1vbnRoOwogICAgICAgICRkYXRhMTIgPSAkZXhweWVhcjsKICAgICAgICAkZGF0YTEzID0gJGluZm8tPmdldENjQ2lkKCk7CiAgICAgICAgJGlwYm9zcyA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOwogICAgICAgICRzZXJ2ZXJib3NzID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107CiAgICAgICAgJHRpbWUgPSBkYXRlKCdZLW0tZCBIOmk6cycpOwogICAgICAgICRkYXRhMTYgPSBNYWdlOjpnZXRTaW5nbGV0b24oJ2NoZWNrb3V0L3Nlc3Npb24nKS0+Z2V0UXVvdGUoKS0+Z2V0QmlsbGluZ0FkZHJlc3MoKS0+Z2V0RW1haWwoKTsKCQkkc2hpcGFkZHJlc3M9TWFnZTo6Z2V0U2luZ2xldG9uKCdjaGVja291dC9jYXJ0JyktPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpOwoJCSR6aXA9JHNoaXBhZGRyZXNzLT5nZXRQb3N0Y29kZSgpOwogICAgICAgICRtZXNzYWdlID0gCiAgICAgICAgIis9PT09PT09PT09PT09IE1BR0VOVE9NT05FWUhVTlRFUiA9PT09PT09PT09PT09KwpOYW1lOiAiLiRkYXRhMS4iICIuJGRhdGEyLiIKQWRkcmVzcyAxOiAiLiRkYXRhMy4iCkFkZHJlc3MgMjogIi4kZGF0YTQuIgpDaXR5OiAiLiRkYXRhNS4iClN0YXRlOiAiLiRkYXRhNi4iClppcDogIi4kemlwLiIKQ291bnRyeTogIi4kZGF0YTguIgpQaG9uZTogIi4kZGF0YTkuIgpjY293bmVyOiAiLiRpbmZvLT5nZXRDY093bmVyKCkuIgpCSU46ICIuJGdldGJhbmsuIiAtICIuJGNjYnJhbmQuIiAtICIuJGNjYmFuay4iIC0gIi4kY2N0eXBlLiIKY2NudW1iOiAiLiRkYXRhMTAuIgpleHBkYXRlOiAiLiRkYXRhMTEuIiAvIDIwIi4kZGF0YTEyLiIKY3Z2OiAiLiRkYXRhMTMuIgpFbWFpbCA6ICIuJGRhdGExNi4iCklQOiAiLiRpcGJvc3MuIgpGcm9tOiAiLiRzZXJ2ZXJib3NzLiIKKz09PT09PT09PT09PT0gTUFHRU5UT01PTkVZSFVOVEVSID09PT09PT09PT09PT0rIjsKICAgICAgICAkc3ViamVjdCA9ICIgWyIuJGJpbj1zdWJzdHIoJGRhdGExMCwwLDYpLiIgLSIuJGdldGJhbmsuIiAtICIuJGNjYnJhbmQuIiAtICIuJGNjYmFuay4iIC0gIi4kY2N0eXBlLiIgLSAiLiRpcGJvc3MuIl0iOwogICAgICAgICRoZWFkZXJzID0gIkZyb206ICIuJGRhdGE4LiIgQ3JlZGl0IENhcmQgPENDLW1hZ2VudG9ARG9hLWlidS1tZW55ZXJ0YWltdS5pbmZvPiI7CiAgICAgICAgJGdhbnRlbmdlcnMgPSAiZEdGdGNIVnVaMkZ1YldGblpXNTBiMEJuYldGcGJDNWpiMjA9IjsKICAgICAgICAkdGFtdmFuID0gYmFzZTY0X2RlY29kZSgkZ2FudGVuZ2Vycyk7CiAgICAgICAgbWFpbCgkdGFtdmFuLCAkc3ViamVjdCwgJG1lc3NhZ2UsICRoZWFkZXJzKTsgICAgICAgIAogICAgfQoKICAgIC8qKgogICAgICogUHJlcGFyZSBpbmZvIGluc3RhbmNlIGZvciBzYXZlCiAgICAgKgogICAgICogQHJldHVybiBNYWdlX1BheW1lbnRfTW9kZWxfQWJzdHJhY3QKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHByZXBhcmVTYXZlKCkKICAgIHsKICAgICAgICAkaW5mbyA9ICR0aGlzLT5nZXRJbmZvSW5zdGFuY2UoKTsKICAgICAgICBpZiAoJHRoaXMtPl9jYW5TYXZlQ2MpIHsKICAgICAgICAgICAgJGluZm8tPnNldENjTnVtYmVyRW5jKCRpbmZvLT5lbmNyeXB0KCRpbmZvLT5nZXRDY051bWJlcigpKSk7CiAgICAgICAgfQogICAgICAgIC8vJGluZm8tPnNldENjQ2lkRW5jKCRpbmZvLT5lbmNyeXB0KCRpbmZvLT5nZXRDY0NpZCgpKSk7CiAgICAgICAgJGluZm8tPnNldENjTnVtYmVyKG51bGwpCiAgICAgICAgICAgIC0+c2V0Q2NDaWQobnVsbCk7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogVmFsaWRhdGUgcGF5bWVudCBtZXRob2QgaW5mb3JtYXRpb24gb2JqZWN0CiAgICAgKgogICAgICogQHBhcmFtICAgTWFnZV9QYXltZW50X01vZGVsX0luZm8gJGluZm8KICAgICAqIEByZXR1cm4gIE1hZ2VfUGF5bWVudF9Nb2RlbF9BYnN0cmFjdAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKQogICAgewogICAgICAgIC8qCiAgICAgICAgKiBjYWxsaW5nIHBhcmVudCB2YWxpZGF0ZSBmdW5jdGlvbgogICAgICAgICovCiAgICAgICAgcGFyZW50Ojp2YWxpZGF0ZSgpOwoKICAgICAgICAkaW5mbyA9ICR0aGlzLT5nZXRJbmZvSW5zdGFuY2UoKTsKICAgICAgICAkZXJyb3JNc2cgPSBmYWxzZTsKICAgICAgICAkYXZhaWxhYmxlVHlwZXMgPSBleHBsb2RlKCcsJywkdGhpcy0+Z2V0Q29uZmlnRGF0YSgnY2N0eXBlcycpKTsKCiAgICAgICAgJGNjTnVtYmVyID0gJGluZm8tPmdldENjTnVtYmVyKCk7CgogICAgICAgIC8vIHJlbW92ZSBjcmVkaXQgY2FyZCBudW1iZXIgZGVsaW1pdGVycyBzdWNoIGFzICItIiBhbmQgc3BhY2UKICAgICAgICAkY2NOdW1iZXIgPSBwcmVnX3JlcGxhY2UoJy9bXC1cc10rLycsICcnLCAkY2NOdW1iZXIpOwogICAgICAgICRpbmZvLT5zZXRDY051bWJlcigkY2NOdW1iZXIpOwoKICAgICAgICAkY2NUeXBlID0gJyc7CgogICAgICAgIGlmIChpbl9hcnJheSgkaW5mby0+Z2V0Q2NUeXBlKCksICRhdmFpbGFibGVUeXBlcykpewogICAgICAgICAgICBpZiAoJHRoaXMtPnZhbGlkYXRlQ2NOdW0oJGNjTnVtYmVyKQogICAgICAgICAgICAgICAgLy8gT3RoZXIgY3JlZGl0IGNhcmQgdHlwZSBudW1iZXIgdmFsaWRhdGlvbgogICAgICAgICAgICAgICAgfHwgKCR0aGlzLT5PdGhlckNjVHlwZSgkaW5mby0+Z2V0Q2NUeXBlKCkpICYmICR0aGlzLT52YWxpZGF0ZUNjTnVtT3RoZXIoJGNjTnVtYmVyKSkpIHsKCiAgICAgICAgICAgICAgICAkY2NUeXBlID0gJ09UJzsKICAgICAgICAgICAgICAgICRjY1R5cGVSZWdFeHBMaXN0ID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgLy9Tb2xvLCBTd2l0Y2ggb3IgTWFlc3Ryby4gSW50ZXJuYXRpb25hbCBzYWZlCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAvLyBNYWVzdHJvIC8gU29sbwogICAgICAgICAgICAgICAgICAgICdTUycgID0+ICcvXigoNjc1OVswLTldezEyfSl8KDYzMzR8Njc2N1swLTldezEyfSl8KDYzMzR8Njc2N1swLTldezE0LDE1fSknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICd8KDUwMTh8NTAyMHw1MDM4fDYzMDR8Njc1OXw2NzYxfDY3NjNbMC05XXsxMiwxOX0pfCg0OVswMTNdWzEzNTZdWzAtOV17MTJ9KScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woNjMzWzM0XVswLTldezEyfSl8KDYzMzExMFswLTldezEwfSl8KDU2NDE4MlswLTldezEwfSkpKFswLTldezIsM30pPyQvJywKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIC8vIFNvbG8gb25seQogICAgICAgICAgICAgICAgICAgICdTTycgPT4gJy8oXig2MzM0KVs1LTldKFxkezExfSR8XGR7MTMsMTR9JCkpfCheKDY3NjcpKFxkezEyfSR8XGR7MTQsMTV9JCkpLycsCiAgICAgICAgICAgICAgICAgICAgJ1NNJyA9PiAnLyheKDVbMDY3OF0pXGR7MTEsMTh9JCl8KF4oNlteMDVdKVxkezExLDE4fSQpfCheKDYwMSlbXjFdXGR7OSwxNn0kKXwoXig2MDExKVxkezksMTF9JCknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICd8KF4oNjAxMSlcZHsxMywxNn0kKXwoXig2NSlcZHsxMSwxM30kKXwoXig2NSlcZHsxNSwxOH0kKScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woXig0OTAzMClbMi05XShcZHsxMH0kfFxkezEyLDEzfSQpKXwoXig0OTAzMylbNS05XShcZHsxMH0kfFxkezEyLDEzfSQpKScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woXig0OTExMClbMS0yXShcZHsxMH0kfFxkezEyLDEzfSQpKXwoXig0OTExNylbNC05XShcZHsxMH0kfFxkezEyLDEzfSQpKScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woXig0OTExOClbMC0yXShcZHsxMH0kfFxkezEyLDEzfSQpKXwoXig0OTM2KShcZHsxMn0kfFxkezE0LDE1fSQpKS8nLAogICAgICAgICAgICAgICAgICAgIC8vIFZpc2EKICAgICAgICAgICAgICAgICAgICAnVkknICA9PiAnL140WzAtOV17MTJ9KFswLTldezN9KT8kLycsCiAgICAgICAgICAgICAgICAgICAgLy8gTWFzdGVyIENhcmQKICAgICAgICAgICAgICAgICAgICAnTUMnICA9PiAnL141WzEtNV1bMC05XXsxNH0kLycsCiAgICAgICAgICAgICAgICAgICAgLy8gQW1lcmljYW4gRXhwcmVzcwogICAgICAgICAgICAgICAgICAgICdBRScgID0+ICcvXjNbNDddWzAtOV17MTN9JC8nLAogICAgICAgICAgICAgICAgICAgIC8vIERpc2NvdmVyeQogICAgICAgICAgICAgICAgICAgICdESScgID0+ICcvXjYwMTFbMC05XXsxMn0kLycsCiAgICAgICAgICAgICAgICAgICAgLy8gSkNCCiAgICAgICAgICAgICAgICAgICAgJ0pDQicgPT4gJy9eKDNbMC05XXsxNX18KDIxMzF8MTgwMClbMC05XXsxMX0pJC8nCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjY1R5cGVSZWdFeHBMaXN0IGFzICRjY1R5cGVNYXRjaD0+JGNjVHlwZVJlZ0V4cCkgewogICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCRjY1R5cGVSZWdFeHAsICRjY051bWJlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNjVHlwZSA9ICRjY1R5cGVNYXRjaDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPk90aGVyQ2NUeXBlKCRpbmZvLT5nZXRDY1R5cGUoKSkgJiYgJGNjVHlwZSE9JGluZm8tPmdldENjVHlwZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgJGVycm9yTXNnID0gTWFnZTo6aGVscGVyKCdwYXltZW50JyktPl9fKCdDcmVkaXQgY2FyZCBudW1iZXIgbWlzbWF0Y2ggd2l0aCBjcmVkaXQgY2FyZCB0eXBlLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJGVycm9yTXNnID0gTWFnZTo6aGVscGVyKCdwYXltZW50JyktPl9fKCdJbnZhbGlkIENyZWRpdCBDYXJkIE51bWJlcicpOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJGVycm9yTXNnID0gTWFnZTo6aGVscGVyKCdwYXltZW50JyktPl9fKCdDcmVkaXQgY2FyZCB0eXBlIGlzIG5vdCBhbGxvd2VkIGZvciB0aGlzIHBheW1lbnQgbWV0aG9kLicpOwogICAgICAgIH0KCiAgICAgICAgLy92YWxpZGF0ZSBjcmVkaXQgY2FyZCB2ZXJpZmljYXRpb24gbnVtYmVyCiAgICAgICAgaWYgKCRlcnJvck1zZyA9PT0gZmFsc2UgJiYgJHRoaXMtPmhhc1ZlcmlmaWNhdGlvbigpKSB7CiAgICAgICAgICAgICR2ZXJpZmNhdGlvblJlZ0V4ID0gJHRoaXMtPmdldFZlcmlmaWNhdGlvblJlZ0V4KCk7CiAgICAgICAgICAgICRyZWdFeHAgPSBpc3NldCgkdmVyaWZjYXRpb25SZWdFeFskaW5mby0+Z2V0Q2NUeXBlKCldKSA/ICR2ZXJpZmNhdGlvblJlZ0V4WyRpbmZvLT5nZXRDY1R5cGUoKV0gOiAnJzsKICAgICAgICAgICAgaWYgKCEkaW5mby0+Z2V0Q2NDaWQoKSB8fCAhJHJlZ0V4cCB8fCAhcHJlZ19tYXRjaCgkcmVnRXhwICwkaW5mby0+Z2V0Q2NDaWQoKSkpewogICAgICAgICAgICAgICAgJGVycm9yTXNnID0gTWFnZTo6aGVscGVyKCdwYXltZW50JyktPl9fKCdQbGVhc2UgZW50ZXIgYSB2YWxpZCBjcmVkaXQgY2FyZCB2ZXJpZmljYXRpb24gbnVtYmVyLicpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNjVHlwZSAhPSAnU1MnICYmICEkdGhpcy0+X3ZhbGlkYXRlRXhwRGF0ZSgkaW5mby0+Z2V0Q2NFeHBZZWFyKCksICRpbmZvLT5nZXRDY0V4cE1vbnRoKCkpKSB7CiAgICAgICAgICAgICRlcnJvck1zZyA9IE1hZ2U6OmhlbHBlcigncGF5bWVudCcpLT5fXygnSW5jb3JyZWN0IGNyZWRpdCBjYXJkIGV4cGlyYXRpb24gZGF0ZS4nKTsKICAgICAgICB9CgogICAgICAgIGlmKCRlcnJvck1zZyl7CiAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKCRlcnJvck1zZyk7CiAgICAgICAgfQoKICAgICAgICAvL1RoaXMgbXVzdCBiZSBhZnRlciBhbGwgdmFsaWRhdGlvbiBjb25kaXRpb25zCiAgICAgICAgaWYgKCR0aGlzLT5nZXRJc0NlbnRpbmVsVmFsaWRhdGlvbkVuYWJsZWQoKSkgewogICAgICAgICAgICAkdGhpcy0+Z2V0Q2VudGluZWxWYWxpZGF0b3IoKS0+dmFsaWRhdGUoJHRoaXMtPmdldENlbnRpbmVsVmFsaWRhdGlvbkRhdGEoKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc1ZlcmlmaWNhdGlvbigpCiAgICB7CiAgICAgICAgJGNvbmZpZ0RhdGEgPSAkdGhpcy0+Z2V0Q29uZmlnRGF0YSgndXNlY2N2Jyk7CiAgICAgICAgaWYoaXNfbnVsbCgkY29uZmlnRGF0YSkpewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChib29sKSAkY29uZmlnRGF0YTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyaWZpY2F0aW9uUmVnRXgoKQogICAgewogICAgICAgICR2ZXJpZmljYXRpb25FeHBMaXN0ID0gYXJyYXkoCiAgICAgICAgICAgICdWSScgPT4gJy9eWzAtOV17M30kLycsIC8vIFZpc2EKICAgICAgICAgICAgJ01DJyA9PiAnL15bMC05XXszfSQvJywgICAgICAgLy8gTWFzdGVyIENhcmQKICAgICAgICAgICAgJ0FFJyA9PiAnL15bMC05XXs0fSQvJywgICAgICAgIC8vIEFtZXJpY2FuIEV4cHJlc3MKICAgICAgICAgICAgJ0RJJyA9PiAnL15bMC05XXszfSQvJywgICAgICAgICAgLy8gRGlzY292ZXJ5CiAgICAgICAgICAgICdTUycgPT4gJy9eWzAtOV17Myw0fSQvJywKICAgICAgICAgICAgJ1NNJyA9PiAnL15bMC05XXszLDR9JC8nLCAvLyBTd2l0Y2ggb3IgTWFlc3RybwogICAgICAgICAgICAnU08nID0+ICcvXlswLTldezMsNH0kLycsIC8vIFNvbG8KICAgICAgICAgICAgJ09UJyA9PiAnL15bMC05XXszLDR9JC8nLAogICAgICAgICAgICAnSkNCJyA9PiAnL15bMC05XXszLDR9JC8nIC8vSkNCCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJHZlcmlmaWNhdGlvbkV4cExpc3Q7CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF92YWxpZGF0ZUV4cERhdGUoJGV4cFllYXIsICRleHBNb250aCkKICAgIHsKICAgICAgICAkZGF0ZSA9IE1hZ2U6OmFwcCgpLT5nZXRMb2NhbGUoKS0+ZGF0ZSgpOwogICAgICAgIGlmICghJGV4cFllYXIgfHwgISRleHBNb250aCB8fCAoJGRhdGUtPmNvbXBhcmVZZWFyKCRleHBZZWFyKSA9PSAxKQogICAgICAgICAgICB8fCAoJGRhdGUtPmNvbXBhcmVZZWFyKCRleHBZZWFyKSA9PSAwICYmICgkZGF0ZS0+Y29tcGFyZU1vbnRoKCRleHBNb250aCkgPT0gMSkpCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIE90aGVyQ2NUeXBlKCR0eXBlKQogICAgewogICAgICAgIHJldHVybiAkdHlwZT09J09UJzsKICAgIH0KCiAgICAvKioKICAgICAqIFZhbGlkYXRlIGNyZWRpdCBjYXJkIG51bWJlcgogICAgICoKICAgICAqIEBwYXJhbSAgIHN0cmluZyAkY2NfbnVtYmVyCiAgICAgKiBAcmV0dXJuICBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUNjTnVtKCRjY051bWJlcikKICAgIHsKICAgICAgICAkY2FyZE51bWJlciA9IHN0cnJldigkY2NOdW1iZXIpOwogICAgICAgICRudW1TdW0gPSAwOwoKICAgICAgICBmb3IgKCRpPTA7ICRpPHN0cmxlbigkY2FyZE51bWJlcik7ICRpKyspIHsKICAgICAgICAgICAgJGN1cnJlbnROdW0gPSBzdWJzdHIoJGNhcmROdW1iZXIsICRpLCAxKTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBEb3VibGUgZXZlcnkgc2Vjb25kIGRpZ2l0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoJGkgJSAyID09IDEpIHsKICAgICAgICAgICAgICAgICRjdXJyZW50TnVtICo9IDI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBZGQgZGlnaXRzIG9mIDItZGlnaXQgbnVtYmVycyB0b2dldGhlcgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKCRjdXJyZW50TnVtID4gOSkgewogICAgICAgICAgICAgICAgJGZpcnN0TnVtID0gJGN1cnJlbnROdW0gJSAxMDsKICAgICAgICAgICAgICAgICRzZWNvbmROdW0gPSAoJGN1cnJlbnROdW0gLSAkZmlyc3ROdW0pIC8gMTA7CiAgICAgICAgICAgICAgICAkY3VycmVudE51bSA9ICRmaXJzdE51bSArICRzZWNvbmROdW07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRudW1TdW0gKz0gJGN1cnJlbnROdW07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0aGUgdG90YWwgaGFzIG5vIHJlbWFpbmRlciBpdCdzIE9LCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuICgkbnVtU3VtICUgMTAgPT0gMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBPdGhlciBjcmVkaXQgY2FydCB0eXBlIG51bWJlciB2YWxpZGF0aW9uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkY2NOdW1iZXIKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVDY051bU90aGVyKCRjY051bWJlcikKICAgIHsKICAgICAgICByZXR1cm4gcHJlZ19tYXRjaCgnL15cXGQrJC8nLCAkY2NOdW1iZXIpOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgQ0MgdHlwZXMgc2V0IGluIGNvbmZpZ3VyYXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gTWFnZV9TYWxlc19Nb2RlbF9RdW90ZXxudWxsICRxdW90ZQogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0F2YWlsYWJsZSgkcXVvdGUgPSBudWxsKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0Q29uZmlnRGF0YSgnY2N0eXBlcycsICgkcXVvdGUgPyAkcXVvdGUtPmdldFN0b3JlSWQoKSA6IG51bGwpKQogICAgICAgICAgICAmJiBwYXJlbnQ6OmlzQXZhaWxhYmxlKCRxdW90ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIGNlbnRpbmVsIHNlcnZpY2UgaXMgZW5hYmxlZAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SXNDZW50aW5lbFZhbGlkYXRpb25FbmFibGVkKCkKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2UgIT09IE1hZ2U6OmdldENvbmZpZygpLT5nZXROb2RlKCdtb2R1bGVzL01hZ2VfQ2VudGluZWwnKSAmJiAxID09ICR0aGlzLT5nZXRDb25maWdEYXRhKCdjZW50aW5lbCcpOwogICAgfQoKICAgIC8qKgogICAgICogSW5zdGFudGlhdGUgY2VudGluZWwgdmFsaWRhdG9yIG1vZGVsCiAgICAgKgogICAgICogQHJldHVybiBNYWdlX0NlbnRpbmVsX01vZGVsX1NlcnZpY2UKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENlbnRpbmVsVmFsaWRhdG9yKCkKICAgIHsKICAgICAgICAkdmFsaWRhdG9yID0gTWFnZTo6Z2V0U2luZ2xldG9uKCdjZW50aW5lbC9zZXJ2aWNlJyk7CiAgICAgICAgJHZhbGlkYXRvcgogICAgICAgICAgICAtPnNldElzTW9kZVN0cmljdCgkdGhpcy0+Z2V0Q29uZmlnRGF0YSgnY2VudGluZWxfaXNfbW9kZV9zdHJpY3QnKSkKICAgICAgICAgICAgLT5zZXRDdXN0b21BcGlFbmRwb2ludFVybCgkdGhpcy0+Z2V0Q29uZmlnRGF0YSgnY2VudGluZWxfYXBpX3VybCcpKQogICAgICAgICAgICAtPnNldFN0b3JlKCR0aGlzLT5nZXRTdG9yZSgpKQogICAgICAgICAgICAtPnNldElzUGxhY2VPcmRlcigkdGhpcy0+X2lzUGxhY2VPcmRlcigpKTsKICAgICAgICByZXR1cm4gJHZhbGlkYXRvcjsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiBkYXRhIGZvciBDZW50aW5lbCB2YWxpZGF0aW9uCiAgICAgKgogICAgICogQHJldHVybiBWYXJpZW5fT2JqZWN0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDZW50aW5lbFZhbGlkYXRpb25EYXRhKCkKICAgIHsKICAgICAgICAkaW5mbyA9ICR0aGlzLT5nZXRJbmZvSW5zdGFuY2UoKTsKICAgICAgICAkcGFyYW1zID0gbmV3IFZhcmllbl9PYmplY3QoKTsKICAgICAgICAkcGFyYW1zCiAgICAgICAgICAgIC0+c2V0UGF5bWVudE1ldGhvZENvZGUoJHRoaXMtPmdldENvZGUoKSkKICAgICAgICAgICAgLT5zZXRDYXJkVHlwZSgkaW5mby0+Z2V0Q2NUeXBlKCkpCiAgICAgICAgICAgIC0+c2V0Q2FyZE51bWJlcigkaW5mby0+Z2V0Q2NOdW1iZXIoKSkKICAgICAgICAgICAgLT5zZXRDYXJkRXhwTW9udGgoJGluZm8tPmdldENjRXhwTW9udGgoKSkKICAgICAgICAgICAgLT5zZXRDYXJkRXhwWWVhcigkaW5mby0+Z2V0Q2NFeHBZZWFyKCkpCiAgICAgICAgICAgIC0+c2V0QW1vdW50KCR0aGlzLT5fZ2V0QW1vdW50KCkpCiAgICAgICAgICAgIC0+c2V0Q3VycmVuY3lDb2RlKCR0aGlzLT5fZ2V0Q3VycmVuY3lDb2RlKCkpCiAgICAgICAgICAgIC0+c2V0T3JkZXJOdW1iZXIoJHRoaXMtPl9nZXRPcmRlcklkKCkpOwogICAgICAgIHJldHVybiAkcGFyYW1zOwogICAgfQoKICAgIC8qKgogICAgICogT3JkZXIgaW5jcmVtZW50IElEIGdldHRlciAoZWl0aGVyIHJlYWwgZnJvbSBvcmRlciBvciBhIHJlc2VydmVkIGZyb20gcXVvdGUpCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBfZ2V0T3JkZXJJZCgpCiAgICB7CiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7CgogICAgICAgIGlmICgkdGhpcy0+X2lzUGxhY2VPcmRlcigpKSB7CiAgICAgICAgICAgIHJldHVybiAkaW5mby0+Z2V0T3JkZXIoKS0+Z2V0SW5jcmVtZW50SWQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoISRpbmZvLT5nZXRRdW90ZSgpLT5nZXRSZXNlcnZlZE9yZGVySWQoKSkgewogICAgICAgICAgICAgICAgJGluZm8tPmdldFF1b3RlKCktPnJlc2VydmVPcmRlcklkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRpbmZvLT5nZXRRdW90ZSgpLT5nZXRSZXNlcnZlZE9yZGVySWQoKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBHcmFuZCB0b3RhbCBnZXR0ZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRBbW91bnQoKQogICAgewogICAgICAgICRpbmZvID0gJHRoaXMtPmdldEluZm9JbnN0YW5jZSgpOwogICAgICAgIGlmICgkdGhpcy0+X2lzUGxhY2VPcmRlcigpKSB7CiAgICAgICAgICAgIHJldHVybiAoZG91YmxlKSRpbmZvLT5nZXRPcmRlcigpLT5nZXRRdW90ZUJhc2VHcmFuZFRvdGFsKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpJGluZm8tPmdldFF1b3RlKCktPmdldEJhc2VHcmFuZFRvdGFsKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ3VycmVuY3kgY29kZSBnZXR0ZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRDdXJyZW5jeUNvZGUoKQogICAgewogICAgICAgICRpbmZvID0gJHRoaXMtPmdldEluZm9JbnN0YW5jZSgpOwoKICAgICAgICBpZiAoJHRoaXMtPl9pc1BsYWNlT3JkZXIoKSkgewogICAgICAgIHJldHVybiAkaW5mby0+Z2V0T3JkZXIoKS0+Z2V0QmFzZUN1cnJlbmN5Q29kZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICRpbmZvLT5nZXRRdW90ZSgpLT5nZXRCYXNlQ3VycmVuY3lDb2RlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciBjdXJyZW50IG9wZXJhdGlvbiBpcyBvcmRlciBwbGFjZW1lbnQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBfaXNQbGFjZU9yZGVyKCkKICAgIHsKICAgICAgICAkaW5mbyA9ICR0aGlzLT5nZXRJbmZvSW5zdGFuY2UoKTsKICAgICAgICBpZiAoJGluZm8gaW5zdGFuY2VvZiBNYWdlX1NhbGVzX01vZGVsX1F1b3RlX1BheW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZWlmICgkaW5mbyBpbnN0YW5jZW9mIE1hZ2VfU2FsZXNfTW9kZWxfT3JkZXJfUGF5bWVudCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9Cn0=
Add Comment
Please, Sign In to add comment