LyoKICogQ29weXJpZ2h0IDIwMDUgQWxleGFuZGVyIE4uIFP4cm5lcyA8YWxleEB0aGVoYW5kb2ZhZ29ueS5jb20+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfTk9SV0VHSUFOLCBTVUJMQU5HX05PUldFR0lBTl9CT0tNQUwKCk1FTlVfMDAxIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KCU1FTlVJVEVNICImU3RvcmUgaWtvbmVyIiwJRkNJRE1fU0hWSUVXX0JJR0lDT04KCU1FTlVJVEVNICImU23lIGlrb25lciIsCUZDSURNX1NIVklFV19TTUFMTElDT04KCU1FTlVJVEVNICImTGlzdGUiLAkJRkNJRE1fU0hWSUVXX0xJU1RWSUVXCglNRU5VSVRFTSAiJkRldGFsamVyIiwJCUZDSURNX1NIVklFV19SRVBPUlRWSUVXCkVORAoKLyoKIHNoZWxsdmlldyBiYWNrZ3JvdW5kIG1lbnUKKi8KTUVOVV8wMDIgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgoJUE9QVVAgIiIKCUJFR0lOCgkgIFBPUFVQICImVmlzIgoJICBCRUdJTgoJICAgIE1FTlVJVEVNICImU3RvcmUgaWtvbmVyIiwJRkNJRE1fU0hWSUVXX0JJR0lDT04KCSAgICBNRU5VSVRFTSAiUyZt5SBpa29uZXIiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCgkgICAgTUVOVUlURU0gIiZMaXN0ZSIsCQlGQ0lETV9TSFZJRVdfTElTVFZJRVcKCSAgICBNRU5VSVRFTSAiJkRldGFsamVyIiwJRkNJRE1fU0hWSUVXX1JFUE9SVFZJRVcKCSAgRU5ECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBQT1BVUCAiT3JkbmUgJmlrb25lciIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAiRXR0ZXIgJm5hdm4iLAkweDMwCS8qIGNvbHVtbiAwICovCgkgICAgTUVOVUlURU0gIkV0dGVyICZ0eXBlIiwJMHgzMgkvKiBjb2x1bW4gMiAqLwoJICAgIE1FTlVJVEVNICJFdHRlciAmc3T4cnJlbHNlIiwJMHgzMQkvKiAuLi4gKi8KCSAgICBNRU5VSVRFTSAiRXR0ZXIgJmRhdG8iLAkweDMzCgkgICAgTUVOVUlURU0gU0VQQVJBVE9SCgkgICAgTUVOVUlURU0gIk9yZG5lICZhdXRvbWF0aXNrIiwJRkNJRE1fU0hWSUVXX0FVVE9BUlJBTkdFCgkgIEVORAoJICBNRU5VSVRFTSAiU3RpbGwgb3BwIGlrb25lciIsCUZDSURNX1NIVklFV19TTkFQVE9HUklECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiT3BwZGF0ZXIiLAkJRkNJRE1fU0hWSUVXX1JFRlJFU0gKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICJMaW0gaW5uIiwJCUZDSURNX1NIVklFV19JTlNFUlQKCSAgTUVOVUlURU0gIkxpbSBpbm4gc29tIHNuYXJ2ZWkiLAlGQ0lETV9TSFZJRVdfSU5TRVJUTElOSwoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgUE9QVVAgIk55IgoJICBCRUdJTgoJICAgIE1FTlVJVEVNICJOeSAmbWFwcGUiLAlGQ0lETV9TSFZJRVdfTkVXRk9MREVSCgkgICAgTUVOVUlURU0gIk55ICZzbmFydmVpIiwJRkNJRE1fU0hWSUVXX05FV0xJTksKCSAgICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgRU5ECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiRWdlbnNrYXBlciIsCUZDSURNX1NIVklFV19QUk9QRVJUSUVTCglFTkQKRU5ECgovKgogc2hlbGx2aWV3IGl0ZW0gbWVudQoqLwpNRU5VX1NIVl9GSUxFIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KCVBPUFVQICIiCglCRUdJTgoJICBNRU5VSVRFTSAiJlV0Zm9yc2siLAkJRkNJRE1fU0hWSUVXX0VYUExPUkUKCSAgTUVOVUlURU0gIibFcG5lIiwJCUZDSURNX1NIVklFV19PUEVOCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiS2xpcHAgJnV0IiwJCUZDSURNX1NIVklFV19DVVQKCSAgTUVOVUlURU0gIiZLb3BpZXIiLAkJRkNJRE1fU0hWSUVXX0NPUFkKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICImT3BwcmV0dCBzbmFydmVpIiwJRkNJRE1fU0hWSUVXX0NSRUFURUxJTksKCSAgTUVOVUlURU0gIiZTbGV0dCIsCQlGQ0lETV9TSFZJRVdfREVMRVRFCgkgIE1FTlVJVEVNICImR2kgbnl0dCBuYXZuIiwJCUZDSURNX1NIVklFV19SRU5BTUUKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICJFZ2Vuc2thJnBlciIsCUZDSURNX1NIVklFV19QUk9QRVJUSUVTCglFTkQKRU5ECgpTSEJSU0ZPUkZPTERFUl9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMTUsIDQwLCAxODgsIDE5MgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBEU19NT0RBTEZSQU1FIHwgRFNfU0VURk9OVCB8IERTXzNETE9PSwpDQVBUSU9OICJCbGEgZXR0ZXIgbWFwcGUiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogREVGUFVTSEJVVFRPTiAiT0siLCAxLCA4MCwgMTc2LCA1MCwgMTIsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKIFBVU0hCVVRUT04gIkF2YnJ5dCIsIDIsIDEzNCwgMTc2LCA1MCwgMTIsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogTFRFWFQgIiIsIElERF9USVRMRSwgNCwgNCwgMTgwLCAxMgogTFRFWFQgIiIsIElERF9TVEFUVVMsIDQsIDI1LCAxODAsIDEyCiBDT05UUk9MICIiLCBJRERfVFJFRVZJRVcsICJTeXNUcmVlVmlldzMyIiwKIAlUVlNfSEFTQlVUVE9OUyB8IFRWU19IQVNMSU5FUyB8IFRWU19MSU5FU0FUUk9PVCB8CglXU19CT1JERVIgfCBXU19UQUJTVE9QLAoJNCwgNDAsIDE4MCwgMTIwCn0KClNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDIxMCwgMTUyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJPbSAlcyIKRk9OVCAxMCwgIk1TIFNoZWxsIERsZyIKewogREVGUFVTSEJVVFRPTiAiT0siLCBJRE9LLCAxNTMsIDEzMywgNTAsIDEyLCBXU19UQUJTVE9QCiBMSVNUQk9YIDk5LCA4LCA2NSwgMTM3LCA4MiwgTEJTX05PVElGWSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKIElDT04gIiIsIDEwODgsIDEwLCAxMCwgMTQsIDE2CiBMVEVYVCAiIiwgMTAwLCAzMCwgMTAsIDEzNywgMTAKIExURVhUICIiLCAxMDEsIDMwLCAyMiwgMTM3LCAxMAogTFRFWFQgIldpbmUgZXIgbGFnZXQgYXYiLCA5OCwgOCwgNTUsIDEzNywgMTAKfQoKU0hFTExfUlVOX0RMRyBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAwLCAwLCAyMjcsIDk1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogSUNPTiAiIiwgMTIyOTcsIDcsIDExLCAxOCwgMjAsIFdTX1ZJU0lCTEUKIExURVhUICJTa3JpdiBpbm4gbmF2bmV0IHDlIHByb2dyYW1tZXQsIG1hcHBlbiwgZG9rdW1lbnRldCBldHRlciBJbnRlcm5ldHQtcmVzc3Vyc2VuIGR1IPhuc2tlciDlIOVwbmUuIiwgMTIyODksIDM2LCAxMSwgMTgyLCAxOAogTFRFWFQgIibFcG5lOiIsIDEyMzA1LCA3LCAzOSwgMjQsIDEwCiBDT05UUk9MICIiLCAxMjI5OCwgIkNPTUJPQk9YIiwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVlNDUk9MTCB8IFdTX1ZJU0lCTEUgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX0RST1BET1dOLCAzNiwgMzcsIDE4MywgMTAwCiBERUZQVVNIQlVUVE9OICJPSyIsIElET0ssIDYyLCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICJBdmJyeXQiLCBJRENBTkNFTCwgMTE2LCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICImQmxhIC4gLiAuIiwgMTIyODgsIDE3MCwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICAgICAgLyogY29sdW1ucyBpbiB0aGUgc2hlbGx2aWV3ICovCglJRFNfU0hWX0NPTFVNTjEJCSJGaWwiCglJRFNfU0hWX0NPTFVNTjIJCSJTdPhycmVsc2UiCglJRFNfU0hWX0NPTFVNTjMJCSJUeXBlIgoJSURTX1NIVl9DT0xVTU40CQkiRW5kcmV0IgoJSURTX1NIVl9DT0xVTU41CQkiRWdlbnNrYXBlciIKCUlEU19TSFZfQ09MVU1ONgkJIlN0+HJyZWxzZSIKCUlEU19TSFZfQ09MVU1ONwkJIkxlZGlnIHBsYXNzIgoJSURTX1NIVl9DT0xVTU44CQkiTmF2biIKCUlEU19TSFZfQ09MVU1OOQkJIktvbW1lbnRhcmVyIgoJSURTX1NIVl9DT0xVTU4xMAkiRWllciIKCUlEU19TSFZfQ09MVU1OMTEJIkdydXBwZSIKCUlEU19TSFZfQ09MVU1OX0RFTEZST00JIk9wcHJpbm5lbGlnIHBsYXNzZXJpbmciCglJRFNfU0hWX0NPTFVNTl9ERUxEQVRFCSJEYXRvIHNsZXR0ZXQiCgogICAgICAgIC8qIHNwZWNpYWwgZm9sZGVycyAqLwoJSURTX0RFU0tUT1AJCSJTa3JpdmVib3JkIgoJSURTX01ZQ09NUFVURVIJCSJNaW4gZGF0YW1hc2tpbiIKCUlEU19SRUNZQ0xFQklOX0ZPTERFUl9OQU1FICAgICAgIlBhcGlya3VydiIKCiAgICAgICAgLyogY29udGV4dCBtZW51cyAqLwoJSURTX1ZJRVdfTEFSR0UJCSImU3RvcmUgaWtvbmVyIgoJSURTX1ZJRVdfU01BTEwJCSJTJm3lIGlrb25lciIKCUlEU19WSUVXX0xJU1QJCSImTGlzdGUiCglJRFNfVklFV19ERVRBSUxTCSImRGV0YWxqZXIiCglJRFNfU0VMRUNUCQkiVmVsZyIKCUlEU19PUEVOCQkixXBuZSIKCglJRFNfQ1JFQVRFRk9MREVSX0RFTklFRCAiS3VubmUgaWtrZSBvcHByZXR0ZSBueSBtYXBwZTogdGlsZ2FuZyBuZWt0ZXQuIgoJSURTX0NSRUFURUZPTERFUl9DQVBUSU9OICJLbGFydGUgaWtrZSBvcHByZXR0ZSBueSBtYXBwZSIKCUlEU19ERUxFVEVJVEVNX0NBUFRJT04gIkJla3JlZnQgZmlsc2xldHRpbmciCglJRFNfREVMRVRFRk9MREVSX0NBUFRJT04gIkJla3JlZnQgc2xldHRpbmcgYXYgbWFwcGUiCglJRFNfREVMRVRFSVRFTV9URVhUICJWaXJrZWxpZyBzbGV0dGUgqyUxuz8iCglJRFNfREVMRVRFTVVMVElQTEVfVEVYVCAiVmlya2VsaWcgc2xldHRlIGRpc3NlICUxIGVsZW1lbnRlbmU/IgoJSURTX0RFTEVURVNFTEVDVEVEX1RFWFQgIlZpcmtlbGlnIHNsZXR0ZSB2YWxndGUgZWxlbWVudChlcik/PyIKCUlEU19UUkFTSElURU1fVEVYVCAiVmlya2VsaWcgbGVnZ2UgqyUxuyBpIHBhcGlya3VydmVuPyIKCUlEU19UUkFTSEZPTERFUl9URVhUICJWaXJrZWxpZyBsZWdnZSCrJTG7IG9nIGFsdCBpbm5ob2xkZXQgaSBwYXBpcmt1cnZlbj8iCglJRFNfVFJBU0hNVUxUSVBMRV9URVhUICJWaXJrZWxpZyBsZWdnZSBkaXNzZSAlMSB2YWxndGUgZWxlbWVudGVuZSBpIHBhcGlya3VydmVuPyIKCUlEU19DQU5UVFJBU0hfVEVYVCAiRWxlbWVudGV0IKslMbsga2FuIGlra2UgbGVnZ2VzIGkgcGFwaXJrdXJ2ZW4uIFZpbCBkdSBzbGV0dGUgZGV0IGkgc3RlZGV0PyIKCUlEU19PVkVSV1JJVEVGSUxFX1RFWFQgIk92ZXJza3JpdmUgZmlsZW4gqyUxuz8iCglJRFNfT1ZFUldSSVRFRklMRV9DQVBUSU9OICJCZWtyZWZ0IG92ZXJza3JpdmluZyBhdiBmaWwiCgogICAgICAgIC8qIG1lc3NhZ2UgYm94IHN0cmluZ3MgKi8KICAgICAgICBJRFNfUkVTVEFSVF9USVRMRSAgICAgICAiU3RhcnRlIHDlIG55dHQiCiAgICAgICAgSURTX1JFU1RBUlRfUFJPTVBUICAgICAgIlZpbCBkdSBzaW11bGVyZSBlbiBvbXN0YXJ0IGF2IFdpbmRvd3M/IgogICAgICAgIElEU19TSFVURE9XTl9USVRMRSAgICAgICJBdnNsdXR0IgogICAgICAgIElEU19TSFVURE9XTl9QUk9NUFQgICAgICJWaWwgZHUgYXZzbHV0dGUgV2luZS34a3Rlbj8iCgogICAgICAgIC8qIHNoZWxsIGZvbGRlciBwYXRoIGRlZmF1bHQgdmFsdWVzICovCglJRFNfUFJPR1JBTVMgICAgICAgICAgICAgICAgIlN0YXJ0LW1lbnlcXFByb2dyYW1tZXIiCglJRFNfUEVSU09OQUwgICAgICAgICAgICAgICAgIk1pbmUgZG9rdW1lbnRlciIKCUlEU19GQVZPUklURVMgICAgICAgICAgICAgICAiRmF2b3JpdHRlciIKCUlEU19TVEFSVFVQICAgICAgICAgICAgICAgICAiU3RhcnQtbWVueVxcUHJvZ3JhbW1lclxcT3Bwc3RhcnQiCglJRFNfUkVDRU5UICAgICAgICAgICAgICAgICAgIlNpc3RlIgoJSURTX1NFTkRUTyAgICAgICAgICAgICAgICAgICJTZW5kVG8iCglJRFNfU1RBUlRNRU5VICAgICAgICAgICAgICAgIlN0YXJ0LW1lbnkiCglJRFNfTVlNVVNJQyAgICAgICAgICAgICAgICAgIk1pbiBtdXNpa2siCglJRFNfTVlWSURFTyAgICAgICAgICAgICAgICAgIk1pbmUgdmlkZW9rbGlwcCIKCUlEU19ERVNLVE9QRElSRUNUT1JZICAgICAgICAiU2tyaXZlYm9yZCIKCUlEU19ORVRIT09EICAgICAgICAgICAgICAgICAiTmV0SG9vZCIKCUlEU19URU1QTEFURVMgICAgICAgICAgICAgICAiTWFsZXIiCglJRFNfQVBQREFUQSAgICAgICAgICAgICAgICAgIlByb2dyYW1kYXRhIgoJSURTX1BSSU5USE9PRCAgICAgICAgICAgICAgICJTa3JpdmVyZSIKCUlEU19MT0NBTF9BUFBEQVRBICAgICAgICAgICAiTG9rYWxlIGlubnN0aWxsaW5nZXJcXFByb2dyYW1kYXRhIgoJSURTX0lOVEVSTkVUX0NBQ0hFICAgICAgICAgICJMb2thbGUgaW5uc3RpbGxpbmdlclxcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzIgoJSURTX0NPT0tJRVMgICAgICAgICAgICAgICAgICJDb29raWVzIgoJSURTX0hJU1RPUlkgICAgICAgICAgICAgICAgICJMb2thbGUgaW5uc3RpbGxpbmdlclxcTG9nZyIKCUlEU19QUk9HUkFNX0ZJTEVTICAgICAgICAgICAiUHJvZ3JhbWZpbGVyIgoJSURTX01ZUElDVFVSRVMgICAgICAgICAgICAgICJNaW5lIGJpbGRlciIKCUlEU19QUk9HUkFNX0ZJTEVTX0NPTU1PTiAgICAiUHJvZ3JhbWZpbGVyXFxGZWxsZXNmaWxlciIKCUlEU19DT01NT05fRE9DVU1FTlRTICAgICAgICAiRG9rdW1lbnRlciIKCUlEU19BRE1JTlRPT0xTICAgICAgICAgICAgICAiU3RhcnQtbWVueVxcUHJvZ3JhbW1lclxcQWRtaW5pc3RyYXRpdmUgdmVya3T4eSIKCUlEU19DT01NT05fTVVTSUMgICAgICAgICAgICAiRG9rdW1lbnRlclxcTWluIG11c2lrayIKCUlEU19DT01NT05fUElDVFVSRVMgICAgICAgICAiRG9rdW1lbnRlclxcTWluZSBiaWxkZXIiCglJRFNfQ09NTU9OX1ZJREVPICAgICAgICAgICAgIkRva3VtZW50ZXJcXE1pbmUgdmlkZW9rbGlwcCIKCUlEU19DREJVUk5fQVJFQSAgICAgICAgICAgICAiTG9rYWxlIGlubnN0aWxsaW5nZXJcXFByb2dyYW1kYXRhXFxNaWNyb3NvZnRcXENEIEJ1cm5pbmciCn0K