LyoKICogQ29weXJpZ2h0IDE5OTggSnVlcmdlbiBTY2htaWVkCiAqIENvcHlyaWdodCAyMDAzIE1hcmNlbG8gRHVhcnRlCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19ERUZBVUxUCgpNRU5VXzAwMSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglNRU5VSVRFTSAizWNvbmVzICZncmFuZGVzIiwJRkNJRE1fU0hWSUVXX0JJR0lDT04KCU1FTlVJVEVNICLNY29uZXMgJnBlcXVlbm9zIiwJRkNJRE1fU0hWSUVXX1NNQUxMSUNPTgoJTUVOVUlURU0gIiZMaXN0YSIsCQlGQ0lETV9TSFZJRVdfTElTVFZJRVcKCU1FTlVJVEVNICImRGV0YWxoZXMiLAkJRkNJRE1fU0hWSUVXX1JFUE9SVFZJRVcKRU5ECgovKgogc2hlbGx2aWV3IGJhY2tncm91bmQgbWVudQoqLwpNRU5VXzAwMiBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCSAgUE9QVVAgIiZFeGliaXIiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIs1jb25lcyAmZ3JhbmRlcyIsCUZDSURNX1NIVklFV19CSUdJQ09OCgkgICAgTUVOVUlURU0gIs1jb25lcyAmcGVxdWVub3MiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCgkgICAgTUVOVUlURU0gIiZMaXN0YSIsCQlGQ0lETV9TSFZJRVdfTElTVFZJRVcKCSAgICBNRU5VSVRFTSAiJkRldGFsaGVzIiwJRkNJRE1fU0hWSUVXX1JFUE9SVFZJRVcKCSAgRU5ECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBQT1BVUCAiTyZyZ2FuaXphciDtY29uZXMiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIlBvciAmbm9tZSIsCTB4MzAJLyogY29sdW1uIDAgKi8KCSAgICBNRU5VSVRFTSAiUG9yICZ0aXBvIiwJMHgzMgkvKiBjb2x1bW4gMiAqLwoJICAgIE1FTlVJVEVNICJQb3IgdGEmbWFuaG8iLAkweDMxCS8qIC4uLiAqLwoJICAgIE1FTlVJVEVNICJQb3IgJmRhdGEiLAkweDMzCgkgICAgTUVOVUlURU0gU0VQQVJBVE9SCgkgICAgTUVOVUlURU0gIkF1dG8gb3JnYW5pJnphciIsCUZDSURNX1NIVklFV19BVVRPQVJSQU5HRQoJICBFTkQKCSAgTUVOVUlURU0gIkFsaW4maGFyIO1jb25lcyIsCUZDSURNX1NIVklFV19TTkFQVE9HUklECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiJkF0dWFsaXphciIsCQlGQ0lETV9TSFZJRVdfUkVGUkVTSAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIkNvJmxhciIsCQlGQ0lETV9TSFZJRVdfSU5TRVJUCgkgIE1FTlVJVEVNICJDb2xhciBhJnRhbGhvIiwJRkNJRE1fU0hWSUVXX0lOU0VSVExJTksKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIFBPUFVQICJOb3ZvIgoJICBCRUdJTgoJICAgIE1FTlVJVEVNICImUGFzdGEiLAlGQ0lETV9TSFZJRVdfTkVXRk9MREVSCgkgICAgTUVOVUlURU0gIiZBdGFsaG8iLAlGQ0lETV9TSFZJRVdfTkVXTElOSwoJICAgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBFTkQKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICJQcm9wcmllZGFkZXMiLAlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKLyoKIHNoZWxsdmlldyBpdGVtIG1lbnUKKi8KTUVOVV9TSFZfRklMRSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCSAgTUVOVUlURU0gIiZFeHBsb3JhciIsCQlGQ0lETV9TSFZJRVdfRVhQTE9SRQoJICBNRU5VSVRFTSAiQSZicmlyIiwJCUZDSURNX1NIVklFV19PUEVOCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiQyZvcnRhciIsCQlGQ0lETV9TSFZJRVdfQ1VUCgkgIE1FTlVJVEVNICImQ29waWFyIiwJCUZDSURNX1NIVklFV19DT1BZCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiQ3JpYXIgYSZ0YWxobyIsCUZDSURNX1NIVklFV19DUkVBVEVMSU5LCgkgIE1FTlVJVEVNICJFJnhjbHVpciIsCQlGQ0lETV9TSFZJRVdfREVMRVRFCgkgIE1FTlVJVEVNICImUmVub21lYXIiLAkJRkNJRE1fU0hWSUVXX1JFTkFNRQoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIiZQcm9wcmllZGFkZXMiLAlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKU0hCUlNGT1JGT0xERVJfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMTg4LCAxOTIKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgRFNfTU9EQUxGUkFNRSB8IERTX1NFVEZPTlQgfCBEU18zRExPT0sKQ0FQVElPTiAiUHJvY3VyYXIgcGFzdGEiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogREVGUFVTSEJVVFRPTiAiT0siLCAxLCA4MCwgMTc2LCA1MCwgMTIsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKIFBVU0hCVVRUT04gIkNhbmNlbGFyIiwgMiwgMTM0LCAxNzYsIDUwLCAxMiwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCiBMVEVYVCAiIiwgSUREX1RJVExFLCA0LCA0LCAxODAsIDEyCiBMVEVYVCAiIiwgSUREX1NUQVRVUywgNCwgMjUsIDE4MCwgMTIKIENPTlRST0wgIiIsIElERF9UUkVFVklFVywgIlN5c1RyZWVWaWV3MzIiLAogCVRWU19IQVNCVVRUT05TIHwgVFZTX0hBU0xJTkVTIHwgVFZTX0xJTkVTQVRST09UIHwKCVdTX0JPUkRFUiB8IFdTX1RBQlNUT1AsCgk0LCA0MCwgMTgwLCAxMjAKfQoKU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIlNvYnJlICVzIgpGT05UIDEwLCAiTVMgU2hlbGwgRGxnIgp7CiBERUZQVVNIQlVUVE9OICJPSyIsIElET0ssIDE1MywgMTMzLCA1MCwgMTIsIFdTX1RBQlNUT1AKIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgogSUNPTiAiIiwgMTA4OCwgMTAsIDEwLCAxNCwgMTYKIExURVhUICIiLCAxMDAsIDMwLCAxMCwgMTM3LCAxMAogTFRFWFQgIiIsIDEwMSwgMzAsIDIyLCAxMzcsIDEwCiBMVEVYVCAiV2luZSBmb2kgZGlzcG9uaWJpbGl6YWRvIHBvcjoiLCA5OCwgOCwgNTUsIDEzNywgMTAKfQoKU0hFTExfUlVOX0RMRyBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAwLCAwLCAyMjcsIDk1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogSUNPTiAiIiwgMTIyOTcsIDcsIDExLCAxOCwgMjAsIFdTX1ZJU0lCTEUKIExURVhUICJEaWdpdGUgbyBub21lIGRvIHByb2dyYW1hLCBwYXN0YSwgZG9jdW1lbnRvLCBvdSBlbmRlcmXnbyBJbnRlcm5ldCwgcXVlIG8gV2luZSBpcuEgYWJy7S1sbyBwYXJhIHZvY+ouIiwgMTIyODksIDM2LCAxMSwgMTgyLCAxOAogTFRFWFQgIiZBYnJpcjoiLCAxMjMwNSwgNywgMzksIDI0LCAxMAogQ09OVFJPTCAiIiwgMTIyOTgsICJDT01CT0JPWCIsIFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZTQ1JPTEwgfCBXU19WSVNJQkxFIHwgQ0JTX0RJU0FCTEVOT1NDUk9MTCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19EUk9QRE9XTiwgMzYsIDM3LCAxODMsIDEwMAogREVGUFVTSEJVVFRPTiAiT0siLCBJRE9LLCA2MiwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiAiQ2FuY2VsYXIiLCBJRENBTkNFTCwgMTE2LCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICImUHJvY3VyYXIuLi4iLCAxMjI4OCwgMTcwLCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgICAgICAvKiBjb2x1bW5zIGluIHRoZSBzaGVsbHZpZXcgKi8KCUlEU19TSFZfQ09MVU1OMQkJIkFycXVpdm8iCglJRFNfU0hWX0NPTFVNTjIJCSJUYW1hbmhvIgoJSURTX1NIVl9DT0xVTU4zCQkiVGlwbyIKCUlEU19TSFZfQ09MVU1ONAkJIk1vZGlmaWNhZG8iCglJRFNfU0hWX0NPTFVNTjUJCSJBdHJpYnV0b3MiCglJRFNfU0hWX0NPTFVNTjYJCSJUYW1hbmhvIgoJSURTX1NIVl9DT0xVTU43CQkiRGlzcG9u7XZlbCIKCUlEU19TSFZfQ09MVU1OOAkJIk5vbWUiCglJRFNfU0hWX0NPTFVNTjkJCSJDb21lbnThcmlvcyIKCUlEU19TSFZfQ09MVU1OMTAJIkRvbm8iCglJRFNfU0hWX0NPTFVNTjExCSJHcnVwbyIKCiAgICAgICAgLyogc3BlY2lhbCBmb2xkZXJzICovCglJRFNfREVTS1RPUAkJIsFyZWEgZGUgdHJhYmFsaG8iCglJRFNfTVlDT01QVVRFUgkJIk1ldSBjb21wdXRhZG9yIgoKICAgICAgICAvKiBjb250ZXh0IG1lbnVzICovCglJRFNfVklFV19MQVJHRQkJIs1jb25lcyAmZ3JhbmRlcyIKCUlEU19WSUVXX1NNQUxMCQkizWNvbmVzICZwZXF1ZW5vcyIKCUlEU19WSUVXX0xJU1QJCSImTGlzdGEiCglJRFNfVklFV19ERVRBSUxTCSImRGV0YWxoZXMiCglJRFNfU0VMRUNUCQkiU2VsZWNpb25hciIKCUlEU19PUEVOCQkiQWJyaXIiCgoJSURTX0NSRUFURUZPTERFUl9ERU5JRUQgIk7jbyBwb2RlIGNyaWFyIG5vdmEgcGFzdGE6IFBlcm1pc3PjbyBuZWdhZGEuIgoJSURTX0NSRUFURUZPTERFUl9DQVBUSU9OICJFcnJvIGR1cmFudGUgYSBjcmlh5+NvIGRhIG5vdmEgcGFzdGEiCglJRFNfREVMRVRFSVRFTV9DQVBUSU9OICJDb25maXJtYXIgZXhjbHVz428gZGUgYXJxdWl2byIKCUlEU19ERUxFVEVGT0xERVJfQ0FQVElPTiAiQ29uZmlybWFyIGV4Y2x1c+NvIGRlIHBhc3RhIgoJSURTX0RFTEVURUlURU1fVEVYVCAiVm9j6iB0ZW0gY2VydGV6YSBxdWUgZGVzZWphIGV4Y2x1aXIgJyUxJz8iCglJRFNfREVMRVRFTVVMVElQTEVfVEVYVCAiVm9j6iB0ZW0gY2VydGV6YSBxdWUgZGVzZWphIGV4Y2x1aXIgZXN0ZXMgJTEgaXRlbnM/IgoJSURTX09WRVJXUklURUZJTEVfVEVYVCAiU29icmVlc2NyZXZlciBhcnF1aXZvICUxPyIKCUlEU19PVkVSV1JJVEVGSUxFX0NBUFRJT04gIkNvbmZpcm1hciBzb2JyZWVzY3JldmVyIGFycXVpdm8iCgogICAgICAgIC8qIG1lc3NhZ2UgYm94IHN0cmluZ3MgKi8KCUlEU19SRVNUQVJUX1RJVExFICAgICAgICJSZWluaWNpYXIiCglJRFNfUkVTVEFSVF9QUk9NUFQgICAgICAiVm9j6iBxdWVyIHNpbXVsYXIgYSByZWluaWNpYWxpemHn428gZG8gV2luZG93cz8iCglJRFNfU0hVVERPV05fVElUTEUgICAgICAiRGVzbGlnYXIiCglJRFNfU0hVVERPV05fUFJPTVBUICAgICAiVm9j6iBxdWVyIGZpbmFsaXphciBhIHNlc3PjbyBubyBXaW5lPyIKCiAgICAgICAgLyogc2hlbGwgZm9sZGVyIHBhdGggZGVmYXVsdCB2YWx1ZXMgKi8KCUlEU19QUk9HUkFNUyAgICAgICAgICAgICAgICAiTWVudSBJbmljaWFyXFxQcm9ncmFtYXMiCglJRFNfUEVSU09OQUwgICAgICAgICAgICAgICAgIk1ldXMgRG9jdW1lbnRvcyIKCUlEU19GQVZPUklURVMgICAgICAgICAgICAgICAiRmF2b3JpdG9zIgoJSURTX1NUQVJUVVAgICAgICAgICAgICAgICAgICJNZW51IEluaWNpYXJcXFByb2dyYW1hc1xcSW5pY2lhciIKCUlEU19SRUNFTlQgICAgICAgICAgICAgICAgICAiUmVjZW50IgoJSURTX1NFTkRUTyAgICAgICAgICAgICAgICAgICJTZW5kVG8iCglJRFNfU1RBUlRNRU5VICAgICAgICAgICAgICAgIk1lbnUgSW5pY2lhciIKCUlEU19NWU1VU0lDICAgICAgICAgICAgICAgICAiTWluaGFzIE36c2ljYXMiCglJRFNfTVlWSURFTyAgICAgICAgICAgICAgICAgIk1ldXMgVu1kZW9zIgoJSURTX0RFU0tUT1BESVJFQ1RPUlkgICAgICAgICJEZXNrdG9wIgoJSURTX05FVEhPT0QgICAgICAgICAgICAgICAgICJOZXRIb29kIgoJSURTX1RFTVBMQVRFUyAgICAgICAgICAgICAgICJUZW1wbGF0ZXMiCglJRFNfQVBQREFUQSAgICAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIERhdGEiCglJRFNfUFJJTlRIT09EICAgICAgICAgICAgICAgIlByaW50SG9vZCIKCUlEU19MT0NBTF9BUFBEQVRBICAgICAgICAgICAiQ29uZmlndXJh5/VlcyBsb2NhaXNcXERhZG9zIGRlIGFwbGljYXRpdm9zIgoJSURTX0lOVEVSTkVUX0NBQ0hFICAgICAgICAgICJDb25maWd1cmHn9WVzIGxvY2Fpc1xcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzIgoJSURTX0NPT0tJRVMgICAgICAgICAgICAgICAgICJDb29raWVzIgoJSURTX0hJU1RPUlkgICAgICAgICAgICAgICAgICJDb25maWd1cmHn9WVzIGxvY2Fpc1xcSGlzdPNyaWNvIgoJSURTX1BST0dSQU1fRklMRVMgICAgICAgICAgICJBcnF1aXZvcyBkZSBwcm9ncmFtYXMiCglJRFNfTVlQSUNUVVJFUyAgICAgICAgICAgICAgIk1pbmhhcyBJbWFnZW5zIgoJSURTX1BST0dSQU1fRklMRVNfQ09NTU9OICAgICJBcnF1aXZvcyBkZSBwcm9ncmFtYXNcXEFycXVpdm9zIGNvbXVucyIKCUlEU19DT01NT05fRE9DVU1FTlRTICAgICAgICAiRG9jdW1lbnRvcyIKCUlEU19BRE1JTlRPT0xTICAgICAgICAgICAgICAiTWVudSBJbmljaWFyXFxQcm9ncmFtYXNcXEZlcnJhbWVudGFzIEFkbWluaXN0cmF0aXZhcyIKCUlEU19DT01NT05fTVVTSUMgICAgICAgICAgICAiRG9jdW1lbnRvc1xcTWluaGFzIE36c2ljYXMiCglJRFNfQ09NTU9OX1BJQ1RVUkVTICAgICAgICAgIkRvY3VtZW50b3NcXE1pbmhhcyBJbWFnZW5zIgoJSURTX0NPTU1PTl9WSURFTyAgICAgICAgICAgICJEb2N1bWVudG9zXFxNZXVzIFbtZGVvcyIKCUlEU19DREJVUk5fQVJFQSAgICAgICAgICAgICAiQ29uZmlndXJh5/VlcyBsb2NhaXNcXERhZG9zIGRlIGFwbGljYXRpdm9zXFxNaWNyb3NvZnRcXENEIEJ1cm5pbmciCn0K