LyoKICogQ29weXJpZ2h0IDE5OTggSnVlcmdlbiBTY2htaWVkCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfSkFQQU5FU0UsIFNVQkxBTkdfREVGQVVMVAoKTUVOVV8wMDEgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgoJTUVOVUlURU0gIpHlgquCyLGyut0oJkcpIiwJRkNJRE1fU0hWSUVXX0JJR0lDT04KCU1FTlVJVEVNICKPrIKzgsixsrrdKCZNKSIsCUZDSURNX1NIVklFV19TTUFMTElDT04KCU1FTlVJVEVNICKI6peXKCZMKSIsCQlGQ0lETV9TSFZJRVdfTElTVFZJRVcKCU1FTlVJVEVNICKP2o3XKCZEKSIsCQlGQ0lETV9TSFZJRVdfUkVQT1JUVklFVwpFTkQKCk1FTlVfMDAyIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KCVBPUFVQIiIKCUJFR0lOCgkgIFBPUFVQICKVXFyOpigmVikiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIpHlgquCooNBg0ODUoOTKCZHKSIsCUZDSURNX1NIVklFV19CSUdJQ09OCgkgICAgTUVOVUlURU0gIo+sgrOCooNBg0ODUoOTKCZNKSIsCUZDSURNX1NIVklFV19TTUFMTElDT04KCSAgICBNRU5VSVRFTSAiiOqXlygmTCkiLAkJRkNJRE1fU0hWSUVXX0xJU1RWSUVXCgkgICAgTUVOVUlURU0gIo/ajdcoJkQpIiwJRkNJRE1fU0hWSUVXX1JFUE9SVFZJRVcKCSAgRU5ECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBQT1BVUCAig0GDQ4NSg5OCzJCul/EoJkkpIgoJICBCRUdJTgoJICAgIE1FTlVJVEVNICKWvJFPj4coJk4pIiwJMHgzMAkvKiBjb2x1bW4gMCAqLwoJICAgIE1FTlVJVEVNICKO7Zfej4coJlQpIiwJMHgzMgkvKiBjb2x1bW4gMiAqLwoJICAgIE1FTlVJVEVNICKDVINDg1mPhygmUykiLAkweDMxCS8qIC4uLiAqLwoJICAgIE1FTlVJVEVNICKT+pV0j4coJkQpIiwJMHgzMwoJICAgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICAgIE1FTlVJVEVNICKDQYNDg1KDk4LMjqmTrpCul/EoJkEpIiwJRkNJRE1fU0hWSUVXX0FVVE9BUlJBTkdFCgkgIEVORAoJICBNRU5VSVRFTSAik5mK1Ip1gsmQrpfxIiwJRkNJRE1fU0hWSUVXX1NOQVBUT0dSSUQKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICKTXFyC6JV0gq8iLAkJRkNJRE1fU0hWSUVXX0lOU0VSVAoJICBNRU5VSVRFTSAig1aDh4Fbg2eDSoNig2eCzJNcXILolXSCryIsCUZDSURNX1NIVklFV19JTlNFUlRMSU5LCgkgIFBPUFVQICKQVotLjeyQrCIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAikFaLS4N0g0iDi4NfKCZGKSIsCTB4NzA1MwoJICAgIE1FTlVJVEVNICKQVotLg1aDh4Fbg2eDSoNig2coJkwpIiwJMHg3MDUyCgkgICAgTUVOVUlURU0gU0VQQVJBVE9SCQoJICBFTkQKCSAgTUVOVUlURU0gIoN2g42DcINlg0IiLAkJRkNJRE1fU0hWSUVXX1BST1BFUlRJRVMKCUVORApFTkQKCk1FTlVfU0hWX0ZJTEUgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgoJUE9QVVAiIgoJQkVHSU4KCSAgTUVOVUlURU0gIpDYguiO5oLoKCZVKSIsCQlGQ0lETV9TSFZJRVdfQ1VUCgkgIE1FTlVJVEVNICKDUoNzgVsoJkMpIiwJRkNJRE1fU0hWSUVXX0NPUFkKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICKDVoOHgVuDZ4NKg2KDZ4LMjeyQrCgmTCkiLAkweDcwNTEKCSAgTUVOVUlURU0gIo3tj5woJkQpIiwJRkNJRE1fU0hWSUVXX0RFTEVURQoJICBNRU5VSVRFTSAilryRT4LMlc+NWCgmUikiLAkweDcwNTAKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICKDdoONg3CDZYNCKCZQKSIsCUZDSURNX1NIVklFV19QUk9QRVJUSUVTCglFTkQKRU5ECgovKgoJc3BlY2lhbCBmb2xkZXJzCiovClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKCUlEU19ERVNLVE9QCQkiw969uMSvzN8iCglJRFNfTVlDT01QVVRFUgkJIs+yut3L362wwCIKfQoKLyoKCWNvbnRleHQgbWVudXMKKi8KU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewoJSURTX1ZJRVdfTEFSR0UJCSKR5YKrgqKDQYNDg1KDkygmRykiCglJRFNfVklFV19TTUFMTAkJIo+sgrOCooNBg0ODUoOTKCZNKSIKCUlEU19WSUVXX0xJU1QJCSKI6peXKCZMKSIKCUlEU19WSUVXX0RFVEFJTFMJIo/ajdcoJkQpIgoJSURTX1NFTEVDVAkJIpFJkfAiCglJRFNfT1BFTgkJIopKgq0iCn0KClNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDIxMCwgMTUyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIlcyCCyYLCgqKCxCIKRk9OVCAxMCwgIkhlbHYiCnsKIERFRlBVU0hCVVRUT04gIk9LIiwgSURPSywgMTUzLCAxMzAsIDUwLCAxMgogTElTVEJPWCA5OSwgOCwgNjUsIDEzNywgODIsIExCU19OT1RJRlkgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCiBJQ09OICIiLCAxMDg4LCAxODksIDEwLCAxNCwgMTYKIExURVhUICIiLCAxMDAsIDgsIDEwLCAxMzcsIDMzCiBMVEVYVCAiV2luZSB3YXMgYnJvdWdodCB0byB5b3UgYnk6IiwgOTgsIDgsIDU1LCAxMzcsIDEwCn0KCi8qCWNvbHVtbnMgaW4gdGhlIHNoZWxsdmlldwkqLwpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQpCRUdJTgoJSURTX1NIVl9DT0xVTU4xCQkilryRTyIKCUlEU19TSFZfQ09MVU1OMgkJIoNUg0ODWSIKCUlEU19TSFZfQ09MVU1OMwkJIoN0g0CDQ4OLgsyO7ZfeIgoJSURTX1NIVl9DT0xVTU40CQkijViQVpP6jp4iCglJRFNfU0hWX0NPTFVNTjUJCSKRrpCrIgoJSURTX1NIVl9DT0xVTU42CQkijYeMdoNUg0ODWSIKCUlEU19TSFZfQ09MVU1ONwkJIovzgquXZZfKIgpFTkQK