ZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL0tjb25maWcgYi9kcml2ZXJzL3VzYi9tZWRpYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjMyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9LY29uZmlnCkBAIC0wLDAgKzEsMjEzIEBACisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZSBjb25maWd1cmF0aW9uCisjCitjb21tZW50ICJVU0IgTXVsdGltZWRpYSBkZXZpY2VzIgorCWRlcGVuZHMgb24gVVNCCisKK2NvbmZpZyBVU0JfREFCVVNCCisJdHJpc3RhdGUgIkRBQlVTQiBkcml2ZXIiCisJZGVwZW5kcyBvbiBVU0IKKwktLS1oZWxwLS0tCisJICBBIERpZ2l0YWwgQXVkaW8gQnJvYWRjYXN0aW5nIChEQUIpIFJlY2VpdmVyIGZvciBVU0IgYW5kIExpbnV4CisJICBicm91Z2h0IHRvIHlvdSBieSB0aGUgREFCLVRlYW0KKwkgIDxodHRwOi8vd3d3Ym9kZS5jcy50dW0uZWR1L1Bhci9hcmNoL2RhYi8+LiAgVGhpcyBkcml2ZXIgY2FuIGJlIHRha2VuCisJICBhcyBhbiBleGFtcGxlIGZvciBVUkItYmFzZWQgYnVsaywgY29udHJvbCwgYW5kIGlzb2Nocm9ub3VzCisJICB0cmFuc2FjdGlvbnMuIFVSQidzIGFyZSBleHBsYWluZWQgaW4KKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vdXNiL1VSQi50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkYWJ1c2IuCisKK2NvbW1lbnQgIlZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19ERVY9bgorCitjb25maWcgVVNCX1ZJQ0FNCisJdHJpc3RhdGUgIlVTQiAzY29tIEhvbWVDb25uZWN0IChha2EgdmljYW0pIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBVU0IgJiYgVklERU9fREVWICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgM2NvbSBob21lY29ubmVjdCBjYW1lcmEgKHZpY2FtKS4KKworCSAgVGhpcyBkcml2ZXIgdXNlcyB0aGUgVmlkZW8gRm9yIExpbnV4IEFQSS4gWW91IG11c3Qgc2F5IFkgb3IgTSB0bworCSAgIlZpZGVvIEZvciBMaW51eCIgKHVuZGVyIE11bHRpbWVkaWEgRGV2aWNlcykgdG8gdXNlIHRoaXMgZHJpdmVyLgorCSAgSW5mb3JtYXRpb24gb24gdGhpcyBBUEkgYW5kIHBvaW50ZXJzIHRvICJ2NGwiIHByb2dyYW1zIG1heSBiZSBmb3VuZAorCSAgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZpY2FtLgorCitjb25maWcgVVNCX0RTQlIKKwl0cmlzdGF0ZSAiRC1MaW5rIFVTQiBGTSByYWRpbyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFViAmJiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdGhpcyB0eXBlIG9mIHJhZGlvIHRvIHlvdXIKKwkgIGNvbXB1dGVyJ3MgVVNCIHBvcnQuIE5vdGUgdGhhdCB0aGUgYXVkaW8gaXMgbm90IGRpZ2l0YWwsIGFuZAorCSAgeW91IG11c3QgY29ubmVjdCB0aGUgbGluZSBvdXQgY29ubmVjdG9yIHRvIGEgc291bmQgY2FyZCBvciBhCisJICBzZXQgb2Ygc3BlYWtlcnMuCisKKwkgIFRoaXMgZHJpdmVyIHVzZXMgdGhlIFZpZGVvIEZvciBMaW51eCBBUEkuICBZb3UgbXVzdCBlbmFibGUKKwkgIChZIG9yIE0gaW4gY29uZmlnKSBWaWRlbyBGb3IgTGludXggKHVuZGVyIENoYXJhY3RlciBEZXZpY2VzKQorCSAgdG8gdXNlIHRoaXMgZHJpdmVyLiAgSW5mb3JtYXRpb24gb24gdGhpcyBBUEkgYW5kIHBvaW50ZXJzIHRvCisJICAidjRsIiBwcm9ncmFtcyBtYXkgYmUgZm91bmQgYXQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWw+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkc2JyMTAwLgorCitjb25maWcgVVNCX0lCTUNBTQorCXRyaXN0YXRlICJVU0IgSUJNIChYaXJsaW5rKSBDLWl0IENhbWVyYSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFVgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBhIElCTSAiQy1JdCIgY2FtZXJhLCBhbHNvIGtub3duIGFzCisJICAiWGlybGluayBQQyBDYW1lcmEiIHRvIHlvdXIgY29tcHV0ZXIncyBVU0IgcG9ydC4gIEZvciBtb3JlCisJICBpbmZvcm1hdGlvbiwgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3VzYi9pYm1jYW0udHh0Pi4KKworCSAgVGhpcyBkcml2ZXIgdXNlcyB0aGUgVmlkZW8gRm9yIExpbnV4IEFQSS4gIFlvdSBtdXN0IGVuYWJsZQorCSAgKFkgb3IgTSBpbiBjb25maWcpIFZpZGVvIEZvciBMaW51eCAodW5kZXIgQ2hhcmFjdGVyIERldmljZXMpCisJICB0byB1c2UgdGhpcyBkcml2ZXIuICBJbmZvcm1hdGlvbiBvbiB0aGlzIEFQSSBhbmQgcG9pbnRlcnMgdG8KKwkgICJ2NGwiIHByb2dyYW1zIG1heSBiZSBmb3VuZCBhdAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlibWNhbS4KKworCSAgVGhpcyBjYW1lcmEgaGFzIHNldmVyYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHdoaWNoCisJICBjYW4gYmUgc3BlY2lmaWVkIHdoZW4geW91IGxvYWQgdGhlIG1vZHVsZS4gUmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi91c2IvaWJtY2FtLnR4dD4gdG8gbGVhcm4gbW9yZS4KKworY29uZmlnIFVTQl9LT05JQ0FXQworCXRyaXN0YXRlICJVU0IgS29uaWNhIFdlYmNhbSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFVgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3Igd2ViY2FtcyBiYXNlZCBvbiBhIEtvbmljYQorCSAgY2hpcHNldC4gVGhpcyBpcyBrbm93biB0byB3b3JrIHdpdGggdGhlIEludGVsIFlDNzYgd2ViY2FtLgorCisJICBUaGlzIGRyaXZlciB1c2VzIHRoZSBWaWRlbyBGb3IgTGludXggQVBJLiAgWW91IG11c3QgZW5hYmxlCisJICAoWSBvciBNIGluIGNvbmZpZykgVmlkZW8gRm9yIExpbnV4ICh1bmRlciBDaGFyYWN0ZXIgRGV2aWNlcykKKwkgIHRvIHVzZSB0aGlzIGRyaXZlci4gIEluZm9ybWF0aW9uIG9uIHRoaXMgQVBJIGFuZCBwb2ludGVycyB0bworCSAgInY0bCIgcHJvZ3JhbXMgbWF5IGJlIGZvdW5kIGF0CisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQga29uaWNhd2MuCisKK2NvbmZpZyBVU0JfT1Y1MTEKKwl0cmlzdGF0ZSAiVVNCIE9WNTExIENhbWVyYSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFVgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0aGlzIHR5cGUgb2YgY2FtZXJhIHRvIHlvdXIKKwkgIGNvbXB1dGVyJ3MgVVNCIHBvcnQuIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3VzYi9vdjUxMS50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbiBhbmQgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgY2FtZXJhcy4KKworCSAgVGhpcyBkcml2ZXIgdXNlcyB0aGUgVmlkZW8gRm9yIExpbnV4IEFQSS4gWW91IG11c3Qgc2F5IFkgb3IgTSB0bworCSAgIlZpZGVvIEZvciBMaW51eCIgKHVuZGVyIENoYXJhY3RlciBEZXZpY2VzKSB0byB1c2UgdGhpcyBkcml2ZXIuCisJICBJbmZvcm1hdGlvbiBvbiB0aGlzIEFQSSBhbmQgcG9pbnRlcnMgdG8gInY0bCIgcHJvZ3JhbXMgbWF5IGJlIGZvdW5kCisJICBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb3Y1MTEuCisKK2NvbmZpZyBVU0JfU0U0MDEKKwl0cmlzdGF0ZSAiVVNCIFNFNDAxIENhbWVyYSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFVgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0aGlzIHR5cGUgb2YgY2FtZXJhIHRvIHlvdXIKKwkgIGNvbXB1dGVyJ3MgVVNCIHBvcnQuIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3VzYi9zZTQwMS50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbiBhbmQgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgY2FtZXJhcy4KKworCSAgVGhpcyBkcml2ZXIgdXNlcyB0aGUgVmlkZW8gRm9yIExpbnV4IEFQSS4gWW91IG11c3Qgc2F5IFkgb3IgTSB0bworCSAgIlZpZGVvIEZvciBMaW51eCIgKHVuZGVyIE11bHRpbWVkaWEgRGV2aWNlcykgdG8gdXNlIHRoaXMgZHJpdmVyLgorCSAgSW5mb3JtYXRpb24gb24gdGhpcyBBUEkgYW5kIHBvaW50ZXJzIHRvICJ2NGwiIHByb2dyYW1zIG1heSBiZSBmb3VuZAorCSAgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNlNDAxLgorCitjb25maWcgVVNCX1NOOUMxMDIKKwl0cmlzdGF0ZSAiVVNCIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19ERVYKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gU09OaVggU045QzEwMSwKKwkgIFNOOUMxMDIgb3IgU045QzEwMyBQQyBDYW1lcmEgQ29udHJvbGxlcnMuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3VzYi9zbjljMTAyLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb25zLgorCisJICBUaGlzIGRyaXZlciB1c2VzIHRoZSBWaWRlbyBGb3IgTGludXggQVBJLiBZb3UgbXVzdCBzYXkgWSBvciBNIHRvCisJICAiVmlkZW8gRm9yIExpbnV4IiB0byB1c2UgdGhpcyBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNuOWMxMDIuCisKK2NvbmZpZyBVU0JfU1RWNjgwCisJdHJpc3RhdGUgIlVTQiBTVFY2ODAgKFBlbmNhbSkgQ2FtZXJhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IgJiYgVklERU9fREVWCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IHRoaXMgdHlwZSBvZiBjYW1lcmEgdG8geW91cgorCSAgY29tcHV0ZXIncyBVU0IgcG9ydC4gVGhpcyBpbmNsdWRlcyB0aGUgUGVuY2FtIGxpbmUgb2YgY2FtZXJhcy4KKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3VzYi9zdHY2ODAudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZm9yCisJICBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGNhbWVyYXMuCisKKwkgIFRoaXMgZHJpdmVyIHVzZXMgdGhlIFZpZGVvIEZvciBMaW51eCBBUEkuIFlvdSBtdXN0IHNheSBZIG9yIE0gdG8KKwkgICJWaWRlbyBGb3IgTGludXgiICh1bmRlciBNdWx0aW1lZGlhIERldmljZXMpIHRvIHVzZSB0aGlzIGRyaXZlci4KKwkgIEluZm9ybWF0aW9uIG9uIHRoaXMgQVBJIGFuZCBwb2ludGVycyB0byAidjRsIiBwcm9ncmFtcyBtYXkgYmUgZm91bmQKKwkgIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWw+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzdHY2ODAuCisKK2NvbmZpZyBVU0JfVzk5NjhDRgorCXRyaXN0YXRlICJVU0IgVzk5Nls4N11DRiBKUEVHIER1YWwgTW9kZSBDYW1lcmEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19ERVYgJiYgSTJDICYmIFZJREVPX09WQ0FNQ0hJUAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiBPVjY4MSBvcgorCSAgV2luYm9uZCBXOTk2N0NGL1c5OTY4Q0YgSlBFRyBVU0IgRHVhbCBNb2RlIENhbWVyYSBDaGlwcy4KKwkKKwkgIFRoaXMgZHJpdmVyIGhhcyBhbiBvcHRpb25hbCBwbHVnaW4sIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIGFzIGEKKwkgIHNlcGFyYXRlIG1vZHVsZSBvbmx5IChyZWxlYXNlZCB1bmRlciBHUEwpLiBJdCBhbGxvd3MgdG8gdXNlIGhpZ2hlciAKKwkgIHJlc29sdXRpb25zIGFuZCBmcmFtZXJhdGVzLCBidXQgY2Fubm90IGJlIGluY2x1ZGVkIGluIHRoZSBvZmZpY2lhbCAKKwkgIExpbnV4IGtlcm5lbCBmb3IgcGVyZm9ybWFuY2UgcHVycG9zZXMuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3VzYi93OTk2OGNmLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb25zLgorCisJICBUaGlzIGRyaXZlciB1c2VzIHRoZSBWaWRlbyBGb3IgTGludXggYW5kIHRoZSBJMkMgQVBJcy4gSXQgbmVlZHMgdGhlCisJICBPbW5pVmlzaW9uIENhbWVyYSBDaGlwIHN1cHBvcnQgYXMgd2VsbC4gWW91IG11c3Qgc2F5IFkgb3IgTSB0bworCSAgIlZpZGVvIEZvciBMaW51eCIsICJJMkMgU3VwcG9ydCIgYW5kICJPbW5pVmlzaW9uIENhbWVyYSBDaGlwIAorCSAgc3VwcG9ydCIgdG8gdXNlIHRoaXMgZHJpdmVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3OTk2OGNmLgorCitjb25maWcgVVNCX1BXQworCXRyaXN0YXRlICJVU0IgUGhpbGlwcyBDYW1lcmFzIgorCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFVgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCB0byB1c2Ugb25lIG9mIHRoZXNlIFBoaWxpcHMgJiBPRU0KKyAgICAgICAgICB3ZWJjYW1zOgorICAgICAgICAgICAqIFBoaWxpcHMgUENBNjQ1LCBQQ0E2NDYKKyAgICAgICAgICAgKiBQaGlsaXBzIFBDVkM2NzUsIFBDVkM2ODAsIFBDVkM2OTAKKyAgICAgICAgICAgKiBQaGlsaXBzIFBDVkM3MjAvNDAsIFBDVkM3MzAsIFBDVkM3NDAsIFBDVkM3NTAKKwkgICAqIEFza2V5IFZDMDEwCisJICAgKiBMb2dpdGVjaCBRdWlja0NhbSBQcm8gMzAwMCwgNDAwMCwgJ1pvb20nLCAnTm90ZWJvb2sgUHJvJyAKKyAgICAgICAgICAgICBhbmQgJ09yYml0Jy8nU3BoZXJlJworICAgICAgICAgICAqIFNhbXN1bmcgTVBDLUMxMCwgTVBDLUMzMAorCSAgICogQ3JlYXRpdmUgV2ViY2FtIDUsIFBybyBFeAorCSAgICogU09URUMgQWZpbmEgRXllCisJICAgKiBWaXNpb25pdGUgVkNTLVVDMzAwLCBWQ1MtVU0xMDAKKwkgICAKKwkgIFRoZSBQQ0E2MzUsIFBDVkM2NjUgYW5kIFBDVkM3MjAvMjAgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIKKwkgIGFuZCBuZXZlciB3aWxsIGJlLCBidXQgdGhlIDY2NSBhbmQgNzIwLzIwIGFyZSBzdXBwb3J0ZWQgYnkgb3RoZXIgCisJICBkcml2ZXJzLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi91c2IvcGhpbGlwcy50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZAorCSAgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KKworCSAgVGhlIGJ1aWx0LWluIG1pY3JvcGhvbmUgaXMgZW5hYmxlZCBieSBzZWxlY3RpbmcgVVNCIEF1ZGlvIHN1cHBvcnQuCisKKwkgIFRoaXMgZHJpdmVyIHVzZXMgdGhlIFZpZGVvIEZvciBMaW51eCBBUEkuIFlvdSBtdXN0IHNheSBZIG9yIE0gdG8KKwkgICJWaWRlbyBGb3IgTGludXgiICh1bmRlciBDaGFyYWN0ZXIgRGV2aWNlcykgdG8gdXNlIHRoaXMgZHJpdmVyLgorCSAgSW5mb3JtYXRpb24gb24gdGhpcyBBUEkgYW5kIHBvaW50ZXJzIHRvICJ2NGwiIHByb2dyYW1zIG1heSBiZSBmb3VuZAorCSAgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHB3Yy4KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL21lZGlhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzZkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjCisjIE1ha2VmaWxlIGZvciBVU0IgTWVkaWEgZHJpdmVycworIworCitzbjljMTAyLW9ianMJOj0gc245YzEwMl9jb3JlLm8gc245YzEwMl9odjcxMzFkLm8gc245YzEwMl9taTAzNDMubyBzbjljMTAyX3BhczEwNmIubyBzbjljMTAyX3BhczIwMmJjYi5vIHNuOWMxMDJfdGFzNTExMGMxYi5vIHNuOWMxMDJfdGFzNTEzMGQxYi5vCisKK29iai0kKENPTkZJR19VU0JfREFCVVNCKQkrPSBkYWJ1c2Iubworb2JqLSQoQ09ORklHX1VTQl9EU0JSKQkJKz0gZHNicjEwMC5vCitvYmotJChDT05GSUdfVVNCX0lCTUNBTSkJKz0gaWJtY2FtLm8gdXNidmlkZW8ubyB1bHRyYWNhbS5vCitvYmotJChDT05GSUdfVVNCX0tPTklDQVdDKQkrPSBrb25pY2F3Yy5vIHVzYnZpZGVvLm8KK29iai0kKENPTkZJR19VU0JfT1Y1MTEpCQkrPSBvdjUxMS5vCitvYmotJChDT05GSUdfVVNCX1NFNDAxKQkJKz0gc2U0MDEubworb2JqLSQoQ09ORklHX1VTQl9TTjlDMTAyKQkrPSBzbjljMTAyLm8KK29iai0kKENPTkZJR19VU0JfU1RWNjgwKQkrPSBzdHY2ODAubworb2JqLSQoQ09ORklHX1VTQl9WSUNBTSkJCSs9IHZpY2FtLm8gdXNidmlkZW8ubworb2JqLSQoQ09ORklHX1VTQl9XOTk2OENGKQkrPSB3OTk2OGNmLm8KK29iai0kKENPTkZJR19VU0JfUFdDKSAgICAgICAgICAgKz0gcHdjLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvZGFiZmlybXdhcmUuaCBiL2RyaXZlcnMvdXNiL21lZGlhL2RhYmZpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0ZDgwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL2RhYmZpcm13YXJlLmgKQEAgLTAsMCArMSwxNDA4IEBACisvKgorICogZGFiZGF0YS5oIC0gZGFiIHVzYiBmaXJtd2FyZSBhbmQgYml0c3RyZWFtIGRhdGEKKyAqLworCitzdGF0aWMgSU5URUxfSEVYX1JFQ09SRCBmaXJtd2FyZVtdID0geworCit7ICAyLCAweDAwMDAsIDAsIHsweDIxLDB4NTd9IH0sCit7ICAzLCAweDAwMDMsIDAsIHsweDAyLDB4MDEsMHg2Nn0gfSwKK3sgIDMsIDB4MDAwYiwgMCwgezB4MDIsMHgwMSwweDY2fSB9LAoreyAgMywgMHgwMDEzLCAwLCB7MHgwMiwweDAxLDB4NjZ9IH0sCit7ICAzLCAweDAwMWIsIDAsIHsweDAyLDB4MDEsMHg2Nn0gfSwKK3sgIDMsIDB4MDAyMywgMCwgezB4MDIsMHgwMSwweDY2fSB9LAoreyAgMywgMHgwMDJiLCAwLCB7MHgwMiwweDAxLDB4NjZ9IH0sCit7ICAzLCAweDAwMzMsIDAsIHsweDAyLDB4MDMsMHgwZn0gfSwKK3sgIDMsIDB4MDAzYiwgMCwgezB4MDIsMHgwMSwweDY2fSB9LAoreyAgMywgMHgwMDQzLCAwLCB7MHgwMiwweDAxLDB4MDB9IH0sCit7ICAzLCAweDAwNGIsIDAsIHsweDAyLDB4MDEsMHg2Nn0gfSwKK3sgIDMsIDB4MDA1MywgMCwgezB4MDIsMHgwMSwweDY2fSB9LAoreyAgMywgMHgwMDViLCAwLCB7MHgwMiwweDA0LDB4YmR9IH0sCit7ICAzLCAweDAwNjMsIDAsIHsweDAyLDB4MDEsMHg2N30gfSwKK3sgIDMsIDB4MDEwMCwgMCwgezB4MDIsMHgwYywweDVhfSB9LAoreyAgMywgMHgwMTA0LCAwLCB7MHgwMiwweDAxLDB4ZWR9IH0sCit7ICAzLCAweDAxMDgsIDAsIHsweDAyLDB4MDIsMHg1MX0gfSwKK3sgIDMsIDB4MDEwYywgMCwgezB4MDIsMHgwMiwweDdjfSB9LAoreyAgMywgMHgwMTEwLCAwLCB7MHgwMiwweDAyLDB4ZTR9IH0sCit7ICAxLCAweDAxMTQsIDAsIHsweDMyfSB9LAoreyAgMSwgMHgwMTE4LCAwLCB7MHgzMn0gfSwKK3sgIDMsIDB4MDExYywgMCwgezB4MDIsMHgwNSwweGZkfSB9LAoreyAgMywgMHgwMTIwLCAwLCB7MHgwMiwweDAwLDB4MDB9IH0sCit7ICAzLCAweDAxMjQsIDAsIHsweDAyLDB4MDAsMHgwMH0gfSwKK3sgIDMsIDB4MDEyOCwgMCwgezB4MDIsMHgwNCwweDNjfSB9LAoreyAgMywgMHgwMTJjLCAwLCB7MHgwMiwweDA0LDB4NmF9IH0sCit7ICAzLCAweDAxMzAsIDAsIHsweDAyLDB4MDAsMHgwMH0gfSwKK3sgIDMsIDB4MDEzNCwgMCwgezB4MDIsMHgwMCwweDAwfSB9LAoreyAgMywgMHgwMTM4LCAwLCB7MHgwMiwweDAwLDB4MDB9IH0sCit7ICAzLCAweDAxM2MsIDAsIHsweDAyLDB4MDAsMHgwMH0gfSwKK3sgIDMsIDB4MDE0MCwgMCwgezB4MDIsMHgwMCwweDAwfSB9LAoreyAgMywgMHgwMTQ0LCAwLCB7MHgwMiwweDAwLDB4MDB9IH0sCit7ICAzLCAweDAxNDgsIDAsIHsweDAyLDB4MDAsMHgwMH0gfSwKK3sgIDMsIDB4MDE0YywgMCwgezB4MDIsMHgwMCwweDAwfSB9LAoreyAgMywgMHgwMTUwLCAwLCB7MHgwMiwweDAwLDB4MDB9IH0sCit7ICAzLCAweDAxNTQsIDAsIHsweDAyLDB4MDAsMHgwMH0gfSwKK3sgMTAsIDB4MDE1NywgMCwgezB4NzUsMHg4MSwweDdmLDB4ZTUsMHg4MiwweDYwLDB4MDMsMHgwMiwweDAxLDB4NjF9IH0sCit7ICA1LCAweDAxNjEsIDAsIHsweDEyLDB4MDcsMHg2ZiwweDIxLDB4NjR9IH0sCit7ICAxLCAweDAxNjYsIDAsIHsweDMyfSB9LAoreyAxNCwgMHgwMTY3LCAwLCB7MHhjMCwweGQwLDB4YzAsMHg4NiwweGMwLDB4ODIsMHhjMCwweDgzLDB4YzAsMHhlMCwweDkwLDB4N2YsMHg5NywweGUwfSB9LAoreyAxNCwgMHgwMTc1LCAwLCB7MHg0NCwweDgwLDB4ZjAsMHg5MCwweDdmLDB4NjksMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwfSB9LAoreyAxNCwgMHgwMTgzLCAwLCB7MHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwfSB9LAoreyAxNCwgMHgwMTkxLCAwLCB7MHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweDkwLDB4N2YsMHg5NywweGUwfSB9LAoreyAgMywgMHgwMTlmLCAwLCB7MHg1NSwweDdmLDB4ZjB9IH0sCit7IDE0LCAweDAxYTIsIDAsIHsweDkwLDB4N2YsMHg5YSwweGUwLDB4MzAsMHhlNCwweDIzLDB4OTAsMHg3ZiwweDY4LDB4ZjAsMHhmMCwweGYwLDB4ZjB9IH0sCit7IDE0LCAweDAxYjAsIDAsIHsweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjB9IH0sCit7IDE0LCAweDAxYmUsIDAsIHsweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjB9IH0sCit7IDE0LCAweDAxY2MsIDAsIHsweGU1LDB4ZDgsMHhjMiwweGUzLDB4ZjUsMHhkOCwweGQwLDB4ZTAsMHhkMCwweDgzLDB4ZDAsMHg4MiwweGQwLDB4ODZ9IH0sCit7ICAzLCAweDAxZGEsIDAsIHsweGQwLDB4ZDAsMHgzMn0gfSwKK3sgIDgsIDB4MDFkZCwgMCwgezB4NzUsMHg4NiwweDAwLDB4OTAsMHhmZiwweGMzLDB4N2MsMHgwNX0gfSwKK3sgIDcsIDB4MDFlNSwgMCwgezB4YTMsMHhlNSwweDgyLDB4NDUsMHg4MywweDcwLDB4Zjl9IH0sCit7ICAxLCAweDAxZWMsIDAsIHsweDIyfSB9LAoreyAxNCwgMHgwMWVkLCAwLCB7MHhjMCwweGUwLDB4YzAsMHhmMCwweGMwLDB4ODIsMHhjMCwweDgzLDB4YzAsMHgwMiwweGMwLDB4MDMsMHhjMCwweGQwfSB9LAoreyAxNCwgMHgwMWZiLCAwLCB7MHg3NSwweGQwLDB4MDAsMHhjMCwweDg2LDB4NzUsMHg4NiwweDAwLDB4ZTUsMHg5MSwweGMyLDB4ZTQsMHhmNSwweDkxfSB9LAoreyAxMywgMHgwMjA5LCAwLCB7MHg5MCwweDg4LDB4MDAsMHhlMCwweGY1LDB4NDEsMHg5MCwweDdmLDB4YWIsMHg3NCwweDAyLDB4ZjAsMHg5MH0gfSwKK3sgIDksIDB4MDIxNiwgMCwgezB4N2YsMHhhYiwweDc0LDB4MDIsMHhmMCwweGU1LDB4MzIsMHg2MCwweDIxfSB9LAoreyAgNCwgMHgwMjFmLCAwLCB7MHg3YSwweDAwLDB4N2IsMHgwMH0gfSwKK3sgMTEsIDB4MDIyMywgMCwgezB4YzMsMHhlYSwweDk0LDB4MTgsMHhlYiwweDY0LDB4ODAsMHg5NCwweDgwLDB4NTAsMHgxMn0gfSwKK3sgMTQsIDB4MDIyZSwgMCwgezB4OTAsMHg3ZiwweDY5LDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweDBhLDB4YmEsMHgwMH0gfSwKK3sgIDIsIDB4MDIzYywgMCwgezB4MDEsMHgwYn0gfSwKK3sgIDIsIDB4MDIzZSwgMCwgezB4ODAsMHhlM30gfSwKK3sgIDIsIDB4MDI0MCwgMCwgezB4ZDAsMHg4Nn0gfSwKK3sgMTQsIDB4MDI0MiwgMCwgezB4ZDAsMHhkMCwweGQwLDB4MDMsMHhkMCwweDAyLDB4ZDAsMHg4MywweGQwLDB4ODIsMHhkMCwweGYwLDB4ZDAsMHhlMH0gfSwKK3sgIDEsIDB4MDI1MCwgMCwgezB4MzJ9IH0sCit7IDE0LCAweDAyNTEsIDAsIHsweGMwLDB4ZTAsMHhjMCwweGYwLDB4YzAsMHg4MiwweGMwLDB4ODMsMHhjMCwweGQwLDB4NzUsMHhkMCwweDAwLDB4YzB9IH0sCit7IDE0LCAweDAyNWYsIDAsIHsweDg2LDB4NzUsMHg4NiwweDAwLDB4ZTUsMHg5MSwweGMyLDB4ZTQsMHhmNSwweDkxLDB4OTAsMHg3ZiwweGFiLDB4NzR9IH0sCit7ICA0LCAweDAyNmQsIDAsIHsweDA0LDB4ZjAsMHhkMCwweDg2fSB9LAoreyAxMSwgMHgwMjcxLCAwLCB7MHhkMCwweGQwLDB4ZDAsMHg4MywweGQwLDB4ODIsMHhkMCwweGYwLDB4ZDAsMHhlMCwweDMyfSB9LAoreyAxNCwgMHgwMjdjLCAwLCB7MHhjMCwweGUwLDB4YzAsMHhmMCwweGMwLDB4ODIsMHhjMCwweDgzLDB4YzAsMHgwMiwweGMwLDB4MDMsMHhjMCwweDA0fSB9LAoreyAxNCwgMHgwMjhhLCAwLCB7MHhjMCwweDA1LDB4YzAsMHgwNiwweGMwLDB4MDcsMHhjMCwweDAwLDB4YzAsMHgwMSwweGMwLDB4ZDAsMHg3NSwweGQwfSB9LAoreyAxMywgMHgwMjk4LCAwLCB7MHgwMCwweGMwLDB4ODYsMHg3NSwweDg2LDB4MDAsMHhlNSwweDkxLDB4YzIsMHhlNCwweGY1LDB4OTEsMHg5MH0gfSwKK3sgMTIsIDB4MDJhNSwgMCwgezB4N2YsMHhhYiwweDc0LDB4MDgsMHhmMCwweDc1LDB4NmUsMHgwMCwweDc1LDB4NmYsMHgwMiwweDEyfSB9LAoreyAgNiwgMHgwMmIxLCAwLCB7MHgxMSwweDQ0LDB4NzUsMHg3MCwweDM5LDB4NzV9IH0sCit7ICA2LCAweDAyYjcsIDAsIHsweDcxLDB4MGMsMHg3NSwweDcyLDB4MDIsMHgxMn0gfSwKK3sgMTIsIDB4MDJiZCwgMCwgezB4MTEsMHg3NSwweDkwLDB4N2YsMHhkNiwweGU0LDB4ZjAsMHg3NSwweGQ4LDB4MjAsMHhkMCwweDg2fSB9LAoreyAxNCwgMHgwMmM5LCAwLCB7MHhkMCwweGQwLDB4ZDAsMHgwMSwweGQwLDB4MDAsMHhkMCwweDA3LDB4ZDAsMHgwNiwweGQwLDB4MDUsMHhkMCwweDA0fSB9LAoreyAxMywgMHgwMmQ3LCAwLCB7MHhkMCwweDAzLDB4ZDAsMHgwMiwweGQwLDB4ODMsMHhkMCwweDgyLDB4ZDAsMHhmMCwweGQwLDB4ZTAsMHgzMn0gfSwKK3sgMTQsIDB4MDJlNCwgMCwgezB4YzAsMHhlMCwweGMwLDB4ZjAsMHhjMCwweDgyLDB4YzAsMHg4MywweGMwLDB4ZDAsMHg3NSwweGQwLDB4MDAsMHhjMH0gfSwKK3sgMTQsIDB4MDJmMiwgMCwgezB4ODYsMHg3NSwweDg2LDB4MDAsMHhlNSwweDkxLDB4YzIsMHhlNCwweGY1LDB4OTEsMHg5MCwweDdmLDB4YWIsMHg3NH0gfSwKK3sgIDQsIDB4MDMwMCwgMCwgezB4MTAsMHhmMCwweGQwLDB4ODZ9IH0sCit7IDExLCAweDAzMDQsIDAsIHsweGQwLDB4ZDAsMHhkMCwweDgzLDB4ZDAsMHg4MiwweGQwLDB4ZjAsMHhkMCwweGUwLDB4MzJ9IH0sCit7IDE0LCAweDAzMGYsIDAsIHsweGMwLDB4ZTAsMHhjMCwweGYwLDB4YzAsMHg4MiwweGMwLDB4ODMsMHhjMCwweDAyLDB4YzAsMHgwMywweGMwLDB4MDR9IH0sCit7IDE0LCAweDAzMWQsIDAsIHsweGMwLDB4MDUsMHhjMCwweDA2LDB4YzAsMHgwNywweGMwLDB4MDAsMHhjMCwweDAxLDB4YzAsMHhkMCwweDc1LDB4ZDB9IH0sCit7IDEyLCAweDAzMmIsIDAsIHsweDAwLDB4YzAsMHg4NiwweDc1LDB4ODYsMHgwMCwweDc1LDB4NmUsMHgwMCwweDc1LDB4NmYsMHgwMn0gfSwKK3sgIDcsIDB4MDMzNywgMCwgezB4MTIsMHgxMSwweDQ0LDB4NzUsMHg3MCwweDQwLDB4NzV9IH0sCit7ICA2LCAweDAzM2UsIDAsIHsweDcxLDB4MGMsMHg3NSwweDcyLDB4MDIsMHgxMn0gfSwKK3sgMTQsIDB4MDM0NCwgMCwgezB4MTEsMHg3NSwweDkwLDB4N2YsMHhkNiwweDc0LDB4MDIsMHhmMCwweDkwLDB4N2YsMHhkNiwweDc0LDB4MDYsMHhmMH0gfSwKK3sgIDUsIDB4MDM1MiwgMCwgezB4NzUsMHhkOCwweDEwLDB4ZDAsMHg4Nn0gfSwKK3sgMTQsIDB4MDM1NywgMCwgezB4ZDAsMHhkMCwweGQwLDB4MDEsMHhkMCwweDAwLDB4ZDAsMHgwNywweGQwLDB4MDYsMHhkMCwweDA1LDB4ZDAsMHgwNH0gfSwKK3sgMTMsIDB4MDM2NSwgMCwgezB4ZDAsMHgwMywweGQwLDB4MDIsMHhkMCwweDgzLDB4ZDAsMHg4MiwweGQwLDB4ZjAsMHhkMCwweGUwLDB4MzJ9IH0sCit7IDEzLCAweDAzNzIsIDAsIHsweDkwLDB4N2YsMHhhNSwweDc0LDB4ODAsMHhmMCwweDkwLDB4N2YsMHhhNiwweDc0LDB4OWEsMHhmMCwweDEyfSB9LAoreyAxMiwgMHgwMzdmLCAwLCB7MHgxMCwweDFiLDB4OTAsMHg3ZiwweGE2LDB4ZTUsMHg0MiwweGYwLDB4MTIsMHgxMCwweDFiLDB4OTB9IH0sCit7IDEzLCAweDAzOGIsIDAsIHsweDdmLDB4YTYsMHhlNSwweDQzLDB4ZjAsMHgxMiwweDEwLDB4MWIsMHg5MCwweDdmLDB4YTUsMHg3NCwweDQwfSB9LAoreyAgMSwgMHgwMzk4LCAwLCB7MHhmMH0gfSwKK3sgIDEsIDB4MDM5OSwgMCwgezB4MjJ9IH0sCit7IDEzLCAweDAzOWEsIDAsIHsweDkwLDB4N2YsMHhhNSwweDc0LDB4ODAsMHhmMCwweDkwLDB4N2YsMHhhNiwweDc0LDB4OWEsMHhmMCwweDEyfSB9LAoreyAxMiwgMHgwM2E3LCAwLCB7MHgxMCwweDFiLDB4OTAsMHg3ZiwweGE2LDB4ZTUsMHg0NCwweGYwLDB4MTIsMHgxMCwweDFiLDB4OTB9IH0sCit7IDEyLCAweDAzYjMsIDAsIHsweDdmLDB4YTYsMHhlNSwweDQ1LDB4ZjAsMHgxMiwweDEwLDB4MWIsMHg5MCwweDdmLDB4YTYsMHhlNX0gfSwKK3sgMTEsIDB4MDNiZiwgMCwgezB4NDYsMHhmMCwweDEyLDB4MTAsMHgxYiwweDkwLDB4N2YsMHhhNSwweDc0LDB4NDAsMHhmMH0gfSwKK3sgIDEsIDB4MDNjYSwgMCwgezB4MjJ9IH0sCit7IDEwLCAweDAzY2IsIDAsIHsweDc1LDB4NDQsMHgwMiwweDc1LDB4NDUsMHgwMCwweDc1LDB4NDYsMHgwMCwweDEyfSB9LAoreyAgOSwgMHgwM2Q1LCAwLCB7MHgwMywweDlhLDB4NzUsMHg0MiwweDAzLDB4NzUsMHg0MywweDAwLDB4MTJ9IH0sCit7ICAyLCAweDAzZGUsIDAsIHsweDAzLDB4NzJ9IH0sCit7ICAxLCAweDAzZTAsIDAsIHsweDIyfSB9LAoreyAxMiwgMHgwM2UxLCAwLCB7MHg5MCwweDg4LDB4MDAsMHhlNSwweDM2LDB4ZjAsMHg5MCwweDg4LDB4MDAsMHg3NCwweDEwLDB4MjV9IH0sCit7ICA5LCAweDAzZWQsIDAsIHsweDM2LDB4ZjAsMHgxMiwweDAxLDB4ZGQsMHg3NSwweDQyLDB4MDEsMHg3NX0gfSwKK3sgIDksIDB4MDNmNiwgMCwgezB4NDMsMHgxOCwweDEyLDB4MDMsMHg3MiwweDc1LDB4NDQsMHgwMiwweDc1fSB9LAoreyAgOSwgMHgwM2ZmLCAwLHsweDQ1LDB4MDAsMHg3NSwweDQ2LDB4MDAsMHgxMiwweDAzLDB4OWEsMHg3NX0gfSwKK3sgIDgsIDB4MDQwOCwgMCx7MHg0MiwweDAzLDB4NzUsMHg0MywweDQ0LDB4MTIsMHgwMywweDcyfSB9LAoreyAgMSwgMHgwNDEwLCAwLHsweDIyfSB9LAoreyAxNCwgMHgwNDExLCAwLCB7MHhjMCwweGUwLDB4YzAsMHhmMCwweGMwLDB4ODIsMHhjMCwweDgzLDB4YzAsMHhkMCwweDc1LDB4ZDAsMHgwMCwweGMwfSB9LAoreyAxNCwgMHgwNDFmLCAwLCB7MHg4NiwweDc1LDB4ODYsMHgwMCwweGU1LDB4OTEsMHhjMiwweGU0LDB4ZjUsMHg5MSwweDkwLDB4N2YsMHhhYSwweDc0fSB9LAoreyAgNCwgMHgwNDJkLCAwLCB7MHgwMiwweGYwLDB4ZDAsMHg4Nn0gfSwKK3sgMTEsIDB4MDQzMSwgMCwgezB4ZDAsMHhkMCwweGQwLDB4ODMsMHhkMCwweDgyLDB4ZDAsMHhmMCwweGQwLDB4ZTAsMHgzMn0gfSwKK3sgMTQsIDB4MDQzYywgMCwgezB4YzAsMHhlMCwweGMwLDB4ZjAsMHhjMCwweDgyLDB4YzAsMHg4MywweGMwLDB4ZDAsMHg3NSwweGQwLDB4MDAsMHhjMH0gfSwKK3sgMTQsIDB4MDQ0YSwgMCwgezB4ODYsMHg3NSwweDg2LDB4MDAsMHhlNSwweDkxLDB4YzIsMHhlNCwweGY1LDB4OTEsMHg5MCwweDdmLDB4YTksMHg3NH0gfSwKK3sgIDcsIDB4MDQ1OCwgMCwgezB4MDQsMHhmMCwweDc1LDB4MzAsMHgwMSwweGQwLDB4ODZ9IH0sCit7IDExLCAweDA0NWYsIDAsIHsweGQwLDB4ZDAsMHhkMCwweDgzLDB4ZDAsMHg4MiwweGQwLDB4ZjAsMHhkMCwweGUwLDB4MzJ9IH0sCit7IDE0LCAweDA0NmEsIDAsIHsweGMwLDB4ZTAsMHhjMCwweGYwLDB4YzAsMHg4MiwweGMwLDB4ODMsMHhjMCwweGQwLDB4NzUsMHhkMCwweDAwLDB4YzB9IH0sCit7IDE0LCAweDA0NzgsIDAsIHsweDg2LDB4NzUsMHg4NiwweDAwLDB4ZTUsMHg5MSwweGMyLDB4ZTQsMHhmNSwweDkxLDB4OTAsMHg3ZiwweGFhLDB4NzR9IH0sCit7ICA3LCAweDA0ODYsIDAsIHsweDA0LDB4ZjAsMHg3NSwweDMxLDB4MDEsMHhkMCwweDg2fSB9LAoreyAxMSwgMHgwNDhkLCAwLCB7MHhkMCwweGQwLDB4ZDAsMHg4MywweGQwLDB4ODIsMHhkMCwweGYwLDB4ZDAsMHhlMCwweDMyfSB9LAoreyAxNCwgMHgwNDk4LCAwLCB7MHhjMCwweGUwLDB4YzAsMHhmMCwweGMwLDB4ODIsMHhjMCwweDgzLDB4YzAsMHhkMCwweDc1LDB4ZDAsMHgwMCwweGMwfSB9LAoreyAxMiwgMHgwNGE2LCAwLCB7MHg4NiwweDc1LDB4ODYsMHgwMCwweGU1LDB4OTEsMHhjMiwweGU1LDB4ZjUsMHg5MSwweGQwLDB4ODZ9IH0sCit7IDExLCAweDA0YjIsIDAsIHsweGQwLDB4ZDAsMHhkMCwweDgzLDB4ZDAsMHg4MiwweGQwLDB4ZjAsMHhkMCwweGUwLDB4MzJ9IH0sCit7IDE0LCAweDA0YmQsIDAsIHsweGMwLDB4ZTAsMHhjMCwweGYwLDB4YzAsMHg4MiwweGMwLDB4ODMsMHhjMCwweGQwLDB4NzUsMHhkMCwweDAwLDB4YzB9IH0sCit7IDEyLCAweDA0Y2IsIDAsIHsweDg2LDB4NzUsMHg4NiwweDAwLDB4ZTUsMHg5MSwweGMyLDB4ZTcsMHhmNSwweDkxLDB4ZDAsMHg4Nn0gfSwKK3sgMTEsIDB4MDRkNywgMCwgezB4ZDAsMHhkMCwweGQwLDB4ODMsMHhkMCwweDgyLDB4ZDAsMHhmMCwweGQwLDB4ZTAsMHgzMn0gfSwKK3sgMTIsIDB4MDRlMiwgMCwgezB4OTAsMHg3ZiwweGVhLDB4ZTAsMHhmYSwweDhhLDB4MjAsMHg5MCwweDdmLDB4OTYsMHhlNCwweGYwfSB9LAoreyAgMSwgMHgwNGVlLCAwLCB7MHgyMn0gfSwKK3sgIDcsIDB4MDRlZiwgMCwgezB4OTAsMHg3ZiwweGVhLDB4ZTAsMHhmYSwweDhhLDB4MjF9IH0sCit7ICAxLCAweDA0ZjYsIDAsIHsweDIyfSB9LAoreyAxNCwgMHgwNGY3LCAwLCB7MHg5MCwweDE3LDB4MTMsMHhlMCwweGZhLDB4OTAsMHgxNywweDE1LDB4ZTAsMHhmYiwweDc0LDB4ODAsMHgyYSwweGZhfSB9LAoreyAxNCwgMHgwNTA1LCAwLCB7MHg3NCwweDgwLDB4MmIsMHhmYiwweGVhLDB4MDMsMHgwMywweDU0LDB4M2YsMHhmYywweGVhLDB4YzQsMHgyMywweDU0fSB9LAoreyAxNCwgMHgwNTEzLCAwLCB7MHgxZiwweGZhLDB4MmMsMHhmYSwweGViLDB4MDMsMHgwMywweDU0LDB4M2YsMHhmYywweGViLDB4YzQsMHgyMywweDU0fSB9LAoreyAxMSwgMHgwNTIxLCAwLCB7MHgxZiwweGZiLDB4MmMsMHhmYiwweDkwLDB4MTcsMHgwYSwweGUwLDB4ZmMsMHg2MCwweDAyfSB9LAoreyAgMiwgMHgwNTJjLCAwLCB7MHg3YSwweDAwfSB9LAoreyAgNywgMHgwNTJlLCAwLCB7MHg5MCwweDE3LDB4MGMsMHhlMCwweGZjLDB4NjAsMHgwMn0gfSwKK3sgIDIsIDB4MDUzNSwgMCwgezB4N2IsMHgwMH0gfSwKK3sgMTEsIDB4MDUzNywgMCwgezB4ZWEsMHgyYiwweGZjLDB4YzMsMHgxMywweGY1LDB4M2EsMHg3NSwweDQ0LDB4MDIsMHg4Yn0gfSwKK3sgIDcsIDB4MDU0MiwgMCwgezB4NDUsMHg4YSwweDQ2LDB4MTIsMHgwMywweDlhLDB4NzV9IH0sCit7ICA5LCAweDA1NDksIDAsIHsweDZlLDB4MDgsMHg3NSwweDZmLDB4MDAsMHgxMiwweDExLDB4NDQsMHg3NX0gfSwKK3sgIDQsIDB4MDU1MiwgMCwgezB4NzAsMHg0NywweDc1LDB4NzF9IH0sCit7ICA4LCAweDA1NTYsIDAsIHsweDBjLDB4NzUsMHg3MiwweDAyLDB4MTIsMHgxMSwweDc1LDB4ODV9IH0sCit7ICA1LCAweDA1NWUsIDAsIHsweDNhLDB4NzMsMHgxMiwweDExLDB4YTB9IH0sCit7ICAxLCAweDA1NjMsIDAsIHsweDIyfSB9LAoreyAxNCwgMHgwNTY0LCAwLCB7MHg5MCwweDdmLDB4OTYsMHhlMCwweGZhLDB4OTAsMHg3ZiwweDk2LDB4NzQsMHg4MCwweDY1LDB4MDIsMHhmMCwweDkwfSB9LAoreyAxNCwgMHgwNTcyLCAwLCB7MHg3ZiwweGViLDB4ZTAsMHhmYSwweDkwLDB4N2YsMHhlYSwweGUwLDB4ZmIsMHg5MCwweDdmLDB4ZWYsMHhlMCwweGZjfSB9LAoreyAxNCwgMHgwNTgwLCAwLCB7MHgzMywweDk1LDB4ZTAsMHhmZCwweDhjLDB4MDUsMHg3YywweDAwLDB4OTAsMHg3ZiwweGVlLDB4ZTAsMHhmZSwweDMzfSB9LAoreyAxNCwgMHgwNThlLCAwLCB7MHg5NSwweGUwLDB4ZmYsMHhlYywweDJlLDB4ZmMsMHhlZCwweDNmLDB4ZmQsMHg5MCwweDdmLDB4ZTksMHhlMCwweGZlfSB9LAoreyAgNSwgMHgwNTljLCAwLCB7MHhiZSwweDAxLDB4MDIsMHg4MCwweDAzfSB9LAoreyAgMywgMHgwNWExLCAwLCB7MHgwMiwweDA1LDB4Zjl9IH0sCit7ICA2LCAweDA1YTQsIDAsIHsweGJjLDB4MDEsMHgyMSwweGJkLDB4MDAsMHgxZX0gfSwKK3sgMTQsIDB4MDVhYSwgMCwgezB4ZWEsMHhjNCwweDAzLDB4NTQsMHhmOCwweGZjLDB4ZWIsMHgyNSwweGUwLDB4ZmQsMHgyYywweDI0LDB4MDAsMHhmY30gfSwKK3sgMTQsIDB4MDViOCwgMCwgezB4ZTQsMHgzNCwweDE3LDB4ZmQsMHg5MCwweDdlLDB4YzAsMHhlMCwweGZlLDB4OGMsMHg4MiwweDhkLDB4ODMsMHhmMH0gfSwKK3sgIDIsIDB4MDVjNiwgMCwgezB4ODAsMHgzMX0gfSwKK3sgMTQsIDB4MDVjOCwgMCwgezB4ZWEsMHhjNCwweDAzLDB4NTQsMHhmOCwweGZhLDB4ZWIsMHgyNSwweGUwLDB4ZmIsMHgyYSwweGZhLDB4MjQsMHgwMH0gfSwKK3sgMTQsIDB4MDVkNiwgMCwgezB4ZmIsMHhlNCwweDM0LDB4MTcsMHhmYywweDkwLDB4N2UsMHhjMCwweGUwLDB4ZmQsMHg4YiwweDgyLDB4OGMsMHg4M30gfSwKK3sgMTQsIDB4MDVlNCwgMCwgezB4ZjAsMHg3NCwweDAxLDB4MmEsMHgyNCwweDAwLDB4ZmEsMHhlNCwweDM0LDB4MTcsMHhmYiwweDkwLDB4N2UsMHhjMX0gfSwKK3sgIDcsIDB4MDVmMiwgMCwgezB4ZTAsMHhmYywweDhhLDB4ODIsMHg4YiwweDgzLDB4ZjB9IH0sCit7ICAzLCAweDA1ZjksIDAsIHsweDc1LDB4MzgsMHgwMX0gfSwKK3sgIDEsIDB4MDVmYywgMCwgezB4MjJ9IH0sCit7IDE0LCAweDA1ZmQsIDAsIHsweGMwLDB4ZTAsMHhjMCwweGYwLDB4YzAsMHg4MiwweGMwLDB4ODMsMHhjMCwweDAyLDB4YzAsMHgwMywweGMwLDB4MDR9IH0sCit7IDE0LCAweDA2MGIsIDAsIHsweGMwLDB4MDUsMHhjMCwweDA2LDB4YzAsMHgwNywweGMwLDB4MDAsMHhjMCwweDAxLDB4YzAsMHhkMCwweDc1LDB4ZDB9IH0sCit7IDEzLCAweDA2MTksIDAsIHsweDAwLDB4YzAsMHg4NiwweDc1LDB4ODYsMHgwMCwweGU1LDB4OTEsMHhjMiwweGU0LDB4ZjUsMHg5MSwweDkwfSB9LAoreyAxMywgMHgwNjI2LCAwLCB7MHg3ZiwweGFhLDB4NzQsMHgwMSwweGYwLDB4MTIsMHgwNSwweDY0LDB4NzUsMHgzNywweDAwLDB4ZDAsMHg4Nn0gfSwKK3sgMTQsIDB4MDYzMywgMCwgezB4ZDAsMHhkMCwweGQwLDB4MDEsMHhkMCwweDAwLDB4ZDAsMHgwNywweGQwLDB4MDYsMHhkMCwweDA1LDB4ZDAsMHgwNH0gfSwKK3sgMTMsIDB4MDY0MSwgMCwgezB4ZDAsMHgwMywweGQwLDB4MDIsMHhkMCwweDgzLDB4ZDAsMHg4MiwweGQwLDB4ZjAsMHhkMCwweGUwLDB4MzJ9IH0sCit7IDE0LCAweDA2NGUsIDAsIHsweDkwLDB4N2YsMHhlYiwweGUwLDB4ZmEsMHg5MCwweDdmLDB4ZWEsMHhlMCwweGZiLDB4OTAsMHg3ZiwweGVlLDB4ZTB9IH0sCit7IDE0LCAweDA2NWMsIDAsIHsweGZjLDB4MzMsMHg5NSwweGUwLDB4ZmQsMHg5MCwweDdmLDB4OTYsMHhlMCwweGZlLDB4OTAsMHg3ZiwweDk2LDB4NzR9IH0sCit7IDE0LCAweDA2NmEsIDAsIHsweDgwLDB4NjUsMHgwNiwweGYwLDB4OTAsMHg3ZiwweDAwLDB4NzQsMHgwMSwweGYwLDB4ZWEsMHhjNCwweDAzLDB4NTR9IH0sCit7IDE0LCAweDA2NzgsIDAsIHsweGY4LDB4ZmUsMHhlYiwweDI1LDB4ZTAsMHhmYiwweDJlLDB4ZmUsMHgyNCwweDAwLDB4ZmIsMHhlNCwweDM0LDB4MTd9IH0sCit7IDE0LCAweDA2ODYsIDAsIHsweGZmLDB4OGIsMHg4MiwweDhmLDB4ODMsMHhlMCwweGZiLDB4NzQsMHgwMSwweDJlLDB4MjQsMHgwMCwweGZlLDB4ZTR9IH0sCit7IDE0LCAweDA2OTQsIDAsIHsweDM0LDB4MTcsMHhmZiwweDhlLDB4ODIsMHg4ZiwweDgzLDB4ZTAsMHhmZSwweDkwLDB4N2YsMHhlOSwweGUwLDB4ZmZ9IH0sCit7ICAzLCAweDA2YTIsIDAsIHsweGJmLDB4ODEsMHgwYX0gfSwKK3sgMTAsIDB4MDZhNSwgMCwgezB4OTAsMHg3ZiwweDAwLDB4ZWIsMHhmMCwweDkwLDB4N2YsMHgwMSwweGVlLDB4ZjB9IH0sCit7ICA4LCAweDA2YWYsIDAsIHsweDkwLDB4N2YsMHhlOSwweGUwLDB4ZmIsMHhiYiwweDgyLDB4MWF9IH0sCit7ICAzLCAweDA2YjcsIDAsIHsweGJhLDB4MDEsMHgwY30gfSwKK3sgMTIsIDB4MDZiYSwgMCwgezB4OTAsMHg3ZiwweDAwLDB4ZTQsMHhmMCwweDkwLDB4N2YsMHgwMSwweGU0LDB4ZjAsMHg4MCwweDBifSB9LAoreyAxMSwgMHgwNmM2LCAwLCB7MHg5MCwweDdmLDB4MDAsMHhlNCwweGYwLDB4OTAsMHg3ZiwweDAxLDB4NzQsMHhiNSwweGYwfSB9LAoreyAgOCwgMHgwNmQxLCAwLCB7MHg5MCwweDdmLDB4ZTksMHhlMCwweGZiLDB4YmIsMHg4MywweDFifSB9LAoreyAgMywgMHgwNmQ5LCAwLCB7MHhiYSwweDAxLDB4MGR9IH0sCit7IDEzLCAweDA2ZGMsIDAsIHsweDkwLDB4N2YsMHgwMCwweDc0LDB4MDEsMHhmMCwweDkwLDB4N2YsMHgwMSwweGU0LDB4ZjAsMHg4MCwweDBifSB9LAoreyAxMSwgMHgwNmU5LCAwLCB7MHg5MCwweDdmLDB4MDAsMHhlNCwweGYwLDB4OTAsMHg3ZiwweDAxLDB4NzQsMHgxMiwweGYwfSB9LAoreyAgOCwgMHgwNmY0LCAwLCB7MHg5MCwweDdmLDB4ZTksMHhlMCwweGZiLDB4YmIsMHg4NCwweDFjfSB9LAoreyAgMywgMHgwNmZjLCAwLCB7MHhiYSwweDAxLDB4MGR9IH0sCit7IDEzLCAweDA2ZmYsIDAsIHsweDkwLDB4N2YsMHgwMCwweDc0LDB4MDEsMHhmMCwweDkwLDB4N2YsMHgwMSwweGU0LDB4ZjAsMHg4MCwweDBjfSB9LAoreyAxMiwgMHgwNzBjLCAwLCB7MHg5MCwweDdmLDB4MDAsMHg3NCwweDgwLDB4ZjAsMHg5MCwweDdmLDB4MDEsMHg3NCwweDAxLDB4ZjB9IH0sCit7ICA1LCAweDA3MTgsIDAsIHsweDkwLDB4N2YsMHhiNSwweGVjLDB4ZjB9IH0sCit7ICAxLCAweDA3MWQsIDAsIHsweDIyfSB9LAoreyAxMiwgMHgwNzFlLCAwLCB7MHg3NSwweDM2LDB4MGQsMHg5MCwweDg4LDB4MDAsMHg3NCwweDFkLDB4ZjAsMHg3NSwweDZiLDB4ODB9IH0sCit7IDEwLCAweDA3MmEsIDAsIHsweDc1LDB4NmMsMHgzYywweDEyLDB4MTAsMHhlMiwweDc1LDB4NmIsMHg4MCwweDc1fSB9LAoreyAgOSwgMHgwNzM0LCAwLCB7MHg2YywweDBmLDB4MTIsMHgxMCwweGUyLDB4NzUsMHg2YiwweDgwLDB4NzV9IH0sCit7ICA5LCAweDA3M2QsIDAsIHsweDZjLDB4MDYsMHgxMiwweDEwLDB4ZTIsMHg3NSwweDZiLDB4ODAsMHg3NX0gfSwKK3sgIDcsIDB4MDc0NiwgMCwgezB4NmMsMHgwMSwweDEyLDB4MTAsMHhlMiwweDdhLDB4MDB9IH0sCit7ICAzLCAweDA3NGQsIDAsIHsweGJhLDB4ZmYsMHgwMH0gfSwKK3sgIDIsIDB4MDc1MCwgMCwgezB4NTAsMHgwYX0gfSwKK3sgMTAsIDB4MDc1MiwgMCwgezB4YzAsMHgwMiwweDEyLDB4MDEsMHhkZCwweGQwLDB4MDIsMHgwYSwweDgwLDB4ZjF9IH0sCit7IDEwLCAweDA3NWMsIDAsIHsweDc1LDB4NmIsMHg4MCwweDc1LDB4NmMsMHgzYywweDEyLDB4MTAsMHhlMiwweDc1fSB9LAoreyAgOCwgMHgwNzY2LCAwLCB7MHg2YiwweDgwLDB4NzUsMHg2YywweDBmLDB4MTIsMHgxMCwweGUyfSB9LAoreyAgMSwgMHgwNzZlLCAwLCB7MHgyMn0gfSwKK3sgMTQsIDB4MDc2ZiwgMCwgezB4OTAsMHg3ZiwweGExLDB4ZTQsMHhmMCwweDkwLDB4N2YsMHhhZiwweDc0LDB4MDEsMHhmMCwweDkwLDB4N2YsMHg5Mn0gfSwKK3sgMTQsIDB4MDc3ZCwgMCwgezB4NzQsMHgwMiwweGYwLDB4NzUsMHg4ZSwweDMxLDB4NzUsMHg4OSwweDIxLDB4NzUsMHg4OCwweDAwLDB4NzUsMHhjOH0gfSwKK3sgMTQsIDB4MDc4YiwgMCwgezB4MDAsMHg3NSwweDhkLDB4NDAsMHg3NSwweDk4LDB4NDAsMHg3NSwweGMwLDB4NDAsMHg3NSwweDg3LDB4MDAsMHg3NX0gfSwKK3sgIDksIDB4MDc5OSwgMCwgezB4MjAsMHgwMCwweDc1LDB4MjEsMHgwMCwweDc1LDB4MjIsMHgwMCwweDc1fSB9LAoreyAgNSwgMHgwN2EyLCAwLCB7MHgyMywweDAwLDB4NzUsMHg0NywweDAwfSB9LAoreyAgNywgMHgwN2E3LCAwLCB7MHhjMywweGU1LDB4NDcsMHg5NCwweDIwLDB4NTAsMHgxMX0gfSwKK3sgMTMsIDB4MDdhZSwgMCwgezB4ZTUsMHg0NywweDI0LDB4MDAsMHhmNSwweDgyLDB4ZTQsMHgzNCwweDE3LDB4ZjUsMHg4MywweGU0LDB4ZjB9IH0sCit7ICA0LCAweDA3YmIsIDAsIHsweDA1LDB4NDcsMHg4MCwweGU4fSB9LAoreyAgOSwgMHgwN2JmLCAwLCB7MHhlNCwweGY1LDB4NDAsMHhmNSwweDNmLDB4ZTQsMHhmNSwweDNjLDB4ZjV9IH0sCit7ICA3LCAweDA3YzgsIDAsIHsweDNiLDB4ZTQsMHhmNSwweDNlLDB4ZjUsMHgzZCwweDc1fSB9LAoreyAxMSwgMHgwN2NmLCAwLCB7MHgzMiwweDAwLDB4NzUsMHgzNywweDAwLDB4NzUsMHgzOSwweDAwLDB4OTAsMHg3ZiwweDkzfSB9LAoreyAxNCwgMHgwN2RhLCAwLCB7MHg3NCwweDNjLDB4ZjAsMHg5MCwweDdmLDB4OWMsMHg3NCwweGZmLDB4ZjAsMHg5MCwweDdmLDB4OTYsMHg3NCwweDgwfSB9LAoreyAxNCwgMHgwN2U4LCAwLCB7MHhmMCwweDkwLDB4N2YsMHg5NCwweDc0LDB4NzAsMHhmMCwweDkwLDB4N2YsMHg5ZCwweDc0LDB4OGYsMHhmMCwweDkwfSB9LAoreyAxNCwgMHgwN2Y2LCAwLCB7MHg3ZiwweDk3LDB4ZTQsMHhmMCwweDkwLDB4N2YsMHg5NSwweDc0LDB4YzIsMHhmMCwweDkwLDB4N2YsMHg5OCwweDc0fSB9LAoreyAxNCwgMHgwODA0LCAwLCB7MHgyOCwweGYwLDB4OTAsMHg3ZiwweDllLDB4NzQsMHgyOCwweGYwLDB4OTAsMHg3ZiwweGYwLDB4ZTQsMHhmMCwweDkwfSB9LAoreyAxNCwgMHgwODEyLCAwLCB7MHg3ZiwweGYxLDB4ZTQsMHhmMCwweDkwLDB4N2YsMHhmMiwweGU0LDB4ZjAsMHg5MCwweDdmLDB4ZjMsMHhlNCwweGYwfSB9LAoreyAxNCwgMHgwODIwLCAwLCB7MHg5MCwweDdmLDB4ZjQsMHhlNCwweGYwLDB4OTAsMHg3ZiwweGY1LDB4ZTQsMHhmMCwweDkwLDB4N2YsMHhmNiwweGU0fSB9LAoreyAxNCwgMHgwODJlLCAwLCB7MHhmMCwweDkwLDB4N2YsMHhmNywweGU0LDB4ZjAsMHg5MCwweDdmLDB4ZjgsMHhlNCwweGYwLDB4OTAsMHg3ZiwweGY5fSB9LAoreyAxNCwgMHgwODNjLCAwLCB7MHg3NCwweDM4LDB4ZjAsMHg5MCwweDdmLDB4ZmEsMHg3NCwweGEwLDB4ZjAsMHg5MCwweDdmLDB4ZmIsMHg3NCwweGEwfSB9LAoreyAxNCwgMHgwODRhLCAwLCB7MHhmMCwweDkwLDB4N2YsMHhmYywweDc0LDB4YTAsMHhmMCwweDkwLDB4N2YsMHhmZCwweDc0LDB4YTAsMHhmMCwweDkwfSB9LAoreyAxNCwgMHgwODU4LCAwLCB7MHg3ZiwweGZlLDB4NzQsMHhhMCwweGYwLDB4OTAsMHg3ZiwweGZmLDB4NzQsMHhhMCwweGYwLDB4OTAsMHg3ZiwweGUwfSB9LAoreyAxNCwgMHgwODY2LCAwLCB7MHg3NCwweDAzLDB4ZjAsMHg5MCwweDdmLDB4ZTEsMHg3NCwweDAxLDB4ZjAsMHg5MCwweDdmLDB4ZGQsMHg3NCwweDgwfSB9LAoreyAxMSwgMHgwODc0LCAwLCB7MHhmMCwweDEyLDB4MTIsMHg0MywweDEyLDB4MDcsMHgxZSwweDdhLDB4MDAsMHg3YiwweDAwfSB9LAoreyAgOSwgMHgwODdmLCAwLCB7MHhjMywweGVhLDB4OTQsMHgxZSwweGViLDB4OTQsMHgwMCwweDUwLDB4MTd9IH0sCit7IDEyLCAweDA4ODgsIDAsIHsweDkwLDB4ODgsMHgwMCwweGUwLDB4ZjUsMHg0NywweDkwLDB4ODgsMHgwYiwweGUwLDB4ZjUsMHg0N30gfSwKK3sgIDksIDB4MDg5NCwgMCwgezB4OTAsMHg3ZiwweDY4LDB4ZjAsMHgwYSwweGJhLDB4MDAsMHgwMSwweDBifSB9LAoreyAgMiwgMHgwODlkLCAwLCB7MHg4MCwweGUwfSB9LAoreyAxMiwgMHgwODlmLCAwLCB7MHgxMiwweDAzLDB4ZTEsMHg5MCwweDdmLDB4ZDYsMHhlNCwweGYwLDB4N2EsMHgwMCwweDdiLDB4MDB9IH0sCit7IDEzLCAweDA4YWIsIDAsIHsweDhhLDB4MDQsMHg4YiwweDA1LDB4YzMsMHhlYSwweDk0LDB4ZTAsMHhlYiwweDk0LDB4MmUsMHg1MCwweDFhfSB9LAoreyAxNCwgMHgwOGI4LCAwLCB7MHhjMCwweDAyLDB4YzAsMHgwMywweGMwLDB4MDQsMHhjMCwweDA1LDB4MTIsMHgwMSwweGRkLDB4ZDAsMHgwNSwweGQwfSB9LAoreyAxMCwgMHgwOGM2LCAwLCB7MHgwNCwweGQwLDB4MDMsMHhkMCwweDAyLDB4MGEsMHhiYSwweDAwLDB4MDEsMHgwYn0gfSwKK3sgIDIsIDB4MDhkMCwgMCwgezB4ODAsMHhkOX0gfSwKK3sgMTMsIDB4MDhkMiwgMCwgezB4OTAsMHg3ZiwweGQ2LDB4NzQsMHgwMiwweGYwLDB4OTAsMHg3ZiwweGQ2LDB4NzQsMHgwNiwweGYwLDB4OTB9IH0sCit7IDE0LCAweDA4ZGYsIDAsIHsweDdmLDB4ZGUsMHg3NCwweDA1LDB4ZjAsMHg5MCwweDdmLDB4ZGYsMHg3NCwweDA1LDB4ZjAsMHg5MCwweDdmLDB4YWN9IH0sCit7IDE0LCAweDA4ZWQsIDAsIHsweGU0LDB4ZjAsMHg5MCwweDdmLDB4YWQsMHg3NCwweDA1LDB4ZjAsMHg3NSwweGE4LDB4ODAsMHg3NSwweGY4LDB4MTB9IH0sCit7IDEzLCAweDA4ZmIsIDAsIHsweDkwLDB4N2YsMHhhZSwweDc0LDB4MGIsMHhmMCwweDkwLDB4N2YsMHhlMiwweDc0LDB4ODgsMHhmMCwweDkwfSB9LAoreyAxMiwgMHgwOTA4LCAwLCB7MHg3ZiwweGFiLDB4NzQsMHgwOCwweGYwLDB4NzUsMHhlOCwweDExLDB4NzUsMHgzMiwweDAxLDB4NzV9IH0sCit7IDEyLCAweDA5MTQsIDAsIHsweDMxLDB4MDAsMHg3NSwweDMwLDB4MDAsMHhjMCwweDA0LDB4YzAsMHgwNSwweDEyLDB4MDQsMHhmN30gfSwKK3sgMTAsIDB4MDkyMCwgMCwgezB4ZDAsMHgwNSwweGQwLDB4MDQsMHg3NSwweDM0LDB4MDAsMHg3NSwweDM1LDB4MDF9IH0sCit7IDEzLCAweDA5MmEsIDAsIHsweDkwLDB4N2YsMHhhZSwweDc0LDB4MDMsMHhmMCwweDhjLDB4MDIsMHhiYSwweDAwLDB4MDIsMHg4MCwweDAzfSB9LAoreyAgMywgMHgwOTM3LCAwLCB7MHgwMiwweDBhLDB4M2Z9IH0sCit7IDEyLCAweDA5M2EsIDAsIHsweDg1LDB4MzMsMHgzNCwweDkwLDB4N2YsMHg5ZCwweDc0LDB4OGYsMHhmMCwweDkwLDB4N2YsMHg5N30gfSwKK3sgMTQsIDB4MDk0NiwgMCwgezB4NzQsMHgwOCwweGYwLDB4OTAsMHg3ZiwweDlkLDB4NzQsMHg4OCwweGYwLDB4OTAsMHg3ZiwweDlhLDB4ZTAsMHhmYX0gfSwKK3sgMTIsIDB4MDk1NCwgMCwgezB4NzQsMHgwNSwweDVhLDB4ZjUsMHgzMywweDkwLDB4N2YsMHg5ZCwweDc0LDB4OGYsMHhmMCwweDkwfSB9LAoreyAxMywgMHgwOTYwLCAwLCB7MHg3ZiwweDk3LDB4NzQsMHgwMiwweGYwLDB4OTAsMHg3ZiwweDlkLDB4NzQsMHg4MiwweGYwLDB4ZTUsMHgzM30gfSwKK3sgMTMsIDB4MDk2ZCwgMCwgezB4MjUsMHhlMCwweGZhLDB4OTAsMHg3ZiwweDlhLDB4ZTAsMHg1NCwweDA1LDB4ZmIsMHg0YSwweGY1LDB4MzN9IH0sCit7ICAyLCAweDA5N2EsIDAsIHsweDYwLDB4MGN9IH0sCit7IDEyLCAweDA5N2MsIDAsIHsweDkwLDB4N2YsMHg5NiwweGUwLDB4ZmEsMHg5MCwweDdmLDB4OTYsMHg3NCwweDgwLDB4NGEsMHhmMH0gfSwKK3sgMTEsIDB4MDk4OCwgMCwgezB4NzUsMHg2ZSwweDAwLDB4NzUsMHg2ZiwweDAwLDB4YzAsMHgwNCwweGMwLDB4MDUsMHgxMn0gfSwKK3sgMTQsIDB4MDk5MywgMCwgezB4MTEsMHg0NCwweGQwLDB4MDUsMHhkMCwweDA0LDB4OTAsMHgxNywweDEzLDB4ZTAsMHhmYSwweDc0LDB4ODAsMHgyYX0gfSwKK3sgIDYsIDB4MDlhMSwgMCwgezB4ZmEsMHhlNSwweDMzLDB4YjQsMHgwNCwweDI5fSB9LAoreyAgMywgMHgwOWE3LCAwLCB7MHhiYSwweGEwLDB4MDB9IH0sCit7ICAyLCAweDA5YWEsIDAsIHsweDUwLDB4MjR9IH0sCit7IDEzLCAweDA5YWMsIDAsIHsweDkwLDB4MTcsMHgxMywweGUwLDB4MDQsMHhmYiwweDBiLDB4OTAsMHgxNywweDEzLDB4ZWIsMHhmMCwweDkwfSB9LAoreyAxNCwgMHgwOWI5LCAwLCB7MHgxNywweDEzLDB4ZTAsMHhmYiwweDkwLDB4MTcsMHgxNSwweGYwLDB4YzAsMHgwMiwweGMwLDB4MDQsMHhjMCwweDA1fSB9LAoreyAgOSwgMHgwOWM3LCAwLCB7MHgxMiwweDA0LDB4ZjcsMHhkMCwweDA1LDB4ZDAsMHgwNCwweGQwLDB4MDJ9IH0sCit7ICA1LCAweDA5ZDAsIDAsIHsweGU1LDB4MzMsMHhiNCwweDAyLDB4MjZ9IH0sCit7ICA2LCAweDA5ZDUsIDAsIHsweGMzLDB4NzQsMHgwNCwweDlhLDB4NTAsMHgyMH0gfSwKK3sgMTMsIDB4MDlkYiwgMCwgezB4OTAsMHgxNywweDEzLDB4ZTAsMHhmYSwweDFhLDB4MWEsMHg5MCwweDE3LDB4MTMsMHhlYSwweGYwLDB4OTB9IH0sCit7IDEzLCAweDA5ZTgsIDAsIHsweDE3LDB4MTMsMHhlMCwweGZhLDB4OTAsMHgxNywweDE1LDB4ZjAsMHhjMCwweDA0LDB4YzAsMHgwNSwweDEyfSB9LAoreyAgNiwgMHgwOWY1LCAwLCB7MHgwNCwweGY3LDB4ZDAsMHgwNSwweGQwLDB4MDR9IH0sCit7ICA1LCAweDA5ZmIsIDAsIHsweGU1LDB4MzMsMHhiNCwweDA4LDB4MWR9IH0sCit7ICA0LCAweDBhMDAsIDAsIHsweGU1LDB4MzQsMHg3MCwweDE5fSB9LAoreyAxMCwgMHgwYTA0LCAwLCB7MHg3NCwweDAxLDB4MjUsMHgzNSwweDU0LDB4MGYsMHhmNSwweDM1LDB4ODUsMHgzNX0gfSwKK3sgMTIsIDB4MGEwZSwgMCwgezB4NzUsMHg3NSwweDc2LDB4MDAsMHhjMCwweDA0LDB4YzAsMHgwNSwweDEyLDB4MTMsMHhmZSwweGQwfSB9LAoreyAgMywgMHgwYTFhLCAwLCB7MHgwNSwweGQwLDB4MDR9IH0sCit7ICA1LCAweDBhMWQsIDAsIHsweGU1LDB4MzMsMHhiNCwweDAxLDB4MWR9IH0sCit7ICA0LCAweDBhMjIsIDAsIHsweGU1LDB4MzQsMHg3MCwweDE5fSB9LAoreyAxMCwgMHgwYTI2LCAwLCB7MHhlNSwweDM1LDB4MjQsMHhmZiwweDU0LDB4MGYsMHhmNSwweDM1LDB4ODUsMHgzNX0gfSwKK3sgMTIsIDB4MGEzMCwgMCwgezB4NzUsMHg3NSwweDc2LDB4MDAsMHhjMCwweDA0LDB4YzAsMHgwNSwweDEyLDB4MTMsMHhmZSwweGQwfSB9LAoreyAgMywgMHgwYTNjLCAwLCB7MHgwNSwweGQwLDB4MDR9IH0sCit7IDE0LCAweDBhM2YsIDAsIHsweGMwLDB4MDQsMHhjMCwweDA1LDB4MTIsMHgwMSwweGRkLDB4ZDAsMHgwNSwweGQwLDB4MDQsMHg5MCwweDdmLDB4OTZ9IH0sCit7IDE0LCAweDBhNGQsIDAsIHsweGUwLDB4ZmEsMHg5MCwweDdmLDB4OTYsMHg3NCwweDdmLDB4NWEsMHhmMCwweDkwLDB4N2YsMHg5NywweDc0LDB4MDh9IH0sCit7IDEwLCAweDBhNWIsIDAsIHsweGYwLDB4YzMsMHhlYywweDk0LDB4MDAsMHhlZCwweDk0LDB4MDIsMHg0MCwweDA4fSB9LAoreyAgOCwgMHgwYTY1LCAwLCB7MHg5MCwweDdmLDB4OTYsMHhlMCwweGZhLDB4MjAsMHhlNiwweDA4fSB9LAoreyAgOCwgMHgwYTZkLCAwLCB7MHhjMywweGU0LDB4OWMsMHg3NCwweDA4LDB4OWQsMHg1MCwweDEzfSB9LAoreyAxNCwgMHgwYTc1LCAwLCB7MHg5MCwweDdmLDB4OTYsMHhlMCwweGZhLDB4OTAsMHg3ZiwweDk2LDB4NzQsMHg0MCwweDY1LDB4MDIsMHhmMCwweDdjfSB9LAoreyAgNSwgMHgwYTgzLCAwLCB7MHgwMCwweDdkLDB4MDAsMHg4MCwweDA1fSB9LAoreyAgNSwgMHgwYTg4LCAwLCB7MHgwYywweGJjLDB4MDAsMHgwMSwweDBkfSB9LAoreyAgNSwgMHgwYThkLCAwLCB7MHhlNSwweDM4LDB4YjQsMHgwMSwweDBlfSB9LAoreyAxMywgMHgwYTkyLCAwLCB7MHhjMCwweDA0LDB4YzAsMHgwNSwweDEyLDB4MDQsMHhmNywweGQwLDB4MDUsMHhkMCwweDA0LDB4NzUsMHgzOH0gfSwKK3sgIDEsIDB4MGE5ZiwgMCwgezB4MDB9IH0sCit7ICA3LCAweDBhYTAsIDAsIHsweGU1LDB4MzEsMHg3MCwweDAzLDB4MDIsMHgwOSwweDJhfSB9LAoreyAxMCwgMHgwYWE3LCAwLCB7MHg5MCwweDdmLDB4YzksMHhlMCwweGZhLDB4NzAsMHgwMywweDAyLDB4MGMsMHgyZH0gfSwKK3sgMTQsIDB4MGFiMSwgMCwgezB4OTAsMHg3ZiwweDk2LDB4ZTAsMHhmYSwweDkwLDB4N2YsMHg5NiwweDc0LDB4ODAsMHg2NSwweDAyLDB4ZjAsMHg5MH0gfSwKK3sgIDksIDB4MGFiZiwgMCwgezB4N2QsMHhjMCwweGUwLDB4ZmEsMHhiYSwweDJjLDB4MDIsMHg4MCwweDAzfSB9LAoreyAgMywgMHgwYWM4LCAwLCB7MHgwMiwweDBiLDB4MzZ9IH0sCit7ICA1LCAweDBhY2IsIDAsIHsweDc1LDB4MzIsMHgwMCwweDdiLDB4MDB9IH0sCit7ICAzLCAweDBhZDAsIDAsIHsweGJiLDB4NjQsMHgwMH0gfSwKK3sgIDIsIDB4MGFkMywgMCwgezB4NTAsMHgxY30gfSwKK3sgMTQsIDB4MGFkNSwgMCwgezB4YzAsMHgwMiwweGMwLDB4MDMsMHhjMCwweDA0LDB4YzAsMHgwNSwweDEyLDB4MDEsMHhkZCwweGQwLDB4MDUsMHhkMH0gfSwKK3sgMTMsIDB4MGFlMywgMCwgezB4MDQsMHhkMCwweDAzLDB4ZDAsMHgwMiwweDkwLDB4ODgsMHgwZiwweGUwLDB4ZjUsMHg0NywweDBiLDB4ODB9IH0sCit7ICAxLCAweDBhZjAsIDAsIHsweGRmfSB9LAoreyAxMywgMHgwYWYxLCAwLCB7MHhjMCwweDAyLDB4YzAsMHgwNCwweGMwLDB4MDUsMHgxMiwweDA3LDB4MWUsMHgxMiwweDAzLDB4ZTEsMHgxMn0gfSwKK3sgMTIsIDB4MGFmZSwgMCwgezB4MDQsMHhmNywweGQwLDB4MDUsMHhkMCwweDA0LDB4ZDAsMHgwMiwweDc1LDB4NmUsMHgwMCwweDc1fSB9LAoreyAxMywgMHgwYjBhLCAwLCB7MHg2ZiwweDAxLDB4YzAsMHgwMiwweGMwLDB4MDQsMHhjMCwweDA1LDB4MTIsMHgxMSwweDQ0LDB4ZDAsMHgwNX0gfSwKK3sgIDksIDB4MGIxNywgMCwgezB4ZDAsMHgwNCwweGQwLDB4MDIsMHg3NSwweDcwLDB4NGQsMHg3NSwweDcxfSB9LAoreyAxMSwgMHgwYjIwLCAwLCB7MHgwYywweDc1LDB4NzIsMHgwMiwweGMwLDB4MDIsMHhjMCwweDA0LDB4YzAsMHgwNSwweDEyfSB9LAoreyAxMSwgMHgwYjJiLCAwLCB7MHgxMSwweDc1LDB4ZDAsMHgwNSwweGQwLDB4MDQsMHhkMCwweDAyLDB4MDIsMHgwYywweDJkfSB9LAoreyAgMywgMHgwYjM2LCAwLCB7MHhiYSwweDJhLDB4M2J9IH0sCit7IDEzLCAweDBiMzksIDAsIHsweDkwLDB4N2YsMHg5OCwweDc0LDB4MjAsMHhmMCwweGMwLDB4MDIsMHhjMCwweDA0LDB4YzAsMHgwNSwweDEyfSB9LAoreyAxNCwgMHgwYjQ2LCAwLCB7MHgwMSwweGRkLDB4ZDAsMHgwNSwweGQwLDB4MDQsMHhkMCwweDAyLDB4OTAsMHg3ZiwweDk4LDB4NzQsMHgyOCwweGYwfSB9LAoreyAgMiwgMHgwYjU0LCAwLCB7MHg3YiwweDAwfSB9LAoreyAgMywgMHgwYjU2LCAwLCB7MHhiYiwweDBhLDB4MDB9IH0sCit7ICA1LCAweDBiNTksIDAsIHsweDQwLDB4MDMsMHgwMiwweDBjLDB4MmR9IH0sCit7IDE0LCAweDBiNWUsIDAsIHsweGMwLDB4MDIsMHhjMCwweDAzLDB4YzAsMHgwNCwweGMwLDB4MDUsMHgxMiwweDAxLDB4ZGQsMHhkMCwweDA1LDB4ZDB9IH0sCit7ICA4LCAweDBiNmMsIDAsIHsweDA0LDB4ZDAsMHgwMywweGQwLDB4MDIsMHgwYiwweDgwLDB4ZTJ9IH0sCit7ICAzLCAweDBiNzQsIDAsIHsweGJhLDB4MmIsMHgxYX0gfSwKK3sgIDgsIDB4MGI3NywgMCwgezB4OTAsMHg3ZiwweGM5LDB4ZTAsMHhmYiwweGJiLDB4NDAsMHgxMn0gfSwKK3sgMTQsIDB4MGI3ZiwgMCwgezB4YzAsMHgwMiwweGMwLDB4MDQsMHhjMCwweDA1LDB4MTIsMHgxMiwweDA1LDB4ZDAsMHgwNSwweGQwLDB4MDQsMHhkMH0gfSwKK3sgIDQsIDB4MGI4ZCwgMCwgezB4MDIsMHgwMiwweDBjLDB4MmR9IH0sCit7ICAzLCAweDBiOTEsIDAsIHsweGJhLDB4MTAsMHgxZn0gfSwKK3sgMTQsIDB4MGI5NCwgMCwgezB4OTAsMHg3ZiwweDk2LDB4ZTAsMHhmYiwweDkwLDB4N2YsMHg5NiwweDc0LDB4ODAsMHg2NSwweDAzLDB4ZjAsMHhjMH0gfSwKK3sgMTQsIDB4MGJhMiwgMCwgezB4MDIsMHhjMCwweDA0LDB4YzAsMHgwNSwweDEyLDB4MTAsMHgzZCwweGQwLDB4MDUsMHhkMCwweDA0LDB4ZDAsMHgwMn0gfSwKK3sgIDMsIDB4MGJiMCwgMCwgezB4MDIsMHgwYywweDJkfSB9LAoreyAgMywgMHgwYmIzLCAwLCB7MHhiYSwweDExLDB4MTJ9IH0sCit7IDE0LCAweDBiYjYsIDAsIHsweGMwLDB4MDIsMHhjMCwweDA0LDB4YzAsMHgwNSwweDEyLDB4MTAsMHg2YSwweGQwLDB4MDUsMHhkMCwweDA0LDB4ZDB9IH0sCit7ICA0LCAweDBiYzQsIDAsIHsweDAyLDB4MDIsMHgwYywweDJkfSB9LAoreyAgMywgMHgwYmM4LCAwLCB7MHhiYSwweDEyLDB4MTJ9IH0sCit7IDE0LCAweDBiY2IsIDAsIHsweGMwLDB4MDIsMHhjMCwweDA0LDB4YzAsMHgwNSwweDEyLDB4MTAsMHg4ZiwweGQwLDB4MDUsMHhkMCwweDA0LDB4ZDB9IH0sCit7ICA0LCAweDBiZDksIDAsIHsweDAyLDB4MDIsMHgwYywweDJkfSB9LAoreyAgMywgMHgwYmRkLCAwLCB7MHhiYSwweDEzLDB4MGJ9IH0sCit7IDExLCAweDBiZTAsIDAsIHsweDkwLDB4N2QsMHhjMSwweGUwLDB4ZmIsMHg5MCwweDg4LDB4MDAsMHhmMCwweDgwLDB4NDJ9IH0sCit7ICAzLCAweDBiZWIsIDAsIHsweGJhLDB4MTQsMHgxMX0gfSwKK3sgMTQsIDB4MGJlZSwgMCwgezB4YzAsMHgwMiwweGMwLDB4MDQsMHhjMCwweDA1LDB4MTIsMHgxMSwweGRkLDB4ZDAsMHgwNSwweGQwLDB4MDQsMHhkMH0gfSwKK3sgIDMsIDB4MGJmYywgMCwgezB4MDIsMHg4MCwweDJlfSB9LAoreyAgMywgMHgwYmZmLCAwLCB7MHhiYSwweDE1LDB4MWR9IH0sCit7IDEyLCAweDBjMDIsIDAsIHsweDkwLDB4N2QsMHhjMSwweGUwLDB4ZjUsMHg3NSwweDkwLDB4N2QsMHhjMiwweGUwLDB4ZjUsMHg3Nn0gfSwKK3sgMTQsIDB4MGMwZSwgMCwgezB4YzAsMHgwMiwweGMwLDB4MDQsMHhjMCwweDA1LDB4MTIsMHgxMywweGZlLDB4ZDAsMHgwNSwweGQwLDB4MDQsMHhkMH0gfSwKK3sgIDMsIDB4MGMxYywgMCwgezB4MDIsMHg4MCwweDBlfSB9LAoreyAgMywgMHgwYzFmLCAwLCB7MHhiYSwweDE2LDB4MGJ9IH0sCit7IDExLCAweDBjMjIsIDAsIHsweGMwLDB4MDQsMHhjMCwweDA1LDB4MTIsMHgxMywweGEzLDB4ZDAsMHgwNSwweGQwLDB4MDR9IH0sCit7IDExLCAweDBjMmQsIDAsIHsweDkwLDB4N2YsMHhjOSwweGU0LDB4ZjAsMHg3NSwweDMxLDB4MDAsMHgwMiwweDA5LDB4MmF9IH0sCit7ICAxLCAweDBjMzgsIDAsIHsweDIyfSB9LAoreyAgNywgMHgwYzM5LCAwLCB7MHg1MywweDU1LDB4NTAsMHg0NSwweDRlLDB4NDQsMHgwMH0gfSwKK3sgIDcsIDB4MGM0MCwgMCwgezB4NTIsMHg0NSwweDUzLDB4NTUsMHg0ZCwweDQ1LDB4MDB9IH0sCit7ICA2LCAweDBjNDcsIDAsIHsweDIwLDB4NTYsMHg2ZiwweDZjLDB4MjAsMHgwMH0gfSwKK3sgMTMsIDB4MGM0ZCwgMCwgezB4NDQsMHg0MSwweDQyLDB4NTUsMHg1MywweDQyLDB4MjAsMHg3NiwweDMxLDB4MmUsMHgzMCwweDMwLDB4MDB9IH0sCit7IDE0LCAweDBjNWEsIDAsIHsweGMwLDB4ZTAsMHhjMCwweGYwLDB4YzAsMHg4MiwweGMwLDB4ODMsMHhjMCwweDAyLDB4YzAsMHgwMywweGMwLDB4MDR9IH0sCit7IDE0LCAweDBjNjgsIDAsIHsweGMwLDB4MDUsMHhjMCwweDA2LDB4YzAsMHgwNywweGMwLDB4MDAsMHhjMCwweDAxLDB4YzAsMHhkMCwweDc1LDB4ZDB9IH0sCit7IDEzLCAweDBjNzYsIDAsIHsweDAwLDB4YzAsMHg4NiwweDc1LDB4ODYsMHgwMCwweGU1LDB4OTEsMHhjMiwweGU0LDB4ZjUsMHg5MSwweDkwfSB9LAoreyAxNCwgMHgwYzgzLCAwLCB7MHg3ZiwweGFiLDB4NzQsMHgwMSwweGYwLDB4OTAsMHg3ZiwweGU4LDB4ZTAsMHhmYSwweDkwLDB4N2YsMHhlOSwweGUwfSB9LAoreyAgNiwgMHgwYzkxLCAwLCB7MHhmYiwweGJiLDB4MDAsMHgwMiwweDgwLDB4MDN9IH0sCit7ICAzLCAweDBjOTcsIDAsIHsweDAyLDB4MGQsMHgzOH0gfSwKK3sgIDMsIDB4MGM5YSwgMCwgezB4YmEsMHg4MCwweDE0fSB9LAoreyAxNCwgMHgwYzlkLCAwLCB7MHg5MCwweDdmLDB4MDAsMHg3NCwweDAxLDB4ZjAsMHg5MCwweDdmLDB4MDEsMHhlNCwweGYwLDB4OTAsMHg3ZiwweGI1fSB9LAoreyAgNiwgMHgwY2FiLCAwLCB7MHg3NCwweDAyLDB4ZjAsMHgwMiwweDBlLDB4Y2R9IH0sCit7ICA1LCAweDBjYjEsIDAsIHsweGJhLDB4ODIsMHgwMiwweDgwLDB4MDN9IH0sCit7ICAzLCAweDBjYjYsIDAsIHsweDAyLDB4MGQsMHgxZH0gfSwKK3sgIDgsIDB4MGNiOSwgMCwgezB4OTAsMHg3ZiwweGVjLDB4ZTAsMHhmYywweGJjLDB4MDEsMHgwMH0gfSwKK3sgIDIsIDB4MGNjMSwgMCwgezB4NDAsMHgyMX0gfSwKK3sgIDYsIDB4MGNjMywgMCwgezB4YzMsMHg3NCwweDA3LDB4OWMsMHg0MCwweDFifSB9LAoreyAxNCwgMHgwY2M5LCAwLCB7MHhlYywweDI0LDB4ZmYsMHgyNSwweGUwLDB4ZmQsMHgyNCwweGM2LDB4ZjUsMHg4MiwweGU0LDB4MzQsMHg3ZiwweGY1fSB9LAoreyAxMywgMHgwY2Q3LCAwLCB7MHg4MywweGUwLDB4ZmQsMHg1MywweDA1LDB4MDEsMHg5MCwweDdmLDB4MDAsMHhlZCwweGYwLDB4ODAsMHgyYn0gfSwKK3sgIDMsIDB4MGNlNCwgMCwgezB4YmMsMHg4MSwweDAwfSB9LAoreyAgMiwgMHgwY2U3LCAwLCB7MHg0MCwweDIxfSB9LAoreyAgNiwgMHgwY2U5LCAwLCB7MHhjMywweDc0LDB4ODcsMHg5YywweDQwLDB4MWJ9IH0sCit7IDE0LCAweDBjZWYsIDAsIHsweGVjLDB4MjQsMHg3ZiwweDI1LDB4ZTAsMHhmYywweDI0LDB4YjYsMHhmNSwweDgyLDB4ZTQsMHgzNCwweDdmLDB4ZjV9IH0sCit7IDEzLCAweDBjZmQsIDAsIHsweDgzLDB4ZTAsMHhmYywweDUzLDB4MDQsMHgwMSwweDkwLDB4N2YsMHgwMCwweGVjLDB4ZjAsMHg4MCwweDA1fSB9LAoreyAgNSwgMHgwZDBhLCAwLCB7MHg5MCwweDdmLDB4MDAsMHhlNCwweGYwfSB9LAoreyAxNCwgMHgwZDBmLCAwLCB7MHg5MCwweDdmLDB4MDEsMHhlNCwweGYwLDB4OTAsMHg3ZiwweGI1LDB4NzQsMHgwMiwweGYwLDB4MDIsMHgwZSwweGNkfSB9LAoreyAgNSwgMHgwZDFkLCAwLCB7MHhiYSwweDgxLDB4MDIsMHg4MCwweDAzfSB9LAoreyAgMywgMHgwZDIyLCAwLCB7MHgwMiwweDBlLDB4YzV9IH0sCit7IDE0LCAweDBkMjUsIDAsIHsweDkwLDB4N2YsMHgwMCwweGU0LDB4ZjAsMHg5MCwweDdmLDB4MDEsMHhlNCwweGYwLDB4OTAsMHg3ZiwweGI1LDB4NzR9IH0sCit7ICA1LCAweDBkMzMsIDAsIHsweDAyLDB4ZjAsMHgwMiwweDBlLDB4Y2R9IH0sCit7ICAzLCAweDBkMzgsIDAsIHsweGJiLDB4MDEsMHgyZH0gfSwKK3sgIDYsIDB4MGQzYiwgMCwgezB4YmEsMHgwMCwweDAzLDB4MDIsMHgwZSwweGNkfSB9LAoreyAgMywgMHgwZDQxLCAwLCB7MHhiYSwweDAyLDB4MTF9IH0sCit7IDEzLCAweDBkNDQsIDAsIHsweDc1LDB4NTksMHgwMCwweGMwLDB4MDIsMHhjMCwweDAzLDB4MTIsMHgwZSwweGYwLDB4ZDAsMHgwMywweGQwfSB9LAoreyAgNCwgMHgwZDUxLCAwLCB7MHgwMiwweDAyLDB4MGUsMHhjZH0gfSwKK3sgIDUsIDB4MGQ1NSwgMCwgezB4YmEsMHgyMSwweDAyLDB4ODAsMHgwM30gfSwKK3sgIDMsIDB4MGQ1YSwgMCwgezB4MDIsMHgwZSwweGNkfSB9LAoreyAxMSwgMHgwZDVkLCAwLCB7MHg3NSwweDM3LDB4MDEsMHg5MCwweDdmLDB4YzUsMHhlNCwweGYwLDB4MDIsMHgwZSwweGNkfSB9LAoreyAgMywgMHgwZDY4LCAwLCB7MHhiYiwweDAzLDB4MWZ9IH0sCit7ICA2LCAweDBkNmIsIDAsIHsweGJhLDB4MDAsMHgwMywweDAyLDB4MGUsMHhjZH0gfSwKK3sgIDUsIDB4MGQ3MSwgMCwgezB4YmEsMHgwMiwweDAyLDB4ODAsMHgwM30gfSwKK3sgIDMsIDB4MGQ3NiwgMCwgezB4MDIsMHgwZSwweGNkfSB9LAoreyAxMywgMHgwZDc5LCAwLCB7MHg3NSwweDU5LDB4MDEsMHhjMCwweDAyLDB4YzAsMHgwMywweDEyLDB4MGUsMHhmMCwweGQwLDB4MDMsMHhkMH0gfSwKK3sgIDQsIDB4MGQ4NiwgMCwgezB4MDIsMHgwMiwweDBlLDB4Y2R9IH0sCit7ICAzLCAweDBkOGEsIDAsIHsweGJiLDB4MDYsMHg1NH0gfSwKK3sgIDUsIDB4MGQ4ZCwgMCwgezB4YmEsMHg4MCwweDAyLDB4ODAsMHgwM30gfSwKK3sgIDMsIDB4MGQ5MiwgMCwgezB4MDIsMHgwZSwweGM1fSB9LAoreyAgOCwgMHgwZDk1LCAwLCB7MHg5MCwweDdmLDB4ZWIsMHhlMCwweGZjLDB4YmMsMHgwMSwweDE1fSB9LAoreyAxMiwgMHgwZDlkLCAwLCB7MHg3YywweGZiLDB4N2QsMHgwZiwweDhkLDB4MDYsMHg3ZiwweDAwLDB4OTAsMHg3ZiwweGQ0LDB4ZWV9IH0sCit7ICA5LCAweDBkYTksIDAsIHsweGYwLDB4OTAsMHg3ZiwweGQ1LDB4ZWMsMHhmMCwweDAyLDB4MGUsMHhjZH0gfSwKK3sgMTAsIDB4MGRiMiwgMCwgezB4OTAsMHg3ZiwweGViLDB4ZTAsMHhmYywweGJjLDB4MDIsMHgwMiwweDgwLDB4MDN9IH0sCit7ICAzLCAweDBkYmMsIDAsIHsweDAyLDB4MGUsMHhjNX0gfSwKK3sgMTAsIDB4MGRiZiwgMCwgezB4OTAsMHg3ZiwweGVhLDB4ZTAsMHhmYywweGJjLDB4MDAsMHgwMiwweDgwLDB4MDN9IH0sCit7ICAzLCAweDBkYzksIDAsIHsweDAyLDB4MGUsMHhjNX0gfSwKK3sgMTIsIDB4MGRjYywgMCwgezB4N2MsMHgzYiwweDdkLDB4MGYsMHg4ZCwweDA2LDB4N2YsMHgwMCwweDkwLDB4N2YsMHhkNCwweGVlfSB9LAoreyAgOSwgMHgwZGQ4LCAwLCB7MHhmMCwweDkwLDB4N2YsMHhkNSwweGVjLDB4ZjAsMHgwMiwweDBlLDB4Y2R9IH0sCit7ICA2LCAweDBkZTEsIDAsIHsweGJiLDB4MDcsMHgwMywweDAyLDB4MGUsMHhjNX0gfSwKK3sgIDMsIDB4MGRlNywgMCwgezB4YmIsMHgwOCwweDEwfSB9LAoreyAxMywgMHgwZGVhLCAwLCB7MHhhYywweDQ4LDB4OTAsMHg3ZiwweDAwLDB4ZWMsMHhmMCwweDkwLDB4N2YsMHhiNSwweDc0LDB4MDEsMHhmMH0gfSwKK3sgIDMsIDB4MGRmNywgMCwgezB4MDIsMHgwZSwweGNkfSB9LAoreyAgMywgMHgwZGZhLCAwLCB7MHhiYiwweDA5LDB4MzF9IH0sCit7ICA1LCAweDBkZmQsIDAsIHsweGJhLDB4MDAsMHgwMiwweDgwLDB4MDN9IH0sCit7ICAzLCAweDBlMDIsIDAsIHsweDAyLDB4MGUsMHhjNX0gfSwKK3sgMTQsIDB4MGUwNSwgMCwgezB4OTAsMHg3ZiwweGVhLDB4ZTAsMHhmYywweGMzLDB4NzQsMHgwMSwweDljLDB4NTAsMHgwMywweDAyLDB4MGUsMHhjNX0gfSwKK3sgIDgsIDB4MGUxMywgMCwgezB4OTAsMHg3ZiwweGVhLDB4ZTAsMHhmYywweGJjLDB4MDAsMHgwYX0gfSwKK3sgMTAsIDB4MGUxYiwgMCwgezB4OTAsMHgxNywweDIxLDB4ZTQsMHhmMCwweDkwLDB4MTcsMHgyMiwweGU0LDB4ZjB9IH0sCit7ICA5LCAweDBlMjUsIDAsIHsweDkwLDB4N2YsMHhlYSwweGUwLDB4ZjUsMHg0OCwweDAyLDB4MGUsMHhjZH0gfSwKK3sgIDMsIDB4MGUyZSwgMCwgezB4YmIsMHgwYSwweDI3fSB9LAoreyAgNSwgMHgwZTMxLCAwLCB7MHhiYSwweDgxLDB4MDIsMHg4MCwweDAzfSB9LAoreyAgMywgMHgwZTM2LCAwLCB7MHgwMiwweDBlLDB4YzV9IH0sCit7IDE0LCAweDBlMzksIDAsIHsweDkwLDB4N2YsMHhlYywweGUwLDB4ZmEsMHgyNCwweDIwLDB4ZmEsMHhlNCwweDM0LDB4MTcsMHhmYywweDhhLDB4ODJ9IH0sCit7IDE0LCAweDBlNDcsIDAsIHsweDhjLDB4ODMsMHhlMCwweGZhLDB4OTAsMHg3ZiwweDAwLDB4ZjAsMHg5MCwweDdmLDB4YjUsMHg3NCwweDAxLDB4ZjB9IH0sCit7ICAzLCAweDBlNTUsIDAsIHsweDAyLDB4MGUsMHhjZH0gfSwKK3sgIDUsIDB4MGU1OCwgMCwgezB4YmIsMHgwYiwweDAyLDB4ODAsMHgwM30gfSwKK3sgIDMsIDB4MGU1ZCwgMCwgezB4MDIsMHgwZSwweGE5fSB9LAoreyAxMywgMHgwZTYwLCAwLCB7MHg5MCwweDE3LDB4MjAsMHhlNCwweGYwLDB4OTAsMHg3ZiwweGVjLDB4ZTAsMHhmYSwweGJhLDB4MDEsMHgxYX0gfSwKK3sgIDgsIDB4MGU2ZCwgMCwgezB4OTAsMHg3ZiwweGVkLDB4ZTAsMHhmYSwweGJhLDB4MDAsMHgxMn0gfSwKK3sgMTQsIDB4MGU3NSwgMCwgezB4OTAsMHg3ZiwweGVhLDB4ZTAsMHhmYSwweDkwLDB4MTcsMHgyMSwweGYwLDB4YzAsMHgwMywweDEyLDB4MDQsMHhlMn0gfSwKK3sgIDQsIDB4MGU4MywgMCwgezB4ZDAsMHgwMywweDgwLDB4NDZ9IH0sCit7ICA4LCAweDBlODcsIDAsIHsweDkwLDB4N2YsMHhlYywweGUwLDB4ZmEsMHhiYSwweDAyLDB4M2V9IH0sCit7ICA4LCAweDBlOGYsIDAsIHsweDkwLDB4N2YsMHhlZCwweGUwLDB4ZmEsMHhiYSwweDAwLDB4MzZ9IH0sCit7IDEzLCAweDBlOTcsIDAsIHsweGMwLDB4MDMsMHgxMiwweDA0LDB4ZWYsMHhkMCwweDAzLDB4OTAsMHg3ZiwweGVhLDB4ZTAsMHhmYSwweDkwfSB9LAoreyAgNSwgMHgwZWE0LCAwLCB7MHgxNywweDIyLDB4ZjAsMHg4MCwweDI0fSB9LAoreyAgNSwgMHgwZWE5LCAwLCB7MHhiYiwweDEyLDB4MDIsMHg4MCwweDE3fSB9LAoreyAgNSwgMHgwZWFlLCAwLCB7MHhiYiwweDgxLDB4MDIsMHg4MCwweDBkfSB9LAoreyAgNSwgMHgwZWIzLCAwLCB7MHhiYiwweDgzLDB4MDIsMHg4MCwweDA4fSB9LAoreyAgNSwgMHgwZWI4LCAwLCB7MHhiYiwweDgyLDB4MDIsMHg4MCwweDAzfSB9LAoreyAgMywgMHgwZWJkLCAwLCB7MHhiYiwweDg0LDB4MDV9IH0sCit7ICA1LCAweDBlYzAsIDAsIHsweDEyLDB4MDYsMHg0ZSwweDgwLDB4MDh9IH0sCit7ICA4LCAweDBlYzUsIDAsIHsweDkwLDB4N2YsMHhiNCwweDc0LDB4MDMsMHhmMCwweDgwLDB4MDZ9IH0sCit7ICA2LCAweDBlY2QsIDAsIHsweDkwLDB4N2YsMHhiNCwweDc0LDB4MDIsMHhmMH0gfSwKK3sgIDIsIDB4MGVkMywgMCwgezB4ZDAsMHg4Nn0gfSwKK3sgMTQsIDB4MGVkNSwgMCwgezB4ZDAsMHhkMCwweGQwLDB4MDEsMHhkMCwweDAwLDB4ZDAsMHgwNywweGQwLDB4MDYsMHhkMCwweDA1LDB4ZDAsMHgwNH0gfSwKK3sgMTMsIDB4MGVlMywgMCwgezB4ZDAsMHgwMywweGQwLDB4MDIsMHhkMCwweDgzLDB4ZDAsMHg4MiwweGQwLDB4ZjAsMHhkMCwweGUwLDB4MzJ9IH0sCit7IDExLCAweDBlZjAsIDAsIHsweDkwLDB4N2YsMHhlYywweGUwLDB4ZjUsMHg1YSwweGMzLDB4OTQsMHgwMSwweDQwLDB4MWR9IH0sCit7ICA3LCAweDBlZmIsIDAsIHsweGMzLDB4NzQsMHgwNywweDk1LDB4NWEsMHg0MCwweDE2fSB9LAoreyAxMywgMHgwZjAyLCAwLCB7MHhlNSwweDVhLDB4MjQsMHhmZiwweDI1LDB4ZTAsMHhmYSwweDI0LDB4YzYsMHhmNSwweDgyLDB4ZTQsMHgzNH0gfSwKK3sgIDksIDB4MGYwZiwgMCwgezB4N2YsMHhmNSwweDgzLDB4YWEsMHg1OSwweGVhLDB4ZjAsMHg4MCwweDIyfSB9LAoreyAgNywgMHgwZjE4LCAwLCB7MHhjMywweGU1LDB4NWEsMHg5NCwweDgxLDB4NDAsMHgxYn0gfSwKK3sgIDcsIDB4MGYxZiwgMCwgezB4YzMsMHg3NCwweDg3LDB4OTUsMHg1YSwweDQwLDB4MTR9IH0sCit7IDEzLCAweDBmMjYsIDAsIHsweGU1LDB4NWEsMHgyNCwweGZmLDB4MjUsMHhlMCwweGZhLDB4MjQsMHhiNiwweGY1LDB4ODIsMHhlNCwweDM0fSB9LAoreyAgNywgMHgwZjMzLCAwLCB7MHg3ZiwweGY1LDB4ODMsMHhhYSwweDU5LDB4ZWEsMHhmMH0gfSwKK3sgIDEsIDB4MGYzYSwgMCwgezB4MjJ9IH0sCit7IDE0LCAweDBmM2IsIDAsIHsweDA5LDB4MDIsMHhiYSwweDAwLDB4MDMsMHgwMSwweDAwLDB4NDAsMHgwMCwweDA5LDB4MDQsMHgwMCwweDAwLDB4MDB9IH0sCit7IDE0LCAweDBmNDksIDAsIHsweDAxLDB4MDEsMHgwMCwweDAwLDB4MDksMHgyNCwweDAxLDB4MDAsMHgwMSwweDNkLDB4MDAsMHgwMSwweDAxLDB4MGN9IH0sCit7IDE0LCAweDBmNTcsIDAsIHsweDI0LDB4MDIsMHgwMSwweDEwLDB4MDcsMHgwMCwweDAyLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwZCwweDI0LDB4MDZ9IH0sCit7IDE0LCAweDBmNjUsIDAsIHsweDAzLDB4MDEsMHgwMiwweDE1LDB4MDAsMHgwMywweDAwLDB4MDMsMHgwMCwweDAwLDB4MDksMHgyNCwweDAzLDB4MDJ9IH0sCit7IDE0LCAweDBmNzMsIDAsIHsweDAxLDB4MDEsMHgwMCwweDAxLDB4MDAsMHgwOSwweDI0LDB4MDMsMHgwNCwweDAyLDB4MDMsMHgwMCwweDAzLDB4MDB9IH0sCit7IDE0LCAweDBmODEsIDAsIHsweDA5LDB4MjQsMHgwMywweDA1LDB4MDMsMHgwNiwweDAwLDB4MDEsMHgwMCwweDA5LDB4MDQsMHgwMSwweDAwLDB4MDB9IH0sCit7IDE0LCAweDBmOGYsIDAsIHsweDAxLDB4MDIsMHgwMCwweDAwLDB4MDksMHgwNCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDIsMHgwMCwweDAwLDB4MDd9IH0sCit7IDE0LCAweDBmOWQsIDAsIHsweDI0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwMCwweDBiLDB4MjQsMHgwMiwweDAxLDB4MDIsMHgwMiwweDEwLDB4MDF9IH0sCit7IDE0LCAweDBmYWIsIDAsIHsweDgwLDB4YmIsMHgwMCwweDA5LDB4MDUsMHg4OCwweDA1LDB4MDAsMHgwMSwweDAxLDB4MDAsMHgwMCwweDA3LDB4MjV9IH0sCit7IDE0LCAweDBmYjksIDAsIHsweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOSwweDA0LDB4MDIsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDB9IH0sCit7IDE0LCAweDBmYzcsIDAsIHsweDA3LDB4MDUsMHg4MiwweDAyLDB4NDAsMHgwMCwweDAwLDB4MDcsMHgwNSwweDAyLDB4MDIsMHg0MCwweDAwLDB4MDB9IH0sCit7IDE0LCAweDBmZDUsIDAsIHsweDA5LDB4MDQsMHgwMiwweDAxLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDUsMHg4MiwweDAyLDB4NDB9IH0sCit7IDE0LCAweDBmZTMsIDAsIHsweDAwLDB4MDAsMHgwNywweDA1LDB4MDIsMHgwMiwweDQwLDB4MDAsMHgwMCwweDA5LDB4MDUsMHg4OSwweDA1LDB4YTB9IH0sCit7IDEwLCAweDBmZjEsIDAsIHsweDAxLDB4MDEsMHgwMCwweDAwLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwfSB9LAoreyAxNCwgMHgwZmZiLCAwLCB7MHgxMiwweDAxLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDQwLDB4NDcsMHgwNSwweDk5LDB4OTksMHgwMCwweDAxfSB9LAoreyAxNCwgMHgxMDA5LCAwLCB7MHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDksMHgwMiwweGJhfSB9LAoreyAgNCwgMHgxMDE3LCAwLCB7MHgwMCwweDAzLDB4MDEsMHgwMH0gfSwKK3sgIDIsIDB4MTAxYiwgMCwgezB4N2EsMHgwMH0gfSwKK3sgIDMsIDB4MTAxZCwgMCwgezB4YmEsMHgwNSwweDAwfSB9LAoreyAgMiwgMHgxMDIwLCAwLCB7MHg1MCwweDE3fSB9LAoreyAgOCwgMHgxMDIyLCAwLCB7MHg5MCwweDdmLDB4YTUsMHhlMCwweGZiLDB4MzAsMHhlMCwweDA1fSB9LAoreyAgNSwgMHgxMDJhLCAwLCB7MHg5MCwweDAwLDB4MDEsMHg4MCwweDBkfSB9LAoreyAxMCwgMHgxMDJmLCAwLCB7MHhjMCwweDAyLDB4MTIsMHgwMSwweGRkLDB4ZDAsMHgwMiwweDBhLDB4ODAsMHhlNH0gfSwKK3sgIDMsIDB4MTAzOSwgMCwgezB4OTAsMHgwMCwweDAxfSB9LAoreyAgMSwgMHgxMDNjLCAwLCB7MHgyMn0gfSwKK3sgMTQsIDB4MTAzZCwgMCwgezB4OTAsMHg3ZCwweGMxLDB4ZTAsMHhmOSwweGEzLDB4ZTAsMHhmYSwweGEzLDB4ZTAsMHhmYiwweDdjLDB4MDAsMHg3ZH0gfSwKK3sgIDQsIDB4MTA0YiwgMCwgezB4N2UsMHhlYiwweDYwLDB4MTJ9IH0sCit7IDE0LCAweDEwNGYsIDAsIHsweDg5LDB4ODIsMHg4YSwweDgzLDB4ZTAsMHhhMywweGE5LDB4ODIsMHhhYSwweDgzLDB4OGMsMHg4MiwweDhkLDB4ODN9IH0sCit7ICA0LCAweDEwNWQsIDAsIHsweGYwLDB4MGMsMHhkYiwweGVlfSB9LAoreyAgOCwgMHgxMDYxLCAwLCB7MHg5MCwweDdkLDB4YzMsMHhlMCwweDkwLDB4N2YsMHhiOSwweGYwfSB9LAoreyAgMSwgMHgxMDY5LCAwLCB7MHgyMn0gfSwKK3sgMTQsIDB4MTA2YSwgMCwgezB4OTAsMHg3ZCwweGMxLDB4ZTAsMHhmOSwweGEzLDB4ZTAsMHhmYSwweGEzLDB4ZTAsMHhmYiwweDdjLDB4YzQsMHg3ZH0gfSwKK3sgIDQsIDB4MTA3OCwgMCwgezB4N2QsMHhlYiwweDYwLDB4ZTV9IH0sCit7IDE0LCAweDEwN2MsIDAsIHsweDhjLDB4ODIsMHg4ZCwweDgzLDB4ZTAsMHgwYywweDg5LDB4ODIsMHg4YSwweDgzLDB4ZjAsMHhhMywweGE5LDB4ODJ9IH0sCit7ICA0LCAweDEwOGEsIDAsIHsweGFhLDB4ODMsMHhkYiwweGVlfSB9LAoreyAgMSwgMHgxMDhlLCAwLCB7MHgyMn0gfSwKK3sgMTQsIDB4MTA4ZiwgMCwgezB4OTAsMHg3ZiwweGE1LDB4NzQsMHg4MCwweGYwLDB4MDUsMHg4NiwweDkwLDB4N2QsMHhjMSwweGUwLDB4MDUsMHg4Nn0gfSwKK3sgMTQsIDB4MTA5ZCwgMCwgezB4YTMsMHhmMCwweDEyLDB4MTAsMHgxYiwweDkwLDB4N2YsMHhhNiwweDA1LDB4ODYsMHhhMywweGEzLDB4ZTAsMHhmOX0gfSwKK3sgIDUsIDB4MTBhYiwgMCwgezB4NjAsMHgxNiwweGEzLDB4MDUsMHg4Nn0gfSwKK3sgMTMsIDB4MTBiMCwgMCwgezB4OTAsMHg3ZiwweGE2LDB4MDUsMHg4NiwweGUwLDB4YTMsMHgwNSwweDg2LDB4ZjAsMHhjMCwweDAxLDB4MTJ9IH0sCit7ICA2LCAweDEwYmQsIDAsIHsweDEwLDB4MWIsMHhkMCwweDAxLDB4ZDksMHhlZH0gfSwKK3sgIDYsIDB4MTBjMywgMCwgezB4OTAsMHg3ZiwweGE1LDB4NzQsMHg0MCwweGYwfSB9LAoreyAgMSwgMHgxMGM5LCAwLCB7MHgyMn0gfSwKK3sgIDgsIDB4MTBjYSwgMCwgezB4OTAsMHg4OCwweDAyLDB4NzQsMHgwMSwweGYwLDB4N2EsMHgwMH0gfSwKK3sgIDMsIDB4MTBkMiwgMCwgezB4YmEsMHhmZiwweDAwfSB9LAoreyAgMiwgMHgxMGQ1LCAwLCB7MHg1MCwweDBhfSB9LAoreyAxMCwgMHgxMGQ3LCAwLCB7MHhjMCwweDAyLDB4MTIsMHgwMSwweGRkLDB4ZDAsMHgwMiwweDBhLDB4ODAsMHhmMX0gfSwKK3sgIDEsIDB4MTBlMSwgMCwgezB4MjJ9IH0sCit7ICA1LCAweDEwZTIsIDAsIHsweGU1LDB4NmIsMHhiNCwweGMwLDB4MDh9IH0sCit7ICA4LCAweDEwZTcsIDAsIHsweDkwLDB4ODgsMHgwMywweGU1LDB4NmMsMHhmMCwweDgwLDB4MDZ9IH0sCit7ICA2LCAweDEwZWYsIDAsIHsweDkwLDB4ODgsMHgwMiwweGU1LDB4NmMsMHhmMH0gfSwKK3sgIDQsIDB4MTBmNSwgMCwgezB4N2EsMHgwMCwweDdiLDB4MDB9IH0sCit7IDExLCAweDEwZjksIDAsIHsweGMzLDB4ZWEsMHg5NCwweDMyLDB4ZWIsMHg2NCwweDgwLDB4OTQsMHg4MCwweDUwLDB4MDd9IH0sCit7ICA1LCAweDExMDQsIDAsIHsweDBhLDB4YmEsMHgwMCwweDAxLDB4MGJ9IH0sCit7ICAyLCAweDExMDksIDAsIHsweDgwLDB4ZWV9IH0sCit7ICAxLCAweDExMGIsIDAsIHsweDIyfSB9LAoreyAxMCwgMHgxMTBjLCAwLCB7MHg5MCwweDg4LDB4MDMsMHhlNSwweDZkLDB4ZjAsMHgwNSwweDM5LDB4N2EsMHgwMH0gfSwKK3sgIDMsIDB4MTExNiwgMCwgezB4YmEsMHgyOCwweDAwfSB9LAoreyAgMiwgMHgxMTE5LCAwLCB7MHg1MCwweDAzfSB9LAoreyAgMywgMHgxMTFiLCAwLCB7MHgwYSwweDgwLDB4Zjh9IH0sCit7ICA1LCAweDExMWUsIDAsIHsweGU1LDB4MzksMHhiNCwweDEwLDB4MDh9IH0sCit7ICA4LCAweDExMjMsIDAsIHsweDkwLDB4ODgsMHgwMiwweDc0LDB4YzAsMHhmMCwweDgwLDB4MGV9IH0sCit7ICA1LCAweDExMmIsIDAsIHsweGU1LDB4MzksMHhiNCwweDIwLDB4MDl9IH0sCit7ICA5LCAweDExMzAsIDAsIHsweDkwLDB4ODgsMHgwMiwweDc0LDB4ODAsMHhmMCwweDc1LDB4MzksMHgwMH0gfSwKK3sgIDIsIDB4MTEzOSwgMCwgezB4N2EsMHgwMH0gfSwKK3sgIDMsIDB4MTEzYiwgMCwgezB4YmEsMHgyOCwweDAwfSB9LAoreyAgMiwgMHgxMTNlLCAwLCB7MHg1MCwweDAzfSB9LAoreyAgMywgMHgxMTQwLCAwLCB7MHgwYSwweDgwLDB4Zjh9IH0sCit7ICAxLCAweDExNDMsIDAsIHsweDIyfSB9LAoreyAgNCwgMHgxMTQ0LCAwLCB7MHhlNSwweDZmLDB4NjAsMHgwMn0gfSwKK3sgIDIsIDB4MTE0OCwgMCwgezB4ODAsMHgwN30gfSwKK3sgIDcsIDB4MTE0YSwgMCwgezB4N2EsMHgwMCwweDc1LDB4MzksMHgwMCwweDgwLDB4MDV9IH0sCit7ICA1LCAweDExNTEsIDAsIHsweDdhLDB4NDAsMHg3NSwweDM5LDB4MTB9IH0sCit7ICA5LCAweDExNTYsIDAsIHsweGU1LDB4NmUsMHgyYSwweGZhLDB4ZTUsMHg2ZSwweDI1LDB4MzksMHhmNX0gfSwKK3sgMTAsIDB4MTE1ZiwgMCwgezB4MzksMHg5MCwweDg4LDB4MDIsMHg3NCwweDgwLDB4MmEsMHhmMCwweDdhLDB4MDB9IH0sCit7ICA4LCAweDExNjksIDAsIHsweGMzLDB4ZWEsMHg2NCwweDgwLDB4OTQsMHhhOCwweDUwLDB4MDN9IH0sCit7ICAzLCAweDExNzEsIDAsIHsweDBhLDB4ODAsMHhmNX0gfSwKK3sgIDEsIDB4MTE3NCwgMCwgezB4MjJ9IH0sCit7ICA2LCAweDExNzUsIDAsIHsweGFhLDB4NzAsMHhhYiwweDcxLDB4YWMsMHg3Mn0gfSwKK3sgMTIsIDB4MTE3YiwgMCwgezB4OGEsMHg4MiwweDhiLDB4ODMsMHg4YywweGYwLDB4MTIsMHgxNCwweGVlLDB4ZmQsMHg2MCwweDE4fSB9LAoreyAxMywgMHgxMTg3LCAwLCB7MHg4ZCwweDZkLDB4YzAsMHgwMiwweGMwLDB4MDMsMHhjMCwweDA0LDB4MTIsMHgxMSwweDBjLDB4ZDAsMHgwNH0gfSwKK3sgIDksIDB4MTE5NCwgMCwgezB4ZDAsMHgwMywweGQwLDB4MDIsMHgwYSwweGJhLDB4MDAsMHgwMSwweDBifSB9LAoreyAgMiwgMHgxMTlkLCAwLCB7MHg4MCwweGRjfSB9LAoreyAgMSwgMHgxMTlmLCAwLCB7MHgyMn0gfSwKK3sgMTMsIDB4MTFhMCwgMCwgezB4ZTUsMHg3MywweGM0LDB4NTQsMHgwZiwweGZhLDB4NTMsMHgwMiwweDBmLDB4YzMsMHg3NCwweDA5LDB4OWF9IH0sCit7ICAyLCAweDExYWQsIDAsIHsweDUwLDB4MDZ9IH0sCit7ICA2LCAweDExYWYsIDAsIHsweDc0LDB4MzcsMHgyYSwweGZiLDB4ODAsMHgwNH0gfSwKK3sgIDQsIDB4MTFiNSwgMCwgezB4NzQsMHgzMCwweDJhLDB4ZmJ9IH0sCit7IDEyLCAweDExYjksIDAsIHsweDhiLDB4NmQsMHhjMCwweDAzLDB4MTIsMHgxMSwweDBjLDB4ZDAsMHgwMywweGFhLDB4NzMsMHg1M30gfSwKK3sgIDgsIDB4MTFjNSwgMCwgezB4MDIsMHgwZiwweGMzLDB4NzQsMHgwOSwweDlhLDB4NTAsMHgwNn0gfSwKK3sgIDYsIDB4MTFjZCwgMCwgezB4NzQsMHgzNywweDJhLDB4ZmIsMHg4MCwweDA0fSB9LAoreyAgNCwgMHgxMWQzLCAwLCB7MHg3NCwweDMwLDB4MmEsMHhmYn0gfSwKK3sgIDUsIDB4MTFkNywgMCwgezB4OGIsMHg2ZCwweDEyLDB4MTEsMHgwY30gfSwKK3sgIDEsIDB4MTFkYywgMCwgezB4MjJ9IH0sCit7ICA3LCAweDExZGQsIDAsIHsweDkwLDB4N2QsMHhjMywweGUwLDB4ZmEsMHg2MCwweDBmfSB9LAoreyAxMiwgMHgxMWU0LCAwLCB7MHg5MCwweDdkLDB4YzEsMHhlMCwweGY1LDB4NmUsMHg5MCwweDdkLDB4YzIsMHhlMCwweGY1LDB4NmZ9IH0sCit7ICAzLCAweDExZjAsIDAsIHsweDEyLDB4MTEsMHg0NH0gfSwKK3sgMTIsIDB4MTFmMywgMCwgezB4OTAsMHg3ZCwweGZmLDB4ZTQsMHhmMCwweDc1LDB4NzAsMHhjNCwweDc1LDB4NzEsMHg3ZCwweDc1fSB9LAoreyAgNSwgMHgxMWZmLCAwLCB7MHg3MiwweDAxLDB4MTIsMHgxMSwweDc1fSB9LAoreyAgMSwgMHgxMjA0LCAwLCB7MHgyMn0gfSwKK3sgIDIsIDB4MTIwNSwgMCwgezB4N2EsMHgwNH0gfSwKK3sgIDMsIDB4MTIwNywgMCwgezB4YmEsMHg0MCwweDAwfSB9LAoreyAgMiwgMHgxMjBhLCAwLCB7MHg1MCwweDM2fSB9LAoreyAxNCwgMHgxMjBjLCAwLCB7MHhlYSwweDI0LDB4YzAsMHhmNSwweDgyLDB4ZTQsMHgzNCwweDdkLDB4ZjUsMHg4MywweGUwLDB4ZmIsMHg3YywweDAwfSB9LAoreyAgMywgMHgxMjFhLCAwLCB7MHhiYywweDA4LDB4MDB9IH0sCit7ICAyLCAweDEyMWQsIDAsIHsweDUwLDB4MjB9IH0sCit7ICA2LCAweDEyMWYsIDAsIHsweDhiLDB4MDUsMHhlZCwweDMwLDB4ZTcsMHgwYn0gfSwKK3sgMTEsIDB4MTIyNSwgMCwgezB4OTAsMHg3ZiwweDk2LDB4NzQsMHg0MiwweGYwLDB4NzQsMHhjMywweGYwLDB4ODAsMHgwOH0gfSwKK3sgIDgsIDB4MTIzMCwgMCwgezB4OTAsMHg3ZiwweDk2LDB4ZTQsMHhmMCwweDc0LDB4ODEsMHhmMH0gfSwKK3sgIDcsIDB4MTIzOCwgMCwgezB4ZWIsMHgyNSwweGUwLDB4ZmIsMHgwYywweDgwLDB4ZGJ9IH0sCit7ICAzLCAweDEyM2YsIDAsIHsweDBhLDB4ODAsMHhjNX0gfSwKK3sgIDEsIDB4MTI0MiwgMCwgezB4MjJ9IH0sCit7ICA0LCAweDEyNDMsIDAsIHsweDdhLDB4MDAsMHg3YiwweGVmfSB9LAoreyAgMywgMHgxMjQ3LCAwLCB7MHhiYSwweDEwLDB4MDB9IH0sCit7ICAyLCAweDEyNGEsIDAsIHsweDUwLDB4MjB9IH0sCit7IDE0LCAweDEyNGMsIDAsIHsweDc0LDB4MTEsMHgyYiwweGZiLDB4MjQsMHgwMCwweGZjLDB4ZTQsMHgzNCwweDE4LDB4ZmQsMHg4YywweDgyLDB4OGR9IH0sCit7IDE0LCAweDEyNWEsIDAsIHsweDgzLDB4ZTQsMHhmMCwweGVhLDB4MjQsMHgwMCwweGY1LDB4ODIsMHhlNCwweDM0LDB4MTksMHhmNSwweDgzLDB4ZTR9IH0sCit7ICA0LCAweDEyNjgsIDAsIHsweGYwLDB4MGEsMHg4MCwweGRifSB9LAoreyAgMSwgMHgxMjZjLCAwLCB7MHgyMn0gfSwKK3sgMTQsIDB4MTI2ZCwgMCwgezB4NzQsMHhmOCwweDI0LDB4MDAsMHhmNSwweDgyLDB4NzQsMHgwMywweDM0LDB4ODQsMHhmNSwweDgzLDB4ZTQsMHhmMH0gfSwKK3sgMTQsIDB4MTI3YiwgMCwgezB4NzQsMHhmOSwweDI0LDB4MDAsMHhmNSwweDgyLDB4NzQsMHgwMywweDM0LDB4ODQsMHhmNSwweDgzLDB4ZTQsMHhmMH0gfSwKK3sgMTQsIDB4MTI4OSwgMCwgezB4NzQsMHhmYSwweDI0LDB4MDAsMHhmNSwweDgyLDB4NzQsMHgwMywweDM0LDB4ODQsMHhmNSwweDgzLDB4ZTQsMHhmMH0gfSwKK3sgMTQsIDB4MTI5NywgMCwgezB4NzQsMHhmYiwweDI0LDB4MDAsMHhmNSwweDgyLDB4NzQsMHgwMywweDM0LDB4ODQsMHhmNSwweDgzLDB4ZTQsMHhmMH0gfSwKK3sgMTQsIDB4MTJhNSwgMCwgezB4NzQsMHhmZiwweDI0LDB4MDAsMHhmNSwweDgyLDB4NzQsMHgwMywweDM0LDB4ODQsMHhmNSwweDgzLDB4ZTQsMHhmMH0gfSwKK3sgIDEsIDB4MTJiMywgMCwgezB4MjJ9IH0sCit7IDE0LCAweDEyYjQsIDAsIHsweDEyLDB4MDMsMHhjYiwweDEyLDB4MTIsMHg2ZCwweDdhLDB4YzAsMHg3YiwweDg3LDB4N2MsMHgwMSwweDc0LDB4MDF9IH0sCit7IDE0LCAweDEyYzIsIDAsIHsweDJhLDB4ZmQsMHhlNCwweDNiLDB4ZmUsMHg4YywweDA3LDB4OGEsMHg4MiwweDhiLDB4ODMsMHg4YywweGYwLDB4NzR9IH0sCit7IDE0LCAweDEyZDAsIDAsIHsweDAxLDB4MTIsMHgxNCwweGJmLDB4MmQsMHhmYSwweGU0LDB4M2UsMHhmYiwweDhmLDB4MDQsMHg4ZCwweDgyLDB4OGV9IH0sCit7IDE0LCAweDEyZGUsIDAsIHsweDgzLDB4OGYsMHhmMCwweDc0LDB4MDYsMHgxMiwweDE0LDB4YmYsMHg3NCwweDAxLDB4MmEsMHhmZCwweGU0LDB4M2J9IH0sCit7IDE0LCAweDEyZWMsIDAsIHsweGZlLDB4OGMsMHgwNywweDhhLDB4ODIsMHg4YiwweDgzLDB4OGMsMHhmMCwweGU0LDB4MTIsMHgxNCwweGJmLDB4NzR9IH0sCit7IDE0LCAweDEyZmEsIDAsIHsweDAxLDB4MmQsMHhmYSwweGU0LDB4M2UsMHhmYiwweDhmLDB4MDQsMHg4ZCwweDgyLDB4OGUsMHg4MywweDhmLDB4ZjB9IH0sCit7IDE0LCAweDEzMDgsIDAsIHsweDc0LDB4MGIsMHgxMiwweDE0LDB4YmYsMHg3NCwweDAxLDB4MmEsMHhmZCwweGU0LDB4M2IsMHhmZSwweDhjLDB4MDd9IH0sCit7IDE0LCAweDEzMTYsIDAsIHsweDhhLDB4ODIsMHg4YiwweDgzLDB4OGMsMHhmMCwweDc0LDB4MDgsMHgxMiwweDE0LDB4YmYsMHg3NCwweDAxLDB4MmR9IH0sCit7IDE0LCAweDEzMjQsIDAsIHsweGZhLDB4ZTQsMHgzZSwweGZiLDB4OGYsMHgwNCwweDhkLDB4ODIsMHg4ZSwweDgzLDB4OGYsMHhmMCwweDc0LDB4MDF9IH0sCit7IDE0LCAweDEzMzIsIDAsIHsweDEyLDB4MTQsMHhiZiwweDJhLDB4ZmQsMHhlNCwweDNiLDB4ZmUsMHg4YywweDA3LDB4OGEsMHg4MiwweDhiLDB4ODN9IH0sCit7IDE0LCAweDEzNDAsIDAsIHsweDhjLDB4ZjAsMHhlNCwweDEyLDB4MTQsMHhiZiwweDc0LDB4MDEsMHgyZCwweGZhLDB4ZTQsMHgzZSwweGZiLDB4OGZ9IH0sCit7IDE0LCAweDEzNGUsIDAsIHsweDA0LDB4OGQsMHg4MiwweDhlLDB4ODMsMHg4ZiwweGYwLDB4NzQsMHgwMywweDEyLDB4MTQsMHhiZiwweDdkLDB4MDB9IH0sCit7ICAzLCAweDEzNWMsIDAsIHsweGJkLDB4MDYsMHgwMH0gfSwKK3sgIDIsIDB4MTM1ZiwgMCwgezB4NTAsMHgxMn0gfSwKK3sgMTEsIDB4MTM2MSwgMCwgezB4OGEsMHg4MiwweDhiLDB4ODMsMHg4YywweGYwLDB4MGEsMHhiYSwweDAwLDB4MDEsMHgwYn0gfSwKK3sgIDcsIDB4MTM2YywgMCwgezB4ZTQsMHgxMiwweDE0LDB4YmYsMHgwZCwweDgwLDB4ZTl9IH0sCit7IDEzLCAweDEzNzMsIDAsIHsweDhhLDB4ODIsMHg4YiwweDgzLDB4OGMsMHhmMCwweGU1LDB4NzQsMHgxMiwweDE0LDB4YmYsMHg3NCwweGY5fSB9LAoreyAxNCwgMHgxMzgwLCAwLCB7MHgyNCwweDAwLDB4ZjUsMHg4MiwweDc0LDB4MDMsMHgzNCwweDg0LDB4ZjUsMHg4MywweDc0LDB4MGYsMHhmMCwweDc0fSB9LAoreyAxNCwgMHgxMzhlLCAwLCB7MHhmZSwweDI0LDB4MDAsMHhmNSwweDgyLDB4NzQsMHgwMywweDM0LDB4ODQsMHhmNSwweDgzLDB4NzQsMHgwMSwweGYwfSB9LAoreyAgNiwgMHgxMzljLCAwLCB7MHgxMiwweDAzLDB4ZTEsMHgxMiwweDA0LDB4Zjd9IH0sCit7ICAxLCAweDEzYTIsIDAsIHsweDIyfSB9LAoreyAxMywgMHgxM2EzLCAwLCB7MHg5MCwweDdkLDB4YzEsMHhlMCwweGZhLDB4MjQsMHgwMCwweGZiLDB4ZTQsMHgzNCwweDE5LDB4ZmMsMHg5MH0gfSwKK3sgMTQsIDB4MTNiMCwgMCwgezB4N2QsMHhjMiwweGUwLDB4ZmQsMHg4YiwweDgyLDB4OGMsMHg4MywweGYwLDB4NzUsMHhmMCwweDExLDB4ZWEsMHhhNH0gfSwKK3sgIDMsIDB4MTNiZSwgMCwgezB4ZmEsMHg3YiwweDAwfSB9LAoreyAgMywgMHgxM2MxLCAwLCB7MHhiYiwweDEwLDB4MDB9IH0sCit7ICAyLCAweDEzYzQsIDAsIHsweDUwLDB4MjR9IH0sCit7IDE0LCAweDEzYzYsIDAsIHsweGVhLDB4MjQsMHgwMCwweGZjLDB4ZTQsMHgzNCwweDE4LDB4ZmQsMHhlYiwweDJjLDB4ZmMsMHhlNCwweDNkLDB4ZmR9IH0sCit7IDE0LCAweDEzZDQsIDAsIHsweDc0LDB4MDQsMHgyYiwweDI0LDB4YzAsMHhmNSwweDgyLDB4ZTQsMHgzNCwweDdkLDB4ZjUsMHg4MywweGUwLDB4ZmV9IH0sCit7ICA4LCAweDEzZTIsIDAsIHsweDhjLDB4ODIsMHg4ZCwweDgzLDB4ZjAsMHgwYiwweDgwLDB4ZDd9IH0sCit7IDE0LCAweDEzZWEsIDAsIHsweGVhLDB4MjQsMHgwMCwweGZhLDB4ZTQsMHgzNCwweDE4LDB4ZmIsMHg3NCwweDEwLDB4MmEsMHhmNSwweDgyLDB4ZTR9IH0sCit7ICA1LCAweDEzZjgsIDAsIHsweDNiLDB4ZjUsMHg4MywweGU0LDB4ZjB9IH0sCit7ICAxLCAweDEzZmQsIDAsIHsweDIyfSB9LAoreyAgNCwgMHgxM2ZlLCAwLCB7MHhlNSwweDc2LDB4NjAsMHgwMn0gfSwKK3sgIDIsIDB4MTQwMiwgMCwgezB4ODAsMHgxNn0gfSwKK3sgMTIsIDB4MTQwNCwgMCwgezB4NzQsMHgwZiwweDU1LDB4NzUsMHhmYSwweDhhLDB4NzUsMHgyNCwweDAwLDB4ZjUsMHg4MiwweGU0fSB9LAoreyAxMCwgMHgxNDEwLCAwLCB7MHgzNCwweDE5LDB4ZjUsMHg4MywweGUwLDB4ZjUsMHg3NCwweDEyLDB4MTIsMHhiNH0gfSwKK3sgMTAsIDB4MTQxYSwgMCwgezB4MTIsMHgxMCwweGNhLDB4NzUsMHg2ZSwweDAwLDB4NzUsMHg2ZiwweDAwLDB4MTJ9IH0sCit7ICA2LCAweDE0MjQsIDAsIHsweDExLDB4NDQsMHg3NSwweDcwLDB4YjksMHg3NX0gfSwKK3sgIDYsIDB4MTQyYSwgMCwgezB4NzEsMHgxNCwweDc1LDB4NzIsMHgwMiwweDEyfSB9LAoreyAxMSwgMHgxNDMwLCAwLCB7MHgxMSwweDc1LDB4ZTUsMHg3NiwweGI0LDB4MDIsMHgwNCwweDc0LDB4MDEsMHg4MCwweDAxfSB9LAoreyAgMSwgMHgxNDNiLCAwLCB7MHhlNH0gfSwKK3sgIDMsIDB4MTQzYywgMCwgezB4ZmEsMHg3MCwweDBmfSB9LAoreyAxMiwgMHgxNDNmLCAwLCB7MHg3NCwweDAxLDB4MjUsMHg3NSwweGY1LDB4NzMsMHhjMCwweDAyLDB4MTIsMHgxMSwweGEwLDB4ZDB9IH0sCit7ICAzLCAweDE0NGIsIDAsIHsweDAyLDB4ODAsMHgwYX0gfSwKK3sgMTAsIDB4MTQ0ZSwgMCwgezB4ODUsMHg3NSwweDczLDB4YzAsMHgwMiwweDEyLDB4MTEsMHhhMCwweGQwLDB4MDJ9IH0sCit7IDEyLCAweDE0NTgsIDAsIHsweDc1LDB4NmUsMHgwMCwweDc1LDB4NmYsMHgwMSwweGMwLDB4MDIsMHgxMiwweDExLDB4NDQsMHhkMH0gfSwKK3sgIDQsIDB4MTQ2NCwgMCwgezB4MDIsMHhlYSwweDcwLDB4MWF9IH0sCit7IDEzLCAweDE0NjgsIDAsIHsweDc1LDB4ZjAsMHgxMSwweGU1LDB4NzUsMHhhNCwweGZhLDB4MjQsMHgwMCwweGZhLDB4ZTQsMHgzNCwweDE4fSB9LAoreyAgOSwgMHgxNDc1LCAwLCB7MHhmYiwweDhhLDB4NzAsMHg4YiwweDcxLDB4NzUsMHg3MiwweDAxLDB4MTJ9IH0sCit7ICA0LCAweDE0N2UsIDAsIHsweDExLDB4NzUsMHg4MCwweDM2fSB9LAoreyAgMiwgMHgxNDgyLCAwLCB7MHg3YSwweDAwfSB9LAoreyAgMywgMHgxNDg0LCAwLCB7MHhiYSwweDEwLDB4MDB9IH0sCit7ICAyLCAweDE0ODcsIDAsIHsweDUwLDB4MmZ9IH0sCit7IDEzLCAweDE0ODksIDAsIHsweGVhLDB4MjQsMHgwMCwweGY1LDB4ODIsMHhlNCwweDM0LDB4MTksMHhmNSwweDgzLDB4ZTAsMHhmYiwweGU1fSB9LAoreyAgNCwgMHgxNDk2LCAwLCB7MHg3NSwweGI1LDB4MDMsMHgxYn0gfSwKK3sgMTQsIDB4MTQ5YSwgMCwgezB4NzUsMHhmMCwweDExLDB4ZWEsMHhhNCwweGZiLDB4MjQsMHgwMCwweGZiLDB4ZTQsMHgzNCwweDE4LDB4ZmMsMHg4Yn0gfSwKK3sgIDksIDB4MTRhOCwgMCwgezB4NzAsMHg4YywweDcxLDB4NzUsMHg3MiwweDAxLDB4YzAsMHgwMiwweDEyfSB9LAoreyAgNCwgMHgxNGIxLCAwLCB7MHgxMSwweDc1LDB4ZDAsMHgwMn0gfSwKK3sgIDMsIDB4MTRiNSwgMCwgezB4MGEsMHg4MCwweGNjfSB9LAoreyAgMSwgMHgxNGI4LCAwLCB7MHgyMn0gfSwKK3sgIDYsIDB4MTRiOSwgMCwgezB4NTAsMHg3MiwweDZmLDB4NjcsMHgyMCwweDAwfSB9LAoreyAxNCwgMHgxNGJmLCAwLCB7MHhjOCwweGMwLDB4ZTAsMHhjOCwweGMwLDB4ZTAsMHhlNSwweGYwLDB4NjAsMHgwYiwweDE0LDB4NjAsMHgwZiwweDE0fSB9LAoreyAgNywgMHgxNGNkLCAwLCB7MHg2MCwweDExLDB4MTQsMHg2MCwweDEyLDB4ODAsMHgxNX0gfSwKK3sgIDcsIDB4MTRkNCwgMCwgezB4ZDAsMHhlMCwweGE4LDB4ODIsMHhmNiwweDgwLDB4MGV9IH0sCit7ICA1LCAweDE0ZGIsIDAsIHsweGQwLDB4ZTAsMHhmMCwweDgwLDB4MDl9IH0sCit7ICA0LCAweDE0ZTAsIDAsIHsweGQwLDB4ZTAsMHg4MCwweDA1fSB9LAoreyAgNSwgMHgxNGU0LCAwLCB7MHhkMCwweGUwLDB4YTgsMHg4MiwweGYyfSB9LAoreyAgNCwgMHgxNGU5LCAwLCB7MHhjOCwweGQwLDB4ZTAsMHhjOH0gfSwKK3sgIDEsIDB4MTRlZCwgMCwgezB4MjJ9IH0sCit7IDE0LCAweDE0ZWUsIDAsIHsweGM4LDB4YzAsMHhlMCwweGU1LDB4ZjAsMHg2MCwweDBkLDB4MTQsMHg2MCwweDBmLDB4MTQsMHg2MCwweDBmLDB4MTR9IH0sCit7ICA2LCAweDE0ZmMsIDAsIHsweDYwLDB4MTAsMHg3NCwweGZmLDB4ODAsMHgwZn0gfSwKK3sgIDUsIDB4MTUwMiwgMCwgezB4YTgsMHg4MiwweGU2LDB4ODAsMHgwYX0gfSwKK3sgIDMsIDB4MTUwNywgMCwgezB4ZTAsMHg4MCwweDA3fSB9LAoreyAgNCwgMHgxNTBhLCAwLCB7MHhlNCwweDkzLDB4ODAsMHgwM30gfSwKK3sgIDMsIDB4MTUwZSwgMCwgezB4YTgsMHg4MiwweGUyfSB9LAoreyAgNCwgMHgxNTExLCAwLCB7MHhmOCwweGQwLDB4ZTAsMHhjOH0gfSwKK3sgIDEsIDB4MTUxNSwgMCwgezB4MjJ9IH0sCit7ICAwLCAweDAwMDAsIDEsIHswfSB9CisKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJpdHN0cmVhbVtdID0geworCisweDAwLDB4MDksMHgwRiwweEYwLDB4MEYsMHhGMCwweDBGLDB4RjAsIDB4MEYsMHhGMCwweDAwLDB4MDAsMHgwMSwweDYxLDB4MDAsMHgwRCwKKzB4NjQsMHg2MSwweDYyLDB4NzUsMHg3MywweDYyLDB4NzQsMHg3MiwgMHgyRSwweDZFLDB4NjMsMHg2NCwweDAwLDB4NjIsMHgwMCwweDBCLAorMHg3MywweDMxLDB4MzAsMHg3OCwweDZDLDB4NzYsMHg3MSwweDMxLCAweDMwLDB4MzAsMHgwMCwweDYzLDB4MDAsMHgwQiwweDMxLDB4MzksCisweDM5LDB4MzksMHgyRiwweDMwLDB4MzksMHgyRiwweDMyLDB4MzQsIDB4MDAsMHg2NCwweDAwLDB4MDksMHgzMSwweDMwLDB4M0EsMHgzNCwKKzB4MzIsMHgzQSwweDM0LDB4MzYsMHgwMCwweDY1LDB4MDAsMHgwMCwgMHgyRSwweEMwLDB4RkYsMHgyMCwweDE3LDB4NUYsMHg5RiwweDVCLAorMHhGRSwweEZCLDB4QkIsMHhCNywweEJCLDB4QkIsMHhGQiwweEJGLCAweEFGLDB4RUYsMHhGQiwweERGLDB4QjcsMHhGQiwweEZCLDB4N0YsCisweEJGLDB4QjcsMHhFRiwweEYyLDB4RkYsMHhGQiwweEZFLDB4RkYsIDB4RkYsMHhFRiwweEZGLDB4RkUsMHhGRiwweEJGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEFGLDB4RkYsMHhGQSwweEZGLDB4RkYsMHhGRiwgMHhDOSwweEZGLDB4RkYsMHhGRiwweERGLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZCLDB4RkYsMHhBMywweEZGLDB4RkIsCisweEZFLDB4RkYsMHhCRiwweEVGLDB4RTMsMHhGRSwweEZGLDB4QkYsIDB4RTMsMHhGRSwweEZGLDB4QkYsMHg2RiwweEZCLDB4RjYsMHhGRiwKKzB4QkYsMHhGRiwweDQ3LDB4RkYsMHhGRiwweDlGLDB4RUUsMHhGOSwgMHhGRSwweENGLDB4OUYsMHhFRiwweEZCLDB4Q0YsMHg5QiwweEVFLAorMHhGOCwweEZFLDB4RUYsMHg4RiwweEVFLDB4RkIsMHhGRSwweDBCLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhCRiwweEZGLDB4RkYsMHhGQiwweEZGLDB4RkYsIDB4QkYsMHhGRiwweEZGLDB4RkMsMHgxNywweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4N0YsMHhGRiwweEZGLDB4RkYsMHg3RiwgMHhGRiwweEZGLDB4RkIsMHhGRiwweEZGLDB4N0YsMHhGRiwweEZGLAorMHhGQywweDNGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZCLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRSwweDVGLDB4RkYsIDB4RkYsMHhGRCwweEZGLDB4RkYsMHhEQiwweEZGLDB4RkQsMHhGRiwKKzB4NzcsMHhGRiwweEZELDB4RkYsMHhGRiwweERGLDB4RkUsMHhGRCwgMHhGRiwweEZGLDB4RjIsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweEZELDB4RkYsMHhGRiwweEZGLDB4RkQsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RTEsCisweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweDNGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhFMywweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEJGLAorMHhGRiwweEZFLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4NjcsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweDdGLDB4RkYsMHhGRiwweEZGLDB4N0YsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweERGLDB4RkYsMHhGRiwweEZGLDB4MkYsMHhGRiwKKzB4RjMsMHhGRCwweEZGLDB4N0YsMHhERSwweEY3LDB4RkQsMHhGRiwgMHg3RiwweEY3LDB4N0QsMHhGRiwweDdGLDB4REYsMHhGNywweEJELAorMHhGRiwweDdGLDB4RkYsMHgxRiwweEZGLDB4RUYsMHhGQiwweEZFLCAweEZGLDB4QkYsMHhFRiwweEZCLDB4RkUsMHhGRiwweEVGLDB4RkIsCisweEZFLDB4RkYsMHhCRiwweEVGLDB4RkIsMHhGRSwweEZGLDB4RkYsIDB4M0YsMHhGRSwweDdGLDB4OUYsMHhFNywweEY5LDB4RkUsMHg3RiwKKzB4OUYsMHhFNywweEZBLDB4N0YsMHg5RiwweEU3LDB4RjksMHhGRSwgMHg3RiwweDlGLDB4RTcsMHhGRiwweEZDLDB4N0YsMHhCRiwweEJGLAorMHhFRiwweEZCLDB4RkUsMHhGRiwweEJGLDB4RUYsMHhGQiwweEI3LCAweEJGLDB4RUYsMHhGQiwweEZFLDB4RkYsMHhCRiwweEVGLDB4RkIsCisweEZGLDB4RTAsMHhGRCwweEY5LDB4RkUsMHg3RiwweDlGLDB4RTcsIDB4RjksMHhGRSwweDdGLDB4OUQsMHhGOSwweEZFLDB4N0QsMHg5RCwKKzB4RTcsMHhGOSwweEZFLDB4N0YsMHg5RiwweEVELDB4RUQsMHhGRiwgMHhGRCwweEZGLDB4N0YsMHhERiwweEY3LDB4RkQsMHhGRiwweDdGLAorMHhERiwweEZELDB4RkYsMHg3RiwweERGLDB4RjcsMHhGRCwweEZGLCAweDdGLDB4REYsMHhGRiwweDlCLDB4RkYsMHhFRiwweEZCLDB4RkUsCisweEZCLDB4QkYsMHhFRiwweEJCLDB4RkUsMHhGRiwweEFGLDB4QkIsIDB4QkUsMHhGRiwweEJGLDB4RUYsMHhGQiwweEZFLDB4RkYsMHhGRiwKKzB4QjcsMHhCRiwweERCLDB4RjYsMHhCRCwweEJGLDB4NkIsMHhEQiwgMHhGNiwweEY5LDB4QkYsMHg1QiwweEQ2LDB4RjksMHhCRiwweDZGLAorMHhEQiwweEY2LDB4RkQsMHhCRiwweEZGLDB4MEUsMHhGRiwweEZGLCAweEZGLDB4RkYsMHg1RiwweEZGLDB4RjcsMHhGRiwweEZGLDB4N0YsCisweEY3LDB4QkQsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhERiwweDlGLDB4RkYsMHhGRiwweEZGLDB4RkUsMHhGRiwKKzB4RkYsMHhFRiwweEZFLDB4RkUsMHhGRiwweEZGLDB4NzcsMHhGRiwgMHhGQiwweEZCLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGOCwweDNGLAorMHhGRiwweEZELDB4RkYsMHhGRiwweEZGLDB4RkQsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEY0LDB4N0YsMHhGRiwweEZFLDB4RkQsIDB4QkUsMHhGRiwweERGLDB4RkUsMHhGRiwweEZGLDB4RUYsMHg3RiwKKzB4RkYsMHhDRiwweEZGLDB4Q0YsMHhGRiwweEZGLDB4RkYsMHhERiwgMHhFNiwweEZGLDB4RkYsMHg3RiwweERGLDB4RjcsMHhERCwweDdGLAorMHg3RiwweERGLDB4RjcsMHhGRiwweDdGLDB4REYsMHhENywweEZELCAweEZGLDB4N0YsMHhERiwweEY3LDB4RkYsMHhDRCwweEZGLDB4RjIsCisweEZGLDB4RkYsMHg0RiwweDdGLDB4RjQsMHhGRiwweEZGLDB4RkYsIDB4RTcsMHhFRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEJCLDB4RkYsMHhFRiwweEZGLDB4RkUsMHhGRiwgMHhGRiwweEZGLDB4RUYsMHhGRiwweEZGLDB4RUYsMHhGRiwweEZCLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweDY1LCAweEVGLDB4RkYsMHhGRiwweDdGLDB4RkYsMHhGRCwweEVGLDB4RkYsCisweEZGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkUsMHhDRiwweERGLDB4RkUsMHhGRiwKKzB4RkYsMHhGQiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RjMsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRSwweERGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRSwweEJGLDB4RkYsIDB4RkYsMHhGRiwweEUzLDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEVGLDB4RUIsMHhGRiwweEZFLDB4QkYsMHhGRiwgMHhFQiwweEZGLDB4RkMsMHg3RiwweEZGLDB4RkYsMHhGRiwweEVFLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhERCwweEZGLCAweEQ2LDB4RkYsMHhGRCwweEJGLDB4RkYsMHhGQiwweEZGLDB4RkUsCisweEZELDB4RkYsMHhGRiwweEZELDB4RUYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4REUsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEJGLDB4RkYsMHhGRCwweEZGLDB4N0YsMHhCRiwgMHhGRiwweDVGLDB4REYsMHhGRiwweEZGLDB4QkYsMHg3NywweEZGLAorMHhGRiwweEZGLDB4N0YsMHhENywweEZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4QzMsMHhGRiwweEZGLDB4RkYsMHhGRiwweERGLDB4RUYsCisweEZGLDB4RkYsMHhGRSwweEZCLDB4RkYsMHhGRiwweERGLDB4QkYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhFRCwweEZGLDB4QjcsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhBRiwweDdGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4REYsMHhCRiwweERGLDB4RjMsMHhGRCwweEZCLDB4RkYsMHg1QiwKKzB4RkQsMHhGRiwweEJGLDB4RUYsMHhGNywweEZGLDB4RkYsMHg3RCwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEY4LDB4M0IsMHhGRiwweEJGLAorMHg2RiwweEZGLDB4RkUsMHhGRiwweEJGLDB4RkYsMHhFQiwweDdELCAweEZGLDB4RUYsMHhGQiwweEZFLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RjIsMHg3RiwweEZDLDB4RkYsMHgzRiwweERGLDB4RUQsIDB4RkUsMHhGRiwweEZGLDB4RkYsMHhGRiwweEVGLDB4NUYsMHhGNywKKzB4QjUsMHhGRiwweEVGLDB4RkYsMHhGRiwweEZGLDB4RTAsMHgzRiwgMHg5RiwweDlFLDB4RkYsMHhGRiwweEVGLDB4RkYsMHhERiwweEZGLAorMHhCRiwweDVGLDB4QkYsMHhDRiwweEYzLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweDY5LDB4QUYsMHgzMywweEZELDB4RkYsCisweEZCLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGQywweEZGLDB4N0YsIDB4RDksMHhGRiwweERGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGNSwKKzB4QTMsMHhERiwweDZFLDB4REUsMHhGRiwweEZGLDB4QkQsMHhGRiwgMHhGRiwweEZFLDB4RkYsMHhGRiwweEZGLDB4RkUsMHhFNywweEZELAorMHhGRiwweEZGLDB4RkYsMHhGOSwweEVGLDB4QzYsMHhGRSwweEI3LCAweEFELDB4RTUsMHhGOSwweEZGLDB4RkYsMHhGRiwweENGLDB4RkYsCisweEZGLDB4RkYsMHhDRCwweEZCLDB4N0YsMHhGRiwweEZGLDB4RkYsIDB4RjksMHhGNiwweDBGLDB4REYsMHhFQywweENGLDB4N0YsMHhGRiwKKzB4RkIsMHg3RiwweEZGLDB4RkYsMHhGRiwweEZELDB4RkYsMHhGRSwgMHhGOSwweEZELDB4N0YsMHhGRiwweDdGLDB4RkYsMHhGOSwweDVCLAorMHhGRiwweDczLDB4REMsMHhGRCwweDdCLDB4REYsMHhGRiwweEZGLCAweEZGLDB4N0IsMHhGRiwweEZGLDB4RjcsMHg1MywweEQ2LDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEQ4LDB4OUYsMHhGRSwweEZGLDB4RUYsIDB4N0YsMHhFRSwweEZGLDB4RkYsMHhGRiwweEZCLDB4RUQsMHhFRCwKKzB4RkQsMHhGRiwweEZFLDB4RkYsMHhGRiwweEZCLDB4N0YsMHhGRiwgMHhFMiwweDdGLDB4RkYsMHg2RiwweEQ4LDB4NTcsMHhGNywweEZGLAorMHhGRiwweEZGLDB4REYsMHhGRiwweEU4LDB4RkYsMHhGRiwweEZELCAweEZGLDB4RkYsMHhGQywweDdGLDB4RkYsMHhFNCwweEZGLDB4RkIsCisweEVGLDB4RkIsMHhGRSwweERGLDB4QjcsMHhFRCwweEZGLDB4RkUsIDB4REYsMHg3RiwweEZGLDB4RkUsMHg3RiwweEI3LDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweDg5LDB4RkYsMHhGRiwweENGLDB4RjMsMHhGRSwgMHg3RiwweEZGLDB4RUYsMHhGRiwweEZFLDB4N0UsMHg3RiwweEZCLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEYxLCAweEZGLDB4RUIsMHg3QSwweEQ1LDB4QkYsMHg2RiwweERCLDB4QkUsCisweEZELDB4QjcsMHhEOCwweEY2LDB4RTUsMHhCRiwweDZGLDB4RkIsIDB4RkUsMHhGNSwweEJELDB4N0UsMHgwNiwweEZGLDB4REYsMHhGNywKKzB4RkIsMHhGNiwweEZGLDB4M0YsMHhGRiwweERCLDB4RkYsMHhGRiwgMHg2RiwweEZCLDB4RjcsMHhGRiwweEZGLDB4RkYsMHhGQiwweEZFLAorMHhGNywweEFGLDB4RkYsMHhCNywweEVELDB4RUYsMHhGNywweEZFLCAweEZGLDB4RkYsMHhERiwweEZGLDB4RkUsMHhGRiwweEVGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEJGLDB4RjcsMHhGQywweDFGLDB4RUUsIDB4RkIsMHhGRSwweEJELDB4RkYsMHg3RiwweDVGLDB4RDcsMHhGRCwKKzB4RkIsMHg0MywweEZGLDB4RkYsMHhGRCwweEZGLDB4NUYsMHhGRiwgMHhGNywweEZGLDB4RjksMHgzRiwweEZGLDB4Q0YsMHhGMywweEZELAorMHhGNywweDdFLDB4RUYsMHhBNywweEY5LDB4RkUsMHg4RiwweEE3LCAweEU5LDB4RjMsMHg3RSwweDlGLDB4RkIsMHhGOCwweEZGLDB4RkYsCisweDNGLDB4RkQsMHg3RiwweDVGLDB4REYsMHhGRCwweEZGLDB4RkYsIDB4NUYsMHhGRiwweEZELDB4NUYsMHhGRiwweEZGLDB4N0YsMHhGRCwKKzB4N0YsMHhGRCwweDlGLDB4RkYsMHhFMCwweEZGLDB4RkEsMHhGOCwgMHhCRSwweDZGLDB4OUYsMHhFNiwweEY4LDB4QkUsMHgzRiwweDlBLAorMHhGOSwweEJFLDB4NkYsMHg5RiwweEUyLDB4RjksMHhGRSwweDZGLCAweDlGLDB4RjksMHhGRiwweEY1LDB4RkQsMHg3RiwweENGLDB4REYsCisweEZELDB4RkQsMHg3RiwweEZGLDB4RjUsMHhGRiwweEZGLDB4RkYsIDB4RjcsMHhGNSwweEZELDB4MEYsMHhEQiwweEZGLDB4RDMsMHhGRiwKKzB4RUIsMHhGQSwweEZGLDB4RkYsMHhCRiwweEZGLDB4RkEsMHhGRiwgMHhGRiwweENCLDB4RkIsMHhGRSwweEZGLDB4RkYsMHhFQiwweEZBLAorMHhGRSwweEZGLDB4RkYsMHhCNywweEZGLDB4RkYsMHhGRiwweEZGLCAweEJGLDB4RkYsMHhERiwweEY1LDB4RkYsMHhGRiwweEQ3LDB4RkYsCisweEZGLDB4RkYsMHhERiwweEQ3LDB4RjUsMHhGRiwweDdGLDB4RkUsIDB4NEYsMHhGRiwweEZELDB4RkYsMHg3RiwweDdGLDB4RkYsMHhBRCwKKzB4RUIsMHhGQiwweEZGLDB4QUQsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhBRiwweEVCLDB4RkIsMHhGRiwweEZDLDB4MEQsMHhGRiwweEZGLAorMHhERiwweEQyLDB4RkQsMHhGRiwweEZGLDB4RkQsMHhGNiwweEZGLCAweEZGLDB4N0YsMHhGRiwweEZGLDB4MUYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkIsMHgzRiwweDdELDB4RUIsMHgzMiwweEZFLDB4QkYsIDB4MkYsMHhFQiwweEZBLDB4QUUsMHhCRCwweEUwLDB4RkEsMHg3RSwKKzB4QkYsMHhBRCwweEVCLDB4RkEsMHhGRSwweEJGLDB4RjUsMHg3RiwgMHhGRiwweERFLDB4RkUsMHhFMywweEZCLDB4RkYsMHhGRiwweEZGLAorMHhERiwweEVGLDB4NEYsMHhERiwweEZGLDB4N0YsMHhERiwweEZGLCAweEY3LDB4RkYsMHhGRiwweEY4LDB4N0YsMHhGRiwweEZGLDB4RUYsCisweEZCLDB4RkYsMHhGRiwweEZGLDB4RUYsMHhGRiwweEZGLDB4REYsIDB4RUQsMHhGQiwweERGLDB4RkYsMHhCRiwweEZGLDB4RkYsMHhGRiwKKzB4ODEsMHhGRiwweEZGLDB4RkYsMHhGRiwweDNGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkUsMHhERCwweEZFLDB4RUYsMHhGRCwweEZGLAorMHhGRiwweEZCLDB4RkUsMHhGNywweEZGLDB4OTMsMHhGRCwweEZCLCAweDdFLDB4RkYsMHhGRSwweDg3LDB4RTksMHhGRiwweDdGLDB4QjMsCisweDlGLDB4RkUsMHhGRSwweEZGLDB4QUYsMHhGRCwweEZFLDB4N0UsIDB4M0YsMHhGRSwweDY3LDB4RkYsMHhGRiwweEY3LDB4RkYsMHhGRiwKKzB4RkMsMHhGNywweERGLDB4RkQsMHhGRiwweDdGLDB4RkYsMHhGRiwgMHg3RiwweDZELDB4RkYsMHhGRiwweEZFLDB4RkYsMHhGRiwweDJGLAorMHhGRiwweEJGLDB4RkYsMHhGRiwweEVFLDB4RkYsMHhCRSwweEZGLCAweEZGLDB4RkUsMHhGRiwweEVGLDB4RkYsMHhGRiwweEZFLDB4RkYsCisweEVGLDB4RkYsMHhGRiwweEZBLDB4NUYsMHhGRiwweEZGLDB4RkIsIDB4RkYsMHhGRiwweEVGLDB4RkYsMHhGQiwweEZFLDB4RkQsMHhGRiwKKzB4RkUsMHhGRiwweEZCLDB4RkYsMHhGRiwweEZGLDB4N0YsMHhGRiwgMHhGRSwweEJGLDB4REYsMHhGRiwweEZCLDB4RkYsMHhGRiwweEY3LAorMHhGQywweEZELDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweDdGLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGMiwweDdGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RjMsMHhGRiwweEZGLDB4RkYsMHhFRiwweEZCLDB4RkYsMHhGRiwKKzB4RkYsMHhERiwweEUyLDB4RkYsMHhGRiwweEZCLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZCLDB4RTcsMHhGRiwweEZELAorMHhGRiwweEZGLDB4RkYsMHhCRiwweEZGLDB4RkYsMHhGRiwweEVELCAweEVGLDB4RkQsMHhGRiwweEZGLDB4REYsMHhENywweEY1LDB4RkQsCisweDdGLDB4NUQsMHhGRCwweEZGLDB4N0YsMHhERiwweDk3LDB4RjQsIDB4RkQsMHg3QiwweDVGLDB4RkYsMHhDOSwweEZGLDB4RkIsMHhGRSwKKzB4RkYsMHhCRiwweEZGLDB4NUYsMHhGRiwweEZGLDB4RjcsMHhGRiwgMHhFRiwweEZELDB4RkYsMHhFRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweEY3LDB4RkYsMHhENywweEZELDB4N0QsMHg3RiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEVGLDB4REYsMHhGNywweEZELDB4RkYsCisweEJCLDB4RkYsMHhGRiwweDdGLDB4RkYsMHhGRSwweEUzLDB4RkYsIDB4RjksMHhGRSwweDdGLDB4QkYsMHhFRiwweEZCLDB4RkUsMHhGRiwKKzB4QkYsMHhGOSwweEZFLDB4RkYsMHg5RiwweEVGLDB4RjksMHhGRSwgMHhGRiwweEJGLDB4RjMsMHhEQSwweEZGLDB4MzcsMHhDRCwweEYzLAorMHg3QywweERGLDB4MzcsMHhDRCwweEYzLDB4N0YsMHgzNywweENELCAweEYzLDB4N0MsMHhERiwweDM3LDB4Q0MsMHhGMywweDdGLDB4NUEsCisweEJELDB4RjYsMHhGRCwweEJGLDB4NkYsMHhEQiwweEY2LDB4RkQsIDB4QkYsMHg2RiwweERFLDB4RkQsMHhCRiwweDZGLDB4REIsMHhGNiwKKzB4RkQsMHhCRiwweDZGLDB4RkUsMHhGMSwweDZGLDB4RUIsMHg3QSwgMHhERSwweEI3LDB4QUQsMHhFQiwweDdBLDB4REUsMHhCNywweEFGLAorMHg3QSwweERFLDB4QjcsMHhBRCwweEVCLDB4N0EsMHhERSwweEI3LCAweEZGLDB4N0UsMHhGRiwweEZFLDB4Q0QsMHhCMywweDZDLDB4REIsCisweDM2LDB4Q0QsMHhCMywweDZDLDB4REUsMHhDRCwweEIzLDB4NkMsIDB4REIsMHgzNiwweENELDB4QjMsMHg2QywweERGLDB4QzksMHhCRiwKKzB4RjcsMHhCRCwweEVGLDB4N0EsMHg5RSwweEE3LDB4QTksMHhFQSwgMHg3QSwweEI3LDB4QkQsMHhFQSwweDdCLDB4REUsMHhBNywweEJELAorMHhDQSwweDcyLDB4OEQsMHg5MSwweEZGLDB4RUYsMHhGQiwweEZFLCAweEZGLDB4QkYsMHhFRiwweEZCLDB4RkUsMHhGNywweEVGLDB4RkIsCisweEZFLDB4RkYsMHhCRiwweEVGLDB4RkIsMHhGRSwweEZGLDB4RkUsIDB4ODcsMHhGRiwweEY2LDB4RkQsMHhCRiwweDZGLDB4REIsMHhGNiwKKzB4RkQsMHhCRiwweDZGLDB4RjYsMHhGRCwweEJGLDB4NkYsMHhEQiwgMHhGNiwweEZELDB4QkYsMHg2RiwweEZFLDB4NEYsMHhGRiwweEJGLAorMHhFRiwweEJCLDB4RUUsMHhGQiwweEJFLDB4RUYsMHhCQiwweEVGLCAweEJFLDB4RUYsMHhCQiwweEVFLDB4RkIsMHhCRSwweEVGLDB4QkIsCisweEVGLDB4RkMsMHg1RiwweEZGLDB4RkYsMHhGRiwweDNGLDB4Q0YsIDB4RjMsMHhGQywweEZGLDB4M0YsMHhDRiwweEZDLDB4RkYsMHgzRiwKKzB4Q0YsMHhGMywweEZDLDB4RkYsMHgzRiwweENGLDB4RkQsMHg5RiwgMHhGRSwweEJGLDB4QUYsMHhFQiwweEZBLDB4RkUsMHhCRiwweEFGLAorMHhFQiwweEZFLDB4QkYsMHhBRiwweEVCLDB4RkEsMHhGRSwweEJGLCAweEFGLDB4RUIsMHhGRiwweEUxLDB4NkYsMHhGRCwweEZGLDB4N0YsCisweERGLDB4RjcsMHhGRCwweEZGLDB4N0YsMHhERiwweEZELDB4RkYsIDB4N0YsMHhERiwweEY3LDB4RkQsMHhGRiwweDdGLDB4REYsMHhGRiwKKzB4N0EsMHhCRiwweEZCLDB4RkUsMHhERiwweEI3LDB4RUQsMHhGQiwgMHg3RSwweERGLDB4QjcsMHhGQiwweDdFLDB4REYsMHhCNywweEVELAorMHhGQiwweDdFLDB4REYsMHhCNywweEZGLDB4QzksMHhGRiwweEZGLCAweEJGLDB4RUYsMHhGQiwweEZFLDB4RkYsMHhCRiwweEVGLDB4RkIsCisweEZGLDB4QkYsMHhFRiwweEZCLDB4RkUsMHhGRiwweEJGLDB4RUUsIDB4RkIsMHhGRSwweEJCLDB4RkYsMHhGRSwweEZGLDB4QkYsMHhFRiwKKzB4RkIsMHhGRSwweEZGLDB4QkYsMHhFRiwweEZFLDB4RkYsMHhCRiwgMHhFRiwweEZCLDB4RkUsMHhGRiwweDNGLDB4Q0YsMHhGRiwweEU3LAorMHhGRSwweEZGLDB4RjUsMHhGRCwweDc3LDB4NUQsMHhENywweDM1LCAweERELDB4NzcsMHhENywweEY1LDB4Q0QsMHg3QiwweDVELDB4RDcsCisweEY1LDB4REQsMHg3NywweEZFLDB4MjcsMHhGRiwweEZGLDB4OEIsIDB4RTIsMHhGOCwweEJFLDB4MkYsMHg4QiwweEUyLDB4RjksMHhBRiwKKzB4OEIsMHhFMiwweEY4LDB4QkUsMHgyRiwweDhCLDB4RTIsMHhGOSwgMHhGRSwweDFGLDB4RkYsMHg1RiwweEQ3LDB4RjUsMHhGRCwweDdGLAorMHg1RiwweEQ3LDB4RjUsMHhGRiwweDVGLDB4RDcsMHhGNSwweEZELCAweDdGLDB4NUYsMHhENywweEY1LDB4RkYsMHhGQSwweDNGLDB4RkUsCisweEJGLDB4QUYsMHhFQiwweEZBLDB4RkUsMHhCRiwweEFGLDB4RUIsIDB4RUMsMHhCRiwweEFGLDB4RUIsMHhGQSwweEZFLDB4QkYsMHhBRiwKKzB4RUIsMHhGRiwweEZFLDB4N0YsMHhGRCwweDdGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEU2LCAweEZGLDB4RkEsMHhERiwweEY3LDB4RkQsMHhGRiwweDdGLDB4REYsCisweEY3LDB4RkMsMHhGRiwweERGLDB4RjcsMHhGRCwweEZGLDB4N0YsIDB4REYsMHhGNywweEZELDB4RkYsMHhGNSwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkIsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweDAyLDB4RkYsMHhGRSwweEJGLDB4QUIsMHhFQiwweEZBLCAweEJFLDB4QkYsMHgyMywweEVCLDB4REUsMHgxRiwweEFGLDB4RUEsCisweEZBLDB4RkUsMHhBRiwweEFGLDB4RUIsMHhGRCwweDk3LDB4RkYsIDB4RjMsMHhGQywweDdCLDB4MUYsMHhDRiwweEYxLDB4RkMsMHg3RiwKKzB4MUYsMHhGMSwweEZDLDB4NzcsMHgxRiwweENELDB4RjEsMHhGQywgMHhGRiwweDFGLDB4RkUsMHg4NywweEZGLDB4QUYsMHhFRiwweEZBLAorMHhGRSwweEZGLDB4QUYsMHhFRiwweEZBLDB4RkQsMHhCRiwweDJCLCAweEZCLDB4N0UsMHhCRiwweEJGLDB4RUIsMHhGQiwweEZCLDB4RkIsCisweERGLDB4RkYsMHhGQiwweEY3LDB4RkYsMHhGRiwweDdGLDB4RjcsIDB4RjcsMHhGRiwweEZELDB4REYsMHhGRSwweEZDLDB4REYsMHhGRiwKKzB4REYsMHhGRiwweEZELDB4RkYsMHhEQSwweEJGLDB4RkYsMHhCQiwgMHhFRiwweEZCLDB4RjksMHhGRiwweEJFLDB4RUYsMHhGQiwweEZCLAorMHhCRiwweEVGLDB4RkIsMHhGRSwweEZGLDB4QkYsMHhFRiwweEZCLCAweEZGLDB4RjcsMHg3RiwweEZELDB4RDcsMHhGRiwweEZGLDB4N0YsCisweEZGLDB4RkYsMHhGRiwweEZFLDB4RjcsMHhGRiwweEZFLDB4RkYsIDB4RjcsMHhGRiwweEZGLDB4N0YsMHhGRiwweEZGLDB4RUMsMHhGRiwKKzB4RkYsMHhGRSwweERGLDB4QkYsMHhGRiwweEZCLDB4RkUsMHhGRiwgMHhCQiwweDY4LDB4QUUsMHgxRiwweEFFLDB4RkIsMHhGQiwweEZGLAorMHhGRiwweEJGLDB4RkYsMHhENSwweEZGLDB4N0YsMHhGRiwweEZGLCAweEY3LDB4RkUsMHhGRSwweEZGLDB4QkYsMHhFRiwweDlGLDB4RkQsCisweDdGLDB4RkYsMHhDQiwweEZGLDB4RkYsMHhERiwweEZGLDB4RkYsIDB4QkIsMHhGNywweEJGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhERiwKKzB4RkYsMHhCRiwweEZCLDB4RkYsMHhGRiwweEZGLDB4REUsMHgzRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4QTcsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RUYsMHhGRiwweDdGLDB4RkIsMHhGRCwweEZCLCAweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhDRiwweEYzLDB4N0MsCisweEZGLDB4N0YsMHg4RCwweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkIsMHhGRiwweEY3LDB4RkIsMHhGRSwweEZELDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEY3LDB4RkQsMHhGRiwweDdGLDB4RkQsMHgxRiwgMHhGRCwweEZGLDB4RkYsMHhGRiwweEZGLDB4QkYsMHhERiwweEZGLAorMHhGRiwweEZFLDB4NUMsMHhGRiwweDZELDB4RkYsMHg3RiwweEFCLCAweEU3LDB4RjEsMHhGRiwweEZELDB4OUYsMHhGRiwweEZGLDB4QUQsCisweEVCLDB4N0EsMHgzRiwweDFGLDB4RkYsMHhGRiwweEZFLDB4QkYsIDB4QUYsMHhGMywweERFLDB4RjUsMHhGRiwweDhGLDB4RkIsMHhERiwKKzB4RTYsMHg3RiwweEZGLDB4REYsMHhGMywweEZELDB4RkYsMHg3RSwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkQsMHhGNywweEYzLAorMHg3RiwweERGLDB4RjcsMHhFRiwweEZGLDB4RjYsMHgzRiwweDlGLCAweERGLDB4RkYsMHhGRiwweEVFLDB4RkYsMHhGRiwweEVGLDB4RkIsCisweEZGLDB4RkYsMHhGOSwweEZCLDB4RkUsMHg0RiwweEJGLDB4RUYsIDB4QkIsMHhGRiwweDY5LDB4QUYsMHhBRiwweEZDLDB4RkYsMHgzRiwKKzB4REQsMHhGRiwweEZDLDB4QkYsMHg4RiwweEZGLDB4RkQsMHhGMywgMHhCRiwweEVELDB4OUUsMHhGQywweEJGLDB4NkYsMHhGNSwweEQzLAorMHhERiwweEZGLDB4REIsMHhENiwweEY1LDB4RUYsMHhGRCwweEZFLCAweEZGLDB4QjksMHhGRiwweDFGLDB4RDIsMHhBOSwweEFGLDB4RkYsCisweERCLDB4RjcsMHhCRiwweEVGLDB4NDYsMHhGRiwweEZGLDB4QUQsIDB4RUIsMHg3QSwweERGLDB4RUYsMHhGNywweEZGLDB4N0YsMHhGNywKKzB4OUYsMHhFRCwweEZGLDB4N0YsMHhGRiwweEFELDB4RUIsMHg3RiwgMHhGNSwweDZGLDB4RkYsMHhGRCwweEZCLDB4RDYsMHhGNCwweEY3LAorMHhGQiwweEY5LDB4N0UsMHg3RiwweEZGLDB4NUYsMHhDMiwweEZFLCAweEJGLDB4RkQsMHhGQiwweDMzLDB4REYsMHhGOSwweDVCLDB4RkYsCisweEZGLDB4REQsMHg2NywweDdELDB4Q0YsMHhFRiwweERCLDB4RUMsIDB4RkYsMHg3NywweERELDB4RjcsMHhGRCwweEZGLDB4RkYsMHhERSwKKzB4QTcsMHhCRiwweEQ0LDB4OUYsMHhGRiwweEZGLDB4QkYsMHhFRiwgMHhGRSwweEZGLDB4REYsMHhFRiwweEJCLDB4RkYsMHhGRiwweEVGLAorMHhFQiwweEZBLDB4RkYsMHhFRiwweEJELDB4RkIsMHhGRiwweEUyLCAweDdGLDB4RkYsMHhERiwweERGLDB4RjcsMHhGRCwweEJGLDB4QkIsCisweDczLDB4RjcsMHhGRCwweDdGLDB4REYsMHhERSwweEY3LDB4QkYsIDB4RUEsMHhEQiwweEY2LDB4RkYsMHhENiwweEZGLDB4RkYsMHg2NiwKKzB4RkYsMHhCRSwweEZGLDB4QkYsMHg2QiwweEQ5LDB4RjYsMHhERiwgMHhGRiwweEZCLDB4N0UsMHg3RiwweEI3LDB4N0UsMHhGRiwweEZFLAorMHhGRiwweENELDB4RkYsMHhGRSwweDdGLDB4RkYsMHhGQywweEZELCAweDNGLDB4RkIsMHhGQiwweEY3LDB4RkYsMHhGRiwweEZCLDB4RjYsCisweDdELDB4RkUsMHg3RiwweEZGLDB4RkMsMHhGRiwweEI5LDB4RkYsIDB4RjksMHhGQSwweEZFLDB4QkYsMHhBRiwweDVCLDB4RDYsMHhFRCwKKzB4QUQsMHg3QiwweEY2LDB4RjksMHhCRiwweEVGLDB4RjgsMHhGQSwgMHhGRSwweEJGLDB4RkUsMHhFNiwweEZGLDB4RkYsMHhGNywweEZELAorMHhGRiwweDdGLDB4QkYsMHhFRiwweEYzLDB4RkYsMHhGRiwweDZGLCAweEY3LDB4RkUsMHhGRiwweEZGLDB4RjcsMHhGRCwweEZFLDB4RjcsCisweEVGLDB4RkYsMHhGQiwweEVGLDB4RkIsMHg3RSwweERFLDB4RkUsIDB4RkYsMHhCRiwweEZGLDB4RkUsMHhGRiwweEZGLDB4RkIsMHhGRiwKKzB4RkYsMHhFRiwweEZCLDB4NkYsMHhGQywweDFGLDB4RkUsMHhFNywgMHhGRiwweEZGLDB4RkYsMHhFRiwweEZGLDB4RDMsMHhCNCwweEJCLAorMHhGRiwweEZGLDB4RkQsMHhCRiwweDZGLDB4RTMsMHhGRSwweEZGLCAweEJGLDB4RkMsMHhCRiwweEY3LDB4Q0YsMHhGNywweEZELDB4RkYsCisweDJGLDB4REYsMHhBQiwweEVBLDB4RkYsMHhERiwweEU3LDB4RUEsIDB4OUEsMHhBRiwweEVGLDB4RkIsMHhGRSwweEZGLDB4RjUsMHgzRiwKKzB4RkQsMHg3RSwweEZGLDB4RDcsMHhGNSwweEZCLDB4RkYsMHhGRCwgMHhGNywweEZGLDB4N0YsMHhGRSwweEY3LDB4RkQsMHhGRiwweEQ3LAorMHhGRiwweEQ3LDB4N0YsMHhFRSwweDdGLDB4RkEsMHg3OSwweEZFLCAweDJGLDB4OEIsMHhFNiwweEY5LDB4RkUsMHgzRiwweDlFLDB4RjksCisweEJFLDB4MkYsMHgwQiwweEU3LDB4RjksMHhGRSwweDJGLDB4OUYsIDB4RkQsMHhGRiwweEZFLDB4N0QsMHg3RiwweDVGLDB4RDcsMHhGRiwKKzB4RkYsMHg3RiwweEZGLDB4RkQsMHhGRiwweDdGLDB4NUYsMHg5NywgMHhGRiwweEZELDB4N0YsMHg1RiwweEZGLDB4RTMsMHhGRiwweEZGLAorMHhGQSwweEZFLDB4QkYsMHhBRiwweEZCLDB4RkIsMHhGRiwweEZGLCAweENGLDB4RUIsMHhGRSwweEJGLDB4QUYsMHhGRiwweEZBLDB4RkUsCisweEJGLDB4RkYsMHg4NywweEZGLDB4RkYsMHhGNSwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEZELDB4RkYsMHg3RiwweEZGLDB4RkYsMHhGRiwKKzB4RkIsMHhGRiwweEZGLDB4RjUsMHhGRiwweEZGLDB4RkUsMHgwRiwgMHhGRiwweEZELDB4RUIsMHhGRiwweEZGLDB4RjcsMHhGRiwweEVGLAorMHg3QiwweERGLDB4RkUsMHhGRiwweEZGLDB4REYsMHhGNywweEZELCAweEVCLDB4N0YsMHhERiwweEZGLDB4NUYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkQsMHhCRiwweEZGLDB4N0UsMHhGQSwweEJGLDB4QzcsIDB4REIsMHhGNywweEJELDB4M0YsMHhGQiwweEZGLDB4RjYsMHhGRiwKKzB4RkEsMHhBRiwweEZGLDB4RUIsMHhGQSwweEZFLDB4M0YsMHgyRiwgMHhFQSwweEZBLDB4M0UsMHhBRCwweEM5LDB4QkEsMHhGNiwweEFELAorMHhBRiwweEVCLDB4RkEsMHhGNiwweEJGLDB4RkUsMHg3RiwweEZGLCAweEZGLDB4RkQsMHhGRiwweEYxLDB4N0YsMHgzRiwweENGLDB4RjEsCisweEVGLDB4RkYsMHg3RiwweEZGLDB4QkMsMHhERiwweERGLDB4RjcsIDB4REQsMHhGRiwweEUwLDB4N0YsMHhGRiwweEZGLDB4RkUsMHhGRiwKKzB4RkEsMHhFQywweEJCLDB4N0YsMHg1RiwweEZGLDB4RkIsMHhFQywgMHhGRiwweEVGLDB4QjcsMHhGRiwweEY3LDB4RkYsMHhGRiwweEI1LAorMHhGRiwweEZGLDB4N0YsMHhGRiwweEZGLDB4RkYsMHhFRSwweERGLCAweDVGLDB4REYsMHhERSwweEZGLDB4QUUsMHhFNywweDc3LDB4RkYsCisweEZGLDB4REYsMHhGNywweEZGLDB4RTMsMHhGRiwweEZBLDB4QkIsIDB4RkUsMHhGRiwweEFGLDB4RkQsMHhGQiwweEZFLDB4QkYsMHhBQiwKKzB4RjksMHhGRSwweEZGLDB4QkYsMHg3RiwweEJGLDB4RkUsMHhCRCwgMHhGRSwweEQ3LDB4RkYsMHg5RiwweEZELDB4RkYsMHhCRSwweEVGLAorMHhGRiwweEVFLDB4RkQsMHhCQiwweDVCLDB4RUYsMHhGRiwweDdGLCAweEVGLDB4RkYsMHhFRiwweEZGLDB4N0YsMHhGRiwweDRGLDB4RkYsCisweEVGLDB4RkIsMHhCQywweEZDLDB4RkYsMHhGRiwweEZGLDB4RkUsIDB4RkUsMHhGRCwweEZBLDB4RkUsMHhGQiwweEZGLDB4RkQsMHhGMywKKzB4RkIsMHhGRiwweEY4LDB4NUYsMHhGRiwweEZGLDB4RDcsMHhGNSwgMHhGRCwweERGLDB4RUYsMHhGRiwweEYzLDB4REMsMHg1RiwweENFLAorMHhGNSwweEJELDB4RkYsMHhGRiwweEQ3LDB4RkYsMHhGRiwweEY5LCAweDNGLDB4RkYsMHhERiwweEY3LDB4RkYsMHhGRSwweEZGLDB4RkQsCisweEZGLDB4RkIsMHhGRiwweEY3LDB4QjksMHg3RCwweEZFLDB4REYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGOSwweDdGLDB4RkYsMHhGRSwKKzB4RkYsMHhGRiwweDdGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGNywgMHhGNiwweEZGLDB4QkYsMHhGMSwweEY4LDB4RkYsMHhGRiwweEZGLAorMHhGRiwweEUwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGOSwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RUYsMHhFRiwweEZGLDB4RkYsCisweDlCLDB4RkIsMHg3RiwweEZGLDB4RkYsMHhGRiwweEMxLDB4RkYsIDB4REYsMHhGRiwweDNGLDB4NUYsMHhENywweEJGLDB4RUYsMHhCQiwKKzB4REUsMHhFRSwweEZGLDB4N0YsMHhERiwweEZGLDB4RkUsMHhGNSwgMHg3RiwweERGLDB4RkYsMHg5OSwweEZGLDB4RkYsMHhGQSwweEZGLAorMHhCRiwweEZELDB4RUIsMHg3QSwweEZGLDB4QjcsMHhGRSwweEZFLCAweEZGLDB4RkYsMHhFRiwweEZGLDB4RkYsMHhGRCwweEJGLDB4RkYsCisweDk3LDB4RkYsMHhGRCwweEY3LDB4RkYsMHg3RiwweEY3LDB4RkYsIDB4RkYsMHhGRCwweDVGLDB4RkUsMHhGMywweEY5LDB4REYsMHhERiwKKzB4RkYsMHhGRiwweEZDLDB4RkYsMHhGRiwweDgzLDB4RkYsMHhGRiwgMHhGRSwweEZGLDB4OUUsMHhFQywweEZCLDB4RUUsMHhGRiwweDlGLAorMHhCRiwweEVGLDB4RkYsMHhGRSwweEVELDB4N0IsMHhGRiwweEZGLCAweEZGLDB4RjEsMHg1QSwweEZGLDB4RkYsMHhGRCwweEZGLDB4N0MsCisweDY5LDB4M0IsMHhERiwweEZGLDB4N0YsMHgxRiwweERGLDB4RkYsIDB4RkQsMHhCQSwweEZGLDB4RkYsMHhGQiwweEZGLDB4NUIsMHhCRCwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhENywweEI2LDB4RUQsMHhFOSwgMHhGRiwweEQ2LDB4QkQsMHg2RiwweDVGLDB4RkIsMHhGRiwweEVGLAorMHhGRiwweDVGLDB4RkUsMHhGNiwweDZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RjcsMHhFQiwweDdBLDB4REYsMHhGRiwweDlGLDB4N0YsCisweDdGLDB4RkYsMHhCNywweEZGLDB4RkYsMHhGRSwweERGLDB4RkYsIDB4NkMsMHhGRiwweEZCLDB4RkYsMHhCQiwweDZGLDB4RUIsMHhGRSwKKzB4Q0MsMHhGNywweEE1LDB4RkEsMHg1QywweEY1LDB4NzUsMHhCQiwgMHhCNywweERGLDB4RkUsMHg2RiwweDVGLDB4QzUsMHhCRiwweEZELAorMHg3QiwweEZFLDB4RkYsMHg5NSwweEU3LDB4MjksMHhDRiwweDRGLCAweEY1LDB4OTEsMHhFRSwweDZCLDB4REYsMHhFRiwweEZELDB4NTQsCisweEY1LDB4QkQsMHhCMSwweEZGLDB4RUYsMHhFRSwweEZCLDB4QkUsIDB4QkYsMHhBRiwweEZFLDB4REUsMHhCRCwweDZGLDB4REEsMHhGMiwKKzB4RkYsMHhBRiwweEJFLDB4RkYsMHhGRiwweEZELDB4N0UsMHhBNywgMHhGRiwweEY3LDB4RkYsMHhCRiwweEVGLDB4N0IsMHhGNiwweEZELAorMHhCRCwweDRBLDB4RjIsMHg4NSwweDg1LDB4QkYsMHg1QiwweEZFLCAweEI1LDB4RkQsMHhGQSwweEZGLDB4NEYsMHhGRiwweEZFLDB4REYsCisweEZGLDB4RUQsMHhGRiwweEJGLDB4RkYsMHhCRiwweDdGLDB4RkUsIDB4RkYsMHhCNywweDZELDB4RkYsMHhGNywweEJGLDB4QkYsMHhFRiwKKzB4RkQsMHgxRiwweEZGLDB4RkUsMHg3RCwweEZGLDB4NjcsMHhGRiwgMHhGRiwweEZGLDB4M0YsMHg3RiwweEZFLDB4QkYsMHhGRiwweEU3LAorMHhERiwweEU3LDB4RkYsMHhFRiwweDZCLDB4RkMsMHgxRiwweEZGLCAweEJGLDB4RUYsMHhGQiwweEZFLDB4REUsMHhCRiwweEFGLDB4RkEsCisweEZGLDB4QjYsMHhFRiwweEY5LDB4RkUsMHhGRiwweDhGLDB4RUYsIDB4REIsMHhFRiwweEFCLDB4NkYsMHhGQiwweEZFLDB4RkYsMHhGRiwKKzB4RUYsMHhGRCwweEZGLDB4N0YsMHhGRiwweEZGLDB4REUsMHhGRiwgMHhGRiwweEVGLDB4RkYsMHhGRiwweEZGLDB4M0YsMHhGRiwweDZDLAorMHhGRiwweEJGLDB4RkIsMHhGRiwweEZFLDB4RkYsMHhGQiwweEZFLCAweERGLDB4RkYsMHhGRiwweEVGLDB4RkYsMHhGRiwweEJGLDB4RkYsCisweEZGLDB4RkUsMHhGQiwweEZGLDB4RDUsMHg3RiwweEZGLDB4RkYsIDB4RUYsMHhGQiwweEZGLDB4RkYsMHhCRiwweEVGLDB4NDMsMHhCNSwKKzB4RkQsMHg2RiwweENGLDB4RDYsMHhCRSwweDNGLDB4N0YsMHhEQiwgMHhGRSwweEMzLDB4RkYsMHhGRCwweEZGLDB4QUYsMHhFQiwweEZCLAorMHhGQywweEZGLDB4M0UsMHhFRiwweEU4LDB4RkEsMHhCRCwweENELCAweEFBLDB4RkUsMHhGRSwweDdELDB4Q0YsMHhGRiwweEI3LDB4RkYsCisweEY3LDB4RkYsMHhGRiwweEZGLDB4RkQsMHhGRiwweDc1LDB4Q0QsIDB4NTIsMHhENywweEZELDB4RkIsMHhGNywweERELDB4RkIsMHhFRiwKKzB4RUIsMHhGRiwweEZGLDB4NEYsMHhGRiwweEJGLDB4OUYsMHhFNywgMHhGOSwweEZDLDB4N0YsMHg4QiwweEMzLDB4RjksMHhBRiwweDhGLAorMHhFNywweEU5LDB4QkUsMHg3RiwweDlGLDB4RTYsMHhGOSwweEZDLCAweDVGLDB4RkYsMHhGRiwweEY3LDB4RkQsMHhGRiwweDdBLDB4NUYsCisweEQ3LDB4RUQsMHhGRiwweEZGLDB4RDcsMHhGRiwweERELDB4N0YsIDB4RTcsMHhGRiwweEZDLDB4RkYsMHhGQywweDNGLDB4RkYsMHhGRiwKKzB4RkYsMHhGQiwweEZGLDB4RkUsMHhCRiwweEFGLDB4RkYsMHhGRCwgMHhGRiwweEVGLDB4RkYsMHhFQiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweEY3LDB4N0YsMHhGRiwweDdGLDB4REYsMHhGRiwweEZELCAweEZELDB4N0YsMHhGRSwweEY3LDB4RkQsMHg3RiwweERGLDB4RkYsCisweEZELDB4RkYsMHhGRiwweERGLDB4RkIsMHhGRiwweEVFLDB4RkYsIDB4RkIsMHhGRiwweEY3LDB4RkQsMHhGRiwweDdBLDB4REYsMHhGNSwKKzB4RkQsMHhGQSwweERGLDB4RjcsMHhGQywweEZGLDB4N0YsMHhERiwgMHhCRiwweEVELDB4RkYsMHhDOSwweEZGLDB4REYsMHhGRiwweEJGLAorMHgyRiwweEZCLDB4RkYsMHhCQywweEFELDB4RkYsMHhGNywweEZGLCAweEZGLDB4RUYsMHhEMywweEZGLDB4N0QsMHhCRiwweDZGLDB4RkYsCisweEZBLDB4RkYsMHhGRSwweEJGLDB4QUUsMHhFQSwweEZBLDB4QkUsIDB4QUQsMHhBNSwweEVCLDB4Q0UsMHhCRiwweEE3LDB4RUIsMHg1QSwKKzB4REUsMHhCRCwweEFGLDB4NkIsMHhGRCwweDU3LDB4RkYsMHhGRiwgMHhGNCwweDdGLDB4MUYsMHg3RiwweEZELDB4RkYsMHg3RiwweDM2LAorMHhGMCwweERGLDB4NzksMHhGRiwweEZGLDB4RkYsMHhGNywweEZELCAweEJGLDB4RkYsMHg4NywweEZGLDB4RkIsMHhGMywweEZDLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweDdFLDB4RkYsMHhCRiwweERGLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRCwweEJGLDB4RjgsMHg5RiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhCRiwweEZGLDB4RkYsMHhGRCwgMHhGNywweEZDLDB4QkQsMHhGRiwweEZFLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkIsMHhGOSwweEJGLDB4RkYsMHhGRiwweEVCLCAweEUyLDB4RkUsMHhGRiwweEJGLDB4RUYsMHhBOSwweEJBLDB4MkYsCisweEVCLDB4RjksMHhGRSwweDc3LDB4REYsMHhGNywweEZGLDB4RkYsIDB4RjksMHg3RiwweEZGLDB4RkYsMHg3RiwweEVGLDB4RDcsMHhGRiwKKzB4RkQsMHhGRiwweEZCLDB4RjUsMHhGRiwweEJGLDB4NkYsMHhERiwgMHhGRiwweEZGLDB4RkQsMHhGRiwweEZGLDB4RjAsMHhGRiwweEZGLAorMHhGRiwweDNGLDB4Q0YsMHhGRiwweEJBLDB4RUUsMHg5QiwweEJGLCAweEVFLDB4RDcsMHhGRSwweENELDB4RUYsMHhGRiwweERGLDB4QkYsCisweEZGLDB4RkYsMHhDNSwweEZGLDB4RkYsMHhGRCwweDdGLDB4NEYsIDB4RkQsMHhGNiwweEQ5LDB4RkYsMHg0RiwweEQ2LDB4RkQsMHhCRiwKKzB4NkUsMHhGRiwweEZGLDB4RjQsMHg3RiwweEZGLDB4N0YsMHg4QiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEY3LDB4RkYsMHhGOSwweEZFLAorMHgzNywweEZGLDB4RDksMHhGQiwweEY1LDB4QUYsMHhGRCwweEZGLCAweEZGLDB4RkIsMHhGRiwweEZGLDB4MDcsMHhGRiwweEZGLDB4RkYsCisweEZCLDB4RjcsMHhGRiwweEZELDB4RkYsMHg3QywweEZBLDB4N0UsIDB4NEYsMHhGQywweERGLDB4MUQsMHhDNywweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhBRSwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkQsMHhGQiwgMHhGRiwweEZGLDB4RkUsMHhGRSwweEZDLDB4RkYsMHg3RiwweDdGLAorMHhCRiwweEVGLDB4RkUsMHhGRiwweEZGLDB4RkYsMHg1RiwweEZELCAweEZGLDB4RkYsMHhGRiwweEZELDB4NkYsMHg1QSwweEQ3LDB4N0IsCisweEJFLDB4NUYsMHhGRSwweDM5LDB4RkYsMHhGNywweEZGLDB4RjcsIDB4RkQsMHhGRSwweEFBLDB4MUYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkUsMHhGRSwweEFCLDB4QUYsMHhGRCwweEZFLDB4QkYsMHhGRiwgMHhGNywweEZGLDB4N0YsMHhGRSwweDhGLDB4RTMsMHhGQiwweEVFLAorMHg3RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RUIsMHhGQiwweEZGLCAweEZELDB4QkYsMHhFRiwweERGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEZCLDB4RTQsMHgzRiwweEZGLDB4REYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGMywweEVGLDB4QkIsMHhGQiwKKzB4QkYsMHhFRiwweEJCLDB4RkYsMHhENywweEJGLDB4RkYsMHhGRiwgMHhGRiwweDI5LDB4QUYsMHhGNywweEZGLDB4RkYsMHhGQiwweEZGLAorMHhGQiwweEU2LDB4RkYsMHgwRiwweEZCLDB4M0YsMHhERiwweDBGLCAweEZGLDB4QUYsMHhGRiwweEZGLDB4RkYsMHhGNSwweEMzLDB4REYsCisweDVGLDB4RkYsMHhGRiwweEZGLDB4RkUsMHg2QiwweENBLDB4QkUsIDB4QkMsMHhGRiwweDlGLDB4RjIsMHhCRiwweEZGLDB4RkUsMHhGQSwKKzB4RkYsMHhGRiwweEVGLDB4MTYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZDLDB4REYsMHg5NywweEZELDB4NzksMHhGRiwweDM3LAorMHhFNywweDdGLDB4RkYsMHhGRiwweEI1LDB4RkYsMHhGRiwweEY2LCAweDJGLDB4RkYsMHhGRCwweEZCLDB4RkUsMHhGRiwweEZGLDB4RkQsCisweDVGLDB4NTcsMHg1RiwweEZGLDB4REIsMHg1MiwweERGLDB4RkYsIDB4RkQsMHhCRiwweEZGLDB4RkYsMHhGQywweERCLDB4RkYsMHg3QiwKKzB4QjUsMHhGRCwweDdGLDB4RkYsMHg3MSwweDlDLDB4NkUsMHhGRiwgMHhGNiwweDM1LDB4QTUsMHg5QiwweEZGLDB4RkYsMHhGRCwweEZGLAorMHhGRiwweERCLDB4OUUsMHg3RiwweEZFLDB4RUYsMHhGQiwweEZGLCAweEZGLDB4QkQsMHhFRiwweEZGLDB4REUsMHhCNywweEY5LDB4NEIsCisweEZGLDB4RjUsMHhFRiwweEZGLDB4RkYsMHhGRiwweEU4LDB4N0UsIDB4RkYsMHhFQSwweERGLDB4RjcsMHhGRiwweEZELDB4NjksMHg1QiwKKzB4RkMsMHg5RiwweEVGLDB4NzgsMHhENiwweEZGLDB4RUIsMHhFRiwgMHhGRiwweEZGLDB4RkYsMHhFOCwweEZGLDB4RkYsMHhFRCwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhFMywweEY5LDB4RjYsMHhCRiwweEZGLCAweEZGLDB4RkUsMHhERiwweEZGLDB4N0YsMHhGRiwweEZGLDB4RkYsCisweEQxLDB4RkYsMHhGRiwweEU3LDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RTcsMHhGOSwweEZGLDB4QkYsMHg3RiwweEQ5LDB4RkYsMHhGRCwKKzB4RkUsMHg3RiwweEZGLDB4RkUsMHhGRiwweEY5LDB4RkYsMHhGQiwgMHhENiwweERGLDB4QkYsMHhFRiwweDVCLDB4RDYsMHhGRiwweEJGLAorMHhGQiwweEY2LDB4RkYsMHhCRiwweEVGLDB4RjgsMHhGNiwweERELCAweEJFLDB4RkUsMHgxNiwweEZGLDB4QkYsMHhFRiwweEZGLDB4RkUsCisweEZGLDB4QkYsMHhFRiwweEZGLDB4RkYsMHhGRiwweDZGLDB4RkIsIDB4RkYsMHhGRiwweEZGLDB4NkYsMHhGMywweEZGLDB4RjcsMHhFRiwKKzB4RkIsMHhGRiwweEJGLDB4RkYsMHhFRiwweEZFLDB4RkYsMHhCRiwgMHhGRiwweEZGLDB4RkYsMHhCRSwweEJGLDB4RkYsMHhFRiwweEZGLAorMHg3RiwweEVGLDB4RkYsMHhGRCwweDE3LDB4RkIsMHg3QiwweEZGLCAweEZGLDB4RkQsMHg3RiwweERCLDB4RjYsMHhGNCwweDdGLDB4RkEsCisweEZFLDB4RjUsMHhCRiwweEVCLDB4RTMsMHhGNywweEZGLDB4RkYsIDB4RTksMHhCRiwweEZGLDB4QUYsMHhGNywweEZELDB4RjMsMHg3RSwKKzB4OEYsMHhBMywweEVBLDB4RkYsMHhDQiwweEYzLDB4RUUsMHhGRiwgMHhCRiwweEVGLDB4RjcsMHhGOSwweEZGLDB4RkUsMHg3RiwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhGNSwweEZCLDB4RjYsMHhGRiwweEY1LCAweDJGLDB4RkUsMHhGQiwweEQ3LDB4QkYsMHhGRiwweEJFLDB4REYsCisweDlGLDB4RkYsMHhGMCwweEZGLDB4RkYsMHhGOSwweEZFLDB4N0YsIDB4OEYsMHhBMywweEY4LDB4RkUsMHg2RiwweDlGLDB4RjksMHhGNiwKKzB4MkYsMHg5RiwweEU3LDB4RjksMHhGRSwweDJGLDB4OUYsMHhFMSwgMHhGRiwweEZGLDB4RkYsMHg3RiwweERGLDB4RjcsMHhGNSwweEZELAorMHg3RiwweDdGLDB4RjUsMHhGRiwweDlGLDB4NUYsMHhGQiwweEZFLCAweEZGLDB4N0YsMHhGRiwweEZGLDB4Q0IsMHhGRiwweEZGLDB4RkIsCisweEZFLDB4RkYsMHhCRiwweEFGLDB4RkIsMHhGRSwweEZGLDB4REYsIDB4RkUsMHhGRSwweEJGLDB4RjcsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhDNywweEZGLDB4RkYsMHhGRCwweEZGLDB4N0YsMHhERCwgMHhGNywweEZELDB4RkYsMHhGRiwweEQ3LDB4RkYsMHhGRCwweDdGLAorMHhGRiwweEZCLDB4RkQsMHhGRiwweEZGLDB4RkUsMHhFRiwweDdGLCAweEZELDB4RUYsMHhGQiwweEZFLDB4RkIsMHhGRCwweEZGLDB4N0YsCisweERGLDB4RkQsMHhGRiwweDdBLDB4REYsMHhGNywweEZELDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4MUYsMHhGRiwweEZGLDB4RDMsMHhGNywKKzB4RkYsMHhGRiwweDZGLDB4REIsMHhGRiwweEZGLDB4RUYsMHhDQiwgMHhGNCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZFLAorMHgyOSwweEZGLDB4RTgsMHhEQSwweDc2LDB4OUYsMHhBRiwweDZBLCAweERBLDB4RkUsMHgzNSwweEVCLDB4REEsMHhENiwweEJGLDB4QUIsCisweEVCLDB4N0EsMHhERSwweEJGLDB4RDcsMHg3RiwweEZGLDB4RkUsIDB4RkYsMHhCRiwweEVGLDB4RkQsMHhERiwweDc3LDB4QkYsMHhGRCwKKzB4MzcsMHhFRiwweEZGLDB4RUYsMHhGRiwweDNGLDB4RkYsMHhGRiwgMHhGRiwweEZFLDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGNywweDdFLAorMHhERiwweEZGLDB4RkYsMHhGRiwweEZBLDB4QjcsMHg3RiwweEZGLCAweEZGLDB4RkUsMHhGRiwweEZGLDB4RkYsMHhGRiwweDg5LDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHg5RiwweEZCLDB4RkYsMHhGRiwweEZGLDB4RTcsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4QUEsMHhGRiwweEFCLDB4RkIsMHhGQSwgMHhFRiwweEJGLDB4RkYsMHhERiwweEZBLDB4N0IsMHhCOSwweEZFLAorMHhGRSwweEZGLDB4RkQsMHhGRiwweEY3LDB4RkUsMHgzRiwweEZGLCAweEI3LDB4RkYsMHhGNywweEVFLDB4RkYsMHg3RiwweEVGLDB4RkYsCisweEZGLDB4N0YsMHhGRiwweDFGLDB4RkIsMHhGRiwweEJGLDB4RkIsIDB4RkUsMHhGRiwweEJELDB4RkYsMHhGRiwweDJGLDB4RkYsMHhCRiwKKzB4RkYsMHg3RiwweERGLDB4RkEsMHhGRiwweEZGLDB4RkMsMHhFRSwgMHhGNSwweEYzLDB4QkUsMHhGQiwweDBGLDB4RUYsMHhGMywweEJFLAorMHhFRiwweEZDLDB4NUYsMHhGRiwweDVBLDB4RkYsMHhGNywweERGLCAweEZGLDB4RkYsMHhGRSwweEQ1LDB4RkMsMHg1RiwweEZCLDB4RjIsCisweEZGLDB4RkYsMHgyRiwweEJCLDB4RjMsMHhGRiwweEZGLDB4QkYsIDB4RkYsMHhFRiwweEZGLDB4RUYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4QkYsMHhGRiwweEZGLDB4RkQsMHg3QiwweEZGLDB4REYsMHhCOSwgMHhGRiwweEZCLDB4RkYsMHhEOCwweDdGLDB4RkYsMHhGRiwweEZGLAorMHhGQiwweEZGLDB4RkMsMHg3RiwweDFGLDB4QkYsMHhFMCwweERGLCAweEY3LDB4RUYsMHhGRiwweEZELDB4N0YsMHhGRSwweERGLDB4RkYsCisweEUwLDB4RkYsMHhGRiwweEZELDB4RUYsMHhGQiwweEZGLDB4RkUsIDB4RjcsMHhERiwweEZGLDB4RUIsMHg1RiwweEZGLDB4RjcsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4QkYsMHhGRiwweEZELDB4RkYsMHhGRCwgMHhGRiwweEZGLDB4RkYsMHhGNywweEZELDB4RkYsMHgzQiwweERDLAorMHhGRCwweDZELDB4N0IsMHg1RiwweDU3LDB4RjUsMHhGRCwweDdGLCAweDVGLDB4RkYsMHhCMSwweEZGLDB4RUIsMHhGRiwweEZGLDB4RkYsCisweEZCLDB4RkIsMHhGRSwweEZGLDB4QkYsMHhGQiwweEJFLDB4RkYsIDB4QkYsMHhFRiwweEZCLDB4RkUsMHhGRiwweEFGLDB4RkUsMHhGNywKKzB4REYsMHhERiwweEZGLDB4RkYsMHhGRiwweDdGLDB4Q0YsMHhGMywgMHhGOCwweEZGLDB4RDcsMHhGQiwweEZGLDB4NUYsMHhCRiwweEY3LAorMHhGQiwweEZGLDB4N0YsMHhGRSwweDIzLDB4RkYsMHhGRiwweEZFLCAweDdGLDB4RjMsMHhGRiwweEZCLDB4RkUsMHhGRiwweEZGLDB4RjMsCisweEZGLDB4RkYsMHhGNSwweEY5LDB4RkYsMHgzRiwweEZGLDB4RkYsIDB4RjAsMHg5QSwweEZGLDB4QkUsMHg3RiwweEZGLDB4RkMsMHhGOSwKKzB4RkYsMHhGRCwweEFGLDB4RUIsMHhGRSwweEJGLDB4RkYsMHhDRiwgMHhGMywweEZFLDB4N0YsMHhGRiwweEZGLDB4NUIsMHhCRCwweEZGLAorMHhCQywweEVCLDB4RkYsMHhENywweEQ0LDB4QUYsMHhBRiwweEZELCAweEZGLDB4Q0YsMHhGNywweEZELDB4RkYsMHg3RiwweERGLDB4RjcsCisweEZELDB4RkUsMHhGRiwweDZGLDB4RkYsMHhGQiwweEZGLDB4RkYsIDB4RkYsMHhGRCwweDdGLDB4NUUsMHhGRCwweEJGLDB4REIsMHhGNiwKKzB4RkQsMHhCRiwweDZGLDB4RkIsMHhFRSwweEZELDB4RkYsMHg3QSwgMHhGRiwweEZBLDB4RkIsMHhGRiwweDNGLDB4RkIsMHhCNywweDVGLAorMHhENiwweEY3LDB4MUYsMHg3MSwweERDLDB4NzcsMHgxRCwweEM3LCAweDMxLDB4REMsMHg3NywweERGLDB4RjksMHhCRiwweEY1LDB4NUIsCisweEY0LDB4RDcsMHg5RCwweEFFLDB4RkYsMHhCRiwweEZELDB4QkYsIDB4REIsMHhGNiwweEZELDB4QkYsMHg2RiwweERCLDB4RjYsMHhGRSwKKzB4M0QsMHg4MSwweEZGLDB4RUIsMHhGRSwweEZFLDB4RkUsMHhGRiwgMHhFQiwweDdBLDB4REYsMHg3RCwweDc3LDB4N0QsMHhGNSwweDc5LAorMHhERiwweDU3LDB4REQsMHhGNSwweDdELDB4N0UsMHhFNiwweEZGLCAweEQ2LDB4M0YsMHhCRiwweDdGLDB4RkYsMHhENCwweEY1LDB4M0YsCisweEJGLDB4RkIsMHhCRSwweEVGLDB4QjMsMHhFRSwweEZCLDB4OUUsIDB4RUYsMHhCQiwweEZFLDB4OEIsMHhGRiwweEZFLDB4REYsMHhCNywKKzB4RUQsMHhGRiwweEY3LDB4RkQsMHhGRSwweEZGLDB4RUYsMHhCQiwgMHhFRSwweEZGLDB4QkUsMHhFRiwweEJCLDB4RUUsMHhFQiwweEZDLAorMHgxRiwweEZGLDB4RkYsMHhGRCwweEZGLDB4RTcsMHhGRiwweEY3LCAweEZELDB4RkYsMHhFRiwweEZFLDB4RkYsMHhCRiwweEVGLDB4RkIsCisweEZFLDB4RkYsMHhCRiwweEVCLDB4RkEsMHgxRiwweEZGLDB4QjcsIDB4RUYsMHg1QiwweEZFLDB4RkYsMHhBRiwweEVCLDB4REQsMHhFNywKKzB4REUsMHg3NywweDlELDB4RTcsMHg3OSwweERFLDB4NzcsMHg5RCwgMHhCRiwweEU2LDB4NkYsMHhGRiwweEZFLDB4RkYsMHhCRiwweEVGLAorMHhGQiwweEZFLDB4RkQsMHhCRiwweDZGLDB4RjYsMHhGRCwweEJGLCAweDZGLDB4REIsMHhGNiwweEZELDB4QkYsMHhGRiwweDdFLDB4RkYsCisweEZGLDB4RkIsMHhGRSwweEZFLDB4RkYsMHhFRiwweEZCLDB4RkQsIDB4RUYsMHg3RSwweEY3LDB4QkQsMHhFRiwweDdCLDB4REUsMHhGNywKKzB4QkQsMHhFRiwweEZGLDB4RDUsMHhGRiwweEJGLDB4RkYsMHhFRiwgMHhGRSwweEZGLDB4RkMsMHgzRiwweDBGLDB4RTcsMHhGRSwweDdGLAorMHg5RiwweEU3LDB4RjksMHhGRSwweDdGLDB4OUYsMHhFNywweEZFLCAweEYzLDB4RkYsMHhGRSwweERGLDB4QUQsMHhERiwweDY3LDB4RUUsCisweEZCLDB4QkYsMHhFRiwweEZFLDB4RkYsMHhCRiwweEVGLDB4RkIsIDB4RkUsMHhGRiwweEJGLDB4RUYsMHhGRiwweDIzLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweDdGLDB4RkYsMHhGMywweEJDLDB4REIsMHhGRSwgMHhGQiwweEZGLDB4RkIsMHhCRSwweEY3LDB4RkIsMHhGRiwweDdGLAorMHhERiwweEZGLDB4Q0YsMHhGQiwweEZGLDB4OUYsMHhFMywweEY5LCAweEJFLDB4M0YsMHg4RiwweEU3LDB4NzksMHhGRiwweDlELDB4RTcsCisweEY5LDB4RkUsMHg3RiwweDlGLDB4RTcsMHhGOSwweEZFLDB4NUYsIDB4RkYsMHhDRiwweEY3LDB4RkYsMHhGRiwweEZGLDB4REYsMHhGNywKKzB4RkUsMHg3RiwweEU3LDB4RjksMHhGRSwweDdGLDB4RkYsMHhGRiwgMHhGQiwweEZFLDB4RkYsMHhGRiwweEJGLDB4RkYsMHhCRiwweEJGLAorMHhGRiwweEZFLDB4RkYsMHhCRiwweEVGLDB4RkYsMHhGRCwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGNywweEZELDB4RkYsCisweEZGLDB4M0YsMHhGRiwweEJGLDB4RkYsMHhGNywweEZGLDB4RkYsIDB4N0YsMHhERiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEU4LDB4RUYsMHhGRiwgMHg1RiwweEY3LDB4QkYsMHhGOSwweEZFLDB4REYsMHhCNywweEZELAorMHhGRiwweERGLDB4RjcsMHhGRCwweEZGLDB4N0YsMHhERiwweEY3LCAweEZELDB4RkYsMHhERCwweEZGLDB4RjIsMHhGRiwweEJGLDB4RkYsCisweEZGLDB4QkYsMHhGRiwweEZGLDB4MkYsMHhGMiwweEZGLDB4QkYsIDB4MkYsMHg3QiwweEQyLDB4RjcsMHhCRiwweDJGLDB4RkYsMHhCQiwKKzB4RkYsMHhFRSwweDhGLDB4QUYsMHhFQiwweEZBLDB4RkUsMHgzRiwgMHhBNywweDY5LDB4Q0UsMHg4RiwweEE0LDB4RUEsMHhGQSwweEVFLAorMHhCNywweEFFLDB4RUIsMHhGRCwweEM3LDB4RkYsMHhGNywweEY3LCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHg3RiwweDNFLDB4RjMsCisweDc0LDB4RkYsMHgzRiwweDRGLDB4RkYsMHhFNywweEZGLDB4M0YsIDB4RkUsMHhBNywweEZGLDB4RkYsMHhERiwweEY3LDB4QjcsMHhGRiwKKzB4RjcsMHhGRiwweEJBLDB4RUYsMHgzNywweEVCLDB4RkIsMHhGRSwgMHhCRiwweEZCLDB4RkUsMHhGMywweEZGLDB4RjksMHhERiwweEZGLAorMHhCRiwweEZGLDB4RkYsMHhGRiwweEJGLDB4RkYsMHhGRiwweEZGLCAweEZELDB4REYsMHhGRiwweEZELDB4RkYsMHhGRiwweEZCLDB4RkUsCisweEZELDB4RkYsMHhGQiwweEJGLDB4RkUsMHgzRiwweEVELDB4RkYsIDB4REYsMHhCRSwweDNELDB4QTcsMHhGQiwweEZBLDB4M0YsMHhFNiwKKzB4RTEsMHhGRSwweEZFLDB4M0YsMHhFRiwweEUzLDB4REYsMHhGNSwgMHg3RiwweEZFLDB4RkYsMHg3RSwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhFRiwweDZGLDB4RjYsMHhGRiwweDdELDB4RUYsMHhENywweERFLCAweEZGLDB4N0QsMHhFRiwweEZGLDB4RjIsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweDdCLDB4REUsMHhGQiwweEU2LDB4RUUsIDB4RUYsMHgzNywweDZFLDB4RjMsMHg3RSwweEVCLDB4MzcsMHhFRiwKKzB4RkYsMHhDMSwweEZGLDB4RkUsMHhGRiwweEY3LDB4RUYsMHhGRiwgMHhGRiwweEZGLDB4QkYsMHgzRiwweEQyLDB4REYsMHhCRiwweDJGLAorMHg3QiwweEUyLDB4RkYsMHhGRSwweDNCLDB4QkQsMHhEQiwweEZGLCAweEZFLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEVGLDB4RkUsCisweEZGLDB4RkIsMHhGRiwweEZGLDB4QkYsMHhGRiwweEZCLDB4REYsIDB4RkYsMHhCRiwweEZGLDB4QjcsMHhGRiwweEZGLDB4QkYsMHhFRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4MEYsMHhGRiwgMHg3RiwweEZGLDB4MUYsMHhFRiwweEYxLDB4RkQsMHhGRiwweEY2LAorMHhBRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhFRiwweEZGLCAweEZGLDB4RkYsMHhGRSwweDlGLDB4RkYsMHhGRiwweEZGLDB4NzcsCisweEVGLDB4RjcsMHhGQiwweEZGLDB4RkUsMHg1RiwweEZGLDB4RkYsIDB4QkYsMHhDRiwweEZCLDB4RjcsMHhERCwweEY3LDB4RjUsMHhGRiwKKzB4NUYsMHhENSwweEY1LDB4RkQsMHg3RiwweDVGLDB4RDcsMHhGNSwgMHhGRiwweEZCLDB4MEYsMHhGRiwweEZGLDB4QTksMHhFQSwweDdBLAorMHhGRiwweEFGLDB4OEYsMHhGRSwweERGLDB4QUYsMHhFRiwweEZCLCAweEZFLDB4RkYsMHhCRiwweEVGLDB4RkIsMHhERiwweEU1LDB4NUYsCisweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhCRCwweDU3LDB4RkYsIDB4RkYsMHg2RiwweDc3LDB4QkYsMHhGNywweEZCLDB4RkYsMHg3RiwKKzB4QkYsMHhGNywweEZGLDB4RkMsMHhCRiwweEZGLDB4OUYsMHhGRiwgMHhGRiwweEVGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweDFGLAorMHhDRiwweEZGLDB4RkMsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZCLCAweDY1LDB4QUYsMHhGMywweDdDLDB4RkYsMHgzRiwweERGLDB4RkYsCisweEZELDB4RTksMHhGRSwweDdGLDB4RTcsMHhGRiwweEZFLDB4N0YsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRCwweEUzLDB4REYsMHhGQiwKKzB4REIsMHhGNiwweEZELDB4RUYsMHg1QiwweEZCLDB4RkYsMHhERiwgMHhGQywweEZGLDB4M0YsMHhERiwweEYzLDB4RkQsMHhGRiwweDdGLAorMHhERiwweEVGLDB4NjYsMHhGRiwweERGLDB4QUQsMHhFQiwweDdBLCAweERFLDB4RjcsMHhGNywweEU3LDB4RDksMHhGRCwweDlGLDB4NjcsCisweEQ5LDB4RjYsMHg3RCwweDlGLDB4RTcsMHhERiwweEY1LDB4NDcsIDB4RkQsMHg2NSwweDVCLDB4RDYsMHhGNCwweEZFLDB4RkYsMHhFRiwKKzB4RkYsMHg2RCwweEY2LDB4REQsMHhCNywweDZELDB4REIsMHg3NiwgMHhEQywweEI3LDB4N0QsMHhGQSwweDlCLDB4RjYsMHg2RCwweDlELAorMHg2NywweDU5LDB4REYsMHhGNywweERELDB4RkYsMHhFQiwweEZFLCAweEJGLDB4QUYsMHhFQiwweEZBLDB4RkUsMHhCRiwweEFGLDB4RTMsCisweEQxLDB4OUYsMHhGRiwweEJELDB4QkYsMHhFRiwweEZFLDB4RjcsIDB4QkYsMHhCRiwweEY3LDB4RDcsMHg3RiwweERELDB4RjcsMHg5RCwKKzB4REYsMHg3RiwweERGLDB4RjcsMHhGRiwweEUwLDB4N0YsMHhGRCwgMHhDMSwweERGLDB4RjcsMHhGRCwweEM3LDB4N0YsMHg3RiwweEZCLAorMHhGRiwweEJCLDB4RUMsMHhGQiwweDNFLDB4RkYsMHhCRiwweEVDLCAweEZCLDB4RkYsMHhEOCwweDdGLDB4QkYsMHg2QywweEZGLDB4QkUsCisweEZGLDB4QkYsMHhFRCwweEZGLDB4RUYsMHhGRSwweEZCLDB4QkYsIDB4RUYsMHhGQiwweEZFLDB4RkYsMHhCRiwweEVFLDB4RkYsMHhDNSwKKzB4RkYsMHhBRiwweDZGLDB4RkYsMHhGQywweEZELDB4M0YsMHhFNywgMHhGRiwweEZFLDB4RkYsMHhFRiwweEZCLDB4RkUsMHhGRiwweEJGLAorMHhFRiwweEZCLDB4RkUsMHhCRiwweDg5LDB4RkUsMHhGQSwweEJBLCAweEZFLDB4QkYsMHhBRiwweEZCLDB4RjYsMHhGNSwweEQ5LDB4N0QsCisweDk3LDB4NjUsMHhEOSwweDc0LDB4NUQsMHg5NywweDY1LDB4RDMsIDB4RkUsMHhENiwweEZGLDB4QkYsMHhGNywweEZELDB4RkYsMHg3RiwKKzB4QkYsMHhDRiwweEZCLDB4RkUsMHhGRiwweEVGLDB4RkIsMHhGRSwgMHhGRiwweEJGLDB4RUYsMHhGQiwweEZGLDB4RjYsMHg4RiwweEZCLAorMHhGRiwweEVGLDB4RkIsMHg3RSwweERCLDB4RkUsMHhGRiwweEJFLCAweEVGLDB4RUUsMHhGQiwweEJFLDB4RUYsMHhCQiwweEVFLDB4RkIsCisweEJFLDB4RkYsMHhGRiwweERGLDB4RkYsMHg0MywweEZGLDB4RkYsIDB4RkIsMHhFRiwweDVGLDB4QjcsMHhGRSwweDdGLDB4RTcsMHhGOSwKKzB4RkUsMHg3RiwweDlGLDB4RTcsMHhGOSwweEZFLDB4N0YsMHhGOSwgMHhCRiwweEZFLDB4QUYsMHg3NywweEZELDB4RkYsMHgyRiwweEFGLAorMHhBNywweEZFLDB4RkYsMHhFRiwweEZCLDB4RkUsMHhGRiwweEJGLCAweEVGLDB4RkIsMHhGRSwweEZGLDB4RjEsMHg3RiwweEVGLDB4REYsCisweEZGLDB4OTcsMHhGNSwweEVGLDB4RkYsMHhERiwweEZGLDB4RkYsIDB4QkYsMHhGRiwweEJGLDB4RkYsMHhGRiwweEZFLDB4RkYsMHhGRiwKKzB4RkYsMHhFMCwweEZGLDB4RkYsMHhGOSwweEZFLDB4MkYsMHg4QiwgMHhFMywweEY4LDB4QkUsMHg3NywweDlGLDB4RjksMHhEQSwweDc3LAorMHg5RCwweEU3LDB4NzksMHhERSwweDc3LDB4OUYsMHhERCwweEZGLCAweEZELDB4RkQsMHg3RiwweDVGLDB4RDcsMHhGRCwweEZGLDB4N0YsCisweEU3LDB4RkUsMHg3RiwweDk3LDB4RTcsMHhGQiwweEZFLDB4RkYsIDB4QkYsMHhFRiwweEZGLDB4QUIsMHhGRiwweEVGLDB4RkEsMHhGRSwKKzB4QkYsMHhBRiwweEZGLDB4RkEsMHhGRiwweEZGLDB4REYsMHhGRiwgMHhGQiwweEZGLDB4RjcsMHhGRCwweEZGLDB4N0YsMHhERiwweEZGLAorMHg2NywweEZGLDB4RjcsMHhGNSwweEZGLDB4RkYsMHhGRiwweERGLCAweEZELDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhFRiwweEZGLDB4QkQsIDB4RUIsMHhGRiwweEZGLDB4RjcsMHhBRCwweEVCLDB4RkYsMHhERiwKKzB4RkQsMHhGRiwweDNGLDB4REYsMHhGNywweEZELDB4RkYsMHg3RiwgMHhERiwweEZGLDB4NUYsMHhGRiwweEY3LDB4RkYsMHhGRiwweEZELAorMHhCRiwweEZGLDB4Q0IsMHhGNCwweEZGLDB4N0YsMHhEMywweEY3LCAweEZELDB4M0YsMHg3RiwweEQzLDB4RjcsMHhGRiwweEZDLDB4M0YsCisweEZGLDB4RUEsMHhGQSwweEJFLDB4QUYsMHhBQiwweEVCLDB4QkEsIDB4RjQsMHg5NSwweDZCLDB4NTIsMHhENCwweEFELDB4MkYsMHg0QSwKKzB4RDIsMHhGNiwweEJGLDB4RDIsMHg3RiwweEY3LDB4M0YsMHhGRiwgMHhGRiwweEYzLDB4N0YsMHhGRiwweEZGLDB4RjcsMHhGRiwweEJBLAorMHhERiwweEZCLDB4RkQsMHhGRiwweEJGLDB4RkYsMHhGQiwweEZGLCAweEY4LDB4N0YsMHhFQSwweEZGLDB4RkUsMHhGRSwweERGLDB4RkYsCisweEY3LDB4RkYsMHg3RiwweEJCLDB4RkYsMHhGRiwweEJGLDB4REYsIDB4RkIsMHhGRiwweEZGLDB4QkYsMHhGRiwweEIxLDB4N0YsMHhGRiwKKzB4RkIsMHhFRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhCRiwgMHhDRiwweEZFLDB4RkYsMHhGRiwweEVGLDB4RkYsMHhGNywweEZGLAorMHhGRiwweEZGLDB4RjEsMHhGRiwweDY5LDB4QkUsMHhGQSwweEJGLCAweEFGLDB4RTIsMHhGRiwweEZFLDB4RkQsMHhBRiwweEYzLDB4RkUsCisweEZGLDB4QkYsMHhFRiwweEZCLDB4RkMsMHhGRiwweEZGLDB4MDcsIDB4RkQsMHg5NSwweERCLDB4REYsMHg3RiwweERGLDB4QUYsMHhGRiwKKzB4RjcsMHhBRiwweDM2LDB4RkUsMHhCRiwweDY1LDB4RUIsMHhGNiwgMHhGRSwweDlGLDB4NkYsMHhGRSwweDA3LDB4RkYsMHhDRiwweEZGLAorMHhGOCwweEZFLDB4RkYsMHhDRiwweEZGLDB4RjYsMHhGQSwweEU3LCAweEZCLDB4RkUsMHhGRiwweEJCLDB4RUQsMHhGOSwweEZGLDB4RkYsCisweEZGLDB4NUYsMHhGRiwweEZGLDB4RkYsMHg3NSwweEZGLDB4RUYsIDB4N0UsMHhGRCwweEUwLDB4RTgsMHg1RSwweEQzLDB4RTUsMHhGOSwKKzB4M0UsMHg1RiwweEQ3LDB4RjcsMHhGRiwweEZBLDB4MkYsMHhGQiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZFLDB4RkYsMHhGRiwweDdGLAorMHg3RiwweEQ3LDB4RjUsMHg3RCwweDVGLDB4NTcsMHhENSwweEY1LCAweEVGLDB4RkYsMHhGMywweDdGLDB4RkMsMHg3RiwweEZGLDB4QzcsCisweEYxLDB4RkYsMHhGRiwweDFGLDB4Q0YsMHhCMCwweEZGLDB4M0YsIDB4Q0YsMHhGMywweEZDLDB4RkYsMHgzRiwweENFLDB4RkYsMHhFNCwKKzB4RkYsMHhERiwweDdGLDB4RkUsMHhGNywweEJCLDB4RkYsMHhGRiwgMHhERiwweEVGLDB4RUUsMHhGRiwweEJGLDB4RUYsMHhGQiwweEZFLAorMHhCRiwweEJGLDB4RUYsMHhGRiwweEQxLDB4RkYsMHhGRiwweEZGLCAweEZELDB4RkIsMHhGRiwweEZELDB4RkYsMHhGQiwweDlGLDB4RTksCisweEZFLDB4N0YsMHg5RiwweEU3LDB4RjksMHhGRSwweDdGLDB4QkYsIDB4RkYsMHhCMywweEZGLDB4RkYsMHhGNywweEZGLDB4RkYsMHhBRiwKKzB4RjcsMHhGRiwweEI2LDB4M0YsMHhFQiwweEZBLDB4RkUsMHhCRiwgMHhBRiwweEVCLDB4RkEsMHhGRSwweEJGLDB4RkUsMHhBNywweEZGLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEY3LDB4RkYsMHhGRiwweEZGLCAweEZFLDB4OUYsMHhGNywweEY5LDB4RkYsMHg3RiwweDlGLDB4RTcsCisweEZGLDB4RkYsMHhGRSwweEFGLDB4NkYsMHhGRiwweEZGLDB4RkYsIDB4OUYsMHhGRiwweERGLDB4RkYsMHg3RCwweDVGLDB4REQsMHhGRiwKKzB4RkIsMHhCRiwweEU3LDB4QkIsMHhGRiwweEZCLDB4REYsMHg2RCwgMHg1RiwweDdFLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhFQiwweEY3LDB4RkYsMHhFNywweEVGLDB4RjcsMHhGRiwweEZGLCAweDdGLDB4RkYsMHhGNywweEZGLDB4RkMsMHg4RiwweEZGLDB4RUYsCisweEZELDB4RkUsMHhGRiwweEJFLDB4RjQsMHhGMiwweDdELDB4RDcsIDB4Q0YsMHhGRiwweDNGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhDRiwweDZCLDB4RkYsMHhCRiwweDNGLDB4RkIsMHhGMiwgMHhGQywweDdGLDB4RUIsMHhGRiwweDlGLDB4RkEsMHhGRiwweEZGLAorMHgzRiwweEZGLDB4RjMsMHhGRiwweEZGLDB4RkQsMHg3MCwweEY3LCAweEZGLDB4RkYsMHhCRiwweEZGLDB4RkIsMHhENywweEZFLDB4RjUsCisweDc3LDB4RkYsMHgxNSwweERELDB4NzcsMHhGRCwweEZGLDB4N0YsIDB4REYsMHhGNywweEZCLDB4Q0QsMHhCRiwweEZGLDB4RkQsMHhGRiwKKzB4RkYsMHhERiwweDM3LDB4Q0QsMHhGOSwweEVDLDB4RkUsMHhFRiwgMHhCQiwweEY0LDB4RkIsMHgzRiwweDRGLDB4QjMsMHhGRiwweEZELAorMHhDQiwweEZGLDB4RTksMHg3RSwweDU0LDB4OUYsMHhFNSwweDRCLCAweEI3LDB4RkYsMHhERCwweDdELDB4QzcsMHg3MSwweERELDB4NzcsCisweDVELDB4RDcsMHg3NSwweENELDB4N0YsMHhENiwweEZGLDB4RDMsIDB4RjYsMHhGOSwweDNGLDB4NkQsMHg5NSwweEFGLDB4N0YsMHhGRSwKKzB4RkYsMHhFRiwweEZCLDB4RkUsMHhGRiwweEJGLDB4RUYsMHhGQiwgMHhGRSwweEY2LDB4QzcsMHhGRiwweEFELDB4N0IsMHhDQSwweEZGLAorMHhCRiwweEJGLDB4RUYsMHhGRCwweEUzLDB4REYsMHhCNywweEVELCAweEZCLDB4N0UsMHhERiwweDM3LDB4RUQsMHhFMywweEZCLDB4REYsCisweEZGLDB4NTIsMHg1QywweDE1LDB4RkQsMHhDRiwweDdGLDB4REYsIDB4RkUsMHhFRiwweEVGLDB4RkIsMHhGRSwweEZGLDB4QkYsMHhFQywKKzB4N0IsMHhGRSwweEZGLDB4RkUsMHgzRSwweDdGLDB4REEsMHhGNywgMHhGRCwweEZGLDB4N0YsMHhGRiwweEZGLDB4RkIsMHhFRiwweEJCLAorMHg2RiwweEZCLDB4RkUsMHhGRiwweEJGLDB4RUYsMHhGQiwweEZGLCAweEY3LDB4N0QsMHhGRiwweEQ4LDB4RkYsMHhGRCwweEJGLDB4N0YsCisweEZCLDB4RkYsMHhGRiwweDlGLDB4RkIsMHhGRSwweDdGLDB4OUYsIDB4RTcsMHhGOSwweEZFLDB4N0YsMHg5RiwweEVBLDB4N0YsMHhGNiwKKzB4QkYsMHhCRCwweDZBLDB4NUEsMHhGNiwweEU1LDB4QkYsMHg3NywgMHg1RiwweDZELDB4REQsMHg3NywweDVELDB4RDcsMHg3NSwweERELAorMHg3NywweEZGLDB4QTUsMHhCRiwweENGLDB4RkIsMHhGRiwweEZGLCAweEJGLDB4Q0YsMHhGQiwweEZELDB4RkYsMHhCRiwweEYzLDB4RkUsCisweEZGLDB4QkYsMHhFRiwweEZCLDB4RkUsMHhGRiwweEZELDB4QUIsIDB4RkYsMHhCRiwweEJGLDB4RkYsMHhGQiwweEZGLDB4N0YsMHhFRiwKKzB4RkYsMHhCRSwweEZCLDB4RUUsMHhGQiwweEJFLDB4RUYsMHhCQiwgMHhFRSwweEZCLDB4QkYsMHhGRiwweEI1LDB4RkYsMHhEMCwweEJDLAorMHhGRCwweDJGLDB4NEIsMHhGNywweEZGLDB4RkYsMHg5RiwweEY5LCAweEZFLDB4N0YsMHg5RiwweEU3LDB4RjksMHhGRSwweDdGLDB4OUYsCisweEZBLDB4OEYsMHhGRCwweEFCLDB4RkEsMHhEQSwweEJGLDB4QUYsIDB4QjMsMHhGRCwweEZGLDB4QkYsMHhGQiwweEZFLDB4RkYsMHhCRiwKKzB4RUYsMHhGQiwweEZFLDB4RjcsMHhCRiwweEZGLDB4OUYsMHhGRiwgMHg3NywweEY3LDB4QkQsMHhGRCwweDc3LDB4REYsMHhGRiwweDdFLAorMHhERiwweEVELDB4QkIsMHhGRSwweEZGLDB4QkUsMHhFRiwweEZCLCAweEZFLDB4RkYsMHhGQSwweDNGLDB4RkYsMHhCRSwweDZGLDB4OEYsCisweEU2LDB4RjksMHhGRSwweDdGLDB4OUYsMHhDNywweEZFLDB4N0YsIDB4OUYsMHhFNywweEY5LDB4RkUsMHg3RiwweDlGLDB4RTcsMHhGQiwKKzB4N0YsMHhGRiwweDdGLDB4Q0YsMHhGRiwweEZELDB4RkYsMHhGRiwgMHhERiwweEZCLDB4QUYsMHhCRiwweEVGLDB4RkYsMHhGRSwweEZGLAorMHg5RiwweEVGLDB4RkIsMHhGRiwweEZDLDB4RkYsMHhGQiwweEZFLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkUsMHhGRiwweEZGLDB4RjcsCisweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGNSwweEZGLDB4RkYsMHhGRiwweDNGLDB4REYsMHhGNywKKzB4RkYsMHhGRiwweDdGLDB4RUYsMHhGRSwweEZGLDB4QkYsMHhGRiwgMHhGQiwweEZGLDB4RkYsMHhCRiwweEVGLDB4RkYsMHhCMywweDdGLAorMHhGRiwweDdCLDB4NUUsMHhGNywweEZELDB4RkYsMHg3QiwweDdGLCAweEY3LDB4RkYsMHg3RiwweERGLDB4RjcsMHhGRCwweEZGLDB4N0YsCisweERGLDB4RjcsMHhGRiwweDE3LDB4RkYsMHhGRiwweEZGLDB4N0YsIDB4RkYsMHhGRiwweERELDB4RjYsMHhGQywweEJGLDB4Q0IsMHhGMiwKKzB4QkMsMHhCRiwweDJGLDB4Q0IsMHhGMiwweEZDLDB4QkYsMHhGRSwgMHg4RiwweEZGLDB4RkEsMHg3RSwweEJGLDB4QTcsMHhFQiwweERBLAorMHhGQywweEJGLDB4QUYsMHg3QSwweEZFLDB4QkYsMHhBRiwweEVBLCAweEZBLDB4RkUsMHhCRiwweEFGLDB4RjQsMHhERiwweEZFLDB4RkYsCisweEYzLDB4M0MsMHg3RiwweDNFLDB4RkYsMHhDRiwweEY4LDB4QkYsIDB4OEYsMHhFMywweEY4LDB4RkUsMHgzRiwweDhGLDB4RTcsMHhFOCwKKzB4RkYsMHhGQywweDlGLDB4RkYsMHhGRiwweENGLDB4RUIsMHhCMywgMHhFNywweEZCLDB4N0IsMHhGMywweEZFLDB4RkYsMHhDRiwweERCLAorMHhGQiwweEZCLDB4QkYsMHg2RiwweDZGLDB4REYsMHhFQywweDdGLCAweEZGLDB4RkYsMHhGNywweEZELDB4RkQsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4QjIsMHhCRiwweEZGLDB4REUsMHhGRCwweEJELDB4RUYsIDB4RkIsMHhGNiwweERGLDB4RUEsMHhFNywweERCLDB4RkUsMHhCQiwKKzB4RkYsMHhFQiwweEZCLDB4QkYsMHg5RiwweDhGLDB4RTgsMHhGRSwgMHgzRiwweDhGLDB4QTMsMHhGOCwweEZFLDB4M0YsMHg4RiwweEZGLAorMHhGOCwweDdFLDB4RkQsMHhGRCwweDdGLDB4RkYsMHhGQiwweENELCAweEZGLDB4RkQsMHhGRiwweDVGLDB4RUYsMHhGRCwweEZGLDB4RkYsCisweERGLDB4RjcsMHhGRCwweEZGLDB4QkUsMHg5MCwweEZGLDB4RkYsIDB4RUUsMHhGRiwweDNGLDB4QkYsMHhGMywweEJCLDB4RkUsMHhCNywKKzB4QUIsMHhGQSwweEZFLDB4QUYsMHhBRCwweEVBLDB4RkEsMHhERSwgMHhBQiwweEZGLDB4NjMsMHhGRiwweEZFLDB4RjIsMHhGRiwweEIzLAorMHhGRiwweERGLDB4RUUsMHg3RCwweEZGLDB4MDMsMHhGMSwweEY0LCAweDNGLDB4MUYsMHhDMywweEYxLDB4RUMsMHg3RiwweEZFLDB4NkYsCisweEZGLDB4RkIsMHhGQiwweEZGLDB4OUYsMHhGRiwweEJGLDB4RkYsIDB4N0IsMHg1RiwweEZELDB4RkYsMHhERiwweEY3LDB4RkQsMHhGRCwKKzB4N0YsMHg3RiwweERGLDB4RkUsMHhDRiwweEZCLDB4RkYsMHhGRiwgMHhBRiwweEZCLDB4RkYsMHgxRiwweEVGLDB4QTUsMHhGRCwweEJGLAorMHhERiwweEZCLDB4N0QsMHhGRiwweEJGLDB4REYsMHhGQiwweEZGLCAweEZELDB4M0IsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkQsCisweEFGLDB4RjMsMHhGRiwweEZCLDB4N0YsMHhCRiwweEQ3LDB4RkIsIDB4QkYsMHg3RiwweEJCLDB4RjcsMHhGRiwweEY4LDB4N0YsMHhGRiwKKzB4RkEsMHg1RiwweEQ3LDB4RkYsMHhERiwweDdGLDB4RUYsMHhGRiwgMHhGRiwweDdGLDB4REIsMHhGNywweEZELDB4RkYsMHg3RiwweERGLAorMHhCNywweEZCLDB4RUMsMHhGRiwweEZGLDB4RjcsMHhCRiwweEVGLCAweEZELDB4RkMsMHhGQiwweEZGLDB4RUYsMHhGMCwweEZFLDB4M0YsCisweDhGLDB4RTMsMHhGOCwweEZFLDB4M0YsMHg4RiwweEVGLDB4OEQsIDB4RkYsMHhGRiwweEVGLDB4N0YsMHhCRiwweEZGLDB4RkIsMHhGRiwKKzB4REIsMHhCRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhFRiwweEQ4LDB4RkYsMHgyRSwweDdGLAorMHhCRSwweEVGLDB4RkUsMHg2RSwweEZGLDB4QkYsMHhGOSwweEZGLCAweEZGLDB4RjMsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZDLDB4NjYsMHhCRSwweDQ3LDB4RjMsMHg3RiwweERGLDB4RkUsIDB4ODcsMHg5RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RTcsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEQ2LDB4NkYsMHg3QywgMHhGQiwweDRGLDB4RDIsMHhGRiwweEZELDB4MkIsMHhGRSwweEZGLAorMHhGRiwweEZELDB4NUYsMHhENywweEQ1LDB4RjUsMHg3RCwweEZGLCAweEZGLDB4RkYsMHhCRiwweDlCLDB4RkYsMHhGRiwweERGLDB4QjcsCisweEZGLDB4RkYsMHhERiwweEZGLDB4M0YsMHhDRiwweEZFLDB4N0YsIDB4QkYsMHhFRiwweEZCLDB4RkMsMHhGRiwweDNGLDB4RkYsMHhEOSwKKzB4QkYsMHhGRSwweDk3LDB4RUMsMHg4RiwweEI3LDB4RkUsMHg5QiwgMHg3RCwweEZELDB4QjcsMHhERCwweDc3LDB4MUQsMHhDNywweDcxLAorMHhERCwweDc3LDB4NUQsMHhENywweEYzLDB4NkYsMHhGRCwweDNGLCAweDczLDB4REQsMHhBRiwweEZELDB4N0EsMHhGRiwweEZGLDB4QUYsCisweEZFLDB4RkQsMHhCRiwweEVGLDB4RkIsMHhGRSwweEZGLDB4QkYsIDB4RUYsMHg2NiwweDdGLDB4RkYsMHhGRiwweEJGLDB4QkYsMHhGRiwKKzB4RkIsMHhGRiwweEY3LDB4REYsMHhGRCwweEZCLDB4N0QsMHhERiwgMHhCNywweENELDB4RjMsMHg3QywweDVGLDB4M0YsMHg5MSwweDNGLAorMHhGRiwweDNELDB4RUYsMHg3QiwweEZGLDB4RkMsMHhGRiwweENBLCAweEVGLDB4RkUsMHhGRiwweEJELDB4RUYsMHhGQiwweDFFLDB4RTcsCisweEJCLDB4RUMsMHg3RiwweEIzLDB4RkYsMHhGRCwweDlGLDB4RkYsIDB4RkYsMHhGRSwweEZGLDB4RkYsMHg3RiwweEJGLDB4RkIsMHhGRSwKKzB4RkYsMHhCRiwweEVGLDB4RkIsMHhFRSwweEZCLDB4QkYsMHhERiwgMHg2NywweEZGLDB4RkYsMHhCRiwweEVGLDB4REIsMHhGRiwweEJDLAorMHhGRSwweDdGLDB4RkIsMHhGRiwweDlGLDB4RUYsMHhGOSwweEZFLCAweDdGLDB4OUYsMHhFNywweEY5LDB4RkUsMHg4NywweEZGLDB4RUUsCisweEZCLDB4QkUsMHhFNSwweEJGLDB4RUYsMHhGOSwweEQ3LDB4NjUsIDB4RjcsMHhERCwweEU3LDB4N0QsMHhERiwweDc3LDB4NUQsMHhENywKKzB4N0YsMHhGOCwweDlCLDB4RkUsMHhGRiwweEJGLDB4RUYsMHhGQiwgMHhGRiwweEZGLDB4QkYsMHhFRiwweEZCLDB4RkYsMHg3RiwweENGLAorMHhGMywweEZDLDB4RkYsMHhCRiwweEVGLDB4RkYsMHhEQiwweDNGLCAweEVGLDB4RkIsMHhGRSwweEZGLDB4REYsMHhGRiwweEZFLDB4RkIsCisweEJCLDB4RUYsMHhCRiwweEVGLDB4QkIsMHhFRSwweEZCLDB4QkUsIDB4RUYsMHhCQiwweEZGLDB4RkMsMHg3RiwweEZELDB4M0IsMHg1QiwKKzB4RDYsMHhFNSwweEZELDB4NEYsMHhDMywweEZCLDB4RkYsMHhCRiwgMHhFRiwweEZCLDB4RkUsMHhGRiwweEJGLDB4RUYsMHhGQiwweEZGLAorMHhCNCwweEZGLDB4RkEsMHhCQywweDhGLDB4QjIsMHhFOSwweEQyLCAweDJFLDB4Q0YsMHhGQiwweEZGLDB4QkYsMHhFRiwweEZCLDB4RkUsCisweEZGLDB4QkYsMHhFRiwweEZCLDB4RkYsMHhFQywweEZGLDB4RkQsIDB4RkQsMHg3RiwweERGLDB4RjcsMHhFNCwweERGLDB4NUYsMHhGRiwKKzB4RkYsMHhGQiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4QzMsMHhGRiwweEVGLDB4RTYsMHhGOCwweEZFLAorMHgzRiwweDhCLDB4ODMsMHhGOSwweEZFLDB4N0YsMHhFNywweEY5LCAweEZFLDB4N0YsMHg5RiwweEU3LDB4RjksMHhGRSwweDdGLDB4MTcsCisweEZELDB4RkYsMHhGRiwweEZGLDB4N0YsMHg1RiwweEY3LDB4MkMsIDB4RkYsMHhGRiwweEZGLDB4RkUsMHg3RiwweEZGLDB4RTcsMHhGOSwKKzB4RkUsMHg3RiwweDlGLDB4RkUsMHgyRiwweEZGLDB4RkYsMHhFRiwgMHhGRiwweEZFLDB4QkYsMHhFRiwweEFELDB4RkYsMHhGRiwweDdGLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLCAweEZFLDB4REYsMHhGRiwweERGLDB4RkYsMHhGRCwweEZELDB4N0YsCisweERGLDB4RjcsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZBLDB4M0YsMHhGRSwKKzB4RjcsMHhGRCwweEVGLDB4N0EsMHhGRiwweEIxLDB4QkQsMHhGRiwgMHg3RiwweEY3LDB4RkQsMHhGRiwweDdGLDB4REYsMHhGNywweEZELAorMHhGRiwweDdGLDB4RjMsMHgyNywweEZGLDB4REYsMHhGRiwweERELCAweEZGLDB4RkMsMHg5QiwweEZGLDB4Q0IsMHhGQywweEJGLDB4MkYsCisweENCLDB4RjIsMHhGQywweEJGLDB4MkYsMHhDOSwweEZGLDB4REUsIDB4RkYsMHhERiwweEFGLDB4RUIsMHhEQSwweEZFLDB4QkIsMHhBRiwKKzB4RUIsMHhGOCwweEY3LDB4QUYsMHhFOCwweEZBLDB4RkUsMHhCRiwgMHhBRiwweEVCLDB4RjIsMHhGRiwweEZELDB4RkYsMHhGRiwweEVGLAorMHhCRCwweEQ3LDB4QkYsMHhGRiwweEZGLDB4REUsMHg4RiwweEI4LCAweERFLDB4MzcsMHg4RCwweEEzLDB4NzgsMHhEQSwweDNGLDB4OEYsCisweEZGLDB4QTEsMHhGRiwweEZGLDB4RkIsMHhGQiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEE3LDB4QkQsMHhGQiwweDc2LDB4RkQsMHhCRiwKKzB4RUYsMHhEQiwweEZFLDB4QkIsMHhCRiwweEZFLDB4MjcsMHg3RiwgMHhGRiwweEZFLDB4RkUsMHhGRCwweEY1LDB4RkYsMHhFRiwweEY1LAorMHhERiwweDFGLDB4RTcsMHhGRCwweEZGLDB4N0YsMHhERiwweEY3LCAweEZELDB4RkYsMHhGRiwweENELDB4RkQsMHhBRSwweEZGLDB4RkEsCisweDNFLDB4M0YsMHhBQiwweEZELDB4RjgsMHg3RSwweDhGLDB4RTMsIDB4RjgsMHhGRSwweDNFLDB4OEYsMHhFMywweEY4LDB4RkYsMHhGRSwKKzB4MUYsMHhFRiwweERGLDB4QkYsMHhGRSwweERFLDB4REYsMHhEOSwgMHhGRiwweERGLDB4QkMsMHhGRiwweEZGLDB4N0YsMHhGRiwweEVGLAorMHhGRCwweDdGLDB4REYsMHhGNywweEY5LDB4M0YsMHhGRSwweEZGLCAweEZGLDB4NkYsMHhGRSwweERFLDB4QkYsMHhGNywweEVELDB4RUEsCisweEZELDB4OEYsMHg4MywweEY4LDB4RUEsMHgzRiwweDhGLDB4RUYsIDB4RkYsMHhGNCwweDdGLDB4RkYsMHhFRiwweEVGLDB4N0IsMHhGMywKKzB4RjEsMHg1RiwweEZGLDB4RkYsMHhGMSwweDNCLDB4N0YsMHhERiwgMHhGNywweEZELDB4RkYsMHhGRiwweEZGLDB4RkYsMHhFMCwweEZGLAorMHhGRiwweEZGLDB4RjcsMHhGRiwweDZGLDB4RkYsMHg3RiwweEZGLCAweEZGLDB4RjcsMHhERSwweEY3LDB4QkYsMHhFRiwweEZCLDB4RjcsCisweEZELDB4RkYsMHhGRiwweEY1LDB4RkEsMHhGRiwweEZGLDB4RkIsIDB4RTcsMHhGRiwweEYzLDB4RjgsMHg3RiwweEYzLDB4REYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4MUYsMHhFRiwgMHhCQiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZELAorMHhGRiwweDdGLDB4RkYsMHg5RiwweEZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweENGLDB4RkYsMHgzNywweEZGLDB4RkYsCisweDdGLDB4REYsMHg3NywweDVELDB4RTcsMHhGQywweEZGLDB4QkYsIDB4RjcsMHhGNSwweEZCLDB4RkYsMHhGRiwweEQ3LDB4RjUsMHhGQiwKKzB4RkYsMHhGRiwweDQ1LDB4RkQsMHg3RiwweEVBLDB4RkQsMHhCRSwgMHhCRiwweERGLDB4RjcsMHhGRiwweEZGLDB4REIsMHhGQiwweEZFLAorMHhGRiwweEJGLDB4RUYsMHhGRiwweEZGLDB4RkYsMHhGQiwweDVGLCAweDdGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkUsMHhGRiwweEVGLDB4RkQsMHhGRiwweDdGLDB4REYsIDB4RkYsMHhFRiwweEZCLDB4RjgsMHgwRiwweEYzLDB4RkYsMHhGOSwKKzB4MkUsMHhGQiwweEZFLDB4RkMsMHhGMywweEVGLDB4RkYsMHhGRiwgMHhCRiwweEZGLDB4RkIsMHhFNywweEZGLDB4RkUsMHg3RSwweEZGLAorMHhDMCwweDZCLDB4Q0YsMHhGRiwweDM0LDB4REYsMHhGMSwweEZELCAweEZGLDB4RUYsMHhGRiwweEZGLDB4RkYsMHhERiwweEY3LDB4RkQsCisweENGLDB4N0YsMHg5QywweEZELDB4RkQsMHg2QywweEY3LDB4RkYsIDB4RjYsMHhGRCwweEVCLDB4MkIsMHg5RiwweEZGLDB4RkMsMHhGRSwKKzB4N0UsMHhGRiwweEZGLDB4RkYsMHhGRiwweEQ3LDB4RjMsMHhGNywgMHhGRiwweEZCLDB4RTEsMHhCRiwweEZGLDB4RUIsMHg3QSwweERFLAorMHhENywweEZCLDB4RkYsMHhGOSwweEZFLDB4RkYsMHhGRiwweEYzLCAweERFLDB4N0YsMHhGRCwweEU3LDB4N0YsMHhGRiwweEZELDB4QkIsCisweEZGLDB4RkYsMHg3RSwweENDLDB4RjYsMHhBRiwweDVGLDB4N0YsIDB4RkUsMHhGNCwweDdELDB4RjcsMHhGRCwweEJCLDB4NkUsMHhEQiwKKzB4QjcsMHhGRiwweEY3LDB4REYsMHg2NiwweEZGLDB4RkYsMHhGNywgMHgzRCwweENGLDB4REUsMHhCRCwweEZGLDB4RkYsMHhERSwweERCLAorMHg4RCwweEY3LDB4N0UsMHhERiwweEI3LDB4RUYsMHg3RiwweEZGLCAweEY2LDB4ODcsMHhGRiwweEZGLDB4RUYsMHhGRSwweERFLDB4QkYsCisweEZGLDB4RkYsMHhGRiwweEJCLDB4RUYsMHhGRCwweEZGLDB4N0IsIDB4REUsMHhGNywweDNGLDB4RkYsMHhCRiwweEZCLDB4REIsMHhGRiwKKzB4RjIsMHhCNiwweEZELDB4QkQsMHg3RiwweEU3LDB4RkYsMHhGRiwgMHhGRiwweDZGLDB4RjcsMHhGRiwweEZGLDB4RkYsMHhGRSwweDc3LAorMHhGRiwweEJGLDB4RjgsMHhBRiwweEZGLDB4REYsMHhCRiwweEZGLCAweEJGLDB4N0YsMHhGQiwweEZGLDB4RkYsMHhGRiwweERCLDB4RkUsCisweEZGLDB4QkYsMHhGRiwweEZBLDB4RkYsMHhGRCwweEZGLDB4RjYsIDB4N0YsMHhGRiwweDlGLDB4RkYsMHhGRiwweDNGLDB4RUYsMHhGOCwKKzB4RUUsMHg3RSwweDlGLDB4QkEsMHhGRSwweEJGLDB4OEYsMHhFRiwgMHhGRSwweEZFLDB4RjksMHhGRiwweEZBLDB4N0YsMHhGRSwweDdFLAorMHhCRiwweEFGLDB4RkIsMHg5NiwweEZELDB4OUYsMHhFRiwweDVFLCAweDY1LDB4QkUsMHhFRiwweDVCLDB4QjYsMHhGRiwweEJFLDB4RTMsCisweEZGLDB4QjUsMHhCRiwweEZGLDB4RkQsMHhGRiwweDdGLDB4RkYsIDB4RUYsMHhERiwweEZFLDB4RkYsMHhCRiwweEZCLDB4RkUsMHhGRiwKKzB4QkYsMHhDRiwweEZGLDB4RkYsMHhGRiwweEZELDB4OUIsMHhGRiwgMHhGRSwweEZCLDB4RkUsMHhERiwweEZGLDB4N0YsMHhGRiwweEY3LAorMHhGRSwweEZGLDB4REYsMHhGQiwweEZCLDB4RkUsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEI3LDB4RkUsMHhGQSwweEZGLDB4QUIsCisweEVGLDB4RkYsMHhGRCwweEI1LDB4N0IsMHg3RiwweEZCLDB4RjcsIDB4RkQsMHhGRiwweEZGLDB4REQsMHhGRiwweEVGLDB4OEYsMHhGRiwKKzB4MkYsMHhGRiwweEZCLDB4N0MsMHhGRiwweDNGLDB4REYsMHg3MywgMHhFQiwweEZFLDB4M0YsMHhGRiwweEVGLDB4RkIsMHhGRSwweEZGLAorMHhFRiwweEZELDB4RkYsMHhCRiwweEZELDB4MEYsMHhGRiwweEZGLCAweEZGLDB4RjUsMHhGOSwweEZGLDB4N0YsMHhENywweEZELDB4RkYsCisweERGLDB4RkYsMHhGNywweEZCLDB4RkYsMHg3RiwweEJGLDB4RkYsIDB4RkYsMHhGMCwweDlGLDB4RkYsMHhGRSwweDdGLDB4OEIsMHhFMywKKzB4RjksMHhERSwweDI3LDB4OUIsMHhFNiwweEJFLDB4N0YsMHg5QiwgMHhDMywweEY4LDB4REUsMHg3RiwweDlELDB4RTcsMHhGRSwweDdGLAorMHhGRiwweEZGLDB4NUYsMHhENywweEZGLDB4RkYsMHhGRiwweDRGLCAweEZCLDB4RkYsMHhGRiwweDdGLDB4RkYsMHhBRiwweEZGLDB4OUYsCisweDdGLDB4RkIsMHhGRiwweEU4LDB4RkYsMHhGRiwweEZFLDB4QkYsIDB4QUYsMHhGRiwweEZGLDB4RkUsMHhCRiwweEVGLDB4RjcsMHhGRiwKKzB4QkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RjcsMHhGRiwgMHhGQywweEZGLDB4RkYsMHhGRCwweDdGLDB4RkYsMHhGRiwweEZGLAorMHhGRCwweDNGLDB4Q0YsMHhGRiwweEZGLDB4RkYsMHhGRiwweEY3LCAweEZGLDB4RkQsMHg3RiwweEZGLDB4RkYsMHg5MywweEZGLDB4RkYsCisweDdBLDB4REYsMHhGNywweEZGLDB4RkYsMHg3QiwweDdGLDB4QjcsIDB4RUYsMHhGRiwweEZGLDB4RkQsMHhCRiwweEZELDB4RkIsMHhGRiwKKzB4RjcsMHhGRiwweEQ3LDB4RkYsMHhGRiwweEZGLDB4RkMsMHg5RiwgMHg2RiwweENCLDB4RkYsMHhGNCwweEJCLDB4REYsMHhENiwweEZELAorMHhCRiwweDJGLDB4RDMsMHhGNywweEZGLDB4REYsMHhGRiwweENGLCAweEZGLDB4RkEsMHhCRSwweEJELDB4QUYsMHg2QSwweERBLDB4QkUsCisweEJCLDB4QUIsMHgzQSwweEJFLDB4MkQsMHhBRSwweEVCLDB4REEsIDB4RjYsMHgzRiwweEFELDB4RjUsMHhERCwweEZGLDB4Q0YsMHhGMSwKKzB4RkYsMHhGOSwweDdGLDB4RkYsMHg3MywweEZFLDB4RkYsMHhDRiwgMHhDMywweEY0LDB4RjcsMHgyRiwweEYzLDB4RkYsMHhGQywweEZGLAorMHg3QywweDFGLDB4RkYsMHgzRiwweDRGLDB4RkYsMHg3RSwweEZGLCAweEVGLDB4QkQsMHhGNiwweEZFLDB4RkYsMHgyQiwweEVGLDB4REMsCisweEZCLDB4RkQsMHhGRiwweEZCLDB4RkYsMHhFQSwweDdCLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGQiwweEY3LDB4REYsMHhGRiwKKzB4RTMsMHg3RCwweEZGLDB4QjcsMHhGRiwweEJGLDB4RkYsMHhGRiwgMHhERiwweEZGLDB4RjgsMHhGRiwweEJGLDB4RkYsMHhCRiwweEVCLAorMHhFNywweEZBLDB4RkUsMHgzRCwweEJGLDB4RTksMHhGQywweEJGLCAweEZGLDB4RkEsMHhGQiwweEZFLDB4RkYsMHhGRiwweEZGLDB4RDksCisweEZGLDB4RkYsMHhGRiwweEY2LDB4N0YsMHhGRiwweEY2LDB4N0QsIDB4RkYsMHhERiwweENGLDB4RkQsMHhCRiwweEZCLDB4RUYsMHg3RSwKKzB4RkYsMHg3RiwweEZGLDB4RkYsMHhEMywweEZGLDB4RkQsMHhGQiwgMHhGRiwweEZCLDB4RkYsMHhGRiwweEZGLDB4RUYsMHhGRiwweEJGLAorMHhGRSwweEZGLDB4RjcsMHhFRiwweEZGLDB4RkYsMHhGRiwweEZCLCAweEZGLDB4ODcsMHhGRiwweEZELDB4RkYsMHhGRiwweEZGLDB4RkYsCisweDdCLDB4RkUsMHhGRiwweEZFLDB4M0IsMHhGNywweEY3LDB4RkYsIDB4M0YsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4MEYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkIsMHhGRiwweEZGLDB4RkYsMHhGNywgMHhGRiwweEZGLDB4QUQsMHhGRiwweEZFLDB4RjcsMHhGRiwweEZGLAorMHg1RiwweEZGLDB4RkYsMHhERiwweEZGLDB4RkQsMHhGRiwweEY1LCAweEZGLDB4REYsMHhGRiwweEJELDB4RkYsMHhFOSwweEZGLDB4QzcsCisweEYzLDB4RkYsMHhGRiwweEY3LDB4RkYsMHhGMywweEZGLDB4RjgsIDB4M0IsMHhGRiwweEZGLDB4N0IsMHhERiwweEJGLDB4RkIsMHhFRiwKKzB4RkIsMHhGRiwweEZCLDB4RjcsMHhGNywweEJCLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkIsMHhGRiwweEZFLDB4N0YsMHhGMywweDdGLAorMHg1RSwweEI3LDB4QkYsMHhGRCwweDdGLDB4RkYsMHhGOSwweDdGLCAweEZCLDB4RkYsMHhFQiwweEZELDB4N0YsMHg3RiwweEZGLDB4RUYsCisweEZCLDB4RTAsMHgzRiwweEZFLDB4QkYsMHhCRiwweERGLDB4RkYsIDB4N0UsMHhGRiwweEY3LDB4RkYsMHhGRiwweEZFLDB4QkYsMHhGRiwKKzB4REIsMHg3OCwweEZGLDB4RkYsMHhGRiwweEVFLDB4QTEsMHhCRiwgMHhGNSwweERFLDB4RkIsMHhGNywweEZGLDB4RkIsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkIsMHhGRiwweEZGLDB4RDcsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhFRiwweEYwLDB4RkYsMHhGRiwweEZGLDB4RjMsCisweEY3LDB4RkYsMHhFRiwweEZGLDB4RTcsMHhDRiwweEZGLDB4RkIsIDB4RkYsMHhFRiwweEZGLDB4RkYsMHg5RiwweDlGLDB4RUYsMHhGQywKKzB4MTYsMHhCRiwweEZFLDB4RjMsMHhFNCwweEZGLDB4RkYsMHhDNiwgMHhGRiwweEU3LDB4RkYsMHhGRiwweEZELDB4RkYsMHhCRiwweEZGLAorMHhGRiwweDNGLDB4RkYsMHhCRiwweEQ2LDB4QUYsMHg3RiwweEZFLCAweDZCLDB4N0UsMHg3RiwweEZGLDB4QUYsMHhGRiwweEZGLDB4QkYsCisweEZGLDB4NUYsMHhGRiwweEZFLDB4RkYsMHhGRiwweEZFLDB4RkYsIDB4RkYsMHhCRCwweERCLDB4RkYsMHhGRSwweDVGLDB4RjIsMHhGRiwKKzB4RkYsMHg1RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhFRiwweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhERSwweEJGLAorMHhGRiwweEZGLDB4RUYsMHhGQiwweDc3LDB4RkUsMHhCRCwweDdGLCAweDVGLDB4RkYsMHhGRiwweEZGLDB4REYsMHg2RiwweEVELDB4RkYsCisweEZELDB4RkYsMHg3RiwweEZELDB4NkYsMHhGRiwweEZGLDB4NzcsIDB4REEsMHhDRiwweEZELDB4NUYsMHhGRiwweEJGLDB4RkYsMHhGRiwKKzB4REYsMHg3RiwweEZGLDB4RkIsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHg2NiwweDdGLDB4RkYsMHhGRSwweEJGLDB4RTcsMHhCRiwweEZBLAorMHhGRiwweEZFLDB4RkYsMHhGRiwweEZGLDB4REYsMHhGRiwweDU5LCAweEVGLDB4RkYsMHhFRiwweEZCLDB4N0YsMHg4OSwweEZGLDB4RkYsCisweEU5LDB4RkYsMHg2RiwweEZGLDB4RjUsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweDdGLDB4RjIsMHhGNywweEZGLDB4RkYsMHhFRiwKKzB4RjgsMHg3RiwweEZCLDB4RkYsMHhGRCwweEZGLDB4RkYsMHhEOSwgMHhGRiwweEVGLDB4QkIsMHhGRiwweEZGLDB4RkYsMHhCRiwweEVGLAorMHhERSwweEZGLDB4RkYsMHg5RiwweDdGLDB4REYsMHhGRiwweEY3LCAweEZGLDB4RkYsMHhGRiwweEZGLDB4REYsMHhGRiwweEZGLDB4QUYsCisweEZGLDB4RkYsMHhGNywweDNGLDB4RUIsMHg5RiwweEZFLDB4N0YsIDB4OUUsMHg3RiwweDlGLDB4RkUsMHg4NywweEZGLDB4RUQsMHhEQiwKKzB4NTYsMHhGRiwweEJGLDB4QUYsMHgwQiwweEQyLDB4RkYsMHhFRiwgMHhEQiwweDZFLDB4N0QsMHhCRCwweDZGLDB4RjgsMHhGRSwweDNGLAorMHhGQSwweDVCLDB4RkYsMHhGRCwweEJGLDB4RUYsMHhGRiwweEJGLCAweDZGLDB4REIsMHhFNiwweEZGLDB4RkYsMHgzRiwweEZGLDB4REYsCisweEZFLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhEQSwweDNGLDB4RkYsIDB4RkIsMHhGRSwweEZFLDB4RkYsMHhGRiwweERGLDB4RjcsMHhCRCwKKzB4RkYsMHhGRCwweEZGLDB4RkUsMHhGRiwweEZCLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RjEsMHg1RiwweEZELDB4OUYsMHhERiwweEZELAorMHhGRiwweEZELDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwweDc2LCAweEZBLDB4RkYsMHhGRiwweDdGLDB4RTMsMHhGOCwweEZGLDB4QUUsCisweEZGLDB4RkIsMHg3RSwweDlELDB4NzMsMHhGRiwweEZBLDB4N0YsIDB4REYsMHhGRiwweEZGLDB4N0YsMHhGRiwweEZCLDB4Q0QsMHhGRiwKKzB4N0YsMHhFRiwweEZCLDB4RkYsMHhGRCwweEZGLDB4RjcsMHg3RiwgMHg3RiwweEVGLDB4RkYsMHhFRCwweEZGLDB4RkYsMHhGRiwweEI1LAorMHhGRiwweEJGLDB4RkYsMHhCRiwweEZELDB4RUYsMHhEQiwweEY3LCAweEZGLDB4OTMsMHhGRiwweEVGLDB4RTIsMHhGOSwweEJFLDB4N0YsCisweDhCLDB4RTcsMHhGOSwweEZFLDB4NkIsMHhFNywweEY5LDB4RkUsIDB4N0YsMHg5RiwweEU3LDB4RjksMHhGRSwweDdGLDB4NDcsMHhGRiwKKzB4RkYsMHhGRCwweEZGLDB4OUYsMHhGRiwweEQ3LDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RjUsMHhGRiwweDlGLDB4RkYsMHhGNywweEZFLAorMHhGRiwweEJGLDB4RkUsMHg2RiwweEZGLDB4RkYsMHhGQiwweEZGLCAweEZGLDB4RkYsMHhBRiwweEZGLDB4RkYsMHhGRiwweDdGLDB4RkIsCisweEZGLDB4RkUsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkQsIDB4REYsMHhGRiwweEZGLDB4RjcsMHhGRiwweEZGLDB4RkYsMHhERiwKKzB4RkYsMHhGRiwweEZGLDB4NUYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHg1RiwweEZCLDB4RkUsMHhGRiwweEY4LDB4MzcsMHhGRiwweEZGLAorMHhFRiwweEZGLDB4N0YsMHhGRSwweEJGLDB4RkYsMHhGRiwweEZFLCAweEJGLDB4RkYsMHhGRiwweDdGLDB4RkYsMHhCRiwweEZELDB4RkYsCisweDdGLDB4RkEsMHg3RiwweEZGLDB4RkYsMHg2RiwweEZGLDB4RkYsIDB4N0QsMHhGRiwweENGLDB4RkYsMHhGRiwweEZGLDB4NEYsMHhGRiwKKzB4RjIsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkEsMHhCRiwgMHhGRiwweEFFLDB4RUIsMHhGQSwweEZFLDB4QkIsMHhBRCwweEVCLAorMHhGQSwweEY3LDB4QUYsMHg2QiwweEZBLDB4RjYsMHhCRiwweDI1LCAweEU5LDB4RjIsMHg3RiwweDQ1LDB4RkYsMHhGRiwweEZELDB4RjcsCisweEY3LDB4QkYsMHhGRiwweERGLDB4RkYsMHhGRiwweEJGLDB4RkIsIDB4RkYsMHhERiwweEYzLDB4RkYsMHhGNywweDNGLDB4Q0YsMHhGRiwKKzB4QTEsMHhGRiwweEZGLDB4QkYsMHhFNywweEZGLDB4RkYsMHg3RiwgMHhGRiwweDNELDB4RkYsMHhGRiwweEZGLDB4RjcsMHhGRiwweDJGLAorMHhGRiwweEZCLDB4RjUsMHg3RiwweEZFLDB4NTcsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RjcsCisweDNGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweEZELDB4RkUsIDB4RjcsMHhFRSwweEFGLDB4RkUsMHhFRSwweEU3LDB4RkEsMHhGRiwKKzB4RkUsMHg5RCwweEY5LDB4NUUsMHhGRSwweEZGLDB4RUIsMHhGRiwgMHhGRiwweERGLDB4QTcsMHhGRiwweEZGLDB4RkYsMHhGQywweERCLAorMHhGRiwweEZGLDB4RkYsMHg3RSwweEZCLDB4RkYsMHhGRiwweEVGLCAweEZCLDB4RkQsMHhGRiwweERCLDB4RkYsMHhGRiwweEZGLDB4RUYsCisweEZGLDB4RkYsMHhGRiwweEZELDB4QkYsMHhGRSwweEJGLDB4RkYsIDB4NkYsMHg3RiwweEZGLDB4RjcsMHhGRiwweEZGLDB4RjksMHhGRiwKKzB4RjcsMHhGRiwweEJGLDB4REUsMHhGNywweEZGLDB4RkYsMHhGRiwgMHhGQSwweDdGLDB4RkQsMHhCRiwweDVGLDB4RkYsMHhGRiwweEJGLAorMHhGRiwweEVELDB4RkYsMHhGNywweEJGLDB4RkYsMHhGRiwweEVGLCAweEZGLDB4REYsMHhGRiwweEZGLDB4RkYsMHhFNiwweEZGLDB4RkIsCisweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEY3LDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RUIsMHhGRiwKKzB4RkQsMHhGRiwweEY1LDB4RkYsMHhGNiwweDdGLDB4REYsMHhCRCwgMHhDRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4REYsMHhGRiwweEZGLAorMHhGRiwweEY5LDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEUzLCAweEZGLDB4RUUsMHhCRiwweEZGLDB4N0QsMHhFRiwweEZFLDB4RkYsCisweEZGLDB4RkYsMHhCRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkUsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhFNywweEZGLDB4QjUsMHhBRSwKKzB4RkYsMHhGRiwweEI2LDB4RkUsMHhCRiwweEZGLDB4RkYsMHhCRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweDI3LDB4RkYsMHhFRiwweEZFLDB4N0YsMHhERiwweEZGLCAweDdFLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhGRCwweEZGLDB4RjcsMHhGOSwweDlGLDB4RkYsIDB4NUYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHg3RiwKKzB4RkYsMHhGRiwweEZFLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHgwRiwweEZGLDB4RTcsMHhCRiwweEZFLAorMHhGRiwweEJGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGQywweEJGLCAweEZGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweEZGLDB4QzQsCisweDZCLDB4RkYsMHgyOSwweDFGLDB4RkIsMHhBRiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RUYsMHgxQiwweEZFLDB4RkYsMHhGQywKKzB4NkYsMHhGRiwweEZGLDB4RkQsMHg2QSwweEY3LDB4RDcsMHhGNSwgMHhCRiwweEZGLDB4RkUsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRSwweEJGLDB4RkYsMHhGRiwweEZBLDB4RkYsMHhGRiwweEY3LCAweEZCLDB4REQsMHhCRiwweEZGLDB4RTcsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRCwweDdGLDB4RkYsIDB4RkYsMHhGNSwweEZGLDB4RkYsMHhGNywweEZELDB4QjMsMHhFRiwKKzB4RkQsMHg3RSwweDVELDB4RkYsMHhGRCwweEZGLDB4RkYsMHhGRiwgMHhGRCwweDdGLDB4RDIsMHhGNSwweEZCLDB4N0UsMHhDQiwweEI3LAorMHhGRiwweEZGLDB4RkYsMHhDNiwweEZGLDB4RkQsMHhFRSwweDYzLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGNiwweEZELDB4NjUsCisweDVCLDB4REYsMHhGRiwweEQ1LDB4RkYsMHhGRiwweEZGLDB4RjYsIDB4RTcsMHhCRiwweEY3LDB4QTksMHhGRiwweEZGLDB4RUQsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhFQiwweEZGLDB4RkYsMHhGRiwgMHhBRiwweEZGLDB4RkYsMHhGRiwweEY4LDB4MUIsMHhGRiwweEUzLAorMHhEMCwweEJGLDB4RkYsMHhFMSwweEZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RDcsMHhGRiwweEZGLDB4RkYsMHg1RiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhBRiwweEZGLDB4REIsMHg3NiwweEJGLDB4RkYsIDB4N0YsMHhGRiwweEJGLDB4RUYsMHhGRSwweEZGLDB4QkYsMHhFRiwKKzB4RkIsMHhGRSwweEZGLDB4RkYsMHhGRiwweEJGLDB4RjIsMHg3RiwgMHhGRiwweDlGLDB4RkUsMHhCRCwweEZFLDB4N0YsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RjcsMHgzRiwweEVDLDB4N0YsMHhGNiwweDk1LDB4QkIsCisweEVGLDB4RjgsMHhGRSwweEZDLDB4QkYsMHgyRiwweERBLDB4RkMsIDB4QkYsMHgyRiwweENCLDB4RjIsMHhGQywweEJGLDB4RUYsMHhGRiwKKzB4QTksMHhCRiwweENGLDB4RkIsMHhGRiwweEZGLDB4RkYsMHhGRSwgMHhERCwweEI3LDB4NkQsMHhGNiwweEQ5LDB4QjYsMHg2RCwweDlCLAorMHg3NiwweEQ5LDB4QkYsMHhGQiwweEZELDB4QTMsMHhGRiwweEJGLCAweEVGLDB4RkYsMHhFRiwweEZGLDB4RkYsMHhGRiwweDdGLDB4REYsCisweEZELDB4RUYsMHg3QiwweERFLDB4RjcsMHhGRCwweEVGLDB4N0YsIDB4RkYsMHhGRiwweDA1LDB4RkYsMHhGQSwweEZFLDB4N0YsMHhFRiwKKzB4RTMsMHhGRiwweEZGLDB4RkQsMHg3RiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweDVGLDB4RkYsMHhGRiwweEZELDB4N0YsMHhGQiwweEFGLAorMHhGRiwweDYzLDB4QzgsMHhGRiwweEJGLDB4RUYsMHhGRiwweEZGLCAweEZBLDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRSwweDlGLDB4RjcsCisweEZGLDB4RkEsMHhCRiwweEZFLDB4OUYsMHhGQiwweDdGLDB4RkYsIDB4RkYsMHhFRiwweEQ3LDB4RkYsMHhGRiwweEY1LDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEZELDB4N0YsMHhGRiwweEZGLDB4QkYsMHhGRiwgMHhGOSwweEJGLDB4RkYsMHhCRSwweDI3LDB4OUYsMHhFNywweEY5LAorMHhGRSwweDdGLDB4OEIsMHhFNywweEZFLDB4N0YsMHg5RiwweEUyLCAweEY5LDB4RkUsMHg3RiwweDlGLDB4RTcsMHhGMSwweDdGLDB4RkYsCisweEZGLDB4RkYsMHhGQiwweEZFLDB4RkYsMHhGRiwweEZGLDB4RDcsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGNSwweEZGLDB4RkYsMHhGRiwKKzB4RDcsMHhGRiwweEZBLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwgMHhGRCwweEZGLDB4RkYsMHhGRiwweEFGLDB4RjcsMHhGRiwweEZGLAorMHhGRiwweEVCLDB4RkYsMHhGRiwweEZGLDB4QUYsMHhGRiwweEM0LCAweEZGLDB4RjcsMHhGRiwweEZGLDB4RUYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4NUYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEQ3LDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhFQiwweEZGLDB4RkIsMHg3QSwKKzB4REYsMHhGNywweEZELDB4RkYsMHhGRiwweEZFLDB4QkYsMHhGRiwgMHhGRiwweDdGLDB4RkYsMHhBRiwweEZGLDB4RkYsMHhGRiwweEY3LAorMHhFRiwweEUzLDB4RkYsMHhERCwweEQyLDB4RkYsMHhERiwweEZGLCAweEZGLDB4RjIsMHhGQywweEJGLDB4Q0IsMHhGNiwweEZELDB4QkYsCisweDJGLDB4Q0IsMHhGRiwweDdGLDB4REYsMHhERSwweEFGLDB4RkYsIDB4REEsMHhFRSwweEJGLDB4QUYsMHhFOSwweEZBLDB4RjQsMHhCRCwKKzB4QUYsMHg1QSwweEFFLDB4QkIsMHhBQiwweDZCLDB4REEsMHhERSwgMHhCRiwweEFELDB4RDcsMHg1RSwweEZGLDB4RkYsMHhCRiwweEZDLAorMHhGRiwweERGLDB4RkQsMHhGRiwweEZGLDB4RkYsMHhGRiwweERGLCAweEY3LDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRCwweEZGLDB4RkEsCisweDFGLDB4RkYsMHhGRSwweEZCLDB4RUYsMHhCRiwweEZELDB4RkYsIDB4RkQsMHhCRCwweDc3LDB4RkYsMHhGRiwweEZGLDB4RkYsMHg5RCwKKzB4RUYsMHhGRiwweEZGLDB4RkYsMHhFRiwweDdELDB4RkYsMHhGQiwgMHhGRSwweEVGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEY3LAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEVFLCAweEJGLDB4RTQsMHhGQiwweEZGLDB4RkUsMHgzRiwweEZFLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEFGLDB4RUEsMHhGRSwweEJGLDB4QUYsIDB4RUIsMHhGQSwweEZFLDB4RkYsMHhGRiwweEZGLDB4NTUsMHhGNiwKKzB4RkYsMHhGRSwweEY3LDB4RkYsMHg3RiwweEZGLDB4RUIsMHhGNywgMHg1RiwweEM1LDB4RkQsMHg3RiwweDVGLDB4RDcsMHhGNSwweEZGLAorMHg2RiwweEZCLDB4RkYsMHg4QSwweEZGLDB4RkYsMHhGRiwweEZGLCAweEVCLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGQiwweEJGLDB4QkYsCisweEVGLDB4RkIsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZCLDB4RkYsIDB4NzcsMHhERiwweEZCLDB4RkYsMHhGRCwweDdGLDB4RUYsMHhGRiwKKzB4RkYsMHhGRiwweEJGLDB4N0YsMHhGRiwweERGLDB4QkYsMHhGRiwgMHhGQiwweEZGLDB4RkYsMHhGRiwweEZFLDB4RUYsMHhERiwweEZGLAorMHhGRSwweEZGLDB4OUYsMHhFRiwweDdELDB4RkYsMHhGNywweEZGLCAweDdGLDB4RkYsMHhGRiwweERGLDB4RjcsMHhGRCwweEZGLDB4RUYsCisweERGLDB4RkYsMHhERiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRCwweEZGLDB4RkYsMHhGQiwKKzB4RkQsMHhGRiwweEJGLDB4REYsMHhEMSwweEZGLDB4RjgsMHgzQiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHg3RSwweERCLDB4RkQsMHhGRiwweDc3LDB4REIsMHhCNywweDdELCAweEJGLDB4RkIsMHhGRiwweEY4LDB4N0YsMHhFRCwweDdCLDB4NUUsCisweEZGLDB4RkUsMHhGRiwweEZGLDB4NEYsMHhENywweEZELDB4N0YsIDB4REYsMHhENywweEY1LDB4RkYsMHg3RiwweEZGLDB4RkYsMHhGRiwKKzB4RjIsMHgzRiwweEZFLDB4RkYsMHhCRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEJGLDB4RUYsMHhGRSwweEZGLDB4M0IsMHhFRSwweEZGLAorMHhGQywweEVGLDB4RkYsMHhGRiwweEZGLDB4ODUsMHhGRiwweEZELCAweEZFLDB4RkYsMHhGNSwweEZGLDB4RkYsMHhGRSwweEZGLDB4REYsCisweEZCLDB4RkYsMHg1RiwweEJGLDB4RkYsMHhGRCwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEE4LDB4RkYsMHhGRiwweDlGLDB4OUUsMHhGRiwKKzB4RkYsMHhGRiwweDdGLDB4RjMsMHhGRiwweEZGLDB4Q0YsMHhGRiwgMHhGNywweEZELDB4RkYsMHg3RiwweEZGLDB4RkYsMHhGQywweDE2LAorMHhCRiwweENGLDB4QTMsMHhFNSwweEVGLDB4N0YsMHhGRiwweEYzLCAweEU0LDB4RkYsMHhDRiwweDkzLDB4RkMsMHhGRiwweDNGLDB4Q0YsCisweEZGLDB4RkYsMHhGRiwweEQ2LDB4MEYsMHg3RCwweEJGLDB4NkUsIDB4RkIsMHhGNCwweEZDLDB4QUYsMHg2RCwweERCLDB4NzcsMHhCNywKKzB4NkQsMHhEQiwweEY2LDB4RkQsMHhCRiwweEZGLDB4RkYsMHhGRiwgMHhCRiwweDlCLDB4RkEsMHhERSwweEI3LDB4QjcsMHhFRCwweEY5LAorMHg3RSwweEI3LDB4QUMsMHhFQiwweEQ2LDB4QjMsMHhBRCwweEVCLCAweDdBLDB4REYsMHhGRiwweEZGLDB4RkYsMHhEOCwweEJGLDB4RkYsCisweEI3LDB4RUQsMHg5RiwweDZGLDB4REQsMHhGNywweDY4LDB4REIsIDB4MzcsMHhCMywweDZDLDB4REIsMHgzNiwweENELDB4QjMsMHg3RiwKKzB4RkYsMHg3RiwweEY1LDB4NkYsMHhGRCwweEVGLDB4NzksMHgzRCwgMHhGNywweDkzLDB4RTQsMHg3QSwweDlFLDB4QUQsMHhFQSwweDdBLAorMHg5RSwweEY3LDB4QkQsMHhFRiwweEZGLDB4RkYsMHhGRiwweDc2LCAweDdGLDB4RkIsMHhDNiwweEZGLDB4QkIsMHhFRiwweERBLDB4RkUsCisweEZELDB4QkYsMHhGQiwweEZFLDB4RkYsMHhCRiwweEVGLDB4RkIsIDB4RkYsMHhGRiwweEZCLDB4RkYsMHhBNSwweEZGLDB4RkQsMHhBQiwKKzB4NkYsMHg3OCwweERFLDB4MTcsMHg4RiwweDc5LDB4REYsMHhGRCwgMHhGRiwweDdGLDB4REYsMHhGNywweEZELDB4RkYsMHhGRiwweEZCLAorMHhGRiwweEZCLDB4RkYsMHhFRiwweEZCLDB4RUYsMHhGQiwweEZFLCAweEZGLDB4QkIsMHhEQSwweEYzLDB4RUYsMHgzQiwweENFLDB4RjMsCisweEJDLDB4RUYsMHgzRiwweENGLDB4REYsMHhGRiwweEI3LDB4RkYsIDB4RkYsMHhGRiwweENGLDB4NzMsMHhGRiwweEJGLDB4RUYsMHhGRiwKKzB4RjMsMHhGRiwweDNGLDB4Q0YsMHhGMywweEZDLDB4RkYsMHgzRCwgMHhDRiwweDlGLDB4RkUsMHgwNywweEZGLDB4QUYsMHhFQiwweEZFLAorMHhGRCwweEJGLDB4RUYsMHhFQiwweEZBLDB4RkYsMHhBRiwweEVCLCAweEZBLDB4RkUsMHhCRiwweEFGLDB4RkIsMHhGRSwweDNGLDB4RkIsCisweDlCLDB4RkYsMHg3RiwweERGLDB4RkYsMHhGMywweEZFLDB4RkYsIDB4REUsMHhGNywweEJGLDB4N0IsMHhERSwweEY3LDB4QkQsMHhFRiwKKzB4N0IsMHhGRSwweEZGLDB4RkYsMHhERiwweDNGLDB4RkUsMHhGRiwgMHhCNywweEZGLDB4RUYsMHhGNywweEZGLDB4QkYsMHhFRCwweEZFLAorMHhERiwweEI3LDB4RUQsMHhGQiwweDdFLDB4REYsMHhGRiwweEZGLCAweEZGLDB4RkQsMHg1RiwweEVGLDB4RUIsMHhGQSwweEZFLDB4RjUsCisweEJGLDB4NkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkUsMHhGOCwweEZGLDB4QTgsMHhGRiwKKzB4RkYsMHhCRiwweEVGLDB4RkIsMHg2QSwweEZCLDB4QjcsMHhFRiwgMHhGQiwweEZGLDB4QkYsMHhFRiwweEZCLDB4RkUsMHhGRiwweEJGLAorMHhFRiwweEZCLDB4RkYsMHhFMCwweEZGLDB4RkYsMHhGRCwweDdGLCAweDVDLDB4RDcsMHg3RCwweERGLDB4RjMsMHg1QywweEY1LDB4Q0QsCisweDczLDB4NUUsMHhENywweEI1LDB4RkQsMHg3RiwweEVGLDB4RkYsIDB4REIsMHhGRiwweEZGLDB4RTIsMHhGOCwweEJFLDB4MkYsMHg4RiwKKzB4RTcsMHhGOCwweEJFLDB4NkIsMHhFMiwweEY4LDB4QkUsMHgyRiwgMHg4QiwweEUyLDB4RjksMHhGRSwweDdGLDB4RTcsMHhGRiwweEQ3LAorMHhGNSwweEZELDB4N0YsMHhGRiwweEY3LDB4RjUsMHhGRCwweDdGLCAweEQ3LDB4RjUsMHhGRCwweDdGLDB4NUYsMHhENywweEY1LDB4RkYsCisweEZGLDB4RkYsMHg4RiwweEZGLDB4QUYsMHhFQiwweEZBLDB4RkYsIDB4RkYsMHhCRiwweEVCLDB4RkEsMHhGRiwweDJGLDB4RUIsMHhGQSwKKzB4RkUsMHhCRiwweEFGLDB4RUIsMHhGRiwweEZGLDB4RkUsMHg1RiwgMHhGRiwweDVGLDB4RkYsMHhGRiwweEZELDB4RkYsMHhGRiwweEQ3LAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4QkYsMHhGRSwweEI3LDB4RkQsCisweEZGLDB4N0UsMHhERiwweEY3LDB4QUQsMHhGRiwweDdGLDB4RjcsIDB4RkQsMHhGRiwweDdGLDB4REYsMHhGNywweEZELDB4RkYsMHg3RiwKKzB4RjYsMHg3RiwweEZGLDB4RkYsMHhGRiwweERCLDB4RjYsMHhGQywgMHhBRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RjcsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RUMsMHhCRiwweEZGLCAweEFGLDB4RUIsMHhGQSwweEY2LDB4QUIsMHg4RiwweEVCLDB4RkEsCisweEY3LDB4QTUsMHhFQiwweEZBLDB4QkUsMHhCRiwweEFGLDB4RUIsIDB4RkEsMHhGRiwweDZELDB4RkYsMHhGRiwweDdGLDB4REYsMHgzMywKKzB4REQsMHhGRiwweDdGLDB4RkUsMHhGNywweEZDLDB4N0YsMHhGQiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEE5LAorMHhGRiwweEZELDB4RkYsMHhGRiwweEZFLDB4RkYsMHhGRiwweERGLCAweEZGLDB4RkYsMHhFRiwweEVGLDB4RkQsMHhGRiwweDdGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEZFLDB4QTcsMHhGRiwweEZGLDB4RkYsIDB4NzcsMHhERiwweEY3LDB4RkQsMHg5RiwweDdGLDB4RkUsMHg3NywKKzB4RUYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEFGLDB4QkYsMHhBRiwweEZGLDB4RjksMHhCRSwweEJGLAorMHg4RiwweEZCLDB4RkUsMHhGRSwweEVGLDB4RkIsMHhGRSwweEZGLCAweEJGLDB4RUYsMHhGQiwweEZGLDB4RkYsMHhGRCwweERGLDB4NkYsCisweEVGLDB4RkYsMHg3RiwweEZGLDB4QkYsMHhCRiwweERGLDB4RkYsIDB4RkMsMHhGRiwweERGLDB4RjcsMHhGRCwweEVGLDB4N0YsMHhERiwKKzB4RkYsMHhGRiwweEZGLDB4M0YsMHhGNiwweEZGLDB4Q0YsMHhGRiwgMHhEQiwweEZCLDB4RjcsMHhGRiwweEVCLDB4N0EsMHhGRiwweEZGLAorMHhGRiwweEJGLDB4RUYsMHhGQiwweEZGLDB4RkYsMHhGRiwweEZFLCAweDZELDB4RkQsMHhGRiwweDVGLDB4RkIsMHhGRiwweEZGLDB4RjcsCisweEZGLDB4NUYsMHhGNSwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGOCwweEZGLDB4RkIsMHhGRiwKKzB4RkYsMHhGRCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RTcsMHhGNiwgMHhCRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkIsMHhGRiwweEZGLAorMHhGRiwweEM5LDB4RkYsMHhGRiwweEZGLDB4QkQsMHhGRiwweEJGLCAweEFGLDB4RUYsMHhFRiwweDNGLDB4RDEsMHhGQywweDdGLDB4RkIsCisweEM3LDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEUzLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkQsMHhGRiwweEZGLDB4NzcsMHhGRiwKKzB4REYsMHhCNywweEZELDB4RjcsMHhGRCwweEY3LDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHg1NywweEZGLDB4RjcsMHhBNSwweEZELAorMHgzRiwweERGLDB4QkYsMHhCRiwweEZFLDB4N0YsMHhGRiwweEZGLCAweEZGLDB4REYsMHhGQSwweEZELDB4RkYsMHhGRiwweEZGLDB4RkUsCisweDg3LDB4RkYsMHhFOSwweEZGLDB4RkUsMHhFRiwweEJGLDB4RUYsIDB4RkUsMHhGRSwweEZGLDB4RUYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGQSwweDlGLDB4RkYsMHgzRiwgMHhGRiwweEZELDB4RkQsMHg1NywweERGLDB4RkQsMHhGMywweEZGLAorMHhERiwweEZELDB4RkYsMHg1RiwweERGLDB4RjUsMHhGRCwweEZGLCAweEZGLDB4RjksMHg4RiwweEZGLDB4RkYsMHhGRiwweEVFLDB4N0YsCisweEZGLDB4RkYsMHhCRiwweDVFLDB4RkUsMHhFQywweEZCLDB4M0YsIDB4N0YsMHg5RiwweEVGLDB4RjksMHhGRiwweEZGLDB4Q0QsMHg2QiwKKzB4RkYsMHhGRiwweEZGLDB4QzUsMHhGMywweEZDLDB4RkEsMHgzOCwgMHhGRiwweEFGLDB4M0YsMHhFRSwweDdGLDB4OUYsMHhGRiwweEQ5LAorMHhGRiwweEZGLDB4RkQsMHg3QSwweEY3LDB4RkYsMHhGMywweEZGLCAweEFGLDB4NkYsMHhEQiwweEYyLDB4QjksMHhFOSwweEZCLDB4RkYsCisweEZGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhFRiwweEZGLDB4RkIsIDB4QzUsMHhCRiwweEZGLDB4RUYsMHhGRiwweDVFLDB4QjcsMHhBRCwKKzB4Q0QsMHg3OSwweDdDLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZELDB4OTMsMHhGRiwweEVGLAorMHhFQSwweEZFLDB4QkYsMHhFRiwweDVCLDB4RDIsMHhDRCwweEY1LCAweDZELDB4NzcsMHhERiwweEY3LDB4RkQsMHhGRiwweDdGLDB4REYsCisweEZGLDB4RkYsMHg2NiwweEZGLDB4RDUsMHg2NSwweDdELDB4NUYsIDB4NzUsMHg5RCwweDY1LDB4N0YsMHhENiwweEZCLDB4NEYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RjYsMHhDNywgMHhGRiwweEJGLDB4RUYsMHhGQSwweEZFLDB4RkYsMHhCRiwweEVCLAorMHhGRiwweERGLDB4RkYsMHg3RSwweEZGLDB4RkYsMHhFRiwweEZELCAweDdFLDB4RDcsMHhGRiwweDc4LDB4REYsMHhGRiwweDVGLDB4REYsCisweEY1LDB4QkYsMHg3RiwweERGLDB4QzUsMHhGRiwweDNGLDB4RjYsIDB4N0UsMHhGRiwweDBGLDB4RUYsMHhGMiwweDNFLDB4QkYsMHhGRiwKKzB4RkIsMHgzRiwweEZGLDB4RkIsMHg3RiwweEZGLDB4QjMsMHhGRSwgMHhGQiwweEY2LDB4RkQsMHhGRiwweERBLDB4RjcsMHhGRCwweEZGLAorMHg3RiwweERGLDB4RjcsMHhCRiwweEZGLDB4RkEsMHg3RiwweEZGLCAweEZGLDB4RkYsMHhGRiwweDlGLDB4RkYsMHhGMywweERDLDB4RjksCisweEJGLDB4Q0UsMHhFNywweEY5LDB4RkUsMHg3RiwweDlGLDB4RTcsIDB4RkYsMHhGRiwweEUyLDB4N0YsMHhGRSwweEZGLDB4QkYsMHhFRiwKKzB4RUIsMHhGQSwweEZGLDB4OUYsMHg2NywweDFFLDB4RkYsMHg4RiwgMHhFNywweEY4LDB4RkUsMHg3RiwweDhGLDB4RUYsMHhGRiwweEJELAorMHhCRiwweEZGLDB4RkIsMHhGRiwweEZGLDB4REYsMHhGNywweEZGLCAweEZDLDB4RkYsMHhCRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhGRiwweEZELDB4QjMsMHhGRiwweEZGLDB4RUYsIDB4RkYsMHhGRiwweEJGLDB4RUQsMHhGRiwweEZCLDB4RUUsMHhGRSwKKzB4RkYsMHhGRiwweEVGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEI1LDB4RkYsMHhCNywweEZELDB4RkQsMHg2RSwweEZGLAorMHhGRiwweEZFLDB4RkQsMHgyRiwweEQ4LDB4RkUsMHhCRiwweDhGLCAweEVCLDB4RjksMHhGRSwweDNGLDB4RkYsMHhGQSwweENGLDB4RkYsCisweEU3LDB4RDksMHhGQSwweEJGLDB4REYsMHg3NywweEZDLDB4RkIsIDB4M0YsMHhBQiwweEZFLDB4RkYsMHhCRiwweEVGLDB4RkIsMHhGRSwKKzB4RkYsMHhGRiwweEVFLDB4MUYsMHhGRiwweERGLDB4RjcsMHhGRiwgMHhGRiwweEZGLDB4NUYsMHg5NywweDM1LDB4QkYsMHg1RSwweEZFLAorMHhCRiwweEVGLDB4RkYsMHhGNywweEZELDB4RkYsMHhGRiwweEZBLCAweEJGLDB4RkYsMHhCRSwweDZGLDB4OUYsMHhFNywweEY4LDB4QkUsCisweDJGLDB4OEIsMHg2NiwweDk0LDB4N0QsMHg5RCwweEU3LDB4RjksIDB4RkUsMHg3RiwweDlGLDB4RTcsMHhGMSwweDdGLDB4RkYsMHhGRiwKKzB4RkYsMHhGNywweEY1LDB4RkQsMHg3RiwweDVGLDB4RkIsMHhGRCwgMHg5RSwweEZGLDB4RkIsMHhGRSwweEZGLDB4RkYsMHhFRiwweEZGLAorMHhGRiwweEEwLDB4RkYsMHhGRiwweEZGLDB4QkYsMHhFRiwweEVCLCAweEZBLDB4RkUsMHhCRiwweEI3LDB4RjcsMHhGNywweEZGLDB4RkYsCisweEZELDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweERELDB4RkYsIDB4RkQsMHhGRiwweEZGLDB4RkYsMHhENywweEZGLDB4RkYsMHhGRiwKKzB4N0YsMHhGNSwweEZGLDB4RkYsMHhFRiwweEZGLDB4RkYsMHhGRiwgMHhCRiwweEZGLDB4RkYsMHhBQiwweEZFLDB4RkIsMHhGRSwweEZGLAorMHhGNywweEFGLDB4RkYsMHhGRiwweERFLDB4RjcsMHhFQiwweDVGLCAweERGLDB4RjcsMHhGRCwweEZGLDB4N0YsMHhERiwweEZGLDB4RkYsCisweEIzLDB4RkYsMHhDOSwweEZFLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RDYsMHhGRiwweEZGLDB4Q0IsMHhGRiwweEZGLDB4REYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGQywweDhGLDB4RkYsMHhCQSwgMHhCRSwweEJGLDB4QUYsMHhFQiwweDc4LDB4RkUsMHhCNywweEFELAorMHgzQSwweEZFLDB4QjcsMHhBRiwweEVCLDB4N0EsMHhGRSwweEJGLCAweEFGLDB4RkYsMHg5RiwweEZGLDB4RkYsMHhERiwweEZDLDB4RkYsCisweEZGLDB4RkUsMHhDMywweEZFLDB4RkYsMHhGRiwweDMzLDB4RkMsIDB4RkYsMHhCRiwweERGLDB4RjMsMHhGRiwweEZGLDB4QkIsMHg5RiwKKzB4RkYsMHhGRiwweEZGLDB4RUIsMHhERiwweEZGLDB4RkYsMHhBRiwgMHhGNywweDZGLDB4RjksMHhCRiwweEVGLDB4RkQsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhFMywweDdGLDB4RkYsMHhGRiwweEZGLCAweEZCLDB4RkYsMHhGRiwweEJGLDB4RkQsMHhGQiwweEY3LDB4RkYsCisweERGLDB4RjcsMHhGRiwweEZFLDB4RUYsMHg1RiwweEJELDB4RkYsIDB4RkEsMHhGRiwweEY4LDB4RkYsMHhCRiwweEFGLDB4RkIsMHhGRSwKKzB4RkUsMHgzRiwweEVGLDB4RTgsMHhGRiwweERGLDB4RjMsMHhGRCwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RUQsMHhGRiwweEZCLAorMHhGRCwweEZGLDB4QUYsMHhGRiwweEZGLDB4RkUsMHhGRSwweEJGLCAweERCLDB4RkYsMHhGRiwweEZGLDB4QkYsMHhGRiwweERGLDB4RkYsCisweEZELDB4RkYsMHhDQiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4QkYsMHg2RiwweEZGLDB4N0YsMHhCNywweEIzLDB4RkYsMHhGRiwKKzB4REYsMHhGRiwweEZCLDB4RUYsMHhGRiwweEZGLDB4RkYsMHgwNywgMHhGRiwweEZCLDB4RkYsMHhGRiwweEZGLDB4RUQsMHhGRiwweEY1LAorMHg3QywweEZGLDB4N0YsMHhGRSwweEZGLDB4RkYsMHhFRiwweENGLCAweEZGLDB4RkIsMHhGRiwweEZGLDB4MkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RjMsMHhGRiwweEZCLDB4RkYsMHhGRSwweEZGLDB4RkYsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhCRiwweEZGLDB4RkYsMHhGRiwKKzB4RkQsMHgxQiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkUsMHg3QywweEZGLDB4RkYsMHhGRiwweEZGLAorMHhFRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkIsMHhCRiwweDdGLCAweEZELDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweERCLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkQsIDB4RkYsMHhGRiwweEYwLDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZCLDB4RkYsMHhERiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkQsMHhCRiwweEZFLAorMHg3RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RUYsMHhGRSwweEZGLDB4QkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhFRiwweEZBLDB4QjUsMHhGRiwweEZGLDB4RkYsIDB4RjcsMHhGNywweEZGLDB4RkYsMHhGRiwweEZGLDB4REYsMHhGQiwKKzB4RkMsMHhGRiwweEZGLDB4RkUsMHhGRiwweDdGLDB4REYsMHhCRiwgMHhGRiwweENCLDB4QkYsMHhGOSwweEZFLDB4N0YsMHg5RiwweEU3LAorMHhGOSwweEZFLDB4N0YsMHg5NywweEUxLDB4RkUsMHg3OSwweDlGLCAweEU3LDB4RkQsMHhGRSwweDdGLDB4REYsMHhGRSwweDM3LDB4RkYsCisweEZCLDB4REUsMHhERSwweEJELDB4RUYsMHhGMywweEZFLDB4RkIsIDB4QUYsMHhFQiwweEZFLDB4RkYsMHhGRiwweENGLDB4RkYsMHhGRSwKKzB4RkYsMHhCRiwweEZGLDB4OEYsMHhGRiwweEVGLDB4RkIsMHhGRSwgMHhGRiwweEJGLDB4RTcsMHhGOSwweDVFLDB4N0YsMHhFRiwweEZCLAorMHhEQSwweEZGLDB4QkYsMHhFRiwweEZCLDB4RkUsMHhGRiwweEZELCAweDFGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4REYsCisweEZGLDB4RkYsMHg3RiwweEZGLDB4RkYsMHhGNywweEZCLDB4N0YsIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGQywweDNGLDB4RkYsMHhCRiwKKzB4RUYsMHhGQiwweEZFLDB4RkYsMHhCRiwweEVGLDB4N0IsMHg3RiwgMHhCRiwweEVGLDB4RkIsMHhGRSwweEZGLDB4QjUsMHhFRiwweEZCLAorMHhCRiwweEZBLDB4N0YsMHhGQywweEZGLDB4M0YsMHhDRiwweEYzLCAweEZDLDB4RkYsMHgzRiwweENGLDB4QkMsMHhGRiwweDNGLDB4RUYsCisweEYzLDB4RkMsMHhGRSwweDNGLDB4Q0YsMHhGRiwweEVFLDB4RUYsIDB4RkIsMHhGRSwweEZGLDB4QkYsMHhFRiwweEZCLDB4NkEsMHhENywKKzB4QjcsMHhGQiwweEY4LDB4RkYsMHhCNywweEVGLDB4QkEsMHhGRSwgMHhGRiwweEJGLDB4N0YsMHhFOSwweEZGLDB4RjksMHg3RSwweDVGLAorMHg5NywweEU1LDB4RjksMHhGRSwweDdGLDB4QkYsMHhGOSwweDdFLCAweDVGLDB4OUYsMHhFNSwweEZCLDB4RkUsMHg1RiwweEI3LDB4RkYsCisweEEzLDB4RkYsMHhGNywweEZELDB4RkYsMHg3RiwweERGLDB4RjcsIDB4RkQsMHhGRiwweDVFLDB4RjcsMHg3RCwweEZGLDB4NzcsMHhERiwKKzB4RjcsMHhGRCwweEZGLDB4N0YsMHhGRiwweEQ3LDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZELDB4REYsMHhGQiwweDdGLAorMHhGRiwweEZGLDB4RUYsMHhGRiwweEZFLDB4RkIsMHhGRiwweEZGLCAweEJGLDB4RkUsMHg4RiwweEZGLDB4REYsMHhGNywweEZELDB4RkQsCisweDdGLDB4REYsMHhGNywweEZELDB4M0UsMHhERiwweEY1LDB4QkQsIDB4RkYsMHg3RiwweERGLDB4RjcsMHhGRCwweEY3LDB4RkYsMHg5RiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZELDB4RkYsMHhCRSwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhGRCwweDNGLDB4RkYsMHhERiwweEY3LCAweEZELDB4RkYsMHg3RiwweERGLDB4RjcsMHhGRCwweEZGLDB4Q0YsCisweDc3LDB4RkMsMHhGRiwweDVGLDB4REYsMHhGNywweEZELDB4RkYsIDB4RjQsMHg3RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZELDB4RkYsMHhGRiwweEZGLDB4RUUsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLCAweEVELDB4RkIsMHhGRiwweEZGLDB4QkYsMHhGRiwweEZGLDB4RkYsCisweEZGLDB4RkYsMHhFOSwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4RkYsMHhGQiwweEZGLDB4RkYsMHhGRiwweEQzLDB4RkYsMHhGRiwKKzB4QkYsMHgzRiwweEZCLDB4RkYsMHhGRiwweEZGLDB4RkIsMHhGMywgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkUsMHhGRiwweEY3LCAweEZGLDB4RkYsMHhGRiwweEZGLDB4MTcsMHhGRiwweEZGLDB4RkYsCisweERGLDB4RkYsMHhGRCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsIDB4REYsMHhERiwweEZGLDB4RkQsMHhGRiwweEZGLDB4REYsMHhGNywKKzB4RkYsMHg0RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweEZELAorMHhGRiwweEZGLDB4RkYsMHhGRiwweEZFLDB4RkYsMHg5RiwweEZGLCAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisweEZELDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweDdGLDB4RkYsIDB4RkYsMHhGRiwweDdBLDB4M0YsMHhGRiwweEZGLDB4RkYsMHhGRiwKKzB4RkYsMHhGRiwweEZGLDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEYyLAorMHg3RiwweEZGLDB4RkIsMHhGRSwweEZGLDB4QkYsMHhFRiwweEY4LCAweEZFLDB4RkYsMHhCRiwweEZCLDB4RkUsMHhGRiwweDhGLDB4RUMsCisweEZCLDB4RkUsMHhGRiwweEJGLDB4RjgsMHhGNywweEZFLDB4RkYsIDB4QkYsMHhFRiwweEZCLDB4RkUsMHhGRCwweEJGLDB4Q0YsMHhFQywKKzB4RkYsMHgzRiwweEVGLDB4REIsMHhGOCwweEZGLDB4QkYsMHhDRiwgMHhGRiwweEY5LDB4RkYsMHhGRiwweEJGLDB4RkYsMHhGQiwweEZGLAorMHhGRiwweEZGLDB4RUYsMHhGQiwweERGLDB4RkYsMHhGRiwweEZGLCAweEZGLDB4RkYsMHhCRiwweEZGLDB4RkYsMHhGRiwweEJCLDB4RkYsCisweEVGLDB4RkIsMHhGRSwweEVGLDB4QkYsMHhFRSwweEVCLDB4RkIsIDB4RkUsMHhGRiwweEVGLDB4RkUsMHhFRSwweEJGLDB4RkUsMHhFQiwKKzB4RkYsMHhFRiwweEZGLDB4MTcsMHhGRiwweDdFLDB4RUIsMHhCQiwgMHhGRSwweEJGLDB4QkUsMHhGQiwweEVGLDB4NUIsMHhGNywweEJELAorMHhGQiwweENGLDB4QkYsMHhCRiwweEJCLDB4RkIsMHg3RSwweENDLCAweEVGLDB4RkYKKworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL2RhYnVzYi5jIGIvZHJpdmVycy91c2IvbWVkaWEvZGFidXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyMzI5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL2RhYnVzYi5jCkBAIC0wLDAgKzEsODc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgICAgIGRhYnVzYi5jICAtLSAgZGFiIHVzYiBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgIERldGkgRmxpZWdsIChkZXRpQGZsaWVnbC5kZSkKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqCisgKiAgJElkOiBkYWJ1c2IuYyx2IDEuNTQgMjAwMC8wNy8yNCAyMTozOTozOSBkZXRpIEV4cCAkCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlICJkYWJ1c2IuaCIKKyNpbmNsdWRlICJkYWJmaXJtd2FyZS5oIgorCisvKgorICogVmVyc2lvbiBJbmZvcm1hdGlvbgorICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS41NCIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiRGV0aSBGbGllZ2wsIGRldGlAZmxpZWdsLmRlIgorI2RlZmluZSBEUklWRVJfREVTQyAiREFCLVVTQiBJbnRlcmZhY2UgRHJpdmVyIGZvciBMaW51eCAoYykxOTk5IgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMKKyNkZWZpbmUgTlJEQUJVU0IgMjU2CisjZWxzZQorI2RlZmluZSBOUkRBQlVTQiA0CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGRhYnVzYl90IGRhYnVzYltOUkRBQlVTQl07CitzdGF0aWMgaW50IGJ1ZmZlcnMgPSAyNTY7CitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZGFidXNiX2RyaXZlcjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBkYWJ1c2JfYWRkX2J1Zl90YWlsIChwZGFidXNiX3Qgcywgc3RydWN0IGxpc3RfaGVhZCAqZHN0LCBzdHJ1Y3QgbGlzdF9oZWFkICpzcmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChsaXN0X2VtcHR5IChzcmMpKSB7CisJCS8vIG5vIGVsZW1lbnRzIGluIHNvdXJjZSBidWZmZXIKKwkJcmV0ID0gLTE7CisJCWdvdG8gZXJyOworCX0KKwl0bXAgPSBzcmMtPm5leHQ7CisJbGlzdF9tb3ZlX3RhaWwgKHRtcCwgZHN0KTsKKworICBlcnI6CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgREVCVUcgCitzdGF0aWMgdm9pZCBkdW1wX3VyYiAoc3RydWN0IHVyYiAqdXJiKQoreworCWRiZygidXJiICAgICAgICAgICAgICAgICAgIDolcCIsIHVyYik7CisJZGJnKCJkZXYgICAgICAgICAgICAgICAgICAgOiVwIiwgdXJiLT5kZXYpOworCWRiZygicGlwZSAgICAgICAgICAgICAgICAgIDolMDhYIiwgdXJiLT5waXBlKTsKKwlkYmcoInN0YXR1cyAgICAgICAgICAgICAgICA6JWQiLCB1cmItPnN0YXR1cyk7CisJZGJnKCJ0cmFuc2Zlcl9mbGFncyAgICAgICAgOiUwOFgiLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKKwlkYmcoInRyYW5zZmVyX2J1ZmZlciAgICAgICA6JXAiLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJZGJnKCJ0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOiVkIiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKwlkYmcoImFjdHVhbF9sZW5ndGggICAgICAgICA6JWQiLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWRiZygic2V0dXBfcGFja2V0ICAgICAgICAgIDolcCIsIHVyYi0+c2V0dXBfcGFja2V0KTsKKwlkYmcoInN0YXJ0X2ZyYW1lICAgICAgICAgICA6JWQiLCB1cmItPnN0YXJ0X2ZyYW1lKTsKKwlkYmcoIm51bWJlcl9vZl9wYWNrZXRzICAgICA6JWQiLCB1cmItPm51bWJlcl9vZl9wYWNrZXRzKTsKKwlkYmcoImludGVydmFsICAgICAgICAgICAgICA6JWQiLCB1cmItPmludGVydmFsKTsKKwlkYmcoImVycm9yX2NvdW50ICAgICAgICAgICA6JWQiLCB1cmItPmVycm9yX2NvdW50KTsKKwlkYmcoImNvbnRleHQgICAgICAgICAgICAgICA6JXAiLCB1cmItPmNvbnRleHQpOworCWRiZygiY29tcGxldGUgICAgICAgICAgICAgIDolcCIsIHVyYi0+Y29tcGxldGUpOworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBkYWJ1c2JfY2FuY2VsX3F1ZXVlIChwZGFidXNiX3Qgcywgc3RydWN0IGxpc3RfaGVhZCAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXBidWZmX3QgYjsKKworCWRiZygiZGFidXNiX2NhbmNlbF9xdWV1ZSIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZzLT5sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsIHEsIGJ1ZmZfbGlzdCkgeworI2lmZGVmIERFQlVHCisJCWR1bXBfdXJiKGItPnB1cmIpOworI2VuZGlmCisJCXVzYl91bmxpbmtfdXJiIChiLT5wdXJiKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGRhYnVzYl9mcmVlX3F1ZXVlIChzdHJ1Y3QgbGlzdF9oZWFkICpxKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXBidWZmX3QgYjsKKworCWRiZygiZGFidXNiX2ZyZWVfcXVldWUiKTsKKwlmb3IgKHAgPSBxLT5uZXh0OyBwICE9IHE7KSB7CisJCWIgPSBsaXN0X2VudHJ5IChwLCBidWZmX3QsIGJ1ZmZfbGlzdCk7CisKKyNpZmRlZiBERUJVRyAKKwkJZHVtcF91cmIoYi0+cHVyYik7CisjZW5kaWYKKwkJaWYgKGItPnB1cmItPnRyYW5zZmVyX2J1ZmZlcikKKwkJCWtmcmVlIChiLT5wdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JfZnJlZV91cmIoYi0+cHVyYik7CisJCXRtcCA9IHAtPm5leHQ7CisJCWxpc3RfZGVsIChwKTsKKwkJa2ZyZWUgKGIpOworCQlwID0gdG1wOworCX0KKworCXJldHVybiAwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgZGFidXNiX2ZyZWVfYnVmZmVycyAocGRhYnVzYl90IHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkYmcoImRhYnVzYl9mcmVlX2J1ZmZlcnMiKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlkYWJ1c2JfZnJlZV9xdWV1ZSAoJnMtPmZyZWVfYnVmZl9saXN0KTsKKwlkYWJ1c2JfZnJlZV9xdWV1ZSAoJnMtPnJlY19idWZmX2xpc3QpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJcy0+Z290X21lbSA9IDA7CisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgZGFidXNiX2lzb19jb21wbGV0ZSAoc3RydWN0IHVyYiAqcHVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcGJ1ZmZfdCBiID0gcHVyYi0+Y29udGV4dDsKKwlwZGFidXNiX3QgcyA9IGItPnM7CisJaW50IGk7CisJaW50IGxlbjsKKwlpbnQgZHN0ID0gMDsKKwl2b2lkICpidWYgPSBwdXJiLT50cmFuc2Zlcl9idWZmZXI7CisKKwlkYmcoImRhYnVzYl9pc29fY29tcGxldGUiKTsKKworCS8vIHByb2Nlc3MgaWYgVVJCIHdhcyBub3Qga2lsbGVkCisJaWYgKHB1cmItPnN0YXR1cyAhPSAtRU5PRU5UKSB7CisJCXVuc2lnbmVkIGludCBwaXBlID0gdXNiX3Jjdmlzb2NwaXBlIChwdXJiLT5kZXYsIF9EQUJVU0JfSVNPUElQRSk7CisJCWludCBwaXBlc2l6ZSA9IHVzYl9tYXhwYWNrZXQgKHB1cmItPmRldiwgcGlwZSwgdXNiX3BpcGVvdXQgKHBpcGUpKTsKKwkJZm9yIChpID0gMDsgaSA8IHB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspCisJCQlpZiAoIXB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cykgeworCQkJCWxlbiA9IHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CisJCQkJaWYgKGxlbiA8PSBwaXBlc2l6ZSkgeworCQkJCQltZW1jcHkgKGJ1ZiArIGRzdCwgYnVmICsgcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0LCBsZW4pOworCQkJCQlkc3QgKz0gbGVuOworCQkJCX0KKwkJCQllbHNlCisJCQkJCWVycigiZGFidXNiX2lzb19jb21wbGV0ZTogaW52YWxpZCBsZW4gJWQiLCBsZW4pOworCQkJfQorCQkJZWxzZQorCQkJCXdhcm4oImRhYnVzYl9pc29fY29tcGxldGU6IGNvcnJ1cHRlZCBwYWNrZXQgc3RhdHVzOiAlZCIsIHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CisJCWlmIChkc3QgIT0gcHVyYi0+YWN0dWFsX2xlbmd0aCkKKwkJCWVycigiZHN0IT1wdXJiLT5hY3R1YWxfbGVuZ3RoOiVkIT0lZCIsIGRzdCwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJfQorCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QgKCZzLT5wZW5kaW5nX2lvKSAmJiAhcy0+cmVtb3ZlX3BlbmRpbmcgJiYgcy0+c3RhdGUgIT0gX3N0b3BwZWQpIHsKKwkJcy0+b3ZlcnJ1bnMrKzsKKwkJZXJyKCJvdmVycnVuICglZCkiLCBzLT5vdmVycnVucyk7CisJfQorCXdha2VfdXAgKCZzLT53YWl0KTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGRhYnVzYl9hbGxvY19idWZmZXJzIChwZGFidXNiX3QgcykKK3sKKwlpbnQgYnVmZmVycyA9IDA7CisJcGJ1ZmZfdCBiOworCXVuc2lnbmVkIGludCBwaXBlID0gdXNiX3Jjdmlzb2NwaXBlIChzLT51c2JkZXYsIF9EQUJVU0JfSVNPUElQRSk7CisJaW50IHBpcGVzaXplID0gdXNiX21heHBhY2tldCAocy0+dXNiZGV2LCBwaXBlLCB1c2JfcGlwZW91dCAocGlwZSkpOworCWludCBwYWNrZXRzID0gX0lTT1BJUEVTSVpFIC8gcGlwZXNpemU7CisJaW50IHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBwYWNrZXRzICogcGlwZXNpemU7CisJaW50IGk7CisKKwlkYmcoImRhYnVzYl9hbGxvY19idWZmZXJzIHBpcGVzaXplOiVkIHBhY2tldHM6JWQgdHJhbnNmZXJfYnVmZmVyX2xlbjolZCIsCisJCSBwaXBlc2l6ZSwgcGFja2V0cywgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisKKwl3aGlsZSAoYnVmZmVycyA8IChzLT50b3RhbF9idWZmZXJfc2l6ZSA8PCAxMCkpIHsKKwkJYiA9IChwYnVmZl90KSBrbWFsbG9jIChzaXplb2YgKGJ1ZmZfdCksIEdGUF9LRVJORUwpOworCQlpZiAoIWIpIHsKKwkJCWVycigia21hbGxvYyhzaXplb2YoYnVmZl90KSk9PU5VTEwiKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCW1lbXNldCAoYiwgMCwgc2l6ZW9mIChidWZmX3QpKTsKKwkJYi0+cyA9IHM7CisJCWItPnB1cmIgPSB1c2JfYWxsb2NfdXJiKHBhY2tldHMsIEdGUF9LRVJORUwpOworCQlpZiAoIWItPnB1cmIpIHsKKwkJCWVycigidXNiX2FsbG9jX3VyYiA9PSBOVUxMIik7CisJCQlrZnJlZSAoYik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWItPnB1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MgKHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIEdGUF9LRVJORUwpOworCQlpZiAoIWItPnB1cmItPnRyYW5zZmVyX2J1ZmZlcikgeworCQkJa2ZyZWUgKGItPnB1cmIpOworCQkJa2ZyZWUgKGIpOworCQkJZXJyKCJrbWFsbG9jKCVkKT09TlVMTCIsIHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCQkJZ290byBlcnI7CisJCX0KKworCQliLT5wdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwkJYi0+cHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBwYWNrZXRzOworCQliLT5wdXJiLT5jb21wbGV0ZSA9IGRhYnVzYl9pc29fY29tcGxldGU7CisJCWItPnB1cmItPmNvbnRleHQgPSBiOworCQliLT5wdXJiLT5kZXYgPSBzLT51c2JkZXY7CisJCWItPnB1cmItPnBpcGUgPSBwaXBlOworCQliLT5wdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKworCQlmb3IgKGkgPSAwOyBpIDwgcGFja2V0czsgaSsrKSB7CisJCQliLT5wdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBpICogcGlwZXNpemU7CisJCQliLT5wdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGggPSBwaXBlc2l6ZTsKKwkJfQorCisJCWJ1ZmZlcnMgKz0gdHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwkJbGlzdF9hZGRfdGFpbCAoJmItPmJ1ZmZfbGlzdCwgJnMtPmZyZWVfYnVmZl9saXN0KTsKKwl9CisJcy0+Z290X21lbSA9IGJ1ZmZlcnM7CisKKwlyZXR1cm4gMDsKKworCWVycjoKKwlkYWJ1c2JfZnJlZV9idWZmZXJzIChzKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGRhYnVzYl9idWxrIChwZGFidXNiX3QgcywgcGJ1bGtfdHJhbnNmZXJfdCBwYikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBwaXBlOworCWludCBhY3R1YWxfbGVuZ3RoOworCisJZGJnKCJkYWJ1c2JfYnVsayIpOworCisJaWYgKCFwYi0+cGlwZSkKKwkJcGlwZSA9IHVzYl9yY3ZidWxrcGlwZSAocy0+dXNiZGV2LCAyKTsKKwllbHNlCisJCXBpcGUgPSB1c2Jfc25kYnVsa3BpcGUgKHMtPnVzYmRldiwgMik7CisKKwlyZXQ9dXNiX2J1bGtfbXNnKHMtPnVzYmRldiwgcGlwZSwgcGItPmRhdGEsIHBiLT5zaXplLCAmYWN0dWFsX2xlbmd0aCwgMTAwKTsKKwlpZihyZXQ8MCkgeworCQllcnIoImRhYnVzYjogdXNiX2J1bGtfbXNnIGZhaWxlZCglZCkiLHJldCk7CisKKwkJaWYgKHVzYl9zZXRfaW50ZXJmYWNlIChzLT51c2JkZXYsIF9EQUJVU0JfSUYsIDEpIDwgMCkgeworCQkJZXJyKCJzZXRfaW50ZXJmYWNlIGZhaWxlZCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCX0KKwkKKwlpZiggcmV0ID09IC1FUElQRSApIHsKKwkJd2FybigiQ0xFQVJfRkVBVFVSRSByZXF1ZXN0IHRvIHJlbW92ZSBTVEFMTCBjb25kaXRpb24uIik7CisJCWlmKHVzYl9jbGVhcl9oYWx0KHMtPnVzYmRldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSkpCisJCQllcnIoInJlcXVlc3QgZmFpbGVkIik7CisJfQorCisJcGItPnNpemUgPSBhY3R1YWxfbGVuZ3RoOworCXJldHVybiByZXQ7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgZGFidXNiX3dyaXRlbWVtIChwZGFidXNiX3QgcywgaW50IHBvcywgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgKnRyYW5zZmVyX2J1ZmZlciA9ICBrbWFsbG9jIChsZW4sIEdGUF9LRVJORUwpOworCisJaWYgKCF0cmFuc2Zlcl9idWZmZXIpIHsKKwkJZXJyKCJkYWJ1c2Jfd3JpdGVtZW06IGttYWxsb2MoJWQpIGZhaWxlZC4iLCBsZW4pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkgKHRyYW5zZmVyX2J1ZmZlciwgZGF0YSwgbGVuKTsKKworCXJldD11c2JfY29udHJvbF9tc2cocy0+dXNiZGV2LCB1c2Jfc25kY3RybHBpcGUoIHMtPnVzYmRldiwgMCApLCAweGEwLCAweDQwLCBwb3MsIDAsIHRyYW5zZmVyX2J1ZmZlciwgbGVuLCAzMDApOworCisJa2ZyZWUgKHRyYW5zZmVyX2J1ZmZlcik7CisJcmV0dXJuIHJldDsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBkYWJ1c2JfODA1MV9yZXNldCAocGRhYnVzYl90IHMsIHVuc2lnbmVkIGNoYXIgcmVzZXRfYml0KQoreworCWRiZygiZGFidXNiXzgwNTFfcmVzZXQ6ICVkIixyZXNldF9iaXQpOworCXJldHVybiBkYWJ1c2Jfd3JpdGVtZW0gKHMsIENQVUNTX1JFRywgJnJlc2V0X2JpdCwgMSk7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgZGFidXNiX2xvYWRtZW0gKHBkYWJ1c2JfdCBzLCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKwlpbnQgcmV0OworCVBJTlRFTF9IRVhfUkVDT1JEIHB0ciA9IGZpcm13YXJlOworCisJZGJnKCJFbnRlciBkYWJ1c2JfbG9hZG1lbSAoaW50ZXJuYWwpIik7CisJCisJcmV0ID0gZGFidXNiXzgwNTFfcmVzZXQgKHMsIDEpOworCXdoaWxlIChwdHItPlR5cGUgPT0gMCkgeworCisJCWRiZygiZGFidXNiX3dyaXRlbWVtOiAlMDRYICVwICVkKSIsIHB0ci0+QWRkcmVzcywgcHRyLT5EYXRhLCBwdHItPkxlbmd0aCk7CisKKwkJcmV0ID0gZGFidXNiX3dyaXRlbWVtIChzLCBwdHItPkFkZHJlc3MsIHB0ci0+RGF0YSwgcHRyLT5MZW5ndGgpOworCQlpZiAocmV0IDwgMCkgeworCQkJZXJyKCJkYWJ1c2Jfd3JpdGVtZW0gZmFpbGVkICglZCAlMDRYICVwICVkKSIsIHJldCwgcHRyLT5BZGRyZXNzLCBwdHItPkRhdGEsIHB0ci0+TGVuZ3RoKTsKKwkJCWJyZWFrOworCQl9CisJCXB0cisrOworCX0KKwlyZXQgPSBkYWJ1c2JfODA1MV9yZXNldCAocywgMCk7CisKKwlkYmcoImRhYnVzYl9sb2FkbWVtOiBleGl0Iik7CisKKwlyZXR1cm4gcmV0OworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IGRhYnVzYl9mcGdhX2NsZWFyIChwZGFidXNiX3QgcywgcGJ1bGtfdHJhbnNmZXJfdCBiKQoreworCWItPnNpemUgPSA0OworCWItPmRhdGFbMF0gPSAweDJhOworCWItPmRhdGFbMV0gPSAwOworCWItPmRhdGFbMl0gPSAwOworCWItPmRhdGFbM10gPSAwOworCisJZGJnKCJkYWJ1c2JfZnBnYV9jbGVhciIpOworCisJcmV0dXJuIGRhYnVzYl9idWxrIChzLCBiKTsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBkYWJ1c2JfZnBnYV9pbml0IChwZGFidXNiX3QgcywgcGJ1bGtfdHJhbnNmZXJfdCBiKQoreworCWItPnNpemUgPSA0OworCWItPmRhdGFbMF0gPSAweDJjOworCWItPmRhdGFbMV0gPSAwOworCWItPmRhdGFbMl0gPSAwOworCWItPmRhdGFbM10gPSAwOworCisJZGJnKCJkYWJ1c2JfZnBnYV9pbml0Iik7CisKKwlyZXR1cm4gZGFidXNiX2J1bGsgKHMsIGIpOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IGRhYnVzYl9mcGdhX2Rvd25sb2FkIChwZGFidXNiX3QgcywgY29uc3QgY2hhciAqZm5hbWUpCit7CisJcGJ1bGtfdHJhbnNmZXJfdCBiID0ga21hbGxvYyAoc2l6ZW9mIChidWxrX3RyYW5zZmVyX3QpLCBHRlBfS0VSTkVMKTsKKwl1bnNpZ25lZCBpbnQgYmxlbiwgbjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGJpdHN0cmVhbTsKKworCWRiZygiRW50ZXIgZGFidXNiX2ZwZ2FfZG93bmxvYWQgKGludGVybmFsKSIpOworCisJaWYgKCFiKSB7CisJCWVycigia21hbGxvYyhzaXplb2YoYnVsa190cmFuc2Zlcl90KSk9PU5VTEwiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYi0+cGlwZSA9IDE7CisJcmV0ID0gZGFidXNiX2ZwZ2FfY2xlYXIgKHMsIGIpOworCW1kZWxheSAoMTApOworCWJsZW4gPSBidWZbNzNdICsgKGJ1Zls3Ml0gPDwgOCk7CisKKwlkYmcoIkJpdHN0cmVhbSBsZW46ICVpIiwgYmxlbik7CisKKwliLT5kYXRhWzBdID0gMHgyYjsKKwliLT5kYXRhWzFdID0gMDsKKwliLT5kYXRhWzJdID0gMDsKKwliLT5kYXRhWzNdID0gNjA7CisKKwlmb3IgKG4gPSAwOyBuIDw9IGJsZW4gKyA2MDsgbiArPSA2MCkgeworCQkvLyBzb21lIGNjbGtzIGZvciBzdGFydHVwCisJCWItPnNpemUgPSA2NDsKKwkJbWVtY3B5IChiLT5kYXRhICsgNCwgYnVmICsgNzQgKyBuLCA2MCk7CisJCXJldCA9IGRhYnVzYl9idWxrIChzLCBiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVycigiZGFidXNiX2J1bGsgZmFpbGVkLiIpOworCQkJYnJlYWs7CisJCX0KKwkJbWRlbGF5ICgxKTsKKwl9CisKKwlyZXQgPSBkYWJ1c2JfZnBnYV9pbml0IChzLCBiKTsKKwlrZnJlZSAoYik7CisKKwlkYmcoImV4aXQgZGFidXNiX2ZwZ2FfZG93bmxvYWQiKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGFidXNiX3N0b3AgKHBkYWJ1c2JfdCBzKQoreworCWRiZygiZGFidXNiX3N0b3AiKTsKKworCXMtPnN0YXRlID0gX3N0b3BwZWQ7CisJZGFidXNiX2NhbmNlbF9xdWV1ZSAocywgJnMtPnJlY19idWZmX2xpc3QpOworCisJZGJnKCJwZW5kaW5nX2lvOiAlZCIsIHMtPnBlbmRpbmdfaW8uY291bnRlcik7CisKKwlzLT5wZW5kaW5nX2lvLmNvdW50ZXIgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhYnVzYl9zdGFydHJlayAocGRhYnVzYl90IHMpCit7CisJaWYgKCFzLT5nb3RfbWVtICYmIHMtPnN0YXRlICE9IF9zdGFydGVkKSB7CisKKwkJZGJnKCJkYWJ1c2Jfc3RhcnRyZWsiKTsKKworCQlpZiAoZGFidXNiX2FsbG9jX2J1ZmZlcnMgKHMpIDwgMCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlkYWJ1c2Jfc3RvcCAocyk7CisJCXMtPnN0YXRlID0gX3N0YXJ0ZWQ7CisJCXMtPnJlYWRwdHIgPSAwOworCX0KKworCWlmICghbGlzdF9lbXB0eSAoJnMtPmZyZWVfYnVmZl9saXN0KSkgeworCQlwYnVmZl90IGVuZDsKKwkJaW50IHJldDsKKwkJCisJd2hpbGUgKCFkYWJ1c2JfYWRkX2J1Zl90YWlsIChzLCAmcy0+cmVjX2J1ZmZfbGlzdCwgJnMtPmZyZWVfYnVmZl9saXN0KSkgeworCisJCQlkYmcoInN1Ym1pdHRpbmc6IGVuZDolcCBzLT5yZWNfYnVmZl9saXN0OiVwIiwgcy0+cmVjX2J1ZmZfbGlzdC5wcmV2LCAmcy0+cmVjX2J1ZmZfbGlzdCk7CisKKwkJCWVuZCA9IGxpc3RfZW50cnkgKHMtPnJlY19idWZmX2xpc3QucHJldiwgYnVmZl90LCBidWZmX2xpc3QpOworCisJCQlyZXQgPSB1c2Jfc3VibWl0X3VyYiAoZW5kLT5wdXJiLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChyZXQpIHsKKwkJCQllcnIoInVzYl9zdWJtaXRfdXJiIHJldHVybmVkOiVkIiwgcmV0KTsKKwkJCQlpZiAoZGFidXNiX2FkZF9idWZfdGFpbCAocywgJnMtPmZyZWVfYnVmZl9saXN0LCAmcy0+cmVjX2J1ZmZfbGlzdCkpCisJCQkJCWVycigic3RhcnRyZWs6IGRhYnVzYl9hZGRfYnVmX3RhaWwgZmFpbGVkIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQkJYXRvbWljX2luYyAoJnMtPnBlbmRpbmdfaW8pOworCQl9CisJCWRiZygicGVuZGluZ19pbzogJWQiLHMtPnBlbmRpbmdfaW8uY291bnRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRhYnVzYl9yZWFkIChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXBkYWJ1c2JfdCBzID0gKHBkYWJ1c2JfdCkgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcmV0ID0gMDsKKwlpbnQgcmVtOworCWludCBjbnQ7CisJcGJ1ZmZfdCBiOworCXN0cnVjdCB1cmIgKnB1cmIgPSBOVUxMOworCisJZGJnKCJkYWJ1c2JfcmVhZCIpOworCisJaWYgKCpwcG9zKQorCQlyZXR1cm4gLUVTUElQRTsKKworCWlmIChzLT5yZW1vdmVfcGVuZGluZykKKwkJcmV0dXJuIC1FSU87CisKKworCWlmICghcy0+dXNiZGV2KQorCQlyZXR1cm4gLUVJTzsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJZGFidXNiX3N0YXJ0cmVrIChzKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJnMtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAobGlzdF9lbXB0eSAoJnMtPnJlY19idWZmX2xpc3QpKSB7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCQkJZXJyKCJlcnJvcjogcmVjX2J1Zl9saXN0IGlzIGVtcHR5Iik7CisJCQlnb3RvIGVycjsKKwkJfQorCQkKKwkJYiA9IGxpc3RfZW50cnkgKHMtPnJlY19idWZmX2xpc3QubmV4dCwgYnVmZl90LCBidWZmX2xpc3QpOworCQlwdXJiID0gYi0+cHVyYjsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykJCS8vIHJldHVybiBub25ibG9ja2luZworCQkJIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbiAoJnMtPndhaXQpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkJc3Bpbl9sb2NrX2lycXNhdmUgKCZzLT5sb2NrLCBmbGFncyk7CisKKwkJCWlmIChsaXN0X2VtcHR5ICgmcy0+cmVjX2J1ZmZfbGlzdCkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJZXJyKCJlcnJvcjogc3RpbGwgbm8gYnVmZmVyIGF2YWlsYWJsZS4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCXMtPnJlYWRwdHIgPSAwOworCQl9CisJCWlmIChzLT5yZW1vdmVfcGVuZGluZykgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJcmVtID0gcHVyYi0+YWN0dWFsX2xlbmd0aCAtIHMtPnJlYWRwdHI7CQkvLyBzZXQgcmVtYWluaW5nIGJ5dGVzIHRvIGNvcHkKKworCQlpZiAoY291bnQgPj0gcmVtKQorCQkJY250ID0gcmVtOworCQllbHNlCisJCQljbnQgPSBjb3VudDsKKworCQlkYmcoImNvcHlfdG9fdXNlcjolcCAlcCAlZCIsYnVmLCBwdXJiLT50cmFuc2Zlcl9idWZmZXIgKyBzLT5yZWFkcHRyLCBjbnQpOworCisJCWlmIChjb3B5X3RvX3VzZXIgKGJ1ZiwgcHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgcy0+cmVhZHB0ciwgY250KSkgeworCQkJZXJyKCJyZWFkOiBjb3B5X3RvX3VzZXIgZmFpbGVkIik7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBlcnI7CisJCX0KKworCQlzLT5yZWFkcHRyICs9IGNudDsKKwkJY291bnQgLT0gY250OworCQlidWYgKz0gY250OworCQlyZXQgKz0gY250OworCisJCWlmIChzLT5yZWFkcHRyID09IHB1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJCS8vIGZpbmlzaGVkLCB0YWtlIG5leHQgYnVmZmVyCisJCQlpZiAoZGFidXNiX2FkZF9idWZfdGFpbCAocywgJnMtPmZyZWVfYnVmZl9saXN0LCAmcy0+cmVjX2J1ZmZfbGlzdCkpCisJCQkJZXJyKCJyZWFkOiBkYWJ1c2JfYWRkX2J1Zl90YWlsIGZhaWxlZCIpOworCQkJcy0+cmVhZHB0ciA9IDA7CisJCX0KKwl9CisgICAgICBlcnI6CQkJLy91cCgmcy0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGFidXNiX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBkZXZudW0gPSBpbWlub3IoaW5vZGUpOworCXBkYWJ1c2JfdCBzOworCisJaWYgKGRldm51bSA8IERBQlVTQl9NSU5PUiB8fCBkZXZudW0gPj0gKERBQlVTQl9NSU5PUiArIE5SREFCVVNCKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzID0gJmRhYnVzYltkZXZudW0gLSBEQUJVU0JfTUlOT1JdOworCisJZGJnKCJkYWJ1c2Jfb3BlbiIpOworCWRvd24gKCZzLT5tdXRleCk7CisKKwl3aGlsZSAoIXMtPnVzYmRldiB8fCBzLT5vcGVuZWQpIHsKKwkJdXAgKCZzLT5tdXRleCk7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDUwMCk7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJZG93biAoJnMtPm11dGV4KTsKKwl9CisJaWYgKHVzYl9zZXRfaW50ZXJmYWNlIChzLT51c2JkZXYsIF9EQUJVU0JfSUYsIDEpIDwgMCkgeworCQl1cCgmcy0+bXV0ZXgpOworCQllcnIoInNldF9pbnRlcmZhY2UgZmFpbGVkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzLT5vcGVuZWQgPSAxOworCXVwICgmcy0+bXV0ZXgpOworCisJZmlsZS0+Zl9wb3MgPSAwOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZGFidXNiX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXBkYWJ1c2JfdCBzID0gKHBkYWJ1c2JfdCkgZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJZGJnKCJkYWJ1c2JfcmVsZWFzZSIpOworCisJZG93biAoJnMtPm11dGV4KTsKKwlkYWJ1c2Jfc3RvcCAocyk7CisJZGFidXNiX2ZyZWVfYnVmZmVycyAocyk7CisJdXAgKCZzLT5tdXRleCk7CisKKwlpZiAoIXMtPnJlbW92ZV9wZW5kaW5nKSB7CisJCWlmICh1c2Jfc2V0X2ludGVyZmFjZSAocy0+dXNiZGV2LCBfREFCVVNCX0lGLCAwKSA8IDApCisJCQllcnIoInNldF9pbnRlcmZhY2UgZmFpbGVkIik7CisJfQorCWVsc2UKKwkJd2FrZV91cCAoJnMtPnJlbW92ZV9vayk7CisKKwlzLT5vcGVuZWQgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhYnVzYl9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXBkYWJ1c2JfdCBzID0gKHBkYWJ1c2JfdCkgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXBidWxrX3RyYW5zZmVyX3QgcGJ1bGs7CisJaW50IHJldCA9IDA7CisJaW50IHZlcnNpb24gPSBEQUJVU0JfVkVSU0lPTjsKKworCWRiZygiZGFidXNiX2lvY3RsIik7CisKKwlpZiAocy0+cmVtb3ZlX3BlbmRpbmcpCisJCXJldHVybiAtRUlPOworCisJZG93biAoJnMtPm11dGV4KTsKKworCWlmICghcy0+dXNiZGV2KSB7CisJCXVwICgmcy0+bXV0ZXgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBJT0NUTF9EQUJfQlVMSzoKKwkJcGJ1bGsgPSAocGJ1bGtfdHJhbnNmZXJfdCkga21hbGxvYyAoc2l6ZW9mIChidWxrX3RyYW5zZmVyX3QpLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoIXBidWxrKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIgKHBidWxrLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YgKGJ1bGtfdHJhbnNmZXJfdCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJa2ZyZWUgKHBidWxrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0PWRhYnVzYl9idWxrIChzLCBwYnVsayk7CisJCWlmKHJldD09MCkKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwYnVsaywKKwkJCQkJIHNpemVvZihidWxrX3RyYW5zZmVyX3QpKSkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQlrZnJlZSAocGJ1bGspOworCQlicmVhazsKKworCWNhc2UgSU9DVExfREFCX09WRVJSVU5TOgorCQlyZXQgPSBwdXRfdXNlciAocy0+b3ZlcnJ1bnMsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBJT0NUTF9EQUJfVkVSU0lPTjoKKwkJcmV0ID0gcHV0X3VzZXIgKHZlcnNpb24sICh1bnNpZ25lZCBpbnQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisJdXAgKCZzLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGFidXNiX2ZvcHMgPQoreworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5sbHNlZWsgPQlub19sbHNlZWssCisJLnJlYWQgPQkJZGFidXNiX3JlYWQsCisJLmlvY3RsID0JZGFidXNiX2lvY3RsLAorCS5vcGVuID0JCWRhYnVzYl9vcGVuLAorCS5yZWxlYXNlID0JZGFidXNiX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9jbGFzc19kcml2ZXIgZGFidXNiX2NsYXNzID0geworCS5uYW1lID0JCSJ1c2IvZGFidXNiJWQiLAorCS5mb3BzID0JCSZkYWJ1c2JfZm9wcywKKwkubW9kZSA9CQlTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCwKKwkubWlub3JfYmFzZSA9CURBQlVTQl9NSU5PUiwKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IGRhYnVzYl9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWludCByZXR2YWw7CisJcGRhYnVzYl90IHM7CisKKwlkYmcoImRhYnVzYjogcHJvYmU6IHZlbmRvciBpZCAweCV4LCBkZXZpY2UgaWQgMHgleCBpZm51bTolZCIsCisJICAgIGxlMTZfdG9fY3B1KHVzYmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJICAgIGxlMTZfdG9fY3B1KHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAorCSAgICBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCisJLyogV2UgZG9uJ3QgaGFuZGxlIG11bHRpcGxlIGNvbmZpZ3VyYXRpb25zICovCisJaWYgKHVzYmRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyICE9IF9EQUJVU0JfSUYgJiYKKwkgICAgbGUxNl90b19jcHUodXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gMHg5OTk5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCisKKwlzID0gJmRhYnVzYltpbnRmLT5taW5vcl07CisKKwlkb3duICgmcy0+bXV0ZXgpOworCXMtPnJlbW92ZV9wZW5kaW5nID0gMDsKKwlzLT51c2JkZXYgPSB1c2JkZXY7CisJcy0+ZGV2bnVtID0gaW50Zi0+bWlub3I7CisKKwlpZiAodXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24gKHVzYmRldikgPCAwKSB7CisJCWVycigicmVzZXRfY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKKwkJZ290byByZWplY3Q7CisJfQorCWlmIChsZTE2X3RvX2NwdSh1c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSAweDIxMzEpIHsKKwkJZGFidXNiX2xvYWRtZW0gKHMsIE5VTEwpOworCQlnb3RvIHJlamVjdDsKKwl9CisJZWxzZSB7CisJCWRhYnVzYl9mcGdhX2Rvd25sb2FkIChzLCBOVUxMKTsKKworCQlpZiAodXNiX3NldF9pbnRlcmZhY2UgKHMtPnVzYmRldiwgX0RBQlVTQl9JRiwgMCkgPCAwKSB7CisJCQllcnIoInNldF9pbnRlcmZhY2UgZmFpbGVkIik7CisJCQlnb3RvIHJlamVjdDsKKwkJfQorCX0KKwlkYmcoImJvdW5kIHRvIGludGVyZmFjZTogJWQiLCBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIHMpOworCXVwICgmcy0+bXV0ZXgpOworCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldihpbnRmLCAmZGFidXNiX2NsYXNzKTsKKwlpZiAocmV0dmFsKSB7CisJCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKKworICAgICAgcmVqZWN0OgorCXVwICgmcy0+bXV0ZXgpOworCXMtPnVzYmRldiA9IE5VTEw7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGRhYnVzYl9kaXNjb25uZWN0IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwl3YWl0X3F1ZXVlX3QgX193YWl0OworCXBkYWJ1c2JfdCBzID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisKKwlkYmcoImRhYnVzYl9kaXNjb25uZWN0Iik7CisJCisJaW5pdF93YWl0cXVldWVfZW50cnkoJl9fd2FpdCwgY3VycmVudCk7CisJCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CisJaWYgKHMpIHsKKwkJdXNiX2RlcmVnaXN0ZXJfZGV2IChpbnRmLCAmZGFidXNiX2NsYXNzKTsKKwkJcy0+cmVtb3ZlX3BlbmRpbmcgPSAxOworCQl3YWtlX3VwICgmcy0+d2FpdCk7CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5yZW1vdmVfb2ssICZfX3dhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWlmIChzLT5zdGF0ZSA9PSBfc3RhcnRlZCkKKwkJCXNjaGVkdWxlKCk7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+cmVtb3ZlX29rLCAmX193YWl0KTsKKwkJCisJCXMtPnVzYmRldiA9IE5VTEw7CisJCXMtPm92ZXJydW5zID0gMDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkYWJ1c2JfaWRzIFtdID0geworCS8vIHsgVVNCX0RFVklDRSgweDA1NDcsIDB4MjEzMSkgfSwJLyogQW4yMTMxIGNoaXAsIG5vIGJvb3QgUk9NICovCisJeyBVU0JfREVWSUNFKDB4MDU0NywgMHg5OTk5KSB9LAorCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGRhYnVzYl9pZHMpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZGFidXNiX2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkiZGFidXNiIiwKKwkucHJvYmUgPQlkYWJ1c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQlkYWJ1c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQlkYWJ1c2JfaWRzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRhYnVzYl9pbml0ICh2b2lkKQoreworCWludCByZXR2YWw7CisJdW5zaWduZWQgdTsKKworCS8qIGluaXRpYWxpemUgc3RydWN0ICovCisJZm9yICh1ID0gMDsgdSA8IE5SREFCVVNCOyB1KyspIHsKKwkJcGRhYnVzYl90IHMgPSAmZGFidXNiW3VdOworCQltZW1zZXQgKHMsIDAsIHNpemVvZiAoZGFidXNiX3QpKTsKKwkJaW5pdF9NVVRFWCAoJnMtPm11dGV4KTsKKwkJcy0+dXNiZGV2ID0gTlVMTDsKKwkJcy0+dG90YWxfYnVmZmVyX3NpemUgPSBidWZmZXJzOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkICgmcy0+d2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZzLT5yZW1vdmVfb2spOworCQlzcGluX2xvY2tfaW5pdCAoJnMtPmxvY2spOworCQlJTklUX0xJU1RfSEVBRCAoJnMtPmZyZWVfYnVmZl9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQgKCZzLT5yZWNfYnVmZl9saXN0KTsKKwl9CisKKwkvKiByZWdpc3RlciBtaXNjIGRldmljZSAqLworCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmZGFidXNiX2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwlkYmcoImRhYnVzYl9pbml0OiBkcml2ZXIgcmVnaXN0ZXJlZCIpOworCisJaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOworCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRhYnVzYl9jbGVhbnVwICh2b2lkKQoreworCWRiZygiZGFidXNiX2NsZWFudXAiKTsKKworCXVzYl9kZXJlZ2lzdGVyICgmZGFidXNiX2RyaXZlcik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CitNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShidWZmZXJzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyAoYnVmZmVycywgIk51bWJlciBvZiBidWZmZXJzIChkZWZhdWx0PTI1NikiKTsKKworbW9kdWxlX2luaXQgKGRhYnVzYl9pbml0KTsKK21vZHVsZV9leGl0IChkYWJ1c2JfY2xlYW51cCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvZGFidXNiLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9kYWJ1c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGI2NjZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvZGFidXNiLmgKQEAgLTAsMCArMSw4NSBAQAorI2RlZmluZSBfQlVMS19EQVRBX0xFTiA2NAordHlwZWRlZiBzdHJ1Y3QKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGFbX0JVTEtfREFUQV9MRU5dOworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBwaXBlOworfWJ1bGtfdHJhbnNmZXJfdCwqcGJ1bGtfdHJhbnNmZXJfdDsKKworI2RlZmluZSBEQUJVU0JfTUlOT1IgMjQwCQkvKiBzb21lIHVuYXNzaWduZWQgVVNCIG1pbm9yICovCisjZGVmaW5lIERBQlVTQl9WRVJTSU9OIDB4MTAwMAorI2RlZmluZSBJT0NUTF9EQUJfQlVMSyAgICAgICAgICAgICAgX0lPV1IoJ2QnLCAweDMwLCBidWxrX3RyYW5zZmVyX3QpCisjZGVmaW5lIElPQ1RMX0RBQl9PVkVSUlVOUwkgICAgX0lPUignZCcsICAweDE1LCBpbnQpCisjZGVmaW5lIElPQ1RMX0RBQl9WRVJTSU9OICAgICAgICAgICBfSU9SKCdkJywgMHgzZiwgaW50KSAKKworI2lmZGVmIF9fS0VSTkVMX18KKwordHlwZWRlZiBlbnVtIHsgX3N0b3BwZWQ9MCwgX3N0YXJ0ZWQgfSBkcml2ZXJfc3RhdGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlzdHJ1Y3Qgc2VtYXBob3JlIG11dGV4OworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZW1vdmVfb2s7CisJc3BpbmxvY2tfdCBsb2NrOworCWF0b21pY190IHBlbmRpbmdfaW87CisJZHJpdmVyX3N0YXRlX3Qgc3RhdGU7CisJaW50IHJlbW92ZV9wZW5kaW5nOworCWludCBnb3RfbWVtOworCWludCB0b3RhbF9idWZmZXJfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgb3ZlcnJ1bnM7CisJaW50IHJlYWRwdHI7CisJaW50IG9wZW5lZDsKKwlpbnQgZGV2bnVtOworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9idWZmX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCByZWNfYnVmZl9saXN0OworfSBkYWJ1c2JfdCwqcGRhYnVzYl90OworCit0eXBlZGVmIHN0cnVjdCAKK3sKKwlwZGFidXNiX3QgczsKKwlzdHJ1Y3QgdXJiICpwdXJiOworCXN0cnVjdCBsaXN0X2hlYWQgYnVmZl9saXN0OworfSBidWZmX3QsKnBidWZmX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKK30gYnVsa19jb21wbGV0aW9uX2NvbnRleHRfdCwgKnBidWxrX2NvbXBsZXRpb25fY29udGV4dF90OworCisKKyNkZWZpbmUgX0RBQlVTQl9JRiAyCisjZGVmaW5lIF9EQUJVU0JfSVNPUElQRSAweDA5CisjZGVmaW5lIF9JU09QSVBFU0laRQkxNjM4NAorCisjZGVmaW5lIF9CVUxLX0RBVEFfTEVOIDY0CisvLyBWZW5kb3Igc3BlY2lmaWMgcmVxdWVzdCBjb2RlIGZvciBBbmNob3IgVXBsb2FkL0Rvd25sb2FkCisvLyBUaGlzIG9uZSBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgY29yZQorI2RlZmluZSBBTkNIT1JfTE9BRF9JTlRFUk5BTCAgMHhBMAorCisvLyBFWi1VU0IgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyLiAgQml0IDAgY29udHJvbHMgODA1MSByZXNldAorI2RlZmluZSBDUFVDU19SRUcgICAgMHg3RjkyCisjZGVmaW5lIF9UT1RBTF9CVUZGRVJTIDM4NAorCisjZGVmaW5lIE1BWF9JTlRFTF9IRVhfUkVDT1JEX0xFTkdUSCAxNgorCisjaWZuZGVmIF9CWVRFX0RFRklORUQKKyNkZWZpbmUgX0JZVEVfREVGSU5FRAordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJZVEU7CisjZW5kaWYgLy8gIV9CWVRFX0RFRklORUQKKworI2lmbmRlZiBfV09SRF9ERUZJTkVECisjZGVmaW5lIF9XT1JEX0RFRklORUQKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgV09SRDsKKyNlbmRpZiAvLyAhX1dPUkRfREVGSU5FRAorCit0eXBlZGVmIHN0cnVjdCBfSU5URUxfSEVYX1JFQ09SRAoreworICAgQllURSAgTGVuZ3RoOworICAgV09SRCAgQWRkcmVzczsKKyAgIEJZVEUgIFR5cGU7CisgICBCWVRFICBEYXRhW01BWF9JTlRFTF9IRVhfUkVDT1JEX0xFTkdUSF07Cit9IElOVEVMX0hFWF9SRUNPUkQsICpQSU5URUxfSEVYX1JFQ09SRDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9kc2JyMTAwLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9kc2JyMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwM2Y1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL2RzYnIxMDAuYwpAQCAtMCwwICsxLDQyOSBAQAorLyogQSBkcml2ZXIgZm9yIHRoZSBELUxpbmsgRFNCLVIxMDAgVVNCIHJhZGlvLiAgVGhlIFIxMDAgcGx1Z3MKKyBpbnRvIGJvdGggdGhlIFVTQiBhbmQgYW4gYW5hbG9nIGF1ZGlvIGlucHV0LCBzbyB0aGlzIHRoaW5nCisgb25seSBkZWFscyB3aXRoIGluaXRpYWxpc2F0aW9uIGFuZCBmcmVxdWVuY3kgc2V0dGluZywgdGhlCisgYXVkaW8gZGF0YSBoYXMgdG8gYmUgaGFuZGxlZCBieSBhIHNvdW5kIGRyaXZlci4KKworIE1ham9yIGlzc3VlOiBJIGNhbid0IGZpbmQgb3V0IHdoZXJlIHRoZSBkZXZpY2UgcmVwb3J0cyB0aGUgc2lnbmFsCisgc3RyZW5ndGgsIGFuZCBpbmRlZWQgdGhlIHdpbmRvd3Mgc29mdHdhcmUgYXBwZWFyYW50bHkganVzdCBsb29rcworIGF0IHRoZSBzdGVyZW8gaW5kaWNhdG9yIGFzIHdlbGwuICBTbywgc2Nhbm5pbmcgd2lsbCBvbmx5IGZpbmQKKyBzdGVyZW8gc3RhdGlvbnMuICBTYWQsIGJ1dCBJIGNhbid0IGhlbHAgaXQuCisKKyBBbHNvLCB0aGUgd2luZG93cyBwcm9ncmFtIHNlbmRzIG9vZGxlcyBvZiBtZXNzYWdlcyBvdmVyIHRvIHRoZQorIGRldmljZSwgYW5kIEkgY291bGRuJ3QgZmlndXJlIG91dCB0aGVpciBtZWFuaW5nLiAgTXkgc3VzcGljaW9uCisgaXMgdGhhdCB0aGV5IGRvbid0IGhhdmUgYW55Oi0pCisKKyBZb3UgbWlnaHQgZmluZCBzb21lIGludGVyZXN0aW5nIHN0dWZmIGFib3V0IHRoaXMgbW9kdWxlIGF0CisgaHR0cDovL3VuaW11dC5mc2sudW5pLWhlaWRlbGJlcmcuZGUvdW5pbXV0L2RlbWkvZHNicgorCisgQ29weXJpZ2h0IChjKSAyMDAwIE1hcmt1cyBEZW1sZWl0bmVyIDxtc2RlbWxlaUBjbC51bmktaGVpZGVsYmVyZy5kZT4KKworIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKKyBIaXN0b3J5OgorCisgVmVyc2lvbiAwLjQwOgorICBNYXJrdXM6IFVwZGF0ZXMgZm9yIDIuNi54IGtlcm5lbHMsIGNvZGUgbGF5b3V0IGNoYW5nZXMsIG5hbWUgc2FuaXRpemluZworCisgVmVyc2lvbiAwLjMwOgorIAlNYXJrdXM6IFVwZGF0ZXMgZm9yIDIuNS54IGtlcm5lbCBhbmQgbW9yZSBJU08gY29tcGxpYW50IHNvdXJjZQorCisgVmVyc2lvbiAwLjI1OgorICAgICAgICBQU0wgYW5kIE1hcmt1czogQ2xlYW51cCwgcmFkaW8gbm93IGRvZXNuJ3Qgc3RvcCBvbiBkZXZpY2UgY2xvc2UKKworIFZlcnNpb24gMC4yNDoKKyAJTWFya3VzOiBIb3BlIEkgZ290IHRoZXNlIHNpbGx5IFZJREVPX1RVTkVSX0xPVyBpc3N1ZXMgZmluYWxseQorCXJpZ2h0LiAgU29tZSBtaW5vciBjbGVhbnVwLCBpbXByb3ZlZCBzdGFuZGFsb25lIGNvbXBpbGF0aW9uCisKKyBWZXJzaW9uIDAuMjM6CisgCU1hcmt1czogU2lnbiBleHRlbnNpb24gYnVnIGZpeGVkIGJ5IGRlY2xhcmluZyB0cmFuc2Zlcl9idWZmZXIgdW5zaWduZWQKKworIFZlcnNpb24gMC4yMjoKKyAJTWFya3VzOiBTb21lIChicm93biBiYWcpIGNsZWFudXAgaW4gd2hhdCBWSURJT0NTVFVORVIgcmV0dXJucywgCisJdGhhbmtzIHRvIE1pa2UgQ294IGZvciBwb2ludGluZyB0aGUgcHJvYmxlbSBvdXQuCisKKyBWZXJzaW9uIDAuMjE6CisgCU1hcmt1czogTWlub3IgY2xlYW51cCwgd2FybmluZ3MgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcsIGxhbWUgYXR0ZW1wdAorCXRvIGFkaGVyZSB0byBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisKKyBWZXJzaW9uIDAuMjogCisgCUJyYWQgSGFyZHMgPGJyYWRoQGR5bmFtaXRlLmNvbS5hdT46IEZpeGVzIHRvIG1ha2UgaXQgd29yayBhcyBub24tbW9kdWxlCisJTWFya3VzOiBDb3B5cmlnaHQgY2xhcmlmaWNhdGlvbgorCisgVmVyc2lvbiAwLjAxOiBNYXJrdXM6IGluaXRpYWwgcmVsZWFzZQorCisqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisvKgorICogVmVyc2lvbiBJbmZvcm1hdGlvbgorICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC40MCIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiTWFya3VzIERlbWxlaXRuZXIgPG1zZGVtbGVpQHR1Y2FuYS5oYXJ2YXJkLmVkdT4iCisjZGVmaW5lIERSSVZFUl9ERVNDICJELUxpbmsgRFNCLVIxMDAgVVNCIEZNIHJhZGlvIGRyaXZlciIKKworI2RlZmluZSBEU0IxMDBfVkVORE9SIDB4MDRiNAorI2RlZmluZSBEU0IxMDBfUFJPRFVDVCAweDEwMDIKKworLyogQ29tbWFuZHMgdGhlIGRldmljZSBhcHBlYXJzIHRvIHVuZGVyc3RhbmQgKi8KKyNkZWZpbmUgRFNCMTAwX1RVTkUgMQorI2RlZmluZSBEU0IxMDBfT05PRkYgMgorCisjZGVmaW5lIFRCX0xFTiAxNgorCisvKiBGcmVxdWVuY3kgbGltaXRzIGluIE1IeiAtLSB0aGVzZSBhcmUgRXVyb3BlYW4gdmFsdWVzLiAgRm9yIEphcGFuZXNlCitkZXZpY2VzLCB0aGF0IHdvdWxkIGJlIDc2IGFuZCA5MS4gICovCisjZGVmaW5lIEZSRVFfTUlOICA4Ny41CisjZGVmaW5lIEZSRVFfTUFYIDEwOC4wCisjZGVmaW5lIEZSRVFfTVVMIDE2MDAwCisKKworc3RhdGljIGludCB1c2JfZHNicjEwMF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIHVzYl9kc2JyMTAwX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworc3RhdGljIGludCB1c2JfZHNicjEwMF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCB1c2JfZHNicjEwMF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdXNiX2RzYnIxMDBfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCitzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7Cittb2R1bGVfcGFyYW0ocmFkaW9fbnIsIGludCwgMCk7CisKKy8qIERhdGEgZm9yIG9uZSAocGh5c2ljYWwpIGRldmljZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9kZXY7CisJdW5zaWduZWQgY2hhciB0cmFuc2Zlcl9idWZmZXJbVEJfTEVOXTsKKwlpbnQgY3VyZnJlcTsKKwlpbnQgc3RlcmVvOworCWludCB1c2VyczsKKwlpbnQgcmVtb3ZlZDsKK30gZHNicjEwMF9kZXZpY2U7CisKKworLyogRmlsZSBzeXN0ZW0gaW50ZXJmYWNlICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JfZHNicjEwMF9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5vcGVuID0JCXVzYl9kc2JyMTAwX29wZW4sCisJLnJlbGVhc2UgPSAgICAgCXVzYl9kc2JyMTAwX2Nsb3NlLAorCS5pb2N0bCA9ICAgICAgICB1c2JfZHNicjEwMF9pb2N0bCwKKwkubGxzZWVrID0gICAgICAgbm9fbGxzZWVrLAorfTsKKworLyogVjRMIGludGVyZmFjZSAqLworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgZHNicjEwMF92aWRlb2Rldl90ZW1wbGF0ZT0KK3sKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkiRC1MaW5rIERTQi1SIDEwMCIsCisJLnR5cGUgPQkJVklEX1RZUEVfVFVORVIsCisJLmhhcmR3YXJlID0JVklEX0hBUkRXQVJFX0FaVEVDSCwKKwkuZm9wcyA9ICAgICAgICAgJnVzYl9kc2JyMTAwX2ZvcHMsCisJLnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfZHNicjEwMF9kZXZpY2VfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKERTQjEwMF9WRU5ET1IsIERTQjEwMF9QUk9EVUNUKSB9LAorCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIHVzYl9kc2JyMTAwX2RldmljZV90YWJsZSk7CisKKy8qIFVTQiBzdWJzeXN0ZW0gaW50ZXJmYWNlICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX2RzYnIxMDBfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJkc2JyMTAwIiwKKwkucHJvYmUgPQl1c2JfZHNicjEwMF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl9kc2JyMTAwX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JdXNiX2RzYnIxMDBfZGV2aWNlX3RhYmxlLAorfTsKKworLyogTG93LWxldmVsIGRldmljZSBpbnRlcmZhY2UgYmVnaW5zIGhlcmUgKi8KKworLyogc3dpdGNoIG9uIHJhZGlvICovCitzdGF0aWMgaW50IGRzYnIxMDBfc3RhcnQoZHNicjEwMF9kZXZpY2UgKnJhZGlvKQoreworCWlmICh1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwgdXNiX3JjdmN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAorCQkJVVNCX1JFUV9HRVRfU1RBVFVTLCAKKwkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAorCQkJMHgwMCwgMHhDNywgcmFkaW8tPnRyYW5zZmVyX2J1ZmZlciwgOCwgMzAwKTwwIHx8CisJdXNiX2NvbnRyb2xfbXNnKHJhZGlvLT51c2JkZXYsIHVzYl9yY3ZjdHJscGlwZShyYWRpby0+dXNiZGV2LCAwKSwKKwkJCURTQjEwMF9PTk9GRiwgCisJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKKwkJCTB4MDEsIDB4MDAsIHJhZGlvLT50cmFuc2Zlcl9idWZmZXIsIDgsIDMwMCk8MCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAocmFkaW8tPnRyYW5zZmVyX2J1ZmZlcilbMF07Cit9CisKKworLyogc3dpdGNoIG9mZiByYWRpbyAqLworc3RhdGljIGludCBkc2JyMTAwX3N0b3AoZHNicjEwMF9kZXZpY2UgKnJhZGlvKQoreworCWlmICh1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwgdXNiX3JjdmN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAorCQkJVVNCX1JFUV9HRVRfU1RBVFVTLCAKKwkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAorCQkJMHgxNiwgMHgxQywgcmFkaW8tPnRyYW5zZmVyX2J1ZmZlciwgOCwgMzAwKTwwIHx8CisJdXNiX2NvbnRyb2xfbXNnKHJhZGlvLT51c2JkZXYsIHVzYl9yY3ZjdHJscGlwZShyYWRpby0+dXNiZGV2LCAwKSwKKwkJCURTQjEwMF9PTk9GRiwgCisJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKKwkJCTB4MDAsIDB4MDAsIHJhZGlvLT50cmFuc2Zlcl9idWZmZXIsIDgsIDMwMCk8MCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAocmFkaW8tPnRyYW5zZmVyX2J1ZmZlcilbMF07Cit9CisKKy8qIHNldCBhIGZyZXF1ZW5jeSwgZnJlcSBpcyBkZWZpbmVkIGJ5IHY0bCdzIFRVTkVSX0xPVywgaS5lLiAxLzE2dGgga0h6ICovCitzdGF0aWMgaW50IGRzYnIxMDBfc2V0ZnJlcShkc2JyMTAwX2RldmljZSAqcmFkaW8sIGludCBmcmVxKQoreworCWZyZXEgPSAoZnJlcS8xNio4MCkvMTAwMCs4NTY7CisJaWYgKHVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LCB1c2JfcmN2Y3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCisJCQlEU0IxMDBfVFVORSwgCisJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKKwkJCShmcmVxPj44KSYweDAwZmYsIGZyZXEmMHhmZiwgCisJCQlyYWRpby0+dHJhbnNmZXJfYnVmZmVyLCA4LCAzMDApPDAgfHwKKwkgICB1c2JfY29udHJvbF9tc2cocmFkaW8tPnVzYmRldiwgdXNiX3JjdmN0cmxwaXBlKHJhZGlvLT51c2JkZXYsIDApLAorCQkgCVVTQl9SRVFfR0VUX1NUQVRVUywgCisJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKKwkJCTB4OTYsIDB4QjcsIHJhZGlvLT50cmFuc2Zlcl9idWZmZXIsIDgsIDMwMCk8MCB8fAorCXVzYl9jb250cm9sX21zZyhyYWRpby0+dXNiZGV2LCB1c2JfcmN2Y3RybHBpcGUocmFkaW8tPnVzYmRldiwgMCksCisJCQlVU0JfUkVRX0dFVF9TVEFUVVMsIAorCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8ICBVU0JfRElSX0lOLAorCQkJMHgwMCwgMHgyNCwgcmFkaW8tPnRyYW5zZmVyX2J1ZmZlciwgOCwgMzAwKTwwKSB7CisJCXJhZGlvLT5zdGVyZW8gPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKwlyYWRpby0+c3RlcmVvID0gISAoKHJhZGlvLT50cmFuc2Zlcl9idWZmZXIpWzBdJjB4MDEpOworCXJldHVybiAocmFkaW8tPnRyYW5zZmVyX2J1ZmZlcilbMF07Cit9CisKKy8qIHJldHVybiB0aGUgZGV2aWNlIHN0YXR1cy4gIFRoaXMgaXMsIGluIGVmZmVjdCwganVzdCB3aGV0aGVyIGl0CitzZWVzIGEgc3RlcmVvIHNpZ25hbCBvciBub3QuICBQaXR5LiAqLworc3RhdGljIHZvaWQgZHNicjEwMF9nZXRzdGF0KGRzYnIxMDBfZGV2aWNlICpyYWRpbykKK3sKKwlpZiAodXNiX2NvbnRyb2xfbXNnKHJhZGlvLT51c2JkZXYsIHVzYl9yY3ZjdHJscGlwZShyYWRpby0+dXNiZGV2LCAwKSwKKwkJVVNCX1JFUV9HRVRfU1RBVFVTLCAKKwkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCisJCTB4MDAgLCAweDI0LCByYWRpby0+dHJhbnNmZXJfYnVmZmVyLCA4LCAzMDApPDApCisJCXJhZGlvLT5zdGVyZW8gPSAtMTsKKwllbHNlCisJCXJhZGlvLT5zdGVyZW8gPSAhIChyYWRpby0+dHJhbnNmZXJfYnVmZmVyWzBdJjB4MDEpOworfQorCisKKy8qIFVTQiBzdWJzeXN0ZW0gaW50ZXJmYWNlIGJlZ2lucyBoZXJlICovCisKKy8qIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgcHJlc2VudCBhbmQgcmVnaXN0ZXIgd2l0aCB2NGwgYW5kCit1c2IgaWYgaXQgaXMgKi8KK3N0YXRpYyBpbnQgdXNiX2RzYnIxMDBfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIAorCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlkc2JyMTAwX2RldmljZSAqcmFkaW87CisKKwlpZiAoIShyYWRpbyA9IGttYWxsb2Moc2l6ZW9mKGRzYnIxMDBfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIShyYWRpby0+dmlkZW9kZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKSkpIHsKKwkJa2ZyZWUocmFkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtY3B5KHJhZGlvLT52aWRlb2RldiwgJmRzYnIxMDBfdmlkZW9kZXZfdGVtcGxhdGUsIAorCQlzaXplb2YoZHNicjEwMF92aWRlb2Rldl90ZW1wbGF0ZSkpOworCXJhZGlvLT5yZW1vdmVkID0gMDsKKwlyYWRpby0+dXNlcnMgPSAwOworCXJhZGlvLT51c2JkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXJhZGlvLT5jdXJmcmVxID0gRlJFUV9NSU4qRlJFUV9NVUw7CisJdmlkZW9fc2V0X2RydmRhdGEocmFkaW8tPnZpZGVvZGV2LCByYWRpbyk7CisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShyYWRpby0+dmlkZW9kZXYsIFZGTF9UWVBFX1JBRElPLAorCQlyYWRpb19ucikpIHsKKwkJd2FybigiQ291bGQgbm90IHJlZ2lzdGVyIHZpZGVvIGRldmljZSIpOworCQl2aWRlb19kZXZpY2VfcmVsZWFzZShyYWRpby0+dmlkZW9kZXYpOworCQlrZnJlZShyYWRpbyk7CisJCXJldHVybiAtRUlPOworCX0KKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHJhZGlvKTsKKwlyZXR1cm4gMDsKK30KKworLyogaGFuZGxlIHVucGx1Z2dpbmcgb2YgdGhlIGRldmljZSwgcmVsZWFzZSBkYXRhIHN0cnVjdHVyZXMKK2lmIG5vdGhpbmcga2VlcHMgdXMgZnJvbSBkb2luZyBpdC4gIElmIHNvbWV0aGluZyBpcyBzdGlsbAora2VlcGluZyB1cyBidXN5LCB0aGUgcmVsZWFzZSBjYWxsYmFjayBvZiB2NGwgd2lsbCB0YWtlIGNhcmUKK29mIHJlbGVhc2luZyBpdC4gIHN0djY4MC5jIGRvZXMgbm90IHJlbGFzZSBpdHMgcHJpdmF0ZQorZGF0YSwgc28gSSBkb24ndCBkbyB0aGlzIGhlcmUgZWl0aGVyLiAgQ2hlY2tpbmcgb3V0IHRoZQorY29kZSBJJ2QgZXhwZWN0IEkgYmV0dGVyIGRpZCB0aGF0LCBidXQgaWYgdGhlcmUncyBhIG1lbW9yeQorbGVhayBoZXJlIGl0J3MgdGlueSAofjUwIGJ5dGVzIHBlciBkaXNjb25uZWN0KSAqLworc3RhdGljIHZvaWQgdXNiX2RzYnIxMDBfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlkc2JyMTAwX2RldmljZSAqcmFkaW8gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CisJaWYgKHJhZGlvKSB7CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHJhZGlvLT52aWRlb2Rldik7CisJCXJhZGlvLT52aWRlb2RldiA9IE5VTEw7CisJCWlmIChyYWRpby0+dXNlcnMpIHsKKwkJCWtmcmVlKHJhZGlvKTsKKwkJfSBlbHNlIHsKKwkJCXJhZGlvLT5yZW1vdmVkID0gMTsKKwkJfQorCX0KK30KKworCisvKiBWaWRlbyBmb3IgTGludXggaW50ZXJmYWNlICovCisKK3N0YXRpYyBpbnQgdXNiX2RzYnIxMDBfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWRzYnIxMDBfZGV2aWNlICpyYWRpbz12aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKworCWlmICghcmFkaW8pCisJCXJldHVybiAtRUlPOworCisJc3dpdGNoKGNtZCkgeworCQljYXNlIFZJRElPQ0dDQVA6IHsKKwkJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICp2ID0gYXJnOworCisJCQltZW1zZXQodiwgMCwgc2l6ZW9mKCp2KSk7CisJCQl2LT50eXBlID0gVklEX1RZUEVfVFVORVI7CisJCQl2LT5jaGFubmVscyA9IDE7CisJCQl2LT5hdWRpb3MgPSAxOworCQkJc3RyY3B5KHYtPm5hbWUsICJELUxpbmsgUi0xMDAgVVNCIEZNIFJhZGlvIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ0dUVU5FUjogeworCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOworCisJCQlkc2JyMTAwX2dldHN0YXQocmFkaW8pOworCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLyAKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXYtPnJhbmdlbG93ID0gRlJFUV9NSU4qRlJFUV9NVUw7CisJCQl2LT5yYW5nZWhpZ2ggPSBGUkVRX01BWCpGUkVRX01VTDsKKwkJCXYtPmZsYWdzID0gVklERU9fVFVORVJfTE9XOworCQkJdi0+bW9kZSA9IFZJREVPX01PREVfQVVUTzsKKwkJCXYtPnNpZ25hbCA9IHJhZGlvLT5zdGVyZW8qMHg3MDAwOworCQkJCS8qIERvbid0IGtub3cgaG93IHRvIGdldCBzaWduYWwgc3RyZW5ndGggKi8KKwkJCXYtPmZsYWdzIHw9IFZJREVPX1RVTkVSX1NURVJFT19PTipyYWRpby0+c3RlcmVvOworCQkJc3RyY3B5KHYtPm5hbWUsICJEU0IgUi0xMDAiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DU1RVTkVSOiB7CisJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7CisKKwkJCWlmKHYtPnR1bmVyIT0wKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJLyogT25seSAxIHR1bmVyIHNvIG5vIHNldHRpbmcgbmVlZGVkICEgKi8KKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DR0ZSRVE6IHsKKwkJCWludCAqZnJlcSA9IGFyZzsKKworCQkJaWYgKHJhZGlvLT5jdXJmcmVxPT0tMSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSpmcmVxID0gcmFkaW8tPmN1cmZyZXE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ1NGUkVROiB7CisJCQlpbnQgKmZyZXEgPSBhcmc7CisKKwkJCXJhZGlvLT5jdXJmcmVxID0gKmZyZXE7CisJCQlpZiAoZHNicjEwMF9zZXRmcmVxKHJhZGlvLCByYWRpby0+Y3VyZnJlcSk9PS0xKQorCQkJCXdhcm4oIlNldCBmcmVxdWVuY3kgZmFpbGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ0dBVURJTzogeworCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOworCisJCQltZW1zZXQodiwgMCwgc2l6ZW9mKCp2KSk7CisJCQl2LT5mbGFncyB8PSBWSURFT19BVURJT19NVVRBQkxFOworCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX1NURVJFTzsKKwkJCXYtPnZvbHVtZSA9IDE7CisJCQl2LT5zdGVwID0gMTsKKwkJCXN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKKwkJCXJldHVybiAwOwkJCQorCQl9CisJCWNhc2UgVklESU9DU0FVRElPOiB7CisJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CisKKwkJCWlmICh2LT5hdWRpbykgCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAodi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSkgeworCQkJCWlmIChkc2JyMTAwX3N0b3AocmFkaW8pPT0tMSkKKwkJCQkJd2FybigiUmFkaW8gZGlkIG5vdCByZXNwb25kIHByb3Blcmx5Iik7CisJCQl9CisJCQllbHNlCisJCQkJaWYgKGRzYnIxMDBfc3RhcnQocmFkaW8pPT0tMSkKKwkJCQkJd2FybigiUmFkaW8gZGlkIG5vdCByZXNwb25kIHByb3Blcmx5Iik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdXNiX2RzYnIxMDBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHVzYl9kc2JyMTAwX2RvX2lvY3RsKTsKK30KKworc3RhdGljIGludCB1c2JfZHNicjEwMF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWRzYnIxMDBfZGV2aWNlICpyYWRpbz12aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKworCXJhZGlvLT51c2VycyA9IDE7CisJaWYgKGRzYnIxMDBfc3RhcnQocmFkaW8pPDApIHsKKwkJd2FybigiUmFkaW8gZGlkIG5vdCBzdGFydCB1cCBwcm9wZXJseSIpOworCQlyYWRpby0+dXNlcnMgPSAwOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZHNicjEwMF9zZXRmcmVxKHJhZGlvLCByYWRpby0+Y3VyZnJlcSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2RzYnIxMDBfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZHNicjEwMF9kZXZpY2UgKnJhZGlvPXZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCisJaWYgKCFyYWRpbykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmFkaW8tPnVzZXJzID0gMDsKKwlpZiAocmFkaW8tPnJlbW92ZWQpIHsKKwkJa2ZyZWUocmFkaW8pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgZHNicjEwMF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbCA9IHVzYl9yZWdpc3RlcigmdXNiX2RzYnIxMDBfZHJpdmVyKTsKKwlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRzYnIxMDBfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZ1c2JfZHNicjEwMF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCAoZHNicjEwMF9pbml0KTsKK21vZHVsZV9leGl0IChkc2JyMTAwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CitNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9pYm1jYW0uYyBiL2RyaXZlcnMvdXNiL21lZGlhL2libWNhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDFmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9pYm1jYW0uYwpAQCAtMCwwICsxLDM5MzIgQEAKKy8qCisgKiBVU0IgSUJNIEMtSXQgVmlkZW8gQ2FtZXJhIGRyaXZlcgorICoKKyAqIFN1cHBvcnRzIFhpcmxpbmsgQy1JdCBWaWRlbyBDYW1lcmEsIElCTSBQQyBDYW1lcmEsCisgKiBJQk0gTmV0Q2FtZXJhIGFuZCBWZW8gU3RpbmdyYXkuCisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gZWFybGllciB3b3JrIG9mOgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBKb2hhbm5lcyBFcmRmZWx0CisgKiAoQykgQ29weXJpZ2h0IDE5OTkgUmFuZHkgRHVubGFwCisgKgorICogNS8yNC8wMCBSZW1vdmVkIG9wdGlvbmFsIChhbmQgdW5uZWNlc3NhcnkpIGxvY2tpbmcgb2YgdGhlIGRyaXZlciB3aGlsZQorICogdGhlIGRldmljZSByZW1haW5zIHBsdWdnZWQgaW4uIENvcnJlY3RlZCByYWNlIGNvbmRpdGlvbnMgaW4gaWJtY2FtX29wZW4KKyAqIGFuZCBpYm1jYW1fcHJvYmUoKSByb3V0aW5lcyB1c2luZyB0aGlzIGFzIGEgZ3VpZGVsaW5lOgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgInVzYnZpZGVvLmgiCisKKyNkZWZpbmUgSUJNQ0FNX1ZFTkRPUl9JRAkweDA1NDUKKyNkZWZpbmUgSUJNQ0FNX1BST0RVQ1RfSUQJMHg4MDgwCisjZGVmaW5lIE5FVENBTV9QUk9EVUNUX0lECTB4ODAwMgkvKiBJQk0gTmV0Q2FtZXJhLCBjbG9zZSB0byBtb2RlbCAyICovCisjZGVmaW5lIFZFT184MDBDX1BST0RVQ1RfSUQJMHg4MDBDCS8qIFZlbyBTdGluZ3JheSwgcmVwYWNrYWdlZCBNb2RlbCAyICovCisjZGVmaW5lIFZFT184MDBEX1BST0RVQ1RfSUQJMHg4MDBECS8qIFZlbyBTdGluZ3JheSwgcmVwYWNrYWdlZCBNb2RlbCA0ICovCisKKyNkZWZpbmUgTUFYX0lCTUNBTQkJNAkvKiBIb3cgbWFueSBkZXZpY2VzIHdlIGFsbG93IHRvIGNvbm5lY3QgKi8KKyNkZWZpbmUgVVNFU19JQk1DQU1fUFVUUElYRUwgICAgMCAgICAgICAvKiAwPUZhc3Qvb29wcyAxPVNsb3cvc2VjdXJlICovCisKKy8qIEhlYWRlciBzaWduYXR1cmVzICovCisKKy8qIE1vZGVsIDEgaGVhZGVyOiAwMCBGRiAwMCB4eCAqLworI2RlZmluZSBIRFJTSUdfTU9ERUwxXzEyOHg5NgkweDA2CS8qIFUgWSBWIFkgLi4uICovCisjZGVmaW5lIEhEUlNJR19NT0RFTDFfMTc2eDE0NAkweDBlCS8qIFUgWSBWIFkgLi4uICovCisjZGVmaW5lIEhEUlNJR19NT0RFTDFfMzUyeDI4OAkweDAwCS8qIFYgWSBVIFkgLi4uICovCisKKyNkZWZpbmUJSUJNQ0FNX01PREVMXzEJMQkvKiBYVlAtNTAxLCAzIGludGVyZmFjZXMsIHJldi4gMC4wMiAqLworI2RlZmluZSBJQk1DQU1fTU9ERUxfMgkyCS8qIEtTWC1YOTkwMywgMiBpbnRlcmZhY2VzLCByZXYuIDMuMGEgKi8KKyNkZWZpbmUgSUJNQ0FNX01PREVMXzMJMwkvKiBLU1gtWDk5MDIsIDIgaW50ZXJmYWNlcywgcmV2LiAzLjAxICovCisjZGVmaW5lCUlCTUNBTV9NT0RFTF80CTQJLyogSUJNIE5ldENhbWVyYSwgMDU0NS84MDAyLzMuMGEgKi8KKworLyogVmlkZW8gc2l6ZXMgc3VwcG9ydGVkICovCisjZGVmaW5lCVZJREVPU0laRV8xMjh4OTYJVklERU9TSVpFKDEyOCwgOTYpCisjZGVmaW5lCVZJREVPU0laRV8xNzZ4MTQ0CVZJREVPU0laRSgxNzYsMTQ0KQorI2RlZmluZQlWSURFT1NJWkVfMzUyeDI4OAlWSURFT1NJWkUoMzUyLDI4OCkKKyNkZWZpbmUJVklERU9TSVpFXzMyMHgyNDAJVklERU9TSVpFKDMyMCwyNDApCisjZGVmaW5lCVZJREVPU0laRV8zNTJ4MjQwCVZJREVPU0laRSgzNTIsMjQwKQorI2RlZmluZQlWSURFT1NJWkVfNjQweDQ4MAlWSURFT1NJWkUoNjQwLDQ4MCkKKyNkZWZpbmUJVklERU9TSVpFXzE2MHgxMjAJVklERU9TSVpFKDE2MCwxMjApCisKKy8qIFZpZGVvIHNpemVzIHN1cHBvcnRlZCAqLworZW51bSB7CisJU0laRV8xMjh4OTYgPSAwLAorCVNJWkVfMTYweDEyMCwKKwlTSVpFXzE3NngxNDQsCisJU0laRV8zMjB4MjQwLAorCVNJWkVfMzUyeDI0MCwKKwlTSVpFXzM1MngyODgsCisJU0laRV82NDB4NDgwLAorCS8qIEFkZC9yZW1vdmUvcmVhcnJhbmdlIGl0ZW1zIGJlZm9yZSB0aGlzIGxpbmUgKi8KKwlTSVpFX0xhc3RJdGVtCit9OworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgbGl2ZXMgaW4gdXZkLT51c2VyIGZpZWxkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGluaXRpYWxpemVkOwkvKiBIYWQgd2UgYWxyZWFkeSBzZW50IGluaXQgc2VxdWVuY2U/ICovCisJaW50IGNhbWVyYV9tb2RlbDsJLyogV2hhdCB0eXBlIG9mIElCTSBjYW1lcmEgd2UgZ290PyAqLworCWludCBoYXNfaGRyOworfSBpYm1jYW1fdDsKKyNkZWZpbmUJSUJNQ0FNX1QodXZkKQkoKGlibWNhbV90ICopKCh1dmQpLT51c2VyX2RhdGEpKQorCitzdGF0aWMgc3RydWN0IHVzYnZpZGVvICpjYW1zOworCitzdGF0aWMgaW50IGRlYnVnOworCitzdGF0aWMgaW50IGZsYWdzOyAvKiA9IEZMQUdTX0RJU1BMQVlfSElOVFMgfCBGTEFHU19PVkVSTEFZX1NUQVRTOyAqLworCitzdGF0aWMgY29uc3QgaW50IG1pbl9jYW52YXNXaWR0aCAgPSA4Oworc3RhdGljIGNvbnN0IGludCBtaW5fY2FudmFzSGVpZ2h0ID0gNDsKKworc3RhdGljIGludCBsaWdodGluZyA9IDE7IC8qIE1lZGl1bSAqLworCisjZGVmaW5lIFNIQVJQTkVTU19NSU4JMAorI2RlZmluZSBTSEFSUE5FU1NfTUFYCTYKK3N0YXRpYyBpbnQgc2hhcnBuZXNzID0gNDsgLyogTG93IG5vaXNlLCBnb29kIGRldGFpbHMgKi8KKworI2RlZmluZSBGUkFNRVJBVEVfTUlOCTAKKyNkZWZpbmUgRlJBTUVSQVRFX01BWAk2CitzdGF0aWMgaW50IGZyYW1lcmF0ZSA9IC0xOworCitzdGF0aWMgaW50IHNpemUgPSBTSVpFXzM1MngyODg7CisKKy8qCisgKiBIZXJlIHdlIGRlZmluZSBzZXZlcmFsIGluaXRpYWxpemF0aW9uIHZhcmlhYmxlcy4gVGhleSBtYXkKKyAqIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBzZXQgY29sb3IsIGh1ZSwgYnJpZ2h0bmVzcyBhbmQKKyAqIGNvbnRyYXN0IHRvIGRlc2lyZWQgdmFsdWVzLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4KKyAqIGNhc2Ugb2Ygd2ViY2FtcyAod2hpY2ggaGF2ZSBubyBjb250cm9scyBhbmQgbm8gb24tc2NyZWVuCisgKiBvdXRwdXQpIGFuZCBhbHNvIHdoZW4gYSBjbGllbnQgVjRMIHNvZnR3YXJlIGlzIHVzZWQgdGhhdAorICogZG9lcyBub3QgaGF2ZSBzb21lIG9mIHRob3NlIGNvbnRyb2xzLiBJbiBhbnkgY2FzZSBpdCdzCisgKiBnb29kIHRvIGhhdmUgc3RhcnR1cCB2YWx1ZXMgYXMgb3B0aW9ucy4KKyAqCisgKiBUaGVzZSB2YWx1ZXMgYXJlIGFsbCBpbiBbMC4uMjU1XSByYW5nZS4gVGhpcyBzaW1wbGlmaWVzCisgKiBvcGVyYXRpb24uIE5vdGUgdGhhdCBhY3R1YWwgdmFsdWVzIG9mIFY0TCB2YXJpYWJsZXMgbWF5CisgKiBiZSBzY2FsZWQgdXAgKGFzIG11Y2ggYXMgPDwgOCkuIFVzZXIgY2FuIHNlZSB0aGF0IG9ubHkKKyAqIG9uIG92ZXJsYXkgb3V0cHV0LCBob3dldmVyLCBvciB0aHJvdWdoIGEgVjRMIGNsaWVudC4KKyAqLworc3RhdGljIGludCBpbml0X2JyaWdodG5lc3MgPSAxMjg7CitzdGF0aWMgaW50IGluaXRfY29udHJhc3QgPSAxOTI7CitzdGF0aWMgaW50IGluaXRfY29sb3IgPSAxMjg7CitzdGF0aWMgaW50IGluaXRfaHVlID0gMTI4Oworc3RhdGljIGludCBodWVfY29ycmVjdGlvbiA9IDEyODsKKworLyogU2V0dGluZ3MgZm9yIGNhbWVyYSBtb2RlbCAyICovCitzdGF0aWMgaW50IGluaXRfbW9kZWwyX3JnMiA9IC0xOworc3RhdGljIGludCBpbml0X21vZGVsMl9zYXQgPSAtMTsKK3N0YXRpYyBpbnQgaW5pdF9tb2RlbDJfeWIgPSAtMTsKKworLyogMDEuMDEuMDggLSBBZGRlZCBmb3IgUkNBIHZpZGVvIGluIHN1cHBvcnQgLUxPICovCisvKiBTZXR0aW5ncyBmb3IgY2FtZXJhIG1vZGVsIDMgKi8KK3N0YXRpYyBpbnQgaW5pdF9tb2RlbDNfaW5wdXQgPSAwOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWw6IDAtOSAoZGVmYXVsdD0wKSIpOworbW9kdWxlX3BhcmFtKGZsYWdzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmbGFncywgIkJpdGZpZWxkOiAwPVZJRElPQ1NZTkMsIDE9Qi9XLCAyPXNob3cgaGludHMsIDM9c2hvdyBzdGF0cywgND10ZXN0IHBhdHRlcm4sIDU9c2VwYXJhdGUgZnJhbWVzLCA2PWNsZWFuIGZyYW1lcyIpOworbW9kdWxlX3BhcmFtKGZyYW1lcmF0ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnJhbWVyYXRlLCAiRnJhbWVyYXRlIHNldHRpbmc6IDA9c2xvd2VzdCwgNj1mYXN0ZXN0IChkZWZhdWx0PTIpIik7Cittb2R1bGVfcGFyYW0obGlnaHRpbmcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxpZ2h0aW5nLCAiUGhvdG9zZW5zaXRpdml0eTogMD1icmlnaHQsIDE9bWVkaXVtIChkZWZhdWx0KSwgMj1sb3cgbGlnaHQiKTsKK21vZHVsZV9wYXJhbShzaGFycG5lc3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNoYXJwbmVzcywgIk1vZGVsMSBub2lzZSByZWR1Y3Rpb246IDA9c21vb3RoLCA2PXNoYXJwIChkZWZhdWx0PTQpIik7Cittb2R1bGVfcGFyYW0oc2l6ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2l6ZSwgIkltYWdlIHNpemU6IDA9MTI4eDk2IDE9MTYweDEyMCAyPTE3NngxNDQgMz0zMjB4MjQwIDQ9MzUyeDI0MCA1PTM1MngyODggNj02NDB4NDgwICAoZGVmYXVsdD01KSIpOworbW9kdWxlX3BhcmFtKGluaXRfYnJpZ2h0bmVzcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW5pdF9icmlnaHRuZXNzLCAiQnJpZ2h0bmVzcyBwcmVjb25maWd1cmF0aW9uOiAwLTI1NSAoZGVmYXVsdD0xMjgpIik7Cittb2R1bGVfcGFyYW0oaW5pdF9jb250cmFzdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW5pdF9jb250cmFzdCwgIkNvbnRyYXN0IHByZWNvbmZpZ3VyYXRpb246IDAtMjU1IChkZWZhdWx0PTE5MikiKTsKK21vZHVsZV9wYXJhbShpbml0X2NvbG9yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0X2NvbG9yLCAiQ29sb3IgcHJlY29uZmlndXJhdGlvbjogMC0yNTUgKGRlZmF1bHQ9MTI4KSIpOworbW9kdWxlX3BhcmFtKGluaXRfaHVlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0X2h1ZSwgIkh1ZSBwcmVjb25maWd1cmF0aW9uOiAwLTI1NSAoZGVmYXVsdD0xMjgpIik7Cittb2R1bGVfcGFyYW0oaHVlX2NvcnJlY3Rpb24sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGh1ZV9jb3JyZWN0aW9uLCAiWVVWIGNvbG9yc3BhY2UgcmVndWxhdGlvbjogMC0yNTUgKGRlZmF1bHQ9MTI4KSIpOworCittb2R1bGVfcGFyYW0oaW5pdF9tb2RlbDJfcmcyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0X21vZGVsMl9yZzIsICJNb2RlbDIgcHJlY29uZmlndXJhdGlvbjogMC0yNTUgKGRlZmF1bHQ9NDcpIik7Cittb2R1bGVfcGFyYW0oaW5pdF9tb2RlbDJfc2F0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0X21vZGVsMl9zYXQsICJNb2RlbDIgcHJlY29uZmlndXJhdGlvbjogMC0yNTUgKGRlZmF1bHQ9NTIpIik7Cittb2R1bGVfcGFyYW0oaW5pdF9tb2RlbDJfeWIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGluaXRfbW9kZWwyX3liLCAiTW9kZWwyIHByZWNvbmZpZ3VyYXRpb246IDAtMjU1IChkZWZhdWx0PTE2MCkiKTsKKworLyogMDEuMDEuMDggLSBBZGRlZCBmb3IgUkNBIHZpZGVvIGluIHN1cHBvcnQgLUxPICovCittb2R1bGVfcGFyYW0oaW5pdF9tb2RlbDNfaW5wdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGluaXRfbW9kZWwzX2lucHV0LCAiTW9kZWwzIGlucHV0OiAwPUNDRCAxPVJDQSIpOworCitNT0RVTEVfQVVUSE9SICgiRG1pdHJpIik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJJQk0vWGlybGluayBDLWl0IFVTQiBDYW1lcmEgRHJpdmVyIGZvciBMaW51eCAoYykgMjAwMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBTdGlsbCBteXN0ZXJpb3VzIGkyYyBjb21tYW5kcyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHVua25vd25fODggPSAweDAwODg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgdW5rbm93bl84OSA9IDB4MDA4OTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBicmlnaHRfM3hbM10gPSB7IDB4MDAzMSwgMHgwMDMyLCAweDAwMzMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjb250cmFzdF8xNCA9IDB4MDAxNDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBsaWdodF8yNyA9IDB4MDAyNzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzaGFycF8xMyA9IDB4MDAxMzsKKworLyogaTJjIGNvbW1hbmRzIGZvciBNb2RlbCAyIGNhbWVyYXMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBtb2QyX2JyaWdodG5lc3MgPSAweDAwMWE7CQkvKiAkNWIgLi4gJGVlOyBkZWZhdWx0PSQ1YSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG1vZDJfc2V0X2ZyYW1lcmF0ZSA9IDB4MDAxYzsJLyogMCAoZmFzdCkuLiAkMUYgKHNsb3cpICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbW9kMl9jb2xvcl9iYWxhbmNlX3JnMiA9IDB4MDAxZTsJLyogMCAocmVkKSAuLiAkN0YgKGdyZWVuKSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG1vZDJfc2F0dXJhdGlvbiA9IDB4MDAyMDsJCS8qIDAgKGIvdykgLSAkN0YgKGZ1bGwgY29sb3IpICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbW9kMl9jb2xvcl9iYWxhbmNlX3liID0gMHgwMDIyOwkvKiAwLi4kN0YsICQ1MCBpcyBhYm91dCByaWdodCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG1vZDJfaHVlID0gMHgwMDI0OwkJCS8qIDAuLiQ3RiwgJDcwIGlzIGFib3V0IHJpZ2h0ICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbW9kMl9zZW5zaXRpdml0eSA9IDB4MDAyODsJCS8qIDAgKG1pbikgLi4gJDFGIChtYXgpICovCisKK3N0cnVjdCBzdHJ1Y3RfaW5pdERhdGEgeworCXVuc2lnbmVkIGNoYXIgcmVxOworCXVuc2lnbmVkIHNob3J0IHZhbHVlOworCXVuc2lnbmVkIHNob3J0IGluZGV4OworfTsKKworLyoKKyAqIGlibWNhbV9zaXplX3RvX3ZpZGVvc2l6ZSgpCisgKgorICogVGhpcyBwcm9jZWR1cmUgY29udmVydHMgbW9kdWxlIG9wdGlvbiAnc2l6ZScgaW50byB0aGUgYWN0dWFsCisgKiB2aWRlb3NpemVfdCB0aGF0IGRlZmluZXMgdGhlIGltYWdlIHNpemUgaW4gcGl4ZWxzLiBXZSBuZWVkCisgKiBzaW1wbGlmaWVkICdzaXplJyBiZWNhdXNlIHVzZXIgd2FudHMgYSBzaW1wbGUgZW51bWVyYXRlZCBsaXN0CisgKiBvZiBjaG9pY2VzLCBub3QgYW4gaW5maW5pdGUgc2V0IG9mIHBvc3NpYmlsaXRpZXMuCisgKi8KK3N0YXRpYyB2aWRlb3NpemVfdCBpYm1jYW1fc2l6ZV90b192aWRlb3NpemUoaW50IHNpemUpCit7CisJdmlkZW9zaXplX3QgdnMgPSBWSURFT1NJWkVfMzUyeDI4ODsKKwlSRVNUUklDVF9UT19SQU5HRShzaXplLCAwLCAoU0laRV9MYXN0SXRlbS0xKSk7CisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBTSVpFXzEyOHg5NjoKKwkJdnMgPSBWSURFT1NJWkVfMTI4eDk2OworCQlicmVhazsKKwljYXNlIFNJWkVfMTYweDEyMDoKKwkJdnMgPSBWSURFT1NJWkVfMTYweDEyMDsKKwkJYnJlYWs7CisJY2FzZSBTSVpFXzE3NngxNDQ6CisJCXZzID0gVklERU9TSVpFXzE3NngxNDQ7CisJCWJyZWFrOworCWNhc2UgU0laRV8zMjB4MjQwOgorCQl2cyA9IFZJREVPU0laRV8zMjB4MjQwOworCQlicmVhazsKKwljYXNlIFNJWkVfMzUyeDI0MDoKKwkJdnMgPSBWSURFT1NJWkVfMzUyeDI0MDsKKwkJYnJlYWs7CisJY2FzZSBTSVpFXzM1MngyODg6CisJCXZzID0gVklERU9TSVpFXzM1MngyODg7CisJCWJyZWFrOworCWNhc2UgU0laRV82NDB4NDgwOgorCQl2cyA9IFZJREVPU0laRV82NDB4NDgwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoInNpemU9JWQuIGlzIG5vdCB2YWxpZCIsIHNpemUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHZzOworfQorCisvKgorICogaWJtY2FtX2ZpbmRfaGVhZGVyKCkKKyAqCisgKiBMb2NhdGUgb25lIG9mIHN1cHBvcnRlZCBoZWFkZXIgbWFya2VycyBpbiB0aGUgcXVldWUuCisgKiBPbmNlIGZvdW5kLCByZW1vdmUgYWxsIHByZWNlZGluZyBieXRlcyBBTkQgdGhlIG1hcmtlciAoNCBieXRlcykKKyAqIGZyb20gdGhlIGRhdGEgcHVtcCBxdWV1ZS4gV2hhdGV2ZXIgZm9sbG93cyBtdXN0IGJlIHZpZGVvIGxpbmVzLgorICoKKyAqIEhpc3Rvcnk6CisgKiAxLzIxLzAwICBDcmVhdGVkLgorICovCitzdGF0aWMgZW51bSBQYXJzZVN0YXRlIGlibWNhbV9maW5kX2hlYWRlcihzdHJ1Y3QgdXZkICp1dmQpIC8qIEZJWE1FOiBBZGQgZnJhbWUgaGVyZSAqLworeworCXN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWU7CisJaWJtY2FtX3QgKmljYW07CisKKwlpZiAoKHV2ZC0+Y3VyZnJhbWUpIDwgMCB8fCAodXZkLT5jdXJmcmFtZSA+PSBVU0JWSURFT19OVU1GUkFNRVMpKSB7CisJCWVycigiaWJtY2FtX2ZpbmRfaGVhZGVyOiBJbGxlZ2FsIGZyYW1lICVkLiIsIHV2ZC0+Y3VyZnJhbWUpOworCQlyZXR1cm4gc2Nhbl9FbmRQYXJzZTsKKwl9CisJaWNhbSA9IElCTUNBTV9UKHV2ZCk7CisJYXNzZXJ0KGljYW0gIT0gTlVMTCk7CisJZnJhbWUgPSAmdXZkLT5mcmFtZVt1dmQtPmN1cmZyYW1lXTsKKwlpY2FtLT5oYXNfaGRyID0gMDsKKwlzd2l0Y2ggKGljYW0tPmNhbWVyYV9tb2RlbCkgeworCWNhc2UgSUJNQ0FNX01PREVMXzE6CisJeworCQljb25zdCBpbnQgbWFya2VyX2xlbiA9IDQ7CisJCXdoaWxlIChSaW5nUXVldWVfR2V0TGVuZ3RoKCZ1dmQtPmRwKSA+PSBtYXJrZXJfbGVuKSB7CisJCQlpZiAoKFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMCkgPT0gMHgwMCkgJiYKKwkJCSAgICAoUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAxKSA9PSAweEZGKSAmJgorCQkJICAgIChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDIpID09IDB4MDApKQorCQkJeworI2lmIDAJCQkJLyogVGhpcyBjb2RlIGhlbHBzIHRvIGRldGVjdCBuZXcgZnJhbWUgbWFya2VycyAqLworCQkJCWluZm8oIkhlYWRlciBzaWc6IDAwIEZGIDAwICUwMlgiLCBSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDMpKTsKKyNlbmRpZgorCQkJCWZyYW1lLT5oZWFkZXIgPSBSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDMpOworCQkJCWlmICgoZnJhbWUtPmhlYWRlciA9PSBIRFJTSUdfTU9ERUwxXzEyOHg5NikgfHwKKwkJCQkgICAgKGZyYW1lLT5oZWFkZXIgPT0gSERSU0lHX01PREVMMV8xNzZ4MTQ0KSB8fAorCQkJCSAgICAoZnJhbWUtPmhlYWRlciA9PSBIRFJTSUdfTU9ERUwxXzM1MngyODgpKQorCQkJCXsKKyNpZiAwCisJCQkJCWluZm8oIkhlYWRlciBmb3VuZC4iKTsKKyNlbmRpZgorCQkJCQlSSU5HX1FVRVVFX0RFUVVFVUVfQllURVMoJnV2ZC0+ZHAsIG1hcmtlcl9sZW4pOworCQkJCQlpY2FtLT5oYXNfaGRyID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLyogSWYgd2UgYXJlIHN0aWxsIGhlcmUgdGhlbiB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgaGVhZGVyICovCisJCQlSSU5HX1FVRVVFX0RFUVVFVUVfQllURVMoJnV2ZC0+ZHAsIDEpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIElCTUNBTV9NT0RFTF8yOgorY2FzZSBJQk1DQU1fTU9ERUxfNDoKKwl7CisJCWludCBtYXJrZXJfbGVuID0gMDsKKwkJc3dpdGNoICh1dmQtPnZpZGVvc2l6ZSkgeworCQljYXNlIFZJREVPU0laRV8xNzZ4MTQ0OgorCQkJbWFya2VyX2xlbiA9IDEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltYXJrZXJfbGVuID0gMjsKKwkJCWJyZWFrOworCQl9CisJCXdoaWxlIChSaW5nUXVldWVfR2V0TGVuZ3RoKCZ1dmQtPmRwKSA+PSBtYXJrZXJfbGVuKSB7CisJCQlpZiAoKFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMCkgPT0gMHgwMCkgJiYKKwkJCSAgICAoUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAxKSA9PSAweEZGKSkKKwkJCXsKKyNpZiAwCisJCQkJaW5mbygiSGVhZGVyIGZvdW5kLiIpOworI2VuZGlmCisJCQkJUklOR19RVUVVRV9ERVFVRVVFX0JZVEVTKCZ1dmQtPmRwLCBtYXJrZXJfbGVuKTsKKwkJCQlpY2FtLT5oYXNfaGRyID0gMTsKKwkJCQlmcmFtZS0+aGVhZGVyID0gSERSU0lHX01PREVMMV8xNzZ4MTQ0OworCQkJCWJyZWFrOworCQkJfQorCQkJLyogSWYgd2UgYXJlIHN0aWxsIGhlcmUgdGhlbiB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgaGVhZGVyICovCisJCQlSSU5HX1FVRVVFX0RFUVVFVUVfQllURVMoJnV2ZC0+ZHAsIDEpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIElCTUNBTV9NT0RFTF8zOgorCXsJLyoKKwkJICogSGVhZGVyczogKG9uZSBwcmVjZWRlcyBldmVyeSBmcmFtZSkuIG5jPW5vIGNvbXByZXNzaW9uLAorCQkgKiBicT1iZXN0IHF1YWxpdHkgYmY9YmVzdCBmcmFtZSByYXRlLgorCQkgKgorCQkgKiAxNzZ4MTQ0OiAwMCBGRiAwMiB7IDBBPW5jIENBPWJxIEVBPWJmIH0KKwkJICogMzIweDI0MDogMDAgRkYgMDIgeyAwOD1uYyAyOD1icSA2OD1iZiB9CisJCSAqIDY0MHg0ODA6IDAwIEZGIDAzIHsgMDg9bmMgMjg9YnEgNjg9YmYgfQorCQkgKgorCQkgKiBCeXRlcyAnMDAgRkYnIHNlZW0gdG8gaW5kaWNhdGUgaGVhZGVyLiBPdGhlciB0d28gYnl0ZXMKKwkJICogZW5jb2RlIHRoZSBmcmFtZSB0eXBlLiBUaGlzIGlzIGEgc2V0IG9mIGJpdCBmaWVsZHMgdGhhdAorCQkgKiBlbmNvZGUgaW1hZ2Ugc2l6ZSwgY29tcHJlc3Npb24gdHlwZSBldGMuIFRoZXNlIGZpZWxkcworCQkgKiBkbyBOT1QgY29udGFpbiBmcmFtZSBudW1iZXIgYmVjYXVzZSBhbGwgZnJhbWVzIGNhcnJ5CisJCSAqIHRoZSBzYW1lIGhlYWRlci4KKwkJICovCisJCWNvbnN0IGludCBtYXJrZXJfbGVuID0gNDsKKwkJd2hpbGUgKFJpbmdRdWV1ZV9HZXRMZW5ndGgoJnV2ZC0+ZHApID49IG1hcmtlcl9sZW4pIHsKKwkJCWlmICgoUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAwKSA9PSAweDAwKSAmJgorCQkJICAgIChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDEpID09IDB4RkYpICYmCisJCQkgICAgKFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMikgIT0gMHhGRikpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBDb21iaW5lIDIgYnl0ZXMgb2YgZnJhbWUgdHlwZSBpbnRvIG9uZQorCQkJCSAqIGVhc3kgdG8gdXNlIHZhbHVlCisJCQkJICovCisJCQkJdW5zaWduZWQgbG9uZyBieXRlMywgYnl0ZTQ7CisKKwkJCQlieXRlMyA9IFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMik7CisJCQkJYnl0ZTQgPSBSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDMpOworCQkJCWZyYW1lLT5oZWFkZXIgPSAoYnl0ZTMgPDwgOCkgfCBieXRlNDsKKyNpZiAwCisJCQkJaW5mbygiSGVhZGVyIGZvdW5kLiIpOworI2VuZGlmCisJCQkJUklOR19RVUVVRV9ERVFVRVVFX0JZVEVTKCZ1dmQtPmRwLCBtYXJrZXJfbGVuKTsKKwkJCQlpY2FtLT5oYXNfaGRyID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIElmIHdlIGFyZSBzdGlsbCBoZXJlIHRoZW4gdGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBhIGhlYWRlciAqLworCQkJUklOR19RVUVVRV9ERVFVRVVFX0JZVEVTKCZ1dmQtPmRwLCAxKTsKKwkJfQorCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmICghaWNhbS0+aGFzX2hkcikgeworCQlpZiAodXZkLT5kZWJ1ZyA+IDIpCisJCQlpbmZvKCJTa2lwcGluZyBmcmFtZSwgbm8gaGVhZGVyIik7CisJCXJldHVybiBzY2FuX0VuZFBhcnNlOworCX0KKworCS8qIEhlYWRlciBmb3VuZCAqLworCWljYW0tPmhhc19oZHIgPSAxOworCXV2ZC0+c3RhdHMuaGVhZGVyX2NvdW50Kys7CisJZnJhbWUtPnNjYW5zdGF0ZSA9IFNjYW5TdGF0ZV9MaW5lczsKKwlmcmFtZS0+Y3VybGluZSA9IDA7CisKKwlpZiAoZmxhZ3MgJiBGTEFHU19GT1JDRV9URVNUUEFUVEVSTikgeworCQl1c2J2aWRlb19UZXN0UGF0dGVybih1dmQsIDEsIDEpOworCQlyZXR1cm4gc2Nhbl9OZXh0RnJhbWU7CisJfQorCXJldHVybiBzY2FuX0NvbnRpbnVlOworfQorCisvKgorICogaWJtY2FtX3BhcnNlX2xpbmVzKCkKKyAqCisgKiBQYXJzZSBvbmUgbGluZSAoaW50ZXJsYWNlZCkgZnJvbSB0aGUgYnVmZmVyLCBwdXQKKyAqIGRlY29kZWQgUkdCIHZhbHVlIGludG8gdGhlIGN1cnJlbnQgZnJhbWUgYnVmZmVyCisgKiBhbmQgYWRkIHRoZSB3cml0dGVuIG51bWJlciBvZiBieXRlcyAoUkdCKSB0bworICogdGhlICpwY29weWxlbi4KKyAqCisgKiBIaXN0b3J5OgorICogMjEtSmFuLTIwMDAgQ3JlYXRlZC4KKyAqIDEyLU9jdC0yMDAwIFJld29ya2VkIHRvIHJlZmxlY3QgaW50ZXJsYWNlZCBuYXR1cmUgb2YgdGhlIGRhdGEuCisgKi8KK3N0YXRpYyBlbnVtIFBhcnNlU3RhdGUgaWJtY2FtX3BhcnNlX2xpbmVzKAorCXN0cnVjdCB1dmQgKnV2ZCwKKwlzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lLAorCWxvbmcgKnBjb3B5bGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmY7CisJaWJtY2FtX3QgKmljYW07CisJdW5zaWduZWQgaW50IGxlbiwgc2Nhbkxlbmd0aCwgc2NhbkhlaWdodCwgb3JkZXJfdXYsIG9yZGVyX3ljOworCWludCB2NGxfbGluZXNpemU7IC8qIFY0TCBsaW5lIG9mZnNldCAqLworCWNvbnN0IGludCBodWVfY29yciAgPSAodXZkLT52cGljLmh1ZSAtIDB4ODAwMCkgPj4gMTA7CS8qIC0zMi4uKzMxICovCisJY29uc3QgaW50IGh1ZTJfY29yciA9IChodWVfY29ycmVjdGlvbiAtIDEyOCkgLyA0OwkJLyogLTMyLi4rMzEgKi8KKwljb25zdCBpbnQgY2NtID0gMTI4OyAvKiBDb2xvciBjb3JyZWN0aW9uIG1lZGlhbiAtIHNlZSBiZWxvdyAqLworCWludCB5LCB1LCB2LCBpLCBmcmFtZV9kb25lPTAsIGNvbG9yX2NvcnI7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGluZUJ1ZmZlcls2NDAqM107CisJdW5zaWduZWQgY29uc3QgY2hhciAqY2hyb21hTGluZSwgKmx1bWFMaW5lOworCisJYXNzZXJ0KHV2ZCAhPSBOVUxMKTsKKwlhc3NlcnQoZnJhbWUgIT0gTlVMTCk7CisJaWNhbSA9IElCTUNBTV9UKHV2ZCk7CisJYXNzZXJ0KGljYW0gIT0gTlVMTCk7CisJY29sb3JfY29yciA9ICh1dmQtPnZwaWMuY29sb3VyIC0gMHg4MDAwKSA+PiA4OyAvKiAtMTI4Li4rMTI3ID0gLWNjbS4uKyhjY20tMSkqLworCVJFU1RSSUNUX1RPX1JBTkdFKGNvbG9yX2NvcnIsIC1jY20sIGNjbSsxKTsKKworCXY0bF9saW5lc2l6ZSA9IFZJREVPU0laRV9YKGZyYW1lLT5yZXF1ZXN0KSAqIFY0TF9CWVRFU19QRVJfUElYRUw7CisKKwlpZiAoSUJNQ0FNX1QodXZkKS0+Y2FtZXJhX21vZGVsID09IElCTUNBTV9NT0RFTF80KSB7CisJCS8qIE1vZGVsIDQgZnJhbWUgbWFya2VycyBkbyBub3QgY2FycnkgaW1hZ2Ugc2l6ZSBpZGVudGlmaWNhdGlvbiAqLworCQlzd2l0Y2ggKHV2ZC0+dmlkZW9zaXplKSB7CisJCWNhc2UgVklERU9TSVpFXzEyOHg5NjoKKwkJY2FzZSBWSURFT1NJWkVfMTYweDEyMDoKKwkJY2FzZSBWSURFT1NJWkVfMTc2eDE0NDoKKwkJCXNjYW5MZW5ndGggPSBWSURFT1NJWkVfWCh1dmQtPnZpZGVvc2l6ZSk7CisJCQlzY2FuSGVpZ2h0ID0gVklERU9TSVpFX1kodXZkLT52aWRlb3NpemUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIoImlibWNhbV9wYXJzZV9saW5lczogV3JvbmcgbW9kZS4iKTsKKwkJCXJldHVybiBzY2FuX091dDsKKwkJfQorCQlvcmRlcl95YyA9IDE7CS8qIG9yZGVyX3ljOiB0cnVlPVljIGZhbHNlPWNZICgnYyc9ZWl0aGVyIFUgb3IgVikgKi8KKwkJb3JkZXJfdXYgPSAxOwkvKiBBbHdheXMgdHJ1ZSBpbiB0aGlzIGFsZ29yaXRobSAqLworCX0gZWxzZSB7CisJCXN3aXRjaCAoZnJhbWUtPmhlYWRlcikgeworCQljYXNlIEhEUlNJR19NT0RFTDFfMTI4eDk2OgorCQkJc2Nhbkxlbmd0aCA9IDEyODsKKwkJCXNjYW5IZWlnaHQgPSA5NjsKKwkJCW9yZGVyX3V2ID0gMTsJLyogVSBZIFYgWSAuLi4gKi8KKwkJCWJyZWFrOworCQljYXNlIEhEUlNJR19NT0RFTDFfMTc2eDE0NDoKKwkJCXNjYW5MZW5ndGggPSAxNzY7CisJCQlzY2FuSGVpZ2h0ID0gMTQ0OworCQkJb3JkZXJfdXYgPSAxOwkvKiBVIFkgViBZIC4uLiAqLworCQkJYnJlYWs7CisJCWNhc2UgSERSU0lHX01PREVMMV8zNTJ4Mjg4OgorCQkJc2Nhbkxlbmd0aCA9IDM1MjsKKwkJCXNjYW5IZWlnaHQgPSAyODg7CisJCQlvcmRlcl91diA9IDA7CS8qIFkgViBZIFYgLi4uICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigiVW5rbm93biBoZWFkZXIgc2lnbmF0dXJlIDAwIEZGIDAwICUwMmxYIiwgZnJhbWUtPmhlYWRlcik7CisJCQlyZXR1cm4gc2Nhbl9OZXh0RnJhbWU7CisJCX0KKwkJLyogb3JkZXJfeWM6IHRydWU9WWMgZmFsc2U9Y1kgKCdjJz1laXRoZXIgVSBvciBWKSAqLworCQlvcmRlcl95YyA9IChJQk1DQU1fVCh1dmQpLT5jYW1lcmFfbW9kZWwgPT0gSUJNQ0FNX01PREVMXzIpOworCX0KKworCWxlbiA9IHNjYW5MZW5ndGggKiAzOworCWFzc2VydChsZW4gPD0gc2l6ZW9mKGxpbmVCdWZmZXIpKTsKKworCS8qCisJICogTGluZXMgYXJlIG9yZ2FuaXplZCB0aGlzIHdheToKKwkgKgorCSAqIEk0MjA6CisJICogfn5+fgorCSAqIDxzY2FuTGVuZ3RoLT4KKwkgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCSAqIHwtLS0tLVktLS0tLXwtLS1VVlVWVVYuLi5VVlVWLS0tLS18IFwKKwkgKiB8LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgXAorCSAqIHw8LS0gMTc2IC0tPnw8LS0tLS0tIDE3NioyIC0tLS0tLT58ICBUb3RhbCA3Mi4gbGluZXMgKGludGVybGFjZWQpCisJICogfC4uLgkgICAuLi4gfCAgICAgICAgLi4uICAgICAgICAgIHwgIC8KKwkgKiB8PC0tIDM1MiAtLT58PC0tLS0tLSAzNTIqMiAtLS0tLS0+fCAgVG90YWwgMTQ0LiBsaW5lcyAoaW50ZXJsYWNlZCkKKwkgKiB8X19fX19fX19fX198X19fX19fX19fX19fX19fX19fX19ffCAvCisJICogIFwgICAgICAgICAgIFwKKwkgKiAgIGx1bWFMaW5lICAgIGNocm9tYUxpbmUKKwkgKi8KKworCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBkYXRhIGZvciB0aGUgZW50aXJlIGxpbmUgKi8KKwlpZiAoUmluZ1F1ZXVlX0dldExlbmd0aCgmdXZkLT5kcCkgPCBsZW4pCisJCXJldHVybiBzY2FuX091dDsKKworCS8qIFN1Y2sgb25lIGxpbmUgb3V0IG9mIHRoZSByaW5nIHF1ZXVlICovCisJUmluZ1F1ZXVlX0RlcXVldWUoJnV2ZC0+ZHAsIGxpbmVCdWZmZXIsIGxlbik7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IG91ciB3cml0aW5nIGludG8gb3V0cHV0IGJ1ZmZlcgorCSAqIHdpbGwgbm90IGV4Y2VlZCB0aGUgYnVmZmVyLiBNaW5kIHRoYXQgd2UgbWF5IHdyaXRlCisJICogbm90IGludG8gY3VycmVudCBvdXRwdXQgc2NhbmxpbmUgYnV0IGluIHNldmVyYWwgYWZ0ZXIKKwkgKiBpdCBhcyB3ZWxsIChpZiB3ZSBlbmxhcmdlIGltYWdlIHZlcnRpY2FsbHkuKQorCSAqLworCWlmICgoZnJhbWUtPmN1cmxpbmUgKyAyKSA+PSBWSURFT1NJWkVfWShmcmFtZS0+cmVxdWVzdCkpCisJCXJldHVybiBzY2FuX05leHRGcmFtZTsKKworCS8qCisJICogTm93IHdlIGFyZSBzdXJlIHRoYXQgZW50aXJlIGxpbmUgKHJlcHJlc2VudGluZyBhbGwgJ3NjYW5MZW5ndGgnCisJICogcGl4ZWxzIGZyb20gdGhlIGNhbWVyYSkgaXMgYXZhaWxhYmxlIGluIHRoZSBidWZmZXIuIFdlCisJICogc3RhcnQgY29weWluZyB0aGUgbGluZSBsZWZ0LWFsaWduZWQgdG8gdGhlIFY0TCBidWZmZXIuCisJICogSWYgdGhlIGNhbWVyYSBsaW5lIGlzIHNob3J0ZXIgdGhlbiB3ZSBzaG91bGQgcGFkIHRoZSBWNEwKKwkgKiBidWZmZXIgd2l0aCBzb21ldGhpbmcgKGJsYWNrKSB0byBjb21wbGV0ZSB0aGUgbGluZS4KKwkgKi8KKwlhc3NlcnQoZnJhbWUtPmRhdGEgIT0gTlVMTCk7CisJZiA9IGZyYW1lLT5kYXRhICsgKHY0bF9saW5lc2l6ZSAqIGZyYW1lLT5jdXJsaW5lKTsKKworCS8qCisJICogVG8gb2J0YWluIGNocm9taW5hbmNlIGRhdGEgZnJvbSB0aGUgJ2Nocm9tYUxpbmUnIHVzZSB0aGlzOgorCSAqICAgdiA9IGNocm9tYUxpbmVbMF07IC8vIDAtMTpbMF0sIDItMzpbNF0sIDQtNTpbOF0uLi4KKwkgKiAgIHUgPSBjaHJvbWFMaW5lWzJdOyAvLyAwLTE6WzJdLCAyLTM6WzZdLCA0LTU6WzEwXS4uLgorCSAqCisJICogSW5kaWNlcyBtdXN0IGJlIGNhbGN1bGF0ZWQgdGhpcyB3YXk6CisJICogdl9pbmRleCA9IChpID4+IDEpIDw8IDI7CisJICogdV9pbmRleCA9IChpID4+IDEpIDw8IDIgKyAyOworCSAqCisJICogd2hlcmUgJ2knIGlzIHRoZSBjb2x1bW4gbnVtYmVyIFswLi5WSURFT1NJWkVfWChmcmFtZS0+cmVxdWVzdCktMV0KKwkgKi8KKwlsdW1hTGluZSA9IGxpbmVCdWZmZXI7CisJY2hyb21hTGluZSA9IGxpbmVCdWZmZXIgKyBzY2FuTGVuZ3RoOworCWZvciAoaSA9IDA7IGkgPCBWSURFT1NJWkVfWChmcmFtZS0+cmVxdWVzdCk7IGkrKykKKwl7CisJCXVuc2lnbmVkIGNoYXIgcnYsIGd2LCBidjsJLyogUkdCIGNvbXBvbmVudHMgKi8KKworCQkvKiBDaGVjayBmb3IgdmFyaW91cyB2aXN1YWwgZGVidWdnaW5nIGhpbnRzIChjb2xvcml6ZWQgcGl4ZWxzKSAqLworCQlpZiAoKGZsYWdzICYgRkxBR1NfRElTUExBWV9ISU5UUykgJiYgKGljYW0tPmhhc19oZHIpKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyBiYWQgYW5kIHNob3VsZCBub3QgaGFwcGVuLiBUaGlzIG1lYW5zIHRoYXQKKwkJCSAqIHdlIHNvbWVob3cgb3ZlcnNob290IHRoZSBsaW5lIGFuZCBlbmNvdW50ZXJlZCBuZXcKKwkJCSAqIGZyYW1lISBPYnZpb3VzbHkgb3VyIGNhbWVyYS9WNEwgZnJhbWUgc2l6ZSBpcyBvdXQKKwkJCSAqIG9mIHdoYWNrLiBUaGlzIGN5YW4gZG90IHdpbGwgaGVscCB5b3UgdG8gZmlndXJlCisJCQkgKiBvdXQgd2hlcmUgZXhhY3RseSB0aGUgbmV3IGZyYW1lIGFycml2ZWQuCisJCQkgKi8KKwkJCWlmIChpY2FtLT5oYXNfaGRyID09IDEpIHsKKwkJCQlidiA9IDA7IC8qIFllbGxvdyBtYXJrZXIgKi8KKwkJCQlndiA9IDB4RkY7CisJCQkJcnYgPSAweEZGOworCQkJfSBlbHNlIHsKKwkJCQlidiA9IDB4RkY7IC8qIEN5YW4gbWFya2VyICovCisJCQkJZ3YgPSAweEZGOworCQkJCXJ2ID0gMDsKKwkJCX0KKwkJCWljYW0tPmhhc19oZHIgPSAwOworCQkJZ290byBtYWtlX3BpeGVsOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgd2UgYXJlIHN0aWxsIGluIHJhbmdlLiBXZSBtYXkgYmUgb3V0IG9mIHJhbmdlIGlmIG91cgorCQkgKiBWNEwgY2FudmFzIGlzIHdpZGVyIG9yIHRhbGxlciB0aGFuIHRoZSBjYW1lcmEgIm5hdGl2ZSIgaW1hZ2UuCisJCSAqIFRoZW4gd2UgcXVpY2tseSBmaWxsIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUgd2l0aCB6ZXJvcyB0bworCQkgKiBtYWtlIGJsYWNrIGNvbG9yIGFuZCBxdWl0IHRoZSBob3Jpem9udGFsIHNjYW5uaW5nIGxvb3AuCisJCSAqLworCQlpZiAoKChmcmFtZS0+Y3VybGluZSArIDIpID49IHNjYW5IZWlnaHQpIHx8IChpID49IHNjYW5MZW5ndGgpKSB7CisJCQljb25zdCBpbnQgaiA9IGkgKiBWNExfQllURVNfUEVSX1BJWEVMOworI2lmIFVTRVNfSUJNQ0FNX1BVVFBJWEVMCisJCQkvKiBSZWZyZXNoICdmJyBiZWNhdXNlIHdlIGRvbid0IHVzZSBpdCBtdWNoIHdpdGggUFVUUElYRUwgKi8KKwkJCWYgPSBmcmFtZS0+ZGF0YSArICh2NGxfbGluZXNpemUgKiBmcmFtZS0+Y3VybGluZSkgKyBqOworI2VuZGlmCisJCQltZW1zZXQoZiwgMCwgdjRsX2xpbmVzaXplIC0gaik7CisJCQlicmVhazsKKwkJfQorCisJCXkgPSBsdW1hTGluZVtpXTsKKwkJaWYgKGZsYWdzICYgRkxBR1NfTU9OT0NIUk9NRSkgLyogVXNlIG1vbm9jaHJvbWUgZm9yIGRlYnVnZ2luZyAqLworCQkJcnYgPSBndiA9IGJ2ID0geTsKKwkJZWxzZSB7CisJCQlpbnQgb2ZmXzAsIG9mZl8yOworCisJCQlvZmZfMCA9IChpID4+IDEpIDw8IDI7CisJCQlvZmZfMiA9IG9mZl8wICsgMjsKKworCQkJaWYgKG9yZGVyX3ljKSB7CisJCQkJb2ZmXzArKzsKKwkJCQlvZmZfMisrOworCQkJfQorCQkJaWYgKCFvcmRlcl91dikgeworCQkJCW9mZl8wICs9IDI7CisJCQkJb2ZmXzIgLT0gMjsKKwkJCX0KKwkJCXUgPSBjaHJvbWFMaW5lW29mZl8wXSArIGh1ZV9jb3JyOworCQkJdiA9IGNocm9tYUxpbmVbb2ZmXzJdICsgaHVlMl9jb3JyOworCisJCQkvKiBBcHBseSBjb2xvciBjb3JyZWN0aW9uICovCisJCQlpZiAoY29sb3JfY29yciAhPSAwKSB7CisJCQkJLyogTWFnbmlmeSB1cCB0byAyIHRpbWVzLCByZWR1Y2UgZG93biB0byB6ZXJvIHNhdHVyYXRpb24gKi8KKwkJCQl1ID0gMTI4ICsgKChjY20gKyBjb2xvcl9jb3JyKSAqICh1IC0gMTI4KSkgLyBjY207CisJCQkJdiA9IDEyOCArICgoY2NtICsgY29sb3JfY29ycikgKiAodiAtIDEyOCkpIC8gY2NtOworCQkJfQorCQkJWVVWX1RPX1JHQl9CWV9USEVfQk9PSyh5LCB1LCB2LCBydiwgZ3YsIGJ2KTsKKwkJfQorCisJbWFrZV9waXhlbDoKKwkJLyoKKwkJICogVGhlIHB1cnBvc2Ugb2YgY3JlYXRpbmcgdGhlIHBpeGVsIGhlcmUsIGluIG9uZSwKKwkJICogZGVkaWNhdGVkIHBsYWNlIGlzIHRoYXQgd2UgbWF5IG5lZWQgdG8gbWFrZSB0aGUKKwkJICogcGl4ZWwgd2lkZXIgYW5kIHRhbGxlciB0aGFuIGl0IGFjdHVhbGx5IGlzLiBUaGlzCisJCSAqIG1heSBiZSB1c2VkIGlmIGNhbWVyYSBnZW5lcmF0ZXMgc21hbGwgZnJhbWVzIGZvcgorCQkgKiBzYWtlIG9mIGZyYW1lIHJhdGUgKG9yIGFueSBvdGhlciByZWFzb24uKQorCQkgKgorCQkgKiBUaGUgb3V0cHV0IGRhdGEgY29uc2lzdHMgb2YgQiwgRywgUiBieXRlcworCQkgKiAoaW4gdGhpcyBvcmRlcikuCisJCSAqLworI2lmIFVTRVNfSUJNQ0FNX1BVVFBJWEVMCisJCVJHQjI0X1BVVFBJWEVMKGZyYW1lLCBpLCBmcmFtZS0+Y3VybGluZSwgcnYsIGd2LCBidik7CisjZWxzZQorCQkqZisrID0gYnY7CisJCSpmKysgPSBndjsKKwkJKmYrKyA9IHJ2OworI2VuZGlmCisJCS8qCisJCSAqIFR5cGljYWxseSB3ZSBkbyBub3QgZGVjaWRlIHdpdGhpbiBhIGxlZ2l0aW1hdGUgZnJhbWUKKwkJICogdGhhdCB3ZSB3YW50IHRvIGVuZCB0aGUgZnJhbWUuIEhvd2V2ZXIgZGVidWdnaW5nIGNvZGUKKwkJICogbWF5IGRldGVjdCBtYXJrZXIgb2YgbmV3IGZyYW1lIHdpdGhpbiB0aGUgZGF0YS4gVGhlbgorCQkgKiB0aGlzIGNvbmRpdGlvbiBhY3RpdmF0ZXMuIFRoZSAnZGF0YScgcG9pbnRlciBpcyBhbHJlYWR5CisJCSAqIHBvaW50aW5nIGF0IHRoZSBuZXcgbWFya2VyLCBzbyB3ZSdkIGJldHRlciBsZWF2ZSBpdCBhcyBpcy4KKwkJICovCisJCWlmIChmcmFtZV9kb25lKQorCQkJYnJlYWs7CS8qIEVuZCBzY2FubmluZyBvZiBsaW5lcyAqLworCX0KKwkvKgorCSAqIEFjY291bnQgZm9yIG51bWJlciBvZiBieXRlcyB0aGF0IHdlIHdyb3RlIGludG8gb3V0cHV0IFY0TCBmcmFtZS4KKwkgKiBXZSBkbyBpdCBoZXJlLCBhZnRlciB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBzY2FubGluZSwgYmVjYXVzZSB3ZQorCSAqIG1heSBmaWxsIG1vcmUgdGhhbiBvbmUgb3V0cHV0IHNjYW5saW5lIGlmIHdlIGRvIHZlcnRpY2FsCisJICogZW5sYXJnZW1lbnQuCisJICovCisJZnJhbWUtPmN1cmxpbmUgKz0gMjsKKwlpZiAocGNvcHlsZW4gIT0gTlVMTCkKKwkJKnBjb3B5bGVuICs9IDIgKiB2NGxfbGluZXNpemU7CisJZnJhbWUtPmRlaW50ZXJsYWNlID0gRGVpbnRlcmxhY2VfRmlsbE9kZExpbmVzOworCisJaWYgKGZyYW1lX2RvbmUgfHwgKGZyYW1lLT5jdXJsaW5lID49IFZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KSkpCisJCXJldHVybiBzY2FuX05leHRGcmFtZTsKKwllbHNlCisJCXJldHVybiBzY2FuX0NvbnRpbnVlOworfQorCisvKgorICogaWJtY2FtX21vZGVsMl8zMjB4MjQwX3BhcnNlX2xpbmVzKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBkZWFscyB3aXRoIGEgd2VpcmQgUkdCIGZvcm1hdCB0aGF0IGlzIHByb2R1Y2VkIGJ5IElCTQorICogY2FtZXJhIG1vZGVsIDIgaW4gbW9kZXMgMzIweDI0MCBhbmQgYWJvdmU7ICd4JyBiZWxvdyBpcyAxNTkgb3IgMTc1LAorICogZGVwZW5kaW5nIG9uIGhvcml6b250YWwgc2l6ZSBvZiB0aGUgcGljdHVyZToKKyAqCisgKiA8LS0tIDE2MCBvciAxNzYgcGFpcnMgb2YgUkEsUkIgYnl0ZXMgLS0tLS0+CisgKiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIFwKKyAqIHwgUkEwIHwgUkIwIHwgUkExIHwgUkIxIHwgLi4uIHwgUkF4IHwgUkJ4IHwgIFwgICBUaGlzIGlzIHBhaXIgb2YgaG9yaXpvbnRhbCBsaW5lcywKKyAqIHwtLS0tLSstLS0tLSstLS0tLSstLS0tLSsgLi4uICstLS0tLSstLS0tLXwgICAqLSBvciBvbmUgaW50ZXJsYWNlZCBsaW5lLCB0b3RhbAorICogfCBCMCAgfCBHMCAgfCBCMSAgfCBHMSAgfCAuLi4gfCBCeCAgfCBHeCAgfCAgLyAgIDEyMCBvciAxNDQgc3VjaCBwYWlycyB3aGljaCB5aWVsZAorICogfD09PT09Kz09PT09Kz09PT09Kz09PT09KyAuLi4gKz09PT09Kz09PT09fCAvICAgIDI0MCBvciAyODggbGluZXMgYWZ0ZXIgZGVpbnRlcmxhY2luZy4KKyAqCisgKiBFYWNoIGdyb3VwIG9mIEZPVVIgYnl0ZXMgKFJBaSwgUkJpLCBCaSwgR2kpIHdoZXJlIGk9MC4uZnJhbWVfd2lkdGgvMi0xCisgKiBkZWZpbmVzIE9ORSBwaXhlbC4gVGhlcmVmb3JlIHRoaXMgZm9ybWF0IHlpZWxkcyAxNzZ4MTQ0ICJkZWNvZGVkIgorICogcmVzb2x1dGlvbiBhdCBiZXN0LiBJIGRvIG5vdCBrbm93IHdoeSBjYW1lcmEgc2VuZHMgc3VjaCBmb3JtYXQgLSB0aGUKKyAqIHByZXZpb3VzIG1vZGVsICgxKSBqdXN0IHVzZWQgaW50ZXJsYWNlZCBJNDIwIGFuZCBldmVyeW9uZSB3YXMgaGFwcHkuCisgKgorICogSSBkbyBub3Qga25vdyB3aGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gUkFpIGFuZCBSQmkgYnl0ZXMuIEJvdGgKKyAqIHNlZW1pbmdseSByZXByZXNlbnQgUiBjb21wb25lbnQsIGJ1dCBzbGlnaHRseSB2YXJ5IGluIHZhbHVlIChzbyB0aGF0CisgKiB0aGUgcGljdHVyZSBsb29rcyBhIGJpdCBjb2xvcmVkIGlmIG9uZSBvciBhbm90aGVyIGlzIHVzZWQpLiBJIHVzZQorICogdGhlbSBib3RoIGFzIFIgY29tcG9uZW50IGluIGF0dGVtcHQgdG8gYXQgbGVhc3QgcGFydGlhbGx5IHJlY292ZXIgdGhlCisgKiBsb3N0IHJlc29sdXRpb24uCisgKi8KK3N0YXRpYyBlbnVtIFBhcnNlU3RhdGUgaWJtY2FtX21vZGVsMl8zMjB4MjQwX3BhcnNlX2xpbmVzKAorCXN0cnVjdCB1dmQgKnV2ZCwKKwlzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lLAorCWxvbmcgKnBjb3B5bGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmYsICpsYSwgKmxiOworCXVuc2lnbmVkIGludCBsZW47CisJaW50IHY0bF9saW5lc2l6ZTsgLyogVjRMIGxpbmUgb2Zmc2V0ICovCisJaW50IGksIGosIGZyYW1lX2RvbmU9MCwgY29sb3JfY29ycjsKKwlpbnQgc2Nhbkxlbmd0aCwgc2NhbkhlaWdodDsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBsaW5lQnVmZmVyWzM1MioyXTsKKworCXN3aXRjaCAodXZkLT52aWRlb3NpemUpIHsKKwljYXNlIFZJREVPU0laRV8zMjB4MjQwOgorCWNhc2UgVklERU9TSVpFXzM1MngyNDA6CisJY2FzZSBWSURFT1NJWkVfMzUyeDI4ODoKKwkJc2Nhbkxlbmd0aCA9IFZJREVPU0laRV9YKHV2ZC0+dmlkZW9zaXplKTsKKwkJc2NhbkhlaWdodCA9IFZJREVPU0laRV9ZKHV2ZC0+dmlkZW9zaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyKCJpYm1jYW1fbW9kZWwyXzMyMHgyNDBfcGFyc2VfbGluZXM6IFdyb25nIG1vZGUuIik7CisJCXJldHVybiBzY2FuX091dDsKKwl9CisKKwljb2xvcl9jb3JyID0gKHV2ZC0+dnBpYy5jb2xvdXIpID4+IDg7IC8qIDAuLisyNTUgKi8KKwl2NGxfbGluZXNpemUgPSBWSURFT1NJWkVfWChmcmFtZS0+cmVxdWVzdCkgKiBWNExfQllURVNfUEVSX1BJWEVMOworCisJbGVuID0gc2Nhbkxlbmd0aCAqIDI7IC8qIFNlZSBleHBsYW5hdGlvbiBhYm92ZSAqLworCWFzc2VydChsZW4gPD0gc2l6ZW9mKGxpbmVCdWZmZXIpKTsKKworCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBkYXRhIGZvciB0aGUgZW50aXJlIGxpbmUgKi8KKwlpZiAoUmluZ1F1ZXVlX0dldExlbmd0aCgmdXZkLT5kcCkgPCBsZW4pCisJCXJldHVybiBzY2FuX091dDsKKworCS8qIFN1Y2sgb25lIGxpbmUgb3V0IG9mIHRoZSByaW5nIHF1ZXVlICovCisJUmluZ1F1ZXVlX0RlcXVldWUoJnV2ZC0+ZHAsIGxpbmVCdWZmZXIsIGxlbik7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IG91ciB3cml0aW5nIGludG8gb3V0cHV0IGJ1ZmZlcgorCSAqIHdpbGwgbm90IGV4Y2VlZCB0aGUgYnVmZmVyLiBNaW5kIHRoYXQgd2UgbWF5IHdyaXRlCisJICogbm90IGludG8gY3VycmVudCBvdXRwdXQgc2NhbmxpbmUgYnV0IGluIHNldmVyYWwgYWZ0ZXIKKwkgKiBpdCBhcyB3ZWxsIChpZiB3ZSBlbmxhcmdlIGltYWdlIHZlcnRpY2FsbHkuKQorCSAqLworCWlmICgoZnJhbWUtPmN1cmxpbmUgKyAyKSA+PSBWSURFT1NJWkVfWShmcmFtZS0+cmVxdWVzdCkpCisJCXJldHVybiBzY2FuX05leHRGcmFtZTsKKworCWxhID0gbGluZUJ1ZmZlcjsKKwlsYiA9IGxpbmVCdWZmZXIgKyBzY2FuTGVuZ3RoOworCisJLyoKKwkgKiBOb3cgd2UgYXJlIHN1cmUgdGhhdCBlbnRpcmUgbGluZSAocmVwcmVzZW50aW5nIGFsbAorCSAqICAgICAgICAgVklERU9TSVpFX1goZnJhbWUtPnJlcXVlc3QpCisJICogcGl4ZWxzIGZyb20gdGhlIGNhbWVyYSkgaXMgYXZhaWxhYmxlIGluIHRoZSBzY3JhdGNoIGJ1ZmZlci4gV2UKKwkgKiBzdGFydCBjb3B5aW5nIHRoZSBsaW5lIGxlZnQtYWxpZ25lZCB0byB0aGUgVjRMIGJ1ZmZlciAod2hpY2gKKwkgKiBtaWdodCBiZSBsYXJnZXIgLSBub3Qgc21hbGxlciwgaG9wZWZ1bGx5KS4gSWYgdGhlIGNhbWVyYQorCSAqIGxpbmUgaXMgc2hvcnRlciB0aGVuIHdlIHNob3VsZCBwYWQgdGhlIFY0TCBidWZmZXIgd2l0aCBzb21ldGhpbmcKKwkgKiAoYmxhY2sgaW4gdGhpcyBjYXNlKSB0byBjb21wbGV0ZSB0aGUgbGluZS4KKwkgKi8KKwlmID0gZnJhbWUtPmRhdGEgKyAodjRsX2xpbmVzaXplICogZnJhbWUtPmN1cmxpbmUpOworCisJLyogRmlsbCB0aGUgMi1saW5lIHN0cmlwICovCisJZm9yIChpID0gMDsgaSA8IFZJREVPU0laRV9YKGZyYW1lLT5yZXF1ZXN0KTsgaSsrKSB7CisJCWludCB5LCBydiwgZ3YsIGJ2OwkvKiBSR0IgY29tcG9uZW50cyAqLworCisJCWogPSBpICYgKH4xKTsKKworCQkvKiBDaGVjayBmb3IgdmFyaW91cyB2aXN1YWwgZGVidWdnaW5nIGhpbnRzIChjb2xvcml6ZWQgcGl4ZWxzKSAqLworCQlpZiAoKGZsYWdzICYgRkxBR1NfRElTUExBWV9ISU5UUykgJiYgKElCTUNBTV9UKHV2ZCktPmhhc19oZHIpKSB7CisJCQlpZiAoSUJNQ0FNX1QodXZkKS0+aGFzX2hkciA9PSAxKSB7CisJCQkJYnYgPSAwOyAvKiBZZWxsb3cgbWFya2VyICovCisJCQkJZ3YgPSAweEZGOworCQkJCXJ2ID0gMHhGRjsKKwkJCX0gZWxzZSB7CisJCQkJYnYgPSAweEZGOyAvKiBDeWFuIG1hcmtlciAqLworCQkJCWd2ID0gMHhGRjsKKwkJCQlydiA9IDA7CisJCQl9CisJCQlJQk1DQU1fVCh1dmQpLT5oYXNfaGRyID0gMDsKKwkJCWdvdG8gbWFrZV9waXhlbDsKKwkJfQorCisJCS8qCisJCSAqIENoZWNrIGlmIHdlIGFyZSBzdGlsbCBpbiByYW5nZS4gV2UgbWF5IGJlIG91dCBvZiByYW5nZSBpZiBvdXIKKwkJICogVjRMIGNhbnZhcyBpcyB3aWRlciBvciB0YWxsZXIgdGhhbiB0aGUgY2FtZXJhICJuYXRpdmUiIGltYWdlLgorCQkgKiBUaGVuIHdlIHF1aWNrbHkgZmlsbCB0aGUgcmVtYWluZGVyIG9mIHRoZSBsaW5lIHdpdGggemVyb3MgdG8KKwkJICogbWFrZSBibGFjayBjb2xvciBhbmQgcXVpdCB0aGUgaG9yaXpvbnRhbCBzY2FubmluZyBsb29wLgorCQkgKi8KKwkJaWYgKCgoZnJhbWUtPmN1cmxpbmUgKyAyKSA+PSBzY2FuSGVpZ2h0KSB8fCAoaSA+PSBzY2FuTGVuZ3RoKSkgeworCQkJY29uc3QgaW50IGogPSBpICogVjRMX0JZVEVTX1BFUl9QSVhFTDsKKyNpZiBVU0VTX0lCTUNBTV9QVVRQSVhFTAorCQkJLyogUmVmcmVzaCAnZicgYmVjYXVzZSB3ZSBkb24ndCB1c2UgaXQgbXVjaCB3aXRoIFBVVFBJWEVMICovCisJCQlmID0gZnJhbWUtPmRhdGEgKyAodjRsX2xpbmVzaXplICogZnJhbWUtPmN1cmxpbmUpICsgajsKKyNlbmRpZgorCQkJbWVtc2V0KGYsIDAsIHY0bF9saW5lc2l6ZSAtIGopOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBIZXJlIEkgdXNlIFJBIGFuZCBSQiBjb21wb25lbnRzLCBvbmUgcGVyIHBoeXNpY2FsIHBpeGVsLgorCQkgKiBUaGlzIGNhdXNlcyBmaW5lIHZlcnRpY2FsIGdyaWQgb24gdGhlIHBpY3R1cmUgYnV0IG1heSBpbXByb3ZlCisJCSAqIGhvcml6b250YWwgcmVzb2x1dGlvbi4gSWYgeW91IHByZWZlciByZXBsaWNhdGluZywgdXNlIHRoaXM6CisJCSAqICAgcnYgPSBsYVtqICsgMF07ICAgLi4uIG9yIC4uLiBydiA9IGxhW2ogKyAxXTsKKwkJICogdGhlbiB0aGUgcGl4ZWwgd2lsbCBiZSByZXBsaWNhdGVkLgorCQkgKi8KKwkJcnYgPSBsYVtpXTsKKwkJZ3YgPSBsYltqICsgMV07CisJCWJ2ID0gbGJbaiArIDBdOworCisJCXkgPSAocnYgKyBndiArIGJ2KSAvIDM7IC8qIEJyaWdodG5lc3MgKGJhZGx5IGNhbGN1bGF0ZWQpICovCisKKwkJaWYgKGZsYWdzICYgRkxBR1NfTU9OT0NIUk9NRSkgLyogVXNlIG1vbm9jaHJvbWUgZm9yIGRlYnVnZ2luZyAqLworCQkJcnYgPSBndiA9IGJ2ID0geTsKKwkJZWxzZSBpZiAoY29sb3JfY29yciAhPSAxMjgpIHsKKworCQkJLyogQ2FsY3VsYXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb2xvciBhbmQgYnJpZ2h0bmVzcyAqLworCQkJcnYgLT0geTsKKwkJCWd2IC09IHk7CisJCQlidiAtPSB5OworCisJCQkvKiBTY2FsZSBkaWZmZXJlbmNlcyAqLworCQkJcnYgPSAocnYgKiBjb2xvcl9jb3JyKSAvIDEyODsKKwkJCWd2ID0gKGd2ICogY29sb3JfY29ycikgLyAxMjg7CisJCQlidiA9IChidiAqIGNvbG9yX2NvcnIpIC8gMTI4OworCisJCQkvKiBSZWFwcGx5IGJyaWdodG5lc3MgKi8KKwkJCXJ2ICs9IHk7CisJCQlndiArPSB5OworCQkJYnYgKz0geTsKKworCQkJLyogV2F0Y2ggZm9yIG92ZXJmbG93cyAqLworCQkJUkVTVFJJQ1RfVE9fUkFOR0UocnYsIDAsIDI1NSk7CisJCQlSRVNUUklDVF9UT19SQU5HRShndiwgMCwgMjU1KTsKKwkJCVJFU1RSSUNUX1RPX1JBTkdFKGJ2LCAwLCAyNTUpOworCQl9CisKKwltYWtlX3BpeGVsOgorCQlSR0IyNF9QVVRQSVhFTChmcmFtZSwgaSwgZnJhbWUtPmN1cmxpbmUsIHJ2LCBndiwgYnYpOworCX0KKwkvKgorCSAqIEFjY291bnQgZm9yIG51bWJlciBvZiBieXRlcyB0aGF0IHdlIHdyb3RlIGludG8gb3V0cHV0IFY0TCBmcmFtZS4KKwkgKiBXZSBkbyBpdCBoZXJlLCBhZnRlciB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBzY2FubGluZSwgYmVjYXVzZSB3ZQorCSAqIG1heSBmaWxsIG1vcmUgdGhhbiBvbmUgb3V0cHV0IHNjYW5saW5lIGlmIHdlIGRvIHZlcnRpY2FsCisJICogZW5sYXJnZW1lbnQuCisJICovCisJZnJhbWUtPmN1cmxpbmUgKz0gMjsKKwkqcGNvcHlsZW4gKz0gdjRsX2xpbmVzaXplICogMjsKKwlmcmFtZS0+ZGVpbnRlcmxhY2UgPSBEZWludGVybGFjZV9GaWxsT2RkTGluZXM7CisKKwlpZiAoZnJhbWVfZG9uZSB8fCAoZnJhbWUtPmN1cmxpbmUgPj0gVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpKSkKKwkJcmV0dXJuIHNjYW5fTmV4dEZyYW1lOworCWVsc2UKKwkJcmV0dXJuIHNjYW5fQ29udGludWU7Cit9CisKK3N0YXRpYyBlbnVtIFBhcnNlU3RhdGUgaWJtY2FtX21vZGVsM19wYXJzZV9saW5lcygKKwlzdHJ1Y3QgdXZkICp1dmQsCisJc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSwKKwlsb25nICpwY29weWxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbG9yOworCXVuc2lnbmVkIGludCBsZW47CisJaW50IHY0bF9saW5lc2l6ZTsgLyogVjRMIGxpbmUgb2Zmc2V0ICovCisJY29uc3QgaW50IGh1ZV9jb3JyICA9ICh1dmQtPnZwaWMuaHVlIC0gMHg4MDAwKSA+PiAxMDsJLyogLTMyLi4rMzEgKi8KKwljb25zdCBpbnQgaHVlMl9jb3JyID0gKGh1ZV9jb3JyZWN0aW9uIC0gMTI4KSAvIDQ7CQkvKiAtMzIuLiszMSAqLworCWNvbnN0IGludCBjY20gPSAxMjg7IC8qIENvbG9yIGNvcnJlY3Rpb24gbWVkaWFuIC0gc2VlIGJlbG93ICovCisJaW50IGksIHUsIHYsIHJ3LCBkYXRhX3c9MCwgZGF0YV9oPTAsIGNvbG9yX2NvcnI7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGluZUJ1ZmZlcls2NDAqM107CisKKwljb2xvcl9jb3JyID0gKHV2ZC0+dnBpYy5jb2xvdXIgLSAweDgwMDApID4+IDg7IC8qIC0xMjguLisxMjcgPSAtY2NtLi4rKGNjbS0xKSovCisJUkVTVFJJQ1RfVE9fUkFOR0UoY29sb3JfY29yciwgLWNjbSwgY2NtKzEpOworCisJdjRsX2xpbmVzaXplID0gVklERU9TSVpFX1goZnJhbWUtPnJlcXVlc3QpICogVjRMX0JZVEVTX1BFUl9QSVhFTDsKKworCS8qIFRoZSBoZWFkZXIgdGVsbHMgdXMgd2hhdCBzb3J0IG9mIGRhdGEgaXMgaW4gdGhpcyBmcmFtZSAqLworCXN3aXRjaCAoZnJhbWUtPmhlYWRlcikgeworCQkvKgorCQkgKiBVbmNvbXByZXNzZWQgbW9kZXMgKHRoYXQgYXJlIGVhc3kgdG8gZGVjb2RlKS4KKwkJICovCisJY2FzZSAweDAzMDg6CisJCWRhdGFfdyA9IDY0MDsKKwkJZGF0YV9oID0gNDgwOworCQlicmVhazsKKwljYXNlIDB4MDIwODoKKwkJZGF0YV93ID0gMzIwOworCQlkYXRhX2ggPSAyNDA7CisJCWJyZWFrOworCWNhc2UgMHgwMjBBOgorCQlkYXRhX3cgPSAxNjA7CisJCWRhdGFfaCA9IDEyMDsKKwkJYnJlYWs7CisJCS8qCisJCSAqIENvbXByZXNzZWQgbW9kZXMgKFZpQ0UgLSB0aGF0IEkgZG9uJ3Qga25vdyBob3cgdG8gZGVjb2RlKS4KKwkJICovCisJY2FzZSAweDAzMjg6CS8qIDY0MHg0ODAsIGJlc3QgcXVhbGl0eSBjb21wcmVzc2lvbiAqLworCWNhc2UgMHgwMzY4OgkvKiA2NDB4NDgwLCBiZXN0IGZyYW1lIHJhdGUgY29tcHJlc3Npb24gKi8KKwljYXNlIDB4MDIyODoJLyogMzIweDI0MCwgYmVzdCBxdWFsaXR5IGNvbXByZXNzaW9uICovCisJY2FzZSAweDAyNjg6CS8qIDMyMHgyNDAsIGJlc3QgZnJhbWUgcmF0ZSBjb21wcmVzc2lvbiAqLworCWNhc2UgMHgwMkNBOgkvKiAxNjB4MTIwLCBiZXN0IHF1YWxpdHkgY29tcHJlc3Npb24gKi8KKwljYXNlIDB4MDJFQToJLyogMTYweDEyMCwgYmVzdCBmcmFtZSByYXRlIGNvbXByZXNzaW9uICovCisJCS8qIERvIG5vdGhpbmcgd2l0aCB0aGlzIC0gbm90IHN1cHBvcnRlZCAqLworCQllcnIoIlVuc3VwcG9ydGVkIG1vZGUgJCUwNGx4IiwgZnJhbWUtPmhlYWRlcik7CisJCXJldHVybiBzY2FuX05leHRGcmFtZTsKKwlkZWZhdWx0OgorCQkvKiBDYXRjaCB1bmtub3duIGhlYWRlcnMsIG1heSBoZWxwIGluIGxlYXJuaW5nIG5ldyBoZWFkZXJzICovCisJCWVycigiU3RyYW5nZSBmcmFtZS0+aGVhZGVyPSQlMDhseCIsIGZyYW1lLT5oZWFkZXIpOworCQlyZXR1cm4gc2Nhbl9OZXh0RnJhbWU7CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBvdXIgd3JpdGluZyBpbnRvIG91dHB1dCBidWZmZXIKKwkgKiB3aWxsIG5vdCBleGNlZWQgdGhlIGJ1ZmZlci4gTm90ZSB0aGF0IHdlIG1heSB3cml0ZQorCSAqIG5vdCBpbnRvIGN1cnJlbnQgb3V0cHV0IHNjYW5saW5lIGJ1dCBpbiBzZXZlcmFsIGFmdGVyCisJICogaXQgYXMgd2VsbCAoaWYgd2UgZW5sYXJnZSBpbWFnZSB2ZXJ0aWNhbGx5LikKKwkgKi8KKwlpZiAoKGZyYW1lLT5jdXJsaW5lICsgMSkgPj0gZGF0YV9oKSB7CisJCWlmICh1dmQtPmRlYnVnID49IDMpCisJCQlpbmZvKCJSZWFjaGVkIGxpbmUgJWQuIChmcmFtZSBpcyBkb25lKSIsIGZyYW1lLT5jdXJsaW5lKTsKKwkJcmV0dXJuIHNjYW5fTmV4dEZyYW1lOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBkYXRhIGZvciB0aGUgZW50aXJlIGxpbmUgKi8KKwlsZW4gPSAzICogZGF0YV93OyAvKiA8eS1kYXRhPiA8dXYtZGF0YT4gKi8KKwlhc3NlcnQobGVuIDw9IHNpemVvZihsaW5lQnVmZmVyKSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUncyBlbm91Z2ggZGF0YSBmb3IgdGhlIGVudGlyZSBsaW5lICovCisJaWYgKFJpbmdRdWV1ZV9HZXRMZW5ndGgoJnV2ZC0+ZHApIDwgbGVuKQorCQlyZXR1cm4gc2Nhbl9PdXQ7CisKKwkvKiBTdWNrIG9uZSBsaW5lIG91dCBvZiB0aGUgcmluZyBxdWV1ZSAqLworCVJpbmdRdWV1ZV9EZXF1ZXVlKCZ1dmQtPmRwLCBsaW5lQnVmZmVyLCBsZW4pOworCisJZGF0YSA9IGxpbmVCdWZmZXI7CisJY29sb3IgPSBkYXRhICsgZGF0YV93OwkJLyogUG9pbnQgdG8gd2hlcmUgY29sb3IgcGxhbmVzIGJlZ2luICovCisKKwkvKiBCb3R0b20tdG8tdG9wIHNjYW5uaW5nICovCisJcncgPSAoaW50KVZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KSAtIChpbnQpKGZyYW1lLT5jdXJsaW5lKSAtIDE7CisJUkVTVFJJQ1RfVE9fUkFOR0UocncsIDAsIFZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KS0xKTsKKworCWZvciAoaSA9IDA7IGkgPCBWSURFT1NJWkVfWChmcmFtZS0+cmVxdWVzdCk7IGkrKykgeworCQlpbnQgeSwgcnYsIGd2LCBidjsJLyogUkdCIGNvbXBvbmVudHMgKi8KKworCQlpZiAoaSA8IGRhdGFfdykgeworCQkJeSA9IGRhdGFbaV07CS8qIEx1bWlub3NpdHkgaXMgdGhlIGZpcnN0IGxpbmUgKi8KKworCQkJLyogQXBwbHkgc3RhdGljIGNvbG9yIGNvcnJlY3Rpb24gKi8KKwkJCXUgPSBjb2xvcltpKjJdICsgaHVlX2NvcnI7CisJCQl2ID0gY29sb3JbaSoyICsgMV0gKyBodWUyX2NvcnI7CisKKwkJCS8qIEFwcGx5IGNvbG9yIGNvcnJlY3Rpb24gKi8KKwkJCWlmIChjb2xvcl9jb3JyICE9IDApIHsKKwkJCQkvKiBNYWduaWZ5IHVwIHRvIDIgdGltZXMsIHJlZHVjZSBkb3duIHRvIHplcm8gc2F0dXJhdGlvbiAqLworCQkJCXUgPSAxMjggKyAoKGNjbSArIGNvbG9yX2NvcnIpICogKHUgLSAxMjgpKSAvIGNjbTsKKwkJCQl2ID0gMTI4ICsgKChjY20gKyBjb2xvcl9jb3JyKSAqICh2IC0gMTI4KSkgLyBjY207CisJCQl9CisJCX0gZWxzZQorCQkJeSA9IDAsIHUgPSB2ID0gMTI4OworCisJCVlVVl9UT19SR0JfQllfVEhFX0JPT0soeSwgdSwgdiwgcnYsIGd2LCBidik7CisJCVJHQjI0X1BVVFBJWEVMKGZyYW1lLCBpLCBydywgcnYsIGd2LCBidik7IC8qIERvbmUgYnkgZGVpbnRlcmxhY2luZyBub3cgKi8KKwl9CisJZnJhbWUtPmRlaW50ZXJsYWNlID0gRGVpbnRlcmxhY2VfRmlsbEV2ZW5MaW5lczsKKworCS8qCisJICogQWNjb3VudCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2Ugd3JvdGUgaW50byBvdXRwdXQgVjRMIGZyYW1lLgorCSAqIFdlIGRvIGl0IGhlcmUsIGFmdGVyIHdlIGFyZSBkb25lIHdpdGggdGhlIHNjYW5saW5lLCBiZWNhdXNlIHdlCisJICogbWF5IGZpbGwgbW9yZSB0aGFuIG9uZSBvdXRwdXQgc2NhbmxpbmUgaWYgd2UgZG8gdmVydGljYWwKKwkgKiBlbmxhcmdlbWVudC4KKwkgKi8KKwlmcmFtZS0+Y3VybGluZSArPSAyOworCSpwY29weWxlbiArPSAyICogdjRsX2xpbmVzaXplOworCisJaWYgKGZyYW1lLT5jdXJsaW5lID49IFZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KSkgeworCQlpZiAodXZkLT5kZWJ1ZyA+PSAzKSB7CisJCQlpbmZvKCJBbGwgcmVxdWVzdGVkIGxpbmVzICglbGQuKSBkb25lLiIsCisJCQkgICAgIFZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KSk7CisJCX0KKwkJcmV0dXJuIHNjYW5fTmV4dEZyYW1lOworCX0gZWxzZQorCQlyZXR1cm4gc2Nhbl9Db250aW51ZTsKK30KKworLyoKKyAqIGlibWNhbV9tb2RlbDRfMTI4eDk2X3BhcnNlX2xpbmVzKCkKKyAqCisgKiBUaGlzIGRlY29kZXIgaXMgZm9yIG9uZSBzdHJhbmdlIGRhdGEgZm9ybWF0IHRoYXQgaXMgcHJvZHVjZWQgYnkgTW9kZWwgNAorICogY2FtZXJhIG9ubHkgaW4gMTI4eDk2IG1vZGUuIFRoaXMgaXMgUkdCIGZvcm1hdCBhbmQgaGVyZSBpcyBpdHMgZGVzY3JpcHRpb24uCisgKiBGaXJzdCBvZiBhbGwsIHRoaXMgaXMgbm9uLWludGVybGFjZWQgc3RyZWFtLCBtZWFuaW5nIHRoYXQgYWxsIHNjYW4gbGluZXMKKyAqIGFyZSBwcmVzZW50IGluIHRoZSBkYXRhc3RyZWFtLiBUaGVyZSBhcmUgOTYgY29uc2VjdXRpdmUgYmxvY2tzIG9mIGRhdGEKKyAqIHRoYXQgZGVzY3JpYmUgYWxsIDk2IGxpbmVzIG9mIHRoZSBpbWFnZS4gRWFjaCBibG9jayBpcyA1KjEyOCBieXRlcyBsb25nCisgKiBhbmQgY2FycmllcyBSLCBHLCBCIGNvbXBvbmVudHMuIFRoZSBmb3JtYXQgb2YgdGhlIGJsb2NrIGlzIHNob3duIGluIHRoZQorICogY29kZSBiZWxvdy4gRmlyc3QgMTI4KjIgYnl0ZXMgYXJlIGludGVybGVhdmVkIFIgYW5kIEcgY29tcG9uZW50cy4gVGhlbgorICogd2UgaGF2ZSBhIGdhcCAoanVuayBkYXRhKSA2NCBieXRlcyBsb25nLiBUaGVuIGZvbGxvdyBCIGFuZCBzb21ldGhpbmcKKyAqIGVsc2UsIGFsc28gaW50ZXJsZWF2ZWQgKHRoaXMgbWFrZXMgYW5vdGhlciAxMjgqMiBieXRlcykuIEFmdGVyIHRoYXQKKyAqIHByb2JhYmx5IGFub3RoZXIgNjQgYnl0ZXMgb2YganVuayBmb2xsb3cuCisgKgorICogSGlzdG9yeToKKyAqIDEwLUZlYi0yMDAxIENyZWF0ZWQuCisgKi8KK3N0YXRpYyBlbnVtIFBhcnNlU3RhdGUgaWJtY2FtX21vZGVsNF8xMjh4OTZfcGFyc2VfbGluZXMoCisJc3RydWN0IHV2ZCAqdXZkLAorCXN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWUsCisJbG9uZyAqcGNvcHlsZW4pCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YV9ydiwgKmRhdGFfZ3YsICpkYXRhX2J2OworCXVuc2lnbmVkIGludCBsZW47CisJaW50IGksIHY0bF9saW5lc2l6ZTsgLyogVjRMIGxpbmUgb2Zmc2V0ICovCisJY29uc3QgaW50IGRhdGFfdz0xMjgsIGRhdGFfaD05NjsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBsaW5lQnVmZmVyWzEyOCo1XTsKKworCXY0bF9saW5lc2l6ZSA9IFZJREVPU0laRV9YKGZyYW1lLT5yZXF1ZXN0KSAqIFY0TF9CWVRFU19QRVJfUElYRUw7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IG91ciB3cml0aW5nIGludG8gb3V0cHV0IGJ1ZmZlcgorCSAqIHdpbGwgbm90IGV4Y2VlZCB0aGUgYnVmZmVyLiBOb3RlIHRoYXQgd2UgbWF5IHdyaXRlCisJICogbm90IGludG8gY3VycmVudCBvdXRwdXQgc2NhbmxpbmUgYnV0IGluIHNldmVyYWwgYWZ0ZXIKKwkgKiBpdCBhcyB3ZWxsIChpZiB3ZSBlbmxhcmdlIGltYWdlIHZlcnRpY2FsbHkuKQorCSAqLworCWlmICgoZnJhbWUtPmN1cmxpbmUgKyAxKSA+PSBkYXRhX2gpIHsKKwkJaWYgKHV2ZC0+ZGVidWcgPj0gMykKKwkJCWluZm8oIlJlYWNoZWQgbGluZSAlZC4gKGZyYW1lIGlzIGRvbmUpIiwgZnJhbWUtPmN1cmxpbmUpOworCQlyZXR1cm4gc2Nhbl9OZXh0RnJhbWU7CisJfQorCisJLyoKKwkgKiBSR1JHUkcgLi4uLiBSR1JHX19fX19fX19fX19fX0I/Qj9CPyAuLi4gQj9CP19fX19fX19fX19fXworCSAqIDwtLS0tIDEyOCoyIC0tLT48LS0tLSA2NCAtLS0+PC0tLSAxMjgqMiAtLS0+PC0tLSA2NCAtLS0+CisJICovCisKKwkvKiBNYWtlIHN1cmUgdGhlcmUncyBlbm91Z2ggZGF0YSBmb3IgdGhlIGVudGlyZSBsaW5lICovCisJbGVuID0gNSAqIGRhdGFfdzsKKwlhc3NlcnQobGVuIDw9IHNpemVvZihsaW5lQnVmZmVyKSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUncyBlbm91Z2ggZGF0YSBmb3IgdGhlIGVudGlyZSBsaW5lICovCisJaWYgKFJpbmdRdWV1ZV9HZXRMZW5ndGgoJnV2ZC0+ZHApIDwgbGVuKQorCQlyZXR1cm4gc2Nhbl9PdXQ7CisKKwkvKiBTdWNrIG9uZSBsaW5lIG91dCBvZiB0aGUgcmluZyBxdWV1ZSAqLworCVJpbmdRdWV1ZV9EZXF1ZXVlKCZ1dmQtPmRwLCBsaW5lQnVmZmVyLCBsZW4pOworCisJZGF0YV9ydiA9IGxpbmVCdWZmZXI7CisJZGF0YV9ndiA9IGxpbmVCdWZmZXIgKyAxOworCWRhdGFfYnYgPSBsaW5lQnVmZmVyICsgZGF0YV93KjIgKyBkYXRhX3cvMjsKKwlmb3IgKGkgPSAwOyBpIDwgVklERU9TSVpFX1goZnJhbWUtPnJlcXVlc3QpOyBpKyspIHsKKwkJaW50IHJ2LCBndiwgYnY7CS8qIFJHQiBjb21wb25lbnRzICovCisJCWlmIChpIDwgZGF0YV93KSB7CisJCQljb25zdCBpbnQgaiA9IGkgKiAyOworCQkJZ3YgPSBkYXRhX3J2W2pdOworCQkJcnYgPSBkYXRhX2d2W2pdOworCQkJYnYgPSBkYXRhX2J2W2pdOworCQkJaWYgKGZsYWdzICYgRkxBR1NfTU9OT0NIUk9NRSkgeworCQkJCXVuc2lnbmVkIGxvbmcgeTsKKwkJCQl5ID0gcnYgKyBndiArIGJ2OworCQkJCXkgLz0gMzsKKwkJCQlpZiAoeSA+IDB4RkYpCisJCQkJCXkgPSAweEZGOworCQkJCXJ2ID0gZ3YgPSBidiA9ICh1bnNpZ25lZCBjaGFyKSB5OworCQkJfQorCQl9IGVsc2UgeworCQkJcnYgPSBndiA9IGJ2ID0gMDsKKwkJfQorCQlSR0IyNF9QVVRQSVhFTChmcmFtZSwgaSwgZnJhbWUtPmN1cmxpbmUsIHJ2LCBndiwgYnYpOworCX0KKwlmcmFtZS0+ZGVpbnRlcmxhY2UgPSBEZWludGVybGFjZV9Ob25lOworCWZyYW1lLT5jdXJsaW5lKys7CisJKnBjb3B5bGVuICs9IHY0bF9saW5lc2l6ZTsKKworCWlmIChmcmFtZS0+Y3VybGluZSA+PSBWSURFT1NJWkVfWShmcmFtZS0+cmVxdWVzdCkpIHsKKwkJaWYgKHV2ZC0+ZGVidWcgPj0gMykgeworCQkJaW5mbygiQWxsIHJlcXVlc3RlZCBsaW5lcyAoJWxkLikgZG9uZS4iLAorCQkJICAgICBWSURFT1NJWkVfWShmcmFtZS0+cmVxdWVzdCkpOworCQl9CisJCXJldHVybiBzY2FuX05leHRGcmFtZTsKKwl9IGVsc2UKKwkJcmV0dXJuIHNjYW5fQ29udGludWU7Cit9CisKKy8qCisgKiBpYm1jYW1fUHJvY2Vzc0lzb2NEYXRhKCkKKyAqCisgKiBHZW5lcmljIHJvdXRpbmUgdG8gcGFyc2UgdGhlIHJpbmcgcXVldWUgZGF0YS4gSXQgZW1wbG95cyBlaXRoZXIKKyAqIGlibWNhbV9maW5kX2hlYWRlcigpIG9yIGlibWNhbV9wYXJzZV9saW5lcygpIHRvIGRvIG1vc3QKKyAqIG9mIHdvcmsuCisgKgorICogSGlzdG9yeToKKyAqIDEvMjEvMDAgIENyZWF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGlibWNhbV9Qcm9jZXNzSXNvY0RhdGEoc3RydWN0IHV2ZCAqdXZkLAorCQkJCSAgIHN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWUpCit7CisJZW51bSBQYXJzZVN0YXRlIG5ld3N0YXRlOworCWxvbmcgY29weWxlbiA9IDA7CisJaW50IG1vZCA9IElCTUNBTV9UKHV2ZCktPmNhbWVyYV9tb2RlbDsKKworCXdoaWxlICgxKSB7CisJCW5ld3N0YXRlID0gc2Nhbl9PdXQ7CisJCWlmIChSaW5nUXVldWVfR2V0TGVuZ3RoKCZ1dmQtPmRwKSA+IDApIHsKKwkJCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNjYW5TdGF0ZV9TY2FubmluZykgeworCQkJCW5ld3N0YXRlID0gaWJtY2FtX2ZpbmRfaGVhZGVyKHV2ZCk7CisJCQl9IGVsc2UgaWYgKGZyYW1lLT5zY2Fuc3RhdGUgPT0gU2NhblN0YXRlX0xpbmVzKSB7CisJCQkJaWYgKChtb2QgPT0gSUJNQ0FNX01PREVMXzIpICYmCisJCQkJICAgICgodXZkLT52aWRlb3NpemUgPT0gVklERU9TSVpFXzM1MngyODgpIHx8CisJCQkJICAgICAodXZkLT52aWRlb3NpemUgPT0gVklERU9TSVpFXzMyMHgyNDApIHx8CisJCQkJICAgICAodXZkLT52aWRlb3NpemUgPT0gVklERU9TSVpFXzM1MngyNDApKSkKKwkJCQl7CisJCQkJCW5ld3N0YXRlID0gaWJtY2FtX21vZGVsMl8zMjB4MjQwX3BhcnNlX2xpbmVzKAorCQkJCQkJdXZkLCBmcmFtZSwgJmNvcHlsZW4pOworCQkJCX0gZWxzZSBpZiAobW9kID09IElCTUNBTV9NT0RFTF80KSB7CisJCQkJCS8qCisJCQkJCSAqIE1vZGVsIDQgY2FtZXJhcyAoSUJNIE5ldENhbWVyYSkgdXNlIE1vZGVsIDIgZGVjb2RlciAoUkdCKQorCQkJCQkgKiBmb3IgMzIweDI0MCBhbmQgYWJvdmU7IDE2MHgxMjAgYW5kIDE3NngxNDQgdXNlcyBNb2RlbCAxCisJCQkJCSAqIGRlY29kZXIgKFlVViksIGFuZCAxMjh4OTYgbW9kZSB1c2VzID8/PworCQkJCQkgKi8KKwkJCQkJaWYgKCh1dmQtPnZpZGVvc2l6ZSA9PSBWSURFT1NJWkVfMzUyeDI4OCkgfHwKKwkJCQkJICAgICh1dmQtPnZpZGVvc2l6ZSA9PSBWSURFT1NJWkVfMzIweDI0MCkgfHwKKwkJCQkJICAgICh1dmQtPnZpZGVvc2l6ZSA9PSBWSURFT1NJWkVfMzUyeDI0MCkpCisJCQkJCXsKKwkJCQkJCW5ld3N0YXRlID0gaWJtY2FtX21vZGVsMl8zMjB4MjQwX3BhcnNlX2xpbmVzKHV2ZCwgZnJhbWUsICZjb3B5bGVuKTsKKwkJCQkJfSBlbHNlIGlmICh1dmQtPnZpZGVvc2l6ZSA9PSBWSURFT1NJWkVfMTI4eDk2KSB7CisJCQkJCQluZXdzdGF0ZSA9IGlibWNhbV9tb2RlbDRfMTI4eDk2X3BhcnNlX2xpbmVzKHV2ZCwgZnJhbWUsICZjb3B5bGVuKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5ld3N0YXRlID0gaWJtY2FtX3BhcnNlX2xpbmVzKHV2ZCwgZnJhbWUsICZjb3B5bGVuKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAobW9kID09IElCTUNBTV9NT0RFTF8zKSB7CisJCQkJCW5ld3N0YXRlID0gaWJtY2FtX21vZGVsM19wYXJzZV9saW5lcyh1dmQsIGZyYW1lLCAmY29weWxlbik7CisJCQkJfSBlbHNlIHsKKwkJCQkJbmV3c3RhdGUgPSBpYm1jYW1fcGFyc2VfbGluZXModXZkLCBmcmFtZSwgJmNvcHlsZW4pOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobmV3c3RhdGUgPT0gc2Nhbl9Db250aW51ZSkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmICgobmV3c3RhdGUgPT0gc2Nhbl9OZXh0RnJhbWUpIHx8IChuZXdzdGF0ZSA9PSBzY2FuX091dCkpCisJCQlicmVhazsKKwkJZWxzZQorCQkJcmV0dXJuOyAvKiBzY2FuX0VuZFBhcnNlICovCisJfQorCisJaWYgKG5ld3N0YXRlID09IHNjYW5fTmV4dEZyYW1lKSB7CisJCWZyYW1lLT5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9Eb25lOworCQl1dmQtPmN1cmZyYW1lID0gLTE7CisJCXV2ZC0+c3RhdHMuZnJhbWVfbnVtKys7CisJCWlmICgobW9kID09IElCTUNBTV9NT0RFTF8yKSB8fCAobW9kID09IElCTUNBTV9NT0RFTF80KSkgeworCQkJLyogTmVlZCBzb2Z0d2FyZSBjb250cmFzdCBhZGp1c3RtZW50IGZvciB0aG9zZSBjYW1lcmFzICovCisJCQlmcmFtZS0+ZmxhZ3MgfD0gVVNCVklERU9fRlJBTUVfRkxBR19TT0ZUV0FSRV9DT05UUkFTVDsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSB0aGUgZnJhbWUncyB1bmNvbXByZXNzZWQgbGVuZ3RoLiAqLworCWZyYW1lLT5zZXFSZWFkX0xlbmd0aCArPSBjb3B5bGVuOworCisjaWYgMAorCXsKKwkJc3RhdGljIHVuc2lnbmVkIGNoYXIgaj0wOworCQltZW1zZXQoZnJhbWUtPmRhdGEsIGorKywgdXZkLT5tYXhfZnJhbWVfc2l6ZSk7CisJCWZyYW1lLT5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9SZWFkeTsKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIGlibWNhbV92ZWlvKCkKKyAqCisgKiBIaXN0b3J5OgorICogMS8yNy8wMCAgQWRkZWQgY2hlY2sgZm9yIGRldiA9PSBOVUxMOyB0aGlzIGhhcHBlbnMgaWYgY2FtZXJhIGlzIHVucGx1Z2dlZC4KKyAqLworc3RhdGljIGludCBpYm1jYW1fdmVpbygKKwlzdHJ1Y3QgdXZkICp1dmQsCisJdW5zaWduZWQgY2hhciByZXEsCisJdW5zaWduZWQgc2hvcnQgdmFsdWUsCisJdW5zaWduZWQgc2hvcnQgaW5kZXgpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gImlibWNhbV92ZWlvIjsKKwl1bnNpZ25lZCBjaGFyIGNwWzhdIC8qID0geyAweGRlLCAweGFkLCAweGJlLCAweGVmLCAweGRlLCAweGFkLCAweGJlLCAweGVmIH0gKi87CisJaW50IGk7CisKKwlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpKQorCQlyZXR1cm4gMDsKKworCWlmIChyZXEgPT0gMSkgeworCQlpID0gdXNiX2NvbnRyb2xfbXNnKAorCQkJdXZkLT5kZXYsCisJCQl1c2JfcmN2Y3RybHBpcGUodXZkLT5kZXYsIDApLAorCQkJcmVxLAorCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9FTkRQT0lOVCwKKwkJCXZhbHVlLAorCQkJaW5kZXgsCisJCQljcCwKKwkJCXNpemVvZihjcCksCisJCQkxMDAwKTsKKyNpZiAwCisJCWluZm8oIlVTQiA9PiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAgICAiKHJlcT0kJTAyeCB2YWw9JCUwNHggaW5kPSQlMDR4KSIsCisJCSAgICAgICBjcFswXSxjcFsxXSxjcFsyXSxjcFszXSxjcFs0XSxjcFs1XSxjcFs2XSxjcFs3XSwKKwkJICAgICAgIHJlcSwgdmFsdWUsIGluZGV4KTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWkgPSB1c2JfY29udHJvbF9tc2coCisJCQl1dmQtPmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1dmQtPmRldiwgMCksCisJCQlyZXEsCisJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9FTkRQT0lOVCwKKwkJCXZhbHVlLAorCQkJaW5kZXgsCisJCQlOVUxMLAorCQkJMCwKKwkJCTEwMDApOworCX0KKwlpZiAoaSA8IDApIHsKKwkJZXJyKCIlczogRVJST1I9JWQuIENhbWVyYSBzdG9wcGVkOyBSZWNvbm5lY3Qgb3IgcmVsb2FkIGRyaXZlci4iLAorCQkgICAgcHJvYywgaSk7CisJCXV2ZC0+bGFzdF9lcnJvciA9IGk7CisJfQorCXJldHVybiBpOworfQorCisvKgorICogaWJtY2FtX2NhbGN1bGF0ZV9mcHMoKQorICoKKyAqIFRoaXMgcHJvY2VkdXJlIHJvdWdobHkgY2FsY3VsYXRlcyB0aGUgcmVhbCBmcmFtZSByYXRlIGJhc2VkCisgKiBvbiBGUFMgY29kZSAoZnJhbWVyYXRlPU5OTiBvcHRpb24pLiBBY3R1YWwgRlBTIGRpZmZlcnMKKyAqIHNsaWdodGx5IGRlcGVuZGluZyBvbiBsaWdodGluZyBjb25kaXRpb25zLCBzbyB0aGF0IGFjdHVhbCBmcmFtZQorICogcmF0ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjYW1lcmEuIFNpbmNlIEkgZG9uJ3Qga25vdyBob3cgdG8gYXNrCisgKiB0aGUgY2FtZXJhIHdoYXQgRlBTIGlzIG5vdyBJIGhhdmUgdG8gdXNlIHRoZSBGUFMgY29kZSBpbnN0ZWFkLgorICoKKyAqIFRoZSBGUFMgY29kZSBpcyBpbiByYW5nZSBbMC4uNl0sIDAgaXMgc2xvd2VzdCwgNiBpcyBmYXN0ZXN0LgorICogQ29ycmVzcG9uZGluZyByZWFsIEZQUyBzaG91bGQgYmUgaW4gcmFuZ2UgWzMuLjMwXSBmcmFtZXMgcGVyIHNlY29uZC4KKyAqIFRoZSBjb252ZXJzaW9uIGZvcm11bGEgaXMgb2J2aW91czoKKyAqCisgKiByZWFsX2ZwcyA9IDMgKyAoZnBzX2NvZGUgKiA0LjUpCisgKgorICogSGlzdG9yeToKKyAqIDEvMTgvMDAgIENyZWF0ZWQuCisgKi8KK3N0YXRpYyBpbnQgaWJtY2FtX2NhbGN1bGF0ZV9mcHMoc3RydWN0IHV2ZCAqdXZkKQoreworCXJldHVybiAzICsgZnJhbWVyYXRlKjQgKyBmcmFtZXJhdGUvMjsKK30KKworLyoKKyAqIGlibWNhbV9zZW5kX0ZGXzA0XzAyKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBzZW5kcyBtYWdpYyAzLWNvbW1hbmQgcHJlZml4IHRvIHRoZSBjYW1lcmEuCisgKiBUaGUgcHVycG9zZSBvZiB0aGlzIHByZWZpeCBpcyBub3Qga25vd24uCisgKgorICogSGlzdG9yeToKKyAqIDEvMi8wMCAgIENyZWF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGlibWNhbV9zZW5kX0ZGXzA0XzAyKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBGRiwgMHgwMTI3KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwNCwgMHgwMTI0KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMiwgMHgwMTI0KTsKK30KKworc3RhdGljIHZvaWQgaWJtY2FtX3NlbmRfMDBfMDRfMDYoc3RydWN0IHV2ZCAqdXZkKQoreworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMjcpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA0LCAweDAxMjQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA2LCAweDAxMjQpOworfQorCitzdGF0aWMgdm9pZCBpYm1jYW1fc2VuZF94XzAwKHN0cnVjdCB1dmQgKnV2ZCwgdW5zaWduZWQgc2hvcnQgeCkKK3sKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIHgsICAgICAgMHgwMTI3KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI0KTsKK30KKworc3RhdGljIHZvaWQgaWJtY2FtX3NlbmRfeF8wMF8wNShzdHJ1Y3QgdXZkICp1dmQsIHVuc2lnbmVkIHNob3J0IHgpCit7CisJaWJtY2FtX3NlbmRfeF8wMCh1dmQsIHgpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA1LCAweDAxMjQpOworfQorCitzdGF0aWMgdm9pZCBpYm1jYW1fc2VuZF94XzAwXzA1XzAyKHN0cnVjdCB1dmQgKnV2ZCwgdW5zaWduZWQgc2hvcnQgeCkKK3sKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIHgsICAgICAgMHgwMTI3KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI0KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwNSwgMHgwMTI0KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMiwgMHgwMTI0KTsKK30KKworc3RhdGljIHZvaWQgaWJtY2FtX3NlbmRfeF8wMV8wMF8wNShzdHJ1Y3QgdXZkICp1dmQsIHVuc2lnbmVkIHNob3J0IHgpCit7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCB4LCAgICAgIDB4MDEyNyk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDEsIDB4MDEyNCk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyNCk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDUsIDB4MDEyNCk7Cit9CisKK3N0YXRpYyB2b2lkIGlibWNhbV9zZW5kX3hfMDBfMDVfMDJfMDEoc3RydWN0IHV2ZCAqdXZkLCB1bnNpZ25lZCBzaG9ydCB4KQoreworCWlibWNhbV92ZWlvKHV2ZCwgMCwgeCwgICAgICAweDAxMjcpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMjQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA1LCAweDAxMjQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAyLCAweDAxMjQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMjQpOworfQorCitzdGF0aWMgdm9pZCBpYm1jYW1fc2VuZF94XzAwXzA1XzAyXzA4XzAxKHN0cnVjdCB1dmQgKnV2ZCwgdW5zaWduZWQgc2hvcnQgeCkKK3sKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIHgsICAgICAgMHgwMTI3KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI0KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwNSwgMHgwMTI0KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMiwgMHgwMTI0KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwOCwgMHgwMTI0KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMSwgMHgwMTI0KTsKK30KKworc3RhdGljIHZvaWQgaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHN0cnVjdCB1dmQgKnV2ZCwgdW5zaWduZWQgY2hhciBma2V5LCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlpYm1jYW1fc2VuZF94XzAxXzAwXzA1KHV2ZCwgdW5rbm93bl84OCk7CisJaWJtY2FtX3NlbmRfeF8wMF8wNSh1dmQsIGZrZXkpOworCWlibWNhbV9zZW5kX3hfMDBfMDVfMDJfMDhfMDEodXZkLCB2YWwpOworCWlibWNhbV9zZW5kX3hfMDBfMDUodXZkLCB1bmtub3duXzg4KTsKKwlpYm1jYW1fc2VuZF94XzAwXzA1XzAyXzAxKHV2ZCwgZmtleSk7CisJaWJtY2FtX3NlbmRfeF8wMF8wNSh1dmQsIHVua25vd25fODkpOworCWlibWNhbV9zZW5kX3hfMDAodXZkLCBma2V5KTsKKwlpYm1jYW1fc2VuZF8wMF8wNF8wNih1dmQpOworCWlibWNhbV92ZWlvKHV2ZCwgMSwgMHgwMDAwLCAweDAxMjYpOworCWlibWNhbV9zZW5kX0ZGXzA0XzAyKHV2ZCk7Cit9CisKK3N0YXRpYyB2b2lkIGlibWNhbV9QYWNrZXRGb3JtYXQyKHN0cnVjdCB1dmQgKnV2ZCwgdW5zaWduZWQgY2hhciBma2V5LCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlpYm1jYW1fc2VuZF94XzAxXzAwXzA1CSh1dmQsIHVua25vd25fODgpOworCWlibWNhbV9zZW5kX3hfMDBfMDUJKHV2ZCwgZmtleSk7CisJaWJtY2FtX3NlbmRfeF8wMF8wNV8wMgkodXZkLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBpYm1jYW1fbW9kZWwyX1BhY2tldDIoc3RydWN0IHV2ZCAqdXZkKQoreworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGZmLCAweDAxMmQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZWEzLCAweDAxMjQpOworfQorCitzdGF0aWMgdm9pZCBpYm1jYW1fbW9kZWwyX1BhY2tldDEoc3RydWN0IHV2ZCAqdXZkLCB1bnNpZ25lZCBzaG9ydCB2MSwgdW5zaWduZWQgc2hvcnQgdjIpCit7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZmYsIDB4MDEyZSk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCB2MSwgICAgIDB4MDEyZik7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZmYsIDB4MDEzMCk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGM3MTksIDB4MDEyNCk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCB2MiwgICAgIDB4MDEyNyk7CisKKwlpYm1jYW1fbW9kZWwyX1BhY2tldDIodXZkKTsKK30KKworLyoKKyAqIGlibWNhbV9tb2RlbDNfUGFja2V0MSgpCisgKgorICogMDBfMDA3OF8wMTJkCQorICogMDBfMDA5N18wMTJmCisgKiAwMF9kMTQxXzAxMjQJCisgKiAwMF8wMDk2XzAxMjcKKyAqIDAwX2ZlYThfMDEyNAkKKyovCitzdGF0aWMgdm9pZCBpYm1jYW1fbW9kZWwzX1BhY2tldDEoc3RydWN0IHV2ZCAqdXZkLCB1bnNpZ25lZCBzaG9ydCB2MSwgdW5zaWduZWQgc2hvcnQgdjIpCit7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNzgsIDB4MDEyZCk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCB2MSwgICAgIDB4MDEyZik7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCB2MiwgICAgIDB4MDEyNyk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZlYTgsIDB4MDEyNCk7Cit9CisKK3N0YXRpYyB2b2lkIGlibWNhbV9tb2RlbDRfQnJpZ2h0bmVzc1BhY2tldChzdHJ1Y3QgdXZkICp1dmQsIGludCBpKQoreworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDI2LCAweDAxMmYpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgaSwgICAgICAweDAxMjcpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMzApOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4MmE4LCAweDAxMjQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDM4LCAweDAxMmQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA0LCAweDAxMmYpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQ1LCAweDAxMjQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZmZhLCAweDAxMjQpOworfQorCisvKgorICogaWJtY2FtX2FkanVzdF9jb250cmFzdCgpCisgKgorICogVGhlIGNvbnRyYXN0IHZhbHVlIGNoYW5nZXMgZnJvbSAwIChoaWdoIGNvbnRyYXN0KSB0byAxNSAobG93IGNvbnRyYXN0KS4KKyAqIFRoaXMgaXMgaW4gcmV2ZXJzZSB0byB1c3VhbCBvcmRlciBvZiB0aGluZ3MgKHN1Y2ggYXMgVFYgY29udHJvbHMpLCBzbworICogd2UgcmV2ZXJzZSBpdCBhZ2FpbiBoZXJlLgorICoKKyAqIFRPRE86IHdlIHByb2JhYmx5IGRvbid0IG5lZWQgdG8gc2VuZCB0aGUgc2V0dXAgNSB0aW1lcy4uLgorICoKKyAqIEhpc3Rvcnk6CisgKiAxLzIvMDAgICBDcmVhdGVkLgorICovCitzdGF0aWMgdm9pZCBpYm1jYW1fYWRqdXN0X2NvbnRyYXN0KHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGFfY29udHJhc3QgPSB1dmQtPnZwaWMuY29udHJhc3QgPj4gMTI7CisJdW5zaWduZWQgY2hhciBuZXdfY29udHJhc3Q7CisKKwlpZiAoYV9jb250cmFzdCA+PSAxNikKKwkJYV9jb250cmFzdCA9IDE1OworCW5ld19jb250cmFzdCA9IDE1IC0gYV9jb250cmFzdDsKKwlpZiAobmV3X2NvbnRyYXN0ID09IHV2ZC0+dnBpY19vbGQuY29udHJhc3QpCisJCXJldHVybjsKKwl1dmQtPnZwaWNfb2xkLmNvbnRyYXN0ID0gbmV3X2NvbnRyYXN0OworCXN3aXRjaCAoSUJNQ0FNX1QodXZkKS0+Y2FtZXJhX21vZGVsKSB7CisJY2FzZSBJQk1DQU1fTU9ERUxfMToKKwl7CisJCWNvbnN0IGludCBudHJpZXMgPSA1OworCQlpbnQgaTsKKwkJZm9yIChpPTA7IGkgPCBudHJpZXM7IGkrKykgeworCQkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgY29udHJhc3RfMTQsIG5ld19jb250cmFzdCk7CisJCQlpYm1jYW1fc2VuZF9GRl8wNF8wMih1dmQpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIElCTUNBTV9NT0RFTF8yOgorCWNhc2UgSUJNQ0FNX01PREVMXzQ6CisJCS8qIE1vZGVscyAyLCA0IGRvIG5vdCBoYXZlIHRoaXMgY29udHJvbDsgaW1wbGVtZW50ZWQgaW4gc29mdHdhcmUuICovCisJCWJyZWFrOworCWNhc2UgSUJNQ0FNX01PREVMXzM6CisJewkvKiBQcmVzZXQgaGFyZHdhcmUgdmFsdWVzICovCisJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQkJdW5zaWduZWQgc2hvcnQgY3YxOworCQkJdW5zaWduZWQgc2hvcnQgY3YyOworCQkJdW5zaWduZWQgc2hvcnQgY3YzOworCQl9IGN2WzddID0geworCQkJeyAweDA1LCAweDA1LCAweDBmIH0sCS8qIE1pbmltdW0gKi8KKwkJCXsgMHgwNCwgMHgwNCwgMHgxNiB9LAorCQkJeyAweDAyLCAweDAzLCAweDE2IH0sCisJCQl7IDB4MDIsIDB4MDgsIDB4MTYgfSwKKwkJCXsgMHgwMSwgMHgwYywgMHgxNiB9LAorCQkJeyAweDAxLCAweDBlLCAweDE2IH0sCisJCQl7IDB4MDEsIDB4MTAsIDB4MTYgfQkvKiBNYXhpbXVtICovCisJCX07CisJCWludCBpID0gYV9jb250cmFzdCAvIDI7CisJCVJFU1RSSUNUX1RPX1JBTkdFKGksIDAsIDYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTBjKTsJLyogU3RvcCAqLworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNjcsIGN2W2ldLmN2MSk7CisJCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA1YiwgY3ZbaV0uY3YyKTsKKwkJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDVjLCBjdltpXS5jdjMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMSwgMHgwMTE0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYzAsIDB4MDEwYyk7CS8qIEdvISAqLworCQl1c2JfY2xlYXJfaGFsdCh1dmQtPmRldiwgdXNiX3Jjdmlzb2NwaXBlKHV2ZC0+ZGV2LCB1dmQtPnZpZGVvX2VuZHApKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIGlibWNhbV9jaGFuZ2VfbGlnaHRpbmdfY29uZGl0aW9ucygpCisgKgorICogQ2FtZXJhIG1vZGVsIDE6CisgKiBXZSBoYXZlIDMgbGV2ZWxzIG9mIGxpZ2h0aW5nIGNvbmRpdGlvbnM6IDA9QnJpZ2h0LCAxPU1lZGl1bSwgMj1Mb3cuCisgKgorICogQ2FtZXJhIG1vZGVsIDI6CisgKiBXZSBoYXZlIDE2IGxldmVscyBvZiBsaWdodGluZywgMCBmb3IgYnJpZ2h0IGxpZ2h0IGFuZCB1cCB0byAxNSBmb3IKKyAqIGxvdyBsaWdodC4gQnV0IHZhbHVlcyBhYm92ZSA1IG9yIHNvIGFyZSB1c2VsZXNzIGJlY2F1c2UgY2FtZXJhIGlzCisgKiBub3QgcmVhbGx5IGNhcGFibGUgdG8gcHJvZHVjZSBhbnl0aGluZyB3b3J0aCB2aWV3aW5nIGF0IHN1Y2ggbGlnaHQuCisgKiBUaGlzIHNldHRpbmcgbWF5IGJlIGFsdGVyZWQgb25seSBpbiBjZXJ0YWluIGNhbWVyYSBzdGF0ZS4KKyAqCisgKiBMb3cgbGlnaHRpbmcgZm9yY2VzIHNsb3dlciBGUFMuIExpZ2h0aW5nIGlzIHNldCBhcyBhIG1vZHVsZSBwYXJhbWV0ZXIuCisgKgorICogSGlzdG9yeToKKyAqIDEvNS8wMCAgIENyZWF0ZWQuCisgKiAyLzIwLzAwICBBZGRlZCBzdXBwb3J0IGZvciBNb2RlbCAyIGNhbWVyYXMuCisgKi8KK3N0YXRpYyB2b2lkIGlibWNhbV9jaGFuZ2VfbGlnaHRpbmdfY29uZGl0aW9ucyhzdHJ1Y3QgdXZkICp1dmQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gImlibWNhbV9jaGFuZ2VfbGlnaHRpbmdfY29uZGl0aW9ucyI7CisKKwlpZiAoZGVidWcgPiAwKQorCQlpbmZvKCIlczogU2V0IGxpZ2h0aW5nIHRvICVodS4iLCBwcm9jLCBsaWdodGluZyk7CisKKwlzd2l0Y2ggKElCTUNBTV9UKHV2ZCktPmNhbWVyYV9tb2RlbCkgeworCWNhc2UgSUJNQ0FNX01PREVMXzE6CisJeworCQljb25zdCBpbnQgbnRyaWVzID0gNTsKKwkJaW50IGk7CisJCWZvciAoaT0wOyBpIDwgbnRyaWVzOyBpKyspCisJCQlpYm1jYW1fUGFja2V0X0Zvcm1hdDEodXZkLCBsaWdodF8yNywgKHVuc2lnbmVkIHNob3J0KSBsaWdodGluZyk7CisJCWJyZWFrOworCX0KKwljYXNlIElCTUNBTV9NT0RFTF8yOgorI2lmIDAKKwkJLyoKKwkJICogVGhpcyBjb21tYW5kIGFwcGFyZW50bHkgcmVxdWlyZXMgY2FtZXJhIHRvIGJlIHN0b3BwZWQuIE15CisJCSAqIGV4cGVyaW1lbnRzIHNob3dlZCB0aGF0IGl0IC1pcy0gcG9zc2libGUgdG8gYWx0ZXIgdGhlIGxpZ2h0aW5nCisJCSAqIGNvbmRpdGlvbnMgc2V0dGluZyAib24gdGhlIGZseSIsIGJ1dCB3aHkgYm90aGVyPyBUaGlzIHNldHRpbmcgZG9lcworCQkgKiBub3Qgd29yayByZWxpYWJseSBpbiBhbGwgY2FzZXMsIHNvIEkgZGVjaWRlZCBzaW1wbHkgdG8gbGVhdmUgdGhlCisJCSAqIHNldHRpbmcgd2hlcmUgWGlybGluayBwdXQgaXQgLSBpbiB0aGUgY2FtZXJhIHNldHVwIHBoYXNlLiBUaGlzIGNvZGUKKwkJICogaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIGl0IGRvZXMgbm90IHdvcmsgYXQgLWFueS0gbW9tZW50LCBzbyBpdHMKKwkJICogcHJlc2VuY2UgbWFrZXMgbm8gc2Vuc2UuIFlvdSBtYXkgdXNlIGl0IGZvciBleHBlcmltZW50cy4KKwkJICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMGMpOwkvKiBTdG9wIGNhbWVyYSAqLworCQlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCBtb2QyX3NlbnNpdGl2aXR5LCBsaWdodGluZyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGMwLCAweDAxMGMpOwkvKiBTdGFydCBjYW1lcmEgKi8KKyNlbmRpZgorCQlicmVhazsKKwljYXNlIElCTUNBTV9NT0RFTF8zOgorCWNhc2UgSUJNQ0FNX01PREVMXzQ6CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogaWJtY2FtX3NldF9zaGFycG5lc3MoKQorICoKKyAqIENhbWVyYXMgbW9kZWwgMSBoYXZlIGludGVybmFsIHNtb290aGluZyBmZWF0dXJlLiBJdCBpcyBjb250cm9sbGVkIGJ5IHZhbHVlIGluCisgKiByYW5nZSBbMC4uNl0sIHdoZXJlIDAgaXMgbW9zdCBzbW9vdGggYW5kIDYgaXMgbW9zdCBzaGFycCAocmF3IGltYWdlLCBJIGd1ZXNzKS4KKyAqIFJlY29tbWVuZGVkIHZhbHVlIGlzIDQuIENhbWVyYXMgbW9kZWwgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUgYXQgYWxsLgorICovCitzdGF0aWMgdm9pZCBpYm1jYW1fc2V0X3NoYXJwbmVzcyhzdHJ1Y3QgdXZkICp1dmQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gImlibWNhbV9zZXRfc2hhcnBuZXNzIjsKKworCXN3aXRjaCAoSUJNQ0FNX1QodXZkKS0+Y2FtZXJhX21vZGVsKSB7CisJY2FzZSBJQk1DQU1fTU9ERUxfMToKKwl7CisJCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzYVtdID0geyAweDExLCAweDEzLCAweDE2LCAweDE4LCAweDFhLCAweDgsIDB4MGEgfTsKKwkJdW5zaWduZWQgc2hvcnQgaSwgc3Y7CisKKwkJUkVTVFJJQ1RfVE9fUkFOR0Uoc2hhcnBuZXNzLCBTSEFSUE5FU1NfTUlOLCBTSEFSUE5FU1NfTUFYKTsKKwkJaWYgKGRlYnVnID4gMCkKKwkJCWluZm8oIiVzOiBTZXQgc2hhcnBuZXNzIHRvICVodS4iLCBwcm9jLCBzaGFycG5lc3MpOworCisJCXN2ID0gc2Fbc2hhcnBuZXNzIC0gU0hBUlBORVNTX01JTl07CisJCWZvciAoaT0wOyBpIDwgMjsgaSsrKSB7CisJCQlpYm1jYW1fc2VuZF94XzAxXzAwXzA1CSh1dmQsIHVua25vd25fODgpOworCQkJaWJtY2FtX3NlbmRfeF8wMF8wNQkJKHV2ZCwgc2hhcnBfMTMpOworCQkJaWJtY2FtX3NlbmRfeF8wMF8wNV8wMgkodXZkLCBzdik7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgSUJNQ0FNX01PREVMXzI6CisJY2FzZSBJQk1DQU1fTU9ERUxfNDoKKwkJLyogTW9kZWxzIDIsIDQgZG8gbm90IGhhdmUgdGhpcyBjb250cm9sICovCisJCWJyZWFrOworCWNhc2UgSUJNQ0FNX01PREVMXzM6CisJewkvKgorCQkgKiAiVXNlIGEgdGFibGUgb2YgbWFnaWMgbnVtYmVycy4KKwkJICogIFRoaXMgc2V0dGluZyBkb2Vzbid0IHJlYWxseSBjaGFuZ2UgbXVjaC4KKwkJICogIEJ1dCB0aGF0J3MgaG93IFdpbmRvd3MgZG9lcyBpdC4iCisJCSAqLworCQlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJCXVuc2lnbmVkIHNob3J0IHN2MTsKKwkJCXVuc2lnbmVkIHNob3J0IHN2MjsKKwkJCXVuc2lnbmVkIHNob3J0IHN2MzsKKwkJCXVuc2lnbmVkIHNob3J0IHN2NDsKKwkJfSBzdls3XSA9IHsKKwkJCXsgMHgwMCwgMHgwMCwgMHgwNSwgMHgxNCB9LAkvKiBTbW9vdGhlc3QgKi8KKwkJCXsgMHgwMSwgMHgwNCwgMHgwNSwgMHgxNCB9LAorCQkJeyAweDAyLCAweDA0LCAweDA1LCAweDE0IH0sCisJCQl7IDB4MDMsIDB4MDQsIDB4MDUsIDB4MTQgfSwKKwkJCXsgMHgwMywgMHgwNSwgMHgwNSwgMHgxNCB9LAorCQkJeyAweDAzLCAweDA2LCAweDA1LCAweDE0IH0sCisJCQl7IDB4MDMsIDB4MDcsIDB4MDUsIDB4MTQgfQkvKiBTaGFycGVzdCAqLworCQl9OworCQlSRVNUUklDVF9UT19SQU5HRShzaGFycG5lc3MsIFNIQVJQTkVTU19NSU4sIFNIQVJQTkVTU19NQVgpOworCQlSRVNUUklDVF9UT19SQU5HRShzaGFycG5lc3MsIDAsIDYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTBjKTsJLyogU3RvcCAqLworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNjAsIHN2W3NoYXJwbmVzc10uc3YxKTsKKwkJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDYxLCBzdltzaGFycG5lc3NdLnN2Mik7CisJCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA2Miwgc3Zbc2hhcnBuZXNzXS5zdjMpOworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNjMsIHN2W3NoYXJwbmVzc10uc3Y0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDEsIDB4MDExNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGMwLCAweDAxMGMpOwkvKiBHbyEgKi8KKwkJdXNiX2NsZWFyX2hhbHQodXZkLT5kZXYsIHVzYl9yY3Zpc29jcGlwZSh1dmQtPmRldiwgdXZkLT52aWRlb19lbmRwKSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMTMpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogaWJtY2FtX3NldF9icmlnaHRuZXNzKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBjaGFuZ2VzIGJyaWdodG5lc3Mgb2YgdGhlIHBpY3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIGlibWNhbV9zZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgdXZkICp1dmQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gImlibWNhbV9zZXRfYnJpZ2h0bmVzcyI7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG4gPSAxOworCisJaWYgKGRlYnVnID4gMCkKKwkJaW5mbygiJXM6IFNldCBicmlnaHRuZXNzIHRvICVodS4iLCBwcm9jLCB1dmQtPnZwaWMuYnJpZ2h0bmVzcyk7CisKKwlzd2l0Y2ggKElCTUNBTV9UKHV2ZCktPmNhbWVyYV9tb2RlbCkgeworCWNhc2UgSUJNQ0FNX01PREVMXzE6CisJeworCQl1bnNpZ25lZCBzaG9ydCBpLCBqLCBidlszXTsKKwkJYnZbMF0gPSBidlsxXSA9IGJ2WzJdID0gdXZkLT52cGljLmJyaWdodG5lc3MgPj4gMTA7CisJCWlmIChidlswXSA9PSAodXZkLT52cGljX29sZC5icmlnaHRuZXNzID4+IDEwKSkKKwkJCXJldHVybjsKKwkJdXZkLT52cGljX29sZC5icmlnaHRuZXNzID0gYnZbMF07CisJCWZvciAoaj0wOyBqIDwgMzsgaisrKQorCQkJZm9yIChpPTA7IGkgPCBuOyBpKyspCisJCQkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgYnJpZ2h0XzN4W2pdLCBidltqXSk7CisJCWJyZWFrOworCX0KKwljYXNlIElCTUNBTV9NT0RFTF8yOgorCXsKKwkJdW5zaWduZWQgc2hvcnQgaSwgajsKKwkJaSA9IHV2ZC0+dnBpYy5icmlnaHRuZXNzID4+IDEyOwkvKiAwIC4uIDE1ICovCisJCWogPSAweDYwICsgaSAqICgoMHhlZSAtIDB4NjApIC8gMTYpOwkvKiAweDYwIC4uIDB4ZWUgb3Igc28gKi8KKwkJaWYgKHV2ZC0+dnBpY19vbGQuYnJpZ2h0bmVzcyA9PSBqKQorCQkJYnJlYWs7CisJCXV2ZC0+dnBpY19vbGQuYnJpZ2h0bmVzcyA9IGo7CisJCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIG1vZDJfYnJpZ2h0bmVzcywgaik7CisJCWJyZWFrOworCX0KKwljYXNlIElCTUNBTV9NT0RFTF8zOgorCXsKKwkJLyogTW9kZWwgMzogQnJpZ2h0bmVzcyByYW5nZSAnaScgaW4gWzB4MEMuLjB4M0ZdICovCisJCXVuc2lnbmVkIHNob3J0IGkgPQorCQkJMHgwQyArICh1dmQtPnZwaWMuYnJpZ2h0bmVzcyAvICgweEZGRkYgLyAoMHgzRiAtIDB4MEMgKyAxKSkpOworCQlSRVNUUklDVF9UT19SQU5HRShpLCAweDBDLCAweDNGKTsKKwkJaWYgKHV2ZC0+dnBpY19vbGQuYnJpZ2h0bmVzcyA9PSBpKQorCQkJYnJlYWs7CisJCXV2ZC0+dnBpY19vbGQuYnJpZ2h0bmVzcyA9IGk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMGMpOwkvKiBTdG9wICovCisJCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAzNiwgaSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMTQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBjMCwgMHgwMTBjKTsJLyogR28hICovCisJCXVzYl9jbGVhcl9oYWx0KHV2ZC0+ZGV2LCB1c2JfcmN2aXNvY3BpcGUodXZkLT5kZXYsIHV2ZC0+dmlkZW9fZW5kcCkpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMSwgMHgwMTEzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSUJNQ0FNX01PREVMXzQ6CisJeworCQkvKiBNb2RlbCA0OiBCcmlnaHRuZXNzIHJhbmdlICdpJyBpbiBbMHgwNC4uMHhiNF0gKi8KKwkJdW5zaWduZWQgc2hvcnQgaSA9IDB4MDQgKyAodXZkLT52cGljLmJyaWdodG5lc3MgLyAoMHhGRkZGIC8gKDB4YjQgLSAweDA0ICsgMSkpKTsKKwkJUkVTVFJJQ1RfVE9fUkFOR0UoaSwgMHgwNCwgMHhiNCk7CisJCWlmICh1dmQtPnZwaWNfb2xkLmJyaWdodG5lc3MgPT0gaSkKKwkJCWJyZWFrOworCQl1dmQtPnZwaWNfb2xkLmJyaWdodG5lc3MgPSBpOworCQlpYm1jYW1fbW9kZWw0X0JyaWdodG5lc3NQYWNrZXQodXZkLCBpKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgaWJtY2FtX3NldF9odWUoc3RydWN0IHV2ZCAqdXZkKQoreworCXN3aXRjaCAoSUJNQ0FNX1QodXZkKS0+Y2FtZXJhX21vZGVsKSB7CisJY2FzZSBJQk1DQU1fTU9ERUxfMjoKKwl7CisJCXVuc2lnbmVkIHNob3J0IGh1ZSA9IHV2ZC0+dnBpYy5odWUgPj4gOTsgLyogMCAuLiA3RiAqLworCQlpZiAodXZkLT52cGljX29sZC5odWUgPT0gaHVlKQorCQkJcmV0dXJuOworCQl1dmQtPnZwaWNfb2xkLmh1ZSA9IGh1ZTsKKwkJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgbW9kMl9odWUsIGh1ZSk7CisJCS8qIGlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIG1vZDJfc2F0dXJhdGlvbiwgc2F0KTsgKi8KKwkJYnJlYWs7CisJfQorCWNhc2UgSUJNQ0FNX01PREVMXzM6CisJeworI2lmIDAgLyogVGhpcyBzZWVtcyBub3QgdG8gd29yay4gTm8gcHJvYmxlbSwgd2lsbCBmaXggcHJvZ3JhbW1hdGljYWxseSAqLworCQl1bnNpZ25lZCBzaG9ydCBodWUgPSAweDA1ICsgKHV2ZC0+dnBpYy5odWUgLyAoMHhGRkZGIC8gKDB4MzcgLSAweDA1ICsgMSkpKTsKKwkJUkVTVFJJQ1RfVE9fUkFOR0UoaHVlLCAweDA1LCAweDM3KTsKKwkJaWYgKHV2ZC0+dnBpY19vbGQuaHVlID09IGh1ZSkKKwkJCXJldHVybjsKKwkJdXZkLT52cGljX29sZC5odWUgPSBodWU7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMGMpOwkvKiBTdG9wICovCisJCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA3ZSwgaHVlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDEsIDB4MDExNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGMwLCAweDAxMGMpOwkvKiBHbyEgKi8KKwkJdXNiX2NsZWFyX2hhbHQodXZkLT5kZXYsIHVzYl9yY3Zpc29jcGlwZSh1dmQtPmRldiwgdXZkLT52aWRlb19lbmRwKSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMTMpOworI2VuZGlmCisJCWJyZWFrOworCX0KKwljYXNlIElCTUNBTV9NT0RFTF80OgorCXsKKwkJdW5zaWduZWQgc2hvcnQgcl9nYWluLCBnX2dhaW4sIGJfZ2FpbiwgaHVlOworCisJCS8qCisJCSAqIEkgYW0gbm90IHN1cmUgci9nL2JfZ2FpbiB2YXJpYWJsZXMgZXhhY3RseSBjb250cm9sIGdhaW4KKwkJICogb2YgdGhvc2UgY2hhbm5lbHMuIE1vc3QgbGlrZWx5IHRoZXkgc3VidGx5IGNoYW5nZSBzb21lCisJCSAqIHZlcnkgaW50ZXJuYWwgaW1hZ2UgcHJvY2Vzc2luZyBzZXR0aW5ncyBpbiB0aGUgY2FtZXJhLgorCQkgKiBJbiBhbnkgY2FzZSwgaGVyZSBpcyB3aGF0IHRoZXkgZG8sIGFuZCBmZWVsIGZyZWUgdG8gdHdlYWs6CisJCSAqCisJCSAqIHJfZ2Fpbjogc2VyaW91c2x5IGFmZmVjdHMgcmVkIGdhaW4KKwkJICogZ19nYWluOiBzZXJpb3VzbHkgYWZmZWN0cyBncmVlbiBnYWluCisJCSAqIGJfZ2Fpbjogc2VyaW91c2x5IGFmZmVjdHMgYmx1ZSBnYWluCisJCSAqIGh1ZTogY2hhbmdlcyBhdmVyYWdlIGNvbG9yIGZyb20gdmlvbGV0ICgwKSB0byByZWQgKDB4RkYpCisJCSAqCisJCSAqIFRoZXNlIHNldHRpbmdzIGFyZSBwcmVzZXQgZm9yIGEgZGVjZW50IHdoaXRlIGJhbGFuY2UgaW4KKwkJICogMzIweDI0MCwgMzUyeDI4OCBtb2Rlcy4gTG93LXJlcyBtb2RlcyBleGhpYml0IGhpZ2hlciBjb250cmFzdAorCQkgKiBhbmQgdGhlcmVmb3JlIG1heSBuZWVkIGRpZmZlcmVudCB2YWx1ZXMgaGVyZS4KKwkJICovCisJCWh1ZSA9IDIwICsgKHV2ZC0+dnBpYy5odWUgPj4gOSk7CisJCXN3aXRjaCAodXZkLT52aWRlb3NpemUpIHsKKwkJY2FzZSBWSURFT1NJWkVfMTI4eDk2OgorCQkJcl9nYWluID0gOTA7CisJCQlnX2dhaW4gPSAxNjY7CisJCQliX2dhaW4gPSAxNzU7CisJCQlicmVhazsKKwkJY2FzZSBWSURFT1NJWkVfMTYweDEyMDoKKwkJCXJfZ2FpbiA9IDcwOworCQkJZ19nYWluID0gMTY2OworCQkJYl9nYWluID0gMTg1OworCQkJYnJlYWs7CisJCWNhc2UgVklERU9TSVpFXzE3NngxNDQ6CisJCQlyX2dhaW4gPSAxNjA7CisJCQlnX2dhaW4gPSAxNzU7CisJCQliX2dhaW4gPSAxODU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJfZ2FpbiA9IDEyMDsKKwkJCWdfZ2FpbiA9IDE2NjsKKwkJCWJfZ2FpbiA9IDE3NTsKKwkJCWJyZWFrOworCQl9CisJCVJFU1RSSUNUX1RPX1JBTkdFKGh1ZSwgMSwgMHg3Zik7CisKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDFlLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCBnX2dhaW4sIDB4MDEyNyk7CS8qIEdyZWVuIGdhaW4gKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCByX2dhaW4sIDB4MDEyZSk7CS8qIFJlZCBnYWluICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgYl9nYWluLCAweDAxMzApOwkvKiBCbHVlIGdhaW4gKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDhhMjgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgaHVlLCAgICAweDAxMmQpOwkvKiBIdWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGY1NDUsIDB4MDEyNCk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBpYm1jYW1fYWRqdXN0X3BpY3R1cmUoKQorICoKKyAqIFRoaXMgcHJvY2VkdXJlIGdldHMgY2FsbGVkIGZyb20gVjRMIGludGVyZmFjZSB0byB1cGRhdGUgcGljdHVyZSBzZXR0aW5ncy4KKyAqIEhlcmUgd2UgY2hhbmdlIGJyaWdodG5lc3MgYW5kIGNvbnRyYXN0LgorICovCitzdGF0aWMgdm9pZCBpYm1jYW1fYWRqdXN0X3BpY3R1cmUoc3RydWN0IHV2ZCAqdXZkKQoreworCWlibWNhbV9hZGp1c3RfY29udHJhc3QodXZkKTsKKwlpYm1jYW1fc2V0X2JyaWdodG5lc3ModXZkKTsKKwlpYm1jYW1fc2V0X2h1ZSh1dmQpOworfQorCitzdGF0aWMgaW50IGlibWNhbV9tb2RlbDFfc2V0dXAoc3RydWN0IHV2ZCAqdXZkKQoreworCWNvbnN0IGludCBudHJpZXMgPSA1OworCWludCBpOworCisJaWJtY2FtX3ZlaW8odXZkLCAxLCAweDAwLCAweDAxMjgpOworCWlibWNhbV92ZWlvKHV2ZCwgMSwgMHgwMCwgMHgwMTAwKTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDEsIDB4MDEwMCk7CS8qIExFRCBPbiAgKi8KKwlpYm1jYW1fdmVpbyh1dmQsIDEsIDB4MDAsIDB4MDEwMCk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDgxLCAweDAxMDApOwkvKiBMRUQgT2ZmICovCisJaWJtY2FtX3ZlaW8odXZkLCAxLCAweDAwLCAweDAxMDApOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMSwgMHgwMTAwKTsJLyogTEVEIE9uICAqLworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMSwgMHgwMTA4KTsKKworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMywgMHgwMTEyKTsKKwlpYm1jYW1fdmVpbyh1dmQsIDEsIDB4MDAsIDB4MDExNSk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDA2LCAweDAxMTUpOworCWlibWNhbV92ZWlvKHV2ZCwgMSwgMHgwMCwgMHgwMTE2KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4NDQsIDB4MDExNik7CisJaWJtY2FtX3ZlaW8odXZkLCAxLCAweDAwLCAweDAxMTYpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg0MCwgMHgwMTE2KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDEsIDB4MDAsIDB4MDExNSk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDBlLCAweDAxMTUpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgxOSwgMHgwMTJjKTsKKworCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MDAsIDB4MWUpOworCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MzksIDB4MGQpOworCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MzksIDB4MDkpOworCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4M2IsIDB4MDApOworCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MjgsIDB4MjIpOworCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIGxpZ2h0XzI3LCAwKTsKKwlpYm1jYW1fUGFja2V0X0Zvcm1hdDEodXZkLCAweDJiLCAweDFmKTsKKwlpYm1jYW1fUGFja2V0X0Zvcm1hdDEodXZkLCAweDM5LCAweDA4KTsKKworCWZvciAoaT0wOyBpIDwgbnRyaWVzOyBpKyspCisJCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MmMsIDB4MDApOworCisJZm9yIChpPTA7IGkgPCBudHJpZXM7IGkrKykKKwkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgzMCwgMHgxNCk7CisKKwlpYm1jYW1fUGFja2V0Rm9ybWF0Mih1dmQsIDB4MzksIDB4MDIpOworCWlibWNhbV9QYWNrZXRGb3JtYXQyKHV2ZCwgMHgwMSwgMHhlMSk7CisJaWJtY2FtX1BhY2tldEZvcm1hdDIodXZkLCAweDAyLCAweGNkKTsKKwlpYm1jYW1fUGFja2V0Rm9ybWF0Mih1dmQsIDB4MDMsIDB4Y2QpOworCWlibWNhbV9QYWNrZXRGb3JtYXQyKHV2ZCwgMHgwNCwgMHhmYSk7CisJaWJtY2FtX1BhY2tldEZvcm1hdDIodXZkLCAweDNmLCAweGZmKTsKKwlpYm1jYW1fUGFja2V0Rm9ybWF0Mih1dmQsIDB4MzksIDB4MDApOworCisJaWJtY2FtX1BhY2tldEZvcm1hdDIodXZkLCAweDM5LCAweDAyKTsKKwlpYm1jYW1fUGFja2V0Rm9ybWF0Mih1dmQsIDB4MGEsIDB4MzcpOworCWlibWNhbV9QYWNrZXRGb3JtYXQyKHV2ZCwgMHgwYiwgMHhiOCk7CisJaWJtY2FtX1BhY2tldEZvcm1hdDIodXZkLCAweDBjLCAweGYzKTsKKwlpYm1jYW1fUGFja2V0Rm9ybWF0Mih1dmQsIDB4MGQsIDB4ZTMpOworCWlibWNhbV9QYWNrZXRGb3JtYXQyKHV2ZCwgMHgwZSwgMHgwZCk7CisJaWJtY2FtX1BhY2tldEZvcm1hdDIodXZkLCAweDBmLCAweGYyKTsKKwlpYm1jYW1fUGFja2V0Rm9ybWF0Mih1dmQsIDB4MTAsIDB4ZDUpOworCWlibWNhbV9QYWNrZXRGb3JtYXQyKHV2ZCwgMHgxMSwgMHhiYSk7CisJaWJtY2FtX1BhY2tldEZvcm1hdDIodXZkLCAweDEyLCAweDUzKTsKKwlpYm1jYW1fUGFja2V0Rm9ybWF0Mih1dmQsIDB4M2YsIDB4ZmYpOworCWlibWNhbV9QYWNrZXRGb3JtYXQyKHV2ZCwgMHgzOSwgMHgwMCk7CisKKwlpYm1jYW1fUGFja2V0Rm9ybWF0Mih1dmQsIDB4MzksIDB4MDIpOworCWlibWNhbV9QYWNrZXRGb3JtYXQyKHV2ZCwgMHgxNiwgMHgwMCk7CisJaWJtY2FtX1BhY2tldEZvcm1hdDIodXZkLCAweDE3LCAweDI4KTsKKwlpYm1jYW1fUGFja2V0Rm9ybWF0Mih1dmQsIDB4MTgsIDB4N2QpOworCWlibWNhbV9QYWNrZXRGb3JtYXQyKHV2ZCwgMHgxOSwgMHhiZSk7CisJaWJtY2FtX1BhY2tldEZvcm1hdDIodXZkLCAweDNmLCAweGZmKTsKKwlpYm1jYW1fUGFja2V0Rm9ybWF0Mih1dmQsIDB4MzksIDB4MDApOworCisJZm9yIChpPTA7IGkgPCBudHJpZXM7IGkrKykKKwkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgwMCwgMHgxOCk7CisJZm9yIChpPTA7IGkgPCBudHJpZXM7IGkrKykKKwkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgxMywgMHgxOCk7CisJZm9yIChpPTA7IGkgPCBudHJpZXM7IGkrKykKKwkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgxNCwgMHgwNik7CisKKwkvKiBUaGlzIGlzIGRlZmF1bHQgYnJpZ2h0bmVzcyAqLworCWZvciAoaT0wOyBpIDwgbnRyaWVzOyBpKyspCisJCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MzEsIDB4MzcpOworCWZvciAoaT0wOyBpIDwgbnRyaWVzOyBpKyspCisJCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MzIsIDB4NDYpOworCWZvciAoaT0wOyBpIDwgbnRyaWVzOyBpKyspCisJCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MzMsIDB4NTUpOworCisJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgyZSwgMHgwNCk7CisJZm9yIChpPTA7IGkgPCBudHJpZXM7IGkrKykKKwkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgyZCwgMHgwNCk7CisJZm9yIChpPTA7IGkgPCBudHJpZXM7IGkrKykKKwkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgyOSwgMHg4MCk7CisJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgyYywgMHgwMSk7CisJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgzMCwgMHgxNyk7CisJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgzOSwgMHgwOCk7CisJZm9yIChpPTA7IGkgPCBudHJpZXM7IGkrKykKKwkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgzNCwgMHgwMCk7CisKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAsIDB4MDEwMSk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwLCAweDAxMGEpOworCisJc3dpdGNoICh1dmQtPnZpZGVvc2l6ZSkgeworCWNhc2UgVklERU9TSVpFXzEyOHg5NjoKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDgwLCAweDAxMDMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4NjAsIDB4MDEwNSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwYywgMHgwMTBiKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDA0LCAweDAxMWIpOwkvKiBTYW1lIGV2ZXJ5d2hlcmUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDBiLCAweDAxMWQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAsIDB4MDExZSk7CS8qIFNhbWUgZXZlcnl3aGVyZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAsIDB4MDEyOSk7CisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzE3NngxNDQ6CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhiMCwgMHgwMTAzKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDhmLCAweDAxMDUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDYsIDB4MDEwYik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwNCwgMHgwMTFiKTsJLyogU2FtZSBldmVyeXdoZXJlICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwZCwgMHgwMTFkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwLCAweDAxMWUpOwkvKiBTYW1lIGV2ZXJ5d2hlcmUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAzLCAweDAxMjkpOworCQlicmVhazsKKwljYXNlIFZJREVPU0laRV8zNTJ4Mjg4OgorCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4YjAsIDB4MDEwMyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg5MCwgMHgwMTA1KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAyLCAweDAxMGIpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDQsIDB4MDExYik7CS8qIFNhbWUgZXZlcnl3aGVyZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDUsIDB4MDExZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMCwgMHgwMTFlKTsJLyogU2FtZSBldmVyeXdoZXJlICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMCwgMHgwMTI5KTsKKwkJYnJlYWs7CisJfQorCisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZmLCAweDAxMmIpOworCisJLyogVGhpcyBpcyBhbm90aGVyIGJyaWdodG5lc3MgLSBkb24ndCBrbm93IHdoeSAqLworCWZvciAoaT0wOyBpIDwgbnRyaWVzOyBpKyspCisJCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MzEsIDB4YzMpOworCWZvciAoaT0wOyBpIDwgbnRyaWVzOyBpKyspCisJCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MzIsIDB4ZDIpOworCWZvciAoaT0wOyBpIDwgbnRyaWVzOyBpKyspCisJCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MzMsIDB4ZTEpOworCisJLyogRGVmYXVsdCBjb250cmFzdCAqLworCWZvciAoaT0wOyBpIDwgbnRyaWVzOyBpKyspCisJCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIGNvbnRyYXN0XzE0LCAweDBhKTsKKworCS8qIERlZmF1bHQgc2hhcnBuZXNzICovCisJZm9yIChpPTA7IGkgPCAyOyBpKyspCisJCWlibWNhbV9QYWNrZXRGb3JtYXQyKHV2ZCwgc2hhcnBfMTMsIDB4MWEpOwkvKiBMZXZlbCA0IEZJWE1FICovCisKKwkvKiBEZWZhdWx0IGxpZ2h0aW5nIGNvbmRpdGlvbnMgKi8KKwlpYm1jYW1fUGFja2V0X0Zvcm1hdDEodXZkLCBsaWdodF8yNywgbGlnaHRpbmcpOyAvKiAwPUJyaWdodCAyPUxvdyAqLworCisJLyogQXNzb3J0ZWQgaW5pdCAqLworCisJc3dpdGNoICh1dmQtPnZpZGVvc2l6ZSkgeworCWNhc2UgVklERU9TSVpFXzEyOHg5NjoKKwkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgyYiwgMHgxZSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhjOSwgMHgwMTE5KTsJLyogU2FtZSBldmVyeXdoZXJlICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4MCwgMHgwMTA5KTsJLyogU2FtZSBldmVyeXdoZXJlICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgzNiwgMHgwMTAyKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDFhLCAweDAxMDQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDQsIDB4MDExYSk7CS8qIFNhbWUgZXZlcnl3aGVyZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MmIsIDB4MDExYyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgyMywgMHgwMTJhKTsJLyogU2FtZSBldmVyeXdoZXJlICovCisjaWYgMAorCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAsIDB4MDEwNik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgzOCwgMHgwMTA3KTsKKyNlbHNlCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMiwgMHgwMTA2KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDJhLCAweDAxMDcpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzE3NngxNDQ6CisJCWlibWNhbV9QYWNrZXRfRm9ybWF0MSh1dmQsIDB4MmIsIDB4MWUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4YzksIDB4MDExOSk7CS8qIFNhbWUgZXZlcnl3aGVyZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ODAsIDB4MDEwOSk7CS8qIFNhbWUgZXZlcnl3aGVyZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDQsIDB4MDEwMik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMiwgMHgwMTA0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDA0LCAweDAxMWEpOwkvKiBTYW1lIGV2ZXJ5d2hlcmUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDJiLCAweDAxMWMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MjMsIDB4MDEyYSk7CS8qIFNhbWUgZXZlcnl3aGVyZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDEsIDB4MDEwNik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhjYSwgMHgwMTA3KTsKKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfMzUyeDI4ODoKKwkJaWJtY2FtX1BhY2tldF9Gb3JtYXQxKHV2ZCwgMHgyYiwgMHgxZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhjOSwgMHgwMTE5KTsJLyogU2FtZSBldmVyeXdoZXJlICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4MCwgMHgwMTA5KTsJLyogU2FtZSBldmVyeXdoZXJlICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwOCwgMHgwMTAyKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAxLCAweDAxMDQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDQsIDB4MDExYSk7CS8qIFNhbWUgZXZlcnl3aGVyZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MmYsIDB4MDExYyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgyMywgMHgwMTJhKTsJLyogU2FtZSBldmVyeXdoZXJlICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMywgMHgwMTA2KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGY2LCAweDAxMDcpOworCQlicmVhazsKKwl9CisJcmV0dXJuIChDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSA/IDAgOiAtRUZBVUxUKTsKK30KKworc3RhdGljIGludCBpYm1jYW1fbW9kZWwyX3NldHVwKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTAwKTsJLyogTEVEIG9uICovCisJaWJtY2FtX3ZlaW8odXZkLCAxLCAweDAwMDAsIDB4MDExNik7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNjAsIDB4MDExNik7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDIsIDB4MDExMik7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYmMsIDB4MDEyYyk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDgsIDB4MDEyYik7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwOCk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDEsIDB4MDEzMyk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDEsIDB4MDEwMik7CisJc3dpdGNoICh1dmQtPnZpZGVvc2l6ZSkgeworCWNhc2UgVklERU9TSVpFXzE3NngxNDQ6CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDJjLCAweDAxMDMpOwkvKiBBbGwgZXhjZXB0IDMyMHgyNDAgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwNCk7CS8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMjQsIDB4MDEwNSk7CS8qIDE3NngxNDQsIDM1MngyODggKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYjksIDB4MDEwYSk7CS8qIFVuaXF1ZSB0byB0aGlzIG1vZGUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzgsIDB4MDExOSk7CS8qIFVuaXF1ZSB0byB0aGlzIG1vZGUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDMsIDB4MDEwNik7CS8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwOTAsIDB4MDEwNyk7CS8qIFVuaXF1ZSB0byBldmVyeSBtb2RlKi8KKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfMzIweDI0MDoKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMjgsIDB4MDEwMyk7CS8qIFVuaXF1ZSB0byB0aGlzIG1vZGUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwNCk7CS8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMWUsIDB4MDEwNSk7CS8qIDMyMHgyNDAsIDM1MngyNDAgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzksIDB4MDEwYSk7CS8qIEFsbCBleGNlcHQgMTc2eDE0NCAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA3MCwgMHgwMTE5KTsJLyogQWxsIGV4Y2VwdCAxNzZ4MTQ0ICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAzLCAweDAxMDYpOwkvKiBTYW1lICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDk4LCAweDAxMDcpOwkvKiBVbmlxdWUgdG8gZXZlcnkgbW9kZSovCisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzM1MngyNDA6CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDJjLCAweDAxMDMpOwkvKiBBbGwgZXhjZXB0IDMyMHgyNDAgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwNCk7CS8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMWUsIDB4MDEwNSk7CS8qIDMyMHgyNDAsIDM1MngyNDAgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzksIDB4MDEwYSk7CS8qIEFsbCBleGNlcHQgMTc2eDE0NCAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA3MCwgMHgwMTE5KTsJLyogQWxsIGV4Y2VwdCAxNzZ4MTQ0ICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAzLCAweDAxMDYpOwkvKiBTYW1lICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGRhLCAweDAxMDcpOwkvKiBVbmlxdWUgdG8gZXZlcnkgbW9kZSovCisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzM1MngyODg6CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDJjLCAweDAxMDMpOwkvKiBBbGwgZXhjZXB0IDMyMHgyNDAgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwNCk7CS8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMjQsIDB4MDEwNSk7CS8qIDE3NngxNDQsIDM1MngyODggKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzksIDB4MDEwYSk7CS8qIEFsbCBleGNlcHQgMTc2eDE0NCAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA3MCwgMHgwMTE5KTsJLyogQWxsIGV4Y2VwdCAxNzZ4MTQ0ICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAzLCAweDAxMDYpOwkvKiBTYW1lICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGZlLCAweDAxMDcpOwkvKiBVbmlxdWUgdG8gZXZlcnkgbW9kZSovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gKENBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpID8gMCA6IC1FRkFVTFQpOworfQorCisvKgorICogaWJtY2FtX21vZGVsMV9zZXR1cF9hZnRlcl92aWRlb19pZigpCisgKgorICogVGhpcyBjb2RlIGFkZHMgZmluaXNoaW5nIHRvdWNoZXMgdG8gdGhlIHZpZGVvIGRhdGEgaW50ZXJmYWNlLgorICogSGVyZSB3ZSBjb25maWd1cmUgdGhlIGZyYW1lIHJhdGUgYW5kIHR1cm4gb24gdGhlIExFRC4KKyAqLworc3RhdGljIHZvaWQgaWJtY2FtX21vZGVsMV9zZXR1cF9hZnRlcl92aWRlb19pZihzdHJ1Y3QgdXZkICp1dmQpCit7CisJdW5zaWduZWQgc2hvcnQgaW50ZXJuYWxfZnJhbWVfcmF0ZTsKKworCVJFU1RSSUNUX1RPX1JBTkdFKGZyYW1lcmF0ZSwgRlJBTUVSQVRFX01JTiwgRlJBTUVSQVRFX01BWCk7CisJaW50ZXJuYWxfZnJhbWVfcmF0ZSA9IEZSQU1FUkFURV9NQVggLSBmcmFtZXJhdGU7IC8qIDA9RmFzdCA2PVNsb3cgKi8KKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDEsIDB4MDEwMCk7CS8qIExFRCBPbiAgKi8KKwlpYm1jYW1fdmVpbyh1dmQsIDAsIGludGVybmFsX2ZyYW1lX3JhdGUsIDB4MDExMSk7CisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAxLCAweDAxMTQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhjMCwgMHgwMTBjKTsKK30KKworc3RhdGljIHZvaWQgaWJtY2FtX21vZGVsMl9zZXR1cF9hZnRlcl92aWRlb19pZihzdHJ1Y3QgdXZkICp1dmQpCit7CisJdW5zaWduZWQgc2hvcnQgc2V0dXBfbW9kZWwyX3JnMiwgc2V0dXBfbW9kZWwyX3NhdCwgc2V0dXBfbW9kZWwyX3liOworCisJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwMCk7CS8qIExFRCBvbiAqLworCisJc3dpdGNoICh1dmQtPnZpZGVvc2l6ZSkgeworCWNhc2UgVklERU9TSVpFXzE3NngxNDQ6CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDUwLCAweDAxMTEpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBkMCwgMHgwMTExKTsKKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfMzIweDI0MDoKKwljYXNlIFZJREVPU0laRV8zNTJ4MjQwOgorCWNhc2UgVklERU9TSVpFXzM1MngyODg6CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDQwLCAweDAxMTEpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBjMCwgMHgwMTExKTsKKwkJYnJlYWs7CisJfQorCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDliLCAweDAxMGYpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGJiLCAweDAxMGYpOworCisJLyoKKwkgKiBIYXJkd2FyZSBzZXR0aW5ncywgbWF5IGFmZmVjdCBDTU9TIHNlbnNvcjsgbm90IHVzZXIgY29udHJvbHMhCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIDB4MDAwNDogbm8gZWZmZWN0CisJICogMHgwMDA2OiBoYXJkd2FyZSBlZmZlY3QKKwkgKiAweDAwMDg6IG5vIGVmZmVjdAorCSAqIDB4MDAwYTogc3RvcHMgdmlkZW8gc3RyZWFtLCBwcm9iYWJseSBpbXBvcnRhbnQgaC93IHNldHRpbmcKKwkgKiAweDAwMGM6IGNoYW5nZXMgY29sb3IgaW4gaGFyZHdhcmUgbWFubmVyIChub3QgdXNlciBzZXR0aW5nKQorCSAqIDB4MDAxMjogY2hhbmdlcyBudW1iZXIgb2YgY29sb3JzIChkb2VzIG5vdCBhZmZlY3Qgc3BlZWQpCisJICogMHgwMDJhOiBubyBlZmZlY3QKKwkgKiAweDAwMmM6IGhhcmR3YXJlIHNldHRpbmcgKHJlbGF0ZWQgdG8gc2NhbiBsaW5lcykKKwkgKiAweDAwMmU6IHN0b3BzIHZpZGVvIHN0cmVhbSwgcHJvYmFibHkgaW1wb3J0YW50IGgvdyBzZXR0aW5nCisJICovCisJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDBhLCAweDAwNWMpOworCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIDB4MDAwNCwgMHgwMDAwKTsKKwlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCAweDAwMDYsIDB4MDBmYik7CisJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDA4LCAweDAwMDApOworCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIDB4MDAwYywgMHgwMDA5KTsKKwlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCAweDAwMTIsIDB4MDAwYSk7CisJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDJhLCAweDAwMDApOworCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIDB4MDAyYywgMHgwMDAwKTsKKwlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCAweDAwMmUsIDB4MDAwOCk7CisKKwkvKgorCSAqIEZ1bmN0aW9uIDB4MDAzMCBwb3BzIHVwIGFsbCBvdmVyIHRoZSBwbGFjZS4gQXBwYXJlbnRseQorCSAqIGl0IGlzIGEgaGFyZHdhcmUgY29udHJvbCByZWdpc3Rlciwgd2l0aCBldmVyeSBiaXQgYXNzaWduZWQgdG8KKwkgKiBkbyBzb21ldGhpbmcuCisJICovCisJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDMwLCAweDAwMDApOworCisJLyoKKwkgKiBNYWdpYyBjb250cm9sIG9mIENNT1Mgc2Vuc29yLiBPbmx5IGxvd2VyIHZhbHVlcyBsaWtlCisJICogMC0zIHdvcmssIGFuZCBwaWN0dXJlIHNoaWZ0cyBsZWZ0IG9yIHJpZ2h0LiBEb24ndCBjaGFuZ2UuCisJICovCisJc3dpdGNoICh1dmQtPnZpZGVvc2l6ZSkgeworCWNhc2UgVklERU9TSVpFXzE3NngxNDQ6CisJCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIDB4MDAxNCwgMHgwMDAyKTsKKwkJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDE2LCAweDAwMDIpOyAvKiBIb3Jpem9udGFsIHNoaWZ0ICovCisJCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIDB4MDAxOCwgMHgwMDRhKTsgLyogQW5vdGhlciBoYXJkd2FyZSBzZXR0aW5nICovCisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzMyMHgyNDA6CisJCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIDB4MDAxNCwgMHgwMDA5KTsKKwkJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDE2LCAweDAwMDUpOyAvKiBIb3Jpem9udGFsIHNoaWZ0ICovCisJCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIDB4MDAxOCwgMHgwMDQ0KTsgLyogQW5vdGhlciBoYXJkd2FyZSBzZXR0aW5nICovCisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzM1MngyNDA6CisJCS8qIFRoaXMgbW9kZSBkb2Vzbid0IHdvcmsgYXMgV2luZG93cyBwcm9ncmFtcyBpdDsgY2hhbmdlZCB0byB3b3JrICovCisJCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIDB4MDAxNCwgMHgwMDA5KTsgLyogV2luZG93cyBzZXRzIHRoaXMgdG8gOCAqLworCQlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCAweDAwMTYsIDB4MDAwMyk7IC8qIEhvcml6b250YWwgc2hpZnQgKi8KKwkJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDE4LCAweDAwNDQpOyAvKiBXaW5kb3dzIHNldHMgdGhpcyB0byAweDAwNDUgKi8KKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfMzUyeDI4ODoKKwkJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDE0LCAweDAwMDMpOworCQlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCAweDAwMTYsIDB4MDAwMik7IC8qIEhvcml6b250YWwgc2hpZnQgKi8KKwkJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDE4LCAweDAwNGEpOyAvKiBBbm90aGVyIGhhcmR3YXJlIHNldHRpbmcgKi8KKwkJYnJlYWs7CisJfQorCisJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgbW9kMl9icmlnaHRuZXNzLCAweDAwNWEpOworCisJLyoKKwkgKiBXZSBoYXZlIG91ciBvd24gZnJhbWUgcmF0ZSBzZXR0aW5nIHZhcnlpbmcgZnJvbSAwIChzbG93ZXN0KSB0byA2IChmYXN0ZXN0KS4KKwkgKiBUaGUgY2FtZXJhIG1vZGVsIDIgYWxsb3dzIGZyYW1lIHJhdGUgaW4gcmFuZ2UgWzAuLjB4MUZdIHdoZXJlIDAgaXMgYWxzbyB0aGUKKwkgKiBzbG93ZXN0IHNldHRpbmcuIEhvd2V2ZXIgZm9yIGFsbCBwcmFjdGljYWwgcmVhc29ucyBoaWdoIHNldHRpbmdzIG1ha2Ugbm8KKwkgKiBzZW5zZSBiZWNhdXNlIFVTQiBpcyBub3QgZmFzdCBlbm91Z2ggdG8gc3VwcG9ydCBoaWdoIEZQUy4gQmUgYXdhcmUgdGhhdAorCSAqIHRoZSBwaWN0dXJlIGRhdGFzdHJlYW0gd2lsbCBiZSBzZXZlcmVseSBkaXNydXB0ZWQgaWYgeW91IGFzayBmb3IKKwkgKiBmcmFtZSByYXRlIGZhc3RlciB0aGFuIGFsbG93ZWQgZm9yIHRoZSB2aWRlbyBzaXplIC0gc2VlIGJlbG93OgorCSAqCisJICogQWxsb3dhYmxlIHJhbmdlcyAob2J0YWluZWQgZXhwZXJpbWVudGFsbHkgb24gT0hDSSwgSzYtMywgNDUwIE1Ieik6CisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiAxNzZ4MTQ0OiBbNi4uMzFdCisJICogMzIweDI0MDogWzguLjMxXQorCSAqIDM1MngyNDA6IFsxMC4uMzFdCisJICogMzUyeDI4ODogWzE2Li4zMV0gSSBoYXZlIHRvIHJhaXNlIGxvd2VyIHRocmVzaG9sZCBmb3Igc3RhYmlsaXR5Li4uCisJICoKKwkgKiBBcyB1c3VhbCwgc2xvd2VyIEZQUyBwcm92aWRlcyBiZXR0ZXIgc2Vuc2l0aXZpdHkuCisJICovCisJeworCQlzaG9ydCBod19mcHM9MzEsIGlfZnJhbWVyYXRlOworCisJCVJFU1RSSUNUX1RPX1JBTkdFKGZyYW1lcmF0ZSwgRlJBTUVSQVRFX01JTiwgRlJBTUVSQVRFX01BWCk7CisJCWlfZnJhbWVyYXRlID0gRlJBTUVSQVRFX01BWCAtIGZyYW1lcmF0ZSArIEZSQU1FUkFURV9NSU47CisJCXN3aXRjaCAodXZkLT52aWRlb3NpemUpIHsKKwkJY2FzZSBWSURFT1NJWkVfMTc2eDE0NDoKKwkJCWh3X2ZwcyA9IDYgKyBpX2ZyYW1lcmF0ZSo0OworCQkJYnJlYWs7CisJCWNhc2UgVklERU9TSVpFXzMyMHgyNDA6CisJCQlod19mcHMgPSA4ICsgaV9mcmFtZXJhdGUqMzsKKwkJCWJyZWFrOworCQljYXNlIFZJREVPU0laRV8zNTJ4MjQwOgorCQkJaHdfZnBzID0gMTAgKyBpX2ZyYW1lcmF0ZSoyOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9TSVpFXzM1MngyODg6CisJCQlod19mcHMgPSAyOCArIGlfZnJhbWVyYXRlLzI7CisJCQlicmVhazsKKwkJfQorCQlpZiAodXZkLT5kZWJ1ZyA+IDApCisJCQlpbmZvKCJGcmFtZXJhdGUgKGhhcmR3YXJlKTogJWhkLiIsIGh3X2Zwcyk7CisJCVJFU1RSSUNUX1RPX1JBTkdFKGh3X2ZwcywgMCwgMzEpOworCQlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCBtb2QyX3NldF9mcmFtZXJhdGUsIGh3X2Zwcyk7CisJfQorCisJLyoKKwkgKiBUaGlzIHNldHRpbmcgZG9lcyBub3QgdmlzaWJseSBhZmZlY3QgcGljdHVyZXM7IGxlZnQgaXQgaGVyZQorCSAqIGJlY2F1c2UgaXQgd2FzIHByZXNlbnQgaW4gV2luZG93cyBVU0IgZGF0YSBzdHJlYW0uIFRoaXMgZnVuY3Rpb24KKwkgKiBkb2VzIG5vdCBhbGxvdyBhcmJpdHJhcnkgdmFsdWVzIGFuZCBhcHBhcmVudGx5IGlzIGEgYml0IG1hc2ssIHRvCisJICogYmUgYWN0aXZhdGVkIG9ubHkgYXQgYXBwcm9wcmlhdGUgdGltZS4gRG9uJ3QgY2hhbmdlIGl0IHJhbmRvbWx5IQorCSAqLworCXN3aXRjaCAodXZkLT52aWRlb3NpemUpIHsKKwljYXNlIFZJREVPU0laRV8xNzZ4MTQ0OgorCQlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCAweDAwMjYsIDB4MDBjMik7CisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzMyMHgyNDA6CisJCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIDB4MDAyNiwgMHgwMDQ0KTsKKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfMzUyeDI0MDoKKwkJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDI2LCAweDAwNDYpOworCQlicmVhazsKKwljYXNlIFZJREVPU0laRV8zNTJ4Mjg4OgorCQlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCAweDAwMjYsIDB4MDA0OCk7CisJCWJyZWFrOworCX0KKworCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIG1vZDJfc2Vuc2l0aXZpdHksIGxpZ2h0aW5nKTsKKworCWlmIChpbml0X21vZGVsMl9yZzIgPj0gMCkgeworCQlSRVNUUklDVF9UT19SQU5HRShpbml0X21vZGVsMl9yZzIsIDAsIDI1NSk7CisJCXNldHVwX21vZGVsMl9yZzIgPSBpbml0X21vZGVsMl9yZzI7CisJfSBlbHNlCisJCXNldHVwX21vZGVsMl9yZzIgPSAweDAwMmY7CisKKwlpZiAoaW5pdF9tb2RlbDJfc2F0ID49IDApIHsKKwkJUkVTVFJJQ1RfVE9fUkFOR0UoaW5pdF9tb2RlbDJfc2F0LCAwLCAyNTUpOworCQlzZXR1cF9tb2RlbDJfc2F0ID0gaW5pdF9tb2RlbDJfc2F0OworCX0gZWxzZQorCQlzZXR1cF9tb2RlbDJfc2F0ID0gMHgwMDM0OworCisJaWYgKGluaXRfbW9kZWwyX3liID49IDApIHsKKwkJUkVTVFJJQ1RfVE9fUkFOR0UoaW5pdF9tb2RlbDJfeWIsIDAsIDI1NSk7CisJCXNldHVwX21vZGVsMl95YiA9IGluaXRfbW9kZWwyX3liOworCX0gZWxzZQorCQlzZXR1cF9tb2RlbDJfeWIgPSAweDAwYTA7CisKKwlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCBtb2QyX2NvbG9yX2JhbGFuY2VfcmcyLCBzZXR1cF9tb2RlbDJfcmcyKTsKKwlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCBtb2QyX3NhdHVyYXRpb24sIHNldHVwX21vZGVsMl9zYXQpOworCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIG1vZDJfY29sb3JfYmFsYW5jZV95Yiwgc2V0dXBfbW9kZWwyX3liKTsKKwlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCBtb2QyX2h1ZSwgdXZkLT52cGljLmh1ZSA+PiA5KTsgLyogMCAuLiA3RiAqLzsKKworCS8qIEhhcmR3YXJlIGNvbnRyb2wgY29tbWFuZCAqLworCWlibWNhbV9tb2RlbDJfUGFja2V0MSh1dmQsIDB4MDAzMCwgMHgwMDA0KTsKKworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGMwLCAweDAxMGMpOwkvKiBHbyBjYW1lcmEsIGdvISAqLworCXVzYl9jbGVhcl9oYWx0KHV2ZC0+ZGV2LCB1c2JfcmN2aXNvY3BpcGUodXZkLT5kZXYsIHV2ZC0+dmlkZW9fZW5kcCkpOworfQorCitzdGF0aWMgdm9pZCBpYm1jYW1fbW9kZWw0X3NldHVwX2FmdGVyX3ZpZGVvX2lmKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlzd2l0Y2ggKHV2ZC0+dmlkZW9zaXplKSB7CisJY2FzZSBWSURFT1NJWkVfMTI4eDk2OgorCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTAwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYzAsIDB4MDExMSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGJjLCAweDAxMmMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA4MCwgMHgwMTJiKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwOCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMzMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA5YiwgMHgwMTBmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYmIsIDB4MDEwZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzOCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmVhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDBhLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNWMsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZWE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDQsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZmIsIDB4MDEyZSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMzApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4OGEyOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMDU1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwYywgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDksIDB4MDEyZSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhhYTI4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMTIsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwOCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4MmE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAyYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQ1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmZmYSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDM0LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZWE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA3MCwgMHgwMTE5KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZDIsIDB4MDEwNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAzLCAweDAxMDYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA1ZSwgMHgwMTA3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDMsIDB4MDEwNik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGQwLCAweDAxMTEpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzOSwgMHgwMTBhKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDEsIDB4MDEwMik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDI4LCAweDAxMDMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTA0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMWUsIDB4MDEwNSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxNiwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDBhLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDgyYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDE0LCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwOCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxYSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDhhMGEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDVhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4OTU0NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDE4LCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA0MywgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDhhMjgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDA1NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMWMsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGViLCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4YWEyOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDMyLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMzApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ODJhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzYsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA4LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZmZmEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxZSwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDE3LCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxMywgMHgwMTJlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzEsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4YTI4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxNywgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNzgsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQ1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZlYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzOCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA0LCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmVhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYzAsIDB4MDEwYyk7CisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzE2MHgxMjA6CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMDApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBjMCwgMHgwMTExKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYmMsIDB4MDEyYyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDgwLCAweDAxMmIpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTA4KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDEsIDB4MDEzMyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDliLCAweDAxMGYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBiYiwgMHgwMTBmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDM4LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZWE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMGEsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA1YywgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZlYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwNCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBmYiwgMHgwMTJlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4YTI4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQwNTUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDBjLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwOSwgMHgwMTJlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGFhMjgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxMiwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA4LCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDgyYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDJhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZmZhLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzQsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZlYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDM4LCAweDAxMTkpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBkOCwgMHgwMTA3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDIsIDB4MDEwNik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGQwLCAweDAxMTEpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBiOSwgMHgwMTBhKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDEsIDB4MDEwMik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDI4LCAweDAxMDMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTA0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMWUsIDB4MDEwNSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxNiwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDBiLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDgyYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDE0LCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwOCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxYSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDhhMGEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDVhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4OTU0NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDE4LCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA0MywgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDhhMjgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDA1NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMWMsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGM3LCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4YWEyOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDMyLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMjUsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMzApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ODJhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzYsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA4LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZmZmEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxZSwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDQ4LCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzNSwgMHgwMTJlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZDAsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4YTI4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA0OCwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwOTAsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQ1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMSwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZlYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzOCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA0LCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmVhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYzAsIDB4MDEwYyk7CisJCWJyZWFrOworCWNhc2UgVklERU9TSVpFXzE3NngxNDQ6CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMDApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBjMCwgMHgwMTExKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYmMsIDB4MDEyYyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDgwLCAweDAxMmIpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTA4KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDEsIDB4MDEzMyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDliLCAweDAxMGYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBiYiwgMHgwMTBmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDM4LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZWE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMGEsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA1YywgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZlYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwNCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBmYiwgMHgwMTJlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4YTI4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQwNTUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDBjLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwOSwgMHgwMTJlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGFhMjgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxMiwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA4LCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDgyYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDJhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZmZhLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzQsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZlYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDM4LCAweDAxMTkpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBkNiwgMHgwMTA3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDMsIDB4MDEwNik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDE4LCAweDAxMDcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMywgMHgwMTA2KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZDAsIDB4MDExMSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGI5LCAweDAxMGEpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMSwgMHgwMTAyKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMmMsIDB4MDEwMyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMDQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAyNCwgMHgwMTA1KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDE2LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDcsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMzApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ODJhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMTQsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDFhLCAweDAxMzApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4OGEwYSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNWUsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg5NTQ1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMTgsIDB4MDEyZSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDQ5LCAweDAxMzApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4OGEyOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMDU1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxYywgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYzcsIDB4MDEyZSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhhYTI4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzIsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAyOCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4MmE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzNiwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDgsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQ1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmZmYSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDFlLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMTAsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDEzLCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAyYSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDhhMjgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDEwLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA2ZCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmVhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDM4LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDQsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZWE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBjMCwgMHgwMTBjKTsKKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfMzIweDI0MDoKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGMwLCAweDAxMTEpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBiYywgMHgwMTJjKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwODAsIDB4MDEyYik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMDgpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMSwgMHgwMTMzKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwOWIsIDB4MDEwZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGJiLCAweDAxMGYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzgsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZlYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwYSwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDVjLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmVhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA0LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGZiLCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDhhMjgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDA1NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMGMsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA5LCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4YWEyOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDEyLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDgsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMzApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ODJhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMmEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZmZmEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzNCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmVhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNzAsIDB4MDExOSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGQyLCAweDAxMDcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMywgMHgwMTA2KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNWUsIDB4MDEwNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAzLCAweDAxMDYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBkMCwgMHgwMTExKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzksIDB4MDEwYSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMDIpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAyOCwgMHgwMTAzKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDFlLCAweDAxMDUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMTYsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwYSwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4MmE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxNCwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDgsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQ1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMWEsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4YTBhLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA1YSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDk1NDUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxOCwgMHgwMTJlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNDMsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4YTI4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQwNTUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDFjLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBlYiwgMHgwMTJlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGFhMjgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzMiwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDgyYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDM2LCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwOCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZmZhLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMWUsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxNywgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMTMsIDB4MDEyZSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDMxLCAweDAxMzApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4OGEyOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMTcsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDc4LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZWE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzgsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwNCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZlYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGMwLCAweDAxMGMpOworCQlicmVhazsKKwljYXNlIFZJREVPU0laRV8zNTJ4Mjg4OgorCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTAwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYzAsIDB4MDExMSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGJjLCAweDAxMmMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA4MCwgMHgwMTJiKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwOCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMzMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA5YiwgMHgwMTBmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYmIsIDB4MDEwZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzOCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmVhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDBhLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNWMsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZWE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDQsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZmIsIDB4MDEyZSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMzApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4OGEyOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMDU1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwYywgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDksIDB4MDEyZSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhhYTI4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMTIsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQxLCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwOCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4MmE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAyYSwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQ1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmZmYSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDM0LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhmZWE4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA3MCwgMHgwMTE5KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZjIsIDB4MDEwNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAzLCAweDAxMDYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA4YywgMHgwMTA3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDMsIDB4MDEwNik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGMwLCAweDAxMTEpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzOSwgMHgwMTBhKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDEsIDB4MDEwMik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDJjLCAweDAxMDMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTA0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMjQsIDB4MDEwNSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxNiwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA2LCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhYSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDgyYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDE0LCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMiwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDUsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxYSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDhhMGEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDVlLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4OTU0NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDE4LCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA0OSwgMHgwMTMwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDhhMjgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDA1NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMWMsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGNmLCAweDAxMmUpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4YWEyOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYWEsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDMyLCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0MSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyNyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMzApOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ODJhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMzYsIDB4MDEyZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA4LCAweDAxMmYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZDE0NSwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZmZmEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxZSwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDEwLCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxMywgMHgwMTJlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMjUsIDB4MDEzMCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHg4YTI4LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxMCwgMHgwMTJkKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNDgsIDB4MDEyZik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHhkMTQ1LCAweDAxMjQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGZlYTgsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGFhLCAweDAxMmQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAzOCwgMHgwMTJmKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGQxNDEsIDB4MDEyNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA0LCAweDAxMjcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4ZmVhOCwgMHgwMTI0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwYzAsIDB4MDEwYyk7CisJCWJyZWFrOyAKKwl9CisJdXNiX2NsZWFyX2hhbHQodXZkLT5kZXYsIHVzYl9yY3Zpc29jcGlwZSh1dmQtPmRldiwgdXZkLT52aWRlb19lbmRwKSk7Cit9CisKK3N0YXRpYyB2b2lkIGlibWNhbV9tb2RlbDNfc2V0dXBfYWZ0ZXJfdmlkZW9faWYoc3RydWN0IHV2ZCAqdXZkKQoreworCWludCBpOworCS8qCisJICogMDEuMDEuMDggLSBBZGRlZCBmb3IgUkNBIHZpZGVvIGluIHN1cHBvcnQgLUxPCisJICogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBpbml0IHRoZSBNb2RlbDMgY2FtIHRvIHVzZSB0aGUgUkNBIHZpZGVvIGluIHBvcnQKKwkgKiBpbnN0ZWFkIG9mIHRoZSBDQ0Qgc2Vuc29yLgorCSAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RydWN0X2luaXREYXRhIGluaXREYXRhW10gPSB7CisJCXswLCAweDAwMDAsIDB4MDEwY30sCisJCXswLCAweDAwMDYsIDB4MDEyY30sCisJCXswLCAweDAwNzgsIDB4MDEyZH0sCisJCXswLCAweDAwNDYsIDB4MDEyZn0sCisJCXswLCAweGQxNDEsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZlYTgsIDB4MDEyNH0sCisJCXsxLCAweDAwMDAsIDB4MDExNn0sCisJCXswLCAweDAwNjQsIDB4MDExNn0sCisJCXsxLCAweDAwMDAsIDB4MDExNX0sCisJCXswLCAweDAwMDMsIDB4MDExNX0sCisJCXswLCAweDAwMDgsIDB4MDEyM30sCisJCXswLCAweDAwMDAsIDB4MDExN30sCisJCXswLCAweDAwMDAsIDB4MDExMn0sCisJCXswLCAweDAwODAsIDB4MDEwMH0sCisJCXswLCAweDAwMDAsIDB4MDEwMH0sCisJCXsxLCAweDAwMDAsIDB4MDExNn0sCisJCXswLCAweDAwNjAsIDB4MDExNn0sCisJCXswLCAweDAwMDIsIDB4MDExMn0sCisJCXswLCAweDAwMDAsIDB4MDEyM30sCisJCXswLCAweDAwMDEsIDB4MDExN30sCisJCXswLCAweDAwNDAsIDB4MDEwOH0sCisJCXswLCAweDAwMTksIDB4MDEyY30sCisJCXswLCAweDAwNDAsIDB4MDExNn0sCisJCXswLCAweDAwMGEsIDB4MDExNX0sCisJCXswLCAweDAwMGIsIDB4MDExNX0sCisJCXswLCAweDAwNzgsIDB4MDEyZH0sCisJCXswLCAweDAwNDYsIDB4MDEyZn0sCisJCXswLCAweGQxNDEsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZlYTgsIDB4MDEyNH0sCisJCXswLCAweDAwNjQsIDB4MDExNn0sCisJCXswLCAweDAwMDAsIDB4MDExNX0sCisJCXswLCAweDAwMDEsIDB4MDExNX0sCisJCXswLCAweGZmZmYsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwYWEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZmYsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwZjIsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMGYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZmYsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwZjgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwZmMsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZmYsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwZjksIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwM2MsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZmYsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMjcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMTksIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMjEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwNDUsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMmEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMGUsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMmIsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwZjQsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMmMsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDQsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMmQsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMTQsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMmUsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDMsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMmYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDMsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMTQsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwNDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwNDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwNTMsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEwMX0sCisJCXswLCAweDAwYTAsIDB4MDEwM30sCisJCXswLCAweDAwNzgsIDB4MDEwNX0sCisJCXswLCAweDAwMDAsIDB4MDEwYX0sCisJCXswLCAweDAwMjQsIDB4MDEwYn0sCisJCXswLCAweDAwMjgsIDB4MDExOX0sCisJCXswLCAweDAwODgsIDB4MDExYn0sCisJCXswLCAweDAwMDIsIDB4MDExZH0sCisJCXswLCAweDAwMDMsIDB4MDExZX0sCisJCXswLCAweDAwMDAsIDB4MDEyOX0sCisJCXswLCAweDAwZmMsIDB4MDEyYn0sCisJCXswLCAweDAwMDgsIDB4MDEwMn0sCisJCXswLCAweDAwMDAsIDB4MDEwNH0sCisJCXswLCAweDAwMDgsIDB4MDExYX0sCisJCXswLCAweDAwMjgsIDB4MDExY30sCisJCXswLCAweDAwMjEsIDB4MDEyYX0sCisJCXswLCAweDAwMDAsIDB4MDExOH0sCisJCXswLCAweDAwMDAsIDB4MDEzMn0sCisJCXswLCAweDAwMDAsIDB4MDEwOX0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwNDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwNDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwZGMsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzIsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMjAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDEsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwNDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwNDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzcsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweGZmZjksIDB4MDEyNH0sCisJCXswLCAweDAwODYsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMzgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDgsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweDAwMDAsIDB4MDEyN30sCisJCXswLCAweGZmZjgsIDB4MDEyNH0sCisJCXswLCAweGZmZmQsIDB4MDEyNH0sCisJCXswLCAweGZmZmEsIDB4MDEyNH0sCisJCXswLCAweDAwMDMsIDB4MDEwNn0sCisJCXswLCAweDAwNjIsIDB4MDEwN30sCisJCXswLCAweDAwMDMsIDB4MDExMX0sCisJfTsKKyNkZWZpbmUgTlVNX0lOSVRfREFUQSAKKworCXVuc2lnbmVkIHNob3J0IGNvbXByZXNzaW9uID0gMDsJLyogMD1ub25lLCA3PWJlc3QgZnJhbWUgcmF0ZSAgKi8KKwlpbnQgZl9yYXRlOyAvKiAwPUZhc3Rlc3QgNz1zbG93ZXN0ICovCisKKwlpZiAoSUJNQ0FNX1QodXZkKS0+aW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCS8qIEludGVybmFsIGZyYW1lIHJhdGUgaXMgY29udHJvbGxlZCBieSBmX3JhdGUgdmFsdWUgKi8KKwlmX3JhdGUgPSA3IC0gZnJhbWVyYXRlOworCVJFU1RSSUNUX1RPX1JBTkdFKGZfcmF0ZSwgMCwgNyk7CisKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTAwKTsKKwlpYm1jYW1fdmVpbyh1dmQsIDEsIDB4MDAwMCwgMHgwMTE2KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA2MCwgMHgwMTE2KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMiwgMHgwMTEyKTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTIzKTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMSwgMHgwMTE3KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA0MCwgMHgwMTA4KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxOSwgMHgwMTJjKTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA2MCwgMHgwMTE2KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMiwgMHgwMTE1KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMywgMHgwMTE1KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDEsIDB4MDAwMCwgMHgwMTE1KTsKKwlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwYiwgMHgwMTE1KTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMGEsIDB4MDA0MCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDBiLCAweDAwZjYpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAwYywgMHgwMDAyKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMGQsIDB4MDAyMCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDBlLCAweDAwMzMpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAwZiwgMHgwMDA3KTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMTAsIDB4MDAwMCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDExLCAweDAwNzApOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAxMiwgMHgwMDMwKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMTMsIDB4MDAwMCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDE0LCAweDAwMDEpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAxNSwgMHgwMDAxKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMTYsIDB4MDAwMSk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDE3LCAweDAwMDEpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAxOCwgMHgwMDAwKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMWUsIDB4MDBjMyk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDIwLCAweDAwMDApOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAyOCwgMHgwMDEwKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMjksIDB4MDA1NCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDJhLCAweDAwMTMpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAyYiwgMHgwMDA3KTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMmQsIDB4MDAyOCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDJlLCAweDAwMDApOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAzMSwgMHgwMDAwKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMzIsIDB4MDAwMCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDMzLCAweDAwMDApOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAzNCwgMHgwMDAwKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMzUsIDB4MDAzOCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDNhLCAweDAwMDEpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAzYywgMHgwMDFlKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwM2YsIDB4MDAwYSk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDQxLCAweDAwMDApOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA0NiwgMHgwMDNmKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNDcsIDB4MDAwMCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDUwLCAweDAwMDUpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA1MiwgMHgwMDFhKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNTMsIDB4MDAwMyk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDVhLCAweDAwNmIpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA1ZCwgMHgwMDFlKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNWUsIDB4MDAzMCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDVmLCAweDAwNDEpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA2NCwgMHgwMDA4KTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNjUsIDB4MDAxNSk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDY4LCAweDAwMGYpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA3OSwgMHgwMDAwKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwN2EsIDB4MDAwMCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDdjLCAweDAwM2YpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA4MiwgMHgwMDBmKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwODUsIDB4MDAwMCk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDk5LCAweDAwMDApOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA5YiwgMHgwMDIzKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwOWMsIDB4MDAyMik7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDlkLCAweDAwOTYpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA5ZSwgMHgwMDk2KTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwOWYsIDB4MDAwYSk7CisKKwlzd2l0Y2ggKHV2ZC0+dmlkZW9zaXplKSB7CisJY2FzZSBWSURFT1NJWkVfMTYweDEyMDoKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwMSk7IC8qIFNhbWUgb24gMTc2eDE0NCwgMzIweDI0MCAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhMCwgMHgwMTAzKTsgLyogU2FtZSBvbiAxNzZ4MTQ0LCAzMjB4MjQwICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDc4LCAweDAxMDUpOyAvKiBTYW1lIG9uIDE3NngxNDQsIDMyMHgyNDAgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwYSk7IC8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMjQsIDB4MDEwYik7IC8qIERpZmZlcnMgZXZlcnl3aGVyZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhOSwgMHgwMTE5KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMTYsIDB4MDExYik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAyLCAweDAxMWQpOyAvKiBTYW1lIG9uIDE3NngxNDQsIDMyMHgyNDAgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDMsIDB4MDExZSk7IC8qIFNhbWUgb24gMTc2eDE0NCwgNjQweDQ4MCAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTI5KTsgLyogU2FtZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBmYywgMHgwMTJiKTsgLyogU2FtZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxOCwgMHgwMTAyKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDQsIDB4MDEwNCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA0LCAweDAxMWEpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAyOCwgMHgwMTFjKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMjIsIDB4MDEyYSk7IC8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDExOCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMzIpOworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMjEsIDB4MDAwMSk7IC8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCBjb21wcmVzc2lvbiwgMHgwMTA5KTsKKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfMzIweDI0MDoKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwMSk7IC8qIFNhbWUgb24gMTc2eDE0NCwgMzIweDI0MCAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhMCwgMHgwMTAzKTsgLyogU2FtZSBvbiAxNzZ4MTQ0LCAzMjB4MjQwICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDc4LCAweDAxMDUpOyAvKiBTYW1lIG9uIDE3NngxNDQsIDMyMHgyNDAgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwYSk7IC8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMjgsIDB4MDEwYik7IC8qIERpZmZlcnMgZXZlcnl3aGVyZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMiwgMHgwMTFkKTsgLyogU2FtZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTFlKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEyOSk7IC8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZmMsIDB4MDEyYik7IC8qIFNhbWUgKi8KKwkJLyogNCBjb21tYW5kcyBmcm9tIDE2MHgxMjAgc2tpcHBlZCAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAyMiwgMHgwMTJhKTsgLyogU2FtZSAqLworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMjEsIDB4MDAwMSk7IC8qIFNhbWUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCBjb21wcmVzc2lvbiwgMHgwMTA5KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZDksIDB4MDExOSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA2LCAweDAxMWIpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAyMSwgMHgwMTAyKTsgLyogU2FtZSBvbiAzMjB4MjQwLCA2NDB4NDgwICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDEwLCAweDAxMDQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwNCwgMHgwMTFhKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwM2YsIDB4MDExYyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDFjLCAweDAxMTgpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTMyKTsKKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfNjQweDQ4MDoKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZjAsIDB4MDEwNSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMGEpOyAvKiBTYW1lICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDM4LCAweDAxMGIpOyAvKiBEaWZmZXJzIGV2ZXJ5d2hlcmUgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwZDksIDB4MDExOSk7IC8qIFNhbWUgb24gMzIweDI0MCwgNjQweDQ4MCAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwNiwgMHgwMTFiKTsgLyogU2FtZSBvbiAzMjB4MjQwLCA2NDB4NDgwICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA0LCAweDAxMWQpOyAvKiBOQyAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMywgMHgwMTFlKTsgLyogU2FtZSBvbiAxNzZ4MTQ0LCA2NDB4NDgwICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMjkpOyAvKiBTYW1lICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGZjLCAweDAxMmIpOyAvKiBTYW1lICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDIxLCAweDAxMDIpOyAvKiBTYW1lIG9uIDMyMHgyNDAsIDY0MHg0ODAgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMTYsIDB4MDEwNCk7IC8qIE5DICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA0LCAweDAxMWEpOyAvKiBTYW1lIG9uIDMyMHgyNDAsIDY0MHg0ODAgKi8KKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwM2YsIDB4MDExYyk7IC8qIFNhbWUgb24gMzIweDI0MCwgNjQweDQ4MCAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAyMiwgMHgwMTJhKTsgLyogU2FtZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAxYywgMHgwMTE4KTsgLyogU2FtZSBvbiAzMjB4MjQwLCA2NDB4NDgwICovCisJCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAyMSwgMHgwMDAxKTsgLyogU2FtZSAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIGNvbXByZXNzaW9uLCAweDAxMDkpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDA0MCwgMHgwMTAxKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwNDAsIDB4MDEwMyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMzIpOyAvKiBTYW1lIG9uIDMyMHgyNDAsIDY0MHg0ODAgKi8KKwkJYnJlYWs7CisJfQorCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA3ZSwgMHgwMDBlKTsJLyogSHVlICovCisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDM2LCAweDAwMTEpOwkvKiBCcmlnaHRuZXNzICovCisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDYwLCAweDAwMDIpOwkvKiBTaGFycG5lc3MgKi8KKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNjEsIDB4MDAwNCk7CS8qIFNoYXJwbmVzcyAqLworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA2MiwgMHgwMDA1KTsJLyogU2hhcnBuZXNzICovCisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDYzLCAweDAwMTQpOwkvKiBTaGFycG5lc3MgKi8KKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwOTYsIDB4MDBhMCk7CS8qIFJlZCBnYWluICovCisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDk3LCAweDAwOTYpOwkvKiBCbHVlIGdhaW4gKi8KKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNjcsIDB4MDAwMSk7CS8qIENvbnRyYXN0ICovCisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDViLCAweDAwMGMpOwkvKiBDb250cmFzdCAqLworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA1YywgMHgwMDE2KTsJLyogQ29udHJhc3QgKi8KKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwOTgsIDB4MDAwYik7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDJjLCAweDAwMDMpOwkvKiBXYXMgMSwgYnJva2UgNjQweDQ4MCAqLworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAyZiwgMHgwMDJhKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMzAsIDB4MDAyOSk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDM3LCAweDAwMDIpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAzOCwgMHgwMDU5KTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwM2QsIDB4MDAyZSk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDNlLCAweDAwMjgpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA3OCwgMHgwMDA1KTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwN2IsIDB4MDAxMSk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDdkLCAweDAwNGIpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA3ZiwgMHgwMDIyKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwODAsIDB4MDAwYyk7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDgxLCAweDAwMGIpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA4MywgMHgwMGZkKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwODYsIDB4MDAwYik7CisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDg3LCAweDAwMGIpOworCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA3ZSwgMHgwMDBlKTsKKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwOTYsIDB4MDBhMCk7CS8qIFJlZCBnYWluICovCisJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDk3LCAweDAwOTYpOwkvKiBCbHVlIGdhaW4gKi8KKwlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwOTgsIDB4MDAwYik7CisKKwlzd2l0Y2ggKHV2ZC0+dmlkZW9zaXplKSB7CisJY2FzZSBWSURFT1NJWkVfMTYweDEyMDoKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDIsIDB4MDEwNik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA4LCAweDAxMDcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIGZfcmF0ZSwgMHgwMTExKTsJLyogRnJhbWUgcmF0ZSAqLworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMWYsIDB4MDAwMCk7IC8qIFNhbWUgKi8KKwkJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDM5LCAweDAwMWYpOyAvKiBTYW1lICovCisJCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAzYiwgMHgwMDNjKTsgLyogU2FtZSAqLworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNDAsIDB4MDAwYSk7CisJCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA1MSwgMHgwMDBhKTsKKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfMzIweDI0MDoKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDMsIDB4MDEwNik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDYyLCAweDAxMDcpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIGZfcmF0ZSwgMHgwMTExKTsJLyogRnJhbWUgcmF0ZSAqLworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMWYsIDB4MDAwMCk7IC8qIFNhbWUgKi8KKwkJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDM5LCAweDAwMWYpOyAvKiBTYW1lICovCisJCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAzYiwgMHgwMDNjKTsgLyogU2FtZSAqLworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNDAsIDB4MDAwOCk7CisJCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDA1MSwgMHgwMDBiKTsKKwkJYnJlYWs7CisJY2FzZSBWSURFT1NJWkVfNjQweDQ4MDoKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDIsIDB4MDEwNik7CS8qIEFkanVzdG1lbnRzICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGI0LCAweDAxMDcpOwkvKiBBZGp1c3RtZW50cyAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIGZfcmF0ZSwgMHgwMTExKTsJLyogRnJhbWUgcmF0ZSAqLworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwMWYsIDB4MDAwMik7IC8qICFTYW1lICovCisJCWlibWNhbV9tb2RlbDNfUGFja2V0MSh1dmQsIDB4MDAzOSwgMHgwMDNlKTsgLyogIVNhbWUgKi8KKwkJaWJtY2FtX21vZGVsM19QYWNrZXQxKHV2ZCwgMHgwMDQwLCAweDAwMDgpOworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNTEsIDB4MDAwYSk7CisJCWJyZWFrOworCX0KKworCS8qIDAxLjAxLjA4IC0gQWRkZWQgZm9yIFJDQSB2aWRlbyBpbiBzdXBwb3J0IC1MTyAqLworCWlmKGluaXRfbW9kZWwzX2lucHV0KSB7CisJCWlmIChkZWJ1ZyA+IDApCisJCQlpbmZvKCJTZXR0aW5nIGlucHV0IHRvIFJDQS4iKTsKKwkJZm9yIChpPTA7IGkgPCAoc2l6ZW9mKGluaXREYXRhKS9zaXplb2YoaW5pdERhdGFbMF0pKTsgaSsrKSB7CisJCQlpYm1jYW1fdmVpbyh1dmQsIGluaXREYXRhW2ldLnJlcSwgaW5pdERhdGFbaV0udmFsdWUsIGluaXREYXRhW2ldLmluZGV4KTsKKwkJfQorCX0KKworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMTQpOworCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMGMwLCAweDAxMGMpOworCXVzYl9jbGVhcl9oYWx0KHV2ZC0+ZGV2LCB1c2JfcmN2aXNvY3BpcGUodXZkLT5kZXYsIHV2ZC0+dmlkZW9fZW5kcCkpOworfQorCisvKgorICogaWJtY2FtX3ZpZGVvX3N0b3AoKQorICoKKyAqIFRoaXMgY29kZSB0ZWxscyBjYW1lcmEgdG8gc3RvcCBzdHJlYW1pbmcuIFRoZSBpbnRlcmZhY2UgcmVtYWlucworICogY29uZmlndXJlZCBhbmQgYmFuZHdpZHRoIC0gY2xhaW1lZC4KKyAqLworc3RhdGljIHZvaWQgaWJtY2FtX3ZpZGVvX3N0b3Aoc3RydWN0IHV2ZCAqdXZkKQoreworCXN3aXRjaCAoSUJNQ0FNX1QodXZkKS0+Y2FtZXJhX21vZGVsKSB7CisJY2FzZSBJQk1DQU1fTU9ERUxfMToKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwLCAweDAxMGMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAsIDB4MDEwYyk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMSwgMHgwMTE0KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweGMwLCAweDAxMGMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAsIDB4MDEwYyk7CisJCWlibWNhbV9zZW5kX0ZGXzA0XzAyKHV2ZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMSwgMHgwMCwgMHgwMTAwKTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDgxLCAweDAxMDApOwkvKiBMRUQgT2ZmICovCisJCWJyZWFrOworCWNhc2UgSUJNQ0FNX01PREVMXzI6CitjYXNlIElCTUNBTV9NT0RFTF80OgorCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTBjKTsJLyogU3RvcCB0aGUgY2FtZXJhICovCisKKwkJaWJtY2FtX21vZGVsMl9QYWNrZXQxKHV2ZCwgMHgwMDMwLCAweDAwMDQpOworCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDgwLCAweDAxMDApOwkvKiBMRUQgT2ZmICovCisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDIwLCAweDAxMTEpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBhMCwgMHgwMTExKTsKKworCQlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCAweDAwMzAsIDB4MDAwMik7CisKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMjAsIDB4MDExMSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAwLCAweDAxMTIpOworCQlicmVhazsKKwljYXNlIElCTUNBTV9NT0RFTF8zOgorI2lmIDEKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDEwYyk7CisKKwkJLyogSGVyZSB3ZSBhcmUgc3VwcG9zZWQgdG8gc2VsZWN0IHZpZGVvIGludGVyZmFjZSBhbHQuIHNldHRpbmcgMCAqLworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwNiwgMHgwMTJjKTsKKworCQlpYm1jYW1fbW9kZWwzX1BhY2tldDEodXZkLCAweDAwNDYsIDB4MDAwMCk7CisKKwkJaWJtY2FtX3ZlaW8odXZkLCAxLCAweDAwMDAsIDB4MDExNik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDY0LCAweDAxMTYpOworCQlpYm1jYW1fdmVpbyh1dmQsIDEsIDB4MDAwMCwgMHgwMTE1KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDMsIDB4MDExNSk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDA4LCAweDAxMjMpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDAwMCwgMHgwMTE3KTsKKwkJaWJtY2FtX3ZlaW8odXZkLCAwLCAweDAwMDAsIDB4MDExMik7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDgwLCAweDAxMDApOworCQlJQk1DQU1fVCh1dmQpLT5pbml0aWFsaXplZCA9IDA7CisjZW5kaWYKKwkJYnJlYWs7CisJfSAvKiBzd2l0Y2ggKi8KK30KKworLyoKKyAqIGlibWNhbV9yZWluaXRfaXNvKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBzZW5kcyBjb3VwbGUgb2YgY29tbWFuZHMgdG8gdGhlIGNhbWVyYSBhbmQgdGhlbgorICogcmVzZXRzIHRoZSB2aWRlbyBwaXBlLiBUaGlzIHNlcXVlbmNlIHdhcyBvYnNlcnZlZCB0byByZWluaXQgdGhlCisgKiBjYW1lcmEgb3IsIGF0IGxlYXN0LCB0byBpbml0aWF0ZSBJU08gZGF0YSBzdHJlYW0uCisgKgorICogSGlzdG9yeToKKyAqIDEvMi8wMCAgIENyZWF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGlibWNhbV9yZWluaXRfaXNvKHN0cnVjdCB1dmQgKnV2ZCwgaW50IGRvX3N0b3ApCit7CisJc3dpdGNoIChJQk1DQU1fVCh1dmQpLT5jYW1lcmFfbW9kZWwpIHsKKwljYXNlIElCTUNBTV9NT0RFTF8xOgorCQlpZiAoZG9fc3RvcCkKKwkJCWlibWNhbV92aWRlb19zdG9wKHV2ZCk7CisJCWlibWNhbV92ZWlvKHV2ZCwgMCwgMHgwMDAxLCAweDAxMTQpOworCQlpYm1jYW1fdmVpbyh1dmQsIDAsIDB4MDBjMCwgMHgwMTBjKTsKKwkJdXNiX2NsZWFyX2hhbHQodXZkLT5kZXYsIHVzYl9yY3Zpc29jcGlwZSh1dmQtPmRldiwgdXZkLT52aWRlb19lbmRwKSk7CisJCWlibWNhbV9tb2RlbDFfc2V0dXBfYWZ0ZXJfdmlkZW9faWYodXZkKTsKKwkJYnJlYWs7CisJY2FzZSBJQk1DQU1fTU9ERUxfMjoKKwkJaWJtY2FtX21vZGVsMl9zZXR1cF9hZnRlcl92aWRlb19pZih1dmQpOworCQlicmVhazsKKwljYXNlIElCTUNBTV9NT0RFTF8zOgorCQlpYm1jYW1fdmlkZW9fc3RvcCh1dmQpOworCQlpYm1jYW1fbW9kZWwzX3NldHVwX2FmdGVyX3ZpZGVvX2lmKHV2ZCk7CisJCWJyZWFrOworCWNhc2UgSUJNQ0FNX01PREVMXzQ6CisJCWlibWNhbV9tb2RlbDRfc2V0dXBfYWZ0ZXJfdmlkZW9faWYodXZkKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBpYm1jYW1fdmlkZW9fc3RhcnQoc3RydWN0IHV2ZCAqdXZkKQoreworCWlibWNhbV9jaGFuZ2VfbGlnaHRpbmdfY29uZGl0aW9ucyh1dmQpOworCWlibWNhbV9zZXRfc2hhcnBuZXNzKHV2ZCk7CisJaWJtY2FtX3JlaW5pdF9pc28odXZkLCAwKTsKK30KKworLyoKKyAqIFJldHVybiBuZWdhdGl2ZSBjb2RlIG9uIGZhaWx1cmUsIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBpYm1jYW1fc2V0dXBfb25fb3BlbihzdHJ1Y3QgdXZkICp1dmQpCit7CisJaW50IHNldHVwX29rID0gMDsgLyogU3VjY2VzcyBieSBkZWZhdWx0ICovCisJLyogU2VuZCBpbml0IHNlcXVlbmNlIG9ubHkgb25jZSwgaXQncyBsYXJnZSEgKi8KKwlpZiAoIUlCTUNBTV9UKHV2ZCktPmluaXRpYWxpemVkKSB7IC8qIEZJWE1FIHJlbmFtZSAqLworCQlzd2l0Y2ggKElCTUNBTV9UKHV2ZCktPmNhbWVyYV9tb2RlbCkgeworCQljYXNlIElCTUNBTV9NT0RFTF8xOgorCQkJc2V0dXBfb2sgPSBpYm1jYW1fbW9kZWwxX3NldHVwKHV2ZCk7CisJCQlicmVhazsKKwkJY2FzZSBJQk1DQU1fTU9ERUxfMjoKKwkJCXNldHVwX29rID0gaWJtY2FtX21vZGVsMl9zZXR1cCh1dmQpOworCQkJYnJlYWs7CisJCWNhc2UgSUJNQ0FNX01PREVMXzM6CisJCWNhc2UgSUJNQ0FNX01PREVMXzQ6CisJCQkvKiBXZSBkbyBhbGwgc2V0dXAgd2hlbiBJc29jIHN0cmVhbSBpcyByZXF1ZXN0ZWQgKi8KKwkJCWJyZWFrOworCQl9CisJCUlCTUNBTV9UKHV2ZCktPmluaXRpYWxpemVkID0gKHNldHVwX29rICE9IDApOworCX0KKwlyZXR1cm4gc2V0dXBfb2s7Cit9CisKK3N0YXRpYyB2b2lkIGlibWNhbV9jb25maWd1cmVfdmlkZW8oc3RydWN0IHV2ZCAqdXZkKQoreworCWlmICh1dmQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJUkVTVFJJQ1RfVE9fUkFOR0UoaW5pdF9icmlnaHRuZXNzLCAwLCAyNTUpOworCVJFU1RSSUNUX1RPX1JBTkdFKGluaXRfY29udHJhc3QsIDAsIDI1NSk7CisJUkVTVFJJQ1RfVE9fUkFOR0UoaW5pdF9jb2xvciwgMCwgMjU1KTsKKwlSRVNUUklDVF9UT19SQU5HRShpbml0X2h1ZSwgMCwgMjU1KTsKKwlSRVNUUklDVF9UT19SQU5HRShodWVfY29ycmVjdGlvbiwgMCwgMjU1KTsKKworCW1lbXNldCgmdXZkLT52cGljLCAwLCBzaXplb2YodXZkLT52cGljKSk7CisJbWVtc2V0KCZ1dmQtPnZwaWNfb2xkLCAweDU1LCBzaXplb2YodXZkLT52cGljX29sZCkpOworCisJdXZkLT52cGljLmNvbG91ciA9IGluaXRfY29sb3IgPDwgODsKKwl1dmQtPnZwaWMuaHVlID0gaW5pdF9odWUgPDwgODsKKwl1dmQtPnZwaWMuYnJpZ2h0bmVzcyA9IGluaXRfYnJpZ2h0bmVzcyA8PCA4OworCXV2ZC0+dnBpYy5jb250cmFzdCA9IGluaXRfY29udHJhc3QgPDwgODsKKwl1dmQtPnZwaWMud2hpdGVuZXNzID0gMTA1IDw8IDg7IC8qIFRoaXMgb25lIGlzbid0IHVzZWQgKi8KKwl1dmQtPnZwaWMuZGVwdGggPSAyNDsKKwl1dmQtPnZwaWMucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7CisKKwltZW1zZXQoJnV2ZC0+dmNhcCwgMCwgc2l6ZW9mKHV2ZC0+dmNhcCkpOworCXN0cmNweSh1dmQtPnZjYXAubmFtZSwgIklCTSBVU0IgQ2FtZXJhIik7CisJdXZkLT52Y2FwLnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFOworCXV2ZC0+dmNhcC5jaGFubmVscyA9IDE7CisJdXZkLT52Y2FwLmF1ZGlvcyA9IDA7CisJdXZkLT52Y2FwLm1heHdpZHRoID0gVklERU9TSVpFX1godXZkLT5jYW52YXMpOworCXV2ZC0+dmNhcC5tYXhoZWlnaHQgPSBWSURFT1NJWkVfWSh1dmQtPmNhbnZhcyk7CisJdXZkLT52Y2FwLm1pbndpZHRoID0gbWluX2NhbnZhc1dpZHRoOworCXV2ZC0+dmNhcC5taW5oZWlnaHQgPSBtaW5fY2FudmFzSGVpZ2h0OworCisJbWVtc2V0KCZ1dmQtPnZjaGFuLCAwLCBzaXplb2YodXZkLT52Y2hhbikpOworCXV2ZC0+dmNoYW4uZmxhZ3MgPSAwOworCXV2ZC0+dmNoYW4udHVuZXJzID0gMDsKKwl1dmQtPnZjaGFuLmNoYW5uZWwgPSAwOworCXV2ZC0+dmNoYW4udHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOworCXN0cmNweSh1dmQtPnZjaGFuLm5hbWUsICJDYW1lcmEiKTsKK30KKworLyoKKyAqIGlibWNhbV9wcm9iZSgpCisgKgorICogVGhpcyBwcm9jZWR1cmUgcXVlcmllcyBkZXZpY2UgZGVzY3JpcHRvciBhbmQgYWNjZXB0cyB0aGUgaW50ZXJmYWNlCisgKiBpZiBpdCBsb29rcyBsaWtlIElCTSBDLWl0IGNhbWVyYS4KKyAqCisgKiBIaXN0b3J5OgorICogMjItSmFuLTIwMDAgTW92ZWQgY2FtZXJhIGluaXQgY29kZSB0byBpYm1jYW1fb3BlbigpCisgKiAyNz1KYW4tMjAwMCBDaGFuZ2VkIHRvIHVzZSBzdGF0aWMgc3RydWN0dXJlcywgYWRkZWQgbG9ja2luZy4KKyAqIDI0LU1heS0yMDAwIENvcnJlY3RlZCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uIChNT0RfeHh4X1VTRV9DT1VOVCkuCisgKiAwMy1KdWwtMjAwMCBGaXhlZCBlbmRpYW5uZXNzIGJ1Zy4KKyAqIDEyLU5vdi0yMDAwIFJld29ya2VkIHRvIGNvbXBseSB3aXRoIG5ldyBwcm9iZSgpIHNpZ25hdHVyZS4KKyAqIDIzLUphbi0yMDAxIEFkZGVkIGNvbXBhdGliaWxpdHkgd2l0aCAyLjIueCBrZXJuZWxzLgorICovCitzdGF0aWMgaW50IGlibWNhbV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmRldmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB1dmQgKnV2ZCA9IE5VTEw7CisJaW50IGl4LCBpLCBuYXMsIG1vZGVsPTAsIGNhbnZhc1g9MCwgY2FudmFzWT0wOworCWludCBhY3RJbnRlcmZhY2U9LTEsIGluYWN0SW50ZXJmYWNlPS0xLCBtYXhQUz0wOworCV9fdTggaWZudW0gPSBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJdW5zaWduZWQgY2hhciB2aWRlb19lcCA9IDA7CisKKwlpZiAoZGVidWcgPj0gMSkKKwkJaW5mbygiaWJtY2FtX3Byb2JlKCVwLCV1LikiLCBpbnRmLCBpZm51bSk7CisKKwkvKiBXZSBkb24ndCBoYW5kbGUgbXVsdGktY29uZmlnIGNhbWVyYXMgKi8KKwlpZiAoZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIENoZWNrIHRoZSB2ZXJzaW9uL3JldmlzaW9uICovCisJc3dpdGNoIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSkgeworCWNhc2UgMHgwMDAyOgorCQlpZiAoaWZudW0gIT0gMikKKwkJCXJldHVybiAtRU5PREVWOworCQltb2RlbCA9IElCTUNBTV9NT0RFTF8xOworCQlicmVhazsKKwljYXNlIDB4MDMwQToKKwkJaWYgKGlmbnVtICE9IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBORVRDQU1fUFJPRFVDVF9JRCkgfHwKKwkJICAgIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBWRU9fODAwRF9QUk9EVUNUX0lEKSkKKwkJCW1vZGVsID0gSUJNQ0FNX01PREVMXzQ7CisJCWVsc2UKKwkJCW1vZGVsID0gSUJNQ0FNX01PREVMXzI7CisJCWJyZWFrOworCWNhc2UgMHgwMzAxOgorCQlpZiAoaWZudW0gIT0gMCkKKwkJCXJldHVybiAtRU5PREVWOworCQltb2RlbCA9IElCTUNBTV9NT0RFTF8zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoIklCTSBjYW1lcmEgd2l0aCByZXZpc2lvbiAweCUwNHggaXMgbm90IHN1cHBvcnRlZC4iLAorCQkJbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBQcmludCBkZXRhaWxlZCBpbmZvIG9uIHdoYXQgd2UgZm91bmQgc28gZmFyICovCisJZG8geworCQljaGFyICpicmFuZCA9IE5VTEw7CisJCXN3aXRjaCAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpIHsKKwkJY2FzZSBORVRDQU1fUFJPRFVDVF9JRDoKKwkJCWJyYW5kID0gIklCTSBOZXRDYW1lcmEiOworCQkJYnJlYWs7CisJCWNhc2UgVkVPXzgwMENfUFJPRFVDVF9JRDoKKwkJCWJyYW5kID0gIlZlbyBTdGluZ3JheSBbODAwQ10iOworCQkJYnJlYWs7CisJCWNhc2UgVkVPXzgwMERfUFJPRFVDVF9JRDoKKwkJCWJyYW5kID0gIlZlbyBTdGluZ3JheSBbODAwRF0iOworCQkJYnJlYWs7CisJCWNhc2UgSUJNQ0FNX1BST0RVQ1RfSUQ6CisJCWRlZmF1bHQ6CisJCQlicmFuZCA9ICJJQk0gUEMgQ2FtZXJhIjsgLyogYS5rLmEuIFhpcmxpbmsgQy1JdCAqLworCQkJYnJlYWs7CisJCX0KKwkJaW5mbygiJXMgVVNCIGNhbWVyYSBmb3VuZCAobW9kZWwgJWQsIHJldi4gMHglMDR4KSIsCisJCSAgICAgYnJhbmQsIG1vZGVsLCBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSk7CisJfSB3aGlsZSAoMCk7CisKKwkvKiBWYWxpZGF0ZSBmb3VuZCBpbnRlcmZhY2U6IG11c3QgaGF2ZSBvbmUgSVNPIGVuZHBvaW50ICovCisJbmFzID0gaW50Zi0+bnVtX2FsdHNldHRpbmc7CisJaWYgKGRlYnVnID4gMCkKKwkJaW5mbygiTnVtYmVyIG9mIGFsdGVybmF0ZSBzZXR0aW5ncz0lZC4iLCBuYXMpOworCWlmIChuYXMgPCAyKSB7CisJCWVycigiVG9vIGZldyBhbHRlcm5hdGUgc2V0dGluZ3MgZm9yIHRoaXMgY2FtZXJhISIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyogVmFsaWRhdGUgYWxsIGFsdGVybmF0ZSBzZXR0aW5ncyAqLworCWZvciAoaXg9MDsgaXggPCBuYXM7IGl4KyspIHsKKwkJY29uc3Qgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCisJCWludGVyZmFjZSA9ICZpbnRmLT5hbHRzZXR0aW5nW2l4XTsKKwkJaSA9IGludGVyZmFjZS0+ZGVzYy5iQWx0ZXJuYXRlU2V0dGluZzsKKwkJaWYgKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDEpIHsKKwkJCWVycigiSW50ZXJmYWNlICVkLiBoYXMgJXUuIGVuZHBvaW50cyEiLAorCQkJICAgIGlmbnVtLCAodW5zaWduZWQpKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzKSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7CisJCWlmICh2aWRlb19lcCA9PSAwKQorCQkJdmlkZW9fZXAgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJZWxzZSBpZiAodmlkZW9fZXAgIT0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpIHsKKwkJCWVycigiQWx0ZXJuYXRlIHNldHRpbmdzIGhhdmUgZGlmZmVyZW50IGVuZHBvaW50IGFkZHJlc3NlcyEiKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDB4MDMpICE9IDB4MDEpIHsKKwkJCWVycigiSW50ZXJmYWNlICVkLiBoYXMgbm9uLUlTTyBlbmRwb2ludCEiLCBpZm51bSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgPT0gMCkgeworCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBJU08gT1VUIGVuZHBvaW50ISIsIGlmbnVtKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmIChsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpID09IDApIHsKKwkJCWlmIChpbmFjdEludGVyZmFjZSA8IDApCisJCQkJaW5hY3RJbnRlcmZhY2UgPSBpOworCQkJZWxzZSB7CisJCQkJZXJyKCJNb3JlIHRoYW4gb25lIGluYWN0aXZlIGFsdC4gc2V0dGluZyEiKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChhY3RJbnRlcmZhY2UgPCAwKSB7CisJCQkJYWN0SW50ZXJmYWNlID0gaTsKKwkJCQltYXhQUyA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQkJaWYgKGRlYnVnID4gMCkKKwkJCQkJaW5mbygiQWN0aXZlIHNldHRpbmc9JWQuIG1heFBTPSVkLiIsIGksIG1heFBTKTsKKwkJCX0gZWxzZQorCQkJCWVycigiTW9yZSB0aGFuIG9uZSBhY3RpdmUgYWx0LiBzZXR0aW5nISBJZ25vcmluZyAjJWQuIiwgaSk7CisJCX0KKwl9CisJaWYgKChtYXhQUyA8PSAwKSB8fCAoYWN0SW50ZXJmYWNlIDwgMCkgfHwgKGluYWN0SW50ZXJmYWNlIDwgMCkpIHsKKwkJZXJyKCJGYWlsZWQgdG8gcmVjb2duaXplIHRoZSBjYW1lcmEhIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFZhbGlkYXRlIG9wdGlvbnMgKi8KKwlzd2l0Y2ggKG1vZGVsKSB7CisJY2FzZSBJQk1DQU1fTU9ERUxfMToKKwkJUkVTVFJJQ1RfVE9fUkFOR0UobGlnaHRpbmcsIDAsIDIpOworCQlSRVNUUklDVF9UT19SQU5HRShzaXplLCBTSVpFXzEyOHg5NiwgU0laRV8zNTJ4Mjg4KTsKKwkJaWYgKGZyYW1lcmF0ZSA8IDApCisJCQlmcmFtZXJhdGUgPSAyOworCQljYW52YXNYID0gMzUyOworCQljYW52YXNZID0gMjg4OworCQlicmVhazsKKwljYXNlIElCTUNBTV9NT0RFTF8yOgorCQlSRVNUUklDVF9UT19SQU5HRShsaWdodGluZywgMCwgMTUpOworCQlSRVNUUklDVF9UT19SQU5HRShzaXplLCBTSVpFXzE3NngxNDQsIFNJWkVfMzUyeDI0MCk7CisJCWlmIChmcmFtZXJhdGUgPCAwKQorCQkJZnJhbWVyYXRlID0gMjsKKwkJY2FudmFzWCA9IDM1MjsKKwkJY2FudmFzWSA9IDI0MDsKKwkJYnJlYWs7CisJY2FzZSBJQk1DQU1fTU9ERUxfMzoKKwkJUkVTVFJJQ1RfVE9fUkFOR0UobGlnaHRpbmcsIDAsIDE1KTsgLyogRklYTUUgKi8KKwkJc3dpdGNoIChzaXplKSB7CisJCWNhc2UgU0laRV8xNjB4MTIwOgorCQkJY2FudmFzWCA9IDE2MDsKKwkJCWNhbnZhc1kgPSAxMjA7CisJCQlpZiAoZnJhbWVyYXRlIDwgMCkKKwkJCQlmcmFtZXJhdGUgPSAyOworCQkJUkVTVFJJQ1RfVE9fUkFOR0UoZnJhbWVyYXRlLCAwLCA1KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaW5mbygiSUJNIGNhbWVyYTogdXNpbmcgMzIweDI0MCIpOworCQkJc2l6ZSA9IFNJWkVfMzIweDI0MDsKKwkJCS8qIE5vIGJyZWFrIGhlcmUgKi8KKwkJY2FzZSBTSVpFXzMyMHgyNDA6CisJCQljYW52YXNYID0gMzIwOworCQkJY2FudmFzWSA9IDI0MDsKKwkJCWlmIChmcmFtZXJhdGUgPCAwKQorCQkJCWZyYW1lcmF0ZSA9IDM7CisJCQlSRVNUUklDVF9UT19SQU5HRShmcmFtZXJhdGUsIDAsIDUpOworCQkJYnJlYWs7CisJCWNhc2UgU0laRV82NDB4NDgwOgorCQkJY2FudmFzWCA9IDY0MDsKKwkJCWNhbnZhc1kgPSA0ODA7CisJCQlmcmFtZXJhdGUgPSAwOwkvKiBTbG93ZXN0LCBhbmQgbWF5YmUgZXZlbiB0aGF0IGlzIHRvbyBmYXN0ICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElCTUNBTV9NT0RFTF80OgorCQlSRVNUUklDVF9UT19SQU5HRShsaWdodGluZywgMCwgMik7CisJCXN3aXRjaCAoc2l6ZSkgeworCQljYXNlIFNJWkVfMTI4eDk2OgorCQkJY2FudmFzWCA9IDEyODsKKwkJCWNhbnZhc1kgPSA5NjsKKwkJCWJyZWFrOworCQljYXNlIFNJWkVfMTYweDEyMDoKKwkJCWNhbnZhc1ggPSAxNjA7CisJCQljYW52YXNZID0gMTIwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpbmZvKCJJQk0gTmV0Q2FtZXJhOiB1c2luZyAxNzZ4MTQ0Iik7CisJCQlzaXplID0gU0laRV8xNzZ4MTQ0OworCQkJLyogTm8gYnJlYWsgaGVyZSAqLworCQljYXNlIFNJWkVfMTc2eDE0NDoKKwkJCWNhbnZhc1ggPSAxNzY7CisJCQljYW52YXNZID0gMTQ0OworCQkJYnJlYWs7CisJCWNhc2UgU0laRV8zMjB4MjQwOgorCQkJY2FudmFzWCA9IDMyMDsKKwkJCWNhbnZhc1kgPSAyNDA7CisJCQlicmVhazsKKwkJY2FzZSBTSVpFXzM1MngyODg6CisJCQljYW52YXNYID0gMzUyOworCQkJY2FudmFzWSA9IDI4ODsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycigiSUJNIGNhbWVyYTogTW9kZWwgJWQuIG5vdCBzdXBwb3J0ZWQhIiwgbW9kZWwpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl1dmQgPSB1c2J2aWRlb19BbGxvY2F0ZURldmljZShjYW1zKTsKKwlpZiAodXZkICE9IE5VTEwpIHsKKwkJLyogSGVyZSB1dmQgaXMgYSBmdWxseSBhbGxvY2F0ZWQgdXZkIG9iamVjdCAqLworCQl1dmQtPmZsYWdzID0gZmxhZ3M7CisJCXV2ZC0+ZGVidWcgPSBkZWJ1ZzsKKwkJdXZkLT5kZXYgPSBkZXY7CisJCXV2ZC0+aWZhY2UgPSBpZm51bTsKKwkJdXZkLT5pZmFjZUFsdEluYWN0aXZlID0gaW5hY3RJbnRlcmZhY2U7CisJCXV2ZC0+aWZhY2VBbHRBY3RpdmUgPSBhY3RJbnRlcmZhY2U7CisJCXV2ZC0+dmlkZW9fZW5kcCA9IHZpZGVvX2VwOworCQl1dmQtPmlzb19wYWNrZXRfbGVuID0gbWF4UFM7CisJCXV2ZC0+cGFsZXR0ZUJpdHMgPSAxTCA8PCBWSURFT19QQUxFVFRFX1JHQjI0OworCQl1dmQtPmRlZmF1bHRQYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IyNDsKKwkJdXZkLT5jYW52YXMgPSBWSURFT1NJWkUoY2FudmFzWCwgY2FudmFzWSk7CisJCXV2ZC0+dmlkZW9zaXplID0gaWJtY2FtX3NpemVfdG9fdmlkZW9zaXplKHNpemUpOworCisJCS8qIEluaXRpYWxpemUgaWJtY2FtLXNwZWNpZmljIGRhdGEgKi8KKwkJYXNzZXJ0KElCTUNBTV9UKHV2ZCkgIT0gTlVMTCk7CisJCUlCTUNBTV9UKHV2ZCktPmNhbWVyYV9tb2RlbCA9IG1vZGVsOworCQlJQk1DQU1fVCh1dmQpLT5pbml0aWFsaXplZCA9IDA7CisKKwkJaWJtY2FtX2NvbmZpZ3VyZV92aWRlbyh1dmQpOworCisJCWkgPSB1c2J2aWRlb19SZWdpc3RlclZpZGVvRGV2aWNlKHV2ZCk7CisJCWlmIChpICE9IDApIHsKKwkJCWVycigidXNidmlkZW9fUmVnaXN0ZXJWaWRlb0RldmljZSgpIGZhaWxlZC4iKTsKKwkJCXV2ZCA9IE5VTEw7CisJCX0KKwl9CisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgdXZkKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwl7IFVTQl9ERVZJQ0VfVkVSKElCTUNBTV9WRU5ET1JfSUQsIElCTUNBTV9QUk9EVUNUX0lELCAweDAwMDIsIDB4MDAwMikgfSwJLyogTW9kZWwgMSAqLworCXsgVVNCX0RFVklDRV9WRVIoSUJNQ0FNX1ZFTkRPUl9JRCwgSUJNQ0FNX1BST0RVQ1RfSUQsIDB4MDMwYSwgMHgwMzBhKSB9LAkvKiBNb2RlbCAyICovCisJeyBVU0JfREVWSUNFX1ZFUihJQk1DQU1fVkVORE9SX0lELCBJQk1DQU1fUFJPRFVDVF9JRCwgMHgwMzAxLCAweDAzMDEpIH0sCS8qIE1vZGVsIDMgKi8KKwl7IFVTQl9ERVZJQ0VfVkVSKElCTUNBTV9WRU5ET1JfSUQsIE5FVENBTV9QUk9EVUNUX0lELCAweDAzMGEsIDB4MDMwYSkgfSwJLyogTW9kZWwgNCAqLworCXsgVVNCX0RFVklDRV9WRVIoSUJNQ0FNX1ZFTkRPUl9JRCwgVkVPXzgwMENfUFJPRFVDVF9JRCwgMHgwMzBhLCAweDAzMGEpIH0sCS8qIE1vZGVsIDIgKi8KKwl7IFVTQl9ERVZJQ0VfVkVSKElCTUNBTV9WRU5ET1JfSUQsIFZFT184MDBEX1BST0RVQ1RfSUQsIDB4MDMwYSwgMHgwMzBhKSB9LAkvKiBNb2RlbCA0ICovCisJeyB9ICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworLyoKKyAqIGlibWNhbV9pbml0KCkKKyAqCisgKiBUaGlzIGNvZGUgaXMgcnVuIHRvIGluaXRpYWxpemUgdGhlIGRyaXZlci4KKyAqCisgKiBIaXN0b3J5OgorICogMS8yNy8wMCAgUmV3b3JrZWQgdG8gdXNlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGlibWNhbSBzdHJ1Y3R1cmVzLgorICogMjEvMTAvMDAgQ29tcGxldGVseSByZWRlc2lnbmVkIHRvIHVzZSB1c2J2aWRlbyBzZXJ2aWNlcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgaWJtY2FtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgdXNidmlkZW9fY2IgY2JUYmw7CisJbWVtc2V0KCZjYlRibCwgMCwgc2l6ZW9mKGNiVGJsKSk7CisJY2JUYmwucHJvYmUgPSBpYm1jYW1fcHJvYmU7CisJY2JUYmwuc2V0dXBPbk9wZW4gPSBpYm1jYW1fc2V0dXBfb25fb3BlbjsKKwljYlRibC52aWRlb1N0YXJ0ID0gaWJtY2FtX3ZpZGVvX3N0YXJ0OworCWNiVGJsLnZpZGVvU3RvcCA9IGlibWNhbV92aWRlb19zdG9wOworCWNiVGJsLnByb2Nlc3NEYXRhID0gaWJtY2FtX1Byb2Nlc3NJc29jRGF0YTsKKwljYlRibC5wb3N0UHJvY2VzcyA9IHVzYnZpZGVvX0RlaW50ZXJsYWNlRnJhbWU7CisJY2JUYmwuYWRqdXN0UGljdHVyZSA9IGlibWNhbV9hZGp1c3RfcGljdHVyZTsKKwljYlRibC5nZXRGUFMgPSBpYm1jYW1fY2FsY3VsYXRlX2ZwczsKKwlyZXR1cm4gdXNidmlkZW9fcmVnaXN0ZXIoCisJCSZjYW1zLAorCQlNQVhfSUJNQ0FNLAorCQlzaXplb2YoaWJtY2FtX3QpLAorCQkiaWJtY2FtIiwKKwkJJmNiVGJsLAorCQlUSElTX01PRFVMRSwKKwkJaWRfdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWJtY2FtX2NsZWFudXAodm9pZCkKK3sKKwl1c2J2aWRlb19EZXJlZ2lzdGVyKCZjYW1zKTsKK30KKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKKworbW9kdWxlX2luaXQoaWJtY2FtX2luaXQpOworbW9kdWxlX2V4aXQoaWJtY2FtX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEva29uaWNhd2MuYyBiL2RyaXZlcnMvdXNiL21lZGlhL2tvbmljYXdjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1MjFhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL2tvbmljYXdjLmMKQEAgLTAsMCArMSw5NDcgQEAKKy8qCisgKiBrb25pY2F3Yy5jIC0ga29uaWNhIHdlYmNhbSBkcml2ZXIKKyAqCisgKiBBdXRob3I6IFNpbW9uIEV2YW5zIDxzcHNlQHNlY3JldC5vcmcudWs+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFNpbW9uIEV2YW5zCisgKgorICogTGljZW5jZTogR1BMCisgKgorICogRHJpdmVyIGZvciBVU0Igd2ViY2FtcyBiYXNlZCBvbiBLb25pY2EgY2hpcHNldC4gVGhpcworICogY2hpcHNldCBpcyB1c2VkIGluIEludGVsIFlDNzYgY2FtZXJhLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKyNpbmNsdWRlICJ1c2J2aWRlby5oIgorCisjZGVmaW5lIE1BWF9CUklHSFRORVNTCTEwOAorI2RlZmluZSBNQVhfQ09OVFJBU1QJMTA4CisjZGVmaW5lIE1BWF9TQVRVUkFUSU9OCTEwOAorI2RlZmluZSBNQVhfU0hBUlBORVNTCTEwOAorI2RlZmluZSBNQVhfV0hJVEVCQUwJMzcyCisjZGVmaW5lIE1BWF9TUEVFRAk2CisKKworI2RlZmluZSBNQVhfQ0FNRVJBUwkxCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JInYxLjQiCisjZGVmaW5lIERSSVZFUl9ERVNDCSJLb25pY2EgV2ViY2FtIGRyaXZlciIKKworZW51bSBjdHJsX3JlcSB7CisJU2V0V2hpdGViYWwJPSAweDAxLAorCVNldEJyaWdodG5lc3MJPSAweDAyLAorICAgICAgICBTZXRTaGFycG5lc3MJPSAweDAzLAorCVNldENvbnRyYXN0CT0gMHgwNCwKKwlTZXRTYXR1cmF0aW9uCT0gMHgwNSwKK307CisKKworZW51bSBmcmFtZV9zaXplcyB7CisJU0laRV8xNjBYMTIwCT0gMCwKKwlTSVpFXzE2MFgxMzYJPSAxLAorCVNJWkVfMTc2WDE0NAk9IDIsCisJU0laRV8zMjBYMjQwCT0gMywKKwkKK307CisKKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUJU0laRV8zMjBYMjQwCisKK3N0YXRpYyBzdHJ1Y3QgdXNidmlkZW8gKmNhbXM7CisKKyNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCitzdGF0aWMgaW50IGRlYnVnOworI2RlZmluZSBERUJVRyhuLCBmb3JtYXQsIGFyZy4uLikgXAorCWlmIChuIDw9IGRlYnVnKSB7CSBcCisJCXByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6JXMoKTogIiBmb3JtYXQgIlxuIiwgX19GVU5DVElPTl9fICwgIyMgYXJnKTsgXAorCX0KKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZy4uLikKK3N0YXRpYyBjb25zdCBpbnQgZGVidWcgPSAwOworI2VuZGlmCisKKworLyogU29tZSBkZWZhdWx0IHZhbHVlcyBmb3IgaW5pdGlhbCBjYW1lcmEgc2V0dGluZ3MsCisgICBjYW4gYmUgc2V0IGJ5IG1vZHByb2JlICovCisKK3N0YXRpYyBpbnQgc2l6ZTsJCitzdGF0aWMgaW50IHNwZWVkID0gNjsJCS8qIFNwZWVkIChmcHMpIDAgKHNsb3dlc3QpIHRvIDYgKGZhc3Rlc3QpICovCitzdGF0aWMgaW50IGJyaWdodG5lc3MgPQlNQVhfQlJJR0hUTkVTUy8yOworc3RhdGljIGludCBjb250cmFzdCA9CU1BWF9DT05UUkFTVC8yOworc3RhdGljIGludCBzYXR1cmF0aW9uID0JTUFYX1NBVFVSQVRJT04vMjsKK3N0YXRpYyBpbnQgc2hhcnBuZXNzID0JTUFYX1NIQVJQTkVTUy8yOworc3RhdGljIGludCB3aGl0ZWJhbCA9CTMqKE1BWF9XSElURUJBTC80KTsKKworc3RhdGljIGludCBzcGRfdG9faWZhY2VbXSA9IHsgMSwgMCwgMywgMiwgNCwgNSwgNiB9OworCisvKiBUaGVzZSBGUFMgc3BlZWRzIGFyZSBmcm9tIHRoZSB3aW5kb3dzIGNvbmZpZyBib3guIFRoZXkgYXJlCisgKiBpbmRleGVkIG9uIHNpemUgKDAtMikgYW5kIHNwZWVkICgwLTYpLiBEaXZpZGUgYnkgMyB0byBnZXQgdGhlCisgKiByZWFsIGZwcy4KKyAqLworCitzdGF0aWMgaW50IHNwZF90b19mcHNbXVs3XSA9IHsgeyAyNCwgNDAsIDQ4LCA2MCwgNzIsIDgwLCAxMDAgfSwKKwkJCSAgICAgICB7IDI0LCA0MCwgNDgsIDYwLCA3MiwgODAsIDEwMCB9LAorCQkJICAgICAgIHsgMTgsIDMwLCAzNiwgNDUsIDU0LCA2MCwgNzUgIH0sCisJCQkgICAgICAgeyA2LCAgMTAsIDEyLCAxNSwgMTgsIDIxLCAyNSAgfSB9OworCitzdHJ1Y3QgY2FtX3NpemUgeworCXUxNgl3aWR0aDsKKwl1MTYJaGVpZ2h0OworCXU4CWNtZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2FtX3NpemUgY2FtZXJhX3NpemVzW10gPSB7IHsgMTYwLCAxMjAsIDB4NyB9LAorCQkJCQkgIHsgMTYwLCAxMzYsIDB4YSB9LAorCQkJCQkgIHsgMTc2LCAxNDQsIDB4NCB9LAorCQkJCQkgIHsgMzIwLCAyNDAsIDB4NSB9IH07CisKK3N0cnVjdCBrb25pY2F3YyB7CisJdTggYnJpZ2h0bmVzczsJCS8qIGNhbWVyYSB1c2VzIDAgLSA5LCB4MTEgZm9yIHJlYWwgdmFsdWUgKi8KKwl1OCBjb250cmFzdDsJCS8qIGFzIGFib3ZlICovCisJdTggc2F0dXJhdGlvbjsJCS8qIGFzIGFib3ZlICovCisJdTggc2hhcnBuZXNzOwkJLyogYXMgYWJvdmUgKi8KKwl1OCB3aGl0ZV9iYWw7CQkvKiAwIC0gMzMsIHgxMSBmb3IgcmVhbCB2YWx1ZSAqLworCXU4IHNwZWVkOwkJLyogU3RvcmVkIGFzIDAgLSA2LCB1c2VkIGFzIGluZGV4IGluIHNwZF90b18qIChhYm92ZSkgKi8KKwl1OCBzaXplOwkJLyogRnJhbWUgU2l6ZSAqLworCWludCBoZWlnaHQ7CisJaW50IHdpZHRoOworCXN0cnVjdCB1cmIgKnN0c191cmJbVVNCVklERU9fTlVNU0JVRl07CisJdTggc3RzX2J1ZltVU0JWSURFT19OVU1TQlVGXVtGUkFNRVNfUEVSX0RFU0NdOworCXN0cnVjdCB1cmIgKmxhc3RfZGF0YV91cmI7CisJaW50IGxhc3RmcmFtZTsKKwlpbnQgY3VyX2ZyYW1lX3NpemU7CS8qIG51bWJlciBvZiBieXRlcyBpbiBjdXJyZW50IGZyYW1lIHNpemUgKi8KKwlpbnQgbWF4bGluZTsJCS8qIG51bWJlciBvZiBsaW5lcyBwZXIgZnJhbWUgKi8KKwlpbnQgeXBsYW5lc3o7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIFkgcGxhbmUgKi8KKwl1bnNpZ25lZCBpbnQgYnV0dG9uc3RzOjE7CisjaWZkZWYgQ09ORklHX0lOUFVUCisJc3RydWN0IGlucHV0X2RldiBpbnB1dDsKKwljaGFyIGlucHV0X3BoeXNuYW1lWzY0XTsKKyNlbmRpZgorfTsKKworCisjZGVmaW5lIGtvbmljYXdjX3NldF9taXNjKHV2ZCwgcmVxLCB2YWx1ZSwgaW5kZXgpCQlrb25pY2F3Y19jdHJsX21zZyh1dmQsIFVTQl9ESVJfT1VULCByZXEsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCkKKyNkZWZpbmUga29uaWNhd2NfZ2V0X21pc2ModXZkLCByZXEsIHZhbHVlLCBpbmRleCwgYnVmLCBzeikJa29uaWNhd2NfY3RybF9tc2codXZkLCBVU0JfRElSX0lOLCByZXEsIHZhbHVlLCBpbmRleCwgYnVmLCBzeikKKyNkZWZpbmUga29uaWNhd2Nfc2V0X3ZhbHVlKHV2ZCwgdmFsdWUsIGluZGV4KQkJCWtvbmljYXdjX2N0cmxfbXNnKHV2ZCwgVVNCX0RJUl9PVVQsIDIsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCkKKworCitzdGF0aWMgaW50IGtvbmljYXdjX2N0cmxfbXNnKHN0cnVjdCB1dmQgKnV2ZCwgdTggZGlyLCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIHUxNiBpbmRleCwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworICAgICAgICBpbnQgcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHV2ZC0+ZGV2LAorCQlkaXIgPyB1c2JfcmN2Y3RybHBpcGUodXZkLT5kZXYsIDApIDogdXNiX3NuZGN0cmxwaXBlKHV2ZC0+ZGV2LCAwKSwKKwkJICAgIHJlcXVlc3QsIDB4NDAgfCBkaXIsIHZhbHVlLCBpbmRleCwgYnVmLCBsZW4sIDEwMDApOworICAgICAgICByZXR1cm4gcmV0dmFsIDwgMCA/IHJldHZhbCA6IDA7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGtvbmljYXdjX2NhbWVyYV9vbihzdHJ1Y3QgdXZkICp1dmQpCit7CisgICAgICAgIERFQlVHKDAsICJjYW1lcmEgb24iKTsKKyAgICAgICAga29uaWNhd2Nfc2V0X21pc2ModXZkLCAweDIsIDEsIDB4MGIpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrb25pY2F3Y19jYW1lcmFfb2ZmKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKyAgICAgICAgREVCVUcoMCwgImNhbWVyYSBvZmYiKTsKKyAgICAgICAga29uaWNhd2Nfc2V0X21pc2ModXZkLCAweDIsIDAsIDB4MGIpOworfQorCisKK3N0YXRpYyB2b2lkIGtvbmljYXdjX3NldF9jYW1lcmFfc2l6ZShzdHJ1Y3QgdXZkICp1dmQpCit7CisJc3RydWN0IGtvbmljYXdjICpjYW0gPSAoc3RydWN0IGtvbmljYXdjICopdXZkLT51c2VyX2RhdGE7CisKKwlrb25pY2F3Y19zZXRfbWlzYyh1dmQsIDB4MiwgY2FtZXJhX3NpemVzW2NhbS0+c2l6ZV0uY21kLCAweDA4KTsKKwljYW0tPndpZHRoID0gY2FtZXJhX3NpemVzW2NhbS0+c2l6ZV0ud2lkdGg7CisJY2FtLT5oZWlnaHQgPSBjYW1lcmFfc2l6ZXNbY2FtLT5zaXplXS5oZWlnaHQ7CisJY2FtLT55cGxhbmVzeiA9IGNhbS0+aGVpZ2h0ICogY2FtLT53aWR0aDsKKwljYW0tPmN1cl9mcmFtZV9zaXplID0gKGNhbS0+eXBsYW5lc3ogKiAzKSAvIDI7CisJY2FtLT5tYXhsaW5lID0gY2FtLT55cGxhbmVzeiAvIDI1NjsKKwl1dmQtPnZpZGVvc2l6ZSA9IFZJREVPU0laRShjYW0tPndpZHRoLCBjYW0tPmhlaWdodCk7Cit9CisKKworc3RhdGljIGludCBrb25pY2F3Y19zZXR1cF9vbl9vcGVuKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlzdHJ1Y3Qga29uaWNhd2MgKmNhbSA9IChzdHJ1Y3Qga29uaWNhd2MgKil1dmQtPnVzZXJfZGF0YTsKKworCURFQlVHKDEsICJzZXR0aW5nIGJyaWdodG5lc3MgdG8gJWQgKCVkKSIsIGNhbS0+YnJpZ2h0bmVzcywKKwkgICAgY2FtLT5icmlnaHRuZXNzICogMTEpOworCWtvbmljYXdjX3NldF92YWx1ZSh1dmQsIGNhbS0+YnJpZ2h0bmVzcywgU2V0QnJpZ2h0bmVzcyk7CisJREVCVUcoMSwgInNldHRpbmcgd2hpdGUgYmFsYW5jZSB0byAlZCAoJWQpIiwgY2FtLT53aGl0ZV9iYWwsCisJICAgIGNhbS0+d2hpdGVfYmFsICogMTEpOworCWtvbmljYXdjX3NldF92YWx1ZSh1dmQsIGNhbS0+d2hpdGVfYmFsLCBTZXRXaGl0ZWJhbCk7CisJREVCVUcoMSwgInNldHRpbmcgY29udHJhc3QgdG8gJWQgKCVkKSIsIGNhbS0+Y29udHJhc3QsCisJICAgIGNhbS0+Y29udHJhc3QgKiAxMSk7CisJa29uaWNhd2Nfc2V0X3ZhbHVlKHV2ZCwgY2FtLT5jb250cmFzdCwgU2V0Q29udHJhc3QpOworCURFQlVHKDEsICJzZXR0aW5nIHNhdHVyYXRpb24gdG8gJWQgKCVkKSIsIGNhbS0+c2F0dXJhdGlvbiwKKwkgICAgY2FtLT5zYXR1cmF0aW9uICogMTEpOworCWtvbmljYXdjX3NldF92YWx1ZSh1dmQsIGNhbS0+c2F0dXJhdGlvbiwgU2V0U2F0dXJhdGlvbik7CisJREVCVUcoMSwgInNldHRpbmcgc2hhcnBuZXNzIHRvICVkICglZCkiLCBjYW0tPnNoYXJwbmVzcywKKwkgICAgY2FtLT5zaGFycG5lc3MgKiAxMSk7CisJa29uaWNhd2Nfc2V0X3ZhbHVlKHV2ZCwgY2FtLT5zaGFycG5lc3MsIFNldFNoYXJwbmVzcyk7CisJa29uaWNhd2Nfc2V0X2NhbWVyYV9zaXplKHV2ZCk7CisJY2FtLT5sYXN0ZnJhbWUgPSAtMjsKKwljYW0tPmJ1dHRvbnN0cyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQga29uaWNhd2NfYWRqdXN0X3BpY3R1cmUoc3RydWN0IHV2ZCAqdXZkKQoreworCXN0cnVjdCBrb25pY2F3YyAqY2FtID0gKHN0cnVjdCBrb25pY2F3YyAqKXV2ZC0+dXNlcl9kYXRhOworCisJa29uaWNhd2NfY2FtZXJhX29mZih1dmQpOworCURFQlVHKDEsICJuZXcgYnJpZ2h0bmVzczogJWQiLCB1dmQtPnZwaWMuYnJpZ2h0bmVzcyk7CisJdXZkLT52cGljLmJyaWdodG5lc3MgPSAodXZkLT52cGljLmJyaWdodG5lc3MgPiBNQVhfQlJJR0hUTkVTUykgPyBNQVhfQlJJR0hUTkVTUyA6IHV2ZC0+dnBpYy5icmlnaHRuZXNzOworCWlmKGNhbS0+YnJpZ2h0bmVzcyAhPSB1dmQtPnZwaWMuYnJpZ2h0bmVzcyAvIDExKSB7CisJICAgY2FtLT5icmlnaHRuZXNzID0gdXZkLT52cGljLmJyaWdodG5lc3MgLyAxMTsKKwkgICBERUJVRygxLCAic2V0dGluZyBicmlnaHRuZXNzIHRvICVkICglZCkiLCBjYW0tPmJyaWdodG5lc3MsCisJICAgICAgIGNhbS0+YnJpZ2h0bmVzcyAqIDExKTsKKwkgICBrb25pY2F3Y19zZXRfdmFsdWUodXZkLCBjYW0tPmJyaWdodG5lc3MsIFNldEJyaWdodG5lc3MpOworCX0KKworCURFQlVHKDEsICJuZXcgY29udHJhc3Q6ICVkIiwgdXZkLT52cGljLmNvbnRyYXN0KTsKKwl1dmQtPnZwaWMuY29udHJhc3QgPSAodXZkLT52cGljLmNvbnRyYXN0ID4gTUFYX0NPTlRSQVNUKSA/IE1BWF9DT05UUkFTVCA6IHV2ZC0+dnBpYy5jb250cmFzdDsKKwlpZihjYW0tPmNvbnRyYXN0ICE9IHV2ZC0+dnBpYy5jb250cmFzdCAvIDExKSB7CisJCWNhbS0+Y29udHJhc3QgPSB1dmQtPnZwaWMuY29udHJhc3QgLyAxMTsKKwkJREVCVUcoMSwgInNldHRpbmcgY29udHJhc3QgdG8gJWQgKCVkKSIsIGNhbS0+Y29udHJhc3QsCisJCSAgICBjYW0tPmNvbnRyYXN0ICogMTEpOworCQlrb25pY2F3Y19zZXRfdmFsdWUodXZkLCBjYW0tPmNvbnRyYXN0LCBTZXRDb250cmFzdCk7CisJfQorCWtvbmljYXdjX2NhbWVyYV9vbih1dmQpOworfQorCisKK3N0YXRpYyBpbnQga29uaWNhd2NfY29tcHJlc3NfaXNvKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHVyYiAqZGF0YXVyYiwgc3RydWN0IHVyYiAqc3RzdXJiKQoreworCWNoYXIgKmNkYXRhOworCWludCBpLCB0b3RsZW4gPSAwOworCXVuc2lnbmVkIGNoYXIgKnN0YXR1cyA9IHN0c3VyYi0+dHJhbnNmZXJfYnVmZmVyOworCWludCBrZWVwID0gMCwgZGlzY2FyZCA9IDAsIGJhZCA9IDA7CisJc3RydWN0IGtvbmljYXdjICpjYW0gPSAoc3RydWN0IGtvbmljYXdjICopdXZkLT51c2VyX2RhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YXVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQlpbnQgYnV0dG9uID0gY2FtLT5idXR0b25zdHM7CisJCXVuc2lnbmVkIGNoYXIgc3RzOworCQlpbnQgbiA9IGRhdGF1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CisJCWludCBzdCA9IGRhdGF1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKKwkJY2RhdGEgPSBkYXRhdXJiLT50cmFuc2Zlcl9idWZmZXIgKworCQkJZGF0YXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OworCisJCS8qIERldGVjdCBhbmQgaWdub3JlIGVycm9yZWQgcGFja2V0cyAqLworCQlpZiAoc3QgPCAwKSB7CisJCQlERUJVRygxLCAiRGF0YSBlcnJvcjogcGFja2V0PSVkLiBsZW49JWQuIHN0YXR1cz0lZC4iLAorCQkJICAgICAgaSwgbiwgc3QpOworCQkJdXZkLT5zdGF0cy5pc29fZXJyX2NvdW50Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIERldGVjdCBhbmQgaWdub3JlIGVtcHR5IHBhY2tldHMgKi8KKwkJaWYgKG4gPD0gMCkgeworCQkJdXZkLT5zdGF0cy5pc29fc2tpcF9jb3VudCsrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBTZWUgd2hhdCB0aGUgc3RhdHVzIGRhdGEgc2FpZCBhYm91dCB0aGUgcGFja2V0ICovCisJCXN0cyA9ICooc3RhdHVzK3N0c3VyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0KTsKKworCQkvKiBzdHM6IDB4ODAtMHhmZjogZnJhbWUgc3RhcnQgd2l0aCBmcmFtZSBudW1iZXIgKGllIDAtN2YpCisJCSAqIG90aGVyd2lzZToKKwkJICogYml0IDAgMDoga2VlcCBwYWNrZXQKKwkJICoJIDE6IGRyb3AgcGFja2V0IChwYWRkaW5nIGRhdGEpCisJCSAqCisJCSAqIGJpdCA0IDAgYnV0dG9uIG5vdCBjbGlja2VkCisJCSAqICAgICAgIDEgYnV0dG9uIGNsaWNrZWQKKwkJICogYnV0dG9uIGlzIHVzZWQgdG8gYHRha2UgYSBwaWN0dXJlJyAoaW4gc29mdHdhcmUpCisJCSAqLworCisJCWlmKHN0cyA8IDB4ODApIHsKKwkJCWJ1dHRvbiA9ICEhKHN0cyAmIDB4NDApOworCQkJc3RzICY9IH4weDQwOworCQl9CisJCQorCQkvKiB3b3JrIG91dCB0aGUgYnV0dG9uIHN0YXR1cywgYnV0IGRvbid0IGRvCisJCSAgIGFueXRoaW5nIHdpdGggaXQgZm9yIG5vdyAqLworCisJCWlmKGJ1dHRvbiAhPSBjYW0tPmJ1dHRvbnN0cykgeworCQkJREVCVUcoMiwgImJ1dHRvbjogJXNjbGlja2VkIiwgYnV0dG9uID8gIiIgOiAidW4iKTsKKwkJCWNhbS0+YnV0dG9uc3RzID0gYnV0dG9uOworI2lmZGVmIENPTkZJR19JTlBVVAorCQkJaW5wdXRfcmVwb3J0X2tleSgmY2FtLT5pbnB1dCwgQlROXzAsIGNhbS0+YnV0dG9uc3RzKTsKKwkJCWlucHV0X3N5bmMoJmNhbS0+aW5wdXQpOworI2VuZGlmCisJCX0KKworCQlpZihzdHMgPT0gMHgwMSkgeyAvKiBkcm9wIGZyYW1lICovCisJCQlkaXNjYXJkKys7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJaWYoKHN0cyA+IDB4MDEpICYmIChzdHMgPCAweDgwKSkgeworCQkJaW5mbygidW5rbm93biBzdGF0dXMgJTIuMngiLCBzdHMpOworCQkJYmFkKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZighc3RzICYmIGNhbS0+bGFzdGZyYW1lID09IC0yKSB7CisJCQlERUJVRygyLCAiZHJvcHBpbmcgZnJhbWUgbG9va2luZyBmb3IgaW1hZ2Ugc3RhcnQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJa2VlcCsrOworCQlpZihzdHMgJiAweDgwKSB7IC8qIGZyYW1lIHN0YXJ0ICovCisJCQl1bnNpZ25lZCBjaGFyIG1hcmtlcltdID0geyAwLCAweGZmLCAwLCAweDAwIH07CisKKwkJCWlmKGNhbS0+bGFzdGZyYW1lID09IC0yKSB7CisJCQkJREVCVUcoMiwgImZvdW5kIGluaXRpYWwgaW1hZ2UiKTsKKwkJCQljYW0tPmxhc3RmcmFtZSA9IC0xOworCQkJfQorCQkJCQorCQkJbWFya2VyWzNdID0gc3RzICYgMHg3RjsKKwkJCVJpbmdRdWV1ZV9FbnF1ZXVlKCZ1dmQtPmRwLCBtYXJrZXIsIDQpOworCQkJdG90bGVuICs9IDQ7CisJCX0KKworCQl0b3RsZW4gKz0gbjsJLyogTGl0dGxlIGxvY2FsIGFjY291bnRpbmcgKi8KKwkJUmluZ1F1ZXVlX0VucXVldWUoJnV2ZC0+ZHAsIGNkYXRhLCBuKTsKKwl9CisJREVCVUcoOCwgImZpbmlzaGVkOiBrZWVwID0gJWQgZGlzY2FyZCA9ICVkIGJhZCA9ICVkIGFkZGVkICVkIGJ5dGVzIiwKKwkJICAgIGtlZXAsIGRpc2NhcmQsIGJhZCwgdG90bGVuKTsKKwlyZXR1cm4gdG90bGVuOworfQorCisKK3N0YXRpYyB2b2lkIHJlc3VibWl0X3VyYihzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1cmIgKnVyYikKK3sKKyAgICAgICAgaW50IGksIHJldDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZSQU1FU19QRVJfREVTQzsgaSsrKSB7CisgICAgICAgICAgICAgICAgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMgPSAwOworICAgICAgICB9CisgICAgICAgIHVyYi0+ZGV2ID0gdXZkLT5kZXY7CisgICAgICAgIHVyYi0+c3RhdHVzID0gMDsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCURFQlVHKDMsICJzdWJtaXR0aW5nIHVyYiBvZiBsZW5ndGggJWQiLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworICAgICAgICBpZihyZXQpCisgICAgICAgICAgICAgICAgZXJyKCJ1c2Jfc3VibWl0X3VyYiBlcnJvciAoJWQpIiwgcmV0KTsKKworfQorCisKK3N0YXRpYyB2b2lkIGtvbmljYXdjX2lzb2NfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHV2ZCAqdXZkID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBrb25pY2F3YyAqY2FtID0gKHN0cnVjdCBrb25pY2F3YyAqKXV2ZC0+dXNlcl9kYXRhOworCisJLyogV2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBpZiB3ZSBhcmUgYWJvdXQgdG8gYmUgcmVtb3ZlZCEgKi8KKwlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpKQorCQlyZXR1cm47CisKKwlpZiAoIXV2ZC0+c3RyZWFtaW5nKSB7CisJCURFQlVHKDEsICJOb3Qgc3RyZWFtaW5nLCBidXQgaW50ZXJydXB0ISIpOworCQlyZXR1cm47CisJfQorCisJREVCVUcoMywgImdvdCBmcmFtZSAlZCBsZW4gPSAlZCBidWZsZW4gPSVkIiwgdXJiLT5zdGFydF9mcmFtZSwgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCisJdXZkLT5zdGF0cy51cmJfY291bnQrKzsKKworCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPiAzMikgeworCQljYW0tPmxhc3RfZGF0YV91cmIgPSB1cmI7CisJCXJldHVybjsKKwl9CisJLyogQ29weSB0aGUgZGF0YSByZWNlaXZlZCBpbnRvIHJpbmcgcXVldWUgKi8KKwlpZihjYW0tPmxhc3RfZGF0YV91cmIpIHsKKwkJaW50IGxlbiA9IDA7CisJCWlmKHVyYi0+c3RhcnRfZnJhbWUgIT0gY2FtLT5sYXN0X2RhdGFfdXJiLT5zdGFydF9mcmFtZSkKKwkJCWVycigiTG9zdCBzeW5jIG9uIGZyYW1lcyIpOworCQllbHNlIGlmICghdXJiLT5zdGF0dXMgJiYgIWNhbS0+bGFzdF9kYXRhX3VyYi0+c3RhdHVzKQorCQkJbGVuID0ga29uaWNhd2NfY29tcHJlc3NfaXNvKHV2ZCwgY2FtLT5sYXN0X2RhdGFfdXJiLCB1cmIpOworCisJCXJlc3VibWl0X3VyYih1dmQsIGNhbS0+bGFzdF9kYXRhX3VyYik7CisJCXJlc3VibWl0X3VyYih1dmQsIHVyYik7CisJCWNhbS0+bGFzdF9kYXRhX3VyYiA9IE5VTEw7CisJCXV2ZC0+c3RhdHMudXJiX2xlbmd0aCA9IGxlbjsKKwkJdXZkLT5zdGF0cy5kYXRhX2NvdW50ICs9IGxlbjsKKwkJaWYobGVuKQorCQkJUmluZ1F1ZXVlX1dha2VVcEludGVycnVwdGlibGUoJnV2ZC0+ZHApOworCQlyZXR1cm47CisJfQorCXJldHVybjsKK30KKworCitzdGF0aWMgaW50IGtvbmljYXdjX3N0YXJ0X2RhdGEoc3RydWN0IHV2ZCAqdXZkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSB1dmQtPmRldjsKKwlpbnQgaSwgZXJyRmxhZzsKKwlzdHJ1Y3Qga29uaWNhd2MgKmNhbSA9IChzdHJ1Y3Qga29uaWNhd2MgKil1dmQtPnVzZXJfZGF0YTsKKwlpbnQgcGt0c3o7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlID0gTlVMTDsKKworCWludGYgPSB1c2JfaWZudW1fdG9faWYoZGV2LCB1dmQtPmlmYWNlKTsKKwlpZiAoaW50ZikKKwkJaW50ZXJmYWNlID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsCisJCQkJc3BkX3RvX2lmYWNlW2NhbS0+c3BlZWRdKTsKKwlpZiAoIWludGVyZmFjZSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlwa3RzeiA9IGxlMTZfdG9fY3B1KGludGVyZmFjZS0+ZW5kcG9pbnRbMV0uZGVzYy53TWF4UGFja2V0U2l6ZSk7CisJREVCVUcoMSwgInBrdHN6ID0gJWQiLCBwa3Rzeik7CisJaWYgKCFDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSkgeworCQllcnIoIkNhbWVyYSBpcyBub3Qgb3BlcmF0aW9uYWwiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXV2ZC0+Y3VyZnJhbWUgPSAtMTsKKwlrb25pY2F3Y19jYW1lcmFfb24odXZkKTsKKwkvKiBBbHRlcm5hdGUgaW50ZXJmYWNlIDEgaXMgaXMgdGhlIGJpZ2dlc3QgZnJhbWUgc2l6ZSAqLworCWkgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYsIHV2ZC0+aWZhY2UsIHV2ZC0+aWZhY2VBbHRBY3RpdmUpOworCWlmIChpIDwgMCkgeworCQllcnIoInVzYl9zZXRfaW50ZXJmYWNlIGVycm9yIik7CisJCXV2ZC0+bGFzdF9lcnJvciA9IGk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogV2UgZG91YmxlIGJ1ZmZlciB0aGUgSXNvIGxpc3RzICovCisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJaW50IGosIGs7CisJCXN0cnVjdCB1cmIgKnVyYiA9IHV2ZC0+c2J1ZltpXS51cmI7CisJCXVyYi0+ZGV2ID0gZGV2OworCQl1cmItPmNvbnRleHQgPSB1dmQ7CisJCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShkZXYsIHV2ZC0+dmlkZW9fZW5kcCk7CisJCXVyYi0+aW50ZXJ2YWwgPSAxOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHV2ZC0+c2J1ZltpXS5kYXRhOworCQl1cmItPmNvbXBsZXRlID0ga29uaWNhd2NfaXNvY19pcnE7CisJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBGUkFNRVNfUEVSX0RFU0M7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHBrdHN6ICogRlJBTUVTX1BFUl9ERVNDOworCQlmb3IgKGo9az0wOyBqIDwgRlJBTUVTX1BFUl9ERVNDOyBqKyssIGsgKz0gcGt0c3opIHsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gazsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gcGt0c3o7CisJCX0KKworCQl1cmIgPSBjYW0tPnN0c191cmJbaV07CisJCXVyYi0+ZGV2ID0gZGV2OworCQl1cmItPmNvbnRleHQgPSB1dmQ7CisJCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShkZXYsIHV2ZC0+dmlkZW9fZW5kcC0xKTsKKwkJdXJiLT5pbnRlcnZhbCA9IDE7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gY2FtLT5zdHNfYnVmW2ldOworCQl1cmItPmNvbXBsZXRlID0ga29uaWNhd2NfaXNvY19pcnE7CisJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBGUkFNRVNfUEVSX0RFU0M7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IEZSQU1FU19QRVJfREVTQzsKKwkJZm9yIChqPTA7IGogPCBGUkFNRVNfUEVSX0RFU0M7IGorKykgeworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBqOworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSAxOworCQl9CisJfQorCisJY2FtLT5sYXN0X2RhdGFfdXJiID0gTlVMTDsKKwkKKwkvKiBTdWJtaXQgYWxsIFVSQnMgKi8KKwlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQllcnJGbGFnID0gdXNiX3N1Ym1pdF91cmIoY2FtLT5zdHNfdXJiW2ldLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVyckZsYWcpCisJCQllcnIoInVzYl9zdWJtaXRfaXNvYyglZCkgcmV0ICVkIiwgaSwgZXJyRmxhZyk7CisKKwkJZXJyRmxhZyA9IHVzYl9zdWJtaXRfdXJiKHV2ZC0+c2J1ZltpXS51cmIsIEdGUF9LRVJORUwpOworCQlpZiAoZXJyRmxhZykKKwkJCWVyciAoInVzYl9zdWJtaXRfaXNvYyglZCkgcmV0ICVkIiwgaSwgZXJyRmxhZyk7CisJfQorCisJdXZkLT5zdHJlYW1pbmcgPSAxOworCURFQlVHKDEsICJzdHJlYW1pbmc9MSB2aWRlb19lbmRwPSQlMDJ4IiwgdXZkLT52aWRlb19lbmRwKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBrb25pY2F3Y19zdG9wX2RhdGEoc3RydWN0IHV2ZCAqdXZkKQoreworCWludCBpLCBqOworCXN0cnVjdCBrb25pY2F3YyAqY2FtOworCisJaWYgKCh1dmQgPT0gTlVMTCkgfHwgKCF1dmQtPnN0cmVhbWluZykgfHwgKHV2ZC0+ZGV2ID09IE5VTEwpKQorCQlyZXR1cm47CisKKwlrb25pY2F3Y19jYW1lcmFfb2ZmKHV2ZCk7CisJdXZkLT5zdHJlYW1pbmcgPSAwOworCWNhbSA9IChzdHJ1Y3Qga29uaWNhd2MgKil1dmQtPnVzZXJfZGF0YTsKKwljYW0tPmxhc3RfZGF0YV91cmIgPSBOVUxMOworCisJLyogVW5zY2hlZHVsZSBhbGwgb2YgdGhlIGlzbyB0ZCdzICovCisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJdXNiX2tpbGxfdXJiKHV2ZC0+c2J1ZltpXS51cmIpOworCQl1c2Jfa2lsbF91cmIoY2FtLT5zdHNfdXJiW2ldKTsKKwl9CisKKwlpZiAoIXV2ZC0+cmVtb3ZlX3BlbmRpbmcpIHsKKwkJLyogU2V0IHBhY2tldCBzaXplIHRvIDAgKi8KKwkJaiA9IHVzYl9zZXRfaW50ZXJmYWNlKHV2ZC0+ZGV2LCB1dmQtPmlmYWNlLCB1dmQtPmlmYWNlQWx0SW5hY3RpdmUpOworCQlpZiAoaiA8IDApIHsKKwkJCWVycigidXNiX3NldF9pbnRlcmZhY2UoKSBlcnJvciAlZC4iLCBqKTsKKwkJCXV2ZC0+bGFzdF9lcnJvciA9IGo7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQga29uaWNhd2NfcHJvY2Vzc19pc29jKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSkKK3sJCisJc3RydWN0IGtvbmljYXdjICpjYW0gPSAoc3RydWN0IGtvbmljYXdjICopdXZkLT51c2VyX2RhdGE7CisJaW50IG1heGxpbmUgPSBjYW0tPm1heGxpbmU7CisJaW50IHlwbGFuZXN6ID0gY2FtLT55cGxhbmVzejsKKworCWFzc2VydChmcmFtZSAhPSBOVUxMKTsKKworCURFQlVHKDUsICJtYXhsaW5lID0gJWQgeXBsYW5lc3ogPSAlZCIsIG1heGxpbmUsIHlwbGFuZXN6KTsKKwlERUJVRygzLCAiRnJhbWUgc3RhdGUgPSAlZCIsIGZyYW1lLT5zY2Fuc3RhdGUpOworCisJaWYoZnJhbWUtPnNjYW5zdGF0ZSA9PSBTY2FuU3RhdGVfU2Nhbm5pbmcpIHsKKwkJaW50IGRyb3AgPSAwOworCQlpbnQgY3VyZnJhbWU7CisJCWludCBmZHJvcHMgPSAwOworCQlERUJVRygzLCAiU2VhcmNoaW5nIGZvciBtYXJrZXIsIHF1ZXVlIGxlbiA9ICVkIiwgUmluZ1F1ZXVlX0dldExlbmd0aCgmdXZkLT5kcCkpOworCQl3aGlsZShSaW5nUXVldWVfR2V0TGVuZ3RoKCZ1dmQtPmRwKSA+PSA0KSB7CisJCQlpZiAoKFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMCkgPT0gMHgwMCkgJiYKKwkJCSAgICAoUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAxKSA9PSAweGZmKSAmJgorCQkJICAgIChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDIpID09IDB4MDApICYmCisJCQkgICAgKFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMykgPCAweDgwKSkgeworCQkJCWN1cmZyYW1lID0gUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAzKTsKKwkJCQlpZihjYW0tPmxhc3RmcmFtZSA+PSAwKSB7CisJCQkJCWZkcm9wcyA9ICgweDgwICsgY3VyZnJhbWUgLSBjYW0tPmxhc3RmcmFtZSkgJiAweDdGOworCQkJCQlmZHJvcHMtLTsKKwkJCQkJaWYoZmRyb3BzKSB7CisJCQkJCQlpbmZvKCJEcm9wcGVkICVkIGZyYW1lcyAoJWQgLT4gJWQpIiwgZmRyb3BzLAorCQkJCQkJICAgICBjYW0tPmxhc3RmcmFtZSwgY3VyZnJhbWUpOworCQkJCQl9CisJCQkJfQorCQkJCWNhbS0+bGFzdGZyYW1lID0gY3VyZnJhbWU7CisJCQkJZnJhbWUtPmN1cmxpbmUgPSAwOworCQkJCWZyYW1lLT5zY2Fuc3RhdGUgPSBTY2FuU3RhdGVfTGluZXM7CisJCQkJUklOR19RVUVVRV9ERVFVRVVFX0JZVEVTKCZ1dmQtPmRwLCA0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCVJJTkdfUVVFVUVfREVRVUVVRV9CWVRFUygmdXZkLT5kcCwgMSk7CisJCQlkcm9wKys7CisJCX0KKwkJaWYoZHJvcCkKKwkJCURFQlVHKDIsICJkcm9wcGVkICVkIGJ5dGVzIGxvb2tpbmcgZm9yIG5ldyBmcmFtZSIsIGRyb3ApOworCX0KKworCWlmKGZyYW1lLT5zY2Fuc3RhdGUgPT0gU2NhblN0YXRlX1NjYW5uaW5nKQorCQlyZXR1cm47CisJCQorCS8qIFRyeSB0byBtb3ZlIGRhdGEgZnJvbSBxdWV1ZSBpbnRvIGZyYW1lIGJ1ZmZlcgorCSAqIFdlIGdldCBkYXRhIGluIGJsb2NrcyBvZiAzODQgYnl0ZXMgbWFkZSB1cCBvZjoKKwkgKiAyNTYgWSwgNjQgVSwgNjQgVi4KKwkgKiBUaGlzIG5lZWRzIHRvIGJlIHdyaXR0ZW4gb3V0IGFzIGEgWSBwbGFuZSwgYSBVIHBsYW5lIGFuZCBhIFYgcGxhbmUuCisJICovCisJCQorCXdoaWxlICggZnJhbWUtPmN1cmxpbmUgPCBtYXhsaW5lICYmIChSaW5nUXVldWVfR2V0TGVuZ3RoKCZ1dmQtPmRwKSA+PSAzODQpKSB7CisJCS8qIFkgKi8KKwkJUmluZ1F1ZXVlX0RlcXVldWUoJnV2ZC0+ZHAsIGZyYW1lLT5kYXRhICsgKGZyYW1lLT5jdXJsaW5lICogMjU2KSwgMjU2KTsKKwkJLyogVSAqLworCQlSaW5nUXVldWVfRGVxdWV1ZSgmdXZkLT5kcCwgZnJhbWUtPmRhdGEgKyB5cGxhbmVzeiArIChmcmFtZS0+Y3VybGluZSAqIDY0KSwgNjQpOworCQkvKiBWICovCisJCVJpbmdRdWV1ZV9EZXF1ZXVlKCZ1dmQtPmRwLCBmcmFtZS0+ZGF0YSArICg1ICogeXBsYW5lc3opLzQgKyAoZnJhbWUtPmN1cmxpbmUgKiA2NCksIDY0KTsKKwkJZnJhbWUtPnNlcVJlYWRfTGVuZ3RoICs9IDM4NDsKKwkJZnJhbWUtPmN1cmxpbmUrKzsKKwl9CisJLyogU2VlIGlmIHdlIGZpbGxlZCB0aGUgZnJhbWUgKi8KKwlpZiAoZnJhbWUtPmN1cmxpbmUgPT0gbWF4bGluZSkgeworCQlERUJVRyg1LCAiZ290IHdob2xlIGZyYW1lIik7CisKKwkJZnJhbWUtPmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX0RvbmVfSG9sZDsKKwkJZnJhbWUtPmN1cmxpbmUgPSAwOworCQl1dmQtPmN1cmZyYW1lID0gLTE7CisJCXV2ZC0+c3RhdHMuZnJhbWVfbnVtKys7CisJfQorfQorCisKK3N0YXRpYyBpbnQga29uaWNhd2NfZmluZF9mcHMoaW50IHNpemUsIGludCBmcHMpCit7CisJaW50IGk7CisKKwlmcHMgKj0gMzsKKwlERUJVRygxLCAia29uaWNhX2ZpbmRfZnBzOiBzaXplID0gJWQgZnBzID0gJWQiLCBzaXplLCBmcHMpOworCWlmKGZwcyA8PSBzcGRfdG9fZnBzW3NpemVdWzBdKQorCQlyZXR1cm4gMDsKKworCWlmKGZwcyA+PSBzcGRfdG9fZnBzW3NpemVdW01BWF9TUEVFRF0pCisJCXJldHVybiBNQVhfU1BFRUQ7CisKKwlmb3IoaSA9IDA7IGkgPCBNQVhfU1BFRUQ7IGkrKykgeworCQlpZigoZnBzID49IHNwZF90b19mcHNbc2l6ZV1baV0pICYmIChmcHMgPD0gc3BkX3RvX2Zwc1tzaXplXVtpKzFdKSkgeworCQkJREVCVUcoMiwgImZwcyAlZCBiZXR3ZWVuICVkIGFuZCAlZCIsIGZwcywgaSwgaSsxKTsKKwkJCWlmKCAoZnBzIC0gc3BkX3RvX2Zwc1tzaXplXVtpXSkgPCAoc3BkX3RvX2Zwc1tzaXplXVtpKzFdIC0gZnBzKSkKKwkJCQlyZXR1cm4gaTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gaSsxOworCQl9CisJfQorCXJldHVybiBNQVhfU1BFRUQrMTsKK30KKworCitzdGF0aWMgaW50IGtvbmljYXdjX3NldF92aWRlb19tb2RlKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHZpZGVvX3dpbmRvdyAqdncpCit7CisJc3RydWN0IGtvbmljYXdjICpjYW0gPSAoc3RydWN0IGtvbmljYXdjICopdXZkLT51c2VyX2RhdGE7CisJaW50IG5ld3NwZWVkID0gY2FtLT5zcGVlZDsKKwlpbnQgbmV3c2l6ZTsKKwlpbnQgeCA9IHZ3LT53aWR0aDsKKwlpbnQgeSA9IHZ3LT5oZWlnaHQ7CisJaW50IGZwcyA9IHZ3LT5mbGFnczsKKworCWlmKHggPiAwICYmIHkgPiAwKSB7CisJCURFQlVHKDIsICJ0cnlpbmcgdG8gZmluZCBzaXplICVkLCVkIiwgeCwgeSk7CisJCWZvcihuZXdzaXplID0gMDsgbmV3c2l6ZSA8PSBNQVhfRlJBTUVfU0laRTsgbmV3c2l6ZSsrKSB7CisJCQlpZigoY2FtZXJhX3NpemVzW25ld3NpemVdLndpZHRoID09IHgpICYmIChjYW1lcmFfc2l6ZXNbbmV3c2l6ZV0uaGVpZ2h0ID09IHkpKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJbmV3c2l6ZSA9IGNhbS0+c2l6ZTsKKwl9CisKKwlpZihuZXdzaXplID4gTUFYX0ZSQU1FX1NJWkUpIHsKKwkJREVCVUcoMSwgImNvdWxkbid0IGZpbmQgc2l6ZSAlZCwlZCIsIHgsIHkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihmcHMgPiAwKSB7CisJCURFQlVHKDEsICJ0cnlpbmcgdG8gc2V0IGZwcyB0byAlZCIsIGZwcyk7CisJCW5ld3NwZWVkID0ga29uaWNhd2NfZmluZF9mcHMobmV3c2l6ZSwgZnBzKTsKKwkJREVCVUcoMSwgImZpbmRfZnBzIHJldHVybmVkICVkICglZCkiLCBuZXdzcGVlZCwgc3BkX3RvX2Zwc1tuZXdzaXplXVtuZXdzcGVlZF0pOworCX0KKworCWlmKG5ld3NwZWVkID4gTUFYX1NQRUVEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURFQlVHKDEsICJzZXR0aW5nIHNpemUgdG8gJWQgc3BlZWQgdG8gJWQiLCBuZXdzaXplLCBuZXdzcGVlZCk7CisJaWYoKG5ld3NpemUgPT0gY2FtLT5zaXplKSAmJiAobmV3c3BlZWQgPT0gY2FtLT5zcGVlZCkpIHsKKwkJREVCVUcoMSwgIk5vdGhpbmcgdG8gZG8iKTsKKwkJcmV0dXJuIDA7CisJfQorCURFQlVHKDAsICJzZXR0aW5nIHRvICAlZHglZCBAICVkIGZwcyIsIGNhbWVyYV9zaXplc1tuZXdzaXplXS53aWR0aCwKKwkgICAgIGNhbWVyYV9zaXplc1tuZXdzaXplXS5oZWlnaHQsIHNwZF90b19mcHNbbmV3c2l6ZV1bbmV3c3BlZWRdLzMpOworCisJa29uaWNhd2Nfc3RvcF9kYXRhKHV2ZCk7CisJdXZkLT5pZmFjZUFsdEFjdGl2ZSA9IHNwZF90b19pZmFjZVtuZXdzcGVlZF07CisJREVCVUcoMSwgIm5ldyBpbnRlcmZhY2UgPSAlZCIsIHV2ZC0+aWZhY2VBbHRBY3RpdmUpOworCWNhbS0+c3BlZWQgPSBuZXdzcGVlZDsKKworCWlmKGNhbS0+c2l6ZSAhPSBuZXdzaXplKSB7CisJCWNhbS0+c2l6ZSA9IG5ld3NpemU7CisJCWtvbmljYXdjX3NldF9jYW1lcmFfc2l6ZSh1dmQpOworCX0KKworCS8qIEZsdXNoIHRoZSBpbnB1dCBxdWV1ZSBhbmQgY2xlYXIgYW55IGN1cnJlbnQgZnJhbWUgaW4gcHJvZ3Jlc3MgKi8KKworCVJpbmdRdWV1ZV9GbHVzaCgmdXZkLT5kcCk7CisJY2FtLT5sYXN0ZnJhbWUgPSAtMjsKKwlpZih1dmQtPmN1cmZyYW1lICE9IC0xKSB7CisJICB1dmQtPmZyYW1lW3V2ZC0+Y3VyZnJhbWVdLmN1cmxpbmUgPSAwOworCSAgdXZkLT5mcmFtZVt1dmQtPmN1cmZyYW1lXS5zZXFSZWFkX0xlbmd0aCA9IDA7CisJICB1dmQtPmZyYW1lW3V2ZC0+Y3VyZnJhbWVdLnNlcVJlYWRfSW5kZXggPSAwOworCX0KKworCWtvbmljYXdjX3N0YXJ0X2RhdGEodXZkKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGtvbmljYXdjX2NhbGN1bGF0ZV9mcHMoc3RydWN0IHV2ZCAqdXZkKQoreworCXN0cnVjdCBrb25pY2F3YyAqY2FtID0gdXZkLT51c2VyX2RhdGE7CisJcmV0dXJuIHNwZF90b19mcHNbY2FtLT5zaXplXVtjYW0tPnNwZWVkXS8zOworfQorCisKK3N0YXRpYyB2b2lkIGtvbmljYXdjX2NvbmZpZ3VyZV92aWRlbyhzdHJ1Y3QgdXZkICp1dmQpCit7CisJc3RydWN0IGtvbmljYXdjICpjYW0gPSAoc3RydWN0IGtvbmljYXdjICopdXZkLT51c2VyX2RhdGE7CisJdTggYnVmWzJdOworCisJbWVtc2V0KCZ1dmQtPnZwaWMsIDAsIHNpemVvZih1dmQtPnZwaWMpKTsKKwltZW1zZXQoJnV2ZC0+dnBpY19vbGQsIDB4NTUsIHNpemVvZih1dmQtPnZwaWNfb2xkKSk7CisKKwlSRVNUUklDVF9UT19SQU5HRShicmlnaHRuZXNzLCAwLCBNQVhfQlJJR0hUTkVTUyk7CisJUkVTVFJJQ1RfVE9fUkFOR0UoY29udHJhc3QsIDAsIE1BWF9DT05UUkFTVCk7CisJUkVTVFJJQ1RfVE9fUkFOR0Uoc2F0dXJhdGlvbiwgMCwgTUFYX1NBVFVSQVRJT04pOworCVJFU1RSSUNUX1RPX1JBTkdFKHNoYXJwbmVzcywgMCwgTUFYX1NIQVJQTkVTUyk7CisJUkVTVFJJQ1RfVE9fUkFOR0Uod2hpdGViYWwsIDAsIE1BWF9XSElURUJBTCk7CisKKwljYW0tPmJyaWdodG5lc3MgPSBicmlnaHRuZXNzIC8gMTE7CisJY2FtLT5jb250cmFzdCA9IGNvbnRyYXN0IC8gMTE7CisJY2FtLT5zYXR1cmF0aW9uID0gc2F0dXJhdGlvbiAvIDExOworCWNhbS0+c2hhcnBuZXNzID0gc2hhcnBuZXNzIC8gMTE7CisJY2FtLT53aGl0ZV9iYWwgPSB3aGl0ZWJhbCAvIDExOworCisJdXZkLT52cGljLmNvbG91ciA9IDEwODsKKwl1dmQtPnZwaWMuaHVlID0gMTA4OworCXV2ZC0+dnBpYy5icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKKwl1dmQtPnZwaWMuY29udHJhc3QgPSBjb250cmFzdDsKKwl1dmQtPnZwaWMud2hpdGVuZXNzID0gd2hpdGViYWw7CisJdXZkLT52cGljLmRlcHRoID0gNjsKKwl1dmQtPnZwaWMucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfWVVWNDIwUDsKKworCW1lbXNldCgmdXZkLT52Y2FwLCAwLCBzaXplb2YodXZkLT52Y2FwKSk7CisJc3RyY3B5KHV2ZC0+dmNhcC5uYW1lLCAiS29uaWNhIFdlYmNhbSIpOworCXV2ZC0+dmNhcC50eXBlID0gVklEX1RZUEVfQ0FQVFVSRTsKKwl1dmQtPnZjYXAuY2hhbm5lbHMgPSAxOworCXV2ZC0+dmNhcC5hdWRpb3MgPSAwOworCXV2ZC0+dmNhcC5taW53aWR0aCA9IGNhbWVyYV9zaXplc1tTSVpFXzE2MFgxMjBdLndpZHRoOworCXV2ZC0+dmNhcC5taW5oZWlnaHQgPSBjYW1lcmFfc2l6ZXNbU0laRV8xNjBYMTIwXS5oZWlnaHQ7CisJdXZkLT52Y2FwLm1heHdpZHRoID0gY2FtZXJhX3NpemVzW1NJWkVfMzIwWDI0MF0ud2lkdGg7CisJdXZkLT52Y2FwLm1heGhlaWdodCA9IGNhbWVyYV9zaXplc1tTSVpFXzMyMFgyNDBdLmhlaWdodDsKKworCW1lbXNldCgmdXZkLT52Y2hhbiwgMCwgc2l6ZW9mKHV2ZC0+dmNoYW4pKTsKKwl1dmQtPnZjaGFuLmZsYWdzID0gMCA7CisJdXZkLT52Y2hhbi50dW5lcnMgPSAwOworCXV2ZC0+dmNoYW4uY2hhbm5lbCA9IDA7CisJdXZkLT52Y2hhbi50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJc3RyY3B5KHV2ZC0+dmNoYW4ubmFtZSwgIkNhbWVyYSIpOworCisJLyogVGFsayB0byBkZXZpY2UgKi8KKwlERUJVRygxLCAiZGV2aWNlIGluaXQiKTsKKwlpZigha29uaWNhd2NfZ2V0X21pc2ModXZkLCAweDMsIDAsIDB4MTAsIGJ1ZiwgMikpCisJCURFQlVHKDIsICIzLDEwIC0+ICUyLjJ4ICUyLjJ4IiwgYnVmWzBdLCBidWZbMV0pOworCWlmKCFrb25pY2F3Y19nZXRfbWlzYyh1dmQsIDB4MywgMCwgMHgxMCwgYnVmLCAyKSkKKwkJREVCVUcoMiwgIjMsMTAgLT4gJTIuMnggJTIuMngiLCBidWZbMF0sIGJ1ZlsxXSk7CisJaWYoa29uaWNhd2Nfc2V0X21pc2ModXZkLCAweDIsIDAsIDB4ZCkpCisJCURFQlVHKDIsICIyLDAsZCBmYWlsZWQiKTsKKwlERUJVRygxLCAic2V0dGluZyBpbml0aWFsIHZhbHVlcyIpOworfQorCisKK3N0YXRpYyBpbnQga29uaWNhd2NfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXZkICp1dmQgPSBOVUxMOworCWludCBpeCwgaSwgbmFzOworCWludCBhY3RJbnRlcmZhY2U9LTEsIGluYWN0SW50ZXJmYWNlPS0xLCBtYXhQUz0wOworCXVuc2lnbmVkIGNoYXIgdmlkZW9fZXAgPSAwOworCisJREVCVUcoMSwgImtvbmljYXdjX3Byb2JlKCVwKSIsIGludGYpOworCisJLyogV2UgZG9uJ3QgaGFuZGxlIG11bHRpLWNvbmZpZyBjYW1lcmFzICovCisJaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbmZvKCJLb25pY2EgV2ViY2FtIChyZXYuIDB4JTA0eCkiLCBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSk7CisJUkVTVFJJQ1RfVE9fUkFOR0Uoc3BlZWQsIDAsIE1BWF9TUEVFRCk7CisKKwkvKiBWYWxpZGF0ZSBmb3VuZCBpbnRlcmZhY2U6IG11c3QgaGF2ZSBvbmUgSVNPIGVuZHBvaW50ICovCisJbmFzID0gaW50Zi0+bnVtX2FsdHNldHRpbmc7CisJaWYgKG5hcyAhPSA4KSB7CisJCWVycigiSW5jb3JyZWN0IG51bWJlciBvZiBhbHRlcm5hdGUgc2V0dGluZ3MgKCVkKSBmb3IgdGhpcyBjYW1lcmEhIiwgbmFzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIFZhbGlkYXRlIGFsbCBhbHRlcm5hdGUgc2V0dGluZ3MgKi8KKwlmb3IgKGl4PTA7IGl4IDwgbmFzOyBpeCsrKSB7CisJCWNvbnN0IHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKworCQlpbnRlcmZhY2UgPSAmaW50Zi0+YWx0c2V0dGluZ1tpeF07CisJCWkgPSBpbnRlcmZhY2UtPmRlc2MuYkFsdGVybmF0ZVNldHRpbmc7CisJCWlmIChpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cyAhPSAyKSB7CisJCQllcnIoIkludGVyZmFjZSAlZC4gaGFzICV1LiBlbmRwb2ludHMhIiwKKwkJCSAgICBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlciwKKwkJCSAgICAodW5zaWduZWQpKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzKSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzFdLmRlc2M7CisJCURFQlVHKDEsICJmb3VuZCBlbmRwb2ludDogYWRkcjogMHglMi4yeCBtYXhwcyA9IDB4JTQuNHgiLAorCQkgICAgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MsIGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpOworCQlpZiAodmlkZW9fZXAgPT0gMCkKKwkJCXZpZGVvX2VwID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCWVsc2UgaWYgKHZpZGVvX2VwICE9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSB7CisJCQllcnIoIkFsdGVybmF0ZSBzZXR0aW5ncyBoYXZlIGRpZmZlcmVudCBlbmRwb2ludCBhZGRyZXNzZXMhIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAweDAzKSAhPSAweDAxKSB7CisJCQllcnIoIkludGVyZmFjZSAlZC4gaGFzIG5vbi1JU08gZW5kcG9pbnQhIiwKKwkJCSAgICBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgPT0gMCkgeworCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBJU08gT1VUIGVuZHBvaW50ISIsCisJCQkgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkgPT0gMCkgeworCQkJaWYgKGluYWN0SW50ZXJmYWNlIDwgMCkKKwkJCQlpbmFjdEludGVyZmFjZSA9IGk7CisJCQllbHNlIHsKKwkJCQllcnIoIk1vcmUgdGhhbiBvbmUgaW5hY3RpdmUgYWx0LiBzZXR0aW5nISIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGkgPT0gc3BkX3RvX2lmYWNlW3NwZWVkXSkgeworCQkJCS8qIFRoaXMgb25lIGlzIHRoZSByZXF1ZXN0ZWQgb25lICovCisJCQkJYWN0SW50ZXJmYWNlID0gaTsKKwkJCX0KKwkJfQorCQlpZiAobGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA+IG1heFBTKQorCQkJbWF4UFMgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCX0KKwlpZihhY3RJbnRlcmZhY2UgPT0gLTEpIHsKKwkJZXJyKCJDYW50IGZpbmQgcmVxdWlyZWQgZW5kcG9pbnQiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJREVCVUcoMSwgIlNlbGVjdGluZyByZXF1ZXN0ZWQgYWN0aXZlIHNldHRpbmc9JWQuIG1heFBTPSVkLiIsIGFjdEludGVyZmFjZSwgbWF4UFMpOworCisJdXZkID0gdXNidmlkZW9fQWxsb2NhdGVEZXZpY2UoY2Ftcyk7CisJaWYgKHV2ZCAhPSBOVUxMKSB7CisJCXN0cnVjdCBrb25pY2F3YyAqY2FtID0gKHN0cnVjdCBrb25pY2F3YyAqKSh1dmQtPnVzZXJfZGF0YSk7CisJCS8qIEhlcmUgdXZkIGlzIGEgZnVsbHkgYWxsb2NhdGVkIHV2ZCBvYmplY3QgKi8KKwkJZm9yKGkgPSAwOyBpIDwgVVNCVklERU9fTlVNU0JVRjsgaSsrKSB7CisJCQljYW0tPnN0c191cmJbaV0gPSB1c2JfYWxsb2NfdXJiKEZSQU1FU19QRVJfREVTQywgR0ZQX0tFUk5FTCk7CisJCQlpZihjYW0tPnN0c191cmJbaV0gPT0gTlVMTCkgeworCQkJCXdoaWxlKGktLSkgeworCQkJCQl1c2JfZnJlZV91cmIoY2FtLT5zdHNfdXJiW2ldKTsKKwkJCQl9CisJCQkJZXJyKCJjYW4ndCBhbGxvY2F0ZSB1cmJzIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKwkJY2FtLT5zcGVlZCA9IHNwZWVkOworCQlSRVNUUklDVF9UT19SQU5HRShzaXplLCBTSVpFXzE2MFgxMjAsIFNJWkVfMzIwWDI0MCk7CisJCWNhbS0+d2lkdGggPSBjYW1lcmFfc2l6ZXNbc2l6ZV0ud2lkdGg7CisJCWNhbS0+aGVpZ2h0ID0gY2FtZXJhX3NpemVzW3NpemVdLmhlaWdodDsKKwkJY2FtLT5zaXplID0gc2l6ZTsKKworCQl1dmQtPmZsYWdzID0gMDsKKwkJdXZkLT5kZWJ1ZyA9IGRlYnVnOworCQl1dmQtPmRldiA9IGRldjsKKwkJdXZkLT5pZmFjZSA9IGludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwkJdXZkLT5pZmFjZUFsdEluYWN0aXZlID0gaW5hY3RJbnRlcmZhY2U7CisJCXV2ZC0+aWZhY2VBbHRBY3RpdmUgPSBhY3RJbnRlcmZhY2U7CisJCXV2ZC0+dmlkZW9fZW5kcCA9IHZpZGVvX2VwOworCQl1dmQtPmlzb19wYWNrZXRfbGVuID0gbWF4UFM7CisJCXV2ZC0+cGFsZXR0ZUJpdHMgPSAxTCA8PCBWSURFT19QQUxFVFRFX1lVVjQyMFA7CisJCXV2ZC0+ZGVmYXVsdFBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1lVVjQyMFA7CisJCXV2ZC0+Y2FudmFzID0gVklERU9TSVpFKDMyMCwgMjQwKTsKKwkJdXZkLT52aWRlb3NpemUgPSBWSURFT1NJWkUoY2FtLT53aWR0aCwgY2FtLT5oZWlnaHQpOworCisJCS8qIEluaXRpYWxpemUga29uaWNhd2Mgc3BlY2lmaWMgZGF0YSAqLworCQlrb25pY2F3Y19jb25maWd1cmVfdmlkZW8odXZkKTsKKworCQlpID0gdXNidmlkZW9fUmVnaXN0ZXJWaWRlb0RldmljZSh1dmQpOworCQl1dmQtPm1heF9mcmFtZV9zaXplID0gKDMyMCAqIDI0MCAqIDMpLzI7CisJCWlmIChpICE9IDApIHsKKwkJCWVycigidXNidmlkZW9fUmVnaXN0ZXJWaWRlb0RldmljZSgpIGZhaWxlZC4iKTsKKwkJCXV2ZCA9IE5VTEw7CisJCX0KKyNpZmRlZiBDT05GSUdfSU5QVVQKKwkJLyogUmVnaXN0ZXIgaW5wdXQgZGV2aWNlIGZvciBidXR0b24gKi8KKwkJbWVtc2V0KCZjYW0tPmlucHV0LCAwLCBzaXplb2Yoc3RydWN0IGlucHV0X2RldikpOworCQljYW0tPmlucHV0Lm5hbWUgPSAiS29uaWNhd2Mgc25hcHNob3QgYnV0dG9uIjsKKwkJY2FtLT5pbnB1dC5wcml2YXRlID0gY2FtOworCQljYW0tPmlucHV0LmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CisJCWNhbS0+aW5wdXQua2V5Yml0W0xPTkcoQlROXzApXSA9IEJJVChCVE5fMCk7CisJCWNhbS0+aW5wdXQuaWQuYnVzdHlwZSA9IEJVU19VU0I7CisJCWNhbS0+aW5wdXQuaWQudmVuZG9yID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwkJY2FtLT5pbnB1dC5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJCWNhbS0+aW5wdXQuaWQudmVyc2lvbiA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOworCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+aW5wdXQpOworCQkKKwkJdXNiX21ha2VfcGF0aChkZXYsIGNhbS0+aW5wdXRfcGh5c25hbWUsIDU2KTsKKwkJc3RyY2F0KGNhbS0+aW5wdXRfcGh5c25hbWUsICIvaW5wdXQwIik7CisJCWNhbS0+aW5wdXQucGh5cyA9IGNhbS0+aW5wdXRfcGh5c25hbWU7CisJCWluZm8oImtvbmljYXdjOiAlcyBvbiAlc1xuIiwgY2FtLT5pbnB1dC5uYW1lLCBjYW0tPmlucHV0LnBoeXMpOworI2VuZGlmCisJfQorCisJaWYgKHV2ZCkgeworCQl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCB1dmQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU87Cit9CisKKworc3RhdGljIHZvaWQga29uaWNhd2NfZnJlZV91dmQoc3RydWN0IHV2ZCAqdXZkKQoreworCWludCBpOworCXN0cnVjdCBrb25pY2F3YyAqY2FtID0gKHN0cnVjdCBrb25pY2F3YyAqKXV2ZC0+dXNlcl9kYXRhOworCisjaWZkZWYgQ09ORklHX0lOUFVUCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+aW5wdXQpOworI2VuZGlmCisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJdXNiX2ZyZWVfdXJiKGNhbS0+c3RzX3VyYltpXSk7CisJCWNhbS0+c3RzX3VyYltpXSA9IE5VTEw7CisJfQorfQorCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZVtdID0geworCXsgVVNCX0RFVklDRSgweDA0YzgsIDB4MDcyMCkgfSwgLyogSW50ZWwgWUMgNzYgKi8KKwl7IH0gIC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGtvbmljYXdjX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgdXNidmlkZW9fY2IgY2JUYmw7CisJaW5mbyhEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04pOworCW1lbXNldCgmY2JUYmwsIDAsIHNpemVvZihjYlRibCkpOworCWNiVGJsLnByb2JlID0ga29uaWNhd2NfcHJvYmU7CisJY2JUYmwuc2V0dXBPbk9wZW4gPSBrb25pY2F3Y19zZXR1cF9vbl9vcGVuOworCWNiVGJsLnByb2Nlc3NEYXRhID0ga29uaWNhd2NfcHJvY2Vzc19pc29jOworCWNiVGJsLmdldEZQUyA9IGtvbmljYXdjX2NhbGN1bGF0ZV9mcHM7CisJY2JUYmwuc2V0VmlkZW9Nb2RlID0ga29uaWNhd2Nfc2V0X3ZpZGVvX21vZGU7CisJY2JUYmwuc3RhcnREYXRhUHVtcCA9IGtvbmljYXdjX3N0YXJ0X2RhdGE7CisJY2JUYmwuc3RvcERhdGFQdW1wID0ga29uaWNhd2Nfc3RvcF9kYXRhOworCWNiVGJsLmFkanVzdFBpY3R1cmUgPSBrb25pY2F3Y19hZGp1c3RfcGljdHVyZTsKKwljYlRibC51c2VyRnJlZSA9IGtvbmljYXdjX2ZyZWVfdXZkOworCXJldHVybiB1c2J2aWRlb19yZWdpc3RlcigKKwkJJmNhbXMsCisJCU1BWF9DQU1FUkFTLAorCQlzaXplb2Yoc3RydWN0IGtvbmljYXdjKSwKKwkJImtvbmljYXdjIiwKKwkJJmNiVGJsLAorCQlUSElTX01PRFVMRSwKKwkJaWRfdGFibGUpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrb25pY2F3Y19jbGVhbnVwKHZvaWQpCit7CisJdXNidmlkZW9fRGVyZWdpc3RlcigmY2Ftcyk7Cit9CisKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiU2ltb24gRXZhbnMgPHNwc2VAc2VjcmV0Lm9yZy51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7Cittb2R1bGVfcGFyYW0oc3BlZWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNwZWVkLCAiSW5pdGlhbCBzcGVlZDogMCAoc2xvd2VzdCkgLSA2IChmYXN0ZXN0KSIpOworbW9kdWxlX3BhcmFtKHNpemUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNpemUsICJJbml0aWFsIFNpemUgMDogMTYweDEyMCAxOiAxNjB4MTM2IDI6IDE3NngxNDQgMzogMzIweDI0MCIpOworbW9kdWxlX3BhcmFtKGJyaWdodG5lc3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJyaWdodG5lc3MsICJJbml0aWFsIGJyaWdodG5lc3MgMCAtIDEwOCIpOworbW9kdWxlX3BhcmFtKGNvbnRyYXN0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjb250cmFzdCwgIkluaXRpYWwgY29udHJhc3QgMCAtIDEwOCIpOworbW9kdWxlX3BhcmFtKHNhdHVyYXRpb24sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNhdHVyYXRpb24sICJJbml0aWFsIHNhdHVyYXRpb24gMCAtIDEwOCIpOworbW9kdWxlX3BhcmFtKHNoYXJwbmVzcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2hhcnBuZXNzLCAiSW5pdGlhbCBicmlnaHRuZXNzIDAgLSAxMDgiKTsKK21vZHVsZV9wYXJhbSh3aGl0ZWJhbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2hpdGViYWwsICJJbml0aWFsIHdoaXRlIGJhbGFuY2UgMCAtIDM2MyIpOworCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbDogMC05IChkZWZhdWx0PTApIik7CisjZW5kaWYKKworbW9kdWxlX2luaXQoa29uaWNhd2NfaW5pdCk7Cittb2R1bGVfZXhpdChrb25pY2F3Y19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL292NTExLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9vdjUxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDdmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9vdjUxMS5jCkBAIC0wLDAgKzEsNjEzMSBAQAorLyoKKyAqIE9tbmlWaXNpb24gT1Y1MTEgQ2FtZXJhLXRvLVVTQiBCcmlkZ2UgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgTWFyayBXLiBNY0NsZWxsYW5kCisgKiBPcmlnaW5hbCBkZWNvbXByZXNzaW9uIGNvZGUgQ29weXJpZ2h0IDE5OTgtMjAwMCBPbW5pVmlzaW9uIFRlY2hub2xvZ2llcworICogTWFueSBpbXByb3ZlbWVudHMgYnkgQnJldCBXYWxsYWNoIDxid2FsbGFjMUBzYW4ucnIuY29tPgorICogQ29sb3IgZml4ZXMgYnkgYnkgT3Jpb24gU2t5IExhd2xvciA8b2xhd2xvckBhY20ub3JnPiAoMi8yNi8yMDAwKQorICogU25hcHNob3QgY29kZSBieSBLZXZpbiBNb29yZQorICogT1Y3NjIwIGZpeGVzIGJ5IENoYXJsIFAuIEJvdGhhIDxjcGJvdGhhQGllZWUub3JnPgorICogQ2hhbmdlcyBieSBDbGF1ZGlvIE1hdHN1b2thIDxjbGF1ZGlvQGNvbmVjdGl2YS5jb20+CisgKiBPcmlnaW5hbCBTQUE3MTExQSBjb2RlIGJ5IERhdmUgUGVya3MgPGRwZXJrc0BpYm0ubmV0PgorICogVVJCIGVycm9yIG1lc3NhZ2VzIGZyb20gcHdjIGRyaXZlciBieSBOZW1vc29mdAorICogZ2VuZXJpY19pb2N0bCgpIGNvZGUgZnJvbSB2aWRlb2Rldi5jIGJ5IEdlcmQgS25vcnIgYW5kIEFsYW4gQ294CisgKiBNZW1vcnkgbWFuYWdlbWVudCAocnZtYWxsb2MpIGNvZGUgZnJvbSBidHR2IGRyaXZlciwgYnkgR2VyZCBLbm9yciBhbmQgb3RoZXJzCisgKgorICogQmFzZWQgb24gdGhlIExpbnV4IENQaUEgZHJpdmVyIHdyaXR0ZW4gYnkgUGV0ZXIgUHJlZ2xlciwKKyAqIFNjb3R0IEouIEJlcnRpbiBhbmQgSm9oYW5uZXMgRXJkZmVsdC4KKyAqIAorICogUGxlYXNlIHNlZSB0aGUgZmlsZTogRG9jdW1lbnRhdGlvbi91c2Ivb3Y1MTEudHh0CisgKiBhbmQgdGhlIHdlYnNpdGUgYXQ6ICBodHRwOi8vYWxwaGEuZHluZG5zLm9yZy9vdjUxMQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaWYgZGVmaW5lZCAoX19pMzg2X18pCisJI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm92NTExLmgiCisKKy8qCisgKiBWZXJzaW9uIEluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjY0IGZvciBMaW51eCAyLjUiCisjZGVmaW5lIEVNQUlMICJtYXJrQGFscGhhLmR5bmRucy5vcmciCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIk1hcmsgTWNDbGVsbGFuZCA8bWFya0BhbHBoYS5keW5kbnMub3JnPiAmIEJyZXQgV2FsbGFjaCBcCisJJiBPcmlvbiBTa3kgTGF3bG9yIDxvbGF3bG9yQGFjbS5vcmc+ICYgS2V2aW4gTW9vcmUgJiBDaGFybCBQLiBCb3RoYSBcCisJPGNwYm90aGFAaWVlZS5vcmc+ICYgQ2xhdWRpbyBNYXRzdW9rYSA8Y2xhdWRpb0Bjb25lY3RpdmEuY29tPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIm92NTExIFVTQiBDYW1lcmEgRHJpdmVyIgorCisjZGVmaW5lIE9WNTExX0kyQ19SRVRSSUVTIDMKKyNkZWZpbmUgRU5BQkxFX1lfUVVBTlRBQkxFIDEKKyNkZWZpbmUgRU5BQkxFX1VWX1FVQU5UQUJMRSAxCisKKyNkZWZpbmUgT1Y1MTFfTUFYX1VOSVRfVklERU8gMTYKKworLyogUGl4ZWwgY291bnQgKiBieXRlcyBwZXIgWVVWNDIwIHBpeGVsICgxLjUpICovCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFKHcsIGgpICgodykgKiAoaCkgKiAzIC8gMikKKworI2RlZmluZSBNQVhfREFUQV9TSVpFKHcsIGgpIChNQVhfRlJBTUVfU0laRSh3LCBoKSArIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpCisKKy8qIE1heCBzaXplICogYnl0ZXMgcGVyIFlVVjQyMCBwaXhlbCAoMS41KSArIG9uZSBleHRyYSBpc29jIGZyYW1lIGZvciBzYWZldHkgKi8KKyNkZWZpbmUgTUFYX1JBV19EQVRBX1NJWkUodywgaCkgKCh3KSAqIChoKSAqIDMgLyAyICsgMTAyNCkKKworI2RlZmluZSBGQVRBTF9FUlJPUihyYykgKChyYykgPCAwICYmIChyYykgIT0gLUVQRVJNKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTW9kdWxlIFBhcmFtZXRlcnMKKyAqIChTZWUgb3Y1MTEudHh0IGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgb2YgdGhlc2UpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlc2UgdmFyaWFibGVzIChhbmQgYWxsIHN0YXRpYyBnbG9iYWxzKSBkZWZhdWx0IHRvIHplcm8gKi8KK3N0YXRpYyBpbnQgYXV0b2JyaWdodAkJPSAxOworc3RhdGljIGludCBhdXRvZ2FpbgkJPSAxOworc3RhdGljIGludCBhdXRvZXhwCQk9IDE7CitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIGludCBzbmFwc2hvdDsKK3N0YXRpYyBpbnQgY2FtcwkJCT0gMTsKK3N0YXRpYyBpbnQgY29tcHJlc3M7CitzdGF0aWMgaW50IHRlc3RwYXQ7CitzdGF0aWMgaW50IGR1bXBwaXg7CitzdGF0aWMgaW50IGxlZCAJCQk9IDE7CitzdGF0aWMgaW50IGR1bXBfYnJpZGdlOworc3RhdGljIGludCBkdW1wX3NlbnNvcjsKK3N0YXRpYyBpbnQgcHJpbnRwaDsKK3N0YXRpYyBpbnQgcGh5CQkJPSAweDFmOworc3RhdGljIGludCBwaHV2CQkJPSAweDA1Oworc3RhdGljIGludCBwdnkJCQk9IDB4MDY7CitzdGF0aWMgaW50IHB2dXYJCQk9IDB4MDY7CitzdGF0aWMgaW50IHFoeQkJCT0gMHgxNDsKK3N0YXRpYyBpbnQgcWh1dgkJCT0gMHgwMzsKK3N0YXRpYyBpbnQgcXZ5CQkJPSAweDA0Oworc3RhdGljIGludCBxdnV2CQkJPSAweDA0Oworc3RhdGljIGludCBsaWdodGZyZXE7CitzdGF0aWMgaW50IGJhbmRpbmdmaWx0ZXI7CitzdGF0aWMgaW50IGNsb2NrZGl2CQk9IC0xOworc3RhdGljIGludCBwYWNrZXRzaXplCQk9IC0xOworc3RhdGljIGludCBmcmFtZWRyb3AJCT0gLTE7CitzdGF0aWMgaW50IGZhc3RzZXQ7CitzdGF0aWMgaW50IGZvcmNlX3BhbGV0dGU7CitzdGF0aWMgaW50IGJhY2tsaWdodDsKK3N0YXRpYyBpbnQgdW5pdF92aWRlb1tPVjUxMV9NQVhfVU5JVF9WSURFT107CitzdGF0aWMgaW50IHJlbW92ZV96ZXJvczsKK3N0YXRpYyBpbnQgbWlycm9yOworc3RhdGljIGludCBvdjUxOF9jb2xvcjsKKworbW9kdWxlX3BhcmFtKGF1dG9icmlnaHQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9icmlnaHQsICJTZW5zb3IgYXV0b21hdGljYWxseSBjaGFuZ2VzIGJyaWdodG5lc3MiKTsKK21vZHVsZV9wYXJhbShhdXRvZ2FpbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYXV0b2dhaW4sICJTZW5zb3IgYXV0b21hdGljYWxseSBjaGFuZ2VzIGdhaW4iKTsKK21vZHVsZV9wYXJhbShhdXRvZXhwLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhdXRvZXhwLCAiU2Vuc29yIGF1dG9tYXRpY2FsbHkgY2hhbmdlcyBleHBvc3VyZSIpOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywKKyAgIkRlYnVnIGxldmVsOiAwPW5vbmUsIDE9aW5pdHMsIDI9d2FybmluZywgMz1jb25maWcsIDQ9ZnVuY3Rpb25zLCA1PW1heCIpOworbW9kdWxlX3BhcmFtKHNuYXBzaG90LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzbmFwc2hvdCwgIkVuYWJsZSBzbmFwc2hvdCBtb2RlIik7Cittb2R1bGVfcGFyYW0oY2FtcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY2FtcywgIk51bWJlciBvZiBzaW11bHRhbmVvdXMgY2FtZXJhcyIpOworbW9kdWxlX3BhcmFtKGNvbXByZXNzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjb21wcmVzcywgIlR1cm4gb24gY29tcHJlc3Npb24iKTsKK21vZHVsZV9wYXJhbSh0ZXN0cGF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0ZXN0cGF0LAorICAiUmVwbGFjZSBpbWFnZSB3aXRoIHZlcnRpY2FsIGJhciB0ZXN0cGF0dGVybiAob25seSBwYXJ0aWFsbHkgd29ya2luZykiKTsKK21vZHVsZV9wYXJhbShkdW1wcGl4LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkdW1wcGl4LCAiRHVtcCByYXcgcGl4ZWwgZGF0YSIpOworbW9kdWxlX3BhcmFtKGxlZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGVkLAorICAiTEVEIHBvbGljeSAoT1Y1MTErIG9yIGxhdGVyKS4gMD1vZmYsIDE9b24gKGRlZmF1bHQpLCAyPWF1dG8gKG9uIHdoZW4gb3BlbikiKTsKK21vZHVsZV9wYXJhbShkdW1wX2JyaWRnZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZHVtcF9icmlkZ2UsICJEdW1wIHRoZSBicmlkZ2UgcmVnaXN0ZXJzIik7Cittb2R1bGVfcGFyYW0oZHVtcF9zZW5zb3IsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGR1bXBfc2Vuc29yLCAiRHVtcCB0aGUgc2Vuc29yIHJlZ2lzdGVycyIpOworbW9kdWxlX3BhcmFtKHByaW50cGgsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByaW50cGgsICJQcmludCBmcmFtZSBzdGFydC9lbmQgaGVhZGVycyIpOworbW9kdWxlX3BhcmFtKHBoeSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGh5LCAiUHJlZGljdGlvbiByYW5nZSAoaG9yaXouIFkpIik7Cittb2R1bGVfcGFyYW0ocGh1diwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGh1diwgIlByZWRpY3Rpb24gcmFuZ2UgKGhvcml6LiBVVikiKTsKK21vZHVsZV9wYXJhbShwdnksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHB2eSwgIlByZWRpY3Rpb24gcmFuZ2UgKHZlcnQuIFkpIik7Cittb2R1bGVfcGFyYW0ocHZ1diwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHZ1diwgIlByZWRpY3Rpb24gcmFuZ2UgKHZlcnQuIFVWKSIpOworbW9kdWxlX3BhcmFtKHFoeSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocWh5LCAiUXVhbnRpemF0aW9uIHRocmVzaG9sZCAoaG9yaXouIFkpIik7Cittb2R1bGVfcGFyYW0ocWh1diwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocWh1diwgIlF1YW50aXphdGlvbiB0aHJlc2hvbGQgKGhvcml6LiBVVikiKTsKK21vZHVsZV9wYXJhbShxdnksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHF2eSwgIlF1YW50aXphdGlvbiB0aHJlc2hvbGQgKHZlcnQuIFkpIik7Cittb2R1bGVfcGFyYW0ocXZ1diwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocXZ1diwgIlF1YW50aXphdGlvbiB0aHJlc2hvbGQgKHZlcnQuIFVWKSIpOworbW9kdWxlX3BhcmFtKGxpZ2h0ZnJlcSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGlnaHRmcmVxLAorICAiTGlnaHQgZnJlcXVlbmN5LiBTZXQgdG8gNTAgb3IgNjAgSHosIG9yIHplcm8gZm9yIGRlZmF1bHQgc2V0dGluZ3MiKTsKK21vZHVsZV9wYXJhbShiYW5kaW5nZmlsdGVyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhiYW5kaW5nZmlsdGVyLAorICAiRW5hYmxlIGJhbmRpbmcgZmlsdGVyICh0byByZWR1Y2UgZWZmZWN0cyBvZiBmbHVvcmVzY2VudCBsaWdodGluZykiKTsKK21vZHVsZV9wYXJhbShjbG9ja2RpdiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY2xvY2tkaXYsICJGb3JjZSBwaXhlbCBjbG9jayBkaXZpc29yIHRvIGEgc3BlY2lmaWMgdmFsdWUiKTsKK21vZHVsZV9wYXJhbShwYWNrZXRzaXplLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwYWNrZXRzaXplLCAiRm9yY2UgYSBzcGVjaWZpYyBpc29jIHBhY2tldCBzaXplIik7Cittb2R1bGVfcGFyYW0oZnJhbWVkcm9wLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmcmFtZWRyb3AsICJGb3JjZSBhIHNwZWNpZmljIGZyYW1lIGRyb3AgcmVnaXN0ZXIgc2V0dGluZyIpOworbW9kdWxlX3BhcmFtKGZhc3RzZXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZhc3RzZXQsICJBbGxvd3MgcGljdHVyZSBzZXR0aW5ncyB0byB0YWtlIGVmZmVjdCBpbW1lZGlhdGVseSIpOworbW9kdWxlX3BhcmFtKGZvcmNlX3BhbGV0dGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3BhbGV0dGUsICJGb3JjZSB0aGUgcGFsZXR0ZSB0byBhIHNwZWNpZmljIHZhbHVlIik7Cittb2R1bGVfcGFyYW0oYmFja2xpZ2h0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhiYWNrbGlnaHQsICJGb3Igb2JqZWN0cyB0aGF0IGFyZSBsaXQgZnJvbSBiZWhpbmQiKTsKK3N0YXRpYyBpbnQgbnVtX3V2OworbW9kdWxlX3BhcmFtX2FycmF5KHVuaXRfdmlkZW8sIGludCwgJm51bV91diwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHVuaXRfdmlkZW8sCisgICJGb3JjZSB1c2Ugb2Ygc3BlY2lmaWMgbWlub3IgbnVtYmVyKHMpLiAwIGlzIG5vdCBhbGxvd2VkLiIpOworbW9kdWxlX3BhcmFtKHJlbW92ZV96ZXJvcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVtb3ZlX3plcm9zLAorICAiUmVtb3ZlIHplcm8tcGFkZGluZyBmcm9tIHVuY29tcHJlc3NlZCBpbmNvbWluZyBkYXRhIik7Cittb2R1bGVfcGFyYW0obWlycm9yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaXJyb3IsICJSZXZlcnNlIGltYWdlIGhvcml6b250YWxseSIpOworbW9kdWxlX3BhcmFtKG92NTE4X2NvbG9yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhvdjUxOF9jb2xvciwgIkVuYWJsZSBPVjUxOCBjb2xvciAoZXhwZXJpbWVudGFsKSIpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1pc2NlbGxhbmVvdXMgR2xvYmFscworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBvdjUxMV9kcml2ZXI7CisKK3N0YXRpYyBzdHJ1Y3Qgb3Y1MXhfZGVjb21wX29wcyAqb3Y1MTFfZGVjb21wX29wczsKK3N0YXRpYyBzdHJ1Y3Qgb3Y1MXhfZGVjb21wX29wcyAqb3Y1MTFfbW14X2RlY29tcF9vcHM7CitzdGF0aWMgc3RydWN0IG92NTF4X2RlY29tcF9vcHMgKm92NTE4X2RlY29tcF9vcHM7CitzdGF0aWMgc3RydWN0IG92NTF4X2RlY29tcF9vcHMgKm92NTE4X21teF9kZWNvbXBfb3BzOworCisvKiBOdW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgYSBmYWlsZWQgSTJDIHRyYW5zYWN0aW9uLiBJbmNyZWFzZSB0aGlzIGlmIHlvdQorICogYXJlIGdldHRpbmcgIkZhaWxlZCB0byByZWFkIHNlbnNvciBJRC4uLiIgKi8KK3N0YXRpYyBpbnQgaTJjX2RldGVjdF90cmllcyA9IDU7CisKKy8qIE1NWCBzdXBwb3J0IGlzIHByZXNlbnQgaW4ga2VybmVsIGFuZCBDUFUuIENoZWNrZWQgdXBvbiBkZWNvbXAgbW9kdWxlIGxvYWQuICovCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBvdjUxeF9tbXhfYXZhaWxhYmxlIChjcHVfaGFzX21teCkKKyNlbHNlCisjZGVmaW5lIG92NTF4X21teF9hdmFpbGFibGUgKDApCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVkVORF9PTU5JVklTSU9OLCBQUk9EX09WNTExKSB9LAorCXsgVVNCX0RFVklDRShWRU5EX09NTklWSVNJT04sIFBST0RfT1Y1MTFQTFVTKSB9LAorCXsgVVNCX0RFVklDRShWRU5EX09NTklWSVNJT04sIFBST0RfT1Y1MTgpIH0sCisJeyBVU0JfREVWSUNFKFZFTkRfT01OSVZJU0lPTiwgUFJPRF9PVjUxOFBMVVMpIH0sCisJeyBVU0JfREVWSUNFKFZFTkRfTUFUVEVMLCBQUk9EX01FMkNBTSkgfSwKKwl7IH0gIC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGRldmljZV90YWJsZSk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHlRdWFuVGFibGU1MTFbXSA9IE9WNTExX1lRVUFOVEFCTEU7CitzdGF0aWMgdW5zaWduZWQgY2hhciB1dlF1YW5UYWJsZTUxMVtdID0gT1Y1MTFfVVZRVUFOVEFCTEU7CitzdGF0aWMgdW5zaWduZWQgY2hhciB5UXVhblRhYmxlNTE4W10gPSBPVjUxOF9ZUVVBTlRBQkxFOworc3RhdGljIHVuc2lnbmVkIGNoYXIgdXZRdWFuVGFibGU1MThbXSA9IE9WNTE4X1VWUVVBTlRBQkxFOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3ltYm9saWMgTmFtZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBLbm93biBPVjUxMS1iYXNlZCBjYW1lcmFzICovCitzdGF0aWMgc3RydWN0IHN5bWJvbGljX2xpc3QgY2FtbGlzdFtdID0geworCXsgICAwLCAiR2VuZXJpYyBDYW1lcmEgKG5vIElEKSIgfSwKKwl7ICAgMSwgIk11c3RlayBXQ2FtIDNYIiB9LAorCXsgICAzLCAiRC1MaW5rIERTQi1DMzAwIiB9LAorCXsgICA0LCAiR2VuZXJpYyBPVjUxMS9PVjc2MTAiIH0sCisJeyAgIDUsICJQdXJldGVrIFBULTYwMDciIH0sCisJeyAgIDYsICJMaWZldmlldyBVU0IgTGlmZSBUViAoTlRTQykiIH0sCisJeyAgMjEsICJDcmVhdGl2ZSBMYWJzIFdlYkNhbSAzIiB9LAorCXsgIDIyLCAiTGlmZXZpZXcgVVNCIExpZmUgVFYgKFBBTCBEL0srQi9HKSIgfSwKKwl7ICAzNiwgIktvYWxhLUNhbSIgfSwKKwl7ICAzOCwgIkxpZmV2aWV3IFVTQiBMaWZlIFRWIChQQUwpIiB9LAorCXsgIDQxLCAiU2Ftc3VuZyBBbnljYW0gTVBDLU0xMCIgfSwKKwl7ICA0MywgIk10ZWt2aXNpb24gWmVjYSBNVjQwMiIgfSwKKwl7ICA0NiwgIlN1bWEgZU9OIiB9LAorCXsgIDcwLCAiTGlmZXZpZXcgVVNCIExpZmUgVFYgKFBBTC9TRUNBTSkiIH0sCisJeyAxMDAsICJMaWZldmlldyBSb2JvQ2FtIiB9LAorCXsgMTAyLCAiQXZlck1lZGlhIEludGVyQ2FtIEVsaXRlIiB9LAorCXsgMTEyLCAiTWVkaWFGb3J0ZSBNVjMwMCIgfSwJLyogb3IgT1Y3MTEwIGV2YWx1YXRpb24ga2l0ICovCisJeyAxMzQsICJFem9uaWNzIEVaQ2FtIElJIiB9LAorCXsgMTkyLCAiV2ViZXllIDIwMDBCIiB9LAorCXsgMjUzLCAiQWxwaGEgVmlzaW9uIFRlY2guIEFscGhhQ2FtIFNFIiB9LAorCXsgIC0xLCBOVUxMIH0KK307CisKKy8qIFZpZGVvNExpbnV4MSBQYWxldHRlcyAqLworc3RhdGljIHN0cnVjdCBzeW1ib2xpY19saXN0IHY0bDFfcGxpc3RbXSA9IHsKKwl7IFZJREVPX1BBTEVUVEVfR1JFWSwJIkdSRVkiIH0sCisJeyBWSURFT19QQUxFVFRFX0hJMjQwLAkiSEkyNDAiIH0sCisJeyBWSURFT19QQUxFVFRFX1JHQjU2NSwJIlJHQjU2NSIgfSwKKwl7IFZJREVPX1BBTEVUVEVfUkdCMjQsCSJSR0IyNCIgfSwKKwl7IFZJREVPX1BBTEVUVEVfUkdCMzIsCSJSR0IzMiIgfSwKKwl7IFZJREVPX1BBTEVUVEVfUkdCNTU1LAkiUkdCNTU1IiB9LAorCXsgVklERU9fUEFMRVRURV9ZVVY0MjIsCSJZVVY0MjIiIH0sCisJeyBWSURFT19QQUxFVFRFX1lVWVYsCSJZVVlWIiB9LAorCXsgVklERU9fUEFMRVRURV9VWVZZLAkiVVlWWSIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVWNDIwLAkiWVVWNDIwIiB9LAorCXsgVklERU9fUEFMRVRURV9ZVVY0MTEsCSJZVVY0MTEiIH0sCisJeyBWSURFT19QQUxFVFRFX1JBVywJIlJBVyIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVWNDIyUCwiWVVWNDIyUCIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVWNDExUCwiWVVWNDExUCIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVWNDIwUCwiWVVWNDIwUCIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVWNDEwUCwiWVVWNDEwUCIgfSwKKwl7IC0xLCBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9saWNfbGlzdCBicmdsaXN0W10gPSB7CisJeyBCUkdfT1Y1MTEsCQkiT1Y1MTEiIH0sCisJeyBCUkdfT1Y1MTFQTFVTLAkiT1Y1MTErIiB9LAorCXsgQlJHX09WNTE4LAkJIk9WNTE4IiB9LAorCXsgQlJHX09WNTE4UExVUywJIk9WNTE4KyIgfSwKKwl7IC0xLCBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9saWNfbGlzdCBzZW5saXN0W10gPSB7CisJeyBTRU5fT1Y3NkJFLAkiT1Y3NkJFIiB9LAorCXsgU0VOX09WNzYxMCwJIk9WNzYxMCIgfSwKKwl7IFNFTl9PVjc2MjAsCSJPVjc2MjAiIH0sCisJeyBTRU5fT1Y3NjIwQUUsCSJPVjc2MjBBRSIgfSwKKwl7IFNFTl9PVjY2MjAsCSJPVjY2MjAiIH0sCisJeyBTRU5fT1Y2NjMwLAkiT1Y2NjMwIiB9LAorCXsgU0VOX09WNjYzMEFFLAkiT1Y2NjMwQUUiIH0sCisJeyBTRU5fT1Y2NjMwQUYsCSJPVjY2MzBBRiIgfSwKKwl7IFNFTl9PVjg2MDAsCSJPVjg2MDAiIH0sCisJeyBTRU5fS1MwMTI3LAkiS1MwMTI3IiB9LAorCXsgU0VOX0tTMDEyN0IsCSJLUzAxMjdCIiB9LAorCXsgU0VOX1NBQTcxMTFBLAkiU0FBNzExMUEiIH0sCisJeyAtMSwgTlVMTCB9Cit9OworCisvKiBVUkIgZXJyb3IgY29kZXM6ICovCitzdGF0aWMgc3RydWN0IHN5bWJvbGljX2xpc3QgdXJiX2Vycmxpc3RbXSA9IHsKKwl7IC1FTk9TUiwJIkJ1ZmZlciBlcnJvciAob3ZlcnJ1bikiIH0sCisJeyAtRVBJUEUsCSJTdGFsbGVkIChkZXZpY2Ugbm90IHJlc3BvbmRpbmcpIiB9LAorCXsgLUVPVkVSRkxPVywJIkJhYmJsZSAoYmFkIGNhYmxlPykiIH0sCisJeyAtRVBST1RPLAkiQml0LXN0dWZmIGVycm9yIChiYWQgY2FibGU/KSIgfSwKKwl7IC1FSUxTRVEsCSJDUkMvVGltZW91dCIgfSwKKwl7IC1FVElNRURPVVQsCSJOQUsgKGRldmljZSBkb2VzIG5vdCByZXNwb25kKSIgfSwKKwl7IC0xLCBOVUxMIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNZW1vcnkgbWFuYWdlbWVudAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCAqCitydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqbWVtOworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJbWVtID0gdm1hbGxvY18zMihzaXplKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KKwlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlIChzaXplID4gMCkgeworCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBtZW07Cit9CisKK3N0YXRpYyB2b2lkCitydmZyZWUodm9pZCAqbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBhZHI7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisJdmZyZWUobWVtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWdpc3RlciBJL08KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV3JpdGUgYW4gT1Y1MXggcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbnQKK3JlZ193KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoNSwgIjB4JTAyWDoweCUwMlgiLCByZWcsIHZhbHVlKTsKKworCWRvd24oJm92LT5jYnVmX2xvY2spOworCW92LT5jYnVmWzBdID0gdmFsdWU7CisJcmMgPSB1c2JfY29udHJvbF9tc2cob3YtPmRldiwKKwkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKG92LT5kZXYsIDApLAorCQkJICAgICAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpPzE6MiAvKiBSRUdfSU8gKi8sCisJCQkgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgIDAsIChfX3UxNilyZWcsICZvdi0+Y2J1ZlswXSwgMSwgMTAwMCk7CisJdXAoJm92LT5jYnVmX2xvY2spOworCisJaWYgKHJjIDwgMCkKKwkJZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkOiAlcyIsIHJjLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgcmMpKTsKKworCXJldHVybiByYzsKK30KKworLyogUmVhZCBmcm9tIGFuIE9WNTF4IHJlZ2lzdGVyICovCisvKiByZXR1cm5zOiBuZWdhdGl2ZSBpcyBlcnJvciwgcG9zIG9yIHplcm8gaXMgZGF0YSAqLworc3RhdGljIGludAorcmVnX3Ioc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgcmVnKQoreworCWludCByYzsKKworCWRvd24oJm92LT5jYnVmX2xvY2spOworCXJjID0gdXNiX2NvbnRyb2xfbXNnKG92LT5kZXYsCisJCQkgICAgIHVzYl9yY3ZjdHJscGlwZShvdi0+ZGV2LCAwKSwKKwkJCSAgICAgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KT8xOjMgLyogUkVHX0lPICovLAorCQkJICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgMCwgKF9fdTE2KXJlZywgJm92LT5jYnVmWzBdLCAxLCAxMDAwKTsKKworCWlmIChyYyA8IDApIHsKKwkJZXJyKCJyZWcgcmVhZDogZXJyb3IgJWQ6ICVzIiwgcmMsIHN5bWJvbGljKHVyYl9lcnJsaXN0LCByYykpOworCX0gZWxzZSB7CisJCXJjID0gb3YtPmNidWZbMF07CisJCVBERUJVRyg1LCAiMHglMDJYOjB4JTAyWCIsIHJlZywgb3YtPmNidWZbMF0pOworCX0KKworCXVwKCZvdi0+Y2J1Zl9sb2NrKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFdyaXRlcyBiaXRzIGF0IHBvc2l0aW9ucyBzcGVjaWZpZWQgYnkgbWFzayB0byBhbiBPVjUxeCByZWcuIEJpdHMgdGhhdCBhcmUgaW4KKyAqIHRoZSBzYW1lIHBvc2l0aW9uIGFzIDEncyBpbiAibWFzayIgYXJlIGNsZWFyZWQgYW5kIHNldCB0byAidmFsdWUiLiBCaXRzCisgKiB0aGF0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvbiBhcyAwJ3MgaW4gIm1hc2siIGFyZSBwcmVzZXJ2ZWQsIHJlZ2FyZGxlc3MKKyAqIG9mIHRoZWlyIHJlc3BlY3RpdmUgc3RhdGUgaW4gInZhbHVlIi4KKyAqLworc3RhdGljIGludAorcmVnX3dfbWFzayhzdHJ1Y3QgdXNiX292NTExICpvdiwKKwkgICB1bnNpZ25lZCBjaGFyIHJlZywKKwkgICB1bnNpZ25lZCBjaGFyIHZhbHVlLAorCSAgIHVuc2lnbmVkIGNoYXIgbWFzaykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgb2xkdmFsLCBuZXd2YWw7CisKKwlyZXQgPSByZWdfcihvdiwgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW9sZHZhbCA9ICh1bnNpZ25lZCBjaGFyKSByZXQ7CisJb2xkdmFsICY9ICh+bWFzayk7CQkvKiBDbGVhciB0aGUgbWFza2VkIGJpdHMgKi8KKwl2YWx1ZSAmPSBtYXNrOwkJCS8qIEVuZm9yY2UgbWFzayBvbiB2YWx1ZSAqLworCW5ld3ZhbCA9IG9sZHZhbCB8IHZhbHVlOwkvKiBTZXQgdGhlIGRlc2lyZWQgYml0cyAqLworCisJcmV0dXJuIChyZWdfdyhvdiwgcmVnLCBuZXd2YWwpKTsKK30KKworLyogCisgKiBXcml0ZXMgbXVsdGlwbGUgKG4pIGJ5dGUgdmFsdWUgdG8gYSBzaW5nbGUgcmVnaXN0ZXIuIE9ubHkgdmFsaWQgd2l0aCBjZXJ0YWluCisgKiByZWdpc3RlcnMgKDB4MzAgYW5kIDB4YzQgLSAweGNlKS4KKyAqLworc3RhdGljIGludAorb3Y1MThfcmVnX3czMihzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciByZWcsIHUzMiB2YWwsIGludCBuKQoreworCWludCByYzsKKworCVBERUJVRyg1LCAiMHglMDJYOiU3ZCwgbj0lZCIsIHJlZywgdmFsLCBuKTsKKworCWRvd24oJm92LT5jYnVmX2xvY2spOworCisJKigoX19sZTMyICopb3YtPmNidWYpID0gX19jcHVfdG9fbGUzMih2YWwpOworCisJcmMgPSB1c2JfY29udHJvbF9tc2cob3YtPmRldiwKKwkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKG92LT5kZXYsIDApLAorCQkJICAgICAxIC8qIFJFR19JTyAqLywKKwkJCSAgICAgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgMCwgKF9fdTE2KXJlZywgb3YtPmNidWYsIG4sIDEwMDApOworCXVwKCZvdi0+Y2J1Zl9sb2NrKTsKKworCWlmIChyYyA8IDApCisJCWVycigicmVnIHdyaXRlIG11bHRpcGxlOiBlcnJvciAlZDogJXMiLCByYywKKwkJICAgIHN5bWJvbGljKHVyYl9lcnJsaXN0LCByYykpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitvdjUxMV91cGxvYWRfcXVhbl90YWJsZXMoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJdW5zaWduZWQgY2hhciAqcFlUYWJsZSA9IHlRdWFuVGFibGU1MTE7CisJdW5zaWduZWQgY2hhciAqcFVWVGFibGUgPSB1dlF1YW5UYWJsZTUxMTsKKwl1bnNpZ25lZCBjaGFyIHZhbDAsIHZhbDE7CisJaW50IGksIHJjLCByZWcgPSBSNTExX0NPTVBfTFVUX0JFR0lOOworCisJUERFQlVHKDQsICJVcGxvYWRpbmcgcXVhbnRpemF0aW9uIHRhYmxlcyIpOworCisJZm9yIChpID0gMDsgaSA8IE9WNTExX1FVQU5UQUJMRVNJWkUgLyAyOyBpKyspIHsKKwkJaWYgKEVOQUJMRV9ZX1FVQU5UQUJMRSkJeworCQkJdmFsMCA9ICpwWVRhYmxlKys7CisJCQl2YWwxID0gKnBZVGFibGUrKzsKKwkJCXZhbDAgJj0gMHgwZjsKKwkJCXZhbDEgJj0gMHgwZjsKKwkJCXZhbDAgfD0gdmFsMSA8PCA0OworCQkJcmMgPSByZWdfdyhvdiwgcmVnLCB2YWwwKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQl9CisKKwkJaWYgKEVOQUJMRV9VVl9RVUFOVEFCTEUpIHsKKwkJCXZhbDAgPSAqcFVWVGFibGUrKzsKKwkJCXZhbDEgPSAqcFVWVGFibGUrKzsKKwkJCXZhbDAgJj0gMHgwZjsKKwkJCXZhbDEgJj0gMHgwZjsKKwkJCXZhbDAgfD0gdmFsMSA8PCA0OworCQkJcmMgPSByZWdfdyhvdiwgcmVnICsgT1Y1MTFfUVVBTlRBQkxFU0laRS8yLCB2YWwwKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQl9CisKKwkJcmVnKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIE9WNTE4IHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIDh4NCAoaW5zdGVhZCBvZiA4eDgpICovCitzdGF0aWMgaW50CitvdjUxOF91cGxvYWRfcXVhbl90YWJsZXMoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJdW5zaWduZWQgY2hhciAqcFlUYWJsZSA9IHlRdWFuVGFibGU1MTg7CisJdW5zaWduZWQgY2hhciAqcFVWVGFibGUgPSB1dlF1YW5UYWJsZTUxODsKKwl1bnNpZ25lZCBjaGFyIHZhbDAsIHZhbDE7CisJaW50IGksIHJjLCByZWcgPSBSNTExX0NPTVBfTFVUX0JFR0lOOworCisJUERFQlVHKDQsICJVcGxvYWRpbmcgcXVhbnRpemF0aW9uIHRhYmxlcyIpOworCisJZm9yIChpID0gMDsgaSA8IE9WNTE4X1FVQU5UQUJMRVNJWkUgLyAyOyBpKyspIHsKKwkJaWYgKEVOQUJMRV9ZX1FVQU5UQUJMRSkgeworCQkJdmFsMCA9ICpwWVRhYmxlKys7CisJCQl2YWwxID0gKnBZVGFibGUrKzsKKwkJCXZhbDAgJj0gMHgwZjsKKwkJCXZhbDEgJj0gMHgwZjsKKwkJCXZhbDAgfD0gdmFsMSA8PCA0OworCQkJcmMgPSByZWdfdyhvdiwgcmVnLCB2YWwwKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQl9CisKKwkJaWYgKEVOQUJMRV9VVl9RVUFOVEFCTEUpIHsKKwkJCXZhbDAgPSAqcFVWVGFibGUrKzsKKwkJCXZhbDEgPSAqcFVWVGFibGUrKzsKKwkJCXZhbDAgJj0gMHgwZjsKKwkJCXZhbDEgJj0gMHgwZjsKKwkJCXZhbDAgfD0gdmFsMSA8PCA0OworCQkJcmMgPSByZWdfdyhvdiwgcmVnICsgT1Y1MThfUVVBTlRBQkxFU0laRS8yLCB2YWwwKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQl9CisKKwkJcmVnKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK292NTF4X3Jlc2V0KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHJlc2V0X3R5cGUpCit7CisJaW50IHJjOworCisJLyogU2V0dGluZyBiaXQgMCBub3QgYWxsb3dlZCBvbiA1MTgvNTE4UGx1cyAqLworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKKwkJcmVzZXRfdHlwZSAmPSAweGZlOworCisJUERFQlVHKDQsICJSZXNldDogdHlwZT0weCUwMlgiLCByZXNldF90eXBlKTsKKworCXJjID0gcmVnX3cob3YsIFI1MXhfU1lTX1JFU0VULCByZXNldF90eXBlKTsKKwlyYyA9IHJlZ193KG92LCBSNTF4X1NZU19SRVNFVCwgMCk7CisKKwlpZiAocmMgPCAwKQorCQllcnIoInJlc2V0OiBjb21tYW5kIGZhaWxlZCIpOworCisJcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIExvdy1sZXZlbCBJMkMgSS9PIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOT1RFOiBEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IQorICogVGhlIE9WNTE4IEkyQyBJL08gcHJvY2VkdXJlIGlzIGRpZmZlcmVudCwgaGVuY2UsIHRoaXMgZnVuY3Rpb24uCisgKiBUaGlzIGlzIG5vcm1hbGx5IG9ubHkgY2FsbGVkIGZyb20gaTJjX3coKS4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24KKyAqIGFsd2F5cyBzdWNjZWVkcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHNlbnNvciBpcyBwcmVzZW50IGFuZCB3b3JraW5nLgorICovCitzdGF0aWMgaW50CitvdjUxOF9pMmNfd3JpdGVfaW50ZXJuYWwoc3RydWN0IHVzYl9vdjUxMSAqb3YsCisJCQkgdW5zaWduZWQgY2hhciByZWcsCisJCQkgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoNSwgIjB4JTAyWDoweCUwMlgiLCByZWcsIHZhbHVlKTsKKworCS8qIFNlbGVjdCBjYW1lcmEgcmVnaXN0ZXIgKi8KKwlyYyA9IHJlZ193KG92LCBSNTF4X0kyQ19TQUREUl8zLCByZWcpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIFdyaXRlICJ2YWx1ZSIgdG8gSTJDIGRhdGEgcG9ydCBvZiBPVjUxMSAqLworCXJjID0gcmVnX3cob3YsIFI1MXhfSTJDX0RBVEEsIHZhbHVlKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBJbml0aWF0ZSAzLWJ5dGUgd3JpdGUgY3ljbGUgKi8KKwlyYyA9IHJlZ193KG92LCBSNTE4X0kyQ19DVEwsIDB4MDEpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCisvKiBOT1RFOiBEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5ISAqLworc3RhdGljIGludAorb3Y1MTFfaTJjX3dyaXRlX2ludGVybmFsKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAorCQkJIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJaW50IHJjLCByZXRyaWVzOworCisJUERFQlVHKDUsICIweCUwMlg6MHglMDJYIiwgcmVnLCB2YWx1ZSk7CisKKwkvKiBUaHJlZSBieXRlIHdyaXRlIGN5Y2xlICovCisJZm9yIChyZXRyaWVzID0gT1Y1MTFfSTJDX1JFVFJJRVM7IDsgKSB7CisJCS8qIFNlbGVjdCBjYW1lcmEgcmVnaXN0ZXIgKi8KKwkJcmMgPSByZWdfdyhvdiwgUjUxeF9JMkNfU0FERFJfMywgcmVnKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCisJCS8qIFdyaXRlICJ2YWx1ZSIgdG8gSTJDIGRhdGEgcG9ydCBvZiBPVjUxMSAqLworCQlyYyA9IHJlZ193KG92LCBSNTF4X0kyQ19EQVRBLCB2YWx1ZSk7CisJCWlmIChyYyA8IDApCisJCQlicmVhazsKKworCQkvKiBJbml0aWF0ZSAzLWJ5dGUgd3JpdGUgY3ljbGUgKi8KKwkJcmMgPSByZWdfdyhvdiwgUjUxMV9JMkNfQ1RMLCAweDAxKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCisJCS8qIFJldHJ5IHVudGlsIGlkbGUgKi8KKwkJZG8KKwkJCXJjID0gcmVnX3Iob3YsIFI1MTFfSTJDX0NUTCk7CisJCXdoaWxlIChyYyA+IDAgJiYgKChyYyYxKSA9PSAwKSk7IAorCQlpZiAocmMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogQWNrPyAqLworCQlpZiAoKHJjJjIpID09IDApIHsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisjaWYgMAorCQkvKiBJMkMgYWJvcnQgKi8KKwkJcmVnX3cob3YsIFI1MTFfSTJDX0NUTCwgMHgxMCk7CisjZW5kaWYKKwkJaWYgKC0tcmV0cmllcyA8IDApIHsKKwkJCWVycigiaTJjIHdyaXRlIHJldHJpZXMgZXhoYXVzdGVkIik7CisJCQlyYyA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIE5PVEU6IERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkhCisgKiBUaGUgT1Y1MTggSTJDIEkvTyBwcm9jZWR1cmUgaXMgZGlmZmVyZW50LCBoZW5jZSwgdGhpcyBmdW5jdGlvbi4KKyAqIFRoaXMgaXMgbm9ybWFsbHkgb25seSBjYWxsZWQgZnJvbSBpMmNfcigpLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbgorICogYWx3YXlzIHN1Y2NlZWRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgc2Vuc29yIGlzIHByZXNlbnQgYW5kIHdvcmtpbmcuCisgKi8KK3N0YXRpYyBpbnQKK292NTE4X2kyY19yZWFkX2ludGVybmFsKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlpbnQgcmMsIHZhbHVlOworCisJLyogU2VsZWN0IGNhbWVyYSByZWdpc3RlciAqLworCXJjID0gcmVnX3cob3YsIFI1MXhfSTJDX1NBRERSXzIsIHJlZyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogSW5pdGlhdGUgMi1ieXRlIHdyaXRlIGN5Y2xlICovCisJcmMgPSByZWdfdyhvdiwgUjUxOF9JMkNfQ1RMLCAweDAzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBJbml0aWF0ZSAyLWJ5dGUgcmVhZCBjeWNsZSAqLworCXJjID0gcmVnX3cob3YsIFI1MThfSTJDX0NUTCwgMHgwNSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJdmFsdWUgPSByZWdfcihvdiwgUjUxeF9JMkNfREFUQSk7CisKKwlQREVCVUcoNSwgIjB4JTAyWDoweCUwMlgiLCByZWcsIHZhbHVlKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworLyogTk9URTogRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSEKKyAqIHJldHVybnM6IG5lZ2F0aXZlIGlzIGVycm9yLCBwb3Mgb3IgemVybyBpcyBkYXRhICovCitzdGF0aWMgaW50CitvdjUxMV9pMmNfcmVhZF9pbnRlcm5hbChzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciByZWcpCit7CisJaW50IHJjLCB2YWx1ZSwgcmV0cmllczsKKworCS8qIFR3byBieXRlIHdyaXRlIGN5Y2xlICovCisJZm9yIChyZXRyaWVzID0gT1Y1MTFfSTJDX1JFVFJJRVM7IDsgKSB7CisJCS8qIFNlbGVjdCBjYW1lcmEgcmVnaXN0ZXIgKi8KKwkJcmMgPSByZWdfdyhvdiwgUjUxeF9JMkNfU0FERFJfMiwgcmVnKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQkvKiBJbml0aWF0ZSAyLWJ5dGUgd3JpdGUgY3ljbGUgKi8KKwkJcmMgPSByZWdfdyhvdiwgUjUxMV9JMkNfQ1RMLCAweDAzKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQkvKiBSZXRyeSB1bnRpbCBpZGxlICovCisJCWRvCisJCQkgcmMgPSByZWdfcihvdiwgUjUxMV9JMkNfQ1RMKTsKKwkJd2hpbGUgKHJjID4gMCAmJiAoKHJjJjEpID09IDApKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlpZiAoKHJjJjIpID09IDApIC8qIEFjaz8gKi8KKwkJCWJyZWFrOworCisJCS8qIEkyQyBhYm9ydCAqLworCQlyZWdfdyhvdiwgUjUxMV9JMkNfQ1RMLCAweDEwKTsKKworCQlpZiAoLS1yZXRyaWVzIDwgMCkgeworCQkJZXJyKCJpMmMgd3JpdGUgcmV0cmllcyBleGhhdXN0ZWQiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qIFR3byBieXRlIHJlYWQgY3ljbGUgKi8KKwlmb3IgKHJldHJpZXMgPSBPVjUxMV9JMkNfUkVUUklFUzsgOyApIHsKKwkJLyogSW5pdGlhdGUgMi1ieXRlIHJlYWQgY3ljbGUgKi8KKwkJcmMgPSByZWdfdyhvdiwgUjUxMV9JMkNfQ1RMLCAweDA1KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQkvKiBSZXRyeSB1bnRpbCBpZGxlICovCisJCWRvCisJCQlyYyA9IHJlZ19yKG92LCBSNTExX0kyQ19DVEwpOworCQl3aGlsZSAocmMgPiAwICYmICgocmMmMSkgPT0gMCkpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCWlmICgocmMmMikgPT0gMCkgLyogQWNrPyAqLworCQkJYnJlYWs7CisKKwkJLyogSTJDIGFib3J0ICovCisJCXJjID0gcmVnX3cob3YsIFI1MTFfSTJDX0NUTCwgMHgxMCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJaWYgKC0tcmV0cmllcyA8IDApIHsKKwkJCWVycigiaTJjIHJlYWQgcmV0cmllcyBleGhhdXN0ZWQiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXZhbHVlID0gcmVnX3Iob3YsIFI1MXhfSTJDX0RBVEEpOworCisJUERFQlVHKDUsICIweCUwMlg6MHglMDJYIiwgcmVnLCB2YWx1ZSk7CisKKwkvKiBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIGkyY193KCkgd29yayAqLworCXJjID0gcmVnX3cob3YsIFI1MTFfSTJDX0NUTCwgMHgwNSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHZhbHVlOworfQorCisvKiByZXR1cm5zOiBuZWdhdGl2ZSBpcyBlcnJvciwgcG9zIG9yIHplcm8gaXMgZGF0YSAqLworc3RhdGljIGludAoraTJjX3Ioc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgcmVnKQoreworCWludCByYzsKKworCWRvd24oJm92LT5pMmNfbG9jayk7CisKKwlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpCisJCXJjID0gb3Y1MThfaTJjX3JlYWRfaW50ZXJuYWwob3YsIHJlZyk7CisJZWxzZQorCQlyYyA9IG92NTExX2kyY19yZWFkX2ludGVybmFsKG92LCByZWcpOworCisJdXAoJm92LT5pMmNfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2kyY193KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlpbnQgcmM7CisKKwlkb3duKCZvdi0+aTJjX2xvY2spOworCisJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQorCQlyYyA9IG92NTE4X2kyY193cml0ZV9pbnRlcm5hbChvdiwgcmVnLCB2YWx1ZSk7CisJZWxzZQorCQlyYyA9IG92NTExX2kyY193cml0ZV9pbnRlcm5hbChvdiwgcmVnLCB2YWx1ZSk7CisKKwl1cCgmb3YtPmkyY19sb2NrKTsKKworCXJldHVybiByYzsKK30KKworLyogRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSEgKi8KK3N0YXRpYyBpbnQKK292NTF4X2kyY193cml0ZV9tYXNrX2ludGVybmFsKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAorCQkJICAgICAgdW5zaWduZWQgY2hhciByZWcsCisJCQkgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlLAorCQkJICAgICAgdW5zaWduZWQgY2hhciBtYXNrKQoreworCWludCByYzsKKwl1bnNpZ25lZCBjaGFyIG9sZHZhbCwgbmV3dmFsOworCisJaWYgKG1hc2sgPT0gMHhmZikgeworCQluZXd2YWwgPSB2YWx1ZTsKKwl9IGVsc2UgeworCQlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpCisJCQlyYyA9IG92NTE4X2kyY19yZWFkX2ludGVybmFsKG92LCByZWcpOworCQllbHNlCisJCQlyYyA9IG92NTExX2kyY19yZWFkX2ludGVybmFsKG92LCByZWcpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCW9sZHZhbCA9ICh1bnNpZ25lZCBjaGFyKSByYzsKKwkJb2xkdmFsICY9ICh+bWFzayk7CQkvKiBDbGVhciB0aGUgbWFza2VkIGJpdHMgKi8KKwkJdmFsdWUgJj0gbWFzazsJCQkvKiBFbmZvcmNlIG1hc2sgb24gdmFsdWUgKi8KKwkJbmV3dmFsID0gb2xkdmFsIHwgdmFsdWU7CS8qIFNldCB0aGUgZGVzaXJlZCBiaXRzICovCisJfQorCisJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQorCQlyZXR1cm4gKG92NTE4X2kyY193cml0ZV9pbnRlcm5hbChvdiwgcmVnLCBuZXd2YWwpKTsKKwllbHNlCisJCXJldHVybiAob3Y1MTFfaTJjX3dyaXRlX2ludGVybmFsKG92LCByZWcsIG5ld3ZhbCkpOworfQorCisvKiBXcml0ZXMgYml0cyBhdCBwb3NpdGlvbnMgc3BlY2lmaWVkIGJ5IG1hc2sgdG8gYW4gSTJDIHJlZy4gQml0cyB0aGF0IGFyZSBpbgorICogdGhlIHNhbWUgcG9zaXRpb24gYXMgMSdzIGluICJtYXNrIiBhcmUgY2xlYXJlZCBhbmQgc2V0IHRvICJ2YWx1ZSIuIEJpdHMKKyAqIHRoYXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uIGFzIDAncyBpbiAibWFzayIgYXJlIHByZXNlcnZlZCwgcmVnYXJkbGVzcworICogb2YgdGhlaXIgcmVzcGVjdGl2ZSBzdGF0ZSBpbiAidmFsdWUiLgorICovCitzdGF0aWMgaW50CitpMmNfd19tYXNrKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAorCSAgIHVuc2lnbmVkIGNoYXIgcmVnLAorCSAgIHVuc2lnbmVkIGNoYXIgdmFsdWUsCisJICAgdW5zaWduZWQgY2hhciBtYXNrKQoreworCWludCByYzsKKworCWRvd24oJm92LT5pMmNfbG9jayk7CisJcmMgPSBvdjUxeF9pMmNfd3JpdGVfbWFza19pbnRlcm5hbChvdiwgcmVnLCB2YWx1ZSwgbWFzayk7CisJdXAoJm92LT5pMmNfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNldCB0aGUgcmVhZCBhbmQgd3JpdGUgc2xhdmUgSURzLiBUaGUgInNsYXZlIiBhcmd1bWVudCBpcyB0aGUgd3JpdGUgc2xhdmUsCisgKiBhbmQgdGhlIHJlYWQgc2xhdmUgd2lsbCBiZSBzZXQgdG8gKHNsYXZlICsgMSkuIG92LT5pMmNfbG9jayBzaG91bGQgYmUgaGVsZAorICogd2hlbiBjYWxsaW5nIHRoaXMuIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIHRoZSBpMmMgSS9PCisgKiBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQKK2kyY19zZXRfc2xhdmVfaW50ZXJuYWwoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgc2xhdmUpCit7CisJaW50IHJjOworCisJcmMgPSByZWdfdyhvdiwgUjUxeF9JMkNfV19TSUQsIHNsYXZlKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHJlZ193KG92LCBSNTF4X0kyQ19SX1NJRCwgc2xhdmUgKyAxKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworLyogV3JpdGUgdG8gYSBzcGVjaWZpYyBJMkMgc2xhdmUgSUQgYW5kIHJlZ2lzdGVyLCB1c2luZyB0aGUgc3BlY2lmaWVkIG1hc2sgKi8KK3N0YXRpYyBpbnQKK2kyY193X3NsYXZlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAorCSAgICB1bnNpZ25lZCBjaGFyIHNsYXZlLAorCSAgICB1bnNpZ25lZCBjaGFyIHJlZywKKwkgICAgdW5zaWduZWQgY2hhciB2YWx1ZSwKKwkgICAgdW5zaWduZWQgY2hhciBtYXNrKQoreworCWludCByYyA9IDA7CisKKwlkb3duKCZvdi0+aTJjX2xvY2spOworCisJLyogU2V0IG5ldyBzbGF2ZSBJRHMgKi8KKwlyYyA9IGkyY19zZXRfc2xhdmVfaW50ZXJuYWwob3YsIHNsYXZlKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dDsKKworCXJjID0gb3Y1MXhfaTJjX3dyaXRlX21hc2tfaW50ZXJuYWwob3YsIHJlZywgdmFsdWUsIG1hc2spOworCitvdXQ6CisJLyogUmVzdG9yZSBwcmltYXJ5IElEcyAqLworCWlmIChpMmNfc2V0X3NsYXZlX2ludGVybmFsKG92LCBvdi0+cHJpbWFyeV9pMmNfc2xhdmUpIDwgMCkKKwkJZXJyKCJDb3VsZG4ndCByZXN0b3JlIHByaW1hcnkgSTJDIHNsYXZlIik7CisKKwl1cCgmb3YtPmkyY19sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJlYWQgZnJvbSBhIHNwZWNpZmljIEkyQyBzbGF2ZSBJRCBhbmQgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbnQKK2kyY19yX3NsYXZlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAorCSAgICB1bnNpZ25lZCBjaGFyIHNsYXZlLAorCSAgICB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlpbnQgcmM7CisKKwlkb3duKCZvdi0+aTJjX2xvY2spOworCisJLyogU2V0IG5ldyBzbGF2ZSBJRHMgKi8KKwlyYyA9IGkyY19zZXRfc2xhdmVfaW50ZXJuYWwob3YsIHNsYXZlKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKKwkJcmMgPSBvdjUxOF9pMmNfcmVhZF9pbnRlcm5hbChvdiwgcmVnKTsKKwllbHNlCisJCXJjID0gb3Y1MTFfaTJjX3JlYWRfaW50ZXJuYWwob3YsIHJlZyk7CisKK291dDoKKwkvKiBSZXN0b3JlIHByaW1hcnkgSURzICovCisJaWYgKGkyY19zZXRfc2xhdmVfaW50ZXJuYWwob3YsIG92LT5wcmltYXJ5X2kyY19zbGF2ZSkgPCAwKQorCQllcnIoIkNvdWxkbid0IHJlc3RvcmUgcHJpbWFyeSBJMkMgc2xhdmUiKTsKKworCXVwKCZvdi0+aTJjX2xvY2spOworCXJldHVybiByYzsKK30KKworLyogU2V0cyBJMkMgcmVhZCBhbmQgd3JpdGUgc2xhdmUgSURzLiBSZXR1cm5zIDwwIGZvciBlcnJvciAqLworc3RhdGljIGludAorb3Y1MXhfc2V0X3NsYXZlX2lkcyhzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciBzaWQpCit7CisJaW50IHJjOworCisJZG93bigmb3YtPmkyY19sb2NrKTsKKworCXJjID0gaTJjX3NldF9zbGF2ZV9pbnRlcm5hbChvdiwgc2lkKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dDsKKworCS8vIEZJWE1FOiBJcyB0aGlzIGFjdHVhbGx5IG5lY2Vzc2FyeT8KKwlyYyA9IG92NTF4X3Jlc2V0KG92LCBPVjUxMV9SRVNFVF9OT1JFR1MpOworb3V0OgorCXVwKCZvdi0+aTJjX2xvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAord3JpdGVfcmVndmFscyhzdHJ1Y3QgdXNiX292NTExICpvdiwgc3RydWN0IG92NTExX3JlZ3ZhbHMgKiBwUmVndmFscykKK3sKKwlpbnQgcmM7CisKKwl3aGlsZSAocFJlZ3ZhbHMtPmJ1cyAhPSBPVjUxMV9ET05FX0JVUykgeworCQlpZiAocFJlZ3ZhbHMtPmJ1cyA9PSBPVjUxMV9SRUdfQlVTKSB7CisJCQlpZiAoKHJjID0gcmVnX3cob3YsIHBSZWd2YWxzLT5yZWcsIHBSZWd2YWxzLT52YWwpKSA8IDApCisJCQkJcmV0dXJuIHJjOworCQl9IGVsc2UgaWYgKHBSZWd2YWxzLT5idXMgPT0gT1Y1MTFfSTJDX0JVUykgeworCQkJaWYgKChyYyA9IGkyY193KG92LCBwUmVndmFscy0+cmVnLCBwUmVndmFscy0+dmFsKSkgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfSBlbHNlIHsKKwkJCWVycigiQmFkIHJlZ3ZhbCBhcnJheSIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXBSZWd2YWxzKys7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgT1Y1MTFfREVCVUcKK3N0YXRpYyB2b2lkCitkdW1wX2kyY19yYW5nZShzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IHJlZzEsIGludCByZWduKQoreworCWludCBpLCByYzsKKworCWZvciAoaSA9IHJlZzE7IGkgPD0gcmVnbjsgaSsrKSB7CisJCXJjID0gaTJjX3Iob3YsIGkpOworCQlpbmZvKCJTZW5zb3JbMHglMDJYXSA9IDB4JTAyWCIsIGksIHJjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2kyY19yZWdzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWluZm8oIkkyQyBSRUdTIik7CisJZHVtcF9pMmNfcmFuZ2Uob3YsIDB4MDAsIDB4N0MpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9yZWdfcmFuZ2Uoc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCByZWcxLCBpbnQgcmVnbikKK3sKKwlpbnQgaSwgcmM7CisKKwlmb3IgKGkgPSByZWcxOyBpIDw9IHJlZ247IGkrKykgeworCQlyYyA9IHJlZ19yKG92LCBpKTsKKwkJaW5mbygiT1Y1MTFbMHglMDJYXSA9IDB4JTAyWCIsIGksIHJjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitvdjUxMV9kdW1wX3JlZ3Moc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW5mbygiQ0FNRVJBIElOVEVSRkFDRSBSRUdTIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4MTAsIDB4MWYpOworCWluZm8oIkRSQU0gSU5URVJGQUNFIFJFR1MiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHgyMCwgMHgyMyk7CisJaW5mbygiSVNPIEZJRk8gUkVHUyIpOworCWR1bXBfcmVnX3JhbmdlKG92LCAweDMwLCAweDMxKTsKKwlpbmZvKCJQSU8gUkVHUyIpOworCWR1bXBfcmVnX3JhbmdlKG92LCAweDM4LCAweDM5KTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHgzZSwgMHgzZSk7CisJaW5mbygiSTJDIFJFR1MiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHg0MCwgMHg0OSk7CisJaW5mbygiU1lTVEVNIENPTlRST0wgUkVHUyIpOworCWR1bXBfcmVnX3JhbmdlKG92LCAweDUwLCAweDU1KTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHg1ZSwgMHg1Zik7CisJaW5mbygiT21uaUNFIFJFR1MiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHg3MCwgMHg3OSk7CisJLyogTk9URTogUXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgbm90IHJlYWRhYmxlLiBZb3Ugd2lsbCBnZXQgdGhlIHZhbHVlCisJICogaW4gcmVnLiAweDc5IGZvciBldmVyeSB0YWJsZSByZWdpc3RlciAqLworCWR1bXBfcmVnX3JhbmdlKG92LCAweDgwLCAweDlmKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHhhMCwgMHhiZik7CisKK30KKworc3RhdGljIHZvaWQKK292NTE4X2R1bXBfcmVncyhzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbmZvKCJWSURFTyBNT0RFIFJFR1MiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHgyMCwgMHgyZik7CisJaW5mbygiREFUQSBQVU1QIEFORCBTTkFQU0hPVCBSRUdTIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4MzAsIDB4M2YpOworCWluZm8oIkkyQyBSRUdTIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4NDAsIDB4NGYpOworCWluZm8oIlNZU1RFTSBDT05UUk9MIEFORCBWRU5ET1IgUkVHUyIpOworCWR1bXBfcmVnX3JhbmdlKG92LCAweDUwLCAweDVmKTsKKwlpbmZvKCI2MCAtIDZGIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4NjAsIDB4NmYpOworCWluZm8oIjcwIC0gN0YiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHg3MCwgMHg3Zik7CisJaW5mbygiWSBRVUFOVElaQVRJT04gVEFCTEUiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHg4MCwgMHg4Zik7CisJaW5mbygiVVYgUVVBTlRJWkFUSU9OIFRBQkxFIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4OTAsIDB4OWYpOworCWluZm8oIkEwIC0gQkYiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHhhMCwgMHhiZik7CisJaW5mbygiQ0JSIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4YzAsIDB4Y2YpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGVtcG9yYXJpbHkgc3RvcHMgT1Y1MTEgZnJvbSBmdW5jdGlvbmluZy4gTXVzdCBkbyB0aGlzIGJlZm9yZSBjaGFuZ2luZworICogcmVnaXN0ZXJzIHdoaWxlIHRoZSBjYW1lcmEgaXMgc3RyZWFtaW5nICovCitzdGF0aWMgaW5saW5lIGludAorb3Y1MXhfc3RvcChzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlQREVCVUcoNCwgInN0b3BwaW5nIik7CisJb3YtPnN0b3BwZWQgPSAxOworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKKwkJcmV0dXJuIChyZWdfd19tYXNrKG92LCBSNTF4X1NZU19SRVNFVCwgMHgzYSwgMHgzYSkpOworCWVsc2UKKwkJcmV0dXJuIChyZWdfdyhvdiwgUjUxeF9TWVNfUkVTRVQsIDB4M2QpKTsKK30KKworLyogUmVzdGFydHMgT1Y1MTEgYWZ0ZXIgb3Y1MTFfc3RvcCgpIGlzIGNhbGxlZC4gSGFzIG5vIGVmZmVjdCBpZiBpdCBpcyBub3QKKyAqIGFjdHVhbGx5IHN0b3BwZWQgKGZvciBwZXJmb3JtYW5jZSkuICovCitzdGF0aWMgaW5saW5lIGludAorb3Y1MXhfcmVzdGFydChzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpZiAob3YtPnN0b3BwZWQpIHsKKwkJUERFQlVHKDQsICJyZXN0YXJ0aW5nIik7CisJCW92LT5zdG9wcGVkID0gMDsKKworCQkvKiBSZWluaXRpYWxpemUgdGhlIHN0cmVhbSAqLworCQlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpCisJCQlyZWdfdyhvdiwgMHgyZiwgMHg4MCk7CisKKwkJcmV0dXJuIChyZWdfdyhvdiwgUjUxeF9TWVNfUkVTRVQsIDB4MDApKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU2xlZXBzIHVudGlsIG5vIGZyYW1lcyBhcmUgYWN0aXZlLiBSZXR1cm5zICEwIGlmIGdvdCBzaWduYWwgKi8KK3N0YXRpYyBpbnQKK292NTF4X3dhaXRfZnJhbWVzX2luYWN0aXZlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCXJldHVybiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUob3YtPndxLCBvdi0+Y3VyZnJhbWUgPCAwKTsKK30KKworLyogUmVzZXRzIHRoZSBoYXJkd2FyZSBzbmFwc2hvdCBidXR0b24gKi8KK3N0YXRpYyB2b2lkCitvdjUxeF9jbGVhcl9zbmFwc2hvdChzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTEpIHsKKwkJcmVnX3cob3YsIFI1MXhfU1lTX1NOQVAsIDB4MDApOworCQlyZWdfdyhvdiwgUjUxeF9TWVNfU05BUCwgMHgwMik7CisJCXJlZ193KG92LCBSNTF4X1NZU19TTkFQLCAweDAwKTsKKwl9IGVsc2UgaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7CisJCXdhcm4oInNuYXBzaG90IHJlc2V0IG5vdCBzdXBwb3J0ZWQgeWV0IG9uIE9WNTE4KCspIik7CisJfSBlbHNlIHsKKwkJZXJyKCJjbGVhciBzbmFwOiBpbnZhbGlkIGJyaWRnZSB0eXBlIik7CisJfQorfQorCisjaWYgMAorLyogQ2hlY2tzIHRoZSBzdGF0dXMgb2YgdGhlIHNuYXBzaG90IGJ1dHRvbi4gUmV0dXJucyAxIGlmIGl0IHdhcyBwcmVzc2VkIHNpbmNlCisgKiBpdCB3YXMgbGFzdCBjbGVhcmVkLCBhbmQgemVybyBpbiBhbGwgb3RoZXIgY2FzZXMgKGluY2x1ZGluZyBlcnJvcnMpICovCitzdGF0aWMgaW50CitvdjUxeF9jaGVja19zbmFwc2hvdChzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbnQgcmV0LCBzdGF0dXMgPSAwOworCisJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTExKSB7CisJCXJldCA9IHJlZ19yKG92LCBSNTF4X1NZU19TTkFQKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVycigiRXJyb3IgY2hlY2tpbmcgc25zcHNob3Qgc3RhdHVzICglZCkiLCByZXQpOworCQl9IGVsc2UgaWYgKHJldCAmIDB4MDgpIHsKKwkJCXN0YXR1cyA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7CisJCXdhcm4oInNuYXBzaG90IGNoZWNrIG5vdCBzdXBwb3J0ZWQgeWV0IG9uIE9WNTE4KCspIik7CisJfSBlbHNlIHsKKwkJZXJyKCJjaGVjayBzbmFwOiBpbnZhbGlkIGJyaWRnZSB0eXBlIik7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisvKiBUaGlzIGRvZXMgYW4gaW5pdGlhbCByZXNldCBvZiBhbiBPbW5pVmlzaW9uIHNlbnNvciBhbmQgZW5zdXJlcyB0aGF0IEkyQworICogaXMgc3luY2hyb25pemVkLiBSZXR1cm5zIDwwIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50Citpbml0X292X3NlbnNvcihzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbnQgaSwgc3VjY2VzczsKKworCS8qIFJlc2V0IHRoZSBzZW5zb3IgKi8KKwlpZiAoaTJjX3cob3YsIDB4MTIsIDB4ODApIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBXYWl0IGZvciBpdCB0byBpbml0aWFsaXplICovCisJbXNsZWVwKDE1MCk7CisKKwlmb3IgKGkgPSAwLCBzdWNjZXNzID0gMDsgaSA8IGkyY19kZXRlY3RfdHJpZXMgJiYgIXN1Y2Nlc3M7IGkrKykgeworCQlpZiAoKGkyY19yKG92LCBPVjc2MTBfUkVHX0lEX0hJR0gpID09IDB4N0YpICYmCisJCSAgICAoaTJjX3Iob3YsIE9WNzYxMF9SRUdfSURfTE9XKSA9PSAweEEyKSkgeworCQkJc3VjY2VzcyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFJlc2V0IHRoZSBzZW5zb3IgKi8KKwkJaWYgKGkyY193KG92LCAweDEyLCAweDgwKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJLyogV2FpdCBmb3IgaXQgdG8gaW5pdGlhbGl6ZSAqLworCQltc2xlZXAoMTUwKTsKKwkJLyogRHVtbXkgcmVhZCB0byBzeW5jIEkyQyAqLworCQlpZiAoaTJjX3Iob3YsIDB4MDApIDwgMCkKKwkJCXJldHVybiAtRUlPOworCX0KKworCWlmICghc3VjY2VzcykKKwkJcmV0dXJuIC1FSU87CisKKwlQREVCVUcoMSwgIkkyQyBzeW5jZWQgaW4gJWQgYXR0ZW1wdChzKSIsIGkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK292NTExX3NldF9wYWNrZXRfc2l6ZShzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IHNpemUpCit7CisJaW50IGFsdCwgbXVsdDsKKworCWlmIChvdjUxeF9zdG9wKG92KSA8IDApCisJCXJldHVybiAtRUlPOworCisJbXVsdCA9IHNpemUgPj4gNTsKKworCWlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxMSkgeworCQlpZiAoc2l6ZSA9PSAwKQorCQkJYWx0ID0gT1Y1MTFfQUxUX1NJWkVfMDsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAyNTcpCisJCQlhbHQgPSBPVjUxMV9BTFRfU0laRV8yNTc7CisJCWVsc2UgaWYgKHNpemUgPT0gNTEzKQorCQkJYWx0ID0gT1Y1MTFfQUxUX1NJWkVfNTEzOworCQllbHNlIGlmIChzaXplID09IDc2OSkKKwkJCWFsdCA9IE9WNTExX0FMVF9TSVpFXzc2OTsKKwkJZWxzZSBpZiAoc2l6ZSA9PSA5OTMpCisJCQlhbHQgPSBPVjUxMV9BTFRfU0laRV85OTM7CisJCWVsc2UgeworCQkJZXJyKCJTZXQgcGFja2V0IHNpemU6IGludmFsaWQgc2l6ZSAoJWQpIiwgc2l6ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTFQTFVTKSB7CisJCWlmIChzaXplID09IDApCisJCQlhbHQgPSBPVjUxMVBMVVNfQUxUX1NJWkVfMDsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAzMykKKwkJCWFsdCA9IE9WNTExUExVU19BTFRfU0laRV8zMzsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAxMjkpCisJCQlhbHQgPSBPVjUxMVBMVVNfQUxUX1NJWkVfMTI5OworCQllbHNlIGlmIChzaXplID09IDI1NykKKwkJCWFsdCA9IE9WNTExUExVU19BTFRfU0laRV8yNTc7CisJCWVsc2UgaWYgKHNpemUgPT0gMzg1KQorCQkJYWx0ID0gT1Y1MTFQTFVTX0FMVF9TSVpFXzM4NTsKKwkJZWxzZSBpZiAoc2l6ZSA9PSA1MTMpCisJCQlhbHQgPSBPVjUxMVBMVVNfQUxUX1NJWkVfNTEzOworCQllbHNlIGlmIChzaXplID09IDc2OSkKKwkJCWFsdCA9IE9WNTExUExVU19BTFRfU0laRV83Njk7CisJCWVsc2UgaWYgKHNpemUgPT0gOTYxKQorCQkJYWx0ID0gT1Y1MTFQTFVTX0FMVF9TSVpFXzk2MTsKKwkJZWxzZSB7CisJCQllcnIoIlNldCBwYWNrZXQgc2l6ZTogaW52YWxpZCBzaXplICglZCkiLCBzaXplKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJZXJyKCJTZXQgcGFja2V0IHNpemU6IEludmFsaWQgYnJpZGdlIHR5cGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJUERFQlVHKDMsICIlZCwgbXVsdD0lZCwgYWx0PSVkIiwgc2l6ZSwgbXVsdCwgYWx0KTsKKworCWlmIChyZWdfdyhvdiwgUjUxeF9GSUZPX1BTSVpFLCBtdWx0KSA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKG92LT5kZXYsIG92LT5pZmFjZSwgYWx0KSA8IDApIHsKKwkJZXJyKCJTZXQgcGFja2V0IHNpemU6IHNldCBpbnRlcmZhY2UgZXJyb3IiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAob3Y1MXhfcmVzZXQob3YsIE9WNTExX1JFU0VUX05PUkVHUykgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCW92LT5wYWNrZXRfc2l6ZSA9IHNpemU7CisKKwlpZiAob3Y1MXhfcmVzdGFydChvdikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisvKiBOb3RlOiBVbmxpa2UgdGhlIE9WNTExL09WNTExKywgdGhlIHNpemUgYXJndW1lbnQgZG9lcyBOT1QgaW5jbHVkZSB0aGUKKyAqIG9wdGlvbmFsIHBhY2tldCBudW1iZXIgYnl0ZS4gVGhlIGFjdHVhbCBzaXplICppcyogc3RvcmVkIGluIG92LT5wYWNrZXRfc2l6ZSwKKyAqIHRob3VnaC4gKi8KK3N0YXRpYyBpbnQKK292NTE4X3NldF9wYWNrZXRfc2l6ZShzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IHNpemUpCit7CisJaW50IGFsdDsKKworCWlmIChvdjUxeF9zdG9wKG92KSA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7CisJCWlmIChzaXplID09IDApCisJCQlhbHQgPSBPVjUxOF9BTFRfU0laRV8wOworCQllbHNlIGlmIChzaXplID09IDEyOCkKKwkJCWFsdCA9IE9WNTE4X0FMVF9TSVpFXzEyODsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAyNTYpCisJCQlhbHQgPSBPVjUxOF9BTFRfU0laRV8yNTY7CisJCWVsc2UgaWYgKHNpemUgPT0gMzg0KQorCQkJYWx0ID0gT1Y1MThfQUxUX1NJWkVfMzg0OworCQllbHNlIGlmIChzaXplID09IDUxMikKKwkJCWFsdCA9IE9WNTE4X0FMVF9TSVpFXzUxMjsKKwkJZWxzZSBpZiAoc2l6ZSA9PSA2NDApCisJCQlhbHQgPSBPVjUxOF9BTFRfU0laRV82NDA7CisJCWVsc2UgaWYgKHNpemUgPT0gNzY4KQorCQkJYWx0ID0gT1Y1MThfQUxUX1NJWkVfNzY4OworCQllbHNlIGlmIChzaXplID09IDg5NikKKwkJCWFsdCA9IE9WNTE4X0FMVF9TSVpFXzg5NjsKKwkJZWxzZSB7CisJCQllcnIoIlNldCBwYWNrZXQgc2l6ZTogaW52YWxpZCBzaXplICglZCkiLCBzaXplKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJZXJyKCJTZXQgcGFja2V0IHNpemU6IEludmFsaWQgYnJpZGdlIHR5cGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJUERFQlVHKDMsICIlZCwgYWx0PSVkIiwgc2l6ZSwgYWx0KTsKKworCW92LT5wYWNrZXRfc2l6ZSA9IHNpemU7CisJaWYgKHNpemUgPiAwKSB7CisJCS8qIFByb2dyYW0gSVNPIEZJRk8gc2l6ZSByZWcgKHBhY2tldCBudW1iZXIgaXNuJ3QgaW5jbHVkZWQpICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4MzAsIHNpemUsIDIpOworCisJCWlmIChvdi0+cGFja2V0X251bWJlcmluZykKKwkJCSsrb3YtPnBhY2tldF9zaXplOworCX0KKworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShvdi0+ZGV2LCBvdi0+aWZhY2UsIGFsdCkgPCAwKSB7CisJCWVycigiU2V0IHBhY2tldCBzaXplOiBzZXQgaW50ZXJmYWNlIGVycm9yIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgc3RyZWFtICovCisJaWYgKHJlZ193KG92LCAweDJmLCAweDgwKSA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKG92NTF4X3Jlc3RhcnQob3YpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAob3Y1MXhfcmVzZXQob3YsIE9WNTExX1JFU0VUX05PUkVHUykgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisvKiBVcGxvYWQgY29tcHJlc3Npb24gcGFyYW1zIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuICovCitzdGF0aWMgaW50CitvdjUxMV9pbml0X2NvbXByZXNzaW9uKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWludCByYyA9IDA7CisKKwlpZiAoIW92LT5jb21wcmVzc19pbml0ZWQpIHsKKwkJcmVnX3cob3YsIDB4NzAsIHBoeSk7CisJCXJlZ193KG92LCAweDcxLCBwaHV2KTsKKwkJcmVnX3cob3YsIDB4NzIsIHB2eSk7CisJCXJlZ193KG92LCAweDczLCBwdnV2KTsKKwkJcmVnX3cob3YsIDB4NzQsIHFoeSk7CisJCXJlZ193KG92LCAweDc1LCBxaHV2KTsKKwkJcmVnX3cob3YsIDB4NzYsIHF2eSk7CisJCXJlZ193KG92LCAweDc3LCBxdnV2KTsKKworCQlpZiAob3Y1MTFfdXBsb2FkX3F1YW5fdGFibGVzKG92KSA8IDApIHsKKwkJCWVycigiRXJyb3IgdXBsb2FkaW5nIHF1YW50aXphdGlvbiB0YWJsZXMiKTsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJb3YtPmNvbXByZXNzX2luaXRlZCA9IDE7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKiBVcGxvYWQgY29tcHJlc3Npb24gcGFyYW1zIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuICovCitzdGF0aWMgaW50CitvdjUxOF9pbml0X2NvbXByZXNzaW9uKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWludCByYyA9IDA7CisKKwlpZiAoIW92LT5jb21wcmVzc19pbml0ZWQpIHsKKwkJaWYgKG92NTE4X3VwbG9hZF9xdWFuX3RhYmxlcyhvdikgPCAwKSB7CisJCQllcnIoIkVycm9yIHVwbG9hZGluZyBxdWFudGl6YXRpb24gdGFibGVzIik7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCW92LT5jb21wcmVzc19pbml0ZWQgPSAxOworb3V0OgorCXJldHVybiByYzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogU2V0cyBzZW5zb3IncyBjb250cmFzdCBzZXR0aW5nIHRvICJ2YWwiICovCitzdGF0aWMgaW50CitzZW5zb3Jfc2V0X2NvbnRyYXN0KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJaW50IHJjOworCisJUERFQlVHKDMsICIlZCIsIHZhbCk7CisKKwlpZiAob3YtPnN0b3BfZHVyaW5nX3NldCkKKwkJaWYgKG92NTF4X3N0b3Aob3YpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNjYyMDoKKwl7CisJCXJjID0gaTJjX3cob3YsIE9WNzYxMF9SRUdfQ05ULCB2YWwgPj4gOCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJfQorCWNhc2UgU0VOX09WNjYzMDoKKwl7CisJCXJjID0gaTJjX3dfbWFzayhvdiwgT1Y3NjEwX1JFR19DTlQsIHZhbCA+PiAxMiwgMHgwZik7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJfQorCWNhc2UgU0VOX09WNzYyMDoKKwl7CisJCXVuc2lnbmVkIGNoYXIgY3RhYltdID0geworCQkJMHgwMSwgMHgwNSwgMHgwOSwgMHgxMSwgMHgxNSwgMHgzNSwgMHgzNywgMHg1NywKKwkJCTB4NWIsIDB4YTUsIDB4YTcsIDB4YzcsIDB4YzksIDB4Y2YsIDB4ZWYsIDB4ZmYKKwkJfTsKKworCQkvKiBVc2UgWSBnYW1tYSBjb250cm9sIGluc3RlYWQuIEJpdCAwIGVuYWJsZXMgaXQuICovCisJCXJjID0gaTJjX3cob3YsIDB4NjQsIGN0YWJbdmFsPj4xMl0pOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKwljYXNlIFNFTl9TQUE3MTExQToKKwl7CisJCXJjID0gaTJjX3cob3YsIDB4MGIsIHZhbCA+PiA5KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwl7CisJCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBvdXQ7CisJfQorCX0KKworCXJjID0gMDsJCS8qIFN1Y2Nlc3MgKi8KKwlvdi0+Y29udHJhc3QgPSB2YWw7CitvdXQ6CisJaWYgKG92NTF4X3Jlc3RhcnQob3YpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIEdldHMgc2Vuc29yJ3MgY29udHJhc3Qgc2V0dGluZyAqLworc3RhdGljIGludAorc2Vuc29yX2dldF9jb250cmFzdChzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgc2hvcnQgKnZhbCkKK3sKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJY2FzZSBTRU5fT1Y2NjIwOgorCQlyYyA9IGkyY19yKG92LCBPVjc2MTBfUkVHX0NOVCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWVsc2UKKwkJCSp2YWwgPSByYyA8PCA4OworCQlicmVhazsKKwljYXNlIFNFTl9PVjY2MzA6CisJCXJjID0gaTJjX3Iob3YsIE9WNzYxMF9SRUdfQ05UKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJZWxzZQorCQkJKnZhbCA9IHJjIDw8IDEyOworCQlicmVhazsKKwljYXNlIFNFTl9PVjc2MjA6CisJCS8qIFVzZSBZIGdhbW1hIHJlZyBpbnN0ZWFkLiBCaXQgMCBpcyB0aGUgZW5hYmxlIGJpdC4gKi8KKwkJcmMgPSBpMmNfcihvdiwgMHg2NCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWVsc2UKKwkJCSp2YWwgPSAocmMgJiAweGZlKSA8PCA4OworCQlicmVhazsKKwljYXNlIFNFTl9TQUE3MTExQToKKwkJKnZhbCA9IG92LT5jb250cmFzdDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUERFQlVHKDMsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJUERFQlVHKDMsICIlZCIsICp2YWwpOworCW92LT5jb250cmFzdCA9ICp2YWw7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogU2V0cyBzZW5zb3IncyBicmlnaHRuZXNzIHNldHRpbmcgdG8gInZhbCIgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9zZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCWludCByYzsKKworCVBERUJVRyg0LCAiJWQiLCB2YWwpOworCisJaWYgKG92LT5zdG9wX2R1cmluZ19zZXQpCisJCWlmIChvdjUxeF9zdG9wKG92KSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX09WNzYxMDoKKwljYXNlIFNFTl9PVjc2QkU6CisJY2FzZSBTRU5fT1Y2NjIwOgorCWNhc2UgU0VOX09WNjYzMDoKKwkJcmMgPSBpMmNfdyhvdiwgT1Y3NjEwX1JFR19CUlQsIHZhbCA+PiA4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKwljYXNlIFNFTl9PVjc2MjA6CisJCS8qIDc2MjAgZG9lc24ndCBsaWtlIG1hbnVhbCBjaGFuZ2VzIHdoZW4gaW4gYXV0byBtb2RlICovCisJCWlmICghb3YtPmF1dG9fYnJ0KSB7CisJCQlyYyA9IGkyY193KG92LCBPVjc2MTBfUkVHX0JSVCwgdmFsID4+IDgpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNFTl9TQUE3MTExQToKKwkJcmMgPSBpMmNfdyhvdiwgMHgwYSwgdmFsID4+IDgpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBvdXQ7CisJfQorCisJcmMgPSAwOwkJLyogU3VjY2VzcyAqLworCW92LT5icmlnaHRuZXNzID0gdmFsOworb3V0OgorCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJjOworfQorCisvKiBHZXRzIHNlbnNvcidzIGJyaWdodG5lc3Mgc2V0dGluZyAqLworc3RhdGljIGludAorc2Vuc29yX2dldF9icmlnaHRuZXNzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBzaG9ydCAqdmFsKQoreworCWludCByYzsKKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX09WNzYxMDoKKwljYXNlIFNFTl9PVjc2QkU6CisJY2FzZSBTRU5fT1Y3NjIwOgorCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJCXJjID0gaTJjX3Iob3YsIE9WNzYxMF9SRUdfQlJUKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJZWxzZQorCQkJKnZhbCA9IHJjIDw8IDg7CisJCWJyZWFrOworCWNhc2UgU0VOX1NBQTcxMTFBOgorCQkqdmFsID0gb3YtPmJyaWdodG5lc3M7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCVBERUJVRygzLCAiJWQiLCAqdmFsKTsKKwlvdi0+YnJpZ2h0bmVzcyA9ICp2YWw7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogU2V0cyBzZW5zb3IncyBzYXR1cmF0aW9uIChjb2xvciBpbnRlbnNpdHkpIHNldHRpbmcgdG8gInZhbCIgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9zZXRfc2F0dXJhdGlvbihzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCWludCByYzsKKworCVBERUJVRygzLCAiJWQiLCB2YWwpOworCisJaWYgKG92LT5zdG9wX2R1cmluZ19zZXQpCisJCWlmIChvdjUxeF9zdG9wKG92KSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX09WNzYxMDoKKwljYXNlIFNFTl9PVjc2QkU6CisJY2FzZSBTRU5fT1Y2NjIwOgorCWNhc2UgU0VOX09WNjYzMDoKKwkJcmMgPSBpMmNfdyhvdiwgT1Y3NjEwX1JFR19TQVQsIHZhbCA+PiA4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKwljYXNlIFNFTl9PVjc2MjA6CisvLwkJLyogVXNlIFVWIGdhbW1hIGNvbnRyb2wgaW5zdGVhZC4gQml0cyAwICYgNyBhcmUgcmVzZXJ2ZWQuICovCisvLwkJcmMgPSBvdl9pMmNfd3JpdGUob3YtPmRldiwgMHg2MiwgKHZhbCA+PiA5KSAmIDB4N2UpOworLy8JCWlmIChyYyA8IDApCisvLwkJCWdvdG8gb3V0OworCQlyYyA9IGkyY193KG92LCBPVjc2MTBfUkVHX1NBVCwgdmFsID4+IDgpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWNhc2UgU0VOX1NBQTcxMTFBOgorCQlyYyA9IGkyY193KG92LCAweDBjLCB2YWwgPj4gOSk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUERFQlVHKDMsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7CisJCXJjID0gLUVQRVJNOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IDA7CQkvKiBTdWNjZXNzICovCisJb3YtPmNvbG91ciA9IHZhbDsKK291dDoKKwlpZiAob3Y1MXhfcmVzdGFydChvdikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiByYzsKK30KKworLyogR2V0cyBzZW5zb3IncyBzYXR1cmF0aW9uIChjb2xvciBpbnRlbnNpdHkpIHNldHRpbmcgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9nZXRfc2F0dXJhdGlvbihzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgc2hvcnQgKnZhbCkKK3sKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJY2FzZSBTRU5fT1Y3NkJFOgorCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJCXJjID0gaTJjX3Iob3YsIE9WNzYxMF9SRUdfU0FUKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJZWxzZQorCQkJKnZhbCA9IHJjIDw8IDg7CisJCWJyZWFrOworCWNhc2UgU0VOX09WNzYyMDoKKy8vCQkvKiBVc2UgVVYgZ2FtbWEgcmVnIGluc3RlYWQuIEJpdHMgMCAmIDcgYXJlIHJlc2VydmVkLiAqLworLy8JCXJjID0gaTJjX3Iob3YsIDB4NjIpOworLy8JCWlmIChyYyA8IDApCisvLwkJCXJldHVybiByYzsKKy8vCQllbHNlCisvLwkJCSp2YWwgPSAocmMgJiAweDdlKSA8PCA5OworCQlyYyA9IGkyY19yKG92LCBPVjc2MTBfUkVHX1NBVCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWVsc2UKKwkJCSp2YWwgPSByYyA8PCA4OworCQlicmVhazsKKwljYXNlIFNFTl9TQUE3MTExQToKKwkJKnZhbCA9IG92LT5jb2xvdXI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCVBERUJVRygzLCAiJWQiLCAqdmFsKTsKKwlvdi0+Y29sb3VyID0gKnZhbDsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBTZXRzIHNlbnNvcidzIGh1ZSAocmVkL2JsdWUgYmFsYW5jZSkgc2V0dGluZyB0byAidmFsIiAqLworc3RhdGljIGludAorc2Vuc29yX3NldF9odWUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoMywgIiVkIiwgdmFsKTsKKworCWlmIChvdi0+c3RvcF9kdXJpbmdfc2V0KQorCQlpZiAob3Y1MXhfc3RvcChvdikgPCAwKQorCQkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJY2FzZSBTRU5fT1Y2NjIwOgorCWNhc2UgU0VOX09WNjYzMDoKKwkJcmMgPSBpMmNfdyhvdiwgT1Y3NjEwX1JFR19SRUQsIDB4RkYgLSAodmFsID4+IDgpKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gaTJjX3cob3YsIE9WNzYxMF9SRUdfQkxVRSwgdmFsID4+IDgpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWNhc2UgU0VOX09WNzYyMDoKKy8vIEh1ZSBjb250cm9sIGlzIGNhdXNpbmcgcHJvYmxlbXMuIEkgd2lsbCBlbmFibGUgaXQgb25jZSBpdCdzIGZpeGVkLgorI2lmIDAKKwkJcmMgPSBpMmNfdyhvdiwgMHg3YSwgKHVuc2lnbmVkIGNoYXIpKHZhbCA+PiA4KSArIDB4Yik7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKworCQlyYyA9IGkyY193KG92LCAweDc5LCAodW5zaWduZWQgY2hhcikodmFsID4+IDgpICsgMHhiKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgU0VOX1NBQTcxMTFBOgorCQlyYyA9IGkyY193KG92LCAweDBkLCAodmFsICsgMzI3NjgpID4+IDgpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBvdXQ7CisJfQorCisJcmMgPSAwOwkJLyogU3VjY2VzcyAqLworCW92LT5odWUgPSB2YWw7CitvdXQ6CisJaWYgKG92NTF4X3Jlc3RhcnQob3YpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIEdldHMgc2Vuc29yJ3MgaHVlIChyZWQvYmx1ZSBiYWxhbmNlKSBzZXR0aW5nICovCitzdGF0aWMgaW50CitzZW5zb3JfZ2V0X2h1ZShzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgc2hvcnQgKnZhbCkKK3sKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJY2FzZSBTRU5fT1Y2NjIwOgorCWNhc2UgU0VOX09WNjYzMDoKKwkJcmMgPSBpMmNfcihvdiwgT1Y3NjEwX1JFR19CTFVFKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJZWxzZQorCQkJKnZhbCA9IHJjIDw8IDg7CisJCWJyZWFrOworCWNhc2UgU0VOX09WNzYyMDoKKwkJcmMgPSBpMmNfcihvdiwgMHg3YSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWVsc2UKKwkJCSp2YWwgPSByYyA8PCA4OworCQlicmVhazsKKwljYXNlIFNFTl9TQUE3MTExQToKKwkJKnZhbCA9IG92LT5odWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCVBERUJVRygzLCAiJWQiLCAqdmFsKTsKKwlvdi0+aHVlID0gKnZhbDsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50CitzZW5zb3Jfc2V0X3BpY3R1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHN0cnVjdCB2aWRlb19waWN0dXJlICpwKQoreworCWludCByYzsKKworCVBERUJVRyg0LCAic2Vuc29yX3NldF9waWN0dXJlIik7CisKKwlvdi0+d2hpdGVuZXNzID0gcC0+d2hpdGVuZXNzOworCisJLyogRG9uJ3QgcmV0dXJuIGVycm9yIGlmIGEgc2V0dGluZyBpcyB1bnN1cHBvcnRlZCwgb3IgcmVzdCBvZiBzZXR0aW5ncworICAgICAgICAgKiB3aWxsIG5vdCBiZSBwZXJmb3JtZWQgKi8KKworCXJjID0gc2Vuc29yX3NldF9jb250cmFzdChvdiwgcC0+Y29udHJhc3QpOworCWlmIChGQVRBTF9FUlJPUihyYykpCisJCXJldHVybiByYzsKKworCXJjID0gc2Vuc29yX3NldF9icmlnaHRuZXNzKG92LCBwLT5icmlnaHRuZXNzKTsKKwlpZiAoRkFUQUxfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHNlbnNvcl9zZXRfc2F0dXJhdGlvbihvdiwgcC0+Y29sb3VyKTsKKwlpZiAoRkFUQUxfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHNlbnNvcl9zZXRfaHVlKG92LCBwLT5odWUpOworCWlmIChGQVRBTF9FUlJPUihyYykpCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZW5zb3JfZ2V0X3BpY3R1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHN0cnVjdCB2aWRlb19waWN0dXJlICpwKQoreworCWludCByYzsKKworCVBERUJVRyg0LCAic2Vuc29yX2dldF9waWN0dXJlIik7CisKKwkvKiBEb24ndCByZXR1cm4gZXJyb3IgaWYgYSBzZXR0aW5nIGlzIHVuc3VwcG9ydGVkLCBvciByZXN0IG9mIHNldHRpbmdzCisgICAgICAgICAqIHdpbGwgbm90IGJlIHBlcmZvcm1lZCAqLworCisJcmMgPSBzZW5zb3JfZ2V0X2NvbnRyYXN0KG92LCAmKHAtPmNvbnRyYXN0KSk7CisJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJcmMgPSBzZW5zb3JfZ2V0X2JyaWdodG5lc3Mob3YsICYocC0+YnJpZ2h0bmVzcykpOworCWlmIChGQVRBTF9FUlJPUihyYykpCisJCXJldHVybiByYzsKKworCXJjID0gc2Vuc29yX2dldF9zYXR1cmF0aW9uKG92LCAmKHAtPmNvbG91cikpOworCWlmIChGQVRBTF9FUlJPUihyYykpCisJCXJldHVybiByYzsKKworCXJjID0gc2Vuc29yX2dldF9odWUob3YsICYocC0+aHVlKSk7CisJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJcC0+d2hpdGVuZXNzID0gMTA1IDw8IDg7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKy8vIEZJWE1FOiBFeHBvc3VyZSByYW5nZSBpcyBvbmx5IDB4MDAtMHg3ZiBpbiBpbnRlcmxhY2UgbW9kZQorLyogU2V0cyBjdXJyZW50IGV4cG9zdXJlIGZvciBzZW5zb3IuIFRoaXMgb25seSBoYXMgYW4gZWZmZWN0IGlmIGF1dG8tZXhwb3N1cmUKKyAqIGlzIG9mZiAqLworc3RhdGljIGlubGluZSBpbnQKK3NlbnNvcl9zZXRfZXhwb3N1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCWludCByYzsKKworCVBERUJVRygzLCAiJWQiLCB2YWwpOworCisJaWYgKG92LT5zdG9wX2R1cmluZ19zZXQpCisJCWlmIChvdjUxeF9zdG9wKG92KSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNzYyMDoKKwljYXNlIFNFTl9PVjc2QkU6CisJY2FzZSBTRU5fT1Y4NjAwOgorCQlyYyA9IGkyY193KG92LCAweDEwLCB2YWwpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJYnJlYWs7CisJY2FzZSBTRU5fS1MwMTI3OgorCWNhc2UgU0VOX0tTMDEyN0I6CisJY2FzZSBTRU5fU0FBNzExMUE6CisJCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyZXR1cm4gLUVQRVJNOworCWRlZmF1bHQ6CisJCWVycigiU2Vuc29yIG5vdCBzdXBwb3J0ZWQgZm9yIHNldF9leHBvc3VyZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IDA7CQkvKiBTdWNjZXNzICovCisJb3YtPmV4cG9zdXJlID0gdmFsOworb3V0OgorCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJjOworfQorI2VuZGlmCisKKy8qIEdldHMgY3VycmVudCBleHBvc3VyZSBsZXZlbCBmcm9tIHNlbnNvciwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIHVuZGVyCisgKiBtYW51YWwgY29udHJvbC4gKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9nZXRfZXhwb3N1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgKnZhbCkKK3sKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJY2FzZSBTRU5fT1Y2NjIwOgorCWNhc2UgU0VOX09WNjYzMDoKKwljYXNlIFNFTl9PVjc2MjA6CisJY2FzZSBTRU5fT1Y3NkJFOgorCWNhc2UgU0VOX09WODYwMDoKKwkJcmMgPSBpMmNfcihvdiwgMHgxMCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWVsc2UKKwkJCSp2YWwgPSByYzsKKwkJYnJlYWs7CisJY2FzZSBTRU5fS1MwMTI3OgorCWNhc2UgU0VOX0tTMDEyN0I6CisJY2FzZSBTRU5fU0FBNzExMUE6CisJCXZhbCA9IE5VTEw7CisJCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyZXR1cm4gLUVQRVJNOworCWRlZmF1bHQ6CisJCWVycigiU2Vuc29yIG5vdCBzdXBwb3J0ZWQgZm9yIGdldF9leHBvc3VyZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlQREVCVUcoMywgIiVkIiwgKnZhbCk7CisJb3YtPmV4cG9zdXJlID0gKnZhbDsKKworCXJldHVybiAwOworfQorCisvKiBUdXJucyBvbiBvciBvZmYgdGhlIExFRC4gT25seSBoYXMgYW4gZWZmZWN0IHdpdGggT1Y1MTErL09WNTE4KCspICovCitzdGF0aWMgdm9pZAorb3Y1MXhfbGVkX2NvbnRyb2woc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBlbmFibGUpCit7CisJUERFQlVHKDQsICIgKCVzKSIsIGVuYWJsZSA/ICJ0dXJuIG9uIiA6ICJ0dXJuIG9mZiIpOworCisJaWYgKG92LT5icmlkZ2UgPT0gQlJHX09WNTExUExVUykKKwkJcmVnX3cob3YsIFI1MTFfU1lTX0xFRF9DVEwsIGVuYWJsZSA/IDEgOiAwKTsKKwllbHNlIGlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKKwkJcmVnX3dfbWFzayhvdiwgUjUxOF9HUElPX09VVCwgZW5hYmxlID8gMHgwMiA6IDB4MDAsIDB4MDIpOworCisJcmV0dXJuOworfQorCisvKiBNYXRjaGVzIHRoZSBzZW5zb3IncyBpbnRlcm5hbCBmcmFtZSByYXRlIHRvIHRoZSBsaWdodGluZyBmcmVxdWVuY3kuCisgKiBWYWxpZCBmcmVxdWVuY2llcyBhcmU6CisgKgk1MCAtIDUwSHosIGZvciBFdXJvcGVhbiBhbmQgQXNpYW4gbGlnaHRpbmcKKyAqCTYwIC0gNjBIeiwgZm9yIEFtZXJpY2FuIGxpZ2h0aW5nCisgKgorICogVGVzdGVkIHdpdGg6IE9WNzYxMCwgT1Y3NjIwLCBPVjc2QkUsIE9WNjYyMAorICogVW5zdXBwb3J0ZWQ6IEtTMDEyNywgS1MwMTI3QiwgU0FBNzExMUEKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorc2Vuc29yX3NldF9saWdodF9mcmVxKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgZnJlcSkKK3sKKwlpbnQgc2l4dHk7CisKKwlQREVCVUcoNCwgIiVkIEh6IiwgZnJlcSk7CisKKwlpZiAoZnJlcSA9PSA2MCkKKwkJc2l4dHkgPSAxOworCWVsc2UgaWYgKGZyZXEgPT0gNTApCisJCXNpeHR5ID0gMDsKKwllbHNlIHsKKwkJZXJyKCJJbnZhbGlkIGxpZ2h0IGZyZXEgKCVkIEh6KSIsIGZyZXEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJCWkyY193X21hc2sob3YsIDB4MmEsIHNpeHR5PzB4MDA6MHg4MCwgMHg4MCk7CisJCWkyY193KG92LCAweDJiLCBzaXh0eT8weDAwOjB4YWMpOworCQlpMmNfd19tYXNrKG92LCAweDEzLCAweDEwLCAweDEwKTsKKwkJaTJjX3dfbWFzayhvdiwgMHgxMywgMHgwMCwgMHgxMCk7CisJCWJyZWFrOworCWNhc2UgU0VOX09WNzYyMDoKKwljYXNlIFNFTl9PVjc2QkU6CisJY2FzZSBTRU5fT1Y4NjAwOgorCQlpMmNfd19tYXNrKG92LCAweDJhLCBzaXh0eT8weDAwOjB4ODAsIDB4ODApOworCQlpMmNfdyhvdiwgMHgyYiwgc2l4dHk/MHgwMDoweGFjKTsKKwkJaTJjX3dfbWFzayhvdiwgMHg3NiwgMHgwMSwgMHgwMSk7CisJCWJyZWFrOworCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJCWkyY193KG92LCAweDJiLCBzaXh0eT8weGE4OjB4MjgpOworCQlpMmNfdyhvdiwgMHgyYSwgc2l4dHk/MHg4NDoweGE0KTsKKwkJYnJlYWs7CisJY2FzZSBTRU5fS1MwMTI3OgorCWNhc2UgU0VOX0tTMDEyN0I6CisJY2FzZSBTRU5fU0FBNzExMUE6CisJCVBERUJVRyg1LCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyZXR1cm4gLUVQRVJNOworCWRlZmF1bHQ6CisJCWVycigiU2Vuc29yIG5vdCBzdXBwb3J0ZWQgZm9yIHNldF9saWdodF9mcmVxIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW92LT5saWdodGZyZXEgPSBmcmVxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIElmIGVuYWJsZSBpcyB0cnVlLCB0dXJuIG9uIHRoZSBzZW5zb3IncyBiYW5kaW5nIGZpbHRlciwgb3RoZXJ3aXNlIHR1cm4gaXQKKyAqIG9mZi4gVGhpcyBmaWx0ZXIgdHJpZXMgdG8gcmVkdWNlIHRoZSBwYXR0ZXJuIG9mIGhvcml6b250YWwgbGlnaHQvZGFyayBiYW5kcworICogY2F1c2VkIGJ5IHNvbWUgKHVzdWFsbHkgZmx1b3Jlc2NlbnQpIGxpZ2h0aW5nLiBUaGUgbGlnaHQgZnJlcXVlbmN5IG11c3QgYmUKKyAqIHNldCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIGVuYWJsaW5nIGl0IHdpdGggb3Y1MXhfc2V0X2xpZ2h0X2ZyZXEoKS4KKyAqCisgKiBUZXN0ZWQgd2l0aDogT1Y3NjEwLCBPVjc2MjAsIE9WNzZCRSwgT1Y2NjIwLgorICogVW5zdXBwb3J0ZWQ6IEtTMDEyNywgS1MwMTI3QiwgU0FBNzExMUEKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorc2Vuc29yX3NldF9iYW5kaW5nX2ZpbHRlcihzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IGVuYWJsZSkKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoNCwgIiAoJXMpIiwgZW5hYmxlID8gInR1cm4gb24iIDogInR1cm4gb2ZmIik7CisKKwlpZiAob3YtPnNlbnNvciA9PSBTRU5fS1MwMTI3IHx8IG92LT5zZW5zb3IgPT0gU0VOX0tTMDEyN0IKKwkJfHwgb3YtPnNlbnNvciA9PSBTRU5fU0FBNzExMUEpIHsKKwkJUERFQlVHKDUsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmMgPSBpMmNfd19tYXNrKG92LCAweDJkLCBlbmFibGU/MHgwNDoweDAwLCAweDA0KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlvdi0+YmFuZGZpbHQgPSBlbmFibGU7CisKKwlyZXR1cm4gMDsKK30KKworLyogSWYgZW5hYmxlIGlzIHRydWUsIHR1cm4gb24gdGhlIHNlbnNvcidzIGF1dG8gYnJpZ2h0bmVzcyBjb250cm9sLCBvdGhlcndpc2UKKyAqIHR1cm4gaXQgb2ZmLgorICoKKyAqIFVuc3VwcG9ydGVkOiBLUzAxMjcsIEtTMDEyN0IsIFNBQTcxMTFBCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9zZXRfYXV0b19icmlnaHRuZXNzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgZW5hYmxlKQoreworCWludCByYzsKKworCVBERUJVRyg0LCAiICglcykiLCBlbmFibGUgPyAidHVybiBvbiIgOiAidHVybiBvZmYiKTsKKworCWlmIChvdi0+c2Vuc29yID09IFNFTl9LUzAxMjcgfHwgb3YtPnNlbnNvciA9PSBTRU5fS1MwMTI3QgorCQl8fCBvdi0+c2Vuc29yID09IFNFTl9TQUE3MTExQSkgeworCQlQREVCVUcoNSwgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyYyA9IGkyY193X21hc2sob3YsIDB4MmQsIGVuYWJsZT8weDEwOjB4MDAsIDB4MTApOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW92LT5hdXRvX2JydCA9IGVuYWJsZTsKKworCXJldHVybiAwOworfQorCisvKiBJZiBlbmFibGUgaXMgdHJ1ZSwgdHVybiBvbiB0aGUgc2Vuc29yJ3MgYXV0byBleHBvc3VyZSBjb250cm9sLCBvdGhlcndpc2UKKyAqIHR1cm4gaXQgb2ZmLgorICoKKyAqIFVuc3VwcG9ydGVkOiBLUzAxMjcsIEtTMDEyN0IsIFNBQTcxMTFBCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9zZXRfYXV0b19leHBvc3VyZShzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IGVuYWJsZSkKK3sKKwlQREVCVUcoNCwgIiAoJXMpIiwgZW5hYmxlID8gInR1cm4gb24iIDogInR1cm4gb2ZmIik7CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJCWkyY193X21hc2sob3YsIDB4MjksIGVuYWJsZT8weDAwOjB4ODAsIDB4ODApOworCQlicmVhazsKKwljYXNlIFNFTl9PVjY2MjA6CisJY2FzZSBTRU5fT1Y3NjIwOgorCWNhc2UgU0VOX09WNzZCRToKKwljYXNlIFNFTl9PVjg2MDA6CisJCWkyY193X21hc2sob3YsIDB4MTMsIGVuYWJsZT8weDAxOjB4MDAsIDB4MDEpOworCQlicmVhazsKKwljYXNlIFNFTl9PVjY2MzA6CisJCWkyY193X21hc2sob3YsIDB4MjgsIGVuYWJsZT8weDAwOjB4MTAsIDB4MTApOworCQlicmVhazsKKwljYXNlIFNFTl9LUzAxMjc6CisJY2FzZSBTRU5fS1MwMTI3QjoKKwljYXNlIFNFTl9TQUE3MTExQToKKwkJUERFQlVHKDUsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7CisJCXJldHVybiAtRVBFUk07CisJZGVmYXVsdDoKKwkJZXJyKCJTZW5zb3Igbm90IHN1cHBvcnRlZCBmb3Igc2V0X2F1dG9fZXhwb3N1cmUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb3YtPmF1dG9fZXhwID0gZW5hYmxlOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE1vZGlmaWVzIHRoZSBzZW5zb3IncyBleHBvc3VyZSBhbGdvcml0aG0gdG8gYWxsb3cgcHJvcGVyIGV4cG9zdXJlIG9mIG9iamVjdHMKKyAqIHRoYXQgYXJlIGlsbHVtaW5hdGVkIGZyb20gYmVoaW5kLgorICoKKyAqIFRlc3RlZCB3aXRoOiBPVjY2MjAsIE9WNzYyMAorICogVW5zdXBwb3J0ZWQ6IE9WNzYxMCwgT1Y3NkJFLCBLUzAxMjcsIEtTMDEyN0IsIFNBQTcxMTFBCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9zZXRfYmFja2xpZ2h0KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgZW5hYmxlKQoreworCVBERUJVRyg0LCAiICglcykiLCBlbmFibGUgPyAidHVybiBvbiIgOiAidHVybiBvZmYiKTsKKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX09WNzYyMDoKKwljYXNlIFNFTl9PVjg2MDA6CisJCWkyY193X21hc2sob3YsIDB4NjgsIGVuYWJsZT8weGUwOjB4YzAsIDB4ZTApOworCQlpMmNfd19tYXNrKG92LCAweDI5LCBlbmFibGU/MHgwODoweDAwLCAweDA4KTsKKwkJaTJjX3dfbWFzayhvdiwgMHgyOCwgZW5hYmxlPzB4MDI6MHgwMCwgMHgwMik7CisJCWJyZWFrOworCWNhc2UgU0VOX09WNjYyMDoKKwkJaTJjX3dfbWFzayhvdiwgMHg0ZSwgZW5hYmxlPzB4ZTA6MHhjMCwgMHhlMCk7CisJCWkyY193X21hc2sob3YsIDB4MjksIGVuYWJsZT8weDA4OjB4MDAsIDB4MDgpOworCQlpMmNfd19tYXNrKG92LCAweDBlLCBlbmFibGU/MHg4MDoweDAwLCAweDgwKTsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y2NjMwOgorCQlpMmNfd19tYXNrKG92LCAweDRlLCBlbmFibGU/MHg4MDoweDYwLCAweGUwKTsKKwkJaTJjX3dfbWFzayhvdiwgMHgyOSwgZW5hYmxlPzB4MDg6MHgwMCwgMHgwOCk7CisJCWkyY193X21hc2sob3YsIDB4MjgsIGVuYWJsZT8weDAyOjB4MDAsIDB4MDIpOworCQlicmVhazsKKwljYXNlIFNFTl9PVjc2MTA6CisJY2FzZSBTRU5fT1Y3NkJFOgorCWNhc2UgU0VOX0tTMDEyNzoKKwljYXNlIFNFTl9LUzAxMjdCOgorCWNhc2UgU0VOX1NBQTcxMTFBOgorCQlQREVCVUcoNSwgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwlkZWZhdWx0OgorCQllcnIoIlNlbnNvciBub3Qgc3VwcG9ydGVkIGZvciBzZXRfYmFja2xpZ2h0Iik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW92LT5iYWNrbGlnaHQgPSBlbmFibGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2Vuc29yX3NldF9taXJyb3Ioc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBlbmFibGUpCit7CisJUERFQlVHKDQsICIgKCVzKSIsIGVuYWJsZSA/ICJ0dXJuIG9uIiA6ICJ0dXJuIG9mZiIpOworCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y2NjIwOgorCWNhc2UgU0VOX09WNjYzMDoKKwljYXNlIFNFTl9PVjc2MTA6CisJY2FzZSBTRU5fT1Y3NjIwOgorCWNhc2UgU0VOX09WNzZCRToKKwljYXNlIFNFTl9PVjg2MDA6CisJCWkyY193X21hc2sob3YsIDB4MTIsIGVuYWJsZT8weDQwOjB4MDAsIDB4NDApOworCQlicmVhazsKKwljYXNlIFNFTl9LUzAxMjc6CisJY2FzZSBTRU5fS1MwMTI3QjoKKwljYXNlIFNFTl9TQUE3MTExQToKKwkJUERFQlVHKDUsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7CisJCXJldHVybiAtRVBFUk07CisJZGVmYXVsdDoKKwkJZXJyKCJTZW5zb3Igbm90IHN1cHBvcnRlZCBmb3Igc2V0X21pcnJvciIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvdi0+bWlycm9yID0gZW5hYmxlOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybnMgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIChyZWdhcmRsZXNzIG9mIHdoZXJlIHRoZXkgYXJlIGxvY2F0ZWQ7CisgKiBwbGFuYXIgb3Igbm90KSwgb3IgemVybyBmb3IgdW5zdXBwb3J0ZWQgZm9ybWF0LgorICovCitzdGF0aWMgaW5saW5lIGludAorZ2V0X2RlcHRoKGludCBwYWxldHRlKQoreworCXN3aXRjaCAocGFsZXR0ZSkgeworCWNhc2UgVklERU9fUEFMRVRURV9HUkVZOiAgICByZXR1cm4gODsKKwljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwOiAgcmV0dXJuIDEyOworCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjBQOiByZXR1cm4gMTI7IC8qIFBsYW5hciAqLworCWRlZmF1bHQ6CQkgICAgcmV0dXJuIDA7ICAvKiBJbnZhbGlkIGZvcm1hdCAqLworCX0KK30KKworLyogQnl0ZXMgcGVyIGZyYW1lLiBVc2VkIGJ5IHJlYWQoKS4gUmV0dXJuIG9mIDAgaW5kaWNhdGVzIGVycm9yICovCitzdGF0aWMgaW5saW5lIGxvbmcgaW50CitnZXRfZnJhbWVfbGVuZ3RoKHN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWUpCit7CisJaWYgKCFmcmFtZSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gKChmcmFtZS0+d2lkdGggKiBmcmFtZS0+aGVpZ2h0CisJCQkgKiBnZXRfZGVwdGgoZnJhbWUtPmZvcm1hdCkpID4+IDMpOworfQorCitzdGF0aWMgaW50Cittb2RlX2luaXRfb3Zfc2Vuc29yX3JlZ3Moc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCSBpbnQgbW9kZSwgaW50IHN1Yl9mbGFnLCBpbnQgcXZnYSkKK3sKKwlpbnQgY2xvY2s7CisKKwkvKioqKioqKiogTW9kZSAoVkdBL1FWR0EpIGFuZCBzZW5zb3Igc3BlY2lmaWMgcmVncyAqKioqKioqKi8KKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX09WNzYxMDoKKwkJaTJjX3cob3YsIDB4MTQsIHF2Z2E/MHgyNDoweDA0KTsKKy8vIEZJWE1FOiBEb2VzIHRoaXMgaW1wcm92ZSB0aGUgaW1hZ2UgcXVhbGl0eSBvciBmcmFtZSByYXRlPworI2lmIDAKKwkJaTJjX3dfbWFzayhvdiwgMHgyOCwgcXZnYT8weDAwOjB4MjAsIDB4MjApOworCQlpMmNfdyhvdiwgMHgyNCwgMHgxMCk7CisJCWkyY193KG92LCAweDI1LCBxdmdhPzB4NDA6MHg4YSk7CisJCWkyY193KG92LCAweDJmLCBxdmdhPzB4MzA6MHhiMCk7CisJCWkyY193KG92LCAweDM1LCBxdmdhPzB4MWM6MHg5Yyk7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y3NjIwOgorLy8JCWkyY193KG92LCAweDJiLCAweDAwKTsKKwkJaTJjX3cob3YsIDB4MTQsIHF2Z2E/MHhhNDoweDg0KTsKKwkJaTJjX3dfbWFzayhvdiwgMHgyOCwgcXZnYT8weDAwOjB4MjAsIDB4MjApOworCQlpMmNfdyhvdiwgMHgyNCwgcXZnYT8weDIwOjB4M2EpOworCQlpMmNfdyhvdiwgMHgyNSwgcXZnYT8weDMwOjB4NjApOworCQlpMmNfd19tYXNrKG92LCAweDJkLCBxdmdhPzB4NDA6MHgwMCwgMHg0MCk7CisJCWkyY193X21hc2sob3YsIDB4NjcsIHF2Z2E/MHhmMDoweDkwLCAweGYwKTsKKwkJaTJjX3dfbWFzayhvdiwgMHg3NCwgcXZnYT8weDIwOjB4MDAsIDB4MjApOworCQlicmVhazsKKwljYXNlIFNFTl9PVjc2QkU6CisvLwkJaTJjX3cob3YsIDB4MmIsIDB4MDApOworCQlpMmNfdyhvdiwgMHgxNCwgcXZnYT8weGE0OjB4ODQpOworLy8gRklYTUU6IEVuYWJsZSB0aGlzIG9uY2UgNzYyMEFFIHVzZXMgNzYyMCBpbml0aWFsIHNldHRpbmdzCisjaWYgMAorCQlpMmNfd19tYXNrKG92LCAweDI4LCBxdmdhPzB4MDA6MHgyMCwgMHgyMCk7CisJCWkyY193KG92LCAweDI0LCBxdmdhPzB4MjA6MHgzYSk7CisJCWkyY193KG92LCAweDI1LCBxdmdhPzB4MzA6MHg2MCk7CisJCWkyY193X21hc2sob3YsIDB4MmQsIHF2Z2E/MHg0MDoweDAwLCAweDQwKTsKKwkJaTJjX3dfbWFzayhvdiwgMHg2NywgcXZnYT8weGIwOjB4OTAsIDB4ZjApOworCQlpMmNfd19tYXNrKG92LCAweDc0LCBxdmdhPzB4MjA6MHgwMCwgMHgyMCk7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y2NjIwOgorCQlpMmNfdyhvdiwgMHgxNCwgcXZnYT8weDI0OjB4MDQpOworCQlicmVhazsKKwljYXNlIFNFTl9PVjY2MzA6CisJCWkyY193KG92LCAweDE0LCBxdmdhPzB4YTA6MHg4MCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycigiSW52YWxpZCBzZW5zb3IiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoqKioqKioqIFBhbGV0dGUtc3BlY2lmaWMgcmVncyAqKioqKioqKi8KKworCWlmIChtb2RlID09IFZJREVPX1BBTEVUVEVfR1JFWSkgeworCQlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y3NjEwIHx8IG92LT5zZW5zb3IgPT0gU0VOX09WNzZCRSkgeworCQkJLyogdGhlc2UgYXJlbid0IHZhbGlkIG9uIHRoZSBPVjY2MjAvT1Y3NjIwLzY2MzA/ICovCisJCQlpMmNfd19tYXNrKG92LCAweDBlLCAweDQwLCAweDQwKTsKKwkJfQorCisJCWlmIChvdi0+c2Vuc29yID09IFNFTl9PVjY2MzAgJiYgb3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTgKKwkJICAgICYmIG92NTE4X2NvbG9yKSB7CisJCQlpMmNfd19tYXNrKG92LCAweDEyLCAweDAwLCAweDEwKTsKKwkJCWkyY193X21hc2sob3YsIDB4MTMsIDB4MDAsIDB4MjApOworCQl9IGVsc2UgeworCQkJaTJjX3dfbWFzayhvdiwgMHgxMywgMHgyMCwgMHgyMCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y3NjEwIHx8IG92LT5zZW5zb3IgPT0gU0VOX09WNzZCRSkgeworCQkJLyogbm90IHZhbGlkIG9uIHRoZSBPVjY2MjAvT1Y3NjIwLzY2MzA/ICovCisJCQlpMmNfd19tYXNrKG92LCAweDBlLCAweDAwLCAweDQwKTsKKwkJfQorCisJCS8qIFRoZSBPVjUxOCBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudC4gQWx0aG91Z2ggYm90aCB0aGUgT1Y1MTgKKwkJICogYW5kIHRoZSBPVjY2MzAgc3VwcG9ydCBhIDE2LWJpdCB2aWRlbyBidXMsIG9ubHkgdGhlIDggYml0IFkKKwkJICogYnVzIGlzIGFjdHVhbGx5IHVzZWQuIFRoZSBVViBidXMgaXMgdGllZCB0byBncm91bmQuCisJCSAqIFRoZXJlZm9yZSwgdGhlIE9WNjYzMCBuZWVkcyB0byBiZSBpbiA4LWJpdCBtdWx0aXBsZXhlZAorCQkgKiBvdXRwdXQgbW9kZSAqLworCisJCWlmIChvdi0+c2Vuc29yID09IFNFTl9PVjY2MzAgJiYgb3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTgKKwkJICAgICYmIG92NTE4X2NvbG9yKSB7CisJCQlpMmNfd19tYXNrKG92LCAweDEyLCAweDEwLCAweDEwKTsKKwkJCWkyY193X21hc2sob3YsIDB4MTMsIDB4MjAsIDB4MjApOworCQl9IGVsc2UgeworCQkJaTJjX3dfbWFzayhvdiwgMHgxMywgMHgwMCwgMHgyMCk7CisJCX0KKwl9CisKKwkvKioqKioqKiogQ2xvY2sgcHJvZ3JhbW1pbmcgKioqKioqKiovCisKKwkvKiBUaGUgT1Y2NjIwIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcuIFRoaXMgcHJldmVudHMgdGhlIAorCSAqIHNldmVyZSBiYW5kaW5nIHRoYXQgbm9ybWFsbHkgb2NjdXJzICovCisJaWYgKG92LT5zZW5zb3IgPT0gU0VOX09WNjYyMCB8fCBvdi0+c2Vuc29yID09IFNFTl9PVjY2MzApCisJeworCQkvKiBDbG9jayBkb3duICovCisKKwkJaTJjX3cob3YsIDB4MmEsIDB4MDQpOworCisJCWlmIChvdi0+Y29tcHJlc3MpIHsKKy8vCQkJY2xvY2sgPSAwOyAgICAvKiBUaGlzIGVuc3VyZXMgdGhlIGhpZ2hlc3QgZnJhbWUgcmF0ZSAqLworCQkJY2xvY2sgPSAzOworCQl9IGVsc2UgaWYgKGNsb2NrZGl2ID09IC0xKSB7ICAgLyogSWYgdXNlciBkaWRuJ3Qgb3ZlcnJpZGUgaXQgKi8KKwkJCWNsb2NrID0gMzsgICAgLyogR2l2ZXMgYmV0dGVyIGV4cG9zdXJlIHRpbWUgKi8KKwkJfSBlbHNlIHsKKwkJCWNsb2NrID0gY2xvY2tkaXY7CisJCX0KKworCQlQREVCVUcoNCwgIlNldHRpbmcgY2xvY2sgZGl2aXNvciB0byAlZCIsIGNsb2NrKTsKKworCQlpMmNfdyhvdiwgMHgxMSwgY2xvY2spOworCisJCWkyY193KG92LCAweDJhLCAweDg0KTsKKwkJLyogVGhpcyBuZXh0IHNldHRpbmcgaXMgY3JpdGljYWwuIEl0IHNlZW1zIHRvIGltcHJvdmUKKwkJICogdGhlIGdhaW4gb3IgdGhlIGNvbnRyYXN0LiBUaGUgInJlc2VydmVkIiBiaXRzIHNlZW0KKwkJICogdG8gaGF2ZSBzb21lIGVmZmVjdCBpbiB0aGlzIGNhc2UuICovCisJCWkyY193KG92LCAweDJkLCAweDg1KTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKG92LT5jb21wcmVzcykgeworCQkJY2xvY2sgPSAxOyAgICAvKiBUaGlzIGVuc3VyZXMgdGhlIGhpZ2hlc3QgZnJhbWUgcmF0ZSAqLworCQl9IGVsc2UgaWYgKGNsb2NrZGl2ID09IC0xKSB7ICAgLyogSWYgdXNlciBkaWRuJ3Qgb3ZlcnJpZGUgaXQgKi8KKwkJCS8qIENhbGN1bGF0ZSBhbmQgc2V0IHRoZSBjbG9jayBkaXZpc29yICovCisJCQljbG9jayA9ICgoc3ViX2ZsYWcgPyBvdi0+c3VidyAqIG92LT5zdWJoCisJCQkJICA6IHdpZHRoICogaGVpZ2h0KQorCQkJCSAqIChtb2RlID09IFZJREVPX1BBTEVUVEVfR1JFWSA/IDIgOiAzKSAvIDIpCisJCQkJIC8gNjYwMDA7CisJCX0gZWxzZSB7CisJCQljbG9jayA9IGNsb2NrZGl2OworCQl9CisKKwkJUERFQlVHKDQsICJTZXR0aW5nIGNsb2NrIGRpdmlzb3IgdG8gJWQiLCBjbG9jayk7CisKKwkJaTJjX3cob3YsIDB4MTEsIGNsb2NrKTsKKwl9CisKKwkvKioqKioqKiogU3BlY2lhbCBGZWF0dXJlcyAqKioqKioqKi8KKworCWlmIChmcmFtZWRyb3AgPj0gMCkKKwkJaTJjX3cob3YsIDB4MTYsIGZyYW1lZHJvcCk7CisKKwkvKiBUZXN0IFBhdHRlcm4gKi8KKwlpMmNfd19tYXNrKG92LCAweDEyLCAodGVzdHBhdD8weDAyOjB4MDApLCAweDAyKTsKKworCS8qIEVuYWJsZSBhdXRvIHdoaXRlIGJhbGFuY2UgKi8KKwlpMmNfd19tYXNrKG92LCAweDEyLCAweDA0LCAweDA0KTsKKworCS8vIFRoaXMgd2lsbCBnbyBhd2F5IGFzIHNvb24gYXMgb3Y1MXhfbW9kZV9pbml0X3NlbnNvcl9yZWdzKCkKKwkvLyBpcyBmdWxseSB0ZXN0ZWQuCisJLyogNzYyMC82NjIwLzY2MzA/IGRvbid0IGhhdmUgcmVnaXN0ZXIgMHgzNSwgc28gcGxheSBpdCBzYWZlICovCisJaWYgKG92LT5zZW5zb3IgPT0gU0VOX09WNzYxMCB8fCBvdi0+c2Vuc29yID09IFNFTl9PVjc2QkUpIHsKKwkJaWYgKHdpZHRoID09IDY0MCAmJiBoZWlnaHQgPT0gNDgwKQorCQkJaTJjX3cob3YsIDB4MzUsIDB4OWUpOworCQllbHNlCisJCQlpMmNfdyhvdiwgMHgzNSwgMHgxZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9vdl9zZW5zb3Jfd2luZG93KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBtb2RlLAorCQkgICAgIGludCBzdWJfZmxhZykKK3sKKwlpbnQgcmV0OworCWludCBod3NiYXNlLCBod2ViYXNlLCB2d3NiYXNlLCB2d2ViYXNlLCBod3NpemUsIHZ3c2l6ZTsgCisJaW50IGhvZmZzZXQsIHZvZmZzZXQsIGh3c2NhbGUgPSAwLCB2d3NjYWxlID0gMDsKKworCS8qIFRoZSBkaWZmZXJlbnQgc2Vuc29yIElDcyBoYW5kbGUgc2V0dGluZyB1cCBvZiB3aW5kb3cgZGlmZmVyZW50bHkuCisJICogSUYgWU9VIFNFVCBJVCBXUk9ORywgWU9VIFdJTEwgR0VUIEFMTCBaRVJPIElTT0MgREFUQSBGUk9NIE9WNTF4ISEhICovCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNzZCRToKKwkJaHdzYmFzZSA9IDB4Mzg7CisJCWh3ZWJhc2UgPSAweDNhOworCQl2d3NiYXNlID0gdndlYmFzZSA9IDB4MDU7CisJCWJyZWFrOworCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJCWh3c2Jhc2UgPSAweDM4OworCQlod2ViYXNlID0gMHgzYTsKKwkJdndzYmFzZSA9IDB4MDU7CisJCXZ3ZWJhc2UgPSAweDA2OworCQlicmVhazsKKwljYXNlIFNFTl9PVjc2MjA6CisJCWh3c2Jhc2UgPSAweDJmOwkJLyogRnJvbSA3NjIwLlNFVCAoc3BlYyBpcyB3cm9uZykgKi8KKwkJaHdlYmFzZSA9IDB4MmY7CisJCXZ3c2Jhc2UgPSB2d2ViYXNlID0gMHgwNTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyKCJJbnZhbGlkIHNlbnNvciIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y2NjIwIHx8IG92LT5zZW5zb3IgPT0gU0VOX09WNjYzMCkgeworCQkvKiBOb3RlOiBPVjUxOCgrKSBkb2VzIGRvd25zYW1wbGUgb24gaXRzIG93bikgKi8KKwkJaWYgKCh3aWR0aCA+IDE3NiAmJiBoZWlnaHQgPiAxNDQpCisJCSAgICB8fCBvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgeyAgLyogQ0lGICovCisJCQlyZXQgPSBtb2RlX2luaXRfb3Zfc2Vuc29yX3JlZ3Mob3YsIHdpZHRoLCBoZWlnaHQsCisJCQkJbW9kZSwgc3ViX2ZsYWcsIDApOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCWh3c2NhbGUgPSAxOworCQkJdndzY2FsZSA9IDE7ICAvKiBUaGUgZGF0YXNoZWV0IHNheXMgMDsgaXQncyB3cm9uZyAqLworCQkJaHdzaXplID0gMzUyOworCQkJdndzaXplID0gMjg4OworCQl9IGVsc2UgaWYgKHdpZHRoID4gMTc2IHx8IGhlaWdodCA+IDE0NCkgeworCQkJZXJyKCJJbGxlZ2FsIGRpbWVuc2lvbnMiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgewkJCSAgICAvKiBRQ0lGICovCisJCQlyZXQgPSBtb2RlX2luaXRfb3Zfc2Vuc29yX3JlZ3Mob3YsIHdpZHRoLCBoZWlnaHQsCisJCQkJbW9kZSwgc3ViX2ZsYWcsIDEpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCWh3c2l6ZSA9IDE3NjsKKwkJCXZ3c2l6ZSA9IDE0NDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh3aWR0aCA+IDMyMCAmJiBoZWlnaHQgPiAyNDApIHsgIC8qIFZHQSAqLworCQkJcmV0ID0gbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKG92LCB3aWR0aCwgaGVpZ2h0LAorCQkJCW1vZGUsIHN1Yl9mbGFnLCAwKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlod3NjYWxlID0gMjsKKwkJCXZ3c2NhbGUgPSAxOworCQkJaHdzaXplID0gNjQwOworCQkJdndzaXplID0gNDgwOworCQl9IGVsc2UgaWYgKHdpZHRoID4gMzIwIHx8IGhlaWdodCA+IDI0MCkgeworCQkJZXJyKCJJbGxlZ2FsIGRpbWVuc2lvbnMiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgewkJCSAgICAvKiBRVkdBICovCisJCQlyZXQgPSBtb2RlX2luaXRfb3Zfc2Vuc29yX3JlZ3Mob3YsIHdpZHRoLCBoZWlnaHQsCisJCQkJbW9kZSwgc3ViX2ZsYWcsIDEpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCWh3c2NhbGUgPSAxOworCQkJaHdzaXplID0gMzIwOworCQkJdndzaXplID0gMjQwOworCQl9CisJfQorCisJLyogQ2VudGVyIHRoZSB3aW5kb3cgKi8KKwlob2Zmc2V0ID0gKChod3NpemUgLSB3aWR0aCkgLyAyKSA+PiBod3NjYWxlOworCXZvZmZzZXQgPSAoKHZ3c2l6ZSAtIGhlaWdodCkgLyAyKSA+PiB2d3NjYWxlOworCisJLyogRklYTUUhIC0gVGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQgMTYweDEyMCBhbmQgNjYyMCEhISAqLworCWlmIChzdWJfZmxhZykgeworCQlpMmNfdyhvdiwgMHgxNywgaHdzYmFzZSsob3YtPnN1Yng+Pmh3c2NhbGUpKTsKKwkJaTJjX3cob3YsIDB4MTgsCWh3ZWJhc2UrKChvdi0+c3VieCtvdi0+c3Vidyk+Pmh3c2NhbGUpKTsKKwkJaTJjX3cob3YsIDB4MTksIHZ3c2Jhc2UrKG92LT5zdWJ5Pj52d3NjYWxlKSk7CisJCWkyY193KG92LCAweDFhLCB2d2ViYXNlKygob3YtPnN1Ynkrb3YtPnN1YmgpPj52d3NjYWxlKSk7CisJfSBlbHNlIHsKKwkJaTJjX3cob3YsIDB4MTcsIGh3c2Jhc2UgKyBob2Zmc2V0KTsKKwkJaTJjX3cob3YsIDB4MTgsIGh3ZWJhc2UgKyBob2Zmc2V0ICsgKGh3c2l6ZT4+aHdzY2FsZSkpOworCQlpMmNfdyhvdiwgMHgxOSwgdndzYmFzZSArIHZvZmZzZXQpOworCQlpMmNfdyhvdiwgMHgxYSwgdndlYmFzZSArIHZvZmZzZXQgKyAodndzaXplPj52d3NjYWxlKSk7CisJfQorCisjaWZkZWYgT1Y1MTFfREVCVUcKKwlpZiAoZHVtcF9zZW5zb3IpCisJCWR1bXBfaTJjX3JlZ3Mob3YpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyogU2V0IHVwIHRoZSBPVjUxMS9PVjUxMSsgd2l0aCB0aGUgZ2l2ZW4gaW1hZ2UgcGFyYW1ldGVycy4KKyAqCisgKiBEbyBub3QgcHV0IGFueSBzZW5zb3Itc3BlY2lmaWMgY29kZSBpbiBoZXJlIChpbmNsdWRpbmcgSTJDIEkvTyBmdW5jdGlvbnMpCisgKi8KK3N0YXRpYyBpbnQKK292NTExX21vZGVfaW5pdF9yZWdzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAorCQkgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG1vZGUsIGludCBzdWJfZmxhZykKK3sKKwlpbnQgaHNlZ3MsIHZzZWdzOworCisJaWYgKHN1Yl9mbGFnKSB7CisJCXdpZHRoID0gb3YtPnN1Ync7CisJCWhlaWdodCA9IG92LT5zdWJoOworCX0KKworCVBERUJVRygzLCAid2lkdGg6JWQsIGhlaWdodDolZCwgbW9kZTolZCwgc3ViOiVkIiwKKwkgICAgICAgd2lkdGgsIGhlaWdodCwgbW9kZSwgc3ViX2ZsYWcpOworCisJLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIGEgNzExMWEtc3BlY2lmaWMgZnVuY3Rpb24gb25jZQorCS8vIHN1YmNhcHR1cmUgaXMgZGVhbHQgd2l0aCBwcm9wZXJseQorCWlmIChvdi0+c2Vuc29yID09IFNFTl9TQUE3MTExQSkgeworCQlpZiAod2lkdGggPT0gMzIwICYmIGhlaWdodCA9PSAyNDApIHsKKwkJCS8qIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCAqLworCQl9IGVsc2UgaWYgKHdpZHRoID09IDY0MCAmJiBoZWlnaHQgPT0gNDgwKSB7CisJCQkvKiBTZXQgdGhlIE9WNTExIHVwIGFzIDMyMHg0ODAsIGJ1dCBrZWVwIHRoZQorCQkJICogVjRMIHJlc29sdXRpb24gYXMgNjQweDQ4MCAqLworCQkJd2lkdGggPSAzMjA7CisJCX0gZWxzZSB7CisJCQllcnIoIlNBQTcxMTFBIG9ubHkgYWxsb3dzIDMyMHgyNDAgb3IgNjQweDQ4MCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBNYWtlIHN1cmUgd2lkdGggYW5kIGhlaWdodCBhcmUgYSBtdWx0aXBsZSBvZiA4ICovCisJaWYgKHdpZHRoICUgOCB8fCBoZWlnaHQgJSA4KSB7CisJCWVycigiSW52YWxpZCBzaXplICglZCwgJWQpIChtb2RlID0gJWQpIiwgd2lkdGgsIGhlaWdodCwgbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh3aWR0aCA8IG92LT5taW53aWR0aCB8fCBoZWlnaHQgPCBvdi0+bWluaGVpZ2h0KSB7CisJCWVycigiUmVxdWVzdGVkIGRpbWVuc2lvbnMgYXJlIHRvbyBzbWFsbCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAob3Y1MXhfc3RvcChvdikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChtb2RlID09IFZJREVPX1BBTEVUVEVfR1JFWSkgeworCQlyZWdfdyhvdiwgUjUxMV9DQU1fVVZfRU4sIDB4MDApOworCQlyZWdfdyhvdiwgUjUxMV9TTkFQX1VWX0VOLCAweDAwKTsKKwkJcmVnX3cob3YsIFI1MTFfU05BUF9PUFRTLCAweDAxKTsKKwl9IGVsc2UgeworCQlyZWdfdyhvdiwgUjUxMV9DQU1fVVZfRU4sIDB4MDEpOworCQlyZWdfdyhvdiwgUjUxMV9TTkFQX1VWX0VOLCAweDAxKTsKKwkJcmVnX3cob3YsIFI1MTFfU05BUF9PUFRTLCAweDAzKTsKKwl9CisKKwkvKiBIZXJlIEknbSBhc3N1bWluZyB0aGF0IHNuYXBzaG90IHNpemUgPT0gaW1hZ2Ugc2l6ZS4KKwkgKiBJIGhvcGUgdGhhdCdzIGFsd2F5cyB0cnVlLiAtLWNsYXVkaW8KKwkgKi8KKwloc2VncyA9ICh3aWR0aCA+PiAzKSAtIDE7CisJdnNlZ3MgPSAoaGVpZ2h0ID4+IDMpIC0gMTsKKworCXJlZ193KG92LCBSNTExX0NBTV9QWENOVCwgaHNlZ3MpOworCXJlZ193KG92LCBSNTExX0NBTV9MTkNOVCwgdnNlZ3MpOworCXJlZ193KG92LCBSNTExX0NBTV9QWERJViwgMHgwMCk7CisJcmVnX3cob3YsIFI1MTFfQ0FNX0xORElWLCAweDAwKTsKKworCS8qIFlVVjQyMCwgbG93IHBhc3MgZmlsdGVyIG9uICovCisJcmVnX3cob3YsIFI1MTFfQ0FNX09QVFMsIDB4MDMpOworCisJLyogU25hcHNob3QgYWRkaXRpb25zICovCisJcmVnX3cob3YsIFI1MTFfU05BUF9QWENOVCwgaHNlZ3MpOworCXJlZ193KG92LCBSNTExX1NOQVBfTE5DTlQsIHZzZWdzKTsKKwlyZWdfdyhvdiwgUjUxMV9TTkFQX1BYRElWLCAweDAwKTsKKwlyZWdfdyhvdiwgUjUxMV9TTkFQX0xORElWLCAweDAwKTsKKworCWlmIChvdi0+Y29tcHJlc3MpIHsKKwkJLyogRW5hYmxlIFkgYW5kIFVWIHF1YW50aXphdGlvbiBhbmQgY29tcHJlc3Npb24gKi8KKwkJcmVnX3cob3YsIFI1MTFfQ09NUF9FTiwgMHgwNyk7CisJCXJlZ193KG92LCBSNTExX0NPTVBfTFVUX0VOLCAweDAzKTsKKwkJb3Y1MXhfcmVzZXQob3YsIE9WNTExX1JFU0VUX09NTklDRSk7CisJfQorCisJaWYgKG92NTF4X3Jlc3RhcnQob3YpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworLyogU2V0cyB1cCB0aGUgT1Y1MTgvT1Y1MTgrIHdpdGggdGhlIGdpdmVuIGltYWdlIHBhcmFtZXRlcnMKKyAqCisgKiBPVjUxOCBuZWVkcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFwcHJvYWNoLCB1bnRpbCB3ZSBjYW4gZmlndXJlIG91dCB3aGF0CisgKiB0aGUgaW5kaXZpZHVhbCByZWdpc3RlcnMgZG8uIEFsc28sIG9ubHkgMTUgRlBTIGlzIHN1cHBvcnRlZCBub3cuCisgKgorICogRG8gbm90IHB1dCBhbnkgc2Vuc29yLXNwZWNpZmljIGNvZGUgaW4gaGVyZSAoaW5jbHVkaW5nIEkyQyBJL08gZnVuY3Rpb25zKQorICovCitzdGF0aWMgaW50CitvdjUxOF9tb2RlX2luaXRfcmVncyhzdHJ1Y3QgdXNiX292NTExICpvdiwKKwkJICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBtb2RlLCBpbnQgc3ViX2ZsYWcpCit7CisJaW50IGhzZWdzLCB2c2VncywgaGlfcmVzOworCisJaWYgKHN1Yl9mbGFnKSB7CisJCXdpZHRoID0gb3YtPnN1Ync7CisJCWhlaWdodCA9IG92LT5zdWJoOworCX0KKworCVBERUJVRygzLCAid2lkdGg6JWQsIGhlaWdodDolZCwgbW9kZTolZCwgc3ViOiVkIiwKKwkgICAgICAgd2lkdGgsIGhlaWdodCwgbW9kZSwgc3ViX2ZsYWcpOworCisJaWYgKHdpZHRoICUgMTYgfHwgaGVpZ2h0ICUgOCkgeworCQllcnIoIkludmFsaWQgc2l6ZSAoJWQsICVkKSIsIHdpZHRoLCBoZWlnaHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAod2lkdGggPCBvdi0+bWlud2lkdGggfHwgaGVpZ2h0IDwgb3YtPm1pbmhlaWdodCkgeworCQllcnIoIlJlcXVlc3RlZCBkaW1lbnNpb25zIGFyZSB0b28gc21hbGwiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdpZHRoID49IDMyMCAmJiBoZWlnaHQgPj0gMjQwKSB7CisJCWhpX3JlcyA9IDE7CisJfSBlbHNlIGlmICh3aWR0aCA+PSAzMjAgfHwgaGVpZ2h0ID49IDI0MCkgeworCQllcnIoIkludmFsaWQgd2lkdGgvaGVpZ2h0IGNvbWJpbmF0aW9uICglZCwgJWQpIiwgd2lkdGgsIGhlaWdodCk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWhpX3JlcyA9IDA7CisJfQorCisJaWYgKG92NTF4X3N0b3Aob3YpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKioqKioqKiogU2V0IHRoZSBtb2RlICoqKioqKioqLworCisJcmVnX3cob3YsIDB4MmIsIDApOworCXJlZ193KG92LCAweDJjLCAwKTsKKwlyZWdfdyhvdiwgMHgyZCwgMCk7CisJcmVnX3cob3YsIDB4MmUsIDApOworCXJlZ193KG92LCAweDNiLCAwKTsKKwlyZWdfdyhvdiwgMHgzYywgMCk7CisJcmVnX3cob3YsIDB4M2QsIDApOworCXJlZ193KG92LCAweDNlLCAwKTsKKworCWlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxOCAmJiBvdjUxOF9jb2xvcikgeworCQkvKiBPVjUxOCBuZWVkcyBVIGFuZCBWIHN3YXBwZWQgKi8KKwkJaTJjX3dfbWFzayhvdiwgMHgxNSwgMHgwMCwgMHgwMSk7CisKKwkgCWlmIChtb2RlID09IFZJREVPX1BBTEVUVEVfR1JFWSkgeworCQkJLyogU2V0IDE2LWJpdCBpbnB1dCBmb3JtYXQgKFVWIGRhdGEgYXJlIGlnbm9yZWQpICovCisJCQlyZWdfd19tYXNrKG92LCAweDIwLCAweDAwLCAweDA4KTsKKworCQkJLyogU2V0IDgtYml0ICg0OjA6MCkgb3V0cHV0IGZvcm1hdCAqLworCQkJcmVnX3dfbWFzayhvdiwgMHgyOCwgMHgwMCwgMHhmMCk7CisJCQlyZWdfd19tYXNrKG92LCAweDM4LCAweDAwLCAweGYwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNldCA4LWJpdCAoWVZZVSkgaW5wdXQgZm9ybWF0ICovCisJCQlyZWdfd19tYXNrKG92LCAweDIwLCAweDA4LCAweDA4KTsKKworCQkJLyogU2V0IDEyLWJpdCAoNDoyOjApIG91dHB1dCBmb3JtYXQgKi8KKwkJCXJlZ193X21hc2sob3YsIDB4MjgsIDB4ODAsIDB4ZjApOworCQkJcmVnX3dfbWFzayhvdiwgMHgzOCwgMHg4MCwgMHhmMCk7CisJCX0KKwl9IGVsc2UgeworCQlyZWdfdyhvdiwgMHgyOCwgKG1vZGUgPT0gVklERU9fUEFMRVRURV9HUkVZKSA/IDB4MDA6MHg4MCk7CisJCXJlZ193KG92LCAweDM4LCAobW9kZSA9PSBWSURFT19QQUxFVFRFX0dSRVkpID8gMHgwMDoweDgwKTsKKwl9CisKKwloc2VncyA9IHdpZHRoIC8gMTY7CisJdnNlZ3MgPSBoZWlnaHQgLyA0OworCisJcmVnX3cob3YsIDB4MjksIGhzZWdzKTsKKwlyZWdfdyhvdiwgMHgyYSwgdnNlZ3MpOworCisJcmVnX3cob3YsIDB4MzksIGhzZWdzKTsKKwlyZWdfdyhvdiwgMHgzYSwgdnNlZ3MpOworCisJLyogV2luZG93cyBkcml2ZXIgZG9lcyB0aGlzIGhlcmU7IHdobyBrbm93cyB3aHkgKi8KKwlyZWdfdyhvdiwgMHgyZiwgMHg4MCk7CisKKwkvKioqKioqKiogU2V0IHRoZSBmcmFtZXJhdGUgKHRvIDE1IEZQUykgKioqKioqKiovCisKKwkvKiBNb2RlIGluZGVwZW5kZW50LCBidXQgZnJhbWVyYXRlIGRlcGVuZGVudCwgcmVncyAqLworCXJlZ193KG92LCAweDUxLCAweDAyKTsJLyogQ2xvY2sgZGl2aWRlcjsgbG93ZXI9PWZhc3RlciAqLworCXJlZ193KG92LCAweDIyLCAweDE4KTsKKwlyZWdfdyhvdiwgMHgyMywgMHhmZik7CisKKwlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MThQTFVTKQorCQlyZWdfdyhvdiwgMHgyMSwgMHgxOSk7CisJZWxzZQorCQlyZWdfdyhvdiwgMHg3MSwgMHgxOSk7CS8qIENvbXByZXNzaW9uLXJlbGF0ZWQ/ICovCisKKwkvLyBGSVhNRTogU2Vuc29yLXNwZWNpZmljCisJLyogQml0IDUgaXMgd2hhdCBtYXR0ZXJzIGhlcmUuIE9mIGNvdXJzZSwgaXQgaXMgInJlc2VydmVkIiAqLworCWkyY193KG92LCAweDU0LCAweDIzKTsKKworCXJlZ193KG92LCAweDJmLCAweDgwKTsKKworCWlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxOFBMVVMpIHsKKwkJcmVnX3cob3YsIDB4MjQsIDB4OTQpOworCQlyZWdfdyhvdiwgMHgyNSwgMHg5MCk7CisJCW92NTE4X3JlZ193MzIob3YsIDB4YzQsICAgIDQwMCwgMik7CS8qIDE5MGggICAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweGM2LCAgICA1NDAsIDIpOwkvKiAyMWNoICAgKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjNywgICAgNTQwLCAyKTsJLyogMjFjaCAgICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4YzgsICAgIDEwOCwgMik7CS8qIDZjaCAgICAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweGNhLCAxMzEwOTgsIDMpOwkvKiAyMDAxYWggKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjYiwgICAgNTMyLCAyKTsJLyogMjE0aCAgICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4Y2MsICAgMjQwMCwgMik7CS8qIDk2MGggICAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweGNkLCAgICAgMzIsIDIpOwkvKiAyMGggICAgKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjZSwgICAgNjA4LCAyKTsJLyogMjYwaCAgICovCisJfSBlbHNlIHsKKwkJcmVnX3cob3YsIDB4MjQsIDB4OWYpOworCQlyZWdfdyhvdiwgMHgyNSwgMHg5MCk7CisJCW92NTE4X3JlZ193MzIob3YsIDB4YzQsICAgIDQwMCwgMik7CS8qIDE5MGggICAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweGM2LCAgICA1MDAsIDIpOwkvKiAxZjRoICAgKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjNywgICAgNTAwLCAyKTsJLyogMWY0aCAgICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4YzgsICAgIDE0MiwgMik7CS8qIDhlaCAgICAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweGNhLCAxMzEwOTgsIDMpOwkvKiAyMDAxYWggKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjYiwgICAgNTMyLCAyKTsJLyogMjE0aCAgICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4Y2MsICAgMjAwMCwgMik7CS8qIDdkMGggICAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweGNkLCAgICAgMzIsIDIpOwkvKiAyMGggICAgKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjZSwgICAgNjA4LCAyKTsJLyogMjYwaCAgICovCisJfQorCisJcmVnX3cob3YsIDB4MmYsIDB4ODApOworCisJaWYgKG92NTF4X3Jlc3RhcnQob3YpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBSZXNldCBpdCBqdXN0IGZvciBnb29kIG1lYXN1cmUgKi8KKwlpZiAob3Y1MXhfcmVzZXQob3YsIE9WNTExX1JFU0VUX05PUkVHUykgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIE9WNTExLCBPVjUxOCwgYW5kIHNlbnNvciBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQKK21vZGVfaW5pdF9yZWdzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAorCSAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBtb2RlLCBpbnQgc3ViX2ZsYWcpCit7CisJaW50IHJjID0gMDsKKworCWlmICghb3YgfHwgIW92LT5kZXYpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7CisJCXJjID0gb3Y1MThfbW9kZV9pbml0X3JlZ3Mob3YsIHdpZHRoLCBoZWlnaHQsIG1vZGUsIHN1Yl9mbGFnKTsKKwl9IGVsc2UgeworCQlyYyA9IG92NTExX21vZGVfaW5pdF9yZWdzKG92LCB3aWR0aCwgaGVpZ2h0LCBtb2RlLCBzdWJfZmxhZyk7CisJfQorCisJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNzYyMDoKKwljYXNlIFNFTl9PVjc2QkU6CisJY2FzZSBTRU5fT1Y4NjAwOgorCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJCXJjID0gc2V0X292X3NlbnNvcl93aW5kb3cob3YsIHdpZHRoLCBoZWlnaHQsIG1vZGUsIHN1Yl9mbGFnKTsKKwkJYnJlYWs7CisJY2FzZSBTRU5fS1MwMTI3OgorCWNhc2UgU0VOX0tTMDEyN0I6CisJCWVycigiS1MwMTI3LXNlcmllcyBkZWNvZGVycyBub3Qgc3VwcG9ydGVkIHlldCIpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgU0VOX1NBQTcxMTFBOgorLy8JCXJjID0gbW9kZV9pbml0X3NhYV9zZW5zb3JfcmVncyhvdiwgd2lkdGgsIGhlaWdodCwgbW9kZSwKKy8vCQkJCQkgICAgICAgc3ViX2ZsYWcpOworCisJCVBERUJVRygxLCAiU0FBIHN0YXR1cyA9IDB4JTAyWCIsIGkyY19yKG92LCAweDFmKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycigiVW5rbm93biBzZW5zb3IiKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCWlmIChGQVRBTF9FUlJPUihyYykpCisJCXJldHVybiByYzsKKworCS8qIFNlbnNvci1pbmRlcGVuZGVudCBzZXR0aW5ncyAqLworCXJjID0gc2Vuc29yX3NldF9hdXRvX2JyaWdodG5lc3Mob3YsIG92LT5hdXRvX2JydCk7CisJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJcmMgPSBzZW5zb3Jfc2V0X2F1dG9fZXhwb3N1cmUob3YsIG92LT5hdXRvX2V4cCk7CisJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJcmMgPSBzZW5zb3Jfc2V0X2JhbmRpbmdfZmlsdGVyKG92LCBiYW5kaW5nZmlsdGVyKTsKKwlpZiAoRkFUQUxfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwlpZiAob3YtPmxpZ2h0ZnJlcSkgeworCQlyYyA9IHNlbnNvcl9zZXRfbGlnaHRfZnJlcShvdiwgbGlnaHRmcmVxKTsKKwkJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHNlbnNvcl9zZXRfYmFja2xpZ2h0KG92LCBvdi0+YmFja2xpZ2h0KTsKKwlpZiAoRkFUQUxfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHNlbnNvcl9zZXRfbWlycm9yKG92LCBvdi0+bWlycm9yKTsKKwlpZiAoRkFUQUxfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBzZXRzIHRoZSBkZWZhdWx0IGltYWdlIHBhcmFtZXRlcnMuIFRoaXMgaXMgdXNlZnVsIGZvciBhcHBzIHRoYXQgdXNlCisgKiByZWFkKCkgYW5kIGRvIG5vdCBzZXQgdGhlc2UuCisgKi8KK3N0YXRpYyBpbnQKK292NTF4X3NldF9kZWZhdWx0X3BhcmFtcyhzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbnQgaTsKKworCS8qIFNldCBkZWZhdWx0IHNpemVzIGluIGNhc2UgSU9DVEwgKFZJRElPQ01DQVBUVVJFKSBpcyBub3QgdXNlZAorCSAqICh1c2luZyByZWFkKCkgaW5zdGVhZCkuICovCisJZm9yIChpID0gMDsgaSA8IE9WNTExX05VTUZSQU1FUzsgaSsrKSB7CisJCW92LT5mcmFtZVtpXS53aWR0aCA9IG92LT5tYXh3aWR0aDsKKwkJb3YtPmZyYW1lW2ldLmhlaWdodCA9IG92LT5tYXhoZWlnaHQ7CisJCW92LT5mcmFtZVtpXS5ieXRlc19yZWFkID0gMDsKKwkJaWYgKGZvcmNlX3BhbGV0dGUpCisJCQlvdi0+ZnJhbWVbaV0uZm9ybWF0ID0gZm9yY2VfcGFsZXR0ZTsKKwkJZWxzZQorCQkJb3YtPmZyYW1lW2ldLmZvcm1hdCA9IFZJREVPX1BBTEVUVEVfWVVWNDIwOworCisJCW92LT5mcmFtZVtpXS5kZXB0aCA9IGdldF9kZXB0aChvdi0+ZnJhbWVbaV0uZm9ybWF0KTsKKwl9CisKKwlQREVCVUcoMywgIiVkeCVkLCAlcyIsIG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCwKKwkgICAgICAgc3ltYm9saWModjRsMV9wbGlzdCwgb3YtPmZyYW1lWzBdLmZvcm1hdCkpOworCisJLyogSW5pdGlhbGl6ZSB0byBtYXggd2lkdGgvaGVpZ2h0LCBZVVY0MjAgb3IgUkdCMjQgKGlmIHN1cHBvcnRlZCkgKi8KKwlpZiAobW9kZV9pbml0X3JlZ3Mob3YsIG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCwKKwkJCSAgIG92LT5mcmFtZVswXS5mb3JtYXQsIDApIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBWaWRlbyBkZWNvZGVyIHN0dWZmCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNldCBhbmFsb2cgaW5wdXQgcG9ydCBvZiBkZWNvZGVyICovCitzdGF0aWMgaW50CitkZWNvZGVyX3NldF9pbnB1dChzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IGlucHV0KQoreworCVBERUJVRyg0LCAicG9ydCAlZCIsIGlucHV0KTsKKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX1NBQTcxMTFBOgorCXsKKwkJLyogU2VsZWN0IG1vZGUgKi8KKwkJaTJjX3dfbWFzayhvdiwgMHgwMiwgaW5wdXQsIDB4MDcpOworCQkvKiBCeXBhc3MgY2hyb21pbmFuY2UgdHJhcCBmb3IgbW9kZXMgNC4uNyAqLworCQlpMmNfd19tYXNrKG92LCAweDA5LCAoaW5wdXQgPiAzKSA/IDB4ODA6MHgwMCwgMHg4MCk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IEFTQ0lJIG5hbWUgb2YgdmlkZW8gaW5wdXQgKi8KK3N0YXRpYyBpbnQKK2RlY29kZXJfZ2V0X2lucHV0X25hbWUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBpbnB1dCwgY2hhciAqbmFtZSkKK3sKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9TQUE3MTExQToKKwl7CisJCWlmIChpbnB1dCA8IDAgfHwgaW5wdXQgPiA3KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVsc2UgaWYgKGlucHV0IDwgNCkKKwkJCXNwcmludGYobmFtZSwgIkNWQlMtJWQiLCBpbnB1dCk7CisJCWVsc2UgLy8gaWYgKGlucHV0IDwgOCkKKwkJCXNwcmludGYobmFtZSwgIlMtVmlkZW8tJWQiLCBpbnB1dCAtIDQpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJc3ByaW50ZihuYW1lLCAiJXMiLCAiQ2FtZXJhIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBub3JtIChOVFNDLCBQQUwsIFNFQ0FNLCBBVVRPKSAqLworc3RhdGljIGludAorZGVjb2Rlcl9zZXRfbm9ybShzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IG5vcm0pCit7CisJUERFQlVHKDQsICIlZCIsIG5vcm0pOworCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fU0FBNzExMUE6CisJeworCQlpbnQgcmVnXzgsIHJlZ19lOworCisJCWlmIChub3JtID09IFZJREVPX01PREVfTlRTQykgeworCQkJcmVnXzggPSAweDQwOwkvKiA2MCBIeiAqLworCQkJcmVnX2UgPSAweDAwOwkvKiBOVFNDIE0gLyBQQUwgQkdISSAqLworCQl9IGVsc2UgaWYgKG5vcm0gPT0gVklERU9fTU9ERV9QQUwpIHsKKwkJCXJlZ184ID0gMHgwMDsJLyogNTAgSHogKi8KKwkJCXJlZ19lID0gMHgwMDsJLyogTlRTQyBNIC8gUEFMIEJHSEkgKi8KKwkJfSBlbHNlIGlmIChub3JtID09IFZJREVPX01PREVfQVVUTykgeworCQkJcmVnXzggPSAweDgwOwkvKiBBdXRvIGZpZWxkIGRldGVjdCAqLworCQkJcmVnX2UgPSAweDAwOwkvKiBOVFNDIE0gLyBQQUwgQkdISSAqLworCQl9IGVsc2UgaWYgKG5vcm0gPT0gVklERU9fTU9ERV9TRUNBTSkgeworCQkJcmVnXzggPSAweDAwOwkvKiA1MCBIeiAqLworCQkJcmVnX2UgPSAweDUwOwkvKiBTRUNBTSAvIFBBTCA0LjQzICovCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWkyY193X21hc2sob3YsIDB4MDgsIHJlZ184LCAweGMwKTsKKwkJaTJjX3dfbWFzayhvdiwgMHgwZSwgcmVnX2UsIDB4NzApOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmF3IGRhdGEgcGFyc2luZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb3BpZXMgYSA2NC1ieXRlIHNlZ21lbnQgYXQgcEluIHRvIGFuIDh4OCBibG9jayBhdCBwT3V0LiBUaGUgd2lkdGggb2YgdGhlCisgKiBpbWFnZSBhdCBwT3V0IGlzIHNwZWNpZmllZCBieSB3LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK21ha2VfOHg4KHVuc2lnbmVkIGNoYXIgKnBJbiwgdW5zaWduZWQgY2hhciAqcE91dCwgaW50IHcpCit7CisJdW5zaWduZWQgY2hhciAqcE91dDEgPSBwT3V0OworCWludCB4LCB5OworCisJZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworCQlwT3V0MSA9IHBPdXQ7CisJCWZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKwkJCSpwT3V0MSsrID0gKnBJbisrOworCQl9CisJCXBPdXQgKz0gdzsKKwl9Cit9CisKKy8qCisgKiBGb3IgUkFXIEJXIChZVVYgNDowOjApIGltYWdlcywgZGF0YSBzaG93IHVwIGluIDI1NiBieXRlIHNlZ21lbnRzLgorICogVGhlIHNlZ21lbnRzIHJlcHJlc2VudCA0IHNxdWFyZXMgb2YgOHg4IHBpeGVscyBhcyBmb2xsb3dzOgorICoKKyAqICAgICAgMCAgMSAuLi4gIDcgICAgNjQgIDY1IC4uLiAgNzEgICAuLi4gIDE5MiAxOTMgLi4uIDE5OQorICogICAgICA4ICA5IC4uLiAxNSAgICA3MiAgNzMgLi4uICA3OSAgICAgICAgMjAwIDIwMSAuLi4gMjA3CisgKiAgICAgICAgICAgLi4uICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgIC4uLgorICogICAgIDU2IDU3IC4uLiA2MyAgIDEyMCAxMjEgLi4uIDEyNyAgICAgICAgMjQ4IDI0OSAuLi4gMjU1CisgKgorICovIAorc3RhdGljIHZvaWQKK3l1djQwMHJhd190b195dXY0MDBwKHN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWUsCisJCSAgICAgdW5zaWduZWQgY2hhciAqcEluMCwgdW5zaWduZWQgY2hhciAqcE91dDApCit7CisJaW50IHgsIHk7CisJdW5zaWduZWQgY2hhciAqcEluLCAqcE91dCwgKnBPdXRMaW5lOworCisJLyogQ29weSBZICovCisJcEluID0gcEluMDsKKwlwT3V0TGluZSA9IHBPdXQwOworCWZvciAoeSA9IDA7IHkgPCBmcmFtZS0+cmF3aGVpZ2h0IC0gMTsgeSArPSA4KSB7CisJCXBPdXQgPSBwT3V0TGluZTsKKwkJZm9yICh4ID0gMDsgeCA8IGZyYW1lLT5yYXd3aWR0aCAtIDE7IHggKz0gOCkgeworCQkJbWFrZV84eDgocEluLCBwT3V0LCBmcmFtZS0+cmF3d2lkdGgpOworCQkJcEluICs9IDY0OworCQkJcE91dCArPSA4OworCQl9CisJCXBPdXRMaW5lICs9IDggKiBmcmFtZS0+cmF3d2lkdGg7CisJfQorfQorCisvKgorICogRm9yIFlVViA0OjI6MCBpbWFnZXMsIHRoZSBkYXRhIHNob3cgdXAgaW4gMzg0IGJ5dGUgc2VnbWVudHMuCisgKiBUaGUgZmlyc3QgNjQgYnl0ZXMgb2YgZWFjaCBzZWdtZW50IGFyZSBVLCB0aGUgbmV4dCA2NCBhcmUgVi4gIFRoZSBVIGFuZAorICogViBhcmUgYXJyYW5nZWQgYXMgZm9sbG93czoKKyAqCisgKiAgICAgIDAgIDEgLi4uICA3CisgKiAgICAgIDggIDkgLi4uIDE1CisgKiAgICAgICAgICAgLi4uICAgCisgKiAgICAgNTYgNTcgLi4uIDYzCisgKgorICogVSBhbmQgViBhcmUgc2hpcHBlZCBhdCBoYWxmIHJlc29sdXRpb24gKDEgVSxWIHNhbXBsZSAtPiBvbmUgMngyIGJsb2NrKS4KKyAqCisgKiBUaGUgbmV4dCAyNTYgYnl0ZXMgYXJlIGZ1bGwgcmVzb2x1dGlvbiBZIGRhdGEgYW5kIHJlcHJlc2VudCA0IHNxdWFyZXMKKyAqIG9mIDh4OCBwaXhlbHMgYXMgZm9sbG93czoKKyAqCisgKiAgICAgIDAgIDEgLi4uICA3ICAgIDY0ICA2NSAuLi4gIDcxICAgLi4uICAxOTIgMTkzIC4uLiAxOTkKKyAqICAgICAgOCAgOSAuLi4gMTUgICAgNzIgIDczIC4uLiAgNzkgICAgICAgIDIwMCAyMDEgLi4uIDIwNworICogICAgICAgICAgIC4uLiAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAuLi4KKyAqICAgICA1NiA1NyAuLi4gNjMgICAxMjAgMTIxIC4uLiAxMjcgICAuLi4gIDI0OCAyNDkgLi4uIDI1NQorICoKKyAqIE5vdGUgdGhhdCB0aGUgVSBhbmQgViBkYXRhIGluIG9uZSBzZWdtZW50IHJlcHJlc2VudCBhIDE2IHggMTYgcGl4ZWwKKyAqIGFyZWEsIGJ1dCB0aGUgWSBkYXRhIHJlcHJlc2VudCBhIDMyIHggOCBwaXhlbCBhcmVhLiBJZiB0aGUgd2lkdGggaXMgbm90IGFuCisgKiBldmVuIG11bHRpcGxlIG9mIDMyLCB0aGUgZXh0cmEgOHg4IGJsb2NrcyB3aXRoaW4gYSAzMng4IGJsb2NrIGJlbG9uZyB0byB0aGUKKyAqIG5leHQgaG9yaXpvbnRhbCBzdHJpcGUuCisgKgorICogSWYgZHVtcHBpeCBtb2R1bGUgcGFyYW0gaXMgc2V0LCBfcGFyc2VfZGF0YSBqdXN0IGR1bXBzIHRoZSBpbmNvbWluZyBzZWdtZW50cywKKyAqIHZlcmJhdGltLCBpbiBvcmRlciwgaW50byB0aGUgZnJhbWUuIFdoZW4gdXNlZCB3aXRoIHZpZGNhdCAtZiBwcG0gLXMgNjQweDQ4MAorICogdGhpcyBwdXRzIHRoZSBkYXRhIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGNhbiBiZSBhbmFseXplZCB3aXRoIHRoZQorICogcGFyc2VwcG0uYyB1dGlsaXR5IEkgd3JvdGUuICBUaGF0J3MgYSBtdWNoIGZhc3RlciB3YXkgZm9yIGZpZ3VyaW5nIG91dCBob3cKKyAqIHRoZXNlIGRhdGEgYXJlIHNjcmFtYmxlZC4KKyAqLworCisvKiBDb252ZXJ0cyBmcm9tIHJhdywgdW5jb21wcmVzc2VkIHNlZ21lbnRzIGF0IHBJbjAgdG8gYSBZVVY0MjBQIGZyYW1lIGF0IHBPdXQwLgorICoKKyAqIEZJWE1FOiBDdXJyZW50bHkgb25seSBoYW5kbGVzIHdpZHRoIGFuZCBoZWlnaHQgdGhhdCBhcmUgbXVsdGlwbGVzIG9mIDE2CisgKi8KK3N0YXRpYyB2b2lkCit5dXY0MjByYXdfdG9feXV2NDIwcChzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKnBJbjAsIHVuc2lnbmVkIGNoYXIgKnBPdXQwKQoreworCWludCBrLCB4LCB5OworCXVuc2lnbmVkIGNoYXIgKnBJbiwgKnBPdXQsICpwT3V0TGluZTsKKwljb25zdCB1bnNpZ25lZCBpbnQgYSA9IGZyYW1lLT5yYXd3aWR0aCAqIGZyYW1lLT5yYXdoZWlnaHQ7CisJY29uc3QgdW5zaWduZWQgaW50IHcgPSBmcmFtZS0+cmF3d2lkdGggLyAyOworCisJLyogQ29weSBVIGFuZCBWICovCisJcEluID0gcEluMDsKKwlwT3V0TGluZSA9IHBPdXQwICsgYTsKKwlmb3IgKHkgPSAwOyB5IDwgZnJhbWUtPnJhd2hlaWdodCAtIDE7IHkgKz0gMTYpIHsKKwkJcE91dCA9IHBPdXRMaW5lOworCQlmb3IgKHggPSAwOyB4IDwgZnJhbWUtPnJhd3dpZHRoIC0gMTsgeCArPSAxNikgeworCQkJbWFrZV84eDgocEluLCBwT3V0LCB3KTsKKwkJCW1ha2VfOHg4KHBJbiArIDY0LCBwT3V0ICsgYS80LCB3KTsKKwkJCXBJbiArPSAzODQ7CisJCQlwT3V0ICs9IDg7CisJCX0KKwkJcE91dExpbmUgKz0gOCAqIHc7CisJfQorCisJLyogQ29weSBZICovCisJcEluID0gcEluMCArIDEyODsKKwlwT3V0TGluZSA9IHBPdXQwOworCWsgPSAwOworCWZvciAoeSA9IDA7IHkgPCBmcmFtZS0+cmF3aGVpZ2h0IC0gMTsgeSArPSA4KSB7CisJCXBPdXQgPSBwT3V0TGluZTsKKwkJZm9yICh4ID0gMDsgeCA8IGZyYW1lLT5yYXd3aWR0aCAtIDE7IHggKz0gOCkgeworCQkJbWFrZV84eDgocEluLCBwT3V0LCBmcmFtZS0+cmF3d2lkdGgpOworCQkJcEluICs9IDY0OworCQkJcE91dCArPSA4OworCQkJaWYgKCgrK2spID4gMykgeworCQkJCWsgPSAwOworCQkJCXBJbiArPSAxMjg7CisJCQl9CisJCX0KKwkJcE91dExpbmUgKz0gOCAqIGZyYW1lLT5yYXd3aWR0aDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVjb21wcmVzc2lvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDaG9vc2VzIGEgZGVjb21wcmVzc2lvbiBtb2R1bGUsIGxvY2tzIGl0LCBhbmQgc2V0cyBvdi0+ZGVjb21wX29wcworICogYWNjb3JkaW5nbHkuIFJldHVybnMgLUVOWElPIGlmIGRlY29tcHJlc3NvciBpcyBub3QgYXZhaWxhYmxlLCBvdGhlcndpc2UKKyAqIHJldHVybnMgMCBpZiBubyBvdGhlciBlcnJvci4KKyAqLworc3RhdGljIGludAorcmVxdWVzdF9kZWNvbXByZXNzb3Ioc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaWYgKCFvdikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAob3YtPmRlY29tcF9vcHMpIHsKKwkJZXJyKCJFUlJPUjogRGVjb21wcmVzc29yIGFscmVhZHkgcmVxdWVzdGVkISIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb2NrX2tlcm5lbCgpOworCisJLyogVHJ5IHRvIGdldCBNTVgsIGFuZCBmYWxsIGJhY2sgb24gbm8tTU1YIGlmIG5lY2Vzc2FyeSAqLworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxMSkgeworCQlpZiAob3Y1MTFfbW14X2RlY29tcF9vcHMpIHsKKwkJCVBERUJVRygzLCAiVXNpbmcgT1Y1MTEgTU1YIGRlY29tcHJlc3NvciIpOworCQkJb3YtPmRlY29tcF9vcHMgPSBvdjUxMV9tbXhfZGVjb21wX29wczsKKwkJfSBlbHNlIGlmIChvdjUxMV9kZWNvbXBfb3BzKSB7CisJCQlQREVCVUcoMywgIlVzaW5nIE9WNTExIGRlY29tcHJlc3NvciIpOworCQkJb3YtPmRlY29tcF9vcHMgPSBvdjUxMV9kZWNvbXBfb3BzOworCQl9IGVsc2UgeworCQkJZXJyKCJObyBkZWNvbXByZXNzb3IgYXZhaWxhYmxlIik7CisJCX0KKwl9IGVsc2UgaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7CisJCWlmIChvdjUxOF9tbXhfZGVjb21wX29wcykgeworCQkJUERFQlVHKDMsICJVc2luZyBPVjUxOCBNTVggZGVjb21wcmVzc29yIik7CisJCQlvdi0+ZGVjb21wX29wcyA9IG92NTE4X21teF9kZWNvbXBfb3BzOworCQl9IGVsc2UgaWYgKG92NTE4X2RlY29tcF9vcHMpIHsKKwkJCVBERUJVRygzLCAiVXNpbmcgT1Y1MTggZGVjb21wcmVzc29yIik7CisJCQlvdi0+ZGVjb21wX29wcyA9IG92NTE4X2RlY29tcF9vcHM7CisJCX0gZWxzZSB7CisJCQllcnIoIk5vIGRlY29tcHJlc3NvciBhdmFpbGFibGUiKTsKKwkJfQorCX0gZWxzZSB7CisJCWVycigiVW5rbm93biBicmlkZ2UiKTsKKwl9CisKKwlpZiAoIW92LT5kZWNvbXBfb3BzKQorCQlnb3RvIG5vc3lzOworCisJaWYgKCFvdi0+ZGVjb21wX29wcy0+b3duZXIpIHsKKwkJb3YtPmRlY29tcF9vcHMgPSBOVUxMOworCQlnb3RvIG5vc3lzOworCX0KKwkKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KG92LT5kZWNvbXBfb3BzLT5vd25lcikpCisJCWdvdG8gbm9zeXM7CisKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CisKKyBub3N5czoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKKy8qIFVubG9ja3MgZGVjb21wcmVzc2lvbiBtb2R1bGUgYW5kIG51bGxzIG92LT5kZWNvbXBfb3BzLiBTYWZlIHRvIGNhbGwgZXZlbgorICogaWYgb3YtPmRlY29tcF9vcHMgaXMgTlVMTC4KKyAqLworc3RhdGljIHZvaWQKK3JlbGVhc2VfZGVjb21wcmVzc29yKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWludCByZWxlYXNlZCA9IDA7CS8qIERpZCB3ZSBhY3R1YWxseSBkbyBhbnl0aGluZz8gKi8KKworCWlmICghb3YpCisJCXJldHVybjsKKworCWxvY2tfa2VybmVsKCk7CisKKwlpZiAob3YtPmRlY29tcF9vcHMpIHsKKwkJbW9kdWxlX3B1dChvdi0+ZGVjb21wX29wcy0+b3duZXIpOworCQlyZWxlYXNlZCA9IDE7CisJfQorCisJb3YtPmRlY29tcF9vcHMgPSBOVUxMOworCisJdW5sb2NrX2tlcm5lbCgpOworCisJaWYgKHJlbGVhc2VkKQorCQlQREVCVUcoMywgIkRlY29tcHJlc3NvciByZWxlYXNlZCIpOworfQorCitzdGF0aWMgdm9pZAorZGVjb21wcmVzcyhzdHJ1Y3QgdXNiX292NTExICpvdiwgc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSwKKwkgICB1bnNpZ25lZCBjaGFyICpwSW4wLCB1bnNpZ25lZCBjaGFyICpwT3V0MCkKK3sKKwlpZiAoIW92LT5kZWNvbXBfb3BzKQorCQlpZiAocmVxdWVzdF9kZWNvbXByZXNzb3Iob3YpKQorCQkJcmV0dXJuOworCisJUERFQlVHKDQsICJEZWNvbXByZXNzaW5nICVkIGJ5dGVzIiwgZnJhbWUtPmJ5dGVzX3JlY3ZkKTsKKworCWlmIChmcmFtZS0+Zm9ybWF0ID09IFZJREVPX1BBTEVUVEVfR1JFWQorCSAgICAmJiBvdi0+ZGVjb21wX29wcy0+ZGVjb21wXzQwMCkgeworCQlpbnQgcmV0ID0gb3YtPmRlY29tcF9vcHMtPmRlY29tcF80MDAoCisJCQlwSW4wLAorCQkJcE91dDAsCisJCQlmcmFtZS0+Y29tcGJ1ZiwKKwkJCWZyYW1lLT5yYXd3aWR0aCwKKwkJCWZyYW1lLT5yYXdoZWlnaHQsCisJCQlmcmFtZS0+Ynl0ZXNfcmVjdmQpOworCQlQREVCVUcoNCwgIkRFQlVHOiBkZWNvbXBfNDAwIHJldHVybmVkICVkIiwgcmV0KTsKKwl9IGVsc2UgaWYgKGZyYW1lLT5mb3JtYXQgIT0gVklERU9fUEFMRVRURV9HUkVZCisJCSAgICYmIG92LT5kZWNvbXBfb3BzLT5kZWNvbXBfNDIwKSB7CisJCWludCByZXQgPSBvdi0+ZGVjb21wX29wcy0+ZGVjb21wXzQyMCgKKwkJCXBJbjAsCisJCQlwT3V0MCwKKwkJCWZyYW1lLT5jb21wYnVmLAorCQkJZnJhbWUtPnJhd3dpZHRoLAorCQkJZnJhbWUtPnJhd2hlaWdodCwKKwkJCWZyYW1lLT5ieXRlc19yZWN2ZCk7CisJCVBERUJVRyg0LCAiREVCVUc6IGRlY29tcF80MjAgcmV0dXJuZWQgJWQiLCByZXQpOworCX0gZWxzZSB7CisJCWVycigiRGVjb21wcmVzc29yIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmb3JtYXQiKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRm9ybWF0IGNvbnZlcnNpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVzZXMgZXZlbiBhbmQgb2RkIGZpZWxkcyB0b2dldGhlciwgYW5kIGRvdWJsZXMgd2lkdGguCisgKiBJTlBVVDogYW4gb2RkIGZpZWxkIGZvbGxvd2VkIGJ5IGFuIGV2ZW4gZmllbGQgYXQgcEluMCwgaW4gWVVWIHBsYW5hciBmb3JtYXQKKyAqIE9VVFBVVDogYSBub3JtYWwgWVVWIHBsYW5hciBpbWFnZSwgd2l0aCBjb3JyZWN0IGFzcGVjdCByYXRpbworICovCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Uoc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSwgaW50IHJhd2Zvcm1hdCwKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBJbjAsIHVuc2lnbmVkIGNoYXIgKnBPdXQwKQoreworCWNvbnN0IGludCBmaWVsZGhlaWdodCA9IGZyYW1lLT5yYXdoZWlnaHQgLyAyOworCWNvbnN0IGludCBmaWVsZHBpeCA9IGZpZWxkaGVpZ2h0ICogZnJhbWUtPnJhd3dpZHRoOworCWNvbnN0IGludCB3ID0gZnJhbWUtPndpZHRoOworCWludCB4LCB5OworCXVuc2lnbmVkIGNoYXIgKnBJbkV2ZW4sICpwSW5PZGQsICpwT3V0OworCisJUERFQlVHKDUsICJmaWVsZGhlaWdodD0lZCIsIGZpZWxkaGVpZ2h0KTsKKworCWlmIChmcmFtZS0+cmF3aGVpZ2h0ICE9IGZyYW1lLT5oZWlnaHQpIHsKKwkJZXJyKCJpbnZhbGlkIGhlaWdodCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKChmcmFtZS0+cmF3d2lkdGggKiAyKSAhPSBmcmFtZS0+d2lkdGgpIHsKKwkJZXJyKCJpbnZhbGlkIHdpZHRoIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBZICovCisJcEluT2RkID0gcEluMDsKKwlwSW5FdmVuID0gcEluT2RkICsgZmllbGRwaXg7CisJcE91dCA9IHBPdXQwOworCWZvciAoeSA9IDA7IHkgPCBmaWVsZGhlaWdodDsgeSsrKSB7CisJCWZvciAoeCA9IDA7IHggPCBmcmFtZS0+cmF3d2lkdGg7IHgrKykgeworCQkJKnBPdXQgPSAqcEluRXZlbjsKKwkJCSoocE91dCsxKSA9ICpwSW5FdmVuKys7CisJCQkqKHBPdXQrdykgPSAqcEluT2RkOworCQkJKihwT3V0K3crMSkgPSAqcEluT2RkKys7CisJCQlwT3V0ICs9IDI7CisJCX0KKwkJcE91dCArPSB3OworCX0KKworCWlmIChyYXdmb3JtYXQgPT0gUkFXRk1UX1lVVjQyMCkgeworCS8qIFUgKi8KKwkJcEluT2RkID0gcEluMCArIGZpZWxkcGl4ICogMjsKKwkJcEluRXZlbiA9IHBJbk9kZCArIGZpZWxkcGl4IC8gNDsKKwkJZm9yICh5ID0gMDsgeSA8IGZpZWxkaGVpZ2h0IC8gMjsgeSsrKSB7CisJCQlmb3IgKHggPSAwOyB4IDwgZnJhbWUtPnJhd3dpZHRoIC8gMjsgeCsrKSB7CisJCQkJKnBPdXQgPSAqcEluRXZlbjsKKwkJCQkqKHBPdXQrMSkgPSAqcEluRXZlbisrOworCQkJCSoocE91dCt3LzIpID0gKnBJbk9kZDsKKwkJCQkqKHBPdXQrdy8yKzEpID0gKnBJbk9kZCsrOworCQkJCXBPdXQgKz0gMjsKKwkJCX0KKwkJCXBPdXQgKz0gdy8yOworCQl9CisJLyogViAqLworCQlwSW5PZGQgPSBwSW4wICsgZmllbGRwaXggKiAyICsgZmllbGRwaXggLyAyOworCQlwSW5FdmVuID0gcEluT2RkICsgZmllbGRwaXggLyA0OworCQlmb3IgKHkgPSAwOyB5IDwgZmllbGRoZWlnaHQgLyAyOyB5KyspIHsKKwkJCWZvciAoeCA9IDA7IHggPCBmcmFtZS0+cmF3d2lkdGggLyAyOyB4KyspIHsKKwkJCQkqcE91dCA9ICpwSW5FdmVuOworCQkJCSoocE91dCsxKSA9ICpwSW5FdmVuKys7CisJCQkJKihwT3V0K3cvMikgPSAqcEluT2RkOworCQkJCSoocE91dCt3LzIrMSkgPSAqcEluT2RkKys7CisJCQkJcE91dCArPSAyOworCQkJfQorCQkJcE91dCArPSB3LzI7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitvdjUxeF9wb3N0cHJvY2Vzc19ncmV5KHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lKQoreworCQkvKiBEZWludGVybGFjZSBmcmFtZSwgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChvdi0+c2Vuc29yID09IFNFTl9TQUE3MTExQSAmJiBmcmFtZS0+cmF3aGVpZ2h0ID49IDQ4MCkgeworCQkJaWYgKGZyYW1lLT5jb21wcmVzc2VkKQorCQkJCWRlY29tcHJlc3Mob3YsIGZyYW1lLCBmcmFtZS0+cmF3ZGF0YSwKKwkJCQkJCSBmcmFtZS0+dGVtcGRhdGEpOworCQkJZWxzZQorCQkJCXl1djQwMHJhd190b195dXY0MDBwKGZyYW1lLCBmcmFtZS0+cmF3ZGF0YSwKKwkJCQkJCSAgICAgZnJhbWUtPnRlbXBkYXRhKTsKKworCQkJZGVpbnRlcmxhY2UoZnJhbWUsIFJBV0ZNVF9ZVVY0MDAsIGZyYW1lLT50ZW1wZGF0YSwKKwkJCSAgICAgICAgICAgIGZyYW1lLT5kYXRhKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChmcmFtZS0+Y29tcHJlc3NlZCkKKwkJCQlkZWNvbXByZXNzKG92LCBmcmFtZSwgZnJhbWUtPnJhd2RhdGEsCisJCQkJCQkgZnJhbWUtPmRhdGEpOworCQkJZWxzZQorCQkJCXl1djQwMHJhd190b195dXY0MDBwKGZyYW1lLCBmcmFtZS0+cmF3ZGF0YSwKKwkJCQkJCSAgICAgZnJhbWUtPmRhdGEpOworCQl9Cit9CisKKy8qIFByb2Nlc3MgcmF3IFlVVjQyMCBkYXRhIGludG8gc3RhbmRhcmQgWVVWNDIwUCAqLworc3RhdGljIHZvaWQKK292NTF4X3Bvc3Rwcm9jZXNzX3l1djQyMChzdHJ1Y3QgdXNiX292NTExICpvdiwgc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSkKK3sKKwkvKiBEZWludGVybGFjZSBmcmFtZSwgaWYgbmVjZXNzYXJ5ICovCisJaWYgKG92LT5zZW5zb3IgPT0gU0VOX1NBQTcxMTFBICYmIGZyYW1lLT5yYXdoZWlnaHQgPj0gNDgwKSB7CisJCWlmIChmcmFtZS0+Y29tcHJlc3NlZCkKKwkJCWRlY29tcHJlc3Mob3YsIGZyYW1lLCBmcmFtZS0+cmF3ZGF0YSwgZnJhbWUtPnRlbXBkYXRhKTsKKwkJZWxzZQorCQkJeXV2NDIwcmF3X3RvX3l1djQyMHAoZnJhbWUsIGZyYW1lLT5yYXdkYXRhLAorCQkJCQkgICAgIGZyYW1lLT50ZW1wZGF0YSk7CisKKwkJZGVpbnRlcmxhY2UoZnJhbWUsIFJBV0ZNVF9ZVVY0MjAsIGZyYW1lLT50ZW1wZGF0YSwKKwkJICAgICAgICAgICAgZnJhbWUtPmRhdGEpOworCX0gZWxzZSB7CisJCWlmIChmcmFtZS0+Y29tcHJlc3NlZCkKKwkJCWRlY29tcHJlc3Mob3YsIGZyYW1lLCBmcmFtZS0+cmF3ZGF0YSwgZnJhbWUtPmRhdGEpOworCQllbHNlCisJCQl5dXY0MjByYXdfdG9feXV2NDIwcChmcmFtZSwgZnJhbWUtPnJhd2RhdGEsCisJCQkJCSAgICAgZnJhbWUtPmRhdGEpOworCX0KK30KKworLyogUG9zdC1wcm9jZXNzZXMgdGhlIHNwZWNpZmllZCBmcmFtZS4gVGhpcyBjb25zaXN0cyBvZjoKKyAqIAkxLiBEZWNvbXByZXNzIGZyYW1lLCBpZiBuZWNlc3NhcnkKKyAqCTIuIERlaW50ZXJsYWNlIGZyYW1lIGFuZCBzY2FsZSB0byBwcm9wZXIgc2l6ZSwgaWYgbmVjZXNzYXJ5CisgKiAJMy4gQ29udmVydCBmcm9tIFlVViBwbGFuYXIgdG8gZGVzdGluYXRpb24gZm9ybWF0LCBpZiBuZWNlc3NhcnkKKyAqIAk0LiBGaXggdGhlIFJHQiBvZmZzZXQsIGlmIG5lY2Vzc2FyeQorICovCitzdGF0aWMgdm9pZAorb3Y1MXhfcG9zdHByb2Nlc3Moc3RydWN0IHVzYl9vdjUxMSAqb3YsIHN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWUpCit7CisJaWYgKGR1bXBwaXgpIHsKKwkJbWVtc2V0KGZyYW1lLT5kYXRhLCAwLAorCQkJTUFYX0RBVEFfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpKTsKKwkJUERFQlVHKDQsICJEdW1waW5nICVkIGJ5dGVzIiwgZnJhbWUtPmJ5dGVzX3JlY3ZkKTsKKwkJbWVtY3B5KGZyYW1lLT5kYXRhLCBmcmFtZS0+cmF3ZGF0YSwgZnJhbWUtPmJ5dGVzX3JlY3ZkKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGZyYW1lLT5mb3JtYXQpIHsKKwkJY2FzZSBWSURFT19QQUxFVFRFX0dSRVk6CisJCQlvdjUxeF9wb3N0cHJvY2Vzc19ncmV5KG92LCBmcmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMDoKKwkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMFA6CisJCQlvdjUxeF9wb3N0cHJvY2Vzc195dXY0MjAob3YsIGZyYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyKCJDYW5ub3QgY29udmVydCBkYXRhIHRvICVzIiwKKwkJCSAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBmcmFtZS0+Zm9ybWF0KSk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogT1Y1MXggZGF0YSB0cmFuc2ZlciwgSVJRIGhhbmRsZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkCitvdjUxMV9tb3ZlX2RhdGEoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgbikKK3sKKwlpbnQgbnVtLCBvZmZzZXQ7CisJaW50IHBudW0gPSBpbltvdi0+cGFja2V0X3NpemUgLSAxXTsJCS8qIEdldCBwYWNrZXQgbnVtYmVyICovCisJaW50IG1heF9yYXcgPSBNQVhfUkFXX0RBVEFfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpOworCXN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWUgPSAmb3YtPmZyYW1lW292LT5jdXJmcmFtZV07CisJc3RydWN0IHRpbWV2YWwgKnRzOworCisJLyogU09GL0VPRiBwYWNrZXRzIGhhdmUgMXN0IHRvIDh0aCBieXRlcyB6ZXJvZWQgYW5kIHRoZSA5dGgKKwkgKiBieXRlIG5vbi16ZXJvLiBUaGUgRU9GIHBhY2tldCBoYXMgaW1hZ2Ugd2lkdGgvaGVpZ2h0IGluIHRoZQorCSAqIDEwdGggYW5kIDExdGggYnl0ZXMuIFRoZSA5dGggYnl0ZSBpcyBnaXZlbiBhcyBmb2xsb3dzOgorCSAqCisJICogYml0IDc6IEVPRgorCSAqICAgICA2OiBjb21wcmVzc2lvbiBlbmFibGVkCisJICogICAgIDU6IDQyMi80MjAvNDAwIG1vZGVzCisJICogICAgIDQ6IDQyMi80MjAvNDAwIG1vZGVzCisJICogICAgIDM6IDEKKwkgKiAgICAgMjogc25hcHNob3QgYnV0dG9uIG9uCisJICogICAgIDE6IHNuYXBzaG90IGZyYW1lCisJICogICAgIDA6IGV2ZW4vb2RkIGZpZWxkCisJICovCisKKwlpZiAocHJpbnRwaCkgeworCQlpbmZvKCJwaCglM2QpOiAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCIsCisJCSAgICAgcG51bSwgaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10sIGluWzRdLCBpbls1XSwgaW5bNl0sCisJCSAgICAgaW5bN10sIGluWzhdLCBpbls5XSwgaW5bMTBdLCBpblsxMV0pOworCX0KKworCS8qIENoZWNrIGZvciBTT0YvRU9GIHBhY2tldCAqLworCWlmICgoaW5bMF0gfCBpblsxXSB8IGluWzJdIHwgaW5bM10gfCBpbls0XSB8IGluWzVdIHwgaW5bNl0gfCBpbls3XSkgfHwKKwkgICAgKH5pbls4XSAmIDB4MDgpKQorCQlnb3RvIGNoZWNrX21pZGRsZTsKKworCS8qIEZyYW1lIGVuZCAqLworCWlmIChpbls4XSAmIDB4ODApIHsKKwkJdHMgPSAoc3RydWN0IHRpbWV2YWwgKikoZnJhbWUtPmRhdGEKKwkJICAgICAgKyBNQVhfRlJBTUVfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpKTsKKwkJZG9fZ2V0dGltZW9mZGF5KHRzKTsKKworCQkvKiBHZXQgdGhlIGFjdHVhbCBmcmFtZSBzaXplIGZyb20gdGhlIEVPRiBoZWFkZXIgKi8KKwkJZnJhbWUtPnJhd3dpZHRoID0gKChpbnQpKGluWzldKSArIDEpICogODsKKwkJZnJhbWUtPnJhd2hlaWdodCA9ICgoaW50KShpblsxMF0pICsgMSkgKiA4OworCisgCQlQREVCVUcoNCwgIkZyYW1lIGVuZCwgZnJhbWU9JWQsIHBudW09JWQsIHc9JWQsIGg9JWQsIHJlY3ZkPSVkIiwKKwkJCW92LT5jdXJmcmFtZSwgcG51bSwgZnJhbWUtPnJhd3dpZHRoLCBmcmFtZS0+cmF3aGVpZ2h0LAorCQkJZnJhbWUtPmJ5dGVzX3JlY3ZkKTsKKworCQkvKiBWYWxpZGF0ZSB0aGUgaGVhZGVyIGRhdGEgKi8KKwkJUkVTVFJJQ1RfVE9fUkFOR0UoZnJhbWUtPnJhd3dpZHRoLCBvdi0+bWlud2lkdGgsIG92LT5tYXh3aWR0aCk7CisJCVJFU1RSSUNUX1RPX1JBTkdFKGZyYW1lLT5yYXdoZWlnaHQsIG92LT5taW5oZWlnaHQsCisJCQkJICBvdi0+bWF4aGVpZ2h0KTsKKworCQkvKiBEb24ndCBhbGxvdyBieXRlIGNvdW50IHRvIGV4Y2VlZCBidWZmZXIgc2l6ZSAqLworCQlSRVNUUklDVF9UT19SQU5HRShmcmFtZS0+Ynl0ZXNfcmVjdmQsIDgsIG1heF9yYXcpOworCisJCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNUQVRFX0xJTkVTKSB7CisJICAgIAkJaW50IG5leHRmOworCisJCQlmcmFtZS0+Z3JhYnN0YXRlID0gRlJBTUVfRE9ORTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZnJhbWUtPndxKTsKKworCQkJLyogSWYgbmV4dCBmcmFtZSBpcyByZWFkeSBvciBncmFiYmluZywKKwkJCSAqIHBvaW50IHRvIGl0ICovCisJCQluZXh0ZiA9IChvdi0+Y3VyZnJhbWUgKyAxKSAlIE9WNTExX05VTUZSQU1FUzsKKwkJCWlmIChvdi0+ZnJhbWVbbmV4dGZdLmdyYWJzdGF0ZSA9PSBGUkFNRV9SRUFEWQorCQkJICAgIHx8IG92LT5mcmFtZVtuZXh0Zl0uZ3JhYnN0YXRlID09IEZSQU1FX0dSQUJCSU5HKSB7CisJCQkJb3YtPmN1cmZyYW1lID0gbmV4dGY7CisJCQkJb3YtPmZyYW1lW25leHRmXS5zY2Fuc3RhdGUgPSBTVEFURV9TQ0FOTklORzsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZyYW1lLT5ncmFic3RhdGUgPT0gRlJBTUVfRE9ORSkgeworCQkJCQlQREVCVUcoNCwgIioqIEZyYW1lIGRvbmUgKioiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlQREVCVUcoNCwgIkZyYW1lIG5vdCByZWFkeT8gc3RhdGUgPSAlZCIsCisJCQkJCQlvdi0+ZnJhbWVbbmV4dGZdLmdyYWJzdGF0ZSk7CisJCQkJfQorCisJCQkJb3YtPmN1cmZyYW1lID0gLTE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQREVCVUcoNSwgIkZyYW1lIGRvbmUsIGJ1dCBub3Qgc2Nhbm5pbmciKTsKKwkJfQorCQkvKiBJbWFnZSBjb3JydXB0aW9uIGNhdXNlZCBieSBtaXNwbGFjZWQgZnJhbWUtPnNlZ21lbnQgPSAwCisJCSAqIGZpeGVkIGJ5IGNhcmxvc2ZAY29uZWN0aXZhLmNvbS5icgorCQkgKi8KKwl9IGVsc2UgeworCQkvKiBGcmFtZSBzdGFydCAqLworCQlQREVCVUcoNCwgIkZyYW1lIHN0YXJ0LCBmcmFtZW51bSA9ICVkIiwgb3YtPmN1cmZyYW1lKTsKKworCQkvKiBDaGVjayB0byBzZWUgaWYgaXQncyBhIHNuYXBzaG90IGZyYW1lICovCisJCS8qIEZJWE1FPz8gU2hvdWxkIHRoZSBzbmFwc2hvdCByZXNldCBnbyBoZXJlPyBQZXJmb3JtYW5jZT8gKi8KKwkJaWYgKGluWzhdICYgMHgwMikgeworCQkJZnJhbWUtPnNuYXBzaG90ID0gMTsKKwkJCVBERUJVRygzLCAic25hcHNob3QgZGV0ZWN0ZWQiKTsKKwkJfQorCisJCWZyYW1lLT5zY2Fuc3RhdGUgPSBTVEFURV9MSU5FUzsKKwkJZnJhbWUtPmJ5dGVzX3JlY3ZkID0gMDsKKwkJZnJhbWUtPmNvbXByZXNzZWQgPSBpbls4XSAmIDB4NDA7CisJfQorCitjaGVja19taWRkbGU6CisJLyogQXJlIHdlIGluIGEgZnJhbWU/ICovCisJaWYgKGZyYW1lLT5zY2Fuc3RhdGUgIT0gU1RBVEVfTElORVMpIHsKKwkJUERFQlVHKDUsICJOb3QgaW4gYSBmcmFtZTsgcGFja2V0IHNraXBwZWQiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIGZyYW1lIHN0YXJ0LCBza2lwIGhlYWRlciAqLworCWlmIChmcmFtZS0+Ynl0ZXNfcmVjdmQgPT0gMCkKKwkJb2Zmc2V0ID0gOTsKKwllbHNlCisJCW9mZnNldCA9IDA7CisKKwludW0gPSBuIC0gb2Zmc2V0IC0gMTsKKworCS8qIER1bXAgYWxsIGRhdGEgZXhhY3RseSBhcyByZWNlaXZlZCAqLworCWlmIChkdW1wcGl4ID09IDIpIHsKKwkJZnJhbWUtPmJ5dGVzX3JlY3ZkICs9IG4gLSAxOworCQlpZiAoZnJhbWUtPmJ5dGVzX3JlY3ZkIDw9IG1heF9yYXcpCisJCQltZW1jcHkoZnJhbWUtPnJhd2RhdGEgKyBmcmFtZS0+Ynl0ZXNfcmVjdmQgLSAobiAtIDEpLAorCQkJCWluLCBuIC0gMSk7CisJCWVsc2UKKwkJCVBERUJVRygzLCAiUmF3IGRhdGEgYnVmZmVyIG92ZXJydW4hISAoJWQpIiwKKwkJCQlmcmFtZS0+Ynl0ZXNfcmVjdmQgLSBtYXhfcmF3KTsKKwl9IGVsc2UgaWYgKCFmcmFtZS0+Y29tcHJlc3NlZCAmJiAhcmVtb3ZlX3plcm9zKSB7CisJCWZyYW1lLT5ieXRlc19yZWN2ZCArPSBudW07CisJCWlmIChmcmFtZS0+Ynl0ZXNfcmVjdmQgPD0gbWF4X3JhdykKKwkJCW1lbWNweShmcmFtZS0+cmF3ZGF0YSArIGZyYW1lLT5ieXRlc19yZWN2ZCAtIG51bSwKKwkJCQlpbiArIG9mZnNldCwgbnVtKTsKKwkJZWxzZQorCQkJUERFQlVHKDMsICJSYXcgZGF0YSBidWZmZXIgb3ZlcnJ1biEhICglZCkiLAorCQkJCWZyYW1lLT5ieXRlc19yZWN2ZCAtIG1heF9yYXcpOworCX0gZWxzZSB7IC8qIFJlbW92ZSBhbGwtemVybyBGSUZPIGxpbmVzIChhbGlnbmVkIDMyLWJ5dGUgYmxvY2tzKSAqLworCQlpbnQgYiwgcmVhZCA9IDAsIGFsbHplcm8sIGNvcGllZCA9IDA7CisJCWlmIChvZmZzZXQpIHsKKwkJCWZyYW1lLT5ieXRlc19yZWN2ZCArPSAzMiAtIG9mZnNldDsJLy8gQnl0ZXMgb3V0CisJCQltZW1jcHkoZnJhbWUtPnJhd2RhdGEsCWluICsgb2Zmc2V0LCAzMiAtIG9mZnNldCk7CisJCQlyZWFkICs9IDMyOworCQl9CisKKwkJd2hpbGUgKHJlYWQgPCBuIC0gMSkgeworCQkJYWxsemVybyA9IDE7CisJCQlmb3IgKGIgPSAwOyBiIDwgMzI7IGIrKykgeworCQkJCWlmIChpbltyZWFkICsgYl0pIHsKKwkJCQkJYWxsemVybyA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGFsbHplcm8pIHsKKwkJCQkvKiBEb24ndCBjb3B5IGl0ICovCisJCQl9IGVsc2UgeworCQkJCWlmIChmcmFtZS0+Ynl0ZXNfcmVjdmQgKyBjb3BpZWQgKyAzMiA8PSBtYXhfcmF3KQorCQkJCXsKKwkJCQkJbWVtY3B5KGZyYW1lLT5yYXdkYXRhCisJCQkJCQkrIGZyYW1lLT5ieXRlc19yZWN2ZCArIGNvcGllZCwKKwkJCQkJCWluICsgcmVhZCwgMzIpOworCQkJCQljb3BpZWQgKz0gMzI7CisJCQkJfSBlbHNlIHsKKwkJCQkJUERFQlVHKDMsICJSYXcgZGF0YSBidWZmZXIgb3ZlcnJ1biEhIik7CisJCQkJfQorCQkJfQorCQkJcmVhZCArPSAzMjsKKwkJfQorCisJCWZyYW1lLT5ieXRlc19yZWN2ZCArPSBjb3BpZWQ7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK292NTE4X21vdmVfZGF0YShzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciAqaW4sIGludCBuKQoreworCWludCBtYXhfcmF3ID0gTUFYX1JBV19EQVRBX1NJWkUob3YtPm1heHdpZHRoLCBvdi0+bWF4aGVpZ2h0KTsKKwlzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lID0gJm92LT5mcmFtZVtvdi0+Y3VyZnJhbWVdOworCXN0cnVjdCB0aW1ldmFsICp0czsKKworCS8qIERvbid0IGNvcHkgdGhlIHBhY2tldCBudW1iZXIgYnl0ZSAqLworCWlmIChvdi0+cGFja2V0X251bWJlcmluZykKKwkJLS1uOworCisJLyogQSBmYWxzZSBwb3NpdGl2ZSBoZXJlIGlzIGxpa2VseSwgdW50aWwgT1ZUIGdpdmVzIG1lCisJICogdGhlIGRlZmluaXRpdmUgU09GL0VPRiBmb3JtYXQgKi8KKwlpZiAoKCEoaW5bMF0gfCBpblsxXSB8IGluWzJdIHwgaW5bM10gfCBpbls1XSkpICYmIGluWzZdKSB7CisJCWlmIChwcmludHBoKSB7CisJCQlpbmZvKCJwaDogJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCIsIGluWzBdLAorCQkJICAgICBpblsxXSwgaW5bMl0sIGluWzNdLCBpbls0XSwgaW5bNV0sIGluWzZdLCBpbls3XSk7CisJCX0KKworCQlpZiAoZnJhbWUtPnNjYW5zdGF0ZSA9PSBTVEFURV9MSU5FUykgeworCQkJUERFQlVHKDQsICJEZXRlY3RlZCBmcmFtZSBlbmQvc3RhcnQiKTsKKwkJCWdvdG8gZW9mOworCQl9IGVsc2UgeyAvL3NjYW5zdGF0ZSA9PSBTVEFURV9TQ0FOTklORworCQkJLyogRnJhbWUgc3RhcnQgKi8KKwkJCVBERUJVRyg0LCAiRnJhbWUgc3RhcnQsIGZyYW1lbnVtID0gJWQiLCBvdi0+Y3VyZnJhbWUpOworCQkJZ290byBzb2Y7CisJCX0KKwl9IGVsc2UgeworCQlnb3RvIGNoZWNrX21pZGRsZTsKKwl9CisKK2VvZjoKKwl0cyA9IChzdHJ1Y3QgdGltZXZhbCAqKShmcmFtZS0+ZGF0YQorCSAgICAgICsgTUFYX0ZSQU1FX1NJWkUob3YtPm1heHdpZHRoLCBvdi0+bWF4aGVpZ2h0KSk7CisJZG9fZ2V0dGltZW9mZGF5KHRzKTsKKworCVBERUJVRyg0LCAiRnJhbWUgZW5kLCBjdXJmcmFtZSA9ICVkLCBodz0lZCwgdnc9JWQsIHJlY3ZkPSVkIiwKKwkJb3YtPmN1cmZyYW1lLAorCQkoaW50KShpbls5XSksIChpbnQpKGluWzEwXSksIGZyYW1lLT5ieXRlc19yZWN2ZCk7CisKKwkvLyBGSVhNRTogU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgaGVhZGVyIGZvcm1hdHMgeWV0LAorCS8vIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoYXQgdGhlIGFjdHVhbCBpbWFnZSBzaXplIGlzCisJZnJhbWUtPnJhd3dpZHRoID0gZnJhbWUtPndpZHRoOworCWZyYW1lLT5yYXdoZWlnaHQgPSBmcmFtZS0+aGVpZ2h0OworCisJLyogVmFsaWRhdGUgdGhlIGhlYWRlciBkYXRhICovCisJUkVTVFJJQ1RfVE9fUkFOR0UoZnJhbWUtPnJhd3dpZHRoLCBvdi0+bWlud2lkdGgsIG92LT5tYXh3aWR0aCk7CisJUkVTVFJJQ1RfVE9fUkFOR0UoZnJhbWUtPnJhd2hlaWdodCwgb3YtPm1pbmhlaWdodCwgb3YtPm1heGhlaWdodCk7CisKKwkvKiBEb24ndCBhbGxvdyBieXRlIGNvdW50IHRvIGV4Y2VlZCBidWZmZXIgc2l6ZSAqLworCVJFU1RSSUNUX1RPX1JBTkdFKGZyYW1lLT5ieXRlc19yZWN2ZCwgOCwgbWF4X3Jhdyk7CisKKwlpZiAoZnJhbWUtPnNjYW5zdGF0ZSA9PSBTVEFURV9MSU5FUykgeworICAgIAkJaW50IG5leHRmOworCisJCWZyYW1lLT5ncmFic3RhdGUgPSBGUkFNRV9ET05FOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZyYW1lLT53cSk7CisKKwkJLyogSWYgbmV4dCBmcmFtZSBpcyByZWFkeSBvciBncmFiYmluZywKKwkJICogcG9pbnQgdG8gaXQgKi8KKwkJbmV4dGYgPSAob3YtPmN1cmZyYW1lICsgMSkgJSBPVjUxMV9OVU1GUkFNRVM7CisJCWlmIChvdi0+ZnJhbWVbbmV4dGZdLmdyYWJzdGF0ZSA9PSBGUkFNRV9SRUFEWQorCQkgICAgfHwgb3YtPmZyYW1lW25leHRmXS5ncmFic3RhdGUgPT0gRlJBTUVfR1JBQkJJTkcpIHsKKwkJCW92LT5jdXJmcmFtZSA9IG5leHRmOworCQkJb3YtPmZyYW1lW25leHRmXS5zY2Fuc3RhdGUgPSBTVEFURV9TQ0FOTklORzsKKwkJCWZyYW1lID0gJm92LT5mcmFtZVtuZXh0Zl07CisJCX0gZWxzZSB7CisJCQlpZiAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9ET05FKSB7CisJCQkJUERFQlVHKDQsICIqKiBGcmFtZSBkb25lICoqIik7CisJCQl9IGVsc2UgeworCQkJCVBERUJVRyg0LCAiRnJhbWUgbm90IHJlYWR5PyBzdGF0ZSA9ICVkIiwKKwkJCQkgICAgICAgb3YtPmZyYW1lW25leHRmXS5ncmFic3RhdGUpOworCQkJfQorCisJCQlvdi0+Y3VyZnJhbWUgPSAtMTsKKwkJCVBERUJVRyg0LCAiU09GIGRyb3BwZWQgKG5vIGFjdGl2ZSBmcmFtZSkiKTsKKwkJCXJldHVybjsgIC8qIE5vd2hlcmUgdG8gc3RvcmUgdGhpcyBmcmFtZSAqLworCQl9CisJfQorc29mOgorCVBERUJVRyg0LCAiU3RhcnRpbmcgY2FwdHVyZSBvbiBmcmFtZSAlZCIsIGZyYW1lLT5mcmFtZW51bSk7CisKKy8vIFNuYXBzaG90IG5vdCByZXZlcnNlLWVuZ2luZWVyZWQgeWV0LgorI2lmIDAKKwkvKiBDaGVjayB0byBzZWUgaWYgaXQncyBhIHNuYXBzaG90IGZyYW1lICovCisJLyogRklYTUU/PyBTaG91bGQgdGhlIHNuYXBzaG90IHJlc2V0IGdvIGhlcmU/IFBlcmZvcm1hbmNlPyAqLworCWlmIChpbls4XSAmIDB4MDIpIHsKKwkJZnJhbWUtPnNuYXBzaG90ID0gMTsKKwkJUERFQlVHKDMsICJzbmFwc2hvdCBkZXRlY3RlZCIpOworCX0KKyNlbmRpZgorCWZyYW1lLT5zY2Fuc3RhdGUgPSBTVEFURV9MSU5FUzsKKwlmcmFtZS0+Ynl0ZXNfcmVjdmQgPSAwOworCWZyYW1lLT5jb21wcmVzc2VkID0gMTsKKworY2hlY2tfbWlkZGxlOgorCS8qIEFyZSB3ZSBpbiBhIGZyYW1lPyAqLworCWlmIChmcmFtZS0+c2NhbnN0YXRlICE9IFNUQVRFX0xJTkVTKSB7CisJCVBERUJVRyg0LCAic2NhbnN0YXRlOiBubyBTT0YgeWV0Iik7CisJCXJldHVybjsKKwl9CisKKwkvKiBEdW1wIGFsbCBkYXRhIGV4YWN0bHkgYXMgcmVjZWl2ZWQgKi8KKwlpZiAoZHVtcHBpeCA9PSAyKSB7CisJCWZyYW1lLT5ieXRlc19yZWN2ZCArPSBuOworCQlpZiAoZnJhbWUtPmJ5dGVzX3JlY3ZkIDw9IG1heF9yYXcpCisJCQltZW1jcHkoZnJhbWUtPnJhd2RhdGEgKyBmcmFtZS0+Ynl0ZXNfcmVjdmQgLSBuLCBpbiwgbik7CisJCWVsc2UKKwkJCVBERUJVRygzLCAiUmF3IGRhdGEgYnVmZmVyIG92ZXJydW4hISAoJWQpIiwKKwkJCQlmcmFtZS0+Ynl0ZXNfcmVjdmQgLSBtYXhfcmF3KTsKKwl9IGVsc2UgeworCQkvKiBBbGwgaW5jb21pbmcgZGF0YSBhcmUgZGl2aWRlZCBpbnRvIDgtYnl0ZSBzZWdtZW50cy4gSWYgdGhlCisJCSAqIHNlZ21lbnQgY29udGFpbnMgYWxsIHplcm8gYnl0ZXMsIGl0IG11c3QgYmUgc2tpcHBlZC4gVGhlc2UKKwkJICogemVyby1zZWdtZW50cyBhbGxvdyB0aGUgT1Y1MTggdG8gbWFpbmFpbiBhIGNvbnN0YW50IGRhdGEgcmF0ZQorCQkgKiByZWdhcmRsZXNzIG9mIHRoZSBlZmZlY3RpdmVuZXNzIG9mIHRoZSBjb21wcmVzc2lvbi4gU2VnbWVudHMKKwkJICogYXJlIGFsaWduZWQgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGlzb2Nocm9ub3VzCisJCSAqIHBhY2tldC4gVGhlIGZpcnN0IHNlZ21lbnQgaW4gZWFjaCBpbWFnZSBpcyBhIGhlYWRlciAodGhlCisJCSAqIGRlY29tcHJlc3NvciBza2lwcyBpdCBsYXRlcikuCisJCSAqLworCisJCWludCBiLCByZWFkID0gMCwgYWxsemVybywgY29waWVkID0gMDsKKworCQl3aGlsZSAocmVhZCA8IG4pIHsKKwkJCWFsbHplcm8gPSAxOworCQkJZm9yIChiID0gMDsgYiA8IDg7IGIrKykgeworCQkJCWlmIChpbltyZWFkICsgYl0pIHsKKwkJCQkJYWxsemVybyA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGFsbHplcm8pIHsKKwkJCS8qIERvbid0IGNvcHkgaXQgKi8KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZyYW1lLT5ieXRlc19yZWN2ZCArIGNvcGllZCArIDggPD0gbWF4X3JhdykKKwkJCQl7CisJCQkJCW1lbWNweShmcmFtZS0+cmF3ZGF0YQorCQkJCQkJKyBmcmFtZS0+Ynl0ZXNfcmVjdmQgKyBjb3BpZWQsCisJCQkJCQlpbiArIHJlYWQsIDgpOworCQkJCQljb3BpZWQgKz0gODsKKwkJCQl9IGVsc2UgeworCQkJCQlQREVCVUcoMywgIlJhdyBkYXRhIGJ1ZmZlciBvdmVycnVuISEiKTsKKwkJCQl9CisJCQl9CisJCQlyZWFkICs9IDg7CisJCX0KKwkJZnJhbWUtPmJ5dGVzX3JlY3ZkICs9IGNvcGllZDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitvdjUxeF9pc29jX2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpOworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92OworCXN0cnVjdCBvdjUxMV9zYnVmICpzYnVmOworCisJaWYgKCF1cmItPmNvbnRleHQpIHsKKwkJUERFQlVHKDQsICJubyBjb250ZXh0Iik7CisJCXJldHVybjsKKwl9CisKKwlzYnVmID0gdXJiLT5jb250ZXh0OworCW92ID0gc2J1Zi0+b3Y7CisKKwlpZiAoIW92IHx8ICFvdi0+ZGV2IHx8ICFvdi0+dXNlcikgeworCQlQREVCVUcoNCwgIm5vIGRldmljZSwgb3Igbm90IG9wZW4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghb3YtPnN0cmVhbWluZykgeworCQlQREVCVUcoNCwgImhtbW0uLi4gbm90IHN0cmVhbWluZywgYnV0IGdvdCBpbnRlcnJ1cHQiKTsKKwkJcmV0dXJuOworCX0KKworICAgICAgICBpZiAodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkgeworICAgICAgICAgICAgICAgIFBERUJVRyg0LCAiVVJCIHVubGlua2VkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwlpZiAodXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTICYmIHVyYi0+c3RhdHVzICE9IDApIHsKKwkJZXJyKCJFUlJPUjogdXJiLT5zdGF0dXM9JWQ6ICVzIiwgdXJiLT5zdGF0dXMsCisJCSAgICBzeW1ib2xpYyh1cmJfZXJybGlzdCwgdXJiLT5zdGF0dXMpKTsKKwl9CisKKwkvKiBDb3B5IHRoZSBkYXRhIHJlY2VpdmVkIGludG8gb3VyIGZyYW1lIGJ1ZmZlciAqLworCVBERUJVRyg1LCAic2J1ZlslZF06IE1vdmluZyAlZCBwYWNrZXRzIiwgc2J1Zi0+biwKKwkgICAgICAgdXJiLT5udW1iZXJfb2ZfcGFja2V0cyk7CisJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQkvKiBXYXJuaW5nOiBEb24ndCBjYWxsICpfbW92ZV9kYXRhKCkgaWYgbm8gZnJhbWUgYWN0aXZlISAqLworCQlpZiAob3YtPmN1cmZyYW1lID49IDApIHsKKwkJCWludCBuID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOworCQkJaW50IHN0ID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CisJCQl1bnNpZ25lZCBjaGFyICpjZGF0YTsKKworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzID0gMDsKKworCQkJY2RhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcgorCQkJCSsgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQ7CisKKwkJCWlmICghbikgeworCQkJCVBERUJVRyg0LCAiWmVyby1sZW5ndGggcGFja2V0Iik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChzdCkKKwkJCQlQREVCVUcoMiwgImRhdGEgZXJyb3I6IFslZF0gbGVuPSVkLCBzdGF0dXM9JWQiLAorCQkJCSAgICAgICBpLCBuLCBzdCk7CisKKwkJCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxMSkKKwkJCQlvdjUxMV9tb3ZlX2RhdGEob3YsIGNkYXRhLCBuKTsKKwkJCWVsc2UgaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQorCQkJCW92NTE4X21vdmVfZGF0YShvdiwgY2RhdGEsIG4pOworCQkJZWxzZQorCQkJCWVycigiVW5rbm93biBicmlkZ2UgZGV2aWNlICglZCkiLCBvdi0+YnJpZGdlKTsKKworCQl9IGVsc2UgaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJm92LT53cSkpIHsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmb3YtPndxKTsKKwkJfQorCX0KKworCS8qIFJlc3VibWl0IHRoaXMgVVJCICovCisJdXJiLT5kZXYgPSBvdi0+ZGV2OworCWlmICgoaSA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApCisJCWVycigidXNiX3N1Ym1pdF91cmIoKSByZXQgJWQiLCBpKTsKKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdHJlYW0gaW5pdGlhbGl6YXRpb24gYW5kIHRlcm1pbmF0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorb3Y1MXhfaW5pdF9pc29jKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCXN0cnVjdCB1cmIgKnVyYjsKKwlpbnQgZngsIGVyciwgbiwgc2l6ZTsKKworCVBERUJVRygzLCAiKioqIEluaXRpYWxpemluZyBjYXB0dXJlICoqKiIpOworCisJb3YtPmN1cmZyYW1lID0gLTE7CisKKwlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTEpIHsKKwkJaWYgKGNhbXMgPT0gMSkKKwkJCXNpemUgPSA5OTM7CisJCWVsc2UgaWYgKGNhbXMgPT0gMikKKwkJCXNpemUgPSA1MTM7CisJCWVsc2UgaWYgKGNhbXMgPT0gMyB8fCBjYW1zID09IDQpCisJCQlzaXplID0gMjU3OworCQllbHNlIHsKKwkJCWVycigiXCJjYW1zXCIgcGFyYW1ldGVyIHRvbyBoaWdoISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIGlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxMVBMVVMpIHsKKwkJaWYgKGNhbXMgPT0gMSkKKwkJCXNpemUgPSA5NjE7CisJCWVsc2UgaWYgKGNhbXMgPT0gMikKKwkJCXNpemUgPSA1MTM7CisJCWVsc2UgaWYgKGNhbXMgPT0gMyB8fCBjYW1zID09IDQpCisJCQlzaXplID0gMjU3OworCQllbHNlIGlmIChjYW1zID49IDUgJiYgY2FtcyA8PSA4KQorCQkJc2l6ZSA9IDEyOTsKKwkJZWxzZSBpZiAoY2FtcyA+PSA5ICYmIGNhbXMgPD0gMzEpCisJCQlzaXplID0gMzM7CisJCWVsc2UgeworCQkJZXJyKCJcImNhbXNcIiBwYXJhbWV0ZXIgdG9vIGhpZ2ghIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7CisJCWlmIChjYW1zID09IDEpCisJCQlzaXplID0gODk2OworCQllbHNlIGlmIChjYW1zID09IDIpCisJCQlzaXplID0gNTEyOworCQllbHNlIGlmIChjYW1zID09IDMgfHwgY2FtcyA9PSA0KQorCQkJc2l6ZSA9IDI1NjsKKwkJZWxzZSBpZiAoY2FtcyA+PSA1ICYmIGNhbXMgPD0gOCkKKwkJCXNpemUgPSAxMjg7CisJCWVsc2UgeworCQkJZXJyKCJcImNhbXNcIiBwYXJhbWV0ZXIgdG9vIGhpZ2ghIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQllcnIoImludmFsaWQgYnJpZGdlIHR5cGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8vIEZJWE1FOiBPVjUxOCBpcyBoYXJkY29kZWQgdG8gMTUgRlBTIChhbHRlcm5hdGUgNSkgZm9yIG5vdworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgeworCQlpZiAocGFja2V0c2l6ZSA9PSAtMSkgeworCQkJb3Y1MThfc2V0X3BhY2tldF9zaXplKG92LCA2NDApOworCQl9IGVsc2UgeworCQkJaW5mbygiRm9yY2luZyBwYWNrZXQgc2l6ZSB0byAlZCIsIHBhY2tldHNpemUpOworCQkJb3Y1MThfc2V0X3BhY2tldF9zaXplKG92LCBwYWNrZXRzaXplKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwYWNrZXRzaXplID09IC0xKSB7CisJCQlvdjUxMV9zZXRfcGFja2V0X3NpemUob3YsIHNpemUpOworCQl9IGVsc2UgeworCQkJaW5mbygiRm9yY2luZyBwYWNrZXQgc2l6ZSB0byAlZCIsIHBhY2tldHNpemUpOworCQkJb3Y1MTFfc2V0X3BhY2tldF9zaXplKG92LCBwYWNrZXRzaXplKTsKKwkJfQorCX0KKworCWZvciAobiA9IDA7IG4gPCBPVjUxMV9OVU1TQlVGOyBuKyspIHsKKwkJdXJiID0gdXNiX2FsbG9jX3VyYihGUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYikgeworCQkJZXJyKCJpbml0IGlzb2M6IHVzYl9hbGxvY191cmIgcmV0LiBOVUxMIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlvdi0+c2J1ZltuXS51cmIgPSB1cmI7CisJCXVyYi0+ZGV2ID0gb3YtPmRldjsKKwkJdXJiLT5jb250ZXh0ID0gJm92LT5zYnVmW25dOworCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUob3YtPmRldiwgT1Y1MTFfRU5EUE9JTlRfQUREUkVTUyk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gb3YtPnNidWZbbl0uZGF0YTsKKwkJdXJiLT5jb21wbGV0ZSA9IG92NTF4X2lzb2NfaXJxOworCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gRlJBTUVTX1BFUl9ERVNDOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBvdi0+cGFja2V0X3NpemUgKiBGUkFNRVNfUEVSX0RFU0M7CisJCXVyYi0+aW50ZXJ2YWwgPSAxOworCQlmb3IgKGZ4ID0gMDsgZnggPCBGUkFNRVNfUEVSX0RFU0M7IGZ4KyspIHsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbZnhdLm9mZnNldCA9IG92LT5wYWNrZXRfc2l6ZSAqIGZ4OworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tmeF0ubGVuZ3RoID0gb3YtPnBhY2tldF9zaXplOworCQl9CisJfQorCisJb3YtPnN0cmVhbWluZyA9IDE7CisKKwlmb3IgKG4gPSAwOyBuIDwgT1Y1MTFfTlVNU0JVRjsgbisrKSB7CisJCW92LT5zYnVmW25dLnVyYi0+ZGV2ID0gb3YtPmRldjsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIob3YtPnNidWZbbl0udXJiLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycikgeworCQkJZXJyKCJpbml0IGlzb2M6IHVzYl9zdWJtaXRfdXJiKCVkKSByZXQgJWQiLCBuLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorb3Y1MXhfdW5saW5rX2lzb2Moc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW50IG47CisKKwkvKiBVbnNjaGVkdWxlIGFsbCBvZiB0aGUgaXNvIHRkJ3MgKi8KKwlmb3IgKG4gPSBPVjUxMV9OVU1TQlVGIC0gMTsgbiA+PSAwOyBuLS0pIHsKKwkJaWYgKG92LT5zYnVmW25dLnVyYikgeworCQkJdXNiX2tpbGxfdXJiKG92LT5zYnVmW25dLnVyYik7CisJCQl1c2JfZnJlZV91cmIob3YtPnNidWZbbl0udXJiKTsKKwkJCW92LT5zYnVmW25dLnVyYiA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitvdjUxeF9zdG9wX2lzb2Moc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaWYgKCFvdi0+c3RyZWFtaW5nIHx8ICFvdi0+ZGV2KQorCQlyZXR1cm47CisKKwlQREVCVUcoMywgIioqKiBTdG9wcGluZyBjYXB0dXJlICoqKiIpOworCisJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQorCQlvdjUxOF9zZXRfcGFja2V0X3NpemUob3YsIDApOworCWVsc2UKKwkJb3Y1MTFfc2V0X3BhY2tldF9zaXplKG92LCAwKTsKKworCW92LT5zdHJlYW1pbmcgPSAwOworCisJb3Y1MXhfdW5saW5rX2lzb2Mob3YpOworfQorCitzdGF0aWMgaW50CitvdjUxeF9uZXdfZnJhbWUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBmcmFtZW51bSkKK3sKKwlzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lOworCWludCBuZXdudW07CisKKwlQREVCVUcoNCwgIm92LT5jdXJmcmFtZSA9ICVkLCBmcmFtZW51bSA9ICVkIiwgb3YtPmN1cmZyYW1lLCBmcmFtZW51bSk7CisKKwlpZiAoIW92LT5kZXYpCisJCXJldHVybiAtMTsKKworCS8qIElmIHdlJ3JlIG5vdCBncmFiYmluZyBhIGZyYW1lIHJpZ2h0IG5vdyBhbmQgdGhlIG90aGVyIGZyYW1lIGlzICovCisJLyogcmVhZHkgdG8gYmUgZ3JhYmJlZCBpbnRvLCB0aGVuIHVzZSBpdCBpbnN0ZWFkICovCisJaWYgKG92LT5jdXJmcmFtZSA9PSAtMSkgeworCQluZXdudW0gPSAoZnJhbWVudW0gLSAxICsgT1Y1MTFfTlVNRlJBTUVTKSAlIE9WNTExX05VTUZSQU1FUzsKKwkJaWYgKG92LT5mcmFtZVtuZXdudW1dLmdyYWJzdGF0ZSA9PSBGUkFNRV9SRUFEWSkKKwkJCWZyYW1lbnVtID0gbmV3bnVtOworCX0gZWxzZQorCQlyZXR1cm4gMDsKKworCWZyYW1lID0gJm92LT5mcmFtZVtmcmFtZW51bV07CisKKwlQREVCVUcoNCwgImZyYW1lbnVtID0gJWQsIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkIiwgZnJhbWVudW0sCisJICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCk7CisKKwlmcmFtZS0+Z3JhYnN0YXRlID0gRlJBTUVfR1JBQkJJTkc7CisJZnJhbWUtPnNjYW5zdGF0ZSA9IFNUQVRFX1NDQU5OSU5HOworCWZyYW1lLT5zbmFwc2hvdCA9IDA7CisKKwlvdi0+Y3VyZnJhbWUgPSBmcmFtZW51bTsKKworCS8qIE1ha2Ugc3VyZSBpdCdzIG5vdCB0b28gYmlnICovCisJaWYgKGZyYW1lLT53aWR0aCA+IG92LT5tYXh3aWR0aCkKKwkJZnJhbWUtPndpZHRoID0gb3YtPm1heHdpZHRoOworCisJZnJhbWUtPndpZHRoICY9IH43TDsJCS8qIE11bHRpcGxlIG9mIDggKi8KKworCWlmIChmcmFtZS0+aGVpZ2h0ID4gb3YtPm1heGhlaWdodCkKKwkJZnJhbWUtPmhlaWdodCA9IG92LT5tYXhoZWlnaHQ7CisKKwlmcmFtZS0+aGVpZ2h0ICY9IH4zTDsJCS8qIE11bHRpcGxlIG9mIDQgKi8KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEJ1ZmZlciBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIC0gWW91IG11c3QgYWNxdWlyZSBidWZfbG9jayBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbi4KKyAqIC0gQmVjYXVzZSB0aGlzIGNvZGUgd2lsbCBmcmVlIGFueSBub24tbnVsbCBwb2ludGVyLCB5b3UgbXVzdCBiZSBzdXJlIHRvIG51bGwKKyAqICAgdGhlbSBpZiB5b3UgZXhwbGljaXRseSBmcmVlIHRoZW0gc29tZXdoZXJlIGVsc2UhCisgKi8KK3N0YXRpYyB2b2lkCitvdjUxeF9kb19kZWFsbG9jKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWludCBpOworCVBERUJVRyg0LCAiZW50ZXJlZCIpOworCisJaWYgKG92LT5mYnVmKSB7CisJCXJ2ZnJlZShvdi0+ZmJ1ZiwgT1Y1MTFfTlVNRlJBTUVTCisJCSAgICAgICAqIE1BWF9EQVRBX1NJWkUob3YtPm1heHdpZHRoLCBvdi0+bWF4aGVpZ2h0KSk7CisJCW92LT5mYnVmID0gTlVMTDsKKwl9CisKKwl2ZnJlZShvdi0+cmF3ZmJ1Zik7CisJb3YtPnJhd2ZidWYgPSBOVUxMOworCisJdmZyZWUob3YtPnRlbXBmYnVmKTsKKwlvdi0+dGVtcGZidWYgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IE9WNTExX05VTVNCVUY7IGkrKykgeworCQlpZiAob3YtPnNidWZbaV0uZGF0YSkgeworCQkJa2ZyZWUob3YtPnNidWZbaV0uZGF0YSk7CisJCQlvdi0+c2J1ZltpXS5kYXRhID0gTlVMTDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1GUkFNRVM7IGkrKykgeworCQlvdi0+ZnJhbWVbaV0uZGF0YSA9IE5VTEw7CisJCW92LT5mcmFtZVtpXS5yYXdkYXRhID0gTlVMTDsKKwkJb3YtPmZyYW1lW2ldLnRlbXBkYXRhID0gTlVMTDsKKwkJaWYgKG92LT5mcmFtZVtpXS5jb21wYnVmKSB7CisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIG92LT5mcmFtZVtpXS5jb21wYnVmKTsKKwkJCW92LT5mcmFtZVtpXS5jb21wYnVmID0gTlVMTDsKKwkJfQorCX0KKworCVBERUJVRyg0LCAiYnVmZmVyIG1lbW9yeSBkZWFsbG9jYXRlZCIpOworCW92LT5idWZfc3RhdGUgPSBCVUZfTk9UX0FMTE9DQVRFRDsKKwlQREVCVUcoNCwgImxlYXZpbmciKTsKK30KKworc3RhdGljIGludAorb3Y1MXhfYWxsb2Moc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW50IGk7CisJY29uc3QgaW50IHcgPSBvdi0+bWF4d2lkdGg7CisJY29uc3QgaW50IGggPSBvdi0+bWF4aGVpZ2h0OworCWNvbnN0IGludCBkYXRhX2J1ZnNpemUgPSBPVjUxMV9OVU1GUkFNRVMgKiBNQVhfREFUQV9TSVpFKHcsIGgpOworCWNvbnN0IGludCByYXdfYnVmc2l6ZSA9IE9WNTExX05VTUZSQU1FUyAqIE1BWF9SQVdfREFUQV9TSVpFKHcsIGgpOworCisJUERFQlVHKDQsICJlbnRlcmVkIik7CisJZG93bigmb3YtPmJ1Zl9sb2NrKTsKKworCWlmIChvdi0+YnVmX3N0YXRlID09IEJVRl9BTExPQ0FURUQpCisJCWdvdG8gb3V0OworCisJb3YtPmZidWYgPSBydm1hbGxvYyhkYXRhX2J1ZnNpemUpOworCWlmICghb3YtPmZidWYpCisJCWdvdG8gZXJyb3I7CisKKwlvdi0+cmF3ZmJ1ZiA9IHZtYWxsb2MocmF3X2J1ZnNpemUpOworCWlmICghb3YtPnJhd2ZidWYpCisJCWdvdG8gZXJyb3I7CisKKwltZW1zZXQob3YtPnJhd2ZidWYsIDAsIHJhd19idWZzaXplKTsKKworCW92LT50ZW1wZmJ1ZiA9IHZtYWxsb2MocmF3X2J1ZnNpemUpOworCWlmICghb3YtPnRlbXBmYnVmKQorCQlnb3RvIGVycm9yOworCisJbWVtc2V0KG92LT50ZW1wZmJ1ZiwgMCwgcmF3X2J1ZnNpemUpOworCisJZm9yIChpID0gMDsgaSA8IE9WNTExX05VTVNCVUY7IGkrKykgeworCQlvdi0+c2J1ZltpXS5kYXRhID0ga21hbGxvYyhGUkFNRVNfUEVSX0RFU0MgKgorCQkJTUFYX0ZSQU1FX1NJWkVfUEVSX0RFU0MsIEdGUF9LRVJORUwpOworCQlpZiAoIW92LT5zYnVmW2ldLmRhdGEpCisJCQlnb3RvIGVycm9yOworCisJCVBERUJVRyg0LCAic2J1ZlslZF0gQCAlcCIsIGksIG92LT5zYnVmW2ldLmRhdGEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1GUkFNRVM7IGkrKykgeworCQlvdi0+ZnJhbWVbaV0uZGF0YSA9IG92LT5mYnVmICsgaSAqIE1BWF9EQVRBX1NJWkUodywgaCk7CisJCW92LT5mcmFtZVtpXS5yYXdkYXRhID0gb3YtPnJhd2ZidWYKKwkJICsgaSAqIE1BWF9SQVdfREFUQV9TSVpFKHcsIGgpOworCQlvdi0+ZnJhbWVbaV0udGVtcGRhdGEgPSBvdi0+dGVtcGZidWYKKwkJICsgaSAqIE1BWF9SQVdfREFUQV9TSVpFKHcsIGgpOworCisJCW92LT5mcmFtZVtpXS5jb21wYnVmID0KKwkJICh1bnNpZ25lZCBjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFvdi0+ZnJhbWVbaV0uY29tcGJ1ZikKKwkJCWdvdG8gZXJyb3I7CisKKwkJUERFQlVHKDQsICJmcmFtZVslZF0gQCAlcCIsIGksIG92LT5mcmFtZVtpXS5kYXRhKTsKKwl9CisKKwlvdi0+YnVmX3N0YXRlID0gQlVGX0FMTE9DQVRFRDsKK291dDoKKwl1cCgmb3YtPmJ1Zl9sb2NrKTsKKwlQREVCVUcoNCwgImxlYXZpbmciKTsKKwlyZXR1cm4gMDsKK2Vycm9yOgorCW92NTF4X2RvX2RlYWxsb2Mob3YpOworCXVwKCZvdi0+YnVmX2xvY2spOworCVBERUJVRyg0LCAiZXJyb3JlZCIpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZAorb3Y1MXhfZGVhbGxvYyhzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlQREVCVUcoNCwgImVudGVyZWQiKTsKKwlkb3duKCZvdi0+YnVmX2xvY2spOworCW92NTF4X2RvX2RlYWxsb2Mob3YpOworCXVwKCZvdi0+YnVmX2xvY2spOworCVBERUJVRyg0LCAibGVhdmluZyIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFY0TCAxIEFQSQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK292NTF4X3Y0bDFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCWludCBlcnIsIGk7CisKKwlQREVCVUcoNCwgIm9wZW5pbmciKTsKKworCWRvd24oJm92LT5sb2NrKTsKKworCWVyciA9IC1FQlVTWTsKKwlpZiAob3YtPnVzZXIpCisJCWdvdG8gb3V0OworCisJb3YtPnN1Yl9mbGFnID0gMDsKKworCS8qIEluIGNhc2UgYXBwIGRvZXNuJ3Qgc2V0IHRoZW0uLi4gKi8KKwllcnIgPSBvdjUxeF9zZXRfZGVmYXVsdF9wYXJhbXMob3YpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIE1ha2Ugc3VyZSBmcmFtZXMgYXJlIHJlc2V0ICovCisJZm9yIChpID0gMDsgaSA8IE9WNTExX05VTUZSQU1FUzsgaSsrKSB7CisJCW92LT5mcmFtZVtpXS5ncmFic3RhdGUgPSBGUkFNRV9VTlVTRUQ7CisJCW92LT5mcmFtZVtpXS5ieXRlc19yZWFkID0gMDsKKwl9CisKKwkvKiBJZiBjb21wcmVzc2lvbiBpcyBvbiwgbWFrZSBzdXJlIG5vdyB0aGF0IGEKKwkgKiBkZWNvbXByZXNzb3IgY2FuIGJlIGxvYWRlZCAqLworCWlmIChvdi0+Y29tcHJlc3MgJiYgIW92LT5kZWNvbXBfb3BzKSB7CisJCWVyciA9IHJlcXVlc3RfZGVjb21wcmVzc29yKG92KTsKKwkJaWYgKGVyciAmJiAhZHVtcHBpeCkKKwkJCWdvdG8gb3V0OworCX0KKworCWVyciA9IG92NTF4X2FsbG9jKG92KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBvdjUxeF9pbml0X2lzb2Mob3YpOworCWlmIChlcnIpIHsKKwkJb3Y1MXhfZGVhbGxvYyhvdik7CisJCWdvdG8gb3V0OworCX0KKworCW92LT51c2VyKys7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdmRldjsKKworCWlmIChvdi0+bGVkX3BvbGljeSA9PSBMRURfQVVUTykKKwkJb3Y1MXhfbGVkX2NvbnRyb2wob3YsIDEpOworCitvdXQ6CisJdXAoJm92LT5sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitvdjUxeF92NGwxX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKworCVBERUJVRyg0LCAib3Y1MTFfY2xvc2UiKTsKKworCWRvd24oJm92LT5sb2NrKTsKKworCW92LT51c2VyLS07CisJb3Y1MXhfc3RvcF9pc29jKG92KTsKKworCXJlbGVhc2VfZGVjb21wcmVzc29yKG92KTsKKworCWlmIChvdi0+bGVkX3BvbGljeSA9PSBMRURfQVVUTykKKwkJb3Y1MXhfbGVkX2NvbnRyb2wob3YsIDApOworCisJaWYgKG92LT5kZXYpCisJCW92NTF4X2RlYWxsb2Mob3YpOworCisJdXAoJm92LT5sb2NrKTsKKworCS8qIERldmljZSB1bnBsdWdnZWQgd2hpbGUgb3Blbi4gT25seSBhIG1pbmltdW0gb2YgdW5yZWdpc3RyYXRpb24gaXMgZG9uZQorCSAqIGhlcmU7IHRoZSBkaXNjb25uZWN0IGNhbGxiYWNrIGFscmVhZHkgZGlkIHRoZSByZXN0LiAqLworCWlmICghb3YtPmRldikgeworCQlkb3duKCZvdi0+Y2J1Zl9sb2NrKTsKKwkJa2ZyZWUob3YtPmNidWYpOworCQlvdi0+Y2J1ZiA9IE5VTEw7CisJCXVwKCZvdi0+Y2J1Zl9sb2NrKTsKKworCQlvdjUxeF9kZWFsbG9jKG92KTsKKwkJa2ZyZWUob3YpOworCQlvdiA9IE5VTEw7CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworLyogRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSEgKi8KK3N0YXRpYyBpbnQKK292NTF4X3Y0bDFfaW9jdGxfaW50ZXJuYWwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJUERFQlVHKDUsICJJT0N0bDogMHglWCIsIGNtZCk7CisKKwlpZiAoIW92LT5kZXYpCisJCXJldHVybiAtRUlPOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ0dDQVA6CisJeworCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqYiA9IGFyZzsKKworCQlQREVCVUcoNCwgIlZJRElPQ0dDQVAiKTsKKworCQltZW1zZXQoYiwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19jYXBhYmlsaXR5KSk7CisJCXNwcmludGYoYi0+bmFtZSwgIiVzIFVTQiBDYW1lcmEiLAorCQkJc3ltYm9saWMoYnJnbGlzdCwgb3YtPmJyaWRnZSkpOworCQliLT50eXBlID0gVklEX1RZUEVfQ0FQVFVSRSB8IFZJRF9UWVBFX1NVQkNBUFRVUkU7CisJCWItPmNoYW5uZWxzID0gb3YtPm51bV9pbnB1dHM7CisJCWItPmF1ZGlvcyA9IDA7CisJCWItPm1heHdpZHRoID0gb3YtPm1heHdpZHRoOworCQliLT5tYXhoZWlnaHQgPSBvdi0+bWF4aGVpZ2h0OworCQliLT5taW53aWR0aCA9IG92LT5taW53aWR0aDsKKwkJYi0+bWluaGVpZ2h0ID0gb3YtPm1pbmhlaWdodDsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NHQ0hBTjoKKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCisJCVBERUJVRyg0LCAiVklESU9DR0NIQU4iKTsKKworCQlpZiAoKHVuc2lnbmVkKSh2LT5jaGFubmVsKSA+PSBvdi0+bnVtX2lucHV0cykgeworCQkJZXJyKCJJbnZhbGlkIGNoYW5uZWwgKCVkKSIsIHYtPmNoYW5uZWwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQl2LT5ub3JtID0gb3YtPm5vcm07CisJCXYtPnR5cGUgPSBWSURFT19UWVBFX0NBTUVSQTsKKwkJdi0+ZmxhZ3MgPSAwOworLy8JCXYtPmZsYWdzIHw9IChvdi0+aGFzX2RlY29kZXIpID8gVklERU9fVkNfTk9STSA6IDA7CisJCXYtPnR1bmVycyA9IDA7CisJCWRlY29kZXJfZ2V0X2lucHV0X25hbWUob3YsIHYtPmNoYW5uZWwsIHYtPm5hbWUpOworCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ1NDSEFOOgorCXsKKwkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisJCWludCBlcnI7CisKKwkJUERFQlVHKDQsICJWSURJT0NTQ0hBTiIpOworCisJCS8qIE1ha2Ugc3VyZSBpdCdzIG5vdCBhIGNhbWVyYSAqLworCQlpZiAoIW92LT5oYXNfZGVjb2RlcikgeworCQkJaWYgKHYtPmNoYW5uZWwgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICh2LT5ub3JtICE9IFZJREVPX01PREVfUEFMICYmCisJCSAgICB2LT5ub3JtICE9IFZJREVPX01PREVfTlRTQyAmJgorCQkgICAgdi0+bm9ybSAhPSBWSURFT19NT0RFX1NFQ0FNICYmCisJCSAgICB2LT5ub3JtICE9IFZJREVPX01PREVfQVVUTykgeworCQkJZXJyKCJJbnZhbGlkIG5vcm0gKCVkKSIsIHYtPm5vcm0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoKHVuc2lnbmVkKSh2LT5jaGFubmVsKSA+PSBvdi0+bnVtX2lucHV0cykgeworCQkJZXJyKCJJbnZhbGlkIGNoYW5uZWwgKCVkKSIsIHYtPmNoYW5uZWwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQllcnIgPSBkZWNvZGVyX3NldF9pbnB1dChvdiwgdi0+Y2hhbm5lbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWVyciA9IGRlY29kZXJfc2V0X25vcm0ob3YsIHYtPm5vcm0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NHUElDVDoKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCisJCVBERUJVRyg0LCAiVklESU9DR1BJQ1QiKTsKKworCQltZW1zZXQocCwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19waWN0dXJlKSk7CisJCWlmIChzZW5zb3JfZ2V0X3BpY3R1cmUob3YsIHApKQorCQkJcmV0dXJuIC1FSU87CisKKwkJLyogQ2FuIHdlIGdldCB0aGVzZSBmcm9tIGZyYW1lWzBdPyAtY2xhdWRpbz8gKi8KKwkJcC0+ZGVwdGggPSBvdi0+ZnJhbWVbMF0uZGVwdGg7CisJCXAtPnBhbGV0dGUgPSBvdi0+ZnJhbWVbMF0uZm9ybWF0OworCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ1NQSUNUOgorCXsKKwkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CisJCWludCBpLCByYzsKKworCQlQREVCVUcoNCwgIlZJRElPQ1NQSUNUIik7CisKKwkJaWYgKCFnZXRfZGVwdGgocC0+cGFsZXR0ZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoc2Vuc29yX3NldF9waWN0dXJlKG92LCBwKSkKKwkJCXJldHVybiAtRUlPOworCisJCWlmIChmb3JjZV9wYWxldHRlICYmIHAtPnBhbGV0dGUgIT0gZm9yY2VfcGFsZXR0ZSkgeworCQkJaW5mbygiUGFsZXR0ZSByZWplY3RlZCAoJXMpIiwKKwkJCSAgICAgc3ltYm9saWModjRsMV9wbGlzdCwgcC0+cGFsZXR0ZSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvLyBGSVhNRTogRm9ybWF0IHNob3VsZCBiZSBpbmRlcGVuZGVudCBvZiBmcmFtZXMKKwkJaWYgKHAtPnBhbGV0dGUgIT0gb3YtPmZyYW1lWzBdLmZvcm1hdCkgeworCQkJUERFQlVHKDQsICJEZXRlY3RlZCBmb3JtYXQgY2hhbmdlIik7CisKKwkJCXJjID0gb3Y1MXhfd2FpdF9mcmFtZXNfaW5hY3RpdmUob3YpOworCQkJaWYgKHJjKQorCQkJCXJldHVybiByYzsKKworCQkJbW9kZV9pbml0X3JlZ3Mob3YsIG92LT5mcmFtZVswXS53aWR0aCwKKwkJCQlvdi0+ZnJhbWVbMF0uaGVpZ2h0LCBwLT5wYWxldHRlLCBvdi0+c3ViX2ZsYWcpOworCQl9CisKKwkJUERFQlVHKDQsICJTZXR0aW5nIGRlcHRoPSVkLCBwYWxldHRlPSVzIiwKKwkJICAgICAgIHAtPmRlcHRoLCBzeW1ib2xpYyh2NGwxX3BsaXN0LCBwLT5wYWxldHRlKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IE9WNTExX05VTUZSQU1FUzsgaSsrKSB7CisJCQlvdi0+ZnJhbWVbaV0uZGVwdGggPSBwLT5kZXB0aDsKKwkJCW92LT5mcmFtZVtpXS5mb3JtYXQgPSBwLT5wYWxldHRlOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DR0NBUFRVUkU6CisJeworCQlpbnQgKnZmID0gYXJnOworCisJCVBERUJVRyg0LCAiVklESU9DR0NBUFRVUkUiKTsKKworCQlvdi0+c3ViX2ZsYWcgPSAqdmY7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ1NDQVBUVVJFOgorCXsKKwkJc3RydWN0IHZpZGVvX2NhcHR1cmUgKnZjID0gYXJnOworCisJCVBERUJVRyg0LCAiVklESU9DU0NBUFRVUkUiKTsKKworCQlpZiAodmMtPmZsYWdzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2Yy0+ZGVjaW1hdGlvbikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXZjLT54ICY9IH4zTDsKKwkJdmMtPnkgJj0gfjFMOworCQl2Yy0+eSAmPSB+MzFMOworCisJCWlmICh2Yy0+d2lkdGggPT0gMCkKKwkJCXZjLT53aWR0aCA9IDMyOworCisJCXZjLT5oZWlnaHQgLz0gMTY7CisJCXZjLT5oZWlnaHQgKj0gMTY7CisJCWlmICh2Yy0+aGVpZ2h0ID09IDApCisJCQl2Yy0+aGVpZ2h0ID0gMTY7CisKKwkJb3YtPnN1YnggPSB2Yy0+eDsKKwkJb3YtPnN1YnkgPSB2Yy0+eTsKKwkJb3YtPnN1YncgPSB2Yy0+d2lkdGg7CisJCW92LT5zdWJoID0gdmMtPmhlaWdodDsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTV0lOOgorCXsKKwkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7CisJCWludCBpLCByYzsKKworCQlQREVCVUcoNCwgIlZJRElPQ1NXSU46ICVkeCVkIiwgdnctPndpZHRoLCB2dy0+aGVpZ2h0KTsKKworI2lmIDAKKwkJaWYgKHZ3LT5mbGFncykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAodnctPmNsaXBjb3VudCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAodnctPmhlaWdodCAhPSBvdi0+bWF4aGVpZ2h0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2dy0+d2lkdGggIT0gb3YtPm1heHdpZHRoKQorCQkJcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKKworCQlyYyA9IG92NTF4X3dhaXRfZnJhbWVzX2luYWN0aXZlKG92KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXJjID0gbW9kZV9pbml0X3JlZ3Mob3YsIHZ3LT53aWR0aCwgdnctPmhlaWdodCwKKwkJCW92LT5mcmFtZVswXS5mb3JtYXQsIG92LT5zdWJfZmxhZyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJZm9yIChpID0gMDsgaSA8IE9WNTExX05VTUZSQU1FUzsgaSsrKSB7CisJCQlvdi0+ZnJhbWVbaV0ud2lkdGggPSB2dy0+d2lkdGg7CisJCQlvdi0+ZnJhbWVbaV0uaGVpZ2h0ID0gdnctPmhlaWdodDsKKwkJfQorCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ0dXSU46CisJeworCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKKworCQltZW1zZXQodncsIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fd2luZG93KSk7CisJCXZ3LT54ID0gMDsJCS8qIEZJWE1FICovCisJCXZ3LT55ID0gMDsKKwkJdnctPndpZHRoID0gb3YtPmZyYW1lWzBdLndpZHRoOworCQl2dy0+aGVpZ2h0ID0gb3YtPmZyYW1lWzBdLmhlaWdodDsKKwkJdnctPmZsYWdzID0gMzA7CisKKwkJUERFQlVHKDQsICJWSURJT0NHV0lOOiAlZHglZCIsIHZ3LT53aWR0aCwgdnctPmhlaWdodCk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DR01CVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqdm0gPSBhcmc7CisJCWludCBpOworCisJCVBERUJVRyg0LCAiVklESU9DR01CVUYiKTsKKworCQltZW1zZXQodm0sIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fbWJ1ZikpOworCQl2bS0+c2l6ZSA9IE9WNTExX05VTUZSQU1FUworCQkJICAgKiBNQVhfREFUQV9TSVpFKG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCk7CisJCXZtLT5mcmFtZXMgPSBPVjUxMV9OVU1GUkFNRVM7CisKKwkJdm0tPm9mZnNldHNbMF0gPSAwOworCQlmb3IgKGkgPSAxOyBpIDwgT1Y1MTFfTlVNRlJBTUVTOyBpKyspIHsKKwkJCXZtLT5vZmZzZXRzW2ldID0gdm0tPm9mZnNldHNbaS0xXQorCQkJICAgKyBNQVhfREFUQV9TSVpFKG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NNQ0FQVFVSRToKKwl7CisJCXN0cnVjdCB2aWRlb19tbWFwICp2bSA9IGFyZzsKKwkJaW50IHJjLCBkZXB0aDsKKwkJdW5zaWduZWQgaW50IGYgPSB2bS0+ZnJhbWU7CisKKwkJUERFQlVHKDQsICJWSURJT0NNQ0FQVFVSRTogZnJhbWU6ICVkLCAlZHglZCwgJXMiLCBmLCB2bS0+d2lkdGgsCisJCQl2bS0+aGVpZ2h0LCBzeW1ib2xpYyh2NGwxX3BsaXN0LCB2bS0+Zm9ybWF0KSk7CisKKwkJZGVwdGggPSBnZXRfZGVwdGgodm0tPmZvcm1hdCk7CisJCWlmICghZGVwdGgpIHsKKwkJCVBERUJVRygyLCAiVklESU9DTUNBUFRVUkU6IGludmFsaWQgZm9ybWF0ICglcykiLAorCQkJICAgICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIHZtLT5mb3JtYXQpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGYgPj0gT1Y1MTFfTlVNRlJBTUVTKSB7CisJCQllcnIoIlZJRElPQ01DQVBUVVJFOiBpbnZhbGlkIGZyYW1lICglZCkiLCBmKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHZtLT53aWR0aCA+IG92LT5tYXh3aWR0aAorCQkgICAgfHwgdm0tPmhlaWdodCA+IG92LT5tYXhoZWlnaHQpIHsKKwkJCWVycigiVklESU9DTUNBUFRVUkU6IHJlcXVlc3RlZCBkaW1lbnNpb25zIHRvbyBiaWciKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKG92LT5mcmFtZVtmXS5ncmFic3RhdGUgPT0gRlJBTUVfR1JBQkJJTkcpIHsKKwkJCVBERUJVRyg0LCAiVklESU9DTUNBUFRVUkU6IGFscmVhZHkgZ3JhYmJpbmciKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlpZiAoZm9yY2VfcGFsZXR0ZSAmJiAodm0tPmZvcm1hdCAhPSBmb3JjZV9wYWxldHRlKSkgeworCQkJUERFQlVHKDIsICJwYWxldHRlIHJlamVjdGVkICglcykiLAorCQkJICAgICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIHZtLT5mb3JtYXQpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKChvdi0+ZnJhbWVbZl0ud2lkdGggIT0gdm0tPndpZHRoKSB8fAorCQkgICAgKG92LT5mcmFtZVtmXS5oZWlnaHQgIT0gdm0tPmhlaWdodCkgfHwKKwkJICAgIChvdi0+ZnJhbWVbZl0uZm9ybWF0ICE9IHZtLT5mb3JtYXQpIHx8CisJCSAgICAob3YtPmZyYW1lW2ZdLnN1Yl9mbGFnICE9IG92LT5zdWJfZmxhZykgfHwKKwkJICAgIChvdi0+ZnJhbWVbZl0uZGVwdGggIT0gZGVwdGgpKSB7CisJCQlQREVCVUcoNCwgIlZJRElPQ01DQVBUVVJFOiBjaGFuZ2UgaW4gaW1hZ2UgcGFyYW1ldGVycyIpOworCisJCQlyYyA9IG92NTF4X3dhaXRfZnJhbWVzX2luYWN0aXZlKG92KTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisKKwkJCXJjID0gbW9kZV9pbml0X3JlZ3Mob3YsIHZtLT53aWR0aCwgdm0tPmhlaWdodCwKKwkJCQl2bS0+Zm9ybWF0LCBvdi0+c3ViX2ZsYWcpOworI2lmIDAKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlQREVCVUcoMSwgIkdvdCBlcnJvciB3aGlsZSBpbml0aWFsaXppbmcgcmVncyAiKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorI2VuZGlmCisJCQlvdi0+ZnJhbWVbZl0ud2lkdGggPSB2bS0+d2lkdGg7CisJCQlvdi0+ZnJhbWVbZl0uaGVpZ2h0ID0gdm0tPmhlaWdodDsKKwkJCW92LT5mcmFtZVtmXS5mb3JtYXQgPSB2bS0+Zm9ybWF0OworCQkJb3YtPmZyYW1lW2ZdLnN1Yl9mbGFnID0gb3YtPnN1Yl9mbGFnOworCQkJb3YtPmZyYW1lW2ZdLmRlcHRoID0gZGVwdGg7CisJCX0KKworCQkvKiBNYXJrIGl0IGFzIHJlYWR5ICovCisJCW92LT5mcmFtZVtmXS5ncmFic3RhdGUgPSBGUkFNRV9SRUFEWTsKKworCQlQREVCVUcoNCwgIlZJRElPQ01DQVBUVVJFOiByZW5ld2luZyBmcmFtZSAlZCIsIGYpOworCisJCXJldHVybiBvdjUxeF9uZXdfZnJhbWUob3YsIGYpOworCX0KKwljYXNlIFZJRElPQ1NZTkM6CisJeworCQl1bnNpZ25lZCBpbnQgZm51bSA9ICooKHVuc2lnbmVkIGludCAqKSBhcmcpOworCQlzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lOworCQlpbnQgcmM7CisKKwkJaWYgKGZudW0gPj0gT1Y1MTFfTlVNRlJBTUVTKSB7CisJCQllcnIoIlZJRElPQ1NZTkM6IGludmFsaWQgZnJhbWUgKCVkKSIsIGZudW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmcmFtZSA9ICZvdi0+ZnJhbWVbZm51bV07CisKKwkJUERFQlVHKDQsICJzeW5jaW5nIHRvIGZyYW1lICVkLCBncmFic3RhdGUgPSAlZCIsIGZudW0sCisJCSAgICAgICBmcmFtZS0+Z3JhYnN0YXRlKTsKKworCQlzd2l0Y2ggKGZyYW1lLT5ncmFic3RhdGUpIHsKKwkJY2FzZSBGUkFNRV9VTlVTRUQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBGUkFNRV9SRUFEWToKKwkJY2FzZSBGUkFNRV9HUkFCQklORzoKKwkJY2FzZSBGUkFNRV9FUlJPUjoKK3JlZG86CisJCQlpZiAoIW92LT5kZXYpCisJCQkJcmV0dXJuIC1FSU87CisKKwkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZyYW1lLT53cSwKKwkJCSAgICAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9ET05FKQorCQkJICAgIHx8IChmcmFtZS0+Z3JhYnN0YXRlID09IEZSQU1FX0VSUk9SKSk7CisKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisKKwkJCWlmIChmcmFtZS0+Z3JhYnN0YXRlID09IEZSQU1FX0VSUk9SKSB7CisJCQkJaWYgKChyYyA9IG92NTF4X25ld19mcmFtZShvdiwgZm51bSkpIDwgMCkKKwkJCQkJcmV0dXJuIHJjOworCQkJCWdvdG8gcmVkbzsKKwkJCX0KKwkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQljYXNlIEZSQU1FX0RPTkU6CisJCQlpZiAob3YtPnNuYXBfZW5hYmxlZCAmJiAhZnJhbWUtPnNuYXBzaG90KSB7CisJCQkJaWYgKChyYyA9IG92NTF4X25ld19mcmFtZShvdiwgZm51bSkpIDwgMCkKKwkJCQkJcmV0dXJuIHJjOworCQkJCWdvdG8gcmVkbzsKKwkJCX0KKworCQkJZnJhbWUtPmdyYWJzdGF0ZSA9IEZSQU1FX1VOVVNFRDsKKworCQkJLyogUmVzZXQgdGhlIGhhcmR3YXJlIHNuYXBzaG90IGJ1dHRvbiAqLworCQkJLyogRklYTUUgLSBJcyB0aGlzIHRoZSBiZXN0IHBsYWNlIGZvciB0aGlzPyAqLworCQkJaWYgKChvdi0+c25hcF9lbmFibGVkKSAmJiAoZnJhbWUtPnNuYXBzaG90KSkgeworCQkJCWZyYW1lLT5zbmFwc2hvdCA9IDA7CisJCQkJb3Y1MXhfY2xlYXJfc25hcHNob3Qob3YpOworCQkJfQorCisJCQkvKiBEZWNvbXByZXNzaW9uLCBmb3JtYXQgY29udmVyc2lvbiwgZXRjLi4uICovCisJCQlvdjUxeF9wb3N0cHJvY2VzcyhvdiwgZnJhbWUpOworCisJCQlicmVhazsKKwkJfSAvKiBlbmQgc3dpdGNoICovCisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DR0ZCVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyICp2YiA9IGFyZzsKKworCQlQREVCVUcoNCwgIlZJRElPQ0dGQlVGIik7CisKKwkJbWVtc2V0KHZiLCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2J1ZmZlcikpOworCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ0dVTklUOgorCXsKKwkJc3RydWN0IHZpZGVvX3VuaXQgKnZ1ID0gYXJnOworCisJCVBERUJVRyg0LCAiVklESU9DR1VOSVQiKTsKKworCQltZW1zZXQodnUsIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fdW5pdCkpOworCisJCXZ1LT52aWRlbyA9IG92LT52ZGV2LT5taW5vcjsKKwkJdnUtPnZiaSA9IFZJREVPX05PX1VOSVQ7CisJCXZ1LT5yYWRpbyA9IFZJREVPX05PX1VOSVQ7CisJCXZ1LT5hdWRpbyA9IFZJREVPX05PX1VOSVQ7CisJCXZ1LT50ZWxldGV4dCA9IFZJREVPX05PX1VOSVQ7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgT1Y1MTFJT0NfV0kyQzoKKwl7CisJCXN0cnVjdCBvdjUxMV9pMmNfc3RydWN0ICp3ID0gYXJnOworCisJCXJldHVybiBpMmNfd19zbGF2ZShvdiwgdy0+c2xhdmUsIHctPnJlZywgdy0+dmFsdWUsIHctPm1hc2spOworCX0KKwljYXNlIE9WNTExSU9DX1JJMkM6CisJeworCQlzdHJ1Y3Qgb3Y1MTFfaTJjX3N0cnVjdCAqciA9IGFyZzsKKwkJaW50IHJjOworCisJCXJjID0gaTJjX3Jfc2xhdmUob3YsIHItPnNsYXZlLCByLT5yZWcpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCXItPnZhbHVlID0gcmM7CisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0OgorCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIElPQ3RsOiAweCVYIiwgY21kKTsKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9IC8qIGVuZCBzd2l0Y2ggKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitvdjUxeF92NGwxX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCWludCByYzsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJm92LT5sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCXJjID0gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBvdjUxeF92NGwxX2lvY3RsX2ludGVybmFsKTsKKworCXVwKCZvdi0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3NpemVfdAorb3Y1MXhfdjRsMV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgbm9ibG9jayA9IGZpbGUtPmZfZmxhZ3MmT19OT05CTE9DSzsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gY250OworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJaW50IGksIHJjID0gMCwgZnJteCA9IC0xOworCXN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWU7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZvdi0+bG9jaykpCisJCXJldHVybiAtRUlOVFI7CisKKwlQREVCVUcoNCwgIiVsZCBieXRlcywgbm9ibG9jaz0lZCIsIGNvdW50LCBub2Jsb2NrKTsKKworCWlmICghdmRldiB8fCAhYnVmKSB7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoIW92LT5kZXYpIHsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycm9yOworCX0KKworLy8gRklYTUU6IE9ubHkgc3VwcG9ydHMgdHdvIGZyYW1lcworCS8qIFNlZSBpZiBhIGZyYW1lIGlzIGNvbXBsZXRlZCwgdGhlbiB1c2UgaXQuICovCisJaWYgKG92LT5mcmFtZVswXS5ncmFic3RhdGUgPj0gRlJBTUVfRE9ORSkJLyogX0RPTkUgb3IgX0VSUk9SICovCisJCWZybXggPSAwOworCWVsc2UgaWYgKG92LT5mcmFtZVsxXS5ncmFic3RhdGUgPj0gRlJBTUVfRE9ORSkvKiBfRE9ORSBvciBfRVJST1IgKi8KKwkJZnJteCA9IDE7CisKKwkvKiBJZiBub25ibG9ja2luZyB3ZSByZXR1cm4gaW1tZWRpYXRlbHkgKi8KKwlpZiAobm9ibG9jayAmJiAoZnJteCA9PSAtMSkpIHsKKwkJcmMgPSAtRUFHQUlOOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIElmIG5vIEZSQU1FX0RPTkUsIGxvb2sgZm9yIGEgRlJBTUVfR1JBQkJJTkcgc3RhdGUuICovCisJLyogU2VlIGlmIGEgZnJhbWUgaXMgaW4gcHJvY2VzcyAoZ3JhYmJpbmcpLCB0aGVuIHVzZSBpdC4gKi8KKwlpZiAoZnJteCA9PSAtMSkgeworCQlpZiAob3YtPmZyYW1lWzBdLmdyYWJzdGF0ZSA9PSBGUkFNRV9HUkFCQklORykKKwkJCWZybXggPSAwOworCQllbHNlIGlmIChvdi0+ZnJhbWVbMV0uZ3JhYnN0YXRlID09IEZSQU1FX0dSQUJCSU5HKQorCQkJZnJteCA9IDE7CisJfQorCisJLyogSWYgbm8gZnJhbWUgaXMgYWN0aXZlLCBzdGFydCBvbmUuICovCisJaWYgKGZybXggPT0gLTEpIHsKKwkJaWYgKChyYyA9IG92NTF4X25ld19mcmFtZShvdiwgZnJteCA9IDApKSkgeworCQkJZXJyKCJyZWFkOiBvdjUxeF9uZXdfZnJhbWUgZXJyb3IiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlmcmFtZSA9ICZvdi0+ZnJhbWVbZnJteF07CisKK3Jlc3RhcnQ6CisJaWYgKCFvdi0+ZGV2KSB7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBXYWl0IHdoaWxlIHdlJ3JlIGdyYWJiaW5nIHRoZSBpbWFnZSAqLworCVBERUJVRyg0LCAiV2FpdGluZyBpbWFnZSBncmFiYmluZyIpOworCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZyYW1lLT53cSwKKwkJKGZyYW1lLT5ncmFic3RhdGUgPT0gRlJBTUVfRE9ORSkKKwkJfHwgKGZyYW1lLT5ncmFic3RhdGUgPT0gRlJBTUVfRVJST1IpKTsKKworCWlmIChyYykKKwkJZ290byBlcnJvcjsKKworCVBERUJVRyg0LCAiR290IGltYWdlLCBmcmFtZS0+Z3JhYnN0YXRlID0gJWQiLCBmcmFtZS0+Z3JhYnN0YXRlKTsKKwlQREVCVUcoNCwgImJ5dGVzX3JlY3ZkID0gJWQiLCBmcmFtZS0+Ynl0ZXNfcmVjdmQpOworCisJaWYgKGZyYW1lLT5ncmFic3RhdGUgPT0gRlJBTUVfRVJST1IpIHsKKwkJZnJhbWUtPmJ5dGVzX3JlYWQgPSAwOworCQllcnIoIioqIGljayEgKiogRXJyb3JlZCBmcmFtZSAlZCIsIG92LT5jdXJmcmFtZSk7CisJCWlmIChvdjUxeF9uZXdfZnJhbWUob3YsIGZybXgpKSB7CisJCQllcnIoInJlYWQ6IG92NTF4X25ld19mcmFtZSBlcnJvciIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlnb3RvIHJlc3RhcnQ7CisJfQorCisKKwkvKiBSZXBlYXQgdW50aWwgd2UgZ2V0IGEgc25hcHNob3QgZnJhbWUgKi8KKwlpZiAob3YtPnNuYXBfZW5hYmxlZCkKKwkJUERFQlVHKDQsICJXYWl0aW5nIHNuYXBzaG90IGZyYW1lIik7CisJaWYgKG92LT5zbmFwX2VuYWJsZWQgJiYgIWZyYW1lLT5zbmFwc2hvdCkgeworCQlmcmFtZS0+Ynl0ZXNfcmVhZCA9IDA7CisJCWlmICgocmMgPSBvdjUxeF9uZXdfZnJhbWUob3YsIGZybXgpKSkgeworCQkJZXJyKCJyZWFkOiBvdjUxeF9uZXdfZnJhbWUgZXJyb3IiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIENsZWFyIHRoZSBzbmFwc2hvdCAqLworCWlmIChvdi0+c25hcF9lbmFibGVkICYmIGZyYW1lLT5zbmFwc2hvdCkgeworCQlmcmFtZS0+c25hcHNob3QgPSAwOworCQlvdjUxeF9jbGVhcl9zbmFwc2hvdChvdik7CisJfQorCisJLyogRGVjb21wcmVzc2lvbiwgZm9ybWF0IGNvbnZlcnNpb24sIGV0Yy4uLiAqLworCW92NTF4X3Bvc3Rwcm9jZXNzKG92LCBmcmFtZSk7CisKKwlQREVCVUcoNCwgImZybXg9JWQsIGJ5dGVzX3JlYWQ9JWxkLCBsZW5ndGg9JWxkIiwgZnJteCwKKwkJZnJhbWUtPmJ5dGVzX3JlYWQsCisJCWdldF9mcmFtZV9sZW5ndGgoZnJhbWUpKTsKKworCS8qIGNvcHkgYnl0ZXMgdG8gdXNlciBzcGFjZTsgd2UgYWxsb3cgZm9yIHBhcnRpYWxzIHJlYWRzICovCisvLwlpZiAoKGNvdW50ICsgZnJhbWUtPmJ5dGVzX3JlYWQpCisvLwkgICAgPiBnZXRfZnJhbWVfbGVuZ3RoKChzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKilmcmFtZSkpCisvLwkJY291bnQgPSBmcmFtZS0+c2Nhbmxlbmd0aCAtIGZyYW1lLT5ieXRlc19yZWFkOworCisJLyogRklYTUUgLSBjb3VudCBoYXJkd2lyZWQgdG8gYmUgb25lIGZyYW1lLi4uICovCisJY291bnQgPSBnZXRfZnJhbWVfbGVuZ3RoKGZyYW1lKTsKKworCVBERUJVRyg0LCAiQ29weSB0byB1c2VyIHNwYWNlOiAlbGQgYnl0ZXMiLCBjb3VudCk7CisJaWYgKChpID0gY29weV90b191c2VyKGJ1ZiwgZnJhbWUtPmRhdGEgKyBmcmFtZS0+Ynl0ZXNfcmVhZCwgY291bnQpKSkgeworCQlQREVCVUcoNCwgIkNvcHkgZmFpbGVkISAlZCBieXRlcyBub3QgY29waWVkIiwgaSk7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmcmFtZS0+Ynl0ZXNfcmVhZCArPSBjb3VudDsKKwlQREVCVUcoNCwgIntjb3B5fSBjb3VudCB1c2VkPSVsZCwgbmV3IGJ5dGVzX3JlYWQ9JWxkIiwKKwkJY291bnQsIGZyYW1lLT5ieXRlc19yZWFkKTsKKworCS8qIElmIGFsbCBkYXRhIGhhdmUgYmVlbiByZWFkLi4uICovCisJaWYgKGZyYW1lLT5ieXRlc19yZWFkCisJICAgID49IGdldF9mcmFtZV9sZW5ndGgoZnJhbWUpKSB7CisJCWZyYW1lLT5ieXRlc19yZWFkID0gMDsKKworLy8gRklYTUU6IE9ubHkgc3VwcG9ydHMgdHdvIGZyYW1lcworCQkvKiBNYXJrIGl0IGFzIGF2YWlsYWJsZSB0byBiZSB1c2VkIGFnYWluLiAqLworCQlvdi0+ZnJhbWVbZnJteF0uZ3JhYnN0YXRlID0gRlJBTUVfVU5VU0VEOworCQlpZiAoKHJjID0gb3Y1MXhfbmV3X2ZyYW1lKG92LCAhZnJteCkpKSB7CisJCQllcnIoIm92NTF4X25ld19mcmFtZSByZXR1cm5lZCBlcnJvciIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCVBERUJVRyg0LCAicmVhZCBmaW5pc2hlZCwgcmV0dXJuaW5nICVsZCAoc3dlZXQpIiwgY291bnQpOworCisJdXAoJm92LT5sb2NrKTsKKwlyZXR1cm4gY291bnQ7CisKK2Vycm9yOgorCXVwKCZvdi0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitvdjUxeF92NGwxX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplICA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCXVuc2lnbmVkIGxvbmcgcGFnZSwgcG9zOworCisJaWYgKG92LT5kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisKKwlQREVCVUcoNCwgIm1tYXA6ICVsZCAoJWxYKSBieXRlcyIsIHNpemUsIHNpemUpOworCisJaWYgKHNpemUgPiAoKChPVjUxMV9OVU1GUkFNRVMKKwkgICAgICAgICAgICAgICogTUFYX0RBVEFfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpCisJICAgICAgICAgICAgICArIFBBR0VfU0laRSAtIDEpICYgfihQQUdFX1NJWkUgLSAxKSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJm92LT5sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCXBvcyA9ICh1bnNpZ25lZCBsb25nKW92LT5mYnVmOworCXdoaWxlIChzaXplID4gMCkgeworCQlwYWdlID0gdm1hbGxvY190b19wZm4oKHZvaWQgKilwb3MpOworCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsIHBhZ2UsIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKSB7CisJCQl1cCgmb3YtPmxvY2spOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJc3RhcnQgKz0gUEFHRV9TSVpFOworCQlwb3MgKz0gUEFHRV9TSVpFOworCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKKwkJCXNpemUgLT0gUEFHRV9TSVpFOworCQllbHNlCisJCQlzaXplID0gMDsKKwl9CisKKwl1cCgmb3YtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvdjUxMV9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5vcGVuID0JCW92NTF4X3Y0bDFfb3BlbiwKKwkucmVsZWFzZSA9CW92NTF4X3Y0bDFfY2xvc2UsCisJLnJlYWQgPQkJb3Y1MXhfdjRsMV9yZWFkLAorCS5tbWFwID0JCW92NTF4X3Y0bDFfbW1hcCwKKwkuaW9jdGwgPQlvdjUxeF92NGwxX2lvY3RsLAorCS5sbHNlZWsgPQlub19sbHNlZWssCit9OworCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2X3RlbXBsYXRlID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJPVjUxMSBVU0IgQ2FtZXJhIiwKKwkudHlwZSA9CQlWSURfVFlQRV9DQVBUVVJFLAorCS5oYXJkd2FyZSA9CVZJRF9IQVJEV0FSRV9PVjUxMSwKKwkuZm9wcyA9CQkmb3Y1MTFfZm9wcywKKwkucmVsZWFzZSA9CXZpZGVvX2RldmljZV9yZWxlYXNlLAorCS5taW5vciA9CS0xLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPVjUxMSBhbmQgc2Vuc29yIGNvbmZpZ3VyYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIGluaXRpYWxpemVzIHRoZSBPVjc2MTAsIE9WNzYyMCwgb3IgT1Y3NkJFIHNlbnNvci4gVGhlIE9WNzZCRSB1c2VzCisgKiB0aGUgc2FtZSByZWdpc3RlciBzZXR0aW5ncyBhcyB0aGUgT1Y3NjEwLCBzaW5jZSB0aGV5IGFyZSB2ZXJ5IHNpbWlsYXIuCisgKi8KK3N0YXRpYyBpbnQKK292N3h4MF9jb25maWd1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW50IGksIHN1Y2Nlc3M7CisJaW50IHJjOworCisJLyogTGF3cmVuY2UgR2xhaXN0ZXIgPGxnQGpmbS5iYy5jYT4gcmVwb3J0czoKKwkgKgorCSAqIFJlZ2lzdGVyIDB4MGYgaW4gdGhlIDc2MTAgaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0czoKKwkgKgorCSAqIDB4ODUgKEFFQyBtZXRob2QgMSk6IEJlc3Qgb3ZlcmFsbCwgZ29vZCBjb250cmFzdCByYW5nZQorCSAqIDB4NDUgKEFFQyBtZXRob2QgMik6IFZlcnkgb3ZlcmV4cG9zZWQKKwkgKiAweGE1IChzcGVjIHNoZWV0IGRlZmF1bHQpOiBPaywgYnV0IHRoZSBibGFjayBsZXZlbCBpcworCSAqCXNoaWZ0ZWQgcmVzdWx0aW5nIGluIGxvc3Mgb2YgY29udHJhc3QKKwkgKiAweDA1IChvbGQgZHJpdmVyIHNldHRpbmcpOiB2ZXJ5IG92ZXJleHBvc2VkLCB0b28gbXVjaAorCSAqCWNvbnRyYXN0CisJICovCisJc3RhdGljIHN0cnVjdCBvdjUxMV9yZWd2YWxzIGFSZWd2YWxzTm9ybTc2MTBbXSA9IHsKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDEwLCAweGZmIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxNiwgMHgwNiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjgsIDB4MjQgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDJiLCAweGFjIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMiwgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MzgsIDB4ODEgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDI4LCAweDI0IH0sCS8qIDBjICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwZiwgMHg4NSB9LAkvKiBsZydzIHNldHRpbmcgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDE1LCAweDAxIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyMCwgMHgxYyB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjMsIDB4MmEgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDI0LCAweDEwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyNSwgMHg4YSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjYsIDB4YTIgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDI3LCAweGMyIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyYSwgMHgwNCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MmMsIDB4ZmUgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDJkLCAweDkzIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzMCwgMHg3MSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MzEsIDB4NjAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDMyLCAweDI2IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzMywgMHgyMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MzQsIDB4NDggfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDEyLCAweDI0IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMSwgMHgwMSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MGMsIDB4MjQgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDBkLCAweDI0IH0sCisJCXsgT1Y1MTFfRE9ORV9CVVMsIDB4MCwgMHgwMCB9LAorCX07CisKKwlzdGF0aWMgc3RydWN0IG92NTExX3JlZ3ZhbHMgYVJlZ3ZhbHNOb3JtNzYyMFtdID0geworCQl7IE9WNTExX0kyQ19CVVMsIDB4MDAsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDAxLCAweDgwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwMiwgMHg4MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MDMsIDB4YzAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDA2LCAweDYwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwNywgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MGMsIDB4MjQgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDBjLCAweDI0IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwZCwgMHgyNCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTEsIDB4MDEgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDEyLCAweDI0IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMywgMHgwMSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTQsIDB4ODQgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDE1LCAweDAxIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxNiwgMHgwMyB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTcsIDB4MmYgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDE4LCAweGNmIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxOSwgMHgwNiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MWEsIDB4ZjUgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDFiLCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyMCwgMHgxOCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjEsIDB4ODAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDIyLCAweDgwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyMywgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjYsIDB4YTIgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDI3LCAweGVhIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyOCwgMHgyMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjksIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDJhLCAweDEwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyYiwgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MmMsIDB4ODggfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDJkLCAweDkxIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyZSwgMHg4MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MmYsIDB4NDQgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDYwLCAweDI3IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2MSwgMHgwMiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NjIsIDB4NWYgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDYzLCAweGQ1IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2NCwgMHg1NyB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NjUsIDB4ODMgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDY2LCAweDU1IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2NywgMHg5MiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NjgsIDB4Y2YgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDY5LCAweDc2IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2YSwgMHgyMiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NmIsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDZjLCAweDAyIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2ZCwgMHg0NCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NmUsIDB4ODAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDZmLCAweDFkIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg3MCwgMHg4YiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NzEsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDcyLCAweDE0IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg3MywgMHg1NCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NzQsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDc1LCAweDhlIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg3NiwgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NzcsIDB4ZmYgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDc4LCAweDgwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg3OSwgMHg4MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4N2EsIDB4ODAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDdiLCAweGUyIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg3YywgMHgwMCB9LAorCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwKKwl9OworCisJUERFQlVHKDQsICJzdGFydGluZyBjb25maWd1cmF0aW9uIik7CisKKwkvKiBUaGlzIGxvb2tzIHJlZHVuZGFudCwgYnV0IGlzIG5lY2Vzc2FyeSBmb3IgV2ViQ2FtIDMgKi8KKwlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBPVjd4eDBfU0lEOworCWlmIChvdjUxeF9zZXRfc2xhdmVfaWRzKG92LCBPVjd4eDBfU0lEKSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChpbml0X292X3NlbnNvcihvdikgPj0gMCkgeworCQlQREVCVUcoMSwgIk9WN3h4MCBzZW5zb3IgaW5pdGFsaXplZCAobWV0aG9kIDEpIik7CisJfSBlbHNlIHsKKwkJLyogUmVzZXQgdGhlIDc2eHggKi8KKwkJaWYgKGkyY193KG92LCAweDEyLCAweDgwKSA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJLyogV2FpdCBmb3IgaXQgdG8gaW5pdGlhbGl6ZSAqLworCQltc2xlZXAoMTUwKTsKKworCQlpID0gMDsKKwkJc3VjY2VzcyA9IDA7CisJCXdoaWxlIChpIDw9IGkyY19kZXRlY3RfdHJpZXMpIHsKKwkJCWlmICgoaTJjX3Iob3YsIE9WNzYxMF9SRUdfSURfSElHSCkgPT0gMHg3RikgJiYKKwkJCSAgICAoaTJjX3Iob3YsIE9WNzYxMF9SRUdfSURfTE9XKSA9PSAweEEyKSkgeworCQkJCXN1Y2Nlc3MgPSAxOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpKys7CisJCQl9CisJCX0KKworLy8gV2FzIChpID09IGkyY19kZXRlY3RfdHJpZXMpIHByZXZpb3VzbHkuIFRoaXMgb2J2aW91c2x5IHVzZWQgdG8gYWx3YXlzIHJlcG9ydAorLy8gc3VjY2Vzcy4gV2hldGhlciBhbnlvbmUgYWN0dWFsbHkgZGVwZW5kZWQgb24gdGhhdCBidWcgaXMgdW5rbm93bgorCQlpZiAoKGkgPj0gaTJjX2RldGVjdF90cmllcykgJiYgKHN1Y2Nlc3MgPT0gMCkpIHsKKwkJCWVycigiRmFpbGVkIHRvIHJlYWQgc2Vuc29yIElELiBZb3UgbWlnaHQgbm90IGhhdmUgYW4iKTsKKwkJCWVycigiT1Y3NjEwLzIwLCBvciBpdCBtYXkgYmUgbm90IHJlc3BvbmRpbmcuIFJlcG9ydCIpOworCQkJZXJyKCJ0aGlzIHRvICIgRU1BSUwpOworCQkJZXJyKCJUaGlzIGlzIG9ubHkgYSB3YXJuaW5nLiBZb3UgY2FuIGF0dGVtcHQgdG8gdXNlIik7CisJCQllcnIoInlvdXIgY2FtZXJhIGFueXdheSIpOworLy8gT25seSBpc3N1ZSBhIHdhcm5pbmcgZm9yIG5vdworLy8JCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlQREVCVUcoMSwgIk9WN3h4MCBpbml0aWFsaXplZCAobWV0aG9kIDIsICVkeCkiLCBpKzEpOworCQl9CisJfQorCisJLyogRGV0ZWN0IHNlbnNvciAoc3ViKXR5cGUgKi8KKwlyYyA9IGkyY19yKG92LCBPVjc2MTBfUkVHX0NPTV9JKTsKKworCWlmIChyYyA8IDApIHsKKwkJZXJyKCJFcnJvciBkZXRlY3Rpbmcgc2Vuc29yIHR5cGUiKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAoKHJjICYgMykgPT0gMykgeworCQlpbmZvKCJTZW5zb3IgaXMgYW4gT1Y3NjEwIik7CisJCW92LT5zZW5zb3IgPSBTRU5fT1Y3NjEwOworCX0gZWxzZSBpZiAoKHJjICYgMykgPT0gMSkgeworCQkvKiBJIGRvbid0IGtub3cgd2hhdCdzIGRpZmZlcmVudCBhYm91dCB0aGUgNzZCRSB5ZXQuICovCisJCWlmIChpMmNfcihvdiwgMHgxNSkgJiAxKQorCQkJaW5mbygiU2Vuc29yIGlzIGFuIE9WNzYyMEFFIik7CisJCWVsc2UKKwkJCWluZm8oIlNlbnNvciBpcyBhbiBPVjc2QkUiKTsKKworCQkvKiBPVjUxMSsgd2lsbCByZXR1cm4gYWxsIHplcm8gaXNvYyBkYXRhIHVubGVzcyB3ZQorCQkgKiBjb25maWd1cmUgdGhlIHNlbnNvciBhcyBhIDc2MjAuIFNvbWVvbmUgbmVlZHMgdG8KKwkJICogZmluZCB0aGUgZXhhY3QgcmVnLiBzZXR0aW5nIHRoYXQgY2F1c2VzIHRoaXMuICovCisJCWlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxMVBMVVMpIHsKKwkJCWluZm8oIkVuYWJsaW5nIDUxMSsvNzYyMEFFIHdvcmthcm91bmQiKTsKKwkJCW92LT5zZW5zb3IgPSBTRU5fT1Y3NjIwOworCQl9IGVsc2UgeworCQkJb3YtPnNlbnNvciA9IFNFTl9PVjc2QkU7CisJCX0KKwl9IGVsc2UgaWYgKChyYyAmIDMpID09IDApIHsKKwkJaW5mbygiU2Vuc29yIGlzIGFuIE9WNzYyMCIpOworCQlvdi0+c2Vuc29yID0gU0VOX09WNzYyMDsKKwl9IGVsc2UgeworCQllcnIoIlVua25vd24gaW1hZ2Ugc2Vuc29yIHZlcnNpb246ICVkIiwgcmMgJiAzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChvdi0+c2Vuc29yID09IFNFTl9PVjc2MjApIHsKKwkJUERFQlVHKDQsICJXcml0aW5nIDc2MjAgcmVnaXN0ZXJzIik7CisJCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm03NjIwKSkKKwkJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlQREVCVUcoNCwgIldyaXRpbmcgNzYxMCByZWdpc3RlcnMiKTsKKwkJaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzTm9ybTc2MTApKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldCBzZW5zb3Itc3BlY2lmaWMgdmFycyAqLworCW92LT5tYXh3aWR0aCA9IDY0MDsKKwlvdi0+bWF4aGVpZ2h0ID0gNDgwOworCW92LT5taW53aWR0aCA9IDY0OworCW92LT5taW5oZWlnaHQgPSA0ODsKKworCS8vIEZJWE1FOiBUaGVzZSBkbyBub3QgbWF0Y2ggdGhlIGFjdHVhbCBzZXR0aW5ncyB5ZXQKKwlvdi0+YnJpZ2h0bmVzcyA9IDB4ODAgPDwgODsKKwlvdi0+Y29udHJhc3QgPSAweDgwIDw8IDg7CisJb3YtPmNvbG91ciA9IDB4ODAgPDwgODsKKwlvdi0+aHVlID0gMHg4MCA8PCA4OworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WNjYyMCwgT1Y2NjMwLCBPVjY2MzBBRSwgb3IgT1Y2NjMwQUYgc2Vuc29yLiAqLworc3RhdGljIGludAorb3Y2eHgwX2NvbmZpZ3VyZShzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbnQgcmM7CisKKwlzdGF0aWMgc3RydWN0IG92NTExX3JlZ3ZhbHMgYVJlZ3ZhbHNOb3JtNngyMFtdID0geworCQl7IE9WNTExX0kyQ19CVVMsIDB4MTIsIDB4ODAgfSwgLyogcmVzZXQgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDExLCAweDAxIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwMywgMHg2MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MDUsIDB4N2YgfSwgLyogRm9yIHdoZW4gYXV0b2FkanVzdCBpcyBvZmYgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDA3LCAweGE4IH0sCisJCS8qIFRoZSByYXRpbyBvZiAweDBjIGFuZCAweDBkICBjb250cm9scyB0aGUgd2hpdGUgcG9pbnQgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDBjLCAweDI0IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwZCwgMHgyNCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MGYsIDB4MTUgfSwgLyogQ09NUyAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MTAsIDB4NzUgfSwgLyogQUVDIEV4cG9zdXJlIHRpbWUgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDEyLCAweDI0IH0sIC8qIEVuYWJsZSBBR0MgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDE0LCAweDA0IH0sCisJCS8qIDB4MTY6IDB4MDYgaGVscHMgZnJhbWUgc3RhYmlsaXR5IHdpdGggbW92aW5nIG9iamVjdHMgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDE2LCAweDA2IH0sCisvLwkJeyBPVjUxMV9JMkNfQlVTLCAweDIwLCAweDMwIH0sIC8qIEFwZXJ0dXJlIGNvcnJlY3Rpb24gZW5hYmxlICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyNiwgMHhiMiB9LCAvKiBCTEMgZW5hYmxlICovCisJCS8qIDB4Mjg6IDB4MDUgU2VsZWN0cyBSR0IgZm9ybWF0IGlmIFJHQiBvbiAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MjgsIDB4MDUgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDJhLCAweDA0IH0sIC8qIERpc2FibGUgZnJhbWVyYXRlIGFkanVzdCAqLworLy8JCXsgT1Y1MTFfSTJDX0JVUywgMHgyYiwgMHhhYyB9LCAvKiBGcmFtZXJhdGU7IFNldCAyYVs3XSBmaXJzdCAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MmQsIDB4OTkgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDMzLCAweGEwIH0sIC8qIENvbG9yIFByb2Nlc2luZyBQYXJhbWV0ZXIgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDM0LCAweGQyIH0sIC8qIE1heCBBL0QgcmFuZ2UgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDM4LCAweDhiIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzOSwgMHg0MCB9LAorCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzYywgMHgzOSB9LCAvKiBFbmFibGUgQUVDIG1vZGUgY2hhbmdpbmcgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDNjLCAweDNjIH0sIC8qIENoYW5nZSBBRUMgbW9kZSAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4M2MsIDB4MjQgfSwgLyogRGlzYWJsZSBBRUMgbW9kZSBjaGFuZ2luZyAqLworCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzZCwgMHg4MCB9LAorCQkvKiBUaGVzZSBuZXh0IHR3byByZWdpc3RlcnMgKDB4NGEsIDB4NGIpIGFyZSB1bmRvY3VtZW50ZWQuIFRoZXkKKwkJICogY29udHJvbCB0aGUgY29sb3IgYmFsYW5jZSAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4NGEsIDB4ODAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDRiLCAweDgwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg0ZCwgMHhkMiB9LCAvKiBUaGlzIHJlZHVjZXMgbm9pc2UgYSBiaXQgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDRlLCAweGMxIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg0ZiwgMHgwNCB9LAorLy8gRG8gNTAtNTMgaGF2ZSBhbnkgZWZmZWN0PworLy8gVG9nZ2xlIDB4MTJbMl0gb2ZmIGFuZCBvbiBoZXJlPworCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwJLyogRU5EIE1BUktFUiAqLworCX07CisKKwlzdGF0aWMgc3RydWN0IG92NTExX3JlZ3ZhbHMgYVJlZ3ZhbHNOb3JtNngzMFtdID0geworCS8qT0sqLwl7IE9WNTExX0kyQ19CVVMsIDB4MTIsIDB4ODAgfSwgLyogcmVzZXQgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDExLCAweDAwIH0sCisJLypPSyovCXsgT1Y1MTFfSTJDX0JVUywgMHgwMywgMHg2MCB9LAorCS8qMEE/Ki8JeyBPVjUxMV9JMkNfQlVTLCAweDA1LCAweDdmIH0sIC8qIEZvciB3aGVuIGF1dG9hZGp1c3QgaXMgb2ZmICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwNywgMHhhOCB9LAorCQkvKiBUaGUgcmF0aW8gb2YgMHgwYyBhbmQgMHgwZCAgY29udHJvbHMgdGhlIHdoaXRlIHBvaW50ICovCisJLypPSyovCXsgT1Y1MTFfSTJDX0JVUywgMHgwYywgMHgyNCB9LAorCS8qT0sqLwl7IE9WNTExX0kyQ19CVVMsIDB4MGQsIDB4MjQgfSwKKwkvKkEqLwl7IE9WNTExX0kyQ19CVVMsIDB4MGUsIDB4MjAgfSwKKy8vCS8qMDQ/Ki8JeyBPVjUxMV9JMkNfQlVTLCAweDE0LCAweDgwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxNiwgMHgwMyB9LAorLy8JLypPSyovCXsgT1Y1MTFfSTJDX0JVUywgMHgyMCwgMHgzMCB9LCAvKiBBcGVydHVyZSBjb3JyZWN0aW9uIGVuYWJsZSAqLworCQkvLyAyMSAmIDIyPyBUaGUgc3VnZ2VzdGVkIHZhbHVlcyBsb29rIHdyb25nLiBHbyB3aXRoIGRlZmF1bHQKKwkvKkEqLwl7IE9WNTExX0kyQ19CVVMsIDB4MjMsIDB4YzAgfSwKKwkvKkEqLwl7IE9WNTExX0kyQ19CVVMsIDB4MjUsIDB4OWEgfSwgLy8gQ2hlY2sgdGhpcyBhZ2FpbnN0IGRlZmF1bHQKKy8vCS8qT0sqLwl7IE9WNTExX0kyQ19CVVMsIDB4MjYsIDB4YjIgfSwgLyogQkxDIGVuYWJsZSAqLworCisJCS8qIDB4Mjg6IDB4MDUgU2VsZWN0cyBSR0IgZm9ybWF0IGlmIFJHQiBvbiAqLworLy8JLyowND8qLwl7IE9WNTExX0kyQ19CVVMsIDB4MjgsIDB4MDUgfSwKKy8vCS8qMDQ/Ki8JeyBPVjUxMV9JMkNfQlVTLCAweDI4LCAweDQ1IH0sIC8vIERFQlVHOiBUcmlzdGF0ZSBVViBidXMKKworCS8qT0sqLwl7IE9WNTExX0kyQ19CVVMsIDB4MmEsIDB4MDQgfSwgLyogRGlzYWJsZSBmcmFtZXJhdGUgYWRqdXN0ICovCisvLwkvKk9LKi8JeyBPVjUxMV9JMkNfQlVTLCAweDJiLCAweGFjIH0sIC8qIEZyYW1lcmF0ZTsgU2V0IDJhWzddIGZpcnN0ICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyZCwgMHg5OSB9LAorLy8JLypBKi8JeyBPVjUxMV9JMkNfQlVTLCAweDMzLCAweDI2IH0sIC8vIFJlc2VydmVkIGJpdHMgb24gNjYyMAorLy8JLypkMj8qLwl7IE9WNTExX0kyQ19CVVMsIDB4MzQsIDB4MDMgfSwgLyogTWF4IEEvRCByYW5nZSAqLworLy8JLyo4Yj8qLwl7IE9WNTExX0kyQ19CVVMsIDB4MzgsIDB4ODMgfSwKKy8vCS8qNDA/Ki8JeyBPVjUxMV9JMkNfQlVTLCAweDM5LCAweGMwIH0sIC8vIDY2MzAgYWRkcyBiaXQgNworLy8JCXsgT1Y1MTFfSTJDX0JVUywgMHgzYywgMHgzOSB9LCAvKiBFbmFibGUgQUVDIG1vZGUgY2hhbmdpbmcgKi8KKy8vCQl7IE9WNTExX0kyQ19CVVMsIDB4M2MsIDB4M2MgfSwgLyogQ2hhbmdlIEFFQyBtb2RlICovCisvLwkJeyBPVjUxMV9JMkNfQlVTLCAweDNjLCAweDI0IH0sIC8qIERpc2FibGUgQUVDIG1vZGUgY2hhbmdpbmcgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDNkLCAweDgwIH0sCisvLwkvKkEqLwl7IE9WNTExX0kyQ19CVVMsIDB4M2YsIDB4MGUgfSwKKworCQkvKiBUaGVzZSBuZXh0IHR3byByZWdpc3RlcnMgKDB4NGEsIDB4NGIpIGFyZSB1bmRvY3VtZW50ZWQuIFRoZXkKKwkJICogY29udHJvbCB0aGUgY29sb3IgYmFsYW5jZSAqLworLy8JLypPSz8qLwl7IE9WNTExX0kyQ19CVVMsIDB4NGEsIDB4ODAgfSwgLy8gQ2hlY2sgdGhlc2UKKy8vCS8qT0s/Ki8JeyBPVjUxMV9JMkNfQlVTLCAweDRiLCAweDgwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg0ZCwgMHgxMCB9LCAvKiBVID0gMC41NjN1LCBWID0gMC43MTR2ICovCisJLypjMT8qLwl7IE9WNTExX0kyQ19CVVMsIDB4NGUsIDB4NDAgfSwKKworCQkvKiBVViBhdmVyYWdlIG1vZGUsIGNvbG9yIGtpbGxlcjogc3Ryb25nZXN0ICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg0ZiwgMHgwNyB9LAorCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg1NCwgMHgyMyB9LCAvKiBNYXggQUdDIGdhaW46IDE4ZEIgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDU3LCAweDgxIH0sIC8qIChkZWZhdWx0KSAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4NTksIDB4MDEgfSwgLyogQUdDIGRhcmsgY3VycmVudCBjb21wOiArMSAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4NWEsIDB4MmMgfSwgLyogKHVuZG9jdW1lbnRlZCkgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDViLCAweDBmIH0sIC8qIEFXQiBjaHJvbWluYW5jZSBsZXZlbHMgKi8KKy8vCQl7IE9WNTExX0kyQ19CVVMsIDB4NWMsIDB4MTAgfSwKKwkJeyBPVjUxMV9ET05FX0JVUywgMHgwLCAweDAwIH0sCS8qIEVORCBNQVJLRVIgKi8KKwl9OworCisJUERFQlVHKDQsICJzdGFydGluZyBzZW5zb3IgY29uZmlndXJhdGlvbiIpOworCisJaWYgKGluaXRfb3Zfc2Vuc29yKG92KSA8IDApIHsKKwkJZXJyKCJGYWlsZWQgdG8gcmVhZCBzZW5zb3IgSUQuIFlvdSBtaWdodCBub3QgaGF2ZSBhbiBPVjZ4eDAsIik7CisJCWVycigib3IgaXQgbWF5IGJlIG5vdCByZXNwb25kaW5nLiBSZXBvcnQgdGhpcyB0byAiIEVNQUlMKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCVBERUJVRygxLCAiT1Y2eHgwIHNlbnNvciBkZXRlY3RlZCIpOworCX0KKworCS8qIERldGVjdCBzZW5zb3IgKHN1Yil0eXBlICovCisJcmMgPSBpMmNfcihvdiwgT1Y3NjEwX1JFR19DT01fSSk7CisKKwlpZiAocmMgPCAwKSB7CisJCWVycigiRXJyb3IgZGV0ZWN0aW5nIHNlbnNvciB0eXBlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKHJjICYgMykgPT0gMCkgeworCQlvdi0+c2Vuc29yID0gU0VOX09WNjYzMDsKKwkJaW5mbygiU2Vuc29yIGlzIGFuIE9WNjYzMCIpOworCX0gZWxzZSBpZiAoKHJjICYgMykgPT0gMSkgeworCQlvdi0+c2Vuc29yID0gU0VOX09WNjYyMDsKKwkJaW5mbygiU2Vuc29yIGlzIGFuIE9WNjYyMCIpOworCX0gZWxzZSBpZiAoKHJjICYgMykgPT0gMikgeworCQlvdi0+c2Vuc29yID0gU0VOX09WNjYzMDsKKwkJaW5mbygiU2Vuc29yIGlzIGFuIE9WNjYzMEFFIik7CisJfSBlbHNlIGlmICgocmMgJiAzKSA9PSAzKSB7CisJCW92LT5zZW5zb3IgPSBTRU5fT1Y2NjMwOworCQlpbmZvKCJTZW5zb3IgaXMgYW4gT1Y2NjMwQUYiKTsKKwl9CisKKwkvKiBTZXQgc2Vuc29yLXNwZWNpZmljIHZhcnMgKi8KKwlvdi0+bWF4d2lkdGggPSAzNTI7CisJb3YtPm1heGhlaWdodCA9IDI4ODsKKwlvdi0+bWlud2lkdGggPSA2NDsKKwlvdi0+bWluaGVpZ2h0ID0gNDg7CisKKwkvLyBGSVhNRTogVGhlc2UgZG8gbm90IG1hdGNoIHRoZSBhY3R1YWwgc2V0dGluZ3MgeWV0CisJb3YtPmJyaWdodG5lc3MgPSAweDgwIDw8IDg7CisJb3YtPmNvbnRyYXN0ID0gMHg4MCA8PCA4OworCW92LT5jb2xvdXIgPSAweDgwIDw8IDg7CisJb3YtPmh1ZSA9IDB4ODAgPDwgODsKKworCWlmIChvdi0+c2Vuc29yID09IFNFTl9PVjY2MjApIHsKKwkJUERFQlVHKDQsICJXcml0aW5nIDZ4MjAgcmVnaXN0ZXJzIik7CisJCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm02eDIwKSkKKwkJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlQREVCVUcoNCwgIldyaXRpbmcgNngzMCByZWdpc3RlcnMiKTsKKwkJaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzTm9ybTZ4MzApKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGluaXRpYWxpemVzIHRoZSBLUzAxMjcgYW5kIEtTMDEyN0IgdmlkZW8gZGVjb2RlcnMuICovCitzdGF0aWMgaW50IAora3MwMTI3X2NvbmZpZ3VyZShzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbnQgcmM7CisKKy8vIEZJWE1FOiBJIGRvbid0IGtub3cgaG93IHRvIHN5bmMgb3IgcmVzZXQgaXQgeWV0CisjaWYgMAorCWlmIChvdjUxeF9pbml0X2tzX3NlbnNvcihvdikgPCAwKSB7CisJCWVycigiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIEtTMDEyNyIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJUERFQlVHKDEsICJLUzAxMngoQikgc2Vuc29yIGRldGVjdGVkIik7CisJfQorI2VuZGlmCisKKwkvKiBEZXRlY3QgZGVjb2RlciBzdWJ0eXBlICovCisJcmMgPSBpMmNfcihvdiwgMHgwMCk7CisJaWYgKHJjIDwgMCkgeworCQllcnIoIkVycm9yIGRldGVjdGluZyBzZW5zb3IgdHlwZSIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChyYyAmIDB4MDgpIHsKKwkJcmMgPSBpMmNfcihvdiwgMHgzZCk7CisJCWlmIChyYyA8IDApIHsKKwkJCWVycigiRXJyb3IgZGV0ZWN0aW5nIHNlbnNvciB0eXBlIik7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSBpZiAoKHJjICYgMHgwZikgPT0gMCkgeworCQkJaW5mbygiU2Vuc29yIGlzIGEgS1MwMTI3Iik7CisJCQlvdi0+c2Vuc29yID0gU0VOX0tTMDEyNzsKKwkJfSBlbHNlIGlmICgocmMgJiAweDBmKSA9PSA5KSB7CisJCQlpbmZvKCJTZW5zb3IgaXMgYSBLUzAxMjdCIFJldi4gQSIpOworCQkJb3YtPnNlbnNvciA9IFNFTl9LUzAxMjdCOworCQl9CisJfSBlbHNlIHsKKwkJZXJyKCJFcnJvcjogU2Vuc29yIGlzIGFuIHVuc3VwcG9ydGVkIEtTMDEyMiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU2V0IHNlbnNvci1zcGVjaWZpYyB2YXJzICovCisJb3YtPm1heHdpZHRoID0gNjQwOworCW92LT5tYXhoZWlnaHQgPSA0ODA7CisJb3YtPm1pbndpZHRoID0gNjQ7CisJb3YtPm1pbmhlaWdodCA9IDQ4OworCisJLy8gRklYTUU6IFRoZXNlIGRvIG5vdCBtYXRjaCB0aGUgYWN0dWFsIHNldHRpbmdzIHlldAorCW92LT5icmlnaHRuZXNzID0gMHg4MCA8PCA4OworCW92LT5jb250cmFzdCA9IDB4ODAgPDwgODsKKwlvdi0+Y29sb3VyID0gMHg4MCA8PCA4OworCW92LT5odWUgPSAweDgwIDw8IDg7CisKKwkvKiBUaGlzIGRldmljZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4gQmFpbCBvdXQgbm93Li4uICovCisJZXJyKCJUaGlzIHNlbnNvciBpcyBub3Qgc3VwcG9ydGVkIHlldC4iKTsKKwlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBpbml0aWFsaXplcyB0aGUgU0FBNzExMUEgdmlkZW8gZGVjb2Rlci4gKi8KK3N0YXRpYyBpbnQKK3NhYTcxMTFhX2NvbmZpZ3VyZShzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbnQgcmM7CisKKwkvKiBTaW5jZSB0aGVyZSBpcyBubyByZWdpc3RlciByZXNldCBjb21tYW5kLCBhbGwgcmVnaXN0ZXJzIG11c3QgYmUKKwkgKiB3cml0dGVuLCBvdGhlcndpc2UgZ2l2ZXMgZXJyYXRpYyByZXN1bHRzICovCisJc3RhdGljIHN0cnVjdCBvdjUxMV9yZWd2YWxzIGFSZWd2YWxzTm9ybVNBQTcxMTFBW10gPSB7CisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwNiwgMHhjZSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MDcsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDEwLCAweDQ0IH0sIC8qIFlVVjQyMiwgMjQwLzI4NiBsaW5lcyAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MGUsIDB4MDEgfSwgLyogTlRTQyBNIG9yIFBBTCBCR0hJICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwMCwgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MDEsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDAzLCAweDIzIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwNCwgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MDUsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDA4LCAweGM4IH0sIC8qIEF1dG8gZmllbGQgZnJlcSAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MDksIDB4MDEgfSwgLyogQ2hyb20uIHRyYXAgb2ZmLCBBUEVSPTAuMjUgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDBhLCAweDgwIH0sIC8qIEJSSUc9MTI4ICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwYiwgMHg0MCB9LCAvKiBDT05UPTEuMCAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MGMsIDB4NDAgfSwgLyogU0FUTj0xLjAgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDBkLCAweDAwIH0sIC8qIEhVRT0wICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwZiwgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTEsIDB4MGMgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDEyLCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMywgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTQsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDE1LCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxNiwgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTcsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDAyLCAweGMwIH0sCS8qIENvbXBvc2l0ZSBpbnB1dCAwICovCisJCXsgT1Y1MTFfRE9ORV9CVVMsIDB4MCwgMHgwMCB9LAorCX07CisKKy8vIEZJWE1FOiBJIGRvbid0IGtub3cgaG93IHRvIHN5bmMgb3IgcmVzZXQgaXQgeWV0CisjaWYgMAorCWlmIChvdjUxeF9pbml0X3NhYV9zZW5zb3Iob3YpIDwgMCkgeworCQllcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBTQUE3MTExQSIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJUERFQlVHKDEsICJTQUE3MTExQSBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwl9CisjZW5kaWYKKworCS8qIDY0MHg0ODAgbm90IHN1cHBvcnRlZCB3aXRoIFBBTCAqLworCWlmIChvdi0+cGFsKSB7CisJCW92LT5tYXh3aWR0aCA9IDMyMDsKKwkJb3YtPm1heGhlaWdodCA9IDI0MDsJCS8qIEV2ZW4gZmllbGQgb25seSAqLworCX0gZWxzZSB7CisJCW92LT5tYXh3aWR0aCA9IDY0MDsKKwkJb3YtPm1heGhlaWdodCA9IDQ4MDsJCS8qIEV2ZW4vT2RkIGZpZWxkcyAqLworCX0KKworCW92LT5taW53aWR0aCA9IDMyMDsKKwlvdi0+bWluaGVpZ2h0ID0gMjQwOwkJLyogRXZlbiBmaWVsZCBvbmx5ICovCisKKwlvdi0+aGFzX2RlY29kZXIgPSAxOworCW92LT5udW1faW5wdXRzID0gODsKKwlvdi0+bm9ybSA9IFZJREVPX01PREVfQVVUTzsKKwlvdi0+c3RvcF9kdXJpbmdfc2V0ID0gMDsJLyogRGVjb2RlciBndWFyYW50ZWVzIHN0YWJsZSBpbWFnZSAqLworCisJLyogRGVjb2RlciBkb2Vzbid0IGNoYW5nZSB0aGVzZSB2YWx1ZXMsIHNvIHdlIHVzZSB0aGVzZSBpbnN0ZWFkIG9mCisJICogYWN1dGFsbHkgcmVhZGluZyB0aGUgcmVnaXN0ZXJzICh3aGljaCBkb2Vzbid0IHdvcmspICovCisJb3YtPmJyaWdodG5lc3MgPSAweDgwIDw8IDg7CisJb3YtPmNvbnRyYXN0ID0gMHg0MCA8PCA5OworCW92LT5jb2xvdXIgPSAweDQwIDw8IDk7CisJb3YtPmh1ZSA9IDMyNzY4OworCisJUERFQlVHKDQsICJXcml0aW5nIFNBQTcxMTFBIHJlZ2lzdGVycyIpOworCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm1TQUE3MTExQSkpCisJCXJldHVybiAtMTsKKworCS8qIERldGVjdCB2ZXJzaW9uIG9mIGRlY29kZXIuIFRoaXMgbXVzdCBiZSBkb25lIGFmdGVyIHdyaXRpbmcgdGhlCisgICAgICAgICAqIGluaXRpYWwgcmVncyBvciB0aGUgZGVjb2RlciB3aWxsIGxvY2sgdXAuICovCisJcmMgPSBpMmNfcihvdiwgMHgwMCk7CisKKwlpZiAocmMgPCAwKSB7CisJCWVycigiRXJyb3IgZGV0ZWN0aW5nIHNlbnNvciB2ZXJzaW9uIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlpbmZvKCJTZW5zb3IgaXMgYW4gU0FBNzExMUEgKHZlcnNpb24gMHgleCkiLCByYyk7CisJCW92LT5zZW5zb3IgPSBTRU5fU0FBNzExMUE7CisJfQorCisJLy8gRklYTUU6IEZpeCB0aGlzIGZvciBPVjUxOCgrKQorCS8qIExhdGNoIHRvIG5lZ2F0aXZlIGVkZ2Ugb2YgY2xvY2suIE90aGVyd2lzZSwgd2UgZ2V0IGluY29ycmVjdAorCSAqIGNvbG9ycyBhbmQgaml0dGVyIGluIHRoZSBkaWdpdGFsIHNpZ25hbC4gKi8KKwlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTEpCisJCXJlZ193KG92LCAweDExLCAweDAwKTsKKwllbHNlCisJCXdhcm4oIlNBQTcxMTFBIG5vdCB5ZXQgc3VwcG9ydGVkIHdpdGggT1Y1MTgvT1Y1MTgrIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBpbml0aWFsaXplcyB0aGUgT1Y1MTEvT1Y1MTErIGFuZCB0aGUgc2Vuc29yICovCitzdGF0aWMgaW50IAorb3Y1MTFfY29uZmlndXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc0luaXQ1MTFbXSA9IHsKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19SRVNFVCwJMHg3ZiB9LAorCSAJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19JTklULAkJMHgwMSB9LAorCSAJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19SRVNFVCwJMHg3ZiB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX0lOSVQsCQkweDAxIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfUkVTRVQsCTB4M2YgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19JTklULAkJMHgwMSB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1JFU0VULAkweDNkIH0sCisJCXsgT1Y1MTFfRE9ORV9CVVMsIDB4MCwgMHgwMH0sCisJfTsKKworCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm01MTFbXSA9IHsKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTExX0RSQU1fRkxPV19DVEwsIAkweDAxIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfU05BUCwJCTB4MDAgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMiB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1NOQVAsCQkweDAwIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9GSUZPX09QVFMsCTB4MWYgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTExX0NPTVBfRU4sCQkweDAwIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9DT01QX0xVVF9FTiwJMHgwMyB9LAorCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwKKwl9OworCisJc3RhdGljIHN0cnVjdCBvdjUxMV9yZWd2YWxzIGFSZWd2YWxzTm9ybTUxMVBsdXNbXSA9IHsKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTExX0RSQU1fRkxPV19DVEwsCTB4ZmYgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMCB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1NOQVAsCQkweDAyIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfU05BUCwJCTB4MDAgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTExX0ZJRk9fT1BUUywJMHhmZiB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MTFfQ09NUF9FTiwJCTB4MDAgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTExX0NPTVBfTFVUX0VOLAkweDAzIH0sCisJCXsgT1Y1MTFfRE9ORV9CVVMsIDB4MCwgMHgwMCB9LAorCX07CisKKwlQREVCVUcoNCwgIiIpOworCisJb3YtPmN1c3RvbWlkID0gcmVnX3Iob3YsIFI1MTFfU1lTX0NVU1RfSUQpOworCWlmIChvdi0+Y3VzdG9taWQgPCAwKSB7CisJCWVycigiVW5hYmxlIHRvIHJlYWQgY2FtZXJhIGJyaWRnZSByZWdpc3RlcnMiKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlQREVCVUcgKDEsICJDdXN0b21JRCA9ICVkIiwgb3YtPmN1c3RvbWlkKTsKKwlvdi0+ZGVzYyA9IHN5bWJvbGljKGNhbWxpc3QsIG92LT5jdXN0b21pZCk7CisJaW5mbygibW9kZWw6ICVzIiwgb3YtPmRlc2MpOworCisJaWYgKDAgPT0gc3RyY21wKG92LT5kZXNjLCBOT1RfREVGSU5FRF9TVFIpKSB7CisJCWVycigiQ2FtZXJhIHR5cGUgKCVkKSBub3QgcmVjb2duaXplZCIsIG92LT5jdXN0b21pZCk7CisJCWVycigiUGxlYXNlIG5vdGlmeSAiIEVNQUlMICIgb2YgdGhlIG5hbWUsIik7CisJCWVycigibWFudWZhY3R1cmVyLCBtb2RlbCwgYW5kIHRoaXMgbnVtYmVyIG9mIHlvdXIgY2FtZXJhLiIpOworCQllcnIoIkFsc28gaW5jbHVkZSB0aGUgb3V0cHV0IG9mIHRoZSBkZXRlY3Rpb24gcHJvY2Vzcy4iKTsKKwl9IAorCisJaWYgKG92LT5jdXN0b21pZCA9PSA3MCkJCS8qIFVTQiBMaWZlIFRWIChQQUwvU0VDQU0pICovCisJCW92LT5wYWwgPSAxOworCisJaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzSW5pdDUxMSkpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAob3YtPmxlZF9wb2xpY3kgPT0gTEVEX09GRiB8fCBvdi0+bGVkX3BvbGljeSA9PSBMRURfQVVUTykKKwkJb3Y1MXhfbGVkX2NvbnRyb2wob3YsIDApOworCisJLyogVGhlIE9WNTExKyBoYXMgdW5kb2N1bWVudGVkIGJpdHMgaW4gdGhlIGZsb3cgY29udHJvbCByZWdpc3Rlci4KKwkgKiBTZXR0aW5nIGl0IHRvIDB4ZmYgZml4ZXMgdGhlIGNvcnJ1cHRpb24gd2l0aCBtb3Zpbmcgb2JqZWN0cy4gKi8KKwlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTEpIHsKKwkJaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzTm9ybTUxMSkpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSBpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTFQTFVTKSB7CisJCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm01MTFQbHVzKSkKKwkJCWdvdG8gZXJyb3I7CisJfSBlbHNlIHsKKwkJZXJyKCJJbnZhbGlkIGJyaWRnZSIpOworCX0KKworCWlmIChvdjUxMV9pbml0X2NvbXByZXNzaW9uKG92KSkKKwkJZ290byBlcnJvcjsKKworCW92LT5wYWNrZXRfbnVtYmVyaW5nID0gMTsKKwlvdjUxMV9zZXRfcGFja2V0X3NpemUob3YsIDApOworCisJb3YtPnNuYXBfZW5hYmxlZCA9IHNuYXBzaG90OworCisJLyogVGVzdCBmb3IgN3h4MCAqLworCVBERUJVRygzLCAiVGVzdGluZyBmb3IgMFY3eHgwIik7CisJb3YtPnByaW1hcnlfaTJjX3NsYXZlID0gT1Y3eHgwX1NJRDsKKwlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgT1Y3eHgwX1NJRCkgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKGkyY193KG92LCAweDEyLCAweDgwKSA8IDApIHsKKwkJLyogVGVzdCBmb3IgNnh4MCAqLworCQlQREVCVUcoMywgIlRlc3RpbmcgZm9yIDBWNnh4MCIpOworCQlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBPVjZ4eDBfU0lEOworCQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgT1Y2eHgwX1NJRCkgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlpZiAoaTJjX3cob3YsIDB4MTIsIDB4ODApIDwgMCkgeworCQkJLyogVGVzdCBmb3IgOHh4MCAqLworCQkJUERFQlVHKDMsICJUZXN0aW5nIGZvciAwVjh4eDAiKTsKKwkJCW92LT5wcmltYXJ5X2kyY19zbGF2ZSA9IE9WOHh4MF9TSUQ7CisJCQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgT1Y4eHgwX1NJRCkgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCWlmIChpMmNfdyhvdiwgMHgxMiwgMHg4MCkgPCAwKSB7CisJCQkJLyogVGVzdCBmb3IgU0FBNzExMUEgKi8KKwkJCQlQREVCVUcoMywgIlRlc3RpbmcgZm9yIFNBQTcxMTFBIik7CisJCQkJb3YtPnByaW1hcnlfaTJjX3NsYXZlID0gU0FBNzExMUFfU0lEOworCQkJCWlmIChvdjUxeF9zZXRfc2xhdmVfaWRzKG92LCBTQUE3MTExQV9TSUQpIDwgMCkKKwkJCQkJZ290byBlcnJvcjsKKworCQkJCWlmIChpMmNfdyhvdiwgMHgwZCwgMHgwMCkgPCAwKSB7CisJCQkJCS8qIFRlc3QgZm9yIEtTMDEyNyAqLworCQkJCQlQREVCVUcoMywgIlRlc3RpbmcgZm9yIEtTMDEyNyIpOworCQkJCQlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBLUzAxMjdfU0lEOworCQkJCQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgS1MwMTI3X1NJRCkgPCAwKQorCQkJCQkJZ290byBlcnJvcjsKKworCQkJCQlpZiAoaTJjX3cob3YsIDB4MTAsIDB4MDApIDwgMCkgeworCQkJCQkJZXJyKCJDYW4ndCBkZXRlcm1pbmUgc2Vuc29yIHNsYXZlIElEcyIpOworCQkgCQkJCWdvdG8gZXJyb3I7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoa3MwMTI3X2NvbmZpZ3VyZShvdikgPCAwKSB7CisJCQkJCQkJZXJyKCJGYWlsZWQgdG8gY29uZmlndXJlIEtTMDEyNyIpOworCSAJCQkJCQlnb3RvIGVycm9yOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHNhYTcxMTFhX2NvbmZpZ3VyZShvdikgPCAwKSB7CisJCQkJCQllcnIoIkZhaWxlZCB0byBjb25maWd1cmUgU0FBNzExMUEiKTsKKwkgCQkJCQlnb3RvIGVycm9yOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQllcnIoIkRldGVjdGVkIHVuc3VwcG9ydGVkIE9WOHh4MCBzZW5zb3IiKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKG92Nnh4MF9jb25maWd1cmUob3YpIDwgMCkgeworCQkJCWVycigiRmFpbGVkIHRvIGNvbmZpZ3VyZSBPVjZ4eDAiKTsKKyAJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChvdjd4eDBfY29uZmlndXJlKG92KSA8IDApIHsKKwkJCWVycigiRmFpbGVkIHRvIGNvbmZpZ3VyZSBPVjd4eDAiKTsKKwkgCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWVycigiT1Y1MTEgQ29uZmlnIGZhaWxlZCIpOworCisJcmV0dXJuIC1FQlVTWTsKK30KKworLyogVGhpcyBpbml0aWFsaXplcyB0aGUgT1Y1MTgvT1Y1MTgrIGFuZCB0aGUgc2Vuc29yICovCitzdGF0aWMgaW50CitvdjUxOF9jb25maWd1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJLyogRm9yIDUxOCBhbmQgNTE4KyAqLworCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc0luaXQ1MThbXSA9IHsKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19SRVNFVCwJMHg0MCB9LAorCSAJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19JTklULAkJMHhlMSB9LAorCSAJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19SRVNFVCwJMHgzZSB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX0lOSVQsCQkweGUxIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfUkVTRVQsCTB4MDAgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19JTklULAkJMHhlMSB9LAorCQl7IE9WNTExX1JFR19CVVMsIDB4NDYsCQkJMHgwMCB9LCAKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDVkLAkJCTB4MDMgfSwKKwkJeyBPVjUxMV9ET05FX0JVUywgMHgwLCAweDAwfSwKKwl9OworCisJc3RhdGljIHN0cnVjdCBvdjUxMV9yZWd2YWxzIGFSZWd2YWxzTm9ybTUxOFtdID0geworCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1NOQVAsCQkweDAyIH0sIC8qIFJlc2V0ICovCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfU05BUCwJCTB4MDEgfSwgLyogRW5hYmxlICovCisJCXsgT1Y1MTFfUkVHX0JVUywgMHgzMSwgCQkJMHgwZiB9LAorCQl7IE9WNTExX1JFR19CVVMsIDB4NWQsCQkJMHgwMyB9LAorCQl7IE9WNTExX1JFR19CVVMsIDB4MjQsCQkJMHg5ZiB9LAorCQl7IE9WNTExX1JFR19CVVMsIDB4MjUsCQkJMHg5MCB9LAorCQl7IE9WNTExX1JFR19CVVMsIDB4MjAsCQkJMHgwMCB9LAorCQl7IE9WNTExX1JFR19CVVMsIDB4NTEsCQkJMHgwNCB9LAorCQl7IE9WNTExX1JFR19CVVMsIDB4NzEsCQkJMHgxOSB9LAorCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwKKwl9OworCisJc3RhdGljIHN0cnVjdCBvdjUxMV9yZWd2YWxzIGFSZWd2YWxzTm9ybTUxOFBsdXNbXSA9IHsKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMiB9LCAvKiBSZXNldCAqLworCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1NOQVAsCQkweDAxIH0sIC8qIEVuYWJsZSAqLworCQl7IE9WNTExX1JFR19CVVMsIDB4MzEsIAkJCTB4MGYgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDVkLAkJCTB4MDMgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDI0LAkJCTB4OWYgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDI1LAkJCTB4OTAgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDIwLAkJCTB4NjAgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDUxLAkJCTB4MDIgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDcxLAkJCTB4MTkgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDQwLAkJCTB4ZmYgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDQxLAkJCTB4NDIgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDQ2LAkJCTB4MDAgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDMzLAkJCTB4MDQgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDIxLAkJCTB4MTkgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDNmLAkJCTB4MTAgfSwKKwkJeyBPVjUxMV9ET05FX0JVUywgMHgwLCAweDAwIH0sCisJfTsKKworCVBERUJVRyg0LCAiIik7CisKKwkvKiBGaXJzdCA1IGJpdHMgb2YgY3VzdG9tIElEIHJlZyBhcmUgYSByZXZpc2lvbiBJRCBvbiBPVjUxOCAqLworCWluZm8oIkRldmljZSByZXZpc2lvbiAlZCIsIDB4MUYgJiByZWdfcihvdiwgUjUxMV9TWVNfQ1VTVF9JRCkpOworCisJLyogR2l2ZSBpdCB0aGUgZGVmYXVsdCBkZXNjcmlwdGlvbiAqLworCW92LT5kZXNjID0gc3ltYm9saWMoY2FtbGlzdCwgMCk7CisKKwlpZiAod3JpdGVfcmVndmFscyhvdiwgYVJlZ3ZhbHNJbml0NTE4KSkKKwkJZ290byBlcnJvcjsKKworCS8qIFNldCBMRUQgR1BJTyBwaW4gdG8gb3V0cHV0IG1vZGUgKi8KKwlpZiAocmVnX3dfbWFzayhvdiwgMHg1NywgMHgwMCwgMHgwMikgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogTEVEIGlzIG9mZiBieSBkZWZhdWx0IHdpdGggT1Y1MTg7IGhhdmUgdG8gZXhwbGljaXRseSB0dXJuIGl0IG9uICovCisJaWYgKG92LT5sZWRfcG9saWN5ID09IExFRF9PRkYgfHwgb3YtPmxlZF9wb2xpY3kgPT0gTEVEX0FVVE8pCisJCW92NTF4X2xlZF9jb250cm9sKG92LCAwKTsKKwllbHNlCisJCW92NTF4X2xlZF9jb250cm9sKG92LCAxKTsKKworCS8qIERvbid0IHJlcXVpcmUgY29tcHJlc3Npb24gaWYgZHVtcHBpeCBpcyBlbmFibGVkOyBvdGhlcndpc2UgaXQncworCSAqIHJlcXVpcmVkLiBPVjUxOCBoYXMgbm8gdW5jb21wcmVzc2VkIG1vZGUsIHRvIHNhdmUgUkFNLiAqLworCWlmICghZHVtcHBpeCAmJiAhb3YtPmNvbXByZXNzKSB7CisJCW92LT5jb21wcmVzcyA9IDE7CisJCXdhcm4oIkNvbXByZXNzaW9uIHJlcXVpcmVkIHdpdGggT1Y1MTguLi5lbmFibGluZyIpOworCX0KKworCWlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxOCkgeworCQlpZiAod3JpdGVfcmVndmFscyhvdiwgYVJlZ3ZhbHNOb3JtNTE4KSkKKwkJCWdvdG8gZXJyb3I7CisJfSBlbHNlIGlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxOFBMVVMpIHsKKwkJaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzTm9ybTUxOFBsdXMpKQorCQkJZ290byBlcnJvcjsKKwl9IGVsc2UgeworCQllcnIoIkludmFsaWQgYnJpZGdlIik7CisJfQorCisJaWYgKHJlZ193KG92LCAweDJmLCAweDgwKSA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAob3Y1MThfaW5pdF9jb21wcmVzc2lvbihvdikpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTgpCisJeworCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZwOworCQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQ7CisJCV9fdTE2IG14cHMgPSAwOworCisJCWlmcCA9IHVzYl9pZm51bV90b19pZihvdi0+ZGV2LCAwKTsKKwkJaWYgKGlmcCkgeworCQkJYWx0ID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGlmcCwgNyk7CisJCQlpZiAoYWx0KQorCQkJCW14cHMgPSBsZTE2X3RvX2NwdShhbHQtPmVuZHBvaW50WzBdLmRlc2Mud01heFBhY2tldFNpemUpOworCQl9CisKKwkJLyogU29tZSBPVjUxOHMgaGF2ZSBwYWNrZXQgbnVtYmVyaW5nIGJ5IGRlZmF1bHQsIHNvbWUgZG9uJ3QgKi8KKwkJaWYgKG14cHMgPT0gODk3KQorCQkJb3YtPnBhY2tldF9udW1iZXJpbmcgPSAxOworCQllbHNlCisJCQlvdi0+cGFja2V0X251bWJlcmluZyA9IDA7CisJfSBlbHNlIHsKKwkJLyogT1Y1MTgrIGhhcyBwYWNrZXQgbnVtYmVyaW5nIHR1cm5lZCBvbiBieSBkZWZhdWx0ICovCisJCW92LT5wYWNrZXRfbnVtYmVyaW5nID0gMTsKKwl9CisKKwlvdjUxOF9zZXRfcGFja2V0X3NpemUob3YsIDApOworCisJb3YtPnNuYXBfZW5hYmxlZCA9IHNuYXBzaG90OworCisJLyogVGVzdCBmb3IgNzZ4eCAqLworCW92LT5wcmltYXJ5X2kyY19zbGF2ZSA9IE9WN3h4MF9TSUQ7CisJaWYgKG92NTF4X3NldF9zbGF2ZV9pZHMob3YsIE9WN3h4MF9TSUQpIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFRoZSBPVjUxOCBtdXN0IGJlIG1vcmUgYWdncmVzc2l2ZSBhYm91dCBzZW5zb3IgZGV0ZWN0aW9uIHNpbmNlCisJICogSTJDIHdyaXRlIHdpbGwgbmV2ZXIgZmFpbCBpZiB0aGUgc2Vuc29yIGlzIG5vdCBwcmVzZW50LiBXZSBoYXZlCisJICogdG8gdHJ5IHRvIGluaXRpYWxpemUgdGhlIHNlbnNvciB0byBkZXRlY3QgaXRzIHByZXNlbmNlICovCisKKwlpZiAoaW5pdF9vdl9zZW5zb3Iob3YpIDwgMCkgeworCQkvKiBUZXN0IGZvciA2eHgwICovCisJCW92LT5wcmltYXJ5X2kyY19zbGF2ZSA9IE9WNnh4MF9TSUQ7CisJCWlmIChvdjUxeF9zZXRfc2xhdmVfaWRzKG92LCBPVjZ4eDBfU0lEKSA8IDApCisJCQlnb3RvIGVycm9yOworCisJCWlmIChpbml0X292X3NlbnNvcihvdikgPCAwKSB7CisJCQkvKiBUZXN0IGZvciA4eHgwICovCisJCQlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBPVjh4eDBfU0lEOworCQkJaWYgKG92NTF4X3NldF9zbGF2ZV9pZHMob3YsIE9WOHh4MF9TSUQpIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCisJCQlpZiAoaW5pdF9vdl9zZW5zb3Iob3YpIDwgMCkgeworCQkJCWVycigiQ2FuJ3QgZGV0ZXJtaW5lIHNlbnNvciBzbGF2ZSBJRHMiKTsKKyAJCQkJZ290byBlcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJZXJyKCJEZXRlY3RlZCB1bnN1cHBvcnRlZCBPVjh4eDAgc2Vuc29yIik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChvdjZ4eDBfY29uZmlndXJlKG92KSA8IDApIHsKKwkJCQllcnIoIkZhaWxlZCB0byBjb25maWd1cmUgT1Y2eHgwIik7CisgCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAob3Y3eHgwX2NvbmZpZ3VyZShvdikgPCAwKSB7CisJCQllcnIoIkZhaWxlZCB0byBjb25maWd1cmUgT1Y3eHgwIik7CisJIAkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCW92LT5tYXh3aWR0aCA9IDM1MjsKKwlvdi0+bWF4aGVpZ2h0ID0gMjg4OworCisJLy8gVGhlIE9WNTE4IGNhbm5vdCBnbyBhcyBsb3cgYXMgdGhlIHNlbnNvciBjYW4KKwlvdi0+bWlud2lkdGggPSAxNjA7CisJb3YtPm1pbmhlaWdodCA9IDEyMDsKKworCXJldHVybiAwOworCitlcnJvcjoKKwllcnIoIk9WNTE4IENvbmZpZyBmYWlsZWQiKTsKKworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgc3lzZnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9vdjUxMSAqY2RfdG9fb3Yoc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHRvX3ZpZGVvX2RldmljZShjZCk7CisJcmV0dXJuIHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2N1c3RvbV9pZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBvdi0+Y3VzdG9taWQpOworfSAKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihjdXN0b21faWQsIFNfSVJVR08sIHNob3dfY3VzdG9tX2lkLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19tb2RlbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBvdi0+ZGVzYyk7Cit9IAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG1vZGVsLCBTX0lSVUdPLCBzaG93X21vZGVsLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19icmlkZ2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IGNkX3RvX292KGNkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3ltYm9saWMoYnJnbGlzdCwgb3YtPmJyaWRnZSkpOworfSAKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihicmlkZ2UsIFNfSVJVR08sIHNob3dfYnJpZGdlLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19zZW5zb3Ioc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IGNkX3RvX292KGNkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3ltYm9saWMoc2VubGlzdCwgb3YtPnNlbnNvcikpOworfSAKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihzZW5zb3IsIFNfSVJVR08sIHNob3dfc2Vuc29yLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19icmlnaHRuZXNzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSBjZF90b19vdihjZCk7CisJdW5zaWduZWQgc2hvcnQgeDsKKworCWlmICghb3YtPmRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisJc2Vuc29yX2dldF9icmlnaHRuZXNzKG92LCAmeCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHggPj4gOCk7Cit9IAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGJyaWdodG5lc3MsIFNfSVJVR08sIHNob3dfYnJpZ2h0bmVzcywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2F0dXJhdGlvbihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOworCXVuc2lnbmVkIHNob3J0IHg7CisKKwlpZiAoIW92LT5kZXYpCisJCXJldHVybiAtRU5PREVWOworCXNlbnNvcl9nZXRfc2F0dXJhdGlvbihvdiwgJngpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB4ID4+IDgpOworfSAKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihzYXR1cmF0aW9uLCBTX0lSVUdPLCBzaG93X3NhdHVyYXRpb24sIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2NvbnRyYXN0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSBjZF90b19vdihjZCk7CisJdW5zaWduZWQgc2hvcnQgeDsKKworCWlmICghb3YtPmRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisJc2Vuc29yX2dldF9jb250cmFzdChvdiwgJngpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB4ID4+IDgpOworfSAKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihjb250cmFzdCwgU19JUlVHTywgc2hvd19jb250cmFzdCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaHVlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSBjZF90b19vdihjZCk7CisJdW5zaWduZWQgc2hvcnQgeDsKKworCWlmICghb3YtPmRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisJc2Vuc29yX2dldF9odWUob3YsICZ4KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgeCA+PiA4KTsKK30gCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoaHVlLCBTX0lSVUdPLCBzaG93X2h1ZSwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZXhwb3N1cmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IGNkX3RvX292KGNkKTsKKwl1bnNpZ25lZCBjaGFyIGV4cDsKKworCWlmICghb3YtPmRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisJc2Vuc29yX2dldF9leHBvc3VyZShvdiwgJmV4cCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGV4cCA+PiA4KTsKK30gCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZXhwb3N1cmUsIFNfSVJVR08sIHNob3dfZXhwb3N1cmUsIE5VTEwpOworCitzdGF0aWMgdm9pZCBvdl9jcmVhdGVfc3lzZnMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3sKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2N1c3RvbV9pZCk7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9tb2RlbCk7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9icmlkZ2UpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfc2Vuc29yKTsKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JyaWdodG5lc3MpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfc2F0dXJhdGlvbik7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9jb250cmFzdCk7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9odWUpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZXhwb3N1cmUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFVTQiByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorb3Y1MXhfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppZGVzYzsKKwlzdHJ1Y3QgdXNiX292NTExICpvdjsKKwlpbnQgaTsKKworCVBERUJVRygxLCAicHJvYmluZyBmb3IgZGV2aWNlLi4uIik7CisKKwkvKiBXZSBkb24ndCBoYW5kbGUgbXVsdGktY29uZmlnIGNhbWVyYXMgKi8KKwlpZiAoZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlkZXNjID0gJmludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjOworCisJaWYgKGlkZXNjLT5iSW50ZXJmYWNlQ2xhc3MgIT0gMHhGRikKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGlkZXNjLT5iSW50ZXJmYWNlU3ViQ2xhc3MgIT0gMHgwMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKG92ID0ga21hbGxvYyhzaXplb2YoKm92KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJZXJyKCJjb3VsZG4ndCBrbWFsbG9jIG92IHN0cnVjdCIpOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwltZW1zZXQob3YsIDAsIHNpemVvZigqb3YpKTsKKworCW92LT5kZXYgPSBkZXY7CisJb3YtPmlmYWNlID0gaWRlc2MtPmJJbnRlcmZhY2VOdW1iZXI7CisJb3YtPmxlZF9wb2xpY3kgPSBsZWQ7CisJb3YtPmNvbXByZXNzID0gY29tcHJlc3M7CisJb3YtPmxpZ2h0ZnJlcSA9IGxpZ2h0ZnJlcTsKKwlvdi0+bnVtX2lucHV0cyA9IDE7CSAgIC8qIFZpZGVvIGRlY29kZXIgaW5pdCBmdW5jdHMuIGNoYW5nZSB0aGlzICovCisJb3YtPnN0b3BfZHVyaW5nX3NldCA9ICFmYXN0c2V0OworCW92LT5iYWNrbGlnaHQgPSBiYWNrbGlnaHQ7CisJb3YtPm1pcnJvciA9IG1pcnJvcjsKKwlvdi0+YXV0b19icnQgPSBhdXRvYnJpZ2h0OworCW92LT5hdXRvX2dhaW4gPSBhdXRvZ2FpbjsKKwlvdi0+YXV0b19leHAgPSBhdXRvZXhwOworCisJc3dpdGNoIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSkgeworCWNhc2UgUFJPRF9PVjUxMToKKwkJb3YtPmJyaWRnZSA9IEJSR19PVjUxMTsKKwkJb3YtPmJjbGFzcyA9IEJDTF9PVjUxMTsKKwkJYnJlYWs7CisJY2FzZSBQUk9EX09WNTExUExVUzoKKwkJb3YtPmJyaWRnZSA9IEJSR19PVjUxMVBMVVM7CisJCW92LT5iY2xhc3MgPSBCQ0xfT1Y1MTE7CisJCWJyZWFrOworCWNhc2UgUFJPRF9PVjUxODoKKwkJb3YtPmJyaWRnZSA9IEJSR19PVjUxODsKKwkJb3YtPmJjbGFzcyA9IEJDTF9PVjUxODsKKwkJYnJlYWs7CisJY2FzZSBQUk9EX09WNTE4UExVUzoKKwkJb3YtPmJyaWRnZSA9IEJSR19PVjUxOFBMVVM7CisJCW92LT5iY2xhc3MgPSBCQ0xfT1Y1MTg7CisJCWJyZWFrOworCWNhc2UgUFJPRF9NRTJDQU06CisJCWlmIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpICE9IFZFTkRfTUFUVEVMKQorCQkJZ290byBlcnJvcjsKKwkJb3YtPmJyaWRnZSA9IEJSR19PVjUxMVBMVVM7CisJCW92LT5iY2xhc3MgPSBCQ0xfT1Y1MTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycigiVW5rbm93biBwcm9kdWN0IElEIDB4JTA0eCIsIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpbmZvKCJVU0IgJXMgdmlkZW8gZGV2aWNlIGZvdW5kIiwgc3ltYm9saWMoYnJnbGlzdCwgb3YtPmJyaWRnZSkpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmb3YtPndxKTsKKworCWluaXRfTVVURVgoJm92LT5sb2NrKTsJLyogdG8gMSA9PSBhdmFpbGFibGUgKi8KKwlpbml0X01VVEVYKCZvdi0+YnVmX2xvY2spOworCWluaXRfTVVURVgoJm92LT5wYXJhbV9sb2NrKTsKKwlpbml0X01VVEVYKCZvdi0+aTJjX2xvY2spOworCWluaXRfTVVURVgoJm92LT5jYnVmX2xvY2spOworCisJb3YtPmJ1Zl9zdGF0ZSA9IEJVRl9OT1RfQUxMT0NBVEVEOworCisJaWYgKHVzYl9tYWtlX3BhdGgoZGV2LCBvdi0+dXNiX3BhdGgsIE9WNTExX1VTQl9QQVRIX0xFTikgPCAwKSB7CisJCWVycigidXNiX21ha2VfcGF0aCBlcnJvciIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIEFsbG9jYXRlIGNvbnRyb2wgdHJhbnNmZXIgYnVmZmVyLiAqLworCS8qIE11c3QgYmUga21hbGxvYygpJ2VkLCBmb3IgRE1BIGNvbXBhdGliaWxpdHkgKi8KKwlvdi0+Y2J1ZiA9IGttYWxsb2MoT1Y1MTFfQ0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW92LT5jYnVmKQorCQlnb3RvIGVycm9yOworCisJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KSB7CisJCWlmIChvdjUxOF9jb25maWd1cmUob3YpIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfSBlbHNlIHsKKwkJaWYgKG92NTExX2NvbmZpZ3VyZShvdikgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgT1Y1MTFfTlVNRlJBTUVTOyBpKyspIHsKKwkJb3YtPmZyYW1lW2ldLmZyYW1lbnVtID0gaTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmb3YtPmZyYW1lW2ldLndxKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgT1Y1MTFfTlVNU0JVRjsgaSsrKSB7CisJCW92LT5zYnVmW2ldLm92ID0gb3Y7CisJCXNwaW5fbG9ja19pbml0KCZvdi0+c2J1ZltpXS5sb2NrKTsKKwkJb3YtPnNidWZbaV0ubiA9IGk7CisJfQorCisJLyogVW5uZWNlc3Nhcnk/IChUaGlzIGlzIGRvbmUgb24gb3BlbigpLiBOZWVkIHRvIG1ha2Ugc3VyZSB2YXJpYWJsZXMKKwkgKiBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgd2l0aG91dCB0aGlzIGJlZm9yZSByZW1vdmluZyBpdCwgdGhvdWdoKS4gKi8KKwlpZiAob3Y1MXhfc2V0X2RlZmF1bHRfcGFyYW1zKG92KSA8IDApCisJCWdvdG8gZXJyb3I7CisKKyNpZmRlZiBPVjUxMV9ERUJVRworCWlmIChkdW1wX2JyaWRnZSkgeworCQlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTEpCisJCQlvdjUxMV9kdW1wX3JlZ3Mob3YpOworCQllbHNlCisJCQlvdjUxOF9kdW1wX3JlZ3Mob3YpOworCX0KKyNlbmRpZgorCisJb3YtPnZkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoIW92LT52ZGV2KQorCQlnb3RvIGVycm9yOworCisJbWVtY3B5KG92LT52ZGV2LCAmdmRldl90ZW1wbGF0ZSwgc2l6ZW9mKCpvdi0+dmRldikpOworCW92LT52ZGV2LT5kZXYgPSAmZGV2LT5kZXY7CisJdmlkZW9fc2V0X2RydmRhdGEob3YtPnZkZXYsIG92KTsKKworCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9NQVhfVU5JVF9WSURFTzsgaSsrKSB7CisJCS8qIE1pbm9yIDAgY2Fubm90IGJlIHNwZWNpZmllZDsgYXNzdW1lIHVzZXIgd2FudHMgYXV0b2RldGVjdCAqLworCQlpZiAodW5pdF92aWRlb1tpXSA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShvdi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwKKwkJCXVuaXRfdmlkZW9baV0pID49IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogVXNlIHRoZSBuZXh0IGF2YWlsYWJsZSBvbmUgKi8KKwlpZiAoKG92LT52ZGV2LT5taW5vciA9PSAtMSkgJiYKKwkgICAgdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKG92LT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSkgPCAwKSB7CisJCWVycigidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZCIpOworCQlnb3RvIGVycm9yOworCX0KKworCWluZm8oIkRldmljZSBhdCAlcyByZWdpc3RlcmVkIHRvIG1pbm9yICVkIiwgb3YtPnVzYl9wYXRoLAorCSAgICAgb3YtPnZkZXYtPm1pbm9yKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgb3YpOworCW92X2NyZWF0ZV9zeXNmcyhvdi0+dmRldik7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWlmIChvdi0+dmRldikgeworCQlpZiAoLTEgPT0gb3YtPnZkZXYtPm1pbm9yKQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2Uob3YtPnZkZXYpOworCQllbHNlCisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShvdi0+dmRldik7CisJCW92LT52ZGV2ID0gTlVMTDsKKwl9CisKKwlpZiAob3YtPmNidWYpIHsKKwkJZG93bigmb3YtPmNidWZfbG9jayk7CisJCWtmcmVlKG92LT5jYnVmKTsKKwkJb3YtPmNidWYgPSBOVUxMOworCQl1cCgmb3YtPmNidWZfbG9jayk7CisJfQorCisJaWYgKG92KSB7CisJCWtmcmVlKG92KTsKKwkJb3YgPSBOVUxMOworCX0KKworZXJyb3Jfb3V0OgorCWVycigiQ2FtZXJhIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgdm9pZAorb3Y1MXhfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJaW50IG47CisKKwlQREVCVUcoMywgIiIpOworCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CisKKwlpZiAoIW92KQorCQlyZXR1cm47CisKKwlpZiAob3YtPnZkZXYpCisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKG92LT52ZGV2KTsKKworCWZvciAobiA9IDA7IG4gPCBPVjUxMV9OVU1GUkFNRVM7IG4rKykKKwkJb3YtPmZyYW1lW25dLmdyYWJzdGF0ZSA9IEZSQU1FX0VSUk9SOworCisJb3YtPmN1cmZyYW1lID0gLTE7CisKKwkvKiBUaGlzIHdpbGwgY2F1c2UgdGhlIHByb2Nlc3MgdG8gcmVxdWVzdCBhbm90aGVyIGZyYW1lICovCisJZm9yIChuID0gMDsgbiA8IE9WNTExX05VTUZSQU1FUzsgbisrKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm92LT5mcmFtZVtuXS53cSk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJm92LT53cSk7CisKKwlvdi0+c3RyZWFtaW5nID0gMDsKKwlvdjUxeF91bmxpbmtfaXNvYyhvdik7CisKKwlvdi0+ZGV2ID0gTlVMTDsKKworCS8qIEZyZWUgdGhlIG1lbW9yeSAqLworCWlmIChvdiAmJiAhb3YtPnVzZXIpIHsKKwkJZG93bigmb3YtPmNidWZfbG9jayk7CisJCWtmcmVlKG92LT5jYnVmKTsKKwkJb3YtPmNidWYgPSBOVUxMOworCQl1cCgmb3YtPmNidWZfbG9jayk7CisKKwkJb3Y1MXhfZGVhbGxvYyhvdik7CisJCWtmcmVlKG92KTsKKwkJb3YgPSBOVUxMOworCX0KKworCVBERUJVRygzLCAiRGlzY29ubmVjdCBjb21wbGV0ZSIpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgb3Y1MTFfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJvdjUxMSIsCisJLmlkX3RhYmxlID0JZGV2aWNlX3RhYmxlLAorCS5wcm9iZSA9CW92NTF4X3Byb2JlLAorCS5kaXNjb25uZWN0ID0Jb3Y1MXhfZGlzY29ubmVjdAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgTW9kdWxlIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmV0dXJucyAwIGZvciBzdWNjZXNzICovCitpbnQKK292NTExX3JlZ2lzdGVyX2RlY29tcF9tb2R1bGUoaW50IHZlciwgc3RydWN0IG92NTF4X2RlY29tcF9vcHMgKm9wcywgaW50IG92NTE4LAorCQkJICAgICBpbnQgbW14KQoreworCWlmICh2ZXIgIT0gREVDT01QX0lOVEVSRkFDRV9WRVIpIHsKKwkJZXJyKCJEZWNvbXByZXNzaW9uIG1vZHVsZSBoYXMgaW5jb21wYXRpYmxlIik7CisJCWVycigiaW50ZXJmYWNlIHZlcnNpb24gJWQiLCB2ZXIpOworCQllcnIoIkludGVyZmFjZSB2ZXJzaW9uICVkIGlzIHJlcXVpcmVkIiwgREVDT01QX0lOVEVSRkFDRV9WRVIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIW9wcykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobW14ICYmICFvdjUxeF9tbXhfYXZhaWxhYmxlKSB7CisJCWVycigiTU1YIG5vdCBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0gb3Iga2VybmVsIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxvY2tfa2VybmVsKCk7CisKKwlpZiAob3Y1MTgpIHsKKwkJaWYgKG1teCkgeworCQkJaWYgKG92NTE4X21teF9kZWNvbXBfb3BzKQorCQkJCWdvdG8gZXJyX2luX3VzZTsKKwkJCWVsc2UKKwkJCQlvdjUxOF9tbXhfZGVjb21wX29wcyA9IG9wczsKKwkJfSBlbHNlIHsKKwkJCWlmIChvdjUxOF9kZWNvbXBfb3BzKQorCQkJCWdvdG8gZXJyX2luX3VzZTsKKwkJCWVsc2UKKwkJCQlvdjUxOF9kZWNvbXBfb3BzID0gb3BzOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG1teCkgeworCQkJaWYgKG92NTExX21teF9kZWNvbXBfb3BzKQorCQkJCWdvdG8gZXJyX2luX3VzZTsKKwkJCWVsc2UKKwkJCQlvdjUxMV9tbXhfZGVjb21wX29wcyA9IG9wczsKKwkJfSBlbHNlIHsKKwkJCWlmIChvdjUxMV9kZWNvbXBfb3BzKQorCQkJCWdvdG8gZXJyX2luX3VzZTsKKwkJCWVsc2UKKwkJCQlvdjUxMV9kZWNvbXBfb3BzID0gb3BzOworCQl9CisJfQorCisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworCitlcnJfaW5fdXNlOgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gLUVCVVNZOworfQorCit2b2lkCitvdjUxMV9kZXJlZ2lzdGVyX2RlY29tcF9tb2R1bGUoaW50IG92NTE4LCBpbnQgbW14KQoreworCWxvY2tfa2VybmVsKCk7CisKKwlpZiAob3Y1MTgpIHsKKwkJaWYgKG1teCkKKwkJCW92NTE4X21teF9kZWNvbXBfb3BzID0gTlVMTDsKKwkJZWxzZQorCQkJb3Y1MThfZGVjb21wX29wcyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaWYgKG1teCkKKwkJCW92NTExX21teF9kZWNvbXBfb3BzID0gTlVMTDsKKwkJZWxzZQorCQkJb3Y1MTFfZGVjb21wX29wcyA9IE5VTEw7CisJfQorCisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMgaW50IF9faW5pdAordXNiX292NTExX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZvdjUxMV9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJaW5mbyhEUklWRVJfVkVSU0lPTiAiIDogIiBEUklWRVJfREVTQyk7CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3VzYl9vdjUxMV9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJm92NTExX2RyaXZlcik7CisJaW5mbygiZHJpdmVyIGRlcmVnaXN0ZXJlZCIpOworCit9CisKK21vZHVsZV9pbml0KHVzYl9vdjUxMV9pbml0KTsKK21vZHVsZV9leGl0KHVzYl9vdjUxMV9leGl0KTsKKworRVhQT1JUX1NZTUJPTChvdjUxMV9yZWdpc3Rlcl9kZWNvbXBfbW9kdWxlKTsKK0VYUE9SVF9TWU1CT0wob3Y1MTFfZGVyZWdpc3Rlcl9kZWNvbXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL292NTExLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9vdjUxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NjUwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9vdjUxMS5oCkBAIC0wLDAgKzEsNTY5IEBACisjaWZuZGVmIF9fTElOVVhfT1Y1MTFfSAorI2RlZmluZSBfX0xJTlVYX09WNTExX0gKKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjZGVmaW5lIE9WNTExX0RFQlVHCS8qIFR1cm4gb24gZGVidWcgbWVzc2FnZXMgKi8KKworI2lmZGVmIE9WNTExX0RFQlVHCisJI2RlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAorCQlpZiAoZGVidWcgPj0gKGxldmVsKSkgaW5mbygiWyVzOiVkXSAiIGZtdCwgXAorCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fICwgIyMgYXJncykKKyNlbHNlCisJI2RlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCisvKiBUaGlzIG1hY3JvIHJlc3RyaWN0cyBhbiBpbnQgdmFyaWFibGUgdG8gYW4gaW5jbHVzaXZlIHJhbmdlICovCisjZGVmaW5lIFJFU1RSSUNUX1RPX1JBTkdFKHYsbWksbWEpIHsgXAorCWlmICgodikgPCAobWkpKSAodikgPSAobWkpOyBcCisJZWxzZSBpZiAoKHYpID4gKG1hKSkgKHYpID0gKG1hKTsgXAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIERFRklORVMgRk9SIE9WNTExIEFORCBPVEhFUiBDSElQUyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFVTQiBJRHMgKi8KKyNkZWZpbmUgVkVORF9PTU5JVklTSU9OCTB4MDVBOQorI2RlZmluZSBQUk9EX09WNTExCTB4MDUxMQorI2RlZmluZSBQUk9EX09WNTExUExVUwkweEE1MTEKKyNkZWZpbmUgUFJPRF9PVjUxOAkweDA1MTgKKyNkZWZpbmUgUFJPRF9PVjUxOFBMVVMJMHhBNTE4CisKKyNkZWZpbmUgVkVORF9NQVRURUwJMHgwODEzCisjZGVmaW5lIFBST0RfTUUyQ0FNCTB4MDAwMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICBPVjUxeCBSRUdJU1RFUiBNTkVNT05JQ1MgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENhbWVyYSBpbnRlcmZhY2UgcmVnaXN0ZXIgbnVtYmVycyAqLworI2RlZmluZSBSNTExX0NBTV9ERUxBWQkJMHgxMAorI2RlZmluZSBSNTExX0NBTV9FREdFCQkweDExCisjZGVmaW5lIFI1MTFfQ0FNX1BYQ05UCQkweDEyCisjZGVmaW5lIFI1MTFfQ0FNX0xOQ05UCQkweDEzCisjZGVmaW5lIFI1MTFfQ0FNX1BYRElWCQkweDE0CisjZGVmaW5lIFI1MTFfQ0FNX0xORElWCQkweDE1CisjZGVmaW5lIFI1MTFfQ0FNX1VWX0VOCQkweDE2CisjZGVmaW5lIFI1MTFfQ0FNX0xJTkVfTU9ERQkweDE3CisjZGVmaW5lIFI1MTFfQ0FNX09QVFMJCTB4MTgKKworLyogU25hcHNob3QgbW9kZSBjYW1lcmEgaW50ZXJmYWNlIHJlZ2lzdGVyIG51bWJlcnMgKi8KKyNkZWZpbmUgUjUxMV9TTkFQX0ZSQU1FCQkweDE5CisjZGVmaW5lIFI1MTFfU05BUF9QWENOVAkJMHgxQQorI2RlZmluZSBSNTExX1NOQVBfTE5DTlQJCTB4MUIKKyNkZWZpbmUgUjUxMV9TTkFQX1BYRElWCQkweDFDCisjZGVmaW5lIFI1MTFfU05BUF9MTkRJVgkJMHgxRAorI2RlZmluZSBSNTExX1NOQVBfVVZfRU4JCTB4MUUKKyNkZWZpbmUgUjUxMV9TTkFQX09QVFMJCTB4MUYKKworLyogRFJBTSByZWdpc3RlciBudW1iZXJzICovCisjZGVmaW5lIFI1MTFfRFJBTV9GTE9XX0NUTAkweDIwCisjZGVmaW5lIFI1MTFfRFJBTV9BUkNQCQkweDIxCisjZGVmaW5lIFI1MTFfRFJBTV9NUkMJCTB4MjIKKyNkZWZpbmUgUjUxMV9EUkFNX1JGQwkJMHgyMworCisvKiBJU08gRklGTyByZWdpc3RlciBudW1iZXJzICovCisjZGVmaW5lIFI1MXhfRklGT19QU0laRQkJMHgzMAkvKiAyIGJ5dGVzIHdpZGUgdy8gT1Y1MTgoKykgKi8KKyNkZWZpbmUgUjUxMV9GSUZPX09QVFMJCTB4MzEKKworLyogUGFyYWxsZWwgSU8gcmVnaXN0ZXIgbnVtYmVycyAqLworI2RlZmluZSBSNTExX1BJT19PUFRTCQkweDM4CisjZGVmaW5lIFI1MTFfUElPX0RBVEEJCTB4MzkKKyNkZWZpbmUgUjUxMV9QSU9fQklTVAkJMHgzRQorI2RlZmluZSBSNTE4X0dQSU9fSU4JCTB4NTUJLyogT1Y1MTgoKykgb25seSAqLworI2RlZmluZSBSNTE4X0dQSU9fT1VUCQkweDU2CS8qIE9WNTE4KCspIG9ubHkgKi8KKyNkZWZpbmUgUjUxOF9HUElPX0NUTAkJMHg1NwkvKiBPVjUxOCgrKSBvbmx5ICovCisjZGVmaW5lIFI1MThfR1BJT19QVUxTRV9JTgkweDU4CS8qIE9WNTE4KCspIG9ubHkgKi8KKyNkZWZpbmUgUjUxOF9HUElPX1BVTFNFX0NMRUFSCTB4NTkJLyogT1Y1MTgoKykgb25seSAqLworI2RlZmluZSBSNTE4X0dQSU9fUFVMU0VfUE9MCTB4NWEJLyogT1Y1MTgoKykgb25seSAqLworI2RlZmluZSBSNTE4X0dQSU9fUFVMU0VfRU4JMHg1YgkvKiBPVjUxOCgrKSBvbmx5ICovCisjZGVmaW5lIFI1MThfR1BJT19SRVNFVAkJMHg1YwkvKiBPVjUxOCgrKSBvbmx5ICovCisKKy8qIEkyQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUjUxMV9JMkNfQ1RMCQkweDQwCisjZGVmaW5lIFI1MThfSTJDX0NUTAkJMHg0NwkvKiBPVjUxOCgrKSBvbmx5ICovCisjZGVmaW5lIFI1MXhfSTJDX1dfU0lECQkweDQxCisjZGVmaW5lIFI1MXhfSTJDX1NBRERSXzMJMHg0MgorI2RlZmluZSBSNTF4X0kyQ19TQUREUl8yCTB4NDMKKyNkZWZpbmUgUjUxeF9JMkNfUl9TSUQJCTB4NDQKKyNkZWZpbmUgUjUxeF9JMkNfREFUQQkJMHg0NQorI2RlZmluZSBSNTF4X0kyQ19DTE9DSwkJMHg0NgorI2RlZmluZSBSNTF4X0kyQ19USU1FT1VUCTB4NDcKKworLyogSTJDIHNuYXBzaG90IHJlZ2lzdGVycyAqLworI2RlZmluZSBSNTExX1NJMkNfU0FERFJfMwkweDQ4CisjZGVmaW5lIFI1MTFfU0kyQ19EQVRBCQkweDQ5CisKKy8qIFN5c3RlbSBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBSNTF4X1NZU19SRVNFVAkJMHg1MAorCQkvKiBSZXNldCB0eXBlIGRlZmluaXRpb25zICovCisjZGVmaW5lIAlPVjUxMV9SRVNFVF9VREMJCTB4MDEKKyNkZWZpbmUgCU9WNTExX1JFU0VUX0kyQwkJMHgwMgorI2RlZmluZSAJT1Y1MTFfUkVTRVRfRklGTwkweDA0CisjZGVmaW5lIAlPVjUxMV9SRVNFVF9PTU5JQ0UJMHgwOAorI2RlZmluZSAJT1Y1MTFfUkVTRVRfRFJBTQkweDEwCisjZGVmaW5lIAlPVjUxMV9SRVNFVF9DQU1fSU5UCTB4MjAKKyNkZWZpbmUgCU9WNTExX1JFU0VUX09WNTExCTB4NDAKKyNkZWZpbmUgCU9WNTExX1JFU0VUX05PUkVHUwkweDNGIC8qIEFsbCBidXQgT1Y1MTEgJiByZWdzICovCisjZGVmaW5lIAlPVjUxMV9SRVNFVF9BTEwJCTB4N0YKKworI2RlZmluZSBSNTExX1NZU19DTE9DS19ESVYJMHg1MQorI2RlZmluZSBSNTF4X1NZU19TTkFQCQkweDUyCisjZGVmaW5lIFI1MXhfU1lTX0lOSVQgICAgICAgICAJMHg1MworI2RlZmluZSBSNTExX1NZU19QV1JfQ0xLCTB4NTQgLyogT1Y1MTErL09WNTE4KCspIG9ubHkgKi8KKyNkZWZpbmUgUjUxMV9TWVNfTEVEX0NUTAkweDU1IC8qIE9WNTExKyBvbmx5ICovCisjZGVmaW5lIFI1MTFfU1lTX1VTRVIJCTB4NUUKKyNkZWZpbmUgUjUxMV9TWVNfQ1VTVF9JRAkweDVGCisKKy8qIE9tbmlDRSAoY29tcHJlc3Npb24pIHJlZ2lzdGVycyAqLworI2RlZmluZSBSNTExX0NPTVBfUEhZCQkweDcwCisjZGVmaW5lIFI1MTFfQ09NUF9QSFVWCQkweDcxCisjZGVmaW5lIFI1MTFfQ09NUF9QVlkJCTB4NzIKKyNkZWZpbmUgUjUxMV9DT01QX1BWVVYJCTB4NzMKKyNkZWZpbmUgUjUxMV9DT01QX1FIWQkJMHg3NAorI2RlZmluZSBSNTExX0NPTVBfUUhVVgkJMHg3NQorI2RlZmluZSBSNTExX0NPTVBfUVZZCQkweDc2CisjZGVmaW5lIFI1MTFfQ09NUF9RVlVWCQkweDc3CisjZGVmaW5lIFI1MTFfQ09NUF9FTgkJMHg3OAorI2RlZmluZSBSNTExX0NPTVBfTFVUX0VOCTB4NzkJCQorI2RlZmluZSBSNTExX0NPTVBfTFVUX0JFR0lOCTB4ODAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgICAgIEFMVEVSTkFURSBOVU1CRVJTICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBBbHRlcm5hdGUgbnVtYmVycyBmb3IgdmFyaW91cyBtYXggcGFja2V0IHNpemVzIChPVjUxMSBvbmx5KSAqLworI2RlZmluZSBPVjUxMV9BTFRfU0laRV85OTIJMAorI2RlZmluZSBPVjUxMV9BTFRfU0laRV85OTMJMQorI2RlZmluZSBPVjUxMV9BTFRfU0laRV83NjgJMgorI2RlZmluZSBPVjUxMV9BTFRfU0laRV83NjkJMworI2RlZmluZSBPVjUxMV9BTFRfU0laRV81MTIJNAorI2RlZmluZSBPVjUxMV9BTFRfU0laRV81MTMJNQorI2RlZmluZSBPVjUxMV9BTFRfU0laRV8yNTcJNgorI2RlZmluZSBPVjUxMV9BTFRfU0laRV8wCTcKKworLyogQWx0ZXJuYXRlIG51bWJlcnMgZm9yIHZhcmlvdXMgbWF4IHBhY2tldCBzaXplcyAoT1Y1MTErIG9ubHkpICovCisjZGVmaW5lIE9WNTExUExVU19BTFRfU0laRV8wCTAKKyNkZWZpbmUgT1Y1MTFQTFVTX0FMVF9TSVpFXzMzCTEKKyNkZWZpbmUgT1Y1MTFQTFVTX0FMVF9TSVpFXzEyOQkyCisjZGVmaW5lIE9WNTExUExVU19BTFRfU0laRV8yNTcJMworI2RlZmluZSBPVjUxMVBMVVNfQUxUX1NJWkVfMzg1CTQKKyNkZWZpbmUgT1Y1MTFQTFVTX0FMVF9TSVpFXzUxMwk1CisjZGVmaW5lIE9WNTExUExVU19BTFRfU0laRV83NjkJNgorI2RlZmluZSBPVjUxMVBMVVNfQUxUX1NJWkVfOTYxCTcKKworLyogQWx0ZXJuYXRlIG51bWJlcnMgZm9yIHZhcmlvdXMgbWF4IHBhY2tldCBzaXplcyAoT1Y1MTgoKykgb25seSkgKi8KKyNkZWZpbmUgT1Y1MThfQUxUX1NJWkVfMAkwCisjZGVmaW5lIE9WNTE4X0FMVF9TSVpFXzEyOAkxCisjZGVmaW5lIE9WNTE4X0FMVF9TSVpFXzI1NgkyCisjZGVmaW5lIE9WNTE4X0FMVF9TSVpFXzM4NAkzCisjZGVmaW5lIE9WNTE4X0FMVF9TSVpFXzUxMgk0CisjZGVmaW5lIE9WNTE4X0FMVF9TSVpFXzY0MAk1CisjZGVmaW5lIE9WNTE4X0FMVF9TSVpFXzc2OAk2CisjZGVmaW5lIE9WNTE4X0FMVF9TSVpFXzg5Ngk3CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgIE9WNzYxMCBSRUdJU1RFUiBNTkVNT05JQ1MgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogT1Y3NjEwIHJlZ2lzdGVycyAqLworI2RlZmluZSBPVjc2MTBfUkVHX0dBSU4gICAgICAgICAgMHgwMAkvKiBnYWluIHNldHRpbmcgKDU6MCkgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19CTFVFICAgICAgICAgIDB4MDEJLyogYmx1ZSBjaGFubmVsIGJhbGFuY2UgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19SRUQgICAgICAgICAgIDB4MDIJLyogcmVkIGNoYW5uZWwgYmFsYW5jZSAqLworI2RlZmluZSBPVjc2MTBfUkVHX1NBVCAgICAgICAgICAgMHgwMwkvKiBzYXR1cmF0aW9uICovCisJCQkJCS8qIDA0IHJlc2VydmVkICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ05UICAgICAgICAgICAweDA1CS8qIFkgY29udHJhc3QgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19CUlQgICAgICAgICAgIDB4MDYJLyogWSBicmlnaHRuZXNzICovCisJCQkJCS8qIDA4LTBiIHJlc2VydmVkICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQkxVRV9CSUFTICAgICAweDBDCS8qIGJsdWUgY2hhbm5lbCBiaWFzICg1OjApICovCisjZGVmaW5lIE9WNzYxMF9SRUdfUkVEX0JJQVMgICAgICAweDBECS8qIHJlYWQgY2hhbm5lbCBiaWFzICg1OjApICovCisjZGVmaW5lIE9WNzYxMF9SRUdfR0FNTUFfQ09FRkYgICAweDBFCS8qIGdhbW1hIHNldHRpbmdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfV0JfUkFOR0UgICAgICAweDBGCS8qIEFFQy9BTEMvUy1BV0Igc2V0dGluZ3MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19FWFAgICAgICAgICAgIDB4MTAJLyogbWFudWFsIGV4cG9zdXJlIHNldHRpbmcgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19DTE9DSyAgICAgICAgIDB4MTEJLyogcG9sYXJpdHkvY2xvY2sgcHJlc2NhbGVyICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0EgICAgICAgICAweDEyCS8qIG1pc2MgY29tbW9uIHJlZ3MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19DT01fQiAgICAgICAgIDB4MTMJLyogbWlzYyBjb21tb24gcmVncyAqLworI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9DICAgICAgICAgMHgxNAkvKiBtaXNjIGNvbW1vbiByZWdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0QgICAgICAgICAweDE1CS8qIG1pc2MgY29tbW9uIHJlZ3MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19GSUVMRF9ESVZJREUgIDB4MTYJLyogZmllbGQgaW50ZXJ2YWwvbW9kZSBzZXR0aW5ncyAqLworI2RlZmluZSBPVjc2MTBfUkVHX0hXSU5fU1RBUlQgICAgMHgxNwkvKiBob3Jpem9udGFsIHdpbmRvdyBzdGFydCAqLworI2RlZmluZSBPVjc2MTBfUkVHX0hXSU5fRU5EICAgICAgMHgxOAkvKiBob3Jpem9udGFsIHdpbmRvdyBlbmQgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19WV0lOX1NUQVJUICAgIDB4MTkJLyogdmVydGljYWwgd2luZG93IHN0YXJ0ICovCisjZGVmaW5lIE9WNzYxMF9SRUdfVldJTl9FTkQgICAgICAweDFBCS8qIHZlcnRpY2FsIHdpbmRvdyBlbmQgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19QSVhFTF9TSElGVCAgIDB4MUIJLyogcGl4ZWwgc2hpZnQgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19JRF9ISUdIICAgICAgIDB4MUMJLyogbWFudWZhY3R1cmVyIElEIE1TQiAqLworI2RlZmluZSBPVjc2MTBfUkVHX0lEX0xPVyAgICAgICAgMHgxRAkvKiBtYW51ZmFjdHVyZXIgSUQgTFNCICovCisJCQkJCS8qIDBlLTBmIHJlc2VydmVkICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0UgICAgICAgICAweDIwCS8qIG1pc2MgY29tbW9uIHJlZ3MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19ZT0ZGU0VUICAgICAgIDB4MjEJLyogWSBjaGFubmVsIG9mZnNldCAqLworI2RlZmluZSBPVjc2MTBfUkVHX1VPRkZTRVQgICAgICAgMHgyMgkvKiBVIGNoYW5uZWwgb2Zmc2V0ICovCisJCQkJCS8qIDIzIHJlc2VydmVkICovCisjZGVmaW5lIE9WNzYxMF9SRUdfRUNXICAgICAgICAgICAweDI0CS8qIEV4cG9zdXJlIHdoaXRlIGxldmVsIGZvciBBRUMgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19FQ0IgICAgICAgICAgIDB4MjUJLyogRXhwb3N1cmUgYmxhY2sgbGV2ZWwgZm9yIEFFQyAqLworI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9GICAgICAgICAgMHgyNgkvKiBtaXNjIHNldHRpbmdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0cgICAgICAgICAweDI3CS8qIG1pc2Mgc2V0dGluZ3MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19DT01fSCAgICAgICAgIDB4MjgJLyogbWlzYyBzZXR0aW5ncyAqLworI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9JICAgICAgICAgMHgyOQkvKiBtaXNjIHNldHRpbmdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfRlJBTUVSQVRFX0ggICAweDJBCS8qIGZyYW1lIHJhdGUgTVNCICsgbWlzYyAqLworI2RlZmluZSBPVjc2MTBfUkVHX0ZSQU1FUkFURV9MICAgMHgyQgkvKiBmcmFtZSByYXRlIExTQiAqLworI2RlZmluZSBPVjc2MTBfUkVHX0FMQyAgICAgICAgICAgMHgyQwkvKiBBdXRvIExldmVsIENvbnRyb2wgc2V0dGluZ3MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19DT01fSiAgICAgICAgIDB4MkQJLyogbWlzYyBzZXR0aW5ncyAqLworI2RlZmluZSBPVjc2MTBfUkVHX1ZPRkZTRVQgICAgICAgMHgyRQkvKiBWIGNoYW5uZWwgb2Zmc2V0IGFkanVzdG1lbnQgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19BUlJBWV9CSUFTCSAweDJGCS8qIEFycmF5IGJpYXMgLS0gZG9uJ3QgY2hhbmdlICovCisJCQkJCS8qIDMwLTMyIHJlc2VydmVkICovCisjZGVmaW5lIE9WNzYxMF9SRUdfWUdBTU1BICAgICAgICAweDMzCS8qIG1pc2MgZ2FtbWEgc2V0dGluZ3MgKDc6NikgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19CSUFTX0FESlVTVCAgIDB4MzQJLyogbWlzYyBiaWFzIHNldHRpbmdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0wgICAgICAgICAweDM1CS8qIG1pc2Mgc2V0dGluZ3MgKi8KKwkJCQkJLyogMzYtMzcgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19DT01fSyAgICAgICAgIDB4MzgJLyogbWlzYyByZWdpc3RlcnMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgICAgICAgSTJDIEFERFJFU1NFUyAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE9WN3h4MF9TSUQgICAweDQyCisjZGVmaW5lIE9WNnh4MF9TSUQgICAweEMwCisjZGVmaW5lIE9WOHh4MF9TSUQgICAweEEwCisjZGVmaW5lIEtTMDEyN19TSUQgICAweEQ4CisjZGVmaW5lIFNBQTcxMTFBX1NJRCAweDQ4CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICAgTUlTQ0VMTEFORU9VUyBERUZJTkVTICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBJMkNfQ0xPQ0tfUFJFU0NBTEVSIAkweDAzCisKKyNkZWZpbmUgRlJBTUVTX1BFUl9ERVNDCQkxMAkvKiBGSVhNRSAtIFdoYXQgc2hvdWxkIHRoaXMgYmU/ICovCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFX1BFUl9ERVNDCTk5MwkvKiBGb3Igc3RhdGljYWxseSBhbGxvY2F0ZWQgc3R1ZmYgKi8KKyNkZWZpbmUgUElYRUxTX1BFUl9TRUcJCTI1NgkvKiBQaXhlbHMgcGVyIHNlZ21lbnQgKi8KKworI2RlZmluZSBPVjUxMV9FTkRQT0lOVF9BRERSRVNTCTEJLyogSXNvYyBlbmRwb2ludCBudW1iZXIgKi8KKworI2RlZmluZSBPVjUxMV9OVU1GUkFNRVMJMgorI2lmIE9WNTExX05VTUZSQU1FUyA+IFZJREVPX01BWF9GUkFNRQorCSNlcnJvciAiT1Y1MTFfTlVNRlJBTUVTIGlzIHRvbyBoaWdoIgorI2VuZGlmCisKKyNkZWZpbmUgT1Y1MTFfTlVNU0JVRgkJMgorCisvKiBDb250cm9sIHRyYW5zZmVycyB1c2UgdXAgdG8gNCBieXRlcyAqLworI2RlZmluZSBPVjUxMV9DQlVGX1NJWkUJCTQKKworLyogU2l6ZSBvZiB1c2JfbWFrZV9wYXRoKCkgYnVmZmVyICovCisjZGVmaW5lIE9WNTExX1VTQl9QQVRIX0xFTgk2NAorCisvKiBCcmlkZ2UgdHlwZXMgKi8KK2VudW0geworCUJSR19VTktOT1dOLAorCUJSR19PVjUxMSwKKwlCUkdfT1Y1MTFQTFVTLAorCUJSR19PVjUxOCwKKwlCUkdfT1Y1MThQTFVTLAorfTsKKworLyogQnJpZGdlIGNsYXNzZXMgKi8KK2VudW0geworCUJDTF9VTktOT1dOLAorCUJDTF9PVjUxMSwKKwlCQ0xfT1Y1MTgsCit9OworCisvKiBTZW5zb3IgdHlwZXMgKi8KK2VudW0geworCVNFTl9VTktOT1dOLAorCVNFTl9PVjc2QkUsCisJU0VOX09WNzYxMCwKKwlTRU5fT1Y3NjIwLAorCVNFTl9PVjc2MjBBRSwKKwlTRU5fT1Y2NjIwLAorCVNFTl9PVjY2MzAsCisJU0VOX09WNjYzMEFFLAorCVNFTl9PVjY2MzBBRiwKKwlTRU5fT1Y4NjAwLAorCVNFTl9LUzAxMjcsCisJU0VOX0tTMDEyN0IsCisJU0VOX1NBQTcxMTFBLAorfTsKKworZW51bSB7CisJU1RBVEVfU0NBTk5JTkcsCQkvKiBTY2FubmluZyBmb3Igc3RhcnQgKi8KKwlTVEFURV9IRUFERVIsCQkvKiBQYXJzaW5nIGhlYWRlciAqLworCVNUQVRFX0xJTkVTLAkJLyogUGFyc2luZyBsaW5lcyAqLworfTsKKworLyogQnVmZmVyIHN0YXRlcyAqLworZW51bSB7CisJQlVGX05PVF9BTExPQ0FURUQsCisJQlVGX0FMTE9DQVRFRCwKK307CisKKy8qIC0tLS0tLS0tLSBEZWZpbml0aW9uIG9mIGlvY3RsIGludGVyZmFjZSAtLS0tLS0tLS0gKi8KKworI2RlZmluZSBPVjUxMV9JTlRFUkZBQ0VfVkVSIDEwMQorCisvKiBMRUQgb3B0aW9ucyAqLworZW51bSB7CisJTEVEX09GRiwKKwlMRURfT04sCisJTEVEX0FVVE8sCit9OworCisvKiBSYXcgZnJhbWUgZm9ybWF0cyAqLworZW51bSB7CisJUkFXRk1UX0lOVkFMSUQsCisJUkFXRk1UX1lVVjQwMCwKKwlSQVdGTVRfWVVWNDIwLAorCVJBV0ZNVF9ZVVY0MjIsCisJUkFXRk1UX0dCUjQyMiwKK307CisKK3N0cnVjdCBvdjUxMV9pMmNfc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIHNsYXZlOyAvKiBXcml0ZSBzbGF2ZSBJRCAocmVhZCBJRCAtIDEpICovCisJdW5zaWduZWQgY2hhciByZWc7ICAgLyogSW5kZXggb2YgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHZhbHVlOyAvKiBVc2VyIHNldHMgdGhpcyB3LyB3cml0ZSwgZHJpdmVyIGRvZXMgdy8gcmVhZCAqLworCXVuc2lnbmVkIGNoYXIgbWFzazsgIC8qIEJpdHMgdG8gYmUgY2hhbmdlZC4gTm90IHVzZWQgd2l0aCByZWFkIG9wcyAqLworfTsKKworLyogaW9jdGxzICovCisjZGVmaW5lIE9WNTExSU9DX1dJMkMgICAgIF9JT1coJ3YnLCBCQVNFX1ZJRElPQ1BSSVZBVEUgKyA1LCBcCisJCQkgICAgICAgc3RydWN0IG92NTExX2kyY19zdHJ1Y3QpCisjZGVmaW5lIE9WNTExSU9DX1JJMkMgICAgX0lPV1IoJ3YnLCBCQVNFX1ZJRElPQ1BSSVZBVEUgKyA2LCBcCisJCQkgICAgICAgc3RydWN0IG92NTExX2kyY19zdHJ1Y3QpCisvKiAtLS0tLS0tLS0tLS0tIEVuZCBJT0NUTCBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IHVzYl9vdjUxMTsJCS8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KKworc3RydWN0IG92NTExX3NidWYgeworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJc3RydWN0IHVyYiAqdXJiOworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgbjsKK307CisKK2VudW0geworCUZSQU1FX1VOVVNFRCwJCS8qIFVudXNlZCAobm8gTUNBUFRVUkUpICovCisJRlJBTUVfUkVBRFksCQkvKiBSZWFkeSB0byBzdGFydCBncmFiYmluZyAqLworCUZSQU1FX0dSQUJCSU5HLAkJLyogSW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZ3JhYmJlZCBpbnRvICovCisJRlJBTUVfRE9ORSwJCS8qIEZpbmlzaGVkIGdyYWJiaW5nLCBidXQgbm90IGJlZW4gc3luY2VkIHlldCAqLworCUZSQU1FX0VSUk9SLAkJLyogU29tZXRoaW5nIGJhZCBoYXBwZW5lZCB3aGlsZSBwcm9jZXNzaW5nICovCit9OworCitzdHJ1Y3Qgb3Y1MTFfcmVndmFscyB7CisJZW51bSB7CisJCU9WNTExX0RPTkVfQlVTLAorCQlPVjUxMV9SRUdfQlVTLAorCQlPVjUxMV9JMkNfQlVTLAorCX0gYnVzOworCXVuc2lnbmVkIGNoYXIgcmVnOworCXVuc2lnbmVkIGNoYXIgdmFsOworfTsKKworc3RydWN0IG92NTExX2ZyYW1lIHsKKwlpbnQgZnJhbWVudW07CQkvKiBJbmRleCBvZiB0aGlzIGZyYW1lICovCisJdW5zaWduZWQgY2hhciAqZGF0YTsJLyogRnJhbWUgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAqdGVtcGRhdGE7IC8qIFRlbXAgYnVmZmVyIGZvciBtdWx0aS1zdGFnZSBjb252ZXJzaW9ucyAqLworCXVuc2lnbmVkIGNoYXIgKnJhd2RhdGE7CS8qIFJhdyBjYW1lcmEgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICpjb21wYnVmOwkvKiBUZW1wIGJ1ZmZlciBmb3IgZGVjb21wcmVzc29yICovCisKKwlpbnQgZGVwdGg7CQkvKiBCeXRlcyBwZXIgcGl4ZWwgKi8KKwlpbnQgd2lkdGg7CQkvKiBXaWR0aCBhcHBsaWNhdGlvbiBpcyBleHBlY3RpbmcgKi8KKwlpbnQgaGVpZ2h0OwkJLyogSGVpZ2h0IGFwcGxpY2F0aW9uIGlzIGV4cGVjdGluZyAqLworCisJaW50IHJhd3dpZHRoOwkJLyogQWN0dWFsIHdpZHRoIG9mIGZyYW1lIHNlbnQgZnJvbSBjYW1lcmEgKi8KKwlpbnQgcmF3aGVpZ2h0OwkJLyogQWN0dWFsIGhlaWdodCBvZiBmcmFtZSBzZW50IGZyb20gY2FtZXJhICovCisKKwlpbnQgc3ViX2ZsYWc7CQkvKiBTdWItY2FwdHVyZSBtb2RlIGZvciB0aGlzIGZyYW1lPyAqLworCXVuc2lnbmVkIGludCBmb3JtYXQ7CS8qIEZvcm1hdCBmb3IgdGhpcyBmcmFtZSAqLworCWludCBjb21wcmVzc2VkOwkJLyogSXMgZnJhbWUgY29tcHJlc3NlZD8gKi8KKworCXZvbGF0aWxlIGludCBncmFic3RhdGU7CS8qIFN0YXRlIG9mIGdyYWJiaW5nICovCisJaW50IHNjYW5zdGF0ZTsJCS8qIFN0YXRlIG9mIHNjYW5uaW5nICovCisKKwlpbnQgYnl0ZXNfcmVjdmQ7CS8qIE51bWJlciBvZiBpbWFnZSBieXRlcyByZWNlaXZlZCBmcm9tIGNhbWVyYSAqLworCisJbG9uZyBieXRlc19yZWFkOwkvKiBBbW91bnQgdGhhdCBoYXMgYmVlbiByZWFkKCkgKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdxOwkvKiBQcm9jZXNzZXMgd2FpdGluZyAqLworCisJaW50IHNuYXBzaG90OwkJLyogVHJ1ZSBpZiBmcmFtZSB3YXMgYSBzbmFwc2hvdCAqLworfTsKKworI2RlZmluZSBERUNPTVBfSU5URVJGQUNFX1ZFUiA0CisKKy8qIENvbXByZXNzaW9uIG1vZHVsZSBvcGVyYXRpb25zICovCitzdHJ1Y3Qgb3Y1MXhfZGVjb21wX29wcyB7CisJaW50ICgqZGVjb21wXzQwMCkodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwKKwkJCSAgaW50LCBpbnQsIGludCk7CisJaW50ICgqZGVjb21wXzQyMCkodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwKKwkJCSAgaW50LCBpbnQsIGludCk7CisJaW50ICgqZGVjb21wXzQyMikodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwKKwkJCSAgaW50LCBpbnQsIGludCk7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7Cit9OworCitzdHJ1Y3QgdXNiX292NTExIHsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisKKwlpbnQgY3VzdG9taWQ7CisJY2hhciAqZGVzYzsKKwl1bnNpZ25lZCBjaGFyIGlmYWNlOworCWNoYXIgdXNiX3BhdGhbT1Y1MTFfVVNCX1BBVEhfTEVOXTsKKworCS8qIERldGVybWluZWQgYnkgc2Vuc29yIHR5cGUgKi8KKwlpbnQgbWF4d2lkdGg7CisJaW50IG1heGhlaWdodDsKKwlpbnQgbWlud2lkdGg7CisJaW50IG1pbmhlaWdodDsKKworCWludCBicmlnaHRuZXNzOworCWludCBjb2xvdXI7CisJaW50IGNvbnRyYXN0OworCWludCBodWU7CisJaW50IHdoaXRlbmVzczsKKwlpbnQgZXhwb3N1cmU7CisJaW50IGF1dG9fYnJ0OwkJLyogQXV0byBicmlnaHRuZXNzIGVuYWJsZWQgZmxhZyAqLworCWludCBhdXRvX2dhaW47CQkvKiBBdXRvIGdhaW4gY29udHJvbCBlbmFibGVkIGZsYWcgKi8KKwlpbnQgYXV0b19leHA7CQkvKiBBdXRvIGV4cG9zdXJlIGVuYWJsZWQgZmxhZyAqLworCWludCBiYWNrbGlnaHQ7CQkvKiBCYWNrbGlnaHQgZXhwb3N1cmUgYWxnb3JpdGhtIGZsYWcgKi8KKwlpbnQgbWlycm9yOwkJLyogSW1hZ2UgaXMgcmV2ZXJzZWQgaG9yaXpvbnRhbGx5ICovCisKKwlpbnQgbGVkX3BvbGljeTsJCS8qIExFRDogb2ZmfG9ufGF1dG87IE9WNTExKyBvbmx5ICovCisKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CS8qIFNlcmlhbGl6ZXMgdXNlci1hY2Nlc3NpYmxlIG9wZXJhdGlvbnMgKi8KKwlpbnQgdXNlcjsJCS8qIHVzZXIgY291bnQgZm9yIGV4Y2x1c2l2ZSB1c2UgKi8KKworCWludCBzdHJlYW1pbmc7CQkvKiBBcmUgd2Ugc3RyZWFtaW5nIElzb2Nocm9ub3VzPyAqLworCWludCBncmFiYmluZzsJCS8qIEFyZSB3ZSBncmFiYmluZz8gKi8KKworCWludCBjb21wcmVzczsJCS8qIFNob3VsZCB0aGUgbmV4dCBmcmFtZSBiZSBjb21wcmVzc2VkPyAqLworCWludCBjb21wcmVzc19pbml0ZWQ7CS8qIEFyZSBjb21wcmVzc2lvbiBwYXJhbXMgdXBsb2FkZWQ/ICovCisKKwlpbnQgbGlnaHRmcmVxOwkJLyogUG93ZXIgKGxpZ2h0aW5nKSBmcmVxdWVuY3kgKi8KKwlpbnQgYmFuZGZpbHQ7CQkvKiBCYW5kaW5nIGZpbHRlciBlbmFibGVkIGZsYWcgKi8KKworCXVuc2lnbmVkIGNoYXIgKmZidWY7CS8qIFZpZGVvZGV2IGJ1ZmZlciBhcmVhICovCisJdW5zaWduZWQgY2hhciAqdGVtcGZidWY7IC8qIFRlbXBvcmFyeSAoaW50ZXJtZWRpYXRlKSBidWZmZXIgYXJlYSAqLworCXVuc2lnbmVkIGNoYXIgKnJhd2ZidWY7CS8qIFJhdyBjYW1lcmEgZGF0YSBidWZmZXIgYXJlYSAqLworCisJaW50IHN1Yl9mbGFnOwkJLyogUGl4IEFycmF5IHN1YmNhcHR1cmUgb24gZmxhZyAqLworCWludCBzdWJ4OwkJLyogUGl4IEFycmF5IHN1YmNhcHR1cmUgeCBvZmZzZXQgKi8KKwlpbnQgc3VieTsJCS8qIFBpeCBBcnJheSBzdWJjYXB0dXJlIHkgb2Zmc2V0ICovCisJaW50IHN1Ync7CQkvKiBQaXggQXJyYXkgc3ViY2FwdHVyZSB3aWR0aCAqLworCWludCBzdWJoOwkJLyogUGl4IEFycmF5IHN1YmNhcHR1cmUgaGVpZ2h0ICovCisKKwlpbnQgY3VyZnJhbWU7CQkvKiBDdXJyZW50IHJlY2VpdmluZyBzYnVmICovCisJc3RydWN0IG92NTExX2ZyYW1lIGZyYW1lW09WNTExX05VTUZSQU1FU107CQorCisJc3RydWN0IG92NTExX3NidWYgc2J1ZltPVjUxMV9OVU1TQlVGXTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdxOwkvKiBQcm9jZXNzZXMgd2FpdGluZyAqLworCisJaW50IHNuYXBfZW5hYmxlZDsJLyogU25hcHNob3QgbW9kZSBlbmFibGVkICovCisJCisJaW50IGJyaWRnZTsJCS8qIFR5cGUgb2YgYnJpZGdlIChCUkdfKikgKi8KKwlpbnQgYmNsYXNzOwkJLyogQ2xhc3Mgb2YgYnJpZGdlIChCQ0xfKikgKi8KKwlpbnQgc2Vuc29yOwkJLyogVHlwZSBvZiBpbWFnZSBzZW5zb3IgY2hpcCAoU0VOXyopICovCisKKwlpbnQgcGFja2V0X3NpemU7CS8qIEZyYW1lIHNpemUgcGVyIGlzb2MgZGVzYyAqLworCWludCBwYWNrZXRfbnVtYmVyaW5nOwkvKiBJcyBJU08gZnJhbWUgbnVtYmVyaW5nIGVuYWJsZWQ/ICovCisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHBhcmFtX2xvY2s7CS8qIHBhcmFtcyBsb2NrIGZvciB0aGlzIGNhbWVyYSAqLworCisJLyogRnJhbWVidWZmZXIvc2J1ZiBtYW5hZ2VtZW50ICovCisJaW50IGJ1Zl9zdGF0ZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGJ1Zl9sb2NrOworCisJc3RydWN0IG92NTF4X2RlY29tcF9vcHMgKmRlY29tcF9vcHM7CisKKwkvKiBTdG9wIHN0cmVhbWluZyB3aGlsZSBjaGFuZ2luZyBwaWN0dXJlIHNldHRpbmdzICovCisJaW50IHN0b3BfZHVyaW5nX3NldDsKKworCWludCBzdG9wcGVkOwkJLyogU3RyZWFtaW5nIGlzIHRlbXBvcmFyaWx5IHBhdXNlZCAqLworCisJLyogVmlkZW8gZGVjb2RlciBzdHVmZiAqLworCWludCBpbnB1dDsJCS8qIENvbXBvc2l0ZSwgUy1WSURFTywgZXRjLi4uICovCisJaW50IG51bV9pbnB1dHM7CQkvKiBOdW1iZXIgb2YgaW5wdXRzICovCisJaW50IG5vcm07IAkJLyogTlRTQyAvIFBBTCAvIFNFQ0FNICovCisJaW50IGhhc19kZWNvZGVyOwkvKiBEZXZpY2UgaGFzIGEgdmlkZW8gZGVjb2RlciAqLworCWludCBwYWw7CQkvKiBEZXZpY2UgaXMgZGVzaWduZWQgZm9yIFBBTCByZXNvbHV0aW9uICovCisKKwkvKiBJMkMgaW50ZXJmYWNlICovCisJc3RydWN0IHNlbWFwaG9yZSBpMmNfbG9jazsJICAvKiBQcm90ZWN0IEkyQyBjb250cm9sbGVyIHJlZ3MgKi8KKwl1bnNpZ25lZCBjaGFyIHByaW1hcnlfaTJjX3NsYXZlOyAgLyogSTJDIHdyaXRlIGlkIG9mIHNlbnNvciAqLworCisJLyogQ29udHJvbCB0cmFuc2FjdGlvbiBzdHVmZiAqLworCXVuc2lnbmVkIGNoYXIgKmNidWY7CQkvKiBCdWZmZXIgZm9yIHBheWxvYWQgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGNidWZfbG9jazsKK307CisKKy8qIFVzZWQgdG8gcmVwcmVzZW50IGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHRoZWlyIHJlc3BlY3RpdmUgc3ltYm9saWMgbmFtZXMgKi8KK3N0cnVjdCBzeW1ib2xpY19saXN0IHsKKwlpbnQgbnVtOworCWNoYXIgKm5hbWU7Cit9OworCisjZGVmaW5lIE5PVF9ERUZJTkVEX1NUUiAiVW5rbm93biIKKworLyogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgc3ltYm9saWNfbGlzdCBhcnJheS4gVGhlCisgKiBlbmQgb2YgdGhlIGxpc3QgbXVzdCBiZSBtYXJrZWQgd2l0aCBhbiBlbGVtZW50IHRoYXQgaGFzIGEgTlVMTCBuYW1lLgorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKiAKK3N5bWJvbGljKHN0cnVjdCBzeW1ib2xpY19saXN0IGxpc3RbXSwgaW50IG51bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGxpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJCQlpZiAobGlzdFtpXS5udW0gPT0gbnVtKQorCQkJCXJldHVybiAobGlzdFtpXS5uYW1lKTsKKworCXJldHVybiAoTk9UX0RFRklORURfU1RSKTsKK30KKworLyogQ29tcHJlc3Npb24gc3R1ZmYgKi8KKworI2RlZmluZSBPVjUxMV9RVUFOVEFCTEVTSVpFCTY0CisjZGVmaW5lIE9WNTE4X1FVQU5UQUJMRVNJWkUJMzIKKworI2RlZmluZSBPVjUxMV9ZUVVBTlRBQkxFIHsgXAorCTAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIFwKKwkxLCAxLCAxLCAyLCAyLCAzLCA0LCA0LCBcCisJMSwgMSwgMiwgMiwgMywgNCwgNCwgNCwgXAorCTIsIDIsIDIsIDMsIDQsIDQsIDQsIDQsIFwKKwkyLCAyLCAzLCA0LCA0LCA1LCA1LCA1LCBcCisJMywgMywgNCwgNCwgNSwgNSwgNSwgNSwgXAorCTMsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIFwKKwk0LCA0LCA0LCA0LCA1LCA1LCA1LCA1ICBcCit9CisKKyNkZWZpbmUgT1Y1MTFfVVZRVUFOVEFCTEUgeyBcCisJMCwgMiwgMiwgMywgNCwgNCwgNCwgNCwgXAorCTIsIDIsIDIsIDQsIDQsIDQsIDQsIDQsIFwKKwkyLCAyLCAzLCA0LCA0LCA0LCA0LCA0LCBcCisJMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgXAorCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIFwKKwk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCBcCisJNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgXAorCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQgIFwKK30KKworI2RlZmluZSBPVjUxOF9ZUVVBTlRBQkxFIHsgXAorCTUsIDQsIDUsIDYsIDYsIDcsIDcsIDcsIFwKKwk1LCA1LCA1LCA1LCA2LCA3LCA3LCA3LCBcCisJNiwgNiwgNiwgNiwgNywgNywgNywgOCwgXAorCTcsIDcsIDYsIDcsIDcsIDcsIDgsIDggIFwKK30KKworI2RlZmluZSBPVjUxOF9VVlFVQU5UQUJMRSB7IFwKKwk2LCA2LCA2LCA3LCA3LCA3LCA3LCA3LCBcCisJNiwgNiwgNiwgNywgNywgNywgNywgNywgXAorCTYsIDYsIDYsIDcsIDcsIDcsIDcsIDgsIFwKKwk3LCA3LCA3LCA3LCA3LCA3LCA4LCA4ICBcCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL0NoYW5nZUxvZyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlYjcxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxNDMgQEAKKzkuMC4yCisKKyogQWRkaW5nICNpZmRlZiB0byBjb21waWxlIFBXQyBiZWZvcmUgYW5kIGFmdGVyIDIuNi41CisKKzkuMC4xCisKKzkuMAorCisKKzguMTIKKworKiBJbXBsZW1lbnQgbW90b3JpemVkIHBhbi90aWx0IGZlYXR1cmUgZm9yIExvZ2l0ZWNoIFF1aWNrQ2FtIE9yYml0L1NwZXJlLgorCis4LjExLjEKKworKiBGaXggZm9yIFBDVkM3MjAvNDAsIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHNldCB2aWRlb21vZGUKKyogRml4IGZvciBTYW1zdW5nIE1QQyBtb2RlbHMsIGFwcGVhcmFudGx5IHRoZXkgYXJlIGJhc2VkIG9uIGEgbmV3ZXIgY2hpcHNldAorCis4LjExCisKKyogMjAgZGV2X2hpbnRzIChwZXIgcmVxdWVzdCkKKyogSG90IHVucGx1Z2dpbmcgc2hvdWxkIGJlIGJldHRlciwgbm8gbW9yZSBkYW5nbGluZyBwb2ludGVycyBvciBtZW1vcnkgbGVha3MKKyogQWRkZWQgcmVzZXJ2ZWQgTG9naXRlY2ggd2ViY2FtIElEcworKiBEZXZpY2Ugbm93IHJlbWVtYmVycyBzaXplICYgZnBzIGJldHdlZW4gY2xvc2UoKS9vcGVuKCkKKyogUmVtb3ZlZCBwYWxldHRlIHN0dWZmIGFsdG9nZXRoZXIKKworOC4xMC4xCisKKyogQWRkZWQgSURzIGZvciBQQ1ZDNzIwSy80MCBhbmQgQ3JlYXRpdmUgTGFicyBXZWJjYW0gUHJvCisKKzguMTAKKworKiBGaXhlZCBJRCBmb3IgUXVpY2tDYW0gTm90ZWJvb2sgcHJvCisqIEFkZGVkIEdSRUFMU0laRSBpb2N0bCgpIGNhbGwKKyogRml4ZWQgYnVnIGluIGNhc2UgUFdDWCB3YXMgbm90IGxvYWRlZCBhbmQgaW52YWxpZCBzaXplIHdhcyBzZXQKKworOC45CisKKyogTWVyZ2luZyB3aXRoIGtlcm5lbCAyLjUuNDkKKyogQWRkaW5nIElEcyBmb3IgUXVpY2tDYW0gWm9vbSAmIFF1aWNrQ2FtIE5vdGVib29rCisKKzguOAorCisqIEZpeGluZyAnbGVkcycgcGFyYW1ldGVyCisqIEFkZGluZyBJRHMgZm9yIExvZ2l0ZWNoIFF1aWNrQ2FtIFBybyA0MDAwCisqIE1ha2luZyBVUkIgaW5pdC9jbGVhbnVwIGEgbGl0dGxlIG5pY2VyCisKKzguNworCisqIEluY29ycG9yYXRpbmcgY2hhbmdlcyBpbiBpb2N0bCgpIHBhcmFtZXRlciBwYXNzaW5nCisqIEFsc28gY2hhbmdlcyB0byBVUkIgbWVjaGFuaXNtCisKKzguNgorCisqIEFkZGVkIElEJ3MgZm9yIFZpc2lvbml0ZSBWQ1MgVU0xMDAgYW5kIFVDMzAwCisqIFJlbW92ZWQgWVVWNDIwLWludGVybGFjZWQgcGFsZXR0ZSBhbHRvZ2V0aGVyICh3YXMgY29uZnVzaW5nKQorKiBSZW1vdmVkIE1JUlJPUiBzdHVmZiBhcyBpdCBkaWRuJ3Qgd29yayBhbnl3YXkKKyogRml4ZWQgYSBwcm9ibGVtIHdpdGggdGhlICdsZWRzJyBwYXJhbWV0ZXIgKHdvdWxkbid0IGJsaW5rKQorKiBBZGRlZCBpb2N0bCgpcyBmb3IgYWR2YW5jZWQgZmVhdHVyZXM6ICdleHRlbmRlZCcgd2hpdGViYWxhbmNlIGlvY3RsKClzLAorICBDT05UT1VSLCBCQUNLTElHSFQsIEZMSUNLRVIsIERZTk5PSVNFLgorKiBWSURJT0NHQ0FQLm5hbWUgbm93IGNvbnRhaW5zIHJlYWwgY2FtZXJhIG1vZGVsIG5hbWUgaW5zdGVhZCBvZgorICAnUGhpbGlwcyB4eHggd2ViY2FtJworKiBBZGRlZCBQUk9CRSBpb2N0bCAoc2VlIHByZXZpb3VzIHBvaW50ICYgQVBJIGRvYykKKworOC41CisKKyogQWRkaW5nIElEcyBmb3IgQ3JlYXRpdmUgTGFicyBXZWJjYW0gNQorKiBBZGRpbmcgSURzIGZvciBTT1RFQyBDTVMtMDAxIHdlYmNhbQorKiBTb2x2aW5nIHBvc3NpYmxlIGhhbmcgaW4gVklESU9DU1lOQyB3aGVuIHVucGx1Z2dpbmcgdGhlIGNhbSAKKyogRm9yZ290IHRvIHJldHVybiBzdHJ1Y3R1cmUgaW4gVklESU9DUFdDR0FXQiwgb29wcworKiBUaW1lIGludGVydmFsIGZvciB0aGUgTEVEcyBhcmUgbm93IGluIG1pbGxpc2Vjb25kcworCis4LjQKKworKiBGaXhpbmcgcG93ZXJfc2F2ZSBvcHRpb24gZm9yIFZlc3RhIHJhbmdlCisqIEhhbmRsaW5nIG5ldyBlcnJvciBjb2RlcyBpbiBJU09DIGNhbGxiYWNrCisqIEFkZGluZyBkZXZfaGludCBtb2R1bGUgcGFyYW1ldGVyLCB0byBzcGVjaWZ5IC9kZXYvdmlkZW9YIGRldmljZSBub2RlcworCis4LjMKKworKiBBZGRpbmcgU2Ftc3VuZyBDMTAgYW5kIEMzMCBjYW1lcmFzCisqIFJlbW92aW5nIHBhbGV0dGUgbW9kdWxlIHBhcmFtZXRlcgorKiBGaXhlZCB0eXBvIGluIElEIG9mIFF1aWNrQ2FtIDMwMDAgUHJvCisqIEFkZGluZyBMRUQgc2V0dGluZ3MgKGJsaW5raW5nIHdoaWxlIGluIHVzZSkgZm9yIFRvVUNhbSBjYW1lcmFzLgorKiBUdXJucyBMRUQgb2ZmIHdoZW4gY2FtZXJhIGlzIG5vdCBpbiB1c2UuCisKKzguMgorCisqIE1ha2luZyBtb2R1bGUgbW9yZSBzaWxlbnQgd2hlbiB0cmFjZSA9IDAgCisqIEFkZGluZyBRdWlja0NhbSAzMDAwIFBybyBJRHMKKyogQ2hyb21pbmFuY2UgY29udHJvbCBmb3IgdGhlIFZlc3RhIGNhbWVyYXMKKyogSG9wZWZ1bGx5IGZpeGVkIHByb2JsZW1zIG9uIG1hY2hpbmVzIHdpdGggQklHTUVNIGFuZCA+IDFHQiBvZiBSQU0KKyogSW5jbHVkZWQgT2xpdmVyIE5ldWtlbSdzIGxvY2tfa2VybmVsKCkgcGF0Y2gKKyogQWxsb2NhdGVzIGxlc3MgbWVtb3J5IGZvciBpbWFnZSBidWZmZXJzCisqIEFkZHMgaW9jdGwoKXMgZm9yIHRoZSB3aGl0ZWJhbGFuY2luZworCis4LjEKKworKiBBZGRpbmcgc3VwcG9ydCBmb3IgNzUwCisqIEFkZGluZyBWNEwgR0FVRElPL1NBVURJTy9VTklUIGlvY3RsKCkgY2FsbHMKKworOC4wCisqICdkYW1hZ2UgY29udHJvbCcgYWZ0ZXIgaW5jbHVzaW9uIGluIDIuNC41LgorKiBDaGFuZ2VkIHdhaXQtcXVldWUgbWVjaGFuaXNtIGluIHJlYWQvbW1hcC9wb2xsIGFjY29yZGluZyB0byB0aGUgYm9vay4KKyogSW5jbHVkZWQgWVVWNDIwUCBwYWxldHRlLgorKiBDaGFuZ2VkIGludGVyZmFjZSB0byBkZWNvbXByZXNzb3IgbW9kdWxlLgorKiBDbGVhbmVkIHVwIHB3YyBzdHJ1Y3R1cmUgYSBiaXQuCisKKzcuMAorCisqIEZpeGVkIGJ1ZyBpbiB2Y3Z0XzQyMGlfeXV5djsgZXh0cmEgdmFyaWFibGVzIG9uIHN0YWNrIHdlcmUgbWlzYWxpZ25lZC4KKyogVGhlcmUgaXMgbm93IGEgY2xlYXIgZXJyb3IgbWVzc2FnZSB3aGVuIGFuIGltYWdlIHNpemUgaXMgc2VsZWN0ZWQgdGhhdAorICBpcyBvbmx5IHN1cHBvcnRlZCB1c2luZyB0aGUgZGVjb21wcmVzc29yLCBhbmQgdGhlIGRlY29tcHJlc3NvciBpc24ndAorICBsb2FkZWQuCisqIFdoZW4gdGhlIGRlY29tcHJlc3NvciB3YXNuJ3QgbG9hZGVkLCBzZWxlY3RpbmcgbGFyZ2UgaW1hZ2Ugc2l6ZQorICB3b3VsZCBjcmVhdGUgc2tld2VkIG9yIGRvdWJsZSBpbWFnZXMuCisKKzYuMworCisqIEludHJvZHVjZWQgc3BpbmxvY2tzIGZvciB0aGUgYnVmZmVyIHBvaW50ZXIgbWFuaXB1bGF0aW9uOyBhIG51bWJlciBvZgorICByZXBvcnRzIHNlZW0gdG8gc3VnZ2VzdCB0aGUgZG93bigpL3VwKCkgc2VtYXBob3JlcyB3ZXJlIHRoZSBjYXVzZSBvZgorICBsb2NrdXBzLCBzaW5jZSB0aGV5IGFyZSBub3Qgc3VpdGFibGUgZm9yIGludGVycnVwdC91c2VyIGxvY2tpbmcuCisqIFNlcGFyYXRlZCBkZWNvbXByZXNzb3IgYW5kIGNvcmUgY29kZSBpbnRvIDIgbW9kdWxlcy4KKworNi4yCisKKyogTm9uLWludGVncmFsIGltYWdlIHNpemVzIGFyZSBub3cgcGFkZGVkIHdpdGggZ3JheSBvciBibGFjay4KKyogQWRkZWQgU0hVVFRFUlNQRUVEIGlvY3RsKCkuCisqIEZpeGVkIGJ1Z2xldCBpbiBWSURJT0NQV0NTQUdDOyB0aGUgZnVuY3Rpb24gd291bGQgYWx3YXlzIHJldHVybiBhbiBlcnJvciwKKyAgZXZlbiB0aG91Z2ggdGhlIGNhbGwgc3VjY2VlZGVkLgorKiBBZGRlZCBob3RwbHVnIHN1cHBvcnQgZm9yIDIuNC4qLgorKiBNZW1vcnk6IHRoZSA2NDUvNjQ2IHVzZXMgbGVzcyBtZW1vcnkgbm93LgorCis2LjEKKworKiBWSURJT0NTUElDVCByZXR1cm5zIC1FSU5WQUwgd2l0aCBpbnZhbGlkIHBhbGV0dGVzLgorKiBBZGRlZCBzYXR1cmF0aW9uIGNvbnRyb2wuCisqIFNwbGl0IGRlY29tcHJlc3NvcnMgZnJvbSByZXN0LgorKiBGaXhlZCBidWcgdGhhdCB3b3VsZCByZXNldCB0aGUgZnJhbWVyYXRlIHRvIHRoZSBkZWZhdWx0IGZyYW1lcmF0ZSBpZiAKKyAgdGhlIHJhdGUgZmllbGQgd2FzIHNldCB0byAwICh3aGljaCBpcyBub3Qgd2hhdCBJIGludGVuZGVkLCBubC4gZG8gbm90IAorICBjaGFuZ2UgdGhlIGZyYW1lcmF0ZSEpLgorKiBWSURJT0NQV0NTQ1FVQUwgKHNldHRpbmcgY29tcHJlc3Npb24gcXVhbGl0eSkgbm93IHRha2VzIGVmZmVjdCBpbW1lZGlhdGVseS4KKyogV29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gdGhlIDczMCBzZW5zb3IuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiNDFlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACitpZm5lcSAoJChLRVJORUxSRUxFQVNFKSwpCisKK3B3Yy1vYmpzCTo9IHB3Yy1pZi5vIHB3Yy1taXNjLm8gcHdjLWN0cmwubyBwd2MtdW5jb21wcmVzcy5vIHB3Yy1kZWMxLm8gcHdjLWRlYzIzLm8gcHdjLWtpYXJhLm8gcHdjLXRpbW9uLm8KKworb2JqLSQoQ09ORklHX1VTQl9QV0MpICs9IHB3Yy5vCisKK2Vsc2UKKworS0RJUiA6PSAvbGliL21vZHVsZXMvJChzaGVsbCB1bmFtZSAtcikvYnVpbGQKK1BXRCA6PSAkKHNoZWxsIHB3ZCkKKworZGVmYXVsdDoKKwkkKE1BS0UpIC1DICQoS0RJUikgU1VCRElSUz0kKFBXRCkgbW9kdWxlcworCitlbmRpZgorCitjbGVhbjoKKwlybSAtZiAqLltvYXNdIC4qLmZsYWdzICoua28gLiouY21kIC4qLmQgLioudG1wICoubW9kLmMgCisJcm0gLXJmIC50bXBfdmVyc2lvbnMKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3BoaWxpcHMudHh0IGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3BoaWxpcHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTY0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcGhpbGlwcy50eHQKQEAgLTAsMCArMSwyMzYgQEAKK1RoaXMgZmlsZSBjb250YWlucyBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBQaGlsaXBzIGFuZCBPRU0gd2ViY2Ftcy4KK0UtbWFpbDogd2ViY2FtQHNtY2MuZGVtb24ubmwgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IHVwZGF0ZWQ6IDIwMDQtMDEtMTkKK1NpdGU6IGh0dHA6Ly93d3cuc21jYy5kZW1vbi5ubC93ZWJjYW0vCisKK0FzIG9mIHRoaXMgbW9tZW50LCB0aGUgZm9sbG93aW5nIGNhbWVyYXMgYXJlIHN1cHBvcnRlZDoKKyAqIFBoaWxpcHMgUENBNjQ1CisgKiBQaGlsaXBzIFBDQTY0NgorICogUGhpbGlwcyBQQ1ZDNjc1CisgKiBQaGlsaXBzIFBDVkM2ODAKKyAqIFBoaWxpcHMgUENWQzY5MAorICogUGhpbGlwcyBQQ1ZDNzIwLzQwCisgKiBQaGlsaXBzIFBDVkM3MzAKKyAqIFBoaWxpcHMgUENWQzc0MAorICogUGhpbGlwcyBQQ1ZDNzUwCisgKiBBc2tleSBWQzAxMAorICogQ3JlYXRpdmUgTGFicyBXZWJjYW0gNQorICogQ3JlYXRpdmUgTGFicyBXZWJjYW0gUHJvIEV4CisgKiBMb2dpdGVjaCBRdWlja0NhbSAzMDAwIFBybworICogTG9naXRlY2ggUXVpY2tDYW0gNDAwMCBQcm8KKyAqIExvZ2l0ZWNoIFF1aWNrQ2FtIE5vdGVib29rIFBybworICogTG9naXRlY2ggUXVpY2tDYW0gWm9vbQorICogTG9naXRlY2ggUXVpY2tDYW0gT3JiaXQKKyAqIExvZ2l0ZWNoIFF1aWNrQ2FtIFNwaGVyZQorICogU2Ftc3VuZyBNUEMtQzEwCisgKiBTYW1zdW5nIE1QQy1DMzAKKyAqIFNvdGVjIEFmaW5hIEV5ZQorICogQU1FIENVLTAwMQorICogVmlzaW9uaXRlIFZDUy1VTTEwMAorICogVmlzaW9uaXRlIFZDUy1VQzMwMAorCitUaGUgbWFpbiB3ZWJwYWdlIGZvciB0aGUgUGhpbGlwcyBkcml2ZXIgaXMgYXQgdGhlIGFkZHJlc3MgYWJvdmUuIEl0IGNvbnRhaW5zCithIGxvdCBvZiBleHRyYSBpbmZvcm1hdGlvbiwgYSBGQVEsIGFuZCB0aGUgYmluYXJ5IHBsdWdpbiAnUFdDWCcuIFRoaXMgcGx1Z2luCitjb250YWlucyBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIHRoYXQgYWxsb3cgeW91IHRvIHVzZSBoaWdoZXIgaW1hZ2Ugc2l6ZXMgYW5kCitmcmFtZXJhdGVzOyBpbiBhZGRpdGlvbiB0aGUgd2ViY2FtIHVzZXMgbGVzcyBiYW5kd2lkdGggb24gdGhlIFVTQiBidXMgKGhhbmR5CitpZiB5b3Ugd2FudCB0byBydW4gbW9yZSB0aGFuIDEgY2FtZXJhIHNpbXVsdGFuZW91c2x5KS4gVGhlc2Ugcm91dGluZXMgZmFsbAordW5kZXIgYSBOREEsIGFuZCBtYXkgdGhlcmVmb3Igbm90IGJlIGRpc3RyaWJ1dGVkIGFzIHNvdXJjZTsgaG93ZXZlciwgaXRzIHVzZQoraXMgY29tcGxldGVseSBvcHRpb25hbC4KKworWW91IGNhbiBidWlsZCB0aGlzIGNvZGUgZWl0aGVyIGludG8geW91ciBrZXJuZWwsIG9yIGFzIGEgbW9kdWxlLiBJIHJlY29tbWVuZAordGhlIGxhdHRlciwgc2luY2UgaXQgbWFrZXMgdHJvdWJsZXNob290aW5nIGEgbG90IGVhc2llci4gVGhlIGJ1aWx0LWluCittaWNyb3Bob25lIGlzIHN1cHBvcnRlZCB0aHJvdWdoIHRoZSBVU0IgQXVkaW8gY2xhc3MuCisKK1doZW4geW91IGxvYWQgdGhlIG1vZHVsZSB5b3UgY2FuIHNldCBzb21lIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZQorY2FtZXJhOyBzb21lIHByb2dyYW1zIGRlcGVuZCBvbiBhIHBhcnRpY3VsYXIgaW1hZ2Utc2l6ZSBvciAtZm9ybWF0IGFuZAorZG9uJ3Qga25vdyBob3cgdG8gc2V0IGl0IHByb3Blcmx5IGluIHRoZSBkcml2ZXIuIFRoZSBvcHRpb25zIGFyZToKKworc2l6ZQorICAgQ2FuIGJlIG9uZSBvZiAnc3FjaWYnLCAncXNpZicsICdxY2lmJywgJ3NpZicsICdjaWYnIG9yCisgICAndmdhJywgZm9yIGFuIGltYWdlIHNpemUgb2YgcmVzcC4gMTI4eDk2LCAxNjB4MTIwLCAxNzZ4MTQ0LAorICAgMzIweDI0MCwgMzUyeDI4OCBhbmQgNjQweDQ4MCAob2YgY291cnNlLCBvbmx5IGZvciB0aG9zZSBjYW1lcmFzIHRoYXQgCisgICBzdXBwb3J0IHRoZXNlIHJlc29sdXRpb25zKS4KKworZnBzCisgICBTcGVjaWZpZXMgdGhlIGRlc2lyZWQgZnJhbWVyYXRlLiBJcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiA0LTMwLgorCitmYnVmcworICAgVGhpcyBwYXJhbXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBpbnRlcm5hbCBidWZmZXJzIHRvIHVzZSBmb3Igc3RvcmluZyAKKyAgIGZyYW1lcyBmcm9tIHRoZSBjYW0uIFRoaXMgd2lsbCBoZWxwIGlmIHRoZSBwcm9jZXNzIHRoYXQgcmVhZHMgaW1hZ2VzIGZyb20gCisgICB0aGUgY2FtIGlzIGEgYml0IHNsb3cgb3IgbW9tZW50YXJlbHkgYnVzeS4gSG93ZXZlciwgb24gc2xvdyBtYWNoaW5lcyBpdCAKKyAgIG9ubHkgaW50cm9kdWNlcyBsYWcsIHNvIGNob29zZSBjYXJlZnVsbHkuIFRoZSBkZWZhdWx0IGlzIDMsIHdoaWNoIGlzIAorICAgcmVhc29uYWJsZS4gWW91IGNhbiBzZXQgaXQgYmV0d2VlbiAyIGFuZCA1LgorCittYnVmcworICAgVGhpcyBpcyBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAuIEl0IHdpbGwgdGVsbCB0aGUgbW9kdWxlIHRoZSBudW1iZXIgb2YKKyAgIGJ1ZmZlcnMgdG8gcmVzZXJ2ZSBmb3IgbW1hcCgpLCBWSURJT0NDR01CVUYsIFZJRElPQ01DQVBUVVJFIGFuZCBmcmllbmRzLgorICAgVGhlIGRlZmF1bHQgaXMgMiwgd2hpY2ggaXMgYWRlcXVhdGUgZm9yIG1vc3QgYXBwbGljYXRpb25zIChkb3VibGUKKyAgIGJ1ZmZlcmluZykuCisgICAgICAKKyAgIFNob3VsZCB5b3UgZXhwZXJpZW5jZSBhIGxvdCBvZiAnRHVtcGluZyBmcmFtZS4uLicgbWVzc2FnZXMgZHVyaW5nCisgICBncmFiYmluZyB3aXRoIGEgdG9vbCB0aGF0IHVzZXMgbW1hcCgpLCB5b3UgbWlnaHQgd2FudCB0byBpbmNyZWFzZSBpZi4gCisgICBIb3dldmVyLCBpdCBkb2Vzbid0IHJlYWxseSBidWZmZXIgaW1hZ2VzLCBpdCBqdXN0IGdpdmVzIHlvdSBhIGJpdCBtb3JlCisgICBzbGFjayB3aGVuIHlvdXIgcHJvZ3JhbSBpcyBiZWhpbmQuIEJ1dCB5b3UgbmVlZCBhIG11bHRpLXRocmVhZGVkIG9yCisgICBmb3JrZWQgcHJvZ3JhbSB0byByZWFsbHkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlc2UgYnVmZmVycy4KKworICAgVGhlIGFic29sdXRlIG1heGltdW0gaXMgMTAsIGJ1dCBkb24ndCBzZXQgaXQgdG9vIGhpZ2ghICBFdmVyeSBidWZmZXIgdGFrZXMKKyAgIHVwIDQ2MCBLQiBvZiBSQU0sIHNvIHVubGVzcyB5b3UgaGF2ZSBhIGxvdCBvZiBtZW1vcnkgc2V0dGluZyB0aGlzIHRvCisgICBzb21ldGhpbmcgbW9yZSB0aGFuIDQgaXMgYW4gYWJzb2x1dGUgd2FzdGUuICBUaGlzIG1lbW9yeSBpcyBvbmx5CisgICBhbGxvY2F0ZWQgZHVyaW5nIG9wZW4oKSwgc28gbm90aGluZyBpcyB3YXN0ZWQgd2hlbiB0aGUgY2FtZXJhIGlzIG5vdCBpbgorICAgdXNlLgorCitwb3dlcl9zYXZlCisgICBXaGVuIHBvd2VyX3NhdmUgaXMgZW5hYmxlZCAoc2V0IHRvIDEpLCB0aGUgbW9kdWxlIHdpbGwgdHJ5IHRvIHNodXQgZG93bgorICAgdGhlIGNhbSBvbiBjbG9zZSgpIGFuZCByZS1hY3RpdmF0ZSBvbiBvcGVuKCkuIFRoaXMgd2lsbCBzYXZlIHBvd2VyIGFuZAorICAgdHVybiBvZmYgdGhlIExFRC4gTm90IGFsbCBjYW1lcmFzIHN1cHBvcnQgdGhpcyB0aG91Z2ggKHRoZSA2NDUgYW5kIDY0NgorICAgZG9uJ3QgaGF2ZSBwb3dlciBzYXZpbmcgYXQgYWxsKSwgYW5kIHNvbWUgbW9kZWxzIGRvbid0IHdvcmsgZWl0aGVyICh0aGV5CisgICB3aWxsIHNodXQgZG93biwgYnV0IG5ldmVyIHdha2UgdXApLiBDb25zaWRlciB0aGlzIGV4cGVyaW1lbnRhbC4gQnkKKyAgIGRlZmF1bHQgdGhpcyBvcHRpb24gaXMgZGlzYWJsZWQuCisKK2NvbXByZXNzaW9uIChvbmx5IHVzZWZ1bCB3aXRoIHRoZSBwbHVnaW4pCisgICBXaXRoIHRoaXMgb3B0aW9uIHlvdSBjYW4gY29udHJvbCB0aGUgY29tcHJlc3Npb24gZmFjdG9yIHRoYXQgdGhlIGNhbWVyYQorICAgdXNlcyB0byBzcXVlZXplIHRoZSBpbWFnZSB0aHJvdWdoIHRoZSBVU0IgYnVzLiBZb3UgY2FuIHNldCB0aGUgCisgICBwYXJhbWV0ZXIgYmV0d2VlbiAwIGFuZCAzOgorICAgICAwID0gcHJlZmVyIHVuY29tcHJlc3NlZCBpbWFnZXM7IGlmIHRoZSByZXF1ZXN0ZWQgbW9kZSBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgICBpbiBhbiB1bmNvbXByZXNzZWQgZm9ybWF0LCB0aGUgZHJpdmVyIHdpbGwgc2lsZW50bHkgc3dpdGNoIHRvIGxvdworICAgICAgICAgY29tcHJlc3Npb24uCisgICAgIDEgPSBsb3cgY29tcHJlc3Npb24uCisgICAgIDIgPSBtZWRpdW0gY29tcHJlc3Npb24uCisgICAgIDMgPSBoaWdoIGNvbXByZXNzaW9uLgorICAgICAgCisgICBIaWdoIGNvbXByZXNzaW9uIHRha2VzIGxlc3MgYmFuZHdpZHRoIG9mIGNvdXJzZSwgYnV0IGl0IGNvdWxkIGFsc28KKyAgIGludHJvZHVjZSBzb21lIHVud2FudGVkIGFydGVmYWN0cy4gVGhlIGRlZmF1bHQgaXMgMiwgbWVkaXVtIGNvbXByZXNzaW9uLgorICAgU2VlIHRoZSBGQVEgb24gdGhlIHdlYnNpdGUgZm9yIGFuIG92ZXJ2aWV3IG9mIHdoaWNoIG1vZGVzIHJlcXVpcmUKKyAgIGNvbXByZXNzaW9uLgorCisgICBUaGUgY29tcHJlc3Npb24gcGFyYW1ldGVyIGRvZXMgbm90IGFwcGx5IHRvIHRoZSA2NDUgYW5kIDY0NiBjYW1lcmFzCisgICBhbmQgT0VNIG1vZGVscyBkZXJpdmVkIGZyb20gdGhvc2UgKG9ubHkgYSBmZXcpLiBNb3N0IGNhbXMgaG9ub3VyIHRoaXMKKyAgIHBhcmFtZXRlci4KKworbGVkcworICAgVGhpcyBzZXR0aW5ncyB0YWtlcyAyIGludGVnZXJzLCB0aGF0IGRlZmluZSB0aGUgb24vb2ZmIHRpbWUgZm9yIHRoZSBMRUQKKyAgIChpbiBtaWxsaXNlY29uZHMpLiBPbmUgb2YgdGhlIGludGVyZXN0aW5nIHRoaW5ncyB0aGF0IHlvdSBjYW4gZG8gd2l0aAorICAgdGhpcyBpcyBsZXQgdGhlIExFRCBibGluayB3aGlsZSB0aGUgY2FtZXJhIGlzIGluIHVzZS4gVGhpczoKKworICAgICBsZWRzPTUwMCw1MDAKKyAgICAgIAorICAgd2lsbCBibGluayB0aGUgTEVEIG9uY2UgZXZlcnkgc2Vjb25kLiBCdXQgd2l0aDoKKworICAgICBsZWRzPTAsMAorCisgICB0aGUgTEVEIG5ldmVyIGdvZXMgb24sIG1ha2luZyBpdCBzdWl0YWJsZSBmb3Igc2lsZW50IHN1cnZlaWxsYW5jZS4KKworICAgQnkgZGVmYXVsdCB0aGUgY2FtZXJhJ3MgTEVEIGlzIG9uIHNvbGlkIHdoaWxlIGluIHVzZSwgYW5kIHR1cm5lZCBvZmYKKyAgIHdoZW4gdGhlIGNhbWVyYSBpcyBub3QgdXNlZCBhbnltb3JlLgorCisgICBUaGlzIHBhcmFtZXRlciB3b3JrcyBvbmx5IHdpdGggdGhlIFRvVUNhbSByYW5nZSBvZiBjYW1lcmFzICg3MjAsIDczMCwgNzQwLAorICAgNzUwKSBhbmQgT0VNcy4gRm9yIG90aGVyIGNhbWVyYXMgdGhpcyBjb21tYW5kIGlzIHNpbGVudGx5IGlnbm9yZWQsIGFuZCAKKyAgIHRoZSBMRUQgY2Fubm90IGJlIGNvbnRyb2xsZWQuCisKKyAgIEZpbmFsbHk6IHRoaXMgcGFyYW1ldGVycyBkb2VzIG5vdCB0YWtlIGVmZmVjdCBVTlRJTCB0aGUgZmlyc3QgdGltZSB5b3UKKyAgIG9wZW4gdGhlIGNhbWVyYSBkZXZpY2UuIFVudGlsIHRoZW4sIHRoZSBMRUQgcmVtYWlucyBvbi4KKworZGV2X2hpbnQKKyAgIEEgbG9uZyBzdGFuZGluZyBwcm9ibGVtIHdpdGggVVNCIGRldmljZXMgaXMgdGhlaXIgZHluYW1pYyBuYXR1cmU6IHlvdQorICAgbmV2ZXIga25vdyB3aGF0IGRldmljZSBhIGNhbWVyYSBnZXRzIGFzc2lnbmVkOyBpdCBkZXBlbmRzIG9uIG1vZHVsZSBsb2FkCisgICBvcmRlciwgdGhlIGh1YiBjb25maWd1cmF0aW9uLCB0aGUgb3JkZXIgaW4gd2hpY2ggZGV2aWNlcyBhcmUgcGx1Z2dlZCBpbiwKKyAgIGFuZCB0aGUgcGhhc2Ugb2YgdGhlIG1vb24gKGkuZS4gaXQgY2FuIGJlIHJhbmRvbSkuIFdpdGggdGhpcyBvcHRpb24geW91CisgICBjYW4gZ2l2ZSB0aGUgZHJpdmVyIGEgaGludCBhcyB0byB3aGF0IHZpZGVvIGRldmljZSBub2RlICgvZGV2L3ZpZGVvWCkgaXQKKyAgIHNob3VsZCB1c2Ugd2l0aCBhIHNwZWNpZmljIGNhbWVyYS4gVGhpcyBpcyBhbHNvIGhhbmR5IGlmIHlvdSBoYXZlIHR3bworICAgY2FtZXJhcyBvZiB0aGUgc2FtZSBtb2RlbC4KKworICAgQSBjYW1lcmEgaXMgc3BlY2lmaWVkIGJ5IGl0cyB0eXBlICh0aGUgbnVtYmVyIGZyb20gdGhlIGNhbWVyYSBtb2RlbCwKKyAgIGxpa2UgUENBNjQ1LCBQQ1ZDNzUwVkMsIGV0YykgYW5kIG9wdGlvbmFsbHkgdGhlIHNlcmlhbCBudW1iZXIgKHZpc2libGUKKyAgIGluIC9wcm9jL2J1cy91c2IvZGV2aWNlcykuIEEgaGludCBjb25zaXN0cyBvZiBhIHN0cmluZyB3aXRoIHRoZSBmb2xsb3dpbmcKKyAgIGZvcm1hdDoKKworICAgICAgW3R5cGVbLnNlcmlhbG51bWJlcl06XW5vZGUKKyAgICAgIAorICAgVGhlIHNxdWFyZSBicmFja2V0cyBtZWFuIHRoYXQgYm90aCB0aGUgdHlwZSBhbmQgdGhlIHNlcmlhbG51bWJlciBhcmUKKyAgIG9wdGlvbmFsLCBidXQgYSBzZXJpYWxudW1iZXIgY2Fubm90IGJlIHNwZWNpZmllZCB3aXRob3V0IGEgdHlwZSAod2hpY2gKKyAgIHdvdWxkIGJlIHJhdGhlciBwb2ludGxlc3MpLiBUaGUgc2VyaWFsbnVtYmVyIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSB0eXBlCisgICBieSBhICcuJzsgdGhlIG5vZGUgbnVtYmVyIGJ5IGEgJzonLgorICAgCisgICBUaGlzIHNvbWV3aGF0IGNyeXB0aWMgc3ludGF4IGlzIGJlc3QgZXhwbGFpbmVkIGJ5IGEgZmV3IGV4YW1wbGVzOgorCisgICAgIGRldl9oaW50PTMsNSAgICAgICAgICAgICAgVGhlIGZpcnN0IGRldGVjdGVkIGNhbSBnZXRzIGFzc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL2Rldi92aWRlbzMsIHRoZSBzZWNvbmQgL2Rldi92aWRlbzUuIEFueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIGNhbWVyYXMgd2lsbCBnZXQgdGhlIGZpcnN0IGZyZWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHNsb3QgKHNlZSBiZWxvdykuCisKKyAgICAgZGV2X2hpbnQ9NjQ1OjEsNjgwOjIgICAgICBUaGUgUENBNjQ1IGNhbWVyYSB3aWxsIGdldCAvZGV2L3ZpZGVvMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYSBQQ1ZDNjgwIC9kZXYvdmlkZW8yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICBkZXZfaGludD02NDUuMDEyMzozLDY0NS40NTY3OjAJVGhlIFBDQTY0NSBjYW1lcmEgd2l0aCBzZXJpYWxudW1iZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEyMyBnb2VzIHRvIC9kZXYvdmlkZW8zLCB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYSBtb2RlbCB3aXRoIHRoZSA0NTY3IHNlcmlhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHMgL2Rldi92aWRlbzAuCisKKyAgICAgZGV2X2hpbnQ9NzUwOjEsNCw1LDYgICAgICAgVGhlIFBDVkM3NTAgY2FtZXJhIHdpbGwgZ2V0IC9kZXYvdmlkZW8xLCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgMyBQaGlsaXBzIGNhbXMgd2lsbCB1c2UgL2Rldi92aWRlbzQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm91Z2ggL2Rldi92aWRlbzYuCisKKyAgIFNvbWUgcG9pbnRzIHdvcnRoIGtub3dpbmc6CisgICAtIFNlcmlhbG51bWJlcnMgYXJlIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtdXN0IGJlIHdyaXR0ZW4gZnVsbCwgaW5jbHVkaW5nIAorICAgICBsZWFkaW5nIHplcm9lcyAoaXQncyB0cmVhdGVkIGFzIGEgc3RyaW5nKS4KKyAgIC0gSWYgYSBkZXZpY2Ugbm9kZSBpcyBhbHJlYWR5IG9jY3VwaWVkLCByZWdpc3RyYXRpb24gd2lsbCBmYWlsIGFuZCAKKyAgICAgdGhlIHdlYmNhbSBpcyBub3QgYXZhaWxhYmxlLgorICAgLSBZb3UgY2FuIGhhdmUgdXAgdG8gNjQgdmlkZW8gZGV2aWNlczsgYmUgc3VyZSB0byBtYWtlIGVub3VnaCBkZXZpY2UKKyAgICAgbm9kZXMgaW4gL2RldiBpZiB5b3Ugd2FudCB0byBzcHJlYWQgdGhlIG51bWJlcnMgKHRoaXMgZG9lcyBub3QgYXBwbHkKKyAgICAgdG8gZGV2ZnMpLiBBZnRlciAvZGV2L3ZpZGVvOSBjb21lcyAvZGV2L3ZpZGVvMTAgKG5vdCAvZGV2L3ZpZGVvQSkuCisgICAtIElmIGEgY2FtZXJhIGRvZXMgbm90IG1hdGNoIGFueSBkZXZfaGludCwgaXQgd2lsbCBzaW1wbHkgZ2V0IGFzc2lnbmVkCisgICAgIHRoZSBmaXJzdCBhdmFpbGFibGUgZGV2aWNlIG5vZGUsIGp1c3QgYXMgaXQgdXNlZCB0byBiZS4KKwordHJhY2UKKyAgIEluIG9yZGVyIHRvIGJldHRlciBkZXRlY3QgcHJvYmxlbXMsIGl0IGlzIG5vdyBwb3NzaWJsZSB0byB0dXJuIG9uIGEKKyAgICd0cmFjZScgb2Ygc29tZSBvZiB0aGUgY2FsbHMgdGhlIG1vZHVsZSBtYWtlczsgaXQgbG9ncyBhbGwgaXRlbXMgaW4geW91cgorICAga2VybmVsIGxvZyBhdCBkZWJ1ZyBsZXZlbC4KKworICAgVGhlIHRyYWNlIHZhcmlhYmxlIGlzIGEgYml0bWFzazsgZWFjaCBiaXQgcmVwcmVzZW50cyBhIGNlcnRhaW4gZmVhdHVyZS4KKyAgIElmIHlvdSB3YW50IHRvIHRyYWNlIHNvbWV0aGluZywgbG9vayB1cCB0aGUgYml0IHZhbHVlKHMpIGluIHRoZSB0YWJsZSAKKyAgIGJlbG93LCBhZGQgdGhlIHZhbHVlcyB0b2dldGhlciBhbmQgc3VwcGx5IHRoYXQgdG8gdGhlIHRyYWNlIHZhcmlhYmxlLgorCisgICBWYWx1ZSAgVmFsdWUgICBEZXNjcmlwdGlvbgkJCQkJICAgRGVmYXVsdAorICAgKGRlYykgIChoZXgpCisgICAgICAgMSAgICAweDEgICBNb2R1bGUgaW5pdGlhbGl6YXRpb247IHRoaXMgd2lsbCBsb2cgbWVzc2FnZXMgICAgICAgT24KKyAgICAgICAgICAgICAgICAgIHdoaWxlIGxvYWRpbmcgYW5kIHVubG9hZGluZyB0aGUgbW9kdWxlCisKKyAgICAgICAyICAgIDB4MiAgIHByb2JlKCkgYW5kIGRpc2Nvbm5lY3QoKSB0cmFjZXMgICAgICAgICAgICAgICAgICAgICBPbgorCisgICAgICAgNCAgICAweDQgICBUcmFjZSBvcGVuKCkgYW5kIGNsb3NlKCkgY2FsbHMgICAgICAgICAgICAgICAgICAgICAgT2ZmCisKKyAgICAgICA4ICAgIDB4OCAgIHJlYWQoKSwgbW1hcCgpIGFuZCBhc3NvY2lhdGVkIGlvY3RsKCkgY2FsbHMgICAgICAgICBPZmYKKworICAgICAgMTYgICAweDEwICAgTWVtb3J5IGFsbG9jYXRpb24gb2YgYnVmZmVycywgZXRjLiAgICAgICAgICAgICAgICAgIE9mZgorCisgICAgICAzMiAgIDB4MjAgICBTaG93aW5nIHVuZGVyZmxvdywgb3ZlcmZsb3cgYW5kIER1bXBpbmcgZnJhbWUgICAgICAgT24KKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzCisKKyAgICAgIDY0ICAgMHg0MCAgIFNob3cgdmlld3BvcnQgYW5kIGltYWdlIHNpemVzICAgICAgICAgICAgICAgICAgICAgICBPZmYKKworICAgICAxMjggICAweDgwICAgUFdDWCBkZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZgorCisgICBGb3IgZXhhbXBsZSwgdG8gdHJhY2UgdGhlIG9wZW4oKSAmIHJlYWQoKSBmdWN0aW9ucywgc3VtIDggKyA0ID0gMTIsCisgICBzbyB5b3Ugd291bGQgc3VwcGx5IHRyYWNlPTEyIGR1cmluZyBpbnNtb2Qgb3IgbW9kcHJvYmUuIElmCisgICB5b3Ugd2FudCB0byB0dXJuIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgcHJvYmluZyB0cmFjaW5nIG9mZiwgc2V0IHRyYWNlPTAuCisgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdHJhY2UgaXMgMzUgKDB4MjMpLgorCisKKworRXhhbXBsZToKKyAgICAgCisgICAgICMgbW9kcHJvYmUgcHdjIHNpemU9Y2lmIGZwcz0xNSBwb3dlcl9zYXZlPTEKKworVGhlIGZidWZzLCBtYnVmcyBhbmQgdHJhY2UgcGFyYW1ldGVycyBhcmUgZ2xvYmFsIGFuZCBhcHBseSB0byBhbGwgY29ubmVjdGVkCitjYW1lcmFzLiBFYWNoIGNhbWVyYSBoYXMgaXRzIG93biBzZXQgb2YgYnVmZmVycy4KKworc2l6ZSBhbmQgZnBzIG9ubHkgc3BlY2lmeSBkZWZhdWx0cyB3aGVuIHlvdSBvcGVuKCkgdGhlIGRldmljZTsgdGhpcyBpcyB0bworYWNjb21tb2RhdGUgc29tZSB0b29scyB0aGF0IGRvbid0IHNldCB0aGUgc2l6ZS4gWW91IGNhbiBjaGFuZ2UgdGhlc2UKK3NldHRpbmdzIGFmdGVyIG9wZW4oKSB3aXRoIHRoZSBWaWRlbzRMaW51eCBpb2N0bCgpIGNhbGxzLiBUaGUgZGVmYXVsdCBvZgorZGVmYXVsdHMgaXMgUUNJRiBzaXplIGF0IDEwIGZwcy4KKworVGhlIGNvbXByZXNzaW9uIHBhcmFtZXRlciBpcyBzZW1pZ2xvYmFsOyBpdCBzZXRzIHRoZSBpbml0aWFsIGNvbXByZXNzaW9uCitwcmVmZXJlbmNlIGZvciBhbGwgY2FtZXJhJ3MsIGJ1dCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHBlciBjYW1lcmEgd2l0aAordGhlIFZJRElPQ1BXQ1NDUVVBTCBpb2N0bCgpIGNhbGwuCisKK0FsbCBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbC4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1jdHJsLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmFhOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1jdHJsLmMKQEAgLTAsMCArMSwxNjMwIEBACisvKiBEcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICBGdW5jdGlvbnMgdGhhdCBzZW5kIHZhcmlvdXMgY29udHJvbCBtZXNzYWdlcyB0byB0aGUgd2ViY2FtLCBpbmNsdWRpbmcKKyAgIHZpZGVvIG1vZGVzLgorICAgKEMpIDE5OTktMjAwMyBOZW1vc29mdCBVbnYuCisgICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKy8qCisgICBDaGFuZ2VzCisgICAyMDAxLzA4LzAzICBBbHZhcmFkbyAgIEFkZGVkIG1ldGhvZHMgZm9yIGNoYW5naW5nIHdoaXRlIGJhbGFuY2UgYW5kIAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWQvZ3JlZW4gZ2FpbnMKKyAqLworCisvKiBDb250cm9sIGZ1bmN0aW9ucyBmb3IgdGhlIGNhbTsgYnJpZ2h0bmVzcywgY29udHJhc3QsIHZpZGVvIG1vZGUsIGV0Yy4gKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPiAKKyNlbmRpZgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyAKKyNpbmNsdWRlICJwd2MuaCIKKyNpbmNsdWRlICJwd2MtaW9jdGwuaCIKKyNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgorI2luY2x1ZGUgInB3Yy1raWFyYS5oIgorI2luY2x1ZGUgInB3Yy10aW1vbi5oIgorI2luY2x1ZGUgInB3Yy1kZWMxLmgiCisjaW5jbHVkZSAicHdjLWRlYzIzLmgiCisKKy8qIFJlcXVlc3QgdHlwZXM6IHZpZGVvICovCisjZGVmaW5lIFNFVF9MVU1fQ1RMCQkJMHgwMQorI2RlZmluZSBHRVRfTFVNX0NUTAkJCTB4MDIKKyNkZWZpbmUgU0VUX0NIUk9NX0NUTAkJCTB4MDMKKyNkZWZpbmUgR0VUX0NIUk9NX0NUTAkJCTB4MDQKKyNkZWZpbmUgU0VUX1NUQVRVU19DVEwJCQkweDA1CisjZGVmaW5lIEdFVF9TVEFUVVNfQ1RMCQkJMHgwNgorI2RlZmluZSBTRVRfRVBfU1RSRUFNX0NUTAkJMHgwNworI2RlZmluZSBHRVRfRVBfU1RSRUFNX0NUTAkJMHgwOAorI2RlZmluZSBTRVRfTVBUX0NUTAkJCTB4MEQKKyNkZWZpbmUgR0VUX01QVF9DVEwJCQkweDBFCisKKy8qIFNlbGVjdG9ycyBmb3IgdGhlIEx1bWluYW5jZSBjb250cm9scyBbR1NdRVRfTFVNX0NUTCAqLworI2RlZmluZSBBR0NfTU9ERV9GT1JNQVRURVIJCQkweDIwMDAKKyNkZWZpbmUgUFJFU0VUX0FHQ19GT1JNQVRURVIJCQkweDIxMDAKKyNkZWZpbmUgU0hVVFRFUl9NT0RFX0ZPUk1BVFRFUgkJCTB4MjIwMAorI2RlZmluZSBQUkVTRVRfU0hVVFRFUl9GT1JNQVRURVIJCTB4MjMwMAorI2RlZmluZSBQUkVTRVRfQ09OVE9VUl9GT1JNQVRURVIJCTB4MjQwMAorI2RlZmluZSBBVVRPX0NPTlRPVVJfRk9STUFUVEVSCQkJMHgyNTAwCisjZGVmaW5lIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUgkweDI2MDAKKyNkZWZpbmUgQ09OVFJBU1RfRk9STUFUVEVSCQkJMHgyNzAwCisjZGVmaW5lIERZTkFNSUNfTk9JU0VfQ09OVFJPTF9GT1JNQVRURVIJCTB4MjgwMAorI2RlZmluZSBGTElDS0VSTEVTU19NT0RFX0ZPUk1BVFRFUgkJMHgyOTAwCisjZGVmaW5lIEFFX0NPTlRST0xfU1BFRUQJCQkweDJBMDAKKyNkZWZpbmUgQlJJR0hUTkVTU19GT1JNQVRURVIJCQkweDJCMDAKKyNkZWZpbmUgR0FNTUFfRk9STUFUVEVSCQkJCTB4MkMwMAorCisvKiBTZWxlY3RvcnMgZm9yIHRoZSBDaHJvbWluYW5jZSBjb250cm9scyBbR1NdRVRfQ0hST01fQ1RMICovCisjZGVmaW5lIFdCX01PREVfRk9STUFUVEVSCQkJMHgxMDAwCisjZGVmaW5lIEFXQl9DT05UUk9MX1NQRUVEX0ZPUk1BVFRFUgkJMHgxMTAwCisjZGVmaW5lIEFXQl9DT05UUk9MX0RFTEFZX0ZPUk1BVFRFUgkJMHgxMjAwCisjZGVmaW5lIFBSRVNFVF9NQU5VQUxfUkVEX0dBSU5fRk9STUFUVEVSCTB4MTMwMAorI2RlZmluZSBQUkVTRVRfTUFOVUFMX0JMVUVfR0FJTl9GT1JNQVRURVIJMHgxNDAwCisjZGVmaW5lIENPTE9VUl9NT0RFX0ZPUk1BVFRFUgkJCTB4MTUwMAorI2RlZmluZSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMQkJMHgxNjAwCisjZGVmaW5lIFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIyCQkweDE3MDAKKworLyogU2VsZWN0b3JzIGZvciB0aGUgU3RhdHVzIGNvbnRyb2xzIFtHU11FVF9TVEFUVVNfQ1RMICovCisjZGVmaW5lIFNBVkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIJCTB4MDIwMAorI2RlZmluZSBSRVNUT1JFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSCQkweDAzMDAKKyNkZWZpbmUgUkVTVE9SRV9GQUNUT1JZX0RFRkFVTFRTX0ZPUk1BVFRFUgkweDA0MDAKKyNkZWZpbmUgUkVBRF9BR0NfRk9STUFUVEVSCQkJMHgwNTAwCisjZGVmaW5lIFJFQURfU0hVVFRFUl9GT1JNQVRURVIJCQkweDA2MDAKKyNkZWZpbmUgUkVBRF9SRURfR0FJTl9GT1JNQVRURVIJCQkweDA3MDAKKyNkZWZpbmUgUkVBRF9CTFVFX0dBSU5fRk9STUFUVEVSCQkweDA4MDAKKyNkZWZpbmUgU0VOU09SX1RZUEVfRk9STUFUVEVSMQkJCTB4MEMwMAorI2RlZmluZSBSRUFEX1JBV19ZX01FQU5fRk9STUFUVEVSCQkweDMxMDAKKyNkZWZpbmUgU0VUX1BPV0VSX1NBVkVfTU9ERV9GT1JNQVRURVIJCTB4MzIwMAorI2RlZmluZSBNSVJST1JfSU1BR0VfRk9STUFUVEVSCQkJMHgzMzAwCisjZGVmaW5lIExFRF9GT1JNQVRURVIJCQkJMHgzNDAwCisjZGVmaW5lIFNFTlNPUl9UWVBFX0ZPUk1BVFRFUjIJCQkweDM3MDAKKworLyogRm9ybWF0dGVycyBmb3IgdGhlIFZpZGVvIEVuZHBvaW50IGNvbnRyb2xzIFtHU11FVF9FUF9TVFJFQU1fQ1RMICovCisjZGVmaW5lIFZJREVPX09VVFBVVF9DT05UUk9MX0ZPUk1BVFRFUgkJMHgwMTAwCisKKy8qIEZvcm1hdHRlcnMgZm9yIHRoZSBtb3Rvcml6ZWQgcGFuICYgdGlsdCBbR1NdRVRfTVBUX0NUTCAqLworI2RlZmluZSBQVF9SRUxBVElWRV9DT05UUk9MX0ZPUk1BVFRFUgkJMHgwMQorI2RlZmluZSBQVF9SRVNFVF9DT05UUk9MX0ZPUk1BVFRFUgkJMHgwMgorI2RlZmluZSBQVF9TVEFUVVNfRk9STUFUVEVSCQkJMHgwMworCitzdGF0aWMgY2hhciAqc2l6ZTJuYW1lW1BTWl9NQVhdID0KK3sKKwkic3ViUUNJRiIsCisJIlFTSUYiLAorCSJRQ0lGIiwKKwkiU0lGIiwKKwkiQ0lGIiwKKwkiVkdBIiwKK307ICAKKworLyoqKioqKioqLworCisvKiBFbnRyaWVzIGZvciB0aGUgTmFsYSAoNjQ1LzY0NikgY2FtZXJhOyB0aGUgTmFsYSBkb2Vzbid0IGhhdmUgY29tcHJlc3Npb24gCisgICBwcmVmZXJlbmNlcywgc28geW91IGVpdGhlciBnZXQgY29tcHJlc3NlZCBvciBub24tY29tcHJlc3NlZCBzdHJlYW1zLgorICAgCisgICBBbiBhbHRlcm5hdGUgdmFsdWUgb2YgMCBtZWFucyB0aGlzIG1vZGUgaXMgbm90IGF2YWlsYWJsZSBhdCBhbGwuCisgKi8KKworc3RydWN0IE5hbGFfdGFibGVfZW50cnkgeworCWNoYXIgYWx0ZXJuYXRlOwkJCS8qIFVTQiBhbHRlcm5hdGUgc2V0dGluZyAqLworCWludCBjb21wcmVzc2VkOwkJCS8qIENvbXByZXNzZWQgeWVzL25vICovCisKKwl1bnNpZ25lZCBjaGFyIG1vZGVbM107CQkvKiBwcmVjb21wdXRlZCBtb2RlIHRhYmxlICovCit9OworCitzdGF0aWMgc3RydWN0IE5hbGFfdGFibGVfZW50cnkgTmFsYV90YWJsZVtQU1pfTUFYXVs4XSA9Cit7CisjaW5jbHVkZSAicHdjLW5hbGEuaCIKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBTZW5kQ29udHJvbE1zZyhyZXF1ZXN0LCB2YWx1ZSwgYnVmbGVuKSBcCisJdXNiX2NvbnRyb2xfbXNnKHBkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShwZGV2LT51ZGV2LCAwKSwgXAorCQlyZXF1ZXN0LCBcCisJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwgXAorCQl2YWx1ZSwgXAorCQlwZGV2LT52Y2ludGVyZmFjZSwgXAorCQkmYnVmLCBidWZsZW4sIDUwMCkKKworI2RlZmluZSBSZWN2Q29udHJvbE1zZyhyZXF1ZXN0LCB2YWx1ZSwgYnVmbGVuKSBcCisJdXNiX2NvbnRyb2xfbXNnKHBkZXYtPnVkZXYsIHVzYl9yY3ZjdHJscGlwZShwZGV2LT51ZGV2LCAwKSwgXAorCQlyZXF1ZXN0LCBcCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLCBcCisJCXZhbHVlLCBcCisJCXBkZXYtPnZjaW50ZXJmYWNlLCBcCisJCSZidWYsIGJ1ZmxlbiwgNTAwKQorCisKKyNpZiBQV0NfREVCVUcKK3ZvaWQgcHdjX2hleGR1bXAodm9pZCAqcCwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpzOworCWNoYXIgYnVmWzEwMF0sICpkOworCisJcyA9ICh1bnNpZ25lZCBjaGFyICopcDsKKwlkID0gYnVmOworCSpkID0gJ1wwJzsKKwlEZWJ1ZygiRG9pbmcgaGV4ZHVtcCBAICVwLCAlZCBieXRlcy5cbiIsIHAsIGxlbik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWQgKz0gc3ByaW50ZihkLCAiJTAyWCAiLCAqcysrKTsKKwkJaWYgKChpICYgMHhGKSA9PSAweEYpIHsKKwkJCURlYnVnKCIlc1xuIiwgYnVmKTsKKwkJCWQgPSBidWY7CisJCQkqZCA9ICdcMCc7CisJCX0KKwl9CisJaWYgKChpICYgMHhGKSAhPSAwKQorCQlEZWJ1ZygiJXNcbiIsIGJ1Zik7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgc2VuZF92aWRlb19jb21tYW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgaW5kZXgsIHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHVkZXYsCisJCXVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJU0VUX0VQX1NUUkVBTV9DVEwsCisJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJVklERU9fT1VUUFVUX0NPTlRST0xfRk9STUFUVEVSLAorCQlpbmRleCwKKwkJYnVmLCBidWZsZW4sIDEwMDApOworfQorCisKKworc3RhdGljIGlubGluZSBpbnQgc2V0X3ZpZGVvX21vZGVfTmFsYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNpemUsIGludCBmcmFtZXMpCit7CisJdW5zaWduZWQgY2hhciBidWZbM107CisJaW50IHJldCwgZnBzOworCXN0cnVjdCBOYWxhX3RhYmxlX2VudHJ5ICpwRW50cnk7CisJaW50IGZyYW1lczJmcmFtZXNbMzFdID0KKwl7IC8qIGNsb3Nlc3QgbWF0Y2ggb2YgZnJhbWVyYXRlICovCisJICAgMCwgIDAsICAwLCAgMCwgIDQsICAvKiAgMC00ICAqLworCSAgIDUsICA1LCAgNywgIDcsIDEwLCAgLyogIDUtOSAgKi8KKyAgICAgICAgICAxMCwgMTAsIDEyLCAxMiwgMTUsICAvKiAxMC0xNCAqLworICAgICAgICAgIDE1LCAxNSwgMTUsIDIwLCAyMCwgIC8qIDE1LTE5ICovCisgICAgICAgICAgMjAsIDIwLCAyMCwgMjQsIDI0LCAgLyogMjAtMjQgKi8KKyAgICAgICAgICAyNCwgMjQsIDI0LCAyNCwgMjQsICAvKiAyNS0yOSAqLworICAgICAgICAgIDI0ICAgICAgICAgICAgICAgICAgIC8qIDMwICAgICovCisJfTsKKwlpbnQgZnJhbWVzMnRhYmxlWzMxXSA9IAorCXsgMCwgMCwgMCwgMCwgMCwgLyogIDAtNCAgKi8KKwkgIDEsIDEsIDEsIDIsIDIsIC8qICA1LTkgICovCisJICAzLCAzLCA0LCA0LCA0LCAvKiAxMC0xNCAqLworCSAgNSwgNSwgNSwgNSwgNSwgLyogMTUtMTkgKi8KKwkgIDYsIDYsIDYsIDYsIDcsIC8qIDIwLTI0ICovCisJICA3LCA3LCA3LCA3LCA3LCAvKiAyNS0yOSAqLworCSAgNyAgICAgICAgICAgICAgLyogMzAgICAgKi8KKwl9OworCQorCWlmIChzaXplIDwgMCB8fCBzaXplID4gUFNaX0NJRiB8fCBmcmFtZXMgPCA0IHx8IGZyYW1lcyA+IDI1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmcmFtZXMgPSBmcmFtZXMyZnJhbWVzW2ZyYW1lc107CisJZnBzID0gZnJhbWVzMnRhYmxlW2ZyYW1lc107CisJcEVudHJ5ID0gJk5hbGFfdGFibGVbc2l6ZV1bZnBzXTsKKwlpZiAocEVudHJ5LT5hbHRlcm5hdGUgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocEVudHJ5LT5jb21wcmVzc2VkKQorCQlyZXR1cm4gLUVOT0VOVDsgLyogTm90IHN1cHBvcnRlZC4gKi8KKworCW1lbWNweShidWYsIHBFbnRyeS0+bW9kZSwgMyk7CQorCXJldCA9IHNlbmRfdmlkZW9fY29tbWFuZChwZGV2LT51ZGV2LCBwZGV2LT52ZW5kcG9pbnQsIGJ1ZiwgMyk7CisJaWYgKHJldCA8IDApIHsKKwkJRGVidWcoIkZhaWxlZCB0byBzZW5kIHZpZGVvIGNvbW1hbmQuLi4gJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChwRW50cnktPmNvbXByZXNzZWQgJiYgcGRldi0+dnBhbGV0dGUgIT0gVklERU9fUEFMRVRURV9SQVcpCisJIHsKKwkgICBzd2l0Y2gocGRldi0+dHlwZSkgeworCSAgICAgY2FzZSA2NDU6CisJICAgICBjYXNlIDY0NjoKKwkgICAgICAgcHdjX2RlYzFfaW5pdChwZGV2LT50eXBlLCBwZGV2LT5yZWxlYXNlLCBidWYsIHBkZXYtPmRlY29tcHJlc3NfZGF0YSk7CisJICAgICAgIGJyZWFrOworCisJICAgICBjYXNlIDY3NToKKwkgICAgIGNhc2UgNjgwOgorCSAgICAgY2FzZSA2OTA6CisJICAgICBjYXNlIDcyMDoKKwkgICAgIGNhc2UgNzMwOgorCSAgICAgY2FzZSA3NDA6CisJICAgICBjYXNlIDc1MDoKKwkgICAgICAgcHdjX2RlYzIzX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOworCSAgICAgICBicmVhazsKKwkgICB9CisJfQorIAorCXBkZXYtPmNtZF9sZW4gPSAzOworCW1lbWNweShwZGV2LT5jbWRfYnVmLCBidWYsIDMpOworCisJLyogU2V0IHZhcmlvdXMgcGFyYW1ldGVycyAqLworCXBkZXYtPnZmcmFtZXMgPSBmcmFtZXM7CisJcGRldi0+dnNpemUgPSBzaXplOworCXBkZXYtPnZhbHRlcm5hdGUgPSBwRW50cnktPmFsdGVybmF0ZTsKKwlwZGV2LT5pbWFnZSA9IHB3Y19pbWFnZV9zaXplc1tzaXplXTsKKwlwZGV2LT5mcmFtZV9zaXplID0gKHBkZXYtPmltYWdlLnggKiBwZGV2LT5pbWFnZS55ICogMykgLyAyOworCWlmIChwRW50cnktPmNvbXByZXNzZWQpIHsKKwkJaWYgKHBkZXYtPnJlbGVhc2UgPCA1KSB7IC8qIDQgZm9sZCBjb21wcmVzc2lvbiAqLworCQkJcGRldi0+dmJhbmRsZW5ndGggPSA1Mjg7CisJCQlwZGV2LT5mcmFtZV9zaXplIC89IDQ7CisJCX0KKwkJZWxzZSB7CisJCQlwZGV2LT52YmFuZGxlbmd0aCA9IDcwNDsKKwkJCXBkZXYtPmZyYW1lX3NpemUgLz0gMzsKKwkJfQorCX0KKwllbHNlCisJCXBkZXYtPnZiYW5kbGVuZ3RoID0gMDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBzZXRfdmlkZW9fbW9kZV9UaW1vbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNpemUsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzEzXTsKKwljb25zdCBzdHJ1Y3QgVGltb25fdGFibGVfZW50cnkgKnBDaG9vc2U7CisJaW50IHJldCwgZnBzOworCisJaWYgKHNpemUgPj0gUFNaX01BWCB8fCBmcmFtZXMgPCA1IHx8IGZyYW1lcyA+IDMwIHx8IGNvbXByZXNzaW9uIDwgMCB8fCBjb21wcmVzc2lvbiA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzaXplID09IFBTWl9WR0EgJiYgZnJhbWVzID4gMTUpCisJCXJldHVybiAtRUlOVkFMOworCWZwcyA9IChmcmFtZXMgLyA1KSAtIDE7CisKKwkvKiBGaW5kIGEgc3VwcG9ydGVkIGZyYW1lcmF0ZSB3aXRoIHByb2dyZXNzaXZlbHkgaGlnaGVyIGNvbXByZXNzaW9uIHJhdGlvcworCSAgIGlmIHRoZSBwcmVmZXJyZWQgcmF0aW8gaXMgbm90IGF2YWlsYWJsZS4KKwkqLworCXBDaG9vc2UgPSBOVUxMOworCXdoaWxlIChjb21wcmVzc2lvbiA8PSAzKSB7CisJICAgcENob29zZSA9ICZUaW1vbl90YWJsZVtzaXplXVtmcHNdW2NvbXByZXNzaW9uXTsKKwkgICBpZiAocENob29zZS0+YWx0ZXJuYXRlICE9IDApCisJICAgICBicmVhazsKKwkgICBjb21wcmVzc2lvbisrOworCX0KKwlpZiAocENob29zZSA9PSBOVUxMIHx8IHBDaG9vc2UtPmFsdGVybmF0ZSA9PSAwKQorCQlyZXR1cm4gLUVOT0VOVDsgLyogTm90IHN1cHBvcnRlZC4gKi8KKworCW1lbWNweShidWYsIHBDaG9vc2UtPm1vZGUsIDEzKTsKKwlpZiAoc25hcHNob3QpCisJCWJ1ZlswXSB8PSAweDgwOworCXJldCA9IHNlbmRfdmlkZW9fY29tbWFuZChwZGV2LT51ZGV2LCBwZGV2LT52ZW5kcG9pbnQsIGJ1ZiwgMTMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHBDaG9vc2UtPmJhbmRsZW5ndGggPiAwICYmIHBkZXYtPnZwYWxldHRlICE9IFZJREVPX1BBTEVUVEVfUkFXKQorCSAgIHB3Y19kZWMyM19pbml0KHBkZXYtPnR5cGUsIHBkZXYtPnJlbGVhc2UsIGJ1ZiwgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKKworCXBkZXYtPmNtZF9sZW4gPSAxMzsKKwltZW1jcHkocGRldi0+Y21kX2J1ZiwgYnVmLCAxMyk7CisKKwkvKiBTZXQgdmFyaW91cyBwYXJhbWV0ZXJzICovCisJcGRldi0+dmZyYW1lcyA9IGZyYW1lczsKKwlwZGV2LT52c2l6ZSA9IHNpemU7CisJcGRldi0+dnNuYXBzaG90ID0gc25hcHNob3Q7CisJcGRldi0+dmFsdGVybmF0ZSA9IHBDaG9vc2UtPmFsdGVybmF0ZTsKKwlwZGV2LT5pbWFnZSA9IHB3Y19pbWFnZV9zaXplc1tzaXplXTsKKwlwZGV2LT52YmFuZGxlbmd0aCA9IHBDaG9vc2UtPmJhbmRsZW5ndGg7CisJaWYgKHBDaG9vc2UtPmJhbmRsZW5ndGggPiAwKQorCQlwZGV2LT5mcmFtZV9zaXplID0gKHBDaG9vc2UtPmJhbmRsZW5ndGggKiBwZGV2LT5pbWFnZS55KSAvIDQ7CisJZWxzZQorCQlwZGV2LT5mcmFtZV9zaXplID0gKHBkZXYtPmltYWdlLnggKiBwZGV2LT5pbWFnZS55ICogMTIpIC8gODsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBzZXRfdmlkZW9fbW9kZV9LaWFyYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNpemUsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KQoreworCWNvbnN0IHN0cnVjdCBLaWFyYV90YWJsZV9lbnRyeSAqcENob29zZSA9IE5VTEw7CisJaW50IGZwcywgcmV0OworCXVuc2lnbmVkIGNoYXIgYnVmWzEyXTsKKwlzdHJ1Y3QgS2lhcmFfdGFibGVfZW50cnkgUmF3RW50cnkgPSB7NiwgNzczLCAxMjcyLCB7MHhBRCwgMHhGNCwgMHgxMCwgMHgyNywgMHhCNiwgMHgyNCwgMHg5NiwgMHgwMiwgMHgzMCwgMHgwNSwgMHgwMywgMHg4MH19OworCisJaWYgKHNpemUgPj0gUFNaX01BWCB8fCBmcmFtZXMgPCA1IHx8IGZyYW1lcyA+IDMwIHx8IGNvbXByZXNzaW9uIDwgMCB8fCBjb21wcmVzc2lvbiA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzaXplID09IFBTWl9WR0EgJiYgZnJhbWVzID4gMTUpCisJCXJldHVybiAtRUlOVkFMOworCWZwcyA9IChmcmFtZXMgLyA1KSAtIDE7CisKKwkvKiBzcGVjaWFsIGNhc2U6IFZHQSBAIDUgZnBzIGFuZCBzbmFwc2hvdCBpcyByYXcgYmF5ZXIgbW9kZSAqLworCWlmIChzaXplID09IFBTWl9WR0EgJiYgZnJhbWVzID09IDUgJiYgc25hcHNob3QpCisJeworCQkvKiBPbmx5IGF2YWlsYWJsZSBpbiBjYXNlIHRoZSByYXcgcGFsZXR0ZSBpcyBzZWxlY3RlZCBvciAKKwkJICAgd2UgaGF2ZSB0aGUgZGVjb21wcmVzc29yIGF2YWlsYWJsZS4gVGhpcyBtb2RlIGlzIAorCQkgICBvbmx5IGF2YWlsYWJsZSBpbiBjb21wcmVzc2VkIGZvcm0gCisJCSovCisJCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1JBVykKKwkJeworCSAgICAgICAgICAgICAgICBJbmZvKCJDaG9vc2luZyBWR0EvNSBCQVlFUiBtb2RlICglZCkuXG4iLCBwZGV2LT52cGFsZXR0ZSk7CisJCQlwQ2hvb3NlID0gJlJhd0VudHJ5OworCQl9CisJCWVsc2UKKwkJeworCQkJSW5mbygiVkdBLzUgQkFZRVIgbW9kZSBfbXVzdF8gaGF2ZSBhIGRlY29tcHJlc3NvciBhdmFpbGFibGUsIG9yIHVzZSBSQVcgcGFsZXR0ZS5cbiIpOworCQl9CisJfQorCWVsc2UKKwl7CisgICAgICAgIAkvKiBGaW5kIGEgc3VwcG9ydGVkIGZyYW1lcmF0ZSB3aXRoIHByb2dyZXNzaXZlbHkgaGlnaGVyIGNvbXByZXNzaW9uIHJhdGlvcworCQkgICBpZiB0aGUgcHJlZmVycmVkIHJhdGlvIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgICAgU2tpcCB0aGlzIHN0ZXAgd2hlbiB1c2luZyBSQVcgbW9kZXMuCisJCSovCisJCXdoaWxlIChjb21wcmVzc2lvbiA8PSAzKSB7CisJCQlwQ2hvb3NlID0gJktpYXJhX3RhYmxlW3NpemVdW2Zwc11bY29tcHJlc3Npb25dOworCQkJaWYgKHBDaG9vc2UtPmFsdGVybmF0ZSAhPSAwKQorCQkJCWJyZWFrOworCQkJY29tcHJlc3Npb24rKzsKKwkJfQorCX0KKwlpZiAocENob29zZSA9PSBOVUxMIHx8IHBDaG9vc2UtPmFsdGVybmF0ZSA9PSAwKQorCQlyZXR1cm4gLUVOT0VOVDsgLyogTm90IHN1cHBvcnRlZC4gKi8KKworCURlYnVnKCJVc2luZyBhbHRlcm5hdGUgc2V0dGluZyAlZC5cbiIsIHBDaG9vc2UtPmFsdGVybmF0ZSk7CisJCisJLyogdXNiX2NvbnRyb2xfbXNnIHdvbid0IHRha2Ugc3RhdGljbHkgYWxsb2NhdGVkIGFycmF5cyBhcyBhcmd1bWVudD8/ICovCisJbWVtY3B5KGJ1ZiwgcENob29zZS0+bW9kZSwgMTIpOworCWlmIChzbmFwc2hvdCkKKwkJYnVmWzBdIHw9IDB4ODA7CisKKwkvKiBGaXJtd2FyZSBidWc6IHZpZGVvIGVuZHBvaW50IGlzIDUsIGJ1dCBjb21tYW5kcyBhcmUgc2VudCB0byBlbmRwb2ludCA0ICovCisJcmV0ID0gc2VuZF92aWRlb19jb21tYW5kKHBkZXYtPnVkZXYsIDQgLyogcGRldi0+dmVuZHBvaW50ICovLCBidWYsIDEyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCAmJiBwZGV2LT52cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JBVykKKwkgIHB3Y19kZWMyM19pbml0KHBkZXYtPnR5cGUsIHBkZXYtPnJlbGVhc2UsIGJ1ZiwgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKKworCXBkZXYtPmNtZF9sZW4gPSAxMjsKKwltZW1jcHkocGRldi0+Y21kX2J1ZiwgYnVmLCAxMik7CisJLyogQWxsIHNldCBhbmQgZ28gKi8KKwlwZGV2LT52ZnJhbWVzID0gZnJhbWVzOworCXBkZXYtPnZzaXplID0gc2l6ZTsKKwlwZGV2LT52c25hcHNob3QgPSBzbmFwc2hvdDsKKwlwZGV2LT52YWx0ZXJuYXRlID0gcENob29zZS0+YWx0ZXJuYXRlOworCXBkZXYtPmltYWdlID0gcHdjX2ltYWdlX3NpemVzW3NpemVdOworCXBkZXYtPnZiYW5kbGVuZ3RoID0gcENob29zZS0+YmFuZGxlbmd0aDsKKwlpZiAocGRldi0+dmJhbmRsZW5ndGggPiAwKQorCQlwZGV2LT5mcmFtZV9zaXplID0gKHBkZXYtPnZiYW5kbGVuZ3RoICogcGRldi0+aW1hZ2UueSkgLyA0OworCWVsc2UKKwkJcGRldi0+ZnJhbWVfc2l6ZSA9IChwZGV2LT5pbWFnZS54ICogcGRldi0+aW1hZ2UueSAqIDEyKSAvIDg7CisJcmV0dXJuIDA7Cit9CisKKworCisvKioKKyAgIEBwZGV2OiBkZXZpY2Ugc3RydWN0dXJlCisgICBAd2lkdGg6IHZpZXdwb3J0IHdpZHRoCisgICBAaGVpZ2h0OiB2aWV3cG9ydCBoZWlnaHQKKyAgIEBmcmFtZTogZnJhbWVyYXRlLCBpbiBmcHMKKyAgIEBjb21wcmVzc2lvbjogcHJlZmVycmVkIGNvbXByZXNzaW9uIHJhdGlvCisgICBAc25hcHNob3Q6IHNuYXBzaG90IG1vZGUgb3Igc3RyZWFtaW5nCisgKi8KK2ludCBwd2Nfc2V0X3ZpZGVvX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZyYW1lcywgaW50IGNvbXByZXNzaW9uLCBpbnQgc25hcHNob3QpCit7CisgICAgICAgIGludCByZXQsIHNpemU7CisKKyAgICAgICAgVHJhY2UoVFJBQ0VfRkxPVywgInNldF92aWRlb19tb2RlKCVkeCVkIEAgJWQsIHBhbGV0dGUgJWQpLlxuIiwgd2lkdGgsIGhlaWdodCwgZnJhbWVzLCBwZGV2LT52cGFsZXR0ZSk7CisJc2l6ZSA9IHB3Y19kZWNvZGVfc2l6ZShwZGV2LCB3aWR0aCwgaGVpZ2h0KTsKKwlpZiAoc2l6ZSA8IDApIHsKKwkJRGVidWcoIkNvdWxkIG5vdCBmaW5kIHN1aXRhYmxlIHNpemUuXG4iKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQorCURlYnVnKCJkZWNvZGVfc2l6ZSA9ICVkLlxuIiwgc2l6ZSk7CisKKyAgICAgICAgcmV0ID0gLUVJTlZBTDsKKwlzd2l0Y2gocGRldi0+dHlwZSkgeworCWNhc2UgNjQ1OgorCWNhc2UgNjQ2OgorCQlyZXQgPSBzZXRfdmlkZW9fbW9kZV9OYWxhKHBkZXYsIHNpemUsIGZyYW1lcyk7CisJCWJyZWFrOworCisJY2FzZSA2NzU6CisJY2FzZSA2ODA6CisJY2FzZSA2OTA6CisJCXJldCA9IHNldF92aWRlb19tb2RlX1RpbW9uKHBkZXYsIHNpemUsIGZyYW1lcywgY29tcHJlc3Npb24sIHNuYXBzaG90KTsKKwkJYnJlYWs7CisJCisJY2FzZSA3MjA6CisJY2FzZSA3MzA6CisJY2FzZSA3NDA6CisJY2FzZSA3NTA6CisJCXJldCA9IHNldF92aWRlb19tb2RlX0tpYXJhKHBkZXYsIHNpemUsIGZyYW1lcywgY29tcHJlc3Npb24sIHNuYXBzaG90KTsKKwkJYnJlYWs7CisJfQorCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgPT0gLUVOT0VOVCkKKwkJCUluZm8oIlZpZGVvIG1vZGUgJXNAJWQgZnBzIGlzIG9ubHkgc3VwcG9ydGVkIHdpdGggdGhlIGRlY29tcHJlc3NvciBtb2R1bGUgKHB3Y3gpLlxuIiwgc2l6ZTJuYW1lW3NpemVdLCBmcmFtZXMpOworCQllbHNlIHsKKwkJCUVycigiRmFpbGVkIHRvIHNldCB2aWRlbyBtb2RlICVzQCVkIGZwczsgcmV0dXJuIGNvZGUgPSAlZFxuIiwgc2l6ZTJuYW1lW3NpemVdLCBmcmFtZXMsIHJldCk7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisJcGRldi0+dmlldy54ID0gd2lkdGg7CisJcGRldi0+dmlldy55ID0gaGVpZ2h0OworCXBkZXYtPmZyYW1lX3RvdGFsX3NpemUgPSBwZGV2LT5mcmFtZV9zaXplICsgcGRldi0+ZnJhbWVfaGVhZGVyX3NpemUgKyBwZGV2LT5mcmFtZV90cmFpbGVyX3NpemU7CisJcHdjX3NldF9pbWFnZV9idWZmZXJfc2l6ZShwZGV2KTsKKwlUcmFjZShUUkFDRV9TSVpFLCAiU2V0IHZpZXdwb3J0IHRvICVkeCVkLCBpbWFnZSBzaXplIGlzICVkeCVkLlxuIiwgd2lkdGgsIGhlaWdodCwgcHdjX2ltYWdlX3NpemVzW3NpemVdLngsIHB3Y19pbWFnZV9zaXplc1tzaXplXS55KTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHB3Y19zZXRfaW1hZ2VfYnVmZmVyX3NpemUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJaW50IGksIGZhY3RvciA9IDAsIGZpbGxlciA9IDA7CisKKwkvKiBmb3IgUEFMRVRURV9ZVVY0MjBQICovCisJc3dpdGNoKHBkZXYtPnZwYWxldHRlKQorCXsKKwljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDoKKwkJZmFjdG9yID0gNjsKKwkJZmlsbGVyID0gMTI4OworCQlicmVhazsKKwljYXNlIFZJREVPX1BBTEVUVEVfUkFXOgorCQlmYWN0b3IgPSA2OyAvKiBjYW4gYmUgdW5jb21wcmVzc2VkIFlVVjQyMFAgKi8KKwkJZmlsbGVyID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogU2V0IHNpemVzIGluIGJ5dGVzICovCisJcGRldi0+aW1hZ2Uuc2l6ZSA9IHBkZXYtPmltYWdlLnggKiBwZGV2LT5pbWFnZS55ICogZmFjdG9yIC8gNDsKKwlwZGV2LT52aWV3LnNpemUgID0gcGRldi0+dmlldy54ICAqIHBkZXYtPnZpZXcueSAgKiBmYWN0b3IgLyA0OworCisJLyogQWxpZ24gb2Zmc2V0LCBvciB5b3UnbGwgZ2V0IHNvbWUgdmVyeSB3ZWlyZCByZXN1bHRzIGluCisJICAgWVVWNDIwIG1vZGUuLi4geCBtdXN0IGJlIG11bHRpcGxlIG9mIDQgKHRvIGdldCB0aGUgWSdzIGluCisJICAgcGxhY2UpLCBhbmQgeSBldmVuIChvciB5b3UnbGwgbWl4dXAgVSAmIFYpLiBUaGlzIGlzIGxlc3Mgb2YgYQorCSAgIHByb2JsZW0gZm9yIFlVVjQyMFAuCisJICovCisJcGRldi0+b2Zmc2V0LnggPSAoKHBkZXYtPnZpZXcueCAtIHBkZXYtPmltYWdlLngpIC8gMikgJiAweEZGRkM7CisJcGRldi0+b2Zmc2V0LnkgPSAoKHBkZXYtPnZpZXcueSAtIHBkZXYtPmltYWdlLnkpIC8gMikgJiAweEZGRkU7CisKKwkvKiBGaWxsIGJ1ZmZlcnMgd2l0aCBncmF5IG9yIGJsYWNrICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9JTUFHRVM7IGkrKykgeworCQlpZiAocGRldi0+aW1hZ2VfcHRyW2ldICE9IE5VTEwpCisJCQltZW1zZXQocGRldi0+aW1hZ2VfcHRyW2ldLCBmaWxsZXIsIHBkZXYtPnZpZXcuc2l6ZSk7CisJfQorfQorCisKKworLyogQlJJR0hUTkVTUyAqLworCitpbnQgcHdjX2dldF9icmlnaHRuZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWNoYXIgYnVmOworCWludCByZXQ7CisKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfTFVNX0NUTCwgQlJJR0hUTkVTU19GT1JNQVRURVIsIDEpOwkKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gYnVmIDw8IDk7Cit9CisKK2ludCBwd2Nfc2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKK3sKKwljaGFyIGJ1ZjsKKworCWlmICh2YWx1ZSA8IDApCisJCXZhbHVlID0gMDsKKwlpZiAodmFsdWUgPiAweGZmZmYpCisJCXZhbHVlID0gMHhmZmZmOworCWJ1ZiA9ICh2YWx1ZSA+PiA5KSAmIDB4N2Y7CisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9MVU1fQ1RMLCBCUklHSFRORVNTX0ZPUk1BVFRFUiwgMSk7Cit9CisKKy8qIENPTlRSQVNUICovCisKK2ludCBwd2NfZ2V0X2NvbnRyYXN0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWNoYXIgYnVmOworCWludCByZXQ7CisKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfTFVNX0NUTCwgQ09OVFJBU1RfRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gYnVmIDw8IDEwOworfQorCitpbnQgcHdjX3NldF9jb250cmFzdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQoreworCWNoYXIgYnVmOworCisJaWYgKHZhbHVlIDwgMCkKKwkJdmFsdWUgPSAwOworCWlmICh2YWx1ZSA+IDB4ZmZmZikKKwkJdmFsdWUgPSAweGZmZmY7CisJYnVmID0gKHZhbHVlID4+IDEwKSAmIDB4M2Y7CisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9MVU1fQ1RMLCBDT05UUkFTVF9GT1JNQVRURVIsIDEpOworfQorCisvKiBHQU1NQSAqLworCitpbnQgcHdjX2dldF9nYW1tYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwljaGFyIGJ1ZjsKKwlpbnQgcmV0OworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBHQU1NQV9GT1JNQVRURVIsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBidWYgPDwgMTE7Cit9CisKK2ludCBwd2Nfc2V0X2dhbW1hKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCit7CisJY2hhciBidWY7CisKKwlpZiAodmFsdWUgPCAwKQorCQl2YWx1ZSA9IDA7CisJaWYgKHZhbHVlID4gMHhmZmZmKQorCQl2YWx1ZSA9IDB4ZmZmZjsKKwlidWYgPSAodmFsdWUgPj4gMTEpICYgMHgxZjsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0xVTV9DVEwsIEdBTU1BX0ZPUk1BVFRFUiwgMSk7Cit9CisKKworLyogU0FUVVJBVElPTiAqLworCitpbnQgcHdjX2dldF9zYXR1cmF0aW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWNoYXIgYnVmOworCWludCByZXQ7CisKKwlpZiAocGRldi0+dHlwZSA8IDY3NSkKKwkJcmV0dXJuIC0xOworCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9DSFJPTV9DVEwsIHBkZXYtPnR5cGUgPCA3MzAgPyBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMiA6IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMzI3NjggKyBidWYgKiAzMjc7Cit9CisKK2ludCBwd2Nfc2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKK3sKKwljaGFyIGJ1ZjsKKworCWlmIChwZGV2LT50eXBlIDwgNjc1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsdWUgPCAwKQorCQl2YWx1ZSA9IDA7CisJaWYgKHZhbHVlID4gMHhmZmZmKQorCQl2YWx1ZSA9IDB4ZmZmZjsKKwkvKiBzYXR1cmF0aW9uIHJhbmdlcyBmcm9tIC0xMDAgdG8gKzEwMCAqLworCWJ1ZiA9ICh2YWx1ZSAtIDMyNzY4KSAvIDMyNzsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0NIUk9NX0NUTCwgcGRldi0+dHlwZSA8IDczMCA/IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIyIDogU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjEsIDEpOworfQorCisvKiBBR0MgKi8KKworc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9hZ2Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlLCBpbnQgdmFsdWUpCit7CisJY2hhciBidWY7CisJaW50IHJldDsKKwkKKwlpZiAobW9kZSkKKwkJYnVmID0gMHgwOyAvKiBhdXRvICovCisJZWxzZQorCQlidWYgPSAweGZmOyAvKiBmaXhlZCAqLworCisJcmV0ID0gU2VuZENvbnRyb2xNc2coU0VUX0xVTV9DVEwsIEFHQ19NT0RFX0ZPUk1BVFRFUiwgMSk7CisJCisJaWYgKCFtb2RlICYmIHJldCA+PSAwKSB7CisJCWlmICh2YWx1ZSA8IDApCisJCQl2YWx1ZSA9IDA7CisJCWlmICh2YWx1ZSA+IDB4ZmZmZikKKwkJCXZhbHVlID0gMHhmZmZmOworCQlidWYgPSAodmFsdWUgPj4gMTApICYgMHgzRjsKKwkJcmV0ID0gU2VuZENvbnRyb2xNc2coU0VUX0xVTV9DVEwsIFBSRVNFVF9BR0NfRk9STUFUVEVSLCAxKTsKKwl9CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCByZXQ7CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0xVTV9DVEwsIEFHQ19NT0RFX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoYnVmICE9IDApIHsgLyogZml4ZWQgKi8KKwkJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0xVTV9DVEwsIFBSRVNFVF9BR0NfRk9STUFUVEVSLCAxKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAoYnVmID4gMHgzRikKKwkJCWJ1ZiA9IDB4M0Y7CisJCSp2YWx1ZSA9IChidWYgPDwgMTApOwkJCisJfQorCWVsc2UgeyAvKiBhdXRvICovCisJCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9TVEFUVVNfQ1RMLCBSRUFEX0FHQ19GT1JNQVRURVIsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCS8qIEdhaC4uLiB0aGlzIHZhbHVlIHJhbmdlcyBmcm9tIDB4MDAgLi4uIDB4OUYgKi8KKwkJaWYgKGJ1ZiA+IDB4OUYpCisJCQlidWYgPSAweDlGOworCQkqdmFsdWUgPSAtKDQ4ICsgYnVmICogNDA5KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKQoreworCWNoYXIgYnVmWzJdOworCWludCBzcGVlZCwgcmV0OworCisKKwlpZiAobW9kZSkKKwkJYnVmWzBdID0gMHgwOwkvKiBhdXRvICovCisJZWxzZQorCQlidWZbMF0gPSAweGZmOyAvKiBmaXhlZCAqLworCQorCXJldCA9IFNlbmRDb250cm9sTXNnKFNFVF9MVU1fQ1RMLCBTSFVUVEVSX01PREVfRk9STUFUVEVSLCAxKTsKKworCWlmICghbW9kZSAmJiByZXQgPj0gMCkgeworCQlpZiAodmFsdWUgPCAwKQorCQkJdmFsdWUgPSAwOworCQlpZiAodmFsdWUgPiAweGZmZmYpCisJCQl2YWx1ZSA9IDB4ZmZmZjsKKwkJc3dpdGNoKHBkZXYtPnR5cGUpIHsKKwkJY2FzZSA2NzU6CisJCWNhc2UgNjgwOgorCQljYXNlIDY5MDoKKwkJCS8qIHNwZWVkIHJhbmdlcyBmcm9tIDB4MCB0byAweDI5MCAoNjU2KSAqLworCQkJc3BlZWQgPSAodmFsdWUgLyAxMDApOworCQkJYnVmWzFdID0gc3BlZWQgPj4gODsKKwkJCWJ1ZlswXSA9IHNwZWVkICYgMHhmZjsKKwkJCWJyZWFrOworCQljYXNlIDcyMDoKKwkJY2FzZSA3MzA6CisJCWNhc2UgNzQwOgorCQljYXNlIDc1MDoKKwkJCS8qIHNwZWVkIHNlZW1zIHRvIHJhbmdlIGZyb20gMHgwIHRvIDB4ZmYgKi8KKwkJCWJ1ZlsxXSA9IDA7CisJCQlidWZbMF0gPSB2YWx1ZSA+PiA4OworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSLCAyKTsKKwl9CisJcmV0dXJuIHJldDsKK30JCisKKworLyogUE9XRVIgKi8KKworaW50IHB3Y19jYW1lcmFfcG93ZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwb3dlcikKK3sKKwljaGFyIGJ1ZjsKKworCWlmIChwZGV2LT50eXBlIDwgNjc1IHx8IChwZGV2LT50eXBlIDwgNzMwICYmIHBkZXYtPnJlbGVhc2UgPCA2KSkKKwkJcmV0dXJuIDA7CS8qIE5vdCBzdXBwb3J0ZWQgYnkgTmFsYSBvciBUaW1vbiA8IHJlbGVhc2UgNiAqLworCisJaWYgKHBvd2VyKQorCQlidWYgPSAweDAwOyAvKiBhY3RpdmUgKi8KKwllbHNlCisJCWJ1ZiA9IDB4RkY7IC8qIHBvd2VyIHNhdmUgKi8KKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX1NUQVRVU19DVEwsIFNFVF9QT1dFUl9TQVZFX01PREVfRk9STUFUVEVSLCAxKTsKK30KKworCisKKy8qIHByaXZhdGUgY2FsbHMgKi8KKworc3RhdGljIGlubGluZSBpbnQgcHdjX3Jlc3RvcmVfdXNlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwljaGFyIGJ1ZjsgLyogZHVtbXkgKi8KKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX1NUQVRVU19DVEwsIFJFU1RPUkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIsIDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2Nfc2F2ZV91c2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWNoYXIgYnVmOyAvKiBkdW1teSAqLworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfU1RBVFVTX0NUTCwgU0FWRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19yZXN0b3JlX2ZhY3Rvcnkoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJY2hhciBidWY7IC8qIGR1bW15ICovCisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9TVEFUVVNfQ1RMLCBSRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFNfRk9STUFUVEVSLCAwKTsKK30KKworIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyAvKiBQYXRjaCBieSBBbHZhcmFkbzogKG5vdCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiAgICovCisKKyAvKgorICAqIHRoZSBjYW1lcmEgcmVjb2duaXplcyBtb2RlcyBmcm9tIDAgdG8gNDoKKyAgKgorICAqIDAwOiBpbmRvb3IgKGluY2FuZGVzY2FudCBsaWdodGluZykKKyAgKiAwMTogb3V0ZG9vciAoc3VubGlnaHQpCisgICogMDI6IGZsdW9yZXNjZW50IGxpZ2h0aW5nCisgICogMDM6IG1hbnVhbAorICAqIDA0OiBhdXRvCisgICovIAorc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlKQoreworCWNoYXIgYnVmOworCWludCByZXQ7CisJCisJaWYgKG1vZGUgPCAwKQorCSAgICBtb2RlID0gMDsKKwkKKwlpZiAobW9kZSA+IDQpCisJICAgIG1vZGUgPSA0OworCQorCWJ1ZiA9IG1vZGUgJiAweDA3OyAvKiBqdXN0IHRoZSBsb3dlc3QgdGhyZWUgYml0cyAqLworCQorCXJldCA9IFNlbmRDb250cm9sTXNnKFNFVF9DSFJPTV9DVEwsIFdCX01PREVfRk9STUFUVEVSLCAxKTsKKwkKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisJaW50IHJldDsKKwkKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfQ0hST01fQ1RMLCBXQl9NT0RFX0ZPUk1BVFRFUiwgMSk7CisKKwlpZiAocmV0IDwgMCkgCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZjsKKworCWlmICh2YWx1ZSA8IDApCisJCXZhbHVlID0gMDsKKwlpZiAodmFsdWUgPiAweGZmZmYpCisJCXZhbHVlID0gMHhmZmZmOworCS8qIG9ubHkgdGhlIG1zYiBpcyBjb25zaWRlcmVkICovCisJYnVmID0gdmFsdWUgPj4gODsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0NIUk9NX0NUTCwgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCByZXQ7CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0NIUk9NX0NUTCwgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIsIDEpOworCWlmIChyZXQgPCAwKQorCSAgICByZXR1cm4gcmV0OworCSp2YWx1ZSA9IGJ1ZiA8PCA4OworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisKKwlpZiAodmFsdWUgPCAwKQorCQl2YWx1ZSA9IDA7CisJaWYgKHZhbHVlID4gMHhmZmZmKQorCQl2YWx1ZSA9IDB4ZmZmZjsKKwkvKiBvbmx5IHRoZSBtc2IgaXMgY29uc2lkZXJlZCAqLworCWJ1ZiA9IHZhbHVlID4+IDg7CisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9DSFJPTV9DVEwsIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUiwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCByZXQ7CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0NIUk9NX0NUTCwgUFJFU0VUX01BTlVBTF9CTFVFX0dBSU5fRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkgICAgcmV0dXJuIHJldDsKKwkqdmFsdWUgPSBidWYgPDwgODsKKwlyZXR1cm4gMDsKK30KKworCisvKiBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIGRpZmZlcmVudCwgc2luY2UgdGhleSBvbmx5IHJlYWQgdGhlCisgICBpbnRlcm5hbCByZWQvYmx1ZSBnYWlucywgd2hpY2ggbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBtYW51YWwgCisgICBnYWlucyBzZXQgb3IgcmVhZCBhYm92ZS4KKyAqLyAgIAorc3RhdGljIGlubGluZSBpbnQgcHdjX3JlYWRfcmVkX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisJaW50IHJldDsKKwkKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfU1RBVFVTX0NUTCwgUkVBRF9SRURfR0FJTl9GT1JNQVRURVIsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCSp2YWx1ZSA9IGJ1ZiA8PCA4OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfcmVhZF9ibHVlX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisJaW50IHJldDsKKwkKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfU1RBVFVTX0NUTCwgUkVBRF9CTFVFX0dBSU5fRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsdWUgPSBidWYgPDwgODsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X3diX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgc3BlZWQpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisJCisJLyogdXNlZnVsIHJhbmdlIGlzIDB4MDEuLjB4MjAgKi8KKwlidWYgPSBzcGVlZCAvIDB4N2YwOworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfQ0hST01fQ1RMLCBBV0JfQ09OVFJPTF9TUEVFRF9GT1JNQVRURVIsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X3diX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCByZXQ7CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0NIUk9NX0NUTCwgQVdCX0NPTlRST0xfU1BFRURfRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsdWUgPSBidWYgKiAweDdmMDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X3diX2RlbGF5KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgZGVsYXkpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisJCisJLyogdXNlZnVsIHJhbmdlIGlzIDB4MDEuLjB4M0YgKi8KKwlidWYgPSAoZGVsYXkgPj4gMTApOworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfQ0hST01fQ1RMLCBBV0JfQ09OVFJPTF9ERUxBWV9GT1JNQVRURVIsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X3diX2RlbGF5KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCByZXQ7CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0NIUk9NX0NUTCwgQVdCX0NPTlRST0xfREVMQVlfRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsdWUgPSBidWYgPDwgMTA7CisJcmV0dXJuIDA7Cit9CisKKworaW50IHB3Y19zZXRfbGVkcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG9uX3ZhbHVlLCBpbnQgb2ZmX3ZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzJdOworCisJaWYgKHBkZXYtPnR5cGUgPCA3MzApCisJCXJldHVybiAwOworCW9uX3ZhbHVlIC89IDEwMDsKKwlvZmZfdmFsdWUgLz0gMTAwOworCWlmIChvbl92YWx1ZSA8IDApCisJCW9uX3ZhbHVlID0gMDsKKwlpZiAob25fdmFsdWUgPiAweGZmKQorCQlvbl92YWx1ZSA9IDB4ZmY7CisJaWYgKG9mZl92YWx1ZSA8IDApCisJCW9mZl92YWx1ZSA9IDA7CisJaWYgKG9mZl92YWx1ZSA+IDB4ZmYpCisJCW9mZl92YWx1ZSA9IDB4ZmY7CisKKwlidWZbMF0gPSBvbl92YWx1ZTsKKwlidWZbMV0gPSBvZmZfdmFsdWU7CisKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX1NUQVRVU19DVEwsIExFRF9GT1JNQVRURVIsIDIpOworfQorCitpbnQgcHdjX2dldF9sZWRzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKm9uX3ZhbHVlLCBpbnQgKm9mZl92YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKwlpbnQgcmV0OworCQorCWlmIChwZGV2LT50eXBlIDwgNzMwKSB7CisJCSpvbl92YWx1ZSA9IC0xOworCQkqb2ZmX3ZhbHVlID0gLTE7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9TVEFUVVNfQ1RMLCBMRURfRk9STUFUVEVSLCAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqb25fdmFsdWUgPSBidWZbMF0gKiAxMDA7CisJKm9mZl92YWx1ZSA9IGJ1ZlsxXSAqIDEwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9jb250b3VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29udG91cikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgcmV0OworCQorCWlmIChjb250b3VyIDwgMCkKKwkJYnVmID0gMHhmZjsgLyogYXV0byBjb250b3VyIG9uICovCisJZWxzZQorCQlidWYgPSAweDA7IC8qIGF1dG8gY29udG91ciBvZmYgKi8KKwlyZXQgPSBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgQVVUT19DT05UT1VSX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJCisJaWYgKGNvbnRvdXIgPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAoY29udG91ciA+IDB4ZmZmZikKKwkJY29udG91ciA9IDB4ZmZmZjsKKwkKKwlidWYgPSAoY29udG91ciA+PiAxMCk7IC8qIGNvbnRvdXIgcHJlc2V0IGlzIFswLi4zZl0gKi8KKwlyZXQgPSBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgUFJFU0VUX0NPTlRPVVJfRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkJCisJCXJldHVybiByZXQ7CQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X2NvbnRvdXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqY29udG91cikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgcmV0OworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBBVVRPX0NPTlRPVVJfRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChidWYgPT0gMCkgeworCQkvKiBhdXRvIG1vZGUgb2ZmLCBxdWVyeSBjdXJyZW50IHByZXNldCB2YWx1ZSAqLworCQlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfTFVNX0NUTCwgUFJFU0VUX0NPTlRPVVJfRk9STUFUVEVSLCAxKTsKKwkJaWYgKHJldCA8IDApCQorCQkJcmV0dXJuIHJldDsKKwkJKmNvbnRvdXIgPSBidWYgPDwgMTA7CisJfQorCWVsc2UKKwkJKmNvbnRvdXIgPSAtMTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X2JhY2tsaWdodChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGJhY2tsaWdodCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwkKKwlpZiAoYmFja2xpZ2h0KQorCQlidWYgPSAweGZmOworCWVsc2UKKwkJYnVmID0gMHgwOworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgQkFDS19MSUdIVF9DT01QRU5TQVRJT05fRk9STUFUVEVSLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqYmFja2xpZ2h0KQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciBidWY7CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0xVTV9DVEwsIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKmJhY2tsaWdodCA9IGJ1ZjsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X2ZsaWNrZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGlja2VyKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCQorCWlmIChmbGlja2VyKQorCQlidWYgPSAweGZmOworCWVsc2UKKwkJYnVmID0gMHgwOworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgRkxJQ0tFUkxFU1NfTU9ERV9GT1JNQVRURVIsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X2ZsaWNrZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqZmxpY2tlcikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgYnVmOworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBGTElDS0VSTEVTU19NT0RFX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKmZsaWNrZXIgPSBidWY7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9keW5hbWljX25vaXNlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbm9pc2UpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisKKwlpZiAobm9pc2UgPCAwKQorCQlub2lzZSA9IDA7CisJaWYgKG5vaXNlID4gMykKKwkJbm9pc2UgPSAzOworCWJ1ZiA9IG5vaXNlOworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgRFlOQU1JQ19OT0lTRV9DT05UUk9MX0ZPUk1BVFRFUiwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpub2lzZSkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgYnVmOworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBEWU5BTUlDX05PSVNFX0NPTlRST0xfRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqbm9pc2UgPSBidWY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHdjX21wdF9yZXNldChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsYWdzKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCQorCWJ1ZiA9IGZsYWdzICYgMHgwMzsgLy8gb25seSBsb3dlciB0d28gYml0cyBhcmUgY3VycmVudGx5IHVzZWQKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX01QVF9DVEwsIFBUX1JFU0VUX0NPTlRST0xfRk9STUFUVEVSLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX21wdF9zZXRfYW5nbGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwYW4sIGludCB0aWx0KQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzRdOworCQorCS8qIHNldCBuZXcgcmVsYXRpdmUgYW5nbGU7IGFuZ2xlcyBhcmUgZXhwcmVzc2VkIGluIGRlZ3JlZXMgKiAxMDAsCisJICAgYnV0IGNhbSBhcyAuNSBkZWdyZWUgcmVzb2x1dGlvbiwgaGVuY2UgZGV2aWRlIGJ5IDIwMC4gQWxzbworCSAgIHRoZSBhbmdsZSBtdXN0IGJlIG11bHRpcGxpZWQgYnkgNjQgYmVmb3JlIGl0J3Mgc2VuZCB0bworCSAgIHRoZSBjYW0gKD8/KQorCSAqLworCXBhbiAgPSAgNjQgKiBwYW4gIC8gMTAwOworCXRpbHQgPSAtNjQgKiB0aWx0IC8gMTAwOyAvKiBwb3NpdGl2ZSB0aWx0IGlzIGRvd24sIHdoaWNoIGlzIG5vdCB3aGF0IHRoZSB1c2VyIHdvdWxkIGV4cGVjdCAqLworCWJ1ZlswXSA9IHBhbiAmIDB4RkY7CisJYnVmWzFdID0gKHBhbiA+PiA4KSAmIDB4RkY7CisJYnVmWzJdID0gdGlsdCAmIDB4RkY7CisJYnVmWzNdID0gKHRpbHQgPj4gOCkgJiAweEZGOworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfTVBUX0NUTCwgUFRfUkVMQVRJVkVfQ09OVFJPTF9GT1JNQVRURVIsIDQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfbXB0X2dldF9zdGF0dXMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHN0cnVjdCBwd2NfbXB0X3N0YXR1cyAqc3RhdHVzKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciBidWZbNV07CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX01QVF9DVEwsIFBUX1NUQVRVU19GT1JNQVRURVIsIDUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXN0YXR1cy0+c3RhdHVzID0gYnVmWzBdICYgMHg3OyAvLyAzIGJpdHMgYXJlIHVzZWQgZm9yIHJlcG9ydGluZworCXN0YXR1cy0+dGltZV9wYW4gPSAoYnVmWzFdIDw8IDgpICsgYnVmWzJdOworCXN0YXR1cy0+dGltZV90aWx0ID0gKGJ1ZlszXSA8PCA4KSArIGJ1Zls0XTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcHdjX2dldF9jbW9zX3NlbnNvcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpzZW5zb3IpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisJaW50IHJldCA9IC0xLCByZXF1ZXN0OworCQorCWlmIChwZGV2LT50eXBlIDwgNjc1KQorCQlyZXF1ZXN0ID0gU0VOU09SX1RZUEVfRk9STUFUVEVSMTsKKwllbHNlIGlmIChwZGV2LT50eXBlIDwgNzMwKQorCQlyZXR1cm4gLTE7IC8qIFRoZSBWZXN0YSBzZXJpZXMgZG9lc24ndCBoYXZlIHRoaXMgY2FsbCAqLworCWVsc2UKKwkJcmVxdWVzdCA9IFNFTlNPUl9UWVBFX0ZPUk1BVFRFUjI7CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX1NUQVRVU19DVEwsIHJlcXVlc3QsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChwZGV2LT50eXBlIDwgNjc1KQorCQkqc2Vuc29yID0gYnVmIHwgMHgxMDA7CisJZWxzZQorCQkqc2Vuc29yID0gYnVmOworCXJldHVybiAwOworfQorCisKKyAvKiBFbmQgb2YgQWRkLU9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBMaW51eCAyLjUuc29tZXRoaW5nIGFuZCAyLjYgcGFzcyBkaXJlY3QgcG9pbnRlcnMgdG8gYXJndW1lbnRzIG9mCisgICBpb2N0bCgpIGNhbGxzLiBXaXRoIDIuNCwgeW91IGhhdmUgdG8gZG8gdGVkaW91cyBjb3B5X2Zyb21fdXNlcigpCisgICBhbmQgY29weV90b191c2VyKCkgY2FsbHMuIFdpdGggdGhlc2UgbWFjcm9zIHdlIGNpcmN1bXZlbnQgdGhpcywKKyAgIGFuZCBsZXQgbWUgbWFpbnRhaW4gb25seSBvbmUgc291cmNlIGZpbGUuIFRoZSBmdW5jdGlvbmFsaXR5IGlzCisgICBleGFjdGx5IHRoZSBzYW1lIG90aGVyd2lzZS4KKyAqLyAgIAorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDApCisKKy8qIGRlZmluZSBsb2NhbCB2YXJpYWJsZSBmb3IgYXJnICovCisjZGVmaW5lIEFSR19ERUYoQVJHX3R5cGUsIEFSR19uYW1lKVwKKwlBUkdfdHlwZSAqQVJHX25hbWUgPSBhcmc7CisvKiBjb3B5IGFyZyB0byBsb2NhbCB2YXJpYWJsZSAqLwkKKyNkZWZpbmUgQVJHX0lOKEFSR19uYW1lKSAvKiBub3RoaW5nICovCisvKiBhcmd1bWVudCBpdHNlbGYgKHJlZmVyZW5jZWQpICovCisjZGVmaW5lIEFSR1IoQVJHX25hbWUpICgqQVJHX25hbWUpCisvKiBhcmd1bWVudCBhZGRyZXNzICovCisjZGVmaW5lIEFSR0EoQVJHX25hbWUpIEFSR19uYW1lCisvKiBjb3B5IGxvY2FsIHZhcmlhYmxlIHRvIGFyZyAqLworI2RlZmluZSBBUkdfT1VUKEFSR19uYW1lKSAvKiBub3RoaW5nICovCisKKyNlbHNlCisKKyNkZWZpbmUgQVJHX0RFRihBUkdfdHlwZSwgQVJHX25hbWUpXAorCUFSR190eXBlIEFSR19uYW1lOworI2RlZmluZSBBUkdfSU4oQVJHX25hbWUpXAorCWlmIChjb3B5X2Zyb21fdXNlcigmQVJHX25hbWUsIGFyZywgc2l6ZW9mKEFSR19uYW1lKSkpIHtcCisJCXJldCA9IC1FRkFVTFQ7XAorCQlicmVhaztcCisJfQorI2RlZmluZSBBUkdSKEFSR19uYW1lKSBBUkdfbmFtZQorI2RlZmluZSBBUkdBKEFSR19uYW1lKSAmQVJHX25hbWUKKyNkZWZpbmUgQVJHX09VVChBUkdfbmFtZSlcCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZBUkdfbmFtZSwgc2l6ZW9mKEFSR19uYW1lKSkpIHtcCisJCXJldCA9IC1FRkFVTFQ7XAorCQlicmVhaztcCisJfQorCisjZW5kaWYKKworaW50IHB3Y19pb2N0bChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgVklESU9DUFdDUlVTRVI6CisJeworCQlpZiAocHdjX3Jlc3RvcmVfdXNlcihwZGV2KSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ1BXQ1NVU0VSOgorCXsKKwkJaWYgKHB3Y19zYXZlX3VzZXIocGRldikpCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJCQorCWNhc2UgVklESU9DUFdDRkFDVE9SWToKKwl7CisJCWlmIChwd2NfcmVzdG9yZV9mYWN0b3J5KHBkZXYpKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCQorCWNhc2UgVklESU9DUFdDU0NRVUFMOgorCXsJCisJCUFSR19ERUYoaW50LCBxdWFsKQorCisJCUFSR19JTihxdWFsKQorCQlpZiAoQVJHUihxdWFsKSA8IDAgfHwgQVJHUihxdWFsKSA+IDMpCisJCQlyZXQgPSAtRUlOVkFMOworCQllbHNlCisJCQlyZXQgPSBwd2NfdHJ5X3ZpZGVvX21vZGUocGRldiwgcGRldi0+dmlldy54LCBwZGV2LT52aWV3LnksIHBkZXYtPnZmcmFtZXMsIEFSR1IocXVhbCksIHBkZXYtPnZzbmFwc2hvdCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXBkZXYtPnZjb21wcmVzc2lvbiA9IEFSR1IocXVhbCk7CisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ1BXQ0dDUVVBTDoKKwl7CisJCUFSR19ERUYoaW50LCBxdWFsKQorCQkKKwkJQVJHUihxdWFsKSA9IHBkZXYtPnZjb21wcmVzc2lvbjsKKwkJQVJHX09VVChxdWFsKQorCQlicmVhazsKKwl9CisJCisJY2FzZSBWSURJT0NQV0NQUk9CRToKKwl7CisJCUFSR19ERUYoc3RydWN0IHB3Y19wcm9iZSwgcHJvYmUpCisJCQorCQlzdHJjcHkoQVJHUihwcm9iZSkubmFtZSwgcGRldi0+dmRldi0+bmFtZSk7CisJCUFSR1IocHJvYmUpLnR5cGUgPSBwZGV2LT50eXBlOworCQlBUkdfT1VUKHByb2JlKQorCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1BXQ0dTRVJJQUw6CisJeworCQlBUkdfREVGKHN0cnVjdCBwd2Nfc2VyaWFsLCBzZXJpYWwpCisJCQorCQlzdHJjcHkoQVJHUihzZXJpYWwpLnNlcmlhbCwgcGRldi0+c2VyaWFsKTsKKwkJQVJHX09VVChzZXJpYWwpCisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DUFdDU0FHQzoKKwl7CisJCUFSR19ERUYoaW50LCBhZ2MpCisKKwkJQVJHX0lOKGFnYykKKwkJaWYgKHB3Y19zZXRfYWdjKHBkZXYsIEFSR1IoYWdjKSA8IDAgPyAxIDogMCwgQVJHUihhZ2MpKSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ1BXQ0dBR0M6CisJeworCQlBUkdfREVGKGludCwgYWdjKQorCQkKKwkJaWYgKHB3Y19nZXRfYWdjKHBkZXYsIEFSR0EoYWdjKSkpCisJCQlyZXQgPSAtRUlOVkFMOworCQlBUkdfT1VUKGFnYykKKwkJYnJlYWs7CisJfQorCQorCWNhc2UgVklESU9DUFdDU1NIVVRURVI6CisJeworCQlBUkdfREVGKGludCwgc2h1dHRlcl9zcGVlZCkKKworCQlBUkdfSU4oc2h1dHRlcl9zcGVlZCkKKwkJcmV0ID0gcHdjX3NldF9zaHV0dGVyX3NwZWVkKHBkZXYsIEFSR1Ioc2h1dHRlcl9zcGVlZCkgPCAwID8gMSA6IDAsIEFSR1Ioc2h1dHRlcl9zcGVlZCkpOworCQlicmVhazsKKwl9CisJCisgICAgICAgIGNhc2UgVklESU9DUFdDU0FXQjoKKwl7CisJCUFSR19ERUYoc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UsIHdiKQorCQkKKwkJQVJHX0lOKHdiKQorCQlyZXQgPSBwd2Nfc2V0X2F3YihwZGV2LCBBUkdSKHdiKS5tb2RlKTsKKwkJaWYgKHJldCA+PSAwICYmIEFSR1Iod2IpLm1vZGUgPT0gUFdDX1dCX01BTlVBTCkgeworCQkJcHdjX3NldF9yZWRfZ2FpbihwZGV2LCBBUkdSKHdiKS5tYW51YWxfcmVkKTsKKwkJCXB3Y19zZXRfYmx1ZV9nYWluKHBkZXYsIEFSR1Iod2IpLm1hbnVhbF9ibHVlKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1BXQ0dBV0I6CisJeworCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlLCB3YikKKworCQltZW1zZXQoQVJHQSh3YiksIDAsIHNpemVvZihzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkpOworCQlBUkdSKHdiKS5tb2RlID0gcHdjX2dldF9hd2IocGRldik7CisJCWlmIChBUkdSKHdiKS5tb2RlIDwgMCkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWVsc2UgeworCQkJaWYgKEFSR1Iod2IpLm1vZGUgPT0gUFdDX1dCX01BTlVBTCkgeworCQkJCXJldCA9IHB3Y19nZXRfcmVkX2dhaW4ocGRldiwgJkFSR1Iod2IpLm1hbnVhbF9yZWQpOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlicmVhazsKKwkJCQlyZXQgPSBwd2NfZ2V0X2JsdWVfZ2FpbihwZGV2LCAmQVJHUih3YikubWFudWFsX2JsdWUpOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChBUkdSKHdiKS5tb2RlID09IFBXQ19XQl9BVVRPKSB7CisJCQkJcmV0ID0gcHdjX3JlYWRfcmVkX2dhaW4ocGRldiwgJkFSR1Iod2IpLnJlYWRfcmVkKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJYnJlYWs7CisgCQkJCXJldCA9cHdjX3JlYWRfYmx1ZV9nYWluKHBkZXYsICZBUkdSKHdiKS5yZWFkX2JsdWUpOworIAkJCQlpZiAocmV0IDwgMCkKKyAJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCUFSR19PVVQod2IpCisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ1BXQ1NBV0JTUEVFRDoKKwl7CisJCUFSR19ERUYoc3RydWN0IHB3Y193Yl9zcGVlZCwgd2JzKQorCQkKKwkJaWYgKEFSR1Iod2JzKS5jb250cm9sX3NwZWVkID4gMCkgeworCQkJcmV0ID0gcHdjX3NldF93Yl9zcGVlZChwZGV2LCBBUkdSKHdicykuY29udHJvbF9zcGVlZCk7CisJCX0KKwkJaWYgKEFSR1Iod2JzKS5jb250cm9sX2RlbGF5ID4gMCkgeworCQkJcmV0ID0gcHdjX3NldF93Yl9kZWxheShwZGV2LCBBUkdSKHdicykuY29udHJvbF9kZWxheSk7CisJCX0KKwkJYnJlYWs7CisJfQorCQorCWNhc2UgVklESU9DUFdDR0FXQlNQRUVEOgorCXsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3diX3NwZWVkLCB3YnMpCisJCQorCQlyZXQgPSBwd2NfZ2V0X3diX3NwZWVkKHBkZXYsICZBUkdSKHdicykuY29udHJvbF9zcGVlZCk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXJldCA9IHB3Y19nZXRfd2JfZGVsYXkocGRldiwgJkFSR1Iod2JzKS5jb250cm9sX2RlbGF5KTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJQVJHX09VVCh3YnMpCisJCWJyZWFrOworCX0KKworICAgICAgICBjYXNlIFZJRElPQ1BXQ1NMRUQ6CisJeworCQlBUkdfREVGKHN0cnVjdCBwd2NfbGVkcywgbGVkcykKKworCQlBUkdfSU4obGVkcykKKwkJcmV0ID0gcHdjX3NldF9sZWRzKHBkZXYsIEFSR1IobGVkcykubGVkX29uLCBBUkdSKGxlZHMpLmxlZF9vZmYpOworCSAgICAJYnJlYWs7CisJfQorCisKKwljYXNlIFZJRElPQ1BXQ0dMRUQ6CisJeworCQlBUkdfREVGKHN0cnVjdCBwd2NfbGVkcywgbGVkcykKKwkJCisJCXJldCA9IHB3Y19nZXRfbGVkcyhwZGV2LCAmQVJHUihsZWRzKS5sZWRfb24sICZBUkdSKGxlZHMpLmxlZF9vZmYpOworCQlBUkdfT1VUKGxlZHMpCisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DUFdDU0NPTlRPVVI6CisJeworCQlBUkdfREVGKGludCwgY29udG91cikKKworCQlBUkdfSU4oY29udG91cikKKwkJcmV0ID0gcHdjX3NldF9jb250b3VyKHBkZXYsIEFSR1IoY29udG91cikpOworCQlicmVhazsKKwl9CisJCQkKKwljYXNlIFZJRElPQ1BXQ0dDT05UT1VSOgorCXsKKwkJQVJHX0RFRihpbnQsIGNvbnRvdXIpCisJCQorCQlyZXQgPSBwd2NfZ2V0X2NvbnRvdXIocGRldiwgQVJHQShjb250b3VyKSk7CisJCUFSR19PVVQoY29udG91cikKKwkJYnJlYWs7CisJfQorCQorCWNhc2UgVklESU9DUFdDU0JBQ0tMSUdIVDoKKwl7CisJCUFSR19ERUYoaW50LCBiYWNrbGlnaHQpCisJCQorCQlBUkdfSU4oYmFja2xpZ2h0KQorCQlyZXQgPSBwd2Nfc2V0X2JhY2tsaWdodChwZGV2LCBBUkdSKGJhY2tsaWdodCkpOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1BXQ0dCQUNLTElHSFQ6CisJeworCQlBUkdfREVGKGludCwgYmFja2xpZ2h0KQorCQkKKwkJcmV0ID0gcHdjX2dldF9iYWNrbGlnaHQocGRldiwgQVJHQShiYWNrbGlnaHQpKTsKKwkJQVJHX09VVChiYWNrbGlnaHQpCisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ1BXQ1NGTElDS0VSOgorCXsKKwkJQVJHX0RFRihpbnQsIGZsaWNrZXIpCisJCQorCQlBUkdfSU4oZmxpY2tlcikKKwkJcmV0ID0gcHdjX3NldF9mbGlja2VyKHBkZXYsIEFSR1IoZmxpY2tlcikpOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1BXQ0dGTElDS0VSOgorCXsKKwkJQVJHX0RFRihpbnQsIGZsaWNrZXIpCisJCQorCQlyZXQgPSBwd2NfZ2V0X2ZsaWNrZXIocGRldiwgQVJHQShmbGlja2VyKSk7CisJCUFSR19PVVQoZmxpY2tlcikKKwkJYnJlYWs7CisJfQorCQorCWNhc2UgVklESU9DUFdDU0RZTk5PSVNFOgorCXsKKwkJQVJHX0RFRihpbnQsIGR5bm5vaXNlKQorCQkKKwkJQVJHX0lOKGR5bm5vaXNlKQorCQlyZXQgPSBwd2Nfc2V0X2R5bmFtaWNfbm9pc2UocGRldiwgQVJHUihkeW5ub2lzZSkpOworCQlicmVhazsKKwl9CisJCisJY2FzZSBWSURJT0NQV0NHRFlOTk9JU0U6CisJeworCQlBUkdfREVGKGludCwgZHlubm9pc2UpCisKKwkJcmV0ID0gcHdjX2dldF9keW5hbWljX25vaXNlKHBkZXYsIEFSR0EoZHlubm9pc2UpKTsKKwkJQVJHX09VVChkeW5ub2lzZSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DUFdDR1JFQUxTSVpFOgorCXsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX2ltYWdlc2l6ZSwgc2l6ZSkKKwkJCisJCUFSR1Ioc2l6ZSkud2lkdGggPSBwZGV2LT5pbWFnZS54OworCQlBUkdSKHNpemUpLmhlaWdodCA9IHBkZXYtPmltYWdlLnk7CisJCUFSR19PVVQoc2l6ZSkKKwkJYnJlYWs7CisgCX0KKyAJCisgCWNhc2UgVklESU9DUFdDTVBUUkVTRVQ6CisgCXsKKyAJCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKKyAJCXsKKwkgCQlBUkdfREVGKGludCwgZmxhZ3MpCisKKyAJCQlBUkdfSU4oZmxhZ3MpCisJCQlyZXQgPSBwd2NfbXB0X3Jlc2V0KHBkZXYsIEFSR1IoZmxhZ3MpKTsKKyAJCQlpZiAocmV0ID49IDApCisgCQkJeworIAkJCQlwZGV2LT5wYW5fYW5nbGUgPSAwOworIAkJCQlwZGV2LT50aWx0X2FuZ2xlID0gMDsKKyAJCQl9CisgCQl9CisgCQllbHNlCisgCQl7CisgCQkJcmV0ID0gLUVOWElPOworIAkJfQorIAkJYnJlYWs7CQkKKyAJfQorIAkKKyAJY2FzZSBWSURJT0NQV0NNUFRHUkFOR0U6CisgCXsKKyAJCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKKyAJCXsKKyAJCQlBUkdfREVGKHN0cnVjdCBwd2NfbXB0X3JhbmdlLCByYW5nZSkKKyAJCQkKKyAJCQlBUkdSKHJhbmdlKSA9IHBkZXYtPmFuZ2xlX3JhbmdlOworIAkJCUFSR19PVVQocmFuZ2UpCisgCQl9CisgCQllbHNlCisgCQl7CQorIAkJCXJldCA9IC1FTlhJTzsKKyAJCX0KKyAJCWJyZWFrOworIAl9CisgCQorIAljYXNlIFZJRElPQ1BXQ01QVFNBTkdMRToKKyAJeworIAkJaW50IG5ld19wYW4sIG5ld190aWx0OworIAkJCisgCQlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCisgCQl7CisJIAkJQVJHX0RFRihzdHJ1Y3QgcHdjX21wdF9hbmdsZXMsIGFuZ2xlcykKKworCSAJCUFSR19JTihhbmdsZXMpCisJCQkvKiBUaGUgY2FtZXJhIGNhbiBvbmx5IHNldCByZWxhdGl2ZSBhbmdsZXMsIHNvCisJCQkgICBkbyBzb21lIGNhbGN1bGF0aW9ucyB3aGVuIGdldHRpbmcgYW4gYWJzb2x1dGUgYW5nbGUgLgorCQkJICovCisJCQlpZiAoQVJHUihhbmdsZXMpLmFic29sdXRlKQorCQkJeworIAkJCQluZXdfcGFuICA9IEFSR1IoYW5nbGVzKS5wYW47IAorIAkJCQluZXdfdGlsdCA9IEFSR1IoYW5nbGVzKS50aWx0OworIAkJCX0KKyAJCQllbHNlCisgCQkJeworIAkJCQluZXdfcGFuICA9IHBkZXYtPnBhbl9hbmdsZSAgKyBBUkdSKGFuZ2xlcykucGFuOworIAkJCQluZXdfdGlsdCA9IHBkZXYtPnRpbHRfYW5nbGUgKyBBUkdSKGFuZ2xlcykudGlsdDsKKwkJCX0KKwkJCS8qIGNoZWNrIGFic29sdXRlIHJhbmdlcyAqLworCQkJaWYgKG5ld19wYW4gIDwgcGRldi0+YW5nbGVfcmFuZ2UucGFuX21pbiAgfHwKKwkJCSAgICBuZXdfcGFuICA+IHBkZXYtPmFuZ2xlX3JhbmdlLnBhbl9tYXggIHx8CisJCQkgICAgbmV3X3RpbHQgPCBwZGV2LT5hbmdsZV9yYW5nZS50aWx0X21pbiB8fAorCQkJICAgIG5ld190aWx0ID4gcGRldi0+YW5nbGVfcmFuZ2UudGlsdF9tYXgpCisJCQl7CisJCQkJcmV0ID0gLUVSQU5HRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBnbyB0byByZWxhdGl2ZSByYW5nZSwgY2hlY2sgYWdhaW4gKi8KKwkJCQluZXdfcGFuICAtPSBwZGV2LT5wYW5fYW5nbGU7CisJCQkJbmV3X3RpbHQgLT0gcGRldi0+dGlsdF9hbmdsZTsKKwkJCQkvKiBhbmdsZXMgYXJlIHNwZWNpZmllZCBpbiBkZWdyZWVzICogMTAwLCB0aHVzIHRoZSBsaW1pdCA9IDM2MDAwICovCisJCQkJaWYgKG5ld19wYW4gPCAtMzYwMDAgfHwgbmV3X3BhbiA+IDM2MDAwIHx8IG5ld190aWx0IDwgLTM2MDAwIHx8IG5ld190aWx0ID4gMzYwMDApCisJCQkJCXJldCA9IC1FUkFOR0U7CisJCQl9CisJCQlpZiAocmV0ID09IDApIC8qIG5vIGVycm9ycyBzbyBmYXIgKi8KKwkJCXsKKwkJCQlyZXQgPSBwd2NfbXB0X3NldF9hbmdsZShwZGV2LCBuZXdfcGFuLCBuZXdfdGlsdCk7CisJCQkJaWYgKHJldCA+PSAwKQorCQkJCXsKKwkJCQkJcGRldi0+cGFuX2FuZ2xlICArPSBuZXdfcGFuOworCQkJCQlwZGV2LT50aWx0X2FuZ2xlICs9IG5ld190aWx0OworCQkJCX0KKwkJCQlpZiAocmV0ID09IC1FUElQRSkgLyogc3RhbGwgLT4gb3V0IG9mIHJhbmdlICovCisJCQkJCXJldCA9IC1FUkFOR0U7CQkJCQorCQkJfQorIAkJfQorIAkJZWxzZQorIAkJeworIAkJCXJldCA9IC1FTlhJTzsKKyAJCX0KKyAJCWJyZWFrOworIAl9CisKKyAJY2FzZSBWSURJT0NQV0NNUFRHQU5HTEU6CisgCXsKKyAJCQorIAkJaWYgKHBkZXYtPmZlYXR1cmVzICYgRkVBVFVSRV9NT1RPUl9QQU5USUxUKQorIAkJeworCSAJCUFSR19ERUYoc3RydWN0IHB3Y19tcHRfYW5nbGVzLCBhbmdsZXMpCisKKyAJCQlBUkdSKGFuZ2xlcykuYWJzb2x1dGUgPSAxOworIAkJCUFSR1IoYW5nbGVzKS5wYW4gID0gcGRldi0+cGFuX2FuZ2xlOworIAkJCUFSR1IoYW5nbGVzKS50aWx0ID0gcGRldi0+dGlsdF9hbmdsZTsKKyAJCQlBUkdfT1VUKGFuZ2xlcykKKyAJCX0KKyAJCWVsc2UKKyAJCXsKKyAJCQlyZXQgPSAtRU5YSU87CisgCQl9CisgCQlicmVhazsKKyAJfQorIAorIAljYXNlIFZJRElPQ1BXQ01QVFNUQVRVUzoKKyAJeworIAkJaWYgKHBkZXYtPmZlYXR1cmVzICYgRkVBVFVSRV9NT1RPUl9QQU5USUxUKQorIAkJeworIAkJCUFSR19ERUYoc3RydWN0IHB3Y19tcHRfc3RhdHVzLCBzdGF0dXMpCisgCQkJCisgCQkJcmV0ID0gcHdjX21wdF9nZXRfc3RhdHVzKHBkZXYsIEFSR0Eoc3RhdHVzKSk7CisgCQkJQVJHX09VVChzdGF0dXMpCisgCQl9CisgCQllbHNlCisgCQl7CisgCQkJcmV0ID0gLUVOWElPOworIAkJfQorIAkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NQV0NHVklEQ01EOgorCXsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3ZpZGVvX2NvbW1hbmQsIGNtZCk7CisJCQorICAgICAgICAgICAgICAgIEFSR1IoY21kKS50eXBlID0gcGRldi0+dHlwZTsKKwkJQVJHUihjbWQpLnJlbGVhc2UgPSBwZGV2LT5yZWxlYXNlOworCQlBUkdSKGNtZCkuY29tbWFuZF9sZW4gPSBwZGV2LT5jbWRfbGVuOworCQltZW1jcHkoJkFSR1IoY21kKS5jb21tYW5kX2J1ZiwgcGRldi0+Y21kX2J1ZiwgcGRldi0+Y21kX2xlbik7CisJCUFSR1IoY21kKS5iYW5kbGVuZ3RoID0gcGRldi0+dmJhbmRsZW5ndGg7CisJCUFSR1IoY21kKS5mcmFtZV9zaXplID0gcGRldi0+ZnJhbWVfc2l6ZTsKKwkJQVJHX09VVChjbWQpCisJCWJyZWFrOworCX0KKyAgICAgICAvKgorCWNhc2UgVklESU9DUFdDR1ZJRFRBQkxFOgorCXsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3RhYmxlX2luaXRfYnVmZmVyLCB0YWJsZSk7CisJCUFSR1IodGFibGUpLmxlbiA9IHBkZXYtPmNtZF9sZW47CisJCW1lbWNweSgmQVJHUih0YWJsZSkuYnVmZmVyLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEsIHBkZXYtPmRlY29tcHJlc3Nvci0+dGFibGVfc2l6ZSk7CisJCUFSR19PVVQodGFibGUpCisJCWJyZWFrOworCX0KKwkqLworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisJCisJaWYgKHJldCA+IDApCisJCXJldHVybiAwOworCXJldHVybiByZXQ7Cit9CisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWRlYzEuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtZGVjMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDAzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWRlYzEuYwpAQCAtMCwwICsxLDQyIEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICBEZWNvbXByZXNzaW9uIGZvciBjaGlwc2V0IHZlcnNpb24gMQorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisKKworI2luY2x1ZGUgInB3Yy1kZWMxLmgiCisKKwordm9pZCBwd2NfZGVjMV9pbml0KGludCB0eXBlLCBpbnQgcmVsZWFzZSwgdm9pZCAqYnVmZmVyLCB2b2lkICp0YWJsZSkKK3sKKworfQorCit2b2lkIHB3Y19kZWMxX2V4aXQodm9pZCkKK3sKKworCisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1kZWMxLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWRlYzEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZmZDljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1kZWMxLmgKQEAgLTAsMCArMSwzNiBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisKKworI2lmbmRlZiBQV0NfREVDMV9ICisjZGVmaW5lIFBXQ19ERUMxX0gKKwordm9pZCBwd2NfZGVjMV9pbml0KGludCB0eXBlLCBpbnQgcmVsZWFzZSwgdm9pZCAqYnVmZmVyLCB2b2lkICpwcml2YXRlX2RhdGEpOwordm9pZCBwd2NfZGVjMV9leGl0KHZvaWQpOworCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtZGVjMjMuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtZGVjMjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGZhM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1kZWMyMy5jCkBAIC0wLDAgKzEsNjIzIEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICBEZWNvbXByZXNzaW9uIGZvciBjaGlwc2V0IHZlcnNpb24gMiBldCAzCisgICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpbmNsdWRlICJwd2MtdGltb24uaCIKKyNpbmNsdWRlICJwd2Mta2lhcmEuaCIKKyNpbmNsdWRlICJwd2MtZGVjMjMuaCIKKyNpbmNsdWRlICJwd2MtaW9jdGwuaCIKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisvKioqKgorICoKKyAqCisgKgorICovCisKKworc3RhdGljIHZvaWQgZmlsbF90YWJsZV9hMDAwKHVuc2lnbmVkIGludCAqcCkKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGludCBpbml0aWFsX3ZhbHVlc1sxMl0gPSB7CisgICAgIDB4RkZBRDlCMDAsIDB4RkZEREVFMDAsIDB4MDAyMjEyMDAsIDB4MDA1MjY1MDAsCisgICAgIDB4RkZDMjFFMDAsIDB4MDAzREUyMDAsIDB4RkY5MjRCODAsIDB4RkZEMkEzMDAsCisgICAgIDB4MDAyRDVEMDAsIDB4MDA2REI0ODAsIDB4RkZFRDNFMDAsIDB4MDAxMkMyMDAKKyAgfTsKKyAgc3RhdGljIHVuc2lnbmVkIGludCB2YWx1ZXNfZGVyaXZhdGVkWzEyXSA9IHsKKyAgICAgMHgwMDAwQTRDQSwgMHgwMDAwNDQyNCwgMHhGRkZGQkJEQywgMHhGRkZGNUIzNiwKKyAgICAgMHgwMDAwN0JDNCwgMHhGRkZGODQzQywgMHgwMDAwREI2OSwgMHgwMDAwNUFCQSwKKyAgICAgMHhGRkZGQTU0NiwgMHhGRkZGMjQ5NywgMHgwMDAwMjU4NCwgMHhGRkZGREE3QworICB9OworICB1bnNpZ25lZCBpbnQgdGVtcF92YWx1ZXNbMTJdOworICBpbnQgaSxqOworCisgIG1lbWNweSh0ZW1wX3ZhbHVlcyxpbml0aWFsX3ZhbHVlcyxzaXplb2YoaW5pdGlhbF92YWx1ZXMpKTsKKyAgZm9yIChpPTA7aTwyNTY7aSsrKQorICAgeworICAgICBmb3IgKGo9MDtqPDEyO2orKykKKyAgICAgIHsKKwkqcCsrID0gdGVtcF92YWx1ZXNbal07CisJdGVtcF92YWx1ZXNbal0gKz0gdmFsdWVzX2Rlcml2YXRlZFtqXTsKKyAgICAgIH0KKyAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsbF90YWJsZV9kMDAwKHVuc2lnbmVkIGNoYXIgKnApCit7CisgIGludCBiaXQsYnl0ZTsKKworICBmb3IgKGJpdD0wOyBiaXQ8ODsgYml0KyspCisgICB7CisgICAgIHVuc2lnbmVkIGNoYXIgYml0cG93ZXIgPSAxPDxiaXQ7CisgICAgIHVuc2lnbmVkIGNoYXIgbWFzayA9IGJpdHBvd2VyLTE7CisgICAgIGZvciAoYnl0ZT0wOyBieXRlPDI1NjsgYnl0ZSsrKQorICAgICAgeworCWlmIChieXRlICYgYml0cG93ZXIpCisJICAqcCsrID0gLShieXRlICYgbWFzayk7CisJZWxzZQorCSAgKnArKyA9IChieXRlICYgbWFzayk7CisgICAgICB9CisgICB9Cit9CisKKy8qCisgKgorICogS2lhcmE6IDAgPD0gdmVyIDw9IDcKKyAqIFRpbW9uOiAwIDw9IHZlciA8PSAxNQorICoKKyAqLworc3RhdGljIHZvaWQgZmlsbF90YWJsZV9jb2xvcih1bnNpZ25lZCBpbnQgdmVyc2lvbiwgY29uc3QgdW5zaWduZWQgaW50ICpyb210YWJsZSwgCisgICAgdW5zaWduZWQgY2hhciAqcDAwMDQsIAorICAgIHVuc2lnbmVkIGNoYXIgKnA4MDA0KQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgKnRhYmxlOworICB1bnNpZ25lZCBjaGFyICpwMCwgKnA4OworICBpbnQgaSxqLGs7CisgIGludCBkbCxiaXQscHc7CisKKyAgcm9tdGFibGUgKz0gdmVyc2lvbioyNTY7CisKKyAgZm9yIChpPTA7IGk8MjsgaSsrKQorICAgeworICAgICB0YWJsZSA9IHJvbXRhYmxlICsgaSoxMjg7CisKKyAgICAgZm9yIChkbD0wOyBkbDwxNjsgZGwrKykKKyAgICAgIHsKKwlwMCA9IHAwMDA0ICsgKGk8PDE0KSArIChkbDw8MTApOworCXA4ID0gcDgwMDQgKyAoaTw8MTIpICsgKGRsPDw4KTsKKworCWZvciAoaj0wOyBqPDg7IGorKyAsIHRhYmxlKyssIHAwKz0xMjgpCisJIHsKKwkgICBmb3IgKGs9MDsgazwxNjsgaysrKQorCSAgICB7CisJICAgICAgaWYgKGs9PTApCisJCWJpdD0xOworCSAgICAgIGVsc2UgaWYgKGs+PTEgJiYgazwzKQorCQliaXQ9KHRhYmxlWzBdPj4xNSkmNzsKKwkgICAgICBlbHNlIGlmIChrPj0zICYmIGs8NikKKwkJYml0PSh0YWJsZVswXT4+MTIpJjc7CisJICAgICAgZWxzZSBpZiAoaz49NiAmJiBrPDEwKQorCQliaXQ9KHRhYmxlWzBdPj45KSY3OworCSAgICAgIGVsc2UgaWYgKGs+PTEwICYmIGs8MTMpCisJCWJpdD0odGFibGVbMF0+PjYpJjc7CisJICAgICAgZWxzZSBpZiAoaz49MTMgJiYgazwxNSkKKwkJYml0PSh0YWJsZVswXT4+MykmNzsKKwkgICAgICBlbHNlCisJCWJpdD0odGFibGVbMF0pJjc7CisJICAgICAgaWYgKGsgPT0gMCkKKwkJKih1bnNpZ25lZCBjaGFyICopcDgrKyA9IDg7CisJICAgICAgZWxzZQorCQkqKHVuc2lnbmVkIGNoYXIgKilwOCsrID0gaiAtIGJpdDsKKwkgICAgICAqKHVuc2lnbmVkIGNoYXIgKilwOCsrID0gYml0OworCisJICAgICAgcHcgPSAxPDxiaXQ7CisJICAgICAgcDBbaysweDAwXSA9ICgxKnB3KSAgKyAweDgwOworCSAgICAgIHAwW2srMHgxMF0gPSAoMipwdykgICsgMHg4MDsKKwkgICAgICBwMFtrKzB4MjBdID0gKDMqcHcpICArIDB4ODA7CisJICAgICAgcDBbaysweDMwXSA9ICg0KnB3KSAgKyAweDgwOworCSAgICAgIHAwW2srMHg0MF0gPSAoLXB3KSAgICsgMHg4MDsKKwkgICAgICBwMFtrKzB4NTBdID0gKDIqLXB3KSArIDB4ODA7CisJICAgICAgcDBbaysweDYwXSA9ICgzKi1wdykgKyAweDgwOworCSAgICAgIHAwW2srMHg3MF0gPSAoNCotcHcpICsgMHg4MDsKKwkgICAgfSAvKiBlbmQgb2YgZm9yIChrPTA7IGs8MTY7IGsrKywgcDgrKykgKi8KKwkgfSAvKiBlbmQgb2YgZm9yIChqPTA7IGo8ODsgaisrICwgdGFibGUrKykgKi8KKyAgICAgIH0gLyogZW5kIG9mIGZvciAoZGw9MDsgZGw8MTY7IGRsKyspICovCisgICB9IC8qIGVuZCBvZiBmb3IgKGk9MDsgaTwyOyBpKyspICovCit9CisKKy8qCisgKiBwcmVjaXNpb24gPSAocGRldi0+eHggKyBwZGV2LT55eSkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGZpbGxfdGFibGVfZGMwMF9kODAwKHVuc2lnbmVkIGludCBwcmVjaXNpb24sIHVuc2lnbmVkIGludCAqcGRjMDAsIHVuc2lnbmVkIGludCAqcGQ4MDApCit7CisgIGludCBpOworICB1bnNpZ25lZCBpbnQgb2Zmc2V0MSwgb2Zmc2V0MjsKKyAKKyAgZm9yKGk9MCxvZmZzZXQxPTB4NDAwMCwgb2Zmc2V0Mj0wOyBpPDI1NiA7IGkrKyxvZmZzZXQxKz0weDdCQzQsIG9mZnNldDIrPTB4N0JDNCkKKyAgIHsKKyAgICAgdW5zaWduZWQgaW50IG1zYiA9IG9mZnNldDEgPj4gMTU7CisKKyAgICAgaWYgKCBtc2IgPiAyNTUpCisgICAgICB7CisJaWYgKG1zYikKKwkgIG1zYj0wOworCWVsc2UKKwkgIG1zYj0yNTU7CisgICAgICB9CisKKyAgICAgKnBkYzAwKysgPSBtc2IgPDwgcHJlY2lzaW9uOworICAgICAqcGQ4MDArKyA9IG9mZnNldDI7CisgICB9CisKK30KKworLyoKKyAqIHN0cnVjdCB7CisgKiAgIHVuc2lnbmVkIGNoYXIgb3A7CSAgICAvLyBvcGVyYXRpb24gdG8gZXhlY3V0ZQorICogICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgIC8vIGJpdHMgdXNlIHRvIHBlcmZvcm0gb3BlcmF0aW9uCisgKiAgIHVuc2lnbmVkIGNoYXIgb2Zmc2V0MTsgLy8gb2Zmc2V0IHRvIGFkZCB0byBhY2Nlc3MgaW4gdGhlIHRhYmxlXzAwMDQgJSAxNgorICogICB1bnNpZ25lZCBjaGFyIG9mZnNldDI7IC8vIG9mZnNldCB0byBhZGQgdG8gYWNjZXNzIGluIHRoZSB0YWJsZV8wMDA0CisgKiB9CisgKgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHRhYmxlX29wc1tdID0geworMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHgwMCwgMHgwMCwweDA0LDB4MDEsMHgxMCwgMHgwMCwweDA2LDB4MDEsMHgzMCwKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4NDAsIDB4MDAsMHgwNSwweDAxLDB4MjAsIDB4MDEsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4MDAsMHgwMCwweDAwLCAweDAwLDB4MDMsMHgwMSwweDAwLCAweDAwLDB4MDQsMHgwMSwweDUwLCAweDAwLDB4MDUsMHgwMiwweDAwLAorMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHg0MCwgMHgwMCwweDA1LDB4MDMsMHgwMCwgMHgwMSwweDAwLDB4MDAsMHgwMCwKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4MDAsIDB4MDAsMHgwNCwweDAxLDB4MTAsIDB4MDAsMHgwNiwweDAyLDB4MTAsCisweDAyLDB4MDAsMHgwMCwweDAwLCAweDAwLDB4MDMsMHgwMSwweDQwLCAweDAwLDB4MDUsMHgwMSwweDYwLCAweDAxLDB4MDAsMHgwMCwweDAwLAorMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHgwMCwgMHgwMCwweDA0LDB4MDEsMHg1MCwgMHgwMCwweDA1LDB4MDIsMHg0MCwKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4NDAsIDB4MDAsMHgwNSwweDAzLDB4NDAsIDB4MDEsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4MDAsMHgwMCwweDAwLCAweDAwLDB4MDMsMHgwMSwweDAwLCAweDAwLDB4MDQsMHgwMSwweDEwLCAweDAwLDB4MDYsMHgwMSwweDcwLAorMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHg0MCwgMHgwMCwweDA1LDB4MDEsMHgyMCwgMHgwMSwweDAwLDB4MDAsMHgwMCwKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4MDAsIDB4MDAsMHgwNCwweDAxLDB4NTAsIDB4MDAsMHgwNSwweDAyLDB4MDAsCisweDAyLDB4MDAsMHgwMCwweDAwLCAweDAwLDB4MDMsMHgwMSwweDQwLCAweDAwLDB4MDUsMHgwMywweDAwLCAweDAxLDB4MDAsMHgwMCwweDAwLAorMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHgwMCwgMHgwMCwweDA0LDB4MDEsMHgxMCwgMHgwMCwweDA2LDB4MDIsMHg1MCwKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4NDAsIDB4MDAsMHgwNSwweDAxLDB4NjAsIDB4MDEsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4MDAsMHgwMCwweDAwLCAweDAwLDB4MDMsMHgwMSwweDAwLCAweDAwLDB4MDQsMHgwMSwweDUwLCAweDAwLDB4MDUsMHgwMiwweDQwLAorMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHg0MCwgMHgwMCwweDA1LDB4MDMsMHg0MCwgMHgwMSwweDAwLDB4MDAsMHgwMAorfTsKKworLyoKKyAqIFRPRE86IG11bHRpcGx5IGJ5IDQgYWxsIHZhbHVlcworICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBNdWxJZHhbMjU2XSA9IHsKKyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorIDAsIDEsIDIsIDMsIDAsIDEsIDIsIDMsIDAsIDEsIDIsIDMsIDAsIDEsIDIsIDMsCisgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywKKyA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA0LCA0LCA0LCA0LAorIDYsIDcsIDgsIDksIDcsMTAsMTEsIDgsIDgsMTEsMTAsIDcsIDksIDgsIDcsIDYsCisgNCwgNSwgNSwgNCwgNCwgNSwgNSwgNCwgNCwgNSwgNSwgNCwgNCwgNSwgNSwgNCwKKyAxLCAzLCAwLCAyLCAxLCAzLCAwLCAyLCAxLCAzLCAwLCAyLCAxLCAzLCAwLCAyLAorIDAsIDMsIDMsIDAsIDEsIDIsIDIsIDEsIDIsIDEsIDEsIDIsIDMsIDAsIDAsIDMsCisgMCwgMSwgMiwgMywgMywgMiwgMSwgMCwgMywgMiwgMSwgMCwgMCwgMSwgMiwgMywKKyAxLCAxLCAxLCAxLCAzLCAzLCAzLCAzLCAwLCAwLCAwLCAwLCAyLCAyLCAyLCAyLAorIDcsMTAsMTEsIDgsIDksIDgsIDcsIDYsIDYsIDcsIDgsIDksIDgsMTEsMTAsIDcsCisgNCwgNSwgNSwgNCwgNSwgNCwgNCwgNSwgNSwgNCwgNCwgNSwgNCwgNSwgNSwgNCwKKyA3LCA5LCA2LCA4LDEwLCA4LCA3LDExLDExLCA3LCA4LDEwLCA4LCA2LCA5LCA3LAorIDEsIDMsIDAsIDIsIDIsIDAsIDMsIDEsIDIsIDAsIDMsIDEsIDEsIDMsIDAsIDIsCisgMSwgMiwgMiwgMSwgMywgMCwgMCwgMywgMCwgMywgMywgMCwgMiwgMSwgMSwgMiwKKzEwLCA4LCA3LDExLCA4LCA2LCA5LCA3LCA3LCA5LCA2LCA4LDExLCA3LCA4LDEwCit9OworCisKKwordm9pZCBwd2NfZGVjMjNfaW5pdChpbnQgdHlwZSwgaW50IHJlbGVhc2UsIHVuc2lnbmVkIGNoYXIgKm1vZGUsIHZvaWQgKmRhdGEpCit7CisgIGludCBmbGFnczsKKyAgc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGV2ID0gZGF0YTsKKyAgcmVsZWFzZSA9IHJlbGVhc2U7CisKKyAgc3dpdGNoICh0eXBlKQorICAgeworICAgIGNhc2UgNzIwOgorICAgIGNhc2UgNzMwOgorICAgIGNhc2UgNzQwOgorICAgIGNhc2UgNzUwOgorICAgICAgZmxhZ3MgPSBtb2RlWzJdJjB4MTg7CS8qIG91cjogZmxhZ3MgPSA4LCBtb2RlWzJdPT1lOCAqLworICAgICAgaWYgKGZsYWdzPT04KQorCXBkZXYtPnp6ID0gNzsKKyAgICAgIGVsc2UgaWYgKGZsYWdzPT0weDEwKQorCXBkZXYtPnp6ID0gODsKKyAgICAgIGVsc2UKKwlwZGV2LT56eiA9IDY7CisgICAgICBmbGFncyA9IG1vZGVbMl0+PjU7CS8qIG91cjogNyAqLworCisgICAgICBmaWxsX3RhYmxlX2NvbG9yKGZsYWdzLCAodW5zaWduZWQgaW50ICopS2lhcmFSb21UYWJsZSwgcGRldi0+dGFibGVfMDAwNCwgcGRldi0+dGFibGVfODAwNCk7CisgICAgICBicmVhazsKKworCisgICAgY2FzZSA2NzU6CisgICAgY2FzZSA2ODA6CisgICAgY2FzZSA2OTA6CisgICAgICBmbGFncyA9IG1vZGVbMl0mNjsKKyAgICAgIGlmIChmbGFncz09MikKKwlwZGV2LT56eiA9IDc7CisgICAgICBlbHNlIGlmIChmbGFncz09NCkKKwlwZGV2LT56eiA9IDg7CisgICAgICBlbHNlCisJcGRldi0+enogPSA2OworICAgICAgZmxhZ3MgPSBtb2RlWzJdPj4zOworCisgICAgICBmaWxsX3RhYmxlX2NvbG9yKGZsYWdzLCAodW5zaWduZWQgaW50ICopVGltb25Sb21UYWJsZSwgcGRldi0+dGFibGVfMDAwNCwgcGRldi0+dGFibGVfODAwNCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBOb3Qgc3VwcG9ydGVkICovCisgICAgICByZXR1cm47CisgICB9CisKKyAgLyogKiAqICogKiogKi8KKyAgcGRldi0+eHggPSA4IC0gcGRldi0+eno7CisgIHBkZXYtPnl5ID0gMTUgLSBwZGV2LT54eDsKKyAgcGRldi0+enptYXNrID0gMHhGRj4+cGRldi0+eHg7CisgIC8vcGRldi0+enptYXNrID0gKDFVPDxwZGV2LT56eiktMTsKKworCisgIGZpbGxfdGFibGVfZGMwMF9kODAwKHBkZXYtPnh4ICsgcGRldi0+eXksIHBkZXYtPnRhYmxlX2RjMDAsIHBkZXYtPnRhYmxlX2Q4MDApOworICBmaWxsX3RhYmxlX2EwMDAocGRldi0+dGFibGVfYTAwNCk7CisgIGZpbGxfdGFibGVfZDAwMChwZGV2LT50YWJsZV9kMDA0KTsKK30KKworCisvKgorICogVG8gbWFuYWdlIHRoZSBzdHJlYW0sIHdlIGtlZXAgaW4gYSAzMiBiaXRzIHZhcmlhYmxlcywKKyAqIHRoZSBuZXh0IGJpdHMgaW4gdGhlIHN0cmVhbS4gZmlsbF9yZXNlcnZvaXIoKSBhZGQgdG8KKyAqIHRoZSByZXNlcnZvaXIgYXQgbGVhc3Qgd2FudGVkIG5iaXRzLgorICoKKyAqCisgKi8KKyNkZWZpbmUgZmlsbF9uYml0cyhyZXNlcnZvaXIsbmJpdHNfaW5fcmVzZXJ2b2lyLHN0cmVhbSxuYml0c193YW50ZWQpIGRvIHsgXAorICAgd2hpbGUgKG5iaXRzX2luX3Jlc2Vydm9pcjxuYml0c193YW50ZWQpIFwKKyAgICB7IFwKKyAgICAgIHJlc2Vydm9pciB8PSAoKihzdHJlYW0pKyspIDw8IG5iaXRzX2luX3Jlc2Vydm9pcjsgXAorICAgICAgbmJpdHNfaW5fcmVzZXJ2b2lyKz04OyBcCisgICAgfSBcCit9ICB3aGlsZSgwKTsKKworI2RlZmluZSBnZXRfbmJpdHMocmVzZXJ2b2lyLG5iaXRzX2luX3Jlc2Vydm9pcixzdHJlYW0sbmJpdHNfd2FudGVkLHJlc3VsdCkgZG8geyBcCisgICBmaWxsX25iaXRzKHJlc2Vydm9pcixuYml0c19pbl9yZXNlcnZvaXIsc3RyZWFtLG5iaXRzX3dhbnRlZCk7IFwKKyAgIHJlc3VsdCA9IChyZXNlcnZvaXIpICYgKCgxVTw8bmJpdHNfd2FudGVkKS0xKTsgXAorICAgcmVzZXJ2b2lyID4+PSBuYml0c193YW50ZWQ7IFwKKyAgIG5iaXRzX2luX3Jlc2Vydm9pciAtPSBuYml0c193YW50ZWQ7IFwKK30gIHdoaWxlKDApOworCisKKworc3RhdGljIHZvaWQgRGVjb21wcmVzc0JhbmQyMyhjb25zdCBzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUgKnBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3l1diwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqcGxhbmFyX3ksCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKnBsYW5hcl91LAorCQkJICAgICB1bnNpZ25lZCBjaGFyICpwbGFuYXJfdiwKKwkJCSAgICAgdW5zaWduZWQgaW50IGltYWdlX3gsCQkvKiBha2EgbnVtYmVyIG9mIHBpeGVscyB3YW50ZWQgPz8/ICovCisJCQkgICAgIHVuc2lnbmVkIGludCBwaXhlbHNfcGVyX2xpbmUsCS8qIGFrYSBudW1iZXIgb2YgcGl4ZWxzIHBlciBsaW5lICovCisJCQkgICAgIGludCBmbGFncykKK3sKKworCisgIHVuc2lnbmVkIGludCByZXNlcnZvaXIsIG5iaXRzX2luX3Jlc2Vydm9pcjsKKyAgaW50IGZpcnN0XzRfYml0czsKKyAgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9jaGFubmVsOworICBpbnQgbGluZV9zaXplOwkvKiBzaXplIG9mIHRoZSBsaW5lICg0WStVK1YpICovCisgIGludCBwYXNzZXM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0YWJsZTAwMDQsICpwdGFibGU4MDA0OworCisgIGludCBldmVuX2xpbmU7CisgIHVuc2lnbmVkIGludCB0ZW1wX2NvbG9yc1sxNl07CisgIGludCBuYmxvY2tzOworCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0cmVhbTsKKyAgdW5zaWduZWQgY2hhciAqZGVzdF95LCAqZGVzdF91PU5VTEwsICpkZXN0X3Y9TlVMTDsKKyAgdW5zaWduZWQgaW50IG9mZnNldF90b19wbGFuZV91LCBvZmZzZXRfdG9fcGxhbmVfdjsKKworICBpbnQgaTsKKworCisgIHJlc2Vydm9pciA9IDA7CisgIG5iaXRzX2luX3Jlc2Vydm9pciA9IDA7CisgIHN0cmVhbSA9IHJhd3l1disxOwkvKiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3RyZWFtIGlzIHNraXBwZWQgKi8KKyAgZXZlbl9saW5lID0gMTsKKworICBnZXRfbmJpdHMocmVzZXJ2b2lyLG5iaXRzX2luX3Jlc2Vydm9pcixzdHJlYW0sNCxmaXJzdF80X2JpdHMpOworCisgIGxpbmVfc2l6ZSA9IHBpeGVsc19wZXJfbGluZSozOworCisgIGZvciAocGFzc2VzPTA7cGFzc2VzPDI7cGFzc2VzKyspCisgICB7CisgICAgIGlmIChwYXNzZXM9PTApCisgICAgICB7CisJYnl0ZXNfcGVyX2NoYW5uZWwgPSBwaXhlbHNfcGVyX2xpbmU7CisJZGVzdF95ID0gcGxhbmFyX3k7CisJbmJsb2NrcyA9IGltYWdlX3gvNDsKKyAgICAgIH0KKyAgICAgZWxzZQorICAgICAgeworCS8qIEZvcm1hdCBwbGFuYXI6IEFsbCBZLCB0aGVuIGFsbCBVLCB0aGVuIGFsbCBWICovCisJYnl0ZXNfcGVyX2NoYW5uZWwgPSBwaXhlbHNfcGVyX2xpbmUvMjsKKwlkZXN0X3UgPSBwbGFuYXJfdTsKKwlkZXN0X3YgPSBwbGFuYXJfdjsKKwlkZXN0X3kgPSBkZXN0X3U7CisJbmJsb2NrcyA9IGltYWdlX3gvODsKKyAgICAgIH0KKworICAgICBvZmZzZXRfdG9fcGxhbmVfdSA9IGJ5dGVzX3Blcl9jaGFubmVsKjI7CisgICAgIG9mZnNldF90b19wbGFuZV92ID0gYnl0ZXNfcGVyX2NoYW5uZWwqMzsKKyAgICAgLyoKKyAgICAgcHJpbnRmKCJieXRlc19wZXJfY2hhbm5lbCA9ICVkXG4iLGJ5dGVzX3Blcl9jaGFubmVsKTsKKyAgICAgcHJpbnRmKCJvZmZzZXRfdG9fcGxhbmVfdSA9ICVkXG4iLG9mZnNldF90b19wbGFuZV91KTsKKyAgICAgcHJpbnRmKCJvZmZzZXRfdG9fcGxhbmVfdiA9ICVkXG4iLG9mZnNldF90b19wbGFuZV92KTsKKyAgICAgKi8KKworICAgICB3aGlsZSAobmJsb2Nrcy0tPjApCisgICAgICB7CisJdW5zaWduZWQgaW50IGdyYXlfaW5kZXg7CisKKwlmaWxsX25iaXRzKHJlc2Vydm9pcixuYml0c19pbl9yZXNlcnZvaXIsc3RyZWFtLDE2KTsKKwlncmF5X2luZGV4ID0gcmVzZXJ2b2lyICYgcGRldi0+enptYXNrOworCXJlc2Vydm9pciA+Pj0gcGRldi0+eno7CisJbmJpdHNfaW5fcmVzZXJ2b2lyIC09IHBkZXYtPnp6OworCisJZmlsbF9uYml0cyhyZXNlcnZvaXIsbmJpdHNfaW5fcmVzZXJ2b2lyLHN0cmVhbSwyKTsKKworCWlmICggKHJlc2Vydm9pciAmIDMpID09IDApCisJIHsKKwkgICByZXNlcnZvaXI+Pj0yOworCSAgIG5iaXRzX2luX3Jlc2Vydm9pci09MjsKKwkgICBmb3IgKGk9MDtpPDE2O2krKykKKwkgICAgIHRlbXBfY29sb3JzW2ldID0gcGRldi0+dGFibGVfZGMwMFtncmF5X2luZGV4XTsKKworCSB9CisJZWxzZQorCSB7CisJICAgdW5zaWduZWQgaW50IGNoYW5uZWxfdiwgb2Zmc2V0MTsKKworCSAgIC8qIHN3YXAgYml0IDAgYW5kIDIgb2Ygb2Zmc2V0X09SICovCisJICAgY2hhbm5lbF92ID0gKChyZXNlcnZvaXIgJiAxKSA8PCAyKSB8IChyZXNlcnZvaXIgJiAyKSB8ICgocmVzZXJ2b2lyICYgNCk+PjIpOworCSAgIHJlc2Vydm9pcj4+PTM7CisJICAgbmJpdHNfaW5fcmVzZXJ2b2lyLT0zOworCisJICAgZm9yIChpPTA7aTwxNjtpKyspCisJICAgICB0ZW1wX2NvbG9yc1tpXSA9IHBkZXYtPnRhYmxlX2Q4MDBbZ3JheV9pbmRleF07CisKKwkgICBwdGFibGUwMDA0ID0gcGRldi0+dGFibGVfMDAwNCArIChwYXNzZXMqMTYzODQpICsgKGZpcnN0XzRfYml0cyoxMDI0KSArIChjaGFubmVsX3YqMTI4KTsKKwkgICBwdGFibGU4MDA0ID0gcGRldi0+dGFibGVfODAwNCArIChwYXNzZXMqNDA5NikgICsgKGZpcnN0XzRfYml0cyoyNTYpICArIChjaGFubmVsX3YqMzIpOworCisJICAgb2Zmc2V0MSA9IDA7CisJICAgd2hpbGUoMSkgCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBpbnQgaW5kZXhfaW5fdGFibGVfb3BzLCBvcCwgcm93cz0wOworCSAgICAgIGZpbGxfbmJpdHMocmVzZXJ2b2lyLG5iaXRzX2luX3Jlc2Vydm9pcixzdHJlYW0sMTYpOworCisJICAgICAgLyogbW9kZSBpcyAwLDEgb3IgMiAqLworCSAgICAgIGluZGV4X2luX3RhYmxlX29wcyA9IChyZXNlcnZvaXImMHgzRik7CisJICAgICAgb3AgPSB0YWJsZV9vcHNbIGluZGV4X2luX3RhYmxlX29wcyo0IF07CisJICAgICAgaWYgKG9wID09IDIpCisJICAgICAgIHsKKwkJIHJlc2Vydm9pciA+Pj0gMjsKKwkJIG5iaXRzX2luX3Jlc2Vydm9pciAtPSAyOworCQkgYnJlYWs7CS8qIGV4aXQgdGhlIHdoaWxlKDEpICovCisJICAgICAgIH0KKwkgICAgICBpZiAob3AgPT0gMCkKKwkgICAgICAgeworCQkgdW5zaWduZWQgaW50IHNoaWZ0OworCisJCSBvZmZzZXQxID0gKG9mZnNldDEgKyB0YWJsZV9vcHNbaW5kZXhfaW5fdGFibGVfb3BzKjQrMl0pICYgMHgwRjsKKwkJIHNoaWZ0ID0gdGFibGVfb3BzWyBpbmRleF9pbl90YWJsZV9vcHMqNCsxIF07CisJCSByZXNlcnZvaXIgPj49IHNoaWZ0OworCQkgbmJpdHNfaW5fcmVzZXJ2b2lyIC09IHNoaWZ0OworCQkgcm93cyA9IHB0YWJsZTAwMDRbIG9mZnNldDEgKyB0YWJsZV9vcHNbaW5kZXhfaW5fdGFibGVfb3BzKjQrM10gXTsKKwkgICAgICAgfQorCSAgICAgIGlmIChvcCA9PSAxKQorCSAgICAgICB7CisJCSAgLyogMTBiaXRzIFsgeHh4eCB4eHh4IHl5eXkgMDAwIF0KKwkJICAgKiB5eXkgPT4gb2Zmc2V0IGluIHRoZSB0YWJsZTgwMDQKKwkJICAgKiB4eHggPT4gb2Zmc2V0IGluIHRoZSB0YWJsZWQwMDQKKwkJICAgKi8KKwkJIHVuc2lnbmVkIGludCBtYXNrLCBzaGlmdDsKKwkJIHVuc2lnbmVkIGludCBjb2wxLCByb3cxLCB0b3RhbF9iaXRzOworCisJCSBvZmZzZXQxID0gKG9mZnNldDEgKyAoKHJlc2Vydm9pcj4+MykmMHgwRikrMSkgJiAweDBGOworCisJCSBjb2wxID0gKHJlc2Vydm9pcj4+NykgJiAweEZGOworCQkgcm93MSA9IHB0YWJsZTgwMDQgWyBvZmZzZXQxKjIgXTsKKworCQkgLyogQml0IG1hc2sgdGFibGUgKi8KKwkJIG1hc2sgPSBwZGV2LT50YWJsZV9kMDA0WyAocm93MTw8OCkgKyBjb2wxIF07CisJCSBzaGlmdCA9IHB0YWJsZTgwMDQgWyBvZmZzZXQxKjIgKyAxXTsKKwkJIHJvd3MgPSAoKG1hc2sgPDwgc2hpZnQpICsgMHg4MCkgJiAweEZGOworCisJCSB0b3RhbF9iaXRzID0gcm93MSArIDg7CisJCSByZXNlcnZvaXIgPj49IHRvdGFsX2JpdHM7CisJCSBuYml0c19pbl9yZXNlcnZvaXIgLT0gdG90YWxfYml0czsKKwkgICAgICAgfQorCSAgICAgICB7CisJCSBjb25zdCB1bnNpZ25lZCBpbnQgKnRhYmxlX2EwMDQgPSBwZGV2LT50YWJsZV9hMDA0ICsgcm93cyoxMjsKKwkJIHVuc2lnbmVkIGludCAqcG9mZnNldCA9IE11bElkeCArIG9mZnNldDEqMTY7CS8qIDY0LzQgKGludCkgKi8KKwkJIGZvciAoaT0wO2k8MTY7aSsrKQorCQkgIHsKKwkJICAgIHRlbXBfY29sb3JzW2ldICs9IHRhYmxlX2EwMDRbICpwb2Zmc2V0IF07CisJCSAgICBwb2Zmc2V0Kys7CisJCSAgfQorCSAgICAgICB9CisJICAgfQorCSB9CisjZGVmaW5lIFVTRV9TSUdORURfSU5UX0ZPUl9DT0xPUgorI2lmZGVmIFVTRV9TSUdORURfSU5UX0ZPUl9DT0xPUgorIyAgZGVmaW5lIENMQU1QKHgpICgoeCk+MjU1PzI1NTooKHgpPDA/MDp4KSkKKyNlbHNlCisjICBkZWZpbmUgQ0xBTVAoeCkgKCh4KT4yNTU/MjU1OngpCisjZW5kaWYKKworCWlmIChwYXNzZXMgPT0gMCkKKwkgeworI2lmZGVmIFVTRV9TSUdORURfSU5UX0ZPUl9DT0xPUgorCSAgIGNvbnN0IGludCAqYyA9IHRlbXBfY29sb3JzOworI2Vsc2UKKwkgICBjb25zdCB1bnNpZ25lZCBpbnQgKmMgPSB0ZW1wX2NvbG9yczsKKyNlbmRpZgorCSAgIHVuc2lnbmVkIGNoYXIgKmQ7CisKKwkgICBkID0gZGVzdF95OworCSAgIGZvciAoaT0wO2k8NDtpKyssYysrKQorCSAgICAgKmQrKyA9IENMQU1QKCgqYykgPj4gcGRldi0+eXkpOworCisJICAgZCA9IGRlc3RfeSArIGJ5dGVzX3Blcl9jaGFubmVsOworCSAgIGZvciAoaT0wO2k8NDtpKyssYysrKQorCSAgICAgKmQrKyA9IENMQU1QKCgqYykgPj4gcGRldi0+eXkpOworCisJICAgZCA9IGRlc3RfeSArIG9mZnNldF90b19wbGFuZV91OworCSAgIGZvciAoaT0wO2k8NDtpKyssYysrKQorCSAgICAgKmQrKyA9IENMQU1QKCgqYykgPj4gcGRldi0+eXkpOworCisJICAgZCA9IGRlc3RfeSArIG9mZnNldF90b19wbGFuZV92OworCSAgIGZvciAoaT0wO2k8NDtpKyssYysrKQorCSAgICAgKmQrKyA9IENMQU1QKCgqYykgPj4gcGRldi0+eXkpOworCisJICAgZGVzdF95ICs9IDQ7CisJIH0KKwllbHNlIGlmIChwYXNzZXMgPT0gMSkKKwkgeworI2lmZGVmIFVTRV9TSUdORURfSU5UX0ZPUl9DT0xPUgorCSAgIGludCAqYzEgPSB0ZW1wX2NvbG9yczsKKwkgICBpbnQgKmMyID0gdGVtcF9jb2xvcnMrNDsKKyNlbHNlCisJICAgdW5zaWduZWQgaW50ICpjMSA9IHRlbXBfY29sb3JzOworCSAgIHVuc2lnbmVkIGludCAqYzIgPSB0ZW1wX2NvbG9ycys0OworI2VuZGlmCisJICAgdW5zaWduZWQgY2hhciAqZDsKKworCSAgIGQgPSBkZXN0X3k7CisJICAgZm9yIChpPTA7aTw0O2krKyxjMSsrLGMyKyspCisJICAgIHsKKwkgICAgICAqZCsrID0gQ0xBTVAoKCpjMSkgPj4gcGRldi0+eXkpOworCSAgICAgICpkKysgPSBDTEFNUCgoKmMyKSA+PiBwZGV2LT55eSk7CisJICAgIH0KKwkgICBjMSA9IHRlbXBfY29sb3JzKzEyOworCSAgIC8vYzIgPSB0ZW1wX2NvbG9ycys4OworCSAgIGQgPSBkZXN0X3kgKyBieXRlc19wZXJfY2hhbm5lbDsKKwkgICBmb3IgKGk9MDtpPDQ7aSsrLGMxKyssYzIrKykKKwkgICAgeworCSAgICAgICpkKysgPSBDTEFNUCgoKmMxKSA+PiBwZGV2LT55eSk7CisJICAgICAgKmQrKyA9IENMQU1QKCgqYzIpID4+IHBkZXYtPnl5KTsKKwkgICAgfQorCisJICAgaWYgKGV2ZW5fbGluZSkJLyogRWFjaCBsaW5lLCBzd2FwIHUvdiAqLworCSAgICB7CisJICAgICAgZXZlbl9saW5lPTA7CisJICAgICAgZGVzdF95ID0gZGVzdF92OworCSAgICAgIGRlc3RfdSArPSA4OworCSAgICB9CisJICAgZWxzZQorCSAgICB7CisJICAgICAgZXZlbl9saW5lPTE7CisJICAgICAgZGVzdF95ID0gZGVzdF91OworCSAgICAgIGRlc3RfdiArPSA4OworCSAgICB9CisJIH0KKworICAgICAgfSAvKiBlbmQgb2Ygd2hpbGUgKG5ibG9ja3MtLT4wKSAqLworCisgICB9IC8qIGVuZCBvZiBmb3IgKHBhc3Nlcz0wO3Bhc3NlczwyO3Bhc3NlcysrKSAqLworCit9CisKKworLyoqCisgKgorICogaW1hZ2U6IHNpemUgb2YgdGhlIGltYWdlIHdhbnRlZAorICogdmlldyA6IHNpemUgb2YgdGhlIGltYWdlIHJldHVybmVkIGJ5IHRoZSBjYW1lcmEKKyAqIG9mZnNldDogKHgseSkgdG8gZGlzcGxheWVyIGltYWdlIGluIHRoZSB2aWV3CisgKgorICogc3JjOiByYXcgZGF0YQorICogZHN0OiBpbWFnZSBvdXRwdXQKKyAqIGZsYWdzOiBQV0NYX0ZMQUdfUExBTkFSCisgKiBwZGV2OiBwcml2YXRlIGJ1ZmZlcgorICogYmFuZGxlbmd0aDoKKyAqCisgKi8KK3ZvaWQgcHdjX2RlYzIzX2RlY29tcHJlc3MoY29uc3Qgc3RydWN0IHB3Y19jb29yZCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHB3Y19jb29yZCAqdmlldywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgcHdjX2Nvb3JkICpvZmZzZXQsCisJCQkgICAgY29uc3Qgdm9pZCAqc3JjLAorCQkJICAgIHZvaWQgKmRzdCwKKwkJCSAgICBpbnQgZmxhZ3MsCisJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICBpbnQgYmFuZGxlbmd0aCkKK3sKKyAgY29uc3Qgc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGV2ID0gZGF0YTsKKyAgdW5zaWduZWQgY2hhciAqcG91dCwgKnBvdXRfcGxhbmFyX3k9TlVMTCwgKnBvdXRfcGxhbmFyX3U9TlVMTCwgKnBvdXRfcGxhbmFyX3Y9TlVMTDsKKyAgaW50IGksbixzdHJpZGUscGl4ZWxfc2l6ZTsKKworCisgIGlmIChmbGFncyAmIFBXQ1hfRkxBR19CQVlFUikKKyAgIHsKKyAgICAgcG91dCA9IGRzdCArICh2aWV3LT54ICogb2Zmc2V0LT55KSArIG9mZnNldC0+eDsKKyAgICAgcGl4ZWxfc2l6ZSA9IHZpZXctPnggKiA0OworICAgfQorICBlbHNlCisgICB7CisgICAgIG4gPSB2aWV3LT54ICogdmlldy0+eTsKKworICAgICAvKiBvZmZzZXQgaW4gWSBwbGFuZSAqLworICAgICBzdHJpZGUgPSB2aWV3LT54ICogb2Zmc2V0LT55OworICAgICBwb3V0X3BsYW5hcl95ID0gZHN0ICsgc3RyaWRlICsgb2Zmc2V0LT54OworCisgICAgIC8qIG9mZnNldHMgaW4gVS9WIHBsYW5lcyAqLworICAgICBzdHJpZGUgPSAodmlldy0+eCAqIG9mZnNldC0+eSkvNCArIG9mZnNldC0+eC8yOworICAgICBwb3V0X3BsYW5hcl91ID0gZHN0ICsgbiArICAgICArIHN0cmlkZTsKKyAgICAgcG91dF9wbGFuYXJfdiA9IGRzdCArIG4gKyBuLzQgKyBzdHJpZGU7CisKKyAgICAgcGl4ZWxfc2l6ZSA9IHZpZXctPnggKiA0OworICAgfQorCisKKyAgZm9yIChpPTA7aTxpbWFnZS0+eTtpKz00KQorICAgeworICAgICBpZiAoZmxhZ3MgJiBQV0NYX0ZMQUdfQkFZRVIpCisgICAgICB7CisJLy9UT0RPOgorCS8vRGVjb21wcmVzc0JhbmRCYXllcihwZGV2LHNyYyxwb3V0LGltYWdlLngsdmlldy0+eCxmbGFncyk7CisJc3JjICs9IGJhbmRsZW5ndGg7CisJcG91dCArPSBwaXhlbF9zaXplOworICAgICAgfQorICAgICBlbHNlCisgICAgICB7CisJRGVjb21wcmVzc0JhbmQyMyhwZGV2LHNyYyxwb3V0X3BsYW5hcl95LHBvdXRfcGxhbmFyX3UscG91dF9wbGFuYXJfdixpbWFnZS0+eCx2aWV3LT54LGZsYWdzKTsKKwlzcmMgKz0gYmFuZGxlbmd0aDsKKwlwb3V0X3BsYW5hcl95ICs9IHBpeGVsX3NpemU7CisJcG91dF9wbGFuYXJfdSArPSB2aWV3LT54OworCXBvdXRfcGxhbmFyX3YgKz0gdmlldy0+eDsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZCBwd2NfZGVjMjNfZXhpdCh2b2lkKQoreworICAvKiBEbyBub3RoaW5nICovCisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1kZWMyMy5oIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1kZWMyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMmFhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWRlYzIzLmgKQEAgLTAsMCArMSw1OCBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaWZuZGVmIFBXQ19ERUMyM19ICisjZGVmaW5lIFBXQ19ERUMyM19ICisKK3N0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZQoreworICB1bnNpZ25lZCBjaGFyIHh4LHl5LHp6LHp6bWFzazsKKworICB1bnNpZ25lZCBjaGFyIHRhYmxlXzAwMDRbMioweDQwMDBdOworICB1bnNpZ25lZCBjaGFyIHRhYmxlXzgwMDRbMioweDEwMDBdOworICB1bnNpZ25lZCBpbnQgIHRhYmxlX2EwMDRbMjU2KjEyXTsKKworICB1bnNpZ25lZCBjaGFyIHRhYmxlX2QwMDRbOCoyNTZdOworICB1bnNpZ25lZCBpbnQgIHRhYmxlX2Q4MDBbMjU2XTsKKyAgdW5zaWduZWQgaW50ICB0YWJsZV9kYzAwWzI1Nl07Cit9OworCisKK3ZvaWQgcHdjX2RlYzIzX2luaXQoaW50IHR5cGUsIGludCByZWxlYXNlLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHZvaWQgKnByaXZhdGVfZGF0YSk7Cit2b2lkIHB3Y19kZWMyM19leGl0KHZvaWQpOwordm9pZCBwd2NfZGVjMjNfZGVjb21wcmVzcyhjb25zdCBzdHJ1Y3QgcHdjX2Nvb3JkICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHdjX2Nvb3JkICp2aWV3LAorCQkJICAgIGNvbnN0IHN0cnVjdCBwd2NfY29vcmQgKm9mZnNldCwKKwkJCSAgICBjb25zdCB2b2lkICpzcmMsCisJCQkgICAgdm9pZCAqZHN0LAorCQkJICAgIGludCBmbGFncywKKwkJCSAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgIGludCBiYW5kbGVuZ3RoKTsKKworCisKKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1pZi5jIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMGE1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWlmLmMKQEAgLTAsMCArMSwyMjEyIEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICBVU0IgYW5kIFZpZGVvNExpbnV4IGludGVyZmFjZSBwYXJ0LgorICAgKEMpIDE5OTktMjAwNCBOZW1vc29mdCBVbnYuCisgICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworKi8KKworLyogIAorICAgVGhpcyBjb2RlIGZvcm1zIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgVVNCIGxheWVycyBhbmQgdGhlIFBoaWxpcHMKKyAgIHNwZWNpZmljIHN0dWZmLiBTb21lIGFkYW52ZWQgc3R1ZmYgb2YgdGhlIGRyaXZlciBmYWxscyB1bmRlciBhbgorICAgTkRBLCBzaWduZWQgYmV0d2VlbiBtZSBhbmQgUGhpbGlwcyBCLlYuLCBFaW5kaG92ZW4sIHRoZSBOZXRoZXJsYW5kcywgYW5kCisgICBpcyB0aHVzIG5vdCBkaXN0cmlidXRlZCBpbiBzb3VyY2UgZm9ybS4gVGhlIGJpbmFyeSBwd2N4Lm8gbW9kdWxlIAorICAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBmYWxscyB1bmRlciB0aGUgTkRBLgorICAgCisgICBJbiBjYXNlIHlvdSdyZSB3b25kZXJpbmc6ICdwd2MnIHN0YW5kcyBmb3IgIlBoaWxpcHMgV2ViQ2FtIiwgYnV0IAorICAgSSByZWFsbHkgZGlkbid0IHdhbnQgdG8gdHlwZSAncGhpbGlwc193ZWJfY2FtJyBldmVyeSB0aW1lIChJJ20gbGF6eSBhcworICAgYW55IExpbnV4IGtlcm5lbCBoYWNrZXIsIGJ1dCBJIGRvbid0IGxpa2UgdW5jb21wcmVoZW5zaWJsZSBhYmJyZXZpYXRpb25zCisgICB3aXRob3V0IGV4cGxhbmF0aW9uKS4KKyAgIAorICAgT2ggeWVzLCBjb252ZW50aW9uOiB0byBkaXNjdGluZ3Vpc2ggYmV0d2VlbiBhbGwgdGhlIHZhcmlvdXMgcG9pbnRlcnMgdG8KKyAgIGRldmljZS1zdHJ1Y3R1cmVzLCBJIHVzZSB0aGVzZSBuYW1lcyBmb3IgdGhlIHBvaW50ZXIgdmFyaWFibGVzOgorICAgdWRldjogc3RydWN0IHVzYl9kZXZpY2UgKgorICAgdmRldjogc3RydWN0IHZpZGVvX2RldmljZSAqCisgICBwZGV2OiBzdHJ1Y3QgcHdjX2Rldml2ZSAqCisqLworCisvKiBDb250cmlidXRvcnM6CisgICAtIEFsdmFyYWRvOiBhZGRpbmcgd2hpdGViYWxhbmNlIGNvZGUKKyAgIC0gQWxpc3RhciBNb2lyZTogUXVpY2tDYW0gMzAwMCBQcm8gZGV2aWNlL3Byb2R1Y3QgSUQKKyAgIC0gVG9ueSBIb3lsZTogQ3JlYXRpdmUgTGFicyBXZWJjYW0gNSBkZXZpY2UvcHJvZHVjdCBJRAorICAgLSBNYXJrIEJ1cmF6aW46IHNvbHZpbmcgaGFuZyBpbiBWSURJT0NTWU5DIHdoZW4gY2FtZXJhIGdldHMgdW5wbHVnZ2VkCisgICAtIEprIEZhbmc6IFNvdGVjIEFmaW5hIEV5ZSBJRAorICAgLSBYYXZpZXIgUm9jaGU6IFF1aWNrQ2FtIFBybyA0MDAwIElECisgICAtIEplbnMgS251ZHNlbjogUXVpY2tDYW0gWm9vbSBJRAorICAgLSBKLiBEZWJlcnQ6IFF1aWNrQ2FtIGZvciBOb3RlYm9va3MgSUQKKyovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAicHdjLmgiCisjaW5jbHVkZSAicHdjLWlvY3RsLmgiCisjaW5jbHVkZSAicHdjLWtpYXJhLmgiCisjaW5jbHVkZSAicHdjLXRpbW9uLmgiCisjaW5jbHVkZSAicHdjLWRlYzIzLmgiCisjaW5jbHVkZSAicHdjLWRlYzEuaCIKKyNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgorCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBkcml2ZXIgdGVtcGxhdGVzICovCisKKy8qIGhvdHBsdWcgZGV2aWNlIHRhYmxlIHN1cHBvcnQgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwd2NfZGV2aWNlX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMwMikgfSwgLyogUGhpbGlwcyBtb2RlbHMgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMDMpIH0sCisJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzA0KSB9LAorCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMwNykgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMDgpIH0sCisJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzBDKSB9LAorCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMxMCkgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMTEpIH0sCisJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzEyKSB9LAorCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMxMykgfSwgLyogdGhlICduZXcnIDcyMEsgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNjlBLCAweDAwMDEpIH0sIC8qIEFza2V5ICovCisJeyBVU0JfREVWSUNFKDB4MDQ2RCwgMHgwOEIwKSB9LCAvKiBMb2dpdGVjaCBRdWlja0NhbSBQcm8gMzAwMCAqLworCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCMSkgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gTm90ZWJvb2sgUHJvICovCisJeyBVU0JfREVWSUNFKDB4MDQ2RCwgMHgwOEIyKSB9LCAvKiBMb2dpdGVjaCBRdWlja0NhbSBQcm8gNDAwMCAqLworCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCMykgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gWm9vbSAob2xkIG1vZGVsKSAqLworCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCNCkgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gWm9vbSAobmV3IG1vZGVsKSAqLworCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCNSkgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gT3JiaXQvU3BoZXJlICovCisJeyBVU0JfREVWSUNFKDB4MDQ2RCwgMHgwOEI2KSB9LCAvKiBMb2dpdGVjaCAocmVzZXJ2ZWQpICovCisJeyBVU0JfREVWSUNFKDB4MDQ2RCwgMHgwOEI3KSB9LCAvKiBMb2dpdGVjaCAocmVzZXJ2ZWQpICovCisJeyBVU0JfREVWSUNFKDB4MDQ2RCwgMHgwOEI4KSB9LCAvKiBMb2dpdGVjaCAocmVzZXJ2ZWQpICovCisJeyBVU0JfREVWSUNFKDB4MDU1RCwgMHg5MDAwKSB9LCAvKiBTYW1zdW5nICovCisJeyBVU0JfREVWSUNFKDB4MDU1RCwgMHg5MDAxKSB9LAorCXsgVVNCX0RFVklDRSgweDA0MUUsIDB4NDAwQykgfSwgLyogQ3JlYXRpdmUgV2ViY2FtIDUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDFFLCAweDQwMTEpIH0sIC8qIENyZWF0aXZlIFdlYmNhbSBQcm8gRXggKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNENDLCAweDgxMTYpIH0sIC8qIEFmaW5hIEV5ZSAqLworCXsgVVNCX0RFVklDRSgweDA2QkUsIDB4ODExNikgfSwgLyogbmV3IEFmaW5hIEV5ZSAqLworCXsgVVNCX0RFVklDRSgweDBkODEsIDB4MTkxMCkgfSwgLyogVmlzaW9uaXRlICovCisJeyBVU0JfREVWSUNFKDB4MGQ4MSwgMHgxOTAwKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwd2NfZGV2aWNlX3RhYmxlKTsKKworc3RhdGljIGludCB1c2JfcHdjX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgdXNiX3B3Y19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHB3Y19kcml2ZXIgPSB7CisJLm93bmVyID0JCVRISVNfTU9EVUxFLAorCS5uYW1lID0JCQkiUGhpbGlwcyB3ZWJjYW0iLAkvKiBuYW1lICovCisJLmlkX3RhYmxlID0JCXB3Y19kZXZpY2VfdGFibGUsCisJLnByb2JlID0JCXVzYl9wd2NfcHJvYmUsCQkvKiBwcm9iZSgpICovCisJLmRpc2Nvbm5lY3QgPQkJdXNiX3B3Y19kaXNjb25uZWN0LAkvKiBkaXNjb25uZWN0KCkgKi8KK307CisKKyNkZWZpbmUgTUFYX0RFVl9ISU5UUwkyMAorI2RlZmluZSBNQVhfSVNPQ19FUlJPUlMJMjAKKworc3RhdGljIGludCBkZWZhdWx0X3NpemUgPSBQU1pfUUNJRjsKK3N0YXRpYyBpbnQgZGVmYXVsdF9mcHMgPSAxMDsKK3N0YXRpYyBpbnQgZGVmYXVsdF9mYnVmcyA9IDM7ICAgLyogRGVmYXVsdCBudW1iZXIgb2YgZnJhbWUgYnVmZmVycyAqLworc3RhdGljIGludCBkZWZhdWx0X21idWZzID0gMjsJLyogRGVmYXVsdCBudW1iZXIgb2YgbW1hcCgpIGJ1ZmZlcnMgKi8KKyAgICAgICBpbnQgcHdjX3RyYWNlID0gVFJBQ0VfTU9EVUxFIHwgVFJBQ0VfRkxPVyB8IFRSQUNFX1BXQ1g7CitzdGF0aWMgaW50IHBvd2VyX3NhdmUgPSAwOworc3RhdGljIGludCBsZWRfb24gPSAxMDAsIGxlZF9vZmYgPSAwOyAvKiBkZWZhdWx0cyB0byBMRUQgdGhhdCBpcyBvbiB3aGlsZSBpbiB1c2UgKi8KKyAgICAgICBpbnQgcHdjX3ByZWZlcnJlZF9jb21wcmVzc2lvbiA9IDI7IC8qIDAuLjMgPSB1bmNvbXByZXNzZWQuLmhpZ2ggKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludCB0eXBlOworCWNoYXIgc2VyaWFsX251bWJlclszMF07CisJaW50IGRldmljZV9ub2RlOworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OworfSBkZXZpY2VfaGludFtNQVhfREVWX0hJTlRTXTsKKworLyoqKi8KKworc3RhdGljIGludCBwd2NfdmlkZW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IHB3Y192aWRlb19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgc3NpemVfdCBwd2NfdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHdjX3ZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOworc3RhdGljIGludCAgcHdjX3ZpZGVvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIHVuc2lnbmVkIGludCBpb2N0bG5yLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50ICBwd2NfdmlkZW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwd2NfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQlwd2NfdmlkZW9fb3BlbiwKKwkucmVsZWFzZSA9ICAgICAJcHdjX3ZpZGVvX2Nsb3NlLAorCS5yZWFkID0JCXB3Y192aWRlb19yZWFkLAorCS5wb2xsID0JCXB3Y192aWRlb19wb2xsLAorCS5tbWFwID0JCXB3Y192aWRlb19tbWFwLAorCS5pb2N0bCA9ICAgICAgICBwd2NfdmlkZW9faW9jdGwsCisJLmxsc2VlayA9ICAgICAgIG5vX2xsc2VlaywKK307CitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBwd2NfdGVtcGxhdGUgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJIlBoaWxpcHMgV2ViY2FtIiwJLyogRmlsbGVkIGluIGxhdGVyICovCisJLnR5cGUgPQkJVklEX1RZUEVfQ0FQVFVSRSwKKwkuaGFyZHdhcmUgPQlWSURfSEFSRFdBUkVfUFdDLAorCS5yZWxlYXNlID0JdmlkZW9fZGV2aWNlX3JlbGVhc2UsCisJLmZvcHMgPSAgICAgICAgICZwd2NfZm9wcywKKwkubWlub3IgPSAgICAgICAgLTEsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPa2F5LCB0aGlzIGlzIHNvbWUgbWFnaWMgdGhhdCBJIHdvcmtlZCBvdXQgYW5kIHRoZSByZWFzb25pbmcgYmVoaW5kIGl0Li4uCisKKyAgIFRoZSBiaWdnZXN0IHByb2JsZW0gd2l0aCBhbnkgVVNCIGRldmljZSBpcyBvZiBjb3Vyc2U6ICJ3aGF0IHRvIGRvIAorICAgd2hlbiB0aGUgdXNlciB1bnBsdWdzIHRoZSBkZXZpY2Ugd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IGFuIGFwcGxpY2F0aW9uPyIKKyAgIFdlIGhhdmUgc2V2ZXJhbCBvcHRpb25zOgorICAgMSkgQ3Vyc2UgdGhlbSB3aXRoIHRoZSA3IHBsYWd1ZXMgd2hlbiB0aGV5IGRvIChyZXF1aXJlcyBkaXZpbmUgaW50ZXJ2ZW50aW9uKQorICAgMikgVGVsbCB0aGVtIG5vdCB0byAod29uJ3Qgd29yazogdGhleSdsbCBkbyBpdCBhbnl3YXkpCisgICAzKSBPb3BzIHRoZSBrZXJuZWwgKHRoaXMgd2lsbCBoYXZlIGEgbmVnYXRpdmUgZWZmZWN0IG9uIGEgdXNlcidzIHVwdGltZSkKKyAgIDQpIERvIHNvbWV0aGluZyBzZW5zaWJsZS4KKyAgIAorICAgT2YgY291cnNlLCB3ZSBnbyBmb3Igb3B0aW9uIDQuCisKKyAgIEl0IGhhcHBlbnMgdGhhdCB0aGlzIGRldmljZSB3aWxsIGJlIGxpbmtlZCB0byB0d28gdGltZXMsIG9uY2UgZnJvbQorICAgdXNiX2RldmljZSBhbmQgb25jZSBmcm9tIHRoZSB2aWRlb19kZXZpY2UgaW4gdGhlaXIgcmVzcGVjdGl2ZSAncHJpdmF0ZScKKyAgIHBvaW50ZXJzLiBUaGlzIGlzIGRvbmUgd2hlbiB0aGUgZGV2aWNlIGlzIHByb2JlZCgpIGFuZCBhbGwgaW5pdGlhbGl6YXRpb24KKyAgIHN1Y2NlZWRlZC4gVGhlIHB3Y19kZXZpY2Ugc3RydWN0IGxpbmtzIGJhY2sgdG8gYm90aCBzdHJ1Y3R1cmVzLgorCisgICBXaGVuIGEgZGV2aWNlIGlzIHVucGx1Z2dlZCB3aGlsZSBpbiB1c2UgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIAorICAgbGlzdCBvZiBrbm93biBVU0IgZGV2aWNlczsgSSBhbHNvIGRlLXJlZ2lzdGVyIGl0IGFzIGEgVjRMIGRldmljZSwgYnV0IAorICAgdW5mb3J0dW5hdGVseSBJIGNhbid0IGZyZWUgdGhlIG1lbW9yeSBzaW5jZSB0aGUgc3RydWN0IGlzIHN0aWxsIGluIHVzZQorICAgYnkgdGhlIGZpbGUgZGVzY3JpcHRvci4gVGhpcyBmcmVlLWluZyBpcyB0aGVuIGRlZmVyZW5kIHVudGlsIHRoZSBmaXJzdAorICAgb3Bwb3J0dW5pdHkuIENydWRlLCBidXQgaXQgd29ya3MuCisgICAKKyAgIEEgc21hbGwgJ2FkdmFudGFnZScgaXMgdGhhdCBpZiBhIHVzZXIgdW5wbHVncyB0aGUgY2FtIGFuZCBwbHVncyBpdCBiYWNrCisgICBpbiwgaXQgc2hvdWxkIGdldCBhc3NpZ25lZCB0aGUgc2FtZSB2aWRlbyBkZXZpY2UgbWlub3IsIGJ1dCB1bmZvcnR1bmF0ZWx5CisgICBpdCdzIG5vbi10cml2aWFsIHRvIHJlLWxpbmsgdGhlIGNhbSBiYWNrIHRvIHRoZSB2aWRlbyBkZXZpY2UuLi4gKHRoYXQgCisgICB3b3VsZCBzdXJlbHkgYmUgbWFnaWMhIDopKQorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zICovCisKKy8qIEhlcmUgd2Ugd2FudCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5LgorICogVGhpcyBpcyB1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXJlYS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGt2aXJ0X3RvX3BhKHVuc2lnbmVkIGxvbmcgYWRyKSAKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBrdmEsIHJldDsKKworCWt2YSA9ICh1bnNpZ25lZCBsb25nKSBwYWdlX2FkZHJlc3Modm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJa3ZhIHw9IGFkciAmIChQQUdFX1NJWkUtMSk7IC8qIHJlc3RvcmUgdGhlIG9mZnNldCAqLworCXJldCA9IF9fcGEoa3ZhKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgKiBydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqIG1lbTsKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCXNpemU9UEFHRV9BTElHTihzaXplKTsKKyAgICAgICAgbWVtPXZtYWxsb2NfMzIoc2l6ZSk7CisJaWYgKG1lbSkgCisJeworCQltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KKwkgICAgICAgIGFkcj0odW5zaWduZWQgbG9uZykgbWVtOworCQl3aGlsZSAoc2l6ZSA+IDApIAorICAgICAgICAgICAgICAgIHsKKwkJCVNldFBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJCWFkcis9UEFHRV9TSVpFOworCQkJc2l6ZS09UEFHRV9TSVpFOworCQl9CisJfQorCXJldHVybiBtZW07Cit9CisKK3N0YXRpYyB2b2lkIHJ2ZnJlZSh2b2lkICogbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRyOworCisJaWYgKG1lbSkgCisJeworCSAgICAgICAgYWRyPSh1bnNpZ25lZCBsb25nKSBtZW07CisJCXdoaWxlICgobG9uZykgc2l6ZSA+IDApIAorICAgICAgICAgICAgICAgIHsKKwkJCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQkJYWRyKz1QQUdFX1NJWkU7CisJCQlzaXplLT1QQUdFX1NJWkU7CisJCX0KKwkJdmZyZWUobWVtKTsKKwl9Cit9CisKKworCisKK3N0YXRpYyBpbnQgcHdjX2FsbG9jYXRlX2J1ZmZlcnMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJaW50IGk7CisJdm9pZCAqa2J1ZjsKKworCVRyYWNlKFRSQUNFX01FTU9SWSwgIj4+IHB3Y19hbGxvY2F0ZV9idWZmZXJzKHBkZXYgPSAweCVwKVxuIiwgcGRldik7CisKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOWElPOworCQkKKyNpZmRlZiBQV0NfTUFHSUMKKwlpZiAocGRldi0+bWFnaWMgIT0gUFdDX01BR0lDKSB7CisJCUVycigiYWxsb2NhdGVfYnVmZmVycygpOiBtYWdpYyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisjZW5kaWYJCisJLyogQWxsb2NhdGUgSXNvY2hyb251b3VzIHBpcGUgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgeworCQlpZiAocGRldi0+c2J1ZltpXS5kYXRhID09IE5VTEwpIHsKKwkJCWtidWYgPSBrbWFsbG9jKElTT19CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoa2J1ZiA9PSBOVUxMKSB7CisJCQkJRXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgaXNvIGJ1ZmZlciAlZC5cbiIsIGkpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiQWxsb2NhdGVkIGlzbyBidWZmZXIgYXQgJXAuXG4iLCBrYnVmKTsKKwkJCXBkZXYtPnNidWZbaV0uZGF0YSA9IGtidWY7CisJCQltZW1zZXQoa2J1ZiwgMCwgSVNPX0JVRkZFUl9TSVpFKTsKKwkJfQorCX0KKworCS8qIEFsbG9jYXRlIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwlpZiAocGRldi0+ZmJ1ZiA9PSBOVUxMKSB7CisJCWtidWYgPSBrbWFsbG9jKGRlZmF1bHRfZmJ1ZnMgKiBzaXplb2Yoc3RydWN0IHB3Y19mcmFtZV9idWYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGtidWYgPT0gTlVMTCkgeworCQkJRXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyIHN0cnVjdHVyZS5cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgYXQgJXAuXG4iLCBrYnVmKTsKKwkJcGRldi0+ZmJ1ZiA9IGtidWY7CisJCW1lbXNldChrYnVmLCAwLCBkZWZhdWx0X2ZidWZzICogc2l6ZW9mKHN0cnVjdCBwd2NfZnJhbWVfYnVmKSk7CisJfQorCS8qIGNyZWF0ZSBmcmFtZSBidWZmZXJzLCBhbmQgbWFrZSBjaXJjdWxhciByaW5nICovCisJZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfZmJ1ZnM7IGkrKykgeworCQlpZiAocGRldi0+ZmJ1ZltpXS5kYXRhID09IE5VTEwpIHsKKwkJCWtidWYgPSB2bWFsbG9jKFBXQ19GUkFNRV9TSVpFKTsgLyogbmVlZCB2bWFsbG9jIHNpbmNlIGZyYW1lIGJ1ZmZlciA+IDEyOEsgKi8KKwkJCWlmIChrYnVmID09IE5VTEwpIHsKKwkJCQlFcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZSBidWZmZXIgJWQuXG4iLCBpKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCVRyYWNlKFRSQUNFX01FTU9SWSwgIkFsbG9jYXRlZCBmcmFtZSBidWZmZXIgJWQgYXQgJXAuXG4iLCBpLCBrYnVmKTsKKwkJCXBkZXYtPmZidWZbaV0uZGF0YSA9IGtidWY7CisJCQltZW1zZXQoa2J1ZiwgMTI4LCBQV0NfRlJBTUVfU0laRSk7CisJCX0KKwl9CisJCisJLyogQWxsb2NhdGUgZGVjb21wcmVzc29yIHRhYmxlIHNwYWNlICovCisJa2J1ZiA9IE5VTEw7CisJc3dpdGNoIChwZGV2LT50eXBlKQorCSB7CisJICBjYXNlIDY3NToKKwkgIGNhc2UgNjgwOgorCSAgY2FzZSA2OTA6CisJICBjYXNlIDcyMDoKKwkgIGNhc2UgNzMwOgorCSAgY2FzZSA3NDA6CisJICBjYXNlIDc1MDoKKwkgICAgVHJhY2UoVFJBQ0VfTUVNT1JZLCJwcml2YXRlX2RhdGEoJVpkKVxuIixzaXplb2Yoc3RydWN0IHB3Y19kZWMyM19wcml2YXRlKSk7CisJICAgIGtidWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsJLyogVGltb24gJiBLaWFyYSAqLworCSAgICBicmVhazsKKwkgIGNhc2UgNjQ1OgorCSAgY2FzZSA2NDY6CisJICAgIC8qIFRPRE8gJiBGSVhNRSAqLworCSAgICBrYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHB3Y19kZWMyM19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJICAgIGJyZWFrOworCSB9CisJaWYgKGtidWYgPT0gTlVMTCkgeworCSAgIEVycigiRmFpbGVkIHRvIGFsbG9jYXRlIGRlY29tcHJlc3MgdGFibGUuXG4iKTsKKwkgICByZXR1cm4gLUVOT01FTTsKKwl9CisJcGRldi0+ZGVjb21wcmVzc19kYXRhID0ga2J1ZjsKKwkKKwkvKiBBbGxvY2F0ZSBpbWFnZSBidWZmZXI7IGRvdWJsZSBidWZmZXIgZm9yIG1tYXAoKSAqLworCWtidWYgPSBydm1hbGxvYyhkZWZhdWx0X21idWZzICogcGRldi0+bGVuX3Blcl9pbWFnZSk7CisJaWYgKGtidWYgPT0gTlVMTCkgeworCQlFcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBpbWFnZSBidWZmZXIocykuIG5lZWRlZCAoJWQpXG4iLGRlZmF1bHRfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCVRyYWNlKFRSQUNFX01FTU9SWSwgIkFsbG9jYXRlZCBpbWFnZSBidWZmZXIgYXQgJXAuXG4iLCBrYnVmKTsKKwlwZGV2LT5pbWFnZV9kYXRhID0ga2J1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdF9tYnVmczsgaSsrKQorCQlwZGV2LT5pbWFnZV9wdHJbaV0gPSBrYnVmICsgaSAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisJZm9yICg7IGkgPCBNQVhfSU1BR0VTOyBpKyspCisJCXBkZXYtPmltYWdlX3B0cltpXSA9IE5VTEw7CisKKwlrYnVmID0gTlVMTDsKKwkgIAorCVRyYWNlKFRSQUNFX01FTU9SWSwgIjw8IHB3Y19hbGxvY2F0ZV9idWZmZXJzKClcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwd2NfZnJlZV9idWZmZXJzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWludCBpOworCisJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiRW50ZXJpbmcgZnJlZV9idWZmZXJzKCVwKS5cbiIsIHBkZXYpOworCisJaWYgKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworI2lmZGVmIFBXQ19NQUdJQworCWlmIChwZGV2LT5tYWdpYyAhPSBQV0NfTUFHSUMpIHsKKwkJRXJyKCJmcmVlX2J1ZmZlcnMoKTogbWFnaWMgZmFpbGVkLlxuIik7CisJCXJldHVybjsKKwl9CisjZW5kaWYJCisKKwkvKiBSZWxlYXNlIElzby1waXBlIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspCisJCWlmIChwZGV2LT5zYnVmW2ldLmRhdGEgIT0gTlVMTCkgeworCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiRnJlZWluZyBJU08gYnVmZmVyIGF0ICVwLlxuIiwgcGRldi0+c2J1ZltpXS5kYXRhKTsKKwkJCWtmcmVlKHBkZXYtPnNidWZbaV0uZGF0YSk7CisJCQlwZGV2LT5zYnVmW2ldLmRhdGEgPSBOVUxMOworCQl9CisKKwkvKiBUaGUgc2FtZSBmb3IgZnJhbWUgYnVmZmVycyAqLworCWlmIChwZGV2LT5mYnVmICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfZmJ1ZnM7IGkrKykgeworCQkJaWYgKHBkZXYtPmZidWZbaV0uZGF0YSAhPSBOVUxMKSB7CisJCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiRnJlZWluZyBmcmFtZSBidWZmZXIgJWQgYXQgJXAuXG4iLCBpLCBwZGV2LT5mYnVmW2ldLmRhdGEpOworCQkJCXZmcmVlKHBkZXYtPmZidWZbaV0uZGF0YSk7CisJCQkJcGRldi0+ZmJ1ZltpXS5kYXRhID0gTlVMTDsKKwkJCX0KKwkJfQorCQlrZnJlZShwZGV2LT5mYnVmKTsKKwkJcGRldi0+ZmJ1ZiA9IE5VTEw7CisJfQorCisJLyogSW50ZXJtZWRpYXRlIGRlY29tcHJlc3Npb24gYnVmZmVyICYgdGFibGVzICovCisJaWYgKHBkZXYtPmRlY29tcHJlc3NfZGF0YSAhPSBOVUxMKSB7CisJCVRyYWNlKFRSQUNFX01FTU9SWSwgIkZyZWVpbmcgZGVjb21wcmVzc2lvbiBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOworCQlrZnJlZShwZGV2LT5kZWNvbXByZXNzX2RhdGEpOworCQlwZGV2LT5kZWNvbXByZXNzX2RhdGEgPSBOVUxMOworCX0KKwlwZGV2LT5kZWNvbXByZXNzb3IgPSBOVUxMOworCisJLyogUmVsZWFzZSBpbWFnZSBidWZmZXJzICovCisJaWYgKHBkZXYtPmltYWdlX2RhdGEgIT0gTlVMTCkgeworCQlUcmFjZShUUkFDRV9NRU1PUlksICJGcmVlaW5nIGltYWdlIGJ1ZmZlciBhdCAlcC5cbiIsIHBkZXYtPmltYWdlX2RhdGEpOworCQlydmZyZWUocGRldi0+aW1hZ2VfZGF0YSwgZGVmYXVsdF9tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2UpOworCX0KKwlwZGV2LT5pbWFnZV9kYXRhID0gTlVMTDsKKwkKKwlUcmFjZShUUkFDRV9NRU1PUlksICJMZWF2aW5nIGZyZWVfYnVmZmVycygpLlxuIik7Cit9CisKKy8qIFRoZSBmcmFtZSAmIGltYWdlIGJ1ZmZlciBtZXNzLiAKKworICAgWWVzLCB0aGlzIGlzIGEgbWVzcy4gV2VsbCwgaXQgdXNlZCB0byBiZSBzaW1wbGUsIGJ1dCBhbGFzLi4uICBJbiB0aGlzCisgICBtb2R1bGUsIDMgYnVmZmVycyBzY2hlbWVzIGFyZSB1c2VkIHRvIGdldCB0aGUgZGF0YSBmcm9tIHRoZSBVU0IgYnVzIHRvCisgICB0aGUgdXNlciBwcm9ncmFtLiBUaGUgZmlyc3Qgc2NoZW1lIGludm9sdmVzIHRoZSBJU08gYnVmZmVycyAoY2FsbGVkIHRodXMKKyAgIHNpbmNlIHRoZXkgdHJhbnNwb3J0IElTTyBkYXRhIGZyb20gdGhlIFVTQiBjb250cm9sbGVyKSwgYW5kIG5vdCByZWFsbHkKKyAgIGludGVyZXN0aW5nLiBTdWZmaWNlcyB0byBzYXkgdGhlIGRhdGEgZnJvbSB0aGlzIGJ1ZmZlciBpcyBxdWlja2x5IAorICAgZ2F0aGVyZWQgaW4gYW4gaW50ZXJydXB0IGhhbmRsZXIgKHB3Y19pc29jX2hhbmRsZXIpIGFuZCBwbGFjZWQgaW50byB0aGUKKyAgIGZyYW1lIGJ1ZmZlci4KKworICAgVGhlIGZyYW1lIGJ1ZmZlciBpcyB0aGUgc2Vjb25kIHNjaGVtZSwgYW5kIGlzIHRoZSBjZW50cmFsIGVsZW1lbnQgaGVyZS4KKyAgIEl0IGNvbGxlY3RzIHRoZSBkYXRhIGZyb20gYSBzaW5nbGUgZnJhbWUgZnJvbSB0aGUgY2FtZXJhIChoZW5jZSwgdGhlCisgICBuYW1lKS4gRnJhbWVzIGFyZSBkZWxpbWl0ZWQgYnkgdGhlIFVTQiBjYW1lcmEgd2l0aCBhIHNob3J0IFVTQiBwYWNrZXQsCisgICBzbyB0aGF0J3MgZWFzeSB0byBkZXRlY3QuIFRoZSBmcmFtZSBidWZmZXJzIGZvcm0gYSBsaXN0IHRoYXQgaXMgZmlsbGVkCisgICBieSB0aGUgY2FtZXJhK1VTQiBjb250cm9sbGVyIGFuZCBkcmFpbmVkIGJ5IHRoZSB1c2VyIHByb2Nlc3MgdGhyb3VnaAorICAgZWl0aGVyIHJlYWQoKSBvciBtbWFwKCkuCisKKyAgIFRoZSBpbWFnZSBidWZmZXIgaXMgdGhlIHRoaXJkIHNjaGVtZSwgaW4gd2hpY2ggZnJhbWVzIGFyZSBkZWNvbXByZXNzZWQKKyAgIGFuZCBjb252ZXJ0ZWQgaW50byBwbGFuYXIgZm9ybWF0LiBGb3IgbW1hcCgpIHRoZXJlIGlzIG1vcmUgdGhhbgorICAgb25lIGltYWdlIGJ1ZmZlciBhdmFpbGFibGUuCisKKyAgIFRoZSBmcmFtZSBidWZmZXJzIHByb3ZpZGUgdGhlIGltYWdlIGJ1ZmZlcmluZy4gSW4gY2FzZSB0aGUgdXNlciBwcm9jZXNzCisgICBpcyBhIGJpdCBzbG93LCB0aGlzIGludHJvZHVjZXMgbGFnIGFuZCBzb21lIHVuZGVzaXJlZCBzaWRlLWVmZmVjdHMuCisgICBUaGUgcHJvYmxlbSBhcmlzZXMgd2hlbiB0aGUgZnJhbWUgYnVmZmVyIGlzIGZ1bGwuIEkgdXNlZCB0byBkcm9wIHRoZSBsYXN0CisgICBmcmFtZSwgd2hpY2ggbWFrZXMgdGhlIGRhdGEgaW4gdGhlIHF1ZXVlIHN0YWxlIHZlcnkgcXVpY2tseS4gQnV0IGRyb3BwaW5nCisgICB0aGUgZnJhbWUgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIHByb3ZlZCB0byBiZSBhIGxpdHRlIGJpdCBtb3JlIGRpZmZpY3VsdC4KKyAgIEkgdHJpZWQgYSBjaXJjdWxhciBsaW5rZWQgc2NoZW1lLCBidXQgdGhpcyBpbnRyb2R1Y2VkIG1vcmUgcHJvYmxlbXMgdGhhbgorICAgaXQgc29sdmVkLgorCisgICBCZWNhdXNlIGZpbGxpbmcgYW5kIGRyYWluaW5nIGFyZSBjb21wbGV0ZWx5IGFzeW5jaHJvbm91cyBwcm9jZXNzZXMsIHRoaXMKKyAgIHJlcXVpcmVzIHNvbWUgZmlkZGxpbmcgd2l0aCBwb2ludGVycyBhbmQgbXV0ZXhlcy4KKworICAgRXZlbnR1YWxseSwgSSBjYW1lIHVwIHdpdGggYSBzeXN0ZW0gd2l0aCAyIGxpc3RzOiBhbiAnZW1wdHknIGZyYW1lIGxpc3QKKyAgIGFuZCBhICdmdWxsJyBmcmFtZSBsaXN0OgorICAgICAqIEluaXRpYWxseSwgYWxsIGZyYW1lIGJ1ZmZlcnMgYnV0IG9uZSBhcmUgb24gdGhlICdlbXB0eScgbGlzdDsgdGhlIG9uZQorICAgICAgIHJlbWFpbmluZyBidWZmZXIgaXMgb3VyIGluaXRpYWwgZmlsbCBmcmFtZS4KKyAgICAgKiBJZiBhIGZyYW1lIGlzIG5lZWRlZCBmb3IgZmlsbGluZywgd2UgdHJ5IHRvIHRha2UgaXQgZnJvbSB0aGUgJ2VtcHR5JyAKKyAgICAgICBsaXN0LCB1bmxlc3MgdGhhdCBsaXN0IGlzIGVtcHR5LCBpbiB3aGljaCBjYXNlIHdlIHRha2UgdGhlIGJ1ZmZlciBhdCAKKyAgICAgICB0aGUgaGVhZCBvZiB0aGUgJ2Z1bGwnIGxpc3QuCisgICAgICogV2hlbiBvdXIgZmlsbCBidWZmZXIgaGFzIGJlZW4gZmlsbGVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgJ2Z1bGwnCisgICAgICAgbGlzdC4KKyAgICAgKiBJZiBhIGZyYW1lIGlzIG5lZWRlZCBieSByZWFkKCkgb3IgbW1hcCgpLCBpdCBpcyB0YWtlbiBmcm9tIHRoZSBoZWFkIG9mCisgICAgICAgdGhlICdmdWxsJyBsaXN0LCBoYW5kbGVkLCBhbmQgdGhlbiBhcHBlbmRlZCB0byB0aGUgJ2VtcHR5JyBsaXN0LiBJZiBubworICAgICAgIGJ1ZmZlciBpcyBwcmVzZW50IG9uIHRoZSAnZnVsbCcgbGlzdCwgd2Ugd2FpdC4KKyAgIFRoZSBhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgYnVmZmVyIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGRlY29tcHJlc3NlZC8KKyAgIGNvbnZlcnRlZCwgaXMgb24gbmVpdGhlciBsaXN0LCBhbmQgdGh1cyBub3QgaW4gb3VyIHdheSAoYW55IG90aGVyIHNjaGVtZQorICAgSSB0cmllZCBoYWQgdGhlIHByb2JsZW0gb2Ygb2xkIGRhdGEgbGluZ2VyaW5nIGluIHRoZSBxdWV1ZSkuCisKKyAgIFdoYXRldmVyIHN0cmF0ZWd5IHlvdSBjaG9vc2UsIGl0IGFsd2F5cyByZW1haW5zIGEgdHJhZGVvZmY6IHdpdGggbW9yZQorICAgZnJhbWUgYnVmZmVycyB0aGUgY2hhbmNlcyBvZiBhIG1pc3NlZCBmcmFtZSBhcmUgcmVkdWNlZC4gT24gdGhlIG90aGVyCisgICBoYW5kLCBvbiBzbG93ZXIgbWFjaGluZXMgaXQgaW50cm9kdWNlcyBsYWcgYmVjYXVzZSB0aGUgcXVldWUgd2lsbAorICAgYWx3YXlzIGJlIGZ1bGwuCisgKi8KKworLyoqCisgIFxicmllZiBGaW5kIG5leHQgZnJhbWUgYnVmZmVyIHRvIGZpbGwuIFRha2UgZnJvbSBlbXB0eSBvciBmdWxsIGxpc3QsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcHdjX25leHRfZmlsbF9mcmFtZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZXQgPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7CisJaWYgKHBkZXYtPmZpbGxfZnJhbWUgIT0gTlVMTCkgeworCQkvKiBhcHBlbmQgdG8gJ2Z1bGwnIGxpc3QgKi8KKwkJaWYgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKKwkJCXBkZXYtPmZ1bGxfZnJhbWVzID0gcGRldi0+ZmlsbF9mcmFtZTsKKwkJCXBkZXYtPmZ1bGxfZnJhbWVzX3RhaWwgPSBwZGV2LT5mdWxsX2ZyYW1lczsKKwkJfQorCQllbHNlIHsKKwkJCXBkZXYtPmZ1bGxfZnJhbWVzX3RhaWwtPm5leHQgPSBwZGV2LT5maWxsX2ZyYW1lOworCQkJcGRldi0+ZnVsbF9mcmFtZXNfdGFpbCA9IHBkZXYtPmZpbGxfZnJhbWU7CisJCX0KKwl9CisJaWYgKHBkZXYtPmVtcHR5X2ZyYW1lcyAhPSBOVUxMKSB7CisJCS8qIFdlIGhhdmUgZW1wdHkgZnJhbWVzIGF2YWlsYWJsZS4gVGhhdCdzIGVhc3kgKi8KKwkJcGRldi0+ZmlsbF9mcmFtZSA9IHBkZXYtPmVtcHR5X2ZyYW1lczsKKwkJcGRldi0+ZW1wdHlfZnJhbWVzID0gcGRldi0+ZW1wdHlfZnJhbWVzLT5uZXh0OworCX0KKwllbHNlIHsKKwkJLyogSG1tLiBUYWtlIGl0IGZyb20gdGhlIGZ1bGwgbGlzdCAqLworI2lmIFBXQ19ERUJVRworCQkvKiBzYW5pdHkgY2hlY2sgKi8KKwkJaWYgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKKwkJCUVycigiTmVpdGhlciBlbXB0eSBvciBmdWxsIGZyYW1lcyBhdmFpbGFibGUhXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisjZW5kaWYKKwkJcGRldi0+ZmlsbF9mcmFtZSA9IHBkZXYtPmZ1bGxfZnJhbWVzOworCQlwZGV2LT5mdWxsX2ZyYW1lcyA9IHBkZXYtPmZ1bGxfZnJhbWVzLT5uZXh0OworCQlyZXQgPSAxOworCX0KKwlwZGV2LT5maWxsX2ZyYW1lLT5uZXh0ID0gTlVMTDsKKyNpZiBQV0NfREVCVUcKKwlUcmFjZShUUkFDRV9TRVFVRU5DRSwgIkFzc2lnbmluZyBzZXF1ZW5jZSBudW1iZXIgJWQuXG4iLCBwZGV2LT5zZXF1ZW5jZSk7CisJcGRldi0+ZmlsbF9mcmFtZS0+c2VxdWVuY2UgPSBwZGV2LT5zZXF1ZW5jZSsrOworI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgIFxicmllZiBSZXNldCBhbGwgYnVmZmVycywgcG9pbnRlcnMgYW5kIGxpc3RzLCBleGNlcHQgZm9yIHRoZSBpbWFnZV91c2VkW10gYnVmZmVyLgorCisgIElmIHRoZSBpbWFnZV91c2VkW10gYnVmZmVyIGlzIGNsZWFyZWQgdG9vLCBtbWFwKCkvVklESU9DU1lOQyB3aWxsIHJ1biBpbnRvIHRyb3VibGUuCisgKi8KK3N0YXRpYyB2b2lkIHB3Y19yZXNldF9idWZmZXJzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworCXBkZXYtPmZ1bGxfZnJhbWVzID0gTlVMTDsKKwlwZGV2LT5mdWxsX2ZyYW1lc190YWlsID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdF9mYnVmczsgaSsrKSB7CisJCXBkZXYtPmZidWZbaV0uZmlsbGVkID0gMDsKKwkJaWYgKGkgPiAwKQorCQkJcGRldi0+ZmJ1ZltpXS5uZXh0ID0gJnBkZXYtPmZidWZbaSAtIDFdOworCQllbHNlCisJCQlwZGV2LT5mYnVmLT5uZXh0ID0gTlVMTDsKKwl9CisJcGRldi0+ZW1wdHlfZnJhbWVzID0gJnBkZXYtPmZidWZbZGVmYXVsdF9mYnVmcyAtIDFdOworCXBkZXYtPmVtcHR5X2ZyYW1lc190YWlsID0gcGRldi0+ZmJ1ZjsKKwlwZGV2LT5yZWFkX2ZyYW1lID0gTlVMTDsKKwlwZGV2LT5maWxsX2ZyYW1lID0gcGRldi0+ZW1wdHlfZnJhbWVzOworCXBkZXYtPmVtcHR5X2ZyYW1lcyA9IHBkZXYtPmVtcHR5X2ZyYW1lcy0+bmV4dDsKKworCXBkZXYtPmltYWdlX3JlYWRfcG9zID0gMDsKKwlwZGV2LT5maWxsX2ltYWdlID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Cit9CisKKworLyoqCisgIFxicmllZiBEbyBhbGwgdGhlIGhhbmRsaW5nIGZvciBnZXR0aW5nIG9uZSBmcmFtZTogZ2V0IHBvaW50ZXIsIGRlY29tcHJlc3MsIGFkdmFuY2UgcG9pbnRlcnMuCisgKi8KK3N0YXRpYyBpbnQgcHdjX2hhbmRsZV9mcmFtZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKKwkvKiBGaXJzdCBncmFiIG91ciByZWFkX2ZyYW1lOyB0aGlzIGlzIHJlbW92ZWQgZnJvbSBhbGwgbGlzdHMsIHNvCisJICAgd2UgY2FuIHJlbGVhc2UgdGhlIGxvY2sgYWZ0ZXIgdGhpcyB3aXRob3V0IHByb2JsZW1zICovCisJaWYgKHBkZXYtPnJlYWRfZnJhbWUgIT0gTlVMTCkgeworCQkvKiBUaGlzIGNhbid0IHRoZW9yZXRpY2FsbHkgaGFwcGVuICovCisJCUVycigiSHVoPyBSZWFkIGZyYW1lIHN0aWxsIGluIHVzZT9cbiIpOworCX0KKwllbHNlIHsKKwkJaWYgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKKwkJCUVycigiV29vcHMuIE5vIGZyYW1lcyByZWFkeS5cbiIpOworCQl9CisJCWVsc2UgeworCQkJcGRldi0+cmVhZF9mcmFtZSA9IHBkZXYtPmZ1bGxfZnJhbWVzOworCQkJcGRldi0+ZnVsbF9mcmFtZXMgPSBwZGV2LT5mdWxsX2ZyYW1lcy0+bmV4dDsKKwkJCXBkZXYtPnJlYWRfZnJhbWUtPm5leHQgPSBOVUxMOworCQl9CisKKwkJaWYgKHBkZXYtPnJlYWRfZnJhbWUgIT0gTlVMTCkgeworI2lmIFBXQ19ERUJVRworCQkJVHJhY2UoVFJBQ0VfU0VRVUVOQ0UsICJEZWNvbXByZXNzaW5nIGZyYW1lICVkXG4iLCBwZGV2LT5yZWFkX2ZyYW1lLT5zZXF1ZW5jZSk7CisjZW5kaWYKKwkJCS8qIERlY29tcHJlc3Npb24gaXMgYSBsZW5naHR5IHByb2Nlc3MsIHNvIGl0J3Mgb3V0c2lkZSBvZiB0aGUgbG9jay4KKwkJCSAgIFRoaXMgZ2l2ZXMgdGhlIGlzb2NfaGFuZGxlciB0aGUgb3Bwb3J0dW5pdHkgdG8gZmlsbCBtb3JlIGZyYW1lcworCQkJICAgaW4gdGhlIG1lYW4gdGltZS4KKwkJCSovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7CisJCQlyZXQgPSBwd2NfZGVjb21wcmVzcyhwZGV2KTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7CisKKwkJCS8qIFdlJ3JlIGRvbmUgd2l0aCByZWFkX2J1ZmZlciwgdGFjayBpdCB0byB0aGUgZW5kIG9mIHRoZSBlbXB0eSBidWZmZXIgbGlzdCAqLworCQkJaWYgKHBkZXYtPmVtcHR5X2ZyYW1lcyA9PSBOVUxMKSB7CisJCQkJcGRldi0+ZW1wdHlfZnJhbWVzID0gcGRldi0+cmVhZF9mcmFtZTsKKwkJCQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbCA9IHBkZXYtPmVtcHR5X2ZyYW1lczsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBkZXYtPmVtcHR5X2ZyYW1lc190YWlsLT5uZXh0ID0gcGRldi0+cmVhZF9mcmFtZTsKKwkJCQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbCA9IHBkZXYtPnJlYWRfZnJhbWU7CisJCQl9CisJCQlwZGV2LT5yZWFkX2ZyYW1lID0gTlVMTDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgIFxicmllZiBBZHZhbmNlIHBvaW50ZXJzIG9mIGltYWdlIGJ1ZmZlciAoYWZ0ZXIgZWFjaCB1c2VyIHJlcXVlc3QpCisqLworc3RhdGljIGlubGluZSB2b2lkIHB3Y19uZXh0X2ltYWdlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCXBkZXYtPmltYWdlX3VzZWRbcGRldi0+ZmlsbF9pbWFnZV0gPSAwOworCXBkZXYtPmZpbGxfaW1hZ2UgPSAocGRldi0+ZmlsbF9pbWFnZSArIDEpICUgZGVmYXVsdF9tYnVmczsKK30KKworCisvKiBUaGlzIGdldHMgY2FsbGVkIGZvciB0aGUgSXNvY2hyb25vdXMgcGlwZSAodmlkZW8pLiBUaGlzIGlzIGRvbmUgaW4KKyAqIGludGVycnVwdCB0aW1lLCBzbyBpdCBoYXMgdG8gYmUgZmFzdCwgbm90IGNyYXNoLCBhbmQgbm90IHN0YWxsLiBOZWF0LgorICovCitzdGF0aWMgdm9pZCBwd2NfaXNvY19oYW5kbGVyKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7CisJaW50IGksIGZzdCwgZmxlbjsKKwlpbnQgYXdha2U7CisJc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWY7CisJdW5zaWduZWQgY2hhciAqZmlsbHB0ciA9IE5VTEwsICppc29fYnVmID0gTlVMTDsKKworCWF3YWtlID0gMDsKKwlwZGV2ID0gKHN0cnVjdCBwd2NfZGV2aWNlICopdXJiLT5jb250ZXh0OworCWlmIChwZGV2ID09IE5VTEwpIHsKKwkJRXJyKCJpc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBOVUxMIGRldmljZT8hXG4iKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBQV0NfTUFHSUMKKwlpZiAocGRldi0+bWFnaWMgIT0gUFdDX01BR0lDKSB7CisJCUVycigiaXNvY19oYW5kbGVyKCkgY2FsbGVkIHdpdGggYmFkIG1hZ2ljIVxuIik7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlpZiAodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkgeworCQlUcmFjZShUUkFDRV9PUEVOLCAicHdjX2lzb2NfaGFuZGxlcigpOiBVUkIgKCVwKSB1bmxpbmtlZCAlc3N5bmNocm9udW91c2x5LlxuIiwgdXJiLCB1cmItPnN0YXR1cyA9PSAtRU5PRU5UID8gIiIgOiAiYSIpOworCQlyZXR1cm47CisJfQorCWlmICh1cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MgJiYgdXJiLT5zdGF0dXMgIT0gMCkgeworCQljb25zdCBjaGFyICplcnJtc2c7CisKKwkJZXJybXNnID0gIlVua25vd24iOworCQlzd2l0Y2godXJiLT5zdGF0dXMpIHsKKwkJCWNhc2UgLUVOT1NSOgkJZXJybXNnID0gIkJ1ZmZlciBlcnJvciAob3ZlcnJ1bikiOyBicmVhazsKKwkJCWNhc2UgLUVQSVBFOgkJZXJybXNnID0gIlN0YWxsZWQgKGRldmljZSBub3QgcmVzcG9uZGluZykiOyBicmVhazsKKwkJCWNhc2UgLUVPVkVSRkxPVzoJZXJybXNnID0gIkJhYmJsZSAoYmFkIGNhYmxlPykiOyBicmVhazsKKwkJCWNhc2UgLUVQUk9UTzoJCWVycm1zZyA9ICJCaXQtc3R1ZmYgZXJyb3IgKGJhZCBjYWJsZT8pIjsgYnJlYWs7CisJCQljYXNlIC1FSUxTRVE6CQllcnJtc2cgPSAiQ1JDL1RpbWVvdXQgKGNvdWxkIGJlIGFueXRoaW5nKSI7IGJyZWFrOworCQkJY2FzZSAtRVRJTUVET1VUOgllcnJtc2cgPSAiTkFLIChkZXZpY2UgZG9lcyBub3QgcmVzcG9uZCkiOyBicmVhazsKKwkJfQorCQlUcmFjZShUUkFDRV9GTE9XLCAicHdjX2lzb2NfaGFuZGxlcigpIGNhbGxlZCB3aXRoIHN0YXR1cyAlZCBbJXNdLlxuIiwgdXJiLT5zdGF0dXMsIGVycm1zZyk7CisJCS8qIEdpdmUgdXAgYWZ0ZXIgYSBudW1iZXIgb2YgY29udGlndW91cyBlcnJvcnMgb24gdGhlIFVTQiBidXMuIAorCQkgICBBcHBlYXJhbnRseSBzb21ldGhpbmcgaXMgd3Jvbmcgc28gd2Ugc2ltdWxhdGUgYW4gdW5wbHVnIGV2ZW50LgorCQkgKi8KKwkJaWYgKCsrcGRldi0+dmlzb2NfZXJyb3JzID4gTUFYX0lTT0NfRVJST1JTKQorCQl7CisJCQlJbmZvKCJUb28gbWFueSBJU09DIGVycm9ycywgYmFpbGluZyBvdXQuXG4iKTsKKwkJCXBkZXYtPmVycm9yX3N0YXR1cyA9IEVJTzsKKwkJCWF3YWtlID0gMTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGRldi0+ZnJhbWVxKTsKKwkJfQorCQlnb3RvIGhhbmRsZXJfZW5kOyAvLyB1Z2x5LCBidXQgcHJhY3RpY2FsCisJfQorCisJZmJ1ZiA9IHBkZXYtPmZpbGxfZnJhbWU7CisJaWYgKGZidWYgPT0gTlVMTCkgeworCQlFcnIoInB3Y19pc29jX2hhbmRsZXIgd2l0aG91dCB2YWxpZCBmaWxsIGZyYW1lLlxuIik7CisJCWF3YWtlID0gMTsKKwkJZ290byBoYW5kbGVyX2VuZDsKKwl9CisJZWxzZSB7CisJCWZpbGxwdHIgPSBmYnVmLT5kYXRhICsgZmJ1Zi0+ZmlsbGVkOworCX0KKworCS8qIFJlc2V0IElTT0MgZXJyb3IgY291bnRlci4gV2UgZGlkIGdldCBoZXJlLCBhZnRlciBhbGwuICovCisJcGRldi0+dmlzb2NfZXJyb3JzID0gMDsKKworCS8qIHZzeW5jOiAwID0gZG9uJ3QgY29weSBkYXRhCisJICAgICAgICAgIDEgPSBzeW5jLWh1bnQKKwkgICAgICAgICAgMiA9IHN5bmNoZWQKKwkgKi8KKwkvKiBDb21wYWN0IGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJCWZzdCAgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKKwkJZmxlbiA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwkJaXNvX2J1ZiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQ7CisJCWlmIChmc3QgPT0gMCkgeworCQkJaWYgKGZsZW4gPiAwKSB7IC8qIGlmIHZhbGlkIGRhdGEuLi4gKi8KKwkJCQlpZiAocGRldi0+dnN5bmMgPiAwKSB7IC8qIC4uLmFuZCB3ZSBhcmUgbm90IHN5bmMtaHVudGluZy4uLiAqLworCQkJCQlwZGV2LT52c3luYyA9IDI7CisKKwkJCQkJLyogLi4uY29weSBkYXRhIHRvIGZyYW1lIGJ1ZmZlciwgaWYgcG9zc2libGUgKi8KKwkJCQkJaWYgKGZsZW4gKyBmYnVmLT5maWxsZWQgPiBwZGV2LT5mcmFtZV90b3RhbF9zaXplKSB7CisJCQkJCQlUcmFjZShUUkFDRV9GTE9XLCAiRnJhbWUgYnVmZmVyIG92ZXJmbG93IChmbGVuID0gJWQsIGZyYW1lX3RvdGFsX3NpemUgPSAlZCkuXG4iLCBmbGVuLCBwZGV2LT5mcmFtZV90b3RhbF9zaXplKTsKKwkJCQkJCXBkZXYtPnZzeW5jID0gMDsgLyogSG1tLCBsZXQncyB3YWl0IGZvciBhbiBFT0YgKGVuZC1vZi1mcmFtZSkgKi8KKwkJCQkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCW1lbW1vdmUoZmlsbHB0ciwgaXNvX2J1ZiwgZmxlbik7CisJCQkJCQlmaWxscHRyICs9IGZsZW47CisJCQkJCX0KKwkJCQl9CisJCQkJZmJ1Zi0+ZmlsbGVkICs9IGZsZW47CisJCQl9IC8qIC4uZmxlbiA+IDAgKi8KKworCQkJaWYgKGZsZW4gPCBwZGV2LT52bGFzdF9wYWNrZXRfc2l6ZSkgeworCQkJCS8qIFNob3J0ZXIgcGFja2V0Li4uIFdlIHByb2JhYmx5IGhhdmUgdGhlIGVuZCBvZiBhbiBpbWFnZS1mcmFtZTsgCisJCQkJICAgd2FrZSB1cCByZWFkKCkgcHJvY2VzcyBhbmQgbGV0IHNlbGVjdCgpL3BvbGwoKSBkbyBzb21ldGhpbmcuCisJCQkJICAgRGVjb21wcmVzc2lvbiBpcyBkb25lIGluIHVzZXIgdGltZSBvdmVyIHRoZXJlLgorCQkJCSAqLworCQkJCWlmIChwZGV2LT52c3luYyA9PSAyKSB7CisJCQkJCS8qIFRoZSBUb1VDYW0gRnVuIENNT1Mgc2Vuc29yIGNhdXNlcyB0aGUgZmlybXdhcmUgdG8gc2VuZCAyIG9yIDMgYm9ndXMgCisJCQkJCSAgIGZyYW1lcyBvbiB0aGUgVVNCIHdpcmUgYWZ0ZXIgYW4gZXhwb3N1cmUgY2hhbmdlLiBUaGlzIGNvbmRpdGl0aW9uIGlzIAorCQkJCQkgICBob3dldmVyIGRldGVjdGVkICBpbiB0aGUgY2FtIGFuZCBhIGJpdCBpcyBzZXQgaW4gdGhlIGhlYWRlci4KKwkJCQkJICovCisJCQkJCWlmIChwZGV2LT50eXBlID09IDczMCkgeworCQkJCQkJdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKilmYnVmLT5kYXRhOworCQkJCQkJCisJCQkJCQlpZiAocHRyWzFdID09IDEgJiYgcHRyWzBdICYgMHgxMCkgeworI2lmIFBXQ19ERUJVRworCQkJCQkJCURlYnVnKCJIeXVuZGFpIENNT1Mgc2Vuc29yIGJ1Zy4gRHJvcHBpbmcgZnJhbWUgJWQuXG4iLCBmYnVmLT5zZXF1ZW5jZSk7CisjZW5kaWYKKwkJCQkJCQlwZGV2LT5kcm9wX2ZyYW1lcyArPSAyOworCQkJCQkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKKwkJCQkJCX0KKwkJCQkJCWlmICgocHRyWzBdIF4gcGRldi0+dm1pcnJvcikgJiAweDAxKSB7CisJCQkJCQkJaWYgKHB0clswXSAmIDB4MDEpCisJCQkJCQkJCUluZm8oIlNuYXBzaG90IGJ1dHRvbiBwcmVzc2VkLlxuIik7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlJbmZvKCJTbmFwc2hvdCBidXR0b24gcmVsZWFzZWQuXG4iKTsKKwkJCQkJCX0KKwkJCQkJCWlmICgocHRyWzBdIF4gcGRldi0+dm1pcnJvcikgJiAweDAyKSB7CisJCQkJCQkJaWYgKHB0clswXSAmIDB4MDIpCisJCQkJCQkJCUluZm8oIkltYWdlIGlzIG1pcnJvcmVkLlxuIik7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlJbmZvKCJJbWFnZSBpcyBub3JtYWwuXG4iKTsKKwkJCQkJCX0KKwkJCQkJCXBkZXYtPnZtaXJyb3IgPSBwdHJbMF0gJiAweDAzOworCQkJCQkJLyogU29tZXRpbWVzIHRoZSB0cmFpbGVyIG9mIHRoZSA3MzAgaXMgc3RpbGwgc2VudCBhcyBhIDQgYnl0ZSBwYWNrZXQgCisJCQkJCQkgICBhZnRlciBhIHNob3J0IGZyYW1lOyB0aGlzIGNvbmRpdGlvbiBpcyBmaWx0ZXJlZCBvdXQgc3BlY2lmaWNhbGx5LiBBIDQgYnl0ZQorCQkJCQkJICAgZnJhbWUgZG9lc24ndCBtYWtlIHNlbnNlIGFueXdheS4KKwkJCQkJCSAgIFNvIHdlIGdldCBlaXRoZXIgdGhpcyBzZXF1ZW5jZTogCisJCQkJCQkgICAJZHJvcF9iaXQgc2V0IC0+IDQgYnl0ZSBmcmFtZSAtPiBzaG9ydCBmcmFtZSAtPiBnb29kIGZyYW1lCisJCQkJCQkgICBPciB0aGlzIG9uZToKKwkJCQkJCSAgIAlkcm9wX2JpdCBzZXQgLT4gc2hvcnQgZnJhbWUgLT4gZ29vZCBmcmFtZQorCQkJCQkJICAgU28gd2UgZHJvcCBlaXRoZXIgMyBvciAyIGZyYW1lcyBpbiBhbGwhCisJCQkJCQkgKi8KKwkJCQkJCWlmIChmYnVmLT5maWxsZWQgPT0gNCkKKwkJCQkJCQlwZGV2LT5kcm9wX2ZyYW1lcysrOworCQkJCQl9CisKKwkJCQkJLyogSW4gY2FzZSB3ZSB3ZXJlIGluc3RydWN0ZWQgdG8gZHJvcCB0aGUgZnJhbWUsIGRvIHNvIHNpbGVudGx5LgorCQkJCQkgICBUaGUgYnVmZmVyIHBvaW50ZXJzIGFyZSBub3QgdXBkYXRlZCBlaXRoZXIgKGJ1dCB0aGUgY291bnRlcnMgYXJlIHJlc2V0IGJlbG93KS4KKwkJCQkJICovCisJCQkJCWlmIChwZGV2LT5kcm9wX2ZyYW1lcyA+IDApCisJCQkJCQlwZGV2LT5kcm9wX2ZyYW1lcy0tOworCQkJCQllbHNlIHsKKwkJCQkJCS8qIENoZWNrIGZvciB1bmRlcmZsb3cgZmlyc3QgKi8KKwkJCQkJCWlmIChmYnVmLT5maWxsZWQgPCBwZGV2LT5mcmFtZV90b3RhbF9zaXplKSB7CisJCQkJCQkJVHJhY2UoVFJBQ0VfRkxPVywgIkZyYW1lIGJ1ZmZlciB1bmRlcmZsb3cgKCVkIGJ5dGVzKTsgZGlzY2FyZGVkLlxuIiwgZmJ1Zi0+ZmlsbGVkKTsKKwkJCQkJCQlwZGV2LT52ZnJhbWVzX2Vycm9yKys7CisJCQkJCQl9CisJCQkJCQllbHNlIHsKKwkJCQkJCQkvKiBTZW5kIG9ubHkgb25jZSBwZXIgRU9GICovCisJCQkJCQkJYXdha2UgPSAxOyAvKiBkZWxheSB3YWtlX3VwcyAqLworCisJCQkJCQkJLyogRmluZCBvdXIgbmV4dCBmcmFtZSB0byBmaWxsLiBUaGlzIHdpbGwgYWx3YXlzIHN1Y2NlZWQsIHNpbmNlIHdlCisJCQkJCQkJICogbmljayBhIGZyYW1lIGZyb20gZWl0aGVyIGVtcHR5IG9yIGZ1bGwgbGlzdCwgYnV0IGlmIHdlIGhhZCB0bworCQkJCQkJCSAqIHRha2UgaXQgZnJvbSB0aGUgZnVsbCBsaXN0LCBpdCBtZWFucyBhIGZyYW1lIGdvdCBkcm9wcGVkLgorCQkJCQkJCSAqLworCQkJCQkJCWlmIChwd2NfbmV4dF9maWxsX2ZyYW1lKHBkZXYpKSB7CisJCQkJCQkJCXBkZXYtPnZmcmFtZXNfZHVtcGVkKys7CisJCQkJCQkJCWlmICgocGRldi0+dmZyYW1lX2NvdW50ID4gRlJBTUVfTE9XTUFSSykgJiYgKHB3Y190cmFjZSAmIFRSQUNFX0ZMT1cpKSB7CisJCQkJCQkJCQlpZiAocGRldi0+dmZyYW1lc19kdW1wZWQgPCAyMCkKKwkJCQkJCQkJCQlUcmFjZShUUkFDRV9GTE9XLCAiRHVtcGluZyBmcmFtZSAlZC5cbiIsIHBkZXYtPnZmcmFtZV9jb3VudCk7CisJCQkJCQkJCQlpZiAocGRldi0+dmZyYW1lc19kdW1wZWQgPT0gMjApCisJCQkJCQkJCQkJVHJhY2UoVFJBQ0VfRkxPVywgIkR1bXBpbmcgZnJhbWUgJWQgKGxhc3QgbWVzc2FnZSkuXG4iLCBwZGV2LT52ZnJhbWVfY291bnQpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWZidWYgPSBwZGV2LT5maWxsX2ZyYW1lOworCQkJCQkJfQorCQkJCQl9IC8qICFkcm9wX2ZyYW1lcyAqLworCQkJCQlwZGV2LT52ZnJhbWVfY291bnQrKzsKKwkJCQl9CisJCQkJZmJ1Zi0+ZmlsbGVkID0gMDsKKwkJCQlmaWxscHRyID0gZmJ1Zi0+ZGF0YTsKKwkJCQlwZGV2LT52c3luYyA9IDE7CisJCQl9IC8qIC4uIGZsZW4gPCBsYXN0X3BhY2tldF9zaXplICovCisJCQlwZGV2LT52bGFzdF9wYWNrZXRfc2l6ZSA9IGZsZW47CisJCX0gLyogLi5zdGF0dXMgPT0gMCAqLworI2lmIFBXQ19ERUJVRworCQkvKiBUaGlzIGlzIG5vcm1hbGx5IG5vdCBpbnRlcmVzdGluZyB0byB0aGUgdXNlciwgdW5sZXNzIHlvdSBhcmUgcmVhbGx5IGRlYnVnZ2luZyBzb21ldGhpbmcgKi8KKwkJZWxzZSB7CisJCQlzdGF0aWMgaW50IGlzb19lcnJvciA9IDA7CisJCQlpc29fZXJyb3IrKzsKKwkJCWlmIChpc29fZXJyb3IgPCAyMCkKKwkJCQlUcmFjZShUUkFDRV9GTE9XLCAiSXNvIGZyYW1lICVkIG9mIFVTQiBoYXMgZXJyb3IgJWRcbiIsIGksIGZzdCk7CisJCX0KKyNlbmRpZgorCX0KKworaGFuZGxlcl9lbmQ6CisJaWYgKGF3YWtlKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBkZXYtPmZyYW1lcSk7CisKKwl1cmItPmRldiA9IHBkZXYtPnVkZXY7CisJaSA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKGkgIT0gMCkKKwkJRXJyKCJFcnJvciAoJWQpIHJlLXN1Ym1pdHRpbmcgdXJiIGluIHB3Y19pc29jX2hhbmRsZXIuXG4iLCBpKTsKK30KKworCitzdGF0aWMgaW50IHB3Y19pc29jX2luaXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IHVyYiAqdXJiOworCWludCBpLCBqLCByZXQ7CisKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZGVzYyA9IE5VTEw7CisKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocGRldi0+aXNvX2luaXQpCisJCXJldHVybiAwOworCXBkZXYtPnZzeW5jID0gMDsKKwl1ZGV2ID0gcGRldi0+dWRldjsKKworCS8qIEdldCB0aGUgY3VycmVudCBhbHRlcm5hdGUgaW50ZXJmYWNlLCBhZGp1c3QgcGFja2V0IHNpemUgKi8KKwlpZiAoIXVkZXYtPmFjdGNvbmZpZykKKwkJcmV0dXJuIC1FRkFVTFQ7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDUpCisJaWRlc2MgPSAmdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbMF0tPmFsdHNldHRpbmdbcGRldi0+dmFsdGVybmF0ZV07CisjZWxzZQorCWludGYgPSB1c2JfaWZudW1fdG9faWYodWRldiwgMCk7CisJaWYgKGludGYpCisJCWlkZXNjID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsIHBkZXYtPnZhbHRlcm5hdGUpOworI2VuZGlmCisJCQorCWlmICghaWRlc2MpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogU2VhcmNoIHZpZGVvIGVuZHBvaW50ICovCisJcGRldi0+dm1heF9wYWNrZXRfc2l6ZSA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBpZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspCisJCWlmICgoaWRlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmIDB4RikgPT0gcGRldi0+dmVuZHBvaW50KSB7CisJCQlwZGV2LT52bWF4X3BhY2tldF9zaXplID0gbGUxNl90b19jcHUoaWRlc2MtPmVuZHBvaW50W2ldLmRlc2Mud01heFBhY2tldFNpemUpOworCQkJYnJlYWs7CisJCX0KKwkKKwlpZiAocGRldi0+dm1heF9wYWNrZXRfc2l6ZSA8IDAgfHwgcGRldi0+dm1heF9wYWNrZXRfc2l6ZSA+IElTT19NQVhfRlJBTUVfU0laRSkgeworCQlFcnIoIkZhaWxlZCB0byBmaW5kIHBhY2tldCBzaXplIGZvciB2aWRlbyBlbmRwb2ludCBpbiBjdXJyZW50IGFsdGVybmF0ZSBzZXR0aW5nLlxuIik7CisJCXJldHVybiAtRU5GSUxFOyAvKiBPZGQgZXJyb3IsIHRoYXQgc2hvdWxkIGJlIG5vdGljYWJsZSAqLworCX0KKworCS8qIFNldCBhbHRlcm5hdGUgaW50ZXJmYWNlICovCisJcmV0ID0gMDsKKwlUcmFjZShUUkFDRV9PUEVOLCAiU2V0dGluZyBhbHRlcm5hdGUgaW50ZXJmYWNlICVkXG4iLCBwZGV2LT52YWx0ZXJuYXRlKTsKKwlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZShwZGV2LT51ZGV2LCAwLCBwZGV2LT52YWx0ZXJuYXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgeworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKElTT19GUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOworCQlpZiAodXJiID09IE5VTEwpIHsKKwkJCUVycigiRmFpbGVkIHRvIGFsbG9jYXRlIHVyYiAlZFxuIiwgaSk7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJcGRldi0+c2J1ZltpXS51cmIgPSB1cmI7CisJCVRyYWNlKFRSQUNFX01FTU9SWSwgIkFsbG9jYXRlZCBVUkIgYXQgMHglcFxuIiwgdXJiKTsKKwl9CisJaWYgKHJldCkgeworCQkvKiBEZS1hbGxvY2F0ZSBpbiByZXZlcnNlIG9yZGVyICovCisJCXdoaWxlIChpID49IDApIHsKKwkJCWlmIChwZGV2LT5zYnVmW2ldLnVyYiAhPSBOVUxMKQorCQkJCXVzYl9mcmVlX3VyYihwZGV2LT5zYnVmW2ldLnVyYik7CisJCQlwZGV2LT5zYnVmW2ldLnVyYiA9IE5VTEw7CisJCQlpLS07CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBpbml0IFVSQiBzdHJ1Y3R1cmUgKi8JCisJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7CisJCXVyYiA9IHBkZXYtPnNidWZbaV0udXJiOworCisJCXVyYi0+aW50ZXJ2YWwgPSAxOyAvLyBkZXZpaworCQl1cmItPmRldiA9IHVkZXY7CisJICAgICAgICB1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUodWRldiwgcGRldi0+dmVuZHBvaW50KTsKKwkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkgICAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyID0gcGRldi0+c2J1ZltpXS5kYXRhOworCSAgICAgICAgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gSVNPX0JVRkZFUl9TSVpFOworCSAgICAgICAgdXJiLT5jb21wbGV0ZSA9IHB3Y19pc29jX2hhbmRsZXI7CisJICAgICAgICB1cmItPmNvbnRleHQgPSBwZGV2OworCQl1cmItPnN0YXJ0X2ZyYW1lID0gMDsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IElTT19GUkFNRVNfUEVSX0RFU0M7CisJCWZvciAoaiA9IDA7IGogPCBJU09fRlJBTUVTX1BFUl9ERVNDOyBqKyspIHsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gaiAqIElTT19NQVhfRlJBTUVfU0laRTsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gcGRldi0+dm1heF9wYWNrZXRfc2l6ZTsKKwkJfQorCX0KKworCS8qIGxpbmsgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIocGRldi0+c2J1ZltpXS51cmIsIEdGUF9LRVJORUwpOworCQlpZiAocmV0KQorCQkJRXJyKCJpc29jX2luaXQoKSBzdWJtaXRfdXJiICVkIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBpLCByZXQpOworCQllbHNlCisJCQlUcmFjZShUUkFDRV9NRU1PUlksICJVUkIgMHglcCBzdWJtaXR0ZWQuXG4iLCBwZGV2LT5zYnVmW2ldLnVyYik7CisJfQorCisJLyogQWxsIGlzIGRvbmUuLi4gKi8KKwlwZGV2LT5pc29faW5pdCA9IDE7CisJVHJhY2UoVFJBQ0VfT1BFTiwgIjw8IHB3Y19pc29jX2luaXQoKVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB3Y19pc29jX2NsZWFudXAoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJaW50IGk7CisKKwlUcmFjZShUUkFDRV9PUEVOLCAiPj4gcHdjX2lzb2NfY2xlYW51cCgpXG4iKTsKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBVbmxpbmtpbmcgSVNPQyBidWZmZXJzIG9uZSBieSBvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKKwkJc3RydWN0IHVyYiAqdXJiOworCisJCXVyYiA9IHBkZXYtPnNidWZbaV0udXJiOworCQlpZiAodXJiICE9IDApIHsKKwkJCWlmIChwZGV2LT5pc29faW5pdCkgeworCQkJCVRyYWNlKFRSQUNFX01FTU9SWSwgIlVubGlua2luZyBVUkIgJXBcbiIsIHVyYik7CisJCQkJdXNiX2tpbGxfdXJiKHVyYik7CisJCQl9CisJCQlUcmFjZShUUkFDRV9NRU1PUlksICJGcmVlaW5nIFVSQlxuIik7CisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCXBkZXYtPnNidWZbaV0udXJiID0gTlVMTDsKKwkJfQorCX0KKworCS8qIFN0b3AgY2FtZXJhLCBidXQgb25seSBpZiB3ZSBhcmUgc3VyZSB0aGUgY2FtZXJhIGlzIHN0aWxsIHRoZXJlICh1bnBsdWcKKwkgICBpcyBzaWduYWxsZWQgYnkgRVBJUEUpIAorCSAqLworCWlmIChwZGV2LT5lcnJvcl9zdGF0dXMgJiYgcGRldi0+ZXJyb3Jfc3RhdHVzICE9IEVQSVBFKSB7CisJCVRyYWNlKFRSQUNFX09QRU4sICJTZXR0aW5nIGFsdGVybmF0ZSBpbnRlcmZhY2UgMC5cbiIpOworCQl1c2Jfc2V0X2ludGVyZmFjZShwZGV2LT51ZGV2LCAwLCAwKTsKKwl9CisKKwlwZGV2LT5pc29faW5pdCA9IDA7CisJVHJhY2UoVFJBQ0VfT1BFTiwgIjw8IHB3Y19pc29jX2NsZWFudXAoKVxuIik7Cit9CisKK2ludCBwd2NfdHJ5X3ZpZGVvX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5ld19mcHMsIGludCBuZXdfY29tcHJlc3Npb24sIGludCBuZXdfc25hcHNob3QpCit7CisJaW50IHJldCwgc3RhcnQ7CisKKwkvKiBTdG9wIGlzb2Mgc3R1ZmYgKi8KKwlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOworCS8qIFJlc2V0IHBhcmFtZXRlcnMgKi8KKwlwd2NfcmVzZXRfYnVmZmVycyhwZGV2KTsKKwkvKiBUcnkgdG8gc2V0IHZpZGVvIG1vZGUuLi4gKi8KKwlzdGFydCA9IHJldCA9IHB3Y19zZXRfdmlkZW9fbW9kZShwZGV2LCB3aWR0aCwgaGVpZ2h0LCBuZXdfZnBzLCBuZXdfY29tcHJlc3Npb24sIG5ld19zbmFwc2hvdCk7CisJaWYgKHJldCkgeyAKKwkgICAgICAgIFRyYWNlKFRSQUNFX0ZMT1csICJwd2Nfc2V0X3ZpZGVvX21vZGUgYXR0ZW1wdCAxIGZhaWxlZC5cbiIpOworCQkvKiBUaGF0IGZhaWxlZC4uLiByZXN0b3JlIG9sZCBtb2RlICh3ZSBrbm93IHRoYXQgd29ya2VkKSAqLworCQlzdGFydCA9IHB3Y19zZXRfdmlkZW9fbW9kZShwZGV2LCBwZGV2LT52aWV3LngsIHBkZXYtPnZpZXcueSwgcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLCBwZGV2LT52c25hcHNob3QpOworCQlpZiAoc3RhcnQpIHsKKwkJICAgICAgICBUcmFjZShUUkFDRV9GTE9XLCAicHdjX3NldF92aWRlb19tb2RlIGF0dGVtcHQgMiBmYWlsZWQuXG4iKTsKKwkJfQorCX0KKwlpZiAoc3RhcnQgPT0gMCkKKwl7CisJCWlmIChwd2NfaXNvY19pbml0KHBkZXYpIDwgMCkKKwkJeworCQkJSW5mbygiRmFpbGVkIHRvIHJlc3RhcnQgSVNPQyB0cmFuc2ZlcnMgaW4gcHdjX3RyeV92aWRlb19tb2RlLlxuIik7CisJCQlyZXQgPSAtRUFHQUlOOyAvKiBsZXQncyB0cnkgYWdhaW4sIHdobyBrbm93cyBpZiBpdCB3b3JrcyBhIHNlY29uZCB0aW1lICovCisJCX0KKwl9CisJcGRldi0+ZHJvcF9mcmFtZXMrKzsgLyogdHJ5IHRvIGF2b2lkIGdhcmJhZ2UgZHVyaW5nIHN3aXRjaCAqLworCXJldHVybiByZXQ7IC8qIFJldHVybiBvcmlnaW5hbCBlcnJvciBjb2RlICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFZpZGVvNExpbnV4IGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IHB3Y192aWRlb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OworCisJVHJhY2UoVFJBQ0VfT1BFTiwgIj4+IHZpZGVvX29wZW4gY2FsbGVkKHZkZXYgPSAweCVwKS5cbiIsIHZkZXYpOworCQorCXBkZXYgPSAoc3RydWN0IHB3Y19kZXZpY2UgKil2ZGV2LT5wcml2OworCWlmIChwZGV2ID09IE5VTEwpCisJCUJVRygpOworCWlmIChwZGV2LT52b3BlbikKKwkJcmV0dXJuIC1FQlVTWTsKKwkKKwlkb3duKCZwZGV2LT5tb2Rsb2NrKTsKKwlpZiAoIXBkZXYtPnVzYl9pbml0KSB7CisJCVRyYWNlKFRSQUNFX09QRU4sICJEb2luZyBmaXJzdCB0aW1lIGluaXRpYWxpemF0aW9uLlxuIik7CisJCXBkZXYtPnVzYl9pbml0ID0gMTsKKwkJCisJCWlmIChwd2NfdHJhY2UgJiBUUkFDRV9PUEVOKQorCQl7CisJCQkvKiBRdWVyeSBzZW5zb3IgdHlwZSAqLworCQkJY29uc3QgY2hhciAqc2Vuc29yX3R5cGUgPSBOVUxMOworCQkJaW50IHJldDsKKworCQkJcmV0ID0gcHdjX2dldF9jbW9zX3NlbnNvcihwZGV2LCAmaSk7CisJCQlpZiAocmV0ID49IDApCisJCQl7CisJCQkJc3dpdGNoKGkpIHsKKwkJCQljYXNlIDB4MDA6ICBzZW5zb3JfdHlwZSA9ICJIeXVuZGFpIENNT1Mgc2Vuc29yIjsgYnJlYWs7CisJCQkJY2FzZSAweDIwOiAgc2Vuc29yX3R5cGUgPSAiU29ueSBDQ0Qgc2Vuc29yICsgVERBODc4NyI7IGJyZWFrOworCQkJCWNhc2UgMHgyRTogIHNlbnNvcl90eXBlID0gIlNvbnkgQ0NEIHNlbnNvciArIEV4YXMgOThMNTkiOyBicmVhazsKKwkJCQljYXNlIDB4MkY6ICBzZW5zb3JfdHlwZSA9ICJTb255IENDRCBzZW5zb3IgKyBBREkgOTgwNCI7IGJyZWFrOworCQkJCWNhc2UgMHgzMDogIHNlbnNvcl90eXBlID0gIlNoYXJwIENDRCBzZW5zb3IgKyBUREE4Nzg3IjsgYnJlYWs7CisJCQkJY2FzZSAweDNFOiAgc2Vuc29yX3R5cGUgPSAiU2hhcnAgQ0NEIHNlbnNvciArIEV4YXMgOThMNTkiOyBicmVhazsKKwkJCQljYXNlIDB4M0Y6ICBzZW5zb3JfdHlwZSA9ICJTaGFycCBDQ0Qgc2Vuc29yICsgQURJIDk4MDQiOyBicmVhazsKKwkJCQljYXNlIDB4NDA6ICBzZW5zb3JfdHlwZSA9ICJVUEEgMTAyMSBzZW5zb3IiOyBicmVhazsKKwkJCQljYXNlIDB4MTAwOiBzZW5zb3JfdHlwZSA9ICJWR0Egc2Vuc29yIjsgYnJlYWs7CisJCQkJY2FzZSAweDEwMTogc2Vuc29yX3R5cGUgPSAiUEFMIE1SIHNlbnNvciI7IGJyZWFrOworCQkJCWRlZmF1bHQ6ICAgIHNlbnNvcl90eXBlID0gInVua25vd24gdHlwZSBvZiBzZW5zb3IiOyBicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoc2Vuc29yX3R5cGUgIT0gTlVMTCkKKwkJCQlJbmZvKCJUaGlzICVzIGNhbWVyYSBpcyBlcXVpcHBlZCB3aXRoIGEgJXMgKCVkKS5cbiIsIHBkZXYtPnZkZXYtPm5hbWUsIHNlbnNvcl90eXBlLCBpKTsKKwkJfQorCX0KKworCS8qIFR1cm4gb24gY2FtZXJhICovCisJaWYgKHBvd2VyX3NhdmUpIHsKKwkJaSA9IHB3Y19jYW1lcmFfcG93ZXIocGRldiwgMSk7CisJCWlmIChpIDwgMCkKKwkJCUluZm8oIkZhaWxlZCB0byByZXN0b3JlIHBvd2VyIHRvIHRoZSBjYW1lcmEhICglZClcbiIsIGkpOworCX0KKwkvKiBTZXQgTEVEIG9uL29mZiB0aW1lICovCisJaWYgKHB3Y19zZXRfbGVkcyhwZGV2LCBsZWRfb24sIGxlZF9vZmYpIDwgMCkKKwkJSW5mbygiRmFpbGVkIHRvIHNldCBMRUQgb24vb2ZmIHRpbWUuXG4iKTsKKwkKKwlwd2NfY29uc3RydWN0KHBkZXYpOyAvKiBzZXQgbWluL21heCBzaXplcyBjb3JyZWN0ICovCisKKwkvKiBTbyBmYXIsIHNvIGdvb2QuIEFsbG9jYXRlIG1lbW9yeS4gKi8KKwlpID0gcHdjX2FsbG9jYXRlX2J1ZmZlcnMocGRldik7CisJaWYgKGkgPCAwKSB7CisJCVRyYWNlKFRSQUNFX09QRU4sICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIG1lbW9yeS5cbiIpOworCQl1cCgmcGRldi0+bW9kbG9jayk7CisJCXJldHVybiBpOworCX0KKwkKKwkvKiBSZXNldCBidWZmZXJzICYgcGFyYW1ldGVycyAqLworCXB3Y19yZXNldF9idWZmZXJzKHBkZXYpOworCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X21idWZzOyBpKyspCisJCXBkZXYtPmltYWdlX3VzZWRbaV0gPSAwOworCXBkZXYtPnZmcmFtZV9jb3VudCA9IDA7CisJcGRldi0+dmZyYW1lc19kdW1wZWQgPSAwOworCXBkZXYtPnZmcmFtZXNfZXJyb3IgPSAwOworCXBkZXYtPnZpc29jX2Vycm9ycyA9IDA7CisJcGRldi0+ZXJyb3Jfc3RhdHVzID0gMDsKKyNpZiBQV0NfREVCVUcKKwlwZGV2LT5zZXF1ZW5jZSA9IDA7CisjZW5kaWYKKwlwd2NfY29uc3RydWN0KHBkZXYpOyAvKiBzZXQgbWluL21heCBzaXplcyBjb3JyZWN0ICovCisKKwkvKiBTZXQgc29tZSBkZWZhdWx0cyAqLworCXBkZXYtPnZzbmFwc2hvdCA9IDA7CisKKwkvKiBTdGFydCBpc28gcGlwZSBmb3IgdmlkZW87IGZpcnN0IHRyeSB0aGUgbGFzdCB1c2VkIHZpZGVvIHNpemUKKwkgICAob3IgdGhlIGRlZmF1bHQgb25lKTsgaWYgdGhhdCBmYWlscyB0cnkgUUNJRi8xMCBvciBRU0lGLzEwOworCSAgIGl0IHRoYXQgZmFpbHMgdG9vLCBnaXZlIHVwLgorCSAqLworCWkgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcHdjX2ltYWdlX3NpemVzW3BkZXYtPnZzaXplXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbcGRldi0+dnNpemVdLnksIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgMCk7CisJaWYgKGkpCXsKKwkJVHJhY2UoVFJBQ0VfT1BFTiwgIkZpcnN0IGF0dGVtcHQgYXQgc2V0X3ZpZGVvX21vZGUgZmFpbGVkLlxuIik7CisJCWlmIChwZGV2LT50eXBlID09IDczMCB8fCBwZGV2LT50eXBlID09IDc0MCB8fCBwZGV2LT50eXBlID09IDc1MCkKKwkJCWkgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcHdjX2ltYWdlX3NpemVzW1BTWl9RU0lGXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX1FTSUZdLnksIDEwLCBwZGV2LT52Y29tcHJlc3Npb24sIDApOworCQllbHNlCisJCQlpID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsIHB3Y19pbWFnZV9zaXplc1tQU1pfUUNJRl0ueCwgcHdjX2ltYWdlX3NpemVzW1BTWl9RQ0lGXS55LCAxMCwgcGRldi0+dmNvbXByZXNzaW9uLCAwKTsKKwl9CisJaWYgKGkpIHsKKwkJVHJhY2UoVFJBQ0VfT1BFTiwgIlNlY29uZCBhdHRlbXB0IGF0IHNldF92aWRlb19tb2RlIGZhaWxlZC5cbiIpOworCQl1cCgmcGRldi0+bW9kbG9jayk7CisJCXJldHVybiBpOworCX0KKwkKKwlpID0gcHdjX2lzb2NfaW5pdChwZGV2KTsKKwlpZiAoaSkgeworCQlUcmFjZShUUkFDRV9PUEVOLCAiRmFpbGVkIHRvIGluaXQgSVNPQyBzdHVmZiA9ICVkLlxuIiwgaSk7CisJCXVwKCZwZGV2LT5tb2Rsb2NrKTsKKwkJcmV0dXJuIGk7CisJfQorCisJcGRldi0+dm9wZW4rKzsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSB2ZGV2OworCXVwKCZwZGV2LT5tb2Rsb2NrKTsKKwlUcmFjZShUUkFDRV9PUEVOLCAiPDwgdmlkZW9fb3BlbigpIHJldHVybnMgMC5cbiIpOworCXJldHVybiAwOworfQorCisvKiBOb3RlIHRoYXQgYWxsIGNsZWFudXAgaXMgZG9uZSBpbiB0aGUgcmV2ZXJzZSBvcmRlciBhcyBpbiBfb3BlbiAqLworc3RhdGljIGludCBwd2NfdmlkZW9fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKKwlpbnQgaTsKKworCVRyYWNlKFRSQUNFX09QRU4sICI+PiB2aWRlb19jbG9zZSBjYWxsZWQodmRldiA9IDB4JXApLlxuIiwgdmRldik7CisKKwlwZGV2ID0gKHN0cnVjdCBwd2NfZGV2aWNlICopdmRldi0+cHJpdjsKKwlpZiAocGRldi0+dm9wZW4gPT0gMCkKKwkJSW5mbygidmlkZW9fY2xvc2UoKSBjYWxsZWQgb24gY2xvc2VkIGRldmljZT9cbiIpOworCisJLyogRHVtcCBzdGF0aXN0aWNzLCBidXQgb25seSBpZiBhIHJlYXNvbmFibGUgYW1vdW50IG9mIGZyYW1lcyB3ZXJlCisJICAgcHJvY2Vzc2VkICh0byBwcmV2ZW50IGVuZGxlc3MgbG9nLWVudHJpZXMgaW4gY2FzZSBvZiBzbmFwLXNob3QKKwkgICBwcm9ncmFtcykKKwkgKi8KKwlpZiAocGRldi0+dmZyYW1lX2NvdW50ID4gMjApCisJCUluZm8oIkNsb3NpbmcgdmlkZW8gZGV2aWNlOiAlZCBmcmFtZXMgcmVjZWl2ZWQsIGR1bXBlZCAlZCBmcmFtZXMsICVkIGZyYW1lcyB3aXRoIGVycm9ycy5cbiIsIHBkZXYtPnZmcmFtZV9jb3VudCwgcGRldi0+dmZyYW1lc19kdW1wZWQsIHBkZXYtPnZmcmFtZXNfZXJyb3IpOworCisJc3dpdGNoIChwZGV2LT50eXBlKQorCSB7CisJICBjYXNlIDY3NToKKwkgIGNhc2UgNjgwOgorCSAgY2FzZSA2OTA6CisJICBjYXNlIDcyMDoKKwkgIGNhc2UgNzMwOgorCSAgY2FzZSA3NDA6CisJICBjYXNlIDc1MDoKKwkgICAgcHdjX2RlYzIzX2V4aXQoKTsJLyogVGltb24gJiBLaWFyYSAqLworCSAgICBicmVhazsKKwkgIGNhc2UgNjQ1OgorCSAgY2FzZSA2NDY6CisJICAgIHB3Y19kZWMxX2V4aXQoKTsKKwkgICAgYnJlYWs7CisJIH0KKworCXB3Y19pc29jX2NsZWFudXAocGRldik7CisJcHdjX2ZyZWVfYnVmZmVycyhwZGV2KTsKKworCS8qIFR1cm4gb2ZmIExFRFMgYW5kIHBvd2VyIGRvd24gY2FtZXJhLCBidXQgb25seSB3aGVuIG5vdCB1bnBsdWdnZWQgKi8KKwlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzICE9IEVQSVBFKSB7CisJCS8qIFR1cm4gTEVEcyBvZmYgKi8KKwkJaWYgKHB3Y19zZXRfbGVkcyhwZGV2LCAwLCAwKSA8IDApCisJCQlJbmZvKCJGYWlsZWQgdG8gc2V0IExFRCBvbi9vZmYgdGltZS5cbiIpOworCQlpZiAocG93ZXJfc2F2ZSkgeworCQkJaSA9IHB3Y19jYW1lcmFfcG93ZXIocGRldiwgMCk7CisJCQlpZiAoaSA8IDApCisJCQkJRXJyKCJGYWlsZWQgdG8gcG93ZXIgZG93biBjYW1lcmEgKCVkKVxuIiwgaSk7CisJCX0KKwl9CisJcGRldi0+dm9wZW4gPSAwOworCVRyYWNlKFRSQUNFX09QRU4sICI8PCB2aWRlb19jbG9zZSgpXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUZJWE1FOiB3aGF0IGFib3V0IHR3byBwYXJhbGxlbCByZWFkcyA/Pz8/CisgKiAgICAgIEFOU1dFUjogTm90IHN1cHBvcnRlZC4gWW91IGNhbid0IG9wZW4gdGhlIGRldmljZSBtb3JlIHRoYW4gb25jZSwKKyAgICAgICAgICAgICAgICBkZXNwaXRlIHdoYXQgdGhlIFY0TDEgaW50ZXJmYWNlIHNheXMuIEZpcnN0LCBJIGRvbid0IHNlZQorICAgICAgICAgICAgICAgIHRoZSBuZWVkLCBzZWNvbmQgdGhlcmUncyBubyBtZWNoYW5pc20gb2YgYWxlcnRpbmcgdGhlCisgICAgICAgICAgICAgICAgMm5kLzNyZC8uLi4gcHJvY2VzcyBvZiBldmVudHMgbGlrZSBjaGFuZ2luZyBpbWFnZSBzaXplLgorICAgICAgICAgICAgICAgIEFuZCBJIGRvbid0IHNlZSB0aGUgcG9pbnQgb2YgYmxvY2tpbmcgdGhhdCBmb3IgdGhlCisgICAgICAgICAgICAgICAgMm5kLzNyZC8uLi4gcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICBJbiBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudHMgcmVhZGluZyBwYXJhbGxlbCBmcm9tIGFueQorICAgICAgICAgICAgICAgIGRldmljZSBpcyB0cmlja3kgYW55aG93LgorICovCisKK3N0YXRpYyBzc2l6ZV90IHB3Y192aWRlb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKKwlpbnQgbm9ibG9jayA9IGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworICAgICAgICBpbnQgYnl0ZXNfdG9fcmVhZDsKKworCVRyYWNlKFRSQUNFX1JFQUQsICJ2aWRlb19yZWFkKDB4JXAsICVwLCAlWmQpIGNhbGxlZC5cbiIsIHZkZXYsIGJ1ZiwgY291bnQpOworCWlmICh2ZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCXBkZXYgPSB2ZGV2LT5wcml2OworCWlmIChwZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChwZGV2LT5lcnJvcl9zdGF0dXMpCisJCXJldHVybiAtcGRldi0+ZXJyb3Jfc3RhdHVzOyAvKiBTb21ldGhpbmcgaGFwcGVuZWQsIHJlcG9ydCB3aGF0LiAqLworCisJLyogSW4gY2FzZSB3ZSdyZSBkb2luZyBwYXJ0aWFsIHJlYWRzLCB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yIGEgZnJhbWUgKi8KKwlpZiAocGRldi0+aW1hZ2VfcmVhZF9wb3MgPT0gMCkgeworCQkvKiBEbyB3YWl0IHF1ZXVlaW5nIGFjY29yZGluZyB0byB0aGUgKGRvYylib29rICovCisJCWFkZF93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKKwkJd2hpbGUgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKKwkJCS8qIENoZWNrIGZvciB1bnBsdWdnZWQvZXRjLiBoZXJlICovCisJCQlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzKSB7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQkJcmV0dXJuIC1wZGV2LT5lcnJvcl9zdGF0dXMgOworCQkJfQorCSAgICAgICAgICAgICAgICBpZiAobm9ibG9jaykgeworCSAgICAgICAgICAgICAgICAJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOworCSAgICAgICAgICAgICAgICAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkgICAgICAgICAgICAgICAgCXJldHVybiAtRVdPVUxEQkxPQ0s7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJICAgICAgICAgICAgICAgIAlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJICAgICAgICAgICAgICAgIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCSAgICAgICAgICAgICAgICAJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgICBzY2hlZHVsZSgpOworCSAgICAgICAgICAgICAgIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCS8qIERlY29tcHJlc3MgYW5kIHJlbGVhc2UgZnJhbWUgKi8KKwkJaWYgKHB3Y19oYW5kbGVfZnJhbWUocGRldikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlUcmFjZShUUkFDRV9SRUFELCAiQ29weWluZyBkYXRhIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwlpZiAocGRldi0+dnBhbGV0dGUgPT0gVklERU9fUEFMRVRURV9SQVcpCisJCWJ5dGVzX3RvX3JlYWQgPSBwZGV2LT5mcmFtZV9zaXplOworCWVsc2UKKyAJCWJ5dGVzX3RvX3JlYWQgPSBwZGV2LT52aWV3LnNpemU7CisKKwkvKiBjb3B5IGJ5dGVzIHRvIHVzZXIgc3BhY2U7IHdlIGFsbG93IGZvciBwYXJ0aWFsIHJlYWRzICovCisJaWYgKGNvdW50ICsgcGRldi0+aW1hZ2VfcmVhZF9wb3MgPiBieXRlc190b19yZWFkKQorCQljb3VudCA9IGJ5dGVzX3RvX3JlYWQgLSBwZGV2LT5pbWFnZV9yZWFkX3BvczsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcGRldi0+aW1hZ2VfcHRyW3BkZXYtPmZpbGxfaW1hZ2VdICsgcGRldi0+aW1hZ2VfcmVhZF9wb3MsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcGRldi0+aW1hZ2VfcmVhZF9wb3MgKz0gY291bnQ7CisJaWYgKHBkZXYtPmltYWdlX3JlYWRfcG9zID49IGJ5dGVzX3RvX3JlYWQpIHsgLyogQWxsIGRhdGEgaGFzIGJlZW4gcmVhZCAqLworCQlwZGV2LT5pbWFnZV9yZWFkX3BvcyA9IDA7CisJCXB3Y19uZXh0X2ltYWdlKHBkZXYpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHdjX3ZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKKworCWlmICh2ZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCXBkZXYgPSB2ZGV2LT5wcml2OworCWlmIChwZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCisJcG9sbF93YWl0KGZpbGUsICZwZGV2LT5mcmFtZXEsIHdhaXQpOworCWlmIChwZGV2LT5lcnJvcl9zdGF0dXMpCisJCXJldHVybiBQT0xMRVJSOworCWlmIChwZGV2LT5mdWxsX2ZyYW1lcyAhPSBOVUxMKSAvKiB3ZSBoYXZlIGZyYW1lcyB3YWl0aW5nICovCisJCXJldHVybiAoUE9MTElOIHwgUE9MTFJETk9STSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwd2NfdmlkZW9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWlmICh2ZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCXBkZXYgPSB2ZGV2LT5wcml2OworCWlmIChwZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChjbWQpIHsKKwkJLyogUXVlcnkgY2FiYXBpbGl0aWVzICovCisJCWNhc2UgVklESU9DR0NBUDoKKwkJeworCQkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmNhcHMgPSBhcmc7CisKKwkJCXN0cmNweShjYXBzLT5uYW1lLCB2ZGV2LT5uYW1lKTsKKwkJCWNhcHMtPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFOworCQkJY2Fwcy0+Y2hhbm5lbHMgPSAxOworCQkJY2Fwcy0+YXVkaW9zID0gMTsKKwkJCWNhcHMtPm1pbndpZHRoICA9IHBkZXYtPnZpZXdfbWluLng7CisJCQljYXBzLT5taW5oZWlnaHQgPSBwZGV2LT52aWV3X21pbi55OworCQkJY2Fwcy0+bWF4d2lkdGggID0gcGRldi0+dmlld19tYXgueDsKKwkJCWNhcHMtPm1heGhlaWdodCA9IHBkZXYtPnZpZXdfbWF4Lnk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIENoYW5uZWwgZnVuY3Rpb25zIChzaW11bGF0ZSAxIGNoYW5uZWwpICovCisJCWNhc2UgVklESU9DR0NIQU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCisJCQlpZiAodi0+Y2hhbm5lbCAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJdi0+ZmxhZ3MgPSAwOworCQkJdi0+dHVuZXJzID0gMDsKKwkJCXYtPnR5cGUgPSBWSURFT19UWVBFX0NBTUVSQTsKKwkJCXN0cmNweSh2LT5uYW1lLCAiV2ViY2FtIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DU0NIQU46CisJCXsKKwkJCS8qIFRoZSBzcGVjIHNheXMgdGhlIGFyZ3VtZW50IGlzIGFuIGludGVnZXIsIGJ1dAorCQkJICAgdGhlIGJ0dHYgZHJpdmVyIHVzZXMgYSB2aWRlb19jaGFubmVsIGFyZywgd2hpY2gKKwkJCSAgIG1ha2VzIHNlbnNlIGJlY2FzdWUgaXQgYWxzbyBoYXMgdGhlIG5vcm0gZmxhZy4KKwkJCSAqLworCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisJCQlpZiAodi0+Y2hhbm5lbCAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCX0KKworCisJCS8qIFBpY3R1cmUgZnVuY3Rpb25zOyBjb250cmFzdCBldGMuICovCisJCWNhc2UgVklESU9DR1BJQ1Q6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCQkJaW50IHZhbDsKKworCQkJdmFsID0gcHdjX2dldF9icmlnaHRuZXNzKHBkZXYpOworCQkJaWYgKHZhbCA+PSAwKQorCQkJCXAtPmJyaWdodG5lc3MgPSB2YWw7CisJCQllbHNlCisJCQkJcC0+YnJpZ2h0bmVzcyA9IDB4ZmZmZjsKKwkJCXZhbCA9IHB3Y19nZXRfY29udHJhc3QocGRldik7CisJCQlpZiAodmFsID49IDApCisJCQkJcC0+Y29udHJhc3QgPSB2YWw7CisJCQllbHNlCisJCQkJcC0+Y29udHJhc3QgPSAweGZmZmY7CisJCQkvKiBHYW1tYSwgV2hpdGVuZXNzLCB3aGF0J3MgdGhlIGRpZmZlcmVuY2U/IDopICovCisJCQl2YWwgPSBwd2NfZ2V0X2dhbW1hKHBkZXYpOworCQkJaWYgKHZhbCA+PSAwKQorCQkJCXAtPndoaXRlbmVzcyA9IHZhbDsKKwkJCWVsc2UKKwkJCQlwLT53aGl0ZW5lc3MgPSAweGZmZmY7CisJCQl2YWwgPSBwd2NfZ2V0X3NhdHVyYXRpb24ocGRldik7CisJCQlpZiAodmFsID49IDApCisJCQkJcC0+Y29sb3VyID0gdmFsOworCQkJZWxzZQorCQkJCXAtPmNvbG91ciA9IDB4ZmZmZjsKKwkJCXAtPmRlcHRoID0gMjQ7CisJCQlwLT5wYWxldHRlID0gcGRldi0+dnBhbGV0dGU7CisJCQlwLT5odWUgPSAweEZGRkY7IC8qIE4vQSAqLworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFZJRElPQ1NQSUNUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCA9IGFyZzsKKwkJCS8qCisJCQkgKglGSVhNRToJU3VwcG9zZSB3ZSBhcmUgbWlkIHJlYWQKKwkJCSAgICAgICAgQU5TV0VSOiBObyBwcm9ibGVtOiB0aGUgZmlybXdhcmUgb2YgdGhlIGNhbWVyYQorCQkJICAgICAgICAgICAgICAgIGNhbiBoYW5kbGUgYnJpZ2h0bmVzcy9jb250cmFzdC9ldGMKKwkJCSAgICAgICAgICAgICAgICBjaGFuZ2VzIGF0IF9hbnlfIHRpbWUsIGFuZCB0aGUgcGFsZXR0ZQorCQkJICAgICAgICAgICAgICAgIGlzIHVzZWQgZXhhY3RseSBvbmNlIGluIHRoZSB1bmNvbXByZXNzCisJCQkgICAgICAgICAgICAgICAgcm91dGluZS4KKwkJCSAqLworCQkJcHdjX3NldF9icmlnaHRuZXNzKHBkZXYsIHAtPmJyaWdodG5lc3MpOworCQkJcHdjX3NldF9jb250cmFzdChwZGV2LCBwLT5jb250cmFzdCk7CisJCQlwd2Nfc2V0X2dhbW1hKHBkZXYsIHAtPndoaXRlbmVzcyk7CisJCQlwd2Nfc2V0X3NhdHVyYXRpb24ocGRldiwgcC0+Y29sb3VyKTsKKwkJCWlmIChwLT5wYWxldHRlICYmIHAtPnBhbGV0dGUgIT0gcGRldi0+dnBhbGV0dGUpIHsKKwkJCQlzd2l0Y2ggKHAtPnBhbGV0dGUpIHsKKwkJCQkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMFA6CisJCQkJCWNhc2UgVklERU9fUEFMRVRURV9SQVc6CisJCQkJCQlwZGV2LT52cGFsZXR0ZSA9IHAtPnBhbGV0dGU7CisJCQkJCQlyZXR1cm4gcHdjX3RyeV92aWRlb19tb2RlKHBkZXYsIHBkZXYtPmltYWdlLngsIHBkZXYtPmltYWdlLnksIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgcGRldi0+dnNuYXBzaG90KTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIFdpbmRvdy9zaXplIHBhcmFtZXRlcnMgKi8JCQorCQljYXNlIFZJRElPQ0dXSU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCQkJCisJCQl2dy0+eCA9IDA7CisJCQl2dy0+eSA9IDA7CisJCQl2dy0+d2lkdGggPSBwZGV2LT52aWV3Lng7CisJCQl2dy0+aGVpZ2h0ID0gcGRldi0+dmlldy55OworCQkJdnctPmNocm9tYWtleSA9IDA7CisJCQl2dy0+ZmxhZ3MgPSAocGRldi0+dmZyYW1lcyA8PCBQV0NfRlBTX1NISUZUKSB8IAorCQkJICAgICAgICAgICAocGRldi0+dnNuYXBzaG90ID8gUFdDX0ZQU19TTkFQU0hPVCA6IDApOworCQkJYnJlYWs7CisJCX0KKwkJCisJCWNhc2UgVklESU9DU1dJTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7CisJCQlpbnQgZnBzLCBzbmFwc2hvdCwgcmV0OworCisJCQlmcHMgPSAodnctPmZsYWdzICYgUFdDX0ZQU19GUk1BU0spID4+IFBXQ19GUFNfU0hJRlQ7CisJCQlzbmFwc2hvdCA9IHZ3LT5mbGFncyAmIFBXQ19GUFNfU05BUFNIT1Q7CisJCQlpZiAoZnBzID09IDApCisJCQkJZnBzID0gcGRldi0+dmZyYW1lczsKKwkJCWlmIChwZGV2LT52aWV3LnggPT0gdnctPndpZHRoICYmIHBkZXYtPnZpZXcueSAmJiBmcHMgPT0gcGRldi0+dmZyYW1lcyAmJiBzbmFwc2hvdCA9PSBwZGV2LT52c25hcHNob3QpCisJCQkJcmV0dXJuIDA7CisJCQlyZXQgPSBwd2NfdHJ5X3ZpZGVvX21vZGUocGRldiwgdnctPndpZHRoLCB2dy0+aGVpZ2h0LCBmcHMsIHBkZXYtPnZjb21wcmVzc2lvbiwgc25hcHNob3QpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJYnJlYWs7CQkKKwkJfQorCQkKKwkJLyogV2UgZG9uJ3QgaGF2ZSBvdmVybGF5IHN1cHBvcnQgKHlldCkgKi8KKwkJY2FzZSBWSURJT0NHRkJVRjoKKwkJeworCQkJc3RydWN0IHZpZGVvX2J1ZmZlciAqdmIgPSBhcmc7CisKKwkJCW1lbXNldCh2YiwwLHNpemVvZigqdmIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogbW1hcCgpIGZ1bmN0aW9ucyAqLworCQljYXNlIFZJRElPQ0dNQlVGOgorCQl7CisJCQkvKiBUZWxsIHRoZSB1c2VyIHByb2dyYW0gaG93IG11Y2ggbWVtb3J5IGlzIG5lZWRlZCBmb3IgYSBtbWFwKCkgKi8KKwkJCXN0cnVjdCB2aWRlb19tYnVmICp2bSA9IGFyZzsKKwkJCWludCBpOworCisJCQltZW1zZXQodm0sIDAsIHNpemVvZigqdm0pKTsKKwkJCXZtLT5zaXplID0gZGVmYXVsdF9tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisJCQl2bS0+ZnJhbWVzID0gZGVmYXVsdF9tYnVmczsgLyogZG91YmxlIGJ1ZmZlcmluZyBzaG91bGQgYmUgZW5vdWdoIGZvciBtb3N0IGFwcGxpY2F0aW9ucyAqLworCQkJZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfbWJ1ZnM7IGkrKykKKwkJCQl2bS0+b2Zmc2V0c1tpXSA9IGkgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFZJRElPQ01DQVBUVVJFOgorCQl7CisJCQkvKiBTdGFydCBjYXB0dXJlIGludG8gYSBnaXZlbiBpbWFnZSBidWZmZXIgKGNhbGxlZCAnZnJhbWUnIGluIHZpZGVvX21tYXAgc3RydWN0dXJlKSAqLworCQkJc3RydWN0IHZpZGVvX21tYXAgKnZtID0gYXJnOworCisJCQlUcmFjZShUUkFDRV9SRUFELCAiVklESU9DTUNBUFRVUkU6ICVkeCVkLCBmcmFtZSAlZCwgZm9ybWF0ICVkXG4iLCB2bS0+d2lkdGgsIHZtLT5oZWlnaHQsIHZtLT5mcmFtZSwgdm0tPmZvcm1hdCk7CisJCQlpZiAodm0tPmZyYW1lIDwgMCB8fCB2bS0+ZnJhbWUgPj0gZGVmYXVsdF9tYnVmcykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogeGF3dHYgaXMgbmFzdHkuIEl0IHByb2JlcyB0aGUgYXZhaWxhYmxlIHBhbGV0dGVzCisJCQkgICBieSBzZXR0aW5nIGEgdmVyeSBzbWFsbCBpbWFnZSBzaXplIGFuZCB0cnlpbmcKKwkJCSAgIHZhcmlvdXMgcGFsZXR0ZXMuLi4gVGhlIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQKKwkJCSAgIHN1Y2ggc21hbGwgaW1hZ2VzLCBzbyBJJ20gd29ya2luZyBhcm91bmQgaXQuCisJCQkgKi8KKwkJCWlmICh2bS0+Zm9ybWF0KQorCQkJeworCQkJCXN3aXRjaCAodm0tPmZvcm1hdCkKKwkJCQl7CisJCQkJCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjBQOgorCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfUkFXOgorCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCh2bS0+d2lkdGggIT0gcGRldi0+dmlldy54IHx8IHZtLT5oZWlnaHQgIT0gcGRldi0+dmlldy55KSAmJgorCQkJICAgICh2bS0+d2lkdGggPj0gcGRldi0+dmlld19taW4ueCAmJiB2bS0+aGVpZ2h0ID49IHBkZXYtPnZpZXdfbWluLnkpKSB7CisJCQkJaW50IHJldDsKKworCQkJCVRyYWNlKFRSQUNFX09QRU4sICJWSURJT0NNQ0FQVFVSRTogY2hhbmdpbmcgc2l6ZSB0byBwbGVhc2UgeGF3dHYgOi0oLlxuIik7CisJCQkJcmV0ID0gcHdjX3RyeV92aWRlb19tb2RlKHBkZXYsIHZtLT53aWR0aCwgdm0tPmhlaWdodCwgcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLCBwZGV2LT52c25hcHNob3QpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQl9IC8qIC4uLiBzaXplIG1pc21hdGNoICovCisKKwkJCS8qIEZJWE1FOiBzaG91bGQgd2UgbG9jayBoZXJlPyAqLworCQkJaWYgKHBkZXYtPmltYWdlX3VzZWRbdm0tPmZyYW1lXSkKKwkJCQlyZXR1cm4gLUVCVVNZOwkvKiBidWZmZXIgd2Fzbid0IGF2YWlsYWJsZS4gQnVtbWVyICovCisJCQlwZGV2LT5pbWFnZV91c2VkW3ZtLT5mcmFtZV0gPSAxOworCisJCQkvKiBPa2F5LCB3ZSdyZSBkb25lIGhlcmUuIEluIHRoZSBTWU5DIGNhbGwgd2Ugd2FpdCB1bnRpbCBhIAorCQkJICAgZnJhbWUgY29tZXMgYXZhaWxhYmxlLCB0aGVuIGV4cGFuZCBpbWFnZSBpbnRvIHRoZSBnaXZlbiAKKwkJCSAgIGJ1ZmZlci4KKwkJCSAgIEluIGNvbnRyYXN0IHRvIHRoZSBDUGlBIGNhbSB0aGUgUGhpbGlwcyBjYW1zIGRlbGl2ZXIgYQorCQkJICAgY29uc3RhbnQgc3RyZWFtLCBhbG1vc3QgbGlrZSBhIGdyYWJiZXIgY2FyZC4gQWxzbywKKwkJCSAgIHdlIGhhdmUgc2VwYXJhdGUgYnVmZmVycyBmb3IgdGhlIHJhd2RhdGEgYW5kIHRoZSBpbWFnZSwKKwkJCSAgIG1lYW5pbmcgd2UgY2FuIG5lYXJseSBhbHdheXMgZXhwYW5kIGludG8gdGhlIHJlcXVlc3RlZCBidWZmZXIuCisJCQkgKi8KKwkJCVRyYWNlKFRSQUNFX1JFQUQsICJWSURJT0NNQ0FQVFVSRSBkb25lLlxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVklESU9DU1lOQzoKKwkJeworCQkJLyogVGhlIGRvYyBzYXlzOiAiV2hlbmV2ZXIgYSBidWZmZXIgaXMgdXNlZCBpdCBzaG91bGQKKwkJCSAgIGNhbGwgVklESU9DU1lOQyB0byBmcmVlIHRoaXMgZnJhbWUgdXAgYW5kIGNvbnRpbnVlLiIKKwkJCSAgIAorCQkJICAgVGhlIG9ubHkgb2RkIHRoaW5nIGFib3V0IHRoaXMgd2hvbGUgcHJvY2VkdXJlIGlzIAorCQkJICAgdGhhdCBNQ0FQVFVSRSBmbGFncyB0aGUgYnVmZmVyIGFzICJpbiB1c2UiLCBhbmQKKwkJCSAgIFNZTkMgaW1tZWRpYXRlbHkgdW5tYXJrcyBpdCwgd2hpbGUgaXQgaXNuJ3QgCisJCQkgICBhZnRlciBTWU5DIHRoYXQgeW91IGtub3cgdGhhdCB0aGUgYnVmZmVyIGFjdHVhbGx5CisJCQkgICBnb3QgZmlsbGVkISBTbyB5b3UgYmV0dGVyIG5vdCBzdGFydCBhIENBUFRVUkUgaW4KKwkJCSAgIHRoZSBzYW1lIGZyYW1lIGltbWVkaWF0ZWx5ICh1c2UgZG91YmxlIGJ1ZmZlcmluZykuIAorCQkJICAgVGhpcyBpcyBub3QgYSBwcm9ibGVtIGZvciB0aGlzIGNhbSwgc2luY2UgaXQgaGFzIAorCQkJICAgZXh0cmEgaW50ZXJtZWRpYXRlIGJ1ZmZlcnMsIGJ1dCBhIGhhcmR3YXJlIAorCQkJICAgZ3JhYmJlciBjYXJkIHdpbGwgdGhlbiBvdmVyd3JpdGUgdGhlIGJ1ZmZlciAKKwkJCSAgIHlvdSdyZSB3b3JraW5nIG9uLgorCQkJICovCisJCQlpbnQgKm1idWYgPSBhcmc7CisJCQlpbnQgcmV0OworCisJCQlUcmFjZShUUkFDRV9SRUFELCAiVklESU9DU1lOQyBjYWxsZWQgKCVkKS5cbiIsICptYnVmKTsKKworCQkJLyogYm91bmRzIGNoZWNrICovCisJCQlpZiAoKm1idWYgPCAwIHx8ICptYnVmID49IGRlZmF1bHRfbWJ1ZnMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkvKiBjaGVjayBpZiB0aGlzIGJ1ZmZlciB3YXMgcmVxdWVzdGVkIGFueXdheSAqLworCQkJaWYgKHBkZXYtPmltYWdlX3VzZWRbKm1idWZdID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCS8qIEFkZCBvdXJzZWx2ZXMgdG8gdGhlIGZyYW1lIHdhaXQtcXVldWUuCisJCQkgICAKKwkJCSAgIEZJWE1FOiBuZWVkcyBhdWRpdGluZyBmb3Igc2FmZXR5LgorCQkJICAgUVVFU1RJT046IEluIHdoYXQgcmVzcGVjdD8gSSB0aGluayB0aGF0IHVzaW5nIHRoZQorCQkJICAgICAgICAgICAgIGZyYW1lcSBpcyBzYWZlIG5vdy4KKwkJCSAqLworCQkJYWRkX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOworCQkJd2hpbGUgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKKwkJCQlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzKSB7CisJCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKKwkJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQkJcmV0dXJuIC1wZGV2LT5lcnJvcl9zdGF0dXM7CisJCQkJfQorCQkJCisJICAgICAgICAgICAgICAgIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkgICAgICAgICAgICAgICAgCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCSAgICAgICAgICAgICAgICAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJICAgICAgICAgICAgICAgIAlyZXR1cm4gLUVSRVNUQVJUU1lTOworCSAgICAgICAgCSAgICAgICAgfQorCSAgICAgICAgICAgICAgICAJc2NoZWR1bGUoKTsKKwkJICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQl9CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCQorCQkJLyogVGhlIGZyYW1lIGlzIHJlYWR5LiBFeHBhbmQgaW4gdGhlIGltYWdlIGJ1ZmZlciAKKwkJCSAgIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gSSBkb24ndCBjYXJlIGlmIHlvdSAKKwkJCSAgIG1tYXAoKSA1IGJ1ZmZlcnMgYW5kIHJlcXVlc3QgZGF0YSBpbiB0aGlzIG9yZGVyOiAKKwkJCSAgIGJ1ZmZlciA0IDIgMyAwIDEgMiAzIDAgNCAzIDEgLiAuIC4KKwkJCSAgIEdyYWJiZXIgaGFyZHdhcmUgbWF5IG5vdCBiZSBzbyBmb3JnaXZpbmcuCisJCQkgKi8KKwkJCVRyYWNlKFRSQUNFX1JFQUQsICJWSURJT0NTWU5DOiBmcmFtZSByZWFkeS5cbiIpOworCQkJcGRldi0+ZmlsbF9pbWFnZSA9ICptYnVmOyAvKiB0ZWxsIGluIHdoaWNoIGJ1ZmZlciB3ZSB3YW50IHRoZSBpbWFnZSB0byBiZSBleHBhbmRlZCAqLworCQkJLyogRGVjb21wcmVzcywgZXRjICovCisJCQlyZXQgPSBwd2NfaGFuZGxlX2ZyYW1lKHBkZXYpOworCQkJcGRldi0+aW1hZ2VfdXNlZFsqbWJ1Zl0gPSAwOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCQorCQljYXNlIFZJRElPQ0dBVURJTzoKKwkJeworCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOworCQkJCisJCQlzdHJjcHkodi0+bmFtZSwgIk1pY3JvcGhvbmUiKTsKKwkJCXYtPmF1ZGlvID0gLTE7IC8qIHVua25vd24gYXVkaW8gbWlub3IgKi8KKwkJCXYtPmZsYWdzID0gMDsKKwkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05POworCQkJdi0+dm9sdW1lID0gMDsKKwkJCXYtPmJhc3MgPSAwOworCQkJdi0+dHJlYmxlID0gMDsKKwkJCXYtPmJhbGFuY2UgPSAweDgwMDA7CisJCQl2LT5zdGVwID0gMTsKKwkJCWJyZWFrOwkKKwkJfQorCQkKKwkJY2FzZSBWSURJT0NTQVVESU86CisJCXsKKwkJCS8qIER1bW15OiBub3RoaW5nIGNhbiBiZSBzZXQgKi8KKwkJCWJyZWFrOworCQl9CisJCQorCQljYXNlIFZJRElPQ0dVTklUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fdW5pdCAqdnUgPSBhcmc7CisJCQkKKwkJCXZ1LT52aWRlbyA9IHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRjsKKwkJCXZ1LT5hdWRpbyA9IC0xOyAvKiBub3Qga25vd24geWV0ICovCisJCQl2dS0+dmJpID0gLTE7CisJCQl2dS0+cmFkaW8gPSAtMTsKKwkJCXZ1LT50ZWxldGV4dCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybiBwd2NfaW9jdGwocGRldiwgY21kLCBhcmcpOworCX0gLyogLi5zd2l0Y2ggKi8KKwlyZXR1cm4gMDsKK30JCisKK3N0YXRpYyBpbnQgcHdjX3ZpZGVvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgcHdjX3ZpZGVvX2RvX2lvY3RsKTsKK30KKworCitzdGF0aWMgaW50IHB3Y192aWRlb19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSAgPSB2bWEtPnZtX2VuZC12bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgcGFnZSwgcG9zOworCQorCVRyYWNlKFRSQUNFX01FTU9SWSwgIm1tYXAoMHglcCwgMHglbHgsICVsdSkgY2FsbGVkLlxuIiwgdmRldiwgc3RhcnQsIHNpemUpOworCXBkZXYgPSB2ZGV2LT5wcml2OworCQorCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CisKKwlwb3MgPSAodW5zaWduZWQgbG9uZylwZGV2LT5pbWFnZV9kYXRhOworCXdoaWxlIChzaXplID4gMCkgeworCQlwYWdlID0gdm1hbGxvY190b19wZm4oKHZvaWQgKilwb3MpOworCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsIHBhZ2UsIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJc3RhcnQgKz0gUEFHRV9TSVpFOworCQlwb3MgKz0gUEFHRV9TSVpFOworCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKKwkJCXNpemUgLT0gUEFHRV9TSVpFOworCQllbHNlCisJCQlzaXplID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFVTQiBmdW5jdGlvbnMgKi8KKworLyogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIGEgbmV3IGRldmljZSBpcyBwbHVnZ2VkIGluIG9yIHRoZSB1c2IgY29yZQorICogaXMgbG9hZGVkLgorICovCisKK3N0YXRpYyBpbnQgdXNiX3B3Y19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IE5VTEw7CisJaW50IHZlbmRvcl9pZCwgcHJvZHVjdF9pZCwgdHlwZV9pZDsKKwlpbnQgaSwgaGludDsKKwlpbnQgZmVhdHVyZXMgPSAwOworCWludCB2aWRlb19uciA9IC0xOyAvKiBkZWZhdWx0OiB1c2UgbmV4dCBhdmFpbGFibGUgZGV2aWNlICovCisJY2hhciBzZXJpYWxfbnVtYmVyWzMwXSwgKm5hbWU7CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gaGFuZGxlIHRoaXMgZGV2aWNlICovCisJVHJhY2UoVFJBQ0VfUFJPQkUsICJwcm9iZSgpIGNhbGxlZCBbJTA0WCAlMDRYXSwgaWYgJWRcbiIsIAorCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAorCQlpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCisJLyogdGhlIGludGVyZmFjZXMgYXJlIHByb2JlZCBvbmUgYnkgb25lLiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZQorCSAgIHZpZGVvIGludGVyZmFjZSAoMCkgbm93LgorCSAgIEludGVyZmFjZSAxIGlzIHRoZSBBdWRpbyBDb250cm9sLCBhbmQgaW50ZXJmYWNlIDIgQXVkaW8gaXRzZWxmLgorCSAqLworCWlmIChpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIgPiAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZlbmRvcl9pZCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCXByb2R1Y3RfaWQgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKwlpZiAodmVuZG9yX2lkID09IDB4MDQ3MSkgeworCQlzd2l0Y2ggKHByb2R1Y3RfaWQpIHsKKwkJY2FzZSAweDAzMDI6CisJCQlJbmZvKCJQaGlsaXBzIFBDQTY0NVZDIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiUGhpbGlwcyA2NDUgd2ViY2FtIjsKKwkJCXR5cGVfaWQgPSA2NDU7CisJCQlicmVhazsKKwkJY2FzZSAweDAzMDM6CisJCQlJbmZvKCJQaGlsaXBzIFBDQTY0NlZDIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiUGhpbGlwcyA2NDYgd2ViY2FtIjsKKwkJCXR5cGVfaWQgPSA2NDY7CisJCQlicmVhazsKKwkJY2FzZSAweDAzMDQ6CisJCQlJbmZvKCJBc2tleSBWQzAxMCB0eXBlIDIgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJBc2tleSBWQzAxMCB3ZWJjYW0iOworCQkJdHlwZV9pZCA9IDY0NjsKKwkJCWJyZWFrOworCQljYXNlIDB4MDMwNzoKKwkJCUluZm8oIlBoaWxpcHMgUENWQzY3NUsgKFZlc3RhKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlBoaWxpcHMgNjc1IHdlYmNhbSI7CisJCQl0eXBlX2lkID0gNjc1OworCQkJYnJlYWs7CisJCWNhc2UgMHgwMzA4OgorCQkJSW5mbygiUGhpbGlwcyBQQ1ZDNjgwSyAoVmVzdGEgUHJvKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlBoaWxpcHMgNjgwIHdlYmNhbSI7CisJCQl0eXBlX2lkID0gNjgwOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMzBDOgorCQkJSW5mbygiUGhpbGlwcyBQQ1ZDNjkwSyAoVmVzdGEgUHJvIFNjYW4pIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiUGhpbGlwcyA2OTAgd2ViY2FtIjsKKwkJCXR5cGVfaWQgPSA2OTA7CisJCQlicmVhazsKKwkJY2FzZSAweDAzMTA6CisJCQlJbmZvKCJQaGlsaXBzIFBDVkM3MzBLIChUb1VDYW0gRnVuKS9QQ1ZDODMwIChUb1VDYW0gSUkpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiUGhpbGlwcyA3MzAgd2ViY2FtIjsKKwkJCXR5cGVfaWQgPSA3MzA7CisJCQlicmVhazsKKwkJY2FzZSAweDAzMTE6CisJCQlJbmZvKCJQaGlsaXBzIFBDVkM3NDBLIChUb1VDYW0gUHJvKS9QQ1ZDODQwIChUb1VDYW0gSUkpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiUGhpbGlwcyA3NDAgd2ViY2FtIjsKKwkJCXR5cGVfaWQgPSA3NDA7CisJCQlicmVhazsKKwkJY2FzZSAweDAzMTI6CisJCQlJbmZvKCJQaGlsaXBzIFBDVkM3NTBLIChUb1VDYW0gUHJvIFNjYW4pIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiUGhpbGlwcyA3NTAgd2ViY2FtIjsKKwkJCXR5cGVfaWQgPSA3NTA7CisJCQlicmVhazsKKwkJY2FzZSAweDAzMTM6CisJCQlJbmZvKCJQaGlsaXBzIFBDVkM3MjBLLzQwIChUb1VDYW0gWFMpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiUGhpbGlwcyA3MjBLLzQwIHdlYmNhbSI7CisJCQl0eXBlX2lkID0gNzIwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWJyZWFrOworCQl9CisJfQorCWVsc2UgaWYgKHZlbmRvcl9pZCA9PSAweDA2OUEpIHsKKwkJc3dpdGNoKHByb2R1Y3RfaWQpIHsKKwkJY2FzZSAweDAwMDE6CisJCQlJbmZvKCJBc2tleSBWQzAxMCB0eXBlIDEgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJBc2tleSBWQzAxMCB3ZWJjYW0iOworCQkJdHlwZV9pZCA9IDY0NTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCX0KKwllbHNlIGlmICh2ZW5kb3JfaWQgPT0gMHgwNDZkKSB7CisJCXN3aXRjaChwcm9kdWN0X2lkKSB7CisJCWNhc2UgMHgwOGIwOgorCQkJSW5mbygiTG9naXRlY2ggUXVpY2tDYW0gUHJvIDMwMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBQcm8gMzAwMCI7CisJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCisJCQlicmVhazsKKwkJY2FzZSAweDA4YjE6CisJCQlJbmZvKCJMb2dpdGVjaCBRdWlja0NhbSBOb3RlYm9vayBQcm8gVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBOb3RlYm9vayBQcm8iOworCQkJdHlwZV9pZCA9IDc0MDsgLyogQ0NEIHNlbnNvciAqLworCQkJYnJlYWs7CisJCWNhc2UgMHgwOGIyOgorCQkJSW5mbygiTG9naXRlY2ggUXVpY2tDYW0gNDAwMCBQcm8gVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBQcm8gNDAwMCI7CisJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCisJCQlicmVhazsKKwkJY2FzZSAweDA4YjM6CisJCQlJbmZvKCJMb2dpdGVjaCBRdWlja0NhbSBab29tIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gWm9vbSI7CisJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCisJCQlicmVhazsKKwkJY2FzZSAweDA4QjQ6CisJCQlJbmZvKCJMb2dpdGVjaCBRdWlja0NhbSBab29tIChuZXcgbW9kZWwpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gWm9vbSI7CisJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCisJCQlicmVhazsKKwkJY2FzZSAweDA4YjU6CisJCQlJbmZvKCJMb2dpdGVjaCBRdWlja0NhbSBPcmJpdC9TcGhlcmUgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBPcmJpdCI7CisJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCisJCQlmZWF0dXJlcyB8PSBGRUFUVVJFX01PVE9SX1BBTlRJTFQ7CisJCQlicmVhazsKKwkJY2FzZSAweDA4YjY6CisJCWNhc2UgMHgwOGI3OgorCQljYXNlIDB4MDhiODoKKwkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIGRldGVjdGVkIChyZXNlcnZlZCBJRCkuXG4iKTsKKwkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gKHJlcy4pIjsKKwkJCXR5cGVfaWQgPSA3MzA7IC8qIEFzc3VtaW5nIENNT1MgKi8KKwkJCWJyZWFrOworICAgICAgICAJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PREVWOworICAgICAgICAJCWJyZWFrOworICAgICAgICAJfQorICAgICAgICB9CisJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MDU1ZCkgeworCQkvKiBJIGRvbid0IGtub3cgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgQzEwIGFuZCB0aGUgQzMwOworCQkgICBJIHN1cHBvc2UgdGhlIGRpZmZlcmVuY2UgaXMgdGhlIHNlbnNvciwgYnV0IGJvdGggY2FtZXJhcworCQkgICB3b3JrIGVxdWFsbHkgd2VsbCB3aXRoIGEgdHlwZV9pZCBvZiA2NzUKKwkJICovCisJCXN3aXRjaChwcm9kdWN0X2lkKSB7CisJCWNhc2UgMHg5MDAwOgorCQkJSW5mbygiU2Ftc3VuZyBNUEMtQzEwIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiU2Ftc3VuZyBNUEMtQzEwIjsKKwkJCXR5cGVfaWQgPSA2NzU7CisJCQlicmVhazsKKwkJY2FzZSAweDkwMDE6CisJCQlJbmZvKCJTYW1zdW5nIE1QQy1DMzAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJTYW1zdW5nIE1QQy1DMzAiOworCQkJdHlwZV9pZCA9IDY3NTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCX0KKwllbHNlIGlmICh2ZW5kb3JfaWQgPT0gMHgwNDFlKSB7CisJCXN3aXRjaChwcm9kdWN0X2lkKSB7CisJCWNhc2UgMHg0MDBjOgorCQkJSW5mbygiQ3JlYXRpdmUgTGFicyBXZWJjYW0gNSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJDcmVhdGl2ZSBMYWJzIFdlYmNhbSA1IjsKKwkJCXR5cGVfaWQgPSA3MzA7CisJCQlicmVhazsKKwkJY2FzZSAweDQwMTE6CisJCQlJbmZvKCJDcmVhdGl2ZSBMYWJzIFdlYmNhbSBQcm8gRXggZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiQ3JlYXRpdmUgTGFicyBXZWJjYW0gUHJvIEV4IjsKKwkJCXR5cGVfaWQgPSA3NDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MDRjYykgeworCQlzd2l0Y2gocHJvZHVjdF9pZCkgeworCQljYXNlIDB4ODExNjoKKwkJCUluZm8oIlNvdGVjIEFmaW5hIEV5ZSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlNvdGVjIEFmaW5hIEV5ZSI7CisJCQl0eXBlX2lkID0gNzMwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWJyZWFrOworCQl9CisJfQorCWVsc2UgaWYgKHZlbmRvcl9pZCA9PSAweDA2YmUpIHsKKwkJc3dpdGNoKHByb2R1Y3RfaWQpIHsKKwkJY2FzZSAweDgxMTY6CisJCQkvKiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGNhbSBhcyB0aGUgU290ZWMgQWZpbmEgRXllICovCisJCQlJbmZvKCJBTUUgQ28uIEFmaW5hIEV5ZSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIkFNRSBDby4gQWZpbmEgRXllIjsKKwkJCXR5cGVfaWQgPSA3NTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisJCX0KKwkKKwl9CisJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MGQ4MSkgeworCQlzd2l0Y2gocHJvZHVjdF9pZCkgeworCQljYXNlIDB4MTkwMDoKKwkJCUluZm8oIlZpc2lvbml0ZSBWQ1MtVUMzMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJWaXNpb25pdGUgVkNTLVVDMzAwIjsKKwkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KKwkJCWJyZWFrOworCQljYXNlIDB4MTkxMDoKKwkJCUluZm8oIlZpc2lvbml0ZSBWQ1MtVU0xMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJWaXNpb25pdGUgVkNTLVVNMTAwIjsKKwkJCXR5cGVfaWQgPSA3MzA7IC8qIENNT1Mgc2Vuc29yICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSAKKwkJcmV0dXJuIC1FTk9ERVY7IC8qIE5vdCBhbnkgb2YgdGhlIGtub3cgdHlwZXM7IGJ1dCB0aGUgbGlzdCBrZWVwcyBncm93aW5nLiAqLworCisJbWVtc2V0KHNlcmlhbF9udW1iZXIsIDAsIDMwKTsKKwl1c2Jfc3RyaW5nKHVkZXYsIHVkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlciwgc2VyaWFsX251bWJlciwgMjkpOworCVRyYWNlKFRSQUNFX1BST0JFLCAiRGV2aWNlIHNlcmlhbCBudW1iZXIgaXMgJXNcbiIsIHNlcmlhbF9udW1iZXIpOworCisJaWYgKHVkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zID4gMSkKKwkJSW5mbygiV2FybmluZzogbW9yZSB0aGFuIDEgY29uZmlndXJhdGlvbiBhdmFpbGFibGUuXG4iKTsKKworCS8qIEFsbG9jYXRlIHN0cnVjdHVyZSwgaW5pdGlhbGl6ZSBwb2ludGVycywgbXV0ZXhlcywgZXRjLiBhbmQgbGluayBpdCB0byB0aGUgdXNiX2RldmljZSAqLworCXBkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHdjX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmIChwZGV2ID09IE5VTEwpIHsKKwkJRXJyKCJPb3BzLCBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBwd2NfZGV2aWNlLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBwd2NfZGV2aWNlKSk7CisJcGRldi0+dHlwZSA9IHR5cGVfaWQ7CisJcGRldi0+dnNpemUgPSBkZWZhdWx0X3NpemU7CisJcGRldi0+dmZyYW1lcyA9IGRlZmF1bHRfZnBzOworCXN0cmNweShwZGV2LT5zZXJpYWwsIHNlcmlhbF9udW1iZXIpOworCXBkZXYtPmZlYXR1cmVzID0gZmVhdHVyZXM7CisJaWYgKHZlbmRvcl9pZCA9PSAweDA0NkQgJiYgcHJvZHVjdF9pZCA9PSAweDA4QjUpCisJeworCQkvKiBMb2dpdGVjaCBRdWlja0NhbSBPcmJpdAorCSAgICAgICAgICAgVGhlIHJhbmdlcyBoYXZlIGJlZW4gZGV0ZXJtaW5lZCBleHBlcmltZW50YWxseTsgdGhleSBtYXkgZGlmZmVyIGZyb20gY2FtIHRvIGNhbS4KKwkgICAgICAgICAgIEFsc28sIHRoZSBleGFjdCByYW5nZXMgbGVmdC1yaWdodCBhbmQgdXAtZG93biBhcmUgZGlmZmVyZW50IGZvciBteSBjYW0KKwkgICAgICAgICAgKi8KKwkJcGRldi0+YW5nbGVfcmFuZ2UucGFuX21pbiAgPSAtNzAwMDsKKwkJcGRldi0+YW5nbGVfcmFuZ2UucGFuX21heCAgPSAgNzAwMDsKKwkJcGRldi0+YW5nbGVfcmFuZ2UudGlsdF9taW4gPSAtMzAwMDsKKwkJcGRldi0+YW5nbGVfcmFuZ2UudGlsdF9tYXggPSAgMjUwMDsKKwl9CisKKwlpbml0X01VVEVYKCZwZGV2LT5tb2Rsb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcGRldi0+cHRybG9jayk7CisKKwlwZGV2LT51ZGV2ID0gdWRldjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwZGV2LT5mcmFtZXEpOworCXBkZXYtPnZjb21wcmVzc2lvbiA9IHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb247CisKKwkvKiBBbGxvY2F0ZSB2aWRlb19kZXZpY2Ugc3RydWN0dXJlICovCisJcGRldi0+dmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmIChwZGV2LT52ZGV2ID09IDApCisJeworCQlFcnIoIkVyciwgY2Fubm90IGFsbG9jYXRlIHZpZGVvX2RldmljZSBzdHJ1dHVyZS4gRmFpbGluZyBwcm9iZS4iKTsKKwkJa2ZyZWUocGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1jcHkocGRldi0+dmRldiwgJnB3Y190ZW1wbGF0ZSwgc2l6ZW9mKHB3Y190ZW1wbGF0ZSkpOworCXN0cmNweShwZGV2LT52ZGV2LT5uYW1lLCBuYW1lKTsKKwlwZGV2LT52ZGV2LT5vd25lciA9IFRISVNfTU9EVUxFOworCXZpZGVvX3NldF9kcnZkYXRhKHBkZXYtPnZkZXYsIHBkZXYpOworCisJcGRldi0+cmVsZWFzZSA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKwlUcmFjZShUUkFDRV9QUk9CRSwgIlJlbGVhc2U6ICUwNHhcbiIsIHBkZXYtPnJlbGVhc2UpOworCisJLyogTm93IHNlYXJjaCBkZXZpY2VfaGludFtdIHRhYmxlIGZvciBhIG1hdGNoLCBzbyB3ZSBjYW4gaGludCBhIG5vZGUgbnVtYmVyLiAqLworCWZvciAoaGludCA9IDA7IGhpbnQgPCBNQVhfREVWX0hJTlRTOyBoaW50KyspIHsKKwkJaWYgKCgoZGV2aWNlX2hpbnRbaGludF0udHlwZSA9PSAtMSkgfHwgKGRldmljZV9oaW50W2hpbnRdLnR5cGUgPT0gcGRldi0+dHlwZSkpICYmCisJCSAgICAgKGRldmljZV9oaW50W2hpbnRdLnBkZXYgPT0gTlVMTCkpIHsKKwkJCS8qIHNvIGZhciwgc28gZ29vZC4uLiB0cnkgc2VyaWFsIG51bWJlciAqLworCQkJaWYgKChkZXZpY2VfaGludFtoaW50XS5zZXJpYWxfbnVtYmVyWzBdID09ICcqJykgfHwgIXN0cmNtcChkZXZpY2VfaGludFtoaW50XS5zZXJpYWxfbnVtYmVyLCBzZXJpYWxfbnVtYmVyKSkgeworCQkJICAgIAkvKiBtYXRjaCEgKi8KKwkJCSAgICAJdmlkZW9fbnIgPSBkZXZpY2VfaGludFtoaW50XS5kZXZpY2Vfbm9kZTsKKwkJCSAgICAJVHJhY2UoVFJBQ0VfUFJPQkUsICJGb3VuZCBoaW50LCB3aWxsIHRyeSB0byByZWdpc3RlciBhcyAvZGV2L3ZpZGVvJWRcbiIsIHZpZGVvX25yKTsKKwkJCSAgICAJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlwZGV2LT52ZGV2LT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CisJaSA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShwZGV2LT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucik7CisJaWYgKGkgPCAwKSB7CisJCUVycigiRmFpbGVkIHRvIHJlZ2lzdGVyIGFzIHZpZGVvIGRldmljZSAoJWQpLlxuIiwgaSk7CisJCXZpZGVvX2RldmljZV9yZWxlYXNlKHBkZXYtPnZkZXYpOyAvKiBEcmlwLi4uIGRyaXAuLi4gZHJpcC4uLiAqLworCQlrZnJlZShwZGV2KTsgLyogT29wcywgbm8gbWVtb3J5IGxlYWtzIHBsZWFzZSAqLworCQlyZXR1cm4gLUVJTzsKKwl9CisJZWxzZSB7CisJCUluZm8oIlJlZ2lzdGVyZWQgYXMgL2Rldi92aWRlbyVkLlxuIiwgcGRldi0+dmRldi0+bWlub3IgJiAweDNGKTsKKwl9CisKKwkvKiBvY2N1cHkgc2xvdCAqLworCWlmIChoaW50IDwgTUFYX0RFVl9ISU5UUykgCisJCWRldmljZV9oaW50W2hpbnRdLnBkZXYgPSBwZGV2OworCisJVHJhY2UoVFJBQ0VfUFJPQkUsICJwcm9iZSgpIGZ1bmN0aW9uIHJldHVybmluZyBzdHJ1Y3QgYXQgMHglcC5cbiIsIHBkZXYpOworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIHBkZXYpOworCXJldHVybiAwOworfQorCisvKiBUaGUgdXNlciBqYW5rZWQgb3V0IHRoZSBjYWJsZS4uLiAqLworc3RhdGljIHZvaWQgdXNiX3B3Y19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OworCWludCBoaW50OworCisJbG9ja19rZXJuZWwoKTsKKwlwZGV2ID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CisJaWYgKHBkZXYgPT0gTlVMTCkgeworCQlFcnIoInB3Y19kaXNjb25uZWN0KCkgQ2FsbGVkIHdpdGhvdXQgcHJpdmF0ZSBwb2ludGVyLlxuIik7CisJCWdvdG8gZGlzY29ubmVjdF9vdXQ7CisJfQorCWlmIChwZGV2LT51ZGV2ID09IE5VTEwpIHsKKwkJRXJyKCJwd2NfZGlzY29ubmVjdCgpIGFscmVhZHkgY2FsbGVkIGZvciAlcFxuIiwgcGRldik7CisJCWdvdG8gZGlzY29ubmVjdF9vdXQ7CisJfQorCWlmIChwZGV2LT51ZGV2ICE9IGludGVyZmFjZV90b191c2JkZXYoaW50ZikpIHsKKwkJRXJyKCJwd2NfZGlzY29ubmVjdCgpIFdvb3BzOiBwb2ludGVyIG1pc21hdGNoIHVkZXYvcGRldi5cbiIpOworCQlnb3RvIGRpc2Nvbm5lY3Rfb3V0OworCX0KKyNpZmRlZiBQV0NfTUFHSUMJCisJaWYgKHBkZXYtPm1hZ2ljICE9IFBXQ19NQUdJQykgeworCQlFcnIoInB3Y19kaXNjb25uZWN0KCkgTWFnaWMgbnVtYmVyIGZhaWxlZC4gQ29uc3VsdCB5b3VyIHNjcm9sbHMgYW5kIHRyeSBhZ2Fpbi5cbiIpOworCQlnb3RvIGRpc2Nvbm5lY3Rfb3V0OworCX0KKyNlbmRpZgorCQorCS8qIFdlIGdvdCB1bnBsdWdnZWQ7IHRoaXMgaXMgc2lnbmFsbGVkIGJ5IGFuIEVQSVBFIGVycm9yIGNvZGUgKi8KKwlpZiAocGRldi0+dm9wZW4pIHsKKwkJSW5mbygiRGlzY29ubmVjdGVkIHdoaWxlIHdlYmNhbSBpcyBpbiB1c2UhXG4iKTsKKwkJcGRldi0+ZXJyb3Jfc3RhdHVzID0gRVBJUEU7CisJfQorCisJLyogQWxlcnQgd2FpdGluZyBwcm9jZXNzZXMgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBkZXYtPmZyYW1lcSk7CisJLyogV2FpdCB1bnRpbCBkZXZpY2UgaXMgY2xvc2VkICovCisJd2hpbGUgKHBkZXYtPnZvcGVuKQorCQlzY2hlZHVsZSgpOworCS8qIERldmljZSBpcyBub3cgY2xvc2VkLCBzbyB3ZSBjYW4gc2FmZWx5IHVucmVnaXN0ZXIgaXQgKi8KKwlUcmFjZShUUkFDRV9QUk9CRSwgIlVucmVnaXN0ZXJpbmcgdmlkZW8gZGV2aWNlIGluIGRpc2Nvbm5lY3QoKS5cbiIpOworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHBkZXYtPnZkZXYpOworCisJLyogRnJlZSBtZW1vcnkgKGRvbid0IHNldCBwZGV2IHRvIDAganVzdCB5ZXQpICovCisJa2ZyZWUocGRldik7CisKK2Rpc2Nvbm5lY3Rfb3V0OgorCS8qIHNlYXJjaCBkZXZpY2VfaGludFtdIHRhYmxlIGlmIHdlIG9jY3VweSBhIHNsb3QsIGJ5IGFueSBjaGFuY2UgKi8KKwlmb3IgKGhpbnQgPSAwOyBoaW50IDwgTUFYX0RFVl9ISU5UUzsgaGludCsrKQorCQlpZiAoZGV2aWNlX2hpbnRbaGludF0ucGRldiA9PSBwZGV2KQorCQkJZGV2aWNlX2hpbnRbaGludF0ucGRldiA9IE5VTEw7CisKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKKworLyogKmdydW50KiBXZSBoYXZlIHRvIGRvIGF0b2kgb3Vyc2VsdmVzIDotKCAqLworc3RhdGljIGludCBwd2NfYXRvaShjb25zdCBjaGFyICpzKQoreworCWludCBrID0gMDsKKworCWsgPSAwOworCXdoaWxlICgqcyAhPSAnXDAnICYmICpzID49ICcwJyAmJiAqcyA8PSAnOScpIHsKKwkJayA9IDEwICogayArICgqcyAtICcwJyk7CisJCXMrKzsKKwl9CisJcmV0dXJuIGs7Cit9CisKKworLyogCisgKiBJbml0aWFsaXphdGlvbiBjb2RlICYgbW9kdWxlIHN0dWZmIAorICovCisKK3N0YXRpYyBjaGFyIHNpemVbMTBdOworc3RhdGljIGludCBmcHMgPSAwOworc3RhdGljIGludCBmYnVmcyA9IDA7CitzdGF0aWMgaW50IG1idWZzID0gMDsKK3N0YXRpYyBpbnQgdHJhY2UgPSAtMTsKK3N0YXRpYyBpbnQgY29tcHJlc3Npb24gPSAtMTsKK3N0YXRpYyBpbnQgbGVkc1syXSA9IHsgLTEsIC0xIH07CitzdGF0aWMgY2hhciAqZGV2X2hpbnRbTUFYX0RFVl9ISU5UU10gPSB7IH07CisKK21vZHVsZV9wYXJhbV9zdHJpbmcoc2l6ZSwgc2l6ZSwgc2l6ZW9mKHNpemUpLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2l6ZSwgIkluaXRpYWwgaW1hZ2Ugc2l6ZS4gT25lIG9mIHNxY2lmLCBxc2lmLCBxY2lmLCBzaWYsIGNpZiwgdmdhIik7Cittb2R1bGVfcGFyYW0oZnBzLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhmcHMsICJJbml0aWFsIGZyYW1lcyBwZXIgc2Vjb25kLiBWYXJpZXMgd2l0aCBtb2RlbCwgdXNlZnVsIHJhbmdlIDUtMzAiKTsKK21vZHVsZV9wYXJhbShmYnVmcywgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZmJ1ZnMsICJOdW1iZXIgb2YgaW50ZXJuYWwgZnJhbWUgYnVmZmVycyB0byByZXNlcnZlIik7Cittb2R1bGVfcGFyYW0obWJ1ZnMsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1idWZzLCAiTnVtYmVyIG9mIGV4dGVybmFsIChtbWFwKCllZCkgaW1hZ2UgYnVmZmVycyIpOworbW9kdWxlX3BhcmFtKHRyYWNlLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyh0cmFjZSwgIkZvciBkZWJ1Z2dpbmcgcHVycG9zZXMiKTsKK21vZHVsZV9wYXJhbShwb3dlcl9zYXZlLCBib29sLCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG93ZXJfc2F2ZSwgIlR1cm4gcG93ZXIgc2F2ZSBmZWF0dXJlIGluIGNhbWVyYSBvbiBvciBvZmYiKTsKK21vZHVsZV9wYXJhbShjb21wcmVzc2lvbiwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY29tcHJlc3Npb24sICJQcmVmZXJyZWQgY29tcHJlc3Npb24gcXVhbGl0eS4gUmFuZ2UgMCAodW5jb21wcmVzc2VkKSB0byAzIChoaWdoIGNvbXByZXNzaW9uKSIpOworbW9kdWxlX3BhcmFtX2FycmF5KGxlZHMsIGludCwgTlVMTCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxlZHMsICJMRUQgb24sb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZGV2X2hpbnQsIGNoYXJwLCBOVUxMLCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X2hpbnQsICJEZXZpY2Ugbm9kZSBoaW50cyIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgJiBPRU0gVVNCIHdlYmNhbSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkx1YyBTYWlsbGFyZCA8bHVjQHNhaWxsYXJkLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgdXNiX3B3Y19pbml0KHZvaWQpCit7CisJaW50IGksIHN6OworCWNoYXIgKnNpemVuYW1lc1tQU1pfTUFYXSA9IHsgInNxY2lmIiwgInFzaWYiLCAicWNpZiIsICJzaWYiLCAiY2lmIiwgInZnYSIgfTsKKworCUluZm8oIlBoaWxpcHMgd2ViY2FtIG1vZHVsZSB2ZXJzaW9uICIgUFdDX1ZFUlNJT04gIiBsb2FkZWQuXG4iKTsKKwlJbmZvKCJTdXBwb3J0cyBQaGlsaXBzIFBDQTY0NS82NDYsIFBDVkM2NzUvNjgwLzY5MCwgUENWQzcyMFs0MF0vNzMwLzc0MC83NTAgJiBQQ1ZDODMwLzg0MC5cbiIpOworCUluZm8oIkFsc28gc3VwcG9ydHMgdGhlIEFza2V5IFZDMDEwLCB2YXJpb3VzIExvZ2l0ZWNoIFF1aWNrY2FtcywgU2Ftc3VuZyBNUEMtQzEwIGFuZCBNUEMtQzMwLFxuIik7CisJSW5mbygidGhlIENyZWF0aXZlIFdlYkNhbSA1ICYgUHJvIEV4LCBTT1RFQyBBZmluYSBFeWUgYW5kIFZpc2lvbml0ZSBWQ1MtVUMzMDAgYW5kIFZDUy1VTTEwMC5cbiIpOworCisJaWYgKGZwcykgeworCQlpZiAoZnBzIDwgNCB8fCBmcHMgPiAzMCkgeworCQkJRXJyKCJGcmFtZXJhdGUgb3V0IG9mIGJvdW5kcyAoNC0zMCkuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWRlZmF1bHRfZnBzID0gZnBzOworCQlJbmZvKCJEZWZhdWx0IGZyYW1lcmF0ZSBzZXQgdG8gJWQuXG4iLCBkZWZhdWx0X2Zwcyk7CisJfQorCisJaWYgKHNpemVbMF0pIHsKKwkJLyogc3RyaW5nOyB0cnkgbWF0Y2hpbmcgd2l0aCBhcnJheSAqLworCQlmb3IgKHN6ID0gMDsgc3ogPCBQU1pfTUFYOyBzeisrKSB7CisJCQlpZiAoIXN0cmNtcChzaXplbmFtZXNbc3pdLCBzaXplKSkgeyAvKiBGb3VuZCEgKi8KKwkJCQlkZWZhdWx0X3NpemUgPSBzejsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoc3ogPT0gUFNaX01BWCkgeworCQkJRXJyKCJTaXplIG5vdCByZWNvZ25pemVkOyB0cnkgc2l6ZT1bc3FjaWYgfCBxc2lmIHwgcWNpZiB8IHNpZiB8IGNpZiB8IHZnYV0uXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCUluZm8oIkRlZmF1bHQgaW1hZ2Ugc2l6ZSBzZXQgdG8gJXMgWyVkeCVkXS5cbiIsIHNpemVuYW1lc1tkZWZhdWx0X3NpemVdLCBwd2NfaW1hZ2Vfc2l6ZXNbZGVmYXVsdF9zaXplXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbZGVmYXVsdF9zaXplXS55KTsKKwl9CisJaWYgKG1idWZzKSB7CisJCWlmIChtYnVmcyA8IDEgfHwgbWJ1ZnMgPiBNQVhfSU1BR0VTKSB7CisJCQlFcnIoIklsbGVnYWwgbnVtYmVyIG9mIG1tYXAoKSBidWZmZXJzOyB1c2UgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAlZC5cbiIsIE1BWF9JTUFHRVMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZGVmYXVsdF9tYnVmcyA9IG1idWZzOworCQlJbmZvKCJOdW1iZXIgb2YgaW1hZ2UgYnVmZmVycyBzZXQgdG8gJWQuXG4iLCBkZWZhdWx0X21idWZzKTsKKwl9CisJaWYgKGZidWZzKSB7CisJCWlmIChmYnVmcyA8IDIgfHwgZmJ1ZnMgPiBNQVhfRlJBTUVTKSB7CisJCQlFcnIoIklsbGVnYWwgbnVtYmVyIG9mIGZyYW1lIGJ1ZmZlcnM7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDIgYW5kICVkLlxuIiwgTUFYX0ZSQU1FUyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkZWZhdWx0X2ZidWZzID0gZmJ1ZnM7CisJCUluZm8oIk51bWJlciBvZiBmcmFtZSBidWZmZXJzIHNldCB0byAlZC5cbiIsIGRlZmF1bHRfZmJ1ZnMpOworCX0KKwlpZiAodHJhY2UgPj0gMCkgeworCQlJbmZvKCJUcmFjZSBvcHRpb25zOiAweCUwNHhcbiIsIHRyYWNlKTsKKwkJcHdjX3RyYWNlID0gdHJhY2U7CisJfQorCWlmIChjb21wcmVzc2lvbiA+PSAwKSB7CisJCWlmIChjb21wcmVzc2lvbiA+IDMpIHsKKwkJCUVycigiSW52YWxpZCBjb21wcmVzc2lvbiBzZXR0aW5nOyB1c2UgYSBudW1iZXIgYmV0d2VlbiAwICh1bmNvbXByZXNzZWQpIGFuZCAzIChoaWdoKS5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcHdjX3ByZWZlcnJlZF9jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uOworCQlJbmZvKCJQcmVmZXJyZWQgY29tcHJlc3Npb24gc2V0IHRvICVkLlxuIiwgcHdjX3ByZWZlcnJlZF9jb21wcmVzc2lvbik7CisJfQorCWlmIChwb3dlcl9zYXZlKQorCQlJbmZvKCJFbmFibGluZyBwb3dlciBzYXZlIG9uIG9wZW4vY2xvc2UuXG4iKTsKKwlpZiAobGVkc1swXSA+PSAwKQorCQlsZWRfb24gPSBsZWRzWzBdOworCWlmIChsZWRzWzFdID49IDApCisJCWxlZF9vZmYgPSBsZWRzWzFdOworCisJLyogQmlnIGRldmljZSBub2RlIHdob29wbGEuIEJhc2ljbHksIGl0IGFsbG93cyB5b3UgdG8gYXNzaWduIGEKKwkgICBkZXZpY2Ugbm9kZSAoL2Rldi92aWRlb1gpIHRvIGEgY2FtZXJhLCBiYXNlZCBvbiBpdHMgdHlwZQorCSAgICYgc2VyaWFsIG51bWJlci4gVGhlIGZvcm1hdCBpcyBbdHlwZVsuc2VyaWFsbnVtYmVyXTpdbm9kZS4KKworCSAgIEFueSBjYW1lcmEgdGhhdCBpc24ndCBtYXRjaGVkIGJ5IHRoZXNlIHJ1bGVzIGdldHMgdGhlIG5leHQKKwkgICBhdmFpbGFibGUgZnJlZSBkZXZpY2Ugbm9kZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RFVl9ISU5UUzsgaSsrKSB7CisJCWNoYXIgKnMsICpjb2xvbiwgKmRvdDsKKworCQkvKiBUaGlzIGxvb3AgYWxzbyBpbml0aWFsaXplcyB0aGUgYXJyYXkgKi8KKwkJZGV2aWNlX2hpbnRbaV0ucGRldiA9IE5VTEw7CisJCXMgPSBkZXZfaGludFtpXTsKKwkJaWYgKHMgIT0gTlVMTCAmJiAqcyAhPSAnXDAnKSB7CisJCQlkZXZpY2VfaGludFtpXS50eXBlID0gLTE7IC8qIHdpbGRjYXJkICovCisJCQlzdHJjcHkoZGV2aWNlX2hpbnRbaV0uc2VyaWFsX251bWJlciwgIioiKTsKKworCQkJLyogcGFyc2Ugc3RyaW5nOiBjaG9wIGF0ICc6JyAmICcvJyAqLworCQkJY29sb24gPSBkb3QgPSBzOworCQkJd2hpbGUgKCpjb2xvbiAhPSAnXDAnICYmICpjb2xvbiAhPSAnOicpCisJCQkJY29sb24rKzsKKwkJCXdoaWxlICgqZG90ICE9ICdcMCcgJiYgKmRvdCAhPSAnLicpCisJCQkJZG90Kys7CisJCQkvKiBGZXcgc2FuaXR5IGNoZWNrcyAqLworCQkJaWYgKCpkb3QgIT0gJ1wwJyAmJiBkb3QgPiBjb2xvbikgeworCQkJCUVycigiTWFsZm9ybWVkIGNhbWVyYSBoaW50OiB0aGUgY29sb24gbXVzdCBiZSBhZnRlciB0aGUgZG90LlxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmICgqY29sb24gPT0gJ1wwJykgeworCQkJCS8qIE5vIGNvbG9uICovCisJCQkJaWYgKCpkb3QgIT0gJ1wwJykgeworCQkJCQlFcnIoIk1hbGZvcm1lZCBjYW1lcmEgaGludDogbm8gY29sb24gKyBkZXZpY2Ugbm9kZSBnaXZlbi5cbiIpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCS8qIE5vIHR5cGUgb3Igc2VyaWFsIG51bWJlciBzcGVjaWZpZWQsIGp1c3QgYSBudW1iZXIuICovCisJCQkJCWRldmljZV9oaW50W2ldLmRldmljZV9ub2RlID0gcHdjX2F0b2kocyk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJLyogVGhlcmUncyBhIGNvbG9uLCBzbyB3ZSBoYXZlIGF0IGxlYXN0IGEgdHlwZSBhbmQgYSBkZXZpY2Ugbm9kZSAqLworCQkJCWRldmljZV9oaW50W2ldLnR5cGUgPSBwd2NfYXRvaShzKTsKKwkJCQlkZXZpY2VfaGludFtpXS5kZXZpY2Vfbm9kZSA9IHB3Y19hdG9pKGNvbG9uICsgMSk7CisJCQkJaWYgKCpkb3QgIT0gJ1wwJykgeworCQkJCQkvKiBUaGVyZSdzIGEgc2VyaWFsIG51bWJlciBhcyB3ZWxsICovCisJCQkJCWludCBrOworCQkJCQkKKwkJCQkJZG90Kys7CisJCQkJCWsgPSAwOworCQkJCQl3aGlsZSAoKmRvdCAhPSAnOicgJiYgayA8IDI5KSB7CisJCQkJCQlkZXZpY2VfaGludFtpXS5zZXJpYWxfbnVtYmVyW2srK10gPSAqZG90OworCQkJCQkJZG90Kys7CisJCQkJCX0KKwkJCQkJZGV2aWNlX2hpbnRbaV0uc2VyaWFsX251bWJlcltrXSA9ICdcMCc7CisJCQkJfQorCQkJfQorI2lmIFBXQ19ERUJVRwkJCisJCQlEZWJ1ZygiZGV2aWNlX2hpbnRbJWRdOlxuIiwgaSk7CisJCQlEZWJ1ZygiICB0eXBlICAgIDogJWRcbiIsIGRldmljZV9oaW50W2ldLnR5cGUpOworCQkJRGVidWcoIiAgc2VyaWFsIyA6ICVzXG4iLCBkZXZpY2VfaGludFtpXS5zZXJpYWxfbnVtYmVyKTsKKwkJCURlYnVnKCIgIG5vZGUgICAgOiAlZFxuIiwgZGV2aWNlX2hpbnRbaV0uZGV2aWNlX25vZGUpOworI2VuZGlmCQkJCisJCX0KKwkJZWxzZQorCQkJZGV2aWNlX2hpbnRbaV0udHlwZSA9IDA7IC8qIG5vdCBmaWxsZWQgKi8KKwl9IC8qIC4uZm9yIE1BWF9ERVZfSElOVFMgKi8KKworIAlUcmFjZShUUkFDRV9QUk9CRSwgIlJlZ2lzdGVyaW5nIGRyaXZlciBhdCBhZGRyZXNzIDB4JXAuXG4iLCAmcHdjX2RyaXZlcik7CisJcmV0dXJuIHVzYl9yZWdpc3RlcigmcHdjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2JfcHdjX2V4aXQodm9pZCkKK3sKKwlUcmFjZShUUkFDRV9NT0RVTEUsICJEZXJlZ2lzdGVyaW5nIGRyaXZlci5cbiIpOworCXVzYl9kZXJlZ2lzdGVyKCZwd2NfZHJpdmVyKTsKKwlJbmZvKCJQaGlsaXBzIHdlYmNhbSBtb2R1bGUgcmVtb3ZlZC5cbiIpOworfQorCittb2R1bGVfaW5pdCh1c2JfcHdjX2luaXQpOworbW9kdWxlX2V4aXQodXNiX3B3Y19leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1pb2N0bC5oIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ODA1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWlvY3RsLmgKQEAgLTAsMCArMSwyOTIgQEAKKyNpZm5kZWYgUFdDX0lPQ1RMX0gKKyNkZWZpbmUgUFdDX0lPQ1RMX0gKKworLyogKEMpIDIwMDEtMjAwNCBOZW1vc29mdCBVbnYuCisgICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKy8qIFRoaXMgaXMgcHdjLWlvY3RsLmggYmVsb25naW5nIHRvIFBXQyA4LjEyLjEKKyAgIEl0IGNvbnRhaW5zIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMgdG8gY29tbXVuaWNhdGUgZnJvbSB1c2VyIHNwYWNlCisgICBkaXJlY3RseSB0byB0aGUgZHJpdmVyLgorICovCisKKy8qCisgICBDaGFuZ2VzCisgICAyMDAxLzA4LzAzICBBbHZhcmFkbyAgIEFkZGVkIGlvY3RsIGNvbnN0YW50cyB0byBhY2Nlc3MgbWV0aG9kcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdpbmcgd2hpdGUgYmFsYW5jZSBhbmQgcmVkL2JsdWUgZ2FpbnMKKyAgIDIwMDIvMTIvMTUgIEcuIEguIEZlcm5hbmRlei1Ub3JpYmlvICAgVklESU9DR1JFQUxTSVpFCisgICAyMDAzLzEyLzEzICBOZW1vc2Z0IFVudi4gU29tZSBtb2RpZmljYXRpb25zIHRvIG1ha2UgaW50ZXJmYWNpbmcgdG8KKyAgICAgICAgICAgICAgIFBXQ1ggZWFzaWVyCisgKi8KKworLyogVGhlc2UgYXJlIHByaXZhdGUgaW9jdGwoKSBjb21tYW5kcywgc3BlY2lmaWMgZm9yIHRoZSBQaGlsaXBzIHdlYmNhbXMuCisgICBUaGV5IGNvbnRhaW4gZnVuY3Rpb25zIG5vdCBmb3VuZCBpbiBvdGhlciB3ZWJjYW1zLCBhbmQgc2V0dGluZ3Mgbm90CisgICBzcGVjaWZpZWQgaW4gdGhlIFZpZGVvNExpbnV4IEFQSS4KKworICAgVGhlICNkZWZpbmUgbmFtZXMgYXJlIGJ1aWx0IHVwIGxpa2UgZm9sbG93czoKKyAgIFZJRElPQwkJVklEZW8gSU9DdGwgcHJlZml4CisgICAgICAgICBQV0MJCVBoaWxwcyBXZWJDYW0KKyAgICAgICAgICAgIEcgICAgICAgICAgIG9wdGlvbmFsOiBHZXQKKyAgICAgICAgICAgIFMgICAgICAgICAgIG9wdGlvbmFsOiBTZXQKKyAgICAgICAgICAgICAuLi4gCXRoZSBmdW5jdGlvbgorICovCisKKworIC8qIEVudW1lcmF0aW9uIG9mIGltYWdlIHNpemVzICovCisjZGVmaW5lIFBTWl9TUUNJRgkweDAwCisjZGVmaW5lIFBTWl9RU0lGCTB4MDEKKyNkZWZpbmUgUFNaX1FDSUYJMHgwMgorI2RlZmluZSBQU1pfU0lGCQkweDAzCisjZGVmaW5lIFBTWl9DSUYJCTB4MDQKKyNkZWZpbmUgUFNaX1ZHQQkJMHgwNQorI2RlZmluZSBQU1pfTUFYCQk2CisKKworLyogVGhlIGZyYW1lIHJhdGUgaXMgZW5jb2RlZCBpbiB0aGUgdmlkZW9fd2luZG93LmZsYWdzIHBhcmFtZXRlciB1c2luZworICAgdGhlIHVwcGVyIDE2IGJpdHMsIHNpbmNlIHNvbWUgZmxhZ3MgYXJlIGRlZmluZWQgbm93YWRheXMuIFRoZSBmb2xsb3dpbmcKKyAgIGRlZmluZXMgcHJvdmlkZSBhIG1hc2sgYW5kIHNoaWZ0IHRvIGZpbHRlciBvdXQgdGhpcyB2YWx1ZS4KKworICAgSW4gJ1NuYXBzaG90JyBtb2RlIHRoZSBjYW1lcmEgZnJlZXplcyBpdHMgYXV0b21hdGljIGV4cG9zdXJlIGFuZCBjb2xvdXIKKyAgIGJhbGFuY2UgY29udHJvbHMuCisgKi8KKyNkZWZpbmUgUFdDX0ZQU19TSElGVAkJMTYKKyNkZWZpbmUgUFdDX0ZQU19NQVNLCQkweDAwRkYwMDAwCisjZGVmaW5lIFBXQ19GUFNfRlJNQVNLCQkweDAwM0YwMDAwCisjZGVmaW5lIFBXQ19GUFNfU05BUFNIT1QJMHgwMDQwMDAwMAorCisKKy8qIHN0cnVjdHVyZSBmb3IgdHJhbnNmZXJpbmcgeCAmIHkgY29vcmRpbmF0ZXMgKi8KK3N0cnVjdCBwd2NfY29vcmQKK3sKKwlpbnQgeCwgeTsJCS8qIGd1ZXNzIHdoYXQgKi8KKwlpbnQgc2l6ZTsJCS8qIHNpemUsIG9yIG9mZnNldCAqLworfTsKKworCisvKiBVc2VkIHdpdGggVklESU9DUFdDUFJPQkUgKi8KK3N0cnVjdCBwd2NfcHJvYmUKK3sKKwljaGFyIG5hbWVbMzJdOworCWludCB0eXBlOworfTsKKworc3RydWN0IHB3Y19zZXJpYWwKK3sKKwljaGFyIHNlcmlhbFszMF07CS8qIFN0cmluZyB3aXRoIHNlcmlhbCBudW1iZXIuIENvbnRhaW5zIHRlcm1pbmF0aW5nIDAgKi8KK307CisJCisvKiBwd2Nfd2hpdGViYWxhbmNlLm1vZGUgdmFsdWVzICovCisjZGVmaW5lIFBXQ19XQl9JTkRPT1IJCTAKKyNkZWZpbmUgUFdDX1dCX09VVERPT1IJCTEKKyNkZWZpbmUgUFdDX1dCX0ZMCQkyCisjZGVmaW5lIFBXQ19XQl9NQU5VQUwJCTMKKyNkZWZpbmUgUFdDX1dCX0FVVE8JCTQKKworLyogVXNlZCB3aXRoIFZJRElPQ1BXQ1tTR11BV0IgKEF1dG8gV2hpdGUgQmFsYW5jZSkuIAorICAgU2V0IG1vZGUgdG8gb25lIG9mIHRoZSBQV0NfV0JfKiB2YWx1ZXMgYWJvdmUuCisgICAqcmVkIGFuZCAqYmx1ZSBhcmUgdGhlIHJlc3BlY3RpdmUgZ2FpbnMgb2YgdGhlc2UgY29sb3VyIGNvbXBvbmVudHMgaW5zaWRlIAorICAgdGhlIGNhbWVyYTsgcmFuZ2UgMC4uNjU1MzUKKyAgIFdoZW4gJ21vZGUnID09IFBXQ19XQl9NQU5VQUwsICdtYW51YWxfcmVkJyBhbmQgJ21hbnVhbF9ibHVlJyBhcmUgc2V0IG9yIHJlYWQ7IAorICAgb3RoZXJ3aXNlIHVuZGVmaW5lZC4KKyAgICdyZWFkX3JlZCcgYW5kICdyZWFkX2JsdWUnIGFyZSByZWFkLW9ubHkuCisqLyAgIAorc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UKK3sKKwlpbnQgbW9kZTsKKwlpbnQgbWFudWFsX3JlZCwgbWFudWFsX2JsdWU7CS8qIFIvVyAqLworCWludCByZWFkX3JlZCwgcmVhZF9ibHVlOwkvKiBSL08gKi8KK307CisKKy8qIAorICAgJ2NvbnRyb2xfc3BlZWQnIGFuZCAnY29udHJvbF9kZWxheScgYXJlIHVzZWQgaW4gYXV0b21hdGljIHdoaXRlYmFsYW5jZSBtb2RlLAorICAgYW5kIHRlbGwgdGhlIGNhbWVyYSBob3cgZmFzdCBpdCBzaG91bGQgcmVhY3QgdG8gY2hhbmdlcyBpbiBsaWdodGluZywgYW5kIAorICAgd2l0aCBob3cgbXVjaCBkZWxheS4gVmFsaWQgdmFsdWVzIGFyZSAwLi42NTUzNS4KKyovCitzdHJ1Y3QgcHdjX3diX3NwZWVkCit7CisJaW50IGNvbnRyb2xfc3BlZWQ7CisJaW50IGNvbnRyb2xfZGVsYXk7CisKK307CisKKy8qIFVzZWQgd2l0aCBWSURJT0NQV0NbU0ddTEVEICovCitzdHJ1Y3QgcHdjX2xlZHMKK3sKKwlpbnQgbGVkX29uOwkJCS8qIExlZCBvbi10aW1lOyByYW5nZSA9IDAuLjI1MDAwICovCisJaW50IGxlZF9vZmY7CQkJLyogTGVkIG9mZi10aW1lOyByYW5nZSA9IDAuLjI1MDAwICAqLworfTsKKworLyogSW1hZ2Ugc2l6ZSAodXNlZCB3aXRoIEdSRUFMU0laRSkgKi8KK3N0cnVjdCBwd2NfaW1hZ2VzaXplCit7CisJaW50IHdpZHRoOworCWludCBoZWlnaHQ7Cit9OworCisvKiBEZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzIGZvciBNb3Rvcml6ZWQgUGFuICYgVGlsdCAqLworI2RlZmluZSBQV0NfTVBUX1BBTgkJMHgwMQorI2RlZmluZSBQV0NfTVBUX1RJTFQJCTB4MDIKKyNkZWZpbmUgUFdDX01QVF9USU1FT1VUCQkweDA0IC8qIGZvciBzdGF0dXMgKi8KKworLyogU2V0IGFuZ2xlczsgd2hlbiBhYnNvbHV0ZSAhPSAwLCB0aGUgYW5nbGUgaXMgYWJzb2x1dGUgYW5kIHRoZSAKKyAgIGRyaXZlciBjYWxjdWxhdGVzIHRoZSByZWxhdGl2ZSBvZmZzZXQgZm9yIHlvdS4gVGhpcyBjYW4gb25seQorICAgYmUgdXNlZCB3aXRoIFZJRElPQ1BXQ1NBTkdMRTsgVklESU9DUFdDR0FOR0xFIGFsd2F5cyByZXR1cm5zCisgICBhYnNvbHV0ZSBhbmdsZXMuCisgKi8gICAKK3N0cnVjdCBwd2NfbXB0X2FuZ2xlcworeworCWludCBhYnNvbHV0ZTsJCS8qIHdyaXRlLW9ubHkgKi8KKwlpbnQgcGFuOwkJLyogZGVncmVlcyAqIDEwMCAqLworCWludCB0aWx0OwkJLyogZGVncmVzcyAqIDEwMCAqLworfTsKKworLyogUmFuZ2Ugb2YgYW5nbGVzIG9mIHRoZSBjYW1lcmEsIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5LgorICovCitzdHJ1Y3QgcHdjX21wdF9yYW5nZQoreworCWludCBwYW5fbWluLCBwYW5fbWF4OwkJLyogZGVncmVlcyAqIDEwMCAqLworCWludCB0aWx0X21pbiwgdGlsdF9tYXg7Cit9OworCitzdHJ1Y3QgcHdjX21wdF9zdGF0dXMKK3sKKwlpbnQgc3RhdHVzOworCWludCB0aW1lX3BhbjsKKwlpbnQgdGltZV90aWx0OworfTsKKworCisvKiBUaGlzIGlzIHVzZWQgZm9yIG91dC1vZi1rZXJuZWwgZGVjb21wcmVzc2lvbi4gV2l0aCBpdCwgeW91IGNhbiBnZXQKKyAgIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGluaXRpYWxpemUgYW5kIHVzZSB0aGUgZGVjb21wcmVzc29yCisgICByb3V0aW5lcyBpbiBzdGFuZGFsb25lIGFwcGxpY2F0aW9ucy4KKyAqLyAgIAorc3RydWN0IHB3Y192aWRlb19jb21tYW5kCit7CisJaW50IHR5cGU7CQkvKiBjYW1lcmEgdHlwZSAoNjQ1LCA2NzUsIDczMCwgZXRjLikgKi8KKwlpbnQgcmVsZWFzZTsJCS8qIHJlbGVhc2UgbnVtYmVyICovCisKKyAgICAgICAgaW50IHNpemU7CQkvKiBvbmUgb2YgUFNaXyogKi8KKyAgICAgICAgaW50IGFsdGVybmF0ZTsKKwlpbnQgY29tbWFuZF9sZW47CS8qIGxlbmd0aCBvZiBVU0IgdmlkZW8gY29tbWFuZCAqLworCXVuc2lnbmVkIGNoYXIgY29tbWFuZF9idWZbMTNdOwkvKiBBY3R1YWwgVVNCIHZpZGVvIGNvbW1hbmQgKi8KKwlpbnQgYmFuZGxlbmd0aDsJCS8qID4wID0gY29tcHJlc3NlZCAqLworCWludCBmcmFtZV9zaXplOwkJLyogU2l6ZSBvZiBvbmUgKHVuKWNvbXByZXNzZWQgZnJhbWUgKi8KK307CisKKy8qIEZsYWdzIGZvciBQV0NYIHN1YnJvdXRpbmVzLiBOb3QgYWxsIG1vZHVsZXMgaG9ub3VyIGFsbCBmbGFncy4gKi8KKyNkZWZpbmUgUFdDWF9GTEFHX1BMQU5BUgkweDAwMDEKKyNkZWZpbmUgUFdDWF9GTEFHX0JBWUVSCQkweDAwMDgKKworCisvKiBJT0NUTCBkZWZpbml0aW9ucyAqLworCisgLyogUmVzdG9yZSB1c2VyIHNldHRpbmdzICovCisjZGVmaW5lIFZJRElPQ1BXQ1JVU0VSCQlfSU8oJ3YnLCAxOTIpCisgLyogU2F2ZSB1c2VyIHNldHRpbmdzICovCisjZGVmaW5lIFZJRElPQ1BXQ1NVU0VSCQlfSU8oJ3YnLCAxOTMpCisgLyogUmVzdG9yZSBmYWN0b3J5IHNldHRpbmdzICovCisjZGVmaW5lIFZJRElPQ1BXQ0ZBQ1RPUlkJX0lPKCd2JywgMTk0KQorCisgLyogWW91IGNhbiBtYW5pcHVsYXRlIHRoZSBjb21wcmVzc2lvbiBmYWN0b3IuIEEgY29tcHJlc3Npb24gcHJlZmVyZW5jZSBvZiAwCisgICAgbWVhbnMgdXNlIHVuY29tcHJlc3NlZCBtb2RlcyB3aGVuIGF2YWlsYWJsZTsgMSBpcyBsb3cgY29tcHJlc3Npb24sIDIgaXMKKyAgICBtZWRpdW0gYW5kIDMgaXMgaGlnaCBjb21wcmVzc2lvbiBwcmVmZXJyZWQuIE9mIGNvdXJzZSwgdGhlIGhpZ2hlciB0aGUKKyAgICBjb21wcmVzc2lvbiwgdGhlIGxvd2VyIHRoZSBiYW5kd2lkdGggdXNlZCBidXQgbW9yZSBjaGFuY2Ugb2YgYXJ0ZWZhY3RzCisgICAgaW4gdGhlIGltYWdlLiBUaGUgZHJpdmVyIGF1dG9tYXRpY2FsbHkgY2hvb3NlcyBhIGhpZ2hlciBjb21wcmVzc2lvbiB3aGVuCisgICAgdGhlIHByZWZlcnJlZCBtb2RlIGlzIG5vdCBhdmFpbGFibGUuCisgICovCisgLyogU2V0IHByZWZlcnJlZCBjb21wcmVzc2lvbiBxdWFsaXR5ICgwID0gdW5jb21wcmVzc2VkLCAzID0gaGlnaGVzdCBjb21wcmVzc2lvbikgKi8KKyNkZWZpbmUgVklESU9DUFdDU0NRVUFMCQlfSU9XKCd2JywgMTk1LCBpbnQpCisgLyogR2V0IHByZWZlcnJlZCBjb21wcmVzc2lvbiBxdWFsaXR5ICovCisjZGVmaW5lIFZJRElPQ1BXQ0dDUVVBTAkJX0lPUigndicsIDE5NSwgaW50KQorCisKKy8qIFJldHJpZXZlIHNlcmlhbCBudW1iZXIgb2YgY2FtZXJhICovCisjZGVmaW5lIFZJRElPQ1BXQ0dTRVJJQUwJX0lPUigndicsIDE5OCwgc3RydWN0IHB3Y19zZXJpYWwpCisKKyAvKiBUaGlzIGlzIGEgcHJvYmUgZnVuY3Rpb247IHNpbmNlIHNvIG1hbnkgZGV2aWNlcyBhcmUgc3VwcG9ydGVkLCBpdAorICAgIGJlY29tZXMgZGlmZmljdWx0IHRvIGluY2x1ZGUgYWxsIHRoZSBuYW1lcyBpbiBwcm9ncmFtcyB0aGF0IHdhbnQgdG8KKyAgICBjaGVjayBmb3IgdGhlIGVuaGFuY2VkIFBoaWxpcHMgc3R1ZmYuIFNvIGluIHN0ZWFkLCB0cnkgdGhpcyBQUk9CRTsKKyAgICBpdCByZXR1cm5zIGEgc3RydWN0dXJlIHdpdGggdGhlIG9yaWdpbmFsIG5hbWUsIGFuZCB0aGUgY29ycmVzcG9uZGluZworICAgIFBoaWxpcHMgdHlwZS4KKyAgICBUbyB1c2UsIGZpbGwgdGhlIHN0cnVjdHVyZSB3aXRoIHplcm9lcywgY2FsbCBQUk9CRSBhbmQgaWYgdGhhdCBzdWNjZWVkcywKKyAgICBjb21wYXJlIHRoZSBuYW1lIHdpdGggdGhhdCByZXR1cm5lZCBmcm9tIFZJRElPQ0dDQVA7IHRoZXkgc2hvdWxkIGJlIHRoZQorICAgIHNhbWUuIElmIHNvLCB5b3UgY2FuIGJlIGFzc3VyZWQgaXQgaXMgYSBQaGlsaXBzIChPRU0pIGNhbSBhbmQgdGhlIHR5cGUKKyAgICBpcyB2YWxpZC4KKyAqLworI2RlZmluZSBWSURJT0NQV0NQUk9CRQkJX0lPUigndicsIDE5OSwgc3RydWN0IHB3Y19wcm9iZSkKKworIC8qIFNldCBBR0MgKEF1dG9tYXRpYyBHYWluIENvbnRyb2wpOyBpbnQgPCAwID0gYXV0bywgMC4uNjU1MzUgPSBmaXhlZCAqLworI2RlZmluZSBWSURJT0NQV0NTQUdDCQlfSU9XKCd2JywgMjAwLCBpbnQpCisgLyogR2V0IEFHQzsgaW50IDwgMCA9IGF1dG87ID49IDAgPSBmaXhlZCwgcmFuZ2UgMC4uNjU1MzUgKi8KKyNkZWZpbmUgVklESU9DUFdDR0FHQwkJX0lPUigndicsIDIwMCwgaW50KQorIC8qIFNldCBzaHV0dGVyIHNwZWVkOyBpbnQgPCAwID0gYXV0bzsgPj0gMCA9IGZpeGVkLCByYW5nZSAwLi42NTUzNSAqLworI2RlZmluZSBWSURJT0NQV0NTU0hVVFRFUglfSU9XKCd2JywgMjAxLCBpbnQpCisKKyAvKiBDb2xvciBjb21wZW5zYXRpb24gKEF1dG8gV2hpdGUgQmFsYW5jZSkgKi8KKyNkZWZpbmUgVklESU9DUFdDU0FXQiAgICAgICAgICAgX0lPVygndicsIDIwMiwgc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UpCisjZGVmaW5lIFZJRElPQ1BXQ0dBV0IgICAgICAgICAgIF9JT1IoJ3YnLCAyMDIsIHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlKQorCisgLyogQXV0byBXQiBzcGVlZCAqLworI2RlZmluZSBWSURJT0NQV0NTQVdCU1BFRUQJX0lPVygndicsIDIwMywgc3RydWN0IHB3Y193Yl9zcGVlZCkKKyNkZWZpbmUgVklESU9DUFdDR0FXQlNQRUVECV9JT1IoJ3YnLCAyMDMsIHN0cnVjdCBwd2Nfd2Jfc3BlZWQpCisKKyAvKiBMRURzIG9uL29mZi9ibGluazsgaW50IHJhbmdlIDAuLjY1NTM1ICovCisjZGVmaW5lIFZJRElPQ1BXQ1NMRUQgICAgICAgICAgIF9JT1coJ3YnLCAyMDUsIHN0cnVjdCBwd2NfbGVkcykKKyNkZWZpbmUgVklESU9DUFdDR0xFRCAgICAgICAgICAgX0lPUigndicsIDIwNSwgc3RydWN0IHB3Y19sZWRzKQorCisgIC8qIENvbnRvdXIgKHNoYXJwbmVzcyk7IGludCA8IDAgPSBhdXRvLCAwLi42NTUzNiA9IGZpeGVkICovCisjZGVmaW5lIFZJRElPQ1BXQ1NDT05UT1VSCV9JT1coJ3YnLCAyMDYsIGludCkKKyNkZWZpbmUgVklESU9DUFdDR0NPTlRPVVIJX0lPUigndicsIDIwNiwgaW50KQorCisgIC8qIEJhY2tsaWdodCBjb21wZW5zYXRpb247IDAgPSBvZmYsIG90aGVyd2lzZSBvbiAqLworI2RlZmluZSBWSURJT0NQV0NTQkFDS0xJR0hUCV9JT1coJ3YnLCAyMDcsIGludCkKKyNkZWZpbmUgVklESU9DUFdDR0JBQ0tMSUdIVAlfSU9SKCd2JywgMjA3LCBpbnQpCisKKyAgLyogRmxpY2tlcmxlc3MgbW9kZTsgPSAwIG9mZiwgb3RoZXJ3aXNlIG9uICovCisjZGVmaW5lIFZJRElPQ1BXQ1NGTElDS0VSCV9JT1coJ3YnLCAyMDgsIGludCkKKyNkZWZpbmUgVklESU9DUFdDR0ZMSUNLRVIJX0lPUigndicsIDIwOCwgaW50KSAgCisKKyAgLyogRHluYW1pYyBub2lzZSByZWR1Y3Rpb247IDAgb2ZmLCAzID0gaGlnaCBub2lzZSByZWR1Y3Rpb24gKi8KKyNkZWZpbmUgVklESU9DUFdDU0RZTk5PSVNFCV9JT1coJ3YnLCAyMDksIGludCkKKyNkZWZpbmUgVklESU9DUFdDR0RZTk5PSVNFCV9JT1IoJ3YnLCAyMDksIGludCkKKworIC8qIFJlYWwgaW1hZ2Ugc2l6ZSBhcyB1c2VkIGJ5IHRoZSBjYW1lcmE7IHRlbGxzIHlvdSB3aGV0aGVyIG9yIG5vdCB0aGVyZSdzIGEgZ3JheSBib3JkZXIgYXJvdW5kIHRoZSBpbWFnZSAqLworI2RlZmluZSBWSURJT0NQV0NHUkVBTFNJWkUJX0lPUigndicsIDIxMCwgc3RydWN0IHB3Y19pbWFnZXNpemUpCisKKyAvKiBNb3Rvcml6ZWQgcGFuICYgdGlsdCBmdW5jdGlvbnMgKi8gCisjZGVmaW5lIFZJRElPQ1BXQ01QVFJFU0VUCV9JT1coJ3YnLCAyMTEsIGludCkKKyNkZWZpbmUgVklESU9DUFdDTVBUR1JBTkdFCV9JT1IoJ3YnLCAyMTEsIHN0cnVjdCBwd2NfbXB0X3JhbmdlKQorI2RlZmluZSBWSURJT0NQV0NNUFRTQU5HTEUJX0lPVygndicsIDIxMiwgc3RydWN0IHB3Y19tcHRfYW5nbGVzKQorI2RlZmluZSBWSURJT0NQV0NNUFRHQU5HTEUJX0lPUigndicsIDIxMiwgc3RydWN0IHB3Y19tcHRfYW5nbGVzKQorI2RlZmluZSBWSURJT0NQV0NNUFRTVEFUVVMJX0lPUigndicsIDIxMywgc3RydWN0IHB3Y19tcHRfc3RhdHVzKQorCisgLyogR2V0IHRoZSBVU0Igc2V0LXZpZGVvIGNvbW1hbmQ7IG5lZWRlZCBmb3IgaW5pdGlhbGl6aW5nIGxpYnB3Y3ggKi8KKyNkZWZpbmUgVklESU9DUFdDR1ZJRENNRAlfSU9SKCd2JywgMjE1LCBzdHJ1Y3QgcHdjX3ZpZGVvX2NvbW1hbmQpCitzdHJ1Y3QgcHdjX3RhYmxlX2luaXRfYnVmZmVyIHsKKyAgIGludCBsZW47CisgICBjaGFyICpidWZmZXI7CisKK307CisjZGVmaW5lIFZJRElPQ1BXQ0dWSURUQUJMRQlfSU9SKCd2JywgMjE2LCBzdHJ1Y3QgcHdjX3RhYmxlX2luaXRfYnVmZmVyKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2Mta2lhcmEuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2Mta2lhcmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg1ODAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1raWFyYS5jCkBAIC0wLDAgKzEsODkxIEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKworLyogVGhpcyB0YWJsZXMgY29udGFpbnMgZW50cmllcyBmb3IgdGhlIDczMC83NDAvNzUwIChLaWFyYSkgY2FtZXJhLCB3aXRoCisgICA0IGRpZmZlcmVudCBxdWFsaXRpZXMgKG5vIGNvbXByZXNzaW9uLCBsb3csIG1lZGl1bSwgaGlnaCkuCisgICBJdCBsaXN0cyB0aGUgYmFuZHdpZHRoIHJlcXVpcmVtZW50cyBmb3Igc2FpZCBtb2RlIGJ5IGl0cyBhbHRlcm5hdGUgaW50ZXJmYWNlCisgICBudW1iZXIuIEFuIGFsdGVybmF0ZSBvZiAwIG1lYW5zIHRoYXQgdGhlIG1vZGUgaXMgdW5hdmFpbGFibGUuCisKKyAgIFRoZXJlIGFyZSA2ICogNCAqIDQgZW50cmllczoKKyAgICAgNiBkaWZmZXJlbnQgcmVzb2x1dGlvbnMgc3VicWNpZiwgcXNpZiwgcWNpZiwgc2lmLCBjaWYsIHZnYQorICAgICA2IGZyYW1lcmF0ZXM6IDUsIDEwLCAxNSwgMjAsIDI1LCAzMAorICAgICA0IGNvbXByZXNzaW9uIG1vZGk6IG5vbmUsIGxvdywgbWVkaXVtLCBoaWdoCisKKyAgIFdoZW4gYW4gdW5jb21wcmVzc2VkIG1vZGUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIG5leHQgYXZhaWxhYmxlIGNvbXByZXNzZWQgbW9kZQorICAgd2lsbCBiZSBjaG9zZW4gKHVubGVzcyB0aGUgZGVjb21wcmVzc29yIGlzIGFic2VudCkuIFNvbWV0aW1lcyB0aGVyZSBhcmUgb25seQorICAgMSBvciAyIGNvbXByZXNzZWQgbW9kZXMgYXZhaWxhYmxlOyBpbiB0aGF0IGNhc2UgZW50cmllcyBhcmUgZHVwbGljYXRlZC4KKyovCisKKworI2luY2x1ZGUgInB3Yy1raWFyYS5oIgorI2luY2x1ZGUgInB3Yy11bmNvbXByZXNzLmgiCisKK2NvbnN0IHN0cnVjdCBLaWFyYV90YWJsZV9lbnRyeSBLaWFyYV90YWJsZVtQU1pfTUFYXVs2XVs0XSA9Cit7CisgICAvKiBTUUNJRiAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMTUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMzAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICB9LAorICAgLyogUVNJRiAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHsxLCAxNDYsICAgIDAsIHsweDFELCAweEY0LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDkyLCAweDAwLCAweDgwfX0sCisgICAgICAgICB7MSwgMTQ2LCAgICAwLCB7MHgxRCwgMHhGNCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg5MiwgMHgwMCwgMHg4MH19LAorICAgICAgICAgezEsIDE0NiwgICAgMCwgezB4MUQsIDB4RjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4OTIsIDB4MDAsIDB4ODB9fSwKKyAgICAgICAgIHsxLCAxNDYsICAgIDAsIHsweDFELCAweEY0LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDkyLCAweDAwLCAweDgwfX0sCisgICAgICB9LAorICAgICAgLyogMTAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MiwgMjkxLCAgICAwLCB7MHgxQywgMHhGNCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgyMywgMHgwMSwgMHg4MH19LAorICAgICAgICAgezEsIDE5MiwgIDYzMCwgezB4MTQsIDB4RjQsIDB4MzAsIDB4MTMsIDB4QTksIDB4MTIsIDB4RTEsIDB4MTcsIDB4MDgsIDB4QzAsIDB4MDAsIDB4ODB9fSwKKyAgICAgICAgIHsxLCAxOTIsICA2MzAsIHsweDE0LCAweEY0LCAweDMwLCAweDEzLCAweEE5LCAweDEyLCAweEUxLCAweDE3LCAweDA4LCAweEMwLCAweDAwLCAweDgwfX0sCisgICAgICAgICB7MSwgMTkyLCAgNjMwLCB7MHgxNCwgMHhGNCwgMHgzMCwgMHgxMywgMHhBOSwgMHgxMiwgMHhFMSwgMHgxNywgMHgwOCwgMHhDMCwgMHgwMCwgMHg4MH19LAorICAgICAgfSwKKyAgICAgIC8qIDE1IGZwcyAqLworICAgICAgeworICAgICAgICAgezMsIDQzNywgICAgMCwgezB4MUIsIDB4RjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4QjUsIDB4MDEsIDB4ODB9fSwKKyAgICAgICAgIHsyLCAyOTIsICA2NDAsIHsweDEzLCAweEY0LCAweDMwLCAweDEzLCAweEY3LCAweDEzLCAweDJGLCAweDEzLCAweDIwLCAweDI0LCAweDAxLCAweDgwfX0sCisgICAgICAgICB7MiwgMjkyLCAgNjQwLCB7MHgxMywgMHhGNCwgMHgzMCwgMHgxMywgMHhGNywgMHgxMywgMHgyRiwgMHgxMywgMHgyMCwgMHgyNCwgMHgwMSwgMHg4MH19LAorICAgICAgICAgezEsIDE5MiwgIDQyMCwgezB4MTMsIDB4RjQsIDB4MzAsIDB4MEQsIDB4MUIsIDB4MEMsIDB4NTMsIDB4MUUsIDB4MTgsIDB4QzAsIDB4MDAsIDB4ODB9fSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHs0LCA1ODksICAgIDAsIHsweDFBLCAweEY0LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDRELCAweDAyLCAweDgwfX0sCisgICAgICAgICB7MywgNDQ4LCAgNzMwLCB7MHgxMiwgMHhGNCwgMHgzMCwgMHgxNiwgMHhDOSwgMHgxNiwgMHgwMSwgMHgwRSwgMHgxOCwgMHhDMCwgMHgwMSwgMHg4MH19LAorICAgICAgICAgezIsIDI5MiwgIDQ3NiwgezB4MTIsIDB4RjQsIDB4MzAsIDB4MEUsIDB4RDgsIDB4MEUsIDB4MTAsIDB4MTksIDB4MTgsIDB4MjQsIDB4MDEsIDB4ODB9fSwKKyAgICAgICAgIHsxLCAxOTIsICAzMTIsIHsweDEyLCAweEY0LCAweDUwLCAweDA5LCAweEIzLCAweDA4LCAweEVCLCAweDFFLCAweDE4LCAweEMwLCAweDAwLCAweDgwfX0sCisgICAgICB9LAorICAgICAgLyogMjUgZnBzICovCisgICAgICB7CisgICAgICAgICB7NSwgNzAzLCAgICAwLCB7MHgxOSwgMHhGNCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHhCRiwgMHgwMiwgMHg4MH19LAorICAgICAgICAgezMsIDQ0NywgIDYxMCwgezB4MTEsIDB4RjQsIDB4MzAsIDB4MTMsIDB4MEIsIDB4MTIsIDB4NDMsIDB4MTQsIDB4MjgsIDB4QkYsIDB4MDEsIDB4ODB9fSwKKyAgICAgICAgIHsyLCAyOTIsICAzOTgsIHsweDExLCAweEY0LCAweDUwLCAweDBDLCAweDZDLCAweDBCLCAweEE0LCAweDFFLCAweDI4LCAweDI0LCAweDAxLCAweDgwfX0sCisgICAgICAgICB7MSwgMTkzLCAgMjYyLCB7MHgxMSwgMHhGNCwgMHg1MCwgMHgwOCwgMHgyMywgMHgwNywgMHg1QiwgMHgxRSwgMHgyOCwgMHhDMSwgMHgwMCwgMHg4MH19LAorICAgICAgfSwKKyAgICAgIC8qIDMwIGZwcyAqLworICAgICAgeworICAgICAgICAgezgsIDg3NCwgICAgMCwgezB4MTgsIDB4RjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4NkEsIDB4MDMsIDB4ODB9fSwKKyAgICAgICAgIHs1LCA3MDQsICA3MzAsIHsweDEwLCAweEY0LCAweDMwLCAweDE2LCAweEM5LCAweDE2LCAweDAxLCAweDBFLCAweDI4LCAweEMwLCAweDAyLCAweDgwfX0sCisgICAgICAgICB7MywgNDQ4LCAgNDkyLCB7MHgxMCwgMHhGNCwgMHgzMCwgMHgwRiwgMHg1RCwgMHgwRSwgMHg5NSwgMHgxNSwgMHgyOCwgMHhDMCwgMHgwMSwgMHg4MH19LAorICAgICAgICAgezIsIDI5MiwgIDMyMCwgezB4MTAsIDB4RjQsIDB4NTAsIDB4MDksIDB4RkIsIDB4MDksIDB4MzMsIDB4MUUsIDB4MjgsIDB4MjQsIDB4MDEsIDB4ODB9fSwKKyAgICAgIH0sCisgICB9LAorICAgLyogUUNJRiAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMTUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMzAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICB9LAorICAgLyogU0lGICovCisgICB7CisgICAgICAvKiA1IGZwcyAqLworICAgICAgeworICAgICAgICAgezQsIDU4MiwgICAgMCwgezB4MEQsIDB4RjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NDYsIDB4MDIsIDB4ODB9fSwKKyAgICAgICAgIHszLCAzODcsIDEyNzYsIHsweDA1LCAweEY0LCAweDMwLCAweDI3LCAweEQ4LCAweDI2LCAweDQ4LCAweDAzLCAweDEwLCAweDgzLCAweDAxLCAweDgwfX0sCisgICAgICAgICB7MiwgMjkxLCAgOTYwLCB7MHgwNSwgMHhGNCwgMHgzMCwgMHgxRCwgMHhGMiwgMHgxQywgMHg2MiwgMHgwNCwgMHgxMCwgMHgyMywgMHgwMSwgMHg4MH19LAorICAgICAgICAgezEsIDE5MSwgIDYzMCwgezB4MDUsIDB4RjQsIDB4NTAsIDB4MTMsIDB4QTksIDB4MTIsIDB4MTksIDB4MDUsIDB4MTgsIDB4QkYsIDB4MDAsIDB4ODB9fSwKKyAgICAgIH0sCisgICAgICAvKiAxMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezYsIDc3NSwgMTI3OCwgezB4MDQsIDB4RjQsIDB4MzAsIDB4MjcsIDB4RTgsIDB4MjYsIDB4NTgsIDB4MDUsIDB4MzAsIDB4MDcsIDB4MDMsIDB4ODB9fSwKKyAgICAgICAgIHszLCA0NDcsICA3MzYsIHsweDA0LCAweEY0LCAweDMwLCAweDE2LCAweEZCLCAweDE1LCAweDZCLCAweDA1LCAweDI4LCAweEJGLCAweDAxLCAweDgwfX0sCisgICAgICAgICB7MiwgMjkyLCAgNDgwLCB7MHgwNCwgMHhGNCwgMHg3MCwgMHgwRSwgMHhGOSwgMHgwRCwgMHg2OSwgMHgwOSwgMHgyOCwgMHgyNCwgMHgwMSwgMHg4MH19LAorICAgICAgfSwKKyAgICAgIC8qIDE1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU1LCAxMDUwLCB7MHgwMywgMHhGNCwgMHgzMCwgMHgyMCwgMHhDRiwgMHgxRiwgMHgzRiwgMHgwNiwgMHg0OCwgMHhCQiwgMHgwMywgMHg4MH19LAorICAgICAgICAgezQsIDU5MiwgIDY1MCwgezB4MDMsIDB4RjQsIDB4MzAsIDB4MTQsIDB4NDQsIDB4MTIsIDB4QjQsIDB4MDgsIDB4MzAsIDB4NTAsIDB4MDIsIDB4ODB9fSwKKyAgICAgICAgIHszLCA0NDgsICA0OTIsIHsweDAzLCAweEY0LCAweDUwLCAweDBGLCAweDUyLCAweDBELCAweEMyLCAweDA5LCAweDM4LCAweEMwLCAweDAxLCAweDgwfX0sCisgICAgICB9LAorICAgICAgLyogMjAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTgsICA3ODIsIHsweDAyLCAweEY0LCAweDMwLCAweDE4LCAweDZBLCAweDE2LCAweERBLCAweDBCLCAweDU4LCAweEJFLCAweDAzLCAweDgwfX0sCisgICAgICAgICB7NSwgNzAzLCAgNTc0LCB7MHgwMiwgMHhGNCwgMHg1MCwgMHgxMSwgMHhFNywgMHgxMCwgMHg1NywgMHgwQiwgMHg0MCwgMHhCRiwgMHgwMiwgMHg4MH19LAorICAgICAgICAgezMsIDQ0NiwgIDM2NCwgezB4MDIsIDB4RjQsIDB4OTAsIDB4MEIsIDB4NUMsIDB4MDksIDB4Q0MsIDB4MEUsIDB4MzgsIDB4QkUsIDB4MDEsIDB4ODB9fSwKKyAgICAgIH0sCisgICAgICAvKiAyNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1OCwgIDY1NCwgezB4MDEsIDB4RjQsIDB4MzAsIDB4MTQsIDB4NjYsIDB4MTIsIDB4RDYsIDB4MEIsIDB4NTAsIDB4QkUsIDB4MDMsIDB4ODB9fSwKKyAgICAgICAgIHs2LCA3NzYsICA1MzAsIHsweDAxLCAweEY0LCAweDUwLCAweDEwLCAweDhDLCAweDBFLCAweEZDLCAweDBDLCAweDQ4LCAweDA4LCAweDAzLCAweDgwfX0sCisgICAgICAgICB7NCwgNTkyLCAgNDA0LCB7MHgwMSwgMHhGNCwgMHg3MCwgMHgwQywgMHg5NiwgMHgwQiwgMHgwNiwgMHgwQiwgMHg0OCwgMHg1MCwgMHgwMiwgMHg4MH19LAorICAgICAgfSwKKyAgICAgIC8qIDMwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU3LCAgNTI2LCB7MHgwMCwgMHhGNCwgMHg1MCwgMHgxMCwgMHg2OCwgMHgwRSwgMHhEOCwgMHgwRCwgMHg1OCwgMHhCRCwgMHgwMywgMHg4MH19LAorICAgICAgICAgezYsIDc3NSwgIDQyNiwgezB4MDAsIDB4RjQsIDB4NzAsIDB4MEQsIDB4NDgsIDB4MEIsIDB4QjgsIDB4MEYsIDB4NTAsIDB4MDcsIDB4MDMsIDB4ODB9fSwKKyAgICAgICAgIHs0LCA1OTAsICAzMjQsIHsweDAwLCAweDdBLCAweDg4LCAweDBBLCAweDFDLCAweDA4LCAweEI0LCAweDBFLCAweDUwLCAweDRFLCAweDAyLCAweDgwfX0sCisgICAgICB9LAorICAgfSwKKyAgIC8qIENJRiAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMTUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMzAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICB9LAorICAgLyogVkdBICovCisgICB7CisgICAgICAvKiA1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7NiwgNzczLCAxMjcyLCB7MHgyNSwgMHhGNCwgMHgzMCwgMHgyNywgMHhCNiwgMHgyNCwgMHg5NiwgMHgwMiwgMHgzMCwgMHgwNSwgMHgwMywgMHg4MH19LAorICAgICAgICAgezQsIDU5MiwgIDk3NiwgezB4MjUsIDB4RjQsIDB4NTAsIDB4MUUsIDB4NzgsIDB4MUIsIDB4NTgsIDB4MDMsIDB4MzAsIDB4NTAsIDB4MDIsIDB4ODB9fSwKKyAgICAgICAgIHszLCA0NDgsICA3MzgsIHsweDI1LCAweEY0LCAweDkwLCAweDE3LCAweDBDLCAweDEzLCAweEVDLCAweDA0LCAweDMwLCAweEMwLCAweDAxLCAweDgwfX0sCisgICAgICB9LAorICAgICAgLyogMTAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTYsICA3ODgsIHsweDI0LCAweEY0LCAweDcwLCAweDE4LCAweDlDLCAweDE1LCAweDdDLCAweDAzLCAweDQ4LCAweEJDLCAweDAzLCAweDgwfX0sCisgICAgICAgICB7NiwgNzc2LCAgNjQwLCB7MHgyNCwgMHhGNCwgMHhCMCwgMHgxMywgMHhGQywgMHgxMSwgMHgyQywgMHgwNCwgMHg0OCwgMHgwOCwgMHgwMywgMHg4MH19LAorICAgICAgICAgezQsIDU5MiwgIDQ4OCwgezB4MjQsIDB4N0EsIDB4RTgsIDB4MEYsIDB4M0MsIDB4MEMsIDB4NkMsIDB4MDYsIDB4NDgsIDB4NTAsIDB4MDIsIDB4ODB9fSwKKyAgICAgIH0sCisgICAgICAvKiAxNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1NywgIDUyNiwgezB4MjMsIDB4N0EsIDB4RTgsIDB4MTAsIDB4NjgsIDB4MEQsIDB4OTgsIDB4MDYsIDB4NTgsIDB4QkQsIDB4MDMsIDB4ODB9fSwKKyAgICAgICAgIHs5LCA5NTcsICA1MjYsIHsweDIzLCAweDdBLCAweEU4LCAweDEwLCAweDY4LCAweDBELCAweDk4LCAweDA2LCAweDU4LCAweEJELCAweDAzLCAweDgwfX0sCisgICAgICAgICB7OCwgODk1LCAgNDkyLCB7MHgyMywgMHg3QSwgMHhFOCwgMHgwRiwgMHg1RCwgMHgwQywgMHg4RCwgMHgwNiwgMHg1OCwgMHg3RiwgMHgwMywgMHg4MH19LAorICAgICAgfSwKKyAgICAgIC8qIDIwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMjUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAzMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgIH0sCit9OworCisKKy8qCisgKiBSb20gdGFibGUgZm9yIGtpYXJhIGNoaXBzCisgKgorICogMzIgcm9tcyB0YWJsZXMgKG9uZSBmb3IgZWFjaCByZXNvbHV0aW9uID8pCisgKiAgMiB0YWJsZXMgcGVyIHJvbXMgKG9uZSBmb3IgZWFjaCBwYXNzZXMpIChZLCBhbmQgVSZWKQorICogMTI4IGJ5dGVzIHBlciBwYXNzZXMKKyAqLworCitjb25zdCB1bnNpZ25lZCBpbnQgS2lhcmFSb21UYWJsZSBbOF1bMl1bMTZdWzhdID0gIAoreworIHsgLyogdmVyc2lvbiAwICovCisgIHsgLyogdmVyc2lvbiAwLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDAsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMSAqLworICB7IC8qIHZlcnNpb24gMSwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwMSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDIgKi8KKyAgeyAvKiB2ZXJzaW9uIDIsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMiwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAzICovCisgIHsgLyogdmVyc2lvbiAzLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDI1YmI2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDMsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI2ZGMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNCAqLworICB7IC8qIHZlcnNpb24gNCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA0LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyNTIsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDUgKi8KKyAgeyAvKiB2ZXJzaW9uIDUsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0OTZkLDB4MDAwMjViYjYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gNSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyNTIsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA2ICovCisgIHsgLyogdmVyc2lvbiA2LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDYsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNyAqLworICB7IC8qIHZlcnNpb24gNywgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAyNDk2ZX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDI0OTI0LDB4MDAwMjRiNmQsMHgwMDAyZGRiNiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA3LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDFiNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0KK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2Mta2lhcmEuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2Mta2lhcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjkyOWFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1raWFyYS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KKyAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorCisgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKKyAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgorICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgorICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCisgICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworLyogRW50cmllcyBmb3IgdGhlIEtpYXJhICg3MzAvNzQwLzc1MCkgY2FtZXJhICovCisKKyNpZm5kZWYgUFdDX0tJQVJBX0gKKyNkZWZpbmUgUFdDX0tJQVJBX0gKKworI2luY2x1ZGUgInB3Yy1pb2N0bC5oIgorCitzdHJ1Y3QgS2lhcmFfdGFibGVfZW50cnkKK3sKKwljaGFyIGFsdGVybmF0ZTsJCQkvKiBVU0IgYWx0ZXJuYXRlIGludGVyZmFjZSAqLworCXVuc2lnbmVkIHNob3J0IHBhY2tldHNpemU7CS8qIE5vcm1hbCBwYWNrZXQgc2l6ZSAqLworCXVuc2lnbmVkIHNob3J0IGJhbmRsZW5ndGg7CS8qIEJhbmRsZW5ndGggd2hlbiBkZWNvbXByZXNzaW5nICovCisJdW5zaWduZWQgY2hhciBtb2RlWzEyXTsJCS8qIHByZWNvbXB1dGVkIG1vZGUgc2V0dGluZ3MgZm9yIGNhbSAqLworfTsKKworY29uc3QgZXh0ZXJuIHN0cnVjdCBLaWFyYV90YWJsZV9lbnRyeSBLaWFyYV90YWJsZVtQU1pfTUFYXVs2XVs0XTsKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBpbnQgS2lhcmFSb21UYWJsZVs4XVsyXVsxNl1bOF07CisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtbWlzYy5jIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhNGJkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtbWlzYy5jCkBAIC0wLDAgKzEsMTQwIEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtIAorICAgVmFyaW91cyBtaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyBhbmQgdGFibGVzLgorICAgKEMpIDE5OTktMjAwMyBOZW1vc29mdCBVbnYuCisgICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJwd2MuaCIKKworc3RydWN0IHB3Y19jb29yZCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX01BWF0gPQoreworCXsgMTI4LCAgOTYsIDAgfSwKKwl7IDE2MCwgMTIwLCAwIH0sCisJeyAxNzYsIDE0NCwgMCB9LAorCXsgMzIwLCAyNDAsIDAgfSwKKwl7IDM1MiwgMjg4LCAwIH0sCisJeyA2NDAsIDQ4MCwgMCB9LAorfTsKKworLyogeCx5IC0+IFBTWl8gKi8KK2ludCBwd2NfZGVjb2RlX3NpemUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlpbnQgaSwgZmluZDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnbyBiZXlvbmQgb3VyIG1heCBzaXplLgorICAgICAgICAgICBOQjogd2UgaGF2ZSBkaWZmZXJlbnQgbGltaXRzIGZvciBSQVcgYW5kIG5vcm1hbCBtb2Rlcy4gSW4gY2FzZQorICAgICAgICAgICB5b3UgZG9uJ3QgaGF2ZSB0aGUgZGVjb21wcmVzc29yIGxvYWRlZCBvciB1c2UgUkFXIG1vZGUsIAorICAgICAgICAgICB0aGUgbWF4aW11bSB2aWV3YWJsZSBzaXplIGlzIHNtYWxsZXIuCisgICAgICAgICovCisJaWYgKHBkZXYtPnZwYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkFXKQorCXsKKwkJaWYgKHdpZHRoID4gcGRldi0+YWJzX21heC54IHx8IGhlaWdodCA+IHBkZXYtPmFic19tYXgueSkKKwkJeworCQkJRGVidWcoIlZJREVPX1BBTEVUVEVfUkFXOiBnb2luZyBiZXlvbmQgYWJzX21heC5cbiIpOworICAgICAgICAgICAgICAgIAlyZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCX0KKwllbHNlCisJeworCQlpZiAod2lkdGggPiBwZGV2LT52aWV3X21heC54IHx8IGhlaWdodCA+IHBkZXYtPnZpZXdfbWF4LnkpCisJCXsKKwkJCURlYnVnKCJWSURFT19QQUxFVFRFXyBub3QgUkFXOiBnb2luZyBiZXlvbmQgdmlld19tYXguXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qIEZpbmQgdGhlIGxhcmdlc3Qgc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIGNhbWVyYSB0aGF0IGZpdHMgaW50byB0aGUKKwkgICByZXF1ZXN0ZWQgc2l6ZS4KKwkgKi8KKwlmaW5kID0gLTE7CisJZm9yIChpID0gMDsgaSA8IFBTWl9NQVg7IGkrKykgeworCQlpZiAocGRldi0+aW1hZ2VfbWFzayAmICgxIDw8IGkpKSB7CisJCQlpZiAocHdjX2ltYWdlX3NpemVzW2ldLnggPD0gd2lkdGggJiYgcHdjX2ltYWdlX3NpemVzW2ldLnkgPD0gaGVpZ2h0KQorCQkJCWZpbmQgPSBpOworCQl9CisJfQorCXJldHVybiBmaW5kOworfQorCisvKiBpbml0aWFsaXplIHZhcmlhYmxlcyBkZXBlbmRpbmcgb24gdHlwZSBhbmQgZGVjb21wcmVzc29yKi8KK3ZvaWQgcHdjX2NvbnN0cnVjdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlzd2l0Y2gocGRldi0+dHlwZSkgeworCWNhc2UgNjQ1OgorCWNhc2UgNjQ2OgorCQlwZGV2LT52aWV3X21pbi54ID0gMTI4OworCQlwZGV2LT52aWV3X21pbi55ID0gIDk2OworCQlwZGV2LT52aWV3X21heC54ID0gMzUyOworCQlwZGV2LT52aWV3X21heC55ID0gMjg4OworICAgICAgICAgICAgICAgIHBkZXYtPmFic19tYXgueCAgPSAzNTI7CisgICAgICAgICAgICAgICAgcGRldi0+YWJzX21heC55ICA9IDI4ODsKKwkJcGRldi0+aW1hZ2VfbWFzayA9IDEgPDwgUFNaX1NRQ0lGIHwgMSA8PCBQU1pfUUNJRiB8IDEgPDwgUFNaX0NJRjsKKwkJcGRldi0+dmNpbnRlcmZhY2UgPSAyOworCQlwZGV2LT52ZW5kcG9pbnQgPSA0OworCQlwZGV2LT5mcmFtZV9oZWFkZXJfc2l6ZSA9IDA7CisJCXBkZXYtPmZyYW1lX3RyYWlsZXJfc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgNjc1OgorCWNhc2UgNjgwOgorCWNhc2UgNjkwOgorCQlwZGV2LT52aWV3X21pbi54ID0gMTI4OworCQlwZGV2LT52aWV3X21pbi55ID0gIDk2OworCQkvKiBBbnRoaWxsIGJ1ZyAjMzg6IFBXQyBhbHdheXMgcmVwb3J0cyBtYXggc2l6ZSwgZXZlbiB3aXRob3V0IFBXQ1ggKi8KKwkJcGRldi0+dmlld19tYXgueCA9IDY0MDsKKwkJcGRldi0+dmlld19tYXgueSA9IDQ4MDsKKwkJcGRldi0+aW1hZ2VfbWFzayA9IDEgPDwgUFNaX1NRQ0lGIHwgMSA8PCBQU1pfUVNJRiB8IDEgPDwgUFNaX1FDSUYgfCAxIDw8IFBTWl9TSUYgfCAxIDw8IFBTWl9DSUYgfCAxIDw8IFBTWl9WR0E7CisgICAgICAgICAgICAgICAgcGRldi0+YWJzX21heC54ID0gNjQwOworICAgICAgICAgICAgICAgIHBkZXYtPmFic19tYXgueSA9IDQ4MDsKKwkJcGRldi0+dmNpbnRlcmZhY2UgPSAzOworCQlwZGV2LT52ZW5kcG9pbnQgPSA0OworCQlwZGV2LT5mcmFtZV9oZWFkZXJfc2l6ZSA9IDA7CisJCXBkZXYtPmZyYW1lX3RyYWlsZXJfc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgNzIwOgorCWNhc2UgNzMwOgorCWNhc2UgNzQwOgorCWNhc2UgNzUwOgorCQlwZGV2LT52aWV3X21pbi54ID0gMTYwOworCQlwZGV2LT52aWV3X21pbi55ID0gMTIwOworCQlwZGV2LT52aWV3X21heC54ID0gNjQwOworCQlwZGV2LT52aWV3X21heC55ID0gNDgwOworCQlwZGV2LT5pbWFnZV9tYXNrID0gMSA8PCBQU1pfUVNJRiB8IDEgPDwgUFNaX1NJRiB8IDEgPDwgUFNaX1ZHQTsKKyAgICAgICAgICAgICAgICBwZGV2LT5hYnNfbWF4LnggPSA2NDA7CisgICAgICAgICAgICAgICAgcGRldi0+YWJzX21heC55ID0gNDgwOworCQlwZGV2LT52Y2ludGVyZmFjZSA9IDM7CisJCXBkZXYtPnZlbmRwb2ludCA9IDU7CisJCXBkZXYtPmZyYW1lX2hlYWRlcl9zaXplID0gVE9VQ0FNX0hFQURFUl9TSVpFOworCQlwZGV2LT5mcmFtZV90cmFpbGVyX3NpemUgPSBUT1VDQU1fVFJBSUxFUl9TSVpFOworCQlicmVhazsKKwl9CisJRGVidWcoInR5cGUgPSAlZFxuIixwZGV2LT50eXBlKTsKKwlwZGV2LT52cGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfWVVWNDIwUDsgLyogZGVmYXVsdCAqLworCXBkZXYtPnZpZXdfbWluLnNpemUgPSBwZGV2LT52aWV3X21pbi54ICogcGRldi0+dmlld19taW4ueTsKKwlwZGV2LT52aWV3X21heC5zaXplID0gcGRldi0+dmlld19tYXgueCAqIHBkZXYtPnZpZXdfbWF4Lnk7CisJLyogbGVuZ3RoIG9mIGltYWdlLCBpbiBZVVYgZm9ybWF0OyBhbHdheXMgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeS4gKi8KKwlwZGV2LT5sZW5fcGVyX2ltYWdlID0gKHBkZXYtPmFic19tYXgueCAqIHBkZXYtPmFic19tYXgueSAqIDMpIC8gMjsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLW5hbGEuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtbmFsYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YzVjYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLW5hbGEuaApAQCAtMCwwICsxLDY2IEBACisgICAvKiBTUUNJRiAqLworICAgeworICAgICAgezAsIDAsIHsweDA0LCAweDAxLCAweDAzfX0sCisgICAgICB7OCwgMCwgezB4MDUsIDB4MDEsIDB4MDN9fSwKKyAgICAgIHs3LCAwLCB7MHgwOCwgMHgwMSwgMHgwM319LAorICAgICAgezcsIDAsIHsweDBBLCAweDAxLCAweDAzfX0sCisgICAgICB7NiwgMCwgezB4MEMsIDB4MDEsIDB4MDN9fSwKKyAgICAgIHs1LCAwLCB7MHgwRiwgMHgwMSwgMHgwM319LAorICAgICAgezQsIDAsIHsweDE0LCAweDAxLCAweDAzfX0sCisgICAgICB7MywgMCwgezB4MTgsIDB4MDEsIDB4MDN9fSwKKyAgIH0sCisgICAvKiBRU0lGICovCisgICB7CisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICB9LAorICAgLyogUUNJRiAqLworICAgeworICAgICAgezAsIDAsIHsweDA0LCAweDAxLCAweDAyfX0sCisgICAgICB7OCwgMCwgezB4MDUsIDB4MDEsIDB4MDJ9fSwKKyAgICAgIHs3LCAwLCB7MHgwOCwgMHgwMSwgMHgwMn19LAorICAgICAgezYsIDAsIHsweDBBLCAweDAxLCAweDAyfX0sCisgICAgICB7NSwgMCwgezB4MEMsIDB4MDEsIDB4MDJ9fSwKKyAgICAgIHs0LCAwLCB7MHgwRiwgMHgwMSwgMHgwMn19LAorICAgICAgezEsIDAsIHsweDE0LCAweDAxLCAweDAyfX0sCisgICAgICB7MSwgMCwgezB4MTgsIDB4MDEsIDB4MDJ9fSwKKyAgIH0sCisgICAvKiBTSUYgKi8KKyAgIHsKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgIH0sCisgICAvKiBDSUYgKi8KKyAgIHsKKyAgICAgIHs0LCAwLCB7MHgwNCwgMHgwMSwgMHgwMX19LAorICAgICAgezcsIDEsIHsweDA1LCAweDAzLCAweDAxfX0sCisgICAgICB7NiwgMSwgezB4MDgsIDB4MDMsIDB4MDF9fSwKKyAgICAgIHs0LCAxLCB7MHgwQSwgMHgwMywgMHgwMX19LAorICAgICAgezMsIDEsIHsweDBDLCAweDAzLCAweDAxfX0sCisgICAgICB7MiwgMSwgezB4MEYsIDB4MDMsIDB4MDF9fSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgIH0sCisgICAvKiBWR0EgKi8KKyAgIHsgIAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtdGltb24uYyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtdGltb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTUwYTRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy10aW1vbi5jCkBAIC0wLDAgKzEsMTQ0NiBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisKKy8qIFRoaXMgdGFibGVzIGNvbnRhaW5zIGVudHJpZXMgZm9yIHRoZSA2NzUvNjgwLzY5MCAoVGltb24pIGNhbWVyYSwgd2l0aAorICAgNCBkaWZmZXJlbnQgcXVhbGl0aWVzIChubyBjb21wcmVzc2lvbiwgbG93LCBtZWRpdW0sIGhpZ2gpLgorICAgSXQgbGlzdHMgdGhlIGJhbmR3aWR0aCByZXF1aXJlbWVudHMgZm9yIHNhaWQgbW9kZSBieSBpdHMgYWx0ZXJuYXRlIGludGVyZmFjZQorICAgbnVtYmVyLiBBbiBhbHRlcm5hdGUgb2YgMCBtZWFucyB0aGF0IHRoZSBtb2RlIGlzIHVuYXZhaWxhYmxlLgorCisgICBUaGVyZSBhcmUgNiAqIDQgKiA0IGVudHJpZXM6CisgICAgIDYgZGlmZmVyZW50IHJlc29sdXRpb25zIHN1YnFjaWYsIHFzaWYsIHFjaWYsIHNpZiwgY2lmLCB2Z2EKKyAgICAgNiBmcmFtZXJhdGVzOiA1LCAxMCwgMTUsIDIwLCAyNSwgMzAKKyAgICAgNCBjb21wcmVzc2lvbiBtb2RpOiBub25lLCBsb3csIG1lZGl1bSwgaGlnaAorCisgICBXaGVuIGFuIHVuY29tcHJlc3NlZCBtb2RlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBuZXh0IGF2YWlsYWJsZSBjb21wcmVzc2VkIG1vZGUKKyAgIHdpbGwgYmUgY2hvc2VuICh1bmxlc3MgdGhlIGRlY29tcHJlc3NvciBpcyBhYnNlbnQpLiBTb21ldGltZXMgdGhlcmUgYXJlIG9ubHkKKyAgIDEgb3IgMiBjb21wcmVzc2VkIG1vZGVzIGF2YWlsYWJsZTsgaW4gdGhhdCBjYXNlIGVudHJpZXMgYXJlIGR1cGxpY2F0ZWQuCisqLworCisjaW5jbHVkZSAicHdjLXRpbW9uLmgiCisKK2NvbnN0IHN0cnVjdCBUaW1vbl90YWJsZV9lbnRyeSBUaW1vbl90YWJsZVtQU1pfTUFYXVs2XVs0XSA9Cit7CisgICAvKiBTUUNJRiAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHsxLCAxNDAsICAgIDAsIHsweDA1LCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDhDLCAweEZDLCAweDgwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTQwLCAgICAwLCB7MHgwNSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg4QywgMHhGQywgMHg4MCwgMHgwMn19LAorICAgICAgICAgezEsIDE0MCwgICAgMCwgezB4MDUsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OEMsIDB4RkMsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxNDAsICAgIDAsIHsweDA1LCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDhDLCAweEZDLCAweDgwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMTAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MiwgMjgwLCAgICAwLCB7MHgwNCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHgxOCwgMHhBOSwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezIsIDI4MCwgICAgMCwgezB4MDQsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MTgsIDB4QTksIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyODAsICAgIDAsIHsweDA0LCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDE4LCAweEE5LCAweDgwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjgwLCAgICAwLCB7MHgwNCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHgxOCwgMHhBOSwgMHg4MCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDE1IGZwcyAqLworICAgICAgeworICAgICAgICAgezMsIDQxMCwgICAgMCwgezB4MDMsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OUEsIDB4NzEsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHszLCA0MTAsICAgIDAsIHsweDAzLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDlBLCAweDcxLCAweDgwLCAweDAyfX0sCisgICAgICAgICB7MywgNDEwLCAgICAwLCB7MHgwMywgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5QSwgMHg3MSwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezMsIDQxMCwgICAgMCwgezB4MDMsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OUEsIDB4NzEsIDB4ODAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHs0LCA1NTksICAgIDAsIHsweDAyLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDJGLCAweDU2LCAweDgwLCAweDAyfX0sCisgICAgICAgICB7NCwgNTU5LCAgICAwLCB7MHgwMiwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHgyRiwgMHg1NiwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezQsIDU1OSwgICAgMCwgezB4MDIsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MkYsIDB4NTYsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHs0LCA1NTksICAgIDAsIHsweDAyLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDJGLCAweDU2LCAweDgwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMjUgZnBzICovCisgICAgICB7CisgICAgICAgICB7NSwgNjU5LCAgICAwLCB7MHgwMSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5MywgMHg0NiwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezUsIDY1OSwgICAgMCwgezB4MDEsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OTMsIDB4NDYsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHs1LCA2NTksICAgIDAsIHsweDAxLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDkzLCAweDQ2LCAweDgwLCAweDAyfX0sCisgICAgICAgICB7NSwgNjU5LCAgICAwLCB7MHgwMSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5MywgMHg0NiwgMHg4MCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDMwIGZwcyAqLworICAgICAgeworICAgICAgICAgezcsIDgzOCwgICAgMCwgezB4MDAsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4NDYsIDB4M0IsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHs3LCA4MzgsICAgIDAsIHsweDAwLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDQ2LCAweDNCLCAweDgwLCAweDAyfX0sCisgICAgICAgICB7NywgODM4LCAgICAwLCB7MHgwMCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg0NiwgMHgzQiwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezcsIDgzOCwgICAgMCwgezB4MDAsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4NDYsIDB4M0IsIDB4ODAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICB9LAorICAgLyogUVNJRiAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHsxLCAxNDYsICAgIDAsIHsweDJELCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDkyLCAweEZDLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTQ2LCAgICAwLCB7MHgyRCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg5MiwgMHhGQywgMHhDMCwgMHgwMn19LAorICAgICAgICAgezEsIDE0NiwgICAgMCwgezB4MkQsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4OTIsIDB4RkMsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxNDYsICAgIDAsIHsweDJELCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDkyLCAweEZDLCAweEMwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMTAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MiwgMjkxLCAgICAwLCB7MHgyQywgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgyMywgMHhBMSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezEsIDE5MSwgIDYzMCwgezB4MkMsIDB4RjQsIDB4MDUsIDB4MTMsIDB4QTksIDB4MTIsIDB4RTEsIDB4MTcsIDB4MDgsIDB4QkYsIDB4RjQsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxOTEsICA2MzAsIHsweDJDLCAweEY0LCAweDA1LCAweDEzLCAweEE5LCAweDEyLCAweEUxLCAweDE3LCAweDA4LCAweEJGLCAweEY0LCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTkxLCAgNjMwLCB7MHgyQywgMHhGNCwgMHgwNSwgMHgxMywgMHhBOSwgMHgxMiwgMHhFMSwgMHgxNywgMHgwOCwgMHhCRiwgMHhGNCwgMHhDMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDE1IGZwcyAqLworICAgICAgeworICAgICAgICAgezMsIDQzNywgICAgMCwgezB4MkIsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4QjUsIDB4NkQsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTEsICA2NDAsIHsweDJCLCAweEY0LCAweDA1LCAweDEzLCAweEY3LCAweDEzLCAweDJGLCAweDEzLCAweDA4LCAweDIzLCAweEExLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjkxLCAgNjQwLCB7MHgyQiwgMHhGNCwgMHgwNSwgMHgxMywgMHhGNywgMHgxMywgMHgyRiwgMHgxMywgMHgwOCwgMHgyMywgMHhBMSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezEsIDE5MSwgIDQyMCwgezB4MkIsIDB4RjQsIDB4MEQsIDB4MEQsIDB4MUIsIDB4MEMsIDB4NTMsIDB4MUUsIDB4MDgsIDB4QkYsIDB4RjQsIDB4QzAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHs0LCA1ODgsICAgIDAsIHsweDJBLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDRDLCAweDUyLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MywgNDQ3LCAgNzMwLCB7MHgyQSwgMHhGNCwgMHgwNSwgMHgxNiwgMHhDOSwgMHgxNiwgMHgwMSwgMHgwRSwgMHgxOCwgMHhCRiwgMHg2OSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezIsIDI5MiwgIDQ3NiwgezB4MkEsIDB4RjQsIDB4MEQsIDB4MEUsIDB4RDgsIDB4MEUsIDB4MTAsIDB4MTksIDB4MTgsIDB4MjQsIDB4QTEsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxOTIsICAzMTIsIHsweDJBLCAweEY0LCAweDFELCAweDA5LCAweEIzLCAweDA4LCAweEVCLCAweDFFLCAweDE4LCAweEMwLCAweEY0LCAweEMwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMjUgZnBzICovCisgICAgICB7CisgICAgICAgICB7NSwgNzAzLCAgICAwLCB7MHgyOSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHhCRiwgMHg0MiwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezMsIDQ0NywgIDYxMCwgezB4MjksIDB4RjQsIDB4MDUsIDB4MTMsIDB4MEIsIDB4MTIsIDB4NDMsIDB4MTQsIDB4MTgsIDB4QkYsIDB4NjksIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTIsICAzOTgsIHsweDI5LCAweEY0LCAweDBELCAweDBDLCAweDZDLCAweDBCLCAweEE0LCAweDFFLCAweDE4LCAweDI0LCAweEExLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTkyLCAgMjYyLCB7MHgyOSwgMHhGNCwgMHgyNSwgMHgwOCwgMHgyMywgMHgwNywgMHg1QiwgMHgxRSwgMHgxOCwgMHhDMCwgMHhGNCwgMHhDMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDMwIGZwcyAqLworICAgICAgeworICAgICAgICAgezgsIDg3MywgICAgMCwgezB4MjgsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4NjksIDB4MzcsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHs1LCA3MDQsICA3NzQsIHsweDI4LCAweEY0LCAweDA1LCAweDE4LCAweDIxLCAweDE3LCAweDU5LCAweDBGLCAweDE4LCAweEMwLCAweDQyLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MywgNDQ4LCAgNDkyLCB7MHgyOCwgMHhGNCwgMHgwNSwgMHgwRiwgMHg1RCwgMHgwRSwgMHg5NSwgMHgxNSwgMHgxOCwgMHhDMCwgMHg2OSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezIsIDI5MSwgIDMyMCwgezB4MjgsIDB4RjQsIDB4MUQsIDB4MDksIDB4RkIsIDB4MDksIDB4MzMsIDB4MUUsIDB4MTgsIDB4MjMsIDB4QTEsIDB4QzAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICB9LAorICAgLyogUUNJRiAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHsxLCAxOTMsICAgIDAsIHsweDBELCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweEMxLCAweEY0LCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTkzLCAgICAwLCB7MHgwRCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHhDMSwgMHhGNCwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezEsIDE5MywgICAgMCwgezB4MEQsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4QzEsIDB4RjQsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxOTMsICAgIDAsIHsweDBELCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweEMxLCAweEY0LCAweEMwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMTAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MywgMzg1LCAgICAwLCB7MHgwQywgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHg4MSwgMHg3OSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezIsIDI5MSwgIDgwMCwgezB4MEMsIDB4RjQsIDB4MDUsIDB4MTgsIDB4RjQsIDB4MTgsIDB4MTgsIDB4MTEsIDB4MDgsIDB4MjMsIDB4QTEsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTEsICA4MDAsIHsweDBDLCAweEY0LCAweDA1LCAweDE4LCAweEY0LCAweDE4LCAweDE4LCAweDExLCAweDA4LCAweDIzLCAweEExLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTk0LCAgNTMyLCB7MHgwQywgMHhGNCwgMHgwNSwgMHgxMCwgMHg5QSwgMHgwRiwgMHhCRSwgMHgxQiwgMHgwOCwgMHhDMiwgMHhGMCwgMHhDMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDE1IGZwcyAqLworICAgICAgeworICAgICAgICAgezQsIDU3NywgICAgMCwgezB4MEIsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4NDEsIDB4NTIsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHszLCA0NDcsICA4MTgsIHsweDBCLCAweEY0LCAweDA1LCAweDE5LCAweDg5LCAweDE4LCAweEFELCAweDBGLCAweDEwLCAweEJGLCAweDY5LCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjkyLCAgNTM0LCB7MHgwQiwgMHhGNCwgMHgwNSwgMHgxMCwgMHhBMywgMHgwRiwgMHhDNywgMHgxOSwgMHgxMCwgMHgyNCwgMHhBMSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezEsIDE5NSwgIDM1NiwgezB4MEIsIDB4RjQsIDB4MTUsIDB4MEIsIDB4MTEsIDB4MEEsIDB4MzUsIDB4MUUsIDB4MTAsIDB4QzMsIDB4RjAsIDB4QzAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHs2LCA3NzYsICAgIDAsIHsweDBBLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweDA4LCAweDNGLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7NCwgNTkxLCAgODA0LCB7MHgwQSwgMHhGNCwgMHgwNSwgMHgxOSwgMHgxRSwgMHgxOCwgMHg0MiwgMHgwRiwgMHgxOCwgMHg0RiwgMHg0RSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezMsIDQ0NywgIDYwOCwgezB4MEEsIDB4RjQsIDB4MDUsIDB4MTIsIDB4RkQsIDB4MTIsIDB4MjEsIDB4MTUsIDB4MTgsIDB4QkYsIDB4NjksIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTEsICAzOTYsIHsweDBBLCAweEY0LCAweDE1LCAweDBDLCAweDVFLCAweDBCLCAweDgyLCAweDFFLCAweDE4LCAweDIzLCAweEExLCAweEMwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMjUgZnBzICovCisgICAgICB7CisgICAgICAgICB7OSwgOTI4LCAgICAwLCB7MHgwOSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHhBMCwgMHgzMywgMHhDMCwgMHgwMn19LAorICAgICAgICAgezUsIDcwMywgIDgwMCwgezB4MDksIDB4RjQsIDB4MDUsIDB4MTgsIDB4RjQsIDB4MTgsIDB4MTgsIDB4MTAsIDB4MTgsIDB4QkYsIDB4NDIsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHszLCA0NDcsICA1MDgsIHsweDA5LCAweEY0LCAweDBELCAweDBGLCAweEQyLCAweDBFLCAweEY2LCAweDFCLCAweDE4LCAweEJGLCAweDY5LCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjkyLCAgMzMyLCB7MHgwOSwgMHhGNCwgMHgxRCwgMHgwQSwgMHg1QSwgMHgwOSwgMHg3RSwgMHgxRSwgMHgxOCwgMHgyNCwgMHhBMSwgMHhDMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDMwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU2LCAgODc2LCB7MHgwOCwgMHhGNCwgMHgwNSwgMHgxQiwgMHg1OCwgMHgxQSwgMHg3QywgMHgwRSwgMHgyMCwgMHhCQywgMHgzMywgMHgxMCwgMHgwMn19LAorICAgICAgICAgezQsIDU5MiwgIDU0MiwgezB4MDgsIDB4RjQsIDB4MDUsIDB4MTAsIDB4RTQsIDB4MTAsIDB4MDgsIDB4MTcsIDB4MjAsIDB4NTAsIDB4NEUsIDB4MTAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTEsICAyNjYsIHsweDA4LCAweEY0LCAweDI1LCAweDA4LCAweDQ4LCAweDA3LCAweDZDLCAweDFFLCAweDIwLCAweDIzLCAweEExLCAweDEwLCAweDAyfX0sCisgICAgICB9LAorICAgfSwKKyAgIC8qIFNJRiAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHs0LCA1ODIsICAgIDAsIHsweDM1LCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDQ2LCAweDUyLCAweDYwLCAweDAyfX0sCisgICAgICAgICB7MywgMzg3LCAxMjc2LCB7MHgzNSwgMHhGNCwgMHgwNSwgMHgyNywgMHhEOCwgMHgyNiwgMHg0OCwgMHgwMywgMHgxMCwgMHg4MywgMHg3OSwgMHg2MCwgMHgwMn19LAorICAgICAgICAgezIsIDI5MSwgIDk2MCwgezB4MzUsIDB4RjQsIDB4MEQsIDB4MUQsIDB4RjIsIDB4MUMsIDB4NjIsIDB4MDQsIDB4MTAsIDB4MjMsIDB4QTEsIDB4NjAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxOTEsICA2MzAsIHsweDM1LCAweEY0LCAweDFELCAweDEzLCAweEE5LCAweDEyLCAweDE5LCAweDA1LCAweDA4LCAweEJGLCAweEY0LCAweDYwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMTAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs2LCA3NzUsIDEyNzgsIHsweDM0LCAweEY0LCAweDA1LCAweDI3LCAweEU4LCAweDI2LCAweDU4LCAweDA1LCAweDMwLCAweDA3LCAweDNGLCAweDEwLCAweDAyfX0sCisgICAgICAgICB7MywgNDQ3LCAgNzM2LCB7MHgzNCwgMHhGNCwgMHgxNSwgMHgxNiwgMHhGQiwgMHgxNSwgMHg2QiwgMHgwNSwgMHgxOCwgMHhCRiwgMHg2OSwgMHgxMCwgMHgwMn19LAorICAgICAgICAgezIsIDI5MSwgIDQ4MCwgezB4MzQsIDB4RjQsIDB4MkQsIDB4MEUsIDB4RjksIDB4MEQsIDB4NjksIDB4MDksIDB4MTgsIDB4MjMsIDB4QTEsIDB4MTAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAxNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1NSwgMTA1MCwgezB4MzMsIDB4RjQsIDB4MDUsIDB4MjAsIDB4Q0YsIDB4MUYsIDB4M0YsIDB4MDYsIDB4NDgsIDB4QkIsIDB4MzMsIDB4MTAsIDB4MDJ9fSwKKyAgICAgICAgIHs0LCA1OTEsICA2NTAsIHsweDMzLCAweEY0LCAweDE1LCAweDE0LCAweDQ0LCAweDEyLCAweEI0LCAweDA4LCAweDMwLCAweDRGLCAweDRFLCAweDEwLCAweDAyfX0sCisgICAgICAgICB7MywgNDQ4LCAgNDkyLCB7MHgzMywgMHhGNCwgMHgyNSwgMHgwRiwgMHg1MiwgMHgwRCwgMHhDMiwgMHgwOSwgMHgyOCwgMHhDMCwgMHg2OSwgMHgxMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDIwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU4LCAgNzgyLCB7MHgzMiwgMHhGNCwgMHgwRCwgMHgxOCwgMHg2QSwgMHgxNiwgMHhEQSwgMHgwQiwgMHg1OCwgMHhCRSwgMHgzMywgMHhEMCwgMHgwMn19LAorICAgICAgICAgezUsIDcwMywgIDU3NCwgezB4MzIsIDB4RjQsIDB4MUQsIDB4MTEsIDB4RTcsIDB4MTAsIDB4NTcsIDB4MEIsIDB4NDAsIDB4QkYsIDB4NDIsIDB4RDAsIDB4MDJ9fSwKKyAgICAgICAgIHszLCA0NDYsICAzNjQsIHsweDMyLCAweEY0LCAweDNELCAweDBCLCAweDVDLCAweDA5LCAweENDLCAweDBFLCAweDMwLCAweEJFLCAweDY5LCAweEQwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMjUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTgsICA2NTQsIHsweDMxLCAweEY0LCAweDE1LCAweDE0LCAweDY2LCAweDEyLCAweEQ2LCAweDBCLCAweDUwLCAweEJFLCAweDMzLCAweDkwLCAweDAyfX0sCisgICAgICAgICB7NiwgNzc2LCAgNTMwLCB7MHgzMSwgMHhGNCwgMHgyNSwgMHgxMCwgMHg4QywgMHgwRSwgMHhGQywgMHgwQywgMHg0OCwgMHgwOCwgMHgzRiwgMHg5MCwgMHgwMn19LAorICAgICAgICAgezQsIDU5MiwgIDQwNCwgezB4MzEsIDB4RjQsIDB4MzUsIDB4MEMsIDB4OTYsIDB4MEIsIDB4MDYsIDB4MEIsIDB4MzgsIDB4NTAsIDB4NEUsIDB4OTAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAzMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1NywgIDUyNiwgezB4MzAsIDB4RjQsIDB4MjUsIDB4MTAsIDB4NjgsIDB4MEUsIDB4RDgsIDB4MEQsIDB4NTgsIDB4QkQsIDB4MzMsIDB4NjAsIDB4MDJ9fSwKKyAgICAgICAgIHs2LCA3NzUsICA0MjYsIHsweDMwLCAweEY0LCAweDM1LCAweDBELCAweDQ4LCAweDBCLCAweEI4LCAweDBGLCAweDUwLCAweDA3LCAweDNGLCAweDYwLCAweDAyfX0sCisgICAgICAgICB7NCwgNTkwLCAgMzI0LCB7MHgzMCwgMHg3QSwgMHg0QiwgMHgwQSwgMHgxQywgMHgwOCwgMHhCNCwgMHgwRSwgMHg0MCwgMHg0RSwgMHg1MiwgMHg2MCwgMHgwMn19LAorICAgICAgfSwKKyAgIH0sCisgICAvKiBDSUYgKi8KKyAgIHsKKyAgICAgIC8qIDUgZnBzICovCisgICAgICB7CisgICAgICAgICB7NiwgNzcxLCAgICAwLCB7MHgxNSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMywgMHgzRiwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezQsIDQ2NSwgMTI3OCwgezB4MTUsIDB4RjQsIDB4MDUsIDB4MjcsIDB4RUUsIDB4MjYsIDB4MzYsIDB4MDMsIDB4MTgsIDB4RDEsIDB4NjUsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTEsICA4MDAsIHsweDE1LCAweEY0LCAweDE1LCAweDE4LCAweEY0LCAweDE3LCAweDNDLCAweDA1LCAweDE4LCAweDIzLCAweEExLCAweDgwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTkzLCAgNTI4LCB7MHgxNSwgMHhGNCwgMHgyRCwgMHgxMCwgMHg3RSwgMHgwRSwgMHhDNiwgMHgwQSwgMHgxOCwgMHhDMSwgMHhGNCwgMHg4MCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTMyLCAxMjc4LCB7MHgxNCwgMHhGNCwgMHgwNSwgMHgyNywgMHhFRSwgMHgyNiwgMHgzNiwgMHgwNCwgMHgzMCwgMHhBNCwgMHgzMywgMHgxMCwgMHgwMn19LAorICAgICAgICAgezQsIDU5MSwgIDgxMiwgezB4MTQsIDB4RjQsIDB4MTUsIDB4MTksIDB4NTYsIDB4MTcsIDB4OUUsIDB4MDYsIDB4MjgsIDB4NEYsIDB4NEUsIDB4MTAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTEsICA0MDAsIHsweDE0LCAweEY0LCAweDNELCAweDBDLCAweDdBLCAweDBBLCAweEMyLCAweDBFLCAweDI4LCAweDIzLCAweEExLCAweDEwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMTUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTYsICA4NzYsIHsweDEzLCAweEY0LCAweDBELCAweDFCLCAweDU4LCAweDE5LCAweEEwLCAweDA1LCAweDM4LCAweEJDLCAweDMzLCAweDYwLCAweDAyfX0sCisgICAgICAgICB7NSwgNzAzLCAgNjQ0LCB7MHgxMywgMHhGNCwgMHgxRCwgMHgxNCwgMHgxQywgMHgxMiwgMHg2NCwgMHgwOCwgMHgzOCwgMHhCRiwgMHg0MiwgMHg2MCwgMHgwMn19LAorICAgICAgICAgezMsIDQ0OCwgIDQxMCwgezB4MTMsIDB4RjQsIDB4M0QsIDB4MEMsIDB4QzQsIDB4MEIsIDB4MEMsIDB4MEUsIDB4MzgsIDB4QzAsIDB4NjksIDB4NjAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1NiwgIDY1MCwgezB4MTIsIDB4RjQsIDB4MUQsIDB4MTQsIDB4NEEsIDB4MTIsIDB4OTIsIDB4MDksIDB4NDgsIDB4QkMsIDB4MzMsIDB4MTAsIDB4MDN9fSwKKyAgICAgICAgIHs2LCA3NzYsICA1MjgsIHsweDEyLCAweEY0LCAweDJELCAweDEwLCAweDdFLCAweDBFLCAweEM2LCAweDBBLCAweDQwLCAweDA4LCAweDNGLCAweDEwLCAweDAzfX0sCisgICAgICAgICB7NCwgNTkxLCAgNDAyLCB7MHgxMiwgMHhGNCwgMHgzRCwgMHgwQywgMHg4RiwgMHgwQSwgMHhENywgMHgwRSwgMHg0MCwgMHg0RiwgMHg0RSwgMHgxMCwgMHgwM319LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU2LCAgNTQ0LCB7MHgxMSwgMHhGNCwgMHgyNSwgMHgxMCwgMHhGNCwgMHgwRiwgMHgzQywgMHgwQSwgMHg0OCwgMHhCQywgMHgzMywgMHhDMCwgMHgwMn19LAorICAgICAgICAgezcsIDg0MCwgIDQ3OCwgezB4MTEsIDB4RjQsIDB4MkQsIDB4MEUsIDB4RUIsIDB4MEQsIDB4MzMsIDB4MEIsIDB4NDgsIDB4NDgsIDB4M0IsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHs1LCA3MDMsICA0MDAsIHsweDExLCAweEY0LCAweDNELCAweDBDLCAweDdBLCAweDBBLCAweEMyLCAweDBFLCAweDQ4LCAweEJGLCAweDQyLCAweEMwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMzAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTYsICA0MzgsIHsweDEwLCAweEY0LCAweDM1LCAweDBELCAweEFDLCAweDBCLCAweEY0LCAweDBELCAweDUwLCAweEJDLCAweDMzLCAweDEwLCAweDAyfX0sCisgICAgICAgICB7NywgODM4LCAgMzg0LCB7MHgxMCwgMHhGNCwgMHg0NSwgMHgwQiwgMHhGRCwgMHgwQSwgMHg0NSwgMHgwRiwgMHg1MCwgMHg0NiwgMHgzQiwgMHgxMCwgMHgwMn19LAorICAgICAgICAgezYsIDc3MywgIDM1NCwgezB4MTAsIDB4N0EsIDB4NEIsIDB4MEIsIDB4MEMsIDB4MDksIDB4ODAsIDB4MTAsIDB4NTAsIDB4MDUsIDB4M0YsIDB4MTAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICB9LAorICAgLyogVkdBICovCisgICB7CisgICAgICAvKiA1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7NiwgNzczLCAxMjcyLCB7MHgxRCwgMHhGNCwgMHgxNSwgMHgyNywgMHhCNiwgMHgyNCwgMHg5NiwgMHgwMiwgMHgzMCwgMHgwNSwgMHgzRiwgMHgxMCwgMHgwMn19LAorICAgICAgICAgezQsIDU5MiwgIDk3NiwgezB4MUQsIDB4RjQsIDB4MjUsIDB4MUUsIDB4NzgsIDB4MUIsIDB4NTgsIDB4MDMsIDB4MzAsIDB4NTAsIDB4NEUsIDB4MTAsIDB4MDJ9fSwKKyAgICAgICAgIHszLCA0NDgsICA3MzgsIHsweDFELCAweEY0LCAweDNELCAweDE3LCAweDBDLCAweDEzLCAweEVDLCAweDA0LCAweDMwLCAweEMwLCAweDY5LCAweDEwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMTAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTYsICA3ODgsIHsweDFDLCAweEY0LCAweDM1LCAweDE4LCAweDlDLCAweDE1LCAweDdDLCAweDAzLCAweDQ4LCAweEJDLCAweDMzLCAweDEwLCAweDAyfX0sCisgICAgICAgICB7NiwgNzc2LCAgNjQwLCB7MHgxQywgMHg3QSwgMHg1MywgMHgxMywgMHhGQywgMHgxMSwgMHgyQywgMHgwNCwgMHg0OCwgMHgwOCwgMHgzRiwgMHgxMCwgMHgwMn19LAorICAgICAgICAgezQsIDU5MiwgIDQ4OCwgezB4MUMsIDB4N0EsIDB4NkIsIDB4MEYsIDB4M0MsIDB4MEMsIDB4NkMsIDB4MDYsIDB4NDgsIDB4NTAsIDB4NEUsIDB4MTAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAxNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1NywgIDUyNiwgezB4MUIsIDB4N0EsIDB4NjMsIDB4MTAsIDB4NjgsIDB4MEQsIDB4OTgsIDB4MDYsIDB4NTgsIDB4QkQsIDB4MzMsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHs5LCA5NTcsICA1MjYsIHsweDFCLCAweDdBLCAweDYzLCAweDEwLCAweDY4LCAweDBELCAweDk4LCAweDA2LCAweDU4LCAweEJELCAweDMzLCAweDgwLCAweDAyfX0sCisgICAgICAgICB7OCwgODk1LCAgNDkyLCB7MHgxQiwgMHg3QSwgMHg2QiwgMHgwRiwgMHg1RCwgMHgwQywgMHg4RCwgMHgwNiwgMHg1OCwgMHg3RiwgMHgzNywgMHg4MCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDIwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMjUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAzMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgIH0sCit9OworCisvKgorICogMTYgdmVyc2lvbnM6CisgKiAgIDIgdGFibGVzICAob25lIGZvciBZLCBhbmQgb25lIGZvciBVJlYpCisgKiAgIDE2IGxldmVscyBvZiBkZXRhaWxzIHBlciB0YWJsZXMKKyAqICAgOCBibG9jcworICovCisKK2NvbnN0IHVuc2lnbmVkIGludCBUaW1vblJvbVRhYmxlIFsxNl1bMl1bMTZdWzhdID0gIAoreworIHsgLyogdmVyc2lvbiAwICovCisgIHsgLyogdmVyc2lvbiAwLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwKKyAgICAweDAwMDAwMDAxLDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDAwMDAxLAorICAgIDB4MDAwMDAwMDEsMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDAsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDAwMDAxLAorICAgIDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwMSwweDAwMDAwMDA5LDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDQ5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwNDksMHgwMDAwMDAwMSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMSAqLworICB7IC8qIHZlcnNpb24gMSwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwMSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwMSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDAwNDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDIgKi8KKyAgeyAvKiB2ZXJzaW9uIDIsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMiwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAzICovCisgIHsgLyogdmVyc2lvbiAzLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTI5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDMsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDk0OTMsMHgwMDAwOTI5MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNCAqLworICB7IC8qIHZlcnNpb24gNCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA0LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDBhNDliLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDUgKi8KKyAgeyAvKiB2ZXJzaW9uIDUsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gNSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAxMjRkYiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDEyNGRiLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA2ICovCisgIHsgLyogdmVyc2lvbiA2LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDI1YmI2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDYsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI2ZGMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNyAqLworICB7IC8qIHZlcnNpb24gNywgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFjOTZlLDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAyNDk2ZX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMjQ5NmQsMHgwMDAyNWJiNiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA3LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFiNzI1LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDggKi8KKyAgeyAvKiB2ZXJzaW9uIDgsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMjRiNzYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAyNGI3NiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDI0YjZkLDB4MDAwMmRkYjYsMHgwMDAyZWZmZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gOCwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMjQ5NmQsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA5ICovCisgIHsgLyogdmVyc2lvbiA5LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDksIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI1MiwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMTAgKi8KKyAgeyAvKiB2ZXJzaW9uIDEwLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAyNDk2ZCwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDEwLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMDkyOTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDk0OTMsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDExICovCisgIHsgLyogdmVyc2lvbiAxMSwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMjQ5NmQsMHgwMDAyNWJiNiwweDAwMDI0Yjc3fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxMSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyNTIsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAxMiAqLworICB7IC8qIHZlcnNpb24gMTIsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0YjZkLDB4MDAwMmRkYjYsMHgwMDAyNWJiZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMTIsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMTMgKi8KKyAgeyAvKiB2ZXJzaW9uIDEzLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiOTI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMjQ5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDEzLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDFiNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDE0ICovCisgIHsgLyogdmVyc2lvbiAxNCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAyNDk2ZCwweDAwMDI0Yjc2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDI0YjZkLDB4MDAwMmRkYjYsMHgwMDAyNWJiZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxYjZkYiwKKyAgICAweDAwMDI0OTI0LDB4MDAwMmRiNmQsMHgwMDAzNmRiNiwweDAwMDJlZmZmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxNCwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMzZlNCwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEzNmU0LDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxYjZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAxNSAqLworICB7IC8qIHZlcnNpb24gMTUsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiOTI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAyNDk2ZCwweDAwMDI0Yjc2LDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0OTZkLDB4MDAwMjViYjYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMjRiNmQsMHgwMDAyNWJiNiwweDAwMDI0Yjc3fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMWI2ZGIsCisgICAgMHgwMDAyNDkyNCwweDAwMDJkYjZkLDB4MDAwMzZkYjYsMHgwMDAyZWZmZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMTUsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjRkYiwweDAwMDFiNzI0LDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiNzI0LDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI3MjQsMHgwMDAxMjRkYiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI5MjUsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjkyNSwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiOTI1LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI5MjUsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjkyNSwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMWI2ZGIsCisgICAgMHgwMDAyNDkyNCwweDAwMDI0OTZkLDB4MDAwMWI5MmQsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtdGltb24uaCBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtdGltb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODZiMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy10aW1vbi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KKyAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorCisgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKKyAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgorICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgorICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCisgICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworCisKKy8qIFRoaXMgdGFibGVzIGNvbnRhaW5zIGVudHJpZXMgZm9yIHRoZSA2NzUvNjgwLzY5MCAoVGltb24pIGNhbWVyYSwgd2l0aAorICAgNCBkaWZmZXJlbnQgcXVhbGl0aWVzIChubyBjb21wcmVzc2lvbiwgbG93LCBtZWRpdW0sIGhpZ2gpLgorICAgSXQgbGlzdHMgdGhlIGJhbmR3aWR0aCByZXF1aXJlbWVudHMgZm9yIHNhaWQgbW9kZSBieSBpdHMgYWx0ZXJuYXRlIGludGVyZmFjZQorICAgbnVtYmVyLiBBbiBhbHRlcm5hdGUgb2YgMCBtZWFucyB0aGF0IHRoZSBtb2RlIGlzIHVuYXZhaWxhYmxlLgorCisgICBUaGVyZSBhcmUgNiAqIDQgKiA0IGVudHJpZXM6CisgICAgIDYgZGlmZmVyZW50IHJlc29sdXRpb25zIHN1YnFjaWYsIHFzaWYsIHFjaWYsIHNpZiwgY2lmLCB2Z2EKKyAgICAgNiBmcmFtZXJhdGVzOiA1LCAxMCwgMTUsIDIwLCAyNSwgMzAKKyAgICAgNCBjb21wcmVzc2lvbiBtb2RpOiBub25lLCBsb3csIG1lZGl1bSwgaGlnaAorCisgICBXaGVuIGFuIHVuY29tcHJlc3NlZCBtb2RlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBuZXh0IGF2YWlsYWJsZSBjb21wcmVzc2VkIG1vZGUKKyAgIHdpbGwgYmUgY2hvc2VuICh1bmxlc3MgdGhlIGRlY29tcHJlc3NvciBpcyBhYnNlbnQpLiBTb21ldGltZXMgdGhlcmUgYXJlIG9ubHkKKyAgIDEgb3IgMiBjb21wcmVzc2VkIG1vZGVzIGF2YWlsYWJsZTsgaW4gdGhhdCBjYXNlIGVudHJpZXMgYXJlIGR1cGxpY2F0ZWQuCisqLworCisjaWZuZGVmIFBXQ19USU1PTl9ICisjZGVmaW5lIFBXQ19USU1PTl9ICisKKyNpbmNsdWRlICJwd2MtaW9jdGwuaCIKKworc3RydWN0IFRpbW9uX3RhYmxlX2VudHJ5Cit7CisJY2hhciBhbHRlcm5hdGU7CQkJLyogVVNCIGFsdGVybmF0ZSBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBwYWNrZXRzaXplOwkvKiBOb3JtYWwgcGFja2V0IHNpemUgKi8KKwl1bnNpZ25lZCBzaG9ydCBiYW5kbGVuZ3RoOwkvKiBCYW5kbGVuZ3RoIHdoZW4gZGVjb21wcmVzc2luZyAqLworCXVuc2lnbmVkIGNoYXIgbW9kZVsxM107CQkvKiBwcmVjb21wdXRlZCBtb2RlIHNldHRpbmdzIGZvciBjYW0gKi8KK307CisKK2NvbnN0IGV4dGVybiBzdHJ1Y3QgVGltb25fdGFibGVfZW50cnkgVGltb25fdGFibGVbUFNaX01BWF1bNl1bNF07Citjb25zdCBleHRlcm4gdW5zaWduZWQgaW50IFRpbW9uUm9tVGFibGUgWzE2XVsyXVsxNl1bOF07CisKKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy11bmNvbXByZXNzLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLXVuY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDYyZTQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy11bmNvbXByZXNzLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KKyAgIERlY29tcHJlc3Npb24gZnJvbnRlbmQuCisgICAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KKyAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorCisgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKKyAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgorICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgorICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCisgICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpbmNsdWRlICJwd2MuaCIKKyNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgorI2luY2x1ZGUgInB3Yy1kZWMxLmgiCisjaW5jbHVkZSAicHdjLWRlYzIzLmgiCisKK2ludCBwd2NfZGVjb21wcmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmJ1ZjsKKwlpbnQgbiwgbGluZSwgY29sLCBzdHJpZGU7CisJdm9pZCAqeXV2LCAqaW1hZ2U7CisJdTE2ICpzcmM7CisJdTE2ICpkc3R5LCAqZHN0dSwgKmRzdHY7CisKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pICYmIGRlZmluZWQoUFdDX01BR0lDKQorCWlmIChwZGV2LT5tYWdpYyAhPSBQV0NfTUFHSUMpIHsKKwkJRXJyKCJwd2NfZGVjb21wcmVzcygpOiBtYWdpYyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorI2VuZGlmCisKKwlmYnVmID0gcGRldi0+cmVhZF9mcmFtZTsKKwlpZiAoZmJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpbWFnZSA9IHBkZXYtPmltYWdlX3B0cltwZGV2LT5maWxsX2ltYWdlXTsKKwlpZiAoIWltYWdlKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXl1diA9IGZidWYtPmRhdGEgKyBwZGV2LT5mcmFtZV9oZWFkZXJfc2l6ZTsgIC8qIFNraXAgaGVhZGVyICovCisKKwkvKiBSYXcgZm9ybWF0OyB0aGF0J3MgZWFzeS4uLiAqLworCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1JBVykKKwl7CisJCW1lbWNweShpbWFnZSwgeXV2LCBwZGV2LT5mcmFtZV9zaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBkZXYtPnZiYW5kbGVuZ3RoID09IDApIHsKKwkJLyogVW5jb21wcmVzc2VkIG1vZGUuIFdlIGNvcHkgdGhlIGRhdGEgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciwKKwkJICAgdXNpbmcgdGhlIHZpZXdwb3J0IHNpemUgKHdoaWNoIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgaW1hZ2UKKwkJICAgc2l6ZSkuIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byBkbyBhIGJpdCBvZiBieXRlIHN0dWZmaW5nCisJCSAgIHRvIGdldCB0aGUgZGVzaXJlZCBvdXRwdXQgZm9ybWF0L3NpemUuCisJCSAqLworCQkJLyoKKwkJCSAqIFdlIGRvIHNvbWUgYnl0ZSBzaHVmZmxpbmcgaGVyZSB0byBnbyBmcm9tIHRoZQorCQkJICogbmF0aXZlIGZvcm1hdCB0byBZVVY0MjBQLgorCQkJICovCisJCQlzcmMgPSAodTE2ICopeXV2OworCQkJbiA9IHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueTsKKworCQkJLyogb2Zmc2V0IGluIFkgcGxhbmUgKi8KKwkJCXN0cmlkZSA9IHBkZXYtPnZpZXcueCAqIHBkZXYtPm9mZnNldC55ICsgcGRldi0+b2Zmc2V0Lng7CisJCQlkc3R5ID0gKHUxNiAqKShpbWFnZSArIHN0cmlkZSk7CisKKwkJCS8qIG9mZnNldHMgaW4gVS9WIHBsYW5lcyAqLworCQkJc3RyaWRlID0gcGRldi0+dmlldy54ICogcGRldi0+b2Zmc2V0LnkgLyA0ICsgcGRldi0+b2Zmc2V0LnggLyAyOworCQkJZHN0dSA9ICh1MTYgKikoaW1hZ2UgKyBuICsgICAgICAgICBzdHJpZGUpOworCQkJZHN0diA9ICh1MTYgKikoaW1hZ2UgKyBuICsgbiAvIDQgKyBzdHJpZGUpOworCisJCQkvKiBpbmNyZW1lbnQgYWZ0ZXIgZWFjaCBsaW5lICovCisJCQlzdHJpZGUgPSAocGRldi0+dmlldy54IC0gcGRldi0+aW1hZ2UueCkgLyAyOyAvKiB1MTYgaXMgMiBieXRlcyAqLworCisJCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgcGRldi0+aW1hZ2UueTsgbGluZSsrKSB7CisJCQkJZm9yIChjb2wgPSAwOyBjb2wgPCBwZGV2LT5pbWFnZS54OyBjb2wgKz0gNCkgeworCQkJCQkqZHN0eSsrID0gKnNyYysrOworCQkJCQkqZHN0eSsrID0gKnNyYysrOworCQkJCQlpZiAobGluZSAmIDEpCisJCQkJCQkqZHN0disrID0gKnNyYysrOworCQkJCQllbHNlCisJCQkJCQkqZHN0dSsrID0gKnNyYysrOworCQkJCX0KKwkJCQlkc3R5ICs9IHN0cmlkZTsKKwkJCQlpZiAobGluZSAmIDEpCisJCQkJCWRzdHYgKz0gKHN0cmlkZSA+PiAxKTsKKwkJCQllbHNlCisJCQkJCWRzdHUgKz0gKHN0cmlkZSA+PiAxKTsKKwkJCX0KKwl9CisJZWxzZSB7CisJCS8qIENvbXByZXNzZWQ7IHRoZSBkZWNvbXByZXNzb3Igcm91dGluZXMgd2lsbCB3cml0ZSB0aGUgZGF0YQorCQkgICBpbiBwbGFuYXIgZm9ybWF0IGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJaW50IGZsYWdzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZsYWdzID0gUFdDWF9GTEFHX1BMQU5BUjsKKyAgICAgICAgICAgICAgICBpZiAocGRldi0+dnNpemUgPT0gUFNaX1ZHQSAmJiBwZGV2LT52ZnJhbWVzID09IDUgJiYgcGRldi0+dnNuYXBzaG90KQorCQkgeworCQkgICBwcmludGsoS0VSTl9FUlIgInB3YzogTW9kZSBCYXllciBpcyBub3Qgc3VwcG9ydGVkIGZvciBub3dcbiIpOworCQkgICBmbGFncyB8PSBQV0NYX0ZMQUdfQkFZRVI7CisJCSAgIHJldHVybiAtRU5YSU87IC8qIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3M6IG1pc3NpbmcgZGVjb21wcmVzc29yICovCisJCSB9CisKKwkJc3dpdGNoIChwZGV2LT50eXBlKQorCQkgeworCQkgIGNhc2UgNjc1OgorCQkgIGNhc2UgNjgwOgorCQkgIGNhc2UgNjkwOgorCQkgIGNhc2UgNzIwOgorCQkgIGNhc2UgNzMwOgorCQkgIGNhc2UgNzQwOgorCQkgIGNhc2UgNzUwOgorCQkgICAgcHdjX2RlYzIzX2RlY29tcHJlc3MoJnBkZXYtPmltYWdlLCAmcGRldi0+dmlldywgJnBkZXYtPm9mZnNldCwKKwkJCQl5dXYsIGltYWdlLAorCQkJCWZsYWdzLAorCQkJCXBkZXYtPmRlY29tcHJlc3NfZGF0YSwgcGRldi0+dmJhbmRsZW5ndGgpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSA2NDU6CisJCSAgY2FzZSA2NDY6CisJCSAgICAvKiBUT0RPICYgRklYTUUgKi8KKwkJICAgIHJldHVybiAtRU5YSU87IC8qIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3M6IG1pc3NpbmcgZGVjb21wcmVzc29yICovCisJCSAgICBicmVhazsKKwkJIH0KKwl9CisJcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy11bmNvbXByZXNzLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLXVuY29tcHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2I5MjUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy11bmNvbXByZXNzLmgKQEAgLTAsMCArMSw0MSBAQAorLyogKEMpIDE5OTktMjAwMyBOZW1vc29mdCBVbnYuCisgICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKy8qIFRoaXMgZmlsZSBpcyB0aGUgYnJpZGdlIGJldHdlZW4gdGhlIGtlcm5lbCBtb2R1bGUgYW5kIHRoZSBwbHVnaW47IGl0CisgICBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZXMgYW5kIGRhdGF0eXBlcyB1c2VkIGluIGJvdGggbW9kdWxlcy4gQW55CisgICBzaWduaWZpY2FudCBjaGFuZ2Ugc2hvdWxkIGJlIHJlZmxlY3RlZCBieSBpbmNyZWFzaW5nIHRoZSAKKyAgIHB3Y19kZWNvbXByZXNzb3JfdmVyc2lvbiBtYWpvciBudW1iZXIuCisgKi8KKyNpZm5kZWYgUFdDX1VOQ09NUFJFU1NfSAorI2RlZmluZSBQV0NfVU5DT01QUkVTU19ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgInB3Yy1pb2N0bC5oIgorCisvKiBmcm9tIHB3Yy1kZWMuaCAqLworI2RlZmluZSBQV0NYX0ZMQUdfUExBTkFSICAgICAgICAweDAwMDEKKy8qICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy5oIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjUxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLmgKQEAgLTAsMCArMSwyNzggQEAKKy8qIChDKSAxOTk5LTIwMDMgTmVtb3NvZnQgVW52LgorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaWZuZGVmIFBXQ19ICisjZGVmaW5lIFBXQ19ICisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKKyNpbmNsdWRlICJwd2MtaW9jdGwuaCIKKworLyogRGVmaW5lcyBhbmQgc3RydWN0dXJlcyBmb3IgdGhlIFBoaWxpcHMgd2ViY2FtICovCisvKiBVc2VkIGZvciBjaGVja2luZyBtZW1vcnkgY29ycnVwdGlvbi9wb2ludGVyIHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgUFdDX01BR0lDIDB4ODlEQzEwQUJVTAorI3VuZGVmIFBXQ19NQUdJQworCisvKiBUdXJuIHNvbWUgZGVidWdnaW5nIG9wdGlvbnMgb24vb2ZmICovCisjZGVmaW5lIFBXQ19ERUJVRyAwCisKKy8qIFRyYWNlIGNlcnRhaW4gYWN0aW9ucyBpbiB0aGUgZHJpdmVyICovCisjZGVmaW5lIFRSQUNFX01PRFVMRQkweDAwMDEKKyNkZWZpbmUgVFJBQ0VfUFJPQkUJMHgwMDAyCisjZGVmaW5lIFRSQUNFX09QRU4JMHgwMDA0CisjZGVmaW5lIFRSQUNFX1JFQUQJMHgwMDA4CisjZGVmaW5lIFRSQUNFX01FTU9SWQkweDAwMTAKKyNkZWZpbmUgVFJBQ0VfRkxPVwkweDAwMjAKKyNkZWZpbmUgVFJBQ0VfU0laRQkweDAwNDAKKyNkZWZpbmUgVFJBQ0VfUFdDWAkweDAwODAKKyNkZWZpbmUgVFJBQ0VfU0VRVUVOQ0UJMHgxMDAwCisKKyNkZWZpbmUgVHJhY2UoUiwgQS4uLikgaWYgKHB3Y190cmFjZSAmIFIpIHByaW50ayhLRVJOX0RFQlVHIFBXQ19OQU1FICIgIiBBKQorI2RlZmluZSBEZWJ1ZyhBLi4uKSBwcmludGsoS0VSTl9ERUJVRyBQV0NfTkFNRSAiICIgQSkKKyNkZWZpbmUgSW5mbyhBLi4uKSAgcHJpbnRrKEtFUk5fSU5GTyAgUFdDX05BTUUgIiAiIEEpCisjZGVmaW5lIEVycihBLi4uKSAgIHByaW50ayhLRVJOX0VSUiAgIFBXQ19OQU1FICIgIiBBKQorCisKKy8qIERlZmluZXMgZm9yIFRvVUNhbSBjYW1lcmFzICovCisjZGVmaW5lIFRPVUNBTV9IRUFERVJfU0laRQkJOAorI2RlZmluZSBUT1VDQU1fVFJBSUxFUl9TSVpFCQk0CisKKyNkZWZpbmUgRkVBVFVSRV9NT1RPUl9QQU5USUxUCQkweDAwMDEKKworLyogVmVyc2lvbiBibG9jayAqLworI2RlZmluZSBQV0NfTUFKT1IJOQorI2RlZmluZSBQV0NfTUlOT1IJMAorI2RlZmluZSBQV0NfVkVSU0lPTiAJIjkuMC4yLXVub2ZmaWNpYWwiCisjZGVmaW5lIFBXQ19OQU1FIAkicHdjIgorCisvKiBUdXJuIGNlcnRhaW4gZmVhdHVyZXMgb24vb2ZmICovCisjZGVmaW5lIFBXQ19JTlRfUElQRSAwCisKKy8qIElnbm9yZSBlcnJvcnMgaW4gdGhlIGZpcnN0IE4gZnJhbWVzLCB0byBhbGxvdyBmb3Igc3RhcnR1cCBkZWxheXMgKi8KKyNkZWZpbmUgRlJBTUVfTE9XTUFSSyA1CisKKy8qIFNpemUgYW5kIG51bWJlciBvZiBidWZmZXJzIGZvciB0aGUgSVNPIHBpcGUuICovCisjZGVmaW5lIE1BWF9JU09fQlVGUwkJMgorI2RlZmluZSBJU09fRlJBTUVTX1BFUl9ERVNDCTEwCisjZGVmaW5lIElTT19NQVhfRlJBTUVfU0laRQk5NjAKKyNkZWZpbmUgSVNPX0JVRkZFUl9TSVpFIAkoSVNPX0ZSQU1FU19QRVJfREVTQyAqIElTT19NQVhfRlJBTUVfU0laRSkKKworLyogRnJhbWUgYnVmZmVyczogY29udGFpbnMgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQgdmlkZW8gZGF0YS4gKi8KKyNkZWZpbmUgTUFYX0ZSQU1FUwkJNQorLyogTWF4aW11bSBzaXplIGFmdGVyIGRlY29tcHJlc3Npb24gaXMgNjQweDQ4MCBZVVYgZGF0YSwgMS41ICogNjQwICogNDgwICovCisjZGVmaW5lIFBXQ19GUkFNRV9TSVpFIAkJKDQ2MDgwMCArIFRPVUNBTV9IRUFERVJfU0laRSArIFRPVUNBTV9UUkFJTEVSX1NJWkUpCisKKy8qIEFic29sdXRlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgYXZhaWxhYmxlIGZvciBtbWFwKCkgKi8KKyNkZWZpbmUgTUFYX0lNQUdFUyAJCTEwCisKKy8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyB3ZXJlIGJhc2VkIG9uIGNwaWEuaC4gV2h5IHJlaW52ZW50IHRoZSB3aGVlbD8gOi0pICovCitzdHJ1Y3QgcHdjX2lzb19idWYKK3sKKwl2b2lkICpkYXRhOworCWludCAgbGVuZ3RoOworCWludCAgcmVhZDsKKwlzdHJ1Y3QgdXJiICp1cmI7Cit9OworCisvKiBpbnRlcm1lZGlhdGUgYnVmZmVycyB3aXRoIHJhdyBkYXRhIGZyb20gdGhlIFVTQiBjYW0gKi8KK3N0cnVjdCBwd2NfZnJhbWVfYnVmCit7CisgICB2b2lkICpkYXRhOworICAgdm9sYXRpbGUgaW50IGZpbGxlZDsJCS8qIG51bWJlciBvZiBieXRlcyBmaWxsZWQgKi8KKyAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpuZXh0OwkvKiBsaXN0ICovCisjaWYgUFdDX0RFQlVHCisgICBpbnQgc2VxdWVuY2U7CQkvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKyNlbmRpZgorfTsKKworc3RydWN0IHB3Y19kZXZpY2UKK3sKKyAgIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXY7CisjaWZkZWYgUFdDX01BR0lDCisgICBpbnQgbWFnaWM7CisjZW5kaWYKKyAgIC8qIFBvaW50ZXIgdG8gb3VyIHVzYl9kZXZpY2UgKi8KKyAgIHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworICAgCisgICBpbnQgdHlwZTsgICAgICAgICAgICAgICAgICAgIC8qIHR5cGUgb2YgY2FtICg2NDUsIDY0NiwgNjc1LCA2ODAsIDY5MCwgNzIwLCA3MzAsIDc0MCwgNzUwKSAqLworICAgaW50IHJlbGVhc2U7CQkJLyogcmVsZWFzZSBudW1iZXIgKi8KKyAgIGludCBmZWF0dXJlczsJCS8qIGZlYXR1cmUgYml0cyAqLworICAgY2hhciBzZXJpYWxbMzBdOwkJLyogc2VyaWFsIG51bWJlciAoc3RyaW5nKSAqLworICAgaW50IGVycm9yX3N0YXR1czsJCS8qIHNldCB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGNhbSAodW5wbHVnZ2VkLCBVU0IgZXJyb3JzKSAqLworICAgaW50IHVzYl9pbml0OwkJLyogc2V0IHdoZW4gdGhlIGNhbSBoYXMgYmVlbiBpbml0aWFsaXplZCBvdmVyIFVTQiAqLworCisgICAvKioqIFZpZGVvIGRhdGEgKioqLworICAgaW50IHZvcGVuOwkJCS8qIGZsYWcgKi8KKyAgIGludCB2ZW5kcG9pbnQ7CQkvKiB2aWRlbyBpc29jIGVuZHBvaW50ICovCisgICBpbnQgdmNpbnRlcmZhY2U7CQkvKiB2aWRlbyBjb250cm9sIGludGVyZmFjZSAqLworICAgaW50IHZhbHRlcm5hdGU7CQkvKiBhbHRlcm5hdGUgaW50ZXJmYWNlIG5lZWRlZCAqLworICAgaW50IHZmcmFtZXMsIHZzaXplOwkJLyogZnJhbWVzLXBlci1zZWNvbmQgJiBzaXplIChzZWUgUFNaXyopICovCisgICBpbnQgdnBhbGV0dGU7CQkvKiBwYWxldHRlOiA0MjBQLCBSQVcgb3IgUkdCQkFZRVIgKi8KKyAgIGludCB2ZnJhbWVfY291bnQ7CQkvKiByZWNlaXZlZCBmcmFtZXMgKi8KKyAgIGludCB2ZnJhbWVzX2R1bXBlZDsgCQkvKiBjb3VudGVyIGZvciBkdW1wZWQgZnJhbWVzICovCisgICBpbnQgdmZyYW1lc19lcnJvcjsJCS8qIGZyYW1lcyByZWNlaXZlZCBpbiBlcnJvciAqLworICAgaW50IHZtYXhfcGFja2V0X3NpemU7CS8qIFVTQiBtYXhwYWNrZXQgc2l6ZSAqLworICAgaW50IHZsYXN0X3BhY2tldF9zaXplOwkvKiBmb3IgZnJhbWUgc3luY2hyb25pc2F0aW9uICovCisgICBpbnQgdmlzb2NfZXJyb3JzOwkJLyogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgSVNPQyBlcnJvcnMgKi8KKyAgIGludCB2Y29tcHJlc3Npb247CQkvKiBkZXNpcmVkIGNvbXByZXNzaW9uIGZhY3RvciAqLworICAgaW50IHZiYW5kbGVuZ3RoOwkJLyogY29tcHJlc3NlZCBiYW5kIGxlbmd0aDsgMCBpcyB1bmNvbXByZXNzZWQgKi8KKyAgIGNoYXIgdnNuYXBzaG90OwkJLyogc25hcHNob3QgbW9kZSAqLworICAgY2hhciB2c3luYzsJCQkvKiB1c2VkIGJ5IGlzb2MgaGFuZGxlciAqLworICAgY2hhciB2bWlycm9yOwkJLyogZm9yIFRvVUNhTSBzZXJpZXMgKi8KKyAgIAorICAgaW50IGNtZF9sZW47CisgICB1bnNpZ25lZCBjaGFyIGNtZF9idWZbMTNdOworCisgICAvKiBUaGUgaW1hZ2UgYWNxdWlzaXRpb24gcmVxdWlyZXMgMyB0byA0IHN0ZXBzOgorICAgICAgMS4gZGF0YSBpcyBnYXRoZXJlZCBpbiBzaG9ydCBwYWNrZXRzIGZyb20gdGhlIFVTQiBjb250cm9sbGVyCisgICAgICAyLiBkYXRhIGlzIHN5bmNocm9uaXplZCBhbmQgcGFja2VkIGludG8gYSBmcmFtZSBidWZmZXIKKyAgICAgIDNhLiBpbiBjYXNlIGRhdGEgaXMgY29tcHJlc3NlZCwgZGVjb21wcmVzcyBpdCBkaXJlY3RseSBpbnRvIGltYWdlIGJ1ZmZlcgorICAgICAgM2IuIGluIGNhc2UgZGF0YSBpcyB1bmNvbXByZXNzZWQsIGNvcHkgaW50byBpbWFnZSBidWZmZXIgd2l0aCB2aWV3cG9ydAorICAgICAgNC4gZGF0YSBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgdXNlciBwcm9jZXNzCisKKyAgICAgIE5vdGUgdGhhdCBNQVhfSVNPX0JVRlMgIT0gTUFYX0ZSQU1FUyAhPSBNQVhfSU1BR0VTLi4uLgorICAgICAgV2UgaGF2ZSBpbiBlZmZlY3QgYSBiYWNrLXRvLWJhY2stZG91YmxlLWJ1ZmZlciBzeXN0ZW0uCisgICAgKi8KKyAgIC8qIDE6IGlzb2MgKi8KKyAgIHN0cnVjdCBwd2NfaXNvX2J1ZiBzYnVmW01BWF9JU09fQlVGU107CisgICBjaGFyIGlzb19pbml0OworCisgICAvKiAyOiBmcmFtZSAqLworICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWY7CS8qIGFsbCBmcmFtZXMgKi8KKyAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICplbXB0eV9mcmFtZXMsICplbXB0eV9mcmFtZXNfdGFpbDsJLyogYWxsIGVtcHR5IGZyYW1lcyAqLworICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKmZ1bGxfZnJhbWVzLCAqZnVsbF9mcmFtZXNfdGFpbDsJLyogYWxsIGZpbGxlZCBmcmFtZXMgKi8KKyAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmaWxsX2ZyYW1lOwkvKiBmcmFtZSBjdXJyZW50bHkgYmVpbmcgZmlsbGVkICovCisgICBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqcmVhZF9mcmFtZTsJLyogZnJhbWUgY3VycmVudGx5IHJlYWQgYnkgdXNlciBwcm9jZXNzICovCisgICBpbnQgZnJhbWVfaGVhZGVyX3NpemUsIGZyYW1lX3RyYWlsZXJfc2l6ZTsKKyAgIGludCBmcmFtZV9zaXplOworICAgaW50IGZyYW1lX3RvdGFsX3NpemU7IC8qIGluY2x1ZGluZyBoZWFkZXIgJiB0cmFpbGVyICovCisgICBpbnQgZHJvcF9mcmFtZXM7CisjaWYgUFdDX0RFQlVHCisgICBpbnQgc2VxdWVuY2U7CQkJLyogRGVidWdnaW5nIGFpZCAqLworI2VuZGlmCisKKyAgIC8qIDM6IGRlY29tcHJlc3Npb24gKi8KKyAgIHN0cnVjdCBwd2NfZGVjb21wcmVzc29yICpkZWNvbXByZXNzb3I7CS8qIGZ1bmN0aW9uIGJsb2NrIHdpdGggZGVjb21wcmVzc2lvbiByb3V0aW5lcyAqLworICAgdm9pZCAqZGVjb21wcmVzc19kYXRhOwkJLyogcHJpdmF0ZSBkYXRhIGZvciBkZWNvbXByZXNzaW9uIGVuZ2luZSAqLworCisgICAvKiA0OiBpbWFnZSAqLworICAgLyogV2UgaGF2ZSBhbiAnaW1hZ2UnIGFuZCBhICd2aWV3Jywgd2hlcmUgJ2ltYWdlJyBpcyB0aGUgZml4ZWQtc2l6ZSBpbWFnZQorICAgICAgYXMgZGVsaXZlcmVkIGJ5IHRoZSBjYW1lcmEsIGFuZCAndmlldycgaXMgdGhlIHNpemUgcmVxdWVzdGVkIGJ5IHRoZQorICAgICAgcHJvZ3JhbS4gVGhlIGNhbWVyYSBpbWFnZSBpcyBjZW50ZXJlZCBpbiB0aGlzIHZpZXdwb3J0LCBsYWNlZCB3aXRoCisgICAgICBhIGdyYXkgb3IgYmxhY2sgYm9yZGVyLiB2aWV3X21pbiA8PSBpbWFnZSA8PSB2aWV3IDw9IHZpZXdfbWF4OworICAgICovCisgICBpbnQgaW1hZ2VfbWFzazsJCQkvKiBiaXRtYXNrIG9mIHN1cHBvcnRlZCBzaXplcyAqLworICAgc3RydWN0IHB3Y19jb29yZCB2aWV3X21pbiwgdmlld19tYXg7CS8qIG1pbmltdW0gYW5kIG1heGltdW0gdmlld2FibGUgc2l6ZXMgKi8KKyAgIHN0cnVjdCBwd2NfY29vcmQgYWJzX21heDsgICAgICAgICAgICAvKiBtYXhpbXVtIHN1cHBvcnRlZCBzaXplIHdpdGggY29tcHJlc3Npb24gKi8KKyAgIHN0cnVjdCBwd2NfY29vcmQgaW1hZ2UsIHZpZXc7CS8qIGltYWdlIGFuZCB2aWV3cG9ydCBzaXplICovCisgICBzdHJ1Y3QgcHdjX2Nvb3JkIG9mZnNldDsJCS8qIG9mZnNldCB3aXRoaW4gdGhlIHZpZXdwb3J0ICovCisKKyAgIHZvaWQgKmltYWdlX2RhdGE7CQkJLyogdG90YWwgYnVmZmVyLCB3aGljaCBpcyBzdWJkaXZpZGVkIGludG8gLi4uICovCisgICB2b2lkICppbWFnZV9wdHJbTUFYX0lNQUdFU107CQkvKiAuLi5zZXZlcmFsIGltYWdlcy4uLiAqLworICAgaW50IGZpbGxfaW1hZ2U7CQkJLyogLi4ud2hpY2ggYXJlIHJvdGF0ZWQuICovCisgICBpbnQgbGVuX3Blcl9pbWFnZTsJCQkvKiBsZW5ndGggcGVyIGltYWdlICovCisgICBpbnQgaW1hZ2VfcmVhZF9wb3M7CQkJLyogSW4gY2FzZSB3ZSByZWFkIGRhdGEgaW4gcGllY2VzLCBrZWVwIHRyYWNrIG9mIHdlcmUgd2UgYXJlIGluIHRoZSBpbWFnZWJ1ZmZlciAqLworICAgaW50IGltYWdlX3VzZWRbTUFYX0lNQUdFU107CQkvKiBGb3IgTUNBUFRVUkUgYW5kIFNZTkMgKi8KKworICAgc3RydWN0IHNlbWFwaG9yZSBtb2Rsb2NrOwkJLyogdG8gcHJldmVudCByYWNlcyBpbiB2aWRlb19vcGVuKCksIGV0YyAqLworICAgc3BpbmxvY2tfdCBwdHJsb2NrOwkJCS8qIGZvciBtYW5pcHVsYXRpbmcgdGhlIGJ1ZmZlciBwb2ludGVycyAqLworCisgICAvKioqIG1vdG9yaXplZCBwYW4vdGlsdCBmZWF0dXJlICovCisgICBzdHJ1Y3QgcHdjX21wdF9yYW5nZSBhbmdsZV9yYW5nZTsKKyAgIGludCBwYW5fYW5nbGU7CQkJLyogaW4gZGVncmVlcyAqIDEwMCAqLworICAgaW50IHRpbHRfYW5nbGU7CQkJLyogYWJzb2x1dGUgYW5nbGU7IDAsMCBpcyBob21lIHBvc2l0aW9uICovCisKKyAgIC8qKiogTWlzYy4gZGF0YSAqKiovCisgICB3YWl0X3F1ZXVlX2hlYWRfdCBmcmFtZXE7CQkvKiBXaGVuIHdhaXRpbmcgZm9yIGEgZnJhbWUgdG8gZmluaXNoLi4uICovCisjaWYgUFdDX0lOVF9QSVBFCisgICB2b2lkICp1c2JfaW50X2hhbmRsZXI7CQkvKiBmb3IgdGhlIGludGVycnVwdCBlbmRwb2ludCAqLworI2VuZGlmCit9OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogR2xvYmFsIHZhcmlhYmxlcyAqLworZXh0ZXJuIGludCBwd2NfdHJhY2U7CitleHRlcm4gaW50IHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb247CisKKy8qKiBmdW5jdGlvbnMgaW4gcHdjLWlmLmMgKi8KK2ludCBwd2NfdHJ5X3ZpZGVvX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5ld19mcHMsIGludCBuZXdfY29tcHJlc3Npb24sIGludCBuZXdfc25hcHNob3QpOworCisvKiogRnVuY3Rpb25zIGluIHB3Yy1taXNjLmMgKi8KKy8qIHNpemVzIGluIHBpeGVscyAqLworZXh0ZXJuIHN0cnVjdCBwd2NfY29vcmQgcHdjX2ltYWdlX3NpemVzW1BTWl9NQVhdOworCitpbnQgcHdjX2RlY29kZV9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwordm9pZCBwd2NfY29uc3RydWN0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKKworLyoqIEZ1bmN0aW9ucyBpbiBwd2MtY3RybC5jICovCisvKiBSZXF1ZXN0IGEgY2VydGFpbiB2aWRlbyBtb2RlLiBSZXR1cm5zIDwgMCBpZiBub3QgcG9zc2libGUgKi8KK2V4dGVybiBpbnQgcHdjX3NldF92aWRlb19tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KTsKKy8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBpbWFnZSAobm90IGZyYW1lKSAqLworZXh0ZXJuIHZvaWQgcHdjX3NldF9pbWFnZV9idWZmZXJfc2l6ZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CisKKy8qIFZhcmlvdXMgY29udHJvbHM7IHNob3VsZCBiZSBvYnZpb3VzLiBWYWx1ZSAwLi42NTUzNSwgb3IgPCAwIG9uIGVycm9yICovCitleHRlcm4gaW50IHB3Y19nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CitleHRlcm4gaW50IHB3Y19zZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9jb250cmFzdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CitleHRlcm4gaW50IHB3Y19zZXRfY29udHJhc3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7CitleHRlcm4gaW50IHB3Y19nZXRfZ2FtbWEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOworZXh0ZXJuIGludCBwd2Nfc2V0X2dhbW1hKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpOworZXh0ZXJuIGludCBwd2NfZ2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOworZXh0ZXJuIGludCBwd2Nfc2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7CitleHRlcm4gaW50IHB3Y19zZXRfbGVkcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG9uX3ZhbHVlLCBpbnQgb2ZmX3ZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9sZWRzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKm9uX3ZhbHVlLCBpbnQgKm9mZl92YWx1ZSk7CitleHRlcm4gaW50IHB3Y19nZXRfY21vc19zZW5zb3Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqc2Vuc29yKTsKKworLyogUG93ZXIgZG93biBvciB1cCB0aGUgY2FtZXJhOyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBtb2RlbHMgKi8KK2V4dGVybiBpbnQgcHdjX2NhbWVyYV9wb3dlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHBvd2VyKTsKKworLyogUHJpdmF0ZSBpb2N0bCgpczsgc2VlIHB3Yy1pb2N0bC5oICovCitleHRlcm4gaW50IHB3Y19pb2N0bChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKKworCisvKiogcHdjLXVuY29tcHJlc3MuYyAqLworLyogRXhwYW5kIGZyYW1lIHRvIGltYWdlLCBwb3NzaWJseSBpbmNsdWRpbmcgZGVjb21wcmVzc2lvbi4gVXNlcyByZWFkX2ZyYW1lIGFuZCBmaWxsX2ltYWdlICovCitleHRlcm4gaW50IHB3Y19kZWNvbXByZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NlNDAxLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zZTQwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NWJkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zZTQwMS5jCkBAIC0wLDAgKzEsMTQzNiBAQAorLyoKKyAqIEVuZHBvaW50cyAoZm9ybWVybHkga25vd24gYXMgQU9YKSBzZTQwMSBVU0IgQ2FtZXJhIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBKZXJvZW4gQi4gVnJlZWtlbiAocGUxcnhxQGFtc2F0Lm9yZykKKyAqCisgKiBTdGlsbCBzb21ld2hhdCBiYXNlZCBvbiB0aGUgTGludXggb3Y1MTEgZHJpdmVyLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICogVGhhbmtzIHRvIEVuZHBvaW50cyBJbmMuICh3d3cuZW5kcG9pbnRzLmNvbSkgZm9yIG1ha2luZyBkb2N1bWVudGF0aW9uIG9uCisgKiB0aGVpciBjaGlwc2V0IGF2YWlsYWJsZSBhbmQgc3VwcG9ydGluZyBtZSB3aGlsZSB3cml0aW5nIHRoaXMgZHJpdmVyLgorICogCS0gSmVyb2VuIFZyZWVrZW4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAiMC4yNCI7CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSAic2U0MDEuaCIKKworc3RhdGljIGludCBmbGlja2VybGVzcz0wOworc3RhdGljIGludCB2aWRlb19uciA9IC0xOworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRSgweDAzZTgsIDB4MDAwNCkgfSwvKiBFbmRwb2ludHMvQW94IFNFNDAxICovCisJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzBiKSB9LC8qIFBoaWxpcHMgUENWQzY2NUsgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDdkLCAweDUwMDEpIH0sLyogS2Vuc2luZ3RvbiA2NzAxNCAqLworCXsgVVNCX0RFVklDRSgweDA0N2QsIDB4NTAwMikgfSwvKiBLZW5zaW5ndG9uIDY3MDEoNS83KSAqLworCXsgVVNCX0RFVklDRSgweDA0N2QsIDB4NTAwMykgfSwvKiBLZW5zaW5ndG9uIDY3MDE2ICovCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX3RhYmxlKTsKKworTU9EVUxFX0FVVEhPUigiSmVyb2VuIFZyZWVrZW4gPHBlMXJ4cUBhbXNhdC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNFNDAxIFVTQiBDYW1lcmEgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0oZmxpY2tlcmxlc3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZsaWNrZXJsZXNzLCAiTmV0IGZyZXF1ZW5jeSB0byBhZGp1c3QgZXhwb3N1cmUgdGltZSB0byAoMC81MC82MCkiKTsKK21vZHVsZV9wYXJhbSh2aWRlb19uciwgaW50LCAwKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNlNDAxX2RyaXZlcjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1lbW9yeSBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCAqcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXZvaWQgKm1lbTsKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCW1lbSA9IHZtYWxsb2NfMzIoc2l6ZSk7CisJaWYgKCFtZW0pCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7IC8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZCBydmZyZWUodm9pZCAqbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBhZHI7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisJdmZyZWUobWVtKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc2U0MDEgcmVnaXN0ZXIgcmVhZC93cml0ZSBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHNlNDAxX3NuZGN0cmwoaW50IHNldCwgc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIHVuc2lnbmVkIHNob3J0IHJlcSwKKwkJCSB1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgY2hhciAqY3AsIGludCBzaXplKQoreworCXJldHVybiB1c2JfY29udHJvbF9tc2cgKAorICAgICAgICAgICAgICAgIHNlNDAxLT5kZXYsCisgICAgICAgICAgICAgICAgc2V0ID8gdXNiX3NuZGN0cmxwaXBlKHNlNDAxLT5kZXYsIDApIDogdXNiX3JjdmN0cmxwaXBlKHNlNDAxLT5kZXYsIDApLAorICAgICAgICAgICAgICAgIHJlcSwKKyAgICAgICAgICAgICAgICAoc2V0ID8gVVNCX0RJUl9PVVQgOiBVU0JfRElSX0lOKSB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBjcCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIDEwMDAKKyAgICAgICAgKTsKK30KKworc3RhdGljIGludCBzZTQwMV9zZXRfZmVhdHVyZShzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSwgdW5zaWduZWQgc2hvcnQgc2VsZWN0b3IsCisJCQkgICAgIHVuc2lnbmVkIHNob3J0IHBhcmFtKQoreworCS8qIHNwZWNzIHNheSB0aGF0IHRoZSBzZWxlY3RvciAoYWRkcmVzcykgc2hvdWxkIGdvIGluIHRoZSB2YWx1ZSBmaWVsZAorCSAgIGFuZCB0aGUgcGFyYW0gaW4gaW5kZXgsIGJ1dCBpbiB0aGUgbG9ncyBvZiB0aGUgd2luZG93cyBkcml2ZXIgdGhleSBkbworCSAgIHRoaXMgdGhlIG90aGVyIHdheSBhcm91bmQuLi4KKwkgKi8KKwlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnICgKKwkJc2U0MDEtPmRldiwKKwkJdXNiX3NuZGN0cmxwaXBlKHNlNDAxLT5kZXYsIDApLAorCQlTRTQwMV9SRVFfU0VUX0VYVF9GRUFUVVJFLAorCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCXBhcmFtLAorCQlzZWxlY3RvciwKKyAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgMTAwMAorICAgICAgICApOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2U0MDFfZ2V0X2ZlYXR1cmUoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIAorCQkJCSAgICAgICAgdW5zaWduZWQgc2hvcnQgc2VsZWN0b3IpCit7CisJLyogRm9yICdzZXQnIHRoZSBzZWxlY2V0b3Igc2hvdWxkIGJlIGluIGluZGV4LCBub3Qgc3VyZSBpZiB0aGUgc3BlYyBpcworCSAgIHdyb25nIGhlcmUgdG8uLi4uCisJICovCisJdW5zaWduZWQgY2hhciBjcFsyXTsKKyAgICAgICAgdXNiX2NvbnRyb2xfbXNnICgKKyAgICAgICAgICAgICAgICBzZTQwMS0+ZGV2LAorICAgICAgICAgICAgICAgIHVzYl9yY3ZjdHJscGlwZShzZTQwMS0+ZGV2LCAwKSwKKyAgICAgICAgICAgICAgICBTRTQwMV9SRVFfR0VUX0VYVF9GRUFUVVJFLAorICAgICAgICAgICAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKyAgICAgICAgCTAsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgY3AsCisgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAxMDAwCisgICAgICAgICk7CisJcmV0dXJuIGNwWzBdK2NwWzFdKjI1NjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDYW1lcmEgY29udHJvbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIGludCBzZTQwMV9zZW5kX3BpY3Qoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEpCit7CisJc2U0MDFfc2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfVElUTCwgc2U0MDEtPmV4cG9zZV9sKTsvKiBpbnRlZ3JhdGlvbiB0aW1lIGxvdyAqLworCXNlNDAxX3NldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX1RJVE0sIHNlNDAxLT5leHBvc2VfbSk7LyogaW50ZWdyYXRpb24gdGltZSBtaWQgKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19USVRVLCBzZTQwMS0+ZXhwb3NlX2gpOy8qIGludGVncmF0aW9uIHRpbWUgbWlkICovCisJc2U0MDFfc2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfQVJMViwgc2U0MDEtPnJlc2V0bGV2ZWwpOy8qIHJlc2V0IGxldmVsIHZhbHVlICovCisJc2U0MDFfc2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfQVJDRywgc2U0MDEtPnJnYWluKTsvKiByZWQgY29sb3IgZ2FpbiAqLworCXNlNDAxX3NldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX0FHQ0csIHNlNDAxLT5nZ2Fpbik7LyogZ3JlZW4gY29sb3IgZ2FpbiAqLworCXNlNDAxX3NldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX0FCQ0csIHNlNDAxLT5iZ2Fpbik7LyogYmx1ZSBjb2xvciBnYWluICovCisJICAgIAkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2U0MDFfc2V0X2V4cG9zdXJlKHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxLCBpbnQgYnJpZ2h0bmVzcykKK3sKKwlpbnQgaW50ZWdyYXRpb249YnJpZ2h0bmVzczw8NTsKKwkKKwlpZiAoZmxpY2tlcmxlc3M9PTUwKSB7CisJCWludGVncmF0aW9uPWludGVncmF0aW9uLWludGVncmF0aW9uJTEwNjY2NzsKKwl9CisJaWYgKGZsaWNrZXJsZXNzPT02MCkgeworCQlpbnRlZ3JhdGlvbj1pbnRlZ3JhdGlvbi1pbnRlZ3JhdGlvbiU4ODg4OTsKKwl9CisJc2U0MDEtPmJyaWdodG5lc3M9aW50ZWdyYXRpb24+PjU7CisJc2U0MDEtPmV4cG9zZV9oPShpbnRlZ3JhdGlvbj4+MTYpJjB4ZmY7CisJc2U0MDEtPmV4cG9zZV9tPShpbnRlZ3JhdGlvbj4+OCkmMHhmZjsKKwlzZTQwMS0+ZXhwb3NlX2w9aW50ZWdyYXRpb24mMHhmZjsKK30KKworc3RhdGljIGludCBzZTQwMV9nZXRfcGljdChzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSwgc3RydWN0IHZpZGVvX3BpY3R1cmUgKnApCit7CisJcC0+YnJpZ2h0bmVzcz1zZTQwMS0+YnJpZ2h0bmVzczsKKwlpZiAoc2U0MDEtPmVuaGFuY2UpIHsKKwkJcC0+d2hpdGVuZXNzPTMyNzY4OworCX0gZWxzZSB7CisJCXAtPndoaXRlbmVzcz0wOworCX0KKwlwLT5jb2xvdXI9NjU1MzU7CisJcC0+Y29udHJhc3Q9NjU1MzU7CisJcC0+aHVlPXNlNDAxLT5yZ2Fpbjw8MTA7CisJcC0+cGFsZXR0ZT1zZTQwMS0+cGFsZXR0ZTsKKwlwLT5kZXB0aD0zOyAvKiByZ2IyNCAqLworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2U0MDFfc2V0X3BpY3Qoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIHN0cnVjdCB2aWRlb19waWN0dXJlICpwKQoreworCWlmIChwLT5wYWxldHRlICE9IFZJREVPX1BBTEVUVEVfUkdCMjQpCisJCXJldHVybiAxOworCXNlNDAxLT5wYWxldHRlPXAtPnBhbGV0dGU7CisJaWYgKHAtPmh1ZSE9c2U0MDEtPmh1ZSkgeworCQlzZTQwMS0+cmdhaW49IHAtPmh1ZT4+MTA7CisJCXNlNDAxLT5iZ2Fpbj0gMHg0MC0ocC0+aHVlPj4xMCk7CisJCXNlNDAxLT5odWU9cC0+aHVlOworCX0KKwlpZiAocC0+YnJpZ2h0bmVzcyE9c2U0MDEtPmJyaWdodG5lc3MpIHsKKwkJc2U0MDFfc2V0X2V4cG9zdXJlKHNlNDAxLCBwLT5icmlnaHRuZXNzKTsKKwl9CisJaWYgKHAtPndoaXRlbmVzcz49MzI3NjgpIHsKKwkJc2U0MDEtPmVuaGFuY2U9MTsKKwl9IGVsc2UgeworCQlzZTQwMS0+ZW5oYW5jZT0wOworCX0KKwlzZTQwMV9zZW5kX3BpY3Qoc2U0MDEpOworCXNlNDAxX3NlbmRfcGljdChzZTQwMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisJSHl1bmRhaSBoYXZlIHNvbWUgcmVhbGx5IG5pY2UgZG9jcyBhYm91dCB0aGlzIGFuZCBvdGhlciBzZW5zb3IgcmVsYXRlZAorCXN0dWZmIG9uIHRoZWlyIGhvbWVwYWdlOiB3d3cuaGVpLmNvLmtyCisqLworc3RhdGljIHZvaWQgc2U0MDFfYXV0b19yZXNldGxldmVsKHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxKQoreworCXVuc2lnbmVkIGludCBhaHJjLCBhbHJjOworCWludCBvbGRyZXNldD1zZTQwMS0+cmVzZXRsZXZlbDsKKworCS8qIEZvciBzb21lIHJlYXNvbiB0aGlzIG5vcm1hbGx5IHJlYWQtb25seSByZWdpc3RlciBkb2Vzbid0IGdldCByZXNldAorCSAgIHRvIHplcm8gYWZ0ZXIgcmVhZGluZyB0aGVtIGp1c3Qgb25jZS4uLgorCSAqLworCXNlNDAxX2dldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX0hJUkVGTk9IKTsgCisJc2U0MDFfZ2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfSElSRUZOT0wpOworCXNlNDAxX2dldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX0xPUkVGTk9IKTsKKwlzZTQwMV9nZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19MT1JFRk5PTCk7CisJYWhyYz0yNTYqc2U0MDFfZ2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfSElSRUZOT0gpICsgCisJICAgIHNlNDAxX2dldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX0hJUkVGTk9MKTsKKwlhbHJjPTI1NipzZTQwMV9nZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19MT1JFRk5PSCkgKworCSAgICBzZTQwMV9nZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19MT1JFRk5PTCk7CisKKwkvKiBOb3QgYW4gZXhhY3Qgc2NpZW5jZSwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgcHJldHR5IHdlbGwuLi4gKi8KKwlpZiAoYWxyYyA+IDEwKSB7CisJCXdoaWxlIChhbHJjPj0xMCAmJiBzZTQwMS0+cmVzZXRsZXZlbCA8IDYzKSB7CisJCQlzZTQwMS0+cmVzZXRsZXZlbCsrOworCQkJYWxyYyAvPTI7CisJCX0KKwl9IGVsc2UgaWYgKGFocmMgPiAyMCkgeworCQl3aGlsZSAoYWhyYz49MjAgJiYgc2U0MDEtPnJlc2V0bGV2ZWwgPiAwKSB7CisJCQlzZTQwMS0+cmVzZXRsZXZlbC0tOworCQkJYWhyYyAvPTI7CisJCX0KKwl9CisJaWYgKHNlNDAxLT5yZXNldGxldmVsIT1vbGRyZXNldCkKKwkJc2U0MDFfc2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfQVJMViwgc2U0MDEtPnJlc2V0bGV2ZWwpOworCisJcmV0dXJuOworfQorCisvKiBpcnEgaGFuZGxlciBmb3Igc25hcHNob3QgYnV0dG9uICovCitzdGF0aWMgdm9pZCBzZTQwMV9idXR0b25faXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEgPSB1cmItPmNvbnRleHQ7CisJaW50IHN0YXR1czsKKwkKKwlpZiAoIXNlNDAxLT5kZXYpIHsKKwkJaW5mbygib2hvaDogZGV2aWNlIHZhcG91cmlzaGVkIik7CisJCXJldHVybjsKKwl9CisJCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID49MikgeworCQlpZiAoc2U0MDEtPmJ1dHRvbikKKwkJCXNlNDAxLT5idXR0b25wcmVzc2VkPTE7CisJfQorZXhpdDoKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzKQorCQllcnIgKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCisJCSAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBzZTQwMV92aWRlb19pcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSA9IHVyYi0+Y29udGV4dDsKKwlpbnQgbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCisJLyogb2hvaC4uLiAqLworCWlmICghc2U0MDEtPnN0cmVhbWluZykKKwkJcmV0dXJuOworCisJaWYgKCFzZTQwMS0+ZGV2KSB7CisJCWluZm8gKCJvaG9oOiBkZXZpY2UgdmFwb3VyaXNoZWQiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIDAgc2l6ZWQgcGFja2V0cyBoYXBwZW4gaWYgd2UgYXJlIHRvIGZhc3QsIGJ1dCBzb21ldGltZXMgdGhlIGNhbWVyYQorCSAgIGtlZXBzIHNlbmRpbmcgdGhlbSBmb3JldmVyLi4uCisJICovCisJaWYgKGxlbmd0aCAmJiAhdXJiLT5zdGF0dXMpIHsKKwkJc2U0MDEtPm51bGxwYWNrZXRzPTA7CisJCXN3aXRjaChzZTQwMS0+c2NyYXRjaFtzZTQwMS0+c2NyYXRjaF9uZXh0XS5zdGF0ZSkgeworCQkJY2FzZSBCVUZGRVJfUkVBRFk6CisJCQljYXNlIEJVRkZFUl9CVVNZOiB7CisJCQkJc2U0MDEtPmRyb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgQlVGRkVSX1VOVVNFRDogeworCQkJCW1lbWNweShzZTQwMS0+c2NyYXRjaFtzZTQwMS0+c2NyYXRjaF9uZXh0XS5kYXRhLCAodW5zaWduZWQgY2hhciAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyLCBsZW5ndGgpOworCQkJCXNlNDAxLT5zY3JhdGNoW3NlNDAxLT5zY3JhdGNoX25leHRdLnN0YXRlPUJVRkZFUl9SRUFEWTsKKwkJCQlzZTQwMS0+c2NyYXRjaFtzZTQwMS0+c2NyYXRjaF9uZXh0XS5vZmZzZXQ9c2U0MDEtPmJheWVyb2Zmc2V0OworCQkJCXNlNDAxLT5zY3JhdGNoW3NlNDAxLT5zY3JhdGNoX25leHRdLmxlbmd0aD1sZW5ndGg7CisJCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnNlNDAxLT53cSkpIHsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZTQwMS0+d3EpOworCQkJCX0KKwkJCQlzZTQwMS0+c2NyYXRjaF9vdmVyZmxvdz0wOworCQkJCXNlNDAxLT5zY3JhdGNoX25leHQrKzsKKwkJCQlpZiAoc2U0MDEtPnNjcmF0Y2hfbmV4dD49U0U0MDFfTlVNU0NSQVRDSCkKKwkJCQkJc2U0MDEtPnNjcmF0Y2hfbmV4dD0wOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNlNDAxLT5iYXllcm9mZnNldCs9bGVuZ3RoOworCQlpZiAoc2U0MDEtPmJheWVyb2Zmc2V0Pj1zZTQwMS0+Y2hlaWdodCpzZTQwMS0+Y3dpZHRoKSB7CisJCQlzZTQwMS0+YmF5ZXJvZmZzZXQ9MDsKKwkJfQorCX0gZWxzZSB7CisJCXNlNDAxLT5udWxscGFja2V0cysrOworCQlpZiAoc2U0MDEtPm51bGxwYWNrZXRzID4gU0U0MDFfTUFYX05VTExQQUNLRVRTKSB7CisJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmc2U0MDEtPndxKSkgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2U0MDEtPndxKTsKKwkJCX0JCQorCQl9CisJfQorCisJLyogUmVzdWJtaXQgdXJiIGZvciBuZXcgZGF0YSAqLworCXVyYi0+c3RhdHVzPTA7CisJdXJiLT5kZXY9c2U0MDEtPmRldjsKKwlpZih1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpKQorCQlpbmZvKCJ1cmIgYnVybmVkIGRvd24iKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNlNDAxX3NlbmRfc2l6ZShzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludCBpPTA7CisJaW50IG1vZGU9MHgwMzsgLyogTm8gY29tcHJlc3Npb24gKi8KKwlpbnQgc2VuZGhlaWdodD1oZWlnaHQ7CisJaW50IHNlbmR3aWR0aD13aWR0aDsKKworCS8qIEphbmdHdSBjb21wcmVzc2lvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlIGNhbWVyYSBzdXBwb3J0ZWQgc2l6ZXMsCisJICAgYnV0IGJheWVyIHNlZW1zIHRvIHdvcmsgd2l0aCBhbnkgc2l6ZSB0aGF0IGZpdHMgb24gdGhlIHNlbnNvci4KKwkgICBXZSBjaGVjayBpZiB3ZSBjYW4gdXNlIGNvbXByZXNzaW9uIHdpdGggdGhlIGN1cnJlbnQgc2l6ZSB3aXRoIGVpdGhlcgorCSAgIDQgb3IgMTYgdGltZXMgc3ViY2FwdHVyaW5nLCBpZiBub3Qgd2UgdXNlIHVuY29tcHJlc3NlZCBiYXllciBkYXRhCisJICAgYnV0IHRoaXMgd2lsbCByZXN1bHQgaW4gY3V0b3V0cyBvZiB0aGUgbWF4aW11bSBzaXplLi4uLgorCSAqLworCXdoaWxlIChpPHNlNDAxLT5zaXplcyAmJiAhKHNlNDAxLT53aWR0aFtpXT09d2lkdGggJiYgc2U0MDEtPmhlaWdodFtpXT09aGVpZ2h0KSkKKwkJaSsrOworCXdoaWxlIChpPHNlNDAxLT5zaXplcykgeworCQlpZiAoc2U0MDEtPndpZHRoW2ldPT13aWR0aCoyICYmIHNlNDAxLT5oZWlnaHRbaV09PWhlaWdodCoyKSB7CisJCQlzZW5kaGVpZ2h0PXNlNDAxLT5oZWlnaHRbaV07CisJCQlzZW5kd2lkdGg9c2U0MDEtPndpZHRoW2ldOworCQkJbW9kZT0weDQwOworCQl9CisJCWlmIChzZTQwMS0+d2lkdGhbaV09PXdpZHRoKjQgJiYgc2U0MDEtPmhlaWdodFtpXT09aGVpZ2h0KjQpIHsKKwkJCXNlbmRoZWlnaHQ9c2U0MDEtPmhlaWdodFtpXTsKKwkJCXNlbmR3aWR0aD1zZTQwMS0+d2lkdGhbaV07CisJCQltb2RlPTB4NDI7CisJCX0KKwkJaSsrOworCX0KKworCXNlNDAxX3NuZGN0cmwoMSwgc2U0MDEsIFNFNDAxX1JFUV9TRVRfV0lEVEgsIHNlbmR3aWR0aCwgTlVMTCwgMCk7CisJc2U0MDFfc25kY3RybCgxLCBzZTQwMSwgU0U0MDFfUkVRX1NFVF9IRUlHSFQsIHNlbmRoZWlnaHQsIE5VTEwsIDApOworCXNlNDAxX3NldF9mZWF0dXJlKHNlNDAxLCBTRTQwMV9PUEVSQVRJTkdNT0RFLCBtb2RlKTsKKworCWlmIChtb2RlPT0weDAzKSB7CisJCXNlNDAxLT5mb3JtYXQ9Rk1UX0JBWUVSOworCX0gZWxzZSB7CisJCXNlNDAxLT5mb3JtYXQ9Rk1UX0pBTkdHVTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisJSW4gdGhpcyBmdW5jdGlvbiBzZTQwMV9zZW5kX3BpY3QgaXMgY2FsbGVkIHNldmVyYWwgdGltZXMsCisJZm9yIHNvbWUgcmVhc29uIChkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBzZW5zb3IgYW5kIHRoZSBwaGFzZSBvZgorCXRoZSBtb29uIDopIGRvaW5nIHRoaXMgb25seSBpbiBlaXRoZXIgcGxhY2UgZG9lc24ndCBhbHdheXMgd29yay4uLgorKi8KK3N0YXRpYyBpbnQgc2U0MDFfc3RhcnRfc3RyZWFtKHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxKQoreworCXN0cnVjdCB1cmIgKnVyYjsKKwlpbnQgZXJyPTAsIGk7CisJc2U0MDEtPnN0cmVhbWluZz0xOworCisgICAgICAgIHNlNDAxX3NuZGN0cmwoMSwgc2U0MDEsIFNFNDAxX1JFUV9DQU1FUkFfUE9XRVIsIDEsIE5VTEwsIDApOworICAgICAgICBzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfTEVEX0NPTlRST0wsIDEsIE5VTEwsIDApOworCisJLyogU2V0IHBpY3R1cmUgc2V0dGluZ3MgKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19NT0RFX0IsIDB4MDUpOy8qd2luZG93ZWQgKyBwaXggaW50ZyAqLworCXNlNDAxX3NlbmRfcGljdChzZTQwMSk7CisKKwlzZTQwMV9zZW5kX3NpemUoc2U0MDEsIHNlNDAxLT5jd2lkdGgsIHNlNDAxLT5jaGVpZ2h0KTsKKworCXNlNDAxX3NuZGN0cmwoMSwgc2U0MDEsIFNFNDAxX1JFUV9TVEFSVF9DT05USU5VT1VTX0NBUFRVUkUsIDAsIE5VTEwsIDApOworCisJLyogRG8gc29tZSBtZW1vcnkgYWxsb2NhdGlvbiAqLworCWZvciAoaT0wOyBpPFNFNDAxX05VTUZSQU1FUzsgaSsrKSB7CisJCXNlNDAxLT5mcmFtZVtpXS5kYXRhPXNlNDAxLT5mYnVmICsgaSAqIHNlNDAxLT5tYXhmcmFtZXNpemU7CisJCXNlNDAxLT5mcmFtZVtpXS5jdXJwaXg9MDsKKwl9CisJZm9yIChpPTA7IGk8U0U0MDFfTlVNU0JVRjsgaSsrKSB7CisJCXNlNDAxLT5zYnVmW2ldLmRhdGE9a21hbGxvYyhTRTQwMV9QQUNLRVRTSVpFLCBHRlBfS0VSTkVMKTsKKwl9CisKKwlzZTQwMS0+YmF5ZXJvZmZzZXQ9MDsKKwlzZTQwMS0+c2NyYXRjaF9uZXh0PTA7CisJc2U0MDEtPnNjcmF0Y2hfdXNlPTA7CisJc2U0MDEtPnNjcmF0Y2hfb3ZlcmZsb3c9MDsKKwlmb3IgKGk9MDsgaTxTRTQwMV9OVU1TQ1JBVENIOyBpKyspIHsKKwkJc2U0MDEtPnNjcmF0Y2hbaV0uZGF0YT1rbWFsbG9jKFNFNDAxX1BBQ0tFVFNJWkUsIEdGUF9LRVJORUwpOworCQlzZTQwMS0+c2NyYXRjaFtpXS5zdGF0ZT1CVUZGRVJfVU5VU0VEOworCX0KKworCWZvciAoaT0wOyBpPFNFNDAxX05VTVNCVUY7IGkrKykgeworCQl1cmI9dXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYoIXVyYikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgc2U0MDEtPmRldiwKKwkJCXVzYl9yY3ZidWxrcGlwZShzZTQwMS0+ZGV2LCBTRTQwMV9WSURFT19FTkRQT0lOVCksCisJCQlzZTQwMS0+c2J1ZltpXS5kYXRhLCBTRTQwMV9QQUNLRVRTSVpFLAorCQkJc2U0MDFfdmlkZW9faXJxLAorCQkJc2U0MDEpOworCisJCXNlNDAxLT51cmJbaV09dXJiOworCisJCWVycj11c2Jfc3VibWl0X3VyYihzZTQwMS0+dXJiW2ldLCBHRlBfS0VSTkVMKTsKKwkJaWYoZXJyKQorCQkJZXJyKCJ1cmIgYnVybmVkIGRvd24iKTsKKwl9CisKKwlzZTQwMS0+ZnJhbWVjb3VudD0wOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2U0MDFfc3RvcF9zdHJlYW0oc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEpCit7CisJaW50IGk7CisKKwlpZiAoIXNlNDAxLT5zdHJlYW1pbmcgfHwgIXNlNDAxLT5kZXYpCisJCXJldHVybiAxOworCisJc2U0MDEtPnN0cmVhbWluZz0wOworCisJc2U0MDFfc25kY3RybCgxLCBzZTQwMSwgU0U0MDFfUkVRX1NUT1BfQ09OVElOVU9VU19DQVBUVVJFLCAwLCBOVUxMLCAwKTsKKworCXNlNDAxX3NuZGN0cmwoMSwgc2U0MDEsIFNFNDAxX1JFUV9MRURfQ09OVFJPTCwgMCwgTlVMTCwgMCk7CisJc2U0MDFfc25kY3RybCgxLCBzZTQwMSwgU0U0MDFfUkVRX0NBTUVSQV9QT1dFUiwgMCwgTlVMTCwgMCk7CisKKwlmb3IgKGk9MDsgaTxTRTQwMV9OVU1TQlVGOyBpKyspIGlmIChzZTQwMS0+dXJiW2ldKSB7CisJCXVzYl9raWxsX3VyYihzZTQwMS0+dXJiW2ldKTsKKwkJdXNiX2ZyZWVfdXJiKHNlNDAxLT51cmJbaV0pOworCQlzZTQwMS0+dXJiW2ldPU5VTEw7CisJCWtmcmVlKHNlNDAxLT5zYnVmW2ldLmRhdGEpOworCX0KKwlmb3IgKGk9MDsgaTxTRTQwMV9OVU1TQ1JBVENIOyBpKyspIHsKKwkJa2ZyZWUoc2U0MDEtPnNjcmF0Y2hbaV0uZGF0YSk7CisJCXNlNDAxLT5zY3JhdGNoW2ldLmRhdGE9TlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZTQwMV9zZXRfc2l6ZShzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWludCB3YXNzdHJlYW1pbmc9c2U0MDEtPnN0cmVhbWluZzsKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBjaGFuZ2UgKi8KKwlpZiAoc2U0MDEtPmN3aWR0aD09d2lkdGggJiYgc2U0MDEtPmNoZWlnaHQ9PWhlaWdodCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayBmb3IgYSB2YWxpZCBtb2RlICovCisJaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KQorCQlyZXR1cm4gMTsKKwlpZiAoKHdpZHRoICYgMSkgfHwgKGhlaWdodCAmIDEpKQorCQlyZXR1cm4gMTsKKwlpZiAod2lkdGg+c2U0MDEtPndpZHRoW3NlNDAxLT5zaXplcy0xXSkKKwkJcmV0dXJuIDE7CisJaWYgKGhlaWdodD5zZTQwMS0+aGVpZ2h0W3NlNDAxLT5zaXplcy0xXSkKKwkJcmV0dXJuIDE7CisKKwkvKiBTdG9wIGEgY3VycmVudCBzdHJlYW0gYW5kIHN0YXJ0IGl0IGFnYWluIGF0IHRoZSBuZXcgc2l6ZSAqLworCWlmICh3YXNzdHJlYW1pbmcpCisJCXNlNDAxX3N0b3Bfc3RyZWFtKHNlNDAxKTsKKwlzZTQwMS0+Y3dpZHRoPXdpZHRoOworCXNlNDAxLT5jaGVpZ2h0PWhlaWdodDsKKwlpZiAod2Fzc3RyZWFtaW5nKQorCQlzZTQwMV9zdGFydF9zdHJlYW0oc2U0MDEpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVmlkZW8gRGVjb2RpbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVRoaXMgc2hvdWxkbid0IHJlYWxseSBiZSBkb25lIGluIGEgdjRsIGRyaXZlci4uLi4KKwlCdXQgaXQgZG9lcyBtYWtlIHRoZSBpbWFnZSBsb29rIGEgbG90IG1vcmUgdXNhYmxlLgorCUJhc2ljYWxseSBpdCBsaWZ0cyB0aGUgZGFyayBwaXhlbHMgbW9yZSB0aGFuIHRoZSBsaWdodCBwaXhlbHMuCisqLworc3RhdGljIGlubGluZSB2b2lkIGVuaGFuY2VfcGljdHVyZSh1bnNpZ25lZCBjaGFyICpmcmFtZSwgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuLS0pIHsKKwkJKmZyYW1lPSgoKCpmcmFtZV4yNTUpKigqZnJhbWVeMjU1KSkvMjU1KV4yNTU7CisJCWZyYW1lKys7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlX0phbmdHdV9pbnRlZ3JhdGUoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIGludCBkYXRhKQoreworCXN0cnVjdCBzZTQwMV9mcmFtZSAqZnJhbWU9JnNlNDAxLT5mcmFtZVtzZTQwMS0+Y3VyZnJhbWVdOworCWludCBsaW5lbGVuZ3RoPXNlNDAxLT5jd2lkdGgqMzsKKworCWlmIChmcmFtZS0+Y3VybGluZXBpeCA+PSBsaW5lbGVuZ3RoKSB7CisJCWZyYW1lLT5jdXJsaW5lcGl4PTA7CisJCWZyYW1lLT5jdXJsaW5lKz1saW5lbGVuZ3RoOworCX0KKworCS8qIEZpcnN0IHRocmVlIGFyZSBhYnNvbHV0ZSwgYWxsIG90aGVycyByZWxhdGl2ZS4KKwkgKiBGb3JtYXQgaXMgcmdiIGZyb20gcmlnaHQgdG8gbGVmdCAobWlycm9ycmVkIGltYWdlKSwgCisJICogd2UgZmxpcCBpdCB0byBnZXQgYmdyIGZyb20gbGVmdCB0byByaWdodC4gKi8KKwlpZiAoZnJhbWUtPmN1cmxpbmVwaXggPCAzKSB7CisJCSooZnJhbWUtPmN1cmxpbmUtZnJhbWUtPmN1cmxpbmVwaXgpPTErZGF0YSo0OworCX0gZWxzZSB7CisJCSooZnJhbWUtPmN1cmxpbmUtZnJhbWUtPmN1cmxpbmVwaXgpPQorCQkgICAgKihmcmFtZS0+Y3VybGluZS1mcmFtZS0+Y3VybGluZXBpeCszKStkYXRhKjQ7CisJfQorCWZyYW1lLT5jdXJsaW5lcGl4Kys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNvZGVfSmFuZ0d1X3ZsYyAoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBiaXRfZXhwLCBpbnQgcGFja2V0bGVuZ3RoKQoreworCWludCBwb3M9MDsKKwlpbnQgdmxjX2NvZD0wOworCWludCB2bGNfc2l6ZT0wOworCWludCB2bGNfZGF0YT0wOworCWludCBiaXRfY3VyOworCWludCBiaXQ7CisJZGF0YSs9NDsKKwl3aGlsZSAocG9zIDwgcGFja2V0bGVuZ3RoKSB7CisJCWJpdF9jdXI9ODsKKwkJd2hpbGUgKGJpdF9jdXIgJiYgYml0X2V4cCkgeworCQkJYml0PSgoKmRhdGEpPj4oYml0X2N1ci0xKSkmMTsKKwkJCWlmICghdmxjX2NvZCkgeworCQkJCWlmIChiaXQpIHsKKwkJCQkJdmxjX3NpemUrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIXZsY19zaXplKSB7CisJCQkJCQlkZWNvZGVfSmFuZ0d1X2ludGVncmF0ZShzZTQwMSwgMCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl2bGNfY29kPTI7CisJCQkJCQl2bGNfZGF0YT0wOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodmxjX2NvZD09MikgeworCQkJCQlpZiAoIWJpdCkKKwkJCQkJCXZsY19kYXRhID0gIC0oMTw8dmxjX3NpemUpICsgMTsKKwkJCQkJdmxjX2NvZC0tOworCQkJCX0KKwkJCQl2bGNfc2l6ZS0tOworCQkJCXZsY19kYXRhKz1iaXQ8PHZsY19zaXplOworCQkJCWlmICghdmxjX3NpemUpIHsKKwkJCQkJZGVjb2RlX0phbmdHdV9pbnRlZ3JhdGUoc2U0MDEsIHZsY19kYXRhKTsKKwkJCQkJdmxjX2NvZD0wOworCQkJCX0KKwkJCX0KKwkJCWJpdF9jdXItLTsKKwkJCWJpdF9leHAtLTsKKwkJfQorCQlwb3MrKzsKKwkJZGF0YSsrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY29kZV9KYW5nR3UgKHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxLCBzdHJ1Y3Qgc2U0MDFfc2NyYXRjaCAqYnVmZmVyKQoreworCXVuc2lnbmVkIGNoYXIgKmRhdGE9YnVmZmVyLT5kYXRhOworCWludCBsZW49YnVmZmVyLT5sZW5ndGg7CisJaW50IGJpdF9leHA9MCwgcGl4X2V4cD0wLCBmcmFtZWluZm89MCwgcGFja2V0bGVuZ3RoPTAsIHNpemU7CisJaW50IGRhdGFwb3M9MDsKKworCS8qIE5ldyBpbWFnZT8gKi8KKwlpZiAoIXNlNDAxLT5mcmFtZVtzZTQwMS0+Y3VyZnJhbWVdLmN1cnBpeCkgeworCQlzZTQwMS0+ZnJhbWVbc2U0MDEtPmN1cmZyYW1lXS5jdXJsaW5lcGl4PTA7CisJCXNlNDAxLT5mcmFtZVtzZTQwMS0+Y3VyZnJhbWVdLmN1cmxpbmU9CisJCSAgICBzZTQwMS0+ZnJhbWVbc2U0MDEtPmN1cmZyYW1lXS5kYXRhKworCQkgICAgc2U0MDEtPmN3aWR0aCozLTE7CisJCWlmIChzZTQwMS0+ZnJhbWVbc2U0MDEtPmN1cmZyYW1lXS5ncmFic3RhdGU9PUZSQU1FX1JFQURZKQorCQkJc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uZ3JhYnN0YXRlPUZSQU1FX0dSQUJCSU5HOworCQlzZTQwMS0+dmxjZGF0YXBvcz0wOworCX0KKwl3aGlsZSAoZGF0YXBvcyA8IGxlbikgeworCQlzaXplPTEwMjQtc2U0MDEtPnZsY2RhdGFwb3M7CisJCWlmIChzaXplK2RhdGFwb3MgPiBsZW4pCisJCQlzaXplPWxlbi1kYXRhcG9zOworCQltZW1jcHkoc2U0MDEtPnZsY2RhdGErc2U0MDEtPnZsY2RhdGFwb3MsIGRhdGErZGF0YXBvcywgc2l6ZSk7CisJCXNlNDAxLT52bGNkYXRhcG9zKz1zaXplOworCQlwYWNrZXRsZW5ndGg9MDsKKwkJaWYgKHNlNDAxLT52bGNkYXRhcG9zID49IDQpIHsKKwkJCWJpdF9leHA9c2U0MDEtPnZsY2RhdGFbM10rKHNlNDAxLT52bGNkYXRhWzJdPDw4KTsKKwkJCXBpeF9leHA9c2U0MDEtPnZsY2RhdGFbMV0rKChzZTQwMS0+dmxjZGF0YVswXSYweDNmKTw8OCk7CisJCQlmcmFtZWluZm89c2U0MDEtPnZsY2RhdGFbMF0mMHhjMDsKKwkJCXBhY2tldGxlbmd0aD0oKGJpdF9leHArNDcpPj40KTw8MTsKKwkJCWlmIChwYWNrZXRsZW5ndGggPiAxMDI0KSB7CisJCQkJc2U0MDEtPnZsY2RhdGFwb3M9MDsKKwkJCQlkYXRhcG9zPWxlbjsKKwkJCQlwYWNrZXRsZW5ndGg9MDsKKwkJCQlzZTQwMS0+ZXJyb3IrKzsKKwkJCQlzZTQwMS0+ZnJhbWVbc2U0MDEtPmN1cmZyYW1lXS5jdXJwaXg9MDsKKwkJCX0KKwkJfQorCQlpZiAocGFja2V0bGVuZ3RoICYmIHNlNDAxLT52bGNkYXRhcG9zID49IHBhY2tldGxlbmd0aCkgeworCQkJZGVjb2RlX0phbmdHdV92bGMoc2U0MDEsIHNlNDAxLT52bGNkYXRhLCBiaXRfZXhwLCBwYWNrZXRsZW5ndGgpOworCQkJc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uY3VycGl4Kz1waXhfZXhwKjM7CisJCQlkYXRhcG9zKz1zaXplLShzZTQwMS0+dmxjZGF0YXBvcy1wYWNrZXRsZW5ndGgpOworCQkJc2U0MDEtPnZsY2RhdGFwb3M9MDsKKwkJCWlmIChzZTQwMS0+ZnJhbWVbc2U0MDEtPmN1cmZyYW1lXS5jdXJwaXg+PXNlNDAxLT5jd2lkdGgqc2U0MDEtPmNoZWlnaHQqMykgeworCQkJCWlmIChzZTQwMS0+ZnJhbWVbc2U0MDEtPmN1cmZyYW1lXS5jdXJwaXg9PXNlNDAxLT5jd2lkdGgqc2U0MDEtPmNoZWlnaHQqMykgeworCQkJCQlpZiAoc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uZ3JhYnN0YXRlPT1GUkFNRV9HUkFCQklORykgeworCQkJCQkJc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uZ3JhYnN0YXRlPUZSQU1FX0RPTkU7CisJCQkJCQlzZTQwMS0+ZnJhbWVjb3VudCsrOworCQkJCQkJc2U0MDEtPnJlYWRjb3VudCsrOworCQkJCQl9CisJCQkJCWlmIChzZTQwMS0+ZnJhbWVbKHNlNDAxLT5jdXJmcmFtZSsxKSYoU0U0MDFfTlVNRlJBTUVTLTEpXS5ncmFic3RhdGU9PUZSQU1FX1JFQURZKSB7CisJCQkJCQlzZTQwMS0+Y3VyZnJhbWU9KHNlNDAxLT5jdXJmcmFtZSsxKSAmIChTRTQwMV9OVU1GUkFNRVMtMSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlzZTQwMS0+ZXJyb3IrKzsKKwkJCQl9CisJCQkJc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uY3VycGl4PTA7CisJCQkJZGF0YXBvcz1sZW47CisJCQl9CisJCX0gZWxzZSB7CisJCQlkYXRhcG9zKz1zaXplOworCQl9CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlX2JheWVyIChzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSwgc3RydWN0IHNlNDAxX3NjcmF0Y2ggKmJ1ZmZlcikKK3sKKwl1bnNpZ25lZCBjaGFyICpkYXRhPWJ1ZmZlci0+ZGF0YTsKKwlpbnQgbGVuPWJ1ZmZlci0+bGVuZ3RoOworCWludCBvZmZzZXQ9YnVmZmVyLT5vZmZzZXQ7CisJaW50IGRhdGFzaXplPXNlNDAxLT5jd2lkdGgqc2U0MDEtPmNoZWlnaHQ7CisJc3RydWN0IHNlNDAxX2ZyYW1lICpmcmFtZT0mc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV07CisKKwl1bnNpZ25lZCBjaGFyICpmcmFtZWRhdGE9ZnJhbWUtPmRhdGEsICpjdXJsaW5lLCAqbmV4dGxpbmU7CisJaW50IHdpZHRoPXNlNDAxLT5jd2lkdGg7CisJaW50IGJsaW5lb2Zmc2V0PTAsIGJsaW5lOworCWludCBsaW5lbGVuZ3RoPXdpZHRoKjMsIGk7CisJCisKKwlpZiAoZnJhbWUtPmN1cnBpeD09MCkgeworCQlpZiAoZnJhbWUtPmdyYWJzdGF0ZT09RlJBTUVfUkVBRFkpIHsKKwkJCWZyYW1lLT5ncmFic3RhdGU9RlJBTUVfR1JBQkJJTkc7CisJCX0KKwkJZnJhbWUtPmN1cmxpbmU9ZnJhbWVkYXRhK2xpbmVsZW5ndGg7CisJCWZyYW1lLT5jdXJsaW5lcGl4PTA7CisJfQorCisJaWYgKG9mZnNldCE9ZnJhbWUtPmN1cnBpeCkgeworCQkvKiBSZWdhcmQgZnJhbWUgYXMgbG9zdCA6KCAqLworCQlmcmFtZS0+Y3VycGl4PTA7CisJCXNlNDAxLT5lcnJvcisrOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBtdWNoIGRhdGEgKi8KKwlpZiAoZnJhbWUtPmN1cnBpeCtsZW4gPiBkYXRhc2l6ZSkgeworCQlsZW49ZGF0YXNpemUtZnJhbWUtPmN1cnBpeDsKKwl9CisJaWYgKHNlNDAxLT5jaGVpZ2h0JTQpCisJCWJsaW5lb2Zmc2V0PTE7CisJYmxpbmU9ZnJhbWUtPmN1cnBpeC9zZTQwMS0+Y3dpZHRoK2JsaW5lb2Zmc2V0OworCisJY3VybGluZT1mcmFtZS0+Y3VybGluZTsKKwluZXh0bGluZT1jdXJsaW5lK2xpbmVsZW5ndGg7CisJaWYgKG5leHRsaW5lID49IGZyYW1lZGF0YStkYXRhc2l6ZSozKQorCQluZXh0bGluZT1jdXJsaW5lOworCXdoaWxlIChsZW4pIHsKKwkJaWYgKGZyYW1lLT5jdXJsaW5lcGl4Pj13aWR0aCkgeworCQkJZnJhbWUtPmN1cmxpbmVwaXgtPXdpZHRoOworCQkJYmxpbmU9ZnJhbWUtPmN1cnBpeC93aWR0aCtibGluZW9mZnNldDsKKwkJCWN1cmxpbmUrPWxpbmVsZW5ndGgqMjsKKwkJCW5leHRsaW5lKz1saW5lbGVuZ3RoKjI7CisJCQlpZiAoY3VybGluZSA+PSBmcmFtZWRhdGErZGF0YXNpemUqMykgeworCQkJCWZyYW1lLT5jdXJsaW5lcGl4Kys7CisJCQkJY3VybGluZS09MzsKKwkJCQluZXh0bGluZS09MzsKKwkJCQlsZW4tLTsKKwkJCQlkYXRhKys7CisJCQkJZnJhbWUtPmN1cnBpeCsrOworCQkJfQorCQkJaWYgKG5leHRsaW5lID49IGZyYW1lZGF0YStkYXRhc2l6ZSozKQorCQkJCW5leHRsaW5lPWN1cmxpbmU7CisJCX0KKwkJaWYgKChibGluZSYxKSkgeworCQkJaWYgKChmcmFtZS0+Y3VybGluZXBpeCYxKSkgeworCQkJCSooY3VybGluZSsyKT0qZGF0YTsKKwkJCQkqKGN1cmxpbmUtMSk9KmRhdGE7CisJCQkJKihuZXh0bGluZSsyKT0qZGF0YTsKKwkJCQkqKG5leHRsaW5lLTEpPSpkYXRhOworCQkJfSBlbHNlIHsKKwkJCQkqKGN1cmxpbmUrMSk9CisJCQkJCSgqKGN1cmxpbmUrMSkrKmRhdGEpLzI7CisJCQkJKihjdXJsaW5lLTIpPQorCQkJCQkoKihjdXJsaW5lLTIpKypkYXRhKS8yOworCQkJCSoobmV4dGxpbmUrMSk9KmRhdGE7CisJCQkJKihuZXh0bGluZS0yKT0qZGF0YTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgoZnJhbWUtPmN1cmxpbmVwaXgmMSkpIHsKKwkJCQkqKGN1cmxpbmUrMSk9CisJCQkJCSgqKGN1cmxpbmUrMSkrKmRhdGEpLzI7CisJCQkJKihjdXJsaW5lLTIpPQorCQkJCQkoKihjdXJsaW5lLTIpKypkYXRhKS8yOworCQkJCSoobmV4dGxpbmUrMSk9KmRhdGE7CisJCQkJKihuZXh0bGluZS0yKT0qZGF0YTsKKwkJCX0gZWxzZSB7CisJCQkJKmN1cmxpbmU9KmRhdGE7CisJCQkJKihjdXJsaW5lLTMpPSpkYXRhOworCQkJCSpuZXh0bGluZT0qZGF0YTsKKwkJCQkqKG5leHRsaW5lLTMpPSpkYXRhOworCQkJfQorCQl9CisJCWZyYW1lLT5jdXJsaW5lcGl4Kys7CisJCWN1cmxpbmUtPTM7CisJCW5leHRsaW5lLT0zOworCQlsZW4tLTsKKwkJZGF0YSsrOworCQlmcmFtZS0+Y3VycGl4Kys7CisJfQorCWZyYW1lLT5jdXJsaW5lPWN1cmxpbmU7CisKKwlpZiAoZnJhbWUtPmN1cnBpeD49ZGF0YXNpemUpIHsKKwkJLyogRml4IHRoZSB0b3AgbGluZSAqLworCQlmcmFtZWRhdGErPWxpbmVsZW5ndGg7CisJCWZvciAoaT0wOyBpPGxpbmVsZW5ndGg7IGkrKykgeworCQkJZnJhbWVkYXRhLS07CisJCQkqZnJhbWVkYXRhPSooZnJhbWVkYXRhK2xpbmVsZW5ndGgpOworCQl9CisJCS8qIEZpeCB0aGUgbGVmdCBzaWRlIChncmVlbiBpcyBhbHJlYWR5IHByZXNlbnQpICovCisJCWZvciAoaT0wOyBpPHNlNDAxLT5jaGVpZ2h0OyBpKyspIHsKKwkJCSpmcmFtZWRhdGE9KihmcmFtZWRhdGErMyk7CisJCQkqKGZyYW1lZGF0YSsxKT0qKGZyYW1lZGF0YSs0KTsKKwkJCSooZnJhbWVkYXRhKzIpPSooZnJhbWVkYXRhKzUpOworCQkJZnJhbWVkYXRhKz1saW5lbGVuZ3RoOworCQl9CisJCWZyYW1lLT5jdXJwaXg9MDsKKwkJZnJhbWUtPmdyYWJzdGF0ZT1GUkFNRV9ET05FOworCQlzZTQwMS0+ZnJhbWVjb3VudCsrOworCQlzZTQwMS0+cmVhZGNvdW50Kys7CisJCWlmIChzZTQwMS0+ZnJhbWVbKHNlNDAxLT5jdXJmcmFtZSsxKSYoU0U0MDFfTlVNRlJBTUVTLTEpXS5ncmFic3RhdGU9PUZSQU1FX1JFQURZKSB7CisJCQlzZTQwMS0+Y3VyZnJhbWU9KHNlNDAxLT5jdXJmcmFtZSsxKSAmIChTRTQwMV9OVU1GUkFNRVMtMSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgc2U0MDFfbmV3ZnJhbWUoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIGludCBmcmFtZW5yKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCBlcnJvcnM9MDsKKworCXdoaWxlIChzZTQwMS0+c3RyZWFtaW5nICYmCisJICAgIChzZTQwMS0+ZnJhbWVbZnJhbWVucl0uZ3JhYnN0YXRlPT1GUkFNRV9SRUFEWSB8fAorCSAgICAgc2U0MDEtPmZyYW1lW2ZyYW1lbnJdLmdyYWJzdGF0ZT09RlJBTUVfR1JBQkJJTkcpICkgeworCQlpZighc2U0MDEtPmZyYW1lW2ZyYW1lbnJdLmN1cnBpeCkgeworCQkJZXJyb3JzKys7CisJCX0KKwkJd2FpdF9pbnRlcnJ1cHRpYmxlKAorCQkgICAgc2U0MDEtPnNjcmF0Y2hbc2U0MDEtPnNjcmF0Y2hfdXNlXS5zdGF0ZSE9QlVGRkVSX1JFQURZLAorCQkgICAgJnNlNDAxLT53cSwKKwkJICAgICZ3YWl0CisJCSk7CisJCWlmIChzZTQwMS0+bnVsbHBhY2tldHMgPiBTRTQwMV9NQVhfTlVMTFBBQ0tFVFMpIHsKKwkJCXNlNDAxLT5udWxscGFja2V0cz0wOworCQkJaW5mbygidG8gbWFueSBudWxsIGxlbmd0aCBwYWNrZXRzLCByZXN0YXJ0aW5nIGNhcHR1cmUiKTsKKwkJCXNlNDAxX3N0b3Bfc3RyZWFtKHNlNDAxKTsKKwkJCXNlNDAxX3N0YXJ0X3N0cmVhbShzZTQwMSk7CQkJCisJCX0gZWxzZSB7CisJCQlpZiAoc2U0MDEtPnNjcmF0Y2hbc2U0MDEtPnNjcmF0Y2hfdXNlXS5zdGF0ZSE9QlVGRkVSX1JFQURZKSB7CisJCQkJc2U0MDEtPmZyYW1lW2ZyYW1lbnJdLmdyYWJzdGF0ZT1GUkFNRV9FUlJPUjsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXNlNDAxLT5zY3JhdGNoW3NlNDAxLT5zY3JhdGNoX3VzZV0uc3RhdGU9QlVGRkVSX0JVU1k7CisJCQlpZiAoc2U0MDEtPmZvcm1hdD09Rk1UX0pBTkdHVSkgeworCQkJCWRlY29kZV9KYW5nR3Uoc2U0MDEsICZzZTQwMS0+c2NyYXRjaFtzZTQwMS0+c2NyYXRjaF91c2VdKTsKKwkJCX0gZWxzZSB7CisJCQkJZGVjb2RlX2JheWVyKHNlNDAxLCAmc2U0MDEtPnNjcmF0Y2hbc2U0MDEtPnNjcmF0Y2hfdXNlXSk7CisJCQl9CisJCQlzZTQwMS0+c2NyYXRjaFtzZTQwMS0+c2NyYXRjaF91c2VdLnN0YXRlPUJVRkZFUl9VTlVTRUQ7CisJCQlzZTQwMS0+c2NyYXRjaF91c2UrKzsKKwkJCWlmIChzZTQwMS0+c2NyYXRjaF91c2U+PVNFNDAxX05VTVNDUkFUQ0gpCisJCQkJc2U0MDEtPnNjcmF0Y2hfdXNlPTA7CisJCQlpZiAoZXJyb3JzID4gU0U0MDFfTUFYX0VSUk9SUykgeworCQkJCWVycm9ycz0wOworCQkJCWluZm8oInRvIG11Y2ggZXJyb3JzLCByZXN0YXJ0aW5nIGNhcHR1cmUiKTsKKwkJCQlzZTQwMV9zdG9wX3N0cmVhbShzZTQwMSk7CisJCQkJc2U0MDFfc3RhcnRfc3RyZWFtKHNlNDAxKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzZTQwMS0+ZnJhbWVbZnJhbWVucl0uZ3JhYnN0YXRlPT1GUkFNRV9ET05FKQorCQlpZiAoc2U0MDEtPmVuaGFuY2UpCisJCQllbmhhbmNlX3BpY3R1cmUoc2U0MDEtPmZyYW1lW2ZyYW1lbnJdLmRhdGEsIHNlNDAxLT5jaGVpZ2h0KnNlNDAxLT5jd2lkdGgqMyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYl9zZTQwMV9yZW1vdmVfZGlzY29ubmVjdGVkIChzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSkKK3sKKwlpbnQgaTsKKworICAgICAgICBzZTQwMS0+ZGV2ID0gTlVMTDsKKworCWZvciAoaT0wOyBpPFNFNDAxX05VTVNCVUY7IGkrKykgaWYgKHNlNDAxLT51cmJbaV0pIHsKKwkJdXNiX2tpbGxfdXJiKHNlNDAxLT51cmJbaV0pOworCQl1c2JfZnJlZV91cmIoc2U0MDEtPnVyYltpXSk7CisJCXNlNDAxLT51cmJbaV0gPSBOVUxMOworCQlrZnJlZShzZTQwMS0+c2J1ZltpXS5kYXRhKTsKKwl9CisJZm9yIChpPTA7IGk8U0U0MDFfTlVNU0NSQVRDSDsgaSsrKSBpZiAoc2U0MDEtPnNjcmF0Y2hbaV0uZGF0YSkgeworCQlrZnJlZShzZTQwMS0+c2NyYXRjaFtpXS5kYXRhKTsKKwl9CisJaWYgKHNlNDAxLT5pbnR1cmIpIHsKKwkJdXNiX2tpbGxfdXJiKHNlNDAxLT5pbnR1cmIpOworCQl1c2JfZnJlZV91cmIoc2U0MDEtPmludHVyYik7CisJfQorICAgICAgICBpbmZvKCIlcyBkaXNjb25uZWN0ZWQiLCBzZTQwMS0+Y2FtZXJhX25hbWUpOworCisgICAgICAgIC8qIEZyZWUgdGhlIG1lbW9yeSAqLworCWtmcmVlKHNlNDAxLT53aWR0aCk7CisJa2ZyZWUoc2U0MDEtPmhlaWdodCk7CisJa2ZyZWUoc2U0MDEpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBWaWRlbzRMaW51eAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIGludCBzZTQwMV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEgPSAoc3RydWN0IHVzYl9zZTQwMSAqKWRldjsKKwlpbnQgZXJyID0gMDsKKworCWlmIChzZTQwMS0+dXNlcikKKwkJcmV0dXJuIC1FQlVTWTsKKwlzZTQwMS0+ZmJ1ZiA9IHJ2bWFsbG9jKHNlNDAxLT5tYXhmcmFtZXNpemUgKiBTRTQwMV9OVU1GUkFNRVMpOworCWlmIChzZTQwMS0+ZmJ1ZikKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2OworCWVsc2UgCisJCWVyciA9IC1FTk9NRU07CisJc2U0MDEtPnVzZXIgPSAhZXJyOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzZTQwMV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxID0gKHN0cnVjdCB1c2Jfc2U0MDEgKilkZXY7CisJaW50IGk7CisKKwlydmZyZWUoc2U0MDEtPmZidWYsIHNlNDAxLT5tYXhmcmFtZXNpemUgKiBTRTQwMV9OVU1GUkFNRVMpOworICAgICAgICBpZiAoc2U0MDEtPnJlbW92ZWQpIHsKKwkJdXNiX3NlNDAxX3JlbW92ZV9kaXNjb25uZWN0ZWQoc2U0MDEpOworCQlpbmZvKCJkZXZpY2UgdW5yZWdpc3RlcmVkIik7CisJfSBlbHNlIHsKKwkJZm9yIChpPTA7IGk8U0U0MDFfTlVNRlJBTUVTOyBpKyspCisJCQlzZTQwMS0+ZnJhbWVbaV0uZ3JhYnN0YXRlPUZSQU1FX1VOVVNFRDsKKwkJaWYgKHNlNDAxLT5zdHJlYW1pbmcpCisJCQlzZTQwMV9zdG9wX3N0cmVhbShzZTQwMSk7CisJCXNlNDAxLT51c2VyPTA7CisJfQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2U0MDFfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgICBzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSA9IChzdHJ1Y3QgdXNiX3NlNDAxICopdmRldjsKKworICAgICAgICBpZiAoIXNlNDAxLT5kZXYpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisKKyAgICAgICAgc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ0dDQVA6CisJeworCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqYiA9IGFyZzsKKwkJc3RyY3B5KGItPm5hbWUsIHNlNDAxLT5jYW1lcmFfbmFtZSk7CisJCWItPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFOworCQliLT5jaGFubmVscyA9IDE7CisJCWItPmF1ZGlvcyA9IDA7CisJCWItPm1heHdpZHRoID0gc2U0MDEtPndpZHRoW3NlNDAxLT5zaXplcy0xXTsKKwkJYi0+bWF4aGVpZ2h0ID0gc2U0MDEtPmhlaWdodFtzZTQwMS0+c2l6ZXMtMV07CisJCWItPm1pbndpZHRoID0gc2U0MDEtPndpZHRoWzBdOworCQliLT5taW5oZWlnaHQgPSBzZTQwMS0+aGVpZ2h0WzBdOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NHQ0hBTjoKKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCisJCWlmICh2LT5jaGFubmVsICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdi0+ZmxhZ3MgPSAwOworCQl2LT50dW5lcnMgPSAwOworCQl2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCXN0cmNweSh2LT5uYW1lLCAiQ2FtZXJhIik7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ1NDSEFOOgorCXsKKwkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisKKwkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9CisgICAgICAgIGNhc2UgVklESU9DR1BJQ1Q6CisgICAgICAgIHsKKwkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CisKKwkJc2U0MDFfZ2V0X3BpY3Qoc2U0MDEsIHApOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTUElDVDoKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCisJCWlmIChzZTQwMV9zZXRfcGljdChzZTQwMSwgcCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU1dJTjoKKwl7CisJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCisJCWlmICh2dy0+ZmxhZ3MpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHZ3LT5jbGlwY291bnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHNlNDAxX3NldF9zaXplKHNlNDAxLCB2dy0+d2lkdGgsIHZ3LT5oZWlnaHQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOworICAgICAgICB9CisJY2FzZSBWSURJT0NHV0lOOgorCXsKKwkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7CisKKwkJdnctPnggPSAwOyAgICAgICAgICAgICAgIC8qIEZJWE1FICovCisJCXZ3LT55ID0gMDsKKwkJdnctPmNocm9tYWtleSA9IDA7CisJCXZ3LT5mbGFncyA9IDA7CisJCXZ3LT5jbGlwY291bnQgPSAwOworCQl2dy0+d2lkdGggPSBzZTQwMS0+Y3dpZHRoOworCQl2dy0+aGVpZ2h0ID0gc2U0MDEtPmNoZWlnaHQ7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ0dNQlVGOgorCXsKKwkJc3RydWN0IHZpZGVvX21idWYgKnZtID0gYXJnOworCQlpbnQgaTsKKworCQltZW1zZXQodm0sIDAsIHNpemVvZigqdm0pKTsKKwkJdm0tPnNpemUgPSBTRTQwMV9OVU1GUkFNRVMgKiBzZTQwMS0+bWF4ZnJhbWVzaXplOworCQl2bS0+ZnJhbWVzID0gU0U0MDFfTlVNRlJBTUVTOworCQlmb3IgKGk9MDsgaTxTRTQwMV9OVU1GUkFNRVM7IGkrKykKKwkJCXZtLT5vZmZzZXRzW2ldID0gc2U0MDEtPm1heGZyYW1lc2l6ZSAqIGk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ01DQVBUVVJFOgorCXsKKwkJc3RydWN0IHZpZGVvX21tYXAgKnZtID0gYXJnOworCisJCWlmICh2bS0+Zm9ybWF0ICE9IFZJREVPX1BBTEVUVEVfUkdCMjQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHZtLT5mcmFtZSA+PSBTRTQwMV9OVU1GUkFNRVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHNlNDAxLT5mcmFtZVt2bS0+ZnJhbWVdLmdyYWJzdGF0ZSAhPSBGUkFNRV9VTlVTRUQpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCS8qIElzIHRoaXMgYWNjb3JkaW5nIHRvIHRoZSB2NGwgc3BlYz8/PyAqLworCQlpZiAoc2U0MDFfc2V0X3NpemUoc2U0MDEsIHZtLT53aWR0aCwgdm0tPmhlaWdodCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc2U0MDEtPmZyYW1lW3ZtLT5mcmFtZV0uZ3JhYnN0YXRlPUZSQU1FX1JFQURZOworCisJCWlmICghc2U0MDEtPnN0cmVhbWluZykKKwkJCXNlNDAxX3N0YXJ0X3N0cmVhbShzZTQwMSk7CisKKwkJLyogU2V0IHRoZSBwaWN0dXJlIHByb3BlcnRpZXMgKi8KKwkJaWYgKHNlNDAxLT5mcmFtZWNvdW50PT0wKQorCQkJc2U0MDFfc2VuZF9waWN0KHNlNDAxKTsKKwkJLyogQ2FsaWJyYXRlIHRoZSByZXNldCBsZXZlbCBhZnRlciBhIGZldyBmcmFtZXMuICovCisJCWlmIChzZTQwMS0+ZnJhbWVjb3VudCUyMD09MSkKKwkJCXNlNDAxX2F1dG9fcmVzZXRsZXZlbChzZTQwMSk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU1lOQzoKKwl7CisJCWludCAqZnJhbWUgPSBhcmc7CisJCWludCByZXQ9MDsKKworCQlpZigqZnJhbWUgPDAgfHwgKmZyYW1lID49IFNFNDAxX05VTUZSQU1FUykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldD1zZTQwMV9uZXdmcmFtZShzZTQwMSwgKmZyYW1lKTsKKwkJc2U0MDEtPmZyYW1lWypmcmFtZV0uZ3JhYnN0YXRlPUZSQU1FX1VOVVNFRDsKKwkJcmV0dXJuIHJldDsKKwl9CisJY2FzZSBWSURJT0NHRkJVRjoKKwl7CisJCXN0cnVjdCB2aWRlb19idWZmZXIgKnZiID0gYXJnOworCisJCW1lbXNldCh2YiwgMCwgc2l6ZW9mKCp2YikpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NLRVk6CisJCXJldHVybiAwOworCWNhc2UgVklESU9DQ0FQVFVSRToKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBWSURJT0NTRkJVRjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBWSURJT0NHVFVORVI6CisJY2FzZSBWSURJT0NTVFVORVI6CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgVklESU9DR0ZSRVE6CisJY2FzZSBWSURJT0NTRlJFUToKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBWSURJT0NHQVVESU86CisJY2FzZSBWSURJT0NTQVVESU86CisJCXJldHVybiAtRUlOVkFMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PSU9DVExDTUQ7CisgICAgICAgIH0gLyogZW5kIHN3aXRjaCAqLworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlNDAxX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgc2U0MDFfZG9faW9jdGwpOworfQorCitzdGF0aWMgc3NpemVfdCBzZTQwMV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByZWFsY291bnQ9Y291bnQsIHJldD0wOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSA9IChzdHJ1Y3QgdXNiX3NlNDAxICopZGV2OworCisKKwlpZiAoc2U0MDEtPmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAocmVhbGNvdW50ID4gc2U0MDEtPmN3aWR0aCpzZTQwMS0+Y2hlaWdodCozKQorCQlyZWFsY291bnQ9c2U0MDEtPmN3aWR0aCpzZTQwMS0+Y2hlaWdodCozOworCisJLyogU2hvdWxkbid0IGhhcHBlbjogKi8KKwlpZiAoc2U0MDEtPmZyYW1lWzBdLmdyYWJzdGF0ZT09RlJBTUVfR1JBQkJJTkcpCisJCXJldHVybiAtRUJVU1k7CisJc2U0MDEtPmZyYW1lWzBdLmdyYWJzdGF0ZT1GUkFNRV9SRUFEWTsKKwlzZTQwMS0+ZnJhbWVbMV0uZ3JhYnN0YXRlPUZSQU1FX1VOVVNFRDsKKwlzZTQwMS0+Y3VyZnJhbWU9MDsKKworCWlmICghc2U0MDEtPnN0cmVhbWluZykKKwkJc2U0MDFfc3RhcnRfc3RyZWFtKHNlNDAxKTsKKworCS8qIFNldCB0aGUgcGljdHVyZSBwcm9wZXJ0aWVzICovCisJaWYgKHNlNDAxLT5mcmFtZWNvdW50PT0wKQorCQlzZTQwMV9zZW5kX3BpY3Qoc2U0MDEpOworCS8qIENhbGlicmF0ZSB0aGUgcmVzZXQgbGV2ZWwgYWZ0ZXIgYSBmZXcgZnJhbWVzLiAqLworCWlmIChzZTQwMS0+ZnJhbWVjb3VudCUyMD09MSkKKwkJc2U0MDFfYXV0b19yZXNldGxldmVsKHNlNDAxKTsKKworCXJldD1zZTQwMV9uZXdmcmFtZShzZTQwMSwgMCk7CisKKwlzZTQwMS0+ZnJhbWVbMF0uZ3JhYnN0YXRlPUZSQU1FX1VOVVNFRDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwkKKwlpZiAoY29weV90b191c2VyKGJ1Ziwgc2U0MDEtPmZyYW1lWzBdLmRhdGEsIHJlYWxjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHJlYWxjb3VudDsKK30KKworc3RhdGljIGludCBzZTQwMV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEgPSAoc3RydWN0IHVzYl9zZTQwMSAqKWRldjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemUgID0gdm1hLT52bV9lbmQtdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvczsKKworCWRvd24oJnNlNDAxLT5sb2NrKTsKKworCWlmIChzZTQwMS0+ZGV2ID09IE5VTEwpIHsKKwkJdXAoJnNlNDAxLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChzaXplID4gKCgoU0U0MDFfTlVNRlJBTUVTICogc2U0MDEtPm1heGZyYW1lc2l6ZSkgKyBQQUdFX1NJWkUgLSAxKSAmIH4oUEFHRV9TSVpFIC0gMSkpKSB7CisJCXVwKCZzZTQwMS0+bG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwb3MgPSAodW5zaWduZWQgbG9uZylzZTQwMS0+ZmJ1ZjsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkgeworCQkJdXAoJnNlNDAxLT5sb2NrKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJZWxzZQorCQkJc2l6ZSA9IDA7CisJfQorCXVwKCZzZTQwMS0+bG9jayk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNlNDAxX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisgICAgICAgIC5vcGVuID0gICAgICAgICBzZTQwMV9vcGVuLAorICAgICAgICAucmVsZWFzZSA9ICAgICAgc2U0MDFfY2xvc2UsCisgICAgICAgIC5yZWFkID0gICAgICAgICBzZTQwMV9yZWFkLAorICAgICAgICAubW1hcCA9ICAgICAgICAgc2U0MDFfbW1hcCwKKwkuaW9jdGwgPSAgICAgICAgc2U0MDFfaW9jdGwsCisJLmxsc2VlayA9ICAgICAgIG5vX2xsc2VlaywKK307CitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzZTQwMV90ZW1wbGF0ZSA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKyAgICAgICAgLm5hbWUgPSAgICAgICAgICJzZTQwMSBVU0IgY2FtZXJhIiwKKyAgICAgICAgLnR5cGUgPSAgICAgICAgIFZJRF9UWVBFX0NBUFRVUkUsCisgICAgICAgIC5oYXJkd2FyZSA9ICAgICBWSURfSEFSRFdBUkVfU0U0MDEsCisJLmZvcHMgPSAgICAgICAgICZzZTQwMV9mb3BzLAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHNlNDAxX2luaXQoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIGludCBidXR0b24pCit7CisgICAgICAgIGludCBpPTAsIHJjOworICAgICAgICB1bnNpZ25lZCBjaGFyIGNwWzB4NDBdOworCWNoYXIgdGVtcFsyMDBdOworCisJLyogbGVkIG9uICovCisgICAgICAgIHNlNDAxX3NuZGN0cmwoMSwgc2U0MDEsIFNFNDAxX1JFUV9MRURfQ09OVFJPTCwgMSwgTlVMTCwgMCk7CisKKwkvKiBnZXQgY2FtZXJhIGRlc2NyaXB0b3IgKi8KKwlyYz1zZTQwMV9zbmRjdHJsKDAsIHNlNDAxLCBTRTQwMV9SRVFfR0VUX0NBTUVSQV9ERVNDUklQVE9SLCAwLCBjcCwgc2l6ZW9mKGNwKSk7CisJaWYgKGNwWzFdIT0weDQxKSB7CisJCWVycigiV3JvbmcgZGVzY3JpcHRvciB0eXBlIik7CisJCXJldHVybiAxOworCX0KKwlzcHJpbnRmICh0ZW1wLCAiRXh0cmFGZWF0dXJlczogJWQiLCBjcFszXSk7CisKKwlzZTQwMS0+c2l6ZXM9Y3BbNF0rY3BbNV0qMjU2OworCXNlNDAxLT53aWR0aD1rbWFsbG9jKHNlNDAxLT5zaXplcypzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZTQwMS0+d2lkdGgpCisJCXJldHVybiAxOworCXNlNDAxLT5oZWlnaHQ9a21hbGxvYyhzZTQwMS0+c2l6ZXMqc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOworCWlmICghc2U0MDEtPmhlaWdodCkgeworCQlrZnJlZShzZTQwMS0+d2lkdGgpOworCQlyZXR1cm4gMTsKKwl9CisJZm9yIChpPTA7IGk8c2U0MDEtPnNpemVzOyBpKyspIHsKKwkJICAgIHNlNDAxLT53aWR0aFtpXT1jcFs2K2kqNCswXStjcFs2K2kqNCsxXSoyNTY7CisJCSAgICBzZTQwMS0+aGVpZ2h0W2ldPWNwWzYraSo0KzJdK2NwWzYraSo0KzNdKjI1NjsKKwl9CisJc3ByaW50ZiAodGVtcCwgIiVzIFNpemVzOiIsIHRlbXApOworCWZvciAoaT0wOyBpPHNlNDAxLT5zaXplczsgaSsrKSB7CisJCXNwcmludGYodGVtcCwgIiVzICVkeCVkIiwgdGVtcCwgc2U0MDEtPndpZHRoW2ldLCBzZTQwMS0+aGVpZ2h0W2ldKTsKKwl9CisJaW5mbygiJXMiLCB0ZW1wKTsKKwlzZTQwMS0+bWF4ZnJhbWVzaXplPXNlNDAxLT53aWR0aFtzZTQwMS0+c2l6ZXMtMV0qc2U0MDEtPmhlaWdodFtzZTQwMS0+c2l6ZXMtMV0qMzsKKworCXJjPXNlNDAxX3NuZGN0cmwoMCwgc2U0MDEsIFNFNDAxX1JFUV9HRVRfV0lEVEgsIDAsIGNwLCBzaXplb2YoY3ApKTsKKwlzZTQwMS0+Y3dpZHRoPWNwWzBdK2NwWzFdKjI1NjsKKwlyYz1zZTQwMV9zbmRjdHJsKDAsIHNlNDAxLCBTRTQwMV9SRVFfR0VUX0hFSUdIVCwgMCwgY3AsIHNpemVvZihjcCkpOworCXNlNDAxLT5jaGVpZ2h0PWNwWzBdK2NwWzFdKjI1NjsKKworCWlmICghY3BbMl0gJiYgU0U0MDFfRk9STUFUX0JBWUVSKSB7CisJCWVycigiQmF5ZXIgZm9ybWF0IG5vdCBzdXBwb3J0ZWQhIik7CisJCXJldHVybiAxOworCX0KKwkvKiBzZXQgb3V0cHV0IG1vZGUgKEJBWUVSKSAqLworICAgICAgICBzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfU0VUX09VVFBVVF9NT0RFLCBTRTQwMV9GT1JNQVRfQkFZRVIsIE5VTEwsIDApOworCisJcmM9c2U0MDFfc25kY3RybCgwLCBzZTQwMSwgU0U0MDFfUkVRX0dFVF9CUlQsIDAsIGNwLCBzaXplb2YoY3ApKTsKKwlzZTQwMS0+YnJpZ2h0bmVzcz1jcFswXStjcFsxXSoyNTY7CisJLyogc29tZSBkZWZhdWx0IHZhbHVlcyAqLworCXNlNDAxLT5yZXNldGxldmVsPTB4MmQ7CisJc2U0MDEtPnJnYWluPTB4MjA7CisJc2U0MDEtPmdnYWluPTB4MjA7CisJc2U0MDEtPmJnYWluPTB4MjA7CisJc2U0MDFfc2V0X2V4cG9zdXJlKHNlNDAxLCAyMDAwMCk7CisJc2U0MDEtPnBhbGV0dGU9VklERU9fUEFMRVRURV9SR0IyNDsKKwlzZTQwMS0+ZW5oYW5jZT0xOworCXNlNDAxLT5kcm9wcGVkPTA7CisJc2U0MDEtPmVycm9yPTA7CisJc2U0MDEtPmZyYW1lY291bnQ9MDsKKwlzZTQwMS0+cmVhZGNvdW50PTA7CisKKwkvKiBTdGFydCBpbnRlcnJ1cHQgdHJhbnNmZXJzIGZvciBzbmFwc2hvdCBidXR0b24gKi8KKwlpZiAoYnV0dG9uKSB7CisJCXNlNDAxLT5pbnR1cmI9dXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzZTQwMS0+aW50dXJiKSB7CisJCQlpbmZvKCJBbGxvY2F0aW9uIG9mIGludHVyYiBmYWlsZWQiKTsKKwkJCXJldHVybiAxOworCQl9CisJCXVzYl9maWxsX2ludF91cmIoc2U0MDEtPmludHVyYiwgc2U0MDEtPmRldiwKKwkJICAgIHVzYl9yY3ZpbnRwaXBlKHNlNDAxLT5kZXYsIFNFNDAxX0JVVFRPTl9FTkRQT0lOVCksCisJCSAgICAmc2U0MDEtPmJ1dHRvbiwgc2l6ZW9mKHNlNDAxLT5idXR0b24pLAorCQkgICAgc2U0MDFfYnV0dG9uX2lycSwKKwkJICAgIHNlNDAxLAorCQkgICAgOAorCQkpOworCQlpZiAodXNiX3N1Ym1pdF91cmIoc2U0MDEtPmludHVyYiwgR0ZQX0tFUk5FTCkpIHsKKwkJCWluZm8oImludCB1cmIgYnVybmVkIGRvd24iKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlCisJCXNlNDAxLT5pbnR1cmI9TlVMTDsKKworICAgICAgICAvKiBGbGFzaCB0aGUgbGVkICovCisgICAgICAgIHNlNDAxX3NuZGN0cmwoMSwgc2U0MDEsIFNFNDAxX1JFUV9DQU1FUkFfUE9XRVIsIDEsIE5VTEwsIDApOworICAgICAgICBzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfTEVEX0NPTlRST0wsIDEsIE5VTEwsIDApOworICAgICAgICBzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfQ0FNRVJBX1BPV0VSLCAwLCBOVUxMLCAwKTsKKwlzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfTEVEX0NPTlRST0wsIDAsIE5VTEwsIDApOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlNDAxX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKyAgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqaW50ZXJmYWNlOworICAgICAgICBzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMTsKKyAgICAgICAgY2hhciAqY2FtZXJhX25hbWU9TlVMTDsKKwlpbnQgYnV0dG9uPTE7CisKKyAgICAgICAgLyogV2UgZG9uJ3QgaGFuZGxlIG11bHRpLWNvbmZpZyBjYW1lcmFzICovCisgICAgICAgIGlmIChkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICAgICAgaW50ZXJmYWNlID0gJmludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjOworCisgICAgICAgIC8qIElzIGl0IGFuIHNlNDAxPyAqLworICAgICAgICBpZiAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSAweDAzZTggJiYKKyAgICAgICAgICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IDB4MDAwNCkgeworICAgICAgICAgICAgICAgIGNhbWVyYV9uYW1lPSJFbmRwb2ludHMvQW94IFNFNDAxIjsKKyAgICAgICAgfSBlbHNlIGlmIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpID09IDB4MDQ3MSAmJgorICAgICAgICAgICAgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gMHgwMzBiKSB7CisgICAgICAgICAgICAgICAgY2FtZXJhX25hbWU9IlBoaWxpcHMgUENWQzY2NUsiOworICAgICAgICB9IGVsc2UgaWYgKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gMHgwNDdkICYmCisJICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IDB4NTAwMSkgeworCQljYW1lcmFfbmFtZT0iS2Vuc2luZ3RvbiBWaWRlb0NBTSA2NzAxNCI7CisgICAgICAgIH0gZWxzZSBpZiAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSAweDA0N2QgJiYKKwkgICAgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gMHg1MDAyKSB7CisJCWNhbWVyYV9uYW1lPSJLZW5zaW5ndG9uIFZpZGVvQ0FNIDY3MDEoNS83KSI7CisgICAgICAgIH0gZWxzZSBpZiAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSAweDA0N2QgJiYKKwkgICAgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gMHg1MDAzKSB7CisJCWNhbWVyYV9uYW1lPSJLZW5zaW5ndG9uIFZpZGVvQ0FNIDY3MDE2IjsKKwkJYnV0dG9uPTA7CisJfSBlbHNlCisJCXJldHVybiAtRU5PREVWOworCisgICAgICAgIC8qIENoZWNraW5nIHZlbmRvci9wcm9kdWN0IHNob3VsZCBiZSBlbm91Z2gsIGJ1dCB3aGF0IHRoZSBoZWxsICovCisgICAgICAgIGlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VDbGFzcyAhPSAweDAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgaWYgKGludGVyZmFjZS0+YkludGVyZmFjZVN1YkNsYXNzICE9IDB4MDApCisJCXJldHVybiAtRU5PREVWOworCisgICAgICAgIC8qIFdlIGZvdW5kIG9uZSAqLworICAgICAgICBpbmZvKCJTRTQwMSBjYW1lcmEgZm91bmQ6ICVzIiwgY2FtZXJhX25hbWUpOworCisgICAgICAgIGlmICgoc2U0MDEgPSBrbWFsbG9jKHNpemVvZigqc2U0MDEpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVycigiY291bGRuJ3Qga21hbGxvYyBzZTQwMSBzdHJ1Y3QiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoc2U0MDEsIDAsIHNpemVvZigqc2U0MDEpKTsKKworICAgICAgICBzZTQwMS0+ZGV2ID0gZGV2OworICAgICAgICBzZTQwMS0+aWZhY2UgPSBpbnRlcmZhY2UtPmJJbnRlcmZhY2VOdW1iZXI7CisgICAgICAgIHNlNDAxLT5jYW1lcmFfbmFtZSA9IGNhbWVyYV9uYW1lOworCisJaW5mbygiZmlybXdhcmUgdmVyc2lvbjogJTAyeCIsIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpICYgMjU1KTsKKworICAgICAgICBpZiAoc2U0MDFfaW5pdChzZTQwMSwgYnV0dG9uKSkgeworCQlrZnJlZShzZTQwMSk7CisJCXJldHVybiAtRUlPOworCX0KKworCW1lbWNweSgmc2U0MDEtPnZkZXYsICZzZTQwMV90ZW1wbGF0ZSwgc2l6ZW9mKHNlNDAxX3RlbXBsYXRlKSk7CisJbWVtY3B5KHNlNDAxLT52ZGV2Lm5hbWUsIHNlNDAxLT5jYW1lcmFfbmFtZSwgc3RybGVuKHNlNDAxLT5jYW1lcmFfbmFtZSkpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlNDAxLT53cSk7CisJaW5pdF9NVVRFWCgmc2U0MDEtPmxvY2spOworCXdtYigpOworCisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmc2U0MDEtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKSA9PSAtMSkgeworCQlrZnJlZShzZTQwMSk7CisJCWVycigidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaW5mbygicmVnaXN0ZXJlZCBuZXcgdmlkZW8gZGV2aWNlOiB2aWRlbyVkIiwgc2U0MDEtPnZkZXYubWlub3IpOworCisJdXNiX3NldF9pbnRmZGF0YSAoaW50Ziwgc2U0MDEpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2U0MDFfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOworCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CisJaWYgKHNlNDAxKSB7CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZzZTQwMS0+dmRldik7CisJCWlmICghc2U0MDEtPnVzZXIpeworCQkJdXNiX3NlNDAxX3JlbW92ZV9kaXNjb25uZWN0ZWQoc2U0MDEpOworCQl9IGVsc2UgeworCQkJc2U0MDEtPmZyYW1lWzBdLmdyYWJzdGF0ZSA9IEZSQU1FX0VSUk9SOworCQkJc2U0MDEtPmZyYW1lWzBdLmdyYWJzdGF0ZSA9IEZSQU1FX0VSUk9SOworCisJCQlzZTQwMS0+c3RyZWFtaW5nID0gMDsKKworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZTQwMS0+d3EpOworCQkJc2U0MDEtPnJlbW92ZWQgPSAxOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgc2U0MDFfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKyAgICAgICAgLm5hbWUJCT0gInNlNDAxIiwKKyAgICAgICAgLmlkX3RhYmxlCT0gZGV2aWNlX3RhYmxlLAorCS5wcm9iZQkJPSBzZTQwMV9wcm9iZSwKKyAgICAgICAgLmRpc2Nvbm5lY3QJPSBzZTQwMV9kaXNjb25uZWN0LAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIE1vZHVsZSByb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19pbml0IHVzYl9zZTQwMV9pbml0KHZvaWQpCit7CisJaW5mbygiU0U0MDEgdXNiIGNhbWVyYSBkcml2ZXIgdmVyc2lvbiAlcyByZWdpc3RlcmluZyIsIHZlcnNpb24pOworCWlmIChmbGlja2VybGVzcykKKwkJaWYgKGZsaWNrZXJsZXNzIT01MCAmJiBmbGlja2VybGVzcyE9NjApIHsKKwkJCWluZm8oIkludmFsbGlkIGZsaWNrZXJsZXNzIHZhbHVlLCB1c2UgMCwgNTAgb3IgNjAuIik7CisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiB1c2JfcmVnaXN0ZXIoJnNlNDAxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2Jfc2U0MDFfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZzZTQwMV9kcml2ZXIpOworCWluZm8oIlNFNDAxIGRyaXZlciBkZXJlZ2lzdGVyZWQiKTsKK30KKworbW9kdWxlX2luaXQodXNiX3NlNDAxX2luaXQpOworbW9kdWxlX2V4aXQodXNiX3NlNDAxX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc2U0MDEuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3NlNDAxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1ODQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NlNDAxLmgKQEAgLTAsMCArMSwyMzMgQEAKKworI2lmbmRlZiBfX0xJTlVYX3NlNDAxX0gKKyNkZWZpbmUgX19MSU5VWF9zZTQwMV9ICisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2RlZmluZSBzZTQwMV9ERUJVRwkvKiBUdXJuIG9uIGRlYnVnIG1lc3NhZ2VzICovCisKKyNpZmRlZiBzZTQwMV9ERUJVRworIyAgZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCitpZiAoZGVidWcgPj0gbGV2ZWwpIGluZm8oIlsiIF9fUFJFVFRZX0ZVTkNUSU9OX18gIjolZF0gIiBmbXQsIF9fTElORV9fICwgIyMgYXJncykKKyNlbHNlCisjICBkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworLyogQW4gYWxtb3N0IGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHNsZWVwX29uX2ludGVycnVwdGlibGUgKi8KKyNkZWZpbmUgd2FpdF9pbnRlcnJ1cHRpYmxlKHRlc3QsIHF1ZXVlLCB3YWl0KSBcCit7IFwKKwlhZGRfd2FpdF9xdWV1ZShxdWV1ZSwgd2FpdCk7IFwKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCisJaWYgKHRlc3QpIFwKKwkJc2NoZWR1bGUoKTsgXAorCXJlbW92ZV93YWl0X3F1ZXVlKHF1ZXVlLCB3YWl0KTsgXAorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7IFwKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIFwKKwkJYnJlYWs7IFwKK30KKworI2RlZmluZSBTRTQwMV9SRVFfR0VUX0NBTUVSQV9ERVNDUklQVE9SCQkweDA2CisjZGVmaW5lIFNFNDAxX1JFUV9TVEFSVF9DT05USU5VT1VTX0NBUFRVUkUJMHg0MQorI2RlZmluZSBTRTQwMV9SRVFfU1RPUF9DT05USU5VT1VTX0NBUFRVUkUJMHg0MgorI2RlZmluZSBTRTQwMV9SRVFfQ0FQVFVSRV9GUkFNRQkJCTB4NDMKKyNkZWZpbmUgU0U0MDFfUkVRX0dFVF9CUlQJCQkweDQ0CisjZGVmaW5lIFNFNDAxX1JFUV9TRVRfQlJUCQkJMHg0NQorI2RlZmluZSBTRTQwMV9SRVFfR0VUX1dJRFRICQkJMHg0YworI2RlZmluZSBTRTQwMV9SRVFfU0VUX1dJRFRICQkJMHg0ZAorI2RlZmluZSBTRTQwMV9SRVFfR0VUX0hFSUdIVAkJCTB4NGUKKyNkZWZpbmUgU0U0MDFfUkVRX1NFVF9IRUlHSFQJCQkweDRmCisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfT1VUUFVUX01PREUJCTB4NTAKKyNkZWZpbmUgU0U0MDFfUkVRX1NFVF9PVVRQVVRfTU9ERQkJMHg1MQorI2RlZmluZSBTRTQwMV9SRVFfR0VUX0VYVF9GRUFUVVJFCQkweDUyCisjZGVmaW5lIFNFNDAxX1JFUV9TRVRfRVhUX0ZFQVRVUkUJCTB4NTMKKyNkZWZpbmUgU0U0MDFfUkVRX0NBTUVSQV9QT1dFUgkJCTB4NTYKKyNkZWZpbmUgU0U0MDFfUkVRX0xFRF9DT05UUk9MCQkJMHg1NworI2RlZmluZSBTRTQwMV9SRVFfQklPUwkJCQkweGZmCisKKyNkZWZpbmUgU0U0MDFfQklPU19SRUFECQkJCTB4MDcKKworI2RlZmluZSBTRTQwMV9GT1JNQVRfQkFZRVIJMHg0MAorCisvKiBIeXVuZGFpIGh2NzEzMWIgcmVnaXN0ZXJzCisgICA3MTIxIGFuZCA3MTQxIHNob3VsZCBiZSB0aGUgc2FtZSAoaGF2ZW4ndCByZWFsbHkgY2hlY2tlZC4uLikgKi8KKy8qIE1vZGUgcmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX01PREVfQQkJMHgwMAorI2RlZmluZSBIVjcxMzFfUkVHX01PREVfQgkJMHgwMQorI2RlZmluZSBIVjcxMzFfUkVHX01PREVfQwkJMHgwMgorLyogRnJhbWUgcmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX0ZSU1UJCTB4MTAKKyNkZWZpbmUgSFY3MTMxX1JFR19GUlNMCQkweDExCisjZGVmaW5lIEhWNzEzMV9SRUdfRkNTVQkJMHgxMgorI2RlZmluZSBIVjcxMzFfUkVHX0ZDU0wJCTB4MTMKKyNkZWZpbmUgSFY3MTMxX1JFR19GV0hVCQkweDE0CisjZGVmaW5lIEhWNzEzMV9SRUdfRldITAkJMHgxNQorI2RlZmluZSBIVjcxMzFfUkVHX0ZXV1UJCTB4MTYKKyNkZWZpbmUgSFY3MTMxX1JFR19GV1dMCQkweDE3CisvKiBUaW1pbmcgcmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX1RIQlUJCTB4MjAKKyNkZWZpbmUgSFY3MTMxX1JFR19USEJMCQkweDIxCisjZGVmaW5lIEhWNzEzMV9SRUdfVFZCVQkJMHgyMgorI2RlZmluZSBIVjcxMzFfUkVHX1RWQkwJCTB4MjMKKyNkZWZpbmUgSFY3MTMxX1JFR19USVRVCQkweDI1CisjZGVmaW5lIEhWNzEzMV9SRUdfVElUTQkJMHgyNgorI2RlZmluZSBIVjcxMzFfUkVHX1RJVEwJCTB4MjcKKyNkZWZpbmUgSFY3MTMxX1JFR19UTUNECQkweDI4CisvKiBBZGp1c3QgUmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX0FSTFYJCTB4MzAKKyNkZWZpbmUgSFY3MTMxX1JFR19BUkNHCQkweDMxCisjZGVmaW5lIEhWNzEzMV9SRUdfQUdDRwkJMHgzMgorI2RlZmluZSBIVjcxMzFfUkVHX0FCQ0cJCTB4MzMKKyNkZWZpbmUgSFY3MTMxX1JFR19BUEJWCQkweDM0CisjZGVmaW5lIEhWNzEzMV9SRUdfQVNMUAkJMHg1NAorLyogT2Zmc2V0IFJlZ2lzdGVyczogKi8KKyNkZWZpbmUgSFY3MTMxX1JFR19PRlNSCQkweDUwCisjZGVmaW5lIEhWNzEzMV9SRUdfT0ZTRwkJMHg1MQorI2RlZmluZSBIVjcxMzFfUkVHX09GU0IJCTB4NTIKKy8qIFJFc2V0IGxldmVsIHN0YXRpc3RpY3MgcmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX0xPUkVGTk9ICTB4NTcKKyNkZWZpbmUgSFY3MTMxX1JFR19MT1JFRk5PTAkweDU4CisjZGVmaW5lIEhWNzEzMV9SRUdfSElSRUZOT0gJMHg1OQorI2RlZmluZSBIVjcxMzFfUkVHX0hJUkVGTk9MCTB4NWEKKworLyogc2U0MDEgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNFNDAxX09QRVJBVElOR01PREUJMHgyMDAwCisKKworLyogc2l6ZSBvZiB1c2IgdHJhbnNmZXJzICovCisjZGVmaW5lIFNFNDAxX1BBQ0tFVFNJWkUJNDA5NgorLyogbnVtYmVyIG9mIHF1ZXVlZCBidWxrIHRyYW5zZmVycyB0byB1c2UsIHNob3VsZCBiZSBhYm91dCA4ICovCisjZGVmaW5lIFNFNDAxX05VTVNCVUYJCTEKKy8qIHJlYWQgdGhlIHVzYiBzcGVjcyBmb3IgdGhpcyBvbmUgOikgKi8KKyNkZWZpbmUgU0U0MDFfVklERU9fRU5EUE9JTlQJMQorI2RlZmluZSBTRTQwMV9CVVRUT05fRU5EUE9JTlQJMgorLyogbnVtYmVyIG9mIGZyYW1lcyBzdXBwb3J0ZWQgYnkgdGhlIHY0bCBwYXJ0ICovCisjZGVmaW5lIFNFNDAxX05VTUZSQU1FUwkJMgorLyogc2NyYXRjaCBidWZmZXJzIGZvciBwYXNzaW5nIGRhdGEgdG8gdGhlIGRlY29kZXJzICovCisjZGVmaW5lIFNFNDAxX05VTVNDUkFUQ0gJMzIKKy8qIG1heGltdW0gYW1vdW50IG9mIGRhdGEgaW4gYSBKYW5nR3UgcGFja2V0ICovCisjZGVmaW5lIFNFNDAxX1ZMQ0RBVEFMRU4JMTAyNAorLyogbnVtYmVyIG9mIG51bCBzaXplZCBwYWNrZXRzIHRvIHJlY2VpdmUgYmVmb3JlIGtpY2tpbmcgdGhlIGNhbWVyYSAqLworI2RlZmluZSBTRTQwMV9NQVhfTlVMTFBBQ0tFVFMJNDAwMAorLyogbnVtYmVyIG9mIGRlY29kaW5nIGVycm9ycyBiZWZvcmUga2lja2luZyB0aGUgY2FtZXJhICovCisjZGVmaW5lIFNFNDAxX01BWF9FUlJPUlMJMjAwCisKK3N0cnVjdCB1c2JfZGV2aWNlOworCitzdHJ1Y3Qgc2U0MDFfc2J1ZiB7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKK307CisKK2VudW0geworCUZSQU1FX1VOVVNFRCwJCS8qIFVudXNlZCAobm8gTUNBUFRVUkUpICovCisJRlJBTUVfUkVBRFksCQkvKiBSZWFkeSB0byBzdGFydCBncmFiYmluZyAqLworCUZSQU1FX0dSQUJCSU5HLAkJLyogSW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZ3JhYmJlZCBpbnRvICovCisJRlJBTUVfRE9ORSwJCS8qIEZpbmlzaGVkIGdyYWJiaW5nLCBidXQgbm90IGJlZW4gc3luY2VkIHlldCAqLworCUZSQU1FX0VSUk9SLAkJLyogU29tZXRoaW5nIGJhZCBoYXBwZW5lZCB3aGlsZSBwcm9jZXNzaW5nICovCit9OworCitlbnVtIHsKKwlGTVRfQkFZRVIsCisJRk1UX0pBTkdHVSwKK307CisKK2VudW0geworCUJVRkZFUl9VTlVTRUQsCisJQlVGRkVSX1JFQURZLAorCUJVRkZFUl9CVVNZLAorCUJVRkZFUl9ET05FLAorfTsKKworc3RydWN0IHNlNDAxX3NjcmF0Y2ggeworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdm9sYXRpbGUgaW50IHN0YXRlOworCWludCBvZmZzZXQ7CisJaW50IGxlbmd0aDsKK307CisKK3N0cnVjdCBzZTQwMV9mcmFtZSB7CisJdW5zaWduZWQgY2hhciAqZGF0YTsJCS8qIEZyYW1lIGJ1ZmZlciAqLworCisJdm9sYXRpbGUgaW50IGdyYWJzdGF0ZTsJLyogU3RhdGUgb2YgZ3JhYmJpbmcgKi8KKworCXVuc2lnbmVkIGNoYXIgKmN1cmxpbmU7CisJaW50IGN1cmxpbmVwaXg7CisJaW50IGN1cnBpeDsKK307CisKK3N0cnVjdCB1c2Jfc2U0MDEgeworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsKKworCS8qIERldmljZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OworCisJdW5zaWduZWQgY2hhciBpZmFjZTsKKworCWNoYXIgKmNhbWVyYV9uYW1lOworCisJaW50IGNoYW5nZTsKKwlpbnQgYnJpZ2h0bmVzczsKKwlpbnQgaHVlOworCWludCByZ2FpbjsKKwlpbnQgZ2dhaW47CisJaW50IGJnYWluOworCWludCBleHBvc2VfaDsKKwlpbnQgZXhwb3NlX207CisJaW50IGV4cG9zZV9sOworCWludCByZXNldGxldmVsOworCQorCWludCBlbmhhbmNlOworCisJaW50IGZvcm1hdDsKKwlpbnQgc2l6ZXM7CisJaW50ICp3aWR0aDsKKwlpbnQgKmhlaWdodDsKKwlpbnQgY3dpZHRoOwkJLyogY3VycmVudCB3aWR0aCAqLworCWludCBjaGVpZ2h0OwkJLyogY3VycmVudCBoZWlnaHQgKi8KKwlpbnQgcGFsZXR0ZTsKKwlpbnQgbWF4ZnJhbWVzaXplOworCWludCBjZnJhbWVzaXplOwkJLyogY3VycmVudCBmcmFtZXNpemUgKi8KKworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwlpbnQgdXNlcjsJCS8qIHVzZXIgY291bnQgZm9yIGV4Y2x1c2l2ZSB1c2UgKi8KKwlpbnQgcmVtb3ZlZDsJCS8qIGRldmljZSBkaXNjb25uZWN0ZWQgKi8KKworCWludCBzdHJlYW1pbmc7CQkvKiBBcmUgd2Ugc3RyZWFtaW5nIHZpZGVvPyAqLworCisJY2hhciAqZmJ1ZjsJCS8qIFZpZGVvZGV2IGJ1ZmZlciBhcmVhICovCisKKwlzdHJ1Y3QgdXJiICp1cmJbU0U0MDFfTlVNU0JVRl07CisJc3RydWN0IHVyYiAqaW50dXJiOworCQorCWludCBidXR0b247CisJaW50IGJ1dHRvbnByZXNzZWQ7CisKKwlpbnQgY3VyZnJhbWU7CQkvKiBDdXJyZW50IHJlY2VpdmluZyBmcmFtZSAqLworCXN0cnVjdCBzZTQwMV9mcmFtZSBmcmFtZVtTRTQwMV9OVU1GUkFNRVNdOwkKKwlpbnQgcmVhZGNvdW50OworCWludCBmcmFtZWNvdW50OworCWludCBlcnJvcjsKKwlpbnQgZHJvcHBlZDsKKworCWludCBzY3JhdGNoX25leHQ7CisJaW50IHNjcmF0Y2hfdXNlOworCWludCBzY3JhdGNoX292ZXJmbG93OworCXN0cnVjdCBzZTQwMV9zY3JhdGNoIHNjcmF0Y2hbU0U0MDFfTlVNU0NSQVRDSF07CisKKwkvKiBEZWNvZGVyIHNwZWNpZmljIGRhdGE6ICovCisJdW5zaWduZWQgY2hhciB2bGNkYXRhW1NFNDAxX1ZMQ0RBVEFMRU5dOworCWludCB2bGNkYXRhcG9zOworCWludCBiYXllcm9mZnNldDsKKworCXN0cnVjdCBzZTQwMV9zYnVmIHNidWZbU0U0MDFfTlVNU0JVRl07CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsJLyogUHJvY2Vzc2VzIHdhaXRpbmcgKi8KKworCWludCBudWxscGFja2V0czsKK307CisKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMi5oIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGE0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFY0TDIgZHJpdmVyIGZvciBTTjlDMTB4IFBDIENhbWVyYSBDb250cm9sbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NOOUMxMDJfSF8KKyNkZWZpbmUgX1NOOUMxMDJfSF8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNOOUMxMDJfREVCVUcKKyNkZWZpbmUgU045QzEwMl9ERUJVR19MRVZFTCAgICAgICAyCisjZGVmaW5lIFNOOUMxMDJfTUFYX0RFVklDRVMgICAgICAgNjQKKyNkZWZpbmUgU045QzEwMl9QUkVTRVJWRV9JTUdTQ0FMRSAwCisjZGVmaW5lIFNOOUMxMDJfRk9SQ0VfTVVOTUFQICAgICAgMAorI2RlZmluZSBTTjlDMTAyX01BWF9GUkFNRVMgICAgICAgIDMyCisjZGVmaW5lIFNOOUMxMDJfVVJCUyAgICAgICAgICAgICAgMgorI2RlZmluZSBTTjlDMTAyX0lTT19QQUNLRVRTICAgICAgIDcKKyNkZWZpbmUgU045QzEwMl9BTFRFUk5BVEVfU0VUVElORyA4CisjZGVmaW5lIFNOOUMxMDJfVVJCX1RJTUVPVVQgICAgICAgbXNlY3NfdG9famlmZmllcygyICogU045QzEwMl9JU09fUEFDS0VUUykKKyNkZWZpbmUgU045QzEwMl9DVFJMX1RJTUVPVVQgICAgICAzMDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX05BTUUgICAgICJWNEwyIGRyaXZlciBmb3IgU045QzEweCBQQyBDYW1lcmEgQ29udHJvbGxlcnMiCisjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX0FVVEhPUiAgICIoQykgMjAwNC0yMDA1IEx1Y2EgUmlzb2xpYSIKKyNkZWZpbmUgU045QzEwMl9BVVRIT1JfRU1BSUwgICAgIjxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIKKyNkZWZpbmUgU045QzEwMl9NT0RVTEVfTElDRU5TRSAgIkdQTCIKKyNkZWZpbmUgU045QzEwMl9NT0RVTEVfVkVSU0lPTiAgIjE6MS4yNCIKKyNkZWZpbmUgU045QzEwMl9NT0RVTEVfVkVSU0lPTl9DT0RFICBLRVJORUxfVkVSU0lPTigxLCAwLCAyNCkKKworZW51bSBzbjljMTAyX2JyaWRnZSB7CisJQlJJREdFX1NOOUMxMDEgPSAweDAxLAorCUJSSURHRV9TTjlDMTAyID0gMHgwMiwKKwlCUklER0VfU045QzEwMyA9IDB4MDQsCit9OworCitTTjlDMTAyX0lEX1RBQkxFCitTTjlDMTAyX1NFTlNPUl9UQUJMRQorCitlbnVtIHNuOWMxMDJfZnJhbWVfc3RhdGUgeworCUZfVU5VU0VELAorCUZfUVVFVUVELAorCUZfR1JBQkJJTkcsCisJRl9ET05FLAorCUZfRVJST1IsCit9OworCitzdHJ1Y3Qgc245YzEwMl9mcmFtZV90IHsKKwl2b2lkKiBidWZtZW07CisJc3RydWN0IHY0bDJfYnVmZmVyIGJ1ZjsKKwllbnVtIHNuOWMxMDJfZnJhbWVfc3RhdGUgc3RhdGU7CisJc3RydWN0IGxpc3RfaGVhZCBmcmFtZTsKKwl1bnNpZ25lZCBsb25nIHZtYV91c2VfY291bnQ7Cit9OworCitlbnVtIHNuOWMxMDJfZGV2X3N0YXRlIHsKKwlERVZfSU5JVElBTElaRUQgPSAweDAxLAorCURFVl9ESVNDT05ORUNURUQgPSAweDAyLAorCURFVl9NSVNDT05GSUdVUkVEID0gMHgwNCwKK307CisKK2VudW0gc245YzEwMl9pb19tZXRob2QgeworCUlPX05PTkUsCisJSU9fUkVBRCwKKwlJT19NTUFQLAorfTsKKworZW51bSBzbjljMTAyX3N0cmVhbV9zdGF0ZSB7CisJU1RSRUFNX09GRiwKKwlTVFJFQU1fSU5URVJSVVBULAorCVNUUkVBTV9PTiwKK307CisKK3R5cGVkZWYgY2hhciBzbjljMTAyX3NvZl9oZWFkZXJfdFsxMl07Cit0eXBlZGVmIGNoYXIgc245YzEwMl9lb2ZfaGVhZGVyX3RbNF07CisKK3N0cnVjdCBzbjljMTAyX3N5c2ZzX2F0dHIgeworCXU4IHJlZywgaTJjX3JlZzsKKwlzbjljMTAyX3NvZl9oZWFkZXJfdCBmcmFtZV9oZWFkZXI7Cit9OworCitzdHJ1Y3Qgc245YzEwMl9tb2R1bGVfcGFyYW0geworCXU4IGZvcmNlX211bm1hcDsKK307CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKHNuOWMxMDJfc3lzZnNfbG9jayk7CitzdGF0aWMgREVDTEFSRV9SV1NFTShzbjljMTAyX2Rpc2Nvbm5lY3QpOworCitzdHJ1Y3Qgc245YzEwMl9kZXZpY2UgeworCXN0cnVjdCBkZXZpY2UgZGV2OworCisJc3RydWN0IHZpZGVvX2RldmljZSogdjRsZGV2OworCisJZW51bSBzbjljMTAyX2JyaWRnZSBicmlkZ2U7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3I7CisKKwlzdHJ1Y3QgdXNiX2RldmljZSogdXNiZGV2OworCXN0cnVjdCB1cmIqIHVyYltTTjlDMTAyX1VSQlNdOworCXZvaWQqIHRyYW5zZmVyX2J1ZmZlcltTTjlDMTAyX1VSQlNdOworCXU4KiBjb250cm9sX2J1ZmZlcjsKKworCXN0cnVjdCBzbjljMTAyX2ZyYW1lX3QgKmZyYW1lX2N1cnJlbnQsIGZyYW1lW1NOOUMxMDJfTUFYX0ZSQU1FU107CisJc3RydWN0IGxpc3RfaGVhZCBpbnF1ZXVlLCBvdXRxdWV1ZTsKKwl1MzIgZnJhbWVfY291bnQsIG5idWZmZXJzLCBucmVhZGJ1ZmZlcnM7CisKKwllbnVtIHNuOWMxMDJfaW9fbWV0aG9kIGlvOworCWVudW0gc245YzEwMl9zdHJlYW1fc3RhdGUgc3RyZWFtOworCisJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uIGNvbXByZXNzaW9uOworCisJc3RydWN0IHNuOWMxMDJfc3lzZnNfYXR0ciBzeXNmczsKKwlzbjljMTAyX3NvZl9oZWFkZXJfdCBzb2ZfaGVhZGVyOworCXUxNiByZWdbMzJdOworCisJc3RydWN0IHNuOWMxMDJfbW9kdWxlX3BhcmFtIG1vZHVsZV9wYXJhbTsKKworCWVudW0gc245YzEwMl9kZXZfc3RhdGUgc3RhdGU7CisJdTggdXNlcnM7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIGRldl9zZW0sIGZpbGVvcF9zZW07CisJc3BpbmxvY2tfdCBxdWV1ZV9sb2NrOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW4sIHdhaXRfZnJhbWUsIHdhaXRfc3RyZWFtOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitzbjljMTAyX2F0dGFjaF9zZW5zb3Ioc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IpCit7CisJY2FtLT5zZW5zb3IgPSBzZW5zb3I7CisJY2FtLT5zZW5zb3ItPmRldiA9ICZjYW0tPmRldjsKKwljYW0tPnNlbnNvci0+dXNiZGV2ID0gY2FtLT51c2JkZXY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3VuZGVmIERCRworI3VuZGVmIEtEQkcKKyNpZmRlZiBTTjlDMTAyX0RFQlVHCisjCWRlZmluZSBEQkcobGV2ZWwsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKGRlYnVnID49IChsZXZlbCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKChsZXZlbCkgPT0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlkZXZfZXJyKCZjYW0tPmRldiwgZm10ICJcbiIsICMjIGFyZ3MpOyAgICAgICAgICAgICAgICBcCisJCWVsc2UgaWYgKChsZXZlbCkgPT0gMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJZGV2X2luZm8oJmNhbS0+ZGV2LCBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgICAgICAgICAgXAorCQllbHNlIGlmICgobGV2ZWwpID49IDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWRldl9pbmZvKCZjYW0tPmRldiwgIlslczolZF0gIiBmbXQgIlxuIiwgICAgICAgICAgICAgIFwKKwkJCSAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzKTsgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorIwlkZWZpbmUgS0RCRyhsZXZlbCwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmICgobGV2ZWwpID09IDEgfHwgKGxldmVsKSA9PSAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJcHJfaW5mbygic245YzEwMjogIiBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgICAgICAgICAgXAorCQllbHNlIGlmICgobGV2ZWwpID09IDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCXByX2RlYnVnKCJzbjljMTAyOiBbJXM6JWRdICIgZm10ICJcbiIsIF9fRlVOQ1RJT05fXywgIFwKKwkJCSAgICAgICAgIF9fTElORV9fICwgIyMgYXJncyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UKKyMJZGVmaW5lIEtEQkcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8gezt9IHdoaWxlKDApOworIwlkZWZpbmUgREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKTsKKyNlbmRpZgorCisjdW5kZWYgUERCRworI2RlZmluZSBQREJHKGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZGV2X2luZm8oJmNhbS0+ZGV2LCAiWyVzOiVkXSAiIGZtdCAiXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fICwgIyMgYXJncyk7CisKKyN1bmRlZiBQREJHRworI2RlZmluZSBQREJHRyhmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKTsgLyogcGxhY2Vob2xkZXIgKi8KKworI2VuZGlmIC8qIF9TTjlDMTAyX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX2NvcmUuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODQwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX2NvcmUuYwpAQCAtMCwwICsxLDI3NDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFY0TDIgZHJpdmVyIGZvciBTTjlDMTB4IFBDIENhbWVyYSBDb250cm9sbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJzbjljMTAyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHNuOWMxMDJfaWRfdGFibGUpOworCitNT0RVTEVfQVVUSE9SKFNOOUMxMDJfTU9EVUxFX0FVVEhPUiAiICIgU045QzEwMl9BVVRIT1JfRU1BSUwpOworTU9EVUxFX0RFU0NSSVBUSU9OKFNOOUMxMDJfTU9EVUxFX05BTUUpOworTU9EVUxFX1ZFUlNJT04oU045QzEwMl9NT0RVTEVfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRShTTjlDMTAyX01PRFVMRV9MSUNFTlNFKTsKKworc3RhdGljIHNob3J0IHZpZGVvX25yW10gPSB7WzAgLi4uIFNOOUMxMDJfTUFYX0RFVklDRVMtMV0gPSAtMX07Cittb2R1bGVfcGFyYW1fYXJyYXkodmlkZW9fbnIsIHNob3J0LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsCisgICAgICAgICAgICAgICAgICJcbjwtMXxuWywuLi5dPiBTcGVjaWZ5IFY0TDIgbWlub3IgbW9kZSBudW1iZXIuIgorICAgICAgICAgICAgICAgICAiXG4gLTEgPSB1c2UgbmV4dCBhdmFpbGFibGUgKGRlZmF1bHQpIgorICAgICAgICAgICAgICAgICAiXG4gIG4gPSB1c2UgbWlub3IgbnVtYmVyIG4gKGludGVnZXIgPj0gMCkiCisgICAgICAgICAgICAgICAgICJcbllvdSBjYW4gc3BlY2lmeSB1cCB0byAiX19NT0RVTEVfU1RSSU5HKFNOOUMxMDJfTUFYX0RFVklDRVMpCisgICAgICAgICAgICAgICAgICIgY2FtZXJhcyB0aGlzIHdheS4iCisgICAgICAgICAgICAgICAgICJcbkZvciBleGFtcGxlOiIKKyAgICAgICAgICAgICAgICAgIlxudmlkZW9fbnI9LTEsMiwtMSB3b3VsZCBhc3NpZ24gbWlub3IgbnVtYmVyIDIgdG8iCisgICAgICAgICAgICAgICAgICJcbnRoZSBzZWNvbmQgY2FtZXJhIGFuZCB1c2UgYXV0byBmb3IgdGhlIGZpcnN0IgorICAgICAgICAgICAgICAgICAiXG5vbmUgYW5kIGZvciBldmVyeSBvdGhlciBjYW1lcmEuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKKworc3RhdGljIHNob3J0IGZvcmNlX211bm1hcFtdID0ge1swIC4uLiBTTjlDMTAyX01BWF9ERVZJQ0VTLTFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU045QzEwMl9GT1JDRV9NVU5NQVB9OworbW9kdWxlX3BhcmFtX2FycmF5KGZvcmNlX211bm1hcCwgYm9vbCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX211bm1hcCwKKyAgICAgICAgICAgICAgICAgIlxuPDB8MVssLi4uXT4gRm9yY2UgdGhlIGFwcGxpY2F0aW9uIHRvIHVubWFwIHByZXZpb3VzbHkgIgorICAgICAgICAgICAgICAgICAiXG5tYXBwZWQgYnVmZmVyIG1lbW9yeSBiZWZvcmUgY2FsbGluZyBhbnkgVklESU9DX1NfQ1JPUCBvciAiCisgICAgICAgICAgICAgICAgICJcblZJRElPQ19TX0ZNVCBpb2N0bCdzLiBOb3QgYWxsIHRoZSBhcHBsaWNhdGlvbnMgc3VwcG9ydCAiCisgICAgICAgICAgICAgICAgICJcbnRoaXMgZmVhdHVyZS4gVGhpcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWMgZm9yIGVhY2ggIgorICAgICAgICAgICAgICAgICAiXG5kZXRlY3RlZCBjYW1lcmEuIgorICAgICAgICAgICAgICAgICAiXG4gMCA9IGRvIG5vdCBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nIgorICAgICAgICAgICAgICAgICAiXG4gMSA9IGZvcmNlIG1lbW9yeSB1bm1hcHBpbmcgKHNhdmUgbWVtb3J5KSIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFNOOUMxMDJfRk9SQ0VfTVVOTUFQKSIuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKKworI2lmZGVmIFNOOUMxMDJfREVCVUcKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBkZWJ1ZyA9IFNOOUMxMDJfREVCVUdfTEVWRUw7Cittb2R1bGVfcGFyYW0oZGVidWcsIHVzaG9ydCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLAorICAgICAgICAgICAgICAgICAiXG48bj4gRGVidWdnaW5nIGluZm9ybWF0aW9uIGxldmVsLCBmcm9tIDAgdG8gMzoiCisgICAgICAgICAgICAgICAgICJcbjAgPSBub25lICh1c2UgY2FyZWZ1bGx5KSIKKyAgICAgICAgICAgICAgICAgIlxuMSA9IGNyaXRpY2FsIGVycm9ycyIKKyAgICAgICAgICAgICAgICAgIlxuMiA9IHNpZ25pZmljYW50IGluZm9ybWF0aW9ucyIKKyAgICAgICAgICAgICAgICAgIlxuMyA9IG1vcmUgdmVyYm9zZSBtZXNzYWdlcyIKKyAgICAgICAgICAgICAgICAgIlxuTGV2ZWwgMyBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb25seSwgd2hlbiBvbmx5ICIKKyAgICAgICAgICAgICAgICAgIm9uZSBkZXZpY2UgaXMgdXNlZC4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhTTjlDMTAyX0RFQlVHX0xFVkVMKSIuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzbjljMTAyX3NvZl9oZWFkZXJfdCBzbjljMTAyX3NvZl9oZWFkZXJbXSA9IHsKKwl7MHhmZiwgMHhmZiwgMHgwMCwgMHhjNCwgMHhjNCwgMHg5NiwgMHgwMH0sCisJezB4ZmYsIDB4ZmYsIDB4MDAsIDB4YzQsIDB4YzQsIDB4OTYsIDB4MDF9LAorfTsKKworCitzdGF0aWMgc245YzEwMl9lb2ZfaGVhZGVyX3Qgc245YzEwMl9lb2ZfaGVhZGVyW10gPSB7CisJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCXsweDQwLCAweDAwLCAweDAwLCAweDAwfSwKKwl7MHg4MCwgMHgwMCwgMHgwMCwgMHgwMH0sCisJezB4YzAsIDB4MDAsIDB4MDAsIDB4MDB9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCogcnZtYWxsb2Moc2l6ZV90IHNpemUpCit7CisJdm9pZCogbWVtOworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisKKwltZW0gPSB2bWFsbG9jXzMyKCh1bnNpZ25lZCBsb25nKXNpemUpOworCWlmICghbWVtKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChtZW0sIDAsIHNpemUpOworCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpbWVtOworCXdoaWxlIChzaXplID4gMCkgeworCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBtZW07Cit9CisKKworc3RhdGljIHZvaWQgcnZmcmVlKHZvaWQqIG1lbSwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBhZHI7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisKKwlhZHIgPSAodW5zaWduZWQgbG9uZyltZW07CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisKKwl2ZnJlZShtZW0pOworfQorCisKK3N0YXRpYyB1MzIgCitzbjljMTAyX3JlcXVlc3RfYnVmZmVycyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgdTMyIGNvdW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc245YzEwMl9pb19tZXRob2QgaW8pCit7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcCA9ICYoY2FtLT5zZW5zb3ItPnBpeF9mb3JtYXQpOworCXN0cnVjdCB2NGwyX3JlY3QqIHIgPSAmKGNhbS0+c2Vuc29yLT5jcm9wY2FwLmJvdW5kcyk7CisJY29uc3Qgc2l6ZV90IGltYWdlc2l6ZSA9IGNhbS0+bW9kdWxlX3BhcmFtLmZvcmNlX211bm1hcCB8fAorCSAgICAgICAgICAgICAgICAgICAgICAgICBpbyA9PSBJT19SRUFEID8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgKHAtPndpZHRoICogcC0+aGVpZ2h0ICogcC0+cHJpdikgLyA4IDoKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKHItPndpZHRoICogci0+aGVpZ2h0ICogcC0+cHJpdikgLyA4OworCXZvaWQqIGJ1ZmYgPSBOVUxMOworCXUzMiBpOworCisJaWYgKGNvdW50ID4gU045QzEwMl9NQVhfRlJBTUVTKQorCQljb3VudCA9IFNOOUMxMDJfTUFYX0ZSQU1FUzsKKworCWNhbS0+bmJ1ZmZlcnMgPSBjb3VudDsKKwl3aGlsZSAoY2FtLT5uYnVmZmVycyA+IDApIHsKKwkJaWYgKChidWZmID0gcnZtYWxsb2MoY2FtLT5uYnVmZmVycyAqIFBBR0VfQUxJR04oaW1hZ2VzaXplKSkpKQorCQkJYnJlYWs7CisJCWNhbS0+bmJ1ZmZlcnMtLTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKSB7CisJCWNhbS0+ZnJhbWVbaV0uYnVmbWVtID0gYnVmZiArIGkqUEFHRV9BTElHTihpbWFnZXNpemUpOworCQljYW0tPmZyYW1lW2ldLmJ1Zi5pbmRleCA9IGk7CisJCWNhbS0+ZnJhbWVbaV0uYnVmLm0ub2Zmc2V0ID0gaSpQQUdFX0FMSUdOKGltYWdlc2l6ZSk7CisJCWNhbS0+ZnJhbWVbaV0uYnVmLmxlbmd0aCA9IGltYWdlc2l6ZTsKKwkJY2FtLT5mcmFtZVtpXS5idWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJY2FtLT5mcmFtZVtpXS5idWYuc2VxdWVuY2UgPSAwOworCQljYW0tPmZyYW1lW2ldLmJ1Zi5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJY2FtLT5mcmFtZVtpXS5idWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKwkJY2FtLT5mcmFtZVtpXS5idWYuZmxhZ3MgPSAwOworCX0KKworCXJldHVybiBjYW0tPm5idWZmZXJzOworfQorCisKK3N0YXRpYyB2b2lkIHNuOWMxMDJfcmVsZWFzZV9idWZmZXJzKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWlmIChjYW0tPm5idWZmZXJzKSB7CisJCXJ2ZnJlZShjYW0tPmZyYW1lWzBdLmJ1Zm1lbSwKKwkJICAgICAgIGNhbS0+bmJ1ZmZlcnMgKiBjYW0tPmZyYW1lWzBdLmJ1Zi5sZW5ndGgpOworCQljYW0tPm5idWZmZXJzID0gMDsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgc245YzEwMl9lbXB0eV9mcmFtZXF1ZXVlcyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwl1MzIgaTsKKworCUlOSVRfTElTVF9IRUFEKCZjYW0tPmlucXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZjYW0tPm91dHF1ZXVlKTsKKworCWZvciAoaSA9IDA7IGkgPCBTTjlDMTAyX01BWF9GUkFNRVM7IGkrKykgeworCQljYW0tPmZyYW1lW2ldLnN0YXRlID0gRl9VTlVTRUQ7CisJCWNhbS0+ZnJhbWVbaV0uYnVmLmJ5dGVzdXNlZCA9IDA7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHNuOWMxMDJfcXVldWVfdW51c2VkZnJhbWVzKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzOyBpKyspCisJCWlmIChjYW0tPmZyYW1lW2ldLnN0YXRlID09IEZfVU5VU0VEKSB7CisJCQljYW0tPmZyYW1lW2ldLnN0YXRlID0gRl9RVUVVRUQ7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmNhbS0+ZnJhbWVbaV0uZnJhbWUsICZjYW0tPmlucXVldWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBzbjljMTAyX3dyaXRlX3JlZyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgdTggdmFsdWUsIHUxNiBpbmRleCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OworCXU4KiBidWZmID0gY2FtLT5jb250cm9sX2J1ZmZlcjsKKwlpbnQgcmVzOworCisJKmJ1ZmYgPSB2YWx1ZTsKKworCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksIDB4MDgsIDB4NDEsCisJICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCAwLCBidWZmLCAxLCBTTjlDMTAyX0NUUkxfVElNRU9VVCk7CisJaWYgKHJlcyA8IDApIHsKKwkJREJHKDMsICJGYWlsZWQgdG8gd3JpdGUgYSByZWdpc3RlciAodmFsdWUgMHglMDJYLCBpbmRleCAiCisJCSAgICAgICAiMHglMDJYLCBlcnJvciAlZCkiLCB2YWx1ZSwgaW5kZXgsIHJlcykKKwkJcmV0dXJuIC0xOworCX0KKworCWNhbS0+cmVnW2luZGV4XSA9IHZhbHVlOworCisJcmV0dXJuIDA7Cit9CisKKworLyogTk9URTogcmVhZGluZyBzb21lIHJlZ2lzdGVycyBhbHdheXMgcmV0dXJucyAwICovCitzdGF0aWMgaW50IHNuOWMxMDJfcmVhZF9yZWcoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHUxNiBpbmRleCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OworCXU4KiBidWZmID0gY2FtLT5jb250cm9sX2J1ZmZlcjsKKwlpbnQgcmVzOworCisJcmVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwgMHgwMCwgMHhjMSwKKwkgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIDAsIGJ1ZmYsIDEsIFNOOUMxMDJfQ1RSTF9USU1FT1VUKTsKKwlpZiAocmVzIDwgMCkKKwkJREJHKDMsICJGYWlsZWQgdG8gcmVhZCBhIHJlZ2lzdGVyIChpbmRleCAweCUwMlgsIGVycm9yICVkKSIsCisJCSAgICBpbmRleCwgcmVzKQorCisJcmV0dXJuIChyZXMgPj0gMCkgPyAoaW50KSgqYnVmZikgOiAtMTsKK30KKworCitpbnQgc245YzEwMl9wcmVhZF9yZWcoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHUxNiBpbmRleCkKK3sKKwlpZiAoaW5kZXggPiAweDFmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjYW0tPnJlZ1tpbmRleF07Cit9CisKKworc3RhdGljIGludAorc245YzEwMl9pMmNfd2FpdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IpCit7CisJaW50IGksIHI7CisKKwlmb3IgKGkgPSAxOyBpIDw9IDU7IGkrKykgeworCQlyID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDgpOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKHIgJiAweDA0KQorCQkJcmV0dXJuIDA7CisJCWlmIChzZW5zb3ItPmZyZXF1ZW5jeSAmIFNOOUMxMDJfSTJDXzQwMEtIWikKKwkJCXVkZWxheSg1KjE2KTsKKwkJZWxzZQorCQkJdWRlbGF5KDE2KjE2KTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworCitzdGF0aWMgaW50CitzbjljMTAyX2kyY19kZXRlY3RfcmVhZF9lcnJvcihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvcikKK3sKKwlpbnQgcjsKKwlyID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDgpOworCXJldHVybiAociA8IDAgfHwgKHIgPj0gMCAmJiAhKHIgJiAweDA4KSkpID8gLUVJTyA6IDA7Cit9CisKKworc3RhdGljIGludAorc245YzEwMl9pMmNfZGV0ZWN0X3dyaXRlX2Vycm9yKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvcikKK3sKKwlpbnQgcjsKKwlyID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDgpOworCXJldHVybiAociA8IDAgfHwgKHIgPj0gMCAmJiAociAmIDB4MDgpKSkgPyAtRUlPIDogMDsKK30KKworCitpbnQgCitzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IsIHU4IGRhdGEwLCB1OCBkYXRhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1OCBuLCB1OCBidWZmZXJbXSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OworCXU4KiBkYXRhID0gY2FtLT5jb250cm9sX2J1ZmZlcjsKKwlpbnQgZXJyID0gMCwgcmVzOworCisJLyogV3JpdGUgY3ljbGUgKi8KKwlkYXRhWzBdID0gKChzZW5zb3ItPmludGVyZmFjZSA9PSBTTjlDMTAyX0kyQ18yV0lSRVMpID8gMHg4MCA6IDApIHwKKwkgICAgICAgICAgKChzZW5zb3ItPmZyZXF1ZW5jeSAmIFNOOUMxMDJfSTJDXzQwMEtIWikgPyAweDAxIDogMCkgfCAweDEwOworCWRhdGFbMV0gPSBkYXRhMDsgLyogSTJDIHNsYXZlIGlkICovCisJZGF0YVsyXSA9IGRhdGExOyAvKiBhZGRyZXNzICovCisJZGF0YVs3XSA9IDB4MTA7CisJcmVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwgMHgwOCwgMHg0MSwKKwkgICAgICAgICAgICAgICAgICAgICAgMHgwOCwgMCwgZGF0YSwgOCwgU045QzEwMl9DVFJMX1RJTUVPVVQpOworCWlmIChyZXMgPCAwKQorCQllcnIgKz0gcmVzOworCisJZXJyICs9IHNuOWMxMDJfaTJjX3dhaXQoY2FtLCBzZW5zb3IpOworCisJLyogUmVhZCBjeWNsZSAtIG4gYnl0ZXMgKi8KKwlkYXRhWzBdID0gKChzZW5zb3ItPmludGVyZmFjZSA9PSBTTjlDMTAyX0kyQ18yV0lSRVMpID8gMHg4MCA6IDApIHwKKwkgICAgICAgICAgKChzZW5zb3ItPmZyZXF1ZW5jeSAmIFNOOUMxMDJfSTJDXzQwMEtIWikgPyAweDAxIDogMCkgfAorCSAgICAgICAgICAobiA8PCA0KSB8IDB4MDI7CisJZGF0YVsxXSA9IGRhdGEwOworCWRhdGFbN10gPSAweDEwOworCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksIDB4MDgsIDB4NDEsCisJICAgICAgICAgICAgICAgICAgICAgIDB4MDgsIDAsIGRhdGEsIDgsIFNOOUMxMDJfQ1RSTF9USU1FT1VUKTsKKwlpZiAocmVzIDwgMCkKKwkJZXJyICs9IHJlczsKKworCWVyciArPSBzbjljMTAyX2kyY193YWl0KGNhbSwgc2Vuc29yKTsKKworCS8qIFRoZSBmaXJzdCByZWFkIGJ5dGUgd2lsbCBiZSBwbGFjZWQgaW4gZGF0YVs0XSAqLworCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksIDB4MDAsIDB4YzEsCisJICAgICAgICAgICAgICAgICAgICAgIDB4MGEsIDAsIGRhdGEsIDUsIFNOOUMxMDJfQ1RSTF9USU1FT1VUKTsKKwlpZiAocmVzIDwgMCkKKwkJZXJyICs9IHJlczsKKworCWVyciArPSBzbjljMTAyX2kyY19kZXRlY3RfcmVhZF9lcnJvcihjYW0sIHNlbnNvcik7CisKKwlQREJHRygiSTJDIHJlYWQ6IGFkZHJlc3MgMHglMDJYLCBmaXJzdCByZWFkIGJ5dGU6IDB4JTAyWCIsIGRhdGExLAorCSAgICAgIGRhdGFbNF0pCisKKwlpZiAoZXJyKSB7CisJCURCRygzLCAiSTJDIHJlYWQgZmFpbGVkIGZvciAlcyBpbWFnZSBzZW5zb3IiLCBzZW5zb3ItPm5hbWUpCisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoYnVmZmVyKQorCQltZW1jcHkoYnVmZmVyLCBkYXRhLCBzaXplb2YoYnVmZmVyKSk7CisKKwlyZXR1cm4gKGludClkYXRhWzRdOworfQorCisKK2ludCAKK3NuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yLCB1OCBuLCB1OCBkYXRhMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdTggZGF0YTEsIHU4IGRhdGEyLCB1OCBkYXRhMywgdTggZGF0YTQsIHU4IGRhdGE1KQoreworCXN0cnVjdCB1c2JfZGV2aWNlKiB1ZGV2ID0gY2FtLT51c2JkZXY7CisJdTgqIGRhdGEgPSBjYW0tPmNvbnRyb2xfYnVmZmVyOworCWludCBlcnIgPSAwLCByZXM7CisKKwkvKiBXcml0ZSBjeWNsZS4gSXQgdXN1YWxseSBpcyBhZGRyZXNzICsgdmFsdWUgKi8KKwlkYXRhWzBdID0gKChzZW5zb3ItPmludGVyZmFjZSA9PSBTTjlDMTAyX0kyQ18yV0lSRVMpID8gMHg4MCA6IDApIHwKKwkgICAgICAgICAgKChzZW5zb3ItPmZyZXF1ZW5jeSAmIFNOOUMxMDJfSTJDXzQwMEtIWikgPyAweDAxIDogMCkKKwkgICAgICAgICAgfCAoKG4gLSAxKSA8PCA0KTsKKwlkYXRhWzFdID0gZGF0YTA7CisJZGF0YVsyXSA9IGRhdGExOworCWRhdGFbM10gPSBkYXRhMjsKKwlkYXRhWzRdID0gZGF0YTM7CisJZGF0YVs1XSA9IGRhdGE0OworCWRhdGFbNl0gPSBkYXRhNTsKKwlkYXRhWzddID0gMHgxNDsKKwlyZXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLCAweDA4LCAweDQxLAorCSAgICAgICAgICAgICAgICAgICAgICAweDA4LCAwLCBkYXRhLCA4LCBTTjlDMTAyX0NUUkxfVElNRU9VVCk7CisJaWYgKHJlcyA8IDApCisJCWVyciArPSByZXM7CisKKwllcnIgKz0gc245YzEwMl9pMmNfd2FpdChjYW0sIHNlbnNvcik7CisJZXJyICs9IHNuOWMxMDJfaTJjX2RldGVjdF93cml0ZV9lcnJvcihjYW0sIHNlbnNvcik7CisKKwlpZiAoZXJyKQorCQlEQkcoMywgIkkyQyB3cml0ZSBmYWlsZWQgZm9yICVzIGltYWdlIHNlbnNvciIsIHNlbnNvci0+bmFtZSkKKworCVBEQkdHKCJJMkMgcmF3IHdyaXRlOiAldSBieXRlcywgZGF0YTAgPSAweCUwMlgsIGRhdGExID0gMHglMDJYLCAiCisJICAgICAgImRhdGEyID0gMHglMDJYLCBkYXRhMyA9IDB4JTAyWCwgZGF0YTQgPSAweCUwMlgsIGRhdGE1ID0gMHglMDJYIiwKKwkgICAgICBuLCBkYXRhMCwgZGF0YTEsIGRhdGEyLCBkYXRhMywgZGF0YTQsIGRhdGE1KQorCisJcmV0dXJuIGVyciA/IC0xIDogMDsKK30KKworCitpbnQKK3NuOWMxMDJfaTJjX3RyeV9yZWFkKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IsIHU4IGFkZHJlc3MpCit7CisJcmV0dXJuIHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHNlbnNvciwgc2Vuc29yLT5pMmNfc2xhdmVfaWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAxLCBOVUxMKTsKK30KKworCitpbnQgCitzbjljMTAyX2kyY190cnlfd3JpdGUoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IsIHU4IGFkZHJlc3MsIHU4IHZhbHVlKQoreworCXJldHVybiBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgc2Vuc29yLCAzLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zb3ItPmkyY19zbGF2ZV9pZCwgYWRkcmVzcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgMCwgMCwgMCk7Cit9CisKKworaW50IHNuOWMxMDJfaTJjX3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHU4IGFkZHJlc3MpCit7CisJaWYgKCFjYW0tPnNlbnNvcikKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIHNuOWMxMDJfaTJjX3RyeV9yZWFkKGNhbSwgY2FtLT5zZW5zb3IsIGFkZHJlc3MpOworfQorCisKK2ludCBzbjljMTAyX2kyY193cml0ZShzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgdTggYWRkcmVzcywgdTggdmFsdWUpCit7CisJaWYgKCFjYW0tPnNlbnNvcikKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIHNuOWMxMDJfaTJjX3RyeV93cml0ZShjYW0sIGNhbS0+c2Vuc29yLCBhZGRyZXNzLCB2YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQqCitzbjljMTAyX2ZpbmRfc29mX2hlYWRlcihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgdm9pZCogbWVtLCBzaXplX3QgbGVuKQoreworCXNpemVfdCBzb2ZsZW4gPSBzaXplb2Yoc245YzEwMl9zb2ZfaGVhZGVyX3QpLCBpOworCXU4IGosIG4gPSBzaXplb2Yoc245YzEwMl9zb2ZfaGVhZGVyKSAvIHNvZmxlbjsKKworCWZvciAoaSA9IDA7IChsZW4gPj0gc29mbGVuKSAmJiAoaSA8PSBsZW4gLSBzb2ZsZW4pOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBuOyBqKyspCisJCQkvKiBJdCdzIGVub3VnaCB0byBjb21wYXJlIDcgYnl0ZXMgKi8KKwkJCWlmICghbWVtY21wKG1lbSArIGksIHNuOWMxMDJfc29mX2hlYWRlcltqXSwgNykpIHsKKwkJCQltZW1jcHkoY2FtLT5zb2ZfaGVhZGVyLCBtZW0gKyBpLCBzb2ZsZW4pOworCQkJCS8qIFNraXAgdGhlIGhlYWRlciAqLworCQkJCXJldHVybiBtZW0gKyBpICsgc29mbGVuOworCQkJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQqCitzbjljMTAyX2ZpbmRfZW9mX2hlYWRlcihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgdm9pZCogbWVtLCBzaXplX3QgbGVuKQoreworCXNpemVfdCBlb2ZsZW4gPSBzaXplb2Yoc245YzEwMl9lb2ZfaGVhZGVyX3QpLCBpOworCXVuc2lnbmVkIGosIG4gPSBzaXplb2Yoc245YzEwMl9lb2ZfaGVhZGVyKSAvIGVvZmxlbjsKKworCWlmIChjYW0tPnNlbnNvci0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCkKKwkJcmV0dXJuIE5VTEw7IC8qIEVPRiBoZWFkZXIgZG9lcyBub3QgZXhpc3QgaW4gY29tcHJlc3NlZCBkYXRhICovCisKKwlmb3IgKGkgPSAwOyAobGVuID49IGVvZmxlbikgJiYgKGkgPD0gbGVuIC0gZW9mbGVuKTsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKQorCQkJaWYgKCFtZW1jbXAobWVtICsgaSwgc245YzEwMl9lb2ZfaGVhZGVyW2pdLCBlb2ZsZW4pKQorCQkJCXJldHVybiBtZW0gKyBpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgc245YzEwMl91cmJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyogcmVncykKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgc245YzEwMl9mcmFtZV90KiogZjsKKwlzaXplX3QgaW1hZ2VzaXplOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwl1OCBpOworCWludCBlcnIgPSAwOworCisJaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQpCisJCXJldHVybjsKKworCWYgPSAmY2FtLT5mcmFtZV9jdXJyZW50OworCisJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9JTlRFUlJVUFQpIHsKKwkJY2FtLT5zdHJlYW0gPSBTVFJFQU1fT0ZGOworCQlpZiAoKCpmKSkKKwkJCSgqZiktPnN0YXRlID0gRl9RVUVVRUQ7CisJCURCRygzLCAiU3RyZWFtIGludGVycnVwdGVkIikKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYW0tPndhaXRfc3RyZWFtKTsKKwl9CisKKwlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpCisJCXJldHVybjsKKworCWlmIChjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYW0tPndhaXRfZnJhbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PRkYgfHwgbGlzdF9lbXB0eSgmY2FtLT5pbnF1ZXVlKSkKKwkJZ290byByZXN1Ym1pdF91cmI7CisKKwlpZiAoISgqZikpCisJCSgqZikgPSBsaXN0X2VudHJ5KGNhbS0+aW5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc245YzEwMl9mcmFtZV90LAorCQkgICAgICAgICAgICAgICAgICBmcmFtZSk7CisKKwlpbWFnZXNpemUgPSAoY2FtLT5zZW5zb3ItPnBpeF9mb3JtYXQud2lkdGggKgorCSAgICAgICAgICAgICBjYW0tPnNlbnNvci0+cGl4X2Zvcm1hdC5oZWlnaHQgKgorCSAgICAgICAgICAgICBjYW0tPnNlbnNvci0+cGl4X2Zvcm1hdC5wcml2KSAvIDg7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBpbWcsIGxlbiwgc3RhdHVzOworCQl2b2lkICpwb3MsICpzb2YsICplb2Y7CisKKwkJbGVuID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOworCQlzdGF0dXMgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKKwkJcG9zID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgKyB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKworCQlpZiAoc3RhdHVzKSB7CisJCQlEQkcoMywgIkVycm9yIGluIGlzb2Nocm9ub3VzIGZyYW1lIikKKwkJCSgqZiktPnN0YXRlID0gRl9FUlJPUjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJUERCR0coIklzb2Nocm5vdXMgZnJhbWU6IGxlbmd0aCAldSwgIyV1IGkiLCBsZW4sIGkpCisKKwkJLyoKKwkJICAgTk9URTogSXQgaXMgcHJvYmFibHkgY29ycmVjdCB0byBhc3N1bWUgdGhhdCBTT0YgYW5kIEVPRgorCQkgICAgICAgICBoZWFkZXJzIGRvIG5vdCBvY2N1ciBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBwYWNrZXRzLAorCQkgICAgICAgICBidXQgd2hvIGtub3dzLi5XaGF0ZXZlciBpcyB0aGUgdHJ1dGgsIHRoaXMgYXNzdW1wdGlvbgorCQkgICAgICAgICBkb2Vzbid0IGludHJvZHVjZSBidWdzLgorCQkqLworCityZWRvOgorCQlzb2YgPSBzbjljMTAyX2ZpbmRfc29mX2hlYWRlcihjYW0sIHBvcywgbGVuKTsKKwkJaWYgKCFzb2YpIHsKKwkJCWVvZiA9IHNuOWMxMDJfZmluZF9lb2ZfaGVhZGVyKGNhbSwgcG9zLCBsZW4pOworCQkJaWYgKCgqZiktPnN0YXRlID09IEZfR1JBQkJJTkcpIHsKK2VuZF9vZl9mcmFtZToKKwkJCQlpbWcgPSBsZW47CisKKwkJCQlpZiAoZW9mKQorCQkJCQlpbWcgPSAoZW9mID4gcG9zKSA/IGVvZiAtIHBvcyAtIDEgOiAwOworCisJCQkJaWYgKCgqZiktPmJ1Zi5ieXRlc3VzZWQraW1nID4gaW1hZ2VzaXplKSB7CisJCQkJCXUzMiBiID0gKCpmKS0+YnVmLmJ5dGVzdXNlZCArIGltZyAtCisJCQkJCSAgICAgICAgaW1hZ2VzaXplOworCQkJCQlpbWcgPSBpbWFnZXNpemUgLSAoKmYpLT5idWYuYnl0ZXN1c2VkOworCQkJCQlEQkcoMywgIkV4cGVjdGVkIEVPRiBub3QgZm91bmQ6ICIKKwkJCQkJICAgICAgICJ2aWRlbyBmcmFtZSBjdXQiKQorCQkJCQlpZiAoZW9mKQorCQkJCQkJREJHKDMsICJFeGNlZWRlZCBsaW1pdDogKyV1ICIKKwkJCQkJCSAgICAgICAiYnl0ZXMiLCAodW5zaWduZWQpKGIpKQorCQkJCX0KKworCQkJCW1lbWNweSgoKmYpLT5idWZtZW0gKyAoKmYpLT5idWYuYnl0ZXN1c2VkLCBwb3MsCisJCQkJICAgICAgIGltZyk7CisKKwkJCQlpZiAoKCpmKS0+YnVmLmJ5dGVzdXNlZCA9PSAwKQorCQkJCQlkb19nZXR0aW1lb2ZkYXkoJigqZiktPmJ1Zi50aW1lc3RhbXApOworCisJCQkJKCpmKS0+YnVmLmJ5dGVzdXNlZCArPSBpbWc7CisKKwkJCQlpZiAoKCpmKS0+YnVmLmJ5dGVzdXNlZCA9PSBpbWFnZXNpemUgfHwKKwkJCQkgICAgKGNhbS0+c2Vuc29yLT5waXhfZm9ybWF0LnBpeGVsZm9ybWF0ID09CisJCQkJICAgICAgICAgICAgICAgIFY0TDJfUElYX0ZNVF9TTjlDMTBYICYmIGVvZikpIHsKKwkJCQkJdTMyIGIgPSAoKmYpLT5idWYuYnl0ZXN1c2VkOworCQkJCQkoKmYpLT5zdGF0ZSA9IEZfRE9ORTsKKwkJCQkJKCpmKS0+YnVmLnNlcXVlbmNlPSArK2NhbS0+ZnJhbWVfY291bnQ7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPnF1ZXVlX2xvY2ssCisJCQkJCSAgICAgICAgICAgICAgICAgIGxvY2tfZmxhZ3MpOworCQkJCQlsaXN0X21vdmVfdGFpbCgmKCpmKS0+ZnJhbWUsCisJCQkJCSAgICAgICAgICAgICAgICZjYW0tPm91dHF1ZXVlKTsKKwkJCQkJaWYgKCFsaXN0X2VtcHR5KCZjYW0tPmlucXVldWUpKQorCQkJCQkJKCpmKSA9IGxpc3RfZW50cnkoCisJCQkJCQkgICAgICAgIGNhbS0+aW5xdWV1ZS5uZXh0LAorCQkJCQkJICAgICAgICBzdHJ1Y3Qgc245YzEwMl9mcmFtZV90LAorCQkJCQkJICAgICAgICBmcmFtZSApOworCQkJCQllbHNlCisJCQkJCQkoKmYpID0gTlVMTDsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5xdWV1ZV9sb2NrCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgLCBsb2NrX2ZsYWdzKTsKKwkJCQkJbWVtY3B5KGNhbS0+c3lzZnMuZnJhbWVfaGVhZGVyLAorCQkJCQkgICAgICAgY2FtLT5zb2ZfaGVhZGVyLAorCQkJCQkgICAgICAgc2l6ZW9mKHNuOWMxMDJfc29mX2hlYWRlcl90KSk7CisJCQkJCURCRygzLCAiVmlkZW8gZnJhbWUgY2FwdHVyZWQ6ICIKKwkJCQkJICAgICAgICIlbHUgYnl0ZXMiLCAodW5zaWduZWQgbG9uZykoYikpCisKKwkJCQkJaWYgKCEoKmYpKQorCQkJCQkJZ290byByZXN1Ym1pdF91cmI7CisKKwkJCQl9IGVsc2UgaWYgKGVvZikgeworCQkJCQkoKmYpLT5zdGF0ZSA9IEZfRVJST1I7CisJCQkJCURCRygzLCAiTm90IGV4cGVjdGVkIEVPRiBhZnRlciAlbHUgIgorCQkJCQkgICAgICAgImJ5dGVzIG9mIGltYWdlIGRhdGEiLCAKKwkJCQkJICAodW5zaWduZWQgbG9uZykoKCpmKS0+YnVmLmJ5dGVzdXNlZCkpCisJCQkJfQorCisJCQkJaWYgKHNvZikgLyogKDEpICovCisJCQkJCWdvdG8gc3RhcnRfb2ZfZnJhbWU7CisKKwkJCX0gZWxzZSBpZiAoZW9mKSB7CisJCQkJREJHKDMsICJFT0Ygd2l0aG91dCBTT0YiKQorCQkJCWNvbnRpbnVlOworCisJCQl9IGVsc2UgeworCQkJCVBEQkdHKCJJZ25vcmluZyBwb2ludGxlc3MgaXNvY2hyb25vdXMgZnJhbWUiKQorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCX0gZWxzZSBpZiAoKCpmKS0+c3RhdGUgPT0gRl9RVUVVRUQgfHwgKCpmKS0+c3RhdGUgPT0gRl9FUlJPUikgeworc3RhcnRfb2ZfZnJhbWU6CisJCQkoKmYpLT5zdGF0ZSA9IEZfR1JBQkJJTkc7CisJCQkoKmYpLT5idWYuYnl0ZXN1c2VkID0gMDsKKwkJCWxlbiAtPSAoc29mIC0gcG9zKTsKKwkJCXBvcyA9IHNvZjsKKwkJCURCRygzLCAiU09GIGRldGVjdGVkOiBuZXcgdmlkZW8gZnJhbWUiKQorCQkJaWYgKGxlbikKKwkJCQlnb3RvIHJlZG87CisKKwkJfSBlbHNlIGlmICgoKmYpLT5zdGF0ZSA9PSBGX0dSQUJCSU5HKSB7CisJCQllb2YgPSBzbjljMTAyX2ZpbmRfZW9mX2hlYWRlcihjYW0sIHBvcywgbGVuKTsKKwkJCWlmIChlb2YgJiYgZW9mIDwgc29mKQorCQkJCWdvdG8gZW5kX29mX2ZyYW1lOyAvKiAoMSkgKi8KKwkJCWVsc2UgeworCQkJCWlmIChjYW0tPnNlbnNvci0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCA9PQorCQkJCSAgICBWNEwyX1BJWF9GTVRfU045QzEwWCkgeworCQkJCQllb2YgPSBzb2Ytc2l6ZW9mKHNuOWMxMDJfc29mX2hlYWRlcl90KTsKKwkJCQkJZ290byBlbmRfb2ZfZnJhbWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJREJHKDMsICJTT0YgYmVmb3JlIGV4cGVjdGVkIEVPRiBhZnRlciAiCisJCQkJCSAgICAgICAiJWx1IGJ5dGVzIG9mIGltYWdlIGRhdGEiLCAKKwkJCQkJICAodW5zaWduZWQgbG9uZykoKCpmKS0+YnVmLmJ5dGVzdXNlZCkpCisJCQkJCWdvdG8gc3RhcnRfb2ZfZnJhbWU7CisJCQkJfQorCQkJfQorCQl9CisJfQorCityZXN1Ym1pdF91cmI6CisJdXJiLT5kZXYgPSBjYW0tPnVzYmRldjsKKwllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChlcnIgPCAwICYmIGVyciAhPSAtRVBFUk0pIHsKKwkJY2FtLT5zdGF0ZSB8PSBERVZfTUlTQ09ORklHVVJFRDsKKwkJREJHKDEsICJ1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCIpCisJfQorCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYW0tPndhaXRfZnJhbWUpOworfQorCisKK3N0YXRpYyBpbnQgc245YzEwMl9zdGFydF90cmFuc2ZlcihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGNhbS0+dXNiZGV2OworCXN0cnVjdCB1cmIqIHVyYjsKKwljb25zdCB1bnNpZ25lZCBpbnQgd01heFBhY2tldFNpemVbXSA9IHswLCAxMjgsIDI1NiwgMzg0LCA1MTIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjgwLCA4MDAsIDkwMCwgMTAyM307CisJY29uc3QgdW5zaWduZWQgaW50IHBzeiA9IHdNYXhQYWNrZXRTaXplW1NOOUMxMDJfQUxURVJOQVRFX1NFVFRJTkddOworCXM4IGksIGo7CisJaW50IGVyciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgU045QzEwMl9VUkJTOyBpKyspIHsKKwkJY2FtLT50cmFuc2Zlcl9idWZmZXJbaV0gPSBrbWFsbG9jKFNOOUMxMDJfSVNPX1BBQ0tFVFMgKiBwc3osCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCURCRygxLCAiTm90IGVub3VnaCBtZW1vcnkiKQorCQkJZ290byBmcmVlX2J1ZmZlcnM7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU045QzEwMl9VUkJTOyBpKyspIHsKKwkJdXJiID0gdXNiX2FsbG9jX3VyYihTTjlDMTAyX0lTT19QQUNLRVRTLCBHRlBfS0VSTkVMKTsKKwkJY2FtLT51cmJbaV0gPSB1cmI7CisJCWlmICghdXJiKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJREJHKDEsICJ1c2JfYWxsb2NfdXJiKCkgZmFpbGVkIikKKwkJCWdvdG8gZnJlZV91cmJzOworCQl9CisJCXVyYi0+ZGV2ID0gdWRldjsKKwkJdXJiLT5jb250ZXh0ID0gY2FtOworCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUodWRldiwgMSk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBTTjlDMTAyX0lTT19QQUNLRVRTOworCQl1cmItPmNvbXBsZXRlID0gc245YzEwMl91cmJfY29tcGxldGU7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gY2FtLT50cmFuc2Zlcl9idWZmZXJbaV07CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHBzeiAqIFNOOUMxMDJfSVNPX1BBQ0tFVFM7CisJCXVyYi0+aW50ZXJ2YWwgPSAxOworCQlmb3IgKGogPSAwOyBqIDwgU045QzEwMl9JU09fUEFDS0VUUzsgaisrKSB7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IHBzeiAqIGo7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IHBzejsKKwkJfQorCX0KKworCS8qIEVuYWJsZSB2aWRlbyAqLworCWlmICghKGNhbS0+cmVnWzB4MDFdICYgMHgwNCkpIHsKKwkJZXJyID0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBjYW0tPnJlZ1sweDAxXSB8IDB4MDQsIDB4MDEpOworCQlpZiAoZXJyKSB7CisJCQllcnIgPSAtRUlPOworCQkJREJHKDEsICJJL08gaGFyZHdhcmUgZXJyb3IiKQorCQkJZ290byBmcmVlX3VyYnM7CisJCX0KKwl9CisKKwllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCAwLCBTTjlDMTAyX0FMVEVSTkFURV9TRVRUSU5HKTsKKwlpZiAoZXJyKSB7CisJCURCRygxLCAidXNiX3NldF9pbnRlcmZhY2UoKSBmYWlsZWQiKQorCQlnb3RvIGZyZWVfdXJiczsKKwl9CisKKwljYW0tPmZyYW1lX2N1cnJlbnQgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IFNOOUMxMDJfVVJCUzsgaSsrKSB7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKGNhbS0+dXJiW2ldLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycikgeworCQkJZm9yIChqID0gaS0xOyBqID49IDA7IGotLSkKKwkJCQl1c2Jfa2lsbF91cmIoY2FtLT51cmJbal0pOworCQkJREJHKDEsICJ1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCwgZXJyb3IgJWQiLCBlcnIpCisJCQlnb3RvIGZyZWVfdXJiczsKKwkJfQorCX0KKworCXJldHVybiAwOworCitmcmVlX3VyYnM6CisJZm9yIChpID0gMDsgKGkgPCBTTjlDMTAyX1VSQlMpICYmICBjYW0tPnVyYltpXTsgaSsrKQorCQl1c2JfZnJlZV91cmIoY2FtLT51cmJbaV0pOworCitmcmVlX2J1ZmZlcnM6CisJZm9yIChpID0gMDsgKGkgPCBTTjlDMTAyX1VSQlMpICYmIGNhbS0+dHJhbnNmZXJfYnVmZmVyW2ldOyBpKyspCisJCWtmcmVlKGNhbS0+dHJhbnNmZXJfYnVmZmVyW2ldKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBzbjljMTAyX3N0b3BfdHJhbnNmZXIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBjYW0tPnVzYmRldjsKKwlzOCBpOworCWludCBlcnIgPSAwOworCisJaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IFNOOUMxMDJfVVJCUy0xOyBpID49IDA7IGktLSkgeworCQl1c2Jfa2lsbF91cmIoY2FtLT51cmJbaV0pOworCQl1c2JfZnJlZV91cmIoY2FtLT51cmJbaV0pOworCQlrZnJlZShjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXSk7CisJfQorCisJZXJyID0gdXNiX3NldF9pbnRlcmZhY2UodWRldiwgMCwgMCk7IC8qIDAgTWIvcyAqLworCWlmIChlcnIpCisJCURCRygzLCAidXNiX3NldF9pbnRlcmZhY2UoKSBmYWlsZWQiKQorCisJcmV0dXJuIGVycjsKK30KKworCitpbnQgc245YzEwMl9zdHJlYW1faW50ZXJydXB0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJY2FtLT5zdHJlYW0gPSBTVFJFQU1fSU5URVJSVVBUOworCWVyciA9IHdhaXRfZXZlbnRfdGltZW91dChjYW0tPndhaXRfc3RyZWFtLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09GRikgfHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgU045QzEwMl9VUkJfVElNRU9VVCk7CisJaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKwllbHNlIGlmIChlcnIpIHsKKwkJY2FtLT5zdGF0ZSB8PSBERVZfTUlTQ09ORklHVVJFRDsKKwkJREJHKDEsICJUaGUgY2FtZXJhIGlzIG1pc2NvbmZpZ3VyZWQuIFRvIHVzZSBpdCwgY2xvc2UgYW5kICIKKwkJICAgICAgICJvcGVuIC9kZXYvdmlkZW8lZCBhZ2Fpbi4iLCBjYW0tPnY0bGRldi0+bWlub3IpCisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHU4IHNuOWMxMDJfc3RydG91OChjb25zdCBjaGFyKiBidWZmLCBzaXplX3QgbGVuLCBzc2l6ZV90KiBjb3VudCkKK3sKKwljaGFyIHN0cls1XTsKKwljaGFyKiBlbmRwOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKGxlbiA8IDQpIHsKKwkJc3RybmNweShzdHIsIGJ1ZmYsIGxlbik7CisJCXN0cltsZW4rMV0gPSAnXDAnOworCX0gZWxzZSB7CisJCXN0cm5jcHkoc3RyLCBidWZmLCA0KTsKKwkJc3RyWzRdID0gJ1wwJzsKKwl9CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChzdHIsICZlbmRwLCAwKTsKKworCSpjb3VudCA9IDA7CisJaWYgKHZhbCA8PSAweGZmKQorCQkqY291bnQgPSAoc3NpemVfdCkoZW5kcCAtIHN0cik7CisJaWYgKCgqY291bnQpICYmIChsZW4gPT0gKmNvdW50KzEpICYmIChidWZmWypjb3VudF0gPT0gJ1xuJykpCisJCSpjb3VudCArPSAxOworCisJcmV0dXJuICh1OCl2YWw7Cit9CisKKy8qCisgICBOT1RFIDE6IGJlaW5nIGluc2lkZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzIGltcGxpZXMgdGhhdCB0aGUgdjRsCisgICAgICAgICAgIGRldmljZSBleGlzdHMgZm9yIHN1cmUgKHNlZSBrb2JqZWN0cyBhbmQgcmVmZXJlbmNlIGNvdW50ZXJzKQorICAgTk9URSAyOiBidWZmZXJzIGFyZSBQQUdFX1NJWkUgbG9uZworKi8KKworc3RhdGljIHNzaXplX3Qgc245YzEwMl9zaG93X3JlZyhzdHJ1Y3QgY2xhc3NfZGV2aWNlKiBjZCwgY2hhciogYnVmKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCXNzaXplX3QgY291bnQ7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbjljMTAyX3N5c2ZzX2xvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodG9fdmlkZW9fZGV2aWNlKGNkKSk7CisJaWYgKCFjYW0pIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNvdW50ID0gc3ByaW50ZihidWYsICIldVxuIiwgY2FtLT5zeXNmcy5yZWcpOworCisJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9IAorCisKK3N0YXRpYyBzc2l6ZV90IAorc245YzEwMl9zdG9yZV9yZWcoc3RydWN0IGNsYXNzX2RldmljZSogY2QsIGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbTsKKwl1OCBpbmRleDsKKwlzc2l6ZV90IGNvdW50OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc245YzEwMl9zeXNmc19sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHRvX3ZpZGVvX2RldmljZShjZCkpOworCWlmICghY2FtKSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbmRleCA9IHNuOWMxMDJfc3RydG91OChidWYsIGxlbiwgJmNvdW50KTsKKwlpZiAoaW5kZXggPiAweDFmIHx8ICFjb3VudCkgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2FtLT5zeXNmcy5yZWcgPSBpbmRleDsKKworCURCRygyLCAiTW92ZWQgU045QzEwWCByZWdpc3RlciBpbmRleCB0byAweCUwMlgiLCBjYW0tPnN5c2ZzLnJlZykKKwlEQkcoMywgIldyaXR0ZW4gYnl0ZXM6ICV6ZCIsIGNvdW50KQorCisJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIHNzaXplX3Qgc245YzEwMl9zaG93X3ZhbChzdHJ1Y3QgY2xhc3NfZGV2aWNlKiBjZCwgY2hhciogYnVmKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCXNzaXplX3QgY291bnQ7CisJaW50IHZhbDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNuOWMxMDJfc3lzZnNfbG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh0b192aWRlb19kZXZpY2UoY2QpKTsKKwlpZiAoIWNhbSkgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCh2YWwgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgY2FtLT5zeXNmcy5yZWcpKSA8IDApIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNvdW50ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKworCURCRygzLCAiUmVhZCBieXRlczogJXpkIiwgY291bnQpCisKKwl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30gCisKKworc3RhdGljIHNzaXplX3QKK3NuOWMxMDJfc3RvcmVfdmFsKHN0cnVjdCBjbGFzc19kZXZpY2UqIGNkLCBjb25zdCBjaGFyKiBidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW07CisJdTggdmFsdWU7CisJc3NpemVfdCBjb3VudDsKKwlpbnQgZXJyOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc245YzEwMl9zeXNmc19sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHRvX3ZpZGVvX2RldmljZShjZCkpOworCWlmICghY2FtKSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl2YWx1ZSA9IHNuOWMxMDJfc3RydG91OChidWYsIGxlbiwgJmNvdW50KTsKKwlpZiAoIWNvdW50KSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnIgPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHZhbHVlLCBjYW0tPnN5c2ZzLnJlZyk7CisJaWYgKGVycikgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJREJHKDIsICJXcml0dGVuIFNOOUMxMFggcmVnLiAweCUwMlgsIHZhbC4gMHglMDJYIiwKKwkgICAgY2FtLT5zeXNmcy5yZWcsIHZhbHVlKQorCURCRygzLCAiV3JpdHRlbiBieXRlczogJXpkIiwgY291bnQpCisKKwl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgc3NpemVfdCBzbjljMTAyX3Nob3dfaTJjX3JlZyhzdHJ1Y3QgY2xhc3NfZGV2aWNlKiBjZCwgY2hhciogYnVmKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCXNzaXplX3QgY291bnQ7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbjljMTAyX3N5c2ZzX2xvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodG9fdmlkZW9fZGV2aWNlKGNkKSk7CisJaWYgKCFjYW0pIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNvdW50ID0gc3ByaW50ZihidWYsICIldVxuIiwgY2FtLT5zeXNmcy5pMmNfcmVnKTsKKworCURCRygzLCAiUmVhZCBieXRlczogJXpkIiwgY291bnQpCisKKwl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgc3NpemVfdCAKK3NuOWMxMDJfc3RvcmVfaTJjX3JlZyhzdHJ1Y3QgY2xhc3NfZGV2aWNlKiBjZCwgY29uc3QgY2hhciogYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCXU4IGluZGV4OworCXNzaXplX3QgY291bnQ7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbjljMTAyX3N5c2ZzX2xvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodG9fdmlkZW9fZGV2aWNlKGNkKSk7CisJaWYgKCFjYW0pIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWluZGV4ID0gc245YzEwMl9zdHJ0b3U4KGJ1ZiwgbGVuLCAmY291bnQpOworCWlmICghY291bnQpIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhbS0+c3lzZnMuaTJjX3JlZyA9IGluZGV4OworCisJREJHKDIsICJNb3ZlZCBzZW5zb3IgcmVnaXN0ZXIgaW5kZXggdG8gMHglMDJYIiwgY2FtLT5zeXNmcy5pMmNfcmVnKQorCURCRygzLCAiV3JpdHRlbiBieXRlczogJXpkIiwgY291bnQpCisKKwl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgc3NpemVfdCBzbjljMTAyX3Nob3dfaTJjX3ZhbChzdHJ1Y3QgY2xhc3NfZGV2aWNlKiBjZCwgY2hhciogYnVmKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCXNzaXplX3QgY291bnQ7CisJaW50IHZhbDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNuOWMxMDJfc3lzZnNfbG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh0b192aWRlb19kZXZpY2UoY2QpKTsKKwlpZiAoIWNhbSkgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCEoY2FtLT5zZW5zb3ItPnN5c2ZzX29wcyAmIFNOOUMxMDJfSTJDX1JFQUQpKSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlpZiAoKHZhbCA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCBjYW0tPnN5c2ZzLmkyY19yZWcpKSA8IDApIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNvdW50ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKworCURCRygzLCAiUmVhZCBieXRlczogJXpkIiwgY291bnQpCisKKwl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30gCisKKworc3RhdGljIHNzaXplX3QKK3NuOWMxMDJfc3RvcmVfaTJjX3ZhbChzdHJ1Y3QgY2xhc3NfZGV2aWNlKiBjZCwgY29uc3QgY2hhciogYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCXU4IHZhbHVlOworCXNzaXplX3QgY291bnQ7CisJaW50IGVycjsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNuOWMxMDJfc3lzZnNfbG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh0b192aWRlb19kZXZpY2UoY2QpKTsKKwlpZiAoIWNhbSkgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCEoY2FtLT5zZW5zb3ItPnN5c2ZzX29wcyAmIFNOOUMxMDJfSTJDX1dSSVRFKSkgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJdmFsdWUgPSBzbjljMTAyX3N0cnRvdTgoYnVmLCBsZW4sICZjb3VudCk7CisJaWYgKCFjb3VudCkgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCBjYW0tPnN5c2ZzLmkyY19yZWcsIHZhbHVlKTsKKwlpZiAoZXJyKSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlEQkcoMiwgIldyaXR0ZW4gc2Vuc29yIHJlZy4gMHglMDJYLCB2YWwuIDB4JTAyWCIsCisJICAgIGNhbS0+c3lzZnMuaTJjX3JlZywgdmFsdWUpCisJREJHKDMsICJXcml0dGVuIGJ5dGVzOiAlemQiLCBjb3VudCkKKworCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyBzc2l6ZV90CitzbjljMTAyX3N0b3JlX2dyZWVuKHN0cnVjdCBjbGFzc19kZXZpY2UqIGNkLCBjb25zdCBjaGFyKiBidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW07CisJZW51bSBzbjljMTAyX2JyaWRnZSBicmlkZ2U7CisJc3NpemVfdCByZXMgPSAwOworCXU4IHZhbHVlOworCXNzaXplX3QgY291bnQ7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbjljMTAyX3N5c2ZzX2xvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodG9fdmlkZW9fZGV2aWNlKGNkKSk7CisJaWYgKCFjYW0pIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWJyaWRnZSA9IGNhbS0+YnJpZGdlOworCisJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisKKwl2YWx1ZSA9IHNuOWMxMDJfc3RydG91OChidWYsIGxlbiwgJmNvdW50KTsKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoYnJpZGdlKSB7CisJY2FzZSBCUklER0VfU045QzEwMToKKwljYXNlIEJSSURHRV9TTjlDMTAyOgorCQlpZiAodmFsdWUgPiAweDBmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICgocmVzID0gc245YzEwMl9zdG9yZV9yZWcoY2QsICIweDExIiwgNCkpID49IDApCisJCQlyZXMgPSBzbjljMTAyX3N0b3JlX3ZhbChjZCwgYnVmLCBsZW4pOworCQlicmVhazsKKwljYXNlIEJSSURHRV9TTjlDMTAzOgorCQlpZiAodmFsdWUgPiAweDdmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICgocmVzID0gc245YzEwMl9zdG9yZV9yZWcoY2QsICIweDA0IiwgNCkpID49IDApCisJCQlyZXMgPSBzbjljMTAyX3N0b3JlX3ZhbChjZCwgYnVmLCBsZW4pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBzc2l6ZV90CitzbjljMTAyX3N0b3JlX2JsdWUoc3RydWN0IGNsYXNzX2RldmljZSogY2QsIGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IHJlcyA9IDA7CisJdTggdmFsdWU7CisJc3NpemVfdCBjb3VudDsKKworCXZhbHVlID0gc245YzEwMl9zdHJ0b3U4KGJ1ZiwgbGVuLCAmY291bnQpOworCWlmICghY291bnQgfHwgdmFsdWUgPiAweDdmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgocmVzID0gc245YzEwMl9zdG9yZV9yZWcoY2QsICIweDA2IiwgNCkpID49IDApCisJCXJlcyA9IHNuOWMxMDJfc3RvcmVfdmFsKGNkLCBidWYsIGxlbik7CisKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBzc2l6ZV90CitzbjljMTAyX3N0b3JlX3JlZChzdHJ1Y3QgY2xhc3NfZGV2aWNlKiBjZCwgY29uc3QgY2hhciogYnVmLCBzaXplX3QgbGVuKQoreworCXNzaXplX3QgcmVzID0gMDsKKwl1OCB2YWx1ZTsKKwlzc2l6ZV90IGNvdW50OworCisJdmFsdWUgPSBzbjljMTAyX3N0cnRvdTgoYnVmLCBsZW4sICZjb3VudCk7CisJaWYgKCFjb3VudCB8fCB2YWx1ZSA+IDB4N2YpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChyZXMgPSBzbjljMTAyX3N0b3JlX3JlZyhjZCwgIjB4MDUiLCA0KSkgPj0gMCkKKwkJcmVzID0gc245YzEwMl9zdG9yZV92YWwoY2QsIGJ1ZiwgbGVuKTsKKworCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIHNzaXplX3Qgc245YzEwMl9zaG93X2ZyYW1lX2hlYWRlcihzdHJ1Y3QgY2xhc3NfZGV2aWNlKiBjZCwgY2hhciogYnVmKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCXNzaXplX3QgY291bnQ7CisKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh0b192aWRlb19kZXZpY2UoY2QpKTsKKwlpZiAoIWNhbSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljb3VudCA9IHNpemVvZihjYW0tPnN5c2ZzLmZyYW1lX2hlYWRlcik7CisJbWVtY3B5KGJ1ZiwgY2FtLT5zeXNmcy5mcmFtZV9oZWFkZXIsIGNvdW50KTsKKworCURCRygzLCAiRnJhbWUgaGVhZGVyLCByZWFkIGJ5dGVzOiAlemQiLCBjb3VudCkKKworCXJldHVybiBjb3VudDsKK30gCisKKworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHJlZywgU19JUlVHTyB8IFNfSVdVU1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc245YzEwMl9zaG93X3JlZywgc245YzEwMl9zdG9yZV9yZWcpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHZhbCwgU19JUlVHTyB8IFNfSVdVU1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc245YzEwMl9zaG93X3ZhbCwgc245YzEwMl9zdG9yZV92YWwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGkyY19yZWcsIFNfSVJVR08gfCBTX0lXVVNSLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNuOWMxMDJfc2hvd19pMmNfcmVnLCBzbjljMTAyX3N0b3JlX2kyY19yZWcpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGkyY192YWwsIFNfSVJVR08gfCBTX0lXVVNSLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNuOWMxMDJfc2hvd19pMmNfdmFsLCBzbjljMTAyX3N0b3JlX2kyY192YWwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGdyZWVuLCBTX0lXVUdPLCBOVUxMLCBzbjljMTAyX3N0b3JlX2dyZWVuKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihibHVlLCBTX0lXVUdPLCBOVUxMLCBzbjljMTAyX3N0b3JlX2JsdWUpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHJlZCwgU19JV1VHTywgTlVMTCwgc245YzEwMl9zdG9yZV9yZWQpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGZyYW1lX2hlYWRlciwgU19JUlVHTywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbjljMTAyX3Nob3dfZnJhbWVfaGVhZGVyLCBOVUxMKTsKKworCitzdGF0aWMgdm9pZCBzbjljMTAyX2NyZWF0ZV9zeXNmcyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2NGxkZXYgPSBjYW0tPnY0bGRldjsKKworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWcpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl92YWwpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZV9oZWFkZXIpOworCWlmIChjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMSB8fCBjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMikKKwkJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2dyZWVuKTsKKwllbHNlIGlmIChjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMykgeworCQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYmx1ZSk7CisJCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWQpOworCX0KKwlpZiAoY2FtLT5zZW5zb3ItPnN5c2ZzX29wcykgeworCQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3JlZyk7CisJCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfdmFsKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorc245YzEwMl9zZXRfcGl4X2Zvcm1hdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4KQoreworCWludCBlcnIgPSAwOworCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIGNhbS0+cmVnWzB4MThdIHwgMHg4MCwgMHgxOCk7CisJZWxzZQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBjYW0tPnJlZ1sweDE4XSAmIDB4N2YsIDB4MTgpOworCisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQKK3NuOWMxMDJfc2V0X2NvbXByZXNzaW9uKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uKiBjb21wcmVzc2lvbikKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmIChjb21wcmVzc2lvbi0+cXVhbGl0eSA9PSAwKQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBjYW0tPnJlZ1sweDE3XSB8IDB4MDEsIDB4MTcpOworCWVsc2UgaWYgKGNvbXByZXNzaW9uLT5xdWFsaXR5ID09IDEpCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIGNhbS0+cmVnWzB4MTddICYgMHhmZSwgMHgxNyk7CisKKwlyZXR1cm4gZXJyID8gLUVJTyA6IDA7Cit9CisKKworc3RhdGljIGludCBzbjljMTAyX3NldF9zY2FsZShzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgdTggc2NhbGUpCit7CisJdTggciA9IDA7CisJaW50IGVyciA9IDA7CisKKwlpZiAoc2NhbGUgPT0gMSkKKwkJciA9IGNhbS0+cmVnWzB4MThdICYgMHhjZjsKKwllbHNlIGlmIChzY2FsZSA9PSAyKSB7CisJCXIgPSBjYW0tPnJlZ1sweDE4XSAmIDB4Y2Y7CisJCXIgfD0gMHgxMDsKKwl9IGVsc2UgaWYgKHNjYWxlID09IDQpCisJCXIgPSBjYW0tPnJlZ1sweDE4XSB8IDB4MjA7CisKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCByLCAweDE4KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTzsKKworCVBEQkdHKCJTY2FsaW5nIGZhY3RvcjogJXUiLCBzY2FsZSkKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc245YzEwMl9zZXRfY3JvcChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgc3RydWN0IHY0bDJfcmVjdCogcmVjdCkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBjYW0tPnNlbnNvcjsKKwl1OCBoX3N0YXJ0ID0gKHU4KShyZWN0LT5sZWZ0IC0gcy0+Y3JvcGNhcC5ib3VuZHMubGVmdCksCisJICAgdl9zdGFydCA9ICh1OCkocmVjdC0+dG9wIC0gcy0+Y3JvcGNhcC5ib3VuZHMudG9wKSwKKwkgICBoX3NpemUgPSAodTgpKHJlY3QtPndpZHRoIC8gMTYpLAorCSAgIHZfc2l6ZSA9ICh1OCkocmVjdC0+aGVpZ2h0IC8gMTYpOworCWludCBlcnIgPSAwOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgaF9zdGFydCwgMHgxMik7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgdl9zdGFydCwgMHgxMyk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgaF9zaXplLCAweDE1KTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCB2X3NpemUsIDB4MTYpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCisJUERCR0coImhfc3RhcnQsIHZfc3RhcnQsIGhfc2l6ZSwgdl9zaXplLCBob19zaXplLCB2b19zaXplICIKKwkgICAgICAiJXUgJXUgJXUgJXUiLCBoX3N0YXJ0LCB2X3N0YXJ0LCBoX3NpemUsIHZfc2l6ZSkKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc245YzEwMl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9IGNhbS0+c2Vuc29yOworCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKKwlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsOworCXN0cnVjdCB2NGwyX3JlY3QqIHJlY3Q7CisJdTggaSA9IDAsIG4gPSAwOworCWludCBlcnIgPSAwOworCisJaWYgKCEoY2FtLT5zdGF0ZSAmIERFVl9JTklUSUFMSVpFRCkpIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FtLT5vcGVuKTsKKwkJcWN0cmwgPSBzLT5xY3RybDsKKwkJcmVjdCA9ICYocy0+Y3JvcGNhcC5kZWZyZWN0KTsKKwl9IGVsc2UgeyAvKiB1c2UgY3VycmVudCB2YWx1ZXMgKi8KKwkJcWN0cmwgPSBzLT5fcWN0cmw7CisJCXJlY3QgPSAmKHMtPl9yZWN0KTsKKwl9CisKKwllcnIgKz0gc245YzEwMl9zZXRfc2NhbGUoY2FtLCByZWN0LT53aWR0aCAvIHMtPnBpeF9mb3JtYXQud2lkdGgpOworCWVyciArPSBzbjljMTAyX3NldF9jcm9wKGNhbSwgcmVjdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChzLT5pbml0KSB7CisJCWVyciA9IHMtPmluaXQoY2FtKTsKKwkJaWYgKGVycikgeworCQkJREJHKDMsICJTZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkIikKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlpZiAoIShjYW0tPnN0YXRlICYgREVWX0lOSVRJQUxJWkVEKSkKKwkJY2FtLT5jb21wcmVzc2lvbi5xdWFsaXR5ID0gIGNhbS0+cmVnWzB4MTddICYgMHgwMSA/IDAgOiAxOworCWVsc2UKKwkJZXJyICs9IHNuOWMxMDJfc2V0X2NvbXByZXNzaW9uKGNhbSwgJmNhbS0+Y29tcHJlc3Npb24pOworCWVyciArPSBzbjljMTAyX3NldF9waXhfZm9ybWF0KGNhbSwgJnMtPnBpeF9mb3JtYXQpOworCWlmIChzLT5zZXRfcGl4X2Zvcm1hdCkKKwkJZXJyICs9IHMtPnNldF9waXhfZm9ybWF0KGNhbSwgJnMtPnBpeF9mb3JtYXQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAocy0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCkKKwkJREJHKDMsICJDb21wcmVzc2VkIHZpZGVvIGZvcm1hdCBpcyBhY3RpdmUsIHF1YWxpdHkgJWQiLCAKKwkJICAgIGNhbS0+Y29tcHJlc3Npb24ucXVhbGl0eSkKKwllbHNlCisJCURCRygzLCAiVW5jb21wcmVzc2VkIHZpZGVvIGZvcm1hdCBpcyBhY3RpdmUiKQorCisJaWYgKHMtPnNldF9jcm9wKQorCQlpZiAoKGVyciA9IHMtPnNldF9jcm9wKGNhbSwgcmVjdCkpKSB7CisJCQlEQkcoMywgInNldF9jcm9wKCkgZmFpbGVkIikKKwkJCXJldHVybiBlcnI7CisJCX0KKworCWlmIChzLT5zZXRfY3RybCkgeworCQluID0gc2l6ZW9mKHMtPnFjdHJsKSAvIHNpemVvZihzLT5xY3RybFswXSk7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQlpZiAocy0+cWN0cmxbaV0uaWQgIT0gMCAmJiAKKwkJCSAgICAhKHMtPnFjdHJsW2ldLmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQpKSB7CisJCQkJY3RybC5pZCA9IHMtPnFjdHJsW2ldLmlkOworCQkJCWN0cmwudmFsdWUgPSBxY3RybFtpXS5kZWZhdWx0X3ZhbHVlOworCQkJCWVyciA9IHMtPnNldF9jdHJsKGNhbSwgJmN0cmwpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJREJHKDMsICJTZXQgJXMgY29udHJvbCBmYWlsZWQiLAorCQkJCQkgICAgcy0+cWN0cmxbaV0ubmFtZSkKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQl9CisJCQkJREJHKDMsICJJbWFnZSBzZW5zb3Igc3VwcG9ydHMgJyVzJyBjb250cm9sIiwKKwkJCQkgICAgcy0+cWN0cmxbaV0ubmFtZSkKKwkJCX0KKwl9CisKKwlpZiAoIShjYW0tPnN0YXRlICYgREVWX0lOSVRJQUxJWkVEKSkgeworCQlpbml0X01VVEVYKCZjYW0tPmZpbGVvcF9zZW0pOworCQlzcGluX2xvY2tfaW5pdCgmY2FtLT5xdWV1ZV9sb2NrKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FtLT53YWl0X2ZyYW1lKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FtLT53YWl0X3N0cmVhbSk7CisJCWNhbS0+bnJlYWRidWZmZXJzID0gMjsKKwkJbWVtY3B5KHMtPl9xY3RybCwgcy0+cWN0cmwsIHNpemVvZihzLT5xY3RybCkpOworCQltZW1jcHkoJihzLT5fcmVjdCksICYocy0+Y3JvcGNhcC5kZWZyZWN0KSwgCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHY0bDJfcmVjdCkpOworCQljYW0tPnN0YXRlIHw9IERFVl9JTklUSUFMSVpFRDsKKwl9CisKKwlEQkcoMiwgIkluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCIpCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgc245YzEwMl9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlkb3duKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCisJREJHKDIsICJWNEwyIGRldmljZSAvZGV2L3ZpZGVvJWQgZGVyZWdpc3RlcmVkIiwgY2FtLT52NGxkZXYtPm1pbm9yKQorCXZpZGVvX3NldF9kcnZkYXRhKGNhbS0+djRsZGV2LCBOVUxMKTsKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZShjYW0tPnY0bGRldik7CisKKwl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKworCWtmcmVlKGNhbS0+Y29udHJvbF9idWZmZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc245YzEwMl9vcGVuKHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBmaWxlKiBmaWxwKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCWludCBlcnIgPSAwOworCisJLyoKKwkgICBUaGlzIGlzIHRoZSBvbmx5IHNhZmUgd2F5IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGgKKwkgICBkaXNjb25uZWN0CisJKi8KKwlpZiAoIWRvd25fcmVhZF90cnlsb2NrKCZzbjljMTAyX2Rpc2Nvbm5lY3QpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjYW0tPmRldl9zZW0pKSB7CisJCXVwX3JlYWQoJnNuOWMxMDJfZGlzY29ubmVjdCk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJaWYgKGNhbS0+dXNlcnMpIHsKKwkJREJHKDIsICJEZXZpY2UgL2Rldi92aWRlbyVkIGlzIGJ1c3kuLi4iLCBjYW0tPnY0bGRldi0+bWlub3IpCisJCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8CisJCSAgICAoZmlscC0+Zl9mbGFncyAmIE9fTkRFTEFZKSkgeworCQkJZXJyID0gLUVXT1VMREJMT0NLOworCQkJZ290byBvdXQ7CisJCX0KKwkJdXAoJmNhbS0+ZGV2X3NlbSk7CisJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV9leGNsdXNpdmUoY2FtLT5vcGVuLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhY2FtLT51c2Vycyk7CisJCWlmIChlcnIpIHsKKwkJCXVwX3JlYWQoJnNuOWMxMDJfZGlzY29ubmVjdCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgeworCQkJdXBfcmVhZCgmc245YzEwMl9kaXNjb25uZWN0KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWRvd24oJmNhbS0+ZGV2X3NlbSk7CisJfQorCisKKwlpZiAoY2FtLT5zdGF0ZSAmIERFVl9NSVNDT05GSUdVUkVEKSB7CisJCWVyciA9IHNuOWMxMDJfaW5pdChjYW0pOworCQlpZiAoZXJyKSB7CisJCQlEQkcoMSwgIkluaXRpYWxpemF0aW9uIGZhaWxlZCBhZ2Fpbi4gIgorCQkJICAgICAgICJJIHdpbGwgcmV0cnkgb24gbmV4dCBvcGVuKCkuIikKKwkJCWdvdG8gb3V0OworCQl9CisJCWNhbS0+c3RhdGUgJj0gfkRFVl9NSVNDT05GSUdVUkVEOworCX0KKworCWlmICgoZXJyID0gc245YzEwMl9zdGFydF90cmFuc2ZlcihjYW0pKSkKKwkJZ290byBvdXQ7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBjYW07CisJY2FtLT51c2VycysrOworCWNhbS0+aW8gPSBJT19OT05FOworCWNhbS0+c3RyZWFtID0gU1RSRUFNX09GRjsKKwljYW0tPm5idWZmZXJzID0gMDsKKwljYW0tPmZyYW1lX2NvdW50ID0gMDsKKwlzbjljMTAyX2VtcHR5X2ZyYW1lcXVldWVzKGNhbSk7CisKKwlEQkcoMywgIlZpZGVvIGRldmljZSAvZGV2L3ZpZGVvJWQgaXMgb3BlbiIsIGNhbS0+djRsZGV2LT5taW5vcikKKworb3V0OgorCXVwKCZjYW0tPmRldl9zZW0pOworCXVwX3JlYWQoJnNuOWMxMDJfZGlzY29ubmVjdCk7CisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHNuOWMxMDJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUqIGlub2RlLCBzdHJ1Y3QgZmlsZSogZmlscCkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCisJZG93bigmY2FtLT5kZXZfc2VtKTsgLyogcHJldmVudCBkaXNjb25uZWN0KCkgdG8gYmUgY2FsbGVkICovCisKKwlzbjljMTAyX3N0b3BfdHJhbnNmZXIoY2FtKTsKKworCXNuOWMxMDJfcmVsZWFzZV9idWZmZXJzKGNhbSk7CisKKwlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKKwkJc245YzEwMl9yZWxlYXNlX3Jlc291cmNlcyhjYW0pOworCQl1cCgmY2FtLT5kZXZfc2VtKTsKKwkJa2ZyZWUoY2FtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FtLT51c2Vycy0tOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9ucigmY2FtLT5vcGVuLCAxKTsKKworCURCRygzLCAiVmlkZW8gZGV2aWNlIC9kZXYvdmlkZW8lZCBjbG9zZWQiLCBjYW0tPnY0bGRldi0+bWlub3IpCisKKwl1cCgmY2FtLT5kZXZfc2VtKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzc2l6ZV90CitzbjljMTAyX3JlYWQoc3RydWN0IGZpbGUqIGZpbHAsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCogZl9wb3MpCit7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwlzdHJ1Y3Qgc245YzEwMl9mcmFtZV90KiBmLCAqIGk7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCWludCBlcnIgPSAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2FtLT5maWxlb3Bfc2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgeworCQlEQkcoMSwgIkRldmljZSBub3QgcHJlc2VudCIpCisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY2FtLT5zdGF0ZSAmIERFVl9NSVNDT05GSUdVUkVEKSB7CisJCURCRygxLCAiVGhlIGNhbWVyYSBpcyBtaXNjb25maWd1cmVkLiBDbG9zZSBhbmQgb3BlbiBpdCBhZ2Fpbi4iKQorCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGNhbS0+aW8gPT0gSU9fTU1BUCkgeworCQlEQkcoMywgIkNsb3NlIGFuZCBvcGVuIHRoZSBkZXZpY2UgYWdhaW4gdG8gY2hvb3NlICIKKwkJICAgICAgICJ0aGUgcmVhZCBtZXRob2QiKQorCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNhbS0+aW8gPT0gSU9fTk9ORSkgeworCQlpZiAoIXNuOWMxMDJfcmVxdWVzdF9idWZmZXJzKGNhbSxjYW0tPm5yZWFkYnVmZmVycywgSU9fUkVBRCkpIHsKKwkJCURCRygxLCAicmVhZCgpIGZhaWxlZCwgbm90IGVub3VnaCBtZW1vcnkiKQorCQkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQljYW0tPmlvID0gSU9fUkVBRDsKKwkJY2FtLT5zdHJlYW0gPSBTVFJFQU1fT047CisJCXNuOWMxMDJfcXVldWVfdW51c2VkZnJhbWVzKGNhbSk7CisJfQorCisJaWYgKCFjb3VudCkgeworCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJmNhbS0+b3V0cXVldWUpKSB7CisJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUKKwkJICAgICAgKCBjYW0tPndhaXRfZnJhbWUsIAorCQkgICAgICAgICghbGlzdF9lbXB0eSgmY2FtLT5vdXRxdWV1ZSkpIHx8CisJCSAgICAgICAgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB8fAorCQkJKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgKTsKKwkJaWYgKGVycikgeworCQkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgeworCQkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlpZiAoY2FtLT5zdGF0ZSAmIERFVl9NSVNDT05GSUdVUkVEKSB7CisJCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJZiA9IGxpc3RfZW50cnkoY2FtLT5vdXRxdWV1ZS5wcmV2LCBzdHJ1Y3Qgc245YzEwMl9mcmFtZV90LCBmcmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZjYW0tPm91dHF1ZXVlLCBmcmFtZSkKKwkJaS0+c3RhdGUgPSBGX1VOVVNFRDsKKwlJTklUX0xJU1RfSEVBRCgmY2FtLT5vdXRxdWV1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXNuOWMxMDJfcXVldWVfdW51c2VkZnJhbWVzKGNhbSk7CisKKwlpZiAoY291bnQgPiBmLT5idWYuYnl0ZXN1c2VkKQorCQljb3VudCA9IGYtPmJ1Zi5ieXRlc3VzZWQ7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgZi0+YnVmbWVtLCBjb3VudCkpIHsKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkqZl9wb3MgKz0gY291bnQ7CisKKwlQREJHRygiRnJhbWUgIyVsdSwgYnl0ZXMgcmVhZDogJXp1IiwgKHVuc2lnbmVkIGxvbmcpZi0+YnVmLmluZGV4LGNvdW50KQorCisJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBzbjljMTAyX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjYW0tPmZpbGVvcF9zZW0pKQorCQlyZXR1cm4gUE9MTEVSUjsKKworCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgeworCQlEQkcoMSwgIkRldmljZSBub3QgcHJlc2VudCIpCisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgeworCQlEQkcoMSwgIlRoZSBjYW1lcmEgaXMgbWlzY29uZmlndXJlZC4gQ2xvc2UgYW5kIG9wZW4gaXQgYWdhaW4uIikKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoY2FtLT5pbyA9PSBJT19OT05FKSB7CisJCWlmICghc245YzEwMl9yZXF1ZXN0X2J1ZmZlcnMoY2FtLCBjYW0tPm5yZWFkYnVmZmVycywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT19SRUFEKSkgeworCQkJREJHKDEsICJwb2xsKCkgZmFpbGVkLCBub3QgZW5vdWdoIG1lbW9yeSIpCisJCQlnb3RvIGVycm9yOworCQl9CisJCWNhbS0+aW8gPSBJT19SRUFEOworCQljYW0tPnN0cmVhbSA9IFNUUkVBTV9PTjsKKwl9CisKKwlpZiAoY2FtLT5pbyA9PSBJT19SRUFEKQorCQlzbjljMTAyX3F1ZXVlX3VudXNlZGZyYW1lcyhjYW0pOworCisJcG9sbF93YWl0KGZpbHAsICZjYW0tPndhaXRfZnJhbWUsIHdhaXQpOworCisJaWYgKCFsaXN0X2VtcHR5KCZjYW0tPm91dHF1ZXVlKSkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisKKwlyZXR1cm4gbWFzazsKKworZXJyb3I6CisJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJcmV0dXJuIFBPTExFUlI7Cit9CisKKworc3RhdGljIHZvaWQgc245YzEwMl92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCogdm1hKQoreworCXN0cnVjdCBzbjljMTAyX2ZyYW1lX3QqIGYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlmLT52bWFfdXNlX2NvdW50Kys7Cit9CisKKworc3RhdGljIHZvaWQgc245YzEwMl92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QqIHZtYSkKK3sKKwkvKiBOT1RFOiBidWZmZXJzIGFyZSBub3QgZnJlZWQgaGVyZSAqLworCXN0cnVjdCBzbjljMTAyX2ZyYW1lX3QqIGYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlmLT52bWFfdXNlX2NvdW50LS07Cit9CisKKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzbjljMTAyX3ZtX29wcyA9IHsKKwkub3BlbiA9IHNuOWMxMDJfdm1fb3BlbiwKKwkuY2xvc2UgPSBzbjljMTAyX3ZtX2Nsb3NlLAorfTsKKworCitzdGF0aWMgaW50IHNuOWMxMDJfbW1hcChzdHJ1Y3QgZmlsZSogZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJICAgICAgICAgICAgICBzdGFydCA9IHZtYS0+dm1fc3RhcnQsCisJICAgICAgICAgICAgICBwb3MsCisJICAgICAgICAgICAgICBwYWdlOworCXUzMiBpOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2FtLT5maWxlb3Bfc2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgeworCQlEQkcoMSwgIkRldmljZSBub3QgcHJlc2VudCIpCisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY2FtLT5zdGF0ZSAmIERFVl9NSVNDT05GSUdVUkVEKSB7CisJCURCRygxLCAiVGhlIGNhbWVyYSBpcyBtaXNjb25maWd1cmVkLiBDbG9zZSBhbmQgb3BlbiBpdCBhZ2Fpbi4iKQorCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGNhbS0+aW8gIT0gSU9fTU1BUCB8fCAhKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgfHwKKwkgICAgc2l6ZSAhPSBQQUdFX0FMSUdOKGNhbS0+ZnJhbWVbMF0uYnVmLmxlbmd0aCkpIHsKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzOyBpKyspIHsKKwkJaWYgKChjYW0tPmZyYW1lW2ldLmJ1Zi5tLm9mZnNldD4+UEFHRV9TSElGVCkgPT0gdm1hLT52bV9wZ29mZikKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBjYW0tPm5idWZmZXJzKSB7CisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWTV9JTyBpcyBldmVudHVhbGx5IGdvaW5nIHRvIHJlcGxhY2UgUGFnZVJlc2VydmVkIGFsdG9nZXRoZXIgKi8KKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7IC8qIGF2b2lkIHRvIHN3YXAgb3V0IHRoaXMgVk1BICovCisKKwlwb3MgPSAodW5zaWduZWQgbG9uZyljYW0tPmZyYW1lW2ldLmJ1Zm1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsgLyogc2l6ZSBpcyBwYWdlLWFsaWduZWQgKi8KKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsCisJCSAgICAgICAgICAgICAgICAgICAgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCisJdm1hLT52bV9vcHMgPSAmc245YzEwMl92bV9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSAmY2FtLT5mcmFtZVtpXTsKKworCXNuOWMxMDJfdm1fb3Blbih2bWEpOworCisJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNuOWMxMDJfaW9jdGxfdjRsMihzdHJ1Y3QgaW5vZGUqIGlub2RlLCBzdHJ1Y3QgZmlsZSogZmlscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcCA9IHsKKwkJCS5kcml2ZXIgPSAic245YzEwMiIsCisJCQkudmVyc2lvbiA9IFNOOUMxMDJfTU9EVUxFX1ZFUlNJT05fQ09ERSwKKwkJCS5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgCisJCQkgICAgICAgICAgICAgICAgVjRMMl9DQVBfUkVBRFdSSVRFIHwKKwkJCSAgICAgICAgICAgICAgICBWNEwyX0NBUF9TVFJFQU1JTkcsCisJCX07CisKKwkJc3RybGNweShjYXAuY2FyZCwgY2FtLT52NGxkZXYtPm5hbWUsIHNpemVvZihjYXAuY2FyZCkpOworCQlpZiAodXNiX21ha2VfcGF0aChjYW0tPnVzYmRldiwgY2FwLmJ1c19pbmZvLAorCQkgICAgc2l6ZW9mKGNhcC5idXNfaW5mbykpIDwgMCkKKwkJCXN0cmxjcHkoY2FwLmJ1c19pbmZvLCBjYW0tPmRldi5idXNfaWQsCisJCQkgICAgICAgIHNpemVvZihjYXAuYnVzX2luZm8pKTsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJmNhcCwgc2l6ZW9mKGNhcCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgorCXsKKwkJc3RydWN0IHY0bDJfaW5wdXQgaTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmksIGFyZywgc2l6ZW9mKGkpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChpLmluZGV4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtc2V0KCZpLCAwLCBzaXplb2YoaSkpOworCQlzdHJjcHkoaS5uYW1lLCAiVVNCIik7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpLCBzaXplb2YoaSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfR19JTlBVVDoKKwljYXNlIFZJRElPQ19TX0lOUFVUOgorCXsKKwkJaW50IGluZGV4OworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5kZXgsIGFyZywgc2l6ZW9mKGluZGV4KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaW5kZXggIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwl7CisJCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9IGNhbS0+c2Vuc29yOworCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcWM7CisJCXU4IGksIG47CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZxYywgYXJnLCBzaXplb2YocWMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCW4gPSBzaXplb2Yocy0+cWN0cmwpIC8gc2l6ZW9mKHMtPnFjdHJsWzBdKTsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJCWlmIChxYy5pZCAmJiBxYy5pZCA9PSBzLT5xY3RybFtpXS5pZCkgeworCQkJCW1lbWNweSgmcWMsICYocy0+cWN0cmxbaV0pLCBzaXplb2YocWMpKTsKKwkJCQlpZiAoY29weV90b191c2VyKGFyZywgJnFjLCBzaXplb2YocWMpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2FzZSBWSURJT0NfR19DVFJMOgorCXsKKwkJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gY2FtLT5zZW5zb3I7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKKwkJaW50IGVyciA9IDA7CisKKwkJaWYgKCFzLT5nZXRfY3RybCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY3RybCwgYXJnLCBzaXplb2YoY3RybCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZXJyID0gcy0+Z2V0X2N0cmwoY2FtLCAmY3RybCk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjdHJsLCBzaXplb2YoY3RybCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIGVycjsKKwl9CisKKwljYXNlIFZJRElPQ19TX0NUUkxfT0xEOgorCWNhc2UgVklESU9DX1NfQ1RSTDoKKwl7CisJCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9IGNhbS0+c2Vuc29yOworCQlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisJCXU4IGksIG47CisJCWludCBlcnIgPSAwOworCisJCWlmICghcy0+c2V0X2N0cmwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmN0cmwsIGFyZywgc2l6ZW9mKGN0cmwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCW4gPSBzaXplb2Yocy0+cWN0cmwpIC8gc2l6ZW9mKHMtPnFjdHJsWzBdKTsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJCWlmIChjdHJsLmlkID09IHMtPnFjdHJsW2ldLmlkKSB7CisJCQkJaWYgKGN0cmwudmFsdWUgPCBzLT5xY3RybFtpXS5taW5pbXVtIHx8CisJCQkJICAgIGN0cmwudmFsdWUgPiBzLT5xY3RybFtpXS5tYXhpbXVtKQorCQkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCQljdHJsLnZhbHVlIC09IGN0cmwudmFsdWUgJSBzLT5xY3RybFtpXS5zdGVwOworCQkJCWJyZWFrOworCQkJfQorCisJCWlmICgoZXJyID0gcy0+c2V0X2N0cmwoY2FtLCAmY3RybCkpKQorCQkJcmV0dXJuIGVycjsKKworCQlzLT5fcWN0cmxbaV0uZGVmYXVsdF92YWx1ZSA9IGN0cmwudmFsdWU7CisKKwkJUERCR0coIlZJRElPQ19TX0NUUkw6IGlkICVsdSwgdmFsdWUgJWx1IiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpY3RybC5pZCwgKHVuc2lnbmVkIGxvbmcpY3RybC52YWx1ZSkKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19DUk9QQ0FQOgorCXsKKwkJc3RydWN0IHY0bDJfY3JvcGNhcCogY2MgPSAmKGNhbS0+c2Vuc29yLT5jcm9wY2FwKTsKKworCQljYy0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJY2MtPnBpeGVsYXNwZWN0Lm51bWVyYXRvciA9IDE7CisJCWNjLT5waXhlbGFzcGVjdC5kZW5vbWluYXRvciA9IDE7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsIGNjLCBzaXplb2YoKmNjKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19HX0NST1A6CisJeworCQlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBjYW0tPnNlbnNvcjsKKwkJc3RydWN0IHY0bDJfY3JvcCBjcm9wID0geworCQkJLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisJCX07CisKKwkJbWVtY3B5KCYoY3JvcC5jKSwgJihzLT5fcmVjdCksIHNpemVvZihzdHJ1Y3QgdjRsMl9yZWN0KSk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjcm9wLCBzaXplb2YoY3JvcCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfU19DUk9QOgorCXsKKwkJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gY2FtLT5zZW5zb3I7CisJCXN0cnVjdCB2NGwyX2Nyb3AgY3JvcDsKKwkJc3RydWN0IHY0bDJfcmVjdCogcmVjdDsKKwkJc3RydWN0IHY0bDJfcmVjdCogYm91bmRzID0gJihzLT5jcm9wY2FwLmJvdW5kcyk7CisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHBpeF9mb3JtYXQgPSAmKHMtPnBpeF9mb3JtYXQpOworCQl1OCBzY2FsZTsKKwkJY29uc3QgZW51bSBzbjljMTAyX3N0cmVhbV9zdGF0ZSBzdHJlYW0gPSBjYW0tPnN0cmVhbTsKKwkJY29uc3QgdTMyIG5idWZmZXJzID0gY2FtLT5uYnVmZmVyczsKKwkJdTMyIGk7CisJCWludCBlcnIgPSAwOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY3JvcCwgYXJnLCBzaXplb2YoY3JvcCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmVjdCA9ICYoY3JvcC5jKTsKKworCQlpZiAoY3JvcC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXApCisJCQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKQorCQkJCWlmIChjYW0tPmZyYW1lW2ldLnZtYV91c2VfY291bnQpIHsKKwkJCQkJREJHKDMsICJWSURJT0NfU19DUk9QIGZhaWxlZC4gIgorCQkJCQkgICAgICAgIlVubWFwIHRoZSBidWZmZXJzIGZpcnN0LiIpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkvKiBQcmVzZXJ2ZSBSLEcgb3IgQiBvcmlnaW4gKi8KKwkJcmVjdC0+bGVmdCA9IChzLT5fcmVjdC5sZWZ0ICYgMUwpID8KKwkJICAgICAgICAgICAgIHJlY3QtPmxlZnQgfCAxTCA6IHJlY3QtPmxlZnQgJiB+MUw7CisJCXJlY3QtPnRvcCA9IChzLT5fcmVjdC50b3AgJiAxTCkgPworCQkgICAgICAgICAgICByZWN0LT50b3AgfCAxTCA6IHJlY3QtPnRvcCAmIH4xTDsKKworCQlpZiAocmVjdC0+d2lkdGggPCAxNikKKwkJCXJlY3QtPndpZHRoID0gMTY7CisJCWlmIChyZWN0LT5oZWlnaHQgPCAxNikKKwkJCXJlY3QtPmhlaWdodCA9IDE2OworCQlpZiAocmVjdC0+d2lkdGggPiBib3VuZHMtPndpZHRoKQorCQkJcmVjdC0+d2lkdGggPSBib3VuZHMtPndpZHRoOworCQlpZiAocmVjdC0+aGVpZ2h0ID4gYm91bmRzLT5oZWlnaHQpCisJCQlyZWN0LT5oZWlnaHQgPSBib3VuZHMtPmhlaWdodDsKKwkJaWYgKHJlY3QtPmxlZnQgPCBib3VuZHMtPmxlZnQpCisJCQlyZWN0LT5sZWZ0ID0gYm91bmRzLT5sZWZ0OworCQlpZiAocmVjdC0+dG9wIDwgYm91bmRzLT50b3ApCisJCQlyZWN0LT50b3AgPSBib3VuZHMtPnRvcDsKKwkJaWYgKHJlY3QtPmxlZnQgKyByZWN0LT53aWR0aCA+IGJvdW5kcy0+bGVmdCArIGJvdW5kcy0+d2lkdGgpCisJCQlyZWN0LT5sZWZ0ID0gYm91bmRzLT5sZWZ0K2JvdW5kcy0+d2lkdGggLSByZWN0LT53aWR0aDsKKwkJaWYgKHJlY3QtPnRvcCArIHJlY3QtPmhlaWdodCA+IGJvdW5kcy0+dG9wICsgYm91bmRzLT5oZWlnaHQpCisJCQlyZWN0LT50b3AgPSBib3VuZHMtPnRvcCtib3VuZHMtPmhlaWdodCAtIHJlY3QtPmhlaWdodDsKKworCQlyZWN0LT53aWR0aCAmPSB+MTVMOworCQlyZWN0LT5oZWlnaHQgJj0gfjE1TDsKKworCQlpZiAoU045QzEwMl9QUkVTRVJWRV9JTUdTQ0FMRSkgeworCQkJLyogQ2FsY3VsYXRlIHRoZSBhY3R1YWwgc2NhbGluZyBmYWN0b3IgKi8KKwkJCXUzMiBhLCBiOworCQkJYSA9IHJlY3QtPndpZHRoICogcmVjdC0+aGVpZ2h0OworCQkJYiA9IHBpeF9mb3JtYXQtPndpZHRoICogcGl4X2Zvcm1hdC0+aGVpZ2h0OworCQkJc2NhbGUgPSBiID8gKHU4KSgoYSAvIGIpIDwgNCA/IDEgOgorCQkgICAgICAgICAgICAgICAgICAgICAgICAoKGEgLyBiKSA8IDE2ID8gMiA6IDQpKSA6IDE7CisJCX0gZWxzZQorCQkJc2NhbGUgPSAxOworCisJCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pCisJCQlpZiAoKGVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pKSkKKwkJCQlyZXR1cm4gZXJyOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY3JvcCwgc2l6ZW9mKGNyb3ApKSkgeworCQkJY2FtLT5zdHJlYW0gPSBzdHJlYW07CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWlmIChjYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXAgfHwgY2FtLT5pbyA9PSBJT19SRUFEKQorCQkJc245YzEwMl9yZWxlYXNlX2J1ZmZlcnMoY2FtKTsKKworCQllcnIgPSBzbjljMTAyX3NldF9jcm9wKGNhbSwgcmVjdCk7CisJCWlmIChzLT5zZXRfY3JvcCkKKwkJCWVyciArPSBzLT5zZXRfY3JvcChjYW0sIHJlY3QpOworCQllcnIgKz0gc245YzEwMl9zZXRfc2NhbGUoY2FtLCBzY2FsZSk7CisKKwkJaWYgKGVycikgeyAvKiBhdG9taWMsIG5vIHJvbGxiYWNrIGluIGlvY3RsKCkgKi8KKwkJCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7CisJCQlEQkcoMSwgIlZJRElPQ19TX0NST1AgZmFpbGVkIGJlY2F1c2Ugb2YgaGFyZHdhcmUgIgorCQkJICAgICAgICJwcm9ibGVtcy4gVG8gdXNlIHRoZSBjYW1lcmEsIGNsb3NlIGFuZCBvcGVuICIKKwkJCSAgICAgICAiL2Rldi92aWRlbyVkIGFnYWluLiIsIGNhbS0+djRsZGV2LT5taW5vcikKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJcy0+cGl4X2Zvcm1hdC53aWR0aCA9IHJlY3QtPndpZHRoL3NjYWxlOworCQlzLT5waXhfZm9ybWF0LmhlaWdodCA9IHJlY3QtPmhlaWdodC9zY2FsZTsKKwkJbWVtY3B5KCYocy0+X3JlY3QpLCByZWN0LCBzaXplb2YoKnJlY3QpKTsKKworCQlpZiAoKGNhbS0+bW9kdWxlX3BhcmFtLmZvcmNlX211bm1hcCB8fCBjYW0tPmlvID09IElPX1JFQUQpICYmCisJCSAgICBuYnVmZmVycyAhPSBzbjljMTAyX3JlcXVlc3RfYnVmZmVycyhjYW0sIG5idWZmZXJzLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5pbykpIHsKKwkJCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7CisJCQlEQkcoMSwgIlZJRElPQ19TX0NST1AgZmFpbGVkIGJlY2F1c2Ugb2Ygbm90IGVub3VnaCAiCisJCQkgICAgICAgIm1lbW9yeS4gVG8gdXNlIHRoZSBjYW1lcmEsIGNsb3NlIGFuZCBvcGVuICIKKwkJCSAgICAgICAiL2Rldi92aWRlbyVkIGFnYWluLiIsIGNhbS0+djRsZGV2LT5taW5vcikKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJY2FtLT5zdHJlYW0gPSBzdHJlYW07CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfRU5VTV9GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjIGZtdGQ7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmbXRkLCBhcmcsIHNpemVvZihmbXRkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoZm10ZC5pbmRleCA9PSAwKSB7CisJCQlzdHJjcHkoZm10ZC5kZXNjcmlwdGlvbiwgImJheWVyIHJnYiIpOworCQkJZm10ZC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TQkdHUjg7CisJCX0gZWxzZSBpZiAoZm10ZC5pbmRleCA9PSAxKSB7CisJCQlzdHJjcHkoZm10ZC5kZXNjcmlwdGlvbiwgImNvbXByZXNzZWQiKTsKKwkJCWZtdGQucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfU045QzEwWDsKKwkJCWZtdGQuZmxhZ3MgPSBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQ7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZm10ZC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQltZW1zZXQoJmZtdGQucmVzZXJ2ZWQsIDAsIHNpemVvZihmbXRkLnJlc2VydmVkKSk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZmbXRkLCBzaXplb2YoZm10ZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfR19GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgZm9ybWF0OworCQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KiBwZm10ID0gJihjYW0tPnNlbnNvci0+cGl4X2Zvcm1hdCk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmb3JtYXQsIGFyZywgc2l6ZW9mKGZvcm1hdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGZvcm1hdC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXBmbXQtPmJ5dGVzcGVybGluZSA9IChwZm10LT5waXhlbGZvcm1hdD09VjRMMl9QSVhfRk1UX1NOOUMxMFgpCisJCSAgICAgICAgICAgICAgICAgICAgID8gMCA6IChwZm10LT53aWR0aCAqIHBmbXQtPnByaXYpIC8gODsKKwkJcGZtdC0+c2l6ZWltYWdlID0gcGZtdC0+aGVpZ2h0ICogKChwZm10LT53aWR0aCpwZm10LT5wcml2KS84KTsKKwkJcGZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCW1lbWNweSgmKGZvcm1hdC5mbXQucGl4KSwgcGZtdCwgc2l6ZW9mKCpwZm10KSk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZmb3JtYXQsIHNpemVvZihmb3JtYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX1RSWV9GTVQ6CisJY2FzZSBWSURJT0NfU19GTVQ6CisJeworCQlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBjYW0tPnNlbnNvcjsKKwkJc3RydWN0IHY0bDJfZm9ybWF0IGZvcm1hdDsKKwkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4OworCQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KiBwZm10ID0gJihzLT5waXhfZm9ybWF0KTsKKwkJc3RydWN0IHY0bDJfcmVjdCogYm91bmRzID0gJihzLT5jcm9wY2FwLmJvdW5kcyk7CisJCXN0cnVjdCB2NGwyX3JlY3QgcmVjdDsKKwkJdTggc2NhbGU7CisJCWNvbnN0IGVudW0gc245YzEwMl9zdHJlYW1fc3RhdGUgc3RyZWFtID0gY2FtLT5zdHJlYW07CisJCWNvbnN0IHUzMiBuYnVmZmVycyA9IGNhbS0+bmJ1ZmZlcnM7CisJCXUzMiBpOworCQlpbnQgZXJyID0gMDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmZvcm1hdCwgYXJnLCBzaXplb2YoZm9ybWF0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlwaXggPSAmKGZvcm1hdC5mbXQucGl4KTsKKworCQlpZiAoZm9ybWF0LnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtY3B5KCZyZWN0LCAmKHMtPl9yZWN0KSwgc2l6ZW9mKHJlY3QpKTsKKworCQl7IC8qIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIHNjYWxpbmcgZmFjdG9yICovCisJCQl1MzIgYSwgYjsKKwkJCWEgPSByZWN0LndpZHRoICogcmVjdC5oZWlnaHQ7CisJCQliID0gcGl4LT53aWR0aCAqIHBpeC0+aGVpZ2h0OworCQkJc2NhbGUgPSBiID8gKHU4KSgoYSAvIGIpIDwgNCA/IDEgOgorCQkgICAgICAgICAgICAgICAgICAgICAgICAoKGEgLyBiKSA8IDE2ID8gMiA6IDQpKSA6IDE7CisJCX0KKworCQlyZWN0LndpZHRoID0gc2NhbGUgKiBwaXgtPndpZHRoOworCQlyZWN0LmhlaWdodCA9IHNjYWxlICogcGl4LT5oZWlnaHQ7CisKKwkJaWYgKHJlY3Qud2lkdGggPCAxNikKKwkJCXJlY3Qud2lkdGggPSAxNjsKKwkJaWYgKHJlY3QuaGVpZ2h0IDwgMTYpCisJCQlyZWN0LmhlaWdodCA9IDE2OworCQlpZiAocmVjdC53aWR0aCA+IGJvdW5kcy0+bGVmdCArIGJvdW5kcy0+d2lkdGggLSByZWN0LmxlZnQpCisJCQlyZWN0LndpZHRoID0gYm91bmRzLT5sZWZ0ICsgYm91bmRzLT53aWR0aCAtIHJlY3QubGVmdDsKKwkJaWYgKHJlY3QuaGVpZ2h0ID4gYm91bmRzLT50b3AgKyBib3VuZHMtPmhlaWdodCAtIHJlY3QudG9wKQorCQkJcmVjdC5oZWlnaHQgPSBib3VuZHMtPnRvcCArIGJvdW5kcy0+aGVpZ2h0IC0gcmVjdC50b3A7CisKKwkJcmVjdC53aWR0aCAmPSB+MTVMOworCQlyZWN0LmhlaWdodCAmPSB+MTVMOworCisJCXsgLyogYWRqdXN0IHRoZSBzY2FsaW5nIGZhY3RvciAqLworCQkJdTMyIGEsIGI7CisJCQlhID0gcmVjdC53aWR0aCAqIHJlY3QuaGVpZ2h0OworCQkJYiA9IHBpeC0+d2lkdGggKiBwaXgtPmhlaWdodDsKKwkJCXNjYWxlID0gYiA/ICh1OCkoKGEgLyBiKSA8IDQgPyAxIDoKKwkJICAgICAgICAgICAgICAgICAgICAgICAgKChhIC8gYikgPCAxNiA/IDIgOiA0KSkgOiAxOworCQl9CisKKwkJcGl4LT53aWR0aCA9IHJlY3Qud2lkdGggLyBzY2FsZTsKKwkJcGl4LT5oZWlnaHQgPSByZWN0LmhlaWdodCAvIHNjYWxlOworCisJCWlmIChwaXgtPnBpeGVsZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9TTjlDMTBYICYmCisJCSAgICBwaXgtPnBpeGVsZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9TQkdHUjgpCisJCQlwaXgtPnBpeGVsZm9ybWF0ID0gcGZtdC0+cGl4ZWxmb3JtYXQ7CisJCXBpeC0+cHJpdiA9IHBmbXQtPnByaXY7IC8qIGJwcCAqLworCQlwaXgtPmNvbG9yc3BhY2UgPSBwZm10LT5jb2xvcnNwYWNlOworCQlwaXgtPmJ5dGVzcGVybGluZSA9IChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9TTjlDMTBYKQorCQkgICAgICAgICAgICAgICAgICAgID8gMCA6IChwaXgtPndpZHRoICogcGl4LT5wcml2KSAvIDg7CisJCXBpeC0+c2l6ZWltYWdlID0gcGl4LT5oZWlnaHQgKiAoKHBpeC0+d2lkdGggKiBwaXgtPnByaXYpIC8gOCk7CisJCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisKKwkJaWYgKGNtZCA9PSBWSURJT0NfVFJZX0ZNVCkgeworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZmb3JtYXQsIHNpemVvZihmb3JtYXQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGNhbS0+bW9kdWxlX3BhcmFtLmZvcmNlX211bm1hcCkKKwkJCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzOyBpKyspCisJCQkJaWYgKGNhbS0+ZnJhbWVbaV0udm1hX3VzZV9jb3VudCkgeworCQkJCQlEQkcoMywgIlZJRElPQ19TX0ZNVCBmYWlsZWQuICIKKwkJCQkJICAgICAgICJVbm1hcCB0aGUgYnVmZmVycyBmaXJzdC4iKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKKwkJCWlmICgoZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSkpKQorCQkJCXJldHVybiBlcnI7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZmb3JtYXQsIHNpemVvZihmb3JtYXQpKSkgeworCQkJY2FtLT5zdHJlYW0gPSBzdHJlYW07CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWlmIChjYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXAgIHx8IGNhbS0+aW8gPT0gSU9fUkVBRCkKKwkJCXNuOWMxMDJfcmVsZWFzZV9idWZmZXJzKGNhbSk7CisKKwkJZXJyICs9IHNuOWMxMDJfc2V0X3BpeF9mb3JtYXQoY2FtLCBwaXgpOworCQllcnIgKz0gc245YzEwMl9zZXRfY3JvcChjYW0sICZyZWN0KTsKKwkJaWYgKHMtPnNldF9waXhfZm9ybWF0KQorCQkJZXJyICs9IHMtPnNldF9waXhfZm9ybWF0KGNhbSwgcGl4KTsKKwkJaWYgKHMtPnNldF9jcm9wKQorCQkJZXJyICs9IHMtPnNldF9jcm9wKGNhbSwgJnJlY3QpOworCQllcnIgKz0gc245YzEwMl9zZXRfc2NhbGUoY2FtLCBzY2FsZSk7CisKKwkJaWYgKGVycikgeyAvKiBhdG9taWMsIG5vIHJvbGxiYWNrIGluIGlvY3RsKCkgKi8KKwkJCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7CisJCQlEQkcoMSwgIlZJRElPQ19TX0ZNVCBmYWlsZWQgYmVjYXVzZSBvZiBoYXJkd2FyZSAiCisJCQkgICAgICAgInByb2JsZW1zLiBUbyB1c2UgdGhlIGNhbWVyYSwgY2xvc2UgYW5kIG9wZW4gIgorCQkJICAgICAgICIvZGV2L3ZpZGVvJWQgYWdhaW4uIiwgY2FtLT52NGxkZXYtPm1pbm9yKQorCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQltZW1jcHkocGZtdCwgcGl4LCBzaXplb2YoKnBpeCkpOworCQltZW1jcHkoJihzLT5fcmVjdCksICZyZWN0LCBzaXplb2YocmVjdCkpOworCisJCWlmICgoY2FtLT5tb2R1bGVfcGFyYW0uZm9yY2VfbXVubWFwICB8fCBjYW0tPmlvID09IElPX1JFQUQpICYmCisJCSAgICBuYnVmZmVycyAhPSBzbjljMTAyX3JlcXVlc3RfYnVmZmVycyhjYW0sIG5idWZmZXJzLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5pbykpIHsKKwkJCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7CisJCQlEQkcoMSwgIlZJRElPQ19TX0ZNVCBmYWlsZWQgYmVjYXVzZSBvZiBub3QgZW5vdWdoICIKKwkJCSAgICAgICAibWVtb3J5LiBUbyB1c2UgdGhlIGNhbWVyYSwgY2xvc2UgYW5kIG9wZW4gIgorCQkJICAgICAgICIvZGV2L3ZpZGVvJWQgYWdhaW4uIiwgY2FtLT52NGxkZXYtPm1pbm9yKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQljYW0tPnN0cmVhbSA9IHN0cmVhbTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19HX0pQRUdDT01QOgorCXsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjYW0tPmNvbXByZXNzaW9uLAorCQkgICAgICAgICAgICAgICAgIHNpemVvZihjYW0tPmNvbXByZXNzaW9uKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19TX0pQRUdDT01QOgorCXsKKwkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uIGpjOworCQljb25zdCBlbnVtIHNuOWMxMDJfc3RyZWFtX3N0YXRlIHN0cmVhbSA9IGNhbS0+c3RyZWFtOworCQlpbnQgZXJyID0gMDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmpjLCBhcmcsIHNpemVvZihqYykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGpjLnF1YWxpdHkgIT0gMCAmJiBqYy5xdWFsaXR5ICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQorCQkJaWYgKChlcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCisJCQkJcmV0dXJuIGVycjsKKworCQllcnIgKz0gc245YzEwMl9zZXRfY29tcHJlc3Npb24oY2FtLCAmamMpOworCQlpZiAoZXJyKSB7IC8qIGF0b21pYywgbm8gcm9sbGJhY2sgaW4gaW9jdGwoKSAqLworCQkJY2FtLT5zdGF0ZSB8PSBERVZfTUlTQ09ORklHVVJFRDsKKwkJCURCRygxLCAiVklESU9DX1NfSlBFR0NPTVAgZmFpbGVkIGJlY2F1c2Ugb2YgaGFyZHdhcmUgIgorCQkJICAgICAgICJwcm9ibGVtcy4gVG8gdXNlIHRoZSBjYW1lcmEsIGNsb3NlIGFuZCBvcGVuICIKKwkJCSAgICAgICAiL2Rldi92aWRlbyVkIGFnYWluLiIsIGNhbS0+djRsZGV2LT5taW5vcikKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJY2FtLT5jb21wcmVzc2lvbi5xdWFsaXR5ID0gamMucXVhbGl0eTsKKworCQljYW0tPnN0cmVhbSA9IHN0cmVhbTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19SRVFCVUZTOgorCXsKKwkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmI7CisJCXUzMiBpOworCQlpbnQgZXJyOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmIsIGFyZywgc2l6ZW9mKHJiKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAocmIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKwkJICAgIHJiLm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNhbS0+aW8gPT0gSU9fUkVBRCkgeworCQkJREJHKDMsICJDbG9zZSBhbmQgb3BlbiB0aGUgZGV2aWNlIGFnYWluIHRvIGNob29zZSAiCisJCQkgICAgICAgInRoZSBtbWFwIEkvTyBtZXRob2QiKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKQorCQkJaWYgKGNhbS0+ZnJhbWVbaV0udm1hX3VzZV9jb3VudCkgeworCQkJCURCRygzLCAiVklESU9DX1JFUUJVRlMgZmFpbGVkLiAiCisJCQkJICAgICAgICJQcmV2aW91cyBidWZmZXJzIGFyZSBzdGlsbCBtYXBwZWQuIikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQorCQkJaWYgKChlcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCisJCQkJcmV0dXJuIGVycjsKKworCQlzbjljMTAyX2VtcHR5X2ZyYW1lcXVldWVzKGNhbSk7CisKKwkJc245YzEwMl9yZWxlYXNlX2J1ZmZlcnMoY2FtKTsKKwkJaWYgKHJiLmNvdW50KQorCQkJcmIuY291bnQgPSBzbjljMTAyX3JlcXVlc3RfYnVmZmVycyhjYW0sIHJiLmNvdW50LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT19NTUFQKTsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJnJiLCBzaXplb2YocmIpKSkgeworCQkJc245YzEwMl9yZWxlYXNlX2J1ZmZlcnMoY2FtKTsKKwkJCWNhbS0+aW8gPSBJT19OT05FOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQljYW0tPmlvID0gcmIuY291bnQgPyBJT19NTUFQIDogSU9fTk9ORTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19RVUVSWUJVRjoKKwl7CisJCXN0cnVjdCB2NGwyX2J1ZmZlciBiOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYiwgYXJnLCBzaXplb2YoYikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKwkJICAgIGIuaW5kZXggPj0gY2FtLT5uYnVmZmVycyB8fCBjYW0tPmlvICE9IElPX01NQVApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQltZW1jcHkoJmIsICZjYW0tPmZyYW1lW2IuaW5kZXhdLmJ1Ziwgc2l6ZW9mKGIpKTsKKworCQlpZiAoY2FtLT5mcmFtZVtiLmluZGV4XS52bWFfdXNlX2NvdW50KQorCQkJYi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKKworCQlpZiAoY2FtLT5mcmFtZVtiLmluZGV4XS5zdGF0ZSA9PSBGX0RPTkUpCisJCQliLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKKwkJZWxzZSBpZiAoY2FtLT5mcmFtZVtiLmluZGV4XS5zdGF0ZSAhPSBGX1VOVVNFRCkKKwkJCWIuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZiLCBzaXplb2YoYikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfUUJVRjoKKwl7CisJCXN0cnVjdCB2NGwyX2J1ZmZlciBiOworCQl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZiLCBhcmcsIHNpemVvZihiKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoYi50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fAorCQkgICAgYi5pbmRleCA+PSBjYW0tPm5idWZmZXJzIHx8IGNhbS0+aW8gIT0gSU9fTU1BUCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjYW0tPmZyYW1lW2IuaW5kZXhdLnN0YXRlICE9IEZfVU5VU0VEKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2FtLT5mcmFtZVtiLmluZGV4XS5zdGF0ZSA9IEZfUVVFVUVEOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPnF1ZXVlX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZjYW0tPmZyYW1lW2IuaW5kZXhdLmZyYW1lLCAmY2FtLT5pbnF1ZXVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlQREJHRygiRnJhbWUgIyVsdSBxdWV1ZWQiLCAodW5zaWduZWQgbG9uZyliLmluZGV4KQorCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX0RRQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfYnVmZmVyIGI7CisJCXN0cnVjdCBzbjljMTAyX2ZyYW1lX3QgKmY7CisJCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwkJaW50IGVyciA9IDA7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZiLCBhcmcsIHNpemVvZihiKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoYi50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fCBjYW0tPmlvIT0gSU9fTU1BUCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChsaXN0X2VtcHR5KCZjYW0tPm91dHF1ZXVlKSkgeworCQkJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PRkYpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUKKwkJCSAgICAgICggY2FtLT53YWl0X2ZyYW1lLCAKKwkJCSAgICAgICAgKCFsaXN0X2VtcHR5KCZjYW0tPm91dHF1ZXVlKSkgfHwKKwkJCSAgICAgICAgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB8fAorCQkJICAgICAgICAoY2FtLT5zdGF0ZSAmIERFVl9NSVNDT05GSUdVUkVEKSApOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQkJaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJaWYgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPnF1ZXVlX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlmID0gbGlzdF9lbnRyeShjYW0tPm91dHF1ZXVlLm5leHQsIHN0cnVjdCBzbjljMTAyX2ZyYW1lX3QsCisJCSAgICAgICAgICAgICAgIGZyYW1lKTsKKwkJbGlzdF9kZWwoY2FtLT5vdXRxdWV1ZS5uZXh0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQlmLT5zdGF0ZSA9IEZfVU5VU0VEOworCisJCW1lbWNweSgmYiwgJmYtPmJ1Ziwgc2l6ZW9mKGIpKTsKKwkJaWYgKGYtPnZtYV91c2VfY291bnQpCisJCQliLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYiwgc2l6ZW9mKGIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCVBEQkdHKCJGcmFtZSAjJWx1IGRlcXVldWVkIiwgKHVuc2lnbmVkIGxvbmcpZi0+YnVmLmluZGV4KQorCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX1NUUkVBTU9OOgorCXsKKwkJaW50IHR5cGU7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0eXBlLCBhcmcsIHNpemVvZih0eXBlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwgY2FtLT5pbyAhPSBJT19NTUFQKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGxpc3RfZW1wdHkoJmNhbS0+aW5xdWV1ZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljYW0tPnN0cmVhbSA9IFNUUkVBTV9PTjsKKworCQlEQkcoMywgIlN0cmVhbSBvbiIpCisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgorCXsKKwkJaW50IHR5cGUsIGVycjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnR5cGUsIGFyZywgc2l6ZW9mKHR5cGUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICh0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fCBjYW0tPmlvICE9IElPX01NQVApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQorCQkJaWYgKChlcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCisJCQkJcmV0dXJuIGVycjsKKworCQlzbjljMTAyX2VtcHR5X2ZyYW1lcXVldWVzKGNhbSk7CisKKwkJREJHKDMsICJTdHJlYW0gb2ZmIikKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19HX1BBUk06CisJeworCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHNwOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3AsIGFyZywgc2l6ZW9mKHNwKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoc3AudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcC5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKKwkJc3AucGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gY2FtLT5ucmVhZGJ1ZmZlcnM7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZzcCwgc2l6ZW9mKHNwKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19TX1BBUk1fT0xEOgorCWNhc2UgVklESU9DX1NfUEFSTToKKwl7CisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gc3A7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzcCwgYXJnLCBzaXplb2Yoc3ApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChzcC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNwLnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUgPSAwOworCisJCWlmIChzcC5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPT0gMCkKKwkJCXNwLnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IGNhbS0+bnJlYWRidWZmZXJzOworCisJCWlmIChzcC5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPiBTTjlDMTAyX01BWF9GUkFNRVMpCisJCQlzcC5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSBTTjlDMTAyX01BWF9GUkFNRVM7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZzcCwgc2l6ZW9mKHNwKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQljYW0tPm5yZWFkYnVmZmVycyA9IHNwLnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVyczsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19HX1NURDoKKwljYXNlIFZJRElPQ19TX1NURDoKKwljYXNlIFZJRElPQ19RVUVSWVNURDoKKwljYXNlIFZJRElPQ19FTlVNU1REOgorCWNhc2UgVklESU9DX1FVRVJZTUVOVToKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KK30KKworCitzdGF0aWMgaW50IHNuOWMxMDJfaW9jdGwoc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNhbS0+ZmlsZW9wX3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKKwkJREJHKDEsICJEZXZpY2Ugbm90IHByZXNlbnQiKQorCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgeworCQlEQkcoMSwgIlRoZSBjYW1lcmEgaXMgbWlzY29uZmlndXJlZC4gQ2xvc2UgYW5kIG9wZW4gaXQgYWdhaW4uIikKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWVyciA9IHNuOWMxMDJfaW9jdGxfdjRsMihpbm9kZSwgZmlscCwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCisJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNuOWMxMDJfZm9wcyA9IHsKKwkub3duZXIgPSAgIFRISVNfTU9EVUxFLAorCS5vcGVuID0gICAgc245YzEwMl9vcGVuLAorCS5yZWxlYXNlID0gc245YzEwMl9yZWxlYXNlLAorCS5pb2N0bCA9ICAgc245YzEwMl9pb2N0bCwKKwkucmVhZCA9ICAgIHNuOWMxMDJfcmVhZCwKKwkucG9sbCA9ICAgIHNuOWMxMDJfcG9sbCwKKwkubW1hcCA9ICAgIHNuOWMxMDJfbW1hcCwKKwkubGxzZWVrID0gIG5vX2xsc2VlaywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSXQgZXhpc3RzIGEgc2luZ2xlIGludGVyZmFjZSBvbmx5LiBXZSBkbyBub3QgbmVlZCB0byB2YWxpZGF0ZSBhbnl0aGluZy4gKi8KK3N0YXRpYyBpbnQKK3NuOWMxMDJfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlKiBpbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCogaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X25yID0gMDsKKwl1bnNpZ25lZCBpbnQgaSwgbjsKKwlpbnQgZXJyID0gMCwgcjsKKworCW4gPSBzaXplb2Yoc245YzEwMl9pZF90YWJsZSkvc2l6ZW9mKHNuOWMxMDJfaWRfdGFibGVbMF0pOworCWZvciAoaSA9IDA7IGkgPCBuLTE7IGkrKykKKwkJaWYgKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpID09IAorCQkgICAgc245YzEwMl9pZF90YWJsZVtpXS5pZFZlbmRvciAmJgorCQkgICAgbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09CisJCSAgICBzbjljMTAyX2lkX3RhYmxlW2ldLmlkUHJvZHVjdCkKKwkJCWJyZWFrOworCWlmIChpID09IG4tMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIShjYW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChjYW0sIDAsIHNpemVvZigqY2FtKSk7CisKKwljYW0tPnVzYmRldiA9IHVkZXY7CisKKwltZW1jcHkoJmNhbS0+ZGV2LCAmdWRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGRldmljZSkpOworCisJaWYgKCEoY2FtLT5jb250cm9sX2J1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCkpKSB7CisJCURCRygxLCAia21hbGxvYygpIGZhaWxlZCIpCisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJbWVtc2V0KGNhbS0+Y29udHJvbF9idWZmZXIsIDAsIDgpOworCisJaWYgKCEoY2FtLT52NGxkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKSkpIHsKKwkJREJHKDEsICJ2aWRlb19kZXZpY2VfYWxsb2MoKSBmYWlsZWQiKQorCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJaW5pdF9NVVRFWCgmY2FtLT5kZXZfc2VtKTsKKworCXIgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwMCk7CisJaWYgKHIgPCAwIHx8IHIgIT0gMHgxMCkgeworCQlEQkcoMSwgIlNvcnJ5LCB0aGlzIGlzIG5vdCBhIFNOOUMxMHggYmFzZWQgY2FtZXJhICIKKwkJICAgICAgICIodmlkL3BpZCAweCUwNFgvMHglMDRYKSIsCisJCSAgICBzbjljMTAyX2lkX3RhYmxlW2ldLmlkVmVuZG9yLHNuOWMxMDJfaWRfdGFibGVbaV0uaWRQcm9kdWN0KQorCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZhaWw7CisJfQorCisJY2FtLT5icmlkZ2UgPSAoc245YzEwMl9pZF90YWJsZVtpXS5pZFByb2R1Y3QgJiAweGZmYzApID09IDB4NjA4MCA/CisJICAgICAgICAgICAgICBCUklER0VfU045QzEwMyA6IEJSSURHRV9TTjlDMTAyOworCXN3aXRjaCAoY2FtLT5icmlkZ2UpIHsKKwljYXNlIEJSSURHRV9TTjlDMTAxOgorCWNhc2UgQlJJREdFX1NOOUMxMDI6CisJCURCRygyLCAiU045QzEwWzEyXSBQQyBDYW1lcmEgQ29udHJvbGxlciBkZXRlY3RlZCAiCisJCSAgICAgICAiKHZpZC9waWQgMHglMDRYLzB4JTA0WCkiLCBzbjljMTAyX2lkX3RhYmxlW2ldLmlkVmVuZG9yLAorCQkgICAgc245YzEwMl9pZF90YWJsZVtpXS5pZFByb2R1Y3QpCisJCWJyZWFrOworCWNhc2UgQlJJREdFX1NOOUMxMDM6CisJCURCRygyLCAiU045QzEwMyBQQyBDYW1lcmEgQ29udHJvbGxlciBkZXRlY3RlZCAiCisJCSAgICAgICAiKHZpZC9waWQgMHglMDRYLzB4JTA0WCkiLCBzbjljMTAyX2lkX3RhYmxlW2ldLmlkVmVuZG9yLAorCQkgICAgc245YzEwMl9pZF90YWJsZVtpXS5pZFByb2R1Y3QpCisJCWJyZWFrOworCX0KKworCWZvciAgKGkgPSAwOyBzbjljMTAyX3NlbnNvcl90YWJsZVtpXTsgaSsrKSB7CisJCWVyciA9IHNuOWMxMDJfc2Vuc29yX3RhYmxlW2ldKGNhbSk7CisJCWlmICghZXJyKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFlcnIgJiYgY2FtLT5zZW5zb3IpIHsKKwkJREJHKDIsICIlcyBpbWFnZSBzZW5zb3IgZGV0ZWN0ZWQiLCBjYW0tPnNlbnNvci0+bmFtZSkKKwkJREJHKDMsICJTdXBwb3J0IGZvciAlcyBtYWludGFpbmVkIGJ5ICVzIiwKKwkJICAgIGNhbS0+c2Vuc29yLT5uYW1lLCBjYW0tPnNlbnNvci0+bWFpbnRhaW5lcikKKwl9IGVsc2UgeworCQlEQkcoMSwgIk5vIHN1cHBvcnRlZCBpbWFnZSBzZW5zb3IgZGV0ZWN0ZWQiKQorCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKHNuOWMxMDJfaW5pdChjYW0pKSB7CisJCURCRygxLCAiSW5pdGlhbGl6YXRpb24gZmFpbGVkLiBJIHdpbGwgcmV0cnkgb24gb3BlbigpLiIpCisJCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7CisJfQorCisJc3RyY3B5KGNhbS0+djRsZGV2LT5uYW1lLCAiU045QzEweCBQQyBDYW1lcmEiKTsKKwljYW0tPnY0bGRldi0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljYW0tPnY0bGRldi0+dHlwZSA9IFZJRF9UWVBFX0NBUFRVUkUgfCBWSURfVFlQRV9TQ0FMRVM7CisJY2FtLT52NGxkZXYtPmhhcmR3YXJlID0gVklEX0hBUkRXQVJFX1NOOUMxMDI7CisJY2FtLT52NGxkZXYtPmZvcHMgPSAmc245YzEwMl9mb3BzOworCWNhbS0+djRsZGV2LT5taW5vciA9IHZpZGVvX25yW2Rldl9ucl07CisJY2FtLT52NGxkZXYtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKKwl2aWRlb19zZXRfZHJ2ZGF0YShjYW0tPnY0bGRldiwgY2FtKTsKKworCWRvd24oJmNhbS0+ZGV2X3NlbSk7CisKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoY2FtLT52NGxkZXYsIFZGTF9UWVBFX0dSQUJCRVIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX25yW2Rldl9ucl0pOworCWlmIChlcnIpIHsKKwkJREJHKDEsICJWNEwyIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIikKKwkJaWYgKGVyciA9PSAtRU5GSUxFICYmIHZpZGVvX25yW2Rldl9ucl0gPT0gLTEpCisJCQlEQkcoMSwgIkZyZWUgL2Rldi92aWRlb1ggbm9kZSBub3QgZm91bmQiKQorCQl2aWRlb19ucltkZXZfbnJdID0gLTE7CisJCWRldl9uciA9IChkZXZfbnIgPCBTTjlDMTAyX01BWF9ERVZJQ0VTLTEpID8gZGV2X25yKzEgOiAwOworCQl1cCgmY2FtLT5kZXZfc2VtKTsKKwkJZ290byBmYWlsOworCX0KKworCURCRygyLCAiVjRMMiBkZXZpY2UgcmVnaXN0ZXJlZCBhcyAvZGV2L3ZpZGVvJWQiLCBjYW0tPnY0bGRldi0+bWlub3IpCisKKwljYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXAgPSBmb3JjZV9tdW5tYXBbZGV2X25yXTsKKworCWRldl9uciA9IChkZXZfbnIgPCBTTjlDMTAyX01BWF9ERVZJQ0VTLTEpID8gZGV2X25yKzEgOiAwOworCisJc245YzEwMl9jcmVhdGVfc3lzZnMoY2FtKTsKKwlEQkcoMiwgIk9wdGlvbmFsIGRldmljZSBjb250cm9sIHRocm91Z2ggJ3N5c2ZzJyBpbnRlcmZhY2UgcmVhZHkiKQorCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBjYW0pOworCisJdXAoJmNhbS0+ZGV2X3NlbSk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlpZiAoY2FtKSB7CisJCWtmcmVlKGNhbS0+Y29udHJvbF9idWZmZXIpOworCQlpZiAoY2FtLT52NGxkZXYpCisJCQl2aWRlb19kZXZpY2VfcmVsZWFzZShjYW0tPnY0bGRldik7CisJCWtmcmVlKGNhbSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHZvaWQgc245YzEwMl91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSogaW50ZikKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlpZiAoIWNhbSkKKwkJcmV0dXJuOworCisJZG93bl93cml0ZSgmc245YzEwMl9kaXNjb25uZWN0KTsKKworCWRvd24oJmNhbS0+ZGV2X3NlbSk7IAorCisJREJHKDIsICJEaXNjb25uZWN0aW5nICVzLi4uIiwgY2FtLT52NGxkZXYtPm5hbWUpCisKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZjYW0tPm9wZW4pOworCisJaWYgKGNhbS0+dXNlcnMpIHsKKwkJREJHKDIsICJEZXZpY2UgL2Rldi92aWRlbyVkIGlzIG9wZW4hIERlcmVnaXN0cmF0aW9uIGFuZCAiCisJCSAgICAgICAibWVtb3J5IGRlYWxsb2NhdGlvbiBhcmUgZGVmZXJyZWQgb24gY2xvc2UuIiwKKwkJICAgIGNhbS0+djRsZGV2LT5taW5vcikKKwkJY2FtLT5zdGF0ZSB8PSBERVZfTUlTQ09ORklHVVJFRDsKKwkJc245YzEwMl9zdG9wX3RyYW5zZmVyKGNhbSk7CisJCWNhbS0+c3RhdGUgfD0gREVWX0RJU0NPTk5FQ1RFRDsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYW0tPndhaXRfZnJhbWUpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhbS0+d2FpdF9zdHJlYW0pOworCX0gZWxzZSB7CisJCWNhbS0+c3RhdGUgfD0gREVWX0RJU0NPTk5FQ1RFRDsKKwkJc245YzEwMl9yZWxlYXNlX3Jlc291cmNlcyhjYW0pOworCX0KKworCXVwKCZjYW0tPmRldl9zZW0pOworCisJaWYgKCFjYW0tPnVzZXJzKQorCQlrZnJlZShjYW0pOworCisJdXBfd3JpdGUoJnNuOWMxMDJfZGlzY29ubmVjdCk7Cit9CisKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNuOWMxMDJfdXNiX2RyaXZlciA9IHsKKwkub3duZXIgPSAgICAgIFRISVNfTU9EVUxFLAorCS5uYW1lID0gICAgICAgInNuOWMxMDIiLAorCS5pZF90YWJsZSA9ICAgc245YzEwMl9pZF90YWJsZSwKKwkucHJvYmUgPSAgICAgIHNuOWMxMDJfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gc245YzEwMl91c2JfZGlzY29ubmVjdCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2luaXQgc245YzEwMl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSAwOworCisJS0RCRygyLCBTTjlDMTAyX01PRFVMRV9OQU1FICIgdiIgU045QzEwMl9NT0RVTEVfVkVSU0lPTikKKwlLREJHKDMsIFNOOUMxMDJfTU9EVUxFX0FVVEhPUikKKworCWlmICgoZXJyID0gdXNiX3JlZ2lzdGVyKCZzbjljMTAyX3VzYl9kcml2ZXIpKSkKKwkJS0RCRygxLCAidXNiX3JlZ2lzdGVyKCkgZmFpbGVkIikKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHNuOWMxMDJfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmc245YzEwMl91c2JfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChzbjljMTAyX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHNuOWMxMDJfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9odjcxMzFkLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX2h2NzEzMWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODA3MGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9odjcxMzFkLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBsdWctaW4gZm9yIEhWNzEzMUQgaW1hZ2Ugc2Vuc29yIGNvbm5lY3RlZCB0byB0aGUgU045QzEweCBQQyBDYW1lcmEgICAgICoKKyAqIENvbnRyb2xsZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzbjljMTAyX3NlbnNvci5oIgorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgaHY3MTMxZDsKKworCitzdGF0aWMgaW50IGh2NzEzMWRfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTApOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTQpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NjAsIDB4MTcpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGUsIDB4MTgpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZjIsIDB4MTkpOworCisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMSwgMHgwNCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMiwgMHgwMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyOCwgMHgwMCk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgaHY3MTMxZF9nZXRfY3RybChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJeworCQkJaW50IHIxID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MjYpLAorCQkJICAgIHIyID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MjcpOworCQkJaWYgKHIxIDwgMCB8fCByMiA8IDApCisJCQkJcmV0dXJuIC1FSU87CisJCQljdHJsLT52YWx1ZSA9IChyMSA8PCA4KSB8IChyMiAmIDB4ZmYpOworCQl9CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMSkpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSA9IDB4M2YgLSAoY3RybC0+dmFsdWUgJiAweDNmKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMykpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSA9IDB4M2YgLSAoY3RybC0+dmFsdWUgJiAweDNmKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzMikpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSA9IDB4M2YgLSAoY3RybC0+dmFsdWUgJiAweDNmKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX1JFU0VUX0xFVkVMOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzApKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgJj0gMHgzZjsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX1BJWEVMX0JJQVNfVk9MVEFHRToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDM0KSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlICY9IDB4MDc7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworCitzdGF0aWMgaW50IGh2NzEzMWRfc2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyNiwgY3RybC0+dmFsdWUgPj4gOCk7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjcsIGN0cmwtPnZhbHVlICYgMHhmZik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzEsIDB4M2YgLSBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDMzLCAweDNmIC0gY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgzMiwgMHgzZiAtIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX1JFU0VUX0xFVkVMOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDMwLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9QSVhFTF9CSUFTX1ZPTFRBR0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzQsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQgaHY3MTMxZF9zZXRfY3JvcChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcmVjdCogcmVjdCkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSAmaHY3MTMxZDsKKwlpbnQgZXJyID0gMDsKKwl1OCBoX3N0YXJ0ID0gKHU4KShyZWN0LT5sZWZ0IC0gcy0+Y3JvcGNhcC5ib3VuZHMubGVmdCkgKyAyLAorCSAgIHZfc3RhcnQgPSAodTgpKHJlY3QtPnRvcCAtIHMtPmNyb3BjYXAuYm91bmRzLnRvcCkgKyAyOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgaF9zdGFydCwgMHgxMik7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgdl9zdGFydCwgMHgxMyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgaHY3MTMxZF9zZXRfcGl4X2Zvcm1hdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4KQoreworCWludCBlcnIgPSAwOworCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDIsIDB4MTkpOworCWVsc2UKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhmMiwgMHgxOSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgaHY3MTMxZCA9IHsKKwkubmFtZSA9ICJIVjcxMzFEIiwKKwkubWFpbnRhaW5lciA9ICJMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+IiwKKwkuc3lzZnNfb3BzID0gU045QzEwMl9JMkNfUkVBRCB8IFNOOUMxMDJfSTJDX1dSSVRFLAorCS5mcmVxdWVuY3kgPSBTTjlDMTAyX0kyQ18xMDBLSFosCisJLmludGVyZmFjZSA9IFNOOUMxMDJfSTJDXzJXSVJFUywKKwkuaTJjX3NsYXZlX2lkID0gMHgxMSwKKwkuaW5pdCA9ICZodjcxMzFkX2luaXQsCisJLnFjdHJsID0geworCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9FWFBPU1VSRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImV4cG9zdXJlIiwKKwkJCS5taW5pbXVtID0gMHgwMjUwLAorCQkJLm1heGltdW0gPSAweGZmZmYsCisJCQkuc3RlcCA9IDB4MDAwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMjUwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJyZWQgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4M2YsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJibHVlIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDNmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDIwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZ3JlZW4gYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4M2YsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MWUsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX1JFU0VUX0xFVkVMLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAicmVzZXQgbGV2ZWwiLAorCQkJLm1pbmltdW0gPSAweDE5LAorCQkJLm1heGltdW0gPSAweDNmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDMwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gU045QzEwMl9WNEwyX0NJRF9QSVhFTF9CSUFTX1ZPTFRBR0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJwaXhlbCBiaWFzIHZvbHRhZ2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDA3LAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAyLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwl9LAorCS5nZXRfY3RybCA9ICZodjcxMzFkX2dldF9jdHJsLAorCS5zZXRfY3RybCA9ICZodjcxMzFkX3NldF9jdHJsLAorCS5jcm9wY2FwID0geworCQkuYm91bmRzID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCQkuZGVmcmVjdCA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gNjQwLAorCQkJLmhlaWdodCA9IDQ4MCwKKwkJfSwKKwl9LAorCS5zZXRfY3JvcCA9ICZodjcxMzFkX3NldF9jcm9wLAorCS5waXhfZm9ybWF0ID0geworCQkud2lkdGggPSA2NDAsCisJCS5oZWlnaHQgPSA0ODAsCisJCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCS5wcml2ID0gOCwKKwl9LAorCS5zZXRfcGl4X2Zvcm1hdCA9ICZodjcxMzFkX3NldF9waXhfZm9ybWF0Cit9OworCisKK2ludCBzbjljMTAyX3Byb2JlX2h2NzEzMWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJaW50IHIwID0gMCwgcjEgPSAwLCBlcnIgPSAwOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMSwgMHgwMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgwMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyOCwgMHgxNyk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU87CisKKwlyMCA9IHNuOWMxMDJfaTJjX3RyeV9yZWFkKGNhbSwgJmh2NzEzMWQsIDB4MDApOworCXIxID0gc245YzEwMl9pMmNfdHJ5X3JlYWQoY2FtLCAmaHY3MTMxZCwgMHgwMSk7CisJaWYgKHIwIDwgMCB8fCByMSA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKHIwICE9IDB4MDAgJiYgcjEgIT0gMHgwNCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzbjljMTAyX2F0dGFjaF9zZW5zb3IoY2FtLCAmaHY3MTMxZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfbWkwMzQzLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX21pMDM0My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Njc2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX21pMDM0My5jCkBAIC0wLDAgKzEsMzYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbHVnLWluIGZvciBNSS0wMzQzIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxMHggUEMgQ2FtZXJhICAgICAqCisgKiBDb250cm9sbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIG1pMDM0MzsKK3N0YXRpYyB1OCBtaTAzNDNfaTJjX2RhdGFbNSsxXTsKKworCitzdGF0aWMgaW50IG1pMDM0M19pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxMCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwYSwgMHgxNCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg0MCwgMHgwMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgxNyk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwNywgMHgxOCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhhMCwgMHgxOSk7CisKKwllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZCwgMHgwMCwgMHgwMSwgMCwgMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQsIDB4MDAsIDB4MDAsIDAsIDApOworCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzLCAweDAxLCAweGUxLCAwLCAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCwgMHgwMiwgMHg4MSwgMCwgMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUsIDB4MDAsIDB4MTcsIDAsIDApOworCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAweDAwLCAweDExLCAwLCAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MiwgMHgwNCwgMHg5YSwgMCwgMCk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgbWkwMzQzX2dldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCAmbWkwMzQzLCBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksIDIrMSwgbWkwMzQzX2kyY19kYXRhKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgPSBtaTAzNDNfaTJjX2RhdGFbMl07CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNDMsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNSwgMisxLCBtaTAzNDNfaTJjX2RhdGEpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0hGTElQOgorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgJm1pMDM0MywgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwLCAyKzEsIG1pMDM0M19pMmNfZGF0YSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gbWkwMzQzX2kyY19kYXRhWzNdICYgMHgyMCA/IDEgOiAwOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgJm1pMDM0MywgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwLCAyKzEsIG1pMDM0M19pMmNfZGF0YSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gbWkwMzQzX2kyY19kYXRhWzNdICYgMHg4MCA/IDEgOiAwOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgJm1pMDM0MywgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJkLCAyKzEsIG1pMDM0M19pMmNfZGF0YSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgJm1pMDM0MywgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJjLCAyKzEsIG1pMDM0M19pMmNfZGF0YSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgJm1pMDM0MywgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJlLCAyKzEsIG1pMDM0M19pMmNfZGF0YSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKKwkJY3RybC0+dmFsdWUgPSBtaTAzNDNfaTJjX2RhdGFbM10gfCAobWkwMzQzX2kyY19kYXRhWzJdIDw8IDgpOworCQlpZiAoY3RybC0+dmFsdWUgPj0gMHgxMCAmJiBjdHJsLT52YWx1ZSA8PSAweDNmKQorCQkJY3RybC0+dmFsdWUgLT0gMHgxMDsKKwkJZWxzZSBpZiAoY3RybC0+dmFsdWUgPj0gMHg2MCAmJiBjdHJsLT52YWx1ZSA8PSAweDdmKQorCQkJY3RybC0+dmFsdWUgLT0gMHg2MDsKKwkJZWxzZSBpZiAoY3RybC0+dmFsdWUgPj0gMHhlMCAmJiBjdHJsLT52YWx1ZSA8PSAweGZmKQorCQkJY3RybC0+dmFsdWUgLT0gMHhlMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG1pMDM0M19zZXRfY3RybChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQoreworCXUxNiByZWcgPSAwOworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgorCQlpZiAoY3RybC0+dmFsdWUgPD0gKDB4M2YtMHgxMCkpCisJCQlyZWcgPSAweDEwICsgY3RybC0+dmFsdWU7CisJCWVsc2UgaWYgKGN0cmwtPnZhbHVlIDw9ICgoMHgzZi0weDEwKSArICgweDdmLTB4NjApKSkKKwkJCXJlZyA9IDB4NjAgKyAoY3RybC0+dmFsdWUgLSAoMHgzZi0weDEwKSk7CisJCWVsc2UKKwkJCXJlZyA9IDB4ZTAgKyAoY3RybC0+dmFsdWUgLSAoMHgzZi0weDEwKSAtICgweDdmLTB4NjApKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwgY3RybC0+dmFsdWUsIDB4MDAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNSwgcmVnID4+IDgsIHJlZyAmIDB4ZmYsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0hGTElQOgorCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAsIGN0cmwtPnZhbHVlID8gMHg0MDoweDAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsLT52YWx1ZSA/IDB4MjA6MHgwMCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfVkZMSVA6CisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCwgY3RybC0+dmFsdWUgPyAweDgwOjB4MDAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwtPnZhbHVlID8gMHg4MDoweDAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJkLCByZWcgPj4gOCwgcmVnICYgMHhmZiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmMsIHJlZyA+PiA4LCByZWcgJiAweGZmLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyYiwgcmVnID4+IDgsIHJlZyAmIDB4ZmYsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmUsIHJlZyA+PiA4LCByZWcgJiAweGZmLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQgbWkwMzQzX3NldF9jcm9wKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9yZWN0KiByZWN0KQoreworCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9ICZtaTAzNDM7CisJaW50IGVyciA9IDA7CisJdTggaF9zdGFydCA9ICh1OCkocmVjdC0+bGVmdCAtIHMtPmNyb3BjYXAuYm91bmRzLmxlZnQpICsgMCwKKwkgICB2X3N0YXJ0ID0gKHU4KShyZWN0LT50b3AgLSBzLT5jcm9wY2FwLmJvdW5kcy50b3ApICsgMjsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIGhfc3RhcnQsIDB4MTIpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHZfc3RhcnQsIDB4MTMpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IG1pMDM0M19zZXRfcGl4X2Zvcm1hdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KiBwaXgpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocGl4LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCkgeworCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEsIDB4MDAsIDB4MDMsIDAsIDApOworCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDE5KTsKKwl9IGVsc2UgeworCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEsIDB4MDAsIDB4MDUsIDAsIDApOworCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGEwLCAweDE5KTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgbWkwMzQzID0geworCS5uYW1lID0gIk1JLTAzNDMiLAorCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAorCS5mcmVxdWVuY3kgPSBTTjlDMTAyX0kyQ18xMDBLSFosCisJLmludGVyZmFjZSA9IFNOOUMxMDJfSTJDXzJXSVJFUywKKwkuaTJjX3NsYXZlX2lkID0gMHg1ZCwKKwkuaW5pdCA9ICZtaTAzNDNfaW5pdCwKKwkucWN0cmwgPSB7CisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZXhwb3N1cmUiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDBmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDA2LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfR0FJTiwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImdsb2JhbCBnYWluIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gKDB4M2YtMHgxMCkrKDB4N2YtMHg2MCkrKDB4ZmYtMHhlMCksLyoweDZkKi8KKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0hGTElQLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkJLm5hbWUgPSAiaG9yaXpvbnRhbCBtaXJyb3IiLAorCQkJLm1pbmltdW0gPSAwLAorCQkJLm1heGltdW0gPSAxLAorCQkJLnN0ZXAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfVkZMSVAsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSA9ICJ2ZXJ0aWNhbCBtaXJyb3IiLAorCQkJLm1pbmltdW0gPSAwLAorCQkJLm1heGltdW0gPSAxLAorCQkJLnN0ZXAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJyZWQgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9ICgweDNmLTB4MTApKygweDdmLTB4NjApKygweGZmLTB4ZTApLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiYmx1ZSBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gKDB4M2YtMHgxMCkrKDB4N2YtMHg2MCkrKDB4ZmYtMHhlMCksCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJncmVlbiBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gKCgweDNmLTB4MTApKygweDdmLTB4NjApKygweGZmLTB4ZTApKSwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJfSwKKwkuZ2V0X2N0cmwgPSAmbWkwMzQzX2dldF9jdHJsLAorCS5zZXRfY3RybCA9ICZtaTAzNDNfc2V0X2N0cmwsCisJLmNyb3BjYXAgPSB7CisJCS5ib3VuZHMgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJCS5kZWZyZWN0ID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCX0sCisJLnNldF9jcm9wID0gJm1pMDM0M19zZXRfY3JvcCwKKwkucGl4X2Zvcm1hdCA9IHsKKwkJLndpZHRoID0gNjQwLAorCQkuaGVpZ2h0ID0gNDgwLAorCQkucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfU0JHR1I4LAorCQkucHJpdiA9IDgsCisJfSwKKwkuc2V0X3BpeF9mb3JtYXQgPSAmbWkwMzQzX3NldF9waXhfZm9ybWF0Cit9OworCisKK2ludCBzbjljMTAyX3Byb2JlX21pMDM0MyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjgsIDB4MTcpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCisJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNDMsIG1pMDM0My5pMmNfc2xhdmVfaWQsIDB4MDAsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBtaTAzNDNfaTJjX2RhdGEpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAobWkwMzQzX2kyY19kYXRhWzRdICE9IDB4MzIgJiYgbWkwMzQzX2kyY19kYXRhWzNdICE9IDB4ZTMpCisJCXJldHVybiAtRU5PREVWOworCisJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJm1pMDM0Myk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfcGFzMTA2Yi5jIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9wYXMxMDZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhlM2VjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfcGFzMTA2Yi5jCkBAIC0wLDAgKzEsMzA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbHVnLWluIGZvciBQQVMxMDZCIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxMHggUEMgQ2FtZXJhICAgICAqCisgKiBDb250cm9sbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJzbjljMTAyX3NlbnNvci5oIgorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgcGFzMTA2YjsKKworCitzdGF0aWMgaW50IHBhczEwNmJfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTApOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTQpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTcpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTkpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDksIDB4MTgpOworCisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMiwgMHgwYyk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNSwgMHg1YSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNiwgMHg4OCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNywgMHg4MCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMCwgMHgwNik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMSwgMHgwNik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMiwgMHgwMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNCwgMHgwMik7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMywgMHgwMSk7CisKKwltc2xlZXAoNDAwKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBwYXMxMDZiX2dldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQoreworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQl7CisJCQlpbnQgcjEgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwMyksCisJCQkgICAgcjIgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwNCk7CisJCQlpZiAocjEgPCAwIHx8IHIyIDwgMCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWN0cmwtPnZhbHVlID0gKHIxIDw8IDQpIHwgKHIyICYgMHgwZik7CisJCX0KKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBjKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlICY9IDB4MWY7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDkpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgJj0gMHgxZjsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGUpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgJj0gMHgxZjsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBmKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlICY9IDB4MDc7CisJCXJldHVybiAwOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MGEpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgPSAoY3RybC0+dmFsdWUgJiAweDFmKSA8PCAxOworCQlyZXR1cm4gMDsKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfREFDX01BR05JVFVERToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA4KSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlICY9IDB4Zjg7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworCitzdGF0aWMgaW50IHBhczEwNmJfc2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMywgY3RybC0+dmFsdWUgPj4gNCk7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDQsIGN0cmwtPnZhbHVlICYgMHgwZik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MGMsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDksIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBlLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MGYsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MGEsIGN0cmwtPnZhbHVlID4+IDEpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBiLCBjdHJsLT52YWx1ZSA+PiAxKTsKKwkJYnJlYWs7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0RBQ19NQUdOSVRVREU6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDgsIGN0cmwtPnZhbHVlIDw8IDMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMywgMHgwMSk7CisKKwlyZXR1cm4gZXJyID8gLUVJTyA6IDA7Cit9CisKKworc3RhdGljIGludCBwYXMxMDZiX3NldF9jcm9wKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9yZWN0KiByZWN0KQoreworCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9ICZwYXMxMDZiOworCWludCBlcnIgPSAwOworCXU4IGhfc3RhcnQgPSAodTgpKHJlY3QtPmxlZnQgLSBzLT5jcm9wY2FwLmJvdW5kcy5sZWZ0KSArIDQsCisJICAgdl9zdGFydCA9ICh1OCkocmVjdC0+dG9wIC0gcy0+Y3JvcGNhcC5ib3VuZHMudG9wKSArIDM7CisKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBoX3N0YXJ0LCAweDEyKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCB2X3N0YXJ0LCAweDEzKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBwYXMxMDZiX3NldF9waXhfZm9ybWF0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KiBwaXgpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocGl4LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCkKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyYywgMHgxNyk7CisJZWxzZQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDE3KTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBwYXMxMDZiID0geworCS5uYW1lID0gIlBBUzEwNkIiLAorCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAorCS5zeXNmc19vcHMgPSBTTjlDMTAyX0kyQ19SRUFEIHwgU045QzEwMl9JMkNfV1JJVEUsCisJLmZyZXF1ZW5jeSA9IFNOOUMxMDJfSTJDXzQwMEtIWiB8IFNOOUMxMDJfSTJDXzEwMEtIWiwKKwkuaW50ZXJmYWNlID0gU045QzEwMl9JMkNfMldJUkVTLAorCS5pMmNfc2xhdmVfaWQgPSAweDQwLAorCS5pbml0ID0gJnBhczEwNmJfaW5pdCwKKwkucWN0cmwgPSB7CisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZXhwb3N1cmUiLAorCQkJLm1pbmltdW0gPSAweDEyNSwKKwkJCS5tYXhpbXVtID0gMHhmZmYsCisJCQkuc3RlcCA9IDB4MDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDE0MCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0dBSU4sCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJnbG9iYWwgZ2FpbiIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MWYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MGQsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImNvbnRyYXN0IiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgwNywKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwgLyogMHgwMH4weDAzIGhhdmUgc2FtZSBlZmZlY3QgKi8KKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAicmVkIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDFmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDA0LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiYmx1ZSBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgxZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwNiwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImdyZWVuIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDNlLAorCQkJLnN0ZXAgPSAweDAyLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAyLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gU045QzEwMl9WNEwyX0NJRF9EQUNfTUFHTklUVURFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiREFDIG1hZ25pdHVkZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MWYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDEsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCX0sCisJLmdldF9jdHJsID0gJnBhczEwNmJfZ2V0X2N0cmwsCisJLnNldF9jdHJsID0gJnBhczEwNmJfc2V0X2N0cmwsCisJLmNyb3BjYXAgPSB7CisJCS5ib3VuZHMgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDM1MiwKKwkJCS5oZWlnaHQgPSAyODgsCisJCX0sCisJCS5kZWZyZWN0ID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSAzNTIsCisJCQkuaGVpZ2h0ID0gMjg4LAorCQl9LAorCX0sCisJLnNldF9jcm9wID0gJnBhczEwNmJfc2V0X2Nyb3AsCisJLnBpeF9mb3JtYXQgPSB7CisJCS53aWR0aCA9IDM1MiwKKwkJLmhlaWdodCA9IDI4OCwKKwkJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NCR0dSOCwKKwkJLnByaXYgPSA4LCAvKiB3ZSB1c2UgdGhpcyBmaWVsZCBhcyAnYml0cyBwZXIgcGl4ZWwnICovCisJfSwKKwkuc2V0X3BpeF9mb3JtYXQgPSAmcGFzMTA2Yl9zZXRfcGl4X2Zvcm1hdAorfTsKKworCitpbnQgc245YzEwMl9wcm9iZV9wYXMxMDZiKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCByMCA9IDAsIHIxID0gMCwgZXJyID0gMDsKKwl1bnNpZ25lZCBpbnQgcGlkID0gMDsKKworCS8qCisJICAgTWluaW1hbCBpbml0aWFsaXphdGlvbiB0byBlbmFibGUgdGhlIEkyQyBjb21tdW5pY2F0aW9uCisJICAgTk9URTogZG8gTk9UIGNoYW5nZSB0aGUgdmFsdWVzIQorCSovCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMSwgMHgwMSk7IC8qIHNlbnNvciBwb3dlciBkb3duICovCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgwMSk7IC8qIHNlbnNvciBwb3dlciBvbiAqLworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjgsIDB4MTcpOyAvKiBzZW5zb3IgY2xvY2sgYXQgMjQgTUh6ICovCisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU87CisKKwlyMCA9IHNuOWMxMDJfaTJjX3RyeV9yZWFkKGNhbSwgJnBhczEwNmIsIDB4MDApOworCXIxID0gc245YzEwMl9pMmNfdHJ5X3JlYWQoY2FtLCAmcGFzMTA2YiwgMHgwMSk7CisKKwlpZiAocjAgPCAwIHx8IHIxIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlwaWQgPSAocjAgPDwgMTEpIHwgKChyMSAmIDB4ZjApID4+IDQpOworCWlmIChwaWQgIT0gMHgwMDcpCisJCXJldHVybiAtRU5PREVWOworCisJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJnBhczEwNmIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3BhczIwMmJjYi5jIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9wYXMyMDJiY2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2E1NGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9wYXMyMDJiY2IuYwpAQCAtMCwwICsxLDI5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGx1Zy1pbiBmb3IgUEFTMjAyQkNCIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxMHggUEMgQ2FtZXJhICAgKgorICogQ29udHJvbGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IENhcmxvcyBFZHVhcmRvIE1lZGFnbGlhIER5b25pc2lvICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgIDxtZWRhZ2xpYUB1bmRsLm9yZy5icj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9jYWR1LmhvbWVsaW51eC5jb206ODA4MC8gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogREFDIE1hZ25pdHVkZSwgZXhwb3N1cmUgYW5kIGdyZWVuIGdhaW4gY29udHJvbHMgYWRkZWQgYnkgICAgICAgICAgICAgICAgKgorICogTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHBhczIwMmJjYjsKKworCitzdGF0aWMgaW50IHBhczIwMmJjYl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxMCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxNCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgxNyk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgzMCwgMHgxOSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwOSwgMHgxOCk7CisKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDAyLCAweDE0KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDAzLCAweDQwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBkLCAweDJjKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBlLCAweDAxKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBmLCAweGE5KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEwLCAweDA4KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEzLCAweDYzKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE1LCAweDcwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDExLCAweDAxKTsKKworCW1zbGVlcCg0MDApOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHBhczIwMmJjYl9nZXRfY3RybChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQoreworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQl7CisJCQlpbnQgcjEgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwNCksCisJCQkgICAgcjIgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwNSk7CisJCQlpZiAocjEgPCAwIHx8IHIyIDwgMCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWN0cmwtPnZhbHVlID0gKHIxIDw8IDYpIHwgKHIyICYgMHgzZik7CisJCX0KKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA5KSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlICY9IDB4MGY7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDcpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgJj0gMHgwZjsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTApKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgJj0gMHgxZjsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOCkpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSAmPSAweDBmOworCQlyZXR1cm4gMDsKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfREFDX01BR05JVFVERToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBjKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworCitzdGF0aWMgaW50IHBhczIwMmJjYl9zZXRfcGl4X2Zvcm1hdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KiBwaXgpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocGl4LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCkKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyNCwgMHgxNyk7CisJZWxzZQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDE3KTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBwYXMyMDJiY2Jfc2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA0LCBjdHJsLT52YWx1ZSA+PiA2KTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNSwgY3RybC0+dmFsdWUgJiAweDNmKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwOSwgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNywgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTAsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDgsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0RBQ19NQUdOSVRVREU6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MGMsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTEsIDB4MDEpOworCisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQgcGFzMjAyYmNiX3NldF9jcm9wKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3JlY3QqIHJlY3QpCit7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gJnBhczIwMmJjYjsKKwlpbnQgZXJyID0gMDsKKwl1OCBoX3N0YXJ0ID0gKHU4KShyZWN0LT5sZWZ0IC0gcy0+Y3JvcGNhcC5ib3VuZHMubGVmdCkgKyA0LAorCSAgIHZfc3RhcnQgPSAodTgpKHJlY3QtPnRvcCAtIHMtPmNyb3BjYXAuYm91bmRzLnRvcCkgKyAzOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgaF9zdGFydCwgMHgxMik7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgdl9zdGFydCwgMHgxMyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgcGFzMjAyYmNiID0geworCS5uYW1lID0gIlBBUzIwMkJDQiIsCisJLm1haW50YWluZXIgPSAiQ2FybG9zIEVkdWFyZG8gTWVkYWdsaWEgRHlvbmlzaW8gIgorCSAgICAgICAgICAgICAgIjxtZWRhZ2xpYUB1bmRsLm9yZy5icj4iLAorCS5zeXNmc19vcHMgPSBTTjlDMTAyX0kyQ19SRUFEIHwgU045QzEwMl9JMkNfV1JJVEUsCisJLmZyZXF1ZW5jeSA9IFNOOUMxMDJfSTJDXzQwMEtIWiB8IFNOOUMxMDJfSTJDXzEwMEtIWiwKKwkuaW50ZXJmYWNlID0gU045QzEwMl9JMkNfMldJUkVTLAorCS5pMmNfc2xhdmVfaWQgPSAweDQwLAorCS5pbml0ID0gJnBhczIwMmJjYl9pbml0LAorCS5xY3RybCA9IHsKKwkJeworCQkJLmlkID0gVjRMMl9DSURfRVhQT1NVUkUsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJleHBvc3VyZSIsCisJCQkubWluaW11bSA9IDB4MDFlNSwKKwkJCS5tYXhpbXVtID0gMHgzZmZmLAorCQkJLnN0ZXAgPSAweDAwMDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDFlNSwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0dBSU4sCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJnbG9iYWwgZ2FpbiIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MWYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MGMsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gInJlZCBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgwZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMSwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImJsdWUgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MGYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDUsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJncmVlbiBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgwZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFNOOUMxMDJfVjRMMl9DSURfREFDX01BR05JVFVERSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gIkRBQyBtYWduaXR1ZGUiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweGZmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDA0LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwl9LAorCS5nZXRfY3RybCA9ICZwYXMyMDJiY2JfZ2V0X2N0cmwsCisJLnNldF9jdHJsID0gJnBhczIwMmJjYl9zZXRfY3RybCwKKwkuY3JvcGNhcCA9IHsKKwkJLmJvdW5kcyA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gNjQwLAorCQkJLmhlaWdodCA9IDQ4MCwKKwkJfSwKKwkJLmRlZnJlY3QgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJfSwKKwkuc2V0X2Nyb3AgPSAmcGFzMjAyYmNiX3NldF9jcm9wLAorCS5waXhfZm9ybWF0ID0geworCQkud2lkdGggPSA2NDAsCisJCS5oZWlnaHQgPSA0ODAsCisJCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCS5wcml2ID0gOCwKKwl9LAorCS5zZXRfcGl4X2Zvcm1hdCA9ICZwYXMyMDJiY2Jfc2V0X3BpeF9mb3JtYXQKK307CisKKworaW50IHNuOWMxMDJfcHJvYmVfcGFzMjAyYmNiKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreyAgICAgICAKKwlpbnQgcjAgPSAwLCByMSA9IDAsIGVyciA9IDA7CisJdW5zaWduZWQgaW50IHBpZCA9IDA7CisKKwkvKgorCSAqICBNaW5pbWFsIGluaXRpYWxpemF0aW9uIHRvIGVuYWJsZSB0aGUgSTJDIGNvbW11bmljYXRpb24KKwkgKiAgTk9URTogZG8gTk9UIGNoYW5nZSB0aGUgdmFsdWVzIQorCSAqLworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOyAvKiBzZW5zb3IgcG93ZXIgZG93biAqLworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDAsIDB4MDEpOyAvKiBzZW5zb3IgcG93ZXIgb24gKi8KKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDI4LCAweDE3KTsgLyogc2Vuc29yIGNsb2NrIGF0IDI0IE1IeiAqLworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCisJcjAgPSBzbjljMTAyX2kyY190cnlfcmVhZChjYW0sICZwYXMyMDJiY2IsIDB4MDApOworCXIxID0gc245YzEwMl9pMmNfdHJ5X3JlYWQoY2FtLCAmcGFzMjAyYmNiLCAweDAxKTsKKworCWlmIChyMCA8IDAgfHwgcjEgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXBpZCA9IChyMCA8PCA0KSB8ICgocjEgJiAweGYwKSA+PiA0KTsKKwlpZiAocGlkICE9IDB4MDE3KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNuOWMxMDJfYXR0YWNoX3NlbnNvcihjYW0sICZwYXMyMDJiY2IpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3NlbnNvci5oIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9zZW5zb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmY3NDgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9zZW5zb3IuaApAQCAtMCwwICsxLDM3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQVBJIGZvciBpbWFnZSBzZW5zb3JzIGNvbm5lY3RlZCB0byB0aGUgU045QzEweCBQQyBDYW1lcmEgQ29udHJvbGxlcnMgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU045QzEwMl9TRU5TT1JfSF8KKyNkZWZpbmUgX1NOOUMxMDJfU0VOU09SX0hfCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKK3N0cnVjdCBzbjljMTAyX2RldmljZTsKK3N0cnVjdCBzbjljMTAyX3NlbnNvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICAgT1ZFUlZJRVcuCisgICBUaGlzIGlzIGEgc21hbGwgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHlvdSB0byBhZGQgc3VwcG9ydCBmb3IgYW55IENDRC9DTU9TCisgICBpbWFnZSBzZW5zb3JzIGNvbm5lY3RlZCB0byB0aGUgU045QzEwWCBicmlkZ2VzLiBUaGUgZW50aXJlIEFQSSBpcyBkb2N1bWVudGVkCisgICBiZWxvdy4gSW4gdGhlIG1vc3QgZ2VuZXJhbCBjYXNlLCB0byBzdXBwb3J0IGEgc2Vuc29yIHRoZXJlIGFyZSB0aHJlZSBzdGVwcworICAgeW91IGhhdmUgdG8gZm9sbG93OgorICAgMSkgZGVmaW5lIHRoZSBtYWluICJzbjljMTAyX3NlbnNvciIgc3RydWN0dXJlIGJ5IHNldHRpbmcgdGhlIGJhc2ljIGZpZWxkczsKKyAgIDIpIHdyaXRlIGEgcHJvYmluZyBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgdGhlIGNvcmUgbW9kdWxlIHdoZW4gdGhlIFVTQgorICAgICAgY2FtZXJhIGlzIHJlY29nbml6ZWQsIHRoZW4gYWRkIGJvdGggdGhlIFVTQiBpZHMgYW5kIHRoZSBuYW1lIG9mIHRoYXQKKyAgICAgIGZ1bmN0aW9uIHRvIHRoZSB0d28gY29ycmVzcG9uZGluZyB0YWJsZXMgU0VOU09SX1RBQkxFIGFuZCBJRF9UQUJMRSAoc2VlCisgICAgICBiZWxvdyk7CisgICAzKSBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgdGhhdCB5b3Ugd2FudC9uZWVkIChhbmQgZmlsbCB0aGUgcmVzdCBvZiB0aGUgbWFpbgorICAgICAgc3RydWN0dXJlIGFjY29yZGluZ2x5KS4KKyAgICJzbjljMTAyX3BhczEwNmIuYyIgaXMgYW4gZXhhbXBsZSBvZiBhbGwgdGhpcyBzdHVmZi4gUmVtZW1iZXIgdGhhdCB5b3UgZG8KKyAgIE5PVCBuZWVkIHRvIHRvdWNoIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgY29yZSBtb2R1bGUgZm9yIHRoZSB0aGluZ3MgdG8gd29yaworICAgcHJvcGVybHksIHVubGVzcyB5b3UgZmluZCBidWdzIG9yIGZsYXdzIGluIGl0LiBGaW5hbGx5LCBkbyBub3QgZm9yZ2V0IHRvCisgICByZWFkIHRoZSBWNEwyIEFQSSBmb3IgY29tcGxldGVuZXNzLgorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICAgUHJvYmluZyBmdW5jdGlvbnM6IG9uIHN1Y2Nlc3MsIHlvdSBtdXN0IGF0dGFjaCB0aGUgc2Vuc29yIHRvIHRoZSBjYW1lcmEKKyAgIGJ5IGNhbGxpbmcgc245YzEwMl9hdHRhY2hfc2Vuc29yKCkgcHJvdmlkZWQgYmVsb3cuCisgICBUbyBlbmFibGUgdGhlIEkyQyBjb21tdW5pY2F0aW9uLCB5b3UgbWlnaHQgbmVlZCB0byBwZXJmb3JtIGEgcmVhbGx5IGJhc2ljCisgICBpbml0aWFsaXphdGlvbiBvZiB0aGUgU045QzEwWCBjaGlwIGJ5IHVzaW5nIHRoZSB3cml0ZSBmdW5jdGlvbiBkZWNsYXJlZCAKKyAgIGFoZWFkLgorICAgRnVuY3Rpb25zIG11c3QgcmV0dXJuIDAgb24gc3VjY2VzcywgdGhlIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS4KKyovCitleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfaHY3MTMxZChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CitleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfbWkwMzQzKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKK2V4dGVybiBpbnQgc245YzEwMl9wcm9iZV9wYXMxMDZiKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKK2V4dGVybiBpbnQgc245YzEwMl9wcm9iZV9wYXMyMDJiY2Ioc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOworZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX3RhczUxMTBjMWIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOworZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX3RhczUxMzBkMWIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOworCisvKgorICAgQWRkIHRoZSBhYm92ZSBlbnRyaWVzIHRvIHRoaXMgdGFibGUuIEJlIHN1cmUgdG8gYWRkIHRoZSBlbnRyeSBpbiB0aGUgcmlnaHQKKyAgIHBsYWNlLCBzaW5jZSwgb24gZmFpbHVyZSwgdGhlIG5leHQgcHJvYmluZyByb3V0aW5lIGlzIGNhbGxlZCBhY2NvcmRpbmcgdG8gCisgICB0aGUgb3JkZXIgb2YgdGhlIGxpc3QgYmVsb3csIGZyb20gdG9wIHRvIGJvdHRvbS4KKyovCisjZGVmaW5lIFNOOUMxMDJfU0VOU09SX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50ICgqc245YzEwMl9zZW5zb3JfdGFibGVbXSkoc3RydWN0IHNuOWMxMDJfZGV2aWNlKikgPSB7ICAgICAgICAgICAgICBcCisJJnNuOWMxMDJfcHJvYmVfbWkwMzQzLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8gICAgIFwKKwkmc245YzEwMl9wcm9iZV9wYXMxMDZiLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8gICAgXAorCSZzbjljMTAyX3Byb2JlX3BhczIwMmJjYiwgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovICBcCisJJnNuOWMxMDJfcHJvYmVfaHY3MTMxZCwgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovICAgIFwKKwkmc245YzEwMl9wcm9iZV90YXM1MTEwYzFiLCAvKiBkZXRlY3Rpb24gYmFzZWQgb24gVVNCIHBpZC92aWQgKi8gICAgICAgXAorCSZzbjljMTAyX3Byb2JlX3RhczUxMzBkMWIsIC8qIGRldGVjdGlvbiBiYXNlZCBvbiBVU0IgcGlkL3ZpZCAqLyAgICAgICBcCisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK307CisKKy8qIEF0dGFjaCBhIHByb2JlZCBzZW5zb3IgdG8gdGhlIGNhbWVyYS4gKi8KK2V4dGVybiB2b2lkIAorc245YzEwMl9hdHRhY2hfc2Vuc29yKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yKTsKKworLyogRWFjaCBTTjlDMTBYIGNhbWVyYSBoYXMgcHJvcGVyIFBJRC9WSUQgaWRlbnRpZmllcnMuIEFkZCB0aGVtIGhlcmUgaW4gY2FzZS4qLworI2RlZmluZSBTTjlDMTAyX0lEX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHNuOWMxMDJfaWRfdGFibGVbXSA9IHsgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAwMSksIH0sIC8qIFRBUzUxMTBDMUIgKi8gICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDA1KSwgfSwgLyogVEFTNTExMEMxQiAqLyAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMDkpLCB9LCAvKiBQQVMxMDZCICovICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAwZCksIH0sIC8qIFBBUzEwNkIgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDI0KSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMjUpLCB9LCAvKiBUQVM1MTMwRDFCIGFuZCBUQVM1MTEwQzFCICovICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyOCksIH0sIC8qIFBBUzIwMkJDQiAqLyAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDI5KSwgfSwgLyogUEFTMTA2QiAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMmEpLCB9LCAvKiBIVjcxMzFEICovICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyYiksIH0sIC8qIE1JLTAzNDMgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDJjKSwgfSwgLyogT1Y3NjIwICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMzApLCB9LCAvKiBNSTAzeCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjA4MCksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDgyKSwgfSwgLyogTUkwMzQzIGFuZCBNSTAzNjAgKi8gICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwODMpLCB9LCAvKiBIVjcxMzFbRHxFMV0gKi8gICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjA4OCksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDhhKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwOGIpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjA4YyksIH0sIC8qIEhWNzEzMXggKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDhlKSwgfSwgLyogQ0lTLVZGMTAgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwOGYpLCB9LCAvKiBPVjc2MzAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBhMCksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGEyKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYTMpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBhOCksIH0sIC8qIFBBUzEwNkIgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGFhKSwgfSwgLyogVEFTNTEzMEQxQiAqLyAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYWIpLCB9LCAvKiBUQVM1MTEwQzFCICovICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBhYyksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGFlKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYWYpLCB9LCAvKiBQQVMyMDJCQ0IgKi8gICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBiMCksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGIyKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYjMpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBiOCksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGJhKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYmIpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBiYyksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGJlKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICAgUmVhZC93cml0ZSByb3V0aW5lczogdGhleSBhbHdheXMgcmV0dXJuIC0xIG9uIGVycm9yLCAwIG9yIHRoZSByZWFkIHZhbHVlCisgICBvdGhlcndpc2UuIE5PVEUgdGhhdCBhIHJlYWwgcmVhZCBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgU045QzEwWAorICAgY2hpcCBmb3Igc29tZSBvZiBpdHMgcmVnaXN0ZXJzLiBUbyB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0sIGEgcHNldWRvLXJlYWQKKyAgIGNhbGwgaXMgcHJvdmlkZWQgaW5zdGVhZDogaXQgcmV0dXJucyB0aGUgbGFzdCBzdWNjZXNzZnVsbHkgd3JpdHRlbiB2YWx1ZSAKKyAgIG9uIHRoZSByZWdpc3RlciAoMCBpZiBpdCBoYXMgbmV2ZXIgYmVlbiB3cml0dGVuKSwgdGhlIHVzdWFsIC0xIG9uIGVycm9yLgorKi8KKworLyogVGhlICJ0cnkiIEkyQyBJL08gdmVyc2lvbnMgYXJlIHVzZWQgd2hlbiBwcm9iaW5nIHRoZSBzZW5zb3IgKi8KK2V4dGVybiBpbnQgc245YzEwMl9pMmNfdHJ5X3dyaXRlKHN0cnVjdCBzbjljMTAyX2RldmljZSosc3RydWN0IHNuOWMxMDJfc2Vuc29yKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MsIHU4IHZhbHVlKTsKK2V4dGVybiBpbnQgc245YzEwMl9pMmNfdHJ5X3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKixzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBhZGRyZXNzKTsKKworLyoKKyAgIFRoZXNlIG11c3QgYmUgdXNlZCBpZiBhbmQgb25seSBpZiB0aGUgc2Vuc29yIGRvZXNuJ3QgaW1wbGVtZW50IHRoZSBzdGFuZGFyZAorICAgSTJDIHByb3RvY29sLiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgZ29vZCByZWFzb25zIHdoeSB5b3UgbXVzdCB1c2UgdGhlIAorICAgc2luZ2xlLWJ5dGUgdmVyc2lvbnMgb2YgdGhlc2UgZnVuY3Rpb25zOiBkbyBub3QgYWJ1c2UuIFRoZSBmaXJzdCBmdW5jdGlvbgorICAgd3JpdGVzIG4gYnl0ZXMsIGZyb20gZGF0YTAgdG8gZGF0YW4sIHRvIHJlZ2lzdGVycyAweDA5IC0gMHgwOStuIG9mIFNOOUMxMFgKKyAgIGNoaXAuIFRoZSBzZWNvbmQgb25lIHByb2dyYW1zIHRoZSByZWdpc3RlcnMgMHgwOSBhbmQgMHgxMCB3aXRoIGRhdGEwIGFuZAorICAgZGF0YTEsIGFuZCBwbGFjZXMgdGhlIG4gYnl0ZXMgcmVhZCBmcm9tIHRoZSBzZW5zb3IgcmVnaXN0ZXIgdGFibGUgaW4gdGhlCisgICBidWZmZXIgcG9pbnRlZCBieSAnYnVmZmVyJy4gQm90aCB0aGUgZnVuY3Rpb25zIHJldHVybiAtMSBvbiBlcnJvcjsgdGhlIHdyaXRlCisgICB2ZXJzaW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLCB3aGlsZSB0aGUgcmVhZCB2ZXJzaW9uIHJldHVybnMgdGhlIGZpcnN0IHJlYWQKKyAgIGJ5dGUuCisqLworZXh0ZXJuIGludCBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yLCB1OCBuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBkYXRhMCwgdTggZGF0YTEsIHU4IGRhdGEyLCB1OCBkYXRhMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBkYXRhNCwgdTggZGF0YTUpOworZXh0ZXJuIGludCBzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvciwgdTggZGF0YTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBkYXRhMSwgdTggbiwgdTggYnVmZmVyW10pOworCisvKiBUbyBiZSB1c2VkIGFmdGVyIHRoZSBzZW5zb3Igc3RydWN0IGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBjYW1lcmEgc3RydWN0ICovCitleHRlcm4gaW50IHNuOWMxMDJfaTJjX3dyaXRlKHN0cnVjdCBzbjljMTAyX2RldmljZSosIHU4IGFkZHJlc3MsIHU4IHZhbHVlKTsKK2V4dGVybiBpbnQgc245YzEwMl9pMmNfcmVhZChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLCB1OCBhZGRyZXNzKTsKKworLyogSS9PIG9uIHJlZ2lzdGVycyBpbiB0aGUgYnJpZGdlLiBDb3VsZCBiZSB1c2VkIGJ5IHRoZSBzZW5zb3IgbWV0aG9kcyB0b28gKi8KK2V4dGVybiBpbnQgc245YzEwMl93cml0ZV9yZWcoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiwgdTggdmFsdWUsIHUxNiBpbmRleCk7CitleHRlcm4gaW50IHNuOWMxMDJfcHJlYWRfcmVnKHN0cnVjdCBzbjljMTAyX2RldmljZSosIHUxNiBpbmRleCk7CisKKy8qCisgICBOT1RFOiB0aGVyZSBhcmUgbm8gZXhwb3J0ZWQgZGVidWdnaW5nIGZ1bmN0aW9ucy4gVG8gdW5pZm9ybSB0aGUgb3V0cHV0IHlvdQorICAgbXVzdCB1c2UgdGhlIGRldl9pbmZvKCkvZGV2X3dhcm4oKS9kZXZfZXJyKCkgbWFjcm9zIGRlZmluZWQgaW4gZGV2aWNlLmgsCisgICBhbHJlYWR5IGluY2x1ZGVkIGhlcmUsIHRoZSBhcmd1bWVudCBiZWluZyB0aGUgc3RydWN0IGRldmljZSAnZGV2JyBvZiB0aGUKKyAgIHNlbnNvciBzdHJ1Y3R1cmUuIERvIE5PVCB1c2UgdGhlc2UgbWFjcm9zIGJlZm9yZSB0aGUgc2Vuc29yIGlzIGF0dGFjaGVkIG9yCisgICB0aGUga2VybmVsIHdpbGwgY3Jhc2ghIEhvd2V2ZXIsIHlvdSBzaG91bGQgbm90IG5lZWQgdG8gbm90aWZ5IHRoZSB1c2VyIGFib3V0CisgICBjb21tb24gZXJyb3JzIG9yIG90aGVyIG1lc3NhZ2VzLCBzaW5jZSB0aGlzIGlzIGRvbmUgYnkgdGhlIG1hc3RlciBtb2R1bGUuCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2VudW0gc245YzEwMl9pMmNfc3lzZnNfb3BzIHsKKwlTTjlDMTAyX0kyQ19SRUFEID0gMHgwMSwKKwlTTjlDMTAyX0kyQ19XUklURSA9IDB4MDIsCit9OworCitlbnVtIHNuOWMxMDJfaTJjX2ZyZXF1ZW5jeSB7IC8qIHNlbnNvcnMgbWF5IHN1cHBvcnQgYm90aCB0aGUgZnJlcXVlbmNpZXMgKi8KKwlTTjlDMTAyX0kyQ18xMDBLSFogPSAweDAxLAorCVNOOUMxMDJfSTJDXzQwMEtIWiA9IDB4MDIsCit9OworCitlbnVtIHNuOWMxMDJfaTJjX2ludGVyZmFjZSB7CisJU045QzEwMl9JMkNfMldJUkVTLAorCVNOOUMxMDJfSTJDXzNXSVJFUywKK307CisKK3N0cnVjdCBzbjljMTAyX3NlbnNvciB7CisJY2hhciBuYW1lWzMyXSwgLyogc2Vuc29yIG5hbWUgKi8KKwkgICAgIG1haW50YWluZXJbNjRdOyAvKiBuYW1lIG9mIHRoZSBtYW50YWluZXIgPGVtYWlsPiAqLworCisJLyogU3VwcG9ydGVkIG9wZXJhdGlvbnMgdGhyb3VnaCB0aGUgJ3N5c2ZzJyBpbnRlcmZhY2UgKi8KKwllbnVtIHNuOWMxMDJfaTJjX3N5c2ZzX29wcyBzeXNmc19vcHM7CisKKwkvKgorCSAgIFRoZXNlIHNlbnNvciBjYXBhYmlsaXRpZXMgbXVzdCBiZSBwcm92aWRlZCBpZiB0aGUgU045QzEwWCBjb250cm9sbGVyCisJICAgbmVlZHMgdG8gY29tbXVuaWNhdGUgdGhyb3VnaCB0aGUgc2Vuc29yIHNlcmlhbCBpbnRlcmZhY2UgYnkgdXNpbmcKKwkgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGkyYyBmdW5jdGlvbnMgYXZhaWxhYmxlLgorCSovCisJZW51bSBzbjljMTAyX2kyY19mcmVxdWVuY3kgZnJlcXVlbmN5OworCWVudW0gc245YzEwMl9pMmNfaW50ZXJmYWNlIGludGVyZmFjZTsKKworCS8qCisJICAgVGhpcyBpZGVudGlmaWVyIG11c3QgYmUgcHJvdmlkZWQgaWYgdGhlIGltYWdlIHNlbnNvciBpbXBsZW1lbnRzCisJICAgdGhlIHN0YW5kYXJkIEkyQyBwcm90b2NvbC4KKwkqLworCXU4IGkyY19zbGF2ZV9pZDsgLyogcmVnLiAweDA5ICovCisKKwkvKgorCSAgIE5PVEU6IFdoZXJlIG5vdCBub3RlZCxtb3N0IG9mIHRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIG5vdCBtYW5kYXRvcnkuCisJICAgICAgICAgU2V0IHRvIG51bGwgaWYgeW91IGRvIG5vdCBpbXBsZW1lbnQgdGhlbS4gSWYgaW1wbGVtZW50ZWQsCisJICAgICAgICAgdGhleSBtdXN0IHJldHVybiAwIG9uIHN1Y2Nlc3MsIHRoZSBwcm9wZXIgZXJyb3Igb3RoZXJ3aXNlLgorCSovCisKKwlpbnQgKCppbml0KShzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CisJLyoKKwkgICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBzZW5zb3IgaGFzIGJlZW4gYXR0YWNoZWQuIAorCSAgIEl0IHNob3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlbnNvciBvbmx5LCBidXQgbWF5IGFsc28KKwkgICBjb25maWd1cmUgcGFydCBvZiB0aGUgU045QzEwWCBjaGlwIGlmIG5lY2Vzc2FyeS4gWW91IGRvbid0IG5lZWQgdG8KKwkgICBzZXR1cCBwaWN0dXJlIHNldHRpbmdzIGxpa2UgYnJpZ2h0bmVzcywgY29udHJhc3QsIGV0Yy4uIGhlcmUsIGlmCisJICAgdGhlIGNvcnJpc3BvbmRpbmcgY29udHJvbHMgYXJlIGltcGxlbWVudGVkIChzZWUgYmVsb3cpLCBzaW5jZSAKKwkgICB0aGV5IGFyZSBhZGp1c3RlZCBpbiB0aGUgY29yZSBkcml2ZXIgYnkgY2FsbGluZyB0aGUgc2V0X2N0cmwoKQorCSAgIG1ldGhvZCBhZnRlciBpbml0KCksIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIHRoZSBkZWZhdWx0IHZhbHVlcworCSAgIHNwZWNpZmllZCBpbiB0aGUgdjRsMl9xdWVyeWN0cmwgbGlzdCBvZiBzdXBwb3J0ZWQgY29udHJvbHM7CisJICAgU2FtZSBzdWdnZXN0aW9ucyBhcHBseSBmb3Igb3RoZXIgc2V0dGluZ3MsIF9pZl8gdGhlIGNvcnJlc3BvbmRpbmcKKwkgICBtZXRob2RzIGFyZSBwcmVzZW50OyBpZiBub3QsIHRoZSBpbml0aWFsaXphdGlvbiBtdXN0IGNvbmZpZ3VyZSB0aGUKKwkgICBzZW5zb3IgYWNjb3JkaW5nIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlcyBiZWxvdy4KKwkqLworCisJc3RydWN0IHY0bDJfcXVlcnljdHJsIHFjdHJsW1Y0TDJfQ0lEX0xBU1RQMS1WNEwyX0NJRF9CQVNFXTsKKwkvKgorCSAgIE9wdGlvbmFsIGxpc3Qgb2YgZGVmYXVsdCBjb250cm9scywgZGVmaW5lZCBhcyBpbmRpY2F0ZWQgaW4gdGhlIAorCSAgIFY0TDIgQVBJLiBNZW51IHR5cGUgY29udHJvbHMgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoaXMgaW50ZXJmYWNlLgorCSovCisKKwlpbnQgKCpnZXRfY3RybCkoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpOworCWludCAoKnNldF9jdHJsKShzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKwkgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCk7CisJLyoKKwkgICBZb3UgbXVzdCBpbXBsZW1lbnQgYXQgbGVhc3QgdGhlIHNldF9jdHJsIG1ldGhvZCBpZiB5b3UgaGF2ZSBkZWZpbmVkCisJICAgdGhlIGxpc3QgYWJvdmUuIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGZvbGxvdyB0aGUgVjRMMgorCSAgIHNwZWNpZmljYXRpb25zIGZvciB0aGUgVklESU9DX0d8Q19DVFJMIGlvY3Rscy4gVjRMMl9DSURfSHxWQ0VOVEVSCisJICAgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsIHNvIGRvIG5vdCBpbXBsZW1lbnQgdGhlbS4gQWxzbywKKwkgICB5b3UgZG9uJ3QgaGF2ZSB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXNzZWQgdmFsdWVzIGFyZSBvdXQgb2YgYm91bmRzLAorCSAgIGdpdmVuIHRoYXQgdGhpcyBpcyBkb25lIGJ5IHRoZSBjb3JlIG1vZHVsZS4KKwkqLworCisJc3RydWN0IHY0bDJfY3JvcGNhcCBjcm9wY2FwOworCS8qCisJICAgVGhpbmsgdGhlIGltYWdlIHNlbnNvciBhcyBhIGdyaWQgb2YgUixHLEIgbW9ub2Nocm9tYXRpYyBwaXhlbHMKKwkgICBkaXNwb3NlZCBhY2NvcmRpbmcgdG8gYSBwYXJ0aWN1bGFyIEJheWVyIHBhdHRlcm4sIHdoaWNoIGRlc2NyaWJlcworCSAgIHRoZSBjb21wbGV0ZSBhcnJheSBvZiBwaXhlbHMsIGZyb20gKDAsMCkgdG8gKHhtYXgsIHltYXgpLiBXZSB3aWxsCisJICAgdXNlIHRoaXMgY29vcmRpbmF0ZSBzeXN0ZW0gZnJvbSBub3cgb24uIEl0IGlzIGFzc3VtZWQgdGhlIHNlbnNvcgorCSAgIGNoaXAgY2FuIGJlIHByb2dyYW1tZWQgdG8gY2FwdHVyZS90cmFuc21pdCBhIHN1YnNlY3Rpb24gb2YgdGhhdAorCSAgIGFycmF5IG9mIHBpeGVsczogd2Ugd2lsbCBjYWxsIHRoaXMgc3Vic2VjdGlvbiAiYWN0aXZlIHdpbmRvdyIuCisJICAgSXQgaXMgbm90IGFsd2F5cyB0cnVlIHRoYXQgdGhlIGxhcmdlc3QgYWNoaWV2YWJsZSBhY3RpdmUgd2luZG93IGNhbgorCSAgIGNvdmVyIHRoZSB3aG9sZSBhcnJheSBvZiBwaXhlbHMuIFRoZSBWNEwyIEFQSSBkZWZpbmVzIGFub3RoZXIKKwkgICBhcmVhIGNhbGxlZCAic291cmNlIHJlY3RhbmdsZSIsIHdoaWNoLCBpbiB0dXJuLCBpcyBhIHN1YnJlY3RhbmdsZSBvZgorCSAgIHRoZSBhY3RpdmUgd2luZG93LiBUaGUgU045QzEwWCBjaGlwIGlzIGFsd2F5cyBwcm9ncmFtbWVkIHRvIHJlYWQgdGhlCisJICAgc291cmNlIHJlY3RhbmdsZS4KKwkgICBUaGUgYm91bmRzIG9mIGJvdGggdGhlIGFjdGl2ZSB3aW5kb3cgYW5kIHRoZSBzb3VyY2UgcmVjdGFuZ2xlIGFyZQorCSAgIHNwZWNpZmllZCBpbiB0aGUgY3JvcGNhcCBzdWJzdHJ1Y3R1cmVzICdib3VuZHMnIGFuZCAnZGVmcmVjdCcuCisJICAgQnkgZGVmYXVsdCwgdGhlIHNvdXJjZSByZWN0YW5nbGUgc2hvdWxkIGNvdmVyIHRoZSBsYXJnZXN0IHBvc3NpYmxlCisJICAgYXJlYS4gQWdhaW4sIGl0IGlzIG5vdCBhbHdheXMgdHJ1ZSB0aGF0IHRoZSBsYXJnZXN0IHNvdXJjZSByZWN0YW5nbGUKKwkgICBjYW4gY292ZXIgdGhlIGVudGlyZSBhY3RpdmUgd2luZG93LCBhbHRob3VnaCBpdCBpcyBhIHJhcmUgY2FzZSBmb3IgCisJICAgdGhlIGhhcmR3YXJlIHdlIGhhdmUuIFRoZSBib3VuZHMgb2YgdGhlIHNvdXJjZSByZWN0YW5nbGUgX211c3RfIGJlCisJICAgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgdXNlIHRoZSBzYW1lIGNvb3JkaW5hdGUgc3lzdGVtIGFzIGluZGljYXRlZAorCSAgIGJlZm9yZTsgdGhlaXIgY2VudGVycyBzaGFsbCBhbGlnbiBpbml0aWFsbHkuCisJICAgSWYgbmVjZXNzYXJ5LCB0aGUgc2Vuc29yIGNoaXAgbXVzdCBiZSBpbml0aWFsaXplZCBkdXJpbmcgaW5pdCgpIHRvCisJICAgc2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBzZW5zb3Igd2luZG93OyBob3dldmVyLCBieSBkZWZhdWx0LCBpdAorCSAgIHVzdWFsbHkgY292ZXJzIHRoZSBsYXJnZXN0IGFjaGlldmFibGUgYXJlYSAobWF4d2lkdGggeCBtYXhoZWlnaHQpCisJICAgb2YgcGl4ZWxzLCBzbyBubyBwYXJ0aWN1bGFyIGluaXRpYWxpemF0aW9uIGlzIG5lZWRlZCwgaWYgeW91IGhhdmUKKwkgICBkZWZpbmVkIHRoZSBjb3JyZWN0IGRlZmF1bHQgYm91bmRzIGluIHRoZSBzdHJ1Y3R1cmVzLgorCSAgIFNlZSB0aGUgVjRMMiBBUEkgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKwkgICBOT1RFOiBvbmNlIHlvdSBoYXZlIGRlZmluZWQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIHdpbmRvdworCSAgICAgICAgIChzdHJ1Y3QgY3JvcGNhcC5ib3VuZHMpIHlvdSBtdXN0IG5vdCBjaGFuZ2UgdGhlbS5hbnltb3JlLgorCSAgIE9ubHkgJ2JvdW5kcycgYW5kICdkZWZyZWN0JyBmaWVsZHMgYXJlIG1hbmRhdG9yeSwgb3RoZXIgZmllbGRzCisJICAgd2lsbCBiZSBpZ25vcmVkLgorCSovCisKKwlpbnQgKCpzZXRfY3JvcCkoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisJICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3JlY3QqIHJlY3QpOworCS8qCisJICAgVG8gYmUgY2FsbGVkIG9uIFZJRElPQ19DX1NFVENST1AuIFRoZSBjb3JlIG1vZHVsZSBhbHdheXMgY2FsbHMgYQorCSAgIGRlZmF1bHQgcm91dGluZSB3aGljaCBjb25maWd1cmVzIHRoZSBhcHByb3ByaWF0ZSBTTjlDMTBYIHJlZ3MgKGFsc28KKwkgICBzY2FsaW5nKSwgYnV0IHlvdSBtYXkgbmVlZCB0byBvdmVycmlkZS9hZGp1c3Qgc3BlY2lmaWMgc3R1ZmYuCisJICAgJ3JlY3QnIGNvbnRhaW5zIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIHRoYXQgYXJlIG11bHRpcGxlIG9mIDE2OiBpbgorCSAgIGNhc2UgeW91IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZ1bmN0aW9uLCB5b3UgYWx3YXlzIGhhdmUgdG8gcHJvZ3JhbQorCSAgIHRoZSBjaGlwIHRvIG1hdGNoIHRob3NlIHZhbHVlczsgb24gZXJyb3IgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCisJICAgZXJyb3IgY29kZSB3aXRob3V0IHJvbGxpbmcgYmFjay4KKwkgICBOT1RFOiBpbiBjYXNlLCB5b3UgbXVzdCBwcm9ncmFtIHRoZSBTTjlDMTBYIGNoaXAgdG8gZ2V0IHJpZCBvZiAKKwkgICAgICAgICBibGFuayBwaXhlbHMgb3IgYmxhbmsgbGluZXMgYXQgdGhlIF9zdGFydF8gb2YgZWFjaCBsaW5lIG9yCisJICAgICAgICAgZnJhbWUgYWZ0ZXIgZWFjaCBIU1lOQyBvciBWU1lOQywgc28gdGhhdCB0aGUgaW1hZ2Ugc3RhcnRzIHdpdGgKKwkgICAgICAgICByZWFsIFJHQiBkYXRhIChzZWUgcmVncyAweDEyLCAweDEzKSAoaGF2aW5nIHNldCBIX1NJWkUgYW5kLAorCSAgICAgICAgIFZfU0laRSB5b3UgZG9uJ3QgaGF2ZSB0byBjYXJlIGFib3V0IGJsYW5rIHBpeGVscyBvciBibGFuaworCSAgICAgICAgIGxpbmVzIGF0IHRoZSBlbmQgb2YgZWFjaCBsaW5lIG9yIGZyYW1lKS4KKwkqLworCisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBwaXhfZm9ybWF0OworCS8qCisJICAgV2hhdCB5b3UgaGF2ZSB0byBkZWZpbmUgaGVyZSBhcmU6IDEpIGluaXRpYWwgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgb2YKKwkgICB0aGUgdGFyZ2V0IHJlY3RhbmdsZSAyKSB0aGUgaW5pdGlhbCAncGl4ZWxmb3JtYXQnLCB3aGljaCBjYW4gYmUKKwkgICBlaXRoZXIgVjRMMl9QSVhfRk1UX1NOOUMxMFggKGZvciBjb21wcmVzc2VkIHZpZGVvKSBvcgorCSAgIFY0TDJfUElYX0ZNVF9TQkdHUjggMykgJ3ByaXYnLCB3aGljaCB3ZSdsbCBiZSB1c2VkIHRvIGluZGljYXRlIHRoZQorCSAgIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCBmb3IgdW5jb21wcmVzc2VkIHZpZGVvLCA4IG9yIDkgKGRlc3BpdGUgdGhlCisJICAgY3VycmVudCB2YWx1ZSBvZiAncGl4ZWxmb3JtYXQnKS4KKwkgICBOT1RFIDE6IGJvdGggJ3dpZHRoJyBhbmQgJ2hlaWdodCcgX211c3RfIGJlIGVpdGhlciAxLzEgb3IgMS8yIG9yIDEvNAorCSAgICAgICAgICAgb2YgY3JvcGNhcC5kZWZyZWN0LndpZHRoIGFuZCBjcm9wY2FwLmRlZnJlY3QuaGVpZ2h0LiBJCisJICAgICAgICAgICBzdWdnZXN0IDEvMS4KKwkgICBOT1RFIDI6IFRoZSBpbml0aWFsIGNvbXByZXNzaW9uIHF1YWxpdHkgaXMgZGVmaW5lZCBieSB0aGUgZmlyc3QgYml0CisJICAgICAgICAgICBvZiByZWcgMHgxNyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBpbWFnZSBzZW5zb3IuCisJICAgTk9URSAzOiBhcyBzYWlkIGFib3ZlLCB5b3UgaGF2ZSB0byBwcm9ncmFtIHRoZSBTTjlDMTBYIGNoaXAgdG8gZ2V0CisJICAgICAgICAgICByaWQgb2YgYW55IGJsYW5rIHBpeGVscywgc28gdGhhdCB0aGUgb3V0cHV0IG9mIHRoZSBzZW5zb3IKKwkgICAgICAgICAgIG1hdGNoZXMgdGhlIFJHQiBiYXllciBzZXF1ZW5jZSAoaS5lLiBCR0JHQkcuLi5HUkdSR1IpLgorCSovCisKKwlpbnQgKCpzZXRfcGl4X2Zvcm1hdCkoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisJICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHBpeCk7CisJLyoKKwkgICBUbyBiZSBjYWxsZWQgb24gVklESU9DX1NfRk1ULCB3aGVuIHN3aXRjaGluZyBmcm9tIHRoZSBTQkdHUjggdG8KKwkgICBTTjlDMTBYIHBpeGVsIGZvcm1hdCBvciB2aWNldmVyc2EuIE9uIGVycm9yIHJldHVybiB0aGUgY29ycmVzcG9uZGluZworCSAgIGVycm9yIGNvZGUgd2l0aG91dCByb2xsaW5nIGJhY2suCisJKi8KKworCWNvbnN0IHN0cnVjdCBkZXZpY2UqIGRldjsKKwkvKgorCSAgIFRoaXMgaXMgdGhlIGFyZ3VtZW50IGZvciBkZXZfZXJyKCksIGRldl9pbmZvKCkgYW5kIGRldl93YXJuKCkuIEl0CisJICAgaXMgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBZb3UgbXVzdCBub3QgYWNjZXNzIHRoZSBzdHJ1Y3QKKwkgICBiZWZvcmUgdGhlIHNlbnNvciBpcyBhdHRhY2hlZC4KKwkqLworCisJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2UqIHVzYmRldjsKKwkvKgorCSAgIFBvaW50cyB0byB0aGUgdXNiX2RldmljZSBzdHJ1Y3QgYWZ0ZXIgdGhlIHNlbnNvciBpcyBhdHRhY2hlZC4KKwkgICBEbyBub3QgdG91Y2ggdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKwkqLworCisJLyoKKwkgICBEbyBOT1Qgd3JpdGUgdG8gdGhlIGRhdGEgYmVsb3csIGl0J3MgUkVBRCBPTkxZLiBJdCBpcyB1c2VkIGJ5IHRoZQorCSAgIGNvcmUgbW9kdWxlIHRvIHN0b3JlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHZhbHVlcyBvZiB0aGUgYWJvdmUKKwkgICBzZXR0aW5ncywgZm9yIHJvbGxiYWNrcy4uZXRjLi5pbiBjYXNlIG9mIGVycm9ycyBkdXJpbmcgYXRvbWljIEkvTworCSovCisJc3RydWN0IHY0bDJfcXVlcnljdHJsIF9xY3RybFtWNEwyX0NJRF9MQVNUUDEtVjRMMl9DSURfQkFTRV07CisJc3RydWN0IHY0bDJfcmVjdCBfcmVjdDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUHJpdmF0ZSBpb2N0bCdzIGZvciBjb250cm9sIHNldHRpbmdzIHN1cHBvcnRlZCBieSBzb21lIGltYWdlIHNlbnNvcnMgKi8KKyNkZWZpbmUgU045QzEwMl9WNEwyX0NJRF9EQUNfTUFHTklUVURFIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRQorI2RlZmluZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0UgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMQorI2RlZmluZSBTTjlDMTAyX1Y0TDJfQ0lEX1JFU0VUX0xFVkVMIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIKKyNkZWZpbmUgU045QzEwMl9WNEwyX0NJRF9QSVhFTF9CSUFTX1ZPTFRBR0UgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMworCisjZW5kaWYgLyogX1NOOUMxMDJfU0VOU09SX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMTBjMWIuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTExMGMxYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGQ2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMTBjMWIuYwpAQCAtMCwwICsxLDE3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGx1Zy1pbiBmb3IgVEFTNTExMEMxQiBpbWFnZSBzZW5zb3IgY29ubmVjdGVkIHRvIHRoZSBTTjlDMTB4IFBDIENhbWVyYSAgKgorICogQ29udHJvbGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisKKworc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciB0YXM1MTEwYzFiOworCitzdGF0aWMgc3RydWN0IHY0bDJfY29udHJvbCB0YXM1MTEwYzFiX2dhaW47CisKKworc3RhdGljIGludCB0YXM1MTEwYzFiX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAxLCAweDAxKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDQ0LCAweDAxKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDEwKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDExKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDBhLCAweDE0KTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDYwLCAweDE3KTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDA2LCAweDE4KTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGZiLCAweDE5KTsKKworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4YzAsIDB4ODApOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHRhczUxMTBjMWJfZ2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJY3RybC0+dmFsdWUgPSB0YXM1MTEwYzFiX2dhaW4udmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdGFzNTExMGMxYl9zZXRfY3RybChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCWlmICghKGVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjAsIDB4ZjYgLSBjdHJsLT52YWx1ZSkpKQorCQkJdGFzNTExMGMxYl9nYWluLnZhbHVlID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnIgPyAtRUlPIDogMDsKK30KKworCitzdGF0aWMgaW50IHRhczUxMTBjMWJfc2V0X2Nyb3Aoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3JlY3QqIHJlY3QpCit7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gJnRhczUxMTBjMWI7CisJaW50IGVyciA9IDA7CisJdTggaF9zdGFydCA9ICh1OCkocmVjdC0+bGVmdCAtIHMtPmNyb3BjYXAuYm91bmRzLmxlZnQpICsgNjksCisJICAgdl9zdGFydCA9ICh1OCkocmVjdC0+dG9wIC0gcy0+Y3JvcGNhcC5ib3VuZHMudG9wKSArIDk7CisKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBoX3N0YXJ0LCAweDEyKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCB2X3N0YXJ0LCAweDEzKTsKKworCS8qIERvbid0IGNoYW5nZSAhICovCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgxNCwgMHgxYSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwYSwgMHgxYik7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgc245YzEwMl9wcmVhZF9yZWcoY2FtLCAweDE5KSwgMHgxOSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdGFzNTExMGMxYl9zZXRfcGl4X2Zvcm1hdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4KQoreworCWludCBlcnIgPSAwOworCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MmIsIDB4MTkpOworCWVsc2UKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhmYiwgMHgxOSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgdGFzNTExMGMxYiA9IHsKKwkubmFtZSA9ICJUQVM1MTEwQzFCIiwKKwkubWFpbnRhaW5lciA9ICJMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+IiwKKwkuc3lzZnNfb3BzID0gU045QzEwMl9JMkNfV1JJVEUsCisJLmZyZXF1ZW5jeSA9IFNOOUMxMDJfSTJDXzEwMEtIWiwKKwkuaW50ZXJmYWNlID0gU045QzEwMl9JMkNfM1dJUkVTLAorCS5pbml0ID0gJnRhczUxMTBjMWJfaW5pdCwKKwkucWN0cmwgPSB7CisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0dBSU4sCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJnbG9iYWwgZ2FpbiIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4ZjYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4NDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCX0sCisJLnNldF9jdHJsID0gJnRhczUxMTBjMWJfc2V0X2N0cmwsCisJLmNyb3BjYXAgPSB7CisJCS5ib3VuZHMgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDM1MiwKKwkJCS5oZWlnaHQgPSAyODgsCisJCX0sCisJCS5kZWZyZWN0ID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSAzNTIsCisJCQkuaGVpZ2h0ID0gMjg4LAorCQl9LAorCX0sCisJLmdldF9jdHJsID0gJnRhczUxMTBjMWJfZ2V0X2N0cmwsCisJLnNldF9jcm9wID0gJnRhczUxMTBjMWJfc2V0X2Nyb3AsCisJLnBpeF9mb3JtYXQgPSB7CisJCS53aWR0aCA9IDM1MiwKKwkJLmhlaWdodCA9IDI4OCwKKwkJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NCR0dSOCwKKwkJLnByaXYgPSA4LAorCX0sCisJLnNldF9waXhfZm9ybWF0ID0gJnRhczUxMTBjMWJfc2V0X3BpeF9mb3JtYXQKK307CisKKworaW50IHNuOWMxMDJfcHJvYmVfdGFzNTExMGMxYihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwkvKiBUaGlzIHNlbnNvciBoYXMgbm8gaWRlbnRpZmllcnMsIHNvIGxldCdzIGF0dGFjaCBpdCBhbnl3YXkgKi8KKwlzbjljMTAyX2F0dGFjaF9zZW5zb3IoY2FtLCAmdGFzNTExMGMxYik7CisKKwkvKiBTZW5zb3IgZGV0ZWN0aW9uIGlzIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovCisJaWYgKGxlMTZfdG9fY3B1KHRhczUxMTBjMWIudXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgIT0gMHg2MDAxICYmCisJICAgIGxlMTZfdG9fY3B1KHRhczUxMTBjMWIudXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgIT0gMHg2MDA1ICYmCisJICAgIGxlMTZfdG9fY3B1KHRhczUxMTBjMWIudXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgIT0gMHg2MGFiKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl90YXM1MTMwZDFiLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMzBkMWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzc4ZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl90YXM1MTMwZDFiLmMKQEAgLTAsMCArMSwxODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBsdWctaW4gZm9yIFRBUzUxMzBEMUIgaW1hZ2Ugc2Vuc29yIGNvbm5lY3RlZCB0byB0aGUgU045QzEweCBQQyBDYW1lcmEgICoKKyAqIENvbnRyb2xsZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzbjljMTAyX3NlbnNvci5oIgorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgdGFzNTEzMGQxYjsKKworc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgdGFzNTEzMGQxYl9nYWluLCB0YXM1MTMwZDFiX2V4cG9zdXJlOworCisKK3N0YXRpYyBpbnQgdGFzNTEzMGQxYl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMSwgMHgwMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgxNyk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwNCwgMHgwMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMSwgMHgxMCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxNCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg2MCwgMHgxNyk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwNywgMHgxOCk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdGFzNTEzMGQxYl9nZXRfY3RybChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQljdHJsLT52YWx1ZSA9IHRhczUxMzBkMWJfZ2Fpbi52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJY3RybC0+dmFsdWUgPSB0YXM1MTMwZDFiX2V4cG9zdXJlLnZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHRhczUxMzBkMWJfc2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQlpZiAoIShlcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweGY2IC0gY3RybC0+dmFsdWUpKSkKKwkJCXRhczUxMzBkMWJfZ2Fpbi52YWx1ZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQlpZiAoIShlcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDQwLCAweDQ3IC0gY3RybC0+dmFsdWUpKSkKKwkJCXRhczUxMzBkMWJfZXhwb3N1cmUudmFsdWUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQgdGFzNTEzMGQxYl9zZXRfY3JvcChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcmVjdCogcmVjdCkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSAmdGFzNTEzMGQxYjsKKwl1OCBoX3N0YXJ0ID0gKHU4KShyZWN0LT5sZWZ0IC0gcy0+Y3JvcGNhcC5ib3VuZHMubGVmdCkgKyAxMDQsCisJICAgdl9zdGFydCA9ICh1OCkocmVjdC0+dG9wIC0gcy0+Y3JvcGNhcC5ib3VuZHMudG9wKSArIDEyOworCWludCBlcnIgPSAwOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgaF9zdGFydCwgMHgxMik7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgdl9zdGFydCwgMHgxMyk7CisKKwkvKiBEbyBOT1QgY2hhbmdlISAqLworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MWYsIDB4MWEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MWEsIDB4MWIpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHNuOWMxMDJfcHJlYWRfcmVnKGNhbSwgMHgxOSksIDB4MTkpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHRhczUxMzBkMWJfc2V0X3BpeF9mb3JtYXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHBpeCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmIChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9TTjlDMTBYKQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDYzLCAweDE5KTsKKwllbHNlCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZjMsIDB4MTkpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHRhczUxMzBkMWIgPSB7CisJLm5hbWUgPSAiVEFTNTEzMEQxQiIsCisJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCisJLnN5c2ZzX29wcyA9IFNOOUMxMDJfSTJDX1dSSVRFLAorCS5mcmVxdWVuY3kgPSBTTjlDMTAyX0kyQ18xMDBLSFosCisJLmludGVyZmFjZSA9IFNOOUMxMDJfSTJDXzNXSVJFUywKKwkuaW5pdCA9ICZ0YXM1MTMwZDFiX2luaXQsCisJLnFjdHJsID0geworCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9HQUlOLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZ2xvYmFsIGdhaW4iLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweGY2LAorCQkJLnN0ZXAgPSAweDAyLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfRVhQT1NVUkUsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJleHBvc3VyZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4NDcsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCX0sCisJLmdldF9jdHJsID0gJnRhczUxMzBkMWJfZ2V0X2N0cmwsCisJLnNldF9jdHJsID0gJnRhczUxMzBkMWJfc2V0X2N0cmwsCisJLmNyb3BjYXAgPSB7CisJCS5ib3VuZHMgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJCS5kZWZyZWN0ID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCX0sCisJLnNldF9jcm9wID0gJnRhczUxMzBkMWJfc2V0X2Nyb3AsCisJLnBpeF9mb3JtYXQgPSB7CisJCS53aWR0aCA9IDY0MCwKKwkJLmhlaWdodCA9IDQ4MCwKKwkJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NCR0dSOCwKKwkJLnByaXYgPSA4LAorCX0sCisJLnNldF9waXhfZm9ybWF0ID0gJnRhczUxMzBkMWJfc2V0X3BpeF9mb3JtYXQKK307CisKKworaW50IHNuOWMxMDJfcHJvYmVfdGFzNTEzMGQxYihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwkvKiBUaGlzIHNlbnNvciBoYXMgbm8gaWRlbnRpZmllcnMsIHNvIGxldCdzIGF0dGFjaCBpdCBhbnl3YXkgKi8KKwlzbjljMTAyX2F0dGFjaF9zZW5zb3IoY2FtLCAmdGFzNTEzMGQxYik7CisKKwkvKiBTZW5zb3IgZGV0ZWN0aW9uIGlzIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovCisJaWYgKGxlMTZfdG9fY3B1KHRhczUxMzBkMWIudXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgIT0gMHg2MDI1ICYmCisJICAgIGxlMTZfdG9fY3B1KHRhczUxMzBkMWIudXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgIT0gMHg2MGFhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQ1NWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmMKQEAgLTAsMCArMSwxNTA2IEBACisvKgorICogIFNUVjA2ODAgVVNCIENhbWVyYSBEcml2ZXIsIGJ5IEtldmluIFNpc3NvbiAoa2pzaXNzb25AYmVsbHNvdXRoLm5ldCkKKyAqICAKKyAqIFRoYW5rcyB0byBTVE1pY3JvZWxlY3Ryb25pY3MgZm9yIGluZm9ybWF0aW9uIG9uIHRoZSB1c2IgY29tbWFuZHMsIGFuZCAKKyAqIHRvIFN0ZXZlIE1pbGxlciBhdCBTVE0gZm9yIGhpcyBoZWxwIGFuZCBlbmNvdXJhZ2VtZW50IHdoaWxlIEkgd2FzIAorICogd3JpdGluZyB0aGlzIGRyaXZlci4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBoZWF2aWx5IG9uIHRoZSAKKyAqIEVuZHBvaW50cyAoZm9ybWVybHkga25vd24gYXMgQU9YKSBzZTQwMSBVU0IgQ2FtZXJhIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDAwIEplcm9lbiBCLiBWcmVla2VuIChwZTFyeHFAYW1zYXQub3JnKQorICoKKyAqIFN0aWxsIHNvbWV3aGF0IGJhc2VkIG9uIHRoZSBMaW51eCBvdjUxMSBkcml2ZXIuCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEhpc3Rvcnk6IAorICogdmVyIDAuMSBPY3RvYmVyLCAyMDAxLiBJbml0aWFsIGF0dGVtcHQuIAorICoKKyAqIHZlciAwLjIgTm92ZW1iZXIsIDIwMDEuIEZpeGVkIGFzYmlsaXR5IHRvIHJlc2l6ZSwgYWRkZWQgYnJpZ2h0bmVzcworICogICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sIG1hZGUgbW9yZSBzdGFibGUgKD8pCisgKgorICogdmVyIDAuMjEgTm92LCAyMDAxLiAgICAgQWRkZWQgZ2FtbWEgY29ycmVjdGlvbiBhbmQgd2hpdGUgYmFsYW5jZSwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBkdWUgdG8gQWxleGFuZGVyIFNjaHdhcnR6LiBTdGlsbCB0cnlpbmcgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHN0YWJsaWxpdHkuIE1vdmVkIHN0dWZmIGludG8gc3R2NjgwLmgKKyAqCisgKiB2ZXIgMC4yMiBOb3YsIDIwMDEuCSAgIEFkZGVkIHNoYXJwZW4gZnVuY3Rpb24gKGJ5IE1pY2hhZWwgU3dlZXQsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgbWlrZUBlYXN5c3cuY29tKSBmcm9tIEdJTVAsIGFsc28gdXNlZCBpbiBwZW5jYW0uIAorICogICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlLCBmYXN0LCBnb29kIGludGVnZXIgbWF0aCByb3V0aW5lLgorICoKKyAqIHZlciAwLjIzIERlYywgMjAwMSAoZ2toKQorICogCQkJICAgVG9vayBvdXQgc2hhcnBlbiBmdW5jdGlvbiwgcmFuIGNvZGUgdGhyb3VnaAorICogCQkJICAgTGluZGVudCwgYW5kIGRpZCBvdGhlciBtaW5vciB0d2Vha3MgdG8gZ2V0CisgKiAJCQkgICB0aGluZ3MgdG8gd29yayBwcm9wZXJseSB3aXRoIDIuNS4xCisgKgorICogdmVyIDAuMjQgSmFuLCAyMDAyIChranMpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWQgdGhlIHByb2JsZW0gd2l0aCB3ZWJjYW0gY3Jhc2hpbmcgYWZ0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHR3byBwaWN0dXJlcy4gQ2hhbmdlZCB0aGUgd2F5IHBpYyBpcyBoYWx2ZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHF1YWxpdHkuIEdvdCByaWQgb2YgZ3JlZW4gbGluZSBhcm91bmQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS4gRml4IGJyaWdodG5lc3MgcmVzZXQgd2hlbiBjaGFuZ2luZyBzaXplIAorICogICAgICAgICAgICAgICAgICAgICAgICAgYnVnLiBBZGp1c3RlZCBnYW1tYSBmaWx0ZXJzIHNsaWdodGx5LgorICoKKyAqIHZlciAwLjI1IEphbiwgMjAwMiAoa2pzKQorICoJCQkgICBGaXhlZCBhIGJ1ZyBpbiB3aGljaCB0aGUgZHJpdmVyIHNvbWV0aW1lcyBhdHRlbXB0ZWQKKyAqCQkJICAgdG8gc2V0IHRvIGEgbm9uLXN1cHBvcnRlZCBzaXplLiBUaGlzIGFsbG93ZWQKKyAqCQkJICAgZ25vbWVtZWV0aW5nIHRvIHdvcmsuCisgKgkJCSAgIEZpeGVkIHByb2MgZW50cnkgcmVtb3ZhbCBidWcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJzdHY2ODAuaCIKKworc3RhdGljIGludCB2aWRlb19uciA9IC0xOworc3RhdGljIGludCBzd2FwUkdCID0gMDsgICAvKiBkZWZhdWx0IGZvciBhdXRvIHNsZWVjdCAqLworc3RhdGljIGludCBzd2FwUkdCX29uID0gMDsgLyogZGVmYXVsdCB0byBhbGxvdyBhdXRvIHNlbGVjdDsgLTE9c3dhcCBuZXZlciwgKzE9IHN3YXAgYWx3YXlzICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAwOworCisjZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCisJZG8geyBcCisJaWYgKGRlYnVnID49IGxldmVsKQlcCisJCWluZm8oIlslczolZF0gIiBmbXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzKTsJXAorCX0gd2hpbGUgKDApCisKKworLyoKKyAqIFZlcnNpb24gSW5mb3JtYXRpb24KKyAqLworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMjUiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIktldmluIFNpc3NvbiA8a2pzaXNzb25AYmVsbHNvdXRoLm5ldD4iCisjZGVmaW5lIERSSVZFUl9ERVNDICJTVFYwNjgwIFVTQiBDYW1lcmEgRHJpdmVyIgorCitNT0RVTEVfQVVUSE9SIChEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTiAoRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDIChkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7Cittb2R1bGVfcGFyYW0oc3dhcFJHQl9vbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MgKHN3YXBSR0Jfb24sICJSZWQvYmx1ZSBzd2FwOiAxPWFsd2F5cywgMD1hdXRvLCAtMT1uZXZlciIpOworbW9kdWxlX3BhcmFtKHZpZGVvX25yLCBpbnQsIDApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNZW1vcnkgbWFuYWdlbWVudAorICoKKyAqIFRoaXMgaXMgYSBzaGFtZWxlc3MgY29weSBmcm9tIHRoZSBVU0ItY3BpYSBkcml2ZXIgKGxpbnV4IGtlcm5lbAorICogdmVyc2lvbiAyLjMuMjkgb3Igc28sIEkgaGF2ZSBubyBpZGVhIHdoYXQgdGhpcyBjb2RlIGFjdHVhbGx5IGRvZXMgOykuCisgKiBBY3R1YWxseSBpdCBzZWVtcyB0byBiZSBhIGNvcHkgb2YgYSBzaGFtZWxlc3MgY29weSBvZiB0aGUgYnR0di1kcml2ZXIuCisgKiBPciB0aGF0IGlzIGEgY29weSBvZiBhIHNoYW1lbGVzcyBjb3B5IG9mIC4uLiAoVG8gdGhlIHBvd2VyczogaXMgdGhlcmUKKyAqIG5vIGdlbmVyaWMga2VybmVsLWZ1bmN0aW9uIHRvIGRvIHRoaXMgc29ydCBvZiBzdHVmZj8pCisgKgorICogWWVzLCBpdCB3YXMgYSBzaGFtZWxlc3MgY29weSBmcm9tIHRoZSBidHR2LWRyaXZlci4gSUlSQywgQWxhbiBzYXlzCisgKiB0aGVyZSB3aWxsIGJlIG9uZSwgYnV0IGFwcGFyZW50ZWx5IG5vdCB5ZXQgLWplcmRmZWx0CisgKgorICogU28gSSBjb3BpZWQgaXQgYWdhaW4gZm9yIHRoZSBvdjUxMSBkcml2ZXIgLWNsYXVkaW8KKyAqCisgKiBTYW1lIGZvciB0aGUgc2U0MDEgZHJpdmVyIC1KZXJvZW4KKyAqCisgKiBBbmQgdGhlIFNUVjA2ODAgZHJpdmVyIC0gS2V2aW4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkICpydm1hbGxvYyAodW5zaWduZWQgbG9uZyBzaXplKQoreworCXZvaWQgKm1lbTsKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCW1lbSA9IHZtYWxsb2NfMzIgKHNpemUpOworCWlmICghbWVtKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldCAobWVtLCAwLCBzaXplKTsJLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KKwlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlIChzaXplID4gMCkgeworCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZCBydmZyZWUgKHZvaWQgKm1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJaWYgKCFtZW0pCisJCXJldHVybjsKKworCWFkciA9ICh1bnNpZ25lZCBsb25nKSBtZW07CisJd2hpbGUgKChsb25nKSBzaXplID4gMCkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJYWRyICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCXZmcmVlIChtZW0pOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBlbmNhbSByZWFkL3dyaXRlIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0dl9zbmRjdHJsIChpbnQgc2V0LCBzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwLCB1bnNpZ25lZCBzaG9ydCByZXEsIHVuc2lnbmVkIHNob3J0IHZhbHVlLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBzaXplKQoreworCWludCByZXQgPSAtMTsKKworCXN3aXRjaCAoc2V0KSB7CisJY2FzZSAwOgkJLyogIDB4YzEgICovCisJCXJldCA9IHVzYl9jb250cm9sX21zZyAoc3R2NjgwLT51ZGV2LAorCQkJCSAgICAgICB1c2JfcmN2Y3RybHBpcGUgKHN0djY4MC0+dWRldiwgMCksCisJCQkJICAgICAgIHJlcSwKKwkJCQkgICAgICAgKFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfRU5EUE9JTlQpLAorCQkJCSAgICAgICB2YWx1ZSwgMCwgYnVmZmVyLCBzaXplLCBQRU5DQU1fVElNRU9VVCk7CisJCWJyZWFrOworCisJY2FzZSAxOgkJLyogIDB4NDEgICovCisJCXJldCA9IHVzYl9jb250cm9sX21zZyAoc3R2NjgwLT51ZGV2LAorCQkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUgKHN0djY4MC0+dWRldiwgMCksCisJCQkJICAgICAgIHJlcSwKKwkJCQkgICAgICAgKFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0VORFBPSU5UKSwKKwkJCQkgICAgICAgdmFsdWUsIDAsIGJ1ZmZlciwgc2l6ZSwgUEVOQ0FNX1RJTUVPVVQpOworCQlicmVhazsKKworCWNhc2UgMjoJCS8qICAweDgwICAqLworCQlyZXQgPSB1c2JfY29udHJvbF9tc2cgKHN0djY4MC0+dWRldiwKKwkJCQkgICAgICAgdXNiX3JjdmN0cmxwaXBlIChzdHY2ODAtPnVkZXYsIDApLAorCQkJCSAgICAgICByZXEsCisJCQkJICAgICAgIChVU0JfRElSX0lOIHwgVVNCX1JFQ0lQX0RFVklDRSksCisJCQkJICAgICAgIHZhbHVlLCAwLCBidWZmZXIsIHNpemUsIFBFTkNBTV9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwljYXNlIDM6CQkvKiAgMHg0MCAgKi8KKwkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnIChzdHY2ODAtPnVkZXYsCisJCQkJICAgICAgIHVzYl9zbmRjdHJscGlwZSAoc3R2NjgwLT51ZGV2LCAwKSwKKwkJCQkgICAgICAgcmVxLAorCQkJCSAgICAgICAoVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFKSwKKwkJCQkgICAgICAgdmFsdWUsIDAsIGJ1ZmZlciwgc2l6ZSwgUEVOQ0FNX1RJTUVPVVQpOworCQlicmVhazsKKworCX0KKwlpZiAoKHJldCA8IDApICYmIChyZXEgIT0gMHgwYSkpIHsKKwkJUERFQlVHICgxLCAiU1RWKGUpOiB1c2JfY29udHJvbF9tc2cgZXJyb3IgJWksIHJlcXVlc3QgPSAweCV4LCBlcnJvciA9ICVpIiwgc2V0LCByZXEsIHJldCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3R2X3NldF9jb25maWcgKHN0cnVjdCB1c2Jfc3R2ICpkZXYsIGludCBjb25maWd1cmF0aW9uLCBpbnQgaW50ZXJmYWNlLCBpbnQgYWx0ZXJuYXRlKQoreworCisJaWYgKGNvbmZpZ3VyYXRpb24gIT0gZGV2LT51ZGV2LT5hY3Rjb25maWctPmRlc2MuYkNvbmZpZ3VyYXRpb25WYWx1ZQorCQkJfHwgdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24gKGRldi0+dWRldikgPCAwKSB7CisJCVBERUJVRyAoMSwgIlNUVihlKTogRkFJTEVEIHRvIHJlc2V0IGNvbmZpZ3VyYXRpb24gJWkiLCBjb25maWd1cmF0aW9uKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAodXNiX3NldF9pbnRlcmZhY2UgKGRldi0+dWRldiwgaW50ZXJmYWNlLCBhbHRlcm5hdGUpIDwgMCkgeworCQlQREVCVUcgKDEsICJTVFYoZSk6IEZBSUxFRCB0byBzZXQgYWx0ZXJuYXRlIGludGVyZmFjZSAlaSIsIGFsdGVybmF0ZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2X3N0b3BfdmlkZW8gKHN0cnVjdCB1c2Jfc3R2ICpkZXYpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJYnVmID0ga21hbGxvYyAoNDAsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlQREVCVUcgKDAsICJTVFYoZSk6IE91dCBvZiAoc21hbGwgYnVmKSBtZW1vcnkiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHRoaXMgaXMgYSBoaWdoIHByaW9yaXR5IGNvbW1hbmQ7IGl0IHN0b3BzIGFsbCBsb3dlciBvcmRlciBjb21tYW5kcyAqLworCWlmICgoaSA9IHN0dl9zbmRjdHJsICgxLCBkZXYsIDB4MDQsIDB4MDAwMCwgYnVmLCAweDApKSA8IDApIHsKKwkJaSA9IHN0dl9zbmRjdHJsICgwLCBkZXYsIDB4ODAsIDAsIGJ1ZiwgMHgwMik7CS8qIEdldCBMYXN0IEVycm9yOyAyID0gYnVzeSAqLworCQlQREVCVUcgKDEsICJTVFYoaSk6IGxhc3QgZXJyb3I6ICVpLCAgY29tbWFuZCA9IDB4JXgiLCBidWZbMF0sIGJ1ZlsxXSk7CisJfSBlbHNlIHsKKwkJUERFQlVHICgxLCAiU1RWKGkpOiBDYW1lcmEgcmVzZXQgdG8gaWRsZSBtb2RlLiIpOworCX0KKworCWlmICgoaSA9IHN0dl9zZXRfY29uZmlnIChkZXYsIDEsIDAsIDApKSA8IDApCisJCVBERUJVRyAoMSwgIlNUVihlKTogUmVzZXQgY29uZmlnIGR1cmluZyBleGl0IGZhaWxlZCIpOworCisJLyogIGdldCBjdXJyZW50IG1vZGUgICovCisJYnVmWzBdID0gMHhmMDsKKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgZGV2LCAweDg3LCAwLCBidWYsIDB4MDgpKSAhPSAweDA4KQkvKiBnZXQgbW9kZSAqLworCQlQREVCVUcgKDAsICJTVFYoZSk6IFN0b3BfdmlkZW86IHByb2JsZW0gc2V0dGluZyBvcmlnaW5hbCBtb2RlIik7CisJaWYgKGRldi0+b3JpZ01vZGUgIT0gYnVmWzBdKSB7CisJCW1lbXNldCAoYnVmLCAwLCA4KTsKKwkJYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpIGRldi0+b3JpZ01vZGU7CisJCWlmICgoaSA9IHN0dl9zbmRjdHJsICgzLCBkZXYsIDB4MDcsIDB4MDEwMCwgYnVmLCAweDA4KSkgIT0gMHgwOCkgeworCQkJUERFQlVHICgwLCAiU1RWKGUpOiBTdG9wX3ZpZGVvOiBTZXRfQ2FtZXJhX01vZGUgZmFpbGVkIik7CisJCQlpID0gLTE7CisJCX0KKwkJYnVmWzBdID0gMHhmMDsKKwkJaSA9IHN0dl9zbmRjdHJsICgwLCBkZXYsIDB4ODcsIDAsIGJ1ZiwgMHgwOCk7CisJCWlmICgoaSAhPSAweDA4KSB8fCAoYnVmWzBdICE9IGRldi0+b3JpZ01vZGUpKSB7CisJCQlQREVCVUcgKDAsICJTVFYoZSk6IGNhbWVyYSBOT1Qgc2V0IHRvIG9yaWdpbmFsIHJlc29sdXRpb24uIik7CisJCQlpID0gLTE7CisJCX0gZWxzZQorCQkJUERFQlVHICgwLCAiU1RWKGkpOiBDYW1lcmEgc2V0IHRvIG9yaWdpbmFsIHJlc29sdXRpb24iKTsKKwl9CisJLyogb3JpZ01vZGUgKi8KKwlrZnJlZSAoYnVmKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBzdHZfc2V0X3ZpZGVvX21vZGUgKHN0cnVjdCB1c2Jfc3R2ICpkZXYpCit7CisJaW50IGksIHN0b3BfdmlkZW8gPSAxOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCWJ1ZiA9IGttYWxsb2MgKDQwLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJUERFQlVHICgwLCAiU1RWKGUpOiBPdXQgb2YgKHNtYWxsIGJ1ZikgbWVtb3J5Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKGkgPSBzdHZfc2V0X2NvbmZpZyAoZGV2LCAxLCAwLCAwKSkgPCAwKSB7CisJCWtmcmVlIChidWYpOworCQlyZXR1cm4gaTsKKwl9CisKKwlpID0gc3R2X3NuZGN0cmwgKDIsIGRldiwgMHgwNiwgMHgwMTAwLCBidWYsIDB4MTIpOworCWlmICghKGkgPiAwKSAmJiAoYnVmWzhdID09IDB4NTMpICYmIChidWZbOV0gPT0gMHgwNSkpIHsKKwkJUERFQlVHICgxLCAiU1RWKGUpOiBDb3VsZCBub3QgZ2V0IGRlc2NyaXB0b3IgMDEwMC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiAgc2V0IGFsdGVybmF0ZSBpbnRlcmZhY2UgMSAqLworCWlmICgoaSA9IHN0dl9zZXRfY29uZmlnIChkZXYsIDEsIDAsIDEpKSA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgZGV2LCAweDg1LCAwLCBidWYsIDB4MTApKSAhPSAweDEwKQorCQlnb3RvIGVycm9yOworCVBERUJVRyAoMSwgIlNUVihpKTogU2V0dGluZyB2aWRlbyBtb2RlLiIpOworCS8qICBTd2l0Y2ggdG8gVmlkZW8gbW9kZTogMHgwMTAwID0gVkdBICg2NDB4NDgwKSwgMHgwMDAwID0gQ0lGICgzNTJ4Mjg4KSAweDAzMDAgPSBRVkdBICgzMjB4MjQwKSAgKi8KKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMSwgZGV2LCAweDA5LCBkZXYtPlZpZGVvTW9kZSwgYnVmLCAweDApKSA8IDApIHsKKwkJc3RvcF92aWRlbyA9IDA7CisJCWdvdG8gZXJyb3I7CisJfQorCWdvdG8gZXhpdDsKKworZXJyb3I6CisJa2ZyZWUgKGJ1Zik7CisJaWYgKHN0b3BfdmlkZW8gPT0gMSkKKwkJc3R2X3N0b3BfdmlkZW8gKGRldik7CisJcmV0dXJuIC0xOworCitleGl0OgorCWtmcmVlIChidWYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0dl9pbml0IChzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwKQoreworCWludCBpID0gMDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBpbnQgYnVmc2l6ZTsKKworCWJ1ZmZlciA9IGttYWxsb2MgKDQwLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJUERFQlVHICgwLCAiU1RWKGUpOiBPdXQgb2YgKHNtYWxsIGJ1ZikgbWVtb3J5Iik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0IChidWZmZXIsIDAsIDQwKTsKKwl1ZGVsYXkgKDEwMCk7CisKKwkvKiBzZXQgY29uZmlnIDEsIGludGVyZmFjZSAwLCBhbHRlcm5hdGUgMCAqLworCWlmICgoaSA9IHN0dl9zZXRfY29uZmlnIChzdHY2ODAsIDEsIDAsIDApKSA8IDApIHsKKwkJa2ZyZWUgKGJ1ZmZlcik7CisJCVBERUJVRyAoMCwgIlNUVihlKTogc2V0IGNvbmZpZyAxLDAsMCBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBwaW5nIGNhbWVyYSB0byBiZSBzdXJlIFNUVjA2ODAgaXMgcHJlc2VudCAqLworCWlmICgoaSA9IHN0dl9zbmRjdHJsICgwLCBzdHY2ODAsIDB4ODgsIDB4NTY3OCwgYnVmZmVyLCAweDAyKSkgIT0gMHgwMikKKwkJZ290byBlcnJvcjsKKwlpZiAoKGJ1ZmZlclswXSAhPSAweDU2KSB8fCAoYnVmZmVyWzFdICE9IDB4NzgpKSB7CisJCVBERUJVRyAoMSwgIlNUVihlKTogY2FtZXJhIHBpbmcgZmFpbGVkISEiKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBnZXQgY2FtZXJhIGRlc2NyaXB0b3IgKi8KKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMiwgc3R2NjgwLCAweDA2LCAweDAyMDAsIGJ1ZmZlciwgMHgwOSkpICE9IDB4MDkpCisJCWdvdG8gZXJyb3I7CisJaSA9IHN0dl9zbmRjdHJsICgyLCBzdHY2ODAsIDB4MDYsIDB4MDIwMCwgYnVmZmVyLCAweDIyKTsKKwlpZiAoIShpID49IDApICYmIChidWZmZXJbN10gPT0gMHhhMCkgJiYgKGJ1ZmZlcls4XSA9PSAweDIzKSkgeworCQlQREVCVUcgKDEsICJTVFYoZSk6IENvdWxkIG5vdCBnZXQgZGVzY3JpcHRvciAwMjAwLiIpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDhhLCAwLCBidWZmZXIsIDB4MDIpKSAhPSAweDAyKQorCQlnb3RvIGVycm9yOworCWlmICgoaSA9IHN0dl9zbmRjdHJsICgwLCBzdHY2ODAsIDB4OGIsIDAsIGJ1ZmZlciwgMHgyNCkpICE9IDB4MjQpCisJCWdvdG8gZXJyb3I7CisJaWYgKChpID0gc3R2X3NuZGN0cmwgKDAsIHN0djY4MCwgMHg4NSwgMCwgYnVmZmVyLCAweDEwKSkgIT0gMHgxMCkKKwkJZ290byBlcnJvcjsKKworCXN0djY4MC0+U3VwcG9ydGVkTW9kZXMgPSBidWZmZXJbN107CisJaSA9IHN0djY4MC0+U3VwcG9ydGVkTW9kZXM7CisJc3R2NjgwLT5DSUYgPSAwOworCXN0djY4MC0+VkdBID0gMDsKKwlzdHY2ODAtPlFWR0EgPSAwOworCWlmIChpICYgMSkKKwkJc3R2NjgwLT5DSUYgPSAxOworCWlmIChpICYgMikKKwkJc3R2NjgwLT5WR0EgPSAxOworCWlmIChpICYgOCkKKwkJc3R2NjgwLT5RVkdBID0gMTsKKwlpZiAoc3R2NjgwLT5TdXBwb3J0ZWRNb2RlcyA9PSAwKSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogVGhlcmUgYXJlIE5PIHN1cHBvcnRlZCBTVFY2ODAgbW9kZXMhISIpOworCQlpID0gLTE7CisJCWdvdG8gZXJyb3I7CisJfSBlbHNlIHsKKwkJaWYgKHN0djY4MC0+Q0lGKQorCQkJUERFQlVHICgwLCAiU1RWKGkpOiBDSUYgaXMgc3VwcG9ydGVkIik7CisJCWlmIChzdHY2ODAtPlFWR0EpCisJCQlQREVCVUcgKDAsICJTVFYoaSk6IFFWR0EgaXMgc3VwcG9ydGVkIik7CisJfQorCS8qIEZXIHJldiwgQVNJQyByZXYsIHNlbnNvciBJRCAgKi8KKwlQREVCVUcgKDEsICJTVFYoaSk6IEZpcm13YXJlIHJldiBpcyAlaS4laSIsIGJ1ZmZlclswXSwgYnVmZmVyWzFdKTsKKwlQREVCVUcgKDEsICJTVFYoaSk6IEFTSUMgcmV2IGlzICVpLiVpIiwgYnVmZmVyWzJdLCBidWZmZXJbM10pOworCVBERUJVRyAoMSwgIlNUVihpKTogU2Vuc29yIElEIGlzICVpIiwgKGJ1ZmZlcls0XSoxNikgKyAoYnVmZmVyWzVdPj40KSk7CisKKwkvKiAgc2V0IGFsdGVybmF0ZSBpbnRlcmZhY2UgMSAqLworCWlmICgoaSA9IHN0dl9zZXRfY29uZmlnIChzdHY2ODAsIDEsIDAsIDEpKSA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDg1LCAwLCBidWZmZXIsIDB4MTApKSAhPSAweDEwKQorCQlnb3RvIGVycm9yOworCWlmICgoaSA9IHN0dl9zbmRjdHJsICgwLCBzdHY2ODAsIDB4OGQsIDAsIGJ1ZmZlciwgMHgwOCkpICE9IDB4MDgpCisJCWdvdG8gZXJyb3I7CisJaSA9IGJ1ZmZlclszXTsKKwlQREVCVUcgKDAsICJTVFYoaSk6IENhbWVyYSBoYXMgJWkgcGljdHVyZXMuIiwgaSk7CisKKwkvKiAgZ2V0IGN1cnJlbnQgbW9kZSAqLworCWlmICgoaSA9IHN0dl9zbmRjdHJsICgwLCBzdHY2ODAsIDB4ODcsIDAsIGJ1ZmZlciwgMHgwOCkpICE9IDB4MDgpCisJCWdvdG8gZXJyb3I7CisJc3R2NjgwLT5vcmlnTW9kZSA9IGJ1ZmZlclswXTsJLyogMDEgPSBWR0EsIDAzID0gUVZHQSwgMDAgPSBDSUYgKi8KKworCS8qIFRoaXMgd2lsbCBhdHRlbXAgQ0lGIG1vZGUsIGlmIHN1cHBvcnRlZC4gSWYgbm90LCBzZXQgdG8gUVZHQSAgKi8KKwltZW1zZXQgKGJ1ZmZlciwgMCwgOCk7CisJaWYgKHN0djY4MC0+Q0lGKQorCQlidWZmZXJbMF0gPSAweDAwOworCWVsc2UgaWYgKHN0djY4MC0+UVZHQSkKKwkJYnVmZmVyWzBdID0gMHgwMzsKKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMywgc3R2NjgwLCAweDA3LCAweDAxMDAsIGJ1ZmZlciwgMHgwOCkpICE9IDB4MDgpIHsKKwkJUERFQlVHICgwLCAiU1RWKGkpOiBTZXRfQ2FtZXJhX01vZGUgZmFpbGVkIik7CisJCWkgPSAtMTsKKwkJZ290byBlcnJvcjsKKwl9CisJYnVmZmVyWzBdID0gMHhmMDsKKwlzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDg3LCAwLCBidWZmZXIsIDB4MDgpOworCWlmICgoKHN0djY4MC0+Q0lGID09IDEpICYmIChidWZmZXJbMF0gIT0gMHgwMCkpIHx8ICgoc3R2NjgwLT5RVkdBID09IDEpICYmIChidWZmZXJbMF0gIT0gMHgwMykpKSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogRXJyb3Igc2V0dGluZyBjYW1lcmEgdmlkZW8gbW9kZSEiKTsKKwkJaSA9IC0xOworCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCWlmIChidWZmZXJbMF0gPT0gMCkgeworCQkJc3R2NjgwLT5WaWRlb01vZGUgPSAweDAwMDA7CisJCQlQREVCVUcgKDAsICJTVFYoaSk6IFZpZGVvIE1vZGUgc2V0IHRvIENJRiIpOworCQl9CisJCWlmIChidWZmZXJbMF0gPT0gMHgwMykgeworCQkJc3R2NjgwLT5WaWRlb01vZGUgPSAweDAzMDA7CisJCQlQREVCVUcgKDAsICJTVFYoaSk6IFZpZGVvIE1vZGUgc2V0IHRvIFFWR0EiKTsKKwkJfQorCX0KKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDhmLCAwLCBidWZmZXIsIDB4MTApKSAhPSAweDEwKQorCQlnb3RvIGVycm9yOworCWJ1ZnNpemUgPSAoYnVmZmVyWzBdIDw8IDI0KSB8IChidWZmZXJbMV0gPDwgMTYpIHwgKGJ1ZmZlclsyXSA8PCA4KSB8IChidWZmZXJbM10pOworCXN0djY4MC0+Y3dpZHRoID0gKGJ1ZmZlcls0XSA8PCA4KSB8IChidWZmZXJbNV0pOwkvKiAtPmNhbWVyYSA9IDMyMiwgMzU2LCA2NDQgICovCisJc3R2NjgwLT5jaGVpZ2h0ID0gKGJ1ZmZlcls2XSA8PCA4KSB8IChidWZmZXJbN10pOwkvKiAtPmNhbWVyYSA9IDI0MiwgMjkyLCA0ODQgICovCisJc3R2NjgwLT5vcmlnR2FpbiA9IGJ1ZmZlclsxMl07CisKKwlnb3RvIGV4aXQ7CisKK2Vycm9yOgorCWkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDgwLCAwLCBidWZmZXIsIDB4MDIpOwkvKiBHZXQgTGFzdCBFcnJvciAqLworCVBERUJVRyAoMSwgIlNUVihpKTogbGFzdCBlcnJvcjogJWksICBjb21tYW5kID0gMHgleCIsIGJ1ZmZlclswXSwgYnVmZmVyWzFdKTsKKwlrZnJlZSAoYnVmZmVyKTsKKwlyZXR1cm4gLTE7CisKK2V4aXQ6CisJa2ZyZWUgKGJ1ZmZlcik7CisKKwkvKiB2aWRlbyA9IDMyMHgyNDAsIDM1MngyODggKi8KKwlpZiAoc3R2NjgwLT5DSUYgPT0gMSkgeworCQlzdHY2ODAtPm1heHdpZHRoID0gMzUyOworCQlzdHY2ODAtPm1heGhlaWdodCA9IDI4ODsKKwkJc3R2NjgwLT52d2lkdGggPSAzNTI7CisJCXN0djY4MC0+dmhlaWdodCA9IDI4ODsKKwl9CisJaWYgKHN0djY4MC0+UVZHQSA9PSAxKSB7CisJCXN0djY4MC0+bWF4d2lkdGggPSAzMjA7CisJCXN0djY4MC0+bWF4aGVpZ2h0ID0gMjQwOworCQlzdHY2ODAtPnZ3aWR0aCA9IDMyMDsKKwkJc3R2NjgwLT52aGVpZ2h0ID0gMjQwOworCX0KKworCXN0djY4MC0+cmF3YnVmc2l6ZSA9IGJ1ZnNpemU7CS8qIG11c3QgYmUgLi8uIGJ5IDggKi8KKwlzdHY2ODAtPm1heGZyYW1lc2l6ZSA9IGJ1ZnNpemUgKiAzOwkvKiBSR0Igc2l6ZSAqLworCVBERUJVRyAoMiwgIlNUVihpKTogY3dpZHRoID0gJWksIGNoZWlnaHQgPSAlaSIsIHN0djY4MC0+Y3dpZHRoLCBzdHY2ODAtPmNoZWlnaHQpOworCVBERUJVRyAoMSwgIlNUVihpKTogd2lkdGggPSAlaSwgaGVpZ2h0ID0gJWksIHJhd2J1ZnNpemUgPSAlbGkiLCBzdHY2ODAtPnZ3aWR0aCwgc3R2NjgwLT52aGVpZ2h0LCBzdHY2ODAtPnJhd2J1ZnNpemUpOworCisJLyogc29tZSBkZWZhdWx0IHZhbHVlcyAqLworCXN0djY4MC0+YnVsa19pbl9lbmRwb2ludEFkZHIgPSAweDgyOworCXN0djY4MC0+ZHJvcHBlZCA9IDA7CisJc3R2NjgwLT5lcnJvciA9IDA7CisJc3R2NjgwLT5mcmFtZWNvdW50ID0gMDsKKwlzdHY2ODAtPnJlYWRjb3VudCA9IDA7CisJc3R2NjgwLT5zdHJlYW1pbmcgPSAwOworCS8qIGJyaWdodCwgd2hpdGUsIGNvbG91ciwgaHVlLCBjb250cmFzdCBhcmUgc2V0IGJ5IHNvZnR3YXJlLCBub3QgaW4gc3R2MDY4MCAqLworCXN0djY4MC0+YnJpZ2h0bmVzcyA9IDMyNzY3OworCXN0djY4MC0+Y2hnYnJpZ2h0ID0gMDsKKwlzdHY2ODAtPndoaXRlbmVzcyA9IDA7CS8qIG9ubHkgZm9yIGdyZXlzY2FsZSAqLworCXN0djY4MC0+Y29sb3VyID0gMzI3Njc7CisJc3R2NjgwLT5jb250cmFzdCA9IDMyNzY3OworCXN0djY4MC0+aHVlID0gMzI3Njc7CisJc3R2NjgwLT5wYWxldHRlID0gU1RWX1ZJREVPX1BBTEVUVEU7CisJc3R2NjgwLT5kZXB0aCA9IDI0OwkvKiByZ2IyNCBiaXRzICovCisJaWYgKChzd2FwUkdCX29uID09IDApICYmIChzd2FwUkdCID09IDApKQorCQlQREVCVUcgKDEsICJTVFYoaSk6IHN3YXBSR0IgaXMgKGF1dG8pIE9GRiIpOworCWVsc2UgaWYgKChzd2FwUkdCX29uID09IDApICYmIChzd2FwUkdCID09IDEpKQorCQlQREVCVUcgKDEsICJTVFYoaSk6IHN3YXBSR0IgaXMgKGF1dG8pIE9OIik7CisJZWxzZSBpZiAoc3dhcFJHQl9vbiA9PSAxKQorCQlQREVCVUcgKDEsICJTVFYoaSk6IHN3YXBSR0IgaXMgKGZvcmNlZCkgT04iKTsKKwllbHNlIGlmIChzd2FwUkdCX29uID09IC0xKQorCQlQREVCVUcgKDEsICJTVFYoaSk6IHN3YXBSR0IgaXMgKGZvcmNlZCkgT0ZGIik7CisJCisJaWYgKHN0dl9zZXRfdmlkZW9fbW9kZSAoc3R2NjgwKSA8IDApIHsKKwkJUERFQlVHICgwLCAiU1RWKGUpOiBDb3VsZCBub3Qgc2V0IHZpZGVvIG1vZGUgaW4gc3R2X2luaXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKiogbGFzdCBvZiBwZW5jYW0gIHJvdXRpbmVzICAqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHN5c2ZzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBzdHY2ODBfZmlsZShuYW1lLCB2YXJpYWJsZSwgZmllbGQpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2xhc3NfZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiX3N0diAqc3R2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgZmllbGQsIHN0di0+dmFyaWFibGUpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd18jI25hbWUsIE5VTEwpOworCitzdHY2ODBfZmlsZShtb2RlbCwgY2FtZXJhX25hbWUsICIlc1xuIik7CitzdHY2ODBfZmlsZShpbl91c2UsIHVzZXIsICIlZFxuIik7CitzdHY2ODBfZmlsZShzdHJlYW1pbmcsIHN0cmVhbWluZywgIiVkXG4iKTsKK3N0djY4MF9maWxlKHBhbGV0dGUsIHBhbGV0dGUsICIlaVxuIik7CitzdHY2ODBfZmlsZShmcmFtZXNfdG90YWwsIHJlYWRjb3VudCwgIiVkXG4iKTsKK3N0djY4MF9maWxlKGZyYW1lc19yZWFkLCBmcmFtZWNvdW50LCAiJWRcbiIpOworc3R2NjgwX2ZpbGUocGFja2V0c19kcm9wcGVkLCBkcm9wcGVkLCAiJWRcbiIpOworc3R2NjgwX2ZpbGUoZGVjb2RpbmdfZXJyb3JzLCBlcnJvciwgIiVkXG4iKTsKKworc3RhdGljIHZvaWQgc3R2NjgwX2NyZWF0ZV9zeXNmc19maWxlcyhzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQoreworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfbW9kZWwpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaW5fdXNlKTsKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3N0cmVhbWluZyk7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYWxldHRlKTsKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2ZyYW1lc190b3RhbCk7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZXNfcmVhZCk7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYWNrZXRzX2Ryb3BwZWQpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZGVjb2RpbmdfZXJyb3JzKTsKK30KKworc3RhdGljIHZvaWQgc3R2NjgwX3JlbW92ZV9zeXNmc19maWxlcyhzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQoreworCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfbW9kZWwpOworCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaW5fdXNlKTsKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3N0cmVhbWluZyk7CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYWxldHRlKTsKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2ZyYW1lc190b3RhbCk7CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZXNfcmVhZCk7CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYWNrZXRzX2Ryb3BwZWQpOworCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZGVjb2RpbmdfZXJyb3JzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDYW1lcmEgY29udHJvbAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc3R2NjgwX2dldF9waWN0IChzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwLCBzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCkKK3sKKwkvKiBUaGlzIHNldHMgdmFsdWVzIGZvciB2NGwgaW50ZXJmYWNlLiBtYXgvbWluID0gNjU1MzUvMCAgKi8KKworCXAtPmJyaWdodG5lc3MgPSBzdHY2ODAtPmJyaWdodG5lc3M7CisJcC0+d2hpdGVuZXNzID0gc3R2NjgwLT53aGl0ZW5lc3M7CS8qIGdyZXlzY2FsZSAqLworCXAtPmNvbG91ciA9IHN0djY4MC0+Y29sb3VyOworCXAtPmNvbnRyYXN0ID0gc3R2NjgwLT5jb250cmFzdDsKKwlwLT5odWUgPSBzdHY2ODAtPmh1ZTsKKwlwLT5wYWxldHRlID0gc3R2NjgwLT5wYWxldHRlOworCXAtPmRlcHRoID0gc3R2NjgwLT5kZXB0aDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHY2ODBfc2V0X3BpY3QgKHN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAsIHN0cnVjdCB2aWRlb19waWN0dXJlICpwKQoreworCS8qIFNlZSBhYm92ZSBzdHY2ODBfZ2V0X3BpY3QgICovCisKKwlpZiAocC0+cGFsZXR0ZSAhPSBTVFZfVklERU9fUEFMRVRURSkgeworCQlQREVCVUcgKDIsICJTVFYoZSk6IFBhbGV0dGUgc2V0IGVycm9yIGluIF9zZXRfcGljIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChzdHY2ODAtPmJyaWdodG5lc3MgIT0gcC0+YnJpZ2h0bmVzcykgeworCQlzdHY2ODAtPmNoZ2JyaWdodCA9IDE7CisJCXN0djY4MC0+YnJpZ2h0bmVzcyA9IHAtPmJyaWdodG5lc3M7CisJfSAKKworCXN0djY4MC0+d2hpdGVuZXNzID0gcC0+d2hpdGVuZXNzOwkvKiBncmV5c2NhbGUgKi8KKwlzdHY2ODAtPmNvbG91ciA9IHAtPmNvbG91cjsKKwlzdHY2ODAtPmNvbnRyYXN0ID0gcC0+Y29udHJhc3Q7CisJc3R2NjgwLT5odWUgPSBwLT5odWU7CisJc3R2NjgwLT5wYWxldHRlID0gcC0+cGFsZXR0ZTsKKwlzdHY2ODAtPmRlcHRoID0gcC0+ZGVwdGg7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3R2NjgwX3ZpZGVvX2lycSAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwID0gdXJiLT5jb250ZXh0OworCWludCBsZW5ndGggPSB1cmItPmFjdHVhbF9sZW5ndGg7CisKKwlpZiAobGVuZ3RoIDwgc3R2NjgwLT5yYXdidWZzaXplKQorCQlQREVCVUcgKDIsICJTVFYoaSk6IExvc3QgZGF0YSBpbiB0cmFuc2ZlcjogZXhwICVsaSwgZ290ICVpIiwgc3R2NjgwLT5yYXdidWZzaXplLCBsZW5ndGgpOworCisJLyogb2hvaC4uLiAqLworCWlmICghc3R2NjgwLT5zdHJlYW1pbmcpCisJCXJldHVybjsKKworCWlmICghc3R2NjgwLT51ZGV2KSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogZGV2aWNlIHZhcG91cmlzaGVkIGluIHZpZGVvX2lycSIpOworCQlyZXR1cm47CisJfQorCisJLyogMCBzaXplZCBwYWNrZXRzIGhhcHBlbiBpZiB3ZSBhcmUgdG8gZmFzdCwgYnV0IHNvbWV0aW1lcyB0aGUgY2FtZXJhCisJICAga2VlcHMgc2VuZGluZyB0aGVtIGZvcmV2ZXIuLi4KKwkgKi8KKwlpZiAobGVuZ3RoICYmICF1cmItPnN0YXR1cykgeworCQlzdHY2ODAtPm51bGxwYWNrZXRzID0gMDsKKwkJc3dpdGNoIChzdHY2ODAtPnNjcmF0Y2hbc3R2NjgwLT5zY3JhdGNoX25leHRdLnN0YXRlKSB7CisJCWNhc2UgQlVGRkVSX1JFQURZOgorCQljYXNlIEJVRkZFUl9CVVNZOgorCQkJc3R2NjgwLT5kcm9wcGVkKys7CisJCQlicmVhazsKKworCQljYXNlIEJVRkZFUl9VTlVTRUQ6CisJCQltZW1jcHkgKHN0djY4MC0+c2NyYXRjaFtzdHY2ODAtPnNjcmF0Y2hfbmV4dF0uZGF0YSwKKwkJCSAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCk7CisJCQlzdHY2ODAtPnNjcmF0Y2hbc3R2NjgwLT5zY3JhdGNoX25leHRdLnN0YXRlID0gQlVGRkVSX1JFQURZOworCQkJc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF9uZXh0XS5sZW5ndGggPSBsZW5ndGg7CisJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSAoJnN0djY4MC0+d3EpKSB7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmc3R2NjgwLT53cSk7CisJCQl9CisJCQlzdHY2ODAtPnNjcmF0Y2hfb3ZlcmZsb3cgPSAwOworCQkJc3R2NjgwLT5zY3JhdGNoX25leHQrKzsKKwkJCWlmIChzdHY2ODAtPnNjcmF0Y2hfbmV4dCA+PSBTVFY2ODBfTlVNU0NSQVRDSCkKKwkJCQlzdHY2ODAtPnNjcmF0Y2hfbmV4dCA9IDA7CisJCQlicmVhazsKKwkJfQkJLyogc3dpdGNoICAqLworCX0gZWxzZSB7CisJCXN0djY4MC0+bnVsbHBhY2tldHMrKzsKKwkJaWYgKHN0djY4MC0+bnVsbHBhY2tldHMgPiBTVFY2ODBfTUFYX05VTExQQUNLRVRTKSB7CisJCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSAoJnN0djY4MC0+d3EpKSB7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmc3R2NjgwLT53cSk7CisJCQl9CisJCX0KKwl9CQkJLyogIGlmIC0gZWxzZSAqLworCisJLyogUmVzdWJtaXQgdXJiIGZvciBuZXcgZGF0YSAqLworCXVyYi0+c3RhdHVzID0gMDsKKwl1cmItPmRldiA9IHN0djY4MC0+dWRldjsKKwlpZiAodXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQykpCisJCVBERUJVRyAoMCwgIlNUVihlKTogdXJiIGJ1cm5lZCBkb3duIGluIHZpZGVvIGlycSIpOworCXJldHVybjsKK30JCQkJLyogIF92aWRlb19pcnEgICovCisKK3N0YXRpYyBpbnQgc3R2NjgwX3N0YXJ0X3N0cmVhbSAoc3RydWN0IHVzYl9zdHYgKnN0djY4MCkKK3sKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IGVyciA9IDAsIGk7CisKKwlzdHY2ODAtPnN0cmVhbWluZyA9IDE7CisKKwkvKiBEbyBzb21lIG1lbW9yeSBhbGxvY2F0aW9uICovCisJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1GUkFNRVM7IGkrKykgeworCQlzdHY2ODAtPmZyYW1lW2ldLmRhdGEgPSBzdHY2ODAtPmZidWYgKyBpICogc3R2NjgwLT5tYXhmcmFtZXNpemU7CisJCXN0djY4MC0+ZnJhbWVbaV0uY3VycGl4ID0gMDsKKwl9CisJLyogcGFja2V0IHNpemUgPSA0MDk2ICAqLworCWZvciAoaSA9IDA7IGkgPCBTVFY2ODBfTlVNU0JVRjsgaSsrKSB7CisJCXN0djY4MC0+c2J1ZltpXS5kYXRhID0ga21hbGxvYyAoc3R2NjgwLT5yYXdidWZzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHN0djY4MC0+c2J1ZltpXS5kYXRhID09IE5VTEwpIHsKKwkJCVBERUJVRyAoMCwgIlNUVihlKTogQ291bGQgbm90IGttYWxsb2MgcmF3IGRhdGEgYnVmZmVyICVpIiwgaSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlzdHY2ODAtPnNjcmF0Y2hfbmV4dCA9IDA7CisJc3R2NjgwLT5zY3JhdGNoX3VzZSA9IDA7CisJc3R2NjgwLT5zY3JhdGNoX292ZXJmbG93ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTVNDUkFUQ0g7IGkrKykgeworCQlzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSA9IGttYWxsb2MgKHN0djY4MC0+cmF3YnVmc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSA9PSBOVUxMKSB7CisJCQlQREVCVUcgKDAsICJTVFYoZSk6IENvdWxkIG5vdCBrbWFsbG9jIHJhdyBzY3JhdGNoIGJ1ZmZlciAlaSIsIGkpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN0djY4MC0+c2NyYXRjaFtpXS5zdGF0ZSA9IEJVRkZFUl9VTlVTRUQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQlVGOyBpKyspIHsKKwkJdXJiID0gdXNiX2FsbG9jX3VyYiAoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdXJiKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogc2J1ZiBpcyB1cmItPnRyYW5zZmVyX2J1ZmZlciwgbGF0ZXIgZ2V0cyBtZW1jcHllZCB0byBzY3JhdGNoICovCisJCXVzYl9maWxsX2J1bGtfdXJiICh1cmIsIHN0djY4MC0+dWRldiwKKwkJCQkgICB1c2JfcmN2YnVsa3BpcGUgKHN0djY4MC0+dWRldiwgc3R2NjgwLT5idWxrX2luX2VuZHBvaW50QWRkciksCisJCQkJICAgc3R2NjgwLT5zYnVmW2ldLmRhdGEsIHN0djY4MC0+cmF3YnVmc2l6ZSwKKwkJCQkgICBzdHY2ODBfdmlkZW9faXJxLCBzdHY2ODApOworCQlzdHY2ODAtPnVyYltpXSA9IHVyYjsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIgKHN0djY4MC0+dXJiW2ldLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycikKKwkJCVBERUJVRyAoMCwgIlNUVihlKTogdXJiIGJ1cm5lZCBkb3duIGluIHN0YXJ0IHN0cmVhbSIpOworCX0JCQkvKiBpIFNUVjY4MF9OVU1TQlVGICovCisKKwlzdHY2ODAtPmZyYW1lY291bnQgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0djY4MF9zdG9wX3N0cmVhbSAoc3RydWN0IHVzYl9zdHYgKnN0djY4MCkKK3sKKwlpbnQgaTsKKworCWlmICghc3R2NjgwLT5zdHJlYW1pbmcgfHwgIXN0djY4MC0+dWRldikKKwkJcmV0dXJuIDE7CisKKwlzdHY2ODAtPnN0cmVhbWluZyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTVNCVUY7IGkrKykKKwkJaWYgKHN0djY4MC0+dXJiW2ldKSB7CisJCQl1c2Jfa2lsbF91cmIgKHN0djY4MC0+dXJiW2ldKTsKKwkJCXVzYl9mcmVlX3VyYiAoc3R2NjgwLT51cmJbaV0pOworCQkJc3R2NjgwLT51cmJbaV0gPSBOVUxMOworCQkJa2ZyZWUgKHN0djY4MC0+c2J1ZltpXS5kYXRhKTsKKwkJfQorCWZvciAoaSA9IDA7IGkgPCBTVFY2ODBfTlVNU0NSQVRDSDsgaSsrKSB7CisJCWtmcmVlIChzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSk7CisJCXN0djY4MC0+c2NyYXRjaFtpXS5kYXRhID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHY2ODBfc2V0X3NpemUgKHN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlpbnQgd2Fzc3RyZWFtaW5nID0gc3R2NjgwLT5zdHJlYW1pbmc7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBjaGFuZ2UgKi8KKwlpZiAoKHN0djY4MC0+dndpZHRoID09IHdpZHRoKSAmJiAoc3R2NjgwLT52aGVpZ2h0ID09IGhlaWdodCkpCisJCXJldHVybiAwOworCisJUERFQlVHICgxLCAiU1RWKGkpOiBzaXplIHJlcXVlc3QgZm9yICVpIHggJWkiLCB3aWR0aCwgaGVpZ2h0KTsKKwkvKiBDaGVjayBmb3IgYSB2YWxpZCBtb2RlICovCisJaWYgKCghd2lkdGggfHwgIWhlaWdodCkgfHwgKCh3aWR0aCAmIDEpIHx8IChoZWlnaHQgJiAxKSkpIHsKKwkJUERFQlVHICgxLCAiU1RWKGUpOiBzZXRfc2l6ZSBlcnJvcjogcmVxdWVzdDogdi53aWR0aCA9ICVpLCB2LmhlaWdodCA9ICVpICBhY3R1YWw6IHN0di53aWR0aCA9ICVpLCBzdHYuaGVpZ2h0ID0gJWkiLCB3aWR0aCwgaGVpZ2h0LCBzdHY2ODAtPnZ3aWR0aCwgc3R2NjgwLT52aGVpZ2h0KTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCh3aWR0aCA8IChzdHY2ODAtPm1heHdpZHRoIC8gMikpIHx8IChoZWlnaHQgPCAoc3R2NjgwLT5tYXhoZWlnaHQgLyAyKSkpIHsKKwkJd2lkdGggPSBzdHY2ODAtPm1heHdpZHRoIC8gMjsKKwkJaGVpZ2h0ID0gc3R2NjgwLT5tYXhoZWlnaHQgLyAyOworCX0gZWxzZSBpZiAoKHdpZHRoID49IDE1OCkgJiYgKHdpZHRoIDw9IDE2NikgJiYgKHN0djY4MC0+UVZHQSA9PSAxKSkgeworCQl3aWR0aCA9IDE2MDsKKwkJaGVpZ2h0ID0gMTIwOworCX0gZWxzZSBpZiAoKHdpZHRoID49IDE3MikgJiYgKHdpZHRoIDw9IDE4MCkgJiYgKHN0djY4MC0+Q0lGID09IDEpKSB7CisJCXdpZHRoID0gMTc2OworCQloZWlnaHQgPSAxNDQ7CisJfSBlbHNlIGlmICgod2lkdGggPj0gMzE4KSAmJiAod2lkdGggPD0gMzUwKSAmJiAoc3R2NjgwLT5RVkdBID09IDEpKSB7CisJCXdpZHRoID0gMzIwOworCQloZWlnaHQgPSAyNDA7CisJfSBlbHNlIGlmICgod2lkdGggPj0gMzUwKSAmJiAod2lkdGggPD0gMzU4KSAmJiAoc3R2NjgwLT5DSUYgPT0gMSkpIHsKKwkJd2lkdGggPSAzNTI7CisJCWhlaWdodCA9IDI4ODsKKwl9IGVsc2UgeworCQlQREVCVUcgKDEsICJTVFYoZSk6IHJlcXVlc3QgZm9yIG5vbi1zdXBwb3J0ZWQgc2l6ZTogcmVxdWVzdDogdi53aWR0aCA9ICVpLCB2LmhlaWdodCA9ICVpICBhY3R1YWw6IHN0di53aWR0aCA9ICVpLCBzdHYuaGVpZ2h0ID0gJWkiLCB3aWR0aCwgaGVpZ2h0LCBzdHY2ODAtPnZ3aWR0aCwgc3R2NjgwLT52aGVpZ2h0KTsKKwkJcmV0dXJuIDE7CisJfQorCQorCS8qIFN0b3AgYSBjdXJyZW50IHN0cmVhbSBhbmQgc3RhcnQgaXQgYWdhaW4gYXQgdGhlIG5ldyBzaXplICovCisJaWYgKHdhc3N0cmVhbWluZykKKwkJc3R2NjgwX3N0b3Bfc3RyZWFtIChzdHY2ODApOworCXN0djY4MC0+dndpZHRoID0gd2lkdGg7CisJc3R2NjgwLT52aGVpZ2h0ID0gaGVpZ2h0OworCVBERUJVRyAoMSwgIlNUVihpKTogc2l6ZSBzZXQgdG8gJWkgeCAlaSIsIHN0djY4MC0+dndpZHRoLCBzdHY2ODAtPnZoZWlnaHQpOworCWlmICh3YXNzdHJlYW1pbmcpCisJCXN0djY4MF9zdGFydF9zdHJlYW0gKHN0djY4MCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZpZGVvIERlY29kaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKiogIHJvdXRpbmVzIGZyb20gdGhlIHBlbmNhbSBwcm9ncmFtOyBoZXksIHRoZXkgd29yayEgICoqKioqKioqLworCisvKgorICogU1RWMDY4MCBWaXNpb24gQ2FtZXJhIENoaXBzZXQgRHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQWRhbSBIYXJyaXNvbiA8YWRhbUBhbnRpc3Bpbi5vcmc+IAorKi8KKworI2RlZmluZSBSRUQgMAorI2RlZmluZSBHUkVFTiAxCisjZGVmaW5lIEJMVUUgMgorI2RlZmluZSBBRCh4LCB5LCB3KSAoKCh5KSoodykrKHgpKSozKQorCitzdGF0aWMgdm9pZCBiYXllcl91bnNodWZmbGUgKHN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAsIHN0cnVjdCBzdHY2ODBfc2NyYXRjaCAqYnVmZmVyKQoreworCWludCB4LCB5LCBpOworCWludCB3ID0gc3R2NjgwLT5jd2lkdGg7CisJaW50IHZ3ID0gc3R2NjgwLT5jd2lkdGgsIHZoID0gc3R2NjgwLT5jaGVpZ2h0OworCXVuc2lnbmVkIGludCBwID0gMDsKKwlpbnQgY29sb3VyID0gMCwgYmF5ZXIgPSAwOworCXVuc2lnbmVkIGNoYXIgKnJhdyA9IGJ1ZmZlci0+ZGF0YTsKKwlzdHJ1Y3Qgc3R2NjgwX2ZyYW1lICpmcmFtZSA9ICZzdHY2ODAtPmZyYW1lW3N0djY4MC0+Y3VyZnJhbWVdOworCXVuc2lnbmVkIGNoYXIgKm91dHB1dCA9IGZyYW1lLT5kYXRhOworCXVuc2lnbmVkIGNoYXIgKnRlbXAgPSBmcmFtZS0+ZGF0YTsKKwlpbnQgb2Zmc2V0ID0gYnVmZmVyLT5vZmZzZXQ7CisKKwlpZiAoZnJhbWUtPmN1cnBpeCA9PSAwKSB7CisJCWlmIChmcmFtZS0+Z3JhYnN0YXRlID09IEZSQU1FX1JFQURZKSB7CisJCQlmcmFtZS0+Z3JhYnN0YXRlID0gRlJBTUVfR1JBQkJJTkc7CisJCX0KKwl9CisJaWYgKG9mZnNldCAhPSBmcmFtZS0+Y3VycGl4KSB7CS8qIFJlZ2FyZCBmcmFtZSBhcyBsb3N0IDooICovCisJCWZyYW1lLT5jdXJwaXggPSAwOworCQlzdHY2ODAtPmVycm9yKys7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHN0djY4MC0+dndpZHRoID09IDMyMCkgfHwgKHN0djY4MC0+dndpZHRoID09IDE2MCkpIHsKKwkJdncgPSAzMjA7CisJCXZoID0gMjQwOworCX0KKwlpZiAoKHN0djY4MC0+dndpZHRoID09IDM1MikgfHwgKHN0djY4MC0+dndpZHRoID09IDE3NikpIHsKKwkJdncgPSAzNTI7CisJCXZoID0gMjg4OworCX0KKworCW1lbXNldCAob3V0cHV0LCAwLCAzICogdncgKiB2aCk7CS8qIGNsZWFyIG91dHB1dCBtYXRyaXguICovCisKKwlmb3IgKHkgPSAwOyB5IDwgdmg7IHkrKykgeworCQlmb3IgKHggPSAwOyB4IDwgdnc7IHgrKykgeworCQkJaWYgKHggJiAxKQorCQkJCXAgPSAqKHJhdyArIHkgKiB3ICsgKHggPj4gMSkpOworCQkJZWxzZQorCQkJCXAgPSAqKHJhdyArIHkgKiB3ICsgKHggPj4gMSkgKyAodyA+PiAxKSk7CisKKwkJCWlmICh5ICYgMSkKKwkJCQliYXllciA9IDI7CisJCQllbHNlCisJCQkJYmF5ZXIgPSAwOworCQkJaWYgKHggJiAxKQorCQkJCWJheWVyKys7CisKKwkJCXN3aXRjaCAoYmF5ZXIpIHsKKwkJCWNhc2UgMDoKKwkJCWNhc2UgMzoKKwkJCQljb2xvdXIgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWNvbG91ciA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJY29sb3VyID0gMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWkgPSAoeSAqIHZ3ICsgeCkgKiAzOwkKKwkJCSoob3V0cHV0ICsgaSArIGNvbG91cikgPSAodW5zaWduZWQgY2hhcikgcDsKKwkJfQkJLyogZm9yIHggKi8KKworCX0JCQkvKiBmb3IgeSAqLworCisJLyoqKioqKiBnYW1tYSBjb3JyZWN0aW9uIHBsdXMgaGFyZGNvZGVkIHdoaXRlIGJhbGFuY2UgKi8KKwkvKiBUaGFua3MgdG8gQWxleGFuZGVyIFNjaHdhcnR4IDxhbGV4YW5kZXIuc2Nod2FydHhAZ214Lm5ldD4gZm9yIHRoaXMgY29kZS4KKwkgICBDb3JyZWN0aW9uIHZhbHVlcyByZWRbXSwgZ3JlZW5bXSwgYmx1ZVtdLCBhcmUgZ2VuZXJhdGVkIGJ5IAorCSAgIChwb3coaS8yNTYuMCwgR0FNTUEpKjI1NS4wKSp3aGl0ZSBiYWxhbmNlUkdCIHdoZXJlIEdBTU1BPTAuNTUsIDE8aTwyNTUuIAorCSAgIFdoaXRlIGJhbGFuY2UgKFJHQik9IDEuMCwgMS4xNywgMS40OC4gVmFsdWVzIGFyZSBjYWxjdWxhdGVkIGFzIGRvdWJsZSBmbG9hdCBhbmQgCisJICAgY29udmVydGVkIHRvIHVuc2lnbmVkIGNoYXIuIFZhbHVlcyBhcmUgaW4gc3R2NjgwLmggICovCisKKwlmb3IgKHkgPSAwOyB5IDwgdmg7IHkrKykgeworCQlmb3IgKHggPSAwOyB4IDwgdnc7IHgrKykgeworCQkJaSA9ICh5ICogdncgKyB4KSAqIDM7CisJCQkqKG91dHB1dCArIGkpID0gcmVkWyoob3V0cHV0ICsgaSldOworCQkJKihvdXRwdXQgKyBpICsgMSkgPSBncmVlblsqKG91dHB1dCArIGkgKyAxKV07CisJCQkqKG91dHB1dCArIGkgKyAyKSA9IGJsdWVbKihvdXRwdXQgKyBpICsgMildOworCQl9CisJfQorCisJLyoqKioqKiAgYmF5ZXIgZGVtb3NhaWMgICoqKioqKi8KKwlmb3IgKHkgPSAxOyB5IDwgKHZoIC0gMSk7IHkrKykgeworCQlmb3IgKHggPSAxOyB4IDwgKHZ3IC0gMSk7IHgrKykgewkvKiB3b3JrIG91dCBwaXhlbCB0eXBlICovCisJCQlpZiAoeSAmIDEpCisJCQkJYmF5ZXIgPSAwOworCQkJZWxzZQorCQkJCWJheWVyID0gMjsKKwkJCWlmICghKHggJiAxKSkKKwkJCQliYXllcisrOworCisJCQlzd2l0Y2ggKGJheWVyKSB7CisJCQljYXNlIDA6CS8qIGdyZWVuLiBibHVlIGxyLCByZWQgdGIgKi8KKwkJCQkqKG91dHB1dCArIEFEICh4LCB5LCB2dykgKyBCTFVFKSA9ICgoaW50KSAqKG91dHB1dCArIEFEICh4IC0gMSwgeSwgdncpICsgQkxVRSkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4ICsgMSwgeSwgdncpICsgQkxVRSkpID4+IDE7CisJCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgUkVEKSA9ICgoaW50KSAqKG91dHB1dCArIEFEICh4LCB5IC0gMSwgdncpICsgUkVEKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHgsIHkgKyAxLCB2dykgKyBSRUQpKSA+PiAxOworCQkJCWJyZWFrOworCisJCQljYXNlIDE6CS8qIGJsdWUuIGdyZWVuIGxydGIsIHJlZCBkaWFnb25hbHMgKi8KKwkJCQkqKG91dHB1dCArIEFEICh4LCB5LCB2dykgKyBHUkVFTikgPSAoKGludCkgKihvdXRwdXQgKyBBRCAoeCAtIDEsIHksIHZ3KSArIEdSRUVOKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5LCB2dykgKyBHUkVFTikgKyAoaW50KSAqKG91dHB1dCArIEFEICh4LCB5IC0gMSwgdncpICsgR1JFRU4pICsgKGludCkgKihvdXRwdXQgKyBBRCAoeCwgeSArIDEsIHZ3KSArIEdSRUVOKSkgPj4gMjsKKwkJCQkqKG91dHB1dCArIEFEICh4LCB5LCB2dykgKyBSRUQpID0gKChpbnQpICoob3V0cHV0ICsgQUQgKHggLSAxLCB5IC0gMSwgdncpICsgUkVEKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggLSAxLCB5ICsgMSwgdncpICsgUkVEKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5IC0gMSwgdncpICsgUkVEKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5ICsgMSwgdncpICsgUkVEKSkgPj4gMjsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOgkvKiByZWQuIGdyZWVuIGxydGIsIGJsdWUgZGlhZ29uYWxzICovCisJCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgR1JFRU4pID0gKChpbnQpICoob3V0cHV0ICsgQUQgKHggLSAxLCB5LCB2dykgKyBHUkVFTikgKyAoaW50KSAqKG91dHB1dCArIEFEICh4ICsgMSwgeSwgdncpICsgR1JFRU4pICsgKGludCkgKihvdXRwdXQgKyBBRCAoeCwgeSAtIDEsIHZ3KSArIEdSRUVOKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHgsIHkgKyAxLCB2dykgKyBHUkVFTikpID4+IDI7CisJCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgQkxVRSkgPSAoKGludCkgKihvdXRwdXQgKyBBRCAoeCAtIDEsIHkgLSAxLCB2dykgKyBCTFVFKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5IC0gMSwgdncpICsgQkxVRSkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4IC0gMSwgeSArIDEsIHZ3KSArIEJMVUUpICsgKGludCkgKihvdXRwdXQgKyBBRCAoeCArIDEsIHkgKyAxLCB2dykgKyBCTFVFKSkgPj4gMjsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgkvKiBncmVlbi4gcmVkIGxyLCBibHVlIHRiICovCisJCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgUkVEKSA9ICgoaW50KSAqKG91dHB1dCArIEFEICh4IC0gMSwgeSwgdncpICsgUkVEKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5LCB2dykgKyBSRUQpKSA+PiAxOworCQkJCSoob3V0cHV0ICsgQUQgKHgsIHksIHZ3KSArIEJMVUUpID0gKChpbnQpICoob3V0cHV0ICsgQUQgKHgsIHkgLSAxLCB2dykgKyBCTFVFKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHgsIHkgKyAxLCB2dykgKyBCTFVFKSkgPj4gMTsKKwkJCQlicmVhazsKKwkJCX0JLyogc3dpdGNoICovCisJCX0JCS8qIGZvciB4ICovCisJfQkJCS8qIGZvciB5ICAtIGVuZCBkZW1vc2FpYyAgKi8KKworCS8qIGZpeCB0b3AgYW5kIGJvdHRvbSByb3csIGxlZnQgYW5kIHJpZ2h0IHNpZGUgKi8KKwlpID0gdncgKiAzOworCW1lbWNweSAob3V0cHV0LCAob3V0cHV0ICsgaSksIGkpOworCW1lbWNweSAoKG91dHB1dCArICh2aCAqIGkpKSwgKG91dHB1dCArICgodmggLSAxKSAqIGkpKSwgaSk7CisJZm9yICh5ID0gMDsgeSA8IHZoOyB5KyspIHsKKwkJaSA9IHkgKiB2dyAqIDM7CisJCW1lbWNweSAoKG91dHB1dCArIGkpLCAob3V0cHV0ICsgaSArIDMpLCAzKTsKKwkJbWVtY3B5ICgob3V0cHV0ICsgaSArICh2dyAqIDMpKSwgKG91dHB1dCArIGkgKyAodncgLSAxKSAqIDMpLCAzKTsKKwl9CisKKwkvKiAgcHJvY2VzcyBhbGwgcmF3IGRhdGEsIHRoZW4gdHJpbSB0byBzaXplIGlmIG5lY2Vzc2FyeSAqLworCWlmICgoc3R2NjgwLT52d2lkdGggPT0gMTYwKSB8fCAoc3R2NjgwLT52d2lkdGggPT0gMTc2KSkgIHsKKwkJaSA9IDA7CisJCWZvciAoeSA9IDA7IHkgPCB2aDsgeSsrKSB7CisJCQlpZiAoISh5ICYgMSkpIHsKKwkJCQlmb3IgKHggPSAwOyB4IDwgdnc7IHgrKykgeworCQkJCQlwID0gKHkgKiB2dyArIHgpICogMzsKKwkJCQkJaWYgKCEoeCAmIDEpKSB7CisJCQkJCQkqKG91dHB1dCArIGkpID0gKihvdXRwdXQgKyBwKTsKKwkJCQkJCSoob3V0cHV0ICsgaSArIDEpID0gKihvdXRwdXQgKyBwICsgMSk7CisJCQkJCQkqKG91dHB1dCArIGkgKyAyKSA9ICoob3V0cHV0ICsgcCArIDIpOworCQkJCQkJaSArPSAzOworCQkJCQl9CisJCQkJfSAgLyogZm9yIHggKi8KKwkJCX0KKwkJfSAgLyogZm9yIHkgKi8KKwl9CisJLyogcmVzZXQgdG8gcHJvcGVyIHdpZHRoICovCisJaWYgKChzdHY2ODAtPnZ3aWR0aCA9PSAxNjApKSB7CisJCXZ3ID0gMTYwOworCQl2aCA9IDEyMDsKKwl9CisJaWYgKChzdHY2ODAtPnZ3aWR0aCA9PSAxNzYpKSB7CisJCXZ3ID0gMTc2OworCQl2aCA9IDE0NDsKKwl9CisKKwkvKiBvdXRwdXQgaXMgUkdCOyBzb21lIHByb2dyYW1zIHdhbnQgQkdSICAqLworCS8qIHN3YXBSR0Jfb249MCAtPiBwcm9ncmFtIGRlY2lkZXM7ICBzd2FwUkdCX29uPTEsIGFsd2F5cyBzd2FwICovCisJLyogc3dhcFJHQl9vbj0tMSwgbmV2ZXIgc3dhcCAqLworCWlmICgoKHN3YXBSR0IgPT0gMSkgJiYgKHN3YXBSR0Jfb24gIT0gLTEpKSB8fCAoc3dhcFJHQl9vbiA9PSAxKSkgeworCQlmb3IgKHkgPSAwOyB5IDwgdmg7IHkrKykgeworCQkJZm9yICh4ID0gMDsgeCA8IHZ3OyB4KyspIHsKKwkJCQlpID0gKHkgKiB2dyArIHgpICogMzsKKwkJCQkqKHRlbXApID0gKihvdXRwdXQgKyBpKTsKKwkJCQkqKG91dHB1dCArIGkpID0gKihvdXRwdXQgKyBpICsgMik7CisJCQkJKihvdXRwdXQgKyBpICsgMikgPSAqKHRlbXApOworCQkJfQorCQl9CisJfQorCS8qIGJyaWdodG5lc3MgKi8KKwlpZiAoc3R2NjgwLT5jaGdicmlnaHQgPT0gMSkgeworCQlpZiAoc3R2NjgwLT5icmlnaHRuZXNzID49IDMyNzY3KSB7CisJCQlwID0gKHN0djY4MC0+YnJpZ2h0bmVzcyAtIDMyNzY3KSAvIDI1NjsKKwkJCWZvciAoeCA9IDA7IHggPCAodncgKiB2aCAqIDMpOyB4KyspIHsKKwkJCQlpZiAoKCoob3V0cHV0ICsgeCkgKyAodW5zaWduZWQgY2hhcikgcCkgPiAyNTUpCisJCQkJCSoob3V0cHV0ICsgeCkgPSAyNTU7CisJCQkJZWxzZQorCQkJCQkqKG91dHB1dCArIHgpICs9ICh1bnNpZ25lZCBjaGFyKSBwOworCQkJfQkvKiBmb3IgKi8KKwkJfSBlbHNlIHsKKwkJCXAgPSAoMzI3NjcgLSBzdHY2ODAtPmJyaWdodG5lc3MpIC8gMjU2OworCQkJZm9yICh4ID0gMDsgeCA8ICh2dyAqIHZoICogMyk7IHgrKykgeworCQkJCWlmICgodW5zaWduZWQgY2hhcikgcCA+ICoob3V0cHV0ICsgeCkpCisJCQkJCSoob3V0cHV0ICsgeCkgPSAwOworCQkJCWVsc2UKKwkJCQkJKihvdXRwdXQgKyB4KSAtPSAodW5zaWduZWQgY2hhcikgcDsKKwkJCX0JLyogZm9yICovCisJCX0JCS8qIGVsc2UgKi8KKwl9CisJLyogaWYgKi8KKwlmcmFtZS0+Y3VycGl4ID0gMDsKKwlmcmFtZS0+Y3VybGluZXBpeCA9IDA7CisJZnJhbWUtPmdyYWJzdGF0ZSA9IEZSQU1FX0RPTkU7CisJc3R2NjgwLT5mcmFtZWNvdW50Kys7CisJc3R2NjgwLT5yZWFkY291bnQrKzsKKwlpZiAoc3R2NjgwLT5mcmFtZVsoc3R2NjgwLT5jdXJmcmFtZSArIDEpICYgKFNUVjY4MF9OVU1GUkFNRVMgLSAxKV0uZ3JhYnN0YXRlID09IEZSQU1FX1JFQURZKSB7CisJCXN0djY4MC0+Y3VyZnJhbWUgPSAoc3R2NjgwLT5jdXJmcmFtZSArIDEpICYgKFNUVjY4MF9OVU1GUkFNRVMgLSAxKTsKKwl9CisKK30JCQkJLyogYmF5ZXJfdW5zaHVmZmxlICovCisKKy8qKioqKioqICBlbmQgcm91dGluZXMgZnJvbSB0aGUgcGVuY2FtIHByb2dyYW0gICoqKioqKioqKi8KKworc3RhdGljIGludCBzdHY2ODBfbmV3ZnJhbWUgKHN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAsIGludCBmcmFtZW5yKQoreworCWludCBlcnJvcnMgPSAwOworCisJd2hpbGUgKHN0djY4MC0+c3RyZWFtaW5nICYmIChzdHY2ODAtPmZyYW1lW2ZyYW1lbnJdLmdyYWJzdGF0ZSA9PSBGUkFNRV9SRUFEWSB8fCBzdHY2ODAtPmZyYW1lW2ZyYW1lbnJdLmdyYWJzdGF0ZSA9PSBGUkFNRV9HUkFCQklORykpIHsKKwkJaWYgKCFzdHY2ODAtPmZyYW1lW2ZyYW1lbnJdLmN1cnBpeCkgeworCQkJZXJyb3JzKys7CisJCX0KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlIChzdHY2ODAtPndxLCAoc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF91c2VdLnN0YXRlID09IEJVRkZFUl9SRUFEWSkpOworCisJCWlmIChzdHY2ODAtPm51bGxwYWNrZXRzID4gU1RWNjgwX01BWF9OVUxMUEFDS0VUUykgeworCQkJc3R2NjgwLT5udWxscGFja2V0cyA9IDA7CisJCQlQREVCVUcgKDIsICJTVFYoaSk6IHRvbyBtYW55IG51bGwgbGVuZ3RoIHBhY2tldHMsIHJlc3RhcnRpbmcgY2FwdHVyZSIpOworCQkJc3R2NjgwX3N0b3Bfc3RyZWFtIChzdHY2ODApOworCQkJc3R2NjgwX3N0YXJ0X3N0cmVhbSAoc3R2NjgwKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHY2ODAtPnNjcmF0Y2hbc3R2NjgwLT5zY3JhdGNoX3VzZV0uc3RhdGUgIT0gQlVGRkVSX1JFQURZKSB7CisJCQkJc3R2NjgwLT5mcmFtZVtmcmFtZW5yXS5ncmFic3RhdGUgPSBGUkFNRV9FUlJPUjsKKwkJCQlQREVCVUcgKDIsICJTVFYoZSk6IEZSQU1FX0VSUk9SIGluIF9uZXdmcmFtZSIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF91c2VdLnN0YXRlID0gQlVGRkVSX0JVU1k7CisKKwkJCWJheWVyX3Vuc2h1ZmZsZSAoc3R2NjgwLCAmc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF91c2VdKTsKKworCQkJc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF91c2VdLnN0YXRlID0gQlVGRkVSX1VOVVNFRDsKKwkJCXN0djY4MC0+c2NyYXRjaF91c2UrKzsKKwkJCWlmIChzdHY2ODAtPnNjcmF0Y2hfdXNlID49IFNUVjY4MF9OVU1TQ1JBVENIKQorCQkJCXN0djY4MC0+c2NyYXRjaF91c2UgPSAwOworCQkJaWYgKGVycm9ycyA+IFNUVjY4MF9NQVhfRVJST1JTKSB7CisJCQkJZXJyb3JzID0gMDsKKwkJCQlQREVCVUcgKDIsICJTVFYoaSk6IHRvbyBtYW55IGVycm9ycywgcmVzdGFydGluZyBjYXB0dXJlIik7CisJCQkJc3R2NjgwX3N0b3Bfc3RyZWFtIChzdHY2ODApOworCQkJCXN0djY4MF9zdGFydF9zdHJlYW0gKHN0djY4MCk7CisJCQl9CisJCX0JCS8qIGVsc2UgKi8KKwl9CQkJLyogd2hpbGUgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmlkZW80TGludXgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc3R2X29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHVzYl9zdHYgKnN0djY4MCA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJaW50IGVyciA9IDA7CisKKwkvKiB3ZSBhcmUgY2FsbGVkIHdpdGggdGhlIEJLTCBoZWxkICovCisJc3R2NjgwLT51c2VyID0gMTsKKwllcnIgPSBzdHZfaW5pdCAoc3R2NjgwKTsJLyogbWFpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBjYW1lcmEgKi8KKworCWlmIChlcnIgPj0gMCkgeworCQlzdHY2ODAtPmZidWYgPSBydm1hbGxvYyAoc3R2NjgwLT5tYXhmcmFtZXNpemUgKiBTVFY2ODBfTlVNRlJBTUVTKTsKKwkJaWYgKCFzdHY2ODAtPmZidWYpIHsKKwkJCVBERUJVRyAoMCwgIlNUVihlKTogQ291bGQgbm90IHJ2bWFsbG9jIGZyYW1lIGJ1ZmVyIik7CisJCQllcnIgPSAtRU5PTUVNOworCQl9CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKwl9CisJaWYgKGVycikKKwkJc3R2NjgwLT51c2VyID0gMDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc3R2X2Nsb3NlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9zdHYgKnN0djY4MCA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTUZSQU1FUzsgaSsrKQorCQlzdHY2ODAtPmZyYW1lW2ldLmdyYWJzdGF0ZSA9IEZSQU1FX1VOVVNFRDsKKwlpZiAoc3R2NjgwLT5zdHJlYW1pbmcpCisJCXN0djY4MF9zdG9wX3N0cmVhbSAoc3R2NjgwKTsKKworCWlmICgoaSA9IHN0dl9zdG9wX3ZpZGVvIChzdHY2ODApKSA8IDApCisJCVBERUJVRyAoMSwgIlNUVihlKTogc3RvcF92aWRlbyBmYWlsZWQgaW4gc3R2X2Nsb3NlIik7CisKKwlydmZyZWUgKHN0djY4MC0+ZmJ1Ziwgc3R2NjgwLT5tYXhmcmFtZXNpemUgKiBTVFY2ODBfTlVNRlJBTUVTKTsKKwlzdHY2ODAtPnVzZXIgPSAwOworCisJaWYgKHN0djY4MC0+cmVtb3ZlZCkgeworCQlrZnJlZSAoc3R2NjgwKTsKKwkJc3R2NjgwID0gTlVMTDsKKwkJUERFQlVHICgwLCAiU1RWKGkpOiBkZXZpY2UgdW5yZWdpc3RlcmVkIik7CisJfQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2NjgwX2RvX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisKKwlpZiAoIXN0djY4MC0+dWRldikKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DR0NBUDp7CisJCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqYiA9IGFyZzsKKworCQkJc3RyY3B5IChiLT5uYW1lLCBzdHY2ODAtPmNhbWVyYV9uYW1lKTsKKwkJCWItPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFOworCQkJYi0+Y2hhbm5lbHMgPSAxOworCQkJYi0+YXVkaW9zID0gMDsKKwkJCWItPm1heHdpZHRoID0gc3R2NjgwLT5tYXh3aWR0aDsKKwkJCWItPm1heGhlaWdodCA9IHN0djY4MC0+bWF4aGVpZ2h0OworCQkJYi0+bWlud2lkdGggPSBzdHY2ODAtPm1heHdpZHRoIC8gMjsKKwkJCWItPm1pbmhlaWdodCA9IHN0djY4MC0+bWF4aGVpZ2h0IC8gMjsKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBWSURJT0NHQ0hBTjp7CisJCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKworCQkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXYtPmZsYWdzID0gMDsKKwkJCXYtPnR1bmVycyA9IDA7CisJCQl2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCQlzdHJjcHkgKHYtPm5hbWUsICJTVFYgQ2FtZXJhIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DU0NIQU46eworCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisJCQlpZiAodi0+Y2hhbm5lbCAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ0dQSUNUOnsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCisJCQlzdHY2ODBfZ2V0X3BpY3QgKHN0djY4MCwgcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DU1BJQ1Q6eworCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CisKKwkJCWlmIChzdHY2ODBfc2V0X3BpY3QgKHN0djY4MCwgcCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DU1dJTjp7CisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKKworCQkJaWYgKHZ3LT5mbGFncykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICh2dy0+Y2xpcGNvdW50KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHZ3LT53aWR0aCAhPSBzdHY2ODAtPnZ3aWR0aCkgeworCQkJCWlmIChzdHY2ODBfc2V0X3NpemUgKHN0djY4MCwgdnctPndpZHRoLCB2dy0+aGVpZ2h0KSkgeworCQkJCQlQREVCVUcgKDIsICJTVFYoZSk6IGZhaWxlZCAoZnJvbSB1c2VyKSBzZXQgc2l6ZSBpbiBWSURJT0NTV0lOIik7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBWSURJT0NHV0lOOnsKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCisJCQl2dy0+eCA9IDA7CS8qIEZJWE1FICovCisJCQl2dy0+eSA9IDA7CisJCQl2dy0+Y2hyb21ha2V5ID0gMDsKKwkJCXZ3LT5mbGFncyA9IDA7CisJCQl2dy0+Y2xpcGNvdW50ID0gMDsKKwkJCXZ3LT53aWR0aCA9IHN0djY4MC0+dndpZHRoOworCQkJdnctPmhlaWdodCA9IHN0djY4MC0+dmhlaWdodDsKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBWSURJT0NHTUJVRjp7CisJCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqdm0gPSBhcmc7CisJCQlpbnQgaTsKKworCQkJbWVtc2V0ICh2bSwgMCwgc2l6ZW9mICgqdm0pKTsKKwkJCXZtLT5zaXplID0gU1RWNjgwX05VTUZSQU1FUyAqIHN0djY4MC0+bWF4ZnJhbWVzaXplOworCQkJdm0tPmZyYW1lcyA9IFNUVjY4MF9OVU1GUkFNRVM7CisJCQlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTUZSQU1FUzsgaSsrKQorCQkJCXZtLT5vZmZzZXRzW2ldID0gc3R2NjgwLT5tYXhmcmFtZXNpemUgKiBpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ01DQVBUVVJFOnsKKwkJCXN0cnVjdCB2aWRlb19tbWFwICp2bSA9IGFyZzsKKworCQkJaWYgKHZtLT5mb3JtYXQgIT0gU1RWX1ZJREVPX1BBTEVUVEUpIHsKKwkJCQlQREVCVUcgKDIsICJTVFYoaSk6IFZJRElPQ01DQVBUVVJFIHZtLmZvcm1hdCAoJWkpICE9IFZJREVPX1BBTEVUVEUgKCVpKSIsCisJCQkJCXZtLT5mb3JtYXQsIFNUVl9WSURFT19QQUxFVFRFKTsKKwkJCQlpZiAoKHZtLT5mb3JtYXQgPT0gMykgJiYgKHN3YXBSR0Jfb24gPT0gMCkpICB7CisJCQkJCVBERUJVRyAoMiwgIlNUVihpKTogVklESU9DTUNBUFRVUkUgc3dhcFJHQiBpcyAoYXV0bykgT04iKTsKKwkJCQkJLyogdGhpcyBtYXkgZml4IHRob3NlIGFwcHMgKGUuZy4sIHhhd3R2KSB0aGF0IHdhbnQgQkdSICovCisJCQkJCXN3YXBSR0IgPSAxOworCQkJCX0KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmICh2bS0+ZnJhbWUgPj0gU1RWNjgwX05VTUZSQU1FUykgeworCQkJCVBERUJVRyAoMiwgIlNUVihlKTogVklESU9DTUNBUFRVUkUgdm0uZnJhbWUgPiBOVU1GUkFNRVMiKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmICgoc3R2NjgwLT5mcmFtZVt2bS0+ZnJhbWVdLmdyYWJzdGF0ZSA9PSBGUkFNRV9FUlJPUikKKwkJCSAgICB8fCAoc3R2NjgwLT5mcmFtZVt2bS0+ZnJhbWVdLmdyYWJzdGF0ZSA9PSBGUkFNRV9HUkFCQklORykpIHsKKwkJCQlQREVCVUcgKDIsICJTVFYoZSk6IFZJRElPQ01DQVBUVVJFIGdyYWJzdGF0ZSAoJWkpIGVycm9yIiwKKwkJCQkJc3R2NjgwLT5mcmFtZVt2bS0+ZnJhbWVdLmdyYWJzdGF0ZSk7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCS8qIElzIHRoaXMgYWNjb3JkaW5nIHRvIHRoZSB2NGwgc3BlYz8/PyAqLworCQkJaWYgKHN0djY4MC0+dndpZHRoICE9IHZtLT53aWR0aCkgeworCQkJCWlmIChzdHY2ODBfc2V0X3NpemUgKHN0djY4MCwgdm0tPndpZHRoLCB2bS0+aGVpZ2h0KSkgeworCQkJCQlQREVCVUcgKDIsICJTVFYoZSk6IFZJRElPQ01DQVBUVVJFIHNldF9zaXplIGZhaWxlZCIpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCQlzdHY2ODAtPmZyYW1lW3ZtLT5mcmFtZV0uZ3JhYnN0YXRlID0gRlJBTUVfUkVBRFk7CisKKwkJCWlmICghc3R2NjgwLT5zdHJlYW1pbmcpCisJCQkJc3R2NjgwX3N0YXJ0X3N0cmVhbSAoc3R2NjgwKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ1NZTkM6eworCQkJaW50ICpmcmFtZSA9IGFyZzsKKwkJCWludCByZXQgPSAwOworCisJCQlpZiAoKmZyYW1lIDwgMCB8fCAqZnJhbWUgPj0gU1RWNjgwX05VTUZSQU1FUykgeworCQkJCVBERUJVRyAoMiwgIlNUVihlKTogQmFkIGZyYW1lICMgaW4gVklESU9DU1lOQyIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmV0ID0gc3R2NjgwX25ld2ZyYW1lIChzdHY2ODAsICpmcmFtZSk7CisJCQlzdHY2ODAtPmZyYW1lWypmcmFtZV0uZ3JhYnN0YXRlID0gRlJBTUVfVU5VU0VEOworCQkJcmV0dXJuIHJldDsKKwkJfQorCWNhc2UgVklESU9DR0ZCVUY6eworCQkJc3RydWN0IHZpZGVvX2J1ZmZlciAqdmIgPSBhcmc7CisKKwkJCW1lbXNldCAodmIsIDAsIHNpemVvZiAoKnZiKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DS0VZOgorCQlyZXR1cm4gMDsKKwljYXNlIFZJRElPQ0NBUFRVUkU6CisJCXsKKwkJCVBERUJVRyAoMiwgIlNUVihlKTogVklESU9DQ0FQVFVSRSBmYWlsZWQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJY2FzZSBWSURJT0NTRkJVRjoKKwljYXNlIFZJRElPQ0dUVU5FUjoKKwljYXNlIFZJRElPQ1NUVU5FUjoKKwljYXNlIFZJRElPQ0dGUkVROgorCWNhc2UgVklESU9DU0ZSRVE6CisJY2FzZSBWSURJT0NHQVVESU86CisJY2FzZSBWSURJT0NTQVVESU86CisJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQkJCS8qIGVuZCBzd2l0Y2ggKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0djY4MF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHN0djY4MF9kb19pb2N0bCk7Cit9CisKK3N0YXRpYyBpbnQgc3R2NjgwX21tYXAgKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9zdHYgKnN0djY4MCA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplICA9IHZtYS0+dm1fZW5kLXZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBwYWdlLCBwb3M7CisKKwlkb3duICgmc3R2NjgwLT5sb2NrKTsKKworCWlmIChzdHY2ODAtPnVkZXYgPT0gTlVMTCkgeworCQl1cCAoJnN0djY4MC0+bG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoc2l6ZSA+ICgoKFNUVjY4MF9OVU1GUkFNRVMgKiBzdHY2ODAtPm1heGZyYW1lc2l6ZSkgKyBQQUdFX1NJWkUgLSAxKQorCQkgICAgJiB+KFBBR0VfU0laRSAtIDEpKSkgeworCQl1cCAoJnN0djY4MC0+bG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwb3MgPSAodW5zaWduZWQgbG9uZykgc3R2NjgwLT5mYnVmOworCXdoaWxlIChzaXplID4gMCkgeworCQlwYWdlID0gdm1hbGxvY190b19wZm4oKHZvaWQgKilwb3MpOworCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsIHBhZ2UsIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKSB7CisJCQl1cCAoJnN0djY4MC0+bG9jayk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQlzdGFydCArPSBQQUdFX1NJWkU7CisJCXBvcyArPSBQQUdFX1NJWkU7CisJCWlmIChzaXplID4gUEFHRV9TSVpFKQorCQkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJCWVsc2UKKwkJCXNpemUgPSAwOworCX0KKwl1cCAoJnN0djY4MC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc3R2NjgwX3JlYWQgKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgaW50IHJlYWxjb3VudCA9IGNvdW50OworCWludCByZXQgPSAwOworCXN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgaW50IGk7CisKKwlpZiAoU1RWNjgwX05VTUZSQU1FUyAhPSAyKSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogU1RWNjgwX05VTUZSQU1FUyBuZWVkcyB0byBiZSAyISIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChzdHY2ODAtPnVkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJaWYgKHJlYWxjb3VudCA+IChzdHY2ODAtPnZ3aWR0aCAqIHN0djY4MC0+dmhlaWdodCAqIDMpKQorCQlyZWFsY291bnQgPSBzdHY2ODAtPnZ3aWR0aCAqIHN0djY4MC0+dmhlaWdodCAqIDM7CisKKwkvKiBTaG91bGRuJ3QgaGFwcGVuOiAqLworCWlmIChzdHY2ODAtPmZyYW1lWzBdLmdyYWJzdGF0ZSA9PSBGUkFNRV9HUkFCQklORykgeworCQlQREVCVUcgKDIsICJTVFYoZSk6IEZSQU1FX0dSQUJCSU5HIGluIHN0djY4MF9yZWFkIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXN0djY4MC0+ZnJhbWVbMF0uZ3JhYnN0YXRlID0gRlJBTUVfUkVBRFk7CisJc3R2NjgwLT5mcmFtZVsxXS5ncmFic3RhdGUgPSBGUkFNRV9VTlVTRUQ7CisJc3R2NjgwLT5jdXJmcmFtZSA9IDA7CisKKwlpZiAoIXN0djY4MC0+c3RyZWFtaW5nKQorCQlzdHY2ODBfc3RhcnRfc3RyZWFtIChzdHY2ODApOworCisJaWYgKCFzdHY2ODAtPnN0cmVhbWluZykgeworCQlyZXQgPSBzdHY2ODBfbmV3ZnJhbWUgKHN0djY4MCwgMCk7CS8qIHJldCBzaG91bGQgPSAwICovCisJfQorCisJcmV0ID0gc3R2NjgwX25ld2ZyYW1lIChzdHY2ODAsIDApOworCisJaWYgKCFyZXQpIHsKKwkJaWYgKChpID0gY29weV90b191c2VyIChidWYsIHN0djY4MC0+ZnJhbWVbMF0uZGF0YSwgcmVhbGNvdW50KSkgIT0gMCkgeworCQkJUERFQlVHICgyLCAiU1RWKGUpOiBjb3B5X3RvX3VzZXIgZnJhbWUgMCBmYWlsZWQsIHJldCBjb3VudCA9ICVsaSIsIGkpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UgeworCQlyZWFsY291bnQgPSByZXQ7CisJfQorCXN0djY4MC0+ZnJhbWVbMF0uZ3JhYnN0YXRlID0gRlJBTUVfVU5VU0VEOworCXJldHVybiByZWFsY291bnQ7Cit9CQkJCS8qIHN0djY4MF9yZWFkICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN0djY4MF9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5vcGVuID0JCXN0dl9vcGVuLAorCS5yZWxlYXNlID0gICAgIAlzdHZfY2xvc2UsCisJLnJlYWQgPQkJc3R2NjgwX3JlYWQsCisJLm1tYXAgPQkJc3R2NjgwX21tYXAsCisJLmlvY3RsID0gICAgICAgIHN0djY4MF9pb2N0bCwKKwkubGxzZWVrID0gICAgICAgbm9fbGxzZWVrLAorfTsKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHN0djY4MF90ZW1wbGF0ZSA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkiU1RWMDY4MCBVU0IgY2FtZXJhIiwKKwkudHlwZSA9CQlWSURfVFlQRV9DQVBUVVJFLAorCS5oYXJkd2FyZSA9CVZJRF9IQVJEV0FSRV9TRTQwMSwKKwkuZm9wcyA9ICAgICAgICAgJnN0djY4MF9mb3BzLAorCS5yZWxlYXNlID0JdmlkZW9fZGV2aWNlX3JlbGVhc2UsCisJLm1pbm9yID0gCS0xLAorfTsKKworc3RhdGljIGludCBzdHY2ODBfcHJvYmUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAgPSBOVUxMOworCWNoYXIgKmNhbWVyYV9uYW1lID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gMDsKKworCS8qIFdlIGRvbid0IGhhbmRsZSBtdWx0aS1jb25maWcgY2FtZXJhcyAqLworCWlmIChkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpIHsKKwkJUERFQlVHICgwLCAiU1RWKGUpOiBOdW1iZXIgb2YgQ29uZmlndXJhdGlvbnMgIT0gMSIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbnRlcmZhY2UgPSAmaW50Zi0+YWx0c2V0dGluZ1swXTsKKwkvKiBJcyBpdCBhIFNUVjY4MD8gKi8KKwlpZiAoKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gVVNCX1BFTkNBTV9WRU5ET1JfSUQpICYmCisJICAgIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfUEVOQ0FNX1BST0RVQ1RfSUQpKSB7CisJCWNhbWVyYV9uYW1lID0gIlNUVjA2ODAiOworCQlQREVCVUcgKDAsICJTVFYoaSk6IFNUVjA2ODAgY2FtZXJhIGZvdW5kLiIpOworCX0gZWxzZSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogVmVuZG9yL1Byb2R1Y3QgSUQgZG8gbm90IG1hdGNoIFNUVjA2ODAgdmFsdWVzLiIpOworCQlQREVCVUcgKDAsICJTVFYoZSk6IENoZWNrIHRoYXQgdGhlIFNUVjA2ODAgY2FtZXJhIGlzIGNvbm5lY3RlZCB0byB0aGUgY29tcHV0ZXIuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFdlIGZvdW5kIG9uZSAqLworCWlmICgoc3R2NjgwID0ga21hbGxvYyAoc2l6ZW9mICgqc3R2NjgwKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJUERFQlVHICgwLCAiU1RWKGUpOiBjb3VsZG4ndCBrbWFsbG9jIHN0djY4MCBzdHJ1Y3QuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJbWVtc2V0IChzdHY2ODAsIDAsIHNpemVvZiAoKnN0djY4MCkpOworCisJc3R2NjgwLT51ZGV2ID0gZGV2OworCXN0djY4MC0+Y2FtZXJhX25hbWUgPSBjYW1lcmFfbmFtZTsKKworCXN0djY4MC0+dmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmICghc3R2NjgwLT52ZGV2KSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCW1lbWNweShzdHY2ODAtPnZkZXYsICZzdHY2ODBfdGVtcGxhdGUsIHNpemVvZihzdHY2ODBfdGVtcGxhdGUpKTsKKwlzdHY2ODAtPnZkZXYtPmRldiA9ICZpbnRmLT5kZXY7CisJdmlkZW9fc2V0X2RydmRhdGEoc3R2NjgwLT52ZGV2LCBzdHY2ODApOworCisJbWVtY3B5IChzdHY2ODAtPnZkZXYtPm5hbWUsIHN0djY4MC0+Y2FtZXJhX25hbWUsIHN0cmxlbiAoc3R2NjgwLT5jYW1lcmFfbmFtZSkpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZzdHY2ODAtPndxKTsKKwlpbml0X01VVEVYICgmc3R2NjgwLT5sb2NrKTsKKwl3bWIgKCk7CisKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlIChzdHY2ODAtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKSA9PSAtMSkgeworCQlQREVCVUcgKDAsICJTVFYoZSk6IHZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQiKTsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlcnJvcl92ZGV2OworCX0KKwlQREVCVUcgKDAsICJTVFYoaSk6IHJlZ2lzdGVyZWQgbmV3IHZpZGVvIGRldmljZTogdmlkZW8lZCIsIHN0djY4MC0+dmRldi0+bWlub3IpOworCisJdXNiX3NldF9pbnRmZGF0YSAoaW50Ziwgc3R2NjgwKTsKKwlzdHY2ODBfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0djY4MC0+dmRldik7CisJcmV0dXJuIDA7CisKK2Vycm9yX3ZkZXY6CisJdmlkZW9fZGV2aWNlX3JlbGVhc2Uoc3R2NjgwLT52ZGV2KTsKK2Vycm9yOgorCWtmcmVlKHN0djY4MCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVzYl9zdHY2ODBfcmVtb3ZlX2Rpc2Nvbm5lY3RlZCAoc3RydWN0IHVzYl9zdHYgKnN0djY4MCkKK3sKKwlpbnQgaTsKKworCXN0djY4MC0+dWRldiA9IE5VTEw7CisJc3R2NjgwLT5mcmFtZVswXS5ncmFic3RhdGUgPSBGUkFNRV9FUlJPUjsKKwlzdHY2ODAtPmZyYW1lWzFdLmdyYWJzdGF0ZSA9IEZSQU1FX0VSUk9SOworCXN0djY4MC0+c3RyZWFtaW5nID0gMDsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnN0djY4MC0+d3EpOworCisJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQlVGOyBpKyspCisJCWlmIChzdHY2ODAtPnVyYltpXSkgeworCQkJdXNiX2tpbGxfdXJiIChzdHY2ODAtPnVyYltpXSk7CisJCQl1c2JfZnJlZV91cmIgKHN0djY4MC0+dXJiW2ldKTsKKwkJCXN0djY4MC0+dXJiW2ldID0gTlVMTDsKKwkJCWtmcmVlIChzdHY2ODAtPnNidWZbaV0uZGF0YSk7CisJCX0KKwlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTVNDUkFUQ0g7IGkrKykKKwkJa2ZyZWUgKHN0djY4MC0+c2NyYXRjaFtpXS5kYXRhKTsKKwlQREVCVUcgKDAsICJTVFYoaSk6ICVzIGRpc2Nvbm5lY3RlZCIsIHN0djY4MC0+Y2FtZXJhX25hbWUpOworCisJLyogRnJlZSB0aGUgbWVtb3J5ICovCisJa2ZyZWUgKHN0djY4MCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0djY4MF9kaXNjb25uZWN0IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisKKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBOVUxMKTsKKworCWlmIChzdHY2ODApIHsKKwkJLyogV2UgZG9uJ3Qgd2FudCBwZW9wbGUgdHJ5aW5nIHRvIG9wZW4gdXAgdGhlIGRldmljZSAqLworCQlpZiAoc3R2NjgwLT52ZGV2KSB7CisJCQlzdHY2ODBfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHN0djY4MC0+dmRldik7CisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShzdHY2ODAtPnZkZXYpOworCQkJc3R2NjgwLT52ZGV2ID0gTlVMTDsKKwkJfQorCQlpZiAoIXN0djY4MC0+dXNlcikgeworCQkJdXNiX3N0djY4MF9yZW1vdmVfZGlzY29ubmVjdGVkIChzdHY2ODApOworCQl9IGVsc2UgeworCQkJc3R2NjgwLT5yZW1vdmVkID0gMTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHN0djY4MF9kcml2ZXIgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJInN0djY4MCIsCisJLnByb2JlID0Jc3R2NjgwX3Byb2JlLAorCS5kaXNjb25uZWN0ID0Jc3R2NjgwX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JZGV2aWNlX3RhYmxlCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBNb2R1bGUgcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2luaXQgdXNiX3N0djY4MF9pbml0ICh2b2lkKQoreworCWlmICh1c2JfcmVnaXN0ZXIgKCZzdHY2ODBfZHJpdmVyKSA8IDApIHsKKwkJUERFQlVHICgwLCAiU1RWKGUpOiBDb3VsZCBub3Qgc2V0dXAgU1RWMDY4MCBkcml2ZXIiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlQREVCVUcgKDAsICJTVFYoaSk6IHVzYiBjYW1lcmEgZHJpdmVyIHZlcnNpb24gJXMgcmVnaXN0ZXJpbmciLCBEUklWRVJfVkVSU0lPTik7CisKKwlpbmZvKERSSVZFUl9ERVNDICIgIiBEUklWRVJfVkVSU0lPTik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2Jfc3R2NjgwX2V4aXQgKHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIgKCZzdHY2ODBfZHJpdmVyKTsKKwlQREVCVUcgKDAsICJTVFYoaSk6IGRyaXZlciBkZXJlZ2lzdGVyZWQiKTsKK30KKworbW9kdWxlX2luaXQgKHVzYl9zdHY2ODBfaW5pdCk7Cittb2R1bGVfZXhpdCAodXNiX3N0djY4MF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3N0djY4MC5oIGIvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwZTMxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuaApAQCAtMCwwICsxLDIyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRmlsZW5hbWU6IHN0djY4MC5oCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgIFRoaXMgaXMgYSBVU0IgZHJpdmVyIGZvciBTVFYwNjgwIGJhc2VkIHVzYiB2aWRlbyBjYW1lcmFzLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc2l6ZSBvZiB1c2IgdHJhbnNmZXJzICovCisjZGVmaW5lIFNUVjY4MF9QQUNLRVRTSVpFCTQwOTYKKworLyogbnVtYmVyIG9mIHF1ZXVlZCBidWxrIHRyYW5zZmVycyB0byB1c2UsIG1heSBoYXZlIHByb2JsZW1zIGlmID4gMSAqLworI2RlZmluZSBTVFY2ODBfTlVNU0JVRgkJMQorCisvKiBudW1iZXIgb2YgZnJhbWVzIHN1cHBvcnRlZCBieSB0aGUgdjRsIHBhcnQgKi8KKyNkZWZpbmUgU1RWNjgwX05VTUZSQU1FUwkyCisKKy8qIHNjcmF0Y2ggYnVmZmVycyBmb3IgcGFzc2luZyBkYXRhIHRvIHRoZSBkZWNvZGVyczogMiBvciA0IGFyZSBnb29kICovCisjZGVmaW5lIFNUVjY4MF9OVU1TQ1JBVENICTIKKworLyogbnVtYmVyIG9mIG51bCBzaXplZCBwYWNrZXRzIHRvIHJlY2VpdmUgYmVmb3JlIGtpY2tpbmcgdGhlIGNhbWVyYSAqLworI2RlZmluZSBTVFY2ODBfTUFYX05VTExQQUNLRVRTCTIwMAorCisvKiBudW1iZXIgb2YgZGVjb2RpbmcgZXJyb3JzIGJlZm9yZSBraWNraW5nIHRoZSBjYW1lcmEgKi8KKyNkZWZpbmUgU1RWNjgwX01BWF9FUlJPUlMJMTAwCisKKyNkZWZpbmUgVVNCX1BFTkNBTV9WRU5ET1JfSUQJMHgwNTUzCisjZGVmaW5lIFVTQl9QRU5DQU1fUFJPRFVDVF9JRAkweDAyMDIKKyNkZWZpbmUgUEVOQ0FNX1RJTUVPVVQgICAgICAgICAgMTAwMAorLyogZm10IDQgKi8KKyNkZWZpbmUgU1RWX1ZJREVPX1BBTEVUVEUgICAgICAgVklERU9fUEFMRVRURV9SR0IyNAorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UgKFVTQl9QRU5DQU1fVkVORE9SX0lELCBVU0JfUEVOQ0FNX1BST0RVQ1RfSUQpfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgZGV2aWNlX3RhYmxlKTsKKworc3RydWN0IHN0djY4MF9zYnVmIHsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworfTsKKworZW51bSB7CisJRlJBTUVfVU5VU0VELAkJLyogVW51c2VkIChubyBNQ0FQVFVSRSkgKi8KKwlGUkFNRV9SRUFEWSwJCS8qIFJlYWR5IHRvIHN0YXJ0IGdyYWJiaW5nICovCisJRlJBTUVfR1JBQkJJTkcsCQkvKiBJbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBncmFiYmVkIGludG8gKi8KKwlGUkFNRV9ET05FLAkJLyogRmluaXNoZWQgZ3JhYmJpbmcsIGJ1dCBub3QgYmVlbiBzeW5jZWQgeWV0ICovCisJRlJBTUVfRVJST1IsCQkvKiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkIHdoaWxlIHByb2Nlc3NpbmcgKi8KK307CisKK2VudW0geworCUJVRkZFUl9VTlVTRUQsCisJQlVGRkVSX1JFQURZLAorCUJVRkZFUl9CVVNZLAorCUJVRkZFUl9ET05FLAorfTsKKworLyogcmF3IGNhbWVyYSBkYXRhIDwtIHNidWYgKHVyYiB0cmFuc2ZlciBidWYpICovCitzdHJ1Y3Qgc3R2NjgwX3NjcmF0Y2ggeworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdm9sYXRpbGUgaW50IHN0YXRlOworCWludCBvZmZzZXQ7CisJaW50IGxlbmd0aDsKK307CisKKy8qIHByb2Nlc3NlZCBkYXRhIGZvciBkaXNwbGF5IGVuZHMgdXAgaGVyZSwgYWZ0ZXIgYmF5ZXIgKi8KK3N0cnVjdCBzdHY2ODBfZnJhbWUgeworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CS8qIEZyYW1lIGJ1ZmZlciAqLworCXZvbGF0aWxlIGludCBncmFic3RhdGU7CS8qIFN0YXRlIG9mIGdyYWJiaW5nICovCisJdW5zaWduZWQgY2hhciAqY3VybGluZTsKKwlpbnQgY3VybGluZXBpeDsKKwlpbnQgY3VycGl4OworfTsKKworLyogdGhpcyBpcyBhbG1vc3QgdGhlIHZpZGVvIHN0cnVjdHVyZSB1dmRfdCwgd2l0aCBleHRyYSBwYXJhbWV0ZXJzIGZvciBzdHYgKi8KK3N0cnVjdCB1c2Jfc3R2IHsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OworCisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisKKwl1bnNpZ25lZCBjaGFyIGJ1bGtfaW5fZW5kcG9pbnRBZGRyOwkvKiBfX3U4ICB0aGUgYWRkcmVzcyBvZiB0aGUgYnVsayBpbiBlbmRwb2ludCAqLworCWNoYXIgKmNhbWVyYV9uYW1lOworCisJdW5zaWduZWQgaW50IFZpZGVvTW9kZTsJLyogMHgwMTAwID0gVkdBLCAweDAwMDAgPSBDSUYsIDB4MDMwMCA9IFFWR0EgKi8KKwlpbnQgU3VwcG9ydGVkTW9kZXM7CisJaW50IENJRjsKKwlpbnQgVkdBOworCWludCBRVkdBOworCWludCBjd2lkdGg7CQkvKiBjYW1lcmEgd2lkdGggKi8KKwlpbnQgY2hlaWdodDsJCS8qIGNhbWVyYSBoZWlnaHQgKi8KKwlpbnQgbWF4d2lkdGg7CQkvKiBtYXggdmlkZW8gd2lkdGggKi8KKwlpbnQgbWF4aGVpZ2h0OwkJLyogbWF4IHZpZGVvIGhlaWdodCAqLworCWludCB2d2lkdGg7CQkvKiBjdXJyZW50IHdpZHRoIGZvciB2aWRlbyB3aW5kb3cgKi8KKwlpbnQgdmhlaWdodDsJCS8qIGN1cnJlbnQgaGVpZ2h0IGZvciB2aWRlbyB3aW5kb3cgKi8KKwl1bnNpZ25lZCBsb25nIGludCByYXdidWZzaXplOworCXVuc2lnbmVkIGxvbmcgaW50IG1heGZyYW1lc2l6ZTsJLyogcmF3YnVmc2l6ZSAqIDMgZm9yIFJHQiAqLworCisJaW50IG9yaWdHYWluOworCWludCBvcmlnTW9kZTsJCS8qIG9yaWdpbmFsIGNhbWVyYSBtb2RlICovCisKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CS8qIHRvIGxvY2sgdGhlIHN0cnVjdHVyZSAqLworCWludCB1c2VyOwkJLyogdXNlciBjb3VudCBmb3IgZXhjbHVzaXZlIHVzZSAqLworCWludCByZW1vdmVkOwkJLyogZGV2aWNlIGRpc2Nvbm5lY3RlZCAqLworCWludCBzdHJlYW1pbmc7CQkvKiBBcmUgd2Ugc3RyZWFtaW5nIHZpZGVvPyAqLworCWNoYXIgKmZidWY7CQkvKiBWaWRlb2RldiBidWZmZXIgYXJlYSAqLworCXN0cnVjdCB1cmIgKnVyYltTVFY2ODBfTlVNU0JVRl07CS8qICMgb2YgcXVldWVkIGJ1bGsgdHJhbnNmZXJzICovCisJaW50IGN1cmZyYW1lOwkJLyogQ3VycmVudCByZWNlaXZpbmcgZnJhbWUgKi8KKwlzdHJ1Y3Qgc3R2NjgwX2ZyYW1lIGZyYW1lW1NUVjY4MF9OVU1GUkFNRVNdOwkvKiAjIGZyYW1lcyBzdXBwb3J0ZWQgYnkgdjRsIHBhcnQgKi8KKwlpbnQgcmVhZGNvdW50OworCWludCBmcmFtZWNvdW50OworCWludCBlcnJvcjsKKwlpbnQgZHJvcHBlZDsKKwlpbnQgc2NyYXRjaF9uZXh0OworCWludCBzY3JhdGNoX3VzZTsKKwlpbnQgc2NyYXRjaF9vdmVyZmxvdzsKKwlzdHJ1Y3Qgc3R2NjgwX3NjcmF0Y2ggc2NyYXRjaFtTVFY2ODBfTlVNU0NSQVRDSF07CS8qIGZvciBkZWNvZGVycyAqLworCXN0cnVjdCBzdHY2ODBfc2J1ZiBzYnVmW1NUVjY4MF9OVU1TQlVGXTsKKworCXVuc2lnbmVkIGludCBicmlnaHRuZXNzOworCXVuc2lnbmVkIGludCBjaGdicmlnaHQ7CisJdW5zaWduZWQgaW50IHdoaXRlbmVzczsKKwl1bnNpZ25lZCBpbnQgY29sb3VyOworCXVuc2lnbmVkIGludCBjb250cmFzdDsKKwl1bnNpZ25lZCBpbnQgaHVlOworCXVuc2lnbmVkIGludCBwYWxldHRlOworCXVuc2lnbmVkIGludCBkZXB0aDsJLyogcmdiMjQgaW4gYml0cyAqLworCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CS8qIFByb2Nlc3NlcyB3YWl0aW5nICovCisKKwlpbnQgbnVsbHBhY2tldHM7Cit9OworCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlZFsyNTZdID0geyAKKwkwLCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIAorCTE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAyNSwgMzAsIDM1LCAzOCwgNDIsIAorCTQ0LCA0NywgNTAsIDUzLCA1NCwgNTcsIDU5LCA2MSwgNjMsIDY1LCA2NywgNjksIAorCTcxLCA3MSwgNzMsIDc1LCA3NywgNzgsIDgwLCA4MSwgODIsIDg0LCA4NSwgODcsIAorCTg4LCA4OSwgOTAsIDkxLCA5MywgOTQsIDk1LCA5NywgOTgsIDk4LCA5OSwgMTAxLCAKKwkxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAKKwkxMTQsIDExNSwgMTE2LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAKKwkxMjUsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAKKwkxMzQsIDEzNSwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQwLCAxNDEsIDE0MiwgMTQzLCAKKwkxNDMsIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MCwgMTUxLCAKKwkxNTIsIDE1MiwgMTUyLCAxNTMsIDE1NCwgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTcsIDE1OCwgMTU5LCAKKwkxNTksIDE2MCwgMTYxLCAxNjEsIDE2MSwgMTYyLCAxNjMsIDE2MywgMTY0LCAxNjUsIDE2NSwgMTY2LCAKKwkxNjcsIDE2NywgMTY4LCAxNjgsIDE2OSwgMTcwLCAxNzAsIDE3MCwgMTcxLCAxNzEsIDE3MiwgMTczLCAKKwkxNzMsIDE3NCwgMTc0LCAxNzUsIDE3NiwgMTc2LCAxNzcsIDE3OCwgMTc4LCAxNzksIDE3OSwgMTc5LCAKKwkxODAsIDE4MCwgMTgxLCAxODEsIDE4MiwgMTgzLCAxODMsIDE4NCwgMTg0LCAxODUsIDE4NSwgMTg2LCAKKwkxODcsIDE4NywgMTg4LCAxODgsIDE4OCwgMTg4LCAxODksIDE5MCwgMTkwLCAxOTEsIDE5MSwgMTkyLCAKKwkxOTIsIDE5MywgMTkzLCAxOTQsIDE5NSwgMTk1LCAxOTYsIDE5NiwgMTk3LCAxOTcsIDE5NywgMTk3LCAKKwkxOTgsIDE5OCwgMTk5LCAxOTksIDIwMCwgMjAxLCAyMDEsIDIwMiwgMjAyLCAyMDMsIDIwMywgMjA0LCAKKwkyMDQsIDIwNSwgMjA1LCAyMDYsIDIwNiwgMjA2LCAyMDYsIDIwNywgMjA3LCAyMDgsIDIwOCwgMjA5LCAKKwkyMDksIDIxMCwgMjEwLCAyMTEsIDIxMSwgMjEyLCAyMTIsIDIxMywgMjEzLCAyMTQsIDIxNCwgMjE1LCAKKwkyMTUsIDIxNSwgMjE1LCAyMTYsIDIxNiwgMjE3LCAyMTcsIDIxOCwgMjE4LCAyMTgsIDIxOSwgMjE5LCAKKwkyMjAsIDIyMCwgMjIxLCAyMjEgCit9OyAKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3JlZW5bMjU2XSA9IHsKKwkwLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIAorCTIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyOCwgMzQsIDM5LCA0MywgNDcsIAorCTUwLCA1MywgNTYsIDU5LCA2MSwgNjQsIDY2LCA2OCwgNzEsIDczLCA3NSwgNzcsIAorCTc5LCA4MCwgODIsIDg0LCA4NiwgODcsIDg5LCA5MSwgOTIsIDk0LCA5NSwgOTcsIAorCTk4LCAxMDAsIDEwMSwgMTAyLCAxMDQsIDEwNSwgMTA2LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMywgCisJMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgCisJMTI3LCAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgCisJMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgCisJMTUwLCAxNTEsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NiwgMTU3LCAxNTgsIDE1OSwgCisJMTYwLCAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY0LCAxNjUsIDE2NiwgMTY3LCAxNjcsIDE2OCwgCisJMTY5LCAxNzAsIDE3MCwgMTcxLCAxNzIsIDE3MiwgMTczLCAxNzQsIDE3NSwgMTc1LCAxNzYsIDE3NywgCisJMTc3LCAxNzgsIDE3OSwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODIsIDE4MywgMTg0LCAxODQsIDE4NSwgCisJMTg2LCAxODYsIDE4NywgMTg3LCAxODgsIDE4OSwgMTg5LCAxOTAsIDE5MSwgMTkxLCAxOTIsIDE5MywgCisJMTkzLCAxOTQsIDE5NCwgMTk1LCAxOTYsIDE5NiwgMTk3LCAxOTgsIDE5OCwgMTk5LCAxOTksIDIwMCwgCisJMjAxLCAyMDEsIDIwMiwgMjAyLCAyMDMsIDIwNCwgMjA0LCAyMDUsIDIwNSwgMjA2LCAyMDYsIDIwNywgCisJMjA4LCAyMDgsIDIwOSwgMjA5LCAyMTAsIDIxMCwgMjExLCAyMTIsIDIxMiwgMjEzLCAyMTMsIDIxNCwgCisJMjE0LCAyMTUsIDIxNSwgMjE2LCAyMTcsIDIxNywgMjE4LCAyMTgsIDIxOSwgMjE5LCAyMjAsIDIyMCwgCisJMjIxLCAyMjEsIDIyMiwgMjIyLCAyMjMsIDIyNCwgMjI0LCAyMjUsIDIyNSwgMjI2LCAyMjYsIDIyNywgCisJMjI3LCAyMjgsIDIyOCwgMjI5LCAyMjksIDIzMCwgMjMwLCAyMzEsIDIzMSwgMjMyLCAyMzIsIDIzMywgCisJMjMzLCAyMzQsIDIzNCwgMjM1LCAyMzUsIDIzNiwgMjM2LCAyMzcsIDIzNywgMjM4LCAyMzgsIDIzOSwgCisJMjM5LCAyNDAsIDI0MCwgMjQxLCAyNDEsIDI0MiwgMjQyLCAyNDMsIDI0MywgMjQzLCAyNDQsIDI0NCwgCisJMjQ1LCAyNDUsIDI0NiwgMjQ2IAorfTsgCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJsdWVbMjU2XSA9IHsKKwkwLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIAorCTIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAzMCwgMzcsIDQyLCA0NywgNTEsIAorCTU1LCA1OCwgNjEsIDY0LCA2NywgNzAsIDcyLCA3NCwgNzgsIDgwLCA4MiwgODQsIAorCTg2LCA4OCwgOTAsIDkyLCA5NCwgOTUsIDk3LCAxMDAsIDEwMSwgMTAzLCAxMDQsIDEwNiwgCisJMTA3LCAxMTAsIDExMSwgMTEyLCAxMTQsIDExNSwgMTE2LCAxMTgsIDExOSwgMTIxLCAxMjIsIDEyNCwgCisJMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgCisJMTM5LCAxNDAsIDE0MSwgMTQzLCAxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgCisJMTUyLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU4LCAxNTksIDE2MCwgMTYxLCAxNjIsIDE2MywgCisJMTY1LCAxNjYsIDE2NiwgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MSwgMTcyLCAxNzMsIDE3NCwgCisJMTc2LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgwLCAxODEsIDE4MiwgMTgzLCAxODMsIDE4NCwgCisJMTg1LCAxODcsIDE4NywgMTg4LCAxODksIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkyLCAxOTMsIDE5NCwgCisJMTk0LCAxOTUsIDE5NiwgMTk2LCAxOTgsIDE5OSwgMjAwLCAyMDAsIDIwMSwgMjAyLCAyMDIsIDIwMywgCisJMjA0LCAyMDQsIDIwNSwgMjA1LCAyMDYsIDIwNywgMjA3LCAyMDksIDIxMCwgMjEwLCAyMTEsIDIxMiwgCisJMjEyLCAyMTMsIDIxMywgMjE0LCAyMTUsIDIxNSwgMjE2LCAyMTcsIDIxNywgMjE4LCAyMTgsIDIyMCwgCisJMjIxLCAyMjEsIDIyMiwgMjIyLCAyMjMsIDIyNCwgMjI0LCAyMjUsIDIyNSwgMjI2LCAyMjYsIDIyNywgCisJMjI4LCAyMjgsIDIyOSwgMjI5LCAyMzEsIDIzMSwgMjMyLCAyMzMsIDIzMywgMjM0LCAyMzQsIDIzNSwgCisJMjM1LCAyMzYsIDIzNiwgMjM3LCAyMzgsIDIzOCwgMjM5LCAyMzksIDI0MCwgMjQwLCAyNDIsIDI0MiwgCisJMjQzLCAyNDMsIDI0NCwgMjQ0LCAyNDUsIDI0NiwgMjQ2LCAyNDcsIDI0NywgMjQ4LCAyNDgsIDI0OSwgCisJMjQ5LCAyNTAsIDI1MCwgMjUxLCAyNTEsIDI1MywgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgCisJMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgCisJMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgCisJMjU1LCAyNTUsIDI1NSwgMjU1IAorfTsgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS91bHRyYWNhbS5jIGIvZHJpdmVycy91c2IvbWVkaWEvdWx0cmFjYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWZmNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvdWx0cmFjYW0uYwpAQCAtMCwwICsxLDY3OSBAQAorLyoKKyAqIFVTQiBOQiBDYW1lcmEgZHJpdmVyCisgKgorICogSElTVE9SWToKKyAqIDI1LURlYy0yMDAyIERtaXRyaSAgICAgIFJlbW92ZWQgbGlnaHRpbmcsIHNoYXJwbmVzcyBwYXJhbWV0ZXJzLCBtZXRob2RzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgInVzYnZpZGVvLmgiCisKKyNkZWZpbmUJVUxUUkFDQU1fVkVORE9SX0lECTB4MDQ2MQorI2RlZmluZQlVTFRSQUNBTV9QUk9EVUNUX0lECTB4MDgxMworCisjZGVmaW5lIE1BWF9DQU1FUkFTCQk0CS8qIEhvdyBtYW55IGRldmljZXMgd2UgYWxsb3cgdG8gY29ubmVjdCAqLworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgbGl2ZXMgaW4gdXZkX3QtPnVzZXIgZmllbGQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgaW5pdGlhbGl6ZWQ7CS8qIEhhZCB3ZSBhbHJlYWR5IHNlbnQgaW5pdCBzZXF1ZW5jZT8gKi8KKwlpbnQgY2FtZXJhX21vZGVsOwkvKiBXaGF0IHR5cGUgb2YgSUJNIGNhbWVyYSB3ZSBnb3Q/ICovCisgICAgICAgIGludCBoYXNfaGRyOworfSB1bHRyYWNhbV90OworI2RlZmluZQlVTFRSQUNBTV9UKHV2ZCkJKCh1bHRyYWNhbV90ICopKCh1dmQpLT51c2VyX2RhdGEpKQorCitzdGF0aWMgc3RydWN0IHVzYnZpZGVvICpjYW1zID0gTlVMTDsKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7CisKK3N0YXRpYyBpbnQgZmxhZ3MgPSAwOyAvKiBGTEFHU19ESVNQTEFZX0hJTlRTIHwgRkxBR1NfT1ZFUkxBWV9TVEFUUzsgKi8KKworc3RhdGljIGNvbnN0IGludCBtaW5fY2FudmFzV2lkdGggID0gODsKK3N0YXRpYyBjb25zdCBpbnQgbWluX2NhbnZhc0hlaWdodCA9IDQ7CisKKyNkZWZpbmUgRlJBTUVSQVRFX01JTgkwCisjZGVmaW5lIEZSQU1FUkFURV9NQVgJNgorc3RhdGljIGludCBmcmFtZXJhdGUgPSAtMTsKKworLyoKKyAqIEhlcmUgd2UgZGVmaW5lIHNldmVyYWwgaW5pdGlhbGl6YXRpb24gdmFyaWFibGVzLiBUaGV5IG1heQorICogYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IHNldCBjb2xvciwgaHVlLCBicmlnaHRuZXNzIGFuZAorICogY29udHJhc3QgdG8gZGVzaXJlZCB2YWx1ZXMuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBpbgorICogY2FzZSBvZiB3ZWJjYW1zICh3aGljaCBoYXZlIG5vIGNvbnRyb2xzIGFuZCBubyBvbi1zY3JlZW4KKyAqIG91dHB1dCkgYW5kIGFsc28gd2hlbiBhIGNsaWVudCBWNEwgc29mdHdhcmUgaXMgdXNlZCB0aGF0CisgKiBkb2VzIG5vdCBoYXZlIHNvbWUgb2YgdGhvc2UgY29udHJvbHMuIEluIGFueSBjYXNlIGl0J3MKKyAqIGdvb2QgdG8gaGF2ZSBzdGFydHVwIHZhbHVlcyBhcyBvcHRpb25zLgorICoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgYWxsIGluIFswLi4yNTVdIHJhbmdlLiBUaGlzIHNpbXBsaWZpZXMKKyAqIG9wZXJhdGlvbi4gTm90ZSB0aGF0IGFjdHVhbCB2YWx1ZXMgb2YgVjRMIHZhcmlhYmxlcyBtYXkKKyAqIGJlIHNjYWxlZCB1cCAoYXMgbXVjaCBhcyA8PCA4KS4gVXNlciBjYW4gc2VlIHRoYXQgb25seQorICogb24gb3ZlcmxheSBvdXRwdXQsIGhvd2V2ZXIsIG9yIHRocm91Z2ggYSBWNEwgY2xpZW50LgorICovCitzdGF0aWMgaW50IGluaXRfYnJpZ2h0bmVzcyA9IDEyODsKK3N0YXRpYyBpbnQgaW5pdF9jb250cmFzdCA9IDE5MjsKK3N0YXRpYyBpbnQgaW5pdF9jb2xvciA9IDEyODsKK3N0YXRpYyBpbnQgaW5pdF9odWUgPSAxMjg7CitzdGF0aWMgaW50IGh1ZV9jb3JyZWN0aW9uID0gMTI4OworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsOiAwLTkgKGRlZmF1bHQ9MCkiKTsKK21vZHVsZV9wYXJhbShmbGFncywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZmxhZ3MsCisJCSJCaXRmaWVsZDogMD1WSURJT0NTWU5DLCAiCisJCSIxPUIvVywgIgorCQkiMj1zaG93IGhpbnRzLCAiCisJCSIzPXNob3cgc3RhdHMsICIKKwkJIjQ9dGVzdCBwYXR0ZXJuLCAiCisJCSI1PXNlcGFyYXRlIGZyYW1lcywgIgorCQkiNj1jbGVhbiBmcmFtZXMiKTsKK21vZHVsZV9wYXJhbShmcmFtZXJhdGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZyYW1lcmF0ZSwgIkZyYW1lcmF0ZSBzZXR0aW5nOiAwPXNsb3dlc3QsIDY9ZmFzdGVzdCAoZGVmYXVsdD0yKSIpOworCittb2R1bGVfcGFyYW0oaW5pdF9icmlnaHRuZXNzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0X2JyaWdodG5lc3MsICJCcmlnaHRuZXNzIHByZWNvbmZpZ3VyYXRpb246IDAtMjU1IChkZWZhdWx0PTEyOCkiKTsKK21vZHVsZV9wYXJhbShpbml0X2NvbnRyYXN0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0X2NvbnRyYXN0LCAiQ29udHJhc3QgcHJlY29uZmlndXJhdGlvbjogMC0yNTUgKGRlZmF1bHQ9MTkyKSIpOworbW9kdWxlX3BhcmFtKGluaXRfY29sb3IsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGluaXRfY29sb3IsICJDb2xvciBwcmVjb25maWd1cmF0aW9uOiAwLTI1NSAoZGVmYXVsdD0xMjgpIik7Cittb2R1bGVfcGFyYW0oaW5pdF9odWUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGluaXRfaHVlLCAiSHVlIHByZWNvbmZpZ3VyYXRpb246IDAtMjU1IChkZWZhdWx0PTEyOCkiKTsKK21vZHVsZV9wYXJhbShodWVfY29ycmVjdGlvbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaHVlX2NvcnJlY3Rpb24sICJZVVYgY29sb3JzcGFjZSByZWd1bGF0aW9uOiAwLTI1NSAoZGVmYXVsdD0xMjgpIik7CisKKy8qCisgKiB1bHRyYWNhbV9Qcm9jZXNzSXNvY0RhdGEoKQorICoKKyAqIEdlbmVyaWMgcm91dGluZSB0byBwYXJzZSB0aGUgcmluZyBxdWV1ZSBkYXRhLiBJdCBlbXBsb3lzIGVpdGhlcgorICogdWx0cmFjYW1fZmluZF9oZWFkZXIoKSBvciB1bHRyYWNhbV9wYXJzZV9saW5lcygpIHRvIGRvIG1vc3QKKyAqIG9mIHdvcmsuCisgKgorICogMDItTm92LTIwMDAgRmlyc3QgKG1vc3RseSBkdW1teSkgdmVyc2lvbi4KKyAqIDA2LU5vdi0yMDAwIFJld3JvdGUgdG8gZHVtcCBhbGwgZGF0YSBpbnRvIGZyYW1lLgorICovCitzdGF0aWMgdm9pZCB1bHRyYWNhbV9Qcm9jZXNzSXNvY0RhdGEoc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lKQoreworCWludCBuOworCisJYXNzZXJ0KHV2ZCAhPSBOVUxMKTsKKwlhc3NlcnQoZnJhbWUgIT0gTlVMTCk7CisKKwkvKiBUcnkgdG8gbW92ZSBkYXRhIGZyb20gcXVldWUgaW50byBmcmFtZSBidWZmZXIgKi8KKwluID0gUmluZ1F1ZXVlX0dldExlbmd0aCgmdXZkLT5kcCk7CisJaWYgKG4gPiAwKSB7CisJCWludCBtOworCQkvKiBTZWUgaG93IG11Y2ggc3BhcmUgd2UgaGF2ZSBsZWZ0ICovCisJCW0gPSB1dmQtPm1heF9mcmFtZV9zaXplIC0gZnJhbWUtPnNlcVJlYWRfTGVuZ3RoOworCQlpZiAobiA+IG0pCisJCQluID0gbTsKKwkJLyogTm93IG1vdmUgdGhhdCBtdWNoIGRhdGEgaW50byBmcmFtZSBidWZmZXIgKi8KKwkJUmluZ1F1ZXVlX0RlcXVldWUoCisJCQkmdXZkLT5kcCwKKwkJCWZyYW1lLT5kYXRhICsgZnJhbWUtPnNlcVJlYWRfTGVuZ3RoLAorCQkJbSk7CisJCWZyYW1lLT5zZXFSZWFkX0xlbmd0aCArPSBtOworCX0KKwkvKiBTZWUgaWYgd2UgZmlsbGVkIHRoZSBmcmFtZSAqLworCWlmIChmcmFtZS0+c2VxUmVhZF9MZW5ndGggPj0gdXZkLT5tYXhfZnJhbWVfc2l6ZSkgeworCQlmcmFtZS0+ZnJhbWVTdGF0ZSA9IEZyYW1lU3RhdGVfRG9uZTsKKwkJdXZkLT5jdXJmcmFtZSA9IC0xOworCQl1dmQtPnN0YXRzLmZyYW1lX251bSsrOworCX0KK30KKworLyoKKyAqIHVsdHJhY2FtX3ZlaW8oKQorICoKKyAqIEhpc3Rvcnk6CisgKiAxLzI3LzAwICBBZGRlZCBjaGVjayBmb3IgZGV2ID09IE5VTEw7IHRoaXMgaGFwcGVucyBpZiBjYW1lcmEgaXMgdW5wbHVnZ2VkLgorICovCitzdGF0aWMgaW50IHVsdHJhY2FtX3ZlaW8oCisJc3RydWN0IHV2ZCAqdXZkLAorCXVuc2lnbmVkIGNoYXIgcmVxLAorCXVuc2lnbmVkIHNob3J0IHZhbHVlLAorCXVuc2lnbmVkIHNob3J0IGluZGV4LAorCWludCBpc19vdXQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gInVsdHJhY2FtX3ZlaW8iOworCXVuc2lnbmVkIGNoYXIgY3BbOF0gLyogPSB7IDB4ZGUsIDB4YWQsIDB4YmUsIDB4ZWYsIDB4ZGUsIDB4YWQsIDB4YmUsIDB4ZWYgfSAqLzsKKwlpbnQgaTsKKworCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpCisJCXJldHVybiAwOworCisJaWYgKCFpc19vdXQpIHsKKwkJaSA9IHVzYl9jb250cm9sX21zZygKKwkJCXV2ZC0+ZGV2LAorCQkJdXNiX3JjdmN0cmxwaXBlKHV2ZC0+ZGV2LCAwKSwKKwkJCXJlcSwKKwkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJdmFsdWUsCisJCQlpbmRleCwKKwkJCWNwLAorCQkJc2l6ZW9mKGNwKSwKKwkJCTEwMDApOworI2lmIDEKKwkJaW5mbygiVVNCID0+ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAgICIocmVxPSQlMDJ4IHZhbD0kJTA0eCBpbmQ9JCUwNHgpIiwKKwkJICAgICAgIGNwWzBdLGNwWzFdLGNwWzJdLGNwWzNdLGNwWzRdLGNwWzVdLGNwWzZdLGNwWzddLAorCQkgICAgICAgcmVxLCB2YWx1ZSwgaW5kZXgpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJaSA9IHVzYl9jb250cm9sX21zZygKKwkJCXV2ZC0+ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKHV2ZC0+ZGV2LCAwKSwKKwkJCXJlcSwKKwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCXZhbHVlLAorCQkJaW5kZXgsCisJCQlOVUxMLAorCQkJMCwKKwkJCTEwMDApOworCX0KKwlpZiAoaSA8IDApIHsKKwkJZXJyKCIlczogRVJST1I9JWQuIENhbWVyYSBzdG9wcGVkOyBSZWNvbm5lY3Qgb3IgcmVsb2FkIGRyaXZlci4iLAorCQkgICAgcHJvYywgaSk7CisJCXV2ZC0+bGFzdF9lcnJvciA9IGk7CisJfQorCXJldHVybiBpOworfQorCisvKgorICogdWx0cmFjYW1fY2FsY3VsYXRlX2ZwcygpCisgKi8KK3N0YXRpYyBpbnQgdWx0cmFjYW1fY2FsY3VsYXRlX2ZwcyhzdHJ1Y3QgdXZkICp1dmQpCit7CisJcmV0dXJuIDMgKyBmcmFtZXJhdGUqNCArIGZyYW1lcmF0ZS8yOworfQorCisvKgorICogdWx0cmFjYW1fYWRqdXN0X2NvbnRyYXN0KCkKKyAqLworc3RhdGljIHZvaWQgdWx0cmFjYW1fYWRqdXN0X2NvbnRyYXN0KHN0cnVjdCB1dmQgKnV2ZCkKK3sKK30KKworLyoKKyAqIHVsdHJhY2FtX3NldF9icmlnaHRuZXNzKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBjaGFuZ2VzIGJyaWdodG5lc3Mgb2YgdGhlIHBpY3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIHVsdHJhY2FtX3NldF9icmlnaHRuZXNzKHN0cnVjdCB1dmQgKnV2ZCkKK3sKK30KKworc3RhdGljIHZvaWQgdWx0cmFjYW1fc2V0X2h1ZShzdHJ1Y3QgdXZkICp1dmQpCit7Cit9CisKKy8qCisgKiB1bHRyYWNhbV9hZGp1c3RfcGljdHVyZSgpCisgKgorICogVGhpcyBwcm9jZWR1cmUgZ2V0cyBjYWxsZWQgZnJvbSBWNEwgaW50ZXJmYWNlIHRvIHVwZGF0ZSBwaWN0dXJlIHNldHRpbmdzLgorICogSGVyZSB3ZSBjaGFuZ2UgYnJpZ2h0bmVzcyBhbmQgY29udHJhc3QuCisgKi8KK3N0YXRpYyB2b2lkIHVsdHJhY2FtX2FkanVzdF9waWN0dXJlKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwl1bHRyYWNhbV9hZGp1c3RfY29udHJhc3QodXZkKTsKKwl1bHRyYWNhbV9zZXRfYnJpZ2h0bmVzcyh1dmQpOworCXVsdHJhY2FtX3NldF9odWUodXZkKTsKK30KKworLyoKKyAqIHVsdHJhY2FtX3ZpZGVvX3N0b3AoKQorICoKKyAqIFRoaXMgY29kZSB0ZWxscyBjYW1lcmEgdG8gc3RvcCBzdHJlYW1pbmcuIFRoZSBpbnRlcmZhY2UgcmVtYWlucworICogY29uZmlndXJlZCBhbmQgYmFuZHdpZHRoIC0gY2xhaW1lZC4KKyAqLworc3RhdGljIHZvaWQgdWx0cmFjYW1fdmlkZW9fc3RvcChzdHJ1Y3QgdXZkICp1dmQpCit7Cit9CisKKy8qCisgKiB1bHRyYWNhbV9yZWluaXRfaXNvKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBzZW5kcyBjb3VwbGUgb2YgY29tbWFuZHMgdG8gdGhlIGNhbWVyYSBhbmQgdGhlbgorICogcmVzZXRzIHRoZSB2aWRlbyBwaXBlLiBUaGlzIHNlcXVlbmNlIHdhcyBvYnNlcnZlZCB0byByZWluaXQgdGhlCisgKiBjYW1lcmEgb3IsIGF0IGxlYXN0LCB0byBpbml0aWF0ZSBJU08gZGF0YSBzdHJlYW0uCisgKi8KK3N0YXRpYyB2b2lkIHVsdHJhY2FtX3JlaW5pdF9pc28oc3RydWN0IHV2ZCAqdXZkLCBpbnQgZG9fc3RvcCkKK3sKK30KKworc3RhdGljIHZvaWQgdWx0cmFjYW1fdmlkZW9fc3RhcnQoc3RydWN0IHV2ZCAqdXZkKQoreworCXVsdHJhY2FtX3JlaW5pdF9pc28odXZkLCAwKTsKK30KKworc3RhdGljIGludCB1bHRyYWNhbV9yZXNldFBpcGUoc3RydWN0IHV2ZCAqdXZkKQoreworCXVzYl9jbGVhcl9oYWx0KHV2ZC0+ZGV2LCB1dmQtPnZpZGVvX2VuZHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVsdHJhY2FtX2FsdGVybmF0ZVNldHRpbmcoc3RydWN0IHV2ZCAqdXZkLCBpbnQgc2V0dGluZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBwcm9jW10gPSAidWx0cmFjYW1fYWx0ZXJuYXRlU2V0dGluZyI7CisJaW50IGk7CisJaSA9IHVzYl9zZXRfaW50ZXJmYWNlKHV2ZC0+ZGV2LCB1dmQtPmlmYWNlLCBzZXR0aW5nKTsKKwlpZiAoaSA8IDApIHsKKwkJZXJyKCIlczogdXNiX3NldF9pbnRlcmZhY2UgZXJyb3IiLCBwcm9jKTsKKwkJdXZkLT5sYXN0X2Vycm9yID0gaTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gbmVnYXRpdmUgY29kZSBvbiBmYWlsdXJlLCAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgdWx0cmFjYW1fc2V0dXBfb25fb3BlbihzdHJ1Y3QgdXZkICp1dmQpCit7CisJaW50IHNldHVwX29rID0gMDsgLyogU3VjY2VzcyBieSBkZWZhdWx0ICovCisJLyogU2VuZCBpbml0IHNlcXVlbmNlIG9ubHkgb25jZSwgaXQncyBsYXJnZSEgKi8KKwlpZiAoIVVMVFJBQ0FNX1QodXZkKS0+aW5pdGlhbGl6ZWQpIHsKKwkJdWx0cmFjYW1fYWx0ZXJuYXRlU2V0dGluZyh1dmQsIDB4MDQpOworCQl1bHRyYWNhbV9hbHRlcm5hdGVTZXR0aW5nKHV2ZCwgMHgwMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAyLCAweDAwMDQsIDB4MDAwYiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAyLCAweDAwMDEsIDB4MDAwNSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAyLCAweDgwMDAsIDB4MDAwMCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDAwMCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwYjAsIDB4MDAwMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDAwMiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMGMsIDB4MDAwMywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMGIsIDB4MDAwNCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDAwNSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDAwNiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwNzksIDB4MDAwNywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwM2IsIDB4MDAwOCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDIsIDB4MDAwZiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDEsIDB4MDAxMCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDAxMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBiZiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDEsIDB4MDBjMCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMTAsIDB4MDBjYiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwYTQsIDB4MDAwMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMTAsIDB4MDAwMiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwNjYsIDB4MDAwNywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMGIsIDB4MDAwOCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMzQsIDB4MDAwOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwYSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMmUsIDB4MDAwYiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZDYsIDB4MDAwYywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZmMsIDB4MDAwZCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZjEsIDB4MDAwZSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZGEsIDB4MDAwZiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMzYsIDB4MDAxMCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMGIsIDB4MDAxMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDEsIDB4MDAxMiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAxMywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAxNCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwODcsIDB4MDA1MSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwNDAsIDB4MDA1MiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwNTgsIDB4MDA1MywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwNDAsIDB4MDA1NCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDA0MCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMTAsIDB4MDA0MSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMjAsIDB4MDA0MiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMzAsIDB4MDA0MywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwNDAsIDB4MDA0NCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwNTAsIDB4MDA0NSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwNjAsIDB4MDA0NiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwNzAsIDB4MDA0NywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwODAsIDB4MDA0OCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwOTAsIDB4MDA0OSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwYTAsIDB4MDA0YSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwYjAsIDB4MDA0YiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwYzAsIDB4MDA0YywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZDAsIDB4MDA0ZCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZTAsIDB4MDA0ZSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZjAsIDB4MDA0ZiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZmYsIDB4MDA1MCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDA1NiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwODAsIDB4MDBjMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjMiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjYSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwODAsIDB4MDBjMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDQsIDB4MDBjMiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjYSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDIsIDB4MDBjMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMjAsIDB4MDBjMiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjYSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjMywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjMywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwNDAsIDB4MDBjMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMTcsIDB4MDBjMiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjYSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjMywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjMywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjNywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwYzAsIDB4MDBjMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjMiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjYSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAyLCAweGMwNDAsIDB4MDAwMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwOCwgMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwOSwgMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwYSwgMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwYiwgMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwYywgMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwZCwgMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwZSwgMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwZiwgMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAxMCwgMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMGIsIDB4MDAwOCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMzQsIDB4MDAwOSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwYSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMmUsIDB4MDAwYiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZDYsIDB4MDAwYywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZmMsIDB4MDAwZCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZjEsIDB4MDAwZSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZGEsIDB4MDAwZiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMzYsIDB4MDAxMCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDAsIDB4MDAwMSwgMCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwNjQsIDB4MDAwMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwNTksIDB4MDA1MSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwM2YsIDB4MDA1MiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwOTQsIDB4MDA1MywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZmYsIDB4MDAxMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwMDMsIDB4MDAxMiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAxLCAweDAwZjcsIDB4MDAxMywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDksIDB4MDAxMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDAwMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDAwMCwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMjAsIDB4MDBjMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMTAsIDB4MDBjMiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAwLCAweDAwMDAsIDB4MDBjYSwgMSk7CisJCXVsdHJhY2FtX2FsdGVybmF0ZVNldHRpbmcodXZkLCAweDA0KTsKKwkJdWx0cmFjYW1fdmVpbyh1dmQsIDB4MDIsIDB4MDAwMCwgMHgwMDAxLCAxKTsKKwkJdWx0cmFjYW1fdmVpbyh1dmQsIDB4MDIsIDB4MDAwMCwgMHgwMDAxLCAxKTsKKwkJdWx0cmFjYW1fdmVpbyh1dmQsIDB4MDIsIDB4MDAwMCwgMHgwMDA2LCAxKTsKKwkJdWx0cmFjYW1fdmVpbyh1dmQsIDB4MDIsIDB4OTAwMCwgMHgwMDA3LCAxKTsKKwkJdWx0cmFjYW1fdmVpbyh1dmQsIDB4MDIsIDB4MDA0MiwgMHgwMDAxLCAxKTsKKwkJdWx0cmFjYW1fdmVpbyh1dmQsIDB4MDIsIDB4MDAwMCwgMHgwMDBiLCAwKTsKKwkJdWx0cmFjYW1fcmVzZXRQaXBlKHV2ZCk7CisJCVVMVFJBQ0FNX1QodXZkKS0+aW5pdGlhbGl6ZWQgPSAoc2V0dXBfb2sgIT0gMCk7CisJfQorCXJldHVybiBzZXR1cF9vazsKK30KKworc3RhdGljIHZvaWQgdWx0cmFjYW1fY29uZmlndXJlX3ZpZGVvKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpZiAodXZkID09IE5VTEwpCisJCXJldHVybjsKKworCVJFU1RSSUNUX1RPX1JBTkdFKGluaXRfYnJpZ2h0bmVzcywgMCwgMjU1KTsKKwlSRVNUUklDVF9UT19SQU5HRShpbml0X2NvbnRyYXN0LCAwLCAyNTUpOworCVJFU1RSSUNUX1RPX1JBTkdFKGluaXRfY29sb3IsIDAsIDI1NSk7CisJUkVTVFJJQ1RfVE9fUkFOR0UoaW5pdF9odWUsIDAsIDI1NSk7CisJUkVTVFJJQ1RfVE9fUkFOR0UoaHVlX2NvcnJlY3Rpb24sIDAsIDI1NSk7CisKKwltZW1zZXQoJnV2ZC0+dnBpYywgMCwgc2l6ZW9mKHV2ZC0+dnBpYykpOworCW1lbXNldCgmdXZkLT52cGljX29sZCwgMHg1NSwgc2l6ZW9mKHV2ZC0+dnBpY19vbGQpKTsKKworCXV2ZC0+dnBpYy5jb2xvdXIgPSBpbml0X2NvbG9yIDw8IDg7CisJdXZkLT52cGljLmh1ZSA9IGluaXRfaHVlIDw8IDg7CisJdXZkLT52cGljLmJyaWdodG5lc3MgPSBpbml0X2JyaWdodG5lc3MgPDwgODsKKwl1dmQtPnZwaWMuY29udHJhc3QgPSBpbml0X2NvbnRyYXN0IDw8IDg7CisJdXZkLT52cGljLndoaXRlbmVzcyA9IDEwNSA8PCA4OyAvKiBUaGlzIG9uZSBpc24ndCB1c2VkICovCisJdXZkLT52cGljLmRlcHRoID0gMjQ7CisJdXZkLT52cGljLnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JHQjI0OworCisJbWVtc2V0KCZ1dmQtPnZjYXAsIDAsIHNpemVvZih1dmQtPnZjYXApKTsKKwlzdHJjcHkodXZkLT52Y2FwLm5hbWUsICJJQk0gVWx0cmEgQ2FtZXJhIik7CisJdXZkLT52Y2FwLnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFOworCXV2ZC0+dmNhcC5jaGFubmVscyA9IDE7CisJdXZkLT52Y2FwLmF1ZGlvcyA9IDA7CisJdXZkLT52Y2FwLm1heHdpZHRoID0gVklERU9TSVpFX1godXZkLT5jYW52YXMpOworCXV2ZC0+dmNhcC5tYXhoZWlnaHQgPSBWSURFT1NJWkVfWSh1dmQtPmNhbnZhcyk7CisJdXZkLT52Y2FwLm1pbndpZHRoID0gbWluX2NhbnZhc1dpZHRoOworCXV2ZC0+dmNhcC5taW5oZWlnaHQgPSBtaW5fY2FudmFzSGVpZ2h0OworCisJbWVtc2V0KCZ1dmQtPnZjaGFuLCAwLCBzaXplb2YodXZkLT52Y2hhbikpOworCXV2ZC0+dmNoYW4uZmxhZ3MgPSAwOworCXV2ZC0+dmNoYW4udHVuZXJzID0gMDsKKwl1dmQtPnZjaGFuLmNoYW5uZWwgPSAwOworCXV2ZC0+dmNoYW4udHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOworCXN0cmNweSh1dmQtPnZjaGFuLm5hbWUsICJDYW1lcmEiKTsKK30KKworLyoKKyAqIHVsdHJhY2FtX3Byb2JlKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBxdWVyaWVzIGRldmljZSBkZXNjcmlwdG9yIGFuZCBhY2NlcHRzIHRoZSBpbnRlcmZhY2UKKyAqIGlmIGl0IGxvb2tzIGxpa2Ugb3VyIGNhbWVyYS4KKyAqCisgKiBIaXN0b3J5OgorICogMTItTm92LTIwMDAgUmV3b3JrZWQgdG8gY29tcGx5IHdpdGggbmV3IHByb2JlKCkgc2lnbmF0dXJlLgorICogMjMtSmFuLTIwMDEgQWRkZWQgY29tcGF0aWJpbGl0eSB3aXRoIDIuMi54IGtlcm5lbHMuCisgKi8KK3N0YXRpYyBpbnQgdWx0cmFjYW1fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXZkICp1dmQgPSBOVUxMOworCWludCBpeCwgaSwgbmFzOworCWludCBhY3RJbnRlcmZhY2U9LTEsIGluYWN0SW50ZXJmYWNlPS0xLCBtYXhQUz0wOworCXVuc2lnbmVkIGNoYXIgdmlkZW9fZXAgPSAwOworCisJaWYgKGRlYnVnID49IDEpCisJCWluZm8oInVsdHJhY2FtX3Byb2JlKCVwKSIsIGludGYpOworCisJLyogV2UgZG9uJ3QgaGFuZGxlIG11bHRpLWNvbmZpZyBjYW1lcmFzICovCisJaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbmZvKCJJQk0gVWx0cmEgY2FtZXJhIGZvdW5kIChyZXYuIDB4JTA0eCkiLAorCQlsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSk7CisKKwkvKiBWYWxpZGF0ZSBmb3VuZCBpbnRlcmZhY2U6IG11c3QgaGF2ZSBvbmUgSVNPIGVuZHBvaW50ICovCisJbmFzID0gaW50Zi0+bnVtX2FsdHNldHRpbmc7CisJaWYgKGRlYnVnID4gMCkKKwkJaW5mbygiTnVtYmVyIG9mIGFsdGVybmF0ZSBzZXR0aW5ncz0lZC4iLCBuYXMpOworCWlmIChuYXMgPCA4KSB7CisJCWVycigiVG9vIGZldyBhbHRlcm5hdGUgc2V0dGluZ3MgZm9yIHRoaXMgY2FtZXJhISIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyogVmFsaWRhdGUgYWxsIGFsdGVybmF0ZSBzZXR0aW5ncyAqLworCWZvciAoaXg9MDsgaXggPCBuYXM7IGl4KyspIHsKKwkJY29uc3Qgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCisJCWludGVyZmFjZSA9ICZpbnRmLT5hbHRzZXR0aW5nW2l4XTsKKwkJaSA9IGludGVyZmFjZS0+ZGVzYy5iQWx0ZXJuYXRlU2V0dGluZzsKKwkJaWYgKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDEpIHsKKwkJCWVycigiSW50ZXJmYWNlICVkLiBoYXMgJXUuIGVuZHBvaW50cyEiLAorCQkJICAgIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAorCQkJICAgICh1bnNpZ25lZCkoaW50ZXJmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHMpKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKKwkJaWYgKHZpZGVvX2VwID09IDApCisJCQl2aWRlb19lcCA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQllbHNlIGlmICh2aWRlb19lcCAhPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcykgeworCQkJZXJyKCJBbHRlcm5hdGUgc2V0dGluZ3MgaGF2ZSBkaWZmZXJlbnQgZW5kcG9pbnQgYWRkcmVzc2VzISIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMHgwMykgIT0gMHgwMSkgeworCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBub24tSVNPIGVuZHBvaW50ISIsCisJCQkgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApID09IDApIHsKKwkJCWVycigiSW50ZXJmYWNlICVkLiBoYXMgSVNPIE9VVCBlbmRwb2ludCEiLAorCQkJICAgIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmIChsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpID09IDApIHsKKwkJCWlmIChpbmFjdEludGVyZmFjZSA8IDApCisJCQkJaW5hY3RJbnRlcmZhY2UgPSBpOworCQkJZWxzZSB7CisJCQkJZXJyKCJNb3JlIHRoYW4gb25lIGluYWN0aXZlIGFsdC4gc2V0dGluZyEiKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChhY3RJbnRlcmZhY2UgPCAwKSB7CisJCQkJYWN0SW50ZXJmYWNlID0gaTsKKwkJCQltYXhQUyA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQkJaWYgKGRlYnVnID4gMCkKKwkJCQkJaW5mbygiQWN0aXZlIHNldHRpbmc9JWQuIG1heFBTPSVkLiIsIGksIG1heFBTKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogR290IGFub3RoZXIgYWN0aXZlIGFsdC4gc2V0dGluZyAqLworCQkJCWlmIChtYXhQUyA8IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpIHsKKwkJCQkJLyogVGhpcyBvbmUgaXMgYmV0dGVyISAqLworCQkJCQlhY3RJbnRlcmZhY2UgPSBpOworCQkJCQltYXhQUyA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQkJCWlmIChkZWJ1ZyA+IDApIHsKKwkJCQkJCWluZm8oIkV2ZW4gYmV0dGVyIGN0aXZlIHNldHRpbmc9JWQuIG1heFBTPSVkLiIsCisJCQkJCQkgICAgIGksIG1heFBTKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoKG1heFBTIDw9IDApIHx8IChhY3RJbnRlcmZhY2UgPCAwKSB8fCAoaW5hY3RJbnRlcmZhY2UgPCAwKSkgeworCQllcnIoIkZhaWxlZCB0byByZWNvZ25pemUgdGhlIGNhbWVyYSEiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdXZkID0gdXNidmlkZW9fQWxsb2NhdGVEZXZpY2UoY2Ftcyk7CisJaWYgKHV2ZCAhPSBOVUxMKSB7CisJCS8qIEhlcmUgdXZkIGlzIGEgZnVsbHkgYWxsb2NhdGVkIHV2ZCBvYmplY3QgKi8KKwkJdXZkLT5mbGFncyA9IGZsYWdzOworCQl1dmQtPmRlYnVnID0gZGVidWc7CisJCXV2ZC0+ZGV2ID0gZGV2OworCQl1dmQtPmlmYWNlID0gaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCQl1dmQtPmlmYWNlQWx0SW5hY3RpdmUgPSBpbmFjdEludGVyZmFjZTsKKwkJdXZkLT5pZmFjZUFsdEFjdGl2ZSA9IGFjdEludGVyZmFjZTsKKwkJdXZkLT52aWRlb19lbmRwID0gdmlkZW9fZXA7CisJCXV2ZC0+aXNvX3BhY2tldF9sZW4gPSBtYXhQUzsKKwkJdXZkLT5wYWxldHRlQml0cyA9IDFMIDw8IFZJREVPX1BBTEVUVEVfUkdCMjQ7CisJCXV2ZC0+ZGVmYXVsdFBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JHQjI0OworCQl1dmQtPmNhbnZhcyA9IFZJREVPU0laRSg2NDAsIDQ4MCk7CS8qIEZJWE1FICovCisJCXV2ZC0+dmlkZW9zaXplID0gdXZkLT5jYW52YXM7IC8qIHVsdHJhY2FtX3NpemVfdG9fdmlkZW9zaXplKHNpemUpOyovCisKKwkJLyogSW5pdGlhbGl6ZSBpYm1jYW0tc3BlY2lmaWMgZGF0YSAqLworCQlhc3NlcnQoVUxUUkFDQU1fVCh1dmQpICE9IE5VTEwpOworCQlVTFRSQUNBTV9UKHV2ZCktPmNhbWVyYV9tb2RlbCA9IDA7IC8qIE5vdCB1c2VkIHlldCAqLworCQlVTFRSQUNBTV9UKHV2ZCktPmluaXRpYWxpemVkID0gMDsKKworCQl1bHRyYWNhbV9jb25maWd1cmVfdmlkZW8odXZkKTsKKworCQlpID0gdXNidmlkZW9fUmVnaXN0ZXJWaWRlb0RldmljZSh1dmQpOworCQlpZiAoaSAhPSAwKSB7CisJCQllcnIoInVzYnZpZGVvX1JlZ2lzdGVyVmlkZW9EZXZpY2UoKSBmYWlsZWQuIik7CisJCQl1dmQgPSBOVUxMOworCQl9CisJfQorCisJaWYgKHV2ZCkgeworCQl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCB1dmQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU87Cit9CisKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKFVMVFJBQ0FNX1ZFTkRPUl9JRCwgVUxUUkFDQU1fUFJPRFVDVF9JRCkgfSwKKwl7IH0gIC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCisvKgorICogdWx0cmFjYW1faW5pdCgpCisgKgorICogVGhpcyBjb2RlIGlzIHJ1biB0byBpbml0aWFsaXplIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHVsdHJhY2FtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgdXNidmlkZW9fY2IgY2JUYmw7CisJbWVtc2V0KCZjYlRibCwgMCwgc2l6ZW9mKGNiVGJsKSk7CisJY2JUYmwucHJvYmUgPSB1bHRyYWNhbV9wcm9iZTsKKwljYlRibC5zZXR1cE9uT3BlbiA9IHVsdHJhY2FtX3NldHVwX29uX29wZW47CisJY2JUYmwudmlkZW9TdGFydCA9IHVsdHJhY2FtX3ZpZGVvX3N0YXJ0OworCWNiVGJsLnZpZGVvU3RvcCA9IHVsdHJhY2FtX3ZpZGVvX3N0b3A7CisJY2JUYmwucHJvY2Vzc0RhdGEgPSB1bHRyYWNhbV9Qcm9jZXNzSXNvY0RhdGE7CisJY2JUYmwucG9zdFByb2Nlc3MgPSB1c2J2aWRlb19EZWludGVybGFjZUZyYW1lOworCWNiVGJsLmFkanVzdFBpY3R1cmUgPSB1bHRyYWNhbV9hZGp1c3RfcGljdHVyZTsKKwljYlRibC5nZXRGUFMgPSB1bHRyYWNhbV9jYWxjdWxhdGVfZnBzOworCXJldHVybiB1c2J2aWRlb19yZWdpc3RlcigKKwkJJmNhbXMsCisJCU1BWF9DQU1FUkFTLAorCQlzaXplb2YodWx0cmFjYW1fdCksCisJCSJ1bHRyYWNhbSIsCisJCSZjYlRibCwKKwkJVEhJU19NT0RVTEUsCisJCWlkX3RhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVsdHJhY2FtX2NsZWFudXAodm9pZCkKK3sKKwl1c2J2aWRlb19EZXJlZ2lzdGVyKCZjYW1zKTsKK30KKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQodWx0cmFjYW1faW5pdCk7Cittb2R1bGVfZXhpdCh1bHRyYWNhbV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3VzYnZpZGVvLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS91c2J2aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODQ4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS91c2J2aWRlby5jCkBAIC0wLDAgKzEsMjE5MiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAidXNidmlkZW8uaCIKKworI2lmIGRlZmluZWQoTUFQX05SKQorI2RlZmluZQl2aXJ0X3RvX3BhZ2UodikJTUFQX05SKHYpCS8qIEtlcm5lbHMgMi4yLnggKi8KKyNlbmRpZgorCitzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7Cittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CisKKy8qCisgKiBMb2NhbCBwcm90b3R5cGVzLgorICovCitzdGF0aWMgdm9pZCB1c2J2aWRlb19EaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK3N0YXRpYyB2b2lkIHVzYnZpZGVvX0NhbWVyYVJlbGVhc2Uoc3RydWN0IHV2ZCAqdXZkKTsKKworc3RhdGljIGludCB1c2J2aWRlb192NGxfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IHVzYnZpZGVvX3Y0bF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CitzdGF0aWMgaW50IHVzYnZpZGVvX3Y0bF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBzc2l6ZV90IHVzYnZpZGVvX3Y0bF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgaW50IHVzYnZpZGVvX3Y0bF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisKK3N0YXRpYyBpbnQgdXNidmlkZW9fU3RhcnREYXRhUHVtcChzdHJ1Y3QgdXZkICp1dmQpOworc3RhdGljIHZvaWQgdXNidmlkZW9fU3RvcERhdGFQdW1wKHN0cnVjdCB1dmQgKnV2ZCk7CitzdGF0aWMgaW50IHVzYnZpZGVvX0dldEZyYW1lKHN0cnVjdCB1dmQgKnV2ZCwgaW50IGZyYW1lTnVtKTsKK3N0YXRpYyBpbnQgdXNidmlkZW9fTmV3RnJhbWUoc3RydWN0IHV2ZCAqdXZkLCBpbnQgZnJhbWVudW0pOworc3RhdGljIHZvaWQgdXNidmlkZW9fU29mdHdhcmVDb250cmFzdEFkanVzdG1lbnQoc3RydWN0IHV2ZCAqdXZkLAorCQkJCQkJc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkICp1c2J2aWRlb19ydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqbWVtOworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJbWVtID0gdm1hbGxvY18zMihzaXplKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KKwlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlIChzaXplID4gMCkgeworCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBtZW07Cit9CisKK3N0YXRpYyB2b2lkIHVzYnZpZGVvX3J2ZnJlZSh2b2lkICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCWlmICghbWVtKQorCQlyZXR1cm47CisKKwlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlICgobG9uZykgc2l6ZSA+IDApIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKwl2ZnJlZShtZW0pOworfQorCitzdGF0aWMgdm9pZCBSaW5nUXVldWVfSW5pdGlhbGl6ZShzdHJ1Y3QgUmluZ1F1ZXVlICpycSkKK3sKKwlhc3NlcnQocnEgIT0gTlVMTCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcnEtPndxaCk7Cit9CisKK3N0YXRpYyB2b2lkIFJpbmdRdWV1ZV9BbGxvY2F0ZShzdHJ1Y3QgUmluZ1F1ZXVlICpycSwgaW50IHJxTGVuKQoreworCS8qIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdGVkIHNpemUgaXMgYSBwb3dlciBvZiAyIGFuZAorCSAgIHJvdW5kIHVwIGlmIG5lY2Vzc2FyeS4gVGhpcyBhbGxvd3MgaW5kZXggd3JhcHBpbmcKKwkgICB1c2luZyBtYXNrcyByYXRoZXIgdGhhbiBtb2R1bG8gKi8KKworCWludCBpID0gMTsKKwlhc3NlcnQocnEgIT0gTlVMTCk7CisJYXNzZXJ0KHJxTGVuID4gMCk7CisKKwl3aGlsZShycUxlbiA+PiBpKQorCQlpKys7CisJaWYocnFMZW4gIT0gMSA8PCAoaS0xKSkKKwkJcnFMZW4gPSAxIDw8IGk7CisKKwlycS0+bGVuZ3RoID0gcnFMZW47CisJcnEtPnJpID0gcnEtPndpID0gMDsKKwlycS0+cXVldWUgPSB1c2J2aWRlb19ydm1hbGxvYyhycS0+bGVuZ3RoKTsKKwlhc3NlcnQocnEtPnF1ZXVlICE9IE5VTEwpOworfQorCitzdGF0aWMgaW50IFJpbmdRdWV1ZV9Jc0FsbG9jYXRlZChjb25zdCBzdHJ1Y3QgUmluZ1F1ZXVlICpycSkKK3sKKwlpZiAocnEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChycS0+cXVldWUgIT0gTlVMTCkgJiYgKHJxLT5sZW5ndGggPiAwKTsKK30KKworc3RhdGljIHZvaWQgUmluZ1F1ZXVlX0ZyZWUoc3RydWN0IFJpbmdRdWV1ZSAqcnEpCit7CisJYXNzZXJ0KHJxICE9IE5VTEwpOworCWlmIChSaW5nUXVldWVfSXNBbGxvY2F0ZWQocnEpKSB7CisJCXVzYnZpZGVvX3J2ZnJlZShycS0+cXVldWUsIHJxLT5sZW5ndGgpOworCQlycS0+cXVldWUgPSBOVUxMOworCQlycS0+bGVuZ3RoID0gMDsKKwl9Cit9CisKK2ludCBSaW5nUXVldWVfRGVxdWV1ZShzdHJ1Y3QgUmluZ1F1ZXVlICpycSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuKQoreworCWludCBycWwsIHRvcmVhZDsKKworCWFzc2VydChycSAhPSBOVUxMKTsKKwlhc3NlcnQoZHN0ICE9IE5VTEwpOworCisJcnFsID0gUmluZ1F1ZXVlX0dldExlbmd0aChycSk7CisJaWYoIXJxbCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDbGlwIHJlcXVlc3RlZCBsZW5ndGggdG8gYXZhaWxhYmxlIGRhdGEgKi8KKwlpZihsZW4gPiBycWwpCisJCWxlbiA9IHJxbDsKKworCXRvcmVhZCA9IGxlbjsKKwlpZihycS0+cmkgPiBycS0+d2kpIHsKKwkJLyogUmVhZCBkYXRhIGZyb20gdGFpbCAqLworCQlpbnQgcmVhZCA9ICh0b3JlYWQgPCAocnEtPmxlbmd0aCAtIHJxLT5yaSkpID8gdG9yZWFkIDogcnEtPmxlbmd0aCAtIHJxLT5yaTsKKwkJbWVtY3B5KGRzdCwgcnEtPnF1ZXVlICsgcnEtPnJpLCByZWFkKTsKKwkJdG9yZWFkIC09IHJlYWQ7CisJCWRzdCArPSByZWFkOworCQlycS0+cmkgPSAocnEtPnJpICsgcmVhZCkgJiAocnEtPmxlbmd0aC0xKTsKKwl9CisJaWYodG9yZWFkKSB7CisJCS8qIFJlYWQgZGF0YSBmcm9tIGhlYWQgKi8KKwkJbWVtY3B5KGRzdCwgcnEtPnF1ZXVlICsgcnEtPnJpLCB0b3JlYWQpOworCQlycS0+cmkgPSAocnEtPnJpICsgdG9yZWFkKSAmIChycS0+bGVuZ3RoLTEpOworCX0KKwlyZXR1cm4gbGVuOworfQorCitFWFBPUlRfU1lNQk9MKFJpbmdRdWV1ZV9EZXF1ZXVlKTsKKworaW50IFJpbmdRdWV1ZV9FbnF1ZXVlKHN0cnVjdCBSaW5nUXVldWUgKnJxLCBjb25zdCB1bnNpZ25lZCBjaGFyICpjZGF0YSwgaW50IG4pCit7CisJaW50IGVucXVldWVkID0gMDsKKworCWFzc2VydChycSAhPSBOVUxMKTsKKwlhc3NlcnQoY2RhdGEgIT0gTlVMTCk7CisJYXNzZXJ0KHJxLT5sZW5ndGggPiAwKTsKKwl3aGlsZSAobiA+IDApIHsKKwkJaW50IG0sIHFfYXZhaWw7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBsYXJnZXN0IGNodW5rIHRoYXQgZml0cyB0aGUgdGFpbCBvZiB0aGUgcmluZyAqLworCQlxX2F2YWlsID0gcnEtPmxlbmd0aCAtIHJxLT53aTsKKwkJaWYgKHFfYXZhaWwgPD0gMCkgeworCQkJcnEtPndpID0gMDsKKwkJCXFfYXZhaWwgPSBycS0+bGVuZ3RoOworCQl9CisJCW0gPSBuOworCQlhc3NlcnQocV9hdmFpbCA+IDApOworCQlpZiAobSA+IHFfYXZhaWwpCisJCQltID0gcV9hdmFpbDsKKworCQltZW1jcHkocnEtPnF1ZXVlICsgcnEtPndpLCBjZGF0YSwgbSk7CisJCVJJTkdfUVVFVUVfQURWQU5DRV9JTkRFWChycSwgd2ksIG0pOworCQljZGF0YSArPSBtOworCQllbnF1ZXVlZCArPSBtOworCQluIC09IG07CisJfQorCXJldHVybiBlbnF1ZXVlZDsKK30KKworRVhQT1JUX1NZTUJPTChSaW5nUXVldWVfRW5xdWV1ZSk7CisKK3N0YXRpYyB2b2lkIFJpbmdRdWV1ZV9JbnRlcnJ1cHRpYmxlU2xlZXBPbihzdHJ1Y3QgUmluZ1F1ZXVlICpycSkKK3sKKwlhc3NlcnQocnEgIT0gTlVMTCk7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcnEtPndxaCk7Cit9CisKK3ZvaWQgUmluZ1F1ZXVlX1dha2VVcEludGVycnVwdGlibGUoc3RydWN0IFJpbmdRdWV1ZSAqcnEpCit7CisJYXNzZXJ0KHJxICE9IE5VTEwpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZycS0+d3FoKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZycS0+d3FoKTsKK30KKworRVhQT1JUX1NZTUJPTChSaW5nUXVldWVfV2FrZVVwSW50ZXJydXB0aWJsZSk7CisKK3ZvaWQgUmluZ1F1ZXVlX0ZsdXNoKHN0cnVjdCBSaW5nUXVldWUgKnJxKQoreworCWFzc2VydChycSAhPSBOVUxMKTsKKwlycS0+cmkgPSAwOworCXJxLT53aSA9IDA7Cit9CisKK0VYUE9SVF9TWU1CT0woUmluZ1F1ZXVlX0ZsdXNoKTsKKworCisvKgorICogdXNidmlkZW9fVmlkZW9zaXplVG9TdHJpbmcoKQorICoKKyAqIFRoaXMgcHJvY2VkdXJlIGNvbnZlcnRzIGdpdmVuIHZpZGVvc2l6ZSB2YWx1ZSB0byByZWFkYWJsZSBzdHJpbmcuCisgKgorICogSGlzdG9yeToKKyAqIDA3LUF1Zy0yMDAwIENyZWF0ZWQuCisgKiAxOS1PY3QtMjAwMCBSZXdvcmtlZCBmb3IgdXNidmlkZW8gbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCB1c2J2aWRlb19WaWRlb3NpemVUb1N0cmluZyhjaGFyICpidWYsIGludCBidWZMZW4sIHZpZGVvc2l6ZV90IHZzKQoreworCWNoYXIgdG1wWzQwXTsKKwlpbnQgbjsKKworCW4gPSAxICsgc3ByaW50Zih0bXAsICIlbGR4JWxkIiwgVklERU9TSVpFX1godnMpLCBWSURFT1NJWkVfWSh2cykpOworCWFzc2VydChuIDwgc2l6ZW9mKHRtcCkpOworCWlmICgoYnVmID09IE5VTEwpIHx8IChidWZMZW4gPCBuKSkKKwkJZXJyKCJ1c2J2aWRlb19WaWRlb3NpemVUb1N0cmluZzogYnVmZmVyIGlzIHRvbyBzbWFsbC4iKTsKKwllbHNlCisJCW1lbW1vdmUoYnVmLCB0bXAsIG4pOworfQorCisvKgorICogdXNidmlkZW9fT3ZlcmxheUNoYXIoKQorICoKKyAqIEhpc3Rvcnk6CisgKiAwMS1GZWItMjAwMCBDcmVhdGVkLgorICovCitzdGF0aWMgdm9pZCB1c2J2aWRlb19PdmVybGF5Q2hhcihzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWUsCisJCQkJIGludCB4LCBpbnQgeSwgaW50IGNoKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkaWdpdHNbMTZdID0geworCQkweEY2REUsIC8qIDAgKi8KKwkJMHgyNDkyLCAvKiAxICovCisJCTB4RTdDRSwgLyogMiAqLworCQkweEU3OUUsIC8qIDMgKi8KKwkJMHhCNzkyLCAvKiA0ICovCisJCTB4RjM5RSwgLyogNSAqLworCQkweEYzREUsIC8qIDYgKi8KKwkJMHhGNDkyLCAvKiA3ICovCisJCTB4RjdERSwgLyogOCAqLworCQkweEY3OUUsIC8qIDkgKi8KKwkJMHg3N0RBLCAvKiBhICovCisJCTB4RDc1QywgLyogYiAqLworCQkweEYyNEUsIC8qIGMgKi8KKwkJMHhENkRDLCAvKiBkICovCisJCTB4RjM0RSwgLyogZSAqLworCQkweEYzNDggIC8qIGYgKi8KKwl9OworCXVuc2lnbmVkIHNob3J0IGRpZ2l0OworCWludCBpeCwgaXk7CisKKwlpZiAoKHV2ZCA9PSBOVUxMKSB8fCAoZnJhbWUgPT0gTlVMTCkpCisJCXJldHVybjsKKworCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorCQljaCAtPSAnMCc7CisJZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKKwkJY2ggPSAxMCArIChjaCAtICdBJyk7CisJZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKKwkJY2ggPSAxMCArIChjaCAtICdhJyk7CisJZWxzZQorCQlyZXR1cm47CisJZGlnaXQgPSBkaWdpdHNbY2hdOworCisJZm9yIChpeT0wOyBpeSA8IDU7IGl5KyspIHsKKwkJZm9yIChpeD0wOyBpeCA8IDM7IGl4KyspIHsKKwkJCWlmIChkaWdpdCAmIDB4ODAwMCkgeworCQkJCWlmICh1dmQtPnBhbGV0dGVCaXRzICYgKDFMIDw8IFZJREVPX1BBTEVUVEVfUkdCMjQpKSB7CisvKiBUT0RPICovCQkJCVJHQjI0X1BVVFBJWEVMKGZyYW1lLCB4K2l4LCB5K2l5LCAweEZGLCAweEZGLCAweEZGKTsKKwkJCQl9CisJCQl9CisJCQlkaWdpdCA9IGRpZ2l0IDw8IDE7CisJCX0KKwl9Cit9CisKKy8qCisgKiB1c2J2aWRlb19PdmVybGF5U3RyaW5nKCkKKyAqCisgKiBIaXN0b3J5OgorICogMDEtRmViLTIwMDAgQ3JlYXRlZC4KKyAqLworc3RhdGljIHZvaWQgdXNidmlkZW9fT3ZlcmxheVN0cmluZyhzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWUsCisJCQkJICAgaW50IHgsIGludCB5LCBjb25zdCBjaGFyICpzdHIpCit7CisJd2hpbGUgKCpzdHIpIHsKKwkJdXNidmlkZW9fT3ZlcmxheUNoYXIodXZkLCBmcmFtZSwgeCwgeSwgKnN0cik7CisJCXN0cisrOworCQl4ICs9IDQ7IC8qIDMgcGl4ZWxzIGNoYXJhY3RlciArIDEgc3BhY2UgKi8KKwl9Cit9CisKKy8qCisgKiB1c2J2aWRlb19PdmVybGF5U3RhdHMoKQorICoKKyAqIE92ZXJsYXlzIGltcG9ydGFudCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgKgorICogSGlzdG9yeToKKyAqIDAxLUZlYi0yMDAwIENyZWF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHVzYnZpZGVvX092ZXJsYXlTdGF0cyhzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWUpCit7CisJY29uc3QgaW50IHlfZGlmZiA9IDg7CisJY2hhciB0bXBbMTZdOworCWludCB4ID0gMTAsIHk9MTA7CisJbG9uZyBpLCBqLCBiYXJMZW5ndGg7CisJY29uc3QgaW50IHFpX3gxID0gNjAsIHFpX3kxID0gMTA7CisJY29uc3QgaW50IHFpX3gyID0gVklERU9TSVpFX1goZnJhbWUtPnJlcXVlc3QpIC0gMTAsIHFpX2ggPSAxMDsKKworCS8qIENhbGwgdGhlIHVzZXIgY2FsbGJhY2ssIHNlZSBpZiB3ZSBtYXkgcHJvY2VlZCBhZnRlciB0aGF0ICovCisJaWYgKFZBTElEX0NBTExCQUNLKHV2ZCwgb3ZlcmxheUhvb2spKSB7CisJCWlmIChHRVRfQ0FMTEJBQ0sodXZkLCBvdmVybGF5SG9vaykodXZkLCBmcmFtZSkgPCAwKQorCQkJcmV0dXJuOworCX0KKworCS8qCisJICogV2UgZHJhdyBhIChtb3N0bHkpIGhvbGxvdyByZWN0YW5nbGUgd2l0aCBxaV94eHggY29vcmRpbmF0ZXMuCisJICogTGVmdCBlZGdlIHN5bWJvbGl6ZXMgdGhlIHF1ZXVlIGluZGV4IDA7IHJpZ2h0IGVkZ2Ugc3ltYm9saXplcworCSAqIHRoZSBmdWxsIGNhcGFjaXR5IG9mIHRoZSBxdWV1ZS4KKwkgKi8KKwliYXJMZW5ndGggPSBxaV94MiAtIHFpX3gxIC0gMjsKKwlpZiAoKGJhckxlbmd0aCA+IDEwKSAmJiAodXZkLT5wYWxldHRlQml0cyAmICgxTCA8PCBWSURFT19QQUxFVFRFX1JHQjI0KSkpIHsKKy8qIFRPRE8gKi8JbG9uZyB1X2xvLCB1X2hpLCBxX3VzZWQ7CisJCWxvbmcgbV9yaSwgbV93aSwgbV9sbywgbV9oaTsKKworCQkvKgorCQkgKiBEZXRlcm1pbmUgZmlsbCB6b25lcyAodXNlZCBhcmVhcyBvZiB0aGUgcXVldWUpOgorCQkgKiAwIHh4eHh4eHggdV9sbyAuLi4uLi4gdXZkLT5kcC5yaSB4eHh4eHh4eCB1X2hpIC4uLi4uIHV2ZC0+ZHAubGVuZ3RoCisJCSAqCisJCSAqIGlmIHVfbG8gPCAwIHRoZW4gdGhlcmUgaXMgbm8gZmlyc3QgZmlsbGVyLgorCQkgKi8KKworCQlxX3VzZWQgPSBSaW5nUXVldWVfR2V0TGVuZ3RoKCZ1dmQtPmRwKTsKKwkJaWYgKCh1dmQtPmRwLnJpICsgcV91c2VkKSA+PSB1dmQtPmRwLmxlbmd0aCkgeworCQkJdV9oaSA9IHV2ZC0+ZHAubGVuZ3RoOworCQkJdV9sbyA9IChxX3VzZWQgKyB1dmQtPmRwLnJpKSAmICh1dmQtPmRwLmxlbmd0aC0xKTsKKwkJfSBlbHNlIHsKKwkJCXVfaGkgPSAocV91c2VkICsgdXZkLT5kcC5yaSk7CisJCQl1X2xvID0gLTE7CisJCX0KKworCQkvKiBDb252ZXJ0IGJ5dGUgaW5kaWNlcyBpbnRvIHNjcmVlbiB1bml0cyAqLworCQltX3JpID0gcWlfeDEgKyAoKGJhckxlbmd0aCAqIHV2ZC0+ZHAucmkpIC8gdXZkLT5kcC5sZW5ndGgpOworCQltX3dpID0gcWlfeDEgKyAoKGJhckxlbmd0aCAqIHV2ZC0+ZHAud2kpIC8gdXZkLT5kcC5sZW5ndGgpOworCQltX2xvID0gKHVfbG8gPiAwKSA/IChxaV94MSArICgoYmFyTGVuZ3RoICogdV9sbykgLyB1dmQtPmRwLmxlbmd0aCkpIDogLTE7CisJCW1faGkgPSBxaV94MSArICgoYmFyTGVuZ3RoICogdV9oaSkgLyB1dmQtPmRwLmxlbmd0aCk7CisKKwkJZm9yIChqPXFpX3kxOyBqIDwgKHFpX3kxICsgcWlfaCk7IGorKykgeworCQkJZm9yIChpPXFpX3gxOyBpIDwgcWlfeDI7IGkrKykgeworCQkJCS8qIERyYXcgYm9yZGVyIGxpbmVzICovCisJCQkJaWYgKChqID09IHFpX3kxKSB8fCAoaiA9PSAocWlfeTEgKyBxaV9oIC0gMSkpIHx8CisJCQkJICAgIChpID09IHFpX3gxKSB8fCAoaSA9PSAocWlfeDIgLSAxKSkpIHsKKwkJCQkJUkdCMjRfUFVUUElYRUwoZnJhbWUsIGksIGosIDB4RkYsIDB4RkYsIDB4RkYpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogRm9yIGFsbCBvdGhlciBwb2ludHMgdGhlIFkgY29vcmRpbmF0ZSBkb2VzIG5vdCBtYXR0ZXIgKi8KKwkJCQlpZiAoKGkgPj0gbV9yaSkgJiYgKGkgPD0gKG1fcmkgKyAzKSkpIHsKKwkJCQkJUkdCMjRfUFVUUElYRUwoZnJhbWUsIGksIGosIDB4MDAsIDB4RkYsIDB4MDApOworCQkJCX0gZWxzZSBpZiAoKGkgPj0gbV93aSkgJiYgKGkgPD0gKG1fd2kgKyAzKSkpIHsKKwkJCQkJUkdCMjRfUFVUUElYRUwoZnJhbWUsIGksIGosIDB4RkYsIDB4MDAsIDB4MDApOworCQkJCX0gZWxzZSBpZiAoKGkgPCBtX2xvKSB8fCAoKGkgPiBtX3JpKSAmJiAoaSA8IG1faGkpKSkKKwkJCQkJUkdCMjRfUFVUUElYRUwoZnJhbWUsIGksIGosIDB4MDAsIDB4MDAsIDB4RkYpOworCQkJfQorCQl9CisJfQorCisJc3ByaW50Zih0bXAsICIlOGx4IiwgdXZkLT5zdGF0cy5mcmFtZV9udW0pOworCXVzYnZpZGVvX092ZXJsYXlTdHJpbmcodXZkLCBmcmFtZSwgeCwgeSwgdG1wKTsKKwl5ICs9IHlfZGlmZjsKKworCXNwcmludGYodG1wLCAiJThseCIsIHV2ZC0+c3RhdHMudXJiX2NvdW50KTsKKwl1c2J2aWRlb19PdmVybGF5U3RyaW5nKHV2ZCwgZnJhbWUsIHgsIHksIHRtcCk7CisJeSArPSB5X2RpZmY7CisKKwlzcHJpbnRmKHRtcCwgIiU4bHgiLCB1dmQtPnN0YXRzLnVyYl9sZW5ndGgpOworCXVzYnZpZGVvX092ZXJsYXlTdHJpbmcodXZkLCBmcmFtZSwgeCwgeSwgdG1wKTsKKwl5ICs9IHlfZGlmZjsKKworCXNwcmludGYodG1wLCAiJThseCIsIHV2ZC0+c3RhdHMuZGF0YV9jb3VudCk7CisJdXNidmlkZW9fT3ZlcmxheVN0cmluZyh1dmQsIGZyYW1lLCB4LCB5LCB0bXApOworCXkgKz0geV9kaWZmOworCisJc3ByaW50Zih0bXAsICIlOGx4IiwgdXZkLT5zdGF0cy5oZWFkZXJfY291bnQpOworCXVzYnZpZGVvX092ZXJsYXlTdHJpbmcodXZkLCBmcmFtZSwgeCwgeSwgdG1wKTsKKwl5ICs9IHlfZGlmZjsKKworCXNwcmludGYodG1wLCAiJThseCIsIHV2ZC0+c3RhdHMuaXNvX3NraXBfY291bnQpOworCXVzYnZpZGVvX092ZXJsYXlTdHJpbmcodXZkLCBmcmFtZSwgeCwgeSwgdG1wKTsKKwl5ICs9IHlfZGlmZjsKKworCXNwcmludGYodG1wLCAiJThseCIsIHV2ZC0+c3RhdHMuaXNvX2Vycl9jb3VudCk7CisJdXNidmlkZW9fT3ZlcmxheVN0cmluZyh1dmQsIGZyYW1lLCB4LCB5LCB0bXApOworCXkgKz0geV9kaWZmOworCisJc3ByaW50Zih0bXAsICIlOHgiLCB1dmQtPnZwaWMuY29sb3VyKTsKKwl1c2J2aWRlb19PdmVybGF5U3RyaW5nKHV2ZCwgZnJhbWUsIHgsIHksIHRtcCk7CisJeSArPSB5X2RpZmY7CisKKwlzcHJpbnRmKHRtcCwgIiU4eCIsIHV2ZC0+dnBpYy5odWUpOworCXVzYnZpZGVvX092ZXJsYXlTdHJpbmcodXZkLCBmcmFtZSwgeCwgeSwgdG1wKTsKKwl5ICs9IHlfZGlmZjsKKworCXNwcmludGYodG1wLCAiJTh4IiwgdXZkLT52cGljLmJyaWdodG5lc3MgPj4gOCk7CisJdXNidmlkZW9fT3ZlcmxheVN0cmluZyh1dmQsIGZyYW1lLCB4LCB5LCB0bXApOworCXkgKz0geV9kaWZmOworCisJc3ByaW50Zih0bXAsICIlOHgiLCB1dmQtPnZwaWMuY29udHJhc3QgPj4gMTIpOworCXVzYnZpZGVvX092ZXJsYXlTdHJpbmcodXZkLCBmcmFtZSwgeCwgeSwgdG1wKTsKKwl5ICs9IHlfZGlmZjsKKworCXNwcmludGYodG1wLCAiJThkIiwgdXZkLT52cGljLndoaXRlbmVzcyA+PiA4KTsKKwl1c2J2aWRlb19PdmVybGF5U3RyaW5nKHV2ZCwgZnJhbWUsIHgsIHksIHRtcCk7CisJeSArPSB5X2RpZmY7Cit9CisKKy8qCisgKiB1c2J2aWRlb19SZXBvcnRTdGF0aXN0aWNzKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBwcmludHMgcGFja2V0IGFuZCB0cmFuc2ZlciBzdGF0aXN0aWNzLgorICoKKyAqIEhpc3Rvcnk6CisgKiAxNC1KYW4tMjAwMCBDb3JyZWN0ZWQgZGVmYXVsdCBtdWx0aXBsaWVyLgorICovCitzdGF0aWMgdm9pZCB1c2J2aWRlb19SZXBvcnRTdGF0aXN0aWNzKGNvbnN0IHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpZiAoKHV2ZCAhPSBOVUxMKSAmJiAodXZkLT5zdGF0cy51cmJfY291bnQgPiAwKSkgeworCQl1bnNpZ25lZCBsb25nIGFsbFBhY2tldHMsIGJhZFBhY2tldHMsIGdvb2RQYWNrZXRzLCBwZXJjZW50OworCQlhbGxQYWNrZXRzID0gdXZkLT5zdGF0cy51cmJfY291bnQgKiBDQU1FUkFfVVJCX0ZSQU1FUzsKKwkJYmFkUGFja2V0cyA9IHV2ZC0+c3RhdHMuaXNvX3NraXBfY291bnQgKyB1dmQtPnN0YXRzLmlzb19lcnJfY291bnQ7CisJCWdvb2RQYWNrZXRzID0gYWxsUGFja2V0cyAtIGJhZFBhY2tldHM7CisJCS8qIENhbGN1bGF0ZSBwZXJjZW50YWdlIHdpc2VseSwgcmVtZW1iZXIgaW50ZWdlciBsaW1pdHMgKi8KKwkJYXNzZXJ0KGFsbFBhY2tldHMgIT0gMCk7CisJCWlmIChnb29kUGFja2V0cyA8ICgoKHVuc2lnbmVkIGxvbmcpLTEpLzEwMCkpCisJCQlwZXJjZW50ID0gKDEwMCAqIGdvb2RQYWNrZXRzKSAvIGFsbFBhY2tldHM7CisJCWVsc2UKKwkJCXBlcmNlbnQgPSBnb29kUGFja2V0cyAvIChhbGxQYWNrZXRzIC8gMTAwKTsKKwkJaW5mbygiUGFja2V0IFN0YXRpc3RpY3M6IFRvdGFsPSVsdS4gRW1wdHk9JWx1LiBVc2FnZT0lbHUlJSIsCisJCSAgICAgYWxsUGFja2V0cywgYmFkUGFja2V0cywgcGVyY2VudCk7CisJCWlmICh1dmQtPmlzb19wYWNrZXRfbGVuID4gMCkgeworCQkJdW5zaWduZWQgbG9uZyBhbGxCeXRlcywgeGZlckJ5dGVzOworCQkJY2hhciBtdWx0aXBsaWVyID0gJyAnOworCQkJYWxsQnl0ZXMgPSBhbGxQYWNrZXRzICogdXZkLT5pc29fcGFja2V0X2xlbjsKKwkJCXhmZXJCeXRlcyA9IHV2ZC0+c3RhdHMuZGF0YV9jb3VudDsKKwkJCWFzc2VydChhbGxCeXRlcyAhPSAwKTsKKwkJCWlmICh4ZmVyQnl0ZXMgPCAoKCh1bnNpZ25lZCBsb25nKS0xKS8xMDApKQorCQkJCXBlcmNlbnQgPSAoMTAwICogeGZlckJ5dGVzKSAvIGFsbEJ5dGVzOworCQkJZWxzZQorCQkJCXBlcmNlbnQgPSB4ZmVyQnl0ZXMgLyAoYWxsQnl0ZXMgLyAxMDApOworCQkJLyogU2NhbGUgeGZlckJ5dGVzIGZvciBlYXN5IHJlYWRpbmcgKi8KKwkJCWlmICh4ZmVyQnl0ZXMgPiAxMCoxMDI0KSB7CisJCQkJeGZlckJ5dGVzIC89IDEwMjQ7CisJCQkJbXVsdGlwbGllciA9ICdLJzsKKwkJCQlpZiAoeGZlckJ5dGVzID4gMTAqMTAyNCkgeworCQkJCQl4ZmVyQnl0ZXMgLz0gMTAyNDsKKwkJCQkJbXVsdGlwbGllciA9ICdNJzsKKwkJCQkJaWYgKHhmZXJCeXRlcyA+IDEwKjEwMjQpIHsKKwkJCQkJCXhmZXJCeXRlcyAvPSAxMDI0OworCQkJCQkJbXVsdGlwbGllciA9ICdHJzsKKwkJCQkJCWlmICh4ZmVyQnl0ZXMgPiAxMCoxMDI0KSB7CisJCQkJCQkJeGZlckJ5dGVzIC89IDEwMjQ7CisJCQkJCQkJbXVsdGlwbGllciA9ICdUJzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWluZm8oIlRyYW5zZmVyIFN0YXRpc3RpY3M6IFRyYW5zZmVycmVkPSVsdSVjQiBVc2FnZT0lbHUlJSIsCisJCQkgICAgIHhmZXJCeXRlcywgbXVsdGlwbGllciwgcGVyY2VudCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiB1c2J2aWRlb19UZXN0UGF0dGVybigpCisgKgorICogUHJvY2VkdXJlIGZvcm1zIGEgdGVzdCBwYXR0ZXJuICh5ZWxsb3cgZ3JpZCBvbiBibHVlIGJhY2tncm91bmQpLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBmdWxsZnJhbWU6IGlmIFRSVUUgdGhlbiBlbnRpcmUgZnJhbWUgaXMgZmlsbGVkLCBvdGhlcndpc2UgdGhlIHByb2NlZHVyZQorICoJICAgICAgY29udGludWVzIGZyb20gdGhlIGN1cnJlbnQgc2NhbmxpbmUuCisgKiBwbW9kZSAgICAgIDA6IGZpbGwgdGhlIGZyYW1lIHdpdGggc29saWQgYmx1ZSBjb2xvciAobGlrZSBvbiBWQ1Igb3IgVFYpCisgKgkgICAgICAxOiBEcmF3IGEgY29sb3JlZCBncmlkCisgKgorICogSGlzdG9yeToKKyAqIDAxLUZlYi0yMDAwIENyZWF0ZWQuCisgKi8KK3ZvaWQgdXNidmlkZW9fVGVzdFBhdHRlcm4oc3RydWN0IHV2ZCAqdXZkLCBpbnQgZnVsbGZyYW1lLCBpbnQgcG1vZGUpCit7CisJc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZTsKKwlpbnQgbnVtX2NlbGwgPSAwOworCWludCBzY2FuX2xlbmd0aCA9IDA7CisJc3RhdGljIGludCBudW1fcGFzcyA9IDA7CisKKwlpZiAodXZkID09IE5VTEwpIHsKKwkJZXJyKCIlczogdXZkID09IE5VTEwiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCWlmICgodXZkLT5jdXJmcmFtZSA8IDApIHx8ICh1dmQtPmN1cmZyYW1lID49IFVTQlZJREVPX05VTUZSQU1FUykpIHsKKwkJZXJyKCIlczogdXZkLT5jdXJmcmFtZT0lZC4iLCBfX0ZVTkNUSU9OX18sIHV2ZC0+Y3VyZnJhbWUpOworCQlyZXR1cm47CisJfQorCisJLyogR3JhYiB0aGUgY3VycmVudCBmcmFtZSAqLworCWZyYW1lID0gJnV2ZC0+ZnJhbWVbdXZkLT5jdXJmcmFtZV07CisKKwkvKiBPcHRpb25hbGx5IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgKi8KKwlpZiAoZnVsbGZyYW1lKSB7CisJCWZyYW1lLT5jdXJsaW5lID0gMDsKKwkJZnJhbWUtPnNlcVJlYWRfTGVuZ3RoID0gMDsKKwl9CisjaWYgMAorCXsJLyogRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5ICovCisJCWNoYXIgdG1wWzIwXTsKKwkJdXNidmlkZW9fVmlkZW9zaXplVG9TdHJpbmcodG1wLCBzaXplb2YodG1wKSwgZnJhbWUtPnJlcXVlc3QpOworCQlpbmZvKCJ0ZXN0cGF0dGVybjogZnJhbWU9JXMiLCB0bXApOworCX0KKyNlbmRpZgorCS8qIEZvcm0gZXZlcnkgc2NhbiBsaW5lICovCisJZm9yICg7IGZyYW1lLT5jdXJsaW5lIDwgVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpOyBmcmFtZS0+Y3VybGluZSsrKSB7CisJCWludCBpOworCQl1bnNpZ25lZCBjaGFyICpmID0gZnJhbWUtPmRhdGEgKworCQkJKFZJREVPU0laRV9YKGZyYW1lLT5yZXF1ZXN0KSAqIFY0TF9CWVRFU19QRVJfUElYRUwgKiBmcmFtZS0+Y3VybGluZSk7CisJCWZvciAoaT0wOyBpIDwgVklERU9TSVpFX1goZnJhbWUtPnJlcXVlc3QpOyBpKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgY2I9MHg4MDsKKwkJCXVuc2lnbmVkIGNoYXIgY2cgPSAwOworCQkJdW5zaWduZWQgY2hhciBjciA9IDA7CisKKwkJCWlmIChwbW9kZSA9PSAxKSB7CisJCQkJaWYgKGZyYW1lLT5jdXJsaW5lICUgMzIgPT0gMCkKKwkJCQkJY2IgPSAwLCBjZyA9IGNyID0gMHhGRjsKKwkJCQllbHNlIGlmIChpICUgMzIgPT0gMCkgeworCQkJCQlpZiAoZnJhbWUtPmN1cmxpbmUgJSAzMiA9PSAxKQorCQkJCQkJbnVtX2NlbGwrKzsKKwkJCQkJY2IgPSAwLCBjZyA9IGNyID0gMHhGRjsKKwkJCQl9IGVsc2UgeworCQkJCQljYiA9ICgobnVtX2NlbGwqNykgKyBudW1fcGFzcykgJiAweEZGOworCQkJCQljZyA9ICgobnVtX2NlbGwqNSkgKyBudW1fcGFzcyoyKSAmIDB4RkY7CisJCQkJCWNyID0gKChudW1fY2VsbCozKSArIG51bV9wYXNzKjMpICYgMHhGRjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIEp1c3QgdGhlIGJsdWUgc2NyZWVuICovCisJCQl9CisJCQkJCisJCQkqZisrID0gY2I7CisJCQkqZisrID0gY2c7CisJCQkqZisrID0gY3I7CisJCQlzY2FuX2xlbmd0aCArPSAzOworCQl9CisJfQorCisJZnJhbWUtPmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX0RvbmU7CisJZnJhbWUtPnNlcVJlYWRfTGVuZ3RoICs9IHNjYW5fbGVuZ3RoOworCSsrbnVtX3Bhc3M7CisKKwkvKiBXZSBkbyB0aGlzIHVuY29uZGl0aW9uYWxseSwgcmVnYXJkbGVzcyBvZiBGTEFHU19PVkVSTEFZX1NUQVRTICovCisJdXNidmlkZW9fT3ZlcmxheVN0YXRzKHV2ZCwgZnJhbWUpOworfQorCitFWFBPUlRfU1lNQk9MKHVzYnZpZGVvX1Rlc3RQYXR0ZXJuKTsKKworCisjaWZkZWYgREVCVUcKKy8qCisgKiB1c2J2aWRlb19IZXhEdW1wKCkKKyAqCisgKiBBIGRlYnVnZ2luZyB0b29sLiBQcmludHMgaGV4IGR1bXBzLgorICoKKyAqIEhpc3Rvcnk6CisgKiAyOS1KdWwtMjAwMCBBZGRlZCBwcmludGluZyBvZiBvZmZzZXRzLgorICovCit2b2lkIHVzYnZpZGVvX0hleER1bXAoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwljb25zdCBpbnQgYnl0ZXNfcGVyX2xpbmUgPSAzMjsKKwljaGFyIHRtcFsxMjhdOyAvKiAzMiozICsgNSAqLworCWludCBpLCBrOworCisJZm9yIChpPWs9MDsgbGVuID4gMDsgaSsrLCBsZW4tLSkgeworCQlpZiAoaSA+IDAgJiYgKChpICUgYnl0ZXNfcGVyX2xpbmUpID09IDApKSB7CisJCQlwcmludGsoIiVzXG4iLCB0bXApOworCQkJaz0wOworCQl9CisJCWlmICgoaSAlIGJ5dGVzX3Blcl9saW5lKSA9PSAwKQorCQkJayArPSBzcHJpbnRmKCZ0bXBba10sICIlMDR4OiAiLCBpKTsKKwkJayArPSBzcHJpbnRmKCZ0bXBba10sICIlMDJ4ICIsIGRhdGFbaV0pOworCX0KKwlpZiAoayA+IDApCisJCXByaW50aygiJXNcbiIsIHRtcCk7Cit9CisKK0VYUE9SVF9TWU1CT0wodXNidmlkZW9fSGV4RHVtcCk7CisKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBYWFg6IHRoaXMgcGllY2Ugb2YgY3JhcCByZWFsbHkgd2FudHMgc29tZSBlcnJvciBoYW5kbGluZy4uICovCitzdGF0aWMgdm9pZCB1c2J2aWRlb19DbGllbnRJbmNNb2RDb3VudChzdHJ1Y3QgdXZkICp1dmQpCit7CisJaWYgKHV2ZCA9PSBOVUxMKSB7CisJCWVycigiJXM6IHV2ZCA9PSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodXZkLT5oYW5kbGUgPT0gTlVMTCkgeworCQllcnIoIiVzOiB1dmQtPmhhbmRsZSA9PSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodXZkLT5oYW5kbGUtPm1kX21vZHVsZSA9PSBOVUxMKSB7CisJCWVycigiJXM6IHV2ZC0+aGFuZGxlLT5tZF9tb2R1bGUgPT0gTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJaWYgKCF0cnlfbW9kdWxlX2dldCh1dmQtPmhhbmRsZS0+bWRfbW9kdWxlKSkgeworCQllcnIoIiVzOiB0cnlfbW9kdWxlX2dldCgpID09IDAiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZCB1c2J2aWRlb19DbGllbnREZWNNb2RDb3VudChzdHJ1Y3QgdXZkICp1dmQpCit7CisJaWYgKHV2ZCA9PSBOVUxMKSB7CisJCWVycigiJXM6IHV2ZCA9PSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodXZkLT5oYW5kbGUgPT0gTlVMTCkgeworCQllcnIoIiVzOiB1dmQtPmhhbmRsZSA9PSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodXZkLT5oYW5kbGUtPm1kX21vZHVsZSA9PSBOVUxMKSB7CisJCWVycigiJXM6IHV2ZC0+aGFuZGxlLT5tZF9tb2R1bGUgPT0gTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJbW9kdWxlX3B1dCh1dmQtPmhhbmRsZS0+bWRfbW9kdWxlKTsKK30KKworaW50IHVzYnZpZGVvX3JlZ2lzdGVyKAorCXN0cnVjdCB1c2J2aWRlbyAqKnBDYW1zLAorCWNvbnN0IGludCBudW1fY2FtcywKKwljb25zdCBpbnQgbnVtX2V4dHJhLAorCWNvbnN0IGNoYXIgKmRyaXZlck5hbWUsCisJY29uc3Qgc3RydWN0IHVzYnZpZGVvX2NiICpjYlRibCwKKwlzdHJ1Y3QgbW9kdWxlICptZCwKKwljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWRfdGFibGUpCit7CisJc3RydWN0IHVzYnZpZGVvICpjYW1zOworCWludCBpLCBiYXNlX3NpemUsIHJlc3VsdDsKKworCS8qIENoZWNrIHBhcmFtZXRlcnMgZm9yIHNhbml0eSAqLworCWlmICgobnVtX2NhbXMgPD0gMCkgfHwgKHBDYW1zID09IE5VTEwpIHx8IChjYlRibCA9PSBOVUxMKSkgeworCQllcnIoIiVzOiBJbGxlZ2FsIGNhbGwiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayByZWdpc3RyYXRpb24gY2FsbGJhY2sgLSBtdXN0IGJlIHNldCEgKi8KKwlpZiAoY2JUYmwtPnByb2JlID09IE5VTEwpIHsKKwkJZXJyKCIlczogcHJvYmUoKSBpcyByZXF1aXJlZCEiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwliYXNlX3NpemUgPSBudW1fY2FtcyAqIHNpemVvZihzdHJ1Y3QgdXZkKSArIHNpemVvZihzdHJ1Y3QgdXNidmlkZW8pOworCWNhbXMgPSAoc3RydWN0IHVzYnZpZGVvICopIGttYWxsb2MoYmFzZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FtcyA9PSBOVUxMKSB7CisJCWVycigiRmFpbGVkIHRvIGFsbG9jYXRlICVkLiBieXRlcyBmb3IgdXNidmlkZW8gc3RydWN0IiwgYmFzZV9zaXplKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRiZygiJXM6IEFsbG9jYXRlZCAkJXAgKCVkLiBieXRlcykgZm9yICVkLiBjYW1lcmFzIiwKKwkgICAgX19GVU5DVElPTl9fLCBjYW1zLCBiYXNlX3NpemUsIG51bV9jYW1zKTsKKwltZW1zZXQoY2FtcywgMCwgYmFzZV9zaXplKTsKKworCS8qIENvcHkgY2FsbGJhY2tzLCBhcHBseSBkZWZhdWx0cyBmb3IgdGhvc2UgdGhhdCBhcmUgbm90IHNldCAqLworCW1lbW1vdmUoJmNhbXMtPmNiLCBjYlRibCwgc2l6ZW9mKGNhbXMtPmNiKSk7CisJaWYgKGNhbXMtPmNiLmdldEZyYW1lID09IE5VTEwpCisJCWNhbXMtPmNiLmdldEZyYW1lID0gdXNidmlkZW9fR2V0RnJhbWU7CisJaWYgKGNhbXMtPmNiLmRpc2Nvbm5lY3QgPT0gTlVMTCkKKwkJY2Ftcy0+Y2IuZGlzY29ubmVjdCA9IHVzYnZpZGVvX0Rpc2Nvbm5lY3Q7CisJaWYgKGNhbXMtPmNiLnN0YXJ0RGF0YVB1bXAgPT0gTlVMTCkKKwkJY2Ftcy0+Y2Iuc3RhcnREYXRhUHVtcCA9IHVzYnZpZGVvX1N0YXJ0RGF0YVB1bXA7CisJaWYgKGNhbXMtPmNiLnN0b3BEYXRhUHVtcCA9PSBOVUxMKQorCQljYW1zLT5jYi5zdG9wRGF0YVB1bXAgPSB1c2J2aWRlb19TdG9wRGF0YVB1bXA7CisKKwljYW1zLT5udW1fY2FtZXJhcyA9IG51bV9jYW1zOworCWNhbXMtPmNhbSA9IChzdHJ1Y3QgdXZkICopICZjYW1zWzFdOworCWNhbXMtPm1kX21vZHVsZSA9IG1kOworCWlmIChjYW1zLT5tZF9tb2R1bGUgPT0gTlVMTCkKKwkJd2FybigiJXM6IG1vZHVsZSA9PSBOVUxMISIsIF9fRlVOQ1RJT05fXyk7CisJaW5pdF9NVVRFWCgmY2Ftcy0+bG9jayk7CS8qIHRvIDEgPT0gYXZhaWxhYmxlICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NhbXM7IGkrKykgeworCQlzdHJ1Y3QgdXZkICp1cCA9ICZjYW1zLT5jYW1baV07CisKKwkJdXAtPmhhbmRsZSA9IGNhbXM7CisKKwkJLyogQWxsb2NhdGUgdXNlcl9kYXRhIHNlcGFyYXRlbHkgYmVjYXVzZSBvZiBrbWFsbG9jJ3MgbGltaXRzICovCisJCWlmIChudW1fZXh0cmEgPiAwKSB7CisJCQl1cC0+dXNlcl9zaXplID0gbnVtX2NhbXMgKiBudW1fZXh0cmE7CisJCQl1cC0+dXNlcl9kYXRhID0gKGNoYXIgKikga21hbGxvYyh1cC0+dXNlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWlmICh1cC0+dXNlcl9kYXRhID09IE5VTEwpIHsKKwkJCQllcnIoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgdXNlcl9kYXRhICglZC4gYnl0ZXMpIiwKKwkJCQkgICAgX19GVU5DVElPTl9fLCB1cC0+dXNlcl9zaXplKTsKKwkJCQl3aGlsZSAoaSkgeworCQkJCQl1cCA9ICZjYW1zLT5jYW1bLS1pXTsKKwkJCQkJa2ZyZWUodXAtPnVzZXJfZGF0YSk7CisJCQkJfQorCQkJCWtmcmVlKGNhbXMpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJZGJnKCIlczogQWxsb2NhdGVkIGNhbXNbJWRdLnVzZXJfZGF0YT0kJXAgKCVkLiBieXRlcykiLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIGksIHVwLT51c2VyX2RhdGEsIHVwLT51c2VyX3NpemUpOworCQl9CisJfQorCisJLyoKKwkgKiBSZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCBVU0Igc3RhY2suCisJICovCisJc3RyY3B5KGNhbXMtPmRydk5hbWUsIChkcml2ZXJOYW1lICE9IE5VTEwpID8gZHJpdmVyTmFtZSA6ICJVbmtub3duIik7CisJY2Ftcy0+dXNiZHJ2Lm5hbWUgPSBjYW1zLT5kcnZOYW1lOworCWNhbXMtPnVzYmRydi5wcm9iZSA9IGNhbXMtPmNiLnByb2JlOworCWNhbXMtPnVzYmRydi5kaXNjb25uZWN0ID0gY2Ftcy0+Y2IuZGlzY29ubmVjdDsKKwljYW1zLT51c2JkcnYuaWRfdGFibGUgPSBpZF90YWJsZTsKKworCS8qCisJICogVXBkYXRlIGdsb2JhbCBoYW5kbGUgdG8gdXNidmlkZW8uIFRoaXMgaXMgdmVyeSBpbXBvcnRhbnQKKwkgKiBiZWNhdXNlIHByb2JlKCkgY2FuIGJlIGNhbGxlZCBiZWZvcmUgdXNiX3JlZ2lzdGVyKCkgcmV0dXJucy4KKwkgKiBJZiB0aGUgaGFuZGxlIGlzIG5vdCB5ZXQgdXBkYXRlZCB0aGVuIHRoZSBwcm9iZSgpIHdpbGwgZmFpbC4KKwkgKi8KKwkqcENhbXMgPSBjYW1zOworCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmY2Ftcy0+dXNiZHJ2KTsKKwlpZiAocmVzdWx0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fY2FtczsgaSsrKSB7CisJCQlzdHJ1Y3QgdXZkICp1cCA9ICZjYW1zLT5jYW1baV07CisJCQlrZnJlZSh1cC0+dXNlcl9kYXRhKTsKKwkJfQorCQlrZnJlZShjYW1zKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitFWFBPUlRfU1lNQk9MKHVzYnZpZGVvX3JlZ2lzdGVyKTsKKworLyoKKyAqIHVzYnZpZGVvX0RlcmVnaXN0ZXIoKQorICoKKyAqIFByb2NlZHVyZSBmcmVlcyBhbGwgdXNidmlkZW8gYW5kIHVzZXIgZGF0YSBzdHJ1Y3R1cmVzLiBCZSB3YXJuZWQgdGhhdAorICogaWYgeW91IGhhZCBzb21lIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBjb21wb25lbnRzIGluIC0+dXNlciBmaWVsZCB0aGVuCisgKiB5b3Ugc2hvdWxkIGZyZWUgdGhlbSBiZWZvcmUgY2FsbGluZyBoZXJlLgorICovCit2b2lkIHVzYnZpZGVvX0RlcmVnaXN0ZXIoc3RydWN0IHVzYnZpZGVvICoqcENhbXMpCit7CisJc3RydWN0IHVzYnZpZGVvICpjYW1zOworCWludCBpOworCisJaWYgKHBDYW1zID09IE5VTEwpIHsKKwkJZXJyKCIlczogcENhbXMgPT0gTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJY2FtcyA9ICpwQ2FtczsKKwlpZiAoY2FtcyA9PSBOVUxMKSB7CisJCWVycigiJXM6IGNhbXMgPT0gTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlkYmcoIiVzOiBEZXJlZ2lzdGVyaW5nICVzIGRyaXZlci4iLCBfX0ZVTkNUSU9OX18sIGNhbXMtPmRydk5hbWUpOworCXVzYl9kZXJlZ2lzdGVyKCZjYW1zLT51c2JkcnYpOworCisJZGJnKCIlczogRGVhbGxvY2F0aW5nIGNhbXM9JCVwICglZC4gY2FtZXJhcykiLCBfX0ZVTkNUSU9OX18sIGNhbXMsIGNhbXMtPm51bV9jYW1lcmFzKTsKKwlmb3IgKGk9MDsgaSA8IGNhbXMtPm51bV9jYW1lcmFzOyBpKyspIHsKKwkJc3RydWN0IHV2ZCAqdXAgPSAmY2Ftcy0+Y2FtW2ldOworCQlpbnQgd2FybmluZyA9IDA7CisKKwkJaWYgKHVwLT51c2VyX2RhdGEgIT0gTlVMTCkgeworCQkJaWYgKHVwLT51c2VyX3NpemUgPD0gMCkKKwkJCQkrK3dhcm5pbmc7CisJCX0gZWxzZSB7CisJCQlpZiAodXAtPnVzZXJfc2l6ZSA+IDApCisJCQkJKyt3YXJuaW5nOworCQl9CisJCWlmICh3YXJuaW5nKSB7CisJCQllcnIoIiVzOiBXYXJuaW5nOiB1c2VyX2RhdGE9JCVwIHVzZXJfc2l6ZT0lZC4iLAorCQkJICAgIF9fRlVOQ1RJT05fXywgdXAtPnVzZXJfZGF0YSwgdXAtPnVzZXJfc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlkYmcoIiVzOiBGcmVlaW5nICVkLiAkJXAtPnVzZXJfZGF0YT0kJXAiLAorCQkJICAgIF9fRlVOQ1RJT05fXywgaSwgdXAsIHVwLT51c2VyX2RhdGEpOworCQkJa2ZyZWUodXAtPnVzZXJfZGF0YSk7CisJCX0KKwl9CisJLyogV2hvbGUgYXJyYXkgd2FzIGFsbG9jYXRlZCBpbiBvbmUgY2h1bmsgKi8KKwlkYmcoIiVzOiBGcmVlZCAlZCB1dmQgc3RydWN0dXJlcyIsCisJICAgIF9fRlVOQ1RJT05fXywgY2Ftcy0+bnVtX2NhbWVyYXMpOworCWtmcmVlKGNhbXMpOworCSpwQ2FtcyA9IE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0wodXNidmlkZW9fRGVyZWdpc3Rlcik7CisKKy8qCisgKiB1c2J2aWRlb19EaXNjb25uZWN0KCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBzdG9wcyBhbGwgZHJpdmVyIGFjdGl2aXR5LiBEZWFsbG9jYXRpb24gb2YKKyAqIHRoZSBpbnRlcmZhY2UtcHJpdmF0ZSBzdHJ1Y3R1cmUgKHBvaW50ZWQgYnkgJ3B0cicpIGlzIGRvbmUgbm93CisgKiAoaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgb3BlbiBmaWxlcykgb3IgbGF0ZXIsIHdoZW4gdGhvc2UgZmlsZXMKKyAqIGFyZSBjbG9zZWQuIEFmdGVyIHRoYXQgZHJpdmVyIHNob3VsZCBiZSByZW1vdmFibGUuCisgKgorICogVGhpcyBjb2RlIGhhbmRsZXMgc3VycHJpc2UgcmVtb3ZhbC4gVGhlIHV2ZC0+dXNlciBpcyBhIGNvdW50ZXIgd2hpY2gKKyAqIGluY3JlbWVudHMgb24gb3BlbigpIGFuZCBkZWNyZW1lbnRzIG9uIGNsb3NlKCkuIElmIHdlIHNlZSBoZXJlIHRoYXQKKyAqIHRoaXMgY291bnRlciBpcyBub3QgMCB0aGVuIHdlIGhhdmUgYSBjbGllbnQgd2hvIHN0aWxsIGhhcyB1cyBvcGVuZWQuCisgKiBXZSBzZXQgdXZkLT5yZW1vdmVfcGVuZGluZyBmbGFnIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBhbmQgYWZ0ZXIgdGhhdAorICogYWxsIGFjY2VzcyB0byB0aGUgY2FtZXJhIHdpbGwgZ3JhY2VmdWxseSBmYWlsLiBUaGVzZSBmYWlsdXJlcyBzaG91bGQKKyAqIHByb21wdCBjbGllbnQgdG8gKGV2ZW50dWFsbHkpIGNsb3NlIHRoZSB2aWRlbyBkZXZpY2UsIGFuZCB0aGVuIC0gaW4KKyAqIHVzYnZpZGVvX3Y0bF9jbG9zZSgpIC0gd2UgZGVjcmVtZW50IHV2ZC0+dXZkX3VzZWQgYW5kIHVzYWdlIGNvdW50ZXIuCisgKgorICogSGlzdG9yeToKKyAqIDIyLUphbi0yMDAwIEFkZGVkIHBvbGxpbmcgb2YgTU9EX0lOX1VTRSB0byBkZWxheSByZW1vdmFsIHVudGlsIGFsbCB1c2VycyBnb25lLgorICogMjctSmFuLTIwMDAgUmV3b3JrZWQgdG8gYWxsb3cgcGVuZGluZyBkaXNjb25uZWN0czsgc2VlIHh4eF9jbG9zZSgpCisgKiAyNC1NYXktMjAwMCBDb3JyZWN0ZWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbiAoTU9EX3h4eF9VU0VfQ09VTlQpLgorICogMTktT2N0LTIwMDAgTW92ZWQgdG8gdXNidmlkZW8gbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCB1c2J2aWRlb19EaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1dmQgKnV2ZCA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOworCWludCBpOworCisJaWYgKHV2ZCA9PSBOVUxMKSB7CisJCWVycigiJXMoJCVwKTogSWxsZWdhbCBjYWxsLiIsIF9fRlVOQ1RJT05fXywgaW50Zik7CisJCXJldHVybjsKKwl9CisKKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBOVUxMKTsKKworCXVzYnZpZGVvX0NsaWVudEluY01vZENvdW50KHV2ZCk7CisJaWYgKHV2ZC0+ZGVidWcgPiAwKQorCQlpbmZvKCIlcyglcC4pIiwgX19GVU5DVElPTl9fLCBpbnRmKTsKKworCWRvd24oJnV2ZC0+bG9jayk7CisJdXZkLT5yZW1vdmVfcGVuZGluZyA9IDE7IC8qIE5vdyBhbGwgSVNPIGRhdGEgd2lsbCBiZSBpZ25vcmVkICovCisKKwkvKiBBdCB0aGlzIHRpbWUgd2UgYXNrIHRvIGNhbmNlbCBvdXRzdGFuZGluZyBVUkJzICovCisJR0VUX0NBTExCQUNLKHV2ZCwgc3RvcERhdGFQdW1wKSh1dmQpOworCisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspCisJCXVzYl9mcmVlX3VyYih1dmQtPnNidWZbaV0udXJiKTsKKworCXVzYl9wdXRfZGV2KHV2ZC0+ZGV2KTsKKwl1dmQtPmRldiA9IE5VTEw7ICAgIAkgICAgLyogVVNCIGRldmljZSBpcyBubyBtb3JlICovCisKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmdXZkLT52ZGV2KTsKKwlpZiAodXZkLT5kZWJ1ZyA+IDApCisJCWluZm8oIiVzOiBWaWRlbyB1bnJlZ2lzdGVyZWQuIiwgX19GVU5DVElPTl9fKTsKKworCWlmICh1dmQtPnVzZXIpCisJCWluZm8oIiVzOiBJbiB1c2UsIGRpc2Nvbm5lY3QgcGVuZGluZy4iLCBfX0ZVTkNUSU9OX18pOworCWVsc2UKKwkJdXNidmlkZW9fQ2FtZXJhUmVsZWFzZSh1dmQpOworCXVwKCZ1dmQtPmxvY2spOworCWluZm8oIlVTQiBjYW1lcmEgZGlzY29ubmVjdGVkLiIpOworCisJdXNidmlkZW9fQ2xpZW50RGVjTW9kQ291bnQodXZkKTsKK30KKworLyoKKyAqIHVzYnZpZGVvX0NhbWVyYVJlbGVhc2UoKQorICoKKyAqIFRoaXMgY29kZSBkb2VzIGZpbmFsIHJlbGVhc2Ugb2YgdXZkLiBUaGlzIGhhcHBlbnMKKyAqIGFmdGVyIHRoZSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkIC1hbmQtIGFsbCBjbGllbnRzCisgKiBjbG9zZWQgdGhlaXIgZmlsZXMuCisgKgorICogSGlzdG9yeToKKyAqIDI3LUphbi0yMDAwIENyZWF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHVzYnZpZGVvX0NhbWVyYVJlbGVhc2Uoc3RydWN0IHV2ZCAqdXZkKQoreworCWlmICh1dmQgPT0gTlVMTCkgeworCQllcnIoIiVzOiBJbGxlZ2FsIGNhbGwiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJUmluZ1F1ZXVlX0ZyZWUoJnV2ZC0+ZHApOworCWlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIHVzZXJGcmVlKSkKKwkJR0VUX0NBTExCQUNLKHV2ZCwgdXNlckZyZWUpKHV2ZCk7CisJdXZkLT51dmRfdXNlZCA9IDA7CS8qIFRoaXMgaXMgYXRvbWljLCBubyBuZWVkIHRvIHRha2UgbXV0ZXggKi8KK30KKworLyoKKyAqIHVzYnZpZGVvX2ZpbmRfc3RydWN0KCkKKyAqCisgKiBUaGlzIGNvZGUgc2VhcmNoZXMgdGhlIGFycmF5IG9mIHByZWFsbG9jYXRlZCAoc3RhdGljKSBzdHJ1Y3R1cmVzCisgKiBhbmQgcmV0dXJucyBpbmRleCBvZiB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgaW4gdXNlLiBSZXR1cm5zIC0xCisgKiBpZiB0aGVyZSBhcmUgbm8gZnJlZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEhpc3Rvcnk6CisgKiAyNy1KYW4tMjAwMCBDcmVhdGVkLgorICovCitzdGF0aWMgaW50IHVzYnZpZGVvX2ZpbmRfc3RydWN0KHN0cnVjdCB1c2J2aWRlbyAqY2FtcykKK3sKKwlpbnQgdSwgcnYgPSAtMTsKKworCWlmIChjYW1zID09IE5VTEwpIHsKKwkJZXJyKCJObyB1c2J2aWRlbyBoYW5kbGU/Iik7CisJCXJldHVybiAtMTsKKwl9CisJZG93bigmY2Ftcy0+bG9jayk7CisJZm9yICh1ID0gMDsgdSA8IGNhbXMtPm51bV9jYW1lcmFzOyB1KyspIHsKKwkJc3RydWN0IHV2ZCAqdXZkID0gJmNhbXMtPmNhbVt1XTsKKwkJaWYgKCF1dmQtPnV2ZF91c2VkKSAvKiBUaGlzIG9uZSBpcyBmcmVlICovCisJCXsKKwkJCXV2ZC0+dXZkX3VzZWQgPSAxOwkvKiBJbiB1c2Ugbm93ICovCisJCQlpbml0X01VVEVYKCZ1dmQtPmxvY2spOwkvKiB0byAxID09IGF2YWlsYWJsZSAqLworCQkJdXZkLT5kZXYgPSBOVUxMOworCQkJcnYgPSB1OworCQkJYnJlYWs7CisJCX0KKwl9CisJdXAoJmNhbXMtPmxvY2spOworCXJldHVybiBydjsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNidmlkZW9fZm9wcyA9IHsKKwkub3duZXIgPSAgVEhJU19NT0RVTEUsCisJLm9wZW4gPSAgIHVzYnZpZGVvX3Y0bF9vcGVuLAorCS5yZWxlYXNlID11c2J2aWRlb192NGxfY2xvc2UsCisJLnJlYWQgPSAgIHVzYnZpZGVvX3Y0bF9yZWFkLAorCS5tbWFwID0gICB1c2J2aWRlb192NGxfbW1hcCwKKwkuaW9jdGwgPSAgdXNidmlkZW9fdjRsX2lvY3RsLAorCS5sbHNlZWsgPSBub19sbHNlZWssCit9Oworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdXNidmlkZW9fdGVtcGxhdGUgPSB7CisJLm93bmVyID0gICAgICBUSElTX01PRFVMRSwKKwkudHlwZSA9ICAgICAgIFZJRF9UWVBFX0NBUFRVUkUsCisJLmhhcmR3YXJlID0gICBWSURfSEFSRFdBUkVfQ1BJQSwKKwkuZm9wcyA9ICAgICAgICZ1c2J2aWRlb19mb3BzLAorfTsKKworc3RydWN0IHV2ZCAqdXNidmlkZW9fQWxsb2NhdGVEZXZpY2Uoc3RydWN0IHVzYnZpZGVvICpjYW1zKQoreworCWludCBpLCBkZXZudW07CisJc3RydWN0IHV2ZCAqdXZkID0gTlVMTDsKKworCWlmIChjYW1zID09IE5VTEwpIHsKKwkJZXJyKCJObyB1c2J2aWRlbyBoYW5kbGU/Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRldm51bSA9IHVzYnZpZGVvX2ZpbmRfc3RydWN0KGNhbXMpOworCWlmIChkZXZudW0gPT0gLTEpIHsKKwkJZXJyKCJJQk0gVVNCIGNhbWVyYSBkcml2ZXI6IFRvbyBtYW55IGRldmljZXMhIik7CisJCXJldHVybiBOVUxMOworCX0KKwl1dmQgPSAmY2Ftcy0+Y2FtW2Rldm51bV07CisJZGJnKCJEZXZpY2UgZW50cnkgIyVkLiBhdCAkJXAiLCBkZXZudW0sIHV2ZCk7CisKKwkvKiBOb3QgcmVseWluZyB1cG9uIGNhbGxlciB3ZSBpbmNyZWFzZSBtb2R1bGUgY291bnRlciBvdXJzZWx2ZXMgKi8KKwl1c2J2aWRlb19DbGllbnRJbmNNb2RDb3VudCh1dmQpOworCisJZG93bigmdXZkLT5sb2NrKTsKKwlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQl1dmQtPnNidWZbaV0udXJiID0gdXNiX2FsbG9jX3VyYihGUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOworCQlpZiAodXZkLT5zYnVmW2ldLnVyYiA9PSBOVUxMKSB7CisJCQllcnIoInVzYl9hbGxvY191cmIoJWQuKSBmYWlsZWQuIiwgRlJBTUVTX1BFUl9ERVNDKTsKKwkJCXV2ZC0+dXZkX3VzZWQgPSAwOworCQkJdXZkID0gTlVMTDsKKwkJCWdvdG8gYWxsb2NhdGVfZG9uZTsKKwkJfQorCX0KKwl1dmQtPnVzZXI9MDsKKwl1dmQtPnJlbW92ZV9wZW5kaW5nID0gMDsKKwl1dmQtPmxhc3RfZXJyb3IgPSAwOworCVJpbmdRdWV1ZV9Jbml0aWFsaXplKCZ1dmQtPmRwKTsKKworCS8qIEluaXRpYWxpemUgdmlkZW8gZGV2aWNlIHN0cnVjdHVyZSAqLworCXV2ZC0+dmRldiA9IHVzYnZpZGVvX3RlbXBsYXRlOworCXNwcmludGYodXZkLT52ZGV2Lm5hbWUsICIlLjIwcyBVU0IgQ2FtZXJhIiwgY2Ftcy0+ZHJ2TmFtZSk7CisJLyoKKwkgKiBUaGUgY2xpZW50IGlzIGZyZWUgdG8gb3ZlcndyaXRlIHRob3NlIGJlY2F1c2Ugd2UKKwkgKiByZXR1cm4gY29udHJvbCB0byB0aGUgY2xpZW50J3MgcHJvYmUgZnVuY3Rpb24gcmlnaHQgbm93LgorCSAqLworYWxsb2NhdGVfZG9uZToKKwl1cCAoJnV2ZC0+bG9jayk7CisJdXNidmlkZW9fQ2xpZW50RGVjTW9kQ291bnQodXZkKTsKKwlyZXR1cm4gdXZkOworfQorCitFWFBPUlRfU1lNQk9MKHVzYnZpZGVvX0FsbG9jYXRlRGV2aWNlKTsKKworaW50IHVzYnZpZGVvX1JlZ2lzdGVyVmlkZW9EZXZpY2Uoc3RydWN0IHV2ZCAqdXZkKQoreworCWNoYXIgdG1wMVsyMF0sIHRtcDJbMjBdOwkvKiBCdWZmZXJzIGZvciBwcmludGluZyAqLworCisJaWYgKHV2ZCA9PSBOVUxMKSB7CisJCWVycigiJXM6IElsbGVnYWwgY2FsbC4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHV2ZC0+dmlkZW9fZW5kcCA9PSAwKSB7CisJCWluZm8oIiVzOiBObyB2aWRlbyBlbmRwb2ludCBzcGVjaWZpZWQ7IGRhdGEgcHVtcCBkaXNhYmxlZC4iLCBfX0ZVTkNUSU9OX18pOworCX0KKwlpZiAodXZkLT5wYWxldHRlQml0cyA9PSAwKSB7CisJCWVycigiJXM6IE5vIHBhbGV0dGVzIHNwZWNpZmllZCEiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHV2ZC0+ZGVmYXVsdFBhbGV0dGUgPT0gMCkgeworCQlpbmZvKCIlczogTm8gZGVmYXVsdCBwYWxldHRlISIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisJdXZkLT5tYXhfZnJhbWVfc2l6ZSA9IFZJREVPU0laRV9YKHV2ZC0+Y2FudmFzKSAqCisJCVZJREVPU0laRV9ZKHV2ZC0+Y2FudmFzKSAqIFY0TF9CWVRFU19QRVJfUElYRUw7CisJdXNidmlkZW9fVmlkZW9zaXplVG9TdHJpbmcodG1wMSwgc2l6ZW9mKHRtcDEpLCB1dmQtPnZpZGVvc2l6ZSk7CisJdXNidmlkZW9fVmlkZW9zaXplVG9TdHJpbmcodG1wMiwgc2l6ZW9mKHRtcDIpLCB1dmQtPmNhbnZhcyk7CisKKwlpZiAodXZkLT5kZWJ1ZyA+IDApIHsKKwkJaW5mbygiJXM6IGlmYWNlPSVkLiBlbmRwb2ludD0kJTAyeCBwYWxldHRlQml0cz0kJTA4bHgiLAorCQkgICAgIF9fRlVOQ1RJT05fXywgdXZkLT5pZmFjZSwgdXZkLT52aWRlb19lbmRwLCB1dmQtPnBhbGV0dGVCaXRzKTsKKwl9CisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmdXZkLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucikgPT0gLTEpIHsKKwkJZXJyKCIlczogdmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRVBJUEU7CisJfQorCWlmICh1dmQtPmRlYnVnID4gMSkgeworCQlpbmZvKCIlczogdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCkgc3VjY2Vzc2Z1bCIsIF9fRlVOQ1RJT05fXyk7CisJfQorCWlmICh1dmQtPmRldiA9PSBOVUxMKSB7CisJCWVycigiJXM6IHV2ZC0+ZGV2ID09IE5VTEwiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbmZvKCIlcyBvbiAvZGV2L3ZpZGVvJWQ6IGNhbnZhcz0lcyB2aWRlb3NpemU9JXMiLAorCSAgICAgKHV2ZC0+aGFuZGxlICE9IE5VTEwpID8gdXZkLT5oYW5kbGUtPmRydk5hbWUgOiAiPz8/IiwKKwkgICAgIHV2ZC0+dmRldi5taW5vciwgdG1wMiwgdG1wMSk7CisKKwl1c2JfZ2V0X2Rldih1dmQtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wodXNidmlkZW9fUmVnaXN0ZXJWaWRlb0RldmljZSk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgdXNidmlkZW9fdjRsX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB1dmQgKnV2ZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemUgID0gdm1hLT52bV9lbmQtdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvczsKKworCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHNpemUgPiAoKChVU0JWSURFT19OVU1GUkFNRVMgKiB1dmQtPm1heF9mcmFtZV9zaXplKSArIFBBR0VfU0laRSAtIDEpICYgfihQQUdFX1NJWkUgLSAxKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcG9zID0gKHVuc2lnbmVkIGxvbmcpIHV2ZC0+ZmJ1ZjsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkKKwkJCXJldHVybiAtRUFHQUlOOworCisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJZWxzZQorCQkJc2l6ZSA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1c2J2aWRlb192NGxfb3BlbigpCisgKgorICogVGhpcyBpcyBwYXJ0IG9mIFZpZGVvIDQgTGludXggQVBJLiBUaGUgZHJpdmVyIGNhbiBiZSBvcGVuZWQgYnkgb25lCisgKiBjbGllbnQgb25seSAoY2hlY2tzIGludGVybmFsIGNvdW50ZXIgJ3V2ZHNlcicpLiBUaGUgcHJvY2VkdXJlCisgKiB0aGVuIGFsbG9jYXRlcyBidWZmZXJzIG5lZWRlZCBmb3IgdmlkZW8gcHJvY2Vzc2luZy4KKyAqCisgKiBIaXN0b3J5OgorICogMjItSmFuLTIwMDAgUmV3cm90ZSwgbW92ZWQgc2NyYXRjaCBidWZmZXIgYWxsb2NhdGlvbiBoZXJlLiBOb3cgdGhlCisgKiAgICAgICAgICAgICBjYW1lcmEgaXMgYWxzbyBpbml0aWFsaXplZCBoZXJlIChvbmNlIHBlciBjb25uZWN0KSwgYXQKKyAqICAgICAgICAgICAgIGV4cGVuc2Ugb2YgVjRMIGNsaWVudCAoaXQgd2FpdHMgb24gb3BlbigpIGNhbGwpLgorICogMjctSmFuLTIwMDAgVXNlZCBVU0JWSURFT19OVU1TQlVGIGFzIG51bWJlciBvZiBVUkIgYnVmZmVycy4KKyAqIDI0LU1heS0yMDAwIENvcnJlY3RlZCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uIChNT0RfeHh4X1VTRV9DT1VOVCkuCisgKi8KK3N0YXRpYyBpbnQgdXNidmlkZW9fdjRsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdXZkICp1dmQgPSAoc3RydWN0IHV2ZCAqKSBkZXY7CisJY29uc3QgaW50IHNiX3NpemUgPSBGUkFNRVNfUEVSX0RFU0MgKiB1dmQtPmlzb19wYWNrZXRfbGVuOworCWludCBpLCBlcnJDb2RlID0gMDsKKworCWlmICh1dmQtPmRlYnVnID4gMSkKKwkJaW5mbygiJXMoJCVwKSIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKworCXVzYnZpZGVvX0NsaWVudEluY01vZENvdW50KHV2ZCk7CisJZG93bigmdXZkLT5sb2NrKTsKKworCWlmICh1dmQtPnVzZXIpIHsKKwkJZXJyKCIlczogU29tZW9uZSB0cmllZCB0byBvcGVuIGFuIGFscmVhZHkgb3BlbmVkIGRldmljZSEiLCBfX0ZVTkNUSU9OX18pOworCQllcnJDb2RlID0gLUVCVVNZOworCX0gZWxzZSB7CisJCS8qIENsZWFyIHN0YXRpc3RpY3MgKi8KKwkJbWVtc2V0KCZ1dmQtPnN0YXRzLCAwLCBzaXplb2YodXZkLT5zdGF0cykpOworCisJCS8qIENsZWFuIHBvaW50ZXJzIHNvIHdlIGtub3cgaWYgd2UgYWxsb2NhdGVkIHNvbWV0aGluZyAqLworCQlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykKKwkJCXV2ZC0+c2J1ZltpXS5kYXRhID0gTlVMTDsKKworCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBmcmFtZSBidWZmZXJzICovCisJCXV2ZC0+ZmJ1Zl9zaXplID0gVVNCVklERU9fTlVNRlJBTUVTICogdXZkLT5tYXhfZnJhbWVfc2l6ZTsKKwkJdXZkLT5mYnVmID0gdXNidmlkZW9fcnZtYWxsb2ModXZkLT5mYnVmX3NpemUpOworCQlSaW5nUXVldWVfQWxsb2NhdGUoJnV2ZC0+ZHAsIFJJTkdfUVVFVUVfU0laRSk7CisJCWlmICgodXZkLT5mYnVmID09IE5VTEwpIHx8CisJCSAgICAoIVJpbmdRdWV1ZV9Jc0FsbG9jYXRlZCgmdXZkLT5kcCkpKSB7CisJCQllcnIoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgZmJ1ZiBvciBkcCIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnJDb2RlID0gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCS8qIEFsbG9jYXRlIGFsbCBidWZmZXJzICovCisJCQlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTUZSQU1FUzsgaSsrKSB7CisJCQkJdXZkLT5mcmFtZVtpXS5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9VbnVzZWQ7CisJCQkJdXZkLT5mcmFtZVtpXS5kYXRhID0gdXZkLT5mYnVmICsgaSoodXZkLT5tYXhfZnJhbWVfc2l6ZSk7CisJCQkJLyoKKwkJCQkgKiBTZXQgZGVmYXVsdCBzaXplcyBpbiBjYXNlIElPQ1RMIChWSURJT0NNQ0FQVFVSRSkKKwkJCQkgKiBpcyBub3QgdXNlZCAodXNpbmcgcmVhZCgpIGluc3RlYWQpLgorCQkJCSAqLworCQkJCXV2ZC0+ZnJhbWVbaV0uY2FudmFzID0gdXZkLT5jYW52YXM7CisJCQkJdXZkLT5mcmFtZVtpXS5zZXFSZWFkX0luZGV4ID0gMDsKKwkJCX0KKwkJCWZvciAoaT0wOyBpIDwgVVNCVklERU9fTlVNU0JVRjsgaSsrKSB7CisJCQkJdXZkLT5zYnVmW2ldLmRhdGEgPSBrbWFsbG9jKHNiX3NpemUsIEdGUF9LRVJORUwpOworCQkJCWlmICh1dmQtPnNidWZbaV0uZGF0YSA9PSBOVUxMKSB7CisJCQkJCWVyckNvZGUgPSAtRU5PTUVNOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGVyckNvZGUgIT0gMCkgeworCQkJLyogSGF2ZSB0byBmcmVlIGFsbCB0aGF0IG1lbW9yeSAqLworCQkJaWYgKHV2ZC0+ZmJ1ZiAhPSBOVUxMKSB7CisJCQkJdXNidmlkZW9fcnZmcmVlKHV2ZC0+ZmJ1ZiwgdXZkLT5mYnVmX3NpemUpOworCQkJCXV2ZC0+ZmJ1ZiA9IE5VTEw7CisJCQl9CisJCQlSaW5nUXVldWVfRnJlZSgmdXZkLT5kcCk7CisJCQlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQkJCWlmICh1dmQtPnNidWZbaV0uZGF0YSAhPSBOVUxMKSB7CisJCQkJCWtmcmVlICh1dmQtPnNidWZbaV0uZGF0YSk7CisJCQkJCXV2ZC0+c2J1ZltpXS5kYXRhID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiBJZiBzbyBmYXIgbm8gZXJyb3JzIHRoZW4gd2Ugc2hhbGwgc3RhcnQgdGhlIGNhbWVyYSAqLworCWlmIChlcnJDb2RlID09IDApIHsKKwkJLyogU3RhcnQgZGF0YSBwdW1wIGlmIHdlIGhhdmUgdmFsaWQgZW5kcG9pbnQgKi8KKwkJaWYgKHV2ZC0+dmlkZW9fZW5kcCAhPSAwKQorCQkJZXJyQ29kZSA9IEdFVF9DQUxMQkFDSyh1dmQsIHN0YXJ0RGF0YVB1bXApKHV2ZCk7CisJCWlmIChlcnJDb2RlID09IDApIHsKKwkJCWlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIHNldHVwT25PcGVuKSkgeworCQkJCWlmICh1dmQtPmRlYnVnID4gMSkKKwkJCQkJaW5mbygiJXM6IHNldHVwT25PcGVuIGNhbGxiYWNrIiwgX19GVU5DVElPTl9fKTsKKwkJCQllcnJDb2RlID0gR0VUX0NBTExCQUNLKHV2ZCwgc2V0dXBPbk9wZW4pKHV2ZCk7CisJCQkJaWYgKGVyckNvZGUgPCAwKSB7CisJCQkJCWVycigiJXM6IHNldHVwT25PcGVuIGNhbGxiYWNrIGZhaWxlZCAoJWQuKS4iLAorCQkJCQkgICAgX19GVU5DVElPTl9fLCBlcnJDb2RlKTsKKwkJCQl9IGVsc2UgaWYgKHV2ZC0+ZGVidWcgPiAxKSB7CisJCQkJCWluZm8oIiVzOiBzZXR1cE9uT3BlbiBjYWxsYmFjayBzdWNjZXNzZnVsIiwgX19GVU5DVElPTl9fKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZXJyQ29kZSA9PSAwKSB7CisJCQkJdXZkLT5zZXR0aW5nc0FkanVzdGVkID0gMDsKKwkJCQlpZiAodXZkLT5kZWJ1ZyA+IDEpCisJCQkJCWluZm8oIiVzOiBPcGVuIHN1Y2NlZWRlZC4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXV2ZC0+dXNlcisrOworCQkJCWZpbGUtPnByaXZhdGVfZGF0YSA9IHV2ZDsKKwkJCX0KKwkJfQorCX0KKwl1cCgmdXZkLT5sb2NrKTsKKwlpZiAoZXJyQ29kZSAhPSAwKQorCQl1c2J2aWRlb19DbGllbnREZWNNb2RDb3VudCh1dmQpOworCWlmICh1dmQtPmRlYnVnID4gMCkKKwkJaW5mbygiJXM6IFJldHVybmluZyAlZC4iLCBfX0ZVTkNUSU9OX18sIGVyckNvZGUpOworCXJldHVybiBlcnJDb2RlOworfQorCisvKgorICogdXNidmlkZW9fdjRsX2Nsb3NlKCkKKyAqCisgKiBUaGlzIGlzIHBhcnQgb2YgVmlkZW8gNCBMaW51eCBBUEkuIFRoZSBwcm9jZWR1cmUKKyAqIHN0b3BzIHN0cmVhbWluZyBhbmQgZGVhbGxvY2F0ZXMgYWxsIGJ1ZmZlcnMgdGhhdCB3ZXJlIGVhcmxpZXIKKyAqIGFsbG9jYXRlZCBpbiB1c2J2aWRlb192NGxfb3BlbigpLgorICoKKyAqIEhpc3Rvcnk6CisgKiAyMi1KYW4tMjAwMCBNb3ZlZCBzY3JhdGNoIGJ1ZmZlciBkZWFsbG9jYXRpb24gaGVyZS4KKyAqIDI3LUphbi0yMDAwIFVzZWQgVVNCVklERU9fTlVNU0JVRiBhcyBudW1iZXIgb2YgVVJCIGJ1ZmZlcnMuCisgKiAyNC1NYXktMjAwMCBNb3ZlZCBNT0RfREVDX1VTRV9DT1VOVCBvdXRzaWRlIG9mIGNvZGUgdGhhdCBjYW4gc2xlZXAuCisgKi8KK3N0YXRpYyBpbnQgdXNidmlkZW9fdjRsX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXZkICp1dmQgPSAoc3RydWN0IHV2ZCAqKSBkZXY7CisJaW50IGk7CisKKwlpZiAodXZkLT5kZWJ1ZyA+IDEpCisJCWluZm8oIiVzKCQlcCkiLCBfX0ZVTkNUSU9OX18sIGRldik7CisKKwlkb3duKCZ1dmQtPmxvY2spOworCUdFVF9DQUxMQkFDSyh1dmQsIHN0b3BEYXRhUHVtcCkodXZkKTsKKwl1c2J2aWRlb19ydmZyZWUodXZkLT5mYnVmLCB1dmQtPmZidWZfc2l6ZSk7CisJdXZkLT5mYnVmID0gTlVMTDsKKwlSaW5nUXVldWVfRnJlZSgmdXZkLT5kcCk7CisKKwlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQlrZnJlZSh1dmQtPnNidWZbaV0uZGF0YSk7CisJCXV2ZC0+c2J1ZltpXS5kYXRhID0gTlVMTDsKKwl9CisKKyNpZiBVU0JWSURFT19SRVBPUlRfU1RBVFMKKwl1c2J2aWRlb19SZXBvcnRTdGF0aXN0aWNzKHV2ZCk7CisjZW5kaWYgICAgCisKKwl1dmQtPnVzZXItLTsKKwlpZiAodXZkLT5yZW1vdmVfcGVuZGluZykgeworCQlpZiAodXZkLT5kZWJ1ZyA+IDApCisJCQlpbmZvKCJ1c2J2aWRlb192NGxfY2xvc2U6IEZpbmFsIGRpc2Nvbm5lY3QuIik7CisJCXVzYnZpZGVvX0NhbWVyYVJlbGVhc2UodXZkKTsKKwl9CisJdXAoJnV2ZC0+bG9jayk7CisJdXNidmlkZW9fQ2xpZW50RGVjTW9kQ291bnQodXZkKTsKKworCWlmICh1dmQtPmRlYnVnID4gMSkKKwkJaW5mbygiJXM6IENvbXBsZXRlZC4iLCBfX0ZVTkNUSU9OX18pOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1c2J2aWRlb192NGxfaW9jdGwoKQorICoKKyAqIFRoaXMgaXMgcGFydCBvZiBWaWRlbyA0IExpbnV4IEFQSS4gVGhlIHByb2NlZHVyZSBoYW5kbGVzIGlvY3RsKCkgY2FsbHMuCisgKgorICogSGlzdG9yeToKKyAqIDIyLUphbi0yMDAwIENvcnJlY3RlZCBWSURJT0NTUElDVCB0byByZWplY3QgdW5zdXBwb3J0ZWQgc2V0dGluZ3MuCisgKi8KK3N0YXRpYyBpbnQgdXNidmlkZW9fdjRsX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHV2ZCAqdXZkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFZJRElPQ0dDQVA6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICpiID0gYXJnOworCQkJKmIgPSB1dmQtPnZjYXA7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ0dDSEFOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKwkJCSp2ID0gdXZkLT52Y2hhbjsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DU0NIQU46CisJCXsJCisJCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKwkJCWlmICh2LT5jaGFubmVsICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ0dQSUNUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcGljID0gYXJnOworCQkJKnBpYyA9IHV2ZC0+dnBpYzsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DU1BJQ1Q6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwaWMgPSBhcmc7CisJCQkvKgorCQkJICogVXNlIHRlbXBvcmFyeSAndmlkZW9fcGljdHVyZScgc3RydWN0dXJlIHRvIHByZXNlcnZlIG91cgorCQkJICogb3duIHNldHRpbmdzIChzdWNoIGFzIGNvbG9yIGRlcHRoLCBwYWxldHRlKSB0aGF0IHdlCisJCQkgKiBhcmVuJ3QgYWxsb3dpbmcgZXZlcnlvbmUgKFY0TCBjbGllbnQpIHRvIGNoYW5nZS4KKwkJCSAqLworCQkJdXZkLT52cGljLmJyaWdodG5lc3MgPSBwaWMtPmJyaWdodG5lc3M7CisJCQl1dmQtPnZwaWMuaHVlID0gcGljLT5odWU7CisJCQl1dmQtPnZwaWMuY29sb3VyID0gcGljLT5jb2xvdXI7CisJCQl1dmQtPnZwaWMuY29udHJhc3QgPSBwaWMtPmNvbnRyYXN0OworCQkJdXZkLT5zZXR0aW5nc0FkanVzdGVkID0gMDsJLyogV2lsbCBmb3JjZSBuZXcgc2V0dGluZ3MgKi8KKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DU1dJTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7CisKKwkJCWlmKFZBTElEX0NBTExCQUNLKHV2ZCwgc2V0VmlkZW9Nb2RlKSkgeworCQkJCXJldHVybiBHRVRfQ0FMTEJBQ0sodXZkLCBzZXRWaWRlb01vZGUpKHV2ZCwgdncpOworCQkJfQorCisJCQlpZiAodnctPmZsYWdzKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHZ3LT5jbGlwY291bnQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAodnctPndpZHRoICE9IFZJREVPU0laRV9YKHV2ZC0+Y2FudmFzKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICh2dy0+aGVpZ2h0ICE9IFZJREVPU0laRV9ZKHV2ZC0+Y2FudmFzKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHV0lOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKKworCQkJdnctPnggPSAwOworCQkJdnctPnkgPSAwOworCQkJdnctPndpZHRoID0gVklERU9TSVpFX1godXZkLT52aWRlb3NpemUpOworCQkJdnctPmhlaWdodCA9IFZJREVPU0laRV9ZKHV2ZC0+dmlkZW9zaXplKTsKKwkJCXZ3LT5jaHJvbWFrZXkgPSAwOworCQkJaWYgKFZBTElEX0NBTExCQUNLKHV2ZCwgZ2V0RlBTKSkKKwkJCQl2dy0+ZmxhZ3MgPSBHRVRfQ0FMTEJBQ0sodXZkLCBnZXRGUFMpKHV2ZCk7CisJCQllbHNlIAorCQkJCXZ3LT5mbGFncyA9IDEwOyAvKiBGSVhNRTogZG8gYmV0dGVyISAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHTUJVRjoKKwkJeworCQkJc3RydWN0IHZpZGVvX21idWYgKnZtID0gYXJnOworCQkJaW50IGk7CisKKwkJCW1lbXNldCh2bSwgMCwgc2l6ZW9mKCp2bSkpOworCQkJdm0tPnNpemUgPSB1dmQtPm1heF9mcmFtZV9zaXplICogVVNCVklERU9fTlVNRlJBTUVTOworCQkJdm0tPmZyYW1lcyA9IFVTQlZJREVPX05VTUZSQU1FUzsKKwkJCWZvcihpID0gMDsgaSA8IFVTQlZJREVPX05VTUZSQU1FUzsgaSsrKSAKKwkJCSAgdm0tPm9mZnNldHNbaV0gPSBpICogdXZkLT5tYXhfZnJhbWVfc2l6ZTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NNQ0FQVFVSRToKKwkJeworCQkJc3RydWN0IHZpZGVvX21tYXAgKnZtID0gYXJnOworCisJCQlpZiAodXZkLT5kZWJ1ZyA+PSAxKSB7CisJCQkJaW5mbygiVklESU9DTUNBUFRVUkU6IGZyYW1lPSVkLiBzaXplPSVkeCVkLCBmb3JtYXQ9JWQuIiwKKwkJCQkgICAgIHZtLT5mcmFtZSwgdm0tPndpZHRoLCB2bS0+aGVpZ2h0LCB2bS0+Zm9ybWF0KTsKKwkJCX0KKwkJCS8qCisJCQkgKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIHNpemUgaXMgc3VwcG9ydGVkLiBJZiB0aGUgcmVxdWVzdG9yCisJCQkgKiByZXF1ZXN0cyB0b28gYmlnIGEgZnJhbWUgdGhlbiB3ZSBtYXkgYmUgdHJpY2tlZCBpbnRvIGFjY2Vzc2luZworCQkJICogb3V0c2lkZSBvZiBvd24gcHJlYWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciAoaW4gdXZkLT5mcmFtZSkuCisJCQkgKiBUaGlzIHdpbGwgY2F1c2Ugb29wcyBvciBhIHNlY3VyaXR5IGhvbGUuIFRoZW9yZXRpY2FsbHksIHdlCisJCQkgKiBjb3VsZCBvbmx5IGNsYW1wIHRoZSBzaXplIGRvd24gdG8gYWNjZXB0YWJsZSBib3VuZHMsIGJ1dCB0aGVuCisJCQkgKiB3ZSdkIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gaW5zZXJ0IG91ciBzbWFsbGVyIGJ1ZmZlciBpbnRvCisJCQkgKiBsYXJnZXIgY2FsbGVyJ3MgYnVmZmVyLi4uIHRoaXMgaXMgbm90IGFuIGVhc3kgcXVlc3Rpb24uIFNvIHdlCisJCQkgKiBoZXJlIGp1c3QgZmxhdGx5IHJlamVjdCB0b28gbGFyZ2UgcmVxdWVzdHMsIGFzc3VtaW5nIHRoYXQgdGhlCisJCQkgKiBjYWxsZXIgd2lsbCByZXN1Ym1pdCB3aXRoIHNtYWxsZXIgc2l6ZS4gQ2FsbGVycyBzaG91bGQga25vdworCQkJICogd2hhdCBzaXplIHdlIHN1cHBvcnQgKHJldHVybmVkIGJ5IFZJRElPQ0dDQVApLiBIb3dldmVyIHZpZGNhdCwKKwkJCSAqIGZvciBvbmUsIGRvZXMgbm90IGNhcmUgYW5kIGFsbG93cyB0byBhc2sgZm9yIGFueSBzaXplLgorCQkJICovCisJCQlpZiAoKHZtLT53aWR0aCA+IFZJREVPU0laRV9YKHV2ZC0+Y2FudmFzKSkgfHwKKwkJCSAgICAodm0tPmhlaWdodCA+IFZJREVPU0laRV9ZKHV2ZC0+Y2FudmFzKSkpIHsKKwkJCQlpZiAodXZkLT5kZWJ1ZyA+IDApIHsKKwkJCQkJaW5mbygiVklESU9DTUNBUFRVUkU6IFNpemU9JWR4JWQgdG9vIGxhcmdlOyAiCisJCQkJCSAgICAgImFsbG93ZWQgb25seSB1cCB0byAlbGR4JWxkIiwgdm0tPndpZHRoLCB2bS0+aGVpZ2h0LAorCQkJCQkgICAgIFZJREVPU0laRV9YKHV2ZC0+Y2FudmFzKSwgVklERU9TSVpFX1kodXZkLT5jYW52YXMpKTsKKwkJCQl9CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQkvKiBDaGVjayBpZiB0aGUgcGFsZXR0ZSBpcyBzdXBwb3J0ZWQgKi8KKwkJCWlmICgoKDFMIDw8IHZtLT5mb3JtYXQpICYgdXZkLT5wYWxldHRlQml0cykgPT0gMCkgeworCQkJCWlmICh1dmQtPmRlYnVnID4gMCkgeworCQkJCQlpbmZvKCJWSURJT0NNQ0FQVFVSRTogZm9ybWF0PSVkLiBub3Qgc3VwcG9ydGVkIgorCQkJCQkgICAgICIgKHBhbGV0dGVCaXRzPSQlMDhseCkiLAorCQkJCQkgICAgIHZtLT5mb3JtYXQsIHV2ZC0+cGFsZXR0ZUJpdHMpOworCQkJCX0KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmICgodm0tPmZyYW1lIDwgMCkgfHwgKHZtLT5mcmFtZSA+PSBVU0JWSURFT19OVU1GUkFNRVMpKSB7CisJCQkJZXJyKCJWSURJT0NNQ0FQVFVSRTogdm0uZnJhbWU9JWQuICFFIFswLSVkXSIsIHZtLT5mcmFtZSwgVVNCVklERU9fTlVNRlJBTUVTLTEpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKHV2ZC0+ZnJhbWVbdm0tPmZyYW1lXS5mcmFtZVN0YXRlID09IEZyYW1lU3RhdGVfR3JhYmJpbmcpIHsKKwkJCQkvKiBOb3QgYW4gZXJyb3IgLSBjYW4gaGFwcGVuICovCisJCQl9CisJCQl1dmQtPmZyYW1lW3ZtLT5mcmFtZV0ucmVxdWVzdCA9IFZJREVPU0laRSh2bS0+d2lkdGgsIHZtLT5oZWlnaHQpOworCQkJdXZkLT5mcmFtZVt2bS0+ZnJhbWVdLnBhbGV0dGUgPSB2bS0+Zm9ybWF0OworCisJCQkvKiBNYXJrIGl0IGFzIHJlYWR5ICovCisJCQl1dmQtPmZyYW1lW3ZtLT5mcmFtZV0uZnJhbWVTdGF0ZSA9IEZyYW1lU3RhdGVfUmVhZHk7CisKKwkJCXJldHVybiB1c2J2aWRlb19OZXdGcmFtZSh1dmQsIHZtLT5mcmFtZSk7CisJCX0KKwkJY2FzZSBWSURJT0NTWU5DOgorCQl7CisJCQlpbnQgKmZyYW1lTnVtID0gYXJnOworCQkJaW50IHJldDsKKworCQkJaWYgKCpmcmFtZU51bSA8IDAgfHwgKmZyYW1lTnVtID49IFVTQlZJREVPX05VTUZSQU1FUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkKKwkJCWlmICh1dmQtPmRlYnVnID49IDEpCisJCQkJaW5mbygiVklESU9DU1lOQzogc3luY2luZyB0byBmcmFtZSAlZC4iLCAqZnJhbWVOdW0pOworCQkJaWYgKHV2ZC0+ZmxhZ3MgJiBGTEFHU19OT19ERUNPRElORykKKwkJCQlyZXQgPSB1c2J2aWRlb19HZXRGcmFtZSh1dmQsICpmcmFtZU51bSk7CisJCQllbHNlIGlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIGdldEZyYW1lKSkgeworCQkJCXJldCA9IEdFVF9DQUxMQkFDSyh1dmQsIGdldEZyYW1lKSh1dmQsICpmcmFtZU51bSk7CisJCQkJaWYgKChyZXQgPCAwKSAmJiAodXZkLT5kZWJ1ZyA+PSAxKSkgeworCQkJCQllcnIoIlZJRElPQ1NZTkM6IGdldEZyYW1lKCkgcmV0dXJuZWQgJWQuIiwgcmV0KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWVycigiVklESU9DU1lOQzogZ2V0RnJhbWUgaXMgbm90IHNldCIpOworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGUgZnJhbWUgaXMgaW4gRnJhbWVTdGF0ZV9Eb25lX0hvbGQgc3RhdGUuIFJlbGVhc2UgaXQKKwkJCSAqIHJpZ2h0IG5vdyBiZWNhdXNlIGl0cyBkYXRhIGlzIGFscmVhZHkgbWFwcGVkIGludG8KKwkJCSAqIHRoZSB1c2VyIHNwYWNlIGFuZCBpdCdzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiB0bworCQkJICogbWFrZSB1c2Ugb2YgaXQgdW50aWwgaXQgYXNrcyBmb3IgYW5vdGhlciBmcmFtZS4KKwkJCSAqLworCQkJdXZkLT5mcmFtZVsqZnJhbWVOdW1dLmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX1VudXNlZDsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJY2FzZSBWSURJT0NHRkJVRjoKKwkJeworCQkJc3RydWN0IHZpZGVvX2J1ZmZlciAqdmIgPSBhcmc7CisKKwkJCW1lbXNldCh2YiwgMCwgc2l6ZW9mKCp2YikpOworIAkJCXJldHVybiAwOworIAkJfQorCQljYXNlIFZJRElPQ0tFWToKKwkJCXJldHVybiAwOworCisJCWNhc2UgVklESU9DQ0FQVFVSRToKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNhc2UgVklESU9DU0ZCVUY6CisKKwkJY2FzZSBWSURJT0NHVFVORVI6CisJCWNhc2UgVklESU9DU1RVTkVSOgorCisJCWNhc2UgVklESU9DR0ZSRVE6CisJCWNhc2UgVklESU9DU0ZSRVE6CisKKwkJY2FzZSBWSURJT0NHQVVESU86CisJCWNhc2UgVklESU9DU0FVRElPOgorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYnZpZGVvX3Y0bF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHVzYnZpZGVvX3Y0bF9kb19pb2N0bCk7Cit9CisKKy8qCisgKiB1c2J2aWRlb192NGxfcmVhZCgpCisgKgorICogVGhpcyBpcyBtb3N0bHkgYm9yaW5nIHN0dWZmLiBXZSBzaW1wbHkgYXNrIGZvciBhIGZyYW1lIGFuZCB3aGVuIGl0CisgKiBhcnJpdmVzIGNvcHkgYWxsIHRoZSB2aWRlbyBkYXRhIGZyb20gaXQgaW50byB1c2VyIHNwYWNlLiBUaGVyZSBpcworICogbm8gb2J2aW91cyBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICoKKyAqIEhpc3Rvcnk6CisgKiAyMC1PY3QtMjAwMCBDcmVhdGVkLgorICogMDEtTm92LTIwMDAgQWRkZWQgbXV0ZXggKHV2ZC0+bG9jaykuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHVzYnZpZGVvX3Y0bF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdXZkICp1dmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IG5vYmxvY2sgPSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSzsKKwlpbnQgZnJteCA9IC0xLCBpOworCXN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWU7CisKKwlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpIHx8IChidWYgPT0gTlVMTCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHV2ZC0+ZGVidWcgPj0gMSkKKwkJaW5mbygiJXM6ICVaZC4gYnl0ZXMsIG5vYmxvY2s9JWQuIiwgX19GVU5DVElPTl9fLCBjb3VudCwgbm9ibG9jayk7CisKKwlkb3duKCZ1dmQtPmxvY2spOwkKKworCS8qIFNlZSBpZiBhIGZyYW1lIGlzIGNvbXBsZXRlZCwgdGhlbiB1c2UgaXQuICovCisJZm9yKGkgPSAwOyBpIDwgVVNCVklERU9fTlVNRlJBTUVTOyBpKyspIHsKKwkJaWYgKCh1dmQtPmZyYW1lW2ldLmZyYW1lU3RhdGUgPT0gRnJhbWVTdGF0ZV9Eb25lKSB8fAorCQkgICAgKHV2ZC0+ZnJhbWVbaV0uZnJhbWVTdGF0ZSA9PSBGcmFtZVN0YXRlX0RvbmVfSG9sZCkgfHwKKwkJICAgICh1dmQtPmZyYW1lW2ldLmZyYW1lU3RhdGUgPT0gRnJhbWVTdGF0ZV9FcnJvcikpIHsKKwkJCWZybXggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBGSVhNRTogSWYgd2UgZG9uJ3Qgc3RhcnQgYSBmcmFtZSBoZXJlIHRoZW4gd2hvIGV2ZXIgZG9lcz8gKi8KKwlpZiAobm9ibG9jayAmJiAoZnJteCA9PSAtMSkpIHsKKwkJY291bnQgPSAtRUFHQUlOOworCQlnb3RvIHJlYWRfZG9uZTsKKwl9CisKKwkvKgorCSAqIElmIG5vIEZyYW1lU3RhdGVfRG9uZSwgbG9vayBmb3IgYSBGcmFtZVN0YXRlX0dyYWJiaW5nIHN0YXRlLgorCSAqIFNlZSBpZiBhIGZyYW1lIGlzIGluIHByb2Nlc3MgKGdyYWJiaW5nKSwgdGhlbiB1c2UgaXQuCisJICogV2Ugd2lsbCBuZWVkIHRvIHdhaXQgdW50aWwgaXQgYmVjb21lcyBjb29rZWQsIG9mIGNvdXJzZS4KKwkgKi8KKwlpZiAoZnJteCA9PSAtMSkgeworCQlmb3IoaSA9IDA7IGkgPCBVU0JWSURFT19OVU1GUkFNRVM7IGkrKykgeworCQkJaWYgKHV2ZC0+ZnJhbWVbaV0uZnJhbWVTdGF0ZSA9PSBGcmFtZVN0YXRlX0dyYWJiaW5nKSB7CisJCQkJZnJteCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIElmIG5vIGZyYW1lIGlzIGFjdGl2ZSwgc3RhcnQgb25lLiBXZSBkb24ndCBjYXJlIHdoaWNoIG9uZQorCSAqIGl0IHdpbGwgYmUsIHNvICMwIGlzIGFzIGdvb2QgYXMgYW55LgorCSAqIEluIHJlYWQgYWNjZXNzIG1vZGUgd2UgZG9uJ3QgaGF2ZSBjb252ZW5pZW5jZSBvZiBWSURJT0NNQ0FQVFVSRQorCSAqIHRvIHNwZWNpZnkgdGhlIHJlcXVlc3RlZCBwYWxldHRlICh2aWRlbyBmb3JtYXQpIG9uIHBlci1mcmFtZQorCSAqIGJhc2lzLiBUaGlzIG1lYW5zIHRoYXQgd2UgaGF2ZSB0byByZXR1cm4gZGF0YSBpbiAtc29tZS0gZm9ybWF0CisJICogYW5kIGp1c3QgaG9wZSB0aGF0IHRoZSBjbGllbnQga25vd3Mgd2hhdCB0byBkbyB3aXRoIGl0LgorCSAqIFRoZSBkZWZhdWx0IGZvcm1hdCBpcyBjb25maWd1cmVkIGluIHV2ZC0+ZGVmYXVsdFBhbGV0dGUgZmllbGQKKwkgKiBhcyBvbmUgb2YgVklERU9fUEFMRVRURV94eHggdmFsdWVzLiBXZSBzdHVmZiBpdCBpbnRvIHRoZSBuZXcKKwkgKiBmcmFtZSBhbmQgaW5pdGlhdGUgdGhlIGZyYW1lIGZpbGxpbmcgcHJvY2Vzcy4KKwkgKi8KKwlpZiAoZnJteCA9PSAtMSkgeworCQlpZiAodXZkLT5kZWZhdWx0UGFsZXR0ZSA9PSAwKSB7CisJCQllcnIoIiVzOiBObyBkZWZhdWx0IHBhbGV0dGU7IGRvbid0IGtub3cgd2hhdCB0byBkbyEiLCBfX0ZVTkNUSU9OX18pOworCQkJY291bnQgPSAtRUZBVUxUOworCQkJZ290byByZWFkX2RvbmU7CisJCX0KKwkJZnJteCA9IDA7CisJCS8qCisJCSAqIFdlIGhhdmUgbm8gcGVyLWZyYW1lIGNvbnRyb2wgb3ZlciB2aWRlbyBzaXplLgorCQkgKiBUaGVyZWZvcmUgd2Ugb25seSBjYW4gdXNlIHdoYXRldmVyIHNpemUgd2FzCisJCSAqIHNwZWNpZmllZCBhcyBkZWZhdWx0LgorCQkgKi8KKwkJdXZkLT5mcmFtZVtmcm14XS5yZXF1ZXN0ID0gdXZkLT52aWRlb3NpemU7CisJCXV2ZC0+ZnJhbWVbZnJteF0ucGFsZXR0ZSA9IHV2ZC0+ZGVmYXVsdFBhbGV0dGU7CisJCXV2ZC0+ZnJhbWVbZnJteF0uZnJhbWVTdGF0ZSA9IEZyYW1lU3RhdGVfUmVhZHk7CisJCXVzYnZpZGVvX05ld0ZyYW1lKHV2ZCwgZnJteCk7CisJCS8qIE5vdyBmcmFtZSAwIGlzIHN1cHBvc2VkIHRvIHN0YXJ0IGZpbGxpbmcuLi4gKi8KKwl9CisKKwkvKgorCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIGFjdGl2ZSBmcmFtZS4gSXQgaXMgZWl0aGVyIHByZXZpb3VzbHkKKwkgKiBjb21wbGV0ZWQgZnJhbWUgb3IgZnJhbWUgaW4gcHJvZ3Jlc3MgYnV0IG5vdCBjb21wbGV0ZWQgeWV0LgorCSAqLworCWZyYW1lID0gJnV2ZC0+ZnJhbWVbZnJteF07CisKKwkvKgorCSAqIFNpdCBiYWNrICYgd2FpdCB1bnRpbCB0aGUgZnJhbWUgZ2V0cyBmaWxsZWQgYW5kIHBvc3Rwcm9jZXNzZWQuCisJICogSWYgd2UgZmFpbCB0byBnZXQgdGhlIHBpY3R1cmUgW2luIHRpbWVdIHRoZW4gcmV0dXJuIHRoZSBlcnJvci4KKwkgKiBJbiB0aGlzIGNhbGwgd2Ugc3BlY2lmeSB0aGF0IHdlIHdhbnQgdGhlIGZyYW1lIHRvIGJlIHdhaXRlZCBmb3IsCisJICogcG9zdHByb2Nlc3NlZCBhbmQgc3dpdGNoZWQgaW50byBGcmFtZVN0YXRlX0RvbmVfSG9sZCBzdGF0ZS4gVGhpcworCSAqIHN0YXRlIGlzIHVzZWQgdG8gaG9sZCB0aGUgZnJhbWUgYXMgImZ1bGx5IGNvbXBsZXRlZCIgYmV0d2VlbgorCSAqIHN1YnNlcXVlbnQgcGFydGlhbCByZWFkcyBvZiB0aGUgc2FtZSBmcmFtZS4KKwkgKi8KKwlpZiAoZnJhbWUtPmZyYW1lU3RhdGUgIT0gRnJhbWVTdGF0ZV9Eb25lX0hvbGQpIHsKKwkJbG9uZyBydiA9IC1FRkFVTFQ7CisJCWlmICh1dmQtPmZsYWdzICYgRkxBR1NfTk9fREVDT0RJTkcpCisJCQlydiA9IHVzYnZpZGVvX0dldEZyYW1lKHV2ZCwgZnJteCk7CisJCWVsc2UgaWYgKFZBTElEX0NBTExCQUNLKHV2ZCwgZ2V0RnJhbWUpKQorCQkJcnYgPSBHRVRfQ0FMTEJBQ0sodXZkLCBnZXRGcmFtZSkodXZkLCBmcm14KTsKKwkJZWxzZQorCQkJZXJyKCJnZXRGcmFtZSBpcyBub3Qgc2V0Iik7CisJCWlmICgocnYgIT0gMCkgfHwgKGZyYW1lLT5mcmFtZVN0YXRlICE9IEZyYW1lU3RhdGVfRG9uZV9Ib2xkKSkgeworCQkJY291bnQgPSBydjsKKwkJCWdvdG8gcmVhZF9kb25lOworCQl9CisJfQorCisJLyoKKwkgKiBDb3B5IGJ5dGVzIHRvIHVzZXIgc3BhY2UuIFdlIGFsbG93IGZvciBwYXJ0aWFsIHJlYWRzLCB3aGljaAorCSAqIG1lYW5zIHRoYXQgdGhlIHVzZXIgYXBwbGljYXRpb24gY2FuIHJlcXVlc3QgcmVhZCBsZXNzIHRoYW4KKwkgKiB0aGUgZnVsbCBmcmFtZSBzaXplLiBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gdG8gaXNzdWUKKwkgKiBzdWJzZXF1ZW50IGNhbGxzIHVudGlsIGVudGlyZSBmcmFtZSBpcyByZWFkLgorCSAqCisJICogRmlyc3QgdGhpbmdzIGZpcnN0LCBtYWtlIHN1cmUgd2UgZG9uJ3QgY29weSBtb3JlIHRoYW4gd2UKKwkgKiBoYXZlIC0gZXZlbiBpZiB0aGUgYXBwbGljYXRpb24gd2FudHMgbW9yZS4gVGhhdCB3b3VsZCBiZQorCSAqIGEgYmlnIHNlY3VyaXR5IGVtYmFyYXNzbWVudCEKKwkgKi8KKwlpZiAoKGNvdW50ICsgZnJhbWUtPnNlcVJlYWRfSW5kZXgpID4gZnJhbWUtPnNlcVJlYWRfTGVuZ3RoKQorCQljb3VudCA9IGZyYW1lLT5zZXFSZWFkX0xlbmd0aCAtIGZyYW1lLT5zZXFSZWFkX0luZGV4OworCisJLyoKKwkgKiBDb3B5IHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSB0byB1c2VyIHNwYWNlLiBXZSBzdGFydAorCSAqIGNvcHlpbmcgZnJvbSB0aGUgcG9zaXRpb24gd2hlcmUgd2UgbGFzdCBsZWZ0IGl0LCB3aGljaAorCSAqIHdpbGwgYmUgemVybyBmb3IgYSBuZXcgZnJhbWUgKG5vdCByZWFkIGJlZm9yZSkuCisJICovCisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGZyYW1lLT5kYXRhICsgZnJhbWUtPnNlcVJlYWRfSW5kZXgsIGNvdW50KSkgeworCQljb3VudCA9IC1FRkFVTFQ7CisJCWdvdG8gcmVhZF9kb25lOworCX0KKworCS8qIFVwZGF0ZSBsYXN0IHJlYWQgcG9zaXRpb24gKi8KKwlmcmFtZS0+c2VxUmVhZF9JbmRleCArPSBjb3VudDsKKwlpZiAodXZkLT5kZWJ1ZyA+PSAxKSB7CisJCWVycigiJXM6IHtjb3B5fSBjb3VudCB1c2VkPSVaZCwgbmV3IHNlcVJlYWRfSW5kZXg9JWxkIiwKKwkJCV9fRlVOQ1RJT05fXywgY291bnQsIGZyYW1lLT5zZXFSZWFkX0luZGV4KTsKKwl9CisKKwkvKiBGaW5hbGx5IGNoZWNrIGlmIHRoZSBmcmFtZSBpcyBkb25lIHdpdGggYW5kICJyZWxlYXNlIiBpdCAqLworCWlmIChmcmFtZS0+c2VxUmVhZF9JbmRleCA+PSBmcmFtZS0+c2VxUmVhZF9MZW5ndGgpIHsKKwkJLyogQWxsIGRhdGEgaGFzIGJlZW4gcmVhZCAqLworCQlmcmFtZS0+c2VxUmVhZF9JbmRleCA9IDA7CisKKwkJLyogTWFyayBpdCBhcyBhdmFpbGFibGUgdG8gYmUgdXNlZCBhZ2Fpbi4gKi8KKwkJdXZkLT5mcmFtZVtmcm14XS5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9VbnVzZWQ7CisJCWlmICh1c2J2aWRlb19OZXdGcmFtZSh1dmQsIChmcm14ICsgMSkgJSBVU0JWSURFT19OVU1GUkFNRVMpKSB7CisJCQllcnIoIiVzOiB1c2J2aWRlb19OZXdGcmFtZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCX0KK3JlYWRfZG9uZToKKwl1cCgmdXZkLT5sb2NrKTsJCisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogTWFrZSBhbGwgb2YgdGhlIGJsb2NrcyBvZiBkYXRhIGNvbnRpZ3VvdXMKKyAqLworc3RhdGljIGludCB1c2J2aWRlb19Db21wcmVzc0lzb2Nocm9ub3VzKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHVyYiAqdXJiKQoreworCWNoYXIgKmNkYXRhOworCWludCBpLCB0b3RsZW4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQlpbnQgbiA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwkJaW50IHN0ID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CisKKwkJY2RhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OworCisJCS8qIERldGVjdCBhbmQgaWdub3JlIGVycm9yZWQgcGFja2V0cyAqLworCQlpZiAoc3QgPCAwKSB7CisJCQlpZiAodXZkLT5kZWJ1ZyA+PSAxKQorCQkJCWVycigiRGF0YSBlcnJvcjogcGFja2V0PSVkLiBsZW49JWQuIHN0YXR1cz0lZC4iLCBpLCBuLCBzdCk7CisJCQl1dmQtPnN0YXRzLmlzb19lcnJfY291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRGV0ZWN0IGFuZCBpZ25vcmUgZW1wdHkgcGFja2V0cyAqLworCQlpZiAobiA8PSAwKSB7CisJCQl1dmQtPnN0YXRzLmlzb19za2lwX2NvdW50Kys7CisJCQljb250aW51ZTsKKwkJfQorCQl0b3RsZW4gKz0gbjsJLyogTGl0dGxlIGxvY2FsIGFjY291bnRpbmcgKi8KKwkJUmluZ1F1ZXVlX0VucXVldWUoJnV2ZC0+ZHAsIGNkYXRhLCBuKTsKKwl9CisJcmV0dXJuIHRvdGxlbjsKK30KKworc3RhdGljIHZvaWQgdXNidmlkZW9fSXNvY0lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpLCByZXQsIGxlbjsKKwlzdHJ1Y3QgdXZkICp1dmQgPSB1cmItPmNvbnRleHQ7CisKKwkvKiBXZSBkb24ndCB3YW50IHRvIGRvIGFueXRoaW5nIGlmIHdlIGFyZSBhYm91dCB0byBiZSByZW1vdmVkISAqLworCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpCisJCXJldHVybjsKKyNpZiAwCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJaW5mbygidXJiPSQlcCBzdGF0dXM9JWQuIGVycmNvdW50PSVkLiBsZW5ndGg9JWQuIiwKKwkJICAgICB1cmIsIHVyYi0+c3RhdHVzLCB1cmItPmVycm9yX2NvdW50LCB1cmItPmFjdHVhbF9sZW5ndGgpOworCX0gZWxzZSB7CisJCXN0YXRpYyBpbnQgYyA9IDA7CisJCWlmIChjKysgJSAxMDAgPT0gMCkKKwkJCWluZm8oIk5vIElzb2MgZGF0YSIpOworCX0KKyNlbmRpZgorCisJaWYgKCF1dmQtPnN0cmVhbWluZykgeworCQlpZiAodXZkLT5kZWJ1ZyA+PSAxKQorCQkJaW5mbygiTm90IHN0cmVhbWluZywgYnV0IGludGVycnVwdCEiKTsKKwkJcmV0dXJuOworCX0KKwkKKwl1dmQtPnN0YXRzLnVyYl9jb3VudCsrOworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPD0gMCkKKwkJZ290byB1cmJfZG9uZV93aXRoOworCisJLyogQ29weSB0aGUgZGF0YSByZWNlaXZlZCBpbnRvIHJpbmcgcXVldWUgKi8KKwlsZW4gPSB1c2J2aWRlb19Db21wcmVzc0lzb2Nocm9ub3VzKHV2ZCwgdXJiKTsKKwl1dmQtPnN0YXRzLnVyYl9sZW5ndGggPSBsZW47CisJaWYgKGxlbiA8PSAwKQorCQlnb3RvIHVyYl9kb25lX3dpdGg7CisKKwkvKiBIZXJlIHdlIGdvdCBzb21lIGRhdGEgKi8KKwl1dmQtPnN0YXRzLmRhdGFfY291bnQgKz0gbGVuOworCVJpbmdRdWV1ZV9XYWtlVXBJbnRlcnJ1cHRpYmxlKCZ1dmQtPmRwKTsKKwordXJiX2RvbmVfd2l0aDoKKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVTX1BFUl9ERVNDOyBpKyspIHsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMgPSAwOworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggPSAwOworCX0KKwl1cmItPnN0YXR1cyA9IDA7CisJdXJiLT5kZXYgPSB1dmQtPmRldjsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfS0VSTkVMKTsKKwlpZihyZXQpCisJCWVycigidXNiX3N1Ym1pdF91cmIgZXJyb3IgKCVkKSIsIHJldCk7CisJcmV0dXJuOworfQorCisvKgorICogdXNidmlkZW9fU3RhcnREYXRhUHVtcCgpCisgKgorICogSGlzdG9yeToKKyAqIDI3LUphbi0yMDAwIFVzZWQgaWJtY2FtLT5pZmFjZSwgaWJtY2FtLT5pZmFjZUFsdEFjdGl2ZSBpbnN0ZWFkCisgKiAgICAgICAgICAgICBvZiBoYXJkY29kZWQgdmFsdWVzLiBTaW1wbGlmaWVkIGJ5IHVzaW5nIGZvciBsb29wLAorICogICAgICAgICAgICAgYWxsb3dlZCBhbnkgbnVtYmVyIG9mIFVSQnMuCisgKi8KK3N0YXRpYyBpbnQgdXNidmlkZW9fU3RhcnREYXRhUHVtcChzdHJ1Y3QgdXZkICp1dmQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHV2ZC0+ZGV2OworCWludCBpLCBlcnJGbGFnOworCisJaWYgKHV2ZC0+ZGVidWcgPiAxKQorCQlpbmZvKCIlcygkJXApIiwgX19GVU5DVElPTl9fLCB1dmQpOworCisJaWYgKCFDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSkgeworCQllcnIoIiVzOiBDYW1lcmEgaXMgbm90IG9wZXJhdGlvbmFsIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXV2ZC0+Y3VyZnJhbWUgPSAtMTsKKworCS8qIEFsdGVybmF0ZSBpbnRlcmZhY2UgMSBpcyBpcyB0aGUgYmlnZ2VzdCBmcmFtZSBzaXplICovCisJaSA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldiwgdXZkLT5pZmFjZSwgdXZkLT5pZmFjZUFsdEFjdGl2ZSk7CisJaWYgKGkgPCAwKSB7CisJCWVycigiJXM6IHVzYl9zZXRfaW50ZXJmYWNlIGVycm9yIiwgX19GVU5DVElPTl9fKTsKKwkJdXZkLT5sYXN0X2Vycm9yID0gaTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKFZBTElEX0NBTExCQUNLKHV2ZCwgdmlkZW9TdGFydCkpCisJCUdFVF9DQUxMQkFDSyh1dmQsIHZpZGVvU3RhcnQpKHV2ZCk7CisJZWxzZSAKKwkJZXJyKCIlczogdmlkZW9TdGFydCBub3Qgc2V0IiwgX19GVU5DVElPTl9fKTsKKworCS8qIFdlIGRvdWJsZSBidWZmZXIgdGhlIElzbyBsaXN0cyAqLworCWZvciAoaT0wOyBpIDwgVVNCVklERU9fTlVNU0JVRjsgaSsrKSB7CisJCWludCBqLCBrOworCQlzdHJ1Y3QgdXJiICp1cmIgPSB1dmQtPnNidWZbaV0udXJiOworCQl1cmItPmRldiA9IGRldjsKKwkJdXJiLT5jb250ZXh0ID0gdXZkOworCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUoZGV2LCB1dmQtPnZpZGVvX2VuZHApOworCQl1cmItPmludGVydmFsID0gMTsKKwkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1dmQtPnNidWZbaV0uZGF0YTsKKwkJdXJiLT5jb21wbGV0ZSA9IHVzYnZpZGVvX0lzb2NJcnE7CisJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBGUkFNRVNfUEVSX0RFU0M7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHV2ZC0+aXNvX3BhY2tldF9sZW4gKiBGUkFNRVNfUEVSX0RFU0M7CisJCWZvciAoaj1rPTA7IGogPCBGUkFNRVNfUEVSX0RFU0M7IGorKywgayArPSB1dmQtPmlzb19wYWNrZXRfbGVuKSB7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGs7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IHV2ZC0+aXNvX3BhY2tldF9sZW47CisJCX0KKwl9CisKKwkvKiBTdWJtaXQgYWxsIFVSQnMgKi8KKwlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQllcnJGbGFnID0gdXNiX3N1Ym1pdF91cmIodXZkLT5zYnVmW2ldLnVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnJGbGFnKQorCQkJZXJyKCIlczogdXNiX3N1Ym1pdF9pc29jKCVkKSByZXQgJWQiLCBfX0ZVTkNUSU9OX18sIGksIGVyckZsYWcpOworCX0KKworCXV2ZC0+c3RyZWFtaW5nID0gMTsKKwlpZiAodXZkLT5kZWJ1ZyA+IDEpCisJCWluZm8oIiVzOiBzdHJlYW1pbmc9MSB2aWRlb19lbmRwPSQlMDJ4IiwgX19GVU5DVElPTl9fLCB1dmQtPnZpZGVvX2VuZHApOworCXJldHVybiAwOworfQorCisvKgorICogdXNidmlkZW9fU3RvcERhdGFQdW1wKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBzdG9wcyBzdHJlYW1pbmcgYW5kIGRlYWxsb2NhdGVzIFVSQnMuIFRoZW4gaXQKKyAqIGFjdGl2YXRlcyB6ZXJvLWJhbmR3aWR0aCBhbHQuIHNldHRpbmcgb2YgdGhlIHZpZGVvIGludGVyZmFjZS4KKyAqCisgKiBIaXN0b3J5OgorICogMjItSmFuLTIwMDAgQ29ycmVjdGVkIG9yZGVyIG9mIGFjdGlvbnMgdG8gd29yayBhZnRlciBzdXJwcmlzZSByZW1vdmFsLgorICogMjctSmFuLTIwMDAgVXNlZCB1dmQtPmlmYWNlLCB1dmQtPmlmYWNlQWx0SW5hY3RpdmUgaW5zdGVhZCBvZiBoYXJkY29kZWQgdmFsdWVzLgorICovCitzdGF0aWMgdm9pZCB1c2J2aWRlb19TdG9wRGF0YVB1bXAoc3RydWN0IHV2ZCAqdXZkKQoreworCWludCBpLCBqOworCisJaWYgKCh1dmQgPT0gTlVMTCkgfHwgKCF1dmQtPnN0cmVhbWluZykgfHwgKHV2ZC0+ZGV2ID09IE5VTEwpKQorCQlyZXR1cm47CisKKwlpZiAodXZkLT5kZWJ1ZyA+IDEpCisJCWluZm8oIiVzKCQlcCkiLCBfX0ZVTkNUSU9OX18sIHV2ZCk7CisKKwkvKiBVbnNjaGVkdWxlIGFsbCBvZiB0aGUgaXNvIHRkJ3MgKi8KKwlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQl1c2Jfa2lsbF91cmIodXZkLT5zYnVmW2ldLnVyYik7CisJfQorCWlmICh1dmQtPmRlYnVnID4gMSkKKwkJaW5mbygiJXM6IHN0cmVhbWluZz0wIiwgX19GVU5DVElPTl9fKTsKKwl1dmQtPnN0cmVhbWluZyA9IDA7CisKKwlpZiAoIXV2ZC0+cmVtb3ZlX3BlbmRpbmcpIHsKKwkJLyogSW52b2tlIG1pbmlkcml2ZXIncyBtYWdpYyB0byBzdG9wIHRoZSBjYW1lcmEgKi8KKwkJaWYgKFZBTElEX0NBTExCQUNLKHV2ZCwgdmlkZW9TdG9wKSkKKwkJCUdFVF9DQUxMQkFDSyh1dmQsIHZpZGVvU3RvcCkodXZkKTsKKwkJZWxzZSAKKwkJCWVycigiJXM6IHZpZGVvU3RvcCBub3Qgc2V0IiwgX19GVU5DVElPTl9fKTsKKworCQkvKiBTZXQgcGFja2V0IHNpemUgdG8gMCAqLworCQlqID0gdXNiX3NldF9pbnRlcmZhY2UodXZkLT5kZXYsIHV2ZC0+aWZhY2UsIHV2ZC0+aWZhY2VBbHRJbmFjdGl2ZSk7CisJCWlmIChqIDwgMCkgeworCQkJZXJyKCIlczogdXNiX3NldF9pbnRlcmZhY2UoKSBlcnJvciAlZC4iLCBfX0ZVTkNUSU9OX18sIGopOworCQkJdXZkLT5sYXN0X2Vycm9yID0gajsKKwkJfQorCX0KK30KKworLyoKKyAqIHVzYnZpZGVvX05ld0ZyYW1lKCkKKyAqCisgKiBIaXN0b3J5OgorICogMjktTWFyLTAwIEFkZGVkIGNvcHlpbmcgb2YgcHJldmlvdXMgZnJhbWUgaW50byB0aGUgY3VycmVudCBvbmUuCisgKiA2LUF1Zy0wMCAgQWRkZWQgbW9kZWwgMyB2aWRlbyBzaXplcywgcmVtb3ZlZCByZWR1bmRhbnQgd2lkdGgsIGhlaWdodC4KKyAqLworc3RhdGljIGludCB1c2J2aWRlb19OZXdGcmFtZShzdHJ1Y3QgdXZkICp1dmQsIGludCBmcmFtZW51bSkKK3sKKwlzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lOworCWludCBuOworCisJaWYgKHV2ZC0+ZGVidWcgPiAxKQorCQlpbmZvKCJ1c2J2aWRlb19OZXdGcmFtZSgkJXAsJWQuKSIsIHV2ZCwgZnJhbWVudW0pOworCisJLyogSWYgd2UncmUgbm90IGdyYWJiaW5nIGEgZnJhbWUgcmlnaHQgbm93IGFuZCB0aGUgb3RoZXIgZnJhbWUgaXMgKi8KKwkvKiAgcmVhZHkgdG8gYmUgZ3JhYmJlZCBpbnRvLCB0aGVuIHVzZSBpdCBpbnN0ZWFkICovCisJaWYgKHV2ZC0+Y3VyZnJhbWUgIT0gLTEpCisJCXJldHVybiAwOworCisJLyogSWYgbmVjZXNzYXJ5IHdlIGFkanVzdCBwaWN0dXJlIHNldHRpbmdzIGJldHdlZW4gZnJhbWVzICovCisJaWYgKCF1dmQtPnNldHRpbmdzQWRqdXN0ZWQpIHsKKwkJaWYgKFZBTElEX0NBTExCQUNLKHV2ZCwgYWRqdXN0UGljdHVyZSkpCisJCQlHRVRfQ0FMTEJBQ0sodXZkLCBhZGp1c3RQaWN0dXJlKSh1dmQpOworCQl1dmQtPnNldHRpbmdzQWRqdXN0ZWQgPSAxOworCX0KKworCW4gPSAoZnJhbWVudW0gKyAxKSAlIFVTQlZJREVPX05VTUZSQU1FUzsKKwlpZiAodXZkLT5mcmFtZVtuXS5mcmFtZVN0YXRlID09IEZyYW1lU3RhdGVfUmVhZHkpCisJCWZyYW1lbnVtID0gbjsKKworCWZyYW1lID0gJnV2ZC0+ZnJhbWVbZnJhbWVudW1dOworCisJZnJhbWUtPmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX0dyYWJiaW5nOworCWZyYW1lLT5zY2Fuc3RhdGUgPSBTY2FuU3RhdGVfU2Nhbm5pbmc7CisJZnJhbWUtPnNlcVJlYWRfTGVuZ3RoID0gMDsJLyogQWNjdW11bGF0ZWQgaW4geHh4X3BhcnNlX2RhdGEoKSAqLworCWZyYW1lLT5kZWludGVybGFjZSA9IERlaW50ZXJsYWNlX05vbmU7CisJZnJhbWUtPmZsYWdzID0gMDsgLyogTm8gZmxhZ3MgeWV0LCB1cCB0byBtaW5pZHJpdmVyIChvciB1cykgdG8gc2V0IHRoZW0gKi8KKwl1dmQtPmN1cmZyYW1lID0gZnJhbWVudW07CisKKwkvKgorCSAqIE5vcm1hbGx5IHdlIHdvdWxkIHdhbnQgdG8gY29weSBwcmV2aW91cyBmcmFtZSBpbnRvIHRoZSBjdXJyZW50IG9uZQorCSAqIGJlZm9yZSB3ZSBldmVuIHN0YXJ0IGZpbGxpbmcgaXQgd2l0aCBkYXRhOyB0aGlzIGFsbG93cyB1cyB0byBzdG9wCisJICogZmlsbGluZyBhdCBhbnkgbW9tZW50OyB0b3AgcG9ydGlvbiBvZiB0aGUgZnJhbWUgd2lsbCBiZSBuZXcgYW5kCisJICogYm90dG9tIHBvcnRpb24gd2lsbCBzdGF5IGFzIGl0IHdhcyBpbiBwcmV2aW91cyBmcmFtZS4gSWYgd2UgZG9uJ3QKKwkgKiBkbyB0aGF0IHRoZW4gbWlzc2luZyBjaHVua3Mgb2YgdmlkZW8gc3RyZWFtIHdpbGwgcmVzdWx0IGluIGZsaWNrZXJpbmcKKwkgKiBwb3J0aW9ucyBvZiBvbGQgZGF0YSB3aGF0ZXZlciBpdCB3YXMgYmVmb3JlLgorCSAqCisJICogSWYgd2UgY2hvb3NlIG5vdCB0byBjb3B5IHByZXZpb3VzIGZyYW1lICh0bywgZm9yIGV4YW1wbGUsIHNhdmUgZmV3CisJICogYnVzIGN5Y2xlcyAtIHRoZSBmcmFtZSBjYW4gYmUgcHJldHR5IGxhcmdlISkgdGhlbiB3ZSBoYXZlIGFuIG9wdGlvbgorCSAqIHRvIGNsZWFyIHRoZSBmcmFtZSBiZWZvcmUgdXNpbmcuIElmIHdlIGV4cGVyaWVuY2UgbG9zc2VzIGluIHRoaXMKKwkgKiBtb2RlIHRoZW4gbWlzc2luZyBwaWN0dXJlIHdpbGwgYmUgYmxhY2sgKG5vIGZsaWNrZXJpbmcpLgorCSAqCisJICogRmluYWxseSwgaWYgdXNlciBjaG9vc2VzIG5vdCB0byBjbGVhbiB0aGUgY3VycmVudCBmcmFtZSBiZWZvcmUKKwkgKiBmaWxsaW5nIGl0IHdpdGggZGF0YSB0aGVuIHRoZSBvbGQgZGF0YSB3aWxsIGJlIHZpc2libGUgaWYgd2UgZmFpbAorCSAqIHRvIHJlZmlsbCBlbnRpcmUgZnJhbWUgd2l0aCBuZXcgZGF0YS4KKwkgKi8KKwlpZiAoISh1dmQtPmZsYWdzICYgRkxBR1NfU0VQQVJBVEVfRlJBTUVTKSkgeworCQkvKiBUaGlzIGNvcGllcyBwcmV2aW91cyBmcmFtZSBpbnRvIHRoaXMgb25lIHRvIG1hc2sgbG9zc2VzICovCisJCWludCBwcmV2ID0gKGZyYW1lbnVtIC0gMSArIFVTQlZJREVPX05VTUZSQU1FUykgJSBVU0JWSURFT19OVU1GUkFNRVM7CisJCW1lbW1vdmUoZnJhbWUtPmRhdGEsIHV2ZC0+ZnJhbWVbcHJldl0uZGF0YSwgdXZkLT5tYXhfZnJhbWVfc2l6ZSk7CisJfSBlbHNlIHsKKwkJaWYgKHV2ZC0+ZmxhZ3MgJiBGTEFHU19DTEVBTl9GUkFNRVMpIHsKKwkJCS8qIFRoaXMgcHJvdmlkZXMgYSAiY2xlYW4iIGZyYW1lIGJ1dCBzbG93cyB0aGluZ3MgZG93biAqLworCQkJbWVtc2V0KGZyYW1lLT5kYXRhLCAwLCB1dmQtPm1heF9mcmFtZV9zaXplKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHVzYnZpZGVvX0NvbGxlY3RSYXdEYXRhKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mICdwcm9jZXNzRGF0YScgY2FsbGJhY2sgaWYgeW91CisgKiBvbmx5IHdhbnQgdG8gZHVtcCB0aGUgcmF3IGRhdGEgZnJvbSB0aGUgY2FtZXJhIGludG8gdGhlIG91dHB1dAorICogZGV2aWNlIChmcmFtZSBidWZmZXIpLiBZb3UgY2FuIGxvb2sgYXQgaXQgd2l0aCBWNEwgY2xpZW50LCBidXQgdGhlCisgKiBpbWFnZSB3aWxsIGJlIHVud2F0Y2hhYmxlLiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgY29kZSBhbmQgb2YgdGhlCisgKiBtb2RlIEZMQUdTX05PX0RFQ09ESU5HIGlzIGRlYnVnZ2luZyBhbmQgY2FwdHVyaW5nIG9mIGRhdGFzdHJlYW1zIGZyb20KKyAqIG5ldywgdW5rbm93biBjYW1lcmFzLiBUaGlzIHByb2NlZHVyZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW52b2tlZAorICogaW5zdGVhZCBvZiB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrIGhhbmRsZXIgd2hlbiB1dmQtPmZsYWdzIGhhcyBiaXQKKyAqIEZMQUdTX05PX0RFQ09ESU5HIHNldC4gVGhlcmVmb3JlLCBhbnkgcmVndWxhciBidWlsZCBvZiBhbnkgZHJpdmVyCisgKiBiYXNlZCBvbiB1c2J2aWRlbyBjYW4gdXNlIHRoaXMgZmVhdHVyZSBhdCBhbnkgdGltZS4KKyAqLworc3RhdGljIHZvaWQgdXNidmlkZW9fQ29sbGVjdFJhd0RhdGEoc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lKQoreworCWludCBuOworCisJYXNzZXJ0KHV2ZCAhPSBOVUxMKTsKKwlhc3NlcnQoZnJhbWUgIT0gTlVMTCk7CisKKwkvKiBUcnkgdG8gbW92ZSBkYXRhIGZyb20gcXVldWUgaW50byBmcmFtZSBidWZmZXIgKi8KKwluID0gUmluZ1F1ZXVlX0dldExlbmd0aCgmdXZkLT5kcCk7CisJaWYgKG4gPiAwKSB7CisJCWludCBtOworCQkvKiBTZWUgaG93IG11Y2ggc3BhY2Ugd2UgaGF2ZSBsZWZ0ICovCisJCW0gPSB1dmQtPm1heF9mcmFtZV9zaXplIC0gZnJhbWUtPnNlcVJlYWRfTGVuZ3RoOworCQlpZiAobiA+IG0pCisJCQluID0gbTsKKwkJLyogTm93IG1vdmUgdGhhdCBtdWNoIGRhdGEgaW50byBmcmFtZSBidWZmZXIgKi8KKwkJUmluZ1F1ZXVlX0RlcXVldWUoCisJCQkmdXZkLT5kcCwKKwkJCWZyYW1lLT5kYXRhICsgZnJhbWUtPnNlcVJlYWRfTGVuZ3RoLAorCQkJbSk7CisJCWZyYW1lLT5zZXFSZWFkX0xlbmd0aCArPSBtOworCX0KKwkvKiBTZWUgaWYgd2UgZmlsbGVkIHRoZSBmcmFtZSAqLworCWlmIChmcmFtZS0+c2VxUmVhZF9MZW5ndGggPj0gdXZkLT5tYXhfZnJhbWVfc2l6ZSkgeworCQlmcmFtZS0+ZnJhbWVTdGF0ZSA9IEZyYW1lU3RhdGVfRG9uZTsKKwkJdXZkLT5jdXJmcmFtZSA9IC0xOworCQl1dmQtPnN0YXRzLmZyYW1lX251bSsrOworCX0KK30KKworc3RhdGljIGludCB1c2J2aWRlb19HZXRGcmFtZShzdHJ1Y3QgdXZkICp1dmQsIGludCBmcmFtZU51bSkKK3sKKwlzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lID0gJnV2ZC0+ZnJhbWVbZnJhbWVOdW1dOworCisJaWYgKHV2ZC0+ZGVidWcgPj0gMikKKwkJaW5mbygiJXMoJCVwLCVkLikiLCBfX0ZVTkNUSU9OX18sIHV2ZCwgZnJhbWVOdW0pOworCisJc3dpdGNoIChmcmFtZS0+ZnJhbWVTdGF0ZSkgeworICAgICAgICBjYXNlIEZyYW1lU3RhdGVfVW51c2VkOgorCQlpZiAodXZkLT5kZWJ1ZyA+PSAyKQorCQkJaW5mbygiJXM6IEZyYW1lU3RhdGVfVW51c2VkIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGNhc2UgRnJhbWVTdGF0ZV9SZWFkeToKKyAgICAgICAgY2FzZSBGcmFtZVN0YXRlX0dyYWJiaW5nOgorICAgICAgICBjYXNlIEZyYW1lU3RhdGVfRXJyb3I6CisgICAgICAgIHsKKwkJaW50IG50cmllcywgc2lnbmFsUGVuZGluZzsKKwlyZWRvOgorCQlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpKSB7CisJCQlpZiAodXZkLT5kZWJ1ZyA+PSAyKQorCQkJCWluZm8oIiVzOiBDYW1lcmEgaXMgbm90IG9wZXJhdGlvbmFsICgxKSIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQludHJpZXMgPSAwOyAKKwkJZG8geworCQkJUmluZ1F1ZXVlX0ludGVycnVwdGlibGVTbGVlcE9uKCZ1dmQtPmRwKTsKKwkJCXNpZ25hbFBlbmRpbmcgPSBzaWduYWxfcGVuZGluZyhjdXJyZW50KTsKKwkJCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpIHsKKwkJCQlpZiAodXZkLT5kZWJ1ZyA+PSAyKQorCQkJCQlpbmZvKCIlczogQ2FtZXJhIGlzIG5vdCBvcGVyYXRpb25hbCAoMikiLCBfX0ZVTkNUSU9OX18pOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJYXNzZXJ0KHV2ZC0+ZmJ1ZiAhPSBOVUxMKTsKKwkJCWlmIChzaWduYWxQZW5kaW5nKSB7CisJCQkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKKwkJCQkJaW5mbygiJXM6IFNpZ25hbD0kJTA4eCIsIF9fRlVOQ1RJT05fXywgc2lnbmFsUGVuZGluZyk7CisJCQkJaWYgKHV2ZC0+ZmxhZ3MgJiBGTEFHU19SRVRSWV9WSURJT0NTWU5DKSB7CisJCQkJCXVzYnZpZGVvX1Rlc3RQYXR0ZXJuKHV2ZCwgMSwgMCk7CisJCQkJCXV2ZC0+Y3VyZnJhbWUgPSAtMTsKKwkJCQkJdXZkLT5zdGF0cy5mcmFtZV9udW0rKzsKKwkJCQkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKKwkJCQkJCWluZm8oIiVzOiBGb3JjZWQgdGVzdCBwYXR0ZXJuIHNjcmVlbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCXJldHVybiAwOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFN0YW5kYXJkIGFuc3dlcjogSW50ZXJydXB0ZWQhICovCisJCQkJCWlmICh1dmQtPmRlYnVnID49IDIpCisJCQkJCQlpbmZvKCIlczogSW50ZXJydXB0ZWQhIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIE5vIHNpZ25hbHMgLSB3ZSBqdXN0IGdvdCBuZXcgZGF0YSBpbiBkcCBxdWV1ZSAqLworCQkJCWlmICh1dmQtPmZsYWdzICYgRkxBR1NfTk9fREVDT0RJTkcpCisJCQkJCXVzYnZpZGVvX0NvbGxlY3RSYXdEYXRhKHV2ZCwgZnJhbWUpOworCQkJCWVsc2UgaWYgKFZBTElEX0NBTExCQUNLKHV2ZCwgcHJvY2Vzc0RhdGEpKQorCQkJCQlHRVRfQ0FMTEJBQ0sodXZkLCBwcm9jZXNzRGF0YSkodXZkLCBmcmFtZSk7CisJCQkJZWxzZSAKKwkJCQkJZXJyKCIlczogcHJvY2Vzc0RhdGEgbm90IHNldCIsIF9fRlVOQ1RJT05fXyk7CisJCQl9CisJCX0gd2hpbGUgKGZyYW1lLT5mcmFtZVN0YXRlID09IEZyYW1lU3RhdGVfR3JhYmJpbmcpOworCQlpZiAodXZkLT5kZWJ1ZyA+PSAyKSB7CisJCQlpbmZvKCIlczogR3JhYmJpbmcgZG9uZTsgc3RhdGU9JWQuICglbHUuIGJ5dGVzKSIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgZnJhbWUtPmZyYW1lU3RhdGUsIGZyYW1lLT5zZXFSZWFkX0xlbmd0aCk7CisJCX0KKwkJaWYgKGZyYW1lLT5mcmFtZVN0YXRlID09IEZyYW1lU3RhdGVfRXJyb3IpIHsKKwkJCWludCByZXQgPSB1c2J2aWRlb19OZXdGcmFtZSh1dmQsIGZyYW1lTnVtKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZXJyKCIlczogdXNidmlkZW9fTmV3RnJhbWUoKSBmYWlsZWQgKCVkLikiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWdvdG8gcmVkbzsKKwkJfQorCQkvKiBOb3RlIHRoYXQgd2UgZmFsbCB0aHJvdWdoIHRvIG1lZXQgb3VyIGRlc3RpbnkgYmVsb3cgKi8KKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyYW1lU3RhdGVfRG9uZToKKwkJLyoKKwkJICogRG8gYWxsIG5lY2Vzc2FyeSBwb3N0cHJvY2Vzc2luZyBvZiBkYXRhIHByZXBhcmVkIGluCisJCSAqICJpbnRlcnJ1cHQiIGNvZGUgYW5kIHRoZSBjb2xsZWN0aW5nIGNvZGUgYWJvdmUuIFRoZQorCQkgKiBmcmFtZSBnZXRzIG1hcmtlZCBhcyBGcmFtZVN0YXRlX0RvbmUgYnkgcXVldWUgcGFyc2luZyBjb2RlLgorCQkgKiBUaGlzIHN0YXR1cyBtZWFucyB0aGF0IHdlIGNvbGxlY3RlZCBlbm91Z2ggZGF0YSBhbmQKKwkJICogbW9zdCBsaWtlbHkgcHJvY2Vzc2VkIGl0IGFzIHdlIHdlbnQgdGhyb3VnaC4gSG93ZXZlcgorCQkgKiB0aGUgZGF0YSBtYXkgbmVlZCBwb3N0cHJvY2Vzc2luZywgc3VjaCBhcyBkZWludGVybGFjaW5nCisJCSAqIG9yIHBpY3R1cmUgYWRqdXN0bWVudHMgaW1wbGVtZW50ZWQgaW4gc29mdHdhcmUgKGhvcnJvciEpCisJCSAqCisJCSAqIEFzIHNvb24gYXMgdGhlIGZyYW1lIGJlY29tZXMgImZpbmFsIiBpdCBnZXRzIHByb21vdGVkIHRvCisJCSAqIEZyYW1lU3RhdGVfRG9uZV9Ib2xkIHN0YXR1cyB3aGVyZSBpdCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUKKwkJICogY2FsbGVyIGNvbnN1bWVkIGFsbCB0aGUgdmlkZW8gZGF0YSBmcm9tIHRoZSBmcmFtZS4gVGhlbgorCQkgKiB0aGUgZW1wdHkgc2hlbGwgb2YgZXgtZnJhbWUgaXMgdGhyb3duIG91dCBmb3IgZG9ncyB0byBlYXQuCisJCSAqIEJ1dCB3ZSwgd29ycmllZCBhYm91dCBwZXRzLCB3aWxsIHJlY3ljbGUgdGhlIGZyYW1lIQorCQkgKi8KKwkJdXZkLT5zdGF0cy5mcmFtZV9udW0rKzsKKwkJaWYgKCh1dmQtPmZsYWdzICYgRkxBR1NfTk9fREVDT0RJTkcpID09IDApIHsKKwkJCWlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIHBvc3RQcm9jZXNzKSkKKwkJCQlHRVRfQ0FMTEJBQ0sodXZkLCBwb3N0UHJvY2VzcykodXZkLCBmcmFtZSk7CisJCQlpZiAoZnJhbWUtPmZsYWdzICYgVVNCVklERU9fRlJBTUVfRkxBR19TT0ZUV0FSRV9DT05UUkFTVCkKKwkJCQl1c2J2aWRlb19Tb2Z0d2FyZUNvbnRyYXN0QWRqdXN0bWVudCh1dmQsIGZyYW1lKTsKKwkJfQorCQlmcmFtZS0+ZnJhbWVTdGF0ZSA9IEZyYW1lU3RhdGVfRG9uZV9Ib2xkOworCQlpZiAodXZkLT5kZWJ1ZyA+PSAyKQorCQkJaW5mbygiJXM6IEVudGVyZWQgRnJhbWVTdGF0ZV9Eb25lX0hvbGQgc3RhdGUuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEZyYW1lU3RhdGVfRG9uZV9Ib2xkOgorCQkvKgorCQkgKiBXZSBzdGF5IGluIHRoaXMgc3RhdGUgaW5kZWZpbml0ZWx5IHVudGlsIHNvbWVvbmUgZXh0ZXJuYWwsCisJCSAqIGxpa2UgaW9jdGwoKSBvciByZWFkKCkgY2FsbCBmaW5pc2hlcyBkaWdlc3RpbmcgdGhlIGZyYW1lCisJCSAqIGRhdGEuIFRoZW4gaXQgd2lsbCBtYXJrIHRoZSBmcmFtZSBhcyBGcmFtZVN0YXRlX1VudXNlZCBhbmQKKwkJICogaXQgd2lsbCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHdpbGQgdG8gcm9hbSBmcmVlbHkuCisJCSAqLworCQlpZiAodXZkLT5kZWJ1ZyA+PSAyKQorCQkJaW5mbygiJXM6IEZyYW1lU3RhdGVfRG9uZV9Ib2xkIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAwOworCX0KKworCS8qIENhdGNoLWFsbCBmb3Igb3RoZXIgY2FzZXMuIFdlIHNoYWxsIG5vdCBiZSBoZXJlLiAqLworCWVycigiJXM6IEludmFsaWQgc3RhdGUgJWQuIiwgX19GVU5DVElPTl9fLCBmcmFtZS0+ZnJhbWVTdGF0ZSk7CisJZnJhbWUtPmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX1VudXNlZDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHVzYnZpZGVvX0RlaW50ZXJsYWNlRnJhbWUoKQorICoKKyAqIFRoaXMgcHJvY2VkdXJlIGRlaW50ZXJsYWNlcyB0aGUgZ2l2ZW4gZnJhbWUuIFNvbWUgY2FtZXJhcyBwcm9kdWNlCisgKiBvbmx5IGhhbGYgb2Ygc2NhbmxpbmVzIC0gc29tZXRpbWVzIG9ubHkgZXZlbiBsaW5lcywgc29tZXRpbWVzIG9ubHkKKyAqIG9kZCBsaW5lcy4gVGhlIGRlaW50ZXJsYWNpbmcgbWV0aG9kIGlzIHN0b3JlZCBpbiBmcmFtZS0+ZGVpbnRlcmxhY2UKKyAqIHZhcmlhYmxlLgorICoKKyAqIEhlcmUgd2Ugc2NhbiB0aGUgZnJhbWUgdmVydGljYWxseSBhbmQgcmVwbGFjZSBtaXNzaW5nIHNjYW5saW5lcyB3aXRoCisgKiBhdmVyYWdlIGJldHdlZW4gc3Vycm91bmRpbmcgb25lcyAtIGJlZm9yZSBhbmQgYWZ0ZXIuIElmIHdlIGhhdmUgbm8KKyAqIGxpbmUgYWJvdmUgdGhlbiB3ZSBqdXN0IGNvcHkgbmV4dCBsaW5lLiBTaW1pbGFybHksIGlmIHdlIG5lZWQgdG8KKyAqIGNyZWF0ZSBhIGxhc3QgbGluZSB0aGVuIHByZWNlZGluZyBsaW5lIGlzIHVzZWQuCisgKi8KK3ZvaWQgdXNidmlkZW9fRGVpbnRlcmxhY2VGcmFtZShzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWUpCit7CisJaWYgKCh1dmQgPT0gTlVMTCkgfHwgKGZyYW1lID09IE5VTEwpKQorCQlyZXR1cm47CisKKwlpZiAoKGZyYW1lLT5kZWludGVybGFjZSA9PSBEZWludGVybGFjZV9GaWxsRXZlbkxpbmVzKSB8fAorCSAgICAoZnJhbWUtPmRlaW50ZXJsYWNlID09IERlaW50ZXJsYWNlX0ZpbGxPZGRMaW5lcykpCisJeworCQljb25zdCBpbnQgdjRsX2xpbmVzaXplID0gVklERU9TSVpFX1goZnJhbWUtPnJlcXVlc3QpICogVjRMX0JZVEVTX1BFUl9QSVhFTDsKKwkJaW50IGkgPSAoZnJhbWUtPmRlaW50ZXJsYWNlID09IERlaW50ZXJsYWNlX0ZpbGxFdmVuTGluZXMpID8gMCA6IDE7CisKKwkJZm9yICg7IGkgPCBWSURFT1NJWkVfWShmcmFtZS0+cmVxdWVzdCk7IGkgKz0gMikgeworCQkJY29uc3QgdW5zaWduZWQgY2hhciAqZnMxLCAqZnMyOworCQkJdW5zaWduZWQgY2hhciAqZmQ7CisJCQlpbnQgaXAsIGluLCBqOwkvKiBQcmV2aW91cyBhbmQgbmV4dCBsaW5lcyAqLworCisJCQkvKgorCQkJICogTmVlZCB0byBhdmVyYWdlIGxpbmVzIGJlZm9yZSBhbmQgYWZ0ZXIgJ2knLgorCQkJICogSWYgd2UgZ28gb3V0IG9mIGJvdW5kcyBzZWVraW5nIHRob3NlIGxpbmVzIHRoZW4KKwkJCSAqIHdlIHBvaW50IGJhY2sgdG8gZXhpc3RpbmcgbGluZS4KKwkJCSAqLworCQkJaXAgPSBpIC0gMTsJLyogRmlyc3QsIGdldCByb3VnaCBudW1iZXJzICovCisJCQlpbiA9IGkgKyAxOworCisJCQkvKiBOb3cgdmFsaWRhdGUgKi8KKwkJCWlmIChpcCA8IDApCisJCQkJaXAgPSBpbjsKKwkJCWlmIChpbiA+PSBWSURFT1NJWkVfWShmcmFtZS0+cmVxdWVzdCkpCisJCQkJaW4gPSBpcDsKKworCQkJLyogU2FuaXR5IGNoZWNrICovCisJCQlpZiAoKGlwIDwgMCkgfHwgKGluIDwgMCkgfHwKKwkJCSAgICAoaXAgPj0gVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpKSB8fAorCQkJICAgIChpbiA+PSBWSURFT1NJWkVfWShmcmFtZS0+cmVxdWVzdCkpKQorCQkJeworCQkJCWVycigiRXJyb3I6IGlwPSVkLiBpbj0lZC4gcmVxLmhlaWdodD0lbGQuIiwKKwkJCQkgICAgaXAsIGluLCBWSURFT1NJWkVfWShmcmFtZS0+cmVxdWVzdCkpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBOb3cgd2UgbmVlZCB0byBhdmVyYWdlIGxpbmVzICdpcCcgYW5kICdpbicgdG8gcHJvZHVjZSBsaW5lICdpJyAqLworCQkJZnMxID0gZnJhbWUtPmRhdGEgKyAodjRsX2xpbmVzaXplICogaXApOworCQkJZnMyID0gZnJhbWUtPmRhdGEgKyAodjRsX2xpbmVzaXplICogaW4pOworCQkJZmQgPSBmcmFtZS0+ZGF0YSArICh2NGxfbGluZXNpemUgKiBpKTsKKworCQkJLyogQXZlcmFnZSBsaW5lcyBhcm91bmQgZGVzdGluYXRpb24gKi8KKwkJCWZvciAoaj0wOyBqIDwgdjRsX2xpbmVzaXplOyBqKyspIHsKKwkJCQlmZFtqXSA9ICh1bnNpZ25lZCBjaGFyKSgoKCh1bnNpZ25lZCkgZnMxW2pdKSArCisJCQkJCQkJICgodW5zaWduZWQpZnMyW2pdKSkgPj4gMSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBPcHRpb25hbGx5IGRpc3BsYXkgc3RhdGlzdGljcyBvbiB0aGUgc2NyZWVuICovCisJaWYgKHV2ZC0+ZmxhZ3MgJiBGTEFHU19PVkVSTEFZX1NUQVRTKQorCQl1c2J2aWRlb19PdmVybGF5U3RhdHModXZkLCBmcmFtZSk7Cit9CisKK0VYUE9SVF9TWU1CT0wodXNidmlkZW9fRGVpbnRlcmxhY2VGcmFtZSk7CisKKy8qCisgKiB1c2J2aWRlb19Tb2Z0d2FyZUNvbnRyYXN0QWRqdXN0bWVudCgpCisgKgorICogVGhpcyBjb2RlIGFkanVzdHMgdGhlIGNvbnRyYXN0IG9mIHRoZSBmcmFtZSwgYXNzdW1pbmcgUkdCMjQgZm9ybWF0LgorICogQXMgbW9zdCBzb2Z0d2FyZSBpbWFnZSBwcm9jZXNzaW5nLCB0aGlzIGpvYiBpcyBDUFUtaW50ZW5zaXZlLgorICogR2V0IGEgY2FtZXJhIHRoYXQgc3VwcG9ydHMgaGFyZHdhcmUgYWRqdXN0bWVudCEKKyAqCisgKiBIaXN0b3J5OgorICogMDktRmViLTIwMDEgIENyZWF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHVzYnZpZGVvX1NvZnR3YXJlQ29udHJhc3RBZGp1c3RtZW50KHN0cnVjdCB1dmQgKnV2ZCwgCisJCQkJCQlzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lKQoreworCWludCBpLCBqLCB2NGxfbGluZXNpemU7CisJc2lnbmVkIGxvbmcgYWRqOworCWNvbnN0IGludCBjY20gPSAxMjg7IC8qIENvbG9yIGNvcnJlY3Rpb24gbWVkaWFuIC0gc2VlIGJlbG93ICovCisKKwlpZiAoKHV2ZCA9PSBOVUxMKSB8fCAoZnJhbWUgPT0gTlVMTCkpIHsKKwkJZXJyKCIlczogSWxsZWdhbCBjYWxsLiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJYWRqID0gKHV2ZC0+dnBpYy5jb250cmFzdCAtIDB4ODAwMCkgPj4gODsgLyogLTEyOC4uKzEyNyA9IC1jY20uLisoY2NtLTEpKi8KKwlSRVNUUklDVF9UT19SQU5HRShhZGosIC1jY20sIGNjbSsxKTsKKwlpZiAoYWRqID09IDApIHsKKwkJLyogSW4gcmFyZSBjYXNlIG9mIG5vIGFkanVzdG1lbnQgKi8KKwkJcmV0dXJuOworCX0KKwl2NGxfbGluZXNpemUgPSBWSURFT1NJWkVfWChmcmFtZS0+cmVxdWVzdCkgKiBWNExfQllURVNfUEVSX1BJWEVMOworCWZvciAoaT0wOyBpIDwgVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciAqZmQgPSBmcmFtZS0+ZGF0YSArICh2NGxfbGluZXNpemUgKiBpKTsKKwkJZm9yIChqPTA7IGogPCB2NGxfbGluZXNpemU7IGorKykgeworCQkJc2lnbmVkIGxvbmcgdiA9IChzaWduZWQgbG9uZykgZmRbal07CisJCQkvKiBNYWduaWZ5IHVwIHRvIDIgdGltZXMsIHJlZHVjZSBkb3duIHRvIHplcm8gKi8KKwkJCXYgPSAxMjggKyAoKGNjbSArIGFkaikgKiAodiAtIDEyOCkpIC8gY2NtOworCQkJUkVTVFJJQ1RfVE9fUkFOR0UodiwgMCwgMHhGRik7IC8qIE11c3QgZmxhdHRlbiB0YWlscyAqLworCQkJZmRbal0gPSAodW5zaWduZWQgY2hhcikgdjsKKwkJfQorCX0KK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvdXNidmlkZW8uaCBiL2RyaXZlcnMvdXNiL21lZGlhL3VzYnZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzOTBhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3VzYnZpZGVvLmgKQEAgLTAsMCArMSwzOTMgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2lmbmRlZiB1c2J2aWRlb19oCisjZGVmaW5lCXVzYnZpZGVvX2gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKy8qIE1vc3QgaGVscGZ1bCBkZWJ1Z2dpbmcgYWlkICovCisjZGVmaW5lIGFzc2VydChleHByKSAoKHZvaWQpICgoZXhwcikgPyAwIDogKGVycigiYXNzZXJ0IGZhaWxlZCBhdCBsaW5lICVkIixfX0xJTkVfXykpKSkKKworI2RlZmluZSBVU0JWSURFT19SRVBPUlRfU1RBVFMJMQkvKiBTZXQgdG8gMCB0byBibG9jayBzdGF0aXN0aWNzIG9uIGNsb3NlICovCisKKy8qIEJpdCBmbGFncyAob3B0aW9ucykgKi8KKyNkZWZpbmUgRkxBR1NfUkVUUllfVklESU9DU1lOQwkJKDEgPDwgMCkKKyNkZWZpbmUJRkxBR1NfTU9OT0NIUk9NRQkJKDEgPDwgMSkKKyNkZWZpbmUgRkxBR1NfRElTUExBWV9ISU5UUwkJKDEgPDwgMikKKyNkZWZpbmUgRkxBR1NfT1ZFUkxBWV9TVEFUUwkJKDEgPDwgMykKKyNkZWZpbmUgRkxBR1NfRk9SQ0VfVEVTVFBBVFRFUk4JCSgxIDw8IDQpCisjZGVmaW5lIEZMQUdTX1NFUEFSQVRFX0ZSQU1FUwkJKDEgPDwgNSkKKyNkZWZpbmUgRkxBR1NfQ0xFQU5fRlJBTUVTCQkoMSA8PCA2KQorI2RlZmluZQlGTEFHU19OT19ERUNPRElORwkJKDEgPDwgNykKKworLyogQml0IGZsYWdzIGZvciBmcmFtZXMgKGFwcGx5IHRvIHRoZSBmcmFtZSB3aGVyZSB0aGV5IGFyZSBzcGVjaWZpZWQpICovCisjZGVmaW5lIFVTQlZJREVPX0ZSQU1FX0ZMQUdfU09GVFdBUkVfQ09OVFJBU1QJKDEgPDwgMCkKKworLyogQ2FtZXJhIGNhcGFiaWxpdGllcyAobWF4aW11bSkgKi8KKyNkZWZpbmUgQ0FNRVJBX1VSQl9GUkFNRVMgICAgICAgMzIKKyNkZWZpbmUgQ0FNRVJBX01BWF9JU09fUEFDS0VUICAgMTAyMyAvKiAxMDIyIGFjdHVhbGx5IHNlbnQgYnkgY2FtZXJhICovCisjZGVmaW5lIEZSQU1FU19QRVJfREVTQwkJKENBTUVSQV9VUkJfRlJBTUVTKQorI2RlZmluZSBGUkFNRV9TSVpFX1BFUl9ERVNDCShDQU1FUkFfTUFYX0lTT19QQUNLRVQpCisKKy8qIFRoaXMgbWFjcm8gcmVzdHJpY3RzIGFuIGludCB2YXJpYWJsZSB0byBhbiBpbmNsdXNpdmUgcmFuZ2UgKi8KKyNkZWZpbmUgUkVTVFJJQ1RfVE9fUkFOR0UodixtaSxtYSkgeyBpZiAoKHYpIDwgKG1pKSkgKHYpID0gKG1pKTsgZWxzZSBpZiAoKHYpID4gKG1hKSkgKHYpID0gKG1hKTsgfQorCisjZGVmaW5lIFY0TF9CWVRFU19QRVJfUElYRUwgICAgIDMJLyogQmVjYXVzZSB3ZSBwcm9kdWNlIFJHQjI0ICovCisKKy8qCisgKiBVc2UgdGhpcyBtYWNybyB0byBjb25zdHJ1Y3QgY29uc3RhbnRzIGZvciBkaWZmZXJlbnQgdmlkZW8gc2l6ZXMuCisgKiBXZSBoYXZlIHRvIGRlYWwgd2l0aCBkaWZmZXJlbnQgdmlkZW8gc2l6ZXMgdGhhdCBoYXZlIHRvIGJlCisgKiBjb25maWd1cmVkIGluIHRoZSBkZXZpY2Ugb3IgY29tcGFyZWQgYWdhaW5zdCB3aGVuIHdlIHJlY2VpdmUKKyAqIGEgZGF0YS4gTm9ybWFsbHkgb25lIHdvdWxkIGRlZmluZSBhIGJ1bmNoIG9mIFZJREVPU0laRV94X2J5X3kKKyAqICNkZWZpbmVzIGFuZCB0aGF0J3MgdGhlIGVuZCBvZiBzdG9yeS4gSG93ZXZlciB0aGlzIHNvbHV0aW9uCisgKiBkb2VzIG5vdCBhbGxvdyB0byBjb252ZXJ0IGJldHdlZW4gcmVhbCBwaXhlbCBzaXplcyBhbmQgdGhlCisgKiBjb25zdGFudCAoaW50ZWdlcikgdmFsdWUgdGhhdCBtYXkgYmUgdXNlZCB0byB0YWcgYSBmcmFtZSBvcgorICogd2hhdGV2ZXIuIFRoZSBzZXQgb2YgbWFjcm9zIGJlbG93IGNvbnN0cnVjdHMgdmlkZW9zaXplIGNvbnN0YW50cworICogZnJvbSB0aGUgcGl4ZWwgc2l6ZSBhbmQgYWxsb3dzIHRvIHJlY29uc3RydWN0IHRoZSBwaXhlbCBzaXplCisgKiBmcm9tIHRoZSBjb21iaW5lZCB2YWx1ZSBsYXRlci4KKyAqLworI2RlZmluZQlWSURFT1NJWkUoeCx5KQkoKCh4KSAmIDB4RkZGRkwpIHwgKCgoeSkgJiAweEZGRkZMKSA8PCAxNikpCisjZGVmaW5lCVZJREVPU0laRV9YKHZzKQkoKHZzKSAmIDB4RkZGRkwpCisjZGVmaW5lCVZJREVPU0laRV9ZKHZzKQkoKCh2cykgPj4gMTYpICYgMHhGRkZGTCkKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB2aWRlb3NpemVfdDsKKworLyoKKyAqIFRoaXMgbWFjcm8gY2hlY2tzIGlmIHRoZSBjYW1lcmEgaXMgc3RpbGwgb3BlcmF0aW9uYWwuIFRoZSAndXZkJworICogcG9pbnRlciBtdXN0IGJlIHZhbGlkLCB1dmQtPmRldiBtdXN0IGJlIHZhbGlkLCB3ZSBhcmUgbm90CisgKiByZW1vdmluZyB0aGUgZGV2aWNlIGFuZCB0aGUgZGV2aWNlIGhhcyBub3QgZXJyZWQgb24gdXMuCisgKi8KKyNkZWZpbmUgQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkgKFwKKwkodXZkICE9IE5VTEwpICYmIFwKKwkoKHV2ZCktPmRldiAhPSBOVUxMKSAmJiBcCisJKCh1dmQpLT5sYXN0X2Vycm9yID09IDApICYmIFwKKwkoISh1dmQpLT5yZW1vdmVfcGVuZGluZykpCisKKy8qCisgKiBXZSB1c2UgbWFjcm9zIHRvIGRvIFlVViAtPiBSR0IgY29udmVyc2lvbiBiZWNhdXNlIHRoaXMgaXMKKyAqIHZlcnkgaW1wb3J0YW50IGZvciBzcGVlZCBhbmQgdG90YWxseSB1bmltcG9ydGFudCBmb3Igc2l6ZS4KKyAqCisgKiBZVVYgLT4gUkdCIENvbnZlcnNpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEIgPSAxLjE2NCooWS0xNikJCSAgICArIDIuMDE4KihWLTEyOCkKKyAqIEcgPSAxLjE2NCooWS0xNikgLSAwLjgxMyooVS0xMjgpIC0gMC4zOTEqKFYtMTI4KQorICogUiA9IDEuMTY0KihZLTE2KSArIDEuNTk2KihVLTEyOCkKKyAqCisgKiBJZiB5b3UgZmFuY3kgaW50ZWdlciBhcml0aG1ldGljcyAoYXMgeW91IHNob3VsZCksIGhlYXIgdGhpczoKKyAqCisgKiA2NTUzNipCID0gNzYyODQqKFktMTYpCQkgICsgMTMyMjUyKihWLTEyOCkKKyAqIDY1NTM2KkcgPSA3NjI4NCooWS0xNikgLSAgNTMyODEqKFUtMTI4KSAtICAyNTYyNSooVi0xMjgpCisgKiA2NTUzNipSID0gNzYyODQqKFktMTYpICsgMTA0NTk1KihVLTEyOCkKKyAqCisgKiBNYWtlIHN1cmUgdGhlIG91dHB1dCB2YWx1ZXMgYXJlIHdpdGhpbiBbMC4uMjU1XSByYW5nZS4KKyAqLworI2RlZmluZSBMSU1JVF9SR0IoeCkgKCgoeCkgPCAwKSA/IDAgOiAoKCh4KSA+IDI1NSkgPyAyNTUgOiAoeCkpKQorI2RlZmluZSBZVVZfVE9fUkdCX0JZX1RIRV9CT09LKG15LG11LG12LG1yLG1nLG1iKSB7IFwKKyAgICBpbnQgbW1feSwgbW1feWMsIG1tX3UsIG1tX3YsIG1tX3IsIG1tX2csIG1tX2I7IFwKKyAgICBtbV95ID0gKG15KSAtIDE2OyAgXAorICAgIG1tX3UgPSAobXUpIC0gMTI4OyBcCisgICAgbW1fdiA9IChtdikgLSAxMjg7IFwKKyAgICBtbV95Yz0gbW1feSAqIDc2Mjg0OyBcCisgICAgbW1fYiA9IChtbV95YwkJKyAxMzIyNTIqbW1fdgkpID4+IDE2OyBcCisgICAgbW1fZyA9IChtbV95YyAtICA1MzI4MSptbV91IC0gIDI1NjI1Km1tX3YJKSA+PiAxNjsgXAorICAgIG1tX3IgPSAobW1feWMgKyAxMDQ1OTUqbW1fdQkJCSkgPj4gMTY7IFwKKyAgICBtYiA9IExJTUlUX1JHQihtbV9iKTsgXAorICAgIG1nID0gTElNSVRfUkdCKG1tX2cpOyBcCisgICAgbXIgPSBMSU1JVF9SR0IobW1fcik7IFwKK30KKworI2RlZmluZQlSSU5HX1FVRVVFX1NJWkUJCSgxMjgqMTAyNCkJLyogTXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUJUklOR19RVUVVRV9BRFZBTkNFX0lOREVYKHJxLGluZCxuKSAocnEpLT5pbmQgPSAoKHJxKS0+aW5kICsgKG4pKSAmICgocnEpLT5sZW5ndGgtMSkKKyNkZWZpbmUJUklOR19RVUVVRV9ERVFVRVVFX0JZVEVTKHJxLG4pIFJJTkdfUVVFVUVfQURWQU5DRV9JTkRFWChycSxyaSxuKQorI2RlZmluZQlSSU5HX1FVRVVFX1BFRUsocnEsb2ZzKSAoKHJxKS0+cXVldWVbKChvZnMpICsgKHJxKS0+cmkpICYgKChycSktPmxlbmd0aC0xKV0pCisKK3N0cnVjdCBSaW5nUXVldWUgeworCXVuc2lnbmVkIGNoYXIgKnF1ZXVlOwkvKiBEYXRhIGZyb20gdGhlIElzb2MgZGF0YSBwdW1wICovCisJaW50IGxlbmd0aDsJCS8qIEhvdyBtYW55IGJ5dGVzIGFsbG9jYXRlZCBmb3IgdGhlIHF1ZXVlICovCisJaW50IHdpOwkJCS8qIFRoYXQncyB3aGVyZSB3ZSB3cml0ZSAqLworCWludCByaTsJCQkvKiBSZWFkIGZyb20gaGVyZSB1bnRpbCB5b3UgaGl0IHdyaXRlIGluZGV4ICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3FoOwkvKiBQcm9jZXNzZXMgd2FpdGluZyAqLworfTsKKworZW51bSBTY2FuU3RhdGUgeworCVNjYW5TdGF0ZV9TY2FubmluZywJLyogU2Nhbm5pbmcgZm9yIGhlYWRlciAqLworCVNjYW5TdGF0ZV9MaW5lcwkJLyogUGFyc2luZyBsaW5lcyAqLworfTsKKworLyogQ29tcGxldGlvbiBzdGF0ZXMgb2YgdGhlIGRhdGEgcGFyc2VyICovCitlbnVtIFBhcnNlU3RhdGUgeworCXNjYW5fQ29udGludWUsCQkvKiBKdXN0IHBhcnNlIG5leHQgaXRlbSAqLworCXNjYW5fTmV4dEZyYW1lLAkJLyogRnJhbWUgZG9uZSwgc2VuZCBpdCB0byBWNEwgKi8KKwlzY2FuX091dCwJCS8qIE5vdCBlbm91Z2ggZGF0YSBmb3IgZnJhbWUgKi8KKwlzY2FuX0VuZFBhcnNlCQkvKiBFbmQgcGFyc2luZyAqLworfTsKKworZW51bSBGcmFtZVN0YXRlIHsKKwlGcmFtZVN0YXRlX1VudXNlZCwJLyogVW51c2VkIChubyBNQ0FQVFVSRSkgKi8KKwlGcmFtZVN0YXRlX1JlYWR5LAkvKiBSZWFkeSB0byBzdGFydCBncmFiYmluZyAqLworCUZyYW1lU3RhdGVfR3JhYmJpbmcsCS8qIEluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGdyYWJiZWQgaW50byAqLworCUZyYW1lU3RhdGVfRG9uZSwJLyogRmluaXNoZWQgZ3JhYmJpbmcsIGJ1dCBub3QgYmVlbiBzeW5jZWQgeWV0ICovCisJRnJhbWVTdGF0ZV9Eb25lX0hvbGQsCS8qIEFyZSBzeW5jaW5nIG9yIHJlYWRpbmcgKi8KKwlGcmFtZVN0YXRlX0Vycm9yLAkvKiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkIHdoaWxlIHByb2Nlc3NpbmcgKi8KK307CisKKy8qCisgKiBTb21lIGZyYW1lcyBtYXkgY29udGFpbiBvbmx5IGV2ZW4gb3Igb2RkIGxpbmVzLiBUaGlzIHR5cGUKKyAqIHNwZWNpZmllcyB3aGF0IHR5cGUgb2YgZGVpbnRlcmxhY2luZyBpcyByZXF1aXJlZC4KKyAqLworZW51bSBEZWludGVybGFjZSB7CisJRGVpbnRlcmxhY2VfTm9uZT0wLAorCURlaW50ZXJsYWNlX0ZpbGxPZGRMaW5lcywKKwlEZWludGVybGFjZV9GaWxsRXZlbkxpbmVzCit9OworCisjZGVmaW5lIFVTQlZJREVPX05VTUZSQU1FUwkyCS8qIEhvdyBtYW55IGZyYW1lcyB3ZSB3b3JrIHdpdGggKi8KKyNkZWZpbmUgVVNCVklERU9fTlVNU0JVRgkyCS8qIEhvdyBtYW55IFVSQnMgbGlua2VkIGluIGEgcmluZyAqLworCisvKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIG9uZSBJc29jIHJlcXVlc3QgLSBVUkIgYW5kIGJ1ZmZlciAqLworc3RydWN0IHVzYnZpZGVvX3NidWYgeworCWNoYXIgKmRhdGE7CisJc3RydWN0IHVyYiAqdXJiOworfTsKKworc3RydWN0IHVzYnZpZGVvX2ZyYW1lIHsKKwljaGFyICpkYXRhOwkJLyogRnJhbWUgYnVmZmVyICovCisJdW5zaWduZWQgbG9uZyBoZWFkZXI7CS8qIFNpZ25pZmljYW50IGJpdHMgZnJvbSB0aGUgaGVhZGVyICovCisKKwl2aWRlb3NpemVfdCBjYW52YXM7CS8qIFRoZSBjYW52YXMgKG1heC4gaW1hZ2UpIGFsbG9jYXRlZCAqLworCXZpZGVvc2l6ZV90IHJlcXVlc3Q7CS8qIFRoYXQncyB3aGF0IHRoZSBhcHBsaWNhdGlvbiBhc2tlZCBmb3IgKi8KKwl1bnNpZ25lZCBzaG9ydCBwYWxldHRlOwkvKiBUaGUgZGVzaXJlZCBmb3JtYXQgKi8KKworCWVudW0gRnJhbWVTdGF0ZSBmcmFtZVN0YXRlOy8qIFN0YXRlIG9mIGdyYWJiaW5nICovCisJZW51bSBTY2FuU3RhdGUgc2NhbnN0YXRlOwkvKiBTdGF0ZSBvZiBzY2FubmluZyAqLworCWVudW0gRGVpbnRlcmxhY2UgZGVpbnRlcmxhY2U7CisJaW50IGZsYWdzOwkJLyogVVNCVklERU9fRlJBTUVfRkxBR194eHggYml0IGZsYWdzICovCisKKwlpbnQgY3VybGluZTsJCS8qIExpbmUgb2YgZnJhbWUgd2UncmUgd29ya2luZyBvbiAqLworCisJbG9uZyBzZXFSZWFkX0xlbmd0aDsJLyogUmF3IGRhdGEgbGVuZ3RoIG9mIGZyYW1lICovCisJbG9uZyBzZXFSZWFkX0luZGV4OwkvKiBBbW91bnQgb2YgZGF0YSB0aGF0IGhhcyBiZWVuIGFscmVhZHkgcmVhZCAqLworCisJdm9pZCAqdXNlcjsJCS8qIEFkZGl0aW9uYWwgZGF0YSB0aGF0IHVzZXIgbWF5IG5lZWQgKi8KK307CisKKy8qIFN0YXRpc3RpY3MgdGhhdCBjYW4gYmUgb3ZlcmxhaWQgb24gc2NyZWVuICovCitzdHJ1Y3QgdXNidmlkZW9fc3RhdGlzdGljcyB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVfbnVtOwkvKiBTZXF1ZW50aWFsIG51bWJlciBvZiB0aGUgZnJhbWUgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyB1cmJfY291bnQ7ICAgICAgICAvKiBIb3cgbWFueSBVUkJzIHdlIHJlY2VpdmVkIHNvIGZhciAqLworICAgICAgICB1bnNpZ25lZCBsb25nIHVyYl9sZW5ndGg7ICAgICAgIC8qIExlbmd0aCBvZiBsYXN0IFVSQiAqLworICAgICAgICB1bnNpZ25lZCBsb25nIGRhdGFfY291bnQ7ICAgICAgIC8qIEhvdyBtYW55IGJ5dGVzIHdlIHJlY2VpdmVkICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgaGVhZGVyX2NvdW50OyAgICAgLyogSG93IG1hbnkgZnJhbWUgaGVhZGVycyB3ZSBmb3VuZCAqLworCXVuc2lnbmVkIGxvbmcgaXNvX3NraXBfY291bnQ7CS8qIEhvdyBtYW55IGVtcHR5IElTTyBwYWNrZXRzIHJlY2VpdmVkICovCisJdW5zaWduZWQgbG9uZyBpc29fZXJyX2NvdW50OwkvKiBIb3cgbWFueSBiYWQgSVNPIHBhY2tldHMgcmVjZWl2ZWQgKi8KK307CisKK3N0cnVjdCB1c2J2aWRlbzsKKworc3RydWN0IHV2ZCB7CisJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OwkvKiBNdXN0IGJlIHRoZSBmaXJzdCBmaWVsZCEgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OworCXN0cnVjdCB1c2J2aWRlbyAqaGFuZGxlOwkvKiBQb2ludHMgYmFjayB0byB0aGUgc3RydWN0IHVzYnZpZGVvICovCisJdm9pZCAqdXNlcl9kYXRhOwkJLyogQ2FtZXJhLWRlcGVuZGVudCBkYXRhICovCisJaW50IHVzZXJfc2l6ZTsJCQkvKiBTaXplIG9mIHRoYXQgY2FtZXJhLWRlcGVuZGVudCBkYXRhICovCisJaW50IGRlYnVnOwkJCS8qIERlYnVnIGxldmVsIGZvciB1c2J2aWRlbyAqLworCXVuc2lnbmVkIGNoYXIgaWZhY2U7CQkvKiBWaWRlbyBpbnRlcmZhY2UgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciB2aWRlb19lbmRwOworCXVuc2lnbmVkIGNoYXIgaWZhY2VBbHRBY3RpdmU7CisJdW5zaWduZWQgY2hhciBpZmFjZUFsdEluYWN0aXZlOyAvKiBBbHQgc2V0dGluZ3MgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogRkxBR1NfVVNCVklERU9feHh4ICovCisJdW5zaWduZWQgbG9uZyBwYWxldHRlQml0czsJLyogV2hpY2ggcGFsZXR0ZXMgd2UgYWNjZXB0PyAqLworCXVuc2lnbmVkIHNob3J0IGRlZmF1bHRQYWxldHRlOwkvKiBXaGF0IHBhbGV0dGUgdG8gdXNlIGZvciByZWFkKCkgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJaW50IHVzZXI7CQkvKiB1c2VyIGNvdW50IGZvciBleGNsdXNpdmUgdXNlICovCisKKwl2aWRlb3NpemVfdCB2aWRlb3NpemU7CS8qIEN1cnJlbnQgc2V0dGluZyAqLworCXZpZGVvc2l6ZV90IGNhbnZhczsJLyogVGhpcyBpcyB0aGUgd2lkdGgsaGVpZ2h0IG9mIHRoZSBWNEwgY2FudmFzICovCisJaW50IG1heF9mcmFtZV9zaXplOwkvKiBCeXRlcyBpbiBvbmUgdmlkZW8gZnJhbWUgKi8KKworCWludCB1dmRfdXNlZDsgICAgICAgIAkvKiBJcyB0aGlzIHN0cnVjdHVyZSBpbiB1c2U/ICovCisJaW50IHN0cmVhbWluZzsJCS8qIEFyZSB3ZSBzdHJlYW1pbmcgSXNvY2hyb25vdXM/ICovCisJaW50IGdyYWJiaW5nOwkJLyogQXJlIHdlIGdyYWJiaW5nPyAqLworCWludCBzZXR0aW5nc0FkanVzdGVkOwkvKiBIYXZlIHdlIGFkanVzdGVkIGNvbnRyYXN0IGV0Yy4/ICovCisJaW50IGxhc3RfZXJyb3I7CQkvKiBXaGF0IGNhbGFtaXR5IHN0cnVjayB1cz8gKi8KKworCWNoYXIgKmZidWY7CQkvKiBWaWRlb2RldiBidWZmZXIgYXJlYSAqLworCWludCBmYnVmX3NpemU7CQkvKiBWaWRlb2RldiBidWZmZXIgc2l6ZSAqLworCisJaW50IGN1cmZyYW1lOworCWludCBpc29fcGFja2V0X2xlbjsJLyogVmlkZW9tb2RlLWRlcGVuZGVudCwgc2F2ZXMgYnVzIGJhbmR3aWR0aCAqLworCisJc3RydWN0IFJpbmdRdWV1ZSBkcDsJLyogSXNvYyBkYXRhIHB1bXAgKi8KKwlzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgZnJhbWVbVVNCVklERU9fTlVNRlJBTUVTXTsKKwlzdHJ1Y3QgdXNidmlkZW9fc2J1ZiBzYnVmW1VTQlZJREVPX05VTVNCVUZdOworCisJdm9sYXRpbGUgaW50IHJlbW92ZV9wZW5kaW5nOwkvKiBJZiBzZXQgdGhlbiBhYm91dCB0byBleGl0ICovCisKKwlzdHJ1Y3QgdmlkZW9fcGljdHVyZSB2cGljLCB2cGljX29sZDsJLyogUGljdHVyZSBzZXR0aW5ncyAqLworCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IHZjYXA7CQkvKiBWaWRlbyBjYXBhYmlsaXRpZXMgKi8KKwlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCB2Y2hhbjsJLyogTWF5IGJlIHVzZWQgZm9yIHR1bmVyIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgdXNidmlkZW9fc3RhdGlzdGljcyBzdGF0czsKKwljaGFyIHZpZGVvTmFtZVszMl07CQkvKiBIb2xkcyBuYW1lIGxpa2UgInZpZGVvNyIgKi8KK307CisKKy8qCisgKiB1c2J2aWRlbyBjYWxsYmFja3MgKHZpcnR1YWwgbWV0aG9kcykuIFRoZXkgYXJlIHNldCB3aGVuIHVzYnZpZGVvCisgKiBzZXJ2aWNlcyBhcmUgcmVnaXN0ZXJlZC4gQWxsIG9mIHRoZXNlIGRlZmF1bHQgdG8gTlVMTCwgZXhjZXB0IHRob3NlCisgKiB0aGF0IGRlZmF1bHQgdG8gdXNidmlkZW8tcHJvdmlkZWQgbWV0aG9kcy4KKyAqLworc3RydWN0IHVzYnZpZGVvX2NiIHsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKik7CisJdm9pZCAoKnVzZXJGcmVlKShzdHJ1Y3QgdXZkICopOworCXZvaWQgKCpkaXNjb25uZWN0KShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKKwlpbnQgKCpzZXR1cE9uT3Blbikoc3RydWN0IHV2ZCAqKTsKKwl2b2lkICgqdmlkZW9TdGFydCkoc3RydWN0IHV2ZCAqKTsKKwl2b2lkICgqdmlkZW9TdG9wKShzdHJ1Y3QgdXZkICopOworCXZvaWQgKCpwcm9jZXNzRGF0YSkoc3RydWN0IHV2ZCAqLCBzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKik7CisJdm9pZCAoKnBvc3RQcm9jZXNzKShzdHJ1Y3QgdXZkICosIHN0cnVjdCB1c2J2aWRlb19mcmFtZSAqKTsKKwl2b2lkICgqYWRqdXN0UGljdHVyZSkoc3RydWN0IHV2ZCAqKTsKKwlpbnQgKCpnZXRGUFMpKHN0cnVjdCB1dmQgKik7CisJaW50ICgqb3ZlcmxheUhvb2spKHN0cnVjdCB1dmQgKiwgc3RydWN0IHVzYnZpZGVvX2ZyYW1lICopOworCWludCAoKmdldEZyYW1lKShzdHJ1Y3QgdXZkICosIGludCk7CisJaW50ICgqc3RhcnREYXRhUHVtcCkoc3RydWN0IHV2ZCAqdXZkKTsKKwl2b2lkICgqc3RvcERhdGFQdW1wKShzdHJ1Y3QgdXZkICp1dmQpOworCWludCAoKnNldFZpZGVvTW9kZSkoc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyk7Cit9OworCitzdHJ1Y3QgdXNidmlkZW8geworCWludCBudW1fY2FtZXJhczsJCS8qIEFzIGFsbG9jYXRlZCAqLworCXN0cnVjdCB1c2JfZHJpdmVyIHVzYmRydjsJLyogSW50ZXJmYWNlIHRvIHRoZSBVU0Igc3RhY2sgKi8KKwljaGFyIGRydk5hbWVbODBdOwkJLyogRHJpdmVyIG5hbWUgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CQkvKiBNdXRleCBwcm90ZWN0aW5nIGNhbWVyYSBzdHJ1Y3R1cmVzICovCisJc3RydWN0IHVzYnZpZGVvX2NiIGNiOwkJLyogVGFibGUgb2YgY2FsbGJhY2tzICh2aXJ0dWFsIG1ldGhvZHMpICovCisJc3RydWN0IHZpZGVvX2RldmljZSB2ZHQ7CS8qIFZpZGVvIGRldmljZSB0ZW1wbGF0ZSAqLworCXN0cnVjdCB1dmQgKmNhbTsJCQkvKiBBcnJheSBvZiBjYW1lcmEgc3RydWN0dXJlcyAqLworCXN0cnVjdCBtb2R1bGUgKm1kX21vZHVsZTsJLyogTWluaWRyaXZlciBtb2R1bGUgKi8KK307CisKKworLyoKKyAqIFRoaXMgbWFjcm8gcmV0cmlldmVzIGNhbGxiYWNrIGFkZHJlc3MgZnJvbSB0aGUgc3RydWN0IHV2ZCBvYmplY3QuCisgKiBObyB2YWxpZGl0eSBjaGVja3MgYXJlIGRvbmUgaGVyZSwgc28gYmUgc3VyZSB0byBjaGVjayB0aGUKKyAqIGNhbGxiYWNrIGJlZm9yZWhhbmQgd2l0aCBWQUxJRF9DQUxMQkFDSy4KKyAqLworI2RlZmluZQlHRVRfQ0FMTEJBQ0sodXZkLGNiTmFtZSkgKCh1dmQpLT5oYW5kbGUtPmNiLmNiTmFtZSkKKworLyoKKyAqIFRoaXMgbWFjcm8gcmV0dXJucyBlaXRoZXIgY2FsbGJhY2sgcG9pbnRlciBvciBOVUxMLiBUaGlzIGlzIHNhZmUKKyAqIG1hY3JvLCBtZWFuaW5nIHRoYXQgbW9zdCBvZiBjb21wb25lbnRzIG9mIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZAorICogbWF5IGJlIE5VTEwgLSB0aGlzIG9ubHkgcmVzdWx0cyBpbiBOVUxMIGJlaW5nIHJldHVybmVkLiBZb3UgbWF5CisgKiB3aXNoIHRvIHVzZSB0aGlzIG1hY3JvIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjYWxsYmFjayBpcyBjYWxsYWJsZS4KKyAqIEhvd2V2ZXIga2VlcCBpbiBtaW5kIHRoYXQgdGhvc2UgY2hlY2tzIHRha2UgdGltZS4KKyAqLworI2RlZmluZQlWQUxJRF9DQUxMQkFDSyh1dmQsY2JOYW1lKSAoKCgodXZkKSAhPSBOVUxMKSAmJiBcCisJCSgodXZkKS0+aGFuZGxlICE9IE5VTEwpKSA/IEdFVF9DQUxMQkFDSyh1dmQsY2JOYW1lKSA6IE5VTEwpCisKK2ludCAgUmluZ1F1ZXVlX0RlcXVldWUoc3RydWN0IFJpbmdRdWV1ZSAqcnEsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbik7CitpbnQgIFJpbmdRdWV1ZV9FbnF1ZXVlKHN0cnVjdCBSaW5nUXVldWUgKnJxLCBjb25zdCB1bnNpZ25lZCBjaGFyICpjZGF0YSwgaW50IG4pOwordm9pZCBSaW5nUXVldWVfV2FrZVVwSW50ZXJydXB0aWJsZShzdHJ1Y3QgUmluZ1F1ZXVlICpycSk7Cit2b2lkIFJpbmdRdWV1ZV9GbHVzaChzdHJ1Y3QgUmluZ1F1ZXVlICpycSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IFJpbmdRdWV1ZV9HZXRMZW5ndGgoY29uc3Qgc3RydWN0IFJpbmdRdWV1ZSAqcnEpCit7CisJcmV0dXJuIChycS0+d2kgLSBycS0+cmkgKyBycS0+bGVuZ3RoKSAmIChycS0+bGVuZ3RoLTEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBSaW5nUXVldWVfR2V0RnJlZVNwYWNlKGNvbnN0IHN0cnVjdCBSaW5nUXVldWUgKnJxKQoreworCXJldHVybiBycS0+bGVuZ3RoIC0gUmluZ1F1ZXVlX0dldExlbmd0aChycSk7Cit9CisKK3ZvaWQgdXNidmlkZW9fRHJhd0xpbmUoCisJc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSwKKwlpbnQgeDEsIGludCB5MSwKKwlpbnQgeDIsIGludCB5MiwKKwl1bnNpZ25lZCBjaGFyIGNyLCB1bnNpZ25lZCBjaGFyIGNnLCB1bnNpZ25lZCBjaGFyIGNiKTsKK3ZvaWQgdXNidmlkZW9fSGV4RHVtcChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKK3ZvaWQgdXNidmlkZW9fU2F5QW5kV2FpdChjb25zdCBjaGFyICp3aGF0KTsKK3ZvaWQgdXNidmlkZW9fVGVzdFBhdHRlcm4oc3RydWN0IHV2ZCAqdXZkLCBpbnQgZnVsbGZyYW1lLCBpbnQgcG1vZGUpOworCisvKiBNZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyAqLwordW5zaWduZWQgbG9uZyB1c2J2aWRlb19rdmlydF90b19wYSh1bnNpZ25lZCBsb25nIGFkcik7CisKK2ludCB1c2J2aWRlb19yZWdpc3RlcigKKwlzdHJ1Y3QgdXNidmlkZW8gKipwQ2FtcywKKwljb25zdCBpbnQgbnVtX2NhbXMsCisJY29uc3QgaW50IG51bV9leHRyYSwKKwljb25zdCBjaGFyICpkcml2ZXJOYW1lLAorCWNvbnN0IHN0cnVjdCB1c2J2aWRlb19jYiAqY2JUYWJsZSwKKwlzdHJ1Y3QgbW9kdWxlICptZCwKKwljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWRfdGFibGUpOworc3RydWN0IHV2ZCAqdXNidmlkZW9fQWxsb2NhdGVEZXZpY2Uoc3RydWN0IHVzYnZpZGVvICpjYW1zKTsKK2ludCB1c2J2aWRlb19SZWdpc3RlclZpZGVvRGV2aWNlKHN0cnVjdCB1dmQgKnV2ZCk7Cit2b2lkIHVzYnZpZGVvX0RlcmVnaXN0ZXIoc3RydWN0IHVzYnZpZGVvICoqdXZ0KTsKKworaW50IHVzYnZpZGVvX3Y0bF9pbml0aWFsaXplKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldik7CisKK3ZvaWQgdXNidmlkZW9fRGVpbnRlcmxhY2VGcmFtZShzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWUpOworCisvKgorICogVGhpcyBjb2RlIHBlcmZvcm1zIGJvdW5kcyBjaGVja2luZyAtIHVzZSBpdCB3aGVuIHdvcmtpbmcgd2l0aAorICogbmV3IGZvcm1hdHMsIG9yIGVsc2UgeW91IG1heSBnZXQgb29wc2VzIGFsbCBvdmVyIHRoZSBwbGFjZS4KKyAqIElmIHBpeGVsIGZhbGxzIG91dCBvZiBib3VuZHMgdGhlbiBpdCBnZXRzIHNob3ZlZCBiYWNrIChhcyBjbG9zZQorICogdG8gcGxhY2Ugb2Ygb2ZmZW5jZSBhcyBwb3NzaWJsZSkgYW5kIGlzIHBhaW50ZWQgYnJpZ2h0IHJlZC4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIGltcG9ydGFudCBjb25jZXB0czogZnJhbWUgd2lkdGgsIGhlaWdodCBhbmQKKyAqIFY0TCBjYW52YXMgd2lkdGgsIGhlaWdodC4gVGhlIGZvcm1lciBpcyB0aGUgYXJlYSByZXF1ZXN0ZWQgYnkKKyAqIHRoZSBhcHBsaWNhdGlvbiAtZm9yIHRoaXMgdmVyeSBmcmFtZS0uIFRoZSBsYXR0ZXIgaXMgdGhlIGxhcmdlc3QKKyAqIHBvc3NpYmxlIGZyYW1lIHRoYXQgd2UgY2FuIHNlcnZlICh3ZSBhZHZlcnRpc2UgdGhhdCB2aWEgVjRMIGlvY3RsKS4KKyAqIFRoZSBmcmFtZSBkYXRhIGlzIGV4cGVjdGVkIHRvIGJlIGZvcm1hdHRlZCBhcyBsaW5lcyBvZiBsZW5ndGgKKyAqIFZJREVPU0laRV9YKGZyLT5yZXF1ZXN0KSwgdG90YWwgVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpIGxpbmVzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgUkdCMjRfUFVUUElYRUwoCisJc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmciwKKwlpbnQgaXgsIGludCBpeSwKKwl1bnNpZ25lZCBjaGFyIHZyLAorCXVuc2lnbmVkIGNoYXIgdmcsCisJdW5zaWduZWQgY2hhciB2YikKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwZjsKKwlpbnQgbGltaXRlciA9IDAsIG14LCBteTsKKwlteCA9IGl4OworCW15ID0gaXk7CisJaWYgKG14IDwgMCkgeworCQlteD0wOworCQlsaW1pdGVyKys7CisJfSBlbHNlIGlmIChteCA+PSBWSURFT1NJWkVfWCgoZnIpLT5yZXF1ZXN0KSkgeworCQlteD0gVklERU9TSVpFX1goKGZyKS0+cmVxdWVzdCkgLSAxOworCQlsaW1pdGVyKys7CisJfQorCWlmIChteSA8IDApIHsKKwkJbXkgPSAwOworCQlsaW1pdGVyKys7CisJfSBlbHNlIGlmIChteSA+PSBWSURFT1NJWkVfWSgoZnIpLT5yZXF1ZXN0KSkgeworCQlteSA9IFZJREVPU0laRV9ZKChmciktPnJlcXVlc3QpIC0gMTsKKwkJbGltaXRlcisrOworCX0KKwlwZiA9IChmciktPmRhdGEgKyBWNExfQllURVNfUEVSX1BJWEVMKigoaXkpKlZJREVPU0laRV9YKChmciktPnJlcXVlc3QpICsgKGl4KSk7CisJaWYgKGxpbWl0ZXIpIHsKKwkJKnBmKysgPSAwOworCQkqcGYrKyA9IDA7CisJCSpwZisrID0gMHhGRjsKKwl9IGVsc2UgeworCQkqcGYrKyA9ICh2Yik7CisJCSpwZisrID0gKHZnKTsKKwkJKnBmKysgPSAodnIpOworCX0KK30KKworI2VuZGlmIC8qIHVzYnZpZGVvX2ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3ZpY2FtLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS92aWNhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTg1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS92aWNhbS5jCkBAIC0wLDAgKzEsMTQwOSBAQAorLyoKKyAqIFVTQiBWaUNhbSBXZWJDYW0gZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSm9lIEJ1cmtzIChqYnVya3NAd2F2aWNsZS5vcmcpLAorICogICAgICAgICAgICAgICAgICAgIENocmlzdG9waGVyIEwgQ2hlbmV5IChjY2hlbmV5QGNoZW5leS5jeCksCisgKiAgICAgICAgICAgICAgICAgICAgUGF2ZWwgTWFjaGVrIChwYXZlbEBzdXNlLmN6KSwKKyAqICAgICAgICAgICAgICAgICAgICBKb2huIFR5bmVyIChqdHluZXJAY3MudWNyLmVkdSksCisgKiAgICAgICAgICAgICAgICAgICAgTW9ucm9lIFdpbGxpYW1zIChtb25yb2VAcG9ib3guY29tKQorICoKKyAqIFN1cHBvcnRzIDNDT00gSG9tZUNvbm5lY3QgUEMgRGlnaXRhbCBXZWJDYW0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGJhc2VkIGhlYXZpbHkgb24gdGhlIENQaUEgd2ViY2FtIGRyaXZlciB3aGljaCB3YXMKKyAqIHdyaXR0ZW4gYnkgUGV0ZXIgUHJlZ2xlciwgU2NvdHQgSi4gQmVydGluIGFuZCBKb2hhbm5lcyBFcmRmZWx0CisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBjb2RlIHdlcmUgYWxzbyBjb3BpZWQgZnJvbSB1c2J2aWRlby5jCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gdGhlIHRoZSB3aG9sZSB0ZWFtIGF0IFNvdXJjZWZvcmdlIGZvciBoZWxwIG1ha2luZworICogdGhpcyBkcml2ZXIgYmVjb21lIGEgcmVhbGl0eS4gIE5vdGFibHk6CisgKiBBbmR5IEFybXN0cm9uZyB3aG8gcmV2ZXJzZSBlbmdpbmVlcmVkIHRoZSBjb2xvciBlbmNvZGluZyBhbmQKKyAqIFBhdmVsIE1hY2hlayBhbmQgQ2hyaXMgQ2hlbmV5IHdobyB3b3JrZWQgb24gcmV2ZXJzZSBlbmdpbmVlcmluZyB0aGUKKyAqICAgIGNhbWVyYSBjb250cm9scyBhbmQgd3JvdGUgdGhlIGZpcnN0IGdlbmVyYXRpb24gZHJpdmVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlICJ1c2J2aWRlby5oIgorCisvLyAjZGVmaW5lIFZJQ0FNX0RFQlVHCisKKyNpZmRlZiBWSUNBTV9ERUJVRworI2RlZmluZSBBREJHKGxpbmVubyxmbXQsYXJncy4uLikgcHJpbnRrKGZtdCwgamlmZmllcywgX19GVU5DVElPTl9fLCBsaW5lbm8sICMjYXJncykKKyNkZWZpbmUgREJHKGZtdCxhcmdzLi4uKSBBREJHKChfX0xJTkVfXyksS0VSTl9ERUJVRyBfX0ZJTEVfXyIoJWxkKTolcyAoJWQpOiJmbXQsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREJHKGZtbixhcmdzLi4uKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAgICAgICAgICAgIkpvZSBCdXJrcywgamJ1cmtzQHdhdmljbGUub3JnIgorI2RlZmluZSBEUklWRVJfREVTQyAgICAgICAgICAgICAiVmlDYW0gV2ViQ2FtIERyaXZlciIKKworLyogRGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB5b3VyIGRldmljZSAqLworI2RlZmluZSBVU0JfVklDQU1fVkVORE9SX0lECTB4MDRjMQorI2RlZmluZSBVU0JfVklDQU1fUFJPRFVDVF9JRAkweDAwOWQKKworI2RlZmluZSBWSUNBTV9CWVRFU19QRVJfUElYRUwgICAzCisjZGVmaW5lIFZJQ0FNX01BWF9SRUFEX1NJWkUgICAgICg1MTIqMjQyKzEyOCkKKyNkZWZpbmUgVklDQU1fTUFYX0ZSQU1FX1NJWkUgICAgKFZJQ0FNX0JZVEVTX1BFUl9QSVhFTCozMjAqMjQwKQorI2RlZmluZSBWSUNBTV9GUkFNRVMgICAgICAgICAgICAyCisKKyNkZWZpbmUgVklDQU1fSEVBREVSX1NJWkUgICAgICAgNjQKKworI2RlZmluZSBjbGFtcCggeCwgbCwgaCApICAgICAgICBtYXhfdCggX190eXBlb2ZfXyggeCApLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggbCApLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdCggX190eXBlb2ZfXyggeCApLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggaCApLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHggKSApICkKKworLyogTm90IHN1cmUgd2hhdCBhbGwgdGhlIGJ5dGVzIGluIHRoZXNlIGNoYXIKKyAqIGFycmF5cyBkbywgYnV0IHRoZXkncmUgbmVjZXNzYXJ5IHRvIG1ha2UKKyAqIHRoZSBjYW1lcmEgd29yay4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzZXR1cDFbXSA9IHsKKwkweEI2LCAweEMzLCAweDFGLCAweDAwLCAweDAyLCAweDY0LCAweEU3LCAweDY3LAorCTB4RkQsIDB4RkYsIDB4MEUsIDB4QzAsIDB4RTcsIDB4MDksIDB4REUsIDB4MDAsCisJMHg4RSwgMHgwMCwgMHhDMCwgMHgwOSwgMHg0MCwgMHgwMywgMHhDMCwgMHgxNywKKwkweDQ0LCAweDAzLCAweDRCLCAweEFGLCAweEMwLCAweDA3LCAweDAwLCAweDAwLAorCTB4NEIsIDB4QUYsIDB4OTcsIDB4Q0YsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNldHVwMltdID0geworCTB4QjYsIDB4QzMsIDB4MDMsIDB4MDAsIDB4MDMsIDB4NjQsIDB4MTgsIDB4MDAsCisJMHgwMCwgMHgwMAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXAzW10gPSB7CisJMHhCNiwgMHhDMywgMHgwMSwgMHgwMCwgMHgwNiwgMHg2NCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXA0W10gPSB7CisJMHhCNiwgMHhDMywgMHg4RiwgMHgwNiwgMHgwMiwgMHg2NCwgMHhFNywgMHgwNywKKwkweDAwLCAweDAwLCAweDA4LCAweEMwLCAweEU3LCAweDA3LCAweDAwLCAweDAwLAorCTB4M0UsIDB4QzAsIDB4RTcsIDB4MDcsIDB4NTQsIDB4MDEsIDB4QUEsIDB4MDAsCisJMHhFNywgMHgwNywgMHhDOCwgMHgwNSwgMHhCNiwgMHgwMCwgMHhFNywgMHgwNywKKwkweDQyLCAweDAxLCAweEQyLCAweDAwLCAweEU3LCAweDA3LCAweDdDLCAweDAwLAorCTB4MTYsIDB4MDAsIDB4RTcsIDB4MDcsIDB4NTYsIDB4MDAsIDB4MTgsIDB4MDAsCisJMHhFNywgMHgwNywgMHgwNiwgMHgwMCwgMHg5MiwgMHhDMCwgMHhFNywgMHgwNywKKwkweDAwLCAweDAwLCAweDFFLCAweEMwLCAweEU3LCAweDA3LCAweEZGLCAweEZGLAorCTB4MjIsIDB4QzAsIDB4RTcsIDB4MDcsIDB4MDQsIDB4MDAsIDB4MjQsIDB4QzAsCisJMHhFNywgMHgwNywgMHhFQywgMHgyNywgMHgyOCwgMHhDMCwgMHhFNywgMHgwNywKKwkweDE2LCAweDAxLCAweDhFLCAweDAwLCAweEU3LCAweDg3LCAweDAxLCAweDAwLAorCTB4MEUsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4RDcsIDB4MDksIDB4MDAsIDB4QzAsCisJMHhFNywgMHg3NywgMHgwMSwgMHgwMCwgMHg5MiwgMHhDMCwgMHgwOSwgMHhDMSwKKwkweEU3LCAweDA5LCAweEZFLCAweDA1LCAweDI0LCAweDAxLCAweEU3LCAweDA5LAorCTB4MDQsIDB4MDYsIDB4MjYsIDB4MDEsIDB4RTcsIDB4MDcsIDB4MDcsIDB4MDAsCisJMHg5MiwgMHhDMCwgMHhFNywgMHgwNSwgMHgwMCwgMHhDMCwgMHhDMCwgMHhERiwKKwkweDk3LCAweENGLCAweDE3LCAweDAwLCAweDU3LCAweDAwLCAweDE3LCAweDAyLAorCTB4RDcsIDB4MDksIDB4MDAsIDB4QzAsIDB4RTcsIDB4NzcsIDB4MDEsIDB4MDAsCisJMHg5MiwgMHhDMCwgMHgwQSwgMHhDMSwgMHhFNywgMHg1NywgMHhGRiwgMHhGRiwKKwkweEZBLCAweDA1LCAweDBELCAweEMwLCAweEU3LCAweDU3LCAweDAwLCAweDAwLAorCTB4RkEsIDB4MDUsIDB4MEYsIDB4QzAsIDB4OUYsIDB4QUYsIDB4QzYsIDB4MDAsCisJMHhFNywgMHgwNSwgMHgwMCwgMHhDMCwgMHhDOCwgMHgwNSwgMHhDMSwgMHgwNSwKKwkweEMwLCAweDA1LCAweEMwLCAweERGLCAweDk3LCAweENGLCAweDI3LCAweERBLAorCTB4RkEsIDB4MDUsIDB4RUYsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDYsCisJMHg3MywgMHhDRiwgMHg5RiwgMHhBRiwgMHg3OCwgMHgwMSwgMHg5RiwgMHhBRiwKKwkweDFBLCAweDAzLCAweDZFLCAweENGLCAweEU3LCAweDA5LCAweEZDLCAweDA1LAorCTB4MjQsIDB4MDEsIDB4RTcsIDB4MDksIDB4MDIsIDB4MDYsIDB4MjYsIDB4MDEsCisJMHhFNywgMHgwNywgMHgwNywgMHgwMCwgMHg5MiwgMHhDMCwgMHhFNywgMHgwOSwKKwkweEZDLCAweDA1LCAweEZFLCAweDA1LCAweEU3LCAweDA5LCAweDAyLCAweDA2LAorCTB4MDQsIDB4MDYsIDB4RTcsIDB4MDksIDB4MDAsIDB4MDYsIDB4RkMsIDB4MDUsCisJMHhFNywgMHgwOSwgMHhGRSwgMHgwNSwgMHgwMCwgMHgwNiwgMHgyNywgMHhEQSwKKwkweEZBLCAweDA1LCAweEU3LCAweDU3LCAweDAxLCAweDAwLCAweEZBLCAweDA1LAorCTB4MDIsIDB4Q0EsIDB4MDQsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4OUYsIDB4QUYsCisJMHg2NiwgMHgwNSwgMHg5NywgMHhDRiwgMHhFNywgMHgwNywgMHg0MCwgMHgwMCwKKwkweDAyLCAweDA2LCAweEM4LCAweDA5LCAweEZDLCAweDA1LCAweDlGLCAweEFGLAorCTB4REEsIDB4MDIsIDB4OTcsIDB4Q0YsIDB4Q0YsIDB4MTcsIDB4MDIsIDB4MDAsCisJMHhFRiwgMHg1NywgMHg4MSwgMHgwMCwgMHgwOSwgMHgwNiwgMHg5RiwgMHhBMCwKKwkweEI2LCAweDAxLCAweEVGLCAweDU3LCAweDgwLCAweDAwLCAweDA5LCAweDA2LAorCTB4OUYsIDB4QTAsIDB4NDAsIDB4MDIsIDB4RUYsIDB4NTcsIDB4MDEsIDB4MDAsCisJMHgwQiwgMHgwNiwgMHg5RiwgMHhBMCwgMHg0NiwgMHgwMywgMHhFNywgMHgwNywKKwkweDAxLCAweDAwLCAweDBBLCAweEMwLCAweDQ2LCAweEFGLCAweDQ3LCAweEFGLAorCTB4OUYsIDB4QUYsIDB4NDAsIDB4MDIsIDB4RTcsIDB4MDcsIDB4MkUsIDB4MDAsCisJMHgwQSwgMHhDMCwgMHhFRiwgMHg4NywgMHg4MCwgMHgwMCwgMHgwOSwgMHgwNiwKKwkweDk3LCAweENGLCAweDAwLCAweDBFLCAweDAxLCAweDAwLCAweEMwLCAweDU3LAorCTB4NTEsIDB4MDAsIDB4OUYsIDB4QzAsIDB4OUUsIDB4MDIsIDB4QzAsIDB4NTcsCisJMHg1MCwgMHgwMCwgMHgyMCwgMHhDMCwgMHhDMCwgMHg1NywgMHg1NSwgMHgwMCwKKwkweDEyLCAweEMwLCAweEMwLCAweDU3LCAweDU2LCAweDAwLCAweDlGLCAweEMwLAorCTB4NzIsIDB4MDIsIDB4OUYsIDB4Q0YsIDB4RDYsIDB4MDIsIDB4QzEsIDB4MEIsCisJMHgwOCwgMHgwNiwgMHgwMSwgMHhEMCwgMHg2RiwgMHg5MCwgMHgwOCwgMHgwNiwKKwkweEMwLCAweDA3LCAweDA4LCAweDAwLCAweEMxLCAweDBCLCAweDA4LCAweDA2LAorCTB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4OTcsIDB4Q0YsIDB4MkYsIDB4MEUsCisJMHgwMiwgMHgwMCwgMHgwOCwgMHgwNiwgMHhDMCwgMHgwNywgMHgwOCwgMHgwMCwKKwkweEMxLCAweDBCLCAweDA4LCAweDA2LCAweDlGLCAweEFGLCAweDI4LCAweDA1LAorCTB4OUYsIDB4Q0YsIDB4RDYsIDB4MDIsIDB4MkYsIDB4MEUsIDB4MDIsIDB4MDAsCisJMHgwOSwgMHgwNiwgMHhFRiwgMHg4NywgMHg4MCwgMHgwMCwgMHgwOSwgMHgwNiwKKwkweDlGLCAweENGLCAweEQ2LCAweDAyLCAweEVGLCAweDY3LCAweDdGLCAweEZGLAorCTB4MDksIDB4MDYsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RkQsIDB4MjIsIDB4QzAsCisJMHhFNywgMHg2NywgMHhFRiwgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywKKwkweDEwLCAweDAwLCAweDI4LCAweEMwLCAweDlGLCAweEFGLCAweEI4LCAweDA1LAorCTB4RTcsIDB4ODcsIDB4RTAsIDB4MjEsIDB4MjQsIDB4QzAsIDB4OUYsIDB4QUYsCisJMHhBOCwgMHgwNSwgMHhFNywgMHg4NywgMHgwOCwgMHgwMCwgMHgyNCwgMHhDMCwKKwkweEU3LCAweDY3LCAweERGLCAweEZGLCAweDI0LCAweEMwLCAweEM4LCAweDA3LAorCTB4MEEsIDB4MDAsIDB4QzAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4QzEsIDB4MDcsCisJMHgwMSwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHg5RiwgMHhBRiwKKwkweEI4LCAweDA1LCAweEMwLCAweDA3LCAweDlFLCAweDAwLCAweDlGLCAweEFGLAorCTB4NDQsIDB4MDUsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RkUsIDB4MjQsIDB4QzAsCisJMHhDMCwgMHgwOSwgMHgyMCwgMHhDMCwgMHhFNywgMHg4NywgMHgwMCwgMHgwMSwKKwkweDI0LCAweEMwLCAweEMwLCAweDc3LCAweDAwLCAweDAyLCAweDBGLCAweEMxLAorCTB4RTcsIDB4NjcsIDB4RjcsIDB4RkYsIDB4MjQsIDB4QzAsIDB4RTcsIDB4NjcsCisJMHhGNywgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywgMHgwOCwgMHgwMCwKKwkweDI0LCAweEMwLCAweDA4LCAweERBLCAweDVFLCAweEMxLCAweEVGLCAweDA3LAorCTB4ODAsIDB4MDAsIDB4MDksIDB4MDYsIDB4OTcsIDB4Q0YsIDB4RUYsIDB4MDcsCisJMHgwMSwgMHgwMCwgMHgwQSwgMHgwNiwgMHg5NywgMHhDRiwgMHhFRiwgMHgwNywKKwkweDAwLCAweDAwLCAweDBCLCAweDA2LCAweEVGLCAweDA3LCAweDAwLCAweDAwLAorCTB4MEEsIDB4MDYsIDB4RUYsIDB4NjcsIDB4N0YsIDB4RkYsIDB4MDksIDB4MDYsCisJMHhFRiwgMHgwNywgMHgwMCwgMHgwMCwgMHgwRCwgMHgwNiwgMHhFNywgMHg2NywKKwkweEVGLCAweEZGLCAweDI4LCAweEMwLCAweEU3LCAweDY3LCAweDE3LCAweEQ4LAorCTB4MjQsIDB4QzAsIDB4RTcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MUUsIDB4QzAsCisJMHhFNywgMHgwNywgMHhGRiwgMHhGRiwgMHgyMiwgMHhDMCwgMHg5NywgMHhDRiwKKwkweEM4LCAweDA3LCAweDBFLCAweDA2LCAweDlGLCAweEFGLCAweERBLCAweDAyLAorCTB4RTcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4RjIsIDB4MDUsIDB4RTcsIDB4MDcsCisJMHgxMCwgMHgwMCwgMHhGNiwgMHgwNSwgMHhFNywgMHgwNywgMHgwRSwgMHgwNiwKKwkweEY0LCAweDA1LCAweEU3LCAweDA3LCAweEQ2LCAweDAyLCAweEY4LCAweDA1LAorCTB4QzgsIDB4MDcsIDB4RjIsIDB4MDUsIDB4QzEsIDB4MDcsIDB4MDAsIDB4ODAsCisJMHg1MCwgMHhBRiwgMHg5NywgMHhDRiwgMHgyRiwgMHgwQywgMHgwMiwgMHgwMCwKKwkweDA3LCAweDA2LCAweDJGLCAweDBDLCAweDA0LCAweDAwLCAweDA2LCAweDA2LAorCTB4RTcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4RjIsIDB4MDUsIDB4RTcsIDB4MDcsCisJMHgxMCwgMHgwMCwgMHhGNiwgMHgwNSwgMHhFNywgMHgwNywgMHhFMiwgMHgwNSwKKwkweEY0LCAweDA1LCAweEU3LCAweDA3LCAweENFLCAweDAyLCAweEY4LCAweDA1LAorCTB4QzgsIDB4MDcsIDB4RjIsIDB4MDUsIDB4QzEsIDB4MDcsIDB4MDAsIDB4ODAsCisJMHg1MSwgMHhBRiwgMHg5NywgMHhDRiwgMHg5RiwgMHhBRiwgMHg2NiwgMHgwNCwKKwkweDlGLCAweEFGLCAweDFBLCAweDAzLCAweDU5LCAweEFGLCAweDk3LCAweENGLAorCTB4QzAsIDB4MDcsIDB4MEUsIDB4MDAsIDB4QzEsIDB4MEIsIDB4MEMsIDB4MDYsCisJMHg0MSwgMHhEMSwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywKKwkweDNDLCAweDAwLCAweDlGLCAweEFGLCAweDQ0LCAweDA1LCAweDY4LCAweDAwLAorCTB4QzAsIDB4MDcsIDB4M0IsIDB4MDAsIDB4OUYsIDB4QUYsIDB4NDQsIDB4MDUsCisJMHg2RiwgMHgwMCwgMHgwQywgMHgwNiwgMHg2OCwgMHgwMCwgMHhFMCwgMHgwNywKKwkweDA0LCAweDAxLCAweEU4LCAweDBCLCAweDBBLCAweDA2LCAweEU4LCAweDA3LAorCTB4MDAsIDB4MDAsIDB4RTAsIDB4MDcsIDB4MDAsIDB4MDIsIDB4RTAsIDB4MDcsCisJMHhFQywgMHgwMSwgMHhFMCwgMHgwNywgMHhGQywgMHhGRiwgMHg5NywgMHhDRiwKKwkweEU3LCAweDA3LCAweEZGLCAweEZGLCAweEZBLCAweDA1LCAweEVGLCAweDA3LAorCTB4MDAsIDB4MDAsIDB4MEIsIDB4MDYsIDB4RTcsIDB4MDcsIDB4MEUsIDB4MDYsCisJMHgyNCwgMHgwMSwgMHhFNywgMHgwNywgMHgwRSwgMHgwNiwgMHhGRSwgMHgwNSwKKwkweEU3LCAweDA3LCAweDQwLCAweDAwLCAweDI2LCAweDAxLCAweEU3LCAweDA3LAorCTB4NDAsIDB4MDAsIDB4MDQsIDB4MDYsIDB4RTcsIDB4MDcsIDB4MDcsIDB4MDAsCisJMHg5MiwgMHhDMCwgMHg5NywgMHhDRiwgMHhFRiwgMHgwNywgMHgwMiwgMHgwMCwKKwkweDBCLCAweDA2LCAweDlGLCAweEFGLCAweDc4LCAweDAxLCAweEVGLCAweDc3LAorCTB4ODAsIDB4MDAsIDB4MDcsIDB4MDYsIDB4OUYsIDB4QzAsIDB4MTQsIDB4MDQsCisJMHhFRiwgMHg3NywgMHgwMSwgMHgwMCwgMHgwNywgMHgwNiwgMHgzNywgMHhDMCwKKwkweEVGLCAweDc3LCAweDAxLCAweDAwLCAweDBELCAweDA2LCAweDBGLCAweEMxLAorCTB4RUYsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MEQsIDB4MDYsIDB4QzAsIDB4MDcsCisJMHgwMiwgMHgwMCwgMHhDMSwgMHgwNywgMHgzMCwgMHgwMCwgMHg5RiwgMHhBRiwKKwkweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDAxLCAweDAwLCAweEMxLCAweDA3LAorCTB4MDIsIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzgsIDB4MDcsCisJMHhGRiwgMHg0RiwgMHg5RiwgMHhBRiwgMHhBOCwgMHgwNSwgMHhDMCwgMHgwNywKKwkweDM4LCAweDAwLCAweDlGLCAweEFGLCAweDQ0LCAweDA1LCAweEMxLCAweDc3LAorCTB4MDMsIDB4MDAsIDB4MDIsIDB4QzEsIDB4MDgsIDB4REEsIDB4NzUsIDB4QzEsCisJMHhDMSwgMHg3NywgMHgwMSwgMHgwMCwgMHgwQSwgMHhDMSwgMHhDMCwgMHgwNywKKwkweDAxLCAweDAwLCAweEMxLCAweDA3LCAweDAyLCAweDAwLCAweDlGLCAweEFGLAorCTB4MjgsIDB4MDUsIDB4RUYsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MDYsIDB4MDYsCisJMHgyQywgMHhDRiwgMHhDMCwgMHgwNywgMHgwMSwgMHgwMCwgMHhDMSwgMHgwNywKKwkweDA0LCAweDAwLCAweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEVGLCAweDA3LAorCTB4MDAsIDB4MDAsIDB4MDYsIDB4MDYsIDB4MjIsIDB4Q0YsIDB4RUYsIDB4MDcsCisJMHgwMCwgMHgwMCwgMHgwRCwgMHgwNiwgMHhFRiwgMHg1NywgMHgwMSwgMHgwMCwKKwkweDA2LCAweDA2LCAweDFCLCAweEMwLCAweEMwLCAweDA3LCAweDAxLCAweDAwLAorCTB4QzEsIDB4MDcsIDB4MDEsIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsCisJMHhDMCwgMHgwNywgMHgwMiwgMHgwMCwgMHhDMSwgMHgwNywgMHgzMCwgMHgwMCwKKwkweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEM4LCAweDA3LCAweEZGLCAweDRGLAorCTB4OUYsIDB4QUYsIDB4QTgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4MzgsIDB4MDAsCisJMHg5RiwgMHhBRiwgMHg0NCwgMHgwNSwgMHhDMSwgMHg2NywgMHgwMywgMHgwMCwKKwkweEMxLCAweDU3LCAweDAzLCAweDAwLCAweDAyLCAweEMwLCAweDA4LCAweERBLAorCTB4NzMsIDB4QzEsIDB4QzAsIDB4MDcsIDB4MDIsIDB4MDAsIDB4QzEsIDB4MDcsCisJMHgxMiwgMHgwMCwgMHhFRiwgMHg1NywgMHgwMCwgMHgwMCwgMHgwNiwgMHgwNiwKKwkweDAyLCAweEMwLCAweEMxLCAweDA3LCAweDIzLCAweDAwLCAweDlGLCAweEFGLAorCTB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4MTQsIDB4MDAsIDB4QzEsIDB4MEIsCisJMHhFQSwgMHgwNSwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywKKwkweDNFLCAweDAwLCAweDlGLCAweEFGLCAweDBBLCAweDA1LCAweEU3LCAweDA5LAorCTB4RTQsIDB4MDUsIDB4RkEsIDB4MDUsIDB4MjcsIDB4RDgsIDB4RkEsIDB4MDUsCisJMHhFNywgMHgwNywgMHgwRSwgMHgwNiwgMHhGQywgMHgwNSwgMHhFNywgMHgwNywKKwkweDRFLCAweDA2LCAweDAwLCAweDA2LCAweEU3LCAweDA3LCAweDQwLCAweDAwLAorCTB4MDIsIDB4MDYsIDB4OUYsIDB4QUYsIDB4NjYsIDB4MDUsIDB4OUYsIDB4QUYsCisJMHhDNiwgMHgwMCwgMHg5NywgMHhDRiwgMHhDMSwgMHgwQiwgMHhFMiwgMHgwNSwKKwkweDQxLCAweEQwLCAweDAxLCAweEQyLCAweEMxLCAweDE3LCAweDIzLCAweDAwLAorCTB4OUYsIDB4QUYsIDB4REMsIDB4MDQsIDB4QzAsIDB4MDcsIDB4MDQsIDB4MDAsCisJMHhDMSwgMHgwQiwgMHhFMywgMHgwNSwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKKwkweEMwLCAweDA3LCAweDA2LCAweDAwLCAweEMxLCAweDA5LCAweEU2LCAweDA1LAorCTB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4MDcsIDB4MDAsCisJMHhDMSwgMHgwOSwgMHhFNiwgMHgwNSwgMHhDMSwgMHhEMSwgMHg5RiwgMHhBRiwKKwkweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDBCLCAweDAwLCAweEMxLCAweDA5LAorCTB4RTgsIDB4MDUsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsCisJMHgwQywgMHgwMCwgMHhDMSwgMHgwOSwgMHhFOCwgMHgwNSwgMHhDMSwgMHhEMSwKKwkweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDBELCAweDAwLAorCTB4QzEsIDB4MDcsIDB4MDksIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsCisJMHhDMCwgMHgwNywgMHgwMywgMHgwMCwgMHhDMSwgMHgwNywgMHgzMiwgMHgwMCwKKwkweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEMwLCAweDA3LCAweDBGLCAweDAwLAorCTB4QzEsIDB4MDcsIDB4MDAsIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsCisJMHg5NywgMHhDRiwgMHhFNywgMHg2NywgMHhGRiwgMHhEOSwgMHgyNCwgMHhDMCwKKwkweEM4LCAweDA3LCAweDBBLCAweDAwLCAweDQwLCAweDAwLCAweEMwLCAweDY3LAorCTB4MDAsIDB4MDIsIDB4MjcsIDB4ODAsIDB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsCisJMHgwMCwgMHgwNCwgMHgyNCwgMHhDMCwgMHhFNywgMHg2NywgMHhGRiwgMHhGOSwKKwkweDI0LCAweEMwLCAweDAxLCAweEQyLCAweDA4LCAweERBLCAweDcyLCAweEMxLAorCTB4RTcsIDB4ODcsIDB4MDAsIDB4MjAsIDB4MjQsIDB4QzAsIDB4OTcsIDB4Q0YsCisJMHgyNywgMHgwMCwgMHgxRSwgMHhDMCwgMHhFNywgMHg4NywgMHhGRiwgMHgwMCwKKwkweDIyLCAweEMwLCAweEU3LCAweDY3LCAweDdGLCAweEZGLCAweDI0LCAweEMwLAorCTB4RTcsIDB4ODcsIDB4ODAsIDB4MDAsIDB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsCisJMHg4MCwgMHgwMCwgMHgyNCwgMHhDMCwgMHg5NywgMHhDRiwgMHg5RiwgMHhBRiwKKwkweDBBLCAweDA1LCAweDY3LCAweDAwLCAweDFFLCAweEMwLCAweEU3LCAweDY3LAorCTB4QkYsIDB4RkYsIDB4MjQsIDB4QzAsIDB4RTcsIDB4ODcsIDB4NDAsIDB4MDAsCisJMHgyNCwgMHhDMCwgMHhFNywgMHg4NywgMHg0MCwgMHgwMCwgMHgyNCwgMHhDMCwKKwkweDk3LCAweENGLCAweDlGLCAweEFGLCAweDBBLCAweDA1LCAweEU3LCAweDY3LAorCTB4MDAsIDB4RkYsIDB4MjIsIDB4QzAsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RkUsCisJMHgyNCwgMHhDMCwgMHhFNywgMHg2NywgMHhGRiwgMHhGRSwgMHgyNCwgMHhDMCwKKwkweEMxLCAweDA5LCAweDIwLCAweEMwLCAweEU3LCAweDg3LCAweDAwLCAweDAxLAorCTB4MjQsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4QzAsIDB4MDcsIDB4NDAsIDB4MDAsCisJMHhDOCwgMHgwOSwgMHhGQywgMHgwNSwgMHhFNywgMHg2NywgMHgwMCwgMHhGRiwKKwkweDIyLCAweEMwLCAweEU3LCAweDY3LCAweEZGLCAweEZFLCAweDI0LCAweEMwLAorCTB4RTcsIDB4NjcsIDB4QkYsIDB4RkYsIDB4MjQsIDB4QzAsIDB4RTcsIDB4NjcsCisJMHhCRiwgMHhGRiwgMHgyNCwgMHhDMCwgMHgwMCwgMHhEQSwgMHhFOCwgMHgwOSwKKwkweDIwLCAweEMwLCAweEU3LCAweDg3LCAweDQwLCAweDAwLCAweDI0LCAweEMwLAorCTB4RTcsIDB4ODcsIDB4NDAsIDB4MDAsIDB4MjQsIDB4QzAsIDB4MDAsIDB4REEsCisJMHhFOCwgMHgwOSwgMHgyMCwgMHhDMCwgMHg2RCwgMHhDMSwgMHhFNywgMHg4NywKKwkweDAwLCAweDAxLCAweDI0LCAweEMwLCAweDk3LCAweENGLCAweEU3LCAweDA3LAorCTB4MzIsIDB4MDAsIDB4MTIsIDB4QzAsIDB4RTcsIDB4NzcsIDB4MDAsIDB4ODAsCisJMHgxMiwgMHhDMCwgMHg3QywgMHhDMCwgMHg5NywgMHhDRiwgMHhFNywgMHgwNywKKwkweDIwLCAweDRFLCAweDEyLCAweEMwLCAweEU3LCAweDc3LCAweDAwLCAweDgwLAorCTB4MTIsIDB4QzAsIDB4N0MsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4MDksIDB4MDIsCisJMHgxOSwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHg4MCwgMHg5NiwgMHgwOSwKKwkweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDcsIDB4MDUsIDB4ODEsIDB4MDIsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNldHVwNVtdID0geworCTB4QjYsIDB4QzMsIDB4MkYsIDB4MDEsIDB4MDMsIDB4NjQsIDB4MEUsIDB4MDAsCisJMHgxNCwgMHgwMCwgMHgxQSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgyNiwgMHgwMCwKKwkweDRBLCAweDAwLCAweDY0LCAweDAwLCAweDZBLCAweDAwLCAweDkyLCAweDAwLAorCTB4OUEsIDB4MDAsIDB4QTAsIDB4MDAsIDB4QjIsIDB4MDAsIDB4QjgsIDB4MDAsCisJMHhCRSwgMHgwMCwgMHhDMiwgMHgwMCwgMHhDOCwgMHgwMCwgMHhDRSwgMHgwMCwKKwkweERDLCAweDAwLCAweERBLCAweDAwLCAweEUyLCAweDAwLCAweEUwLCAweDAwLAorCTB4RTgsIDB4MDAsIDB4RTYsIDB4MDAsIDB4RUUsIDB4MDAsIDB4RUMsIDB4MDAsCisJMHhGMiwgMHgwMCwgMHhGOCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwQSwgMHgwMSwKKwkweDBFLCAweDAxLCAweDEyLCAweDAxLCAweDFFLCAweDAxLCAweDIyLCAweDAxLAorCTB4MjgsIDB4MDEsIDB4MkMsIDB4MDEsIDB4MzIsIDB4MDEsIDB4MzYsIDB4MDEsCisJMHg0NCwgMHgwMSwgMHg1MCwgMHgwMSwgMHg1RSwgMHgwMSwgMHg3MiwgMHgwMSwKKwkweDc2LCAweDAxLCAweDdBLCAweDAxLCAweDgwLCAweDAxLCAweDg4LCAweDAxLAorCTB4OEMsIDB4MDEsIDB4OTQsIDB4MDEsIDB4OUMsIDB4MDEsIDB4QTAsIDB4MDEsCisJMHhBNCwgMHgwMSwgMHhBQSwgMHgwMSwgMHhCMCwgMHgwMSwgMHhCNCwgMHgwMSwKKwkweEJBLCAweDAxLCAweEQwLCAweDAxLCAweERBLCAweDAxLCAweEY2LCAweDAxLAorCTB4RkEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MzQsIDB4MDIsIDB4M0MsIDB4MDIsCisJMHg0NCwgMHgwMiwgMHg0QSwgMHgwMiwgMHg1MCwgMHgwMiwgMHg1NiwgMHgwMiwKKwkweDc0LCAweDAyLCAweDc4LCAweDAyLCAweDdFLCAweDAyLCAweDg0LCAweDAyLAorCTB4OEEsIDB4MDIsIDB4ODgsIDB4MDIsIDB4OTAsIDB4MDIsIDB4OEUsIDB4MDIsCisJMHg5NCwgMHgwMiwgMHhBMiwgMHgwMiwgMHhBOCwgMHgwMiwgMHhBRSwgMHgwMiwKKwkweEI0LCAweDAyLCAweEJBLCAweDAyLCAweEI4LCAweDAyLCAweEMwLCAweDAyLAorCTB4QkUsIDB4MDIsIDB4QzQsIDB4MDIsIDB4RDAsIDB4MDIsIDB4RDQsIDB4MDIsCisJMHhFMCwgMHgwMiwgMHhFNiwgMHgwMiwgMHhFRSwgMHgwMiwgMHhGOCwgMHgwMiwKKwkweEZDLCAweDAyLCAweDA2LCAweDAzLCAweDFFLCAweDAzLCAweDI0LCAweDAzLAorCTB4MjgsIDB4MDMsIDB4MzAsIDB4MDMsIDB4MkUsIDB4MDMsIDB4M0MsIDB4MDMsCisJMHg0QSwgMHgwMywgMHg0RSwgMHgwMywgMHg1NCwgMHgwMywgMHg1OCwgMHgwMywKKwkweDVFLCAweDAzLCAweDY2LCAweDAzLCAweDZFLCAweDAzLCAweDdBLCAweDAzLAorCTB4ODYsIDB4MDMsIDB4OEUsIDB4MDMsIDB4OTYsIDB4MDMsIDB4QjIsIDB4MDMsCisJMHhCOCwgMHgwMywgMHhDNiwgMHgwMywgMHhDQywgMHgwMywgMHhENCwgMHgwMywKKwkweERBLCAweDAzLCAweEU4LCAweDAzLCAweEY0LCAweDAzLCAweEZDLCAweDAzLAorCTB4MDQsIDB4MDQsIDB4MjAsIDB4MDQsIDB4MkEsIDB4MDQsIDB4MzIsIDB4MDQsCisJMHgzNiwgMHgwNCwgMHgzRSwgMHgwNCwgMHg0NCwgMHgwNCwgMHg0MiwgMHgwNCwKKwkweDQ4LCAweDA0LCAweDRFLCAweDA0LCAweDRDLCAweDA0LCAweDU0LCAweDA0LAorCTB4NTIsIDB4MDQsIDB4NUEsIDB4MDQsIDB4NUUsIDB4MDQsIDB4NjIsIDB4MDQsCisJMHg2OCwgMHgwNCwgMHg3NCwgMHgwNCwgMHg3QywgMHgwNCwgMHg4MCwgMHgwNCwKKwkweDg4LCAweDA0LCAweDhDLCAweDA0LCAweDk0LCAweDA0LCAweDlBLCAweDA0LAorCTB4QTIsIDB4MDQsIDB4QTYsIDB4MDQsIDB4QUUsIDB4MDQsIDB4QjQsIDB4MDQsCisJMHhDMCwgMHgwNCwgMHhDQywgMHgwNCwgMHhEOCwgMHgwNCwgMHgyQSwgMHgwNSwKKwkweDQ2LCAweDA1LCAweDZDLCAweDA1LCAweDAwLCAweDAwCit9OworCisvKiBydm1hbGxvYyAvIHJ2ZnJlZSBjb3BpZWQgZnJvbSB1c2J2aWRlby5jCisgKgorICogTm90IHN1cmUgd2h5IHRoZXNlIGFyZSBub3QgeWV0IG5vbi1zdGF0aWNzIHdoaWNoIEkgY2FuIHJlZmVyZW5jZSB0aHJvdWdoCisgKiB1c2J2aWRlby5oIHRoZSBzYW1lIGFzIGl0IGlzIGluIDIuNC4yMC4gIEkgYmV0IHRoaXMgd2lsbCBnZXQgZml4ZWQgc29tZXRpbWUKKyAqIGluIHRoZSBmdXR1cmUuCisgKiAKKyovCitzdGF0aWMgdm9pZCAqcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXZvaWQgKm1lbTsKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCW1lbSA9IHZtYWxsb2NfMzIoc2l6ZSk7CisJaWYgKCFtZW0pCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7IC8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZCBydmZyZWUodm9pZCAqbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBhZHI7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisJdmZyZWUobWVtKTsKK30KKworc3RydWN0IHZpY2FtX2NhbWVyYSB7CisJdTE2IHNodXR0ZXJfc3BlZWQ7CS8vIGNhcHR1cmUgc2h1dHRlciBzcGVlZAorCXUxNiBnYWluOwkJLy8gY2FwdHVyZSBnYWluCisKKwl1OCAqcmF3X2ltYWdlOwkJLy8gcmF3IGRhdGEgY2FwdHVyZWQgZnJvbSB0aGUgY2FtZXJhCisJdTggKmZyYW1lYnVmOwkJLy8gcHJvY2Vzc2VkIGRhdGEgaW4gUkdCMjQgZm9ybWF0CisJdTggKmNudHJsYnVmOwkJLy8gYXJlYSB1c2VkIHRvIHNlbmQgY29udHJvbCBtc2dzCisKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CS8vIHY0bCB2aWRlbyBkZXZpY2UKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsJLy8gdXNiIGRldmljZQorCisJLyogZ3VhcmQgYWdhaW5zdCBzaW11bHRhbmVvdXMgYWNjZXNzZXMgdG8gdGhlIGNhbWVyYSAqLworCXN0cnVjdCBzZW1hcGhvcmUgY2FtX2xvY2s7CisKKwlpbnQgaXNfaW5pdGlhbGl6ZWQ7CisJdTggb3Blbl9jb3VudDsKKwl1OCBidWxrRW5kcG9pbnQ7CisJaW50IG5lZWRzRHVtbXlSZWFkOworCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fUFJPQ19GUykKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGlyOworI2VuZGlmCisKK307CisKK3N0YXRpYyBpbnQgdmljYW1fcHJvYmUoIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgdmljYW1fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitzdGF0aWMgdm9pZCByZWFkX2ZyYW1lKHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lbnVtKTsKK3N0YXRpYyB2b2lkIHZpY2FtX2RlY29kZV9jb2xvcihjb25zdCB1OCAqLCB1OCAqKTsKKworc3RhdGljIGludCBfX3NlbmRfY29udHJvbF9tc2coc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtLAorCQkJICAgICAgdTggcmVxdWVzdCwKKwkJCSAgICAgIHUxNiB2YWx1ZSwKKwkJCSAgICAgIHUxNiBpbmRleCwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmNwLAorCQkJICAgICAgdTE2IHNpemUpCit7CisJaW50IHN0YXR1czsKKworCS8qIGNwIG11c3QgYmUgbWVtb3J5IHRoYXQgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IGttYWxsb2MgKi8KKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhjYW0tPnVkZXYsCisJCQkJIHVzYl9zbmRjdHJscGlwZShjYW0tPnVkZXYsIDApLAorCQkJCSByZXF1ZXN0LAorCQkJCSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkJIFVTQl9SRUNJUF9ERVZJQ0UsIHZhbHVlLCBpbmRleCwKKwkJCQkgY3AsIHNpemUsIDEwMDApOworCisJc3RhdHVzID0gbWluKHN0YXR1cywgMCk7CisKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgc2VuZGluZyBjb250cm9sIG1lc3NhZ2UsIGVycm9yICVkLlxuIiwKKwkJICAgICAgIHN0YXR1cyk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBzZW5kX2NvbnRyb2xfbXNnKHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSwKKwkJCSAgICB1OCByZXF1ZXN0LAorCQkJICAgIHUxNiB2YWx1ZSwKKwkJCSAgICB1MTYgaW5kZXgsCisJCQkgICAgdW5zaWduZWQgY2hhciAqY3AsCisJCQkgICAgdTE2IHNpemUpCit7CisJaW50IHN0YXR1cyA9IC1FTk9ERVY7CisJZG93bigmY2FtLT5jYW1fbG9jayk7CisJaWYgKGNhbS0+dWRldikgeworCQlzdGF0dXMgPSBfX3NlbmRfY29udHJvbF9tc2coY2FtLCByZXF1ZXN0LCB2YWx1ZSwKKwkJCQkJICAgIGluZGV4LCBjcCwgc2l6ZSk7CisJfQorCXVwKCZjYW0tPmNhbV9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorc3RhdGljIGludAoraW5pdGlhbGl6ZV9jYW1lcmEoc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtKQoreworCWNvbnN0IHN0cnVjdCB7CisJCXU4ICpkYXRhOworCQl1MzIgc2l6ZTsKKwl9IGZpcm13YXJlW10gPSB7CisJCXsgLmRhdGEgPSBzZXR1cDEsIC5zaXplID0gc2l6ZW9mKHNldHVwMSkgfSwKKwkJeyAuZGF0YSA9IHNldHVwMiwgLnNpemUgPSBzaXplb2Yoc2V0dXAyKSB9LAorCQl7IC5kYXRhID0gc2V0dXAzLCAuc2l6ZSA9IHNpemVvZihzZXR1cDMpIH0sCisJCXsgLmRhdGEgPSBzZXR1cDQsIC5zaXplID0gc2l6ZW9mKHNldHVwNCkgfSwKKwkJeyAuZGF0YSA9IHNldHVwNSwgLnNpemUgPSBzaXplb2Yoc2V0dXA1KSB9LAorCQl7IC5kYXRhID0gc2V0dXAzLCAuc2l6ZSA9IHNpemVvZihzZXR1cDMpIH0sCisJCXsgLmRhdGEgPSBOVUxMLCAuc2l6ZSA9IDAgfQorCX07CisKKwlpbnQgZXJyLCBpOworCisJZm9yIChpID0gMCwgZXJyID0gMDsgZmlybXdhcmVbaV0uZGF0YSAmJiAhZXJyOyBpKyspIHsKKwkJbWVtY3B5KGNhbS0+Y250cmxidWYsIGZpcm13YXJlW2ldLmRhdGEsIGZpcm13YXJlW2ldLnNpemUpOworCisJCWVyciA9IHNlbmRfY29udHJvbF9tc2coY2FtLCAweGZmLCAwLCAwLAorCQkJCSAgICAgICBjYW0tPmNudHJsYnVmLCBmaXJtd2FyZVtpXS5zaXplKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitzZXRfY2FtZXJhX3Bvd2VyKHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSwgaW50IHN0YXRlKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoKHN0YXR1cyA9IHNlbmRfY29udHJvbF9tc2coY2FtLCAweDUwLCBzdGF0ZSwgMCwgTlVMTCwgMCkpIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChzdGF0ZSkgeworCQlzZW5kX2NvbnRyb2xfbXNnKGNhbSwgMHg1NSwgMSwgMCwgTlVMTCwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ZpY2FtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgaW9jdGxuciwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKnVzZXJfYXJnID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmICghY2FtKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaCAoaW9jdGxucikgeworCQkvKiBxdWVyeSBjYXBhYmlsaXRpZXMgKi8KKwljYXNlIFZJRElPQ0dDQVA6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IGI7CisKKwkJCURCRygiVklESU9DR0NBUFxuIik7CisJCQltZW1zZXQoJmIsIDAsIHNpemVvZihiKSk7CisJCQlzdHJjcHkoYi5uYW1lLCAiVmlDYW0tYmFzZWQgQ2FtZXJhIik7CisJCQliLnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFOworCQkJYi5jaGFubmVscyA9IDE7CisJCQliLmF1ZGlvcyA9IDA7CisJCQliLm1heHdpZHRoID0gMzIwOwkvKiBWSURFT1NJWkVfQ0lGICovCisJCQliLm1heGhlaWdodCA9IDI0MDsKKwkJCWIubWlud2lkdGggPSAzMjA7CS8qIFZJREVPU0laRV80OF80OCAqLworCQkJYi5taW5oZWlnaHQgPSAyNDA7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZiLCBzaXplb2YoYikpKQorCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisKKwkJCWJyZWFrOworCQl9CisJCS8qIGdldC9zZXQgdmlkZW8gc291cmNlIC0gd2UgYXJlIGEgY2FtZXJhIGFuZCBub3RoaW5nIGVsc2UgKi8KKwljYXNlIFZJRElPQ0dDSEFOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCB2OworCisJCQlEQkcoIlZJRElPQ0dDSEFOXG4iKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgdXNlcl9hcmcsIHNpemVvZih2KSkpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHYuY2hhbm5lbCAhPSAwKSB7CisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJdi5jaGFubmVsID0gMDsKKwkJCXN0cmNweSh2Lm5hbWUsICJDYW1lcmEiKTsKKwkJCXYudHVuZXJzID0gMDsKKwkJCXYuZmxhZ3MgPSAwOworCQkJdi50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCQl2Lm5vcm0gPSAwOworCisJCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAmdiwgc2l6ZW9mKHYpKSkKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgVklESU9DU0NIQU46CisJCXsKKwkJCWludCB2OworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIHVzZXJfYXJnLCBzaXplb2YodikpKQorCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQlEQkcoIlZJRElPQ1NDSEFOICVkXG4iLCB2KTsKKworCQkJaWYgKHJldHZhbCA9PSAwICYmIHYgIT0gMCkKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCisJCQlicmVhazsKKwkJfQorCisJCS8qIGltYWdlIHByb3BlcnRpZXMgKi8KKwljYXNlIFZJRElPQ0dQSUNUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSB2cDsKKwkJCURCRygiVklESU9DR1BJQ1RcbiIpOworCQkJbWVtc2V0KCZ2cCwgMCwgc2l6ZW9mIChzdHJ1Y3QgdmlkZW9fcGljdHVyZSkpOworCQkJdnAuYnJpZ2h0bmVzcyA9IGNhbS0+Z2FpbiA8PCA4OworCQkJdnAuZGVwdGggPSAyNDsKKwkJCXZwLnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JHQjI0OworCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJnZwLCBzaXplb2YgKHN0cnVjdCB2aWRlb19waWN0dXJlKSkpCisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIFZJRElPQ1NQSUNUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSB2cDsKKwkJCQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2cCwgdXNlcl9hcmcsIHNpemVvZih2cCkpKSB7CisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJREJHKCJWSURJT0NTUElDVCBkZXB0aCA9ICVkLCBwYWwgPSAlZFxuIiwgdnAuZGVwdGgsCisJCQkgICAgdnAucGFsZXR0ZSk7CisKKwkJCWNhbS0+Z2FpbiA9IHZwLmJyaWdodG5lc3MgPj4gODsKKworCQkJaWYgKHZwLmRlcHRoICE9IDI0CisJCQkgICAgfHwgdnAucGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JHQjI0KQorCQkJCXJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLyogZ2V0L3NldCBjYXB0dXJlIHdpbmRvdyAqLworCWNhc2UgVklESU9DR1dJTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX3dpbmRvdyB2dzsKKwkJCXZ3LnggPSAwOworCQkJdncueSA9IDA7CisJCQl2dy53aWR0aCA9IDMyMDsKKwkJCXZ3LmhlaWdodCA9IDI0MDsKKwkJCXZ3LmNocm9tYWtleSA9IDA7CisJCQl2dy5mbGFncyA9IDA7CisJCQl2dy5jbGlwcyA9IE5VTEw7CisJCQl2dy5jbGlwY291bnQgPSAwOworCisJCQlEQkcoIlZJRElPQ0dXSU5cbiIpOworCisJCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAodm9pZCAqKSZ2dywgc2l6ZW9mKHZ3KSkpCisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKworCQkJLy8gSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGRlYWwgd2l0aCBhIGNhcHR1cmUgd2luZG93IGlzLCBpdCBpcyB2ZXJ5IHBvb3JseSBkZXNjcmliZWQKKwkJCS8vIGluIHRoZSBkb2MuICBTbyBJIHdvbid0IHN1cHBvcnQgaXQgbm93LgorCQkJYnJlYWs7CisJCX0KKworCWNhc2UgVklESU9DU1dJTjoKKwkJeworCisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93IHZ3OworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnZ3LCB1c2VyX2FyZywgc2l6ZW9mKHZ3KSkpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCisJCQlEQkcoIlZJRElPQ1NXSU4gJWQgeCAlZFxuIiwgdncud2lkdGgsIHZ3LmhlaWdodCk7CisJCQkKKwkJCWlmICggdncud2lkdGggIT0gMzIwIHx8IHZ3LmhlaWdodCAhPSAyNDAgKQorCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLyogbW1hcCBpbnRlcmZhY2UgKi8KKwljYXNlIFZJRElPQ0dNQlVGOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiB2bTsKKwkJCWludCBpOworCisJCQlEQkcoIlZJRElPQ0dNQlVGXG4iKTsKKwkJCW1lbXNldCgmdm0sIDAsIHNpemVvZiAodm0pKTsKKwkJCXZtLnNpemUgPQorCQkJICAgIFZJQ0FNX01BWF9GUkFNRV9TSVpFICogVklDQU1fRlJBTUVTOworCQkJdm0uZnJhbWVzID0gVklDQU1fRlJBTUVTOworCQkJZm9yIChpID0gMDsgaSA8IFZJQ0FNX0ZSQU1FUzsgaSsrKQorCQkJCXZtLm9mZnNldHNbaV0gPSBWSUNBTV9NQVhfRlJBTUVfU0laRSAqIGk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICh2b2lkICopJnZtLCBzaXplb2Yodm0pKSkKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBWSURJT0NNQ0FQVFVSRToKKwkJeworCQkJc3RydWN0IHZpZGVvX21tYXAgdm07CisJCQkvLyBpbnQgdmlkZW9fc2l6ZTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJnZtLCB1c2VyX2FyZywgc2l6ZW9mKHZtKSkpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCisJCQlEQkcoIlZJRElPQ01DQVBUVVJFIGZyYW1lPSVkLCBoZWlnaHQ9JWQsIHdpZHRoPSVkLCBmb3JtYXQ9JWQuXG4iLHZtLmZyYW1lLHZtLndpZHRoLHZtLmhlaWdodCx2bS5mb3JtYXQpOworCisJCQlpZiAoIHZtLmZyYW1lID49IFZJQ0FNX0ZSQU1FUyB8fCB2bS5mb3JtYXQgIT0gVklERU9fUEFMRVRURV9SR0IyNCApCisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKworCQkJLy8gaW4gdGhlb3J5IHJpZ2h0IGhlcmUgd2UnZCBzdGFydCB0aGUgaW1hZ2UgY2FwdHVyaW5nCisJCQkvLyAoZmlsbCBpbiBhIGJ1bGsgdXJiIGFuZCBzdWJtaXQgaXQgYXN5bmNocm9ub3VzbHkpCisJCQkvLworCQkJLy8gSW5zdGVhZCB3ZSdyZSBnb2luZyB0byBkbyBhIHRvdGFsIGhhY2sgam9iIGZvciBub3cgYW5kCisJCQkvLyByZXRyaWV2ZSB0aGUgZnJhbWUgaW4gVklESU9DU1lOQworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBWSURJT0NTWU5DOgorCQl7CisJCQlpbnQgZnJhbWU7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZmcmFtZSwgdXNlcl9hcmcsIHNpemVvZihpbnQpKSkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlEQkcoIlZJRElPQ1NZTkM6ICVkXG4iLCBmcmFtZSk7CisKKwkJCXJlYWRfZnJhbWUoY2FtLCBmcmFtZSk7CisJCQl2aWNhbV9kZWNvZGVfY29sb3IoY2FtLT5yYXdfaW1hZ2UsCisJCQkJCSAgIGNhbS0+ZnJhbWVidWYgKworCQkJCQkgICBmcmFtZSAqIFZJQ0FNX01BWF9GUkFNRV9TSVpFICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLyogcG9pbnRsZXNzIHRvIGltcGxlbWVudCBvdmVybGF5IHdpdGggdGhpcyBjYW1lcmEgKi8KKwljYXNlIFZJRElPQ0NBUFRVUkU6CisJY2FzZSBWSURJT0NHRkJVRjoKKwljYXNlIFZJRElPQ1NGQlVGOgorCWNhc2UgVklESU9DS0VZOgorCQlyZXR2YWwgPSAtRUlOVkFMOworCQlicmVhazsKKworCQkvKiB0dW5lciBpbnRlcmZhY2UgLSB3ZSBoYXZlIG5vbmUgKi8KKwljYXNlIFZJRElPQ0dUVU5FUjoKKwljYXNlIFZJRElPQ1NUVU5FUjoKKwljYXNlIFZJRElPQ0dGUkVROgorCWNhc2UgVklESU9DU0ZSRVE6CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJCS8qIGF1ZGlvIGludGVyZmFjZSAtIHdlIGhhdmUgbm9uZSAqLworCWNhc2UgVklESU9DR0FVRElPOgorCWNhc2UgVklESU9DU0FVRElPOgorCQlyZXR2YWwgPSAtRUlOVkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK3ZpY2FtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPQorCSAgICAoc3RydWN0IHZpY2FtX2NhbWVyYSAqKSBkZXYtPnByaXY7CisJREJHKCJvcGVuXG4iKTsKKworCWlmICghY2FtKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInZpY2FtIHZpZGVvX2RldmljZSBpbXByb3Blcmx5IGluaXRpYWxpemVkIik7CisJfQorCisJLyogdGhlIHZpZGVvZGV2X2xvY2sgaGVsZCBhYm92ZSB1cyBwcm90ZWN0cyB1cyBmcm9tCisJICogc2ltdWx0YW5lb3VzIG9wZW5zLi4uZm9yIG5vdy4gd2UgcHJvYmFibHkgc2hvdWxkbid0CisJICogcmVseSBvbiB0aGlzIGZhY3QgZm9yZXZlci4KKwkgKi8KKworCWlmIChjYW0tPm9wZW5fY291bnQgPiAwKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJ2aWNhbV9vcGVuIGNhbGxlZCBvbiBhbHJlYWR5IG9wZW5lZCBjYW1lcmEiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwljYW0tPnJhd19pbWFnZSA9IGttYWxsb2MoVklDQU1fTUFYX1JFQURfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYW0tPnJhd19pbWFnZSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljYW0tPmZyYW1lYnVmID0gcnZtYWxsb2MoVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBWSUNBTV9GUkFNRVMpOworCWlmICghY2FtLT5mcmFtZWJ1ZikgeworCQlrZnJlZShjYW0tPnJhd19pbWFnZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNhbS0+Y250cmxidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYW0tPmNudHJsYnVmKSB7CisJCWtmcmVlKGNhbS0+cmF3X2ltYWdlKTsKKwkJcnZmcmVlKGNhbS0+ZnJhbWVidWYsIFZJQ0FNX01BWF9GUkFNRV9TSVpFICogVklDQU1fRlJBTUVTKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLy8gRmlyc3QgdXBsb2FkIGZpcm13YXJlLCB0aGVuIHR1cm4gdGhlIGNhbWVyYSBvbgorCisJaWYgKCFjYW0tPmlzX2luaXRpYWxpemVkKSB7CisJCWluaXRpYWxpemVfY2FtZXJhKGNhbSk7CisKKwkJY2FtLT5pc19pbml0aWFsaXplZCA9IDE7CisJfQorCisJc2V0X2NhbWVyYV9wb3dlcihjYW0sIDEpOworCisJY2FtLT5uZWVkc0R1bW15UmVhZCA9IDE7CisJY2FtLT5vcGVuX2NvdW50Kys7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYW07CQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IAordmljYW1fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBvcGVuX2NvdW50OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCisJREJHKCJjbG9zZVxuIik7CisKKwkvKiBpdCdzIG5vdCB0aGUgZW5kIG9mIHRoZSB3b3JsZCBpZgorCSAqIHdlIGZhaWwgdG8gdHVybiB0aGUgY2FtZXJhIG9mZi4KKwkgKi8KKworCXNldF9jYW1lcmFfcG93ZXIoY2FtLCAwKTsKKworCWtmcmVlKGNhbS0+cmF3X2ltYWdlKTsKKwlydmZyZWUoY2FtLT5mcmFtZWJ1ZiwgVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBWSUNBTV9GUkFNRVMpOworCWtmcmVlKGNhbS0+Y250cmxidWYpOworCisJZG93bigmY2FtLT5jYW1fbG9jayk7CisKKwljYW0tPm9wZW5fY291bnQtLTsKKwlvcGVuX2NvdW50ID0gY2FtLT5vcGVuX2NvdW50OworCXVkZXYgPSBjYW0tPnVkZXY7CisKKwl1cCgmY2FtLT5jYW1fbG9jayk7CisKKwlpZiAoIW9wZW5fY291bnQgJiYgIXVkZXYpIHsKKwkJa2ZyZWUoY2FtKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmljYW1fZGVjb2RlX2NvbG9yKGNvbnN0IHU4ICpkYXRhLCB1OCAqcmdiKQoreworCS8qIHZpY2FtX2RlY29kZV9jb2xvciAtIENvbnZlcnQgZnJvbSBWaWNhbSBZLUNyLUNiIHRvIFJHQgorCSAqIENvcHlyaWdodCAoQykgMjAwMiBNb25yb2UgV2lsbGlhbXMgKG1vbnJvZUBwb2JveC5jb20pCisJICovCisKKwlpbnQgaSwgcHJldlksIG5leHRZOworCisJcHJldlkgPSA1MTI7CisJbmV4dFkgPSA1MTI7CisKKwlkYXRhICs9IFZJQ0FNX0hFQURFUl9TSVpFOworCisJZm9yKCBpID0gMDsgaSA8IDI0MDsgaSsrLCBkYXRhICs9IDUxMiApIHsKKwkJY29uc3QgaW50IHkgPSAoIGkgKiAyNDIgKSAvIDI0MDsKKworCQlpbnQgaiwgcHJldlgsIG5leHRYOworCQlpbnQgWSwgQ3IsIENiOworCisJCWlmICggeSA9PSAyNDIgLSAxICkgeworCQkJbmV4dFkgPSAtNTEyOworCQl9CisKKwkJcHJldlggPSAxOworCQluZXh0WCA9IDE7CisKKwkJZm9yICggaiA9IDA7IGogPCAzMjA7IGorKywgcmdiICs9IDMgKSB7CisJCQljb25zdCBpbnQgeCA9ICggaiAqIDUxMiApIC8gMzIwOworCQkJY29uc3QgdTggKiBjb25zdCBzcmMgPSAmZGF0YVt4XTsKKworCQkJaWYgKCB4ID09IDUxMiAtIDEgKSB7CisJCQkJbmV4dFggPSAtMTsKKwkJCX0KKworCQkJQ3IgPSAoIHNyY1twcmV2WF0gLSBzcmNbMF0gKSArCisJCQkJKCBzcmNbbmV4dFhdIC0gc3JjWzBdICk7CisJCQlDciAvPSAyOworCisJCQlDYiA9ICggc3JjW3ByZXZZXSAtIHNyY1twcmV2WCArIHByZXZZXSApICsKKwkJCQkoIHNyY1twcmV2WV0gLSBzcmNbbmV4dFggKyBwcmV2WV0gKSArCisJCQkJKCBzcmNbbmV4dFldIC0gc3JjW3ByZXZYICsgbmV4dFldICkgKworCQkJCSggc3JjW25leHRZXSAtIHNyY1tuZXh0WCArIG5leHRZXSApOworCQkJQ2IgLz0gNDsKKworCQkJWSA9IDExNjAgKiAoIHNyY1swXSArICggQ3IgLyAyICkgLSAxNiApOworCisJCQlpZiAoIGkgJiAxICkgeworCQkJCWludCBDdCA9IENyOworCQkJCUNyID0gQ2I7CisJCQkJQ2IgPSBDdDsKKwkJCX0KKworCQkJaWYgKCAoIHggXiBpICkgJiAxICkgeworCQkJCUNyID0gLUNyOworCQkJCUNiID0gLUNiOworCQkJfQorCisJCQlyZ2JbMF0gPSBjbGFtcCggKCAoIFkgKyAoIDIwMTcgKiBDYiApICkgKworCQkJCQk1MDAgKSAvIDkwMCwgMCwgMjU1ICk7CisJCQlyZ2JbMV0gPSBjbGFtcCggKCAoIFkgLSAoIDM5MiAqIENiICkgLQorCQkJCQkgICggODEzICogQ3IgKSApICsKKwkJCQkJICA1MDAgKSAvIDEwMDAsIDAsIDI1NSApOworCQkJcmdiWzJdID0gY2xhbXAoICggKCBZICsgKCAxNTk0ICogQ3IgKSApICsKKwkJCQkJNTAwICkgLyAxMzAwLCAwLCAyNTUgKTsKKworCQkJcHJldlggPSAtMTsKKwkJfQorCisJCXByZXZZID0gLTUxMjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX2ZyYW1lKHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lbnVtKQoreworCXVuc2lnbmVkIGNoYXIgKnJlcXVlc3QgPSBjYW0tPmNudHJsYnVmOworCWludCByZWFsU2h1dHRlcjsKKwlpbnQgbjsKKwlpbnQgYWN0dWFsX2xlbmd0aDsKKworCWlmIChjYW0tPm5lZWRzRHVtbXlSZWFkKSB7CisJCWNhbS0+bmVlZHNEdW1teVJlYWQgPSAwOworCQlyZWFkX2ZyYW1lKGNhbSwgZnJhbWVudW0pOworCX0KKworCW1lbXNldChyZXF1ZXN0LCAwLCAxNik7CisJcmVxdWVzdFswXSA9IGNhbS0+Z2FpbjsJLy8gMCA9IDAlIGdhaW4sIEZGID0gMTAwJSBnYWluCisKKwlyZXF1ZXN0WzFdID0gMDsJLy8gNTEyeDI0MiBjYXB0dXJlCisKKwlyZXF1ZXN0WzJdID0gMHg5MDsJLy8gdGhlIGZ1bmN0aW9uIG9mIHRoZXNlIHR3byBieXRlcworCXJlcXVlc3RbM10gPSAweDA3OwkvLyBpcyBub3QgeWV0IHVuZGVyc3Rvb2QKKworCWlmIChjYW0tPnNodXR0ZXJfc3BlZWQgPiA2MCkgeworCQkvLyBTaG9ydCBleHBvc3VyZQorCQlyZWFsU2h1dHRlciA9CisJCSAgICAoKC0xNTYzMTkwMCAvIGNhbS0+c2h1dHRlcl9zcGVlZCkgKyAyNjA1MzMpIC8gMTAwMDsKKwkJcmVxdWVzdFs0XSA9IHJlYWxTaHV0dGVyICYgMHhGRjsKKwkJcmVxdWVzdFs1XSA9IChyZWFsU2h1dHRlciA+PiA4KSAmIDB4RkY7CisJCXJlcXVlc3RbNl0gPSAweDAzOworCQlyZXF1ZXN0WzddID0gMHgwMTsKKwl9IGVsc2UgeworCQkvLyBMb25nIGV4cG9zdXJlCisJCXJlYWxTaHV0dGVyID0gMTU2MDAgLyBjYW0tPnNodXR0ZXJfc3BlZWQgLSAxOworCQlyZXF1ZXN0WzRdID0gMDsKKwkJcmVxdWVzdFs1XSA9IDA7CisJCXJlcXVlc3RbNl0gPSByZWFsU2h1dHRlciAmIDB4RkY7CisJCXJlcXVlc3RbN10gPSByZWFsU2h1dHRlciA+PiA4OworCX0KKworCS8vIFBlciBKb2huIE1hcmt1cyBCavhybmRhbGVuLCBieXRlIGF0IGluZGV4IDggY2F1c2VzIHByb2JsZW1zIGlmIGl0IGlzbid0IDAKKwlyZXF1ZXN0WzhdID0gMDsKKwkvLyBieXRlcyA5LTE1IGRvIG5vdCBzZWVtIHRvIGFmZmVjdCBleHBvc3VyZSBvciBpbWFnZSBxdWFsaXR5CisKKwlkb3duKCZjYW0tPmNhbV9sb2NrKTsKKworCWlmICghY2FtLT51ZGV2KSB7CisJCWdvdG8gZG9uZTsKKwl9CisKKwluID0gX19zZW5kX2NvbnRyb2xfbXNnKGNhbSwgMHg1MSwgMHg4MCwgMCwgcmVxdWVzdCwgMTYpOworCisJaWYgKG4gPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiBQcm9ibGVtIHNlbmRpbmcgZnJhbWUgY2FwdHVyZSBjb250cm9sIG1lc3NhZ2UiKTsKKwkJZ290byBkb25lOworCX0KKworCW4gPSB1c2JfYnVsa19tc2coY2FtLT51ZGV2LAorCQkJIHVzYl9yY3ZidWxrcGlwZShjYW0tPnVkZXYsIGNhbS0+YnVsa0VuZHBvaW50KSwKKwkJCSBjYW0tPnJhd19pbWFnZSwKKwkJCSA1MTIgKiAyNDIgKyAxMjgsICZhY3R1YWxfbGVuZ3RoLCAxMDAwMCk7CisKKwlpZiAobiA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQcm9ibGVtIGR1cmluZyBidWxrIHJlYWQgb2YgZnJhbWUgZGF0YTogJWRcbiIsCisJCSAgICAgICBuKTsKKwl9CisKKyBkb25lOgorCXVwKCZjYW0tPmNhbV9sb2NrKTsKK30KKworc3RhdGljIHNzaXplX3QKK3ZpY2FtX3JlYWQoIHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyApCit7CisJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJREJHKCJyZWFkICVkIGJ5dGVzLlxuIiwgKGludCkgY291bnQpOworCisJaWYgKCpwcG9zID49IFZJQ0FNX01BWF9GUkFNRV9TSVpFKSB7CisJCSpwcG9zID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCpwcG9zID09IDApIHsKKwkJcmVhZF9mcmFtZShjYW0sIDApOworCQl2aWNhbV9kZWNvZGVfY29sb3IoY2FtLT5yYXdfaW1hZ2UsCisJCQkJICAgY2FtLT5mcmFtZWJ1ZiArCisJCQkJICAgMCAqIFZJQ0FNX01BWF9GUkFNRV9TSVpFKTsKKwl9CisKKwljb3VudCA9IG1pbl90KHNpemVfdCwgY291bnQsIFZJQ0FNX01BWF9GUkFNRV9TSVpFIC0gKnBwb3MpOworCisJaWYgKGNvcHlfdG9fdXNlcihidWYsICZjYW0tPmZyYW1lYnVmWypwcG9zXSwgY291bnQpKSB7CisJCWNvdW50ID0gLUVGQVVMVDsKKwl9IGVsc2UgeworCQkqcHBvcyArPSBjb3VudDsKKwl9CisKKwlpZiAoY291bnQgPT0gVklDQU1fTUFYX0ZSQU1FX1NJWkUpIHsKKwkJKnBwb3MgPSAwOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgaW50Cit2aWNhbV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwkvLyBUT0RPOiBhbGxvY2F0ZSB0aGUgcmF3IGZyYW1lIGJ1ZmZlciBpZiBuZWNlc3NhcnkKKwl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvczsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemUgID0gdm1hLT52bV9lbmQtdm1hLT52bV9zdGFydDsKKwlzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWNhbSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlEQkcoInZpY2FtX21tYXA6ICVsZFxuIiwgc2l6ZSk7CisKKwkvKiBXZSBsZXQgbW1hcCBhbGxvY2F0ZSBhcyBtdWNoIGFzIGl0IHdhbnRzIGJlY2F1c2UgTGludXggd2FzIGFkZGluZyAyMDQ4IGJ5dGVzCisJICogdG8gdGhlIHNpemUgdGhlIGFwcGxpY2F0aW9uIHJlcXVlc3RlZCBmb3IgbW1hcCBhbmQgaXQgd2FzIHNjcmV3aW5nIGFwcHMgdXAuCisJIGlmIChzaXplID4gVklDQU1fRlJBTUVTKlZJQ0FNX01BWF9GUkFNRV9TSVpFKQorCSByZXR1cm4gLUVJTlZBTDsKKwkgKi8KKworCXBvcyA9ICh1bnNpZ25lZCBsb25nKWNhbS0+ZnJhbWVidWY7CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCXBhZ2UgPSB2bWFsbG9jX3RvX3Bmbigodm9pZCAqKXBvcyk7CisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwgUEFHRV9TSVpFLCBQQUdFX1NIQVJFRCkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKworCQlzdGFydCArPSBQQUdFX1NJWkU7CisJCXBvcyArPSBQQUdFX1NJWkU7CisJCWlmIChzaXplID4gUEFHRV9TSVpFKQorCQkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJCWVsc2UKKwkJCXNpemUgPSAwOworCX0KKworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fUFJPQ19GUykKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdmljYW1fcHJvY19yb290ID0gTlVMTDsKKworc3RhdGljIGludCB2aWNhbV9yZWFkX2hlbHBlcihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQlpbnQgY291bnQsIGludCAqZW9mLCBpbnQgdmFsdWUpCit7CisJY2hhciAqb3V0ID0gcGFnZTsKKwlpbnQgbGVuOworCisJb3V0ICs9IHNwcmludGYob3V0LCAiJWQiLHZhbHVlKTsKKworCWxlbiA9IG91dCAtIHBhZ2U7CisJbGVuIC09IG9mZjsKKwlpZiAobGVuIDwgY291bnQpIHsKKwkJKmVvZiA9IDE7CisJCWlmIChsZW4gPD0gMCkKKwkJCXJldHVybiAwOworCX0gZWxzZQorCQlsZW4gPSBjb3VudDsKKworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCB2aWNhbV9yZWFkX3Byb2Nfc2h1dHRlcihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiB2aWNhbV9yZWFkX2hlbHBlcihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsCisJCQkJKChzdHJ1Y3QgdmljYW1fY2FtZXJhICopZGF0YSktPnNodXR0ZXJfc3BlZWQpOworfQorCitzdGF0aWMgaW50IHZpY2FtX3JlYWRfcHJvY19nYWluKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHZpY2FtX3JlYWRfaGVscGVyKHBhZ2Usc3RhcnQsb2ZmLGNvdW50LGVvZiwKKwkJCQkoKHN0cnVjdCB2aWNhbV9jYW1lcmEgKilkYXRhKS0+Z2Fpbik7Cit9CisKK3N0YXRpYyBpbnQKK3ZpY2FtX3dyaXRlX3Byb2Nfc2h1dHRlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJdTE2IHN0bXA7CisJY2hhciBrYnVmWzhdOworCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IChzdHJ1Y3QgdmljYW1fY2FtZXJhICopIGRhdGE7CisKKwlpZiAoY291bnQgPiA2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihrYnVmLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzdG1wID0gKHUxNikgc2ltcGxlX3N0cnRvdWwoa2J1ZiwgTlVMTCwgMTApOworCWlmIChzdG1wIDwgNCB8fCBzdG1wID4gMzIwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJY2FtLT5zaHV0dGVyX3NwZWVkID0gc3RtcDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAordmljYW1fd3JpdGVfcHJvY19nYWluKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJdTE2IGd0bXA7CisJY2hhciBrYnVmWzhdOworCisJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gKHN0cnVjdCB2aWNhbV9jYW1lcmEgKikgZGF0YTsKKworCWlmIChjb3VudCA+IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWd0bXAgPSAodTE2KSBzaW1wbGVfc3RydG91bChrYnVmLCBOVUxMLCAxMCk7CisJaWYgKGd0bXAgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCWNhbS0+Z2FpbiA9IGd0bXA7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCit2aWNhbV9jcmVhdGVfcHJvY19yb290KHZvaWQpCit7CisJdmljYW1fcHJvY19yb290ID0gY3JlYXRlX3Byb2NfZW50cnkoInZpZGVvL3ZpY2FtIiwgU19JRkRJUiwgMCk7CisKKwlpZiAodmljYW1fcHJvY19yb290KQorCQl2aWNhbV9wcm9jX3Jvb3QtPm93bmVyID0gVEhJU19NT0RVTEU7CisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJjb3VsZCBub3QgY3JlYXRlIC9wcm9jIGVudHJ5IGZvciB2aWNhbSEiKTsKK30KKworc3RhdGljIHZvaWQKK3ZpY2FtX2Rlc3Ryb3lfcHJvY19yb290KHZvaWQpCit7CisJaWYgKHZpY2FtX3Byb2Nfcm9vdCkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInZpZGVvL3ZpY2FtIiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCit2aWNhbV9jcmVhdGVfcHJvY19lbnRyeShzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0pCit7CisJY2hhciBuYW1lWzY0XTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKworCURCRyhLRVJOX0lORk8gInZpY2FtOiBjcmVhdGluZyBwcm9jIGVudHJ5XG4iKTsKKworCWlmICghdmljYW1fcHJvY19yb290IHx8ICFjYW0pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgInZpY2FtOiBjb3VsZCBub3QgY3JlYXRlIHByb2MgZW50cnksICVzIHBvaW50ZXIgaXMgbnVsbC5cbiIsCisJCSAgICAgICAoIWNhbSA/ICJjYW1lcmEiIDogInJvb3QiKSk7CisJCXJldHVybjsKKwl9CisKKwlzcHJpbnRmKG5hbWUsICJ2aWRlbyVkIiwgY2FtLT52ZGV2Lm1pbm9yKTsKKworCWNhbS0+cHJvY19kaXIgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBTX0lGRElSLCB2aWNhbV9wcm9jX3Jvb3QpOworCisJaWYgKCAhY2FtLT5wcm9jX2RpciApCisJCXJldHVybjsgLy8gRklYTUU6IFdlIHNob3VsZCBwcm9iYWJseSByZXR1cm4gYW4gZXJyb3IgaGVyZQorCQorCWVudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzaHV0dGVyIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCWNhbS0+cHJvY19kaXIpOworCWlmIChlbnQpIHsKKwkJZW50LT5kYXRhID0gY2FtOworCQllbnQtPnJlYWRfcHJvYyA9IHZpY2FtX3JlYWRfcHJvY19zaHV0dGVyOworCQllbnQtPndyaXRlX3Byb2MgPSB2aWNhbV93cml0ZV9wcm9jX3NodXR0ZXI7CisJCWVudC0+c2l6ZSA9IDY0OworCX0KKworCWVudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJnYWluIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCWNhbS0+cHJvY19kaXIpOworCWlmIChlbnQpIHsKKwkJZW50LT5kYXRhID0gY2FtOworCQllbnQtPnJlYWRfcHJvYyA9IHZpY2FtX3JlYWRfcHJvY19nYWluOworCQllbnQtPndyaXRlX3Byb2MgPSB2aWNhbV93cml0ZV9wcm9jX2dhaW47CisJCWVudC0+c2l6ZSA9IDY0OworCX0KK30KKworc3RhdGljIHZvaWQKK3ZpY2FtX2Rlc3Ryb3lfcHJvY19lbnRyeSh2b2lkICpwdHIpCit7CisJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gKHN0cnVjdCB2aWNhbV9jYW1lcmEgKikgcHRyOworCWNoYXIgbmFtZVsxNl07CisKKwlpZiAoICFjYW0tPnByb2NfZGlyICkKKwkJcmV0dXJuOworCisJc3ByaW50ZihuYW1lLCAidmlkZW8lZCIsIGNhbS0+dmRldi5taW5vcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoInNodXR0ZXIiLCBjYW0tPnByb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiZ2FpbiIsIGNhbS0+cHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsdmljYW1fcHJvY19yb290KTsKKwljYW0tPnByb2NfZGlyID0gTlVMTDsKKworfQorCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHZpY2FtX2NyZWF0ZV9wcm9jX3Jvb3Qodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdmljYW1fZGVzdHJveV9wcm9jX3Jvb3Qodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdmljYW1fY3JlYXRlX3Byb2NfZW50cnkoc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB2aWNhbV9kZXN0cm95X3Byb2NfZW50cnkodm9pZCAqcHRyKSB7IH0KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aWNhbV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB2aWNhbV9vcGVuLAorCS5yZWxlYXNlCT0gdmljYW1fY2xvc2UsCisJLnJlYWQJCT0gdmljYW1fcmVhZCwKKwkubW1hcAkJPSB2aWNhbV9tbWFwLAorCS5pb2N0bAkJPSB2aWNhbV9pb2N0bCwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZpY2FtX3RlbXBsYXRlID0geworCS5vd25lciAJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUgCQk9ICJWaUNhbS1iYXNlZCBVU0IgQ2FtZXJhIiwKKwkudHlwZSAJCT0gVklEX1RZUEVfQ0FQVFVSRSwKKwkuaGFyZHdhcmUgCT0gVklEX0hBUkRXQVJFX1ZJQ0FNLAorCS5mb3BzIAkJPSAmdmljYW1fZm9wcywKKwkubWlub3IgCQk9IC0xLAorfTsKKworLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHZpY2FtX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoVVNCX1ZJQ0FNX1ZFTkRPUl9JRCwgVVNCX1ZJQ0FNX1BST0RVQ1RfSUQpfSwKKwl7fQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdmljYW1fdGFibGUpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdmljYW1fZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAidmljYW0iLAorCS5wcm9iZQkJPSB2aWNhbV9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHZpY2FtX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gdmljYW1fdGFibGUKK307CisKKy8qKgorICoJdmljYW1fcHJvYmUKKyAqCUBpbnRmOiB0aGUgaW50ZXJmYWNlCisgKglAaWQ6IHRoZSBkZXZpY2UgaWQKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gYSBuZXcgZGV2aWNlIGlzIGNvbm5lY3RlZCB0aGF0IGl0IHRoaW5rcworICoJdGhpcyBkcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbi4KKyAqLworc3RhdGljIGludAordmljYW1fcHJvYmUoIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaW50IGJ1bGtFbmRwb2ludCA9IDA7CisJY29uc3Qgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtOworCQorCXByaW50ayhLRVJOX0lORk8gIlZpQ2FtIGJhc2VkIHdlYmNhbSBjb25uZWN0ZWRcbiIpOworCisJaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisKKwlEQkcoS0VSTl9ERUJVRyAiSW50ZXJmYWNlICVkLiBoYXMgJXUuIGVuZHBvaW50cyFcbiIsCisJICAgICAgIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAodW5zaWduZWQpIChpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cykpOworCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKKworCWlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSAmJgorCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAyKSkgeworCQkvKiB3ZSBmb3VuZCBhIGJ1bGsgaW4gZW5kcG9pbnQgKi8KKwkJYnVsa0VuZHBvaW50ID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiTm8gYnVsayBpbiBlbmRwb2ludCB3YXMgZm91bmQgPyEgKHRoaXMgaXMgYmFkKVxuIik7CisJfQorCisJaWYgKChjYW0gPQorCSAgICAga21hbGxvYyhzaXplb2YgKHN0cnVjdCB2aWNhbV9jYW1lcmEpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiY291bGQgbm90IGFsbG9jYXRlIGtlcm5lbCBtZW1vcnkgZm9yIHZpY2FtX2NhbWVyYSBzdHJ1Y3RcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoY2FtLCAwLCBzaXplb2YgKHN0cnVjdCB2aWNhbV9jYW1lcmEpKTsKKworCWNhbS0+c2h1dHRlcl9zcGVlZCA9IDE1OworCisJaW5pdF9NVVRFWCgmY2FtLT5jYW1fbG9jayk7CisKKwltZW1jcHkoJmNhbS0+dmRldiwgJnZpY2FtX3RlbXBsYXRlLAorCSAgICAgICBzaXplb2YgKHZpY2FtX3RlbXBsYXRlKSk7CisJY2FtLT52ZGV2LnByaXYgPSBjYW07CS8vIHNvcnQgb2YgYSByZXZlcnNlIG1hcHBpbmcgZm9yIHRob3NlIGZ1bmN0aW9ucyB0aGF0IGdldCB2ZGV2IG9ubHkKKworCWNhbS0+dWRldiA9IGRldjsKKwljYW0tPmJ1bGtFbmRwb2ludCA9IGJ1bGtFbmRwb2ludDsKKworCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpID09IC0xKSB7CisJCWtmcmVlKGNhbSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl2aWNhbV9jcmVhdGVfcHJvY19lbnRyeShjYW0pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVmlDYW0gd2ViY2FtIGRyaXZlciBub3cgY29udHJvbGxpbmcgdmlkZW8gZGV2aWNlICVkXG4iLGNhbS0+dmRldi5taW5vcik7CisKKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBjYW0pOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordmljYW1fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQgb3Blbl9jb3VudDsKKwlzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBOVUxMKTsKKworCS8qIHdlIG11c3QgdW5yZWdpc3RlciB0aGUgZGV2aWNlIGJlZm9yZSB0YWtpbmcgaXRzCisJICogY2FtX2xvY2suIFRoaXMgaXMgYmVjYXVzZSB0aGUgdmlkZW8gb3BlbiBjYWxsCisJICogaG9sZHMgdGhlIHNhbWUgbG9jayBhcyB2aWRlbyB1bnJlZ2lzdGVyLiBpZiB3ZQorCSAqIHVucmVnaXN0ZXIgaW5zaWRlIG9mIHRoZSBjYW1fbG9jayBhbmQgb3BlbiBhbHNvCisJICogdXNlcyB0aGUgY2FtX2xvY2ssIHdlIGdldCBkZWFkbG9jay4KKwkgKi8KKworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYpOworCisJLyogc3RvcCB0aGUgY2FtZXJhIGZyb20gYmVpbmcgdXNlZCAqLworCisJZG93bigmY2FtLT5jYW1fbG9jayk7CisKKwkvKiBtYXJrIHRoZSBjYW1lcmEgYXMgZ29uZSAqLworCisJY2FtLT51ZGV2ID0gTlVMTDsKKworCXZpY2FtX2Rlc3Ryb3lfcHJvY19lbnRyeShjYW0pOworCisJLyogdGhlIG9ubHkgdGhpbmcgbGVmdCB0byBkbyBpcyBzeW5jaHJvbml6ZSB3aXRoCisJICogb3VyIGNsb3NlL3JlbGVhc2UgZnVuY3Rpb24gb24gd2hvIHNob3VsZCByZWxlYXNlCisJICogdGhlIGNhbWVyYSBtZW1vcnkuIGlmIHRoZXJlIGFyZSBhbnkgdXNlcnMgdXNpbmcgdGhlCisJICogY2FtZXJhLCBpdCdzIHRoZWlyIGpvYi4gaWYgdGhlcmUgYXJlIG5vIHVzZXJzLAorCSAqIGl0J3Mgb3Vycy4KKwkgKi8KKworCW9wZW5fY291bnQgPSBjYW0tPm9wZW5fY291bnQ7CisKKwl1cCgmY2FtLT5jYW1fbG9jayk7CisKKwlpZiAoIW9wZW5fY291bnQpIHsKKwkJa2ZyZWUoY2FtKTsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiVmlDYW0tYmFzZWQgV2ViQ2FtIGRpc2Nvbm5lY3RlZFxuIik7Cit9CisKKy8qCisgKi8KK3N0YXRpYyBpbnQgX19pbml0Cit1c2JfdmljYW1faW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisJREJHKEtFUk5fSU5GTyAiVmlDYW0tYmFzZWQgV2ViQ2FtIGRyaXZlciBzdGFydHVwXG4iKTsKKwl2aWNhbV9jcmVhdGVfcHJvY19yb290KCk7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ2aWNhbV9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInVzYl9yZWdpc3RlciBmYWlsZWQhXG4iKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3VzYl92aWNhbV9leGl0KHZvaWQpCit7CisJREJHKEtFUk5fSU5GTworCSAgICAgICAiVmlDYW0tYmFzZWQgV2ViQ2FtIGRyaXZlciBzaHV0ZG93blxuIik7CisKKwl1c2JfZGVyZWdpc3RlcigmdmljYW1fZHJpdmVyKTsKKwl2aWNhbV9kZXN0cm95X3Byb2Nfcm9vdCgpOworfQorCittb2R1bGVfaW5pdCh1c2JfdmljYW1faW5pdCk7Cittb2R1bGVfZXhpdCh1c2JfdmljYW1fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZi5jIGIvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWU3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmLmMKQEAgLTAsMCArMSwzODIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaWRlbzRMaW51eCBkcml2ZXIgZm9yIFc5OTZbODddQ0YgSlBFRyBVU0IgRHVhbCBNb2RlIENhbWVyYSBDaGlwLiAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAtIE1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgZnJvbSBidHR2IGRyaXZlciBieSBSYWxwaCBNZXR6bGVyLCAgICAgICAgICAgICAqCisgKiAgIE1hcmN1cyBNZXR6bGVyIGFuZCBHZXJkIEtub3JyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAtIEkyQyBpbnRlcmZhY2UgdG8ga2VybmVsLCBoaWdoLWxldmVsIGltYWdlIHNlbnNvciBjb250cm9sIHJvdXRpbmVzIGFuZCAqCisgKiAgIHNvbWUgc3ltYm9saWMgbmFtZXMgZnJvbSBPVjUxMSBkcml2ZXIgYnkgTWFyayBXLiBNY0NsZWxsYW5kLiAgICAgICAgICAqCisgKiAtIExvdy1sZXZlbCBJMkMgZmFzdCB3cml0ZSBmdW5jdGlvbiBieSBQaW90ciBDemVyY3phay4gICAgICAgICAgICAgICAgICAqCisgKiAtIExvdy1sZXZlbCBJMkMgcmVhZCBmdW5jdGlvbiBieSBGcmVkZXJpYyBKb3VhdWx0LiAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlICJ3OTk2OGNmLmgiCisjaW5jbHVkZSAidzk5NjhjZl9kZWNvZGVyLmgiCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTW9kdWxlIG1hY3JvcyBhbmQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgd2luYm9uZF9pZF90YWJsZSk7CisKK01PRFVMRV9BVVRIT1IoVzk5NjhDRl9NT0RVTEVfQVVUSE9SIiAiVzk5NjhDRl9BVVRIT1JfRU1BSUwpOworTU9EVUxFX0RFU0NSSVBUSU9OKFc5OTY4Q0ZfTU9EVUxFX05BTUUpOworTU9EVUxFX1ZFUlNJT04oVzk5NjhDRl9NT0RVTEVfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRShXOTk2OENGX01PRFVMRV9MSUNFTlNFKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJWaWRlbyIpOworCitzdGF0aWMgaW50IG92bW9kX2xvYWQgPSBXOTk2OENGX09WTU9EX0xPQUQ7CitzdGF0aWMgaW50IHZwcG1vZF9sb2FkID0gVzk5NjhDRl9WUFBNT0RfTE9BRDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzaW1jYW1zID0gVzk5NjhDRl9TSU1DQU1TOworc3RhdGljIHNob3J0IHZpZGVvX25yW109e1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gLTF9OyAvKi0xPWZpcnN0IGZyZWUqLworc3RhdGljIHVuc2lnbmVkIGludCBwYWNrZXRfc2l6ZVtdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVzk5NjhDRl9QQUNLRVRfU0laRX07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbWF4X2J1ZmZlcnNbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVzk5NjhDRl9CVUZGRVJTfTsKK3N0YXRpYyBpbnQgZG91YmxlX2J1ZmZlcltdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXOTk2OENGX0RPVUJMRV9CVUZGRVJ9Oworc3RhdGljIGludCBjbGFtcGluZ1tdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9DTEFNUElOR307CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZmlsdGVyX3R5cGVbXT0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFc5OTY4Q0ZfRklMVEVSX1RZUEV9Oworc3RhdGljIGludCBsYXJnZXZpZXdbXT0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9MQVJHRVZJRVd9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGRlY29tcHJlc3Npb25bXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXOTk2OENGX0RFQ09NUFJFU1NJT059Oworc3RhdGljIGludCB1cHNjYWxpbmdbXT0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9VUFNDQUxJTkd9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX3BhbGV0dGVbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IDB9Oworc3RhdGljIGludCBmb3JjZV9yZ2JbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IFc5OTY4Q0ZfRk9SQ0VfUkdCfTsKK3N0YXRpYyBpbnQgYXV0b2JyaWdodFtdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9BVVRPQlJJR0hUfTsKK3N0YXRpYyBpbnQgYXV0b2V4cFtdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9BVVRPRVhQfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBsaWdodGZyZXFbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFc5OTY4Q0ZfTElHSFRGUkVRfTsKK3N0YXRpYyBpbnQgYmFuZGluZ2ZpbHRlcltdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVzk5NjhDRl9CQU5ESU5HRklMVEVSfTsKK3N0YXRpYyBzaG9ydCBjbG9ja2RpdltdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9DTE9DS0RJVn07CitzdGF0aWMgaW50IGJhY2tsaWdodFtdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9CQUNLTElHSFR9Oworc3RhdGljIGludCBtaXJyb3JbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IFc5OTY4Q0ZfTUlSUk9SfTsKK3N0YXRpYyBpbnQgbW9ub2Nocm9tZVtdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdPVc5OTY4Q0ZfTU9OT0NIUk9NRX07CitzdGF0aWMgdW5zaWduZWQgaW50IGJyaWdodG5lc3NbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVzk5NjhDRl9CUklHSFRORVNTfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHVlW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0hVRX07CitzdGF0aWMgdW5zaWduZWQgaW50IGNvbG91cltdPXtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IFc5OTY4Q0ZfQ09MT1VSfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29udHJhc3RbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFc5OTY4Q0ZfQ09OVFJBU1R9Oworc3RhdGljIHVuc2lnbmVkIGludCB3aGl0ZW5lc3NbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXOTk2OENGX1dISVRFTkVTU307CisjaWZkZWYgVzk5NjhDRl9ERUJVRworc3RhdGljIHVuc2lnbmVkIHNob3J0IGRlYnVnID0gVzk5NjhDRl9ERUJVR19MRVZFTDsKK3N0YXRpYyBpbnQgc3BlY2lmaWNfZGVidWcgPSBXOTk2OENGX1NQRUNJRklDX0RFQlVHOworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFyYW1fbnZbMjRdOyAvKiBudW1iZXIgb2YgdmFsdWVzIHBlciBwYXJhbWV0ZXIgKi8KKworI2lmZGVmIENPTkZJR19LTU9ECittb2R1bGVfcGFyYW0ob3Ztb2RfbG9hZCwgYm9vbCwgMDY0NCk7Cittb2R1bGVfcGFyYW0odnBwbW9kX2xvYWQsIGJvb2wsIDA0NDQpOworI2VuZGlmCittb2R1bGVfcGFyYW0oc2ltY2FtcywgdXNob3J0LCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheSh2aWRlb19uciwgc2hvcnQsICZwYXJhbV9udlswXSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocGFja2V0X3NpemUsIHVpbnQsICZwYXJhbV9udlsxXSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWF4X2J1ZmZlcnMsIHVzaG9ydCwgJnBhcmFtX252WzJdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShkb3VibGVfYnVmZmVyLCBib29sLCAmcGFyYW1fbnZbM10sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGNsYW1waW5nLCBib29sLCAmcGFyYW1fbnZbNF0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGZpbHRlcl90eXBlLCB1c2hvcnQsICZwYXJhbV9udls1XSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobGFyZ2V2aWV3LCBib29sLCAmcGFyYW1fbnZbNl0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGRlY29tcHJlc3Npb24sIHVzaG9ydCwgJnBhcmFtX252WzddLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheSh1cHNjYWxpbmcsIGJvb2wsICZwYXJhbV9udls4XSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZm9yY2VfcGFsZXR0ZSwgdXNob3J0LCAmcGFyYW1fbnZbOV0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGZvcmNlX3JnYiwgdXNob3J0LCAmcGFyYW1fbnZbMTBdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShhdXRvYnJpZ2h0LCBib29sLCAmcGFyYW1fbnZbMTFdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShhdXRvZXhwLCBib29sLCAmcGFyYW1fbnZbMTJdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShsaWdodGZyZXEsIHVzaG9ydCwgJnBhcmFtX252WzEzXSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYmFuZGluZ2ZpbHRlciwgYm9vbCwgJnBhcmFtX252WzE0XSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoY2xvY2tkaXYsIHNob3J0LCAmcGFyYW1fbnZbMTVdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShiYWNrbGlnaHQsIGJvb2wsICZwYXJhbV9udlsxNl0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KG1pcnJvciwgYm9vbCwgJnBhcmFtX252WzE3XSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobW9ub2Nocm9tZSwgYm9vbCwgJnBhcmFtX252WzE4XSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYnJpZ2h0bmVzcywgdWludCwgJnBhcmFtX252WzE5XSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaHVlLCB1aW50LCAmcGFyYW1fbnZbMjBdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShjb2xvdXIsIHVpbnQsICZwYXJhbV9udlsyMV0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGNvbnRyYXN0LCB1aW50LCAmcGFyYW1fbnZbMjJdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheSh3aGl0ZW5lc3MsIHVpbnQsICZwYXJhbV9udlsyM10sIDA0NDQpOworI2lmZGVmIFc5OTY4Q0ZfREVCVUcKK21vZHVsZV9wYXJhbShkZWJ1ZywgdXNob3J0LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShzcGVjaWZpY19kZWJ1ZywgYm9vbCwgMDY0NCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19LTU9ECitNT0RVTEVfUEFSTV9ERVNDKG92bW9kX2xvYWQsIAorICAgICAgICAgICAgICAgICAiXG48MHwxPiBBdXRvbWF0aWMgJ292Y2FtY2hpcCcgbW9kdWxlIGxvYWRpbmcuIgorICAgICAgICAgICAgICAgICAiXG4wIGRpc2FibGVkLCAxIGVuYWJsZWQuIgorICAgICAgICAgICAgICAgICAiXG5JZiBlbmFibGVkLCdpbnNtb2QnIHNlYXJjaGVzIGZvciB0aGUgcmVxdWlyZWQgJ292Y2FtY2hpcCciCisgICAgICAgICAgICAgICAgICJcbm1vZHVsZSBpbiB0aGUgc3lzdGVtLCBhY2NvcmRpbmcgdG8gaXRzIGNvbmZpZ3VyYXRpb24sIGFuZCIKKyAgICAgICAgICAgICAgICAgIlxuYXR0ZW1wdHMgdG8gbG9hZCB0aGF0IG1vZHVsZSBhdXRvbWF0aWNhbGx5LiBUaGlzIGFjdGlvbiBpcyIKKyAgICAgICAgICAgICAgICAgIlxucGVyZm9ybWVkIG9uY2UgYXMgc29vbiBhcyB0aGUgJ3c5OTY4Y2YnIG1vZHVsZSBpcyBsb2FkZWQiCisgICAgICAgICAgICAgICAgICJcbmludG8gbWVtb3J5LiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfT1ZNT0RfTE9BRCkiLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKHZwcG1vZF9sb2FkLCAKKyAgICAgICAgICAgICAgICAgIlxuPDB8MT4gQXV0b21hdGljICd3OTk2OGNmLXZwcCcgbW9kdWxlIGxvYWRpbmcuIgorICAgICAgICAgICAgICAgICAiXG4wIGRpc2FibGVkLCAxIGVuYWJsZWQuIgorICAgICAgICAgICAgICAgICAiXG5JZiBlbmFibGVkLCBldmVyeSB0aW1lIGFuIGFwcGxpY2F0aW9uIGF0dGVtcHRzIHRvIG9wZW4gYSIKKyAgICAgICAgICAgICAgICAgIlxuY2FtZXJhLCAnaW5zbW9kJyBzZWFyY2hlcyBmb3IgdGhlIHZpZGVvIHBvc3QtcHJvY2Vzc2luZyIKKyAgICAgICAgICAgICAgICAgIlxubW9kdWxlIGluIHRoZSBzeXN0ZW0gYW5kIGxvYWRzIGl0IGF1dG9tYXRpY2FsbHkgKGlmIgorICAgICAgICAgICAgICAgICAiXG5wcmVzZW50KS4gVGhlIG9wdGlvbmFsICd3OTk2OGNmLXZwcCcgbW9kdWxlIGFkZHMgZXh0cmEiCisgICAgICAgICAgICAgICAgICJcbiBpbWFnZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIHRvIHRoZSAndzk5NjhjZicgbW9kdWxlLGxpa2UiCisgICAgICAgICAgICAgICAgICJcbnNvZnR3YXJlIHVwLXNjYWxpbmcsY29sb3VyIGNvbnZlcnNpb25zIGFuZCB2aWRlbyBkZWNvZGluZyIKKyAgICAgICAgICAgICAgICAgIlxuZm9yIHZlcnkgaGlnaCBmcmFtZSByYXRlcy4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX1ZQUE1PRF9MT0FEKSIuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKKyNlbmRpZgorTU9EVUxFX1BBUk1fREVTQyhzaW1jYW1zLCAKKyAgICAgICAgICAgICAgICAgIlxuPG4+IE51bWJlciBvZiBjYW1lcmFzIGFsbG93ZWQgdG8gc3RyZWFtIHNpbXVsdGFuZW91c2x5LiIKKyAgICAgICAgICAgICAgICAgIlxubiBtYXkgdmFyeSBmcm9tIDAgdG8gIgorICAgICAgICAgICAgICAgICBfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9NQVhfREVWSUNFUykiLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfU0lNQ0FNUykiLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLAorICAgICAgICAgICAgICAgICAiXG48LTF8blssLi4uXT4gU3BlY2lmeSBWNEwgbWlub3IgbW9kZSBudW1iZXIuIgorICAgICAgICAgICAgICAgICAiXG4gLTEgPSB1c2UgbmV4dCBhdmFpbGFibGUgKGRlZmF1bHQpIgorICAgICAgICAgICAgICAgICAiXG4gIG4gPSB1c2UgbWlub3IgbnVtYmVyIG4gKGludGVnZXIgPj0gMCkiCisgICAgICAgICAgICAgICAgICJcbllvdSBjYW4gc3BlY2lmeSB1cCB0byAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfTUFYX0RFVklDRVMpCisgICAgICAgICAgICAgICAgICIgY2FtZXJhcyB0aGlzIHdheS4iCisgICAgICAgICAgICAgICAgICJcbkZvciBleGFtcGxlOiIKKyAgICAgICAgICAgICAgICAgIlxudmlkZW9fbnI9LTEsMiwtMSB3b3VsZCBhc3NpZ24gbWlub3IgbnVtYmVyIDIgdG8iCisgICAgICAgICAgICAgICAgICJcbnRoZSBzZWNvbmQgY2FtZXJhIGFuZCB1c2UgYXV0byBmb3IgdGhlIGZpcnN0IgorICAgICAgICAgICAgICAgICAiXG5vbmUgYW5kIGZvciBldmVyeSBvdGhlciBjYW1lcmEuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MocGFja2V0X3NpemUsCisgICAgICAgICAgICAgICAgICJcbjxuWywuLi5dPiBTcGVjaWZ5IHRoZSBtYXhpbXVtIGRhdGEgcGF5bG9hZCIKKyAgICAgICAgICAgICAgICAgIlxuc2l6ZSBpbiBieXRlcyBmb3IgYWx0ZXJuYXRlIHNldHRpbmdzLCBmb3IgZWFjaCBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG5uIGlzIHNjYWxlZCBiZXR3ZWVuIDYzIGFuZCAxMDIzICIKKyAgICAgICAgICAgICAgICAgIihkZWZhdWx0IGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9QQUNLRVRfU0laRSkiKS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfYnVmZmVycywKKyAgICAgICAgICAgICAgICAgIlxuPG5bLC4uLl0+IEZvciBhZHZhbmNlZCB1c2Vycy4iCisgICAgICAgICAgICAgICAgICJcblNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZpZGVvIGZyYW1lIGJ1ZmZlcnMiCisgICAgICAgICAgICAgICAgICJcbnRvIGFsbG9jYXRlIGZvciBlYWNoIGRldmljZSwgZnJvbSAyIHRvICIKKyAgICAgICAgICAgICAgICAgX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfTUFYX0JVRkZFUlMpCisgICAgICAgICAgICAgICAgICIuIChkZWZhdWx0IGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9CVUZGRVJTKSIpLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGRvdWJsZV9idWZmZXIsIAorICAgICAgICAgICAgICAgICAiXG48MHwxWywuLi5dPiAiCisgICAgICAgICAgICAgICAgICJIYXJkd2FyZSBkb3VibGUgYnVmZmVyaW5nOiAwIGRpc2FibGVkLCAxIGVuYWJsZWQuIgorICAgICAgICAgICAgICAgICAiXG5JdCBzaG91bGQgYmUgZW5hYmxlZCBpZiB5b3Ugd2FudCBzbW9vdGggdmlkZW8gb3V0cHV0OiBpZiIKKyAgICAgICAgICAgICAgICAgIlxueW91IG9idGFpbiBvdXQgb2Ygc3luYy4gdmlkZW8sIGRpc2FibGUgaXQsIG9yIHRyeSB0byIKKyAgICAgICAgICAgICAgICAgIlxuZGVjcmVhc2UgdGhlICdjbG9ja2RpdicgbW9kdWxlIHBhcmFtZXRlciB2YWx1ZS4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0RPVUJMRV9CVUZGRVIpCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhjbGFtcGluZywgCisgICAgICAgICAgICAgICAgICJcbjwwfDFbLC4uLl0+IFZpZGVvIGRhdGEgY2xhbXBpbmc6IDAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0NMQU1QSU5HKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZmlsdGVyX3R5cGUsIAorICAgICAgICAgICAgICAgICAiXG48MHwxfDJbLC4uLl0+IFZpZGVvIGZpbHRlciB0eXBlLiIKKyAgICAgICAgICAgICAgICAgIlxuMCBub25lLCAxICgxLTItMSkgMy10YXAgZmlsdGVyLCAiCisgICAgICAgICAgICAgICAgICIyICgyLTMtNi0zLTIpIDUtdGFwIGZpbHRlci4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0ZJTFRFUl9UWVBFKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG5UaGUgZmlsdGVyIGlzIHVzZWQgdG8gcmVkdWNlIG5vaXNlIGFuZCBhbGlhc2luZyBhcnRpZmFjdHMiCisgICAgICAgICAgICAgICAgICJcbnByb2R1Y2VkIGJ5IHRoZSBDQ0Qgb3IgQ01PUyBpbWFnZSBzZW5zb3IsIGFuZCB0aGUgc2NhbGluZyIKKyAgICAgICAgICAgICAgICAgIiBwcm9jZXNzLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGxhcmdldmlldywgCisgICAgICAgICAgICAgICAgICJcbjwwfDFbLC4uLl0+IExhcmdlIHZpZXc6IDAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0xBUkdFVklFVykKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKHVwc2NhbGluZywgCisgICAgICAgICAgICAgICAgICJcbjwwfDFbLC4uLl0+IFNvZnR3YXJlIHNjYWxpbmcgKGZvciBub24tY29tcHJlc3NlZCB2aWRlbyk6IgorICAgICAgICAgICAgICAgICAiXG4wIGRpc2FibGVkLCAxIGVuYWJsZWQuIgorICAgICAgICAgICAgICAgICAiXG5EaXNhYmxlIGl0IGlmIHlvdSBoYXZlIGEgc2xvdyBDUFUgb3IgeW91IGRvbid0IGhhdmUiCisgICAgICAgICAgICAgICAgICIgZW5vdWdoIG1lbW9yeS4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX1VQU0NBTElORykKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuSWYgJ3c5OTY4Y2YtdnBwJyBpcyBub3QgcHJlc2VudCwgdGhpcyBwYXJhbWV0ZXIgaXMiCisgICAgICAgICAgICAgICAgICIgc2V0IHRvIDAuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgIlxuPDB8MXwyWywuLi5dPiBTb2Z0d2FyZSB2aWRlbyBkZWNvbXByZXNzaW9uOiIKKyAgICAgICAgICAgICAgICAgIlxuLSAwIGRpc2FibGVzIGRlY29tcHJlc3Npb24gKGRvZXNuJ3QgYWxsb3cgZm9ybWF0cyBuZWVkaW5nIgorICAgICAgICAgICAgICAgICAiIGRlY29tcHJlc3Npb24pIgorICAgICAgICAgICAgICAgICAiXG4tIDEgZm9yY2VzIGRlY29tcHJlc3Npb24gKGFsbG93cyBmb3JtYXRzIG5lZWRpbmciCisgICAgICAgICAgICAgICAgICIgZGVjb21wcmVzc2lvbiBvbmx5KTsiCisgICAgICAgICAgICAgICAgICJcbi0gMiBhbGxvd3MgYW55IHBlcm1pdHRlZCBmb3JtYXRzLiIKKyAgICAgICAgICAgICAgICAgIlxuRm9ybWF0cyBzdXBwb3J0aW5nIGNvbXByZXNzZWQgdmlkZW8gYXJlIFlVVjQyMlAgYW5kIgorICAgICAgICAgICAgICAgICAiIFlVVjQyMFAvWVVWNDIwICIKKyAgICAgICAgICAgICAgICAgIlxuaW4gYW55IHJlc29sdXRpb25zIHdoZXJlIGJvdGggd2lkdGggYW5kIGhlaWdodCBhcmUgIgorICAgICAgICAgICAgICAgICAiYSBtdWx0aXBsZSBvZiAxNi4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0RFQ09NUFJFU1NJT04pCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbklmICd3OTk2OGNmLXZwcCcgaXMgbm90IHByZXNlbnQsIGZvcmNpbmcgZGVjb21wcmVzc2lvbiBpcyAiCisgICAgICAgICAgICAgICAgICJcbm5vdCBhbGxvd2VkOyBpbiB0aGlzIGNhc2UgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvIDIuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfcGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgIlxuPDAiCisgICAgICAgICAgICAgICAgICJ8IiBfX01PRFVMRV9TVFJJTkcoVklERU9fUEFMRVRURV9VWVZZKQorICAgICAgICAgICAgICAgICAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfWVVWNDIwKQorICAgICAgICAgICAgICAgICAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfWVVWNDIyUCkKKyAgICAgICAgICAgICAgICAgInwiIF9fTU9EVUxFX1NUUklORyhWSURFT19QQUxFVFRFX1lVVjQyMFApCisgICAgICAgICAgICAgICAgICJ8IiBfX01PRFVMRV9TVFJJTkcoVklERU9fUEFMRVRURV9ZVVlWKQorICAgICAgICAgICAgICAgICAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfWVVWNDIyKQorICAgICAgICAgICAgICAgICAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfR1JFWSkKKyAgICAgICAgICAgICAgICAgInwiIF9fTU9EVUxFX1NUUklORyhWSURFT19QQUxFVFRFX1JHQjU1NSkKKyAgICAgICAgICAgICAgICAgInwiIF9fTU9EVUxFX1NUUklORyhWSURFT19QQUxFVFRFX1JHQjU2NSkKKyAgICAgICAgICAgICAgICAgInwiIF9fTU9EVUxFX1NUUklORyhWSURFT19QQUxFVFRFX1JHQjI0KQorICAgICAgICAgICAgICAgICAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfUkdCMzIpCisgICAgICAgICAgICAgICAgICJbLC4uLl0+IgorICAgICAgICAgICAgICAgICAiIEZvcmNlIHBpY3R1cmUgcGFsZXR0ZS4iCisgICAgICAgICAgICAgICAgICJcbkluIG9yZGVyOiIKKyAgICAgICAgICAgICAgICAgIlxuLSAwIGFsbG93cyBhbnkgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOiIKKyAgICAgICAgICAgICAgICAgIlxuLSBVWVZZICAgIDE2IGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBkaXNhYmxlZCIKKyAgICAgICAgICAgICAgICAgIlxuLSBZVVY0MjAgIDEyIGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBlbmFibGVkIgorICAgICAgICAgICAgICAgICAiXG4tIFlVVjQyMlAgMTYgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGVuYWJsZWQiCisgICAgICAgICAgICAgICAgICJcbi0gWVVWNDIwUCAxMiBicHAgLSBPcmlnaW5hbCB2aWRlbywgY29tcHJlc3Npb24gZW5hYmxlZCIKKyAgICAgICAgICAgICAgICAgIlxuLSBZVVZZICAgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgorICAgICAgICAgICAgICAgICAiXG4tIFlVVjQyMiAgMTYgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkiCisgICAgICAgICAgICAgICAgICJcbi0gR1JFWSAgICAgOCBicHAgLSBTb2Z0d2FyZSBjb252ZXJzaW9uIGZyb20gVVlWWSIKKyAgICAgICAgICAgICAgICAgIlxuLSBSR0I1NTUgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgorICAgICAgICAgICAgICAgICAiXG4tIFJHQjU2NSAgMTYgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkiCisgICAgICAgICAgICAgICAgICJcbi0gUkdCMjQgICAyNCBicHAgLSBTb2Z0d2FyZSBjb252ZXJzaW9uIGZyb20gVVlWWSIKKyAgICAgICAgICAgICAgICAgIlxuLSBSR0IzMiAgIDMyIGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgorICAgICAgICAgICAgICAgICAiXG5XaGVuIG5vdCAwLCB0aGlzIHBhcmFtZXRlciB3aWxsIG92ZXJyaWRlICdkZWNvbXByZXNzaW9uJy4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgMCBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuSW5pdGlhbCBwYWxldHRlIGlzICIKKyAgICAgICAgICAgICAgICAgX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfUEFMRVRURV9ERUNPTVBfT04pIi4iCisgICAgICAgICAgICAgICAgICJcbklmICd3OTk2OGNmLXZwcCcgaXMgbm90IHByZXNlbnQsIHRoaXMgcGFyYW1ldGVyIGlzIgorICAgICAgICAgICAgICAgICAiIHNldCB0byA5IChVWVZZKS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9yZ2IsIAorICAgICAgICAgICAgICAgICAiXG48MHwxWywuLi5dPiBSZWFkIFJHQiB2aWRlbyBkYXRhIGluc3RlYWQgb2YgQkdSOiIKKyAgICAgICAgICAgICAgICAgIlxuIDEgPSB1c2UgUkdCIGNvbXBvbmVudCBvcmRlcmluZy4iCisgICAgICAgICAgICAgICAgICJcbiAwID0gdXNlIEJHUiBjb21wb25lbnQgb3JkZXJpbmcuIgorICAgICAgICAgICAgICAgICAiXG5UaGlzIHBhcmFtZXRlciBoYXMgZWZmZWN0IHdoZW4gdXNpbmcgUkdCWCBwYWxldHRlcyBvbmx5LiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfRk9SQ0VfUkdCKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoYXV0b2JyaWdodCwKKyAgICAgICAgICAgICAgICAgIlxuPDB8MVssLi4uXT4gSW1hZ2Ugc2Vuc29yIGF1dG9tYXRpY2FsbHkgY2hhbmdlcyBicmlnaHRuZXNzOiIKKyAgICAgICAgICAgICAgICAgIlxuIDAgPSBubywgMSA9IHllcyIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfQVVUT0JSSUdIVCkKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9leHAsCisgICAgICAgICAgICAgICAgICJcbjwwfDFbLC4uLl0+IEltYWdlIHNlbnNvciBhdXRvbWF0aWNhbGx5IGNoYW5nZXMgZXhwb3N1cmU6IgorICAgICAgICAgICAgICAgICAiXG4gMCA9IG5vLCAxID0geWVzIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9BVVRPRVhQKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MobGlnaHRmcmVxLAorICAgICAgICAgICAgICAgICAiXG48NTB8NjBbLC4uLl0+IExpZ2h0IGZyZXF1ZW5jeSBpbiBIejoiCisgICAgICAgICAgICAgICAgICJcbiA1MCBmb3IgRXVyb3BlYW4gYW5kIEFzaWFuIGxpZ2h0aW5nLCIKKyAgICAgICAgICAgICAgICAgIiA2MCBmb3IgQW1lcmljYW4gbGlnaHRpbmcuIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9MSUdIVEZSRVEpCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhiYW5kaW5nZmlsdGVyLAorICAgICAgICAgICAgICAgICAiXG48MHwxWywuLi5dPiBCYW5kaW5nIGZpbHRlciB0byByZWR1Y2UgZWZmZWN0cyBvZiIKKyAgICAgICAgICAgICAgICAgIiBmbHVvcmVzY2VudCBsaWdodGluZzoiCisgICAgICAgICAgICAgICAgICJcbiAwIGRpc2FibGVkLCAxIGVuYWJsZWQuIgorICAgICAgICAgICAgICAgICAiXG5UaGlzIGZpbHRlciB0cmllcyB0byByZWR1Y2UgdGhlIHBhdHRlcm4gb2YgaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICAgIlxubGlnaHQvZGFyayBiYW5kcyBjYXVzZWQgYnkgc29tZSAodXN1YWxseSBmbHVvcmVzY2VudCkiCisgICAgICAgICAgICAgICAgICIgbGlnaHRpbmcuIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9CQU5ESU5HRklMVEVSKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoY2xvY2tkaXYsCisgICAgICAgICAgICAgICAgICJcbjwtMXxuWywuLi5dPiAiCisgICAgICAgICAgICAgICAgICJGb3JjZSBwaXhlbCBjbG9jayBkaXZpc29yIHRvIGEgc3BlY2lmaWMgdmFsdWUgKGZvciBleHBlcnRzKToiCisgICAgICAgICAgICAgICAgICJcbiAgbiBtYXkgdmFyeSBmcm9tIDAgdG8gMTI3LiIKKyAgICAgICAgICAgICAgICAgIlxuIC0xIGZvciBhdXRvbWF0aWMgdmFsdWUuIgorICAgICAgICAgICAgICAgICAiXG5TZWUgYWxzbyB0aGUgJ2RvdWJsZV9idWZmZXInIG1vZHVsZSBwYXJhbWV0ZXIuIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9DTE9DS0RJVikKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGJhY2tsaWdodCwKKyAgICAgICAgICAgICAgICAgIlxuPDB8MVssLi4uXT4gT2JqZWN0cyBhcmUgbGl0IGZyb20gYmVoaW5kOiIKKyAgICAgICAgICAgICAgICAgIlxuIDAgPSBubywgMSA9IHllcyIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfQkFDS0xJR0hUKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MobWlycm9yLAorICAgICAgICAgICAgICAgICAiXG48MHwxWywuLi5dPiBSZXZlcnNlIGltYWdlIGhvcml6b250YWxseToiCisgICAgICAgICAgICAgICAgICJcbiAwID0gbm8sIDEgPSB5ZXMiCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX01JUlJPUikKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKG1vbm9jaHJvbWUsCisgICAgICAgICAgICAgICAgICJcbjwwfDFbLC4uLl0+IFVzZSBpbWFnZSBzZW5zb3IgYXMgbW9ub2Nocm9tZSBzZW5zb3I6IgorICAgICAgICAgICAgICAgICAiXG4gMCA9IG5vLCAxID0geWVzIgorICAgICAgICAgICAgICAgICAiXG5Ob3QgYWxsIHRoZSBzZW5zb3JzIHN1cHBvcnQgbW9ub2Nocm9tZSBjb2xvci4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX01PTk9DSFJPTUUpCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhicmlnaHRuZXNzLCAKKyAgICAgICAgICAgICAgICAgIlxuPG5bLC4uLl0+IFNldCBwaWN0dXJlIGJyaWdodG5lc3MgKDAtNjU1MzUpLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfQlJJR0hUTkVTUykKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuVGhpcyBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdCBpZiAnYXV0b2JyaWdodCcgaXMgZW5hYmxlZC4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhodWUsIAorICAgICAgICAgICAgICAgICAiXG48blssLi4uXT4gU2V0IHBpY3R1cmUgaHVlICgwLTY1NTM1KS4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0hVRSkKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGNvbG91ciwgCisgICAgICAgICAgICAgICAgICJcbjxuWywuLi5dPiBTZXQgcGljdHVyZSBzYXR1cmF0aW9uICgwLTY1NTM1KS4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0NPTE9VUikKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGNvbnRyYXN0LCAKKyAgICAgICAgICAgICAgICAgIlxuPG5bLC4uLl0+IFNldCBwaWN0dXJlIGNvbnRyYXN0ICgwLTY1NTM1KS4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0NPTlRSQVNUKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0Mod2hpdGVuZXNzLCAKKyAgICAgICAgICAgICAgICAgIlxuPG5bLC4uLl0+IFNldCBwaWN0dXJlIHdoaXRlbmVzcyAoMC02NTUzNSkuIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9XSElURU5FU1MpCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworI2lmZGVmIFc5OTY4Q0ZfREVCVUcKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsCisgICAgICAgICAgICAgICAgICJcbjxuPiBEZWJ1Z2dpbmcgaW5mb3JtYXRpb24gbGV2ZWwsIGZyb20gMCB0byA2OiIKKyAgICAgICAgICAgICAgICAgIlxuMCA9IG5vbmUgKHVzZSBjYXJlZnVsbHkpIgorICAgICAgICAgICAgICAgICAiXG4xID0gY3JpdGljYWwgZXJyb3JzIgorICAgICAgICAgICAgICAgICAiXG4yID0gc2lnbmlmaWNhbnQgaW5mb3JtYXRpb25zIgorICAgICAgICAgICAgICAgICAiXG4zID0gY29uZmlndXJhdGlvbiBvciBnZW5lcmFsIG1lc3NhZ2VzIgorICAgICAgICAgICAgICAgICAiXG40ID0gd2FybmluZ3MiCisgICAgICAgICAgICAgICAgICJcbjUgPSBjYWxsZWQgZnVuY3Rpb25zIgorICAgICAgICAgICAgICAgICAiXG42ID0gZnVuY3Rpb24gaW50ZXJuYWxzIgorICAgICAgICAgICAgICAgICAiXG5MZXZlbCA1IGFuZCA2IGFyZSB1c2VmdWwgZm9yIHRlc3Rpbmcgb25seSwgd2hlbiBvbmx5ICIKKyAgICAgICAgICAgICAgICAgIm9uZSBkZXZpY2UgaXMgdXNlZC4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0RFQlVHX0xFVkVMKSIuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0Moc3BlY2lmaWNfZGVidWcsCisgICAgICAgICAgICAgICAgICJcbjwwfDE+IEVuYWJsZSBvciBkaXNhYmxlIHNwZWNpZmljIGRlYnVnZ2luZyBtZXNzYWdlczoiCisgICAgICAgICAgICAgICAgICJcbjAgPSBwcmludCBtZXNzYWdlcyBjb25jZXJuaW5nIGV2ZXJ5IGxldmVsIgorICAgICAgICAgICAgICAgICAiIDw9ICdkZWJ1ZycgbGV2ZWwuIgorICAgICAgICAgICAgICAgICAiXG4xID0gcHJpbnQgbWVzc2FnZXMgY29uY2VybmluZyB0aGUgbGV2ZWwiCisgICAgICAgICAgICAgICAgICIgaW5kaWNhdGVkIGJ5ICdkZWJ1ZycuIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICIKKyAgICAgICAgICAgICAgICAgX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfU1BFQ0lGSUNfREVCVUcpIi4iCisgICAgICAgICAgICAgICAgICJcbiIpOworI2VuZGlmIC8qIFc5OTY4Q0ZfREVCVUcgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb21lIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFZpZGVvNGxpbnV4IGludGVyZmFjZSAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdzk5NjhjZl9mb3BzOworc3RhdGljIGludCB3OTk2OGNmX29wZW4oc3RydWN0IGlub2RlKiwgc3RydWN0IGZpbGUqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9yZWxlYXNlKHN0cnVjdCBpbm9kZSosIHN0cnVjdCBmaWxlKik7CitzdGF0aWMgaW50IHc5OTY4Y2ZfbW1hcChzdHJ1Y3QgZmlsZSosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCopOworc3RhdGljIGludCB3OTk2OGNmX2lvY3RsKHN0cnVjdCBpbm9kZSosIHN0cnVjdCBmaWxlKiwgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHNzaXplX3Qgdzk5NjhjZl9yZWFkKHN0cnVjdCBmaWxlKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl92NGxfaW9jdGwoc3RydWN0IGlub2RlKiwgc3RydWN0IGZpbGUqLCB1bnNpZ25lZCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICopOworCisvKiBVU0Itc3BlY2lmaWMgKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9zdGFydF90cmFuc2ZlcihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9zdG9wX3RyYW5zZmVyKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX3dyaXRlX3JlZyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1MTYgdmFsdWUsIHUxNiBpbmRleCk7CitzdGF0aWMgaW50IHc5OTY4Y2ZfcmVhZF9yZWcoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgdTE2IGluZGV4KTsKK3N0YXRpYyBpbnQgdzk5NjhjZl93cml0ZV9mc2Ioc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgdTE2KiBkYXRhKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl93cml0ZV9zYihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1MTYgdmFsdWUpOworc3RhdGljIGludCB3OTk2OGNmX3JlYWRfc2Ioc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2ZfdXBsb2FkX3F1YW50aXphdGlvbnRhYmxlcyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKiBMb3ctbGV2ZWwgSTJDIChTTUJ1cykgSS9PICovCitzdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfc3RhcnQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfc3RvcChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c193cml0ZV9ieXRlKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHU4IHYpOworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3JlYWRfYnl0ZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1OCogdik7CitzdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfd3JpdGVfYWNrKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3JlYWRfYWNrKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3JlZnJlc2hfYnVzKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX2kyY19hZGFwX3JlYWRfYnl0ZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGFkZHJlc3MsIHU4KiB2YWx1ZSk7CitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2FkYXBfcmVhZF9ieXRlX2RhdGEoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgdTE2IGFkZHJlc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHN1YmFkZHJlc3MsIHU4KiB2YWx1ZSk7CitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2FkYXBfd3JpdGVfYnl0ZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGFkZHJlc3MsIHU4IHN1YmFkZHJlc3MpOworc3RhdGljIGludCB3OTk2OGNmX2kyY19hZGFwX2Zhc3R3cml0ZV9ieXRlX2RhdGEoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBhZGRyZXNzLCB1OCBzdWJhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggdmFsdWUpOworCisvKiBJMkMgaW50ZXJmYWNlIHRvIGtlcm5lbCAqLworc3RhdGljIGludCB3OTk2OGNmX2kyY19pbml0KHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX2kyY19zbWJ1c194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciosIHUxNiBhZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEqKTsKK3N0YXRpYyB1MzIgdzk5NjhjZl9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9pMmNfYXR0YWNoX2luZm9ybShzdHJ1Y3QgaTJjX2NsaWVudCopOworc3RhdGljIGludCB3OTk2OGNmX2kyY19kZXRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50Kik7CitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2NvbnRyb2woc3RydWN0IGkyY19hZGFwdGVyKiwgdW5zaWduZWQgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CisKKy8qIE1lbW9yeSBtYW5hZ2VtZW50ICovCitzdGF0aWMgdm9pZCogcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKTsKK3N0YXRpYyB2b2lkIHJ2ZnJlZSh2b2lkICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitzdGF0aWMgdm9pZCB3OTk2OGNmX2RlYWxsb2NhdGVfbWVtb3J5KHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCAgdzk5NjhjZl9hbGxvY2F0ZV9tZW1vcnkoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CisKKy8qIEhpZ2gtbGV2ZWwgaW1hZ2Ugc2Vuc29yIGNvbnRyb2wgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKHN0cnVjdCB3OTk2OGNmX2RldmljZSosaW50IGNpZCxpbnQgdmFsKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9zZW5zb3JfZ2V0X2NvbnRyb2woc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKixpbnQgY2lkLGludCAqdmFsKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9zZW5zb3JfY21kKHN0cnVjdCB3OTk2OGNmX2RldmljZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl9pbml0KHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl91cGRhdGVfc2V0dGluZ3Moc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2Zfc2Vuc29yX2dldF9waWN0dXJlKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl91cGRhdGVfcGljdHVyZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdCk7CisKKy8qIE90aGVyIGhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfY29uZmlndXJlX2NhbWVyYShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLHN0cnVjdCB1c2JfZGV2aWNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHc5OTY4Y2ZfbW9kZWxfaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRldl9ucik7CitzdGF0aWMgdm9pZCB3OTk2OGNmX2FkanVzdF9jb25maWd1cmF0aW9uKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX3R1cm5fb25fbGVkKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX2luaXRfY2hpcChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKK3N0YXRpYyBpbmxpbmUgdTE2IHc5OTY4Y2ZfdmFsaWRfcGFsZXR0ZSh1MTYgcGFsZXR0ZSk7CitzdGF0aWMgaW5saW5lIHUxNiB3OTk2OGNmX3ZhbGlkX2RlcHRoKHUxNiBwYWxldHRlKTsKK3N0YXRpYyBpbmxpbmUgdTggdzk5NjhjZl9uZWVkX2RlY29tcHJlc3Npb24odTE2IHBhbGV0dGUpOworc3RhdGljIGludCB3OTk2OGNmX3NldF9waWN0dXJlKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHN0cnVjdCB2aWRlb19waWN0dXJlKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9zZXRfd2luZG93KHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHN0cnVjdCB2aWRlb193aW5kb3cpOworc3RhdGljIGludCB3OTk2OGNmX3Bvc3Rwcm9jZXNzX2ZyYW1lKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9hZGp1c3Rfd2luZG93X3NpemUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgdTE2KiB3LCB1MTYqIGgpOworc3RhdGljIHZvaWQgdzk5NjhjZl9pbml0X2ZyYW1lbGlzdChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfcHVzaF9mcmFtZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1OCBmX251bSk7CitzdGF0aWMgdm9pZCB3OTk2OGNmX3BvcF9mcmFtZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLHN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqKik7CitzdGF0aWMgdm9pZCB3OTk2OGNmX3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworCisvKiBJbnRlcm1vZHVsZSBjb21tdW5pY2F0aW9uICovCitzdGF0aWMgaW50IHc5OTY4Y2ZfdnBwbW9kX2RldGVjdChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfdnBwbW9kX3JlbGVhc2Uoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3ltYm9saWMgbmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBVc2VkIHRvIHJlcHJlc2VudCBhIGxpc3Qgb2YgdmFsdWVzIGFuZCB0aGVpciByZXNwZWN0aXZlIHN5bWJvbGljIG5hbWVzICovCitzdHJ1Y3Qgdzk5NjhjZl9zeW1ib2xpY19saXN0IHsKKwljb25zdCBpbnQgbnVtOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBzeW1ib2xpY19saXN0IGFycmF5LiBUaGUKKyAgZW5kIG9mIHRoZSBsaXN0IG11c3QgYmUgbWFya2VkIHdpdGggYW4gZWxlbWVudCB0aGF0IGhhcyBhIE5VTEwgbmFtZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICogCitzeW1ib2xpYyhzdHJ1Y3Qgdzk5NjhjZl9zeW1ib2xpY19saXN0IGxpc3RbXSwgY29uc3QgaW50IG51bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGxpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJCWlmIChsaXN0W2ldLm51bSA9PSBudW0pCisJCQlyZXR1cm4gKGxpc3RbaV0ubmFtZSk7CisKKwlyZXR1cm4gIlVua25vd24iOworfQorCitzdGF0aWMgc3RydWN0IHc5OTY4Y2Zfc3ltYm9saWNfbGlzdCBjYW1saXN0W10gPSB7CisJeyBXOTk2OENGX01PRF9HRU5FUklDLCAiVzk5Nls4N11DRiBKUEVHIFVTQiBEdWFsIE1vZGUgQ2FtZXJhIiB9LAorCXsgVzk5NjhDRl9NT0RfQ0xWQldHUCwgIkNyZWF0aXZlIExhYnMgVmlkZW8gQmxhc3RlciBXZWJDYW0gR28gUGx1cyIgfSwKKworCS8qIE90aGVyIGNhbWVyYXMgKGhhdmluZyB0aGUgc2FtZSBkZXNjcmlwdG9ycyBhcyBHZW5lcmljIFc5OTZbODddQ0YpICovCisJeyBXOTk2OENGX01PRF9BRFBWRE1BLCAiQXJvbWEgRGlnaSBQZW4gVkdBIER1YWwgTW9kZSBBREctNTAwMCIgfSwKKwl7IFc5OTg2Q0ZfTU9EX0FBVSwgIkFWZXJNZWRpYSBBVmVyVFYgVVNCIiB9LAorCXsgVzk5NjhDRl9NT0RfQ0xWQldHLCAiQ3JlYXRpdmUgTGFicyBWaWRlbyBCbGFzdGVyIFdlYkNhbSBHbyIgfSwKKwl7IFc5OTY4Q0ZfTU9EX0xMLCAiTGVib24gTERDLTAzNUEiIH0sCisJeyBXOTk2OENGX01PRF9FRUVNQywgIkV6b25pY3MgRVotODAyIEVaTWVnYSBDYW0iIH0sCisJeyBXOTk2OENGX01PRF9PT0UsICJPbW5pVmlzaW9uIE9WODYxMC1FREUiIH0sCisJeyBXOTk2OENGX01PRF9PRFBWRE1QQywgIk9QQ09NIERpZ2kgUGVuIFZHQSBEdWFsIE1vZGUgUGVuIENhbWVyYSIgfSwKKwl7IFc5OTY4Q0ZfTU9EX1BEUElJLCAiUHJldGVjIERpZ2kgUGVuLUlJIiB9LAorCXsgVzk5NjhDRl9NT0RfUERQNDgwLCAiUHJldGVjIERpZ2lQZW4tNDgwIiB9LAorCisJeyAgLTEsIE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB3OTk2OGNmX3N5bWJvbGljX2xpc3Qgc2VubGlzdFtdID0geworCXsgQ0NfT1Y3NkJFLCAgICJPVjc2QkUiIH0sCisJeyBDQ19PVjc2MTAsICAgIk9WNzYxMCIgfSwKKwl7IENDX09WNzYyMCwgICAiT1Y3NjIwIiB9LAorCXsgQ0NfT1Y3NjIwQUUsICJPVjc2MjBBRSIgfSwKKwl7IENDX09WNjYyMCwgICAiT1Y2NjIwIiB9LAorCXsgQ0NfT1Y2NjMwLCAgICJPVjY2MzAiIH0sCisJeyBDQ19PVjY2MzBBRSwgIk9WNjYzMEFFIiB9LAorCXsgQ0NfT1Y2NjMwQUYsICJPVjY2MzBBRiIgfSwKKwl7IC0xLCBOVUxMIH0KK307CisKKy8qIFZpZGVvNExpbnV4MSBwYWxldHRlcyAqLworc3RhdGljIHN0cnVjdCB3OTk2OGNmX3N5bWJvbGljX2xpc3QgdjRsMV9wbGlzdFtdID0geworCXsgVklERU9fUEFMRVRURV9HUkVZLCAgICAiR1JFWSIgfSwKKwl7IFZJREVPX1BBTEVUVEVfSEkyNDAsICAgIkhJMjQwIiB9LAorCXsgVklERU9fUEFMRVRURV9SR0I1NjUsICAiUkdCNTY1IiB9LAorCXsgVklERU9fUEFMRVRURV9SR0IyNCwgICAiUkdCMjQiIH0sCisJeyBWSURFT19QQUxFVFRFX1JHQjMyLCAgICJSR0IzMiIgfSwKKwl7IFZJREVPX1BBTEVUVEVfUkdCNTU1LCAgIlJHQjU1NSIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVWNDIyLCAgIllVVjQyMiIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVZViwgICAgIllVWVYiIH0sCisJeyBWSURFT19QQUxFVFRFX1VZVlksICAgICJVWVZZIiB9LAorCXsgVklERU9fUEFMRVRURV9ZVVY0MjAsICAiWVVWNDIwIiB9LAorCXsgVklERU9fUEFMRVRURV9ZVVY0MTEsICAiWVVWNDExIiB9LAorCXsgVklERU9fUEFMRVRURV9SQVcsICAgICAiUkFXIiB9LAorCXsgVklERU9fUEFMRVRURV9ZVVY0MjJQLCAiWVVWNDIyUCIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVWNDExUCwgIllVVjQxMVAiIH0sCisJeyBWSURFT19QQUxFVFRFX1lVVjQyMFAsICJZVVY0MjBQIiB9LAorCXsgVklERU9fUEFMRVRURV9ZVVY0MTBQLCAiWVVWNDEwUCIgfSwKKwl7IC0xLCBOVUxMIH0KK307CisKKy8qIERlY29kZXIgZXJyb3IgY29kZXM6ICovCitzdGF0aWMgc3RydWN0IHc5OTY4Y2Zfc3ltYm9saWNfbGlzdCBkZWNvZGVyX2Vycmxpc3RbXSA9IHsKKwl7IFc5OTY4Q0ZfREVDX0VSUl9DT1JSVVBURURfREFUQSwgIkNvcnJ1cHRlZCBkYXRhIiB9LAorCXsgVzk5NjhDRl9ERUNfRVJSX0JVRl9PVkVSRkxPVywgICAiQnVmZmVyIG92ZXJmbG93IiB9LAorCXsgVzk5NjhDRl9ERUNfRVJSX05PX1NPSSwgICAgICAgICAiU09JIG1hcmtlciBub3QgZm91bmQiIH0sICAgICAKKwl7IFc5OTY4Q0ZfREVDX0VSUl9OT19TT0YwLCAgICAgICAgIlNPRjAgbWFya2VyIG5vdCBmb3VuZCIgfSwKKwl7IFc5OTY4Q0ZfREVDX0VSUl9OT19TT1MsICAgICAgICAgIlNPUyBtYXJrZXIgbm90IGZvdW5kIiB9LAorCXsgVzk5NjhDRl9ERUNfRVJSX05PX0VPSSwgICAgICAgICAiRU9JIG1hcmtlciBub3QgZm91bmQiIH0sCisJeyAtMSwgTlVMTCB9Cit9OworCisvKiBVUkIgZXJyb3IgY29kZXM6ICovCitzdGF0aWMgc3RydWN0IHc5OTY4Y2Zfc3ltYm9saWNfbGlzdCB1cmJfZXJybGlzdFtdID0geworCXsgLUVOT01FTSwgICAgIk5vIG1lbW9yeSBmb3IgYWxsb2NhdGlvbiBvZiBpbnRlcm5hbCBzdHJ1Y3R1cmVzIiB9LAorCXsgLUVOT1NQQywgICAgIlRoZSBob3N0IGNvbnRyb2xsZXIncyBiYW5kd2lkdGggaXMgYWxyZWFkeSBjb25zdW1lZCIgfSwKKwl7IC1FTk9FTlQsICAgICJVUkIgd2FzIGNhbmNlbGVkIGJ5IHVubGlua191cmIiIH0sCisJeyAtRVhERVYsICAgICAiSVNPIHRyYW5zZmVyIG9ubHkgcGFydGlhbGx5IGNvbXBsZXRlZCIgfSwKKwl7IC1FQUdBSU4sICAgICJUb28gbWF0Y2ggc2NoZWR1bGVkIGZvciB0aGUgZnV0dXJlIiB9LAorCXsgLUVOWElPLCAgICAgIlVSQiBhbHJlYWR5IHF1ZXVlZCIgfSwKKwl7IC1FRkJJRywgICAgICJUb28gbXVjaCBJU08gZnJhbWVzIHJlcXVlc3RlZCIgfSwKKwl7IC1FTk9TUiwgICAgICJCdWZmZXIgZXJyb3IgKG92ZXJydW4pIiB9LAorCXsgLUVQSVBFLCAgICAgIlNwZWNpZmllZCBlbmRwb2ludCBpcyBzdGFsbGVkIChkZXZpY2Ugbm90IHJlc3BvbmRpbmcpIn0sCisJeyAtRU9WRVJGTE9XLCAiQmFiYmxlIChiYWQgY2FibGU/KSIgfSwKKwl7IC1FUFJPVE8sICAgICJCaXQtc3R1ZmYgZXJyb3IgKGJhZCBjYWJsZT8pIiB9LAorCXsgLUVJTFNFUSwgICAgIkNSQy9UaW1lb3V0IiB9LAorCXsgLUVUSU1FRE9VVCwgIk5BSyAoZGV2aWNlIGRvZXMgbm90IHJlc3BvbmQpIiB9LAorCXsgLTEsIE5VTEwgfQorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCogcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXZvaWQqIG1lbTsKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCW1lbSA9IHZtYWxsb2NfMzIoc2l6ZSk7CisJaWYgKCFtZW0pCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7IC8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gbWVtOworfQorCisKK3N0YXRpYyB2b2lkIHJ2ZnJlZSh2b2lkKiBtZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCWlmICghbWVtKQorCQlyZXR1cm47CisKKwlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlICgobG9uZykgc2l6ZSA+IDApIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKwl2ZnJlZShtZW0pOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGVhbGxvY2F0ZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfZGVhbGxvY2F0ZV9tZW1vcnkoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJdTggaTsKKworCS8qIEZyZWUgdGhlIGlzb2Nocm9ub3VzIHRyYW5zZmVyIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVzk5NjhDRl9VUkJTOyBpKyspIHsKKwkJa2ZyZWUoY2FtLT50cmFuc2Zlcl9idWZmZXJbaV0pOworCQljYW0tPnRyYW5zZmVyX2J1ZmZlcltpXSA9IE5VTEw7CisJfQorCisJLyogRnJlZSB0ZW1wb3JhcnkgZnJhbWUgYnVmZmVyICovCisJaWYgKGNhbS0+ZnJhbWVfdG1wLmJ1ZmZlcikgeworCQlydmZyZWUoY2FtLT5mcmFtZV90bXAuYnVmZmVyLCBjYW0tPmZyYW1lX3RtcC5zaXplKTsKKwkJY2FtLT5mcmFtZV90bXAuYnVmZmVyID0gTlVMTDsKKwl9CisKKwkvKiBGcmVlIGhlbHBlciBidWZmZXIgKi8KKwlpZiAoY2FtLT5mcmFtZV92cHAuYnVmZmVyKSB7CisJCXJ2ZnJlZShjYW0tPmZyYW1lX3ZwcC5idWZmZXIsIGNhbS0+ZnJhbWVfdnBwLnNpemUpOworCQljYW0tPmZyYW1lX3ZwcC5idWZmZXIgPSBOVUxMOworCX0KKworCS8qIEZyZWUgdmlkZW8gZnJhbWUgYnVmZmVycyAqLworCWlmIChjYW0tPmZyYW1lWzBdLmJ1ZmZlcikgeworCQlydmZyZWUoY2FtLT5mcmFtZVswXS5idWZmZXIsIGNhbS0+bmJ1ZmZlcnMqY2FtLT5mcmFtZVswXS5zaXplKTsKKwkJY2FtLT5mcmFtZVswXS5idWZmZXIgPSBOVUxMOworCX0KKworCWNhbS0+bmJ1ZmZlcnMgPSAwOworCisJREJHKDUsICJNZW1vcnkgc3VjY2Vzc2Z1bGx5IGRlYWxsb2NhdGVkIikKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEFsbG9jYXRlIG1lbW9yeSBidWZmZXJzIGZvciBVU0IgdHJhbnNmZXJzIGFuZCB2aWRlbyBmcmFtZXMuCisgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG9wZW4oKSBvbmx5LgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9hbGxvY2F0ZV9tZW1vcnkoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJY29uc3QgdTE2IHBfc2l6ZSA9IHdNYXhQYWNrZXRTaXplW2NhbS0+YWx0c2V0dGluZy0xXTsKKwl2b2lkKiBidWZmID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGh3X2J1ZnNpemUsIHZwcF9idWZzaXplOworCXU4IGksIGJwcDsKKworCS8qIE5PVEU6IERlYWxsb2NhdGlvbiBpcyBkb25lIGVsc2V3aGVyZSBpbiBjYXNlIG9mIGVycm9yICovCisKKwkvKiBDYWxjdWxhdGUgdGhlIG1heCBhbW91bnQgb2YgcmF3IGRhdGEgcGVyIGZyYW1lIGZyb20gdGhlIGRldmljZSAqLworCWh3X2J1ZnNpemUgPSBjYW0tPm1heHdpZHRoKmNhbS0+bWF4aGVpZ2h0KjI7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG1heCBidWYuIHNpemUgbmVlZGVkIGZvciBwb3N0LXByb2Nlc3Npbmcgcm91dGluZXMgKi8KKwlicHAgPSAodzk5NjhjZl92cHApID8gNCA6IDI7CisJaWYgKGNhbS0+dXBzY2FsaW5nKQorCQl2cHBfYnVmc2l6ZSA9IG1heChXOTk2OENGX01BWF9XSURUSCpXOTk2OENGX01BWF9IRUlHSFQqYnBwLAorCQkgICAgICAgICAgICAgICAgICBjYW0tPm1heHdpZHRoKmNhbS0+bWF4aGVpZ2h0KmJwcCk7CisJZWxzZQorCQl2cHBfYnVmc2l6ZSA9IGNhbS0+bWF4d2lkdGgqY2FtLT5tYXhoZWlnaHQqYnBwOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaXNvY2hyb25vdXMgdHJhbnNmZXIgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBXOTk2OENGX1VSQlM7IGkrKykgeworCQlpZiAoIShjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXSA9CisJCSAgICAgIGttYWxsb2MoVzk5NjhDRl9JU09fUEFDS0VUUypwX3NpemUsIEdGUF9LRVJORUwpKSkgeworCQkJREJHKDEsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpc29jaHJvbm91cyAiCisJCQkgICAgICAgInRyYW5zZmVyIGJ1ZmZlcnMgKCV1IGJ5dGVzKSIsIAorCQkJICAgIHBfc2l6ZSAqIFc5OTY4Q0ZfSVNPX1BBQ0tFVFMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQoY2FtLT50cmFuc2Zlcl9idWZmZXJbaV0sIDAsIFc5OTY4Q0ZfSVNPX1BBQ0tFVFMqcF9zaXplKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0ZW1wb3JhcnkgZnJhbWUgYnVmZmVyICovCisJaWYgKCEoY2FtLT5mcmFtZV90bXAuYnVmZmVyID0gcnZtYWxsb2MoaHdfYnVmc2l6ZSkpKSB7CisJCURCRygxLCAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdGVtcG9yYXJ5ICIKKwkJICAgICAgICJ2aWRlbyBmcmFtZSBidWZmZXIgKCVsdSBieXRlcykiLCBod19idWZzaXplKQorCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY2FtLT5mcmFtZV90bXAuc2l6ZSA9IGh3X2J1ZnNpemU7CisJY2FtLT5mcmFtZV90bXAubnVtYmVyID0gLTE7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBoZWxwZXIgYnVmZmVyICovCisJaWYgKHc5OTY4Y2ZfdnBwKSB7CisJCWlmICghKGNhbS0+ZnJhbWVfdnBwLmJ1ZmZlciA9IHJ2bWFsbG9jKHZwcF9idWZzaXplKSkpIHsKKwkJCURCRygxLCAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaGVscGVyIGJ1ZmZlciIKKwkJCSAgICAgICAiICglbHUgYnl0ZXMpIiwgdnBwX2J1ZnNpemUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQljYW0tPmZyYW1lX3ZwcC5zaXplID0gdnBwX2J1ZnNpemU7CisJfSBlbHNlCisJCWNhbS0+ZnJhbWVfdnBwLmJ1ZmZlciA9IE5VTEw7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHZpZGVvIGZyYW1lIGJ1ZmZlcnMgKi8KKwljYW0tPm5idWZmZXJzID0gY2FtLT5tYXhfYnVmZmVyczsKKwl3aGlsZSAoY2FtLT5uYnVmZmVycyA+PSAyKSB7CisJCWlmICgoYnVmZiA9IHJ2bWFsbG9jKGNhbS0+bmJ1ZmZlcnMgKiB2cHBfYnVmc2l6ZSkpKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCWNhbS0+bmJ1ZmZlcnMtLTsKKwl9CisKKwlpZiAoIWJ1ZmYpIHsKKwkJREJHKDEsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB2aWRlbyBmcmFtZSBidWZmZXJzIikKKwkJY2FtLT5uYnVmZmVycyA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChjYW0tPm5idWZmZXJzICE9IGNhbS0+bWF4X2J1ZmZlcnMpCisJCURCRygyLCAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciAldSB2aWRlbyBmcmFtZSBidWZmZXJzLiAiCisJCSAgICAgICAiT25seSBtZW1vcnkgZm9yICV1IGJ1ZmZlcnMgaGFzIGJlZW4gYWxsb2NhdGVkIiwKKwkJICAgIGNhbS0+bWF4X2J1ZmZlcnMsIGNhbS0+bmJ1ZmZlcnMpCisKKwlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKSB7CisJCWNhbS0+ZnJhbWVbaV0uYnVmZmVyID0gYnVmZiArIGkqdnBwX2J1ZnNpemU7CisJCWNhbS0+ZnJhbWVbaV0uc2l6ZSA9IHZwcF9idWZzaXplOworCQljYW0tPmZyYW1lW2ldLm51bWJlciA9IGk7CisJCS8qIENpcmN1bGFyIGxpc3QgKi8KKwkJaWYgKGkgIT0gY2FtLT5uYnVmZmVycy0xKQorCQkJY2FtLT5mcmFtZVtpXS5uZXh0ID0gJmNhbS0+ZnJhbWVbaSsxXTsKKwkJZWxzZQorCQkJY2FtLT5mcmFtZVtpXS5uZXh0ID0gJmNhbS0+ZnJhbWVbMF07CisJCWNhbS0+ZnJhbWVbaV0uc3RhdHVzID0gRl9VTlVTRUQ7CisJfQorCisJREJHKDUsICJNZW1vcnkgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCIpCisJcmV0dXJuIDA7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVNCLXNwZWNpZmljIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRoaXMgaXMgYW4gaGFuZGxlciBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIFVSQnMgYXJlIGNvbXBsZXRlZC4KKyAgSXQgY29sbGVjdHMgbXVsdGlwbGUgZGF0YSBwYWNrZXRzIGNvbWluZyBmcm9tIHRoZSBjYW1lcmEgYnkgcHV0dGluZyB0aGVtCisgIGludG8gZnJhbWUgYnVmZmVyczogb25lIG9yIG1vcmUgemVybyBkYXRhIGxlbmd0aCBkYXRhIHBhY2tldHMgYXJlIHVzZWQgdG8KKyAgbWFyayB0aGUgZW5kIG9mIGEgdmlkZW8gZnJhbWU7IHRoZSBmaXJzdCBub24temVybyBkYXRhIHBhY2tldCBpcyB0aGUgc3RhcnQKKyAgb2YgdGhlIG5leHQgdmlkZW8gZnJhbWU7IGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIGluIGEgcGFja2V0LCB0aGUgZW50aXJlCisgIHZpZGVvIGZyYW1lIGlzIGRpc2NhcmRlZCBhbmQgZ3JhYmJlZCBhZ2Fpbi4KKyAgSWYgdGhlcmUgYXJlIG5vIHJlcXVlc3RlZCBmcmFtZXMgaW4gdGhlIEZJRk8gbGlzdCwgcGFja2V0cyBhcmUgY29sbGVjdGVkIGludG8KKyAgYSB0ZW1wb3JhcnkgYnVmZmVyLiAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgdzk5NjhjZl91cmJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSA9IChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiogZjsKKwl1bnNpZ25lZCBpbnQgbGVuLCBzdGF0dXM7CisJdm9pZCogcG9zOworCXU4IGk7CisJaW50IGVyciA9IDA7CisKKwlpZiAoKCFjYW0tPnN0cmVhbWluZykgfHwgY2FtLT5kaXNjb25uZWN0ZWQpIHsKKwkJREJHKDQsICJHb3QgaW50ZXJydXB0LCBidXQgbm90IHN0cmVhbWluZyIpCisJCXJldHVybjsKKwl9CisKKwkvKiAiKCpmKSIgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgImNhbS0+ZnJhbWVfY3VycmVudCIgKi8KKwlmID0gJmNhbS0+ZnJhbWVfY3VycmVudDsKKworCS8qIElmIGEgZnJhbWUgaGFzIGJlZW4gcmVxdWVzdGVkIGFuZCB3ZSBhcmUgZ3JhYmJpbmcgaW50byAgCisJICAgdGhlIHRlbXBvcmFyeSBmcmFtZSwgd2UnbGwgc3dpdGNoIHRvIHRoYXQgcmVxdWVzdGVkIGZyYW1lICovCisJaWYgKCgqZikgPT0gJmNhbS0+ZnJhbWVfdG1wICYmICpjYW0tPnJlcXVlc3RlZF9mcmFtZSkgeworCQlpZiAoY2FtLT5mcmFtZV90bXAuc3RhdHVzID09IEZfR1JBQkJJTkcpIHsKKwkJCXc5OTY4Y2ZfcG9wX2ZyYW1lKGNhbSwgJmNhbS0+ZnJhbWVfY3VycmVudCk7CisJCQkoKmYpLT5zdGF0dXMgPSBGX0dSQUJCSU5HOworCQkJKCpmKS0+bGVuZ3RoID0gY2FtLT5mcmFtZV90bXAubGVuZ3RoOworCQkJbWVtY3B5KCgqZiktPmJ1ZmZlciwgY2FtLT5mcmFtZV90bXAuYnVmZmVyLAorCQkJICAgICAgICgqZiktPmxlbmd0aCk7CisJCQlEQkcoNiwgIlN3aXRjaGVkIGZyb20gdGVtcC4gZnJhbWUgdG8gZnJhbWUgIyVkIiwgCisJCQkgICAgKCpmKS0+bnVtYmVyKQorCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQlsZW4gPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CisJCXN0YXR1cyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzOworCQlwb3MgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCArIHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCisJCWlmIChzdGF0dXMgJiYgbGVuICE9IDApIHsKKwkJCURCRyg0LCAiVVJCIGZhaWxlZCwgZXJyb3IgaW4gZGF0YSBwYWNrZXQgIgorCQkJICAgICAgICIoZXJyb3IgIyV1LCAlcykiLAorCQkJICAgIHN0YXR1cywgc3ltYm9saWModXJiX2Vycmxpc3QsIHN0YXR1cykpCisJCQkoKmYpLT5zdGF0dXMgPSBGX0VSUk9SOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobGVuKSB7IC8qIHN0YXJ0IG9mIGZyYW1lICovCisKKwkJCWlmICgoKmYpLT5zdGF0dXMgPT0gRl9VTlVTRUQpIHsKKwkJCQkoKmYpLT5zdGF0dXMgPSBGX0dSQUJCSU5HOworCQkJCSgqZiktPmxlbmd0aCA9IDA7CisJCQl9CisKKwkJCS8qIEJ1ZmZlciBvdmVyZmxvd3Mgc2hvdWxkbid0IGhhcHBlbiwgaG93ZXZlci4uLiovCisJCQlpZiAoKCpmKS0+bGVuZ3RoICsgbGVuID4gKCpmKS0+c2l6ZSkgeworCQkJCURCRyg0LCAiQnVmZmVyIG92ZXJmbG93OiBiYWQgZGF0YSBwYWNrZXRzIikKKwkJCQkoKmYpLT5zdGF0dXMgPSBGX0VSUk9SOworCQkJfQorCisJCQlpZiAoKCpmKS0+c3RhdHVzID09IEZfR1JBQkJJTkcpIHsKKwkJCQltZW1jcHkoKCpmKS0+YnVmZmVyICsgKCpmKS0+bGVuZ3RoLCBwb3MsIGxlbik7CisJCQkJKCpmKS0+bGVuZ3RoICs9IGxlbjsKKwkJCX0KKworCQl9IGVsc2UgaWYgKCgqZiktPnN0YXR1cyA9PSBGX0dSQUJCSU5HKSB7IC8qIGVuZCBvZiBmcmFtZSAqLworCisJCQlEQkcoNiwgIkZyYW1lICMlZCBzdWNjZXNzZnVsbHkgZ3JhYmJlZCIsICgqZiktPm51bWJlcikKKworCQkJaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfREVDT01QUkVTU0lPTikgeworCQkJCWVyciA9IHc5OTY4Y2ZfdnBwLT5jaGVja19oZWFkZXJzKCgqZiktPmJ1ZmZlciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmYpLT5sZW5ndGgpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJREJHKDQsICJTa2lwIGNvcnJ1cHRlZCBmcmFtZTogJXMiLAorCQkJCQkgICAgc3ltYm9saWMoZGVjb2Rlcl9lcnJsaXN0LCBlcnIpKQorCQkJCQkoKmYpLT5zdGF0dXMgPSBGX1VOVVNFRDsKKwkJCQkJY29udGludWU7IC8qIGdyYWIgdGhpcyBmcmFtZSBhZ2FpbiAqLworCQkJCX0KKwkJCX0KKworCQkJKCpmKS0+c3RhdHVzID0gRl9SRUFEWTsKKwkJCSgqZiktPnF1ZXVlZCA9IDA7CisKKwkJCS8qIFRha2UgYSBwb2ludGVyIHRvIHRoZSBuZXcgZnJhbWUgZnJvbSB0aGUgRklGTyBsaXN0LgorCQkJICAgSWYgdGhlIGxpc3QgaXMgZW1wdHksd2UnbGwgdXNlIHRoZSB0ZW1wb3JhcnkgZnJhbWUqLworCQkJaWYgKCpjYW0tPnJlcXVlc3RlZF9mcmFtZSkKKwkJCQl3OTk2OGNmX3BvcF9mcmFtZShjYW0sICZjYW0tPmZyYW1lX2N1cnJlbnQpOworCQkJZWxzZSB7CisJCQkJY2FtLT5mcmFtZV9jdXJyZW50ID0gJmNhbS0+ZnJhbWVfdG1wOworCQkJCSgqZiktPnN0YXR1cyA9IEZfVU5VU0VEOworCQkJfQorCisJCX0gZWxzZSBpZiAoKCpmKS0+c3RhdHVzID09IEZfRVJST1IpCisJCQkoKmYpLT5zdGF0dXMgPSBGX1VOVVNFRDsgLyogZ3JhYiBpdCBhZ2FpbiAqLworCisJCVBEQkdHKCJGcmFtZSBsZW5ndGggJWx1IHwgcGFjay4jJXUgfCBwYWNrLmxlbi4gJXUgfCBzdGF0ZSAlZCIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKSgqZiktPmxlbmd0aCwgaSwgbGVuLCAoKmYpLT5zdGF0dXMpCisKKwl9IC8qIGVuZCBmb3IgKi8KKworCS8qIFJlc3VibWl0IHRoaXMgVVJCICovCisJdXJiLT5kZXYgPSBjYW0tPnVzYmRldjsKKwl1cmItPnN0YXR1cyA9IDA7CisJc3Bpbl9sb2NrKCZjYW0tPnVyYl9sb2NrKTsKKwlpZiAoY2FtLT5zdHJlYW1pbmcpCisJCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkpIHsKKwkJCWNhbS0+bWlzY29uZmlndXJlZCA9IDE7CisJCQlEQkcoMSwgIkNvdWxkbid0IHJlc3VibWl0IHRoZSBVUkI6IGVycm9yICVkLCAlcyIsCisJCQkgICAgZXJyLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgZXJyKSkKKwkJfQorCXNwaW5fdW5sb2NrKCZjYW0tPnVyYl9sb2NrKTsKKworCS8qIFdha2UgdXAgdGhlIHVzZXIgcHJvY2VzcyAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FtLT53YWl0X3F1ZXVlKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBTZXR1cCB0aGUgVVJCIHN0cnVjdHVyZXMgZm9yIHRoZSBpc29jaHJvbm91cyB0cmFuc2Zlci4KKyAgU3VibWl0IHRoZSBVUkJzIHNvIHRoYXQgdGhlIGRhdGEgdHJhbnNmZXIgYmVnaW5zLgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2Zfc3RhcnRfdHJhbnNmZXIoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBjYW0tPnVzYmRldjsKKwlzdHJ1Y3QgdXJiKiB1cmI7CisJY29uc3QgdTE2IHBfc2l6ZSA9IHdNYXhQYWNrZXRTaXplW2NhbS0+YWx0c2V0dGluZy0xXTsKKwl1MTYgdywgaCwgZDsKKwlpbnQgdmlkY2FwdDsKKwl1MzIgdF9zaXplOworCWludCBlcnIgPSAwOworCXM4IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgVzk5NjhDRl9VUkJTOyBpKyspIHsKKwkJdXJiID0gdXNiX2FsbG9jX3VyYihXOTk2OENGX0lTT19QQUNLRVRTLCBHRlBfS0VSTkVMKTsKKwkJY2FtLT51cmJbaV0gPSB1cmI7CisJCWlmICghdXJiKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCXVzYl9mcmVlX3VyYihjYW0tPnVyYltqXSk7CisJCQlEQkcoMSwgIkNvdWxkbid0IGFsbG9jYXRlIHRoZSBVUkIgc3RydWN0dXJlcyIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXVyYi0+ZGV2ID0gdWRldjsKKwkJdXJiLT5jb250ZXh0ID0gKHZvaWQqKWNhbTsKKwkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKHVkZXYsIDEpOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gVzk5NjhDRl9JU09fUEFDS0VUUzsKKwkJdXJiLT5jb21wbGV0ZSA9IHc5OTY4Y2ZfdXJiX2NvbXBsZXRlOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGNhbS0+dHJhbnNmZXJfYnVmZmVyW2ldOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBwX3NpemUqVzk5NjhDRl9JU09fUEFDS0VUUzsKKwkJdXJiLT5pbnRlcnZhbCA9IDE7CisJCWZvciAoaiA9IDA7IGogPCBXOTk2OENGX0lTT19QQUNLRVRTOyBqKyspIHsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gcF9zaXplKmo7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IHBfc2l6ZTsKKwkJfQorCX0KKworCS8qIFRyYW5zZmVyIHNpemUgcGVyIGZyYW1lLCBpbiBXT1JEICEgKi8KKwlkID0gY2FtLT5od19kZXB0aDsKKwl3ID0gY2FtLT5od193aWR0aDsKKwloID0gY2FtLT5od19oZWlnaHQ7CisKKwl0X3NpemUgPSAodypoKmQpLzE2OworCisJZXJyID0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweGJmMTcsIDB4MDApOyAvKiByZXNldCBldmVyeXRoaW5nICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHhiZjEwLCAweDAwKTsgLyogbm9ybWFsIG9wZXJhdGlvbiAqLworCisJLyogVHJhbnNmZXIgc2l6ZSAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHRfc2l6ZSAmIDB4ZmZmZiwgMHgzZCk7IC8qIGxvdyBiaXRzICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdF9zaXplID4+IDE2LCAweDNlKTsgICAgLyogaGlnaCBiaXRzICovCisKKwlpZiAoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKQorCQllcnIgKz0gdzk5NjhjZl91cGxvYWRfcXVhbnRpemF0aW9udGFibGVzKGNhbSk7CisKKwl2aWRjYXB0ID0gdzk5NjhjZl9yZWFkX3JlZyhjYW0sIDB4MTYpOyAvKiByZWFkIHBpY3R1cmUgc2V0dGluZ3MgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB2aWRjYXB0fDB4ODAwMCwgMHgxNik7IC8qIGNhcHQuIGVuYWJsZSAqLworCisJZXJyICs9IHVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIDAsIGNhbS0+YWx0c2V0dGluZyk7CisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHg4YTA1LCAweDNjKTsgLyogVVNCIEZJRk8gZW5hYmxlICovCisKKwlpZiAoZXJyIHx8ICh2aWRjYXB0IDwgMCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IFc5OTY4Q0ZfVVJCUzsgaSsrKQorCQkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2ldKTsKKwkJREJHKDEsICJDb3VsZG4ndCB0ZWxsIHRoZSBjYW1lcmEgdG8gc3RhcnQgdGhlIGRhdGEgdHJhbnNmZXIiKQorCQlyZXR1cm4gZXJyOworCX0KKworCXc5OTY4Y2ZfaW5pdF9mcmFtZWxpc3QoY2FtKTsKKworCS8qIEJlZ2luIHRvIGdyYWIgaW50byB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciAqLworCWNhbS0+ZnJhbWVfdG1wLnN0YXR1cyA9IEZfVU5VU0VEOworCWNhbS0+ZnJhbWVfdG1wLnF1ZXVlZCA9IDA7CisJY2FtLT5mcmFtZV9jdXJyZW50ID0gJmNhbS0+ZnJhbWVfdG1wOworCisJaWYgKCEoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKSkKKwkJREJHKDUsICJJc29jaHJvbm91cyB0cmFuc2ZlciBzaXplOiAlbHUgYnl0ZXMvZnJhbWUiLCAKKwkJICAgICh1bnNpZ25lZCBsb25nKXRfc2l6ZSoyKQorCisJREJHKDUsICJTdGFydGluZyB0aGUgaXNvY2hyb25vdXMgdHJhbnNmZXIuLi4iKQorCisJY2FtLT5zdHJlYW1pbmcgPSAxOworCisJLyogU3VibWl0IHRoZSBVUkJzICovCisJZm9yIChpID0gMDsgaSA8IFc5OTY4Q0ZfVVJCUzsgaSsrKSB7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKGNhbS0+dXJiW2ldLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycikgeworCQkJY2FtLT5zdHJlYW1pbmcgPSAwOworCQkJZm9yIChqID0gaS0xOyBqID49IDA7IGotLSkgeworCQkJCXVzYl9raWxsX3VyYihjYW0tPnVyYltqXSk7CisJCQkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2pdKTsKKwkJCX0KKwkJCURCRygxLCAiQ291bGRuJ3Qgc2VuZCBhIHRyYW5zZmVyIHJlcXVlc3QgdG8gdGhlICIKKwkJCSAgICAgICAiVVNCIGNvcmUgKGVycm9yICMlZCwgJXMpIiwgZXJyLCAKKwkJCSAgICBzeW1ib2xpYyh1cmJfZXJybGlzdCwgZXJyKSkKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFN0b3AgdGhlIGlzb2Nocm9ub3VzIHRyYW5zZmVyIGFuZCBzZXQgYWx0ZXJuYXRlIHNldHRpbmcgdG8gMCAoME1iL3MpLgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9zdG9wX3RyYW5zZmVyKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gY2FtLT51c2JkZXY7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCWludCBlcnIgPSAwOworCXM4IGk7CisKKwlpZiAoIWNhbS0+c3RyZWFtaW5nKQorCQlyZXR1cm4gMDsKKworCS8qIFRoaXMgYXZvaWRzIHJhY2UgY29uZGl0aW9ucyB3aXRoIHVzYl9zdWJtaXRfdXJiKCkgCisJICAgaW4gdGhlIFVSQiBjb21wbGV0aXRpb24gaGFuZGxlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPnVyYl9sb2NrLCBsb2NrX2ZsYWdzKTsKKwljYW0tPnN0cmVhbWluZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT51cmJfbG9jaywgbG9ja19mbGFncyk7CisKKwlmb3IgKGkgPSBXOTk2OENGX1VSQlMtMTsgaSA+PSAwOyBpLS0pCisJCWlmIChjYW0tPnVyYltpXSkgeworCQkJdXNiX2tpbGxfdXJiKGNhbS0+dXJiW2ldKTsKKwkJCXVzYl9mcmVlX3VyYihjYW0tPnVyYltpXSk7CisJCQljYW0tPnVyYltpXSA9IE5VTEw7CisJCX0KKworCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkKKwkJZ290byBleGl0OworCisJZXJyID0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDBhMDUsIDB4M2MpOyAvKiBzdG9wIFVTQiB0cmFuc2ZlciAqLworCWVyciArPSB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCAwLCAwKTsgLyogMCBNYi9zICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDM5KTsgLyogZGlzYWJsZSBKUEVHIGVuY29kZXIgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDAwMDAsIDB4MTYpOyAvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KKworCWlmIChlcnIpIHsKKwkJREJHKDIsICJGYWlsZWQgdG8gdGVsbCB0aGUgY2FtZXJhIHRvIHN0b3AgdGhlIGlzb2Nocm9ub3VzICIKKwkJICAgICAgICJ0cmFuc2Zlci4gSG93ZXZlciB0aGlzIGlzIG5vdCBhIGNyaXRpY2FsIGVycm9yLiIpCisJCXJldHVybiAtRUlPOworCX0KKworZXhpdDoKKwlEQkcoNSwgIklzb2Nocm9ub3VzIHRyYW5zZmVyIHN0b3BwZWQiKQorCXJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV3JpdGUgYSBXOTk2OENGIHJlZ2lzdGVyLiAKKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2Zfd3JpdGVfcmVnKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OworCWludCByZXM7CisKKwlyZXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLCAwLAorCSAgICAgICAgICAgICAgICAgICAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgVzk5NjhDRl9VU0JfQ1RSTF9USU1FT1VUKTsKKworCWlmIChyZXMgPCAwKQorCQlEQkcoNCwgIkZhaWxlZCB0byB3cml0ZSBhIHJlZ2lzdGVyICIKKwkJICAgICAgICIodmFsdWUgMHglMDRYLCBpbmRleCAweCUwMlgsIGVycm9yICMlZCwgJXMpIiwKKwkJICAgIHZhbHVlLCBpbmRleCwgcmVzLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgcmVzKSkKKworCXJldHVybiAocmVzID49IDApID8gMCA6IC0xOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUmVhZCBhIFc5OTY4Q0YgcmVnaXN0ZXIuIAorICBSZXR1cm4gdGhlIHJlZ2lzdGVyIHZhbHVlIG9uIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3OTk2OGNmX3JlYWRfcmVnKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCB1MTYgaW5kZXgpCit7CisJc3RydWN0IHVzYl9kZXZpY2UqIHVkZXYgPSBjYW0tPnVzYmRldjsKKwl1MTYqIGJ1ZmYgPSBjYW0tPmNvbnRyb2xfYnVmZmVyOworCWludCByZXM7CisKKwlyZXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLCAxLAorCSAgICAgICAgICAgICAgICAgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkgICAgICAgICAgICAgICAgICAgICAgMCwgaW5kZXgsIGJ1ZmYsIDIsIFc5OTY4Q0ZfVVNCX0NUUkxfVElNRU9VVCk7CisKKwlpZiAocmVzIDwgMCkKKwkJREJHKDQsICJGYWlsZWQgdG8gcmVhZCBhIHJlZ2lzdGVyICIKKwkJICAgICAgICIoaW5kZXggMHglMDJYLCBlcnJvciAjJWQsICVzKSIsCisJCSAgICBpbmRleCwgcmVzLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgcmVzKSkKKworCXJldHVybiAocmVzID49IDApID8gKGludCkoKmJ1ZmYpIDogLTE7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXcml0ZSA2NC1iaXQgZGF0YSB0byB0aGUgZmFzdCBzZXJpYWwgYnVzIHJlZ2lzdGVycy4KKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2Zfd3JpdGVfZnNiKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCB1MTYqIGRhdGEpCit7CisJc3RydWN0IHVzYl9kZXZpY2UqIHVkZXYgPSBjYW0tPnVzYmRldjsKKwl1MTYgdmFsdWU7CisJaW50IHJlczsKKworCXZhbHVlID0gKmRhdGErKzsKKworCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksIDAsCisJICAgICAgICAgICAgICAgICAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIDB4MDYsIGRhdGEsIDYsIFc5OTY4Q0ZfVVNCX0NUUkxfVElNRU9VVCk7CisKKwlpZiAocmVzIDwgMCkKKwkJREJHKDQsICJGYWlsZWQgdG8gd3JpdGUgdGhlIEZTQiByZWdpc3RlcnMgIgorCQkgICAgICAgIihlcnJvciAjJWQsICVzKSIsIHJlcywgc3ltYm9saWModXJiX2Vycmxpc3QsIHJlcykpCisKKwlyZXR1cm4gKHJlcyA+PSAwKSA/IDAgOiAtMTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdyaXRlIGRhdGEgdG8gdGhlIHNlcmlhbCBidXMgY29udHJvbCByZWdpc3Rlci4KKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2Zfd3JpdGVfc2Ioc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHUxNiB2YWx1ZSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciA9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdmFsdWUsIDB4MDEpOworCXVkZWxheShXOTk2OENGX0kyQ19CVVNfREVMQVkpOworCisJcmV0dXJuIGVycjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJlYWQgZGF0YSBmcm9tIHRoZSBzZXJpYWwgYnVzIGNvbnRyb2wgcmVnaXN0ZXIuCisgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3OTk2OGNmX3JlYWRfc2Ioc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJaW50IHYgPSAwOworCisJdiA9IHc5OTY4Y2ZfcmVhZF9yZWcoY2FtLCAweDAxKTsKKwl1ZGVsYXkoVzk5NjhDRl9JMkNfQlVTX0RFTEFZKTsKKworCXJldHVybiB2OworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVXBsb2FkIHF1YW50aXphdGlvbiB0YWJsZXMgZm9yIHRoZSBKUEVHIGNvbXByZXNzaW9uLgorICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB3OTk2OGNmX3N0YXJ0X3RyYW5zZmVyKCkuCisgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3OTk2OGNmX3VwbG9hZF9xdWFudGl6YXRpb250YWJsZXMoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJdTE2IGEsIGI7CisJaW50IGVyciA9IDAsIGksIGo7CisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDAwMTAsIDB4MzkpOyAvKiBKUEVHIGNsb2NrIGVuYWJsZSAqLworCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCAzMjsgaSsrLCBqICs9IDIpIHsKKwkJYSA9IFlfUVVBTlRBQkxFW2pdIHwgKCh1bnNpZ25lZCkoWV9RVUFOVEFCTEVbaisxXSkgPDwgOCk7CisJCWIgPSBVVl9RVUFOVEFCTEVbal0gfCAoKHVuc2lnbmVkKShVVl9RVUFOVEFCTEVbaisxXSkgPDwgOCk7CisJCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIGEsIDB4NDAraSk7CisJCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIGIsIDB4NjAraSk7CisJfQorCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAxMiwgMHgzOSk7IC8qIEpQRUcgZW5jb2RlciBlbmFibGUgKi8KKworCXJldHVybiBlcnI7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTG93LWxldmVsIEkyQyBJL08gZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhZGFwdGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgSTJDIHRyYW5zZmVyIGZ1bmN0aW9uczogICAgICAgICAgICAgICAqCisgKiBpMmNfYWRhcF9mYXN0d3JpdGVfYnl0ZV9kYXRhKCkgKGF0IDQwMCBrSHogYml0IGZyZXF1ZW5jeSBvbmx5KSAgICAgICAgICAgKgorICogaTJjX2FkYXBfcmVhZF9ieXRlX2RhdGEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIGkyY19hZGFwX3JlYWRfYnl0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3N0YXJ0KHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTEpOyAvKiBTREU9MSwgU0RBPTAsIFNDTD0xICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTApOyAvKiBTREU9MSwgU0RBPTAsIFNDTD0wICovCisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c19zdG9wKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTEpOyAvKiBTREU9MSwgU0RBPTAsIFNDTD0xICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTMpOyAvKiBTREU9MSwgU0RBPTEsIFNDTD0xICovCisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c193cml0ZV9ieXRlKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCB1OCB2KQoreworCXU4IGJpdDsKKwlpbnQgZXJyID0gMCwgc2RhOworCisJZm9yIChiaXQgPSAwIDsgYml0IDwgOCA7IGJpdCsrKSB7CisJCXNkYSA9ICh2ICYgMHg4MCkgPyAyIDogMDsKKwkJdiA8PD0gMTsKKwkJLyogU0RFPTEsIFNEQT1zZGEsIFNDTD0wICovCisJCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgxMCB8IHNkYSk7CisJCS8qIFNERT0xLCBTREE9c2RhLCBTQ0w9MSAqLworCQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MTEgfCBzZGEpOworCQkvKiBTREU9MSwgU0RBPXNkYSwgU0NMPTAgKi8KKwkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDEwIHwgc2RhKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c19yZWFkX2J5dGUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHU4KiB2KQoreworCXU4IGJpdDsKKwlpbnQgZXJyID0gMDsKKworCSp2ID0gMDsKKwlmb3IgKGJpdCA9IDAgOyBiaXQgPCA4IDsgYml0KyspIHsKKwkJKnYgPDw9IDE7CisJCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgwMDEzKTsKKwkJKnYgfD0gKHc5OTY4Y2ZfcmVhZF9zYihjYW0pICYgMHgwMDA4KSA/IDEgOiAwOworCQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfd3JpdGVfYWNrKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTApOyAvKiBTREU9MSwgU0RBPTAsIFNDTD0wICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTEpOyAvKiBTREU9MSwgU0RBPTAsIFNDTD0xICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTApOyAvKiBTREU9MSwgU0RBPTAsIFNDTD0wICovCisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c19yZWFkX2FjayhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMCwgc2RhOworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTMpOyAvKiBTREU9MSwgU0RBPTEsIFNDTD0xICovCisJc2RhID0gKHc5OTY4Y2ZfcmVhZF9zYihjYW0pICYgMHgwOCkgPyAxIDogMDsgLyogc2RhID0gU0RBICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTIpOyAvKiBTREU9MSwgU0RBPTEsIFNDTD0wICovCisJaWYgKHNkYSA8IDApCisJCWVyciArPSBzZGE7CisJaWYgKHNkYSA9PSAxKSB7CisJCURCRyg2LCAiQ291bGRuJ3QgcmVjZWl2ZSB0aGUgQUNLIikKKwkJZXJyICs9IC0xOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKworLyogVGhpcyBzZWVtcyB0byByZWZyZXNoIHRoZSBjb21tdW5pY2F0aW9uIHRocm91Z2ggdGhlIHNlcmlhbCBidXMgKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c19yZWZyZXNoX2J1cyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMCwgajsKKworCWZvciAoaiA9IDE7IGogPD0gMTA7IGorKykgeworCQllcnIgPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAyMCwgMHgwMSk7CisJCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAwMCwgMHgwMSk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qIFNNQnVzIHByb3RvY29sOiBTIEFkZHIgV3IgW0FdIFN1YmFkZHIgW0FdIFZhbHVlIFtBXSBQICovCitzdGF0aWMgaW50IAordzk5NjhjZl9pMmNfYWRhcF9mYXN0d3JpdGVfYnl0ZV9kYXRhKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgYWRkcmVzcywgdTggc3ViYWRkcmVzcyx1OCB2YWx1ZSkKK3sKKwl1MTYqIGRhdGEgPSBjYW0tPmRhdGFfYnVmZmVyOworCWludCBlcnIgPSAwOworCisJZXJyICs9IHc5OTY4Y2Zfc21idXNfcmVmcmVzaF9idXMoY2FtKTsKKworCS8qIEVuYWJsZSBTQlVTIG91dHB1dHMgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAyMCk7CisKKwlkYXRhWzBdID0gMHgwODJmIHwgKChhZGRyZXNzICYgMHg4MCkgPyAweDE1MDAgOiAweDApOworCWRhdGFbMF0gfD0gKGFkZHJlc3MgJiAweDQwKSA/IDB4NDAwMCA6IDB4MDsKKwlkYXRhWzFdID0gMHgyMDgyIHwgKChhZGRyZXNzICYgMHg0MCkgPyAweDAwMDUgOiAweDApOworCWRhdGFbMV0gfD0gKGFkZHJlc3MgJiAweDIwKSA/IDB4MDE1MCA6IDB4MDsKKwlkYXRhWzFdIHw9IChhZGRyZXNzICYgMHgxMCkgPyAweDU0MDAgOiAweDA7CisJZGF0YVsyXSA9IDB4ODIwOCB8ICgoYWRkcmVzcyAmIDB4MDgpID8gMHgwMDE1IDogMHgwKTsKKwlkYXRhWzJdIHw9IChhZGRyZXNzICYgMHgwNCkgPyAweDA1NDAgOiAweDA7CisJZGF0YVsyXSB8PSAoYWRkcmVzcyAmIDB4MDIpID8gMHg1MDAwIDogMHgwOworCWRhdGFbM10gPSAweDFkMjAgfCAoKGFkZHJlc3MgJiAweDAyKSA/IDB4MDAwMSA6IDB4MCk7CisJZGF0YVszXSB8PSAoYWRkcmVzcyAmIDB4MDEpID8gMHgwMDU0IDogMHgwOworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfZnNiKGNhbSwgZGF0YSk7CisKKwlkYXRhWzBdID0gMHg4MjA4IHwgKChzdWJhZGRyZXNzICYgMHg4MCkgPyAweDAwMTUgOiAweDApOworCWRhdGFbMF0gfD0gKHN1YmFkZHJlc3MgJiAweDQwKSA/IDB4MDU0MCA6IDB4MDsKKwlkYXRhWzBdIHw9IChzdWJhZGRyZXNzICYgMHgyMCkgPyAweDUwMDAgOiAweDA7CisJZGF0YVsxXSA9IDB4MDgyMCB8ICgoc3ViYWRkcmVzcyAmIDB4MjApID8gMHgwMDAxIDogMHgwKTsKKwlkYXRhWzFdIHw9IChzdWJhZGRyZXNzICYgMHgxMCkgPyAweDAwNTQgOiAweDA7CisJZGF0YVsxXSB8PSAoc3ViYWRkcmVzcyAmIDB4MDgpID8gMHgxNTAwIDogMHgwOworCWRhdGFbMV0gfD0gKHN1YmFkZHJlc3MgJiAweDA0KSA/IDB4NDAwMCA6IDB4MDsKKwlkYXRhWzJdID0gMHgyMDgyIHwgKChzdWJhZGRyZXNzICYgMHgwNCkgPyAweDAwMDUgOiAweDApOworCWRhdGFbMl0gfD0gKHN1YmFkZHJlc3MgJiAweDAyKSA/IDB4MDE1MCA6IDB4MDsKKwlkYXRhWzJdIHw9IChzdWJhZGRyZXNzICYgMHgwMSkgPyAweDU0MDAgOiAweDA7CisJZGF0YVszXSA9IDB4MDAxZDsKKworCWVyciArPSB3OTk2OGNmX3dyaXRlX2ZzYihjYW0sIGRhdGEpOworCisJZGF0YVswXSA9IDB4ODIwOCB8ICgodmFsdWUgJiAweDgwKSA/IDB4MDAxNSA6IDB4MCk7CisJZGF0YVswXSB8PSAodmFsdWUgJiAweDQwKSA/IDB4MDU0MCA6IDB4MDsKKwlkYXRhWzBdIHw9ICh2YWx1ZSAmIDB4MjApID8gMHg1MDAwIDogMHgwOworCWRhdGFbMV0gPSAweDA4MjAgfCAoKHZhbHVlICYgMHgyMCkgPyAweDAwMDEgOiAweDApOworCWRhdGFbMV0gfD0gKHZhbHVlICYgMHgxMCkgPyAweDAwNTQgOiAweDA7CisJZGF0YVsxXSB8PSAodmFsdWUgJiAweDA4KSA/IDB4MTUwMCA6IDB4MDsKKwlkYXRhWzFdIHw9ICh2YWx1ZSAmIDB4MDQpID8gMHg0MDAwIDogMHgwOworCWRhdGFbMl0gPSAweDIwODIgfCAoKHZhbHVlICYgMHgwNCkgPyAweDAwMDUgOiAweDApOworCWRhdGFbMl0gfD0gKHZhbHVlICYgMHgwMikgPyAweDAxNTAgOiAweDA7CisJZGF0YVsyXSB8PSAodmFsdWUgJiAweDAxKSA/IDB4NTQwMCA6IDB4MDsKKwlkYXRhWzNdID0gMHhmZTFkOworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfZnNiKGNhbSwgZGF0YSk7CisKKwkvKiBEaXNhYmxlIFNCVVMgb3V0cHV0cyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgwMDAwKTsKKworCWlmICghZXJyKQorCQlEQkcoNSwgIkkyQyB3cml0ZSBieXRlIGRhdGEgZG9uZSwgYWRkci4weCUwNFgsIHN1YmFkZHIuMHglMDJYICIKKwkJICAgICAgICJ2YWx1ZSAweCUwMlgiLCBhZGRyZXNzLCBzdWJhZGRyZXNzLCB2YWx1ZSkKKwllbHNlCisJCURCRyg1LCAiSTJDIHdyaXRlIGJ5dGUgZGF0YSBmYWlsZWQsIGFkZHIuMHglMDRYLCAiCisJCSAgICAgICAic3ViYWRkci4weCUwMlgsIHZhbHVlIDB4JTAyWCIsIAorCQkgICAgYWRkcmVzcywgc3ViYWRkcmVzcywgdmFsdWUpCisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qIFNNQnVzIHByb3RvY29sOiBTIEFkZHIgV3IgW0FdIFN1YmFkZHIgW0FdIFAgUyBBZGRyKzEgUmQgW0FdIFtWYWx1ZV0gTkEgUCAqLworc3RhdGljIGludCAKK3c5OTY4Y2ZfaTJjX2FkYXBfcmVhZF9ieXRlX2RhdGEoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgYWRkcmVzcywgdTggc3ViYWRkcmVzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4KiB2YWx1ZSkKK3sKKwlpbnQgZXJyID0gMDsKKworCS8qIFNlcmlhbCBkYXRhIGVuYWJsZSAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgwMDEzKTsgLyogZG9uJ3QgY2hhbmdlICEgKi8KKworCWVyciArPSB3OTk2OGNmX3NtYnVzX3N0YXJ0KGNhbSk7CisJZXJyICs9IHc5OTY4Y2Zfc21idXNfd3JpdGVfYnl0ZShjYW0sIGFkZHJlc3MpOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3JlYWRfYWNrKGNhbSk7CisJZXJyICs9IHc5OTY4Y2Zfc21idXNfd3JpdGVfYnl0ZShjYW0sIHN1YmFkZHJlc3MpOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3JlYWRfYWNrKGNhbSk7CisJZXJyICs9IHc5OTY4Y2Zfc21idXNfc3RvcChjYW0pOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3N0YXJ0KGNhbSk7CisJZXJyICs9IHc5OTY4Y2Zfc21idXNfd3JpdGVfYnl0ZShjYW0sIGFkZHJlc3MgKyAxKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c19yZWFkX2FjayhjYW0pOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3JlYWRfYnl0ZShjYW0sIHZhbHVlKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9hY2soY2FtKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c19zdG9wKGNhbSk7CisKKwkvKiBTZXJpYWwgZGF0YSBkaXNhYmxlICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMDApOworCisJaWYgKCFlcnIpCisJCURCRyg1LCAiSTJDIHJlYWQgYnl0ZSBkYXRhIGRvbmUsIGFkZHIuMHglMDRYLCAiCisJCSAgICAgICAic3ViYWRkci4weCUwMlgsIHZhbHVlIDB4JTAyWCIsIAorCQkgICAgYWRkcmVzcywgc3ViYWRkcmVzcywgKnZhbHVlKQorCWVsc2UKKwkJREJHKDUsICJJMkMgcmVhZCBieXRlIGRhdGEgZmFpbGVkLCBhZGRyLjB4JTA0WCwgIgorCQkgICAgICAgInN1YmFkZHIuMHglMDJYLCB3cm9uZyB2YWx1ZSAweCUwMlgiLAorCQkgICAgYWRkcmVzcywgc3ViYWRkcmVzcywgKnZhbHVlKQorCisJcmV0dXJuIGVycjsKK30KKworCisvKiBTTUJ1cyBwcm90b2NvbDogUyBBZGRyKzEgUmQgW0FdIFtWYWx1ZV0gTkEgUCAqLworc3RhdGljIGludCAKK3c5OTY4Y2ZfaTJjX2FkYXBfcmVhZF9ieXRlKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGFkZHJlc3MsIHU4KiB2YWx1ZSkKK3sKKwlpbnQgZXJyID0gMDsKKworCS8qIFNlcmlhbCBkYXRhIGVuYWJsZSAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgwMDEzKTsKKworCWVyciArPSB3OTk2OGNmX3NtYnVzX3N0YXJ0KGNhbSk7CisJZXJyICs9IHc5OTY4Y2Zfc21idXNfd3JpdGVfYnl0ZShjYW0sIGFkZHJlc3MgKyAxKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c19yZWFkX2FjayhjYW0pOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3JlYWRfYnl0ZShjYW0sIHZhbHVlKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9hY2soY2FtKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c19zdG9wKGNhbSk7CisgCisJLyogU2VyaWFsIGRhdGEgZGlzYWJsZSAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgwMDAwKTsKKworCWlmICghZXJyKQorCQlEQkcoNSwgIkkyQyByZWFkIGJ5dGUgZG9uZSwgYWRkci4weCUwNFgsICIKKwkJICAgICAgICJ2YWx1ZSAweCUwMlgiLCBhZGRyZXNzLCAqdmFsdWUpCisJZWxzZQorCQlEQkcoNSwgIkkyQyByZWFkIGJ5dGUgZmFpbGVkLCBhZGRyLjB4JTA0WCwgIgorCQkgICAgICAgIndyb25nIHZhbHVlIDB4JTAyWCIsIGFkZHJlc3MsICp2YWx1ZSkKKworCXJldHVybiBlcnI7Cit9CisKKworLyogU01CdXMgcHJvdG9jb2w6IFMgQWRkciBXciBbQV0gVmFsdWUgW0FdIFAgKi8KK3N0YXRpYyBpbnQgCit3OTk2OGNmX2kyY19hZGFwX3dyaXRlX2J5dGUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGFkZHJlc3MsIHU4IHZhbHVlKQoreworCURCRyg0LCAiaTJjX3dyaXRlX2J5dGUoKSBpcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2ZlciBtb2RlIikKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJMkMgaW50ZXJmYWNlIHRvIGtlcm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK3c5OTY4Y2ZfaTJjX3NtYnVzX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1MTYgYWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsIHU4IGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCB1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcHRlcik7CisJdTggaTsKKwlpbnQgZXJyID0gMDsgCisKKwlzd2l0Y2ggKGFkZHIpIHsKKwkJY2FzZSBPVjZ4eDBfU0lEOgorCQljYXNlIE9WN3h4MF9TSUQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCRyg0LCAiUmVqZWN0ZWQgc2xhdmUgSUQgMHglMDRYIiwgYWRkcikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzaXplID09IEkyQ19TTUJVU19CWVRFKSB7CisJCS8qIFdoeSBhZGRyIDw8PSAxPyBTZWUgT1ZYWFgwX1NJRCBkZWZpbmVzIGluIG92Y2FtY2hpcC5oICovCisJCWFkZHIgPDw9IDE7CisKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQorIAkJCWVyciA9IHc5OTY4Y2ZfaTJjX2FkYXBfd3JpdGVfYnl0ZShjYW0sIGFkZHIsIGNvbW1hbmQpOworCQllbHNlIGlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSAKKwkJCWVyciA9IHc5OTY4Y2ZfaTJjX2FkYXBfcmVhZF9ieXRlKGNhbSxhZGRyLCZkYXRhLT5ieXRlKTsKKworCX0gZWxzZSBpZiAoc2l6ZSA9PSBJMkNfU01CVVNfQllURV9EQVRBKSB7CisJCWFkZHIgPDw9IDE7CisKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKQorIAkJCWVyciA9IHc5OTY4Y2ZfaTJjX2FkYXBfZmFzdHdyaXRlX2J5dGVfZGF0YShjYW0sIGFkZHIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCwgZGF0YS0+Ynl0ZSk7CisJCWVsc2UgaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKKwkJCWZvciAoaSA9IDE7IGkgPD0gVzk5NjhDRl9JMkNfUldfUkVUUklFUzsgaSsrKSB7CisJCQkJZXJyID0gdzk5NjhjZl9pMmNfYWRhcF9yZWFkX2J5dGVfZGF0YShjYW0sYWRkciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCwgJmRhdGEtPmJ5dGUpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJaWYgKHc5OTY4Y2Zfc21idXNfcmVmcmVzaF9idXMoY2FtKSkgeworCQkJCQkJZXJyID0gLUVJTzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlCisJCQkJCWJyZWFrOworCQkJfQorCisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwl9IGVsc2UgeworCQlEQkcoNCwgIlVuc3VwcG9ydGVkIEkyQyB0cmFuc2ZlciBtb2RlICglZCkiLCBzaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB1MzIgdzk5NjhjZl9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURSB8CisJICAgICAgIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBICB8CisJICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQTsKK30KKworCitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2F0dGFjaF9pbmZvcm0oc3RydWN0IGkyY19jbGllbnQqIGNsaWVudCkKK3sKKwlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKwljb25zdCBjaGFyKiBjbGllbnRuYW1lID0gaTJjX2NsaWVudG5hbWUoY2xpZW50KTsKKwlpbnQgaWQgPSBjbGllbnQtPmRyaXZlci0+aWQsIGVyciA9IDA7CisKKwlpZiAoaWQgPT0gSTJDX0RSSVZFUklEX09WQ0FNQ0hJUCkgeworCQljYW0tPnNlbnNvcl9jbGllbnQgPSBjbGllbnQ7CisJCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX2luaXQoY2FtKTsKKwkJaWYgKGVycikgeworCQkJY2FtLT5zZW5zb3JfY2xpZW50ID0gTlVMTDsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9IGVsc2UgeworCQlEQkcoNCwgIlJlamVjdGVkIGNsaWVudCBbJXNdIHdpdGggZHJpdmVyIFslc10iLCAKKwkJICAgIGNsaWVudG5hbWUsIGNsaWVudC0+ZHJpdmVyLT5uYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEQkcoNSwgIkkyQyBhdHRhY2ggY2xpZW50IFslc10gd2l0aCBkcml2ZXIgWyVzXSIsCisJICAgIGNsaWVudG5hbWUsIGNsaWVudC0+ZHJpdmVyLT5uYW1lKQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB3OTk2OGNmX2kyY19kZXRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50KiBjbGllbnQpCit7CisJc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0gPSBpMmNfZ2V0X2FkYXBkYXRhKGNsaWVudC0+YWRhcHRlcik7CisJY29uc3QgY2hhciogY2xpZW50bmFtZSA9IGkyY19jbGllbnRuYW1lKGNsaWVudCk7CisKKwlpZiAoY2FtLT5zZW5zb3JfY2xpZW50ID09IGNsaWVudCkKKwkJY2FtLT5zZW5zb3JfY2xpZW50ID0gTlVMTDsKKworCURCRyg1LCAiSTJDIGRldGFjaCBjbGllbnQgWyVzXSIsIGNsaWVudG5hbWUpCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IAordzk5NjhjZl9pMmNfY29udHJvbChzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGFkYXB0ZXIsIHVuc2lnbmVkIGludCBjbWQsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9pMmNfaW5pdChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBhbGdvID0geworCQkubmFtZSA9ICAgICAgICAgICJXOTk2Wzg3XUNGIGFsZ29yaXRobSIsCisJCS5pZCA9ICAgICAgICAgICAgSTJDX0FMR09fU01CVVMsCisJCS5zbWJ1c194ZmVyID0gICAgdzk5NjhjZl9pMmNfc21idXNfeGZlciwKKwkJLmFsZ29fY29udHJvbCA9ICB3OTk2OGNmX2kyY19jb250cm9sLAorCQkuZnVuY3Rpb25hbGl0eSA9IHc5OTY4Y2ZfaTJjX2Z1bmMsCisJfTsKKworCXN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcCA9IHsKKwkJLmlkID0gICAgICAgICAgICAgICAgSTJDX0FMR09fU01CVVMgfCBJMkNfSFdfU01CVVNfVzk5NjhDRiwKKwkJLmNsYXNzID0gICAgICAgICAgICAgSTJDX0NMQVNTX0NBTV9ESUdJVEFMLAorCQkub3duZXIgPSAgICAgICAgICAgICBUSElTX01PRFVMRSwKKwkJLmNsaWVudF9yZWdpc3RlciA9ICAgdzk5NjhjZl9pMmNfYXR0YWNoX2luZm9ybSwKKwkJLmNsaWVudF91bnJlZ2lzdGVyID0gdzk5NjhjZl9pMmNfZGV0YWNoX2luZm9ybSwKKwkJLmFsZ28gPSAgICAgICAgICAgICAgJmFsZ28sCisJfTsKKworCW1lbWNweSgmY2FtLT5pMmNfYWRhcHRlciwgJmFkYXAsIHNpemVvZihzdHJ1Y3QgaTJjX2FkYXB0ZXIpKTsKKwlzdHJjcHkoY2FtLT5pMmNfYWRhcHRlci5uYW1lLCAidzk5NjhjZiIpOworCWkyY19zZXRfYWRhcGRhdGEoJmNhbS0+aTJjX2FkYXB0ZXIsIGNhbSk7CisKKwlEQkcoNiwgIlJlZ2lzdGVyaW5nIEkyQyBhZGFwdGVyIHdpdGgga2VybmVsLi4uIikKKworCWVyciA9IGkyY19hZGRfYWRhcHRlcigmY2FtLT5pMmNfYWRhcHRlcik7CisJaWYgKGVycikKKwkJREJHKDEsICJGYWlsZWQgdG8gcmVnaXN0ZXIgdGhlIEkyQyBhZGFwdGVyIikKKwllbHNlCisJCURCRyg1LCAiSTJDIGFkYXB0ZXIgcmVnaXN0ZXJlZCIpCisKKwlyZXR1cm4gZXJyOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhlbHBlciBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUdXJuIG9uIHRoZSBMRUQgb24gc29tZSB3ZWJjYW1zLiBBIGJlZXAgc2hvdWxkIGJlIGhlYXJkIHRvby4KKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2ZfdHVybl9vbl9sZWQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweGZmMDAsIDB4MDApOyAvKiBwb3dlci1kb3duICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHhiZjE3LCAweDAwKTsgLyogcmVzZXQgZXZlcnl0aGluZyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4YmYxMCwgMHgwMCk7IC8qIG5vcm1hbCBvcGVyYXRpb24gKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDAwMTAsIDB4MDEpOyAvKiBzZXJpYWwgYnVzLCBTRFMgaGlnaCAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAwMCwgMHgwMSk7IC8qIHNlcmlhbCBidXMsIFNEUyBsb3cgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDAwMTAsIDB4MDEpOyAvKiAuLmhpZ2ggJ2JlZXAtYmVlcCcgKi8KKworCWlmIChlcnIpCisJCURCRygyLCAiQ291bGRuJ3QgdHVybiBvbiB0aGUgTEVEIikKKworCURCRyg1LCAiTEVEIHR1cm5lZCBvbiIpCisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV3JpdGUgc29tZSByZWdpc3RlcnMgZm9yIHRoZSBkZXZpY2UgaW5pdGlhbGl6YXRpb24uCisgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2Ugb24gb3BlbigpLgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9pbml0X2NoaXAoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJdW5zaWduZWQgbG9uZyBod19idWZzaXplID0gY2FtLT5tYXh3aWR0aCpjYW0tPm1heGhlaWdodCoyLAorCSAgICAgICAgICAgICAgeTAgPSAweDAwMDAsCisJICAgICAgICAgICAgICB1MCA9IHkwICsgaHdfYnVmc2l6ZS8yLAorCSAgICAgICAgICAgICAgdjAgPSB1MCArIGh3X2J1ZnNpemUvNCwKKwkgICAgICAgICAgICAgIHkxID0gdjAgKyBod19idWZzaXplLzQsCisJICAgICAgICAgICAgICB1MSA9IHkxICsgaHdfYnVmc2l6ZS8yLAorCSAgICAgICAgICAgICAgdjEgPSB1MSArIGh3X2J1ZnNpemUvNDsKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4ZmYwMCwgMHgwMCk7IC8qIHBvd2VyIG9mZiAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4YmYxMCwgMHgwMCk7IC8qIHBvd2VyIG9uICovCisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDQwNWQsIDB4MDMpOyAvKiBEUkFNIHRpbWluZ3MgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDAwMzAsIDB4MDQpOyAvKiBTRFJBTSB0aW1pbmdzICovCisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB5MCAmIDB4ZmZmZiwgMHgyMCk7IC8qIFkgYnVmLjAsIGxvdyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHkwID4+IDE2LCAweDIxKTsgICAgLyogWSBidWYuMCwgaGlnaCAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHUwICYgMHhmZmZmLCAweDI0KTsgLyogVSBidWYuMCwgbG93ICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdTAgPj4gMTYsIDB4MjUpOyAgICAvKiBVIGJ1Zi4wLCBoaWdoICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdjAgJiAweGZmZmYsIDB4MjgpOyAvKiBWIGJ1Zi4wLCBsb3cgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB2MCA+PiAxNiwgMHgyOSk7ICAgIC8qIFYgYnVmLjAsIGhpZ2ggKi8KKworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHkxICYgMHhmZmZmLCAweDIyKTsgLyogWSBidWYuMSwgbG93ICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgeTEgPj4gMTYsIDB4MjMpOyAgICAvKiBZIGJ1Zi4xLCBoaWdoICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdTEgJiAweGZmZmYsIDB4MjYpOyAvKiBVIGJ1Zi4xLCBsb3cgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB1MSA+PiAxNiwgMHgyNyk7ICAgIC8qIFUgYnVmLjEsIGhpZ2ggKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB2MSAmIDB4ZmZmZiwgMHgyYSk7IC8qIFYgYnVmLjEsIGxvdyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHYxID4+IDE2LCAweDJiKTsgICAgLyogViBidWYuMSwgaGlnaCAqLworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgeTEgJiAweGZmZmYsIDB4MzIpOyAvKiBKUEVHIGJ1ZiAwIGxvdyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHkxID4+IDE2LCAweDMzKTsgICAgLyogSlBFRyBidWYgMCBoaWdoICovCisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB5MSAmIDB4ZmZmZiwgMHgzNCk7IC8qIEpQRUcgYnVmIDEgbG93ICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgeTEgPj4gMTYsIDB4MzUpOyAgICAvKiBKUEVHIGJ1ZyAxIGhpZ2ggKi8KKworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAwMCwgMHgzNik7LyogSlBFRyByZXN0YXJ0IGludGVydmFsICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwODA0LCAweDM3KTsvKkpQRUcgVkxFIEZJRk8gdGhyZXNob2xkKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDAwMDAsIDB4MzgpOy8qIGRpc2FibGUgaHcgdXAtc2NhbGluZyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAwMCwgMHgzZik7IC8qIEpQRUcvTUNUTCB0ZXN0IGRhdGEgKi8KKworCWVyciArPSB3OTk2OGNmX3NldF9waWN0dXJlKGNhbSwgY2FtLT5waWN0dXJlKTsgLyogdGhpcyBiZWZvcmUgKi8KKwllcnIgKz0gdzk5NjhjZl9zZXRfd2luZG93KGNhbSwgY2FtLT53aW5kb3cpOworCisJaWYgKGVycikKKwkJREJHKDEsICJDaGlwIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpCisJZWxzZQorCQlEQkcoNSwgIkNoaXAgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIikKKworCXJldHVybiBlcnI7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHBhbGV0dGUgaXMgc3VwcG9ydGVkLCAwIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGlubGluZSB1MTYgdzk5NjhjZl92YWxpZF9wYWxldHRlKHUxNiBwYWxldHRlKQoreworCXU4IGkgPSAwOworCXdoaWxlICh3OTk2OGNmX2Zvcm1hdGxpc3RbaV0ucGFsZXR0ZSAhPSAwKSB7CisJCWlmIChwYWxldHRlID09IHc5OTY4Y2ZfZm9ybWF0bGlzdFtpXS5wYWxldHRlKQorCQkJcmV0dXJuIHBhbGV0dGU7CisJCWkrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBSZXR1cm4gdGhlIGRlcHRoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHBhbGV0dGUuCisgIFBhbGV0dGUgX211c3RfIGJlIHN1cHBvcnRlZCAhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbmxpbmUgdTE2IHc5OTY4Y2ZfdmFsaWRfZGVwdGgodTE2IHBhbGV0dGUpCit7CisJdTggaT0wOworCXdoaWxlICh3OTk2OGNmX2Zvcm1hdGxpc3RbaV0ucGFsZXR0ZSAhPSBwYWxldHRlKQorCQlpKys7CisKKwlyZXR1cm4gdzk5NjhjZl9mb3JtYXRsaXN0W2ldLmRlcHRoOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBmb3JtYXQgcmVxdWlyZXMgZGVjb21wcmVzc2lvbiwgMCBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbmxpbmUgdTggdzk5NjhjZl9uZWVkX2RlY29tcHJlc3Npb24odTE2IHBhbGV0dGUpCit7CisJdTggaSA9IDA7CisJd2hpbGUgKHc5OTY4Y2ZfZm9ybWF0bGlzdFtpXS5wYWxldHRlICE9IDApIHsKKwkJaWYgKHBhbGV0dGUgPT0gdzk5NjhjZl9mb3JtYXRsaXN0W2ldLnBhbGV0dGUpCisJCQlyZXR1cm4gdzk5NjhjZl9mb3JtYXRsaXN0W2ldLmNvbXByZXNzaW9uOworCQlpKys7CisJfQorCXJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQ2hhbmdlIHRoZSBwaWN0dXJlIHNldHRpbmdzIG9mIHRoZSBjYW1lcmEuCisgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAordzk5NjhjZl9zZXRfcGljdHVyZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdCkKK3sKKwl1MTYgZm10LCBod19kZXB0aCwgaHdfcGFsZXR0ZSwgcmVnX3YgPSAweDAwMDA7CisJaW50IGVyciA9IDA7CisKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIHVzaW5nIGEgdmFsaWQgZGVwdGggKi8KKwlwaWN0LmRlcHRoID0gdzk5NjhjZl92YWxpZF9kZXB0aChwaWN0LnBhbGV0dGUpOworCisJZm10ID0gcGljdC5wYWxldHRlOworCisJaHdfZGVwdGggPSBwaWN0LmRlcHRoOyAvKiBkZXB0aCB1c2VkIGJ5IHRoZSB3aW5ib25kIGNoaXAgKi8KKwlod19wYWxldHRlID0gcGljdC5wYWxldHRlOyAvKiBwYWxldHRlIHVzZWQgYnkgdGhlIHdpbmJvbmQgY2hpcCAqLworCisJLyogVlMgJiBIUyBwb2xhcml0aWVzICovCisJcmVnX3YgPSAoY2FtLT52c19wb2xhcml0eSA8PCAxMikgfCAoY2FtLT5oc19wb2xhcml0eSA8PCAxMSk7CisKKwlzd2l0Y2ggKGZtdCkKKwl7CisJCWNhc2UgVklERU9fUEFMRVRURV9VWVZZOgorCQkJcmVnX3YgfD0gMHgwMDAwOworCQkJY2FtLT52cHBfZmxhZyA9IFZQUF9OT05FOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjJQOgorCQkJcmVnX3YgfD0gMHgwMDAyOworCQkJY2FtLT52cHBfZmxhZyA9IFZQUF9ERUNPTVBSRVNTSU9OOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjA6CisJCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjBQOgorCQkJcmVnX3YgfD0gMHgwMDAzOworCQkJY2FtLT52cHBfZmxhZyA9IFZQUF9ERUNPTVBSRVNTSU9OOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fUEFMRVRURV9ZVVlWOgorCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIyOgorCQkJcmVnX3YgfD0gMHgwMDAwOworCQkJY2FtLT52cHBfZmxhZyA9IFZQUF9TV0FQX1lVVl9CWVRFUzsKKwkJCWh3X3BhbGV0dGUgPSBWSURFT19QQUxFVFRFX1VZVlk7CisJCQlicmVhazsKKwkJLyogT3JpZ2luYWwgdmlkZW8gaXMgdXNlZCBpbnN0ZWFkIG9mIFJHQlggcGFsZXR0ZXMuIAorCQkgICBTb2Z0d2FyZSBjb252ZXJzaW9uIGxhdGVyLiAqLworCQljYXNlIFZJREVPX1BBTEVUVEVfR1JFWToKKwkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU1NToKKwkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU2NToKKwkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjI0OgorCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCMzI6CisJCQlyZWdfdiB8PSAweDAwMDA7IC8qIFVZVlkgMTYgYml0IGlzIHVzZWQgKi8KKwkJCWh3X2RlcHRoID0gMTY7CisJCQlod19wYWxldHRlID0gVklERU9fUEFMRVRURV9VWVZZOworCQkJY2FtLT52cHBfZmxhZyA9IFZQUF9VWVZZX1RPX1JHQlg7CisJCQlicmVhazsKKwl9CisKKwkvKiBOT1RFOiBkdWUgdG8gbWVtb3J5IGlzc3VlcywgaXQgaXMgYmV0dGVyIHRvIGRpc2FibGUgdGhlIGhhcmR3YXJlCisJICAgICAgICAgZG91YmxlIGJ1ZmZlcmluZyBkdXJpbmcgY29tcHJlc3Npb24gKi8KKwlpZiAoY2FtLT5kb3VibGVfYnVmZmVyICYmICEoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKSkKKwkJcmVnX3YgfD0gMHgwMDgwOworCisJaWYgKGNhbS0+Y2xhbXBpbmcpCisJCXJlZ192IHw9IDB4MDAyMDsKKworCWlmIChjYW0tPmZpbHRlcl90eXBlID09IDEpCisJCXJlZ192IHw9IDB4MDAwODsKKwllbHNlIGlmIChjYW0tPmZpbHRlcl90eXBlID09IDIpCisJCXJlZ192IHw9IDB4MDAwYzsKKworCWlmICgoZXJyID0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCByZWdfdiwgMHgxNikpKQorCQlnb3RvIGVycm9yOworCisJaWYgKChlcnIgPSB3OTk2OGNmX3NlbnNvcl91cGRhdGVfcGljdHVyZShjYW0sIHBpY3QpKSkKKwkJZ290byBlcnJvcjsKKworCS8qIElmIGFsbCB3ZW50IHdlbGwsIHVwZGF0ZSB0aGUgZGV2aWNlIGRhdGEgc3RydWN0dXJlICovCisJbWVtY3B5KCZjYW0tPnBpY3R1cmUsICZwaWN0LCBzaXplb2YocGljdCkpOworCWNhbS0+aHdfZGVwdGggPSBod19kZXB0aDsKKwljYW0tPmh3X3BhbGV0dGUgPSBod19wYWxldHRlOworCisJLyogU2V0dGluZ3MgY2hhbmdlZCwgc28gd2UgY2xlYXIgdGhlIGZyYW1lIGJ1ZmZlcnMgKi8KKwltZW1zZXQoY2FtLT5mcmFtZVswXS5idWZmZXIsIDAsIGNhbS0+bmJ1ZmZlcnMqY2FtLT5mcmFtZVswXS5zaXplKTsKKworCURCRyg0LCAiUGFsZXR0ZSBpcyAlcywgZGVwdGggaXMgJXUgYnBwIiwKKwkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgcGljdC5wYWxldHRlKSwgcGljdC5kZXB0aCkKKworCXJldHVybiAwOworCitlcnJvcjoKKwlEQkcoMSwgIkZhaWxlZCB0byBjaGFuZ2UgcGljdHVyZSBzZXR0aW5ncyIpCisJcmV0dXJuIGVycjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIENoYW5nZSB0aGUgY2FwdHVyZSBhcmVhIHNpemUgb2YgdGhlIGNhbWVyYS4KKyAgVGhpcyBmdW5jdGlvbiBfbXVzdF8gYmUgY2FsbGVkIF9hZnRlcl8gdzk5NjhjZl9zZXRfcGljdHVyZSgpLgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQKK3c5OTY4Y2Zfc2V0X3dpbmRvdyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgc3RydWN0IHZpZGVvX3dpbmRvdyB3aW4pCit7CisJdTE2IHgsIHksIHcsIGgsIHNjeCwgc2N5LCBjdywgY2gsIGF4LCBheTsKKwl1bnNpZ25lZCBsb25nIGZ3LCBmaDsKKwlzdHJ1Y3Qgb3ZjYW1jaGlwX3dpbmRvdyBzX3dpbjsKKwlpbnQgZXJyID0gMDsKKworCS8qIFdvcmsgYXJvdW5kIHRvIGF2b2lkIEZQIGFyaXRobWV0aWNzICovCisJI2RlZmluZSBfX1NDKHgpICgoeCkgPDwgMTApCisJI2RlZmluZSBfX1VOU0MoeCkgKCh4KSA+PiAxMCkKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgdXNpbmcgYSBzdXBwb3J0ZWQgcmVzb2x1dGlvbiAqLworCWlmICgoZXJyID0gdzk5NjhjZl9hZGp1c3Rfd2luZG93X3NpemUoY2FtLCAodTE2Kikmd2luLndpZHRoLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MTYqKSZ3aW4uaGVpZ2h0KSkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTY2FsaW5nIGZhY3RvcnMgKi8KKwlmdyA9IF9fU0Mod2luLndpZHRoKSAvIGNhbS0+bWF4d2lkdGg7CisJZmggPSBfX1NDKHdpbi5oZWlnaHQpIC8gY2FtLT5tYXhoZWlnaHQ7CisKKwkvKiBTZXQgdXAgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIHVzZWQgYnkgdGhlIGNoaXAgKi8KKwlpZiAoKHdpbi53aWR0aCA+IGNhbS0+bWF4d2lkdGgpIHx8ICh3aW4uaGVpZ2h0ID4gY2FtLT5tYXhoZWlnaHQpKSB7CisJCWNhbS0+dnBwX2ZsYWcgfD0gVlBQX1VQU0NBTEU7CisJCS8qIENhbGN1bGF0ZSBsYXJnZXN0IHcsaCBtYW50YWluaW5nIHRoZSBzYW1lIHcvaCByYXRpbyAqLworCQl3ID0gKGZ3ID49IGZoKSA/IGNhbS0+bWF4d2lkdGggOiBfX1NDKHdpbi53aWR0aCkvZmg7CisJCWggPSAoZncgPj0gZmgpID8gX19TQyh3aW4uaGVpZ2h0KS9mdyA6IGNhbS0+bWF4aGVpZ2h0OworCQlpZiAodyA8IGNhbS0+bWlud2lkdGgpIC8qIGp1c3QgaW4gY2FzZSAqLworCQkJdyA9IGNhbS0+bWlud2lkdGg7CisJCWlmIChoIDwgY2FtLT5taW5oZWlnaHQpIC8qIGp1c3QgaW4gY2FzZSAqLworCQkJaCA9IGNhbS0+bWluaGVpZ2h0OworCX0gZWxzZSB7CisJCWNhbS0+dnBwX2ZsYWcgJj0gflZQUF9VUFNDQUxFOworCQl3ID0gd2luLndpZHRoOworCQloID0gd2luLmhlaWdodDsKKwl9CisKKwkvKiB4LHkgb2Zmc2V0cyBvZiB0aGUgY3JvcHBlZCBhcmVhICovCisJc2N4ID0gY2FtLT5zdGFydF9jcm9weDsKKwlzY3kgPSBjYW0tPnN0YXJ0X2Nyb3B5OworCisJLyogQ2FsY3VsYXRlIGNyb3BwZWQgYXJlYSBtYW50ZWluaW5nIHRoZSByaWdodCB3L2ggcmF0aW8gKi8KKwlpZiAoY2FtLT5sYXJnZXZpZXcgJiYgIShjYW0tPnZwcF9mbGFnICYgVlBQX1VQU0NBTEUpKSB7CisJCWN3ID0gKGZ3ID49IGZoKSA/IGNhbS0+bWF4d2lkdGggOiBfX1NDKHdpbi53aWR0aCkvZmg7CisJCWNoID0gKGZ3ID49IGZoKSA/IF9fU0Mod2luLmhlaWdodCkvZncgOiBjYW0tPm1heGhlaWdodDsKKwl9IGVsc2UgeworCQljdyA9IHc7CisJCWNoID0gaDsKKwl9CisKKwkvKiBTZXR1cCB0aGUgd2luZG93IG9mIHRoZSBzZW5zb3IgKi8KKwlzX3dpbi5mb3JtYXQgPSBWSURFT19QQUxFVFRFX1VZVlk7CisJc193aW4ud2lkdGggPSBjYW0tPm1heHdpZHRoOworCXNfd2luLmhlaWdodCA9IGNhbS0+bWF4aGVpZ2h0OworCXNfd2luLnF1YXJ0ZXIgPSAwOyAvKiBmdWxsIHByb2dyZXNzaXZlIHZpZGVvICovCisKKwkvKiBDZW50ZXIgaXQgKi8KKwlzX3dpbi54ID0gKHNfd2luLndpZHRoIC0gY3cpIC8gMjsKKwlzX3dpbi55ID0gKHNfd2luLmhlaWdodCAtIGNoKSAvIDI7CisKKwkvKiBDbG9jayBkaXZpc29yICovCisJaWYgKGNhbS0+Y2xvY2tkaXYgPj0gMCkKKwkJc193aW4uY2xvY2tkaXYgPSBjYW0tPmNsb2NrZGl2OyAvKiBtYW51YWwgb3ZlcnJpZGUgKi8KKwllbHNlCisJCXN3aXRjaCAoY2FtLT5zZW5zb3IpIHsKKwkJCWNhc2UgQ0NfT1Y2NjIwOgorCQkJCXNfd2luLmNsb2NrZGl2ID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0NfT1Y2NjMwOgorCQkJCXNfd2luLmNsb2NrZGl2ID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0NfT1Y3NkJFOgorCQkJY2FzZSBDQ19PVjc2MTA6CisJCQljYXNlIENDX09WNzYyMDoKKwkJCQlzX3dpbi5jbG9ja2RpdiA9IDA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNfd2luLmNsb2NrZGl2ID0gVzk5NjhDRl9ERUZfQ0xPQ0tESVZJU09SOworCQl9CisKKwkvKiBXZSBoYXZlIHRvIHNjYWxlIHdpbi54IGFuZCB3aW4ueSBvZmZzZXRzICovCisJaWYgKCAoY2FtLT5sYXJnZXZpZXcgJiYgIShjYW0tPnZwcF9mbGFnICYgVlBQX1VQU0NBTEUpKQorCSAgICAgfHwgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfVVBTQ0FMRSkgKSB7CisJCWF4ID0gX19TQyh3aW4ueCkvZnc7CisJCWF5ID0gX19TQyh3aW4ueSkvZmg7CisJfSBlbHNlIHsKKwkJYXggPSB3aW4ueDsKKwkJYXkgPSB3aW4ueTsKKwl9CisKKwlpZiAoKGF4ICsgY3cpID4gY2FtLT5tYXh3aWR0aCkKKwkJYXggPSBjYW0tPm1heHdpZHRoIC0gY3c7CisKKwlpZiAoKGF5ICsgY2gpID4gY2FtLT5tYXhoZWlnaHQpCisJCWF5ID0gY2FtLT5tYXhoZWlnaHQgLSBjaDsKKworCS8qIEFkanVzdCB3aW4ueCwgd2luLnkgKi8KKwlpZiAoIChjYW0tPmxhcmdldmlldyAmJiAhKGNhbS0+dnBwX2ZsYWcgJiBWUFBfVVBTQ0FMRSkpCisJICAgICB8fCAoY2FtLT52cHBfZmxhZyAmIFZQUF9VUFNDQUxFKSApIHsKKwkJd2luLnggPSBfX1VOU0MoYXgqZncpOworCQl3aW4ueSA9IF9fVU5TQyhheSpmaCk7CisJfSBlbHNlIHsKKwkJd2luLnggPSBheDsKKwkJd2luLnkgPSBheTsKKwl9CisKKwkvKiBPZmZzZXRzIHVzZWQgYnkgdGhlIGNoaXAgKi8KKwl4ID0gYXggKyBzX3dpbi54OworCXkgPSBheSArIHNfd2luLnk7CisKKwkvKiBHbyAhICovCisJaWYgKChlcnIgPSB3OTk2OGNmX3NlbnNvcl9jbWQoY2FtLCBPVkNBTUNISVBfQ01EX1NfTU9ERSwgJnNfd2luKSkpCisJCWdvdG8gZXJyb3I7CisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCBzY3ggKyB4LCAweDEwKTsKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCBzY3kgKyB5LCAweDExKTsKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCBzY3ggKyB4ICsgY3csIDB4MTIpOworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHNjeSArIHkgKyBjaCwgMHgxMyk7CisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdywgMHgxNCk7CisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgaCwgMHgxNSk7CisKKwkvKiBKUEVHIHdpZHRoICYgaGVpZ2h0ICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdywgMHgzMCk7CisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgaCwgMHgzMSk7CisKKwkvKiBZICYgVVYgZnJhbWUgYnVmZmVyIHN0cmlkZXMgKGluIFdPUkQpICovCisJaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfREVDT01QUkVTU0lPTikgeworCQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB3LzIsIDB4MmMpOworCQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB3LzQsIDB4MmQpOworCX0gZWxzZQorCQllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB3LCAweDJjKTsKKworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBJZiBhbGwgd2VudCB3ZWxsLCB1cGRhdGUgdGhlIGRldmljZSBkYXRhIHN0cnVjdHVyZSAqLworCW1lbWNweSgmY2FtLT53aW5kb3csICZ3aW4sIHNpemVvZih3aW4pKTsKKwljYW0tPmh3X3dpZHRoID0gdzsKKwljYW0tPmh3X2hlaWdodCA9IGg7CisKKwkvKiBTZXR0aW5ncyBjaGFuZ2VkLCBzbyB3ZSBjbGVhciB0aGUgZnJhbWUgYnVmZmVycyAqLworCW1lbXNldChjYW0tPmZyYW1lWzBdLmJ1ZmZlciwgMCwgY2FtLT5uYnVmZmVycypjYW0tPmZyYW1lWzBdLnNpemUpOworCisJREJHKDQsICJUaGUgY2FwdHVyZSBhcmVhIGlzICVkeCVkLCBPZmZzZXQgKHgseSk9KCV1LCV1KSIsIAorCSAgICB3aW4ud2lkdGgsIHdpbi5oZWlnaHQsIHdpbi54LCB3aW4ueSkKKworCVBEQkdHKCJ4PSV1ICx5PSV1LCB3PSV1LCBoPSV1LCBheD0ldSwgYXk9JXUsIHNfd2luLng9JXUsIHNfd2luLnk9JXUsICIKKwkgICAgICAiY3c9JXUsIGNoPSV1LCB3aW4ueD0ldSwgd2luLnk9JXUsIHdpbi53aWR0aD0ldSwgd2luLmhlaWdodD0ldSIsCisJICAgICAgeCwgeSwgdywgaCwgYXgsIGF5LCBzX3dpbi54LCBzX3dpbi55LCBjdywgY2gsIHdpbi54LCB3aW4ueSwKKwkgICAgICB3aW4ud2lkdGgsIHdpbi5oZWlnaHQpCisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJREJHKDEsICJGYWlsZWQgdG8gY2hhbmdlIHRoZSBjYXB0dXJlIGFyZWEgc2l6ZSIpCisJcmV0dXJuIGVycjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICBBZGp1c3QgdGhlIGFza2VkIHZhbHVlcyBmb3Igd2luZG93IHdpZHRoIGFuZCBoZWlnaHQuCisgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCAKK3c5OTY4Y2ZfYWRqdXN0X3dpbmRvd19zaXplKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCB1MTYqIHdpZHRoLCB1MTYqIGhlaWdodCkKK3sKKwl1MTYgbWF4dywgbWF4aDsKKworCWlmICgoKndpZHRoIDwgY2FtLT5taW53aWR0aCkgfHwgKCpoZWlnaHQgPCBjYW0tPm1pbmhlaWdodCkpCisJCXJldHVybiAtRVJBTkdFOworCisJbWF4dyA9IGNhbS0+dXBzY2FsaW5nICYmICEoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKSAmJgorCSAgICAgICB3OTk2OGNmX3ZwcCA/IG1heCgodTE2KVc5OTY4Q0ZfTUFYX1dJRFRILCBjYW0tPm1heHdpZHRoKQorCSAgICAgICAgICAgICAgICAgICA6IGNhbS0+bWF4d2lkdGg7CisJbWF4aCA9IGNhbS0+dXBzY2FsaW5nICYmICEoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKSAmJgorCSAgICAgICB3OTk2OGNmX3ZwcCA/IG1heCgodTE2KVc5OTY4Q0ZfTUFYX0hFSUdIVCwgY2FtLT5tYXhoZWlnaHQpCisJICAgICAgICAgICAgICAgICAgIDogY2FtLT5tYXhoZWlnaHQ7CisKKwlpZiAoKndpZHRoID4gbWF4dykKKwkJKndpZHRoID0gbWF4dzsKKwlpZiAoKmhlaWdodCA+IG1heGgpCisJCSpoZWlnaHQgPSBtYXhoOworCisJaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfREVDT01QUkVTU0lPTikgeworCQkqd2lkdGggICY9IH4xNUw7IC8qIG11bHRpcGxlIG9mIDE2ICovCisJCSpoZWlnaHQgJj0gfjE1TDsKKwl9CisKKwlQREJHRygiV2luZG93IHNpemUgYWRqdXN0ZWQgdz0ldSwgaD0ldSAiLCAqd2lkdGgsICpoZWlnaHQpCisKKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEluaXRpYWxpemUgdGhlIEZJRk8gbGlzdCBvZiByZXF1ZXN0ZWQgZnJhbWVzLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCB3OTk2OGNmX2luaXRfZnJhbWVsaXN0KHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCXU4IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKSB7CisJCWNhbS0+cmVxdWVzdGVkX2ZyYW1lW2ldID0gTlVMTDsKKwkJY2FtLT5mcmFtZVtpXS5xdWV1ZWQgPSAwOworCQljYW0tPmZyYW1lW2ldLnN0YXR1cyA9IEZfVU5VU0VEOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEFkZCBhIGZyYW1lIGluIHRoZSBGSUZPIGxpc3Qgb2YgcmVxdWVzdGVkIGZyYW1lcy4KKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0LgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCB3OTk2OGNmX3B1c2hfZnJhbWUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHU4IGZfbnVtKQoreworCXU4IGY7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+Zmxpc3RfbG9jaywgbG9ja19mbGFncyk7CisKKwlmb3IgKGY9MDsgY2FtLT5yZXF1ZXN0ZWRfZnJhbWVbZl0gIT0gTlVMTDsgZisrKTsKKwljYW0tPnJlcXVlc3RlZF9mcmFtZVtmXSA9ICZjYW0tPmZyYW1lW2ZfbnVtXTsKKwljYW0tPmZyYW1lW2ZfbnVtXS5xdWV1ZWQgPSAxOworCWNhbS0+ZnJhbWVbZl9udW1dLnN0YXR1cyA9IEZfVU5VU0VEOyAvKiBjbGVhciB0aGUgc3RhdHVzICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmZsaXN0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJREJHKDYsICJGcmFtZSAjJXUgcHVzaGVkIGludG8gdGhlIEZJRk8gbGlzdC4gUG9zaXRpb24gJXUiLCBmX251bSwgZikKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJlYWQsIHN0b3JlIGFuZCByZW1vdmUgdGhlIGZpcnN0IHBvaW50ZXIgaW4gdGhlIEZJRk8gbGlzdCBvZiByZXF1ZXN0ZWQKKyAgZnJhbWVzLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dC4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgCit3OTk2OGNmX3BvcF9mcmFtZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCoqIGZyYW1lcCkKK3sKKwl1OCBpOworCisJc3Bpbl9sb2NrKCZjYW0tPmZsaXN0X2xvY2spOworCisJKmZyYW1lcCA9IGNhbS0+cmVxdWVzdGVkX2ZyYW1lWzBdOworCisJLyogU2hpZnQgdGhlIGxpc3Qgb2YgcG9pbnRlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVycy0xOyBpKyspCisJCWNhbS0+cmVxdWVzdGVkX2ZyYW1lW2ldID0gY2FtLT5yZXF1ZXN0ZWRfZnJhbWVbaSsxXTsKKwljYW0tPnJlcXVlc3RlZF9mcmFtZVtpXSA9IE5VTEw7CisKKwlzcGluX3VubG9jaygmY2FtLT5mbGlzdF9sb2NrKTsKKworCURCRyg2LCJQb3BwZWQgZnJhbWUgIyVkIGZyb20gdGhlIGxpc3QiLCAoKmZyYW1lcCktPm51bWJlcikKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEhpZ2gtbGV2ZWwgdmlkZW8gcG9zdC1wcm9jZXNzaW5nIHJvdXRpbmUgb24gZ3JhYmJlZCBmcmFtZXMuCisgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCAKK3c5OTY4Y2ZfcG9zdHByb2Nlc3NfZnJhbWUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiBmcikKK3sKKwl2b2lkICpwSW4gPSBmci0+YnVmZmVyLCAqcE91dCA9IGNhbS0+ZnJhbWVfdnBwLmJ1ZmZlciwgKnRtcDsKKwl1MTYgdyA9IGNhbS0+d2luZG93LndpZHRoLAorCSAgICBoID0gY2FtLT53aW5kb3cuaGVpZ2h0LAorCSAgICBkID0gY2FtLT5waWN0dXJlLmRlcHRoLAorCSAgICBmbXQgPSBjYW0tPnBpY3R1cmUucGFsZXR0ZSwKKwkgICAgcmdiID0gY2FtLT5mb3JjZV9yZ2IsCisJICAgIGh3X3cgPSBjYW0tPmh3X3dpZHRoLAorCSAgICBod19oID0gY2FtLT5od19oZWlnaHQsCisJICAgIGh3X2QgPSBjYW0tPmh3X2RlcHRoOworCWludCBlcnIgPSAwOworCisJI2RlZmluZSBfUFNXQVAocEluLCBwT3V0KSB7dG1wID0gKHBJbik7IChwSW4pID0gKHBPdXQpOyAocE91dCkgPSB0bXA7fQorCisJaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfREVDT01QUkVTU0lPTikgeworCQltZW1jcHkocE91dCwgcEluLCBmci0+bGVuZ3RoKTsKKwkJX1BTV0FQKHBJbiwgcE91dCkKKwkJZXJyID0gdzk5NjhjZl92cHAtPmRlY29kZShwSW4sIGZyLT5sZW5ndGgsIGh3X3csIGh3X2gsIHBPdXQpOworCQlQREJHRygiQ29tcHJlc3NlZCBmcmFtZSBsZW5ndGg6ICVsdSIsKHVuc2lnbmVkIGxvbmcpZnItPmxlbmd0aCkKKwkJZnItPmxlbmd0aCA9IChod193Kmh3X2gqaHdfZCkvODsKKwkJX1BTV0FQKHBJbiwgcE91dCkKKwkJaWYgKGVycikgeworCQkJREJHKDQsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBkZWNvZGluZyB0aGUgZnJhbWU6ICIKKwkJCSAgICAgICAiJXMiLCBzeW1ib2xpYyhkZWNvZGVyX2Vycmxpc3QsIGVycikpCisJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UKKwkJCURCRyg2LCAiRnJhbWUgZGVjb2RlZCIpCisJfQorCisJaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfU1dBUF9ZVVZfQllURVMpIHsKKwkJdzk5NjhjZl92cHAtPnN3YXBfeXV2Ynl0ZXMocEluLCBmci0+bGVuZ3RoKTsKKwkJREJHKDYsICJPcmlnaW5hbCBVWVZZIGNvbXBvbmVudCBvcmRlcmluZyBjaGFuZ2VkIikKKwl9CisKKwlpZiAoY2FtLT52cHBfZmxhZyAmIFZQUF9VUFNDQUxFKSB7CisJCXc5OTY4Y2ZfdnBwLT5zY2FsZV91cChwSW4sIHBPdXQsIGh3X3csIGh3X2gsIGh3X2QsIHcsIGgpOworCQlmci0+bGVuZ3RoID0gKHcqaCpod19kKS84OworCQlfUFNXQVAocEluLCBwT3V0KQorCQlEQkcoNiwgIlZlcnRpY2FsIHVwLXNjYWxpbmcgZG9uZTogJXUsJXUsJXVicHAtPiV1LCV1IiwKKwkJICAgIGh3X3csIGh3X2gsIGh3X2QsIHcsIGgpCisJfQorCisJaWYgKGNhbS0+dnBwX2ZsYWcgJiBWUFBfVVlWWV9UT19SR0JYKSB7CisJCXc5OTY4Y2ZfdnBwLT51eXZ5X3RvX3JnYngocEluLCBmci0+bGVuZ3RoLCBwT3V0LCBmbXQsIHJnYik7CisJCWZyLT5sZW5ndGggPSAodypoKmQpLzg7CisJCV9QU1dBUChwSW4sIHBPdXQpCisJCURCRyg2LCAiVVlWWS0xNmJpdCB0byAlcyBjb252ZXJzaW9uIGRvbmUiLCAKKwkJICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIGZtdCkpCisJfQorCisJaWYgKHBPdXQgPT0gZnItPmJ1ZmZlcikKKwkJbWVtY3B5KGZyLT5idWZmZXIsIGNhbS0+ZnJhbWVfdnBwLmJ1ZmZlciwgZnItPmxlbmd0aCk7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbWFnZSBzZW5zb3IgY29udHJvbCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgCit3OTk2OGNmX3NlbnNvcl9zZXRfY29udHJvbChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgaW50IGNpZCwgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgb3ZjYW1jaGlwX2NvbnRyb2wgY3RsOworCWludCBlcnI7CisKKwljdGwuaWQgPSBjaWQ7CisJY3RsLnZhbHVlID0gdmFsOworCisJZXJyID0gdzk5NjhjZl9zZW5zb3JfY21kKGNhbSwgT1ZDQU1DSElQX0NNRF9TX0NUUkwsICZjdGwpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IAordzk5NjhjZl9zZW5zb3JfZ2V0X2NvbnRyb2woc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIGludCBjaWQsIGludCogdmFsKQoreworCXN0cnVjdCBvdmNhbWNoaXBfY29udHJvbCBjdGw7CisJaW50IGVycjsKKworCWN0bC5pZCA9IGNpZDsKKworCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX2NtZChjYW0sIE9WQ0FNQ0hJUF9DTURfR19DVFJMLCAmY3RsKTsKKwlpZiAoIWVycikKKwkJKnZhbCA9IGN0bC52YWx1ZTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludAordzk5NjhjZl9zZW5zb3JfY21kKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkKiBhcmcpCit7CisJc3RydWN0IGkyY19jbGllbnQqIGMgPSBjYW0tPnNlbnNvcl9jbGllbnQ7CisJaW50IHJjID0gMDsKKworCWlmICghYyB8fCAhYy0+ZHJpdmVyIHx8ICFjLT5kcml2ZXItPmNvbW1hbmQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmMgPSBjLT5kcml2ZXItPmNvbW1hbmQoYywgY21kLCBhcmcpOworCS8qIFRoZSBJMkMgZHJpdmVyIHJldHVybnMgLUVQRVJNIG9uIG5vbi1zdXBwb3J0ZWQgY29udHJvbHMgKi8KKwlyZXR1cm4gKHJjIDwgMCAmJiByYyAhPSAtRVBFUk0pID8gcmMgOiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVXBkYXRlIHNvbWUgc2V0dGluZ3Mgb2YgdGhlIGltYWdlIHNlbnNvci4KKyAgUmV0dXJuczogMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9zZW5zb3JfdXBkYXRlX3NldHRpbmdzKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJLyogQXV0byBicmlnaHRuZXNzICovCisJZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0FVVE9CUklHSFQsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbS0+YXV0b19icnQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBBdXRvIGV4cG9zdXJlICovCisJZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0FVVE9FWFAsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbS0+YXV0b19leHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBCYW5kaW5nIGZpbHRlciAqLworCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9CQU5ERklMVCwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5iYW5kZmlsdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIExpZ2h0IGZyZXF1ZW5jeSAqLworCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9GUkVRLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbS0+bGlnaHRmcmVxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogQmFjayBsaWdodCAqLworCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9CQUNLTElHSFQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5iYWNrbGlnaHQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBNaXJyb3IgKi8KKwllcnIgPSB3OTk2OGNmX3NlbnNvcl9zZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfTUlSUk9SLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbS0+bWlycm9yKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBHZXQgc29tZSBjdXJyZW50IHBpY3R1cmUgc2V0dGluZ3MgZnJvbSB0aGUgaW1hZ2Ugc2Vuc29yIGFuZCB1cGRhdGUgdGhlCisgIGludGVybmFsICdwaWN0dXJlJyBzdHJ1Y3R1cmUgb2YgdGhlIGNhbWVyYS4KKyAgUmV0dXJuczogMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9zZW5zb3JfZ2V0X3BpY3R1cmUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciwgdjsKKworCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX2dldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9DT05ULCAmdik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwljYW0tPnBpY3R1cmUuY29udHJhc3QgPSB2OworCisJZXJyID0gdzk5NjhjZl9zZW5zb3JfZ2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0JSSUdIVCwgJnYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJY2FtLT5waWN0dXJlLmJyaWdodG5lc3MgPSB2OworCisJZXJyID0gdzk5NjhjZl9zZW5zb3JfZ2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX1NBVCwgJnYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJY2FtLT5waWN0dXJlLmNvbG91ciA9IHY7CisKKwllcnIgPSB3OTk2OGNmX3NlbnNvcl9nZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfSFVFLCAmdik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwljYW0tPnBpY3R1cmUuaHVlID0gdjsKKworCURCRyg1LCAiR290IHBpY3R1cmUgc2V0dGluZ3MgZnJvbSB0aGUgaW1hZ2Ugc2Vuc29yIikKKworCVBEQkdHKCJCcmlnaHRuZXNzLCBjb250cmFzdCwgaHVlLCBjb2xvdXIsIHdoaXRlbmVzcyBhcmUgIgorCSAgICAgICIldSwldSwldSwldSwldSIsIGNhbS0+cGljdHVyZS5icmlnaHRuZXNzLGNhbS0+cGljdHVyZS5jb250cmFzdCwKKwkgICAgICBjYW0tPnBpY3R1cmUuaHVlLCBjYW0tPnBpY3R1cmUuY29sb3VyLCBjYW0tPnBpY3R1cmUud2hpdGVuZXNzKQorCisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBVcGRhdGUgcGljdHVyZSBzZXR0aW5ncyBvZiB0aGUgaW1hZ2Ugc2Vuc29yLgorICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAordzk5NjhjZl9zZW5zb3JfdXBkYXRlX3BpY3R1cmUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmICgoIWNhbS0+c2Vuc29yX2luaXRpYWxpemVkKQorCSAgICB8fCBwaWN0LmNvbnRyYXN0ICE9IGNhbS0+cGljdHVyZS5jb250cmFzdCkgeworCQllcnIgPSB3OTk2OGNmX3NlbnNvcl9zZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfQ09OVCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC5jb250cmFzdCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWw7CisJCURCRyg0LCAiQ29udHJhc3QgY2hhbmdlZCBmcm9tICV1IHRvICV1IiwKKwkJICAgIGNhbS0+cGljdHVyZS5jb250cmFzdCwgcGljdC5jb250cmFzdCkKKwkJY2FtLT5waWN0dXJlLmNvbnRyYXN0ID0gcGljdC5jb250cmFzdDsKKwl9CisKKwlpZiAoKCghY2FtLT5zZW5zb3JfaW5pdGlhbGl6ZWQpIHx8IAorCSAgICBwaWN0LmJyaWdodG5lc3MgIT0gY2FtLT5waWN0dXJlLmJyaWdodG5lc3MpICYmICghY2FtLT5hdXRvX2JydCkpIHsKKwkJZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0JSSUdIVCwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QuYnJpZ2h0bmVzcyk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWw7CisJCURCRyg0LCAiQnJpZ2h0bmVzcyBjaGFuZ2VkIGZyb20gJXUgdG8gJXUiLAorCQkgICAgY2FtLT5waWN0dXJlLmJyaWdodG5lc3MsIHBpY3QuYnJpZ2h0bmVzcykKKwkJY2FtLT5waWN0dXJlLmJyaWdodG5lc3MgPSBwaWN0LmJyaWdodG5lc3M7CisJfQorCisJaWYgKCghY2FtLT5zZW5zb3JfaW5pdGlhbGl6ZWQpIHx8IHBpY3QuY29sb3VyICE9IGNhbS0+cGljdHVyZS5jb2xvdXIpIHsKKwkJZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX1NBVCwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QuY29sb3VyKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbDsKKwkJREJHKDQsICJDb2xvdXIgY2hhbmdlZCBmcm9tICV1IHRvICV1IiwKKwkJICAgIGNhbS0+cGljdHVyZS5jb2xvdXIsIHBpY3QuY29sb3VyKQorCQljYW0tPnBpY3R1cmUuY29sb3VyID0gcGljdC5jb2xvdXI7CisJfQorCisJaWYgKCghY2FtLT5zZW5zb3JfaW5pdGlhbGl6ZWQpIHx8IHBpY3QuaHVlICE9IGNhbS0+cGljdHVyZS5odWUpIHsKKwkJZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0hVRSwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QuaHVlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbDsKKwkJREJHKDQsICJIdWUgY2hhbmdlZCBmcm9tICV1IHRvICV1IiwKKwkJICAgIGNhbS0+cGljdHVyZS5odWUsIHBpY3QuaHVlKQorCQljYW0tPnBpY3R1cmUuaHVlID0gcGljdC5odWU7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJREJHKDQsICJGYWlsZWQgdG8gY2hhbmdlIHNlbnNvciBwaWN0dXJlIHNldHRpbmciKQorCXJldHVybiBlcnI7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2FtZXJhIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBzdXBwb3J0ZWQgaW1hZ2Ugc2Vuc29yIGlzIGRldGVjdGVkLgorICBSZXR1cm4gMCBpZiB0aGUgaW5pdGlhbGl6YXRpb24gc3VjY2VlZHMsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl9pbml0KHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJaWYgKChlcnIgPSB3OTk2OGNmX3NlbnNvcl9jbWQoY2FtLCBPVkNBTUNISVBfQ01EX0lOSVRJQUxJWkUsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW0tPm1vbm9jaHJvbWUpKSkKKwkJZ290byBlcnJvcjsKKworCWlmICgoZXJyID0gdzk5NjhjZl9zZW5zb3JfY21kKGNhbSwgT1ZDQU1DSElQX0NNRF9RX1NVQlRZUEUsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW0tPnNlbnNvcikpKQorCQlnb3RvIGVycm9yOworCisJLyogTk9URTogTWFrZSBzdXJlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGEgbXVsdGlwbGUgb2YgMTYgKi8KKwlzd2l0Y2ggKGNhbS0+c2Vuc29yX2NsaWVudC0+YWRkcikgeworCQljYXNlIE9WNnh4MF9TSUQ6CisJCQljYW0tPm1heHdpZHRoID0gMzUyOworCQkJY2FtLT5tYXhoZWlnaHQgPSAyODg7CisJCQljYW0tPm1pbndpZHRoID0gNjQ7CisJCQljYW0tPm1pbmhlaWdodCA9IDQ4OworCQkJYnJlYWs7CisJCWNhc2UgT1Y3eHgwX1NJRDoKKwkJCWNhbS0+bWF4d2lkdGggPSA2NDA7CisJCQljYW0tPm1heGhlaWdodCA9IDQ4MDsKKwkJCWNhbS0+bWlud2lkdGggPSA2NDsKKwkJCWNhbS0+bWluaGVpZ2h0ID0gNDg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCRygxLCAiTm90IHN1cHBvcnRlZCBpbWFnZSBzZW5zb3IgZGV0ZWN0ZWQgZm9yICVzIiwKKwkJCSAgICBzeW1ib2xpYyhjYW1saXN0LCBjYW0tPmlkKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRoZXNlIHZhbHVlcyBkZXBlbmQgb24gdGhlIG9uZXMgaW4gdGhlIG92eHh4MC5jIHNvdXJjZXMgKi8KKwlzd2l0Y2ggKGNhbS0+c2Vuc29yKSB7CisJCWNhc2UgQ0NfT1Y3NjIwOgorCQkJY2FtLT5zdGFydF9jcm9weCA9IDI4NzsKKwkJCWNhbS0+c3RhcnRfY3JvcHkgPSAzNTsKKwkJCS8qIFNlZW1zIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIHRoZSBpbWFnZSBzZW5zb3IgKi8KKwkJCWNhbS0+dnNfcG9sYXJpdHkgPSAxOworCQkJY2FtLT5oc19wb2xhcml0eSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNhbS0+c3RhcnRfY3JvcHggPSAzMjA7CisJCQljYW0tPnN0YXJ0X2Nyb3B5ID0gMzU7CisJCQljYW0tPnZzX3BvbGFyaXR5ID0gMTsKKwkJCWNhbS0+aHNfcG9sYXJpdHkgPSAwOworCX0KKworCWlmICgoZXJyID0gdzk5NjhjZl9zZW5zb3JfdXBkYXRlX3NldHRpbmdzKGNhbSkpKQorCQlnb3RvIGVycm9yOworCisJaWYgKChlcnIgPSB3OTk2OGNmX3NlbnNvcl91cGRhdGVfcGljdHVyZShjYW0sIGNhbS0+cGljdHVyZSkpKQorCQlnb3RvIGVycm9yOworCisJY2FtLT5zZW5zb3JfaW5pdGlhbGl6ZWQgPSAxOworCisJREJHKDIsICIlcyBpbWFnZSBzZW5zb3IgaW5pdGlhbGl6ZWQiLCBzeW1ib2xpYyhzZW5saXN0LCBjYW0tPnNlbnNvcikpCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWNhbS0+c2Vuc29yX2luaXRpYWxpemVkID0gMDsKKwljYW0tPnNlbnNvciA9IENDX1VOS05PV047CisJREJHKDEsICJJbWFnZSBzZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkIGZvciAlcyAoL2Rldi92aWRlbyVkKS4gIgorCSAgICAgICAiVHJ5IHRvIGRldGFjaCBhbmQgYXR0YWNoIHRoaXMgZGV2aWNlIGFnYWluIiwKKwkgICAgc3ltYm9saWMoY2FtbGlzdCwgY2FtLT5pZCksIGNhbS0+djRsZGV2LT5taW5vcikKKwlyZXR1cm4gZXJyOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRmlsbCBzb21lIGJhc2ljIGZpZWxkcyBpbiB0aGUgbWFpbiBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUuCisgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2Ugb24gdzk5NjhjZl91c2JfcHJvYmUoKSBmb3IgZWFjaCByZWNvZ25pemVkIAorICBjYW1lcmEuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkCit3OTk2OGNmX2NvbmZpZ3VyZV9jYW1lcmEoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UqIHVkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSB3OTk2OGNmX21vZGVsX2lkIG1vZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZXZfbnIpCit7CisJaW5pdF9NVVRFWCgmY2FtLT5maWxlb3Bfc2VtKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYW0tPm9wZW4pOworCXNwaW5fbG9ja19pbml0KCZjYW0tPnVyYl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY2FtLT5mbGlzdF9sb2NrKTsKKworCWNhbS0+dXNlcnMgPSAwOworCWNhbS0+ZGlzY29ubmVjdGVkID0gMDsKKwljYW0tPmlkID0gbW9kX2lkOworCWNhbS0+c2Vuc29yID0gQ0NfVU5LTk9XTjsKKwljYW0tPnNlbnNvcl9pbml0aWFsaXplZCA9IDA7CisKKwkvKiBDYWxjdWxhdGUgdGhlIGFsdGVybmF0ZSBzZXR0aW5nIG51bWJlciAoZnJvbSAxIHRvIDE2KQorCSAgIGFjY29yZGluZyB0byB0aGUgJ3BhY2tldF9zaXplJyBtb2R1bGUgcGFyYW1ldGVyICovCisJaWYgKHBhY2tldF9zaXplW2Rldl9ucl0gPCBXOTk2OENGX01JTl9QQUNLRVRfU0laRSkKKwkJcGFja2V0X3NpemVbZGV2X25yXSA9IFc5OTY4Q0ZfTUlOX1BBQ0tFVF9TSVpFOworCWZvciAoY2FtLT5hbHRzZXR0aW5nID0gMTsKKwkgICAgIHBhY2tldF9zaXplW2Rldl9ucl0gPCB3TWF4UGFja2V0U2l6ZVtjYW0tPmFsdHNldHRpbmctMV07CisJICAgICBjYW0tPmFsdHNldHRpbmcrKyk7CisKKwljYW0tPm1heF9idWZmZXJzID0gKG1heF9idWZmZXJzW2Rldl9ucl0gPCAyIHx8IAorCSAgICAgICAgICAgICAgICAgICAgbWF4X2J1ZmZlcnNbZGV2X25yXSA+IFc5OTY4Q0ZfTUFYX0JVRkZFUlMpCisJICAgICAgICAgICAgICAgICAgID8gVzk5NjhDRl9CVUZGRVJTIDogKHU4KW1heF9idWZmZXJzW2Rldl9ucl07CisKKwljYW0tPmRvdWJsZV9idWZmZXIgPSAoZG91YmxlX2J1ZmZlcltkZXZfbnJdID09IDAgfHwgCisJICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZV9idWZmZXJbZGV2X25yXSA9PSAxKQorCSAgICAgICAgICAgICAgICAgICAgID8gKHU4KWRvdWJsZV9idWZmZXJbZGV2X25yXTpXOTk2OENGX0RPVUJMRV9CVUZGRVI7CisKKwljYW0tPmNsYW1waW5nID0gKGNsYW1waW5nW2Rldl9ucl0gPT0gMCB8fCBjbGFtcGluZ1tkZXZfbnJdID09IDEpCisJICAgICAgICAgICAgICAgID8gKHU4KWNsYW1waW5nW2Rldl9ucl0gOiBXOTk2OENGX0NMQU1QSU5HOworCQorCWNhbS0+ZmlsdGVyX3R5cGUgPSAoZmlsdGVyX3R5cGVbZGV2X25yXSA9PSAwIHx8CisJICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfdHlwZVtkZXZfbnJdID09IDEgfHwKKwkgICAgICAgICAgICAgICAgICAgIGZpbHRlcl90eXBlW2Rldl9ucl0gPT0gMikKKwkgICAgICAgICAgICAgICAgICAgPyAodTgpZmlsdGVyX3R5cGVbZGV2X25yXSA6IFc5OTY4Q0ZfRklMVEVSX1RZUEU7CisKKwljYW0tPmNhcHR1cmUgPSAxOworCisJY2FtLT5sYXJnZXZpZXcgPSAobGFyZ2V2aWV3W2Rldl9ucl0gPT0gMCB8fCBsYXJnZXZpZXdbZGV2X25yXSA9PSAxKQorCSAgICAgICAgICAgICAgICAgPyAodTgpbGFyZ2V2aWV3W2Rldl9ucl0gOiBXOTk2OENGX0xBUkdFVklFVzsKKworCWNhbS0+ZGVjb21wcmVzc2lvbiA9IChkZWNvbXByZXNzaW9uW2Rldl9ucl0gPT0gMCB8fCAKKwkgICAgICAgICAgICAgICAgICAgICAgZGVjb21wcmVzc2lvbltkZXZfbnJdID09IDEgfHwKKwkgICAgICAgICAgICAgICAgICAgICAgZGVjb21wcmVzc2lvbltkZXZfbnJdID09IDIpCisJICAgICAgICAgICAgICAgICAgICAgPyAodTgpZGVjb21wcmVzc2lvbltkZXZfbnJdOlc5OTY4Q0ZfREVDT01QUkVTU0lPTjsKKworCWNhbS0+dXBzY2FsaW5nID0gKHVwc2NhbGluZ1tkZXZfbnJdID09IDAgfHwgCisJICAgICAgICAgICAgICAgICAgdXBzY2FsaW5nW2Rldl9ucl0gPT0gMSkKKwkgICAgICAgICAgICAgICAgID8gKHU4KXVwc2NhbGluZ1tkZXZfbnJdIDogVzk5NjhDRl9VUFNDQUxJTkc7CisKKwljYW0tPmF1dG9fYnJ0ID0gKGF1dG9icmlnaHRbZGV2X25yXSA9PSAwIHx8IGF1dG9icmlnaHRbZGV2X25yXSA9PSAxKQorCSAgICAgICAgICAgICAgICA/ICh1OClhdXRvYnJpZ2h0W2Rldl9ucl0gOiBXOTk2OENGX0FVVE9CUklHSFQ7CisKKwljYW0tPmF1dG9fZXhwID0gKGF1dG9leHBbZGV2X25yXSA9PSAwIHx8IGF1dG9leHBbZGV2X25yXSA9PSAxKQorCSAgICAgICAgICAgICAgICA/ICh1OClhdXRvZXhwW2Rldl9ucl0gOiBXOTk2OENGX0FVVE9FWFA7CisKKwljYW0tPmxpZ2h0ZnJlcSA9IChsaWdodGZyZXFbZGV2X25yXSA9PSA1MCB8fCBsaWdodGZyZXFbZGV2X25yXSA9PSA2MCkKKwkgICAgICAgICAgICAgICAgID8gKHU4KWxpZ2h0ZnJlcVtkZXZfbnJdIDogVzk5NjhDRl9MSUdIVEZSRVE7CisKKwljYW0tPmJhbmRmaWx0ID0gKGJhbmRpbmdmaWx0ZXJbZGV2X25yXSA9PSAwIHx8IAorCSAgICAgICAgICAgICAgICAgYmFuZGluZ2ZpbHRlcltkZXZfbnJdID09IDEpCisJICAgICAgICAgICAgICAgID8gKHU4KWJhbmRpbmdmaWx0ZXJbZGV2X25yXSA6IFc5OTY4Q0ZfQkFORElOR0ZJTFRFUjsKKworCWNhbS0+YmFja2xpZ2h0ID0gKGJhY2tsaWdodFtkZXZfbnJdID09IDAgfHwgYmFja2xpZ2h0W2Rldl9ucl0gPT0gMSkKKwkgICAgICAgICAgICAgICAgID8gKHU4KWJhY2tsaWdodFtkZXZfbnJdIDogVzk5NjhDRl9CQUNLTElHSFQ7CisKKwljYW0tPmNsb2NrZGl2ID0gKGNsb2NrZGl2W2Rldl9ucl0gPT0gLTEgfHwgY2xvY2tkaXZbZGV2X25yXSA+PSAwKQorCSAgICAgICAgICAgICAgICA/IChzOCljbG9ja2RpdltkZXZfbnJdIDogVzk5NjhDRl9DTE9DS0RJVjsKKworCWNhbS0+bWlycm9yID0gKG1pcnJvcltkZXZfbnJdID09IDAgfHwgbWlycm9yW2Rldl9ucl0gPT0gMSkKKwkgICAgICAgICAgICAgID8gKHU4KW1pcnJvcltkZXZfbnJdIDogVzk5NjhDRl9NSVJST1I7CisKKwljYW0tPm1vbm9jaHJvbWUgPSAobW9ub2Nocm9tZVtkZXZfbnJdID09IDAgfHwgbW9ub2Nocm9tZVtkZXZfbnJdID09IDEpCisJICAgICAgICAgICAgICAgICAgPyBtb25vY2hyb21lW2Rldl9ucl0gOiBXOTk2OENGX01PTk9DSFJPTUU7CisKKwljYW0tPnBpY3R1cmUuYnJpZ2h0bmVzcyA9ICh1MTYpYnJpZ2h0bmVzc1tkZXZfbnJdOworCWNhbS0+cGljdHVyZS5odWUgPSAodTE2KWh1ZVtkZXZfbnJdOworCWNhbS0+cGljdHVyZS5jb2xvdXIgPSAodTE2KWNvbG91cltkZXZfbnJdOworCWNhbS0+cGljdHVyZS5jb250cmFzdCA9ICh1MTYpY29udHJhc3RbZGV2X25yXTsKKwljYW0tPnBpY3R1cmUud2hpdGVuZXNzID0gKHUxNil3aGl0ZW5lc3NbZGV2X25yXTsKKwlpZiAodzk5NjhjZl92YWxpZF9wYWxldHRlKCh1MTYpZm9yY2VfcGFsZXR0ZVtkZXZfbnJdKSkgeworCQljYW0tPnBpY3R1cmUucGFsZXR0ZSA9ICh1MTYpZm9yY2VfcGFsZXR0ZVtkZXZfbnJdOworCQljYW0tPmZvcmNlX3BhbGV0dGUgPSAxOworCX0gZWxzZSB7CisJCWNhbS0+Zm9yY2VfcGFsZXR0ZSA9IDA7CisJCWlmIChjYW0tPmRlY29tcHJlc3Npb24gPT0gMCkKKwkJCWNhbS0+cGljdHVyZS5wYWxldHRlID0gVzk5NjhDRl9QQUxFVFRFX0RFQ09NUF9PRkY7CisJCWVsc2UgaWYgKGNhbS0+ZGVjb21wcmVzc2lvbiA9PSAxKQorCQkJY2FtLT5waWN0dXJlLnBhbGV0dGUgPSBXOTk2OENGX1BBTEVUVEVfREVDT01QX0ZPUkNFOworCQllbHNlCisJCQljYW0tPnBpY3R1cmUucGFsZXR0ZSA9IFc5OTY4Q0ZfUEFMRVRURV9ERUNPTVBfT047CisJfQorCWNhbS0+cGljdHVyZS5kZXB0aCA9IHc5OTY4Y2ZfdmFsaWRfZGVwdGgoY2FtLT5waWN0dXJlLnBhbGV0dGUpOworCisJY2FtLT5mb3JjZV9yZ2IgPSAoZm9yY2VfcmdiW2Rldl9ucl0gPT0gMCB8fCBmb3JjZV9yZ2JbZGV2X25yXSA9PSAxKQorCSAgICAgICAgICAgICAgICAgPyAodTgpZm9yY2VfcmdiW2Rldl9ucl0gOiBXOTk2OENGX0ZPUkNFX1JHQjsKKworCWNhbS0+d2luZG93LnggPSAwOworCWNhbS0+d2luZG93LnkgPSAwOworCWNhbS0+d2luZG93LndpZHRoID0gVzk5NjhDRl9XSURUSDsKKwljYW0tPndpbmRvdy5oZWlnaHQgPSBXOTk2OENGX0hFSUdIVDsKKwljYW0tPndpbmRvdy5jaHJvbWFrZXkgPSAwOworCWNhbS0+d2luZG93LmNsaXBjb3VudCA9IDA7CisJY2FtLT53aW5kb3cuZmxhZ3MgPSAwOworCisJREJHKDMsICIlcyBjb25maWd1cmVkIHdpdGggc2V0dGluZ3MgIyV1OiIsCisJICAgIHN5bWJvbGljKGNhbWxpc3QsIGNhbS0+aWQpLCBkZXZfbnIpCisJCisJREJHKDMsICItIERhdGEgcGFja2V0IHNpemUgZm9yIFVTQiBpc29jaHJub3VzIHRyYW5zZmVyOiAldSBieXRlcyIsCisJICAgIHdNYXhQYWNrZXRTaXplW2NhbS0+YWx0c2V0dGluZy0xXSkKKwkKKwlEQkcoMywgIi0gTnVtYmVyIG9mIHJlcXVlc3RlZCB2aWRlbyBmcmFtZSBidWZmZXJzOiAldSIsCisJICAgIGNhbS0+bWF4X2J1ZmZlcnMpCisKKwlpZiAoY2FtLT5kb3VibGVfYnVmZmVyKQorCQlEQkcoMywgIi0gSGFyZHdhcmUgZG91YmxlIGJ1ZmZlcmluZyBlbmFibGVkIikKKwllbHNlIAorCQlEQkcoMywgIi0gSGFyZHdhcmUgZG91YmxlIGJ1ZmZlcmluZyBkaXNhYmxlZCIpCisKKwlpZiAoY2FtLT5maWx0ZXJfdHlwZSA9PSAwKQorCQlEQkcoMywgIi0gVmlkZW8gZmlsdGVyaW5nIGRpc2FibGVkIikKKwllbHNlIGlmIChjYW0tPmZpbHRlcl90eXBlID09IDEpCisJCURCRygzLCAiLSBWaWRlbyBmaWx0ZXJpbmcgZW5hYmxlZDogdHlwZSAxLTItMSIpCisJZWxzZSBpZiAoY2FtLT5maWx0ZXJfdHlwZSA9PSAyKQorCQlEQkcoMywgIi0gVmlkZW8gZmlsdGVyaW5nIGVuYWJsZWQ6IHR5cGUgMi0zLTYtMy0yIikKKworCWlmIChjYW0tPmNsYW1waW5nKQorCQlEQkcoMywgIi0gVmlkZW8gZGF0YSBjbGFtcGluZyAoQ0NJUi02MDEgZm9ybWF0KSBlbmFibGVkIikKKwllbHNlCisJCURCRygzLCAiLSBWaWRlbyBkYXRhIGNsYW1waW5nIChDQ0lSLTYwMSBmb3JtYXQpIGRpc2FibGVkIikKKworCWlmIChjYW0tPmxhcmdldmlldykKKwkJREJHKDMsICItIExhcmdlIHZpZXcgZW5hYmxlZCIpCisJZWxzZQorCQlEQkcoMywgIi0gTGFyZ2UgdmlldyBkaXNhYmxlZCIpCisKKwlpZiAoKGNhbS0+ZGVjb21wcmVzc2lvbikgPT0gMCAmJiAoIWNhbS0+Zm9yY2VfcGFsZXR0ZSkpCisJCURCRygzLCAiLSBEZWNvbXByZXNzaW9uIGRpc2FibGVkIikKKwllbHNlIGlmICgoY2FtLT5kZWNvbXByZXNzaW9uKSA9PSAxICYmICghY2FtLT5mb3JjZV9wYWxldHRlKSkKKwkJREJHKDMsICItIERlY29tcHJlc3Npb24gZm9yY2VkIikKKwllbHNlIGlmICgoY2FtLT5kZWNvbXByZXNzaW9uKSA9PSAyICYmICghY2FtLT5mb3JjZV9wYWxldHRlKSkKKwkJREJHKDMsICItIERlY29tcHJlc3Npb24gYWxsb3dlZCIpCisKKwlpZiAoY2FtLT51cHNjYWxpbmcpCisJCURCRygzLCAiLSBTb2Z0d2FyZSBpbWFnZSBzY2FsaW5nIGVuYWJsZWQiKQorCWVsc2UKKwkJREJHKDMsICItIFNvZnR3YXJlIGltYWdlIHNjYWxpbmcgZGlzYWJsZWQiKQorCisJaWYgKGNhbS0+Zm9yY2VfcGFsZXR0ZSkKKwkJREJHKDMsICItIEltYWdlIHBhbGV0dGUgZm9yY2VkIHRvICVzIiwKKwkJICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIGNhbS0+cGljdHVyZS5wYWxldHRlKSkKKworCWlmIChjYW0tPmZvcmNlX3JnYikKKwkJREJHKDMsICItIFJHQiBjb21wb25lbnQgb3JkZXJpbmcgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgQkdSIikKKworCWlmIChjYW0tPmF1dG9fYnJ0KQorCQlEQkcoMywgIi0gQXV0byBicmlnaHRuZXNzIGVuYWJsZWQiKQorCWVsc2UKKwkJREJHKDMsICItIEF1dG8gYnJpZ2h0bmVzcyBkaXNhYmxlZCIpCisKKwlpZiAoY2FtLT5hdXRvX2V4cCkKKwkJREJHKDMsICItIEF1dG8gZXhwb3N1cmUgZW5hYmxlZCIpCisJZWxzZQorCQlEQkcoMywgIi0gQXV0byBleHBvc3VyZSBkaXNhYmxlZCIpCisKKwlpZiAoY2FtLT5iYWNrbGlnaHQpCisJCURCRygzLCAiLSBCYWNrbGlnaHQgZXhwb3N1cmUgYWxnb3JpdGhtIGVuYWJsZWQiKQorCWVsc2UKKwkJREJHKDMsICItIEJhY2tsaWdodCBleHBvc3VyZSBhbGdvcml0aG0gZGlzYWJsZWQiKQorCisJaWYgKGNhbS0+bWlycm9yKQorCQlEQkcoMywgIi0gTWlycm9yIGVuYWJsZWQiKQorCWVsc2UKKwkJREJHKDMsICItIE1pcnJvciBkaXNhYmxlZCIpCisKKwlpZiAoY2FtLT5iYW5kZmlsdCkKKwkJREJHKDMsICItIEJhbmRpbmcgZmlsdGVyIGVuYWJsZWQiKQorCWVsc2UKKwkJREJHKDMsICItIEJhbmRpbmcgZmlsdGVyIGRpc2FibGVkIikKKworCURCRygzLCAiLSBQb3dlciBsaWdodGluZyBmcmVxdWVuY3k6ICV1IiwgY2FtLT5saWdodGZyZXEpCisKKwlpZiAoY2FtLT5jbG9ja2RpdiA9PSAtMSkKKwkJREJHKDMsICItIEF1dG9tYXRpYyBjbG9jayBkaXZpc29yIGVuYWJsZWQiKQorCWVsc2UKKwkJREJHKDMsICItIENsb2NrIGRpdmlzb3I6ICVkIiwgY2FtLT5jbG9ja2RpdikKKworCWlmIChjYW0tPm1vbm9jaHJvbWUpCisJCURCRygzLCAiLSBJbWFnZSBzZW5zb3IgdXNlZCBhcyBtb25vY2hyb21lIikKKwllbHNlCisJCURCRygzLCAiLSBJbWFnZSBzZW5zb3Igbm90IHVzZWQgYXMgbW9ub2Nocm9tZSIpCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJZiB0aGUgdmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSBpcyBub3QgbG9hZGVkLCBzb21lIHBhcmFtZXRlcnMKKyAgbXVzdCBiZSBvdmVycmlkZGVuLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCB3OTk2OGNmX2FkanVzdF9jb25maWd1cmF0aW9uKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWlmICghdzk5NjhjZl92cHApIHsKKwkJaWYgKGNhbS0+ZGVjb21wcmVzc2lvbiA9PSAxKSB7CisJCQljYW0tPmRlY29tcHJlc3Npb24gPSAyOworCQkJREJHKDIsICJWaWRlbyBwb3N0LXByb2Nlc3NpbmcgbW9kdWxlIG5vdCBmb3VuZDogIgorCQkJICAgICAgICInZGVjb21wcmVzc2lvbicgcGFyYW1ldGVyIGZvcmNlZCB0byAyIikKKwkJfQorCQlpZiAoY2FtLT51cHNjYWxpbmcpIHsKKwkJCWNhbS0+dXBzY2FsaW5nID0gMDsKKwkJCURCRygyLCAiVmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSBub3QgZm91bmQ6ICIKKwkJCSAgICAgICAiJ3Vwc2NhbGluZycgcGFyYW1ldGVyIGZvcmNlZCB0byAwIikKKwkJfQorCQlpZiAoY2FtLT5waWN0dXJlLnBhbGV0dGUgIT0gVklERU9fUEFMRVRURV9VWVZZKSB7CisJCQljYW0tPmZvcmNlX3BhbGV0dGUgPSAwOworCQkJREJHKDIsICJWaWRlbyBwb3N0LXByb2Nlc3NpbmcgbW9kdWxlIG5vdCBmb3VuZDogIgorCQkJICAgICAgICInZm9yY2VfcGFsZXR0ZScgcGFyYW1ldGVyIGZvcmNlZCB0byAwIikKKwkJfQorCQljYW0tPnBpY3R1cmUucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfVVlWWTsKKwkJY2FtLT5waWN0dXJlLmRlcHRoID0gdzk5NjhjZl92YWxpZF9kZXB0aChjYW0tPnBpY3R1cmUucGFsZXR0ZSk7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUmVsZWFzZSB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGRyaXZlci4KKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZGlzY29ubmVjdCAKKyAgKG9yIG9uIGNsb3NlIGlmIGRlYWxsb2NhdGlvbiBoYXMgYmVlbiBkZWZlcnJlZCkKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgdzk5NjhjZl9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwlkb3duKCZ3OTk2OGNmX2Rldmxpc3Rfc2VtKTsKKworCURCRygyLCAiVjRMIGRldmljZSBkZXJlZ2lzdGVyZWQ6IC9kZXYvdmlkZW8lZCIsIGNhbS0+djRsZGV2LT5taW5vcikKKworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGNhbS0+djRsZGV2KTsKKwlsaXN0X2RlbCgmY2FtLT52NGxsaXN0KTsKKwlpMmNfZGVsX2FkYXB0ZXIoJmNhbS0+aTJjX2FkYXB0ZXIpOworCXc5OTY4Y2ZfZGVhbGxvY2F0ZV9tZW1vcnkoY2FtKTsKKwlrZnJlZShjYW0tPmNvbnRyb2xfYnVmZmVyKTsKKwlrZnJlZShjYW0tPmRhdGFfYnVmZmVyKTsKKworCXVwKCZ3OTk2OGNmX2Rldmxpc3Rfc2VtKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaWRlbzRMaW51eCBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9vcGVuKHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBmaWxlKiBmaWxwKQoreworCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtOworCWludCBlcnI7CisKKwkvKiBUaGlzIHRoZSBvbmx5IHNhZmUgd2F5IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggZGlzY29ubmVjdCAqLworCWlmICghZG93bl9yZWFkX3RyeWxvY2soJnc5OTY4Y2ZfZGlzY29ubmVjdCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwljYW0gPSAoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKil2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKworCWRvd24oJmNhbS0+ZGV2X3NlbSk7CisKKwlpZiAoY2FtLT5zZW5zb3IgPT0gQ0NfVU5LTk9XTikgeworCQlEQkcoMiwgIk5vIHN1cHBvcnRlZCBpbWFnZSBzZW5zb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgYnkgdGhlICIKKwkJICAgICAgICInb3ZjYW1jaGlwJyBtb2R1bGUgZm9yIHRoZSAlcyAoL2Rldi92aWRlbyVkKS4gTWFrZSAiCisJCSAgICAgICAic3VyZSBpdCBpcyBsb2FkZWQgKmJlZm9yZSogKHJlKWNvbm5lY3RpbmcgdGhlIGNhbWVyYS4iLAorCQkgICAgc3ltYm9saWMoY2FtbGlzdCwgY2FtLT5pZCksIGNhbS0+djRsZGV2LT5taW5vcikKKwkJdXAoJmNhbS0+ZGV2X3NlbSk7CisJCXVwX3JlYWQoJnc5OTY4Y2ZfZGlzY29ubmVjdCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChjYW0tPnVzZXJzKSB7CisJCURCRygyLCAiJXMgKC9kZXYvdmlkZW8lZCkgaGFzIGJlZW4gYWxyZWFkeSBvY2N1cGllZCBieSAnJXMnIiwKKwkJICAgIHN5bWJvbGljKGNhbWxpc3QsIGNhbS0+aWQpLGNhbS0+djRsZGV2LT5taW5vcixjYW0tPmNvbW1hbmQpCisJCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spfHwoZmlscC0+Zl9mbGFncyAmIE9fTkRFTEFZKSkgeworCQkJdXAoJmNhbS0+ZGV2X3NlbSk7CisJCQl1cF9yZWFkKCZ3OTk2OGNmX2Rpc2Nvbm5lY3QpOworCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwkJfQorCQl1cCgmY2FtLT5kZXZfc2VtKTsKKwkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX2V4Y2x1c2l2ZShjYW0tPm9wZW4sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5kaXNjb25uZWN0ZWQgfHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2FtLT51c2Vycyk7CisJCWlmIChlcnIpIHsKKwkJCXVwX3JlYWQoJnc5OTY4Y2ZfZGlzY29ubmVjdCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkgeworCQkJdXBfcmVhZCgmdzk5NjhjZl9kaXNjb25uZWN0KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWRvd24oJmNhbS0+ZGV2X3NlbSk7CisJfQorCisJREJHKDUsICJPcGVuaW5nICclcycsIC9kZXYvdmlkZW8lZCAuLi4iLAorCSAgICBzeW1ib2xpYyhjYW1saXN0LCBjYW0tPmlkKSwgY2FtLT52NGxkZXYtPm1pbm9yKQorCisJY2FtLT5zdHJlYW1pbmcgPSAwOworCWNhbS0+bWlzY29uZmlndXJlZCA9IDA7CisKKwlpZiAoIXc5OTY4Y2ZfdnBwKQorCQlpZiAoKGVyciA9IHc5OTY4Y2ZfdnBwbW9kX2RldGVjdChjYW0pKSkKKwkJCWdvdG8gb3V0OworCisJaWYgKChlcnIgPSB3OTk2OGNmX2FsbG9jYXRlX21lbW9yeShjYW0pKSkKKwkJZ290byBkZWFsbG9jYXRlX21lbW9yeTsKKworCWlmICgoZXJyID0gdzk5NjhjZl9pbml0X2NoaXAoY2FtKSkpCisJCWdvdG8gZGVhbGxvY2F0ZV9tZW1vcnk7CisKKwlpZiAoKGVyciA9IHc5OTY4Y2Zfc3RhcnRfdHJhbnNmZXIoY2FtKSkpCisJCWdvdG8gZGVhbGxvY2F0ZV9tZW1vcnk7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBjYW07CisKKwljYW0tPnVzZXJzKys7CisJc3RyY3B5KGNhbS0+Y29tbWFuZCwgY3VycmVudC0+Y29tbSk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYW0tPndhaXRfcXVldWUpOworCisJREJHKDUsICJWaWRlbyBkZXZpY2UgaXMgb3BlbiIpCisKKwl1cCgmY2FtLT5kZXZfc2VtKTsKKwl1cF9yZWFkKCZ3OTk2OGNmX2Rpc2Nvbm5lY3QpOworCisJcmV0dXJuIDA7CisKK2RlYWxsb2NhdGVfbWVtb3J5OgorCXc5OTY4Y2ZfZGVhbGxvY2F0ZV9tZW1vcnkoY2FtKTsKK291dDoKKwlEQkcoMiwgIkZhaWxlZCB0byBvcGVuIHRoZSB2aWRlbyBkZXZpY2UiKQorCXVwKCZjYW0tPmRldl9zZW0pOworCXVwX3JlYWQoJnc5OTY4Y2ZfZGlzY29ubmVjdCk7CisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHc5OTY4Y2ZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUqIGlub2RlLCBzdHJ1Y3QgZmlsZSogZmlscCkKK3sKKwlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbTsKKworCWNhbSA9IChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKXZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCisJZG93bigmY2FtLT5kZXZfc2VtKTsgLyogcHJldmVudCBkaXNjb25uZWN0KCkgdG8gYmUgY2FsbGVkICovCisKKwl3OTk2OGNmX3N0b3BfdHJhbnNmZXIoY2FtKTsKKworCXc5OTY4Y2ZfdnBwbW9kX3JlbGVhc2UoY2FtKTsKKworCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkgeworCQl3OTk2OGNmX3JlbGVhc2VfcmVzb3VyY2VzKGNhbSk7CisJCXVwKCZjYW0tPmRldl9zZW0pOworCQlrZnJlZShjYW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwljYW0tPnVzZXJzLS07CisJdzk5NjhjZl9kZWFsbG9jYXRlX21lbW9yeShjYW0pOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9ucigmY2FtLT5vcGVuLCAxKTsKKworCURCRyg1LCAiVmlkZW8gZGV2aWNlIGNsb3NlZCIpCisJdXAoJmNhbS0+ZGV2X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHNzaXplX3QKK3c5OTY4Y2ZfcmVhZChzdHJ1Y3QgZmlsZSogZmlscCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90KiBmX3BvcykKK3sKKwlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbTsKKwlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiBmcjsKKwlpbnQgZXJyID0gMDsKKworCWNhbSA9IChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKXZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCisJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2FtLT5maWxlb3Bfc2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkgeworCQlEQkcoMiwgIkRldmljZSBub3QgcHJlc2VudCIpCisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY2FtLT5taXNjb25maWd1cmVkKSB7CisJCURCRygyLCAiVGhlIGNhbWVyYSBpcyBtaXNjb25maWd1cmVkLiBDbG9zZSBhbmQgb3BlbiBpdCBhZ2Fpbi4iKQorCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCFjYW0tPmZyYW1lWzBdLnF1ZXVlZCkKKwkJdzk5NjhjZl9wdXNoX2ZyYW1lKGNhbSwgMCk7CisKKwlpZiAoIWNhbS0+ZnJhbWVbMV0ucXVldWVkKQorCQl3OTk2OGNmX3B1c2hfZnJhbWUoY2FtLCAxKTsKKworCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjYW0tPndhaXRfcXVldWUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbS0+ZnJhbWVbMF0uc3RhdHVzID09IEZfUkVBRFkgfHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5mcmFtZVsxXS5zdGF0dXMgPT0gRl9SRUFEWSB8fAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW0tPmRpc2Nvbm5lY3RlZCk7CisJaWYgKGVycikgeworCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKSB7CisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmciA9IChjYW0tPmZyYW1lWzBdLnN0YXR1cyA9PSBGX1JFQURZKSA/ICZjYW0tPmZyYW1lWzBdOiZjYW0tPmZyYW1lWzFdOworCisJaWYgKHc5OTY4Y2ZfdnBwKQorCQl3OTk2OGNmX3Bvc3Rwcm9jZXNzX2ZyYW1lKGNhbSwgZnIpOworCisJaWYgKGNvdW50ID4gZnItPmxlbmd0aCkKKwkJY291bnQgPSBmci0+bGVuZ3RoOworCisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGZyLT5idWZmZXIsIGNvdW50KSkgeworCQlmci0+c3RhdHVzID0gRl9VTlVTRUQ7CisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJKmZfcG9zICs9IGNvdW50OworCisJZnItPnN0YXR1cyA9IEZfVU5VU0VEOworCisJREJHKDUsICIlenUgYnl0ZXMgcmVhZCIsIGNvdW50KQorCisJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9tbWFwKHN0cnVjdCBmaWxlKiBmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSA9IChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkgICAgICAgICAgICAgIHBzaXplID0gY2FtLT5uYnVmZmVycyAqIGNhbS0+ZnJhbWVbMF0uc2l6ZSwKKwkgICAgICAgICAgICAgIHN0YXJ0ID0gdm1hLT52bV9zdGFydCwKKwkgICAgICAgICAgICAgIHBvcyA9ICh1bnNpZ25lZCBsb25nKWNhbS0+ZnJhbWVbMF0uYnVmZmVyLAorCSAgICAgICAgICAgICAgcGFnZTsKKworCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkgeworCQlEQkcoMiwgIkRldmljZSBub3QgcHJlc2VudCIpCisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChjYW0tPm1pc2NvbmZpZ3VyZWQpIHsKKwkJREJHKDIsICJUaGUgY2FtZXJhIGlzIG1pc2NvbmZpZ3VyZWQuIENsb3NlIGFuZCBvcGVuIGl0IGFnYWluIikKKwkJcmV0dXJuIC1FSU87CisJfQorCisJUERCR0coIm1tYXBwaW5nICVsdSBieXRlcy4uLiIsIHZzaXplKQorCisJaWYgKHZzaXplID4gcHNpemUgLSAodm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aGlsZSAodnNpemUgPiAwKSB7CisJCXBhZ2UgPSB2bWFsbG9jX3RvX3Bmbigodm9pZCAqKXBvcyk7CisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSArIHZtYS0+dm1fcGdvZmYsCisJCQkJCQlQQUdFX1NJWkUsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJCXJldHVybiAtRUFHQUlOOworCQlzdGFydCArPSBQQUdFX1NJWkU7CisJCXBvcyArPSBQQUdFX1NJWkU7CisJCXZzaXplIC09IFBBR0VfU0laRTsKKwl9CisKKwlEQkcoNSwgIm1tYXAgbWV0aG9kIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3c5OTY4Y2ZfaW9jdGwoc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbHAsCisgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtOworCWludCBlcnI7CisKKwljYW0gPSAoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKil2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNhbS0+ZmlsZW9wX3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpIHsKKwkJREJHKDIsICJEZXZpY2Ugbm90IHByZXNlbnQiKQorCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNhbS0+bWlzY29uZmlndXJlZCkgeworCQlEQkcoMiwgIlRoZSBjYW1lcmEgaXMgbWlzY29uZmlndXJlZC4gQ2xvc2UgYW5kIG9wZW4gaXQgYWdhaW4uIikKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWVyciA9IHc5OTY4Y2ZfdjRsX2lvY3RsKGlub2RlLCBmaWxwLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7CisKKwl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdzk5NjhjZl92NGxfaW9jdGwoc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQoreworCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtOworCWNvbnN0IGNoYXIqIHY0bDFfaW9jdGxzW10gPSB7CisJCSI/IiwgIkNHQVAiLCAiR0NIQU4iLCAiU0NIQU4iLCAiR1RVTkVSIiwgIlNUVU5FUiIsIAorCQkiR1BJQ1QiLCAiU1BJQ1QiLCAiQ0NBUFRVUkUiLCAiR1dJTiIsICJTV0lOIiwgIkdGQlVGIiwKKwkJIlNGQlVGIiwgIktFWSIsICJHRlJFUSIsICJTRlJFUSIsICJHQVVESU8iLCAiU0FVRElPIiwKKwkJIlNZTkMiLCAiTUNBUFRVUkUiLCAiR01CVUYiLCAiR1VOSVQiLCAiR0NBUFRVUkUiLCAiU0NBUFRVUkUiLAorCQkiU1BMQVlNT0RFIiwgIlNXUklURU1PREUiLCAiR1BMQVlJTkZPIiwgIlNNSUNST0NPREUiLCAKKwkJIkdWQklGTVQiLCAiU1ZCSUZNVCIgCisJfTsKKworCSNkZWZpbmUgVjRMMV9JT0NUTChjbWQpIFwKKwkgICAgICAgICgoX0lPQ19OUigoY21kKSkgPCBzaXplb2YodjRsMV9pb2N0bHMpL3NpemVvZihjaGFyKikpID8gXAorCSAgICAgICAgdjRsMV9pb2N0bHNbX0lPQ19OUigoY21kKSldIDogIj8iKQorCisJY2FtID0gKHN0cnVjdCB3OTk2OGNmX2RldmljZSopdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBWSURJT0NHQ0FQOiAvKiBnZXQgdmlkZW8gY2FwYWJpbGl0eSAqLworCXsKKwkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgY2FwID0geworCQkJLnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfU0NBTEVTLAorCQkJLmNoYW5uZWxzID0gMSwKKwkJCS5hdWRpb3MgPSAwLAorCQkJLm1pbndpZHRoID0gY2FtLT5taW53aWR0aCwKKwkJCS5taW5oZWlnaHQgPSBjYW0tPm1pbmhlaWdodCwKKwkJfTsKKwkJc3ByaW50ZihjYXAubmFtZSwgIlc5OTZbODddQ0YgVVNCIENhbWVyYSAjJWQiLCAKKwkJICAgICAgICBjYW0tPnY0bGRldi0+bWlub3IpOworCQljYXAubWF4d2lkdGggPSAoY2FtLT51cHNjYWxpbmcgJiYgdzk5NjhjZl92cHApCisJCSAgICAgICAgICAgICAgID8gbWF4KCh1MTYpVzk5NjhDRl9NQVhfV0lEVEgsIGNhbS0+bWF4d2lkdGgpIAorCQkgICAgICAgICAgICAgICAgIDogY2FtLT5tYXh3aWR0aDsKKwkJY2FwLm1heGhlaWdodCA9IChjYW0tPnVwc2NhbGluZyAmJiB3OTk2OGNmX3ZwcCkKKwkJICAgICAgICAgICAgICAgID8gbWF4KCh1MTYpVzk5NjhDRl9NQVhfSEVJR0hULCBjYW0tPm1heGhlaWdodCkKKwkJICAgICAgICAgICAgICAgICAgOiBjYW0tPm1heGhlaWdodDsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJmNhcCwgc2l6ZW9mKGNhcCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJREJHKDUsICJWSURJT0NHQ0FQIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQorCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ0dDSEFOOiAvKiBnZXQgdmlkZW8gY2hhbm5lbCBpbmZvcm1hdGlvbnMgKi8KKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsIGNoYW47CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2hhbiwgYXJnLCBzaXplb2YoY2hhbikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNoYW4uY2hhbm5lbCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3RyY3B5KGNoYW4ubmFtZSwgIkNhbWVyYSIpOworCQljaGFuLnR1bmVycyA9IDA7CisJCWNoYW4uZmxhZ3MgPSAwOworCQljaGFuLnR5cGUgPSBWSURFT19UWVBFX0NBTUVSQTsKKwkJY2hhbi5ub3JtID0gVklERU9fTU9ERV9BVVRPOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY2hhbiwgc2l6ZW9mKGNoYW4pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURCRyg1LCAiVklESU9DR0NIQU4gc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DU0NIQU46IC8qIHNldCBhY3RpdmUgY2hhbm5lbCAqLworCXsKKwkJc3RydWN0IHZpZGVvX2NoYW5uZWwgY2hhbjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNoYW4sIGFyZywgc2l6ZW9mKGNoYW4pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChjaGFuLmNoYW5uZWwgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCURCRyg1LCAiVklESU9DU0NIQU4gc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DR1BJQ1Q6IC8qIGdldCBpbWFnZSBwcm9wZXJ0aWVzIG9mIHRoZSBwaWN0dXJlICovCisJeworCQlpZiAodzk5NjhjZl9zZW5zb3JfZ2V0X3BpY3R1cmUoY2FtKSkKKwkJCXJldHVybiAtRUlPOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY2FtLT5waWN0dXJlLCBzaXplb2YoY2FtLT5waWN0dXJlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEQkcoNSwgIlZJRElPQ0dQSUNUIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQorCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ1NQSUNUOiAvKiBjaGFuZ2UgcGljdHVyZSBzZXR0aW5ncyAqLworCXsKKwkJc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdDsKKwkJaW50IGVyciA9IDA7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwaWN0LCBhcmcsIHNpemVvZihwaWN0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoIChjYW0tPmZvcmNlX3BhbGV0dGUgfHwgIXc5OTY4Y2ZfdnBwKSAKKwkJICAgICAmJiBwaWN0LnBhbGV0dGUgIT0gY2FtLT5waWN0dXJlLnBhbGV0dGUgKSB7CisJCQlEQkcoNCwgIlBhbGV0dGUgJXMgcmVqZWN0ZWQ6IG9ubHkgJXMgaXMgYWxsb3dlZCIsCisJCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgcGljdC5wYWxldHRlKSwKKwkJCSAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBjYW0tPnBpY3R1cmUucGFsZXR0ZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICghdzk5NjhjZl92YWxpZF9wYWxldHRlKHBpY3QucGFsZXR0ZSkpIHsKKwkJCURCRyg0LCAiUGFsZXR0ZSAlcyBub3Qgc3VwcG9ydGVkLiBWSURJT0NTUElDVCBmYWlsZWQiLAorCQkJICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIHBpY3QucGFsZXR0ZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICghY2FtLT5mb3JjZV9wYWxldHRlKSB7CisJCSAgIGlmIChjYW0tPmRlY29tcHJlc3Npb24gPT0gMCkgeworCQkgICAgICBpZiAodzk5NjhjZl9uZWVkX2RlY29tcHJlc3Npb24ocGljdC5wYWxldHRlKSkgeworCQkgICAgICAgICBEQkcoNCwgIkRlY29tcHJlc3Npb24gZGlzYWJsZWQ6IHBhbGV0dGUgJXMgaXMgbm90ICIKKwkJICAgICAgICAgICAgICAgICJhbGxvd2VkLiBWSURJT0NTUElDVCBmYWlsZWQiLAorCQkgICAgICAgICAgICAgc3ltYm9saWModjRsMV9wbGlzdCwgcGljdC5wYWxldHRlKSkKKwkJICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCSAgICAgIH0KKwkJICAgfSBlbHNlIGlmIChjYW0tPmRlY29tcHJlc3Npb24gPT0gMSkgeworCQkgICAgICBpZiAoIXc5OTY4Y2ZfbmVlZF9kZWNvbXByZXNzaW9uKHBpY3QucGFsZXR0ZSkpIHsKKwkJICAgICAgICAgREJHKDQsICJEZWNvbXByZXNzaW9uIGZvcmNlZDogcGFsZXR0ZSAlcyBpcyBub3QgIgorCQkgICAgICAgICAgICAgICAgImFsbG93ZWQuIFZJRElPQ1NQSUNUIGZhaWxlZCIsCisJCSAgICAgICAgICAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBwaWN0LnBhbGV0dGUpKQorCQkgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJICAgICAgfQorCQkgICB9CisJCX0KKworCQlpZiAocGljdC5kZXB0aCAhPSB3OTk2OGNmX3ZhbGlkX2RlcHRoKHBpY3QucGFsZXR0ZSkpIHsKKwkJCURCRyg0LCAiUmVxdWVzdGVkIGRlcHRoICV1IGJwcCBpcyBub3QgdmFsaWQgZm9yICVzICIKKwkJCSAgICAgICAicGFsZXR0ZTogaWdub3JlZCBhbmQgY2hhbmdlZCB0byAldSBicHAiLCAKKwkJCSAgICBwaWN0LmRlcHRoLCBzeW1ib2xpYyh2NGwxX3BsaXN0LCBwaWN0LnBhbGV0dGUpLAorCQkJICAgIHc5OTY4Y2ZfdmFsaWRfZGVwdGgocGljdC5wYWxldHRlKSkKKwkJCXBpY3QuZGVwdGggPSB3OTk2OGNmX3ZhbGlkX2RlcHRoKHBpY3QucGFsZXR0ZSk7CisJCX0KKworCQlpZiAocGljdC5wYWxldHRlICE9IGNhbS0+cGljdHVyZS5wYWxldHRlKSB7CisJCQlpZigqY2FtLT5yZXF1ZXN0ZWRfZnJhbWUKKwkJCSAgIHx8IGNhbS0+ZnJhbWVfY3VycmVudC0+cXVldWVkKSB7CisJCQkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlCisJCQkJICAgICAgKCBjYW0tPndhaXRfcXVldWUsCisJCQkJICAgICAgICBjYW0tPmRpc2Nvbm5lY3RlZCB8fAorCQkJCSAgICAgICAgKCEqY2FtLT5yZXF1ZXN0ZWRfZnJhbWUgJiYKKwkJCQkgICAgICAgICAhY2FtLT5mcmFtZV9jdXJyZW50LT5xdWV1ZWQpICk7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpCisJCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCisJCQlpZiAodzk5NjhjZl9zdG9wX3RyYW5zZmVyKGNhbSkpCisJCQkJZ290byBpb2N0bF9mYWlsOworCisJCQlpZiAodzk5NjhjZl9zZXRfcGljdHVyZShjYW0sIHBpY3QpKQorCQkJCWdvdG8gaW9jdGxfZmFpbDsKKworCQkJaWYgKHc5OTY4Y2Zfc3RhcnRfdHJhbnNmZXIoY2FtKSkKKwkJCQlnb3RvIGlvY3RsX2ZhaWw7CisKKwkJfSBlbHNlIGlmICh3OTk2OGNmX3NlbnNvcl91cGRhdGVfcGljdHVyZShjYW0sIHBpY3QpKQorCQkJcmV0dXJuIC1FSU87CisKKworCQlEQkcoNSwgIlZJRElPQ1NQSUNUIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQorCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ1NXSU46IC8qIHNldCBjYXB0dXJlIGFyZWEgKi8KKwl7CisJCXN0cnVjdCB2aWRlb193aW5kb3cgd2luOworCQlpbnQgZXJyID0gMDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJndpbiwgYXJnLCBzaXplb2Yod2luKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEQkcoNiwgIlZJRElPQ1NXSU4gY2FsbGVkOiBjbGlwY291bnQ9JWQsIGZsYWdzPSV1LCAiCisJCSAgICAgICAieD0ldSwgeT0ldSwgJXV4JXUiLCB3aW4uY2xpcGNvdW50LCB3aW4uZmxhZ3MsCisJCSAgICB3aW4ueCwgd2luLnksIHdpbi53aWR0aCwgd2luLmhlaWdodCkKKworCQlpZiAod2luLmNsaXBjb3VudCAhPSAwIHx8IHdpbi5mbGFncyAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKChlcnIgPSB3OTk2OGNmX2FkanVzdF93aW5kb3dfc2l6ZShjYW0sICh1MTYqKSZ3aW4ud2lkdGgsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNiopJndpbi5oZWlnaHQpKSkgeworCQkJREJHKDQsICJSZXNvbHV0aW9uIG5vdCBzdXBwb3J0ZWQgKCV1eCV1KS4gIgorCQkJICAgICAgICJWSURJT0NTV0lOIGZhaWxlZCIsIHdpbi53aWR0aCwgd2luLmhlaWdodCkKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlpZiAod2luLnggIT0gY2FtLT53aW5kb3cueCB8fAorCQkgICAgd2luLnkgIT0gY2FtLT53aW5kb3cueSB8fAorCQkgICAgd2luLndpZHRoICE9IGNhbS0+d2luZG93LndpZHRoIHx8CisJCSAgICB3aW4uaGVpZ2h0ICE9IGNhbS0+d2luZG93LmhlaWdodCkgeworCQkJaWYoKmNhbS0+cmVxdWVzdGVkX2ZyYW1lCisJCQkgICB8fCBjYW0tPmZyYW1lX2N1cnJlbnQtPnF1ZXVlZCkgeworCQkJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZQorCQkJCSAgICAgICggY2FtLT53YWl0X3F1ZXVlLAorCQkJCSAgICAgICAgY2FtLT5kaXNjb25uZWN0ZWQgfHwKKwkJCQkgICAgICAgICghKmNhbS0+cmVxdWVzdGVkX2ZyYW1lICYmCisJCQkJICAgICAgICAgIWNhbS0+ZnJhbWVfY3VycmVudC0+cXVldWVkKSApOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQkJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKQorCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKworCQkJaWYgKHc5OTY4Y2Zfc3RvcF90cmFuc2ZlcihjYW0pKQorCQkJCWdvdG8gaW9jdGxfZmFpbDsKKworCQkJLyogVGhpcyBfbXVzdF8gYmUgY2FsbGVkIGJlZm9yZSBzZXRfd2luZG93KCkgKi8KKwkJCWlmICh3OTk2OGNmX3NldF9waWN0dXJlKGNhbSwgY2FtLT5waWN0dXJlKSkKKwkJCQlnb3RvIGlvY3RsX2ZhaWw7CisKKwkJCWlmICh3OTk2OGNmX3NldF93aW5kb3coY2FtLCB3aW4pKQorCQkJCWdvdG8gaW9jdGxfZmFpbDsKKworCQkJaWYgKHc5OTY4Y2Zfc3RhcnRfdHJhbnNmZXIoY2FtKSkKKwkJCQlnb3RvIGlvY3RsX2ZhaWw7CisJCX0KKworCQlEQkcoNSwgIlZJRElPQ1NXSU4gc3VjY2Vzc2Z1bGx5IGNhbGxlZC4gIikKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NHV0lOOiAvKiBnZXQgY3VycmVudCB3aW5kb3cgcHJvcGVydGllcyAqLworCXsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsJmNhbS0+d2luZG93LHNpemVvZihzdHJ1Y3QgdmlkZW9fd2luZG93KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEQkcoNSwgIlZJRElPQ0dXSU4gc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DR01CVUY6IC8qIHJlcXVlc3QgZm9yIG1lbW9yeSAobWFwcGVkKSBidWZmZXIgKi8KKwl7CisJCXN0cnVjdCB2aWRlb19tYnVmIG1idWY7CisJCXU4IGk7CisKKwkJbWJ1Zi5zaXplID0gY2FtLT5uYnVmZmVycyAqIGNhbS0+ZnJhbWVbMF0uc2l6ZTsKKwkJbWJ1Zi5mcmFtZXMgPSBjYW0tPm5idWZmZXJzOworCQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKQorCQkJbWJ1Zi5vZmZzZXRzW2ldID0gKHVuc2lnbmVkIGxvbmcpY2FtLT5mcmFtZVtpXS5idWZmZXIgLQorCQkJICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpY2FtLT5mcmFtZVswXS5idWZmZXI7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZtYnVmLCBzaXplb2YobWJ1ZikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJREJHKDUsICJWSURJT0NHTUJVRiBzdWNjZXNzZnVsbHkgY2FsbGVkIikKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NNQ0FQVFVSRTogLyogc3RhcnQgdGhlIGNhcHR1cmUgdG8gYSBmcmFtZSAqLworCXsKKwkJc3RydWN0IHZpZGVvX21tYXAgbW1hcDsKKwkJc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCogZnI7CisJCWludCBlcnIgPSAwOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbW1hcCwgYXJnLCBzaXplb2YobW1hcCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJREJHKDYsICJWSURJT0NNQ0FQVFVSRSBjYWxsZWQ6IGZyYW1lICMldSwgZm9ybWF0PSVzLCAlZHglZCIsCisJCSAgICBtbWFwLmZyYW1lLCBzeW1ib2xpYyh2NGwxX3BsaXN0LCBtbWFwLmZvcm1hdCksIAorCQkgICAgbW1hcC53aWR0aCwgbW1hcC5oZWlnaHQpCisKKwkJaWYgKG1tYXAuZnJhbWUgPj0gY2FtLT5uYnVmZmVycykgeworCQkJREJHKDQsICJJbnZhbGlkIGZyYW1lIG51bWJlciAoJXUpLiAiCisJCQkgICAgICAgIlZJRElPQ01DQVBUVVJFIGZhaWxlZCIsIG1tYXAuZnJhbWUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChtbWFwLmZvcm1hdCE9Y2FtLT5waWN0dXJlLnBhbGV0dGUgJiYgCisJCSAgICAoY2FtLT5mb3JjZV9wYWxldHRlIHx8ICF3OTk2OGNmX3ZwcCkpIHsKKwkJCURCRyg0LCAiUGFsZXR0ZSAlcyByZWplY3RlZDogb25seSAlcyBpcyBhbGxvd2VkIiwKKwkJCSAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBtbWFwLmZvcm1hdCksCisJCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgY2FtLT5waWN0dXJlLnBhbGV0dGUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoIXc5OTY4Y2ZfdmFsaWRfcGFsZXR0ZShtbWFwLmZvcm1hdCkpIHsKKwkJCURCRyg0LCAiUGFsZXR0ZSAlcyBub3Qgc3VwcG9ydGVkLiAiCisJCQkgICAgICAgIlZJRElPQ01DQVBUVVJFIGZhaWxlZCIsIAorCQkJICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIG1tYXAuZm9ybWF0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFjYW0tPmZvcmNlX3BhbGV0dGUpIHsKKwkJICAgaWYgKGNhbS0+ZGVjb21wcmVzc2lvbiA9PSAwKSB7CisJCSAgICAgIGlmICh3OTk2OGNmX25lZWRfZGVjb21wcmVzc2lvbihtbWFwLmZvcm1hdCkpIHsKKwkJICAgICAgICAgREJHKDQsICJEZWNvbXByZXNzaW9uIGRpc2FibGVkOiBwYWxldHRlICVzIGlzIG5vdCAiCisJCSAgICAgICAgICAgICAgICAiYWxsb3dlZC4gVklESU9DU1BJQ1QgZmFpbGVkIiwKKwkJICAgICAgICAgICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIG1tYXAuZm9ybWF0KSkKKwkJICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCSAgICAgIH0KKwkJICAgfSBlbHNlIGlmIChjYW0tPmRlY29tcHJlc3Npb24gPT0gMSkgeworCQkgICAgICBpZiAoIXc5OTY4Y2ZfbmVlZF9kZWNvbXByZXNzaW9uKG1tYXAuZm9ybWF0KSkgeworCQkgICAgICAgICBEQkcoNCwgIkRlY29tcHJlc3Npb24gZm9yY2VkOiBwYWxldHRlICVzIGlzIG5vdCAiCisJCSAgICAgICAgICAgICAgICAiYWxsb3dlZC4gVklESU9DU1BJQ1QgZmFpbGVkIiwKKwkJICAgICAgICAgICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIG1tYXAuZm9ybWF0KSkKKwkJICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCSAgICAgIH0KKwkJICAgfQorCQl9CisKKwkJaWYgKChlcnIgPSB3OTk2OGNmX2FkanVzdF93aW5kb3dfc2l6ZShjYW0sICh1MTYqKSZtbWFwLndpZHRoLCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2KikmbW1hcC5oZWlnaHQpKSkgeworCQkJREJHKDQsICJSZXNvbHV0aW9uIG5vdCBzdXBwb3J0ZWQgKCVkeCVkKS4gIgorCQkJICAgICAgICJWSURJT0NNQ0FQVFVSRSBmYWlsZWQiLAorCQkJICAgIG1tYXAud2lkdGgsIG1tYXAuaGVpZ2h0KQorCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWZyID0gJmNhbS0+ZnJhbWVbbW1hcC5mcmFtZV07CisKKwkJaWYgKG1tYXAud2lkdGggICE9IGNhbS0+d2luZG93LndpZHRoIHx8CisJCSAgICBtbWFwLmhlaWdodCAhPSBjYW0tPndpbmRvdy5oZWlnaHQgfHwKKwkJICAgIG1tYXAuZm9ybWF0ICE9IGNhbS0+cGljdHVyZS5wYWxldHRlKSB7CisKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgd2luOworCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdDsKKworCQkJaWYoKmNhbS0+cmVxdWVzdGVkX2ZyYW1lCisJCQkgICB8fCBjYW0tPmZyYW1lX2N1cnJlbnQtPnF1ZXVlZCkgeworCQkJCURCRyg2LCAiVklESU9DTUNBUFRVUkUuIENoYW5nZSBzZXR0aW5ncyBmb3IgIgorCQkJCSAgICAgICAiZnJhbWUgIyV1OiAlZHglZCwgZm9ybWF0ICVzLiBXYWl0Li4uIiwKKwkJCQkgICAgbW1hcC5mcmFtZSwgbW1hcC53aWR0aCwgbW1hcC5oZWlnaHQsCisJCQkgICAgICAgICAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBtbWFwLmZvcm1hdCkpCisJCQkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlCisJCQkJICAgICAgKCBjYW0tPndhaXRfcXVldWUsCisJCQkJICAgICAgICBjYW0tPmRpc2Nvbm5lY3RlZCB8fAorCQkJCSAgICAgICAgKCEqY2FtLT5yZXF1ZXN0ZWRfZnJhbWUgJiYKKwkJCQkgICAgICAgICAhY2FtLT5mcmFtZV9jdXJyZW50LT5xdWV1ZWQpICk7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpCisJCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCisJCQltZW1jcHkoJndpbiwgJmNhbS0+d2luZG93LCBzaXplb2Yod2luKSk7CisJCQltZW1jcHkoJnBpY3QsICZjYW0tPnBpY3R1cmUsIHNpemVvZihwaWN0KSk7CisJCQl3aW4ud2lkdGggPSBtbWFwLndpZHRoOworCQkJd2luLmhlaWdodCA9IG1tYXAuaGVpZ2h0OworCQkJcGljdC5wYWxldHRlID0gbW1hcC5mb3JtYXQ7CisKKwkJCWlmICh3OTk2OGNmX3N0b3BfdHJhbnNmZXIoY2FtKSkKKwkJCQlnb3RvIGlvY3RsX2ZhaWw7CisKKwkJCS8qIFRoaXMgYmVmb3JlIHNldF93aW5kb3cgKi8KKwkJCWlmICh3OTk2OGNmX3NldF9waWN0dXJlKGNhbSwgcGljdCkpIAorCQkJCWdvdG8gaW9jdGxfZmFpbDsKKworCQkJaWYgKHc5OTY4Y2Zfc2V0X3dpbmRvdyhjYW0sIHdpbikpCisJCQkJZ290byBpb2N0bF9mYWlsOworCisJCQlpZiAodzk5NjhjZl9zdGFydF90cmFuc2ZlcihjYW0pKQorCQkJCWdvdG8gaW9jdGxfZmFpbDsKKworCQl9IGVsc2UgCWlmIChmci0+cXVldWVkKSB7CisKKwkJCURCRyg2LCAiV2FpdCB1bnRpbCBmcmFtZSAjJXUgaXMgZnJlZSIsIG1tYXAuZnJhbWUpCisJCQkKKwkJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjYW0tPndhaXRfcXVldWUsIAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbS0+ZGlzY29ubmVjdGVkIHx8CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFmci0+cXVldWVkKSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCQlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQl3OTk2OGNmX3B1c2hfZnJhbWUoY2FtLCBtbWFwLmZyYW1lKTsKKwkJREJHKDUsICJWSURJT0NNQ0FQVFVSRSgldSk6IHN1Y2Nlc3NmdWxseSBjYWxsZWQiLCBtbWFwLmZyYW1lKQorCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ1NZTkM6IC8qIHdhaXQgdW50aWwgdGhlIGNhcHR1cmUgb2YgYSBmcmFtZSBpcyBmaW5pc2hlZCAqLworCXsKKwkJdW5zaWduZWQgaW50IGZfbnVtOworCQlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiBmcjsKKwkJaW50IGVyciA9IDA7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmX251bSwgYXJnLCBzaXplb2YoZl9udW0pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChmX251bSA+PSBjYW0tPm5idWZmZXJzKSB7CisJCQlEQkcoNCwgIkludmFsaWQgZnJhbWUgbnVtYmVyICgldSkuICIKKwkJCSAgICAgICAiVklESU9DTUNBUFRVUkUgZmFpbGVkIiwgZl9udW0pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCURCRyg2LCAiVklESU9DU1lOQyBjYWxsZWQgZm9yIGZyYW1lICMldSIsIGZfbnVtKQorCisJCWZyID0gJmNhbS0+ZnJhbWVbZl9udW1dOworCisJCXN3aXRjaCAoZnItPnN0YXR1cykgeworCQljYXNlIEZfVU5VU0VEOgorCQkJaWYgKCFmci0+cXVldWVkKSB7CisJCQkJREJHKDQsICJWSURJT1NZTkM6IEZyYW1lICMldSBub3QgcmVxdWVzdGVkISIsCisJCQkJICAgIGZfbnVtKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQljYXNlIEZfRVJST1I6CisJCWNhc2UgRl9HUkFCQklORzoKKwkJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjYW0tPndhaXRfcXVldWUsIAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmci0+c3RhdHVzID09IEZfUkVBRFkpCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2FtLT5kaXNjb25uZWN0ZWQpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQkJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisJCWNhc2UgRl9SRUFEWToKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHc5OTY4Y2ZfdnBwKQorCQkJdzk5NjhjZl9wb3N0cHJvY2Vzc19mcmFtZShjYW0sIGZyKTsKKworCQlmci0+c3RhdHVzID0gRl9VTlVTRUQ7CisKKwkJREJHKDUsICJWSURJT0NTWU5DKCV1KSBzdWNjZXNzZnVsbHkgY2FsbGVkIiwgZl9udW0pCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DR1VOSVQ6LyogcmVwb3J0IHRoZSB1bml0IG51bWJlcnMgb2YgdGhlIGFzc29jaWF0ZWQgZGV2aWNlcyovCisJeworCQlzdHJ1Y3QgdmlkZW9fdW5pdCB1bml0ID0geworCQkJLnZpZGVvID0gY2FtLT52NGxkZXYtPm1pbm9yLAorCQkJLnZiaSA9IFZJREVPX05PX1VOSVQsCisJCQkucmFkaW8gPSBWSURFT19OT19VTklULAorCQkJLmF1ZGlvID0gVklERU9fTk9fVU5JVCwKKwkJCS50ZWxldGV4dCA9IFZJREVPX05PX1VOSVQsCisJCX07CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ1bml0LCBzaXplb2YodW5pdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJREJHKDUsICJWSURJT0NHVU5JVCBzdWNjZXNzZnVsbHkgY2FsbGVkIikKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NLRVk6CisJCXJldHVybiAwOworCisJY2FzZSBWSURJT0NHRkJVRjoKKwl7CisJCWlmIChjbGVhcl91c2VyKGFyZywgc2l6ZW9mKHN0cnVjdCB2aWRlb19idWZmZXIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURCRyg1LCAiVklESU9DR0ZCVUYgc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DR1RVTkVSOgorCXsKKwkJc3RydWN0IHZpZGVvX3R1bmVyIHR1bmVyOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnR1bmVyLCBhcmcsIHNpemVvZih0dW5lcikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHR1bmVyLnR1bmVyICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzdHJjcHkodHVuZXIubmFtZSwgIm5vX3R1bmVyIik7CisJCXR1bmVyLnJhbmdlbG93ID0gMDsKKwkJdHVuZXIucmFuZ2VoaWdoID0gMDsKKwkJdHVuZXIuZmxhZ3MgPSBWSURFT19UVU5FUl9OT1JNOworCQl0dW5lci5tb2RlID0gVklERU9fTU9ERV9BVVRPOworCQl0dW5lci5zaWduYWwgPSAweGZmZmY7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ0dW5lciwgc2l6ZW9mKHR1bmVyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEQkcoNSwgIlZJRElPQ0dUVU5FUiBzdWNjZXNzZnVsbHkgY2FsbGVkIikKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NTVFVORVI6CisJeworCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgdHVuZXI7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdHVuZXIsIGFyZywgc2l6ZW9mKHR1bmVyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodHVuZXIudHVuZXIgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICh0dW5lci5tb2RlICE9IFZJREVPX01PREVfQVVUTykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCURCRyg1LCAiVklESU9DU1RVTkVSIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQorCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ1NGQlVGOgorCWNhc2UgVklESU9DQ0FQVFVSRToKKwljYXNlIFZJRElPQ0dGUkVROgorCWNhc2UgVklESU9DU0ZSRVE6CisJY2FzZSBWSURJT0NHQVVESU86CisJY2FzZSBWSURJT0NTQVVESU86CisJY2FzZSBWSURJT0NTUExBWU1PREU6CisJY2FzZSBWSURJT0NTV1JJVEVNT0RFOgorCWNhc2UgVklESU9DR1BMQVlJTkZPOgorCWNhc2UgVklESU9DU01JQ1JPQ09ERToKKwljYXNlIFZJRElPQ0dWQklGTVQ6CisJY2FzZSBWSURJT0NTVkJJRk1UOgorCQlEQkcoNCwgIlVuc3VwcG9ydGVkIFY0TDEgSU9DdGw6IFZJRElPQyVzICIKKwkJICAgICAgICIodHlwZSAweCUwMVgsICIKKwkJICAgICAgICJuLiAweCUwMVgsICIKKwkJICAgICAgICJkaXIuIDB4JTAxWCwgIiAKKwkJICAgICAgICJzaXplIDB4JTAyWCkiLAorCQkgICAgVjRMMV9JT0NUTChjbWQpLAorCQkgICAgX0lPQ19UWVBFKGNtZCksX0lPQ19OUihjbWQpLF9JT0NfRElSKGNtZCksX0lPQ19TSVpFKGNtZCkpCisKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZWZhdWx0OgorCQlEQkcoNCwgIkludmFsaWQgVjRMMSBJT0N0bDogVklESU9DJXMgIgorCQkgICAgICAgInR5cGUgMHglMDFYLCAiCisJCSAgICAgICAibi4gMHglMDFYLCAiCisJCSAgICAgICAiZGlyLiAweCUwMVgsICIKKwkJICAgICAgICJzaXplIDB4JTAyWCIsCisJCSAgICBWNEwxX0lPQ1RMKGNtZCksCisJCSAgICBfSU9DX1RZUEUoY21kKSxfSU9DX05SKGNtZCksX0lPQ19ESVIoY21kKSxfSU9DX1NJWkUoY21kKSkKKworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJfSAvKiBlbmQgb2Ygc3dpdGNoICovCisKK2lvY3RsX2ZhaWw6CisJY2FtLT5taXNjb25maWd1cmVkID0gMTsKKwlEQkcoMSwgIlZJRElPQyVzIGZhaWxlZCBiZWNhdXNlIG9mIGhhcmR3YXJlIHByb2JsZW1zLiAiCisJICAgICAgICJUbyB1c2UgdGhlIGNhbWVyYSwgY2xvc2UgYW5kIG9wZW4gaXQgYWdhaW4uIiwgVjRMMV9JT0NUTChjbWQpKQorCXJldHVybiAtRUZBVUxUOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHc5OTY4Y2ZfZm9wcyA9IHsKKwkub3duZXIgPSAgIFRISVNfTU9EVUxFLAorCS5vcGVuID0gICAgdzk5NjhjZl9vcGVuLAorCS5yZWxlYXNlID0gdzk5NjhjZl9yZWxlYXNlLAorCS5yZWFkID0gICAgdzk5NjhjZl9yZWFkLAorCS5pb2N0bCA9ICAgdzk5NjhjZl9pb2N0bCwKKwkubW1hcCA9ICAgIHc5OTY4Y2ZfbW1hcCwKKwkubGxzZWVrID0gIG5vX2xsc2VlaywKK307CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVNCIHByb2JlIGFuZCBWNEwgcmVnaXN0cmF0aW9uLCBkaXNjb25uZWN0IGFuZCBpZF90YWJsZVtdIGRlZmluaXRpb24gICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50Cit3OTk2OGNmX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSogaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQqIGlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbTsKKwlpbnQgZXJyID0gMDsKKwllbnVtIHc5OTY4Y2ZfbW9kZWxfaWQgbW9kX2lkOworCXN0cnVjdCBsaXN0X2hlYWQqIHB0cjsKKwl1OCBzYyA9IDA7IC8qIG51bWJlciBvZiBzaW11bHRhbmVvdXMgY2FtZXJhcyAqLworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBkZXZfbnIgPSAwOyAvKiB3ZSBhcmUgaGFuZGxpbmcgZGV2aWNlIG51bWJlciBuICovCisKKwlpZiAobGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgID09IHdpbmJvbmRfaWRfdGFibGVbMF0uaWRWZW5kb3IgJiYKKwkgICAgbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IHdpbmJvbmRfaWRfdGFibGVbMF0uaWRQcm9kdWN0KQorCQltb2RfaWQgPSBXOTk2OENGX01PRF9DTFZCV0dQOyAvKiBzZWUgY2FtbGlzdFtdIHRhYmxlICovCisJZWxzZSBpZiAobGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgID09IHdpbmJvbmRfaWRfdGFibGVbMV0uaWRWZW5kb3IgJiYKKwkgICAgICAgICBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gd2luYm9uZF9pZF90YWJsZVsxXS5pZFByb2R1Y3QpCisJCW1vZF9pZCA9IFc5OTY4Q0ZfTU9EX0dFTkVSSUM7IC8qIHNlZSBjYW1saXN0W10gdGFibGUgKi8KKwllbHNlCisJCXJldHVybiAtRU5PREVWOworCisJY2FtID0gKHN0cnVjdCB3OTk2OGNmX2RldmljZSopCisJICAgICAgICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3OTk2OGNmX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghY2FtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChjYW0sIDAsIHNpemVvZigqY2FtKSk7CisKKwlpbml0X01VVEVYKCZjYW0tPmRldl9zZW0pOworCWRvd24oJmNhbS0+ZGV2X3NlbSk7CisKKwljYW0tPnVzYmRldiA9IHVkZXY7CisJLyogTk9URTogYSBsb2NhbCBjb3B5IGlzIHVzZWQgdG8gYXZvaWQgcG9zc2libGUgcmFjZSBjb25kaXRpb25zICovCisJbWVtY3B5KCZjYW0tPmRldiwgJnVkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBkZXZpY2UpKTsKKworCURCRygyLCAiJXMgZGV0ZWN0ZWQiLCBzeW1ib2xpYyhjYW1saXN0LCBtb2RfaWQpKQorCisJaWYgKHNpbWNhbXMgPiBXOTk2OENGX01BWF9ERVZJQ0VTKQorCQlzaW1jYW1zID0gVzk5NjhDRl9TSU1DQU1TOworCisJLyogSG93IG1hbnkgY2FtZXJhcyBhcmUgY29ubmVjdGVkID8gKi8KKwlkb3duKCZ3OTk2OGNmX2Rldmxpc3Rfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoKHB0ciwgJnc5OTY4Y2ZfZGV2X2xpc3QpCisJCXNjKys7CisJdXAoJnc5OTY4Y2ZfZGV2bGlzdF9zZW0pOworCisJaWYgKHNjID49IHNpbWNhbXMpIHsKKwkJREJHKDIsICJEZXZpY2UgcmVqZWN0ZWQ6IHRvbyBtYW55IGNvbm5lY3RlZCBjYW1lcmFzICIKKwkJICAgICAgICIobWF4LiAldSkiLCBzaW1jYW1zKQorCQllcnIgPSAtRVBFUk07CisJCWdvdG8gZmFpbDsKKwl9CisKKworCS8qIEFsbG9jYXRlIDIgYnl0ZXMgb2YgbWVtb3J5IGZvciBjYW1lcmEgY29udHJvbCBVU0IgdHJhbnNmZXJzICovCisJaWYgKCEoY2FtLT5jb250cm9sX2J1ZmZlciA9ICh1MTYqKWttYWxsb2MoMiwgR0ZQX0tFUk5FTCkpKSB7CisJCURCRygxLCJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNhbWVyYSBjb250cm9sIHRyYW5zZmVycyIpCisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJbWVtc2V0KGNhbS0+Y29udHJvbF9idWZmZXIsIDAsIDIpOworCisJLyogQWxsb2NhdGUgOCBieXRlcyBvZiBtZW1vcnkgZm9yIFVTQiBkYXRhIHRyYW5zZmVycyB0byB0aGUgRlNCICovCisJaWYgKCEoY2FtLT5kYXRhX2J1ZmZlciA9ICh1MTYqKWttYWxsb2MoOCwgR0ZQX0tFUk5FTCkpKSB7CisJCURCRygxLCAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkYXRhICIKKwkJICAgICAgICJ0cmFuc2ZlcnMgdG8gdGhlIEZTQiIpCisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJbWVtc2V0KGNhbS0+ZGF0YV9idWZmZXIsIDAsIDgpOworCisJLyogUmVnaXN0ZXIgdGhlIFY0TCBkZXZpY2UgKi8KKwljYW0tPnY0bGRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmICghY2FtLT52NGxkZXYpIHsKKwkJREJHKDEsICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhIFY0TCBzdHJ1Y3R1cmUiKQorCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJc3RyY3B5KGNhbS0+djRsZGV2LT5uYW1lLCBzeW1ib2xpYyhjYW1saXN0LCBtb2RfaWQpKTsKKwljYW0tPnY0bGRldi0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljYW0tPnY0bGRldi0+dHlwZSA9IFZJRF9UWVBFX0NBUFRVUkUgfCBWSURfVFlQRV9TQ0FMRVM7CisJY2FtLT52NGxkZXYtPmhhcmR3YXJlID0gVklEX0hBUkRXQVJFX1c5OTY4Q0Y7CisJY2FtLT52NGxkZXYtPmZvcHMgPSAmdzk5NjhjZl9mb3BzOworCWNhbS0+djRsZGV2LT5taW5vciA9IHZpZGVvX25yW2Rldl9ucl07CisJY2FtLT52NGxkZXYtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKKwl2aWRlb19zZXRfZHJ2ZGF0YShjYW0tPnY0bGRldiwgY2FtKTsKKwljYW0tPnY0bGRldi0+ZGV2ID0gJmNhbS0+ZGV2OworCisJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGNhbS0+djRsZGV2LCBWRkxfVFlQRV9HUkFCQkVSLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19ucltkZXZfbnJdKTsKKwlpZiAoZXJyKSB7CisJCURCRygxLCAiVjRMIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIikKKwkJaWYgKGVyciA9PSAtRU5GSUxFICYmIHZpZGVvX25yW2Rldl9ucl0gPT0gLTEpCisJCQlEQkcoMiwgIkNvdWxkbid0IGZpbmQgYSBmcmVlIC9kZXYvdmlkZW9YIG5vZGUiKQorCQl2aWRlb19ucltkZXZfbnJdID0gLTE7CisJCWRldl9uciA9IChkZXZfbnIgPCBXOTk2OENGX01BWF9ERVZJQ0VTLTEpID8gZGV2X25yKzEgOiAwOworCQlnb3RvIGZhaWw7CisJfQorCisJREJHKDIsICJWNEwgZGV2aWNlIHJlZ2lzdGVyZWQgYXMgL2Rldi92aWRlbyVkIiwgY2FtLT52NGxkZXYtPm1pbm9yKQorCisJLyogU2V0IHNvbWUgYmFzaWMgY29uc3RhbnRzICovCisJdzk5NjhjZl9jb25maWd1cmVfY2FtZXJhKGNhbSwgdWRldiwgbW9kX2lkLCBkZXZfbnIpOworCisJLyogQWRkIGEgbmV3IGVudHJ5IGludG8gdGhlIGxpc3Qgb2YgVjRMIHJlZ2lzdGVyZWQgZGV2aWNlcyAqLworCWRvd24oJnc5OTY4Y2ZfZGV2bGlzdF9zZW0pOworCWxpc3RfYWRkKCZjYW0tPnY0bGxpc3QsICZ3OTk2OGNmX2Rldl9saXN0KTsKKwl1cCgmdzk5NjhjZl9kZXZsaXN0X3NlbSk7CisJZGV2X25yID0gKGRldl9uciA8IFc5OTY4Q0ZfTUFYX0RFVklDRVMtMSkgPyBkZXZfbnIrMSA6IDA7CisKKwl3OTk2OGNmX3R1cm5fb25fbGVkKGNhbSk7CisKKwl3OTk2OGNmX2kyY19pbml0KGNhbSk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGNhbSk7CisJdXAoJmNhbS0+ZGV2X3NlbSk7CisJcmV0dXJuIDA7CisKK2ZhaWw6IC8qIEZyZWUgdW51c2VkIG1lbW9yeSAqLworCWlmIChjYW0tPmNvbnRyb2xfYnVmZmVyKQorCQlrZnJlZShjYW0tPmNvbnRyb2xfYnVmZmVyKTsKKwlpZiAoY2FtLT5kYXRhX2J1ZmZlcikKKwkJa2ZyZWUoY2FtLT5kYXRhX2J1ZmZlcik7CisJaWYgKGNhbS0+djRsZGV2KQorCQl2aWRlb19kZXZpY2VfcmVsZWFzZShjYW0tPnY0bGRldik7CisJdXAoJmNhbS0+ZGV2X3NlbSk7CisJa2ZyZWUoY2FtKTsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UqIGludGYpCit7CisJc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0gPSAKKwkgICAoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKil1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJZG93bl93cml0ZSgmdzk5NjhjZl9kaXNjb25uZWN0KTsKKworCWlmIChjYW0pIHsKKwkJLyogUHJldmVudCBjb25jdXJyZW50IGFjY2Vzc2VzIHRvIGRhdGEgKi8KKwkJZG93bigmY2FtLT5kZXZfc2VtKTsgCisKKwkJY2FtLT5kaXNjb25uZWN0ZWQgPSAxOworCisJCURCRygyLCAiRGlzY29ubmVjdGluZyAlcy4uLiIsIHN5bWJvbGljKGNhbWxpc3QsIGNhbS0+aWQpKQorCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmNhbS0+b3Blbik7CisKKwkJaWYgKGNhbS0+dXNlcnMpIHsKKwkJCURCRygyLCAiVGhlIGRldmljZSBpcyBvcGVuICgvZGV2L3ZpZGVvJWQpISAiCisJCQkgICAgICAgIlByb2Nlc3MgbmFtZTogJXMuIERlcmVnaXN0cmF0aW9uIGFuZCBtZW1vcnkgIgorCQkJICAgICAgICJkZWFsbG9jYXRpb24gYXJlIGRlZmVycmVkIG9uIGNsb3NlLiIsCisJCQkgICAgY2FtLT52NGxkZXYtPm1pbm9yLCBjYW0tPmNvbW1hbmQpCisJCQljYW0tPm1pc2NvbmZpZ3VyZWQgPSAxOworCQkJdzk5NjhjZl9zdG9wX3RyYW5zZmVyKGNhbSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhbS0+d2FpdF9xdWV1ZSk7CisJCX0gZWxzZQorCQkJdzk5NjhjZl9yZWxlYXNlX3Jlc291cmNlcyhjYW0pOworCisJCXVwKCZjYW0tPmRldl9zZW0pOworCisJCWlmICghY2FtLT51c2VycykKKwkJCWtmcmVlKGNhbSk7CisJfQorCisJdXBfd3JpdGUoJnc5OTY4Y2ZfZGlzY29ubmVjdCk7Cit9CisKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHc5OTY4Y2ZfdXNiX2RyaXZlciA9IHsKKwkub3duZXIgPSAgICAgIFRISVNfTU9EVUxFLAorCS5uYW1lID0gICAgICAgInc5OTY4Y2YiLAorCS5pZF90YWJsZSA9ICAgd2luYm9uZF9pZF90YWJsZSwKKwkucHJvYmUgPSAgICAgIHc5OTY4Y2ZfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gdzk5NjhjZl91c2JfZGlzY29ubmVjdCwKK307CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTW9kdWxlIGluaXQsIGV4aXQgYW5kIGludGVybW9kdWxlIGNvbW11bmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHc5OTY4Y2ZfdnBwbW9kX2RldGVjdChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwlpZiAoIXc5OTY4Y2ZfdnBwKQorCQlpZiAodnBwbW9kX2xvYWQpCisJCQlyZXF1ZXN0X21vZHVsZSgidzk5NjhjZi12cHAiKTsKKworCWRvd24oJnc5OTY4Y2ZfdnBwbW9kX2xvY2spOworCisJaWYgKCF3OTk2OGNmX3ZwcCkgeworCQlEQkcoNCwgIlZpZGVvIHBvc3QtcHJvY2Vzc2luZyBtb2R1bGUgbm90IGRldGVjdGVkIikKKwkJdzk5NjhjZl9hZGp1c3RfY29uZmlndXJhdGlvbihjYW0pOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHc5OTY4Y2ZfdnBwLT5vd25lcikpIHsKKwkJREJHKDEsICJDb3VsZG4ndCBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiAiCisJCSAgICAgICAidGhlIHZpZGVvIHBvc3QtcHJvY2Vzc2luZyBtb2R1bGUiKQorCQl1cCgmdzk5NjhjZl92cHBtb2RfbG9jayk7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCXc5OTY4Y2ZfdnBwLT5idXN5Kys7CisKKwlEQkcoNSwgIlZpZGVvIHBvc3QtcHJvY2Vzc2luZyBtb2R1bGUgZGV0ZWN0ZWQiKQorCitvdXQ6CisJdXAoJnc5OTY4Y2ZfdnBwbW9kX2xvY2spOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfdnBwbW9kX3JlbGVhc2Uoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJZG93bigmdzk5NjhjZl92cHBtb2RfbG9jayk7CisKKwlpZiAodzk5NjhjZl92cHAgJiYgdzk5NjhjZl92cHAtPmJ1c3kpIHsKKwkJbW9kdWxlX3B1dCh3OTk2OGNmX3ZwcC0+b3duZXIpOworCQl3OTk2OGNmX3ZwcC0+YnVzeS0tOworCQl3YWtlX3VwKCZ3OTk2OGNmX3ZwcG1vZF93YWl0KTsKKwkJREJHKDUsICJWaWRlbyBwb3N0LXByb2Nlc3NpbmcgbW9kdWxlIHJlbGVhc2VkIikKKwl9CisKKwl1cCgmdzk5NjhjZl92cHBtb2RfbG9jayk7Cit9CisKKworaW50IHc5OTY4Y2ZfdnBwbW9kX3JlZ2lzdGVyKHN0cnVjdCB3OTk2OGNmX3ZwcF90KiB2cHApCit7CisJZG93bigmdzk5NjhjZl92cHBtb2RfbG9jayk7CisKKwlpZiAodzk5NjhjZl92cHApIHsKKwkJS0RCRygxLCAiVmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSBhbHJlYWR5IHJlZ2lzdGVyZWQiKQorCQl1cCgmdzk5NjhjZl92cHBtb2RfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXc5OTY4Y2ZfdnBwID0gdnBwOworCXc5OTY4Y2ZfdnBwLT5idXN5ID0gMDsKKworCUtEQkcoMiwgIlZpZGVvIHBvc3QtcHJvY2Vzc2luZyBtb2R1bGUgcmVnaXN0ZXJlZCIpCisJdXAoJnc5OTY4Y2ZfdnBwbW9kX2xvY2spOworCXJldHVybiAwOworfQorCisKK2ludCB3OTk2OGNmX3ZwcG1vZF9kZXJlZ2lzdGVyKHN0cnVjdCB3OTk2OGNmX3ZwcF90KiB2cHApCit7CisJZG93bigmdzk5NjhjZl92cHBtb2RfbG9jayk7CisKKwlpZiAoIXc5OTY4Y2ZfdnBwKSB7CisJCXVwKCZ3OTk2OGNmX3ZwcG1vZF9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHc5OTY4Y2ZfdnBwICE9IHZwcCkgeworCQlLREJHKDEsICJPbmx5IHRoZSBvd25lciBjYW4gdW5yZWdpc3RlciB0aGUgdmlkZW8gIgorCQkgICAgICAgICJwb3N0LXByb2Nlc3NpbmcgbW9kdWxlIikKKwkJdXAoJnc5OTY4Y2ZfdnBwbW9kX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodzk5NjhjZl92cHAtPmJ1c3kpIHsKKwkJS0RCRygyLCAiVmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSBidXN5LiBXYWl0IGZvciBpdCB0byBiZSAiCisJCSAgICAgICAgInJlbGVhc2VkLi4uIikKKwkJdXAoJnc5OTY4Y2ZfdnBwbW9kX2xvY2spOworCQl3YWl0X2V2ZW50KHc5OTY4Y2ZfdnBwbW9kX3dhaXQsICF3OTk2OGNmX3ZwcC0+YnVzeSk7CisJCXc5OTY4Y2ZfdnBwID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJdzk5NjhjZl92cHAgPSBOVUxMOworCisJdXAoJnc5OTY4Y2ZfdnBwbW9kX2xvY2spOworCitvdXQ6CisJS0RCRygyLCAiVmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSB1bnJlZ2lzdGVyZWQiKQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHc5OTY4Y2ZfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJS0RCRygyLCBXOTk2OENGX01PRFVMRV9OQU1FIiAiVzk5NjhDRl9NT0RVTEVfVkVSU0lPTikKKwlLREJHKDMsIFc5OTY4Q0ZfTU9EVUxFX0FVVEhPUikKKworCWlmIChvdm1vZF9sb2FkKQorCQlyZXF1ZXN0X21vZHVsZSgib3ZjYW1jaGlwIik7CisKKwlpZiAoKGVyciA9IHVzYl9yZWdpc3Rlcigmdzk5NjhjZl91c2JfZHJpdmVyKSkpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgdzk5NjhjZl9tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qIHc5OTY4Y2ZfdXNiX2Rpc2Nvbm5lY3QoKSB3aWxsIGJlIGNhbGxlZCAqLworCXVzYl9kZXJlZ2lzdGVyKCZ3OTk2OGNmX3VzYl9kcml2ZXIpOworCisJS0RCRygyLCBXOTk2OENGX01PRFVMRV9OQU1FIiBkZXJlZ2lzdGVyZWQiKQorfQorCisKK21vZHVsZV9pbml0KHc5OTY4Y2ZfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQodzk5NjhjZl9tb2R1bGVfZXhpdCk7CisKKworRVhQT1JUX1NZTUJPTCh3OTk2OGNmX3ZwcG1vZF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHc5OTY4Y2ZfdnBwbW9kX2RlcmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZi5oIGIvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2JmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmLmgKQEAgLTAsMCArMSwzMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZpZGVvNExpbnV4IGRyaXZlciBmb3IgVzk5Nls4N11DRiBKUEVHIFVTQiBEdWFsIE1vZGUgQ2FtZXJhIENoaXAuICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1c5OTY4Q0ZfSF8KKyNkZWZpbmUgX1c5OTY4Q0ZfSF8KKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgPG1lZGlhL292Y2FtY2hpcC5oPgorCisjaW5jbHVkZSAidzk5NjhjZl92cHAuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmYXVsdCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFc5OTY4Q0ZfT1ZNT0RfTE9BRCAgICAgIDEgIC8qIGF1dG9tYXRpYyAnb3ZjYW1jaGlwJyBtb2R1bGUgbG9hZGluZyAqLworI2RlZmluZSBXOTk2OENGX1ZQUE1PRF9MT0FEICAgICAxICAvKiBhdXRvbWF0aWMgJ3c5OTY4Y2YtdnBwJyBtb2R1bGUgbG9hZGluZyAqLworCisvKiBDb21tZW50L3VuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZW5hYmxlL2Rpc2FibGUgZGVidWdnaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIFc5OTY4Q0ZfREVCVUcKKworLyogVGhlc2UgaGF2ZSBlZmZlY3Qgb25seSBpZiBXOTk2OENGX0RFQlVHIGlzIGRlZmluZWQgKi8KKyNkZWZpbmUgVzk5NjhDRl9ERUJVR19MRVZFTCAgICAyIC8qIGZyb20gMCB0byA2LiAwIGZvciBubyBkZWJ1ZyBpbmZvcm1hdGlvbnMgKi8KKyNkZWZpbmUgVzk5NjhDRl9TUEVDSUZJQ19ERUJVRyAwIC8qIDAgb3IgMSAqLworCisjZGVmaW5lIFc5OTY4Q0ZfTUFYX0RFVklDRVMgICAgMzIKKyNkZWZpbmUgVzk5NjhDRl9TSU1DQU1TICAgICAgICBXOTk2OENGX01BWF9ERVZJQ0VTIC8qIHNpbXVsdGFuZW91cyBjYW1lcmFzICovCisKKyNkZWZpbmUgVzk5NjhDRl9NQVhfQlVGRkVSUyAgIDMyCisjZGVmaW5lIFc5OTY4Q0ZfQlVGRkVSUyAgICAgICAyIC8qIG4uIG9mIGZyYW1lIGJ1ZmZlcnMgZnJvbSAyIHRvIE1BWF9CVUZGRVJTICovCisKKy8qIE1heGltdW0gZGF0YSBwYXlsb2FkIHNpemVzIGluIGJ5dGVzIGZvciBhbHRlcm5hdGUgc2V0dGluZ3MgKi8KK3N0YXRpYyBjb25zdCB1MTYgd01heFBhY2tldFNpemVbXSA9IHsxMDIzLCA5NTksIDg5NSwgODMxLCA3NjcsIDcwMywgNjM5LCA1NzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMSwgNDQ3LCAzODMsIDMxOSwgMjU1LCAxOTEsIDEyNywgIDYzfTsKKyNkZWZpbmUgVzk5NjhDRl9QQUNLRVRfU0laRSAgICAgIDEwMjMgLyogYWNjb3JkaW5nIHRvIHdNYXhQYWNrZXRTaXplc1tdICovCisjZGVmaW5lIFc5OTY4Q0ZfTUlOX1BBQ0tFVF9TSVpFICA2MyAvKiBtaW5pbXVtIHZhbHVlICovCisjZGVmaW5lIFc5OTY4Q0ZfSVNPX1BBQ0tFVFMgICAgICA1IC8qIG4ub2YgcGFja2V0cyBmb3IgaXNvY2hyb25vdXMgdHJhbnNmZXJzICovCisjZGVmaW5lIFc5OTY4Q0ZfVVNCX0NUUkxfVElNRU9VVCAxMDAwIC8qIHRpbWVvdXQgKG1zKSBmb3IgdXNiIGNvbnRyb2wgY29tbWFuZHMgKi8KKyNkZWZpbmUgVzk5NjhDRl9VUkJTICAgICAgICAgICAgIDIgLyogbi4gb2Ygc2NoZWR1bGVkIFVSQnMgZm9yIElTTyB0cmFuc2ZlciAqLworCisjZGVmaW5lIFc5OTY4Q0ZfSTJDX0JVU19ERUxBWSAgICA0IC8qIGRlbGF5IGluIHVzIGZvciBJMkMgYml0IHIvdyBvcGVyYXRpb25zICovCisjZGVmaW5lIFc5OTY4Q0ZfSTJDX1JXX1JFVFJJRVMgICAxNSAvKiBudW1iZXIgb2YgbWF4IEkyQyByL3cgcmV0cmllcyAqLworCisvKiBBdmFpbGFibGUgdmlkZW8gZm9ybWF0cyAqLworc3RydWN0IHc5OTY4Y2ZfZm9ybWF0IHsKKwljb25zdCB1MTYgcGFsZXR0ZTsKKwljb25zdCB1MTYgZGVwdGg7CisJY29uc3QgdTggY29tcHJlc3Npb247Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHc5OTY4Y2ZfZm9ybWF0IHc5OTY4Y2ZfZm9ybWF0bGlzdFtdID0geworCXsgVklERU9fUEFMRVRURV9VWVZZLCAgICAxNiwgMCB9LCAvKiBvcmlnaW5hbCB2aWRlbyAqLworCXsgVklERU9fUEFMRVRURV9ZVVY0MjJQLCAxNiwgMSB9LCAvKiB3aXRoIEpQRUcgY29tcHJlc3Npb24gKi8KKwl7IFZJREVPX1BBTEVUVEVfWVVWNDIwUCwgMTIsIDEgfSwgLyogd2l0aCBKUEVHIGNvbXByZXNzaW9uICovCisJeyBWSURFT19QQUxFVFRFX1lVVjQyMCwgIDEyLCAxIH0sIC8qIHNhbWUgYXMgWVVWNDIwUCAqLworCXsgVklERU9fUEFMRVRURV9ZVVlWLCAgICAxNiwgMCB9LCAvKiBzb2Z0d2FyZSBjb252ZXJzaW9uICovCisJeyBWSURFT19QQUxFVFRFX1lVVjQyMiwgIDE2LCAwIH0sIC8qIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKwl7IFZJREVPX1BBTEVUVEVfR1JFWSwgICAgIDgsIDAgfSwgLyogc29mdHdhcmUgY29udmVyc2lvbiAqLworCXsgVklERU9fUEFMRVRURV9SR0I1NTUsICAxNiwgMCB9LCAvKiBzb2Z0d2FyZSBjb252ZXJzaW9uICovCisJeyBWSURFT19QQUxFVFRFX1JHQjU2NSwgIDE2LCAwIH0sIC8qIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKwl7IFZJREVPX1BBTEVUVEVfUkdCMjQsICAgMjQsIDAgfSwgLyogc29mdHdhcmUgY29udmVyc2lvbiAqLworCXsgVklERU9fUEFMRVRURV9SR0IzMiwgICAzMiwgMCB9LCAvKiBzb2Z0d2FyZSBjb252ZXJzaW9uICovCisJeyAwLCAgICAgICAgICAgICAgICAgICAgICAwLCAwIH0gIC8qIDAgaXMgYSB0ZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworI2RlZmluZSBXOTk2OENGX0RFQ09NUFJFU1NJT04gICAgMiAvKiBkZWNvbXA6MD1kaXNhYmxlLDE9Zm9yY2UsMj1hbnkgZm9ybWF0cyAqLworI2RlZmluZSBXOTk2OENGX1BBTEVUVEVfREVDT01QX09GRiAgIFZJREVPX1BBTEVUVEVfVVlWWSAgICAvKiB3aGVuIGRlY29tcD0wICovCisjZGVmaW5lIFc5OTY4Q0ZfUEFMRVRURV9ERUNPTVBfRk9SQ0UgVklERU9fUEFMRVRURV9ZVVY0MjBQIC8qIHdoZW4gZGVjb21wPTEgKi8KKyNkZWZpbmUgVzk5NjhDRl9QQUxFVFRFX0RFQ09NUF9PTiAgICBWSURFT19QQUxFVFRFX1VZVlkgICAgLyogd2hlbiBkZWNvbXA9MiAqLworCisjZGVmaW5lIFc5OTY4Q0ZfRk9SQ0VfUkdCICAgICAgICAwICAvKiByZWFkIFJHQiBpbnN0ZWFkIG9mIEJHUiwgeWVzPTEvbm89MCAqLworCisjZGVmaW5lIFc5OTY4Q0ZfTUFYX1dJRFRIICAgICAgODAwIC8qIEhhcyBlZmZlY3QgaWYgdXAtc2NhbGluZyBpcyBvbiAqLworI2RlZmluZSBXOTk2OENGX01BWF9IRUlHSFQgICAgIDYwMCAvKiBIYXMgZWZmZWN0IGlmIHVwLXNjYWxpbmcgaXMgb24gKi8KKyNkZWZpbmUgVzk5NjhDRl9XSURUSCAgICAgICAgICAzMjAgLyogZnJvbSAxMjggdG8gMzUyLCBtdWx0aXBsZSBvZiAxNiAqLworI2RlZmluZSBXOTk2OENGX0hFSUdIVCAgICAgICAgIDI0MCAvKiBmcm9tICA5NiB0byAyODgsIG11bHRpcGxlIG9mIDE2ICovCisKKyNkZWZpbmUgVzk5NjhDRl9DTEFNUElORyAgICAgICAwIC8qIDAgZGlzYWJsZSwgMSBlbmFibGUgdmlkZW8gZGF0YSBjbGFtcGluZyAqLworI2RlZmluZSBXOTk2OENGX0ZJTFRFUl9UWVBFICAgIDAgLyogMCBkaXNhYmxlICAxICgxLTItMSksIDIgKDItMy02LTMtMikgKi8KKyNkZWZpbmUgVzk5NjhDRl9ET1VCTEVfQlVGRkVSICAxIC8qIDAgZGlzYWJsZSwgMSBlbmFibGUgZG91YmxlIGJ1ZmZlciAqLworI2RlZmluZSBXOTk2OENGX0xBUkdFVklFVyAgICAgIDEgLyogMCBkaXNhYmxlLCAxIGVuYWJsZSAqLworI2RlZmluZSBXOTk2OENGX1VQU0NBTElORyAgICAgIDAgLyogMCBkaXNhYmxlLCAxIGVuYWJsZSAqLworCisjZGVmaW5lIFc5OTY4Q0ZfTU9OT0NIUk9NRSAgICAgMCAvKiAwIG5vdCBtb25vY2hyb21lLCAxIG1vbm9jaHJvbWUgc2Vuc29yICovCisjZGVmaW5lIFc5OTY4Q0ZfQlJJR0hUTkVTUyAgICAgMzEwMDAgLyogZnJvbSAwIHRvIDY1NTM1ICovCisjZGVmaW5lIFc5OTY4Q0ZfSFVFICAgICAgICAgICAgMzI3NjggLyogZnJvbSAwIHRvIDY1NTM1ICovCisjZGVmaW5lIFc5OTY4Q0ZfQ09MT1VSICAgICAgICAgMzI3NjggLyogZnJvbSAwIHRvIDY1NTM1ICovCisjZGVmaW5lIFc5OTY4Q0ZfQ09OVFJBU1QgICAgICAgNTAwMDAgLyogZnJvbSAwIHRvIDY1NTM1ICovCisjZGVmaW5lIFc5OTY4Q0ZfV0hJVEVORVNTICAgICAgMzI3NjggLyogZnJvbSAwIHRvIDY1NTM1ICovCisKKyNkZWZpbmUgVzk5NjhDRl9BVVRPQlJJR0hUICAgICAwIC8qIDAgZGlzYWJsZSwgMSBlbmFibGUgYXV0b21hdGljIGJyaWdodG5lc3MgKi8KKyNkZWZpbmUgVzk5NjhDRl9BVVRPRVhQICAgICAgICAxIC8qIDAgZGlzYWJsZSwgMSBlbmFibGUgYXV0b21hdGljIGV4cG9zdXJlICovCisjZGVmaW5lIFc5OTY4Q0ZfTElHSFRGUkVRICAgICAgNTAgLyogbGlnaHQgZnJlcXVlbmN5LiA1MEh6IChFdXJvcGUpIG9yIDYwSHogKi8KKyNkZWZpbmUgVzk5NjhDRl9CQU5ESU5HRklMVEVSICAwIC8qIDAgZGlzYWJsZSwgMSBlbmFibGUgYmFuZGluZyBmaWx0ZXIgKi8KKyNkZWZpbmUgVzk5NjhDRl9CQUNLTElHSFQgICAgICAwIC8qIDAgb3IgMSwgMT1vYmplY3QgaXMgbGl0IGZyb20gYmVoaW5kICovCisjZGVmaW5lIFc5OTY4Q0ZfTUlSUk9SICAgICAgICAgMCAvKiAwIG9yIDEgW2Rvbid0XSByZXZlcnNlIGltYWdlIGhvcml6b250YWxseSovCisKKyNkZWZpbmUgVzk5NjhDRl9DTE9DS0RJViAgICAgICAgIC0xIC8qIC0xID0gYXV0b21hdGljIGNsb2NrIGRpdmlzb3IgKi8KKyNkZWZpbmUgVzk5NjhDRl9ERUZfQ0xPQ0tESVZJU09SICAwIC8qIGRlZmF1bHQgc2Vuc29yIGNsb2NrIGRpdmlzb3IgdmFsdWUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2xvYmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFc5OTY4Q0ZfTU9EVUxFX05BTUUgICAgICJWNEwgZHJpdmVyIGZvciBXOTk2Wzg3XUNGIEpQRUcgVVNCICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVhbCBNb2RlIENhbWVyYSBDaGlwIgorI2RlZmluZSBXOTk2OENGX01PRFVMRV9WRVJTSU9OICAiMToxLjMzLWJhc2ljIgorI2RlZmluZSBXOTk2OENGX01PRFVMRV9BVVRIT1IgICAiKEMpIDIwMDItMjAwNCBMdWNhIFJpc29saWEiCisjZGVmaW5lIFc5OTY4Q0ZfQVVUSE9SX0VNQUlMICAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCisjZGVmaW5lIFc5OTY4Q0ZfTU9EVUxFX0xJQ0VOU0UgICJHUEwiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCB3aW5ib25kX2lkX3RhYmxlW10gPSB7CisJeworCQkvKiBDcmVhdGl2ZSBMYWJzIFZpZGVvIEJsYXN0ZXIgV2ViQ2FtIEdvIFBsdXMgKi8KKwkJVVNCX0RFVklDRSgweDA0MWUsIDB4NDAwMyksCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSJ3OTk2OGNmIiwKKwl9LAorCXsKKwkJLyogR2VuZXJpYyBXOTk2Wzg3XUNGIEpQRUcgVVNCIER1YWwgTW9kZSBDYW1lcmEgKi8KKwkJVVNCX0RFVklDRSgweDEwNDYsIDB4OTk2NyksCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSJ3OTk2OGNmIiwKKwl9LAorCXsgfSAvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworLyogVzk5Nls4N11DRiBjYW1lcmEgbW9kZWxzLCBpbnRlcm5hbCBpZHM6ICovCitlbnVtIHc5OTY4Y2ZfbW9kZWxfaWQgeworCVc5OTY4Q0ZfTU9EX0dFTkVSSUMgPSAxLCAvKiBHZW5lcmljIFc5OTZbODddQ0YgYmFzZWQgZGV2aWNlICovCisJVzk5NjhDRl9NT0RfQ0xWQldHUCA9IDExLC8qQ3JlYXRpdmUgTGFicyBWaWRlbyBCbGFzdGVyIFdlYkNhbSBHbyBQbHVzKi8KKwlXOTk2OENGX01PRF9BRFBWRE1BID0gMjEsIC8qIEFyb21hIERpZ2kgUGVuIFZHQSBEdWFsIE1vZGUgQURHLTUwMDAgKi8KKwlXOTk4NkNGX01PRF9BQVUgPSAzMSwgICAgIC8qIEFWZXJNZWRpYSBBVmVyVFYgVVNCICovCisJVzk5NjhDRl9NT0RfQ0xWQldHID0gMzQsICAvKiBDcmVhdGl2ZSBMYWJzIFZpZGVvIEJsYXN0ZXIgV2ViQ2FtIEdvICovCisJVzk5NjhDRl9NT0RfTEwgPSAzNywgICAgICAvKiBMZWJvbiBMREMtMDM1QSAqLworCVc5OTY4Q0ZfTU9EX0VFRU1DID0gNDAsICAgLyogRXpvbmljcyBFWi04MDIgRVpNZWdhIENhbSAqLworCVc5OTY4Q0ZfTU9EX09PRSA9IDQyLCAgICAgLyogT21uaVZpc2lvbiBPVjg2MTAtRURFICovCisJVzk5NjhDRl9NT0RfT0RQVkRNUEMgPSA0MywvKiBPUENPTSBEaWdpIFBlbiBWR0EgRHVhbCBNb2RlIFBlbiBDYW1lcmEgKi8KKwlXOTk2OENGX01PRF9QRFBJSSA9IDQ2LCAgIC8qIFByZXRlYyBEaWdpIFBlbi1JSSAqLworCVc5OTY4Q0ZfTU9EX1BEUDQ4MCA9IDQ5LCAgLyogUHJldGVjIERpZ2lQZW4tNDgwICovCit9OworCitlbnVtIHc5OTY4Y2ZfZnJhbWVfc3RhdHVzIHsKKwlGX1JFQURZLCAgICAgICAgICAgIC8qIGZpbmlzaGVkIGdyYWJiaW5nICYgcmVhZHkgdG8gYmUgcmVhZC9zeW5jZWQgKi8KKwlGX0dSQUJCSU5HLCAgICAgICAgIC8qIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGdyYWJiZWQgaW50byAqLworCUZfRVJST1IsICAgICAgICAgICAgLyogc29tZXRoaW5nIGJhZCBoYXBwZW5lZCB3aGlsZSBwcm9jZXNzaW5nICovCisJRl9VTlVTRUQgICAgICAgICAgICAvKiB1bnVzZWQgKG5vIFZJRElPQ01DQVBUVVJFKSAqLworfTsKKworc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCB7CisJdm9pZCogYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1MzIgbGVuZ3RoOworCWludCBudW1iZXI7CisJZW51bSB3OTk2OGNmX2ZyYW1lX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCogbmV4dDsKKwl1OCBxdWV1ZWQ7Cit9OworCitlbnVtIHc5OTY4Y2ZfdnBwX2ZsYWcgeworCVZQUF9OT05FID0gMHgwMCwKKwlWUFBfVVBTQ0FMRSA9IDB4MDEsCisJVlBQX1NXQVBfWVVWX0JZVEVTID0gMHgwMiwKKwlWUFBfREVDT01QUkVTU0lPTiA9IDB4MDQsCisJVlBQX1VZVllfVE9fUkdCWCA9IDB4MDgsCit9OworCitzdGF0aWMgc3RydWN0IHc5OTY4Y2ZfdnBwX3QqIHc5OTY4Y2ZfdnBwOworc3RhdGljIERFQ0xBUkVfTVVURVgodzk5NjhjZl92cHBtb2RfbG9jayk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodzk5NjhjZl92cHBtb2Rfd2FpdCk7CisKK3N0YXRpYyBMSVNUX0hFQUQodzk5NjhjZl9kZXZfbGlzdCk7IC8qIGhlYWQgb2YgVjRMIHJlZ2lzdGVyZWQgY2FtZXJhcyBsaXN0ICovCitzdGF0aWMgREVDTEFSRV9NVVRFWCh3OTk2OGNmX2Rldmxpc3Rfc2VtKTsgLyogc2VtYXBob3JlIGZvciBsaXN0IHRyYXZlcnNhbCAqLworCitzdGF0aWMgREVDTEFSRV9SV1NFTSh3OTk2OGNmX2Rpc2Nvbm5lY3QpOyAvKiBwcmV2ZW50IHJhY2VzIHdpdGggb3BlbigpICovCisKKy8qIE1haW4gZGV2aWNlIGRyaXZlciBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB3OTk2OGNmX2RldmljZSB7CisJc3RydWN0IGRldmljZSBkZXY7IC8qIGRldmljZSBzdHJ1Y3R1cmUgKi8KKworCWVudW0gdzk5NjhjZl9tb2RlbF9pZCBpZDsgICAvKiBwcml2YXRlIGRldmljZSBpZGVudGlmaWVyICovCisKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlKiB2NGxkZXY7IC8qIC0+IFY0TCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHY0bGxpc3Q7ICAgIC8qIGVudHJ5IG9mIHRoZSBsaXN0IG9mIFY0TCBjYW1lcmFzICovCisKKwlzdHJ1Y3QgdXNiX2RldmljZSogdXNiZGV2OyAgICAgICAgICAgLyogLT4gbWFpbiBVU0Igc3RydWN0dXJlICovCisJc3RydWN0IHVyYiogdXJiW1c5OTY4Q0ZfVVJCU107ICAgICAgIC8qIC0+IFVTQiByZXF1ZXN0IGJsb2NrIHN0cnVjdHMgKi8KKwl2b2lkKiB0cmFuc2Zlcl9idWZmZXJbVzk5NjhDRl9VUkJTXTsgLyogLT4gSVNPIHRyYW5zZmVyIGJ1ZmZlcnMgKi8KKwl1MTYqIGNvbnRyb2xfYnVmZmVyOyAgICAgICAgICAgICAgICAgLyogLT4gYnVmZmVyIGZvciBjb250cm9sIHJlcS4qLworCXUxNiogZGF0YV9idWZmZXI7ICAgICAgICAgICAgICAgICAgICAvKiAtPiBkYXRhIHRvIHNlbmQgdG8gdGhlIEZTQiAqLworCisJc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCBmcmFtZVtXOTk2OENGX01BWF9CVUZGRVJTXTsKKwlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90IGZyYW1lX3RtcDsgLyogdGVtcG9yYXJ5IGZyYW1lICovCisJc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCBmcmFtZV92cHA7IC8qIGhlbHBlciBmcmFtZS4qLworCXN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqIGZyYW1lX2N1cnJlbnQ7IC8qIC0+IGZyYW1lIGJlaW5nIGdyYWJiZWQgKi8KKwlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiByZXF1ZXN0ZWRfZnJhbWVbVzk5NjhDRl9NQVhfQlVGRkVSU107CisKKwl1OCBtYXhfYnVmZmVycywgICAvKiBudW1iZXIgb2YgcmVxdWVzdGVkIGJ1ZmZlcnMgKi8KKwkgICBmb3JjZV9wYWxldHRlLCAvKiB5ZXM9MS9ubz0wICovCisJICAgZm9yY2VfcmdiLCAgICAgLyogcmVhZCBSR0IgaW5zdGVhZCBvZiBCR1IsIHllcz0xLCBubz0wICovCisJICAgZG91YmxlX2J1ZmZlciwgLyogaGFyZHdhcmUgZG91YmxlIGJ1ZmZlcmluZyB5ZXM9MS9ubz0wICovCisJICAgY2xhbXBpbmcsICAgICAgLyogdmlkZW8gZGF0YSBjbGFtcGluZyB5ZXM9MS9ubz0wICovCisJICAgZmlsdGVyX3R5cGUsICAgLyogMD1kaXNhYmxlZCwgMT0zIHRhcCwgMj01IHRhcCBmaWx0ZXIgKi8KKwkgICBjYXB0dXJlLCAgICAgICAvKiAwPWRpc2FibGVkLCAxPWVuYWJsZWQgKi8KKwkgICBsYXJnZXZpZXcsICAgICAvKiAwPWRpc2FibGVkLCAxPWVuYWJsZWQgKi8KKwkgICBkZWNvbXByZXNzaW9uLCAvKiAwPWRpc2FibGVkLCAxPWZvcmNlZCwgMj1hbGxvd2VkICovCisJICAgdXBzY2FsaW5nOyAgICAgLyogc29mdHdhcmUgaW1hZ2Ugc2NhbGluZywgMD1lbmFibGVkLCAxPWRpc2FibGVkICovCisKKwlzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0dXJlOyAvKiBjdXJyZW50IHBpY3R1cmUgc2V0dGluZ3MgKi8KKwlzdHJ1Y3QgdmlkZW9fd2luZG93IHdpbmRvdzsgICAvKiBjdXJyZW50IHdpbmRvdyBzZXR0aW5ncyAqLworCisJdTE2IGh3X2RlcHRoLCAgICAvKiBkZXB0aCAodXNlZCBieSB0aGUgY2hpcCkgKi8KKwkgICAgaHdfcGFsZXR0ZSwgIC8qIHBhbGV0dGUgKHVzZWQgYnkgdGhlIGNoaXApICovCisJICAgIGh3X3dpZHRoLCAgICAvKiB3aWR0aCAodXNlZCBieSB0aGUgY2hpcCkgKi8KKwkgICAgaHdfaGVpZ2h0LCAgIC8qIGhlaWdodCAodXNlZCBieSB0aGUgY2hpcCkgKi8KKwkgICAgaHNfcG9sYXJpdHksIC8qIDA9bmVnYXRpdmUgc3luYyBwdWxzZSwgMT1wb3NpdGl2ZSBzeW5jIHB1bHNlICovCisJICAgIHZzX3BvbGFyaXR5LCAvKiAwPW5lZ2F0aXZlIHN5bmMgcHVsc2UsIDE9cG9zaXRpdmUgc3luYyBwdWxzZSAqLworCSAgICBzdGFydF9jcm9weCwgLyogcGl4ZWxzIGZyb20gSFMgaW5hY3RpdmUgZWRnZSB0byAxc3QgY3JvcHBlZCBwaXhlbCovCisJICAgIHN0YXJ0X2Nyb3B5OyAvKiBwaXhlbHMgZnJvbSBWUyBpbmFjdGl2ZSBlZGdlIHRvIDFzdCBjcm9wcGVkIHBpeGVsKi8KKworCWVudW0gdzk5NjhjZl92cHBfZmxhZyB2cHBfZmxhZzsgLyogcG9zdC1wcm9jZXNzaW5nIHJvdXRpbmVzIGluIHVzZSAqLworCisJdTggbmJ1ZmZlcnMsICAgICAgLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBmcmFtZSBidWZmZXJzICovCisJICAgYWx0c2V0dGluZywgICAgLyogY2FtZXJhIGFsdGVybmF0ZSBzZXR0aW5nICovCisJICAgZGlzY29ubmVjdGVkLCAgLyogZmxhZzogeWVzPTEsIG5vPTAgKi8KKwkgICBtaXNjb25maWd1cmVkLCAvKiBmbGFnOiB5ZXM9MSwgbm89MCAqLworCSAgIHVzZXJzLCAgICAgICAgIC8qIGZsYWc6IG51bWJlciBvZiB1c2VycyBob2xkaW5nIHRoZSBkZXZpY2UgKi8KKwkgICBzdHJlYW1pbmc7ICAgICAvKiBmbGFnOiB5ZXM9MSwgbm89MCAqLworCisJdTggc2Vuc29yX2luaXRpYWxpemVkOyAvKiBmbGFnOiB5ZXM9MSwgbm89MCAqLworCisJLyogRGV0ZXJtaW5lZCBieSB0aGUgaW1hZ2Ugc2Vuc29yIHR5cGU6ICovCisJaW50IHNlbnNvciwgICAgICAgLyogdHlwZSBvZiBpbWFnZSBzZW5zb3IgY2hpcCAoQ0NfKikgKi8KKwkgICAgbW9ub2Nocm9tZTsgICAvKiBpbWFnZSBzZW5zb3IgaXMgKHByb2JhYmx5KSBtb25vY2hyb21lICovCisJdTE2IG1heHdpZHRoLCAgICAgLyogbWF4aW11bSB3aWR0aCBzdXBwb3J0ZWQgYnkgdGhlIGltYWdlIHNlbnNvciAqLworCSAgICBtYXhoZWlnaHQsICAgIC8qIG1heGltdW0gaGVpZ2h0IHN1cHBvcnRlZCBieSB0aGUgaW1hZ2Ugc2Vuc29yICovCisJICAgIG1pbndpZHRoLCAgICAgLyogbWluaW11bSB3aWR0aCBzdXBwb3J0ZWQgYnkgdGhlIGltYWdlIHNlbnNvciAqLworCSAgICBtaW5oZWlnaHQ7ICAgIC8qIG1pbmltdW0gaGVpZ2h0IHN1cHBvcnRlZCBieSB0aGUgaW1hZ2Ugc2Vuc29yICovCisJdTggIGF1dG9fYnJ0LCAgICAgLyogYXV0byBicmlnaHRuZXNzIGVuYWJsZWQgZmxhZyAqLworCSAgICBhdXRvX2V4cCwgICAgIC8qIGF1dG8gZXhwb3N1cmUgZW5hYmxlZCBmbGFnICovCisJICAgIGJhY2tsaWdodCwgICAgLyogYmFja2xpZ2h0IGV4cG9zdXJlIGFsZ29yaXRobSBmbGFnICovCisJICAgIG1pcnJvciwgICAgICAgLyogaW1hZ2UgaXMgcmV2ZXJzZWQgaG9yaXpvbnRhbGx5ICovCisJICAgIGxpZ2h0ZnJlcSwgICAgLyogcG93ZXIgKGxpZ2h0aW5nKSBmcmVxdWVuY3kgKi8KKwkgICAgYmFuZGZpbHQ7ICAgICAvKiBiYW5kaW5nIGZpbHRlciBlbmFibGVkIGZsYWcgKi8KKwlzOCAgY2xvY2tkaXY7ICAgICAvKiBjbG9jayBkaXZpc29yICovCisKKwkvKiBJMkMgaW50ZXJmYWNlIHRvIGtlcm5lbCAqLworCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCogc2Vuc29yX2NsaWVudDsKKworCS8qIExvY2tzICovCisJc3RydWN0IHNlbWFwaG9yZSBkZXZfc2VtLCAgICAvKiBmb3IgcHJvYmUsIGRpc2Nvbm5lY3Qsb3BlbiBhbmQgY2xvc2UgKi8KKwkgICAgICAgICAgICAgICAgIGZpbGVvcF9zZW07IC8qIGZvciByZWFkIGFuZCBpb2N0bCAqLworCXNwaW5sb2NrX3QgdXJiX2xvY2ssICAgLyogZm9yIHN1Ym1pdF91cmIoKSBhbmQgdW5saW5rX3VyYigpICovCisJICAgICAgICAgICBmbGlzdF9sb2NrOyAvKiBmb3IgcmVxdWVzdGVkIGZyYW1lIGxpc3QgYWNjZXNzZXMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuLCB3YWl0X3F1ZXVlOworCisJY2hhciBjb21tYW5kWzE2XTsgLyogbmFtZSBvZiB0aGUgcHJvZ3JhbSBob2xkaW5nIHRoZSBkZXZpY2UgKi8KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hY3JvcyBmb3IgZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3VuZGVmIERCRworI3VuZGVmIEtEQkcKKyNpZmRlZiBXOTk2OENGX0RFQlVHCisvKiBGb3IgZGV2aWNlIHNwZWNpZmljIGRlYnVnZ2luZyBtZXNzYWdlcyAqLworIwlkZWZpbmUgREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICggKChzcGVjaWZpY19kZWJ1ZykgJiYgKGRlYnVnID09IChsZXZlbCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAoKCFzcGVjaWZpY19kZWJ1ZykgJiYgKGRlYnVnID49IChsZXZlbCkpKSApIHsgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKChsZXZlbCkgPT0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlkZXZfZXJyKCZjYW0tPmRldiwgZm10ICJcbiIsICMjIGFyZ3MpOyAgICAgICAgICAgICAgICBcCisJCWVsc2UgaWYgKChsZXZlbCkgPT0gMiB8fCAobGV2ZWwpID09IDMpICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJZGV2X2luZm8oJmNhbS0+ZGV2LCBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgICAgICAgICAgXAorCQllbHNlIGlmICgobGV2ZWwpID09IDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWRldl93YXJuKCZjYW0tPmRldiwgZm10ICJcbiIsICMjIGFyZ3MpOyAgICAgICAgICAgICAgIFwKKwkJZWxzZSBpZiAoKGxldmVsKSA+PSA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlkZXZfaW5mbygmY2FtLT5kZXYsICJbJXM6JWRdICIgZm10ICJcbiIsICAgICAgICAgICAgICBcCisJCQkgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fICwgIyMgYXJncyk7ICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8qIEZvciBnZW5lcmljIGtlcm5lbCAobm90IGRldmljZSBzcGVjaWZpYykgbWVzc2FnZXMgKi8KKyMJZGVmaW5lIEtEQkcobGV2ZWwsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoICgoc3BlY2lmaWNfZGVidWcpICYmIChkZWJ1ZyA9PSAobGV2ZWwpKSkgfHwgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgKCghc3BlY2lmaWNfZGVidWcpICYmIChkZWJ1ZyA+PSAobGV2ZWwpKSkgKSB7ICAgICAgICAgICAgICAgICAgICBcCisJCWlmICgobGV2ZWwpID49IDEgJiYgKGxldmVsKSA8PSA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJcHJfaW5mbygidzk5NjhjZjogIiBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgICAgICAgICAgXAorCQllbHNlIGlmICgobGV2ZWwpID49IDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCXByX2RlYnVnKCJ3OTk2OGNmOiBbJXM6JWRdICIgZm10ICJcbiIsIF9fRlVOQ1RJT05fXywgIFwKKwkJCSAgICAgICAgIF9fTElORV9fICwgIyMgYXJncyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UKKwkvKiBOb3QgZGVidWdnaW5nOiBub3RoaW5nICovCisjCWRlZmluZSBEQkcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8gezt9IHdoaWxlKDApOworIwlkZWZpbmUgS0RCRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7O30gd2hpbGUoMCk7CisjZW5kaWYKKworI3VuZGVmIFBEQkcKKyNkZWZpbmUgUERCRyhmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2Rldl9pbmZvKCZjYW0tPmRldiwgIlslczolZF0gIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyAsICMjIGFyZ3MpOworCisjdW5kZWYgUERCR0cKKyNkZWZpbmUgUERCR0coZm10LCBhcmdzLi4uKSBkbyB7O30gd2hpbGUoMCk7IC8qIG5vdGhpbmc6IGl0J3MgYSBwbGFjZWhvbGRlciAqLworCisjZW5kaWYgLyogX1c5OTY4Q0ZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3c5OTY4Y2ZfZGVjb2Rlci5oIGIvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZl9kZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmYWNjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3c5OTY4Y2ZfZGVjb2Rlci5oCkBAIC0wLDAgKzEsODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZpZGVvIGRlY29kZXIgZm9yIHRoZSBXOTk2Wzg3XUNGIGRyaXZlciBmb3IgTGludXguICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAyMDA0IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1c5OTY4Q0ZfREVDT0RFUl9IXworI2RlZmluZSBfVzk5NjhDRl9ERUNPREVSX0hfCisKKy8qIENvbW1lbnQvdW5jb21tZW50IHRoaXMgZm9yIGhpZ2gvbG93IHF1YWxpdHkgb2YgY29tcHJlc3NlZCB2aWRlbyAqLworI2RlZmluZSBXOTk2OENGX0RFQ19GQVNUX0xPV1FVQUxJVFlfVklERU8KKworI2lmZGVmIFc5OTY4Q0ZfREVDX0ZBU1RfTE9XUVVBTElUWV9WSURFTworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgWV9RVUFOVEFCTEVbNjRdID0geworCTE2LCAgMTEsICAxMCwgIDE2LCAgMjQsICA0MCwgIDUxLCAgNjEsCisJMTIsICAxMiwgIDE0LCAgMTksICAyNiwgIDU4LCAgNjAsICA1NSwKKwkxNCwgIDEzLCAgMTYsICAyNCwgIDQwLCAgNTcsICA2OSwgIDU2LAorCTE0LCAgMTcsICAyMiwgIDI5LCAgNTEsICA4NywgIDgwLCAgNjIsCisJMTgsICAyMiwgIDM3LCAgNTYsICA2OCwgMTA5LCAxMDMsICA3NywKKwkyNCwgIDM1LCAgNTUsICA2NCwgIDgxLCAxMDQsIDExMywgIDkyLAorCTQ5LCAgNjQsICA3OCwgIDg3LCAxMDMsIDEyMSwgMTIwLCAxMDEsCisJNzIsICA5MiwgIDk1LCAgOTgsIDExMiwgMTAwLCAxMDMsICA5OQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgVVZfUVVBTlRBQkxFWzY0XSA9IHsKKwkxNywgIDE4LCAgMjQsICA0NywgIDk5LCAgOTksICA5OSwgIDk5LAorCTE4LCAgMjEsICAyNiwgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksCisJMjQsICAyNiwgIDU2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKwk0NywgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorCTk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisJOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKwk5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorCTk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTkKK307CisjZWxzZQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgWV9RVUFOVEFCTEVbNjRdID0geworCSA4LCAgIDUsICAgNSwgICA4LCAgMTIsICAyMCwgIDI1LCAgMzAsCisJIDYsICAgNiwgICA3LCAgIDksICAxMywgIDI5LCAgMzAsICAyNywKKwkgNywgICA2LCAgIDgsICAxMiwgIDIwLCAgMjgsICAzNCwgIDI4LAorCSA3LCAgIDgsICAxMSwgIDE0LCAgMjUsICA0MywgIDQwLCAgMzEsCisJIDksICAxMSwgIDE4LCAgMjgsICAzNCwgIDU0LCAgNTEsICAzOCwKKwkxMiwgIDE3LCAgMjcsICAzMiwgIDQwLCAgNTIsICA1NiwgIDQ2LAorCTI0LCAgMzIsICAzOSwgIDQzLCAgNTEsICA2MCwgIDYwLCAgNTAsCisJMzYsICA0NiwgIDQ3LCAgNDksICA1NiwgIDUwLCAgNTEsICA0OQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgVVZfUVVBTlRBQkxFWzY0XSA9IHsKKwkgOCwgICA5LCAgMTIsICAyMywgIDQ5LCAgNDksICA0OSwgIDQ5LAorCSA5LCAgMTAsICAxMywgIDMzLCAgNDksICA0OSwgIDQ5LCAgNDksCisJMTIsICAxMywgIDI4LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwKKwkyMywgIDMzLCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LAorCTQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksCisJNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwKKwk0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LAorCTQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDkKK307CisjZW5kaWYKKworI2RlZmluZSBXOTk2OENGX0RFQ19FUlJfQ09SUlVQVEVEX0RBVEEgIC0xCisjZGVmaW5lIFc5OTY4Q0ZfREVDX0VSUl9CVUZfT1ZFUkZMT1cgICAgLTIKKyNkZWZpbmUgVzk5NjhDRl9ERUNfRVJSX05PX1NPSSAgICAgICAgICAtMworI2RlZmluZSBXOTk2OENGX0RFQ19FUlJfTk9fU09GMCAgICAgICAgIC00CisjZGVmaW5lIFc5OTY4Q0ZfREVDX0VSUl9OT19TT1MgICAgICAgICAgLTUKKyNkZWZpbmUgVzk5NjhDRl9ERUNfRVJSX05PX0VPSSAgICAgICAgICAtNgorCitleHRlcm4gdm9pZCB3OTk2OGNmX2luaXRfZGVjb2Rlcih2b2lkKTsKK2V4dGVybiBpbnQgdzk5NjhjZl9jaGVja19oZWFkZXJzKGNvbnN0IHVuc2lnbmVkIGNoYXIqIFBpbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIEJVRl9TSVpFKTsKK2V4dGVybiBpbnQgdzk5NjhjZl9kZWNvZGUoY29uc3QgY2hhciogUGluLCBjb25zdCB1bnNpZ25lZCBsb25nIEJVRl9TSVpFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgVywgY29uc3QgdW5zaWduZWQgSCwgY2hhciogUG91dCk7CisKKyNlbmRpZiAvKiBfVzk5NjhDRl9ERUNPREVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmX3ZwcC5oIGIvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZl92cHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjUzMTdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZl92cHAuaApAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbnRlcmZhY2UgZm9yIHZpZGVvIHBvc3QtcHJvY2Vzc2luZyBmdW5jdGlvbnMgZm9yIHRoZSBXOTk2Wzg3XUNGIGRyaXZlciAqCisgKiBmb3IgTGludXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9XOTk2OENGX1ZQUF9IXworI2RlZmluZSBfVzk5NjhDRl9WUFBfSF8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCitzdHJ1Y3Qgdzk5NjhjZl92cHBfdCB7CisJc3RydWN0IG1vZHVsZSogb3duZXI7CisJaW50ICgqY2hlY2tfaGVhZGVycykoY29uc3QgdW5zaWduZWQgY2hhciosIGNvbnN0IHVuc2lnbmVkIGxvbmcpOworCWludCAoKmRlY29kZSkoY29uc3QgY2hhciosIGNvbnN0IHVuc2lnbmVkIGxvbmcsIGNvbnN0IHVuc2lnbmVkLAorCSAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQsIGNoYXIqKTsKKwl2b2lkICgqc3dhcF95dXZieXRlcykodm9pZCosIHVuc2lnbmVkIGxvbmcpOworCXZvaWQgKCp1eXZ5X3RvX3JnYngpKHU4KiwgdW5zaWduZWQgbG9uZywgdTgqLCB1MTYsIHU4KTsKKwl2b2lkICgqc2NhbGVfdXApKHU4KiwgdTgqLCB1MTYsIHUxNiwgdTE2LCB1MTYsIHUxNik7CisKKwl1OCBidXN5OyAvKiByZWFkLW9ubHkgZmxhZzogbW9kdWxlIGlzL2lzIG5vdCBpbiB1c2UgKi8KK307CisKK2V4dGVybiBpbnQgdzk5NjhjZl92cHBtb2RfcmVnaXN0ZXIoc3RydWN0IHc5OTY4Y2ZfdnBwX3QqKTsKK2V4dGVybiBpbnQgdzk5NjhjZl92cHBtb2RfZGVyZWdpc3RlcihzdHJ1Y3Qgdzk5NjhjZl92cHBfdCopOworCisjZW5kaWYgLyogX1c5OTY4Q0ZfVlBQX0hfICovCg==