LyoKICogaXB2NmNwLmggLSBQUFAgSVBWNiBDb250cm9sIFByb3RvY29sLgogKgogKiBDb3B5cmlnaHQgKGMpIDE5OTkgVG9tbWkgS29tdWxhaW5lbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIDMuIFRoZSBuYW1lKHMpIG9mIHRoZSBhdXRob3JzIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgdXNlZCB0bwogKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAogKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIDQuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKICogICAgYWNrbm93bGVkZ21lbnQ6CiAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFRvbW1pIEtvbXVsYWluZW4KICogICAgIDxUb21taS5Lb211bGFpbmVuQGlraS5maT4iLgogKgogKiBUSEUgQVVUSE9SUyBPRiBUSElTIFNPRlRXQVJFIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCiAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkKICogU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgogKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKgogKi8KCi8qICBPcmlnaW5hbCB2ZXJzaW9uLCBiYXNlZCBvbiBSRkMyMDIzIDoKCiAgICBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYsIDE5OTcgRnJhbmNpcy5EdXBvbnRAaW5yaWEuZnIsIElOUklBIFJvY3F1ZW5jb3VydCwKICAgIEFsYWluLkR1cmFuZEBpbWFnLmZyLCBJTUFHLAogICAgSmVhbi1MdWMuUmljaGllckBpbWFnLmZyLCBJTUFHLUxTUi4KCiAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgRnJhbmNpcy5EdXBvbnRAaW5yaWEuZnIsIEdJRSBEWUFERSwKICAgIEFsYWluLkR1cmFuZEBpbWFnLmZyLCBJTUFHLAogICAgSmVhbi1MdWMuUmljaGllckBpbWFnLmZyLCBJTUFHLUxTUi4KCiAgICBDZSB0cmF2YWlsIGEg6XTpIGZhaXQgYXUgc2VpbiBkdSBHSUUgRFlBREUgKEdyb3VwZW1lbnQgZCdJbnTpcup0CiAgICDJY29ub21pcXVlIGF5YW50IHBvdXIgbWVtYnJlcyBCVUxMIFMuQS4gZXQgbCdJTlJJQSkuCgogICAgQ2UgbG9naWNpZWwgaW5mb3JtYXRpcXVlIGVzdCBkaXNwb25pYmxlIGF1eCBjb25kaXRpb25zCiAgICB1c3VlbGxlcyBkYW5zIGxhIHJlY2hlcmNoZSwgYydlc3Qt4C1kaXJlIHF1J2lsIHBldXQKICAgIOp0cmUgdXRpbGlz6SwgY29waeksIG1vZGlmaeksIGRpc3RyaWJ16SDgIGwndW5pcXVlCiAgICBjb25kaXRpb24gcXVlIGNlIHRleHRlIHNvaXQgY29uc2VydukgYWZpbiBxdWUKICAgIGwnb3JpZ2luZSBkZSBjZSBsb2dpY2llbCBzb2l0IHJlY29ubnVlLgoKICAgIExlIG5vbSBkZSBsJ0luc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUKICAgIGV0IGVuIEF1dG9tYXRpcXVlIChJTlJJQSksIGRlIGwnSU1BRywgb3UgZCd1bmUgcGVyc29ubmUgbW9yYWxlCiAgICBvdSBwaHlzaXF1ZSBheWFudCBwYXJ0aWNpcOkg4CBsJ+lsYWJvcmF0aW9uIGRlIGNlIGxvZ2ljaWVsIG5lIHBldXQKICAgIOp0cmUgdXRpbGlz6SBzYW5zIHNvbiBhY2NvcmQgcHLpYWxhYmxlIGV4cGxpY2l0ZS4KCiAgICBDZSBsb2dpY2llbCBlc3QgZm91cm5pIHRlbCBxdWVsIHNhbnMgYXVjdW5lIGdhcmFudGllLAogICAgc3VwcG9ydCBvdSByZXNwb25zYWJpbGl06SBkJ2F1Y3VuZSBzb3J0ZS4KICAgIENlIGxvZ2ljaWVsIGVzdCBk6XJpdukgZGUgc291cmNlcyBkJ29yaWdpbmUKICAgICJVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkiIGV0CiAgICAiRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24iIGNvdXZlcnRlcyBwYXIgZGVzIGNvcHlyaWdodHMuCgogICAgTCdJbnN0aXR1dCBkJ0luZm9ybWF0aXF1ZSBldCBkZSBNYXRo6W1hdGlxdWVzIEFwcGxpcXXpZXMgZGUgR3Jlbm9ibGUgKElNQUcpCiAgICBlc3QgdW5lIGbpZOlyYXRpb24gZCd1bml06XMgbWl4dGVzIGRlIHJlY2hlcmNoZSBkdSBDTlJTLCBkZSBsJ0luc3RpdHV0IE5hdGlvbmFsCiAgICBQb2x5dGVjaG5pcXVlIGRlIEdyZW5vYmxlIGV0IGRlIGwnVW5pdmVyc2l06SBKb3NlcGggRm91cmllciByZWdyb3VwYW50CiAgICBzZXB0IGxhYm9yYXRvaXJlcyBkb250IGxlIGxhYm9yYXRvaXJlIExvZ2ljaWVscywgU3lzdOhtZXMsIFLpc2VhdXggKExTUikuCgogICAgVGhpcyB3b3JrIGhhcyBiZWVuIGRvbmUgaW4gdGhlIGNvbnRleHQgb2YgR0lFIERZQURFIChqb2ludCBSICYgRCB2ZW50dXJlCiAgICBiZXR3ZWVuIEJVTEwgUy5BLiBhbmQgSU5SSUEpLgoKICAgIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHdpdGggdXN1YWwgInJlc2VhcmNoIiB0ZXJtcwogICAgd2l0aCB0aGUgYWltIG9mIHJldGFpbiBjcmVkaXRzIG9mIHRoZSBzb2Z0d2FyZS4gCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICAgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiAgICBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLAogICAgYW5kIHRoZSBuYW1lIG9mIElOUklBLCBJTUFHLCBvciBhbnkgY29udHJpYnV0b3Igbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcKICAgIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoaXMgbWF0ZXJpYWwgd2l0aG91dCB0aGUgcHJpb3IgZXhwbGljaXQKICAgIHBlcm1pc3Npb24uIFRoZSBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgICB3YXJyYW50aWVzLCBzdXBwb3J0IG9yIGxpYWJpbGl0aWVzIG9mIGFueSBraW5kLgogICAgVGhpcyBzb2Z0d2FyZSBpcyBkZXJpdmVkIGZyb20gc291cmNlIGNvZGUgZnJvbQogICAgIlVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSIgYW5kCiAgICAiRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24iIHByb3RlY3RlZCBieSBjb3B5cmlnaHRzLgoKICAgIEdyZW5vYmxlJ3MgSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UgYW5kIEFwcGxpZWQgTWF0aGVtYXRpY3MgKElNQUcpCiAgICBpcyBhIGZlZGVyYXRpb24gb2Ygc2V2ZW4gcmVzZWFyY2ggdW5pdHMgZnVuZGVkIGJ5IHRoZSBDTlJTLCBOYXRpb25hbAogICAgUG9seXRlY2huaWMgSW5zdGl0dXRlIG9mIEdyZW5vYmxlIGFuZCBVbml2ZXJzaXR5IEpvc2VwaCBGb3VyaWVyLgogICAgVGhlIHJlc2VhcmNoIHVuaXQgaW4gU29mdHdhcmUsIFN5c3RlbXMsIE5ldHdvcmtzIChMU1IpIGlzIG1lbWJlciBvZiBJTUFHLgoqLwoKLyoKICogRGVyaXZlZCBmcm9tIDoKICoKICoKICogaXBjcC5oIC0gSVAgQ29udHJvbCBQcm90b2NvbCBkZWZpbml0aW9ucy4KICoKICogQ29weXJpZ2h0IChjKSAxOTg0LTIwMDAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIDMuIFRoZSBuYW1lICJDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSIgbXVzdCBub3QgYmUgdXNlZCB0bwogKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAogKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciBwZXJtaXNzaW9uIG9yIGFueSBsZWdhbAogKiAgICBkZXRhaWxzLCBwbGVhc2UgY29udGFjdAogKiAgICAgIE9mZmljZSBvZiBUZWNobm9sb2d5IFRyYW5zZmVyCiAqICAgICAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKICogICAgICA1MDAwIEZvcmJlcyBBdmVudWUKICogICAgICBQaXR0c2J1cmdoLCBQQSAgMTUyMTMtMzg5MAogKiAgICAgICg0MTIpIDI2OC00Mzg3LCBmYXg6ICg0MTIpIDI2OC03Mzk1CiAqICAgICAgdGVjaC10cmFuc2ZlckBhbmRyZXcuY211LmVkdQogKgogKiA0LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCiAqICAgIGFja25vd2xlZGdtZW50OgogKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBDb21wdXRpbmcgU2VydmljZXMKICogICAgIGF0IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5IChodHRwOi8vd3d3LmNtdS5lZHUvY29tcHV0aW5nLykuIgogKgogKiBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KICogVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCiAqIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBCRSBMSUFCTEUKICogRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCiAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqCiAqICRJZDogaXB2NmNwLmgsdiAxLjcgMjAwMi8xMi8wNCAyMzowMzozMiBwYXVsdXMgRXhwICQKICovCgovKgogKiBPcHRpb25zLgogKi8KI2RlZmluZSBDSV9JRkFDRUlECTEJLyogSW50ZXJmYWNlIElkZW50aWZpZXIgKi8KI2RlZmluZSBDSV9DT01QUkVTU1RZUEUJMgkvKiBDb21wcmVzc2lvbiBUeXBlICAgICAqLwoKLyogTm8gY29tcHJlc3Npb24gdHlwZXMgeWV0IGRlZmluZWQuCiAqI2RlZmluZSBJUFY2Q1BfQ09NUAkweDAwNGYKICovCnR5cGVkZWYgc3RydWN0IGlwdjZjcF9vcHRpb25zIHsKICAgIGludCBuZWdfaWZhY2VpZDsJCS8qIE5lZ290aWF0ZSBpbnRlcmZhY2UgaWRlbnRpZmllcj8gKi8KICAgIGludCByZXFfaWZhY2VpZDsJCS8qIEFzayBwZWVyIHRvIHNlbmQgaW50ZXJmYWNlIGlkZW50aWZpZXI/ICovCiAgICBpbnQgYWNjZXB0X2xvY2FsOwkJLyogYWNjZXB0IHBlZXIncyB2YWx1ZSBmb3IgaWZhY2UgaWQ/ICovCiAgICBpbnQgb3B0X2xvY2FsOwkJLyogb3VydG9rZW4gc2V0IGJ5IG9wdGlvbiAqLwogICAgaW50IG9wdF9yZW1vdGU7CQkvKiBoaXN0b2tlbiBzZXQgYnkgb3B0aW9uICovCiAgICBpbnQgdXNlX2lwOwkJCS8qIHVzZSBJUCBhcyBpbnRlcmZhY2UgaWRlbnRpZmllciAqLwogICAgaW50IHVzZV9wZXJzaXN0ZW50OwkJLyogdXNlIHVuaXF1ZWx5IHBlcnNpc3RlbnQgdmFsdWUgZm9yIGFkZHJlc3MgKi8KICAgIGludCBuZWdfdmo7CQkJLyogVmFuIEphY29ic29uIENvbXByZXNzaW9uPyAqLwogICAgdV9zaG9ydCB2al9wcm90b2NvbDsJLyogcHJvdG9jb2wgdmFsdWUgdG8gdXNlIGluIFZKIG9wdGlvbiAqLwogICAgZXVpNjRfdCBvdXJpZCwgaGlzaWQ7CS8qIEludGVyZmFjZSBpZGVudGlmaWVycyAqLwp9IGlwdjZjcF9vcHRpb25zOwoKZXh0ZXJuIGZzbSBpcHY2Y3BfZnNtW107CmV4dGVybiBpcHY2Y3Bfb3B0aW9ucyBpcHY2Y3Bfd2FudG9wdGlvbnNbXTsKZXh0ZXJuIGlwdjZjcF9vcHRpb25zIGlwdjZjcF9nb3RvcHRpb25zW107CmV4dGVybiBpcHY2Y3Bfb3B0aW9ucyBpcHY2Y3BfYWxsb3dvcHRpb25zW107CmV4dGVybiBpcHY2Y3Bfb3B0aW9ucyBpcHY2Y3BfaGlzb3B0aW9uc1tdOwoKZXh0ZXJuIHN0cnVjdCBwcm90ZW50IGlwdjZjcF9wcm90ZW50Owo=