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+dmlkZW9zaXplID0gaWJtY2FtX3NpemVfdG9fdmlkZW9zaXplKHNpemUpOworCisJCS8qIEluaXRpYWxpemUgaWJtY2FtLXNwZWNpZmljIGRhdGEgKi8KKwkJYXNzZXJ0KElCTUNBTV9UKHV2ZCkgIT0gTlVMTCk7CisJCUlCTUNBTV9UKHV2ZCktPmNhbWVyYV9tb2RlbCA9IG1vZGVsOworCQlJQk1DQU1fVCh1dmQpLT5pbml0aWFsaXplZCA9IDA7CisKKwkJaWJtY2FtX2NvbmZpZ3VyZV92aWRlbyh1dmQpOworCisJCWkgPSB1c2J2aWRlb19SZWdpc3RlclZpZGVvRGV2aWNlKHV2ZCk7CisJCWlmIChpICE9IDApIHsKKwkJCWVycigidXNidmlkZW9fUmVnaXN0ZXJWaWRlb0RldmljZSgpIGZhaWxlZC4iKTsKKwkJCXV2ZCA9IE5VTEw7CisJCX0KKwl9CisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgdXZkKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwl7IFVTQl9ERVZJQ0VfVkVSKElCTUNBTV9WRU5ET1JfSUQsIElCTUNBTV9QUk9EVUNUX0lELCAweDAwMDIsIDB4MDAwMikgfSwJLyogTW9kZWwgMSAqLworCXsgVVNCX0RFVklDRV9WRVIoSUJNQ0FNX1ZFTkRPUl9JRCwgSUJNQ0FNX1BST0RVQ1RfSUQsIDB4MDMwYSwgMHgwMzBhKSB9LAkvKiBNb2RlbCAyICovCisJeyBVU0JfREVWSUNFX1ZFUihJQk1DQU1fVkVORE9SX0lELCBJQk1DQU1fUFJPRFVDVF9JRCwgMHgwMzAxLCAweDAzMDEpIH0sCS8qIE1vZGVsIDMgKi8KKwl7IFVTQl9ERVZJQ0VfVkVSKElCTUNBTV9WRU5ET1JfSUQsIE5FVENBTV9QUk9EVUNUX0lELCAweDAzMGEsIDB4MDMwYSkgfSwJLyogTW9kZWwgNCAqLworCXsgVVNCX0RFVklDRV9WRVIoSUJNQ0FNX1ZFTkRPUl9JRCwgVkVPXzgwMENfUFJPRFVDVF9JRCwgMHgwMzBhLCAweDAzMGEpIH0sCS8qIE1vZGVsIDIgKi8KKwl7IFVTQl9ERVZJQ0VfVkVSKElCTUNBTV9WRU5ET1JfSUQsIFZFT184MDBEX1BST0RVQ1RfSUQsIDB4MDMwYSwgMHgwMzBhKSB9LAkvKiBNb2RlbCA0ICovCisJeyB9ICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworLyoKKyAqIGlibWNhbV9pbml0KCkKKyAqCisgKiBUaGlzIGNvZGUgaXMgcnVuIHRvIGluaXRpYWxpemUgdGhlIGRyaXZlci4KKyAqCisgKiBIaXN0b3J5OgorICogMS8yNy8wMCAgUmV3b3JrZWQgdG8gdXNlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGlibWNhbSBzdHJ1Y3R1cmVzLgorICogMjEvMTAvMDAgQ29tcGxldGVseSByZWRlc2lnbmVkIHRvIHVzZSB1c2J2aWRlbyBzZXJ2aWNlcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgaWJtY2FtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgdXNidmlkZW9fY2IgY2JUYmw7CisJbWVtc2V0KCZjYlRibCwgMCwgc2l6ZW9mKGNiVGJsKSk7CisJY2JUYmwucHJvYmUgPSBpYm1jYW1fcHJvYmU7CisJY2JUYmwuc2V0dXBPbk9wZW4gPSBpYm1jYW1fc2V0dXBfb25fb3BlbjsKKwljYlRibC52aWRlb1N0YXJ0ID0gaWJtY2FtX3ZpZGVvX3N0YXJ0OworCWNiVGJsLnZpZGVvU3RvcCA9IGlibWNhbV92aWRlb19zdG9wOworCWNiVGJsLnByb2Nlc3NEYXRhID0gaWJtY2FtX1Byb2Nlc3NJc29jRGF0YTsKKwljYlRibC5wb3N0UHJvY2VzcyA9IHVzYnZpZGVvX0RlaW50ZXJsYWNlRnJhbWU7CisJY2JUYmwuYWRqdXN0UGljdHVyZSA9IGlibWNhbV9hZGp1c3RfcGljdHVyZTsKKwljYlRibC5nZXRGUFMgPSBpYm1jYW1fY2FsY3VsYXRlX2ZwczsKKwlyZXR1cm4gdXNidmlkZW9fcmVnaXN0ZXIoCisJCSZjYW1zLAorCQlNQVhfSUJNQ0FNLAorCQlzaXplb2YoaWJtY2FtX3QpLAorCQkiaWJtY2FtIiwKKwkJJmNiVGJsLAorCQlUSElTX01PRFVMRSwKKwkJaWRfdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWJtY2FtX2NsZWFudXAodm9pZCkKK3sKKwl1c2J2aWRlb19EZXJlZ2lzdGVyKCZjYW1zKTsKK30KKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKKworbW9kdWxlX2luaXQoaWJtY2FtX2luaXQpOworbW9kdWxlX2V4aXQoaWJtY2FtX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEva29uaWNhd2MuYyBiL2RyaXZlcnMvdXNiL21lZGlhL2tvbmljYXdjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1MjFhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9rb25pY2F3Yy5jCkBAIC0wLDAgKzEsOTQ3IEBACisvKgorICoga29uaWNhd2MuYyAtIGtvbmljYSB3ZWJjYW0gZHJpdmVyCisgKgorICogQXV0aG9yOiBTaW1vbiBFdmFucyA8c3BzZUBzZWNyZXQub3JnLnVrPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBTaW1vbiBFdmFucworICoKKyAqIExpY2VuY2U6IEdQTAorICoKKyAqIERyaXZlciBmb3IgVVNCIHdlYmNhbXMgYmFzZWQgb24gS29uaWNhIGNoaXBzZXQuIFRoaXMKKyAqIGNoaXBzZXQgaXMgdXNlZCBpbiBJbnRlbCBZQzc2IGNhbWVyYS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCisjaW5jbHVkZSAidXNidmlkZW8uaCIKKworI2RlZmluZSBNQVhfQlJJR0hUTkVTUwkxMDgKKyNkZWZpbmUgTUFYX0NPTlRSQVNUCTEwOAorI2RlZmluZSBNQVhfU0FUVVJBVElPTgkxMDgKKyNkZWZpbmUgTUFYX1NIQVJQTkVTUwkxMDgKKyNkZWZpbmUgTUFYX1dISVRFQkFMCTM3MgorI2RlZmluZSBNQVhfU1BFRUQJNgorCisKKyNkZWZpbmUgTUFYX0NBTUVSQVMJMQorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSJ2MS40IgorI2RlZmluZSBEUklWRVJfREVTQwkiS29uaWNhIFdlYmNhbSBkcml2ZXIiCisKK2VudW0gY3RybF9yZXEgeworCVNldFdoaXRlYmFsCT0gMHgwMSwKKwlTZXRCcmlnaHRuZXNzCT0gMHgwMiwKKyAgICAgICAgU2V0U2hhcnBuZXNzCT0gMHgwMywKKwlTZXRDb250cmFzdAk9IDB4MDQsCisJU2V0U2F0dXJhdGlvbgk9IDB4MDUsCit9OworCisKK2VudW0gZnJhbWVfc2l6ZXMgeworCVNJWkVfMTYwWDEyMAk9IDAsCisJU0laRV8xNjBYMTM2CT0gMSwKKwlTSVpFXzE3NlgxNDQJPSAyLAorCVNJWkVfMzIwWDI0MAk9IDMsCisJCit9OworCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFCVNJWkVfMzIwWDI0MAorCitzdGF0aWMgc3RydWN0IHVzYnZpZGVvICpjYW1zOworCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworc3RhdGljIGludCBkZWJ1ZzsKKyNkZWZpbmUgREVCVUcobiwgZm9ybWF0LCBhcmcuLi4pIFwKKwlpZiAobiA8PSBkZWJ1ZykgewkgXAorCQlwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyAiOiVzKCk6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjIGFyZyk7IFwKKwl9CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmcuLi4pCitzdGF0aWMgY29uc3QgaW50IGRlYnVnID0gMDsKKyNlbmRpZgorCisKKy8qIFNvbWUgZGVmYXVsdCB2YWx1ZXMgZm9yIGluaXRpYWwgY2FtZXJhIHNldHRpbmdzLAorICAgY2FuIGJlIHNldCBieSBtb2Rwcm9iZSAqLworCitzdGF0aWMgaW50IHNpemU7CQorc3RhdGljIGludCBzcGVlZCA9IDY7CQkvKiBTcGVlZCAoZnBzKSAwIChzbG93ZXN0KSB0byA2IChmYXN0ZXN0KSAqLworc3RhdGljIGludCBicmlnaHRuZXNzID0JTUFYX0JSSUdIVE5FU1MvMjsKK3N0YXRpYyBpbnQgY29udHJhc3QgPQlNQVhfQ09OVFJBU1QvMjsKK3N0YXRpYyBpbnQgc2F0dXJhdGlvbiA9CU1BWF9TQVRVUkFUSU9OLzI7CitzdGF0aWMgaW50IHNoYXJwbmVzcyA9CU1BWF9TSEFSUE5FU1MvMjsKK3N0YXRpYyBpbnQgd2hpdGViYWwgPQkzKihNQVhfV0hJVEVCQUwvNCk7CisKK3N0YXRpYyBpbnQgc3BkX3RvX2lmYWNlW10gPSB7IDEsIDAsIDMsIDIsIDQsIDUsIDYgfTsKKworLyogVGhlc2UgRlBTIHNwZWVkcyBhcmUgZnJvbSB0aGUgd2luZG93cyBjb25maWcgYm94LiBUaGV5IGFyZQorICogaW5kZXhlZCBvbiBzaXplICgwLTIpIGFuZCBzcGVlZCAoMC02KS4gRGl2aWRlIGJ5IDMgdG8gZ2V0IHRoZQorICogcmVhbCBmcHMuCisgKi8KKworc3RhdGljIGludCBzcGRfdG9fZnBzW11bN10gPSB7IHsgMjQsIDQwLCA0OCwgNjAsIDcyLCA4MCwgMTAwIH0sCisJCQkgICAgICAgeyAyNCwgNDAsIDQ4LCA2MCwgNzIsIDgwLCAxMDAgfSwKKwkJCSAgICAgICB7IDE4LCAzMCwgMzYsIDQ1LCA1NCwgNjAsIDc1ICB9LAorCQkJICAgICAgIHsgNiwgIDEwLCAxMiwgMTUsIDE4LCAyMSwgMjUgIH0gfTsKKworc3RydWN0IGNhbV9zaXplIHsKKwl1MTYJd2lkdGg7CisJdTE2CWhlaWdodDsKKwl1OAljbWQ7Cit9OworCitzdGF0aWMgc3RydWN0IGNhbV9zaXplIGNhbWVyYV9zaXplc1tdID0geyB7IDE2MCwgMTIwLCAweDcgfSwKKwkJCQkJICB7IDE2MCwgMTM2LCAweGEgfSwKKwkJCQkJICB7IDE3NiwgMTQ0LCAweDQgfSwKKwkJCQkJICB7IDMyMCwgMjQwLCAweDUgfSB9OworCitzdHJ1Y3Qga29uaWNhd2MgeworCXU4IGJyaWdodG5lc3M7CQkvKiBjYW1lcmEgdXNlcyAwIC0gOSwgeDExIGZvciByZWFsIHZhbHVlICovCisJdTggY29udHJhc3Q7CQkvKiBhcyBhYm92ZSAqLworCXU4IHNhdHVyYXRpb247CQkvKiBhcyBhYm92ZSAqLworCXU4IHNoYXJwbmVzczsJCS8qIGFzIGFib3ZlICovCisJdTggd2hpdGVfYmFsOwkJLyogMCAtIDMzLCB4MTEgZm9yIHJlYWwgdmFsdWUgKi8KKwl1OCBzcGVlZDsJCS8qIFN0b3JlZCBhcyAwIC0gNiwgdXNlZCBhcyBpbmRleCBpbiBzcGRfdG9fKiAoYWJvdmUpICovCisJdTggc2l6ZTsJCS8qIEZyYW1lIFNpemUgKi8KKwlpbnQgaGVpZ2h0OworCWludCB3aWR0aDsKKwlzdHJ1Y3QgdXJiICpzdHNfdXJiW1VTQlZJREVPX05VTVNCVUZdOworCXU4IHN0c19idWZbVVNCVklERU9fTlVNU0JVRl1bRlJBTUVTX1BFUl9ERVNDXTsKKwlzdHJ1Y3QgdXJiICpsYXN0X2RhdGFfdXJiOworCWludCBsYXN0ZnJhbWU7CisJaW50IGN1cl9mcmFtZV9zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gY3VycmVudCBmcmFtZSBzaXplICovCisJaW50IG1heGxpbmU7CQkvKiBudW1iZXIgb2YgbGluZXMgcGVyIGZyYW1lICovCisJaW50IHlwbGFuZXN6OwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBZIHBsYW5lICovCisJdW5zaWduZWQgaW50IGJ1dHRvbnN0czoxOworI2lmZGVmIENPTkZJR19JTlBVVAorCXN0cnVjdCBpbnB1dF9kZXYgaW5wdXQ7CisJY2hhciBpbnB1dF9waHlzbmFtZVs2NF07CisjZW5kaWYKK307CisKKworI2RlZmluZSBrb25pY2F3Y19zZXRfbWlzYyh1dmQsIHJlcSwgdmFsdWUsIGluZGV4KQkJa29uaWNhd2NfY3RybF9tc2codXZkLCBVU0JfRElSX09VVCwgcmVxLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDApCisjZGVmaW5lIGtvbmljYXdjX2dldF9taXNjKHV2ZCwgcmVxLCB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc3opCWtvbmljYXdjX2N0cmxfbXNnKHV2ZCwgVVNCX0RJUl9JTiwgcmVxLCB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc3opCisjZGVmaW5lIGtvbmljYXdjX3NldF92YWx1ZSh1dmQsIHZhbHVlLCBpbmRleCkJCQlrb25pY2F3Y19jdHJsX21zZyh1dmQsIFVTQl9ESVJfT1VULCAyLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDApCisKKworc3RhdGljIGludCBrb25pY2F3Y19jdHJsX21zZyhzdHJ1Y3QgdXZkICp1dmQsIHU4IGRpciwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICAgICAgaW50IHJldHZhbCA9IHVzYl9jb250cm9sX21zZyh1dmQtPmRldiwKKwkJZGlyID8gdXNiX3JjdmN0cmxwaXBlKHV2ZC0+ZGV2LCAwKSA6IHVzYl9zbmRjdHJscGlwZSh1dmQtPmRldiwgMCksCisJCSAgICByZXF1ZXN0LCAweDQwIHwgZGlyLCB2YWx1ZSwgaW5kZXgsIGJ1ZiwgbGVuLCAxMDAwKTsKKyAgICAgICAgcmV0dXJuIHJldHZhbCA8IDAgPyByZXR2YWwgOiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrb25pY2F3Y19jYW1lcmFfb24oc3RydWN0IHV2ZCAqdXZkKQoreworICAgICAgICBERUJVRygwLCAiY2FtZXJhIG9uIik7CisgICAgICAgIGtvbmljYXdjX3NldF9taXNjKHV2ZCwgMHgyLCAxLCAweDBiKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQga29uaWNhd2NfY2FtZXJhX29mZihzdHJ1Y3QgdXZkICp1dmQpCit7CisgICAgICAgIERFQlVHKDAsICJjYW1lcmEgb2ZmIik7CisgICAgICAgIGtvbmljYXdjX3NldF9taXNjKHV2ZCwgMHgyLCAwLCAweDBiKTsKK30KKworCitzdGF0aWMgdm9pZCBrb25pY2F3Y19zZXRfY2FtZXJhX3NpemUoc3RydWN0IHV2ZCAqdXZkKQoreworCXN0cnVjdCBrb25pY2F3YyAqY2FtID0gKHN0cnVjdCBrb25pY2F3YyAqKXV2ZC0+dXNlcl9kYXRhOworCisJa29uaWNhd2Nfc2V0X21pc2ModXZkLCAweDIsIGNhbWVyYV9zaXplc1tjYW0tPnNpemVdLmNtZCwgMHgwOCk7CisJY2FtLT53aWR0aCA9IGNhbWVyYV9zaXplc1tjYW0tPnNpemVdLndpZHRoOworCWNhbS0+aGVpZ2h0ID0gY2FtZXJhX3NpemVzW2NhbS0+c2l6ZV0uaGVpZ2h0OworCWNhbS0+eXBsYW5lc3ogPSBjYW0tPmhlaWdodCAqIGNhbS0+d2lkdGg7CisJY2FtLT5jdXJfZnJhbWVfc2l6ZSA9IChjYW0tPnlwbGFuZXN6ICogMykgLyAyOworCWNhbS0+bWF4bGluZSA9IGNhbS0+eXBsYW5lc3ogLyAyNTY7CisJdXZkLT52aWRlb3NpemUgPSBWSURFT1NJWkUoY2FtLT53aWR0aCwgY2FtLT5oZWlnaHQpOworfQorCisKK3N0YXRpYyBpbnQga29uaWNhd2Nfc2V0dXBfb25fb3BlbihzdHJ1Y3QgdXZkICp1dmQpCit7CisJc3RydWN0IGtvbmljYXdjICpjYW0gPSAoc3RydWN0IGtvbmljYXdjICopdXZkLT51c2VyX2RhdGE7CisKKwlERUJVRygxLCAic2V0dGluZyBicmlnaHRuZXNzIHRvICVkICglZCkiLCBjYW0tPmJyaWdodG5lc3MsCisJICAgIGNhbS0+YnJpZ2h0bmVzcyAqIDExKTsKKwlrb25pY2F3Y19zZXRfdmFsdWUodXZkLCBjYW0tPmJyaWdodG5lc3MsIFNldEJyaWdodG5lc3MpOworCURFQlVHKDEsICJzZXR0aW5nIHdoaXRlIGJhbGFuY2UgdG8gJWQgKCVkKSIsIGNhbS0+d2hpdGVfYmFsLAorCSAgICBjYW0tPndoaXRlX2JhbCAqIDExKTsKKwlrb25pY2F3Y19zZXRfdmFsdWUodXZkLCBjYW0tPndoaXRlX2JhbCwgU2V0V2hpdGViYWwpOworCURFQlVHKDEsICJzZXR0aW5nIGNvbnRyYXN0IHRvICVkICglZCkiLCBjYW0tPmNvbnRyYXN0LAorCSAgICBjYW0tPmNvbnRyYXN0ICogMTEpOworCWtvbmljYXdjX3NldF92YWx1ZSh1dmQsIGNhbS0+Y29udHJhc3QsIFNldENvbnRyYXN0KTsKKwlERUJVRygxLCAic2V0dGluZyBzYXR1cmF0aW9uIHRvICVkICglZCkiLCBjYW0tPnNhdHVyYXRpb24sCisJICAgIGNhbS0+c2F0dXJhdGlvbiAqIDExKTsKKwlrb25pY2F3Y19zZXRfdmFsdWUodXZkLCBjYW0tPnNhdHVyYXRpb24sIFNldFNhdHVyYXRpb24pOworCURFQlVHKDEsICJzZXR0aW5nIHNoYXJwbmVzcyB0byAlZCAoJWQpIiwgY2FtLT5zaGFycG5lc3MsCisJICAgIGNhbS0+c2hhcnBuZXNzICogMTEpOworCWtvbmljYXdjX3NldF92YWx1ZSh1dmQsIGNhbS0+c2hhcnBuZXNzLCBTZXRTaGFycG5lc3MpOworCWtvbmljYXdjX3NldF9jYW1lcmFfc2l6ZSh1dmQpOworCWNhbS0+bGFzdGZyYW1lID0gLTI7CisJY2FtLT5idXR0b25zdHMgPSAwOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGtvbmljYXdjX2FkanVzdF9waWN0dXJlKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlzdHJ1Y3Qga29uaWNhd2MgKmNhbSA9IChzdHJ1Y3Qga29uaWNhd2MgKil1dmQtPnVzZXJfZGF0YTsKKworCWtvbmljYXdjX2NhbWVyYV9vZmYodXZkKTsKKwlERUJVRygxLCAibmV3IGJyaWdodG5lc3M6ICVkIiwgdXZkLT52cGljLmJyaWdodG5lc3MpOworCXV2ZC0+dnBpYy5icmlnaHRuZXNzID0gKHV2ZC0+dnBpYy5icmlnaHRuZXNzID4gTUFYX0JSSUdIVE5FU1MpID8gTUFYX0JSSUdIVE5FU1MgOiB1dmQtPnZwaWMuYnJpZ2h0bmVzczsKKwlpZihjYW0tPmJyaWdodG5lc3MgIT0gdXZkLT52cGljLmJyaWdodG5lc3MgLyAxMSkgeworCSAgIGNhbS0+YnJpZ2h0bmVzcyA9IHV2ZC0+dnBpYy5icmlnaHRuZXNzIC8gMTE7CisJICAgREVCVUcoMSwgInNldHRpbmcgYnJpZ2h0bmVzcyB0byAlZCAoJWQpIiwgY2FtLT5icmlnaHRuZXNzLAorCSAgICAgICBjYW0tPmJyaWdodG5lc3MgKiAxMSk7CisJICAga29uaWNhd2Nfc2V0X3ZhbHVlKHV2ZCwgY2FtLT5icmlnaHRuZXNzLCBTZXRCcmlnaHRuZXNzKTsKKwl9CisKKwlERUJVRygxLCAibmV3IGNvbnRyYXN0OiAlZCIsIHV2ZC0+dnBpYy5jb250cmFzdCk7CisJdXZkLT52cGljLmNvbnRyYXN0ID0gKHV2ZC0+dnBpYy5jb250cmFzdCA+IE1BWF9DT05UUkFTVCkgPyBNQVhfQ09OVFJBU1QgOiB1dmQtPnZwaWMuY29udHJhc3Q7CisJaWYoY2FtLT5jb250cmFzdCAhPSB1dmQtPnZwaWMuY29udHJhc3QgLyAxMSkgeworCQljYW0tPmNvbnRyYXN0ID0gdXZkLT52cGljLmNvbnRyYXN0IC8gMTE7CisJCURFQlVHKDEsICJzZXR0aW5nIGNvbnRyYXN0IHRvICVkICglZCkiLCBjYW0tPmNvbnRyYXN0LAorCQkgICAgY2FtLT5jb250cmFzdCAqIDExKTsKKwkJa29uaWNhd2Nfc2V0X3ZhbHVlKHV2ZCwgY2FtLT5jb250cmFzdCwgU2V0Q29udHJhc3QpOworCX0KKwlrb25pY2F3Y19jYW1lcmFfb24odXZkKTsKK30KKworCitzdGF0aWMgaW50IGtvbmljYXdjX2NvbXByZXNzX2lzbyhzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1cmIgKmRhdGF1cmIsIHN0cnVjdCB1cmIgKnN0c3VyYikKK3sKKwljaGFyICpjZGF0YTsKKwlpbnQgaSwgdG90bGVuID0gMDsKKwl1bnNpZ25lZCBjaGFyICpzdGF0dXMgPSBzdHN1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlpbnQga2VlcCA9IDAsIGRpc2NhcmQgPSAwLCBiYWQgPSAwOworCXN0cnVjdCBrb25pY2F3YyAqY2FtID0gKHN0cnVjdCBrb25pY2F3YyAqKXV2ZC0+dXNlcl9kYXRhOworCisJZm9yIChpID0gMDsgaSA8IGRhdGF1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKKwkJaW50IGJ1dHRvbiA9IGNhbS0+YnV0dG9uc3RzOworCQl1bnNpZ25lZCBjaGFyIHN0czsKKwkJaW50IG4gPSBkYXRhdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOworCQlpbnQgc3QgPSBkYXRhdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CisJCWNkYXRhID0gZGF0YXVyYi0+dHJhbnNmZXJfYnVmZmVyICsKKwkJCWRhdGF1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKKworCQkvKiBEZXRlY3QgYW5kIGlnbm9yZSBlcnJvcmVkIHBhY2tldHMgKi8KKwkJaWYgKHN0IDwgMCkgeworCQkJREVCVUcoMSwgIkRhdGEgZXJyb3I6IHBhY2tldD0lZC4gbGVuPSVkLiBzdGF0dXM9JWQuIiwKKwkJCSAgICAgIGksIG4sIHN0KTsKKwkJCXV2ZC0+c3RhdHMuaXNvX2Vycl9jb3VudCsrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBEZXRlY3QgYW5kIGlnbm9yZSBlbXB0eSBwYWNrZXRzICovCisJCWlmIChuIDw9IDApIHsKKwkJCXV2ZC0+c3RhdHMuaXNvX3NraXBfY291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogU2VlIHdoYXQgdGhlIHN0YXR1cyBkYXRhIHNhaWQgYWJvdXQgdGhlIHBhY2tldCAqLworCQlzdHMgPSAqKHN0YXR1cytzdHN1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCk7CisKKwkJLyogc3RzOiAweDgwLTB4ZmY6IGZyYW1lIHN0YXJ0IHdpdGggZnJhbWUgbnVtYmVyIChpZSAwLTdmKQorCQkgKiBvdGhlcndpc2U6CisJCSAqIGJpdCAwIDA6IGtlZXAgcGFja2V0CisJCSAqCSAxOiBkcm9wIHBhY2tldCAocGFkZGluZyBkYXRhKQorCQkgKgorCQkgKiBiaXQgNCAwIGJ1dHRvbiBub3QgY2xpY2tlZAorCQkgKiAgICAgICAxIGJ1dHRvbiBjbGlja2VkCisJCSAqIGJ1dHRvbiBpcyB1c2VkIHRvIGB0YWtlIGEgcGljdHVyZScgKGluIHNvZnR3YXJlKQorCQkgKi8KKworCQlpZihzdHMgPCAweDgwKSB7CisJCQlidXR0b24gPSAhIShzdHMgJiAweDQwKTsKKwkJCXN0cyAmPSB+MHg0MDsKKwkJfQorCQkKKwkJLyogd29yayBvdXQgdGhlIGJ1dHRvbiBzdGF0dXMsIGJ1dCBkb24ndCBkbworCQkgICBhbnl0aGluZyB3aXRoIGl0IGZvciBub3cgKi8KKworCQlpZihidXR0b24gIT0gY2FtLT5idXR0b25zdHMpIHsKKwkJCURFQlVHKDIsICJidXR0b246ICVzY2xpY2tlZCIsIGJ1dHRvbiA/ICIiIDogInVuIik7CisJCQljYW0tPmJ1dHRvbnN0cyA9IGJ1dHRvbjsKKyNpZmRlZiBDT05GSUdfSU5QVVQKKwkJCWlucHV0X3JlcG9ydF9rZXkoJmNhbS0+aW5wdXQsIEJUTl8wLCBjYW0tPmJ1dHRvbnN0cyk7CisJCQlpbnB1dF9zeW5jKCZjYW0tPmlucHV0KTsKKyNlbmRpZgorCQl9CisKKwkJaWYoc3RzID09IDB4MDEpIHsgLyogZHJvcCBmcmFtZSAqLworCQkJZGlzY2FyZCsrOworCQkJY29udGludWU7CisJCX0KKwkJCisJCWlmKChzdHMgPiAweDAxKSAmJiAoc3RzIDwgMHg4MCkpIHsKKwkJCWluZm8oInVua25vd24gc3RhdHVzICUyLjJ4Iiwgc3RzKTsKKwkJCWJhZCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYoIXN0cyAmJiBjYW0tPmxhc3RmcmFtZSA9PSAtMikgeworCQkJREVCVUcoMiwgImRyb3BwaW5nIGZyYW1lIGxvb2tpbmcgZm9yIGltYWdlIHN0YXJ0Iik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWtlZXArKzsKKwkJaWYoc3RzICYgMHg4MCkgeyAvKiBmcmFtZSBzdGFydCAqLworCQkJdW5zaWduZWQgY2hhciBtYXJrZXJbXSA9IHsgMCwgMHhmZiwgMCwgMHgwMCB9OworCisJCQlpZihjYW0tPmxhc3RmcmFtZSA9PSAtMikgeworCQkJCURFQlVHKDIsICJmb3VuZCBpbml0aWFsIGltYWdlIik7CisJCQkJY2FtLT5sYXN0ZnJhbWUgPSAtMTsKKwkJCX0KKwkJCQkKKwkJCW1hcmtlclszXSA9IHN0cyAmIDB4N0Y7CisJCQlSaW5nUXVldWVfRW5xdWV1ZSgmdXZkLT5kcCwgbWFya2VyLCA0KTsKKwkJCXRvdGxlbiArPSA0OworCQl9CisKKwkJdG90bGVuICs9IG47CS8qIExpdHRsZSBsb2NhbCBhY2NvdW50aW5nICovCisJCVJpbmdRdWV1ZV9FbnF1ZXVlKCZ1dmQtPmRwLCBjZGF0YSwgbik7CisJfQorCURFQlVHKDgsICJmaW5pc2hlZDoga2VlcCA9ICVkIGRpc2NhcmQgPSAlZCBiYWQgPSAlZCBhZGRlZCAlZCBieXRlcyIsCisJCSAgICBrZWVwLCBkaXNjYXJkLCBiYWQsIHRvdGxlbik7CisJcmV0dXJuIHRvdGxlbjsKK30KKworCitzdGF0aWMgdm9pZCByZXN1Ym1pdF91cmIoc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdXJiICp1cmIpCit7CisgICAgICAgIGludCBpLCByZXQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGUkFNRVNfUEVSX0RFU0M7IGkrKykgeworICAgICAgICAgICAgICAgIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzID0gMDsKKyAgICAgICAgfQorICAgICAgICB1cmItPmRldiA9IHV2ZC0+ZGV2OworICAgICAgICB1cmItPnN0YXR1cyA9IDA7CisJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlERUJVRygzLCAic3VibWl0dGluZyB1cmIgb2YgbGVuZ3RoICVkIiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKyAgICAgICAgaWYocmV0KQorICAgICAgICAgICAgICAgIGVycigidXNiX3N1Ym1pdF91cmIgZXJyb3IgKCVkKSIsIHJldCk7CisKK30KKworCitzdGF0aWMgdm9pZCBrb25pY2F3Y19pc29jX2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB1dmQgKnV2ZCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qga29uaWNhd2MgKmNhbSA9IChzdHJ1Y3Qga29uaWNhd2MgKil1dmQtPnVzZXJfZGF0YTsKKworCS8qIFdlIGRvbid0IHdhbnQgdG8gZG8gYW55dGhpbmcgaWYgd2UgYXJlIGFib3V0IHRvIGJlIHJlbW92ZWQhICovCisJaWYgKCFDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSkKKwkJcmV0dXJuOworCisJaWYgKCF1dmQtPnN0cmVhbWluZykgeworCQlERUJVRygxLCAiTm90IHN0cmVhbWluZywgYnV0IGludGVycnVwdCEiKTsKKwkJcmV0dXJuOworCX0KKworCURFQlVHKDMsICJnb3QgZnJhbWUgJWQgbGVuID0gJWQgYnVmbGVuID0lZCIsIHVyYi0+c3RhcnRfZnJhbWUsIHVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKworCXV2ZC0+c3RhdHMudXJiX2NvdW50Kys7CisKKwlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID4gMzIpIHsKKwkJY2FtLT5sYXN0X2RhdGFfdXJiID0gdXJiOworCQlyZXR1cm47CisJfQorCS8qIENvcHkgdGhlIGRhdGEgcmVjZWl2ZWQgaW50byByaW5nIHF1ZXVlICovCisJaWYoY2FtLT5sYXN0X2RhdGFfdXJiKSB7CisJCWludCBsZW4gPSAwOworCQlpZih1cmItPnN0YXJ0X2ZyYW1lICE9IGNhbS0+bGFzdF9kYXRhX3VyYi0+c3RhcnRfZnJhbWUpCisJCQllcnIoIkxvc3Qgc3luYyBvbiBmcmFtZXMiKTsKKwkJZWxzZSBpZiAoIXVyYi0+c3RhdHVzICYmICFjYW0tPmxhc3RfZGF0YV91cmItPnN0YXR1cykKKwkJCWxlbiA9IGtvbmljYXdjX2NvbXByZXNzX2lzbyh1dmQsIGNhbS0+bGFzdF9kYXRhX3VyYiwgdXJiKTsKKworCQlyZXN1Ym1pdF91cmIodXZkLCBjYW0tPmxhc3RfZGF0YV91cmIpOworCQlyZXN1Ym1pdF91cmIodXZkLCB1cmIpOworCQljYW0tPmxhc3RfZGF0YV91cmIgPSBOVUxMOworCQl1dmQtPnN0YXRzLnVyYl9sZW5ndGggPSBsZW47CisJCXV2ZC0+c3RhdHMuZGF0YV9jb3VudCArPSBsZW47CisJCWlmKGxlbikKKwkJCVJpbmdRdWV1ZV9XYWtlVXBJbnRlcnJ1cHRpYmxlKCZ1dmQtPmRwKTsKKwkJcmV0dXJuOworCX0KKwlyZXR1cm47Cit9CisKKworc3RhdGljIGludCBrb25pY2F3Y19zdGFydF9kYXRhKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gdXZkLT5kZXY7CisJaW50IGksIGVyckZsYWc7CisJc3RydWN0IGtvbmljYXdjICpjYW0gPSAoc3RydWN0IGtvbmljYXdjICopdXZkLT51c2VyX2RhdGE7CisJaW50IHBrdHN6OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZSA9IE5VTEw7CisKKwlpbnRmID0gdXNiX2lmbnVtX3RvX2lmKGRldiwgdXZkLT5pZmFjZSk7CisJaWYgKGludGYpCisJCWludGVyZmFjZSA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpbnRmLAorCQkJCXNwZF90b19pZmFjZVtjYW0tPnNwZWVkXSk7CisJaWYgKCFpbnRlcmZhY2UpCisJCXJldHVybiAtRU5YSU87CisJcGt0c3ogPSBsZTE2X3RvX2NwdShpbnRlcmZhY2UtPmVuZHBvaW50WzFdLmRlc2Mud01heFBhY2tldFNpemUpOworCURFQlVHKDEsICJwa3RzeiA9ICVkIiwgcGt0c3opOworCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpIHsKKwkJZXJyKCJDYW1lcmEgaXMgbm90IG9wZXJhdGlvbmFsIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwl1dmQtPmN1cmZyYW1lID0gLTE7CisJa29uaWNhd2NfY2FtZXJhX29uKHV2ZCk7CisJLyogQWx0ZXJuYXRlIGludGVyZmFjZSAxIGlzIGlzIHRoZSBiaWdnZXN0IGZyYW1lIHNpemUgKi8KKwlpID0gdXNiX3NldF9pbnRlcmZhY2UoZGV2LCB1dmQtPmlmYWNlLCB1dmQtPmlmYWNlQWx0QWN0aXZlKTsKKwlpZiAoaSA8IDApIHsKKwkJZXJyKCJ1c2Jfc2V0X2ludGVyZmFjZSBlcnJvciIpOworCQl1dmQtPmxhc3RfZXJyb3IgPSBpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIFdlIGRvdWJsZSBidWZmZXIgdGhlIElzbyBsaXN0cyAqLworCWZvciAoaT0wOyBpIDwgVVNCVklERU9fTlVNU0JVRjsgaSsrKSB7CisJCWludCBqLCBrOworCQlzdHJ1Y3QgdXJiICp1cmIgPSB1dmQtPnNidWZbaV0udXJiOworCQl1cmItPmRldiA9IGRldjsKKwkJdXJiLT5jb250ZXh0ID0gdXZkOworCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUoZGV2LCB1dmQtPnZpZGVvX2VuZHApOworCQl1cmItPmludGVydmFsID0gMTsKKwkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1dmQtPnNidWZbaV0uZGF0YTsKKwkJdXJiLT5jb21wbGV0ZSA9IGtvbmljYXdjX2lzb2NfaXJxOworCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gRlJBTUVTX1BFUl9ERVNDOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBwa3RzeiAqIEZSQU1FU19QRVJfREVTQzsKKwkJZm9yIChqPWs9MDsgaiA8IEZSQU1FU19QRVJfREVTQzsgaisrLCBrICs9IHBrdHN6KSB7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGs7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IHBrdHN6OworCQl9CisKKwkJdXJiID0gY2FtLT5zdHNfdXJiW2ldOworCQl1cmItPmRldiA9IGRldjsKKwkJdXJiLT5jb250ZXh0ID0gdXZkOworCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUoZGV2LCB1dmQtPnZpZGVvX2VuZHAtMSk7CisJCXVyYi0+aW50ZXJ2YWwgPSAxOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGNhbS0+c3RzX2J1ZltpXTsKKwkJdXJiLT5jb21wbGV0ZSA9IGtvbmljYXdjX2lzb2NfaXJxOworCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gRlJBTUVTX1BFUl9ERVNDOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBGUkFNRVNfUEVSX0RFU0M7CisJCWZvciAoaj0wOyBqIDwgRlJBTUVTX1BFUl9ERVNDOyBqKyspIHsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gajsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gMTsKKwkJfQorCX0KKworCWNhbS0+bGFzdF9kYXRhX3VyYiA9IE5VTEw7CisJCisJLyogU3VibWl0IGFsbCBVUkJzICovCisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJZXJyRmxhZyA9IHVzYl9zdWJtaXRfdXJiKGNhbS0+c3RzX3VyYltpXSwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnJGbGFnKQorCQkJZXJyKCJ1c2Jfc3VibWl0X2lzb2MoJWQpIHJldCAlZCIsIGksIGVyckZsYWcpOworCisJCWVyckZsYWcgPSB1c2Jfc3VibWl0X3VyYih1dmQtPnNidWZbaV0udXJiLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVyckZsYWcpCisJCQllcnIgKCJ1c2Jfc3VibWl0X2lzb2MoJWQpIHJldCAlZCIsIGksIGVyckZsYWcpOworCX0KKworCXV2ZC0+c3RyZWFtaW5nID0gMTsKKwlERUJVRygxLCAic3RyZWFtaW5nPTEgdmlkZW9fZW5kcD0kJTAyeCIsIHV2ZC0+dmlkZW9fZW5kcCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQga29uaWNhd2Nfc3RvcF9kYXRhKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3Qga29uaWNhd2MgKmNhbTsKKworCWlmICgodXZkID09IE5VTEwpIHx8ICghdXZkLT5zdHJlYW1pbmcpIHx8ICh1dmQtPmRldiA9PSBOVUxMKSkKKwkJcmV0dXJuOworCisJa29uaWNhd2NfY2FtZXJhX29mZih1dmQpOworCXV2ZC0+c3RyZWFtaW5nID0gMDsKKwljYW0gPSAoc3RydWN0IGtvbmljYXdjICopdXZkLT51c2VyX2RhdGE7CisJY2FtLT5sYXN0X2RhdGFfdXJiID0gTlVMTDsKKworCS8qIFVuc2NoZWR1bGUgYWxsIG9mIHRoZSBpc28gdGQncyAqLworCWZvciAoaT0wOyBpIDwgVVNCVklERU9fTlVNU0JVRjsgaSsrKSB7CisJCXVzYl9raWxsX3VyYih1dmQtPnNidWZbaV0udXJiKTsKKwkJdXNiX2tpbGxfdXJiKGNhbS0+c3RzX3VyYltpXSk7CisJfQorCisJaWYgKCF1dmQtPnJlbW92ZV9wZW5kaW5nKSB7CisJCS8qIFNldCBwYWNrZXQgc2l6ZSB0byAwICovCisJCWogPSB1c2Jfc2V0X2ludGVyZmFjZSh1dmQtPmRldiwgdXZkLT5pZmFjZSwgdXZkLT5pZmFjZUFsdEluYWN0aXZlKTsKKwkJaWYgKGogPCAwKSB7CisJCQllcnIoInVzYl9zZXRfaW50ZXJmYWNlKCkgZXJyb3IgJWQuIiwgaik7CisJCQl1dmQtPmxhc3RfZXJyb3IgPSBqOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGtvbmljYXdjX3Byb2Nlc3NfaXNvYyhzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWUpCit7CQorCXN0cnVjdCBrb25pY2F3YyAqY2FtID0gKHN0cnVjdCBrb25pY2F3YyAqKXV2ZC0+dXNlcl9kYXRhOworCWludCBtYXhsaW5lID0gY2FtLT5tYXhsaW5lOworCWludCB5cGxhbmVzeiA9IGNhbS0+eXBsYW5lc3o7CisKKwlhc3NlcnQoZnJhbWUgIT0gTlVMTCk7CisKKwlERUJVRyg1LCAibWF4bGluZSA9ICVkIHlwbGFuZXN6ID0gJWQiLCBtYXhsaW5lLCB5cGxhbmVzeik7CisJREVCVUcoMywgIkZyYW1lIHN0YXRlID0gJWQiLCBmcmFtZS0+c2NhbnN0YXRlKTsKKworCWlmKGZyYW1lLT5zY2Fuc3RhdGUgPT0gU2NhblN0YXRlX1NjYW5uaW5nKSB7CisJCWludCBkcm9wID0gMDsKKwkJaW50IGN1cmZyYW1lOworCQlpbnQgZmRyb3BzID0gMDsKKwkJREVCVUcoMywgIlNlYXJjaGluZyBmb3IgbWFya2VyLCBxdWV1ZSBsZW4gPSAlZCIsIFJpbmdRdWV1ZV9HZXRMZW5ndGgoJnV2ZC0+ZHApKTsKKwkJd2hpbGUoUmluZ1F1ZXVlX0dldExlbmd0aCgmdXZkLT5kcCkgPj0gNCkgeworCQkJaWYgKChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDApID09IDB4MDApICYmCisJCQkgICAgKFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMSkgPT0gMHhmZikgJiYKKwkJCSAgICAoUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAyKSA9PSAweDAwKSAmJgorCQkJICAgIChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDMpIDwgMHg4MCkpIHsKKwkJCQljdXJmcmFtZSA9IFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMyk7CisJCQkJaWYoY2FtLT5sYXN0ZnJhbWUgPj0gMCkgeworCQkJCQlmZHJvcHMgPSAoMHg4MCArIGN1cmZyYW1lIC0gY2FtLT5sYXN0ZnJhbWUpICYgMHg3RjsKKwkJCQkJZmRyb3BzLS07CisJCQkJCWlmKGZkcm9wcykgeworCQkJCQkJaW5mbygiRHJvcHBlZCAlZCBmcmFtZXMgKCVkIC0+ICVkKSIsIGZkcm9wcywKKwkJCQkJCSAgICAgY2FtLT5sYXN0ZnJhbWUsIGN1cmZyYW1lKTsKKwkJCQkJfQorCQkJCX0KKwkJCQljYW0tPmxhc3RmcmFtZSA9IGN1cmZyYW1lOworCQkJCWZyYW1lLT5jdXJsaW5lID0gMDsKKwkJCQlmcmFtZS0+c2NhbnN0YXRlID0gU2NhblN0YXRlX0xpbmVzOworCQkJCVJJTkdfUVVFVUVfREVRVUVVRV9CWVRFUygmdXZkLT5kcCwgNCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlSSU5HX1FVRVVFX0RFUVVFVUVfQllURVMoJnV2ZC0+ZHAsIDEpOworCQkJZHJvcCsrOworCQl9CisJCWlmKGRyb3ApCisJCQlERUJVRygyLCAiZHJvcHBlZCAlZCBieXRlcyBsb29raW5nIGZvciBuZXcgZnJhbWUiLCBkcm9wKTsKKwl9CisKKwlpZihmcmFtZS0+c2NhbnN0YXRlID09IFNjYW5TdGF0ZV9TY2FubmluZykKKwkJcmV0dXJuOworCQkKKwkvKiBUcnkgdG8gbW92ZSBkYXRhIGZyb20gcXVldWUgaW50byBmcmFtZSBidWZmZXIKKwkgKiBXZSBnZXQgZGF0YSBpbiBibG9ja3Mgb2YgMzg0IGJ5dGVzIG1hZGUgdXAgb2Y6CisJICogMjU2IFksIDY0IFUsIDY0IFYuCisJICogVGhpcyBuZWVkcyB0byBiZSB3cml0dGVuIG91dCBhcyBhIFkgcGxhbmUsIGEgVSBwbGFuZSBhbmQgYSBWIHBsYW5lLgorCSAqLworCQkKKwl3aGlsZSAoIGZyYW1lLT5jdXJsaW5lIDwgbWF4bGluZSAmJiAoUmluZ1F1ZXVlX0dldExlbmd0aCgmdXZkLT5kcCkgPj0gMzg0KSkgeworCQkvKiBZICovCisJCVJpbmdRdWV1ZV9EZXF1ZXVlKCZ1dmQtPmRwLCBmcmFtZS0+ZGF0YSArIChmcmFtZS0+Y3VybGluZSAqIDI1NiksIDI1Nik7CisJCS8qIFUgKi8KKwkJUmluZ1F1ZXVlX0RlcXVldWUoJnV2ZC0+ZHAsIGZyYW1lLT5kYXRhICsgeXBsYW5lc3ogKyAoZnJhbWUtPmN1cmxpbmUgKiA2NCksIDY0KTsKKwkJLyogViAqLworCQlSaW5nUXVldWVfRGVxdWV1ZSgmdXZkLT5kcCwgZnJhbWUtPmRhdGEgKyAoNSAqIHlwbGFuZXN6KS80ICsgKGZyYW1lLT5jdXJsaW5lICogNjQpLCA2NCk7CisJCWZyYW1lLT5zZXFSZWFkX0xlbmd0aCArPSAzODQ7CisJCWZyYW1lLT5jdXJsaW5lKys7CisJfQorCS8qIFNlZSBpZiB3ZSBmaWxsZWQgdGhlIGZyYW1lICovCisJaWYgKGZyYW1lLT5jdXJsaW5lID09IG1heGxpbmUpIHsKKwkJREVCVUcoNSwgImdvdCB3aG9sZSBmcmFtZSIpOworCisJCWZyYW1lLT5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9Eb25lX0hvbGQ7CisJCWZyYW1lLT5jdXJsaW5lID0gMDsKKwkJdXZkLT5jdXJmcmFtZSA9IC0xOworCQl1dmQtPnN0YXRzLmZyYW1lX251bSsrOworCX0KK30KKworCitzdGF0aWMgaW50IGtvbmljYXdjX2ZpbmRfZnBzKGludCBzaXplLCBpbnQgZnBzKQoreworCWludCBpOworCisJZnBzICo9IDM7CisJREVCVUcoMSwgImtvbmljYV9maW5kX2Zwczogc2l6ZSA9ICVkIGZwcyA9ICVkIiwgc2l6ZSwgZnBzKTsKKwlpZihmcHMgPD0gc3BkX3RvX2Zwc1tzaXplXVswXSkKKwkJcmV0dXJuIDA7CisKKwlpZihmcHMgPj0gc3BkX3RvX2Zwc1tzaXplXVtNQVhfU1BFRURdKQorCQlyZXR1cm4gTUFYX1NQRUVEOworCisJZm9yKGkgPSAwOyBpIDwgTUFYX1NQRUVEOyBpKyspIHsKKwkJaWYoKGZwcyA+PSBzcGRfdG9fZnBzW3NpemVdW2ldKSAmJiAoZnBzIDw9IHNwZF90b19mcHNbc2l6ZV1baSsxXSkpIHsKKwkJCURFQlVHKDIsICJmcHMgJWQgYmV0d2VlbiAlZCBhbmQgJWQiLCBmcHMsIGksIGkrMSk7CisJCQlpZiggKGZwcyAtIHNwZF90b19mcHNbc2l6ZV1baV0pIDwgKHNwZF90b19mcHNbc2l6ZV1baSsxXSAtIGZwcykpCisJCQkJcmV0dXJuIGk7CisJCQllbHNlCisJCQkJcmV0dXJuIGkrMTsKKwkJfQorCX0KKwlyZXR1cm4gTUFYX1NQRUVEKzE7Cit9CisKKworc3RhdGljIGludCBrb25pY2F3Y19zZXRfdmlkZW9fbW9kZShzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB2aWRlb193aW5kb3cgKnZ3KQoreworCXN0cnVjdCBrb25pY2F3YyAqY2FtID0gKHN0cnVjdCBrb25pY2F3YyAqKXV2ZC0+dXNlcl9kYXRhOworCWludCBuZXdzcGVlZCA9IGNhbS0+c3BlZWQ7CisJaW50IG5ld3NpemU7CisJaW50IHggPSB2dy0+d2lkdGg7CisJaW50IHkgPSB2dy0+aGVpZ2h0OworCWludCBmcHMgPSB2dy0+ZmxhZ3M7CisKKwlpZih4ID4gMCAmJiB5ID4gMCkgeworCQlERUJVRygyLCAidHJ5aW5nIHRvIGZpbmQgc2l6ZSAlZCwlZCIsIHgsIHkpOworCQlmb3IobmV3c2l6ZSA9IDA7IG5ld3NpemUgPD0gTUFYX0ZSQU1FX1NJWkU7IG5ld3NpemUrKykgeworCQkJaWYoKGNhbWVyYV9zaXplc1tuZXdzaXplXS53aWR0aCA9PSB4KSAmJiAoY2FtZXJhX3NpemVzW25ld3NpemVdLmhlaWdodCA9PSB5KSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCW5ld3NpemUgPSBjYW0tPnNpemU7CisJfQorCisJaWYobmV3c2l6ZSA+IE1BWF9GUkFNRV9TSVpFKSB7CisJCURFQlVHKDEsICJjb3VsZG4ndCBmaW5kIHNpemUgJWQsJWQiLCB4LCB5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYoZnBzID4gMCkgeworCQlERUJVRygxLCAidHJ5aW5nIHRvIHNldCBmcHMgdG8gJWQiLCBmcHMpOworCQluZXdzcGVlZCA9IGtvbmljYXdjX2ZpbmRfZnBzKG5ld3NpemUsIGZwcyk7CisJCURFQlVHKDEsICJmaW5kX2ZwcyByZXR1cm5lZCAlZCAoJWQpIiwgbmV3c3BlZWQsIHNwZF90b19mcHNbbmV3c2l6ZV1bbmV3c3BlZWRdKTsKKwl9CisKKwlpZihuZXdzcGVlZCA+IE1BWF9TUEVFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlERUJVRygxLCAic2V0dGluZyBzaXplIHRvICVkIHNwZWVkIHRvICVkIiwgbmV3c2l6ZSwgbmV3c3BlZWQpOworCWlmKChuZXdzaXplID09IGNhbS0+c2l6ZSkgJiYgKG5ld3NwZWVkID09IGNhbS0+c3BlZWQpKSB7CisJCURFQlVHKDEsICJOb3RoaW5nIHRvIGRvIik7CisJCXJldHVybiAwOworCX0KKwlERUJVRygwLCAic2V0dGluZyB0byAgJWR4JWQgQCAlZCBmcHMiLCBjYW1lcmFfc2l6ZXNbbmV3c2l6ZV0ud2lkdGgsCisJICAgICBjYW1lcmFfc2l6ZXNbbmV3c2l6ZV0uaGVpZ2h0LCBzcGRfdG9fZnBzW25ld3NpemVdW25ld3NwZWVkXS8zKTsKKworCWtvbmljYXdjX3N0b3BfZGF0YSh1dmQpOworCXV2ZC0+aWZhY2VBbHRBY3RpdmUgPSBzcGRfdG9faWZhY2VbbmV3c3BlZWRdOworCURFQlVHKDEsICJuZXcgaW50ZXJmYWNlID0gJWQiLCB1dmQtPmlmYWNlQWx0QWN0aXZlKTsKKwljYW0tPnNwZWVkID0gbmV3c3BlZWQ7CisKKwlpZihjYW0tPnNpemUgIT0gbmV3c2l6ZSkgeworCQljYW0tPnNpemUgPSBuZXdzaXplOworCQlrb25pY2F3Y19zZXRfY2FtZXJhX3NpemUodXZkKTsKKwl9CisKKwkvKiBGbHVzaCB0aGUgaW5wdXQgcXVldWUgYW5kIGNsZWFyIGFueSBjdXJyZW50IGZyYW1lIGluIHByb2dyZXNzICovCisKKwlSaW5nUXVldWVfRmx1c2goJnV2ZC0+ZHApOworCWNhbS0+bGFzdGZyYW1lID0gLTI7CisJaWYodXZkLT5jdXJmcmFtZSAhPSAtMSkgeworCSAgdXZkLT5mcmFtZVt1dmQtPmN1cmZyYW1lXS5jdXJsaW5lID0gMDsKKwkgIHV2ZC0+ZnJhbWVbdXZkLT5jdXJmcmFtZV0uc2VxUmVhZF9MZW5ndGggPSAwOworCSAgdXZkLT5mcmFtZVt1dmQtPmN1cmZyYW1lXS5zZXFSZWFkX0luZGV4ID0gMDsKKwl9CisKKwlrb25pY2F3Y19zdGFydF9kYXRhKHV2ZCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBrb25pY2F3Y19jYWxjdWxhdGVfZnBzKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlzdHJ1Y3Qga29uaWNhd2MgKmNhbSA9IHV2ZC0+dXNlcl9kYXRhOworCXJldHVybiBzcGRfdG9fZnBzW2NhbS0+c2l6ZV1bY2FtLT5zcGVlZF0vMzsKK30KKworCitzdGF0aWMgdm9pZCBrb25pY2F3Y19jb25maWd1cmVfdmlkZW8oc3RydWN0IHV2ZCAqdXZkKQoreworCXN0cnVjdCBrb25pY2F3YyAqY2FtID0gKHN0cnVjdCBrb25pY2F3YyAqKXV2ZC0+dXNlcl9kYXRhOworCXU4IGJ1ZlsyXTsKKworCW1lbXNldCgmdXZkLT52cGljLCAwLCBzaXplb2YodXZkLT52cGljKSk7CisJbWVtc2V0KCZ1dmQtPnZwaWNfb2xkLCAweDU1LCBzaXplb2YodXZkLT52cGljX29sZCkpOworCisJUkVTVFJJQ1RfVE9fUkFOR0UoYnJpZ2h0bmVzcywgMCwgTUFYX0JSSUdIVE5FU1MpOworCVJFU1RSSUNUX1RPX1JBTkdFKGNvbnRyYXN0LCAwLCBNQVhfQ09OVFJBU1QpOworCVJFU1RSSUNUX1RPX1JBTkdFKHNhdHVyYXRpb24sIDAsIE1BWF9TQVRVUkFUSU9OKTsKKwlSRVNUUklDVF9UT19SQU5HRShzaGFycG5lc3MsIDAsIE1BWF9TSEFSUE5FU1MpOworCVJFU1RSSUNUX1RPX1JBTkdFKHdoaXRlYmFsLCAwLCBNQVhfV0hJVEVCQUwpOworCisJY2FtLT5icmlnaHRuZXNzID0gYnJpZ2h0bmVzcyAvIDExOworCWNhbS0+Y29udHJhc3QgPSBjb250cmFzdCAvIDExOworCWNhbS0+c2F0dXJhdGlvbiA9IHNhdHVyYXRpb24gLyAxMTsKKwljYW0tPnNoYXJwbmVzcyA9IHNoYXJwbmVzcyAvIDExOworCWNhbS0+d2hpdGVfYmFsID0gd2hpdGViYWwgLyAxMTsKKworCXV2ZC0+dnBpYy5jb2xvdXIgPSAxMDg7CisJdXZkLT52cGljLmh1ZSA9IDEwODsKKwl1dmQtPnZwaWMuYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisJdXZkLT52cGljLmNvbnRyYXN0ID0gY29udHJhc3Q7CisJdXZkLT52cGljLndoaXRlbmVzcyA9IHdoaXRlYmFsOworCXV2ZC0+dnBpYy5kZXB0aCA9IDY7CisJdXZkLT52cGljLnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1lVVjQyMFA7CisKKwltZW1zZXQoJnV2ZC0+dmNhcCwgMCwgc2l6ZW9mKHV2ZC0+dmNhcCkpOworCXN0cmNweSh1dmQtPnZjYXAubmFtZSwgIktvbmljYSBXZWJjYW0iKTsKKwl1dmQtPnZjYXAudHlwZSA9IFZJRF9UWVBFX0NBUFRVUkU7CisJdXZkLT52Y2FwLmNoYW5uZWxzID0gMTsKKwl1dmQtPnZjYXAuYXVkaW9zID0gMDsKKwl1dmQtPnZjYXAubWlud2lkdGggPSBjYW1lcmFfc2l6ZXNbU0laRV8xNjBYMTIwXS53aWR0aDsKKwl1dmQtPnZjYXAubWluaGVpZ2h0ID0gY2FtZXJhX3NpemVzW1NJWkVfMTYwWDEyMF0uaGVpZ2h0OworCXV2ZC0+dmNhcC5tYXh3aWR0aCA9IGNhbWVyYV9zaXplc1tTSVpFXzMyMFgyNDBdLndpZHRoOworCXV2ZC0+dmNhcC5tYXhoZWlnaHQgPSBjYW1lcmFfc2l6ZXNbU0laRV8zMjBYMjQwXS5oZWlnaHQ7CisKKwltZW1zZXQoJnV2ZC0+dmNoYW4sIDAsIHNpemVvZih1dmQtPnZjaGFuKSk7CisJdXZkLT52Y2hhbi5mbGFncyA9IDAgOworCXV2ZC0+dmNoYW4udHVuZXJzID0gMDsKKwl1dmQtPnZjaGFuLmNoYW5uZWwgPSAwOworCXV2ZC0+dmNoYW4udHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOworCXN0cmNweSh1dmQtPnZjaGFuLm5hbWUsICJDYW1lcmEiKTsKKworCS8qIFRhbGsgdG8gZGV2aWNlICovCisJREVCVUcoMSwgImRldmljZSBpbml0Iik7CisJaWYoIWtvbmljYXdjX2dldF9taXNjKHV2ZCwgMHgzLCAwLCAweDEwLCBidWYsIDIpKQorCQlERUJVRygyLCAiMywxMCAtPiAlMi4yeCAlMi4yeCIsIGJ1ZlswXSwgYnVmWzFdKTsKKwlpZigha29uaWNhd2NfZ2V0X21pc2ModXZkLCAweDMsIDAsIDB4MTAsIGJ1ZiwgMikpCisJCURFQlVHKDIsICIzLDEwIC0+ICUyLjJ4ICUyLjJ4IiwgYnVmWzBdLCBidWZbMV0pOworCWlmKGtvbmljYXdjX3NldF9taXNjKHV2ZCwgMHgyLCAwLCAweGQpKQorCQlERUJVRygyLCAiMiwwLGQgZmFpbGVkIik7CisJREVCVUcoMSwgInNldHRpbmcgaW5pdGlhbCB2YWx1ZXMiKTsKK30KKworCitzdGF0aWMgaW50IGtvbmljYXdjX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqZGV2aWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHV2ZCAqdXZkID0gTlVMTDsKKwlpbnQgaXgsIGksIG5hczsKKwlpbnQgYWN0SW50ZXJmYWNlPS0xLCBpbmFjdEludGVyZmFjZT0tMSwgbWF4UFM9MDsKKwl1bnNpZ25lZCBjaGFyIHZpZGVvX2VwID0gMDsKKworCURFQlVHKDEsICJrb25pY2F3Y19wcm9iZSglcCkiLCBpbnRmKTsKKworCS8qIFdlIGRvbid0IGhhbmRsZSBtdWx0aS1jb25maWcgY2FtZXJhcyAqLworCWlmIChkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpCisJCXJldHVybiAtRU5PREVWOworCisJaW5mbygiS29uaWNhIFdlYmNhbSAocmV2LiAweCUwNHgpIiwgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSkpOworCVJFU1RSSUNUX1RPX1JBTkdFKHNwZWVkLCAwLCBNQVhfU1BFRUQpOworCisJLyogVmFsaWRhdGUgZm91bmQgaW50ZXJmYWNlOiBtdXN0IGhhdmUgb25lIElTTyBlbmRwb2ludCAqLworCW5hcyA9IGludGYtPm51bV9hbHRzZXR0aW5nOworCWlmIChuYXMgIT0gOCkgeworCQllcnIoIkluY29ycmVjdCBudW1iZXIgb2YgYWx0ZXJuYXRlIHNldHRpbmdzICglZCkgZm9yIHRoaXMgY2FtZXJhISIsIG5hcyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiBWYWxpZGF0ZSBhbGwgYWx0ZXJuYXRlIHNldHRpbmdzICovCisJZm9yIChpeD0wOyBpeCA8IG5hczsgaXgrKykgeworCQljb25zdCBzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisKKwkJaW50ZXJmYWNlID0gJmludGYtPmFsdHNldHRpbmdbaXhdOworCQlpID0gaW50ZXJmYWNlLT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nOworCQlpZiAoaW50ZXJmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMikgeworCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyAldS4gZW5kcG9pbnRzISIsCisJCQkgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCisJCQkgICAgKHVuc2lnbmVkKShpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cykpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFsxXS5kZXNjOworCQlERUJVRygxLCAiZm91bmQgZW5kcG9pbnQ6IGFkZHI6IDB4JTIuMnggbWF4cHMgPSAweCU0LjR4IiwKKwkJICAgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzLCBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpKTsKKwkJaWYgKHZpZGVvX2VwID09IDApCisJCQl2aWRlb19lcCA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQllbHNlIGlmICh2aWRlb19lcCAhPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcykgeworCQkJZXJyKCJBbHRlcm5hdGUgc2V0dGluZ3MgaGF2ZSBkaWZmZXJlbnQgZW5kcG9pbnQgYWRkcmVzc2VzISIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMHgwMykgIT0gMHgwMSkgeworCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBub24tSVNPIGVuZHBvaW50ISIsCisJCQkgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApID09IDApIHsKKwkJCWVycigiSW50ZXJmYWNlICVkLiBoYXMgSVNPIE9VVCBlbmRwb2ludCEiLAorCQkJICAgIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmIChsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpID09IDApIHsKKwkJCWlmIChpbmFjdEludGVyZmFjZSA8IDApCisJCQkJaW5hY3RJbnRlcmZhY2UgPSBpOworCQkJZWxzZSB7CisJCQkJZXJyKCJNb3JlIHRoYW4gb25lIGluYWN0aXZlIGFsdC4gc2V0dGluZyEiKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChpID09IHNwZF90b19pZmFjZVtzcGVlZF0pIHsKKwkJCQkvKiBUaGlzIG9uZSBpcyB0aGUgcmVxdWVzdGVkIG9uZSAqLworCQkJCWFjdEludGVyZmFjZSA9IGk7CisJCQl9CisJCX0KKwkJaWYgKGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkgPiBtYXhQUykKKwkJCW1heFBTID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwl9CisJaWYoYWN0SW50ZXJmYWNlID09IC0xKSB7CisJCWVycigiQ2FudCBmaW5kIHJlcXVpcmVkIGVuZHBvaW50Iik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCURFQlVHKDEsICJTZWxlY3RpbmcgcmVxdWVzdGVkIGFjdGl2ZSBzZXR0aW5nPSVkLiBtYXhQUz0lZC4iLCBhY3RJbnRlcmZhY2UsIG1heFBTKTsKKworCXV2ZCA9IHVzYnZpZGVvX0FsbG9jYXRlRGV2aWNlKGNhbXMpOworCWlmICh1dmQgIT0gTlVMTCkgeworCQlzdHJ1Y3Qga29uaWNhd2MgKmNhbSA9IChzdHJ1Y3Qga29uaWNhd2MgKikodXZkLT51c2VyX2RhdGEpOworCQkvKiBIZXJlIHV2ZCBpcyBhIGZ1bGx5IGFsbG9jYXRlZCB1dmQgb2JqZWN0ICovCisJCWZvcihpID0gMDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQkJY2FtLT5zdHNfdXJiW2ldID0gdXNiX2FsbG9jX3VyYihGUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOworCQkJaWYoY2FtLT5zdHNfdXJiW2ldID09IE5VTEwpIHsKKwkJCQl3aGlsZShpLS0pIHsKKwkJCQkJdXNiX2ZyZWVfdXJiKGNhbS0+c3RzX3VyYltpXSk7CisJCQkJfQorCQkJCWVycigiY2FuJ3QgYWxsb2NhdGUgdXJicyIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9CisJCWNhbS0+c3BlZWQgPSBzcGVlZDsKKwkJUkVTVFJJQ1RfVE9fUkFOR0Uoc2l6ZSwgU0laRV8xNjBYMTIwLCBTSVpFXzMyMFgyNDApOworCQljYW0tPndpZHRoID0gY2FtZXJhX3NpemVzW3NpemVdLndpZHRoOworCQljYW0tPmhlaWdodCA9IGNhbWVyYV9zaXplc1tzaXplXS5oZWlnaHQ7CisJCWNhbS0+c2l6ZSA9IHNpemU7CisKKwkJdXZkLT5mbGFncyA9IDA7CisJCXV2ZC0+ZGVidWcgPSBkZWJ1ZzsKKwkJdXZkLT5kZXYgPSBkZXY7CisJCXV2ZC0+aWZhY2UgPSBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJCXV2ZC0+aWZhY2VBbHRJbmFjdGl2ZSA9IGluYWN0SW50ZXJmYWNlOworCQl1dmQtPmlmYWNlQWx0QWN0aXZlID0gYWN0SW50ZXJmYWNlOworCQl1dmQtPnZpZGVvX2VuZHAgPSB2aWRlb19lcDsKKwkJdXZkLT5pc29fcGFja2V0X2xlbiA9IG1heFBTOworCQl1dmQtPnBhbGV0dGVCaXRzID0gMUwgPDwgVklERU9fUEFMRVRURV9ZVVY0MjBQOworCQl1dmQtPmRlZmF1bHRQYWxldHRlID0gVklERU9fUEFMRVRURV9ZVVY0MjBQOworCQl1dmQtPmNhbnZhcyA9IFZJREVPU0laRSgzMjAsIDI0MCk7CisJCXV2ZC0+dmlkZW9zaXplID0gVklERU9TSVpFKGNhbS0+d2lkdGgsIGNhbS0+aGVpZ2h0KTsKKworCQkvKiBJbml0aWFsaXplIGtvbmljYXdjIHNwZWNpZmljIGRhdGEgKi8KKwkJa29uaWNhd2NfY29uZmlndXJlX3ZpZGVvKHV2ZCk7CisKKwkJaSA9IHVzYnZpZGVvX1JlZ2lzdGVyVmlkZW9EZXZpY2UodXZkKTsKKwkJdXZkLT5tYXhfZnJhbWVfc2l6ZSA9ICgzMjAgKiAyNDAgKiAzKS8yOworCQlpZiAoaSAhPSAwKSB7CisJCQllcnIoInVzYnZpZGVvX1JlZ2lzdGVyVmlkZW9EZXZpY2UoKSBmYWlsZWQuIik7CisJCQl1dmQgPSBOVUxMOworCQl9CisjaWZkZWYgQ09ORklHX0lOUFVUCisJCS8qIFJlZ2lzdGVyIGlucHV0IGRldmljZSBmb3IgYnV0dG9uICovCisJCW1lbXNldCgmY2FtLT5pbnB1dCwgMCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9kZXYpKTsKKwkJY2FtLT5pbnB1dC5uYW1lID0gIktvbmljYXdjIHNuYXBzaG90IGJ1dHRvbiI7CisJCWNhbS0+aW5wdXQucHJpdmF0ZSA9IGNhbTsKKwkJY2FtLT5pbnB1dC5ldmJpdFswXSA9IEJJVChFVl9LRVkpOworCQljYW0tPmlucHV0LmtleWJpdFtMT05HKEJUTl8wKV0gPSBCSVQoQlROXzApOworCQljYW0tPmlucHV0LmlkLmJ1c3R5cGUgPSBCVVNfVVNCOworCQljYW0tPmlucHV0LmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJCWNhbS0+aW5wdXQuaWQucHJvZHVjdCA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCQljYW0tPmlucHV0LmlkLnZlcnNpb24gPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKwkJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZjYW0tPmlucHV0KTsKKwkJCisJCXVzYl9tYWtlX3BhdGgoZGV2LCBjYW0tPmlucHV0X3BoeXNuYW1lLCA1Nik7CisJCXN0cmNhdChjYW0tPmlucHV0X3BoeXNuYW1lLCAiL2lucHV0MCIpOworCQljYW0tPmlucHV0LnBoeXMgPSBjYW0tPmlucHV0X3BoeXNuYW1lOworCQlpbmZvKCJrb25pY2F3YzogJXMgb24gJXNcbiIsIGNhbS0+aW5wdXQubmFtZSwgY2FtLT5pbnB1dC5waHlzKTsKKyNlbmRpZgorCX0KKworCWlmICh1dmQpIHsKKwkJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgdXZkKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlPOworfQorCisKK3N0YXRpYyB2b2lkIGtvbmljYXdjX2ZyZWVfdXZkKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qga29uaWNhd2MgKmNhbSA9IChzdHJ1Y3Qga29uaWNhd2MgKil1dmQtPnVzZXJfZGF0YTsKKworI2lmZGVmIENPTkZJR19JTlBVVAorCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZjYW0tPmlucHV0KTsKKyNlbmRpZgorCWZvciAoaT0wOyBpIDwgVVNCVklERU9fTlVNU0JVRjsgaSsrKSB7CisJCXVzYl9mcmVlX3VyYihjYW0tPnN0c191cmJbaV0pOworCQljYW0tPnN0c191cmJbaV0gPSBOVUxMOworCX0KK30KKworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHgwNGM4LCAweDA3MjApIH0sIC8qIEludGVsIFlDIDc2ICovCisJeyB9ICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBrb25pY2F3Y19pbml0KHZvaWQpCit7CisJc3RydWN0IHVzYnZpZGVvX2NiIGNiVGJsOworCWluZm8oRFJJVkVSX0RFU0MgIiAiIERSSVZFUl9WRVJTSU9OKTsKKwltZW1zZXQoJmNiVGJsLCAwLCBzaXplb2YoY2JUYmwpKTsKKwljYlRibC5wcm9iZSA9IGtvbmljYXdjX3Byb2JlOworCWNiVGJsLnNldHVwT25PcGVuID0ga29uaWNhd2Nfc2V0dXBfb25fb3BlbjsKKwljYlRibC5wcm9jZXNzRGF0YSA9IGtvbmljYXdjX3Byb2Nlc3NfaXNvYzsKKwljYlRibC5nZXRGUFMgPSBrb25pY2F3Y19jYWxjdWxhdGVfZnBzOworCWNiVGJsLnNldFZpZGVvTW9kZSA9IGtvbmljYXdjX3NldF92aWRlb19tb2RlOworCWNiVGJsLnN0YXJ0RGF0YVB1bXAgPSBrb25pY2F3Y19zdGFydF9kYXRhOworCWNiVGJsLnN0b3BEYXRhUHVtcCA9IGtvbmljYXdjX3N0b3BfZGF0YTsKKwljYlRibC5hZGp1c3RQaWN0dXJlID0ga29uaWNhd2NfYWRqdXN0X3BpY3R1cmU7CisJY2JUYmwudXNlckZyZWUgPSBrb25pY2F3Y19mcmVlX3V2ZDsKKwlyZXR1cm4gdXNidmlkZW9fcmVnaXN0ZXIoCisJCSZjYW1zLAorCQlNQVhfQ0FNRVJBUywKKwkJc2l6ZW9mKHN0cnVjdCBrb25pY2F3YyksCisJCSJrb25pY2F3YyIsCisJCSZjYlRibCwKKwkJVEhJU19NT0RVTEUsCisJCWlkX3RhYmxlKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQga29uaWNhd2NfY2xlYW51cCh2b2lkKQoreworCXVzYnZpZGVvX0RlcmVnaXN0ZXIoJmNhbXMpOworfQorCisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlNpbW9uIEV2YW5zIDxzcHNlQHNlY3JldC5vcmcudWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworbW9kdWxlX3BhcmFtKHNwZWVkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzcGVlZCwgIkluaXRpYWwgc3BlZWQ6IDAgKHNsb3dlc3QpIC0gNiAoZmFzdGVzdCkiKTsKK21vZHVsZV9wYXJhbShzaXplLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzaXplLCAiSW5pdGlhbCBTaXplIDA6IDE2MHgxMjAgMTogMTYweDEzNiAyOiAxNzZ4MTQ0IDM6IDMyMHgyNDAiKTsKK21vZHVsZV9wYXJhbShicmlnaHRuZXNzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhicmlnaHRuZXNzLCAiSW5pdGlhbCBicmlnaHRuZXNzIDAgLSAxMDgiKTsKK21vZHVsZV9wYXJhbShjb250cmFzdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY29udHJhc3QsICJJbml0aWFsIGNvbnRyYXN0IDAgLSAxMDgiKTsKK21vZHVsZV9wYXJhbShzYXR1cmF0aW9uLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzYXR1cmF0aW9uLCAiSW5pdGlhbCBzYXR1cmF0aW9uIDAgLSAxMDgiKTsKK21vZHVsZV9wYXJhbShzaGFycG5lc3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNoYXJwbmVzcywgIkluaXRpYWwgYnJpZ2h0bmVzcyAwIC0gMTA4Iik7Cittb2R1bGVfcGFyYW0od2hpdGViYWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdoaXRlYmFsLCAiSW5pdGlhbCB3aGl0ZSBiYWxhbmNlIDAgLSAzNjMiKTsKKworI2lmZGVmIENPTkZJR19VU0JfREVCVUcKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWw6IDAtOSAoZGVmYXVsdD0wKSIpOworI2VuZGlmCisKK21vZHVsZV9pbml0KGtvbmljYXdjX2luaXQpOworbW9kdWxlX2V4aXQoa29uaWNhd2NfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9vdjUxMS5jIGIvZHJpdmVycy91c2IvbWVkaWEvb3Y1MTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmQ3ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvb3Y1MTEuYwpAQCAtMCwwICsxLDYxMzEgQEAKKy8qCisgKiBPbW5pVmlzaW9uIE9WNTExIENhbWVyYS10by1VU0IgQnJpZGdlIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAzIE1hcmsgVy4gTWNDbGVsbGFuZAorICogT3JpZ2luYWwgZGVjb21wcmVzc2lvbiBjb2RlIENvcHlyaWdodCAxOTk4LTIwMDAgT21uaVZpc2lvbiBUZWNobm9sb2dpZXMKKyAqIE1hbnkgaW1wcm92ZW1lbnRzIGJ5IEJyZXQgV2FsbGFjaCA8YndhbGxhYzFAc2FuLnJyLmNvbT4KKyAqIENvbG9yIGZpeGVzIGJ5IGJ5IE9yaW9uIFNreSBMYXdsb3IgPG9sYXdsb3JAYWNtLm9yZz4gKDIvMjYvMjAwMCkKKyAqIFNuYXBzaG90IGNvZGUgYnkgS2V2aW4gTW9vcmUKKyAqIE9WNzYyMCBmaXhlcyBieSBDaGFybCBQLiBCb3RoYSA8Y3Bib3RoYUBpZWVlLm9yZz4KKyAqIENoYW5nZXMgYnkgQ2xhdWRpbyBNYXRzdW9rYSA8Y2xhdWRpb0Bjb25lY3RpdmEuY29tPgorICogT3JpZ2luYWwgU0FBNzExMUEgY29kZSBieSBEYXZlIFBlcmtzIDxkcGVya3NAaWJtLm5ldD4KKyAqIFVSQiBlcnJvciBtZXNzYWdlcyBmcm9tIHB3YyBkcml2ZXIgYnkgTmVtb3NvZnQKKyAqIGdlbmVyaWNfaW9jdGwoKSBjb2RlIGZyb20gdmlkZW9kZXYuYyBieSBHZXJkIEtub3JyIGFuZCBBbGFuIENveAorICogTWVtb3J5IG1hbmFnZW1lbnQgKHJ2bWFsbG9jKSBjb2RlIGZyb20gYnR0diBkcml2ZXIsIGJ5IEdlcmQgS25vcnIgYW5kIG90aGVycworICoKKyAqIEJhc2VkIG9uIHRoZSBMaW51eCBDUGlBIGRyaXZlciB3cml0dGVuIGJ5IFBldGVyIFByZWdsZXIsCisgKiBTY290dCBKLiBCZXJ0aW4gYW5kIEpvaGFubmVzIEVyZGZlbHQuCisgKiAKKyAqIFBsZWFzZSBzZWUgdGhlIGZpbGU6IERvY3VtZW50YXRpb24vdXNiL292NTExLnR4dAorICogYW5kIHRoZSB3ZWJzaXRlIGF0OiAgaHR0cDovL2FscGhhLmR5bmRucy5vcmcvb3Y1MTEKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2lmIGRlZmluZWQgKF9faTM4Nl9fKQorCSNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJvdjUxMS5oIgorCisvKgorICogVmVyc2lvbiBJbmZvcm1hdGlvbgorICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS42NCBmb3IgTGludXggMi41IgorI2RlZmluZSBFTUFJTCAibWFya0BhbHBoYS5keW5kbnMub3JnIgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJNYXJrIE1jQ2xlbGxhbmQgPG1hcmtAYWxwaGEuZHluZG5zLm9yZz4gJiBCcmV0IFdhbGxhY2ggXAorCSYgT3Jpb24gU2t5IExhd2xvciA8b2xhd2xvckBhY20ub3JnPiAmIEtldmluIE1vb3JlICYgQ2hhcmwgUC4gQm90aGEgXAorCTxjcGJvdGhhQGllZWUub3JnPiAmIENsYXVkaW8gTWF0c3Vva2EgPGNsYXVkaW9AY29uZWN0aXZhLmNvbT4iCisjZGVmaW5lIERSSVZFUl9ERVNDICJvdjUxMSBVU0IgQ2FtZXJhIERyaXZlciIKKworI2RlZmluZSBPVjUxMV9JMkNfUkVUUklFUyAzCisjZGVmaW5lIEVOQUJMRV9ZX1FVQU5UQUJMRSAxCisjZGVmaW5lIEVOQUJMRV9VVl9RVUFOVEFCTEUgMQorCisjZGVmaW5lIE9WNTExX01BWF9VTklUX1ZJREVPIDE2CisKKy8qIFBpeGVsIGNvdW50ICogYnl0ZXMgcGVyIFlVVjQyMCBwaXhlbCAoMS41KSAqLworI2RlZmluZSBNQVhfRlJBTUVfU0laRSh3LCBoKSAoKHcpICogKGgpICogMyAvIDIpCisKKyNkZWZpbmUgTUFYX0RBVEFfU0laRSh3LCBoKSAoTUFYX0ZSQU1FX1NJWkUodywgaCkgKyBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKQorCisvKiBNYXggc2l6ZSAqIGJ5dGVzIHBlciBZVVY0MjAgcGl4ZWwgKDEuNSkgKyBvbmUgZXh0cmEgaXNvYyBmcmFtZSBmb3Igc2FmZXR5ICovCisjZGVmaW5lIE1BWF9SQVdfREFUQV9TSVpFKHcsIGgpICgodykgKiAoaCkgKiAzIC8gMiArIDEwMjQpCisKKyNkZWZpbmUgRkFUQUxfRVJST1IocmMpICgocmMpIDwgMCAmJiAocmMpICE9IC1FUEVSTSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vZHVsZSBQYXJhbWV0ZXJzCisgKiAoU2VlIG92NTExLnR4dCBmb3IgZGV0YWlsZWQgZGVzY3JpcHRpb25zIG9mIHRoZXNlKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZXNlIHZhcmlhYmxlcyAoYW5kIGFsbCBzdGF0aWMgZ2xvYmFscykgZGVmYXVsdCB0byB6ZXJvICovCitzdGF0aWMgaW50IGF1dG9icmlnaHQJCT0gMTsKK3N0YXRpYyBpbnQgYXV0b2dhaW4JCT0gMTsKK3N0YXRpYyBpbnQgYXV0b2V4cAkJPSAxOworc3RhdGljIGludCBkZWJ1ZzsKK3N0YXRpYyBpbnQgc25hcHNob3Q7CitzdGF0aWMgaW50IGNhbXMJCQk9IDE7CitzdGF0aWMgaW50IGNvbXByZXNzOworc3RhdGljIGludCB0ZXN0cGF0Oworc3RhdGljIGludCBkdW1wcGl4Oworc3RhdGljIGludCBsZWQgCQkJPSAxOworc3RhdGljIGludCBkdW1wX2JyaWRnZTsKK3N0YXRpYyBpbnQgZHVtcF9zZW5zb3I7CitzdGF0aWMgaW50IHByaW50cGg7CitzdGF0aWMgaW50IHBoeQkJCT0gMHgxZjsKK3N0YXRpYyBpbnQgcGh1dgkJCT0gMHgwNTsKK3N0YXRpYyBpbnQgcHZ5CQkJPSAweDA2Oworc3RhdGljIGludCBwdnV2CQkJPSAweDA2Oworc3RhdGljIGludCBxaHkJCQk9IDB4MTQ7CitzdGF0aWMgaW50IHFodXYJCQk9IDB4MDM7CitzdGF0aWMgaW50IHF2eQkJCT0gMHgwNDsKK3N0YXRpYyBpbnQgcXZ1dgkJCT0gMHgwNDsKK3N0YXRpYyBpbnQgbGlnaHRmcmVxOworc3RhdGljIGludCBiYW5kaW5nZmlsdGVyOworc3RhdGljIGludCBjbG9ja2RpdgkJPSAtMTsKK3N0YXRpYyBpbnQgcGFja2V0c2l6ZQkJPSAtMTsKK3N0YXRpYyBpbnQgZnJhbWVkcm9wCQk9IC0xOworc3RhdGljIGludCBmYXN0c2V0Oworc3RhdGljIGludCBmb3JjZV9wYWxldHRlOworc3RhdGljIGludCBiYWNrbGlnaHQ7CitzdGF0aWMgaW50IHVuaXRfdmlkZW9bT1Y1MTFfTUFYX1VOSVRfVklERU9dOworc3RhdGljIGludCByZW1vdmVfemVyb3M7CitzdGF0aWMgaW50IG1pcnJvcjsKK3N0YXRpYyBpbnQgb3Y1MThfY29sb3I7CisKK21vZHVsZV9wYXJhbShhdXRvYnJpZ2h0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhdXRvYnJpZ2h0LCAiU2Vuc29yIGF1dG9tYXRpY2FsbHkgY2hhbmdlcyBicmlnaHRuZXNzIik7Cittb2R1bGVfcGFyYW0oYXV0b2dhaW4sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9nYWluLCAiU2Vuc29yIGF1dG9tYXRpY2FsbHkgY2hhbmdlcyBnYWluIik7Cittb2R1bGVfcGFyYW0oYXV0b2V4cCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYXV0b2V4cCwgIlNlbnNvciBhdXRvbWF0aWNhbGx5IGNoYW5nZXMgZXhwb3N1cmUiKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsCisgICJEZWJ1ZyBsZXZlbDogMD1ub25lLCAxPWluaXRzLCAyPXdhcm5pbmcsIDM9Y29uZmlnLCA0PWZ1bmN0aW9ucywgNT1tYXgiKTsKK21vZHVsZV9wYXJhbShzbmFwc2hvdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc25hcHNob3QsICJFbmFibGUgc25hcHNob3QgbW9kZSIpOworbW9kdWxlX3BhcmFtKGNhbXMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNhbXMsICJOdW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGNhbWVyYXMiKTsKK21vZHVsZV9wYXJhbShjb21wcmVzcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY29tcHJlc3MsICJUdXJuIG9uIGNvbXByZXNzaW9uIik7Cittb2R1bGVfcGFyYW0odGVzdHBhdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGVzdHBhdCwKKyAgIlJlcGxhY2UgaW1hZ2Ugd2l0aCB2ZXJ0aWNhbCBiYXIgdGVzdHBhdHRlcm4gKG9ubHkgcGFydGlhbGx5IHdvcmtpbmcpIik7Cittb2R1bGVfcGFyYW0oZHVtcHBpeCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZHVtcHBpeCwgIkR1bXAgcmF3IHBpeGVsIGRhdGEiKTsKK21vZHVsZV9wYXJhbShsZWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxlZCwKKyAgIkxFRCBwb2xpY3kgKE9WNTExKyBvciBsYXRlcikuIDA9b2ZmLCAxPW9uIChkZWZhdWx0KSwgMj1hdXRvIChvbiB3aGVuIG9wZW4pIik7Cittb2R1bGVfcGFyYW0oZHVtcF9icmlkZ2UsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGR1bXBfYnJpZGdlLCAiRHVtcCB0aGUgYnJpZGdlIHJlZ2lzdGVycyIpOworbW9kdWxlX3BhcmFtKGR1bXBfc2Vuc29yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkdW1wX3NlbnNvciwgIkR1bXAgdGhlIHNlbnNvciByZWdpc3RlcnMiKTsKK21vZHVsZV9wYXJhbShwcmludHBoLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwcmludHBoLCAiUHJpbnQgZnJhbWUgc3RhcnQvZW5kIGhlYWRlcnMiKTsKK21vZHVsZV9wYXJhbShwaHksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBoeSwgIlByZWRpY3Rpb24gcmFuZ2UgKGhvcml6LiBZKSIpOworbW9kdWxlX3BhcmFtKHBodXYsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBodXYsICJQcmVkaWN0aW9uIHJhbmdlIChob3Jpei4gVVYpIik7Cittb2R1bGVfcGFyYW0ocHZ5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwdnksICJQcmVkaWN0aW9uIHJhbmdlICh2ZXJ0LiBZKSIpOworbW9kdWxlX3BhcmFtKHB2dXYsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHB2dXYsICJQcmVkaWN0aW9uIHJhbmdlICh2ZXJ0LiBVVikiKTsKK21vZHVsZV9wYXJhbShxaHksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHFoeSwgIlF1YW50aXphdGlvbiB0aHJlc2hvbGQgKGhvcml6LiBZKSIpOworbW9kdWxlX3BhcmFtKHFodXYsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHFodXYsICJRdWFudGl6YXRpb24gdGhyZXNob2xkIChob3Jpei4gVVYpIik7Cittb2R1bGVfcGFyYW0ocXZ5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhxdnksICJRdWFudGl6YXRpb24gdGhyZXNob2xkICh2ZXJ0LiBZKSIpOworbW9kdWxlX3BhcmFtKHF2dXYsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHF2dXYsICJRdWFudGl6YXRpb24gdGhyZXNob2xkICh2ZXJ0LiBVVikiKTsKK21vZHVsZV9wYXJhbShsaWdodGZyZXEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxpZ2h0ZnJlcSwKKyAgIkxpZ2h0IGZyZXF1ZW5jeS4gU2V0IHRvIDUwIG9yIDYwIEh6LCBvciB6ZXJvIGZvciBkZWZhdWx0IHNldHRpbmdzIik7Cittb2R1bGVfcGFyYW0oYmFuZGluZ2ZpbHRlciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFuZGluZ2ZpbHRlciwKKyAgIkVuYWJsZSBiYW5kaW5nIGZpbHRlciAodG8gcmVkdWNlIGVmZmVjdHMgb2YgZmx1b3Jlc2NlbnQgbGlnaHRpbmcpIik7Cittb2R1bGVfcGFyYW0oY2xvY2tkaXYsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNsb2NrZGl2LCAiRm9yY2UgcGl4ZWwgY2xvY2sgZGl2aXNvciB0byBhIHNwZWNpZmljIHZhbHVlIik7Cittb2R1bGVfcGFyYW0ocGFja2V0c2l6ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGFja2V0c2l6ZSwgIkZvcmNlIGEgc3BlY2lmaWMgaXNvYyBwYWNrZXQgc2l6ZSIpOworbW9kdWxlX3BhcmFtKGZyYW1lZHJvcCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnJhbWVkcm9wLCAiRm9yY2UgYSBzcGVjaWZpYyBmcmFtZSBkcm9wIHJlZ2lzdGVyIHNldHRpbmciKTsKK21vZHVsZV9wYXJhbShmYXN0c2V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmYXN0c2V0LCAiQWxsb3dzIHBpY3R1cmUgc2V0dGluZ3MgdG8gdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkiKTsKK21vZHVsZV9wYXJhbShmb3JjZV9wYWxldHRlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9wYWxldHRlLCAiRm9yY2UgdGhlIHBhbGV0dGUgdG8gYSBzcGVjaWZpYyB2YWx1ZSIpOworbW9kdWxlX3BhcmFtKGJhY2tsaWdodCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFja2xpZ2h0LCAiRm9yIG9iamVjdHMgdGhhdCBhcmUgbGl0IGZyb20gYmVoaW5kIik7CitzdGF0aWMgaW50IG51bV91djsKK21vZHVsZV9wYXJhbV9hcnJheSh1bml0X3ZpZGVvLCBpbnQsICZudW1fdXYsIDApOworTU9EVUxFX1BBUk1fREVTQyh1bml0X3ZpZGVvLAorICAiRm9yY2UgdXNlIG9mIHNwZWNpZmljIG1pbm9yIG51bWJlcihzKS4gMCBpcyBub3QgYWxsb3dlZC4iKTsKK21vZHVsZV9wYXJhbShyZW1vdmVfemVyb3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlbW92ZV96ZXJvcywKKyAgIlJlbW92ZSB6ZXJvLXBhZGRpbmcgZnJvbSB1bmNvbXByZXNzZWQgaW5jb21pbmcgZGF0YSIpOworbW9kdWxlX3BhcmFtKG1pcnJvciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWlycm9yLCAiUmV2ZXJzZSBpbWFnZSBob3Jpem9udGFsbHkiKTsKK21vZHVsZV9wYXJhbShvdjUxOF9jb2xvciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mob3Y1MThfY29sb3IsICJFbmFibGUgT1Y1MTggY29sb3IgKGV4cGVyaW1lbnRhbCkiKTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNaXNjZWxsYW5lb3VzIEdsb2JhbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgb3Y1MTFfZHJpdmVyOworCitzdGF0aWMgc3RydWN0IG92NTF4X2RlY29tcF9vcHMgKm92NTExX2RlY29tcF9vcHM7CitzdGF0aWMgc3RydWN0IG92NTF4X2RlY29tcF9vcHMgKm92NTExX21teF9kZWNvbXBfb3BzOworc3RhdGljIHN0cnVjdCBvdjUxeF9kZWNvbXBfb3BzICpvdjUxOF9kZWNvbXBfb3BzOworc3RhdGljIHN0cnVjdCBvdjUxeF9kZWNvbXBfb3BzICpvdjUxOF9tbXhfZGVjb21wX29wczsKKworLyogTnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGEgZmFpbGVkIEkyQyB0cmFuc2FjdGlvbi4gSW5jcmVhc2UgdGhpcyBpZiB5b3UKKyAqIGFyZSBnZXR0aW5nICJGYWlsZWQgdG8gcmVhZCBzZW5zb3IgSUQuLi4iICovCitzdGF0aWMgaW50IGkyY19kZXRlY3RfdHJpZXMgPSA1OworCisvKiBNTVggc3VwcG9ydCBpcyBwcmVzZW50IGluIGtlcm5lbCBhbmQgQ1BVLiBDaGVja2VkIHVwb24gZGVjb21wIG1vZHVsZSBsb2FkLiAqLworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKyNkZWZpbmUgb3Y1MXhfbW14X2F2YWlsYWJsZSAoY3B1X2hhc19tbXgpCisjZWxzZQorI2RlZmluZSBvdjUxeF9tbXhfYXZhaWxhYmxlICgwKQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKFZFTkRfT01OSVZJU0lPTiwgUFJPRF9PVjUxMSkgfSwKKwl7IFVTQl9ERVZJQ0UoVkVORF9PTU5JVklTSU9OLCBQUk9EX09WNTExUExVUykgfSwKKwl7IFVTQl9ERVZJQ0UoVkVORF9PTU5JVklTSU9OLCBQUk9EX09WNTE4KSB9LAorCXsgVVNCX0RFVklDRShWRU5EX09NTklWSVNJT04sIFBST0RfT1Y1MThQTFVTKSB9LAorCXsgVVNCX0RFVklDRShWRU5EX01BVFRFTCwgUFJPRF9NRTJDQU0pIH0sCisJeyB9ICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBkZXZpY2VfdGFibGUpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciB5UXVhblRhYmxlNTExW10gPSBPVjUxMV9ZUVVBTlRBQkxFOworc3RhdGljIHVuc2lnbmVkIGNoYXIgdXZRdWFuVGFibGU1MTFbXSA9IE9WNTExX1VWUVVBTlRBQkxFOworc3RhdGljIHVuc2lnbmVkIGNoYXIgeVF1YW5UYWJsZTUxOFtdID0gT1Y1MThfWVFVQU5UQUJMRTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHV2UXVhblRhYmxlNTE4W10gPSBPVjUxOF9VVlFVQU5UQUJMRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN5bWJvbGljIE5hbWVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogS25vd24gT1Y1MTEtYmFzZWQgY2FtZXJhcyAqLworc3RhdGljIHN0cnVjdCBzeW1ib2xpY19saXN0IGNhbWxpc3RbXSA9IHsKKwl7ICAgMCwgIkdlbmVyaWMgQ2FtZXJhIChubyBJRCkiIH0sCisJeyAgIDEsICJNdXN0ZWsgV0NhbSAzWCIgfSwKKwl7ICAgMywgIkQtTGluayBEU0ItQzMwMCIgfSwKKwl7ICAgNCwgIkdlbmVyaWMgT1Y1MTEvT1Y3NjEwIiB9LAorCXsgICA1LCAiUHVyZXRlayBQVC02MDA3IiB9LAorCXsgICA2LCAiTGlmZXZpZXcgVVNCIExpZmUgVFYgKE5UU0MpIiB9LAorCXsgIDIxLCAiQ3JlYXRpdmUgTGFicyBXZWJDYW0gMyIgfSwKKwl7ICAyMiwgIkxpZmV2aWV3IFVTQiBMaWZlIFRWIChQQUwgRC9LK0IvRykiIH0sCisJeyAgMzYsICJLb2FsYS1DYW0iIH0sCisJeyAgMzgsICJMaWZldmlldyBVU0IgTGlmZSBUViAoUEFMKSIgfSwKKwl7ICA0MSwgIlNhbXN1bmcgQW55Y2FtIE1QQy1NMTAiIH0sCisJeyAgNDMsICJNdGVrdmlzaW9uIFplY2EgTVY0MDIiIH0sCisJeyAgNDYsICJTdW1hIGVPTiIgfSwKKwl7ICA3MCwgIkxpZmV2aWV3IFVTQiBMaWZlIFRWIChQQUwvU0VDQU0pIiB9LAorCXsgMTAwLCAiTGlmZXZpZXcgUm9ib0NhbSIgfSwKKwl7IDEwMiwgIkF2ZXJNZWRpYSBJbnRlckNhbSBFbGl0ZSIgfSwKKwl7IDExMiwgIk1lZGlhRm9ydGUgTVYzMDAiIH0sCS8qIG9yIE9WNzExMCBldmFsdWF0aW9uIGtpdCAqLworCXsgMTM0LCAiRXpvbmljcyBFWkNhbSBJSSIgfSwKKwl7IDE5MiwgIldlYmV5ZSAyMDAwQiIgfSwKKwl7IDI1MywgIkFscGhhIFZpc2lvbiBUZWNoLiBBbHBoYUNhbSBTRSIgfSwKKwl7ICAtMSwgTlVMTCB9Cit9OworCisvKiBWaWRlbzRMaW51eDEgUGFsZXR0ZXMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9saWNfbGlzdCB2NGwxX3BsaXN0W10gPSB7CisJeyBWSURFT19QQUxFVFRFX0dSRVksCSJHUkVZIiB9LAorCXsgVklERU9fUEFMRVRURV9ISTI0MCwJIkhJMjQwIiB9LAorCXsgVklERU9fUEFMRVRURV9SR0I1NjUsCSJSR0I1NjUiIH0sCisJeyBWSURFT19QQUxFVFRFX1JHQjI0LAkiUkdCMjQiIH0sCisJeyBWSURFT19QQUxFVFRFX1JHQjMyLAkiUkdCMzIiIH0sCisJeyBWSURFT19QQUxFVFRFX1JHQjU1NSwJIlJHQjU1NSIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVWNDIyLAkiWVVWNDIyIiB9LAorCXsgVklERU9fUEFMRVRURV9ZVVlWLAkiWVVZViIgfSwKKwl7IFZJREVPX1BBTEVUVEVfVVlWWSwJIlVZVlkiIH0sCisJeyBWSURFT19QQUxFVFRFX1lVVjQyMCwJIllVVjQyMCIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVWNDExLAkiWVVWNDExIiB9LAorCXsgVklERU9fUEFMRVRURV9SQVcsCSJSQVciIH0sCisJeyBWSURFT19QQUxFVFRFX1lVVjQyMlAsIllVVjQyMlAiIH0sCisJeyBWSURFT19QQUxFVFRFX1lVVjQxMVAsIllVVjQxMVAiIH0sCisJeyBWSURFT19QQUxFVFRFX1lVVjQyMFAsIllVVjQyMFAiIH0sCisJeyBWSURFT19QQUxFVFRFX1lVVjQxMFAsIllVVjQxMFAiIH0sCisJeyAtMSwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHN5bWJvbGljX2xpc3QgYnJnbGlzdFtdID0geworCXsgQlJHX09WNTExLAkJIk9WNTExIiB9LAorCXsgQlJHX09WNTExUExVUywJIk9WNTExKyIgfSwKKwl7IEJSR19PVjUxOCwJCSJPVjUxOCIgfSwKKwl7IEJSR19PVjUxOFBMVVMsCSJPVjUxOCsiIH0sCisJeyAtMSwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHN5bWJvbGljX2xpc3Qgc2VubGlzdFtdID0geworCXsgU0VOX09WNzZCRSwJIk9WNzZCRSIgfSwKKwl7IFNFTl9PVjc2MTAsCSJPVjc2MTAiIH0sCisJeyBTRU5fT1Y3NjIwLAkiT1Y3NjIwIiB9LAorCXsgU0VOX09WNzYyMEFFLAkiT1Y3NjIwQUUiIH0sCisJeyBTRU5fT1Y2NjIwLAkiT1Y2NjIwIiB9LAorCXsgU0VOX09WNjYzMCwJIk9WNjYzMCIgfSwKKwl7IFNFTl9PVjY2MzBBRSwJIk9WNjYzMEFFIiB9LAorCXsgU0VOX09WNjYzMEFGLAkiT1Y2NjMwQUYiIH0sCisJeyBTRU5fT1Y4NjAwLAkiT1Y4NjAwIiB9LAorCXsgU0VOX0tTMDEyNywJIktTMDEyNyIgfSwKKwl7IFNFTl9LUzAxMjdCLAkiS1MwMTI3QiIgfSwKKwl7IFNFTl9TQUE3MTExQSwJIlNBQTcxMTFBIiB9LAorCXsgLTEsIE5VTEwgfQorfTsKKworLyogVVJCIGVycm9yIGNvZGVzOiAqLworc3RhdGljIHN0cnVjdCBzeW1ib2xpY19saXN0IHVyYl9lcnJsaXN0W10gPSB7CisJeyAtRU5PU1IsCSJCdWZmZXIgZXJyb3IgKG92ZXJydW4pIiB9LAorCXsgLUVQSVBFLAkiU3RhbGxlZCAoZGV2aWNlIG5vdCByZXNwb25kaW5nKSIgfSwKKwl7IC1FT1ZFUkZMT1csCSJCYWJibGUgKGJhZCBjYWJsZT8pIiB9LAorCXsgLUVQUk9UTywJIkJpdC1zdHVmZiBlcnJvciAoYmFkIGNhYmxlPykiIH0sCisJeyAtRUlMU0VRLAkiQ1JDL1RpbWVvdXQiIH0sCisJeyAtRVRJTUVET1VULAkiTkFLIChkZXZpY2UgZG9lcyBub3QgcmVzcG9uZCkiIH0sCisJeyAtMSwgTlVMTCB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWVtb3J5IG1hbmFnZW1lbnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgKgorcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXZvaWQgKm1lbTsKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCW1lbSA9IHZtYWxsb2NfMzIoc2l6ZSk7CisJaWYgKCFtZW0pCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7IC8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZAorcnZmcmVlKHZvaWQgKm1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJaWYgKCFtZW0pCisJCXJldHVybjsKKworCWFkciA9ICh1bnNpZ25lZCBsb25nKSBtZW07CisJd2hpbGUgKChsb25nKSBzaXplID4gMCkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJYWRyICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCXZmcmVlKG1lbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVnaXN0ZXIgSS9PCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdyaXRlIGFuIE9WNTF4IHJlZ2lzdGVyICovCitzdGF0aWMgaW50CityZWdfdyhzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJaW50IHJjOworCisJUERFQlVHKDUsICIweCUwMlg6MHglMDJYIiwgcmVnLCB2YWx1ZSk7CisKKwlkb3duKCZvdi0+Y2J1Zl9sb2NrKTsKKwlvdi0+Y2J1ZlswXSA9IHZhbHVlOworCXJjID0gdXNiX2NvbnRyb2xfbXNnKG92LT5kZXYsCisJCQkgICAgIHVzYl9zbmRjdHJscGlwZShvdi0+ZGV2LCAwKSwKKwkJCSAgICAgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KT8xOjIgLyogUkVHX0lPICovLAorCQkJICAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAwLCAoX191MTYpcmVnLCAmb3YtPmNidWZbMF0sIDEsIDEwMDApOworCXVwKCZvdi0+Y2J1Zl9sb2NrKTsKKworCWlmIChyYyA8IDApCisJCWVycigicmVnIHdyaXRlOiBlcnJvciAlZDogJXMiLCByYywgc3ltYm9saWModXJiX2Vycmxpc3QsIHJjKSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJlYWQgZnJvbSBhbiBPVjUxeCByZWdpc3RlciAqLworLyogcmV0dXJuczogbmVnYXRpdmUgaXMgZXJyb3IsIHBvcyBvciB6ZXJvIGlzIGRhdGEgKi8KK3N0YXRpYyBpbnQKK3JlZ19yKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlpbnQgcmM7CisKKwlkb3duKCZvdi0+Y2J1Zl9sb2NrKTsKKwlyYyA9IHVzYl9jb250cm9sX21zZyhvdi0+ZGV2LAorCQkJICAgICB1c2JfcmN2Y3RybHBpcGUob3YtPmRldiwgMCksCisJCQkgICAgIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCk/MTozIC8qIFJFR19JTyAqLywKKwkJCSAgICAgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgIDAsIChfX3UxNilyZWcsICZvdi0+Y2J1ZlswXSwgMSwgMTAwMCk7CisKKwlpZiAocmMgPCAwKSB7CisJCWVycigicmVnIHJlYWQ6IGVycm9yICVkOiAlcyIsIHJjLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgcmMpKTsKKwl9IGVsc2UgeworCQlyYyA9IG92LT5jYnVmWzBdOworCQlQREVCVUcoNSwgIjB4JTAyWDoweCUwMlgiLCByZWcsIG92LT5jYnVmWzBdKTsKKwl9CisKKwl1cCgmb3YtPmNidWZfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBXcml0ZXMgYml0cyBhdCBwb3NpdGlvbnMgc3BlY2lmaWVkIGJ5IG1hc2sgdG8gYW4gT1Y1MXggcmVnLiBCaXRzIHRoYXQgYXJlIGluCisgKiB0aGUgc2FtZSBwb3NpdGlvbiBhcyAxJ3MgaW4gIm1hc2siIGFyZSBjbGVhcmVkIGFuZCBzZXQgdG8gInZhbHVlIi4gQml0cworICogdGhhdCBhcmUgaW4gdGhlIHNhbWUgcG9zaXRpb24gYXMgMCdzIGluICJtYXNrIiBhcmUgcHJlc2VydmVkLCByZWdhcmRsZXNzCisgKiBvZiB0aGVpciByZXNwZWN0aXZlIHN0YXRlIGluICJ2YWx1ZSIuCisgKi8KK3N0YXRpYyBpbnQKK3JlZ193X21hc2soc3RydWN0IHVzYl9vdjUxMSAqb3YsCisJICAgdW5zaWduZWQgY2hhciByZWcsCisJICAgdW5zaWduZWQgY2hhciB2YWx1ZSwKKwkgICB1bnNpZ25lZCBjaGFyIG1hc2spCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyIG9sZHZhbCwgbmV3dmFsOworCisJcmV0ID0gcmVnX3Iob3YsIHJlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlvbGR2YWwgPSAodW5zaWduZWQgY2hhcikgcmV0OworCW9sZHZhbCAmPSAofm1hc2spOwkJLyogQ2xlYXIgdGhlIG1hc2tlZCBiaXRzICovCisJdmFsdWUgJj0gbWFzazsJCQkvKiBFbmZvcmNlIG1hc2sgb24gdmFsdWUgKi8KKwluZXd2YWwgPSBvbGR2YWwgfCB2YWx1ZTsJLyogU2V0IHRoZSBkZXNpcmVkIGJpdHMgKi8KKworCXJldHVybiAocmVnX3cob3YsIHJlZywgbmV3dmFsKSk7Cit9CisKKy8qIAorICogV3JpdGVzIG11bHRpcGxlIChuKSBieXRlIHZhbHVlIHRvIGEgc2luZ2xlIHJlZ2lzdGVyLiBPbmx5IHZhbGlkIHdpdGggY2VydGFpbgorICogcmVnaXN0ZXJzICgweDMwIGFuZCAweGM0IC0gMHhjZSkuCisgKi8KK3N0YXRpYyBpbnQKK292NTE4X3JlZ193MzIoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgcmVnLCB1MzIgdmFsLCBpbnQgbikKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoNSwgIjB4JTAyWDolN2QsIG49JWQiLCByZWcsIHZhbCwgbik7CisKKwlkb3duKCZvdi0+Y2J1Zl9sb2NrKTsKKworCSooKF9fbGUzMiAqKW92LT5jYnVmKSA9IF9fY3B1X3RvX2xlMzIodmFsKTsKKworCXJjID0gdXNiX2NvbnRyb2xfbXNnKG92LT5kZXYsCisJCQkgICAgIHVzYl9zbmRjdHJscGlwZShvdi0+ZGV2LCAwKSwKKwkJCSAgICAgMSAvKiBSRUdfSU8gKi8sCisJCQkgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgIDAsIChfX3UxNilyZWcsIG92LT5jYnVmLCBuLCAxMDAwKTsKKwl1cCgmb3YtPmNidWZfbG9jayk7CisKKwlpZiAocmMgPCAwKQorCQllcnIoInJlZyB3cml0ZSBtdWx0aXBsZTogZXJyb3IgJWQ6ICVzIiwgcmMsCisJCSAgICBzeW1ib2xpYyh1cmJfZXJybGlzdCwgcmMpKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorb3Y1MTFfdXBsb2FkX3F1YW5fdGFibGVzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCXVuc2lnbmVkIGNoYXIgKnBZVGFibGUgPSB5UXVhblRhYmxlNTExOworCXVuc2lnbmVkIGNoYXIgKnBVVlRhYmxlID0gdXZRdWFuVGFibGU1MTE7CisJdW5zaWduZWQgY2hhciB2YWwwLCB2YWwxOworCWludCBpLCByYywgcmVnID0gUjUxMV9DT01QX0xVVF9CRUdJTjsKKworCVBERUJVRyg0LCAiVXBsb2FkaW5nIHF1YW50aXphdGlvbiB0YWJsZXMiKTsKKworCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9RVUFOVEFCTEVTSVpFIC8gMjsgaSsrKSB7CisJCWlmIChFTkFCTEVfWV9RVUFOVEFCTEUpCXsKKwkJCXZhbDAgPSAqcFlUYWJsZSsrOworCQkJdmFsMSA9ICpwWVRhYmxlKys7CisJCQl2YWwwICY9IDB4MGY7CisJCQl2YWwxICY9IDB4MGY7CisJCQl2YWwwIHw9IHZhbDEgPDwgNDsKKwkJCXJjID0gcmVnX3cob3YsIHJlZywgdmFsMCk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCisJCWlmIChFTkFCTEVfVVZfUVVBTlRBQkxFKSB7CisJCQl2YWwwID0gKnBVVlRhYmxlKys7CisJCQl2YWwxID0gKnBVVlRhYmxlKys7CisJCQl2YWwwICY9IDB4MGY7CisJCQl2YWwxICY9IDB4MGY7CisJCQl2YWwwIHw9IHZhbDEgPDwgNDsKKwkJCXJjID0gcmVnX3cob3YsIHJlZyArIE9WNTExX1FVQU5UQUJMRVNJWkUvMiwgdmFsMCk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCisJCXJlZysrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBPVjUxOCBxdWFudGl6YXRpb24gdGFibGVzIGFyZSA4eDQgKGluc3RlYWQgb2YgOHg4KSAqLworc3RhdGljIGludAorb3Y1MThfdXBsb2FkX3F1YW5fdGFibGVzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCXVuc2lnbmVkIGNoYXIgKnBZVGFibGUgPSB5UXVhblRhYmxlNTE4OworCXVuc2lnbmVkIGNoYXIgKnBVVlRhYmxlID0gdXZRdWFuVGFibGU1MTg7CisJdW5zaWduZWQgY2hhciB2YWwwLCB2YWwxOworCWludCBpLCByYywgcmVnID0gUjUxMV9DT01QX0xVVF9CRUdJTjsKKworCVBERUJVRyg0LCAiVXBsb2FkaW5nIHF1YW50aXphdGlvbiB0YWJsZXMiKTsKKworCWZvciAoaSA9IDA7IGkgPCBPVjUxOF9RVUFOVEFCTEVTSVpFIC8gMjsgaSsrKSB7CisJCWlmIChFTkFCTEVfWV9RVUFOVEFCTEUpIHsKKwkJCXZhbDAgPSAqcFlUYWJsZSsrOworCQkJdmFsMSA9ICpwWVRhYmxlKys7CisJCQl2YWwwICY9IDB4MGY7CisJCQl2YWwxICY9IDB4MGY7CisJCQl2YWwwIHw9IHZhbDEgPDwgNDsKKwkJCXJjID0gcmVnX3cob3YsIHJlZywgdmFsMCk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCisJCWlmIChFTkFCTEVfVVZfUVVBTlRBQkxFKSB7CisJCQl2YWwwID0gKnBVVlRhYmxlKys7CisJCQl2YWwxID0gKnBVVlRhYmxlKys7CisJCQl2YWwwICY9IDB4MGY7CisJCQl2YWwxICY9IDB4MGY7CisJCQl2YWwwIHw9IHZhbDEgPDwgNDsKKwkJCXJjID0gcmVnX3cob3YsIHJlZyArIE9WNTE4X1FVQU5UQUJMRVNJWkUvMiwgdmFsMCk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCisJCXJlZysrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitvdjUxeF9yZXNldChzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciByZXNldF90eXBlKQoreworCWludCByYzsKKworCS8qIFNldHRpbmcgYml0IDAgbm90IGFsbG93ZWQgb24gNTE4LzUxOFBsdXMgKi8KKwlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpCisJCXJlc2V0X3R5cGUgJj0gMHhmZTsKKworCVBERUJVRyg0LCAiUmVzZXQ6IHR5cGU9MHglMDJYIiwgcmVzZXRfdHlwZSk7CisKKwlyYyA9IHJlZ193KG92LCBSNTF4X1NZU19SRVNFVCwgcmVzZXRfdHlwZSk7CisJcmMgPSByZWdfdyhvdiwgUjUxeF9TWVNfUkVTRVQsIDApOworCisJaWYgKHJjIDwgMCkKKwkJZXJyKCJyZXNldDogY29tbWFuZCBmYWlsZWQiKTsKKworCXJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBMb3ctbGV2ZWwgSTJDIEkvTyBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTk9URTogRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSEKKyAqIFRoZSBPVjUxOCBJMkMgSS9PIHByb2NlZHVyZSBpcyBkaWZmZXJlbnQsIGhlbmNlLCB0aGlzIGZ1bmN0aW9uLgorICogVGhpcyBpcyBub3JtYWxseSBvbmx5IGNhbGxlZCBmcm9tIGkyY193KCkuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCisgKiBhbHdheXMgc3VjY2VlZHMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzZW5zb3IgaXMgcHJlc2VudCBhbmQgd29ya2luZy4KKyAqLworc3RhdGljIGludAorb3Y1MThfaTJjX3dyaXRlX2ludGVybmFsKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LAorCQkJIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJaW50IHJjOworCisJUERFQlVHKDUsICIweCUwMlg6MHglMDJYIiwgcmVnLCB2YWx1ZSk7CisKKwkvKiBTZWxlY3QgY2FtZXJhIHJlZ2lzdGVyICovCisJcmMgPSByZWdfdyhvdiwgUjUxeF9JMkNfU0FERFJfMywgcmVnKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBXcml0ZSAidmFsdWUiIHRvIEkyQyBkYXRhIHBvcnQgb2YgT1Y1MTEgKi8KKwlyYyA9IHJlZ193KG92LCBSNTF4X0kyQ19EQVRBLCB2YWx1ZSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogSW5pdGlhdGUgMy1ieXRlIHdyaXRlIGN5Y2xlICovCisJcmMgPSByZWdfdyhvdiwgUjUxOF9JMkNfQ1RMLCAweDAxKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworLyogTk9URTogRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSEgKi8KK3N0YXRpYyBpbnQKK292NTExX2kyY193cml0ZV9pbnRlcm5hbChzdHJ1Y3QgdXNiX292NTExICpvdiwKKwkJCSB1bnNpZ25lZCBjaGFyIHJlZywKKwkJCSB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCWludCByYywgcmV0cmllczsKKworCVBERUJVRyg1LCAiMHglMDJYOjB4JTAyWCIsIHJlZywgdmFsdWUpOworCisJLyogVGhyZWUgYnl0ZSB3cml0ZSBjeWNsZSAqLworCWZvciAocmV0cmllcyA9IE9WNTExX0kyQ19SRVRSSUVTOyA7ICkgeworCQkvKiBTZWxlY3QgY2FtZXJhIHJlZ2lzdGVyICovCisJCXJjID0gcmVnX3cob3YsIFI1MXhfSTJDX1NBRERSXzMsIHJlZyk7CisJCWlmIChyYyA8IDApCisJCQlicmVhazsKKworCQkvKiBXcml0ZSAidmFsdWUiIHRvIEkyQyBkYXRhIHBvcnQgb2YgT1Y1MTEgKi8KKwkJcmMgPSByZWdfdyhvdiwgUjUxeF9JMkNfREFUQSwgdmFsdWUpOworCQlpZiAocmMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogSW5pdGlhdGUgMy1ieXRlIHdyaXRlIGN5Y2xlICovCisJCXJjID0gcmVnX3cob3YsIFI1MTFfSTJDX0NUTCwgMHgwMSk7CisJCWlmIChyYyA8IDApCisJCQlicmVhazsKKworCQkvKiBSZXRyeSB1bnRpbCBpZGxlICovCisJCWRvCisJCQlyYyA9IHJlZ19yKG92LCBSNTExX0kyQ19DVEwpOworCQl3aGlsZSAocmMgPiAwICYmICgocmMmMSkgPT0gMCkpOyAKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCisJCS8qIEFjaz8gKi8KKwkJaWYgKChyYyYyKSA9PSAwKSB7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorI2lmIDAKKwkJLyogSTJDIGFib3J0ICovCisJCXJlZ193KG92LCBSNTExX0kyQ19DVEwsIDB4MTApOworI2VuZGlmCisJCWlmICgtLXJldHJpZXMgPCAwKSB7CisJCQllcnIoImkyYyB3cml0ZSByZXRyaWVzIGV4aGF1c3RlZCIpOworCQkJcmMgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBOT1RFOiBEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IQorICogVGhlIE9WNTE4IEkyQyBJL08gcHJvY2VkdXJlIGlzIGRpZmZlcmVudCwgaGVuY2UsIHRoaXMgZnVuY3Rpb24uCisgKiBUaGlzIGlzIG5vcm1hbGx5IG9ubHkgY2FsbGVkIGZyb20gaTJjX3IoKS4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24KKyAqIGFsd2F5cyBzdWNjZWVkcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHNlbnNvciBpcyBwcmVzZW50IGFuZCB3b3JraW5nLgorICovCitzdGF0aWMgaW50CitvdjUxOF9pMmNfcmVhZF9pbnRlcm5hbChzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciByZWcpCit7CisJaW50IHJjLCB2YWx1ZTsKKworCS8qIFNlbGVjdCBjYW1lcmEgcmVnaXN0ZXIgKi8KKwlyYyA9IHJlZ193KG92LCBSNTF4X0kyQ19TQUREUl8yLCByZWcpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIEluaXRpYXRlIDItYnl0ZSB3cml0ZSBjeWNsZSAqLworCXJjID0gcmVnX3cob3YsIFI1MThfSTJDX0NUTCwgMHgwMyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogSW5pdGlhdGUgMi1ieXRlIHJlYWQgY3ljbGUgKi8KKwlyYyA9IHJlZ193KG92LCBSNTE4X0kyQ19DVEwsIDB4MDUpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXZhbHVlID0gcmVnX3Iob3YsIFI1MXhfSTJDX0RBVEEpOworCisJUERFQlVHKDUsICIweCUwMlg6MHglMDJYIiwgcmVnLCB2YWx1ZSk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qIE5PVEU6IERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkhCisgKiByZXR1cm5zOiBuZWdhdGl2ZSBpcyBlcnJvciwgcG9zIG9yIHplcm8gaXMgZGF0YSAqLworc3RhdGljIGludAorb3Y1MTFfaTJjX3JlYWRfaW50ZXJuYWwoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgcmVnKQoreworCWludCByYywgdmFsdWUsIHJldHJpZXM7CisKKwkvKiBUd28gYnl0ZSB3cml0ZSBjeWNsZSAqLworCWZvciAocmV0cmllcyA9IE9WNTExX0kyQ19SRVRSSUVTOyA7ICkgeworCQkvKiBTZWxlY3QgY2FtZXJhIHJlZ2lzdGVyICovCisJCXJjID0gcmVnX3cob3YsIFI1MXhfSTJDX1NBRERSXzIsIHJlZyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJLyogSW5pdGlhdGUgMi1ieXRlIHdyaXRlIGN5Y2xlICovCisJCXJjID0gcmVnX3cob3YsIFI1MTFfSTJDX0NUTCwgMHgwMyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJLyogUmV0cnkgdW50aWwgaWRsZSAqLworCQlkbworCQkJIHJjID0gcmVnX3Iob3YsIFI1MTFfSTJDX0NUTCk7CisJCXdoaWxlIChyYyA+IDAgJiYgKChyYyYxKSA9PSAwKSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJaWYgKChyYyYyKSA9PSAwKSAvKiBBY2s/ICovCisJCQlicmVhazsKKworCQkvKiBJMkMgYWJvcnQgKi8KKwkJcmVnX3cob3YsIFI1MTFfSTJDX0NUTCwgMHgxMCk7CisKKwkJaWYgKC0tcmV0cmllcyA8IDApIHsKKwkJCWVycigiaTJjIHdyaXRlIHJldHJpZXMgZXhoYXVzdGVkIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiBUd28gYnl0ZSByZWFkIGN5Y2xlICovCisJZm9yIChyZXRyaWVzID0gT1Y1MTFfSTJDX1JFVFJJRVM7IDsgKSB7CisJCS8qIEluaXRpYXRlIDItYnl0ZSByZWFkIGN5Y2xlICovCisJCXJjID0gcmVnX3cob3YsIFI1MTFfSTJDX0NUTCwgMHgwNSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJLyogUmV0cnkgdW50aWwgaWRsZSAqLworCQlkbworCQkJcmMgPSByZWdfcihvdiwgUjUxMV9JMkNfQ1RMKTsKKwkJd2hpbGUgKHJjID4gMCAmJiAoKHJjJjEpID09IDApKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlpZiAoKHJjJjIpID09IDApIC8qIEFjaz8gKi8KKwkJCWJyZWFrOworCisJCS8qIEkyQyBhYm9ydCAqLworCQlyYyA9IHJlZ193KG92LCBSNTExX0kyQ19DVEwsIDB4MTApOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCWlmICgtLXJldHJpZXMgPCAwKSB7CisJCQllcnIoImkyYyByZWFkIHJldHJpZXMgZXhoYXVzdGVkIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl2YWx1ZSA9IHJlZ19yKG92LCBSNTF4X0kyQ19EQVRBKTsKKworCVBERUJVRyg1LCAiMHglMDJYOjB4JTAyWCIsIHJlZywgdmFsdWUpOworCisJLyogVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBpMmNfdygpIHdvcmsgKi8KKwlyYyA9IHJlZ193KG92LCBSNTExX0kyQ19DVEwsIDB4MDUpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiB2YWx1ZTsKK30KKworLyogcmV0dXJuczogbmVnYXRpdmUgaXMgZXJyb3IsIHBvcyBvciB6ZXJvIGlzIGRhdGEgKi8KK3N0YXRpYyBpbnQKK2kyY19yKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlpbnQgcmM7CisKKwlkb3duKCZvdi0+aTJjX2xvY2spOworCisJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQorCQlyYyA9IG92NTE4X2kyY19yZWFkX2ludGVybmFsKG92LCByZWcpOworCWVsc2UKKwkJcmMgPSBvdjUxMV9pMmNfcmVhZF9pbnRlcm5hbChvdiwgcmVnKTsKKworCXVwKCZvdi0+aTJjX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitpMmNfdyhzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJaW50IHJjOworCisJZG93bigmb3YtPmkyY19sb2NrKTsKKworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKKwkJcmMgPSBvdjUxOF9pMmNfd3JpdGVfaW50ZXJuYWwob3YsIHJlZywgdmFsdWUpOworCWVsc2UKKwkJcmMgPSBvdjUxMV9pMmNfd3JpdGVfaW50ZXJuYWwob3YsIHJlZywgdmFsdWUpOworCisJdXAoJm92LT5pMmNfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkhICovCitzdGF0aWMgaW50CitvdjUxeF9pMmNfd3JpdGVfbWFza19pbnRlcm5hbChzdHJ1Y3QgdXNiX292NTExICpvdiwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJICAgICAgdW5zaWduZWQgY2hhciB2YWx1ZSwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgbWFzaykKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgY2hhciBvbGR2YWwsIG5ld3ZhbDsKKworCWlmIChtYXNrID09IDB4ZmYpIHsKKwkJbmV3dmFsID0gdmFsdWU7CisJfSBlbHNlIHsKKwkJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQorCQkJcmMgPSBvdjUxOF9pMmNfcmVhZF9pbnRlcm5hbChvdiwgcmVnKTsKKwkJZWxzZQorCQkJcmMgPSBvdjUxMV9pMmNfcmVhZF9pbnRlcm5hbChvdiwgcmVnKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlvbGR2YWwgPSAodW5zaWduZWQgY2hhcikgcmM7CisJCW9sZHZhbCAmPSAofm1hc2spOwkJLyogQ2xlYXIgdGhlIG1hc2tlZCBiaXRzICovCisJCXZhbHVlICY9IG1hc2s7CQkJLyogRW5mb3JjZSBtYXNrIG9uIHZhbHVlICovCisJCW5ld3ZhbCA9IG9sZHZhbCB8IHZhbHVlOwkvKiBTZXQgdGhlIGRlc2lyZWQgYml0cyAqLworCX0KKworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKKwkJcmV0dXJuIChvdjUxOF9pMmNfd3JpdGVfaW50ZXJuYWwob3YsIHJlZywgbmV3dmFsKSk7CisJZWxzZQorCQlyZXR1cm4gKG92NTExX2kyY193cml0ZV9pbnRlcm5hbChvdiwgcmVnLCBuZXd2YWwpKTsKK30KKworLyogV3JpdGVzIGJpdHMgYXQgcG9zaXRpb25zIHNwZWNpZmllZCBieSBtYXNrIHRvIGFuIEkyQyByZWcuIEJpdHMgdGhhdCBhcmUgaW4KKyAqIHRoZSBzYW1lIHBvc2l0aW9uIGFzIDEncyBpbiAibWFzayIgYXJlIGNsZWFyZWQgYW5kIHNldCB0byAidmFsdWUiLiBCaXRzCisgKiB0aGF0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvbiBhcyAwJ3MgaW4gIm1hc2siIGFyZSBwcmVzZXJ2ZWQsIHJlZ2FyZGxlc3MKKyAqIG9mIHRoZWlyIHJlc3BlY3RpdmUgc3RhdGUgaW4gInZhbHVlIi4KKyAqLworc3RhdGljIGludAoraTJjX3dfbWFzayhzdHJ1Y3QgdXNiX292NTExICpvdiwKKwkgICB1bnNpZ25lZCBjaGFyIHJlZywKKwkgICB1bnNpZ25lZCBjaGFyIHZhbHVlLAorCSAgIHVuc2lnbmVkIGNoYXIgbWFzaykKK3sKKwlpbnQgcmM7CisKKwlkb3duKCZvdi0+aTJjX2xvY2spOworCXJjID0gb3Y1MXhfaTJjX3dyaXRlX21hc2tfaW50ZXJuYWwob3YsIHJlZywgdmFsdWUsIG1hc2spOworCXVwKCZvdi0+aTJjX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCisvKiBTZXQgdGhlIHJlYWQgYW5kIHdyaXRlIHNsYXZlIElEcy4gVGhlICJzbGF2ZSIgYXJndW1lbnQgaXMgdGhlIHdyaXRlIHNsYXZlLAorICogYW5kIHRoZSByZWFkIHNsYXZlIHdpbGwgYmUgc2V0IHRvIChzbGF2ZSArIDEpLiBvdi0+aTJjX2xvY2sgc2hvdWxkIGJlIGhlbGQKKyAqIHdoZW4gY2FsbGluZyB0aGlzLiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gb3V0c2lkZSB0aGUgaTJjIEkvTworICogZnVuY3Rpb25zLgorICovCitzdGF0aWMgaW50CitpMmNfc2V0X3NsYXZlX2ludGVybmFsKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHNsYXZlKQoreworCWludCByYzsKKworCXJjID0gcmVnX3cob3YsIFI1MXhfSTJDX1dfU0lELCBzbGF2ZSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmMgPSByZWdfdyhvdiwgUjUxeF9JMkNfUl9TSUQsIHNsYXZlICsgMSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIHRvIGEgc3BlY2lmaWMgSTJDIHNsYXZlIElEIGFuZCByZWdpc3RlciwgdXNpbmcgdGhlIHNwZWNpZmllZCBtYXNrICovCitzdGF0aWMgaW50CitpMmNfd19zbGF2ZShzdHJ1Y3QgdXNiX292NTExICpvdiwKKwkgICAgdW5zaWduZWQgY2hhciBzbGF2ZSwKKwkgICAgdW5zaWduZWQgY2hhciByZWcsCisJICAgIHVuc2lnbmVkIGNoYXIgdmFsdWUsCisJICAgIHVuc2lnbmVkIGNoYXIgbWFzaykKK3sKKwlpbnQgcmMgPSAwOworCisJZG93bigmb3YtPmkyY19sb2NrKTsKKworCS8qIFNldCBuZXcgc2xhdmUgSURzICovCisJcmMgPSBpMmNfc2V0X3NsYXZlX2ludGVybmFsKG92LCBzbGF2ZSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IG92NTF4X2kyY193cml0ZV9tYXNrX2ludGVybmFsKG92LCByZWcsIHZhbHVlLCBtYXNrKTsKKworb3V0OgorCS8qIFJlc3RvcmUgcHJpbWFyeSBJRHMgKi8KKwlpZiAoaTJjX3NldF9zbGF2ZV9pbnRlcm5hbChvdiwgb3YtPnByaW1hcnlfaTJjX3NsYXZlKSA8IDApCisJCWVycigiQ291bGRuJ3QgcmVzdG9yZSBwcmltYXJ5IEkyQyBzbGF2ZSIpOworCisJdXAoJm92LT5pMmNfbG9jayk7CisJcmV0dXJuIHJjOworfQorCisvKiBSZWFkIGZyb20gYSBzcGVjaWZpYyBJMkMgc2xhdmUgSUQgYW5kIHJlZ2lzdGVyICovCitzdGF0aWMgaW50CitpMmNfcl9zbGF2ZShzdHJ1Y3QgdXNiX292NTExICpvdiwKKwkgICAgdW5zaWduZWQgY2hhciBzbGF2ZSwKKwkgICAgdW5zaWduZWQgY2hhciByZWcpCit7CisJaW50IHJjOworCisJZG93bigmb3YtPmkyY19sb2NrKTsKKworCS8qIFNldCBuZXcgc2xhdmUgSURzICovCisJcmMgPSBpMmNfc2V0X3NsYXZlX2ludGVybmFsKG92LCBzbGF2ZSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpCisJCXJjID0gb3Y1MThfaTJjX3JlYWRfaW50ZXJuYWwob3YsIHJlZyk7CisJZWxzZQorCQlyYyA9IG92NTExX2kyY19yZWFkX2ludGVybmFsKG92LCByZWcpOworCitvdXQ6CisJLyogUmVzdG9yZSBwcmltYXJ5IElEcyAqLworCWlmIChpMmNfc2V0X3NsYXZlX2ludGVybmFsKG92LCBvdi0+cHJpbWFyeV9pMmNfc2xhdmUpIDwgMCkKKwkJZXJyKCJDb3VsZG4ndCByZXN0b3JlIHByaW1hcnkgSTJDIHNsYXZlIik7CisKKwl1cCgmb3YtPmkyY19sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNldHMgSTJDIHJlYWQgYW5kIHdyaXRlIHNsYXZlIElEcy4gUmV0dXJucyA8MCBmb3IgZXJyb3IgKi8KK3N0YXRpYyBpbnQKK292NTF4X3NldF9zbGF2ZV9pZHMoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgc2lkKQoreworCWludCByYzsKKworCWRvd24oJm92LT5pMmNfbG9jayk7CisKKwlyYyA9IGkyY19zZXRfc2xhdmVfaW50ZXJuYWwob3YsIHNpZCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvLyBGSVhNRTogSXMgdGhpcyBhY3R1YWxseSBuZWNlc3Nhcnk/CisJcmMgPSBvdjUxeF9yZXNldChvdiwgT1Y1MTFfUkVTRVRfTk9SRUdTKTsKK291dDoKKwl1cCgmb3YtPmkyY19sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK3dyaXRlX3JlZ3ZhbHMoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHN0cnVjdCBvdjUxMV9yZWd2YWxzICogcFJlZ3ZhbHMpCit7CisJaW50IHJjOworCisJd2hpbGUgKHBSZWd2YWxzLT5idXMgIT0gT1Y1MTFfRE9ORV9CVVMpIHsKKwkJaWYgKHBSZWd2YWxzLT5idXMgPT0gT1Y1MTFfUkVHX0JVUykgeworCQkJaWYgKChyYyA9IHJlZ193KG92LCBwUmVndmFscy0+cmVnLCBwUmVndmFscy0+dmFsKSkgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfSBlbHNlIGlmIChwUmVndmFscy0+YnVzID09IE9WNTExX0kyQ19CVVMpIHsKKwkJCWlmICgocmMgPSBpMmNfdyhvdiwgcFJlZ3ZhbHMtPnJlZywgcFJlZ3ZhbHMtPnZhbCkpIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCX0gZWxzZSB7CisJCQllcnIoIkJhZCByZWd2YWwgYXJyYXkiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlwUmVndmFscysrOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE9WNTExX0RFQlVHCitzdGF0aWMgdm9pZAorZHVtcF9pMmNfcmFuZ2Uoc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCByZWcxLCBpbnQgcmVnbikKK3sKKwlpbnQgaSwgcmM7CisKKwlmb3IgKGkgPSByZWcxOyBpIDw9IHJlZ247IGkrKykgeworCQlyYyA9IGkyY19yKG92LCBpKTsKKwkJaW5mbygiU2Vuc29yWzB4JTAyWF0gPSAweCUwMlgiLCBpLCByYyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorZHVtcF9pMmNfcmVncyhzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbmZvKCJJMkMgUkVHUyIpOworCWR1bXBfaTJjX3JhbmdlKG92LCAweDAwLCAweDdDKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfcmVnX3JhbmdlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgcmVnMSwgaW50IHJlZ24pCit7CisJaW50IGksIHJjOworCisJZm9yIChpID0gcmVnMTsgaSA8PSByZWduOyBpKyspIHsKKwkJcmMgPSByZWdfcihvdiwgaSk7CisJCWluZm8oIk9WNTExWzB4JTAyWF0gPSAweCUwMlgiLCBpLCByYyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorb3Y1MTFfZHVtcF9yZWdzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWluZm8oIkNBTUVSQSBJTlRFUkZBQ0UgUkVHUyIpOworCWR1bXBfcmVnX3JhbmdlKG92LCAweDEwLCAweDFmKTsKKwlpbmZvKCJEUkFNIElOVEVSRkFDRSBSRUdTIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4MjAsIDB4MjMpOworCWluZm8oIklTTyBGSUZPIFJFR1MiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHgzMCwgMHgzMSk7CisJaW5mbygiUElPIFJFR1MiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHgzOCwgMHgzOSk7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4M2UsIDB4M2UpOworCWluZm8oIkkyQyBSRUdTIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4NDAsIDB4NDkpOworCWluZm8oIlNZU1RFTSBDT05UUk9MIFJFR1MiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHg1MCwgMHg1NSk7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4NWUsIDB4NWYpOworCWluZm8oIk9tbmlDRSBSRUdTIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4NzAsIDB4NzkpOworCS8qIE5PVEU6IFF1YW50aXphdGlvbiB0YWJsZXMgYXJlIG5vdCByZWFkYWJsZS4gWW91IHdpbGwgZ2V0IHRoZSB2YWx1ZQorCSAqIGluIHJlZy4gMHg3OSBmb3IgZXZlcnkgdGFibGUgcmVnaXN0ZXIgKi8KKwlkdW1wX3JlZ19yYW5nZShvdiwgMHg4MCwgMHg5Zik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4YTAsIDB4YmYpOworCit9CisKK3N0YXRpYyB2b2lkCitvdjUxOF9kdW1wX3JlZ3Moc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW5mbygiVklERU8gTU9ERSBSRUdTIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4MjAsIDB4MmYpOworCWluZm8oIkRBVEEgUFVNUCBBTkQgU05BUFNIT1QgUkVHUyIpOworCWR1bXBfcmVnX3JhbmdlKG92LCAweDMwLCAweDNmKTsKKwlpbmZvKCJJMkMgUkVHUyIpOworCWR1bXBfcmVnX3JhbmdlKG92LCAweDQwLCAweDRmKTsKKwlpbmZvKCJTWVNURU0gQ09OVFJPTCBBTkQgVkVORE9SIFJFR1MiKTsKKwlkdW1wX3JlZ19yYW5nZShvdiwgMHg1MCwgMHg1Zik7CisJaW5mbygiNjAgLSA2RiIpOworCWR1bXBfcmVnX3JhbmdlKG92LCAweDYwLCAweDZmKTsKKwlpbmZvKCI3MCAtIDdGIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4NzAsIDB4N2YpOworCWluZm8oIlkgUVVBTlRJWkFUSU9OIFRBQkxFIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4ODAsIDB4OGYpOworCWluZm8oIlVWIFFVQU5USVpBVElPTiBUQUJMRSIpOworCWR1bXBfcmVnX3JhbmdlKG92LCAweDkwLCAweDlmKTsKKwlpbmZvKCJBMCAtIEJGIik7CisJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4YTAsIDB4YmYpOworCWluZm8oIkNCUiIpOworCWR1bXBfcmVnX3JhbmdlKG92LCAweGMwLCAweGNmKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRlbXBvcmFyaWx5IHN0b3BzIE9WNTExIGZyb20gZnVuY3Rpb25pbmcuIE11c3QgZG8gdGhpcyBiZWZvcmUgY2hhbmdpbmcKKyAqIHJlZ2lzdGVycyB3aGlsZSB0aGUgY2FtZXJhIGlzIHN0cmVhbWluZyAqLworc3RhdGljIGlubGluZSBpbnQKK292NTF4X3N0b3Aoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJUERFQlVHKDQsICJzdG9wcGluZyIpOworCW92LT5zdG9wcGVkID0gMTsKKwlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpCisJCXJldHVybiAocmVnX3dfbWFzayhvdiwgUjUxeF9TWVNfUkVTRVQsIDB4M2EsIDB4M2EpKTsKKwllbHNlCisJCXJldHVybiAocmVnX3cob3YsIFI1MXhfU1lTX1JFU0VULCAweDNkKSk7Cit9CisKKy8qIFJlc3RhcnRzIE9WNTExIGFmdGVyIG92NTExX3N0b3AoKSBpcyBjYWxsZWQuIEhhcyBubyBlZmZlY3QgaWYgaXQgaXMgbm90CisgKiBhY3R1YWxseSBzdG9wcGVkIChmb3IgcGVyZm9ybWFuY2UpLiAqLworc3RhdGljIGlubGluZSBpbnQKK292NTF4X3Jlc3RhcnQoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaWYgKG92LT5zdG9wcGVkKSB7CisJCVBERUJVRyg0LCAicmVzdGFydGluZyIpOworCQlvdi0+c3RvcHBlZCA9IDA7CisKKwkJLyogUmVpbml0aWFsaXplIHRoZSBzdHJlYW0gKi8KKwkJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTE4KQorCQkJcmVnX3cob3YsIDB4MmYsIDB4ODApOworCisJCXJldHVybiAocmVnX3cob3YsIFI1MXhfU1lTX1JFU0VULCAweDAwKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFNsZWVwcyB1bnRpbCBubyBmcmFtZXMgYXJlIGFjdGl2ZS4gUmV0dXJucyAhMCBpZiBnb3Qgc2lnbmFsICovCitzdGF0aWMgaW50CitvdjUxeF93YWl0X2ZyYW1lc19pbmFjdGl2ZShzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlyZXR1cm4gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKG92LT53cSwgb3YtPmN1cmZyYW1lIDwgMCk7Cit9CisKKy8qIFJlc2V0cyB0aGUgaGFyZHdhcmUgc25hcHNob3QgYnV0dG9uICovCitzdGF0aWMgdm9pZAorb3Y1MXhfY2xlYXJfc25hcHNob3Qoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTExKSB7CisJCXJlZ193KG92LCBSNTF4X1NZU19TTkFQLCAweDAwKTsKKwkJcmVnX3cob3YsIFI1MXhfU1lTX1NOQVAsIDB4MDIpOworCQlyZWdfdyhvdiwgUjUxeF9TWVNfU05BUCwgMHgwMCk7CisJfSBlbHNlIGlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgeworCQl3YXJuKCJzbmFwc2hvdCByZXNldCBub3Qgc3VwcG9ydGVkIHlldCBvbiBPVjUxOCgrKSIpOworCX0gZWxzZSB7CisJCWVycigiY2xlYXIgc25hcDogaW52YWxpZCBicmlkZ2UgdHlwZSIpOworCX0KK30KKworI2lmIDAKKy8qIENoZWNrcyB0aGUgc3RhdHVzIG9mIHRoZSBzbmFwc2hvdCBidXR0b24uIFJldHVybnMgMSBpZiBpdCB3YXMgcHJlc3NlZCBzaW5jZQorICogaXQgd2FzIGxhc3QgY2xlYXJlZCwgYW5kIHplcm8gaW4gYWxsIG90aGVyIGNhc2VzIChpbmNsdWRpbmcgZXJyb3JzKSAqLworc3RhdGljIGludAorb3Y1MXhfY2hlY2tfc25hcHNob3Qoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW50IHJldCwgc3RhdHVzID0gMDsKKworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxMSkgeworCQlyZXQgPSByZWdfcihvdiwgUjUxeF9TWVNfU05BUCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllcnIoIkVycm9yIGNoZWNraW5nIHNuc3BzaG90IHN0YXR1cyAoJWQpIiwgcmV0KTsKKwkJfSBlbHNlIGlmIChyZXQgJiAweDA4KSB7CisJCQlzdGF0dXMgPSAxOworCQl9CisJfSBlbHNlIGlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgeworCQl3YXJuKCJzbmFwc2hvdCBjaGVjayBub3Qgc3VwcG9ydGVkIHlldCBvbiBPVjUxOCgrKSIpOworCX0gZWxzZSB7CisJCWVycigiY2hlY2sgc25hcDogaW52YWxpZCBicmlkZ2UgdHlwZSIpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworLyogVGhpcyBkb2VzIGFuIGluaXRpYWwgcmVzZXQgb2YgYW4gT21uaVZpc2lvbiBzZW5zb3IgYW5kIGVuc3VyZXMgdGhhdCBJMkMKKyAqIGlzIHN5bmNocm9uaXplZC4gUmV0dXJucyA8MCBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludAoraW5pdF9vdl9zZW5zb3Ioc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW50IGksIHN1Y2Nlc3M7CisKKwkvKiBSZXNldCB0aGUgc2Vuc29yICovCisJaWYgKGkyY193KG92LCAweDEyLCAweDgwKSA8IDApCisJCXJldHVybiAtRUlPOworCisJLyogV2FpdCBmb3IgaXQgdG8gaW5pdGlhbGl6ZSAqLworCW1zbGVlcCgxNTApOworCisJZm9yIChpID0gMCwgc3VjY2VzcyA9IDA7IGkgPCBpMmNfZGV0ZWN0X3RyaWVzICYmICFzdWNjZXNzOyBpKyspIHsKKwkJaWYgKChpMmNfcihvdiwgT1Y3NjEwX1JFR19JRF9ISUdIKSA9PSAweDdGKSAmJgorCQkgICAgKGkyY19yKG92LCBPVjc2MTBfUkVHX0lEX0xPVykgPT0gMHhBMikpIHsKKwkJCXN1Y2Nlc3MgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBSZXNldCB0aGUgc2Vuc29yICovCisJCWlmIChpMmNfdyhvdiwgMHgxMiwgMHg4MCkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCS8qIFdhaXQgZm9yIGl0IHRvIGluaXRpYWxpemUgKi8KKwkJbXNsZWVwKDE1MCk7CisJCS8qIER1bW15IHJlYWQgdG8gc3luYyBJMkMgKi8KKwkJaWYgKGkyY19yKG92LCAweDAwKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIXN1Y2Nlc3MpCisJCXJldHVybiAtRUlPOworCisJUERFQlVHKDEsICJJMkMgc3luY2VkIGluICVkIGF0dGVtcHQocykiLCBpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitvdjUxMV9zZXRfcGFja2V0X3NpemUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBzaXplKQoreworCWludCBhbHQsIG11bHQ7CisKKwlpZiAob3Y1MXhfc3RvcChvdikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCW11bHQgPSBzaXplID4+IDU7CisKKwlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTEpIHsKKwkJaWYgKHNpemUgPT0gMCkKKwkJCWFsdCA9IE9WNTExX0FMVF9TSVpFXzA7CisJCWVsc2UgaWYgKHNpemUgPT0gMjU3KQorCQkJYWx0ID0gT1Y1MTFfQUxUX1NJWkVfMjU3OworCQllbHNlIGlmIChzaXplID09IDUxMykKKwkJCWFsdCA9IE9WNTExX0FMVF9TSVpFXzUxMzsKKwkJZWxzZSBpZiAoc2l6ZSA9PSA3NjkpCisJCQlhbHQgPSBPVjUxMV9BTFRfU0laRV83Njk7CisJCWVsc2UgaWYgKHNpemUgPT0gOTkzKQorCQkJYWx0ID0gT1Y1MTFfQUxUX1NJWkVfOTkzOworCQllbHNlIHsKKwkJCWVycigiU2V0IHBhY2tldCBzaXplOiBpbnZhbGlkIHNpemUgKCVkKSIsIHNpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKG92LT5icmlkZ2UgPT0gQlJHX09WNTExUExVUykgeworCQlpZiAoc2l6ZSA9PSAwKQorCQkJYWx0ID0gT1Y1MTFQTFVTX0FMVF9TSVpFXzA7CisJCWVsc2UgaWYgKHNpemUgPT0gMzMpCisJCQlhbHQgPSBPVjUxMVBMVVNfQUxUX1NJWkVfMzM7CisJCWVsc2UgaWYgKHNpemUgPT0gMTI5KQorCQkJYWx0ID0gT1Y1MTFQTFVTX0FMVF9TSVpFXzEyOTsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAyNTcpCisJCQlhbHQgPSBPVjUxMVBMVVNfQUxUX1NJWkVfMjU3OworCQllbHNlIGlmIChzaXplID09IDM4NSkKKwkJCWFsdCA9IE9WNTExUExVU19BTFRfU0laRV8zODU7CisJCWVsc2UgaWYgKHNpemUgPT0gNTEzKQorCQkJYWx0ID0gT1Y1MTFQTFVTX0FMVF9TSVpFXzUxMzsKKwkJZWxzZSBpZiAoc2l6ZSA9PSA3NjkpCisJCQlhbHQgPSBPVjUxMVBMVVNfQUxUX1NJWkVfNzY5OworCQllbHNlIGlmIChzaXplID09IDk2MSkKKwkJCWFsdCA9IE9WNTExUExVU19BTFRfU0laRV85NjE7CisJCWVsc2UgeworCQkJZXJyKCJTZXQgcGFja2V0IHNpemU6IGludmFsaWQgc2l6ZSAoJWQpIiwgc2l6ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCWVycigiU2V0IHBhY2tldCBzaXplOiBJbnZhbGlkIGJyaWRnZSB0eXBlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCVBERUJVRygzLCAiJWQsIG11bHQ9JWQsIGFsdD0lZCIsIHNpemUsIG11bHQsIGFsdCk7CisKKwlpZiAocmVnX3cob3YsIFI1MXhfRklGT19QU0laRSwgbXVsdCkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShvdi0+ZGV2LCBvdi0+aWZhY2UsIGFsdCkgPCAwKSB7CisJCWVycigiU2V0IHBhY2tldCBzaXplOiBzZXQgaW50ZXJmYWNlIGVycm9yIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKG92NTF4X3Jlc2V0KG92LCBPVjUxMV9SRVNFVF9OT1JFR1MpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlvdi0+cGFja2V0X3NpemUgPSBzaXplOworCisJaWYgKG92NTF4X3Jlc3RhcnQob3YpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworLyogTm90ZTogVW5saWtlIHRoZSBPVjUxMS9PVjUxMSssIHRoZSBzaXplIGFyZ3VtZW50IGRvZXMgTk9UIGluY2x1ZGUgdGhlCisgKiBvcHRpb25hbCBwYWNrZXQgbnVtYmVyIGJ5dGUuIFRoZSBhY3R1YWwgc2l6ZSAqaXMqIHN0b3JlZCBpbiBvdi0+cGFja2V0X3NpemUsCisgKiB0aG91Z2guICovCitzdGF0aWMgaW50CitvdjUxOF9zZXRfcGFja2V0X3NpemUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBzaXplKQoreworCWludCBhbHQ7CisKKwlpZiAob3Y1MXhfc3RvcChvdikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgeworCQlpZiAoc2l6ZSA9PSAwKQorCQkJYWx0ID0gT1Y1MThfQUxUX1NJWkVfMDsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAxMjgpCisJCQlhbHQgPSBPVjUxOF9BTFRfU0laRV8xMjg7CisJCWVsc2UgaWYgKHNpemUgPT0gMjU2KQorCQkJYWx0ID0gT1Y1MThfQUxUX1NJWkVfMjU2OworCQllbHNlIGlmIChzaXplID09IDM4NCkKKwkJCWFsdCA9IE9WNTE4X0FMVF9TSVpFXzM4NDsKKwkJZWxzZSBpZiAoc2l6ZSA9PSA1MTIpCisJCQlhbHQgPSBPVjUxOF9BTFRfU0laRV81MTI7CisJCWVsc2UgaWYgKHNpemUgPT0gNjQwKQorCQkJYWx0ID0gT1Y1MThfQUxUX1NJWkVfNjQwOworCQllbHNlIGlmIChzaXplID09IDc2OCkKKwkJCWFsdCA9IE9WNTE4X0FMVF9TSVpFXzc2ODsKKwkJZWxzZSBpZiAoc2l6ZSA9PSA4OTYpCisJCQlhbHQgPSBPVjUxOF9BTFRfU0laRV84OTY7CisJCWVsc2UgeworCQkJZXJyKCJTZXQgcGFja2V0IHNpemU6IGludmFsaWQgc2l6ZSAoJWQpIiwgc2l6ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCWVycigiU2V0IHBhY2tldCBzaXplOiBJbnZhbGlkIGJyaWRnZSB0eXBlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCVBERUJVRygzLCAiJWQsIGFsdD0lZCIsIHNpemUsIGFsdCk7CisKKwlvdi0+cGFja2V0X3NpemUgPSBzaXplOworCWlmIChzaXplID4gMCkgeworCQkvKiBQcm9ncmFtIElTTyBGSUZPIHNpemUgcmVnIChwYWNrZXQgbnVtYmVyIGlzbid0IGluY2x1ZGVkKSAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweDMwLCBzaXplLCAyKTsKKworCQlpZiAob3YtPnBhY2tldF9udW1iZXJpbmcpCisJCQkrK292LT5wYWNrZXRfc2l6ZTsKKwl9CisKKwlpZiAodXNiX3NldF9pbnRlcmZhY2Uob3YtPmRldiwgb3YtPmlmYWNlLCBhbHQpIDwgMCkgeworCQllcnIoIlNldCBwYWNrZXQgc2l6ZTogc2V0IGludGVyZmFjZSBlcnJvciIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHN0cmVhbSAqLworCWlmIChyZWdfdyhvdiwgMHgyZiwgMHg4MCkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKG92NTF4X3Jlc2V0KG92LCBPVjUxMV9SRVNFVF9OT1JFR1MpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworLyogVXBsb2FkIGNvbXByZXNzaW9uIHBhcmFtcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcy4gUmV0dXJucyAwIGZvciBzdWNjZXNzLiAqLworc3RhdGljIGludAorb3Y1MTFfaW5pdF9jb21wcmVzc2lvbihzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCFvdi0+Y29tcHJlc3NfaW5pdGVkKSB7CisJCXJlZ193KG92LCAweDcwLCBwaHkpOworCQlyZWdfdyhvdiwgMHg3MSwgcGh1dik7CisJCXJlZ193KG92LCAweDcyLCBwdnkpOworCQlyZWdfdyhvdiwgMHg3MywgcHZ1dik7CisJCXJlZ193KG92LCAweDc0LCBxaHkpOworCQlyZWdfdyhvdiwgMHg3NSwgcWh1dik7CisJCXJlZ193KG92LCAweDc2LCBxdnkpOworCQlyZWdfdyhvdiwgMHg3NywgcXZ1dik7CisKKwkJaWYgKG92NTExX3VwbG9hZF9xdWFuX3RhYmxlcyhvdikgPCAwKSB7CisJCQllcnIoIkVycm9yIHVwbG9hZGluZyBxdWFudGl6YXRpb24gdGFibGVzIik7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCW92LT5jb21wcmVzc19pbml0ZWQgPSAxOworb3V0OgorCXJldHVybiByYzsKK30KKworLyogVXBsb2FkIGNvbXByZXNzaW9uIHBhcmFtcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcy4gUmV0dXJucyAwIGZvciBzdWNjZXNzLiAqLworc3RhdGljIGludAorb3Y1MThfaW5pdF9jb21wcmVzc2lvbihzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCFvdi0+Y29tcHJlc3NfaW5pdGVkKSB7CisJCWlmIChvdjUxOF91cGxvYWRfcXVhbl90YWJsZXMob3YpIDwgMCkgeworCQkJZXJyKCJFcnJvciB1cGxvYWRpbmcgcXVhbnRpemF0aW9uIHRhYmxlcyIpOworCQkJcmMgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlvdi0+Y29tcHJlc3NfaW5pdGVkID0gMTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFNldHMgc2Vuc29yJ3MgY29udHJhc3Qgc2V0dGluZyB0byAidmFsIiAqLworc3RhdGljIGludAorc2Vuc29yX3NldF9jb250cmFzdChzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCWludCByYzsKKworCVBERUJVRygzLCAiJWQiLCB2YWwpOworCisJaWYgKG92LT5zdG9wX2R1cmluZ19zZXQpCisJCWlmIChvdjUxeF9zdG9wKG92KSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX09WNzYxMDoKKwljYXNlIFNFTl9PVjY2MjA6CisJeworCQlyYyA9IGkyY193KG92LCBPVjc2MTBfUkVHX0NOVCwgdmFsID4+IDgpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKwljYXNlIFNFTl9PVjY2MzA6CisJeworCQlyYyA9IGkyY193X21hc2sob3YsIE9WNzYxMF9SRUdfQ05ULCB2YWwgPj4gMTIsIDB4MGYpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKwljYXNlIFNFTl9PVjc2MjA6CisJeworCQl1bnNpZ25lZCBjaGFyIGN0YWJbXSA9IHsKKwkJCTB4MDEsIDB4MDUsIDB4MDksIDB4MTEsIDB4MTUsIDB4MzUsIDB4MzcsIDB4NTcsCisJCQkweDViLCAweGE1LCAweGE3LCAweGM3LCAweGM5LCAweGNmLCAweGVmLCAweGZmCisJCX07CisKKwkJLyogVXNlIFkgZ2FtbWEgY29udHJvbCBpbnN0ZWFkLiBCaXQgMCBlbmFibGVzIGl0LiAqLworCQlyYyA9IGkyY193KG92LCAweDY0LCBjdGFiW3ZhbD4+MTJdKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKwl9CisJY2FzZSBTRU5fU0FBNzExMUE6CisJeworCQlyYyA9IGkyY193KG92LCAweDBiLCB2YWwgPj4gOSk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJeworCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmMgPSAtRVBFUk07CisJCWdvdG8gb3V0OworCX0KKwl9CisKKwlyYyA9IDA7CQkvKiBTdWNjZXNzICovCisJb3YtPmNvbnRyYXN0ID0gdmFsOworb3V0OgorCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJjOworfQorCisvKiBHZXRzIHNlbnNvcidzIGNvbnRyYXN0IHNldHRpbmcgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9nZXRfY29udHJhc3Qoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIHNob3J0ICp2YWwpCit7CisJaW50IHJjOworCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNjYyMDoKKwkJcmMgPSBpMmNfcihvdiwgT1Y3NjEwX1JFR19DTlQpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQllbHNlCisJCQkqdmFsID0gcmMgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y2NjMwOgorCQlyYyA9IGkyY19yKG92LCBPVjc2MTBfUkVHX0NOVCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWVsc2UKKwkJCSp2YWwgPSByYyA8PCAxMjsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y3NjIwOgorCQkvKiBVc2UgWSBnYW1tYSByZWcgaW5zdGVhZC4gQml0IDAgaXMgdGhlIGVuYWJsZSBiaXQuICovCisJCXJjID0gaTJjX3Iob3YsIDB4NjQpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQllbHNlCisJCQkqdmFsID0gKHJjICYgMHhmZSkgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBTRU5fU0FBNzExMUE6CisJCSp2YWwgPSBvdi0+Y29udHJhc3Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCVBERUJVRygzLCAiJWQiLCAqdmFsKTsKKwlvdi0+Y29udHJhc3QgPSAqdmFsOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFNldHMgc2Vuc29yJ3MgYnJpZ2h0bmVzcyBzZXR0aW5nIHRvICJ2YWwiICovCitzdGF0aWMgaW50CitzZW5zb3Jfc2V0X2JyaWdodG5lc3Moc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoNCwgIiVkIiwgdmFsKTsKKworCWlmIChvdi0+c3RvcF9kdXJpbmdfc2V0KQorCQlpZiAob3Y1MXhfc3RvcChvdikgPCAwKQorCQkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJY2FzZSBTRU5fT1Y3NkJFOgorCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJCXJjID0gaTJjX3cob3YsIE9WNzYxMF9SRUdfQlJULCB2YWwgPj4gOCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y3NjIwOgorCQkvKiA3NjIwIGRvZXNuJ3QgbGlrZSBtYW51YWwgY2hhbmdlcyB3aGVuIGluIGF1dG8gbW9kZSAqLworCQlpZiAoIW92LT5hdXRvX2JydCkgeworCQkJcmMgPSBpMmNfdyhvdiwgT1Y3NjEwX1JFR19CUlQsIHZhbCA+PiA4KTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTRU5fU0FBNzExMUE6CisJCXJjID0gaTJjX3cob3YsIDB4MGEsIHZhbCA+PiA4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmMgPSAtRVBFUk07CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gMDsJCS8qIFN1Y2Nlc3MgKi8KKwlvdi0+YnJpZ2h0bmVzcyA9IHZhbDsKK291dDoKKwlpZiAob3Y1MXhfcmVzdGFydChvdikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiByYzsKK30KKworLyogR2V0cyBzZW5zb3IncyBicmlnaHRuZXNzIHNldHRpbmcgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgdXNiX292NTExICpvdiwgdW5zaWduZWQgc2hvcnQgKnZhbCkKK3sKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJY2FzZSBTRU5fT1Y3NkJFOgorCWNhc2UgU0VOX09WNzYyMDoKKwljYXNlIFNFTl9PVjY2MjA6CisJY2FzZSBTRU5fT1Y2NjMwOgorCQlyYyA9IGkyY19yKG92LCBPVjc2MTBfUkVHX0JSVCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWVsc2UKKwkJCSp2YWwgPSByYyA8PCA4OworCQlicmVhazsKKwljYXNlIFNFTl9TQUE3MTExQToKKwkJKnZhbCA9IG92LT5icmlnaHRuZXNzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlQREVCVUcoMywgIiVkIiwgKnZhbCk7CisJb3YtPmJyaWdodG5lc3MgPSAqdmFsOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFNldHMgc2Vuc29yJ3Mgc2F0dXJhdGlvbiAoY29sb3IgaW50ZW5zaXR5KSBzZXR0aW5nIHRvICJ2YWwiICovCitzdGF0aWMgaW50CitzZW5zb3Jfc2V0X3NhdHVyYXRpb24oc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoMywgIiVkIiwgdmFsKTsKKworCWlmIChvdi0+c3RvcF9kdXJpbmdfc2V0KQorCQlpZiAob3Y1MXhfc3RvcChvdikgPCAwKQorCQkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJY2FzZSBTRU5fT1Y3NkJFOgorCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJCXJjID0gaTJjX3cob3YsIE9WNzYxMF9SRUdfU0FULCB2YWwgPj4gOCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y3NjIwOgorLy8JCS8qIFVzZSBVViBnYW1tYSBjb250cm9sIGluc3RlYWQuIEJpdHMgMCAmIDcgYXJlIHJlc2VydmVkLiAqLworLy8JCXJjID0gb3ZfaTJjX3dyaXRlKG92LT5kZXYsIDB4NjIsICh2YWwgPj4gOSkgJiAweDdlKTsKKy8vCQlpZiAocmMgPCAwKQorLy8JCQlnb3RvIG91dDsKKwkJcmMgPSBpMmNfdyhvdiwgT1Y3NjEwX1JFR19TQVQsIHZhbCA+PiA4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKwljYXNlIFNFTl9TQUE3MTExQToKKwkJcmMgPSBpMmNfdyhvdiwgMHgwYywgdmFsID4+IDkpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBERUJVRygzLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBvdXQ7CisJfQorCisJcmMgPSAwOwkJLyogU3VjY2VzcyAqLworCW92LT5jb2xvdXIgPSB2YWw7CitvdXQ6CisJaWYgKG92NTF4X3Jlc3RhcnQob3YpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIEdldHMgc2Vuc29yJ3Mgc2F0dXJhdGlvbiAoY29sb3IgaW50ZW5zaXR5KSBzZXR0aW5nICovCitzdGF0aWMgaW50CitzZW5zb3JfZ2V0X3NhdHVyYXRpb24oc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIHNob3J0ICp2YWwpCit7CisJaW50IHJjOworCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNzZCRToKKwljYXNlIFNFTl9PVjY2MjA6CisJY2FzZSBTRU5fT1Y2NjMwOgorCQlyYyA9IGkyY19yKG92LCBPVjc2MTBfUkVHX1NBVCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWVsc2UKKwkJCSp2YWwgPSByYyA8PCA4OworCQlicmVhazsKKwljYXNlIFNFTl9PVjc2MjA6CisvLwkJLyogVXNlIFVWIGdhbW1hIHJlZyBpbnN0ZWFkLiBCaXRzIDAgJiA3IGFyZSByZXNlcnZlZC4gKi8KKy8vCQlyYyA9IGkyY19yKG92LCAweDYyKTsKKy8vCQlpZiAocmMgPCAwKQorLy8JCQlyZXR1cm4gcmM7CisvLwkJZWxzZQorLy8JCQkqdmFsID0gKHJjICYgMHg3ZSkgPDwgOTsKKwkJcmMgPSBpMmNfcihvdiwgT1Y3NjEwX1JFR19TQVQpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQllbHNlCisJCQkqdmFsID0gcmMgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBTRU5fU0FBNzExMUE6CisJCSp2YWwgPSBvdi0+Y29sb3VyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlQREVCVUcoMywgIiVkIiwgKnZhbCk7CisJb3YtPmNvbG91ciA9ICp2YWw7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogU2V0cyBzZW5zb3IncyBodWUgKHJlZC9ibHVlIGJhbGFuY2UpIHNldHRpbmcgdG8gInZhbCIgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9zZXRfaHVlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJaW50IHJjOworCisJUERFQlVHKDMsICIlZCIsIHZhbCk7CisKKwlpZiAob3YtPnN0b3BfZHVyaW5nX3NldCkKKwkJaWYgKG92NTF4X3N0b3Aob3YpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJCXJjID0gaTJjX3cob3YsIE9WNzYxMF9SRUdfUkVELCAweEZGIC0gKHZhbCA+PiA4KSk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKworCQlyYyA9IGkyY193KG92LCBPVjc2MTBfUkVHX0JMVUUsIHZhbCA+PiA4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKwljYXNlIFNFTl9PVjc2MjA6CisvLyBIdWUgY29udHJvbCBpcyBjYXVzaW5nIHByb2JsZW1zLiBJIHdpbGwgZW5hYmxlIGl0IG9uY2UgaXQncyBmaXhlZC4KKyNpZiAwCisJCXJjID0gaTJjX3cob3YsIDB4N2EsICh1bnNpZ25lZCBjaGFyKSh2YWwgPj4gOCkgKyAweGIpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmMgPSBpMmNfdyhvdiwgMHg3OSwgKHVuc2lnbmVkIGNoYXIpKHZhbCA+PiA4KSArIDB4Yik7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIFNFTl9TQUE3MTExQToKKwkJcmMgPSBpMmNfdyhvdiwgMHgwZCwgKHZhbCArIDMyNzY4KSA+PiA4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmMgPSAtRVBFUk07CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gMDsJCS8qIFN1Y2Nlc3MgKi8KKwlvdi0+aHVlID0gdmFsOworb3V0OgorCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJjOworfQorCisvKiBHZXRzIHNlbnNvcidzIGh1ZSAocmVkL2JsdWUgYmFsYW5jZSkgc2V0dGluZyAqLworc3RhdGljIGludAorc2Vuc29yX2dldF9odWUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIHNob3J0ICp2YWwpCit7CisJaW50IHJjOworCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJCXJjID0gaTJjX3Iob3YsIE9WNzYxMF9SRUdfQkxVRSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWVsc2UKKwkJCSp2YWwgPSByYyA8PCA4OworCQlicmVhazsKKwljYXNlIFNFTl9PVjc2MjA6CisJCXJjID0gaTJjX3Iob3YsIDB4N2EpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQllbHNlCisJCQkqdmFsID0gcmMgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBTRU5fU0FBNzExMUE6CisJCSp2YWwgPSBvdi0+aHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlQREVCVUcoMywgIiVkIiwgKnZhbCk7CisJb3YtPmh1ZSA9ICp2YWw7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAorc2Vuc29yX3NldF9waWN0dXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCkKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoNCwgInNlbnNvcl9zZXRfcGljdHVyZSIpOworCisJb3YtPndoaXRlbmVzcyA9IHAtPndoaXRlbmVzczsKKworCS8qIERvbid0IHJldHVybiBlcnJvciBpZiBhIHNldHRpbmcgaXMgdW5zdXBwb3J0ZWQsIG9yIHJlc3Qgb2Ygc2V0dGluZ3MKKyAgICAgICAgICogd2lsbCBub3QgYmUgcGVyZm9ybWVkICovCisKKwlyYyA9IHNlbnNvcl9zZXRfY29udHJhc3Qob3YsIHAtPmNvbnRyYXN0KTsKKwlpZiAoRkFUQUxfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHNlbnNvcl9zZXRfYnJpZ2h0bmVzcyhvdiwgcC0+YnJpZ2h0bmVzcyk7CisJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJcmMgPSBzZW5zb3Jfc2V0X3NhdHVyYXRpb24ob3YsIHAtPmNvbG91cik7CisJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJcmMgPSBzZW5zb3Jfc2V0X2h1ZShvdiwgcC0+aHVlKTsKKwlpZiAoRkFUQUxfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2Vuc29yX2dldF9waWN0dXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCkKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoNCwgInNlbnNvcl9nZXRfcGljdHVyZSIpOworCisJLyogRG9uJ3QgcmV0dXJuIGVycm9yIGlmIGEgc2V0dGluZyBpcyB1bnN1cHBvcnRlZCwgb3IgcmVzdCBvZiBzZXR0aW5ncworICAgICAgICAgKiB3aWxsIG5vdCBiZSBwZXJmb3JtZWQgKi8KKworCXJjID0gc2Vuc29yX2dldF9jb250cmFzdChvdiwgJihwLT5jb250cmFzdCkpOworCWlmIChGQVRBTF9FUlJPUihyYykpCisJCXJldHVybiByYzsKKworCXJjID0gc2Vuc29yX2dldF9icmlnaHRuZXNzKG92LCAmKHAtPmJyaWdodG5lc3MpKTsKKwlpZiAoRkFUQUxfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHNlbnNvcl9nZXRfc2F0dXJhdGlvbihvdiwgJihwLT5jb2xvdXIpKTsKKwlpZiAoRkFUQUxfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHNlbnNvcl9nZXRfaHVlKG92LCAmKHAtPmh1ZSkpOworCWlmIChGQVRBTF9FUlJPUihyYykpCisJCXJldHVybiByYzsKKworCXAtPndoaXRlbmVzcyA9IDEwNSA8PCA4OworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCisvLyBGSVhNRTogRXhwb3N1cmUgcmFuZ2UgaXMgb25seSAweDAwLTB4N2YgaW4gaW50ZXJsYWNlIG1vZGUKKy8qIFNldHMgY3VycmVudCBleHBvc3VyZSBmb3Igc2Vuc29yLiBUaGlzIG9ubHkgaGFzIGFuIGVmZmVjdCBpZiBhdXRvLWV4cG9zdXJlCisgKiBpcyBvZmYgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzZW5zb3Jfc2V0X2V4cG9zdXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoMywgIiVkIiwgdmFsKTsKKworCWlmIChvdi0+c3RvcF9kdXJpbmdfc2V0KQorCQlpZiAob3Y1MXhfc3RvcChvdikgPCAwKQorCQkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjY2MjA6CisJY2FzZSBTRU5fT1Y2NjMwOgorCWNhc2UgU0VOX09WNzYxMDoKKwljYXNlIFNFTl9PVjc2MjA6CisJY2FzZSBTRU5fT1Y3NkJFOgorCWNhc2UgU0VOX09WODYwMDoKKwkJcmMgPSBpMmNfdyhvdiwgMHgxMCwgdmFsKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWJyZWFrOworCWNhc2UgU0VOX0tTMDEyNzoKKwljYXNlIFNFTl9LUzAxMjdCOgorCWNhc2UgU0VOX1NBQTcxMTFBOgorCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwlkZWZhdWx0OgorCQllcnIoIlNlbnNvciBub3Qgc3VwcG9ydGVkIGZvciBzZXRfZXhwb3N1cmUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSAwOwkJLyogU3VjY2VzcyAqLworCW92LT5leHBvc3VyZSA9IHZhbDsKK291dDoKKwlpZiAob3Y1MXhfcmVzdGFydChvdikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiByYzsKK30KKyNlbmRpZgorCisvKiBHZXRzIGN1cnJlbnQgZXhwb3N1cmUgbGV2ZWwgZnJvbSBzZW5zb3IsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyB1bmRlcgorICogbWFudWFsIGNvbnRyb2wuICovCitzdGF0aWMgaW50CitzZW5zb3JfZ2V0X2V4cG9zdXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyICp2YWwpCit7CisJaW50IHJjOworCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJY2FzZSBTRU5fT1Y3NjIwOgorCWNhc2UgU0VOX09WNzZCRToKKwljYXNlIFNFTl9PVjg2MDA6CisJCXJjID0gaTJjX3Iob3YsIDB4MTApOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQllbHNlCisJCQkqdmFsID0gcmM7CisJCWJyZWFrOworCWNhc2UgU0VOX0tTMDEyNzoKKwljYXNlIFNFTl9LUzAxMjdCOgorCWNhc2UgU0VOX1NBQTcxMTFBOgorCQl2YWwgPSBOVUxMOworCQlQREVCVUcoMywgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwlkZWZhdWx0OgorCQllcnIoIlNlbnNvciBub3Qgc3VwcG9ydGVkIGZvciBnZXRfZXhwb3N1cmUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJUERFQlVHKDMsICIlZCIsICp2YWwpOworCW92LT5leHBvc3VyZSA9ICp2YWw7CisKKwlyZXR1cm4gMDsKK30KKworLyogVHVybnMgb24gb3Igb2ZmIHRoZSBMRUQuIE9ubHkgaGFzIGFuIGVmZmVjdCB3aXRoIE9WNTExKy9PVjUxOCgrKSAqLworc3RhdGljIHZvaWQKK292NTF4X2xlZF9jb250cm9sKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgZW5hYmxlKQoreworCVBERUJVRyg0LCAiICglcykiLCBlbmFibGUgPyAidHVybiBvbiIgOiAidHVybiBvZmYiKTsKKworCWlmIChvdi0+YnJpZGdlID09IEJSR19PVjUxMVBMVVMpCisJCXJlZ193KG92LCBSNTExX1NZU19MRURfQ1RMLCBlbmFibGUgPyAxIDogMCk7CisJZWxzZSBpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpCisJCXJlZ193X21hc2sob3YsIFI1MThfR1BJT19PVVQsIGVuYWJsZSA/IDB4MDIgOiAweDAwLCAweDAyKTsKKworCXJldHVybjsKK30KKworLyogTWF0Y2hlcyB0aGUgc2Vuc29yJ3MgaW50ZXJuYWwgZnJhbWUgcmF0ZSB0byB0aGUgbGlnaHRpbmcgZnJlcXVlbmN5LgorICogVmFsaWQgZnJlcXVlbmNpZXMgYXJlOgorICoJNTAgLSA1MEh6LCBmb3IgRXVyb3BlYW4gYW5kIEFzaWFuIGxpZ2h0aW5nCisgKgk2MCAtIDYwSHosIGZvciBBbWVyaWNhbiBsaWdodGluZworICoKKyAqIFRlc3RlZCB3aXRoOiBPVjc2MTAsIE9WNzYyMCwgT1Y3NkJFLCBPVjY2MjAKKyAqIFVuc3VwcG9ydGVkOiBLUzAxMjcsIEtTMDEyN0IsIFNBQTcxMTFBCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9zZXRfbGlnaHRfZnJlcShzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IGZyZXEpCit7CisJaW50IHNpeHR5OworCisJUERFQlVHKDQsICIlZCBIeiIsIGZyZXEpOworCisJaWYgKGZyZXEgPT0gNjApCisJCXNpeHR5ID0gMTsKKwllbHNlIGlmIChmcmVxID09IDUwKQorCQlzaXh0eSA9IDA7CisJZWxzZSB7CisJCWVycigiSW52YWxpZCBsaWdodCBmcmVxICglZCBIeikiLCBmcmVxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y3NjEwOgorCQlpMmNfd19tYXNrKG92LCAweDJhLCBzaXh0eT8weDAwOjB4ODAsIDB4ODApOworCQlpMmNfdyhvdiwgMHgyYiwgc2l4dHk/MHgwMDoweGFjKTsKKwkJaTJjX3dfbWFzayhvdiwgMHgxMywgMHgxMCwgMHgxMCk7CisJCWkyY193X21hc2sob3YsIDB4MTMsIDB4MDAsIDB4MTApOworCQlicmVhazsKKwljYXNlIFNFTl9PVjc2MjA6CisJY2FzZSBTRU5fT1Y3NkJFOgorCWNhc2UgU0VOX09WODYwMDoKKwkJaTJjX3dfbWFzayhvdiwgMHgyYSwgc2l4dHk/MHgwMDoweDgwLCAweDgwKTsKKwkJaTJjX3cob3YsIDB4MmIsIHNpeHR5PzB4MDA6MHhhYyk7CisJCWkyY193X21hc2sob3YsIDB4NzYsIDB4MDEsIDB4MDEpOworCQlicmVhazsKKwljYXNlIFNFTl9PVjY2MjA6CisJY2FzZSBTRU5fT1Y2NjMwOgorCQlpMmNfdyhvdiwgMHgyYiwgc2l4dHk/MHhhODoweDI4KTsKKwkJaTJjX3cob3YsIDB4MmEsIHNpeHR5PzB4ODQ6MHhhNCk7CisJCWJyZWFrOworCWNhc2UgU0VOX0tTMDEyNzoKKwljYXNlIFNFTl9LUzAxMjdCOgorCWNhc2UgU0VOX1NBQTcxMTFBOgorCQlQREVCVUcoNSwgIlVuc3VwcG9ydGVkIHdpdGggdGhpcyBzZW5zb3IiKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwlkZWZhdWx0OgorCQllcnIoIlNlbnNvciBub3Qgc3VwcG9ydGVkIGZvciBzZXRfbGlnaHRfZnJlcSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvdi0+bGlnaHRmcmVxID0gZnJlcTsKKworCXJldHVybiAwOworfQorCisvKiBJZiBlbmFibGUgaXMgdHJ1ZSwgdHVybiBvbiB0aGUgc2Vuc29yJ3MgYmFuZGluZyBmaWx0ZXIsIG90aGVyd2lzZSB0dXJuIGl0CisgKiBvZmYuIFRoaXMgZmlsdGVyIHRyaWVzIHRvIHJlZHVjZSB0aGUgcGF0dGVybiBvZiBob3Jpem9udGFsIGxpZ2h0L2RhcmsgYmFuZHMKKyAqIGNhdXNlZCBieSBzb21lICh1c3VhbGx5IGZsdW9yZXNjZW50KSBsaWdodGluZy4gVGhlIGxpZ2h0IGZyZXF1ZW5jeSBtdXN0IGJlCisgKiBzZXQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciBlbmFibGluZyBpdCB3aXRoIG92NTF4X3NldF9saWdodF9mcmVxKCkuCisgKgorICogVGVzdGVkIHdpdGg6IE9WNzYxMCwgT1Y3NjIwLCBPVjc2QkUsIE9WNjYyMC4KKyAqIFVuc3VwcG9ydGVkOiBLUzAxMjcsIEtTMDEyN0IsIFNBQTcxMTFBCisgKiBSZXR1cm5zOiAwIGZvciBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK3NlbnNvcl9zZXRfYmFuZGluZ19maWx0ZXIoc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBlbmFibGUpCit7CisJaW50IHJjOworCisJUERFQlVHKDQsICIgKCVzKSIsIGVuYWJsZSA/ICJ0dXJuIG9uIiA6ICJ0dXJuIG9mZiIpOworCisJaWYgKG92LT5zZW5zb3IgPT0gU0VOX0tTMDEyNyB8fCBvdi0+c2Vuc29yID09IFNFTl9LUzAxMjdCCisJCXx8IG92LT5zZW5zb3IgPT0gU0VOX1NBQTcxMTFBKSB7CisJCVBERUJVRyg1LCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJjID0gaTJjX3dfbWFzayhvdiwgMHgyZCwgZW5hYmxlPzB4MDQ6MHgwMCwgMHgwNCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJb3YtPmJhbmRmaWx0ID0gZW5hYmxlOworCisJcmV0dXJuIDA7Cit9CisKKy8qIElmIGVuYWJsZSBpcyB0cnVlLCB0dXJuIG9uIHRoZSBzZW5zb3IncyBhdXRvIGJyaWdodG5lc3MgY29udHJvbCwgb3RoZXJ3aXNlCisgKiB0dXJuIGl0IG9mZi4KKyAqCisgKiBVbnN1cHBvcnRlZDogS1MwMTI3LCBLUzAxMjdCLCBTQUE3MTExQQorICogUmV0dXJuczogMCBmb3Igc3VjY2VzcworICovCitzdGF0aWMgaW50CitzZW5zb3Jfc2V0X2F1dG9fYnJpZ2h0bmVzcyhzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IGVuYWJsZSkKK3sKKwlpbnQgcmM7CisKKwlQREVCVUcoNCwgIiAoJXMpIiwgZW5hYmxlID8gInR1cm4gb24iIDogInR1cm4gb2ZmIik7CisKKwlpZiAob3YtPnNlbnNvciA9PSBTRU5fS1MwMTI3IHx8IG92LT5zZW5zb3IgPT0gU0VOX0tTMDEyN0IKKwkJfHwgb3YtPnNlbnNvciA9PSBTRU5fU0FBNzExMUEpIHsKKwkJUERFQlVHKDUsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmMgPSBpMmNfd19tYXNrKG92LCAweDJkLCBlbmFibGU/MHgxMDoweDAwLCAweDEwKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlvdi0+YXV0b19icnQgPSBlbmFibGU7CisKKwlyZXR1cm4gMDsKK30KKworLyogSWYgZW5hYmxlIGlzIHRydWUsIHR1cm4gb24gdGhlIHNlbnNvcidzIGF1dG8gZXhwb3N1cmUgY29udHJvbCwgb3RoZXJ3aXNlCisgKiB0dXJuIGl0IG9mZi4KKyAqCisgKiBVbnN1cHBvcnRlZDogS1MwMTI3LCBLUzAxMjdCLCBTQUE3MTExQQorICogUmV0dXJuczogMCBmb3Igc3VjY2VzcworICovCitzdGF0aWMgaW50CitzZW5zb3Jfc2V0X2F1dG9fZXhwb3N1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBlbmFibGUpCit7CisJUERFQlVHKDQsICIgKCVzKSIsIGVuYWJsZSA/ICJ0dXJuIG9uIiA6ICJ0dXJuIG9mZiIpOworCisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fT1Y3NjEwOgorCQlpMmNfd19tYXNrKG92LCAweDI5LCBlbmFibGU/MHgwMDoweDgwLCAweDgwKTsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y2NjIwOgorCWNhc2UgU0VOX09WNzYyMDoKKwljYXNlIFNFTl9PVjc2QkU6CisJY2FzZSBTRU5fT1Y4NjAwOgorCQlpMmNfd19tYXNrKG92LCAweDEzLCBlbmFibGU/MHgwMToweDAwLCAweDAxKTsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y2NjMwOgorCQlpMmNfd19tYXNrKG92LCAweDI4LCBlbmFibGU/MHgwMDoweDEwLCAweDEwKTsKKwkJYnJlYWs7CisJY2FzZSBTRU5fS1MwMTI3OgorCWNhc2UgU0VOX0tTMDEyN0I6CisJY2FzZSBTRU5fU0FBNzExMUE6CisJCVBERUJVRyg1LCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyZXR1cm4gLUVQRVJNOworCWRlZmF1bHQ6CisJCWVycigiU2Vuc29yIG5vdCBzdXBwb3J0ZWQgZm9yIHNldF9hdXRvX2V4cG9zdXJlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW92LT5hdXRvX2V4cCA9IGVuYWJsZTsKKworCXJldHVybiAwOworfQorCisvKiBNb2RpZmllcyB0aGUgc2Vuc29yJ3MgZXhwb3N1cmUgYWxnb3JpdGhtIHRvIGFsbG93IHByb3BlciBleHBvc3VyZSBvZiBvYmplY3RzCisgKiB0aGF0IGFyZSBpbGx1bWluYXRlZCBmcm9tIGJlaGluZC4KKyAqCisgKiBUZXN0ZWQgd2l0aDogT1Y2NjIwLCBPVjc2MjAKKyAqIFVuc3VwcG9ydGVkOiBPVjc2MTAsIE9WNzZCRSwgS1MwMTI3LCBLUzAxMjdCLCBTQUE3MTExQQorICogUmV0dXJuczogMCBmb3Igc3VjY2VzcworICovCitzdGF0aWMgaW50CitzZW5zb3Jfc2V0X2JhY2tsaWdodChzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IGVuYWJsZSkKK3sKKwlQREVCVUcoNCwgIiAoJXMpIiwgZW5hYmxlID8gInR1cm4gb24iIDogInR1cm4gb2ZmIik7CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MjA6CisJY2FzZSBTRU5fT1Y4NjAwOgorCQlpMmNfd19tYXNrKG92LCAweDY4LCBlbmFibGU/MHhlMDoweGMwLCAweGUwKTsKKwkJaTJjX3dfbWFzayhvdiwgMHgyOSwgZW5hYmxlPzB4MDg6MHgwMCwgMHgwOCk7CisJCWkyY193X21hc2sob3YsIDB4MjgsIGVuYWJsZT8weDAyOjB4MDAsIDB4MDIpOworCQlicmVhazsKKwljYXNlIFNFTl9PVjY2MjA6CisJCWkyY193X21hc2sob3YsIDB4NGUsIGVuYWJsZT8weGUwOjB4YzAsIDB4ZTApOworCQlpMmNfd19tYXNrKG92LCAweDI5LCBlbmFibGU/MHgwODoweDAwLCAweDA4KTsKKwkJaTJjX3dfbWFzayhvdiwgMHgwZSwgZW5hYmxlPzB4ODA6MHgwMCwgMHg4MCk7CisJCWJyZWFrOworCWNhc2UgU0VOX09WNjYzMDoKKwkJaTJjX3dfbWFzayhvdiwgMHg0ZSwgZW5hYmxlPzB4ODA6MHg2MCwgMHhlMCk7CisJCWkyY193X21hc2sob3YsIDB4MjksIGVuYWJsZT8weDA4OjB4MDAsIDB4MDgpOworCQlpMmNfd19tYXNrKG92LCAweDI4LCBlbmFibGU/MHgwMjoweDAwLCAweDAyKTsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNzZCRToKKwljYXNlIFNFTl9LUzAxMjc6CisJY2FzZSBTRU5fS1MwMTI3QjoKKwljYXNlIFNFTl9TQUE3MTExQToKKwkJUERFQlVHKDUsICJVbnN1cHBvcnRlZCB3aXRoIHRoaXMgc2Vuc29yIik7CisJCXJldHVybiAtRVBFUk07CisJZGVmYXVsdDoKKwkJZXJyKCJTZW5zb3Igbm90IHN1cHBvcnRlZCBmb3Igc2V0X2JhY2tsaWdodCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvdi0+YmFja2xpZ2h0ID0gZW5hYmxlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NlbnNvcl9zZXRfbWlycm9yKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgZW5hYmxlKQoreworCVBERUJVRyg0LCAiICglcykiLCBlbmFibGUgPyAidHVybiBvbiIgOiAidHVybiBvZmYiKTsKKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX09WNjYyMDoKKwljYXNlIFNFTl9PVjY2MzA6CisJY2FzZSBTRU5fT1Y3NjEwOgorCWNhc2UgU0VOX09WNzYyMDoKKwljYXNlIFNFTl9PVjc2QkU6CisJY2FzZSBTRU5fT1Y4NjAwOgorCQlpMmNfd19tYXNrKG92LCAweDEyLCBlbmFibGU/MHg0MDoweDAwLCAweDQwKTsKKwkJYnJlYWs7CisJY2FzZSBTRU5fS1MwMTI3OgorCWNhc2UgU0VOX0tTMDEyN0I6CisJY2FzZSBTRU5fU0FBNzExMUE6CisJCVBERUJVRyg1LCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHNlbnNvciIpOworCQlyZXR1cm4gLUVQRVJNOworCWRlZmF1bHQ6CisJCWVycigiU2Vuc29yIG5vdCBzdXBwb3J0ZWQgZm9yIHNldF9taXJyb3IiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb3YtPm1pcnJvciA9IGVuYWJsZTsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm5zIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCAocmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5IGFyZSBsb2NhdGVkOworICogcGxhbmFyIG9yIG5vdCksIG9yIHplcm8gZm9yIHVuc3VwcG9ydGVkIGZvcm1hdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2dldF9kZXB0aChpbnQgcGFsZXR0ZSkKK3sKKwlzd2l0Y2ggKHBhbGV0dGUpIHsKKwljYXNlIFZJREVPX1BBTEVUVEVfR1JFWTogICAgcmV0dXJuIDg7CisJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMDogIHJldHVybiAxMjsKKwljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDogcmV0dXJuIDEyOyAvKiBQbGFuYXIgKi8KKwlkZWZhdWx0OgkJICAgIHJldHVybiAwOyAgLyogSW52YWxpZCBmb3JtYXQgKi8KKwl9Cit9CisKKy8qIEJ5dGVzIHBlciBmcmFtZS4gVXNlZCBieSByZWFkKCkuIFJldHVybiBvZiAwIGluZGljYXRlcyBlcnJvciAqLworc3RhdGljIGlubGluZSBsb25nIGludAorZ2V0X2ZyYW1lX2xlbmd0aChzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lKQoreworCWlmICghZnJhbWUpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuICgoZnJhbWUtPndpZHRoICogZnJhbWUtPmhlaWdodAorCQkJICogZ2V0X2RlcHRoKGZyYW1lLT5mb3JtYXQpKSA+PiAzKTsKK30KKworc3RhdGljIGludAorbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkgaW50IG1vZGUsIGludCBzdWJfZmxhZywgaW50IHF2Z2EpCit7CisJaW50IGNsb2NrOworCisJLyoqKioqKioqIE1vZGUgKFZHQS9RVkdBKSBhbmQgc2Vuc29yIHNwZWNpZmljIHJlZ3MgKioqKioqKiovCisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9PVjc2MTA6CisJCWkyY193KG92LCAweDE0LCBxdmdhPzB4MjQ6MHgwNCk7CisvLyBGSVhNRTogRG9lcyB0aGlzIGltcHJvdmUgdGhlIGltYWdlIHF1YWxpdHkgb3IgZnJhbWUgcmF0ZT8KKyNpZiAwCisJCWkyY193X21hc2sob3YsIDB4MjgsIHF2Z2E/MHgwMDoweDIwLCAweDIwKTsKKwkJaTJjX3cob3YsIDB4MjQsIDB4MTApOworCQlpMmNfdyhvdiwgMHgyNSwgcXZnYT8weDQwOjB4OGEpOworCQlpMmNfdyhvdiwgMHgyZiwgcXZnYT8weDMwOjB4YjApOworCQlpMmNfdyhvdiwgMHgzNSwgcXZnYT8weDFjOjB4OWMpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgU0VOX09WNzYyMDoKKy8vCQlpMmNfdyhvdiwgMHgyYiwgMHgwMCk7CisJCWkyY193KG92LCAweDE0LCBxdmdhPzB4YTQ6MHg4NCk7CisJCWkyY193X21hc2sob3YsIDB4MjgsIHF2Z2E/MHgwMDoweDIwLCAweDIwKTsKKwkJaTJjX3cob3YsIDB4MjQsIHF2Z2E/MHgyMDoweDNhKTsKKwkJaTJjX3cob3YsIDB4MjUsIHF2Z2E/MHgzMDoweDYwKTsKKwkJaTJjX3dfbWFzayhvdiwgMHgyZCwgcXZnYT8weDQwOjB4MDAsIDB4NDApOworCQlpMmNfd19tYXNrKG92LCAweDY3LCBxdmdhPzB4ZjA6MHg5MCwgMHhmMCk7CisJCWkyY193X21hc2sob3YsIDB4NzQsIHF2Z2E/MHgyMDoweDAwLCAweDIwKTsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y3NkJFOgorLy8JCWkyY193KG92LCAweDJiLCAweDAwKTsKKwkJaTJjX3cob3YsIDB4MTQsIHF2Z2E/MHhhNDoweDg0KTsKKy8vIEZJWE1FOiBFbmFibGUgdGhpcyBvbmNlIDc2MjBBRSB1c2VzIDc2MjAgaW5pdGlhbCBzZXR0aW5ncworI2lmIDAKKwkJaTJjX3dfbWFzayhvdiwgMHgyOCwgcXZnYT8weDAwOjB4MjAsIDB4MjApOworCQlpMmNfdyhvdiwgMHgyNCwgcXZnYT8weDIwOjB4M2EpOworCQlpMmNfdyhvdiwgMHgyNSwgcXZnYT8weDMwOjB4NjApOworCQlpMmNfd19tYXNrKG92LCAweDJkLCBxdmdhPzB4NDA6MHgwMCwgMHg0MCk7CisJCWkyY193X21hc2sob3YsIDB4NjcsIHF2Z2E/MHhiMDoweDkwLCAweGYwKTsKKwkJaTJjX3dfbWFzayhvdiwgMHg3NCwgcXZnYT8weDIwOjB4MDAsIDB4MjApOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgU0VOX09WNjYyMDoKKwkJaTJjX3cob3YsIDB4MTQsIHF2Z2E/MHgyNDoweDA0KTsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y2NjMwOgorCQlpMmNfdyhvdiwgMHgxNCwgcXZnYT8weGEwOjB4ODApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoIkludmFsaWQgc2Vuc29yIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qKioqKioqKiBQYWxldHRlLXNwZWNpZmljIHJlZ3MgKioqKioqKiovCisKKwlpZiAobW9kZSA9PSBWSURFT19QQUxFVFRFX0dSRVkpIHsKKwkJaWYgKG92LT5zZW5zb3IgPT0gU0VOX09WNzYxMCB8fCBvdi0+c2Vuc29yID09IFNFTl9PVjc2QkUpIHsKKwkJCS8qIHRoZXNlIGFyZW4ndCB2YWxpZCBvbiB0aGUgT1Y2NjIwL09WNzYyMC82NjMwPyAqLworCQkJaTJjX3dfbWFzayhvdiwgMHgwZSwgMHg0MCwgMHg0MCk7CisJCX0KKworCQlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y2NjMwICYmIG92LT5icmlkZ2UgPT0gQlJHX09WNTE4CisJCSAgICAmJiBvdjUxOF9jb2xvcikgeworCQkJaTJjX3dfbWFzayhvdiwgMHgxMiwgMHgwMCwgMHgxMCk7CisJCQlpMmNfd19tYXNrKG92LCAweDEzLCAweDAwLCAweDIwKTsKKwkJfSBlbHNlIHsKKwkJCWkyY193X21hc2sob3YsIDB4MTMsIDB4MjAsIDB4MjApOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG92LT5zZW5zb3IgPT0gU0VOX09WNzYxMCB8fCBvdi0+c2Vuc29yID09IFNFTl9PVjc2QkUpIHsKKwkJCS8qIG5vdCB2YWxpZCBvbiB0aGUgT1Y2NjIwL09WNzYyMC82NjMwPyAqLworCQkJaTJjX3dfbWFzayhvdiwgMHgwZSwgMHgwMCwgMHg0MCk7CisJCX0KKworCQkvKiBUaGUgT1Y1MTggbmVlZHMgc3BlY2lhbCB0cmVhdG1lbnQuIEFsdGhvdWdoIGJvdGggdGhlIE9WNTE4CisJCSAqIGFuZCB0aGUgT1Y2NjMwIHN1cHBvcnQgYSAxNi1iaXQgdmlkZW8gYnVzLCBvbmx5IHRoZSA4IGJpdCBZCisJCSAqIGJ1cyBpcyBhY3R1YWxseSB1c2VkLiBUaGUgVVYgYnVzIGlzIHRpZWQgdG8gZ3JvdW5kLgorCQkgKiBUaGVyZWZvcmUsIHRoZSBPVjY2MzAgbmVlZHMgdG8gYmUgaW4gOC1iaXQgbXVsdGlwbGV4ZWQKKwkJICogb3V0cHV0IG1vZGUgKi8KKworCQlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y2NjMwICYmIG92LT5icmlkZ2UgPT0gQlJHX09WNTE4CisJCSAgICAmJiBvdjUxOF9jb2xvcikgeworCQkJaTJjX3dfbWFzayhvdiwgMHgxMiwgMHgxMCwgMHgxMCk7CisJCQlpMmNfd19tYXNrKG92LCAweDEzLCAweDIwLCAweDIwKTsKKwkJfSBlbHNlIHsKKwkJCWkyY193X21hc2sob3YsIDB4MTMsIDB4MDAsIDB4MjApOworCQl9CisJfQorCisJLyoqKioqKioqIENsb2NrIHByb2dyYW1taW5nICoqKioqKioqLworCisJLyogVGhlIE9WNjYyMCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nLiBUaGlzIHByZXZlbnRzIHRoZSAKKwkgKiBzZXZlcmUgYmFuZGluZyB0aGF0IG5vcm1hbGx5IG9jY3VycyAqLworCWlmIChvdi0+c2Vuc29yID09IFNFTl9PVjY2MjAgfHwgb3YtPnNlbnNvciA9PSBTRU5fT1Y2NjMwKQorCXsKKwkJLyogQ2xvY2sgZG93biAqLworCisJCWkyY193KG92LCAweDJhLCAweDA0KTsKKworCQlpZiAob3YtPmNvbXByZXNzKSB7CisvLwkJCWNsb2NrID0gMDsgICAgLyogVGhpcyBlbnN1cmVzIHRoZSBoaWdoZXN0IGZyYW1lIHJhdGUgKi8KKwkJCWNsb2NrID0gMzsKKwkJfSBlbHNlIGlmIChjbG9ja2RpdiA9PSAtMSkgeyAgIC8qIElmIHVzZXIgZGlkbid0IG92ZXJyaWRlIGl0ICovCisJCQljbG9jayA9IDM7ICAgIC8qIEdpdmVzIGJldHRlciBleHBvc3VyZSB0aW1lICovCisJCX0gZWxzZSB7CisJCQljbG9jayA9IGNsb2NrZGl2OworCQl9CisKKwkJUERFQlVHKDQsICJTZXR0aW5nIGNsb2NrIGRpdmlzb3IgdG8gJWQiLCBjbG9jayk7CisKKwkJaTJjX3cob3YsIDB4MTEsIGNsb2NrKTsKKworCQlpMmNfdyhvdiwgMHgyYSwgMHg4NCk7CisJCS8qIFRoaXMgbmV4dCBzZXR0aW5nIGlzIGNyaXRpY2FsLiBJdCBzZWVtcyB0byBpbXByb3ZlCisJCSAqIHRoZSBnYWluIG9yIHRoZSBjb250cmFzdC4gVGhlICJyZXNlcnZlZCIgYml0cyBzZWVtCisJCSAqIHRvIGhhdmUgc29tZSBlZmZlY3QgaW4gdGhpcyBjYXNlLiAqLworCQlpMmNfdyhvdiwgMHgyZCwgMHg4NSk7CisJfQorCWVsc2UKKwl7CisJCWlmIChvdi0+Y29tcHJlc3MpIHsKKwkJCWNsb2NrID0gMTsgICAgLyogVGhpcyBlbnN1cmVzIHRoZSBoaWdoZXN0IGZyYW1lIHJhdGUgKi8KKwkJfSBlbHNlIGlmIChjbG9ja2RpdiA9PSAtMSkgeyAgIC8qIElmIHVzZXIgZGlkbid0IG92ZXJyaWRlIGl0ICovCisJCQkvKiBDYWxjdWxhdGUgYW5kIHNldCB0aGUgY2xvY2sgZGl2aXNvciAqLworCQkJY2xvY2sgPSAoKHN1Yl9mbGFnID8gb3YtPnN1YncgKiBvdi0+c3ViaAorCQkJCSAgOiB3aWR0aCAqIGhlaWdodCkKKwkJCQkgKiAobW9kZSA9PSBWSURFT19QQUxFVFRFX0dSRVkgPyAyIDogMykgLyAyKQorCQkJCSAvIDY2MDAwOworCQl9IGVsc2UgeworCQkJY2xvY2sgPSBjbG9ja2RpdjsKKwkJfQorCisJCVBERUJVRyg0LCAiU2V0dGluZyBjbG9jayBkaXZpc29yIHRvICVkIiwgY2xvY2spOworCisJCWkyY193KG92LCAweDExLCBjbG9jayk7CisJfQorCisJLyoqKioqKioqIFNwZWNpYWwgRmVhdHVyZXMgKioqKioqKiovCisKKwlpZiAoZnJhbWVkcm9wID49IDApCisJCWkyY193KG92LCAweDE2LCBmcmFtZWRyb3ApOworCisJLyogVGVzdCBQYXR0ZXJuICovCisJaTJjX3dfbWFzayhvdiwgMHgxMiwgKHRlc3RwYXQ/MHgwMjoweDAwKSwgMHgwMik7CisKKwkvKiBFbmFibGUgYXV0byB3aGl0ZSBiYWxhbmNlICovCisJaTJjX3dfbWFzayhvdiwgMHgxMiwgMHgwNCwgMHgwNCk7CisKKwkvLyBUaGlzIHdpbGwgZ28gYXdheSBhcyBzb29uIGFzIG92NTF4X21vZGVfaW5pdF9zZW5zb3JfcmVncygpCisJLy8gaXMgZnVsbHkgdGVzdGVkLgorCS8qIDc2MjAvNjYyMC82NjMwPyBkb24ndCBoYXZlIHJlZ2lzdGVyIDB4MzUsIHNvIHBsYXkgaXQgc2FmZSAqLworCWlmIChvdi0+c2Vuc29yID09IFNFTl9PVjc2MTAgfHwgb3YtPnNlbnNvciA9PSBTRU5fT1Y3NkJFKSB7CisJCWlmICh3aWR0aCA9PSA2NDAgJiYgaGVpZ2h0ID09IDQ4MCkKKwkJCWkyY193KG92LCAweDM1LCAweDllKTsKKwkJZWxzZQorCQkJaTJjX3cob3YsIDB4MzUsIDB4MWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZXRfb3Zfc2Vuc29yX3dpbmRvdyhzdHJ1Y3QgdXNiX292NTExICpvdiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbW9kZSwKKwkJICAgICBpbnQgc3ViX2ZsYWcpCit7CisJaW50IHJldDsKKwlpbnQgaHdzYmFzZSwgaHdlYmFzZSwgdndzYmFzZSwgdndlYmFzZSwgaHdzaXplLCB2d3NpemU7IAorCWludCBob2Zmc2V0LCB2b2Zmc2V0LCBod3NjYWxlID0gMCwgdndzY2FsZSA9IDA7CisKKwkvKiBUaGUgZGlmZmVyZW50IHNlbnNvciBJQ3MgaGFuZGxlIHNldHRpbmcgdXAgb2Ygd2luZG93IGRpZmZlcmVudGx5LgorCSAqIElGIFlPVSBTRVQgSVQgV1JPTkcsIFlPVSBXSUxMIEdFVCBBTEwgWkVSTyBJU09DIERBVEEgRlJPTSBPVjUxeCEhISAqLworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX09WNzYxMDoKKwljYXNlIFNFTl9PVjc2QkU6CisJCWh3c2Jhc2UgPSAweDM4OworCQlod2ViYXNlID0gMHgzYTsKKwkJdndzYmFzZSA9IHZ3ZWJhc2UgPSAweDA1OworCQlicmVhazsKKwljYXNlIFNFTl9PVjY2MjA6CisJY2FzZSBTRU5fT1Y2NjMwOgorCQlod3NiYXNlID0gMHgzODsKKwkJaHdlYmFzZSA9IDB4M2E7CisJCXZ3c2Jhc2UgPSAweDA1OworCQl2d2ViYXNlID0gMHgwNjsKKwkJYnJlYWs7CisJY2FzZSBTRU5fT1Y3NjIwOgorCQlod3NiYXNlID0gMHgyZjsJCS8qIEZyb20gNzYyMC5TRVQgKHNwZWMgaXMgd3JvbmcpICovCisJCWh3ZWJhc2UgPSAweDJmOworCQl2d3NiYXNlID0gdndlYmFzZSA9IDB4MDU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycigiSW52YWxpZCBzZW5zb3IiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG92LT5zZW5zb3IgPT0gU0VOX09WNjYyMCB8fCBvdi0+c2Vuc29yID09IFNFTl9PVjY2MzApIHsKKwkJLyogTm90ZTogT1Y1MTgoKykgZG9lcyBkb3duc2FtcGxlIG9uIGl0cyBvd24pICovCisJCWlmICgod2lkdGggPiAxNzYgJiYgaGVpZ2h0ID4gMTQ0KQorCQkgICAgfHwgb3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpIHsgIC8qIENJRiAqLworCQkJcmV0ID0gbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKG92LCB3aWR0aCwgaGVpZ2h0LAorCQkJCW1vZGUsIHN1Yl9mbGFnLCAwKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlod3NjYWxlID0gMTsKKwkJCXZ3c2NhbGUgPSAxOyAgLyogVGhlIGRhdGFzaGVldCBzYXlzIDA7IGl0J3Mgd3JvbmcgKi8KKwkJCWh3c2l6ZSA9IDM1MjsKKwkJCXZ3c2l6ZSA9IDI4ODsKKwkJfSBlbHNlIGlmICh3aWR0aCA+IDE3NiB8fCBoZWlnaHQgPiAxNDQpIHsKKwkJCWVycigiSWxsZWdhbCBkaW1lbnNpb25zIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsJCQkgICAgLyogUUNJRiAqLworCQkJcmV0ID0gbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKG92LCB3aWR0aCwgaGVpZ2h0LAorCQkJCW1vZGUsIHN1Yl9mbGFnLCAxKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlod3NpemUgPSAxNzY7CisJCQl2d3NpemUgPSAxNDQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAod2lkdGggPiAzMjAgJiYgaGVpZ2h0ID4gMjQwKSB7ICAvKiBWR0EgKi8KKwkJCXJldCA9IG1vZGVfaW5pdF9vdl9zZW5zb3JfcmVncyhvdiwgd2lkdGgsIGhlaWdodCwKKwkJCQltb2RlLCBzdWJfZmxhZywgMCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJaHdzY2FsZSA9IDI7CisJCQl2d3NjYWxlID0gMTsKKwkJCWh3c2l6ZSA9IDY0MDsKKwkJCXZ3c2l6ZSA9IDQ4MDsKKwkJfSBlbHNlIGlmICh3aWR0aCA+IDMyMCB8fCBoZWlnaHQgPiAyNDApIHsKKwkJCWVycigiSWxsZWdhbCBkaW1lbnNpb25zIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsJCQkgICAgLyogUVZHQSAqLworCQkJcmV0ID0gbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKG92LCB3aWR0aCwgaGVpZ2h0LAorCQkJCW1vZGUsIHN1Yl9mbGFnLCAxKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlod3NjYWxlID0gMTsKKwkJCWh3c2l6ZSA9IDMyMDsKKwkJCXZ3c2l6ZSA9IDI0MDsKKwkJfQorCX0KKworCS8qIENlbnRlciB0aGUgd2luZG93ICovCisJaG9mZnNldCA9ICgoaHdzaXplIC0gd2lkdGgpIC8gMikgPj4gaHdzY2FsZTsKKwl2b2Zmc2V0ID0gKCh2d3NpemUgLSBoZWlnaHQpIC8gMikgPj4gdndzY2FsZTsKKworCS8qIEZJWE1FISAtIFRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBzdXBwb3J0IDE2MHgxMjAgYW5kIDY2MjAhISEgKi8KKwlpZiAoc3ViX2ZsYWcpIHsKKwkJaTJjX3cob3YsIDB4MTcsIGh3c2Jhc2UrKG92LT5zdWJ4Pj5od3NjYWxlKSk7CisJCWkyY193KG92LCAweDE4LAlod2ViYXNlKygob3YtPnN1Yngrb3YtPnN1YncpPj5od3NjYWxlKSk7CisJCWkyY193KG92LCAweDE5LCB2d3NiYXNlKyhvdi0+c3VieT4+dndzY2FsZSkpOworCQlpMmNfdyhvdiwgMHgxYSwgdndlYmFzZSsoKG92LT5zdWJ5K292LT5zdWJoKT4+dndzY2FsZSkpOworCX0gZWxzZSB7CisJCWkyY193KG92LCAweDE3LCBod3NiYXNlICsgaG9mZnNldCk7CisJCWkyY193KG92LCAweDE4LCBod2ViYXNlICsgaG9mZnNldCArIChod3NpemU+Pmh3c2NhbGUpKTsKKwkJaTJjX3cob3YsIDB4MTksIHZ3c2Jhc2UgKyB2b2Zmc2V0KTsKKwkJaTJjX3cob3YsIDB4MWEsIHZ3ZWJhc2UgKyB2b2Zmc2V0ICsgKHZ3c2l6ZT4+dndzY2FsZSkpOworCX0KKworI2lmZGVmIE9WNTExX0RFQlVHCisJaWYgKGR1bXBfc2Vuc29yKQorCQlkdW1wX2kyY19yZWdzKG92KTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCB1cCB0aGUgT1Y1MTEvT1Y1MTErIHdpdGggdGhlIGdpdmVuIGltYWdlIHBhcmFtZXRlcnMuCisgKgorICogRG8gbm90IHB1dCBhbnkgc2Vuc29yLXNwZWNpZmljIGNvZGUgaW4gaGVyZSAoaW5jbHVkaW5nIEkyQyBJL08gZnVuY3Rpb25zKQorICovCitzdGF0aWMgaW50CitvdjUxMV9tb2RlX2luaXRfcmVncyhzdHJ1Y3QgdXNiX292NTExICpvdiwKKwkJICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBtb2RlLCBpbnQgc3ViX2ZsYWcpCit7CisJaW50IGhzZWdzLCB2c2VnczsKKworCWlmIChzdWJfZmxhZykgeworCQl3aWR0aCA9IG92LT5zdWJ3OworCQloZWlnaHQgPSBvdi0+c3ViaDsKKwl9CisKKwlQREVCVUcoMywgIndpZHRoOiVkLCBoZWlnaHQ6JWQsIG1vZGU6JWQsIHN1YjolZCIsCisJICAgICAgIHdpZHRoLCBoZWlnaHQsIG1vZGUsIHN1Yl9mbGFnKTsKKworCS8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byBhIDcxMTFhLXNwZWNpZmljIGZ1bmN0aW9uIG9uY2UKKwkvLyBzdWJjYXB0dXJlIGlzIGRlYWx0IHdpdGggcHJvcGVybHkKKwlpZiAob3YtPnNlbnNvciA9PSBTRU5fU0FBNzExMUEpIHsKKwkJaWYgKHdpZHRoID09IDMyMCAmJiBoZWlnaHQgPT0gMjQwKSB7CisJCQkvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgKi8KKwkJfSBlbHNlIGlmICh3aWR0aCA9PSA2NDAgJiYgaGVpZ2h0ID09IDQ4MCkgeworCQkJLyogU2V0IHRoZSBPVjUxMSB1cCBhcyAzMjB4NDgwLCBidXQga2VlcCB0aGUKKwkJCSAqIFY0TCByZXNvbHV0aW9uIGFzIDY0MHg0ODAgKi8KKwkJCXdpZHRoID0gMzIwOworCQl9IGVsc2UgeworCQkJZXJyKCJTQUE3MTExQSBvbmx5IGFsbG93cyAzMjB4MjQwIG9yIDY0MHg0ODAiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogTWFrZSBzdXJlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGEgbXVsdGlwbGUgb2YgOCAqLworCWlmICh3aWR0aCAlIDggfHwgaGVpZ2h0ICUgOCkgeworCQllcnIoIkludmFsaWQgc2l6ZSAoJWQsICVkKSAobW9kZSA9ICVkKSIsIHdpZHRoLCBoZWlnaHQsIG1vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAod2lkdGggPCBvdi0+bWlud2lkdGggfHwgaGVpZ2h0IDwgb3YtPm1pbmhlaWdodCkgeworCQllcnIoIlJlcXVlc3RlZCBkaW1lbnNpb25zIGFyZSB0b28gc21hbGwiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG92NTF4X3N0b3Aob3YpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAobW9kZSA9PSBWSURFT19QQUxFVFRFX0dSRVkpIHsKKwkJcmVnX3cob3YsIFI1MTFfQ0FNX1VWX0VOLCAweDAwKTsKKwkJcmVnX3cob3YsIFI1MTFfU05BUF9VVl9FTiwgMHgwMCk7CisJCXJlZ193KG92LCBSNTExX1NOQVBfT1BUUywgMHgwMSk7CisJfSBlbHNlIHsKKwkJcmVnX3cob3YsIFI1MTFfQ0FNX1VWX0VOLCAweDAxKTsKKwkJcmVnX3cob3YsIFI1MTFfU05BUF9VVl9FTiwgMHgwMSk7CisJCXJlZ193KG92LCBSNTExX1NOQVBfT1BUUywgMHgwMyk7CisJfQorCisJLyogSGVyZSBJJ20gYXNzdW1pbmcgdGhhdCBzbmFwc2hvdCBzaXplID09IGltYWdlIHNpemUuCisJICogSSBob3BlIHRoYXQncyBhbHdheXMgdHJ1ZS4gLS1jbGF1ZGlvCisJICovCisJaHNlZ3MgPSAod2lkdGggPj4gMykgLSAxOworCXZzZWdzID0gKGhlaWdodCA+PiAzKSAtIDE7CisKKwlyZWdfdyhvdiwgUjUxMV9DQU1fUFhDTlQsIGhzZWdzKTsKKwlyZWdfdyhvdiwgUjUxMV9DQU1fTE5DTlQsIHZzZWdzKTsKKwlyZWdfdyhvdiwgUjUxMV9DQU1fUFhESVYsIDB4MDApOworCXJlZ193KG92LCBSNTExX0NBTV9MTkRJViwgMHgwMCk7CisKKwkvKiBZVVY0MjAsIGxvdyBwYXNzIGZpbHRlciBvbiAqLworCXJlZ193KG92LCBSNTExX0NBTV9PUFRTLCAweDAzKTsKKworCS8qIFNuYXBzaG90IGFkZGl0aW9ucyAqLworCXJlZ193KG92LCBSNTExX1NOQVBfUFhDTlQsIGhzZWdzKTsKKwlyZWdfdyhvdiwgUjUxMV9TTkFQX0xOQ05ULCB2c2Vncyk7CisJcmVnX3cob3YsIFI1MTFfU05BUF9QWERJViwgMHgwMCk7CisJcmVnX3cob3YsIFI1MTFfU05BUF9MTkRJViwgMHgwMCk7CisKKwlpZiAob3YtPmNvbXByZXNzKSB7CisJCS8qIEVuYWJsZSBZIGFuZCBVViBxdWFudGl6YXRpb24gYW5kIGNvbXByZXNzaW9uICovCisJCXJlZ193KG92LCBSNTExX0NPTVBfRU4sIDB4MDcpOworCQlyZWdfdyhvdiwgUjUxMV9DT01QX0xVVF9FTiwgMHgwMyk7CisJCW92NTF4X3Jlc2V0KG92LCBPVjUxMV9SRVNFVF9PTU5JQ0UpOworCX0KKworCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldHMgdXAgdGhlIE9WNTE4L09WNTE4KyB3aXRoIHRoZSBnaXZlbiBpbWFnZSBwYXJhbWV0ZXJzCisgKgorICogT1Y1MTggbmVlZHMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBhcHByb2FjaCwgdW50aWwgd2UgY2FuIGZpZ3VyZSBvdXQgd2hhdAorICogdGhlIGluZGl2aWR1YWwgcmVnaXN0ZXJzIGRvLiBBbHNvLCBvbmx5IDE1IEZQUyBpcyBzdXBwb3J0ZWQgbm93LgorICoKKyAqIERvIG5vdCBwdXQgYW55IHNlbnNvci1zcGVjaWZpYyBjb2RlIGluIGhlcmUgKGluY2x1ZGluZyBJMkMgSS9PIGZ1bmN0aW9ucykKKyAqLworc3RhdGljIGludAorb3Y1MThfbW9kZV9pbml0X3JlZ3Moc3RydWN0IHVzYl9vdjUxMSAqb3YsCisJCSAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbW9kZSwgaW50IHN1Yl9mbGFnKQoreworCWludCBoc2VncywgdnNlZ3MsIGhpX3JlczsKKworCWlmIChzdWJfZmxhZykgeworCQl3aWR0aCA9IG92LT5zdWJ3OworCQloZWlnaHQgPSBvdi0+c3ViaDsKKwl9CisKKwlQREVCVUcoMywgIndpZHRoOiVkLCBoZWlnaHQ6JWQsIG1vZGU6JWQsIHN1YjolZCIsCisJICAgICAgIHdpZHRoLCBoZWlnaHQsIG1vZGUsIHN1Yl9mbGFnKTsKKworCWlmICh3aWR0aCAlIDE2IHx8IGhlaWdodCAlIDgpIHsKKwkJZXJyKCJJbnZhbGlkIHNpemUgKCVkLCAlZCkiLCB3aWR0aCwgaGVpZ2h0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdpZHRoIDwgb3YtPm1pbndpZHRoIHx8IGhlaWdodCA8IG92LT5taW5oZWlnaHQpIHsKKwkJZXJyKCJSZXF1ZXN0ZWQgZGltZW5zaW9ucyBhcmUgdG9vIHNtYWxsIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh3aWR0aCA+PSAzMjAgJiYgaGVpZ2h0ID49IDI0MCkgeworCQloaV9yZXMgPSAxOworCX0gZWxzZSBpZiAod2lkdGggPj0gMzIwIHx8IGhlaWdodCA+PSAyNDApIHsKKwkJZXJyKCJJbnZhbGlkIHdpZHRoL2hlaWdodCBjb21iaW5hdGlvbiAoJWQsICVkKSIsIHdpZHRoLCBoZWlnaHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQloaV9yZXMgPSAwOworCX0KKworCWlmIChvdjUxeF9zdG9wKG92KSA8IDApCisJCXJldHVybiAtRUlPOworCisJLyoqKioqKioqIFNldCB0aGUgbW9kZSAqKioqKioqKi8KKworCXJlZ193KG92LCAweDJiLCAwKTsKKwlyZWdfdyhvdiwgMHgyYywgMCk7CisJcmVnX3cob3YsIDB4MmQsIDApOworCXJlZ193KG92LCAweDJlLCAwKTsKKwlyZWdfdyhvdiwgMHgzYiwgMCk7CisJcmVnX3cob3YsIDB4M2MsIDApOworCXJlZ193KG92LCAweDNkLCAwKTsKKwlyZWdfdyhvdiwgMHgzZSwgMCk7CisKKwlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTggJiYgb3Y1MThfY29sb3IpIHsKKwkJLyogT1Y1MTggbmVlZHMgVSBhbmQgViBzd2FwcGVkICovCisJCWkyY193X21hc2sob3YsIDB4MTUsIDB4MDAsIDB4MDEpOworCisJIAlpZiAobW9kZSA9PSBWSURFT19QQUxFVFRFX0dSRVkpIHsKKwkJCS8qIFNldCAxNi1iaXQgaW5wdXQgZm9ybWF0IChVViBkYXRhIGFyZSBpZ25vcmVkKSAqLworCQkJcmVnX3dfbWFzayhvdiwgMHgyMCwgMHgwMCwgMHgwOCk7CisKKwkJCS8qIFNldCA4LWJpdCAoNDowOjApIG91dHB1dCBmb3JtYXQgKi8KKwkJCXJlZ193X21hc2sob3YsIDB4MjgsIDB4MDAsIDB4ZjApOworCQkJcmVnX3dfbWFzayhvdiwgMHgzOCwgMHgwMCwgMHhmMCk7CisJCX0gZWxzZSB7CisJCQkvKiBTZXQgOC1iaXQgKFlWWVUpIGlucHV0IGZvcm1hdCAqLworCQkJcmVnX3dfbWFzayhvdiwgMHgyMCwgMHgwOCwgMHgwOCk7CisKKwkJCS8qIFNldCAxMi1iaXQgKDQ6MjowKSBvdXRwdXQgZm9ybWF0ICovCisJCQlyZWdfd19tYXNrKG92LCAweDI4LCAweDgwLCAweGYwKTsKKwkJCXJlZ193X21hc2sob3YsIDB4MzgsIDB4ODAsIDB4ZjApOworCQl9CisJfSBlbHNlIHsKKwkJcmVnX3cob3YsIDB4MjgsIChtb2RlID09IFZJREVPX1BBTEVUVEVfR1JFWSkgPyAweDAwOjB4ODApOworCQlyZWdfdyhvdiwgMHgzOCwgKG1vZGUgPT0gVklERU9fUEFMRVRURV9HUkVZKSA/IDB4MDA6MHg4MCk7CisJfQorCisJaHNlZ3MgPSB3aWR0aCAvIDE2OworCXZzZWdzID0gaGVpZ2h0IC8gNDsKKworCXJlZ193KG92LCAweDI5LCBoc2Vncyk7CisJcmVnX3cob3YsIDB4MmEsIHZzZWdzKTsKKworCXJlZ193KG92LCAweDM5LCBoc2Vncyk7CisJcmVnX3cob3YsIDB4M2EsIHZzZWdzKTsKKworCS8qIFdpbmRvd3MgZHJpdmVyIGRvZXMgdGhpcyBoZXJlOyB3aG8ga25vd3Mgd2h5ICovCisJcmVnX3cob3YsIDB4MmYsIDB4ODApOworCisJLyoqKioqKioqIFNldCB0aGUgZnJhbWVyYXRlICh0byAxNSBGUFMpICoqKioqKioqLworCisJLyogTW9kZSBpbmRlcGVuZGVudCwgYnV0IGZyYW1lcmF0ZSBkZXBlbmRlbnQsIHJlZ3MgKi8KKwlyZWdfdyhvdiwgMHg1MSwgMHgwMik7CS8qIENsb2NrIGRpdmlkZXI7IGxvd2VyPT1mYXN0ZXIgKi8KKwlyZWdfdyhvdiwgMHgyMiwgMHgxOCk7CisJcmVnX3cob3YsIDB4MjMsIDB4ZmYpOworCisJaWYgKG92LT5icmlkZ2UgPT0gQlJHX09WNTE4UExVUykKKwkJcmVnX3cob3YsIDB4MjEsIDB4MTkpOworCWVsc2UKKwkJcmVnX3cob3YsIDB4NzEsIDB4MTkpOwkvKiBDb21wcmVzc2lvbi1yZWxhdGVkPyAqLworCisJLy8gRklYTUU6IFNlbnNvci1zcGVjaWZpYworCS8qIEJpdCA1IGlzIHdoYXQgbWF0dGVycyBoZXJlLiBPZiBjb3Vyc2UsIGl0IGlzICJyZXNlcnZlZCIgKi8KKwlpMmNfdyhvdiwgMHg1NCwgMHgyMyk7CisKKwlyZWdfdyhvdiwgMHgyZiwgMHg4MCk7CisKKwlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MThQTFVTKSB7CisJCXJlZ193KG92LCAweDI0LCAweDk0KTsKKwkJcmVnX3cob3YsIDB4MjUsIDB4OTApOworCQlvdjUxOF9yZWdfdzMyKG92LCAweGM0LCAgICA0MDAsIDIpOwkvKiAxOTBoICAgKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjNiwgICAgNTQwLCAyKTsJLyogMjFjaCAgICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4YzcsICAgIDU0MCwgMik7CS8qIDIxY2ggICAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweGM4LCAgICAxMDgsIDIpOwkvKiA2Y2ggICAgKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjYSwgMTMxMDk4LCAzKTsJLyogMjAwMWFoICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4Y2IsICAgIDUzMiwgMik7CS8qIDIxNGggICAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweGNjLCAgIDI0MDAsIDIpOwkvKiA5NjBoICAgKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjZCwgICAgIDMyLCAyKTsJLyogMjBoICAgICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4Y2UsICAgIDYwOCwgMik7CS8qIDI2MGggICAqLworCX0gZWxzZSB7CisJCXJlZ193KG92LCAweDI0LCAweDlmKTsKKwkJcmVnX3cob3YsIDB4MjUsIDB4OTApOworCQlvdjUxOF9yZWdfdzMyKG92LCAweGM0LCAgICA0MDAsIDIpOwkvKiAxOTBoICAgKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjNiwgICAgNTAwLCAyKTsJLyogMWY0aCAgICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4YzcsICAgIDUwMCwgMik7CS8qIDFmNGggICAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweGM4LCAgICAxNDIsIDIpOwkvKiA4ZWggICAgKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjYSwgMTMxMDk4LCAzKTsJLyogMjAwMWFoICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4Y2IsICAgIDUzMiwgMik7CS8qIDIxNGggICAqLworCQlvdjUxOF9yZWdfdzMyKG92LCAweGNjLCAgIDIwMDAsIDIpOwkvKiA3ZDBoICAgKi8KKwkJb3Y1MThfcmVnX3czMihvdiwgMHhjZCwgICAgIDMyLCAyKTsJLyogMjBoICAgICovCisJCW92NTE4X3JlZ193MzIob3YsIDB4Y2UsICAgIDYwOCwgMik7CS8qIDI2MGggICAqLworCX0KKworCXJlZ193KG92LCAweDJmLCAweDgwKTsKKworCWlmIChvdjUxeF9yZXN0YXJ0KG92KSA8IDApCisJCXJldHVybiAtRUlPOworCisJLyogUmVzZXQgaXQganVzdCBmb3IgZ29vZCBtZWFzdXJlICovCisJaWYgKG92NTF4X3Jlc2V0KG92LCBPVjUxMV9SRVNFVF9OT1JFR1MpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBPVjUxMSwgT1Y1MTgsIGFuZCBzZW5zb3Igc3BlY2lmaWMgZnVuY3Rpb25zICovCitzdGF0aWMgaW50Cittb2RlX2luaXRfcmVncyhzdHJ1Y3QgdXNiX292NTExICpvdiwKKwkgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbW9kZSwgaW50IHN1Yl9mbGFnKQoreworCWludCByYyA9IDA7CisKKwlpZiAoIW92IHx8ICFvdi0+ZGV2KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgeworCQlyYyA9IG92NTE4X21vZGVfaW5pdF9yZWdzKG92LCB3aWR0aCwgaGVpZ2h0LCBtb2RlLCBzdWJfZmxhZyk7CisJfSBlbHNlIHsKKwkJcmMgPSBvdjUxMV9tb2RlX2luaXRfcmVncyhvdiwgd2lkdGgsIGhlaWdodCwgbW9kZSwgc3ViX2ZsYWcpOworCX0KKworCWlmIChGQVRBTF9FUlJPUihyYykpCisJCXJldHVybiByYzsKKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX09WNzYxMDoKKwljYXNlIFNFTl9PVjc2MjA6CisJY2FzZSBTRU5fT1Y3NkJFOgorCWNhc2UgU0VOX09WODYwMDoKKwljYXNlIFNFTl9PVjY2MjA6CisJY2FzZSBTRU5fT1Y2NjMwOgorCQlyYyA9IHNldF9vdl9zZW5zb3Jfd2luZG93KG92LCB3aWR0aCwgaGVpZ2h0LCBtb2RlLCBzdWJfZmxhZyk7CisJCWJyZWFrOworCWNhc2UgU0VOX0tTMDEyNzoKKwljYXNlIFNFTl9LUzAxMjdCOgorCQllcnIoIktTMDEyNy1zZXJpZXMgZGVjb2RlcnMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFNFTl9TQUE3MTExQToKKy8vCQlyYyA9IG1vZGVfaW5pdF9zYWFfc2Vuc29yX3JlZ3Mob3YsIHdpZHRoLCBoZWlnaHQsIG1vZGUsCisvLwkJCQkJICAgICAgIHN1Yl9mbGFnKTsKKworCQlQREVCVUcoMSwgIlNBQSBzdGF0dXMgPSAweCUwMlgiLCBpMmNfcihvdiwgMHgxZikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoIlVua25vd24gc2Vuc29yIik7CisJCXJjID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoRkFUQUxfRVJST1IocmMpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBTZW5zb3ItaW5kZXBlbmRlbnQgc2V0dGluZ3MgKi8KKwlyYyA9IHNlbnNvcl9zZXRfYXV0b19icmlnaHRuZXNzKG92LCBvdi0+YXV0b19icnQpOworCWlmIChGQVRBTF9FUlJPUihyYykpCisJCXJldHVybiByYzsKKworCXJjID0gc2Vuc29yX3NldF9hdXRvX2V4cG9zdXJlKG92LCBvdi0+YXV0b19leHApOworCWlmIChGQVRBTF9FUlJPUihyYykpCisJCXJldHVybiByYzsKKworCXJjID0gc2Vuc29yX3NldF9iYW5kaW5nX2ZpbHRlcihvdiwgYmFuZGluZ2ZpbHRlcik7CisJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJaWYgKG92LT5saWdodGZyZXEpIHsKKwkJcmMgPSBzZW5zb3Jfc2V0X2xpZ2h0X2ZyZXEob3YsIGxpZ2h0ZnJlcSk7CisJCWlmIChGQVRBTF9FUlJPUihyYykpCisJCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBzZW5zb3Jfc2V0X2JhY2tsaWdodChvdiwgb3YtPmJhY2tsaWdodCk7CisJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJcmMgPSBzZW5zb3Jfc2V0X21pcnJvcihvdiwgb3YtPm1pcnJvcik7CisJaWYgKEZBVEFMX0VSUk9SKHJjKSkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBpbWFnZSBwYXJhbWV0ZXJzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXBwcyB0aGF0IHVzZQorICogcmVhZCgpIGFuZCBkbyBub3Qgc2V0IHRoZXNlLgorICovCitzdGF0aWMgaW50CitvdjUxeF9zZXRfZGVmYXVsdF9wYXJhbXMoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW50IGk7CisKKwkvKiBTZXQgZGVmYXVsdCBzaXplcyBpbiBjYXNlIElPQ1RMIChWSURJT0NNQ0FQVFVSRSkgaXMgbm90IHVzZWQKKwkgKiAodXNpbmcgcmVhZCgpIGluc3RlYWQpLiAqLworCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1GUkFNRVM7IGkrKykgeworCQlvdi0+ZnJhbWVbaV0ud2lkdGggPSBvdi0+bWF4d2lkdGg7CisJCW92LT5mcmFtZVtpXS5oZWlnaHQgPSBvdi0+bWF4aGVpZ2h0OworCQlvdi0+ZnJhbWVbaV0uYnl0ZXNfcmVhZCA9IDA7CisJCWlmIChmb3JjZV9wYWxldHRlKQorCQkJb3YtPmZyYW1lW2ldLmZvcm1hdCA9IGZvcmNlX3BhbGV0dGU7CisJCWVsc2UKKwkJCW92LT5mcmFtZVtpXS5mb3JtYXQgPSBWSURFT19QQUxFVFRFX1lVVjQyMDsKKworCQlvdi0+ZnJhbWVbaV0uZGVwdGggPSBnZXRfZGVwdGgob3YtPmZyYW1lW2ldLmZvcm1hdCk7CisJfQorCisJUERFQlVHKDMsICIlZHglZCwgJXMiLCBvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQsCisJICAgICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIG92LT5mcmFtZVswXS5mb3JtYXQpKTsKKworCS8qIEluaXRpYWxpemUgdG8gbWF4IHdpZHRoL2hlaWdodCwgWVVWNDIwIG9yIFJHQjI0IChpZiBzdXBwb3J0ZWQpICovCisJaWYgKG1vZGVfaW5pdF9yZWdzKG92LCBvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQsCisJCQkgICBvdi0+ZnJhbWVbMF0uZm9ybWF0LCAwKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVmlkZW8gZGVjb2RlciBzdHVmZgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTZXQgYW5hbG9nIGlucHV0IHBvcnQgb2YgZGVjb2RlciAqLworc3RhdGljIGludAorZGVjb2Rlcl9zZXRfaW5wdXQoc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBpbnB1dCkKK3sKKwlQREVCVUcoNCwgInBvcnQgJWQiLCBpbnB1dCk7CisKKwlzd2l0Y2ggKG92LT5zZW5zb3IpIHsKKwljYXNlIFNFTl9TQUE3MTExQToKKwl7CisJCS8qIFNlbGVjdCBtb2RlICovCisJCWkyY193X21hc2sob3YsIDB4MDIsIGlucHV0LCAweDA3KTsKKwkJLyogQnlwYXNzIGNocm9taW5hbmNlIHRyYXAgZm9yIG1vZGVzIDQuLjcgKi8KKwkJaTJjX3dfbWFzayhvdiwgMHgwOSwgKGlucHV0ID4gMykgPyAweDgwOjB4MDAsIDB4ODApOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCBBU0NJSSBuYW1lIG9mIHZpZGVvIGlucHV0ICovCitzdGF0aWMgaW50CitkZWNvZGVyX2dldF9pbnB1dF9uYW1lKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgaW5wdXQsIGNoYXIgKm5hbWUpCit7CisJc3dpdGNoIChvdi0+c2Vuc29yKSB7CisJY2FzZSBTRU5fU0FBNzExMUE6CisJeworCQlpZiAoaW5wdXQgPCAwIHx8IGlucHV0ID4gNykKKwkJCXJldHVybiAtRUlOVkFMOworCQllbHNlIGlmIChpbnB1dCA8IDQpCisJCQlzcHJpbnRmKG5hbWUsICJDVkJTLSVkIiwgaW5wdXQpOworCQllbHNlIC8vIGlmIChpbnB1dCA8IDgpCisJCQlzcHJpbnRmKG5hbWUsICJTLVZpZGVvLSVkIiwgaW5wdXQgLSA0KTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXNwcmludGYobmFtZSwgIiVzIiwgIkNhbWVyYSIpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBTZXQgbm9ybSAoTlRTQywgUEFMLCBTRUNBTSwgQVVUTykgKi8KK3N0YXRpYyBpbnQKK2RlY29kZXJfc2V0X25vcm0oc3RydWN0IHVzYl9vdjUxMSAqb3YsIGludCBub3JtKQoreworCVBERUJVRyg0LCAiJWQiLCBub3JtKTsKKworCXN3aXRjaCAob3YtPnNlbnNvcikgeworCWNhc2UgU0VOX1NBQTcxMTFBOgorCXsKKwkJaW50IHJlZ184LCByZWdfZTsKKworCQlpZiAobm9ybSA9PSBWSURFT19NT0RFX05UU0MpIHsKKwkJCXJlZ184ID0gMHg0MDsJLyogNjAgSHogKi8KKwkJCXJlZ19lID0gMHgwMDsJLyogTlRTQyBNIC8gUEFMIEJHSEkgKi8KKwkJfSBlbHNlIGlmIChub3JtID09IFZJREVPX01PREVfUEFMKSB7CisJCQlyZWdfOCA9IDB4MDA7CS8qIDUwIEh6ICovCisJCQlyZWdfZSA9IDB4MDA7CS8qIE5UU0MgTSAvIFBBTCBCR0hJICovCisJCX0gZWxzZSBpZiAobm9ybSA9PSBWSURFT19NT0RFX0FVVE8pIHsKKwkJCXJlZ184ID0gMHg4MDsJLyogQXV0byBmaWVsZCBkZXRlY3QgKi8KKwkJCXJlZ19lID0gMHgwMDsJLyogTlRTQyBNIC8gUEFMIEJHSEkgKi8KKwkJfSBlbHNlIGlmIChub3JtID09IFZJREVPX01PREVfU0VDQU0pIHsKKwkJCXJlZ184ID0gMHgwMDsJLyogNTAgSHogKi8KKwkJCXJlZ19lID0gMHg1MDsJLyogU0VDQU0gLyBQQUwgNC40MyAqLworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpMmNfd19tYXNrKG92LCAweDA4LCByZWdfOCwgMHhjMCk7CisJCWkyY193X21hc2sob3YsIDB4MGUsIHJlZ19lLCAweDcwKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJhdyBkYXRhIHBhcnNpbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29waWVzIGEgNjQtYnl0ZSBzZWdtZW50IGF0IHBJbiB0byBhbiA4eDggYmxvY2sgYXQgcE91dC4gVGhlIHdpZHRoIG9mIHRoZQorICogaW1hZ2UgYXQgcE91dCBpcyBzcGVjaWZpZWQgYnkgdy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCittYWtlXzh4OCh1bnNpZ25lZCBjaGFyICpwSW4sIHVuc2lnbmVkIGNoYXIgKnBPdXQsIGludCB3KQoreworCXVuc2lnbmVkIGNoYXIgKnBPdXQxID0gcE91dDsKKwlpbnQgeCwgeTsKKworCWZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKwkJcE91dDEgPSBwT3V0OworCQlmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CisJCQkqcE91dDErKyA9ICpwSW4rKzsKKwkJfQorCQlwT3V0ICs9IHc7CisJfQorfQorCisvKgorICogRm9yIFJBVyBCVyAoWVVWIDQ6MDowKSBpbWFnZXMsIGRhdGEgc2hvdyB1cCBpbiAyNTYgYnl0ZSBzZWdtZW50cy4KKyAqIFRoZSBzZWdtZW50cyByZXByZXNlbnQgNCBzcXVhcmVzIG9mIDh4OCBwaXhlbHMgYXMgZm9sbG93czoKKyAqCisgKiAgICAgIDAgIDEgLi4uICA3ICAgIDY0ICA2NSAuLi4gIDcxICAgLi4uICAxOTIgMTkzIC4uLiAxOTkKKyAqICAgICAgOCAgOSAuLi4gMTUgICAgNzIgIDczIC4uLiAgNzkgICAgICAgIDIwMCAyMDEgLi4uIDIwNworICogICAgICAgICAgIC4uLiAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAuLi4KKyAqICAgICA1NiA1NyAuLi4gNjMgICAxMjAgMTIxIC4uLiAxMjcgICAgICAgIDI0OCAyNDkgLi4uIDI1NQorICoKKyAqLyAKK3N0YXRpYyB2b2lkCit5dXY0MDByYXdfdG9feXV2NDAwcChzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKnBJbjAsIHVuc2lnbmVkIGNoYXIgKnBPdXQwKQoreworCWludCB4LCB5OworCXVuc2lnbmVkIGNoYXIgKnBJbiwgKnBPdXQsICpwT3V0TGluZTsKKworCS8qIENvcHkgWSAqLworCXBJbiA9IHBJbjA7CisJcE91dExpbmUgPSBwT3V0MDsKKwlmb3IgKHkgPSAwOyB5IDwgZnJhbWUtPnJhd2hlaWdodCAtIDE7IHkgKz0gOCkgeworCQlwT3V0ID0gcE91dExpbmU7CisJCWZvciAoeCA9IDA7IHggPCBmcmFtZS0+cmF3d2lkdGggLSAxOyB4ICs9IDgpIHsKKwkJCW1ha2VfOHg4KHBJbiwgcE91dCwgZnJhbWUtPnJhd3dpZHRoKTsKKwkJCXBJbiArPSA2NDsKKwkJCXBPdXQgKz0gODsKKwkJfQorCQlwT3V0TGluZSArPSA4ICogZnJhbWUtPnJhd3dpZHRoOworCX0KK30KKworLyoKKyAqIEZvciBZVVYgNDoyOjAgaW1hZ2VzLCB0aGUgZGF0YSBzaG93IHVwIGluIDM4NCBieXRlIHNlZ21lbnRzLgorICogVGhlIGZpcnN0IDY0IGJ5dGVzIG9mIGVhY2ggc2VnbWVudCBhcmUgVSwgdGhlIG5leHQgNjQgYXJlIFYuICBUaGUgVSBhbmQKKyAqIFYgYXJlIGFycmFuZ2VkIGFzIGZvbGxvd3M6CisgKgorICogICAgICAwICAxIC4uLiAgNworICogICAgICA4ICA5IC4uLiAxNQorICogICAgICAgICAgIC4uLiAgIAorICogICAgIDU2IDU3IC4uLiA2MworICoKKyAqIFUgYW5kIFYgYXJlIHNoaXBwZWQgYXQgaGFsZiByZXNvbHV0aW9uICgxIFUsViBzYW1wbGUgLT4gb25lIDJ4MiBibG9jaykuCisgKgorICogVGhlIG5leHQgMjU2IGJ5dGVzIGFyZSBmdWxsIHJlc29sdXRpb24gWSBkYXRhIGFuZCByZXByZXNlbnQgNCBzcXVhcmVzCisgKiBvZiA4eDggcGl4ZWxzIGFzIGZvbGxvd3M6CisgKgorICogICAgICAwICAxIC4uLiAgNyAgICA2NCAgNjUgLi4uICA3MSAgIC4uLiAgMTkyIDE5MyAuLi4gMTk5CisgKiAgICAgIDggIDkgLi4uIDE1ICAgIDcyICA3MyAuLi4gIDc5ICAgICAgICAyMDAgMjAxIC4uLiAyMDcKKyAqICAgICAgICAgICAuLi4gICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgLi4uCisgKiAgICAgNTYgNTcgLi4uIDYzICAgMTIwIDEyMSAuLi4gMTI3ICAgLi4uICAyNDggMjQ5IC4uLiAyNTUKKyAqCisgKiBOb3RlIHRoYXQgdGhlIFUgYW5kIFYgZGF0YSBpbiBvbmUgc2VnbWVudCByZXByZXNlbnQgYSAxNiB4IDE2IHBpeGVsCisgKiBhcmVhLCBidXQgdGhlIFkgZGF0YSByZXByZXNlbnQgYSAzMiB4IDggcGl4ZWwgYXJlYS4gSWYgdGhlIHdpZHRoIGlzIG5vdCBhbgorICogZXZlbiBtdWx0aXBsZSBvZiAzMiwgdGhlIGV4dHJhIDh4OCBibG9ja3Mgd2l0aGluIGEgMzJ4OCBibG9jayBiZWxvbmcgdG8gdGhlCisgKiBuZXh0IGhvcml6b250YWwgc3RyaXBlLgorICoKKyAqIElmIGR1bXBwaXggbW9kdWxlIHBhcmFtIGlzIHNldCwgX3BhcnNlX2RhdGEganVzdCBkdW1wcyB0aGUgaW5jb21pbmcgc2VnbWVudHMsCisgKiB2ZXJiYXRpbSwgaW4gb3JkZXIsIGludG8gdGhlIGZyYW1lLiBXaGVuIHVzZWQgd2l0aCB2aWRjYXQgLWYgcHBtIC1zIDY0MHg0ODAKKyAqIHRoaXMgcHV0cyB0aGUgZGF0YSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBjYW4gYmUgYW5hbHl6ZWQgd2l0aCB0aGUKKyAqIHBhcnNlcHBtLmMgdXRpbGl0eSBJIHdyb3RlLiAgVGhhdCdzIGEgbXVjaCBmYXN0ZXIgd2F5IGZvciBmaWd1cmluZyBvdXQgaG93CisgKiB0aGVzZSBkYXRhIGFyZSBzY3JhbWJsZWQuCisgKi8KKworLyogQ29udmVydHMgZnJvbSByYXcsIHVuY29tcHJlc3NlZCBzZWdtZW50cyBhdCBwSW4wIHRvIGEgWVVWNDIwUCBmcmFtZSBhdCBwT3V0MC4KKyAqCisgKiBGSVhNRTogQ3VycmVudGx5IG9ubHkgaGFuZGxlcyB3aWR0aCBhbmQgaGVpZ2h0IHRoYXQgYXJlIG11bHRpcGxlcyBvZiAxNgorICovCitzdGF0aWMgdm9pZAoreXV2NDIwcmF3X3RvX3l1djQyMHAoc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSwKKwkJICAgICB1bnNpZ25lZCBjaGFyICpwSW4wLCB1bnNpZ25lZCBjaGFyICpwT3V0MCkKK3sKKwlpbnQgaywgeCwgeTsKKwl1bnNpZ25lZCBjaGFyICpwSW4sICpwT3V0LCAqcE91dExpbmU7CisJY29uc3QgdW5zaWduZWQgaW50IGEgPSBmcmFtZS0+cmF3d2lkdGggKiBmcmFtZS0+cmF3aGVpZ2h0OworCWNvbnN0IHVuc2lnbmVkIGludCB3ID0gZnJhbWUtPnJhd3dpZHRoIC8gMjsKKworCS8qIENvcHkgVSBhbmQgViAqLworCXBJbiA9IHBJbjA7CisJcE91dExpbmUgPSBwT3V0MCArIGE7CisJZm9yICh5ID0gMDsgeSA8IGZyYW1lLT5yYXdoZWlnaHQgLSAxOyB5ICs9IDE2KSB7CisJCXBPdXQgPSBwT3V0TGluZTsKKwkJZm9yICh4ID0gMDsgeCA8IGZyYW1lLT5yYXd3aWR0aCAtIDE7IHggKz0gMTYpIHsKKwkJCW1ha2VfOHg4KHBJbiwgcE91dCwgdyk7CisJCQltYWtlXzh4OChwSW4gKyA2NCwgcE91dCArIGEvNCwgdyk7CisJCQlwSW4gKz0gMzg0OworCQkJcE91dCArPSA4OworCQl9CisJCXBPdXRMaW5lICs9IDggKiB3OworCX0KKworCS8qIENvcHkgWSAqLworCXBJbiA9IHBJbjAgKyAxMjg7CisJcE91dExpbmUgPSBwT3V0MDsKKwlrID0gMDsKKwlmb3IgKHkgPSAwOyB5IDwgZnJhbWUtPnJhd2hlaWdodCAtIDE7IHkgKz0gOCkgeworCQlwT3V0ID0gcE91dExpbmU7CisJCWZvciAoeCA9IDA7IHggPCBmcmFtZS0+cmF3d2lkdGggLSAxOyB4ICs9IDgpIHsKKwkJCW1ha2VfOHg4KHBJbiwgcE91dCwgZnJhbWUtPnJhd3dpZHRoKTsKKwkJCXBJbiArPSA2NDsKKwkJCXBPdXQgKz0gODsKKwkJCWlmICgoKytrKSA+IDMpIHsKKwkJCQlrID0gMDsKKwkJCQlwSW4gKz0gMTI4OworCQkJfQorCQl9CisJCXBPdXRMaW5lICs9IDggKiBmcmFtZS0+cmF3d2lkdGg7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlY29tcHJlc3Npb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ2hvb3NlcyBhIGRlY29tcHJlc3Npb24gbW9kdWxlLCBsb2NrcyBpdCwgYW5kIHNldHMgb3YtPmRlY29tcF9vcHMKKyAqIGFjY29yZGluZ2x5LiBSZXR1cm5zIC1FTlhJTyBpZiBkZWNvbXByZXNzb3IgaXMgbm90IGF2YWlsYWJsZSwgb3RoZXJ3aXNlCisgKiByZXR1cm5zIDAgaWYgbm8gb3RoZXIgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK3JlcXVlc3RfZGVjb21wcmVzc29yKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWlmICghb3YpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKG92LT5kZWNvbXBfb3BzKSB7CisJCWVycigiRVJST1I6IERlY29tcHJlc3NvciBhbHJlYWR5IHJlcXVlc3RlZCEiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG9ja19rZXJuZWwoKTsKKworCS8qIFRyeSB0byBnZXQgTU1YLCBhbmQgZmFsbCBiYWNrIG9uIG5vLU1NWCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTEpIHsKKwkJaWYgKG92NTExX21teF9kZWNvbXBfb3BzKSB7CisJCQlQREVCVUcoMywgIlVzaW5nIE9WNTExIE1NWCBkZWNvbXByZXNzb3IiKTsKKwkJCW92LT5kZWNvbXBfb3BzID0gb3Y1MTFfbW14X2RlY29tcF9vcHM7CisJCX0gZWxzZSBpZiAob3Y1MTFfZGVjb21wX29wcykgeworCQkJUERFQlVHKDMsICJVc2luZyBPVjUxMSBkZWNvbXByZXNzb3IiKTsKKwkJCW92LT5kZWNvbXBfb3BzID0gb3Y1MTFfZGVjb21wX29wczsKKwkJfSBlbHNlIHsKKwkJCWVycigiTm8gZGVjb21wcmVzc29yIGF2YWlsYWJsZSIpOworCQl9CisJfSBlbHNlIGlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgeworCQlpZiAob3Y1MThfbW14X2RlY29tcF9vcHMpIHsKKwkJCVBERUJVRygzLCAiVXNpbmcgT1Y1MTggTU1YIGRlY29tcHJlc3NvciIpOworCQkJb3YtPmRlY29tcF9vcHMgPSBvdjUxOF9tbXhfZGVjb21wX29wczsKKwkJfSBlbHNlIGlmIChvdjUxOF9kZWNvbXBfb3BzKSB7CisJCQlQREVCVUcoMywgIlVzaW5nIE9WNTE4IGRlY29tcHJlc3NvciIpOworCQkJb3YtPmRlY29tcF9vcHMgPSBvdjUxOF9kZWNvbXBfb3BzOworCQl9IGVsc2UgeworCQkJZXJyKCJObyBkZWNvbXByZXNzb3IgYXZhaWxhYmxlIik7CisJCX0KKwl9IGVsc2UgeworCQllcnIoIlVua25vd24gYnJpZGdlIik7CisJfQorCisJaWYgKCFvdi0+ZGVjb21wX29wcykKKwkJZ290byBub3N5czsKKworCWlmICghb3YtPmRlY29tcF9vcHMtPm93bmVyKSB7CisJCW92LT5kZWNvbXBfb3BzID0gTlVMTDsKKwkJZ290byBub3N5czsKKwl9CisJCisJaWYgKCF0cnlfbW9kdWxlX2dldChvdi0+ZGVjb21wX29wcy0+b3duZXIpKQorCQlnb3RvIG5vc3lzOworCisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworCisgbm9zeXM6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAtRU5PU1lTOworfQorCisvKiBVbmxvY2tzIGRlY29tcHJlc3Npb24gbW9kdWxlIGFuZCBudWxscyBvdi0+ZGVjb21wX29wcy4gU2FmZSB0byBjYWxsIGV2ZW4KKyAqIGlmIG92LT5kZWNvbXBfb3BzIGlzIE5VTEwuCisgKi8KK3N0YXRpYyB2b2lkCityZWxlYXNlX2RlY29tcHJlc3NvcihzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbnQgcmVsZWFzZWQgPSAwOwkvKiBEaWQgd2UgYWN0dWFsbHkgZG8gYW55dGhpbmc/ICovCisKKwlpZiAoIW92KQorCQlyZXR1cm47CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKG92LT5kZWNvbXBfb3BzKSB7CisJCW1vZHVsZV9wdXQob3YtPmRlY29tcF9vcHMtPm93bmVyKTsKKwkJcmVsZWFzZWQgPSAxOworCX0KKworCW92LT5kZWNvbXBfb3BzID0gTlVMTDsKKworCXVubG9ja19rZXJuZWwoKTsKKworCWlmIChyZWxlYXNlZCkKKwkJUERFQlVHKDMsICJEZWNvbXByZXNzb3IgcmVsZWFzZWQiKTsKK30KKworc3RhdGljIHZvaWQKK2RlY29tcHJlc3Moc3RydWN0IHVzYl9vdjUxMSAqb3YsIHN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWUsCisJICAgdW5zaWduZWQgY2hhciAqcEluMCwgdW5zaWduZWQgY2hhciAqcE91dDApCit7CisJaWYgKCFvdi0+ZGVjb21wX29wcykKKwkJaWYgKHJlcXVlc3RfZGVjb21wcmVzc29yKG92KSkKKwkJCXJldHVybjsKKworCVBERUJVRyg0LCAiRGVjb21wcmVzc2luZyAlZCBieXRlcyIsIGZyYW1lLT5ieXRlc19yZWN2ZCk7CisKKwlpZiAoZnJhbWUtPmZvcm1hdCA9PSBWSURFT19QQUxFVFRFX0dSRVkKKwkgICAgJiYgb3YtPmRlY29tcF9vcHMtPmRlY29tcF80MDApIHsKKwkJaW50IHJldCA9IG92LT5kZWNvbXBfb3BzLT5kZWNvbXBfNDAwKAorCQkJcEluMCwKKwkJCXBPdXQwLAorCQkJZnJhbWUtPmNvbXBidWYsCisJCQlmcmFtZS0+cmF3d2lkdGgsCisJCQlmcmFtZS0+cmF3aGVpZ2h0LAorCQkJZnJhbWUtPmJ5dGVzX3JlY3ZkKTsKKwkJUERFQlVHKDQsICJERUJVRzogZGVjb21wXzQwMCByZXR1cm5lZCAlZCIsIHJldCk7CisJfSBlbHNlIGlmIChmcmFtZS0+Zm9ybWF0ICE9IFZJREVPX1BBTEVUVEVfR1JFWQorCQkgICAmJiBvdi0+ZGVjb21wX29wcy0+ZGVjb21wXzQyMCkgeworCQlpbnQgcmV0ID0gb3YtPmRlY29tcF9vcHMtPmRlY29tcF80MjAoCisJCQlwSW4wLAorCQkJcE91dDAsCisJCQlmcmFtZS0+Y29tcGJ1ZiwKKwkJCWZyYW1lLT5yYXd3aWR0aCwKKwkJCWZyYW1lLT5yYXdoZWlnaHQsCisJCQlmcmFtZS0+Ynl0ZXNfcmVjdmQpOworCQlQREVCVUcoNCwgIkRFQlVHOiBkZWNvbXBfNDIwIHJldHVybmVkICVkIiwgcmV0KTsKKwl9IGVsc2UgeworCQllcnIoIkRlY29tcHJlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZm9ybWF0Iik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZvcm1hdCBjb252ZXJzaW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZ1c2VzIGV2ZW4gYW5kIG9kZCBmaWVsZHMgdG9nZXRoZXIsIGFuZCBkb3VibGVzIHdpZHRoLgorICogSU5QVVQ6IGFuIG9kZCBmaWVsZCBmb2xsb3dlZCBieSBhbiBldmVuIGZpZWxkIGF0IHBJbjAsIGluIFlVViBwbGFuYXIgZm9ybWF0CisgKiBPVVRQVVQ6IGEgbm9ybWFsIFlVViBwbGFuYXIgaW1hZ2UsIHdpdGggY29ycmVjdCBhc3BlY3QgcmF0aW8KKyAqLworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlKHN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWUsIGludCByYXdmb3JtYXQsCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwSW4wLCB1bnNpZ25lZCBjaGFyICpwT3V0MCkKK3sKKwljb25zdCBpbnQgZmllbGRoZWlnaHQgPSBmcmFtZS0+cmF3aGVpZ2h0IC8gMjsKKwljb25zdCBpbnQgZmllbGRwaXggPSBmaWVsZGhlaWdodCAqIGZyYW1lLT5yYXd3aWR0aDsKKwljb25zdCBpbnQgdyA9IGZyYW1lLT53aWR0aDsKKwlpbnQgeCwgeTsKKwl1bnNpZ25lZCBjaGFyICpwSW5FdmVuLCAqcEluT2RkLCAqcE91dDsKKworCVBERUJVRyg1LCAiZmllbGRoZWlnaHQ9JWQiLCBmaWVsZGhlaWdodCk7CisKKwlpZiAoZnJhbWUtPnJhd2hlaWdodCAhPSBmcmFtZS0+aGVpZ2h0KSB7CisJCWVycigiaW52YWxpZCBoZWlnaHQiKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoZnJhbWUtPnJhd3dpZHRoICogMikgIT0gZnJhbWUtPndpZHRoKSB7CisJCWVycigiaW52YWxpZCB3aWR0aCIpOworCQlyZXR1cm47CisJfQorCisJLyogWSAqLworCXBJbk9kZCA9IHBJbjA7CisJcEluRXZlbiA9IHBJbk9kZCArIGZpZWxkcGl4OworCXBPdXQgPSBwT3V0MDsKKwlmb3IgKHkgPSAwOyB5IDwgZmllbGRoZWlnaHQ7IHkrKykgeworCQlmb3IgKHggPSAwOyB4IDwgZnJhbWUtPnJhd3dpZHRoOyB4KyspIHsKKwkJCSpwT3V0ID0gKnBJbkV2ZW47CisJCQkqKHBPdXQrMSkgPSAqcEluRXZlbisrOworCQkJKihwT3V0K3cpID0gKnBJbk9kZDsKKwkJCSoocE91dCt3KzEpID0gKnBJbk9kZCsrOworCQkJcE91dCArPSAyOworCQl9CisJCXBPdXQgKz0gdzsKKwl9CisKKwlpZiAocmF3Zm9ybWF0ID09IFJBV0ZNVF9ZVVY0MjApIHsKKwkvKiBVICovCisJCXBJbk9kZCA9IHBJbjAgKyBmaWVsZHBpeCAqIDI7CisJCXBJbkV2ZW4gPSBwSW5PZGQgKyBmaWVsZHBpeCAvIDQ7CisJCWZvciAoeSA9IDA7IHkgPCBmaWVsZGhlaWdodCAvIDI7IHkrKykgeworCQkJZm9yICh4ID0gMDsgeCA8IGZyYW1lLT5yYXd3aWR0aCAvIDI7IHgrKykgeworCQkJCSpwT3V0ID0gKnBJbkV2ZW47CisJCQkJKihwT3V0KzEpID0gKnBJbkV2ZW4rKzsKKwkJCQkqKHBPdXQrdy8yKSA9ICpwSW5PZGQ7CisJCQkJKihwT3V0K3cvMisxKSA9ICpwSW5PZGQrKzsKKwkJCQlwT3V0ICs9IDI7CisJCQl9CisJCQlwT3V0ICs9IHcvMjsKKwkJfQorCS8qIFYgKi8KKwkJcEluT2RkID0gcEluMCArIGZpZWxkcGl4ICogMiArIGZpZWxkcGl4IC8gMjsKKwkJcEluRXZlbiA9IHBJbk9kZCArIGZpZWxkcGl4IC8gNDsKKwkJZm9yICh5ID0gMDsgeSA8IGZpZWxkaGVpZ2h0IC8gMjsgeSsrKSB7CisJCQlmb3IgKHggPSAwOyB4IDwgZnJhbWUtPnJhd3dpZHRoIC8gMjsgeCsrKSB7CisJCQkJKnBPdXQgPSAqcEluRXZlbjsKKwkJCQkqKHBPdXQrMSkgPSAqcEluRXZlbisrOworCQkJCSoocE91dCt3LzIpID0gKnBJbk9kZDsKKwkJCQkqKHBPdXQrdy8yKzEpID0gKnBJbk9kZCsrOworCQkJCXBPdXQgKz0gMjsKKwkJCX0KKwkJCXBPdXQgKz0gdy8yOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorb3Y1MXhfcG9zdHByb2Nlc3NfZ3JleShzdHJ1Y3QgdXNiX292NTExICpvdiwgc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSkKK3sKKwkJLyogRGVpbnRlcmxhY2UgZnJhbWUsIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAob3YtPnNlbnNvciA9PSBTRU5fU0FBNzExMUEgJiYgZnJhbWUtPnJhd2hlaWdodCA+PSA0ODApIHsKKwkJCWlmIChmcmFtZS0+Y29tcHJlc3NlZCkKKwkJCQlkZWNvbXByZXNzKG92LCBmcmFtZSwgZnJhbWUtPnJhd2RhdGEsCisJCQkJCQkgZnJhbWUtPnRlbXBkYXRhKTsKKwkJCWVsc2UKKwkJCQl5dXY0MDByYXdfdG9feXV2NDAwcChmcmFtZSwgZnJhbWUtPnJhd2RhdGEsCisJCQkJCQkgICAgIGZyYW1lLT50ZW1wZGF0YSk7CisKKwkJCWRlaW50ZXJsYWNlKGZyYW1lLCBSQVdGTVRfWVVWNDAwLCBmcmFtZS0+dGVtcGRhdGEsCisJCQkgICAgICAgICAgICBmcmFtZS0+ZGF0YSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZnJhbWUtPmNvbXByZXNzZWQpCisJCQkJZGVjb21wcmVzcyhvdiwgZnJhbWUsIGZyYW1lLT5yYXdkYXRhLAorCQkJCQkJIGZyYW1lLT5kYXRhKTsKKwkJCWVsc2UKKwkJCQl5dXY0MDByYXdfdG9feXV2NDAwcChmcmFtZSwgZnJhbWUtPnJhd2RhdGEsCisJCQkJCQkgICAgIGZyYW1lLT5kYXRhKTsKKwkJfQorfQorCisvKiBQcm9jZXNzIHJhdyBZVVY0MjAgZGF0YSBpbnRvIHN0YW5kYXJkIFlVVjQyMFAgKi8KK3N0YXRpYyB2b2lkCitvdjUxeF9wb3N0cHJvY2Vzc195dXY0MjAoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHN0cnVjdCBvdjUxMV9mcmFtZSAqZnJhbWUpCit7CisJLyogRGVpbnRlcmxhY2UgZnJhbWUsIGlmIG5lY2Vzc2FyeSAqLworCWlmIChvdi0+c2Vuc29yID09IFNFTl9TQUE3MTExQSAmJiBmcmFtZS0+cmF3aGVpZ2h0ID49IDQ4MCkgeworCQlpZiAoZnJhbWUtPmNvbXByZXNzZWQpCisJCQlkZWNvbXByZXNzKG92LCBmcmFtZSwgZnJhbWUtPnJhd2RhdGEsIGZyYW1lLT50ZW1wZGF0YSk7CisJCWVsc2UKKwkJCXl1djQyMHJhd190b195dXY0MjBwKGZyYW1lLCBmcmFtZS0+cmF3ZGF0YSwKKwkJCQkJICAgICBmcmFtZS0+dGVtcGRhdGEpOworCisJCWRlaW50ZXJsYWNlKGZyYW1lLCBSQVdGTVRfWVVWNDIwLCBmcmFtZS0+dGVtcGRhdGEsCisJCSAgICAgICAgICAgIGZyYW1lLT5kYXRhKTsKKwl9IGVsc2UgeworCQlpZiAoZnJhbWUtPmNvbXByZXNzZWQpCisJCQlkZWNvbXByZXNzKG92LCBmcmFtZSwgZnJhbWUtPnJhd2RhdGEsIGZyYW1lLT5kYXRhKTsKKwkJZWxzZQorCQkJeXV2NDIwcmF3X3RvX3l1djQyMHAoZnJhbWUsIGZyYW1lLT5yYXdkYXRhLAorCQkJCQkgICAgIGZyYW1lLT5kYXRhKTsKKwl9Cit9CisKKy8qIFBvc3QtcHJvY2Vzc2VzIHRoZSBzcGVjaWZpZWQgZnJhbWUuIFRoaXMgY29uc2lzdHMgb2Y6CisgKiAJMS4gRGVjb21wcmVzcyBmcmFtZSwgaWYgbmVjZXNzYXJ5CisgKgkyLiBEZWludGVybGFjZSBmcmFtZSBhbmQgc2NhbGUgdG8gcHJvcGVyIHNpemUsIGlmIG5lY2Vzc2FyeQorICogCTMuIENvbnZlcnQgZnJvbSBZVVYgcGxhbmFyIHRvIGRlc3RpbmF0aW9uIGZvcm1hdCwgaWYgbmVjZXNzYXJ5CisgKiAJNC4gRml4IHRoZSBSR0Igb2Zmc2V0LCBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIHZvaWQKK292NTF4X3Bvc3Rwcm9jZXNzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lKQoreworCWlmIChkdW1wcGl4KSB7CisJCW1lbXNldChmcmFtZS0+ZGF0YSwgMCwKKwkJCU1BWF9EQVRBX1NJWkUob3YtPm1heHdpZHRoLCBvdi0+bWF4aGVpZ2h0KSk7CisJCVBERUJVRyg0LCAiRHVtcGluZyAlZCBieXRlcyIsIGZyYW1lLT5ieXRlc19yZWN2ZCk7CisJCW1lbWNweShmcmFtZS0+ZGF0YSwgZnJhbWUtPnJhd2RhdGEsIGZyYW1lLT5ieXRlc19yZWN2ZCk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChmcmFtZS0+Zm9ybWF0KSB7CisJCWNhc2UgVklERU9fUEFMRVRURV9HUkVZOgorCQkJb3Y1MXhfcG9zdHByb2Nlc3NfZ3JleShvdiwgZnJhbWUpOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjA6CisJCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjBQOgorCQkJb3Y1MXhfcG9zdHByb2Nlc3NfeXV2NDIwKG92LCBmcmFtZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigiQ2Fubm90IGNvbnZlcnQgZGF0YSB0byAlcyIsCisJCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgZnJhbWUtPmZvcm1hdCkpOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE9WNTF4IGRhdGEgdHJhbnNmZXIsIElSUSBoYW5kbGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorb3Y1MTFfbW92ZV9kYXRhKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCB1bnNpZ25lZCBjaGFyICppbiwgaW50IG4pCit7CisJaW50IG51bSwgb2Zmc2V0OworCWludCBwbnVtID0gaW5bb3YtPnBhY2tldF9zaXplIC0gMV07CQkvKiBHZXQgcGFja2V0IG51bWJlciAqLworCWludCBtYXhfcmF3ID0gTUFYX1JBV19EQVRBX1NJWkUob3YtPm1heHdpZHRoLCBvdi0+bWF4aGVpZ2h0KTsKKwlzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lID0gJm92LT5mcmFtZVtvdi0+Y3VyZnJhbWVdOworCXN0cnVjdCB0aW1ldmFsICp0czsKKworCS8qIFNPRi9FT0YgcGFja2V0cyBoYXZlIDFzdCB0byA4dGggYnl0ZXMgemVyb2VkIGFuZCB0aGUgOXRoCisJICogYnl0ZSBub24temVyby4gVGhlIEVPRiBwYWNrZXQgaGFzIGltYWdlIHdpZHRoL2hlaWdodCBpbiB0aGUKKwkgKiAxMHRoIGFuZCAxMXRoIGJ5dGVzLiBUaGUgOXRoIGJ5dGUgaXMgZ2l2ZW4gYXMgZm9sbG93czoKKwkgKgorCSAqIGJpdCA3OiBFT0YKKwkgKiAgICAgNjogY29tcHJlc3Npb24gZW5hYmxlZAorCSAqICAgICA1OiA0MjIvNDIwLzQwMCBtb2RlcworCSAqICAgICA0OiA0MjIvNDIwLzQwMCBtb2RlcworCSAqICAgICAzOiAxCisJICogICAgIDI6IHNuYXBzaG90IGJ1dHRvbiBvbgorCSAqICAgICAxOiBzbmFwc2hvdCBmcmFtZQorCSAqICAgICAwOiBldmVuL29kZCBmaWVsZAorCSAqLworCisJaWYgKHByaW50cGgpIHsKKwkJaW5mbygicGgoJTNkKTogJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMngiLAorCQkgICAgIHBudW0sIGluWzBdLCBpblsxXSwgaW5bMl0sIGluWzNdLCBpbls0XSwgaW5bNV0sIGluWzZdLAorCQkgICAgIGluWzddLCBpbls4XSwgaW5bOV0sIGluWzEwXSwgaW5bMTFdKTsKKwl9CisKKwkvKiBDaGVjayBmb3IgU09GL0VPRiBwYWNrZXQgKi8KKwlpZiAoKGluWzBdIHwgaW5bMV0gfCBpblsyXSB8IGluWzNdIHwgaW5bNF0gfCBpbls1XSB8IGluWzZdIHwgaW5bN10pIHx8CisJICAgICh+aW5bOF0gJiAweDA4KSkKKwkJZ290byBjaGVja19taWRkbGU7CisKKwkvKiBGcmFtZSBlbmQgKi8KKwlpZiAoaW5bOF0gJiAweDgwKSB7CisJCXRzID0gKHN0cnVjdCB0aW1ldmFsICopKGZyYW1lLT5kYXRhCisJCSAgICAgICsgTUFYX0ZSQU1FX1NJWkUob3YtPm1heHdpZHRoLCBvdi0+bWF4aGVpZ2h0KSk7CisJCWRvX2dldHRpbWVvZmRheSh0cyk7CisKKwkJLyogR2V0IHRoZSBhY3R1YWwgZnJhbWUgc2l6ZSBmcm9tIHRoZSBFT0YgaGVhZGVyICovCisJCWZyYW1lLT5yYXd3aWR0aCA9ICgoaW50KShpbls5XSkgKyAxKSAqIDg7CisJCWZyYW1lLT5yYXdoZWlnaHQgPSAoKGludCkoaW5bMTBdKSArIDEpICogODsKKworIAkJUERFQlVHKDQsICJGcmFtZSBlbmQsIGZyYW1lPSVkLCBwbnVtPSVkLCB3PSVkLCBoPSVkLCByZWN2ZD0lZCIsCisJCQlvdi0+Y3VyZnJhbWUsIHBudW0sIGZyYW1lLT5yYXd3aWR0aCwgZnJhbWUtPnJhd2hlaWdodCwKKwkJCWZyYW1lLT5ieXRlc19yZWN2ZCk7CisKKwkJLyogVmFsaWRhdGUgdGhlIGhlYWRlciBkYXRhICovCisJCVJFU1RSSUNUX1RPX1JBTkdFKGZyYW1lLT5yYXd3aWR0aCwgb3YtPm1pbndpZHRoLCBvdi0+bWF4d2lkdGgpOworCQlSRVNUUklDVF9UT19SQU5HRShmcmFtZS0+cmF3aGVpZ2h0LCBvdi0+bWluaGVpZ2h0LAorCQkJCSAgb3YtPm1heGhlaWdodCk7CisKKwkJLyogRG9uJ3QgYWxsb3cgYnl0ZSBjb3VudCB0byBleGNlZWQgYnVmZmVyIHNpemUgKi8KKwkJUkVTVFJJQ1RfVE9fUkFOR0UoZnJhbWUtPmJ5dGVzX3JlY3ZkLCA4LCBtYXhfcmF3KTsKKworCQlpZiAoZnJhbWUtPnNjYW5zdGF0ZSA9PSBTVEFURV9MSU5FUykgeworCSAgICAJCWludCBuZXh0ZjsKKworCQkJZnJhbWUtPmdyYWJzdGF0ZSA9IEZSQU1FX0RPTkU7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZyYW1lLT53cSk7CisKKwkJCS8qIElmIG5leHQgZnJhbWUgaXMgcmVhZHkgb3IgZ3JhYmJpbmcsCisJCQkgKiBwb2ludCB0byBpdCAqLworCQkJbmV4dGYgPSAob3YtPmN1cmZyYW1lICsgMSkgJSBPVjUxMV9OVU1GUkFNRVM7CisJCQlpZiAob3YtPmZyYW1lW25leHRmXS5ncmFic3RhdGUgPT0gRlJBTUVfUkVBRFkKKwkJCSAgICB8fCBvdi0+ZnJhbWVbbmV4dGZdLmdyYWJzdGF0ZSA9PSBGUkFNRV9HUkFCQklORykgeworCQkJCW92LT5jdXJmcmFtZSA9IG5leHRmOworCQkJCW92LT5mcmFtZVtuZXh0Zl0uc2NhbnN0YXRlID0gU1RBVEVfU0NBTk5JTkc7CisJCQl9IGVsc2UgeworCQkJCWlmIChmcmFtZS0+Z3JhYnN0YXRlID09IEZSQU1FX0RPTkUpIHsKKwkJCQkJUERFQlVHKDQsICIqKiBGcmFtZSBkb25lICoqIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJUERFQlVHKDQsICJGcmFtZSBub3QgcmVhZHk/IHN0YXRlID0gJWQiLAorCQkJCQkJb3YtPmZyYW1lW25leHRmXS5ncmFic3RhdGUpOworCQkJCX0KKworCQkJCW92LT5jdXJmcmFtZSA9IC0xOworCQkJfQorCQl9IGVsc2UgeworCQkJUERFQlVHKDUsICJGcmFtZSBkb25lLCBidXQgbm90IHNjYW5uaW5nIik7CisJCX0KKwkJLyogSW1hZ2UgY29ycnVwdGlvbiBjYXVzZWQgYnkgbWlzcGxhY2VkIGZyYW1lLT5zZWdtZW50ID0gMAorCQkgKiBmaXhlZCBieSBjYXJsb3NmQGNvbmVjdGl2YS5jb20uYnIKKwkJICovCisJfSBlbHNlIHsKKwkJLyogRnJhbWUgc3RhcnQgKi8KKwkJUERFQlVHKDQsICJGcmFtZSBzdGFydCwgZnJhbWVudW0gPSAlZCIsIG92LT5jdXJmcmFtZSk7CisKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIGl0J3MgYSBzbmFwc2hvdCBmcmFtZSAqLworCQkvKiBGSVhNRT8/IFNob3VsZCB0aGUgc25hcHNob3QgcmVzZXQgZ28gaGVyZT8gUGVyZm9ybWFuY2U/ICovCisJCWlmIChpbls4XSAmIDB4MDIpIHsKKwkJCWZyYW1lLT5zbmFwc2hvdCA9IDE7CisJCQlQREVCVUcoMywgInNuYXBzaG90IGRldGVjdGVkIik7CisJCX0KKworCQlmcmFtZS0+c2NhbnN0YXRlID0gU1RBVEVfTElORVM7CisJCWZyYW1lLT5ieXRlc19yZWN2ZCA9IDA7CisJCWZyYW1lLT5jb21wcmVzc2VkID0gaW5bOF0gJiAweDQwOworCX0KKworY2hlY2tfbWlkZGxlOgorCS8qIEFyZSB3ZSBpbiBhIGZyYW1lPyAqLworCWlmIChmcmFtZS0+c2NhbnN0YXRlICE9IFNUQVRFX0xJTkVTKSB7CisJCVBERUJVRyg1LCAiTm90IGluIGEgZnJhbWU7IHBhY2tldCBza2lwcGVkIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBmcmFtZSBzdGFydCwgc2tpcCBoZWFkZXIgKi8KKwlpZiAoZnJhbWUtPmJ5dGVzX3JlY3ZkID09IDApCisJCW9mZnNldCA9IDk7CisJZWxzZQorCQlvZmZzZXQgPSAwOworCisJbnVtID0gbiAtIG9mZnNldCAtIDE7CisKKwkvKiBEdW1wIGFsbCBkYXRhIGV4YWN0bHkgYXMgcmVjZWl2ZWQgKi8KKwlpZiAoZHVtcHBpeCA9PSAyKSB7CisJCWZyYW1lLT5ieXRlc19yZWN2ZCArPSBuIC0gMTsKKwkJaWYgKGZyYW1lLT5ieXRlc19yZWN2ZCA8PSBtYXhfcmF3KQorCQkJbWVtY3B5KGZyYW1lLT5yYXdkYXRhICsgZnJhbWUtPmJ5dGVzX3JlY3ZkIC0gKG4gLSAxKSwKKwkJCQlpbiwgbiAtIDEpOworCQllbHNlCisJCQlQREVCVUcoMywgIlJhdyBkYXRhIGJ1ZmZlciBvdmVycnVuISEgKCVkKSIsCisJCQkJZnJhbWUtPmJ5dGVzX3JlY3ZkIC0gbWF4X3Jhdyk7CisJfSBlbHNlIGlmICghZnJhbWUtPmNvbXByZXNzZWQgJiYgIXJlbW92ZV96ZXJvcykgeworCQlmcmFtZS0+Ynl0ZXNfcmVjdmQgKz0gbnVtOworCQlpZiAoZnJhbWUtPmJ5dGVzX3JlY3ZkIDw9IG1heF9yYXcpCisJCQltZW1jcHkoZnJhbWUtPnJhd2RhdGEgKyBmcmFtZS0+Ynl0ZXNfcmVjdmQgLSBudW0sCisJCQkJaW4gKyBvZmZzZXQsIG51bSk7CisJCWVsc2UKKwkJCVBERUJVRygzLCAiUmF3IGRhdGEgYnVmZmVyIG92ZXJydW4hISAoJWQpIiwKKwkJCQlmcmFtZS0+Ynl0ZXNfcmVjdmQgLSBtYXhfcmF3KTsKKwl9IGVsc2UgeyAvKiBSZW1vdmUgYWxsLXplcm8gRklGTyBsaW5lcyAoYWxpZ25lZCAzMi1ieXRlIGJsb2NrcykgKi8KKwkJaW50IGIsIHJlYWQgPSAwLCBhbGx6ZXJvLCBjb3BpZWQgPSAwOworCQlpZiAob2Zmc2V0KSB7CisJCQlmcmFtZS0+Ynl0ZXNfcmVjdmQgKz0gMzIgLSBvZmZzZXQ7CS8vIEJ5dGVzIG91dAorCQkJbWVtY3B5KGZyYW1lLT5yYXdkYXRhLAlpbiArIG9mZnNldCwgMzIgLSBvZmZzZXQpOworCQkJcmVhZCArPSAzMjsKKwkJfQorCisJCXdoaWxlIChyZWFkIDwgbiAtIDEpIHsKKwkJCWFsbHplcm8gPSAxOworCQkJZm9yIChiID0gMDsgYiA8IDMyOyBiKyspIHsKKwkJCQlpZiAoaW5bcmVhZCArIGJdKSB7CisJCQkJCWFsbHplcm8gPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChhbGx6ZXJvKSB7CisJCQkJLyogRG9uJ3QgY29weSBpdCAqLworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZnJhbWUtPmJ5dGVzX3JlY3ZkICsgY29waWVkICsgMzIgPD0gbWF4X3JhdykKKwkJCQl7CisJCQkJCW1lbWNweShmcmFtZS0+cmF3ZGF0YQorCQkJCQkJKyBmcmFtZS0+Ynl0ZXNfcmVjdmQgKyBjb3BpZWQsCisJCQkJCQlpbiArIHJlYWQsIDMyKTsKKwkJCQkJY29waWVkICs9IDMyOworCQkJCX0gZWxzZSB7CisJCQkJCVBERUJVRygzLCAiUmF3IGRhdGEgYnVmZmVyIG92ZXJydW4hISIpOworCQkJCX0KKwkJCX0KKwkJCXJlYWQgKz0gMzI7CisJCX0KKworCQlmcmFtZS0+Ynl0ZXNfcmVjdmQgKz0gY29waWVkOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitvdjUxOF9tb3ZlX2RhdGEoc3RydWN0IHVzYl9vdjUxMSAqb3YsIHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgbikKK3sKKwlpbnQgbWF4X3JhdyA9IE1BWF9SQVdfREFUQV9TSVpFKG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCk7CisJc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZSA9ICZvdi0+ZnJhbWVbb3YtPmN1cmZyYW1lXTsKKwlzdHJ1Y3QgdGltZXZhbCAqdHM7CisKKwkvKiBEb24ndCBjb3B5IHRoZSBwYWNrZXQgbnVtYmVyIGJ5dGUgKi8KKwlpZiAob3YtPnBhY2tldF9udW1iZXJpbmcpCisJCS0tbjsKKworCS8qIEEgZmFsc2UgcG9zaXRpdmUgaGVyZSBpcyBsaWtlbHksIHVudGlsIE9WVCBnaXZlcyBtZQorCSAqIHRoZSBkZWZpbml0aXZlIFNPRi9FT0YgZm9ybWF0ICovCisJaWYgKCghKGluWzBdIHwgaW5bMV0gfCBpblsyXSB8IGluWzNdIHwgaW5bNV0pKSAmJiBpbls2XSkgeworCQlpZiAocHJpbnRwaCkgeworCQkJaW5mbygicGg6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMngiLCBpblswXSwKKwkJCSAgICAgaW5bMV0sIGluWzJdLCBpblszXSwgaW5bNF0sIGluWzVdLCBpbls2XSwgaW5bN10pOworCQl9CisKKwkJaWYgKGZyYW1lLT5zY2Fuc3RhdGUgPT0gU1RBVEVfTElORVMpIHsKKwkJCVBERUJVRyg0LCAiRGV0ZWN0ZWQgZnJhbWUgZW5kL3N0YXJ0Iik7CisJCQlnb3RvIGVvZjsKKwkJfSBlbHNlIHsgLy9zY2Fuc3RhdGUgPT0gU1RBVEVfU0NBTk5JTkcKKwkJCS8qIEZyYW1lIHN0YXJ0ICovCisJCQlQREVCVUcoNCwgIkZyYW1lIHN0YXJ0LCBmcmFtZW51bSA9ICVkIiwgb3YtPmN1cmZyYW1lKTsKKwkJCWdvdG8gc29mOworCQl9CisJfSBlbHNlIHsKKwkJZ290byBjaGVja19taWRkbGU7CisJfQorCitlb2Y6CisJdHMgPSAoc3RydWN0IHRpbWV2YWwgKikoZnJhbWUtPmRhdGEKKwkgICAgICArIE1BWF9GUkFNRV9TSVpFKG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCkpOworCWRvX2dldHRpbWVvZmRheSh0cyk7CisKKwlQREVCVUcoNCwgIkZyYW1lIGVuZCwgY3VyZnJhbWUgPSAlZCwgaHc9JWQsIHZ3PSVkLCByZWN2ZD0lZCIsCisJCW92LT5jdXJmcmFtZSwKKwkJKGludCkoaW5bOV0pLCAoaW50KShpblsxMF0pLCBmcmFtZS0+Ynl0ZXNfcmVjdmQpOworCisJLy8gRklYTUU6IFNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGhlYWRlciBmb3JtYXRzIHlldCwKKwkvLyB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGF0IHRoZSBhY3R1YWwgaW1hZ2Ugc2l6ZSBpcworCWZyYW1lLT5yYXd3aWR0aCA9IGZyYW1lLT53aWR0aDsKKwlmcmFtZS0+cmF3aGVpZ2h0ID0gZnJhbWUtPmhlaWdodDsKKworCS8qIFZhbGlkYXRlIHRoZSBoZWFkZXIgZGF0YSAqLworCVJFU1RSSUNUX1RPX1JBTkdFKGZyYW1lLT5yYXd3aWR0aCwgb3YtPm1pbndpZHRoLCBvdi0+bWF4d2lkdGgpOworCVJFU1RSSUNUX1RPX1JBTkdFKGZyYW1lLT5yYXdoZWlnaHQsIG92LT5taW5oZWlnaHQsIG92LT5tYXhoZWlnaHQpOworCisJLyogRG9uJ3QgYWxsb3cgYnl0ZSBjb3VudCB0byBleGNlZWQgYnVmZmVyIHNpemUgKi8KKwlSRVNUUklDVF9UT19SQU5HRShmcmFtZS0+Ynl0ZXNfcmVjdmQsIDgsIG1heF9yYXcpOworCisJaWYgKGZyYW1lLT5zY2Fuc3RhdGUgPT0gU1RBVEVfTElORVMpIHsKKyAgICAJCWludCBuZXh0ZjsKKworCQlmcmFtZS0+Z3JhYnN0YXRlID0gRlJBTUVfRE9ORTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZmcmFtZS0+d3EpOworCisJCS8qIElmIG5leHQgZnJhbWUgaXMgcmVhZHkgb3IgZ3JhYmJpbmcsCisJCSAqIHBvaW50IHRvIGl0ICovCisJCW5leHRmID0gKG92LT5jdXJmcmFtZSArIDEpICUgT1Y1MTFfTlVNRlJBTUVTOworCQlpZiAob3YtPmZyYW1lW25leHRmXS5ncmFic3RhdGUgPT0gRlJBTUVfUkVBRFkKKwkJICAgIHx8IG92LT5mcmFtZVtuZXh0Zl0uZ3JhYnN0YXRlID09IEZSQU1FX0dSQUJCSU5HKSB7CisJCQlvdi0+Y3VyZnJhbWUgPSBuZXh0ZjsKKwkJCW92LT5mcmFtZVtuZXh0Zl0uc2NhbnN0YXRlID0gU1RBVEVfU0NBTk5JTkc7CisJCQlmcmFtZSA9ICZvdi0+ZnJhbWVbbmV4dGZdOworCQl9IGVsc2UgeworCQkJaWYgKGZyYW1lLT5ncmFic3RhdGUgPT0gRlJBTUVfRE9ORSkgeworCQkJCVBERUJVRyg0LCAiKiogRnJhbWUgZG9uZSAqKiIpOworCQkJfSBlbHNlIHsKKwkJCQlQREVCVUcoNCwgIkZyYW1lIG5vdCByZWFkeT8gc3RhdGUgPSAlZCIsCisJCQkJICAgICAgIG92LT5mcmFtZVtuZXh0Zl0uZ3JhYnN0YXRlKTsKKwkJCX0KKworCQkJb3YtPmN1cmZyYW1lID0gLTE7CisJCQlQREVCVUcoNCwgIlNPRiBkcm9wcGVkIChubyBhY3RpdmUgZnJhbWUpIik7CisJCQlyZXR1cm47ICAvKiBOb3doZXJlIHRvIHN0b3JlIHRoaXMgZnJhbWUgKi8KKwkJfQorCX0KK3NvZjoKKwlQREVCVUcoNCwgIlN0YXJ0aW5nIGNhcHR1cmUgb24gZnJhbWUgJWQiLCBmcmFtZS0+ZnJhbWVudW0pOworCisvLyBTbmFwc2hvdCBub3QgcmV2ZXJzZS1lbmdpbmVlcmVkIHlldC4KKyNpZiAwCisJLyogQ2hlY2sgdG8gc2VlIGlmIGl0J3MgYSBzbmFwc2hvdCBmcmFtZSAqLworCS8qIEZJWE1FPz8gU2hvdWxkIHRoZSBzbmFwc2hvdCByZXNldCBnbyBoZXJlPyBQZXJmb3JtYW5jZT8gKi8KKwlpZiAoaW5bOF0gJiAweDAyKSB7CisJCWZyYW1lLT5zbmFwc2hvdCA9IDE7CisJCVBERUJVRygzLCAic25hcHNob3QgZGV0ZWN0ZWQiKTsKKwl9CisjZW5kaWYKKwlmcmFtZS0+c2NhbnN0YXRlID0gU1RBVEVfTElORVM7CisJZnJhbWUtPmJ5dGVzX3JlY3ZkID0gMDsKKwlmcmFtZS0+Y29tcHJlc3NlZCA9IDE7CisKK2NoZWNrX21pZGRsZToKKwkvKiBBcmUgd2UgaW4gYSBmcmFtZT8gKi8KKwlpZiAoZnJhbWUtPnNjYW5zdGF0ZSAhPSBTVEFURV9MSU5FUykgeworCQlQREVCVUcoNCwgInNjYW5zdGF0ZTogbm8gU09GIHlldCIpOworCQlyZXR1cm47CisJfQorCisJLyogRHVtcCBhbGwgZGF0YSBleGFjdGx5IGFzIHJlY2VpdmVkICovCisJaWYgKGR1bXBwaXggPT0gMikgeworCQlmcmFtZS0+Ynl0ZXNfcmVjdmQgKz0gbjsKKwkJaWYgKGZyYW1lLT5ieXRlc19yZWN2ZCA8PSBtYXhfcmF3KQorCQkJbWVtY3B5KGZyYW1lLT5yYXdkYXRhICsgZnJhbWUtPmJ5dGVzX3JlY3ZkIC0gbiwgaW4sIG4pOworCQllbHNlCisJCQlQREVCVUcoMywgIlJhdyBkYXRhIGJ1ZmZlciBvdmVycnVuISEgKCVkKSIsCisJCQkJZnJhbWUtPmJ5dGVzX3JlY3ZkIC0gbWF4X3Jhdyk7CisJfSBlbHNlIHsKKwkJLyogQWxsIGluY29taW5nIGRhdGEgYXJlIGRpdmlkZWQgaW50byA4LWJ5dGUgc2VnbWVudHMuIElmIHRoZQorCQkgKiBzZWdtZW50IGNvbnRhaW5zIGFsbCB6ZXJvIGJ5dGVzLCBpdCBtdXN0IGJlIHNraXBwZWQuIFRoZXNlCisJCSAqIHplcm8tc2VnbWVudHMgYWxsb3cgdGhlIE9WNTE4IHRvIG1haW5haW4gYSBjb25zdGFudCBkYXRhIHJhdGUKKwkJICogcmVnYXJkbGVzcyBvZiB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGUgY29tcHJlc3Npb24uIFNlZ21lbnRzCisJCSAqIGFyZSBhbGlnbmVkIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBpc29jaHJvbm91cworCQkgKiBwYWNrZXQuIFRoZSBmaXJzdCBzZWdtZW50IGluIGVhY2ggaW1hZ2UgaXMgYSBoZWFkZXIgKHRoZQorCQkgKiBkZWNvbXByZXNzb3Igc2tpcHMgaXQgbGF0ZXIpLgorCQkgKi8KKworCQlpbnQgYiwgcmVhZCA9IDAsIGFsbHplcm8sIGNvcGllZCA9IDA7CisKKwkJd2hpbGUgKHJlYWQgPCBuKSB7CisJCQlhbGx6ZXJvID0gMTsKKwkJCWZvciAoYiA9IDA7IGIgPCA4OyBiKyspIHsKKwkJCQlpZiAoaW5bcmVhZCArIGJdKSB7CisJCQkJCWFsbHplcm8gPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChhbGx6ZXJvKSB7CisJCQkvKiBEb24ndCBjb3B5IGl0ICovCisJCQl9IGVsc2UgeworCQkJCWlmIChmcmFtZS0+Ynl0ZXNfcmVjdmQgKyBjb3BpZWQgKyA4IDw9IG1heF9yYXcpCisJCQkJeworCQkJCQltZW1jcHkoZnJhbWUtPnJhd2RhdGEKKwkJCQkJCSsgZnJhbWUtPmJ5dGVzX3JlY3ZkICsgY29waWVkLAorCQkJCQkJaW4gKyByZWFkLCA4KTsKKwkJCQkJY29waWVkICs9IDg7CisJCQkJfSBlbHNlIHsKKwkJCQkJUERFQlVHKDMsICJSYXcgZGF0YSBidWZmZXIgb3ZlcnJ1biEhIik7CisJCQkJfQorCQkJfQorCQkJcmVhZCArPSA4OworCQl9CisJCWZyYW1lLT5ieXRlc19yZWN2ZCArPSBjb3BpZWQ7CisJfQorfQorCitzdGF0aWMgdm9pZAorb3Y1MXhfaXNvY19pcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdXNiX292NTExICpvdjsKKwlzdHJ1Y3Qgb3Y1MTFfc2J1ZiAqc2J1ZjsKKworCWlmICghdXJiLT5jb250ZXh0KSB7CisJCVBERUJVRyg0LCAibm8gY29udGV4dCIpOworCQlyZXR1cm47CisJfQorCisJc2J1ZiA9IHVyYi0+Y29udGV4dDsKKwlvdiA9IHNidWYtPm92OworCisJaWYgKCFvdiB8fCAhb3YtPmRldiB8fCAhb3YtPnVzZXIpIHsKKwkJUERFQlVHKDQsICJubyBkZXZpY2UsIG9yIG5vdCBvcGVuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIW92LT5zdHJlYW1pbmcpIHsKKwkJUERFQlVHKDQsICJobW1tLi4uIG5vdCBzdHJlYW1pbmcsIGJ1dCBnb3QgaW50ZXJydXB0Iik7CisJCXJldHVybjsKKwl9CisKKyAgICAgICAgaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpIHsKKyAgICAgICAgICAgICAgICBQREVCVUcoNCwgIlVSQiB1bmxpbmtlZCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisJaWYgKHVyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUyAmJiB1cmItPnN0YXR1cyAhPSAwKSB7CisJCWVycigiRVJST1I6IHVyYi0+c3RhdHVzPSVkOiAlcyIsIHVyYi0+c3RhdHVzLAorCQkgICAgc3ltYm9saWModXJiX2Vycmxpc3QsIHVyYi0+c3RhdHVzKSk7CisJfQorCisJLyogQ29weSB0aGUgZGF0YSByZWNlaXZlZCBpbnRvIG91ciBmcmFtZSBidWZmZXIgKi8KKwlQREVCVUcoNSwgInNidWZbJWRdOiBNb3ZpbmcgJWQgcGFja2V0cyIsIHNidWYtPm4sCisJICAgICAgIHVyYi0+bnVtYmVyX29mX3BhY2tldHMpOworCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKKwkJLyogV2FybmluZzogRG9uJ3QgY2FsbCAqX21vdmVfZGF0YSgpIGlmIG5vIGZyYW1lIGFjdGl2ZSEgKi8KKwkJaWYgKG92LT5jdXJmcmFtZSA+PSAwKSB7CisJCQlpbnQgbiA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwkJCWludCBzdCA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzOworCQkJdW5zaWduZWQgY2hhciAqY2RhdGE7CisKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCA9IDA7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyA9IDA7CisKKwkJCWNkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXIKKwkJCQkrIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OworCisJCQlpZiAoIW4pIHsKKwkJCQlQREVCVUcoNCwgIlplcm8tbGVuZ3RoIHBhY2tldCIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoc3QpCisJCQkJUERFQlVHKDIsICJkYXRhIGVycm9yOiBbJWRdIGxlbj0lZCwgc3RhdHVzPSVkIiwKKwkJCQkgICAgICAgaSwgbiwgc3QpOworCisJCQlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTEpCisJCQkJb3Y1MTFfbW92ZV9kYXRhKG92LCBjZGF0YSwgbik7CisJCQllbHNlIGlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKKwkJCQlvdjUxOF9tb3ZlX2RhdGEob3YsIGNkYXRhLCBuKTsKKwkJCWVsc2UKKwkJCQllcnIoIlVua25vd24gYnJpZGdlIGRldmljZSAoJWQpIiwgb3YtPmJyaWRnZSk7CisKKwkJfSBlbHNlIGlmICh3YWl0cXVldWVfYWN0aXZlKCZvdi0+d3EpKSB7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm92LT53cSk7CisJCX0KKwl9CisKKwkvKiBSZXN1Ym1pdCB0aGlzIFVSQiAqLworCXVyYi0+ZGV2ID0gb3YtPmRldjsKKwlpZiAoKGkgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSAhPSAwKQorCQllcnIoInVzYl9zdWJtaXRfdXJiKCkgcmV0ICVkIiwgaSk7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU3RyZWFtIGluaXRpYWxpemF0aW9uIGFuZCB0ZXJtaW5hdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK292NTF4X2luaXRfaXNvYyhzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IGZ4LCBlcnIsIG4sIHNpemU7CisKKwlQREVCVUcoMywgIioqKiBJbml0aWFsaXppbmcgY2FwdHVyZSAqKioiKTsKKworCW92LT5jdXJmcmFtZSA9IC0xOworCisJaWYgKG92LT5icmlkZ2UgPT0gQlJHX09WNTExKSB7CisJCWlmIChjYW1zID09IDEpCisJCQlzaXplID0gOTkzOworCQllbHNlIGlmIChjYW1zID09IDIpCisJCQlzaXplID0gNTEzOworCQllbHNlIGlmIChjYW1zID09IDMgfHwgY2FtcyA9PSA0KQorCQkJc2l6ZSA9IDI1NzsKKwkJZWxzZSB7CisJCQllcnIoIlwiY2Ftc1wiIHBhcmFtZXRlciB0b28gaGlnaCEiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZSBpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTFQTFVTKSB7CisJCWlmIChjYW1zID09IDEpCisJCQlzaXplID0gOTYxOworCQllbHNlIGlmIChjYW1zID09IDIpCisJCQlzaXplID0gNTEzOworCQllbHNlIGlmIChjYW1zID09IDMgfHwgY2FtcyA9PSA0KQorCQkJc2l6ZSA9IDI1NzsKKwkJZWxzZSBpZiAoY2FtcyA+PSA1ICYmIGNhbXMgPD0gOCkKKwkJCXNpemUgPSAxMjk7CisJCWVsc2UgaWYgKGNhbXMgPj0gOSAmJiBjYW1zIDw9IDMxKQorCQkJc2l6ZSA9IDMzOworCQllbHNlIHsKKwkJCWVycigiXCJjYW1zXCIgcGFyYW1ldGVyIHRvbyBoaWdoISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIGlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgeworCQlpZiAoY2FtcyA9PSAxKQorCQkJc2l6ZSA9IDg5NjsKKwkJZWxzZSBpZiAoY2FtcyA9PSAyKQorCQkJc2l6ZSA9IDUxMjsKKwkJZWxzZSBpZiAoY2FtcyA9PSAzIHx8IGNhbXMgPT0gNCkKKwkJCXNpemUgPSAyNTY7CisJCWVsc2UgaWYgKGNhbXMgPj0gNSAmJiBjYW1zIDw9IDgpCisJCQlzaXplID0gMTI4OworCQllbHNlIHsKKwkJCWVycigiXCJjYW1zXCIgcGFyYW1ldGVyIHRvbyBoaWdoISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJZXJyKCJpbnZhbGlkIGJyaWRnZSB0eXBlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvLyBGSVhNRTogT1Y1MTggaXMgaGFyZGNvZGVkIHRvIDE1IEZQUyAoYWx0ZXJuYXRlIDUpIGZvciBub3cKKwlpZiAob3YtPmJjbGFzcyA9PSBCQ0xfT1Y1MTgpIHsKKwkJaWYgKHBhY2tldHNpemUgPT0gLTEpIHsKKwkJCW92NTE4X3NldF9wYWNrZXRfc2l6ZShvdiwgNjQwKTsKKwkJfSBlbHNlIHsKKwkJCWluZm8oIkZvcmNpbmcgcGFja2V0IHNpemUgdG8gJWQiLCBwYWNrZXRzaXplKTsKKwkJCW92NTE4X3NldF9wYWNrZXRfc2l6ZShvdiwgcGFja2V0c2l6ZSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocGFja2V0c2l6ZSA9PSAtMSkgeworCQkJb3Y1MTFfc2V0X3BhY2tldF9zaXplKG92LCBzaXplKTsKKwkJfSBlbHNlIHsKKwkJCWluZm8oIkZvcmNpbmcgcGFja2V0IHNpemUgdG8gJWQiLCBwYWNrZXRzaXplKTsKKwkJCW92NTExX3NldF9wYWNrZXRfc2l6ZShvdiwgcGFja2V0c2l6ZSk7CisJCX0KKwl9CisKKwlmb3IgKG4gPSAwOyBuIDwgT1Y1MTFfTlVNU0JVRjsgbisrKSB7CisJCXVyYiA9IHVzYl9hbGxvY191cmIoRlJBTUVTX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1cmIpIHsKKwkJCWVycigiaW5pdCBpc29jOiB1c2JfYWxsb2NfdXJiIHJldC4gTlVMTCIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJb3YtPnNidWZbbl0udXJiID0gdXJiOworCQl1cmItPmRldiA9IG92LT5kZXY7CisJCXVyYi0+Y29udGV4dCA9ICZvdi0+c2J1ZltuXTsKKwkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKG92LT5kZXYsIE9WNTExX0VORFBPSU5UX0FERFJFU1MpOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IG92LT5zYnVmW25dLmRhdGE7CisJCXVyYi0+Y29tcGxldGUgPSBvdjUxeF9pc29jX2lycTsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IEZSQU1FU19QRVJfREVTQzsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gb3YtPnBhY2tldF9zaXplICogRlJBTUVTX1BFUl9ERVNDOworCQl1cmItPmludGVydmFsID0gMTsKKwkJZm9yIChmeCA9IDA7IGZ4IDwgRlJBTUVTX1BFUl9ERVNDOyBmeCsrKSB7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2Z4XS5vZmZzZXQgPSBvdi0+cGFja2V0X3NpemUgKiBmeDsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbZnhdLmxlbmd0aCA9IG92LT5wYWNrZXRfc2l6ZTsKKwkJfQorCX0KKworCW92LT5zdHJlYW1pbmcgPSAxOworCisJZm9yIChuID0gMDsgbiA8IE9WNTExX05VTVNCVUY7IG4rKykgeworCQlvdi0+c2J1ZltuXS51cmItPmRldiA9IG92LT5kZXY7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKG92LT5zYnVmW25dLnVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpIHsKKwkJCWVycigiaW5pdCBpc29jOiB1c2Jfc3VibWl0X3VyYiglZCkgcmV0ICVkIiwgbiwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK292NTF4X3VubGlua19pc29jKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWludCBuOworCisJLyogVW5zY2hlZHVsZSBhbGwgb2YgdGhlIGlzbyB0ZCdzICovCisJZm9yIChuID0gT1Y1MTFfTlVNU0JVRiAtIDE7IG4gPj0gMDsgbi0tKSB7CisJCWlmIChvdi0+c2J1ZltuXS51cmIpIHsKKwkJCXVzYl9raWxsX3VyYihvdi0+c2J1ZltuXS51cmIpOworCQkJdXNiX2ZyZWVfdXJiKG92LT5zYnVmW25dLnVyYik7CisJCQlvdi0+c2J1ZltuXS51cmIgPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorb3Y1MXhfc3RvcF9pc29jKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWlmICghb3YtPnN0cmVhbWluZyB8fCAhb3YtPmRldikKKwkJcmV0dXJuOworCisJUERFQlVHKDMsICIqKiogU3RvcHBpbmcgY2FwdHVyZSAqKioiKTsKKworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkKKwkJb3Y1MThfc2V0X3BhY2tldF9zaXplKG92LCAwKTsKKwllbHNlCisJCW92NTExX3NldF9wYWNrZXRfc2l6ZShvdiwgMCk7CisKKwlvdi0+c3RyZWFtaW5nID0gMDsKKworCW92NTF4X3VubGlua19pc29jKG92KTsKK30KKworc3RhdGljIGludAorb3Y1MXhfbmV3X2ZyYW1lKHN0cnVjdCB1c2Jfb3Y1MTEgKm92LCBpbnQgZnJhbWVudW0pCit7CisJc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZTsKKwlpbnQgbmV3bnVtOworCisJUERFQlVHKDQsICJvdi0+Y3VyZnJhbWUgPSAlZCwgZnJhbWVudW0gPSAlZCIsIG92LT5jdXJmcmFtZSwgZnJhbWVudW0pOworCisJaWYgKCFvdi0+ZGV2KQorCQlyZXR1cm4gLTE7CisKKwkvKiBJZiB3ZSdyZSBub3QgZ3JhYmJpbmcgYSBmcmFtZSByaWdodCBub3cgYW5kIHRoZSBvdGhlciBmcmFtZSBpcyAqLworCS8qIHJlYWR5IHRvIGJlIGdyYWJiZWQgaW50bywgdGhlbiB1c2UgaXQgaW5zdGVhZCAqLworCWlmIChvdi0+Y3VyZnJhbWUgPT0gLTEpIHsKKwkJbmV3bnVtID0gKGZyYW1lbnVtIC0gMSArIE9WNTExX05VTUZSQU1FUykgJSBPVjUxMV9OVU1GUkFNRVM7CisJCWlmIChvdi0+ZnJhbWVbbmV3bnVtXS5ncmFic3RhdGUgPT0gRlJBTUVfUkVBRFkpCisJCQlmcmFtZW51bSA9IG5ld251bTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwlmcmFtZSA9ICZvdi0+ZnJhbWVbZnJhbWVudW1dOworCisJUERFQlVHKDQsICJmcmFtZW51bSA9ICVkLCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZCIsIGZyYW1lbnVtLAorCSAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQpOworCisJZnJhbWUtPmdyYWJzdGF0ZSA9IEZSQU1FX0dSQUJCSU5HOworCWZyYW1lLT5zY2Fuc3RhdGUgPSBTVEFURV9TQ0FOTklORzsKKwlmcmFtZS0+c25hcHNob3QgPSAwOworCisJb3YtPmN1cmZyYW1lID0gZnJhbWVudW07CisKKwkvKiBNYWtlIHN1cmUgaXQncyBub3QgdG9vIGJpZyAqLworCWlmIChmcmFtZS0+d2lkdGggPiBvdi0+bWF4d2lkdGgpCisJCWZyYW1lLT53aWR0aCA9IG92LT5tYXh3aWR0aDsKKworCWZyYW1lLT53aWR0aCAmPSB+N0w7CQkvKiBNdWx0aXBsZSBvZiA4ICovCisKKwlpZiAoZnJhbWUtPmhlaWdodCA+IG92LT5tYXhoZWlnaHQpCisJCWZyYW1lLT5oZWlnaHQgPSBvdi0+bWF4aGVpZ2h0OworCisJZnJhbWUtPmhlaWdodCAmPSB+M0w7CQkvKiBNdWx0aXBsZSBvZiA0ICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBCdWZmZXIgbWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAtIFlvdSBtdXN0IGFjcXVpcmUgYnVmX2xvY2sgYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuY3Rpb24uCisgKiAtIEJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgZnJlZSBhbnkgbm9uLW51bGwgcG9pbnRlciwgeW91IG11c3QgYmUgc3VyZSB0byBudWxsCisgKiAgIHRoZW0gaWYgeW91IGV4cGxpY2l0bHkgZnJlZSB0aGVtIHNvbWV3aGVyZSBlbHNlIQorICovCitzdGF0aWMgdm9pZAorb3Y1MXhfZG9fZGVhbGxvYyhzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlpbnQgaTsKKwlQREVCVUcoNCwgImVudGVyZWQiKTsKKworCWlmIChvdi0+ZmJ1ZikgeworCQlydmZyZWUob3YtPmZidWYsIE9WNTExX05VTUZSQU1FUworCQkgICAgICAgKiBNQVhfREFUQV9TSVpFKG92LT5tYXh3aWR0aCwgb3YtPm1heGhlaWdodCkpOworCQlvdi0+ZmJ1ZiA9IE5VTEw7CisJfQorCisJdmZyZWUob3YtPnJhd2ZidWYpOworCW92LT5yYXdmYnVmID0gTlVMTDsKKworCXZmcmVlKG92LT50ZW1wZmJ1Zik7CisJb3YtPnRlbXBmYnVmID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1TQlVGOyBpKyspIHsKKwkJaWYgKG92LT5zYnVmW2ldLmRhdGEpIHsKKwkJCWtmcmVlKG92LT5zYnVmW2ldLmRhdGEpOworCQkJb3YtPnNidWZbaV0uZGF0YSA9IE5VTEw7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgT1Y1MTFfTlVNRlJBTUVTOyBpKyspIHsKKwkJb3YtPmZyYW1lW2ldLmRhdGEgPSBOVUxMOworCQlvdi0+ZnJhbWVbaV0ucmF3ZGF0YSA9IE5VTEw7CisJCW92LT5mcmFtZVtpXS50ZW1wZGF0YSA9IE5VTEw7CisJCWlmIChvdi0+ZnJhbWVbaV0uY29tcGJ1ZikgeworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBvdi0+ZnJhbWVbaV0uY29tcGJ1Zik7CisJCQlvdi0+ZnJhbWVbaV0uY29tcGJ1ZiA9IE5VTEw7CisJCX0KKwl9CisKKwlQREVCVUcoNCwgImJ1ZmZlciBtZW1vcnkgZGVhbGxvY2F0ZWQiKTsKKwlvdi0+YnVmX3N0YXRlID0gQlVGX05PVF9BTExPQ0FURUQ7CisJUERFQlVHKDQsICJsZWF2aW5nIik7Cit9CisKK3N0YXRpYyBpbnQKK292NTF4X2FsbG9jKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWludCBpOworCWNvbnN0IGludCB3ID0gb3YtPm1heHdpZHRoOworCWNvbnN0IGludCBoID0gb3YtPm1heGhlaWdodDsKKwljb25zdCBpbnQgZGF0YV9idWZzaXplID0gT1Y1MTFfTlVNRlJBTUVTICogTUFYX0RBVEFfU0laRSh3LCBoKTsKKwljb25zdCBpbnQgcmF3X2J1ZnNpemUgPSBPVjUxMV9OVU1GUkFNRVMgKiBNQVhfUkFXX0RBVEFfU0laRSh3LCBoKTsKKworCVBERUJVRyg0LCAiZW50ZXJlZCIpOworCWRvd24oJm92LT5idWZfbG9jayk7CisKKwlpZiAob3YtPmJ1Zl9zdGF0ZSA9PSBCVUZfQUxMT0NBVEVEKQorCQlnb3RvIG91dDsKKworCW92LT5mYnVmID0gcnZtYWxsb2MoZGF0YV9idWZzaXplKTsKKwlpZiAoIW92LT5mYnVmKQorCQlnb3RvIGVycm9yOworCisJb3YtPnJhd2ZidWYgPSB2bWFsbG9jKHJhd19idWZzaXplKTsKKwlpZiAoIW92LT5yYXdmYnVmKQorCQlnb3RvIGVycm9yOworCisJbWVtc2V0KG92LT5yYXdmYnVmLCAwLCByYXdfYnVmc2l6ZSk7CisKKwlvdi0+dGVtcGZidWYgPSB2bWFsbG9jKHJhd19idWZzaXplKTsKKwlpZiAoIW92LT50ZW1wZmJ1ZikKKwkJZ290byBlcnJvcjsKKworCW1lbXNldChvdi0+dGVtcGZidWYsIDAsIHJhd19idWZzaXplKTsKKworCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1TQlVGOyBpKyspIHsKKwkJb3YtPnNidWZbaV0uZGF0YSA9IGttYWxsb2MoRlJBTUVTX1BFUl9ERVNDICoKKwkJCU1BWF9GUkFNRV9TSVpFX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFvdi0+c2J1ZltpXS5kYXRhKQorCQkJZ290byBlcnJvcjsKKworCQlQREVCVUcoNCwgInNidWZbJWRdIEAgJXAiLCBpLCBvdi0+c2J1ZltpXS5kYXRhKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgT1Y1MTFfTlVNRlJBTUVTOyBpKyspIHsKKwkJb3YtPmZyYW1lW2ldLmRhdGEgPSBvdi0+ZmJ1ZiArIGkgKiBNQVhfREFUQV9TSVpFKHcsIGgpOworCQlvdi0+ZnJhbWVbaV0ucmF3ZGF0YSA9IG92LT5yYXdmYnVmCisJCSArIGkgKiBNQVhfUkFXX0RBVEFfU0laRSh3LCBoKTsKKwkJb3YtPmZyYW1lW2ldLnRlbXBkYXRhID0gb3YtPnRlbXBmYnVmCisJCSArIGkgKiBNQVhfUkFXX0RBVEFfU0laRSh3LCBoKTsKKworCQlvdi0+ZnJhbWVbaV0uY29tcGJ1ZiA9CisJCSAodW5zaWduZWQgY2hhciAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghb3YtPmZyYW1lW2ldLmNvbXBidWYpCisJCQlnb3RvIGVycm9yOworCisJCVBERUJVRyg0LCAiZnJhbWVbJWRdIEAgJXAiLCBpLCBvdi0+ZnJhbWVbaV0uZGF0YSk7CisJfQorCisJb3YtPmJ1Zl9zdGF0ZSA9IEJVRl9BTExPQ0FURUQ7CitvdXQ6CisJdXAoJm92LT5idWZfbG9jayk7CisJUERFQlVHKDQsICJsZWF2aW5nIik7CisJcmV0dXJuIDA7CitlcnJvcjoKKwlvdjUxeF9kb19kZWFsbG9jKG92KTsKKwl1cCgmb3YtPmJ1Zl9sb2NrKTsKKwlQREVCVUcoNCwgImVycm9yZWQiKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQKK292NTF4X2RlYWxsb2Moc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJUERFQlVHKDQsICJlbnRlcmVkIik7CisJZG93bigmb3YtPmJ1Zl9sb2NrKTsKKwlvdjUxeF9kb19kZWFsbG9jKG92KTsKKwl1cCgmb3YtPmJ1Zl9sb2NrKTsKKwlQREVCVUcoNCwgImxlYXZpbmciKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBWNEwgMSBBUEkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitvdjUxeF92NGwxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKwlpbnQgZXJyLCBpOworCisJUERFQlVHKDQsICJvcGVuaW5nIik7CisKKwlkb3duKCZvdi0+bG9jayk7CisKKwllcnIgPSAtRUJVU1k7CisJaWYgKG92LT51c2VyKQorCQlnb3RvIG91dDsKKworCW92LT5zdWJfZmxhZyA9IDA7CisKKwkvKiBJbiBjYXNlIGFwcCBkb2Vzbid0IHNldCB0aGVtLi4uICovCisJZXJyID0gb3Y1MXhfc2V0X2RlZmF1bHRfcGFyYW1zKG92KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBNYWtlIHN1cmUgZnJhbWVzIGFyZSByZXNldCAqLworCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1GUkFNRVM7IGkrKykgeworCQlvdi0+ZnJhbWVbaV0uZ3JhYnN0YXRlID0gRlJBTUVfVU5VU0VEOworCQlvdi0+ZnJhbWVbaV0uYnl0ZXNfcmVhZCA9IDA7CisJfQorCisJLyogSWYgY29tcHJlc3Npb24gaXMgb24sIG1ha2Ugc3VyZSBub3cgdGhhdCBhCisJICogZGVjb21wcmVzc29yIGNhbiBiZSBsb2FkZWQgKi8KKwlpZiAob3YtPmNvbXByZXNzICYmICFvdi0+ZGVjb21wX29wcykgeworCQllcnIgPSByZXF1ZXN0X2RlY29tcHJlc3Nvcihvdik7CisJCWlmIChlcnIgJiYgIWR1bXBwaXgpCisJCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBvdjUxeF9hbGxvYyhvdik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gb3Y1MXhfaW5pdF9pc29jKG92KTsKKwlpZiAoZXJyKSB7CisJCW92NTF4X2RlYWxsb2Mob3YpOworCQlnb3RvIG91dDsKKwl9CisKKwlvdi0+dXNlcisrOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHZkZXY7CisKKwlpZiAob3YtPmxlZF9wb2xpY3kgPT0gTEVEX0FVVE8pCisJCW92NTF4X2xlZF9jb250cm9sKG92LCAxKTsKKworb3V0OgorCXVwKCZvdi0+bG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorb3Y1MXhfdjRsMV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisKKwlQREVCVUcoNCwgIm92NTExX2Nsb3NlIik7CisKKwlkb3duKCZvdi0+bG9jayk7CisKKwlvdi0+dXNlci0tOworCW92NTF4X3N0b3BfaXNvYyhvdik7CisKKwlyZWxlYXNlX2RlY29tcHJlc3Nvcihvdik7CisKKwlpZiAob3YtPmxlZF9wb2xpY3kgPT0gTEVEX0FVVE8pCisJCW92NTF4X2xlZF9jb250cm9sKG92LCAwKTsKKworCWlmIChvdi0+ZGV2KQorCQlvdjUxeF9kZWFsbG9jKG92KTsKKworCXVwKCZvdi0+bG9jayk7CisKKwkvKiBEZXZpY2UgdW5wbHVnZ2VkIHdoaWxlIG9wZW4uIE9ubHkgYSBtaW5pbXVtIG9mIHVucmVnaXN0cmF0aW9uIGlzIGRvbmUKKwkgKiBoZXJlOyB0aGUgZGlzY29ubmVjdCBjYWxsYmFjayBhbHJlYWR5IGRpZCB0aGUgcmVzdC4gKi8KKwlpZiAoIW92LT5kZXYpIHsKKwkJZG93bigmb3YtPmNidWZfbG9jayk7CisJCWtmcmVlKG92LT5jYnVmKTsKKwkJb3YtPmNidWYgPSBOVUxMOworCQl1cCgmb3YtPmNidWZfbG9jayk7CisKKwkJb3Y1MXhfZGVhbGxvYyhvdik7CisJCWtmcmVlKG92KTsKKwkJb3YgPSBOVUxMOworCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qIERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkhICovCitzdGF0aWMgaW50CitvdjUxeF92NGwxX2lvY3RsX2ludGVybmFsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCVBERUJVRyg1LCAiSU9DdGw6IDB4JVgiLCBjbWQpOworCisJaWYgKCFvdi0+ZGV2KQorCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NHQ0FQOgorCXsKKwkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmIgPSBhcmc7CisKKwkJUERFQlVHKDQsICJWSURJT0NHQ0FQIik7CisKKwkJbWVtc2V0KGIsIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSkpOworCQlzcHJpbnRmKGItPm5hbWUsICIlcyBVU0IgQ2FtZXJhIiwKKwkJCXN5bWJvbGljKGJyZ2xpc3QsIG92LT5icmlkZ2UpKTsKKwkJYi0+dHlwZSA9IFZJRF9UWVBFX0NBUFRVUkUgfCBWSURfVFlQRV9TVUJDQVBUVVJFOworCQliLT5jaGFubmVscyA9IG92LT5udW1faW5wdXRzOworCQliLT5hdWRpb3MgPSAwOworCQliLT5tYXh3aWR0aCA9IG92LT5tYXh3aWR0aDsKKwkJYi0+bWF4aGVpZ2h0ID0gb3YtPm1heGhlaWdodDsKKwkJYi0+bWlud2lkdGggPSBvdi0+bWlud2lkdGg7CisJCWItPm1pbmhlaWdodCA9IG92LT5taW5oZWlnaHQ7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DR0NIQU46CisJeworCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKworCQlQREVCVUcoNCwgIlZJRElPQ0dDSEFOIik7CisKKwkJaWYgKCh1bnNpZ25lZCkodi0+Y2hhbm5lbCkgPj0gb3YtPm51bV9pbnB1dHMpIHsKKwkJCWVycigiSW52YWxpZCBjaGFubmVsICglZCkiLCB2LT5jaGFubmVsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJdi0+bm9ybSA9IG92LT5ub3JtOworCQl2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCXYtPmZsYWdzID0gMDsKKy8vCQl2LT5mbGFncyB8PSAob3YtPmhhc19kZWNvZGVyKSA/IFZJREVPX1ZDX05PUk0gOiAwOworCQl2LT50dW5lcnMgPSAwOworCQlkZWNvZGVyX2dldF9pbnB1dF9uYW1lKG92LCB2LT5jaGFubmVsLCB2LT5uYW1lKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTQ0hBTjoKKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCQlpbnQgZXJyOworCisJCVBERUJVRyg0LCAiVklESU9DU0NIQU4iKTsKKworCQkvKiBNYWtlIHN1cmUgaXQncyBub3QgYSBjYW1lcmEgKi8KKwkJaWYgKCFvdi0+aGFzX2RlY29kZXIpIHsKKwkJCWlmICh2LT5jaGFubmVsID09IDApCisJCQkJcmV0dXJuIDA7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAodi0+bm9ybSAhPSBWSURFT19NT0RFX1BBTCAmJgorCQkgICAgdi0+bm9ybSAhPSBWSURFT19NT0RFX05UU0MgJiYKKwkJICAgIHYtPm5vcm0gIT0gVklERU9fTU9ERV9TRUNBTSAmJgorCQkgICAgdi0+bm9ybSAhPSBWSURFT19NT0RFX0FVVE8pIHsKKwkJCWVycigiSW52YWxpZCBub3JtICglZCkiLCB2LT5ub3JtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCh1bnNpZ25lZCkodi0+Y2hhbm5lbCkgPj0gb3YtPm51bV9pbnB1dHMpIHsKKwkJCWVycigiSW52YWxpZCBjaGFubmVsICglZCkiLCB2LT5jaGFubmVsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZXJyID0gZGVjb2Rlcl9zZXRfaW5wdXQob3YsIHYtPmNoYW5uZWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSBkZWNvZGVyX3NldF9ub3JtKG92LCB2LT5ub3JtKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DR1BJQ1Q6CisJeworCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCA9IGFyZzsKKworCQlQREVCVUcoNCwgIlZJRElPQ0dQSUNUIik7CisKKwkJbWVtc2V0KHAsIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fcGljdHVyZSkpOworCQlpZiAoc2Vuc29yX2dldF9waWN0dXJlKG92LCBwKSkKKwkJCXJldHVybiAtRUlPOworCisJCS8qIENhbiB3ZSBnZXQgdGhlc2UgZnJvbSBmcmFtZVswXT8gLWNsYXVkaW8/ICovCisJCXAtPmRlcHRoID0gb3YtPmZyYW1lWzBdLmRlcHRoOworCQlwLT5wYWxldHRlID0gb3YtPmZyYW1lWzBdLmZvcm1hdDsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTUElDVDoKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCQlpbnQgaSwgcmM7CisKKwkJUERFQlVHKDQsICJWSURJT0NTUElDVCIpOworCisJCWlmICghZ2V0X2RlcHRoKHAtPnBhbGV0dGUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHNlbnNvcl9zZXRfcGljdHVyZShvdiwgcCkpCisJCQlyZXR1cm4gLUVJTzsKKworCQlpZiAoZm9yY2VfcGFsZXR0ZSAmJiBwLT5wYWxldHRlICE9IGZvcmNlX3BhbGV0dGUpIHsKKwkJCWluZm8oIlBhbGV0dGUgcmVqZWN0ZWQgKCVzKSIsCisJCQkgICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIHAtPnBhbGV0dGUpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLy8gRklYTUU6IEZvcm1hdCBzaG91bGQgYmUgaW5kZXBlbmRlbnQgb2YgZnJhbWVzCisJCWlmIChwLT5wYWxldHRlICE9IG92LT5mcmFtZVswXS5mb3JtYXQpIHsKKwkJCVBERUJVRyg0LCAiRGV0ZWN0ZWQgZm9ybWF0IGNoYW5nZSIpOworCisJCQlyYyA9IG92NTF4X3dhaXRfZnJhbWVzX2luYWN0aXZlKG92KTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisKKwkJCW1vZGVfaW5pdF9yZWdzKG92LCBvdi0+ZnJhbWVbMF0ud2lkdGgsCisJCQkJb3YtPmZyYW1lWzBdLmhlaWdodCwgcC0+cGFsZXR0ZSwgb3YtPnN1Yl9mbGFnKTsKKwkJfQorCisJCVBERUJVRyg0LCAiU2V0dGluZyBkZXB0aD0lZCwgcGFsZXR0ZT0lcyIsCisJCSAgICAgICBwLT5kZXB0aCwgc3ltYm9saWModjRsMV9wbGlzdCwgcC0+cGFsZXR0ZSkpOworCisJCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1GUkFNRVM7IGkrKykgeworCQkJb3YtPmZyYW1lW2ldLmRlcHRoID0gcC0+ZGVwdGg7CisJCQlvdi0+ZnJhbWVbaV0uZm9ybWF0ID0gcC0+cGFsZXR0ZTsKKwkJfQorCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ0dDQVBUVVJFOgorCXsKKwkJaW50ICp2ZiA9IGFyZzsKKworCQlQREVCVUcoNCwgIlZJRElPQ0dDQVBUVVJFIik7CisKKwkJb3YtPnN1Yl9mbGFnID0gKnZmOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTQ0FQVFVSRToKKwl7CisJCXN0cnVjdCB2aWRlb19jYXB0dXJlICp2YyA9IGFyZzsKKworCQlQREVCVUcoNCwgIlZJRElPQ1NDQVBUVVJFIik7CisKKwkJaWYgKHZjLT5mbGFncykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAodmMtPmRlY2ltYXRpb24pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl2Yy0+eCAmPSB+M0w7CisJCXZjLT55ICY9IH4xTDsKKwkJdmMtPnkgJj0gfjMxTDsKKworCQlpZiAodmMtPndpZHRoID09IDApCisJCQl2Yy0+d2lkdGggPSAzMjsKKworCQl2Yy0+aGVpZ2h0IC89IDE2OworCQl2Yy0+aGVpZ2h0ICo9IDE2OworCQlpZiAodmMtPmhlaWdodCA9PSAwKQorCQkJdmMtPmhlaWdodCA9IDE2OworCisJCW92LT5zdWJ4ID0gdmMtPng7CisJCW92LT5zdWJ5ID0gdmMtPnk7CisJCW92LT5zdWJ3ID0gdmMtPndpZHRoOworCQlvdi0+c3ViaCA9IHZjLT5oZWlnaHQ7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU1dJTjoKKwl7CisJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCQlpbnQgaSwgcmM7CisKKwkJUERFQlVHKDQsICJWSURJT0NTV0lOOiAlZHglZCIsIHZ3LT53aWR0aCwgdnctPmhlaWdodCk7CisKKyNpZiAwCisJCWlmICh2dy0+ZmxhZ3MpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHZ3LT5jbGlwY291bnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHZ3LT5oZWlnaHQgIT0gb3YtPm1heGhlaWdodCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAodnctPndpZHRoICE9IG92LT5tYXh3aWR0aCkKKwkJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisKKwkJcmMgPSBvdjUxeF93YWl0X2ZyYW1lc19pbmFjdGl2ZShvdik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IG1vZGVfaW5pdF9yZWdzKG92LCB2dy0+d2lkdGgsIHZ3LT5oZWlnaHQsCisJCQlvdi0+ZnJhbWVbMF0uZm9ybWF0LCBvdi0+c3ViX2ZsYWcpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCWZvciAoaSA9IDA7IGkgPCBPVjUxMV9OVU1GUkFNRVM7IGkrKykgeworCQkJb3YtPmZyYW1lW2ldLndpZHRoID0gdnctPndpZHRoOworCQkJb3YtPmZyYW1lW2ldLmhlaWdodCA9IHZ3LT5oZWlnaHQ7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NHV0lOOgorCXsKKwkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7CisKKwkJbWVtc2V0KHZ3LCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX3dpbmRvdykpOworCQl2dy0+eCA9IDA7CQkvKiBGSVhNRSAqLworCQl2dy0+eSA9IDA7CisJCXZ3LT53aWR0aCA9IG92LT5mcmFtZVswXS53aWR0aDsKKwkJdnctPmhlaWdodCA9IG92LT5mcmFtZVswXS5oZWlnaHQ7CisJCXZ3LT5mbGFncyA9IDMwOworCisJCVBERUJVRyg0LCAiVklESU9DR1dJTjogJWR4JWQiLCB2dy0+d2lkdGgsIHZ3LT5oZWlnaHQpOworCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ0dNQlVGOgorCXsKKwkJc3RydWN0IHZpZGVvX21idWYgKnZtID0gYXJnOworCQlpbnQgaTsKKworCQlQREVCVUcoNCwgIlZJRElPQ0dNQlVGIik7CisKKwkJbWVtc2V0KHZtLCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX21idWYpKTsKKwkJdm0tPnNpemUgPSBPVjUxMV9OVU1GUkFNRVMKKwkJCSAgICogTUFYX0RBVEFfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpOworCQl2bS0+ZnJhbWVzID0gT1Y1MTFfTlVNRlJBTUVTOworCisJCXZtLT5vZmZzZXRzWzBdID0gMDsKKwkJZm9yIChpID0gMTsgaSA8IE9WNTExX05VTUZSQU1FUzsgaSsrKSB7CisJCQl2bS0+b2Zmc2V0c1tpXSA9IHZtLT5vZmZzZXRzW2ktMV0KKwkJCSAgICsgTUFYX0RBVEFfU0laRShvdi0+bWF4d2lkdGgsIG92LT5tYXhoZWlnaHQpOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DTUNBUFRVUkU6CisJeworCQlzdHJ1Y3QgdmlkZW9fbW1hcCAqdm0gPSBhcmc7CisJCWludCByYywgZGVwdGg7CisJCXVuc2lnbmVkIGludCBmID0gdm0tPmZyYW1lOworCisJCVBERUJVRyg0LCAiVklESU9DTUNBUFRVUkU6IGZyYW1lOiAlZCwgJWR4JWQsICVzIiwgZiwgdm0tPndpZHRoLAorCQkJdm0tPmhlaWdodCwgc3ltYm9saWModjRsMV9wbGlzdCwgdm0tPmZvcm1hdCkpOworCisJCWRlcHRoID0gZ2V0X2RlcHRoKHZtLT5mb3JtYXQpOworCQlpZiAoIWRlcHRoKSB7CisJCQlQREVCVUcoMiwgIlZJRElPQ01DQVBUVVJFOiBpbnZhbGlkIGZvcm1hdCAoJXMpIiwKKwkJCSAgICAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCB2bS0+Zm9ybWF0KSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChmID49IE9WNTExX05VTUZSQU1FUykgeworCQkJZXJyKCJWSURJT0NNQ0FQVFVSRTogaW52YWxpZCBmcmFtZSAoJWQpIiwgZik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICh2bS0+d2lkdGggPiBvdi0+bWF4d2lkdGgKKwkJICAgIHx8IHZtLT5oZWlnaHQgPiBvdi0+bWF4aGVpZ2h0KSB7CisJCQllcnIoIlZJRElPQ01DQVBUVVJFOiByZXF1ZXN0ZWQgZGltZW5zaW9ucyB0b28gYmlnIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChvdi0+ZnJhbWVbZl0uZ3JhYnN0YXRlID09IEZSQU1FX0dSQUJCSU5HKSB7CisJCQlQREVCVUcoNCwgIlZJRElPQ01DQVBUVVJFOiBhbHJlYWR5IGdyYWJiaW5nIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJaWYgKGZvcmNlX3BhbGV0dGUgJiYgKHZtLT5mb3JtYXQgIT0gZm9yY2VfcGFsZXR0ZSkpIHsKKwkJCVBERUJVRygyLCAicGFsZXR0ZSByZWplY3RlZCAoJXMpIiwKKwkJCSAgICAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCB2bS0+Zm9ybWF0KSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICgob3YtPmZyYW1lW2ZdLndpZHRoICE9IHZtLT53aWR0aCkgfHwKKwkJICAgIChvdi0+ZnJhbWVbZl0uaGVpZ2h0ICE9IHZtLT5oZWlnaHQpIHx8CisJCSAgICAob3YtPmZyYW1lW2ZdLmZvcm1hdCAhPSB2bS0+Zm9ybWF0KSB8fAorCQkgICAgKG92LT5mcmFtZVtmXS5zdWJfZmxhZyAhPSBvdi0+c3ViX2ZsYWcpIHx8CisJCSAgICAob3YtPmZyYW1lW2ZdLmRlcHRoICE9IGRlcHRoKSkgeworCQkJUERFQlVHKDQsICJWSURJT0NNQ0FQVFVSRTogY2hhbmdlIGluIGltYWdlIHBhcmFtZXRlcnMiKTsKKworCQkJcmMgPSBvdjUxeF93YWl0X2ZyYW1lc19pbmFjdGl2ZShvdik7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlyYyA9IG1vZGVfaW5pdF9yZWdzKG92LCB2bS0+d2lkdGgsIHZtLT5oZWlnaHQsCisJCQkJdm0tPmZvcm1hdCwgb3YtPnN1Yl9mbGFnKTsKKyNpZiAwCisJCQlpZiAocmMgPCAwKSB7CisJCQkJUERFQlVHKDEsICJHb3QgZXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nIHJlZ3MgIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKyNlbmRpZgorCQkJb3YtPmZyYW1lW2ZdLndpZHRoID0gdm0tPndpZHRoOworCQkJb3YtPmZyYW1lW2ZdLmhlaWdodCA9IHZtLT5oZWlnaHQ7CisJCQlvdi0+ZnJhbWVbZl0uZm9ybWF0ID0gdm0tPmZvcm1hdDsKKwkJCW92LT5mcmFtZVtmXS5zdWJfZmxhZyA9IG92LT5zdWJfZmxhZzsKKwkJCW92LT5mcmFtZVtmXS5kZXB0aCA9IGRlcHRoOworCQl9CisKKwkJLyogTWFyayBpdCBhcyByZWFkeSAqLworCQlvdi0+ZnJhbWVbZl0uZ3JhYnN0YXRlID0gRlJBTUVfUkVBRFk7CisKKwkJUERFQlVHKDQsICJWSURJT0NNQ0FQVFVSRTogcmVuZXdpbmcgZnJhbWUgJWQiLCBmKTsKKworCQlyZXR1cm4gb3Y1MXhfbmV3X2ZyYW1lKG92LCBmKTsKKwl9CisJY2FzZSBWSURJT0NTWU5DOgorCXsKKwkJdW5zaWduZWQgaW50IGZudW0gPSAqKCh1bnNpZ25lZCBpbnQgKikgYXJnKTsKKwkJc3RydWN0IG92NTExX2ZyYW1lICpmcmFtZTsKKwkJaW50IHJjOworCisJCWlmIChmbnVtID49IE9WNTExX05VTUZSQU1FUykgeworCQkJZXJyKCJWSURJT0NTWU5DOiBpbnZhbGlkIGZyYW1lICglZCkiLCBmbnVtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZnJhbWUgPSAmb3YtPmZyYW1lW2ZudW1dOworCisJCVBERUJVRyg0LCAic3luY2luZyB0byBmcmFtZSAlZCwgZ3JhYnN0YXRlID0gJWQiLCBmbnVtLAorCQkgICAgICAgZnJhbWUtPmdyYWJzdGF0ZSk7CisKKwkJc3dpdGNoIChmcmFtZS0+Z3JhYnN0YXRlKSB7CisJCWNhc2UgRlJBTUVfVU5VU0VEOgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgRlJBTUVfUkVBRFk6CisJCWNhc2UgRlJBTUVfR1JBQkJJTkc6CisJCWNhc2UgRlJBTUVfRVJST1I6CityZWRvOgorCQkJaWYgKCFvdi0+ZGV2KQorCQkJCXJldHVybiAtRUlPOworCisJCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShmcmFtZS0+d3EsCisJCQkgICAgKGZyYW1lLT5ncmFic3RhdGUgPT0gRlJBTUVfRE9ORSkKKwkJCSAgICB8fCAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9FUlJPUikpOworCisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlpZiAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9FUlJPUikgeworCQkJCWlmICgocmMgPSBvdjUxeF9uZXdfZnJhbWUob3YsIGZudW0pKSA8IDApCisJCQkJCXJldHVybiByYzsKKwkJCQlnb3RvIHJlZG87CisJCQl9CisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBGUkFNRV9ET05FOgorCQkJaWYgKG92LT5zbmFwX2VuYWJsZWQgJiYgIWZyYW1lLT5zbmFwc2hvdCkgeworCQkJCWlmICgocmMgPSBvdjUxeF9uZXdfZnJhbWUob3YsIGZudW0pKSA8IDApCisJCQkJCXJldHVybiByYzsKKwkJCQlnb3RvIHJlZG87CisJCQl9CisKKwkJCWZyYW1lLT5ncmFic3RhdGUgPSBGUkFNRV9VTlVTRUQ7CisKKwkJCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBzbmFwc2hvdCBidXR0b24gKi8KKwkJCS8qIEZJWE1FIC0gSXMgdGhpcyB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcz8gKi8KKwkJCWlmICgob3YtPnNuYXBfZW5hYmxlZCkgJiYgKGZyYW1lLT5zbmFwc2hvdCkpIHsKKwkJCQlmcmFtZS0+c25hcHNob3QgPSAwOworCQkJCW92NTF4X2NsZWFyX3NuYXBzaG90KG92KTsKKwkJCX0KKworCQkJLyogRGVjb21wcmVzc2lvbiwgZm9ybWF0IGNvbnZlcnNpb24sIGV0Yy4uLiAqLworCQkJb3Y1MXhfcG9zdHByb2Nlc3Mob3YsIGZyYW1lKTsKKworCQkJYnJlYWs7CisJCX0gLyogZW5kIHN3aXRjaCAqLworCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ0dGQlVGOgorCXsKKwkJc3RydWN0IHZpZGVvX2J1ZmZlciAqdmIgPSBhcmc7CisKKwkJUERFQlVHKDQsICJWSURJT0NHRkJVRiIpOworCisJCW1lbXNldCh2YiwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19idWZmZXIpKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NHVU5JVDoKKwl7CisJCXN0cnVjdCB2aWRlb191bml0ICp2dSA9IGFyZzsKKworCQlQREVCVUcoNCwgIlZJRElPQ0dVTklUIik7CisKKwkJbWVtc2V0KHZ1LCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX3VuaXQpKTsKKworCQl2dS0+dmlkZW8gPSBvdi0+dmRldi0+bWlub3I7CisJCXZ1LT52YmkgPSBWSURFT19OT19VTklUOworCQl2dS0+cmFkaW8gPSBWSURFT19OT19VTklUOworCQl2dS0+YXVkaW8gPSBWSURFT19OT19VTklUOworCQl2dS0+dGVsZXRleHQgPSBWSURFT19OT19VTklUOworCisJCXJldHVybiAwOworCX0KKwljYXNlIE9WNTExSU9DX1dJMkM6CisJeworCQlzdHJ1Y3Qgb3Y1MTFfaTJjX3N0cnVjdCAqdyA9IGFyZzsKKworCQlyZXR1cm4gaTJjX3dfc2xhdmUob3YsIHctPnNsYXZlLCB3LT5yZWcsIHctPnZhbHVlLCB3LT5tYXNrKTsKKwl9CisJY2FzZSBPVjUxMUlPQ19SSTJDOgorCXsKKwkJc3RydWN0IG92NTExX2kyY19zdHJ1Y3QgKnIgPSBhcmc7CisJCWludCByYzsKKworCQlyYyA9IGkyY19yX3NsYXZlKG92LCByLT5zbGF2ZSwgci0+cmVnKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlyLT52YWx1ZSA9IHJjOworCQlyZXR1cm4gMDsKKwl9CisJZGVmYXVsdDoKKwkJUERFQlVHKDMsICJVbnN1cHBvcnRlZCBJT0N0bDogMHglWCIsIGNtZCk7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfSAvKiBlbmQgc3dpdGNoICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorb3Y1MXhfdjRsMV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKwlpbnQgcmM7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZvdi0+bG9jaykpCisJCXJldHVybiAtRUlOVFI7CisKKwlyYyA9IHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgb3Y1MXhfdjRsMV9pb2N0bF9pbnRlcm5hbCk7CisKKwl1cCgmb3YtPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QKK292NTF4X3Y0bDFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IG5vYmxvY2sgPSBmaWxlLT5mX2ZsYWdzJk9fTk9OQkxPQ0s7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IGNudDsKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCWludCBpLCByYyA9IDAsIGZybXggPSAtMTsKKwlzdHJ1Y3Qgb3Y1MTFfZnJhbWUgKmZyYW1lOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmb3YtPmxvY2spKQorCQlyZXR1cm4gLUVJTlRSOworCisJUERFQlVHKDQsICIlbGQgYnl0ZXMsIG5vYmxvY2s9JWQiLCBjb3VudCwgbm9ibG9jayk7CisKKwlpZiAoIXZkZXYgfHwgIWJ1ZikgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKCFvdi0+ZGV2KSB7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CisKKy8vIEZJWE1FOiBPbmx5IHN1cHBvcnRzIHR3byBmcmFtZXMKKwkvKiBTZWUgaWYgYSBmcmFtZSBpcyBjb21wbGV0ZWQsIHRoZW4gdXNlIGl0LiAqLworCWlmIChvdi0+ZnJhbWVbMF0uZ3JhYnN0YXRlID49IEZSQU1FX0RPTkUpCS8qIF9ET05FIG9yIF9FUlJPUiAqLworCQlmcm14ID0gMDsKKwllbHNlIGlmIChvdi0+ZnJhbWVbMV0uZ3JhYnN0YXRlID49IEZSQU1FX0RPTkUpLyogX0RPTkUgb3IgX0VSUk9SICovCisJCWZybXggPSAxOworCisJLyogSWYgbm9uYmxvY2tpbmcgd2UgcmV0dXJuIGltbWVkaWF0ZWx5ICovCisJaWYgKG5vYmxvY2sgJiYgKGZybXggPT0gLTEpKSB7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBJZiBubyBGUkFNRV9ET05FLCBsb29rIGZvciBhIEZSQU1FX0dSQUJCSU5HIHN0YXRlLiAqLworCS8qIFNlZSBpZiBhIGZyYW1lIGlzIGluIHByb2Nlc3MgKGdyYWJiaW5nKSwgdGhlbiB1c2UgaXQuICovCisJaWYgKGZybXggPT0gLTEpIHsKKwkJaWYgKG92LT5mcmFtZVswXS5ncmFic3RhdGUgPT0gRlJBTUVfR1JBQkJJTkcpCisJCQlmcm14ID0gMDsKKwkJZWxzZSBpZiAob3YtPmZyYW1lWzFdLmdyYWJzdGF0ZSA9PSBGUkFNRV9HUkFCQklORykKKwkJCWZybXggPSAxOworCX0KKworCS8qIElmIG5vIGZyYW1lIGlzIGFjdGl2ZSwgc3RhcnQgb25lLiAqLworCWlmIChmcm14ID09IC0xKSB7CisJCWlmICgocmMgPSBvdjUxeF9uZXdfZnJhbWUob3YsIGZybXggPSAwKSkpIHsKKwkJCWVycigicmVhZDogb3Y1MXhfbmV3X2ZyYW1lIGVycm9yIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJZnJhbWUgPSAmb3YtPmZyYW1lW2ZybXhdOworCityZXN0YXJ0OgorCWlmICghb3YtPmRldikgeworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogV2FpdCB3aGlsZSB3ZSdyZSBncmFiYmluZyB0aGUgaW1hZ2UgKi8KKwlQREVCVUcoNCwgIldhaXRpbmcgaW1hZ2UgZ3JhYmJpbmciKTsKKwlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShmcmFtZS0+d3EsCisJCShmcmFtZS0+Z3JhYnN0YXRlID09IEZSQU1FX0RPTkUpCisJCXx8IChmcmFtZS0+Z3JhYnN0YXRlID09IEZSQU1FX0VSUk9SKSk7CisKKwlpZiAocmMpCisJCWdvdG8gZXJyb3I7CisKKwlQREVCVUcoNCwgIkdvdCBpbWFnZSwgZnJhbWUtPmdyYWJzdGF0ZSA9ICVkIiwgZnJhbWUtPmdyYWJzdGF0ZSk7CisJUERFQlVHKDQsICJieXRlc19yZWN2ZCA9ICVkIiwgZnJhbWUtPmJ5dGVzX3JlY3ZkKTsKKworCWlmIChmcmFtZS0+Z3JhYnN0YXRlID09IEZSQU1FX0VSUk9SKSB7CisJCWZyYW1lLT5ieXRlc19yZWFkID0gMDsKKwkJZXJyKCIqKiBpY2shICoqIEVycm9yZWQgZnJhbWUgJWQiLCBvdi0+Y3VyZnJhbWUpOworCQlpZiAob3Y1MXhfbmV3X2ZyYW1lKG92LCBmcm14KSkgeworCQkJZXJyKCJyZWFkOiBvdjUxeF9uZXdfZnJhbWUgZXJyb3IiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZ290byByZXN0YXJ0OworCX0KKworCisJLyogUmVwZWF0IHVudGlsIHdlIGdldCBhIHNuYXBzaG90IGZyYW1lICovCisJaWYgKG92LT5zbmFwX2VuYWJsZWQpCisJCVBERUJVRyg0LCAiV2FpdGluZyBzbmFwc2hvdCBmcmFtZSIpOworCWlmIChvdi0+c25hcF9lbmFibGVkICYmICFmcmFtZS0+c25hcHNob3QpIHsKKwkJZnJhbWUtPmJ5dGVzX3JlYWQgPSAwOworCQlpZiAoKHJjID0gb3Y1MXhfbmV3X2ZyYW1lKG92LCBmcm14KSkpIHsKKwkJCWVycigicmVhZDogb3Y1MXhfbmV3X2ZyYW1lIGVycm9yIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwkvKiBDbGVhciB0aGUgc25hcHNob3QgKi8KKwlpZiAob3YtPnNuYXBfZW5hYmxlZCAmJiBmcmFtZS0+c25hcHNob3QpIHsKKwkJZnJhbWUtPnNuYXBzaG90ID0gMDsKKwkJb3Y1MXhfY2xlYXJfc25hcHNob3Qob3YpOworCX0KKworCS8qIERlY29tcHJlc3Npb24sIGZvcm1hdCBjb252ZXJzaW9uLCBldGMuLi4gKi8KKwlvdjUxeF9wb3N0cHJvY2VzcyhvdiwgZnJhbWUpOworCisJUERFQlVHKDQsICJmcm14PSVkLCBieXRlc19yZWFkPSVsZCwgbGVuZ3RoPSVsZCIsIGZybXgsCisJCWZyYW1lLT5ieXRlc19yZWFkLAorCQlnZXRfZnJhbWVfbGVuZ3RoKGZyYW1lKSk7CisKKwkvKiBjb3B5IGJ5dGVzIHRvIHVzZXIgc3BhY2U7IHdlIGFsbG93IGZvciBwYXJ0aWFscyByZWFkcyAqLworLy8JaWYgKChjb3VudCArIGZyYW1lLT5ieXRlc19yZWFkKQorLy8JICAgID4gZ2V0X2ZyYW1lX2xlbmd0aCgoc3RydWN0IG92NTExX2ZyYW1lICopZnJhbWUpKQorLy8JCWNvdW50ID0gZnJhbWUtPnNjYW5sZW5ndGggLSBmcmFtZS0+Ynl0ZXNfcmVhZDsKKworCS8qIEZJWE1FIC0gY291bnQgaGFyZHdpcmVkIHRvIGJlIG9uZSBmcmFtZS4uLiAqLworCWNvdW50ID0gZ2V0X2ZyYW1lX2xlbmd0aChmcmFtZSk7CisKKwlQREVCVUcoNCwgIkNvcHkgdG8gdXNlciBzcGFjZTogJWxkIGJ5dGVzIiwgY291bnQpOworCWlmICgoaSA9IGNvcHlfdG9fdXNlcihidWYsIGZyYW1lLT5kYXRhICsgZnJhbWUtPmJ5dGVzX3JlYWQsIGNvdW50KSkpIHsKKwkJUERFQlVHKDQsICJDb3B5IGZhaWxlZCEgJWQgYnl0ZXMgbm90IGNvcGllZCIsIGkpOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZnJhbWUtPmJ5dGVzX3JlYWQgKz0gY291bnQ7CisJUERFQlVHKDQsICJ7Y29weX0gY291bnQgdXNlZD0lbGQsIG5ldyBieXRlc19yZWFkPSVsZCIsCisJCWNvdW50LCBmcmFtZS0+Ynl0ZXNfcmVhZCk7CisKKwkvKiBJZiBhbGwgZGF0YSBoYXZlIGJlZW4gcmVhZC4uLiAqLworCWlmIChmcmFtZS0+Ynl0ZXNfcmVhZAorCSAgICA+PSBnZXRfZnJhbWVfbGVuZ3RoKGZyYW1lKSkgeworCQlmcmFtZS0+Ynl0ZXNfcmVhZCA9IDA7CisKKy8vIEZJWE1FOiBPbmx5IHN1cHBvcnRzIHR3byBmcmFtZXMKKwkJLyogTWFyayBpdCBhcyBhdmFpbGFibGUgdG8gYmUgdXNlZCBhZ2Fpbi4gKi8KKwkJb3YtPmZyYW1lW2ZybXhdLmdyYWJzdGF0ZSA9IEZSQU1FX1VOVVNFRDsKKwkJaWYgKChyYyA9IG92NTF4X25ld19mcmFtZShvdiwgIWZybXgpKSkgeworCQkJZXJyKCJvdjUxeF9uZXdfZnJhbWUgcmV0dXJuZWQgZXJyb3IiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlQREVCVUcoNCwgInJlYWQgZmluaXNoZWQsIHJldHVybmluZyAlbGQgKHN3ZWV0KSIsIGNvdW50KTsKKworCXVwKCZvdi0+bG9jayk7CisJcmV0dXJuIGNvdW50OworCitlcnJvcjoKKwl1cCgmb3YtPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorb3Y1MXhfdjRsMV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSAgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKwl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvczsKKworCWlmIChvdi0+ZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJUERFQlVHKDQsICJtbWFwOiAlbGQgKCVsWCkgYnl0ZXMiLCBzaXplLCBzaXplKTsKKworCWlmIChzaXplID4gKCgoT1Y1MTFfTlVNRlJBTUVTCisJICAgICAgICAgICAgICAqIE1BWF9EQVRBX1NJWkUob3YtPm1heHdpZHRoLCBvdi0+bWF4aGVpZ2h0KQorCSAgICAgICAgICAgICAgKyBQQUdFX1NJWkUgLSAxKSAmIH4oUEFHRV9TSVpFIC0gMSkpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZvdi0+bG9jaykpCisJCXJldHVybiAtRUlOVFI7CisKKwlwb3MgPSAodW5zaWduZWQgbG9uZylvdi0+ZmJ1ZjsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkgeworCQkJdXAoJm92LT5sb2NrKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJZWxzZQorCQkJc2l6ZSA9IDA7CisJfQorCisJdXAoJm92LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb3Y1MTFfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQlvdjUxeF92NGwxX29wZW4sCisJLnJlbGVhc2UgPQlvdjUxeF92NGwxX2Nsb3NlLAorCS5yZWFkID0JCW92NTF4X3Y0bDFfcmVhZCwKKwkubW1hcCA9CQlvdjUxeF92NGwxX21tYXAsCisJLmlvY3RsID0Jb3Y1MXhfdjRsMV9pb2N0bCwKKwkubGxzZWVrID0Jbm9fbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdmRldl90ZW1wbGF0ZSA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkiT1Y1MTEgVVNCIENhbWVyYSIsCisJLnR5cGUgPQkJVklEX1RZUEVfQ0FQVFVSRSwKKwkuaGFyZHdhcmUgPQlWSURfSEFSRFdBUkVfT1Y1MTEsCisJLmZvcHMgPQkJJm92NTExX2ZvcHMsCisJLnJlbGVhc2UgPQl2aWRlb19kZXZpY2VfcmVsZWFzZSwKKwkubWlub3IgPQktMSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogT1Y1MTEgYW5kIHNlbnNvciBjb25maWd1cmF0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBpbml0aWFsaXplcyB0aGUgT1Y3NjEwLCBPVjc2MjAsIG9yIE9WNzZCRSBzZW5zb3IuIFRoZSBPVjc2QkUgdXNlcworICogdGhlIHNhbWUgcmVnaXN0ZXIgc2V0dGluZ3MgYXMgdGhlIE9WNzYxMCwgc2luY2UgdGhleSBhcmUgdmVyeSBzaW1pbGFyLgorICovCitzdGF0aWMgaW50Citvdjd4eDBfY29uZmlndXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCWludCBpLCBzdWNjZXNzOworCWludCByYzsKKworCS8qIExhd3JlbmNlIEdsYWlzdGVyIDxsZ0BqZm0uYmMuY2E+IHJlcG9ydHM6CisJICoKKwkgKiBSZWdpc3RlciAweDBmIGluIHRoZSA3NjEwIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6CisJICoKKwkgKiAweDg1IChBRUMgbWV0aG9kIDEpOiBCZXN0IG92ZXJhbGwsIGdvb2QgY29udHJhc3QgcmFuZ2UKKwkgKiAweDQ1IChBRUMgbWV0aG9kIDIpOiBWZXJ5IG92ZXJleHBvc2VkCisJICogMHhhNSAoc3BlYyBzaGVldCBkZWZhdWx0KTogT2ssIGJ1dCB0aGUgYmxhY2sgbGV2ZWwgaXMKKwkgKglzaGlmdGVkIHJlc3VsdGluZyBpbiBsb3NzIG9mIGNvbnRyYXN0CisJICogMHgwNSAob2xkIGRyaXZlciBzZXR0aW5nKTogdmVyeSBvdmVyZXhwb3NlZCwgdG9vIG11Y2gKKwkgKgljb250cmFzdAorCSAqLworCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm03NjEwW10gPSB7CisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMCwgMHhmZiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTYsIDB4MDYgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDI4LCAweDI0IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyYiwgMHhhYyB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTIsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDM4LCAweDgxIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyOCwgMHgyNCB9LAkvKiAwYyAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MGYsIDB4ODUgfSwJLyogbGcncyBzZXR0aW5nICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxNSwgMHgwMSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjAsIDB4MWMgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDIzLCAweDJhIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyNCwgMHgxMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjUsIDB4OGEgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDI2LCAweGEyIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyNywgMHhjMiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MmEsIDB4MDQgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDJjLCAweGZlIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyZCwgMHg5MyB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MzAsIDB4NzEgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDMxLCAweDYwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzMiwgMHgyNiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MzMsIDB4MjAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDM0LCAweDQ4IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMiwgMHgyNCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTEsIDB4MDEgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDBjLCAweDI0IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwZCwgMHgyNCB9LAorCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwKKwl9OworCisJc3RhdGljIHN0cnVjdCBvdjUxMV9yZWd2YWxzIGFSZWd2YWxzTm9ybTc2MjBbXSA9IHsKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDAwLCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwMSwgMHg4MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MDIsIDB4ODAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDAzLCAweGMwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwNiwgMHg2MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MDcsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDBjLCAweDI0IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwYywgMHgyNCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MGQsIDB4MjQgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDExLCAweDAxIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMiwgMHgyNCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTMsIDB4MDEgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDE0LCAweDg0IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxNSwgMHgwMSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTYsIDB4MDMgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDE3LCAweDJmIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxOCwgMHhjZiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTksIDB4MDYgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDFhLCAweGY1IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxYiwgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjAsIDB4MTggfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDIxLCAweDgwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyMiwgMHg4MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjMsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDI2LCAweGEyIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyNywgMHhlYSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MjgsIDB4MjAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDI5LCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyYSwgMHgxMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MmIsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDJjLCAweDg4IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyZCwgMHg5MSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MmUsIDB4ODAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDJmLCAweDQ0IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2MCwgMHgyNyB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NjEsIDB4MDIgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDYyLCAweDVmIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2MywgMHhkNSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NjQsIDB4NTcgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDY1LCAweDgzIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2NiwgMHg1NSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NjcsIDB4OTIgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDY4LCAweGNmIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2OSwgMHg3NiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NmEsIDB4MjIgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDZiLCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2YywgMHgwMiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NmQsIDB4NDQgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDZlLCAweDgwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg2ZiwgMHgxZCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NzAsIDB4OGIgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDcxLCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg3MiwgMHgxNCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NzMsIDB4NTQgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDc0LCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg3NSwgMHg4ZSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NzYsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDc3LCAweGZmIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg3OCwgMHg4MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NzksIDB4ODAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDdhLCAweDgwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg3YiwgMHhlMiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4N2MsIDB4MDAgfSwKKwkJeyBPVjUxMV9ET05FX0JVUywgMHgwLCAweDAwIH0sCisJfTsKKworCVBERUJVRyg0LCAic3RhcnRpbmcgY29uZmlndXJhdGlvbiIpOworCisJLyogVGhpcyBsb29rcyByZWR1bmRhbnQsIGJ1dCBpcyBuZWNlc3NhcnkgZm9yIFdlYkNhbSAzICovCisJb3YtPnByaW1hcnlfaTJjX3NsYXZlID0gT1Y3eHgwX1NJRDsKKwlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgT1Y3eHgwX1NJRCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaW5pdF9vdl9zZW5zb3Iob3YpID49IDApIHsKKwkJUERFQlVHKDEsICJPVjd4eDAgc2Vuc29yIGluaXRhbGl6ZWQgKG1ldGhvZCAxKSIpOworCX0gZWxzZSB7CisJCS8qIFJlc2V0IHRoZSA3Nnh4ICovCisJCWlmIChpMmNfdyhvdiwgMHgxMiwgMHg4MCkgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCS8qIFdhaXQgZm9yIGl0IHRvIGluaXRpYWxpemUgKi8KKwkJbXNsZWVwKDE1MCk7CisKKwkJaSA9IDA7CisJCXN1Y2Nlc3MgPSAwOworCQl3aGlsZSAoaSA8PSBpMmNfZGV0ZWN0X3RyaWVzKSB7CisJCQlpZiAoKGkyY19yKG92LCBPVjc2MTBfUkVHX0lEX0hJR0gpID09IDB4N0YpICYmCisJCQkgICAgKGkyY19yKG92LCBPVjc2MTBfUkVHX0lEX0xPVykgPT0gMHhBMikpIHsKKwkJCQlzdWNjZXNzID0gMTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJaSsrOworCQkJfQorCQl9CisKKy8vIFdhcyAoaSA9PSBpMmNfZGV0ZWN0X3RyaWVzKSBwcmV2aW91c2x5LiBUaGlzIG9idmlvdXNseSB1c2VkIHRvIGFsd2F5cyByZXBvcnQKKy8vIHN1Y2Nlc3MuIFdoZXRoZXIgYW55b25lIGFjdHVhbGx5IGRlcGVuZGVkIG9uIHRoYXQgYnVnIGlzIHVua25vd24KKwkJaWYgKChpID49IGkyY19kZXRlY3RfdHJpZXMpICYmIChzdWNjZXNzID09IDApKSB7CisJCQllcnIoIkZhaWxlZCB0byByZWFkIHNlbnNvciBJRC4gWW91IG1pZ2h0IG5vdCBoYXZlIGFuIik7CisJCQllcnIoIk9WNzYxMC8yMCwgb3IgaXQgbWF5IGJlIG5vdCByZXNwb25kaW5nLiBSZXBvcnQiKTsKKwkJCWVycigidGhpcyB0byAiIEVNQUlMKTsKKwkJCWVycigiVGhpcyBpcyBvbmx5IGEgd2FybmluZy4gWW91IGNhbiBhdHRlbXB0IHRvIHVzZSIpOworCQkJZXJyKCJ5b3VyIGNhbWVyYSBhbnl3YXkiKTsKKy8vIE9ubHkgaXNzdWUgYSB3YXJuaW5nIGZvciBub3cKKy8vCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJUERFQlVHKDEsICJPVjd4eDAgaW5pdGlhbGl6ZWQgKG1ldGhvZCAyLCAlZHgpIiwgaSsxKTsKKwkJfQorCX0KKworCS8qIERldGVjdCBzZW5zb3IgKHN1Yil0eXBlICovCisJcmMgPSBpMmNfcihvdiwgT1Y3NjEwX1JFR19DT01fSSk7CisKKwlpZiAocmMgPCAwKSB7CisJCWVycigiRXJyb3IgZGV0ZWN0aW5nIHNlbnNvciB0eXBlIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKChyYyAmIDMpID09IDMpIHsKKwkJaW5mbygiU2Vuc29yIGlzIGFuIE9WNzYxMCIpOworCQlvdi0+c2Vuc29yID0gU0VOX09WNzYxMDsKKwl9IGVsc2UgaWYgKChyYyAmIDMpID09IDEpIHsKKwkJLyogSSBkb24ndCBrbm93IHdoYXQncyBkaWZmZXJlbnQgYWJvdXQgdGhlIDc2QkUgeWV0LiAqLworCQlpZiAoaTJjX3Iob3YsIDB4MTUpICYgMSkKKwkJCWluZm8oIlNlbnNvciBpcyBhbiBPVjc2MjBBRSIpOworCQllbHNlCisJCQlpbmZvKCJTZW5zb3IgaXMgYW4gT1Y3NkJFIik7CisKKwkJLyogT1Y1MTErIHdpbGwgcmV0dXJuIGFsbCB6ZXJvIGlzb2MgZGF0YSB1bmxlc3Mgd2UKKwkJICogY29uZmlndXJlIHRoZSBzZW5zb3IgYXMgYSA3NjIwLiBTb21lb25lIG5lZWRzIHRvCisJCSAqIGZpbmQgdGhlIGV4YWN0IHJlZy4gc2V0dGluZyB0aGF0IGNhdXNlcyB0aGlzLiAqLworCQlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTFQTFVTKSB7CisJCQlpbmZvKCJFbmFibGluZyA1MTErLzc2MjBBRSB3b3JrYXJvdW5kIik7CisJCQlvdi0+c2Vuc29yID0gU0VOX09WNzYyMDsKKwkJfSBlbHNlIHsKKwkJCW92LT5zZW5zb3IgPSBTRU5fT1Y3NkJFOworCQl9CisJfSBlbHNlIGlmICgocmMgJiAzKSA9PSAwKSB7CisJCWluZm8oIlNlbnNvciBpcyBhbiBPVjc2MjAiKTsKKwkJb3YtPnNlbnNvciA9IFNFTl9PVjc2MjA7CisJfSBlbHNlIHsKKwkJZXJyKCJVbmtub3duIGltYWdlIHNlbnNvciB2ZXJzaW9uOiAlZCIsIHJjICYgMyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y3NjIwKSB7CisJCVBERUJVRyg0LCAiV3JpdGluZyA3NjIwIHJlZ2lzdGVycyIpOworCQlpZiAod3JpdGVfcmVndmFscyhvdiwgYVJlZ3ZhbHNOb3JtNzYyMCkpCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJUERFQlVHKDQsICJXcml0aW5nIDc2MTAgcmVnaXN0ZXJzIik7CisJCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm03NjEwKSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwkvKiBTZXQgc2Vuc29yLXNwZWNpZmljIHZhcnMgKi8KKwlvdi0+bWF4d2lkdGggPSA2NDA7CisJb3YtPm1heGhlaWdodCA9IDQ4MDsKKwlvdi0+bWlud2lkdGggPSA2NDsKKwlvdi0+bWluaGVpZ2h0ID0gNDg7CisKKwkvLyBGSVhNRTogVGhlc2UgZG8gbm90IG1hdGNoIHRoZSBhY3R1YWwgc2V0dGluZ3MgeWV0CisJb3YtPmJyaWdodG5lc3MgPSAweDgwIDw8IDg7CisJb3YtPmNvbnRyYXN0ID0gMHg4MCA8PCA4OworCW92LT5jb2xvdXIgPSAweDgwIDw8IDg7CisJb3YtPmh1ZSA9IDB4ODAgPDwgODsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGluaXRpYWxpemVzIHRoZSBPVjY2MjAsIE9WNjYzMCwgT1Y2NjMwQUUsIG9yIE9WNjYzMEFGIHNlbnNvci4gKi8KK3N0YXRpYyBpbnQKK292Nnh4MF9jb25maWd1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW50IHJjOworCisJc3RhdGljIHN0cnVjdCBvdjUxMV9yZWd2YWxzIGFSZWd2YWxzTm9ybTZ4MjBbXSA9IHsKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDEyLCAweDgwIH0sIC8qIHJlc2V0ICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMSwgMHgwMSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MDMsIDB4NjAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDA1LCAweDdmIH0sIC8qIEZvciB3aGVuIGF1dG9hZGp1c3QgaXMgb2ZmICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwNywgMHhhOCB9LAorCQkvKiBUaGUgcmF0aW8gb2YgMHgwYyBhbmQgMHgwZCAgY29udHJvbHMgdGhlIHdoaXRlIHBvaW50ICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwYywgMHgyNCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MGQsIDB4MjQgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDBmLCAweDE1IH0sIC8qIENPTVMgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDEwLCAweDc1IH0sIC8qIEFFQyBFeHBvc3VyZSB0aW1lICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMiwgMHgyNCB9LCAvKiBFbmFibGUgQUdDICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxNCwgMHgwNCB9LAorCQkvKiAweDE2OiAweDA2IGhlbHBzIGZyYW1lIHN0YWJpbGl0eSB3aXRoIG1vdmluZyBvYmplY3RzICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxNiwgMHgwNiB9LAorLy8JCXsgT1Y1MTFfSTJDX0JVUywgMHgyMCwgMHgzMCB9LCAvKiBBcGVydHVyZSBjb3JyZWN0aW9uIGVuYWJsZSAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MjYsIDB4YjIgfSwgLyogQkxDIGVuYWJsZSAqLworCQkvKiAweDI4OiAweDA1IFNlbGVjdHMgUkdCIGZvcm1hdCBpZiBSR0Igb24gKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDI4LCAweDA1IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgyYSwgMHgwNCB9LCAvKiBEaXNhYmxlIGZyYW1lcmF0ZSBhZGp1c3QgKi8KKy8vCQl7IE9WNTExX0kyQ19CVVMsIDB4MmIsIDB4YWMgfSwgLyogRnJhbWVyYXRlOyBTZXQgMmFbN10gZmlyc3QgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDJkLCAweDk5IH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzMywgMHhhMCB9LCAvKiBDb2xvciBQcm9jZXNpbmcgUGFyYW1ldGVyICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzNCwgMHhkMiB9LCAvKiBNYXggQS9EIHJhbmdlICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzOCwgMHg4YiB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MzksIDB4NDAgfSwKKworCQl7IE9WNTExX0kyQ19CVVMsIDB4M2MsIDB4MzkgfSwgLyogRW5hYmxlIEFFQyBtb2RlIGNoYW5naW5nICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzYywgMHgzYyB9LCAvKiBDaGFuZ2UgQUVDIG1vZGUgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDNjLCAweDI0IH0sIC8qIERpc2FibGUgQUVDIG1vZGUgY2hhbmdpbmcgKi8KKworCQl7IE9WNTExX0kyQ19CVVMsIDB4M2QsIDB4ODAgfSwKKwkJLyogVGhlc2UgbmV4dCB0d28gcmVnaXN0ZXJzICgweDRhLCAweDRiKSBhcmUgdW5kb2N1bWVudGVkLiBUaGV5CisJCSAqIGNvbnRyb2wgdGhlIGNvbG9yIGJhbGFuY2UgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDRhLCAweDgwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg0YiwgMHg4MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NGQsIDB4ZDIgfSwgLyogVGhpcyByZWR1Y2VzIG5vaXNlIGEgYml0ICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg0ZSwgMHhjMSB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NGYsIDB4MDQgfSwKKy8vIERvIDUwLTUzIGhhdmUgYW55IGVmZmVjdD8KKy8vIFRvZ2dsZSAweDEyWzJdIG9mZiBhbmQgb24gaGVyZT8KKwkJeyBPVjUxMV9ET05FX0JVUywgMHgwLCAweDAwIH0sCS8qIEVORCBNQVJLRVIgKi8KKwl9OworCisJc3RhdGljIHN0cnVjdCBvdjUxMV9yZWd2YWxzIGFSZWd2YWxzTm9ybTZ4MzBbXSA9IHsKKwkvKk9LKi8JeyBPVjUxMV9JMkNfQlVTLCAweDEyLCAweDgwIH0sIC8qIHJlc2V0ICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMSwgMHgwMCB9LAorCS8qT0sqLwl7IE9WNTExX0kyQ19CVVMsIDB4MDMsIDB4NjAgfSwKKwkvKjBBPyovCXsgT1Y1MTFfSTJDX0JVUywgMHgwNSwgMHg3ZiB9LCAvKiBGb3Igd2hlbiBhdXRvYWRqdXN0IGlzIG9mZiAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MDcsIDB4YTggfSwKKwkJLyogVGhlIHJhdGlvIG9mIDB4MGMgYW5kIDB4MGQgIGNvbnRyb2xzIHRoZSB3aGl0ZSBwb2ludCAqLworCS8qT0sqLwl7IE9WNTExX0kyQ19CVVMsIDB4MGMsIDB4MjQgfSwKKwkvKk9LKi8JeyBPVjUxMV9JMkNfQlVTLCAweDBkLCAweDI0IH0sCisJLypBKi8JeyBPVjUxMV9JMkNfQlVTLCAweDBlLCAweDIwIH0sCisvLwkvKjA0PyovCXsgT1Y1MTFfSTJDX0JVUywgMHgxNCwgMHg4MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTYsIDB4MDMgfSwKKy8vCS8qT0sqLwl7IE9WNTExX0kyQ19CVVMsIDB4MjAsIDB4MzAgfSwgLyogQXBlcnR1cmUgY29ycmVjdGlvbiBlbmFibGUgKi8KKwkJLy8gMjEgJiAyMj8gVGhlIHN1Z2dlc3RlZCB2YWx1ZXMgbG9vayB3cm9uZy4gR28gd2l0aCBkZWZhdWx0CisJLypBKi8JeyBPVjUxMV9JMkNfQlVTLCAweDIzLCAweGMwIH0sCisJLypBKi8JeyBPVjUxMV9JMkNfQlVTLCAweDI1LCAweDlhIH0sIC8vIENoZWNrIHRoaXMgYWdhaW5zdCBkZWZhdWx0CisvLwkvKk9LKi8JeyBPVjUxMV9JMkNfQlVTLCAweDI2LCAweGIyIH0sIC8qIEJMQyBlbmFibGUgKi8KKworCQkvKiAweDI4OiAweDA1IFNlbGVjdHMgUkdCIGZvcm1hdCBpZiBSR0Igb24gKi8KKy8vCS8qMDQ/Ki8JeyBPVjUxMV9JMkNfQlVTLCAweDI4LCAweDA1IH0sCisvLwkvKjA0PyovCXsgT1Y1MTFfSTJDX0JVUywgMHgyOCwgMHg0NSB9LCAvLyBERUJVRzogVHJpc3RhdGUgVVYgYnVzCisKKwkvKk9LKi8JeyBPVjUxMV9JMkNfQlVTLCAweDJhLCAweDA0IH0sIC8qIERpc2FibGUgZnJhbWVyYXRlIGFkanVzdCAqLworLy8JLypPSyovCXsgT1Y1MTFfSTJDX0JVUywgMHgyYiwgMHhhYyB9LCAvKiBGcmFtZXJhdGU7IFNldCAyYVs3XSBmaXJzdCAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MmQsIDB4OTkgfSwKKy8vCS8qQSovCXsgT1Y1MTFfSTJDX0JVUywgMHgzMywgMHgyNiB9LCAvLyBSZXNlcnZlZCBiaXRzIG9uIDY2MjAKKy8vCS8qZDI/Ki8JeyBPVjUxMV9JMkNfQlVTLCAweDM0LCAweDAzIH0sIC8qIE1heCBBL0QgcmFuZ2UgKi8KKy8vCS8qOGI/Ki8JeyBPVjUxMV9JMkNfQlVTLCAweDM4LCAweDgzIH0sCisvLwkvKjQwPyovCXsgT1Y1MTFfSTJDX0JVUywgMHgzOSwgMHhjMCB9LCAvLyA2NjMwIGFkZHMgYml0IDcKKy8vCQl7IE9WNTExX0kyQ19CVVMsIDB4M2MsIDB4MzkgfSwgLyogRW5hYmxlIEFFQyBtb2RlIGNoYW5naW5nICovCisvLwkJeyBPVjUxMV9JMkNfQlVTLCAweDNjLCAweDNjIH0sIC8qIENoYW5nZSBBRUMgbW9kZSAqLworLy8JCXsgT1Y1MTFfSTJDX0JVUywgMHgzYywgMHgyNCB9LCAvKiBEaXNhYmxlIEFFQyBtb2RlIGNoYW5naW5nICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgzZCwgMHg4MCB9LAorLy8JLypBKi8JeyBPVjUxMV9JMkNfQlVTLCAweDNmLCAweDBlIH0sCisKKwkJLyogVGhlc2UgbmV4dCB0d28gcmVnaXN0ZXJzICgweDRhLCAweDRiKSBhcmUgdW5kb2N1bWVudGVkLiBUaGV5CisJCSAqIGNvbnRyb2wgdGhlIGNvbG9yIGJhbGFuY2UgKi8KKy8vCS8qT0s/Ki8JeyBPVjUxMV9JMkNfQlVTLCAweDRhLCAweDgwIH0sIC8vIENoZWNrIHRoZXNlCisvLwkvKk9LPyovCXsgT1Y1MTFfSTJDX0JVUywgMHg0YiwgMHg4MCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4NGQsIDB4MTAgfSwgLyogVSA9IDAuNTYzdSwgViA9IDAuNzE0diAqLworCS8qYzE/Ki8JeyBPVjUxMV9JMkNfQlVTLCAweDRlLCAweDQwIH0sCisKKwkJLyogVVYgYXZlcmFnZSBtb2RlLCBjb2xvciBraWxsZXI6IHN0cm9uZ2VzdCAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4NGYsIDB4MDcgfSwKKworCQl7IE9WNTExX0kyQ19CVVMsIDB4NTQsIDB4MjMgfSwgLyogTWF4IEFHQyBnYWluOiAxOGRCICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg1NywgMHg4MSB9LCAvKiAoZGVmYXVsdCkgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDU5LCAweDAxIH0sIC8qIEFHQyBkYXJrIGN1cnJlbnQgY29tcDogKzEgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDVhLCAweDJjIH0sIC8qICh1bmRvY3VtZW50ZWQpICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHg1YiwgMHgwZiB9LCAvKiBBV0IgY2hyb21pbmFuY2UgbGV2ZWxzICovCisvLwkJeyBPVjUxMV9JMkNfQlVTLCAweDVjLCAweDEwIH0sCisJCXsgT1Y1MTFfRE9ORV9CVVMsIDB4MCwgMHgwMCB9LAkvKiBFTkQgTUFSS0VSICovCisJfTsKKworCVBERUJVRyg0LCAic3RhcnRpbmcgc2Vuc29yIGNvbmZpZ3VyYXRpb24iKTsKKworCWlmIChpbml0X292X3NlbnNvcihvdikgPCAwKSB7CisJCWVycigiRmFpbGVkIHRvIHJlYWQgc2Vuc29yIElELiBZb3UgbWlnaHQgbm90IGhhdmUgYW4gT1Y2eHgwLCIpOworCQllcnIoIm9yIGl0IG1heSBiZSBub3QgcmVzcG9uZGluZy4gUmVwb3J0IHRoaXMgdG8gIiBFTUFJTCk7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlQREVCVUcoMSwgIk9WNnh4MCBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwl9CisKKwkvKiBEZXRlY3Qgc2Vuc29yIChzdWIpdHlwZSAqLworCXJjID0gaTJjX3Iob3YsIE9WNzYxMF9SRUdfQ09NX0kpOworCisJaWYgKHJjIDwgMCkgeworCQllcnIoIkVycm9yIGRldGVjdGluZyBzZW5zb3IgdHlwZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKChyYyAmIDMpID09IDApIHsKKwkJb3YtPnNlbnNvciA9IFNFTl9PVjY2MzA7CisJCWluZm8oIlNlbnNvciBpcyBhbiBPVjY2MzAiKTsKKwl9IGVsc2UgaWYgKChyYyAmIDMpID09IDEpIHsKKwkJb3YtPnNlbnNvciA9IFNFTl9PVjY2MjA7CisJCWluZm8oIlNlbnNvciBpcyBhbiBPVjY2MjAiKTsKKwl9IGVsc2UgaWYgKChyYyAmIDMpID09IDIpIHsKKwkJb3YtPnNlbnNvciA9IFNFTl9PVjY2MzA7CisJCWluZm8oIlNlbnNvciBpcyBhbiBPVjY2MzBBRSIpOworCX0gZWxzZSBpZiAoKHJjICYgMykgPT0gMykgeworCQlvdi0+c2Vuc29yID0gU0VOX09WNjYzMDsKKwkJaW5mbygiU2Vuc29yIGlzIGFuIE9WNjYzMEFGIik7CisJfQorCisJLyogU2V0IHNlbnNvci1zcGVjaWZpYyB2YXJzICovCisJb3YtPm1heHdpZHRoID0gMzUyOworCW92LT5tYXhoZWlnaHQgPSAyODg7CisJb3YtPm1pbndpZHRoID0gNjQ7CisJb3YtPm1pbmhlaWdodCA9IDQ4OworCisJLy8gRklYTUU6IFRoZXNlIGRvIG5vdCBtYXRjaCB0aGUgYWN0dWFsIHNldHRpbmdzIHlldAorCW92LT5icmlnaHRuZXNzID0gMHg4MCA8PCA4OworCW92LT5jb250cmFzdCA9IDB4ODAgPDwgODsKKwlvdi0+Y29sb3VyID0gMHg4MCA8PCA4OworCW92LT5odWUgPSAweDgwIDw8IDg7CisKKwlpZiAob3YtPnNlbnNvciA9PSBTRU5fT1Y2NjIwKSB7CisJCVBERUJVRyg0LCAiV3JpdGluZyA2eDIwIHJlZ2lzdGVycyIpOworCQlpZiAod3JpdGVfcmVndmFscyhvdiwgYVJlZ3ZhbHNOb3JtNngyMCkpCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJUERFQlVHKDQsICJXcml0aW5nIDZ4MzAgcmVnaXN0ZXJzIik7CisJCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm02eDMwKSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBpbml0aWFsaXplcyB0aGUgS1MwMTI3IGFuZCBLUzAxMjdCIHZpZGVvIGRlY29kZXJzLiAqLworc3RhdGljIGludCAKK2tzMDEyN19jb25maWd1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW50IHJjOworCisvLyBGSVhNRTogSSBkb24ndCBrbm93IGhvdyB0byBzeW5jIG9yIHJlc2V0IGl0IHlldAorI2lmIDAKKwlpZiAob3Y1MXhfaW5pdF9rc19zZW5zb3Iob3YpIDwgMCkgeworCQllcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBLUzAxMjciKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCVBERUJVRygxLCAiS1MwMTJ4KEIpIHNlbnNvciBkZXRlY3RlZCIpOworCX0KKyNlbmRpZgorCisJLyogRGV0ZWN0IGRlY29kZXIgc3VidHlwZSAqLworCXJjID0gaTJjX3Iob3YsIDB4MDApOworCWlmIChyYyA8IDApIHsKKwkJZXJyKCJFcnJvciBkZXRlY3Rpbmcgc2Vuc29yIHR5cGUiKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAocmMgJiAweDA4KSB7CisJCXJjID0gaTJjX3Iob3YsIDB4M2QpOworCQlpZiAocmMgPCAwKSB7CisJCQllcnIoIkVycm9yIGRldGVjdGluZyBzZW5zb3IgdHlwZSIpOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgaWYgKChyYyAmIDB4MGYpID09IDApIHsKKwkJCWluZm8oIlNlbnNvciBpcyBhIEtTMDEyNyIpOworCQkJb3YtPnNlbnNvciA9IFNFTl9LUzAxMjc7CisJCX0gZWxzZSBpZiAoKHJjICYgMHgwZikgPT0gOSkgeworCQkJaW5mbygiU2Vuc29yIGlzIGEgS1MwMTI3QiBSZXYuIEEiKTsKKwkJCW92LT5zZW5zb3IgPSBTRU5fS1MwMTI3QjsKKwkJfQorCX0gZWxzZSB7CisJCWVycigiRXJyb3I6IFNlbnNvciBpcyBhbiB1bnN1cHBvcnRlZCBLUzAxMjIiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldCBzZW5zb3Itc3BlY2lmaWMgdmFycyAqLworCW92LT5tYXh3aWR0aCA9IDY0MDsKKwlvdi0+bWF4aGVpZ2h0ID0gNDgwOworCW92LT5taW53aWR0aCA9IDY0OworCW92LT5taW5oZWlnaHQgPSA0ODsKKworCS8vIEZJWE1FOiBUaGVzZSBkbyBub3QgbWF0Y2ggdGhlIGFjdHVhbCBzZXR0aW5ncyB5ZXQKKwlvdi0+YnJpZ2h0bmVzcyA9IDB4ODAgPDwgODsKKwlvdi0+Y29udHJhc3QgPSAweDgwIDw8IDg7CisJb3YtPmNvbG91ciA9IDB4ODAgPDwgODsKKwlvdi0+aHVlID0gMHg4MCA8PCA4OworCisJLyogVGhpcyBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIEJhaWwgb3V0IG5vdy4uLiAqLworCWVycigiVGhpcyBzZW5zb3IgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIik7CisJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIFNBQTcxMTFBIHZpZGVvIGRlY29kZXIuICovCitzdGF0aWMgaW50CitzYWE3MTExYV9jb25maWd1cmUoc3RydWN0IHVzYl9vdjUxMSAqb3YpCit7CisJaW50IHJjOworCisJLyogU2luY2UgdGhlcmUgaXMgbm8gcmVnaXN0ZXIgcmVzZXQgY29tbWFuZCwgYWxsIHJlZ2lzdGVycyBtdXN0IGJlCisJICogd3JpdHRlbiwgb3RoZXJ3aXNlIGdpdmVzIGVycmF0aWMgcmVzdWx0cyAqLworCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm1TQUE3MTExQVtdID0geworCQl7IE9WNTExX0kyQ19CVVMsIDB4MDYsIDB4Y2UgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDA3LCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMCwgMHg0NCB9LCAvKiBZVVY0MjIsIDI0MC8yODYgbGluZXMgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDBlLCAweDAxIH0sIC8qIE5UU0MgTSBvciBQQUwgQkdISSAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MDAsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDAxLCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwMywgMHgyMyB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MDQsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDA1LCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwOCwgMHhjOCB9LCAvKiBBdXRvIGZpZWxkIGZyZXEgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDA5LCAweDAxIH0sIC8qIENocm9tLiB0cmFwIG9mZiwgQVBFUj0wLjI1ICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwYSwgMHg4MCB9LCAvKiBCUklHPTEyOCAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MGIsIDB4NDAgfSwgLyogQ09OVD0xLjAgKi8KKwkJeyBPVjUxMV9JMkNfQlVTLCAweDBjLCAweDQwIH0sIC8qIFNBVE49MS4wICovCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwZCwgMHgwMCB9LCAvKiBIVUU9MCAqLworCQl7IE9WNTExX0kyQ19CVVMsIDB4MGYsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDExLCAweDBjIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxMiwgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTMsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDE0LCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgxNSwgMHgwMCB9LAorCQl7IE9WNTExX0kyQ19CVVMsIDB4MTYsIDB4MDAgfSwKKwkJeyBPVjUxMV9JMkNfQlVTLCAweDE3LCAweDAwIH0sCisJCXsgT1Y1MTFfSTJDX0JVUywgMHgwMiwgMHhjMCB9LAkvKiBDb21wb3NpdGUgaW5wdXQgMCAqLworCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwKKwl9OworCisvLyBGSVhNRTogSSBkb24ndCBrbm93IGhvdyB0byBzeW5jIG9yIHJlc2V0IGl0IHlldAorI2lmIDAKKwlpZiAob3Y1MXhfaW5pdF9zYWFfc2Vuc29yKG92KSA8IDApIHsKKwkJZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgU0FBNzExMUEiKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCVBERUJVRygxLCAiU0FBNzExMUEgc2Vuc29yIGRldGVjdGVkIik7CisJfQorI2VuZGlmCisKKwkvKiA2NDB4NDgwIG5vdCBzdXBwb3J0ZWQgd2l0aCBQQUwgKi8KKwlpZiAob3YtPnBhbCkgeworCQlvdi0+bWF4d2lkdGggPSAzMjA7CisJCW92LT5tYXhoZWlnaHQgPSAyNDA7CQkvKiBFdmVuIGZpZWxkIG9ubHkgKi8KKwl9IGVsc2UgeworCQlvdi0+bWF4d2lkdGggPSA2NDA7CisJCW92LT5tYXhoZWlnaHQgPSA0ODA7CQkvKiBFdmVuL09kZCBmaWVsZHMgKi8KKwl9CisKKwlvdi0+bWlud2lkdGggPSAzMjA7CisJb3YtPm1pbmhlaWdodCA9IDI0MDsJCS8qIEV2ZW4gZmllbGQgb25seSAqLworCisJb3YtPmhhc19kZWNvZGVyID0gMTsKKwlvdi0+bnVtX2lucHV0cyA9IDg7CisJb3YtPm5vcm0gPSBWSURFT19NT0RFX0FVVE87CisJb3YtPnN0b3BfZHVyaW5nX3NldCA9IDA7CS8qIERlY29kZXIgZ3VhcmFudGVlcyBzdGFibGUgaW1hZ2UgKi8KKworCS8qIERlY29kZXIgZG9lc24ndCBjaGFuZ2UgdGhlc2UgdmFsdWVzLCBzbyB3ZSB1c2UgdGhlc2UgaW5zdGVhZCBvZgorCSAqIGFjdXRhbGx5IHJlYWRpbmcgdGhlIHJlZ2lzdGVycyAod2hpY2ggZG9lc24ndCB3b3JrKSAqLworCW92LT5icmlnaHRuZXNzID0gMHg4MCA8PCA4OworCW92LT5jb250cmFzdCA9IDB4NDAgPDwgOTsKKwlvdi0+Y29sb3VyID0gMHg0MCA8PCA5OworCW92LT5odWUgPSAzMjc2ODsKKworCVBERUJVRyg0LCAiV3JpdGluZyBTQUE3MTExQSByZWdpc3RlcnMiKTsKKwlpZiAod3JpdGVfcmVndmFscyhvdiwgYVJlZ3ZhbHNOb3JtU0FBNzExMUEpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBEZXRlY3QgdmVyc2lvbiBvZiBkZWNvZGVyLiBUaGlzIG11c3QgYmUgZG9uZSBhZnRlciB3cml0aW5nIHRoZQorICAgICAgICAgKiBpbml0aWFsIHJlZ3Mgb3IgdGhlIGRlY29kZXIgd2lsbCBsb2NrIHVwLiAqLworCXJjID0gaTJjX3Iob3YsIDB4MDApOworCisJaWYgKHJjIDwgMCkgeworCQllcnIoIkVycm9yIGRldGVjdGluZyBzZW5zb3IgdmVyc2lvbiIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJaW5mbygiU2Vuc29yIGlzIGFuIFNBQTcxMTFBICh2ZXJzaW9uIDB4JXgpIiwgcmMpOworCQlvdi0+c2Vuc29yID0gU0VOX1NBQTcxMTFBOworCX0KKworCS8vIEZJWE1FOiBGaXggdGhpcyBmb3IgT1Y1MTgoKykKKwkvKiBMYXRjaCB0byBuZWdhdGl2ZSBlZGdlIG9mIGNsb2NrLiBPdGhlcndpc2UsIHdlIGdldCBpbmNvcnJlY3QKKwkgKiBjb2xvcnMgYW5kIGppdHRlciBpbiB0aGUgZGlnaXRhbCBzaWduYWwuICovCisJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTExKQorCQlyZWdfdyhvdiwgMHgxMSwgMHgwMCk7CisJZWxzZQorCQl3YXJuKCJTQUE3MTExQSBub3QgeWV0IHN1cHBvcnRlZCB3aXRoIE9WNTE4L09WNTE4KyIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WNTExL09WNTExKyBhbmQgdGhlIHNlbnNvciAqLworc3RhdGljIGludCAKK292NTExX2NvbmZpZ3VyZShzdHJ1Y3QgdXNiX292NTExICpvdikKK3sKKwlzdGF0aWMgc3RydWN0IG92NTExX3JlZ3ZhbHMgYVJlZ3ZhbHNJbml0NTExW10gPSB7CisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfUkVTRVQsCTB4N2YgfSwKKwkgCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfSU5JVCwJCTB4MDEgfSwKKwkgCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfUkVTRVQsCTB4N2YgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19JTklULAkJMHgwMSB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1JFU0VULAkweDNmIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfSU5JVCwJCTB4MDEgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19SRVNFVCwJMHgzZCB9LAorCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDB9LAorCX07CisKKwlzdGF0aWMgc3RydWN0IG92NTExX3JlZ3ZhbHMgYVJlZ3ZhbHNOb3JtNTExW10gPSB7CisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9EUkFNX0ZMT1dfQ1RMLCAJMHgwMSB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1NOQVAsCQkweDAwIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfU05BUCwJCTB4MDIgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMCB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MTFfRklGT19PUFRTLAkweDFmIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9DT01QX0VOLAkJMHgwMCB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MTFfQ09NUF9MVVRfRU4sCTB4MDMgfSwKKwkJeyBPVjUxMV9ET05FX0JVUywgMHgwLCAweDAwIH0sCisJfTsKKworCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm01MTFQbHVzW10gPSB7CisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9EUkFNX0ZMT1dfQ1RMLAkweGZmIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfU05BUCwJCTB4MDAgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMiB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1NOQVAsCQkweDAwIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9GSUZPX09QVFMsCTB4ZmYgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTExX0NPTVBfRU4sCQkweDAwIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxMV9DT01QX0xVVF9FTiwJMHgwMyB9LAorCQl7IE9WNTExX0RPTkVfQlVTLCAweDAsIDB4MDAgfSwKKwl9OworCisJUERFQlVHKDQsICIiKTsKKworCW92LT5jdXN0b21pZCA9IHJlZ19yKG92LCBSNTExX1NZU19DVVNUX0lEKTsKKwlpZiAob3YtPmN1c3RvbWlkIDwgMCkgeworCQllcnIoIlVuYWJsZSB0byByZWFkIGNhbWVyYSBicmlkZ2UgcmVnaXN0ZXJzIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJUERFQlVHICgxLCAiQ3VzdG9tSUQgPSAlZCIsIG92LT5jdXN0b21pZCk7CisJb3YtPmRlc2MgPSBzeW1ib2xpYyhjYW1saXN0LCBvdi0+Y3VzdG9taWQpOworCWluZm8oIm1vZGVsOiAlcyIsIG92LT5kZXNjKTsKKworCWlmICgwID09IHN0cmNtcChvdi0+ZGVzYywgTk9UX0RFRklORURfU1RSKSkgeworCQllcnIoIkNhbWVyYSB0eXBlICglZCkgbm90IHJlY29nbml6ZWQiLCBvdi0+Y3VzdG9taWQpOworCQllcnIoIlBsZWFzZSBub3RpZnkgIiBFTUFJTCAiIG9mIHRoZSBuYW1lLCIpOworCQllcnIoIm1hbnVmYWN0dXJlciwgbW9kZWwsIGFuZCB0aGlzIG51bWJlciBvZiB5b3VyIGNhbWVyYS4iKTsKKwkJZXJyKCJBbHNvIGluY2x1ZGUgdGhlIG91dHB1dCBvZiB0aGUgZGV0ZWN0aW9uIHByb2Nlc3MuIik7CisJfSAKKworCWlmIChvdi0+Y3VzdG9taWQgPT0gNzApCQkvKiBVU0IgTGlmZSBUViAoUEFML1NFQ0FNKSAqLworCQlvdi0+cGFsID0gMTsKKworCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc0luaXQ1MTEpKQorCQlnb3RvIGVycm9yOworCisJaWYgKG92LT5sZWRfcG9saWN5ID09IExFRF9PRkYgfHwgb3YtPmxlZF9wb2xpY3kgPT0gTEVEX0FVVE8pCisJCW92NTF4X2xlZF9jb250cm9sKG92LCAwKTsKKworCS8qIFRoZSBPVjUxMSsgaGFzIHVuZG9jdW1lbnRlZCBiaXRzIGluIHRoZSBmbG93IGNvbnRyb2wgcmVnaXN0ZXIuCisJICogU2V0dGluZyBpdCB0byAweGZmIGZpeGVzIHRoZSBjb3JydXB0aW9uIHdpdGggbW92aW5nIG9iamVjdHMuICovCisJaWYgKG92LT5icmlkZ2UgPT0gQlJHX09WNTExKSB7CisJCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm01MTEpKQorCQkJZ290byBlcnJvcjsKKwl9IGVsc2UgaWYgKG92LT5icmlkZ2UgPT0gQlJHX09WNTExUExVUykgeworCQlpZiAod3JpdGVfcmVndmFscyhvdiwgYVJlZ3ZhbHNOb3JtNTExUGx1cykpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCWVycigiSW52YWxpZCBicmlkZ2UiKTsKKwl9CisKKwlpZiAob3Y1MTFfaW5pdF9jb21wcmVzc2lvbihvdikpCisJCWdvdG8gZXJyb3I7CisKKwlvdi0+cGFja2V0X251bWJlcmluZyA9IDE7CisJb3Y1MTFfc2V0X3BhY2tldF9zaXplKG92LCAwKTsKKworCW92LT5zbmFwX2VuYWJsZWQgPSBzbmFwc2hvdDsKKworCS8qIFRlc3QgZm9yIDd4eDAgKi8KKwlQREVCVUcoMywgIlRlc3RpbmcgZm9yIDBWN3h4MCIpOworCW92LT5wcmltYXJ5X2kyY19zbGF2ZSA9IE9WN3h4MF9TSUQ7CisJaWYgKG92NTF4X3NldF9zbGF2ZV9pZHMob3YsIE9WN3h4MF9TSUQpIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWlmIChpMmNfdyhvdiwgMHgxMiwgMHg4MCkgPCAwKSB7CisJCS8qIFRlc3QgZm9yIDZ4eDAgKi8KKwkJUERFQlVHKDMsICJUZXN0aW5nIGZvciAwVjZ4eDAiKTsKKwkJb3YtPnByaW1hcnlfaTJjX3NsYXZlID0gT1Y2eHgwX1NJRDsKKwkJaWYgKG92NTF4X3NldF9zbGF2ZV9pZHMob3YsIE9WNnh4MF9TSUQpIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJaWYgKGkyY193KG92LCAweDEyLCAweDgwKSA8IDApIHsKKwkJCS8qIFRlc3QgZm9yIDh4eDAgKi8KKwkJCVBERUJVRygzLCAiVGVzdGluZyBmb3IgMFY4eHgwIik7CisJCQlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBPVjh4eDBfU0lEOworCQkJaWYgKG92NTF4X3NldF9zbGF2ZV9pZHMob3YsIE9WOHh4MF9TSUQpIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCisJCQlpZiAoaTJjX3cob3YsIDB4MTIsIDB4ODApIDwgMCkgeworCQkJCS8qIFRlc3QgZm9yIFNBQTcxMTFBICovCisJCQkJUERFQlVHKDMsICJUZXN0aW5nIGZvciBTQUE3MTExQSIpOworCQkJCW92LT5wcmltYXJ5X2kyY19zbGF2ZSA9IFNBQTcxMTFBX1NJRDsKKwkJCQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgU0FBNzExMUFfU0lEKSA8IDApCisJCQkJCWdvdG8gZXJyb3I7CisKKwkJCQlpZiAoaTJjX3cob3YsIDB4MGQsIDB4MDApIDwgMCkgeworCQkJCQkvKiBUZXN0IGZvciBLUzAxMjcgKi8KKwkJCQkJUERFQlVHKDMsICJUZXN0aW5nIGZvciBLUzAxMjciKTsKKwkJCQkJb3YtPnByaW1hcnlfaTJjX3NsYXZlID0gS1MwMTI3X1NJRDsKKwkJCQkJaWYgKG92NTF4X3NldF9zbGF2ZV9pZHMob3YsIEtTMDEyN19TSUQpIDwgMCkKKwkJCQkJCWdvdG8gZXJyb3I7CisKKwkJCQkJaWYgKGkyY193KG92LCAweDEwLCAweDAwKSA8IDApIHsKKwkJCQkJCWVycigiQ2FuJ3QgZGV0ZXJtaW5lIHNlbnNvciBzbGF2ZSBJRHMiKTsKKwkJIAkJCQlnb3RvIGVycm9yOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGtzMDEyN19jb25maWd1cmUob3YpIDwgMCkgeworCQkJCQkJCWVycigiRmFpbGVkIHRvIGNvbmZpZ3VyZSBLUzAxMjciKTsKKwkgCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChzYWE3MTExYV9jb25maWd1cmUob3YpIDwgMCkgeworCQkJCQkJZXJyKCJGYWlsZWQgdG8gY29uZmlndXJlIFNBQTcxMTFBIik7CisJIAkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZXJyKCJEZXRlY3RlZCB1bnN1cHBvcnRlZCBPVjh4eDAgc2Vuc29yIik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChvdjZ4eDBfY29uZmlndXJlKG92KSA8IDApIHsKKwkJCQllcnIoIkZhaWxlZCB0byBjb25maWd1cmUgT1Y2eHgwIik7CisgCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAob3Y3eHgwX2NvbmZpZ3VyZShvdikgPCAwKSB7CisJCQllcnIoIkZhaWxlZCB0byBjb25maWd1cmUgT1Y3eHgwIik7CisJIAkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnJvcjoKKwllcnIoIk9WNTExIENvbmZpZyBmYWlsZWQiKTsKKworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WNTE4L09WNTE4KyBhbmQgdGhlIHNlbnNvciAqLworc3RhdGljIGludAorb3Y1MThfY29uZmlndXJlKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQoreworCS8qIEZvciA1MTggYW5kIDUxOCsgKi8KKwlzdGF0aWMgc3RydWN0IG92NTExX3JlZ3ZhbHMgYVJlZ3ZhbHNJbml0NTE4W10gPSB7CisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfUkVTRVQsCTB4NDAgfSwKKwkgCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfSU5JVCwJCTB4ZTEgfSwKKwkgCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfUkVTRVQsCTB4M2UgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19JTklULAkJMHhlMSB9LAorCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1JFU0VULAkweDAwIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfSU5JVCwJCTB4ZTEgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDQ2LAkJCTB4MDAgfSwgCisJCXsgT1Y1MTFfUkVHX0JVUywgMHg1ZCwJCQkweDAzIH0sCisJCXsgT1Y1MTFfRE9ORV9CVVMsIDB4MCwgMHgwMH0sCisJfTsKKworCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm01MThbXSA9IHsKKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMiB9LCAvKiBSZXNldCAqLworCQl7IE9WNTExX1JFR19CVVMsIFI1MXhfU1lTX1NOQVAsCQkweDAxIH0sIC8qIEVuYWJsZSAqLworCQl7IE9WNTExX1JFR19CVVMsIDB4MzEsIAkJCTB4MGYgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDVkLAkJCTB4MDMgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDI0LAkJCTB4OWYgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDI1LAkJCTB4OTAgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDIwLAkJCTB4MDAgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDUxLAkJCTB4MDQgfSwKKwkJeyBPVjUxMV9SRUdfQlVTLCAweDcxLAkJCTB4MTkgfSwKKwkJeyBPVjUxMV9ET05FX0JVUywgMHgwLCAweDAwIH0sCisJfTsKKworCXN0YXRpYyBzdHJ1Y3Qgb3Y1MTFfcmVndmFscyBhUmVndmFsc05vcm01MThQbHVzW10gPSB7CisJCXsgT1Y1MTFfUkVHX0JVUywgUjUxeF9TWVNfU05BUCwJCTB4MDIgfSwgLyogUmVzZXQgKi8KKwkJeyBPVjUxMV9SRUdfQlVTLCBSNTF4X1NZU19TTkFQLAkJMHgwMSB9LCAvKiBFbmFibGUgKi8KKwkJeyBPVjUxMV9SRUdfQlVTLCAweDMxLCAJCQkweDBmIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHg1ZCwJCQkweDAzIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHgyNCwJCQkweDlmIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHgyNSwJCQkweDkwIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHgyMCwJCQkweDYwIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHg1MSwJCQkweDAyIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHg3MSwJCQkweDE5IH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHg0MCwJCQkweGZmIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHg0MSwJCQkweDQyIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHg0NiwJCQkweDAwIH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHgzMywJCQkweDA0IH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHgyMSwJCQkweDE5IH0sCisJCXsgT1Y1MTFfUkVHX0JVUywgMHgzZiwJCQkweDEwIH0sCisJCXsgT1Y1MTFfRE9ORV9CVVMsIDB4MCwgMHgwMCB9LAorCX07CisKKwlQREVCVUcoNCwgIiIpOworCisJLyogRmlyc3QgNSBiaXRzIG9mIGN1c3RvbSBJRCByZWcgYXJlIGEgcmV2aXNpb24gSUQgb24gT1Y1MTggKi8KKwlpbmZvKCJEZXZpY2UgcmV2aXNpb24gJWQiLCAweDFGICYgcmVnX3Iob3YsIFI1MTFfU1lTX0NVU1RfSUQpKTsKKworCS8qIEdpdmUgaXQgdGhlIGRlZmF1bHQgZGVzY3JpcHRpb24gKi8KKwlvdi0+ZGVzYyA9IHN5bWJvbGljKGNhbWxpc3QsIDApOworCisJaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzSW5pdDUxOCkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTZXQgTEVEIEdQSU8gcGluIHRvIG91dHB1dCBtb2RlICovCisJaWYgKHJlZ193X21hc2sob3YsIDB4NTcsIDB4MDAsIDB4MDIpIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIExFRCBpcyBvZmYgYnkgZGVmYXVsdCB3aXRoIE9WNTE4OyBoYXZlIHRvIGV4cGxpY2l0bHkgdHVybiBpdCBvbiAqLworCWlmIChvdi0+bGVkX3BvbGljeSA9PSBMRURfT0ZGIHx8IG92LT5sZWRfcG9saWN5ID09IExFRF9BVVRPKQorCQlvdjUxeF9sZWRfY29udHJvbChvdiwgMCk7CisJZWxzZQorCQlvdjUxeF9sZWRfY29udHJvbChvdiwgMSk7CisKKwkvKiBEb24ndCByZXF1aXJlIGNvbXByZXNzaW9uIGlmIGR1bXBwaXggaXMgZW5hYmxlZDsgb3RoZXJ3aXNlIGl0J3MKKwkgKiByZXF1aXJlZC4gT1Y1MTggaGFzIG5vIHVuY29tcHJlc3NlZCBtb2RlLCB0byBzYXZlIFJBTS4gKi8KKwlpZiAoIWR1bXBwaXggJiYgIW92LT5jb21wcmVzcykgeworCQlvdi0+Y29tcHJlc3MgPSAxOworCQl3YXJuKCJDb21wcmVzc2lvbiByZXF1aXJlZCB3aXRoIE9WNTE4Li4uZW5hYmxpbmciKTsKKwl9CisKKwlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTgpIHsKKwkJaWYgKHdyaXRlX3JlZ3ZhbHMob3YsIGFSZWd2YWxzTm9ybTUxOCkpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSBpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MThQTFVTKSB7CisJCWlmICh3cml0ZV9yZWd2YWxzKG92LCBhUmVndmFsc05vcm01MThQbHVzKSkKKwkJCWdvdG8gZXJyb3I7CisJfSBlbHNlIHsKKwkJZXJyKCJJbnZhbGlkIGJyaWRnZSIpOworCX0KKworCWlmIChyZWdfdyhvdiwgMHgyZiwgMHg4MCkgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKG92NTE4X2luaXRfY29tcHJlc3Npb24ob3YpKQorCQlnb3RvIGVycm9yOworCisJaWYgKG92LT5icmlkZ2UgPT0gQlJHX09WNTE4KQorCXsKKwkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmcDsKKwkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0OworCQlfX3UxNiBteHBzID0gMDsKKworCQlpZnAgPSB1c2JfaWZudW1fdG9faWYob3YtPmRldiwgMCk7CisJCWlmIChpZnApIHsKKwkJCWFsdCA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpZnAsIDcpOworCQkJaWYgKGFsdCkKKwkJCQlteHBzID0gbGUxNl90b19jcHUoYWx0LT5lbmRwb2ludFswXS5kZXNjLndNYXhQYWNrZXRTaXplKTsKKwkJfQorCisJCS8qIFNvbWUgT1Y1MThzIGhhdmUgcGFja2V0IG51bWJlcmluZyBieSBkZWZhdWx0LCBzb21lIGRvbid0ICovCisJCWlmIChteHBzID09IDg5NykKKwkJCW92LT5wYWNrZXRfbnVtYmVyaW5nID0gMTsKKwkJZWxzZQorCQkJb3YtPnBhY2tldF9udW1iZXJpbmcgPSAwOworCX0gZWxzZSB7CisJCS8qIE9WNTE4KyBoYXMgcGFja2V0IG51bWJlcmluZyB0dXJuZWQgb24gYnkgZGVmYXVsdCAqLworCQlvdi0+cGFja2V0X251bWJlcmluZyA9IDE7CisJfQorCisJb3Y1MThfc2V0X3BhY2tldF9zaXplKG92LCAwKTsKKworCW92LT5zbmFwX2VuYWJsZWQgPSBzbmFwc2hvdDsKKworCS8qIFRlc3QgZm9yIDc2eHggKi8KKwlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBPVjd4eDBfU0lEOworCWlmIChvdjUxeF9zZXRfc2xhdmVfaWRzKG92LCBPVjd4eDBfU0lEKSA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBUaGUgT1Y1MTggbXVzdCBiZSBtb3JlIGFnZ3Jlc3NpdmUgYWJvdXQgc2Vuc29yIGRldGVjdGlvbiBzaW5jZQorCSAqIEkyQyB3cml0ZSB3aWxsIG5ldmVyIGZhaWwgaWYgdGhlIHNlbnNvciBpcyBub3QgcHJlc2VudC4gV2UgaGF2ZQorCSAqIHRvIHRyeSB0byBpbml0aWFsaXplIHRoZSBzZW5zb3IgdG8gZGV0ZWN0IGl0cyBwcmVzZW5jZSAqLworCisJaWYgKGluaXRfb3Zfc2Vuc29yKG92KSA8IDApIHsKKwkJLyogVGVzdCBmb3IgNnh4MCAqLworCQlvdi0+cHJpbWFyeV9pMmNfc2xhdmUgPSBPVjZ4eDBfU0lEOworCQlpZiAob3Y1MXhfc2V0X3NsYXZlX2lkcyhvdiwgT1Y2eHgwX1NJRCkgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlpZiAoaW5pdF9vdl9zZW5zb3Iob3YpIDwgMCkgeworCQkJLyogVGVzdCBmb3IgOHh4MCAqLworCQkJb3YtPnByaW1hcnlfaTJjX3NsYXZlID0gT1Y4eHgwX1NJRDsKKwkJCWlmIChvdjUxeF9zZXRfc2xhdmVfaWRzKG92LCBPVjh4eDBfU0lEKSA8IDApCisJCQkJZ290byBlcnJvcjsKKworCQkJaWYgKGluaXRfb3Zfc2Vuc29yKG92KSA8IDApIHsKKwkJCQllcnIoIkNhbid0IGRldGVybWluZSBzZW5zb3Igc2xhdmUgSURzIik7CisgCQkJCWdvdG8gZXJyb3I7CisJCQl9IGVsc2UgeworCQkJCWVycigiRGV0ZWN0ZWQgdW5zdXBwb3J0ZWQgT1Y4eHgwIHNlbnNvciIpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAob3Y2eHgwX2NvbmZpZ3VyZShvdikgPCAwKSB7CisJCQkJZXJyKCJGYWlsZWQgdG8gY29uZmlndXJlIE9WNnh4MCIpOworIAkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKG92N3h4MF9jb25maWd1cmUob3YpIDwgMCkgeworCQkJZXJyKCJGYWlsZWQgdG8gY29uZmlndXJlIE9WN3h4MCIpOworCSAJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlvdi0+bWF4d2lkdGggPSAzNTI7CisJb3YtPm1heGhlaWdodCA9IDI4ODsKKworCS8vIFRoZSBPVjUxOCBjYW5ub3QgZ28gYXMgbG93IGFzIHRoZSBzZW5zb3IgY2FuCisJb3YtPm1pbndpZHRoID0gMTYwOworCW92LT5taW5oZWlnaHQgPSAxMjA7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZXJyKCJPVjUxOCBDb25maWcgZmFpbGVkIik7CisKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHN5c2ZzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2Jfb3Y1MTEgKmNkX3RvX292KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2QpOworCXJldHVybiB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19jdXN0b21faWQoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IGNkX3RvX292KGNkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgb3YtPmN1c3RvbWlkKTsKK30gCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoY3VzdG9tX2lkLCBTX0lSVUdPLCBzaG93X2N1c3RvbV9pZCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbW9kZWwoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IGNkX3RvX292KGNkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgb3YtPmRlc2MpOworfSAKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihtb2RlbCwgU19JUlVHTywgc2hvd19tb2RlbCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYnJpZGdlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSBjZF90b19vdihjZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN5bWJvbGljKGJyZ2xpc3QsIG92LT5icmlkZ2UpKTsKK30gCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYnJpZGdlLCBTX0lSVUdPLCBzaG93X2JyaWRnZSwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2Vuc29yKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSBjZF90b19vdihjZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN5bWJvbGljKHNlbmxpc3QsIG92LT5zZW5zb3IpKTsKK30gCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc2Vuc29yLCBTX0lSVUdPLCBzaG93X3NlbnNvciwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYnJpZ2h0bmVzcyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOworCXVuc2lnbmVkIHNob3J0IHg7CisKKwlpZiAoIW92LT5kZXYpCisJCXJldHVybiAtRU5PREVWOworCXNlbnNvcl9nZXRfYnJpZ2h0bmVzcyhvdiwgJngpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB4ID4+IDgpOworfSAKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihicmlnaHRuZXNzLCBTX0lSVUdPLCBzaG93X2JyaWdodG5lc3MsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3NhdHVyYXRpb24oc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX292NTExICpvdiA9IGNkX3RvX292KGNkKTsKKwl1bnNpZ25lZCBzaG9ydCB4OworCisJaWYgKCFvdi0+ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlzZW5zb3JfZ2V0X3NhdHVyYXRpb24ob3YsICZ4KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgeCA+PiA4KTsKK30gCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc2F0dXJhdGlvbiwgU19JUlVHTywgc2hvd19zYXR1cmF0aW9uLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19jb250cmFzdChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOworCXVuc2lnbmVkIHNob3J0IHg7CisKKwlpZiAoIW92LT5kZXYpCisJCXJldHVybiAtRU5PREVWOworCXNlbnNvcl9nZXRfY29udHJhc3Qob3YsICZ4KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgeCA+PiA4KTsKK30gCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoY29udHJhc3QsIFNfSVJVR08sIHNob3dfY29udHJhc3QsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2h1ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2Jfb3Y1MTEgKm92ID0gY2RfdG9fb3YoY2QpOworCXVuc2lnbmVkIHNob3J0IHg7CisKKwlpZiAoIW92LT5kZXYpCisJCXJldHVybiAtRU5PREVWOworCXNlbnNvcl9nZXRfaHVlKG92LCAmeCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHggPj4gOCk7Cit9IAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGh1ZSwgU19JUlVHTywgc2hvd19odWUsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2V4cG9zdXJlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSBjZF90b19vdihjZCk7CisJdW5zaWduZWQgY2hhciBleHA7CisKKwlpZiAoIW92LT5kZXYpCisJCXJldHVybiAtRU5PREVWOworCXNlbnNvcl9nZXRfZXhwb3N1cmUob3YsICZleHApOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBleHAgPj4gOCk7Cit9IAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGV4cG9zdXJlLCBTX0lSVUdPLCBzaG93X2V4cG9zdXJlLCBOVUxMKTsKKworc3RhdGljIHZvaWQgb3ZfY3JlYXRlX3N5c2ZzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCit7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9jdXN0b21faWQpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfbW9kZWwpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYnJpZGdlKTsKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3NlbnNvcik7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9icmlnaHRuZXNzKTsKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3NhdHVyYXRpb24pOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfY29udHJhc3QpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaHVlKTsKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2V4cG9zdXJlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBVU0Igcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK292NTF4X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqaWRlc2M7CisJc3RydWN0IHVzYl9vdjUxMSAqb3Y7CisJaW50IGk7CisKKwlQREVCVUcoMSwgInByb2JpbmcgZm9yIGRldmljZS4uLiIpOworCisJLyogV2UgZG9uJ3QgaGFuZGxlIG11bHRpLWNvbmZpZyBjYW1lcmFzICovCisJaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZGVzYyA9ICZpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYzsKKworCWlmIChpZGVzYy0+YkludGVyZmFjZUNsYXNzICE9IDB4RkYpCisJCXJldHVybiAtRU5PREVWOworCWlmIChpZGVzYy0+YkludGVyZmFjZVN1YkNsYXNzICE9IDB4MDApCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChvdiA9IGttYWxsb2Moc2l6ZW9mKCpvdiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCWVycigiY291bGRuJ3Qga21hbGxvYyBvdiBzdHJ1Y3QiKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJbWVtc2V0KG92LCAwLCBzaXplb2YoKm92KSk7CisKKwlvdi0+ZGV2ID0gZGV2OworCW92LT5pZmFjZSA9IGlkZXNjLT5iSW50ZXJmYWNlTnVtYmVyOworCW92LT5sZWRfcG9saWN5ID0gbGVkOworCW92LT5jb21wcmVzcyA9IGNvbXByZXNzOworCW92LT5saWdodGZyZXEgPSBsaWdodGZyZXE7CisJb3YtPm51bV9pbnB1dHMgPSAxOwkgICAvKiBWaWRlbyBkZWNvZGVyIGluaXQgZnVuY3RzLiBjaGFuZ2UgdGhpcyAqLworCW92LT5zdG9wX2R1cmluZ19zZXQgPSAhZmFzdHNldDsKKwlvdi0+YmFja2xpZ2h0ID0gYmFja2xpZ2h0OworCW92LT5taXJyb3IgPSBtaXJyb3I7CisJb3YtPmF1dG9fYnJ0ID0gYXV0b2JyaWdodDsKKwlvdi0+YXV0b19nYWluID0gYXV0b2dhaW47CisJb3YtPmF1dG9fZXhwID0gYXV0b2V4cDsKKworCXN3aXRjaCAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpIHsKKwljYXNlIFBST0RfT1Y1MTE6CisJCW92LT5icmlkZ2UgPSBCUkdfT1Y1MTE7CisJCW92LT5iY2xhc3MgPSBCQ0xfT1Y1MTE7CisJCWJyZWFrOworCWNhc2UgUFJPRF9PVjUxMVBMVVM6CisJCW92LT5icmlkZ2UgPSBCUkdfT1Y1MTFQTFVTOworCQlvdi0+YmNsYXNzID0gQkNMX09WNTExOworCQlicmVhazsKKwljYXNlIFBST0RfT1Y1MTg6CisJCW92LT5icmlkZ2UgPSBCUkdfT1Y1MTg7CisJCW92LT5iY2xhc3MgPSBCQ0xfT1Y1MTg7CisJCWJyZWFrOworCWNhc2UgUFJPRF9PVjUxOFBMVVM6CisJCW92LT5icmlkZ2UgPSBCUkdfT1Y1MThQTFVTOworCQlvdi0+YmNsYXNzID0gQkNMX09WNTE4OworCQlicmVhazsKKwljYXNlIFBST0RfTUUyQ0FNOgorCQlpZiAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSAhPSBWRU5EX01BVFRFTCkKKwkJCWdvdG8gZXJyb3I7CisJCW92LT5icmlkZ2UgPSBCUkdfT1Y1MTFQTFVTOworCQlvdi0+YmNsYXNzID0gQkNMX09WNTExOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoIlVua25vd24gcHJvZHVjdCBJRCAweCUwNHgiLCBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaW5mbygiVVNCICVzIHZpZGVvIGRldmljZSBmb3VuZCIsIHN5bWJvbGljKGJyZ2xpc3QsIG92LT5icmlkZ2UpKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm92LT53cSk7CisKKwlpbml0X01VVEVYKCZvdi0+bG9jayk7CS8qIHRvIDEgPT0gYXZhaWxhYmxlICovCisJaW5pdF9NVVRFWCgmb3YtPmJ1Zl9sb2NrKTsKKwlpbml0X01VVEVYKCZvdi0+cGFyYW1fbG9jayk7CisJaW5pdF9NVVRFWCgmb3YtPmkyY19sb2NrKTsKKwlpbml0X01VVEVYKCZvdi0+Y2J1Zl9sb2NrKTsKKworCW92LT5idWZfc3RhdGUgPSBCVUZfTk9UX0FMTE9DQVRFRDsKKworCWlmICh1c2JfbWFrZV9wYXRoKGRldiwgb3YtPnVzYl9wYXRoLCBPVjUxMV9VU0JfUEFUSF9MRU4pIDwgMCkgeworCQllcnIoInVzYl9tYWtlX3BhdGggZXJyb3IiKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBjb250cm9sIHRyYW5zZmVyIGJ1ZmZlci4gKi8KKwkvKiBNdXN0IGJlIGttYWxsb2MoKSdlZCwgZm9yIERNQSBjb21wYXRpYmlsaXR5ICovCisJb3YtPmNidWYgPSBrbWFsbG9jKE9WNTExX0NCVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvdi0+Y2J1ZikKKwkJZ290byBlcnJvcjsKKworCWlmIChvdi0+YmNsYXNzID09IEJDTF9PVjUxOCkgeworCQlpZiAob3Y1MThfY29uZmlndXJlKG92KSA8IDApCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCWlmIChvdjUxMV9jb25maWd1cmUob3YpIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE9WNTExX05VTUZSQU1FUzsgaSsrKSB7CisJCW92LT5mcmFtZVtpXS5mcmFtZW51bSA9IGk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm92LT5mcmFtZVtpXS53cSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE9WNTExX05VTVNCVUY7IGkrKykgeworCQlvdi0+c2J1ZltpXS5vdiA9IG92OworCQlzcGluX2xvY2tfaW5pdCgmb3YtPnNidWZbaV0ubG9jayk7CisJCW92LT5zYnVmW2ldLm4gPSBpOworCX0KKworCS8qIFVubmVjZXNzYXJ5PyAoVGhpcyBpcyBkb25lIG9uIG9wZW4oKS4gTmVlZCB0byBtYWtlIHN1cmUgdmFyaWFibGVzCisJICogYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIHdpdGhvdXQgdGhpcyBiZWZvcmUgcmVtb3ZpbmcgaXQsIHRob3VnaCkuICovCisJaWYgKG92NTF4X3NldF9kZWZhdWx0X3BhcmFtcyhvdikgPCAwKQorCQlnb3RvIGVycm9yOworCisjaWZkZWYgT1Y1MTFfREVCVUcKKwlpZiAoZHVtcF9icmlkZ2UpIHsKKwkJaWYgKG92LT5iY2xhc3MgPT0gQkNMX09WNTExKQorCQkJb3Y1MTFfZHVtcF9yZWdzKG92KTsKKwkJZWxzZQorCQkJb3Y1MThfZHVtcF9yZWdzKG92KTsKKwl9CisjZW5kaWYKKworCW92LT52ZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKCFvdi0+dmRldikKKwkJZ290byBlcnJvcjsKKworCW1lbWNweShvdi0+dmRldiwgJnZkZXZfdGVtcGxhdGUsIHNpemVvZigqb3YtPnZkZXYpKTsKKwlvdi0+dmRldi0+ZGV2ID0gJmRldi0+ZGV2OworCXZpZGVvX3NldF9kcnZkYXRhKG92LT52ZGV2LCBvdik7CisKKwlmb3IgKGkgPSAwOyBpIDwgT1Y1MTFfTUFYX1VOSVRfVklERU87IGkrKykgeworCQkvKiBNaW5vciAwIGNhbm5vdCBiZSBzcGVjaWZpZWQ7IGFzc3VtZSB1c2VyIHdhbnRzIGF1dG9kZXRlY3QgKi8KKwkJaWYgKHVuaXRfdmlkZW9baV0gPT0gMCkKKwkJCWJyZWFrOworCisJCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2Uob3YtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsCisJCQl1bml0X3ZpZGVvW2ldKSA+PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFVzZSB0aGUgbmV4dCBhdmFpbGFibGUgb25lICovCisJaWYgKChvdi0+dmRldi0+bWlub3IgPT0gLTEpICYmCisJICAgIHZpZGVvX3JlZ2lzdGVyX2RldmljZShvdi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpIDwgMCkgeworCQllcnIoInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQiKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpbmZvKCJEZXZpY2UgYXQgJXMgcmVnaXN0ZXJlZCB0byBtaW5vciAlZCIsIG92LT51c2JfcGF0aCwKKwkgICAgIG92LT52ZGV2LT5taW5vcik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIG92KTsKKwlvdl9jcmVhdGVfc3lzZnMob3YtPnZkZXYpOworCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAob3YtPnZkZXYpIHsKKwkJaWYgKC0xID09IG92LT52ZGV2LT5taW5vcikKKwkJCXZpZGVvX2RldmljZV9yZWxlYXNlKG92LT52ZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uob3YtPnZkZXYpOworCQlvdi0+dmRldiA9IE5VTEw7CisJfQorCisJaWYgKG92LT5jYnVmKSB7CisJCWRvd24oJm92LT5jYnVmX2xvY2spOworCQlrZnJlZShvdi0+Y2J1Zik7CisJCW92LT5jYnVmID0gTlVMTDsKKwkJdXAoJm92LT5jYnVmX2xvY2spOworCX0KKworCWlmIChvdikgeworCQlrZnJlZShvdik7CisJCW92ID0gTlVMTDsKKwl9CisKK2Vycm9yX291dDoKKwllcnIoIkNhbWVyYSBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHZvaWQKK292NTF4X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9vdjUxMSAqb3YgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCWludCBuOworCisJUERFQlVHKDMsICIiKTsKKworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOworCisJaWYgKCFvdikKKwkJcmV0dXJuOworCisJaWYgKG92LT52ZGV2KQorCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShvdi0+dmRldik7CisKKwlmb3IgKG4gPSAwOyBuIDwgT1Y1MTFfTlVNRlJBTUVTOyBuKyspCisJCW92LT5mcmFtZVtuXS5ncmFic3RhdGUgPSBGUkFNRV9FUlJPUjsKKworCW92LT5jdXJmcmFtZSA9IC0xOworCisJLyogVGhpcyB3aWxsIGNhdXNlIHRoZSBwcm9jZXNzIHRvIHJlcXVlc3QgYW5vdGhlciBmcmFtZSAqLworCWZvciAobiA9IDA7IG4gPCBPVjUxMV9OVU1GUkFNRVM7IG4rKykKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZvdi0+ZnJhbWVbbl0ud3EpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZvdi0+d3EpOworCisJb3YtPnN0cmVhbWluZyA9IDA7CisJb3Y1MXhfdW5saW5rX2lzb2Mob3YpOworCisJb3YtPmRldiA9IE5VTEw7CisKKwkvKiBGcmVlIHRoZSBtZW1vcnkgKi8KKwlpZiAob3YgJiYgIW92LT51c2VyKSB7CisJCWRvd24oJm92LT5jYnVmX2xvY2spOworCQlrZnJlZShvdi0+Y2J1Zik7CisJCW92LT5jYnVmID0gTlVMTDsKKwkJdXAoJm92LT5jYnVmX2xvY2spOworCisJCW92NTF4X2RlYWxsb2Mob3YpOworCQlrZnJlZShvdik7CisJCW92ID0gTlVMTDsKKwl9CisKKwlQREVCVUcoMywgIkRpc2Nvbm5lY3QgY29tcGxldGUiKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG92NTExX2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkib3Y1MTEiLAorCS5pZF90YWJsZSA9CWRldmljZV90YWJsZSwKKwkucHJvYmUgPQlvdjUxeF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CW92NTF4X2Rpc2Nvbm5lY3QKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIE1vZHVsZSByb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJldHVybnMgMCBmb3Igc3VjY2VzcyAqLworaW50CitvdjUxMV9yZWdpc3Rlcl9kZWNvbXBfbW9kdWxlKGludCB2ZXIsIHN0cnVjdCBvdjUxeF9kZWNvbXBfb3BzICpvcHMsIGludCBvdjUxOCwKKwkJCSAgICAgaW50IG1teCkKK3sKKwlpZiAodmVyICE9IERFQ09NUF9JTlRFUkZBQ0VfVkVSKSB7CisJCWVycigiRGVjb21wcmVzc2lvbiBtb2R1bGUgaGFzIGluY29tcGF0aWJsZSIpOworCQllcnIoImludGVyZmFjZSB2ZXJzaW9uICVkIiwgdmVyKTsKKwkJZXJyKCJJbnRlcmZhY2UgdmVyc2lvbiAlZCBpcyByZXF1aXJlZCIsIERFQ09NUF9JTlRFUkZBQ0VfVkVSKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFvcHMpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG1teCAmJiAhb3Y1MXhfbW14X2F2YWlsYWJsZSkgeworCQllcnIoIk1NWCBub3QgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtIG9yIGtlcm5lbCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKG92NTE4KSB7CisJCWlmIChtbXgpIHsKKwkJCWlmIChvdjUxOF9tbXhfZGVjb21wX29wcykKKwkJCQlnb3RvIGVycl9pbl91c2U7CisJCQllbHNlCisJCQkJb3Y1MThfbW14X2RlY29tcF9vcHMgPSBvcHM7CisJCX0gZWxzZSB7CisJCQlpZiAob3Y1MThfZGVjb21wX29wcykKKwkJCQlnb3RvIGVycl9pbl91c2U7CisJCQllbHNlCisJCQkJb3Y1MThfZGVjb21wX29wcyA9IG9wczsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChtbXgpIHsKKwkJCWlmIChvdjUxMV9tbXhfZGVjb21wX29wcykKKwkJCQlnb3RvIGVycl9pbl91c2U7CisJCQllbHNlCisJCQkJb3Y1MTFfbW14X2RlY29tcF9vcHMgPSBvcHM7CisJCX0gZWxzZSB7CisJCQlpZiAob3Y1MTFfZGVjb21wX29wcykKKwkJCQlnb3RvIGVycl9pbl91c2U7CisJCQllbHNlCisJCQkJb3Y1MTFfZGVjb21wX29wcyA9IG9wczsKKwkJfQorCX0KKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKKworZXJyX2luX3VzZToKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIC1FQlVTWTsKK30KKwordm9pZAorb3Y1MTFfZGVyZWdpc3Rlcl9kZWNvbXBfbW9kdWxlKGludCBvdjUxOCwgaW50IG1teCkKK3sKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKG92NTE4KSB7CisJCWlmIChtbXgpCisJCQlvdjUxOF9tbXhfZGVjb21wX29wcyA9IE5VTEw7CisJCWVsc2UKKwkJCW92NTE4X2RlY29tcF9vcHMgPSBOVUxMOworCX0gZWxzZSB7CisJCWlmIChtbXgpCisJCQlvdjUxMV9tbXhfZGVjb21wX29wcyA9IE5VTEw7CisJCWVsc2UKKwkJCW92NTExX2RlY29tcF9vcHMgPSBOVUxMOworCX0KKworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK3VzYl9vdjUxMV9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcigmb3Y1MTFfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCWluZm8oRFJJVkVSX1ZFUlNJT04gIiA6ICIgRFJJVkVSX0RFU0MpOworCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0Cit1c2Jfb3Y1MTFfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZvdjUxMV9kcml2ZXIpOworCWluZm8oImRyaXZlciBkZXJlZ2lzdGVyZWQiKTsKKworfQorCittb2R1bGVfaW5pdCh1c2Jfb3Y1MTFfaW5pdCk7Cittb2R1bGVfZXhpdCh1c2Jfb3Y1MTFfZXhpdCk7CisKK0VYUE9SVF9TWU1CT0wob3Y1MTFfcmVnaXN0ZXJfZGVjb21wX21vZHVsZSk7CitFWFBPUlRfU1lNQk9MKG92NTExX2RlcmVnaXN0ZXJfZGVjb21wX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9vdjUxMS5oIGIvZHJpdmVycy91c2IvbWVkaWEvb3Y1MTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODY1MDlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvb3Y1MTEuaApAQCAtMCwwICsxLDU2OSBAQAorI2lmbmRlZiBfX0xJTlVYX09WNTExX0gKKyNkZWZpbmUgX19MSU5VWF9PVjUxMV9ICisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2RlZmluZSBPVjUxMV9ERUJVRwkvKiBUdXJuIG9uIGRlYnVnIG1lc3NhZ2VzICovCisKKyNpZmRlZiBPVjUxMV9ERUJVRworCSNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKKwkJaWYgKGRlYnVnID49IChsZXZlbCkpIGluZm8oIlslczolZF0gIiBmbXQsIFwKKwkJX19GVU5DVElPTl9fLCBfX0xJTkVfXyAsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworLyogVGhpcyBtYWNybyByZXN0cmljdHMgYW4gaW50IHZhcmlhYmxlIHRvIGFuIGluY2x1c2l2ZSByYW5nZSAqLworI2RlZmluZSBSRVNUUklDVF9UT19SQU5HRSh2LG1pLG1hKSB7IFwKKwlpZiAoKHYpIDwgKG1pKSkgKHYpID0gKG1pKTsgXAorCWVsc2UgaWYgKCh2KSA+IChtYSkpICh2KSA9IChtYSk7IFwKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBERUZJTkVTIEZPUiBPVjUxMSBBTkQgT1RIRVIgQ0hJUFMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBVU0IgSURzICovCisjZGVmaW5lIFZFTkRfT01OSVZJU0lPTgkweDA1QTkKKyNkZWZpbmUgUFJPRF9PVjUxMQkweDA1MTEKKyNkZWZpbmUgUFJPRF9PVjUxMVBMVVMJMHhBNTExCisjZGVmaW5lIFBST0RfT1Y1MTgJMHgwNTE4CisjZGVmaW5lIFBST0RfT1Y1MThQTFVTCTB4QTUxOAorCisjZGVmaW5lIFZFTkRfTUFUVEVMCTB4MDgxMworI2RlZmluZSBQUk9EX01FMkNBTQkweDAwMDIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgT1Y1MXggUkVHSVNURVIgTU5FTU9OSUNTICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDYW1lcmEgaW50ZXJmYWNlIHJlZ2lzdGVyIG51bWJlcnMgKi8KKyNkZWZpbmUgUjUxMV9DQU1fREVMQVkJCTB4MTAKKyNkZWZpbmUgUjUxMV9DQU1fRURHRQkJMHgxMQorI2RlZmluZSBSNTExX0NBTV9QWENOVAkJMHgxMgorI2RlZmluZSBSNTExX0NBTV9MTkNOVAkJMHgxMworI2RlZmluZSBSNTExX0NBTV9QWERJVgkJMHgxNAorI2RlZmluZSBSNTExX0NBTV9MTkRJVgkJMHgxNQorI2RlZmluZSBSNTExX0NBTV9VVl9FTgkJMHgxNgorI2RlZmluZSBSNTExX0NBTV9MSU5FX01PREUJMHgxNworI2RlZmluZSBSNTExX0NBTV9PUFRTCQkweDE4CisKKy8qIFNuYXBzaG90IG1vZGUgY2FtZXJhIGludGVyZmFjZSByZWdpc3RlciBudW1iZXJzICovCisjZGVmaW5lIFI1MTFfU05BUF9GUkFNRQkJMHgxOQorI2RlZmluZSBSNTExX1NOQVBfUFhDTlQJCTB4MUEKKyNkZWZpbmUgUjUxMV9TTkFQX0xOQ05UCQkweDFCCisjZGVmaW5lIFI1MTFfU05BUF9QWERJVgkJMHgxQworI2RlZmluZSBSNTExX1NOQVBfTE5ESVYJCTB4MUQKKyNkZWZpbmUgUjUxMV9TTkFQX1VWX0VOCQkweDFFCisjZGVmaW5lIFI1MTFfU05BUF9PUFRTCQkweDFGCisKKy8qIERSQU0gcmVnaXN0ZXIgbnVtYmVycyAqLworI2RlZmluZSBSNTExX0RSQU1fRkxPV19DVEwJMHgyMAorI2RlZmluZSBSNTExX0RSQU1fQVJDUAkJMHgyMQorI2RlZmluZSBSNTExX0RSQU1fTVJDCQkweDIyCisjZGVmaW5lIFI1MTFfRFJBTV9SRkMJCTB4MjMKKworLyogSVNPIEZJRk8gcmVnaXN0ZXIgbnVtYmVycyAqLworI2RlZmluZSBSNTF4X0ZJRk9fUFNJWkUJCTB4MzAJLyogMiBieXRlcyB3aWRlIHcvIE9WNTE4KCspICovCisjZGVmaW5lIFI1MTFfRklGT19PUFRTCQkweDMxCisKKy8qIFBhcmFsbGVsIElPIHJlZ2lzdGVyIG51bWJlcnMgKi8KKyNkZWZpbmUgUjUxMV9QSU9fT1BUUwkJMHgzOAorI2RlZmluZSBSNTExX1BJT19EQVRBCQkweDM5CisjZGVmaW5lIFI1MTFfUElPX0JJU1QJCTB4M0UKKyNkZWZpbmUgUjUxOF9HUElPX0lOCQkweDU1CS8qIE9WNTE4KCspIG9ubHkgKi8KKyNkZWZpbmUgUjUxOF9HUElPX09VVAkJMHg1NgkvKiBPVjUxOCgrKSBvbmx5ICovCisjZGVmaW5lIFI1MThfR1BJT19DVEwJCTB4NTcJLyogT1Y1MTgoKykgb25seSAqLworI2RlZmluZSBSNTE4X0dQSU9fUFVMU0VfSU4JMHg1OAkvKiBPVjUxOCgrKSBvbmx5ICovCisjZGVmaW5lIFI1MThfR1BJT19QVUxTRV9DTEVBUgkweDU5CS8qIE9WNTE4KCspIG9ubHkgKi8KKyNkZWZpbmUgUjUxOF9HUElPX1BVTFNFX1BPTAkweDVhCS8qIE9WNTE4KCspIG9ubHkgKi8KKyNkZWZpbmUgUjUxOF9HUElPX1BVTFNFX0VOCTB4NWIJLyogT1Y1MTgoKykgb25seSAqLworI2RlZmluZSBSNTE4X0dQSU9fUkVTRVQJCTB4NWMJLyogT1Y1MTgoKykgb25seSAqLworCisvKiBJMkMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFI1MTFfSTJDX0NUTAkJMHg0MAorI2RlZmluZSBSNTE4X0kyQ19DVEwJCTB4NDcJLyogT1Y1MTgoKykgb25seSAqLworI2RlZmluZSBSNTF4X0kyQ19XX1NJRAkJMHg0MQorI2RlZmluZSBSNTF4X0kyQ19TQUREUl8zCTB4NDIKKyNkZWZpbmUgUjUxeF9JMkNfU0FERFJfMgkweDQzCisjZGVmaW5lIFI1MXhfSTJDX1JfU0lECQkweDQ0CisjZGVmaW5lIFI1MXhfSTJDX0RBVEEJCTB4NDUKKyNkZWZpbmUgUjUxeF9JMkNfQ0xPQ0sJCTB4NDYKKyNkZWZpbmUgUjUxeF9JMkNfVElNRU9VVAkweDQ3CisKKy8qIEkyQyBzbmFwc2hvdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUjUxMV9TSTJDX1NBRERSXzMJMHg0OAorI2RlZmluZSBSNTExX1NJMkNfREFUQQkJMHg0OQorCisvKiBTeXN0ZW0gY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUjUxeF9TWVNfUkVTRVQJCTB4NTAKKwkJLyogUmVzZXQgdHlwZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSAJT1Y1MTFfUkVTRVRfVURDCQkweDAxCisjZGVmaW5lIAlPVjUxMV9SRVNFVF9JMkMJCTB4MDIKKyNkZWZpbmUgCU9WNTExX1JFU0VUX0ZJRk8JMHgwNAorI2RlZmluZSAJT1Y1MTFfUkVTRVRfT01OSUNFCTB4MDgKKyNkZWZpbmUgCU9WNTExX1JFU0VUX0RSQU0JMHgxMAorI2RlZmluZSAJT1Y1MTFfUkVTRVRfQ0FNX0lOVAkweDIwCisjZGVmaW5lIAlPVjUxMV9SRVNFVF9PVjUxMQkweDQwCisjZGVmaW5lIAlPVjUxMV9SRVNFVF9OT1JFR1MJMHgzRiAvKiBBbGwgYnV0IE9WNTExICYgcmVncyAqLworI2RlZmluZSAJT1Y1MTFfUkVTRVRfQUxMCQkweDdGCisKKyNkZWZpbmUgUjUxMV9TWVNfQ0xPQ0tfRElWCTB4NTEKKyNkZWZpbmUgUjUxeF9TWVNfU05BUAkJMHg1MgorI2RlZmluZSBSNTF4X1NZU19JTklUICAgICAgICAgCTB4NTMKKyNkZWZpbmUgUjUxMV9TWVNfUFdSX0NMSwkweDU0IC8qIE9WNTExKy9PVjUxOCgrKSBvbmx5ICovCisjZGVmaW5lIFI1MTFfU1lTX0xFRF9DVEwJMHg1NSAvKiBPVjUxMSsgb25seSAqLworI2RlZmluZSBSNTExX1NZU19VU0VSCQkweDVFCisjZGVmaW5lIFI1MTFfU1lTX0NVU1RfSUQJMHg1RgorCisvKiBPbW5pQ0UgKGNvbXByZXNzaW9uKSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUjUxMV9DT01QX1BIWQkJMHg3MAorI2RlZmluZSBSNTExX0NPTVBfUEhVVgkJMHg3MQorI2RlZmluZSBSNTExX0NPTVBfUFZZCQkweDcyCisjZGVmaW5lIFI1MTFfQ09NUF9QVlVWCQkweDczCisjZGVmaW5lIFI1MTFfQ09NUF9RSFkJCTB4NzQKKyNkZWZpbmUgUjUxMV9DT01QX1FIVVYJCTB4NzUKKyNkZWZpbmUgUjUxMV9DT01QX1FWWQkJMHg3NgorI2RlZmluZSBSNTExX0NPTVBfUVZVVgkJMHg3NworI2RlZmluZSBSNTExX0NPTVBfRU4JCTB4NzgKKyNkZWZpbmUgUjUxMV9DT01QX0xVVF9FTgkweDc5CQkKKyNkZWZpbmUgUjUxMV9DT01QX0xVVF9CRUdJTgkweDgwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICAgICBBTFRFUk5BVEUgTlVNQkVSUyAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQWx0ZXJuYXRlIG51bWJlcnMgZm9yIHZhcmlvdXMgbWF4IHBhY2tldCBzaXplcyAoT1Y1MTEgb25seSkgKi8KKyNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfOTkyCTAKKyNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfOTkzCTEKKyNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfNzY4CTIKKyNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfNzY5CTMKKyNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfNTEyCTQKKyNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfNTEzCTUKKyNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfMjU3CTYKKyNkZWZpbmUgT1Y1MTFfQUxUX1NJWkVfMAk3CisKKy8qIEFsdGVybmF0ZSBudW1iZXJzIGZvciB2YXJpb3VzIG1heCBwYWNrZXQgc2l6ZXMgKE9WNTExKyBvbmx5KSAqLworI2RlZmluZSBPVjUxMVBMVVNfQUxUX1NJWkVfMAkwCisjZGVmaW5lIE9WNTExUExVU19BTFRfU0laRV8zMwkxCisjZGVmaW5lIE9WNTExUExVU19BTFRfU0laRV8xMjkJMgorI2RlZmluZSBPVjUxMVBMVVNfQUxUX1NJWkVfMjU3CTMKKyNkZWZpbmUgT1Y1MTFQTFVTX0FMVF9TSVpFXzM4NQk0CisjZGVmaW5lIE9WNTExUExVU19BTFRfU0laRV81MTMJNQorI2RlZmluZSBPVjUxMVBMVVNfQUxUX1NJWkVfNzY5CTYKKyNkZWZpbmUgT1Y1MTFQTFVTX0FMVF9TSVpFXzk2MQk3CisKKy8qIEFsdGVybmF0ZSBudW1iZXJzIGZvciB2YXJpb3VzIG1heCBwYWNrZXQgc2l6ZXMgKE9WNTE4KCspIG9ubHkpICovCisjZGVmaW5lIE9WNTE4X0FMVF9TSVpFXzAJMAorI2RlZmluZSBPVjUxOF9BTFRfU0laRV8xMjgJMQorI2RlZmluZSBPVjUxOF9BTFRfU0laRV8yNTYJMgorI2RlZmluZSBPVjUxOF9BTFRfU0laRV8zODQJMworI2RlZmluZSBPVjUxOF9BTFRfU0laRV81MTIJNAorI2RlZmluZSBPVjUxOF9BTFRfU0laRV82NDAJNQorI2RlZmluZSBPVjUxOF9BTFRfU0laRV83NjgJNgorI2RlZmluZSBPVjUxOF9BTFRfU0laRV84OTYJNworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICBPVjc2MTAgUkVHSVNURVIgTU5FTU9OSUNTICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE9WNzYxMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19HQUlOICAgICAgICAgIDB4MDAJLyogZ2FpbiBzZXR0aW5nICg1OjApICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQkxVRSAgICAgICAgICAweDAxCS8qIGJsdWUgY2hhbm5lbCBiYWxhbmNlICovCisjZGVmaW5lIE9WNzYxMF9SRUdfUkVEICAgICAgICAgICAweDAyCS8qIHJlZCBjaGFubmVsIGJhbGFuY2UgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19TQVQgICAgICAgICAgIDB4MDMJLyogc2F0dXJhdGlvbiAqLworCQkJCQkvKiAwNCByZXNlcnZlZCAqLworI2RlZmluZSBPVjc2MTBfUkVHX0NOVCAgICAgICAgICAgMHgwNQkvKiBZIGNvbnRyYXN0ICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQlJUICAgICAgICAgICAweDA2CS8qIFkgYnJpZ2h0bmVzcyAqLworCQkJCQkvKiAwOC0wYiByZXNlcnZlZCAqLworI2RlZmluZSBPVjc2MTBfUkVHX0JMVUVfQklBUyAgICAgMHgwQwkvKiBibHVlIGNoYW5uZWwgYmlhcyAoNTowKSAqLworI2RlZmluZSBPVjc2MTBfUkVHX1JFRF9CSUFTICAgICAgMHgwRAkvKiByZWFkIGNoYW5uZWwgYmlhcyAoNTowKSAqLworI2RlZmluZSBPVjc2MTBfUkVHX0dBTU1BX0NPRUZGICAgMHgwRQkvKiBnYW1tYSBzZXR0aW5ncyAqLworI2RlZmluZSBPVjc2MTBfUkVHX1dCX1JBTkdFICAgICAgMHgwRgkvKiBBRUMvQUxDL1MtQVdCIHNldHRpbmdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfRVhQICAgICAgICAgICAweDEwCS8qIG1hbnVhbCBleHBvc3VyZSBzZXR0aW5nICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ0xPQ0sgICAgICAgICAweDExCS8qIHBvbGFyaXR5L2Nsb2NrIHByZXNjYWxlciAqLworI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9BICAgICAgICAgMHgxMgkvKiBtaXNjIGNvbW1vbiByZWdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0IgICAgICAgICAweDEzCS8qIG1pc2MgY29tbW9uIHJlZ3MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19DT01fQyAgICAgICAgIDB4MTQJLyogbWlzYyBjb21tb24gcmVncyAqLworI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9EICAgICAgICAgMHgxNQkvKiBtaXNjIGNvbW1vbiByZWdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfRklFTERfRElWSURFICAweDE2CS8qIGZpZWxkIGludGVydmFsL21vZGUgc2V0dGluZ3MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19IV0lOX1NUQVJUICAgIDB4MTcJLyogaG9yaXpvbnRhbCB3aW5kb3cgc3RhcnQgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19IV0lOX0VORCAgICAgIDB4MTgJLyogaG9yaXpvbnRhbCB3aW5kb3cgZW5kICovCisjZGVmaW5lIE9WNzYxMF9SRUdfVldJTl9TVEFSVCAgICAweDE5CS8qIHZlcnRpY2FsIHdpbmRvdyBzdGFydCAqLworI2RlZmluZSBPVjc2MTBfUkVHX1ZXSU5fRU5EICAgICAgMHgxQQkvKiB2ZXJ0aWNhbCB3aW5kb3cgZW5kICovCisjZGVmaW5lIE9WNzYxMF9SRUdfUElYRUxfU0hJRlQgICAweDFCCS8qIHBpeGVsIHNoaWZ0ICovCisjZGVmaW5lIE9WNzYxMF9SRUdfSURfSElHSCAgICAgICAweDFDCS8qIG1hbnVmYWN0dXJlciBJRCBNU0IgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19JRF9MT1cgICAgICAgIDB4MUQJLyogbWFudWZhY3R1cmVyIElEIExTQiAqLworCQkJCQkvKiAwZS0wZiByZXNlcnZlZCAqLworI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9FICAgICAgICAgMHgyMAkvKiBtaXNjIGNvbW1vbiByZWdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfWU9GRlNFVCAgICAgICAweDIxCS8qIFkgY2hhbm5lbCBvZmZzZXQgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19VT0ZGU0VUICAgICAgIDB4MjIJLyogVSBjaGFubmVsIG9mZnNldCAqLworCQkJCQkvKiAyMyByZXNlcnZlZCAqLworI2RlZmluZSBPVjc2MTBfUkVHX0VDVyAgICAgICAgICAgMHgyNAkvKiBFeHBvc3VyZSB3aGl0ZSBsZXZlbCBmb3IgQUVDICovCisjZGVmaW5lIE9WNzYxMF9SRUdfRUNCICAgICAgICAgICAweDI1CS8qIEV4cG9zdXJlIGJsYWNrIGxldmVsIGZvciBBRUMgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19DT01fRiAgICAgICAgIDB4MjYJLyogbWlzYyBzZXR0aW5ncyAqLworI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9HICAgICAgICAgMHgyNwkvKiBtaXNjIHNldHRpbmdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0ggICAgICAgICAweDI4CS8qIG1pc2Mgc2V0dGluZ3MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19DT01fSSAgICAgICAgIDB4MjkJLyogbWlzYyBzZXR0aW5ncyAqLworI2RlZmluZSBPVjc2MTBfUkVHX0ZSQU1FUkFURV9IICAgMHgyQQkvKiBmcmFtZSByYXRlIE1TQiArIG1pc2MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19GUkFNRVJBVEVfTCAgIDB4MkIJLyogZnJhbWUgcmF0ZSBMU0IgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19BTEMgICAgICAgICAgIDB4MkMJLyogQXV0byBMZXZlbCBDb250cm9sIHNldHRpbmdzICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0ogICAgICAgICAweDJECS8qIG1pc2Mgc2V0dGluZ3MgKi8KKyNkZWZpbmUgT1Y3NjEwX1JFR19WT0ZGU0VUICAgICAgIDB4MkUJLyogViBjaGFubmVsIG9mZnNldCBhZGp1c3RtZW50ICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQVJSQVlfQklBUwkgMHgyRgkvKiBBcnJheSBiaWFzIC0tIGRvbid0IGNoYW5nZSAqLworCQkJCQkvKiAzMC0zMiByZXNlcnZlZCAqLworI2RlZmluZSBPVjc2MTBfUkVHX1lHQU1NQSAgICAgICAgMHgzMwkvKiBtaXNjIGdhbW1hIHNldHRpbmdzICg3OjYpICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQklBU19BREpVU1QgICAweDM0CS8qIG1pc2MgYmlhcyBzZXR0aW5ncyAqLworI2RlZmluZSBPVjc2MTBfUkVHX0NPTV9MICAgICAgICAgMHgzNQkvKiBtaXNjIHNldHRpbmdzICovCisJCQkJCS8qIDM2LTM3IHJlc2VydmVkICovCisjZGVmaW5lIE9WNzYxMF9SRUdfQ09NX0sgICAgICAgICAweDM4CS8qIG1pc2MgcmVnaXN0ZXJzICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICAgICAgIEkyQyBBRERSRVNTRVMgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBPVjd4eDBfU0lEICAgMHg0MgorI2RlZmluZSBPVjZ4eDBfU0lEICAgMHhDMAorI2RlZmluZSBPVjh4eDBfU0lEICAgMHhBMAorI2RlZmluZSBLUzAxMjdfU0lEICAgMHhEOAorI2RlZmluZSBTQUE3MTExQV9TSUQgMHg0OAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgIE1JU0NFTExBTkVPVVMgREVGSU5FUyAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgSTJDX0NMT0NLX1BSRVNDQUxFUiAJMHgwMworCisjZGVmaW5lIEZSQU1FU19QRVJfREVTQwkJMTAJLyogRklYTUUgLSBXaGF0IHNob3VsZCB0aGlzIGJlPyAqLworI2RlZmluZSBNQVhfRlJBTUVfU0laRV9QRVJfREVTQwk5OTMJLyogRm9yIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHN0dWZmICovCisjZGVmaW5lIFBJWEVMU19QRVJfU0VHCQkyNTYJLyogUGl4ZWxzIHBlciBzZWdtZW50ICovCisKKyNkZWZpbmUgT1Y1MTFfRU5EUE9JTlRfQUREUkVTUwkxCS8qIElzb2MgZW5kcG9pbnQgbnVtYmVyICovCisKKyNkZWZpbmUgT1Y1MTFfTlVNRlJBTUVTCTIKKyNpZiBPVjUxMV9OVU1GUkFNRVMgPiBWSURFT19NQVhfRlJBTUUKKwkjZXJyb3IgIk9WNTExX05VTUZSQU1FUyBpcyB0b28gaGlnaCIKKyNlbmRpZgorCisjZGVmaW5lIE9WNTExX05VTVNCVUYJCTIKKworLyogQ29udHJvbCB0cmFuc2ZlcnMgdXNlIHVwIHRvIDQgYnl0ZXMgKi8KKyNkZWZpbmUgT1Y1MTFfQ0JVRl9TSVpFCQk0CisKKy8qIFNpemUgb2YgdXNiX21ha2VfcGF0aCgpIGJ1ZmZlciAqLworI2RlZmluZSBPVjUxMV9VU0JfUEFUSF9MRU4JNjQKKworLyogQnJpZGdlIHR5cGVzICovCitlbnVtIHsKKwlCUkdfVU5LTk9XTiwKKwlCUkdfT1Y1MTEsCisJQlJHX09WNTExUExVUywKKwlCUkdfT1Y1MTgsCisJQlJHX09WNTE4UExVUywKK307CisKKy8qIEJyaWRnZSBjbGFzc2VzICovCitlbnVtIHsKKwlCQ0xfVU5LTk9XTiwKKwlCQ0xfT1Y1MTEsCisJQkNMX09WNTE4LAorfTsKKworLyogU2Vuc29yIHR5cGVzICovCitlbnVtIHsKKwlTRU5fVU5LTk9XTiwKKwlTRU5fT1Y3NkJFLAorCVNFTl9PVjc2MTAsCisJU0VOX09WNzYyMCwKKwlTRU5fT1Y3NjIwQUUsCisJU0VOX09WNjYyMCwKKwlTRU5fT1Y2NjMwLAorCVNFTl9PVjY2MzBBRSwKKwlTRU5fT1Y2NjMwQUYsCisJU0VOX09WODYwMCwKKwlTRU5fS1MwMTI3LAorCVNFTl9LUzAxMjdCLAorCVNFTl9TQUE3MTExQSwKK307CisKK2VudW0geworCVNUQVRFX1NDQU5OSU5HLAkJLyogU2Nhbm5pbmcgZm9yIHN0YXJ0ICovCisJU1RBVEVfSEVBREVSLAkJLyogUGFyc2luZyBoZWFkZXIgKi8KKwlTVEFURV9MSU5FUywJCS8qIFBhcnNpbmcgbGluZXMgKi8KK307CisKKy8qIEJ1ZmZlciBzdGF0ZXMgKi8KK2VudW0geworCUJVRl9OT1RfQUxMT0NBVEVELAorCUJVRl9BTExPQ0FURUQsCit9OworCisvKiAtLS0tLS0tLS0gRGVmaW5pdGlvbiBvZiBpb2N0bCBpbnRlcmZhY2UgLS0tLS0tLS0tICovCisKKyNkZWZpbmUgT1Y1MTFfSU5URVJGQUNFX1ZFUiAxMDEKKworLyogTEVEIG9wdGlvbnMgKi8KK2VudW0geworCUxFRF9PRkYsCisJTEVEX09OLAorCUxFRF9BVVRPLAorfTsKKworLyogUmF3IGZyYW1lIGZvcm1hdHMgKi8KK2VudW0geworCVJBV0ZNVF9JTlZBTElELAorCVJBV0ZNVF9ZVVY0MDAsCisJUkFXRk1UX1lVVjQyMCwKKwlSQVdGTVRfWVVWNDIyLAorCVJBV0ZNVF9HQlI0MjIsCit9OworCitzdHJ1Y3Qgb3Y1MTFfaTJjX3N0cnVjdCB7CisJdW5zaWduZWQgY2hhciBzbGF2ZTsgLyogV3JpdGUgc2xhdmUgSUQgKHJlYWQgSUQgLSAxKSAqLworCXVuc2lnbmVkIGNoYXIgcmVnOyAgIC8qIEluZGV4IG9mIHJlZ2lzdGVyICovCisJdW5zaWduZWQgY2hhciB2YWx1ZTsgLyogVXNlciBzZXRzIHRoaXMgdy8gd3JpdGUsIGRyaXZlciBkb2VzIHcvIHJlYWQgKi8KKwl1bnNpZ25lZCBjaGFyIG1hc2s7ICAvKiBCaXRzIHRvIGJlIGNoYW5nZWQuIE5vdCB1c2VkIHdpdGggcmVhZCBvcHMgKi8KK307CisKKy8qIGlvY3RscyAqLworI2RlZmluZSBPVjUxMUlPQ19XSTJDICAgICBfSU9XKCd2JywgQkFTRV9WSURJT0NQUklWQVRFICsgNSwgXAorCQkJICAgICAgIHN0cnVjdCBvdjUxMV9pMmNfc3RydWN0KQorI2RlZmluZSBPVjUxMUlPQ19SSTJDICAgIF9JT1dSKCd2JywgQkFTRV9WSURJT0NQUklWQVRFICsgNiwgXAorCQkJICAgICAgIHN0cnVjdCBvdjUxMV9pMmNfc3RydWN0KQorLyogLS0tLS0tLS0tLS0tLSBFbmQgSU9DVEwgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCB1c2Jfb3Y1MTE7CQkvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCisKK3N0cnVjdCBvdjUxMV9zYnVmIHsKKwlzdHJ1Y3QgdXNiX292NTExICpvdjsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXN0cnVjdCB1cmIgKnVyYjsKKwlzcGlubG9ja190IGxvY2s7CisJaW50IG47Cit9OworCitlbnVtIHsKKwlGUkFNRV9VTlVTRUQsCQkvKiBVbnVzZWQgKG5vIE1DQVBUVVJFKSAqLworCUZSQU1FX1JFQURZLAkJLyogUmVhZHkgdG8gc3RhcnQgZ3JhYmJpbmcgKi8KKwlGUkFNRV9HUkFCQklORywJCS8qIEluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGdyYWJiZWQgaW50byAqLworCUZSQU1FX0RPTkUsCQkvKiBGaW5pc2hlZCBncmFiYmluZywgYnV0IG5vdCBiZWVuIHN5bmNlZCB5ZXQgKi8KKwlGUkFNRV9FUlJPUiwJCS8qIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQgd2hpbGUgcHJvY2Vzc2luZyAqLworfTsKKworc3RydWN0IG92NTExX3JlZ3ZhbHMgeworCWVudW0geworCQlPVjUxMV9ET05FX0JVUywKKwkJT1Y1MTFfUkVHX0JVUywKKwkJT1Y1MTFfSTJDX0JVUywKKwl9IGJ1czsKKwl1bnNpZ25lZCBjaGFyIHJlZzsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKK307CisKK3N0cnVjdCBvdjUxMV9mcmFtZSB7CisJaW50IGZyYW1lbnVtOwkJLyogSW5kZXggb2YgdGhpcyBmcmFtZSAqLworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CS8qIEZyYW1lIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKnRlbXBkYXRhOyAvKiBUZW1wIGJ1ZmZlciBmb3IgbXVsdGktc3RhZ2UgY29udmVyc2lvbnMgKi8KKwl1bnNpZ25lZCBjaGFyICpyYXdkYXRhOwkvKiBSYXcgY2FtZXJhIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAqY29tcGJ1ZjsJLyogVGVtcCBidWZmZXIgZm9yIGRlY29tcHJlc3NvciAqLworCisJaW50IGRlcHRoOwkJLyogQnl0ZXMgcGVyIHBpeGVsICovCisJaW50IHdpZHRoOwkJLyogV2lkdGggYXBwbGljYXRpb24gaXMgZXhwZWN0aW5nICovCisJaW50IGhlaWdodDsJCS8qIEhlaWdodCBhcHBsaWNhdGlvbiBpcyBleHBlY3RpbmcgKi8KKworCWludCByYXd3aWR0aDsJCS8qIEFjdHVhbCB3aWR0aCBvZiBmcmFtZSBzZW50IGZyb20gY2FtZXJhICovCisJaW50IHJhd2hlaWdodDsJCS8qIEFjdHVhbCBoZWlnaHQgb2YgZnJhbWUgc2VudCBmcm9tIGNhbWVyYSAqLworCisJaW50IHN1Yl9mbGFnOwkJLyogU3ViLWNhcHR1cmUgbW9kZSBmb3IgdGhpcyBmcmFtZT8gKi8KKwl1bnNpZ25lZCBpbnQgZm9ybWF0OwkvKiBGb3JtYXQgZm9yIHRoaXMgZnJhbWUgKi8KKwlpbnQgY29tcHJlc3NlZDsJCS8qIElzIGZyYW1lIGNvbXByZXNzZWQ/ICovCisKKwl2b2xhdGlsZSBpbnQgZ3JhYnN0YXRlOwkvKiBTdGF0ZSBvZiBncmFiYmluZyAqLworCWludCBzY2Fuc3RhdGU7CQkvKiBTdGF0ZSBvZiBzY2FubmluZyAqLworCisJaW50IGJ5dGVzX3JlY3ZkOwkvKiBOdW1iZXIgb2YgaW1hZ2UgYnl0ZXMgcmVjZWl2ZWQgZnJvbSBjYW1lcmEgKi8KKworCWxvbmcgYnl0ZXNfcmVhZDsJLyogQW1vdW50IHRoYXQgaGFzIGJlZW4gcmVhZCgpICovCisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsJLyogUHJvY2Vzc2VzIHdhaXRpbmcgKi8KKworCWludCBzbmFwc2hvdDsJCS8qIFRydWUgaWYgZnJhbWUgd2FzIGEgc25hcHNob3QgKi8KK307CisKKyNkZWZpbmUgREVDT01QX0lOVEVSRkFDRV9WRVIgNAorCisvKiBDb21wcmVzc2lvbiBtb2R1bGUgb3BlcmF0aW9ucyAqLworc3RydWN0IG92NTF4X2RlY29tcF9vcHMgeworCWludCAoKmRlY29tcF80MDApKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCisJCQkgIGludCwgaW50LCBpbnQpOworCWludCAoKmRlY29tcF80MjApKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCisJCQkgIGludCwgaW50LCBpbnQpOworCWludCAoKmRlY29tcF80MjIpKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCisJCQkgIGludCwgaW50LCBpbnQpOworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKworc3RydWN0IHVzYl9vdjUxMSB7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OworCisJaW50IGN1c3RvbWlkOworCWNoYXIgKmRlc2M7CisJdW5zaWduZWQgY2hhciBpZmFjZTsKKwljaGFyIHVzYl9wYXRoW09WNTExX1VTQl9QQVRIX0xFTl07CisKKwkvKiBEZXRlcm1pbmVkIGJ5IHNlbnNvciB0eXBlICovCisJaW50IG1heHdpZHRoOworCWludCBtYXhoZWlnaHQ7CisJaW50IG1pbndpZHRoOworCWludCBtaW5oZWlnaHQ7CisKKwlpbnQgYnJpZ2h0bmVzczsKKwlpbnQgY29sb3VyOworCWludCBjb250cmFzdDsKKwlpbnQgaHVlOworCWludCB3aGl0ZW5lc3M7CisJaW50IGV4cG9zdXJlOworCWludCBhdXRvX2JydDsJCS8qIEF1dG8gYnJpZ2h0bmVzcyBlbmFibGVkIGZsYWcgKi8KKwlpbnQgYXV0b19nYWluOwkJLyogQXV0byBnYWluIGNvbnRyb2wgZW5hYmxlZCBmbGFnICovCisJaW50IGF1dG9fZXhwOwkJLyogQXV0byBleHBvc3VyZSBlbmFibGVkIGZsYWcgKi8KKwlpbnQgYmFja2xpZ2h0OwkJLyogQmFja2xpZ2h0IGV4cG9zdXJlIGFsZ29yaXRobSBmbGFnICovCisJaW50IG1pcnJvcjsJCS8qIEltYWdlIGlzIHJldmVyc2VkIGhvcml6b250YWxseSAqLworCisJaW50IGxlZF9wb2xpY3k7CQkvKiBMRUQ6IG9mZnxvbnxhdXRvOyBPVjUxMSsgb25seSAqLworCisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOwkvKiBTZXJpYWxpemVzIHVzZXItYWNjZXNzaWJsZSBvcGVyYXRpb25zICovCisJaW50IHVzZXI7CQkvKiB1c2VyIGNvdW50IGZvciBleGNsdXNpdmUgdXNlICovCisKKwlpbnQgc3RyZWFtaW5nOwkJLyogQXJlIHdlIHN0cmVhbWluZyBJc29jaHJvbm91cz8gKi8KKwlpbnQgZ3JhYmJpbmc7CQkvKiBBcmUgd2UgZ3JhYmJpbmc/ICovCisKKwlpbnQgY29tcHJlc3M7CQkvKiBTaG91bGQgdGhlIG5leHQgZnJhbWUgYmUgY29tcHJlc3NlZD8gKi8KKwlpbnQgY29tcHJlc3NfaW5pdGVkOwkvKiBBcmUgY29tcHJlc3Npb24gcGFyYW1zIHVwbG9hZGVkPyAqLworCisJaW50IGxpZ2h0ZnJlcTsJCS8qIFBvd2VyIChsaWdodGluZykgZnJlcXVlbmN5ICovCisJaW50IGJhbmRmaWx0OwkJLyogQmFuZGluZyBmaWx0ZXIgZW5hYmxlZCBmbGFnICovCisKKwl1bnNpZ25lZCBjaGFyICpmYnVmOwkvKiBWaWRlb2RldiBidWZmZXIgYXJlYSAqLworCXVuc2lnbmVkIGNoYXIgKnRlbXBmYnVmOyAvKiBUZW1wb3JhcnkgKGludGVybWVkaWF0ZSkgYnVmZmVyIGFyZWEgKi8KKwl1bnNpZ25lZCBjaGFyICpyYXdmYnVmOwkvKiBSYXcgY2FtZXJhIGRhdGEgYnVmZmVyIGFyZWEgKi8KKworCWludCBzdWJfZmxhZzsJCS8qIFBpeCBBcnJheSBzdWJjYXB0dXJlIG9uIGZsYWcgKi8KKwlpbnQgc3VieDsJCS8qIFBpeCBBcnJheSBzdWJjYXB0dXJlIHggb2Zmc2V0ICovCisJaW50IHN1Ynk7CQkvKiBQaXggQXJyYXkgc3ViY2FwdHVyZSB5IG9mZnNldCAqLworCWludCBzdWJ3OwkJLyogUGl4IEFycmF5IHN1YmNhcHR1cmUgd2lkdGggKi8KKwlpbnQgc3ViaDsJCS8qIFBpeCBBcnJheSBzdWJjYXB0dXJlIGhlaWdodCAqLworCisJaW50IGN1cmZyYW1lOwkJLyogQ3VycmVudCByZWNlaXZpbmcgc2J1ZiAqLworCXN0cnVjdCBvdjUxMV9mcmFtZSBmcmFtZVtPVjUxMV9OVU1GUkFNRVNdOwkKKworCXN0cnVjdCBvdjUxMV9zYnVmIHNidWZbT1Y1MTFfTlVNU0JVRl07CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsJLyogUHJvY2Vzc2VzIHdhaXRpbmcgKi8KKworCWludCBzbmFwX2VuYWJsZWQ7CS8qIFNuYXBzaG90IG1vZGUgZW5hYmxlZCAqLworCQorCWludCBicmlkZ2U7CQkvKiBUeXBlIG9mIGJyaWRnZSAoQlJHXyopICovCisJaW50IGJjbGFzczsJCS8qIENsYXNzIG9mIGJyaWRnZSAoQkNMXyopICovCisJaW50IHNlbnNvcjsJCS8qIFR5cGUgb2YgaW1hZ2Ugc2Vuc29yIGNoaXAgKFNFTl8qKSAqLworCisJaW50IHBhY2tldF9zaXplOwkvKiBGcmFtZSBzaXplIHBlciBpc29jIGRlc2MgKi8KKwlpbnQgcGFja2V0X251bWJlcmluZzsJLyogSXMgSVNPIGZyYW1lIG51bWJlcmluZyBlbmFibGVkPyAqLworCisJc3RydWN0IHNlbWFwaG9yZSBwYXJhbV9sb2NrOwkvKiBwYXJhbXMgbG9jayBmb3IgdGhpcyBjYW1lcmEgKi8KKworCS8qIEZyYW1lYnVmZmVyL3NidWYgbWFuYWdlbWVudCAqLworCWludCBidWZfc3RhdGU7CisJc3RydWN0IHNlbWFwaG9yZSBidWZfbG9jazsKKworCXN0cnVjdCBvdjUxeF9kZWNvbXBfb3BzICpkZWNvbXBfb3BzOworCisJLyogU3RvcCBzdHJlYW1pbmcgd2hpbGUgY2hhbmdpbmcgcGljdHVyZSBzZXR0aW5ncyAqLworCWludCBzdG9wX2R1cmluZ19zZXQ7CisKKwlpbnQgc3RvcHBlZDsJCS8qIFN0cmVhbWluZyBpcyB0ZW1wb3JhcmlseSBwYXVzZWQgKi8KKworCS8qIFZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KKwlpbnQgaW5wdXQ7CQkvKiBDb21wb3NpdGUsIFMtVklERU8sIGV0Yy4uLiAqLworCWludCBudW1faW5wdXRzOwkJLyogTnVtYmVyIG9mIGlucHV0cyAqLworCWludCBub3JtOyAJCS8qIE5UU0MgLyBQQUwgLyBTRUNBTSAqLworCWludCBoYXNfZGVjb2RlcjsJLyogRGV2aWNlIGhhcyBhIHZpZGVvIGRlY29kZXIgKi8KKwlpbnQgcGFsOwkJLyogRGV2aWNlIGlzIGRlc2lnbmVkIGZvciBQQUwgcmVzb2x1dGlvbiAqLworCisJLyogSTJDIGludGVyZmFjZSAqLworCXN0cnVjdCBzZW1hcGhvcmUgaTJjX2xvY2s7CSAgLyogUHJvdGVjdCBJMkMgY29udHJvbGxlciByZWdzICovCisJdW5zaWduZWQgY2hhciBwcmltYXJ5X2kyY19zbGF2ZTsgIC8qIEkyQyB3cml0ZSBpZCBvZiBzZW5zb3IgKi8KKworCS8qIENvbnRyb2wgdHJhbnNhY3Rpb24gc3R1ZmYgKi8KKwl1bnNpZ25lZCBjaGFyICpjYnVmOwkJLyogQnVmZmVyIGZvciBwYXlsb2FkICovCisJc3RydWN0IHNlbWFwaG9yZSBjYnVmX2xvY2s7Cit9OworCisvKiBVc2VkIHRvIHJlcHJlc2VudCBhIGxpc3Qgb2YgdmFsdWVzIGFuZCB0aGVpciByZXNwZWN0aXZlIHN5bWJvbGljIG5hbWVzICovCitzdHJ1Y3Qgc3ltYm9saWNfbGlzdCB7CisJaW50IG51bTsKKwljaGFyICpuYW1lOworfTsKKworI2RlZmluZSBOT1RfREVGSU5FRF9TVFIgIlVua25vd24iCisKKy8qIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIHN5bWJvbGljX2xpc3QgYXJyYXkuIFRoZQorICogZW5kIG9mIHRoZSBsaXN0IG11c3QgYmUgbWFya2VkIHdpdGggYW4gZWxlbWVudCB0aGF0IGhhcyBhIE5VTEwgbmFtZS4KKyAqLworc3RhdGljIGlubGluZSBjaGFyICogCitzeW1ib2xpYyhzdHJ1Y3Qgc3ltYm9saWNfbGlzdCBsaXN0W10sIGludCBudW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBsaXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQkJaWYgKGxpc3RbaV0ubnVtID09IG51bSkKKwkJCQlyZXR1cm4gKGxpc3RbaV0ubmFtZSk7CisKKwlyZXR1cm4gKE5PVF9ERUZJTkVEX1NUUik7Cit9CisKKy8qIENvbXByZXNzaW9uIHN0dWZmICovCisKKyNkZWZpbmUgT1Y1MTFfUVVBTlRBQkxFU0laRQk2NAorI2RlZmluZSBPVjUxOF9RVUFOVEFCTEVTSVpFCTMyCisKKyNkZWZpbmUgT1Y1MTFfWVFVQU5UQUJMRSB7IFwKKwkwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCBcCisJMSwgMSwgMSwgMiwgMiwgMywgNCwgNCwgXAorCTEsIDEsIDIsIDIsIDMsIDQsIDQsIDQsIFwKKwkyLCAyLCAyLCAzLCA0LCA0LCA0LCA0LCBcCisJMiwgMiwgMywgNCwgNCwgNSwgNSwgNSwgXAorCTMsIDMsIDQsIDQsIDUsIDUsIDUsIDUsIFwKKwkzLCA0LCA0LCA0LCA1LCA1LCA1LCA1LCBcCisJNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSAgXAorfQorCisjZGVmaW5lIE9WNTExX1VWUVVBTlRBQkxFIHsgXAorCTAsIDIsIDIsIDMsIDQsIDQsIDQsIDQsIFwKKwkyLCAyLCAyLCA0LCA0LCA0LCA0LCA0LCBcCisJMiwgMiwgMywgNCwgNCwgNCwgNCwgNCwgXAorCTMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIFwKKwk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCBcCisJNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgXAorCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIFwKKwk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0ICBcCit9CisKKyNkZWZpbmUgT1Y1MThfWVFVQU5UQUJMRSB7IFwKKwk1LCA0LCA1LCA2LCA2LCA3LCA3LCA3LCBcCisJNSwgNSwgNSwgNSwgNiwgNywgNywgNywgXAorCTYsIDYsIDYsIDYsIDcsIDcsIDcsIDgsIFwKKwk3LCA3LCA2LCA3LCA3LCA3LCA4LCA4ICBcCit9CisKKyNkZWZpbmUgT1Y1MThfVVZRVUFOVEFCTEUgeyBcCisJNiwgNiwgNiwgNywgNywgNywgNywgNywgXAorCTYsIDYsIDYsIDcsIDcsIDcsIDcsIDcsIFwKKwk2LCA2LCA2LCA3LCA3LCA3LCA3LCA4LCBcCisJNywgNywgNywgNywgNywgNywgOCwgOCAgXAorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9DaGFuZ2VMb2cgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWI3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTQzIEBACis5LjAuMgorCisqIEFkZGluZyAjaWZkZWYgdG8gY29tcGlsZSBQV0MgYmVmb3JlIGFuZCBhZnRlciAyLjYuNQorCis5LjAuMQorCis5LjAKKworCis4LjEyCisKKyogSW1wbGVtZW50IG1vdG9yaXplZCBwYW4vdGlsdCBmZWF0dXJlIGZvciBMb2dpdGVjaCBRdWlja0NhbSBPcmJpdC9TcGVyZS4KKworOC4xMS4xCisKKyogRml4IGZvciBQQ1ZDNzIwLzQwLCB3b3VsZCBub3QgYmUgYWJsZSB0byBzZXQgdmlkZW9tb2RlCisqIEZpeCBmb3IgU2Ftc3VuZyBNUEMgbW9kZWxzLCBhcHBlYXJhbnRseSB0aGV5IGFyZSBiYXNlZCBvbiBhIG5ld2VyIGNoaXBzZXQKKworOC4xMQorCisqIDIwIGRldl9oaW50cyAocGVyIHJlcXVlc3QpCisqIEhvdCB1bnBsdWdnaW5nIHNob3VsZCBiZSBiZXR0ZXIsIG5vIG1vcmUgZGFuZ2xpbmcgcG9pbnRlcnMgb3IgbWVtb3J5IGxlYWtzCisqIEFkZGVkIHJlc2VydmVkIExvZ2l0ZWNoIHdlYmNhbSBJRHMKKyogRGV2aWNlIG5vdyByZW1lbWJlcnMgc2l6ZSAmIGZwcyBiZXR3ZWVuIGNsb3NlKCkvb3BlbigpCisqIFJlbW92ZWQgcGFsZXR0ZSBzdHVmZiBhbHRvZ2V0aGVyCisKKzguMTAuMQorCisqIEFkZGVkIElEcyBmb3IgUENWQzcyMEsvNDAgYW5kIENyZWF0aXZlIExhYnMgV2ViY2FtIFBybworCis4LjEwCisKKyogRml4ZWQgSUQgZm9yIFF1aWNrQ2FtIE5vdGVib29rIHBybworKiBBZGRlZCBHUkVBTFNJWkUgaW9jdGwoKSBjYWxsCisqIEZpeGVkIGJ1ZyBpbiBjYXNlIFBXQ1ggd2FzIG5vdCBsb2FkZWQgYW5kIGludmFsaWQgc2l6ZSB3YXMgc2V0CisKKzguOQorCisqIE1lcmdpbmcgd2l0aCBrZXJuZWwgMi41LjQ5CisqIEFkZGluZyBJRHMgZm9yIFF1aWNrQ2FtIFpvb20gJiBRdWlja0NhbSBOb3RlYm9vaworCis4LjgKKworKiBGaXhpbmcgJ2xlZHMnIHBhcmFtZXRlcgorKiBBZGRpbmcgSURzIGZvciBMb2dpdGVjaCBRdWlja0NhbSBQcm8gNDAwMAorKiBNYWtpbmcgVVJCIGluaXQvY2xlYW51cCBhIGxpdHRsZSBuaWNlcgorCis4LjcKKworKiBJbmNvcnBvcmF0aW5nIGNoYW5nZXMgaW4gaW9jdGwoKSBwYXJhbWV0ZXIgcGFzc2luZworKiBBbHNvIGNoYW5nZXMgdG8gVVJCIG1lY2hhbmlzbQorCis4LjYKKworKiBBZGRlZCBJRCdzIGZvciBWaXNpb25pdGUgVkNTIFVNMTAwIGFuZCBVQzMwMAorKiBSZW1vdmVkIFlVVjQyMC1pbnRlcmxhY2VkIHBhbGV0dGUgYWx0b2dldGhlciAod2FzIGNvbmZ1c2luZykKKyogUmVtb3ZlZCBNSVJST1Igc3R1ZmYgYXMgaXQgZGlkbid0IHdvcmsgYW55d2F5CisqIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSAnbGVkcycgcGFyYW1ldGVyICh3b3VsZG4ndCBibGluaykKKyogQWRkZWQgaW9jdGwoKXMgZm9yIGFkdmFuY2VkIGZlYXR1cmVzOiAnZXh0ZW5kZWQnIHdoaXRlYmFsYW5jZSBpb2N0bCgpcywKKyAgQ09OVE9VUiwgQkFDS0xJR0hULCBGTElDS0VSLCBEWU5OT0lTRS4KKyogVklESU9DR0NBUC5uYW1lIG5vdyBjb250YWlucyByZWFsIGNhbWVyYSBtb2RlbCBuYW1lIGluc3RlYWQgb2YKKyAgJ1BoaWxpcHMgeHh4IHdlYmNhbScKKyogQWRkZWQgUFJPQkUgaW9jdGwgKHNlZSBwcmV2aW91cyBwb2ludCAmIEFQSSBkb2MpCisKKzguNQorCisqIEFkZGluZyBJRHMgZm9yIENyZWF0aXZlIExhYnMgV2ViY2FtIDUKKyogQWRkaW5nIElEcyBmb3IgU09URUMgQ01TLTAwMSB3ZWJjYW0KKyogU29sdmluZyBwb3NzaWJsZSBoYW5nIGluIFZJRElPQ1NZTkMgd2hlbiB1bnBsdWdnaW5nIHRoZSBjYW0gCisqIEZvcmdvdCB0byByZXR1cm4gc3RydWN0dXJlIGluIFZJRElPQ1BXQ0dBV0IsIG9vcHMKKyogVGltZSBpbnRlcnZhbCBmb3IgdGhlIExFRHMgYXJlIG5vdyBpbiBtaWxsaXNlY29uZHMKKworOC40CisKKyogRml4aW5nIHBvd2VyX3NhdmUgb3B0aW9uIGZvciBWZXN0YSByYW5nZQorKiBIYW5kbGluZyBuZXcgZXJyb3IgY29kZXMgaW4gSVNPQyBjYWxsYmFjaworKiBBZGRpbmcgZGV2X2hpbnQgbW9kdWxlIHBhcmFtZXRlciwgdG8gc3BlY2lmeSAvZGV2L3ZpZGVvWCBkZXZpY2Ugbm9kZXMKKworOC4zCisKKyogQWRkaW5nIFNhbXN1bmcgQzEwIGFuZCBDMzAgY2FtZXJhcworKiBSZW1vdmluZyBwYWxldHRlIG1vZHVsZSBwYXJhbWV0ZXIKKyogRml4ZWQgdHlwbyBpbiBJRCBvZiBRdWlja0NhbSAzMDAwIFBybworKiBBZGRpbmcgTEVEIHNldHRpbmdzIChibGlua2luZyB3aGlsZSBpbiB1c2UpIGZvciBUb1VDYW0gY2FtZXJhcy4KKyogVHVybnMgTEVEIG9mZiB3aGVuIGNhbWVyYSBpcyBub3QgaW4gdXNlLgorCis4LjIKKworKiBNYWtpbmcgbW9kdWxlIG1vcmUgc2lsZW50IHdoZW4gdHJhY2UgPSAwIAorKiBBZGRpbmcgUXVpY2tDYW0gMzAwMCBQcm8gSURzCisqIENocm9taW5hbmNlIGNvbnRyb2wgZm9yIHRoZSBWZXN0YSBjYW1lcmFzCisqIEhvcGVmdWxseSBmaXhlZCBwcm9ibGVtcyBvbiBtYWNoaW5lcyB3aXRoIEJJR01FTSBhbmQgPiAxR0Igb2YgUkFNCisqIEluY2x1ZGVkIE9saXZlciBOZXVrZW0ncyBsb2NrX2tlcm5lbCgpIHBhdGNoCisqIEFsbG9jYXRlcyBsZXNzIG1lbW9yeSBmb3IgaW1hZ2UgYnVmZmVycworKiBBZGRzIGlvY3RsKClzIGZvciB0aGUgd2hpdGViYWxhbmNpbmcKKworOC4xCisKKyogQWRkaW5nIHN1cHBvcnQgZm9yIDc1MAorKiBBZGRpbmcgVjRMIEdBVURJTy9TQVVESU8vVU5JVCBpb2N0bCgpIGNhbGxzCisKKzguMAorKiAnZGFtYWdlIGNvbnRyb2wnIGFmdGVyIGluY2x1c2lvbiBpbiAyLjQuNS4KKyogQ2hhbmdlZCB3YWl0LXF1ZXVlIG1lY2hhbmlzbSBpbiByZWFkL21tYXAvcG9sbCBhY2NvcmRpbmcgdG8gdGhlIGJvb2suCisqIEluY2x1ZGVkIFlVVjQyMFAgcGFsZXR0ZS4KKyogQ2hhbmdlZCBpbnRlcmZhY2UgdG8gZGVjb21wcmVzc29yIG1vZHVsZS4KKyogQ2xlYW5lZCB1cCBwd2Mgc3RydWN0dXJlIGEgYml0LgorCis3LjAKKworKiBGaXhlZCBidWcgaW4gdmN2dF80MjBpX3l1eXY7IGV4dHJhIHZhcmlhYmxlcyBvbiBzdGFjayB3ZXJlIG1pc2FsaWduZWQuCisqIFRoZXJlIGlzIG5vdyBhIGNsZWFyIGVycm9yIG1lc3NhZ2Ugd2hlbiBhbiBpbWFnZSBzaXplIGlzIHNlbGVjdGVkIHRoYXQKKyAgaXMgb25seSBzdXBwb3J0ZWQgdXNpbmcgdGhlIGRlY29tcHJlc3NvciwgYW5kIHRoZSBkZWNvbXByZXNzb3IgaXNuJ3QKKyAgbG9hZGVkLgorKiBXaGVuIHRoZSBkZWNvbXByZXNzb3Igd2Fzbid0IGxvYWRlZCwgc2VsZWN0aW5nIGxhcmdlIGltYWdlIHNpemUKKyAgd291bGQgY3JlYXRlIHNrZXdlZCBvciBkb3VibGUgaW1hZ2VzLgorCis2LjMKKworKiBJbnRyb2R1Y2VkIHNwaW5sb2NrcyBmb3IgdGhlIGJ1ZmZlciBwb2ludGVyIG1hbmlwdWxhdGlvbjsgYSBudW1iZXIgb2YKKyAgcmVwb3J0cyBzZWVtIHRvIHN1Z2dlc3QgdGhlIGRvd24oKS91cCgpIHNlbWFwaG9yZXMgd2VyZSB0aGUgY2F1c2Ugb2YKKyAgbG9ja3Vwcywgc2luY2UgdGhleSBhcmUgbm90IHN1aXRhYmxlIGZvciBpbnRlcnJ1cHQvdXNlciBsb2NraW5nLgorKiBTZXBhcmF0ZWQgZGVjb21wcmVzc29yIGFuZCBjb3JlIGNvZGUgaW50byAyIG1vZHVsZXMuCisKKzYuMgorCisqIE5vbi1pbnRlZ3JhbCBpbWFnZSBzaXplcyBhcmUgbm93IHBhZGRlZCB3aXRoIGdyYXkgb3IgYmxhY2suCisqIEFkZGVkIFNIVVRURVJTUEVFRCBpb2N0bCgpLgorKiBGaXhlZCBidWdsZXQgaW4gVklESU9DUFdDU0FHQzsgdGhlIGZ1bmN0aW9uIHdvdWxkIGFsd2F5cyByZXR1cm4gYW4gZXJyb3IsCisgIGV2ZW4gdGhvdWdoIHRoZSBjYWxsIHN1Y2NlZWRlZC4KKyogQWRkZWQgaG90cGx1ZyBzdXBwb3J0IGZvciAyLjQuKi4KKyogTWVtb3J5OiB0aGUgNjQ1LzY0NiB1c2VzIGxlc3MgbWVtb3J5IG5vdy4KKworNi4xCisKKyogVklESU9DU1BJQ1QgcmV0dXJucyAtRUlOVkFMIHdpdGggaW52YWxpZCBwYWxldHRlcy4KKyogQWRkZWQgc2F0dXJhdGlvbiBjb250cm9sLgorKiBTcGxpdCBkZWNvbXByZXNzb3JzIGZyb20gcmVzdC4KKyogRml4ZWQgYnVnIHRoYXQgd291bGQgcmVzZXQgdGhlIGZyYW1lcmF0ZSB0byB0aGUgZGVmYXVsdCBmcmFtZXJhdGUgaWYgCisgIHRoZSByYXRlIGZpZWxkIHdhcyBzZXQgdG8gMCAod2hpY2ggaXMgbm90IHdoYXQgSSBpbnRlbmRlZCwgbmwuIGRvIG5vdCAKKyAgY2hhbmdlIHRoZSBmcmFtZXJhdGUhKS4KKyogVklESU9DUFdDU0NRVUFMIChzZXR0aW5nIGNvbXByZXNzaW9uIHF1YWxpdHkpIG5vdyB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuCisqIFdvcmthcm91bmQgZm9yIGEgYnVnIGluIHRoZSA3MzAgc2Vuc29yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL01ha2VmaWxlIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjQxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAoraWZuZXEgKCQoS0VSTkVMUkVMRUFTRSksKQorCitwd2Mtb2Jqcwk6PSBwd2MtaWYubyBwd2MtbWlzYy5vIHB3Yy1jdHJsLm8gcHdjLXVuY29tcHJlc3MubyBwd2MtZGVjMS5vIHB3Yy1kZWMyMy5vIHB3Yy1raWFyYS5vIHB3Yy10aW1vbi5vCisKK29iai0kKENPTkZJR19VU0JfUFdDKSArPSBwd2MubworCitlbHNlCisKK0tESVIgOj0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2J1aWxkCitQV0QgOj0gJChzaGVsbCBwd2QpCisKK2RlZmF1bHQ6CisJJChNQUtFKSAtQyAkKEtESVIpIFNVQkRJUlM9JChQV0QpIG1vZHVsZXMKKworZW5kaWYKKworY2xlYW46CisJcm0gLWYgKi5bb2FzXSAuKi5mbGFncyAqLmtvIC4qLmNtZCAuKi5kIC4qLnRtcCAqLm1vZC5jIAorCXJtIC1yZiAudG1wX3ZlcnNpb25zCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9waGlsaXBzLnR4dCBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9waGlsaXBzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE2NDBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3BoaWxpcHMudHh0CkBAIC0wLDAgKzEsMjM2IEBACitUaGlzIGZpbGUgY29udGFpbnMgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgUGhpbGlwcyBhbmQgT0VNIHdlYmNhbXMuCitFLW1haWw6IHdlYmNhbUBzbWNjLmRlbW9uLm5sICAgICAgICAgICAgICAgICAgICAgICAgTGFzdCB1cGRhdGVkOiAyMDA0LTAxLTE5CitTaXRlOiBodHRwOi8vd3d3LnNtY2MuZGVtb24ubmwvd2ViY2FtLworCitBcyBvZiB0aGlzIG1vbWVudCwgdGhlIGZvbGxvd2luZyBjYW1lcmFzIGFyZSBzdXBwb3J0ZWQ6CisgKiBQaGlsaXBzIFBDQTY0NQorICogUGhpbGlwcyBQQ0E2NDYKKyAqIFBoaWxpcHMgUENWQzY3NQorICogUGhpbGlwcyBQQ1ZDNjgwCisgKiBQaGlsaXBzIFBDVkM2OTAKKyAqIFBoaWxpcHMgUENWQzcyMC80MAorICogUGhpbGlwcyBQQ1ZDNzMwCisgKiBQaGlsaXBzIFBDVkM3NDAKKyAqIFBoaWxpcHMgUENWQzc1MAorICogQXNrZXkgVkMwMTAKKyAqIENyZWF0aXZlIExhYnMgV2ViY2FtIDUKKyAqIENyZWF0aXZlIExhYnMgV2ViY2FtIFBybyBFeAorICogTG9naXRlY2ggUXVpY2tDYW0gMzAwMCBQcm8KKyAqIExvZ2l0ZWNoIFF1aWNrQ2FtIDQwMDAgUHJvCisgKiBMb2dpdGVjaCBRdWlja0NhbSBOb3RlYm9vayBQcm8KKyAqIExvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20KKyAqIExvZ2l0ZWNoIFF1aWNrQ2FtIE9yYml0CisgKiBMb2dpdGVjaCBRdWlja0NhbSBTcGhlcmUKKyAqIFNhbXN1bmcgTVBDLUMxMAorICogU2Ftc3VuZyBNUEMtQzMwCisgKiBTb3RlYyBBZmluYSBFeWUKKyAqIEFNRSBDVS0wMDEKKyAqIFZpc2lvbml0ZSBWQ1MtVU0xMDAKKyAqIFZpc2lvbml0ZSBWQ1MtVUMzMDAKKworVGhlIG1haW4gd2VicGFnZSBmb3IgdGhlIFBoaWxpcHMgZHJpdmVyIGlzIGF0IHRoZSBhZGRyZXNzIGFib3ZlLiBJdCBjb250YWlucworYSBsb3Qgb2YgZXh0cmEgaW5mb3JtYXRpb24sIGEgRkFRLCBhbmQgdGhlIGJpbmFyeSBwbHVnaW4gJ1BXQ1gnLiBUaGlzIHBsdWdpbgorY29udGFpbnMgZGVjb21wcmVzc2lvbiByb3V0aW5lcyB0aGF0IGFsbG93IHlvdSB0byB1c2UgaGlnaGVyIGltYWdlIHNpemVzIGFuZAorZnJhbWVyYXRlczsgaW4gYWRkaXRpb24gdGhlIHdlYmNhbSB1c2VzIGxlc3MgYmFuZHdpZHRoIG9uIHRoZSBVU0IgYnVzIChoYW5keQoraWYgeW91IHdhbnQgdG8gcnVuIG1vcmUgdGhhbiAxIGNhbWVyYSBzaW11bHRhbmVvdXNseSkuIFRoZXNlIHJvdXRpbmVzIGZhbGwKK3VuZGVyIGEgTkRBLCBhbmQgbWF5IHRoZXJlZm9yIG5vdCBiZSBkaXN0cmlidXRlZCBhcyBzb3VyY2U7IGhvd2V2ZXIsIGl0cyB1c2UKK2lzIGNvbXBsZXRlbHkgb3B0aW9uYWwuCisKK1lvdSBjYW4gYnVpbGQgdGhpcyBjb2RlIGVpdGhlciBpbnRvIHlvdXIga2VybmVsLCBvciBhcyBhIG1vZHVsZS4gSSByZWNvbW1lbmQKK3RoZSBsYXR0ZXIsIHNpbmNlIGl0IG1ha2VzIHRyb3VibGVzaG9vdGluZyBhIGxvdCBlYXNpZXIuIFRoZSBidWlsdC1pbgorbWljcm9waG9uZSBpcyBzdXBwb3J0ZWQgdGhyb3VnaCB0aGUgVVNCIEF1ZGlvIGNsYXNzLgorCitXaGVuIHlvdSBsb2FkIHRoZSBtb2R1bGUgeW91IGNhbiBzZXQgc29tZSBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUKK2NhbWVyYTsgc29tZSBwcm9ncmFtcyBkZXBlbmQgb24gYSBwYXJ0aWN1bGFyIGltYWdlLXNpemUgb3IgLWZvcm1hdCBhbmQKK2Rvbid0IGtub3cgaG93IHRvIHNldCBpdCBwcm9wZXJseSBpbiB0aGUgZHJpdmVyLiBUaGUgb3B0aW9ucyBhcmU6CisKK3NpemUKKyAgIENhbiBiZSBvbmUgb2YgJ3NxY2lmJywgJ3FzaWYnLCAncWNpZicsICdzaWYnLCAnY2lmJyBvcgorICAgJ3ZnYScsIGZvciBhbiBpbWFnZSBzaXplIG9mIHJlc3AuIDEyOHg5NiwgMTYweDEyMCwgMTc2eDE0NCwKKyAgIDMyMHgyNDAsIDM1MngyODggYW5kIDY0MHg0ODAgKG9mIGNvdXJzZSwgb25seSBmb3IgdGhvc2UgY2FtZXJhcyB0aGF0IAorICAgc3VwcG9ydCB0aGVzZSByZXNvbHV0aW9ucykuCisKK2ZwcworICAgU3BlY2lmaWVzIHRoZSBkZXNpcmVkIGZyYW1lcmF0ZS4gSXMgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgNC0zMC4KKworZmJ1ZnMKKyAgIFRoaXMgcGFyYW10ZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgaW50ZXJuYWwgYnVmZmVycyB0byB1c2UgZm9yIHN0b3JpbmcgCisgICBmcmFtZXMgZnJvbSB0aGUgY2FtLiBUaGlzIHdpbGwgaGVscCBpZiB0aGUgcHJvY2VzcyB0aGF0IHJlYWRzIGltYWdlcyBmcm9tIAorICAgdGhlIGNhbSBpcyBhIGJpdCBzbG93IG9yIG1vbWVudGFyZWx5IGJ1c3kuIEhvd2V2ZXIsIG9uIHNsb3cgbWFjaGluZXMgaXQgCisgICBvbmx5IGludHJvZHVjZXMgbGFnLCBzbyBjaG9vc2UgY2FyZWZ1bGx5LiBUaGUgZGVmYXVsdCBpcyAzLCB3aGljaCBpcyAKKyAgIHJlYXNvbmFibGUuIFlvdSBjYW4gc2V0IGl0IGJldHdlZW4gMiBhbmQgNS4KKworbWJ1ZnMKKyAgIFRoaXMgaXMgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwLiBJdCB3aWxsIHRlbGwgdGhlIG1vZHVsZSB0aGUgbnVtYmVyIG9mCisgICBidWZmZXJzIHRvIHJlc2VydmUgZm9yIG1tYXAoKSwgVklESU9DQ0dNQlVGLCBWSURJT0NNQ0FQVFVSRSBhbmQgZnJpZW5kcy4KKyAgIFRoZSBkZWZhdWx0IGlzIDIsIHdoaWNoIGlzIGFkZXF1YXRlIGZvciBtb3N0IGFwcGxpY2F0aW9ucyAoZG91YmxlCisgICBidWZmZXJpbmcpLgorICAgICAgCisgICBTaG91bGQgeW91IGV4cGVyaWVuY2UgYSBsb3Qgb2YgJ0R1bXBpbmcgZnJhbWUuLi4nIG1lc3NhZ2VzIGR1cmluZworICAgZ3JhYmJpbmcgd2l0aCBhIHRvb2wgdGhhdCB1c2VzIG1tYXAoKSwgeW91IG1pZ2h0IHdhbnQgdG8gaW5jcmVhc2UgaWYuIAorICAgSG93ZXZlciwgaXQgZG9lc24ndCByZWFsbHkgYnVmZmVyIGltYWdlcywgaXQganVzdCBnaXZlcyB5b3UgYSBiaXQgbW9yZQorICAgc2xhY2sgd2hlbiB5b3VyIHByb2dyYW0gaXMgYmVoaW5kLiBCdXQgeW91IG5lZWQgYSBtdWx0aS10aHJlYWRlZCBvcgorICAgZm9ya2VkIHByb2dyYW0gdG8gcmVhbGx5IHRha2UgYWR2YW50YWdlIG9mIHRoZXNlIGJ1ZmZlcnMuCisKKyAgIFRoZSBhYnNvbHV0ZSBtYXhpbXVtIGlzIDEwLCBidXQgZG9uJ3Qgc2V0IGl0IHRvbyBoaWdoISAgRXZlcnkgYnVmZmVyIHRha2VzCisgICB1cCA0NjAgS0Igb2YgUkFNLCBzbyB1bmxlc3MgeW91IGhhdmUgYSBsb3Qgb2YgbWVtb3J5IHNldHRpbmcgdGhpcyB0bworICAgc29tZXRoaW5nIG1vcmUgdGhhbiA0IGlzIGFuIGFic29sdXRlIHdhc3RlLiAgVGhpcyBtZW1vcnkgaXMgb25seQorICAgYWxsb2NhdGVkIGR1cmluZyBvcGVuKCksIHNvIG5vdGhpbmcgaXMgd2FzdGVkIHdoZW4gdGhlIGNhbWVyYSBpcyBub3QgaW4KKyAgIHVzZS4KKworcG93ZXJfc2F2ZQorICAgV2hlbiBwb3dlcl9zYXZlIGlzIGVuYWJsZWQgKHNldCB0byAxKSwgdGhlIG1vZHVsZSB3aWxsIHRyeSB0byBzaHV0IGRvd24KKyAgIHRoZSBjYW0gb24gY2xvc2UoKSBhbmQgcmUtYWN0aXZhdGUgb24gb3BlbigpLiBUaGlzIHdpbGwgc2F2ZSBwb3dlciBhbmQKKyAgIHR1cm4gb2ZmIHRoZSBMRUQuIE5vdCBhbGwgY2FtZXJhcyBzdXBwb3J0IHRoaXMgdGhvdWdoICh0aGUgNjQ1IGFuZCA2NDYKKyAgIGRvbid0IGhhdmUgcG93ZXIgc2F2aW5nIGF0IGFsbCksIGFuZCBzb21lIG1vZGVscyBkb24ndCB3b3JrIGVpdGhlciAodGhleQorICAgd2lsbCBzaHV0IGRvd24sIGJ1dCBuZXZlciB3YWtlIHVwKS4gQ29uc2lkZXIgdGhpcyBleHBlcmltZW50YWwuIEJ5CisgICBkZWZhdWx0IHRoaXMgb3B0aW9uIGlzIGRpc2FibGVkLgorCitjb21wcmVzc2lvbiAob25seSB1c2VmdWwgd2l0aCB0aGUgcGx1Z2luKQorICAgV2l0aCB0aGlzIG9wdGlvbiB5b3UgY2FuIGNvbnRyb2wgdGhlIGNvbXByZXNzaW9uIGZhY3RvciB0aGF0IHRoZSBjYW1lcmEKKyAgIHVzZXMgdG8gc3F1ZWV6ZSB0aGUgaW1hZ2UgdGhyb3VnaCB0aGUgVVNCIGJ1cy4gWW91IGNhbiBzZXQgdGhlIAorICAgcGFyYW1ldGVyIGJldHdlZW4gMCBhbmQgMzoKKyAgICAgMCA9IHByZWZlciB1bmNvbXByZXNzZWQgaW1hZ2VzOyBpZiB0aGUgcmVxdWVzdGVkIG1vZGUgaXMgbm90IGF2YWlsYWJsZQorICAgICAgICAgaW4gYW4gdW5jb21wcmVzc2VkIGZvcm1hdCwgdGhlIGRyaXZlciB3aWxsIHNpbGVudGx5IHN3aXRjaCB0byBsb3cKKyAgICAgICAgIGNvbXByZXNzaW9uLgorICAgICAxID0gbG93IGNvbXByZXNzaW9uLgorICAgICAyID0gbWVkaXVtIGNvbXByZXNzaW9uLgorICAgICAzID0gaGlnaCBjb21wcmVzc2lvbi4KKyAgICAgIAorICAgSGlnaCBjb21wcmVzc2lvbiB0YWtlcyBsZXNzIGJhbmR3aWR0aCBvZiBjb3Vyc2UsIGJ1dCBpdCBjb3VsZCBhbHNvCisgICBpbnRyb2R1Y2Ugc29tZSB1bndhbnRlZCBhcnRlZmFjdHMuIFRoZSBkZWZhdWx0IGlzIDIsIG1lZGl1bSBjb21wcmVzc2lvbi4KKyAgIFNlZSB0aGUgRkFRIG9uIHRoZSB3ZWJzaXRlIGZvciBhbiBvdmVydmlldyBvZiB3aGljaCBtb2RlcyByZXF1aXJlCisgICBjb21wcmVzc2lvbi4KKworICAgVGhlIGNvbXByZXNzaW9uIHBhcmFtZXRlciBkb2VzIG5vdCBhcHBseSB0byB0aGUgNjQ1IGFuZCA2NDYgY2FtZXJhcworICAgYW5kIE9FTSBtb2RlbHMgZGVyaXZlZCBmcm9tIHRob3NlIChvbmx5IGEgZmV3KS4gTW9zdCBjYW1zIGhvbm91ciB0aGlzCisgICBwYXJhbWV0ZXIuCisKK2xlZHMKKyAgIFRoaXMgc2V0dGluZ3MgdGFrZXMgMiBpbnRlZ2VycywgdGhhdCBkZWZpbmUgdGhlIG9uL29mZiB0aW1lIGZvciB0aGUgTEVECisgICAoaW4gbWlsbGlzZWNvbmRzKS4gT25lIG9mIHRoZSBpbnRlcmVzdGluZyB0aGluZ3MgdGhhdCB5b3UgY2FuIGRvIHdpdGgKKyAgIHRoaXMgaXMgbGV0IHRoZSBMRUQgYmxpbmsgd2hpbGUgdGhlIGNhbWVyYSBpcyBpbiB1c2UuIFRoaXM6CisKKyAgICAgbGVkcz01MDAsNTAwCisgICAgICAKKyAgIHdpbGwgYmxpbmsgdGhlIExFRCBvbmNlIGV2ZXJ5IHNlY29uZC4gQnV0IHdpdGg6CisKKyAgICAgbGVkcz0wLDAKKworICAgdGhlIExFRCBuZXZlciBnb2VzIG9uLCBtYWtpbmcgaXQgc3VpdGFibGUgZm9yIHNpbGVudCBzdXJ2ZWlsbGFuY2UuCisKKyAgIEJ5IGRlZmF1bHQgdGhlIGNhbWVyYSdzIExFRCBpcyBvbiBzb2xpZCB3aGlsZSBpbiB1c2UsIGFuZCB0dXJuZWQgb2ZmCisgICB3aGVuIHRoZSBjYW1lcmEgaXMgbm90IHVzZWQgYW55bW9yZS4KKworICAgVGhpcyBwYXJhbWV0ZXIgd29ya3Mgb25seSB3aXRoIHRoZSBUb1VDYW0gcmFuZ2Ugb2YgY2FtZXJhcyAoNzIwLCA3MzAsIDc0MCwKKyAgIDc1MCkgYW5kIE9FTXMuIEZvciBvdGhlciBjYW1lcmFzIHRoaXMgY29tbWFuZCBpcyBzaWxlbnRseSBpZ25vcmVkLCBhbmQgCisgICB0aGUgTEVEIGNhbm5vdCBiZSBjb250cm9sbGVkLgorCisgICBGaW5hbGx5OiB0aGlzIHBhcmFtZXRlcnMgZG9lcyBub3QgdGFrZSBlZmZlY3QgVU5USUwgdGhlIGZpcnN0IHRpbWUgeW91CisgICBvcGVuIHRoZSBjYW1lcmEgZGV2aWNlLiBVbnRpbCB0aGVuLCB0aGUgTEVEIHJlbWFpbnMgb24uCisKK2Rldl9oaW50CisgICBBIGxvbmcgc3RhbmRpbmcgcHJvYmxlbSB3aXRoIFVTQiBkZXZpY2VzIGlzIHRoZWlyIGR5bmFtaWMgbmF0dXJlOiB5b3UKKyAgIG5ldmVyIGtub3cgd2hhdCBkZXZpY2UgYSBjYW1lcmEgZ2V0cyBhc3NpZ25lZDsgaXQgZGVwZW5kcyBvbiBtb2R1bGUgbG9hZAorICAgb3JkZXIsIHRoZSBodWIgY29uZmlndXJhdGlvbiwgdGhlIG9yZGVyIGluIHdoaWNoIGRldmljZXMgYXJlIHBsdWdnZWQgaW4sCisgICBhbmQgdGhlIHBoYXNlIG9mIHRoZSBtb29uIChpLmUuIGl0IGNhbiBiZSByYW5kb20pLiBXaXRoIHRoaXMgb3B0aW9uIHlvdQorICAgY2FuIGdpdmUgdGhlIGRyaXZlciBhIGhpbnQgYXMgdG8gd2hhdCB2aWRlbyBkZXZpY2Ugbm9kZSAoL2Rldi92aWRlb1gpIGl0CisgICBzaG91bGQgdXNlIHdpdGggYSBzcGVjaWZpYyBjYW1lcmEuIFRoaXMgaXMgYWxzbyBoYW5keSBpZiB5b3UgaGF2ZSB0d28KKyAgIGNhbWVyYXMgb2YgdGhlIHNhbWUgbW9kZWwuCisKKyAgIEEgY2FtZXJhIGlzIHNwZWNpZmllZCBieSBpdHMgdHlwZSAodGhlIG51bWJlciBmcm9tIHRoZSBjYW1lcmEgbW9kZWwsCisgICBsaWtlIFBDQTY0NSwgUENWQzc1MFZDLCBldGMpIGFuZCBvcHRpb25hbGx5IHRoZSBzZXJpYWwgbnVtYmVyICh2aXNpYmxlCisgICBpbiAvcHJvYy9idXMvdXNiL2RldmljZXMpLiBBIGhpbnQgY29uc2lzdHMgb2YgYSBzdHJpbmcgd2l0aCB0aGUgZm9sbG93aW5nCisgICBmb3JtYXQ6CisKKyAgICAgIFt0eXBlWy5zZXJpYWxudW1iZXJdOl1ub2RlCisgICAgICAKKyAgIFRoZSBzcXVhcmUgYnJhY2tldHMgbWVhbiB0aGF0IGJvdGggdGhlIHR5cGUgYW5kIHRoZSBzZXJpYWxudW1iZXIgYXJlCisgICBvcHRpb25hbCwgYnV0IGEgc2VyaWFsbnVtYmVyIGNhbm5vdCBiZSBzcGVjaWZpZWQgd2l0aG91dCBhIHR5cGUgKHdoaWNoCisgICB3b3VsZCBiZSByYXRoZXIgcG9pbnRsZXNzKS4gVGhlIHNlcmlhbG51bWJlciBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgdHlwZQorICAgYnkgYSAnLic7IHRoZSBub2RlIG51bWJlciBieSBhICc6Jy4KKyAgIAorICAgVGhpcyBzb21ld2hhdCBjcnlwdGljIHN5bnRheCBpcyBiZXN0IGV4cGxhaW5lZCBieSBhIGZldyBleGFtcGxlczoKKworICAgICBkZXZfaGludD0zLDUgICAgICAgICAgICAgIFRoZSBmaXJzdCBkZXRlY3RlZCBjYW0gZ2V0cyBhc3NpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9kZXYvdmlkZW8zLCB0aGUgc2Vjb25kIC9kZXYvdmlkZW81LiBBbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBjYW1lcmFzIHdpbGwgZ2V0IHRoZSBmaXJzdCBmcmVlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBzbG90IChzZWUgYmVsb3cpLgorCisgICAgIGRldl9oaW50PTY0NToxLDY4MDoyICAgICAgVGhlIFBDQTY0NSBjYW1lcmEgd2lsbCBnZXQgL2Rldi92aWRlbzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGEgUENWQzY4MCAvZGV2L3ZpZGVvMi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgZGV2X2hpbnQ9NjQ1LjAxMjM6Myw2NDUuNDU2NzowCVRoZSBQQ0E2NDUgY2FtZXJhIHdpdGggc2VyaWFsbnVtYmVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxMjMgZ29lcyB0byAvZGV2L3ZpZGVvMywgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEgbW9kZWwgd2l0aCB0aGUgNDU2NyBzZXJpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRzIC9kZXYvdmlkZW8wLgorCisgICAgIGRldl9oaW50PTc1MDoxLDQsNSw2ICAgICAgIFRoZSBQQ1ZDNzUwIGNhbWVyYSB3aWxsIGdldCAvZGV2L3ZpZGVvMSwgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IDMgUGhpbGlwcyBjYW1zIHdpbGwgdXNlIC9kZXYvdmlkZW80IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIC9kZXYvdmlkZW82LgorCisgICBTb21lIHBvaW50cyB3b3J0aCBrbm93aW5nOgorICAgLSBTZXJpYWxudW1iZXJzIGFyZSBjYXNlIHNlbnNpdGl2ZSBhbmQgbXVzdCBiZSB3cml0dGVuIGZ1bGwsIGluY2x1ZGluZyAKKyAgICAgbGVhZGluZyB6ZXJvZXMgKGl0J3MgdHJlYXRlZCBhcyBhIHN0cmluZykuCisgICAtIElmIGEgZGV2aWNlIG5vZGUgaXMgYWxyZWFkeSBvY2N1cGllZCwgcmVnaXN0cmF0aW9uIHdpbGwgZmFpbCBhbmQgCisgICAgIHRoZSB3ZWJjYW0gaXMgbm90IGF2YWlsYWJsZS4KKyAgIC0gWW91IGNhbiBoYXZlIHVwIHRvIDY0IHZpZGVvIGRldmljZXM7IGJlIHN1cmUgdG8gbWFrZSBlbm91Z2ggZGV2aWNlCisgICAgIG5vZGVzIGluIC9kZXYgaWYgeW91IHdhbnQgdG8gc3ByZWFkIHRoZSBudW1iZXJzICh0aGlzIGRvZXMgbm90IGFwcGx5CisgICAgIHRvIGRldmZzKS4gQWZ0ZXIgL2Rldi92aWRlbzkgY29tZXMgL2Rldi92aWRlbzEwIChub3QgL2Rldi92aWRlb0EpLgorICAgLSBJZiBhIGNhbWVyYSBkb2VzIG5vdCBtYXRjaCBhbnkgZGV2X2hpbnQsIGl0IHdpbGwgc2ltcGx5IGdldCBhc3NpZ25lZAorICAgICB0aGUgZmlyc3QgYXZhaWxhYmxlIGRldmljZSBub2RlLCBqdXN0IGFzIGl0IHVzZWQgdG8gYmUuCisKK3RyYWNlCisgICBJbiBvcmRlciB0byBiZXR0ZXIgZGV0ZWN0IHByb2JsZW1zLCBpdCBpcyBub3cgcG9zc2libGUgdG8gdHVybiBvbiBhCisgICAndHJhY2UnIG9mIHNvbWUgb2YgdGhlIGNhbGxzIHRoZSBtb2R1bGUgbWFrZXM7IGl0IGxvZ3MgYWxsIGl0ZW1zIGluIHlvdXIKKyAgIGtlcm5lbCBsb2cgYXQgZGVidWcgbGV2ZWwuCisKKyAgIFRoZSB0cmFjZSB2YXJpYWJsZSBpcyBhIGJpdG1hc2s7IGVhY2ggYml0IHJlcHJlc2VudHMgYSBjZXJ0YWluIGZlYXR1cmUuCisgICBJZiB5b3Ugd2FudCB0byB0cmFjZSBzb21ldGhpbmcsIGxvb2sgdXAgdGhlIGJpdCB2YWx1ZShzKSBpbiB0aGUgdGFibGUgCisgICBiZWxvdywgYWRkIHRoZSB2YWx1ZXMgdG9nZXRoZXIgYW5kIHN1cHBseSB0aGF0IHRvIHRoZSB0cmFjZSB2YXJpYWJsZS4KKworICAgVmFsdWUgIFZhbHVlICAgRGVzY3JpcHRpb24JCQkJCSAgIERlZmF1bHQKKyAgIChkZWMpICAoaGV4KQorICAgICAgIDEgICAgMHgxICAgTW9kdWxlIGluaXRpYWxpemF0aW9uOyB0aGlzIHdpbGwgbG9nIG1lc3NhZ2VzICAgICAgIE9uCisgICAgICAgICAgICAgICAgICB3aGlsZSBsb2FkaW5nIGFuZCB1bmxvYWRpbmcgdGhlIG1vZHVsZQorCisgICAgICAgMiAgICAweDIgICBwcm9iZSgpIGFuZCBkaXNjb25uZWN0KCkgdHJhY2VzICAgICAgICAgICAgICAgICAgICAgT24KKworICAgICAgIDQgICAgMHg0ICAgVHJhY2Ugb3BlbigpIGFuZCBjbG9zZSgpIGNhbGxzICAgICAgICAgICAgICAgICAgICAgIE9mZgorCisgICAgICAgOCAgICAweDggICByZWFkKCksIG1tYXAoKSBhbmQgYXNzb2NpYXRlZCBpb2N0bCgpIGNhbGxzICAgICAgICAgT2ZmCisKKyAgICAgIDE2ICAgMHgxMCAgIE1lbW9yeSBhbGxvY2F0aW9uIG9mIGJ1ZmZlcnMsIGV0Yy4gICAgICAgICAgICAgICAgICBPZmYKKworICAgICAgMzIgICAweDIwICAgU2hvd2luZyB1bmRlcmZsb3csIG92ZXJmbG93IGFuZCBEdW1waW5nIGZyYW1lICAgICAgIE9uCisgICAgICAgICAgICAgICAgICBtZXNzYWdlcworCisgICAgICA2NCAgIDB4NDAgICBTaG93IHZpZXdwb3J0IGFuZCBpbWFnZSBzaXplcyAgICAgICAgICAgICAgICAgICAgICAgT2ZmCisKKyAgICAgMTI4ICAgMHg4MCAgIFBXQ1ggZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmYKKworICAgRm9yIGV4YW1wbGUsIHRvIHRyYWNlIHRoZSBvcGVuKCkgJiByZWFkKCkgZnVjdGlvbnMsIHN1bSA4ICsgNCA9IDEyLAorICAgc28geW91IHdvdWxkIHN1cHBseSB0cmFjZT0xMiBkdXJpbmcgaW5zbW9kIG9yIG1vZHByb2JlLiBJZgorICAgeW91IHdhbnQgdG8gdHVybiB0aGUgaW5pdGlhbGl6YXRpb24gYW5kIHByb2JpbmcgdHJhY2luZyBvZmYsIHNldCB0cmFjZT0wLgorICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRyYWNlIGlzIDM1ICgweDIzKS4KKworCisKK0V4YW1wbGU6CisgICAgIAorICAgICAjIG1vZHByb2JlIHB3YyBzaXplPWNpZiBmcHM9MTUgcG93ZXJfc2F2ZT0xCisKK1RoZSBmYnVmcywgbWJ1ZnMgYW5kIHRyYWNlIHBhcmFtZXRlcnMgYXJlIGdsb2JhbCBhbmQgYXBwbHkgdG8gYWxsIGNvbm5lY3RlZAorY2FtZXJhcy4gRWFjaCBjYW1lcmEgaGFzIGl0cyBvd24gc2V0IG9mIGJ1ZmZlcnMuCisKK3NpemUgYW5kIGZwcyBvbmx5IHNwZWNpZnkgZGVmYXVsdHMgd2hlbiB5b3Ugb3BlbigpIHRoZSBkZXZpY2U7IHRoaXMgaXMgdG8KK2FjY29tbW9kYXRlIHNvbWUgdG9vbHMgdGhhdCBkb24ndCBzZXQgdGhlIHNpemUuIFlvdSBjYW4gY2hhbmdlIHRoZXNlCitzZXR0aW5ncyBhZnRlciBvcGVuKCkgd2l0aCB0aGUgVmlkZW80TGludXggaW9jdGwoKSBjYWxscy4gVGhlIGRlZmF1bHQgb2YKK2RlZmF1bHRzIGlzIFFDSUYgc2l6ZSBhdCAxMCBmcHMuCisKK1RoZSBjb21wcmVzc2lvbiBwYXJhbWV0ZXIgaXMgc2VtaWdsb2JhbDsgaXQgc2V0cyB0aGUgaW5pdGlhbCBjb21wcmVzc2lvbgorcHJlZmVyZW5jZSBmb3IgYWxsIGNhbWVyYSdzLCBidXQgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCBwZXIgY2FtZXJhIHdpdGgKK3RoZSBWSURJT0NQV0NTQ1FVQUwgaW9jdGwoKSBjYWxsLgorCitBbGwgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtY3RybC5jIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhYTkxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtY3RybC5jCkBAIC0wLDAgKzEsMTYzMCBAQAorLyogRHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgRnVuY3Rpb25zIHRoYXQgc2VuZCB2YXJpb3VzIGNvbnRyb2wgbWVzc2FnZXMgdG8gdGhlIHdlYmNhbSwgaW5jbHVkaW5nCisgICB2aWRlbyBtb2Rlcy4KKyAgIChDKSAxOTk5LTIwMDMgTmVtb3NvZnQgVW52LgorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisvKgorICAgQ2hhbmdlcworICAgMjAwMS8wOC8wMyAgQWx2YXJhZG8gICBBZGRlZCBtZXRob2RzIGZvciBjaGFuZ2luZyB3aGl0ZSBiYWxhbmNlIGFuZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkL2dyZWVuIGdhaW5zCisgKi8KKworLyogQ29udHJvbCBmdW5jdGlvbnMgZm9yIHRoZSBjYW07IGJyaWdodG5lc3MsIGNvbnRyYXN0LCB2aWRlbyBtb2RlLCBldGMuICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4gCisjZW5kaWYKKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisgCisjaW5jbHVkZSAicHdjLmgiCisjaW5jbHVkZSAicHdjLWlvY3RsLmgiCisjaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKKyNpbmNsdWRlICJwd2Mta2lhcmEuaCIKKyNpbmNsdWRlICJwd2MtdGltb24uaCIKKyNpbmNsdWRlICJwd2MtZGVjMS5oIgorI2luY2x1ZGUgInB3Yy1kZWMyMy5oIgorCisvKiBSZXF1ZXN0IHR5cGVzOiB2aWRlbyAqLworI2RlZmluZSBTRVRfTFVNX0NUTAkJCTB4MDEKKyNkZWZpbmUgR0VUX0xVTV9DVEwJCQkweDAyCisjZGVmaW5lIFNFVF9DSFJPTV9DVEwJCQkweDAzCisjZGVmaW5lIEdFVF9DSFJPTV9DVEwJCQkweDA0CisjZGVmaW5lIFNFVF9TVEFUVVNfQ1RMCQkJMHgwNQorI2RlZmluZSBHRVRfU1RBVFVTX0NUTAkJCTB4MDYKKyNkZWZpbmUgU0VUX0VQX1NUUkVBTV9DVEwJCTB4MDcKKyNkZWZpbmUgR0VUX0VQX1NUUkVBTV9DVEwJCTB4MDgKKyNkZWZpbmUgU0VUX01QVF9DVEwJCQkweDBECisjZGVmaW5lIEdFVF9NUFRfQ1RMCQkJMHgwRQorCisvKiBTZWxlY3RvcnMgZm9yIHRoZSBMdW1pbmFuY2UgY29udHJvbHMgW0dTXUVUX0xVTV9DVEwgKi8KKyNkZWZpbmUgQUdDX01PREVfRk9STUFUVEVSCQkJMHgyMDAwCisjZGVmaW5lIFBSRVNFVF9BR0NfRk9STUFUVEVSCQkJMHgyMTAwCisjZGVmaW5lIFNIVVRURVJfTU9ERV9GT1JNQVRURVIJCQkweDIyMDAKKyNkZWZpbmUgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSCQkweDIzMDAKKyNkZWZpbmUgUFJFU0VUX0NPTlRPVVJfRk9STUFUVEVSCQkweDI0MDAKKyNkZWZpbmUgQVVUT19DT05UT1VSX0ZPUk1BVFRFUgkJCTB4MjUwMAorI2RlZmluZSBCQUNLX0xJR0hUX0NPTVBFTlNBVElPTl9GT1JNQVRURVIJMHgyNjAwCisjZGVmaW5lIENPTlRSQVNUX0ZPUk1BVFRFUgkJCTB4MjcwMAorI2RlZmluZSBEWU5BTUlDX05PSVNFX0NPTlRST0xfRk9STUFUVEVSCQkweDI4MDAKKyNkZWZpbmUgRkxJQ0tFUkxFU1NfTU9ERV9GT1JNQVRURVIJCTB4MjkwMAorI2RlZmluZSBBRV9DT05UUk9MX1NQRUVECQkJMHgyQTAwCisjZGVmaW5lIEJSSUdIVE5FU1NfRk9STUFUVEVSCQkJMHgyQjAwCisjZGVmaW5lIEdBTU1BX0ZPUk1BVFRFUgkJCQkweDJDMDAKKworLyogU2VsZWN0b3JzIGZvciB0aGUgQ2hyb21pbmFuY2UgY29udHJvbHMgW0dTXUVUX0NIUk9NX0NUTCAqLworI2RlZmluZSBXQl9NT0RFX0ZPUk1BVFRFUgkJCTB4MTAwMAorI2RlZmluZSBBV0JfQ09OVFJPTF9TUEVFRF9GT1JNQVRURVIJCTB4MTEwMAorI2RlZmluZSBBV0JfQ09OVFJPTF9ERUxBWV9GT1JNQVRURVIJCTB4MTIwMAorI2RlZmluZSBQUkVTRVRfTUFOVUFMX1JFRF9HQUlOX0ZPUk1BVFRFUgkweDEzMDAKKyNkZWZpbmUgUFJFU0VUX01BTlVBTF9CTFVFX0dBSU5fRk9STUFUVEVSCTB4MTQwMAorI2RlZmluZSBDT0xPVVJfTU9ERV9GT1JNQVRURVIJCQkweDE1MDAKKyNkZWZpbmUgU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjEJCTB4MTYwMAorI2RlZmluZSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMgkJMHgxNzAwCisKKy8qIFNlbGVjdG9ycyBmb3IgdGhlIFN0YXR1cyBjb250cm9scyBbR1NdRVRfU1RBVFVTX0NUTCAqLworI2RlZmluZSBTQVZFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSCQkweDAyMDAKKyNkZWZpbmUgUkVTVE9SRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUgkJMHgwMzAwCisjZGVmaW5lIFJFU1RPUkVfRkFDVE9SWV9ERUZBVUxUU19GT1JNQVRURVIJMHgwNDAwCisjZGVmaW5lIFJFQURfQUdDX0ZPUk1BVFRFUgkJCTB4MDUwMAorI2RlZmluZSBSRUFEX1NIVVRURVJfRk9STUFUVEVSCQkJMHgwNjAwCisjZGVmaW5lIFJFQURfUkVEX0dBSU5fRk9STUFUVEVSCQkJMHgwNzAwCisjZGVmaW5lIFJFQURfQkxVRV9HQUlOX0ZPUk1BVFRFUgkJMHgwODAwCisjZGVmaW5lIFNFTlNPUl9UWVBFX0ZPUk1BVFRFUjEJCQkweDBDMDAKKyNkZWZpbmUgUkVBRF9SQVdfWV9NRUFOX0ZPUk1BVFRFUgkJMHgzMTAwCisjZGVmaW5lIFNFVF9QT1dFUl9TQVZFX01PREVfRk9STUFUVEVSCQkweDMyMDAKKyNkZWZpbmUgTUlSUk9SX0lNQUdFX0ZPUk1BVFRFUgkJCTB4MzMwMAorI2RlZmluZSBMRURfRk9STUFUVEVSCQkJCTB4MzQwMAorI2RlZmluZSBTRU5TT1JfVFlQRV9GT1JNQVRURVIyCQkJMHgzNzAwCisKKy8qIEZvcm1hdHRlcnMgZm9yIHRoZSBWaWRlbyBFbmRwb2ludCBjb250cm9scyBbR1NdRVRfRVBfU1RSRUFNX0NUTCAqLworI2RlZmluZSBWSURFT19PVVRQVVRfQ09OVFJPTF9GT1JNQVRURVIJCTB4MDEwMAorCisvKiBGb3JtYXR0ZXJzIGZvciB0aGUgbW90b3JpemVkIHBhbiAmIHRpbHQgW0dTXUVUX01QVF9DVEwgKi8KKyNkZWZpbmUgUFRfUkVMQVRJVkVfQ09OVFJPTF9GT1JNQVRURVIJCTB4MDEKKyNkZWZpbmUgUFRfUkVTRVRfQ09OVFJPTF9GT1JNQVRURVIJCTB4MDIKKyNkZWZpbmUgUFRfU1RBVFVTX0ZPUk1BVFRFUgkJCTB4MDMKKworc3RhdGljIGNoYXIgKnNpemUybmFtZVtQU1pfTUFYXSA9Cit7CisJInN1YlFDSUYiLAorCSJRU0lGIiwKKwkiUUNJRiIsCisJIlNJRiIsCisJIkNJRiIsCisJIlZHQSIsCit9OyAgCisKKy8qKioqKioqKi8KKworLyogRW50cmllcyBmb3IgdGhlIE5hbGEgKDY0NS82NDYpIGNhbWVyYTsgdGhlIE5hbGEgZG9lc24ndCBoYXZlIGNvbXByZXNzaW9uIAorICAgcHJlZmVyZW5jZXMsIHNvIHlvdSBlaXRoZXIgZ2V0IGNvbXByZXNzZWQgb3Igbm9uLWNvbXByZXNzZWQgc3RyZWFtcy4KKyAgIAorICAgQW4gYWx0ZXJuYXRlIHZhbHVlIG9mIDAgbWVhbnMgdGhpcyBtb2RlIGlzIG5vdCBhdmFpbGFibGUgYXQgYWxsLgorICovCisKK3N0cnVjdCBOYWxhX3RhYmxlX2VudHJ5IHsKKwljaGFyIGFsdGVybmF0ZTsJCQkvKiBVU0IgYWx0ZXJuYXRlIHNldHRpbmcgKi8KKwlpbnQgY29tcHJlc3NlZDsJCQkvKiBDb21wcmVzc2VkIHllcy9ubyAqLworCisJdW5zaWduZWQgY2hhciBtb2RlWzNdOwkJLyogcHJlY29tcHV0ZWQgbW9kZSB0YWJsZSAqLworfTsKKworc3RhdGljIHN0cnVjdCBOYWxhX3RhYmxlX2VudHJ5IE5hbGFfdGFibGVbUFNaX01BWF1bOF0gPQoreworI2luY2x1ZGUgInB3Yy1uYWxhLmgiCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgU2VuZENvbnRyb2xNc2cocmVxdWVzdCwgdmFsdWUsIGJ1ZmxlbikgXAorCXVzYl9jb250cm9sX21zZyhwZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUocGRldi0+dWRldiwgMCksIFwKKwkJcmVxdWVzdCwgXAorCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsIFwKKwkJdmFsdWUsIFwKKwkJcGRldi0+dmNpbnRlcmZhY2UsIFwKKwkJJmJ1ZiwgYnVmbGVuLCA1MDApCisKKyNkZWZpbmUgUmVjdkNvbnRyb2xNc2cocmVxdWVzdCwgdmFsdWUsIGJ1ZmxlbikgXAorCXVzYl9jb250cm9sX21zZyhwZGV2LT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUocGRldi0+dWRldiwgMCksIFwKKwkJcmVxdWVzdCwgXAorCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwgXAorCQl2YWx1ZSwgXAorCQlwZGV2LT52Y2ludGVyZmFjZSwgXAorCQkmYnVmLCBidWZsZW4sIDUwMCkKKworCisjaWYgUFdDX0RFQlVHCit2b2lkIHB3Y19oZXhkdW1wKHZvaWQgKnAsIGludCBsZW4pCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqczsKKwljaGFyIGJ1ZlsxMDBdLCAqZDsKKworCXMgPSAodW5zaWduZWQgY2hhciAqKXA7CisJZCA9IGJ1ZjsKKwkqZCA9ICdcMCc7CisJRGVidWcoIkRvaW5nIGhleGR1bXAgQCAlcCwgJWQgYnl0ZXMuXG4iLCBwLCBsZW4pOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlkICs9IHNwcmludGYoZCwgIiUwMlggIiwgKnMrKyk7CisJCWlmICgoaSAmIDB4RikgPT0gMHhGKSB7CisJCQlEZWJ1ZygiJXNcbiIsIGJ1Zik7CisJCQlkID0gYnVmOworCQkJKmQgPSAnXDAnOworCQl9CisJfQorCWlmICgoaSAmIDB4RikgIT0gMCkKKwkJRGVidWcoIiVzXG4iLCBidWYpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IHNlbmRfdmlkZW9fY29tbWFuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IGluZGV4LCB2b2lkICpidWYsIGludCBidWZsZW4pCit7CisJcmV0dXJuIHVzYl9jb250cm9sX21zZyh1ZGV2LAorCQl1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCVNFVF9FUF9TVFJFQU1fQ1RMLAorCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCVZJREVPX09VVFBVVF9DT05UUk9MX0ZPUk1BVFRFUiwKKwkJaW5kZXgsCisJCWJ1ZiwgYnVmbGVuLCAxMDAwKTsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgaW50IHNldF92aWRlb19tb2RlX05hbGEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzaXplLCBpbnQgZnJhbWVzKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzNdOworCWludCByZXQsIGZwczsKKwlzdHJ1Y3QgTmFsYV90YWJsZV9lbnRyeSAqcEVudHJ5OworCWludCBmcmFtZXMyZnJhbWVzWzMxXSA9CisJeyAvKiBjbG9zZXN0IG1hdGNoIG9mIGZyYW1lcmF0ZSAqLworCSAgIDAsICAwLCAgMCwgIDAsICA0LCAgLyogIDAtNCAgKi8KKwkgICA1LCAgNSwgIDcsICA3LCAxMCwgIC8qICA1LTkgICovCisgICAgICAgICAgMTAsIDEwLCAxMiwgMTIsIDE1LCAgLyogMTAtMTQgKi8KKyAgICAgICAgICAxNSwgMTUsIDE1LCAyMCwgMjAsICAvKiAxNS0xOSAqLworICAgICAgICAgIDIwLCAyMCwgMjAsIDI0LCAyNCwgIC8qIDIwLTI0ICovCisgICAgICAgICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAgLyogMjUtMjkgKi8KKyAgICAgICAgICAyNCAgICAgICAgICAgICAgICAgICAvKiAzMCAgICAqLworCX07CisJaW50IGZyYW1lczJ0YWJsZVszMV0gPSAKKwl7IDAsIDAsIDAsIDAsIDAsIC8qICAwLTQgICovCisJICAxLCAxLCAxLCAyLCAyLCAvKiAgNS05ICAqLworCSAgMywgMywgNCwgNCwgNCwgLyogMTAtMTQgKi8KKwkgIDUsIDUsIDUsIDUsIDUsIC8qIDE1LTE5ICovCisJICA2LCA2LCA2LCA2LCA3LCAvKiAyMC0yNCAqLworCSAgNywgNywgNywgNywgNywgLyogMjUtMjkgKi8KKwkgIDcgICAgICAgICAgICAgIC8qIDMwICAgICovCisJfTsKKwkKKwlpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+IFBTWl9DSUYgfHwgZnJhbWVzIDwgNCB8fCBmcmFtZXMgPiAyNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZnJhbWVzID0gZnJhbWVzMmZyYW1lc1tmcmFtZXNdOworCWZwcyA9IGZyYW1lczJ0YWJsZVtmcmFtZXNdOworCXBFbnRyeSA9ICZOYWxhX3RhYmxlW3NpemVdW2Zwc107CisJaWYgKHBFbnRyeS0+YWx0ZXJuYXRlID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBFbnRyeS0+Y29tcHJlc3NlZCkKKwkJcmV0dXJuIC1FTk9FTlQ7IC8qIE5vdCBzdXBwb3J0ZWQuICovCisKKwltZW1jcHkoYnVmLCBwRW50cnktPm1vZGUsIDMpOwkKKwlyZXQgPSBzZW5kX3ZpZGVvX2NvbW1hbmQocGRldi0+dWRldiwgcGRldi0+dmVuZHBvaW50LCBidWYsIDMpOworCWlmIChyZXQgPCAwKSB7CisJCURlYnVnKCJGYWlsZWQgdG8gc2VuZCB2aWRlbyBjb21tYW5kLi4uICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAocEVudHJ5LT5jb21wcmVzc2VkICYmIHBkZXYtPnZwYWxldHRlICE9IFZJREVPX1BBTEVUVEVfUkFXKQorCSB7CisJICAgc3dpdGNoKHBkZXYtPnR5cGUpIHsKKwkgICAgIGNhc2UgNjQ1OgorCSAgICAgY2FzZSA2NDY6CisJICAgICAgIHB3Y19kZWMxX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOworCSAgICAgICBicmVhazsKKworCSAgICAgY2FzZSA2NzU6CisJICAgICBjYXNlIDY4MDoKKwkgICAgIGNhc2UgNjkwOgorCSAgICAgY2FzZSA3MjA6CisJICAgICBjYXNlIDczMDoKKwkgICAgIGNhc2UgNzQwOgorCSAgICAgY2FzZSA3NTA6CisJICAgICAgIHB3Y19kZWMyM19pbml0KHBkZXYtPnR5cGUsIHBkZXYtPnJlbGVhc2UsIGJ1ZiwgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKKwkgICAgICAgYnJlYWs7CisJICAgfQorCX0KKyAKKwlwZGV2LT5jbWRfbGVuID0gMzsKKwltZW1jcHkocGRldi0+Y21kX2J1ZiwgYnVmLCAzKTsKKworCS8qIFNldCB2YXJpb3VzIHBhcmFtZXRlcnMgKi8KKwlwZGV2LT52ZnJhbWVzID0gZnJhbWVzOworCXBkZXYtPnZzaXplID0gc2l6ZTsKKwlwZGV2LT52YWx0ZXJuYXRlID0gcEVudHJ5LT5hbHRlcm5hdGU7CisJcGRldi0+aW1hZ2UgPSBwd2NfaW1hZ2Vfc2l6ZXNbc2l6ZV07CisJcGRldi0+ZnJhbWVfc2l6ZSA9IChwZGV2LT5pbWFnZS54ICogcGRldi0+aW1hZ2UueSAqIDMpIC8gMjsKKwlpZiAocEVudHJ5LT5jb21wcmVzc2VkKSB7CisJCWlmIChwZGV2LT5yZWxlYXNlIDwgNSkgeyAvKiA0IGZvbGQgY29tcHJlc3Npb24gKi8KKwkJCXBkZXYtPnZiYW5kbGVuZ3RoID0gNTI4OworCQkJcGRldi0+ZnJhbWVfc2l6ZSAvPSA0OworCQl9CisJCWVsc2UgeworCQkJcGRldi0+dmJhbmRsZW5ndGggPSA3MDQ7CisJCQlwZGV2LT5mcmFtZV9zaXplIC89IDM7CisJCX0KKwl9CisJZWxzZQorCQlwZGV2LT52YmFuZGxlbmd0aCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgc2V0X3ZpZGVvX21vZGVfVGltb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzaXplLCBpbnQgZnJhbWVzLCBpbnQgY29tcHJlc3Npb24sIGludCBzbmFwc2hvdCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxM107CisJY29uc3Qgc3RydWN0IFRpbW9uX3RhYmxlX2VudHJ5ICpwQ2hvb3NlOworCWludCByZXQsIGZwczsKKworCWlmIChzaXplID49IFBTWl9NQVggfHwgZnJhbWVzIDwgNSB8fCBmcmFtZXMgPiAzMCB8fCBjb21wcmVzc2lvbiA8IDAgfHwgY29tcHJlc3Npb24gPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2l6ZSA9PSBQU1pfVkdBICYmIGZyYW1lcyA+IDE1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmcHMgPSAoZnJhbWVzIC8gNSkgLSAxOworCisJLyogRmluZCBhIHN1cHBvcnRlZCBmcmFtZXJhdGUgd2l0aCBwcm9ncmVzc2l2ZWx5IGhpZ2hlciBjb21wcmVzc2lvbiByYXRpb3MKKwkgICBpZiB0aGUgcHJlZmVycmVkIHJhdGlvIGlzIG5vdCBhdmFpbGFibGUuCisJKi8KKwlwQ2hvb3NlID0gTlVMTDsKKwl3aGlsZSAoY29tcHJlc3Npb24gPD0gMykgeworCSAgIHBDaG9vc2UgPSAmVGltb25fdGFibGVbc2l6ZV1bZnBzXVtjb21wcmVzc2lvbl07CisJICAgaWYgKHBDaG9vc2UtPmFsdGVybmF0ZSAhPSAwKQorCSAgICAgYnJlYWs7CisJICAgY29tcHJlc3Npb24rKzsKKwl9CisJaWYgKHBDaG9vc2UgPT0gTlVMTCB8fCBwQ2hvb3NlLT5hbHRlcm5hdGUgPT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7IC8qIE5vdCBzdXBwb3J0ZWQuICovCisKKwltZW1jcHkoYnVmLCBwQ2hvb3NlLT5tb2RlLCAxMyk7CisJaWYgKHNuYXBzaG90KQorCQlidWZbMF0gfD0gMHg4MDsKKwlyZXQgPSBzZW5kX3ZpZGVvX2NvbW1hbmQocGRldi0+dWRldiwgcGRldi0+dmVuZHBvaW50LCBidWYsIDEzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCAmJiBwZGV2LT52cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JBVykKKwkgICBwd2NfZGVjMjNfaW5pdChwZGV2LT50eXBlLCBwZGV2LT5yZWxlYXNlLCBidWYsIHBkZXYtPmRlY29tcHJlc3NfZGF0YSk7CisKKwlwZGV2LT5jbWRfbGVuID0gMTM7CisJbWVtY3B5KHBkZXYtPmNtZF9idWYsIGJ1ZiwgMTMpOworCisJLyogU2V0IHZhcmlvdXMgcGFyYW1ldGVycyAqLworCXBkZXYtPnZmcmFtZXMgPSBmcmFtZXM7CisJcGRldi0+dnNpemUgPSBzaXplOworCXBkZXYtPnZzbmFwc2hvdCA9IHNuYXBzaG90OworCXBkZXYtPnZhbHRlcm5hdGUgPSBwQ2hvb3NlLT5hbHRlcm5hdGU7CisJcGRldi0+aW1hZ2UgPSBwd2NfaW1hZ2Vfc2l6ZXNbc2l6ZV07CisJcGRldi0+dmJhbmRsZW5ndGggPSBwQ2hvb3NlLT5iYW5kbGVuZ3RoOworCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCkKKwkJcGRldi0+ZnJhbWVfc2l6ZSA9IChwQ2hvb3NlLT5iYW5kbGVuZ3RoICogcGRldi0+aW1hZ2UueSkgLyA0OworCWVsc2UKKwkJcGRldi0+ZnJhbWVfc2l6ZSA9IChwZGV2LT5pbWFnZS54ICogcGRldi0+aW1hZ2UueSAqIDEyKSAvIDg7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgc2V0X3ZpZGVvX21vZGVfS2lhcmEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzaXplLCBpbnQgZnJhbWVzLCBpbnQgY29tcHJlc3Npb24sIGludCBzbmFwc2hvdCkKK3sKKwljb25zdCBzdHJ1Y3QgS2lhcmFfdGFibGVfZW50cnkgKnBDaG9vc2UgPSBOVUxMOworCWludCBmcHMsIHJldDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMl07CisJc3RydWN0IEtpYXJhX3RhYmxlX2VudHJ5IFJhd0VudHJ5ID0gezYsIDc3MywgMTI3MiwgezB4QUQsIDB4RjQsIDB4MTAsIDB4MjcsIDB4QjYsIDB4MjQsIDB4OTYsIDB4MDIsIDB4MzAsIDB4MDUsIDB4MDMsIDB4ODB9fTsKKworCWlmIChzaXplID49IFBTWl9NQVggfHwgZnJhbWVzIDwgNSB8fCBmcmFtZXMgPiAzMCB8fCBjb21wcmVzc2lvbiA8IDAgfHwgY29tcHJlc3Npb24gPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2l6ZSA9PSBQU1pfVkdBICYmIGZyYW1lcyA+IDE1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmcHMgPSAoZnJhbWVzIC8gNSkgLSAxOworCisJLyogc3BlY2lhbCBjYXNlOiBWR0EgQCA1IGZwcyBhbmQgc25hcHNob3QgaXMgcmF3IGJheWVyIG1vZGUgKi8KKwlpZiAoc2l6ZSA9PSBQU1pfVkdBICYmIGZyYW1lcyA9PSA1ICYmIHNuYXBzaG90KQorCXsKKwkJLyogT25seSBhdmFpbGFibGUgaW4gY2FzZSB0aGUgcmF3IHBhbGV0dGUgaXMgc2VsZWN0ZWQgb3IgCisJCSAgIHdlIGhhdmUgdGhlIGRlY29tcHJlc3NvciBhdmFpbGFibGUuIFRoaXMgbW9kZSBpcyAKKwkJICAgb25seSBhdmFpbGFibGUgaW4gY29tcHJlc3NlZCBmb3JtIAorCQkqLworCQlpZiAocGRldi0+dnBhbGV0dGUgPT0gVklERU9fUEFMRVRURV9SQVcpCisJCXsKKwkgICAgICAgICAgICAgICAgSW5mbygiQ2hvb3NpbmcgVkdBLzUgQkFZRVIgbW9kZSAoJWQpLlxuIiwgcGRldi0+dnBhbGV0dGUpOworCQkJcENob29zZSA9ICZSYXdFbnRyeTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUluZm8oIlZHQS81IEJBWUVSIG1vZGUgX211c3RfIGhhdmUgYSBkZWNvbXByZXNzb3IgYXZhaWxhYmxlLCBvciB1c2UgUkFXIHBhbGV0dGUuXG4iKTsKKwkJfQorCX0KKwllbHNlCisJeworICAgICAgICAJLyogRmluZCBhIHN1cHBvcnRlZCBmcmFtZXJhdGUgd2l0aCBwcm9ncmVzc2l2ZWx5IGhpZ2hlciBjb21wcmVzc2lvbiByYXRpb3MKKwkJICAgaWYgdGhlIHByZWZlcnJlZCByYXRpbyBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAgICAgICAgICAgIFNraXAgdGhpcyBzdGVwIHdoZW4gdXNpbmcgUkFXIG1vZGVzLgorCQkqLworCQl3aGlsZSAoY29tcHJlc3Npb24gPD0gMykgeworCQkJcENob29zZSA9ICZLaWFyYV90YWJsZVtzaXplXVtmcHNdW2NvbXByZXNzaW9uXTsKKwkJCWlmIChwQ2hvb3NlLT5hbHRlcm5hdGUgIT0gMCkKKwkJCQlicmVhazsKKwkJCWNvbXByZXNzaW9uKys7CisJCX0KKwl9CisJaWYgKHBDaG9vc2UgPT0gTlVMTCB8fCBwQ2hvb3NlLT5hbHRlcm5hdGUgPT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7IC8qIE5vdCBzdXBwb3J0ZWQuICovCisKKwlEZWJ1ZygiVXNpbmcgYWx0ZXJuYXRlIHNldHRpbmcgJWQuXG4iLCBwQ2hvb3NlLT5hbHRlcm5hdGUpOworCQorCS8qIHVzYl9jb250cm9sX21zZyB3b24ndCB0YWtlIHN0YXRpY2x5IGFsbG9jYXRlZCBhcnJheXMgYXMgYXJndW1lbnQ/PyAqLworCW1lbWNweShidWYsIHBDaG9vc2UtPm1vZGUsIDEyKTsKKwlpZiAoc25hcHNob3QpCisJCWJ1ZlswXSB8PSAweDgwOworCisJLyogRmlybXdhcmUgYnVnOiB2aWRlbyBlbmRwb2ludCBpcyA1LCBidXQgY29tbWFuZHMgYXJlIHNlbnQgdG8gZW5kcG9pbnQgNCAqLworCXJldCA9IHNlbmRfdmlkZW9fY29tbWFuZChwZGV2LT51ZGV2LCA0IC8qIHBkZXYtPnZlbmRwb2ludCAqLywgYnVmLCAxMik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAocENob29zZS0+YmFuZGxlbmd0aCA+IDAgJiYgcGRldi0+dnBhbGV0dGUgIT0gVklERU9fUEFMRVRURV9SQVcpCisJICBwd2NfZGVjMjNfaW5pdChwZGV2LT50eXBlLCBwZGV2LT5yZWxlYXNlLCBidWYsIHBkZXYtPmRlY29tcHJlc3NfZGF0YSk7CisKKwlwZGV2LT5jbWRfbGVuID0gMTI7CisJbWVtY3B5KHBkZXYtPmNtZF9idWYsIGJ1ZiwgMTIpOworCS8qIEFsbCBzZXQgYW5kIGdvICovCisJcGRldi0+dmZyYW1lcyA9IGZyYW1lczsKKwlwZGV2LT52c2l6ZSA9IHNpemU7CisJcGRldi0+dnNuYXBzaG90ID0gc25hcHNob3Q7CisJcGRldi0+dmFsdGVybmF0ZSA9IHBDaG9vc2UtPmFsdGVybmF0ZTsKKwlwZGV2LT5pbWFnZSA9IHB3Y19pbWFnZV9zaXplc1tzaXplXTsKKwlwZGV2LT52YmFuZGxlbmd0aCA9IHBDaG9vc2UtPmJhbmRsZW5ndGg7CisJaWYgKHBkZXYtPnZiYW5kbGVuZ3RoID4gMCkKKwkJcGRldi0+ZnJhbWVfc2l6ZSA9IChwZGV2LT52YmFuZGxlbmd0aCAqIHBkZXYtPmltYWdlLnkpIC8gNDsKKwllbHNlCisJCXBkZXYtPmZyYW1lX3NpemUgPSAocGRldi0+aW1hZ2UueCAqIHBkZXYtPmltYWdlLnkgKiAxMikgLyA4OworCXJldHVybiAwOworfQorCisKKworLyoqCisgICBAcGRldjogZGV2aWNlIHN0cnVjdHVyZQorICAgQHdpZHRoOiB2aWV3cG9ydCB3aWR0aAorICAgQGhlaWdodDogdmlld3BvcnQgaGVpZ2h0CisgICBAZnJhbWU6IGZyYW1lcmF0ZSwgaW4gZnBzCisgICBAY29tcHJlc3Npb246IHByZWZlcnJlZCBjb21wcmVzc2lvbiByYXRpbworICAgQHNuYXBzaG90OiBzbmFwc2hvdCBtb2RlIG9yIHN0cmVhbWluZworICovCitpbnQgcHdjX3NldF92aWRlb19tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KQoreworICAgICAgICBpbnQgcmV0LCBzaXplOworCisgICAgICAgIFRyYWNlKFRSQUNFX0ZMT1csICJzZXRfdmlkZW9fbW9kZSglZHglZCBAICVkLCBwYWxldHRlICVkKS5cbiIsIHdpZHRoLCBoZWlnaHQsIGZyYW1lcywgcGRldi0+dnBhbGV0dGUpOworCXNpemUgPSBwd2NfZGVjb2RlX3NpemUocGRldiwgd2lkdGgsIGhlaWdodCk7CisJaWYgKHNpemUgPCAwKSB7CisJCURlYnVnKCJDb3VsZCBub3QgZmluZCBzdWl0YWJsZSBzaXplLlxuIik7CisJCXJldHVybiAtRVJBTkdFOworCX0KKwlEZWJ1ZygiZGVjb2RlX3NpemUgPSAlZC5cbiIsIHNpemUpOworCisgICAgICAgIHJldCA9IC1FSU5WQUw7CisJc3dpdGNoKHBkZXYtPnR5cGUpIHsKKwljYXNlIDY0NToKKwljYXNlIDY0NjoKKwkJcmV0ID0gc2V0X3ZpZGVvX21vZGVfTmFsYShwZGV2LCBzaXplLCBmcmFtZXMpOworCQlicmVhazsKKworCWNhc2UgNjc1OgorCWNhc2UgNjgwOgorCWNhc2UgNjkwOgorCQlyZXQgPSBzZXRfdmlkZW9fbW9kZV9UaW1vbihwZGV2LCBzaXplLCBmcmFtZXMsIGNvbXByZXNzaW9uLCBzbmFwc2hvdCk7CisJCWJyZWFrOworCQorCWNhc2UgNzIwOgorCWNhc2UgNzMwOgorCWNhc2UgNzQwOgorCWNhc2UgNzUwOgorCQlyZXQgPSBzZXRfdmlkZW9fbW9kZV9LaWFyYShwZGV2LCBzaXplLCBmcmFtZXMsIGNvbXByZXNzaW9uLCBzbmFwc2hvdCk7CisJCWJyZWFrOworCX0KKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ID09IC1FTk9FTlQpCisJCQlJbmZvKCJWaWRlbyBtb2RlICVzQCVkIGZwcyBpcyBvbmx5IHN1cHBvcnRlZCB3aXRoIHRoZSBkZWNvbXByZXNzb3IgbW9kdWxlIChwd2N4KS5cbiIsIHNpemUybmFtZVtzaXplXSwgZnJhbWVzKTsKKwkJZWxzZSB7CisJCQlFcnIoIkZhaWxlZCB0byBzZXQgdmlkZW8gbW9kZSAlc0AlZCBmcHM7IHJldHVybiBjb2RlID0gJWRcbiIsIHNpemUybmFtZVtzaXplXSwgZnJhbWVzLCByZXQpOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCXBkZXYtPnZpZXcueCA9IHdpZHRoOworCXBkZXYtPnZpZXcueSA9IGhlaWdodDsKKwlwZGV2LT5mcmFtZV90b3RhbF9zaXplID0gcGRldi0+ZnJhbWVfc2l6ZSArIHBkZXYtPmZyYW1lX2hlYWRlcl9zaXplICsgcGRldi0+ZnJhbWVfdHJhaWxlcl9zaXplOworCXB3Y19zZXRfaW1hZ2VfYnVmZmVyX3NpemUocGRldik7CisJVHJhY2UoVFJBQ0VfU0laRSwgIlNldCB2aWV3cG9ydCB0byAlZHglZCwgaW1hZ2Ugc2l6ZSBpcyAlZHglZC5cbiIsIHdpZHRoLCBoZWlnaHQsIHB3Y19pbWFnZV9zaXplc1tzaXplXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbc2l6ZV0ueSk7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWludCBpLCBmYWN0b3IgPSAwLCBmaWxsZXIgPSAwOworCisJLyogZm9yIFBBTEVUVEVfWVVWNDIwUCAqLworCXN3aXRjaChwZGV2LT52cGFsZXR0ZSkKKwl7CisJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMFA6CisJCWZhY3RvciA9IDY7CisJCWZpbGxlciA9IDEyODsKKwkJYnJlYWs7CisJY2FzZSBWSURFT19QQUxFVFRFX1JBVzoKKwkJZmFjdG9yID0gNjsgLyogY2FuIGJlIHVuY29tcHJlc3NlZCBZVVY0MjBQICovCisJCWZpbGxlciA9IDA7CisJCWJyZWFrOworCX0KKworCS8qIFNldCBzaXplcyBpbiBieXRlcyAqLworCXBkZXYtPmltYWdlLnNpemUgPSBwZGV2LT5pbWFnZS54ICogcGRldi0+aW1hZ2UueSAqIGZhY3RvciAvIDQ7CisJcGRldi0+dmlldy5zaXplICA9IHBkZXYtPnZpZXcueCAgKiBwZGV2LT52aWV3LnkgICogZmFjdG9yIC8gNDsKKworCS8qIEFsaWduIG9mZnNldCwgb3IgeW91J2xsIGdldCBzb21lIHZlcnkgd2VpcmQgcmVzdWx0cyBpbgorCSAgIFlVVjQyMCBtb2RlLi4uIHggbXVzdCBiZSBtdWx0aXBsZSBvZiA0ICh0byBnZXQgdGhlIFkncyBpbgorCSAgIHBsYWNlKSwgYW5kIHkgZXZlbiAob3IgeW91J2xsIG1peHVwIFUgJiBWKS4gVGhpcyBpcyBsZXNzIG9mIGEKKwkgICBwcm9ibGVtIGZvciBZVVY0MjBQLgorCSAqLworCXBkZXYtPm9mZnNldC54ID0gKChwZGV2LT52aWV3LnggLSBwZGV2LT5pbWFnZS54KSAvIDIpICYgMHhGRkZDOworCXBkZXYtPm9mZnNldC55ID0gKChwZGV2LT52aWV3LnkgLSBwZGV2LT5pbWFnZS55KSAvIDIpICYgMHhGRkZFOworCisJLyogRmlsbCBidWZmZXJzIHdpdGggZ3JheSBvciBibGFjayAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfSU1BR0VTOyBpKyspIHsKKwkJaWYgKHBkZXYtPmltYWdlX3B0cltpXSAhPSBOVUxMKQorCQkJbWVtc2V0KHBkZXYtPmltYWdlX3B0cltpXSwgZmlsbGVyLCBwZGV2LT52aWV3LnNpemUpOworCX0KK30KKworCisKKy8qIEJSSUdIVE5FU1MgKi8KKworaW50IHB3Y19nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwljaGFyIGJ1ZjsKKwlpbnQgcmV0OworCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0xVTV9DVEwsIEJSSUdIVE5FU1NfRk9STUFUVEVSLCAxKTsJCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGJ1ZiA8PCA5OworfQorCitpbnQgcHdjX3NldF9icmlnaHRuZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCit7CisJY2hhciBidWY7CisKKwlpZiAodmFsdWUgPCAwKQorCQl2YWx1ZSA9IDA7CisJaWYgKHZhbHVlID4gMHhmZmZmKQorCQl2YWx1ZSA9IDB4ZmZmZjsKKwlidWYgPSAodmFsdWUgPj4gOSkgJiAweDdmOworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgQlJJR0hUTkVTU19GT1JNQVRURVIsIDEpOworfQorCisvKiBDT05UUkFTVCAqLworCitpbnQgcHdjX2dldF9jb250cmFzdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwljaGFyIGJ1ZjsKKwlpbnQgcmV0OworCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0xVTV9DVEwsIENPTlRSQVNUX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGJ1ZiA8PCAxMDsKK30KKworaW50IHB3Y19zZXRfY29udHJhc3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKK3sKKwljaGFyIGJ1ZjsKKworCWlmICh2YWx1ZSA8IDApCisJCXZhbHVlID0gMDsKKwlpZiAodmFsdWUgPiAweGZmZmYpCisJCXZhbHVlID0gMHhmZmZmOworCWJ1ZiA9ICh2YWx1ZSA+PiAxMCkgJiAweDNmOworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgQ09OVFJBU1RfRk9STUFUVEVSLCAxKTsKK30KKworLyogR0FNTUEgKi8KKworaW50IHB3Y19nZXRfZ2FtbWEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJY2hhciBidWY7CisJaW50IHJldDsKKwkKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfTFVNX0NUTCwgR0FNTUFfRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gYnVmIDw8IDExOworfQorCitpbnQgcHdjX3NldF9nYW1tYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQoreworCWNoYXIgYnVmOworCisJaWYgKHZhbHVlIDwgMCkKKwkJdmFsdWUgPSAwOworCWlmICh2YWx1ZSA+IDB4ZmZmZikKKwkJdmFsdWUgPSAweGZmZmY7CisJYnVmID0gKHZhbHVlID4+IDExKSAmIDB4MWY7CisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9MVU1fQ1RMLCBHQU1NQV9GT1JNQVRURVIsIDEpOworfQorCisKKy8qIFNBVFVSQVRJT04gKi8KKworaW50IHB3Y19nZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwljaGFyIGJ1ZjsKKwlpbnQgcmV0OworCisJaWYgKHBkZXYtPnR5cGUgPCA2NzUpCisJCXJldHVybiAtMTsKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfQ0hST01fQ1RMLCBwZGV2LT50eXBlIDwgNzMwID8gU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjIgOiBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMSwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIDMyNzY4ICsgYnVmICogMzI3OworfQorCitpbnQgcHdjX3NldF9zYXR1cmF0aW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCit7CisJY2hhciBidWY7CisKKwlpZiAocGRldi0+dHlwZSA8IDY3NSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbHVlIDwgMCkKKwkJdmFsdWUgPSAwOworCWlmICh2YWx1ZSA+IDB4ZmZmZikKKwkJdmFsdWUgPSAweGZmZmY7CisJLyogc2F0dXJhdGlvbiByYW5nZXMgZnJvbSAtMTAwIHRvICsxMDAgKi8KKwlidWYgPSAodmFsdWUgLSAzMjc2OCkgLyAzMjc7CisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9DSFJPTV9DVEwsIHBkZXYtPnR5cGUgPCA3MzAgPyBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMiA6IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxLCAxKTsKK30KKworLyogQUdDICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKQoreworCWNoYXIgYnVmOworCWludCByZXQ7CisJCisJaWYgKG1vZGUpCisJCWJ1ZiA9IDB4MDsgLyogYXV0byAqLworCWVsc2UKKwkJYnVmID0gMHhmZjsgLyogZml4ZWQgKi8KKworCXJldCA9IFNlbmRDb250cm9sTXNnKFNFVF9MVU1fQ1RMLCBBR0NfTU9ERV9GT1JNQVRURVIsIDEpOworCQorCWlmICghbW9kZSAmJiByZXQgPj0gMCkgeworCQlpZiAodmFsdWUgPCAwKQorCQkJdmFsdWUgPSAwOworCQlpZiAodmFsdWUgPiAweGZmZmYpCisJCQl2YWx1ZSA9IDB4ZmZmZjsKKwkJYnVmID0gKHZhbHVlID4+IDEwKSAmIDB4M0Y7CisJCXJldCA9IFNlbmRDb250cm9sTXNnKFNFVF9MVU1fQ1RMLCBQUkVTRVRfQUdDX0ZPUk1BVFRFUiwgMSk7CisJfQorCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X2FnYyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgcmV0OworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBBR0NfTU9ERV9GT1JNQVRURVIsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGJ1ZiAhPSAwKSB7IC8qIGZpeGVkICovCisJCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBQUkVTRVRfQUdDX0ZPUk1BVFRFUiwgMSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGJ1ZiA+IDB4M0YpCisJCQlidWYgPSAweDNGOworCQkqdmFsdWUgPSAoYnVmIDw8IDEwKTsJCQorCX0KKwllbHNlIHsgLyogYXV0byAqLworCQlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfU1RBVFVTX0NUTCwgUkVBRF9BR0NfRk9STUFUVEVSLCAxKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkvKiBHYWguLi4gdGhpcyB2YWx1ZSByYW5nZXMgZnJvbSAweDAwIC4uLiAweDlGICovCisJCWlmIChidWYgPiAweDlGKQorCQkJYnVmID0gMHg5RjsKKwkJKnZhbHVlID0gLSg0OCArIGJ1ZiAqIDQwOSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfc2h1dHRlcl9zcGVlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUsIGludCB2YWx1ZSkKK3sKKwljaGFyIGJ1ZlsyXTsKKwlpbnQgc3BlZWQsIHJldDsKKworCisJaWYgKG1vZGUpCisJCWJ1ZlswXSA9IDB4MDsJLyogYXV0byAqLworCWVsc2UKKwkJYnVmWzBdID0gMHhmZjsgLyogZml4ZWQgKi8KKwkKKwlyZXQgPSBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgU0hVVFRFUl9NT0RFX0ZPUk1BVFRFUiwgMSk7CisKKwlpZiAoIW1vZGUgJiYgcmV0ID49IDApIHsKKwkJaWYgKHZhbHVlIDwgMCkKKwkJCXZhbHVlID0gMDsKKwkJaWYgKHZhbHVlID4gMHhmZmZmKQorCQkJdmFsdWUgPSAweGZmZmY7CisJCXN3aXRjaChwZGV2LT50eXBlKSB7CisJCWNhc2UgNjc1OgorCQljYXNlIDY4MDoKKwkJY2FzZSA2OTA6CisJCQkvKiBzcGVlZCByYW5nZXMgZnJvbSAweDAgdG8gMHgyOTAgKDY1NikgKi8KKwkJCXNwZWVkID0gKHZhbHVlIC8gMTAwKTsKKwkJCWJ1ZlsxXSA9IHNwZWVkID4+IDg7CisJCQlidWZbMF0gPSBzcGVlZCAmIDB4ZmY7CisJCQlicmVhazsKKwkJY2FzZSA3MjA6CisJCWNhc2UgNzMwOgorCQljYXNlIDc0MDoKKwkJY2FzZSA3NTA6CisJCQkvKiBzcGVlZCBzZWVtcyB0byByYW5nZSBmcm9tIDB4MCB0byAweGZmICovCisJCQlidWZbMV0gPSAwOworCQkJYnVmWzBdID0gdmFsdWUgPj4gODsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ID0gU2VuZENvbnRyb2xNc2coU0VUX0xVTV9DVEwsIFBSRVNFVF9TSFVUVEVSX0ZPUk1BVFRFUiwgMik7CisJfQorCXJldHVybiByZXQ7Cit9CQorCisKKy8qIFBPV0VSICovCisKK2ludCBwd2NfY2FtZXJhX3Bvd2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgcG93ZXIpCit7CisJY2hhciBidWY7CisKKwlpZiAocGRldi0+dHlwZSA8IDY3NSB8fCAocGRldi0+dHlwZSA8IDczMCAmJiBwZGV2LT5yZWxlYXNlIDwgNikpCisJCXJldHVybiAwOwkvKiBOb3Qgc3VwcG9ydGVkIGJ5IE5hbGEgb3IgVGltb24gPCByZWxlYXNlIDYgKi8KKworCWlmIChwb3dlcikKKwkJYnVmID0gMHgwMDsgLyogYWN0aXZlICovCisJZWxzZQorCQlidWYgPSAweEZGOyAvKiBwb3dlciBzYXZlICovCisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9TVEFUVVNfQ1RMLCBTRVRfUE9XRVJfU0FWRV9NT0RFX0ZPUk1BVFRFUiwgMSk7Cit9CisKKworCisvKiBwcml2YXRlIGNhbGxzICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19yZXN0b3JlX3VzZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJY2hhciBidWY7IC8qIGR1bW15ICovCisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9TVEFUVVNfQ1RMLCBSRVNUT1JFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSLCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX3NhdmVfdXNlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwljaGFyIGJ1ZjsgLyogZHVtbXkgKi8KKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX1NUQVRVU19DVEwsIFNBVkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIsIDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfcmVzdG9yZV9mYWN0b3J5KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWNoYXIgYnVmOyAvKiBkdW1teSAqLworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfU1RBVFVTX0NUTCwgUkVTVE9SRV9GQUNUT1JZX0RFRkFVTFRTX0ZPUk1BVFRFUiwgMCk7Cit9CisKKyAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisgLyogUGF0Y2ggYnkgQWx2YXJhZG86IChub3QgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24gICAqLworCisgLyoKKyAgKiB0aGUgY2FtZXJhIHJlY29nbml6ZXMgbW9kZXMgZnJvbSAwIHRvIDQ6CisgICoKKyAgKiAwMDogaW5kb29yIChpbmNhbmRlc2NhbnQgbGlnaHRpbmcpCisgICogMDE6IG91dGRvb3IgKHN1bmxpZ2h0KQorICAqIDAyOiBmbHVvcmVzY2VudCBsaWdodGluZworICAqIDAzOiBtYW51YWwKKyAgKiAwNDogYXV0bworICAqLyAKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSkKK3sKKwljaGFyIGJ1ZjsKKwlpbnQgcmV0OworCQorCWlmIChtb2RlIDwgMCkKKwkgICAgbW9kZSA9IDA7CisJCisJaWYgKG1vZGUgPiA0KQorCSAgICBtb2RlID0gNDsKKwkKKwlidWYgPSBtb2RlICYgMHgwNzsgLyoganVzdCB0aGUgbG93ZXN0IHRocmVlIGJpdHMgKi8KKwkKKwlyZXQgPSBTZW5kQ29udHJvbE1zZyhTRVRfQ0hST01fQ1RMLCBXQl9NT0RFX0ZPUk1BVFRFUiwgMSk7CisJCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCByZXQ7CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0NIUk9NX0NUTCwgV0JfTU9ERV9GT1JNQVRURVIsIDEpOworCisJaWYgKHJldCA8IDApIAorCQlyZXR1cm4gcmV0OworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfcmVkX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKK3sKKyAgICAgICAgdW5zaWduZWQgY2hhciBidWY7CisKKwlpZiAodmFsdWUgPCAwKQorCQl2YWx1ZSA9IDA7CisJaWYgKHZhbHVlID4gMHhmZmZmKQorCQl2YWx1ZSA9IDB4ZmZmZjsKKwkvKiBvbmx5IHRoZSBtc2IgaXMgY29uc2lkZXJlZCAqLworCWJ1ZiA9IHZhbHVlID4+IDg7CisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9DSFJPTV9DVEwsIFBSRVNFVF9NQU5VQUxfUkVEX0dBSU5fRk9STUFUVEVSLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgcmV0OworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9DSFJPTV9DVEwsIFBSRVNFVF9NQU5VQUxfUkVEX0dBSU5fRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkgICAgcmV0dXJuIHJldDsKKwkqdmFsdWUgPSBidWYgPDwgODsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCisJaWYgKHZhbHVlIDwgMCkKKwkJdmFsdWUgPSAwOworCWlmICh2YWx1ZSA+IDB4ZmZmZikKKwkJdmFsdWUgPSAweGZmZmY7CisJLyogb25seSB0aGUgbXNiIGlzIGNvbnNpZGVyZWQgKi8KKwlidWYgPSB2YWx1ZSA+PiA4OworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfQ0hST01fQ1RMLCBQUkVTRVRfTUFOVUFMX0JMVUVfR0FJTl9GT1JNQVRURVIsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgcmV0OworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9DSFJPTV9DVEwsIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJICAgIHJldHVybiByZXQ7CisJKnZhbHVlID0gYnVmIDw8IDg7CisJcmV0dXJuIDA7Cit9CisKKworLyogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBkaWZmZXJlbnQsIHNpbmNlIHRoZXkgb25seSByZWFkIHRoZQorICAgaW50ZXJuYWwgcmVkL2JsdWUgZ2FpbnMsIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbWFudWFsIAorICAgZ2FpbnMgc2V0IG9yIHJlYWQgYWJvdmUuCisgKi8gICAKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19yZWFkX3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCByZXQ7CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX1NUQVRVU19DVEwsIFJFQURfUkVEX0dBSU5fRk9STUFUVEVSLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsdWUgPSBidWYgPDwgODsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX3JlYWRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCByZXQ7CisJCisJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX1NUQVRVU19DVEwsIFJFQURfQkxVRV9HQUlOX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKnZhbHVlID0gYnVmIDw8IDg7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF93Yl9zcGVlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNwZWVkKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCQorCS8qIHVzZWZ1bCByYW5nZSBpcyAweDAxLi4weDIwICovCisJYnVmID0gc3BlZWQgLyAweDdmMDsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0NIUk9NX0NUTCwgQVdCX0NPTlRST0xfU1BFRURfRk9STUFUVEVSLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF93Yl9zcGVlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgcmV0OworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9DSFJPTV9DVEwsIEFXQl9DT05UUk9MX1NQRUVEX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKnZhbHVlID0gYnVmICogMHg3ZjA7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF93Yl9kZWxheShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGRlbGF5KQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCQorCS8qIHVzZWZ1bCByYW5nZSBpcyAweDAxLi4weDNGICovCisJYnVmID0gKGRlbGF5ID4+IDEwKTsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0NIUk9NX0NUTCwgQVdCX0NPTlRST0xfREVMQVlfRk9STUFUVEVSLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF93Yl9kZWxheShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgcmV0OworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9DSFJPTV9DVEwsIEFXQl9DT05UUk9MX0RFTEFZX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKnZhbHVlID0gYnVmIDw8IDEwOworCXJldHVybiAwOworfQorCisKK2ludCBwd2Nfc2V0X2xlZHMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBvbl92YWx1ZSwgaW50IG9mZl92YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKworCWlmIChwZGV2LT50eXBlIDwgNzMwKQorCQlyZXR1cm4gMDsKKwlvbl92YWx1ZSAvPSAxMDA7CisJb2ZmX3ZhbHVlIC89IDEwMDsKKwlpZiAob25fdmFsdWUgPCAwKQorCQlvbl92YWx1ZSA9IDA7CisJaWYgKG9uX3ZhbHVlID4gMHhmZikKKwkJb25fdmFsdWUgPSAweGZmOworCWlmIChvZmZfdmFsdWUgPCAwKQorCQlvZmZfdmFsdWUgPSAwOworCWlmIChvZmZfdmFsdWUgPiAweGZmKQorCQlvZmZfdmFsdWUgPSAweGZmOworCisJYnVmWzBdID0gb25fdmFsdWU7CisJYnVmWzFdID0gb2ZmX3ZhbHVlOworCisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9TVEFUVVNfQ1RMLCBMRURfRk9STUFUVEVSLCAyKTsKK30KKworaW50IHB3Y19nZXRfbGVkcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpvbl92YWx1ZSwgaW50ICpvZmZfdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisJaW50IHJldDsKKwkKKwlpZiAocGRldi0+dHlwZSA8IDczMCkgeworCQkqb25fdmFsdWUgPSAtMTsKKwkJKm9mZl92YWx1ZSA9IC0xOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfU1RBVFVTX0NUTCwgTEVEX0ZPUk1BVFRFUiwgMik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKm9uX3ZhbHVlID0gYnVmWzBdICogMTAwOworCSpvZmZfdmFsdWUgPSBidWZbMV0gKiAxMDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGNvbnRvdXIpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisJaW50IHJldDsKKwkKKwlpZiAoY29udG91ciA8IDApCisJCWJ1ZiA9IDB4ZmY7IC8qIGF1dG8gY29udG91ciBvbiAqLworCWVsc2UKKwkJYnVmID0gMHgwOyAvKiBhdXRvIGNvbnRvdXIgb2ZmICovCisJcmV0ID0gU2VuZENvbnRyb2xNc2coU0VUX0xVTV9DVEwsIEFVVE9fQ09OVE9VUl9GT1JNQVRURVIsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCQorCWlmIChjb250b3VyIDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKGNvbnRvdXIgPiAweGZmZmYpCisJCWNvbnRvdXIgPSAweGZmZmY7CisJCisJYnVmID0gKGNvbnRvdXIgPj4gMTApOyAvKiBjb250b3VyIHByZXNldCBpcyBbMC4uM2ZdICovCisJcmV0ID0gU2VuZENvbnRyb2xNc2coU0VUX0xVTV9DVEwsIFBSRVNFVF9DT05UT1VSX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCQorCQlyZXR1cm4gcmV0OwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF9jb250b3VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmNvbnRvdXIpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisJaW50IHJldDsKKwkKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfTFVNX0NUTCwgQVVUT19DT05UT1VSX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoYnVmID09IDApIHsKKwkJLyogYXV0byBtb2RlIG9mZiwgcXVlcnkgY3VycmVudCBwcmVzZXQgdmFsdWUgKi8KKwkJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0xVTV9DVEwsIFBSRVNFVF9DT05UT1VSX0ZPUk1BVFRFUiwgMSk7CisJCWlmIChyZXQgPCAwKQkKKwkJCXJldHVybiByZXQ7CisJCSpjb250b3VyID0gYnVmIDw8IDEwOworCX0KKwllbHNlCisJCSpjb250b3VyID0gLTE7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBiYWNrbGlnaHQpCit7CisJdW5zaWduZWQgY2hhciBidWY7CisJCisJaWYgKGJhY2tsaWdodCkKKwkJYnVmID0gMHhmZjsKKwllbHNlCisJCWJ1ZiA9IDB4MDsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0xVTV9DVEwsIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUiwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfYmFja2xpZ2h0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmJhY2tsaWdodCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgYnVmOworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBCQUNLX0xJR0hUX0NPTVBFTlNBVElPTl9GT1JNQVRURVIsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCSpiYWNrbGlnaHQgPSBidWY7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9mbGlja2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgZmxpY2tlcikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwkKKwlpZiAoZmxpY2tlcikKKwkJYnVmID0gMHhmZjsKKwllbHNlCisJCWJ1ZiA9IDB4MDsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0xVTV9DVEwsIEZMSUNLRVJMRVNTX01PREVfRk9STUFUVEVSLCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF9mbGlja2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmZsaWNrZXIpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwkKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfTFVNX0NUTCwgRkxJQ0tFUkxFU1NfTU9ERV9GT1JNQVRURVIsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCSpmbGlja2VyID0gYnVmOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG5vaXNlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCisJaWYgKG5vaXNlIDwgMCkKKwkJbm9pc2UgPSAwOworCWlmIChub2lzZSA+IDMpCisJCW5vaXNlID0gMzsKKwlidWYgPSBub2lzZTsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0xVTV9DVEwsIERZTkFNSUNfTk9JU0VfQ09OVFJPTF9GT1JNQVRURVIsIDEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X2R5bmFtaWNfbm9pc2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqbm9pc2UpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwkKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfTFVNX0NUTCwgRFlOQU1JQ19OT0lTRV9DT05UUk9MX0ZPUk1BVFRFUiwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKm5vaXNlID0gYnVmOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB3Y19tcHRfcmVzZXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwkKKwlidWYgPSBmbGFncyAmIDB4MDM7IC8vIG9ubHkgbG93ZXIgdHdvIGJpdHMgYXJlIGN1cnJlbnRseSB1c2VkCisJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9NUFRfQ1RMLCBQVF9SRVNFVF9DT05UUk9MX0ZPUk1BVFRFUiwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19tcHRfc2V0X2FuZ2xlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgcGFuLCBpbnQgdGlsdCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKwkKKwkvKiBzZXQgbmV3IHJlbGF0aXZlIGFuZ2xlOyBhbmdsZXMgYXJlIGV4cHJlc3NlZCBpbiBkZWdyZWVzICogMTAwLAorCSAgIGJ1dCBjYW0gYXMgLjUgZGVncmVlIHJlc29sdXRpb24sIGhlbmNlIGRldmlkZSBieSAyMDAuIEFsc28KKwkgICB0aGUgYW5nbGUgbXVzdCBiZSBtdWx0aXBsaWVkIGJ5IDY0IGJlZm9yZSBpdCdzIHNlbmQgdG8KKwkgICB0aGUgY2FtICg/PykKKwkgKi8KKwlwYW4gID0gIDY0ICogcGFuICAvIDEwMDsKKwl0aWx0ID0gLTY0ICogdGlsdCAvIDEwMDsgLyogcG9zaXRpdmUgdGlsdCBpcyBkb3duLCB3aGljaCBpcyBub3Qgd2hhdCB0aGUgdXNlciB3b3VsZCBleHBlY3QgKi8KKwlidWZbMF0gPSBwYW4gJiAweEZGOworCWJ1ZlsxXSA9IChwYW4gPj4gOCkgJiAweEZGOworCWJ1ZlsyXSA9IHRpbHQgJiAweEZGOworCWJ1ZlszXSA9ICh0aWx0ID4+IDgpICYgMHhGRjsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX01QVF9DVEwsIFBUX1JFTEFUSVZFX0NPTlRST0xfRk9STUFUVEVSLCA0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdjX21wdF9nZXRfc3RhdHVzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBzdHJ1Y3QgcHdjX21wdF9zdGF0dXMgKnN0YXR1cykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgYnVmWzVdOworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9NUFRfQ1RMLCBQVF9TVEFUVVNfRk9STUFUVEVSLCA1KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlzdGF0dXMtPnN0YXR1cyA9IGJ1ZlswXSAmIDB4NzsgLy8gMyBiaXRzIGFyZSB1c2VkIGZvciByZXBvcnRpbmcKKwlzdGF0dXMtPnRpbWVfcGFuID0gKGJ1ZlsxXSA8PCA4KSArIGJ1ZlsyXTsKKwlzdGF0dXMtPnRpbWVfdGlsdCA9IChidWZbM10gPDwgOCkgKyBidWZbNF07CisJcmV0dXJuIDA7Cit9CisKKworaW50IHB3Y19nZXRfY21vc19zZW5zb3Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqc2Vuc29yKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCWludCByZXQgPSAtMSwgcmVxdWVzdDsKKwkKKwlpZiAocGRldi0+dHlwZSA8IDY3NSkKKwkJcmVxdWVzdCA9IFNFTlNPUl9UWVBFX0ZPUk1BVFRFUjE7CisJZWxzZSBpZiAocGRldi0+dHlwZSA8IDczMCkKKwkJcmV0dXJuIC0xOyAvKiBUaGUgVmVzdGEgc2VyaWVzIGRvZXNuJ3QgaGF2ZSB0aGlzIGNhbGwgKi8KKwllbHNlCisJCXJlcXVlc3QgPSBTRU5TT1JfVFlQRV9GT1JNQVRURVIyOworCQorCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9TVEFUVVNfQ1RMLCByZXF1ZXN0LCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocGRldi0+dHlwZSA8IDY3NSkKKwkJKnNlbnNvciA9IGJ1ZiB8IDB4MTAwOworCWVsc2UKKwkJKnNlbnNvciA9IGJ1ZjsKKwlyZXR1cm4gMDsKK30KKworCisgLyogRW5kIG9mIEFkZC1PbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogTGludXggMi41LnNvbWV0aGluZyBhbmQgMi42IHBhc3MgZGlyZWN0IHBvaW50ZXJzIHRvIGFyZ3VtZW50cyBvZgorICAgaW9jdGwoKSBjYWxscy4gV2l0aCAyLjQsIHlvdSBoYXZlIHRvIGRvIHRlZGlvdXMgY29weV9mcm9tX3VzZXIoKQorICAgYW5kIGNvcHlfdG9fdXNlcigpIGNhbGxzLiBXaXRoIHRoZXNlIG1hY3JvcyB3ZSBjaXJjdW12ZW50IHRoaXMsCisgICBhbmQgbGV0IG1lIG1haW50YWluIG9ubHkgb25lIHNvdXJjZSBmaWxlLiBUaGUgZnVuY3Rpb25hbGl0eSBpcworICAgZXhhY3RseSB0aGUgc2FtZSBvdGhlcndpc2UuCisgKi8gICAKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAwKQorCisvKiBkZWZpbmUgbG9jYWwgdmFyaWFibGUgZm9yIGFyZyAqLworI2RlZmluZSBBUkdfREVGKEFSR190eXBlLCBBUkdfbmFtZSlcCisJQVJHX3R5cGUgKkFSR19uYW1lID0gYXJnOworLyogY29weSBhcmcgdG8gbG9jYWwgdmFyaWFibGUgKi8JCisjZGVmaW5lIEFSR19JTihBUkdfbmFtZSkgLyogbm90aGluZyAqLworLyogYXJndW1lbnQgaXRzZWxmIChyZWZlcmVuY2VkKSAqLworI2RlZmluZSBBUkdSKEFSR19uYW1lKSAoKkFSR19uYW1lKQorLyogYXJndW1lbnQgYWRkcmVzcyAqLworI2RlZmluZSBBUkdBKEFSR19uYW1lKSBBUkdfbmFtZQorLyogY29weSBsb2NhbCB2YXJpYWJsZSB0byBhcmcgKi8KKyNkZWZpbmUgQVJHX09VVChBUkdfbmFtZSkgLyogbm90aGluZyAqLworCisjZWxzZQorCisjZGVmaW5lIEFSR19ERUYoQVJHX3R5cGUsIEFSR19uYW1lKVwKKwlBUkdfdHlwZSBBUkdfbmFtZTsKKyNkZWZpbmUgQVJHX0lOKEFSR19uYW1lKVwKKwlpZiAoY29weV9mcm9tX3VzZXIoJkFSR19uYW1lLCBhcmcsIHNpemVvZihBUkdfbmFtZSkpKSB7XAorCQlyZXQgPSAtRUZBVUxUO1wKKwkJYnJlYWs7XAorCX0KKyNkZWZpbmUgQVJHUihBUkdfbmFtZSkgQVJHX25hbWUKKyNkZWZpbmUgQVJHQShBUkdfbmFtZSkgJkFSR19uYW1lCisjZGVmaW5lIEFSR19PVVQoQVJHX25hbWUpXAorCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmQVJHX25hbWUsIHNpemVvZihBUkdfbmFtZSkpKSB7XAorCQlyZXQgPSAtRUZBVUxUO1wKKwkJYnJlYWs7XAorCX0KKworI2VuZGlmCisKK2ludCBwd2NfaW9jdGwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFZJRElPQ1BXQ1JVU0VSOgorCXsKKwkJaWYgKHB3Y19yZXN0b3JlX3VzZXIocGRldikpCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJCisJY2FzZSBWSURJT0NQV0NTVVNFUjoKKwl7CisJCWlmIChwd2Nfc2F2ZV91c2VyKHBkZXYpKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCQkKKwljYXNlIFZJRElPQ1BXQ0ZBQ1RPUlk6CisJeworCQlpZiAocHdjX3Jlc3RvcmVfZmFjdG9yeShwZGV2KSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ1BXQ1NDUVVBTDoKKwl7CQorCQlBUkdfREVGKGludCwgcXVhbCkKKworCQlBUkdfSU4ocXVhbCkKKwkJaWYgKEFSR1IocXVhbCkgPCAwIHx8IEFSR1IocXVhbCkgPiAzKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJZWxzZQorCQkJcmV0ID0gcHdjX3RyeV92aWRlb19tb2RlKHBkZXYsIHBkZXYtPnZpZXcueCwgcGRldi0+dmlldy55LCBwZGV2LT52ZnJhbWVzLCBBUkdSKHF1YWwpLCBwZGV2LT52c25hcHNob3QpOworCQlpZiAocmV0ID49IDApCisJCQlwZGV2LT52Y29tcHJlc3Npb24gPSBBUkdSKHF1YWwpOworCQlicmVhazsKKwl9CisJCisJY2FzZSBWSURJT0NQV0NHQ1FVQUw6CisJeworCQlBUkdfREVGKGludCwgcXVhbCkKKwkJCisJCUFSR1IocXVhbCkgPSBwZGV2LT52Y29tcHJlc3Npb247CisJCUFSR19PVVQocXVhbCkKKwkJYnJlYWs7CisJfQorCQorCWNhc2UgVklESU9DUFdDUFJPQkU6CisJeworCQlBUkdfREVGKHN0cnVjdCBwd2NfcHJvYmUsIHByb2JlKQorCQkKKwkJc3RyY3B5KEFSR1IocHJvYmUpLm5hbWUsIHBkZXYtPnZkZXYtPm5hbWUpOworCQlBUkdSKHByb2JlKS50eXBlID0gcGRldi0+dHlwZTsKKwkJQVJHX09VVChwcm9iZSkKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NQV0NHU0VSSUFMOgorCXsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3NlcmlhbCwgc2VyaWFsKQorCQkKKwkJc3RyY3B5KEFSR1Ioc2VyaWFsKS5zZXJpYWwsIHBkZXYtPnNlcmlhbCk7CisJCUFSR19PVVQoc2VyaWFsKQorCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1BXQ1NBR0M6CisJeworCQlBUkdfREVGKGludCwgYWdjKQorCisJCUFSR19JTihhZ2MpCisJCWlmIChwd2Nfc2V0X2FnYyhwZGV2LCBBUkdSKGFnYykgPCAwID8gMSA6IDAsIEFSR1IoYWdjKSkpCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJCisJY2FzZSBWSURJT0NQV0NHQUdDOgorCXsKKwkJQVJHX0RFRihpbnQsIGFnYykKKwkJCisJCWlmIChwd2NfZ2V0X2FnYyhwZGV2LCBBUkdBKGFnYykpKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJQVJHX09VVChhZ2MpCisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ1BXQ1NTSFVUVEVSOgorCXsKKwkJQVJHX0RFRihpbnQsIHNodXR0ZXJfc3BlZWQpCisKKwkJQVJHX0lOKHNodXR0ZXJfc3BlZWQpCisJCXJldCA9IHB3Y19zZXRfc2h1dHRlcl9zcGVlZChwZGV2LCBBUkdSKHNodXR0ZXJfc3BlZWQpIDwgMCA/IDEgOiAwLCBBUkdSKHNodXR0ZXJfc3BlZWQpKTsKKwkJYnJlYWs7CisJfQorCQorICAgICAgICBjYXNlIFZJRElPQ1BXQ1NBV0I6CisJeworCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlLCB3YikKKwkJCisJCUFSR19JTih3YikKKwkJcmV0ID0gcHdjX3NldF9hd2IocGRldiwgQVJHUih3YikubW9kZSk7CisJCWlmIChyZXQgPj0gMCAmJiBBUkdSKHdiKS5tb2RlID09IFBXQ19XQl9NQU5VQUwpIHsKKwkJCXB3Y19zZXRfcmVkX2dhaW4ocGRldiwgQVJHUih3YikubWFudWFsX3JlZCk7CisJCQlwd2Nfc2V0X2JsdWVfZ2FpbihwZGV2LCBBUkdSKHdiKS5tYW51YWxfYmx1ZSk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NQV0NHQVdCOgorCXsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSwgd2IpCisKKwkJbWVtc2V0KEFSR0Eod2IpLCAwLCBzaXplb2Yoc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UpKTsKKwkJQVJHUih3YikubW9kZSA9IHB3Y19nZXRfYXdiKHBkZXYpOworCQlpZiAoQVJHUih3YikubW9kZSA8IDApCisJCQlyZXQgPSAtRUlOVkFMOworCQllbHNlIHsKKwkJCWlmIChBUkdSKHdiKS5tb2RlID09IFBXQ19XQl9NQU5VQUwpIHsKKwkJCQlyZXQgPSBwd2NfZ2V0X3JlZF9nYWluKHBkZXYsICZBUkdSKHdiKS5tYW51YWxfcmVkKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJcmV0ID0gcHdjX2dldF9ibHVlX2dhaW4ocGRldiwgJkFSR1Iod2IpLm1hbnVhbF9ibHVlKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoQVJHUih3YikubW9kZSA9PSBQV0NfV0JfQVVUTykgeworCQkJCXJldCA9IHB3Y19yZWFkX3JlZF9nYWluKHBkZXYsICZBUkdSKHdiKS5yZWFkX3JlZCk7CisJCQkJaWYgKHJldCA8IDApCisJCQkJCWJyZWFrOworIAkJCQlyZXQgPXB3Y19yZWFkX2JsdWVfZ2FpbihwZGV2LCAmQVJHUih3YikucmVhZF9ibHVlKTsKKyAJCQkJaWYgKHJldCA8IDApCisgCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlBUkdfT1VUKHdiKQorCQlicmVhazsKKwl9CisJCisJY2FzZSBWSURJT0NQV0NTQVdCU1BFRUQ6CisJeworCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2Jfc3BlZWQsIHdicykKKwkJCisJCWlmIChBUkdSKHdicykuY29udHJvbF9zcGVlZCA+IDApIHsKKwkJCXJldCA9IHB3Y19zZXRfd2Jfc3BlZWQocGRldiwgQVJHUih3YnMpLmNvbnRyb2xfc3BlZWQpOworCQl9CisJCWlmIChBUkdSKHdicykuY29udHJvbF9kZWxheSA+IDApIHsKKwkJCXJldCA9IHB3Y19zZXRfd2JfZGVsYXkocGRldiwgQVJHUih3YnMpLmNvbnRyb2xfZGVsYXkpOworCQl9CisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ1BXQ0dBV0JTUEVFRDoKKwl7CisJCUFSR19ERUYoc3RydWN0IHB3Y193Yl9zcGVlZCwgd2JzKQorCQkKKwkJcmV0ID0gcHdjX2dldF93Yl9zcGVlZChwZGV2LCAmQVJHUih3YnMpLmNvbnRyb2xfc3BlZWQpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlyZXQgPSBwd2NfZ2V0X3diX2RlbGF5KHBkZXYsICZBUkdSKHdicykuY29udHJvbF9kZWxheSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCUFSR19PVVQod2JzKQorCQlicmVhazsKKwl9CisKKyAgICAgICAgY2FzZSBWSURJT0NQV0NTTEVEOgorCXsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX2xlZHMsIGxlZHMpCisKKwkJQVJHX0lOKGxlZHMpCisJCXJldCA9IHB3Y19zZXRfbGVkcyhwZGV2LCBBUkdSKGxlZHMpLmxlZF9vbiwgQVJHUihsZWRzKS5sZWRfb2ZmKTsKKwkgICAgCWJyZWFrOworCX0KKworCisJY2FzZSBWSURJT0NQV0NHTEVEOgorCXsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX2xlZHMsIGxlZHMpCisJCQorCQlyZXQgPSBwd2NfZ2V0X2xlZHMocGRldiwgJkFSR1IobGVkcykubGVkX29uLCAmQVJHUihsZWRzKS5sZWRfb2ZmKTsKKwkJQVJHX09VVChsZWRzKQorCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1BXQ1NDT05UT1VSOgorCXsKKwkJQVJHX0RFRihpbnQsIGNvbnRvdXIpCisKKwkJQVJHX0lOKGNvbnRvdXIpCisJCXJldCA9IHB3Y19zZXRfY29udG91cihwZGV2LCBBUkdSKGNvbnRvdXIpKTsKKwkJYnJlYWs7CisJfQorCQkJCisJY2FzZSBWSURJT0NQV0NHQ09OVE9VUjoKKwl7CisJCUFSR19ERUYoaW50LCBjb250b3VyKQorCQkKKwkJcmV0ID0gcHdjX2dldF9jb250b3VyKHBkZXYsIEFSR0EoY29udG91cikpOworCQlBUkdfT1VUKGNvbnRvdXIpCisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ1BXQ1NCQUNLTElHSFQ6CisJeworCQlBUkdfREVGKGludCwgYmFja2xpZ2h0KQorCQkKKwkJQVJHX0lOKGJhY2tsaWdodCkKKwkJcmV0ID0gcHdjX3NldF9iYWNrbGlnaHQocGRldiwgQVJHUihiYWNrbGlnaHQpKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NQV0NHQkFDS0xJR0hUOgorCXsKKwkJQVJHX0RFRihpbnQsIGJhY2tsaWdodCkKKwkJCisJCXJldCA9IHB3Y19nZXRfYmFja2xpZ2h0KHBkZXYsIEFSR0EoYmFja2xpZ2h0KSk7CisJCUFSR19PVVQoYmFja2xpZ2h0KQorCQlicmVhazsKKwl9CisJCisJY2FzZSBWSURJT0NQV0NTRkxJQ0tFUjoKKwl7CisJCUFSR19ERUYoaW50LCBmbGlja2VyKQorCQkKKwkJQVJHX0lOKGZsaWNrZXIpCisJCXJldCA9IHB3Y19zZXRfZmxpY2tlcihwZGV2LCBBUkdSKGZsaWNrZXIpKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NQV0NHRkxJQ0tFUjoKKwl7CisJCUFSR19ERUYoaW50LCBmbGlja2VyKQorCQkKKwkJcmV0ID0gcHdjX2dldF9mbGlja2VyKHBkZXYsIEFSR0EoZmxpY2tlcikpOworCQlBUkdfT1VUKGZsaWNrZXIpCisJCWJyZWFrOworCX0KKwkKKwljYXNlIFZJRElPQ1BXQ1NEWU5OT0lTRToKKwl7CisJCUFSR19ERUYoaW50LCBkeW5ub2lzZSkKKwkJCisJCUFSR19JTihkeW5ub2lzZSkKKwkJcmV0ID0gcHdjX3NldF9keW5hbWljX25vaXNlKHBkZXYsIEFSR1IoZHlubm9pc2UpKTsKKwkJYnJlYWs7CisJfQorCQorCWNhc2UgVklESU9DUFdDR0RZTk5PSVNFOgorCXsKKwkJQVJHX0RFRihpbnQsIGR5bm5vaXNlKQorCisJCXJldCA9IHB3Y19nZXRfZHluYW1pY19ub2lzZShwZGV2LCBBUkdBKGR5bm5vaXNlKSk7CisJCUFSR19PVVQoZHlubm9pc2UpOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ1BXQ0dSRUFMU0laRToKKwl7CisJCUFSR19ERUYoc3RydWN0IHB3Y19pbWFnZXNpemUsIHNpemUpCisJCQorCQlBUkdSKHNpemUpLndpZHRoID0gcGRldi0+aW1hZ2UueDsKKwkJQVJHUihzaXplKS5oZWlnaHQgPSBwZGV2LT5pbWFnZS55OworCQlBUkdfT1VUKHNpemUpCisJCWJyZWFrOworIAl9CisgCQorIAljYXNlIFZJRElPQ1BXQ01QVFJFU0VUOgorIAl7CisgCQlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCisgCQl7CisJIAkJQVJHX0RFRihpbnQsIGZsYWdzKQorCisgCQkJQVJHX0lOKGZsYWdzKQorCQkJcmV0ID0gcHdjX21wdF9yZXNldChwZGV2LCBBUkdSKGZsYWdzKSk7CisgCQkJaWYgKHJldCA+PSAwKQorIAkJCXsKKyAJCQkJcGRldi0+cGFuX2FuZ2xlID0gMDsKKyAJCQkJcGRldi0+dGlsdF9hbmdsZSA9IDA7CisgCQkJfQorIAkJfQorIAkJZWxzZQorIAkJeworIAkJCXJldCA9IC1FTlhJTzsKKyAJCX0KKyAJCWJyZWFrOwkJCisgCX0KKyAJCisgCWNhc2UgVklESU9DUFdDTVBUR1JBTkdFOgorIAl7CisgCQlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCisgCQl7CisgCQkJQVJHX0RFRihzdHJ1Y3QgcHdjX21wdF9yYW5nZSwgcmFuZ2UpCisgCQkJCisgCQkJQVJHUihyYW5nZSkgPSBwZGV2LT5hbmdsZV9yYW5nZTsKKyAJCQlBUkdfT1VUKHJhbmdlKQorIAkJfQorIAkJZWxzZQorIAkJewkKKyAJCQlyZXQgPSAtRU5YSU87CisgCQl9CisgCQlicmVhazsKKyAJfQorIAkKKyAJY2FzZSBWSURJT0NQV0NNUFRTQU5HTEU6CisgCXsKKyAJCWludCBuZXdfcGFuLCBuZXdfdGlsdDsKKyAJCQorIAkJaWYgKHBkZXYtPmZlYXR1cmVzICYgRkVBVFVSRV9NT1RPUl9QQU5USUxUKQorIAkJeworCSAJCUFSR19ERUYoc3RydWN0IHB3Y19tcHRfYW5nbGVzLCBhbmdsZXMpCisKKwkgCQlBUkdfSU4oYW5nbGVzKQorCQkJLyogVGhlIGNhbWVyYSBjYW4gb25seSBzZXQgcmVsYXRpdmUgYW5nbGVzLCBzbworCQkJICAgZG8gc29tZSBjYWxjdWxhdGlvbnMgd2hlbiBnZXR0aW5nIGFuIGFic29sdXRlIGFuZ2xlIC4KKwkJCSAqLworCQkJaWYgKEFSR1IoYW5nbGVzKS5hYnNvbHV0ZSkKKwkJCXsKKyAJCQkJbmV3X3BhbiAgPSBBUkdSKGFuZ2xlcykucGFuOyAKKyAJCQkJbmV3X3RpbHQgPSBBUkdSKGFuZ2xlcykudGlsdDsKKyAJCQl9CisgCQkJZWxzZQorIAkJCXsKKyAJCQkJbmV3X3BhbiAgPSBwZGV2LT5wYW5fYW5nbGUgICsgQVJHUihhbmdsZXMpLnBhbjsKKyAJCQkJbmV3X3RpbHQgPSBwZGV2LT50aWx0X2FuZ2xlICsgQVJHUihhbmdsZXMpLnRpbHQ7CisJCQl9CisJCQkvKiBjaGVjayBhYnNvbHV0ZSByYW5nZXMgKi8KKwkJCWlmIChuZXdfcGFuICA8IHBkZXYtPmFuZ2xlX3JhbmdlLnBhbl9taW4gIHx8CisJCQkgICAgbmV3X3BhbiAgPiBwZGV2LT5hbmdsZV9yYW5nZS5wYW5fbWF4ICB8fAorCQkJICAgIG5ld190aWx0IDwgcGRldi0+YW5nbGVfcmFuZ2UudGlsdF9taW4gfHwKKwkJCSAgICBuZXdfdGlsdCA+IHBkZXYtPmFuZ2xlX3JhbmdlLnRpbHRfbWF4KQorCQkJeworCQkJCXJldCA9IC1FUkFOR0U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogZ28gdG8gcmVsYXRpdmUgcmFuZ2UsIGNoZWNrIGFnYWluICovCisJCQkJbmV3X3BhbiAgLT0gcGRldi0+cGFuX2FuZ2xlOworCQkJCW5ld190aWx0IC09IHBkZXYtPnRpbHRfYW5nbGU7CisJCQkJLyogYW5nbGVzIGFyZSBzcGVjaWZpZWQgaW4gZGVncmVlcyAqIDEwMCwgdGh1cyB0aGUgbGltaXQgPSAzNjAwMCAqLworCQkJCWlmIChuZXdfcGFuIDwgLTM2MDAwIHx8IG5ld19wYW4gPiAzNjAwMCB8fCBuZXdfdGlsdCA8IC0zNjAwMCB8fCBuZXdfdGlsdCA+IDM2MDAwKQorCQkJCQlyZXQgPSAtRVJBTkdFOworCQkJfQorCQkJaWYgKHJldCA9PSAwKSAvKiBubyBlcnJvcnMgc28gZmFyICovCisJCQl7CisJCQkJcmV0ID0gcHdjX21wdF9zZXRfYW5nbGUocGRldiwgbmV3X3BhbiwgbmV3X3RpbHQpOworCQkJCWlmIChyZXQgPj0gMCkKKwkJCQl7CisJCQkJCXBkZXYtPnBhbl9hbmdsZSAgKz0gbmV3X3BhbjsKKwkJCQkJcGRldi0+dGlsdF9hbmdsZSArPSBuZXdfdGlsdDsKKwkJCQl9CisJCQkJaWYgKHJldCA9PSAtRVBJUEUpIC8qIHN0YWxsIC0+IG91dCBvZiByYW5nZSAqLworCQkJCQlyZXQgPSAtRVJBTkdFOwkJCQkKKwkJCX0KKyAJCX0KKyAJCWVsc2UKKyAJCXsKKyAJCQlyZXQgPSAtRU5YSU87CisgCQl9CisgCQlicmVhazsKKyAJfQorCisgCWNhc2UgVklESU9DUFdDTVBUR0FOR0xFOgorIAl7CisgCQkKKyAJCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKKyAJCXsKKwkgCQlBUkdfREVGKHN0cnVjdCBwd2NfbXB0X2FuZ2xlcywgYW5nbGVzKQorCisgCQkJQVJHUihhbmdsZXMpLmFic29sdXRlID0gMTsKKyAJCQlBUkdSKGFuZ2xlcykucGFuICA9IHBkZXYtPnBhbl9hbmdsZTsKKyAJCQlBUkdSKGFuZ2xlcykudGlsdCA9IHBkZXYtPnRpbHRfYW5nbGU7CisgCQkJQVJHX09VVChhbmdsZXMpCisgCQl9CisgCQllbHNlCisgCQl7CisgCQkJcmV0ID0gLUVOWElPOworIAkJfQorIAkJYnJlYWs7CisgCX0KKyAKKyAJY2FzZSBWSURJT0NQV0NNUFRTVEFUVVM6CisgCXsKKyAJCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKKyAJCXsKKyAJCQlBUkdfREVGKHN0cnVjdCBwd2NfbXB0X3N0YXR1cywgc3RhdHVzKQorIAkJCQorIAkJCXJldCA9IHB3Y19tcHRfZ2V0X3N0YXR1cyhwZGV2LCBBUkdBKHN0YXR1cykpOworIAkJCUFSR19PVVQoc3RhdHVzKQorIAkJfQorIAkJZWxzZQorIAkJeworIAkJCXJldCA9IC1FTlhJTzsKKyAJCX0KKyAJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DUFdDR1ZJRENNRDoKKwl7CisJCUFSR19ERUYoc3RydWN0IHB3Y192aWRlb19jb21tYW5kLCBjbWQpOworCQkKKyAgICAgICAgICAgICAgICBBUkdSKGNtZCkudHlwZSA9IHBkZXYtPnR5cGU7CisJCUFSR1IoY21kKS5yZWxlYXNlID0gcGRldi0+cmVsZWFzZTsKKwkJQVJHUihjbWQpLmNvbW1hbmRfbGVuID0gcGRldi0+Y21kX2xlbjsKKwkJbWVtY3B5KCZBUkdSKGNtZCkuY29tbWFuZF9idWYsIHBkZXYtPmNtZF9idWYsIHBkZXYtPmNtZF9sZW4pOworCQlBUkdSKGNtZCkuYmFuZGxlbmd0aCA9IHBkZXYtPnZiYW5kbGVuZ3RoOworCQlBUkdSKGNtZCkuZnJhbWVfc2l6ZSA9IHBkZXYtPmZyYW1lX3NpemU7CisJCUFSR19PVVQoY21kKQorCQlicmVhazsKKwl9CisgICAgICAgLyoKKwljYXNlIFZJRElPQ1BXQ0dWSURUQUJMRToKKwl7CisJCUFSR19ERUYoc3RydWN0IHB3Y190YWJsZV9pbml0X2J1ZmZlciwgdGFibGUpOworCQlBUkdSKHRhYmxlKS5sZW4gPSBwZGV2LT5jbWRfbGVuOworCQltZW1jcHkoJkFSR1IodGFibGUpLmJ1ZmZlciwgcGRldi0+ZGVjb21wcmVzc19kYXRhLCBwZGV2LT5kZWNvbXByZXNzb3ItPnRhYmxlX3NpemUpOworCQlBUkdfT1VUKHRhYmxlKQorCQlicmVhazsKKwl9CisJKi8KKworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCQorCWlmIChyZXQgPiAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1kZWMxLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWRlYzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2QwM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1kZWMxLmMKQEAgLTAsMCArMSw0MiBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgRGVjb21wcmVzc2lvbiBmb3IgY2hpcHNldCB2ZXJzaW9uIDEKKyAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorCisgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKKyAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgorICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgorICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCisgICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworCisKKyNpbmNsdWRlICJwd2MtZGVjMS5oIgorCisKK3ZvaWQgcHdjX2RlYzFfaW5pdChpbnQgdHlwZSwgaW50IHJlbGVhc2UsIHZvaWQgKmJ1ZmZlciwgdm9pZCAqdGFibGUpCit7CisKK30KKwordm9pZCBwd2NfZGVjMV9leGl0KHZvaWQpCit7CisKKworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtZGVjMS5oIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1kZWMxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmZmQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtZGVjMS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KKyAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorCisgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKKyAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgorICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgorICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCisgICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworCisKKyNpZm5kZWYgUFdDX0RFQzFfSAorI2RlZmluZSBQV0NfREVDMV9ICisKK3ZvaWQgcHdjX2RlYzFfaW5pdChpbnQgdHlwZSwgaW50IHJlbGVhc2UsIHZvaWQgKmJ1ZmZlciwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK3ZvaWQgcHdjX2RlYzFfZXhpdCh2b2lkKTsKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWRlYzIzLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWRlYzIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmYTNmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtZGVjMjMuYwpAQCAtMCwwICsxLDYyMyBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgRGVjb21wcmVzc2lvbiBmb3IgY2hpcHNldCB2ZXJzaW9uIDIgZXQgMworICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaW5jbHVkZSAicHdjLXRpbW9uLmgiCisjaW5jbHVkZSAicHdjLWtpYXJhLmgiCisjaW5jbHVkZSAicHdjLWRlYzIzLmgiCisjaW5jbHVkZSAicHdjLWlvY3RsLmgiCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworLyoqKioKKyAqCisgKgorICoKKyAqLworCisKK3N0YXRpYyB2b2lkIGZpbGxfdGFibGVfYTAwMCh1bnNpZ25lZCBpbnQgKnApCit7CisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdGlhbF92YWx1ZXNbMTJdID0geworICAgICAweEZGQUQ5QjAwLCAweEZGRERFRTAwLCAweDAwMjIxMjAwLCAweDAwNTI2NTAwLAorICAgICAweEZGQzIxRTAwLCAweDAwM0RFMjAwLCAweEZGOTI0QjgwLCAweEZGRDJBMzAwLAorICAgICAweDAwMkQ1RDAwLCAweDAwNkRCNDgwLCAweEZGRUQzRTAwLCAweDAwMTJDMjAwCisgIH07CisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmFsdWVzX2Rlcml2YXRlZFsxMl0gPSB7CisgICAgIDB4MDAwMEE0Q0EsIDB4MDAwMDQ0MjQsIDB4RkZGRkJCREMsIDB4RkZGRjVCMzYsCisgICAgIDB4MDAwMDdCQzQsIDB4RkZGRjg0M0MsIDB4MDAwMERCNjksIDB4MDAwMDVBQkEsCisgICAgIDB4RkZGRkE1NDYsIDB4RkZGRjI0OTcsIDB4MDAwMDI1ODQsIDB4RkZGRkRBN0MKKyAgfTsKKyAgdW5zaWduZWQgaW50IHRlbXBfdmFsdWVzWzEyXTsKKyAgaW50IGksajsKKworICBtZW1jcHkodGVtcF92YWx1ZXMsaW5pdGlhbF92YWx1ZXMsc2l6ZW9mKGluaXRpYWxfdmFsdWVzKSk7CisgIGZvciAoaT0wO2k8MjU2O2krKykKKyAgIHsKKyAgICAgZm9yIChqPTA7ajwxMjtqKyspCisgICAgICB7CisJKnArKyA9IHRlbXBfdmFsdWVzW2pdOworCXRlbXBfdmFsdWVzW2pdICs9IHZhbHVlc19kZXJpdmF0ZWRbal07CisgICAgICB9CisgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfdGFibGVfZDAwMCh1bnNpZ25lZCBjaGFyICpwKQoreworICBpbnQgYml0LGJ5dGU7CisKKyAgZm9yIChiaXQ9MDsgYml0PDg7IGJpdCsrKQorICAgeworICAgICB1bnNpZ25lZCBjaGFyIGJpdHBvd2VyID0gMTw8Yml0OworICAgICB1bnNpZ25lZCBjaGFyIG1hc2sgPSBiaXRwb3dlci0xOworICAgICBmb3IgKGJ5dGU9MDsgYnl0ZTwyNTY7IGJ5dGUrKykKKyAgICAgIHsKKwlpZiAoYnl0ZSAmIGJpdHBvd2VyKQorCSAgKnArKyA9IC0oYnl0ZSAmIG1hc2spOworCWVsc2UKKwkgICpwKysgPSAoYnl0ZSAmIG1hc2spOworICAgICAgfQorICAgfQorfQorCisvKgorICoKKyAqIEtpYXJhOiAwIDw9IHZlciA8PSA3CisgKiBUaW1vbjogMCA8PSB2ZXIgPD0gMTUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGZpbGxfdGFibGVfY29sb3IodW5zaWduZWQgaW50IHZlcnNpb24sIGNvbnN0IHVuc2lnbmVkIGludCAqcm9tdGFibGUsIAorICAgIHVuc2lnbmVkIGNoYXIgKnAwMDA0LCAKKyAgICB1bnNpZ25lZCBjaGFyICpwODAwNCkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50ICp0YWJsZTsKKyAgdW5zaWduZWQgY2hhciAqcDAsICpwODsKKyAgaW50IGksaixrOworICBpbnQgZGwsYml0LHB3OworCisgIHJvbXRhYmxlICs9IHZlcnNpb24qMjU2OworCisgIGZvciAoaT0wOyBpPDI7IGkrKykKKyAgIHsKKyAgICAgdGFibGUgPSByb210YWJsZSArIGkqMTI4OworCisgICAgIGZvciAoZGw9MDsgZGw8MTY7IGRsKyspCisgICAgICB7CisJcDAgPSBwMDAwNCArIChpPDwxNCkgKyAoZGw8PDEwKTsKKwlwOCA9IHA4MDA0ICsgKGk8PDEyKSArIChkbDw8OCk7CisKKwlmb3IgKGo9MDsgajw4OyBqKysgLCB0YWJsZSsrLCBwMCs9MTI4KQorCSB7CisJICAgZm9yIChrPTA7IGs8MTY7IGsrKykKKwkgICAgeworCSAgICAgIGlmIChrPT0wKQorCQliaXQ9MTsKKwkgICAgICBlbHNlIGlmIChrPj0xICYmIGs8MykKKwkJYml0PSh0YWJsZVswXT4+MTUpJjc7CisJICAgICAgZWxzZSBpZiAoaz49MyAmJiBrPDYpCisJCWJpdD0odGFibGVbMF0+PjEyKSY3OworCSAgICAgIGVsc2UgaWYgKGs+PTYgJiYgazwxMCkKKwkJYml0PSh0YWJsZVswXT4+OSkmNzsKKwkgICAgICBlbHNlIGlmIChrPj0xMCAmJiBrPDEzKQorCQliaXQ9KHRhYmxlWzBdPj42KSY3OworCSAgICAgIGVsc2UgaWYgKGs+PTEzICYmIGs8MTUpCisJCWJpdD0odGFibGVbMF0+PjMpJjc7CisJICAgICAgZWxzZQorCQliaXQ9KHRhYmxlWzBdKSY3OworCSAgICAgIGlmIChrID09IDApCisJCSoodW5zaWduZWQgY2hhciAqKXA4KysgPSA4OworCSAgICAgIGVsc2UKKwkJKih1bnNpZ25lZCBjaGFyICopcDgrKyA9IGogLSBiaXQ7CisJICAgICAgKih1bnNpZ25lZCBjaGFyICopcDgrKyA9IGJpdDsKKworCSAgICAgIHB3ID0gMTw8Yml0OworCSAgICAgIHAwW2srMHgwMF0gPSAoMSpwdykgICsgMHg4MDsKKwkgICAgICBwMFtrKzB4MTBdID0gKDIqcHcpICArIDB4ODA7CisJICAgICAgcDBbaysweDIwXSA9ICgzKnB3KSAgKyAweDgwOworCSAgICAgIHAwW2srMHgzMF0gPSAoNCpwdykgICsgMHg4MDsKKwkgICAgICBwMFtrKzB4NDBdID0gKC1wdykgICArIDB4ODA7CisJICAgICAgcDBbaysweDUwXSA9ICgyKi1wdykgKyAweDgwOworCSAgICAgIHAwW2srMHg2MF0gPSAoMyotcHcpICsgMHg4MDsKKwkgICAgICBwMFtrKzB4NzBdID0gKDQqLXB3KSArIDB4ODA7CisJICAgIH0gLyogZW5kIG9mIGZvciAoaz0wOyBrPDE2OyBrKyssIHA4KyspICovCisJIH0gLyogZW5kIG9mIGZvciAoaj0wOyBqPDg7IGorKyAsIHRhYmxlKyspICovCisgICAgICB9IC8qIGVuZCBvZiBmb3IgKGRsPTA7IGRsPDE2OyBkbCsrKSAqLworICAgfSAvKiBlbmQgb2YgZm9yIChpPTA7IGk8MjsgaSsrKSAqLworfQorCisvKgorICogcHJlY2lzaW9uID0gKHBkZXYtPnh4ICsgcGRldi0+eXkpCisgKgorICovCitzdGF0aWMgdm9pZCBmaWxsX3RhYmxlX2RjMDBfZDgwMCh1bnNpZ25lZCBpbnQgcHJlY2lzaW9uLCB1bnNpZ25lZCBpbnQgKnBkYzAwLCB1bnNpZ25lZCBpbnQgKnBkODAwKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgaW50IG9mZnNldDEsIG9mZnNldDI7CisgCisgIGZvcihpPTAsb2Zmc2V0MT0weDQwMDAsIG9mZnNldDI9MDsgaTwyNTYgOyBpKyssb2Zmc2V0MSs9MHg3QkM0LCBvZmZzZXQyKz0weDdCQzQpCisgICB7CisgICAgIHVuc2lnbmVkIGludCBtc2IgPSBvZmZzZXQxID4+IDE1OworCisgICAgIGlmICggbXNiID4gMjU1KQorICAgICAgeworCWlmIChtc2IpCisJICBtc2I9MDsKKwllbHNlCisJICBtc2I9MjU1OworICAgICAgfQorCisgICAgICpwZGMwMCsrID0gbXNiIDw8IHByZWNpc2lvbjsKKyAgICAgKnBkODAwKysgPSBvZmZzZXQyOworICAgfQorCit9CisKKy8qCisgKiBzdHJ1Y3QgeworICogICB1bnNpZ25lZCBjaGFyIG9wOwkgICAgLy8gb3BlcmF0aW9uIHRvIGV4ZWN1dGUKKyAqICAgdW5zaWduZWQgY2hhciBiaXRzOyAgICAvLyBiaXRzIHVzZSB0byBwZXJmb3JtIG9wZXJhdGlvbgorICogICB1bnNpZ25lZCBjaGFyIG9mZnNldDE7IC8vIG9mZnNldCB0byBhZGQgdG8gYWNjZXNzIGluIHRoZSB0YWJsZV8wMDA0ICUgMTYKKyAqICAgdW5zaWduZWQgY2hhciBvZmZzZXQyOyAvLyBvZmZzZXQgdG8gYWRkIHRvIGFjY2VzcyBpbiB0aGUgdGFibGVfMDAwNAorICogfQorICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB0YWJsZV9vcHNbXSA9IHsKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4MDAsIDB4MDAsMHgwNCwweDAxLDB4MTAsIDB4MDAsMHgwNiwweDAxLDB4MzAsCisweDAyLDB4MDAsMHgwMCwweDAwLCAweDAwLDB4MDMsMHgwMSwweDQwLCAweDAwLDB4MDUsMHgwMSwweDIwLCAweDAxLDB4MDAsMHgwMCwweDAwLAorMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHgwMCwgMHgwMCwweDA0LDB4MDEsMHg1MCwgMHgwMCwweDA1LDB4MDIsMHgwMCwKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4NDAsIDB4MDAsMHgwNSwweDAzLDB4MDAsIDB4MDEsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4MDAsMHgwMCwweDAwLCAweDAwLDB4MDMsMHgwMSwweDAwLCAweDAwLDB4MDQsMHgwMSwweDEwLCAweDAwLDB4MDYsMHgwMiwweDEwLAorMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHg0MCwgMHgwMCwweDA1LDB4MDEsMHg2MCwgMHgwMSwweDAwLDB4MDAsMHgwMCwKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4MDAsIDB4MDAsMHgwNCwweDAxLDB4NTAsIDB4MDAsMHgwNSwweDAyLDB4NDAsCisweDAyLDB4MDAsMHgwMCwweDAwLCAweDAwLDB4MDMsMHgwMSwweDQwLCAweDAwLDB4MDUsMHgwMywweDQwLCAweDAxLDB4MDAsMHgwMCwweDAwLAorMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHgwMCwgMHgwMCwweDA0LDB4MDEsMHgxMCwgMHgwMCwweDA2LDB4MDEsMHg3MCwKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4NDAsIDB4MDAsMHgwNSwweDAxLDB4MjAsIDB4MDEsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4MDAsMHgwMCwweDAwLCAweDAwLDB4MDMsMHgwMSwweDAwLCAweDAwLDB4MDQsMHgwMSwweDUwLCAweDAwLDB4MDUsMHgwMiwweDAwLAorMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHg0MCwgMHgwMCwweDA1LDB4MDMsMHgwMCwgMHgwMSwweDAwLDB4MDAsMHgwMCwKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4MDAsIDB4MDAsMHgwNCwweDAxLDB4MTAsIDB4MDAsMHgwNiwweDAyLDB4NTAsCisweDAyLDB4MDAsMHgwMCwweDAwLCAweDAwLDB4MDMsMHgwMSwweDQwLCAweDAwLDB4MDUsMHgwMSwweDYwLCAweDAxLDB4MDAsMHgwMCwweDAwLAorMHgwMiwweDAwLDB4MDAsMHgwMCwgMHgwMCwweDAzLDB4MDEsMHgwMCwgMHgwMCwweDA0LDB4MDEsMHg1MCwgMHgwMCwweDA1LDB4MDIsMHg0MCwKKzB4MDIsMHgwMCwweDAwLDB4MDAsIDB4MDAsMHgwMywweDAxLDB4NDAsIDB4MDAsMHgwNSwweDAzLDB4NDAsIDB4MDEsMHgwMCwweDAwLDB4MDAKK307CisKKy8qCisgKiBUT0RPOiBtdWx0aXBseSBieSA0IGFsbCB2YWx1ZXMKKyAqCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgTXVsSWR4WzI1Nl0gPSB7CisgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAwLCAxLCAyLCAzLCAwLCAxLCAyLCAzLCAwLCAxLCAyLCAzLCAwLCAxLCAyLCAzLAorIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsCisgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNCwgNCwgNCwgNCwKKyA2LCA3LCA4LCA5LCA3LDEwLDExLCA4LCA4LDExLDEwLCA3LCA5LCA4LCA3LCA2LAorIDQsIDUsIDUsIDQsIDQsIDUsIDUsIDQsIDQsIDUsIDUsIDQsIDQsIDUsIDUsIDQsCisgMSwgMywgMCwgMiwgMSwgMywgMCwgMiwgMSwgMywgMCwgMiwgMSwgMywgMCwgMiwKKyAwLCAzLCAzLCAwLCAxLCAyLCAyLCAxLCAyLCAxLCAxLCAyLCAzLCAwLCAwLCAzLAorIDAsIDEsIDIsIDMsIDMsIDIsIDEsIDAsIDMsIDIsIDEsIDAsIDAsIDEsIDIsIDMsCisgMSwgMSwgMSwgMSwgMywgMywgMywgMywgMCwgMCwgMCwgMCwgMiwgMiwgMiwgMiwKKyA3LDEwLDExLCA4LCA5LCA4LCA3LCA2LCA2LCA3LCA4LCA5LCA4LDExLDEwLCA3LAorIDQsIDUsIDUsIDQsIDUsIDQsIDQsIDUsIDUsIDQsIDQsIDUsIDQsIDUsIDUsIDQsCisgNywgOSwgNiwgOCwxMCwgOCwgNywxMSwxMSwgNywgOCwxMCwgOCwgNiwgOSwgNywKKyAxLCAzLCAwLCAyLCAyLCAwLCAzLCAxLCAyLCAwLCAzLCAxLCAxLCAzLCAwLCAyLAorIDEsIDIsIDIsIDEsIDMsIDAsIDAsIDMsIDAsIDMsIDMsIDAsIDIsIDEsIDEsIDIsCisxMCwgOCwgNywxMSwgOCwgNiwgOSwgNywgNywgOSwgNiwgOCwxMSwgNywgOCwxMAorfTsKKworCisKK3ZvaWQgcHdjX2RlYzIzX2luaXQoaW50IHR5cGUsIGludCByZWxlYXNlLCB1bnNpZ25lZCBjaGFyICptb2RlLCB2b2lkICpkYXRhKQoreworICBpbnQgZmxhZ3M7CisgIHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSAqcGRldiA9IGRhdGE7CisgIHJlbGVhc2UgPSByZWxlYXNlOworCisgIHN3aXRjaCAodHlwZSkKKyAgIHsKKyAgICBjYXNlIDcyMDoKKyAgICBjYXNlIDczMDoKKyAgICBjYXNlIDc0MDoKKyAgICBjYXNlIDc1MDoKKyAgICAgIGZsYWdzID0gbW9kZVsyXSYweDE4OwkvKiBvdXI6IGZsYWdzID0gOCwgbW9kZVsyXT09ZTggKi8KKyAgICAgIGlmIChmbGFncz09OCkKKwlwZGV2LT56eiA9IDc7CisgICAgICBlbHNlIGlmIChmbGFncz09MHgxMCkKKwlwZGV2LT56eiA9IDg7CisgICAgICBlbHNlCisJcGRldi0+enogPSA2OworICAgICAgZmxhZ3MgPSBtb2RlWzJdPj41OwkvKiBvdXI6IDcgKi8KKworICAgICAgZmlsbF90YWJsZV9jb2xvcihmbGFncywgKHVuc2lnbmVkIGludCAqKUtpYXJhUm9tVGFibGUsIHBkZXYtPnRhYmxlXzAwMDQsIHBkZXYtPnRhYmxlXzgwMDQpOworICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgNjc1OgorICAgIGNhc2UgNjgwOgorICAgIGNhc2UgNjkwOgorICAgICAgZmxhZ3MgPSBtb2RlWzJdJjY7CisgICAgICBpZiAoZmxhZ3M9PTIpCisJcGRldi0+enogPSA3OworICAgICAgZWxzZSBpZiAoZmxhZ3M9PTQpCisJcGRldi0+enogPSA4OworICAgICAgZWxzZQorCXBkZXYtPnp6ID0gNjsKKyAgICAgIGZsYWdzID0gbW9kZVsyXT4+MzsKKworICAgICAgZmlsbF90YWJsZV9jb2xvcihmbGFncywgKHVuc2lnbmVkIGludCAqKVRpbW9uUm9tVGFibGUsIHBkZXYtPnRhYmxlXzAwMDQsIHBkZXYtPnRhYmxlXzgwMDQpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogTm90IHN1cHBvcnRlZCAqLworICAgICAgcmV0dXJuOworICAgfQorCisgIC8qICogKiAqICoqICovCisgIHBkZXYtPnh4ID0gOCAtIHBkZXYtPnp6OworICBwZGV2LT55eSA9IDE1IC0gcGRldi0+eHg7CisgIHBkZXYtPnp6bWFzayA9IDB4RkY+PnBkZXYtPnh4OworICAvL3BkZXYtPnp6bWFzayA9ICgxVTw8cGRldi0+enopLTE7CisKKworICBmaWxsX3RhYmxlX2RjMDBfZDgwMChwZGV2LT54eCArIHBkZXYtPnl5LCBwZGV2LT50YWJsZV9kYzAwLCBwZGV2LT50YWJsZV9kODAwKTsKKyAgZmlsbF90YWJsZV9hMDAwKHBkZXYtPnRhYmxlX2EwMDQpOworICBmaWxsX3RhYmxlX2QwMDAocGRldi0+dGFibGVfZDAwNCk7Cit9CisKKworLyoKKyAqIFRvIG1hbmFnZSB0aGUgc3RyZWFtLCB3ZSBrZWVwIGluIGEgMzIgYml0cyB2YXJpYWJsZXMsCisgKiB0aGUgbmV4dCBiaXRzIGluIHRoZSBzdHJlYW0uIGZpbGxfcmVzZXJ2b2lyKCkgYWRkIHRvCisgKiB0aGUgcmVzZXJ2b2lyIGF0IGxlYXN0IHdhbnRlZCBuYml0cy4KKyAqCisgKgorICovCisjZGVmaW5lIGZpbGxfbmJpdHMocmVzZXJ2b2lyLG5iaXRzX2luX3Jlc2Vydm9pcixzdHJlYW0sbmJpdHNfd2FudGVkKSBkbyB7IFwKKyAgIHdoaWxlIChuYml0c19pbl9yZXNlcnZvaXI8bmJpdHNfd2FudGVkKSBcCisgICAgeyBcCisgICAgICByZXNlcnZvaXIgfD0gKCooc3RyZWFtKSsrKSA8PCBuYml0c19pbl9yZXNlcnZvaXI7IFwKKyAgICAgIG5iaXRzX2luX3Jlc2Vydm9pcis9ODsgXAorICAgIH0gXAorfSAgd2hpbGUoMCk7CisKKyNkZWZpbmUgZ2V0X25iaXRzKHJlc2Vydm9pcixuYml0c19pbl9yZXNlcnZvaXIsc3RyZWFtLG5iaXRzX3dhbnRlZCxyZXN1bHQpIGRvIHsgXAorICAgZmlsbF9uYml0cyhyZXNlcnZvaXIsbmJpdHNfaW5fcmVzZXJ2b2lyLHN0cmVhbSxuYml0c193YW50ZWQpOyBcCisgICByZXN1bHQgPSAocmVzZXJ2b2lyKSAmICgoMVU8PG5iaXRzX3dhbnRlZCktMSk7IFwKKyAgIHJlc2Vydm9pciA+Pj0gbmJpdHNfd2FudGVkOyBcCisgICBuYml0c19pbl9yZXNlcnZvaXIgLT0gbmJpdHNfd2FudGVkOyBcCit9ICB3aGlsZSgwKTsKKworCisKK3N0YXRpYyB2b2lkIERlY29tcHJlc3NCYW5kMjMoY29uc3Qgc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyYXd5dXYsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKnBsYW5hcl95LAorCQkJICAgICB1bnNpZ25lZCBjaGFyICpwbGFuYXJfdSwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqcGxhbmFyX3YsCisJCQkgICAgIHVuc2lnbmVkIGludCBpbWFnZV94LAkJLyogYWthIG51bWJlciBvZiBwaXhlbHMgd2FudGVkID8/PyAqLworCQkJICAgICB1bnNpZ25lZCBpbnQgcGl4ZWxzX3Blcl9saW5lLAkvKiBha2EgbnVtYmVyIG9mIHBpeGVscyBwZXIgbGluZSAqLworCQkJICAgICBpbnQgZmxhZ3MpCit7CisKKworICB1bnNpZ25lZCBpbnQgcmVzZXJ2b2lyLCBuYml0c19pbl9yZXNlcnZvaXI7CisgIGludCBmaXJzdF80X2JpdHM7CisgIHVuc2lnbmVkIGludCBieXRlc19wZXJfY2hhbm5lbDsKKyAgaW50IGxpbmVfc2l6ZTsJLyogc2l6ZSBvZiB0aGUgbGluZSAoNFkrVStWKSAqLworICBpbnQgcGFzc2VzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdGFibGUwMDA0LCAqcHRhYmxlODAwNDsKKworICBpbnQgZXZlbl9saW5lOworICB1bnNpZ25lZCBpbnQgdGVtcF9jb2xvcnNbMTZdOworICBpbnQgbmJsb2NrczsKKworICBjb25zdCB1bnNpZ25lZCBjaGFyICpzdHJlYW07CisgIHVuc2lnbmVkIGNoYXIgKmRlc3RfeSwgKmRlc3RfdT1OVUxMLCAqZGVzdF92PU5VTEw7CisgIHVuc2lnbmVkIGludCBvZmZzZXRfdG9fcGxhbmVfdSwgb2Zmc2V0X3RvX3BsYW5lX3Y7CisKKyAgaW50IGk7CisKKworICByZXNlcnZvaXIgPSAwOworICBuYml0c19pbl9yZXNlcnZvaXIgPSAwOworICBzdHJlYW0gPSByYXd5dXYrMTsJLyogVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHN0cmVhbSBpcyBza2lwcGVkICovCisgIGV2ZW5fbGluZSA9IDE7CisKKyAgZ2V0X25iaXRzKHJlc2Vydm9pcixuYml0c19pbl9yZXNlcnZvaXIsc3RyZWFtLDQsZmlyc3RfNF9iaXRzKTsKKworICBsaW5lX3NpemUgPSBwaXhlbHNfcGVyX2xpbmUqMzsKKworICBmb3IgKHBhc3Nlcz0wO3Bhc3NlczwyO3Bhc3NlcysrKQorICAgeworICAgICBpZiAocGFzc2VzPT0wKQorICAgICAgeworCWJ5dGVzX3Blcl9jaGFubmVsID0gcGl4ZWxzX3Blcl9saW5lOworCWRlc3RfeSA9IHBsYW5hcl95OworCW5ibG9ja3MgPSBpbWFnZV94LzQ7CisgICAgICB9CisgICAgIGVsc2UKKyAgICAgIHsKKwkvKiBGb3JtYXQgcGxhbmFyOiBBbGwgWSwgdGhlbiBhbGwgVSwgdGhlbiBhbGwgViAqLworCWJ5dGVzX3Blcl9jaGFubmVsID0gcGl4ZWxzX3Blcl9saW5lLzI7CisJZGVzdF91ID0gcGxhbmFyX3U7CisJZGVzdF92ID0gcGxhbmFyX3Y7CisJZGVzdF95ID0gZGVzdF91OworCW5ibG9ja3MgPSBpbWFnZV94Lzg7CisgICAgICB9CisKKyAgICAgb2Zmc2V0X3RvX3BsYW5lX3UgPSBieXRlc19wZXJfY2hhbm5lbCoyOworICAgICBvZmZzZXRfdG9fcGxhbmVfdiA9IGJ5dGVzX3Blcl9jaGFubmVsKjM7CisgICAgIC8qCisgICAgIHByaW50ZigiYnl0ZXNfcGVyX2NoYW5uZWwgPSAlZFxuIixieXRlc19wZXJfY2hhbm5lbCk7CisgICAgIHByaW50Zigib2Zmc2V0X3RvX3BsYW5lX3UgPSAlZFxuIixvZmZzZXRfdG9fcGxhbmVfdSk7CisgICAgIHByaW50Zigib2Zmc2V0X3RvX3BsYW5lX3YgPSAlZFxuIixvZmZzZXRfdG9fcGxhbmVfdik7CisgICAgICovCisKKyAgICAgd2hpbGUgKG5ibG9ja3MtLT4wKQorICAgICAgeworCXVuc2lnbmVkIGludCBncmF5X2luZGV4OworCisJZmlsbF9uYml0cyhyZXNlcnZvaXIsbmJpdHNfaW5fcmVzZXJ2b2lyLHN0cmVhbSwxNik7CisJZ3JheV9pbmRleCA9IHJlc2Vydm9pciAmIHBkZXYtPnp6bWFzazsKKwlyZXNlcnZvaXIgPj49IHBkZXYtPnp6OworCW5iaXRzX2luX3Jlc2Vydm9pciAtPSBwZGV2LT56ejsKKworCWZpbGxfbmJpdHMocmVzZXJ2b2lyLG5iaXRzX2luX3Jlc2Vydm9pcixzdHJlYW0sMik7CisKKwlpZiAoIChyZXNlcnZvaXIgJiAzKSA9PSAwKQorCSB7CisJICAgcmVzZXJ2b2lyPj49MjsKKwkgICBuYml0c19pbl9yZXNlcnZvaXItPTI7CisJICAgZm9yIChpPTA7aTwxNjtpKyspCisJICAgICB0ZW1wX2NvbG9yc1tpXSA9IHBkZXYtPnRhYmxlX2RjMDBbZ3JheV9pbmRleF07CisKKwkgfQorCWVsc2UKKwkgeworCSAgIHVuc2lnbmVkIGludCBjaGFubmVsX3YsIG9mZnNldDE7CisKKwkgICAvKiBzd2FwIGJpdCAwIGFuZCAyIG9mIG9mZnNldF9PUiAqLworCSAgIGNoYW5uZWxfdiA9ICgocmVzZXJ2b2lyICYgMSkgPDwgMikgfCAocmVzZXJ2b2lyICYgMikgfCAoKHJlc2Vydm9pciAmIDQpPj4yKTsKKwkgICByZXNlcnZvaXI+Pj0zOworCSAgIG5iaXRzX2luX3Jlc2Vydm9pci09MzsKKworCSAgIGZvciAoaT0wO2k8MTY7aSsrKQorCSAgICAgdGVtcF9jb2xvcnNbaV0gPSBwZGV2LT50YWJsZV9kODAwW2dyYXlfaW5kZXhdOworCisJICAgcHRhYmxlMDAwNCA9IHBkZXYtPnRhYmxlXzAwMDQgKyAocGFzc2VzKjE2Mzg0KSArIChmaXJzdF80X2JpdHMqMTAyNCkgKyAoY2hhbm5lbF92KjEyOCk7CisJICAgcHRhYmxlODAwNCA9IHBkZXYtPnRhYmxlXzgwMDQgKyAocGFzc2VzKjQwOTYpICArIChmaXJzdF80X2JpdHMqMjU2KSAgKyAoY2hhbm5lbF92KjMyKTsKKworCSAgIG9mZnNldDEgPSAwOworCSAgIHdoaWxlKDEpIAorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IGluZGV4X2luX3RhYmxlX29wcywgb3AsIHJvd3M9MDsKKwkgICAgICBmaWxsX25iaXRzKHJlc2Vydm9pcixuYml0c19pbl9yZXNlcnZvaXIsc3RyZWFtLDE2KTsKKworCSAgICAgIC8qIG1vZGUgaXMgMCwxIG9yIDIgKi8KKwkgICAgICBpbmRleF9pbl90YWJsZV9vcHMgPSAocmVzZXJ2b2lyJjB4M0YpOworCSAgICAgIG9wID0gdGFibGVfb3BzWyBpbmRleF9pbl90YWJsZV9vcHMqNCBdOworCSAgICAgIGlmIChvcCA9PSAyKQorCSAgICAgICB7CisJCSByZXNlcnZvaXIgPj49IDI7CisJCSBuYml0c19pbl9yZXNlcnZvaXIgLT0gMjsKKwkJIGJyZWFrOwkvKiBleGl0IHRoZSB3aGlsZSgxKSAqLworCSAgICAgICB9CisJICAgICAgaWYgKG9wID09IDApCisJICAgICAgIHsKKwkJIHVuc2lnbmVkIGludCBzaGlmdDsKKworCQkgb2Zmc2V0MSA9IChvZmZzZXQxICsgdGFibGVfb3BzW2luZGV4X2luX3RhYmxlX29wcyo0KzJdKSAmIDB4MEY7CisJCSBzaGlmdCA9IHRhYmxlX29wc1sgaW5kZXhfaW5fdGFibGVfb3BzKjQrMSBdOworCQkgcmVzZXJ2b2lyID4+PSBzaGlmdDsKKwkJIG5iaXRzX2luX3Jlc2Vydm9pciAtPSBzaGlmdDsKKwkJIHJvd3MgPSBwdGFibGUwMDA0WyBvZmZzZXQxICsgdGFibGVfb3BzW2luZGV4X2luX3RhYmxlX29wcyo0KzNdIF07CisJICAgICAgIH0KKwkgICAgICBpZiAob3AgPT0gMSkKKwkgICAgICAgeworCQkgIC8qIDEwYml0cyBbIHh4eHggeHh4eCB5eXl5IDAwMCBdCisJCSAgICogeXl5ID0+IG9mZnNldCBpbiB0aGUgdGFibGU4MDA0CisJCSAgICogeHh4ID0+IG9mZnNldCBpbiB0aGUgdGFibGVkMDA0CisJCSAgICovCisJCSB1bnNpZ25lZCBpbnQgbWFzaywgc2hpZnQ7CisJCSB1bnNpZ25lZCBpbnQgY29sMSwgcm93MSwgdG90YWxfYml0czsKKworCQkgb2Zmc2V0MSA9IChvZmZzZXQxICsgKChyZXNlcnZvaXI+PjMpJjB4MEYpKzEpICYgMHgwRjsKKworCQkgY29sMSA9IChyZXNlcnZvaXI+PjcpICYgMHhGRjsKKwkJIHJvdzEgPSBwdGFibGU4MDA0IFsgb2Zmc2V0MSoyIF07CisKKwkJIC8qIEJpdCBtYXNrIHRhYmxlICovCisJCSBtYXNrID0gcGRldi0+dGFibGVfZDAwNFsgKHJvdzE8PDgpICsgY29sMSBdOworCQkgc2hpZnQgPSBwdGFibGU4MDA0IFsgb2Zmc2V0MSoyICsgMV07CisJCSByb3dzID0gKChtYXNrIDw8IHNoaWZ0KSArIDB4ODApICYgMHhGRjsKKworCQkgdG90YWxfYml0cyA9IHJvdzEgKyA4OworCQkgcmVzZXJ2b2lyID4+PSB0b3RhbF9iaXRzOworCQkgbmJpdHNfaW5fcmVzZXJ2b2lyIC09IHRvdGFsX2JpdHM7CisJICAgICAgIH0KKwkgICAgICAgeworCQkgY29uc3QgdW5zaWduZWQgaW50ICp0YWJsZV9hMDA0ID0gcGRldi0+dGFibGVfYTAwNCArIHJvd3MqMTI7CisJCSB1bnNpZ25lZCBpbnQgKnBvZmZzZXQgPSBNdWxJZHggKyBvZmZzZXQxKjE2OwkvKiA2NC80IChpbnQpICovCisJCSBmb3IgKGk9MDtpPDE2O2krKykKKwkJICB7CisJCSAgICB0ZW1wX2NvbG9yc1tpXSArPSB0YWJsZV9hMDA0WyAqcG9mZnNldCBdOworCQkgICAgcG9mZnNldCsrOworCQkgIH0KKwkgICAgICAgfQorCSAgIH0KKwkgfQorI2RlZmluZSBVU0VfU0lHTkVEX0lOVF9GT1JfQ09MT1IKKyNpZmRlZiBVU0VfU0lHTkVEX0lOVF9GT1JfQ09MT1IKKyMgIGRlZmluZSBDTEFNUCh4KSAoKHgpPjI1NT8yNTU6KCh4KTwwPzA6eCkpCisjZWxzZQorIyAgZGVmaW5lIENMQU1QKHgpICgoeCk+MjU1PzI1NTp4KQorI2VuZGlmCisKKwlpZiAocGFzc2VzID09IDApCisJIHsKKyNpZmRlZiBVU0VfU0lHTkVEX0lOVF9GT1JfQ09MT1IKKwkgICBjb25zdCBpbnQgKmMgPSB0ZW1wX2NvbG9yczsKKyNlbHNlCisJICAgY29uc3QgdW5zaWduZWQgaW50ICpjID0gdGVtcF9jb2xvcnM7CisjZW5kaWYKKwkgICB1bnNpZ25lZCBjaGFyICpkOworCisJICAgZCA9IGRlc3RfeTsKKwkgICBmb3IgKGk9MDtpPDQ7aSsrLGMrKykKKwkgICAgICpkKysgPSBDTEFNUCgoKmMpID4+IHBkZXYtPnl5KTsKKworCSAgIGQgPSBkZXN0X3kgKyBieXRlc19wZXJfY2hhbm5lbDsKKwkgICBmb3IgKGk9MDtpPDQ7aSsrLGMrKykKKwkgICAgICpkKysgPSBDTEFNUCgoKmMpID4+IHBkZXYtPnl5KTsKKworCSAgIGQgPSBkZXN0X3kgKyBvZmZzZXRfdG9fcGxhbmVfdTsKKwkgICBmb3IgKGk9MDtpPDQ7aSsrLGMrKykKKwkgICAgICpkKysgPSBDTEFNUCgoKmMpID4+IHBkZXYtPnl5KTsKKworCSAgIGQgPSBkZXN0X3kgKyBvZmZzZXRfdG9fcGxhbmVfdjsKKwkgICBmb3IgKGk9MDtpPDQ7aSsrLGMrKykKKwkgICAgICpkKysgPSBDTEFNUCgoKmMpID4+IHBkZXYtPnl5KTsKKworCSAgIGRlc3RfeSArPSA0OworCSB9CisJZWxzZSBpZiAocGFzc2VzID09IDEpCisJIHsKKyNpZmRlZiBVU0VfU0lHTkVEX0lOVF9GT1JfQ09MT1IKKwkgICBpbnQgKmMxID0gdGVtcF9jb2xvcnM7CisJICAgaW50ICpjMiA9IHRlbXBfY29sb3JzKzQ7CisjZWxzZQorCSAgIHVuc2lnbmVkIGludCAqYzEgPSB0ZW1wX2NvbG9yczsKKwkgICB1bnNpZ25lZCBpbnQgKmMyID0gdGVtcF9jb2xvcnMrNDsKKyNlbmRpZgorCSAgIHVuc2lnbmVkIGNoYXIgKmQ7CisKKwkgICBkID0gZGVzdF95OworCSAgIGZvciAoaT0wO2k8NDtpKyssYzErKyxjMisrKQorCSAgICB7CisJICAgICAgKmQrKyA9IENMQU1QKCgqYzEpID4+IHBkZXYtPnl5KTsKKwkgICAgICAqZCsrID0gQ0xBTVAoKCpjMikgPj4gcGRldi0+eXkpOworCSAgICB9CisJICAgYzEgPSB0ZW1wX2NvbG9ycysxMjsKKwkgICAvL2MyID0gdGVtcF9jb2xvcnMrODsKKwkgICBkID0gZGVzdF95ICsgYnl0ZXNfcGVyX2NoYW5uZWw7CisJICAgZm9yIChpPTA7aTw0O2krKyxjMSsrLGMyKyspCisJICAgIHsKKwkgICAgICAqZCsrID0gQ0xBTVAoKCpjMSkgPj4gcGRldi0+eXkpOworCSAgICAgICpkKysgPSBDTEFNUCgoKmMyKSA+PiBwZGV2LT55eSk7CisJICAgIH0KKworCSAgIGlmIChldmVuX2xpbmUpCS8qIEVhY2ggbGluZSwgc3dhcCB1L3YgKi8KKwkgICAgeworCSAgICAgIGV2ZW5fbGluZT0wOworCSAgICAgIGRlc3RfeSA9IGRlc3RfdjsKKwkgICAgICBkZXN0X3UgKz0gODsKKwkgICAgfQorCSAgIGVsc2UKKwkgICAgeworCSAgICAgIGV2ZW5fbGluZT0xOworCSAgICAgIGRlc3RfeSA9IGRlc3RfdTsKKwkgICAgICBkZXN0X3YgKz0gODsKKwkgICAgfQorCSB9CisKKyAgICAgIH0gLyogZW5kIG9mIHdoaWxlIChuYmxvY2tzLS0+MCkgKi8KKworICAgfSAvKiBlbmQgb2YgZm9yIChwYXNzZXM9MDtwYXNzZXM8MjtwYXNzZXMrKykgKi8KKworfQorCisKKy8qKgorICoKKyAqIGltYWdlOiBzaXplIG9mIHRoZSBpbWFnZSB3YW50ZWQKKyAqIHZpZXcgOiBzaXplIG9mIHRoZSBpbWFnZSByZXR1cm5lZCBieSB0aGUgY2FtZXJhCisgKiBvZmZzZXQ6ICh4LHkpIHRvIGRpc3BsYXllciBpbWFnZSBpbiB0aGUgdmlldworICoKKyAqIHNyYzogcmF3IGRhdGEKKyAqIGRzdDogaW1hZ2Ugb3V0cHV0CisgKiBmbGFnczogUFdDWF9GTEFHX1BMQU5BUgorICogcGRldjogcHJpdmF0ZSBidWZmZXIKKyAqIGJhbmRsZW5ndGg6CisgKgorICovCit2b2lkIHB3Y19kZWMyM19kZWNvbXByZXNzKGNvbnN0IHN0cnVjdCBwd2NfY29vcmQgKmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwd2NfY29vcmQgKnZpZXcsCisJCQkgICAgY29uc3Qgc3RydWN0IHB3Y19jb29yZCAqb2Zmc2V0LAorCQkJICAgIGNvbnN0IHZvaWQgKnNyYywKKwkJCSAgICB2b2lkICpkc3QsCisJCQkgICAgaW50IGZsYWdzLAorCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgaW50IGJhbmRsZW5ndGgpCit7CisgIGNvbnN0IHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSAqcGRldiA9IGRhdGE7CisgIHVuc2lnbmVkIGNoYXIgKnBvdXQsICpwb3V0X3BsYW5hcl95PU5VTEwsICpwb3V0X3BsYW5hcl91PU5VTEwsICpwb3V0X3BsYW5hcl92PU5VTEw7CisgIGludCBpLG4sc3RyaWRlLHBpeGVsX3NpemU7CisKKworICBpZiAoZmxhZ3MgJiBQV0NYX0ZMQUdfQkFZRVIpCisgICB7CisgICAgIHBvdXQgPSBkc3QgKyAodmlldy0+eCAqIG9mZnNldC0+eSkgKyBvZmZzZXQtPng7CisgICAgIHBpeGVsX3NpemUgPSB2aWV3LT54ICogNDsKKyAgIH0KKyAgZWxzZQorICAgeworICAgICBuID0gdmlldy0+eCAqIHZpZXctPnk7CisKKyAgICAgLyogb2Zmc2V0IGluIFkgcGxhbmUgKi8KKyAgICAgc3RyaWRlID0gdmlldy0+eCAqIG9mZnNldC0+eTsKKyAgICAgcG91dF9wbGFuYXJfeSA9IGRzdCArIHN0cmlkZSArIG9mZnNldC0+eDsKKworICAgICAvKiBvZmZzZXRzIGluIFUvViBwbGFuZXMgKi8KKyAgICAgc3RyaWRlID0gKHZpZXctPnggKiBvZmZzZXQtPnkpLzQgKyBvZmZzZXQtPngvMjsKKyAgICAgcG91dF9wbGFuYXJfdSA9IGRzdCArIG4gKyAgICAgKyBzdHJpZGU7CisgICAgIHBvdXRfcGxhbmFyX3YgPSBkc3QgKyBuICsgbi80ICsgc3RyaWRlOworCisgICAgIHBpeGVsX3NpemUgPSB2aWV3LT54ICogNDsKKyAgIH0KKworCisgIGZvciAoaT0wO2k8aW1hZ2UtPnk7aSs9NCkKKyAgIHsKKyAgICAgaWYgKGZsYWdzICYgUFdDWF9GTEFHX0JBWUVSKQorICAgICAgeworCS8vVE9ETzoKKwkvL0RlY29tcHJlc3NCYW5kQmF5ZXIocGRldixzcmMscG91dCxpbWFnZS54LHZpZXctPngsZmxhZ3MpOworCXNyYyArPSBiYW5kbGVuZ3RoOworCXBvdXQgKz0gcGl4ZWxfc2l6ZTsKKyAgICAgIH0KKyAgICAgZWxzZQorICAgICAgeworCURlY29tcHJlc3NCYW5kMjMocGRldixzcmMscG91dF9wbGFuYXJfeSxwb3V0X3BsYW5hcl91LHBvdXRfcGxhbmFyX3YsaW1hZ2UtPngsdmlldy0+eCxmbGFncyk7CisJc3JjICs9IGJhbmRsZW5ndGg7CisJcG91dF9wbGFuYXJfeSArPSBwaXhlbF9zaXplOworCXBvdXRfcGxhbmFyX3UgKz0gdmlldy0+eDsKKwlwb3V0X3BsYW5hcl92ICs9IHZpZXctPng7CisgICAgICB9CisgICB9Cit9CisKK3ZvaWQgcHdjX2RlYzIzX2V4aXQodm9pZCkKK3sKKyAgLyogRG8gbm90aGluZyAqLworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtZGVjMjMuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtZGVjMjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjJhYWNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1kZWMyMy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KKyAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorCisgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKKyAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgorICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgorICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCisgICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworI2lmbmRlZiBQV0NfREVDMjNfSAorI2RlZmluZSBQV0NfREVDMjNfSAorCitzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUKK3sKKyAgdW5zaWduZWQgY2hhciB4eCx5eSx6eix6em1hc2s7CisKKyAgdW5zaWduZWQgY2hhciB0YWJsZV8wMDA0WzIqMHg0MDAwXTsKKyAgdW5zaWduZWQgY2hhciB0YWJsZV84MDA0WzIqMHgxMDAwXTsKKyAgdW5zaWduZWQgaW50ICB0YWJsZV9hMDA0WzI1NioxMl07CisKKyAgdW5zaWduZWQgY2hhciB0YWJsZV9kMDA0WzgqMjU2XTsKKyAgdW5zaWduZWQgaW50ICB0YWJsZV9kODAwWzI1Nl07CisgIHVuc2lnbmVkIGludCAgdGFibGVfZGMwMFsyNTZdOworfTsKKworCit2b2lkIHB3Y19kZWMyM19pbml0KGludCB0eXBlLCBpbnQgcmVsZWFzZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCB2b2lkICpwcml2YXRlX2RhdGEpOwordm9pZCBwd2NfZGVjMjNfZXhpdCh2b2lkKTsKK3ZvaWQgcHdjX2RlYzIzX2RlY29tcHJlc3MoY29uc3Qgc3RydWN0IHB3Y19jb29yZCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHB3Y19jb29yZCAqdmlldywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgcHdjX2Nvb3JkICpvZmZzZXQsCisJCQkgICAgY29uc3Qgdm9pZCAqc3JjLAorCQkJICAgIHZvaWQgKmRzdCwKKwkJCSAgICBpbnQgZmxhZ3MsCisJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICBpbnQgYmFuZGxlbmd0aCk7CisKKworCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtaWYuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBhNWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1pZi5jCkBAIC0wLDAgKzEsMjIxMiBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgVVNCIGFuZCBWaWRlbzRMaW51eCBpbnRlcmZhY2UgcGFydC4KKyAgIChDKSAxOTk5LTIwMDQgTmVtb3NvZnQgVW52LgorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyovCisKKy8qICAKKyAgIFRoaXMgY29kZSBmb3JtcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIFVTQiBsYXllcnMgYW5kIHRoZSBQaGlsaXBzCisgICBzcGVjaWZpYyBzdHVmZi4gU29tZSBhZGFudmVkIHN0dWZmIG9mIHRoZSBkcml2ZXIgZmFsbHMgdW5kZXIgYW4KKyAgIE5EQSwgc2lnbmVkIGJldHdlZW4gbWUgYW5kIFBoaWxpcHMgQi5WLiwgRWluZGhvdmVuLCB0aGUgTmV0aGVybGFuZHMsIGFuZAorICAgaXMgdGh1cyBub3QgZGlzdHJpYnV0ZWQgaW4gc291cmNlIGZvcm0uIFRoZSBiaW5hcnkgcHdjeC5vIG1vZHVsZSAKKyAgIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgZmFsbHMgdW5kZXIgdGhlIE5EQS4KKyAgIAorICAgSW4gY2FzZSB5b3UncmUgd29uZGVyaW5nOiAncHdjJyBzdGFuZHMgZm9yICJQaGlsaXBzIFdlYkNhbSIsIGJ1dCAKKyAgIEkgcmVhbGx5IGRpZG4ndCB3YW50IHRvIHR5cGUgJ3BoaWxpcHNfd2ViX2NhbScgZXZlcnkgdGltZSAoSSdtIGxhenkgYXMKKyAgIGFueSBMaW51eCBrZXJuZWwgaGFja2VyLCBidXQgSSBkb24ndCBsaWtlIHVuY29tcHJlaGVuc2libGUgYWJicmV2aWF0aW9ucworICAgd2l0aG91dCBleHBsYW5hdGlvbikuCisgICAKKyAgIE9oIHllcywgY29udmVudGlvbjogdG8gZGlzY3Rpbmd1aXNoIGJldHdlZW4gYWxsIHRoZSB2YXJpb3VzIHBvaW50ZXJzIHRvCisgICBkZXZpY2Utc3RydWN0dXJlcywgSSB1c2UgdGhlc2UgbmFtZXMgZm9yIHRoZSBwb2ludGVyIHZhcmlhYmxlczoKKyAgIHVkZXY6IHN0cnVjdCB1c2JfZGV2aWNlICoKKyAgIHZkZXY6IHN0cnVjdCB2aWRlb19kZXZpY2UgKgorICAgcGRldjogc3RydWN0IHB3Y19kZXZpdmUgKgorKi8KKworLyogQ29udHJpYnV0b3JzOgorICAgLSBBbHZhcmFkbzogYWRkaW5nIHdoaXRlYmFsYW5jZSBjb2RlCisgICAtIEFsaXN0YXIgTW9pcmU6IFF1aWNrQ2FtIDMwMDAgUHJvIGRldmljZS9wcm9kdWN0IElECisgICAtIFRvbnkgSG95bGU6IENyZWF0aXZlIExhYnMgV2ViY2FtIDUgZGV2aWNlL3Byb2R1Y3QgSUQKKyAgIC0gTWFyayBCdXJhemluOiBzb2x2aW5nIGhhbmcgaW4gVklESU9DU1lOQyB3aGVuIGNhbWVyYSBnZXRzIHVucGx1Z2dlZAorICAgLSBKayBGYW5nOiBTb3RlYyBBZmluYSBFeWUgSUQKKyAgIC0gWGF2aWVyIFJvY2hlOiBRdWlja0NhbSBQcm8gNDAwMCBJRAorICAgLSBKZW5zIEtudWRzZW46IFF1aWNrQ2FtIFpvb20gSUQKKyAgIC0gSi4gRGViZXJ0OiBRdWlja0NhbSBmb3IgTm90ZWJvb2tzIElECisqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInB3Yy5oIgorI2luY2x1ZGUgInB3Yy1pb2N0bC5oIgorI2luY2x1ZGUgInB3Yy1raWFyYS5oIgorI2luY2x1ZGUgInB3Yy10aW1vbi5oIgorI2luY2x1ZGUgInB3Yy1kZWMyMy5oIgorI2luY2x1ZGUgInB3Yy1kZWMxLmgiCisjaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgZHJpdmVyIHRlbXBsYXRlcyAqLworCisvKiBob3RwbHVnIGRldmljZSB0YWJsZSBzdXBwb3J0ICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgcHdjX2RldmljZV90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMDIpIH0sIC8qIFBoaWxpcHMgbW9kZWxzICovCisJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzAzKSB9LAorCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMwNCkgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMDcpIH0sCisJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzA4KSB9LAorCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMwQykgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMTApIH0sCisJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzExKSB9LAorCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMxMikgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMTMpIH0sIC8qIHRoZSAnbmV3JyA3MjBLICovCisJeyBVU0JfREVWSUNFKDB4MDY5QSwgMHgwMDAxKSB9LCAvKiBBc2tleSAqLworCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCMCkgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gUHJvIDMwMDAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDZELCAweDA4QjEpIH0sIC8qIExvZ2l0ZWNoIFF1aWNrQ2FtIE5vdGVib29rIFBybyAqLworCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCMikgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gUHJvIDQwMDAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDZELCAweDA4QjMpIH0sIC8qIExvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gKG9sZCBtb2RlbCkgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDZELCAweDA4QjQpIH0sIC8qIExvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gKG5ldyBtb2RlbCkgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDZELCAweDA4QjUpIH0sIC8qIExvZ2l0ZWNoIFF1aWNrQ2FtIE9yYml0L1NwaGVyZSAqLworCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCNikgfSwgLyogTG9naXRlY2ggKHJlc2VydmVkKSAqLworCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCNykgfSwgLyogTG9naXRlY2ggKHJlc2VydmVkKSAqLworCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCOCkgfSwgLyogTG9naXRlY2ggKHJlc2VydmVkKSAqLworCXsgVVNCX0RFVklDRSgweDA1NUQsIDB4OTAwMCkgfSwgLyogU2Ftc3VuZyAqLworCXsgVVNCX0RFVklDRSgweDA1NUQsIDB4OTAwMSkgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNDFFLCAweDQwMEMpIH0sIC8qIENyZWF0aXZlIFdlYmNhbSA1ICovCisJeyBVU0JfREVWSUNFKDB4MDQxRSwgMHg0MDExKSB9LCAvKiBDcmVhdGl2ZSBXZWJjYW0gUHJvIEV4ICovCisJeyBVU0JfREVWSUNFKDB4MDRDQywgMHg4MTE2KSB9LCAvKiBBZmluYSBFeWUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNkJFLCAweDgxMTYpIH0sIC8qIG5ldyBBZmluYSBFeWUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwZDgxLCAweDE5MTApIH0sIC8qIFZpc2lvbml0ZSAqLworCXsgVVNCX0RFVklDRSgweDBkODEsIDB4MTkwMCkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcHdjX2RldmljZV90YWJsZSk7CisKK3N0YXRpYyBpbnQgdXNiX3B3Y19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIHVzYl9wd2NfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwd2NfZHJpdmVyID0geworCS5vd25lciA9CQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkJIlBoaWxpcHMgd2ViY2FtIiwJLyogbmFtZSAqLworCS5pZF90YWJsZSA9CQlwd2NfZGV2aWNlX3RhYmxlLAorCS5wcm9iZSA9CQl1c2JfcHdjX3Byb2JlLAkJLyogcHJvYmUoKSAqLworCS5kaXNjb25uZWN0ID0JCXVzYl9wd2NfZGlzY29ubmVjdCwJLyogZGlzY29ubmVjdCgpICovCit9OworCisjZGVmaW5lIE1BWF9ERVZfSElOVFMJMjAKKyNkZWZpbmUgTUFYX0lTT0NfRVJST1JTCTIwCisKK3N0YXRpYyBpbnQgZGVmYXVsdF9zaXplID0gUFNaX1FDSUY7CitzdGF0aWMgaW50IGRlZmF1bHRfZnBzID0gMTA7CitzdGF0aWMgaW50IGRlZmF1bHRfZmJ1ZnMgPSAzOyAgIC8qIERlZmF1bHQgbnVtYmVyIG9mIGZyYW1lIGJ1ZmZlcnMgKi8KK3N0YXRpYyBpbnQgZGVmYXVsdF9tYnVmcyA9IDI7CS8qIERlZmF1bHQgbnVtYmVyIG9mIG1tYXAoKSBidWZmZXJzICovCisgICAgICAgaW50IHB3Y190cmFjZSA9IFRSQUNFX01PRFVMRSB8IFRSQUNFX0ZMT1cgfCBUUkFDRV9QV0NYOworc3RhdGljIGludCBwb3dlcl9zYXZlID0gMDsKK3N0YXRpYyBpbnQgbGVkX29uID0gMTAwLCBsZWRfb2ZmID0gMDsgLyogZGVmYXVsdHMgdG8gTEVEIHRoYXQgaXMgb24gd2hpbGUgaW4gdXNlICovCisgICAgICAgaW50IHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24gPSAyOyAvKiAwLi4zID0gdW5jb21wcmVzc2VkLi5oaWdoICovCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwljaGFyIHNlcmlhbF9udW1iZXJbMzBdOworCWludCBkZXZpY2Vfbm9kZTsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKK30gZGV2aWNlX2hpbnRbTUFYX0RFVl9ISU5UU107CisKKy8qKiovCisKK3N0YXRpYyBpbnQgcHdjX3ZpZGVvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBwd2NfdmlkZW9fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHNzaXplX3QgcHdjX3ZpZGVvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICogYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgdW5zaWduZWQgaW50IHB3Y192aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKK3N0YXRpYyBpbnQgIHB3Y192aWRlb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgaW9jdGxuciwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCAgcHdjX3ZpZGVvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHdjX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm9wZW4gPQkJcHdjX3ZpZGVvX29wZW4sCisJLnJlbGVhc2UgPSAgICAgCXB3Y192aWRlb19jbG9zZSwKKwkucmVhZCA9CQlwd2NfdmlkZW9fcmVhZCwKKwkucG9sbCA9CQlwd2NfdmlkZW9fcG9sbCwKKwkubW1hcCA9CQlwd2NfdmlkZW9fbW1hcCwKKwkuaW9jdGwgPSAgICAgICAgcHdjX3ZpZGVvX2lvY3RsLAorCS5sbHNlZWsgPSAgICAgICBub19sbHNlZWssCit9Oworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgcHdjX3RlbXBsYXRlID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJQaGlsaXBzIFdlYmNhbSIsCS8qIEZpbGxlZCBpbiBsYXRlciAqLworCS50eXBlID0JCVZJRF9UWVBFX0NBUFRVUkUsCisJLmhhcmR3YXJlID0JVklEX0hBUkRXQVJFX1BXQywKKwkucmVsZWFzZSA9CXZpZGVvX2RldmljZV9yZWxlYXNlLAorCS5mb3BzID0gICAgICAgICAmcHdjX2ZvcHMsCisJLm1pbm9yID0gICAgICAgIC0xLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogT2theSwgdGhpcyBpcyBzb21lIG1hZ2ljIHRoYXQgSSB3b3JrZWQgb3V0IGFuZCB0aGUgcmVhc29uaW5nIGJlaGluZCBpdC4uLgorCisgICBUaGUgYmlnZ2VzdCBwcm9ibGVtIHdpdGggYW55IFVTQiBkZXZpY2UgaXMgb2YgY291cnNlOiAid2hhdCB0byBkbyAKKyAgIHdoZW4gdGhlIHVzZXIgdW5wbHVncyB0aGUgZGV2aWNlIHdoaWxlIGl0IGlzIGluIHVzZSBieSBhbiBhcHBsaWNhdGlvbj8iCisgICBXZSBoYXZlIHNldmVyYWwgb3B0aW9uczoKKyAgIDEpIEN1cnNlIHRoZW0gd2l0aCB0aGUgNyBwbGFndWVzIHdoZW4gdGhleSBkbyAocmVxdWlyZXMgZGl2aW5lIGludGVydmVudGlvbikKKyAgIDIpIFRlbGwgdGhlbSBub3QgdG8gKHdvbid0IHdvcms6IHRoZXknbGwgZG8gaXQgYW55d2F5KQorICAgMykgT29wcyB0aGUga2VybmVsICh0aGlzIHdpbGwgaGF2ZSBhIG5lZ2F0aXZlIGVmZmVjdCBvbiBhIHVzZXIncyB1cHRpbWUpCisgICA0KSBEbyBzb21ldGhpbmcgc2Vuc2libGUuCisgICAKKyAgIE9mIGNvdXJzZSwgd2UgZ28gZm9yIG9wdGlvbiA0LgorCisgICBJdCBoYXBwZW5zIHRoYXQgdGhpcyBkZXZpY2Ugd2lsbCBiZSBsaW5rZWQgdG8gdHdvIHRpbWVzLCBvbmNlIGZyb20KKyAgIHVzYl9kZXZpY2UgYW5kIG9uY2UgZnJvbSB0aGUgdmlkZW9fZGV2aWNlIGluIHRoZWlyIHJlc3BlY3RpdmUgJ3ByaXZhdGUnCisgICBwb2ludGVycy4gVGhpcyBpcyBkb25lIHdoZW4gdGhlIGRldmljZSBpcyBwcm9iZWQoKSBhbmQgYWxsIGluaXRpYWxpemF0aW9uCisgICBzdWNjZWVkZWQuIFRoZSBwd2NfZGV2aWNlIHN0cnVjdCBsaW5rcyBiYWNrIHRvIGJvdGggc3RydWN0dXJlcy4KKworICAgV2hlbiBhIGRldmljZSBpcyB1bnBsdWdnZWQgd2hpbGUgaW4gdXNlIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSAKKyAgIGxpc3Qgb2Yga25vd24gVVNCIGRldmljZXM7IEkgYWxzbyBkZS1yZWdpc3RlciBpdCBhcyBhIFY0TCBkZXZpY2UsIGJ1dCAKKyAgIHVuZm9ydHVuYXRlbHkgSSBjYW4ndCBmcmVlIHRoZSBtZW1vcnkgc2luY2UgdGhlIHN0cnVjdCBpcyBzdGlsbCBpbiB1c2UKKyAgIGJ5IHRoZSBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgZnJlZS1pbmcgaXMgdGhlbiBkZWZlcmVuZCB1bnRpbCB0aGUgZmlyc3QKKyAgIG9wcG9ydHVuaXR5LiBDcnVkZSwgYnV0IGl0IHdvcmtzLgorICAgCisgICBBIHNtYWxsICdhZHZhbnRhZ2UnIGlzIHRoYXQgaWYgYSB1c2VyIHVucGx1Z3MgdGhlIGNhbSBhbmQgcGx1Z3MgaXQgYmFjaworICAgaW4sIGl0IHNob3VsZCBnZXQgYXNzaWduZWQgdGhlIHNhbWUgdmlkZW8gZGV2aWNlIG1pbm9yLCBidXQgdW5mb3J0dW5hdGVseQorICAgaXQncyBub24tdHJpdmlhbCB0byByZS1saW5rIHRoZSBjYW0gYmFjayB0byB0aGUgdmlkZW8gZGV2aWNlLi4uICh0aGF0IAorICAgd291bGQgc3VyZWx5IGJlIG1hZ2ljISA6KSkKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAqLworCisvKiBIZXJlIHdlIHdhbnQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeS4KKyAqIFRoaXMgaXMgdXNlZCB3aGVuIGluaXRpYWxpemluZyB0aGUgY29udGVudHMgb2YgdGhlIGFyZWEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrdmlydF90b19wYSh1bnNpZ25lZCBsb25nIGFkcikgCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcga3ZhLCByZXQ7CisKKwlrdmEgPSAodW5zaWduZWQgbG9uZykgcGFnZV9hZGRyZXNzKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCWt2YSB8PSBhZHIgJiAoUEFHRV9TSVpFLTEpOyAvKiByZXN0b3JlIHRoZSBvZmZzZXQgKi8KKwlyZXQgPSBfX3BhKGt2YSk7CisgICAgICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkICogcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXZvaWQgKiBtZW07CisJdW5zaWduZWQgbG9uZyBhZHI7CisKKwlzaXplPVBBR0VfQUxJR04oc2l6ZSk7CisgICAgICAgIG1lbT12bWFsbG9jXzMyKHNpemUpOworCWlmIChtZW0pIAorCXsKKwkJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7IC8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCisJICAgICAgICBhZHI9KHVuc2lnbmVkIGxvbmcpIG1lbTsKKwkJd2hpbGUgKHNpemUgPiAwKSAKKyAgICAgICAgICAgICAgICB7CisJCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCQlhZHIrPVBBR0VfU0laRTsKKwkJCXNpemUtPVBBR0VfU0laRTsKKwkJfQorCX0KKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZCBydmZyZWUodm9pZCAqIG1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGFkcjsKKworCWlmIChtZW0pIAorCXsKKwkgICAgICAgIGFkcj0odW5zaWduZWQgbG9uZykgbWVtOworCQl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKSAKKyAgICAgICAgICAgICAgICB7CisJCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJCWFkcis9UEFHRV9TSVpFOworCQkJc2l6ZS09UEFHRV9TSVpFOworCQl9CisJCXZmcmVlKG1lbSk7CisJfQorfQorCisKKworCitzdGF0aWMgaW50IHB3Y19hbGxvY2F0ZV9idWZmZXJzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWludCBpOworCXZvaWQgKmtidWY7CisKKwlUcmFjZShUUkFDRV9NRU1PUlksICI+PiBwd2NfYWxsb2NhdGVfYnVmZmVycyhwZGV2ID0gMHglcClcbiIsIHBkZXYpOworCisJaWYgKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKwkJCisjaWZkZWYgUFdDX01BR0lDCisJaWYgKHBkZXYtPm1hZ2ljICE9IFBXQ19NQUdJQykgeworCQlFcnIoImFsbG9jYXRlX2J1ZmZlcnMoKTogbWFnaWMgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorI2VuZGlmCQorCS8qIEFsbG9jYXRlIElzb2Nocm9udW91cyBwaXBlIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKKwkJaWYgKHBkZXYtPnNidWZbaV0uZGF0YSA9PSBOVUxMKSB7CisJCQlrYnVmID0ga21hbGxvYyhJU09fQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCQkJaWYgKGtidWYgPT0gTlVMTCkgeworCQkJCUVycigiRmFpbGVkIHRvIGFsbG9jYXRlIGlzbyBidWZmZXIgJWQuXG4iLCBpKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCVRyYWNlKFRSQUNFX01FTU9SWSwgIkFsbG9jYXRlZCBpc28gYnVmZmVyIGF0ICVwLlxuIiwga2J1Zik7CisJCQlwZGV2LT5zYnVmW2ldLmRhdGEgPSBrYnVmOworCQkJbWVtc2V0KGtidWYsIDAsIElTT19CVUZGRVJfU0laRSk7CisJCX0KKwl9CisKKwkvKiBBbGxvY2F0ZSBmcmFtZSBidWZmZXIgc3RydWN0dXJlICovCisJaWYgKHBkZXYtPmZidWYgPT0gTlVMTCkgeworCQlrYnVmID0ga21hbGxvYyhkZWZhdWx0X2ZidWZzICogc2l6ZW9mKHN0cnVjdCBwd2NfZnJhbWVfYnVmKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChrYnVmID09IE5VTEwpIHsKKwkJCUVycigiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCVRyYWNlKFRSQUNFX01FTU9SWSwgIkFsbG9jYXRlZCBmcmFtZSBidWZmZXIgc3RydWN0dXJlIGF0ICVwLlxuIiwga2J1Zik7CisJCXBkZXYtPmZidWYgPSBrYnVmOworCQltZW1zZXQoa2J1ZiwgMCwgZGVmYXVsdF9mYnVmcyAqIHNpemVvZihzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZikpOworCX0KKwkvKiBjcmVhdGUgZnJhbWUgYnVmZmVycywgYW5kIG1ha2UgY2lyY3VsYXIgcmluZyAqLworCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X2ZidWZzOyBpKyspIHsKKwkJaWYgKHBkZXYtPmZidWZbaV0uZGF0YSA9PSBOVUxMKSB7CisJCQlrYnVmID0gdm1hbGxvYyhQV0NfRlJBTUVfU0laRSk7IC8qIG5lZWQgdm1hbGxvYyBzaW5jZSBmcmFtZSBidWZmZXIgPiAxMjhLICovCisJCQlpZiAoa2J1ZiA9PSBOVUxMKSB7CisJCQkJRXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyICVkLlxuIiwgaSk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlUcmFjZShUUkFDRV9NRU1PUlksICJBbGxvY2F0ZWQgZnJhbWUgYnVmZmVyICVkIGF0ICVwLlxuIiwgaSwga2J1Zik7CisJCQlwZGV2LT5mYnVmW2ldLmRhdGEgPSBrYnVmOworCQkJbWVtc2V0KGtidWYsIDEyOCwgUFdDX0ZSQU1FX1NJWkUpOworCQl9CisJfQorCQorCS8qIEFsbG9jYXRlIGRlY29tcHJlc3NvciB0YWJsZSBzcGFjZSAqLworCWtidWYgPSBOVUxMOworCXN3aXRjaCAocGRldi0+dHlwZSkKKwkgeworCSAgY2FzZSA2NzU6CisJICBjYXNlIDY4MDoKKwkgIGNhc2UgNjkwOgorCSAgY2FzZSA3MjA6CisJICBjYXNlIDczMDoKKwkgIGNhc2UgNzQwOgorCSAgY2FzZSA3NTA6CisJICAgIFRyYWNlKFRSQUNFX01FTU9SWSwicHJpdmF0ZV9kYXRhKCVaZClcbiIsc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSkpOworCSAgICBrYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHB3Y19kZWMyM19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CS8qIFRpbW9uICYgS2lhcmEgKi8KKwkgICAgYnJlYWs7CisJICBjYXNlIDY0NToKKwkgIGNhc2UgNjQ2OgorCSAgICAvKiBUT0RPICYgRklYTUUgKi8KKwkgICAga2J1ZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCSAgICBicmVhazsKKwkgfQorCWlmIChrYnVmID09IE5VTEwpIHsKKwkgICBFcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBkZWNvbXByZXNzIHRhYmxlLlxuIik7CisJICAgcmV0dXJuIC1FTk9NRU07CisJfQorCXBkZXYtPmRlY29tcHJlc3NfZGF0YSA9IGtidWY7CisJCisJLyogQWxsb2NhdGUgaW1hZ2UgYnVmZmVyOyBkb3VibGUgYnVmZmVyIGZvciBtbWFwKCkgKi8KKwlrYnVmID0gcnZtYWxsb2MoZGVmYXVsdF9tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2UpOworCWlmIChrYnVmID09IE5VTEwpIHsKKwkJRXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgaW1hZ2UgYnVmZmVyKHMpLiBuZWVkZWQgKCVkKVxuIixkZWZhdWx0X21idWZzICogcGRldi0+bGVuX3Blcl9pbWFnZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlUcmFjZShUUkFDRV9NRU1PUlksICJBbGxvY2F0ZWQgaW1hZ2UgYnVmZmVyIGF0ICVwLlxuIiwga2J1Zik7CisJcGRldi0+aW1hZ2VfZGF0YSA9IGtidWY7CisJZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfbWJ1ZnM7IGkrKykKKwkJcGRldi0+aW1hZ2VfcHRyW2ldID0ga2J1ZiArIGkgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOworCWZvciAoOyBpIDwgTUFYX0lNQUdFUzsgaSsrKQorCQlwZGV2LT5pbWFnZV9wdHJbaV0gPSBOVUxMOworCisJa2J1ZiA9IE5VTEw7CisJICAKKwlUcmFjZShUUkFDRV9NRU1PUlksICI8PCBwd2NfYWxsb2NhdGVfYnVmZmVycygpXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHdjX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKworCVRyYWNlKFRSQUNFX01FTU9SWSwgIkVudGVyaW5nIGZyZWVfYnVmZmVycyglcCkuXG4iLCBwZGV2KTsKKworCWlmIChwZGV2ID09IE5VTEwpCisJCXJldHVybjsKKyNpZmRlZiBQV0NfTUFHSUMKKwlpZiAocGRldi0+bWFnaWMgIT0gUFdDX01BR0lDKSB7CisJCUVycigiZnJlZV9idWZmZXJzKCk6IG1hZ2ljIGZhaWxlZC5cbiIpOworCQlyZXR1cm47CisJfQorI2VuZGlmCQorCisJLyogUmVsZWFzZSBJc28tcGlwZSBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKQorCQlpZiAocGRldi0+c2J1ZltpXS5kYXRhICE9IE5VTEwpIHsKKwkJCVRyYWNlKFRSQUNFX01FTU9SWSwgIkZyZWVpbmcgSVNPIGJ1ZmZlciBhdCAlcC5cbiIsIHBkZXYtPnNidWZbaV0uZGF0YSk7CisJCQlrZnJlZShwZGV2LT5zYnVmW2ldLmRhdGEpOworCQkJcGRldi0+c2J1ZltpXS5kYXRhID0gTlVMTDsKKwkJfQorCisJLyogVGhlIHNhbWUgZm9yIGZyYW1lIGJ1ZmZlcnMgKi8KKwlpZiAocGRldi0+ZmJ1ZiAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X2ZidWZzOyBpKyspIHsKKwkJCWlmIChwZGV2LT5mYnVmW2ldLmRhdGEgIT0gTlVMTCkgeworCQkJCVRyYWNlKFRSQUNFX01FTU9SWSwgIkZyZWVpbmcgZnJhbWUgYnVmZmVyICVkIGF0ICVwLlxuIiwgaSwgcGRldi0+ZmJ1ZltpXS5kYXRhKTsKKwkJCQl2ZnJlZShwZGV2LT5mYnVmW2ldLmRhdGEpOworCQkJCXBkZXYtPmZidWZbaV0uZGF0YSA9IE5VTEw7CisJCQl9CisJCX0KKwkJa2ZyZWUocGRldi0+ZmJ1Zik7CisJCXBkZXYtPmZidWYgPSBOVUxMOworCX0KKworCS8qIEludGVybWVkaWF0ZSBkZWNvbXByZXNzaW9uIGJ1ZmZlciAmIHRhYmxlcyAqLworCWlmIChwZGV2LT5kZWNvbXByZXNzX2RhdGEgIT0gTlVMTCkgeworCQlUcmFjZShUUkFDRV9NRU1PUlksICJGcmVlaW5nIGRlY29tcHJlc3Npb24gYnVmZmVyIGF0ICVwLlxuIiwgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKKwkJa2ZyZWUocGRldi0+ZGVjb21wcmVzc19kYXRhKTsKKwkJcGRldi0+ZGVjb21wcmVzc19kYXRhID0gTlVMTDsKKwl9CisJcGRldi0+ZGVjb21wcmVzc29yID0gTlVMTDsKKworCS8qIFJlbGVhc2UgaW1hZ2UgYnVmZmVycyAqLworCWlmIChwZGV2LT5pbWFnZV9kYXRhICE9IE5VTEwpIHsKKwkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiRnJlZWluZyBpbWFnZSBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5pbWFnZV9kYXRhKTsKKwkJcnZmcmVlKHBkZXYtPmltYWdlX2RhdGEsIGRlZmF1bHRfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKKwl9CisJcGRldi0+aW1hZ2VfZGF0YSA9IE5VTEw7CisJCisJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiTGVhdmluZyBmcmVlX2J1ZmZlcnMoKS5cbiIpOworfQorCisvKiBUaGUgZnJhbWUgJiBpbWFnZSBidWZmZXIgbWVzcy4gCisKKyAgIFllcywgdGhpcyBpcyBhIG1lc3MuIFdlbGwsIGl0IHVzZWQgdG8gYmUgc2ltcGxlLCBidXQgYWxhcy4uLiAgSW4gdGhpcworICAgbW9kdWxlLCAzIGJ1ZmZlcnMgc2NoZW1lcyBhcmUgdXNlZCB0byBnZXQgdGhlIGRhdGEgZnJvbSB0aGUgVVNCIGJ1cyB0bworICAgdGhlIHVzZXIgcHJvZ3JhbS4gVGhlIGZpcnN0IHNjaGVtZSBpbnZvbHZlcyB0aGUgSVNPIGJ1ZmZlcnMgKGNhbGxlZCB0aHVzCisgICBzaW5jZSB0aGV5IHRyYW5zcG9ydCBJU08gZGF0YSBmcm9tIHRoZSBVU0IgY29udHJvbGxlciksIGFuZCBub3QgcmVhbGx5CisgICBpbnRlcmVzdGluZy4gU3VmZmljZXMgdG8gc2F5IHRoZSBkYXRhIGZyb20gdGhpcyBidWZmZXIgaXMgcXVpY2tseSAKKyAgIGdhdGhlcmVkIGluIGFuIGludGVycnVwdCBoYW5kbGVyIChwd2NfaXNvY19oYW5kbGVyKSBhbmQgcGxhY2VkIGludG8gdGhlCisgICBmcmFtZSBidWZmZXIuCisKKyAgIFRoZSBmcmFtZSBidWZmZXIgaXMgdGhlIHNlY29uZCBzY2hlbWUsIGFuZCBpcyB0aGUgY2VudHJhbCBlbGVtZW50IGhlcmUuCisgICBJdCBjb2xsZWN0cyB0aGUgZGF0YSBmcm9tIGEgc2luZ2xlIGZyYW1lIGZyb20gdGhlIGNhbWVyYSAoaGVuY2UsIHRoZQorICAgbmFtZSkuIEZyYW1lcyBhcmUgZGVsaW1pdGVkIGJ5IHRoZSBVU0IgY2FtZXJhIHdpdGggYSBzaG9ydCBVU0IgcGFja2V0LAorICAgc28gdGhhdCdzIGVhc3kgdG8gZGV0ZWN0LiBUaGUgZnJhbWUgYnVmZmVycyBmb3JtIGEgbGlzdCB0aGF0IGlzIGZpbGxlZAorICAgYnkgdGhlIGNhbWVyYStVU0IgY29udHJvbGxlciBhbmQgZHJhaW5lZCBieSB0aGUgdXNlciBwcm9jZXNzIHRocm91Z2gKKyAgIGVpdGhlciByZWFkKCkgb3IgbW1hcCgpLgorCisgICBUaGUgaW1hZ2UgYnVmZmVyIGlzIHRoZSB0aGlyZCBzY2hlbWUsIGluIHdoaWNoIGZyYW1lcyBhcmUgZGVjb21wcmVzc2VkCisgICBhbmQgY29udmVydGVkIGludG8gcGxhbmFyIGZvcm1hdC4gRm9yIG1tYXAoKSB0aGVyZSBpcyBtb3JlIHRoYW4KKyAgIG9uZSBpbWFnZSBidWZmZXIgYXZhaWxhYmxlLgorCisgICBUaGUgZnJhbWUgYnVmZmVycyBwcm92aWRlIHRoZSBpbWFnZSBidWZmZXJpbmcuIEluIGNhc2UgdGhlIHVzZXIgcHJvY2VzcworICAgaXMgYSBiaXQgc2xvdywgdGhpcyBpbnRyb2R1Y2VzIGxhZyBhbmQgc29tZSB1bmRlc2lyZWQgc2lkZS1lZmZlY3RzLgorICAgVGhlIHByb2JsZW0gYXJpc2VzIHdoZW4gdGhlIGZyYW1lIGJ1ZmZlciBpcyBmdWxsLiBJIHVzZWQgdG8gZHJvcCB0aGUgbGFzdAorICAgZnJhbWUsIHdoaWNoIG1ha2VzIHRoZSBkYXRhIGluIHRoZSBxdWV1ZSBzdGFsZSB2ZXJ5IHF1aWNrbHkuIEJ1dCBkcm9wcGluZworICAgdGhlIGZyYW1lIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBwcm92ZWQgdG8gYmUgYSBsaXR0ZSBiaXQgbW9yZSBkaWZmaWN1bHQuCisgICBJIHRyaWVkIGEgY2lyY3VsYXIgbGlua2VkIHNjaGVtZSwgYnV0IHRoaXMgaW50cm9kdWNlZCBtb3JlIHByb2JsZW1zIHRoYW4KKyAgIGl0IHNvbHZlZC4KKworICAgQmVjYXVzZSBmaWxsaW5nIGFuZCBkcmFpbmluZyBhcmUgY29tcGxldGVseSBhc3luY2hyb25vdXMgcHJvY2Vzc2VzLCB0aGlzCisgICByZXF1aXJlcyBzb21lIGZpZGRsaW5nIHdpdGggcG9pbnRlcnMgYW5kIG11dGV4ZXMuCisKKyAgIEV2ZW50dWFsbHksIEkgY2FtZSB1cCB3aXRoIGEgc3lzdGVtIHdpdGggMiBsaXN0czogYW4gJ2VtcHR5JyBmcmFtZSBsaXN0CisgICBhbmQgYSAnZnVsbCcgZnJhbWUgbGlzdDoKKyAgICAgKiBJbml0aWFsbHksIGFsbCBmcmFtZSBidWZmZXJzIGJ1dCBvbmUgYXJlIG9uIHRoZSAnZW1wdHknIGxpc3Q7IHRoZSBvbmUKKyAgICAgICByZW1haW5pbmcgYnVmZmVyIGlzIG91ciBpbml0aWFsIGZpbGwgZnJhbWUuCisgICAgICogSWYgYSBmcmFtZSBpcyBuZWVkZWQgZm9yIGZpbGxpbmcsIHdlIHRyeSB0byB0YWtlIGl0IGZyb20gdGhlICdlbXB0eScgCisgICAgICAgbGlzdCwgdW5sZXNzIHRoYXQgbGlzdCBpcyBlbXB0eSwgaW4gd2hpY2ggY2FzZSB3ZSB0YWtlIHRoZSBidWZmZXIgYXQgCisgICAgICAgdGhlIGhlYWQgb2YgdGhlICdmdWxsJyBsaXN0LgorICAgICAqIFdoZW4gb3VyIGZpbGwgYnVmZmVyIGhhcyBiZWVuIGZpbGxlZCwgaXQgaXMgYXBwZW5kZWQgdG8gdGhlICdmdWxsJworICAgICAgIGxpc3QuCisgICAgICogSWYgYSBmcmFtZSBpcyBuZWVkZWQgYnkgcmVhZCgpIG9yIG1tYXAoKSwgaXQgaXMgdGFrZW4gZnJvbSB0aGUgaGVhZCBvZgorICAgICAgIHRoZSAnZnVsbCcgbGlzdCwgaGFuZGxlZCwgYW5kIHRoZW4gYXBwZW5kZWQgdG8gdGhlICdlbXB0eScgbGlzdC4gSWYgbm8KKyAgICAgICBidWZmZXIgaXMgcHJlc2VudCBvbiB0aGUgJ2Z1bGwnIGxpc3QsIHdlIHdhaXQuCisgICBUaGUgYWR2YW50YWdlIGlzIHRoYXQgdGhlIGJ1ZmZlciB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBkZWNvbXByZXNzZWQvCisgICBjb252ZXJ0ZWQsIGlzIG9uIG5laXRoZXIgbGlzdCwgYW5kIHRodXMgbm90IGluIG91ciB3YXkgKGFueSBvdGhlciBzY2hlbWUKKyAgIEkgdHJpZWQgaGFkIHRoZSBwcm9ibGVtIG9mIG9sZCBkYXRhIGxpbmdlcmluZyBpbiB0aGUgcXVldWUpLgorCisgICBXaGF0ZXZlciBzdHJhdGVneSB5b3UgY2hvb3NlLCBpdCBhbHdheXMgcmVtYWlucyBhIHRyYWRlb2ZmOiB3aXRoIG1vcmUKKyAgIGZyYW1lIGJ1ZmZlcnMgdGhlIGNoYW5jZXMgb2YgYSBtaXNzZWQgZnJhbWUgYXJlIHJlZHVjZWQuIE9uIHRoZSBvdGhlcgorICAgaGFuZCwgb24gc2xvd2VyIG1hY2hpbmVzIGl0IGludHJvZHVjZXMgbGFnIGJlY2F1c2UgdGhlIHF1ZXVlIHdpbGwKKyAgIGFsd2F5cyBiZSBmdWxsLgorICovCisKKy8qKgorICBcYnJpZWYgRmluZCBuZXh0IGZyYW1lIGJ1ZmZlciB0byBmaWxsLiBUYWtlIGZyb20gZW1wdHkgb3IgZnVsbCBsaXN0LCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB3Y19uZXh0X2ZpbGxfZnJhbWUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmV0ID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworCWlmIChwZGV2LT5maWxsX2ZyYW1lICE9IE5VTEwpIHsKKwkJLyogYXBwZW5kIHRvICdmdWxsJyBsaXN0ICovCisJCWlmIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7CisJCQlwZGV2LT5mdWxsX2ZyYW1lcyA9IHBkZXYtPmZpbGxfZnJhbWU7CisJCQlwZGV2LT5mdWxsX2ZyYW1lc190YWlsID0gcGRldi0+ZnVsbF9mcmFtZXM7CisJCX0KKwkJZWxzZSB7CisJCQlwZGV2LT5mdWxsX2ZyYW1lc190YWlsLT5uZXh0ID0gcGRldi0+ZmlsbF9mcmFtZTsKKwkJCXBkZXYtPmZ1bGxfZnJhbWVzX3RhaWwgPSBwZGV2LT5maWxsX2ZyYW1lOworCQl9CisJfQorCWlmIChwZGV2LT5lbXB0eV9mcmFtZXMgIT0gTlVMTCkgeworCQkvKiBXZSBoYXZlIGVtcHR5IGZyYW1lcyBhdmFpbGFibGUuIFRoYXQncyBlYXN5ICovCisJCXBkZXYtPmZpbGxfZnJhbWUgPSBwZGV2LT5lbXB0eV9mcmFtZXM7CisJCXBkZXYtPmVtcHR5X2ZyYW1lcyA9IHBkZXYtPmVtcHR5X2ZyYW1lcy0+bmV4dDsKKwl9CisJZWxzZSB7CisJCS8qIEhtbS4gVGFrZSBpdCBmcm9tIHRoZSBmdWxsIGxpc3QgKi8KKyNpZiBQV0NfREVCVUcKKwkJLyogc2FuaXR5IGNoZWNrICovCisJCWlmIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7CisJCQlFcnIoIk5laXRoZXIgZW1wdHkgb3IgZnVsbCBmcmFtZXMgYXZhaWxhYmxlIVxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorI2VuZGlmCisJCXBkZXYtPmZpbGxfZnJhbWUgPSBwZGV2LT5mdWxsX2ZyYW1lczsKKwkJcGRldi0+ZnVsbF9mcmFtZXMgPSBwZGV2LT5mdWxsX2ZyYW1lcy0+bmV4dDsKKwkJcmV0ID0gMTsKKwl9CisJcGRldi0+ZmlsbF9mcmFtZS0+bmV4dCA9IE5VTEw7CisjaWYgUFdDX0RFQlVHCisJVHJhY2UoVFJBQ0VfU0VRVUVOQ0UsICJBc3NpZ25pbmcgc2VxdWVuY2UgbnVtYmVyICVkLlxuIiwgcGRldi0+c2VxdWVuY2UpOworCXBkZXYtPmZpbGxfZnJhbWUtPnNlcXVlbmNlID0gcGRldi0+c2VxdWVuY2UrKzsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICBcYnJpZWYgUmVzZXQgYWxsIGJ1ZmZlcnMsIHBvaW50ZXJzIGFuZCBsaXN0cywgZXhjZXB0IGZvciB0aGUgaW1hZ2VfdXNlZFtdIGJ1ZmZlci4KKworICBJZiB0aGUgaW1hZ2VfdXNlZFtdIGJ1ZmZlciBpcyBjbGVhcmVkIHRvbywgbW1hcCgpL1ZJRElPQ1NZTkMgd2lsbCBydW4gaW50byB0cm91YmxlLgorICovCitzdGF0aWMgdm9pZCBwd2NfcmVzZXRfYnVmZmVycyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKKwlwZGV2LT5mdWxsX2ZyYW1lcyA9IE5VTEw7CisJcGRldi0+ZnVsbF9mcmFtZXNfdGFpbCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfZmJ1ZnM7IGkrKykgeworCQlwZGV2LT5mYnVmW2ldLmZpbGxlZCA9IDA7CisJCWlmIChpID4gMCkKKwkJCXBkZXYtPmZidWZbaV0ubmV4dCA9ICZwZGV2LT5mYnVmW2kgLSAxXTsKKwkJZWxzZQorCQkJcGRldi0+ZmJ1Zi0+bmV4dCA9IE5VTEw7CisJfQorCXBkZXYtPmVtcHR5X2ZyYW1lcyA9ICZwZGV2LT5mYnVmW2RlZmF1bHRfZmJ1ZnMgLSAxXTsKKwlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbCA9IHBkZXYtPmZidWY7CisJcGRldi0+cmVhZF9mcmFtZSA9IE5VTEw7CisJcGRldi0+ZmlsbF9mcmFtZSA9IHBkZXYtPmVtcHR5X2ZyYW1lczsKKwlwZGV2LT5lbXB0eV9mcmFtZXMgPSBwZGV2LT5lbXB0eV9mcmFtZXMtPm5leHQ7CisKKwlwZGV2LT5pbWFnZV9yZWFkX3BvcyA9IDA7CisJcGRldi0+ZmlsbF9pbWFnZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworfQorCisKKy8qKgorICBcYnJpZWYgRG8gYWxsIHRoZSBoYW5kbGluZyBmb3IgZ2V0dGluZyBvbmUgZnJhbWU6IGdldCBwb2ludGVyLCBkZWNvbXByZXNzLCBhZHZhbmNlIHBvaW50ZXJzLgorICovCitzdGF0aWMgaW50IHB3Y19oYW5kbGVfZnJhbWUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7CisJLyogRmlyc3QgZ3JhYiBvdXIgcmVhZF9mcmFtZTsgdGhpcyBpcyByZW1vdmVkIGZyb20gYWxsIGxpc3RzLCBzbworCSAgIHdlIGNhbiByZWxlYXNlIHRoZSBsb2NrIGFmdGVyIHRoaXMgd2l0aG91dCBwcm9ibGVtcyAqLworCWlmIChwZGV2LT5yZWFkX2ZyYW1lICE9IE5VTEwpIHsKKwkJLyogVGhpcyBjYW4ndCB0aGVvcmV0aWNhbGx5IGhhcHBlbiAqLworCQlFcnIoIkh1aD8gUmVhZCBmcmFtZSBzdGlsbCBpbiB1c2U/XG4iKTsKKwl9CisJZWxzZSB7CisJCWlmIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7CisJCQlFcnIoIldvb3BzLiBObyBmcmFtZXMgcmVhZHkuXG4iKTsKKwkJfQorCQllbHNlIHsKKwkJCXBkZXYtPnJlYWRfZnJhbWUgPSBwZGV2LT5mdWxsX2ZyYW1lczsKKwkJCXBkZXYtPmZ1bGxfZnJhbWVzID0gcGRldi0+ZnVsbF9mcmFtZXMtPm5leHQ7CisJCQlwZGV2LT5yZWFkX2ZyYW1lLT5uZXh0ID0gTlVMTDsKKwkJfQorCisJCWlmIChwZGV2LT5yZWFkX2ZyYW1lICE9IE5VTEwpIHsKKyNpZiBQV0NfREVCVUcKKwkJCVRyYWNlKFRSQUNFX1NFUVVFTkNFLCAiRGVjb21wcmVzc2luZyBmcmFtZSAlZFxuIiwgcGRldi0+cmVhZF9mcmFtZS0+c2VxdWVuY2UpOworI2VuZGlmCisJCQkvKiBEZWNvbXByZXNzaW9uIGlzIGEgbGVuZ2h0eSBwcm9jZXNzLCBzbyBpdCdzIG91dHNpZGUgb2YgdGhlIGxvY2suCisJCQkgICBUaGlzIGdpdmVzIHRoZSBpc29jX2hhbmRsZXIgdGhlIG9wcG9ydHVuaXR5IHRvIGZpbGwgbW9yZSBmcmFtZXMKKwkJCSAgIGluIHRoZSBtZWFuIHRpbWUuCisJCQkqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworCQkJcmV0ID0gcHdjX2RlY29tcHJlc3MocGRldik7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworCisJCQkvKiBXZSdyZSBkb25lIHdpdGggcmVhZF9idWZmZXIsIHRhY2sgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZW1wdHkgYnVmZmVyIGxpc3QgKi8KKwkJCWlmIChwZGV2LT5lbXB0eV9mcmFtZXMgPT0gTlVMTCkgeworCQkJCXBkZXYtPmVtcHR5X2ZyYW1lcyA9IHBkZXYtPnJlYWRfZnJhbWU7CisJCQkJcGRldi0+ZW1wdHlfZnJhbWVzX3RhaWwgPSBwZGV2LT5lbXB0eV9mcmFtZXM7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbC0+bmV4dCA9IHBkZXYtPnJlYWRfZnJhbWU7CisJCQkJcGRldi0+ZW1wdHlfZnJhbWVzX3RhaWwgPSBwZGV2LT5yZWFkX2ZyYW1lOworCQkJfQorCQkJcGRldi0+cmVhZF9mcmFtZSA9IE5VTEw7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICBcYnJpZWYgQWR2YW5jZSBwb2ludGVycyBvZiBpbWFnZSBidWZmZXIgKGFmdGVyIGVhY2ggdXNlciByZXF1ZXN0KQorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwd2NfbmV4dF9pbWFnZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlwZGV2LT5pbWFnZV91c2VkW3BkZXYtPmZpbGxfaW1hZ2VdID0gMDsKKwlwZGV2LT5maWxsX2ltYWdlID0gKHBkZXYtPmZpbGxfaW1hZ2UgKyAxKSAlIGRlZmF1bHRfbWJ1ZnM7Cit9CisKKworLyogVGhpcyBnZXRzIGNhbGxlZCBmb3IgdGhlIElzb2Nocm9ub3VzIHBpcGUgKHZpZGVvKS4gVGhpcyBpcyBkb25lIGluCisgKiBpbnRlcnJ1cHQgdGltZSwgc28gaXQgaGFzIHRvIGJlIGZhc3QsIG5vdCBjcmFzaCwgYW5kIG5vdCBzdGFsbC4gTmVhdC4KKyAqLworc3RhdGljIHZvaWQgcHdjX2lzb2NfaGFuZGxlcihzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OworCWludCBpLCBmc3QsIGZsZW47CisJaW50IGF3YWtlOworCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmOworCXVuc2lnbmVkIGNoYXIgKmZpbGxwdHIgPSBOVUxMLCAqaXNvX2J1ZiA9IE5VTEw7CisKKwlhd2FrZSA9IDA7CisJcGRldiA9IChzdHJ1Y3QgcHdjX2RldmljZSAqKXVyYi0+Y29udGV4dDsKKwlpZiAocGRldiA9PSBOVUxMKSB7CisJCUVycigiaXNvY19oYW5kbGVyKCkgY2FsbGVkIHdpdGggTlVMTCBkZXZpY2U/IVxuIik7CisJCXJldHVybjsKKwl9CisjaWZkZWYgUFdDX01BR0lDCisJaWYgKHBkZXYtPm1hZ2ljICE9IFBXQ19NQUdJQykgeworCQlFcnIoImlzb2NfaGFuZGxlcigpIGNhbGxlZCB3aXRoIGJhZCBtYWdpYyFcbiIpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpIHsKKwkJVHJhY2UoVFJBQ0VfT1BFTiwgInB3Y19pc29jX2hhbmRsZXIoKTogVVJCICglcCkgdW5saW5rZWQgJXNzeW5jaHJvbnVvdXNseS5cbiIsIHVyYiwgdXJiLT5zdGF0dXMgPT0gLUVOT0VOVCA/ICIiIDogImEiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTICYmIHVyYi0+c3RhdHVzICE9IDApIHsKKwkJY29uc3QgY2hhciAqZXJybXNnOworCisJCWVycm1zZyA9ICJVbmtub3duIjsKKwkJc3dpdGNoKHVyYi0+c3RhdHVzKSB7CisJCQljYXNlIC1FTk9TUjoJCWVycm1zZyA9ICJCdWZmZXIgZXJyb3IgKG92ZXJydW4pIjsgYnJlYWs7CisJCQljYXNlIC1FUElQRToJCWVycm1zZyA9ICJTdGFsbGVkIChkZXZpY2Ugbm90IHJlc3BvbmRpbmcpIjsgYnJlYWs7CisJCQljYXNlIC1FT1ZFUkZMT1c6CWVycm1zZyA9ICJCYWJibGUgKGJhZCBjYWJsZT8pIjsgYnJlYWs7CisJCQljYXNlIC1FUFJPVE86CQllcnJtc2cgPSAiQml0LXN0dWZmIGVycm9yIChiYWQgY2FibGU/KSI7IGJyZWFrOworCQkJY2FzZSAtRUlMU0VROgkJZXJybXNnID0gIkNSQy9UaW1lb3V0IChjb3VsZCBiZSBhbnl0aGluZykiOyBicmVhazsKKwkJCWNhc2UgLUVUSU1FRE9VVDoJZXJybXNnID0gIk5BSyAoZGV2aWNlIGRvZXMgbm90IHJlc3BvbmQpIjsgYnJlYWs7CisJCX0KKwkJVHJhY2UoVFJBQ0VfRkxPVywgInB3Y19pc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBzdGF0dXMgJWQgWyVzXS5cbiIsIHVyYi0+c3RhdHVzLCBlcnJtc2cpOworCQkvKiBHaXZlIHVwIGFmdGVyIGEgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZXJyb3JzIG9uIHRoZSBVU0IgYnVzLiAKKwkJICAgQXBwZWFyYW50bHkgc29tZXRoaW5nIGlzIHdyb25nIHNvIHdlIHNpbXVsYXRlIGFuIHVucGx1ZyBldmVudC4KKwkJICovCisJCWlmICgrK3BkZXYtPnZpc29jX2Vycm9ycyA+IE1BWF9JU09DX0VSUk9SUykKKwkJeworCQkJSW5mbygiVG9vIG1hbnkgSVNPQyBlcnJvcnMsIGJhaWxpbmcgb3V0LlxuIik7CisJCQlwZGV2LT5lcnJvcl9zdGF0dXMgPSBFSU87CisJCQlhd2FrZSA9IDE7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBkZXYtPmZyYW1lcSk7CisJCX0KKwkJZ290byBoYW5kbGVyX2VuZDsgLy8gdWdseSwgYnV0IHByYWN0aWNhbAorCX0KKworCWZidWYgPSBwZGV2LT5maWxsX2ZyYW1lOworCWlmIChmYnVmID09IE5VTEwpIHsKKwkJRXJyKCJwd2NfaXNvY19oYW5kbGVyIHdpdGhvdXQgdmFsaWQgZmlsbCBmcmFtZS5cbiIpOworCQlhd2FrZSA9IDE7CisJCWdvdG8gaGFuZGxlcl9lbmQ7CisJfQorCWVsc2UgeworCQlmaWxscHRyID0gZmJ1Zi0+ZGF0YSArIGZidWYtPmZpbGxlZDsKKwl9CisKKwkvKiBSZXNldCBJU09DIGVycm9yIGNvdW50ZXIuIFdlIGRpZCBnZXQgaGVyZSwgYWZ0ZXIgYWxsLiAqLworCXBkZXYtPnZpc29jX2Vycm9ycyA9IDA7CisKKwkvKiB2c3luYzogMCA9IGRvbid0IGNvcHkgZGF0YQorCSAgICAgICAgICAxID0gc3luYy1odW50CisJICAgICAgICAgIDIgPSBzeW5jaGVkCisJICovCisJLyogQ29tcGFjdCBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQlmc3QgID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CisJCWZsZW4gPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CisJCWlzb19idWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OworCQlpZiAoZnN0ID09IDApIHsKKwkJCWlmIChmbGVuID4gMCkgeyAvKiBpZiB2YWxpZCBkYXRhLi4uICovCisJCQkJaWYgKHBkZXYtPnZzeW5jID4gMCkgeyAvKiAuLi5hbmQgd2UgYXJlIG5vdCBzeW5jLWh1bnRpbmcuLi4gKi8KKwkJCQkJcGRldi0+dnN5bmMgPSAyOworCisJCQkJCS8qIC4uLmNvcHkgZGF0YSB0byBmcmFtZSBidWZmZXIsIGlmIHBvc3NpYmxlICovCisJCQkJCWlmIChmbGVuICsgZmJ1Zi0+ZmlsbGVkID4gcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgeworCQkJCQkJVHJhY2UoVFJBQ0VfRkxPVywgIkZyYW1lIGJ1ZmZlciBvdmVyZmxvdyAoZmxlbiA9ICVkLCBmcmFtZV90b3RhbF9zaXplID0gJWQpLlxuIiwgZmxlbiwgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSk7CisJCQkJCQlwZGV2LT52c3luYyA9IDA7IC8qIEhtbSwgbGV0J3Mgd2FpdCBmb3IgYW4gRU9GIChlbmQtb2YtZnJhbWUpICovCisJCQkJCQlwZGV2LT52ZnJhbWVzX2Vycm9yKys7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQltZW1tb3ZlKGZpbGxwdHIsIGlzb19idWYsIGZsZW4pOworCQkJCQkJZmlsbHB0ciArPSBmbGVuOworCQkJCQl9CisJCQkJfQorCQkJCWZidWYtPmZpbGxlZCArPSBmbGVuOworCQkJfSAvKiAuLmZsZW4gPiAwICovCisKKwkJCWlmIChmbGVuIDwgcGRldi0+dmxhc3RfcGFja2V0X3NpemUpIHsKKwkJCQkvKiBTaG9ydGVyIHBhY2tldC4uLiBXZSBwcm9iYWJseSBoYXZlIHRoZSBlbmQgb2YgYW4gaW1hZ2UtZnJhbWU7IAorCQkJCSAgIHdha2UgdXAgcmVhZCgpIHByb2Nlc3MgYW5kIGxldCBzZWxlY3QoKS9wb2xsKCkgZG8gc29tZXRoaW5nLgorCQkJCSAgIERlY29tcHJlc3Npb24gaXMgZG9uZSBpbiB1c2VyIHRpbWUgb3ZlciB0aGVyZS4KKwkJCQkgKi8KKwkJCQlpZiAocGRldi0+dnN5bmMgPT0gMikgeworCQkJCQkvKiBUaGUgVG9VQ2FtIEZ1biBDTU9TIHNlbnNvciBjYXVzZXMgdGhlIGZpcm13YXJlIHRvIHNlbmQgMiBvciAzIGJvZ3VzIAorCQkJCQkgICBmcmFtZXMgb24gdGhlIFVTQiB3aXJlIGFmdGVyIGFuIGV4cG9zdXJlIGNoYW5nZS4gVGhpcyBjb25kaXRpdGlvbiBpcyAKKwkJCQkJICAgaG93ZXZlciBkZXRlY3RlZCAgaW4gdGhlIGNhbSBhbmQgYSBiaXQgaXMgc2V0IGluIHRoZSBoZWFkZXIuCisJCQkJCSAqLworCQkJCQlpZiAocGRldi0+dHlwZSA9PSA3MzApIHsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopZmJ1Zi0+ZGF0YTsKKwkJCQkJCQorCQkJCQkJaWYgKHB0clsxXSA9PSAxICYmIHB0clswXSAmIDB4MTApIHsKKyNpZiBQV0NfREVCVUcKKwkJCQkJCQlEZWJ1ZygiSHl1bmRhaSBDTU9TIHNlbnNvciBidWcuIERyb3BwaW5nIGZyYW1lICVkLlxuIiwgZmJ1Zi0+c2VxdWVuY2UpOworI2VuZGlmCisJCQkJCQkJcGRldi0+ZHJvcF9mcmFtZXMgKz0gMjsKKwkJCQkJCQlwZGV2LT52ZnJhbWVzX2Vycm9yKys7CisJCQkJCQl9CisJCQkJCQlpZiAoKHB0clswXSBeIHBkZXYtPnZtaXJyb3IpICYgMHgwMSkgeworCQkJCQkJCWlmIChwdHJbMF0gJiAweDAxKQorCQkJCQkJCQlJbmZvKCJTbmFwc2hvdCBidXR0b24gcHJlc3NlZC5cbiIpOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJSW5mbygiU25hcHNob3QgYnV0dG9uIHJlbGVhc2VkLlxuIik7CisJCQkJCQl9CisJCQkJCQlpZiAoKHB0clswXSBeIHBkZXYtPnZtaXJyb3IpICYgMHgwMikgeworCQkJCQkJCWlmIChwdHJbMF0gJiAweDAyKQorCQkJCQkJCQlJbmZvKCJJbWFnZSBpcyBtaXJyb3JlZC5cbiIpOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJSW5mbygiSW1hZ2UgaXMgbm9ybWFsLlxuIik7CisJCQkJCQl9CisJCQkJCQlwZGV2LT52bWlycm9yID0gcHRyWzBdICYgMHgwMzsKKwkJCQkJCS8qIFNvbWV0aW1lcyB0aGUgdHJhaWxlciBvZiB0aGUgNzMwIGlzIHN0aWxsIHNlbnQgYXMgYSA0IGJ5dGUgcGFja2V0IAorCQkJCQkJICAgYWZ0ZXIgYSBzaG9ydCBmcmFtZTsgdGhpcyBjb25kaXRpb24gaXMgZmlsdGVyZWQgb3V0IHNwZWNpZmljYWxseS4gQSA0IGJ5dGUKKwkJCQkJCSAgIGZyYW1lIGRvZXNuJ3QgbWFrZSBzZW5zZSBhbnl3YXkuCisJCQkJCQkgICBTbyB3ZSBnZXQgZWl0aGVyIHRoaXMgc2VxdWVuY2U6IAorCQkJCQkJICAgCWRyb3BfYml0IHNldCAtPiA0IGJ5dGUgZnJhbWUgLT4gc2hvcnQgZnJhbWUgLT4gZ29vZCBmcmFtZQorCQkJCQkJICAgT3IgdGhpcyBvbmU6CisJCQkJCQkgICAJZHJvcF9iaXQgc2V0IC0+IHNob3J0IGZyYW1lIC0+IGdvb2QgZnJhbWUKKwkJCQkJCSAgIFNvIHdlIGRyb3AgZWl0aGVyIDMgb3IgMiBmcmFtZXMgaW4gYWxsIQorCQkJCQkJICovCisJCQkJCQlpZiAoZmJ1Zi0+ZmlsbGVkID09IDQpCisJCQkJCQkJcGRldi0+ZHJvcF9mcmFtZXMrKzsKKwkJCQkJfQorCisJCQkJCS8qIEluIGNhc2Ugd2Ugd2VyZSBpbnN0cnVjdGVkIHRvIGRyb3AgdGhlIGZyYW1lLCBkbyBzbyBzaWxlbnRseS4KKwkJCQkJICAgVGhlIGJ1ZmZlciBwb2ludGVycyBhcmUgbm90IHVwZGF0ZWQgZWl0aGVyIChidXQgdGhlIGNvdW50ZXJzIGFyZSByZXNldCBiZWxvdykuCisJCQkJCSAqLworCQkJCQlpZiAocGRldi0+ZHJvcF9mcmFtZXMgPiAwKQorCQkJCQkJcGRldi0+ZHJvcF9mcmFtZXMtLTsKKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBDaGVjayBmb3IgdW5kZXJmbG93IGZpcnN0ICovCisJCQkJCQlpZiAoZmJ1Zi0+ZmlsbGVkIDwgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgeworCQkJCQkJCVRyYWNlKFRSQUNFX0ZMT1csICJGcmFtZSBidWZmZXIgdW5kZXJmbG93ICglZCBieXRlcyk7IGRpc2NhcmRlZC5cbiIsIGZidWYtPmZpbGxlZCk7CisJCQkJCQkJcGRldi0+dmZyYW1lc19lcnJvcisrOworCQkJCQkJfQorCQkJCQkJZWxzZSB7CisJCQkJCQkJLyogU2VuZCBvbmx5IG9uY2UgcGVyIEVPRiAqLworCQkJCQkJCWF3YWtlID0gMTsgLyogZGVsYXkgd2FrZV91cHMgKi8KKworCQkJCQkJCS8qIEZpbmQgb3VyIG5leHQgZnJhbWUgdG8gZmlsbC4gVGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkLCBzaW5jZSB3ZQorCQkJCQkJCSAqIG5pY2sgYSBmcmFtZSBmcm9tIGVpdGhlciBlbXB0eSBvciBmdWxsIGxpc3QsIGJ1dCBpZiB3ZSBoYWQgdG8KKwkJCQkJCQkgKiB0YWtlIGl0IGZyb20gdGhlIGZ1bGwgbGlzdCwgaXQgbWVhbnMgYSBmcmFtZSBnb3QgZHJvcHBlZC4KKwkJCQkJCQkgKi8KKwkJCQkJCQlpZiAocHdjX25leHRfZmlsbF9mcmFtZShwZGV2KSkgeworCQkJCQkJCQlwZGV2LT52ZnJhbWVzX2R1bXBlZCsrOworCQkJCQkJCQlpZiAoKHBkZXYtPnZmcmFtZV9jb3VudCA+IEZSQU1FX0xPV01BUkspICYmIChwd2NfdHJhY2UgJiBUUkFDRV9GTE9XKSkgeworCQkJCQkJCQkJaWYgKHBkZXYtPnZmcmFtZXNfZHVtcGVkIDwgMjApCisJCQkJCQkJCQkJVHJhY2UoVFJBQ0VfRkxPVywgIkR1bXBpbmcgZnJhbWUgJWQuXG4iLCBwZGV2LT52ZnJhbWVfY291bnQpOworCQkJCQkJCQkJaWYgKHBkZXYtPnZmcmFtZXNfZHVtcGVkID09IDIwKQorCQkJCQkJCQkJCVRyYWNlKFRSQUNFX0ZMT1csICJEdW1waW5nIGZyYW1lICVkIChsYXN0IG1lc3NhZ2UpLlxuIiwgcGRldi0+dmZyYW1lX2NvdW50KTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlmYnVmID0gcGRldi0+ZmlsbF9mcmFtZTsKKwkJCQkJCX0KKwkJCQkJfSAvKiAhZHJvcF9mcmFtZXMgKi8KKwkJCQkJcGRldi0+dmZyYW1lX2NvdW50Kys7CisJCQkJfQorCQkJCWZidWYtPmZpbGxlZCA9IDA7CisJCQkJZmlsbHB0ciA9IGZidWYtPmRhdGE7CisJCQkJcGRldi0+dnN5bmMgPSAxOworCQkJfSAvKiAuLiBmbGVuIDwgbGFzdF9wYWNrZXRfc2l6ZSAqLworCQkJcGRldi0+dmxhc3RfcGFja2V0X3NpemUgPSBmbGVuOworCQl9IC8qIC4uc3RhdHVzID09IDAgKi8KKyNpZiBQV0NfREVCVUcKKwkJLyogVGhpcyBpcyBub3JtYWxseSBub3QgaW50ZXJlc3RpbmcgdG8gdGhlIHVzZXIsIHVubGVzcyB5b3UgYXJlIHJlYWxseSBkZWJ1Z2dpbmcgc29tZXRoaW5nICovCisJCWVsc2UgeworCQkJc3RhdGljIGludCBpc29fZXJyb3IgPSAwOworCQkJaXNvX2Vycm9yKys7CisJCQlpZiAoaXNvX2Vycm9yIDwgMjApCisJCQkJVHJhY2UoVFJBQ0VfRkxPVywgIklzbyBmcmFtZSAlZCBvZiBVU0IgaGFzIGVycm9yICVkXG4iLCBpLCBmc3QpOworCQl9CisjZW5kaWYKKwl9CisKK2hhbmRsZXJfZW5kOgorCWlmIChhd2FrZSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwZGV2LT5mcmFtZXEpOworCisJdXJiLT5kZXYgPSBwZGV2LT51ZGV2OworCWkgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChpICE9IDApCisJCUVycigiRXJyb3IgKCVkKSByZS1zdWJtaXR0aW5nIHVyYiBpbiBwd2NfaXNvY19oYW5kbGVyLlxuIiwgaSk7Cit9CisKKworc3RhdGljIGludCBwd2NfaXNvY19pbml0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1cmIgKnVyYjsKKwlpbnQgaSwgaiwgcmV0OworCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWRlc2MgPSBOVUxMOworCisJaWYgKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHBkZXYtPmlzb19pbml0KQorCQlyZXR1cm4gMDsKKwlwZGV2LT52c3luYyA9IDA7CisJdWRldiA9IHBkZXYtPnVkZXY7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgYWx0ZXJuYXRlIGludGVyZmFjZSwgYWRqdXN0IHBhY2tldCBzaXplICovCisJaWYgKCF1ZGV2LT5hY3Rjb25maWcpCisJCXJldHVybiAtRUZBVUxUOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw1KQorCWlkZXNjID0gJnVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlWzBdLT5hbHRzZXR0aW5nW3BkZXYtPnZhbHRlcm5hdGVdOworI2Vsc2UKKwlpbnRmID0gdXNiX2lmbnVtX3RvX2lmKHVkZXYsIDApOworCWlmIChpbnRmKQorCQlpZGVzYyA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpbnRmLCBwZGV2LT52YWx0ZXJuYXRlKTsKKyNlbmRpZgorCQkKKwlpZiAoIWlkZXNjKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIFNlYXJjaCB2aWRlbyBlbmRwb2ludCAqLworCXBkZXYtPnZtYXhfcGFja2V0X3NpemUgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgaWRlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKQorCQlpZiAoKGlkZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiAweEYpID09IHBkZXYtPnZlbmRwb2ludCkgeworCQkJcGRldi0+dm1heF9wYWNrZXRfc2l6ZSA9IGxlMTZfdG9fY3B1KGlkZXNjLT5lbmRwb2ludFtpXS5kZXNjLndNYXhQYWNrZXRTaXplKTsKKwkJCWJyZWFrOworCQl9CisJCisJaWYgKHBkZXYtPnZtYXhfcGFja2V0X3NpemUgPCAwIHx8IHBkZXYtPnZtYXhfcGFja2V0X3NpemUgPiBJU09fTUFYX0ZSQU1FX1NJWkUpIHsKKwkJRXJyKCJGYWlsZWQgdG8gZmluZCBwYWNrZXQgc2l6ZSBmb3IgdmlkZW8gZW5kcG9pbnQgaW4gY3VycmVudCBhbHRlcm5hdGUgc2V0dGluZy5cbiIpOworCQlyZXR1cm4gLUVORklMRTsgLyogT2RkIGVycm9yLCB0aGF0IHNob3VsZCBiZSBub3RpY2FibGUgKi8KKwl9CisKKwkvKiBTZXQgYWx0ZXJuYXRlIGludGVyZmFjZSAqLworCXJldCA9IDA7CisJVHJhY2UoVFJBQ0VfT1BFTiwgIlNldHRpbmcgYWx0ZXJuYXRlIGludGVyZmFjZSAlZFxuIiwgcGRldi0+dmFsdGVybmF0ZSk7CisJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UocGRldi0+dWRldiwgMCwgcGRldi0+dmFsdGVybmF0ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKKwkJdXJiID0gdXNiX2FsbG9jX3VyYihJU09fRlJBTUVTX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVyYiA9PSBOVUxMKSB7CisJCQlFcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSB1cmIgJWRcbiIsIGkpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCXBkZXYtPnNidWZbaV0udXJiID0gdXJiOworCQlUcmFjZShUUkFDRV9NRU1PUlksICJBbGxvY2F0ZWQgVVJCIGF0IDB4JXBcbiIsIHVyYik7CisJfQorCWlmIChyZXQpIHsKKwkJLyogRGUtYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciAqLworCQl3aGlsZSAoaSA+PSAwKSB7CisJCQlpZiAocGRldi0+c2J1ZltpXS51cmIgIT0gTlVMTCkKKwkJCQl1c2JfZnJlZV91cmIocGRldi0+c2J1ZltpXS51cmIpOworCQkJcGRldi0+c2J1ZltpXS51cmIgPSBOVUxMOworCQkJaS0tOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCisJLyogaW5pdCBVUkIgc3RydWN0dXJlICovCQorCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgeworCQl1cmIgPSBwZGV2LT5zYnVmW2ldLnVyYjsKKworCQl1cmItPmludGVydmFsID0gMTsgLy8gZGV2aWsKKwkJdXJiLT5kZXYgPSB1ZGV2OworCSAgICAgICAgdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKHVkZXYsIHBkZXYtPnZlbmRwb2ludCk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJICAgICAgICB1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHBkZXYtPnNidWZbaV0uZGF0YTsKKwkgICAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IElTT19CVUZGRVJfU0laRTsKKwkgICAgICAgIHVyYi0+Y29tcGxldGUgPSBwd2NfaXNvY19oYW5kbGVyOworCSAgICAgICAgdXJiLT5jb250ZXh0ID0gcGRldjsKKwkJdXJiLT5zdGFydF9mcmFtZSA9IDA7CisJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBJU09fRlJBTUVTX1BFUl9ERVNDOworCQlmb3IgKGogPSAwOyBqIDwgSVNPX0ZSQU1FU19QRVJfREVTQzsgaisrKSB7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGogKiBJU09fTUFYX0ZSQU1FX1NJWkU7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IHBkZXYtPnZtYXhfcGFja2V0X3NpemU7CisJCX0KKwl9CisKKwkvKiBsaW5rICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHBkZXYtPnNidWZbaV0udXJiLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJldCkKKwkJCUVycigiaXNvY19pbml0KCkgc3VibWl0X3VyYiAlZCBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgaSwgcmV0KTsKKwkJZWxzZQorCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiVVJCIDB4JXAgc3VibWl0dGVkLlxuIiwgcGRldi0+c2J1ZltpXS51cmIpOworCX0KKworCS8qIEFsbCBpcyBkb25lLi4uICovCisJcGRldi0+aXNvX2luaXQgPSAxOworCVRyYWNlKFRSQUNFX09QRU4sICI8PCBwd2NfaXNvY19pbml0KClcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwd2NfaXNvY19jbGVhbnVwKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWludCBpOworCisJVHJhY2UoVFJBQ0VfT1BFTiwgIj4+IHB3Y19pc29jX2NsZWFudXAoKVxuIik7CisJaWYgKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogVW5saW5raW5nIElTT0MgYnVmZmVycyBvbmUgYnkgb25lICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7CisJCXN0cnVjdCB1cmIgKnVyYjsKKworCQl1cmIgPSBwZGV2LT5zYnVmW2ldLnVyYjsKKwkJaWYgKHVyYiAhPSAwKSB7CisJCQlpZiAocGRldi0+aXNvX2luaXQpIHsKKwkJCQlUcmFjZShUUkFDRV9NRU1PUlksICJVbmxpbmtpbmcgVVJCICVwXG4iLCB1cmIpOworCQkJCXVzYl9raWxsX3VyYih1cmIpOworCQkJfQorCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiRnJlZWluZyBVUkJcbiIpOworCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCQlwZGV2LT5zYnVmW2ldLnVyYiA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBTdG9wIGNhbWVyYSwgYnV0IG9ubHkgaWYgd2UgYXJlIHN1cmUgdGhlIGNhbWVyYSBpcyBzdGlsbCB0aGVyZSAodW5wbHVnCisJICAgaXMgc2lnbmFsbGVkIGJ5IEVQSVBFKSAKKwkgKi8KKwlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzICYmIHBkZXYtPmVycm9yX3N0YXR1cyAhPSBFUElQRSkgeworCQlUcmFjZShUUkFDRV9PUEVOLCAiU2V0dGluZyBhbHRlcm5hdGUgaW50ZXJmYWNlIDAuXG4iKTsKKwkJdXNiX3NldF9pbnRlcmZhY2UocGRldi0+dWRldiwgMCwgMCk7CisJfQorCisJcGRldi0+aXNvX2luaXQgPSAwOworCVRyYWNlKFRSQUNFX09QRU4sICI8PCBwd2NfaXNvY19jbGVhbnVwKClcbiIpOworfQorCitpbnQgcHdjX3RyeV92aWRlb19tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuZXdfZnBzLCBpbnQgbmV3X2NvbXByZXNzaW9uLCBpbnQgbmV3X3NuYXBzaG90KQoreworCWludCByZXQsIHN0YXJ0OworCisJLyogU3RvcCBpc29jIHN0dWZmICovCisJcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKKwkvKiBSZXNldCBwYXJhbWV0ZXJzICovCisJcHdjX3Jlc2V0X2J1ZmZlcnMocGRldik7CisJLyogVHJ5IHRvIHNldCB2aWRlbyBtb2RlLi4uICovCisJc3RhcnQgPSByZXQgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgd2lkdGgsIGhlaWdodCwgbmV3X2ZwcywgbmV3X2NvbXByZXNzaW9uLCBuZXdfc25hcHNob3QpOworCWlmIChyZXQpIHsgCisJICAgICAgICBUcmFjZShUUkFDRV9GTE9XLCAicHdjX3NldF92aWRlb19tb2RlIGF0dGVtcHQgMSBmYWlsZWQuXG4iKTsKKwkJLyogVGhhdCBmYWlsZWQuLi4gcmVzdG9yZSBvbGQgbW9kZSAod2Uga25vdyB0aGF0IHdvcmtlZCkgKi8KKwkJc3RhcnQgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcGRldi0+dmlldy54LCBwZGV2LT52aWV3LnksIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgcGRldi0+dnNuYXBzaG90KTsKKwkJaWYgKHN0YXJ0KSB7CisJCSAgICAgICAgVHJhY2UoVFJBQ0VfRkxPVywgInB3Y19zZXRfdmlkZW9fbW9kZSBhdHRlbXB0IDIgZmFpbGVkLlxuIik7CisJCX0KKwl9CisJaWYgKHN0YXJ0ID09IDApCisJeworCQlpZiAocHdjX2lzb2NfaW5pdChwZGV2KSA8IDApCisJCXsKKwkJCUluZm8oIkZhaWxlZCB0byByZXN0YXJ0IElTT0MgdHJhbnNmZXJzIGluIHB3Y190cnlfdmlkZW9fbW9kZS5cbiIpOworCQkJcmV0ID0gLUVBR0FJTjsgLyogbGV0J3MgdHJ5IGFnYWluLCB3aG8ga25vd3MgaWYgaXQgd29ya3MgYSBzZWNvbmQgdGltZSAqLworCQl9CisJfQorCXBkZXYtPmRyb3BfZnJhbWVzKys7IC8qIHRyeSB0byBhdm9pZCBnYXJiYWdlIGR1cmluZyBzd2l0Y2ggKi8KKwlyZXR1cm4gcmV0OyAvKiBSZXR1cm4gb3JpZ2luYWwgZXJyb3IgY29kZSAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBWaWRlbzRMaW51eCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBwd2NfdmlkZW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKKworCVRyYWNlKFRSQUNFX09QRU4sICI+PiB2aWRlb19vcGVuIGNhbGxlZCh2ZGV2ID0gMHglcCkuXG4iLCB2ZGV2KTsKKwkKKwlwZGV2ID0gKHN0cnVjdCBwd2NfZGV2aWNlICopdmRldi0+cHJpdjsKKwlpZiAocGRldiA9PSBOVUxMKQorCQlCVUcoKTsKKwlpZiAocGRldi0+dm9wZW4pCisJCXJldHVybiAtRUJVU1k7CisJCisJZG93bigmcGRldi0+bW9kbG9jayk7CisJaWYgKCFwZGV2LT51c2JfaW5pdCkgeworCQlUcmFjZShUUkFDRV9PUEVOLCAiRG9pbmcgZmlyc3QgdGltZSBpbml0aWFsaXphdGlvbi5cbiIpOworCQlwZGV2LT51c2JfaW5pdCA9IDE7CisJCQorCQlpZiAocHdjX3RyYWNlICYgVFJBQ0VfT1BFTikKKwkJeworCQkJLyogUXVlcnkgc2Vuc29yIHR5cGUgKi8KKwkJCWNvbnN0IGNoYXIgKnNlbnNvcl90eXBlID0gTlVMTDsKKwkJCWludCByZXQ7CisKKwkJCXJldCA9IHB3Y19nZXRfY21vc19zZW5zb3IocGRldiwgJmkpOworCQkJaWYgKHJldCA+PSAwKQorCQkJeworCQkJCXN3aXRjaChpKSB7CisJCQkJY2FzZSAweDAwOiAgc2Vuc29yX3R5cGUgPSAiSHl1bmRhaSBDTU9TIHNlbnNvciI7IGJyZWFrOworCQkJCWNhc2UgMHgyMDogIHNlbnNvcl90eXBlID0gIlNvbnkgQ0NEIHNlbnNvciArIFREQTg3ODciOyBicmVhazsKKwkJCQljYXNlIDB4MkU6ICBzZW5zb3JfdHlwZSA9ICJTb255IENDRCBzZW5zb3IgKyBFeGFzIDk4TDU5IjsgYnJlYWs7CisJCQkJY2FzZSAweDJGOiAgc2Vuc29yX3R5cGUgPSAiU29ueSBDQ0Qgc2Vuc29yICsgQURJIDk4MDQiOyBicmVhazsKKwkJCQljYXNlIDB4MzA6ICBzZW5zb3JfdHlwZSA9ICJTaGFycCBDQ0Qgc2Vuc29yICsgVERBODc4NyI7IGJyZWFrOworCQkJCWNhc2UgMHgzRTogIHNlbnNvcl90eXBlID0gIlNoYXJwIENDRCBzZW5zb3IgKyBFeGFzIDk4TDU5IjsgYnJlYWs7CisJCQkJY2FzZSAweDNGOiAgc2Vuc29yX3R5cGUgPSAiU2hhcnAgQ0NEIHNlbnNvciArIEFESSA5ODA0IjsgYnJlYWs7CisJCQkJY2FzZSAweDQwOiAgc2Vuc29yX3R5cGUgPSAiVVBBIDEwMjEgc2Vuc29yIjsgYnJlYWs7CisJCQkJY2FzZSAweDEwMDogc2Vuc29yX3R5cGUgPSAiVkdBIHNlbnNvciI7IGJyZWFrOworCQkJCWNhc2UgMHgxMDE6IHNlbnNvcl90eXBlID0gIlBBTCBNUiBzZW5zb3IiOyBicmVhazsKKwkJCQlkZWZhdWx0OiAgICBzZW5zb3JfdHlwZSA9ICJ1bmtub3duIHR5cGUgb2Ygc2Vuc29yIjsgYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHNlbnNvcl90eXBlICE9IE5VTEwpCisJCQkJSW5mbygiVGhpcyAlcyBjYW1lcmEgaXMgZXF1aXBwZWQgd2l0aCBhICVzICglZCkuXG4iLCBwZGV2LT52ZGV2LT5uYW1lLCBzZW5zb3JfdHlwZSwgaSk7CisJCX0KKwl9CisKKwkvKiBUdXJuIG9uIGNhbWVyYSAqLworCWlmIChwb3dlcl9zYXZlKSB7CisJCWkgPSBwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDEpOworCQlpZiAoaSA8IDApCisJCQlJbmZvKCJGYWlsZWQgdG8gcmVzdG9yZSBwb3dlciB0byB0aGUgY2FtZXJhISAoJWQpXG4iLCBpKTsKKwl9CisJLyogU2V0IExFRCBvbi9vZmYgdGltZSAqLworCWlmIChwd2Nfc2V0X2xlZHMocGRldiwgbGVkX29uLCBsZWRfb2ZmKSA8IDApCisJCUluZm8oIkZhaWxlZCB0byBzZXQgTEVEIG9uL29mZiB0aW1lLlxuIik7CisJCisJcHdjX2NvbnN0cnVjdChwZGV2KTsgLyogc2V0IG1pbi9tYXggc2l6ZXMgY29ycmVjdCAqLworCisJLyogU28gZmFyLCBzbyBnb29kLiBBbGxvY2F0ZSBtZW1vcnkuICovCisJaSA9IHB3Y19hbGxvY2F0ZV9idWZmZXJzKHBkZXYpOworCWlmIChpIDwgMCkgeworCQlUcmFjZShUUkFDRV9PUEVOLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBtZW1vcnkuXG4iKTsKKwkJdXAoJnBkZXYtPm1vZGxvY2spOworCQlyZXR1cm4gaTsKKwl9CisJCisJLyogUmVzZXQgYnVmZmVycyAmIHBhcmFtZXRlcnMgKi8KKwlwd2NfcmVzZXRfYnVmZmVycyhwZGV2KTsKKwlmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdF9tYnVmczsgaSsrKQorCQlwZGV2LT5pbWFnZV91c2VkW2ldID0gMDsKKwlwZGV2LT52ZnJhbWVfY291bnQgPSAwOworCXBkZXYtPnZmcmFtZXNfZHVtcGVkID0gMDsKKwlwZGV2LT52ZnJhbWVzX2Vycm9yID0gMDsKKwlwZGV2LT52aXNvY19lcnJvcnMgPSAwOworCXBkZXYtPmVycm9yX3N0YXR1cyA9IDA7CisjaWYgUFdDX0RFQlVHCisJcGRldi0+c2VxdWVuY2UgPSAwOworI2VuZGlmCisJcHdjX2NvbnN0cnVjdChwZGV2KTsgLyogc2V0IG1pbi9tYXggc2l6ZXMgY29ycmVjdCAqLworCisJLyogU2V0IHNvbWUgZGVmYXVsdHMgKi8KKwlwZGV2LT52c25hcHNob3QgPSAwOworCisJLyogU3RhcnQgaXNvIHBpcGUgZm9yIHZpZGVvOyBmaXJzdCB0cnkgdGhlIGxhc3QgdXNlZCB2aWRlbyBzaXplCisJICAgKG9yIHRoZSBkZWZhdWx0IG9uZSk7IGlmIHRoYXQgZmFpbHMgdHJ5IFFDSUYvMTAgb3IgUVNJRi8xMDsKKwkgICBpdCB0aGF0IGZhaWxzIHRvbywgZ2l2ZSB1cC4KKwkgKi8KKwlpID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsIHB3Y19pbWFnZV9zaXplc1twZGV2LT52c2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW3BkZXYtPnZzaXplXS55LCBwZGV2LT52ZnJhbWVzLCBwZGV2LT52Y29tcHJlc3Npb24sIDApOworCWlmIChpKQl7CisJCVRyYWNlKFRSQUNFX09QRU4sICJGaXJzdCBhdHRlbXB0IGF0IHNldF92aWRlb19tb2RlIGZhaWxlZC5cbiIpOworCQlpZiAocGRldi0+dHlwZSA9PSA3MzAgfHwgcGRldi0+dHlwZSA9PSA3NDAgfHwgcGRldi0+dHlwZSA9PSA3NTApCisJCQlpID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsIHB3Y19pbWFnZV9zaXplc1tQU1pfUVNJRl0ueCwgcHdjX2ltYWdlX3NpemVzW1BTWl9RU0lGXS55LCAxMCwgcGRldi0+dmNvbXByZXNzaW9uLCAwKTsKKwkJZWxzZQorCQkJaSA9IHB3Y19zZXRfdmlkZW9fbW9kZShwZGV2LCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX1FDSUZdLngsIHB3Y19pbWFnZV9zaXplc1tQU1pfUUNJRl0ueSwgMTAsIHBkZXYtPnZjb21wcmVzc2lvbiwgMCk7CisJfQorCWlmIChpKSB7CisJCVRyYWNlKFRSQUNFX09QRU4sICJTZWNvbmQgYXR0ZW1wdCBhdCBzZXRfdmlkZW9fbW9kZSBmYWlsZWQuXG4iKTsKKwkJdXAoJnBkZXYtPm1vZGxvY2spOworCQlyZXR1cm4gaTsKKwl9CisJCisJaSA9IHB3Y19pc29jX2luaXQocGRldik7CisJaWYgKGkpIHsKKwkJVHJhY2UoVFJBQ0VfT1BFTiwgIkZhaWxlZCB0byBpbml0IElTT0Mgc3R1ZmYgPSAlZC5cbiIsIGkpOworCQl1cCgmcGRldi0+bW9kbG9jayk7CisJCXJldHVybiBpOworCX0KKworCXBkZXYtPnZvcGVuKys7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdmRldjsKKwl1cCgmcGRldi0+bW9kbG9jayk7CisJVHJhY2UoVFJBQ0VfT1BFTiwgIjw8IHZpZGVvX29wZW4oKSByZXR1cm5zIDAuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogTm90ZSB0aGF0IGFsbCBjbGVhbnVwIGlzIGRvbmUgaW4gdGhlIHJldmVyc2Ugb3JkZXIgYXMgaW4gX29wZW4gKi8KK3N0YXRpYyBpbnQgcHdjX3ZpZGVvX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7CisJaW50IGk7CisKKwlUcmFjZShUUkFDRV9PUEVOLCAiPj4gdmlkZW9fY2xvc2UgY2FsbGVkKHZkZXYgPSAweCVwKS5cbiIsIHZkZXYpOworCisJcGRldiA9IChzdHJ1Y3QgcHdjX2RldmljZSAqKXZkZXYtPnByaXY7CisJaWYgKHBkZXYtPnZvcGVuID09IDApCisJCUluZm8oInZpZGVvX2Nsb3NlKCkgY2FsbGVkIG9uIGNsb3NlZCBkZXZpY2U/XG4iKTsKKworCS8qIER1bXAgc3RhdGlzdGljcywgYnV0IG9ubHkgaWYgYSByZWFzb25hYmxlIGFtb3VudCBvZiBmcmFtZXMgd2VyZQorCSAgIHByb2Nlc3NlZCAodG8gcHJldmVudCBlbmRsZXNzIGxvZy1lbnRyaWVzIGluIGNhc2Ugb2Ygc25hcC1zaG90CisJICAgcHJvZ3JhbXMpCisJICovCisJaWYgKHBkZXYtPnZmcmFtZV9jb3VudCA+IDIwKQorCQlJbmZvKCJDbG9zaW5nIHZpZGVvIGRldmljZTogJWQgZnJhbWVzIHJlY2VpdmVkLCBkdW1wZWQgJWQgZnJhbWVzLCAlZCBmcmFtZXMgd2l0aCBlcnJvcnMuXG4iLCBwZGV2LT52ZnJhbWVfY291bnQsIHBkZXYtPnZmcmFtZXNfZHVtcGVkLCBwZGV2LT52ZnJhbWVzX2Vycm9yKTsKKworCXN3aXRjaCAocGRldi0+dHlwZSkKKwkgeworCSAgY2FzZSA2NzU6CisJICBjYXNlIDY4MDoKKwkgIGNhc2UgNjkwOgorCSAgY2FzZSA3MjA6CisJICBjYXNlIDczMDoKKwkgIGNhc2UgNzQwOgorCSAgY2FzZSA3NTA6CisJICAgIHB3Y19kZWMyM19leGl0KCk7CS8qIFRpbW9uICYgS2lhcmEgKi8KKwkgICAgYnJlYWs7CisJICBjYXNlIDY0NToKKwkgIGNhc2UgNjQ2OgorCSAgICBwd2NfZGVjMV9leGl0KCk7CisJICAgIGJyZWFrOworCSB9CisKKwlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOworCXB3Y19mcmVlX2J1ZmZlcnMocGRldik7CisKKwkvKiBUdXJuIG9mZiBMRURTIGFuZCBwb3dlciBkb3duIGNhbWVyYSwgYnV0IG9ubHkgd2hlbiBub3QgdW5wbHVnZ2VkICovCisJaWYgKHBkZXYtPmVycm9yX3N0YXR1cyAhPSBFUElQRSkgeworCQkvKiBUdXJuIExFRHMgb2ZmICovCisJCWlmIChwd2Nfc2V0X2xlZHMocGRldiwgMCwgMCkgPCAwKQorCQkJSW5mbygiRmFpbGVkIHRvIHNldCBMRUQgb24vb2ZmIHRpbWUuXG4iKTsKKwkJaWYgKHBvd2VyX3NhdmUpIHsKKwkJCWkgPSBwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDApOworCQkJaWYgKGkgPCAwKQorCQkJCUVycigiRmFpbGVkIHRvIHBvd2VyIGRvd24gY2FtZXJhICglZClcbiIsIGkpOworCQl9CisJfQorCXBkZXYtPnZvcGVuID0gMDsKKwlUcmFjZShUUkFDRV9PUEVOLCAiPDwgdmlkZW9fY2xvc2UoKVxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglGSVhNRTogd2hhdCBhYm91dCB0d28gcGFyYWxsZWwgcmVhZHMgPz8/PworICogICAgICBBTlNXRVI6IE5vdCBzdXBwb3J0ZWQuIFlvdSBjYW4ndCBvcGVuIHRoZSBkZXZpY2UgbW9yZSB0aGFuIG9uY2UsCisgICAgICAgICAgICAgICAgZGVzcGl0ZSB3aGF0IHRoZSBWNEwxIGludGVyZmFjZSBzYXlzLiBGaXJzdCwgSSBkb24ndCBzZWUKKyAgICAgICAgICAgICAgICB0aGUgbmVlZCwgc2Vjb25kIHRoZXJlJ3Mgbm8gbWVjaGFuaXNtIG9mIGFsZXJ0aW5nIHRoZQorICAgICAgICAgICAgICAgIDJuZC8zcmQvLi4uIHByb2Nlc3Mgb2YgZXZlbnRzIGxpa2UgY2hhbmdpbmcgaW1hZ2Ugc2l6ZS4KKyAgICAgICAgICAgICAgICBBbmQgSSBkb24ndCBzZWUgdGhlIHBvaW50IG9mIGJsb2NraW5nIHRoYXQgZm9yIHRoZQorICAgICAgICAgICAgICAgIDJuZC8zcmQvLi4uIHByb2Nlc3MuCisgICAgICAgICAgICAgICAgSW4gbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnRzIHJlYWRpbmcgcGFyYWxsZWwgZnJvbSBhbnkKKyAgICAgICAgICAgICAgICBkZXZpY2UgaXMgdHJpY2t5IGFueWhvdy4KKyAqLworCitzdGF0aWMgc3NpemVfdCBwd2NfdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7CisJaW50IG5vYmxvY2sgPSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSzsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyAgICAgICAgaW50IGJ5dGVzX3RvX3JlYWQ7CisKKwlUcmFjZShUUkFDRV9SRUFELCAidmlkZW9fcmVhZCgweCVwLCAlcCwgJVpkKSBjYWxsZWQuXG4iLCB2ZGV2LCBidWYsIGNvdW50KTsKKwlpZiAodmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlwZGV2ID0gdmRldi0+cHJpdjsKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzKQorCQlyZXR1cm4gLXBkZXYtPmVycm9yX3N0YXR1czsgLyogU29tZXRoaW5nIGhhcHBlbmVkLCByZXBvcnQgd2hhdC4gKi8KKworCS8qIEluIGNhc2Ugd2UncmUgZG9pbmcgcGFydGlhbCByZWFkcywgd2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciBhIGZyYW1lICovCisJaWYgKHBkZXYtPmltYWdlX3JlYWRfcG9zID09IDApIHsKKwkJLyogRG8gd2FpdCBxdWV1ZWluZyBhY2NvcmRpbmcgdG8gdGhlIChkb2MpYm9vayAqLworCQlhZGRfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCXdoaWxlIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7CisJCQkvKiBDaGVjayBmb3IgdW5wbHVnZ2VkL2V0Yy4gaGVyZSAqLworCQkJaWYgKHBkZXYtPmVycm9yX3N0YXR1cykgeworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCXJldHVybiAtcGRldi0+ZXJyb3Jfc3RhdHVzIDsKKwkJCX0KKwkgICAgICAgICAgICAgICAgaWYgKG5vYmxvY2spIHsKKwkgICAgICAgICAgICAgICAgCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKKwkgICAgICAgICAgICAgICAgCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJICAgICAgICAgICAgICAgIAlyZXR1cm4gLUVXT1VMREJMT0NLOworCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCSAgICAgICAgICAgICAgICAJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOworCSAgICAgICAgICAgICAgICAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkgICAgICAgICAgICAgICAgCXJldHVybiAtRVJFU1RBUlRTWVM7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAgICAgc2NoZWR1bGUoKTsKKwkgICAgICAgICAgICAgICAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJfQorCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkvKiBEZWNvbXByZXNzIGFuZCByZWxlYXNlIGZyYW1lICovCisJCWlmIChwd2NfaGFuZGxlX2ZyYW1lKHBkZXYpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJVHJhY2UoVFJBQ0VfUkVBRCwgIkNvcHlpbmcgZGF0YSB0byB1c2VyIHNwYWNlLlxuIik7CisJaWYgKHBkZXYtPnZwYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkFXKQorCQlieXRlc190b19yZWFkID0gcGRldi0+ZnJhbWVfc2l6ZTsKKwllbHNlCisgCQlieXRlc190b19yZWFkID0gcGRldi0+dmlldy5zaXplOworCisJLyogY29weSBieXRlcyB0byB1c2VyIHNwYWNlOyB3ZSBhbGxvdyBmb3IgcGFydGlhbCByZWFkcyAqLworCWlmIChjb3VudCArIHBkZXYtPmltYWdlX3JlYWRfcG9zID4gYnl0ZXNfdG9fcmVhZCkKKwkJY291bnQgPSBieXRlc190b19yZWFkIC0gcGRldi0+aW1hZ2VfcmVhZF9wb3M7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHBkZXYtPmltYWdlX3B0cltwZGV2LT5maWxsX2ltYWdlXSArIHBkZXYtPmltYWdlX3JlYWRfcG9zLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXBkZXYtPmltYWdlX3JlYWRfcG9zICs9IGNvdW50OworCWlmIChwZGV2LT5pbWFnZV9yZWFkX3BvcyA+PSBieXRlc190b19yZWFkKSB7IC8qIEFsbCBkYXRhIGhhcyBiZWVuIHJlYWQgKi8KKwkJcGRldi0+aW1hZ2VfcmVhZF9wb3MgPSAwOworCQlwd2NfbmV4dF9pbWFnZShwZGV2KTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHB3Y192aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7CisKKwlpZiAodmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlwZGV2ID0gdmRldi0+cHJpdjsKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXBvbGxfd2FpdChmaWxlLCAmcGRldi0+ZnJhbWVxLCB3YWl0KTsKKwlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzKQorCQlyZXR1cm4gUE9MTEVSUjsKKwlpZiAocGRldi0+ZnVsbF9mcmFtZXMgIT0gTlVMTCkgLyogd2UgaGF2ZSBmcmFtZXMgd2FpdGluZyAqLworCQlyZXR1cm4gKFBPTExJTiB8IFBPTExSRE5PUk0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHdjX3ZpZGVvX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlpZiAodmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlwZGV2ID0gdmRldi0+cHJpdjsKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoY21kKSB7CisJCS8qIFF1ZXJ5IGNhYmFwaWxpdGllcyAqLworCQljYXNlIFZJRElPQ0dDQVA6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICpjYXBzID0gYXJnOworCisJCQlzdHJjcHkoY2Fwcy0+bmFtZSwgdmRldi0+bmFtZSk7CisJCQljYXBzLT50eXBlID0gVklEX1RZUEVfQ0FQVFVSRTsKKwkJCWNhcHMtPmNoYW5uZWxzID0gMTsKKwkJCWNhcHMtPmF1ZGlvcyA9IDE7CisJCQljYXBzLT5taW53aWR0aCAgPSBwZGV2LT52aWV3X21pbi54OworCQkJY2Fwcy0+bWluaGVpZ2h0ID0gcGRldi0+dmlld19taW4ueTsKKwkJCWNhcHMtPm1heHdpZHRoICA9IHBkZXYtPnZpZXdfbWF4Lng7CisJCQljYXBzLT5tYXhoZWlnaHQgPSBwZGV2LT52aWV3X21heC55OworCQkJYnJlYWs7CisJCX0KKworCQkvKiBDaGFubmVsIGZ1bmN0aW9ucyAoc2ltdWxhdGUgMSBjaGFubmVsKSAqLworCQljYXNlIFZJRElPQ0dDSEFOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKworCQkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXYtPmZsYWdzID0gMDsKKwkJCXYtPnR1bmVycyA9IDA7CisJCQl2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCQlzdHJjcHkodi0+bmFtZSwgIldlYmNhbSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZJRElPQ1NDSEFOOgorCQl7CisJCQkvKiBUaGUgc3BlYyBzYXlzIHRoZSBhcmd1bWVudCBpcyBhbiBpbnRlZ2VyLCBidXQKKwkJCSAgIHRoZSBidHR2IGRyaXZlciB1c2VzIGEgdmlkZW9fY2hhbm5lbCBhcmcsIHdoaWNoCisJCQkgICBtYWtlcyBzZW5zZSBiZWNhc3VlIGl0IGFsc28gaGFzIHRoZSBub3JtIGZsYWcuCisJCQkgKi8KKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCQkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQl9CisKKworCQkvKiBQaWN0dXJlIGZ1bmN0aW9uczsgY29udHJhc3QgZXRjLiAqLworCQljYXNlIFZJRElPQ0dQSUNUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCA9IGFyZzsKKwkJCWludCB2YWw7CisKKwkJCXZhbCA9IHB3Y19nZXRfYnJpZ2h0bmVzcyhwZGV2KTsKKwkJCWlmICh2YWwgPj0gMCkKKwkJCQlwLT5icmlnaHRuZXNzID0gdmFsOworCQkJZWxzZQorCQkJCXAtPmJyaWdodG5lc3MgPSAweGZmZmY7CisJCQl2YWwgPSBwd2NfZ2V0X2NvbnRyYXN0KHBkZXYpOworCQkJaWYgKHZhbCA+PSAwKQorCQkJCXAtPmNvbnRyYXN0ID0gdmFsOworCQkJZWxzZQorCQkJCXAtPmNvbnRyYXN0ID0gMHhmZmZmOworCQkJLyogR2FtbWEsIFdoaXRlbmVzcywgd2hhdCdzIHRoZSBkaWZmZXJlbmNlPyA6KSAqLworCQkJdmFsID0gcHdjX2dldF9nYW1tYShwZGV2KTsKKwkJCWlmICh2YWwgPj0gMCkKKwkJCQlwLT53aGl0ZW5lc3MgPSB2YWw7CisJCQllbHNlCisJCQkJcC0+d2hpdGVuZXNzID0gMHhmZmZmOworCQkJdmFsID0gcHdjX2dldF9zYXR1cmF0aW9uKHBkZXYpOworCQkJaWYgKHZhbCA+PSAwKQorCQkJCXAtPmNvbG91ciA9IHZhbDsKKwkJCWVsc2UKKwkJCQlwLT5jb2xvdXIgPSAweGZmZmY7CisJCQlwLT5kZXB0aCA9IDI0OworCQkJcC0+cGFsZXR0ZSA9IHBkZXYtPnZwYWxldHRlOworCQkJcC0+aHVlID0gMHhGRkZGOyAvKiBOL0EgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBWSURJT0NTUElDVDoKKwkJeworCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CisJCQkvKgorCQkJICoJRklYTUU6CVN1cHBvc2Ugd2UgYXJlIG1pZCByZWFkCisJCQkgICAgICAgIEFOU1dFUjogTm8gcHJvYmxlbTogdGhlIGZpcm13YXJlIG9mIHRoZSBjYW1lcmEKKwkJCSAgICAgICAgICAgICAgICBjYW4gaGFuZGxlIGJyaWdodG5lc3MvY29udHJhc3QvZXRjCisJCQkgICAgICAgICAgICAgICAgY2hhbmdlcyBhdCBfYW55XyB0aW1lLCBhbmQgdGhlIHBhbGV0dGUKKwkJCSAgICAgICAgICAgICAgICBpcyB1c2VkIGV4YWN0bHkgb25jZSBpbiB0aGUgdW5jb21wcmVzcworCQkJICAgICAgICAgICAgICAgIHJvdXRpbmUuCisJCQkgKi8KKwkJCXB3Y19zZXRfYnJpZ2h0bmVzcyhwZGV2LCBwLT5icmlnaHRuZXNzKTsKKwkJCXB3Y19zZXRfY29udHJhc3QocGRldiwgcC0+Y29udHJhc3QpOworCQkJcHdjX3NldF9nYW1tYShwZGV2LCBwLT53aGl0ZW5lc3MpOworCQkJcHdjX3NldF9zYXR1cmF0aW9uKHBkZXYsIHAtPmNvbG91cik7CisJCQlpZiAocC0+cGFsZXR0ZSAmJiBwLT5wYWxldHRlICE9IHBkZXYtPnZwYWxldHRlKSB7CisJCQkJc3dpdGNoIChwLT5wYWxldHRlKSB7CisJCQkJCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjBQOgorCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfUkFXOgorCQkJCQkJcGRldi0+dnBhbGV0dGUgPSBwLT5wYWxldHRlOworCQkJCQkJcmV0dXJuIHB3Y190cnlfdmlkZW9fbW9kZShwZGV2LCBwZGV2LT5pbWFnZS54LCBwZGV2LT5pbWFnZS55LCBwZGV2LT52ZnJhbWVzLCBwZGV2LT52Y29tcHJlc3Npb24sIHBkZXYtPnZzbmFwc2hvdCk7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKiBXaW5kb3cvc2l6ZSBwYXJhbWV0ZXJzICovCQkKKwkJY2FzZSBWSURJT0NHV0lOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKKwkJCQorCQkJdnctPnggPSAwOworCQkJdnctPnkgPSAwOworCQkJdnctPndpZHRoID0gcGRldi0+dmlldy54OworCQkJdnctPmhlaWdodCA9IHBkZXYtPnZpZXcueTsKKwkJCXZ3LT5jaHJvbWFrZXkgPSAwOworCQkJdnctPmZsYWdzID0gKHBkZXYtPnZmcmFtZXMgPDwgUFdDX0ZQU19TSElGVCkgfCAKKwkJCSAgICAgICAgICAgKHBkZXYtPnZzbmFwc2hvdCA/IFBXQ19GUFNfU05BUFNIT1QgOiAwKTsKKwkJCWJyZWFrOworCQl9CisJCQorCQljYXNlIFZJRElPQ1NXSU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCQkJaW50IGZwcywgc25hcHNob3QsIHJldDsKKworCQkJZnBzID0gKHZ3LT5mbGFncyAmIFBXQ19GUFNfRlJNQVNLKSA+PiBQV0NfRlBTX1NISUZUOworCQkJc25hcHNob3QgPSB2dy0+ZmxhZ3MgJiBQV0NfRlBTX1NOQVBTSE9UOworCQkJaWYgKGZwcyA9PSAwKQorCQkJCWZwcyA9IHBkZXYtPnZmcmFtZXM7CisJCQlpZiAocGRldi0+dmlldy54ID09IHZ3LT53aWR0aCAmJiBwZGV2LT52aWV3LnkgJiYgZnBzID09IHBkZXYtPnZmcmFtZXMgJiYgc25hcHNob3QgPT0gcGRldi0+dnNuYXBzaG90KQorCQkJCXJldHVybiAwOworCQkJcmV0ID0gcHdjX3RyeV92aWRlb19tb2RlKHBkZXYsIHZ3LT53aWR0aCwgdnctPmhlaWdodCwgZnBzLCBwZGV2LT52Y29tcHJlc3Npb24sIHNuYXBzaG90KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCWJyZWFrOwkJCisJCX0KKwkJCisJCS8qIFdlIGRvbid0IGhhdmUgb3ZlcmxheSBzdXBwb3J0ICh5ZXQpICovCisJCWNhc2UgVklESU9DR0ZCVUY6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19idWZmZXIgKnZiID0gYXJnOworCisJCQltZW1zZXQodmIsMCxzaXplb2YoKnZiKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIG1tYXAoKSBmdW5jdGlvbnMgKi8KKwkJY2FzZSBWSURJT0NHTUJVRjoKKwkJeworCQkJLyogVGVsbCB0aGUgdXNlciBwcm9ncmFtIGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgZm9yIGEgbW1hcCgpICovCisJCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqdm0gPSBhcmc7CisJCQlpbnQgaTsKKworCQkJbWVtc2V0KHZtLCAwLCBzaXplb2YoKnZtKSk7CisJCQl2bS0+c2l6ZSA9IGRlZmF1bHRfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOworCQkJdm0tPmZyYW1lcyA9IGRlZmF1bHRfbWJ1ZnM7IC8qIGRvdWJsZSBidWZmZXJpbmcgc2hvdWxkIGJlIGVub3VnaCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X21idWZzOyBpKyspCisJCQkJdm0tPm9mZnNldHNbaV0gPSBpICogcGRldi0+bGVuX3Blcl9pbWFnZTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBWSURJT0NNQ0FQVFVSRToKKwkJeworCQkJLyogU3RhcnQgY2FwdHVyZSBpbnRvIGEgZ2l2ZW4gaW1hZ2UgYnVmZmVyIChjYWxsZWQgJ2ZyYW1lJyBpbiB2aWRlb19tbWFwIHN0cnVjdHVyZSkgKi8KKwkJCXN0cnVjdCB2aWRlb19tbWFwICp2bSA9IGFyZzsKKworCQkJVHJhY2UoVFJBQ0VfUkVBRCwgIlZJRElPQ01DQVBUVVJFOiAlZHglZCwgZnJhbWUgJWQsIGZvcm1hdCAlZFxuIiwgdm0tPndpZHRoLCB2bS0+aGVpZ2h0LCB2bS0+ZnJhbWUsIHZtLT5mb3JtYXQpOworCQkJaWYgKHZtLT5mcmFtZSA8IDAgfHwgdm0tPmZyYW1lID49IGRlZmF1bHRfbWJ1ZnMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCS8qIHhhd3R2IGlzIG5hc3R5LiBJdCBwcm9iZXMgdGhlIGF2YWlsYWJsZSBwYWxldHRlcworCQkJICAgYnkgc2V0dGluZyBhIHZlcnkgc21hbGwgaW1hZ2Ugc2l6ZSBhbmQgdHJ5aW5nCisJCQkgICB2YXJpb3VzIHBhbGV0dGVzLi4uIFRoZSBkcml2ZXIgZG9lc24ndCBzdXBwb3J0CisJCQkgICBzdWNoIHNtYWxsIGltYWdlcywgc28gSSdtIHdvcmtpbmcgYXJvdW5kIGl0LgorCQkJICovCisJCQlpZiAodm0tPmZvcm1hdCkKKwkJCXsKKwkJCQlzd2l0Y2ggKHZtLT5mb3JtYXQpCisJCQkJeworCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDoKKwkJCQkJY2FzZSBWSURFT19QQUxFVFRFX1JBVzoKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgodm0tPndpZHRoICE9IHBkZXYtPnZpZXcueCB8fCB2bS0+aGVpZ2h0ICE9IHBkZXYtPnZpZXcueSkgJiYKKwkJCSAgICAodm0tPndpZHRoID49IHBkZXYtPnZpZXdfbWluLnggJiYgdm0tPmhlaWdodCA+PSBwZGV2LT52aWV3X21pbi55KSkgeworCQkJCWludCByZXQ7CisKKwkJCQlUcmFjZShUUkFDRV9PUEVOLCAiVklESU9DTUNBUFRVUkU6IGNoYW5naW5nIHNpemUgdG8gcGxlYXNlIHhhd3R2IDotKC5cbiIpOworCQkJCXJldCA9IHB3Y190cnlfdmlkZW9fbW9kZShwZGV2LCB2bS0+d2lkdGgsIHZtLT5oZWlnaHQsIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgcGRldi0+dnNuYXBzaG90KTsKKwkJCQlpZiAocmV0KQorCQkJCQlyZXR1cm4gcmV0OworCQkJfSAvKiAuLi4gc2l6ZSBtaXNtYXRjaCAqLworCisJCQkvKiBGSVhNRTogc2hvdWxkIHdlIGxvY2sgaGVyZT8gKi8KKwkJCWlmIChwZGV2LT5pbWFnZV91c2VkW3ZtLT5mcmFtZV0pCisJCQkJcmV0dXJuIC1FQlVTWTsJLyogYnVmZmVyIHdhc24ndCBhdmFpbGFibGUuIEJ1bW1lciAqLworCQkJcGRldi0+aW1hZ2VfdXNlZFt2bS0+ZnJhbWVdID0gMTsKKworCQkJLyogT2theSwgd2UncmUgZG9uZSBoZXJlLiBJbiB0aGUgU1lOQyBjYWxsIHdlIHdhaXQgdW50aWwgYSAKKwkJCSAgIGZyYW1lIGNvbWVzIGF2YWlsYWJsZSwgdGhlbiBleHBhbmQgaW1hZ2UgaW50byB0aGUgZ2l2ZW4gCisJCQkgICBidWZmZXIuCisJCQkgICBJbiBjb250cmFzdCB0byB0aGUgQ1BpQSBjYW0gdGhlIFBoaWxpcHMgY2FtcyBkZWxpdmVyIGEKKwkJCSAgIGNvbnN0YW50IHN0cmVhbSwgYWxtb3N0IGxpa2UgYSBncmFiYmVyIGNhcmQuIEFsc28sCisJCQkgICB3ZSBoYXZlIHNlcGFyYXRlIGJ1ZmZlcnMgZm9yIHRoZSByYXdkYXRhIGFuZCB0aGUgaW1hZ2UsCisJCQkgICBtZWFuaW5nIHdlIGNhbiBuZWFybHkgYWx3YXlzIGV4cGFuZCBpbnRvIHRoZSByZXF1ZXN0ZWQgYnVmZmVyLgorCQkJICovCisJCQlUcmFjZShUUkFDRV9SRUFELCAiVklESU9DTUNBUFRVUkUgZG9uZS5cbiIpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFZJRElPQ1NZTkM6CisJCXsKKwkJCS8qIFRoZSBkb2Mgc2F5czogIldoZW5ldmVyIGEgYnVmZmVyIGlzIHVzZWQgaXQgc2hvdWxkCisJCQkgICBjYWxsIFZJRElPQ1NZTkMgdG8gZnJlZSB0aGlzIGZyYW1lIHVwIGFuZCBjb250aW51ZS4iCisJCQkgICAKKwkJCSAgIFRoZSBvbmx5IG9kZCB0aGluZyBhYm91dCB0aGlzIHdob2xlIHByb2NlZHVyZSBpcyAKKwkJCSAgIHRoYXQgTUNBUFRVUkUgZmxhZ3MgdGhlIGJ1ZmZlciBhcyAiaW4gdXNlIiwgYW5kCisJCQkgICBTWU5DIGltbWVkaWF0ZWx5IHVubWFya3MgaXQsIHdoaWxlIGl0IGlzbid0IAorCQkJICAgYWZ0ZXIgU1lOQyB0aGF0IHlvdSBrbm93IHRoYXQgdGhlIGJ1ZmZlciBhY3R1YWxseQorCQkJICAgZ290IGZpbGxlZCEgU28geW91IGJldHRlciBub3Qgc3RhcnQgYSBDQVBUVVJFIGluCisJCQkgICB0aGUgc2FtZSBmcmFtZSBpbW1lZGlhdGVseSAodXNlIGRvdWJsZSBidWZmZXJpbmcpLiAKKwkJCSAgIFRoaXMgaXMgbm90IGEgcHJvYmxlbSBmb3IgdGhpcyBjYW0sIHNpbmNlIGl0IGhhcyAKKwkJCSAgIGV4dHJhIGludGVybWVkaWF0ZSBidWZmZXJzLCBidXQgYSBoYXJkd2FyZSAKKwkJCSAgIGdyYWJiZXIgY2FyZCB3aWxsIHRoZW4gb3ZlcndyaXRlIHRoZSBidWZmZXIgCisJCQkgICB5b3UncmUgd29ya2luZyBvbi4KKwkJCSAqLworCQkJaW50ICptYnVmID0gYXJnOworCQkJaW50IHJldDsKKworCQkJVHJhY2UoVFJBQ0VfUkVBRCwgIlZJRElPQ1NZTkMgY2FsbGVkICglZCkuXG4iLCAqbWJ1Zik7CisKKwkJCS8qIGJvdW5kcyBjaGVjayAqLworCQkJaWYgKCptYnVmIDwgMCB8fCAqbWJ1ZiA+PSBkZWZhdWx0X21idWZzKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJLyogY2hlY2sgaWYgdGhpcyBidWZmZXIgd2FzIHJlcXVlc3RlZCBhbnl3YXkgKi8KKwkJCWlmIChwZGV2LT5pbWFnZV91c2VkWyptYnVmXSA9PSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkvKiBBZGQgb3Vyc2VsdmVzIHRvIHRoZSBmcmFtZSB3YWl0LXF1ZXVlLgorCQkJICAgCisJCQkgICBGSVhNRTogbmVlZHMgYXVkaXRpbmcgZm9yIHNhZmV0eS4KKwkJCSAgIFFVRVNUSU9OOiBJbiB3aGF0IHJlc3BlY3Q/IEkgdGhpbmsgdGhhdCB1c2luZyB0aGUKKwkJCSAgICAgICAgICAgICBmcmFtZXEgaXMgc2FmZSBub3cuCisJCQkgKi8KKwkJCWFkZF93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKKwkJCXdoaWxlIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7CisJCQkJaWYgKHBkZXYtPmVycm9yX3N0YXR1cykgeworCQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQkJCXJldHVybiAtcGRldi0+ZXJyb3Jfc3RhdHVzOworCQkJCX0KKwkJCQorCSAgICAgICAgICAgICAgICAJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJICAgICAgICAgICAgICAgIAkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOworCQkgICAgICAgICAgICAgICAgCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCSAgICAgICAgICAgICAgICAJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkgICAgICAgIAkgICAgICAgIH0KKwkgICAgICAgICAgICAgICAgCXNjaGVkdWxlKCk7CisJCSAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJfQorCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQkKKwkJCS8qIFRoZSBmcmFtZSBpcyByZWFkeS4gRXhwYW5kIGluIHRoZSBpbWFnZSBidWZmZXIgCisJCQkgICByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuIEkgZG9uJ3QgY2FyZSBpZiB5b3UgCisJCQkgICBtbWFwKCkgNSBidWZmZXJzIGFuZCByZXF1ZXN0IGRhdGEgaW4gdGhpcyBvcmRlcjogCisJCQkgICBidWZmZXIgNCAyIDMgMCAxIDIgMyAwIDQgMyAxIC4gLiAuCisJCQkgICBHcmFiYmVyIGhhcmR3YXJlIG1heSBub3QgYmUgc28gZm9yZ2l2aW5nLgorCQkJICovCisJCQlUcmFjZShUUkFDRV9SRUFELCAiVklESU9DU1lOQzogZnJhbWUgcmVhZHkuXG4iKTsKKwkJCXBkZXYtPmZpbGxfaW1hZ2UgPSAqbWJ1ZjsgLyogdGVsbCBpbiB3aGljaCBidWZmZXIgd2Ugd2FudCB0aGUgaW1hZ2UgdG8gYmUgZXhwYW5kZWQgKi8KKwkJCS8qIERlY29tcHJlc3MsIGV0YyAqLworCQkJcmV0ID0gcHdjX2hhbmRsZV9mcmFtZShwZGV2KTsKKwkJCXBkZXYtPmltYWdlX3VzZWRbKm1idWZdID0gMDsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQkKKwkJY2FzZSBWSURJT0NHQVVESU86CisJCXsKKwkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKKwkJCQorCQkJc3RyY3B5KHYtPm5hbWUsICJNaWNyb3Bob25lIik7CisJCQl2LT5hdWRpbyA9IC0xOyAvKiB1bmtub3duIGF1ZGlvIG1pbm9yICovCisJCQl2LT5mbGFncyA9IDA7CisJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKKwkJCXYtPnZvbHVtZSA9IDA7CisJCQl2LT5iYXNzID0gMDsKKwkJCXYtPnRyZWJsZSA9IDA7CisJCQl2LT5iYWxhbmNlID0gMHg4MDAwOworCQkJdi0+c3RlcCA9IDE7CisJCQlicmVhazsJCisJCX0KKwkJCisJCWNhc2UgVklESU9DU0FVRElPOgorCQl7CisJCQkvKiBEdW1teTogbm90aGluZyBjYW4gYmUgc2V0ICovCisJCQlicmVhazsKKwkJfQorCQkKKwkJY2FzZSBWSURJT0NHVU5JVDoKKwkJeworCQkJc3RydWN0IHZpZGVvX3VuaXQgKnZ1ID0gYXJnOworCQkJCisJCQl2dS0+dmlkZW8gPSBwZGV2LT52ZGV2LT5taW5vciAmIDB4M0Y7CisJCQl2dS0+YXVkaW8gPSAtMTsgLyogbm90IGtub3duIHlldCAqLworCQkJdnUtPnZiaSA9IC0xOworCQkJdnUtPnJhZGlvID0gLTE7CisJCQl2dS0+dGVsZXRleHQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gcHdjX2lvY3RsKHBkZXYsIGNtZCwgYXJnKTsKKwl9IC8qIC4uc3dpdGNoICovCisJcmV0dXJuIDA7Cit9CQorCitzdGF0aWMgaW50IHB3Y192aWRlb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHB3Y192aWRlb19kb19pb2N0bCk7Cit9CisKKworc3RhdGljIGludCBwd2NfdmlkZW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemUgID0gdm1hLT52bV9lbmQtdm1hLT52bV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvczsKKwkKKwlUcmFjZShUUkFDRV9NRU1PUlksICJtbWFwKDB4JXAsIDB4JWx4LCAlbHUpIGNhbGxlZC5cbiIsIHZkZXYsIHN0YXJ0LCBzaXplKTsKKwlwZGV2ID0gdmRldi0+cHJpdjsKKwkKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOworCisJcG9zID0gKHVuc2lnbmVkIGxvbmcpcGRldi0+aW1hZ2VfZGF0YTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkKKwkJCXJldHVybiAtRUFHQUlOOworCisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJZWxzZQorCQkJc2l6ZSA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVU0IgZnVuY3Rpb25zICovCisKKy8qIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgd2hlbiBhIG5ldyBkZXZpY2UgaXMgcGx1Z2dlZCBpbiBvciB0aGUgdXNiIGNvcmUKKyAqIGlzIGxvYWRlZC4KKyAqLworCitzdGF0aWMgaW50IHVzYl9wd2NfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSBOVUxMOworCWludCB2ZW5kb3JfaWQsIHByb2R1Y3RfaWQsIHR5cGVfaWQ7CisJaW50IGksIGhpbnQ7CisJaW50IGZlYXR1cmVzID0gMDsKKwlpbnQgdmlkZW9fbnIgPSAtMTsgLyogZGVmYXVsdDogdXNlIG5leHQgYXZhaWxhYmxlIGRldmljZSAqLworCWNoYXIgc2VyaWFsX251bWJlclszMF0sICpuYW1lOworCisJLyogQ2hlY2sgaWYgd2UgY2FuIGhhbmRsZSB0aGlzIGRldmljZSAqLworCVRyYWNlKFRSQUNFX1BST0JFLCAicHJvYmUoKSBjYWxsZWQgWyUwNFggJTA0WF0sIGlmICVkXG4iLCAKKwkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCWxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKKwkJaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKworCS8qIHRoZSBpbnRlcmZhY2VzIGFyZSBwcm9iZWQgb25lIGJ5IG9uZS4gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUKKwkgICB2aWRlbyBpbnRlcmZhY2UgKDApIG5vdy4KKwkgICBJbnRlcmZhY2UgMSBpcyB0aGUgQXVkaW8gQ29udHJvbCwgYW5kIGludGVyZmFjZSAyIEF1ZGlvIGl0c2VsZi4KKwkgKi8KKwlpZiAoaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyID4gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2ZW5kb3JfaWQgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwlwcm9kdWN0X2lkID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCisJaWYgKHZlbmRvcl9pZCA9PSAweDA0NzEpIHsKKwkJc3dpdGNoIChwcm9kdWN0X2lkKSB7CisJCWNhc2UgMHgwMzAyOgorCQkJSW5mbygiUGhpbGlwcyBQQ0E2NDVWQyBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlBoaWxpcHMgNjQ1IHdlYmNhbSI7CisJCQl0eXBlX2lkID0gNjQ1OworCQkJYnJlYWs7CisJCWNhc2UgMHgwMzAzOgorCQkJSW5mbygiUGhpbGlwcyBQQ0E2NDZWQyBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlBoaWxpcHMgNjQ2IHdlYmNhbSI7CisJCQl0eXBlX2lkID0gNjQ2OworCQkJYnJlYWs7CisJCWNhc2UgMHgwMzA0OgorCQkJSW5mbygiQXNrZXkgVkMwMTAgdHlwZSAyIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiQXNrZXkgVkMwMTAgd2ViY2FtIjsKKwkJCXR5cGVfaWQgPSA2NDY7CisJCQlicmVhazsKKwkJY2FzZSAweDAzMDc6CisJCQlJbmZvKCJQaGlsaXBzIFBDVkM2NzVLIChWZXN0YSkgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJQaGlsaXBzIDY3NSB3ZWJjYW0iOworCQkJdHlwZV9pZCA9IDY3NTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDMwODoKKwkJCUluZm8oIlBoaWxpcHMgUENWQzY4MEsgKFZlc3RhIFBybykgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJQaGlsaXBzIDY4MCB3ZWJjYW0iOworCQkJdHlwZV9pZCA9IDY4MDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDMwQzoKKwkJCUluZm8oIlBoaWxpcHMgUENWQzY5MEsgKFZlc3RhIFBybyBTY2FuKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlBoaWxpcHMgNjkwIHdlYmNhbSI7CisJCQl0eXBlX2lkID0gNjkwOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMzEwOgorCQkJSW5mbygiUGhpbGlwcyBQQ1ZDNzMwSyAoVG9VQ2FtIEZ1bikvUENWQzgzMCAoVG9VQ2FtIElJKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlBoaWxpcHMgNzMwIHdlYmNhbSI7CisJCQl0eXBlX2lkID0gNzMwOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMzExOgorCQkJSW5mbygiUGhpbGlwcyBQQ1ZDNzQwSyAoVG9VQ2FtIFBybykvUENWQzg0MCAoVG9VQ2FtIElJKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlBoaWxpcHMgNzQwIHdlYmNhbSI7CisJCQl0eXBlX2lkID0gNzQwOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMzEyOgorCQkJSW5mbygiUGhpbGlwcyBQQ1ZDNzUwSyAoVG9VQ2FtIFBybyBTY2FuKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlBoaWxpcHMgNzUwIHdlYmNhbSI7CisJCQl0eXBlX2lkID0gNzUwOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMzEzOgorCQkJSW5mbygiUGhpbGlwcyBQQ1ZDNzIwSy80MCAoVG9VQ2FtIFhTKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlBoaWxpcHMgNzIwSy80MCB3ZWJjYW0iOworCQkJdHlwZV9pZCA9IDcyMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCX0KKwllbHNlIGlmICh2ZW5kb3JfaWQgPT0gMHgwNjlBKSB7CisJCXN3aXRjaChwcm9kdWN0X2lkKSB7CisJCWNhc2UgMHgwMDAxOgorCQkJSW5mbygiQXNrZXkgVkMwMTAgdHlwZSAxIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiQXNrZXkgVkMwMTAgd2ViY2FtIjsKKwkJCXR5cGVfaWQgPSA2NDU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MDQ2ZCkgeworCQlzd2l0Y2gocHJvZHVjdF9pZCkgeworCQljYXNlIDB4MDhiMDoKKwkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFBybyAzMDAwIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gUHJvIDMwMDAiOworCQkJdHlwZV9pZCA9IDc0MDsgLyogQ0NEIHNlbnNvciAqLworCQkJYnJlYWs7CisJCWNhc2UgMHgwOGIxOgorCQkJSW5mbygiTG9naXRlY2ggUXVpY2tDYW0gTm90ZWJvb2sgUHJvIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gTm90ZWJvb2sgUHJvIjsKKwkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KKwkJCWJyZWFrOworCQljYXNlIDB4MDhiMjoKKwkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIDQwMDAgUHJvIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gUHJvIDQwMDAiOworCQkJdHlwZV9pZCA9IDc0MDsgLyogQ0NEIHNlbnNvciAqLworCQkJYnJlYWs7CisJCWNhc2UgMHgwOGIzOgorCQkJSW5mbygiTG9naXRlY2ggUXVpY2tDYW0gWm9vbSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20iOworCQkJdHlwZV9pZCA9IDc0MDsgLyogQ0NEIHNlbnNvciAqLworCQkJYnJlYWs7CisJCWNhc2UgMHgwOEI0OgorCQkJSW5mbygiTG9naXRlY2ggUXVpY2tDYW0gWm9vbSAobmV3IG1vZGVsKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20iOworCQkJdHlwZV9pZCA9IDc0MDsgLyogQ0NEIHNlbnNvciAqLworCQkJYnJlYWs7CisJCWNhc2UgMHgwOGI1OgorCQkJSW5mbygiTG9naXRlY2ggUXVpY2tDYW0gT3JiaXQvU3BoZXJlIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gT3JiaXQiOworCQkJdHlwZV9pZCA9IDc0MDsgLyogQ0NEIHNlbnNvciAqLworCQkJZmVhdHVyZXMgfD0gRkVBVFVSRV9NT1RPUl9QQU5USUxUOworCQkJYnJlYWs7CisJCWNhc2UgMHgwOGI2OgorCQljYXNlIDB4MDhiNzoKKwkJY2FzZSAweDA4Yjg6CisJCQlJbmZvKCJMb2dpdGVjaCBRdWlja0NhbSBkZXRlY3RlZCAocmVzZXJ2ZWQgSUQpLlxuIik7CisJCQluYW1lID0gIkxvZ2l0ZWNoIFF1aWNrQ2FtIChyZXMuKSI7CisJCQl0eXBlX2lkID0gNzMwOyAvKiBBc3N1bWluZyBDTU9TICovCisJCQlicmVhazsKKyAgICAgICAgCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgCQlicmVhazsKKyAgICAgICAgCX0KKyAgICAgICAgfQorCWVsc2UgaWYgKHZlbmRvcl9pZCA9PSAweDA1NWQpIHsKKwkJLyogSSBkb24ndCBrbm93IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEMxMCBhbmQgdGhlIEMzMDsKKwkJICAgSSBzdXBwb3NlIHRoZSBkaWZmZXJlbmNlIGlzIHRoZSBzZW5zb3IsIGJ1dCBib3RoIGNhbWVyYXMKKwkJICAgd29yayBlcXVhbGx5IHdlbGwgd2l0aCBhIHR5cGVfaWQgb2YgNjc1CisJCSAqLworCQlzd2l0Y2gocHJvZHVjdF9pZCkgeworCQljYXNlIDB4OTAwMDoKKwkJCUluZm8oIlNhbXN1bmcgTVBDLUMxMCBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIlNhbXN1bmcgTVBDLUMxMCI7CisJCQl0eXBlX2lkID0gNjc1OworCQkJYnJlYWs7CisJCWNhc2UgMHg5MDAxOgorCQkJSW5mbygiU2Ftc3VuZyBNUEMtQzMwIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiU2Ftc3VuZyBNUEMtQzMwIjsKKwkJCXR5cGVfaWQgPSA2NzU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MDQxZSkgeworCQlzd2l0Y2gocHJvZHVjdF9pZCkgeworCQljYXNlIDB4NDAwYzoKKwkJCUluZm8oIkNyZWF0aXZlIExhYnMgV2ViY2FtIDUgZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiQ3JlYXRpdmUgTGFicyBXZWJjYW0gNSI7CisJCQl0eXBlX2lkID0gNzMwOworCQkJYnJlYWs7CisJCWNhc2UgMHg0MDExOgorCQkJSW5mbygiQ3JlYXRpdmUgTGFicyBXZWJjYW0gUHJvIEV4IGRldGVjdGVkLlxuIik7CisJCQluYW1lID0gIkNyZWF0aXZlIExhYnMgV2ViY2FtIFBybyBFeCI7CisJCQl0eXBlX2lkID0gNzQwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWJyZWFrOworCQl9CisJfQorCWVsc2UgaWYgKHZlbmRvcl9pZCA9PSAweDA0Y2MpIHsKKwkJc3dpdGNoKHByb2R1Y3RfaWQpIHsKKwkJY2FzZSAweDgxMTY6CisJCQlJbmZvKCJTb3RlYyBBZmluYSBFeWUgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJTb3RlYyBBZmluYSBFeWUiOworCQkJdHlwZV9pZCA9IDczMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCX0KKwllbHNlIGlmICh2ZW5kb3JfaWQgPT0gMHgwNmJlKSB7CisJCXN3aXRjaChwcm9kdWN0X2lkKSB7CisJCWNhc2UgMHg4MTE2OgorCQkJLyogVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBjYW0gYXMgdGhlIFNvdGVjIEFmaW5hIEV5ZSAqLworCQkJSW5mbygiQU1FIENvLiBBZmluYSBFeWUgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJBTUUgQ28uIEFmaW5hIEV5ZSI7CisJCQl0eXBlX2lkID0gNzUwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWJyZWFrOworCQl9CisJCisJfQorCWVsc2UgaWYgKHZlbmRvcl9pZCA9PSAweDBkODEpIHsKKwkJc3dpdGNoKHByb2R1Y3RfaWQpIHsKKwkJY2FzZSAweDE5MDA6CisJCQlJbmZvKCJWaXNpb25pdGUgVkNTLVVDMzAwIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiVmlzaW9uaXRlIFZDUy1VQzMwMCI7CisJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCisJCQlicmVhazsKKwkJY2FzZSAweDE5MTA6CisJCQlJbmZvKCJWaXNpb25pdGUgVkNTLVVNMTAwIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiVmlzaW9uaXRlIFZDUy1VTTEwMCI7CisJCQl0eXBlX2lkID0gNzMwOyAvKiBDTU9TIHNlbnNvciAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWJyZWFrOworCQl9CisJfQorCWVsc2UgCisJCXJldHVybiAtRU5PREVWOyAvKiBOb3QgYW55IG9mIHRoZSBrbm93IHR5cGVzOyBidXQgdGhlIGxpc3Qga2VlcHMgZ3Jvd2luZy4gKi8KKworCW1lbXNldChzZXJpYWxfbnVtYmVyLCAwLCAzMCk7CisJdXNiX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsIHNlcmlhbF9udW1iZXIsIDI5KTsKKwlUcmFjZShUUkFDRV9QUk9CRSwgIkRldmljZSBzZXJpYWwgbnVtYmVyIGlzICVzXG4iLCBzZXJpYWxfbnVtYmVyKTsKKworCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyA+IDEpCisJCUluZm8oIldhcm5pbmc6IG1vcmUgdGhhbiAxIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBzdHJ1Y3R1cmUsIGluaXRpYWxpemUgcG9pbnRlcnMsIG11dGV4ZXMsIGV0Yy4gYW5kIGxpbmsgaXQgdG8gdGhlIHVzYl9kZXZpY2UgKi8KKwlwZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHB3Y19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAocGRldiA9PSBOVUxMKSB7CisJCUVycigiT29wcywgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcHdjX2RldmljZS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHBkZXYsIDAsIHNpemVvZihzdHJ1Y3QgcHdjX2RldmljZSkpOworCXBkZXYtPnR5cGUgPSB0eXBlX2lkOworCXBkZXYtPnZzaXplID0gZGVmYXVsdF9zaXplOworCXBkZXYtPnZmcmFtZXMgPSBkZWZhdWx0X2ZwczsKKwlzdHJjcHkocGRldi0+c2VyaWFsLCBzZXJpYWxfbnVtYmVyKTsKKwlwZGV2LT5mZWF0dXJlcyA9IGZlYXR1cmVzOworCWlmICh2ZW5kb3JfaWQgPT0gMHgwNDZEICYmIHByb2R1Y3RfaWQgPT0gMHgwOEI1KQorCXsKKwkJLyogTG9naXRlY2ggUXVpY2tDYW0gT3JiaXQKKwkgICAgICAgICAgIFRoZSByYW5nZXMgaGF2ZSBiZWVuIGRldGVybWluZWQgZXhwZXJpbWVudGFsbHk7IHRoZXkgbWF5IGRpZmZlciBmcm9tIGNhbSB0byBjYW0uCisJICAgICAgICAgICBBbHNvLCB0aGUgZXhhY3QgcmFuZ2VzIGxlZnQtcmlnaHQgYW5kIHVwLWRvd24gYXJlIGRpZmZlcmVudCBmb3IgbXkgY2FtCisJICAgICAgICAgICovCisJCXBkZXYtPmFuZ2xlX3JhbmdlLnBhbl9taW4gID0gLTcwMDA7CisJCXBkZXYtPmFuZ2xlX3JhbmdlLnBhbl9tYXggID0gIDcwMDA7CisJCXBkZXYtPmFuZ2xlX3JhbmdlLnRpbHRfbWluID0gLTMwMDA7CisJCXBkZXYtPmFuZ2xlX3JhbmdlLnRpbHRfbWF4ID0gIDI1MDA7CisJfQorCisJaW5pdF9NVVRFWCgmcGRldi0+bW9kbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBkZXYtPnB0cmxvY2spOworCisJcGRldi0+dWRldiA9IHVkZXY7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcGRldi0+ZnJhbWVxKTsKKwlwZGV2LT52Y29tcHJlc3Npb24gPSBwd2NfcHJlZmVycmVkX2NvbXByZXNzaW9uOworCisJLyogQWxsb2NhdGUgdmlkZW9fZGV2aWNlIHN0cnVjdHVyZSAqLworCXBkZXYtPnZkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAocGRldi0+dmRldiA9PSAwKQorCXsKKwkJRXJyKCJFcnIsIGNhbm5vdCBhbGxvY2F0ZSB2aWRlb19kZXZpY2Ugc3RydXR1cmUuIEZhaWxpbmcgcHJvYmUuIik7CisJCWtmcmVlKHBkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtY3B5KHBkZXYtPnZkZXYsICZwd2NfdGVtcGxhdGUsIHNpemVvZihwd2NfdGVtcGxhdGUpKTsKKwlzdHJjcHkocGRldi0+dmRldi0+bmFtZSwgbmFtZSk7CisJcGRldi0+dmRldi0+b3duZXIgPSBUSElTX01PRFVMRTsKKwl2aWRlb19zZXRfZHJ2ZGF0YShwZGV2LT52ZGV2LCBwZGV2KTsKKworCXBkZXYtPnJlbGVhc2UgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CisJVHJhY2UoVFJBQ0VfUFJPQkUsICJSZWxlYXNlOiAlMDR4XG4iLCBwZGV2LT5yZWxlYXNlKTsKKworCS8qIE5vdyBzZWFyY2ggZGV2aWNlX2hpbnRbXSB0YWJsZSBmb3IgYSBtYXRjaCwgc28gd2UgY2FuIGhpbnQgYSBub2RlIG51bWJlci4gKi8KKwlmb3IgKGhpbnQgPSAwOyBoaW50IDwgTUFYX0RFVl9ISU5UUzsgaGludCsrKSB7CisJCWlmICgoKGRldmljZV9oaW50W2hpbnRdLnR5cGUgPT0gLTEpIHx8IChkZXZpY2VfaGludFtoaW50XS50eXBlID09IHBkZXYtPnR5cGUpKSAmJgorCQkgICAgIChkZXZpY2VfaGludFtoaW50XS5wZGV2ID09IE5VTEwpKSB7CisJCQkvKiBzbyBmYXIsIHNvIGdvb2QuLi4gdHJ5IHNlcmlhbCBudW1iZXIgKi8KKwkJCWlmICgoZGV2aWNlX2hpbnRbaGludF0uc2VyaWFsX251bWJlclswXSA9PSAnKicpIHx8ICFzdHJjbXAoZGV2aWNlX2hpbnRbaGludF0uc2VyaWFsX251bWJlciwgc2VyaWFsX251bWJlcikpIHsKKwkJCSAgICAJLyogbWF0Y2ghICovCisJCQkgICAgCXZpZGVvX25yID0gZGV2aWNlX2hpbnRbaGludF0uZGV2aWNlX25vZGU7CisJCQkgICAgCVRyYWNlKFRSQUNFX1BST0JFLCAiRm91bmQgaGludCwgd2lsbCB0cnkgdG8gcmVnaXN0ZXIgYXMgL2Rldi92aWRlbyVkXG4iLCB2aWRlb19ucik7CisJCQkgICAgCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcGRldi0+dmRldi0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlOworCWkgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UocGRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpOworCWlmIChpIDwgMCkgeworCQlFcnIoIkZhaWxlZCB0byByZWdpc3RlciBhcyB2aWRlbyBkZXZpY2UgKCVkKS5cbiIsIGkpOworCQl2aWRlb19kZXZpY2VfcmVsZWFzZShwZGV2LT52ZGV2KTsgLyogRHJpcC4uLiBkcmlwLi4uIGRyaXAuLi4gKi8KKwkJa2ZyZWUocGRldik7IC8qIE9vcHMsIG5vIG1lbW9yeSBsZWFrcyBwbGVhc2UgKi8KKwkJcmV0dXJuIC1FSU87CisJfQorCWVsc2UgeworCQlJbmZvKCJSZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZC5cbiIsIHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRik7CisJfQorCisJLyogb2NjdXB5IHNsb3QgKi8KKwlpZiAoaGludCA8IE1BWF9ERVZfSElOVFMpIAorCQlkZXZpY2VfaGludFtoaW50XS5wZGV2ID0gcGRldjsKKworCVRyYWNlKFRSQUNFX1BST0JFLCAicHJvYmUoKSBmdW5jdGlvbiByZXR1cm5pbmcgc3RydWN0IGF0IDB4JXAuXG4iLCBwZGV2KTsKKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBwZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIHVzZXIgamFua2VkIG91dCB0aGUgY2FibGUuLi4gKi8KK3N0YXRpYyB2b2lkIHVzYl9wd2NfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKKwlpbnQgaGludDsKKworCWxvY2tfa2VybmVsKCk7CisJcGRldiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOworCWlmIChwZGV2ID09IE5VTEwpIHsKKwkJRXJyKCJwd2NfZGlzY29ubmVjdCgpIENhbGxlZCB3aXRob3V0IHByaXZhdGUgcG9pbnRlci5cbiIpOworCQlnb3RvIGRpc2Nvbm5lY3Rfb3V0OworCX0KKwlpZiAocGRldi0+dWRldiA9PSBOVUxMKSB7CisJCUVycigicHdjX2Rpc2Nvbm5lY3QoKSBhbHJlYWR5IGNhbGxlZCBmb3IgJXBcbiIsIHBkZXYpOworCQlnb3RvIGRpc2Nvbm5lY3Rfb3V0OworCX0KKwlpZiAocGRldi0+dWRldiAhPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKSB7CisJCUVycigicHdjX2Rpc2Nvbm5lY3QoKSBXb29wczogcG9pbnRlciBtaXNtYXRjaCB1ZGV2L3BkZXYuXG4iKTsKKwkJZ290byBkaXNjb25uZWN0X291dDsKKwl9CisjaWZkZWYgUFdDX01BR0lDCQorCWlmIChwZGV2LT5tYWdpYyAhPSBQV0NfTUFHSUMpIHsKKwkJRXJyKCJwd2NfZGlzY29ubmVjdCgpIE1hZ2ljIG51bWJlciBmYWlsZWQuIENvbnN1bHQgeW91ciBzY3JvbGxzIGFuZCB0cnkgYWdhaW4uXG4iKTsKKwkJZ290byBkaXNjb25uZWN0X291dDsKKwl9CisjZW5kaWYKKwkKKwkvKiBXZSBnb3QgdW5wbHVnZ2VkOyB0aGlzIGlzIHNpZ25hbGxlZCBieSBhbiBFUElQRSBlcnJvciBjb2RlICovCisJaWYgKHBkZXYtPnZvcGVuKSB7CisJCUluZm8oIkRpc2Nvbm5lY3RlZCB3aGlsZSB3ZWJjYW0gaXMgaW4gdXNlIVxuIik7CisJCXBkZXYtPmVycm9yX3N0YXR1cyA9IEVQSVBFOworCX0KKworCS8qIEFsZXJ0IHdhaXRpbmcgcHJvY2Vzc2VzICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwZGV2LT5mcmFtZXEpOworCS8qIFdhaXQgdW50aWwgZGV2aWNlIGlzIGNsb3NlZCAqLworCXdoaWxlIChwZGV2LT52b3BlbikKKwkJc2NoZWR1bGUoKTsKKwkvKiBEZXZpY2UgaXMgbm93IGNsb3NlZCwgc28gd2UgY2FuIHNhZmVseSB1bnJlZ2lzdGVyIGl0ICovCisJVHJhY2UoVFJBQ0VfUFJPQkUsICJVbnJlZ2lzdGVyaW5nIHZpZGVvIGRldmljZSBpbiBkaXNjb25uZWN0KCkuXG4iKTsKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZShwZGV2LT52ZGV2KTsKKworCS8qIEZyZWUgbWVtb3J5IChkb24ndCBzZXQgcGRldiB0byAwIGp1c3QgeWV0KSAqLworCWtmcmVlKHBkZXYpOworCitkaXNjb25uZWN0X291dDoKKwkvKiBzZWFyY2ggZGV2aWNlX2hpbnRbXSB0YWJsZSBpZiB3ZSBvY2N1cHkgYSBzbG90LCBieSBhbnkgY2hhbmNlICovCisJZm9yIChoaW50ID0gMDsgaGludCA8IE1BWF9ERVZfSElOVFM7IGhpbnQrKykKKwkJaWYgKGRldmljZV9oaW50W2hpbnRdLnBkZXYgPT0gcGRldikKKwkJCWRldmljZV9oaW50W2hpbnRdLnBkZXYgPSBOVUxMOworCisJdW5sb2NrX2tlcm5lbCgpOworfQorCisKKy8qICpncnVudCogV2UgaGF2ZSB0byBkbyBhdG9pIG91cnNlbHZlcyA6LSggKi8KK3N0YXRpYyBpbnQgcHdjX2F0b2koY29uc3QgY2hhciAqcykKK3sKKwlpbnQgayA9IDA7CisKKwlrID0gMDsKKwl3aGlsZSAoKnMgIT0gJ1wwJyAmJiAqcyA+PSAnMCcgJiYgKnMgPD0gJzknKSB7CisJCWsgPSAxMCAqIGsgKyAoKnMgLSAnMCcpOworCQlzKys7CisJfQorCXJldHVybiBrOworfQorCisKKy8qIAorICogSW5pdGlhbGl6YXRpb24gY29kZSAmIG1vZHVsZSBzdHVmZiAKKyAqLworCitzdGF0aWMgY2hhciBzaXplWzEwXTsKK3N0YXRpYyBpbnQgZnBzID0gMDsKK3N0YXRpYyBpbnQgZmJ1ZnMgPSAwOworc3RhdGljIGludCBtYnVmcyA9IDA7CitzdGF0aWMgaW50IHRyYWNlID0gLTE7CitzdGF0aWMgaW50IGNvbXByZXNzaW9uID0gLTE7CitzdGF0aWMgaW50IGxlZHNbMl0gPSB7IC0xLCAtMSB9Oworc3RhdGljIGNoYXIgKmRldl9oaW50W01BWF9ERVZfSElOVFNdID0geyB9OworCittb2R1bGVfcGFyYW1fc3RyaW5nKHNpemUsIHNpemUsIHNpemVvZihzaXplKSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNpemUsICJJbml0aWFsIGltYWdlIHNpemUuIE9uZSBvZiBzcWNpZiwgcXNpZiwgcWNpZiwgc2lmLCBjaWYsIHZnYSIpOworbW9kdWxlX3BhcmFtKGZwcywgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZnBzLCAiSW5pdGlhbCBmcmFtZXMgcGVyIHNlY29uZC4gVmFyaWVzIHdpdGggbW9kZWwsIHVzZWZ1bCByYW5nZSA1LTMwIik7Cittb2R1bGVfcGFyYW0oZmJ1ZnMsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZidWZzLCAiTnVtYmVyIG9mIGludGVybmFsIGZyYW1lIGJ1ZmZlcnMgdG8gcmVzZXJ2ZSIpOworbW9kdWxlX3BhcmFtKG1idWZzLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhtYnVmcywgIk51bWJlciBvZiBleHRlcm5hbCAobW1hcCgpZWQpIGltYWdlIGJ1ZmZlcnMiKTsKK21vZHVsZV9wYXJhbSh0cmFjZSwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHJhY2UsICJGb3IgZGVidWdnaW5nIHB1cnBvc2VzIik7Cittb2R1bGVfcGFyYW0ocG93ZXJfc2F2ZSwgYm9vbCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3NhdmUsICJUdXJuIHBvd2VyIHNhdmUgZmVhdHVyZSBpbiBjYW1lcmEgb24gb3Igb2ZmIik7Cittb2R1bGVfcGFyYW0oY29tcHJlc3Npb24sIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNvbXByZXNzaW9uLCAiUHJlZmVycmVkIGNvbXByZXNzaW9uIHF1YWxpdHkuIFJhbmdlIDAgKHVuY29tcHJlc3NlZCkgdG8gMyAoaGlnaCBjb21wcmVzc2lvbikiKTsKK21vZHVsZV9wYXJhbV9hcnJheShsZWRzLCBpbnQsIE5VTEwsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsZWRzLCAiTEVEIG9uLG9mZiB0aW1lIGluIG1pbGxpc2Vjb25kcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGRldl9oaW50LCBjaGFycCwgTlVMTCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9oaW50LCAiRGV2aWNlIG5vZGUgaGludHMiKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJQaGlsaXBzICYgT0VNIFVTQiB3ZWJjYW0gZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMdWMgU2FpbGxhcmQgPGx1Y0BzYWlsbGFyZC5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IHVzYl9wd2NfaW5pdCh2b2lkKQoreworCWludCBpLCBzejsKKwljaGFyICpzaXplbmFtZXNbUFNaX01BWF0gPSB7ICJzcWNpZiIsICJxc2lmIiwgInFjaWYiLCAic2lmIiwgImNpZiIsICJ2Z2EiIH07CisKKwlJbmZvKCJQaGlsaXBzIHdlYmNhbSBtb2R1bGUgdmVyc2lvbiAiIFBXQ19WRVJTSU9OICIgbG9hZGVkLlxuIik7CisJSW5mbygiU3VwcG9ydHMgUGhpbGlwcyBQQ0E2NDUvNjQ2LCBQQ1ZDNjc1LzY4MC82OTAsIFBDVkM3MjBbNDBdLzczMC83NDAvNzUwICYgUENWQzgzMC84NDAuXG4iKTsKKwlJbmZvKCJBbHNvIHN1cHBvcnRzIHRoZSBBc2tleSBWQzAxMCwgdmFyaW91cyBMb2dpdGVjaCBRdWlja2NhbXMsIFNhbXN1bmcgTVBDLUMxMCBhbmQgTVBDLUMzMCxcbiIpOworCUluZm8oInRoZSBDcmVhdGl2ZSBXZWJDYW0gNSAmIFBybyBFeCwgU09URUMgQWZpbmEgRXllIGFuZCBWaXNpb25pdGUgVkNTLVVDMzAwIGFuZCBWQ1MtVU0xMDAuXG4iKTsKKworCWlmIChmcHMpIHsKKwkJaWYgKGZwcyA8IDQgfHwgZnBzID4gMzApIHsKKwkJCUVycigiRnJhbWVyYXRlIG91dCBvZiBib3VuZHMgKDQtMzApLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkZWZhdWx0X2ZwcyA9IGZwczsKKwkJSW5mbygiRGVmYXVsdCBmcmFtZXJhdGUgc2V0IHRvICVkLlxuIiwgZGVmYXVsdF9mcHMpOworCX0KKworCWlmIChzaXplWzBdKSB7CisJCS8qIHN0cmluZzsgdHJ5IG1hdGNoaW5nIHdpdGggYXJyYXkgKi8KKwkJZm9yIChzeiA9IDA7IHN6IDwgUFNaX01BWDsgc3orKykgeworCQkJaWYgKCFzdHJjbXAoc2l6ZW5hbWVzW3N6XSwgc2l6ZSkpIHsgLyogRm91bmQhICovCisJCQkJZGVmYXVsdF9zaXplID0gc3o7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHN6ID09IFBTWl9NQVgpIHsKKwkJCUVycigiU2l6ZSBub3QgcmVjb2duaXplZDsgdHJ5IHNpemU9W3NxY2lmIHwgcXNpZiB8IHFjaWYgfCBzaWYgfCBjaWYgfCB2Z2FdLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlJbmZvKCJEZWZhdWx0IGltYWdlIHNpemUgc2V0IHRvICVzIFslZHglZF0uXG4iLCBzaXplbmFtZXNbZGVmYXVsdF9zaXplXSwgcHdjX2ltYWdlX3NpemVzW2RlZmF1bHRfc2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW2RlZmF1bHRfc2l6ZV0ueSk7CisJfQorCWlmIChtYnVmcykgeworCQlpZiAobWJ1ZnMgPCAxIHx8IG1idWZzID4gTUFYX0lNQUdFUykgeworCQkJRXJyKCJJbGxlZ2FsIG51bWJlciBvZiBtbWFwKCkgYnVmZmVyczsgdXNlIGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgJWQuXG4iLCBNQVhfSU1BR0VTKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWRlZmF1bHRfbWJ1ZnMgPSBtYnVmczsKKwkJSW5mbygiTnVtYmVyIG9mIGltYWdlIGJ1ZmZlcnMgc2V0IHRvICVkLlxuIiwgZGVmYXVsdF9tYnVmcyk7CisJfQorCWlmIChmYnVmcykgeworCQlpZiAoZmJ1ZnMgPCAyIHx8IGZidWZzID4gTUFYX0ZSQU1FUykgeworCQkJRXJyKCJJbGxlZ2FsIG51bWJlciBvZiBmcmFtZSBidWZmZXJzOyB1c2UgYSBudW1iZXIgYmV0d2VlbiAyIGFuZCAlZC5cbiIsIE1BWF9GUkFNRVMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZGVmYXVsdF9mYnVmcyA9IGZidWZzOworCQlJbmZvKCJOdW1iZXIgb2YgZnJhbWUgYnVmZmVycyBzZXQgdG8gJWQuXG4iLCBkZWZhdWx0X2ZidWZzKTsKKwl9CisJaWYgKHRyYWNlID49IDApIHsKKwkJSW5mbygiVHJhY2Ugb3B0aW9uczogMHglMDR4XG4iLCB0cmFjZSk7CisJCXB3Y190cmFjZSA9IHRyYWNlOworCX0KKwlpZiAoY29tcHJlc3Npb24gPj0gMCkgeworCQlpZiAoY29tcHJlc3Npb24gPiAzKSB7CisJCQlFcnIoIkludmFsaWQgY29tcHJlc3Npb24gc2V0dGluZzsgdXNlIGEgbnVtYmVyIGJldHdlZW4gMCAodW5jb21wcmVzc2VkKSBhbmQgMyAoaGlnaCkuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbjsKKwkJSW5mbygiUHJlZmVycmVkIGNvbXByZXNzaW9uIHNldCB0byAlZC5cbiIsIHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24pOworCX0KKwlpZiAocG93ZXJfc2F2ZSkKKwkJSW5mbygiRW5hYmxpbmcgcG93ZXIgc2F2ZSBvbiBvcGVuL2Nsb3NlLlxuIik7CisJaWYgKGxlZHNbMF0gPj0gMCkKKwkJbGVkX29uID0gbGVkc1swXTsKKwlpZiAobGVkc1sxXSA+PSAwKQorCQlsZWRfb2ZmID0gbGVkc1sxXTsKKworCS8qIEJpZyBkZXZpY2Ugbm9kZSB3aG9vcGxhLiBCYXNpY2x5LCBpdCBhbGxvd3MgeW91IHRvIGFzc2lnbiBhCisJICAgZGV2aWNlIG5vZGUgKC9kZXYvdmlkZW9YKSB0byBhIGNhbWVyYSwgYmFzZWQgb24gaXRzIHR5cGUKKwkgICAmIHNlcmlhbCBudW1iZXIuIFRoZSBmb3JtYXQgaXMgW3R5cGVbLnNlcmlhbG51bWJlcl06XW5vZGUuCisKKwkgICBBbnkgY2FtZXJhIHRoYXQgaXNuJ3QgbWF0Y2hlZCBieSB0aGVzZSBydWxlcyBnZXRzIHRoZSBuZXh0CisJICAgYXZhaWxhYmxlIGZyZWUgZGV2aWNlIG5vZGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9ERVZfSElOVFM7IGkrKykgeworCQljaGFyICpzLCAqY29sb24sICpkb3Q7CisKKwkJLyogVGhpcyBsb29wIGFsc28gaW5pdGlhbGl6ZXMgdGhlIGFycmF5ICovCisJCWRldmljZV9oaW50W2ldLnBkZXYgPSBOVUxMOworCQlzID0gZGV2X2hpbnRbaV07CisJCWlmIChzICE9IE5VTEwgJiYgKnMgIT0gJ1wwJykgeworCQkJZGV2aWNlX2hpbnRbaV0udHlwZSA9IC0xOyAvKiB3aWxkY2FyZCAqLworCQkJc3RyY3B5KGRldmljZV9oaW50W2ldLnNlcmlhbF9udW1iZXIsICIqIik7CisKKwkJCS8qIHBhcnNlIHN0cmluZzogY2hvcCBhdCAnOicgJiAnLycgKi8KKwkJCWNvbG9uID0gZG90ID0gczsKKwkJCXdoaWxlICgqY29sb24gIT0gJ1wwJyAmJiAqY29sb24gIT0gJzonKQorCQkJCWNvbG9uKys7CisJCQl3aGlsZSAoKmRvdCAhPSAnXDAnICYmICpkb3QgIT0gJy4nKQorCQkJCWRvdCsrOworCQkJLyogRmV3IHNhbml0eSBjaGVja3MgKi8KKwkJCWlmICgqZG90ICE9ICdcMCcgJiYgZG90ID4gY29sb24pIHsKKwkJCQlFcnIoIk1hbGZvcm1lZCBjYW1lcmEgaGludDogdGhlIGNvbG9uIG11c3QgYmUgYWZ0ZXIgdGhlIGRvdC5cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlpZiAoKmNvbG9uID09ICdcMCcpIHsKKwkJCQkvKiBObyBjb2xvbiAqLworCQkJCWlmICgqZG90ICE9ICdcMCcpIHsKKwkJCQkJRXJyKCJNYWxmb3JtZWQgY2FtZXJhIGhpbnQ6IG5vIGNvbG9uICsgZGV2aWNlIG5vZGUgZ2l2ZW4uXG4iKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvKiBObyB0eXBlIG9yIHNlcmlhbCBudW1iZXIgc3BlY2lmaWVkLCBqdXN0IGEgbnVtYmVyLiAqLworCQkJCQlkZXZpY2VfaGludFtpXS5kZXZpY2Vfbm9kZSA9IHB3Y19hdG9pKHMpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qIFRoZXJlJ3MgYSBjb2xvbiwgc28gd2UgaGF2ZSBhdCBsZWFzdCBhIHR5cGUgYW5kIGEgZGV2aWNlIG5vZGUgKi8KKwkJCQlkZXZpY2VfaGludFtpXS50eXBlID0gcHdjX2F0b2kocyk7CisJCQkJZGV2aWNlX2hpbnRbaV0uZGV2aWNlX25vZGUgPSBwd2NfYXRvaShjb2xvbiArIDEpOworCQkJCWlmICgqZG90ICE9ICdcMCcpIHsKKwkJCQkJLyogVGhlcmUncyBhIHNlcmlhbCBudW1iZXIgYXMgd2VsbCAqLworCQkJCQlpbnQgazsKKwkJCQkJCisJCQkJCWRvdCsrOworCQkJCQlrID0gMDsKKwkJCQkJd2hpbGUgKCpkb3QgIT0gJzonICYmIGsgPCAyOSkgeworCQkJCQkJZGV2aWNlX2hpbnRbaV0uc2VyaWFsX251bWJlcltrKytdID0gKmRvdDsKKwkJCQkJCWRvdCsrOworCQkJCQl9CisJCQkJCWRldmljZV9oaW50W2ldLnNlcmlhbF9udW1iZXJba10gPSAnXDAnOworCQkJCX0KKwkJCX0KKyNpZiBQV0NfREVCVUcJCQorCQkJRGVidWcoImRldmljZV9oaW50WyVkXTpcbiIsIGkpOworCQkJRGVidWcoIiAgdHlwZSAgICA6ICVkXG4iLCBkZXZpY2VfaGludFtpXS50eXBlKTsKKwkJCURlYnVnKCIgIHNlcmlhbCMgOiAlc1xuIiwgZGV2aWNlX2hpbnRbaV0uc2VyaWFsX251bWJlcik7CisJCQlEZWJ1ZygiICBub2RlICAgIDogJWRcbiIsIGRldmljZV9oaW50W2ldLmRldmljZV9ub2RlKTsKKyNlbmRpZgkJCQorCQl9CisJCWVsc2UKKwkJCWRldmljZV9oaW50W2ldLnR5cGUgPSAwOyAvKiBub3QgZmlsbGVkICovCisJfSAvKiAuLmZvciBNQVhfREVWX0hJTlRTICovCisKKyAJVHJhY2UoVFJBQ0VfUFJPQkUsICJSZWdpc3RlcmluZyBkcml2ZXIgYXQgYWRkcmVzcyAweCVwLlxuIiwgJnB3Y19kcml2ZXIpOworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnB3Y19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX3B3Y19leGl0KHZvaWQpCit7CisJVHJhY2UoVFJBQ0VfTU9EVUxFLCAiRGVyZWdpc3RlcmluZyBkcml2ZXIuXG4iKTsKKwl1c2JfZGVyZWdpc3RlcigmcHdjX2RyaXZlcik7CisJSW5mbygiUGhpbGlwcyB3ZWJjYW0gbW9kdWxlIHJlbW92ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQodXNiX3B3Y19pbml0KTsKK21vZHVsZV9leGl0KHVzYl9wd2NfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtaW9jdGwuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTgwNWVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1pb2N0bC5oCkBAIC0wLDAgKzEsMjkyIEBACisjaWZuZGVmIFBXQ19JT0NUTF9ICisjZGVmaW5lIFBXQ19JT0NUTF9ICisKKy8qIChDKSAyMDAxLTIwMDQgTmVtb3NvZnQgVW52LgorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisvKiBUaGlzIGlzIHB3Yy1pb2N0bC5oIGJlbG9uZ2luZyB0byBQV0MgOC4xMi4xCisgICBJdCBjb250YWlucyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzIHRvIGNvbW11bmljYXRlIGZyb20gdXNlciBzcGFjZQorICAgZGlyZWN0bHkgdG8gdGhlIGRyaXZlci4KKyAqLworCisvKgorICAgQ2hhbmdlcworICAgMjAwMS8wOC8wMyAgQWx2YXJhZG8gICBBZGRlZCBpb2N0bCBjb25zdGFudHMgdG8gYWNjZXNzIG1ldGhvZHMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5naW5nIHdoaXRlIGJhbGFuY2UgYW5kIHJlZC9ibHVlIGdhaW5zCisgICAyMDAyLzEyLzE1ICBHLiBILiBGZXJuYW5kZXotVG9yaWJpbyAgIFZJRElPQ0dSRUFMU0laRQorICAgMjAwMy8xMi8xMyAgTmVtb3NmdCBVbnYuIFNvbWUgbW9kaWZpY2F0aW9ucyB0byBtYWtlIGludGVyZmFjaW5nIHRvCisgICAgICAgICAgICAgICBQV0NYIGVhc2llcgorICovCisKKy8qIFRoZXNlIGFyZSBwcml2YXRlIGlvY3RsKCkgY29tbWFuZHMsIHNwZWNpZmljIGZvciB0aGUgUGhpbGlwcyB3ZWJjYW1zLgorICAgVGhleSBjb250YWluIGZ1bmN0aW9ucyBub3QgZm91bmQgaW4gb3RoZXIgd2ViY2FtcywgYW5kIHNldHRpbmdzIG5vdAorICAgc3BlY2lmaWVkIGluIHRoZSBWaWRlbzRMaW51eCBBUEkuCisKKyAgIFRoZSAjZGVmaW5lIG5hbWVzIGFyZSBidWlsdCB1cCBsaWtlIGZvbGxvd3M6CisgICBWSURJT0MJCVZJRGVvIElPQ3RsIHByZWZpeAorICAgICAgICAgUFdDCQlQaGlscHMgV2ViQ2FtCisgICAgICAgICAgICBHICAgICAgICAgICBvcHRpb25hbDogR2V0CisgICAgICAgICAgICBTICAgICAgICAgICBvcHRpb25hbDogU2V0CisgICAgICAgICAgICAgLi4uIAl0aGUgZnVuY3Rpb24KKyAqLworCisKKyAvKiBFbnVtZXJhdGlvbiBvZiBpbWFnZSBzaXplcyAqLworI2RlZmluZSBQU1pfU1FDSUYJMHgwMAorI2RlZmluZSBQU1pfUVNJRgkweDAxCisjZGVmaW5lIFBTWl9RQ0lGCTB4MDIKKyNkZWZpbmUgUFNaX1NJRgkJMHgwMworI2RlZmluZSBQU1pfQ0lGCQkweDA0CisjZGVmaW5lIFBTWl9WR0EJCTB4MDUKKyNkZWZpbmUgUFNaX01BWAkJNgorCisKKy8qIFRoZSBmcmFtZSByYXRlIGlzIGVuY29kZWQgaW4gdGhlIHZpZGVvX3dpbmRvdy5mbGFncyBwYXJhbWV0ZXIgdXNpbmcKKyAgIHRoZSB1cHBlciAxNiBiaXRzLCBzaW5jZSBzb21lIGZsYWdzIGFyZSBkZWZpbmVkIG5vd2FkYXlzLiBUaGUgZm9sbG93aW5nCisgICBkZWZpbmVzIHByb3ZpZGUgYSBtYXNrIGFuZCBzaGlmdCB0byBmaWx0ZXIgb3V0IHRoaXMgdmFsdWUuCisKKyAgIEluICdTbmFwc2hvdCcgbW9kZSB0aGUgY2FtZXJhIGZyZWV6ZXMgaXRzIGF1dG9tYXRpYyBleHBvc3VyZSBhbmQgY29sb3VyCisgICBiYWxhbmNlIGNvbnRyb2xzLgorICovCisjZGVmaW5lIFBXQ19GUFNfU0hJRlQJCTE2CisjZGVmaW5lIFBXQ19GUFNfTUFTSwkJMHgwMEZGMDAwMAorI2RlZmluZSBQV0NfRlBTX0ZSTUFTSwkJMHgwMDNGMDAwMAorI2RlZmluZSBQV0NfRlBTX1NOQVBTSE9UCTB4MDA0MDAwMDAKKworCisvKiBzdHJ1Y3R1cmUgZm9yIHRyYW5zZmVyaW5nIHggJiB5IGNvb3JkaW5hdGVzICovCitzdHJ1Y3QgcHdjX2Nvb3JkCit7CisJaW50IHgsIHk7CQkvKiBndWVzcyB3aGF0ICovCisJaW50IHNpemU7CQkvKiBzaXplLCBvciBvZmZzZXQgKi8KK307CisKKworLyogVXNlZCB3aXRoIFZJRElPQ1BXQ1BST0JFICovCitzdHJ1Y3QgcHdjX3Byb2JlCit7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgdHlwZTsKK307CisKK3N0cnVjdCBwd2Nfc2VyaWFsCit7CisJY2hhciBzZXJpYWxbMzBdOwkvKiBTdHJpbmcgd2l0aCBzZXJpYWwgbnVtYmVyLiBDb250YWlucyB0ZXJtaW5hdGluZyAwICovCit9OworCQorLyogcHdjX3doaXRlYmFsYW5jZS5tb2RlIHZhbHVlcyAqLworI2RlZmluZSBQV0NfV0JfSU5ET09SCQkwCisjZGVmaW5lIFBXQ19XQl9PVVRET09SCQkxCisjZGVmaW5lIFBXQ19XQl9GTAkJMgorI2RlZmluZSBQV0NfV0JfTUFOVUFMCQkzCisjZGVmaW5lIFBXQ19XQl9BVVRPCQk0CisKKy8qIFVzZWQgd2l0aCBWSURJT0NQV0NbU0ddQVdCIChBdXRvIFdoaXRlIEJhbGFuY2UpLiAKKyAgIFNldCBtb2RlIHRvIG9uZSBvZiB0aGUgUFdDX1dCXyogdmFsdWVzIGFib3ZlLgorICAgKnJlZCBhbmQgKmJsdWUgYXJlIHRoZSByZXNwZWN0aXZlIGdhaW5zIG9mIHRoZXNlIGNvbG91ciBjb21wb25lbnRzIGluc2lkZSAKKyAgIHRoZSBjYW1lcmE7IHJhbmdlIDAuLjY1NTM1CisgICBXaGVuICdtb2RlJyA9PSBQV0NfV0JfTUFOVUFMLCAnbWFudWFsX3JlZCcgYW5kICdtYW51YWxfYmx1ZScgYXJlIHNldCBvciByZWFkOyAKKyAgIG90aGVyd2lzZSB1bmRlZmluZWQuCisgICAncmVhZF9yZWQnIGFuZCAncmVhZF9ibHVlJyBhcmUgcmVhZC1vbmx5LgorKi8gICAKK3N0cnVjdCBwd2Nfd2hpdGViYWxhbmNlCit7CisJaW50IG1vZGU7CisJaW50IG1hbnVhbF9yZWQsIG1hbnVhbF9ibHVlOwkvKiBSL1cgKi8KKwlpbnQgcmVhZF9yZWQsIHJlYWRfYmx1ZTsJLyogUi9PICovCit9OworCisvKiAKKyAgICdjb250cm9sX3NwZWVkJyBhbmQgJ2NvbnRyb2xfZGVsYXknIGFyZSB1c2VkIGluIGF1dG9tYXRpYyB3aGl0ZWJhbGFuY2UgbW9kZSwKKyAgIGFuZCB0ZWxsIHRoZSBjYW1lcmEgaG93IGZhc3QgaXQgc2hvdWxkIHJlYWN0IHRvIGNoYW5nZXMgaW4gbGlnaHRpbmcsIGFuZCAKKyAgIHdpdGggaG93IG11Y2ggZGVsYXkuIFZhbGlkIHZhbHVlcyBhcmUgMC4uNjU1MzUuCisqLworc3RydWN0IHB3Y193Yl9zcGVlZAoreworCWludCBjb250cm9sX3NwZWVkOworCWludCBjb250cm9sX2RlbGF5OworCit9OworCisvKiBVc2VkIHdpdGggVklESU9DUFdDW1NHXUxFRCAqLworc3RydWN0IHB3Y19sZWRzCit7CisJaW50IGxlZF9vbjsJCQkvKiBMZWQgb24tdGltZTsgcmFuZ2UgPSAwLi4yNTAwMCAqLworCWludCBsZWRfb2ZmOwkJCS8qIExlZCBvZmYtdGltZTsgcmFuZ2UgPSAwLi4yNTAwMCAgKi8KK307CisKKy8qIEltYWdlIHNpemUgKHVzZWQgd2l0aCBHUkVBTFNJWkUpICovCitzdHJ1Y3QgcHdjX2ltYWdlc2l6ZQoreworCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0OworfTsKKworLyogRGVmaW5lcyBhbmQgc3RydWN0dXJlcyBmb3IgTW90b3JpemVkIFBhbiAmIFRpbHQgKi8KKyNkZWZpbmUgUFdDX01QVF9QQU4JCTB4MDEKKyNkZWZpbmUgUFdDX01QVF9USUxUCQkweDAyCisjZGVmaW5lIFBXQ19NUFRfVElNRU9VVAkJMHgwNCAvKiBmb3Igc3RhdHVzICovCisKKy8qIFNldCBhbmdsZXM7IHdoZW4gYWJzb2x1dGUgIT0gMCwgdGhlIGFuZ2xlIGlzIGFic29sdXRlIGFuZCB0aGUgCisgICBkcml2ZXIgY2FsY3VsYXRlcyB0aGUgcmVsYXRpdmUgb2Zmc2V0IGZvciB5b3UuIFRoaXMgY2FuIG9ubHkKKyAgIGJlIHVzZWQgd2l0aCBWSURJT0NQV0NTQU5HTEU7IFZJRElPQ1BXQ0dBTkdMRSBhbHdheXMgcmV0dXJucworICAgYWJzb2x1dGUgYW5nbGVzLgorICovICAgCitzdHJ1Y3QgcHdjX21wdF9hbmdsZXMKK3sKKwlpbnQgYWJzb2x1dGU7CQkvKiB3cml0ZS1vbmx5ICovCisJaW50IHBhbjsJCS8qIGRlZ3JlZXMgKiAxMDAgKi8KKwlpbnQgdGlsdDsJCS8qIGRlZ3Jlc3MgKiAxMDAgKi8KK307CisKKy8qIFJhbmdlIG9mIGFuZ2xlcyBvZiB0aGUgY2FtZXJhLCBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseS4KKyAqLworc3RydWN0IHB3Y19tcHRfcmFuZ2UKK3sKKwlpbnQgcGFuX21pbiwgcGFuX21heDsJCS8qIGRlZ3JlZXMgKiAxMDAgKi8KKwlpbnQgdGlsdF9taW4sIHRpbHRfbWF4OworfTsKKworc3RydWN0IHB3Y19tcHRfc3RhdHVzCit7CisJaW50IHN0YXR1czsKKwlpbnQgdGltZV9wYW47CisJaW50IHRpbWVfdGlsdDsKK307CisKKworLyogVGhpcyBpcyB1c2VkIGZvciBvdXQtb2Yta2VybmVsIGRlY29tcHJlc3Npb24uIFdpdGggaXQsIHlvdSBjYW4gZ2V0CisgICBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBpbml0aWFsaXplIGFuZCB1c2UgdGhlIGRlY29tcHJlc3NvcgorICAgcm91dGluZXMgaW4gc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMuCisgKi8gICAKK3N0cnVjdCBwd2NfdmlkZW9fY29tbWFuZAoreworCWludCB0eXBlOwkJLyogY2FtZXJhIHR5cGUgKDY0NSwgNjc1LCA3MzAsIGV0Yy4pICovCisJaW50IHJlbGVhc2U7CQkvKiByZWxlYXNlIG51bWJlciAqLworCisgICAgICAgIGludCBzaXplOwkJLyogb25lIG9mIFBTWl8qICovCisgICAgICAgIGludCBhbHRlcm5hdGU7CisJaW50IGNvbW1hbmRfbGVuOwkvKiBsZW5ndGggb2YgVVNCIHZpZGVvIGNvbW1hbmQgKi8KKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmRfYnVmWzEzXTsJLyogQWN0dWFsIFVTQiB2aWRlbyBjb21tYW5kICovCisJaW50IGJhbmRsZW5ndGg7CQkvKiA+MCA9IGNvbXByZXNzZWQgKi8KKwlpbnQgZnJhbWVfc2l6ZTsJCS8qIFNpemUgb2Ygb25lICh1biljb21wcmVzc2VkIGZyYW1lICovCit9OworCisvKiBGbGFncyBmb3IgUFdDWCBzdWJyb3V0aW5lcy4gTm90IGFsbCBtb2R1bGVzIGhvbm91ciBhbGwgZmxhZ3MuICovCisjZGVmaW5lIFBXQ1hfRkxBR19QTEFOQVIJMHgwMDAxCisjZGVmaW5lIFBXQ1hfRkxBR19CQVlFUgkJMHgwMDA4CisKKworLyogSU9DVEwgZGVmaW5pdGlvbnMgKi8KKworIC8qIFJlc3RvcmUgdXNlciBzZXR0aW5ncyAqLworI2RlZmluZSBWSURJT0NQV0NSVVNFUgkJX0lPKCd2JywgMTkyKQorIC8qIFNhdmUgdXNlciBzZXR0aW5ncyAqLworI2RlZmluZSBWSURJT0NQV0NTVVNFUgkJX0lPKCd2JywgMTkzKQorIC8qIFJlc3RvcmUgZmFjdG9yeSBzZXR0aW5ncyAqLworI2RlZmluZSBWSURJT0NQV0NGQUNUT1JZCV9JTygndicsIDE5NCkKKworIC8qIFlvdSBjYW4gbWFuaXB1bGF0ZSB0aGUgY29tcHJlc3Npb24gZmFjdG9yLiBBIGNvbXByZXNzaW9uIHByZWZlcmVuY2Ugb2YgMAorICAgIG1lYW5zIHVzZSB1bmNvbXByZXNzZWQgbW9kZXMgd2hlbiBhdmFpbGFibGU7IDEgaXMgbG93IGNvbXByZXNzaW9uLCAyIGlzCisgICAgbWVkaXVtIGFuZCAzIGlzIGhpZ2ggY29tcHJlc3Npb24gcHJlZmVycmVkLiBPZiBjb3Vyc2UsIHRoZSBoaWdoZXIgdGhlCisgICAgY29tcHJlc3Npb24sIHRoZSBsb3dlciB0aGUgYmFuZHdpZHRoIHVzZWQgYnV0IG1vcmUgY2hhbmNlIG9mIGFydGVmYWN0cworICAgIGluIHRoZSBpbWFnZS4gVGhlIGRyaXZlciBhdXRvbWF0aWNhbGx5IGNob29zZXMgYSBoaWdoZXIgY29tcHJlc3Npb24gd2hlbgorICAgIHRoZSBwcmVmZXJyZWQgbW9kZSBpcyBub3QgYXZhaWxhYmxlLgorICAqLworIC8qIFNldCBwcmVmZXJyZWQgY29tcHJlc3Npb24gcXVhbGl0eSAoMCA9IHVuY29tcHJlc3NlZCwgMyA9IGhpZ2hlc3QgY29tcHJlc3Npb24pICovCisjZGVmaW5lIFZJRElPQ1BXQ1NDUVVBTAkJX0lPVygndicsIDE5NSwgaW50KQorIC8qIEdldCBwcmVmZXJyZWQgY29tcHJlc3Npb24gcXVhbGl0eSAqLworI2RlZmluZSBWSURJT0NQV0NHQ1FVQUwJCV9JT1IoJ3YnLCAxOTUsIGludCkKKworCisvKiBSZXRyaWV2ZSBzZXJpYWwgbnVtYmVyIG9mIGNhbWVyYSAqLworI2RlZmluZSBWSURJT0NQV0NHU0VSSUFMCV9JT1IoJ3YnLCAxOTgsIHN0cnVjdCBwd2Nfc2VyaWFsKQorCisgLyogVGhpcyBpcyBhIHByb2JlIGZ1bmN0aW9uOyBzaW5jZSBzbyBtYW55IGRldmljZXMgYXJlIHN1cHBvcnRlZCwgaXQKKyAgICBiZWNvbWVzIGRpZmZpY3VsdCB0byBpbmNsdWRlIGFsbCB0aGUgbmFtZXMgaW4gcHJvZ3JhbXMgdGhhdCB3YW50IHRvCisgICAgY2hlY2sgZm9yIHRoZSBlbmhhbmNlZCBQaGlsaXBzIHN0dWZmLiBTbyBpbiBzdGVhZCwgdHJ5IHRoaXMgUFJPQkU7CisgICAgaXQgcmV0dXJucyBhIHN0cnVjdHVyZSB3aXRoIHRoZSBvcmlnaW5hbCBuYW1lLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICBQaGlsaXBzIHR5cGUuCisgICAgVG8gdXNlLCBmaWxsIHRoZSBzdHJ1Y3R1cmUgd2l0aCB6ZXJvZXMsIGNhbGwgUFJPQkUgYW5kIGlmIHRoYXQgc3VjY2VlZHMsCisgICAgY29tcGFyZSB0aGUgbmFtZSB3aXRoIHRoYXQgcmV0dXJuZWQgZnJvbSBWSURJT0NHQ0FQOyB0aGV5IHNob3VsZCBiZSB0aGUKKyAgICBzYW1lLiBJZiBzbywgeW91IGNhbiBiZSBhc3N1cmVkIGl0IGlzIGEgUGhpbGlwcyAoT0VNKSBjYW0gYW5kIHRoZSB0eXBlCisgICAgaXMgdmFsaWQuCisgKi8KKyNkZWZpbmUgVklESU9DUFdDUFJPQkUJCV9JT1IoJ3YnLCAxOTksIHN0cnVjdCBwd2NfcHJvYmUpCisKKyAvKiBTZXQgQUdDIChBdXRvbWF0aWMgR2FpbiBDb250cm9sKTsgaW50IDwgMCA9IGF1dG8sIDAuLjY1NTM1ID0gZml4ZWQgKi8KKyNkZWZpbmUgVklESU9DUFdDU0FHQwkJX0lPVygndicsIDIwMCwgaW50KQorIC8qIEdldCBBR0M7IGludCA8IDAgPSBhdXRvOyA+PSAwID0gZml4ZWQsIHJhbmdlIDAuLjY1NTM1ICovCisjZGVmaW5lIFZJRElPQ1BXQ0dBR0MJCV9JT1IoJ3YnLCAyMDAsIGludCkKKyAvKiBTZXQgc2h1dHRlciBzcGVlZDsgaW50IDwgMCA9IGF1dG87ID49IDAgPSBmaXhlZCwgcmFuZ2UgMC4uNjU1MzUgKi8KKyNkZWZpbmUgVklESU9DUFdDU1NIVVRURVIJX0lPVygndicsIDIwMSwgaW50KQorCisgLyogQ29sb3IgY29tcGVuc2F0aW9uIChBdXRvIFdoaXRlIEJhbGFuY2UpICovCisjZGVmaW5lIFZJRElPQ1BXQ1NBV0IgICAgICAgICAgIF9JT1coJ3YnLCAyMDIsIHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlKQorI2RlZmluZSBWSURJT0NQV0NHQVdCICAgICAgICAgICBfSU9SKCd2JywgMjAyLCBzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkKKworIC8qIEF1dG8gV0Igc3BlZWQgKi8KKyNkZWZpbmUgVklESU9DUFdDU0FXQlNQRUVECV9JT1coJ3YnLCAyMDMsIHN0cnVjdCBwd2Nfd2Jfc3BlZWQpCisjZGVmaW5lIFZJRElPQ1BXQ0dBV0JTUEVFRAlfSU9SKCd2JywgMjAzLCBzdHJ1Y3QgcHdjX3diX3NwZWVkKQorCisgLyogTEVEcyBvbi9vZmYvYmxpbms7IGludCByYW5nZSAwLi42NTUzNSAqLworI2RlZmluZSBWSURJT0NQV0NTTEVEICAgICAgICAgICBfSU9XKCd2JywgMjA1LCBzdHJ1Y3QgcHdjX2xlZHMpCisjZGVmaW5lIFZJRElPQ1BXQ0dMRUQgICAgICAgICAgIF9JT1IoJ3YnLCAyMDUsIHN0cnVjdCBwd2NfbGVkcykKKworICAvKiBDb250b3VyIChzaGFycG5lc3MpOyBpbnQgPCAwID0gYXV0bywgMC4uNjU1MzYgPSBmaXhlZCAqLworI2RlZmluZSBWSURJT0NQV0NTQ09OVE9VUglfSU9XKCd2JywgMjA2LCBpbnQpCisjZGVmaW5lIFZJRElPQ1BXQ0dDT05UT1VSCV9JT1IoJ3YnLCAyMDYsIGludCkKKworICAvKiBCYWNrbGlnaHQgY29tcGVuc2F0aW9uOyAwID0gb2ZmLCBvdGhlcndpc2Ugb24gKi8KKyNkZWZpbmUgVklESU9DUFdDU0JBQ0tMSUdIVAlfSU9XKCd2JywgMjA3LCBpbnQpCisjZGVmaW5lIFZJRElPQ1BXQ0dCQUNLTElHSFQJX0lPUigndicsIDIwNywgaW50KQorCisgIC8qIEZsaWNrZXJsZXNzIG1vZGU7ID0gMCBvZmYsIG90aGVyd2lzZSBvbiAqLworI2RlZmluZSBWSURJT0NQV0NTRkxJQ0tFUglfSU9XKCd2JywgMjA4LCBpbnQpCisjZGVmaW5lIFZJRElPQ1BXQ0dGTElDS0VSCV9JT1IoJ3YnLCAyMDgsIGludCkgIAorCisgIC8qIER5bmFtaWMgbm9pc2UgcmVkdWN0aW9uOyAwIG9mZiwgMyA9IGhpZ2ggbm9pc2UgcmVkdWN0aW9uICovCisjZGVmaW5lIFZJRElPQ1BXQ1NEWU5OT0lTRQlfSU9XKCd2JywgMjA5LCBpbnQpCisjZGVmaW5lIFZJRElPQ1BXQ0dEWU5OT0lTRQlfSU9SKCd2JywgMjA5LCBpbnQpCisKKyAvKiBSZWFsIGltYWdlIHNpemUgYXMgdXNlZCBieSB0aGUgY2FtZXJhOyB0ZWxscyB5b3Ugd2hldGhlciBvciBub3QgdGhlcmUncyBhIGdyYXkgYm9yZGVyIGFyb3VuZCB0aGUgaW1hZ2UgKi8KKyNkZWZpbmUgVklESU9DUFdDR1JFQUxTSVpFCV9JT1IoJ3YnLCAyMTAsIHN0cnVjdCBwd2NfaW1hZ2VzaXplKQorCisgLyogTW90b3JpemVkIHBhbiAmIHRpbHQgZnVuY3Rpb25zICovIAorI2RlZmluZSBWSURJT0NQV0NNUFRSRVNFVAlfSU9XKCd2JywgMjExLCBpbnQpCisjZGVmaW5lIFZJRElPQ1BXQ01QVEdSQU5HRQlfSU9SKCd2JywgMjExLCBzdHJ1Y3QgcHdjX21wdF9yYW5nZSkKKyNkZWZpbmUgVklESU9DUFdDTVBUU0FOR0xFCV9JT1coJ3YnLCAyMTIsIHN0cnVjdCBwd2NfbXB0X2FuZ2xlcykKKyNkZWZpbmUgVklESU9DUFdDTVBUR0FOR0xFCV9JT1IoJ3YnLCAyMTIsIHN0cnVjdCBwd2NfbXB0X2FuZ2xlcykKKyNkZWZpbmUgVklESU9DUFdDTVBUU1RBVFVTCV9JT1IoJ3YnLCAyMTMsIHN0cnVjdCBwd2NfbXB0X3N0YXR1cykKKworIC8qIEdldCB0aGUgVVNCIHNldC12aWRlbyBjb21tYW5kOyBuZWVkZWQgZm9yIGluaXRpYWxpemluZyBsaWJwd2N4ICovCisjZGVmaW5lIFZJRElPQ1BXQ0dWSURDTUQJX0lPUigndicsIDIxNSwgc3RydWN0IHB3Y192aWRlb19jb21tYW5kKQorc3RydWN0IHB3Y190YWJsZV9pbml0X2J1ZmZlciB7CisgICBpbnQgbGVuOworICAgY2hhciAqYnVmZmVyOworCit9OworI2RlZmluZSBWSURJT0NQV0NHVklEVEFCTEUJX0lPUigndicsIDIxNiwgc3RydWN0IHB3Y190YWJsZV9pbml0X2J1ZmZlcikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWtpYXJhLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWtpYXJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4NTgwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2Mta2lhcmEuYwpAQCAtMCwwICsxLDg5MSBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisKKy8qIFRoaXMgdGFibGVzIGNvbnRhaW5zIGVudHJpZXMgZm9yIHRoZSA3MzAvNzQwLzc1MCAoS2lhcmEpIGNhbWVyYSwgd2l0aAorICAgNCBkaWZmZXJlbnQgcXVhbGl0aWVzIChubyBjb21wcmVzc2lvbiwgbG93LCBtZWRpdW0sIGhpZ2gpLgorICAgSXQgbGlzdHMgdGhlIGJhbmR3aWR0aCByZXF1aXJlbWVudHMgZm9yIHNhaWQgbW9kZSBieSBpdHMgYWx0ZXJuYXRlIGludGVyZmFjZQorICAgbnVtYmVyLiBBbiBhbHRlcm5hdGUgb2YgMCBtZWFucyB0aGF0IHRoZSBtb2RlIGlzIHVuYXZhaWxhYmxlLgorCisgICBUaGVyZSBhcmUgNiAqIDQgKiA0IGVudHJpZXM6CisgICAgIDYgZGlmZmVyZW50IHJlc29sdXRpb25zIHN1YnFjaWYsIHFzaWYsIHFjaWYsIHNpZiwgY2lmLCB2Z2EKKyAgICAgNiBmcmFtZXJhdGVzOiA1LCAxMCwgMTUsIDIwLCAyNSwgMzAKKyAgICAgNCBjb21wcmVzc2lvbiBtb2RpOiBub25lLCBsb3csIG1lZGl1bSwgaGlnaAorCisgICBXaGVuIGFuIHVuY29tcHJlc3NlZCBtb2RlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBuZXh0IGF2YWlsYWJsZSBjb21wcmVzc2VkIG1vZGUKKyAgIHdpbGwgYmUgY2hvc2VuICh1bmxlc3MgdGhlIGRlY29tcHJlc3NvciBpcyBhYnNlbnQpLiBTb21ldGltZXMgdGhlcmUgYXJlIG9ubHkKKyAgIDEgb3IgMiBjb21wcmVzc2VkIG1vZGVzIGF2YWlsYWJsZTsgaW4gdGhhdCBjYXNlIGVudHJpZXMgYXJlIGR1cGxpY2F0ZWQuCisqLworCisKKyNpbmNsdWRlICJwd2Mta2lhcmEuaCIKKyNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgorCitjb25zdCBzdHJ1Y3QgS2lhcmFfdGFibGVfZW50cnkgS2lhcmFfdGFibGVbUFNaX01BWF1bNl1bNF0gPQoreworICAgLyogU1FDSUYgKi8KKyAgIHsKKyAgICAgIC8qIDUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAxMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDE1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMjAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAyNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDMwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgfSwKKyAgIC8qIFFTSUYgKi8KKyAgIHsKKyAgICAgIC8qIDUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MSwgMTQ2LCAgICAwLCB7MHgxRCwgMHhGNCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg5MiwgMHgwMCwgMHg4MH19LAorICAgICAgICAgezEsIDE0NiwgICAgMCwgezB4MUQsIDB4RjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4OTIsIDB4MDAsIDB4ODB9fSwKKyAgICAgICAgIHsxLCAxNDYsICAgIDAsIHsweDFELCAweEY0LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDkyLCAweDAwLCAweDgwfX0sCisgICAgICAgICB7MSwgMTQ2LCAgICAwLCB7MHgxRCwgMHhGNCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg5MiwgMHgwMCwgMHg4MH19LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezIsIDI5MSwgICAgMCwgezB4MUMsIDB4RjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MjMsIDB4MDEsIDB4ODB9fSwKKyAgICAgICAgIHsxLCAxOTIsICA2MzAsIHsweDE0LCAweEY0LCAweDMwLCAweDEzLCAweEE5LCAweDEyLCAweEUxLCAweDE3LCAweDA4LCAweEMwLCAweDAwLCAweDgwfX0sCisgICAgICAgICB7MSwgMTkyLCAgNjMwLCB7MHgxNCwgMHhGNCwgMHgzMCwgMHgxMywgMHhBOSwgMHgxMiwgMHhFMSwgMHgxNywgMHgwOCwgMHhDMCwgMHgwMCwgMHg4MH19LAorICAgICAgICAgezEsIDE5MiwgIDYzMCwgezB4MTQsIDB4RjQsIDB4MzAsIDB4MTMsIDB4QTksIDB4MTIsIDB4RTEsIDB4MTcsIDB4MDgsIDB4QzAsIDB4MDAsIDB4ODB9fSwKKyAgICAgIH0sCisgICAgICAvKiAxNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHszLCA0MzcsICAgIDAsIHsweDFCLCAweEY0LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweEI1LCAweDAxLCAweDgwfX0sCisgICAgICAgICB7MiwgMjkyLCAgNjQwLCB7MHgxMywgMHhGNCwgMHgzMCwgMHgxMywgMHhGNywgMHgxMywgMHgyRiwgMHgxMywgMHgyMCwgMHgyNCwgMHgwMSwgMHg4MH19LAorICAgICAgICAgezIsIDI5MiwgIDY0MCwgezB4MTMsIDB4RjQsIDB4MzAsIDB4MTMsIDB4RjcsIDB4MTMsIDB4MkYsIDB4MTMsIDB4MjAsIDB4MjQsIDB4MDEsIDB4ODB9fSwKKyAgICAgICAgIHsxLCAxOTIsICA0MjAsIHsweDEzLCAweEY0LCAweDMwLCAweDBELCAweDFCLCAweDBDLCAweDUzLCAweDFFLCAweDE4LCAweEMwLCAweDAwLCAweDgwfX0sCisgICAgICB9LAorICAgICAgLyogMjAgZnBzICovCisgICAgICB7CisgICAgICAgICB7NCwgNTg5LCAgICAwLCB7MHgxQSwgMHhGNCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg0RCwgMHgwMiwgMHg4MH19LAorICAgICAgICAgezMsIDQ0OCwgIDczMCwgezB4MTIsIDB4RjQsIDB4MzAsIDB4MTYsIDB4QzksIDB4MTYsIDB4MDEsIDB4MEUsIDB4MTgsIDB4QzAsIDB4MDEsIDB4ODB9fSwKKyAgICAgICAgIHsyLCAyOTIsICA0NzYsIHsweDEyLCAweEY0LCAweDMwLCAweDBFLCAweEQ4LCAweDBFLCAweDEwLCAweDE5LCAweDE4LCAweDI0LCAweDAxLCAweDgwfX0sCisgICAgICAgICB7MSwgMTkyLCAgMzEyLCB7MHgxMiwgMHhGNCwgMHg1MCwgMHgwOSwgMHhCMywgMHgwOCwgMHhFQiwgMHgxRSwgMHgxOCwgMHhDMCwgMHgwMCwgMHg4MH19LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezUsIDcwMywgICAgMCwgezB4MTksIDB4RjQsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4QkYsIDB4MDIsIDB4ODB9fSwKKyAgICAgICAgIHszLCA0NDcsICA2MTAsIHsweDExLCAweEY0LCAweDMwLCAweDEzLCAweDBCLCAweDEyLCAweDQzLCAweDE0LCAweDI4LCAweEJGLCAweDAxLCAweDgwfX0sCisgICAgICAgICB7MiwgMjkyLCAgMzk4LCB7MHgxMSwgMHhGNCwgMHg1MCwgMHgwQywgMHg2QywgMHgwQiwgMHhBNCwgMHgxRSwgMHgyOCwgMHgyNCwgMHgwMSwgMHg4MH19LAorICAgICAgICAgezEsIDE5MywgIDI2MiwgezB4MTEsIDB4RjQsIDB4NTAsIDB4MDgsIDB4MjMsIDB4MDcsIDB4NUIsIDB4MUUsIDB4MjgsIDB4QzEsIDB4MDAsIDB4ODB9fSwKKyAgICAgIH0sCisgICAgICAvKiAzMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHs4LCA4NzQsICAgIDAsIHsweDE4LCAweEY0LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDZBLCAweDAzLCAweDgwfX0sCisgICAgICAgICB7NSwgNzA0LCAgNzMwLCB7MHgxMCwgMHhGNCwgMHgzMCwgMHgxNiwgMHhDOSwgMHgxNiwgMHgwMSwgMHgwRSwgMHgyOCwgMHhDMCwgMHgwMiwgMHg4MH19LAorICAgICAgICAgezMsIDQ0OCwgIDQ5MiwgezB4MTAsIDB4RjQsIDB4MzAsIDB4MEYsIDB4NUQsIDB4MEUsIDB4OTUsIDB4MTUsIDB4MjgsIDB4QzAsIDB4MDEsIDB4ODB9fSwKKyAgICAgICAgIHsyLCAyOTIsICAzMjAsIHsweDEwLCAweEY0LCAweDUwLCAweDA5LCAweEZCLCAweDA5LCAweDMzLCAweDFFLCAweDI4LCAweDI0LCAweDAxLCAweDgwfX0sCisgICAgICB9LAorICAgfSwKKyAgIC8qIFFDSUYgKi8KKyAgIHsKKyAgICAgIC8qIDUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAxMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDE1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMjAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAyNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDMwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgfSwKKyAgIC8qIFNJRiAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHs0LCA1ODIsICAgIDAsIHsweDBELCAweEY0LCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDQ2LCAweDAyLCAweDgwfX0sCisgICAgICAgICB7MywgMzg3LCAxMjc2LCB7MHgwNSwgMHhGNCwgMHgzMCwgMHgyNywgMHhEOCwgMHgyNiwgMHg0OCwgMHgwMywgMHgxMCwgMHg4MywgMHgwMSwgMHg4MH19LAorICAgICAgICAgezIsIDI5MSwgIDk2MCwgezB4MDUsIDB4RjQsIDB4MzAsIDB4MUQsIDB4RjIsIDB4MUMsIDB4NjIsIDB4MDQsIDB4MTAsIDB4MjMsIDB4MDEsIDB4ODB9fSwKKyAgICAgICAgIHsxLCAxOTEsICA2MzAsIHsweDA1LCAweEY0LCAweDUwLCAweDEzLCAweEE5LCAweDEyLCAweDE5LCAweDA1LCAweDE4LCAweEJGLCAweDAwLCAweDgwfX0sCisgICAgICB9LAorICAgICAgLyogMTAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs2LCA3NzUsIDEyNzgsIHsweDA0LCAweEY0LCAweDMwLCAweDI3LCAweEU4LCAweDI2LCAweDU4LCAweDA1LCAweDMwLCAweDA3LCAweDAzLCAweDgwfX0sCisgICAgICAgICB7MywgNDQ3LCAgNzM2LCB7MHgwNCwgMHhGNCwgMHgzMCwgMHgxNiwgMHhGQiwgMHgxNSwgMHg2QiwgMHgwNSwgMHgyOCwgMHhCRiwgMHgwMSwgMHg4MH19LAorICAgICAgICAgezIsIDI5MiwgIDQ4MCwgezB4MDQsIDB4RjQsIDB4NzAsIDB4MEUsIDB4RjksIDB4MEQsIDB4NjksIDB4MDksIDB4MjgsIDB4MjQsIDB4MDEsIDB4ODB9fSwKKyAgICAgIH0sCisgICAgICAvKiAxNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1NSwgMTA1MCwgezB4MDMsIDB4RjQsIDB4MzAsIDB4MjAsIDB4Q0YsIDB4MUYsIDB4M0YsIDB4MDYsIDB4NDgsIDB4QkIsIDB4MDMsIDB4ODB9fSwKKyAgICAgICAgIHs0LCA1OTIsICA2NTAsIHsweDAzLCAweEY0LCAweDMwLCAweDE0LCAweDQ0LCAweDEyLCAweEI0LCAweDA4LCAweDMwLCAweDUwLCAweDAyLCAweDgwfX0sCisgICAgICAgICB7MywgNDQ4LCAgNDkyLCB7MHgwMywgMHhGNCwgMHg1MCwgMHgwRiwgMHg1MiwgMHgwRCwgMHhDMiwgMHgwOSwgMHgzOCwgMHhDMCwgMHgwMSwgMHg4MH19LAorICAgICAgfSwKKyAgICAgIC8qIDIwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU4LCAgNzgyLCB7MHgwMiwgMHhGNCwgMHgzMCwgMHgxOCwgMHg2QSwgMHgxNiwgMHhEQSwgMHgwQiwgMHg1OCwgMHhCRSwgMHgwMywgMHg4MH19LAorICAgICAgICAgezUsIDcwMywgIDU3NCwgezB4MDIsIDB4RjQsIDB4NTAsIDB4MTEsIDB4RTcsIDB4MTAsIDB4NTcsIDB4MEIsIDB4NDAsIDB4QkYsIDB4MDIsIDB4ODB9fSwKKyAgICAgICAgIHszLCA0NDYsICAzNjQsIHsweDAyLCAweEY0LCAweDkwLCAweDBCLCAweDVDLCAweDA5LCAweENDLCAweDBFLCAweDM4LCAweEJFLCAweDAxLCAweDgwfX0sCisgICAgICB9LAorICAgICAgLyogMjUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTgsICA2NTQsIHsweDAxLCAweEY0LCAweDMwLCAweDE0LCAweDY2LCAweDEyLCAweEQ2LCAweDBCLCAweDUwLCAweEJFLCAweDAzLCAweDgwfX0sCisgICAgICAgICB7NiwgNzc2LCAgNTMwLCB7MHgwMSwgMHhGNCwgMHg1MCwgMHgxMCwgMHg4QywgMHgwRSwgMHhGQywgMHgwQywgMHg0OCwgMHgwOCwgMHgwMywgMHg4MH19LAorICAgICAgICAgezQsIDU5MiwgIDQwNCwgezB4MDEsIDB4RjQsIDB4NzAsIDB4MEMsIDB4OTYsIDB4MEIsIDB4MDYsIDB4MEIsIDB4NDgsIDB4NTAsIDB4MDIsIDB4ODB9fSwKKyAgICAgIH0sCisgICAgICAvKiAzMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1NywgIDUyNiwgezB4MDAsIDB4RjQsIDB4NTAsIDB4MTAsIDB4NjgsIDB4MEUsIDB4RDgsIDB4MEQsIDB4NTgsIDB4QkQsIDB4MDMsIDB4ODB9fSwKKyAgICAgICAgIHs2LCA3NzUsICA0MjYsIHsweDAwLCAweEY0LCAweDcwLCAweDBELCAweDQ4LCAweDBCLCAweEI4LCAweDBGLCAweDUwLCAweDA3LCAweDAzLCAweDgwfX0sCisgICAgICAgICB7NCwgNTkwLCAgMzI0LCB7MHgwMCwgMHg3QSwgMHg4OCwgMHgwQSwgMHgxQywgMHgwOCwgMHhCNCwgMHgwRSwgMHg1MCwgMHg0RSwgMHgwMiwgMHg4MH19LAorICAgICAgfSwKKyAgIH0sCisgICAvKiBDSUYgKi8KKyAgIHsKKyAgICAgIC8qIDUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAxMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDE1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMjAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICAgICAvKiAyNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDMwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgfSwKKyAgIC8qIFZHQSAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezYsIDc3MywgMTI3MiwgezB4MjUsIDB4RjQsIDB4MzAsIDB4MjcsIDB4QjYsIDB4MjQsIDB4OTYsIDB4MDIsIDB4MzAsIDB4MDUsIDB4MDMsIDB4ODB9fSwKKyAgICAgICAgIHs0LCA1OTIsICA5NzYsIHsweDI1LCAweEY0LCAweDUwLCAweDFFLCAweDc4LCAweDFCLCAweDU4LCAweDAzLCAweDMwLCAweDUwLCAweDAyLCAweDgwfX0sCisgICAgICAgICB7MywgNDQ4LCAgNzM4LCB7MHgyNSwgMHhGNCwgMHg5MCwgMHgxNywgMHgwQywgMHgxMywgMHhFQywgMHgwNCwgMHgzMCwgMHhDMCwgMHgwMSwgMHg4MH19LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU2LCAgNzg4LCB7MHgyNCwgMHhGNCwgMHg3MCwgMHgxOCwgMHg5QywgMHgxNSwgMHg3QywgMHgwMywgMHg0OCwgMHhCQywgMHgwMywgMHg4MH19LAorICAgICAgICAgezYsIDc3NiwgIDY0MCwgezB4MjQsIDB4RjQsIDB4QjAsIDB4MTMsIDB4RkMsIDB4MTEsIDB4MkMsIDB4MDQsIDB4NDgsIDB4MDgsIDB4MDMsIDB4ODB9fSwKKyAgICAgICAgIHs0LCA1OTIsICA0ODgsIHsweDI0LCAweDdBLCAweEU4LCAweDBGLCAweDNDLCAweDBDLCAweDZDLCAweDA2LCAweDQ4LCAweDUwLCAweDAyLCAweDgwfX0sCisgICAgICB9LAorICAgICAgLyogMTUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTcsICA1MjYsIHsweDIzLCAweDdBLCAweEU4LCAweDEwLCAweDY4LCAweDBELCAweDk4LCAweDA2LCAweDU4LCAweEJELCAweDAzLCAweDgwfX0sCisgICAgICAgICB7OSwgOTU3LCAgNTI2LCB7MHgyMywgMHg3QSwgMHhFOCwgMHgxMCwgMHg2OCwgMHgwRCwgMHg5OCwgMHgwNiwgMHg1OCwgMHhCRCwgMHgwMywgMHg4MH19LAorICAgICAgICAgezgsIDg5NSwgIDQ5MiwgezB4MjMsIDB4N0EsIDB4RTgsIDB4MEYsIDB4NUQsIDB4MEMsIDB4OEQsIDB4MDYsIDB4NTgsIDB4N0YsIDB4MDMsIDB4ODB9fSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMzAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICB9LAorfTsKKworCisvKgorICogUm9tIHRhYmxlIGZvciBraWFyYSBjaGlwcworICoKKyAqIDMyIHJvbXMgdGFibGVzIChvbmUgZm9yIGVhY2ggcmVzb2x1dGlvbiA/KQorICogIDIgdGFibGVzIHBlciByb21zIChvbmUgZm9yIGVhY2ggcGFzc2VzKSAoWSwgYW5kIFUmVikKKyAqIDEyOCBieXRlcyBwZXIgcGFzc2VzCisgKi8KKworY29uc3QgdW5zaWduZWQgaW50IEtpYXJhUm9tVGFibGUgWzhdWzJdWzE2XVs4XSA9ICAKK3sKKyB7IC8qIHZlcnNpb24gMCAqLworICB7IC8qIHZlcnNpb24gMCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAwLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDEgKi8KKyAgeyAvKiB2ZXJzaW9uIDEsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAyICovCisgIHsgLyogdmVyc2lvbiAyLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDIsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMGE0OWIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMyAqLworICB7IC8qIHZlcnNpb24gMywgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAyNWJiNiwweDAwMDI0Yjc3fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAzLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNmRjLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDQgKi8KKyAgeyAvKiB2ZXJzaW9uIDQsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMWI5MmQsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gNCwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA1ICovCisgIHsgLyogdmVyc2lvbiA1LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAyNDk2ZCwweDAwMDI1YmI2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDUsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjUyLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNGRiLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNiAqLworICB7IC8qIHZlcnNpb24gNiwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMWI5MmQsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAyNDk2ZX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMjRiNmQsMHgwMDAyZGRiNiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA2LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDcgKi8KKyAgeyAvKiB2ZXJzaW9uIDcsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFjOTZlLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiOTI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAyNDkyNCwweDAwMDI0YjZkLDB4MDAwMmRkYjYsMHgwMDAyNWJiZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gNywgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjZkYywweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxYjZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9Cit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWtpYXJhLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLWtpYXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5MjlhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2Mta2lhcmEuaApAQCAtMCwwICsxLDQ1IEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKy8qIEVudHJpZXMgZm9yIHRoZSBLaWFyYSAoNzMwLzc0MC83NTApIGNhbWVyYSAqLworCisjaWZuZGVmIFBXQ19LSUFSQV9ICisjZGVmaW5lIFBXQ19LSUFSQV9ICisKKyNpbmNsdWRlICJwd2MtaW9jdGwuaCIKKworc3RydWN0IEtpYXJhX3RhYmxlX2VudHJ5Cit7CisJY2hhciBhbHRlcm5hdGU7CQkJLyogVVNCIGFsdGVybmF0ZSBpbnRlcmZhY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBwYWNrZXRzaXplOwkvKiBOb3JtYWwgcGFja2V0IHNpemUgKi8KKwl1bnNpZ25lZCBzaG9ydCBiYW5kbGVuZ3RoOwkvKiBCYW5kbGVuZ3RoIHdoZW4gZGVjb21wcmVzc2luZyAqLworCXVuc2lnbmVkIGNoYXIgbW9kZVsxMl07CQkvKiBwcmVjb21wdXRlZCBtb2RlIHNldHRpbmdzIGZvciBjYW0gKi8KK307CisKK2NvbnN0IGV4dGVybiBzdHJ1Y3QgS2lhcmFfdGFibGVfZW50cnkgS2lhcmFfdGFibGVbUFNaX01BWF1bNl1bNF07Citjb25zdCBleHRlcm4gdW5zaWduZWQgaW50IEtpYXJhUm9tVGFibGVbOF1bMl1bMTZdWzhdOworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLW1pc2MuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTRiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLW1pc2MuYwpAQCAtMCwwICsxLDE0MCBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbSAKKyAgIFZhcmlvdXMgbWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgYW5kIHRhYmxlcy4KKyAgIChDKSAxOTk5LTIwMDMgTmVtb3NvZnQgVW52LgorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAicHdjLmgiCisKK3N0cnVjdCBwd2NfY29vcmQgcHdjX2ltYWdlX3NpemVzW1BTWl9NQVhdID0KK3sKKwl7IDEyOCwgIDk2LCAwIH0sCisJeyAxNjAsIDEyMCwgMCB9LAorCXsgMTc2LCAxNDQsIDAgfSwKKwl7IDMyMCwgMjQwLCAwIH0sCisJeyAzNTIsIDI4OCwgMCB9LAorCXsgNjQwLCA0ODAsIDAgfSwKK307CisKKy8qIHgseSAtPiBQU1pfICovCitpbnQgcHdjX2RlY29kZV9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJaW50IGksIGZpbmQ7CisKKwkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZ28gYmV5b25kIG91ciBtYXggc2l6ZS4KKyAgICAgICAgICAgTkI6IHdlIGhhdmUgZGlmZmVyZW50IGxpbWl0cyBmb3IgUkFXIGFuZCBub3JtYWwgbW9kZXMuIEluIGNhc2UKKyAgICAgICAgICAgeW91IGRvbid0IGhhdmUgdGhlIGRlY29tcHJlc3NvciBsb2FkZWQgb3IgdXNlIFJBVyBtb2RlLCAKKyAgICAgICAgICAgdGhlIG1heGltdW0gdmlld2FibGUgc2l6ZSBpcyBzbWFsbGVyLgorICAgICAgICAqLworCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1JBVykKKwl7CisJCWlmICh3aWR0aCA+IHBkZXYtPmFic19tYXgueCB8fCBoZWlnaHQgPiBwZGV2LT5hYnNfbWF4LnkpCisJCXsKKwkJCURlYnVnKCJWSURFT19QQUxFVFRFX1JBVzogZ29pbmcgYmV5b25kIGFic19tYXguXG4iKTsKKyAgICAgICAgICAgICAgICAJcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHdpZHRoID4gcGRldi0+dmlld19tYXgueCB8fCBoZWlnaHQgPiBwZGV2LT52aWV3X21heC55KQorCQl7CisJCQlEZWJ1ZygiVklERU9fUEFMRVRURV8gbm90IFJBVzogZ29pbmcgYmV5b25kIHZpZXdfbWF4LlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiBGaW5kIHRoZSBsYXJnZXN0IHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEgdGhhdCBmaXRzIGludG8gdGhlCisJICAgcmVxdWVzdGVkIHNpemUuCisJICovCisJZmluZCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBQU1pfTUFYOyBpKyspIHsKKwkJaWYgKHBkZXYtPmltYWdlX21hc2sgJiAoMSA8PCBpKSkgeworCQkJaWYgKHB3Y19pbWFnZV9zaXplc1tpXS54IDw9IHdpZHRoICYmIHB3Y19pbWFnZV9zaXplc1tpXS55IDw9IGhlaWdodCkKKwkJCQlmaW5kID0gaTsKKwkJfQorCX0KKwlyZXR1cm4gZmluZDsKK30KKworLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgZGVwZW5kaW5nIG9uIHR5cGUgYW5kIGRlY29tcHJlc3NvciovCit2b2lkIHB3Y19jb25zdHJ1Y3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJc3dpdGNoKHBkZXYtPnR5cGUpIHsKKwljYXNlIDY0NToKKwljYXNlIDY0NjoKKwkJcGRldi0+dmlld19taW4ueCA9IDEyODsKKwkJcGRldi0+dmlld19taW4ueSA9ICA5NjsKKwkJcGRldi0+dmlld19tYXgueCA9IDM1MjsKKwkJcGRldi0+dmlld19tYXgueSA9IDI4ODsKKyAgICAgICAgICAgICAgICBwZGV2LT5hYnNfbWF4LnggID0gMzUyOworICAgICAgICAgICAgICAgIHBkZXYtPmFic19tYXgueSAgPSAyODg7CisJCXBkZXYtPmltYWdlX21hc2sgPSAxIDw8IFBTWl9TUUNJRiB8IDEgPDwgUFNaX1FDSUYgfCAxIDw8IFBTWl9DSUY7CisJCXBkZXYtPnZjaW50ZXJmYWNlID0gMjsKKwkJcGRldi0+dmVuZHBvaW50ID0gNDsKKwkJcGRldi0+ZnJhbWVfaGVhZGVyX3NpemUgPSAwOworCQlwZGV2LT5mcmFtZV90cmFpbGVyX3NpemUgPSAwOworCQlicmVhazsKKwljYXNlIDY3NToKKwljYXNlIDY4MDoKKwljYXNlIDY5MDoKKwkJcGRldi0+dmlld19taW4ueCA9IDEyODsKKwkJcGRldi0+dmlld19taW4ueSA9ICA5NjsKKwkJLyogQW50aGlsbCBidWcgIzM4OiBQV0MgYWx3YXlzIHJlcG9ydHMgbWF4IHNpemUsIGV2ZW4gd2l0aG91dCBQV0NYICovCisJCXBkZXYtPnZpZXdfbWF4LnggPSA2NDA7CisJCXBkZXYtPnZpZXdfbWF4LnkgPSA0ODA7CisJCXBkZXYtPmltYWdlX21hc2sgPSAxIDw8IFBTWl9TUUNJRiB8IDEgPDwgUFNaX1FTSUYgfCAxIDw8IFBTWl9RQ0lGIHwgMSA8PCBQU1pfU0lGIHwgMSA8PCBQU1pfQ0lGIHwgMSA8PCBQU1pfVkdBOworICAgICAgICAgICAgICAgIHBkZXYtPmFic19tYXgueCA9IDY0MDsKKyAgICAgICAgICAgICAgICBwZGV2LT5hYnNfbWF4LnkgPSA0ODA7CisJCXBkZXYtPnZjaW50ZXJmYWNlID0gMzsKKwkJcGRldi0+dmVuZHBvaW50ID0gNDsKKwkJcGRldi0+ZnJhbWVfaGVhZGVyX3NpemUgPSAwOworCQlwZGV2LT5mcmFtZV90cmFpbGVyX3NpemUgPSAwOworCQlicmVhazsKKwljYXNlIDcyMDoKKwljYXNlIDczMDoKKwljYXNlIDc0MDoKKwljYXNlIDc1MDoKKwkJcGRldi0+dmlld19taW4ueCA9IDE2MDsKKwkJcGRldi0+dmlld19taW4ueSA9IDEyMDsKKwkJcGRldi0+dmlld19tYXgueCA9IDY0MDsKKwkJcGRldi0+dmlld19tYXgueSA9IDQ4MDsKKwkJcGRldi0+aW1hZ2VfbWFzayA9IDEgPDwgUFNaX1FTSUYgfCAxIDw8IFBTWl9TSUYgfCAxIDw8IFBTWl9WR0E7CisgICAgICAgICAgICAgICAgcGRldi0+YWJzX21heC54ID0gNjQwOworICAgICAgICAgICAgICAgIHBkZXYtPmFic19tYXgueSA9IDQ4MDsKKwkJcGRldi0+dmNpbnRlcmZhY2UgPSAzOworCQlwZGV2LT52ZW5kcG9pbnQgPSA1OworCQlwZGV2LT5mcmFtZV9oZWFkZXJfc2l6ZSA9IFRPVUNBTV9IRUFERVJfU0laRTsKKwkJcGRldi0+ZnJhbWVfdHJhaWxlcl9zaXplID0gVE9VQ0FNX1RSQUlMRVJfU0laRTsKKwkJYnJlYWs7CisJfQorCURlYnVnKCJ0eXBlID0gJWRcbiIscGRldi0+dHlwZSk7CisJcGRldi0+dnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1lVVjQyMFA7IC8qIGRlZmF1bHQgKi8KKwlwZGV2LT52aWV3X21pbi5zaXplID0gcGRldi0+dmlld19taW4ueCAqIHBkZXYtPnZpZXdfbWluLnk7CisJcGRldi0+dmlld19tYXguc2l6ZSA9IHBkZXYtPnZpZXdfbWF4LnggKiBwZGV2LT52aWV3X21heC55OworCS8qIGxlbmd0aCBvZiBpbWFnZSwgaW4gWVVWIGZvcm1hdDsgYWx3YXlzIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkuICovCisJcGRldi0+bGVuX3Blcl9pbWFnZSA9IChwZGV2LT5hYnNfbWF4LnggKiBwZGV2LT5hYnNfbWF4LnkgKiAzKSAvIDI7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1uYWxhLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLW5hbGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM1Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy1uYWxhLmgKQEAgLTAsMCArMSw2NiBAQAorICAgLyogU1FDSUYgKi8KKyAgIHsKKyAgICAgIHswLCAwLCB7MHgwNCwgMHgwMSwgMHgwM319LAorICAgICAgezgsIDAsIHsweDA1LCAweDAxLCAweDAzfX0sCisgICAgICB7NywgMCwgezB4MDgsIDB4MDEsIDB4MDN9fSwKKyAgICAgIHs3LCAwLCB7MHgwQSwgMHgwMSwgMHgwM319LAorICAgICAgezYsIDAsIHsweDBDLCAweDAxLCAweDAzfX0sCisgICAgICB7NSwgMCwgezB4MEYsIDB4MDEsIDB4MDN9fSwKKyAgICAgIHs0LCAwLCB7MHgxNCwgMHgwMSwgMHgwM319LAorICAgICAgezMsIDAsIHsweDE4LCAweDAxLCAweDAzfX0sCisgICB9LAorICAgLyogUVNJRiAqLworICAgeworICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgICAgezB9LAorICAgfSwKKyAgIC8qIFFDSUYgKi8KKyAgIHsKKyAgICAgIHswLCAwLCB7MHgwNCwgMHgwMSwgMHgwMn19LAorICAgICAgezgsIDAsIHsweDA1LCAweDAxLCAweDAyfX0sCisgICAgICB7NywgMCwgezB4MDgsIDB4MDEsIDB4MDJ9fSwKKyAgICAgIHs2LCAwLCB7MHgwQSwgMHgwMSwgMHgwMn19LAorICAgICAgezUsIDAsIHsweDBDLCAweDAxLCAweDAyfX0sCisgICAgICB7NCwgMCwgezB4MEYsIDB4MDEsIDB4MDJ9fSwKKyAgICAgIHsxLCAwLCB7MHgxNCwgMHgwMSwgMHgwMn19LAorICAgICAgezEsIDAsIHsweDE4LCAweDAxLCAweDAyfX0sCisgICB9LAorICAgLyogU0lGICovCisgICB7CisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICB9LAorICAgLyogQ0lGICovCisgICB7CisgICAgICB7NCwgMCwgezB4MDQsIDB4MDEsIDB4MDF9fSwKKyAgICAgIHs3LCAxLCB7MHgwNSwgMHgwMywgMHgwMX19LAorICAgICAgezYsIDEsIHsweDA4LCAweDAzLCAweDAxfX0sCisgICAgICB7NCwgMSwgezB4MEEsIDB4MDMsIDB4MDF9fSwKKyAgICAgIHszLCAxLCB7MHgwQywgMHgwMywgMHgwMX19LAorICAgICAgezIsIDEsIHsweDBGLCAweDAzLCAweDAxfX0sCisgICAgICB7MH0sCisgICAgICB7MH0sCisgICB9LAorICAgLyogVkdBICovCisgICB7ICAKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgICAgIHswfSwKKyAgIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLXRpbW9uLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLXRpbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1MGE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtdGltb24uYwpAQCAtMCwwICsxLDE0NDYgQEAKKy8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KKyAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorCisgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKKyAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgorICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgorICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCisgICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworCisvKiBUaGlzIHRhYmxlcyBjb250YWlucyBlbnRyaWVzIGZvciB0aGUgNjc1LzY4MC82OTAgKFRpbW9uKSBjYW1lcmEsIHdpdGgKKyAgIDQgZGlmZmVyZW50IHF1YWxpdGllcyAobm8gY29tcHJlc3Npb24sIGxvdywgbWVkaXVtLCBoaWdoKS4KKyAgIEl0IGxpc3RzIHRoZSBiYW5kd2lkdGggcmVxdWlyZW1lbnRzIGZvciBzYWlkIG1vZGUgYnkgaXRzIGFsdGVybmF0ZSBpbnRlcmZhY2UKKyAgIG51bWJlci4gQW4gYWx0ZXJuYXRlIG9mIDAgbWVhbnMgdGhhdCB0aGUgbW9kZSBpcyB1bmF2YWlsYWJsZS4KKworICAgVGhlcmUgYXJlIDYgKiA0ICogNCBlbnRyaWVzOgorICAgICA2IGRpZmZlcmVudCByZXNvbHV0aW9ucyBzdWJxY2lmLCBxc2lmLCBxY2lmLCBzaWYsIGNpZiwgdmdhCisgICAgIDYgZnJhbWVyYXRlczogNSwgMTAsIDE1LCAyMCwgMjUsIDMwCisgICAgIDQgY29tcHJlc3Npb24gbW9kaTogbm9uZSwgbG93LCBtZWRpdW0sIGhpZ2gKKworICAgV2hlbiBhbiB1bmNvbXByZXNzZWQgbW9kZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgbmV4dCBhdmFpbGFibGUgY29tcHJlc3NlZCBtb2RlCisgICB3aWxsIGJlIGNob3NlbiAodW5sZXNzIHRoZSBkZWNvbXByZXNzb3IgaXMgYWJzZW50KS4gU29tZXRpbWVzIHRoZXJlIGFyZSBvbmx5CisgICAxIG9yIDIgY29tcHJlc3NlZCBtb2RlcyBhdmFpbGFibGU7IGluIHRoYXQgY2FzZSBlbnRyaWVzIGFyZSBkdXBsaWNhdGVkLgorKi8KKworI2luY2x1ZGUgInB3Yy10aW1vbi5oIgorCitjb25zdCBzdHJ1Y3QgVGltb25fdGFibGVfZW50cnkgVGltb25fdGFibGVbUFNaX01BWF1bNl1bNF0gPQoreworICAgLyogU1FDSUYgKi8KKyAgIHsKKyAgICAgIC8qIDUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MSwgMTQwLCAgICAwLCB7MHgwNSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg4QywgMHhGQywgMHg4MCwgMHgwMn19LAorICAgICAgICAgezEsIDE0MCwgICAgMCwgezB4MDUsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OEMsIDB4RkMsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxNDAsICAgIDAsIHsweDA1LCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDhDLCAweEZDLCAweDgwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTQwLCAgICAwLCB7MHgwNSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg4QywgMHhGQywgMHg4MCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezIsIDI4MCwgICAgMCwgezB4MDQsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MTgsIDB4QTksIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyODAsICAgIDAsIHsweDA0LCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDE4LCAweEE5LCAweDgwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjgwLCAgICAwLCB7MHgwNCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHgxOCwgMHhBOSwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezIsIDI4MCwgICAgMCwgezB4MDQsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MTgsIDB4QTksIDB4ODAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAxNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHszLCA0MTAsICAgIDAsIHsweDAzLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDlBLCAweDcxLCAweDgwLCAweDAyfX0sCisgICAgICAgICB7MywgNDEwLCAgICAwLCB7MHgwMywgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5QSwgMHg3MSwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezMsIDQxMCwgICAgMCwgezB4MDMsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OUEsIDB4NzEsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHszLCA0MTAsICAgIDAsIHsweDAzLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDlBLCAweDcxLCAweDgwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMjAgZnBzICovCisgICAgICB7CisgICAgICAgICB7NCwgNTU5LCAgICAwLCB7MHgwMiwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHgyRiwgMHg1NiwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezQsIDU1OSwgICAgMCwgezB4MDIsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MkYsIDB4NTYsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHs0LCA1NTksICAgIDAsIHsweDAyLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDJGLCAweDU2LCAweDgwLCAweDAyfX0sCisgICAgICAgICB7NCwgNTU5LCAgICAwLCB7MHgwMiwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHgyRiwgMHg1NiwgMHg4MCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezUsIDY1OSwgICAgMCwgezB4MDEsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OTMsIDB4NDYsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHs1LCA2NTksICAgIDAsIHsweDAxLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDkzLCAweDQ2LCAweDgwLCAweDAyfX0sCisgICAgICAgICB7NSwgNjU5LCAgICAwLCB7MHgwMSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5MywgMHg0NiwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezUsIDY1OSwgICAgMCwgezB4MDEsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OTMsIDB4NDYsIDB4ODAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAzMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHs3LCA4MzgsICAgIDAsIHsweDAwLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDQ2LCAweDNCLCAweDgwLCAweDAyfX0sCisgICAgICAgICB7NywgODM4LCAgICAwLCB7MHgwMCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg0NiwgMHgzQiwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezcsIDgzOCwgICAgMCwgezB4MDAsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4NDYsIDB4M0IsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHs3LCA4MzgsICAgIDAsIHsweDAwLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDQ2LCAweDNCLCAweDgwLCAweDAyfX0sCisgICAgICB9LAorICAgfSwKKyAgIC8qIFFTSUYgKi8KKyAgIHsKKyAgICAgIC8qIDUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MSwgMTQ2LCAgICAwLCB7MHgyRCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg5MiwgMHhGQywgMHhDMCwgMHgwMn19LAorICAgICAgICAgezEsIDE0NiwgICAgMCwgezB4MkQsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4OTIsIDB4RkMsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxNDYsICAgIDAsIHsweDJELCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDkyLCAweEZDLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTQ2LCAgICAwLCB7MHgyRCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg5MiwgMHhGQywgMHhDMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezIsIDI5MSwgICAgMCwgezB4MkMsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MjMsIDB4QTEsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxOTEsICA2MzAsIHsweDJDLCAweEY0LCAweDA1LCAweDEzLCAweEE5LCAweDEyLCAweEUxLCAweDE3LCAweDA4LCAweEJGLCAweEY0LCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTkxLCAgNjMwLCB7MHgyQywgMHhGNCwgMHgwNSwgMHgxMywgMHhBOSwgMHgxMiwgMHhFMSwgMHgxNywgMHgwOCwgMHhCRiwgMHhGNCwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezEsIDE5MSwgIDYzMCwgezB4MkMsIDB4RjQsIDB4MDUsIDB4MTMsIDB4QTksIDB4MTIsIDB4RTEsIDB4MTcsIDB4MDgsIDB4QkYsIDB4RjQsIDB4QzAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAxNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHszLCA0MzcsICAgIDAsIHsweDJCLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweEI1LCAweDZELCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjkxLCAgNjQwLCB7MHgyQiwgMHhGNCwgMHgwNSwgMHgxMywgMHhGNywgMHgxMywgMHgyRiwgMHgxMywgMHgwOCwgMHgyMywgMHhBMSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezIsIDI5MSwgIDY0MCwgezB4MkIsIDB4RjQsIDB4MDUsIDB4MTMsIDB4RjcsIDB4MTMsIDB4MkYsIDB4MTMsIDB4MDgsIDB4MjMsIDB4QTEsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxOTEsICA0MjAsIHsweDJCLCAweEY0LCAweDBELCAweDBELCAweDFCLCAweDBDLCAweDUzLCAweDFFLCAweDA4LCAweEJGLCAweEY0LCAweEMwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMjAgZnBzICovCisgICAgICB7CisgICAgICAgICB7NCwgNTg4LCAgICAwLCB7MHgyQSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg0QywgMHg1MiwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezMsIDQ0NywgIDczMCwgezB4MkEsIDB4RjQsIDB4MDUsIDB4MTYsIDB4QzksIDB4MTYsIDB4MDEsIDB4MEUsIDB4MTgsIDB4QkYsIDB4NjksIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTIsICA0NzYsIHsweDJBLCAweEY0LCAweDBELCAweDBFLCAweEQ4LCAweDBFLCAweDEwLCAweDE5LCAweDE4LCAweDI0LCAweEExLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTkyLCAgMzEyLCB7MHgyQSwgMHhGNCwgMHgxRCwgMHgwOSwgMHhCMywgMHgwOCwgMHhFQiwgMHgxRSwgMHgxOCwgMHhDMCwgMHhGNCwgMHhDMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezUsIDcwMywgICAgMCwgezB4MjksIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4QkYsIDB4NDIsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHszLCA0NDcsICA2MTAsIHsweDI5LCAweEY0LCAweDA1LCAweDEzLCAweDBCLCAweDEyLCAweDQzLCAweDE0LCAweDE4LCAweEJGLCAweDY5LCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjkyLCAgMzk4LCB7MHgyOSwgMHhGNCwgMHgwRCwgMHgwQywgMHg2QywgMHgwQiwgMHhBNCwgMHgxRSwgMHgxOCwgMHgyNCwgMHhBMSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezEsIDE5MiwgIDI2MiwgezB4MjksIDB4RjQsIDB4MjUsIDB4MDgsIDB4MjMsIDB4MDcsIDB4NUIsIDB4MUUsIDB4MTgsIDB4QzAsIDB4RjQsIDB4QzAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAzMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHs4LCA4NzMsICAgIDAsIHsweDI4LCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDY5LCAweDM3LCAweEMwLCAweDAyfX0sCisgICAgICAgICB7NSwgNzA0LCAgNzc0LCB7MHgyOCwgMHhGNCwgMHgwNSwgMHgxOCwgMHgyMSwgMHgxNywgMHg1OSwgMHgwRiwgMHgxOCwgMHhDMCwgMHg0MiwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezMsIDQ0OCwgIDQ5MiwgezB4MjgsIDB4RjQsIDB4MDUsIDB4MEYsIDB4NUQsIDB4MEUsIDB4OTUsIDB4MTUsIDB4MTgsIDB4QzAsIDB4NjksIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTEsICAzMjAsIHsweDI4LCAweEY0LCAweDFELCAweDA5LCAweEZCLCAweDA5LCAweDMzLCAweDFFLCAweDE4LCAweDIzLCAweEExLCAweEMwLCAweDAyfX0sCisgICAgICB9LAorICAgfSwKKyAgIC8qIFFDSUYgKi8KKyAgIHsKKyAgICAgIC8qIDUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MSwgMTkzLCAgICAwLCB7MHgwRCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHhDMSwgMHhGNCwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezEsIDE5MywgICAgMCwgezB4MEQsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4QzEsIDB4RjQsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxOTMsICAgIDAsIHsweDBELCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweEMxLCAweEY0LCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTkzLCAgICAwLCB7MHgwRCwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHhDMSwgMHhGNCwgMHhDMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezMsIDM4NSwgICAgMCwgezB4MEMsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4ODEsIDB4NzksIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTEsICA4MDAsIHsweDBDLCAweEY0LCAweDA1LCAweDE4LCAweEY0LCAweDE4LCAweDE4LCAweDExLCAweDA4LCAweDIzLCAweEExLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjkxLCAgODAwLCB7MHgwQywgMHhGNCwgMHgwNSwgMHgxOCwgMHhGNCwgMHgxOCwgMHgxOCwgMHgxMSwgMHgwOCwgMHgyMywgMHhBMSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezEsIDE5NCwgIDUzMiwgezB4MEMsIDB4RjQsIDB4MDUsIDB4MTAsIDB4OUEsIDB4MEYsIDB4QkUsIDB4MUIsIDB4MDgsIDB4QzIsIDB4RjAsIDB4QzAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAxNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHs0LCA1NzcsICAgIDAsIHsweDBCLCAweEY0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweDQxLCAweDUyLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MywgNDQ3LCAgODE4LCB7MHgwQiwgMHhGNCwgMHgwNSwgMHgxOSwgMHg4OSwgMHgxOCwgMHhBRCwgMHgwRiwgMHgxMCwgMHhCRiwgMHg2OSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezIsIDI5MiwgIDUzNCwgezB4MEIsIDB4RjQsIDB4MDUsIDB4MTAsIDB4QTMsIDB4MEYsIDB4QzcsIDB4MTksIDB4MTAsIDB4MjQsIDB4QTEsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHsxLCAxOTUsICAzNTYsIHsweDBCLCAweEY0LCAweDE1LCAweDBCLCAweDExLCAweDBBLCAweDM1LCAweDFFLCAweDEwLCAweEMzLCAweEYwLCAweEMwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMjAgZnBzICovCisgICAgICB7CisgICAgICAgICB7NiwgNzc2LCAgICAwLCB7MHgwQSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwOCwgMHgzRiwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezQsIDU5MSwgIDgwNCwgezB4MEEsIDB4RjQsIDB4MDUsIDB4MTksIDB4MUUsIDB4MTgsIDB4NDIsIDB4MEYsIDB4MTgsIDB4NEYsIDB4NEUsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHszLCA0NDcsICA2MDgsIHsweDBBLCAweEY0LCAweDA1LCAweDEyLCAweEZELCAweDEyLCAweDIxLCAweDE1LCAweDE4LCAweEJGLCAweDY5LCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjkxLCAgMzk2LCB7MHgwQSwgMHhGNCwgMHgxNSwgMHgwQywgMHg1RSwgMHgwQiwgMHg4MiwgMHgxRSwgMHgxOCwgMHgyMywgMHhBMSwgMHhDMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezksIDkyOCwgICAgMCwgezB4MDksIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4QTAsIDB4MzMsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHs1LCA3MDMsICA4MDAsIHsweDA5LCAweEY0LCAweDA1LCAweDE4LCAweEY0LCAweDE4LCAweDE4LCAweDEwLCAweDE4LCAweEJGLCAweDQyLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7MywgNDQ3LCAgNTA4LCB7MHgwOSwgMHhGNCwgMHgwRCwgMHgwRiwgMHhEMiwgMHgwRSwgMHhGNiwgMHgxQiwgMHgxOCwgMHhCRiwgMHg2OSwgMHhDMCwgMHgwMn19LAorICAgICAgICAgezIsIDI5MiwgIDMzMiwgezB4MDksIDB4RjQsIDB4MUQsIDB4MEEsIDB4NUEsIDB4MDksIDB4N0UsIDB4MUUsIDB4MTgsIDB4MjQsIDB4QTEsIDB4QzAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAzMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1NiwgIDg3NiwgezB4MDgsIDB4RjQsIDB4MDUsIDB4MUIsIDB4NTgsIDB4MUEsIDB4N0MsIDB4MEUsIDB4MjAsIDB4QkMsIDB4MzMsIDB4MTAsIDB4MDJ9fSwKKyAgICAgICAgIHs0LCA1OTIsICA1NDIsIHsweDA4LCAweEY0LCAweDA1LCAweDEwLCAweEU0LCAweDEwLCAweDA4LCAweDE3LCAweDIwLCAweDUwLCAweDRFLCAweDEwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjkxLCAgMjY2LCB7MHgwOCwgMHhGNCwgMHgyNSwgMHgwOCwgMHg0OCwgMHgwNywgMHg2QywgMHgxRSwgMHgyMCwgMHgyMywgMHhBMSwgMHgxMCwgMHgwMn19LAorICAgICAgfSwKKyAgIH0sCisgICAvKiBTSUYgKi8KKyAgIHsKKyAgICAgIC8qIDUgZnBzICovCisgICAgICB7CisgICAgICAgICB7NCwgNTgyLCAgICAwLCB7MHgzNSwgMHhGNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg0NiwgMHg1MiwgMHg2MCwgMHgwMn19LAorICAgICAgICAgezMsIDM4NywgMTI3NiwgezB4MzUsIDB4RjQsIDB4MDUsIDB4MjcsIDB4RDgsIDB4MjYsIDB4NDgsIDB4MDMsIDB4MTAsIDB4ODMsIDB4NzksIDB4NjAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTEsICA5NjAsIHsweDM1LCAweEY0LCAweDBELCAweDFELCAweEYyLCAweDFDLCAweDYyLCAweDA0LCAweDEwLCAweDIzLCAweEExLCAweDYwLCAweDAyfX0sCisgICAgICAgICB7MSwgMTkxLCAgNjMwLCB7MHgzNSwgMHhGNCwgMHgxRCwgMHgxMywgMHhBOSwgMHgxMiwgMHgxOSwgMHgwNSwgMHgwOCwgMHhCRiwgMHhGNCwgMHg2MCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7NiwgNzc1LCAxMjc4LCB7MHgzNCwgMHhGNCwgMHgwNSwgMHgyNywgMHhFOCwgMHgyNiwgMHg1OCwgMHgwNSwgMHgzMCwgMHgwNywgMHgzRiwgMHgxMCwgMHgwMn19LAorICAgICAgICAgezMsIDQ0NywgIDczNiwgezB4MzQsIDB4RjQsIDB4MTUsIDB4MTYsIDB4RkIsIDB4MTUsIDB4NkIsIDB4MDUsIDB4MTgsIDB4QkYsIDB4NjksIDB4MTAsIDB4MDJ9fSwKKyAgICAgICAgIHsyLCAyOTEsICA0ODAsIHsweDM0LCAweEY0LCAweDJELCAweDBFLCAweEY5LCAweDBELCAweDY5LCAweDA5LCAweDE4LCAweDIzLCAweEExLCAweDEwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMTUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTUsIDEwNTAsIHsweDMzLCAweEY0LCAweDA1LCAweDIwLCAweENGLCAweDFGLCAweDNGLCAweDA2LCAweDQ4LCAweEJCLCAweDMzLCAweDEwLCAweDAyfX0sCisgICAgICAgICB7NCwgNTkxLCAgNjUwLCB7MHgzMywgMHhGNCwgMHgxNSwgMHgxNCwgMHg0NCwgMHgxMiwgMHhCNCwgMHgwOCwgMHgzMCwgMHg0RiwgMHg0RSwgMHgxMCwgMHgwMn19LAorICAgICAgICAgezMsIDQ0OCwgIDQ5MiwgezB4MzMsIDB4RjQsIDB4MjUsIDB4MEYsIDB4NTIsIDB4MEQsIDB4QzIsIDB4MDksIDB4MjgsIDB4QzAsIDB4NjksIDB4MTAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1OCwgIDc4MiwgezB4MzIsIDB4RjQsIDB4MEQsIDB4MTgsIDB4NkEsIDB4MTYsIDB4REEsIDB4MEIsIDB4NTgsIDB4QkUsIDB4MzMsIDB4RDAsIDB4MDJ9fSwKKyAgICAgICAgIHs1LCA3MDMsICA1NzQsIHsweDMyLCAweEY0LCAweDFELCAweDExLCAweEU3LCAweDEwLCAweDU3LCAweDBCLCAweDQwLCAweEJGLCAweDQyLCAweEQwLCAweDAyfX0sCisgICAgICAgICB7MywgNDQ2LCAgMzY0LCB7MHgzMiwgMHhGNCwgMHgzRCwgMHgwQiwgMHg1QywgMHgwOSwgMHhDQywgMHgwRSwgMHgzMCwgMHhCRSwgMHg2OSwgMHhEMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU4LCAgNjU0LCB7MHgzMSwgMHhGNCwgMHgxNSwgMHgxNCwgMHg2NiwgMHgxMiwgMHhENiwgMHgwQiwgMHg1MCwgMHhCRSwgMHgzMywgMHg5MCwgMHgwMn19LAorICAgICAgICAgezYsIDc3NiwgIDUzMCwgezB4MzEsIDB4RjQsIDB4MjUsIDB4MTAsIDB4OEMsIDB4MEUsIDB4RkMsIDB4MEMsIDB4NDgsIDB4MDgsIDB4M0YsIDB4OTAsIDB4MDJ9fSwKKyAgICAgICAgIHs0LCA1OTIsICA0MDQsIHsweDMxLCAweEY0LCAweDM1LCAweDBDLCAweDk2LCAweDBCLCAweDA2LCAweDBCLCAweDM4LCAweDUwLCAweDRFLCAweDkwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMzAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTcsICA1MjYsIHsweDMwLCAweEY0LCAweDI1LCAweDEwLCAweDY4LCAweDBFLCAweEQ4LCAweDBELCAweDU4LCAweEJELCAweDMzLCAweDYwLCAweDAyfX0sCisgICAgICAgICB7NiwgNzc1LCAgNDI2LCB7MHgzMCwgMHhGNCwgMHgzNSwgMHgwRCwgMHg0OCwgMHgwQiwgMHhCOCwgMHgwRiwgMHg1MCwgMHgwNywgMHgzRiwgMHg2MCwgMHgwMn19LAorICAgICAgICAgezQsIDU5MCwgIDMyNCwgezB4MzAsIDB4N0EsIDB4NEIsIDB4MEEsIDB4MUMsIDB4MDgsIDB4QjQsIDB4MEUsIDB4NDAsIDB4NEUsIDB4NTIsIDB4NjAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICB9LAorICAgLyogQ0lGICovCisgICB7CisgICAgICAvKiA1IGZwcyAqLworICAgICAgeworICAgICAgICAgezYsIDc3MSwgICAgMCwgezB4MTUsIDB4RjQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4M0YsIDB4ODAsIDB4MDJ9fSwKKyAgICAgICAgIHs0LCA0NjUsIDEyNzgsIHsweDE1LCAweEY0LCAweDA1LCAweDI3LCAweEVFLCAweDI2LCAweDM2LCAweDAzLCAweDE4LCAweEQxLCAweDY1LCAweDgwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjkxLCAgODAwLCB7MHgxNSwgMHhGNCwgMHgxNSwgMHgxOCwgMHhGNCwgMHgxNywgMHgzQywgMHgwNSwgMHgxOCwgMHgyMywgMHhBMSwgMHg4MCwgMHgwMn19LAorICAgICAgICAgezEsIDE5MywgIDUyOCwgezB4MTUsIDB4RjQsIDB4MkQsIDB4MTAsIDB4N0UsIDB4MEUsIDB4QzYsIDB4MEEsIDB4MTgsIDB4QzEsIDB4RjQsIDB4ODAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAxMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDkzMiwgMTI3OCwgezB4MTQsIDB4RjQsIDB4MDUsIDB4MjcsIDB4RUUsIDB4MjYsIDB4MzYsIDB4MDQsIDB4MzAsIDB4QTQsIDB4MzMsIDB4MTAsIDB4MDJ9fSwKKyAgICAgICAgIHs0LCA1OTEsICA4MTIsIHsweDE0LCAweEY0LCAweDE1LCAweDE5LCAweDU2LCAweDE3LCAweDlFLCAweDA2LCAweDI4LCAweDRGLCAweDRFLCAweDEwLCAweDAyfX0sCisgICAgICAgICB7MiwgMjkxLCAgNDAwLCB7MHgxNCwgMHhGNCwgMHgzRCwgMHgwQywgMHg3QSwgMHgwQSwgMHhDMiwgMHgwRSwgMHgyOCwgMHgyMywgMHhBMSwgMHgxMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDE1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU2LCAgODc2LCB7MHgxMywgMHhGNCwgMHgwRCwgMHgxQiwgMHg1OCwgMHgxOSwgMHhBMCwgMHgwNSwgMHgzOCwgMHhCQywgMHgzMywgMHg2MCwgMHgwMn19LAorICAgICAgICAgezUsIDcwMywgIDY0NCwgezB4MTMsIDB4RjQsIDB4MUQsIDB4MTQsIDB4MUMsIDB4MTIsIDB4NjQsIDB4MDgsIDB4MzgsIDB4QkYsIDB4NDIsIDB4NjAsIDB4MDJ9fSwKKyAgICAgICAgIHszLCA0NDgsICA0MTAsIHsweDEzLCAweEY0LCAweDNELCAweDBDLCAweEM0LCAweDBCLCAweDBDLCAweDBFLCAweDM4LCAweEMwLCAweDY5LCAweDYwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMjAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTYsICA2NTAsIHsweDEyLCAweEY0LCAweDFELCAweDE0LCAweDRBLCAweDEyLCAweDkyLCAweDA5LCAweDQ4LCAweEJDLCAweDMzLCAweDEwLCAweDAzfX0sCisgICAgICAgICB7NiwgNzc2LCAgNTI4LCB7MHgxMiwgMHhGNCwgMHgyRCwgMHgxMCwgMHg3RSwgMHgwRSwgMHhDNiwgMHgwQSwgMHg0MCwgMHgwOCwgMHgzRiwgMHgxMCwgMHgwM319LAorICAgICAgICAgezQsIDU5MSwgIDQwMiwgezB4MTIsIDB4RjQsIDB4M0QsIDB4MEMsIDB4OEYsIDB4MEEsIDB4RDcsIDB4MEUsIDB4NDAsIDB4NEYsIDB4NEUsIDB4MTAsIDB4MDN9fSwKKyAgICAgIH0sCisgICAgICAvKiAyNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezksIDk1NiwgIDU0NCwgezB4MTEsIDB4RjQsIDB4MjUsIDB4MTAsIDB4RjQsIDB4MEYsIDB4M0MsIDB4MEEsIDB4NDgsIDB4QkMsIDB4MzMsIDB4QzAsIDB4MDJ9fSwKKyAgICAgICAgIHs3LCA4NDAsICA0NzgsIHsweDExLCAweEY0LCAweDJELCAweDBFLCAweEVCLCAweDBELCAweDMzLCAweDBCLCAweDQ4LCAweDQ4LCAweDNCLCAweEMwLCAweDAyfX0sCisgICAgICAgICB7NSwgNzAzLCAgNDAwLCB7MHgxMSwgMHhGNCwgMHgzRCwgMHgwQywgMHg3QSwgMHgwQSwgMHhDMiwgMHgwRSwgMHg0OCwgMHhCRiwgMHg0MiwgMHhDMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDMwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU2LCAgNDM4LCB7MHgxMCwgMHhGNCwgMHgzNSwgMHgwRCwgMHhBQywgMHgwQiwgMHhGNCwgMHgwRCwgMHg1MCwgMHhCQywgMHgzMywgMHgxMCwgMHgwMn19LAorICAgICAgICAgezcsIDgzOCwgIDM4NCwgezB4MTAsIDB4RjQsIDB4NDUsIDB4MEIsIDB4RkQsIDB4MEEsIDB4NDUsIDB4MEYsIDB4NTAsIDB4NDYsIDB4M0IsIDB4MTAsIDB4MDJ9fSwKKyAgICAgICAgIHs2LCA3NzMsICAzNTQsIHsweDEwLCAweDdBLCAweDRCLCAweDBCLCAweDBDLCAweDA5LCAweDgwLCAweDEwLCAweDUwLCAweDA1LCAweDNGLCAweDEwLCAweDAyfX0sCisgICAgICB9LAorICAgfSwKKyAgIC8qIFZHQSAqLworICAgeworICAgICAgLyogNSBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezYsIDc3MywgMTI3MiwgezB4MUQsIDB4RjQsIDB4MTUsIDB4MjcsIDB4QjYsIDB4MjQsIDB4OTYsIDB4MDIsIDB4MzAsIDB4MDUsIDB4M0YsIDB4MTAsIDB4MDJ9fSwKKyAgICAgICAgIHs0LCA1OTIsICA5NzYsIHsweDFELCAweEY0LCAweDI1LCAweDFFLCAweDc4LCAweDFCLCAweDU4LCAweDAzLCAweDMwLCAweDUwLCAweDRFLCAweDEwLCAweDAyfX0sCisgICAgICAgICB7MywgNDQ4LCAgNzM4LCB7MHgxRCwgMHhGNCwgMHgzRCwgMHgxNywgMHgwQywgMHgxMywgMHhFQywgMHgwNCwgMHgzMCwgMHhDMCwgMHg2OSwgMHgxMCwgMHgwMn19LAorICAgICAgfSwKKyAgICAgIC8qIDEwIGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7OSwgOTU2LCAgNzg4LCB7MHgxQywgMHhGNCwgMHgzNSwgMHgxOCwgMHg5QywgMHgxNSwgMHg3QywgMHgwMywgMHg0OCwgMHhCQywgMHgzMywgMHgxMCwgMHgwMn19LAorICAgICAgICAgezYsIDc3NiwgIDY0MCwgezB4MUMsIDB4N0EsIDB4NTMsIDB4MTMsIDB4RkMsIDB4MTEsIDB4MkMsIDB4MDQsIDB4NDgsIDB4MDgsIDB4M0YsIDB4MTAsIDB4MDJ9fSwKKyAgICAgICAgIHs0LCA1OTIsICA0ODgsIHsweDFDLCAweDdBLCAweDZCLCAweDBGLCAweDNDLCAweDBDLCAweDZDLCAweDA2LCAweDQ4LCAweDUwLCAweDRFLCAweDEwLCAweDAyfX0sCisgICAgICB9LAorICAgICAgLyogMTUgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHs5LCA5NTcsICA1MjYsIHsweDFCLCAweDdBLCAweDYzLCAweDEwLCAweDY4LCAweDBELCAweDk4LCAweDA2LCAweDU4LCAweEJELCAweDMzLCAweDgwLCAweDAyfX0sCisgICAgICAgICB7OSwgOTU3LCAgNTI2LCB7MHgxQiwgMHg3QSwgMHg2MywgMHgxMCwgMHg2OCwgMHgwRCwgMHg5OCwgMHgwNiwgMHg1OCwgMHhCRCwgMHgzMywgMHg4MCwgMHgwMn19LAorICAgICAgICAgezgsIDg5NSwgIDQ5MiwgezB4MUIsIDB4N0EsIDB4NkIsIDB4MEYsIDB4NUQsIDB4MEMsIDB4OEQsIDB4MDYsIDB4NTgsIDB4N0YsIDB4MzcsIDB4ODAsIDB4MDJ9fSwKKyAgICAgIH0sCisgICAgICAvKiAyMCBmcHMgKi8KKyAgICAgIHsKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgfSwKKyAgICAgIC8qIDI1IGZwcyAqLworICAgICAgeworICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICB9LAorICAgICAgLyogMzAgZnBzICovCisgICAgICB7CisgICAgICAgICB7MCwgfSwKKyAgICAgICAgIHswLCB9LAorICAgICAgICAgezAsIH0sCisgICAgICAgICB7MCwgfSwKKyAgICAgIH0sCisgICB9LAorfTsKKworLyoKKyAqIDE2IHZlcnNpb25zOgorICogICAyIHRhYmxlcyAgKG9uZSBmb3IgWSwgYW5kIG9uZSBmb3IgVSZWKQorICogICAxNiBsZXZlbHMgb2YgZGV0YWlscyBwZXIgdGFibGVzCisgKiAgIDggYmxvY3MKKyAqLworCitjb25zdCB1bnNpZ25lZCBpbnQgVGltb25Sb21UYWJsZSBbMTZdWzJdWzE2XVs4XSA9ICAKK3sKKyB7IC8qIHZlcnNpb24gMCAqLworICB7IC8qIHZlcnNpb24gMCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwMSwweDAwMDAwMDAxLDB4MDAwMDAwMDEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwKKyAgICAweDAwMDAwMDAxLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDAxLAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwNDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAwLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwKKyAgICAweDAwMDAwMDAxLDB4MDAwMDAwMDEsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDAxLAorICAgIDB4MDAwMDAwMDEsMHgwMDAwMDAwOSwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwMSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDA0OSwweDAwMDAwMDAxLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDQ5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDEgKi8KKyAgeyAvKiB2ZXJzaW9uIDEsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDAwMDAxLAorICAgIDB4MDAwMDAwMDEsMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDAxLDB4MDAwMDAwMDEsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwMSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDI0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAwMDQ5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDAwNDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAyICovCisgIHsgLyogdmVyc2lvbiAyLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDIsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDI0YSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMDkyOTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMyAqLworICB7IC8qIHZlcnNpb24gMywgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAzLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwMSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5MjkyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDQgKi8KKyAgeyAvKiB2ZXJzaW9uIDQsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gNCwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA1ICovCisgIHsgLyogdmVyc2lvbiA1LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDUsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMTI0ZGIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAxMjRkYiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNiAqLworICB7IC8qIHZlcnNpb24gNiwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAyNWJiNiwweDAwMDI0Yjc3fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA2LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNmRjLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDcgKi8KKyAgeyAvKiB2ZXJzaW9uIDcsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDI0OTZkLDB4MDAwMjViYjYsMHgwMDAyNWJiZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gNywgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWI5MjUsMHgwMDAxYjcyNSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA4ICovCisgIHsgLyogdmVyc2lvbiA4LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDI0Yjc2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMjRiNzYsMHgwMDAyNWJiZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMmVmZmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDgsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDI0OTZkLDB4MDAwMWI5MmQsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gOSAqLworICB7IC8qIHZlcnNpb24gOSwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA5LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyNTIsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDEwICovCisgIHsgLyogdmVyc2lvbiAxMCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiOTI1LDB4MDAwMWI5MmQsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMjQ5NmQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxMCwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5NDkzLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAxMSAqLworICB7IC8qIHZlcnNpb24gMTEsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0OTZkLDB4MDAwMjViYjYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMTEsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjUyLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNGRiLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMTIgKi8KKyAgeyAvKiB2ZXJzaW9uIDEyLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDEyLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDEzICovCisgIHsgLyogdmVyc2lvbiAxMywgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAyNDk2ZX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDI0OTI0LDB4MDAwMjRiNmQsMHgwMDAyZGRiNiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxMywgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjZkYywweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxYjZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAxNCAqLworICB7IC8qIHZlcnNpb24gMTQsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAyNDk2ZX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiOTI0LDB4MDAwMjQ5NmQsMHgwMDAyNGI3NiwweDAwMDI0Yjc3fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMWI2ZGIsCisgICAgMHgwMDAyNDkyNCwweDAwMDJkYjZkLDB4MDAwMzZkYjYsMHgwMDAyZWZmZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMTQsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTM2ZTQsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMzZlNCwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMWI2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMTUgKi8KKyAgeyAvKiB2ZXJzaW9uIDE1LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiOTI0LDB4MDAwMjQ5NmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAyNDk2ZCwweDAwMDI1YmI2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0YjZkLDB4MDAwMjViYjYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMjRiNmQsMHgwMDAyZGRiNiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDFiNmRiLAorICAgIDB4MDAwMjQ5MjQsMHgwMDAyZGI2ZCwweDAwMDM2ZGI2LDB4MDAwMmVmZmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDE1LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxYjcyNCwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjcyNCwweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI3MjQsMHgwMDAxMjRkYiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiOTI1LDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI5MjUsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjkyNSwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiOTI1LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI5MjUsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDFiNmRiLAorICAgIDB4MDAwMjQ5MjQsMHgwMDAyNDk2ZCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLXRpbW9uLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9wd2MvcHdjLXRpbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2YjM3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtdGltb24uaApAQCAtMCwwICsxLDYxIEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKworCisvKiBUaGlzIHRhYmxlcyBjb250YWlucyBlbnRyaWVzIGZvciB0aGUgNjc1LzY4MC82OTAgKFRpbW9uKSBjYW1lcmEsIHdpdGgKKyAgIDQgZGlmZmVyZW50IHF1YWxpdGllcyAobm8gY29tcHJlc3Npb24sIGxvdywgbWVkaXVtLCBoaWdoKS4KKyAgIEl0IGxpc3RzIHRoZSBiYW5kd2lkdGggcmVxdWlyZW1lbnRzIGZvciBzYWlkIG1vZGUgYnkgaXRzIGFsdGVybmF0ZSBpbnRlcmZhY2UKKyAgIG51bWJlci4gQW4gYWx0ZXJuYXRlIG9mIDAgbWVhbnMgdGhhdCB0aGUgbW9kZSBpcyB1bmF2YWlsYWJsZS4KKworICAgVGhlcmUgYXJlIDYgKiA0ICogNCBlbnRyaWVzOgorICAgICA2IGRpZmZlcmVudCByZXNvbHV0aW9ucyBzdWJxY2lmLCBxc2lmLCBxY2lmLCBzaWYsIGNpZiwgdmdhCisgICAgIDYgZnJhbWVyYXRlczogNSwgMTAsIDE1LCAyMCwgMjUsIDMwCisgICAgIDQgY29tcHJlc3Npb24gbW9kaTogbm9uZSwgbG93LCBtZWRpdW0sIGhpZ2gKKworICAgV2hlbiBhbiB1bmNvbXByZXNzZWQgbW9kZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgbmV4dCBhdmFpbGFibGUgY29tcHJlc3NlZCBtb2RlCisgICB3aWxsIGJlIGNob3NlbiAodW5sZXNzIHRoZSBkZWNvbXByZXNzb3IgaXMgYWJzZW50KS4gU29tZXRpbWVzIHRoZXJlIGFyZSBvbmx5CisgICAxIG9yIDIgY29tcHJlc3NlZCBtb2RlcyBhdmFpbGFibGU7IGluIHRoYXQgY2FzZSBlbnRyaWVzIGFyZSBkdXBsaWNhdGVkLgorKi8KKworI2lmbmRlZiBQV0NfVElNT05fSAorI2RlZmluZSBQV0NfVElNT05fSAorCisjaW5jbHVkZSAicHdjLWlvY3RsLmgiCisKK3N0cnVjdCBUaW1vbl90YWJsZV9lbnRyeQoreworCWNoYXIgYWx0ZXJuYXRlOwkJCS8qIFVTQiBhbHRlcm5hdGUgaW50ZXJmYWNlICovCisJdW5zaWduZWQgc2hvcnQgcGFja2V0c2l6ZTsJLyogTm9ybWFsIHBhY2tldCBzaXplICovCisJdW5zaWduZWQgc2hvcnQgYmFuZGxlbmd0aDsJLyogQmFuZGxlbmd0aCB3aGVuIGRlY29tcHJlc3NpbmcgKi8KKwl1bnNpZ25lZCBjaGFyIG1vZGVbMTNdOwkJLyogcHJlY29tcHV0ZWQgbW9kZSBzZXR0aW5ncyBmb3IgY2FtICovCit9OworCitjb25zdCBleHRlcm4gc3RydWN0IFRpbW9uX3RhYmxlX2VudHJ5IFRpbW9uX3RhYmxlW1BTWl9NQVhdWzZdWzRdOworY29uc3QgZXh0ZXJuIHVuc2lnbmVkIGludCBUaW1vblJvbVRhYmxlIFsxNl1bMl1bMTZdWzhdOworCisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtdW5jb21wcmVzcy5jIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy11bmNvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2MmU0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtdW5jb21wcmVzcy5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICBEZWNvbXByZXNzaW9uIGZyb250ZW5kLgorICAgKEMpIDE5OTktMjAwMyBOZW1vc29mdCBVbnYuCisgICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaW5jbHVkZSAicHdjLmgiCisjaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKKyNpbmNsdWRlICJwd2MtZGVjMS5oIgorI2luY2x1ZGUgInB3Yy1kZWMyMy5oIgorCitpbnQgcHdjX2RlY29tcHJlc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWY7CisJaW50IG4sIGxpbmUsIGNvbCwgc3RyaWRlOworCXZvaWQgKnl1diwgKmltYWdlOworCXUxNiAqc3JjOworCXUxNiAqZHN0eSwgKmRzdHUsICpkc3R2OworCisJaWYgKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSAmJiBkZWZpbmVkKFBXQ19NQUdJQykKKwlpZiAocGRldi0+bWFnaWMgIT0gUFdDX01BR0lDKSB7CisJCUVycigicHdjX2RlY29tcHJlc3MoKTogbWFnaWMgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKyNlbmRpZgorCisJZmJ1ZiA9IHBkZXYtPnJlYWRfZnJhbWU7CisJaWYgKGZidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaW1hZ2UgPSBwZGV2LT5pbWFnZV9wdHJbcGRldi0+ZmlsbF9pbWFnZV07CisJaWYgKCFpbWFnZSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl5dXYgPSBmYnVmLT5kYXRhICsgcGRldi0+ZnJhbWVfaGVhZGVyX3NpemU7ICAvKiBTa2lwIGhlYWRlciAqLworCisJLyogUmF3IGZvcm1hdDsgdGhhdCdzIGVhc3kuLi4gKi8KKwlpZiAocGRldi0+dnBhbGV0dGUgPT0gVklERU9fUEFMRVRURV9SQVcpCisJeworCQltZW1jcHkoaW1hZ2UsIHl1diwgcGRldi0+ZnJhbWVfc2l6ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwZGV2LT52YmFuZGxlbmd0aCA9PSAwKSB7CisJCS8qIFVuY29tcHJlc3NlZCBtb2RlLiBXZSBjb3B5IHRoZSBkYXRhIGludG8gdGhlIG91dHB1dCBidWZmZXIsCisJCSAgIHVzaW5nIHRoZSB2aWV3cG9ydCBzaXplICh3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGltYWdlCisJCSAgIHNpemUpLiBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gZG8gYSBiaXQgb2YgYnl0ZSBzdHVmZmluZworCQkgICB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0IGZvcm1hdC9zaXplLgorCQkgKi8KKwkJCS8qCisJCQkgKiBXZSBkbyBzb21lIGJ5dGUgc2h1ZmZsaW5nIGhlcmUgdG8gZ28gZnJvbSB0aGUKKwkJCSAqIG5hdGl2ZSBmb3JtYXQgdG8gWVVWNDIwUC4KKwkJCSAqLworCQkJc3JjID0gKHUxNiAqKXl1djsKKwkJCW4gPSBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3Lnk7CisKKwkJCS8qIG9mZnNldCBpbiBZIHBsYW5lICovCisJCQlzdHJpZGUgPSBwZGV2LT52aWV3LnggKiBwZGV2LT5vZmZzZXQueSArIHBkZXYtPm9mZnNldC54OworCQkJZHN0eSA9ICh1MTYgKikoaW1hZ2UgKyBzdHJpZGUpOworCisJCQkvKiBvZmZzZXRzIGluIFUvViBwbGFuZXMgKi8KKwkJCXN0cmlkZSA9IHBkZXYtPnZpZXcueCAqIHBkZXYtPm9mZnNldC55IC8gNCArIHBkZXYtPm9mZnNldC54IC8gMjsKKwkJCWRzdHUgPSAodTE2ICopKGltYWdlICsgbiArICAgICAgICAgc3RyaWRlKTsKKwkJCWRzdHYgPSAodTE2ICopKGltYWdlICsgbiArIG4gLyA0ICsgc3RyaWRlKTsKKworCQkJLyogaW5jcmVtZW50IGFmdGVyIGVhY2ggbGluZSAqLworCQkJc3RyaWRlID0gKHBkZXYtPnZpZXcueCAtIHBkZXYtPmltYWdlLngpIC8gMjsgLyogdTE2IGlzIDIgYnl0ZXMgKi8KKworCQkJZm9yIChsaW5lID0gMDsgbGluZSA8IHBkZXYtPmltYWdlLnk7IGxpbmUrKykgeworCQkJCWZvciAoY29sID0gMDsgY29sIDwgcGRldi0+aW1hZ2UueDsgY29sICs9IDQpIHsKKwkJCQkJKmRzdHkrKyA9ICpzcmMrKzsKKwkJCQkJKmRzdHkrKyA9ICpzcmMrKzsKKwkJCQkJaWYgKGxpbmUgJiAxKQorCQkJCQkJKmRzdHYrKyA9ICpzcmMrKzsKKwkJCQkJZWxzZQorCQkJCQkJKmRzdHUrKyA9ICpzcmMrKzsKKwkJCQl9CisJCQkJZHN0eSArPSBzdHJpZGU7CisJCQkJaWYgKGxpbmUgJiAxKQorCQkJCQlkc3R2ICs9IChzdHJpZGUgPj4gMSk7CisJCQkJZWxzZQorCQkJCQlkc3R1ICs9IChzdHJpZGUgPj4gMSk7CisJCQl9CisJfQorCWVsc2UgeworCQkvKiBDb21wcmVzc2VkOyB0aGUgZGVjb21wcmVzc29yIHJvdXRpbmVzIHdpbGwgd3JpdGUgdGhlIGRhdGEKKwkJICAgaW4gcGxhbmFyIGZvcm1hdCBpbW1lZGlhdGVseS4KKwkJICovCisJCWludCBmbGFnczsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmbGFncyA9IFBXQ1hfRkxBR19QTEFOQVI7CisgICAgICAgICAgICAgICAgaWYgKHBkZXYtPnZzaXplID09IFBTWl9WR0EgJiYgcGRldi0+dmZyYW1lcyA9PSA1ICYmIHBkZXYtPnZzbmFwc2hvdCkKKwkJIHsKKwkJICAgcHJpbnRrKEtFUk5fRVJSICJwd2M6IE1vZGUgQmF5ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3Igbm93XG4iKTsKKwkJICAgZmxhZ3MgfD0gUFdDWF9GTEFHX0JBWUVSOworCQkgICByZXR1cm4gLUVOWElPOyAvKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzOiBtaXNzaW5nIGRlY29tcHJlc3NvciAqLworCQkgfQorCisJCXN3aXRjaCAocGRldi0+dHlwZSkKKwkJIHsKKwkJICBjYXNlIDY3NToKKwkJICBjYXNlIDY4MDoKKwkJICBjYXNlIDY5MDoKKwkJICBjYXNlIDcyMDoKKwkJICBjYXNlIDczMDoKKwkJICBjYXNlIDc0MDoKKwkJICBjYXNlIDc1MDoKKwkJICAgIHB3Y19kZWMyM19kZWNvbXByZXNzKCZwZGV2LT5pbWFnZSwgJnBkZXYtPnZpZXcsICZwZGV2LT5vZmZzZXQsCisJCQkJeXV2LCBpbWFnZSwKKwkJCQlmbGFncywKKwkJCQlwZGV2LT5kZWNvbXByZXNzX2RhdGEsIHBkZXYtPnZiYW5kbGVuZ3RoKTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgNjQ1OgorCQkgIGNhc2UgNjQ2OgorCQkgICAgLyogVE9ETyAmIEZJWE1FICovCisJCSAgICByZXR1cm4gLUVOWElPOyAvKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzOiBtaXNzaW5nIGRlY29tcHJlc3NvciAqLworCQkgICAgYnJlYWs7CisJCSB9CisJfQorCXJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtdW5jb21wcmVzcy5oIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy11bmNvbXByZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiOTI1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MtdW5jb21wcmVzcy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIChDKSAxOTk5LTIwMDMgTmVtb3NvZnQgVW52LgorICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisvKiBUaGlzIGZpbGUgaXMgdGhlIGJyaWRnZSBiZXR3ZWVuIHRoZSBrZXJuZWwgbW9kdWxlIGFuZCB0aGUgcGx1Z2luOyBpdAorICAgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdXNlZCBpbiBib3RoIG1vZHVsZXMuIEFueQorICAgc2lnbmlmaWNhbnQgY2hhbmdlIHNob3VsZCBiZSByZWZsZWN0ZWQgYnkgaW5jcmVhc2luZyB0aGUgCisgICBwd2NfZGVjb21wcmVzc29yX3ZlcnNpb24gbWFqb3IgbnVtYmVyLgorICovCisjaWZuZGVmIFBXQ19VTkNPTVBSRVNTX0gKKyNkZWZpbmUgUFdDX1VOQ09NUFJFU1NfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlICJwd2MtaW9jdGwuaCIKKworLyogZnJvbSBwd2MtZGVjLmggKi8KKyNkZWZpbmUgUFdDWF9GTEFHX1BMQU5BUiAgICAgICAgMHgwMDAxCisvKiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3B3Yy9wd2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2I1MTZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvcHdjL3B3Yy5oCkBAIC0wLDAgKzEsMjc4IEBACisvKiAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KKyAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorCisgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKKyAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgorICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgorICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCisgICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworI2lmbmRlZiBQV0NfSAorI2RlZmluZSBQV0NfSAorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2luY2x1ZGUgInB3Yy11bmNvbXByZXNzLmgiCisjaW5jbHVkZSAicHdjLWlvY3RsLmgiCisKKy8qIERlZmluZXMgYW5kIHN0cnVjdHVyZXMgZm9yIHRoZSBQaGlsaXBzIHdlYmNhbSAqLworLyogVXNlZCBmb3IgY2hlY2tpbmcgbWVtb3J5IGNvcnJ1cHRpb24vcG9pbnRlciB2YWxpZGF0aW9uICovCisjZGVmaW5lIFBXQ19NQUdJQyAweDg5REMxMEFCVUwKKyN1bmRlZiBQV0NfTUFHSUMKKworLyogVHVybiBzb21lIGRlYnVnZ2luZyBvcHRpb25zIG9uL29mZiAqLworI2RlZmluZSBQV0NfREVCVUcgMAorCisvKiBUcmFjZSBjZXJ0YWluIGFjdGlvbnMgaW4gdGhlIGRyaXZlciAqLworI2RlZmluZSBUUkFDRV9NT0RVTEUJMHgwMDAxCisjZGVmaW5lIFRSQUNFX1BST0JFCTB4MDAwMgorI2RlZmluZSBUUkFDRV9PUEVOCTB4MDAwNAorI2RlZmluZSBUUkFDRV9SRUFECTB4MDAwOAorI2RlZmluZSBUUkFDRV9NRU1PUlkJMHgwMDEwCisjZGVmaW5lIFRSQUNFX0ZMT1cJMHgwMDIwCisjZGVmaW5lIFRSQUNFX1NJWkUJMHgwMDQwCisjZGVmaW5lIFRSQUNFX1BXQ1gJMHgwMDgwCisjZGVmaW5lIFRSQUNFX1NFUVVFTkNFCTB4MTAwMAorCisjZGVmaW5lIFRyYWNlKFIsIEEuLi4pIGlmIChwd2NfdHJhY2UgJiBSKSBwcmludGsoS0VSTl9ERUJVRyBQV0NfTkFNRSAiICIgQSkKKyNkZWZpbmUgRGVidWcoQS4uLikgcHJpbnRrKEtFUk5fREVCVUcgUFdDX05BTUUgIiAiIEEpCisjZGVmaW5lIEluZm8oQS4uLikgIHByaW50ayhLRVJOX0lORk8gIFBXQ19OQU1FICIgIiBBKQorI2RlZmluZSBFcnIoQS4uLikgICBwcmludGsoS0VSTl9FUlIgICBQV0NfTkFNRSAiICIgQSkKKworCisvKiBEZWZpbmVzIGZvciBUb1VDYW0gY2FtZXJhcyAqLworI2RlZmluZSBUT1VDQU1fSEVBREVSX1NJWkUJCTgKKyNkZWZpbmUgVE9VQ0FNX1RSQUlMRVJfU0laRQkJNAorCisjZGVmaW5lIEZFQVRVUkVfTU9UT1JfUEFOVElMVAkJMHgwMDAxCisKKy8qIFZlcnNpb24gYmxvY2sgKi8KKyNkZWZpbmUgUFdDX01BSk9SCTkKKyNkZWZpbmUgUFdDX01JTk9SCTAKKyNkZWZpbmUgUFdDX1ZFUlNJT04gCSI5LjAuMi11bm9mZmljaWFsIgorI2RlZmluZSBQV0NfTkFNRSAJInB3YyIKKworLyogVHVybiBjZXJ0YWluIGZlYXR1cmVzIG9uL29mZiAqLworI2RlZmluZSBQV0NfSU5UX1BJUEUgMAorCisvKiBJZ25vcmUgZXJyb3JzIGluIHRoZSBmaXJzdCBOIGZyYW1lcywgdG8gYWxsb3cgZm9yIHN0YXJ0dXAgZGVsYXlzICovCisjZGVmaW5lIEZSQU1FX0xPV01BUksgNQorCisvKiBTaXplIGFuZCBudW1iZXIgb2YgYnVmZmVycyBmb3IgdGhlIElTTyBwaXBlLiAqLworI2RlZmluZSBNQVhfSVNPX0JVRlMJCTIKKyNkZWZpbmUgSVNPX0ZSQU1FU19QRVJfREVTQwkxMAorI2RlZmluZSBJU09fTUFYX0ZSQU1FX1NJWkUJOTYwCisjZGVmaW5lIElTT19CVUZGRVJfU0laRSAJKElTT19GUkFNRVNfUEVSX0RFU0MgKiBJU09fTUFYX0ZSQU1FX1NJWkUpCisKKy8qIEZyYW1lIGJ1ZmZlcnM6IGNvbnRhaW5zIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkIHZpZGVvIGRhdGEuICovCisjZGVmaW5lIE1BWF9GUkFNRVMJCTUKKy8qIE1heGltdW0gc2l6ZSBhZnRlciBkZWNvbXByZXNzaW9uIGlzIDY0MHg0ODAgWVVWIGRhdGEsIDEuNSAqIDY0MCAqIDQ4MCAqLworI2RlZmluZSBQV0NfRlJBTUVfU0laRSAJCSg0NjA4MDAgKyBUT1VDQU1fSEVBREVSX1NJWkUgKyBUT1VDQU1fVFJBSUxFUl9TSVpFKQorCisvKiBBYnNvbHV0ZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGF2YWlsYWJsZSBmb3IgbW1hcCgpICovCisjZGVmaW5lIE1BWF9JTUFHRVMgCQkxMAorCisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZXMgd2VyZSBiYXNlZCBvbiBjcGlhLmguIFdoeSByZWludmVudCB0aGUgd2hlZWw/IDotKSAqLworc3RydWN0IHB3Y19pc29fYnVmCit7CisJdm9pZCAqZGF0YTsKKwlpbnQgIGxlbmd0aDsKKwlpbnQgIHJlYWQ7CisJc3RydWN0IHVyYiAqdXJiOworfTsKKworLyogaW50ZXJtZWRpYXRlIGJ1ZmZlcnMgd2l0aCByYXcgZGF0YSBmcm9tIHRoZSBVU0IgY2FtICovCitzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZgoreworICAgdm9pZCAqZGF0YTsKKyAgIHZvbGF0aWxlIGludCBmaWxsZWQ7CQkvKiBudW1iZXIgb2YgYnl0ZXMgZmlsbGVkICovCisgICBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqbmV4dDsJLyogbGlzdCAqLworI2lmIFBXQ19ERUJVRworICAgaW50IHNlcXVlbmNlOwkJLyogU2VxdWVuY2UgbnVtYmVyICovCisjZW5kaWYKK307CisKK3N0cnVjdCBwd2NfZGV2aWNlCit7CisgICBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OworI2lmZGVmIFBXQ19NQUdJQworICAgaW50IG1hZ2ljOworI2VuZGlmCisgICAvKiBQb2ludGVyIHRvIG91ciB1c2JfZGV2aWNlICovCisgICBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKyAgIAorICAgaW50IHR5cGU7ICAgICAgICAgICAgICAgICAgICAvKiB0eXBlIG9mIGNhbSAoNjQ1LCA2NDYsIDY3NSwgNjgwLCA2OTAsIDcyMCwgNzMwLCA3NDAsIDc1MCkgKi8KKyAgIGludCByZWxlYXNlOwkJCS8qIHJlbGVhc2UgbnVtYmVyICovCisgICBpbnQgZmVhdHVyZXM7CQkvKiBmZWF0dXJlIGJpdHMgKi8KKyAgIGNoYXIgc2VyaWFsWzMwXTsJCS8qIHNlcmlhbCBudW1iZXIgKHN0cmluZykgKi8KKyAgIGludCBlcnJvcl9zdGF0dXM7CQkvKiBzZXQgd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBjYW0gKHVucGx1Z2dlZCwgVVNCIGVycm9ycykgKi8KKyAgIGludCB1c2JfaW5pdDsJCS8qIHNldCB3aGVuIHRoZSBjYW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgb3ZlciBVU0IgKi8KKworICAgLyoqKiBWaWRlbyBkYXRhICoqKi8KKyAgIGludCB2b3BlbjsJCQkvKiBmbGFnICovCisgICBpbnQgdmVuZHBvaW50OwkJLyogdmlkZW8gaXNvYyBlbmRwb2ludCAqLworICAgaW50IHZjaW50ZXJmYWNlOwkJLyogdmlkZW8gY29udHJvbCBpbnRlcmZhY2UgKi8KKyAgIGludCB2YWx0ZXJuYXRlOwkJLyogYWx0ZXJuYXRlIGludGVyZmFjZSBuZWVkZWQgKi8KKyAgIGludCB2ZnJhbWVzLCB2c2l6ZTsJCS8qIGZyYW1lcy1wZXItc2Vjb25kICYgc2l6ZSAoc2VlIFBTWl8qKSAqLworICAgaW50IHZwYWxldHRlOwkJLyogcGFsZXR0ZTogNDIwUCwgUkFXIG9yIFJHQkJBWUVSICovCisgICBpbnQgdmZyYW1lX2NvdW50OwkJLyogcmVjZWl2ZWQgZnJhbWVzICovCisgICBpbnQgdmZyYW1lc19kdW1wZWQ7IAkJLyogY291bnRlciBmb3IgZHVtcGVkIGZyYW1lcyAqLworICAgaW50IHZmcmFtZXNfZXJyb3I7CQkvKiBmcmFtZXMgcmVjZWl2ZWQgaW4gZXJyb3IgKi8KKyAgIGludCB2bWF4X3BhY2tldF9zaXplOwkvKiBVU0IgbWF4cGFja2V0IHNpemUgKi8KKyAgIGludCB2bGFzdF9wYWNrZXRfc2l6ZTsJLyogZm9yIGZyYW1lIHN5bmNocm9uaXNhdGlvbiAqLworICAgaW50IHZpc29jX2Vycm9yczsJCS8qIG51bWJlciBvZiBjb250aWd1b3VzIElTT0MgZXJyb3JzICovCisgICBpbnQgdmNvbXByZXNzaW9uOwkJLyogZGVzaXJlZCBjb21wcmVzc2lvbiBmYWN0b3IgKi8KKyAgIGludCB2YmFuZGxlbmd0aDsJCS8qIGNvbXByZXNzZWQgYmFuZCBsZW5ndGg7IDAgaXMgdW5jb21wcmVzc2VkICovCisgICBjaGFyIHZzbmFwc2hvdDsJCS8qIHNuYXBzaG90IG1vZGUgKi8KKyAgIGNoYXIgdnN5bmM7CQkJLyogdXNlZCBieSBpc29jIGhhbmRsZXIgKi8KKyAgIGNoYXIgdm1pcnJvcjsJCS8qIGZvciBUb1VDYU0gc2VyaWVzICovCisgICAKKyAgIGludCBjbWRfbGVuOworICAgdW5zaWduZWQgY2hhciBjbWRfYnVmWzEzXTsKKworICAgLyogVGhlIGltYWdlIGFjcXVpc2l0aW9uIHJlcXVpcmVzIDMgdG8gNCBzdGVwczoKKyAgICAgIDEuIGRhdGEgaXMgZ2F0aGVyZWQgaW4gc2hvcnQgcGFja2V0cyBmcm9tIHRoZSBVU0IgY29udHJvbGxlcgorICAgICAgMi4gZGF0YSBpcyBzeW5jaHJvbml6ZWQgYW5kIHBhY2tlZCBpbnRvIGEgZnJhbWUgYnVmZmVyCisgICAgICAzYS4gaW4gY2FzZSBkYXRhIGlzIGNvbXByZXNzZWQsIGRlY29tcHJlc3MgaXQgZGlyZWN0bHkgaW50byBpbWFnZSBidWZmZXIKKyAgICAgIDNiLiBpbiBjYXNlIGRhdGEgaXMgdW5jb21wcmVzc2VkLCBjb3B5IGludG8gaW1hZ2UgYnVmZmVyIHdpdGggdmlld3BvcnQKKyAgICAgIDQuIGRhdGEgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHVzZXIgcHJvY2VzcworCisgICAgICBOb3RlIHRoYXQgTUFYX0lTT19CVUZTICE9IE1BWF9GUkFNRVMgIT0gTUFYX0lNQUdFUy4uLi4KKyAgICAgIFdlIGhhdmUgaW4gZWZmZWN0IGEgYmFjay10by1iYWNrLWRvdWJsZS1idWZmZXIgc3lzdGVtLgorICAgICovCisgICAvKiAxOiBpc29jICovCisgICBzdHJ1Y3QgcHdjX2lzb19idWYgc2J1ZltNQVhfSVNPX0JVRlNdOworICAgY2hhciBpc29faW5pdDsKKworICAgLyogMjogZnJhbWUgKi8KKyAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmOwkvKiBhbGwgZnJhbWVzICovCisgICBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZW1wdHlfZnJhbWVzLCAqZW1wdHlfZnJhbWVzX3RhaWw7CS8qIGFsbCBlbXB0eSBmcmFtZXMgKi8KKyAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmdWxsX2ZyYW1lcywgKmZ1bGxfZnJhbWVzX3RhaWw7CS8qIGFsbCBmaWxsZWQgZnJhbWVzICovCisgICBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmlsbF9mcmFtZTsJLyogZnJhbWUgY3VycmVudGx5IGJlaW5nIGZpbGxlZCAqLworICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKnJlYWRfZnJhbWU7CS8qIGZyYW1lIGN1cnJlbnRseSByZWFkIGJ5IHVzZXIgcHJvY2VzcyAqLworICAgaW50IGZyYW1lX2hlYWRlcl9zaXplLCBmcmFtZV90cmFpbGVyX3NpemU7CisgICBpbnQgZnJhbWVfc2l6ZTsKKyAgIGludCBmcmFtZV90b3RhbF9zaXplOyAvKiBpbmNsdWRpbmcgaGVhZGVyICYgdHJhaWxlciAqLworICAgaW50IGRyb3BfZnJhbWVzOworI2lmIFBXQ19ERUJVRworICAgaW50IHNlcXVlbmNlOwkJCS8qIERlYnVnZ2luZyBhaWQgKi8KKyNlbmRpZgorCisgICAvKiAzOiBkZWNvbXByZXNzaW9uICovCisgICBzdHJ1Y3QgcHdjX2RlY29tcHJlc3NvciAqZGVjb21wcmVzc29yOwkvKiBmdW5jdGlvbiBibG9jayB3aXRoIGRlY29tcHJlc3Npb24gcm91dGluZXMgKi8KKyAgIHZvaWQgKmRlY29tcHJlc3NfZGF0YTsJCS8qIHByaXZhdGUgZGF0YSBmb3IgZGVjb21wcmVzc2lvbiBlbmdpbmUgKi8KKworICAgLyogNDogaW1hZ2UgKi8KKyAgIC8qIFdlIGhhdmUgYW4gJ2ltYWdlJyBhbmQgYSAndmlldycsIHdoZXJlICdpbWFnZScgaXMgdGhlIGZpeGVkLXNpemUgaW1hZ2UKKyAgICAgIGFzIGRlbGl2ZXJlZCBieSB0aGUgY2FtZXJhLCBhbmQgJ3ZpZXcnIGlzIHRoZSBzaXplIHJlcXVlc3RlZCBieSB0aGUKKyAgICAgIHByb2dyYW0uIFRoZSBjYW1lcmEgaW1hZ2UgaXMgY2VudGVyZWQgaW4gdGhpcyB2aWV3cG9ydCwgbGFjZWQgd2l0aAorICAgICAgYSBncmF5IG9yIGJsYWNrIGJvcmRlci4gdmlld19taW4gPD0gaW1hZ2UgPD0gdmlldyA8PSB2aWV3X21heDsKKyAgICAqLworICAgaW50IGltYWdlX21hc2s7CQkJLyogYml0bWFzayBvZiBzdXBwb3J0ZWQgc2l6ZXMgKi8KKyAgIHN0cnVjdCBwd2NfY29vcmQgdmlld19taW4sIHZpZXdfbWF4OwkvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIHZpZXdhYmxlIHNpemVzICovCisgICBzdHJ1Y3QgcHdjX2Nvb3JkIGFic19tYXg7ICAgICAgICAgICAgLyogbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZSB3aXRoIGNvbXByZXNzaW9uICovCisgICBzdHJ1Y3QgcHdjX2Nvb3JkIGltYWdlLCB2aWV3OwkvKiBpbWFnZSBhbmQgdmlld3BvcnQgc2l6ZSAqLworICAgc3RydWN0IHB3Y19jb29yZCBvZmZzZXQ7CQkvKiBvZmZzZXQgd2l0aGluIHRoZSB2aWV3cG9ydCAqLworCisgICB2b2lkICppbWFnZV9kYXRhOwkJCS8qIHRvdGFsIGJ1ZmZlciwgd2hpY2ggaXMgc3ViZGl2aWRlZCBpbnRvIC4uLiAqLworICAgdm9pZCAqaW1hZ2VfcHRyW01BWF9JTUFHRVNdOwkJLyogLi4uc2V2ZXJhbCBpbWFnZXMuLi4gKi8KKyAgIGludCBmaWxsX2ltYWdlOwkJCS8qIC4uLndoaWNoIGFyZSByb3RhdGVkLiAqLworICAgaW50IGxlbl9wZXJfaW1hZ2U7CQkJLyogbGVuZ3RoIHBlciBpbWFnZSAqLworICAgaW50IGltYWdlX3JlYWRfcG9zOwkJCS8qIEluIGNhc2Ugd2UgcmVhZCBkYXRhIGluIHBpZWNlcywga2VlcCB0cmFjayBvZiB3ZXJlIHdlIGFyZSBpbiB0aGUgaW1hZ2VidWZmZXIgKi8KKyAgIGludCBpbWFnZV91c2VkW01BWF9JTUFHRVNdOwkJLyogRm9yIE1DQVBUVVJFIGFuZCBTWU5DICovCisKKyAgIHN0cnVjdCBzZW1hcGhvcmUgbW9kbG9jazsJCS8qIHRvIHByZXZlbnQgcmFjZXMgaW4gdmlkZW9fb3BlbigpLCBldGMgKi8KKyAgIHNwaW5sb2NrX3QgcHRybG9jazsJCQkvKiBmb3IgbWFuaXB1bGF0aW5nIHRoZSBidWZmZXIgcG9pbnRlcnMgKi8KKworICAgLyoqKiBtb3Rvcml6ZWQgcGFuL3RpbHQgZmVhdHVyZSAqLworICAgc3RydWN0IHB3Y19tcHRfcmFuZ2UgYW5nbGVfcmFuZ2U7CisgICBpbnQgcGFuX2FuZ2xlOwkJCS8qIGluIGRlZ3JlZXMgKiAxMDAgKi8KKyAgIGludCB0aWx0X2FuZ2xlOwkJCS8qIGFic29sdXRlIGFuZ2xlOyAwLDAgaXMgaG9tZSBwb3NpdGlvbiAqLworCisgICAvKioqIE1pc2MuIGRhdGEgKioqLworICAgd2FpdF9xdWV1ZV9oZWFkX3QgZnJhbWVxOwkJLyogV2hlbiB3YWl0aW5nIGZvciBhIGZyYW1lIHRvIGZpbmlzaC4uLiAqLworI2lmIFBXQ19JTlRfUElQRQorICAgdm9pZCAqdXNiX2ludF9oYW5kbGVyOwkJLyogZm9yIHRoZSBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KKyNlbmRpZgorfTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEdsb2JhbCB2YXJpYWJsZXMgKi8KK2V4dGVybiBpbnQgcHdjX3RyYWNlOworZXh0ZXJuIGludCBwd2NfcHJlZmVycmVkX2NvbXByZXNzaW9uOworCisvKiogZnVuY3Rpb25zIGluIHB3Yy1pZi5jICovCitpbnQgcHdjX3RyeV92aWRlb19tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuZXdfZnBzLCBpbnQgbmV3X2NvbXByZXNzaW9uLCBpbnQgbmV3X3NuYXBzaG90KTsKKworLyoqIEZ1bmN0aW9ucyBpbiBwd2MtbWlzYy5jICovCisvKiBzaXplcyBpbiBwaXhlbHMgKi8KK2V4dGVybiBzdHJ1Y3QgcHdjX2Nvb3JkIHB3Y19pbWFnZV9zaXplc1tQU1pfTUFYXTsKKworaW50IHB3Y19kZWNvZGVfc2l6ZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK3ZvaWQgcHdjX2NvbnN0cnVjdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CisKKy8qKiBGdW5jdGlvbnMgaW4gcHdjLWN0cmwuYyAqLworLyogUmVxdWVzdCBhIGNlcnRhaW4gdmlkZW8gbW9kZS4gUmV0dXJucyA8IDAgaWYgbm90IHBvc3NpYmxlICovCitleHRlcm4gaW50IHB3Y19zZXRfdmlkZW9fbW9kZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZnJhbWVzLCBpbnQgY29tcHJlc3Npb24sIGludCBzbmFwc2hvdCk7CisvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgaW1hZ2UgKG5vdCBmcmFtZSkgKi8KK2V4dGVybiB2b2lkIHB3Y19zZXRfaW1hZ2VfYnVmZmVyX3NpemUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOworCisvKiBWYXJpb3VzIGNvbnRyb2xzOyBzaG91bGQgYmUgb2J2aW91cy4gVmFsdWUgMC4uNjU1MzUsIG9yIDwgMCBvbiBlcnJvciAqLworZXh0ZXJuIGludCBwd2NfZ2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOworZXh0ZXJuIGludCBwd2Nfc2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7CitleHRlcm4gaW50IHB3Y19nZXRfY29udHJhc3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOworZXh0ZXJuIGludCBwd2Nfc2V0X2NvbnRyYXN0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpOworZXh0ZXJuIGludCBwd2NfZ2V0X2dhbW1hKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKK2V4dGVybiBpbnQgcHdjX3NldF9nYW1tYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9zYXR1cmF0aW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKK2V4dGVybiBpbnQgcHdjX3NldF9zYXR1cmF0aW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpOworZXh0ZXJuIGludCBwd2Nfc2V0X2xlZHMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBvbl92YWx1ZSwgaW50IG9mZl92YWx1ZSk7CitleHRlcm4gaW50IHB3Y19nZXRfbGVkcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpvbl92YWx1ZSwgaW50ICpvZmZfdmFsdWUpOworZXh0ZXJuIGludCBwd2NfZ2V0X2Ntb3Nfc2Vuc29yKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnNlbnNvcik7CisKKy8qIFBvd2VyIGRvd24gb3IgdXAgdGhlIGNhbWVyYTsgbm90IHN1cHBvcnRlZCBieSBhbGwgbW9kZWxzICovCitleHRlcm4gaW50IHB3Y19jYW1lcmFfcG93ZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwb3dlcik7CisKKy8qIFByaXZhdGUgaW9jdGwoKXM7IHNlZSBwd2MtaW9jdGwuaCAqLworZXh0ZXJuIGludCBwd2NfaW9jdGwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CisKKworLyoqIHB3Yy11bmNvbXByZXNzLmMgKi8KKy8qIEV4cGFuZCBmcmFtZSB0byBpbWFnZSwgcG9zc2libHkgaW5jbHVkaW5nIGRlY29tcHJlc3Npb24uIFVzZXMgcmVhZF9mcmFtZSBhbmQgZmlsbF9pbWFnZSAqLworZXh0ZXJuIGludCBwd2NfZGVjb21wcmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zZTQwMS5jIGIvZHJpdmVycy91c2IvbWVkaWEvc2U0MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODViZGFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc2U0MDEuYwpAQCAtMCwwICsxLDE0MzYgQEAKKy8qCisgKiBFbmRwb2ludHMgKGZvcm1lcmx5IGtub3duIGFzIEFPWCkgc2U0MDEgVVNCIENhbWVyYSBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgSmVyb2VuIEIuIFZyZWVrZW4gKHBlMXJ4cUBhbXNhdC5vcmcpCisgKgorICogU3RpbGwgc29tZXdoYXQgYmFzZWQgb24gdGhlIExpbnV4IG92NTExIGRyaXZlci4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqIFRoYW5rcyB0byBFbmRwb2ludHMgSW5jLiAod3d3LmVuZHBvaW50cy5jb20pIGZvciBtYWtpbmcgZG9jdW1lbnRhdGlvbiBvbgorICogdGhlaXIgY2hpcHNldCBhdmFpbGFibGUgYW5kIHN1cHBvcnRpbmcgbWUgd2hpbGUgd3JpdGluZyB0aGlzIGRyaXZlci4KKyAqIAktIEplcm9lbiBWcmVla2VuCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gIjAuMjQiOworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgInNlNDAxLmgiCisKK3N0YXRpYyBpbnQgZmxpY2tlcmxlc3M9MDsKK3N0YXRpYyBpbnQgdmlkZW9fbnIgPSAtMTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHgwM2U4LCAweDAwMDQpIH0sLyogRW5kcG9pbnRzL0FveCBTRTQwMSAqLworCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMwYikgfSwvKiBQaGlsaXBzIFBDVkM2NjVLICovCisJeyBVU0JfREVWSUNFKDB4MDQ3ZCwgMHg1MDAxKSB9LC8qIEtlbnNpbmd0b24gNjcwMTQgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDdkLCAweDUwMDIpIH0sLyogS2Vuc2luZ3RvbiA2NzAxKDUvNykgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDdkLCAweDUwMDMpIH0sLyogS2Vuc2luZ3RvbiA2NzAxNiAqLworCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRldmljZV90YWJsZSk7CisKK01PRFVMRV9BVVRIT1IoIkplcm9lbiBWcmVla2VuIDxwZTFyeHFAYW1zYXQub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTRTQwMSBVU0IgQ2FtZXJhIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKGZsaWNrZXJsZXNzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmbGlja2VybGVzcywgIk5ldCBmcmVxdWVuY3kgdG8gYWRqdXN0IGV4cG9zdXJlIHRpbWUgdG8gKDAvNTAvNjApIik7Cittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzZTQwMV9kcml2ZXI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNZW1vcnkgbWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgKnJ2bWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl2b2lkICptZW07CisJdW5zaWduZWQgbG9uZyBhZHI7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwltZW0gPSB2bWFsbG9jXzMyKHNpemUpOworCWlmICghbWVtKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChtZW0sIDAsIHNpemUpOyAvKiBDbGVhciB0aGUgcmFtIG91dCwgbm8ganVuayB0byB0aGUgdXNlciAqLworCWFkciA9ICh1bnNpZ25lZCBsb25nKSBtZW07CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCVNldFBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJYWRyICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCisJcmV0dXJuIG1lbTsKK30KKworc3RhdGljIHZvaWQgcnZmcmVlKHZvaWQgKm1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJaWYgKCFtZW0pCisJCXJldHVybjsKKworCWFkciA9ICh1bnNpZ25lZCBsb25nKSBtZW07CisJd2hpbGUgKChsb25nKSBzaXplID4gMCkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJYWRyICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCXZmcmVlKG1lbSk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHNlNDAxIHJlZ2lzdGVyIHJlYWQvd3JpdGUgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzZTQwMV9zbmRjdHJsKGludCBzZXQsIHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxLCB1bnNpZ25lZCBzaG9ydCByZXEsCisJCQkgdW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGNoYXIgKmNwLCBpbnQgc2l6ZSkKK3sKKwlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnICgKKyAgICAgICAgICAgICAgICBzZTQwMS0+ZGV2LAorICAgICAgICAgICAgICAgIHNldCA/IHVzYl9zbmRjdHJscGlwZShzZTQwMS0+ZGV2LCAwKSA6IHVzYl9yY3ZjdHJscGlwZShzZTQwMS0+ZGV2LCAwKSwKKyAgICAgICAgICAgICAgICByZXEsCisgICAgICAgICAgICAgICAgKHNldCA/IFVTQl9ESVJfT1VUIDogVVNCX0RJUl9JTikgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgY3AsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAxMDAwCisgICAgICAgICk7Cit9CisKK3N0YXRpYyBpbnQgc2U0MDFfc2V0X2ZlYXR1cmUoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIHVuc2lnbmVkIHNob3J0IHNlbGVjdG9yLAorCQkJICAgICB1bnNpZ25lZCBzaG9ydCBwYXJhbSkKK3sKKwkvKiBzcGVjcyBzYXkgdGhhdCB0aGUgc2VsZWN0b3IgKGFkZHJlc3MpIHNob3VsZCBnbyBpbiB0aGUgdmFsdWUgZmllbGQKKwkgICBhbmQgdGhlIHBhcmFtIGluIGluZGV4LCBidXQgaW4gdGhlIGxvZ3Mgb2YgdGhlIHdpbmRvd3MgZHJpdmVyIHRoZXkgZG8KKwkgICB0aGlzIHRoZSBvdGhlciB3YXkgYXJvdW5kLi4uCisJICovCisJcmV0dXJuIHVzYl9jb250cm9sX21zZyAoCisJCXNlNDAxLT5kZXYsCisJCXVzYl9zbmRjdHJscGlwZShzZTQwMS0+ZGV2LCAwKSwKKwkJU0U0MDFfUkVRX1NFVF9FWFRfRkVBVFVSRSwKKwkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQlwYXJhbSwKKwkJc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIDEwMDAKKyAgICAgICAgKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNlNDAxX2dldF9mZWF0dXJlKHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxLCAKKwkJCQkgICAgICAgIHVuc2lnbmVkIHNob3J0IHNlbGVjdG9yKQoreworCS8qIEZvciAnc2V0JyB0aGUgc2VsZWNldG9yIHNob3VsZCBiZSBpbiBpbmRleCwgbm90IHN1cmUgaWYgdGhlIHNwZWMgaXMKKwkgICB3cm9uZyBoZXJlIHRvLi4uLgorCSAqLworCXVuc2lnbmVkIGNoYXIgY3BbMl07CisgICAgICAgIHVzYl9jb250cm9sX21zZyAoCisgICAgICAgICAgICAgICAgc2U0MDEtPmRldiwKKyAgICAgICAgICAgICAgICB1c2JfcmN2Y3RybHBpcGUoc2U0MDEtPmRldiwgMCksCisgICAgICAgICAgICAgICAgU0U0MDFfUkVRX0dFVF9FWFRfRkVBVFVSRSwKKyAgICAgICAgICAgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisgICAgICAgIAkwLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgIGNwLAorICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgMTAwMAorICAgICAgICApOworCXJldHVybiBjcFswXStjcFsxXSoyNTY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2FtZXJhIGNvbnRyb2wKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgc2U0MDFfc2VuZF9waWN0KHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxKQoreworCXNlNDAxX3NldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX1RJVEwsIHNlNDAxLT5leHBvc2VfbCk7LyogaW50ZWdyYXRpb24gdGltZSBsb3cgKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19USVRNLCBzZTQwMS0+ZXhwb3NlX20pOy8qIGludGVncmF0aW9uIHRpbWUgbWlkICovCisJc2U0MDFfc2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfVElUVSwgc2U0MDEtPmV4cG9zZV9oKTsvKiBpbnRlZ3JhdGlvbiB0aW1lIG1pZCAqLworCXNlNDAxX3NldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX0FSTFYsIHNlNDAxLT5yZXNldGxldmVsKTsvKiByZXNldCBsZXZlbCB2YWx1ZSAqLworCXNlNDAxX3NldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX0FSQ0csIHNlNDAxLT5yZ2Fpbik7LyogcmVkIGNvbG9yIGdhaW4gKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19BR0NHLCBzZTQwMS0+Z2dhaW4pOy8qIGdyZWVuIGNvbG9yIGdhaW4gKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19BQkNHLCBzZTQwMS0+YmdhaW4pOy8qIGJsdWUgY29sb3IgZ2FpbiAqLworCSAgICAJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlNDAxX3NldF9leHBvc3VyZShzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSwgaW50IGJyaWdodG5lc3MpCit7CisJaW50IGludGVncmF0aW9uPWJyaWdodG5lc3M8PDU7CisJCisJaWYgKGZsaWNrZXJsZXNzPT01MCkgeworCQlpbnRlZ3JhdGlvbj1pbnRlZ3JhdGlvbi1pbnRlZ3JhdGlvbiUxMDY2Njc7CisJfQorCWlmIChmbGlja2VybGVzcz09NjApIHsKKwkJaW50ZWdyYXRpb249aW50ZWdyYXRpb24taW50ZWdyYXRpb24lODg4ODk7CisJfQorCXNlNDAxLT5icmlnaHRuZXNzPWludGVncmF0aW9uPj41OworCXNlNDAxLT5leHBvc2VfaD0oaW50ZWdyYXRpb24+PjE2KSYweGZmOworCXNlNDAxLT5leHBvc2VfbT0oaW50ZWdyYXRpb24+PjgpJjB4ZmY7CisJc2U0MDEtPmV4cG9zZV9sPWludGVncmF0aW9uJjB4ZmY7Cit9CisKK3N0YXRpYyBpbnQgc2U0MDFfZ2V0X3BpY3Qoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIHN0cnVjdCB2aWRlb19waWN0dXJlICpwKQoreworCXAtPmJyaWdodG5lc3M9c2U0MDEtPmJyaWdodG5lc3M7CisJaWYgKHNlNDAxLT5lbmhhbmNlKSB7CisJCXAtPndoaXRlbmVzcz0zMjc2ODsKKwl9IGVsc2UgeworCQlwLT53aGl0ZW5lc3M9MDsKKwl9CisJcC0+Y29sb3VyPTY1NTM1OworCXAtPmNvbnRyYXN0PTY1NTM1OworCXAtPmh1ZT1zZTQwMS0+cmdhaW48PDEwOworCXAtPnBhbGV0dGU9c2U0MDEtPnBhbGV0dGU7CisJcC0+ZGVwdGg9MzsgLyogcmdiMjQgKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNlNDAxX3NldF9waWN0KHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxLCBzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCkKK3sKKwlpZiAocC0+cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JHQjI0KQorCQlyZXR1cm4gMTsKKwlzZTQwMS0+cGFsZXR0ZT1wLT5wYWxldHRlOworCWlmIChwLT5odWUhPXNlNDAxLT5odWUpIHsKKwkJc2U0MDEtPnJnYWluPSBwLT5odWU+PjEwOworCQlzZTQwMS0+YmdhaW49IDB4NDAtKHAtPmh1ZT4+MTApOworCQlzZTQwMS0+aHVlPXAtPmh1ZTsKKwl9CisJaWYgKHAtPmJyaWdodG5lc3MhPXNlNDAxLT5icmlnaHRuZXNzKSB7CisJCXNlNDAxX3NldF9leHBvc3VyZShzZTQwMSwgcC0+YnJpZ2h0bmVzcyk7CisJfQorCWlmIChwLT53aGl0ZW5lc3M+PTMyNzY4KSB7CisJCXNlNDAxLT5lbmhhbmNlPTE7CisJfSBlbHNlIHsKKwkJc2U0MDEtPmVuaGFuY2U9MDsKKwl9CisJc2U0MDFfc2VuZF9waWN0KHNlNDAxKTsKKwlzZTQwMV9zZW5kX3BpY3Qoc2U0MDEpOworCXJldHVybiAwOworfQorCisvKgorCUh5dW5kYWkgaGF2ZSBzb21lIHJlYWxseSBuaWNlIGRvY3MgYWJvdXQgdGhpcyBhbmQgb3RoZXIgc2Vuc29yIHJlbGF0ZWQKKwlzdHVmZiBvbiB0aGVpciBob21lcGFnZTogd3d3LmhlaS5jby5rcgorKi8KK3N0YXRpYyB2b2lkIHNlNDAxX2F1dG9fcmVzZXRsZXZlbChzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSkKK3sKKwl1bnNpZ25lZCBpbnQgYWhyYywgYWxyYzsKKwlpbnQgb2xkcmVzZXQ9c2U0MDEtPnJlc2V0bGV2ZWw7CisKKwkvKiBGb3Igc29tZSByZWFzb24gdGhpcyBub3JtYWxseSByZWFkLW9ubHkgcmVnaXN0ZXIgZG9lc24ndCBnZXQgcmVzZXQKKwkgICB0byB6ZXJvIGFmdGVyIHJlYWRpbmcgdGhlbSBqdXN0IG9uY2UuLi4KKwkgKi8KKwlzZTQwMV9nZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19ISVJFRk5PSCk7IAorCXNlNDAxX2dldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX0hJUkVGTk9MKTsKKwlzZTQwMV9nZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19MT1JFRk5PSCk7CisJc2U0MDFfZ2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfTE9SRUZOT0wpOworCWFocmM9MjU2KnNlNDAxX2dldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX0hJUkVGTk9IKSArIAorCSAgICBzZTQwMV9nZXRfZmVhdHVyZShzZTQwMSwgSFY3MTMxX1JFR19ISVJFRk5PTCk7CisJYWxyYz0yNTYqc2U0MDFfZ2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfTE9SRUZOT0gpICsKKwkgICAgc2U0MDFfZ2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfTE9SRUZOT0wpOworCisJLyogTm90IGFuIGV4YWN0IHNjaWVuY2UsIGJ1dCBpdCBzZWVtcyB0byB3b3JrIHByZXR0eSB3ZWxsLi4uICovCisJaWYgKGFscmMgPiAxMCkgeworCQl3aGlsZSAoYWxyYz49MTAgJiYgc2U0MDEtPnJlc2V0bGV2ZWwgPCA2MykgeworCQkJc2U0MDEtPnJlc2V0bGV2ZWwrKzsKKwkJCWFscmMgLz0yOworCQl9CisJfSBlbHNlIGlmIChhaHJjID4gMjApIHsKKwkJd2hpbGUgKGFocmM+PTIwICYmIHNlNDAxLT5yZXNldGxldmVsID4gMCkgeworCQkJc2U0MDEtPnJlc2V0bGV2ZWwtLTsKKwkJCWFocmMgLz0yOworCQl9CisJfQorCWlmIChzZTQwMS0+cmVzZXRsZXZlbCE9b2xkcmVzZXQpCisJCXNlNDAxX3NldF9mZWF0dXJlKHNlNDAxLCBIVjcxMzFfUkVHX0FSTFYsIHNlNDAxLT5yZXNldGxldmVsKTsKKworCXJldHVybjsKK30KKworLyogaXJxIGhhbmRsZXIgZm9yIHNuYXBzaG90IGJ1dHRvbiAqLworc3RhdGljIHZvaWQgc2U0MDFfYnV0dG9uX2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxID0gdXJiLT5jb250ZXh0OworCWludCBzdGF0dXM7CisJCisJaWYgKCFzZTQwMS0+ZGV2KSB7CisJCWluZm8oIm9ob2g6IGRldmljZSB2YXBvdXJpc2hlZCIpOworCQlyZXR1cm47CisJfQorCQorCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+PTIpIHsKKwkJaWYgKHNlNDAxLT5idXR0b24pCisJCQlzZTQwMS0+YnV0dG9ucHJlc3NlZD0xOworCX0KK2V4aXQ6CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YXR1cykKKwkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAorCQkgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgc2U0MDFfdmlkZW9faXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEgPSB1cmItPmNvbnRleHQ7CisJaW50IGxlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKworCS8qIG9ob2guLi4gKi8KKwlpZiAoIXNlNDAxLT5zdHJlYW1pbmcpCisJCXJldHVybjsKKworCWlmICghc2U0MDEtPmRldikgeworCQlpbmZvICgib2hvaDogZGV2aWNlIHZhcG91cmlzaGVkIik7CisJCXJldHVybjsKKwl9CisKKwkvKiAwIHNpemVkIHBhY2tldHMgaGFwcGVuIGlmIHdlIGFyZSB0byBmYXN0LCBidXQgc29tZXRpbWVzIHRoZSBjYW1lcmEKKwkgICBrZWVwcyBzZW5kaW5nIHRoZW0gZm9yZXZlci4uLgorCSAqLworCWlmIChsZW5ndGggJiYgIXVyYi0+c3RhdHVzKSB7CisJCXNlNDAxLT5udWxscGFja2V0cz0wOworCQlzd2l0Y2goc2U0MDEtPnNjcmF0Y2hbc2U0MDEtPnNjcmF0Y2hfbmV4dF0uc3RhdGUpIHsKKwkJCWNhc2UgQlVGRkVSX1JFQURZOgorCQkJY2FzZSBCVUZGRVJfQlVTWTogeworCQkJCXNlNDAxLT5kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEJVRkZFUl9VTlVTRUQ6IHsKKwkJCQltZW1jcHkoc2U0MDEtPnNjcmF0Y2hbc2U0MDEtPnNjcmF0Y2hfbmV4dF0uZGF0YSwgKHVuc2lnbmVkIGNoYXIgKil1cmItPnRyYW5zZmVyX2J1ZmZlciwgbGVuZ3RoKTsKKwkJCQlzZTQwMS0+c2NyYXRjaFtzZTQwMS0+c2NyYXRjaF9uZXh0XS5zdGF0ZT1CVUZGRVJfUkVBRFk7CisJCQkJc2U0MDEtPnNjcmF0Y2hbc2U0MDEtPnNjcmF0Y2hfbmV4dF0ub2Zmc2V0PXNlNDAxLT5iYXllcm9mZnNldDsKKwkJCQlzZTQwMS0+c2NyYXRjaFtzZTQwMS0+c2NyYXRjaF9uZXh0XS5sZW5ndGg9bGVuZ3RoOworCQkJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZzZTQwMS0+d3EpKSB7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2U0MDEtPndxKTsKKwkJCQl9CisJCQkJc2U0MDEtPnNjcmF0Y2hfb3ZlcmZsb3c9MDsKKwkJCQlzZTQwMS0+c2NyYXRjaF9uZXh0Kys7CisJCQkJaWYgKHNlNDAxLT5zY3JhdGNoX25leHQ+PVNFNDAxX05VTVNDUkFUQ0gpCisJCQkJCXNlNDAxLT5zY3JhdGNoX25leHQ9MDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlzZTQwMS0+YmF5ZXJvZmZzZXQrPWxlbmd0aDsKKwkJaWYgKHNlNDAxLT5iYXllcm9mZnNldD49c2U0MDEtPmNoZWlnaHQqc2U0MDEtPmN3aWR0aCkgeworCQkJc2U0MDEtPmJheWVyb2Zmc2V0PTA7CisJCX0KKwl9IGVsc2UgeworCQlzZTQwMS0+bnVsbHBhY2tldHMrKzsKKwkJaWYgKHNlNDAxLT5udWxscGFja2V0cyA+IFNFNDAxX01BWF9OVUxMUEFDS0VUUykgeworCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnNlNDAxLT53cSkpIHsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlNDAxLT53cSk7CisJCQl9CQkKKwkJfQorCX0KKworCS8qIFJlc3VibWl0IHVyYiBmb3IgbmV3IGRhdGEgKi8KKwl1cmItPnN0YXR1cz0wOworCXVyYi0+ZGV2PXNlNDAxLT5kZXY7CisJaWYodXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKSkKKwkJaW5mbygidXJiIGJ1cm5lZCBkb3duIik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBzZTQwMV9zZW5kX3NpemUoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlpbnQgaT0wOworCWludCBtb2RlPTB4MDM7IC8qIE5vIGNvbXByZXNzaW9uICovCisJaW50IHNlbmRoZWlnaHQ9aGVpZ2h0OworCWludCBzZW5kd2lkdGg9d2lkdGg7CisKKwkvKiBKYW5nR3UgY29tcHJlc3Npb24gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBjYW1lcmEgc3VwcG9ydGVkIHNpemVzLAorCSAgIGJ1dCBiYXllciBzZWVtcyB0byB3b3JrIHdpdGggYW55IHNpemUgdGhhdCBmaXRzIG9uIHRoZSBzZW5zb3IuCisJICAgV2UgY2hlY2sgaWYgd2UgY2FuIHVzZSBjb21wcmVzc2lvbiB3aXRoIHRoZSBjdXJyZW50IHNpemUgd2l0aCBlaXRoZXIKKwkgICA0IG9yIDE2IHRpbWVzIHN1YmNhcHR1cmluZywgaWYgbm90IHdlIHVzZSB1bmNvbXByZXNzZWQgYmF5ZXIgZGF0YQorCSAgIGJ1dCB0aGlzIHdpbGwgcmVzdWx0IGluIGN1dG91dHMgb2YgdGhlIG1heGltdW0gc2l6ZS4uLi4KKwkgKi8KKwl3aGlsZSAoaTxzZTQwMS0+c2l6ZXMgJiYgIShzZTQwMS0+d2lkdGhbaV09PXdpZHRoICYmIHNlNDAxLT5oZWlnaHRbaV09PWhlaWdodCkpCisJCWkrKzsKKwl3aGlsZSAoaTxzZTQwMS0+c2l6ZXMpIHsKKwkJaWYgKHNlNDAxLT53aWR0aFtpXT09d2lkdGgqMiAmJiBzZTQwMS0+aGVpZ2h0W2ldPT1oZWlnaHQqMikgeworCQkJc2VuZGhlaWdodD1zZTQwMS0+aGVpZ2h0W2ldOworCQkJc2VuZHdpZHRoPXNlNDAxLT53aWR0aFtpXTsKKwkJCW1vZGU9MHg0MDsKKwkJfQorCQlpZiAoc2U0MDEtPndpZHRoW2ldPT13aWR0aCo0ICYmIHNlNDAxLT5oZWlnaHRbaV09PWhlaWdodCo0KSB7CisJCQlzZW5kaGVpZ2h0PXNlNDAxLT5oZWlnaHRbaV07CisJCQlzZW5kd2lkdGg9c2U0MDEtPndpZHRoW2ldOworCQkJbW9kZT0weDQyOworCQl9CisJCWkrKzsKKwl9CisKKwlzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfU0VUX1dJRFRILCBzZW5kd2lkdGgsIE5VTEwsIDApOworCXNlNDAxX3NuZGN0cmwoMSwgc2U0MDEsIFNFNDAxX1JFUV9TRVRfSEVJR0hULCBzZW5kaGVpZ2h0LCBOVUxMLCAwKTsKKwlzZTQwMV9zZXRfZmVhdHVyZShzZTQwMSwgU0U0MDFfT1BFUkFUSU5HTU9ERSwgbW9kZSk7CisKKwlpZiAobW9kZT09MHgwMykgeworCQlzZTQwMS0+Zm9ybWF0PUZNVF9CQVlFUjsKKwl9IGVsc2UgeworCQlzZTQwMS0+Zm9ybWF0PUZNVF9KQU5HR1U7CisJfQorCisJcmV0dXJuOworfQorCisvKgorCUluIHRoaXMgZnVuY3Rpb24gc2U0MDFfc2VuZF9waWN0IGlzIGNhbGxlZCBzZXZlcmFsIHRpbWVzLAorCWZvciBzb21lIHJlYXNvbiAoZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgc2Vuc29yIGFuZCB0aGUgcGhhc2Ugb2YKKwl0aGUgbW9vbiA6KSBkb2luZyB0aGlzIG9ubHkgaW4gZWl0aGVyIHBsYWNlIGRvZXNuJ3QgYWx3YXlzIHdvcmsuLi4KKyovCitzdGF0aWMgaW50IHNlNDAxX3N0YXJ0X3N0cmVhbShzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSkKK3sKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IGVycj0wLCBpOworCXNlNDAxLT5zdHJlYW1pbmc9MTsKKworICAgICAgICBzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfQ0FNRVJBX1BPV0VSLCAxLCBOVUxMLCAwKTsKKyAgICAgICAgc2U0MDFfc25kY3RybCgxLCBzZTQwMSwgU0U0MDFfUkVRX0xFRF9DT05UUk9MLCAxLCBOVUxMLCAwKTsKKworCS8qIFNldCBwaWN0dXJlIHNldHRpbmdzICovCisJc2U0MDFfc2V0X2ZlYXR1cmUoc2U0MDEsIEhWNzEzMV9SRUdfTU9ERV9CLCAweDA1KTsvKndpbmRvd2VkICsgcGl4IGludGcgKi8KKwlzZTQwMV9zZW5kX3BpY3Qoc2U0MDEpOworCisJc2U0MDFfc2VuZF9zaXplKHNlNDAxLCBzZTQwMS0+Y3dpZHRoLCBzZTQwMS0+Y2hlaWdodCk7CisKKwlzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfU1RBUlRfQ09OVElOVU9VU19DQVBUVVJFLCAwLCBOVUxMLCAwKTsKKworCS8qIERvIHNvbWUgbWVtb3J5IGFsbG9jYXRpb24gKi8KKwlmb3IgKGk9MDsgaTxTRTQwMV9OVU1GUkFNRVM7IGkrKykgeworCQlzZTQwMS0+ZnJhbWVbaV0uZGF0YT1zZTQwMS0+ZmJ1ZiArIGkgKiBzZTQwMS0+bWF4ZnJhbWVzaXplOworCQlzZTQwMS0+ZnJhbWVbaV0uY3VycGl4PTA7CisJfQorCWZvciAoaT0wOyBpPFNFNDAxX05VTVNCVUY7IGkrKykgeworCQlzZTQwMS0+c2J1ZltpXS5kYXRhPWttYWxsb2MoU0U0MDFfUEFDS0VUU0laRSwgR0ZQX0tFUk5FTCk7CisJfQorCisJc2U0MDEtPmJheWVyb2Zmc2V0PTA7CisJc2U0MDEtPnNjcmF0Y2hfbmV4dD0wOworCXNlNDAxLT5zY3JhdGNoX3VzZT0wOworCXNlNDAxLT5zY3JhdGNoX292ZXJmbG93PTA7CisJZm9yIChpPTA7IGk8U0U0MDFfTlVNU0NSQVRDSDsgaSsrKSB7CisJCXNlNDAxLT5zY3JhdGNoW2ldLmRhdGE9a21hbGxvYyhTRTQwMV9QQUNLRVRTSVpFLCBHRlBfS0VSTkVMKTsKKwkJc2U0MDEtPnNjcmF0Y2hbaV0uc3RhdGU9QlVGRkVSX1VOVVNFRDsKKwl9CisKKwlmb3IgKGk9MDsgaTxTRTQwMV9OVU1TQlVGOyBpKyspIHsKKwkJdXJiPXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmKCF1cmIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNlNDAxLT5kZXYsCisJCQl1c2JfcmN2YnVsa3BpcGUoc2U0MDEtPmRldiwgU0U0MDFfVklERU9fRU5EUE9JTlQpLAorCQkJc2U0MDEtPnNidWZbaV0uZGF0YSwgU0U0MDFfUEFDS0VUU0laRSwKKwkJCXNlNDAxX3ZpZGVvX2lycSwKKwkJCXNlNDAxKTsKKworCQlzZTQwMS0+dXJiW2ldPXVyYjsKKworCQllcnI9dXNiX3N1Ym1pdF91cmIoc2U0MDEtPnVyYltpXSwgR0ZQX0tFUk5FTCk7CisJCWlmKGVycikKKwkJCWVycigidXJiIGJ1cm5lZCBkb3duIik7CisJfQorCisJc2U0MDEtPmZyYW1lY291bnQ9MDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlNDAxX3N0b3Bfc3RyZWFtKHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxKQoreworCWludCBpOworCisJaWYgKCFzZTQwMS0+c3RyZWFtaW5nIHx8ICFzZTQwMS0+ZGV2KQorCQlyZXR1cm4gMTsKKworCXNlNDAxLT5zdHJlYW1pbmc9MDsKKworCXNlNDAxX3NuZGN0cmwoMSwgc2U0MDEsIFNFNDAxX1JFUV9TVE9QX0NPTlRJTlVPVVNfQ0FQVFVSRSwgMCwgTlVMTCwgMCk7CisKKwlzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfTEVEX0NPTlRST0wsIDAsIE5VTEwsIDApOworCXNlNDAxX3NuZGN0cmwoMSwgc2U0MDEsIFNFNDAxX1JFUV9DQU1FUkFfUE9XRVIsIDAsIE5VTEwsIDApOworCisJZm9yIChpPTA7IGk8U0U0MDFfTlVNU0JVRjsgaSsrKSBpZiAoc2U0MDEtPnVyYltpXSkgeworCQl1c2Jfa2lsbF91cmIoc2U0MDEtPnVyYltpXSk7CisJCXVzYl9mcmVlX3VyYihzZTQwMS0+dXJiW2ldKTsKKwkJc2U0MDEtPnVyYltpXT1OVUxMOworCQlrZnJlZShzZTQwMS0+c2J1ZltpXS5kYXRhKTsKKwl9CisJZm9yIChpPTA7IGk8U0U0MDFfTlVNU0NSQVRDSDsgaSsrKSB7CisJCWtmcmVlKHNlNDAxLT5zY3JhdGNoW2ldLmRhdGEpOworCQlzZTQwMS0+c2NyYXRjaFtpXS5kYXRhPU5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2U0MDFfc2V0X3NpemUoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlpbnQgd2Fzc3RyZWFtaW5nPXNlNDAxLT5zdHJlYW1pbmc7CisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gY2hhbmdlICovCisJaWYgKHNlNDAxLT5jd2lkdGg9PXdpZHRoICYmIHNlNDAxLT5jaGVpZ2h0PT1oZWlnaHQpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgZm9yIGEgdmFsaWQgbW9kZSAqLworCWlmICghd2lkdGggfHwgIWhlaWdodCkKKwkJcmV0dXJuIDE7CisJaWYgKCh3aWR0aCAmIDEpIHx8IChoZWlnaHQgJiAxKSkKKwkJcmV0dXJuIDE7CisJaWYgKHdpZHRoPnNlNDAxLT53aWR0aFtzZTQwMS0+c2l6ZXMtMV0pCisJCXJldHVybiAxOworCWlmIChoZWlnaHQ+c2U0MDEtPmhlaWdodFtzZTQwMS0+c2l6ZXMtMV0pCisJCXJldHVybiAxOworCisJLyogU3RvcCBhIGN1cnJlbnQgc3RyZWFtIGFuZCBzdGFydCBpdCBhZ2FpbiBhdCB0aGUgbmV3IHNpemUgKi8KKwlpZiAod2Fzc3RyZWFtaW5nKQorCQlzZTQwMV9zdG9wX3N0cmVhbShzZTQwMSk7CisJc2U0MDEtPmN3aWR0aD13aWR0aDsKKwlzZTQwMS0+Y2hlaWdodD1oZWlnaHQ7CisJaWYgKHdhc3N0cmVhbWluZykKKwkJc2U0MDFfc3RhcnRfc3RyZWFtKHNlNDAxKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFZpZGVvIERlY29kaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKwlUaGlzIHNob3VsZG4ndCByZWFsbHkgYmUgZG9uZSBpbiBhIHY0bCBkcml2ZXIuLi4uCisJQnV0IGl0IGRvZXMgbWFrZSB0aGUgaW1hZ2UgbG9vayBhIGxvdCBtb3JlIHVzYWJsZS4KKwlCYXNpY2FsbHkgaXQgbGlmdHMgdGhlIGRhcmsgcGl4ZWxzIG1vcmUgdGhhbiB0aGUgbGlnaHQgcGl4ZWxzLgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmhhbmNlX3BpY3R1cmUodW5zaWduZWQgY2hhciAqZnJhbWUsIGludCBsZW4pCit7CisJd2hpbGUgKGxlbi0tKSB7CisJCSpmcmFtZT0oKCgqZnJhbWVeMjU1KSooKmZyYW1lXjI1NSkpLzI1NSleMjU1OworCQlmcmFtZSsrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY29kZV9KYW5nR3VfaW50ZWdyYXRlKHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxLCBpbnQgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2U0MDFfZnJhbWUgKmZyYW1lPSZzZTQwMS0+ZnJhbWVbc2U0MDEtPmN1cmZyYW1lXTsKKwlpbnQgbGluZWxlbmd0aD1zZTQwMS0+Y3dpZHRoKjM7CisKKwlpZiAoZnJhbWUtPmN1cmxpbmVwaXggPj0gbGluZWxlbmd0aCkgeworCQlmcmFtZS0+Y3VybGluZXBpeD0wOworCQlmcmFtZS0+Y3VybGluZSs9bGluZWxlbmd0aDsKKwl9CisKKwkvKiBGaXJzdCB0aHJlZSBhcmUgYWJzb2x1dGUsIGFsbCBvdGhlcnMgcmVsYXRpdmUuCisJICogRm9ybWF0IGlzIHJnYiBmcm9tIHJpZ2h0IHRvIGxlZnQgKG1pcnJvcnJlZCBpbWFnZSksIAorCSAqIHdlIGZsaXAgaXQgdG8gZ2V0IGJnciBmcm9tIGxlZnQgdG8gcmlnaHQuICovCisJaWYgKGZyYW1lLT5jdXJsaW5lcGl4IDwgMykgeworCQkqKGZyYW1lLT5jdXJsaW5lLWZyYW1lLT5jdXJsaW5lcGl4KT0xK2RhdGEqNDsKKwl9IGVsc2UgeworCQkqKGZyYW1lLT5jdXJsaW5lLWZyYW1lLT5jdXJsaW5lcGl4KT0KKwkJICAgICooZnJhbWUtPmN1cmxpbmUtZnJhbWUtPmN1cmxpbmVwaXgrMykrZGF0YSo0OworCX0KKwlmcmFtZS0+Y3VybGluZXBpeCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlX0phbmdHdV92bGMgKHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgYml0X2V4cCwgaW50IHBhY2tldGxlbmd0aCkKK3sKKwlpbnQgcG9zPTA7CisJaW50IHZsY19jb2Q9MDsKKwlpbnQgdmxjX3NpemU9MDsKKwlpbnQgdmxjX2RhdGE9MDsKKwlpbnQgYml0X2N1cjsKKwlpbnQgYml0OworCWRhdGErPTQ7CisJd2hpbGUgKHBvcyA8IHBhY2tldGxlbmd0aCkgeworCQliaXRfY3VyPTg7CisJCXdoaWxlIChiaXRfY3VyICYmIGJpdF9leHApIHsKKwkJCWJpdD0oKCpkYXRhKT4+KGJpdF9jdXItMSkpJjE7CisJCQlpZiAoIXZsY19jb2QpIHsKKwkJCQlpZiAoYml0KSB7CisJCQkJCXZsY19zaXplKys7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCF2bGNfc2l6ZSkgeworCQkJCQkJZGVjb2RlX0phbmdHdV9pbnRlZ3JhdGUoc2U0MDEsIDApOworCQkJCQl9IGVsc2UgeworCQkJCQkJdmxjX2NvZD0yOworCQkJCQkJdmxjX2RhdGE9MDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHZsY19jb2Q9PTIpIHsKKwkJCQkJaWYgKCFiaXQpCisJCQkJCQl2bGNfZGF0YSA9ICAtKDE8PHZsY19zaXplKSArIDE7CisJCQkJCXZsY19jb2QtLTsKKwkJCQl9CisJCQkJdmxjX3NpemUtLTsKKwkJCQl2bGNfZGF0YSs9Yml0PDx2bGNfc2l6ZTsKKwkJCQlpZiAoIXZsY19zaXplKSB7CisJCQkJCWRlY29kZV9KYW5nR3VfaW50ZWdyYXRlKHNlNDAxLCB2bGNfZGF0YSk7CisJCQkJCXZsY19jb2Q9MDsKKwkJCQl9CisJCQl9CisJCQliaXRfY3VyLS07CisJCQliaXRfZXhwLS07CisJCX0KKwkJcG9zKys7CisJCWRhdGErKzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNvZGVfSmFuZ0d1IChzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSwgc3RydWN0IHNlNDAxX3NjcmF0Y2ggKmJ1ZmZlcikKK3sKKwl1bnNpZ25lZCBjaGFyICpkYXRhPWJ1ZmZlci0+ZGF0YTsKKwlpbnQgbGVuPWJ1ZmZlci0+bGVuZ3RoOworCWludCBiaXRfZXhwPTAsIHBpeF9leHA9MCwgZnJhbWVpbmZvPTAsIHBhY2tldGxlbmd0aD0wLCBzaXplOworCWludCBkYXRhcG9zPTA7CisKKwkvKiBOZXcgaW1hZ2U/ICovCisJaWYgKCFzZTQwMS0+ZnJhbWVbc2U0MDEtPmN1cmZyYW1lXS5jdXJwaXgpIHsKKwkJc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uY3VybGluZXBpeD0wOworCQlzZTQwMS0+ZnJhbWVbc2U0MDEtPmN1cmZyYW1lXS5jdXJsaW5lPQorCQkgICAgc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uZGF0YSsKKwkJICAgIHNlNDAxLT5jd2lkdGgqMy0xOworCQlpZiAoc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uZ3JhYnN0YXRlPT1GUkFNRV9SRUFEWSkKKwkJCXNlNDAxLT5mcmFtZVtzZTQwMS0+Y3VyZnJhbWVdLmdyYWJzdGF0ZT1GUkFNRV9HUkFCQklORzsKKwkJc2U0MDEtPnZsY2RhdGFwb3M9MDsKKwl9CisJd2hpbGUgKGRhdGFwb3MgPCBsZW4pIHsKKwkJc2l6ZT0xMDI0LXNlNDAxLT52bGNkYXRhcG9zOworCQlpZiAoc2l6ZStkYXRhcG9zID4gbGVuKQorCQkJc2l6ZT1sZW4tZGF0YXBvczsKKwkJbWVtY3B5KHNlNDAxLT52bGNkYXRhK3NlNDAxLT52bGNkYXRhcG9zLCBkYXRhK2RhdGFwb3MsIHNpemUpOworCQlzZTQwMS0+dmxjZGF0YXBvcys9c2l6ZTsKKwkJcGFja2V0bGVuZ3RoPTA7CisJCWlmIChzZTQwMS0+dmxjZGF0YXBvcyA+PSA0KSB7CisJCQliaXRfZXhwPXNlNDAxLT52bGNkYXRhWzNdKyhzZTQwMS0+dmxjZGF0YVsyXTw8OCk7CisJCQlwaXhfZXhwPXNlNDAxLT52bGNkYXRhWzFdKygoc2U0MDEtPnZsY2RhdGFbMF0mMHgzZik8PDgpOworCQkJZnJhbWVpbmZvPXNlNDAxLT52bGNkYXRhWzBdJjB4YzA7CisJCQlwYWNrZXRsZW5ndGg9KChiaXRfZXhwKzQ3KT4+NCk8PDE7CisJCQlpZiAocGFja2V0bGVuZ3RoID4gMTAyNCkgeworCQkJCXNlNDAxLT52bGNkYXRhcG9zPTA7CisJCQkJZGF0YXBvcz1sZW47CisJCQkJcGFja2V0bGVuZ3RoPTA7CisJCQkJc2U0MDEtPmVycm9yKys7CisJCQkJc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uY3VycGl4PTA7CisJCQl9CisJCX0KKwkJaWYgKHBhY2tldGxlbmd0aCAmJiBzZTQwMS0+dmxjZGF0YXBvcyA+PSBwYWNrZXRsZW5ndGgpIHsKKwkJCWRlY29kZV9KYW5nR3VfdmxjKHNlNDAxLCBzZTQwMS0+dmxjZGF0YSwgYml0X2V4cCwgcGFja2V0bGVuZ3RoKTsKKwkJCXNlNDAxLT5mcmFtZVtzZTQwMS0+Y3VyZnJhbWVdLmN1cnBpeCs9cGl4X2V4cCozOworCQkJZGF0YXBvcys9c2l6ZS0oc2U0MDEtPnZsY2RhdGFwb3MtcGFja2V0bGVuZ3RoKTsKKwkJCXNlNDAxLT52bGNkYXRhcG9zPTA7CisJCQlpZiAoc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uY3VycGl4Pj1zZTQwMS0+Y3dpZHRoKnNlNDAxLT5jaGVpZ2h0KjMpIHsKKwkJCQlpZiAoc2U0MDEtPmZyYW1lW3NlNDAxLT5jdXJmcmFtZV0uY3VycGl4PT1zZTQwMS0+Y3dpZHRoKnNlNDAxLT5jaGVpZ2h0KjMpIHsKKwkJCQkJaWYgKHNlNDAxLT5mcmFtZVtzZTQwMS0+Y3VyZnJhbWVdLmdyYWJzdGF0ZT09RlJBTUVfR1JBQkJJTkcpIHsKKwkJCQkJCXNlNDAxLT5mcmFtZVtzZTQwMS0+Y3VyZnJhbWVdLmdyYWJzdGF0ZT1GUkFNRV9ET05FOworCQkJCQkJc2U0MDEtPmZyYW1lY291bnQrKzsKKwkJCQkJCXNlNDAxLT5yZWFkY291bnQrKzsKKwkJCQkJfQorCQkJCQlpZiAoc2U0MDEtPmZyYW1lWyhzZTQwMS0+Y3VyZnJhbWUrMSkmKFNFNDAxX05VTUZSQU1FUy0xKV0uZ3JhYnN0YXRlPT1GUkFNRV9SRUFEWSkgeworCQkJCQkJc2U0MDEtPmN1cmZyYW1lPShzZTQwMS0+Y3VyZnJhbWUrMSkgJiAoU0U0MDFfTlVNRlJBTUVTLTEpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJc2U0MDEtPmVycm9yKys7CisJCQkJfQorCQkJCXNlNDAxLT5mcmFtZVtzZTQwMS0+Y3VyZnJhbWVdLmN1cnBpeD0wOworCQkJCWRhdGFwb3M9bGVuOworCQkJfQorCQl9IGVsc2UgeworCQkJZGF0YXBvcys9c2l6ZTsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY29kZV9iYXllciAoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEsIHN0cnVjdCBzZTQwMV9zY3JhdGNoICpidWZmZXIpCit7CisJdW5zaWduZWQgY2hhciAqZGF0YT1idWZmZXItPmRhdGE7CisJaW50IGxlbj1idWZmZXItPmxlbmd0aDsKKwlpbnQgb2Zmc2V0PWJ1ZmZlci0+b2Zmc2V0OworCWludCBkYXRhc2l6ZT1zZTQwMS0+Y3dpZHRoKnNlNDAxLT5jaGVpZ2h0OworCXN0cnVjdCBzZTQwMV9mcmFtZSAqZnJhbWU9JnNlNDAxLT5mcmFtZVtzZTQwMS0+Y3VyZnJhbWVdOworCisJdW5zaWduZWQgY2hhciAqZnJhbWVkYXRhPWZyYW1lLT5kYXRhLCAqY3VybGluZSwgKm5leHRsaW5lOworCWludCB3aWR0aD1zZTQwMS0+Y3dpZHRoOworCWludCBibGluZW9mZnNldD0wLCBibGluZTsKKwlpbnQgbGluZWxlbmd0aD13aWR0aCozLCBpOworCQorCisJaWYgKGZyYW1lLT5jdXJwaXg9PTApIHsKKwkJaWYgKGZyYW1lLT5ncmFic3RhdGU9PUZSQU1FX1JFQURZKSB7CisJCQlmcmFtZS0+Z3JhYnN0YXRlPUZSQU1FX0dSQUJCSU5HOworCQl9CisJCWZyYW1lLT5jdXJsaW5lPWZyYW1lZGF0YStsaW5lbGVuZ3RoOworCQlmcmFtZS0+Y3VybGluZXBpeD0wOworCX0KKworCWlmIChvZmZzZXQhPWZyYW1lLT5jdXJwaXgpIHsKKwkJLyogUmVnYXJkIGZyYW1lIGFzIGxvc3QgOiggKi8KKwkJZnJhbWUtPmN1cnBpeD0wOworCQlzZTQwMS0+ZXJyb3IrKzsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIGlmIHdlIGhhdmUgdG8gbXVjaCBkYXRhICovCisJaWYgKGZyYW1lLT5jdXJwaXgrbGVuID4gZGF0YXNpemUpIHsKKwkJbGVuPWRhdGFzaXplLWZyYW1lLT5jdXJwaXg7CisJfQorCWlmIChzZTQwMS0+Y2hlaWdodCU0KQorCQlibGluZW9mZnNldD0xOworCWJsaW5lPWZyYW1lLT5jdXJwaXgvc2U0MDEtPmN3aWR0aCtibGluZW9mZnNldDsKKworCWN1cmxpbmU9ZnJhbWUtPmN1cmxpbmU7CisJbmV4dGxpbmU9Y3VybGluZStsaW5lbGVuZ3RoOworCWlmIChuZXh0bGluZSA+PSBmcmFtZWRhdGErZGF0YXNpemUqMykKKwkJbmV4dGxpbmU9Y3VybGluZTsKKwl3aGlsZSAobGVuKSB7CisJCWlmIChmcmFtZS0+Y3VybGluZXBpeD49d2lkdGgpIHsKKwkJCWZyYW1lLT5jdXJsaW5lcGl4LT13aWR0aDsKKwkJCWJsaW5lPWZyYW1lLT5jdXJwaXgvd2lkdGgrYmxpbmVvZmZzZXQ7CisJCQljdXJsaW5lKz1saW5lbGVuZ3RoKjI7CisJCQluZXh0bGluZSs9bGluZWxlbmd0aCoyOworCQkJaWYgKGN1cmxpbmUgPj0gZnJhbWVkYXRhK2RhdGFzaXplKjMpIHsKKwkJCQlmcmFtZS0+Y3VybGluZXBpeCsrOworCQkJCWN1cmxpbmUtPTM7CisJCQkJbmV4dGxpbmUtPTM7CisJCQkJbGVuLS07CisJCQkJZGF0YSsrOworCQkJCWZyYW1lLT5jdXJwaXgrKzsKKwkJCX0KKwkJCWlmIChuZXh0bGluZSA+PSBmcmFtZWRhdGErZGF0YXNpemUqMykKKwkJCQluZXh0bGluZT1jdXJsaW5lOworCQl9CisJCWlmICgoYmxpbmUmMSkpIHsKKwkJCWlmICgoZnJhbWUtPmN1cmxpbmVwaXgmMSkpIHsKKwkJCQkqKGN1cmxpbmUrMik9KmRhdGE7CisJCQkJKihjdXJsaW5lLTEpPSpkYXRhOworCQkJCSoobmV4dGxpbmUrMik9KmRhdGE7CisJCQkJKihuZXh0bGluZS0xKT0qZGF0YTsKKwkJCX0gZWxzZSB7CisJCQkJKihjdXJsaW5lKzEpPQorCQkJCQkoKihjdXJsaW5lKzEpKypkYXRhKS8yOworCQkJCSooY3VybGluZS0yKT0KKwkJCQkJKCooY3VybGluZS0yKSsqZGF0YSkvMjsKKwkJCQkqKG5leHRsaW5lKzEpPSpkYXRhOworCQkJCSoobmV4dGxpbmUtMik9KmRhdGE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKGZyYW1lLT5jdXJsaW5lcGl4JjEpKSB7CisJCQkJKihjdXJsaW5lKzEpPQorCQkJCQkoKihjdXJsaW5lKzEpKypkYXRhKS8yOworCQkJCSooY3VybGluZS0yKT0KKwkJCQkJKCooY3VybGluZS0yKSsqZGF0YSkvMjsKKwkJCQkqKG5leHRsaW5lKzEpPSpkYXRhOworCQkJCSoobmV4dGxpbmUtMik9KmRhdGE7CisJCQl9IGVsc2UgeworCQkJCSpjdXJsaW5lPSpkYXRhOworCQkJCSooY3VybGluZS0zKT0qZGF0YTsKKwkJCQkqbmV4dGxpbmU9KmRhdGE7CisJCQkJKihuZXh0bGluZS0zKT0qZGF0YTsKKwkJCX0KKwkJfQorCQlmcmFtZS0+Y3VybGluZXBpeCsrOworCQljdXJsaW5lLT0zOworCQluZXh0bGluZS09MzsKKwkJbGVuLS07CisJCWRhdGErKzsKKwkJZnJhbWUtPmN1cnBpeCsrOworCX0KKwlmcmFtZS0+Y3VybGluZT1jdXJsaW5lOworCisJaWYgKGZyYW1lLT5jdXJwaXg+PWRhdGFzaXplKSB7CisJCS8qIEZpeCB0aGUgdG9wIGxpbmUgKi8KKwkJZnJhbWVkYXRhKz1saW5lbGVuZ3RoOworCQlmb3IgKGk9MDsgaTxsaW5lbGVuZ3RoOyBpKyspIHsKKwkJCWZyYW1lZGF0YS0tOworCQkJKmZyYW1lZGF0YT0qKGZyYW1lZGF0YStsaW5lbGVuZ3RoKTsKKwkJfQorCQkvKiBGaXggdGhlIGxlZnQgc2lkZSAoZ3JlZW4gaXMgYWxyZWFkeSBwcmVzZW50KSAqLworCQlmb3IgKGk9MDsgaTxzZTQwMS0+Y2hlaWdodDsgaSsrKSB7CisJCQkqZnJhbWVkYXRhPSooZnJhbWVkYXRhKzMpOworCQkJKihmcmFtZWRhdGErMSk9KihmcmFtZWRhdGErNCk7CisJCQkqKGZyYW1lZGF0YSsyKT0qKGZyYW1lZGF0YSs1KTsKKwkJCWZyYW1lZGF0YSs9bGluZWxlbmd0aDsKKwkJfQorCQlmcmFtZS0+Y3VycGl4PTA7CisJCWZyYW1lLT5ncmFic3RhdGU9RlJBTUVfRE9ORTsKKwkJc2U0MDEtPmZyYW1lY291bnQrKzsKKwkJc2U0MDEtPnJlYWRjb3VudCsrOworCQlpZiAoc2U0MDEtPmZyYW1lWyhzZTQwMS0+Y3VyZnJhbWUrMSkmKFNFNDAxX05VTUZSQU1FUy0xKV0uZ3JhYnN0YXRlPT1GUkFNRV9SRUFEWSkgeworCQkJc2U0MDEtPmN1cmZyYW1lPShzZTQwMS0+Y3VyZnJhbWUrMSkgJiAoU0U0MDFfTlVNRlJBTUVTLTEpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHNlNDAxX25ld2ZyYW1lKHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxLCBpbnQgZnJhbWVucikKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQgZXJyb3JzPTA7CisKKwl3aGlsZSAoc2U0MDEtPnN0cmVhbWluZyAmJgorCSAgICAoc2U0MDEtPmZyYW1lW2ZyYW1lbnJdLmdyYWJzdGF0ZT09RlJBTUVfUkVBRFkgfHwKKwkgICAgIHNlNDAxLT5mcmFtZVtmcmFtZW5yXS5ncmFic3RhdGU9PUZSQU1FX0dSQUJCSU5HKSApIHsKKwkJaWYoIXNlNDAxLT5mcmFtZVtmcmFtZW5yXS5jdXJwaXgpIHsKKwkJCWVycm9ycysrOworCQl9CisJCXdhaXRfaW50ZXJydXB0aWJsZSgKKwkJICAgIHNlNDAxLT5zY3JhdGNoW3NlNDAxLT5zY3JhdGNoX3VzZV0uc3RhdGUhPUJVRkZFUl9SRUFEWSwKKwkJICAgICZzZTQwMS0+d3EsCisJCSAgICAmd2FpdAorCQkpOworCQlpZiAoc2U0MDEtPm51bGxwYWNrZXRzID4gU0U0MDFfTUFYX05VTExQQUNLRVRTKSB7CisJCQlzZTQwMS0+bnVsbHBhY2tldHM9MDsKKwkJCWluZm8oInRvIG1hbnkgbnVsbCBsZW5ndGggcGFja2V0cywgcmVzdGFydGluZyBjYXB0dXJlIik7CisJCQlzZTQwMV9zdG9wX3N0cmVhbShzZTQwMSk7CisJCQlzZTQwMV9zdGFydF9zdHJlYW0oc2U0MDEpOwkJCQorCQl9IGVsc2UgeworCQkJaWYgKHNlNDAxLT5zY3JhdGNoW3NlNDAxLT5zY3JhdGNoX3VzZV0uc3RhdGUhPUJVRkZFUl9SRUFEWSkgeworCQkJCXNlNDAxLT5mcmFtZVtmcmFtZW5yXS5ncmFic3RhdGU9RlJBTUVfRVJST1I7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlzZTQwMS0+c2NyYXRjaFtzZTQwMS0+c2NyYXRjaF91c2VdLnN0YXRlPUJVRkZFUl9CVVNZOworCQkJaWYgKHNlNDAxLT5mb3JtYXQ9PUZNVF9KQU5HR1UpIHsKKwkJCQlkZWNvZGVfSmFuZ0d1KHNlNDAxLCAmc2U0MDEtPnNjcmF0Y2hbc2U0MDEtPnNjcmF0Y2hfdXNlXSk7CisJCQl9IGVsc2UgeworCQkJCWRlY29kZV9iYXllcihzZTQwMSwgJnNlNDAxLT5zY3JhdGNoW3NlNDAxLT5zY3JhdGNoX3VzZV0pOworCQkJfQorCQkJc2U0MDEtPnNjcmF0Y2hbc2U0MDEtPnNjcmF0Y2hfdXNlXS5zdGF0ZT1CVUZGRVJfVU5VU0VEOworCQkJc2U0MDEtPnNjcmF0Y2hfdXNlKys7CisJCQlpZiAoc2U0MDEtPnNjcmF0Y2hfdXNlPj1TRTQwMV9OVU1TQ1JBVENIKQorCQkJCXNlNDAxLT5zY3JhdGNoX3VzZT0wOworCQkJaWYgKGVycm9ycyA+IFNFNDAxX01BWF9FUlJPUlMpIHsKKwkJCQllcnJvcnM9MDsKKwkJCQlpbmZvKCJ0byBtdWNoIGVycm9ycywgcmVzdGFydGluZyBjYXB0dXJlIik7CisJCQkJc2U0MDFfc3RvcF9zdHJlYW0oc2U0MDEpOworCQkJCXNlNDAxX3N0YXJ0X3N0cmVhbShzZTQwMSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoc2U0MDEtPmZyYW1lW2ZyYW1lbnJdLmdyYWJzdGF0ZT09RlJBTUVfRE9ORSkKKwkJaWYgKHNlNDAxLT5lbmhhbmNlKQorCQkJZW5oYW5jZV9waWN0dXJlKHNlNDAxLT5mcmFtZVtmcmFtZW5yXS5kYXRhLCBzZTQwMS0+Y2hlaWdodCpzZTQwMS0+Y3dpZHRoKjMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2Jfc2U0MDFfcmVtb3ZlX2Rpc2Nvbm5lY3RlZCAoc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEpCit7CisJaW50IGk7CisKKyAgICAgICAgc2U0MDEtPmRldiA9IE5VTEw7CisKKwlmb3IgKGk9MDsgaTxTRTQwMV9OVU1TQlVGOyBpKyspIGlmIChzZTQwMS0+dXJiW2ldKSB7CisJCXVzYl9raWxsX3VyYihzZTQwMS0+dXJiW2ldKTsKKwkJdXNiX2ZyZWVfdXJiKHNlNDAxLT51cmJbaV0pOworCQlzZTQwMS0+dXJiW2ldID0gTlVMTDsKKwkJa2ZyZWUoc2U0MDEtPnNidWZbaV0uZGF0YSk7CisJfQorCWZvciAoaT0wOyBpPFNFNDAxX05VTVNDUkFUQ0g7IGkrKykgaWYgKHNlNDAxLT5zY3JhdGNoW2ldLmRhdGEpIHsKKwkJa2ZyZWUoc2U0MDEtPnNjcmF0Y2hbaV0uZGF0YSk7CisJfQorCWlmIChzZTQwMS0+aW50dXJiKSB7CisJCXVzYl9raWxsX3VyYihzZTQwMS0+aW50dXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHNlNDAxLT5pbnR1cmIpOworCX0KKyAgICAgICAgaW5mbygiJXMgZGlzY29ubmVjdGVkIiwgc2U0MDEtPmNhbWVyYV9uYW1lKTsKKworICAgICAgICAvKiBGcmVlIHRoZSBtZW1vcnkgKi8KKwlrZnJlZShzZTQwMS0+d2lkdGgpOworCWtmcmVlKHNlNDAxLT5oZWlnaHQpOworCWtmcmVlKHNlNDAxKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVmlkZW80TGludXgKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgc2U0MDFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxID0gKHN0cnVjdCB1c2Jfc2U0MDEgKilkZXY7CisJaW50IGVyciA9IDA7CisKKwlpZiAoc2U0MDEtPnVzZXIpCisJCXJldHVybiAtRUJVU1k7CisJc2U0MDEtPmZidWYgPSBydm1hbGxvYyhzZTQwMS0+bWF4ZnJhbWVzaXplICogU0U0MDFfTlVNRlJBTUVTKTsKKwlpZiAoc2U0MDEtPmZidWYpCisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKwllbHNlIAorCQllcnIgPSAtRU5PTUVNOworCXNlNDAxLT51c2VyID0gIWVycjsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2U0MDFfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgICBzdHJ1Y3QgdXNiX3NlNDAxICpzZTQwMSA9IChzdHJ1Y3QgdXNiX3NlNDAxICopZGV2OworCWludCBpOworCisJcnZmcmVlKHNlNDAxLT5mYnVmLCBzZTQwMS0+bWF4ZnJhbWVzaXplICogU0U0MDFfTlVNRlJBTUVTKTsKKyAgICAgICAgaWYgKHNlNDAxLT5yZW1vdmVkKSB7CisJCXVzYl9zZTQwMV9yZW1vdmVfZGlzY29ubmVjdGVkKHNlNDAxKTsKKwkJaW5mbygiZGV2aWNlIHVucmVnaXN0ZXJlZCIpOworCX0gZWxzZSB7CisJCWZvciAoaT0wOyBpPFNFNDAxX05VTUZSQU1FUzsgaSsrKQorCQkJc2U0MDEtPmZyYW1lW2ldLmdyYWJzdGF0ZT1GUkFNRV9VTlVTRUQ7CisJCWlmIChzZTQwMS0+c3RyZWFtaW5nKQorCQkJc2U0MDFfc3RvcF9zdHJlYW0oc2U0MDEpOworCQlzZTQwMS0+dXNlcj0wOworCX0KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlNDAxX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKyAgICAgICAgc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEgPSAoc3RydWN0IHVzYl9zZTQwMSAqKXZkZXY7CisKKyAgICAgICAgaWYgKCFzZTQwMS0+ZGV2KQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOworCisgICAgICAgIHN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NHQ0FQOgorCXsKKwkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmIgPSBhcmc7CisJCXN0cmNweShiLT5uYW1lLCBzZTQwMS0+Y2FtZXJhX25hbWUpOworCQliLT50eXBlID0gVklEX1RZUEVfQ0FQVFVSRTsKKwkJYi0+Y2hhbm5lbHMgPSAxOworCQliLT5hdWRpb3MgPSAwOworCQliLT5tYXh3aWR0aCA9IHNlNDAxLT53aWR0aFtzZTQwMS0+c2l6ZXMtMV07CisJCWItPm1heGhlaWdodCA9IHNlNDAxLT5oZWlnaHRbc2U0MDEtPnNpemVzLTFdOworCQliLT5taW53aWR0aCA9IHNlNDAxLT53aWR0aFswXTsKKwkJYi0+bWluaGVpZ2h0ID0gc2U0MDEtPmhlaWdodFswXTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DR0NIQU46CisJeworCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKworCQlpZiAodi0+Y2hhbm5lbCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXYtPmZsYWdzID0gMDsKKwkJdi0+dHVuZXJzID0gMDsKKwkJdi0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOworCQlzdHJjcHkodi0+bmFtZSwgIkNhbWVyYSIpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NTQ0hBTjoKKwl7CisJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCisJCWlmICh2LT5jaGFubmVsICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CisJfQorICAgICAgICBjYXNlIFZJRElPQ0dQSUNUOgorICAgICAgICB7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCisJCXNlNDAxX2dldF9waWN0KHNlNDAxLCBwKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DU1BJQ1Q6CisJeworCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCA9IGFyZzsKKworCQlpZiAoc2U0MDFfc2V0X3BpY3Qoc2U0MDEsIHApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ1NXSU46CisJeworCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKKworCQlpZiAodnctPmZsYWdzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2dy0+Y2xpcGNvdW50KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChzZTQwMV9zZXRfc2l6ZShzZTQwMSwgdnctPndpZHRoLCB2dy0+aGVpZ2h0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKKyAgICAgICAgfQorCWNhc2UgVklESU9DR1dJTjoKKwl7CisJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCisJCXZ3LT54ID0gMDsgICAgICAgICAgICAgICAvKiBGSVhNRSAqLworCQl2dy0+eSA9IDA7CisJCXZ3LT5jaHJvbWFrZXkgPSAwOworCQl2dy0+ZmxhZ3MgPSAwOworCQl2dy0+Y2xpcGNvdW50ID0gMDsKKwkJdnctPndpZHRoID0gc2U0MDEtPmN3aWR0aDsKKwkJdnctPmhlaWdodCA9IHNlNDAxLT5jaGVpZ2h0OworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NHTUJVRjoKKwl7CisJCXN0cnVjdCB2aWRlb19tYnVmICp2bSA9IGFyZzsKKwkJaW50IGk7CisKKwkJbWVtc2V0KHZtLCAwLCBzaXplb2YoKnZtKSk7CisJCXZtLT5zaXplID0gU0U0MDFfTlVNRlJBTUVTICogc2U0MDEtPm1heGZyYW1lc2l6ZTsKKwkJdm0tPmZyYW1lcyA9IFNFNDAxX05VTUZSQU1FUzsKKwkJZm9yIChpPTA7IGk8U0U0MDFfTlVNRlJBTUVTOyBpKyspCisJCQl2bS0+b2Zmc2V0c1tpXSA9IHNlNDAxLT5tYXhmcmFtZXNpemUgKiBpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NNQ0FQVFVSRToKKwl7CisJCXN0cnVjdCB2aWRlb19tbWFwICp2bSA9IGFyZzsKKworCQlpZiAodm0tPmZvcm1hdCAhPSBWSURFT19QQUxFVFRFX1JHQjI0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2bS0+ZnJhbWUgPj0gU0U0MDFfTlVNRlJBTUVTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChzZTQwMS0+ZnJhbWVbdm0tPmZyYW1lXS5ncmFic3RhdGUgIT0gRlJBTUVfVU5VU0VEKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQkvKiBJcyB0aGlzIGFjY29yZGluZyB0byB0aGUgdjRsIHNwZWM/Pz8gKi8KKwkJaWYgKHNlNDAxX3NldF9zaXplKHNlNDAxLCB2bS0+d2lkdGgsIHZtLT5oZWlnaHQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNlNDAxLT5mcmFtZVt2bS0+ZnJhbWVdLmdyYWJzdGF0ZT1GUkFNRV9SRUFEWTsKKworCQlpZiAoIXNlNDAxLT5zdHJlYW1pbmcpCisJCQlzZTQwMV9zdGFydF9zdHJlYW0oc2U0MDEpOworCisJCS8qIFNldCB0aGUgcGljdHVyZSBwcm9wZXJ0aWVzICovCisJCWlmIChzZTQwMS0+ZnJhbWVjb3VudD09MCkKKwkJCXNlNDAxX3NlbmRfcGljdChzZTQwMSk7CisJCS8qIENhbGlicmF0ZSB0aGUgcmVzZXQgbGV2ZWwgYWZ0ZXIgYSBmZXcgZnJhbWVzLiAqLworCQlpZiAoc2U0MDEtPmZyYW1lY291bnQlMjA9PTEpCisJCQlzZTQwMV9hdXRvX3Jlc2V0bGV2ZWwoc2U0MDEpOworCisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ1NZTkM6CisJeworCQlpbnQgKmZyYW1lID0gYXJnOworCQlpbnQgcmV0PTA7CisKKwkJaWYoKmZyYW1lIDwwIHx8ICpmcmFtZSA+PSBTRTQwMV9OVU1GUkFNRVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXQ9c2U0MDFfbmV3ZnJhbWUoc2U0MDEsICpmcmFtZSk7CisJCXNlNDAxLT5mcmFtZVsqZnJhbWVdLmdyYWJzdGF0ZT1GUkFNRV9VTlVTRUQ7CisJCXJldHVybiByZXQ7CisJfQorCWNhc2UgVklESU9DR0ZCVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyICp2YiA9IGFyZzsKKworCQltZW1zZXQodmIsIDAsIHNpemVvZigqdmIpKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DS0VZOgorCQlyZXR1cm4gMDsKKwljYXNlIFZJRElPQ0NBUFRVUkU6CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgVklESU9DU0ZCVUY6CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgVklESU9DR1RVTkVSOgorCWNhc2UgVklESU9DU1RVTkVSOgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFZJRElPQ0dGUkVROgorCWNhc2UgVklESU9DU0ZSRVE6CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgVklESU9DR0FVRElPOgorCWNhc2UgVklESU9DU0FVRElPOgorCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0lPQ1RMQ01EOworICAgICAgICB9IC8qIGVuZCBzd2l0Y2ggKi8KKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZTQwMV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHNlNDAxX2RvX2lvY3RsKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2U0MDFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmVhbGNvdW50PWNvdW50LCByZXQ9MDsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEgPSAoc3RydWN0IHVzYl9zZTQwMSAqKWRldjsKKworCisJaWYgKHNlNDAxLT5kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJaWYgKHJlYWxjb3VudCA+IHNlNDAxLT5jd2lkdGgqc2U0MDEtPmNoZWlnaHQqMykKKwkJcmVhbGNvdW50PXNlNDAxLT5jd2lkdGgqc2U0MDEtPmNoZWlnaHQqMzsKKworCS8qIFNob3VsZG4ndCBoYXBwZW46ICovCisJaWYgKHNlNDAxLT5mcmFtZVswXS5ncmFic3RhdGU9PUZSQU1FX0dSQUJCSU5HKQorCQlyZXR1cm4gLUVCVVNZOworCXNlNDAxLT5mcmFtZVswXS5ncmFic3RhdGU9RlJBTUVfUkVBRFk7CisJc2U0MDEtPmZyYW1lWzFdLmdyYWJzdGF0ZT1GUkFNRV9VTlVTRUQ7CisJc2U0MDEtPmN1cmZyYW1lPTA7CisKKwlpZiAoIXNlNDAxLT5zdHJlYW1pbmcpCisJCXNlNDAxX3N0YXJ0X3N0cmVhbShzZTQwMSk7CisKKwkvKiBTZXQgdGhlIHBpY3R1cmUgcHJvcGVydGllcyAqLworCWlmIChzZTQwMS0+ZnJhbWVjb3VudD09MCkKKwkJc2U0MDFfc2VuZF9waWN0KHNlNDAxKTsKKwkvKiBDYWxpYnJhdGUgdGhlIHJlc2V0IGxldmVsIGFmdGVyIGEgZmV3IGZyYW1lcy4gKi8KKwlpZiAoc2U0MDEtPmZyYW1lY291bnQlMjA9PTEpCisJCXNlNDAxX2F1dG9fcmVzZXRsZXZlbChzZTQwMSk7CisKKwlyZXQ9c2U0MDFfbmV3ZnJhbWUoc2U0MDEsIDApOworCisJc2U0MDEtPmZyYW1lWzBdLmdyYWJzdGF0ZT1GUkFNRV9VTlVTRUQ7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsJCisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHNlNDAxLT5mcmFtZVswXS5kYXRhLCByZWFsY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiByZWFsY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc2U0MDFfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxID0gKHN0cnVjdCB1c2Jfc2U0MDEgKilkZXY7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplICA9IHZtYS0+dm1fZW5kLXZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBwYWdlLCBwb3M7CisKKwlkb3duKCZzZTQwMS0+bG9jayk7CisKKwlpZiAoc2U0MDEtPmRldiA9PSBOVUxMKSB7CisJCXVwKCZzZTQwMS0+bG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoc2l6ZSA+ICgoKFNFNDAxX05VTUZSQU1FUyAqIHNlNDAxLT5tYXhmcmFtZXNpemUpICsgUEFHRV9TSVpFIC0gMSkgJiB+KFBBR0VfU0laRSAtIDEpKSkgeworCQl1cCgmc2U0MDEtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcG9zID0gKHVuc2lnbmVkIGxvbmcpc2U0MDEtPmZidWY7CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCXBhZ2UgPSB2bWFsbG9jX3RvX3Bmbigodm9pZCAqKXBvcyk7CisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwgUEFHRV9TSVpFLCBQQUdFX1NIQVJFRCkpIHsKKwkJCXVwKCZzZTQwMS0+bG9jayk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQlzdGFydCArPSBQQUdFX1NJWkU7CisJCXBvcyArPSBQQUdFX1NJWkU7CisJCWlmIChzaXplID4gUEFHRV9TSVpFKQorCQkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJCWVsc2UKKwkJCXNpemUgPSAwOworCX0KKwl1cCgmc2U0MDEtPmxvY2spOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZTQwMV9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorICAgICAgICAub3BlbiA9ICAgICAgICAgc2U0MDFfb3BlbiwKKyAgICAgICAgLnJlbGVhc2UgPSAgICAgIHNlNDAxX2Nsb3NlLAorICAgICAgICAucmVhZCA9ICAgICAgICAgc2U0MDFfcmVhZCwKKyAgICAgICAgLm1tYXAgPSAgICAgICAgIHNlNDAxX21tYXAsCisJLmlvY3RsID0gICAgICAgIHNlNDAxX2lvY3RsLAorCS5sbHNlZWsgPSAgICAgICBub19sbHNlZWssCit9Oworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2U0MDFfdGVtcGxhdGUgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisgICAgICAgIC5uYW1lID0gICAgICAgICAic2U0MDEgVVNCIGNhbWVyYSIsCisgICAgICAgIC50eXBlID0gICAgICAgICBWSURfVFlQRV9DQVBUVVJFLAorICAgICAgICAuaGFyZHdhcmUgPSAgICAgVklEX0hBUkRXQVJFX1NFNDAxLAorCS5mb3BzID0gICAgICAgICAmc2U0MDFfZm9wcywKK307CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzZTQwMV9pbml0KHN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxLCBpbnQgYnV0dG9uKQoreworICAgICAgICBpbnQgaT0wLCByYzsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjcFsweDQwXTsKKwljaGFyIHRlbXBbMjAwXTsKKworCS8qIGxlZCBvbiAqLworICAgICAgICBzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfTEVEX0NPTlRST0wsIDEsIE5VTEwsIDApOworCisJLyogZ2V0IGNhbWVyYSBkZXNjcmlwdG9yICovCisJcmM9c2U0MDFfc25kY3RybCgwLCBzZTQwMSwgU0U0MDFfUkVRX0dFVF9DQU1FUkFfREVTQ1JJUFRPUiwgMCwgY3AsIHNpemVvZihjcCkpOworCWlmIChjcFsxXSE9MHg0MSkgeworCQllcnIoIldyb25nIGRlc2NyaXB0b3IgdHlwZSIpOworCQlyZXR1cm4gMTsKKwl9CisJc3ByaW50ZiAodGVtcCwgIkV4dHJhRmVhdHVyZXM6ICVkIiwgY3BbM10pOworCisJc2U0MDEtPnNpemVzPWNwWzRdK2NwWzVdKjI1NjsKKwlzZTQwMS0+d2lkdGg9a21hbGxvYyhzZTQwMS0+c2l6ZXMqc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOworCWlmICghc2U0MDEtPndpZHRoKQorCQlyZXR1cm4gMTsKKwlzZTQwMS0+aGVpZ2h0PWttYWxsb2Moc2U0MDEtPnNpemVzKnNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlNDAxLT5oZWlnaHQpIHsKKwkJa2ZyZWUoc2U0MDEtPndpZHRoKTsKKwkJcmV0dXJuIDE7CisJfQorCWZvciAoaT0wOyBpPHNlNDAxLT5zaXplczsgaSsrKSB7CisJCSAgICBzZTQwMS0+d2lkdGhbaV09Y3BbNitpKjQrMF0rY3BbNitpKjQrMV0qMjU2OworCQkgICAgc2U0MDEtPmhlaWdodFtpXT1jcFs2K2kqNCsyXStjcFs2K2kqNCszXSoyNTY7CisJfQorCXNwcmludGYgKHRlbXAsICIlcyBTaXplczoiLCB0ZW1wKTsKKwlmb3IgKGk9MDsgaTxzZTQwMS0+c2l6ZXM7IGkrKykgeworCQlzcHJpbnRmKHRlbXAsICIlcyAlZHglZCIsIHRlbXAsIHNlNDAxLT53aWR0aFtpXSwgc2U0MDEtPmhlaWdodFtpXSk7CisJfQorCWluZm8oIiVzIiwgdGVtcCk7CisJc2U0MDEtPm1heGZyYW1lc2l6ZT1zZTQwMS0+d2lkdGhbc2U0MDEtPnNpemVzLTFdKnNlNDAxLT5oZWlnaHRbc2U0MDEtPnNpemVzLTFdKjM7CisKKwlyYz1zZTQwMV9zbmRjdHJsKDAsIHNlNDAxLCBTRTQwMV9SRVFfR0VUX1dJRFRILCAwLCBjcCwgc2l6ZW9mKGNwKSk7CisJc2U0MDEtPmN3aWR0aD1jcFswXStjcFsxXSoyNTY7CisJcmM9c2U0MDFfc25kY3RybCgwLCBzZTQwMSwgU0U0MDFfUkVRX0dFVF9IRUlHSFQsIDAsIGNwLCBzaXplb2YoY3ApKTsKKwlzZTQwMS0+Y2hlaWdodD1jcFswXStjcFsxXSoyNTY7CisKKwlpZiAoIWNwWzJdICYmIFNFNDAxX0ZPUk1BVF9CQVlFUikgeworCQllcnIoIkJheWVyIGZvcm1hdCBub3Qgc3VwcG9ydGVkISIpOworCQlyZXR1cm4gMTsKKwl9CisJLyogc2V0IG91dHB1dCBtb2RlIChCQVlFUikgKi8KKyAgICAgICAgc2U0MDFfc25kY3RybCgxLCBzZTQwMSwgU0U0MDFfUkVRX1NFVF9PVVRQVVRfTU9ERSwgU0U0MDFfRk9STUFUX0JBWUVSLCBOVUxMLCAwKTsKKworCXJjPXNlNDAxX3NuZGN0cmwoMCwgc2U0MDEsIFNFNDAxX1JFUV9HRVRfQlJULCAwLCBjcCwgc2l6ZW9mKGNwKSk7CisJc2U0MDEtPmJyaWdodG5lc3M9Y3BbMF0rY3BbMV0qMjU2OworCS8qIHNvbWUgZGVmYXVsdCB2YWx1ZXMgKi8KKwlzZTQwMS0+cmVzZXRsZXZlbD0weDJkOworCXNlNDAxLT5yZ2Fpbj0weDIwOworCXNlNDAxLT5nZ2Fpbj0weDIwOworCXNlNDAxLT5iZ2Fpbj0weDIwOworCXNlNDAxX3NldF9leHBvc3VyZShzZTQwMSwgMjAwMDApOworCXNlNDAxLT5wYWxldHRlPVZJREVPX1BBTEVUVEVfUkdCMjQ7CisJc2U0MDEtPmVuaGFuY2U9MTsKKwlzZTQwMS0+ZHJvcHBlZD0wOworCXNlNDAxLT5lcnJvcj0wOworCXNlNDAxLT5mcmFtZWNvdW50PTA7CisJc2U0MDEtPnJlYWRjb3VudD0wOworCisJLyogU3RhcnQgaW50ZXJydXB0IHRyYW5zZmVycyBmb3Igc25hcHNob3QgYnV0dG9uICovCisJaWYgKGJ1dHRvbikgeworCQlzZTQwMS0+aW50dXJiPXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2U0MDEtPmludHVyYikgeworCQkJaW5mbygiQWxsb2NhdGlvbiBvZiBpbnR1cmIgZmFpbGVkIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQl1c2JfZmlsbF9pbnRfdXJiKHNlNDAxLT5pbnR1cmIsIHNlNDAxLT5kZXYsCisJCSAgICB1c2JfcmN2aW50cGlwZShzZTQwMS0+ZGV2LCBTRTQwMV9CVVRUT05fRU5EUE9JTlQpLAorCQkgICAgJnNlNDAxLT5idXR0b24sIHNpemVvZihzZTQwMS0+YnV0dG9uKSwKKwkJICAgIHNlNDAxX2J1dHRvbl9pcnEsCisJCSAgICBzZTQwMSwKKwkJICAgIDgKKwkJKTsKKwkJaWYgKHVzYl9zdWJtaXRfdXJiKHNlNDAxLT5pbnR1cmIsIEdGUF9LRVJORUwpKSB7CisJCQlpbmZvKCJpbnQgdXJiIGJ1cm5lZCBkb3duIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZQorCQlzZTQwMS0+aW50dXJiPU5VTEw7CisKKyAgICAgICAgLyogRmxhc2ggdGhlIGxlZCAqLworICAgICAgICBzZTQwMV9zbmRjdHJsKDEsIHNlNDAxLCBTRTQwMV9SRVFfQ0FNRVJBX1BPV0VSLCAxLCBOVUxMLCAwKTsKKyAgICAgICAgc2U0MDFfc25kY3RybCgxLCBzZTQwMSwgU0U0MDFfUkVRX0xFRF9DT05UUk9MLCAxLCBOVUxMLCAwKTsKKyAgICAgICAgc2U0MDFfc25kY3RybCgxLCBzZTQwMSwgU0U0MDFfUkVRX0NBTUVSQV9QT1dFUiwgMCwgTlVMTCwgMCk7CisJc2U0MDFfc25kY3RybCgxLCBzZTQwMSwgU0U0MDFfUkVRX0xFRF9DT05UUk9MLCAwLCBOVUxMLCAwKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZTQwMV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisgICAgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKmludGVyZmFjZTsKKyAgICAgICAgc3RydWN0IHVzYl9zZTQwMSAqc2U0MDE7CisgICAgICAgIGNoYXIgKmNhbWVyYV9uYW1lPU5VTEw7CisJaW50IGJ1dHRvbj0xOworCisgICAgICAgIC8qIFdlIGRvbid0IGhhbmRsZSBtdWx0aS1jb25maWcgY2FtZXJhcyAqLworICAgICAgICBpZiAoZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyAhPSAxKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCisgICAgICAgIGludGVyZmFjZSA9ICZpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYzsKKworICAgICAgICAvKiBJcyBpdCBhbiBzZTQwMT8gKi8KKyAgICAgICAgaWYgKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gMHgwM2U4ICYmCisgICAgICAgICAgICBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSAweDAwMDQpIHsKKyAgICAgICAgICAgICAgICBjYW1lcmFfbmFtZT0iRW5kcG9pbnRzL0FveCBTRTQwMSI7CisgICAgICAgIH0gZWxzZSBpZiAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSAweDA0NzEgJiYKKyAgICAgICAgICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IDB4MDMwYikgeworICAgICAgICAgICAgICAgIGNhbWVyYV9uYW1lPSJQaGlsaXBzIFBDVkM2NjVLIjsKKyAgICAgICAgfSBlbHNlIGlmIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpID09IDB4MDQ3ZCAmJgorCSAgICBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSAweDUwMDEpIHsKKwkJY2FtZXJhX25hbWU9IktlbnNpbmd0b24gVmlkZW9DQU0gNjcwMTQiOworICAgICAgICB9IGVsc2UgaWYgKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gMHgwNDdkICYmCisJICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IDB4NTAwMikgeworCQljYW1lcmFfbmFtZT0iS2Vuc2luZ3RvbiBWaWRlb0NBTSA2NzAxKDUvNykiOworICAgICAgICB9IGVsc2UgaWYgKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gMHgwNDdkICYmCisJICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IDB4NTAwMykgeworCQljYW1lcmFfbmFtZT0iS2Vuc2luZ3RvbiBWaWRlb0NBTSA2NzAxNiI7CisJCWJ1dHRvbj0wOworCX0gZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgICAvKiBDaGVja2luZyB2ZW5kb3IvcHJvZHVjdCBzaG91bGQgYmUgZW5vdWdoLCBidXQgd2hhdCB0aGUgaGVsbCAqLworICAgICAgICBpZiAoaW50ZXJmYWNlLT5iSW50ZXJmYWNlQ2xhc3MgIT0gMHgwMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIGlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyAhPSAweDAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgICAvKiBXZSBmb3VuZCBvbmUgKi8KKyAgICAgICAgaW5mbygiU0U0MDEgY2FtZXJhIGZvdW5kOiAlcyIsIGNhbWVyYV9uYW1lKTsKKworICAgICAgICBpZiAoKHNlNDAxID0ga21hbGxvYyhzaXplb2YoKnNlNDAxKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIoImNvdWxkbid0IGttYWxsb2Mgc2U0MDEgc3RydWN0Iik7CisJCXJldHVybiAtRU5PTUVNOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KHNlNDAxLCAwLCBzaXplb2YoKnNlNDAxKSk7CisKKyAgICAgICAgc2U0MDEtPmRldiA9IGRldjsKKyAgICAgICAgc2U0MDEtPmlmYWNlID0gaW50ZXJmYWNlLT5iSW50ZXJmYWNlTnVtYmVyOworICAgICAgICBzZTQwMS0+Y2FtZXJhX25hbWUgPSBjYW1lcmFfbmFtZTsKKworCWluZm8oImZpcm13YXJlIHZlcnNpb246ICUwMngiLCBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSAmIDI1NSk7CisKKyAgICAgICAgaWYgKHNlNDAxX2luaXQoc2U0MDEsIGJ1dHRvbikpIHsKKwkJa2ZyZWUoc2U0MDEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1jcHkoJnNlNDAxLT52ZGV2LCAmc2U0MDFfdGVtcGxhdGUsIHNpemVvZihzZTQwMV90ZW1wbGF0ZSkpOworCW1lbWNweShzZTQwMS0+dmRldi5uYW1lLCBzZTQwMS0+Y2FtZXJhX25hbWUsIHN0cmxlbihzZTQwMS0+Y2FtZXJhX25hbWUpKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZTQwMS0+d3EpOworCWluaXRfTVVURVgoJnNlNDAxLT5sb2NrKTsKKwl3bWIoKTsKKworCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnNlNDAxLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucikgPT0gLTEpIHsKKwkJa2ZyZWUoc2U0MDEpOworCQllcnIoInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWluZm8oInJlZ2lzdGVyZWQgbmV3IHZpZGVvIGRldmljZTogdmlkZW8lZCIsIHNlNDAxLT52ZGV2Lm1pbm9yKTsKKworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIHNlNDAxKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlNDAxX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOworCWlmIChzZTQwMSkgeworCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmc2U0MDEtPnZkZXYpOworCQlpZiAoIXNlNDAxLT51c2VyKXsKKwkJCXVzYl9zZTQwMV9yZW1vdmVfZGlzY29ubmVjdGVkKHNlNDAxKTsKKwkJfSBlbHNlIHsKKwkJCXNlNDAxLT5mcmFtZVswXS5ncmFic3RhdGUgPSBGUkFNRV9FUlJPUjsKKwkJCXNlNDAxLT5mcmFtZVswXS5ncmFic3RhdGUgPSBGUkFNRV9FUlJPUjsKKworCQkJc2U0MDEtPnN0cmVhbWluZyA9IDA7CisKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2U0MDEtPndxKTsKKwkJCXNlNDAxLT5yZW1vdmVkID0gMTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNlNDAxX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisgICAgICAgIC5uYW1lCQk9ICJzZTQwMSIsCisgICAgICAgIC5pZF90YWJsZQk9IGRldmljZV90YWJsZSwKKwkucHJvYmUJCT0gc2U0MDFfcHJvYmUsCisgICAgICAgIC5kaXNjb25uZWN0CT0gc2U0MDFfZGlzY29ubmVjdCwKK307CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBNb2R1bGUgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCB1c2Jfc2U0MDFfaW5pdCh2b2lkKQoreworCWluZm8oIlNFNDAxIHVzYiBjYW1lcmEgZHJpdmVyIHZlcnNpb24gJXMgcmVnaXN0ZXJpbmciLCB2ZXJzaW9uKTsKKwlpZiAoZmxpY2tlcmxlc3MpCisJCWlmIChmbGlja2VybGVzcyE9NTAgJiYgZmxpY2tlcmxlc3MhPTYwKSB7CisJCQlpbmZvKCJJbnZhbGxpZCBmbGlja2VybGVzcyB2YWx1ZSwgdXNlIDAsIDUwIG9yIDYwLiIpOworCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZzZTQwMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX3NlNDAxX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmc2U0MDFfZHJpdmVyKTsKKwlpbmZvKCJTRTQwMSBkcml2ZXIgZGVyZWdpc3RlcmVkIik7Cit9CisKK21vZHVsZV9pbml0KHVzYl9zZTQwMV9pbml0KTsKK21vZHVsZV9leGl0KHVzYl9zZTQwMV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NlNDAxLmggYi9kcml2ZXJzL3VzYi9tZWRpYS9zZTQwMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTg0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zZTQwMS5oCkBAIC0wLDAgKzEsMjMzIEBACisKKyNpZm5kZWYgX19MSU5VWF9zZTQwMV9ICisjZGVmaW5lIF9fTElOVVhfc2U0MDFfSAorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNkZWZpbmUgc2U0MDFfREVCVUcJLyogVHVybiBvbiBkZWJ1ZyBtZXNzYWdlcyAqLworCisjaWZkZWYgc2U0MDFfREVCVUcKKyMgIGRlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAoraWYgKGRlYnVnID49IGxldmVsKSBpbmZvKCJbIiBfX1BSRVRUWV9GVU5DVElPTl9fICI6JWRdICIgZm10LCBfX0xJTkVfXyAsICMjIGFyZ3MpCisjZWxzZQorIyAgZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIEFuIGFsbW9zdCBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBzbGVlcF9vbl9pbnRlcnJ1cHRpYmxlICovCisjZGVmaW5lIHdhaXRfaW50ZXJydXB0aWJsZSh0ZXN0LCBxdWV1ZSwgd2FpdCkgXAoreyBcCisJYWRkX3dhaXRfcXVldWUocXVldWUsIHdhaXQpOyBcCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsgXAorCWlmICh0ZXN0KSBcCisJCXNjaGVkdWxlKCk7IFwKKwlyZW1vdmVfd2FpdF9xdWV1ZShxdWV1ZSwgd2FpdCk7IFwKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOyBcCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSBcCisJCWJyZWFrOyBcCit9CisKKyNkZWZpbmUgU0U0MDFfUkVRX0dFVF9DQU1FUkFfREVTQ1JJUFRPUgkJMHgwNgorI2RlZmluZSBTRTQwMV9SRVFfU1RBUlRfQ09OVElOVU9VU19DQVBUVVJFCTB4NDEKKyNkZWZpbmUgU0U0MDFfUkVRX1NUT1BfQ09OVElOVU9VU19DQVBUVVJFCTB4NDIKKyNkZWZpbmUgU0U0MDFfUkVRX0NBUFRVUkVfRlJBTUUJCQkweDQzCisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfQlJUCQkJMHg0NAorI2RlZmluZSBTRTQwMV9SRVFfU0VUX0JSVAkJCTB4NDUKKyNkZWZpbmUgU0U0MDFfUkVRX0dFVF9XSURUSAkJCTB4NGMKKyNkZWZpbmUgU0U0MDFfUkVRX1NFVF9XSURUSAkJCTB4NGQKKyNkZWZpbmUgU0U0MDFfUkVRX0dFVF9IRUlHSFQJCQkweDRlCisjZGVmaW5lIFNFNDAxX1JFUV9TRVRfSEVJR0hUCQkJMHg0ZgorI2RlZmluZSBTRTQwMV9SRVFfR0VUX09VVFBVVF9NT0RFCQkweDUwCisjZGVmaW5lIFNFNDAxX1JFUV9TRVRfT1VUUFVUX01PREUJCTB4NTEKKyNkZWZpbmUgU0U0MDFfUkVRX0dFVF9FWFRfRkVBVFVSRQkJMHg1MgorI2RlZmluZSBTRTQwMV9SRVFfU0VUX0VYVF9GRUFUVVJFCQkweDUzCisjZGVmaW5lIFNFNDAxX1JFUV9DQU1FUkFfUE9XRVIJCQkweDU2CisjZGVmaW5lIFNFNDAxX1JFUV9MRURfQ09OVFJPTAkJCTB4NTcKKyNkZWZpbmUgU0U0MDFfUkVRX0JJT1MJCQkJMHhmZgorCisjZGVmaW5lIFNFNDAxX0JJT1NfUkVBRAkJCQkweDA3CisKKyNkZWZpbmUgU0U0MDFfRk9STUFUX0JBWUVSCTB4NDAKKworLyogSHl1bmRhaSBodjcxMzFiIHJlZ2lzdGVycworICAgNzEyMSBhbmQgNzE0MSBzaG91bGQgYmUgdGhlIHNhbWUgKGhhdmVuJ3QgcmVhbGx5IGNoZWNrZWQuLi4pICovCisvKiBNb2RlIHJlZ2lzdGVyczogKi8KKyNkZWZpbmUgSFY3MTMxX1JFR19NT0RFX0EJCTB4MDAKKyNkZWZpbmUgSFY3MTMxX1JFR19NT0RFX0IJCTB4MDEKKyNkZWZpbmUgSFY3MTMxX1JFR19NT0RFX0MJCTB4MDIKKy8qIEZyYW1lIHJlZ2lzdGVyczogKi8KKyNkZWZpbmUgSFY3MTMxX1JFR19GUlNVCQkweDEwCisjZGVmaW5lIEhWNzEzMV9SRUdfRlJTTAkJMHgxMQorI2RlZmluZSBIVjcxMzFfUkVHX0ZDU1UJCTB4MTIKKyNkZWZpbmUgSFY3MTMxX1JFR19GQ1NMCQkweDEzCisjZGVmaW5lIEhWNzEzMV9SRUdfRldIVQkJMHgxNAorI2RlZmluZSBIVjcxMzFfUkVHX0ZXSEwJCTB4MTUKKyNkZWZpbmUgSFY3MTMxX1JFR19GV1dVCQkweDE2CisjZGVmaW5lIEhWNzEzMV9SRUdfRldXTAkJMHgxNworLyogVGltaW5nIHJlZ2lzdGVyczogKi8KKyNkZWZpbmUgSFY3MTMxX1JFR19USEJVCQkweDIwCisjZGVmaW5lIEhWNzEzMV9SRUdfVEhCTAkJMHgyMQorI2RlZmluZSBIVjcxMzFfUkVHX1RWQlUJCTB4MjIKKyNkZWZpbmUgSFY3MTMxX1JFR19UVkJMCQkweDIzCisjZGVmaW5lIEhWNzEzMV9SRUdfVElUVQkJMHgyNQorI2RlZmluZSBIVjcxMzFfUkVHX1RJVE0JCTB4MjYKKyNkZWZpbmUgSFY3MTMxX1JFR19USVRMCQkweDI3CisjZGVmaW5lIEhWNzEzMV9SRUdfVE1DRAkJMHgyOAorLyogQWRqdXN0IFJlZ2lzdGVyczogKi8KKyNkZWZpbmUgSFY3MTMxX1JFR19BUkxWCQkweDMwCisjZGVmaW5lIEhWNzEzMV9SRUdfQVJDRwkJMHgzMQorI2RlZmluZSBIVjcxMzFfUkVHX0FHQ0cJCTB4MzIKKyNkZWZpbmUgSFY3MTMxX1JFR19BQkNHCQkweDMzCisjZGVmaW5lIEhWNzEzMV9SRUdfQVBCVgkJMHgzNAorI2RlZmluZSBIVjcxMzFfUkVHX0FTTFAJCTB4NTQKKy8qIE9mZnNldCBSZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfT0ZTUgkJMHg1MAorI2RlZmluZSBIVjcxMzFfUkVHX09GU0cJCTB4NTEKKyNkZWZpbmUgSFY3MTMxX1JFR19PRlNCCQkweDUyCisvKiBSRXNldCBsZXZlbCBzdGF0aXN0aWNzIHJlZ2lzdGVyczogKi8KKyNkZWZpbmUgSFY3MTMxX1JFR19MT1JFRk5PSAkweDU3CisjZGVmaW5lIEhWNzEzMV9SRUdfTE9SRUZOT0wJMHg1OAorI2RlZmluZSBIVjcxMzFfUkVHX0hJUkVGTk9ICTB4NTkKKyNkZWZpbmUgSFY3MTMxX1JFR19ISVJFRk5PTAkweDVhCisKKy8qIHNlNDAxIHJlZ2lzdGVycyAqLworI2RlZmluZSBTRTQwMV9PUEVSQVRJTkdNT0RFCTB4MjAwMAorCisKKy8qIHNpemUgb2YgdXNiIHRyYW5zZmVycyAqLworI2RlZmluZSBTRTQwMV9QQUNLRVRTSVpFCTQwOTYKKy8qIG51bWJlciBvZiBxdWV1ZWQgYnVsayB0cmFuc2ZlcnMgdG8gdXNlLCBzaG91bGQgYmUgYWJvdXQgOCAqLworI2RlZmluZSBTRTQwMV9OVU1TQlVGCQkxCisvKiByZWFkIHRoZSB1c2Igc3BlY3MgZm9yIHRoaXMgb25lIDopICovCisjZGVmaW5lIFNFNDAxX1ZJREVPX0VORFBPSU5UCTEKKyNkZWZpbmUgU0U0MDFfQlVUVE9OX0VORFBPSU5UCTIKKy8qIG51bWJlciBvZiBmcmFtZXMgc3VwcG9ydGVkIGJ5IHRoZSB2NGwgcGFydCAqLworI2RlZmluZSBTRTQwMV9OVU1GUkFNRVMJCTIKKy8qIHNjcmF0Y2ggYnVmZmVycyBmb3IgcGFzc2luZyBkYXRhIHRvIHRoZSBkZWNvZGVycyAqLworI2RlZmluZSBTRTQwMV9OVU1TQ1JBVENICTMyCisvKiBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIGluIGEgSmFuZ0d1IHBhY2tldCAqLworI2RlZmluZSBTRTQwMV9WTENEQVRBTEVOCTEwMjQKKy8qIG51bWJlciBvZiBudWwgc2l6ZWQgcGFja2V0cyB0byByZWNlaXZlIGJlZm9yZSBraWNraW5nIHRoZSBjYW1lcmEgKi8KKyNkZWZpbmUgU0U0MDFfTUFYX05VTExQQUNLRVRTCTQwMDAKKy8qIG51bWJlciBvZiBkZWNvZGluZyBlcnJvcnMgYmVmb3JlIGtpY2tpbmcgdGhlIGNhbWVyYSAqLworI2RlZmluZSBTRTQwMV9NQVhfRVJST1JTCTIwMAorCitzdHJ1Y3QgdXNiX2RldmljZTsKKworc3RydWN0IHNlNDAxX3NidWYgeworCXVuc2lnbmVkIGNoYXIgKmRhdGE7Cit9OworCitlbnVtIHsKKwlGUkFNRV9VTlVTRUQsCQkvKiBVbnVzZWQgKG5vIE1DQVBUVVJFKSAqLworCUZSQU1FX1JFQURZLAkJLyogUmVhZHkgdG8gc3RhcnQgZ3JhYmJpbmcgKi8KKwlGUkFNRV9HUkFCQklORywJCS8qIEluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGdyYWJiZWQgaW50byAqLworCUZSQU1FX0RPTkUsCQkvKiBGaW5pc2hlZCBncmFiYmluZywgYnV0IG5vdCBiZWVuIHN5bmNlZCB5ZXQgKi8KKwlGUkFNRV9FUlJPUiwJCS8qIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQgd2hpbGUgcHJvY2Vzc2luZyAqLworfTsKKworZW51bSB7CisJRk1UX0JBWUVSLAorCUZNVF9KQU5HR1UsCit9OworCitlbnVtIHsKKwlCVUZGRVJfVU5VU0VELAorCUJVRkZFUl9SRUFEWSwKKwlCVUZGRVJfQlVTWSwKKwlCVUZGRVJfRE9ORSwKK307CisKK3N0cnVjdCBzZTQwMV9zY3JhdGNoIHsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXZvbGF0aWxlIGludCBzdGF0ZTsKKwlpbnQgb2Zmc2V0OworCWludCBsZW5ndGg7Cit9OworCitzdHJ1Y3Qgc2U0MDFfZnJhbWUgeworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CQkvKiBGcmFtZSBidWZmZXIgKi8KKworCXZvbGF0aWxlIGludCBncmFic3RhdGU7CS8qIFN0YXRlIG9mIGdyYWJiaW5nICovCisKKwl1bnNpZ25lZCBjaGFyICpjdXJsaW5lOworCWludCBjdXJsaW5lcGl4OworCWludCBjdXJwaXg7Cit9OworCitzdHJ1Y3QgdXNiX3NlNDAxIHsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CisKKwkvKiBEZXZpY2Ugc3RydWN0dXJlICovCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKworCXVuc2lnbmVkIGNoYXIgaWZhY2U7CisKKwljaGFyICpjYW1lcmFfbmFtZTsKKworCWludCBjaGFuZ2U7CisJaW50IGJyaWdodG5lc3M7CisJaW50IGh1ZTsKKwlpbnQgcmdhaW47CisJaW50IGdnYWluOworCWludCBiZ2FpbjsKKwlpbnQgZXhwb3NlX2g7CisJaW50IGV4cG9zZV9tOworCWludCBleHBvc2VfbDsKKwlpbnQgcmVzZXRsZXZlbDsKKwkKKwlpbnQgZW5oYW5jZTsKKworCWludCBmb3JtYXQ7CisJaW50IHNpemVzOworCWludCAqd2lkdGg7CisJaW50ICpoZWlnaHQ7CisJaW50IGN3aWR0aDsJCS8qIGN1cnJlbnQgd2lkdGggKi8KKwlpbnQgY2hlaWdodDsJCS8qIGN1cnJlbnQgaGVpZ2h0ICovCisJaW50IHBhbGV0dGU7CisJaW50IG1heGZyYW1lc2l6ZTsKKwlpbnQgY2ZyYW1lc2l6ZTsJCS8qIGN1cnJlbnQgZnJhbWVzaXplICovCisKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJaW50IHVzZXI7CQkvKiB1c2VyIGNvdW50IGZvciBleGNsdXNpdmUgdXNlICovCisJaW50IHJlbW92ZWQ7CQkvKiBkZXZpY2UgZGlzY29ubmVjdGVkICovCisKKwlpbnQgc3RyZWFtaW5nOwkJLyogQXJlIHdlIHN0cmVhbWluZyB2aWRlbz8gKi8KKworCWNoYXIgKmZidWY7CQkvKiBWaWRlb2RldiBidWZmZXIgYXJlYSAqLworCisJc3RydWN0IHVyYiAqdXJiW1NFNDAxX05VTVNCVUZdOworCXN0cnVjdCB1cmIgKmludHVyYjsKKwkKKwlpbnQgYnV0dG9uOworCWludCBidXR0b25wcmVzc2VkOworCisJaW50IGN1cmZyYW1lOwkJLyogQ3VycmVudCByZWNlaXZpbmcgZnJhbWUgKi8KKwlzdHJ1Y3Qgc2U0MDFfZnJhbWUgZnJhbWVbU0U0MDFfTlVNRlJBTUVTXTsJCisJaW50IHJlYWRjb3VudDsKKwlpbnQgZnJhbWVjb3VudDsKKwlpbnQgZXJyb3I7CisJaW50IGRyb3BwZWQ7CisKKwlpbnQgc2NyYXRjaF9uZXh0OworCWludCBzY3JhdGNoX3VzZTsKKwlpbnQgc2NyYXRjaF9vdmVyZmxvdzsKKwlzdHJ1Y3Qgc2U0MDFfc2NyYXRjaCBzY3JhdGNoW1NFNDAxX05VTVNDUkFUQ0hdOworCisJLyogRGVjb2RlciBzcGVjaWZpYyBkYXRhOiAqLworCXVuc2lnbmVkIGNoYXIgdmxjZGF0YVtTRTQwMV9WTENEQVRBTEVOXTsKKwlpbnQgdmxjZGF0YXBvczsKKwlpbnQgYmF5ZXJvZmZzZXQ7CisKKwlzdHJ1Y3Qgc2U0MDFfc2J1ZiBzYnVmW1NFNDAxX05VTVNCVUZdOworCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CS8qIFByb2Nlc3NlcyB3YWl0aW5nICovCisKKwlpbnQgbnVsbHBhY2tldHM7Cit9OworCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDIuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhhNGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMi5oCkBAIC0wLDAgKzEsMjA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWNEwyIGRyaXZlciBmb3IgU045QzEweCBQQyBDYW1lcmEgQ29udHJvbGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TTjlDMTAyX0hfCisjZGVmaW5lIF9TTjlDMTAyX0hfCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTTjlDMTAyX0RFQlVHCisjZGVmaW5lIFNOOUMxMDJfREVCVUdfTEVWRUwgICAgICAgMgorI2RlZmluZSBTTjlDMTAyX01BWF9ERVZJQ0VTICAgICAgIDY0CisjZGVmaW5lIFNOOUMxMDJfUFJFU0VSVkVfSU1HU0NBTEUgMAorI2RlZmluZSBTTjlDMTAyX0ZPUkNFX01VTk1BUCAgICAgIDAKKyNkZWZpbmUgU045QzEwMl9NQVhfRlJBTUVTICAgICAgICAzMgorI2RlZmluZSBTTjlDMTAyX1VSQlMgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU045QzEwMl9JU09fUEFDS0VUUyAgICAgICA3CisjZGVmaW5lIFNOOUMxMDJfQUxURVJOQVRFX1NFVFRJTkcgOAorI2RlZmluZSBTTjlDMTAyX1VSQl9USU1FT1VUICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMiAqIFNOOUMxMDJfSVNPX1BBQ0tFVFMpCisjZGVmaW5lIFNOOUMxMDJfQ1RSTF9USU1FT1VUICAgICAgMzAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTTjlDMTAyX01PRFVMRV9OQU1FICAgICAiVjRMMiBkcml2ZXIgZm9yIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzIgorI2RlZmluZSBTTjlDMTAyX01PRFVMRV9BVVRIT1IgICAiKEMpIDIwMDQtMjAwNSBMdWNhIFJpc29saWEiCisjZGVmaW5lIFNOOUMxMDJfQVVUSE9SX0VNQUlMICAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCisjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX0xJQ0VOU0UgICJHUEwiCisjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04gICIxOjEuMjQiCisjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT05fQ09ERSAgS0VSTkVMX1ZFUlNJT04oMSwgMCwgMjQpCisKK2VudW0gc245YzEwMl9icmlkZ2UgeworCUJSSURHRV9TTjlDMTAxID0gMHgwMSwKKwlCUklER0VfU045QzEwMiA9IDB4MDIsCisJQlJJREdFX1NOOUMxMDMgPSAweDA0LAorfTsKKworU045QzEwMl9JRF9UQUJMRQorU045QzEwMl9TRU5TT1JfVEFCTEUKKworZW51bSBzbjljMTAyX2ZyYW1lX3N0YXRlIHsKKwlGX1VOVVNFRCwKKwlGX1FVRVVFRCwKKwlGX0dSQUJCSU5HLAorCUZfRE9ORSwKKwlGX0VSUk9SLAorfTsKKworc3RydWN0IHNuOWMxMDJfZnJhbWVfdCB7CisJdm9pZCogYnVmbWVtOworCXN0cnVjdCB2NGwyX2J1ZmZlciBidWY7CisJZW51bSBzbjljMTAyX2ZyYW1lX3N0YXRlIHN0YXRlOworCXN0cnVjdCBsaXN0X2hlYWQgZnJhbWU7CisJdW5zaWduZWQgbG9uZyB2bWFfdXNlX2NvdW50OworfTsKKworZW51bSBzbjljMTAyX2Rldl9zdGF0ZSB7CisJREVWX0lOSVRJQUxJWkVEID0gMHgwMSwKKwlERVZfRElTQ09OTkVDVEVEID0gMHgwMiwKKwlERVZfTUlTQ09ORklHVVJFRCA9IDB4MDQsCit9OworCitlbnVtIHNuOWMxMDJfaW9fbWV0aG9kIHsKKwlJT19OT05FLAorCUlPX1JFQUQsCisJSU9fTU1BUCwKK307CisKK2VudW0gc245YzEwMl9zdHJlYW1fc3RhdGUgeworCVNUUkVBTV9PRkYsCisJU1RSRUFNX0lOVEVSUlVQVCwKKwlTVFJFQU1fT04sCit9OworCit0eXBlZGVmIGNoYXIgc245YzEwMl9zb2ZfaGVhZGVyX3RbMTJdOwordHlwZWRlZiBjaGFyIHNuOWMxMDJfZW9mX2hlYWRlcl90WzRdOworCitzdHJ1Y3Qgc245YzEwMl9zeXNmc19hdHRyIHsKKwl1OCByZWcsIGkyY19yZWc7CisJc245YzEwMl9zb2ZfaGVhZGVyX3QgZnJhbWVfaGVhZGVyOworfTsKKworc3RydWN0IHNuOWMxMDJfbW9kdWxlX3BhcmFtIHsKKwl1OCBmb3JjZV9tdW5tYXA7Cit9OworCitzdGF0aWMgREVDTEFSRV9NVVRFWChzbjljMTAyX3N5c2ZzX2xvY2spOworc3RhdGljIERFQ0xBUkVfUldTRU0oc245YzEwMl9kaXNjb25uZWN0KTsKKworc3RydWN0IHNuOWMxMDJfZGV2aWNlIHsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKworCXN0cnVjdCB2aWRlb19kZXZpY2UqIHY0bGRldjsKKworCWVudW0gc245YzEwMl9icmlkZ2UgYnJpZGdlOworCXN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yOworCisJc3RydWN0IHVzYl9kZXZpY2UqIHVzYmRldjsKKwlzdHJ1Y3QgdXJiKiB1cmJbU045QzEwMl9VUkJTXTsKKwl2b2lkKiB0cmFuc2Zlcl9idWZmZXJbU045QzEwMl9VUkJTXTsKKwl1OCogY29udHJvbF9idWZmZXI7CisKKwlzdHJ1Y3Qgc245YzEwMl9mcmFtZV90ICpmcmFtZV9jdXJyZW50LCBmcmFtZVtTTjlDMTAyX01BWF9GUkFNRVNdOworCXN0cnVjdCBsaXN0X2hlYWQgaW5xdWV1ZSwgb3V0cXVldWU7CisJdTMyIGZyYW1lX2NvdW50LCBuYnVmZmVycywgbnJlYWRidWZmZXJzOworCisJZW51bSBzbjljMTAyX2lvX21ldGhvZCBpbzsKKwllbnVtIHNuOWMxMDJfc3RyZWFtX3N0YXRlIHN0cmVhbTsKKworCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiBjb21wcmVzc2lvbjsKKworCXN0cnVjdCBzbjljMTAyX3N5c2ZzX2F0dHIgc3lzZnM7CisJc245YzEwMl9zb2ZfaGVhZGVyX3Qgc29mX2hlYWRlcjsKKwl1MTYgcmVnWzMyXTsKKworCXN0cnVjdCBzbjljMTAyX21vZHVsZV9wYXJhbSBtb2R1bGVfcGFyYW07CisKKwllbnVtIHNuOWMxMDJfZGV2X3N0YXRlIHN0YXRlOworCXU4IHVzZXJzOworCisJc3RydWN0IHNlbWFwaG9yZSBkZXZfc2VtLCBmaWxlb3Bfc2VtOworCXNwaW5sb2NrX3QgcXVldWVfbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuLCB3YWl0X2ZyYW1lLCB3YWl0X3N0cmVhbTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorc245YzEwMl9hdHRhY2hfc2Vuc29yKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yKQoreworCWNhbS0+c2Vuc29yID0gc2Vuc29yOworCWNhbS0+c2Vuc29yLT5kZXYgPSAmY2FtLT5kZXY7CisJY2FtLT5zZW5zb3ItPnVzYmRldiA9IGNhbS0+dXNiZGV2OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyN1bmRlZiBEQkcKKyN1bmRlZiBLREJHCisjaWZkZWYgU045QzEwMl9ERUJVRworIwlkZWZpbmUgREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmICgobGV2ZWwpID09IDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJZGV2X2VycigmY2FtLT5kZXYsIGZtdCAiXG4iLCAjIyBhcmdzKTsgICAgICAgICAgICAgICAgXAorCQllbHNlIGlmICgobGV2ZWwpID09IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWRldl9pbmZvKCZjYW0tPmRldiwgZm10ICJcbiIsICMjIGFyZ3MpOyAgICAgICAgICAgICAgIFwKKwkJZWxzZSBpZiAoKGxldmVsKSA+PSAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlkZXZfaW5mbygmY2FtLT5kZXYsICJbJXM6JWRdICIgZm10ICJcbiIsICAgICAgICAgICAgICBcCisJCQkgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fICwgIyMgYXJncyk7ICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyMJZGVmaW5lIEtEQkcobGV2ZWwsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoZGVidWcgPj0gKGxldmVsKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoKGxldmVsKSA9PSAxIHx8IChsZXZlbCkgPT0gMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCXByX2luZm8oInNuOWMxMDI6ICIgZm10ICJcbiIsICMjIGFyZ3MpOyAgICAgICAgICAgICAgIFwKKwkJZWxzZSBpZiAoKGxldmVsKSA9PSAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlwcl9kZWJ1Zygic245YzEwMjogWyVzOiVkXSAiIGZtdCAiXG4iLCBfX0ZVTkNUSU9OX18sICBcCisJCQkgICAgICAgICBfX0xJTkVfXyAsICMjIGFyZ3MpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlCisjCWRlZmluZSBLREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKTsKKyMJZGVmaW5lIERCRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7O30gd2hpbGUoMCk7CisjZW5kaWYKKworI3VuZGVmIFBEQkcKKyNkZWZpbmUgUERCRyhmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2Rldl9pbmZvKCZjYW0tPmRldiwgIlslczolZF0gIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyAsICMjIGFyZ3MpOworCisjdW5kZWYgUERCR0cKKyNkZWZpbmUgUERCR0coZm10LCBhcmdzLi4uKSBkbyB7O30gd2hpbGUoMCk7IC8qIHBsYWNlaG9sZGVyICovCisKKyNlbmRpZiAvKiBfU045QzEwMl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9jb3JlLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg0MDFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9jb3JlLmMKQEAgLTAsMCArMSwyNzQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWNEwyIGRyaXZlciBmb3IgU045QzEweCBQQyBDYW1lcmEgQ29udHJvbGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAic245YzEwMi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBzbjljMTAyX2lkX3RhYmxlKTsKKworTU9EVUxFX0FVVEhPUihTTjlDMTAyX01PRFVMRV9BVVRIT1IgIiAiIFNOOUMxMDJfQVVUSE9SX0VNQUlMKTsKK01PRFVMRV9ERVNDUklQVElPTihTTjlDMTAyX01PRFVMRV9OQU1FKTsKK01PRFVMRV9WRVJTSU9OKFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoU045QzEwMl9NT0RVTEVfTElDRU5TRSk7CisKK3N0YXRpYyBzaG9ydCB2aWRlb19ucltdID0ge1swIC4uLiBTTjlDMTAyX01BWF9ERVZJQ0VTLTFdID0gLTF9OworbW9kdWxlX3BhcmFtX2FycmF5KHZpZGVvX25yLCBzaG9ydCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLAorICAgICAgICAgICAgICAgICAiXG48LTF8blssLi4uXT4gU3BlY2lmeSBWNEwyIG1pbm9yIG1vZGUgbnVtYmVyLiIKKyAgICAgICAgICAgICAgICAgIlxuIC0xID0gdXNlIG5leHQgYXZhaWxhYmxlIChkZWZhdWx0KSIKKyAgICAgICAgICAgICAgICAgIlxuICBuID0gdXNlIG1pbm9yIG51bWJlciBuIChpbnRlZ2VyID49IDApIgorICAgICAgICAgICAgICAgICAiXG5Zb3UgY2FuIHNwZWNpZnkgdXAgdG8gIl9fTU9EVUxFX1NUUklORyhTTjlDMTAyX01BWF9ERVZJQ0VTKQorICAgICAgICAgICAgICAgICAiIGNhbWVyYXMgdGhpcyB3YXkuIgorICAgICAgICAgICAgICAgICAiXG5Gb3IgZXhhbXBsZToiCisgICAgICAgICAgICAgICAgICJcbnZpZGVvX25yPS0xLDIsLTEgd291bGQgYXNzaWduIG1pbm9yIG51bWJlciAyIHRvIgorICAgICAgICAgICAgICAgICAiXG50aGUgc2Vjb25kIGNhbWVyYSBhbmQgdXNlIGF1dG8gZm9yIHRoZSBmaXJzdCIKKyAgICAgICAgICAgICAgICAgIlxub25lIGFuZCBmb3IgZXZlcnkgb3RoZXIgY2FtZXJhLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CisKK3N0YXRpYyBzaG9ydCBmb3JjZV9tdW5tYXBbXSA9IHtbMCAuLi4gU045QzEwMl9NQVhfREVWSUNFUy0xXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOOUMxMDJfRk9SQ0VfTVVOTUFQfTsKK21vZHVsZV9wYXJhbV9hcnJheShmb3JjZV9tdW5tYXAsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9tdW5tYXAsCisgICAgICAgICAgICAgICAgICJcbjwwfDFbLC4uLl0+IEZvcmNlIHRoZSBhcHBsaWNhdGlvbiB0byB1bm1hcCBwcmV2aW91c2x5ICIKKyAgICAgICAgICAgICAgICAgIlxubWFwcGVkIGJ1ZmZlciBtZW1vcnkgYmVmb3JlIGNhbGxpbmcgYW55IFZJRElPQ19TX0NST1Agb3IgIgorICAgICAgICAgICAgICAgICAiXG5WSURJT0NfU19GTVQgaW9jdGwncy4gTm90IGFsbCB0aGUgYXBwbGljYXRpb25zIHN1cHBvcnQgIgorICAgICAgICAgICAgICAgICAiXG50aGlzIGZlYXR1cmUuIFRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmljIGZvciBlYWNoICIKKyAgICAgICAgICAgICAgICAgIlxuZGV0ZWN0ZWQgY2FtZXJhLiIKKyAgICAgICAgICAgICAgICAgIlxuIDAgPSBkbyBub3QgZm9yY2UgbWVtb3J5IHVubWFwcGluZyIKKyAgICAgICAgICAgICAgICAgIlxuIDEgPSBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nIChzYXZlIG1lbW9yeSkiCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhTTjlDMTAyX0ZPUkNFX01VTk1BUCkiLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CisKKyNpZmRlZiBTTjlDMTAyX0RFQlVHCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZGVidWcgPSBTTjlDMTAyX0RFQlVHX0xFVkVMOworbW9kdWxlX3BhcmFtKGRlYnVnLCB1c2hvcnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywKKyAgICAgICAgICAgICAgICAgIlxuPG4+IERlYnVnZ2luZyBpbmZvcm1hdGlvbiBsZXZlbCwgZnJvbSAwIHRvIDM6IgorICAgICAgICAgICAgICAgICAiXG4wID0gbm9uZSAodXNlIGNhcmVmdWxseSkiCisgICAgICAgICAgICAgICAgICJcbjEgPSBjcml0aWNhbCBlcnJvcnMiCisgICAgICAgICAgICAgICAgICJcbjIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMiCisgICAgICAgICAgICAgICAgICJcbjMgPSBtb3JlIHZlcmJvc2UgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgICJcbkxldmVsIDMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9ubHksIHdoZW4gb25seSAiCisgICAgICAgICAgICAgICAgICJvbmUgZGV2aWNlIGlzIHVzZWQuIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoU045QzEwMl9ERUJVR19MRVZFTCkiLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc245YzEwMl9zb2ZfaGVhZGVyX3Qgc245YzEwMl9zb2ZfaGVhZGVyW10gPSB7CisJezB4ZmYsIDB4ZmYsIDB4MDAsIDB4YzQsIDB4YzQsIDB4OTYsIDB4MDB9LAorCXsweGZmLCAweGZmLCAweDAwLCAweGM0LCAweGM0LCAweDk2LCAweDAxfSwKK307CisKKworc3RhdGljIHNuOWMxMDJfZW9mX2hlYWRlcl90IHNuOWMxMDJfZW9mX2hlYWRlcltdID0geworCXsweDAwLCAweDAwLCAweDAwLCAweDAwfSwKKwl7MHg0MCwgMHgwMCwgMHgwMCwgMHgwMH0sCisJezB4ODAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCXsweGMwLCAweDAwLCAweDAwLCAweDAwfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQqIHJ2bWFsbG9jKHNpemVfdCBzaXplKQoreworCXZvaWQqIG1lbTsKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCisJbWVtID0gdm1hbGxvY18zMigodW5zaWduZWQgbG9uZylzaXplKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQobWVtLCAwLCBzaXplKTsKKworCWFkciA9ICh1bnNpZ25lZCBsb25nKW1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gbWVtOworfQorCisKK3N0YXRpYyB2b2lkIHJ2ZnJlZSh2b2lkKiBtZW0sIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJaWYgKCFtZW0pCisJCXJldHVybjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpbWVtOworCXdoaWxlIChzaXplID4gMCkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJYWRyICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCisJdmZyZWUobWVtKTsKK30KKworCitzdGF0aWMgdTMyIAorc245YzEwMl9yZXF1ZXN0X2J1ZmZlcnMoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHUzMiBjb3VudCwgCisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHNuOWMxMDJfaW9fbWV0aG9kIGlvKQoreworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHAgPSAmKGNhbS0+c2Vuc29yLT5waXhfZm9ybWF0KTsKKwlzdHJ1Y3QgdjRsMl9yZWN0KiByID0gJihjYW0tPnNlbnNvci0+Y3JvcGNhcC5ib3VuZHMpOworCWNvbnN0IHNpemVfdCBpbWFnZXNpemUgPSBjYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXAgfHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgaW8gPT0gSU9fUkVBRCA/CisJICAgICAgICAgICAgICAgICAgICAgICAgIChwLT53aWR0aCAqIHAtPmhlaWdodCAqIHAtPnByaXYpIC8gOCA6CisJICAgICAgICAgICAgICAgICAgICAgICAgIChyLT53aWR0aCAqIHItPmhlaWdodCAqIHAtPnByaXYpIC8gODsKKwl2b2lkKiBidWZmID0gTlVMTDsKKwl1MzIgaTsKKworCWlmIChjb3VudCA+IFNOOUMxMDJfTUFYX0ZSQU1FUykKKwkJY291bnQgPSBTTjlDMTAyX01BWF9GUkFNRVM7CisKKwljYW0tPm5idWZmZXJzID0gY291bnQ7CisJd2hpbGUgKGNhbS0+bmJ1ZmZlcnMgPiAwKSB7CisJCWlmICgoYnVmZiA9IHJ2bWFsbG9jKGNhbS0+bmJ1ZmZlcnMgKiBQQUdFX0FMSUdOKGltYWdlc2l6ZSkpKSkKKwkJCWJyZWFrOworCQljYW0tPm5idWZmZXJzLS07CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZmZlcnM7IGkrKykgeworCQljYW0tPmZyYW1lW2ldLmJ1Zm1lbSA9IGJ1ZmYgKyBpKlBBR0VfQUxJR04oaW1hZ2VzaXplKTsKKwkJY2FtLT5mcmFtZVtpXS5idWYuaW5kZXggPSBpOworCQljYW0tPmZyYW1lW2ldLmJ1Zi5tLm9mZnNldCA9IGkqUEFHRV9BTElHTihpbWFnZXNpemUpOworCQljYW0tPmZyYW1lW2ldLmJ1Zi5sZW5ndGggPSBpbWFnZXNpemU7CisJCWNhbS0+ZnJhbWVbaV0uYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCWNhbS0+ZnJhbWVbaV0uYnVmLnNlcXVlbmNlID0gMDsKKwkJY2FtLT5mcmFtZVtpXS5idWYuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCWNhbS0+ZnJhbWVbaV0uYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJCWNhbS0+ZnJhbWVbaV0uYnVmLmZsYWdzID0gMDsKKwl9CisKKwlyZXR1cm4gY2FtLT5uYnVmZmVyczsKK30KKworCitzdGF0aWMgdm9pZCBzbjljMTAyX3JlbGVhc2VfYnVmZmVycyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpZiAoY2FtLT5uYnVmZmVycykgeworCQlydmZyZWUoY2FtLT5mcmFtZVswXS5idWZtZW0sCisJCSAgICAgICBjYW0tPm5idWZmZXJzICogY2FtLT5mcmFtZVswXS5idWYubGVuZ3RoKTsKKwkJY2FtLT5uYnVmZmVycyA9IDA7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHNuOWMxMDJfZW1wdHlfZnJhbWVxdWV1ZXMoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJdTMyIGk7CisKKwlJTklUX0xJU1RfSEVBRCgmY2FtLT5pbnF1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmY2FtLT5vdXRxdWV1ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU045QzEwMl9NQVhfRlJBTUVTOyBpKyspIHsKKwkJY2FtLT5mcmFtZVtpXS5zdGF0ZSA9IEZfVU5VU0VEOworCQljYW0tPmZyYW1lW2ldLmJ1Zi5ieXRlc3VzZWQgPSAwOworCX0KK30KKworCitzdGF0aWMgdm9pZCBzbjljMTAyX3F1ZXVlX3VudXNlZGZyYW1lcyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKQorCQlpZiAoY2FtLT5mcmFtZVtpXS5zdGF0ZSA9PSBGX1VOVVNFRCkgeworCQkJY2FtLT5mcmFtZVtpXS5zdGF0ZSA9IEZfUVVFVUVEOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7CisJCQlsaXN0X2FkZF90YWlsKCZjYW0tPmZyYW1lW2ldLmZyYW1lLCAmY2FtLT5pbnF1ZXVlKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7CisJCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgc245YzEwMl93cml0ZV9yZWcoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHU4IHZhbHVlLCB1MTYgaW5kZXgpCit7CisJc3RydWN0IHVzYl9kZXZpY2UqIHVkZXYgPSBjYW0tPnVzYmRldjsKKwl1OCogYnVmZiA9IGNhbS0+Y29udHJvbF9idWZmZXI7CisJaW50IHJlczsKKworCSpidWZmID0gdmFsdWU7CisKKwlyZXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLCAweDA4LCAweDQxLAorCSAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgMCwgYnVmZiwgMSwgU045QzEwMl9DVFJMX1RJTUVPVVQpOworCWlmIChyZXMgPCAwKSB7CisJCURCRygzLCAiRmFpbGVkIHRvIHdyaXRlIGEgcmVnaXN0ZXIgKHZhbHVlIDB4JTAyWCwgaW5kZXggIgorCQkgICAgICAgIjB4JTAyWCwgZXJyb3IgJWQpIiwgdmFsdWUsIGluZGV4LCByZXMpCisJCXJldHVybiAtMTsKKwl9CisKKwljYW0tPnJlZ1tpbmRleF0gPSB2YWx1ZTsKKworCXJldHVybiAwOworfQorCisKKy8qIE5PVEU6IHJlYWRpbmcgc29tZSByZWdpc3RlcnMgYWx3YXlzIHJldHVybnMgMCAqLworc3RhdGljIGludCBzbjljMTAyX3JlYWRfcmVnKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCB1MTYgaW5kZXgpCit7CisJc3RydWN0IHVzYl9kZXZpY2UqIHVkZXYgPSBjYW0tPnVzYmRldjsKKwl1OCogYnVmZiA9IGNhbS0+Y29udHJvbF9idWZmZXI7CisJaW50IHJlczsKKworCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksIDB4MDAsIDB4YzEsCisJICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCAwLCBidWZmLCAxLCBTTjlDMTAyX0NUUkxfVElNRU9VVCk7CisJaWYgKHJlcyA8IDApCisJCURCRygzLCAiRmFpbGVkIHRvIHJlYWQgYSByZWdpc3RlciAoaW5kZXggMHglMDJYLCBlcnJvciAlZCkiLAorCQkgICAgaW5kZXgsIHJlcykKKworCXJldHVybiAocmVzID49IDApID8gKGludCkoKmJ1ZmYpIDogLTE7Cit9CisKKworaW50IHNuOWMxMDJfcHJlYWRfcmVnKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCB1MTYgaW5kZXgpCit7CisJaWYgKGluZGV4ID4gMHgxZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY2FtLT5yZWdbaW5kZXhdOworfQorCisKK3N0YXRpYyBpbnQKK3NuOWMxMDJfaTJjX3dhaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yKQoreworCWludCBpLCByOworCisJZm9yIChpID0gMTsgaSA8PSA1OyBpKyspIHsKKwkJciA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDA4KTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWlmIChyICYgMHgwNCkKKwkJCXJldHVybiAwOworCQlpZiAoc2Vuc29yLT5mcmVxdWVuY3kgJiBTTjlDMTAyX0kyQ180MDBLSFopCisJCQl1ZGVsYXkoNSoxNik7CisJCWVsc2UKKwkJCXVkZWxheSgxNioxNik7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKKworc3RhdGljIGludAorc245YzEwMl9pMmNfZGV0ZWN0X3JlYWRfZXJyb3Ioc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IpCit7CisJaW50IHI7CisJciA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDA4KTsKKwlyZXR1cm4gKHIgPCAwIHx8IChyID49IDAgJiYgIShyICYgMHgwOCkpKSA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQKK3NuOWMxMDJfaTJjX2RldGVjdF93cml0ZV9lcnJvcihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IpCit7CisJaW50IHI7CisJciA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDA4KTsKKwlyZXR1cm4gKHIgPCAwIHx8IChyID49IDAgJiYgKHIgJiAweDA4KSkpID8gLUVJTyA6IDA7Cit9CisKKworaW50IAorc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yLCB1OCBkYXRhMCwgdTggZGF0YTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdTggbiwgdTggYnVmZmVyW10pCit7CisJc3RydWN0IHVzYl9kZXZpY2UqIHVkZXYgPSBjYW0tPnVzYmRldjsKKwl1OCogZGF0YSA9IGNhbS0+Y29udHJvbF9idWZmZXI7CisJaW50IGVyciA9IDAsIHJlczsKKworCS8qIFdyaXRlIGN5Y2xlICovCisJZGF0YVswXSA9ICgoc2Vuc29yLT5pbnRlcmZhY2UgPT0gU045QzEwMl9JMkNfMldJUkVTKSA/IDB4ODAgOiAwKSB8CisJICAgICAgICAgICgoc2Vuc29yLT5mcmVxdWVuY3kgJiBTTjlDMTAyX0kyQ180MDBLSFopID8gMHgwMSA6IDApIHwgMHgxMDsKKwlkYXRhWzFdID0gZGF0YTA7IC8qIEkyQyBzbGF2ZSBpZCAqLworCWRhdGFbMl0gPSBkYXRhMTsgLyogYWRkcmVzcyAqLworCWRhdGFbN10gPSAweDEwOworCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksIDB4MDgsIDB4NDEsCisJICAgICAgICAgICAgICAgICAgICAgIDB4MDgsIDAsIGRhdGEsIDgsIFNOOUMxMDJfQ1RSTF9USU1FT1VUKTsKKwlpZiAocmVzIDwgMCkKKwkJZXJyICs9IHJlczsKKworCWVyciArPSBzbjljMTAyX2kyY193YWl0KGNhbSwgc2Vuc29yKTsKKworCS8qIFJlYWQgY3ljbGUgLSBuIGJ5dGVzICovCisJZGF0YVswXSA9ICgoc2Vuc29yLT5pbnRlcmZhY2UgPT0gU045QzEwMl9JMkNfMldJUkVTKSA/IDB4ODAgOiAwKSB8CisJICAgICAgICAgICgoc2Vuc29yLT5mcmVxdWVuY3kgJiBTTjlDMTAyX0kyQ180MDBLSFopID8gMHgwMSA6IDApIHwKKwkgICAgICAgICAgKG4gPDwgNCkgfCAweDAyOworCWRhdGFbMV0gPSBkYXRhMDsKKwlkYXRhWzddID0gMHgxMDsKKwlyZXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLCAweDA4LCAweDQxLAorCSAgICAgICAgICAgICAgICAgICAgICAweDA4LCAwLCBkYXRhLCA4LCBTTjlDMTAyX0NUUkxfVElNRU9VVCk7CisJaWYgKHJlcyA8IDApCisJCWVyciArPSByZXM7CisKKwllcnIgKz0gc245YzEwMl9pMmNfd2FpdChjYW0sIHNlbnNvcik7CisKKwkvKiBUaGUgZmlyc3QgcmVhZCBieXRlIHdpbGwgYmUgcGxhY2VkIGluIGRhdGFbNF0gKi8KKwlyZXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLCAweDAwLCAweGMxLAorCSAgICAgICAgICAgICAgICAgICAgICAweDBhLCAwLCBkYXRhLCA1LCBTTjlDMTAyX0NUUkxfVElNRU9VVCk7CisJaWYgKHJlcyA8IDApCisJCWVyciArPSByZXM7CisKKwllcnIgKz0gc245YzEwMl9pMmNfZGV0ZWN0X3JlYWRfZXJyb3IoY2FtLCBzZW5zb3IpOworCisJUERCR0coIkkyQyByZWFkOiBhZGRyZXNzIDB4JTAyWCwgZmlyc3QgcmVhZCBieXRlOiAweCUwMlgiLCBkYXRhMSwKKwkgICAgICBkYXRhWzRdKQorCisJaWYgKGVycikgeworCQlEQkcoMywgIkkyQyByZWFkIGZhaWxlZCBmb3IgJXMgaW1hZ2Ugc2Vuc29yIiwgc2Vuc29yLT5uYW1lKQorCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGJ1ZmZlcikKKwkJbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc2l6ZW9mKGJ1ZmZlcikpOworCisJcmV0dXJuIChpbnQpZGF0YVs0XTsKK30KKworCitpbnQgCitzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvciwgdTggbiwgdTggZGF0YTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGRhdGExLCB1OCBkYXRhMiwgdTggZGF0YTMsIHU4IGRhdGE0LCB1OCBkYXRhNSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OworCXU4KiBkYXRhID0gY2FtLT5jb250cm9sX2J1ZmZlcjsKKwlpbnQgZXJyID0gMCwgcmVzOworCisJLyogV3JpdGUgY3ljbGUuIEl0IHVzdWFsbHkgaXMgYWRkcmVzcyArIHZhbHVlICovCisJZGF0YVswXSA9ICgoc2Vuc29yLT5pbnRlcmZhY2UgPT0gU045QzEwMl9JMkNfMldJUkVTKSA/IDB4ODAgOiAwKSB8CisJICAgICAgICAgICgoc2Vuc29yLT5mcmVxdWVuY3kgJiBTTjlDMTAyX0kyQ180MDBLSFopID8gMHgwMSA6IDApCisJICAgICAgICAgIHwgKChuIC0gMSkgPDwgNCk7CisJZGF0YVsxXSA9IGRhdGEwOworCWRhdGFbMl0gPSBkYXRhMTsKKwlkYXRhWzNdID0gZGF0YTI7CisJZGF0YVs0XSA9IGRhdGEzOworCWRhdGFbNV0gPSBkYXRhNDsKKwlkYXRhWzZdID0gZGF0YTU7CisJZGF0YVs3XSA9IDB4MTQ7CisJcmVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwgMHgwOCwgMHg0MSwKKwkgICAgICAgICAgICAgICAgICAgICAgMHgwOCwgMCwgZGF0YSwgOCwgU045QzEwMl9DVFJMX1RJTUVPVVQpOworCWlmIChyZXMgPCAwKQorCQllcnIgKz0gcmVzOworCisJZXJyICs9IHNuOWMxMDJfaTJjX3dhaXQoY2FtLCBzZW5zb3IpOworCWVyciArPSBzbjljMTAyX2kyY19kZXRlY3Rfd3JpdGVfZXJyb3IoY2FtLCBzZW5zb3IpOworCisJaWYgKGVycikKKwkJREJHKDMsICJJMkMgd3JpdGUgZmFpbGVkIGZvciAlcyBpbWFnZSBzZW5zb3IiLCBzZW5zb3ItPm5hbWUpCisKKwlQREJHRygiSTJDIHJhdyB3cml0ZTogJXUgYnl0ZXMsIGRhdGEwID0gMHglMDJYLCBkYXRhMSA9IDB4JTAyWCwgIgorCSAgICAgICJkYXRhMiA9IDB4JTAyWCwgZGF0YTMgPSAweCUwMlgsIGRhdGE0ID0gMHglMDJYLCBkYXRhNSA9IDB4JTAyWCIsCisJICAgICAgbiwgZGF0YTAsIGRhdGExLCBkYXRhMiwgZGF0YTMsIGRhdGE0LCBkYXRhNSkKKworCXJldHVybiBlcnIgPyAtMSA6IDA7Cit9CisKKworaW50CitzbjljMTAyX2kyY190cnlfcmVhZChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yLCB1OCBhZGRyZXNzKQoreworCXJldHVybiBzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzZW5zb3IsIHNlbnNvci0+aTJjX3NsYXZlX2lkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgMSwgTlVMTCk7Cit9CisKKworaW50IAorc245YzEwMl9pMmNfdHJ5X3dyaXRlKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yLCB1OCBhZGRyZXNzLCB1OCB2YWx1ZSkKK3sKKwlyZXR1cm4gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHNlbnNvciwgMywgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc29yLT5pMmNfc2xhdmVfaWQsIGFkZHJlc3MsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIDAsIDAsIDApOworfQorCisKK2ludCBzbjljMTAyX2kyY19yZWFkKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCB1OCBhZGRyZXNzKQoreworCWlmICghY2FtLT5zZW5zb3IpCisJCXJldHVybiAtMTsKKworCXJldHVybiBzbjljMTAyX2kyY190cnlfcmVhZChjYW0sIGNhbS0+c2Vuc29yLCBhZGRyZXNzKTsKK30KKworCitpbnQgc245YzEwMl9pMmNfd3JpdGUoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHU4IGFkZHJlc3MsIHU4IHZhbHVlKQoreworCWlmICghY2FtLT5zZW5zb3IpCisJCXJldHVybiAtMTsKKworCXJldHVybiBzbjljMTAyX2kyY190cnlfd3JpdGUoY2FtLCBjYW0tPnNlbnNvciwgYWRkcmVzcywgdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkKgorc245YzEwMl9maW5kX3NvZl9oZWFkZXIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHZvaWQqIG1lbSwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3Qgc29mbGVuID0gc2l6ZW9mKHNuOWMxMDJfc29mX2hlYWRlcl90KSwgaTsKKwl1OCBqLCBuID0gc2l6ZW9mKHNuOWMxMDJfc29mX2hlYWRlcikgLyBzb2ZsZW47CisKKwlmb3IgKGkgPSAwOyAobGVuID49IHNvZmxlbikgJiYgKGkgPD0gbGVuIC0gc29mbGVuKTsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKQorCQkJLyogSXQncyBlbm91Z2ggdG8gY29tcGFyZSA3IGJ5dGVzICovCisJCQlpZiAoIW1lbWNtcChtZW0gKyBpLCBzbjljMTAyX3NvZl9oZWFkZXJbal0sIDcpKSB7CisJCQkJbWVtY3B5KGNhbS0+c29mX2hlYWRlciwgbWVtICsgaSwgc29mbGVuKTsKKwkJCQkvKiBTa2lwIHRoZSBoZWFkZXIgKi8KKwkJCQlyZXR1cm4gbWVtICsgaSArIHNvZmxlbjsKKwkJCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkKgorc245YzEwMl9maW5kX2VvZl9oZWFkZXIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHZvaWQqIG1lbSwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgZW9mbGVuID0gc2l6ZW9mKHNuOWMxMDJfZW9mX2hlYWRlcl90KSwgaTsKKwl1bnNpZ25lZCBqLCBuID0gc2l6ZW9mKHNuOWMxMDJfZW9mX2hlYWRlcikgLyBlb2ZsZW47CisKKwlpZiAoY2FtLT5zZW5zb3ItPnBpeF9mb3JtYXQucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpCisJCXJldHVybiBOVUxMOyAvKiBFT0YgaGVhZGVyIGRvZXMgbm90IGV4aXN0IGluIGNvbXByZXNzZWQgZGF0YSAqLworCisJZm9yIChpID0gMDsgKGxlbiA+PSBlb2ZsZW4pICYmIChpIDw9IGxlbiAtIGVvZmxlbik7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IG47IGorKykKKwkJCWlmICghbWVtY21wKG1lbSArIGksIHNuOWMxMDJfZW9mX2hlYWRlcltqXSwgZW9mbGVuKSkKKwkJCQlyZXR1cm4gbWVtICsgaTsKKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkIHNuOWMxMDJfdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MqIHJlZ3MpCit7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0gPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuOWMxMDJfZnJhbWVfdCoqIGY7CisJc2l6ZV90IGltYWdlc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisJdTggaTsKKwlpbnQgZXJyID0gMDsKKworCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UKQorCQlyZXR1cm47CisKKwlmID0gJmNhbS0+ZnJhbWVfY3VycmVudDsKKworCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fSU5URVJSVVBUKSB7CisJCWNhbS0+c3RyZWFtID0gU1RSRUFNX09GRjsKKwkJaWYgKCgqZikpCisJCQkoKmYpLT5zdGF0ZSA9IEZfUVVFVUVEOworCQlEQkcoMywgIlN0cmVhbSBpbnRlcnJ1cHRlZCIpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FtLT53YWl0X3N0cmVhbSk7CisJfQorCisJaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKQorCQlyZXR1cm47CisKKwlpZiAoY2FtLT5zdGF0ZSAmIERFVl9NSVNDT05GSUdVUkVEKSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FtLT53YWl0X2ZyYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT0ZGIHx8IGxpc3RfZW1wdHkoJmNhbS0+aW5xdWV1ZSkpCisJCWdvdG8gcmVzdWJtaXRfdXJiOworCisJaWYgKCEoKmYpKQorCQkoKmYpID0gbGlzdF9lbnRyeShjYW0tPmlucXVldWUubmV4dCwgc3RydWN0IHNuOWMxMDJfZnJhbWVfdCwKKwkJICAgICAgICAgICAgICAgICAgZnJhbWUpOworCisJaW1hZ2VzaXplID0gKGNhbS0+c2Vuc29yLT5waXhfZm9ybWF0LndpZHRoICoKKwkgICAgICAgICAgICAgY2FtLT5zZW5zb3ItPnBpeF9mb3JtYXQuaGVpZ2h0ICoKKwkgICAgICAgICAgICAgY2FtLT5zZW5zb3ItPnBpeF9mb3JtYXQucHJpdikgLyA4OworCisJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgaW1nLCBsZW4sIHN0YXR1czsKKwkJdm9pZCAqcG9zLCAqc29mLCAqZW9mOworCisJCWxlbiA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwkJc3RhdHVzID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CisJCXBvcyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ICsgdXJiLT50cmFuc2Zlcl9idWZmZXI7CisKKwkJaWYgKHN0YXR1cykgeworCQkJREJHKDMsICJFcnJvciBpbiBpc29jaHJvbm91cyBmcmFtZSIpCisJCQkoKmYpLT5zdGF0ZSA9IEZfRVJST1I7CisJCQljb250aW51ZTsKKwkJfQorCisJCVBEQkdHKCJJc29jaHJub3VzIGZyYW1lOiBsZW5ndGggJXUsICMldSBpIiwgbGVuLCBpKQorCisJCS8qCisJCSAgIE5PVEU6IEl0IGlzIHByb2JhYmx5IGNvcnJlY3QgdG8gYXNzdW1lIHRoYXQgU09GIGFuZCBFT0YKKwkJICAgICAgICAgaGVhZGVycyBkbyBub3Qgb2NjdXIgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgcGFja2V0cywKKwkJICAgICAgICAgYnV0IHdobyBrbm93cy4uV2hhdGV2ZXIgaXMgdGhlIHRydXRoLCB0aGlzIGFzc3VtcHRpb24KKwkJICAgICAgICAgZG9lc24ndCBpbnRyb2R1Y2UgYnVncy4KKwkJKi8KKworcmVkbzoKKwkJc29mID0gc245YzEwMl9maW5kX3NvZl9oZWFkZXIoY2FtLCBwb3MsIGxlbik7CisJCWlmICghc29mKSB7CisJCQllb2YgPSBzbjljMTAyX2ZpbmRfZW9mX2hlYWRlcihjYW0sIHBvcywgbGVuKTsKKwkJCWlmICgoKmYpLT5zdGF0ZSA9PSBGX0dSQUJCSU5HKSB7CitlbmRfb2ZfZnJhbWU6CisJCQkJaW1nID0gbGVuOworCisJCQkJaWYgKGVvZikKKwkJCQkJaW1nID0gKGVvZiA+IHBvcykgPyBlb2YgLSBwb3MgLSAxIDogMDsKKworCQkJCWlmICgoKmYpLT5idWYuYnl0ZXN1c2VkK2ltZyA+IGltYWdlc2l6ZSkgeworCQkJCQl1MzIgYiA9ICgqZiktPmJ1Zi5ieXRlc3VzZWQgKyBpbWcgLQorCQkJCQkgICAgICAgIGltYWdlc2l6ZTsKKwkJCQkJaW1nID0gaW1hZ2VzaXplIC0gKCpmKS0+YnVmLmJ5dGVzdXNlZDsKKwkJCQkJREJHKDMsICJFeHBlY3RlZCBFT0Ygbm90IGZvdW5kOiAiCisJCQkJCSAgICAgICAidmlkZW8gZnJhbWUgY3V0IikKKwkJCQkJaWYgKGVvZikKKwkJCQkJCURCRygzLCAiRXhjZWVkZWQgbGltaXQ6ICsldSAiCisJCQkJCQkgICAgICAgImJ5dGVzIiwgKHVuc2lnbmVkKShiKSkKKwkJCQl9CisKKwkJCQltZW1jcHkoKCpmKS0+YnVmbWVtICsgKCpmKS0+YnVmLmJ5dGVzdXNlZCwgcG9zLAorCQkJCSAgICAgICBpbWcpOworCisJCQkJaWYgKCgqZiktPmJ1Zi5ieXRlc3VzZWQgPT0gMCkKKwkJCQkJZG9fZ2V0dGltZW9mZGF5KCYoKmYpLT5idWYudGltZXN0YW1wKTsKKworCQkJCSgqZiktPmJ1Zi5ieXRlc3VzZWQgKz0gaW1nOworCisJCQkJaWYgKCgqZiktPmJ1Zi5ieXRlc3VzZWQgPT0gaW1hZ2VzaXplIHx8CisJCQkJICAgIChjYW0tPnNlbnNvci0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCA9PQorCQkJCSAgICAgICAgICAgICAgICBWNEwyX1BJWF9GTVRfU045QzEwWCAmJiBlb2YpKSB7CisJCQkJCXUzMiBiID0gKCpmKS0+YnVmLmJ5dGVzdXNlZDsKKwkJCQkJKCpmKS0+c3RhdGUgPSBGX0RPTkU7CisJCQkJCSgqZiktPmJ1Zi5zZXF1ZW5jZT0gKytjYW0tPmZyYW1lX2NvdW50OworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5xdWV1ZV9sb2NrLAorCQkJCQkgICAgICAgICAgICAgICAgICBsb2NrX2ZsYWdzKTsKKwkJCQkJbGlzdF9tb3ZlX3RhaWwoJigqZiktPmZyYW1lLAorCQkJCQkgICAgICAgICAgICAgICAmY2FtLT5vdXRxdWV1ZSk7CisJCQkJCWlmICghbGlzdF9lbXB0eSgmY2FtLT5pbnF1ZXVlKSkKKwkJCQkJCSgqZikgPSBsaXN0X2VudHJ5KAorCQkJCQkJICAgICAgICBjYW0tPmlucXVldWUubmV4dCwKKwkJCQkJCSAgICAgICAgc3RydWN0IHNuOWMxMDJfZnJhbWVfdCwKKwkJCQkJCSAgICAgICAgZnJhbWUgKTsKKwkJCQkJZWxzZQorCQkJCQkJKCpmKSA9IE5VTEw7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+cXVldWVfbG9jaworCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICwgbG9ja19mbGFncyk7CisJCQkJCW1lbWNweShjYW0tPnN5c2ZzLmZyYW1lX2hlYWRlciwKKwkJCQkJICAgICAgIGNhbS0+c29mX2hlYWRlciwKKwkJCQkJICAgICAgIHNpemVvZihzbjljMTAyX3NvZl9oZWFkZXJfdCkpOworCQkJCQlEQkcoMywgIlZpZGVvIGZyYW1lIGNhcHR1cmVkOiAiCisJCQkJCSAgICAgICAiJWx1IGJ5dGVzIiwgKHVuc2lnbmVkIGxvbmcpKGIpKQorCisJCQkJCWlmICghKCpmKSkKKwkJCQkJCWdvdG8gcmVzdWJtaXRfdXJiOworCisJCQkJfSBlbHNlIGlmIChlb2YpIHsKKwkJCQkJKCpmKS0+c3RhdGUgPSBGX0VSUk9SOworCQkJCQlEQkcoMywgIk5vdCBleHBlY3RlZCBFT0YgYWZ0ZXIgJWx1ICIKKwkJCQkJICAgICAgICJieXRlcyBvZiBpbWFnZSBkYXRhIiwgCisJCQkJCSAgKHVuc2lnbmVkIGxvbmcpKCgqZiktPmJ1Zi5ieXRlc3VzZWQpKQorCQkJCX0KKworCQkJCWlmIChzb2YpIC8qICgxKSAqLworCQkJCQlnb3RvIHN0YXJ0X29mX2ZyYW1lOworCisJCQl9IGVsc2UgaWYgKGVvZikgeworCQkJCURCRygzLCAiRU9GIHdpdGhvdXQgU09GIikKKwkJCQljb250aW51ZTsKKworCQkJfSBlbHNlIHsKKwkJCQlQREJHRygiSWdub3JpbmcgcG9pbnRsZXNzIGlzb2Nocm9ub3VzIGZyYW1lIikKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKCgqZiktPnN0YXRlID09IEZfUVVFVUVEIHx8ICgqZiktPnN0YXRlID09IEZfRVJST1IpIHsKK3N0YXJ0X29mX2ZyYW1lOgorCQkJKCpmKS0+c3RhdGUgPSBGX0dSQUJCSU5HOworCQkJKCpmKS0+YnVmLmJ5dGVzdXNlZCA9IDA7CisJCQlsZW4gLT0gKHNvZiAtIHBvcyk7CisJCQlwb3MgPSBzb2Y7CisJCQlEQkcoMywgIlNPRiBkZXRlY3RlZDogbmV3IHZpZGVvIGZyYW1lIikKKwkJCWlmIChsZW4pCisJCQkJZ290byByZWRvOworCisJCX0gZWxzZSBpZiAoKCpmKS0+c3RhdGUgPT0gRl9HUkFCQklORykgeworCQkJZW9mID0gc245YzEwMl9maW5kX2VvZl9oZWFkZXIoY2FtLCBwb3MsIGxlbik7CisJCQlpZiAoZW9mICYmIGVvZiA8IHNvZikKKwkJCQlnb3RvIGVuZF9vZl9mcmFtZTsgLyogKDEpICovCisJCQllbHNlIHsKKwkJCQlpZiAoY2FtLT5zZW5zb3ItPnBpeF9mb3JtYXQucGl4ZWxmb3JtYXQgPT0KKwkJCQkgICAgVjRMMl9QSVhfRk1UX1NOOUMxMFgpIHsKKwkJCQkJZW9mID0gc29mLXNpemVvZihzbjljMTAyX3NvZl9oZWFkZXJfdCk7CisJCQkJCWdvdG8gZW5kX29mX2ZyYW1lOworCQkJCX0gZWxzZSB7CisJCQkJCURCRygzLCAiU09GIGJlZm9yZSBleHBlY3RlZCBFT0YgYWZ0ZXIgIgorCQkJCQkgICAgICAgIiVsdSBieXRlcyBvZiBpbWFnZSBkYXRhIiwgCisJCQkJCSAgKHVuc2lnbmVkIGxvbmcpKCgqZiktPmJ1Zi5ieXRlc3VzZWQpKQorCQkJCQlnb3RvIHN0YXJ0X29mX2ZyYW1lOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworcmVzdWJtaXRfdXJiOgorCXVyYi0+ZGV2ID0gY2FtLT51c2JkZXY7CisJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyIDwgMCAmJiBlcnIgIT0gLUVQRVJNKSB7CisJCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7CisJCURCRygxLCAidXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQiKQorCX0KKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FtLT53YWl0X2ZyYW1lKTsKK30KKworCitzdGF0aWMgaW50IHNuOWMxMDJfc3RhcnRfdHJhbnNmZXIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBjYW0tPnVzYmRldjsKKwlzdHJ1Y3QgdXJiKiB1cmI7CisJY29uc3QgdW5zaWduZWQgaW50IHdNYXhQYWNrZXRTaXplW10gPSB7MCwgMTI4LCAyNTYsIDM4NCwgNTEyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY4MCwgODAwLCA5MDAsIDEwMjN9OworCWNvbnN0IHVuc2lnbmVkIGludCBwc3ogPSB3TWF4UGFja2V0U2l6ZVtTTjlDMTAyX0FMVEVSTkFURV9TRVRUSU5HXTsKKwlzOCBpLCBqOworCWludCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFNOOUMxMDJfVVJCUzsgaSsrKSB7CisJCWNhbS0+dHJhbnNmZXJfYnVmZmVyW2ldID0ga21hbGxvYyhTTjlDMTAyX0lTT19QQUNLRVRTICogcHN6LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghY2FtLT50cmFuc2Zlcl9idWZmZXJbaV0pIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlEQkcoMSwgIk5vdCBlbm91Z2ggbWVtb3J5IikKKwkJCWdvdG8gZnJlZV9idWZmZXJzOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IFNOOUMxMDJfVVJCUzsgaSsrKSB7CisJCXVyYiA9IHVzYl9hbGxvY191cmIoU045QzEwMl9JU09fUEFDS0VUUywgR0ZQX0tFUk5FTCk7CisJCWNhbS0+dXJiW2ldID0gdXJiOworCQlpZiAoIXVyYikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCURCRygxLCAidXNiX2FsbG9jX3VyYigpIGZhaWxlZCIpCisJCQlnb3RvIGZyZWVfdXJiczsKKwkJfQorCQl1cmItPmRldiA9IHVkZXY7CisJCXVyYi0+Y29udGV4dCA9IGNhbTsKKwkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKHVkZXYsIDEpOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gU045QzEwMl9JU09fUEFDS0VUUzsKKwkJdXJiLT5jb21wbGV0ZSA9IHNuOWMxMDJfdXJiX2NvbXBsZXRlOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGNhbS0+dHJhbnNmZXJfYnVmZmVyW2ldOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBwc3ogKiBTTjlDMTAyX0lTT19QQUNLRVRTOworCQl1cmItPmludGVydmFsID0gMTsKKwkJZm9yIChqID0gMDsgaiA8IFNOOUMxMDJfSVNPX1BBQ0tFVFM7IGorKykgeworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBwc3ogKiBqOworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBwc3o7CisJCX0KKwl9CisKKwkvKiBFbmFibGUgdmlkZW8gKi8KKwlpZiAoIShjYW0tPnJlZ1sweDAxXSAmIDB4MDQpKSB7CisJCWVyciA9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgY2FtLT5yZWdbMHgwMV0gfCAweDA0LCAweDAxKTsKKwkJaWYgKGVycikgeworCQkJZXJyID0gLUVJTzsKKwkJCURCRygxLCAiSS9PIGhhcmR3YXJlIGVycm9yIikKKwkJCWdvdG8gZnJlZV91cmJzOworCQl9CisJfQorCisJZXJyID0gdXNiX3NldF9pbnRlcmZhY2UodWRldiwgMCwgU045QzEwMl9BTFRFUk5BVEVfU0VUVElORyk7CisJaWYgKGVycikgeworCQlEQkcoMSwgInVzYl9zZXRfaW50ZXJmYWNlKCkgZmFpbGVkIikKKwkJZ290byBmcmVlX3VyYnM7CisJfQorCisJY2FtLT5mcmFtZV9jdXJyZW50ID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBTTjlDMTAyX1VSQlM7IGkrKykgeworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihjYW0tPnVyYltpXSwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpIHsKKwkJCWZvciAoaiA9IGktMTsgaiA+PSAwOyBqLS0pCisJCQkJdXNiX2tpbGxfdXJiKGNhbS0+dXJiW2pdKTsKKwkJCURCRygxLCAidXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQsIGVycm9yICVkIiwgZXJyKQorCQkJZ290byBmcmVlX3VyYnM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZnJlZV91cmJzOgorCWZvciAoaSA9IDA7IChpIDwgU045QzEwMl9VUkJTKSAmJiAgY2FtLT51cmJbaV07IGkrKykKKwkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2ldKTsKKworZnJlZV9idWZmZXJzOgorCWZvciAoaSA9IDA7IChpIDwgU045QzEwMl9VUkJTKSAmJiBjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXTsgaSsrKQorCQlrZnJlZShjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgc245YzEwMl9zdG9wX3RyYW5zZmVyKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gY2FtLT51c2JkZXY7CisJczggaTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSBTTjlDMTAyX1VSQlMtMTsgaSA+PSAwOyBpLS0pIHsKKwkJdXNiX2tpbGxfdXJiKGNhbS0+dXJiW2ldKTsKKwkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2ldKTsKKwkJa2ZyZWUoY2FtLT50cmFuc2Zlcl9idWZmZXJbaV0pOworCX0KKworCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIDAsIDApOyAvKiAwIE1iL3MgKi8KKwlpZiAoZXJyKQorCQlEQkcoMywgInVzYl9zZXRfaW50ZXJmYWNlKCkgZmFpbGVkIikKKworCXJldHVybiBlcnI7Cit9CisKKworaW50IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWNhbS0+c3RyZWFtID0gU1RSRUFNX0lOVEVSUlVQVDsKKwllcnIgPSB3YWl0X2V2ZW50X3RpbWVvdXQoY2FtLT53YWl0X3N0cmVhbSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PRkYpIHx8CisJICAgICAgICAgICAgICAgICAgICAgICAgIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCksCisJICAgICAgICAgICAgICAgICAgICAgICAgIFNOOUMxMDJfVVJCX1RJTUVPVVQpOworCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZSBpZiAoZXJyKSB7CisJCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7CisJCURCRygxLCAiVGhlIGNhbWVyYSBpcyBtaXNjb25maWd1cmVkLiBUbyB1c2UgaXQsIGNsb3NlIGFuZCAiCisJCSAgICAgICAib3BlbiAvZGV2L3ZpZGVvJWQgYWdhaW4uIiwgY2FtLT52NGxkZXYtPm1pbm9yKQorCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1OCBzbjljMTAyX3N0cnRvdTgoY29uc3QgY2hhciogYnVmZiwgc2l6ZV90IGxlbiwgc3NpemVfdCogY291bnQpCit7CisJY2hhciBzdHJbNV07CisJY2hhciogZW5kcDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChsZW4gPCA0KSB7CisJCXN0cm5jcHkoc3RyLCBidWZmLCBsZW4pOworCQlzdHJbbGVuKzFdID0gJ1wwJzsKKwl9IGVsc2UgeworCQlzdHJuY3B5KHN0ciwgYnVmZiwgNCk7CisJCXN0cls0XSA9ICdcMCc7CisJfQorCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmZW5kcCwgMCk7CisKKwkqY291bnQgPSAwOworCWlmICh2YWwgPD0gMHhmZikKKwkJKmNvdW50ID0gKHNzaXplX3QpKGVuZHAgLSBzdHIpOworCWlmICgoKmNvdW50KSAmJiAobGVuID09ICpjb3VudCsxKSAmJiAoYnVmZlsqY291bnRdID09ICdcbicpKQorCQkqY291bnQgKz0gMTsKKworCXJldHVybiAodTgpdmFsOworfQorCisvKgorICAgTk9URSAxOiBiZWluZyBpbnNpZGUgb25lIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbXBsaWVzIHRoYXQgdGhlIHY0bAorICAgICAgICAgICBkZXZpY2UgZXhpc3RzIGZvciBzdXJlIChzZWUga29iamVjdHMgYW5kIHJlZmVyZW5jZSBjb3VudGVycykKKyAgIE5PVEUgMjogYnVmZmVycyBhcmUgUEFHRV9TSVpFIGxvbmcKKyovCisKK3N0YXRpYyBzc2l6ZV90IHNuOWMxMDJfc2hvd19yZWcoc3RydWN0IGNsYXNzX2RldmljZSogY2QsIGNoYXIqIGJ1ZikKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbTsKKwlzc2l6ZV90IGNvdW50OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc245YzEwMl9zeXNmc19sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHRvX3ZpZGVvX2RldmljZShjZCkpOworCWlmICghY2FtKSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljb3VudCA9IHNwcmludGYoYnVmLCAiJXVcbiIsIGNhbS0+c3lzZnMucmVnKTsKKworCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfSAKKworCitzdGF0aWMgc3NpemVfdCAKK3NuOWMxMDJfc3RvcmVfcmVnKHN0cnVjdCBjbGFzc19kZXZpY2UqIGNkLCBjb25zdCBjaGFyKiBidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW07CisJdTggaW5kZXg7CisJc3NpemVfdCBjb3VudDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNuOWMxMDJfc3lzZnNfbG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh0b192aWRlb19kZXZpY2UoY2QpKTsKKwlpZiAoIWNhbSkgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW5kZXggPSBzbjljMTAyX3N0cnRvdTgoYnVmLCBsZW4sICZjb3VudCk7CisJaWYgKGluZGV4ID4gMHgxZiB8fCAhY291bnQpIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhbS0+c3lzZnMucmVnID0gaW5kZXg7CisKKwlEQkcoMiwgIk1vdmVkIFNOOUMxMFggcmVnaXN0ZXIgaW5kZXggdG8gMHglMDJYIiwgY2FtLT5zeXNmcy5yZWcpCisJREJHKDMsICJXcml0dGVuIGJ5dGVzOiAlemQiLCBjb3VudCkKKworCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyBzc2l6ZV90IHNuOWMxMDJfc2hvd192YWwoc3RydWN0IGNsYXNzX2RldmljZSogY2QsIGNoYXIqIGJ1ZikKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbTsKKwlzc2l6ZV90IGNvdW50OworCWludCB2YWw7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbjljMTAyX3N5c2ZzX2xvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodG9fdmlkZW9fZGV2aWNlKGNkKSk7CisJaWYgKCFjYW0pIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICgodmFsID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIGNhbS0+c3lzZnMucmVnKSkgPCAwKSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljb3VudCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisKKwlEQkcoMywgIlJlYWQgYnl0ZXM6ICV6ZCIsIGNvdW50KQorCisJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9IAorCisKK3N0YXRpYyBzc2l6ZV90CitzbjljMTAyX3N0b3JlX3ZhbChzdHJ1Y3QgY2xhc3NfZGV2aWNlKiBjZCwgY29uc3QgY2hhciogYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCXU4IHZhbHVlOworCXNzaXplX3QgY291bnQ7CisJaW50IGVycjsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNuOWMxMDJfc3lzZnNfbG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh0b192aWRlb19kZXZpY2UoY2QpKTsKKwlpZiAoIWNhbSkgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdmFsdWUgPSBzbjljMTAyX3N0cnRvdTgoYnVmLCBsZW4sICZjb3VudCk7CisJaWYgKCFjb3VudCkgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gc245YzEwMl93cml0ZV9yZWcoY2FtLCB2YWx1ZSwgY2FtLT5zeXNmcy5yZWcpOworCWlmIChlcnIpIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKworCURCRygyLCAiV3JpdHRlbiBTTjlDMTBYIHJlZy4gMHglMDJYLCB2YWwuIDB4JTAyWCIsCisJICAgIGNhbS0+c3lzZnMucmVnLCB2YWx1ZSkKKwlEQkcoMywgIldyaXR0ZW4gYnl0ZXM6ICV6ZCIsIGNvdW50KQorCisJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIHNzaXplX3Qgc245YzEwMl9zaG93X2kyY19yZWcoc3RydWN0IGNsYXNzX2RldmljZSogY2QsIGNoYXIqIGJ1ZikKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbTsKKwlzc2l6ZV90IGNvdW50OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc245YzEwMl9zeXNmc19sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHRvX3ZpZGVvX2RldmljZShjZCkpOworCWlmICghY2FtKSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljb3VudCA9IHNwcmludGYoYnVmLCAiJXVcbiIsIGNhbS0+c3lzZnMuaTJjX3JlZyk7CisKKwlEQkcoMywgIlJlYWQgYnl0ZXM6ICV6ZCIsIGNvdW50KQorCisJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgCitzbjljMTAyX3N0b3JlX2kyY19yZWcoc3RydWN0IGNsYXNzX2RldmljZSogY2QsIGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbTsKKwl1OCBpbmRleDsKKwlzc2l6ZV90IGNvdW50OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc245YzEwMl9zeXNmc19sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHRvX3ZpZGVvX2RldmljZShjZCkpOworCWlmICghY2FtKSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbmRleCA9IHNuOWMxMDJfc3RydG91OChidWYsIGxlbiwgJmNvdW50KTsKKwlpZiAoIWNvdW50KSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYW0tPnN5c2ZzLmkyY19yZWcgPSBpbmRleDsKKworCURCRygyLCAiTW92ZWQgc2Vuc29yIHJlZ2lzdGVyIGluZGV4IHRvIDB4JTAyWCIsIGNhbS0+c3lzZnMuaTJjX3JlZykKKwlEQkcoMywgIldyaXR0ZW4gYnl0ZXM6ICV6ZCIsIGNvdW50KQorCisJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIHNzaXplX3Qgc245YzEwMl9zaG93X2kyY192YWwoc3RydWN0IGNsYXNzX2RldmljZSogY2QsIGNoYXIqIGJ1ZikKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbTsKKwlzc2l6ZV90IGNvdW50OworCWludCB2YWw7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbjljMTAyX3N5c2ZzX2xvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodG9fdmlkZW9fZGV2aWNlKGNkKSk7CisJaWYgKCFjYW0pIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghKGNhbS0+c2Vuc29yLT5zeXNmc19vcHMgJiBTTjlDMTAyX0kyQ19SRUFEKSkgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJaWYgKCh2YWwgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgY2FtLT5zeXNmcy5pMmNfcmVnKSkgPCAwKSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljb3VudCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisKKwlEQkcoMywgIlJlYWQgYnl0ZXM6ICV6ZCIsIGNvdW50KQorCisJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9IAorCisKK3N0YXRpYyBzc2l6ZV90CitzbjljMTAyX3N0b3JlX2kyY192YWwoc3RydWN0IGNsYXNzX2RldmljZSogY2QsIGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbTsKKwl1OCB2YWx1ZTsKKwlzc2l6ZV90IGNvdW50OworCWludCBlcnI7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbjljMTAyX3N5c2ZzX2xvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodG9fdmlkZW9fZGV2aWNlKGNkKSk7CisJaWYgKCFjYW0pIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghKGNhbS0+c2Vuc29yLT5zeXNmc19vcHMgJiBTTjlDMTAyX0kyQ19XUklURSkpIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCXZhbHVlID0gc245YzEwMl9zdHJ0b3U4KGJ1ZiwgbGVuLCAmY291bnQpOworCWlmICghY291bnQpIHsKKwkJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVyciA9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgY2FtLT5zeXNmcy5pMmNfcmVnLCB2YWx1ZSk7CisJaWYgKGVycikgeworCQl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJREJHKDIsICJXcml0dGVuIHNlbnNvciByZWcuIDB4JTAyWCwgdmFsLiAweCUwMlgiLAorCSAgICBjYW0tPnN5c2ZzLmkyY19yZWcsIHZhbHVlKQorCURCRygzLCAiV3JpdHRlbiBieXRlczogJXpkIiwgY291bnQpCisKKwl1cCgmc245YzEwMl9zeXNmc19sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgc3NpemVfdAorc245YzEwMl9zdG9yZV9ncmVlbihzdHJ1Y3QgY2xhc3NfZGV2aWNlKiBjZCwgY29uc3QgY2hhciogYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtOworCWVudW0gc245YzEwMl9icmlkZ2UgYnJpZGdlOworCXNzaXplX3QgcmVzID0gMDsKKwl1OCB2YWx1ZTsKKwlzc2l6ZV90IGNvdW50OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc245YzEwMl9zeXNmc19sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHRvX3ZpZGVvX2RldmljZShjZCkpOworCWlmICghY2FtKSB7CisJCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlicmlkZ2UgPSBjYW0tPmJyaWRnZTsKKworCXVwKCZzbjljMTAyX3N5c2ZzX2xvY2spOworCisJdmFsdWUgPSBzbjljMTAyX3N0cnRvdTgoYnVmLCBsZW4sICZjb3VudCk7CisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGJyaWRnZSkgeworCWNhc2UgQlJJREdFX1NOOUMxMDE6CisJY2FzZSBCUklER0VfU045QzEwMjoKKwkJaWYgKHZhbHVlID4gMHgwZikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoKHJlcyA9IHNuOWMxMDJfc3RvcmVfcmVnKGNkLCAiMHgxMSIsIDQpKSA+PSAwKQorCQkJcmVzID0gc245YzEwMl9zdG9yZV92YWwoY2QsIGJ1ZiwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBCUklER0VfU045QzEwMzoKKwkJaWYgKHZhbHVlID4gMHg3ZikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoKHJlcyA9IHNuOWMxMDJfc3RvcmVfcmVnKGNkLCAiMHgwNCIsIDQpKSA+PSAwKQorCQkJcmVzID0gc245YzEwMl9zdG9yZV92YWwoY2QsIGJ1ZiwgbGVuKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgc3NpemVfdAorc245YzEwMl9zdG9yZV9ibHVlKHN0cnVjdCBjbGFzc19kZXZpY2UqIGNkLCBjb25zdCBjaGFyKiBidWYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdCByZXMgPSAwOworCXU4IHZhbHVlOworCXNzaXplX3QgY291bnQ7CisKKwl2YWx1ZSA9IHNuOWMxMDJfc3RydG91OChidWYsIGxlbiwgJmNvdW50KTsKKwlpZiAoIWNvdW50IHx8IHZhbHVlID4gMHg3ZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHJlcyA9IHNuOWMxMDJfc3RvcmVfcmVnKGNkLCAiMHgwNiIsIDQpKSA+PSAwKQorCQlyZXMgPSBzbjljMTAyX3N0b3JlX3ZhbChjZCwgYnVmLCBsZW4pOworCisJcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgc3NpemVfdAorc245YzEwMl9zdG9yZV9yZWQoc3RydWN0IGNsYXNzX2RldmljZSogY2QsIGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IHJlcyA9IDA7CisJdTggdmFsdWU7CisJc3NpemVfdCBjb3VudDsKKworCXZhbHVlID0gc245YzEwMl9zdHJ0b3U4KGJ1ZiwgbGVuLCAmY291bnQpOworCWlmICghY291bnQgfHwgdmFsdWUgPiAweDdmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgocmVzID0gc245YzEwMl9zdG9yZV9yZWcoY2QsICIweDA1IiwgNCkpID49IDApCisJCXJlcyA9IHNuOWMxMDJfc3RvcmVfdmFsKGNkLCBidWYsIGxlbik7CisKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHNuOWMxMDJfc2hvd19mcmFtZV9oZWFkZXIoc3RydWN0IGNsYXNzX2RldmljZSogY2QsIGNoYXIqIGJ1ZikKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbTsKKwlzc2l6ZV90IGNvdW50OworCisJY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodG9fdmlkZW9fZGV2aWNlKGNkKSk7CisJaWYgKCFjYW0pCisJCXJldHVybiAtRU5PREVWOworCisJY291bnQgPSBzaXplb2YoY2FtLT5zeXNmcy5mcmFtZV9oZWFkZXIpOworCW1lbWNweShidWYsIGNhbS0+c3lzZnMuZnJhbWVfaGVhZGVyLCBjb3VudCk7CisKKwlEQkcoMywgIkZyYW1lIGhlYWRlciwgcmVhZCBieXRlczogJXpkIiwgY291bnQpCisKKwlyZXR1cm4gY291bnQ7Cit9IAorCisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihyZWcsIFNfSVJVR08gfCBTX0lXVVNSLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNuOWMxMDJfc2hvd19yZWcsIHNuOWMxMDJfc3RvcmVfcmVnKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUih2YWwsIFNfSVJVR08gfCBTX0lXVVNSLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNuOWMxMDJfc2hvd192YWwsIHNuOWMxMDJfc3RvcmVfdmFsKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihpMmNfcmVnLCBTX0lSVUdPIHwgU19JV1VTUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbjljMTAyX3Nob3dfaTJjX3JlZywgc245YzEwMl9zdG9yZV9pMmNfcmVnKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihpMmNfdmFsLCBTX0lSVUdPIHwgU19JV1VTUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbjljMTAyX3Nob3dfaTJjX3ZhbCwgc245YzEwMl9zdG9yZV9pMmNfdmFsKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihncmVlbiwgU19JV1VHTywgTlVMTCwgc245YzEwMl9zdG9yZV9ncmVlbik7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYmx1ZSwgU19JV1VHTywgTlVMTCwgc245YzEwMl9zdG9yZV9ibHVlKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihyZWQsIFNfSVdVR08sIE5VTEwsIHNuOWMxMDJfc3RvcmVfcmVkKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihmcmFtZV9oZWFkZXIsIFNfSVJVR08sCisgICAgICAgICAgICAgICAgICAgICAgICAgc245YzEwMl9zaG93X2ZyYW1lX2hlYWRlciwgTlVMTCk7CisKKworc3RhdGljIHZvaWQgc245YzEwMl9jcmVhdGVfc3lzZnMoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdjRsZGV2ID0gY2FtLT52NGxkZXY7CisKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVnKTsKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfdmFsKTsKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZnJhbWVfaGVhZGVyKTsKKwlpZiAoY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDEgfHwgY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDIpCisJCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9ncmVlbik7CisJZWxzZSBpZiAoY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDMpIHsKKwkJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JsdWUpOworCQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVkKTsKKwl9CisJaWYgKGNhbS0+c2Vuc29yLT5zeXNmc19vcHMpIHsKKwkJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2kyY19yZWcpOworCQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3ZhbCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK3NuOWMxMDJfc2V0X3BpeF9mb3JtYXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHBpeCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmIChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9TTjlDMTBYKQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBjYW0tPnJlZ1sweDE4XSB8IDB4ODAsIDB4MTgpOworCWVsc2UKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgY2FtLT5yZWdbMHgxOF0gJiAweDdmLCAweDE4KTsKKworCXJldHVybiBlcnIgPyAtRUlPIDogMDsKK30KKworCitzdGF0aWMgaW50CitzbjljMTAyX3NldF9jb21wcmVzc2lvbihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiogY29tcHJlc3Npb24pCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoY29tcHJlc3Npb24tPnF1YWxpdHkgPT0gMCkKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgY2FtLT5yZWdbMHgxN10gfCAweDAxLCAweDE3KTsKKwllbHNlIGlmIChjb21wcmVzc2lvbi0+cXVhbGl0eSA9PSAxKQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBjYW0tPnJlZ1sweDE3XSAmIDB4ZmUsIDB4MTcpOworCisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQgc245YzEwMl9zZXRfc2NhbGUoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHU4IHNjYWxlKQoreworCXU4IHIgPSAwOworCWludCBlcnIgPSAwOworCisJaWYgKHNjYWxlID09IDEpCisJCXIgPSBjYW0tPnJlZ1sweDE4XSAmIDB4Y2Y7CisJZWxzZSBpZiAoc2NhbGUgPT0gMikgeworCQlyID0gY2FtLT5yZWdbMHgxOF0gJiAweGNmOworCQlyIHw9IDB4MTA7CisJfSBlbHNlIGlmIChzY2FsZSA9PSA0KQorCQlyID0gY2FtLT5yZWdbMHgxOF0gfCAweDIwOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgciwgMHgxOCk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU87CisKKwlQREJHRygiU2NhbGluZyBmYWN0b3I6ICV1Iiwgc2NhbGUpCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNuOWMxMDJfc2V0X2Nyb3Aoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHN0cnVjdCB2NGwyX3JlY3QqIHJlY3QpCit7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gY2FtLT5zZW5zb3I7CisJdTggaF9zdGFydCA9ICh1OCkocmVjdC0+bGVmdCAtIHMtPmNyb3BjYXAuYm91bmRzLmxlZnQpLAorCSAgIHZfc3RhcnQgPSAodTgpKHJlY3QtPnRvcCAtIHMtPmNyb3BjYXAuYm91bmRzLnRvcCksCisJICAgaF9zaXplID0gKHU4KShyZWN0LT53aWR0aCAvIDE2KSwKKwkgICB2X3NpemUgPSAodTgpKHJlY3QtPmhlaWdodCAvIDE2KTsKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIGhfc3RhcnQsIDB4MTIpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHZfc3RhcnQsIDB4MTMpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIGhfc2l6ZSwgMHgxNSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgdl9zaXplLCAweDE2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTzsKKworCVBEQkdHKCJoX3N0YXJ0LCB2X3N0YXJ0LCBoX3NpemUsIHZfc2l6ZSwgaG9fc2l6ZSwgdm9fc2l6ZSAiCisJICAgICAgIiV1ICV1ICV1ICV1IiwgaF9zdGFydCwgdl9zdGFydCwgaF9zaXplLCB2X3NpemUpCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNuOWMxMDJfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBjYW0tPnNlbnNvcjsKKwlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybDsKKwlzdHJ1Y3QgdjRsMl9yZWN0KiByZWN0OworCXU4IGkgPSAwLCBuID0gMDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghKGNhbS0+c3RhdGUgJiBERVZfSU5JVElBTElaRUQpKSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbS0+b3Blbik7CisJCXFjdHJsID0gcy0+cWN0cmw7CisJCXJlY3QgPSAmKHMtPmNyb3BjYXAuZGVmcmVjdCk7CisJfSBlbHNlIHsgLyogdXNlIGN1cnJlbnQgdmFsdWVzICovCisJCXFjdHJsID0gcy0+X3FjdHJsOworCQlyZWN0ID0gJihzLT5fcmVjdCk7CisJfQorCisJZXJyICs9IHNuOWMxMDJfc2V0X3NjYWxlKGNhbSwgcmVjdC0+d2lkdGggLyBzLT5waXhfZm9ybWF0LndpZHRoKTsKKwllcnIgKz0gc245YzEwMl9zZXRfY3JvcChjYW0sIHJlY3QpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAocy0+aW5pdCkgeworCQllcnIgPSBzLT5pbml0KGNhbSk7CisJCWlmIChlcnIpIHsKKwkJCURCRygzLCAiU2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpCisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJaWYgKCEoY2FtLT5zdGF0ZSAmIERFVl9JTklUSUFMSVpFRCkpCisJCWNhbS0+Y29tcHJlc3Npb24ucXVhbGl0eSA9ICBjYW0tPnJlZ1sweDE3XSAmIDB4MDEgPyAwIDogMTsKKwllbHNlCisJCWVyciArPSBzbjljMTAyX3NldF9jb21wcmVzc2lvbihjYW0sICZjYW0tPmNvbXByZXNzaW9uKTsKKwllcnIgKz0gc245YzEwMl9zZXRfcGl4X2Zvcm1hdChjYW0sICZzLT5waXhfZm9ybWF0KTsKKwlpZiAocy0+c2V0X3BpeF9mb3JtYXQpCisJCWVyciArPSBzLT5zZXRfcGl4X2Zvcm1hdChjYW0sICZzLT5waXhfZm9ybWF0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHMtPnBpeF9mb3JtYXQucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpCisJCURCRygzLCAiQ29tcHJlc3NlZCB2aWRlbyBmb3JtYXQgaXMgYWN0aXZlLCBxdWFsaXR5ICVkIiwgCisJCSAgICBjYW0tPmNvbXByZXNzaW9uLnF1YWxpdHkpCisJZWxzZQorCQlEQkcoMywgIlVuY29tcHJlc3NlZCB2aWRlbyBmb3JtYXQgaXMgYWN0aXZlIikKKworCWlmIChzLT5zZXRfY3JvcCkKKwkJaWYgKChlcnIgPSBzLT5zZXRfY3JvcChjYW0sIHJlY3QpKSkgeworCQkJREJHKDMsICJzZXRfY3JvcCgpIGZhaWxlZCIpCisJCQlyZXR1cm4gZXJyOworCQl9CisKKwlpZiAocy0+c2V0X2N0cmwpIHsKKwkJbiA9IHNpemVvZihzLT5xY3RybCkgLyBzaXplb2Yocy0+cWN0cmxbMF0pOworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJaWYgKHMtPnFjdHJsW2ldLmlkICE9IDAgJiYgCisJCQkgICAgIShzLT5xY3RybFtpXS5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEKSkgeworCQkJCWN0cmwuaWQgPSBzLT5xY3RybFtpXS5pZDsKKwkJCQljdHJsLnZhbHVlID0gcWN0cmxbaV0uZGVmYXVsdF92YWx1ZTsKKwkJCQllcnIgPSBzLT5zZXRfY3RybChjYW0sICZjdHJsKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCURCRygzLCAiU2V0ICVzIGNvbnRyb2wgZmFpbGVkIiwKKwkJCQkJICAgIHMtPnFjdHJsW2ldLm5hbWUpCisJCQkJCXJldHVybiBlcnI7CisJCQkJfQorCQkJCURCRygzLCAiSW1hZ2Ugc2Vuc29yIHN1cHBvcnRzICclcycgY29udHJvbCIsCisJCQkJICAgIHMtPnFjdHJsW2ldLm5hbWUpCisJCQl9CisJfQorCisJaWYgKCEoY2FtLT5zdGF0ZSAmIERFVl9JTklUSUFMSVpFRCkpIHsKKwkJaW5pdF9NVVRFWCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmNhbS0+cXVldWVfbG9jayk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbS0+d2FpdF9mcmFtZSk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbS0+d2FpdF9zdHJlYW0pOworCQljYW0tPm5yZWFkYnVmZmVycyA9IDI7CisJCW1lbWNweShzLT5fcWN0cmwsIHMtPnFjdHJsLCBzaXplb2Yocy0+cWN0cmwpKTsKKwkJbWVtY3B5KCYocy0+X3JlY3QpLCAmKHMtPmNyb3BjYXAuZGVmcmVjdCksIAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2NGwyX3JlY3QpKTsKKwkJY2FtLT5zdGF0ZSB8PSBERVZfSU5JVElBTElaRUQ7CisJfQorCisJREJHKDIsICJJbml0aWFsaXphdGlvbiBzdWNjZWVkZWQiKQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNuOWMxMDJfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJZG93bigmc245YzEwMl9zeXNmc19sb2NrKTsKKworCURCRygyLCAiVjRMMiBkZXZpY2UgL2Rldi92aWRlbyVkIGRlcmVnaXN0ZXJlZCIsIGNhbS0+djRsZGV2LT5taW5vcikKKwl2aWRlb19zZXRfZHJ2ZGF0YShjYW0tPnY0bGRldiwgTlVMTCk7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoY2FtLT52NGxkZXYpOworCisJdXAoJnNuOWMxMDJfc3lzZnNfbG9jayk7CisKKwlrZnJlZShjYW0tPmNvbnRyb2xfYnVmZmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHNuOWMxMDJfb3BlbihzdHJ1Y3QgaW5vZGUqIGlub2RlLCBzdHJ1Y3QgZmlsZSogZmlscCkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbTsKKwlpbnQgZXJyID0gMDsKKworCS8qCisJICAgVGhpcyBpcyB0aGUgb25seSBzYWZlIHdheSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoCisJICAgZGlzY29ubmVjdAorCSovCisJaWYgKCFkb3duX3JlYWRfdHJ5bG9jaygmc245YzEwMl9kaXNjb25uZWN0KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2FtLT5kZXZfc2VtKSkgeworCQl1cF9yZWFkKCZzbjljMTAyX2Rpc2Nvbm5lY3QpOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworCWlmIChjYW0tPnVzZXJzKSB7CisJCURCRygyLCAiRGV2aWNlIC9kZXYvdmlkZW8lZCBpcyBidXN5Li4uIiwgY2FtLT52NGxkZXYtPm1pbm9yKQorCQlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCQkgICAgKGZpbHAtPmZfZmxhZ3MgJiBPX05ERUxBWSkpIHsKKwkJCWVyciA9IC1FV09VTERCTE9DSzsKKwkJCWdvdG8gb3V0OworCQl9CisJCXVwKCZjYW0tPmRldl9zZW0pOworCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfZXhjbHVzaXZlKGNhbS0+b3BlbiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVECisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWNhbS0+dXNlcnMpOworCQlpZiAoZXJyKSB7CisJCQl1cF9yZWFkKCZzbjljMTAyX2Rpc2Nvbm5lY3QpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKKwkJCXVwX3JlYWQoJnNuOWMxMDJfZGlzY29ubmVjdCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlkb3duKCZjYW0tPmRldl9zZW0pOworCX0KKworCisJaWYgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgeworCQllcnIgPSBzbjljMTAyX2luaXQoY2FtKTsKKwkJaWYgKGVycikgeworCQkJREJHKDEsICJJbml0aWFsaXphdGlvbiBmYWlsZWQgYWdhaW4uICIKKwkJCSAgICAgICAiSSB3aWxsIHJldHJ5IG9uIG5leHQgb3BlbigpLiIpCisJCQlnb3RvIG91dDsKKwkJfQorCQljYW0tPnN0YXRlICY9IH5ERVZfTUlTQ09ORklHVVJFRDsKKwl9CisKKwlpZiAoKGVyciA9IHNuOWMxMDJfc3RhcnRfdHJhbnNmZXIoY2FtKSkpCisJCWdvdG8gb3V0OworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gY2FtOworCWNhbS0+dXNlcnMrKzsKKwljYW0tPmlvID0gSU9fTk9ORTsKKwljYW0tPnN0cmVhbSA9IFNUUkVBTV9PRkY7CisJY2FtLT5uYnVmZmVycyA9IDA7CisJY2FtLT5mcmFtZV9jb3VudCA9IDA7CisJc245YzEwMl9lbXB0eV9mcmFtZXF1ZXVlcyhjYW0pOworCisJREJHKDMsICJWaWRlbyBkZXZpY2UgL2Rldi92aWRlbyVkIGlzIG9wZW4iLCBjYW0tPnY0bGRldi0+bWlub3IpCisKK291dDoKKwl1cCgmY2FtLT5kZXZfc2VtKTsKKwl1cF9yZWFkKCZzbjljMTAyX2Rpc2Nvbm5lY3QpOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBzbjljMTAyX3JlbGVhc2Uoc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbHApCit7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKworCWRvd24oJmNhbS0+ZGV2X3NlbSk7IC8qIHByZXZlbnQgZGlzY29ubmVjdCgpIHRvIGJlIGNhbGxlZCAqLworCisJc245YzEwMl9zdG9wX3RyYW5zZmVyKGNhbSk7CisKKwlzbjljMTAyX3JlbGVhc2VfYnVmZmVycyhjYW0pOworCisJaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB7CisJCXNuOWMxMDJfcmVsZWFzZV9yZXNvdXJjZXMoY2FtKTsKKwkJdXAoJmNhbS0+ZGV2X3NlbSk7CisJCWtmcmVlKGNhbSk7CisJCXJldHVybiAwOworCX0KKworCWNhbS0+dXNlcnMtLTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfbnIoJmNhbS0+b3BlbiwgMSk7CisKKwlEQkcoMywgIlZpZGVvIGRldmljZSAvZGV2L3ZpZGVvJWQgY2xvc2VkIiwgY2FtLT52NGxkZXYtPm1pbm9yKQorCisJdXAoJmNhbS0+ZGV2X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3NpemVfdAorc245YzEwMl9yZWFkKHN0cnVjdCBmaWxlKiBmaWxwLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QqIGZfcG9zKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJc3RydWN0IHNuOWMxMDJfZnJhbWVfdCogZiwgKiBpOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKwlpbnQgZXJyID0gMDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNhbS0+ZmlsZW9wX3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKKwkJREJHKDEsICJEZXZpY2Ugbm90IHByZXNlbnQiKQorCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgeworCQlEQkcoMSwgIlRoZSBjYW1lcmEgaXMgbWlzY29uZmlndXJlZC4gQ2xvc2UgYW5kIG9wZW4gaXQgYWdhaW4uIikKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChjYW0tPmlvID09IElPX01NQVApIHsKKwkJREJHKDMsICJDbG9zZSBhbmQgb3BlbiB0aGUgZGV2aWNlIGFnYWluIHRvIGNob29zZSAiCisJCSAgICAgICAidGhlIHJlYWQgbWV0aG9kIikKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjYW0tPmlvID09IElPX05PTkUpIHsKKwkJaWYgKCFzbjljMTAyX3JlcXVlc3RfYnVmZmVycyhjYW0sY2FtLT5ucmVhZGJ1ZmZlcnMsIElPX1JFQUQpKSB7CisJCQlEQkcoMSwgInJlYWQoKSBmYWlsZWQsIG5vdCBlbm91Z2ggbWVtb3J5IikKKwkJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJY2FtLT5pbyA9IElPX1JFQUQ7CisJCWNhbS0+c3RyZWFtID0gU1RSRUFNX09OOworCQlzbjljMTAyX3F1ZXVlX3VudXNlZGZyYW1lcyhjYW0pOworCX0KKworCWlmICghY291bnQpIHsKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsaXN0X2VtcHR5KCZjYW0tPm91dHF1ZXVlKSkgeworCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlCisJCSAgICAgICggY2FtLT53YWl0X2ZyYW1lLCAKKwkJICAgICAgICAoIWxpc3RfZW1wdHkoJmNhbS0+b3V0cXVldWUpKSB8fAorCQkgICAgICAgIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgfHwKKwkJCShjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpICk7CisJCWlmIChlcnIpIHsKKwkJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKKwkJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgeworCQkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCWYgPSBsaXN0X2VudHJ5KGNhbS0+b3V0cXVldWUucHJldiwgc3RydWN0IHNuOWMxMDJfZnJhbWVfdCwgZnJhbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmY2FtLT5vdXRxdWV1ZSwgZnJhbWUpCisJCWktPnN0YXRlID0gRl9VTlVTRUQ7CisJSU5JVF9MSVNUX0hFQUQoJmNhbS0+b3V0cXVldWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7CisKKwlzbjljMTAyX3F1ZXVlX3VudXNlZGZyYW1lcyhjYW0pOworCisJaWYgKGNvdW50ID4gZi0+YnVmLmJ5dGVzdXNlZCkKKwkJY291bnQgPSBmLT5idWYuYnl0ZXN1c2VkOworCisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGYtPmJ1Zm1lbSwgY291bnQpKSB7CisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJKmZfcG9zICs9IGNvdW50OworCisJUERCR0coIkZyYW1lICMlbHUsIGJ5dGVzIHJlYWQ6ICV6dSIsICh1bnNpZ25lZCBsb25nKWYtPmJ1Zi5pbmRleCxjb3VudCkKKworCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCisJcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc245YzEwMl9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2FtLT5maWxlb3Bfc2VtKSkKKwkJcmV0dXJuIFBPTExFUlI7CisKKwlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKKwkJREJHKDEsICJEZXZpY2Ugbm90IHByZXNlbnQiKQorCQlnb3RvIGVycm9yOworCX0KKworCWlmIChjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpIHsKKwkJREJHKDEsICJUaGUgY2FtZXJhIGlzIG1pc2NvbmZpZ3VyZWQuIENsb3NlIGFuZCBvcGVuIGl0IGFnYWluLiIpCisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGNhbS0+aW8gPT0gSU9fTk9ORSkgeworCQlpZiAoIXNuOWMxMDJfcmVxdWVzdF9idWZmZXJzKGNhbSwgY2FtLT5ucmVhZGJ1ZmZlcnMsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9fUkVBRCkpIHsKKwkJCURCRygxLCAicG9sbCgpIGZhaWxlZCwgbm90IGVub3VnaCBtZW1vcnkiKQorCQkJZ290byBlcnJvcjsKKwkJfQorCQljYW0tPmlvID0gSU9fUkVBRDsKKwkJY2FtLT5zdHJlYW0gPSBTVFJFQU1fT047CisJfQorCisJaWYgKGNhbS0+aW8gPT0gSU9fUkVBRCkKKwkJc245YzEwMl9xdWV1ZV91bnVzZWRmcmFtZXMoY2FtKTsKKworCXBvbGxfd2FpdChmaWxwLCAmY2FtLT53YWl0X2ZyYW1lLCB3YWl0KTsKKworCWlmICghbGlzdF9lbXB0eSgmY2FtLT5vdXRxdWV1ZSkpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCisJcmV0dXJuIG1hc2s7CisKK2Vycm9yOgorCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCXJldHVybiBQT0xMRVJSOworfQorCisKK3N0YXRpYyB2b2lkIHNuOWMxMDJfdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QqIHZtYSkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9mcmFtZV90KiBmID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisJZi0+dm1hX3VzZV9jb3VudCsrOworfQorCisKK3N0YXRpYyB2b2lkIHNuOWMxMDJfdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0KiB2bWEpCit7CisJLyogTk9URTogYnVmZmVycyBhcmUgbm90IGZyZWVkIGhlcmUgKi8KKwlzdHJ1Y3Qgc245YzEwMl9mcmFtZV90KiBmID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisJZi0+dm1hX3VzZV9jb3VudC0tOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc245YzEwMl92bV9vcHMgPSB7CisJLm9wZW4gPSBzbjljMTAyX3ZtX29wZW4sCisJLmNsb3NlID0gc245YzEwMl92bV9jbG9zZSwKK307CisKKworc3RhdGljIGludCBzbjljMTAyX21tYXAoc3RydWN0IGZpbGUqIGZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJdW5zaWduZWQgbG9uZyBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCSAgICAgICAgICAgICAgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0LAorCSAgICAgICAgICAgICAgcG9zLAorCSAgICAgICAgICAgICAgcGFnZTsKKwl1MzIgaTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNhbS0+ZmlsZW9wX3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKKwkJREJHKDEsICJEZXZpY2Ugbm90IHByZXNlbnQiKQorCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgeworCQlEQkcoMSwgIlRoZSBjYW1lcmEgaXMgbWlzY29uZmlndXJlZC4gQ2xvc2UgYW5kIG9wZW4gaXQgYWdhaW4uIikKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChjYW0tPmlvICE9IElPX01NQVAgfHwgISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHx8CisJICAgIHNpemUgIT0gUEFHRV9BTElHTihjYW0tPmZyYW1lWzBdLmJ1Zi5sZW5ndGgpKSB7CisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKSB7CisJCWlmICgoY2FtLT5mcmFtZVtpXS5idWYubS5vZmZzZXQ+PlBBR0VfU0hJRlQpID09IHZtYS0+dm1fcGdvZmYpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gY2FtLT5uYnVmZmVycykgeworCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVk1fSU8gaXMgZXZlbnR1YWxseSBnb2luZyB0byByZXBsYWNlIFBhZ2VSZXNlcnZlZCBhbHRvZ2V0aGVyICovCisJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOyAvKiBhdm9pZCB0byBzd2FwIG91dCB0aGlzIFZNQSAqLworCisJcG9zID0gKHVuc2lnbmVkIGxvbmcpY2FtLT5mcmFtZVtpXS5idWZtZW07CisJd2hpbGUgKHNpemUgPiAwKSB7IC8qIHNpemUgaXMgcGFnZS1hbGlnbmVkICovCisJCXBhZ2UgPSB2bWFsbG9jX3RvX3Bmbigodm9pZCAqKXBvcyk7CisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwgUEFHRV9TSVpFLAorCQkgICAgICAgICAgICAgICAgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQlzdGFydCArPSBQQUdFX1NJWkU7CisJCXBvcyArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKworCXZtYS0+dm1fb3BzID0gJnNuOWMxMDJfdm1fb3BzOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gJmNhbS0+ZnJhbWVbaV07CisKKwlzbjljMTAyX3ZtX29wZW4odm1hKTsKKworCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzbjljMTAyX2lvY3RsX3Y0bDIoc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKK3sKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgVklESU9DX1FVRVJZQ0FQOgorCXsKKwkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSBjYXAgPSB7CisJCQkuZHJpdmVyID0gInNuOWMxMDIiLAorCQkJLnZlcnNpb24gPSBTTjlDMTAyX01PRFVMRV9WRVJTSU9OX0NPREUsCisJCQkuY2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IAorCQkJICAgICAgICAgICAgICAgIFY0TDJfQ0FQX1JFQURXUklURSB8CisJCQkgICAgICAgICAgICAgICAgVjRMMl9DQVBfU1RSRUFNSU5HLAorCQl9OworCisJCXN0cmxjcHkoY2FwLmNhcmQsIGNhbS0+djRsZGV2LT5uYW1lLCBzaXplb2YoY2FwLmNhcmQpKTsKKwkJaWYgKHVzYl9tYWtlX3BhdGgoY2FtLT51c2JkZXYsIGNhcC5idXNfaW5mbywKKwkJICAgIHNpemVvZihjYXAuYnVzX2luZm8pKSA8IDApCisJCQlzdHJsY3B5KGNhcC5idXNfaW5mbywgY2FtLT5kZXYuYnVzX2lkLAorCQkJICAgICAgICBzaXplb2YoY2FwLmJ1c19pbmZvKSk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjYXAsIHNpemVvZihjYXApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwl7CisJCXN0cnVjdCB2NGwyX2lucHV0IGk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpLCBhcmcsIHNpemVvZihpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaS5pbmRleCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW1lbXNldCgmaSwgMCwgc2l6ZW9mKGkpKTsKKwkJc3RyY3B5KGkubmFtZSwgIlVTQiIpOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaSwgc2l6ZW9mKGkpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJY2FzZSBWSURJT0NfU19JTlBVVDoKKwl7CisJCWludCBpbmRleDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZGV4LCBhcmcsIHNpemVvZihpbmRleCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGluZGV4ICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19RVUVSWUNUUkw6CisJeworCQlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBjYW0tPnNlbnNvcjsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsIHFjOworCQl1OCBpLCBuOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcWMsIGFyZywgc2l6ZW9mKHFjKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQluID0gc2l6ZW9mKHMtPnFjdHJsKSAvIHNpemVvZihzLT5xY3RybFswXSk7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQlpZiAocWMuaWQgJiYgcWMuaWQgPT0gcy0+cWN0cmxbaV0uaWQpIHsKKwkJCQltZW1jcHkoJnFjLCAmKHMtPnFjdHJsW2ldKSwgc2l6ZW9mKHFjKSk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZxYywgc2l6ZW9mKHFjKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXJldHVybiAwOworCQkJfQorCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhc2UgVklESU9DX0dfQ1RSTDoKKwl7CisJCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9IGNhbS0+c2Vuc29yOworCQlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisJCWludCBlcnIgPSAwOworCisJCWlmICghcy0+Z2V0X2N0cmwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmN0cmwsIGFyZywgc2l6ZW9mKGN0cmwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWVyciA9IHMtPmdldF9jdHJsKGNhbSwgJmN0cmwpOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY3RybCwgc2l6ZW9mKGN0cmwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisJfQorCisJY2FzZSBWSURJT0NfU19DVFJMX09MRDoKKwljYXNlIFZJRElPQ19TX0NUUkw6CisJeworCQlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBjYW0tPnNlbnNvcjsKKwkJc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOworCQl1OCBpLCBuOworCQlpbnQgZXJyID0gMDsKKworCQlpZiAoIXMtPnNldF9jdHJsKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHJsLCBhcmcsIHNpemVvZihjdHJsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQluID0gc2l6ZW9mKHMtPnFjdHJsKSAvIHNpemVvZihzLT5xY3RybFswXSk7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQlpZiAoY3RybC5pZCA9PSBzLT5xY3RybFtpXS5pZCkgeworCQkJCWlmIChjdHJsLnZhbHVlIDwgcy0+cWN0cmxbaV0ubWluaW11bSB8fAorCQkJCSAgICBjdHJsLnZhbHVlID4gcy0+cWN0cmxbaV0ubWF4aW11bSkKKwkJCQkJcmV0dXJuIC1FUkFOR0U7CisJCQkJY3RybC52YWx1ZSAtPSBjdHJsLnZhbHVlICUgcy0+cWN0cmxbaV0uc3RlcDsKKwkJCQlicmVhazsKKwkJCX0KKworCQlpZiAoKGVyciA9IHMtPnNldF9jdHJsKGNhbSwgJmN0cmwpKSkKKwkJCXJldHVybiBlcnI7CisKKwkJcy0+X3FjdHJsW2ldLmRlZmF1bHRfdmFsdWUgPSBjdHJsLnZhbHVlOworCisJCVBEQkdHKCJWSURJT0NfU19DVFJMOiBpZCAlbHUsIHZhbHVlICVsdSIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKWN0cmwuaWQsICh1bnNpZ25lZCBsb25nKWN0cmwudmFsdWUpCisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfQ1JPUENBUDoKKwl7CisJCXN0cnVjdCB2NGwyX2Nyb3BjYXAqIGNjID0gJihjYW0tPnNlbnNvci0+Y3JvcGNhcCk7CisKKwkJY2MtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCWNjLT5waXhlbGFzcGVjdC5udW1lcmF0b3IgPSAxOworCQljYy0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IgPSAxOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBjYywgc2l6ZW9mKCpjYykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfR19DUk9QOgorCXsKKwkJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gY2FtLT5zZW5zb3I7CisJCXN0cnVjdCB2NGwyX2Nyb3AgY3JvcCA9IHsKKwkJCS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQl9OworCisJCW1lbWNweSgmKGNyb3AuYyksICYocy0+X3JlY3QpLCBzaXplb2Yoc3RydWN0IHY0bDJfcmVjdCkpOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY3JvcCwgc2l6ZW9mKGNyb3ApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX1NfQ1JPUDoKKwl7CisJCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9IGNhbS0+c2Vuc29yOworCQlzdHJ1Y3QgdjRsMl9jcm9wIGNyb3A7CisJCXN0cnVjdCB2NGwyX3JlY3QqIHJlY3Q7CisJCXN0cnVjdCB2NGwyX3JlY3QqIGJvdW5kcyA9ICYocy0+Y3JvcGNhcC5ib3VuZHMpOworCQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KiBwaXhfZm9ybWF0ID0gJihzLT5waXhfZm9ybWF0KTsKKwkJdTggc2NhbGU7CisJCWNvbnN0IGVudW0gc245YzEwMl9zdHJlYW1fc3RhdGUgc3RyZWFtID0gY2FtLT5zdHJlYW07CisJCWNvbnN0IHUzMiBuYnVmZmVycyA9IGNhbS0+bmJ1ZmZlcnM7CisJCXUzMiBpOworCQlpbnQgZXJyID0gMDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNyb3AsIGFyZywgc2l6ZW9mKGNyb3ApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJlY3QgPSAmKGNyb3AuYyk7CisKKwkJaWYgKGNyb3AudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY2FtLT5tb2R1bGVfcGFyYW0uZm9yY2VfbXVubWFwKQorCQkJZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZmZlcnM7IGkrKykKKwkJCQlpZiAoY2FtLT5mcmFtZVtpXS52bWFfdXNlX2NvdW50KSB7CisJCQkJCURCRygzLCAiVklESU9DX1NfQ1JPUCBmYWlsZWQuICIKKwkJCQkJICAgICAgICJVbm1hcCB0aGUgYnVmZmVycyBmaXJzdC4iKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJLyogUHJlc2VydmUgUixHIG9yIEIgb3JpZ2luICovCisJCXJlY3QtPmxlZnQgPSAocy0+X3JlY3QubGVmdCAmIDFMKSA/CisJCSAgICAgICAgICAgICByZWN0LT5sZWZ0IHwgMUwgOiByZWN0LT5sZWZ0ICYgfjFMOworCQlyZWN0LT50b3AgPSAocy0+X3JlY3QudG9wICYgMUwpID8KKwkJICAgICAgICAgICAgcmVjdC0+dG9wIHwgMUwgOiByZWN0LT50b3AgJiB+MUw7CisKKwkJaWYgKHJlY3QtPndpZHRoIDwgMTYpCisJCQlyZWN0LT53aWR0aCA9IDE2OworCQlpZiAocmVjdC0+aGVpZ2h0IDwgMTYpCisJCQlyZWN0LT5oZWlnaHQgPSAxNjsKKwkJaWYgKHJlY3QtPndpZHRoID4gYm91bmRzLT53aWR0aCkKKwkJCXJlY3QtPndpZHRoID0gYm91bmRzLT53aWR0aDsKKwkJaWYgKHJlY3QtPmhlaWdodCA+IGJvdW5kcy0+aGVpZ2h0KQorCQkJcmVjdC0+aGVpZ2h0ID0gYm91bmRzLT5oZWlnaHQ7CisJCWlmIChyZWN0LT5sZWZ0IDwgYm91bmRzLT5sZWZ0KQorCQkJcmVjdC0+bGVmdCA9IGJvdW5kcy0+bGVmdDsKKwkJaWYgKHJlY3QtPnRvcCA8IGJvdW5kcy0+dG9wKQorCQkJcmVjdC0+dG9wID0gYm91bmRzLT50b3A7CisJCWlmIChyZWN0LT5sZWZ0ICsgcmVjdC0+d2lkdGggPiBib3VuZHMtPmxlZnQgKyBib3VuZHMtPndpZHRoKQorCQkJcmVjdC0+bGVmdCA9IGJvdW5kcy0+bGVmdCtib3VuZHMtPndpZHRoIC0gcmVjdC0+d2lkdGg7CisJCWlmIChyZWN0LT50b3AgKyByZWN0LT5oZWlnaHQgPiBib3VuZHMtPnRvcCArIGJvdW5kcy0+aGVpZ2h0KQorCQkJcmVjdC0+dG9wID0gYm91bmRzLT50b3ArYm91bmRzLT5oZWlnaHQgLSByZWN0LT5oZWlnaHQ7CisKKwkJcmVjdC0+d2lkdGggJj0gfjE1TDsKKwkJcmVjdC0+aGVpZ2h0ICY9IH4xNUw7CisKKwkJaWYgKFNOOUMxMDJfUFJFU0VSVkVfSU1HU0NBTEUpIHsKKwkJCS8qIENhbGN1bGF0ZSB0aGUgYWN0dWFsIHNjYWxpbmcgZmFjdG9yICovCisJCQl1MzIgYSwgYjsKKwkJCWEgPSByZWN0LT53aWR0aCAqIHJlY3QtPmhlaWdodDsKKwkJCWIgPSBwaXhfZm9ybWF0LT53aWR0aCAqIHBpeF9mb3JtYXQtPmhlaWdodDsKKwkJCXNjYWxlID0gYiA/ICh1OCkoKGEgLyBiKSA8IDQgPyAxIDoKKwkJICAgICAgICAgICAgICAgICAgICAgICAgKChhIC8gYikgPCAxNiA/IDIgOiA0KSkgOiAxOworCQl9IGVsc2UKKwkJCXNjYWxlID0gMTsKKworCQlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQorCQkJaWYgKChlcnIgPSBzbjljMTAyX3N0cmVhbV9pbnRlcnJ1cHQoY2FtKSkpCisJCQkJcmV0dXJuIGVycjsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJmNyb3AsIHNpemVvZihjcm9wKSkpIHsKKwkJCWNhbS0+c3RyZWFtID0gc3RyZWFtOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAoY2FtLT5tb2R1bGVfcGFyYW0uZm9yY2VfbXVubWFwIHx8IGNhbS0+aW8gPT0gSU9fUkVBRCkKKwkJCXNuOWMxMDJfcmVsZWFzZV9idWZmZXJzKGNhbSk7CisKKwkJZXJyID0gc245YzEwMl9zZXRfY3JvcChjYW0sIHJlY3QpOworCQlpZiAocy0+c2V0X2Nyb3ApCisJCQllcnIgKz0gcy0+c2V0X2Nyb3AoY2FtLCByZWN0KTsKKwkJZXJyICs9IHNuOWMxMDJfc2V0X3NjYWxlKGNhbSwgc2NhbGUpOworCisJCWlmIChlcnIpIHsgLyogYXRvbWljLCBubyByb2xsYmFjayBpbiBpb2N0bCgpICovCisJCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOworCQkJREJHKDEsICJWSURJT0NfU19DUk9QIGZhaWxlZCBiZWNhdXNlIG9mIGhhcmR3YXJlICIKKwkJCSAgICAgICAicHJvYmxlbXMuIFRvIHVzZSB0aGUgY2FtZXJhLCBjbG9zZSBhbmQgb3BlbiAiCisJCQkgICAgICAgIi9kZXYvdmlkZW8lZCBhZ2Fpbi4iLCBjYW0tPnY0bGRldi0+bWlub3IpCisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCXMtPnBpeF9mb3JtYXQud2lkdGggPSByZWN0LT53aWR0aC9zY2FsZTsKKwkJcy0+cGl4X2Zvcm1hdC5oZWlnaHQgPSByZWN0LT5oZWlnaHQvc2NhbGU7CisJCW1lbWNweSgmKHMtPl9yZWN0KSwgcmVjdCwgc2l6ZW9mKCpyZWN0KSk7CisKKwkJaWYgKChjYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXAgfHwgY2FtLT5pbyA9PSBJT19SRUFEKSAmJgorCQkgICAgbmJ1ZmZlcnMgIT0gc245YzEwMl9yZXF1ZXN0X2J1ZmZlcnMoY2FtLCBuYnVmZmVycywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbS0+aW8pKSB7CisJCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOworCQkJREJHKDEsICJWSURJT0NfU19DUk9QIGZhaWxlZCBiZWNhdXNlIG9mIG5vdCBlbm91Z2ggIgorCQkJICAgICAgICJtZW1vcnkuIFRvIHVzZSB0aGUgY2FtZXJhLCBjbG9zZSBhbmQgb3BlbiAiCisJCQkgICAgICAgIi9kZXYvdmlkZW8lZCBhZ2Fpbi4iLCBjYW0tPnY0bGRldi0+bWlub3IpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWNhbS0+c3RyZWFtID0gc3RyZWFtOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX0VOVU1fRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm10ZGVzYyBmbXRkOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZm10ZCwgYXJnLCBzaXplb2YoZm10ZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGZtdGQuaW5kZXggPT0gMCkgeworCQkJc3RyY3B5KGZtdGQuZGVzY3JpcHRpb24sICJiYXllciByZ2IiKTsKKwkJCWZtdGQucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfU0JHR1I4OworCQl9IGVsc2UgaWYgKGZtdGQuaW5kZXggPT0gMSkgeworCQkJc3RyY3B5KGZtdGQuZGVzY3JpcHRpb24sICJjb21wcmVzc2VkIik7CisJCQlmbXRkLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NOOUMxMFg7CisJCQlmbXRkLmZsYWdzID0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWZtdGQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwkJbWVtc2V0KCZmbXRkLnJlc2VydmVkLCAwLCBzaXplb2YoZm10ZC5yZXNlcnZlZCkpOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZm10ZCwgc2l6ZW9mKGZtdGQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX0dfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0IGZvcm1hdDsKKwkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGZtdCA9ICYoY2FtLT5zZW5zb3ItPnBpeF9mb3JtYXQpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZm9ybWF0LCBhcmcsIHNpemVvZihmb3JtYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChmb3JtYXQudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwZm10LT5ieXRlc3BlcmxpbmUgPSAocGZtdC0+cGl4ZWxmb3JtYXQ9PVY0TDJfUElYX0ZNVF9TTjlDMTBYKQorCQkgICAgICAgICAgICAgICAgICAgICA/IDAgOiAocGZtdC0+d2lkdGggKiBwZm10LT5wcml2KSAvIDg7CisJCXBmbXQtPnNpemVpbWFnZSA9IHBmbXQtPmhlaWdodCAqICgocGZtdC0+d2lkdGgqcGZtdC0+cHJpdikvOCk7CisJCXBmbXQtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQltZW1jcHkoJihmb3JtYXQuZm10LnBpeCksIHBmbXQsIHNpemVvZigqcGZtdCkpOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZm9ybWF0LCBzaXplb2YoZm9ybWF0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19UUllfRk1UOgorCWNhc2UgVklESU9DX1NfRk1UOgorCXsKKwkJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gY2FtLT5zZW5zb3I7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCBmb3JtYXQ7CisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHBpeDsKKwkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGZtdCA9ICYocy0+cGl4X2Zvcm1hdCk7CisJCXN0cnVjdCB2NGwyX3JlY3QqIGJvdW5kcyA9ICYocy0+Y3JvcGNhcC5ib3VuZHMpOworCQlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3Q7CisJCXU4IHNjYWxlOworCQljb25zdCBlbnVtIHNuOWMxMDJfc3RyZWFtX3N0YXRlIHN0cmVhbSA9IGNhbS0+c3RyZWFtOworCQljb25zdCB1MzIgbmJ1ZmZlcnMgPSBjYW0tPm5idWZmZXJzOworCQl1MzIgaTsKKwkJaW50IGVyciA9IDA7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmb3JtYXQsIGFyZywgc2l6ZW9mKGZvcm1hdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcGl4ID0gJihmb3JtYXQuZm10LnBpeCk7CisKKwkJaWYgKGZvcm1hdC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW1lbWNweSgmcmVjdCwgJihzLT5fcmVjdCksIHNpemVvZihyZWN0KSk7CisKKwkJeyAvKiBjYWxjdWxhdGUgdGhlIGFjdHVhbCBzY2FsaW5nIGZhY3RvciAqLworCQkJdTMyIGEsIGI7CisJCQlhID0gcmVjdC53aWR0aCAqIHJlY3QuaGVpZ2h0OworCQkJYiA9IHBpeC0+d2lkdGggKiBwaXgtPmhlaWdodDsKKwkJCXNjYWxlID0gYiA/ICh1OCkoKGEgLyBiKSA8IDQgPyAxIDoKKwkJICAgICAgICAgICAgICAgICAgICAgICAgKChhIC8gYikgPCAxNiA/IDIgOiA0KSkgOiAxOworCQl9CisKKwkJcmVjdC53aWR0aCA9IHNjYWxlICogcGl4LT53aWR0aDsKKwkJcmVjdC5oZWlnaHQgPSBzY2FsZSAqIHBpeC0+aGVpZ2h0OworCisJCWlmIChyZWN0LndpZHRoIDwgMTYpCisJCQlyZWN0LndpZHRoID0gMTY7CisJCWlmIChyZWN0LmhlaWdodCA8IDE2KQorCQkJcmVjdC5oZWlnaHQgPSAxNjsKKwkJaWYgKHJlY3Qud2lkdGggPiBib3VuZHMtPmxlZnQgKyBib3VuZHMtPndpZHRoIC0gcmVjdC5sZWZ0KQorCQkJcmVjdC53aWR0aCA9IGJvdW5kcy0+bGVmdCArIGJvdW5kcy0+d2lkdGggLSByZWN0LmxlZnQ7CisJCWlmIChyZWN0LmhlaWdodCA+IGJvdW5kcy0+dG9wICsgYm91bmRzLT5oZWlnaHQgLSByZWN0LnRvcCkKKwkJCXJlY3QuaGVpZ2h0ID0gYm91bmRzLT50b3AgKyBib3VuZHMtPmhlaWdodCAtIHJlY3QudG9wOworCisJCXJlY3Qud2lkdGggJj0gfjE1TDsKKwkJcmVjdC5oZWlnaHQgJj0gfjE1TDsKKworCQl7IC8qIGFkanVzdCB0aGUgc2NhbGluZyBmYWN0b3IgKi8KKwkJCXUzMiBhLCBiOworCQkJYSA9IHJlY3Qud2lkdGggKiByZWN0LmhlaWdodDsKKwkJCWIgPSBwaXgtPndpZHRoICogcGl4LT5oZWlnaHQ7CisJCQlzY2FsZSA9IGIgPyAodTgpKChhIC8gYikgPCA0ID8gMSA6CisJCSAgICAgICAgICAgICAgICAgICAgICAgICgoYSAvIGIpIDwgMTYgPyAyIDogNCkpIDogMTsKKwkJfQorCisJCXBpeC0+d2lkdGggPSByZWN0LndpZHRoIC8gc2NhbGU7CisJCXBpeC0+aGVpZ2h0ID0gcmVjdC5oZWlnaHQgLyBzY2FsZTsKKworCQlpZiAocGl4LT5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfU045QzEwWCAmJgorCQkgICAgcGl4LT5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfU0JHR1I4KQorCQkJcGl4LT5waXhlbGZvcm1hdCA9IHBmbXQtPnBpeGVsZm9ybWF0OworCQlwaXgtPnByaXYgPSBwZm10LT5wcml2OyAvKiBicHAgKi8KKwkJcGl4LT5jb2xvcnNwYWNlID0gcGZtdC0+Y29sb3JzcGFjZTsKKwkJcGl4LT5ieXRlc3BlcmxpbmUgPSAocGl4LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCkKKwkJICAgICAgICAgICAgICAgICAgICA/IDAgOiAocGl4LT53aWR0aCAqIHBpeC0+cHJpdikgLyA4OworCQlwaXgtPnNpemVpbWFnZSA9IHBpeC0+aGVpZ2h0ICogKChwaXgtPndpZHRoICogcGl4LT5wcml2KSAvIDgpOworCQlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCisJCWlmIChjbWQgPT0gVklESU9DX1RSWV9GTVQpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZm9ybWF0LCBzaXplb2YoZm9ybWF0KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChjYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXApCisJCQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmZmVyczsgaSsrKQorCQkJCWlmIChjYW0tPmZyYW1lW2ldLnZtYV91c2VfY291bnQpIHsKKwkJCQkJREJHKDMsICJWSURJT0NfU19GTVQgZmFpbGVkLiAiCisJCQkJCSAgICAgICAiVW5tYXAgdGhlIGJ1ZmZlcnMgZmlyc3QuIikKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT04pCisJCQlpZiAoKGVyciA9IHNuOWMxMDJfc3RyZWFtX2ludGVycnVwdChjYW0pKSkKKwkJCQlyZXR1cm4gZXJyOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZm9ybWF0LCBzaXplb2YoZm9ybWF0KSkpIHsKKwkJCWNhbS0+c3RyZWFtID0gc3RyZWFtOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAoY2FtLT5tb2R1bGVfcGFyYW0uZm9yY2VfbXVubWFwICB8fCBjYW0tPmlvID09IElPX1JFQUQpCisJCQlzbjljMTAyX3JlbGVhc2VfYnVmZmVycyhjYW0pOworCisJCWVyciArPSBzbjljMTAyX3NldF9waXhfZm9ybWF0KGNhbSwgcGl4KTsKKwkJZXJyICs9IHNuOWMxMDJfc2V0X2Nyb3AoY2FtLCAmcmVjdCk7CisJCWlmIChzLT5zZXRfcGl4X2Zvcm1hdCkKKwkJCWVyciArPSBzLT5zZXRfcGl4X2Zvcm1hdChjYW0sIHBpeCk7CisJCWlmIChzLT5zZXRfY3JvcCkKKwkJCWVyciArPSBzLT5zZXRfY3JvcChjYW0sICZyZWN0KTsKKwkJZXJyICs9IHNuOWMxMDJfc2V0X3NjYWxlKGNhbSwgc2NhbGUpOworCisJCWlmIChlcnIpIHsgLyogYXRvbWljLCBubyByb2xsYmFjayBpbiBpb2N0bCgpICovCisJCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOworCQkJREJHKDEsICJWSURJT0NfU19GTVQgZmFpbGVkIGJlY2F1c2Ugb2YgaGFyZHdhcmUgIgorCQkJICAgICAgICJwcm9ibGVtcy4gVG8gdXNlIHRoZSBjYW1lcmEsIGNsb3NlIGFuZCBvcGVuICIKKwkJCSAgICAgICAiL2Rldi92aWRlbyVkIGFnYWluLiIsIGNhbS0+djRsZGV2LT5taW5vcikKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJbWVtY3B5KHBmbXQsIHBpeCwgc2l6ZW9mKCpwaXgpKTsKKwkJbWVtY3B5KCYocy0+X3JlY3QpLCAmcmVjdCwgc2l6ZW9mKHJlY3QpKTsKKworCQlpZiAoKGNhbS0+bW9kdWxlX3BhcmFtLmZvcmNlX211bm1hcCAgfHwgY2FtLT5pbyA9PSBJT19SRUFEKSAmJgorCQkgICAgbmJ1ZmZlcnMgIT0gc245YzEwMl9yZXF1ZXN0X2J1ZmZlcnMoY2FtLCBuYnVmZmVycywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbS0+aW8pKSB7CisJCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOworCQkJREJHKDEsICJWSURJT0NfU19GTVQgZmFpbGVkIGJlY2F1c2Ugb2Ygbm90IGVub3VnaCAiCisJCQkgICAgICAgIm1lbW9yeS4gVG8gdXNlIHRoZSBjYW1lcmEsIGNsb3NlIGFuZCBvcGVuICIKKwkJCSAgICAgICAiL2Rldi92aWRlbyVkIGFnYWluLiIsIGNhbS0+djRsZGV2LT5taW5vcikKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJY2FtLT5zdHJlYW0gPSBzdHJlYW07CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfR19KUEVHQ09NUDoKKwl7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY2FtLT5jb21wcmVzc2lvbiwKKwkJICAgICAgICAgICAgICAgICBzaXplb2YoY2FtLT5jb21wcmVzc2lvbikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfU19KUEVHQ09NUDoKKwl7CisJCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiBqYzsKKwkJY29uc3QgZW51bSBzbjljMTAyX3N0cmVhbV9zdGF0ZSBzdHJlYW0gPSBjYW0tPnN0cmVhbTsKKwkJaW50IGVyciA9IDA7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZqYywgYXJnLCBzaXplb2YoamMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChqYy5xdWFsaXR5ICE9IDAgJiYgamMucXVhbGl0eSAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKKwkJCWlmICgoZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSkpKQorCQkJCXJldHVybiBlcnI7CisKKwkJZXJyICs9IHNuOWMxMDJfc2V0X2NvbXByZXNzaW9uKGNhbSwgJmpjKTsKKwkJaWYgKGVycikgeyAvKiBhdG9taWMsIG5vIHJvbGxiYWNrIGluIGlvY3RsKCkgKi8KKwkJCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7CisJCQlEQkcoMSwgIlZJRElPQ19TX0pQRUdDT01QIGZhaWxlZCBiZWNhdXNlIG9mIGhhcmR3YXJlICIKKwkJCSAgICAgICAicHJvYmxlbXMuIFRvIHVzZSB0aGUgY2FtZXJhLCBjbG9zZSBhbmQgb3BlbiAiCisJCQkgICAgICAgIi9kZXYvdmlkZW8lZCBhZ2Fpbi4iLCBjYW0tPnY0bGRldi0+bWlub3IpCisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWNhbS0+Y29tcHJlc3Npb24ucXVhbGl0eSA9IGpjLnF1YWxpdHk7CisKKwkJY2FtLT5zdHJlYW0gPSBzdHJlYW07CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfUkVRQlVGUzoKKwl7CisJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHJiOworCQl1MzIgaTsKKwkJaW50IGVycjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJiLCBhcmcsIHNpemVvZihyYikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHJiLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCSAgICByYi5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjYW0tPmlvID09IElPX1JFQUQpIHsKKwkJCURCRygzLCAiQ2xvc2UgYW5kIG9wZW4gdGhlIGRldmljZSBhZ2FpbiB0byBjaG9vc2UgIgorCQkJICAgICAgICJ0aGUgbW1hcCBJL08gbWV0aG9kIikKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZmZlcnM7IGkrKykKKwkJCWlmIChjYW0tPmZyYW1lW2ldLnZtYV91c2VfY291bnQpIHsKKwkJCQlEQkcoMywgIlZJRElPQ19SRVFCVUZTIGZhaWxlZC4gIgorCQkJCSAgICAgICAiUHJldmlvdXMgYnVmZmVycyBhcmUgc3RpbGwgbWFwcGVkLiIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKKwkJCWlmICgoZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSkpKQorCQkJCXJldHVybiBlcnI7CisKKwkJc245YzEwMl9lbXB0eV9mcmFtZXF1ZXVlcyhjYW0pOworCisJCXNuOWMxMDJfcmVsZWFzZV9idWZmZXJzKGNhbSk7CisJCWlmIChyYi5jb3VudCkKKwkJCXJiLmNvdW50ID0gc245YzEwMl9yZXF1ZXN0X2J1ZmZlcnMoY2FtLCByYi5jb3VudCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9fTU1BUCk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZyYiwgc2l6ZW9mKHJiKSkpIHsKKwkJCXNuOWMxMDJfcmVsZWFzZV9idWZmZXJzKGNhbSk7CisJCQljYW0tPmlvID0gSU9fTk9ORTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJY2FtLT5pbyA9IHJiLmNvdW50ID8gSU9fTU1BUCA6IElPX05PTkU7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfUVVFUllCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgYjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmIsIGFyZywgc2l6ZW9mKGIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChiLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCSAgICBiLmluZGV4ID49IGNhbS0+bmJ1ZmZlcnMgfHwgY2FtLT5pbyAhPSBJT19NTUFQKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtY3B5KCZiLCAmY2FtLT5mcmFtZVtiLmluZGV4XS5idWYsIHNpemVvZihiKSk7CisKKwkJaWYgKGNhbS0+ZnJhbWVbYi5pbmRleF0udm1hX3VzZV9jb3VudCkKKwkJCWIuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7CisKKwkJaWYgKGNhbS0+ZnJhbWVbYi5pbmRleF0uc3RhdGUgPT0gRl9ET05FKQorCQkJYi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0RPTkU7CisJCWVsc2UgaWYgKGNhbS0+ZnJhbWVbYi5pbmRleF0uc3RhdGUgIT0gRl9VTlVTRUQpCisJCQliLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYiwgc2l6ZW9mKGIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX1FCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgYjsKKwkJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYiwgYXJnLCBzaXplb2YoYikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKwkJICAgIGIuaW5kZXggPj0gY2FtLT5uYnVmZmVycyB8fCBjYW0tPmlvICE9IElPX01NQVApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY2FtLT5mcmFtZVtiLmluZGV4XS5zdGF0ZSAhPSBGX1VOVVNFRCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNhbS0+ZnJhbWVbYi5pbmRleF0uc3RhdGUgPSBGX1FVRVVFRDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmY2FtLT5mcmFtZVtiLmluZGV4XS5mcmFtZSwgJmNhbS0+aW5xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7CisKKwkJUERCR0coIkZyYW1lICMlbHUgcXVldWVkIiwgKHVuc2lnbmVkIGxvbmcpYi5pbmRleCkKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19EUUJVRjoKKwl7CisJCXN0cnVjdCB2NGwyX2J1ZmZlciBiOworCQlzdHJ1Y3Qgc245YzEwMl9mcmFtZV90ICpmOworCQl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisJCWludCBlcnIgPSAwOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYiwgYXJnLCBzaXplb2YoYikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwgY2FtLT5pbyE9IElPX01NQVApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAobGlzdF9lbXB0eSgmY2FtLT5vdXRxdWV1ZSkpIHsKKwkJCWlmIChjYW0tPnN0cmVhbSA9PSBTVFJFQU1fT0ZGKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiAtRUFHQUlOOworCQkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlCisJCQkgICAgICAoIGNhbS0+d2FpdF9mcmFtZSwgCisJCQkgICAgICAgICghbGlzdF9lbXB0eSgmY2FtLT5vdXRxdWV1ZSkpIHx8CisJCQkgICAgICAgIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgfHwKKwkJCSAgICAgICAgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCkgKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCWlmIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWlmIChjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJZiA9IGxpc3RfZW50cnkoY2FtLT5vdXRxdWV1ZS5uZXh0LCBzdHJ1Y3Qgc245YzEwMl9mcmFtZV90LAorCQkgICAgICAgICAgICAgICBmcmFtZSk7CisJCWxpc3RfZGVsKGNhbS0+b3V0cXVldWUubmV4dCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7CisKKwkJZi0+c3RhdGUgPSBGX1VOVVNFRDsKKworCQltZW1jcHkoJmIsICZmLT5idWYsIHNpemVvZihiKSk7CisJCWlmIChmLT52bWFfdXNlX2NvdW50KQorCQkJYi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJmIsIHNpemVvZihiKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlQREJHRygiRnJhbWUgIyVsdSBkZXF1ZXVlZCIsICh1bnNpZ25lZCBsb25nKWYtPmJ1Zi5pbmRleCkKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19TVFJFQU1PTjoKKwl7CisJCWludCB0eXBlOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdHlwZSwgYXJnLCBzaXplb2YodHlwZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8IGNhbS0+aW8gIT0gSU9fTU1BUCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChsaXN0X2VtcHR5KCZjYW0tPmlucXVldWUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2FtLT5zdHJlYW0gPSBTVFJFQU1fT047CisKKwkJREJHKDMsICJTdHJlYW0gb24iKQorCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DX1NUUkVBTU9GRjoKKwl7CisJCWludCB0eXBlLCBlcnI7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0eXBlLCBhcmcsIHNpemVvZih0eXBlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwgY2FtLT5pbyAhPSBJT19NTUFQKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKKwkJCWlmICgoZXJyID0gc245YzEwMl9zdHJlYW1faW50ZXJydXB0KGNhbSkpKQorCQkJCXJldHVybiBlcnI7CisKKwkJc245YzEwMl9lbXB0eV9mcmFtZXF1ZXVlcyhjYW0pOworCisJCURCRygzLCAiU3RyZWFtIG9mZiIpCisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfR19QQVJNOgorCXsKKwkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSBzcDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNwLCBhcmcsIHNpemVvZihzcCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHNwLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3AucGFybS5jYXB0dXJlLmV4dGVuZGVkbW9kZSA9IDA7CisJCXNwLnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IGNhbS0+bnJlYWRidWZmZXJzOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmc3AsIHNpemVvZihzcCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfU19QQVJNX09MRDoKKwljYXNlIFZJRElPQ19TX1BBUk06CisJeworCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHNwOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3AsIGFyZywgc2l6ZW9mKHNwKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoc3AudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcC5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKKworCQlpZiAoc3AucGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID09IDApCisJCQlzcC5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSBjYW0tPm5yZWFkYnVmZmVyczsKKworCQlpZiAoc3AucGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID4gU045QzEwMl9NQVhfRlJBTUVTKQorCQkJc3AucGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gU045QzEwMl9NQVhfRlJBTUVTOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmc3AsIHNpemVvZihzcCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJY2FtLT5ucmVhZGJ1ZmZlcnMgPSBzcC5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnM7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfR19TVEQ6CisJY2FzZSBWSURJT0NfU19TVEQ6CisJY2FzZSBWSURJT0NfUVVFUllTVEQ6CisJY2FzZSBWSURJT0NfRU5VTVNURDoKKwljYXNlIFZJRElPQ19RVUVSWU1FTlU6CisJCXJldHVybiAtRUlOVkFMOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9Cit9CisKKworc3RhdGljIGludCBzbjljMTAyX2lvY3RsKHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBmaWxlKiBmaWxwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjYW0tPmZpbGVvcF9zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB7CisJCURCRygxLCAiRGV2aWNlIG5vdCBwcmVzZW50IikKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpIHsKKwkJREJHKDEsICJUaGUgY2FtZXJhIGlzIG1pc2NvbmZpZ3VyZWQuIENsb3NlIGFuZCBvcGVuIGl0IGFnYWluLiIpCisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwllcnIgPSBzbjljMTAyX2lvY3RsX3Y0bDIoaW5vZGUsIGZpbHAsIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKworCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbjljMTAyX2ZvcHMgPSB7CisJLm93bmVyID0gICBUSElTX01PRFVMRSwKKwkub3BlbiA9ICAgIHNuOWMxMDJfb3BlbiwKKwkucmVsZWFzZSA9IHNuOWMxMDJfcmVsZWFzZSwKKwkuaW9jdGwgPSAgIHNuOWMxMDJfaW9jdGwsCisJLnJlYWQgPSAgICBzbjljMTAyX3JlYWQsCisJLnBvbGwgPSAgICBzbjljMTAyX3BvbGwsCisJLm1tYXAgPSAgICBzbjljMTAyX21tYXAsCisJLmxsc2VlayA9ICBub19sbHNlZWssCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEl0IGV4aXN0cyBhIHNpbmdsZSBpbnRlcmZhY2Ugb25seS4gV2UgZG8gbm90IG5lZWQgdG8gdmFsaWRhdGUgYW55dGhpbmcuICovCitzdGF0aWMgaW50CitzbjljMTAyX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSogaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQqIGlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRldl9uciA9IDA7CisJdW5zaWduZWQgaW50IGksIG47CisJaW50IGVyciA9IDAsIHI7CisKKwluID0gc2l6ZW9mKHNuOWMxMDJfaWRfdGFibGUpL3NpemVvZihzbjljMTAyX2lkX3RhYmxlWzBdKTsKKwlmb3IgKGkgPSAwOyBpIDwgbi0xOyBpKyspCisJCWlmIChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSAKKwkJICAgIHNuOWMxMDJfaWRfdGFibGVbaV0uaWRWZW5kb3IgJiYKKwkJICAgIGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PQorCQkgICAgc245YzEwMl9pZF90YWJsZVtpXS5pZFByb2R1Y3QpCisJCQlicmVhazsKKwlpZiAoaSA9PSBuLTEpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCEoY2FtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNuOWMxMDJfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoY2FtLCAwLCBzaXplb2YoKmNhbSkpOworCisJY2FtLT51c2JkZXYgPSB1ZGV2OworCisJbWVtY3B5KCZjYW0tPmRldiwgJnVkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBkZXZpY2UpKTsKKworCWlmICghKGNhbS0+Y29udHJvbF9idWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpKSkgeworCQlEQkcoMSwgImttYWxsb2MoKSBmYWlsZWQiKQorCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCW1lbXNldChjYW0tPmNvbnRyb2xfYnVmZmVyLCAwLCA4KTsKKworCWlmICghKGNhbS0+djRsZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCkpKSB7CisJCURCRygxLCAidmlkZW9fZGV2aWNlX2FsbG9jKCkgZmFpbGVkIikKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCWluaXRfTVVURVgoJmNhbS0+ZGV2X3NlbSk7CisKKwlyID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDApOworCWlmIChyIDwgMCB8fCByICE9IDB4MTApIHsKKwkJREJHKDEsICJTb3JyeSwgdGhpcyBpcyBub3QgYSBTTjlDMTB4IGJhc2VkIGNhbWVyYSAiCisJCSAgICAgICAiKHZpZC9waWQgMHglMDRYLzB4JTA0WCkiLAorCQkgICAgc245YzEwMl9pZF90YWJsZVtpXS5pZFZlbmRvcixzbjljMTAyX2lkX3RhYmxlW2ldLmlkUHJvZHVjdCkKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmYWlsOworCX0KKworCWNhbS0+YnJpZGdlID0gKHNuOWMxMDJfaWRfdGFibGVbaV0uaWRQcm9kdWN0ICYgMHhmZmMwKSA9PSAweDYwODAgPworCSAgICAgICAgICAgICAgQlJJREdFX1NOOUMxMDMgOiBCUklER0VfU045QzEwMjsKKwlzd2l0Y2ggKGNhbS0+YnJpZGdlKSB7CisJY2FzZSBCUklER0VfU045QzEwMToKKwljYXNlIEJSSURHRV9TTjlDMTAyOgorCQlEQkcoMiwgIlNOOUMxMFsxMl0gUEMgQ2FtZXJhIENvbnRyb2xsZXIgZGV0ZWN0ZWQgIgorCQkgICAgICAgIih2aWQvcGlkIDB4JTA0WC8weCUwNFgpIiwgc245YzEwMl9pZF90YWJsZVtpXS5pZFZlbmRvciwKKwkJICAgIHNuOWMxMDJfaWRfdGFibGVbaV0uaWRQcm9kdWN0KQorCQlicmVhazsKKwljYXNlIEJSSURHRV9TTjlDMTAzOgorCQlEQkcoMiwgIlNOOUMxMDMgUEMgQ2FtZXJhIENvbnRyb2xsZXIgZGV0ZWN0ZWQgIgorCQkgICAgICAgIih2aWQvcGlkIDB4JTA0WC8weCUwNFgpIiwgc245YzEwMl9pZF90YWJsZVtpXS5pZFZlbmRvciwKKwkJICAgIHNuOWMxMDJfaWRfdGFibGVbaV0uaWRQcm9kdWN0KQorCQlicmVhazsKKwl9CisKKwlmb3IgIChpID0gMDsgc245YzEwMl9zZW5zb3JfdGFibGVbaV07IGkrKykgeworCQllcnIgPSBzbjljMTAyX3NlbnNvcl90YWJsZVtpXShjYW0pOworCQlpZiAoIWVycikKKwkJCWJyZWFrOworCX0KKworCWlmICghZXJyICYmIGNhbS0+c2Vuc29yKSB7CisJCURCRygyLCAiJXMgaW1hZ2Ugc2Vuc29yIGRldGVjdGVkIiwgY2FtLT5zZW5zb3ItPm5hbWUpCisJCURCRygzLCAiU3VwcG9ydCBmb3IgJXMgbWFpbnRhaW5lZCBieSAlcyIsCisJCSAgICBjYW0tPnNlbnNvci0+bmFtZSwgY2FtLT5zZW5zb3ItPm1haW50YWluZXIpCisJfSBlbHNlIHsKKwkJREJHKDEsICJObyBzdXBwb3J0ZWQgaW1hZ2Ugc2Vuc29yIGRldGVjdGVkIikKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChzbjljMTAyX2luaXQoY2FtKSkgeworCQlEQkcoMSwgIkluaXRpYWxpemF0aW9uIGZhaWxlZC4gSSB3aWxsIHJldHJ5IG9uIG9wZW4oKS4iKQorCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOworCX0KKworCXN0cmNweShjYW0tPnY0bGRldi0+bmFtZSwgIlNOOUMxMHggUEMgQ2FtZXJhIik7CisJY2FtLT52NGxkZXYtPm93bmVyID0gVEhJU19NT0RVTEU7CisJY2FtLT52NGxkZXYtPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfU0NBTEVTOworCWNhbS0+djRsZGV2LT5oYXJkd2FyZSA9IFZJRF9IQVJEV0FSRV9TTjlDMTAyOworCWNhbS0+djRsZGV2LT5mb3BzID0gJnNuOWMxMDJfZm9wczsKKwljYW0tPnY0bGRldi0+bWlub3IgPSB2aWRlb19ucltkZXZfbnJdOworCWNhbS0+djRsZGV2LT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CisJdmlkZW9fc2V0X2RydmRhdGEoY2FtLT52NGxkZXYsIGNhbSk7CisKKwlkb3duKCZjYW0tPmRldl9zZW0pOworCisJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGNhbS0+djRsZGV2LCBWRkxfVFlQRV9HUkFCQkVSLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19ucltkZXZfbnJdKTsKKwlpZiAoZXJyKSB7CisJCURCRygxLCAiVjRMMiBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCIpCisJCWlmIChlcnIgPT0gLUVORklMRSAmJiB2aWRlb19ucltkZXZfbnJdID09IC0xKQorCQkJREJHKDEsICJGcmVlIC9kZXYvdmlkZW9YIG5vZGUgbm90IGZvdW5kIikKKwkJdmlkZW9fbnJbZGV2X25yXSA9IC0xOworCQlkZXZfbnIgPSAoZGV2X25yIDwgU045QzEwMl9NQVhfREVWSUNFUy0xKSA/IGRldl9ucisxIDogMDsKKwkJdXAoJmNhbS0+ZGV2X3NlbSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlEQkcoMiwgIlY0TDIgZGV2aWNlIHJlZ2lzdGVyZWQgYXMgL2Rldi92aWRlbyVkIiwgY2FtLT52NGxkZXYtPm1pbm9yKQorCisJY2FtLT5tb2R1bGVfcGFyYW0uZm9yY2VfbXVubWFwID0gZm9yY2VfbXVubWFwW2Rldl9ucl07CisKKwlkZXZfbnIgPSAoZGV2X25yIDwgU045QzEwMl9NQVhfREVWSUNFUy0xKSA/IGRldl9ucisxIDogMDsKKworCXNuOWMxMDJfY3JlYXRlX3N5c2ZzKGNhbSk7CisJREJHKDIsICJPcHRpb25hbCBkZXZpY2UgY29udHJvbCB0aHJvdWdoICdzeXNmcycgaW50ZXJmYWNlIHJlYWR5IikKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2FtKTsKKworCXVwKCZjYW0tPmRldl9zZW0pOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKGNhbSkgeworCQlrZnJlZShjYW0tPmNvbnRyb2xfYnVmZmVyKTsKKwkJaWYgKGNhbS0+djRsZGV2KQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoY2FtLT52NGxkZXYpOworCQlrZnJlZShjYW0pOworCX0KKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkIHNuOWMxMDJfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UqIGludGYpCit7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJaWYgKCFjYW0pCisJCXJldHVybjsKKworCWRvd25fd3JpdGUoJnNuOWMxMDJfZGlzY29ubmVjdCk7CisKKwlkb3duKCZjYW0tPmRldl9zZW0pOyAKKworCURCRygyLCAiRGlzY29ubmVjdGluZyAlcy4uLiIsIGNhbS0+djRsZGV2LT5uYW1lKQorCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmY2FtLT5vcGVuKTsKKworCWlmIChjYW0tPnVzZXJzKSB7CisJCURCRygyLCAiRGV2aWNlIC9kZXYvdmlkZW8lZCBpcyBvcGVuISBEZXJlZ2lzdHJhdGlvbiBhbmQgIgorCQkgICAgICAgIm1lbW9yeSBkZWFsbG9jYXRpb24gYXJlIGRlZmVycmVkIG9uIGNsb3NlLiIsCisJCSAgICBjYW0tPnY0bGRldi0+bWlub3IpCisJCWNhbS0+c3RhdGUgfD0gREVWX01JU0NPTkZJR1VSRUQ7CisJCXNuOWMxMDJfc3RvcF90cmFuc2ZlcihjYW0pOworCQljYW0tPnN0YXRlIHw9IERFVl9ESVNDT05ORUNURUQ7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FtLT53YWl0X2ZyYW1lKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYW0tPndhaXRfc3RyZWFtKTsKKwl9IGVsc2UgeworCQljYW0tPnN0YXRlIHw9IERFVl9ESVNDT05ORUNURUQ7CisJCXNuOWMxMDJfcmVsZWFzZV9yZXNvdXJjZXMoY2FtKTsKKwl9CisKKwl1cCgmY2FtLT5kZXZfc2VtKTsKKworCWlmICghY2FtLT51c2VycykKKwkJa2ZyZWUoY2FtKTsKKworCXVwX3dyaXRlKCZzbjljMTAyX2Rpc2Nvbm5lY3QpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzbjljMTAyX3VzYl9kcml2ZXIgPSB7CisJLm93bmVyID0gICAgICBUSElTX01PRFVMRSwKKwkubmFtZSA9ICAgICAgICJzbjljMTAyIiwKKwkuaWRfdGFibGUgPSAgIHNuOWMxMDJfaWRfdGFibGUsCisJLnByb2JlID0gICAgICBzbjljMTAyX3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHNuOWMxMDJfdXNiX2Rpc2Nvbm5lY3QsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19pbml0IHNuOWMxMDJfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gMDsKKworCUtEQkcoMiwgU045QzEwMl9NT0RVTEVfTkFNRSAiIHYiIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04pCisJS0RCRygzLCBTTjlDMTAyX01PRFVMRV9BVVRIT1IpCisKKwlpZiAoKGVyciA9IHVzYl9yZWdpc3Rlcigmc245YzEwMl91c2JfZHJpdmVyKSkpCisJCUtEQkcoMSwgInVzYl9yZWdpc3RlcigpIGZhaWxlZCIpCisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbjljMTAyX21vZHVsZV9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnNuOWMxMDJfdXNiX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoc245YzEwMl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChzbjljMTAyX21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfaHY3MTMxZC5jIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9odjcxMzFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwNzBkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfaHY3MTMxZC5jCkBAIC0wLDAgKzEsMjcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbHVnLWluIGZvciBIVjcxMzFEIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxMHggUEMgQ2FtZXJhICAgICAqCisgKiBDb250cm9sbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIGh2NzEzMWQ7CisKKworc3RhdGljIGludCBodjcxMzFkX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDEwKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDExKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDE0KTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDYwLCAweDE3KTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDBlLCAweDE4KTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGYyLCAweDE5KTsKKworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDEsIDB4MDQpOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDIsIDB4MDApOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjgsIDB4MDApOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IGh2NzEzMWRfZ2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCXsKKwkJCWludCByMSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDI2KSwKKwkJCSAgICByMiA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDI3KTsKKwkJCWlmIChyMSA8IDAgfHwgcjIgPCAwKQorCQkJCXJldHVybiAtRUlPOworCQkJY3RybC0+dmFsdWUgPSAocjEgPDwgOCkgfCAocjIgJiAweGZmKTsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzEpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgPSAweDNmIC0gKGN0cmwtPnZhbHVlICYgMHgzZik7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzMpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgPSAweDNmIC0gKGN0cmwtPnZhbHVlICYgMHgzZik7CisJCXJldHVybiAwOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzIpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgPSAweDNmIC0gKGN0cmwtPnZhbHVlICYgMHgzZik7CisJCXJldHVybiAwOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9SRVNFVF9MRVZFTDoKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMwKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlICY9IDB4M2Y7CisJCXJldHVybiAwOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9QSVhFTF9CSUFTX1ZPTFRBR0U6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzNCkpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSAmPSAweDA3OworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKworc3RhdGljIGludCBodjcxMzFkX3NldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjYsIGN0cmwtPnZhbHVlID4+IDgpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI3LCBjdHJsLT52YWx1ZSAmIDB4ZmYpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDMxLCAweDNmIC0gY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgzMywgMHgzZiAtIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzIsIDB4M2YgLSBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9SRVNFVF9MRVZFTDoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgzMCwgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfUElYRUxfQklBU19WT0xUQUdFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDM0LCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnIgPyAtRUlPIDogMDsKK30KKworCitzdGF0aWMgaW50IGh2NzEzMWRfc2V0X2Nyb3Aoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3JlY3QqIHJlY3QpCit7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gJmh2NzEzMWQ7CisJaW50IGVyciA9IDA7CisJdTggaF9zdGFydCA9ICh1OCkocmVjdC0+bGVmdCAtIHMtPmNyb3BjYXAuYm91bmRzLmxlZnQpICsgMiwKKwkgICB2X3N0YXJ0ID0gKHU4KShyZWN0LT50b3AgLSBzLT5jcm9wY2FwLmJvdW5kcy50b3ApICsgMjsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIGhfc3RhcnQsIDB4MTIpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHZfc3RhcnQsIDB4MTMpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IGh2NzEzMWRfc2V0X3BpeF9mb3JtYXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHBpeCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmIChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9TTjlDMTBYKQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDQyLCAweDE5KTsKKwllbHNlCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZjIsIDB4MTkpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIGh2NzEzMWQgPSB7CisJLm5hbWUgPSAiSFY3MTMxRCIsCisJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCisJLnN5c2ZzX29wcyA9IFNOOUMxMDJfSTJDX1JFQUQgfCBTTjlDMTAyX0kyQ19XUklURSwKKwkuZnJlcXVlbmN5ID0gU045QzEwMl9JMkNfMTAwS0haLAorCS5pbnRlcmZhY2UgPSBTTjlDMTAyX0kyQ18yV0lSRVMsCisJLmkyY19zbGF2ZV9pZCA9IDB4MTEsCisJLmluaXQgPSAmaHY3MTMxZF9pbml0LAorCS5xY3RybCA9IHsKKwkJeworCQkJLmlkID0gVjRMMl9DSURfRVhQT1NVUkUsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJleHBvc3VyZSIsCisJCQkubWluaW11bSA9IDB4MDI1MCwKKwkJCS5tYXhpbXVtID0gMHhmZmZmLAorCQkJLnN0ZXAgPSAweDAwMDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDI1MCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAicmVkIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDNmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiYmx1ZSBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgzZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgyMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImdyZWVuIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDNmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDFlLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gU045QzEwMl9WNEwyX0NJRF9SRVNFVF9MRVZFTCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gInJlc2V0IGxldmVsIiwKKwkJCS5taW5pbXVtID0gMHgxOSwKKwkJCS5tYXhpbXVtID0gMHgzZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgzMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFNOOUMxMDJfVjRMMl9DSURfUElYRUxfQklBU19WT0xUQUdFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAicGl4ZWwgYmlhcyB2b2x0YWdlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgwNywKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMiwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJfSwKKwkuZ2V0X2N0cmwgPSAmaHY3MTMxZF9nZXRfY3RybCwKKwkuc2V0X2N0cmwgPSAmaHY3MTMxZF9zZXRfY3RybCwKKwkuY3JvcGNhcCA9IHsKKwkJLmJvdW5kcyA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gNjQwLAorCQkJLmhlaWdodCA9IDQ4MCwKKwkJfSwKKwkJLmRlZnJlY3QgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJfSwKKwkuc2V0X2Nyb3AgPSAmaHY3MTMxZF9zZXRfY3JvcCwKKwkucGl4X2Zvcm1hdCA9IHsKKwkJLndpZHRoID0gNjQwLAorCQkuaGVpZ2h0ID0gNDgwLAorCQkucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfU0JHR1I4LAorCQkucHJpdiA9IDgsCisJfSwKKwkuc2V0X3BpeF9mb3JtYXQgPSAmaHY3MTMxZF9zZXRfcGl4X2Zvcm1hdAorfTsKKworCitpbnQgc245YzEwMl9wcm9iZV9odjcxMzFkKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCByMCA9IDAsIHIxID0gMCwgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjgsIDB4MTcpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCisJcjAgPSBzbjljMTAyX2kyY190cnlfcmVhZChjYW0sICZodjcxMzFkLCAweDAwKTsKKwlyMSA9IHNuOWMxMDJfaTJjX3RyeV9yZWFkKGNhbSwgJmh2NzEzMWQsIDB4MDEpOworCWlmIChyMCA8IDAgfHwgcjEgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChyMCAhPSAweDAwICYmIHIxICE9IDB4MDQpCisJCXJldHVybiAtRU5PREVWOworCisJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJmh2NzEzMWQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX21pMDM0My5jIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9taTAzNDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjY3NmFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9taTAzNDMuYwpAQCAtMCwwICsxLDM2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGx1Zy1pbiBmb3IgTUktMDM0MyBpbWFnZSBzZW5zb3IgY29ubmVjdGVkIHRvIHRoZSBTTjlDMTB4IFBDIENhbWVyYSAgICAgKgorICogQ29udHJvbGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisKKworc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBtaTAzNDM7CitzdGF0aWMgdTggbWkwMzQzX2kyY19kYXRhWzUrMV07CisKKworc3RhdGljIGludCBtaTAzNDNfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTApOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGEsIDB4MTQpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDAsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTcpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDcsIDB4MTgpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4YTAsIDB4MTkpOworCisJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQsIDB4MDAsIDB4MDEsIDAsIDApOworCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkLCAweDAwLCAweDAwLCAwLCAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMywgMHgwMSwgMHhlMSwgMCwgMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQsIDB4MDIsIDB4ODEsIDAsIDApOworCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1LCAweDAwLCAweDE3LCAwLCAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgMHgwMCwgMHgxMSwgMCwgMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjIsIDB4MDQsIDB4OWEsIDAsIDApOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IG1pMDM0M19nZXRfY3RybChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQoreworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgJm1pMDM0MywgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LCAyKzEsIG1pMDM0M19pMmNfZGF0YSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gbWkwMzQzX2kyY19kYXRhWzJdOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCAmbWkwMzQzLCBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUsIDIrMSwgbWkwMzQzX2kyY19kYXRhKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IRkxJUDoKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNDMsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCwgMisxLCBtaTAzNDNfaTJjX2RhdGEpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSA9IG1pMDM0M19pMmNfZGF0YVszXSAmIDB4MjAgPyAxIDogMDsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9WRkxJUDoKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNDMsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCwgMisxLCBtaTAzNDNfaTJjX2RhdGEpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSA9IG1pMDM0M19pMmNfZGF0YVszXSAmIDB4ODAgPyAxIDogMDsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNDMsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyZCwgMisxLCBtaTAzNDNfaTJjX2RhdGEpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNDMsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyYywgMisxLCBtaTAzNDNfaTJjX2RhdGEpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQlicmVhazsKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNDMsIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyZSwgMisxLCBtaTAzNDNfaTJjX2RhdGEpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6CisJCWN0cmwtPnZhbHVlID0gbWkwMzQzX2kyY19kYXRhWzNdIHwgKG1pMDM0M19pMmNfZGF0YVsyXSA8PCA4KTsKKwkJaWYgKGN0cmwtPnZhbHVlID49IDB4MTAgJiYgY3RybC0+dmFsdWUgPD0gMHgzZikKKwkJCWN0cmwtPnZhbHVlIC09IDB4MTA7CisJCWVsc2UgaWYgKGN0cmwtPnZhbHVlID49IDB4NjAgJiYgY3RybC0+dmFsdWUgPD0gMHg3ZikKKwkJCWN0cmwtPnZhbHVlIC09IDB4NjA7CisJCWVsc2UgaWYgKGN0cmwtPnZhbHVlID49IDB4ZTAgJiYgY3RybC0+dmFsdWUgPD0gMHhmZikKKwkJCWN0cmwtPnZhbHVlIC09IDB4ZTA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBtaTAzNDNfc2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwl1MTYgcmVnID0gMDsKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKKwkJaWYgKGN0cmwtPnZhbHVlIDw9ICgweDNmLTB4MTApKQorCQkJcmVnID0gMHgxMCArIGN0cmwtPnZhbHVlOworCQllbHNlIGlmIChjdHJsLT52YWx1ZSA8PSAoKDB4M2YtMHgxMCkgKyAoMHg3Zi0weDYwKSkpCisJCQlyZWcgPSAweDYwICsgKGN0cmwtPnZhbHVlIC0gKDB4M2YtMHgxMCkpOworCQllbHNlCisJCQlyZWcgPSAweGUwICsgKGN0cmwtPnZhbHVlIC0gKDB4M2YtMHgxMCkgLSAoMHg3Zi0weDYwKSk7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksIGN0cmwtPnZhbHVlLCAweDAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzUsIHJlZyA+PiA4LCByZWcgJiAweGZmLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IRkxJUDoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwLCBjdHJsLT52YWx1ZSA/IDB4NDA6MHgwMCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybC0+dmFsdWUgPyAweDIwOjB4MDAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAsIGN0cmwtPnZhbHVlID8gMHg4MDoweDAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsLT52YWx1ZSA/IDB4ODA6MHgwMCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyZCwgcmVnID4+IDgsIHJlZyAmIDB4ZmYsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJjLCByZWcgPj4gOCwgcmVnICYgMHhmZiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmIsIHJlZyA+PiA4LCByZWcgJiAweGZmLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJlLCByZWcgPj4gOCwgcmVnICYgMHhmZiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnIgPyAtRUlPIDogMDsKK30KKworCitzdGF0aWMgaW50IG1pMDM0M19zZXRfY3JvcChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcmVjdCogcmVjdCkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSAmbWkwMzQzOworCWludCBlcnIgPSAwOworCXU4IGhfc3RhcnQgPSAodTgpKHJlY3QtPmxlZnQgLSBzLT5jcm9wY2FwLmJvdW5kcy5sZWZ0KSArIDAsCisJICAgdl9zdGFydCA9ICh1OCkocmVjdC0+dG9wIC0gcy0+Y3JvcGNhcC5ib3VuZHMudG9wKSArIDI7CisKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBoX3N0YXJ0LCAweDEyKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCB2X3N0YXJ0LCAweDEzKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBtaTAzNDNfc2V0X3BpeF9mb3JtYXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4KQoreworCWludCBlcnIgPSAwOworCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpIHsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBhLCAweDAwLCAweDAzLCAwLCAwKTsKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgxOSk7CisJfSBlbHNlIHsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBhLCAweDAwLCAweDA1LCAwLCAwKTsKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhhMCwgMHgxOSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIG1pMDM0MyA9IHsKKwkubmFtZSA9ICJNSS0wMzQzIiwKKwkubWFpbnRhaW5lciA9ICJMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+IiwKKwkuZnJlcXVlbmN5ID0gU045QzEwMl9JMkNfMTAwS0haLAorCS5pbnRlcmZhY2UgPSBTTjlDMTAyX0kyQ18yV0lSRVMsCisJLmkyY19zbGF2ZV9pZCA9IDB4NWQsCisJLmluaXQgPSAmbWkwMzQzX2luaXQsCisJLnFjdHJsID0geworCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9FWFBPU1VSRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImV4cG9zdXJlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgwZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwNiwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0dBSU4sCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJnbG9iYWwgZ2FpbiIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9ICgweDNmLTB4MTApKygweDdmLTB4NjApKygweGZmLTB4ZTApLC8qMHg2ZCovCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9IRkxJUCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lID0gImhvcml6b250YWwgbWlycm9yIiwKKwkJCS5taW5pbXVtID0gMCwKKwkJCS5tYXhpbXVtID0gMSwKKwkJCS5zdGVwID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX1ZGTElQLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkJLm5hbWUgPSAidmVydGljYWwgbWlycm9yIiwKKwkJCS5taW5pbXVtID0gMCwKKwkJCS5tYXhpbXVtID0gMSwKKwkJCS5zdGVwID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAicmVkIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAoMHgzZi0weDEwKSsoMHg3Zi0weDYwKSsoMHhmZi0weGUwKSwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImJsdWUgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9ICgweDNmLTB4MTApKygweDdmLTB4NjApKygweGZmLTB4ZTApLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZ3JlZW4gYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9ICgoMHgzZi0weDEwKSsoMHg3Zi0weDYwKSsoMHhmZi0weGUwKSksCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCX0sCisJLmdldF9jdHJsID0gJm1pMDM0M19nZXRfY3RybCwKKwkuc2V0X2N0cmwgPSAmbWkwMzQzX3NldF9jdHJsLAorCS5jcm9wY2FwID0geworCQkuYm91bmRzID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCQkuZGVmcmVjdCA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gNjQwLAorCQkJLmhlaWdodCA9IDQ4MCwKKwkJfSwKKwl9LAorCS5zZXRfY3JvcCA9ICZtaTAzNDNfc2V0X2Nyb3AsCisJLnBpeF9mb3JtYXQgPSB7CisJCS53aWR0aCA9IDY0MCwKKwkJLmhlaWdodCA9IDQ4MCwKKwkJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NCR0dSOCwKKwkJLnByaXYgPSA4LAorCX0sCisJLnNldF9waXhfZm9ybWF0ID0gJm1pMDM0M19zZXRfcGl4X2Zvcm1hdAorfTsKKworCitpbnQgc245YzEwMl9wcm9iZV9taTAzNDMoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAxLCAweDAxKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDAxKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDI4LCAweDE3KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCAmbWkwMzQzLCBtaTAzNDMuaTJjX3NsYXZlX2lkLCAweDAwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgbWkwMzQzX2kyY19kYXRhKSA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKG1pMDM0M19pMmNfZGF0YVs0XSAhPSAweDMyICYmIG1pMDM0M19pMmNfZGF0YVszXSAhPSAweGUzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNuOWMxMDJfYXR0YWNoX3NlbnNvcihjYW0sICZtaTAzNDMpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3BhczEwNmIuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfcGFzMTA2Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZTNlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3BhczEwNmIuYwpAQCAtMCwwICsxLDMwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGx1Zy1pbiBmb3IgUEFTMTA2QiBpbWFnZSBzZW5zb3IgY29ubmVjdGVkIHRvIHRoZSBTTjlDMTB4IFBDIENhbWVyYSAgICAgKgorICogQ29udHJvbGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHBhczEwNmI7CisKKworc3RhdGljIGludCBwYXMxMDZiX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDEwKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDExKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDE0KTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDE3KTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDE5KTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDA5LCAweDE4KTsKKworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDIsIDB4MGMpOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDUsIDB4NWEpOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDYsIDB4ODgpOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDcsIDB4ODApOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTAsIDB4MDYpOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTEsIDB4MDYpOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTIsIDB4MDApOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTQsIDB4MDIpOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTMsIDB4MDEpOworCisJbXNsZWVwKDQwMCk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgcGFzMTA2Yl9nZXRfY3RybChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJeworCQkJaW50IHIxID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDMpLAorCQkJICAgIHIyID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDQpOworCQkJaWYgKHIxIDwgMCB8fCByMiA8IDApCisJCQkJcmV0dXJuIC1FSU87CisJCQljdHJsLT52YWx1ZSA9IChyMSA8PCA0KSB8IChyMiAmIDB4MGYpOworCQl9CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwYykpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSAmPSAweDFmOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA5KSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlICY9IDB4MWY7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBlKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlICY9IDB4MWY7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwZikpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSAmPSAweDA3OworCQlyZXR1cm4gMDsKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDBhKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gKGN0cmwtPnZhbHVlICYgMHgxZikgPDwgMTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0RBQ19NQUdOSVRVREU6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOCkpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSAmPSAweGY4OworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKworc3RhdGljIGludCBwYXMxMDZiX3NldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDMsIGN0cmwtPnZhbHVlID4+IDQpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA0LCBjdHJsLT52YWx1ZSAmIDB4MGYpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBjLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA5LCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwZSwgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBmLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBhLCBjdHJsLT52YWx1ZSA+PiAxKTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwYiwgY3RybC0+dmFsdWUgPj4gMSk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9EQUNfTUFHTklUVURFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA4LCBjdHJsLT52YWx1ZSA8PCAzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTMsIDB4MDEpOworCisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQgcGFzMTA2Yl9zZXRfY3JvcChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcmVjdCogcmVjdCkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSAmcGFzMTA2YjsKKwlpbnQgZXJyID0gMDsKKwl1OCBoX3N0YXJ0ID0gKHU4KShyZWN0LT5sZWZ0IC0gcy0+Y3JvcGNhcC5ib3VuZHMubGVmdCkgKyA0LAorCSAgIHZfc3RhcnQgPSAodTgpKHJlY3QtPnRvcCAtIHMtPmNyb3BjYXAuYm91bmRzLnRvcCkgKyAzOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgaF9zdGFydCwgMHgxMik7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgdl9zdGFydCwgMHgxMyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgcGFzMTA2Yl9zZXRfcGl4X2Zvcm1hdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4KQoreworCWludCBlcnIgPSAwOworCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MmMsIDB4MTcpOworCWVsc2UKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgxNyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgcGFzMTA2YiA9IHsKKwkubmFtZSA9ICJQQVMxMDZCIiwKKwkubWFpbnRhaW5lciA9ICJMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+IiwKKwkuc3lzZnNfb3BzID0gU045QzEwMl9JMkNfUkVBRCB8IFNOOUMxMDJfSTJDX1dSSVRFLAorCS5mcmVxdWVuY3kgPSBTTjlDMTAyX0kyQ180MDBLSFogfCBTTjlDMTAyX0kyQ18xMDBLSFosCisJLmludGVyZmFjZSA9IFNOOUMxMDJfSTJDXzJXSVJFUywKKwkuaTJjX3NsYXZlX2lkID0gMHg0MCwKKwkuaW5pdCA9ICZwYXMxMDZiX2luaXQsCisJLnFjdHJsID0geworCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9FWFBPU1VSRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImV4cG9zdXJlIiwKKwkJCS5taW5pbXVtID0gMHgxMjUsCisJCQkubWF4aW11bSA9IDB4ZmZmLAorCQkJLnN0ZXAgPSAweDAwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgxNDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9HQUlOLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZ2xvYmFsIGdhaW4iLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDFmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDBkLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQ09OVFJBU1QsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJjb250cmFzdCIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MDcsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsIC8qIDB4MDB+MHgwMyBoYXZlIHNhbWUgZWZmZWN0ICovCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gInJlZCBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgxZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwNCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImJsdWUgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MWYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDYsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJncmVlbiBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgzZSwKKwkJCS5zdGVwID0gMHgwMiwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMiwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFNOOUMxMDJfVjRMMl9DSURfREFDX01BR05JVFVERSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gIkRBQyBtYWduaXR1ZGUiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDFmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAxLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwl9LAorCS5nZXRfY3RybCA9ICZwYXMxMDZiX2dldF9jdHJsLAorCS5zZXRfY3RybCA9ICZwYXMxMDZiX3NldF9jdHJsLAorCS5jcm9wY2FwID0geworCQkuYm91bmRzID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSAzNTIsCisJCQkuaGVpZ2h0ID0gMjg4LAorCQl9LAorCQkuZGVmcmVjdCA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gMzUyLAorCQkJLmhlaWdodCA9IDI4OCwKKwkJfSwKKwl9LAorCS5zZXRfY3JvcCA9ICZwYXMxMDZiX3NldF9jcm9wLAorCS5waXhfZm9ybWF0ID0geworCQkud2lkdGggPSAzNTIsCisJCS5oZWlnaHQgPSAyODgsCisJCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCS5wcml2ID0gOCwgLyogd2UgdXNlIHRoaXMgZmllbGQgYXMgJ2JpdHMgcGVyIHBpeGVsJyAqLworCX0sCisJLnNldF9waXhfZm9ybWF0ID0gJnBhczEwNmJfc2V0X3BpeF9mb3JtYXQKK307CisKKworaW50IHNuOWMxMDJfcHJvYmVfcGFzMTA2YihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgcjAgPSAwLCByMSA9IDAsIGVyciA9IDA7CisJdW5zaWduZWQgaW50IHBpZCA9IDA7CisKKwkvKgorCSAgIE1pbmltYWwgaW5pdGlhbGl6YXRpb24gdG8gZW5hYmxlIHRoZSBJMkMgY29tbXVuaWNhdGlvbgorCSAgIE5PVEU6IGRvIE5PVCBjaGFuZ2UgdGhlIHZhbHVlcyEKKwkqLworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOyAvKiBzZW5zb3IgcG93ZXIgZG93biAqLworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MDEpOyAvKiBzZW5zb3IgcG93ZXIgb24gKi8KKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDI4LCAweDE3KTsgLyogc2Vuc29yIGNsb2NrIGF0IDI0IE1IeiAqLworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCisJcjAgPSBzbjljMTAyX2kyY190cnlfcmVhZChjYW0sICZwYXMxMDZiLCAweDAwKTsKKwlyMSA9IHNuOWMxMDJfaTJjX3RyeV9yZWFkKGNhbSwgJnBhczEwNmIsIDB4MDEpOworCisJaWYgKHIwIDwgMCB8fCByMSA8IDApCisJCXJldHVybiAtRUlPOworCisJcGlkID0gKHIwIDw8IDExKSB8ICgocjEgJiAweGYwKSA+PiA0KTsKKwlpZiAocGlkICE9IDB4MDA3KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNuOWMxMDJfYXR0YWNoX3NlbnNvcihjYW0sICZwYXMxMDZiKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9wYXMyMDJiY2IuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfcGFzMjAyYmNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhNTRjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfcGFzMjAyYmNiLmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBsdWctaW4gZm9yIFBBUzIwMkJDQiBpbWFnZSBzZW5zb3IgY29ubmVjdGVkIHRvIHRoZSBTTjlDMTB4IFBDIENhbWVyYSAgICoKKyAqIENvbnRyb2xsZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBieSBDYXJsb3MgRWR1YXJkbyBNZWRhZ2xpYSBEeW9uaXNpbyAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICA8bWVkYWdsaWFAdW5kbC5vcmcuYnI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vY2FkdS5ob21lbGludXguY29tOjgwODAvICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIERBQyBNYWduaXR1ZGUsIGV4cG9zdXJlIGFuZCBncmVlbiBnYWluIGNvbnRyb2xzIGFkZGVkIGJ5ICAgICAgICAgICAgICAgICoKKyAqIEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisKKworc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBwYXMyMDJiY2I7CisKKworc3RhdGljIGludCBwYXMyMDJiY2JfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTApOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTQpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTcpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MzAsIDB4MTkpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDksIDB4MTgpOworCisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMiwgMHgxNCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMywgMHg0MCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwZCwgMHgyYyk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwZSwgMHgwMSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwZiwgMHhhOSk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMCwgMHgwOCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMywgMHg2Myk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNSwgMHg3MCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMSwgMHgwMSk7CisKKwltc2xlZXAoNDAwKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBwYXMyMDJiY2JfZ2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJeworCQkJaW50IHIxID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDQpLAorCQkJICAgIHIyID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDUpOworCQkJaWYgKHIxIDwgMCB8fCByMiA8IDApCisJCQkJcmV0dXJuIC1FSU87CisJCQljdHJsLT52YWx1ZSA9IChyMSA8PCA2KSB8IChyMiAmIDB4M2YpOworCQl9CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwOSkpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSAmPSAweDBmOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDA3KSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlICY9IDB4MGY7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDEwKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlICY9IDB4MWY7CisJCXJldHVybiAwOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDgpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgJj0gMHgwZjsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0RBQ19NQUdOSVRVREU6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwYykpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKworc3RhdGljIGludCBwYXMyMDJiY2Jfc2V0X3BpeF9mb3JtYXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4KQoreworCWludCBlcnIgPSAwOworCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjQsIDB4MTcpOworCWVsc2UKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgxNyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgcGFzMjAyYmNiX3NldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNCwgY3RybC0+dmFsdWUgPj4gNik7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDUsIGN0cmwtPnZhbHVlICYgMHgzZik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDksIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDcsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEwLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA4LCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9EQUNfTUFHTklUVURFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDBjLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDExLCAweDAxKTsKKworCXJldHVybiBlcnIgPyAtRUlPIDogMDsKK30KKworCitzdGF0aWMgaW50IHBhczIwMmJjYl9zZXRfY3JvcChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9yZWN0KiByZWN0KQoreworCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9ICZwYXMyMDJiY2I7CisJaW50IGVyciA9IDA7CisJdTggaF9zdGFydCA9ICh1OCkocmVjdC0+bGVmdCAtIHMtPmNyb3BjYXAuYm91bmRzLmxlZnQpICsgNCwKKwkgICB2X3N0YXJ0ID0gKHU4KShyZWN0LT50b3AgLSBzLT5jcm9wY2FwLmJvdW5kcy50b3ApICsgMzsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIGhfc3RhcnQsIDB4MTIpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHZfc3RhcnQsIDB4MTMpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHBhczIwMmJjYiA9IHsKKwkubmFtZSA9ICJQQVMyMDJCQ0IiLAorCS5tYWludGFpbmVyID0gIkNhcmxvcyBFZHVhcmRvIE1lZGFnbGlhIER5b25pc2lvICIKKwkgICAgICAgICAgICAgICI8bWVkYWdsaWFAdW5kbC5vcmcuYnI+IiwKKwkuc3lzZnNfb3BzID0gU045QzEwMl9JMkNfUkVBRCB8IFNOOUMxMDJfSTJDX1dSSVRFLAorCS5mcmVxdWVuY3kgPSBTTjlDMTAyX0kyQ180MDBLSFogfCBTTjlDMTAyX0kyQ18xMDBLSFosCisJLmludGVyZmFjZSA9IFNOOUMxMDJfSTJDXzJXSVJFUywKKwkuaTJjX3NsYXZlX2lkID0gMHg0MCwKKwkuaW5pdCA9ICZwYXMyMDJiY2JfaW5pdCwKKwkucWN0cmwgPSB7CisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZXhwb3N1cmUiLAorCQkJLm1pbmltdW0gPSAweDAxZTUsCisJCQkubWF4aW11bSA9IDB4M2ZmZiwKKwkJCS5zdGVwID0gMHgwMDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAxZTUsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9HQUlOLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZ2xvYmFsIGdhaW4iLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDFmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDBjLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJyZWQgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MGYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDEsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJibHVlIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDBmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDA1LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZ3JlZW4gYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MGYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX0RBQ19NQUdOSVRVREUsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJEQUMgbWFnbml0dWRlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHhmZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwNCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJfSwKKwkuZ2V0X2N0cmwgPSAmcGFzMjAyYmNiX2dldF9jdHJsLAorCS5zZXRfY3RybCA9ICZwYXMyMDJiY2Jfc2V0X2N0cmwsCisJLmNyb3BjYXAgPSB7CisJCS5ib3VuZHMgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJCS5kZWZyZWN0ID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCX0sCisJLnNldF9jcm9wID0gJnBhczIwMmJjYl9zZXRfY3JvcCwKKwkucGl4X2Zvcm1hdCA9IHsKKwkJLndpZHRoID0gNjQwLAorCQkuaGVpZ2h0ID0gNDgwLAorCQkucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfU0JHR1I4LAorCQkucHJpdiA9IDgsCisJfSwKKwkuc2V0X3BpeF9mb3JtYXQgPSAmcGFzMjAyYmNiX3NldF9waXhfZm9ybWF0Cit9OworCisKK2ludCBzbjljMTAyX3Byb2JlX3BhczIwMmJjYihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sgICAgICAgCisJaW50IHIwID0gMCwgcjEgPSAwLCBlcnIgPSAwOworCXVuc2lnbmVkIGludCBwaWQgPSAwOworCisJLyoKKwkgKiAgTWluaW1hbCBpbml0aWFsaXphdGlvbiB0byBlbmFibGUgdGhlIEkyQyBjb21tdW5pY2F0aW9uCisJICogIE5PVEU6IGRvIE5PVCBjaGFuZ2UgdGhlIHZhbHVlcyEKKwkgKi8KKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAxLCAweDAxKTsgLyogc2Vuc29yIHBvd2VyIGRvd24gKi8KKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDQwLCAweDAxKTsgLyogc2Vuc29yIHBvd2VyIG9uICovCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyOCwgMHgxNyk7IC8qIHNlbnNvciBjbG9jayBhdCAyNCBNSHogKi8KKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTzsKKworCXIwID0gc245YzEwMl9pMmNfdHJ5X3JlYWQoY2FtLCAmcGFzMjAyYmNiLCAweDAwKTsKKwlyMSA9IHNuOWMxMDJfaTJjX3RyeV9yZWFkKGNhbSwgJnBhczIwMmJjYiwgMHgwMSk7CisKKwlpZiAocjAgPCAwIHx8IHIxIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlwaWQgPSAocjAgPDwgNCkgfCAoKHIxICYgMHhmMCkgPj4gNCk7CisJaWYgKHBpZCAhPSAweDAxNykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzbjljMTAyX2F0dGFjaF9zZW5zb3IoY2FtLCAmcGFzMjAyYmNiKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9zZW5zb3IuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfc2Vuc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmNzQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfc2Vuc29yLmgKQEAgLTAsMCArMSwzNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFQSSBmb3IgaW1hZ2Ugc2Vuc29ycyBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NOOUMxMDJfU0VOU09SX0hfCisjZGVmaW5lIF9TTjlDMTAyX1NFTlNPUl9IXworCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCitzdHJ1Y3Qgc245YzEwMl9kZXZpY2U7CitzdHJ1Y3Qgc245YzEwMl9zZW5zb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAgIE9WRVJWSUVXLgorICAgVGhpcyBpcyBhIHNtYWxsIGludGVyZmFjZSB0aGF0IGFsbG93cyB5b3UgdG8gYWRkIHN1cHBvcnQgZm9yIGFueSBDQ0QvQ01PUworICAgaW1hZ2Ugc2Vuc29ycyBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxMFggYnJpZGdlcy4gVGhlIGVudGlyZSBBUEkgaXMgZG9jdW1lbnRlZAorICAgYmVsb3cuIEluIHRoZSBtb3N0IGdlbmVyYWwgY2FzZSwgdG8gc3VwcG9ydCBhIHNlbnNvciB0aGVyZSBhcmUgdGhyZWUgc3RlcHMKKyAgIHlvdSBoYXZlIHRvIGZvbGxvdzoKKyAgIDEpIGRlZmluZSB0aGUgbWFpbiAic245YzEwMl9zZW5zb3IiIHN0cnVjdHVyZSBieSBzZXR0aW5nIHRoZSBiYXNpYyBmaWVsZHM7CisgICAyKSB3cml0ZSBhIHByb2JpbmcgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IHRoZSBjb3JlIG1vZHVsZSB3aGVuIHRoZSBVU0IKKyAgICAgIGNhbWVyYSBpcyByZWNvZ25pemVkLCB0aGVuIGFkZCBib3RoIHRoZSBVU0IgaWRzIGFuZCB0aGUgbmFtZSBvZiB0aGF0CisgICAgICBmdW5jdGlvbiB0byB0aGUgdHdvIGNvcnJlc3BvbmRpbmcgdGFibGVzIFNFTlNPUl9UQUJMRSBhbmQgSURfVEFCTEUgKHNlZQorICAgICAgYmVsb3cpOworICAgMykgaW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgeW91IHdhbnQvbmVlZCAoYW5kIGZpbGwgdGhlIHJlc3Qgb2YgdGhlIG1haW4KKyAgICAgIHN0cnVjdHVyZSBhY2NvcmRpbmdseSkuCisgICAic245YzEwMl9wYXMxMDZiLmMiIGlzIGFuIGV4YW1wbGUgb2YgYWxsIHRoaXMgc3R1ZmYuIFJlbWVtYmVyIHRoYXQgeW91IGRvCisgICBOT1QgbmVlZCB0byB0b3VjaCB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGNvcmUgbW9kdWxlIGZvciB0aGUgdGhpbmdzIHRvIHdvcmsKKyAgIHByb3Blcmx5LCB1bmxlc3MgeW91IGZpbmQgYnVncyBvciBmbGF3cyBpbiBpdC4gRmluYWxseSwgZG8gbm90IGZvcmdldCB0bworICAgcmVhZCB0aGUgVjRMMiBBUEkgZm9yIGNvbXBsZXRlbmVzcy4KKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAgIFByb2JpbmcgZnVuY3Rpb25zOiBvbiBzdWNjZXNzLCB5b3UgbXVzdCBhdHRhY2ggdGhlIHNlbnNvciB0byB0aGUgY2FtZXJhCisgICBieSBjYWxsaW5nIHNuOWMxMDJfYXR0YWNoX3NlbnNvcigpIHByb3ZpZGVkIGJlbG93LgorICAgVG8gZW5hYmxlIHRoZSBJMkMgY29tbXVuaWNhdGlvbiwgeW91IG1pZ2h0IG5lZWQgdG8gcGVyZm9ybSBhIHJlYWxseSBiYXNpYworICAgaW5pdGlhbGl6YXRpb24gb2YgdGhlIFNOOUMxMFggY2hpcCBieSB1c2luZyB0aGUgd3JpdGUgZnVuY3Rpb24gZGVjbGFyZWQgCisgICBhaGVhZC4KKyAgIEZ1bmN0aW9ucyBtdXN0IHJldHVybiAwIG9uIHN1Y2Nlc3MsIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCisqLworZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX2h2NzEzMWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOworZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX21pMDM0MyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CitleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfcGFzMTA2YihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CitleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfcGFzMjAyYmNiKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKK2V4dGVybiBpbnQgc245YzEwMl9wcm9iZV90YXM1MTEwYzFiKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKK2V4dGVybiBpbnQgc245YzEwMl9wcm9iZV90YXM1MTMwZDFiKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKKworLyoKKyAgIEFkZCB0aGUgYWJvdmUgZW50cmllcyB0byB0aGlzIHRhYmxlLiBCZSBzdXJlIHRvIGFkZCB0aGUgZW50cnkgaW4gdGhlIHJpZ2h0CisgICBwbGFjZSwgc2luY2UsIG9uIGZhaWx1cmUsIHRoZSBuZXh0IHByb2Jpbmcgcm91dGluZSBpcyBjYWxsZWQgYWNjb3JkaW5nIHRvIAorICAgdGhlIG9yZGVyIG9mIHRoZSBsaXN0IGJlbG93LCBmcm9tIHRvcCB0byBib3R0b20uCisqLworI2RlZmluZSBTTjlDMTAyX1NFTlNPUl9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCAoKnNuOWMxMDJfc2Vuc29yX3RhYmxlW10pKHN0cnVjdCBzbjljMTAyX2RldmljZSopID0geyAgICAgICAgICAgICAgXAorCSZzbjljMTAyX3Byb2JlX21pMDM0MywgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovICAgICBcCisJJnNuOWMxMDJfcHJvYmVfcGFzMTA2YiwgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovICAgIFwKKwkmc245YzEwMl9wcm9iZV9wYXMyMDJiY2IsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLyAgXAorCSZzbjljMTAyX3Byb2JlX2h2NzEzMWQsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLyAgICBcCisJJnNuOWMxMDJfcHJvYmVfdGFzNTExMGMxYiwgLyogZGV0ZWN0aW9uIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovICAgICAgIFwKKwkmc245YzEwMl9wcm9iZV90YXM1MTMwZDFiLCAvKiBkZXRlY3Rpb24gYmFzZWQgb24gVVNCIHBpZC92aWQgKi8gICAgICAgXAorCU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9OworCisvKiBBdHRhY2ggYSBwcm9iZWQgc2Vuc29yIHRvIHRoZSBjYW1lcmEuICovCitleHRlcm4gdm9pZCAKK3NuOWMxMDJfYXR0YWNoX3NlbnNvcihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvcik7CisKKy8qIEVhY2ggU045QzEwWCBjYW1lcmEgaGFzIHByb3BlciBQSUQvVklEIGlkZW50aWZpZXJzLiBBZGQgdGhlbSBoZXJlIGluIGNhc2UuKi8KKyNkZWZpbmUgU045QzEwMl9JRF9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBzbjljMTAyX2lkX3RhYmxlW10gPSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMDEpLCB9LCAvKiBUQVM1MTEwQzFCICovICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAwNSksIH0sIC8qIFRBUzUxMTBDMUIgKi8gICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDA5KSwgfSwgLyogUEFTMTA2QiAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMGQpLCB9LCAvKiBQQVMxMDZCICovICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyNCksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDI1KSwgfSwgLyogVEFTNTEzMEQxQiBhbmQgVEFTNTExMEMxQiAqLyAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMjgpLCB9LCAvKiBQQVMyMDJCQ0IgKi8gICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyOSksIH0sIC8qIFBBUzEwNkIgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDJhKSwgfSwgLyogSFY3MTMxRCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMmIpLCB9LCAvKiBNSS0wMzQzICovICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyYyksIH0sIC8qIE9WNzYyMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDMwKSwgfSwgLyogTUkwM3ggKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwODApLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjA4MiksIH0sIC8qIE1JMDM0MyBhbmQgTUkwMzYwICovICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDgzKSwgfSwgLyogSFY3MTMxW0R8RTFdICovICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwODgpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjA4YSksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDhiKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwOGMpLCB9LCAvKiBIVjcxMzF4ICovICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjA4ZSksIH0sIC8qIENJUy1WRjEwICovICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDhmKSwgfSwgLyogT1Y3NjMwICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYTApLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBhMiksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGEzKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYTgpLCB9LCAvKiBQQVMxMDZCICovICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBhYSksIH0sIC8qIFRBUzUxMzBEMUIgKi8gICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGFiKSwgfSwgLyogVEFTNTExMEMxQiAqLyAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYWMpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBhZSksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGFmKSwgfSwgLyogUEFTMjAyQkNCICovICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYjApLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBiMiksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGIzKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYjgpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBiYSksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MGJiKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYmMpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjBiZSksIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAgIFJlYWQvd3JpdGUgcm91dGluZXM6IHRoZXkgYWx3YXlzIHJldHVybiAtMSBvbiBlcnJvciwgMCBvciB0aGUgcmVhZCB2YWx1ZQorICAgb3RoZXJ3aXNlLiBOT1RFIHRoYXQgYSByZWFsIHJlYWQgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFNOOUMxMFgKKyAgIGNoaXAgZm9yIHNvbWUgb2YgaXRzIHJlZ2lzdGVycy4gVG8gd29yayBhcm91bmQgdGhpcyBwcm9ibGVtLCBhIHBzZXVkby1yZWFkCisgICBjYWxsIGlzIHByb3ZpZGVkIGluc3RlYWQ6IGl0IHJldHVybnMgdGhlIGxhc3Qgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gdmFsdWUgCisgICBvbiB0aGUgcmVnaXN0ZXIgKDAgaWYgaXQgaGFzIG5ldmVyIGJlZW4gd3JpdHRlbiksIHRoZSB1c3VhbCAtMSBvbiBlcnJvci4KKyovCisKKy8qIFRoZSAidHJ5IiBJMkMgSS9PIHZlcnNpb25zIGFyZSB1c2VkIHdoZW4gcHJvYmluZyB0aGUgc2Vuc29yICovCitleHRlcm4gaW50IHNuOWMxMDJfaTJjX3RyeV93cml0ZShzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLHN0cnVjdCBzbjljMTAyX3NlbnNvciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBhZGRyZXNzLCB1OCB2YWx1ZSk7CitleHRlcm4gaW50IHNuOWMxMDJfaTJjX3RyeV9yZWFkKHN0cnVjdCBzbjljMTAyX2RldmljZSosc3RydWN0IHNuOWMxMDJfc2Vuc29yKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggYWRkcmVzcyk7CisKKy8qCisgICBUaGVzZSBtdXN0IGJlIHVzZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHNlbnNvciBkb2Vzbid0IGltcGxlbWVudCB0aGUgc3RhbmRhcmQKKyAgIEkyQyBwcm90b2NvbC4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGdvb2QgcmVhc29ucyB3aHkgeW91IG11c3QgdXNlIHRoZSAKKyAgIHNpbmdsZS1ieXRlIHZlcnNpb25zIG9mIHRoZXNlIGZ1bmN0aW9uczogZG8gbm90IGFidXNlLiBUaGUgZmlyc3QgZnVuY3Rpb24KKyAgIHdyaXRlcyBuIGJ5dGVzLCBmcm9tIGRhdGEwIHRvIGRhdGFuLCB0byByZWdpc3RlcnMgMHgwOSAtIDB4MDkrbiBvZiBTTjlDMTBYCisgICBjaGlwLiBUaGUgc2Vjb25kIG9uZSBwcm9ncmFtcyB0aGUgcmVnaXN0ZXJzIDB4MDkgYW5kIDB4MTAgd2l0aCBkYXRhMCBhbmQKKyAgIGRhdGExLCBhbmQgcGxhY2VzIHRoZSBuIGJ5dGVzIHJlYWQgZnJvbSB0aGUgc2Vuc29yIHJlZ2lzdGVyIHRhYmxlIGluIHRoZQorICAgYnVmZmVyIHBvaW50ZWQgYnkgJ2J1ZmZlcicuIEJvdGggdGhlIGZ1bmN0aW9ucyByZXR1cm4gLTEgb24gZXJyb3I7IHRoZSB3cml0ZQorICAgdmVyc2lvbiByZXR1cm5zIDAgb24gc3VjY2Vzcywgd2hpbGUgdGhlIHJlYWQgdmVyc2lvbiByZXR1cm5zIHRoZSBmaXJzdCByZWFkCisgICBieXRlLgorKi8KK2V4dGVybiBpbnQgc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvciwgdTggbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggZGF0YTAsIHU4IGRhdGExLCB1OCBkYXRhMiwgdTggZGF0YTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggZGF0YTQsIHU4IGRhdGE1KTsKK2V4dGVybiBpbnQgc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IsIHU4IGRhdGEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggZGF0YTEsIHU4IG4sIHU4IGJ1ZmZlcltdKTsKKworLyogVG8gYmUgdXNlZCBhZnRlciB0aGUgc2Vuc29yIHN0cnVjdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgY2FtZXJhIHN0cnVjdCAqLworZXh0ZXJuIGludCBzbjljMTAyX2kyY193cml0ZShzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLCB1OCBhZGRyZXNzLCB1OCB2YWx1ZSk7CitleHRlcm4gaW50IHNuOWMxMDJfaTJjX3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiwgdTggYWRkcmVzcyk7CisKKy8qIEkvTyBvbiByZWdpc3RlcnMgaW4gdGhlIGJyaWRnZS4gQ291bGQgYmUgdXNlZCBieSB0aGUgc2Vuc29yIG1ldGhvZHMgdG9vICovCitleHRlcm4gaW50IHNuOWMxMDJfd3JpdGVfcmVnKHN0cnVjdCBzbjljMTAyX2RldmljZSosIHU4IHZhbHVlLCB1MTYgaW5kZXgpOworZXh0ZXJuIGludCBzbjljMTAyX3ByZWFkX3JlZyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLCB1MTYgaW5kZXgpOworCisvKgorICAgTk9URTogdGhlcmUgYXJlIG5vIGV4cG9ydGVkIGRlYnVnZ2luZyBmdW5jdGlvbnMuIFRvIHVuaWZvcm0gdGhlIG91dHB1dCB5b3UKKyAgIG11c3QgdXNlIHRoZSBkZXZfaW5mbygpL2Rldl93YXJuKCkvZGV2X2VycigpIG1hY3JvcyBkZWZpbmVkIGluIGRldmljZS5oLAorICAgYWxyZWFkeSBpbmNsdWRlZCBoZXJlLCB0aGUgYXJndW1lbnQgYmVpbmcgdGhlIHN0cnVjdCBkZXZpY2UgJ2Rldicgb2YgdGhlCisgICBzZW5zb3Igc3RydWN0dXJlLiBEbyBOT1QgdXNlIHRoZXNlIG1hY3JvcyBiZWZvcmUgdGhlIHNlbnNvciBpcyBhdHRhY2hlZCBvcgorICAgdGhlIGtlcm5lbCB3aWxsIGNyYXNoISBIb3dldmVyLCB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRvIG5vdGlmeSB0aGUgdXNlciBhYm91dAorICAgY29tbW9uIGVycm9ycyBvciBvdGhlciBtZXNzYWdlcywgc2luY2UgdGhpcyBpcyBkb25lIGJ5IHRoZSBtYXN0ZXIgbW9kdWxlLgorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIHNuOWMxMDJfaTJjX3N5c2ZzX29wcyB7CisJU045QzEwMl9JMkNfUkVBRCA9IDB4MDEsCisJU045QzEwMl9JMkNfV1JJVEUgPSAweDAyLAorfTsKKworZW51bSBzbjljMTAyX2kyY19mcmVxdWVuY3kgeyAvKiBzZW5zb3JzIG1heSBzdXBwb3J0IGJvdGggdGhlIGZyZXF1ZW5jaWVzICovCisJU045QzEwMl9JMkNfMTAwS0haID0gMHgwMSwKKwlTTjlDMTAyX0kyQ180MDBLSFogPSAweDAyLAorfTsKKworZW51bSBzbjljMTAyX2kyY19pbnRlcmZhY2UgeworCVNOOUMxMDJfSTJDXzJXSVJFUywKKwlTTjlDMTAyX0kyQ18zV0lSRVMsCit9OworCitzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgeworCWNoYXIgbmFtZVszMl0sIC8qIHNlbnNvciBuYW1lICovCisJICAgICBtYWludGFpbmVyWzY0XTsgLyogbmFtZSBvZiB0aGUgbWFudGFpbmVyIDxlbWFpbD4gKi8KKworCS8qIFN1cHBvcnRlZCBvcGVyYXRpb25zIHRocm91Z2ggdGhlICdzeXNmcycgaW50ZXJmYWNlICovCisJZW51bSBzbjljMTAyX2kyY19zeXNmc19vcHMgc3lzZnNfb3BzOworCisJLyoKKwkgICBUaGVzZSBzZW5zb3IgY2FwYWJpbGl0aWVzIG11c3QgYmUgcHJvdmlkZWQgaWYgdGhlIFNOOUMxMFggY29udHJvbGxlcgorCSAgIG5lZWRzIHRvIGNvbW11bmljYXRlIHRocm91Z2ggdGhlIHNlbnNvciBzZXJpYWwgaW50ZXJmYWNlIGJ5IHVzaW5nCisJICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBpMmMgZnVuY3Rpb25zIGF2YWlsYWJsZS4KKwkqLworCWVudW0gc245YzEwMl9pMmNfZnJlcXVlbmN5IGZyZXF1ZW5jeTsKKwllbnVtIHNuOWMxMDJfaTJjX2ludGVyZmFjZSBpbnRlcmZhY2U7CisKKwkvKgorCSAgIFRoaXMgaWRlbnRpZmllciBtdXN0IGJlIHByb3ZpZGVkIGlmIHRoZSBpbWFnZSBzZW5zb3IgaW1wbGVtZW50cworCSAgIHRoZSBzdGFuZGFyZCBJMkMgcHJvdG9jb2wuCisJKi8KKwl1OCBpMmNfc2xhdmVfaWQ7IC8qIHJlZy4gMHgwOSAqLworCisJLyoKKwkgICBOT1RFOiBXaGVyZSBub3Qgbm90ZWQsbW9zdCBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IGFyZSBub3QgbWFuZGF0b3J5LgorCSAgICAgICAgIFNldCB0byBudWxsIGlmIHlvdSBkbyBub3QgaW1wbGVtZW50IHRoZW0uIElmIGltcGxlbWVudGVkLAorCSAgICAgICAgIHRoZXkgbXVzdCByZXR1cm4gMCBvbiBzdWNjZXNzLCB0aGUgcHJvcGVyIGVycm9yIG90aGVyd2lzZS4KKwkqLworCisJaW50ICgqaW5pdCkoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOworCS8qCisJICAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgc2Vuc29yIGhhcyBiZWVuIGF0dGFjaGVkLiAKKwkgICBJdCBzaG91bGQgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBzZW5zb3Igb25seSwgYnV0IG1heSBhbHNvCisJICAgY29uZmlndXJlIHBhcnQgb2YgdGhlIFNOOUMxMFggY2hpcCBpZiBuZWNlc3NhcnkuIFlvdSBkb24ndCBuZWVkIHRvCisJICAgc2V0dXAgcGljdHVyZSBzZXR0aW5ncyBsaWtlIGJyaWdodG5lc3MsIGNvbnRyYXN0LCBldGMuLiBoZXJlLCBpZgorCSAgIHRoZSBjb3JyaXNwb25kaW5nIGNvbnRyb2xzIGFyZSBpbXBsZW1lbnRlZCAoc2VlIGJlbG93KSwgc2luY2UgCisJICAgdGhleSBhcmUgYWRqdXN0ZWQgaW4gdGhlIGNvcmUgZHJpdmVyIGJ5IGNhbGxpbmcgdGhlIHNldF9jdHJsKCkKKwkgICBtZXRob2QgYWZ0ZXIgaW5pdCgpLCB3aGVyZSB0aGUgYXJndW1lbnRzIGFyZSB0aGUgZGVmYXVsdCB2YWx1ZXMKKwkgICBzcGVjaWZpZWQgaW4gdGhlIHY0bDJfcXVlcnljdHJsIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbnRyb2xzOworCSAgIFNhbWUgc3VnZ2VzdGlvbnMgYXBwbHkgZm9yIG90aGVyIHNldHRpbmdzLCBfaWZfIHRoZSBjb3JyZXNwb25kaW5nCisJICAgbWV0aG9kcyBhcmUgcHJlc2VudDsgaWYgbm90LCB0aGUgaW5pdGlhbGl6YXRpb24gbXVzdCBjb25maWd1cmUgdGhlCisJICAgc2Vuc29yIGFjY29yZGluZyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMgYmVsb3cuCisJKi8KKworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxY3RybFtWNEwyX0NJRF9MQVNUUDEtVjRMMl9DSURfQkFTRV07CisJLyoKKwkgICBPcHRpb25hbCBsaXN0IG9mIGRlZmF1bHQgY29udHJvbHMsIGRlZmluZWQgYXMgaW5kaWNhdGVkIGluIHRoZSAKKwkgICBWNEwyIEFQSS4gTWVudSB0eXBlIGNvbnRyb2xzIGFyZSBub3QgaGFuZGxlZCBieSB0aGlzIGludGVyZmFjZS4KKwkqLworCisJaW50ICgqZ2V0X2N0cmwpKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKTsKKwlpbnQgKCpzZXRfY3RybCkoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisJICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpOworCS8qCisJICAgWW91IG11c3QgaW1wbGVtZW50IGF0IGxlYXN0IHRoZSBzZXRfY3RybCBtZXRob2QgaWYgeW91IGhhdmUgZGVmaW5lZAorCSAgIHRoZSBsaXN0IGFib3ZlLiBUaGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBmb2xsb3cgdGhlIFY0TDIKKwkgICBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIFZJRElPQ19HfENfQ1RSTCBpb2N0bHMuIFY0TDJfQ0lEX0h8VkNFTlRFUgorCSAgIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLCBzbyBkbyBub3QgaW1wbGVtZW50IHRoZW0uIEFsc28sCisJICAgeW91IGRvbid0IGhhdmUgdG8gY2hlY2sgd2hldGhlciB0aGUgcGFzc2VkIHZhbHVlcyBhcmUgb3V0IG9mIGJvdW5kcywKKwkgICBnaXZlbiB0aGF0IHRoaXMgaXMgZG9uZSBieSB0aGUgY29yZSBtb2R1bGUuCisJKi8KKworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgY3JvcGNhcDsKKwkvKgorCSAgIFRoaW5rIHRoZSBpbWFnZSBzZW5zb3IgYXMgYSBncmlkIG9mIFIsRyxCIG1vbm9jaHJvbWF0aWMgcGl4ZWxzCisJICAgZGlzcG9zZWQgYWNjb3JkaW5nIHRvIGEgcGFydGljdWxhciBCYXllciBwYXR0ZXJuLCB3aGljaCBkZXNjcmliZXMKKwkgICB0aGUgY29tcGxldGUgYXJyYXkgb2YgcGl4ZWxzLCBmcm9tICgwLDApIHRvICh4bWF4LCB5bWF4KS4gV2Ugd2lsbAorCSAgIHVzZSB0aGlzIGNvb3JkaW5hdGUgc3lzdGVtIGZyb20gbm93IG9uLiBJdCBpcyBhc3N1bWVkIHRoZSBzZW5zb3IKKwkgICBjaGlwIGNhbiBiZSBwcm9ncmFtbWVkIHRvIGNhcHR1cmUvdHJhbnNtaXQgYSBzdWJzZWN0aW9uIG9mIHRoYXQKKwkgICBhcnJheSBvZiBwaXhlbHM6IHdlIHdpbGwgY2FsbCB0aGlzIHN1YnNlY3Rpb24gImFjdGl2ZSB3aW5kb3ciLgorCSAgIEl0IGlzIG5vdCBhbHdheXMgdHJ1ZSB0aGF0IHRoZSBsYXJnZXN0IGFjaGlldmFibGUgYWN0aXZlIHdpbmRvdyBjYW4KKwkgICBjb3ZlciB0aGUgd2hvbGUgYXJyYXkgb2YgcGl4ZWxzLiBUaGUgVjRMMiBBUEkgZGVmaW5lcyBhbm90aGVyCisJICAgYXJlYSBjYWxsZWQgInNvdXJjZSByZWN0YW5nbGUiLCB3aGljaCwgaW4gdHVybiwgaXMgYSBzdWJyZWN0YW5nbGUgb2YKKwkgICB0aGUgYWN0aXZlIHdpbmRvdy4gVGhlIFNOOUMxMFggY2hpcCBpcyBhbHdheXMgcHJvZ3JhbW1lZCB0byByZWFkIHRoZQorCSAgIHNvdXJjZSByZWN0YW5nbGUuCisJICAgVGhlIGJvdW5kcyBvZiBib3RoIHRoZSBhY3RpdmUgd2luZG93IGFuZCB0aGUgc291cmNlIHJlY3RhbmdsZSBhcmUKKwkgICBzcGVjaWZpZWQgaW4gdGhlIGNyb3BjYXAgc3Vic3RydWN0dXJlcyAnYm91bmRzJyBhbmQgJ2RlZnJlY3QnLgorCSAgIEJ5IGRlZmF1bHQsIHRoZSBzb3VyY2UgcmVjdGFuZ2xlIHNob3VsZCBjb3ZlciB0aGUgbGFyZ2VzdCBwb3NzaWJsZQorCSAgIGFyZWEuIEFnYWluLCBpdCBpcyBub3QgYWx3YXlzIHRydWUgdGhhdCB0aGUgbGFyZ2VzdCBzb3VyY2UgcmVjdGFuZ2xlCisJICAgY2FuIGNvdmVyIHRoZSBlbnRpcmUgYWN0aXZlIHdpbmRvdywgYWx0aG91Z2ggaXQgaXMgYSByYXJlIGNhc2UgZm9yIAorCSAgIHRoZSBoYXJkd2FyZSB3ZSBoYXZlLiBUaGUgYm91bmRzIG9mIHRoZSBzb3VyY2UgcmVjdGFuZ2xlIF9tdXN0XyBiZQorCSAgIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IHVzZSB0aGUgc2FtZSBjb29yZGluYXRlIHN5c3RlbSBhcyBpbmRpY2F0ZWQKKwkgICBiZWZvcmU7IHRoZWlyIGNlbnRlcnMgc2hhbGwgYWxpZ24gaW5pdGlhbGx5LgorCSAgIElmIG5lY2Vzc2FyeSwgdGhlIHNlbnNvciBjaGlwIG11c3QgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nIGluaXQoKSB0bworCSAgIHNldCB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgc2Vuc29yIHdpbmRvdzsgaG93ZXZlciwgYnkgZGVmYXVsdCwgaXQKKwkgICB1c3VhbGx5IGNvdmVycyB0aGUgbGFyZ2VzdCBhY2hpZXZhYmxlIGFyZWEgKG1heHdpZHRoIHggbWF4aGVpZ2h0KQorCSAgIG9mIHBpeGVscywgc28gbm8gcGFydGljdWxhciBpbml0aWFsaXphdGlvbiBpcyBuZWVkZWQsIGlmIHlvdSBoYXZlCisJICAgZGVmaW5lZCB0aGUgY29ycmVjdCBkZWZhdWx0IGJvdW5kcyBpbiB0aGUgc3RydWN0dXJlcy4KKwkgICBTZWUgdGhlIFY0TDIgQVBJIGZvciBmdXJ0aGVyIGRldGFpbHMuCisJICAgTk9URTogb25jZSB5b3UgaGF2ZSBkZWZpbmVkIHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSB3aW5kb3cKKwkgICAgICAgICAoc3RydWN0IGNyb3BjYXAuYm91bmRzKSB5b3UgbXVzdCBub3QgY2hhbmdlIHRoZW0uYW55bW9yZS4KKwkgICBPbmx5ICdib3VuZHMnIGFuZCAnZGVmcmVjdCcgZmllbGRzIGFyZSBtYW5kYXRvcnksIG90aGVyIGZpZWxkcworCSAgIHdpbGwgYmUgaWdub3JlZC4KKwkqLworCisJaW50ICgqc2V0X2Nyb3ApKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorCSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9yZWN0KiByZWN0KTsKKwkvKgorCSAgIFRvIGJlIGNhbGxlZCBvbiBWSURJT0NfQ19TRVRDUk9QLiBUaGUgY29yZSBtb2R1bGUgYWx3YXlzIGNhbGxzIGEKKwkgICBkZWZhdWx0IHJvdXRpbmUgd2hpY2ggY29uZmlndXJlcyB0aGUgYXBwcm9wcmlhdGUgU045QzEwWCByZWdzIChhbHNvCisJICAgc2NhbGluZyksIGJ1dCB5b3UgbWF5IG5lZWQgdG8gb3ZlcnJpZGUvYWRqdXN0IHNwZWNpZmljIHN0dWZmLgorCSAgICdyZWN0JyBjb250YWlucyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyB0aGF0IGFyZSBtdWx0aXBsZSBvZiAxNjogaW4KKwkgICBjYXNlIHlvdSBvdmVycmlkZSB0aGUgZGVmYXVsdCBmdW5jdGlvbiwgeW91IGFsd2F5cyBoYXZlIHRvIHByb2dyYW0KKwkgICB0aGUgY2hpcCB0byBtYXRjaCB0aG9zZSB2YWx1ZXM7IG9uIGVycm9yIHJldHVybiB0aGUgY29ycmVzcG9uZGluZworCSAgIGVycm9yIGNvZGUgd2l0aG91dCByb2xsaW5nIGJhY2suCisJICAgTk9URTogaW4gY2FzZSwgeW91IG11c3QgcHJvZ3JhbSB0aGUgU045QzEwWCBjaGlwIHRvIGdldCByaWQgb2YgCisJICAgICAgICAgYmxhbmsgcGl4ZWxzIG9yIGJsYW5rIGxpbmVzIGF0IHRoZSBfc3RhcnRfIG9mIGVhY2ggbGluZSBvcgorCSAgICAgICAgIGZyYW1lIGFmdGVyIGVhY2ggSFNZTkMgb3IgVlNZTkMsIHNvIHRoYXQgdGhlIGltYWdlIHN0YXJ0cyB3aXRoCisJICAgICAgICAgcmVhbCBSR0IgZGF0YSAoc2VlIHJlZ3MgMHgxMiwgMHgxMykgKGhhdmluZyBzZXQgSF9TSVpFIGFuZCwKKwkgICAgICAgICBWX1NJWkUgeW91IGRvbid0IGhhdmUgdG8gY2FyZSBhYm91dCBibGFuayBwaXhlbHMgb3IgYmxhbmsKKwkgICAgICAgICBsaW5lcyBhdCB0aGUgZW5kIG9mIGVhY2ggbGluZSBvciBmcmFtZSkuCisJKi8KKworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgcGl4X2Zvcm1hdDsKKwkvKgorCSAgIFdoYXQgeW91IGhhdmUgdG8gZGVmaW5lIGhlcmUgYXJlOiAxKSBpbml0aWFsICd3aWR0aCcgYW5kICdoZWlnaHQnIG9mCisJICAgdGhlIHRhcmdldCByZWN0YW5nbGUgMikgdGhlIGluaXRpYWwgJ3BpeGVsZm9ybWF0Jywgd2hpY2ggY2FuIGJlCisJICAgZWl0aGVyIFY0TDJfUElYX0ZNVF9TTjlDMTBYIChmb3IgY29tcHJlc3NlZCB2aWRlbykgb3IKKwkgICBWNEwyX1BJWF9GTVRfU0JHR1I4IDMpICdwcml2Jywgd2hpY2ggd2UnbGwgYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUKKwkgICBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgZm9yIHVuY29tcHJlc3NlZCB2aWRlbywgOCBvciA5IChkZXNwaXRlIHRoZQorCSAgIGN1cnJlbnQgdmFsdWUgb2YgJ3BpeGVsZm9ybWF0JykuCisJICAgTk9URSAxOiBib3RoICd3aWR0aCcgYW5kICdoZWlnaHQnIF9tdXN0XyBiZSBlaXRoZXIgMS8xIG9yIDEvMiBvciAxLzQKKwkgICAgICAgICAgIG9mIGNyb3BjYXAuZGVmcmVjdC53aWR0aCBhbmQgY3JvcGNhcC5kZWZyZWN0LmhlaWdodC4gSQorCSAgICAgICAgICAgc3VnZ2VzdCAxLzEuCisJICAgTk9URSAyOiBUaGUgaW5pdGlhbCBjb21wcmVzc2lvbiBxdWFsaXR5IGlzIGRlZmluZWQgYnkgdGhlIGZpcnN0IGJpdAorCSAgICAgICAgICAgb2YgcmVnIDB4MTcgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgaW1hZ2Ugc2Vuc29yLgorCSAgIE5PVEUgMzogYXMgc2FpZCBhYm92ZSwgeW91IGhhdmUgdG8gcHJvZ3JhbSB0aGUgU045QzEwWCBjaGlwIHRvIGdldAorCSAgICAgICAgICAgcmlkIG9mIGFueSBibGFuayBwaXhlbHMsIHNvIHRoYXQgdGhlIG91dHB1dCBvZiB0aGUgc2Vuc29yCisJICAgICAgICAgICBtYXRjaGVzIHRoZSBSR0IgYmF5ZXIgc2VxdWVuY2UgKGkuZS4gQkdCR0JHLi4uR1JHUkdSKS4KKwkqLworCisJaW50ICgqc2V0X3BpeF9mb3JtYXQpKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorCSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KiBwaXgpOworCS8qCisJICAgVG8gYmUgY2FsbGVkIG9uIFZJRElPQ19TX0ZNVCwgd2hlbiBzd2l0Y2hpbmcgZnJvbSB0aGUgU0JHR1I4IHRvCisJICAgU045QzEwWCBwaXhlbCBmb3JtYXQgb3IgdmljZXZlcnNhLiBPbiBlcnJvciByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcKKwkgICBlcnJvciBjb2RlIHdpdGhvdXQgcm9sbGluZyBiYWNrLgorCSovCisKKwljb25zdCBzdHJ1Y3QgZGV2aWNlKiBkZXY7CisJLyoKKwkgICBUaGlzIGlzIHRoZSBhcmd1bWVudCBmb3IgZGV2X2VycigpLCBkZXZfaW5mbygpIGFuZCBkZXZfd2FybigpLiBJdAorCSAgIGlzIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gWW91IG11c3Qgbm90IGFjY2VzcyB0aGUgc3RydWN0CisJICAgYmVmb3JlIHRoZSBzZW5zb3IgaXMgYXR0YWNoZWQuCisJKi8KKworCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlKiB1c2JkZXY7CisJLyoKKwkgICBQb2ludHMgdG8gdGhlIHVzYl9kZXZpY2Ugc3RydWN0IGFmdGVyIHRoZSBzZW5zb3IgaXMgYXR0YWNoZWQuCisJICAgRG8gbm90IHRvdWNoIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisJKi8KKworCS8qCisJICAgRG8gTk9UIHdyaXRlIHRvIHRoZSBkYXRhIGJlbG93LCBpdCdzIFJFQUQgT05MWS4gSXQgaXMgdXNlZCBieSB0aGUKKwkgICBjb3JlIG1vZHVsZSB0byBzdG9yZSBzdWNjZXNzZnVsbHkgdXBkYXRlZCB2YWx1ZXMgb2YgdGhlIGFib3ZlCisJICAgc2V0dGluZ3MsIGZvciByb2xsYmFja3MuLmV0Yy4uaW4gY2FzZSBvZiBlcnJvcnMgZHVyaW5nIGF0b21pYyBJL08KKwkqLworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBfcWN0cmxbVjRMMl9DSURfTEFTVFAxLVY0TDJfQ0lEX0JBU0VdOworCXN0cnVjdCB2NGwyX3JlY3QgX3JlY3Q7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFByaXZhdGUgaW9jdGwncyBmb3IgY29udHJvbCBzZXR0aW5ncyBzdXBwb3J0ZWQgYnkgc29tZSBpbWFnZSBzZW5zb3JzICovCisjZGVmaW5lIFNOOUMxMDJfVjRMMl9DSURfREFDX01BR05JVFVERSBWNEwyX0NJRF9QUklWQVRFX0JBU0UKKyNkZWZpbmUgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDEKKyNkZWZpbmUgU045QzEwMl9WNEwyX0NJRF9SRVNFVF9MRVZFTCBWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyCisjZGVmaW5lIFNOOUMxMDJfVjRMMl9DSURfUElYRUxfQklBU19WT0xUQUdFIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMKKworI2VuZGlmIC8qIF9TTjlDMTAyX1NFTlNPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl90YXM1MTEwYzFiLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMTBjMWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTBkNjIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl90YXM1MTEwYzFiLmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBsdWctaW4gZm9yIFRBUzUxMTBDMUIgaW1hZ2Ugc2Vuc29yIGNvbm5lY3RlZCB0byB0aGUgU045QzEweCBQQyBDYW1lcmEgICoKKyAqIENvbnRyb2xsZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzbjljMTAyX3NlbnNvci5oIgorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgdGFzNTExMGMxYjsKKworc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgdGFzNTExMGMxYl9nYWluOworCisKK3N0YXRpYyBpbnQgdGFzNTExMGMxYl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMSwgMHgwMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg0NCwgMHgwMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxMCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwYSwgMHgxNCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg2MCwgMHgxNyk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwNiwgMHgxOCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhmYiwgMHgxOSk7CisKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweGMwLCAweDgwKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCB0YXM1MTEwYzFiX2dldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQoreworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCWN0cmwtPnZhbHVlID0gdGFzNTExMGMxYl9nYWluLnZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHRhczUxMTBjMWJfc2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQlpZiAoIShlcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweGY2IC0gY3RybC0+dmFsdWUpKSkKKwkJCXRhczUxMTBjMWJfZ2Fpbi52YWx1ZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZXJyID8gLUVJTyA6IDA7Cit9CisKKworc3RhdGljIGludCB0YXM1MTEwYzFiX3NldF9jcm9wKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9yZWN0KiByZWN0KQoreworCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9ICZ0YXM1MTEwYzFiOworCWludCBlcnIgPSAwOworCXU4IGhfc3RhcnQgPSAodTgpKHJlY3QtPmxlZnQgLSBzLT5jcm9wY2FwLmJvdW5kcy5sZWZ0KSArIDY5LAorCSAgIHZfc3RhcnQgPSAodTgpKHJlY3QtPnRvcCAtIHMtPmNyb3BjYXAuYm91bmRzLnRvcCkgKyA5OworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgaF9zdGFydCwgMHgxMik7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgdl9zdGFydCwgMHgxMyk7CisKKwkvKiBEb24ndCBjaGFuZ2UgISAqLworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MTQsIDB4MWEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGEsIDB4MWIpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHNuOWMxMDJfcHJlYWRfcmVnKGNhbSwgMHgxOSksIDB4MTkpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHRhczUxMTBjMWJfc2V0X3BpeF9mb3JtYXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQqIHBpeCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmIChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9TTjlDMTBYKQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDJiLCAweDE5KTsKKwllbHNlCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZmIsIDB4MTkpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHRhczUxMTBjMWIgPSB7CisJLm5hbWUgPSAiVEFTNTExMEMxQiIsCisJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCisJLnN5c2ZzX29wcyA9IFNOOUMxMDJfSTJDX1dSSVRFLAorCS5mcmVxdWVuY3kgPSBTTjlDMTAyX0kyQ18xMDBLSFosCisJLmludGVyZmFjZSA9IFNOOUMxMDJfSTJDXzNXSVJFUywKKwkuaW5pdCA9ICZ0YXM1MTEwYzFiX2luaXQsCisJLnFjdHJsID0geworCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9HQUlOLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZ2xvYmFsIGdhaW4iLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweGY2LAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDQwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwl9LAorCS5zZXRfY3RybCA9ICZ0YXM1MTEwYzFiX3NldF9jdHJsLAorCS5jcm9wY2FwID0geworCQkuYm91bmRzID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSAzNTIsCisJCQkuaGVpZ2h0ID0gMjg4LAorCQl9LAorCQkuZGVmcmVjdCA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gMzUyLAorCQkJLmhlaWdodCA9IDI4OCwKKwkJfSwKKwl9LAorCS5nZXRfY3RybCA9ICZ0YXM1MTEwYzFiX2dldF9jdHJsLAorCS5zZXRfY3JvcCA9ICZ0YXM1MTEwYzFiX3NldF9jcm9wLAorCS5waXhfZm9ybWF0ID0geworCQkud2lkdGggPSAzNTIsCisJCS5oZWlnaHQgPSAyODgsCisJCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCS5wcml2ID0gOCwKKwl9LAorCS5zZXRfcGl4X2Zvcm1hdCA9ICZ0YXM1MTEwYzFiX3NldF9waXhfZm9ybWF0Cit9OworCisKK2ludCBzbjljMTAyX3Byb2JlX3RhczUxMTBjMWIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJLyogVGhpcyBzZW5zb3IgaGFzIG5vIGlkZW50aWZpZXJzLCBzbyBsZXQncyBhdHRhY2ggaXQgYW55d2F5ICovCisJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJnRhczUxMTBjMWIpOworCisJLyogU2Vuc29yIGRldGVjdGlvbiBpcyBiYXNlZCBvbiBVU0IgcGlkL3ZpZCAqLworCWlmIChsZTE2X3RvX2NwdSh0YXM1MTEwYzFiLnVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpICE9IDB4NjAwMSAmJgorCSAgICBsZTE2X3RvX2NwdSh0YXM1MTEwYzFiLnVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpICE9IDB4NjAwNSAmJgorCSAgICBsZTE2X3RvX2NwdSh0YXM1MTEwYzFiLnVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpICE9IDB4NjBhYikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTEzMGQxYi5jIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl90YXM1MTMwZDFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3OGU5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTEzMGQxYi5jCkBAIC0wLDAgKzEsMTg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbHVnLWluIGZvciBUQVM1MTMwRDFCIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxMHggUEMgQ2FtZXJhICAqCisgKiBDb250cm9sbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHRhczUxMzBkMWI7CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIHRhczUxMzBkMWJfZ2FpbiwgdGFzNTEzMGQxYl9leHBvc3VyZTsKKworCitzdGF0aWMgaW50IHRhczUxMzBkMWJfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTcpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDQsIDB4MDEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MTApOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTEpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTQpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NjAsIDB4MTcpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDcsIDB4MTgpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHRhczUxMzBkMWJfZ2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJY3RybC0+dmFsdWUgPSB0YXM1MTMwZDFiX2dhaW4udmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCWN0cmwtPnZhbHVlID0gdGFzNTEzMGQxYl9leHBvc3VyZS52YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB0YXM1MTMwZDFiX3NldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJaWYgKCEoZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyMCwgMHhmNiAtIGN0cmwtPnZhbHVlKSkpCisJCQl0YXM1MTMwZDFiX2dhaW4udmFsdWUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJaWYgKCEoZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg0MCwgMHg0NyAtIGN0cmwtPnZhbHVlKSkpCisJCQl0YXM1MTMwZDFiX2V4cG9zdXJlLnZhbHVlID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnIgPyAtRUlPIDogMDsKK30KKworCitzdGF0aWMgaW50IHRhczUxMzBkMWJfc2V0X2Nyb3Aoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3JlY3QqIHJlY3QpCit7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gJnRhczUxMzBkMWI7CisJdTggaF9zdGFydCA9ICh1OCkocmVjdC0+bGVmdCAtIHMtPmNyb3BjYXAuYm91bmRzLmxlZnQpICsgMTA0LAorCSAgIHZfc3RhcnQgPSAodTgpKHJlY3QtPnRvcCAtIHMtPmNyb3BjYXAuYm91bmRzLnRvcCkgKyAxMjsKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIGhfc3RhcnQsIDB4MTIpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHZfc3RhcnQsIDB4MTMpOworCisJLyogRG8gTk9UIGNoYW5nZSEgKi8KKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDFmLCAweDFhKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDFhLCAweDFiKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBzbjljMTAyX3ByZWFkX3JlZyhjYW0sIDB4MTkpLCAweDE5KTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCB0YXM1MTMwZDFiX3NldF9waXhfZm9ybWF0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KiBwaXgpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocGl4LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCkKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg2MywgMHgxOSk7CisJZWxzZQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGYzLCAweDE5KTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciB0YXM1MTMwZDFiID0geworCS5uYW1lID0gIlRBUzUxMzBEMUIiLAorCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAorCS5zeXNmc19vcHMgPSBTTjlDMTAyX0kyQ19XUklURSwKKwkuZnJlcXVlbmN5ID0gU045QzEwMl9JMkNfMTAwS0haLAorCS5pbnRlcmZhY2UgPSBTTjlDMTAyX0kyQ18zV0lSRVMsCisJLmluaXQgPSAmdGFzNTEzMGQxYl9pbml0LAorCS5xY3RybCA9IHsKKwkJeworCQkJLmlkID0gVjRMMl9DSURfR0FJTiwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImdsb2JhbCBnYWluIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHhmNiwKKwkJCS5zdGVwID0gMHgwMiwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZXhwb3N1cmUiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDQ3LAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwl9LAorCS5nZXRfY3RybCA9ICZ0YXM1MTMwZDFiX2dldF9jdHJsLAorCS5zZXRfY3RybCA9ICZ0YXM1MTMwZDFiX3NldF9jdHJsLAorCS5jcm9wY2FwID0geworCQkuYm91bmRzID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCQkuZGVmcmVjdCA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gNjQwLAorCQkJLmhlaWdodCA9IDQ4MCwKKwkJfSwKKwl9LAorCS5zZXRfY3JvcCA9ICZ0YXM1MTMwZDFiX3NldF9jcm9wLAorCS5waXhfZm9ybWF0ID0geworCQkud2lkdGggPSA2NDAsCisJCS5oZWlnaHQgPSA0ODAsCisJCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCS5wcml2ID0gOCwKKwl9LAorCS5zZXRfcGl4X2Zvcm1hdCA9ICZ0YXM1MTMwZDFiX3NldF9waXhfZm9ybWF0Cit9OworCisKK2ludCBzbjljMTAyX3Byb2JlX3RhczUxMzBkMWIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJLyogVGhpcyBzZW5zb3IgaGFzIG5vIGlkZW50aWZpZXJzLCBzbyBsZXQncyBhdHRhY2ggaXQgYW55d2F5ICovCisJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJnRhczUxMzBkMWIpOworCisJLyogU2Vuc29yIGRldGVjdGlvbiBpcyBiYXNlZCBvbiBVU0IgcGlkL3ZpZCAqLworCWlmIChsZTE2X3RvX2NwdSh0YXM1MTMwZDFiLnVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpICE9IDB4NjAyNSAmJgorCSAgICBsZTE2X3RvX2NwdSh0YXM1MTMwZDFiLnVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpICE9IDB4NjBhYSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3N0djY4MC5jIGIvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0NTVjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3N0djY4MC5jCkBAIC0wLDAgKzEsMTUwNiBAQAorLyoKKyAqICBTVFYwNjgwIFVTQiBDYW1lcmEgRHJpdmVyLCBieSBLZXZpbiBTaXNzb24gKGtqc2lzc29uQGJlbGxzb3V0aC5uZXQpCisgKiAgCisgKiBUaGFua3MgdG8gU1RNaWNyb2VsZWN0cm9uaWNzIGZvciBpbmZvcm1hdGlvbiBvbiB0aGUgdXNiIGNvbW1hbmRzLCBhbmQgCisgKiB0byBTdGV2ZSBNaWxsZXIgYXQgU1RNIGZvciBoaXMgaGVscCBhbmQgZW5jb3VyYWdlbWVudCB3aGlsZSBJIHdhcyAKKyAqIHdyaXRpbmcgdGhpcyBkcml2ZXIuCisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgaGVhdmlseSBvbiB0aGUgCisgKiBFbmRwb2ludHMgKGZvcm1lcmx5IGtub3duIGFzIEFPWCkgc2U0MDEgVVNCIENhbWVyYSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMCBKZXJvZW4gQi4gVnJlZWtlbiAocGUxcnhxQGFtc2F0Lm9yZykKKyAqCisgKiBTdGlsbCBzb21ld2hhdCBiYXNlZCBvbiB0aGUgTGludXggb3Y1MTEgZHJpdmVyLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBIaXN0b3J5OiAKKyAqIHZlciAwLjEgT2N0b2JlciwgMjAwMS4gSW5pdGlhbCBhdHRlbXB0LiAKKyAqCisgKiB2ZXIgMC4yIE5vdmVtYmVyLCAyMDAxLiBGaXhlZCBhc2JpbGl0eSB0byByZXNpemUsIGFkZGVkIGJyaWdodG5lc3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCBtYWRlIG1vcmUgc3RhYmxlICg/KQorICoKKyAqIHZlciAwLjIxIE5vdiwgMjAwMS4gICAgIEFkZGVkIGdhbW1hIGNvcnJlY3Rpb24gYW5kIHdoaXRlIGJhbGFuY2UsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgZHVlIHRvIEFsZXhhbmRlciBTY2h3YXJ0ei4gU3RpbGwgdHJ5aW5nIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSBzdGFibGlsaXR5LiBNb3ZlZCBzdHVmZiBpbnRvIHN0djY4MC5oCisgKgorICogdmVyIDAuMjIgTm92LCAyMDAxLgkgICBBZGRlZCBzaGFycGVuIGZ1bmN0aW9uIChieSBNaWNoYWVsIFN3ZWV0LCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIG1pa2VAZWFzeXN3LmNvbSkgZnJvbSBHSU1QLCBhbHNvIHVzZWQgaW4gcGVuY2FtLiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZSwgZmFzdCwgZ29vZCBpbnRlZ2VyIG1hdGggcm91dGluZS4KKyAqCisgKiB2ZXIgMC4yMyBEZWMsIDIwMDEgKGdraCkKKyAqIAkJCSAgIFRvb2sgb3V0IHNoYXJwZW4gZnVuY3Rpb24sIHJhbiBjb2RlIHRocm91Z2gKKyAqIAkJCSAgIExpbmRlbnQsIGFuZCBkaWQgb3RoZXIgbWlub3IgdHdlYWtzIHRvIGdldAorICogCQkJICAgdGhpbmdzIHRvIHdvcmsgcHJvcGVybHkgd2l0aCAyLjUuMQorICoKKyAqIHZlciAwLjI0IEphbiwgMjAwMiAoa2pzKSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIHRoZSBwcm9ibGVtIHdpdGggd2ViY2FtIGNyYXNoaW5nIGFmdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0d28gcGljdHVyZXMuIENoYW5nZWQgdGhlIHdheSBwaWMgaXMgaGFsdmVkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSBxdWFsaXR5LiBHb3QgcmlkIG9mIGdyZWVuIGxpbmUgYXJvdW5kIAorICogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuIEZpeCBicmlnaHRuZXNzIHJlc2V0IHdoZW4gY2hhbmdpbmcgc2l6ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zy4gQWRqdXN0ZWQgZ2FtbWEgZmlsdGVycyBzbGlnaHRseS4KKyAqCisgKiB2ZXIgMC4yNSBKYW4sIDIwMDIgKGtqcykKKyAqCQkJICAgRml4ZWQgYSBidWcgaW4gd2hpY2ggdGhlIGRyaXZlciBzb21ldGltZXMgYXR0ZW1wdGVkCisgKgkJCSAgIHRvIHNldCB0byBhIG5vbi1zdXBwb3J0ZWQgc2l6ZS4gVGhpcyBhbGxvd2VkCisgKgkJCSAgIGdub21lbWVldGluZyB0byB3b3JrLgorICoJCQkgICBGaXhlZCBwcm9jIGVudHJ5IHJlbW92YWwgYnVnLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAic3R2NjgwLmgiCisKK3N0YXRpYyBpbnQgdmlkZW9fbnIgPSAtMTsKK3N0YXRpYyBpbnQgc3dhcFJHQiA9IDA7ICAgLyogZGVmYXVsdCBmb3IgYXV0byBzbGVlY3QgKi8KK3N0YXRpYyBpbnQgc3dhcFJHQl9vbiA9IDA7IC8qIGRlZmF1bHQgdG8gYWxsb3cgYXV0byBzZWxlY3Q7IC0xPXN3YXAgbmV2ZXIsICsxPSBzd2FwIGFsd2F5cyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnID0gMDsKKworI2RlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAorCWRvIHsgXAorCWlmIChkZWJ1ZyA+PSBsZXZlbCkJXAorCQlpbmZvKCJbJXM6JWRdICIgZm10LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fICwgIyMgYXJncyk7CVwKKwl9IHdoaWxlICgwKQorCisKKy8qCisgKiBWZXJzaW9uIEluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjI1IgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJLZXZpbiBTaXNzb24gPGtqc2lzc29uQGJlbGxzb3V0aC5uZXQ+IgorI2RlZmluZSBEUklWRVJfREVTQyAiU1RWMDY4MCBVU0IgQ2FtZXJhIERyaXZlciIKKworTU9EVUxFX0FVVEhPUiAoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04gKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyAoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOworbW9kdWxlX3BhcmFtKHN3YXBSR0Jfb24sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDIChzd2FwUkdCX29uLCAiUmVkL2JsdWUgc3dhcDogMT1hbHdheXMsIDA9YXV0bywgLTE9bmV2ZXIiKTsKK21vZHVsZV9wYXJhbSh2aWRlb19uciwgaW50LCAwKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWVtb3J5IG1hbmFnZW1lbnQKKyAqCisgKiBUaGlzIGlzIGEgc2hhbWVsZXNzIGNvcHkgZnJvbSB0aGUgVVNCLWNwaWEgZHJpdmVyIChsaW51eCBrZXJuZWwKKyAqIHZlcnNpb24gMi4zLjI5IG9yIHNvLCBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoaXMgY29kZSBhY3R1YWxseSBkb2VzIDspLgorICogQWN0dWFsbHkgaXQgc2VlbXMgdG8gYmUgYSBjb3B5IG9mIGEgc2hhbWVsZXNzIGNvcHkgb2YgdGhlIGJ0dHYtZHJpdmVyLgorICogT3IgdGhhdCBpcyBhIGNvcHkgb2YgYSBzaGFtZWxlc3MgY29weSBvZiAuLi4gKFRvIHRoZSBwb3dlcnM6IGlzIHRoZXJlCisgKiBubyBnZW5lcmljIGtlcm5lbC1mdW5jdGlvbiB0byBkbyB0aGlzIHNvcnQgb2Ygc3R1ZmY/KQorICoKKyAqIFllcywgaXQgd2FzIGEgc2hhbWVsZXNzIGNvcHkgZnJvbSB0aGUgYnR0di1kcml2ZXIuIElJUkMsIEFsYW4gc2F5cworICogdGhlcmUgd2lsbCBiZSBvbmUsIGJ1dCBhcHBhcmVudGVseSBub3QgeWV0IC1qZXJkZmVsdAorICoKKyAqIFNvIEkgY29waWVkIGl0IGFnYWluIGZvciB0aGUgb3Y1MTEgZHJpdmVyIC1jbGF1ZGlvCisgKgorICogU2FtZSBmb3IgdGhlIHNlNDAxIGRyaXZlciAtSmVyb2VuCisgKgorICogQW5kIHRoZSBTVFYwNjgwIGRyaXZlciAtIEtldmluCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCAqcnZtYWxsb2MgKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl2b2lkICptZW07CisJdW5zaWduZWQgbG9uZyBhZHI7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwltZW0gPSB2bWFsbG9jXzMyIChzaXplKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQgKG1lbSwgMCwgc2l6ZSk7CS8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisJcmV0dXJuIG1lbTsKK30KKworc3RhdGljIHZvaWQgcnZmcmVlICh2b2lkICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCWlmICghbWVtKQorCQlyZXR1cm47CisKKwlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlICgobG9uZykgc2l6ZSA+IDApIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKwl2ZnJlZSAobWVtKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwZW5jYW0gcmVhZC93cml0ZSBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzdHZfc25kY3RybCAoaW50IHNldCwgc3RydWN0IHVzYl9zdHYgKnN0djY4MCwgdW5zaWduZWQgc2hvcnQgcmVxLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlzd2l0Y2ggKHNldCkgeworCWNhc2UgMDoJCS8qICAweGMxICAqLworCQlyZXQgPSB1c2JfY29udHJvbF9tc2cgKHN0djY4MC0+dWRldiwKKwkJCQkgICAgICAgdXNiX3JjdmN0cmxwaXBlIChzdHY2ODAtPnVkZXYsIDApLAorCQkJCSAgICAgICByZXEsCisJCQkJICAgICAgIChVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0VORFBPSU5UKSwKKwkJCQkgICAgICAgdmFsdWUsIDAsIGJ1ZmZlciwgc2l6ZSwgUEVOQ0FNX1RJTUVPVVQpOworCQlicmVhazsKKworCWNhc2UgMToJCS8qICAweDQxICAqLworCQlyZXQgPSB1c2JfY29udHJvbF9tc2cgKHN0djY4MC0+dWRldiwKKwkJCQkgICAgICAgdXNiX3NuZGN0cmxwaXBlIChzdHY2ODAtPnVkZXYsIDApLAorCQkJCSAgICAgICByZXEsCisJCQkJICAgICAgIChVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9FTkRQT0lOVCksCisJCQkJICAgICAgIHZhbHVlLCAwLCBidWZmZXIsIHNpemUsIFBFTkNBTV9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CQkvKiAgMHg4MCAgKi8KKwkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnIChzdHY2ODAtPnVkZXYsCisJCQkJICAgICAgIHVzYl9yY3ZjdHJscGlwZSAoc3R2NjgwLT51ZGV2LCAwKSwKKwkJCQkgICAgICAgcmVxLAorCQkJCSAgICAgICAoVVNCX0RJUl9JTiB8IFVTQl9SRUNJUF9ERVZJQ0UpLAorCQkJCSAgICAgICB2YWx1ZSwgMCwgYnVmZmVyLCBzaXplLCBQRU5DQU1fVElNRU9VVCk7CisJCWJyZWFrOworCisJY2FzZSAzOgkJLyogIDB4NDAgICovCisJCXJldCA9IHVzYl9jb250cm9sX21zZyAoc3R2NjgwLT51ZGV2LAorCQkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUgKHN0djY4MC0+dWRldiwgMCksCisJCQkJICAgICAgIHJlcSwKKwkJCQkgICAgICAgKFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSksCisJCQkJICAgICAgIHZhbHVlLCAwLCBidWZmZXIsIHNpemUsIFBFTkNBTV9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwl9CisJaWYgKChyZXQgPCAwKSAmJiAocmVxICE9IDB4MGEpKSB7CisJCVBERUJVRyAoMSwgIlNUVihlKTogdXNiX2NvbnRyb2xfbXNnIGVycm9yICVpLCByZXF1ZXN0ID0gMHgleCwgZXJyb3IgPSAlaSIsIHNldCwgcmVxLCByZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN0dl9zZXRfY29uZmlnIChzdHJ1Y3QgdXNiX3N0diAqZGV2LCBpbnQgY29uZmlndXJhdGlvbiwgaW50IGludGVyZmFjZSwgaW50IGFsdGVybmF0ZSkKK3sKKworCWlmIChjb25maWd1cmF0aW9uICE9IGRldi0+dWRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUKKwkJCXx8IHVzYl9yZXNldF9jb25maWd1cmF0aW9uIChkZXYtPnVkZXYpIDwgMCkgeworCQlQREVCVUcgKDEsICJTVFYoZSk6IEZBSUxFRCB0byByZXNldCBjb25maWd1cmF0aW9uICVpIiwgY29uZmlndXJhdGlvbik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHVzYl9zZXRfaW50ZXJmYWNlIChkZXYtPnVkZXYsIGludGVyZmFjZSwgYWx0ZXJuYXRlKSA8IDApIHsKKwkJUERFQlVHICgxLCAiU1RWKGUpOiBGQUlMRUQgdG8gc2V0IGFsdGVybmF0ZSBpbnRlcmZhY2UgJWkiLCBhbHRlcm5hdGUpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0dl9zdG9wX3ZpZGVvIChzdHJ1Y3QgdXNiX3N0diAqZGV2KQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCWJ1ZiA9IGttYWxsb2MgKDQwLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJUERFQlVHICgwLCAiU1RWKGUpOiBPdXQgb2YgKHNtYWxsIGJ1ZikgbWVtb3J5Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB0aGlzIGlzIGEgaGlnaCBwcmlvcml0eSBjb21tYW5kOyBpdCBzdG9wcyBhbGwgbG93ZXIgb3JkZXIgY29tbWFuZHMgKi8KKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMSwgZGV2LCAweDA0LCAweDAwMDAsIGJ1ZiwgMHgwKSkgPCAwKSB7CisJCWkgPSBzdHZfc25kY3RybCAoMCwgZGV2LCAweDgwLCAwLCBidWYsIDB4MDIpOwkvKiBHZXQgTGFzdCBFcnJvcjsgMiA9IGJ1c3kgKi8KKwkJUERFQlVHICgxLCAiU1RWKGkpOiBsYXN0IGVycm9yOiAlaSwgIGNvbW1hbmQgPSAweCV4IiwgYnVmWzBdLCBidWZbMV0pOworCX0gZWxzZSB7CisJCVBERUJVRyAoMSwgIlNUVihpKTogQ2FtZXJhIHJlc2V0IHRvIGlkbGUgbW9kZS4iKTsKKwl9CisKKwlpZiAoKGkgPSBzdHZfc2V0X2NvbmZpZyAoZGV2LCAxLCAwLCAwKSkgPCAwKQorCQlQREVCVUcgKDEsICJTVFYoZSk6IFJlc2V0IGNvbmZpZyBkdXJpbmcgZXhpdCBmYWlsZWQiKTsKKworCS8qICBnZXQgY3VycmVudCBtb2RlICAqLworCWJ1ZlswXSA9IDB4ZjA7CisJaWYgKChpID0gc3R2X3NuZGN0cmwgKDAsIGRldiwgMHg4NywgMCwgYnVmLCAweDA4KSkgIT0gMHgwOCkJLyogZ2V0IG1vZGUgKi8KKwkJUERFQlVHICgwLCAiU1RWKGUpOiBTdG9wX3ZpZGVvOiBwcm9ibGVtIHNldHRpbmcgb3JpZ2luYWwgbW9kZSIpOworCWlmIChkZXYtPm9yaWdNb2RlICE9IGJ1ZlswXSkgeworCQltZW1zZXQgKGJ1ZiwgMCwgOCk7CisJCWJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSBkZXYtPm9yaWdNb2RlOworCQlpZiAoKGkgPSBzdHZfc25kY3RybCAoMywgZGV2LCAweDA3LCAweDAxMDAsIGJ1ZiwgMHgwOCkpICE9IDB4MDgpIHsKKwkJCVBERUJVRyAoMCwgIlNUVihlKTogU3RvcF92aWRlbzogU2V0X0NhbWVyYV9Nb2RlIGZhaWxlZCIpOworCQkJaSA9IC0xOworCQl9CisJCWJ1ZlswXSA9IDB4ZjA7CisJCWkgPSBzdHZfc25kY3RybCAoMCwgZGV2LCAweDg3LCAwLCBidWYsIDB4MDgpOworCQlpZiAoKGkgIT0gMHgwOCkgfHwgKGJ1ZlswXSAhPSBkZXYtPm9yaWdNb2RlKSkgeworCQkJUERFQlVHICgwLCAiU1RWKGUpOiBjYW1lcmEgTk9UIHNldCB0byBvcmlnaW5hbCByZXNvbHV0aW9uLiIpOworCQkJaSA9IC0xOworCQl9IGVsc2UKKwkJCVBERUJVRyAoMCwgIlNUVihpKTogQ2FtZXJhIHNldCB0byBvcmlnaW5hbCByZXNvbHV0aW9uIik7CisJfQorCS8qIG9yaWdNb2RlICovCisJa2ZyZWUgKGJ1Zik7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgc3R2X3NldF92aWRlb19tb2RlIChzdHJ1Y3QgdXNiX3N0diAqZGV2KQoreworCWludCBpLCBzdG9wX3ZpZGVvID0gMTsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlidWYgPSBrbWFsbG9jICg0MCwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogT3V0IG9mIChzbWFsbCBidWYpIG1lbW9yeSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKChpID0gc3R2X3NldF9jb25maWcgKGRldiwgMSwgMCwgMCkpIDwgMCkgeworCQlrZnJlZSAoYnVmKTsKKwkJcmV0dXJuIGk7CisJfQorCisJaSA9IHN0dl9zbmRjdHJsICgyLCBkZXYsIDB4MDYsIDB4MDEwMCwgYnVmLCAweDEyKTsKKwlpZiAoIShpID4gMCkgJiYgKGJ1Zls4XSA9PSAweDUzKSAmJiAoYnVmWzldID09IDB4MDUpKSB7CisJCVBERUJVRyAoMSwgIlNUVihlKTogQ291bGQgbm90IGdldCBkZXNjcmlwdG9yIDAxMDAuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogIHNldCBhbHRlcm5hdGUgaW50ZXJmYWNlIDEgKi8KKwlpZiAoKGkgPSBzdHZfc2V0X2NvbmZpZyAoZGV2LCAxLCAwLCAxKSkgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKChpID0gc3R2X3NuZGN0cmwgKDAsIGRldiwgMHg4NSwgMCwgYnVmLCAweDEwKSkgIT0gMHgxMCkKKwkJZ290byBlcnJvcjsKKwlQREVCVUcgKDEsICJTVFYoaSk6IFNldHRpbmcgdmlkZW8gbW9kZS4iKTsKKwkvKiAgU3dpdGNoIHRvIFZpZGVvIG1vZGU6IDB4MDEwMCA9IFZHQSAoNjQweDQ4MCksIDB4MDAwMCA9IENJRiAoMzUyeDI4OCkgMHgwMzAwID0gUVZHQSAoMzIweDI0MCkgICovCisJaWYgKChpID0gc3R2X3NuZGN0cmwgKDEsIGRldiwgMHgwOSwgZGV2LT5WaWRlb01vZGUsIGJ1ZiwgMHgwKSkgPCAwKSB7CisJCXN0b3BfdmlkZW8gPSAwOworCQlnb3RvIGVycm9yOworCX0KKwlnb3RvIGV4aXQ7CisKK2Vycm9yOgorCWtmcmVlIChidWYpOworCWlmIChzdG9wX3ZpZGVvID09IDEpCisJCXN0dl9zdG9wX3ZpZGVvIChkZXYpOworCXJldHVybiAtMTsKKworZXhpdDoKKwlrZnJlZSAoYnVmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHZfaW5pdCAoc3RydWN0IHVzYl9zdHYgKnN0djY4MCkKK3sKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgaW50IGJ1ZnNpemU7CisKKwlidWZmZXIgPSBrbWFsbG9jICg0MCwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogT3V0IG9mIChzbWFsbCBidWYpIG1lbW9yeSIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldCAoYnVmZmVyLCAwLCA0MCk7CisJdWRlbGF5ICgxMDApOworCisJLyogc2V0IGNvbmZpZyAxLCBpbnRlcmZhY2UgMCwgYWx0ZXJuYXRlIDAgKi8KKwlpZiAoKGkgPSBzdHZfc2V0X2NvbmZpZyAoc3R2NjgwLCAxLCAwLCAwKSkgPCAwKSB7CisJCWtmcmVlIChidWZmZXIpOworCQlQREVCVUcgKDAsICJTVFYoZSk6IHNldCBjb25maWcgMSwwLDAgZmFpbGVkIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogcGluZyBjYW1lcmEgdG8gYmUgc3VyZSBTVFYwNjgwIGlzIHByZXNlbnQgKi8KKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDg4LCAweDU2NzgsIGJ1ZmZlciwgMHgwMikpICE9IDB4MDIpCisJCWdvdG8gZXJyb3I7CisJaWYgKChidWZmZXJbMF0gIT0gMHg1NikgfHwgKGJ1ZmZlclsxXSAhPSAweDc4KSkgeworCQlQREVCVUcgKDEsICJTVFYoZSk6IGNhbWVyYSBwaW5nIGZhaWxlZCEhIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogZ2V0IGNhbWVyYSBkZXNjcmlwdG9yICovCisJaWYgKChpID0gc3R2X3NuZGN0cmwgKDIsIHN0djY4MCwgMHgwNiwgMHgwMjAwLCBidWZmZXIsIDB4MDkpKSAhPSAweDA5KQorCQlnb3RvIGVycm9yOworCWkgPSBzdHZfc25kY3RybCAoMiwgc3R2NjgwLCAweDA2LCAweDAyMDAsIGJ1ZmZlciwgMHgyMik7CisJaWYgKCEoaSA+PSAwKSAmJiAoYnVmZmVyWzddID09IDB4YTApICYmIChidWZmZXJbOF0gPT0gMHgyMykpIHsKKwkJUERFQlVHICgxLCAiU1RWKGUpOiBDb3VsZCBub3QgZ2V0IGRlc2NyaXB0b3IgMDIwMC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKChpID0gc3R2X3NuZGN0cmwgKDAsIHN0djY4MCwgMHg4YSwgMCwgYnVmZmVyLCAweDAyKSkgIT0gMHgwMikKKwkJZ290byBlcnJvcjsKKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDhiLCAwLCBidWZmZXIsIDB4MjQpKSAhPSAweDI0KQorCQlnb3RvIGVycm9yOworCWlmICgoaSA9IHN0dl9zbmRjdHJsICgwLCBzdHY2ODAsIDB4ODUsIDAsIGJ1ZmZlciwgMHgxMCkpICE9IDB4MTApCisJCWdvdG8gZXJyb3I7CisKKwlzdHY2ODAtPlN1cHBvcnRlZE1vZGVzID0gYnVmZmVyWzddOworCWkgPSBzdHY2ODAtPlN1cHBvcnRlZE1vZGVzOworCXN0djY4MC0+Q0lGID0gMDsKKwlzdHY2ODAtPlZHQSA9IDA7CisJc3R2NjgwLT5RVkdBID0gMDsKKwlpZiAoaSAmIDEpCisJCXN0djY4MC0+Q0lGID0gMTsKKwlpZiAoaSAmIDIpCisJCXN0djY4MC0+VkdBID0gMTsKKwlpZiAoaSAmIDgpCisJCXN0djY4MC0+UVZHQSA9IDE7CisJaWYgKHN0djY4MC0+U3VwcG9ydGVkTW9kZXMgPT0gMCkgeworCQlQREVCVUcgKDAsICJTVFYoZSk6IFRoZXJlIGFyZSBOTyBzdXBwb3J0ZWQgU1RWNjgwIG1vZGVzISEiKTsKKwkJaSA9IC0xOworCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCWlmIChzdHY2ODAtPkNJRikKKwkJCVBERUJVRyAoMCwgIlNUVihpKTogQ0lGIGlzIHN1cHBvcnRlZCIpOworCQlpZiAoc3R2NjgwLT5RVkdBKQorCQkJUERFQlVHICgwLCAiU1RWKGkpOiBRVkdBIGlzIHN1cHBvcnRlZCIpOworCX0KKwkvKiBGVyByZXYsIEFTSUMgcmV2LCBzZW5zb3IgSUQgICovCisJUERFQlVHICgxLCAiU1RWKGkpOiBGaXJtd2FyZSByZXYgaXMgJWkuJWkiLCBidWZmZXJbMF0sIGJ1ZmZlclsxXSk7CisJUERFQlVHICgxLCAiU1RWKGkpOiBBU0lDIHJldiBpcyAlaS4laSIsIGJ1ZmZlclsyXSwgYnVmZmVyWzNdKTsKKwlQREVCVUcgKDEsICJTVFYoaSk6IFNlbnNvciBJRCBpcyAlaSIsIChidWZmZXJbNF0qMTYpICsgKGJ1ZmZlcls1XT4+NCkpOworCisJLyogIHNldCBhbHRlcm5hdGUgaW50ZXJmYWNlIDEgKi8KKwlpZiAoKGkgPSBzdHZfc2V0X2NvbmZpZyAoc3R2NjgwLCAxLCAwLCAxKSkgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKChpID0gc3R2X3NuZGN0cmwgKDAsIHN0djY4MCwgMHg4NSwgMCwgYnVmZmVyLCAweDEwKSkgIT0gMHgxMCkKKwkJZ290byBlcnJvcjsKKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDhkLCAwLCBidWZmZXIsIDB4MDgpKSAhPSAweDA4KQorCQlnb3RvIGVycm9yOworCWkgPSBidWZmZXJbM107CisJUERFQlVHICgwLCAiU1RWKGkpOiBDYW1lcmEgaGFzICVpIHBpY3R1cmVzLiIsIGkpOworCisJLyogIGdldCBjdXJyZW50IG1vZGUgKi8KKwlpZiAoKGkgPSBzdHZfc25kY3RybCAoMCwgc3R2NjgwLCAweDg3LCAwLCBidWZmZXIsIDB4MDgpKSAhPSAweDA4KQorCQlnb3RvIGVycm9yOworCXN0djY4MC0+b3JpZ01vZGUgPSBidWZmZXJbMF07CS8qIDAxID0gVkdBLCAwMyA9IFFWR0EsIDAwID0gQ0lGICovCisKKwkvKiBUaGlzIHdpbGwgYXR0ZW1wIENJRiBtb2RlLCBpZiBzdXBwb3J0ZWQuIElmIG5vdCwgc2V0IHRvIFFWR0EgICovCisJbWVtc2V0IChidWZmZXIsIDAsIDgpOworCWlmIChzdHY2ODAtPkNJRikKKwkJYnVmZmVyWzBdID0gMHgwMDsKKwllbHNlIGlmIChzdHY2ODAtPlFWR0EpCisJCWJ1ZmZlclswXSA9IDB4MDM7CisJaWYgKChpID0gc3R2X3NuZGN0cmwgKDMsIHN0djY4MCwgMHgwNywgMHgwMTAwLCBidWZmZXIsIDB4MDgpKSAhPSAweDA4KSB7CisJCVBERUJVRyAoMCwgIlNUVihpKTogU2V0X0NhbWVyYV9Nb2RlIGZhaWxlZCIpOworCQlpID0gLTE7CisJCWdvdG8gZXJyb3I7CisJfQorCWJ1ZmZlclswXSA9IDB4ZjA7CisJc3R2X3NuZGN0cmwgKDAsIHN0djY4MCwgMHg4NywgMCwgYnVmZmVyLCAweDA4KTsKKwlpZiAoKChzdHY2ODAtPkNJRiA9PSAxKSAmJiAoYnVmZmVyWzBdICE9IDB4MDApKSB8fCAoKHN0djY4MC0+UVZHQSA9PSAxKSAmJiAoYnVmZmVyWzBdICE9IDB4MDMpKSkgeworCQlQREVCVUcgKDAsICJTVFYoZSk6IEVycm9yIHNldHRpbmcgY2FtZXJhIHZpZGVvIG1vZGUhIik7CisJCWkgPSAtMTsKKwkJZ290byBlcnJvcjsKKwl9IGVsc2UgeworCQlpZiAoYnVmZmVyWzBdID09IDApIHsKKwkJCXN0djY4MC0+VmlkZW9Nb2RlID0gMHgwMDAwOworCQkJUERFQlVHICgwLCAiU1RWKGkpOiBWaWRlbyBNb2RlIHNldCB0byBDSUYiKTsKKwkJfQorCQlpZiAoYnVmZmVyWzBdID09IDB4MDMpIHsKKwkJCXN0djY4MC0+VmlkZW9Nb2RlID0gMHgwMzAwOworCQkJUERFQlVHICgwLCAiU1RWKGkpOiBWaWRlbyBNb2RlIHNldCB0byBRVkdBIik7CisJCX0KKwl9CisJaWYgKChpID0gc3R2X3NuZGN0cmwgKDAsIHN0djY4MCwgMHg4ZiwgMCwgYnVmZmVyLCAweDEwKSkgIT0gMHgxMCkKKwkJZ290byBlcnJvcjsKKwlidWZzaXplID0gKGJ1ZmZlclswXSA8PCAyNCkgfCAoYnVmZmVyWzFdIDw8IDE2KSB8IChidWZmZXJbMl0gPDwgOCkgfCAoYnVmZmVyWzNdKTsKKwlzdHY2ODAtPmN3aWR0aCA9IChidWZmZXJbNF0gPDwgOCkgfCAoYnVmZmVyWzVdKTsJLyogLT5jYW1lcmEgPSAzMjIsIDM1NiwgNjQ0ICAqLworCXN0djY4MC0+Y2hlaWdodCA9IChidWZmZXJbNl0gPDwgOCkgfCAoYnVmZmVyWzddKTsJLyogLT5jYW1lcmEgPSAyNDIsIDI5MiwgNDg0ICAqLworCXN0djY4MC0+b3JpZ0dhaW4gPSBidWZmZXJbMTJdOworCisJZ290byBleGl0OworCitlcnJvcjoKKwlpID0gc3R2X3NuZGN0cmwgKDAsIHN0djY4MCwgMHg4MCwgMCwgYnVmZmVyLCAweDAyKTsJLyogR2V0IExhc3QgRXJyb3IgKi8KKwlQREVCVUcgKDEsICJTVFYoaSk6IGxhc3QgZXJyb3I6ICVpLCAgY29tbWFuZCA9IDB4JXgiLCBidWZmZXJbMF0sIGJ1ZmZlclsxXSk7CisJa2ZyZWUgKGJ1ZmZlcik7CisJcmV0dXJuIC0xOworCitleGl0OgorCWtmcmVlIChidWZmZXIpOworCisJLyogdmlkZW8gPSAzMjB4MjQwLCAzNTJ4Mjg4ICovCisJaWYgKHN0djY4MC0+Q0lGID09IDEpIHsKKwkJc3R2NjgwLT5tYXh3aWR0aCA9IDM1MjsKKwkJc3R2NjgwLT5tYXhoZWlnaHQgPSAyODg7CisJCXN0djY4MC0+dndpZHRoID0gMzUyOworCQlzdHY2ODAtPnZoZWlnaHQgPSAyODg7CisJfQorCWlmIChzdHY2ODAtPlFWR0EgPT0gMSkgeworCQlzdHY2ODAtPm1heHdpZHRoID0gMzIwOworCQlzdHY2ODAtPm1heGhlaWdodCA9IDI0MDsKKwkJc3R2NjgwLT52d2lkdGggPSAzMjA7CisJCXN0djY4MC0+dmhlaWdodCA9IDI0MDsKKwl9CisKKwlzdHY2ODAtPnJhd2J1ZnNpemUgPSBidWZzaXplOwkvKiBtdXN0IGJlIC4vLiBieSA4ICovCisJc3R2NjgwLT5tYXhmcmFtZXNpemUgPSBidWZzaXplICogMzsJLyogUkdCIHNpemUgKi8KKwlQREVCVUcgKDIsICJTVFYoaSk6IGN3aWR0aCA9ICVpLCBjaGVpZ2h0ID0gJWkiLCBzdHY2ODAtPmN3aWR0aCwgc3R2NjgwLT5jaGVpZ2h0KTsKKwlQREVCVUcgKDEsICJTVFYoaSk6IHdpZHRoID0gJWksIGhlaWdodCA9ICVpLCByYXdidWZzaXplID0gJWxpIiwgc3R2NjgwLT52d2lkdGgsIHN0djY4MC0+dmhlaWdodCwgc3R2NjgwLT5yYXdidWZzaXplKTsKKworCS8qIHNvbWUgZGVmYXVsdCB2YWx1ZXMgKi8KKwlzdHY2ODAtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0gMHg4MjsKKwlzdHY2ODAtPmRyb3BwZWQgPSAwOworCXN0djY4MC0+ZXJyb3IgPSAwOworCXN0djY4MC0+ZnJhbWVjb3VudCA9IDA7CisJc3R2NjgwLT5yZWFkY291bnQgPSAwOworCXN0djY4MC0+c3RyZWFtaW5nID0gMDsKKwkvKiBicmlnaHQsIHdoaXRlLCBjb2xvdXIsIGh1ZSwgY29udHJhc3QgYXJlIHNldCBieSBzb2Z0d2FyZSwgbm90IGluIHN0djA2ODAgKi8KKwlzdHY2ODAtPmJyaWdodG5lc3MgPSAzMjc2NzsKKwlzdHY2ODAtPmNoZ2JyaWdodCA9IDA7CisJc3R2NjgwLT53aGl0ZW5lc3MgPSAwOwkvKiBvbmx5IGZvciBncmV5c2NhbGUgKi8KKwlzdHY2ODAtPmNvbG91ciA9IDMyNzY3OworCXN0djY4MC0+Y29udHJhc3QgPSAzMjc2NzsKKwlzdHY2ODAtPmh1ZSA9IDMyNzY3OworCXN0djY4MC0+cGFsZXR0ZSA9IFNUVl9WSURFT19QQUxFVFRFOworCXN0djY4MC0+ZGVwdGggPSAyNDsJLyogcmdiMjQgYml0cyAqLworCWlmICgoc3dhcFJHQl9vbiA9PSAwKSAmJiAoc3dhcFJHQiA9PSAwKSkKKwkJUERFQlVHICgxLCAiU1RWKGkpOiBzd2FwUkdCIGlzIChhdXRvKSBPRkYiKTsKKwllbHNlIGlmICgoc3dhcFJHQl9vbiA9PSAwKSAmJiAoc3dhcFJHQiA9PSAxKSkKKwkJUERFQlVHICgxLCAiU1RWKGkpOiBzd2FwUkdCIGlzIChhdXRvKSBPTiIpOworCWVsc2UgaWYgKHN3YXBSR0Jfb24gPT0gMSkKKwkJUERFQlVHICgxLCAiU1RWKGkpOiBzd2FwUkdCIGlzIChmb3JjZWQpIE9OIik7CisJZWxzZSBpZiAoc3dhcFJHQl9vbiA9PSAtMSkKKwkJUERFQlVHICgxLCAiU1RWKGkpOiBzd2FwUkdCIGlzIChmb3JjZWQpIE9GRiIpOworCQorCWlmIChzdHZfc2V0X3ZpZGVvX21vZGUgKHN0djY4MCkgPCAwKSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogQ291bGQgbm90IHNldCB2aWRlbyBtb2RlIGluIHN0dl9pbml0Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqIGxhc3Qgb2YgcGVuY2FtICByb3V0aW5lcyAgKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBzeXNmcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgc3R2NjgwX2ZpbGUobmFtZSwgdmFyaWFibGUsIGZpZWxkKQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdG9fdmlkZW9fZGV2aWNlKGNsYXNzX2Rldik7CQlcCisJc3RydWN0IHVzYl9zdHYgKnN0diA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsIGZpZWxkLCBzdHYtPnZhcmlhYmxlKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKTsKKworc3R2NjgwX2ZpbGUobW9kZWwsIGNhbWVyYV9uYW1lLCAiJXNcbiIpOworc3R2NjgwX2ZpbGUoaW5fdXNlLCB1c2VyLCAiJWRcbiIpOworc3R2NjgwX2ZpbGUoc3RyZWFtaW5nLCBzdHJlYW1pbmcsICIlZFxuIik7CitzdHY2ODBfZmlsZShwYWxldHRlLCBwYWxldHRlLCAiJWlcbiIpOworc3R2NjgwX2ZpbGUoZnJhbWVzX3RvdGFsLCByZWFkY291bnQsICIlZFxuIik7CitzdHY2ODBfZmlsZShmcmFtZXNfcmVhZCwgZnJhbWVjb3VudCwgIiVkXG4iKTsKK3N0djY4MF9maWxlKHBhY2tldHNfZHJvcHBlZCwgZHJvcHBlZCwgIiVkXG4iKTsKK3N0djY4MF9maWxlKGRlY29kaW5nX2Vycm9ycywgZXJyb3IsICIlZFxuIik7CisKK3N0YXRpYyB2b2lkIHN0djY4MF9jcmVhdGVfc3lzZnNfZmlsZXMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3sKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX21vZGVsKTsKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2luX3VzZSk7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zdHJlYW1pbmcpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcGFsZXR0ZSk7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZXNfdG90YWwpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZnJhbWVzX3JlYWQpOworCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcGFja2V0c19kcm9wcGVkKTsKKwl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2RlY29kaW5nX2Vycm9ycyk7Cit9CisKK3N0YXRpYyB2b2lkIHN0djY4MF9yZW1vdmVfc3lzZnNfZmlsZXMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3sKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX21vZGVsKTsKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2luX3VzZSk7CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zdHJlYW1pbmcpOworCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcGFsZXR0ZSk7CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZXNfdG90YWwpOworCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZnJhbWVzX3JlYWQpOworCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcGFja2V0c19kcm9wcGVkKTsKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2RlY29kaW5nX2Vycm9ycyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2FtZXJhIGNvbnRyb2wKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0djY4MF9nZXRfcGljdCAoc3RydWN0IHVzYl9zdHYgKnN0djY4MCwgc3RydWN0IHZpZGVvX3BpY3R1cmUgKnApCit7CisJLyogVGhpcyBzZXRzIHZhbHVlcyBmb3IgdjRsIGludGVyZmFjZS4gbWF4L21pbiA9IDY1NTM1LzAgICovCisKKwlwLT5icmlnaHRuZXNzID0gc3R2NjgwLT5icmlnaHRuZXNzOworCXAtPndoaXRlbmVzcyA9IHN0djY4MC0+d2hpdGVuZXNzOwkvKiBncmV5c2NhbGUgKi8KKwlwLT5jb2xvdXIgPSBzdHY2ODAtPmNvbG91cjsKKwlwLT5jb250cmFzdCA9IHN0djY4MC0+Y29udHJhc3Q7CisJcC0+aHVlID0gc3R2NjgwLT5odWU7CisJcC0+cGFsZXR0ZSA9IHN0djY4MC0+cGFsZXR0ZTsKKwlwLT5kZXB0aCA9IHN0djY4MC0+ZGVwdGg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2NjgwX3NldF9waWN0IChzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwLCBzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCkKK3sKKwkvKiBTZWUgYWJvdmUgc3R2NjgwX2dldF9waWN0ICAqLworCisJaWYgKHAtPnBhbGV0dGUgIT0gU1RWX1ZJREVPX1BBTEVUVEUpIHsKKwkJUERFQlVHICgyLCAiU1RWKGUpOiBQYWxldHRlIHNldCBlcnJvciBpbiBfc2V0X3BpYyIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoc3R2NjgwLT5icmlnaHRuZXNzICE9IHAtPmJyaWdodG5lc3MpIHsKKwkJc3R2NjgwLT5jaGdicmlnaHQgPSAxOworCQlzdHY2ODAtPmJyaWdodG5lc3MgPSBwLT5icmlnaHRuZXNzOworCX0gCisKKwlzdHY2ODAtPndoaXRlbmVzcyA9IHAtPndoaXRlbmVzczsJLyogZ3JleXNjYWxlICovCisJc3R2NjgwLT5jb2xvdXIgPSBwLT5jb2xvdXI7CisJc3R2NjgwLT5jb250cmFzdCA9IHAtPmNvbnRyYXN0OworCXN0djY4MC0+aHVlID0gcC0+aHVlOworCXN0djY4MC0+cGFsZXR0ZSA9IHAtPnBhbGV0dGU7CisJc3R2NjgwLT5kZXB0aCA9IHAtPmRlcHRoOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0djY4MF92aWRlb19pcnEgKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVzYl9zdHYgKnN0djY4MCA9IHVyYi0+Y29udGV4dDsKKwlpbnQgbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCisJaWYgKGxlbmd0aCA8IHN0djY4MC0+cmF3YnVmc2l6ZSkKKwkJUERFQlVHICgyLCAiU1RWKGkpOiBMb3N0IGRhdGEgaW4gdHJhbnNmZXI6IGV4cCAlbGksIGdvdCAlaSIsIHN0djY4MC0+cmF3YnVmc2l6ZSwgbGVuZ3RoKTsKKworCS8qIG9ob2guLi4gKi8KKwlpZiAoIXN0djY4MC0+c3RyZWFtaW5nKQorCQlyZXR1cm47CisKKwlpZiAoIXN0djY4MC0+dWRldikgeworCQlQREVCVUcgKDAsICJTVFYoZSk6IGRldmljZSB2YXBvdXJpc2hlZCBpbiB2aWRlb19pcnEiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIDAgc2l6ZWQgcGFja2V0cyBoYXBwZW4gaWYgd2UgYXJlIHRvIGZhc3QsIGJ1dCBzb21ldGltZXMgdGhlIGNhbWVyYQorCSAgIGtlZXBzIHNlbmRpbmcgdGhlbSBmb3JldmVyLi4uCisJICovCisJaWYgKGxlbmd0aCAmJiAhdXJiLT5zdGF0dXMpIHsKKwkJc3R2NjgwLT5udWxscGFja2V0cyA9IDA7CisJCXN3aXRjaCAoc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF9uZXh0XS5zdGF0ZSkgeworCQljYXNlIEJVRkZFUl9SRUFEWToKKwkJY2FzZSBCVUZGRVJfQlVTWToKKwkJCXN0djY4MC0+ZHJvcHBlZCsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVUZGRVJfVU5VU0VEOgorCQkJbWVtY3B5IChzdHY2ODAtPnNjcmF0Y2hbc3R2NjgwLT5zY3JhdGNoX25leHRdLmRhdGEsCisJCQkgICAgICAgICh1bnNpZ25lZCBjaGFyICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBsZW5ndGgpOworCQkJc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF9uZXh0XS5zdGF0ZSA9IEJVRkZFUl9SRUFEWTsKKwkJCXN0djY4MC0+c2NyYXRjaFtzdHY2ODAtPnNjcmF0Y2hfbmV4dF0ubGVuZ3RoID0gbGVuZ3RoOworCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUgKCZzdHY2ODAtPndxKSkgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnN0djY4MC0+d3EpOworCQkJfQorCQkJc3R2NjgwLT5zY3JhdGNoX292ZXJmbG93ID0gMDsKKwkJCXN0djY4MC0+c2NyYXRjaF9uZXh0Kys7CisJCQlpZiAoc3R2NjgwLT5zY3JhdGNoX25leHQgPj0gU1RWNjgwX05VTVNDUkFUQ0gpCisJCQkJc3R2NjgwLT5zY3JhdGNoX25leHQgPSAwOworCQkJYnJlYWs7CisJCX0JCS8qIHN3aXRjaCAgKi8KKwl9IGVsc2UgeworCQlzdHY2ODAtPm51bGxwYWNrZXRzKys7CisJCWlmIChzdHY2ODAtPm51bGxwYWNrZXRzID4gU1RWNjgwX01BWF9OVUxMUEFDS0VUUykgeworCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUgKCZzdHY2ODAtPndxKSkgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJnN0djY4MC0+d3EpOworCQkJfQorCQl9CisJfQkJCS8qICBpZiAtIGVsc2UgKi8KKworCS8qIFJlc3VibWl0IHVyYiBmb3IgbmV3IGRhdGEgKi8KKwl1cmItPnN0YXR1cyA9IDA7CisJdXJiLT5kZXYgPSBzdHY2ODAtPnVkZXY7CisJaWYgKHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpKQorCQlQREVCVUcgKDAsICJTVFYoZSk6IHVyYiBidXJuZWQgZG93biBpbiB2aWRlbyBpcnEiKTsKKwlyZXR1cm47Cit9CQkJCS8qICBfdmlkZW9faXJxICAqLworCitzdGF0aWMgaW50IHN0djY4MF9zdGFydF9zdHJlYW0gKHN0cnVjdCB1c2Jfc3R2ICpzdHY2ODApCit7CisJc3RydWN0IHVyYiAqdXJiOworCWludCBlcnIgPSAwLCBpOworCisJc3R2NjgwLT5zdHJlYW1pbmcgPSAxOworCisJLyogRG8gc29tZSBtZW1vcnkgYWxsb2NhdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBTVFY2ODBfTlVNRlJBTUVTOyBpKyspIHsKKwkJc3R2NjgwLT5mcmFtZVtpXS5kYXRhID0gc3R2NjgwLT5mYnVmICsgaSAqIHN0djY4MC0+bWF4ZnJhbWVzaXplOworCQlzdHY2ODAtPmZyYW1lW2ldLmN1cnBpeCA9IDA7CisJfQorCS8qIHBhY2tldCBzaXplID0gNDA5NiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTVNCVUY7IGkrKykgeworCQlzdHY2ODAtPnNidWZbaV0uZGF0YSA9IGttYWxsb2MgKHN0djY4MC0+cmF3YnVmc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChzdHY2ODAtPnNidWZbaV0uZGF0YSA9PSBOVUxMKSB7CisJCQlQREVCVUcgKDAsICJTVFYoZSk6IENvdWxkIG5vdCBrbWFsbG9jIHJhdyBkYXRhIGJ1ZmZlciAlaSIsIGkpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJc3R2NjgwLT5zY3JhdGNoX25leHQgPSAwOworCXN0djY4MC0+c2NyYXRjaF91c2UgPSAwOworCXN0djY4MC0+c2NyYXRjaF9vdmVyZmxvdyA9IDA7CisJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQ1JBVENIOyBpKyspIHsKKwkJc3R2NjgwLT5zY3JhdGNoW2ldLmRhdGEgPSBrbWFsbG9jIChzdHY2ODAtPnJhd2J1ZnNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoc3R2NjgwLT5zY3JhdGNoW2ldLmRhdGEgPT0gTlVMTCkgeworCQkJUERFQlVHICgwLCAiU1RWKGUpOiBDb3VsZCBub3Qga21hbGxvYyByYXcgc2NyYXRjaCBidWZmZXIgJWkiLCBpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlzdHY2ODAtPnNjcmF0Y2hbaV0uc3RhdGUgPSBCVUZGRVJfVU5VU0VEOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBTVFY2ODBfTlVNU0JVRjsgaSsrKSB7CisJCXVyYiA9IHVzYl9hbGxvY191cmIgKDAsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIHNidWYgaXMgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxhdGVyIGdldHMgbWVtY3B5ZWQgdG8gc2NyYXRjaCAqLworCQl1c2JfZmlsbF9idWxrX3VyYiAodXJiLCBzdHY2ODAtPnVkZXYsCisJCQkJICAgdXNiX3JjdmJ1bGtwaXBlIChzdHY2ODAtPnVkZXYsIHN0djY4MC0+YnVsa19pbl9lbmRwb2ludEFkZHIpLAorCQkJCSAgIHN0djY4MC0+c2J1ZltpXS5kYXRhLCBzdHY2ODAtPnJhd2J1ZnNpemUsCisJCQkJICAgc3R2NjgwX3ZpZGVvX2lycSwgc3R2NjgwKTsKKwkJc3R2NjgwLT51cmJbaV0gPSB1cmI7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiIChzdHY2ODAtPnVyYltpXSwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpCisJCQlQREVCVUcgKDAsICJTVFYoZSk6IHVyYiBidXJuZWQgZG93biBpbiBzdGFydCBzdHJlYW0iKTsKKwl9CQkJLyogaSBTVFY2ODBfTlVNU0JVRiAqLworCisJc3R2NjgwLT5mcmFtZWNvdW50ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHY2ODBfc3RvcF9zdHJlYW0gKHN0cnVjdCB1c2Jfc3R2ICpzdHY2ODApCit7CisJaW50IGk7CisKKwlpZiAoIXN0djY4MC0+c3RyZWFtaW5nIHx8ICFzdHY2ODAtPnVkZXYpCisJCXJldHVybiAxOworCisJc3R2NjgwLT5zdHJlYW1pbmcgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQlVGOyBpKyspCisJCWlmIChzdHY2ODAtPnVyYltpXSkgeworCQkJdXNiX2tpbGxfdXJiIChzdHY2ODAtPnVyYltpXSk7CisJCQl1c2JfZnJlZV91cmIgKHN0djY4MC0+dXJiW2ldKTsKKwkJCXN0djY4MC0+dXJiW2ldID0gTlVMTDsKKwkJCWtmcmVlIChzdHY2ODAtPnNidWZbaV0uZGF0YSk7CisJCX0KKwlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTVNDUkFUQ0g7IGkrKykgeworCQlrZnJlZSAoc3R2NjgwLT5zY3JhdGNoW2ldLmRhdGEpOworCQlzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2NjgwX3NldF9zaXplIChzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJaW50IHdhc3N0cmVhbWluZyA9IHN0djY4MC0+c3RyZWFtaW5nOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gY2hhbmdlICovCisJaWYgKChzdHY2ODAtPnZ3aWR0aCA9PSB3aWR0aCkgJiYgKHN0djY4MC0+dmhlaWdodCA9PSBoZWlnaHQpKQorCQlyZXR1cm4gMDsKKworCVBERUJVRyAoMSwgIlNUVihpKTogc2l6ZSByZXF1ZXN0IGZvciAlaSB4ICVpIiwgd2lkdGgsIGhlaWdodCk7CisJLyogQ2hlY2sgZm9yIGEgdmFsaWQgbW9kZSAqLworCWlmICgoIXdpZHRoIHx8ICFoZWlnaHQpIHx8ICgod2lkdGggJiAxKSB8fCAoaGVpZ2h0ICYgMSkpKSB7CisJCVBERUJVRyAoMSwgIlNUVihlKTogc2V0X3NpemUgZXJyb3I6IHJlcXVlc3Q6IHYud2lkdGggPSAlaSwgdi5oZWlnaHQgPSAlaSAgYWN0dWFsOiBzdHYud2lkdGggPSAlaSwgc3R2LmhlaWdodCA9ICVpIiwgd2lkdGgsIGhlaWdodCwgc3R2NjgwLT52d2lkdGgsIHN0djY4MC0+dmhlaWdodCk7CisJCXJldHVybiAxOworCX0KKworCWlmICgod2lkdGggPCAoc3R2NjgwLT5tYXh3aWR0aCAvIDIpKSB8fCAoaGVpZ2h0IDwgKHN0djY4MC0+bWF4aGVpZ2h0IC8gMikpKSB7CisJCXdpZHRoID0gc3R2NjgwLT5tYXh3aWR0aCAvIDI7CisJCWhlaWdodCA9IHN0djY4MC0+bWF4aGVpZ2h0IC8gMjsKKwl9IGVsc2UgaWYgKCh3aWR0aCA+PSAxNTgpICYmICh3aWR0aCA8PSAxNjYpICYmIChzdHY2ODAtPlFWR0EgPT0gMSkpIHsKKwkJd2lkdGggPSAxNjA7CisJCWhlaWdodCA9IDEyMDsKKwl9IGVsc2UgaWYgKCh3aWR0aCA+PSAxNzIpICYmICh3aWR0aCA8PSAxODApICYmIChzdHY2ODAtPkNJRiA9PSAxKSkgeworCQl3aWR0aCA9IDE3NjsKKwkJaGVpZ2h0ID0gMTQ0OworCX0gZWxzZSBpZiAoKHdpZHRoID49IDMxOCkgJiYgKHdpZHRoIDw9IDM1MCkgJiYgKHN0djY4MC0+UVZHQSA9PSAxKSkgeworCQl3aWR0aCA9IDMyMDsKKwkJaGVpZ2h0ID0gMjQwOworCX0gZWxzZSBpZiAoKHdpZHRoID49IDM1MCkgJiYgKHdpZHRoIDw9IDM1OCkgJiYgKHN0djY4MC0+Q0lGID09IDEpKSB7CisJCXdpZHRoID0gMzUyOworCQloZWlnaHQgPSAyODg7CisJfSBlbHNlIHsKKwkJUERFQlVHICgxLCAiU1RWKGUpOiByZXF1ZXN0IGZvciBub24tc3VwcG9ydGVkIHNpemU6IHJlcXVlc3Q6IHYud2lkdGggPSAlaSwgdi5oZWlnaHQgPSAlaSAgYWN0dWFsOiBzdHYud2lkdGggPSAlaSwgc3R2LmhlaWdodCA9ICVpIiwgd2lkdGgsIGhlaWdodCwgc3R2NjgwLT52d2lkdGgsIHN0djY4MC0+dmhlaWdodCk7CisJCXJldHVybiAxOworCX0KKwkKKwkvKiBTdG9wIGEgY3VycmVudCBzdHJlYW0gYW5kIHN0YXJ0IGl0IGFnYWluIGF0IHRoZSBuZXcgc2l6ZSAqLworCWlmICh3YXNzdHJlYW1pbmcpCisJCXN0djY4MF9zdG9wX3N0cmVhbSAoc3R2NjgwKTsKKwlzdHY2ODAtPnZ3aWR0aCA9IHdpZHRoOworCXN0djY4MC0+dmhlaWdodCA9IGhlaWdodDsKKwlQREVCVUcgKDEsICJTVFYoaSk6IHNpemUgc2V0IHRvICVpIHggJWkiLCBzdHY2ODAtPnZ3aWR0aCwgc3R2NjgwLT52aGVpZ2h0KTsKKwlpZiAod2Fzc3RyZWFtaW5nKQorCQlzdHY2ODBfc3RhcnRfc3RyZWFtIChzdHY2ODApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaWRlbyBEZWNvZGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqICByb3V0aW5lcyBmcm9tIHRoZSBwZW5jYW0gcHJvZ3JhbTsgaGV5LCB0aGV5IHdvcmshICAqKioqKioqKi8KKworLyoKKyAqIFNUVjA2ODAgVmlzaW9uIENhbWVyYSBDaGlwc2V0IERyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAwIEFkYW0gSGFycmlzb24gPGFkYW1AYW50aXNwaW4ub3JnPiAKKyovCisKKyNkZWZpbmUgUkVEIDAKKyNkZWZpbmUgR1JFRU4gMQorI2RlZmluZSBCTFVFIDIKKyNkZWZpbmUgQUQoeCwgeSwgdykgKCgoeSkqKHcpKyh4KSkqMykKKworc3RhdGljIHZvaWQgYmF5ZXJfdW5zaHVmZmxlIChzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwLCBzdHJ1Y3Qgc3R2NjgwX3NjcmF0Y2ggKmJ1ZmZlcikKK3sKKwlpbnQgeCwgeSwgaTsKKwlpbnQgdyA9IHN0djY4MC0+Y3dpZHRoOworCWludCB2dyA9IHN0djY4MC0+Y3dpZHRoLCB2aCA9IHN0djY4MC0+Y2hlaWdodDsKKwl1bnNpZ25lZCBpbnQgcCA9IDA7CisJaW50IGNvbG91ciA9IDAsIGJheWVyID0gMDsKKwl1bnNpZ25lZCBjaGFyICpyYXcgPSBidWZmZXItPmRhdGE7CisJc3RydWN0IHN0djY4MF9mcmFtZSAqZnJhbWUgPSAmc3R2NjgwLT5mcmFtZVtzdHY2ODAtPmN1cmZyYW1lXTsKKwl1bnNpZ25lZCBjaGFyICpvdXRwdXQgPSBmcmFtZS0+ZGF0YTsKKwl1bnNpZ25lZCBjaGFyICp0ZW1wID0gZnJhbWUtPmRhdGE7CisJaW50IG9mZnNldCA9IGJ1ZmZlci0+b2Zmc2V0OworCisJaWYgKGZyYW1lLT5jdXJwaXggPT0gMCkgeworCQlpZiAoZnJhbWUtPmdyYWJzdGF0ZSA9PSBGUkFNRV9SRUFEWSkgeworCQkJZnJhbWUtPmdyYWJzdGF0ZSA9IEZSQU1FX0dSQUJCSU5HOworCQl9CisJfQorCWlmIChvZmZzZXQgIT0gZnJhbWUtPmN1cnBpeCkgewkvKiBSZWdhcmQgZnJhbWUgYXMgbG9zdCA6KCAqLworCQlmcmFtZS0+Y3VycGl4ID0gMDsKKwkJc3R2NjgwLT5lcnJvcisrOworCQlyZXR1cm47CisJfQorCisJaWYgKChzdHY2ODAtPnZ3aWR0aCA9PSAzMjApIHx8IChzdHY2ODAtPnZ3aWR0aCA9PSAxNjApKSB7CisJCXZ3ID0gMzIwOworCQl2aCA9IDI0MDsKKwl9CisJaWYgKChzdHY2ODAtPnZ3aWR0aCA9PSAzNTIpIHx8IChzdHY2ODAtPnZ3aWR0aCA9PSAxNzYpKSB7CisJCXZ3ID0gMzUyOworCQl2aCA9IDI4ODsKKwl9CisKKwltZW1zZXQgKG91dHB1dCwgMCwgMyAqIHZ3ICogdmgpOwkvKiBjbGVhciBvdXRwdXQgbWF0cml4LiAqLworCisJZm9yICh5ID0gMDsgeSA8IHZoOyB5KyspIHsKKwkJZm9yICh4ID0gMDsgeCA8IHZ3OyB4KyspIHsKKwkJCWlmICh4ICYgMSkKKwkJCQlwID0gKihyYXcgKyB5ICogdyArICh4ID4+IDEpKTsKKwkJCWVsc2UKKwkJCQlwID0gKihyYXcgKyB5ICogdyArICh4ID4+IDEpICsgKHcgPj4gMSkpOworCisJCQlpZiAoeSAmIDEpCisJCQkJYmF5ZXIgPSAyOworCQkJZWxzZQorCQkJCWJheWVyID0gMDsKKwkJCWlmICh4ICYgMSkKKwkJCQliYXllcisrOworCisJCQlzd2l0Y2ggKGJheWVyKSB7CisJCQljYXNlIDA6CisJCQljYXNlIDM6CisJCQkJY29sb3VyID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQljb2xvdXIgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWNvbG91ciA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpID0gKHkgKiB2dyArIHgpICogMzsJCisJCQkqKG91dHB1dCArIGkgKyBjb2xvdXIpID0gKHVuc2lnbmVkIGNoYXIpIHA7CisJCX0JCS8qIGZvciB4ICovCisKKwl9CQkJLyogZm9yIHkgKi8KKworCS8qKioqKiogZ2FtbWEgY29ycmVjdGlvbiBwbHVzIGhhcmRjb2RlZCB3aGl0ZSBiYWxhbmNlICovCisJLyogVGhhbmtzIHRvIEFsZXhhbmRlciBTY2h3YXJ0eCA8YWxleGFuZGVyLnNjaHdhcnR4QGdteC5uZXQ+IGZvciB0aGlzIGNvZGUuCisJICAgQ29ycmVjdGlvbiB2YWx1ZXMgcmVkW10sIGdyZWVuW10sIGJsdWVbXSwgYXJlIGdlbmVyYXRlZCBieSAKKwkgICAocG93KGkvMjU2LjAsIEdBTU1BKSoyNTUuMCkqd2hpdGUgYmFsYW5jZVJHQiB3aGVyZSBHQU1NQT0wLjU1LCAxPGk8MjU1LiAKKwkgICBXaGl0ZSBiYWxhbmNlIChSR0IpPSAxLjAsIDEuMTcsIDEuNDguIFZhbHVlcyBhcmUgY2FsY3VsYXRlZCBhcyBkb3VibGUgZmxvYXQgYW5kIAorCSAgIGNvbnZlcnRlZCB0byB1bnNpZ25lZCBjaGFyLiBWYWx1ZXMgYXJlIGluIHN0djY4MC5oICAqLworCisJZm9yICh5ID0gMDsgeSA8IHZoOyB5KyspIHsKKwkJZm9yICh4ID0gMDsgeCA8IHZ3OyB4KyspIHsKKwkJCWkgPSAoeSAqIHZ3ICsgeCkgKiAzOworCQkJKihvdXRwdXQgKyBpKSA9IHJlZFsqKG91dHB1dCArIGkpXTsKKwkJCSoob3V0cHV0ICsgaSArIDEpID0gZ3JlZW5bKihvdXRwdXQgKyBpICsgMSldOworCQkJKihvdXRwdXQgKyBpICsgMikgPSBibHVlWyoob3V0cHV0ICsgaSArIDIpXTsKKwkJfQorCX0KKworCS8qKioqKiogIGJheWVyIGRlbW9zYWljICAqKioqKiovCisJZm9yICh5ID0gMTsgeSA8ICh2aCAtIDEpOyB5KyspIHsKKwkJZm9yICh4ID0gMTsgeCA8ICh2dyAtIDEpOyB4KyspIHsJLyogd29yayBvdXQgcGl4ZWwgdHlwZSAqLworCQkJaWYgKHkgJiAxKQorCQkJCWJheWVyID0gMDsKKwkJCWVsc2UKKwkJCQliYXllciA9IDI7CisJCQlpZiAoISh4ICYgMSkpCisJCQkJYmF5ZXIrKzsKKworCQkJc3dpdGNoIChiYXllcikgeworCQkJY2FzZSAwOgkvKiBncmVlbi4gYmx1ZSBsciwgcmVkIHRiICovCisJCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgQkxVRSkgPSAoKGludCkgKihvdXRwdXQgKyBBRCAoeCAtIDEsIHksIHZ3KSArIEJMVUUpICsgKGludCkgKihvdXRwdXQgKyBBRCAoeCArIDEsIHksIHZ3KSArIEJMVUUpKSA+PiAxOworCQkJCSoob3V0cHV0ICsgQUQgKHgsIHksIHZ3KSArIFJFRCkgPSAoKGludCkgKihvdXRwdXQgKyBBRCAoeCwgeSAtIDEsIHZ3KSArIFJFRCkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4LCB5ICsgMSwgdncpICsgUkVEKSkgPj4gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAxOgkvKiBibHVlLiBncmVlbiBscnRiLCByZWQgZGlhZ29uYWxzICovCisJCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgR1JFRU4pID0gKChpbnQpICoob3V0cHV0ICsgQUQgKHggLSAxLCB5LCB2dykgKyBHUkVFTikgKyAoaW50KSAqKG91dHB1dCArIEFEICh4ICsgMSwgeSwgdncpICsgR1JFRU4pICsgKGludCkgKihvdXRwdXQgKyBBRCAoeCwgeSAtIDEsIHZ3KSArIEdSRUVOKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHgsIHkgKyAxLCB2dykgKyBHUkVFTikpID4+IDI7CisJCQkJKihvdXRwdXQgKyBBRCAoeCwgeSwgdncpICsgUkVEKSA9ICgoaW50KSAqKG91dHB1dCArIEFEICh4IC0gMSwgeSAtIDEsIHZ3KSArIFJFRCkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4IC0gMSwgeSArIDEsIHZ3KSArIFJFRCkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4ICsgMSwgeSAtIDEsIHZ3KSArIFJFRCkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4ICsgMSwgeSArIDEsIHZ3KSArIFJFRCkpID4+IDI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoJLyogcmVkLiBncmVlbiBscnRiLCBibHVlIGRpYWdvbmFscyAqLworCQkJCSoob3V0cHV0ICsgQUQgKHgsIHksIHZ3KSArIEdSRUVOKSA9ICgoaW50KSAqKG91dHB1dCArIEFEICh4IC0gMSwgeSwgdncpICsgR1JFRU4pICsgKGludCkgKihvdXRwdXQgKyBBRCAoeCArIDEsIHksIHZ3KSArIEdSRUVOKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHgsIHkgLSAxLCB2dykgKyBHUkVFTikgKyAoaW50KSAqKG91dHB1dCArIEFEICh4LCB5ICsgMSwgdncpICsgR1JFRU4pKSA+PiAyOworCQkJCSoob3V0cHV0ICsgQUQgKHgsIHksIHZ3KSArIEJMVUUpID0gKChpbnQpICoob3V0cHV0ICsgQUQgKHggLSAxLCB5IC0gMSwgdncpICsgQkxVRSkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4ICsgMSwgeSAtIDEsIHZ3KSArIEJMVUUpICsgKGludCkgKihvdXRwdXQgKyBBRCAoeCAtIDEsIHkgKyAxLCB2dykgKyBCTFVFKSArIChpbnQpICoob3V0cHV0ICsgQUQgKHggKyAxLCB5ICsgMSwgdncpICsgQkxVRSkpID4+IDI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzoJLyogZ3JlZW4uIHJlZCBsciwgYmx1ZSB0YiAqLworCQkJCSoob3V0cHV0ICsgQUQgKHgsIHksIHZ3KSArIFJFRCkgPSAoKGludCkgKihvdXRwdXQgKyBBRCAoeCAtIDEsIHksIHZ3KSArIFJFRCkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4ICsgMSwgeSwgdncpICsgUkVEKSkgPj4gMTsKKwkJCQkqKG91dHB1dCArIEFEICh4LCB5LCB2dykgKyBCTFVFKSA9ICgoaW50KSAqKG91dHB1dCArIEFEICh4LCB5IC0gMSwgdncpICsgQkxVRSkgKyAoaW50KSAqKG91dHB1dCArIEFEICh4LCB5ICsgMSwgdncpICsgQkxVRSkpID4+IDE7CisJCQkJYnJlYWs7CisJCQl9CS8qIHN3aXRjaCAqLworCQl9CQkvKiBmb3IgeCAqLworCX0JCQkvKiBmb3IgeSAgLSBlbmQgZGVtb3NhaWMgICovCisKKwkvKiBmaXggdG9wIGFuZCBib3R0b20gcm93LCBsZWZ0IGFuZCByaWdodCBzaWRlICovCisJaSA9IHZ3ICogMzsKKwltZW1jcHkgKG91dHB1dCwgKG91dHB1dCArIGkpLCBpKTsKKwltZW1jcHkgKChvdXRwdXQgKyAodmggKiBpKSksIChvdXRwdXQgKyAoKHZoIC0gMSkgKiBpKSksIGkpOworCWZvciAoeSA9IDA7IHkgPCB2aDsgeSsrKSB7CisJCWkgPSB5ICogdncgKiAzOworCQltZW1jcHkgKChvdXRwdXQgKyBpKSwgKG91dHB1dCArIGkgKyAzKSwgMyk7CisJCW1lbWNweSAoKG91dHB1dCArIGkgKyAodncgKiAzKSksIChvdXRwdXQgKyBpICsgKHZ3IC0gMSkgKiAzKSwgMyk7CisJfQorCisJLyogIHByb2Nlc3MgYWxsIHJhdyBkYXRhLCB0aGVuIHRyaW0gdG8gc2l6ZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoKHN0djY4MC0+dndpZHRoID09IDE2MCkgfHwgKHN0djY4MC0+dndpZHRoID09IDE3NikpICB7CisJCWkgPSAwOworCQlmb3IgKHkgPSAwOyB5IDwgdmg7IHkrKykgeworCQkJaWYgKCEoeSAmIDEpKSB7CisJCQkJZm9yICh4ID0gMDsgeCA8IHZ3OyB4KyspIHsKKwkJCQkJcCA9ICh5ICogdncgKyB4KSAqIDM7CisJCQkJCWlmICghKHggJiAxKSkgeworCQkJCQkJKihvdXRwdXQgKyBpKSA9ICoob3V0cHV0ICsgcCk7CisJCQkJCQkqKG91dHB1dCArIGkgKyAxKSA9ICoob3V0cHV0ICsgcCArIDEpOworCQkJCQkJKihvdXRwdXQgKyBpICsgMikgPSAqKG91dHB1dCArIHAgKyAyKTsKKwkJCQkJCWkgKz0gMzsKKwkJCQkJfQorCQkJCX0gIC8qIGZvciB4ICovCisJCQl9CisJCX0gIC8qIGZvciB5ICovCisJfQorCS8qIHJlc2V0IHRvIHByb3BlciB3aWR0aCAqLworCWlmICgoc3R2NjgwLT52d2lkdGggPT0gMTYwKSkgeworCQl2dyA9IDE2MDsKKwkJdmggPSAxMjA7CisJfQorCWlmICgoc3R2NjgwLT52d2lkdGggPT0gMTc2KSkgeworCQl2dyA9IDE3NjsKKwkJdmggPSAxNDQ7CisJfQorCisJLyogb3V0cHV0IGlzIFJHQjsgc29tZSBwcm9ncmFtcyB3YW50IEJHUiAgKi8KKwkvKiBzd2FwUkdCX29uPTAgLT4gcHJvZ3JhbSBkZWNpZGVzOyAgc3dhcFJHQl9vbj0xLCBhbHdheXMgc3dhcCAqLworCS8qIHN3YXBSR0Jfb249LTEsIG5ldmVyIHN3YXAgKi8KKwlpZiAoKChzd2FwUkdCID09IDEpICYmIChzd2FwUkdCX29uICE9IC0xKSkgfHwgKHN3YXBSR0Jfb24gPT0gMSkpIHsKKwkJZm9yICh5ID0gMDsgeSA8IHZoOyB5KyspIHsKKwkJCWZvciAoeCA9IDA7IHggPCB2dzsgeCsrKSB7CisJCQkJaSA9ICh5ICogdncgKyB4KSAqIDM7CisJCQkJKih0ZW1wKSA9ICoob3V0cHV0ICsgaSk7CisJCQkJKihvdXRwdXQgKyBpKSA9ICoob3V0cHV0ICsgaSArIDIpOworCQkJCSoob3V0cHV0ICsgaSArIDIpID0gKih0ZW1wKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBicmlnaHRuZXNzICovCisJaWYgKHN0djY4MC0+Y2hnYnJpZ2h0ID09IDEpIHsKKwkJaWYgKHN0djY4MC0+YnJpZ2h0bmVzcyA+PSAzMjc2NykgeworCQkJcCA9IChzdHY2ODAtPmJyaWdodG5lc3MgLSAzMjc2NykgLyAyNTY7CisJCQlmb3IgKHggPSAwOyB4IDwgKHZ3ICogdmggKiAzKTsgeCsrKSB7CisJCQkJaWYgKCgqKG91dHB1dCArIHgpICsgKHVuc2lnbmVkIGNoYXIpIHApID4gMjU1KQorCQkJCQkqKG91dHB1dCArIHgpID0gMjU1OworCQkJCWVsc2UKKwkJCQkJKihvdXRwdXQgKyB4KSArPSAodW5zaWduZWQgY2hhcikgcDsKKwkJCX0JLyogZm9yICovCisJCX0gZWxzZSB7CisJCQlwID0gKDMyNzY3IC0gc3R2NjgwLT5icmlnaHRuZXNzKSAvIDI1NjsKKwkJCWZvciAoeCA9IDA7IHggPCAodncgKiB2aCAqIDMpOyB4KyspIHsKKwkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpIHAgPiAqKG91dHB1dCArIHgpKQorCQkJCQkqKG91dHB1dCArIHgpID0gMDsKKwkJCQllbHNlCisJCQkJCSoob3V0cHV0ICsgeCkgLT0gKHVuc2lnbmVkIGNoYXIpIHA7CisJCQl9CS8qIGZvciAqLworCQl9CQkvKiBlbHNlICovCisJfQorCS8qIGlmICovCisJZnJhbWUtPmN1cnBpeCA9IDA7CisJZnJhbWUtPmN1cmxpbmVwaXggPSAwOworCWZyYW1lLT5ncmFic3RhdGUgPSBGUkFNRV9ET05FOworCXN0djY4MC0+ZnJhbWVjb3VudCsrOworCXN0djY4MC0+cmVhZGNvdW50Kys7CisJaWYgKHN0djY4MC0+ZnJhbWVbKHN0djY4MC0+Y3VyZnJhbWUgKyAxKSAmIChTVFY2ODBfTlVNRlJBTUVTIC0gMSldLmdyYWJzdGF0ZSA9PSBGUkFNRV9SRUFEWSkgeworCQlzdHY2ODAtPmN1cmZyYW1lID0gKHN0djY4MC0+Y3VyZnJhbWUgKyAxKSAmIChTVFY2ODBfTlVNRlJBTUVTIC0gMSk7CisJfQorCit9CQkJCS8qIGJheWVyX3Vuc2h1ZmZsZSAqLworCisvKioqKioqKiAgZW5kIHJvdXRpbmVzIGZyb20gdGhlIHBlbmNhbSBwcm9ncmFtICAqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc3R2NjgwX25ld2ZyYW1lIChzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwLCBpbnQgZnJhbWVucikKK3sKKwlpbnQgZXJyb3JzID0gMDsKKworCXdoaWxlIChzdHY2ODAtPnN0cmVhbWluZyAmJiAoc3R2NjgwLT5mcmFtZVtmcmFtZW5yXS5ncmFic3RhdGUgPT0gRlJBTUVfUkVBRFkgfHwgc3R2NjgwLT5mcmFtZVtmcmFtZW5yXS5ncmFic3RhdGUgPT0gRlJBTUVfR1JBQkJJTkcpKSB7CisJCWlmICghc3R2NjgwLT5mcmFtZVtmcmFtZW5yXS5jdXJwaXgpIHsKKwkJCWVycm9ycysrOworCQl9CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSAoc3R2NjgwLT53cSwgKHN0djY4MC0+c2NyYXRjaFtzdHY2ODAtPnNjcmF0Y2hfdXNlXS5zdGF0ZSA9PSBCVUZGRVJfUkVBRFkpKTsKKworCQlpZiAoc3R2NjgwLT5udWxscGFja2V0cyA+IFNUVjY4MF9NQVhfTlVMTFBBQ0tFVFMpIHsKKwkJCXN0djY4MC0+bnVsbHBhY2tldHMgPSAwOworCQkJUERFQlVHICgyLCAiU1RWKGkpOiB0b28gbWFueSBudWxsIGxlbmd0aCBwYWNrZXRzLCByZXN0YXJ0aW5nIGNhcHR1cmUiKTsKKwkJCXN0djY4MF9zdG9wX3N0cmVhbSAoc3R2NjgwKTsKKwkJCXN0djY4MF9zdGFydF9zdHJlYW0gKHN0djY4MCk7CisJCX0gZWxzZSB7CisJCQlpZiAoc3R2NjgwLT5zY3JhdGNoW3N0djY4MC0+c2NyYXRjaF91c2VdLnN0YXRlICE9IEJVRkZFUl9SRUFEWSkgeworCQkJCXN0djY4MC0+ZnJhbWVbZnJhbWVucl0uZ3JhYnN0YXRlID0gRlJBTUVfRVJST1I7CisJCQkJUERFQlVHICgyLCAiU1RWKGUpOiBGUkFNRV9FUlJPUiBpbiBfbmV3ZnJhbWUiKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXN0djY4MC0+c2NyYXRjaFtzdHY2ODAtPnNjcmF0Y2hfdXNlXS5zdGF0ZSA9IEJVRkZFUl9CVVNZOworCisJCQliYXllcl91bnNodWZmbGUgKHN0djY4MCwgJnN0djY4MC0+c2NyYXRjaFtzdHY2ODAtPnNjcmF0Y2hfdXNlXSk7CisKKwkJCXN0djY4MC0+c2NyYXRjaFtzdHY2ODAtPnNjcmF0Y2hfdXNlXS5zdGF0ZSA9IEJVRkZFUl9VTlVTRUQ7CisJCQlzdHY2ODAtPnNjcmF0Y2hfdXNlKys7CisJCQlpZiAoc3R2NjgwLT5zY3JhdGNoX3VzZSA+PSBTVFY2ODBfTlVNU0NSQVRDSCkKKwkJCQlzdHY2ODAtPnNjcmF0Y2hfdXNlID0gMDsKKwkJCWlmIChlcnJvcnMgPiBTVFY2ODBfTUFYX0VSUk9SUykgeworCQkJCWVycm9ycyA9IDA7CisJCQkJUERFQlVHICgyLCAiU1RWKGkpOiB0b28gbWFueSBlcnJvcnMsIHJlc3RhcnRpbmcgY2FwdHVyZSIpOworCQkJCXN0djY4MF9zdG9wX3N0cmVhbSAoc3R2NjgwKTsKKwkJCQlzdHY2ODBfc3RhcnRfc3RyZWFtIChzdHY2ODApOworCQkJfQorCQl9CQkvKiBlbHNlICovCisJfQkJCS8qIHdoaWxlICovCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZpZGVvNExpbnV4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHN0dl9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnIgPSAwOworCisJLyogd2UgYXJlIGNhbGxlZCB3aXRoIHRoZSBCS0wgaGVsZCAqLworCXN0djY4MC0+dXNlciA9IDE7CisJZXJyID0gc3R2X2luaXQgKHN0djY4MCk7CS8qIG1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgY2FtZXJhICovCisKKwlpZiAoZXJyID49IDApIHsKKwkJc3R2NjgwLT5mYnVmID0gcnZtYWxsb2MgKHN0djY4MC0+bWF4ZnJhbWVzaXplICogU1RWNjgwX05VTUZSQU1FUyk7CisJCWlmICghc3R2NjgwLT5mYnVmKSB7CisJCQlQREVCVUcgKDAsICJTVFYoZSk6IENvdWxkIG5vdCBydm1hbGxvYyBmcmFtZSBidWZlciIpOworCQkJZXJyID0gLUVOT01FTTsKKwkJfQorCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7CisJfQorCWlmIChlcnIpCisJCXN0djY4MC0+dXNlciA9IDA7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHN0dl9jbG9zZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1GUkFNRVM7IGkrKykKKwkJc3R2NjgwLT5mcmFtZVtpXS5ncmFic3RhdGUgPSBGUkFNRV9VTlVTRUQ7CisJaWYgKHN0djY4MC0+c3RyZWFtaW5nKQorCQlzdHY2ODBfc3RvcF9zdHJlYW0gKHN0djY4MCk7CisKKwlpZiAoKGkgPSBzdHZfc3RvcF92aWRlbyAoc3R2NjgwKSkgPCAwKQorCQlQREVCVUcgKDEsICJTVFYoZSk6IHN0b3BfdmlkZW8gZmFpbGVkIGluIHN0dl9jbG9zZSIpOworCisJcnZmcmVlIChzdHY2ODAtPmZidWYsIHN0djY4MC0+bWF4ZnJhbWVzaXplICogU1RWNjgwX05VTUZSQU1FUyk7CisJc3R2NjgwLT51c2VyID0gMDsKKworCWlmIChzdHY2ODAtPnJlbW92ZWQpIHsKKwkJa2ZyZWUgKHN0djY4MCk7CisJCXN0djY4MCA9IE5VTEw7CisJCVBERUJVRyAoMCwgIlNUVihpKTogZGV2aWNlIHVucmVnaXN0ZXJlZCIpOworCX0KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0djY4MF9kb19pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9zdHYgKnN0djY4MCA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCisJaWYgKCFzdHY2ODAtPnVkZXYpCisJCXJldHVybiAtRUlPOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ0dDQVA6eworCQkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgKmIgPSBhcmc7CisKKwkJCXN0cmNweSAoYi0+bmFtZSwgc3R2NjgwLT5jYW1lcmFfbmFtZSk7CisJCQliLT50eXBlID0gVklEX1RZUEVfQ0FQVFVSRTsKKwkJCWItPmNoYW5uZWxzID0gMTsKKwkJCWItPmF1ZGlvcyA9IDA7CisJCQliLT5tYXh3aWR0aCA9IHN0djY4MC0+bWF4d2lkdGg7CisJCQliLT5tYXhoZWlnaHQgPSBzdHY2ODAtPm1heGhlaWdodDsKKwkJCWItPm1pbndpZHRoID0gc3R2NjgwLT5tYXh3aWR0aCAvIDI7CisJCQliLT5taW5oZWlnaHQgPSBzdHY2ODAtPm1heGhlaWdodCAvIDI7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DR0NIQU46eworCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisKKwkJCWlmICh2LT5jaGFubmVsICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl2LT5mbGFncyA9IDA7CisJCQl2LT50dW5lcnMgPSAwOworCQkJdi0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOworCQkJc3RyY3B5ICh2LT5uYW1lLCAiU1RWIENhbWVyYSIpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ1NDSEFOOnsKKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCQkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBWSURJT0NHUElDVDp7CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCA9IGFyZzsKKworCQkJc3R2NjgwX2dldF9waWN0IChzdHY2ODAsIHApOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ1NQSUNUOnsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCisJCQlpZiAoc3R2NjgwX3NldF9waWN0IChzdHY2ODAsIHApKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ1NXSU46eworCQkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7CisKKwkJCWlmICh2dy0+ZmxhZ3MpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAodnctPmNsaXBjb3VudCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICh2dy0+d2lkdGggIT0gc3R2NjgwLT52d2lkdGgpIHsKKwkJCQlpZiAoc3R2NjgwX3NldF9zaXplIChzdHY2ODAsIHZ3LT53aWR0aCwgdnctPmhlaWdodCkpIHsKKwkJCQkJUERFQlVHICgyLCAiU1RWKGUpOiBmYWlsZWQgKGZyb20gdXNlcikgc2V0IHNpemUgaW4gVklESU9DU1dJTiIpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DR1dJTjp7CisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKKworCQkJdnctPnggPSAwOwkvKiBGSVhNRSAqLworCQkJdnctPnkgPSAwOworCQkJdnctPmNocm9tYWtleSA9IDA7CisJCQl2dy0+ZmxhZ3MgPSAwOworCQkJdnctPmNsaXBjb3VudCA9IDA7CisJCQl2dy0+d2lkdGggPSBzdHY2ODAtPnZ3aWR0aDsKKwkJCXZ3LT5oZWlnaHQgPSBzdHY2ODAtPnZoZWlnaHQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgVklESU9DR01CVUY6eworCQkJc3RydWN0IHZpZGVvX21idWYgKnZtID0gYXJnOworCQkJaW50IGk7CisKKwkJCW1lbXNldCAodm0sIDAsIHNpemVvZiAoKnZtKSk7CisJCQl2bS0+c2l6ZSA9IFNUVjY4MF9OVU1GUkFNRVMgKiBzdHY2ODAtPm1heGZyYW1lc2l6ZTsKKwkJCXZtLT5mcmFtZXMgPSBTVFY2ODBfTlVNRlJBTUVTOworCQkJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1GUkFNRVM7IGkrKykKKwkJCQl2bS0+b2Zmc2V0c1tpXSA9IHN0djY4MC0+bWF4ZnJhbWVzaXplICogaTsKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBWSURJT0NNQ0FQVFVSRTp7CisJCQlzdHJ1Y3QgdmlkZW9fbW1hcCAqdm0gPSBhcmc7CisKKwkJCWlmICh2bS0+Zm9ybWF0ICE9IFNUVl9WSURFT19QQUxFVFRFKSB7CisJCQkJUERFQlVHICgyLCAiU1RWKGkpOiBWSURJT0NNQ0FQVFVSRSB2bS5mb3JtYXQgKCVpKSAhPSBWSURFT19QQUxFVFRFICglaSkiLAorCQkJCQl2bS0+Zm9ybWF0LCBTVFZfVklERU9fUEFMRVRURSk7CisJCQkJaWYgKCh2bS0+Zm9ybWF0ID09IDMpICYmIChzd2FwUkdCX29uID09IDApKSAgeworCQkJCQlQREVCVUcgKDIsICJTVFYoaSk6IFZJRElPQ01DQVBUVVJFIHN3YXBSR0IgaXMgKGF1dG8pIE9OIik7CisJCQkJCS8qIHRoaXMgbWF5IGZpeCB0aG9zZSBhcHBzIChlLmcuLCB4YXd0dikgdGhhdCB3YW50IEJHUiAqLworCQkJCQlzd2FwUkdCID0gMTsKKwkJCQl9CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAodm0tPmZyYW1lID49IFNUVjY4MF9OVU1GUkFNRVMpIHsKKwkJCQlQREVCVUcgKDIsICJTVFYoZSk6IFZJRElPQ01DQVBUVVJFIHZtLmZyYW1lID4gTlVNRlJBTUVTIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAoKHN0djY4MC0+ZnJhbWVbdm0tPmZyYW1lXS5ncmFic3RhdGUgPT0gRlJBTUVfRVJST1IpCisJCQkgICAgfHwgKHN0djY4MC0+ZnJhbWVbdm0tPmZyYW1lXS5ncmFic3RhdGUgPT0gRlJBTUVfR1JBQkJJTkcpKSB7CisJCQkJUERFQlVHICgyLCAiU1RWKGUpOiBWSURJT0NNQ0FQVFVSRSBncmFic3RhdGUgKCVpKSBlcnJvciIsCisJCQkJCXN0djY4MC0+ZnJhbWVbdm0tPmZyYW1lXS5ncmFic3RhdGUpOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQkvKiBJcyB0aGlzIGFjY29yZGluZyB0byB0aGUgdjRsIHNwZWM/Pz8gKi8KKwkJCWlmIChzdHY2ODAtPnZ3aWR0aCAhPSB2bS0+d2lkdGgpIHsKKwkJCQlpZiAoc3R2NjgwX3NldF9zaXplIChzdHY2ODAsIHZtLT53aWR0aCwgdm0tPmhlaWdodCkpIHsKKwkJCQkJUERFQlVHICgyLCAiU1RWKGUpOiBWSURJT0NNQ0FQVFVSRSBzZXRfc2l6ZSBmYWlsZWQiKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQorCQkJc3R2NjgwLT5mcmFtZVt2bS0+ZnJhbWVdLmdyYWJzdGF0ZSA9IEZSQU1FX1JFQURZOworCisJCQlpZiAoIXN0djY4MC0+c3RyZWFtaW5nKQorCQkJCXN0djY4MF9zdGFydF9zdHJlYW0gKHN0djY4MCk7CisKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBWSURJT0NTWU5DOnsKKwkJCWludCAqZnJhbWUgPSBhcmc7CisJCQlpbnQgcmV0ID0gMDsKKworCQkJaWYgKCpmcmFtZSA8IDAgfHwgKmZyYW1lID49IFNUVjY4MF9OVU1GUkFNRVMpIHsKKwkJCQlQREVCVUcgKDIsICJTVFYoZSk6IEJhZCBmcmFtZSAjIGluIFZJRElPQ1NZTkMiKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXJldCA9IHN0djY4MF9uZXdmcmFtZSAoc3R2NjgwLCAqZnJhbWUpOworCQkJc3R2NjgwLT5mcmFtZVsqZnJhbWVdLmdyYWJzdGF0ZSA9IEZSQU1FX1VOVVNFRDsKKwkJCXJldHVybiByZXQ7CisJCX0KKwljYXNlIFZJRElPQ0dGQlVGOnsKKwkJCXN0cnVjdCB2aWRlb19idWZmZXIgKnZiID0gYXJnOworCisJCQltZW1zZXQgKHZiLCAwLCBzaXplb2YgKCp2YikpOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFZJRElPQ0tFWToKKwkJcmV0dXJuIDA7CisJY2FzZSBWSURJT0NDQVBUVVJFOgorCQl7CisJCQlQREVCVUcgKDIsICJTVFYoZSk6IFZJRElPQ0NBUFRVUkUgZmFpbGVkIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWNhc2UgVklESU9DU0ZCVUY6CisJY2FzZSBWSURJT0NHVFVORVI6CisJY2FzZSBWSURJT0NTVFVORVI6CisJY2FzZSBWSURJT0NHRlJFUToKKwljYXNlIFZJRElPQ1NGUkVROgorCWNhc2UgVklESU9DR0FVRElPOgorCWNhc2UgVklESU9DU0FVRElPOgorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0JCQkvKiBlbmQgc3dpdGNoICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHY2ODBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBzdHY2ODBfZG9faW9jdGwpOworfQorCitzdGF0aWMgaW50IHN0djY4MF9tbWFwIChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2Jfc3R2ICpzdHY2ODAgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSAgPSB2bWEtPnZtX2VuZC12bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgcGFnZSwgcG9zOworCisJZG93biAoJnN0djY4MC0+bG9jayk7CisKKwlpZiAoc3R2NjgwLT51ZGV2ID09IE5VTEwpIHsKKwkJdXAgKCZzdHY2ODAtPmxvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHNpemUgPiAoKChTVFY2ODBfTlVNRlJBTUVTICogc3R2NjgwLT5tYXhmcmFtZXNpemUpICsgUEFHRV9TSVpFIC0gMSkKKwkJICAgICYgfihQQUdFX1NJWkUgLSAxKSkpIHsKKwkJdXAgKCZzdHY2ODAtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcG9zID0gKHVuc2lnbmVkIGxvbmcpIHN0djY4MC0+ZmJ1ZjsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkgeworCQkJdXAgKCZzdHY2ODAtPmxvY2spOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJc3RhcnQgKz0gUEFHRV9TSVpFOworCQlwb3MgKz0gUEFHRV9TSVpFOworCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKKwkJCXNpemUgLT0gUEFHRV9TSVpFOworCQllbHNlCisJCQlzaXplID0gMDsKKwl9CisJdXAgKCZzdHY2ODAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0djY4MF9yZWFkIChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGludCByZWFsY291bnQgPSBjb3VudDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGludCBpOworCisJaWYgKFNUVjY4MF9OVU1GUkFNRVMgIT0gMikgeworCQlQREVCVUcgKDAsICJTVFYoZSk6IFNUVjY4MF9OVU1GUkFNRVMgbmVlZHMgdG8gYmUgMiEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc3R2NjgwLT51ZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCWlmIChyZWFsY291bnQgPiAoc3R2NjgwLT52d2lkdGggKiBzdHY2ODAtPnZoZWlnaHQgKiAzKSkKKwkJcmVhbGNvdW50ID0gc3R2NjgwLT52d2lkdGggKiBzdHY2ODAtPnZoZWlnaHQgKiAzOworCisJLyogU2hvdWxkbid0IGhhcHBlbjogKi8KKwlpZiAoc3R2NjgwLT5mcmFtZVswXS5ncmFic3RhdGUgPT0gRlJBTUVfR1JBQkJJTkcpIHsKKwkJUERFQlVHICgyLCAiU1RWKGUpOiBGUkFNRV9HUkFCQklORyBpbiBzdHY2ODBfcmVhZCIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzdHY2ODAtPmZyYW1lWzBdLmdyYWJzdGF0ZSA9IEZSQU1FX1JFQURZOworCXN0djY4MC0+ZnJhbWVbMV0uZ3JhYnN0YXRlID0gRlJBTUVfVU5VU0VEOworCXN0djY4MC0+Y3VyZnJhbWUgPSAwOworCisJaWYgKCFzdHY2ODAtPnN0cmVhbWluZykKKwkJc3R2NjgwX3N0YXJ0X3N0cmVhbSAoc3R2NjgwKTsKKworCWlmICghc3R2NjgwLT5zdHJlYW1pbmcpIHsKKwkJcmV0ID0gc3R2NjgwX25ld2ZyYW1lIChzdHY2ODAsIDApOwkvKiByZXQgc2hvdWxkID0gMCAqLworCX0KKworCXJldCA9IHN0djY4MF9uZXdmcmFtZSAoc3R2NjgwLCAwKTsKKworCWlmICghcmV0KSB7CisJCWlmICgoaSA9IGNvcHlfdG9fdXNlciAoYnVmLCBzdHY2ODAtPmZyYW1lWzBdLmRhdGEsIHJlYWxjb3VudCkpICE9IDApIHsKKwkJCVBERUJVRyAoMiwgIlNUVihlKTogY29weV90b191c2VyIGZyYW1lIDAgZmFpbGVkLCByZXQgY291bnQgPSAlbGkiLCBpKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJcmVhbGNvdW50ID0gcmV0OworCX0KKwlzdHY2ODAtPmZyYW1lWzBdLmdyYWJzdGF0ZSA9IEZSQU1FX1VOVVNFRDsKKwlyZXR1cm4gcmVhbGNvdW50OworfQkJCQkvKiBzdHY2ODBfcmVhZCAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdHY2ODBfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQlzdHZfb3BlbiwKKwkucmVsZWFzZSA9ICAgICAJc3R2X2Nsb3NlLAorCS5yZWFkID0JCXN0djY4MF9yZWFkLAorCS5tbWFwID0JCXN0djY4MF9tbWFwLAorCS5pb2N0bCA9ICAgICAgICBzdHY2ODBfaW9jdGwsCisJLmxsc2VlayA9ICAgICAgIG5vX2xsc2VlaywKK307CitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzdHY2ODBfdGVtcGxhdGUgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJIlNUVjA2ODAgVVNCIGNhbWVyYSIsCisJLnR5cGUgPQkJVklEX1RZUEVfQ0FQVFVSRSwKKwkuaGFyZHdhcmUgPQlWSURfSEFSRFdBUkVfU0U0MDEsCisJLmZvcHMgPSAgICAgICAgICZzdHY2ODBfZm9wcywKKwkucmVsZWFzZSA9CXZpZGVvX2RldmljZV9yZWxlYXNlLAorCS5taW5vciA9IAktMSwKK307CisKK3N0YXRpYyBpbnQgc3R2NjgwX3Byb2JlIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX3N0diAqc3R2NjgwID0gTlVMTDsKKwljaGFyICpjYW1lcmFfbmFtZSA9IE5VTEw7CisJaW50IHJldHZhbCA9IDA7CisKKwkvKiBXZSBkb24ndCBoYW5kbGUgbXVsdGktY29uZmlnIGNhbWVyYXMgKi8KKwlpZiAoZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyAhPSAxKSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogTnVtYmVyIG9mIENvbmZpZ3VyYXRpb25zICE9IDEiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW50ZXJmYWNlID0gJmludGYtPmFsdHNldHRpbmdbMF07CisJLyogSXMgaXQgYSBTVFY2ODA/ICovCisJaWYgKChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpID09IFVTQl9QRU5DQU1fVkVORE9SX0lEKSAmJgorCSAgICAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gVVNCX1BFTkNBTV9QUk9EVUNUX0lEKSkgeworCQljYW1lcmFfbmFtZSA9ICJTVFYwNjgwIjsKKwkJUERFQlVHICgwLCAiU1RWKGkpOiBTVFYwNjgwIGNhbWVyYSBmb3VuZC4iKTsKKwl9IGVsc2UgeworCQlQREVCVUcgKDAsICJTVFYoZSk6IFZlbmRvci9Qcm9kdWN0IElEIGRvIG5vdCBtYXRjaCBTVFYwNjgwIHZhbHVlcy4iKTsKKwkJUERFQlVHICgwLCAiU1RWKGUpOiBDaGVjayB0aGF0IHRoZSBTVFYwNjgwIGNhbWVyYSBpcyBjb25uZWN0ZWQgdG8gdGhlIGNvbXB1dGVyLiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBXZSBmb3VuZCBvbmUgKi8KKwlpZiAoKHN0djY4MCA9IGttYWxsb2MgKHNpemVvZiAoKnN0djY4MCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogY291bGRuJ3Qga21hbGxvYyBzdHY2ODAgc3RydWN0LiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCW1lbXNldCAoc3R2NjgwLCAwLCBzaXplb2YgKCpzdHY2ODApKTsKKworCXN0djY4MC0+dWRldiA9IGRldjsKKwlzdHY2ODAtPmNhbWVyYV9uYW1lID0gY2FtZXJhX25hbWU7CisKKwlzdHY2ODAtPnZkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoIXN0djY4MC0+dmRldikgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKwltZW1jcHkoc3R2NjgwLT52ZGV2LCAmc3R2NjgwX3RlbXBsYXRlLCBzaXplb2Yoc3R2NjgwX3RlbXBsYXRlKSk7CisJc3R2NjgwLT52ZGV2LT5kZXYgPSAmaW50Zi0+ZGV2OworCXZpZGVvX3NldF9kcnZkYXRhKHN0djY4MC0+dmRldiwgc3R2NjgwKTsKKworCW1lbWNweSAoc3R2NjgwLT52ZGV2LT5uYW1lLCBzdHY2ODAtPmNhbWVyYV9uYW1lLCBzdHJsZW4gKHN0djY4MC0+Y2FtZXJhX25hbWUpKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkICgmc3R2NjgwLT53cSk7CisJaW5pdF9NVVRFWCAoJnN0djY4MC0+bG9jayk7CisJd21iICgpOworCisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSAoc3R2NjgwLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucikgPT0gLTEpIHsKKwkJUERFQlVHICgwLCAiU1RWKGUpOiB2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkIik7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZXJyb3JfdmRldjsKKwl9CisJUERFQlVHICgwLCAiU1RWKGkpOiByZWdpc3RlcmVkIG5ldyB2aWRlbyBkZXZpY2U6IHZpZGVvJWQiLCBzdHY2ODAtPnZkZXYtPm1pbm9yKTsKKworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIHN0djY4MCk7CisJc3R2NjgwX2NyZWF0ZV9zeXNmc19maWxlcyhzdHY2ODAtPnZkZXYpOworCXJldHVybiAwOworCitlcnJvcl92ZGV2OgorCXZpZGVvX2RldmljZV9yZWxlYXNlKHN0djY4MC0+dmRldik7CitlcnJvcjoKKwlrZnJlZShzdHY2ODApOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2Jfc3R2NjgwX3JlbW92ZV9kaXNjb25uZWN0ZWQgKHN0cnVjdCB1c2Jfc3R2ICpzdHY2ODApCit7CisJaW50IGk7CisKKwlzdHY2ODAtPnVkZXYgPSBOVUxMOworCXN0djY4MC0+ZnJhbWVbMF0uZ3JhYnN0YXRlID0gRlJBTUVfRVJST1I7CisJc3R2NjgwLT5mcmFtZVsxXS5ncmFic3RhdGUgPSBGUkFNRV9FUlJPUjsKKwlzdHY2ODAtPnN0cmVhbWluZyA9IDA7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZzdHY2ODAtPndxKTsKKworCWZvciAoaSA9IDA7IGkgPCBTVFY2ODBfTlVNU0JVRjsgaSsrKQorCQlpZiAoc3R2NjgwLT51cmJbaV0pIHsKKwkJCXVzYl9raWxsX3VyYiAoc3R2NjgwLT51cmJbaV0pOworCQkJdXNiX2ZyZWVfdXJiIChzdHY2ODAtPnVyYltpXSk7CisJCQlzdHY2ODAtPnVyYltpXSA9IE5VTEw7CisJCQlrZnJlZSAoc3R2NjgwLT5zYnVmW2ldLmRhdGEpOworCQl9CisJZm9yIChpID0gMDsgaSA8IFNUVjY4MF9OVU1TQ1JBVENIOyBpKyspCisJCWtmcmVlIChzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSk7CisJUERFQlVHICgwLCAiU1RWKGkpOiAlcyBkaXNjb25uZWN0ZWQiLCBzdHY2ODAtPmNhbWVyYV9uYW1lKTsKKworCS8qIEZyZWUgdGhlIG1lbW9yeSAqLworCWtmcmVlIChzdHY2ODApOworfQorCitzdGF0aWMgdm9pZCBzdHY2ODBfZGlzY29ubmVjdCAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9zdHYgKnN0djY4MCA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOworCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CisKKwlpZiAoc3R2NjgwKSB7CisJCS8qIFdlIGRvbid0IHdhbnQgcGVvcGxlIHRyeWluZyB0byBvcGVuIHVwIHRoZSBkZXZpY2UgKi8KKwkJaWYgKHN0djY4MC0+dmRldikgeworCQkJc3R2NjgwX3JlbW92ZV9zeXNmc19maWxlcyhzdHY2ODAtPnZkZXYpOworCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3R2NjgwLT52ZGV2KTsKKwkJCXN0djY4MC0+dmRldiA9IE5VTEw7CisJCX0KKwkJaWYgKCFzdHY2ODAtPnVzZXIpIHsKKwkJCXVzYl9zdHY2ODBfcmVtb3ZlX2Rpc2Nvbm5lY3RlZCAoc3R2NjgwKTsKKwkJfSBlbHNlIHsKKwkJCXN0djY4MC0+cmVtb3ZlZCA9IDE7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzdHY2ODBfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJzdHY2ODAiLAorCS5wcm9iZSA9CXN0djY4MF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXN0djY4MF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWRldmljZV90YWJsZQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTW9kdWxlIHJvdXRpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19pbml0IHVzYl9zdHY2ODBfaW5pdCAodm9pZCkKK3sKKwlpZiAodXNiX3JlZ2lzdGVyICgmc3R2NjgwX2RyaXZlcikgPCAwKSB7CisJCVBERUJVRyAoMCwgIlNUVihlKTogQ291bGQgbm90IHNldHVwIFNUVjA2ODAgZHJpdmVyIik7CisJCXJldHVybiAtMTsKKwl9CisJUERFQlVHICgwLCAiU1RWKGkpOiB1c2IgY2FtZXJhIGRyaXZlciB2ZXJzaW9uICVzIHJlZ2lzdGVyaW5nIiwgRFJJVkVSX1ZFUlNJT04pOworCisJaW5mbyhEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX3N0djY4MF9leGl0ICh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyICgmc3R2NjgwX2RyaXZlcik7CisJUERFQlVHICgwLCAiU1RWKGkpOiBkcml2ZXIgZGVyZWdpc3RlcmVkIik7Cit9CisKK21vZHVsZV9pbml0ICh1c2Jfc3R2NjgwX2luaXQpOworbW9kdWxlX2V4aXQgKHVzYl9zdHY2ODBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3N0djY4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMGUzMTRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZpbGVuYW1lOiBzdHY2ODAuaAorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICBUaGlzIGlzIGEgVVNCIGRyaXZlciBmb3IgU1RWMDY4MCBiYXNlZCB1c2IgdmlkZW8gY2FtZXJhcy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHNpemUgb2YgdXNiIHRyYW5zZmVycyAqLworI2RlZmluZSBTVFY2ODBfUEFDS0VUU0laRQk0MDk2CisKKy8qIG51bWJlciBvZiBxdWV1ZWQgYnVsayB0cmFuc2ZlcnMgdG8gdXNlLCBtYXkgaGF2ZSBwcm9ibGVtcyBpZiA+IDEgKi8KKyNkZWZpbmUgU1RWNjgwX05VTVNCVUYJCTEKKworLyogbnVtYmVyIG9mIGZyYW1lcyBzdXBwb3J0ZWQgYnkgdGhlIHY0bCBwYXJ0ICovCisjZGVmaW5lIFNUVjY4MF9OVU1GUkFNRVMJMgorCisvKiBzY3JhdGNoIGJ1ZmZlcnMgZm9yIHBhc3NpbmcgZGF0YSB0byB0aGUgZGVjb2RlcnM6IDIgb3IgNCBhcmUgZ29vZCAqLworI2RlZmluZSBTVFY2ODBfTlVNU0NSQVRDSAkyCisKKy8qIG51bWJlciBvZiBudWwgc2l6ZWQgcGFja2V0cyB0byByZWNlaXZlIGJlZm9yZSBraWNraW5nIHRoZSBjYW1lcmEgKi8KKyNkZWZpbmUgU1RWNjgwX01BWF9OVUxMUEFDS0VUUwkyMDAKKworLyogbnVtYmVyIG9mIGRlY29kaW5nIGVycm9ycyBiZWZvcmUga2lja2luZyB0aGUgY2FtZXJhICovCisjZGVmaW5lIFNUVjY4MF9NQVhfRVJST1JTCTEwMAorCisjZGVmaW5lIFVTQl9QRU5DQU1fVkVORE9SX0lECTB4MDU1MworI2RlZmluZSBVU0JfUEVOQ0FNX1BST0RVQ1RfSUQJMHgwMjAyCisjZGVmaW5lIFBFTkNBTV9USU1FT1VUICAgICAgICAgIDEwMDAKKy8qIGZtdCA0ICovCisjZGVmaW5lIFNUVl9WSURFT19QQUxFVFRFICAgICAgIFZJREVPX1BBTEVUVEVfUkdCMjQKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0geworCXtVU0JfREVWSUNFIChVU0JfUEVOQ0FNX1ZFTkRPUl9JRCwgVVNCX1BFTkNBTV9QUk9EVUNUX0lEKX0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGRldmljZV90YWJsZSk7CisKK3N0cnVjdCBzdHY2ODBfc2J1ZiB7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKK307CisKK2VudW0geworCUZSQU1FX1VOVVNFRCwJCS8qIFVudXNlZCAobm8gTUNBUFRVUkUpICovCisJRlJBTUVfUkVBRFksCQkvKiBSZWFkeSB0byBzdGFydCBncmFiYmluZyAqLworCUZSQU1FX0dSQUJCSU5HLAkJLyogSW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZ3JhYmJlZCBpbnRvICovCisJRlJBTUVfRE9ORSwJCS8qIEZpbmlzaGVkIGdyYWJiaW5nLCBidXQgbm90IGJlZW4gc3luY2VkIHlldCAqLworCUZSQU1FX0VSUk9SLAkJLyogU29tZXRoaW5nIGJhZCBoYXBwZW5lZCB3aGlsZSBwcm9jZXNzaW5nICovCit9OworCitlbnVtIHsKKwlCVUZGRVJfVU5VU0VELAorCUJVRkZFUl9SRUFEWSwKKwlCVUZGRVJfQlVTWSwKKwlCVUZGRVJfRE9ORSwKK307CisKKy8qIHJhdyBjYW1lcmEgZGF0YSA8LSBzYnVmICh1cmIgdHJhbnNmZXIgYnVmKSAqLworc3RydWN0IHN0djY4MF9zY3JhdGNoIHsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXZvbGF0aWxlIGludCBzdGF0ZTsKKwlpbnQgb2Zmc2V0OworCWludCBsZW5ndGg7Cit9OworCisvKiBwcm9jZXNzZWQgZGF0YSBmb3IgZGlzcGxheSBlbmRzIHVwIGhlcmUsIGFmdGVyIGJheWVyICovCitzdHJ1Y3Qgc3R2NjgwX2ZyYW1lIHsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiBGcmFtZSBidWZmZXIgKi8KKwl2b2xhdGlsZSBpbnQgZ3JhYnN0YXRlOwkvKiBTdGF0ZSBvZiBncmFiYmluZyAqLworCXVuc2lnbmVkIGNoYXIgKmN1cmxpbmU7CisJaW50IGN1cmxpbmVwaXg7CisJaW50IGN1cnBpeDsKK307CisKKy8qIHRoaXMgaXMgYWxtb3N0IHRoZSB2aWRlbyBzdHJ1Y3R1cmUgdXZkX3QsIHdpdGggZXh0cmEgcGFyYW1ldGVycyBmb3Igc3R2ICovCitzdHJ1Y3QgdXNiX3N0diB7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKKworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCisJdW5zaWduZWQgY2hhciBidWxrX2luX2VuZHBvaW50QWRkcjsJLyogX191OCAgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1bGsgaW4gZW5kcG9pbnQgKi8KKwljaGFyICpjYW1lcmFfbmFtZTsKKworCXVuc2lnbmVkIGludCBWaWRlb01vZGU7CS8qIDB4MDEwMCA9IFZHQSwgMHgwMDAwID0gQ0lGLCAweDAzMDAgPSBRVkdBICovCisJaW50IFN1cHBvcnRlZE1vZGVzOworCWludCBDSUY7CisJaW50IFZHQTsKKwlpbnQgUVZHQTsKKwlpbnQgY3dpZHRoOwkJLyogY2FtZXJhIHdpZHRoICovCisJaW50IGNoZWlnaHQ7CQkvKiBjYW1lcmEgaGVpZ2h0ICovCisJaW50IG1heHdpZHRoOwkJLyogbWF4IHZpZGVvIHdpZHRoICovCisJaW50IG1heGhlaWdodDsJCS8qIG1heCB2aWRlbyBoZWlnaHQgKi8KKwlpbnQgdndpZHRoOwkJLyogY3VycmVudCB3aWR0aCBmb3IgdmlkZW8gd2luZG93ICovCisJaW50IHZoZWlnaHQ7CQkvKiBjdXJyZW50IGhlaWdodCBmb3IgdmlkZW8gd2luZG93ICovCisJdW5zaWduZWQgbG9uZyBpbnQgcmF3YnVmc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGludCBtYXhmcmFtZXNpemU7CS8qIHJhd2J1ZnNpemUgKiAzIGZvciBSR0IgKi8KKworCWludCBvcmlnR2FpbjsKKwlpbnQgb3JpZ01vZGU7CQkvKiBvcmlnaW5hbCBjYW1lcmEgbW9kZSAqLworCisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOwkvKiB0byBsb2NrIHRoZSBzdHJ1Y3R1cmUgKi8KKwlpbnQgdXNlcjsJCS8qIHVzZXIgY291bnQgZm9yIGV4Y2x1c2l2ZSB1c2UgKi8KKwlpbnQgcmVtb3ZlZDsJCS8qIGRldmljZSBkaXNjb25uZWN0ZWQgKi8KKwlpbnQgc3RyZWFtaW5nOwkJLyogQXJlIHdlIHN0cmVhbWluZyB2aWRlbz8gKi8KKwljaGFyICpmYnVmOwkJLyogVmlkZW9kZXYgYnVmZmVyIGFyZWEgKi8KKwlzdHJ1Y3QgdXJiICp1cmJbU1RWNjgwX05VTVNCVUZdOwkvKiAjIG9mIHF1ZXVlZCBidWxrIHRyYW5zZmVycyAqLworCWludCBjdXJmcmFtZTsJCS8qIEN1cnJlbnQgcmVjZWl2aW5nIGZyYW1lICovCisJc3RydWN0IHN0djY4MF9mcmFtZSBmcmFtZVtTVFY2ODBfTlVNRlJBTUVTXTsJLyogIyBmcmFtZXMgc3VwcG9ydGVkIGJ5IHY0bCBwYXJ0ICovCisJaW50IHJlYWRjb3VudDsKKwlpbnQgZnJhbWVjb3VudDsKKwlpbnQgZXJyb3I7CisJaW50IGRyb3BwZWQ7CisJaW50IHNjcmF0Y2hfbmV4dDsKKwlpbnQgc2NyYXRjaF91c2U7CisJaW50IHNjcmF0Y2hfb3ZlcmZsb3c7CisJc3RydWN0IHN0djY4MF9zY3JhdGNoIHNjcmF0Y2hbU1RWNjgwX05VTVNDUkFUQ0hdOwkvKiBmb3IgZGVjb2RlcnMgKi8KKwlzdHJ1Y3Qgc3R2NjgwX3NidWYgc2J1ZltTVFY2ODBfTlVNU0JVRl07CisKKwl1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzczsKKwl1bnNpZ25lZCBpbnQgY2hnYnJpZ2h0OworCXVuc2lnbmVkIGludCB3aGl0ZW5lc3M7CisJdW5zaWduZWQgaW50IGNvbG91cjsKKwl1bnNpZ25lZCBpbnQgY29udHJhc3Q7CisJdW5zaWduZWQgaW50IGh1ZTsKKwl1bnNpZ25lZCBpbnQgcGFsZXR0ZTsKKwl1bnNpZ25lZCBpbnQgZGVwdGg7CS8qIHJnYjI0IGluIGJpdHMgKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdxOwkvKiBQcm9jZXNzZXMgd2FpdGluZyAqLworCisJaW50IG51bGxwYWNrZXRzOworfTsKKworCitzdGF0aWMgdW5zaWduZWQgY2hhciByZWRbMjU2XSA9IHsgCisJMCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAKKwkxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMjUsIDMwLCAzNSwgMzgsIDQyLCAKKwk0NCwgNDcsIDUwLCA1MywgNTQsIDU3LCA1OSwgNjEsIDYzLCA2NSwgNjcsIDY5LCAKKwk3MSwgNzEsIDczLCA3NSwgNzcsIDc4LCA4MCwgODEsIDgyLCA4NCwgODUsIDg3LCAKKwk4OCwgODksIDkwLCA5MSwgOTMsIDk0LCA5NSwgOTcsIDk4LCA5OCwgOTksIDEwMSwgCisJMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgCisJMTE0LCAxMTUsIDExNiwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgCisJMTI1LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgCisJMTM0LCAxMzUsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MCwgMTQxLCAxNDIsIDE0MywgCisJMTQzLCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTAsIDE1MSwgCisJMTUyLCAxNTIsIDE1MiwgMTUzLCAxNTQsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU3LCAxNTgsIDE1OSwgCisJMTU5LCAxNjAsIDE2MSwgMTYxLCAxNjEsIDE2MiwgMTYzLCAxNjMsIDE2NCwgMTY1LCAxNjUsIDE2NiwgCisJMTY3LCAxNjcsIDE2OCwgMTY4LCAxNjksIDE3MCwgMTcwLCAxNzAsIDE3MSwgMTcxLCAxNzIsIDE3MywgCisJMTczLCAxNzQsIDE3NCwgMTc1LCAxNzYsIDE3NiwgMTc3LCAxNzgsIDE3OCwgMTc5LCAxNzksIDE3OSwgCisJMTgwLCAxODAsIDE4MSwgMTgxLCAxODIsIDE4MywgMTgzLCAxODQsIDE4NCwgMTg1LCAxODUsIDE4NiwgCisJMTg3LCAxODcsIDE4OCwgMTg4LCAxODgsIDE4OCwgMTg5LCAxOTAsIDE5MCwgMTkxLCAxOTEsIDE5MiwgCisJMTkyLCAxOTMsIDE5MywgMTk0LCAxOTUsIDE5NSwgMTk2LCAxOTYsIDE5NywgMTk3LCAxOTcsIDE5NywgCisJMTk4LCAxOTgsIDE5OSwgMTk5LCAyMDAsIDIwMSwgMjAxLCAyMDIsIDIwMiwgMjAzLCAyMDMsIDIwNCwgCisJMjA0LCAyMDUsIDIwNSwgMjA2LCAyMDYsIDIwNiwgMjA2LCAyMDcsIDIwNywgMjA4LCAyMDgsIDIwOSwgCisJMjA5LCAyMTAsIDIxMCwgMjExLCAyMTEsIDIxMiwgMjEyLCAyMTMsIDIxMywgMjE0LCAyMTQsIDIxNSwgCisJMjE1LCAyMTUsIDIxNSwgMjE2LCAyMTYsIDIxNywgMjE3LCAyMTgsIDIxOCwgMjE4LCAyMTksIDIxOSwgCisJMjIwLCAyMjAsIDIyMSwgMjIxIAorfTsgCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdyZWVuWzI1Nl0gPSB7CisJMCwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAKKwkyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjgsIDM0LCAzOSwgNDMsIDQ3LCAKKwk1MCwgNTMsIDU2LCA1OSwgNjEsIDY0LCA2NiwgNjgsIDcxLCA3MywgNzUsIDc3LCAKKwk3OSwgODAsIDgyLCA4NCwgODYsIDg3LCA4OSwgOTEsIDkyLCA5NCwgOTUsIDk3LCAKKwk5OCwgMTAwLCAxMDEsIDEwMiwgMTA0LCAxMDUsIDEwNiwgMTA4LCAxMDksIDExMCwgMTExLCAxMTMsIAorCTExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIAorCTEyNywgMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIAorCTEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLCAxNDQsIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIAorCTE1MCwgMTUxLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTYsIDE1NywgMTU4LCAxNTksIAorCTE2MCwgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY3LCAxNjgsIAorCTE2OSwgMTcwLCAxNzAsIDE3MSwgMTcyLCAxNzIsIDE3MywgMTc0LCAxNzUsIDE3NSwgMTc2LCAxNzcsIAorCTE3NywgMTc4LCAxNzksIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgyLCAxODMsIDE4NCwgMTg0LCAxODUsIAorCTE4NiwgMTg2LCAxODcsIDE4NywgMTg4LCAxODksIDE4OSwgMTkwLCAxOTEsIDE5MSwgMTkyLCAxOTMsIAorCTE5MywgMTk0LCAxOTQsIDE5NSwgMTk2LCAxOTYsIDE5NywgMTk4LCAxOTgsIDE5OSwgMTk5LCAyMDAsIAorCTIwMSwgMjAxLCAyMDIsIDIwMiwgMjAzLCAyMDQsIDIwNCwgMjA1LCAyMDUsIDIwNiwgMjA2LCAyMDcsIAorCTIwOCwgMjA4LCAyMDksIDIwOSwgMjEwLCAyMTAsIDIxMSwgMjEyLCAyMTIsIDIxMywgMjEzLCAyMTQsIAorCTIxNCwgMjE1LCAyMTUsIDIxNiwgMjE3LCAyMTcsIDIxOCwgMjE4LCAyMTksIDIxOSwgMjIwLCAyMjAsIAorCTIyMSwgMjIxLCAyMjIsIDIyMiwgMjIzLCAyMjQsIDIyNCwgMjI1LCAyMjUsIDIyNiwgMjI2LCAyMjcsIAorCTIyNywgMjI4LCAyMjgsIDIyOSwgMjI5LCAyMzAsIDIzMCwgMjMxLCAyMzEsIDIzMiwgMjMyLCAyMzMsIAorCTIzMywgMjM0LCAyMzQsIDIzNSwgMjM1LCAyMzYsIDIzNiwgMjM3LCAyMzcsIDIzOCwgMjM4LCAyMzksIAorCTIzOSwgMjQwLCAyNDAsIDI0MSwgMjQxLCAyNDIsIDI0MiwgMjQzLCAyNDMsIDI0MywgMjQ0LCAyNDQsIAorCTI0NSwgMjQ1LCAyNDYsIDI0NiAKK307IAorCitzdGF0aWMgdW5zaWduZWQgY2hhciBibHVlWzI1Nl0gPSB7CisJMCwgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAKKwkyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMzAsIDM3LCA0MiwgNDcsIDUxLCAKKwk1NSwgNTgsIDYxLCA2NCwgNjcsIDcwLCA3MiwgNzQsIDc4LCA4MCwgODIsIDg0LCAKKwk4NiwgODgsIDkwLCA5MiwgOTQsIDk1LCA5NywgMTAwLCAxMDEsIDEwMywgMTA0LCAxMDYsIAorCTEwNywgMTEwLCAxMTEsIDExMiwgMTE0LCAxMTUsIDExNiwgMTE4LCAxMTksIDEyMSwgMTIyLCAxMjQsIAorCTEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIAorCTEzOSwgMTQwLCAxNDEsIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIAorCTE1MiwgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OCwgMTU5LCAxNjAsIDE2MSwgMTYyLCAxNjMsIAorCTE2NSwgMTY2LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzEsIDE3MiwgMTczLCAxNzQsIAorCTE3NiwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MCwgMTgxLCAxODIsIDE4MywgMTgzLCAxODQsIAorCTE4NSwgMTg3LCAxODcsIDE4OCwgMTg5LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MiwgMTkzLCAxOTQsIAorCTE5NCwgMTk1LCAxOTYsIDE5NiwgMTk4LCAxOTksIDIwMCwgMjAwLCAyMDEsIDIwMiwgMjAyLCAyMDMsIAorCTIwNCwgMjA0LCAyMDUsIDIwNSwgMjA2LCAyMDcsIDIwNywgMjA5LCAyMTAsIDIxMCwgMjExLCAyMTIsIAorCTIxMiwgMjEzLCAyMTMsIDIxNCwgMjE1LCAyMTUsIDIxNiwgMjE3LCAyMTcsIDIxOCwgMjE4LCAyMjAsIAorCTIyMSwgMjIxLCAyMjIsIDIyMiwgMjIzLCAyMjQsIDIyNCwgMjI1LCAyMjUsIDIyNiwgMjI2LCAyMjcsIAorCTIyOCwgMjI4LCAyMjksIDIyOSwgMjMxLCAyMzEsIDIzMiwgMjMzLCAyMzMsIDIzNCwgMjM0LCAyMzUsIAorCTIzNSwgMjM2LCAyMzYsIDIzNywgMjM4LCAyMzgsIDIzOSwgMjM5LCAyNDAsIDI0MCwgMjQyLCAyNDIsIAorCTI0MywgMjQzLCAyNDQsIDI0NCwgMjQ1LCAyNDYsIDI0NiwgMjQ3LCAyNDcsIDI0OCwgMjQ4LCAyNDksIAorCTI0OSwgMjUwLCAyNTAsIDI1MSwgMjUxLCAyNTMsIDI1MywgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIAorCTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIAorCTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIAorCTI1NSwgMjU1LCAyNTUsIDI1NSAKK307IApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvdWx0cmFjYW0uYyBiL2RyaXZlcnMvdXNiL21lZGlhL3VsdHJhY2FtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmZjc1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3VsdHJhY2FtLmMKQEAgLTAsMCArMSw2NzkgQEAKKy8qCisgKiBVU0IgTkIgQ2FtZXJhIGRyaXZlcgorICoKKyAqIEhJU1RPUlk6CisgKiAyNS1EZWMtMjAwMiBEbWl0cmkgICAgICBSZW1vdmVkIGxpZ2h0aW5nLCBzaGFycG5lc3MgcGFyYW1ldGVycywgbWV0aG9kcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlICJ1c2J2aWRlby5oIgorCisjZGVmaW5lCVVMVFJBQ0FNX1ZFTkRPUl9JRAkweDA0NjEKKyNkZWZpbmUJVUxUUkFDQU1fUFJPRFVDVF9JRAkweDA4MTMKKworI2RlZmluZSBNQVhfQ0FNRVJBUwkJNAkvKiBIb3cgbWFueSBkZXZpY2VzIHdlIGFsbG93IHRvIGNvbm5lY3QgKi8KKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGxpdmVzIGluIHV2ZF90LT51c2VyIGZpZWxkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGluaXRpYWxpemVkOwkvKiBIYWQgd2UgYWxyZWFkeSBzZW50IGluaXQgc2VxdWVuY2U/ICovCisJaW50IGNhbWVyYV9tb2RlbDsJLyogV2hhdCB0eXBlIG9mIElCTSBjYW1lcmEgd2UgZ290PyAqLworICAgICAgICBpbnQgaGFzX2hkcjsKK30gdWx0cmFjYW1fdDsKKyNkZWZpbmUJVUxUUkFDQU1fVCh1dmQpCSgodWx0cmFjYW1fdCAqKSgodXZkKS0+dXNlcl9kYXRhKSkKKworc3RhdGljIHN0cnVjdCB1c2J2aWRlbyAqY2FtcyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworCitzdGF0aWMgaW50IGZsYWdzID0gMDsgLyogRkxBR1NfRElTUExBWV9ISU5UUyB8IEZMQUdTX09WRVJMQVlfU1RBVFM7ICovCisKK3N0YXRpYyBjb25zdCBpbnQgbWluX2NhbnZhc1dpZHRoICA9IDg7CitzdGF0aWMgY29uc3QgaW50IG1pbl9jYW52YXNIZWlnaHQgPSA0OworCisjZGVmaW5lIEZSQU1FUkFURV9NSU4JMAorI2RlZmluZSBGUkFNRVJBVEVfTUFYCTYKK3N0YXRpYyBpbnQgZnJhbWVyYXRlID0gLTE7CisKKy8qCisgKiBIZXJlIHdlIGRlZmluZSBzZXZlcmFsIGluaXRpYWxpemF0aW9uIHZhcmlhYmxlcy4gVGhleSBtYXkKKyAqIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBzZXQgY29sb3IsIGh1ZSwgYnJpZ2h0bmVzcyBhbmQKKyAqIGNvbnRyYXN0IHRvIGRlc2lyZWQgdmFsdWVzLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4KKyAqIGNhc2Ugb2Ygd2ViY2FtcyAod2hpY2ggaGF2ZSBubyBjb250cm9scyBhbmQgbm8gb24tc2NyZWVuCisgKiBvdXRwdXQpIGFuZCBhbHNvIHdoZW4gYSBjbGllbnQgVjRMIHNvZnR3YXJlIGlzIHVzZWQgdGhhdAorICogZG9lcyBub3QgaGF2ZSBzb21lIG9mIHRob3NlIGNvbnRyb2xzLiBJbiBhbnkgY2FzZSBpdCdzCisgKiBnb29kIHRvIGhhdmUgc3RhcnR1cCB2YWx1ZXMgYXMgb3B0aW9ucy4KKyAqCisgKiBUaGVzZSB2YWx1ZXMgYXJlIGFsbCBpbiBbMC4uMjU1XSByYW5nZS4gVGhpcyBzaW1wbGlmaWVzCisgKiBvcGVyYXRpb24uIE5vdGUgdGhhdCBhY3R1YWwgdmFsdWVzIG9mIFY0TCB2YXJpYWJsZXMgbWF5CisgKiBiZSBzY2FsZWQgdXAgKGFzIG11Y2ggYXMgPDwgOCkuIFVzZXIgY2FuIHNlZSB0aGF0IG9ubHkKKyAqIG9uIG92ZXJsYXkgb3V0cHV0LCBob3dldmVyLCBvciB0aHJvdWdoIGEgVjRMIGNsaWVudC4KKyAqLworc3RhdGljIGludCBpbml0X2JyaWdodG5lc3MgPSAxMjg7CitzdGF0aWMgaW50IGluaXRfY29udHJhc3QgPSAxOTI7CitzdGF0aWMgaW50IGluaXRfY29sb3IgPSAxMjg7CitzdGF0aWMgaW50IGluaXRfaHVlID0gMTI4Oworc3RhdGljIGludCBodWVfY29ycmVjdGlvbiA9IDEyODsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbDogMC05IChkZWZhdWx0PTApIik7Cittb2R1bGVfcGFyYW0oZmxhZ3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZsYWdzLAorCQkiQml0ZmllbGQ6IDA9VklESU9DU1lOQywgIgorCQkiMT1CL1csICIKKwkJIjI9c2hvdyBoaW50cywgIgorCQkiMz1zaG93IHN0YXRzLCAiCisJCSI0PXRlc3QgcGF0dGVybiwgIgorCQkiNT1zZXBhcmF0ZSBmcmFtZXMsICIKKwkJIjY9Y2xlYW4gZnJhbWVzIik7Cittb2R1bGVfcGFyYW0oZnJhbWVyYXRlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmcmFtZXJhdGUsICJGcmFtZXJhdGUgc2V0dGluZzogMD1zbG93ZXN0LCA2PWZhc3Rlc3QgKGRlZmF1bHQ9MikiKTsKKworbW9kdWxlX3BhcmFtKGluaXRfYnJpZ2h0bmVzcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW5pdF9icmlnaHRuZXNzLCAiQnJpZ2h0bmVzcyBwcmVjb25maWd1cmF0aW9uOiAwLTI1NSAoZGVmYXVsdD0xMjgpIik7Cittb2R1bGVfcGFyYW0oaW5pdF9jb250cmFzdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW5pdF9jb250cmFzdCwgIkNvbnRyYXN0IHByZWNvbmZpZ3VyYXRpb246IDAtMjU1IChkZWZhdWx0PTE5MikiKTsKK21vZHVsZV9wYXJhbShpbml0X2NvbG9yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0X2NvbG9yLCAiQ29sb3IgcHJlY29uZmlndXJhdGlvbjogMC0yNTUgKGRlZmF1bHQ9MTI4KSIpOworbW9kdWxlX3BhcmFtKGluaXRfaHVlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0X2h1ZSwgIkh1ZSBwcmVjb25maWd1cmF0aW9uOiAwLTI1NSAoZGVmYXVsdD0xMjgpIik7Cittb2R1bGVfcGFyYW0oaHVlX2NvcnJlY3Rpb24sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGh1ZV9jb3JyZWN0aW9uLCAiWVVWIGNvbG9yc3BhY2UgcmVndWxhdGlvbjogMC0yNTUgKGRlZmF1bHQ9MTI4KSIpOworCisvKgorICogdWx0cmFjYW1fUHJvY2Vzc0lzb2NEYXRhKCkKKyAqCisgKiBHZW5lcmljIHJvdXRpbmUgdG8gcGFyc2UgdGhlIHJpbmcgcXVldWUgZGF0YS4gSXQgZW1wbG95cyBlaXRoZXIKKyAqIHVsdHJhY2FtX2ZpbmRfaGVhZGVyKCkgb3IgdWx0cmFjYW1fcGFyc2VfbGluZXMoKSB0byBkbyBtb3N0CisgKiBvZiB3b3JrLgorICoKKyAqIDAyLU5vdi0yMDAwIEZpcnN0IChtb3N0bHkgZHVtbXkpIHZlcnNpb24uCisgKiAwNi1Ob3YtMjAwMCBSZXdyb3RlIHRvIGR1bXAgYWxsIGRhdGEgaW50byBmcmFtZS4KKyAqLworc3RhdGljIHZvaWQgdWx0cmFjYW1fUHJvY2Vzc0lzb2NEYXRhKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSkKK3sKKwlpbnQgbjsKKworCWFzc2VydCh1dmQgIT0gTlVMTCk7CisJYXNzZXJ0KGZyYW1lICE9IE5VTEwpOworCisJLyogVHJ5IHRvIG1vdmUgZGF0YSBmcm9tIHF1ZXVlIGludG8gZnJhbWUgYnVmZmVyICovCisJbiA9IFJpbmdRdWV1ZV9HZXRMZW5ndGgoJnV2ZC0+ZHApOworCWlmIChuID4gMCkgeworCQlpbnQgbTsKKwkJLyogU2VlIGhvdyBtdWNoIHNwYXJlIHdlIGhhdmUgbGVmdCAqLworCQltID0gdXZkLT5tYXhfZnJhbWVfc2l6ZSAtIGZyYW1lLT5zZXFSZWFkX0xlbmd0aDsKKwkJaWYgKG4gPiBtKQorCQkJbiA9IG07CisJCS8qIE5vdyBtb3ZlIHRoYXQgbXVjaCBkYXRhIGludG8gZnJhbWUgYnVmZmVyICovCisJCVJpbmdRdWV1ZV9EZXF1ZXVlKAorCQkJJnV2ZC0+ZHAsCisJCQlmcmFtZS0+ZGF0YSArIGZyYW1lLT5zZXFSZWFkX0xlbmd0aCwKKwkJCW0pOworCQlmcmFtZS0+c2VxUmVhZF9MZW5ndGggKz0gbTsKKwl9CisJLyogU2VlIGlmIHdlIGZpbGxlZCB0aGUgZnJhbWUgKi8KKwlpZiAoZnJhbWUtPnNlcVJlYWRfTGVuZ3RoID49IHV2ZC0+bWF4X2ZyYW1lX3NpemUpIHsKKwkJZnJhbWUtPmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX0RvbmU7CisJCXV2ZC0+Y3VyZnJhbWUgPSAtMTsKKwkJdXZkLT5zdGF0cy5mcmFtZV9udW0rKzsKKwl9Cit9CisKKy8qCisgKiB1bHRyYWNhbV92ZWlvKCkKKyAqCisgKiBIaXN0b3J5OgorICogMS8yNy8wMCAgQWRkZWQgY2hlY2sgZm9yIGRldiA9PSBOVUxMOyB0aGlzIGhhcHBlbnMgaWYgY2FtZXJhIGlzIHVucGx1Z2dlZC4KKyAqLworc3RhdGljIGludCB1bHRyYWNhbV92ZWlvKAorCXN0cnVjdCB1dmQgKnV2ZCwKKwl1bnNpZ25lZCBjaGFyIHJlcSwKKwl1bnNpZ25lZCBzaG9ydCB2YWx1ZSwKKwl1bnNpZ25lZCBzaG9ydCBpbmRleCwKKwlpbnQgaXNfb3V0KQoreworCXN0YXRpYyBjb25zdCBjaGFyIHByb2NbXSA9ICJ1bHRyYWNhbV92ZWlvIjsKKwl1bnNpZ25lZCBjaGFyIGNwWzhdIC8qID0geyAweGRlLCAweGFkLCAweGJlLCAweGVmLCAweGRlLCAweGFkLCAweGJlLCAweGVmIH0gKi87CisJaW50IGk7CisKKwlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpKQorCQlyZXR1cm4gMDsKKworCWlmICghaXNfb3V0KSB7CisJCWkgPSB1c2JfY29udHJvbF9tc2coCisJCQl1dmQtPmRldiwKKwkJCXVzYl9yY3ZjdHJscGlwZSh1dmQtPmRldiwgMCksCisJCQlyZXEsCisJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCXZhbHVlLAorCQkJaW5kZXgsCisJCQljcCwKKwkJCXNpemVvZihjcCksCisJCQkxMDAwKTsKKyNpZiAxCisJCWluZm8oIlVTQiA9PiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAgICAiKHJlcT0kJTAyeCB2YWw9JCUwNHggaW5kPSQlMDR4KSIsCisJCSAgICAgICBjcFswXSxjcFsxXSxjcFsyXSxjcFszXSxjcFs0XSxjcFs1XSxjcFs2XSxjcFs3XSwKKwkJICAgICAgIHJlcSwgdmFsdWUsIGluZGV4KTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWkgPSB1c2JfY29udHJvbF9tc2coCisJCQl1dmQtPmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1dmQtPmRldiwgMCksCisJCQlyZXEsCisJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQl2YWx1ZSwKKwkJCWluZGV4LAorCQkJTlVMTCwKKwkJCTAsCisJCQkxMDAwKTsKKwl9CisJaWYgKGkgPCAwKSB7CisJCWVycigiJXM6IEVSUk9SPSVkLiBDYW1lcmEgc3RvcHBlZDsgUmVjb25uZWN0IG9yIHJlbG9hZCBkcml2ZXIuIiwKKwkJICAgIHByb2MsIGkpOworCQl1dmQtPmxhc3RfZXJyb3IgPSBpOworCX0KKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIHVsdHJhY2FtX2NhbGN1bGF0ZV9mcHMoKQorICovCitzdGF0aWMgaW50IHVsdHJhY2FtX2NhbGN1bGF0ZV9mcHMoc3RydWN0IHV2ZCAqdXZkKQoreworCXJldHVybiAzICsgZnJhbWVyYXRlKjQgKyBmcmFtZXJhdGUvMjsKK30KKworLyoKKyAqIHVsdHJhY2FtX2FkanVzdF9jb250cmFzdCgpCisgKi8KK3N0YXRpYyB2b2lkIHVsdHJhY2FtX2FkanVzdF9jb250cmFzdChzdHJ1Y3QgdXZkICp1dmQpCit7Cit9CisKKy8qCisgKiB1bHRyYWNhbV9zZXRfYnJpZ2h0bmVzcygpCisgKgorICogVGhpcyBwcm9jZWR1cmUgY2hhbmdlcyBicmlnaHRuZXNzIG9mIHRoZSBwaWN0dXJlLgorICovCitzdGF0aWMgdm9pZCB1bHRyYWNhbV9zZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgdXZkICp1dmQpCit7Cit9CisKK3N0YXRpYyB2b2lkIHVsdHJhY2FtX3NldF9odWUoc3RydWN0IHV2ZCAqdXZkKQoreworfQorCisvKgorICogdWx0cmFjYW1fYWRqdXN0X3BpY3R1cmUoKQorICoKKyAqIFRoaXMgcHJvY2VkdXJlIGdldHMgY2FsbGVkIGZyb20gVjRMIGludGVyZmFjZSB0byB1cGRhdGUgcGljdHVyZSBzZXR0aW5ncy4KKyAqIEhlcmUgd2UgY2hhbmdlIGJyaWdodG5lc3MgYW5kIGNvbnRyYXN0LgorICovCitzdGF0aWMgdm9pZCB1bHRyYWNhbV9hZGp1c3RfcGljdHVyZShzdHJ1Y3QgdXZkICp1dmQpCit7CisJdWx0cmFjYW1fYWRqdXN0X2NvbnRyYXN0KHV2ZCk7CisJdWx0cmFjYW1fc2V0X2JyaWdodG5lc3ModXZkKTsKKwl1bHRyYWNhbV9zZXRfaHVlKHV2ZCk7Cit9CisKKy8qCisgKiB1bHRyYWNhbV92aWRlb19zdG9wKCkKKyAqCisgKiBUaGlzIGNvZGUgdGVsbHMgY2FtZXJhIHRvIHN0b3Agc3RyZWFtaW5nLiBUaGUgaW50ZXJmYWNlIHJlbWFpbnMKKyAqIGNvbmZpZ3VyZWQgYW5kIGJhbmR3aWR0aCAtIGNsYWltZWQuCisgKi8KK3N0YXRpYyB2b2lkIHVsdHJhY2FtX3ZpZGVvX3N0b3Aoc3RydWN0IHV2ZCAqdXZkKQoreworfQorCisvKgorICogdWx0cmFjYW1fcmVpbml0X2lzbygpCisgKgorICogVGhpcyBwcm9jZWR1cmUgc2VuZHMgY291cGxlIG9mIGNvbW1hbmRzIHRvIHRoZSBjYW1lcmEgYW5kIHRoZW4KKyAqIHJlc2V0cyB0aGUgdmlkZW8gcGlwZS4gVGhpcyBzZXF1ZW5jZSB3YXMgb2JzZXJ2ZWQgdG8gcmVpbml0IHRoZQorICogY2FtZXJhIG9yLCBhdCBsZWFzdCwgdG8gaW5pdGlhdGUgSVNPIGRhdGEgc3RyZWFtLgorICovCitzdGF0aWMgdm9pZCB1bHRyYWNhbV9yZWluaXRfaXNvKHN0cnVjdCB1dmQgKnV2ZCwgaW50IGRvX3N0b3ApCit7Cit9CisKK3N0YXRpYyB2b2lkIHVsdHJhY2FtX3ZpZGVvX3N0YXJ0KHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwl1bHRyYWNhbV9yZWluaXRfaXNvKHV2ZCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdWx0cmFjYW1fcmVzZXRQaXBlKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwl1c2JfY2xlYXJfaGFsdCh1dmQtPmRldiwgdXZkLT52aWRlb19lbmRwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1bHRyYWNhbV9hbHRlcm5hdGVTZXR0aW5nKHN0cnVjdCB1dmQgKnV2ZCwgaW50IHNldHRpbmcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gInVsdHJhY2FtX2FsdGVybmF0ZVNldHRpbmciOworCWludCBpOworCWkgPSB1c2Jfc2V0X2ludGVyZmFjZSh1dmQtPmRldiwgdXZkLT5pZmFjZSwgc2V0dGluZyk7CisJaWYgKGkgPCAwKSB7CisJCWVycigiJXM6IHVzYl9zZXRfaW50ZXJmYWNlIGVycm9yIiwgcHJvYyk7CisJCXV2ZC0+bGFzdF9lcnJvciA9IGk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJuIG5lZ2F0aXZlIGNvZGUgb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IHVsdHJhY2FtX3NldHVwX29uX29wZW4oc3RydWN0IHV2ZCAqdXZkKQoreworCWludCBzZXR1cF9vayA9IDA7IC8qIFN1Y2Nlc3MgYnkgZGVmYXVsdCAqLworCS8qIFNlbmQgaW5pdCBzZXF1ZW5jZSBvbmx5IG9uY2UsIGl0J3MgbGFyZ2UhICovCisJaWYgKCFVTFRSQUNBTV9UKHV2ZCktPmluaXRpYWxpemVkKSB7CisJCXVsdHJhY2FtX2FsdGVybmF0ZVNldHRpbmcodXZkLCAweDA0KTsKKwkJdWx0cmFjYW1fYWx0ZXJuYXRlU2V0dGluZyh1dmQsIDB4MDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMiwgMHgwMDA0LCAweDAwMGIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMiwgMHgwMDAxLCAweDAwMDUsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMiwgMHg4MDAwLCAweDAwMDAsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwMDAsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMGIwLCAweDAwMDEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwMDIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDBjLCAweDAwMDMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDBiLCAweDAwMDQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwMDUsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwMDYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDc5LCAweDAwMDcsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDNiLCAweDAwMDgsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAyLCAweDAwMGYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAxLCAweDAwMTAsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwMTEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYmYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAxLCAweDAwYzAsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDEwLCAweDAwY2IsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGE0LCAweDAwMDEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDEwLCAweDAwMDIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDY2LCAweDAwMDcsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDBiLCAweDAwMDgsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDM0LCAweDAwMDksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMGEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDJlLCAweDAwMGIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGQ2LCAweDAwMGMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGZjLCAweDAwMGQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGYxLCAweDAwMGUsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGRhLCAweDAwMGYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDM2LCAweDAwMTAsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDBiLCAweDAwMTEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAxLCAweDAwMTIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMTMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMTQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDg3LCAweDAwNTEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDQwLCAweDAwNTIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDU4LCAweDAwNTMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDQwLCAweDAwNTQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwNDAsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDEwLCAweDAwNDEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDIwLCAweDAwNDIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDMwLCAweDAwNDMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDQwLCAweDAwNDQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDUwLCAweDAwNDUsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDYwLCAweDAwNDYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDcwLCAweDAwNDcsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDgwLCAweDAwNDgsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDkwLCAweDAwNDksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGEwLCAweDAwNGEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGIwLCAweDAwNGIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGMwLCAweDAwNGMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGQwLCAweDAwNGQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGUwLCAweDAwNGUsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGYwLCAweDAwNGYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGZmLCAweDAwNTAsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwNTYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDgwLCAweDAwYzEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwY2EsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDgwLCAweDAwYzEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDA0LCAweDAwYzIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwY2EsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAyLCAweDAwYzEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDIwLCAweDAwYzIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwY2EsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzUsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzcsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzgsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzUsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzcsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzgsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDQwLCAweDAwYzEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDE3LCAweDAwYzIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwY2EsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzUsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzcsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzgsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzUsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzcsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzgsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMGMwLCAweDAwYzEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwYzIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwY2EsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMiwgMHhjMDQwLCAweDAwMDEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMDgsIDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMDksIDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMGEsIDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMGIsIDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMGMsIDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMGQsIDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMGUsIDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMGYsIDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMTAsIDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDBiLCAweDAwMDgsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDM0LCAweDAwMDksIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMGEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDJlLCAweDAwMGIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGQ2LCAweDAwMGMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGZjLCAweDAwMGQsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGYxLCAweDAwMGUsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGRhLCAweDAwMGYsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDM2LCAweDAwMTAsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAwLCAweDAwMDEsIDApOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDY0LCAweDAwMDEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDU5LCAweDAwNTEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDNmLCAweDAwNTIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDk0LCAweDAwNTMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGZmLCAweDAwMTEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMDAzLCAweDAwMTIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMSwgMHgwMGY3LCAweDAwMTMsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDA5LCAweDAwMTEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwMDEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwMDAsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDIwLCAweDAwYzEsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDEwLCAweDAwYzIsIDEpOworCQl1bHRyYWNhbV92ZWlvKHV2ZCwgMHgwMCwgMHgwMDAwLCAweDAwY2EsIDEpOworCQl1bHRyYWNhbV9hbHRlcm5hdGVTZXR0aW5nKHV2ZCwgMHgwNCk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAyLCAweDAwMDAsIDB4MDAwMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAyLCAweDAwMDAsIDB4MDAwMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAyLCAweDAwMDAsIDB4MDAwNiwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAyLCAweDkwMDAsIDB4MDAwNywgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAyLCAweDAwNDIsIDB4MDAwMSwgMSk7CisJCXVsdHJhY2FtX3ZlaW8odXZkLCAweDAyLCAweDAwMDAsIDB4MDAwYiwgMCk7CisJCXVsdHJhY2FtX3Jlc2V0UGlwZSh1dmQpOworCQlVTFRSQUNBTV9UKHV2ZCktPmluaXRpYWxpemVkID0gKHNldHVwX29rICE9IDApOworCX0KKwlyZXR1cm4gc2V0dXBfb2s7Cit9CisKK3N0YXRpYyB2b2lkIHVsdHJhY2FtX2NvbmZpZ3VyZV92aWRlbyhzdHJ1Y3QgdXZkICp1dmQpCit7CisJaWYgKHV2ZCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlSRVNUUklDVF9UT19SQU5HRShpbml0X2JyaWdodG5lc3MsIDAsIDI1NSk7CisJUkVTVFJJQ1RfVE9fUkFOR0UoaW5pdF9jb250cmFzdCwgMCwgMjU1KTsKKwlSRVNUUklDVF9UT19SQU5HRShpbml0X2NvbG9yLCAwLCAyNTUpOworCVJFU1RSSUNUX1RPX1JBTkdFKGluaXRfaHVlLCAwLCAyNTUpOworCVJFU1RSSUNUX1RPX1JBTkdFKGh1ZV9jb3JyZWN0aW9uLCAwLCAyNTUpOworCisJbWVtc2V0KCZ1dmQtPnZwaWMsIDAsIHNpemVvZih1dmQtPnZwaWMpKTsKKwltZW1zZXQoJnV2ZC0+dnBpY19vbGQsIDB4NTUsIHNpemVvZih1dmQtPnZwaWNfb2xkKSk7CisKKwl1dmQtPnZwaWMuY29sb3VyID0gaW5pdF9jb2xvciA8PCA4OworCXV2ZC0+dnBpYy5odWUgPSBpbml0X2h1ZSA8PCA4OworCXV2ZC0+dnBpYy5icmlnaHRuZXNzID0gaW5pdF9icmlnaHRuZXNzIDw8IDg7CisJdXZkLT52cGljLmNvbnRyYXN0ID0gaW5pdF9jb250cmFzdCA8PCA4OworCXV2ZC0+dnBpYy53aGl0ZW5lc3MgPSAxMDUgPDwgODsgLyogVGhpcyBvbmUgaXNuJ3QgdXNlZCAqLworCXV2ZC0+dnBpYy5kZXB0aCA9IDI0OworCXV2ZC0+dnBpYy5wYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IyNDsKKworCW1lbXNldCgmdXZkLT52Y2FwLCAwLCBzaXplb2YodXZkLT52Y2FwKSk7CisJc3RyY3B5KHV2ZC0+dmNhcC5uYW1lLCAiSUJNIFVsdHJhIENhbWVyYSIpOworCXV2ZC0+dmNhcC50eXBlID0gVklEX1RZUEVfQ0FQVFVSRTsKKwl1dmQtPnZjYXAuY2hhbm5lbHMgPSAxOworCXV2ZC0+dmNhcC5hdWRpb3MgPSAwOworCXV2ZC0+dmNhcC5tYXh3aWR0aCA9IFZJREVPU0laRV9YKHV2ZC0+Y2FudmFzKTsKKwl1dmQtPnZjYXAubWF4aGVpZ2h0ID0gVklERU9TSVpFX1kodXZkLT5jYW52YXMpOworCXV2ZC0+dmNhcC5taW53aWR0aCA9IG1pbl9jYW52YXNXaWR0aDsKKwl1dmQtPnZjYXAubWluaGVpZ2h0ID0gbWluX2NhbnZhc0hlaWdodDsKKworCW1lbXNldCgmdXZkLT52Y2hhbiwgMCwgc2l6ZW9mKHV2ZC0+dmNoYW4pKTsKKwl1dmQtPnZjaGFuLmZsYWdzID0gMDsKKwl1dmQtPnZjaGFuLnR1bmVycyA9IDA7CisJdXZkLT52Y2hhbi5jaGFubmVsID0gMDsKKwl1dmQtPnZjaGFuLnR5cGUgPSBWSURFT19UWVBFX0NBTUVSQTsKKwlzdHJjcHkodXZkLT52Y2hhbi5uYW1lLCAiQ2FtZXJhIik7Cit9CisKKy8qCisgKiB1bHRyYWNhbV9wcm9iZSgpCisgKgorICogVGhpcyBwcm9jZWR1cmUgcXVlcmllcyBkZXZpY2UgZGVzY3JpcHRvciBhbmQgYWNjZXB0cyB0aGUgaW50ZXJmYWNlCisgKiBpZiBpdCBsb29rcyBsaWtlIG91ciBjYW1lcmEuCisgKgorICogSGlzdG9yeToKKyAqIDEyLU5vdi0yMDAwIFJld29ya2VkIHRvIGNvbXBseSB3aXRoIG5ldyBwcm9iZSgpIHNpZ25hdHVyZS4KKyAqIDIzLUphbi0yMDAxIEFkZGVkIGNvbXBhdGliaWxpdHkgd2l0aCAyLjIueCBrZXJuZWxzLgorICovCitzdGF0aWMgaW50IHVsdHJhY2FtX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqZGV2aWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHV2ZCAqdXZkID0gTlVMTDsKKwlpbnQgaXgsIGksIG5hczsKKwlpbnQgYWN0SW50ZXJmYWNlPS0xLCBpbmFjdEludGVyZmFjZT0tMSwgbWF4UFM9MDsKKwl1bnNpZ25lZCBjaGFyIHZpZGVvX2VwID0gMDsKKworCWlmIChkZWJ1ZyA+PSAxKQorCQlpbmZvKCJ1bHRyYWNhbV9wcm9iZSglcCkiLCBpbnRmKTsKKworCS8qIFdlIGRvbid0IGhhbmRsZSBtdWx0aS1jb25maWcgY2FtZXJhcyAqLworCWlmIChkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpCisJCXJldHVybiAtRU5PREVWOworCisJaW5mbygiSUJNIFVsdHJhIGNhbWVyYSBmb3VuZCAocmV2LiAweCUwNHgpIiwKKwkJbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSkpOworCisJLyogVmFsaWRhdGUgZm91bmQgaW50ZXJmYWNlOiBtdXN0IGhhdmUgb25lIElTTyBlbmRwb2ludCAqLworCW5hcyA9IGludGYtPm51bV9hbHRzZXR0aW5nOworCWlmIChkZWJ1ZyA+IDApCisJCWluZm8oIk51bWJlciBvZiBhbHRlcm5hdGUgc2V0dGluZ3M9JWQuIiwgbmFzKTsKKwlpZiAobmFzIDwgOCkgeworCQllcnIoIlRvbyBmZXcgYWx0ZXJuYXRlIHNldHRpbmdzIGZvciB0aGlzIGNhbWVyYSEiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIFZhbGlkYXRlIGFsbCBhbHRlcm5hdGUgc2V0dGluZ3MgKi8KKwlmb3IgKGl4PTA7IGl4IDwgbmFzOyBpeCsrKSB7CisJCWNvbnN0IHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKworCQlpbnRlcmZhY2UgPSAmaW50Zi0+YWx0c2V0dGluZ1tpeF07CisJCWkgPSBpbnRlcmZhY2UtPmRlc2MuYkFsdGVybmF0ZVNldHRpbmc7CisJCWlmIChpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cyAhPSAxKSB7CisJCQllcnIoIkludGVyZmFjZSAlZC4gaGFzICV1LiBlbmRwb2ludHMhIiwKKwkJCSAgICBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlciwKKwkJCSAgICAodW5zaWduZWQpKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzKSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7CisJCWlmICh2aWRlb19lcCA9PSAwKQorCQkJdmlkZW9fZXAgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJZWxzZSBpZiAodmlkZW9fZXAgIT0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpIHsKKwkJCWVycigiQWx0ZXJuYXRlIHNldHRpbmdzIGhhdmUgZGlmZmVyZW50IGVuZHBvaW50IGFkZHJlc3NlcyEiKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDB4MDMpICE9IDB4MDEpIHsKKwkJCWVycigiSW50ZXJmYWNlICVkLiBoYXMgbm9uLUlTTyBlbmRwb2ludCEiLAorCQkJICAgIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSA9PSAwKSB7CisJCQllcnIoIkludGVyZmFjZSAlZC4gaGFzIElTTyBPVVQgZW5kcG9pbnQhIiwKKwkJCSAgICBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlpZiAobGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA9PSAwKSB7CisJCQlpZiAoaW5hY3RJbnRlcmZhY2UgPCAwKQorCQkJCWluYWN0SW50ZXJmYWNlID0gaTsKKwkJCWVsc2UgeworCQkJCWVycigiTW9yZSB0aGFuIG9uZSBpbmFjdGl2ZSBhbHQuIHNldHRpbmchIik7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoYWN0SW50ZXJmYWNlIDwgMCkgeworCQkJCWFjdEludGVyZmFjZSA9IGk7CisJCQkJbWF4UFMgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJCWlmIChkZWJ1ZyA+IDApCisJCQkJCWluZm8oIkFjdGl2ZSBzZXR0aW5nPSVkLiBtYXhQUz0lZC4iLCBpLCBtYXhQUyk7CisJCQl9IGVsc2UgeworCQkJCS8qIEdvdCBhbm90aGVyIGFjdGl2ZSBhbHQuIHNldHRpbmcgKi8KKwkJCQlpZiAobWF4UFMgPCBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpKSB7CisJCQkJCS8qIFRoaXMgb25lIGlzIGJldHRlciEgKi8KKwkJCQkJYWN0SW50ZXJmYWNlID0gaTsKKwkJCQkJbWF4UFMgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJCQlpZiAoZGVidWcgPiAwKSB7CisJCQkJCQlpbmZvKCJFdmVuIGJldHRlciBjdGl2ZSBzZXR0aW5nPSVkLiBtYXhQUz0lZC4iLAorCQkJCQkJICAgICBpLCBtYXhQUyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKChtYXhQUyA8PSAwKSB8fCAoYWN0SW50ZXJmYWNlIDwgMCkgfHwgKGluYWN0SW50ZXJmYWNlIDwgMCkpIHsKKwkJZXJyKCJGYWlsZWQgdG8gcmVjb2duaXplIHRoZSBjYW1lcmEhIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXV2ZCA9IHVzYnZpZGVvX0FsbG9jYXRlRGV2aWNlKGNhbXMpOworCWlmICh1dmQgIT0gTlVMTCkgeworCQkvKiBIZXJlIHV2ZCBpcyBhIGZ1bGx5IGFsbG9jYXRlZCB1dmQgb2JqZWN0ICovCisJCXV2ZC0+ZmxhZ3MgPSBmbGFnczsKKwkJdXZkLT5kZWJ1ZyA9IGRlYnVnOworCQl1dmQtPmRldiA9IGRldjsKKwkJdXZkLT5pZmFjZSA9IGludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwkJdXZkLT5pZmFjZUFsdEluYWN0aXZlID0gaW5hY3RJbnRlcmZhY2U7CisJCXV2ZC0+aWZhY2VBbHRBY3RpdmUgPSBhY3RJbnRlcmZhY2U7CisJCXV2ZC0+dmlkZW9fZW5kcCA9IHZpZGVvX2VwOworCQl1dmQtPmlzb19wYWNrZXRfbGVuID0gbWF4UFM7CisJCXV2ZC0+cGFsZXR0ZUJpdHMgPSAxTCA8PCBWSURFT19QQUxFVFRFX1JHQjI0OworCQl1dmQtPmRlZmF1bHRQYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IyNDsKKwkJdXZkLT5jYW52YXMgPSBWSURFT1NJWkUoNjQwLCA0ODApOwkvKiBGSVhNRSAqLworCQl1dmQtPnZpZGVvc2l6ZSA9IHV2ZC0+Y2FudmFzOyAvKiB1bHRyYWNhbV9zaXplX3RvX3ZpZGVvc2l6ZShzaXplKTsqLworCisJCS8qIEluaXRpYWxpemUgaWJtY2FtLXNwZWNpZmljIGRhdGEgKi8KKwkJYXNzZXJ0KFVMVFJBQ0FNX1QodXZkKSAhPSBOVUxMKTsKKwkJVUxUUkFDQU1fVCh1dmQpLT5jYW1lcmFfbW9kZWwgPSAwOyAvKiBOb3QgdXNlZCB5ZXQgKi8KKwkJVUxUUkFDQU1fVCh1dmQpLT5pbml0aWFsaXplZCA9IDA7CisKKwkJdWx0cmFjYW1fY29uZmlndXJlX3ZpZGVvKHV2ZCk7CisKKwkJaSA9IHVzYnZpZGVvX1JlZ2lzdGVyVmlkZW9EZXZpY2UodXZkKTsKKwkJaWYgKGkgIT0gMCkgeworCQkJZXJyKCJ1c2J2aWRlb19SZWdpc3RlclZpZGVvRGV2aWNlKCkgZmFpbGVkLiIpOworCQkJdXZkID0gTlVMTDsKKwkJfQorCX0KKworCWlmICh1dmQpIHsKKwkJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgdXZkKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlPOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZVtdID0geworCXsgVVNCX0RFVklDRShVTFRSQUNBTV9WRU5ET1JfSUQsIFVMVFJBQ0FNX1BST0RVQ1RfSUQpIH0sCisJeyB9ICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworLyoKKyAqIHVsdHJhY2FtX2luaXQoKQorICoKKyAqIFRoaXMgY29kZSBpcyBydW4gdG8gaW5pdGlhbGl6ZSB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgaW50IF9faW5pdCB1bHRyYWNhbV9pbml0KHZvaWQpCit7CisJc3RydWN0IHVzYnZpZGVvX2NiIGNiVGJsOworCW1lbXNldCgmY2JUYmwsIDAsIHNpemVvZihjYlRibCkpOworCWNiVGJsLnByb2JlID0gdWx0cmFjYW1fcHJvYmU7CisJY2JUYmwuc2V0dXBPbk9wZW4gPSB1bHRyYWNhbV9zZXR1cF9vbl9vcGVuOworCWNiVGJsLnZpZGVvU3RhcnQgPSB1bHRyYWNhbV92aWRlb19zdGFydDsKKwljYlRibC52aWRlb1N0b3AgPSB1bHRyYWNhbV92aWRlb19zdG9wOworCWNiVGJsLnByb2Nlc3NEYXRhID0gdWx0cmFjYW1fUHJvY2Vzc0lzb2NEYXRhOworCWNiVGJsLnBvc3RQcm9jZXNzID0gdXNidmlkZW9fRGVpbnRlcmxhY2VGcmFtZTsKKwljYlRibC5hZGp1c3RQaWN0dXJlID0gdWx0cmFjYW1fYWRqdXN0X3BpY3R1cmU7CisJY2JUYmwuZ2V0RlBTID0gdWx0cmFjYW1fY2FsY3VsYXRlX2ZwczsKKwlyZXR1cm4gdXNidmlkZW9fcmVnaXN0ZXIoCisJCSZjYW1zLAorCQlNQVhfQ0FNRVJBUywKKwkJc2l6ZW9mKHVsdHJhY2FtX3QpLAorCQkidWx0cmFjYW0iLAorCQkmY2JUYmwsCisJCVRISVNfTU9EVUxFLAorCQlpZF90YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bHRyYWNhbV9jbGVhbnVwKHZvaWQpCit7CisJdXNidmlkZW9fRGVyZWdpc3RlcigmY2Ftcyk7Cit9CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHVsdHJhY2FtX2luaXQpOworbW9kdWxlX2V4aXQodWx0cmFjYW1fY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS91c2J2aWRlby5jIGIvZHJpdmVycy91c2IvbWVkaWEvdXNidmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTg0ODRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvdXNidmlkZW8uYwpAQCAtMCwwICsxLDIxOTIgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInVzYnZpZGVvLmgiCisKKyNpZiBkZWZpbmVkKE1BUF9OUikKKyNkZWZpbmUJdmlydF90b19wYWdlKHYpCU1BUF9OUih2KQkvKiBLZXJuZWxzIDIuMi54ICovCisjZW5kaWYKKworc3RhdGljIGludCB2aWRlb19uciA9IC0xOworbW9kdWxlX3BhcmFtKHZpZGVvX25yLCBpbnQsIDApOworCisvKgorICogTG9jYWwgcHJvdG90eXBlcy4KKyAqLworc3RhdGljIHZvaWQgdXNidmlkZW9fRGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitzdGF0aWMgdm9pZCB1c2J2aWRlb19DYW1lcmFSZWxlYXNlKHN0cnVjdCB1dmQgKnV2ZCk7CisKK3N0YXRpYyBpbnQgdXNidmlkZW9fdjRsX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCB1c2J2aWRlb192NGxfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworc3RhdGljIGludCB1c2J2aWRlb192NGxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgc3NpemVfdCB1c2J2aWRlb192NGxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIGludCB1c2J2aWRlb192NGxfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCitzdGF0aWMgaW50IHVzYnZpZGVvX1N0YXJ0RGF0YVB1bXAoc3RydWN0IHV2ZCAqdXZkKTsKK3N0YXRpYyB2b2lkIHVzYnZpZGVvX1N0b3BEYXRhUHVtcChzdHJ1Y3QgdXZkICp1dmQpOworc3RhdGljIGludCB1c2J2aWRlb19HZXRGcmFtZShzdHJ1Y3QgdXZkICp1dmQsIGludCBmcmFtZU51bSk7CitzdGF0aWMgaW50IHVzYnZpZGVvX05ld0ZyYW1lKHN0cnVjdCB1dmQgKnV2ZCwgaW50IGZyYW1lbnVtKTsKK3N0YXRpYyB2b2lkIHVzYnZpZGVvX1NvZnR3YXJlQ29udHJhc3RBZGp1c3RtZW50KHN0cnVjdCB1dmQgKnV2ZCwKKwkJCQkJCXN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCAqdXNidmlkZW9fcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXZvaWQgKm1lbTsKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCW1lbSA9IHZtYWxsb2NfMzIoc2l6ZSk7CisJaWYgKCFtZW0pCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7IC8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZCB1c2J2aWRlb19ydmZyZWUodm9pZCAqbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBhZHI7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCisJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOworCQlhZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisJdmZyZWUobWVtKTsKK30KKworc3RhdGljIHZvaWQgUmluZ1F1ZXVlX0luaXRpYWxpemUoc3RydWN0IFJpbmdRdWV1ZSAqcnEpCit7CisJYXNzZXJ0KHJxICE9IE5VTEwpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJxLT53cWgpOworfQorCitzdGF0aWMgdm9pZCBSaW5nUXVldWVfQWxsb2NhdGUoc3RydWN0IFJpbmdRdWV1ZSAqcnEsIGludCBycUxlbikKK3sKKwkvKiBNYWtlIHN1cmUgdGhlIHJlcXVlc3RlZCBzaXplIGlzIGEgcG93ZXIgb2YgMiBhbmQKKwkgICByb3VuZCB1cCBpZiBuZWNlc3NhcnkuIFRoaXMgYWxsb3dzIGluZGV4IHdyYXBwaW5nCisJICAgdXNpbmcgbWFza3MgcmF0aGVyIHRoYW4gbW9kdWxvICovCisKKwlpbnQgaSA9IDE7CisJYXNzZXJ0KHJxICE9IE5VTEwpOworCWFzc2VydChycUxlbiA+IDApOworCisJd2hpbGUocnFMZW4gPj4gaSkKKwkJaSsrOworCWlmKHJxTGVuICE9IDEgPDwgKGktMSkpCisJCXJxTGVuID0gMSA8PCBpOworCisJcnEtPmxlbmd0aCA9IHJxTGVuOworCXJxLT5yaSA9IHJxLT53aSA9IDA7CisJcnEtPnF1ZXVlID0gdXNidmlkZW9fcnZtYWxsb2MocnEtPmxlbmd0aCk7CisJYXNzZXJ0KHJxLT5xdWV1ZSAhPSBOVUxMKTsKK30KKworc3RhdGljIGludCBSaW5nUXVldWVfSXNBbGxvY2F0ZWQoY29uc3Qgc3RydWN0IFJpbmdRdWV1ZSAqcnEpCit7CisJaWYgKHJxID09IE5VTEwpCisJCXJldHVybiAwOworCXJldHVybiAocnEtPnF1ZXVlICE9IE5VTEwpICYmIChycS0+bGVuZ3RoID4gMCk7Cit9CisKK3N0YXRpYyB2b2lkIFJpbmdRdWV1ZV9GcmVlKHN0cnVjdCBSaW5nUXVldWUgKnJxKQoreworCWFzc2VydChycSAhPSBOVUxMKTsKKwlpZiAoUmluZ1F1ZXVlX0lzQWxsb2NhdGVkKHJxKSkgeworCQl1c2J2aWRlb19ydmZyZWUocnEtPnF1ZXVlLCBycS0+bGVuZ3RoKTsKKwkJcnEtPnF1ZXVlID0gTlVMTDsKKwkJcnEtPmxlbmd0aCA9IDA7CisJfQorfQorCitpbnQgUmluZ1F1ZXVlX0RlcXVldWUoc3RydWN0IFJpbmdRdWV1ZSAqcnEsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbikKK3sKKwlpbnQgcnFsLCB0b3JlYWQ7CisKKwlhc3NlcnQocnEgIT0gTlVMTCk7CisJYXNzZXJ0KGRzdCAhPSBOVUxMKTsKKworCXJxbCA9IFJpbmdRdWV1ZV9HZXRMZW5ndGgocnEpOworCWlmKCFycWwpCisJCXJldHVybiAwOworCisJLyogQ2xpcCByZXF1ZXN0ZWQgbGVuZ3RoIHRvIGF2YWlsYWJsZSBkYXRhICovCisJaWYobGVuID4gcnFsKQorCQlsZW4gPSBycWw7CisKKwl0b3JlYWQgPSBsZW47CisJaWYocnEtPnJpID4gcnEtPndpKSB7CisJCS8qIFJlYWQgZGF0YSBmcm9tIHRhaWwgKi8KKwkJaW50IHJlYWQgPSAodG9yZWFkIDwgKHJxLT5sZW5ndGggLSBycS0+cmkpKSA/IHRvcmVhZCA6IHJxLT5sZW5ndGggLSBycS0+cmk7CisJCW1lbWNweShkc3QsIHJxLT5xdWV1ZSArIHJxLT5yaSwgcmVhZCk7CisJCXRvcmVhZCAtPSByZWFkOworCQlkc3QgKz0gcmVhZDsKKwkJcnEtPnJpID0gKHJxLT5yaSArIHJlYWQpICYgKHJxLT5sZW5ndGgtMSk7CisJfQorCWlmKHRvcmVhZCkgeworCQkvKiBSZWFkIGRhdGEgZnJvbSBoZWFkICovCisJCW1lbWNweShkc3QsIHJxLT5xdWV1ZSArIHJxLT5yaSwgdG9yZWFkKTsKKwkJcnEtPnJpID0gKHJxLT5yaSArIHRvcmVhZCkgJiAocnEtPmxlbmd0aC0xKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworRVhQT1JUX1NZTUJPTChSaW5nUXVldWVfRGVxdWV1ZSk7CisKK2ludCBSaW5nUXVldWVfRW5xdWV1ZShzdHJ1Y3QgUmluZ1F1ZXVlICpycSwgY29uc3QgdW5zaWduZWQgY2hhciAqY2RhdGEsIGludCBuKQoreworCWludCBlbnF1ZXVlZCA9IDA7CisKKwlhc3NlcnQocnEgIT0gTlVMTCk7CisJYXNzZXJ0KGNkYXRhICE9IE5VTEwpOworCWFzc2VydChycS0+bGVuZ3RoID4gMCk7CisJd2hpbGUgKG4gPiAwKSB7CisJCWludCBtLCBxX2F2YWlsOworCisJCS8qIENhbGN1bGF0ZSB0aGUgbGFyZ2VzdCBjaHVuayB0aGF0IGZpdHMgdGhlIHRhaWwgb2YgdGhlIHJpbmcgKi8KKwkJcV9hdmFpbCA9IHJxLT5sZW5ndGggLSBycS0+d2k7CisJCWlmIChxX2F2YWlsIDw9IDApIHsKKwkJCXJxLT53aSA9IDA7CisJCQlxX2F2YWlsID0gcnEtPmxlbmd0aDsKKwkJfQorCQltID0gbjsKKwkJYXNzZXJ0KHFfYXZhaWwgPiAwKTsKKwkJaWYgKG0gPiBxX2F2YWlsKQorCQkJbSA9IHFfYXZhaWw7CisKKwkJbWVtY3B5KHJxLT5xdWV1ZSArIHJxLT53aSwgY2RhdGEsIG0pOworCQlSSU5HX1FVRVVFX0FEVkFOQ0VfSU5ERVgocnEsIHdpLCBtKTsKKwkJY2RhdGEgKz0gbTsKKwkJZW5xdWV1ZWQgKz0gbTsKKwkJbiAtPSBtOworCX0KKwlyZXR1cm4gZW5xdWV1ZWQ7Cit9CisKK0VYUE9SVF9TWU1CT0woUmluZ1F1ZXVlX0VucXVldWUpOworCitzdGF0aWMgdm9pZCBSaW5nUXVldWVfSW50ZXJydXB0aWJsZVNsZWVwT24oc3RydWN0IFJpbmdRdWV1ZSAqcnEpCit7CisJYXNzZXJ0KHJxICE9IE5VTEwpOworCWludGVycnVwdGlibGVfc2xlZXBfb24oJnJxLT53cWgpOworfQorCit2b2lkIFJpbmdRdWV1ZV9XYWtlVXBJbnRlcnJ1cHRpYmxlKHN0cnVjdCBSaW5nUXVldWUgKnJxKQoreworCWFzc2VydChycSAhPSBOVUxMKTsKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmcnEtPndxaCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcnEtPndxaCk7Cit9CisKK0VYUE9SVF9TWU1CT0woUmluZ1F1ZXVlX1dha2VVcEludGVycnVwdGlibGUpOworCit2b2lkIFJpbmdRdWV1ZV9GbHVzaChzdHJ1Y3QgUmluZ1F1ZXVlICpycSkKK3sKKwlhc3NlcnQocnEgIT0gTlVMTCk7CisJcnEtPnJpID0gMDsKKwlycS0+d2kgPSAwOworfQorCitFWFBPUlRfU1lNQk9MKFJpbmdRdWV1ZV9GbHVzaCk7CisKKworLyoKKyAqIHVzYnZpZGVvX1ZpZGVvc2l6ZVRvU3RyaW5nKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBjb252ZXJ0cyBnaXZlbiB2aWRlb3NpemUgdmFsdWUgdG8gcmVhZGFibGUgc3RyaW5nLgorICoKKyAqIEhpc3Rvcnk6CisgKiAwNy1BdWctMjAwMCBDcmVhdGVkLgorICogMTktT2N0LTIwMDAgUmV3b3JrZWQgZm9yIHVzYnZpZGVvIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgdXNidmlkZW9fVmlkZW9zaXplVG9TdHJpbmcoY2hhciAqYnVmLCBpbnQgYnVmTGVuLCB2aWRlb3NpemVfdCB2cykKK3sKKwljaGFyIHRtcFs0MF07CisJaW50IG47CisKKwluID0gMSArIHNwcmludGYodG1wLCAiJWxkeCVsZCIsIFZJREVPU0laRV9YKHZzKSwgVklERU9TSVpFX1kodnMpKTsKKwlhc3NlcnQobiA8IHNpemVvZih0bXApKTsKKwlpZiAoKGJ1ZiA9PSBOVUxMKSB8fCAoYnVmTGVuIDwgbikpCisJCWVycigidXNidmlkZW9fVmlkZW9zaXplVG9TdHJpbmc6IGJ1ZmZlciBpcyB0b28gc21hbGwuIik7CisJZWxzZQorCQltZW1tb3ZlKGJ1ZiwgdG1wLCBuKTsKK30KKworLyoKKyAqIHVzYnZpZGVvX092ZXJsYXlDaGFyKCkKKyAqCisgKiBIaXN0b3J5OgorICogMDEtRmViLTIwMDAgQ3JlYXRlZC4KKyAqLworc3RhdGljIHZvaWQgdXNidmlkZW9fT3ZlcmxheUNoYXIoc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lLAorCQkJCSBpbnQgeCwgaW50IHksIGludCBjaCkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGlnaXRzWzE2XSA9IHsKKwkJMHhGNkRFLCAvKiAwICovCisJCTB4MjQ5MiwgLyogMSAqLworCQkweEU3Q0UsIC8qIDIgKi8KKwkJMHhFNzlFLCAvKiAzICovCisJCTB4Qjc5MiwgLyogNCAqLworCQkweEYzOUUsIC8qIDUgKi8KKwkJMHhGM0RFLCAvKiA2ICovCisJCTB4RjQ5MiwgLyogNyAqLworCQkweEY3REUsIC8qIDggKi8KKwkJMHhGNzlFLCAvKiA5ICovCisJCTB4NzdEQSwgLyogYSAqLworCQkweEQ3NUMsIC8qIGIgKi8KKwkJMHhGMjRFLCAvKiBjICovCisJCTB4RDZEQywgLyogZCAqLworCQkweEYzNEUsIC8qIGUgKi8KKwkJMHhGMzQ4ICAvKiBmICovCisJfTsKKwl1bnNpZ25lZCBzaG9ydCBkaWdpdDsKKwlpbnQgaXgsIGl5OworCisJaWYgKCh1dmQgPT0gTlVMTCkgfHwgKGZyYW1lID09IE5VTEwpKQorCQlyZXR1cm47CisKKwlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKwkJY2ggLT0gJzAnOworCWVsc2UgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpCisJCWNoID0gMTAgKyAoY2ggLSAnQScpOworCWVsc2UgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpCisJCWNoID0gMTAgKyAoY2ggLSAnYScpOworCWVsc2UKKwkJcmV0dXJuOworCWRpZ2l0ID0gZGlnaXRzW2NoXTsKKworCWZvciAoaXk9MDsgaXkgPCA1OyBpeSsrKSB7CisJCWZvciAoaXg9MDsgaXggPCAzOyBpeCsrKSB7CisJCQlpZiAoZGlnaXQgJiAweDgwMDApIHsKKwkJCQlpZiAodXZkLT5wYWxldHRlQml0cyAmICgxTCA8PCBWSURFT19QQUxFVFRFX1JHQjI0KSkgeworLyogVE9ETyAqLwkJCQlSR0IyNF9QVVRQSVhFTChmcmFtZSwgeCtpeCwgeStpeSwgMHhGRiwgMHhGRiwgMHhGRik7CisJCQkJfQorCQkJfQorCQkJZGlnaXQgPSBkaWdpdCA8PCAxOworCQl9CisJfQorfQorCisvKgorICogdXNidmlkZW9fT3ZlcmxheVN0cmluZygpCisgKgorICogSGlzdG9yeToKKyAqIDAxLUZlYi0yMDAwIENyZWF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHVzYnZpZGVvX092ZXJsYXlTdHJpbmcoc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lLAorCQkJCSAgIGludCB4LCBpbnQgeSwgY29uc3QgY2hhciAqc3RyKQoreworCXdoaWxlICgqc3RyKSB7CisJCXVzYnZpZGVvX092ZXJsYXlDaGFyKHV2ZCwgZnJhbWUsIHgsIHksICpzdHIpOworCQlzdHIrKzsKKwkJeCArPSA0OyAvKiAzIHBpeGVscyBjaGFyYWN0ZXIgKyAxIHNwYWNlICovCisJfQorfQorCisvKgorICogdXNidmlkZW9fT3ZlcmxheVN0YXRzKCkKKyAqCisgKiBPdmVybGF5cyBpbXBvcnRhbnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIEhpc3Rvcnk6CisgKiAwMS1GZWItMjAwMCBDcmVhdGVkLgorICovCitzdGF0aWMgdm9pZCB1c2J2aWRlb19PdmVybGF5U3RhdHMoc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lKQoreworCWNvbnN0IGludCB5X2RpZmYgPSA4OworCWNoYXIgdG1wWzE2XTsKKwlpbnQgeCA9IDEwLCB5PTEwOworCWxvbmcgaSwgaiwgYmFyTGVuZ3RoOworCWNvbnN0IGludCBxaV94MSA9IDYwLCBxaV95MSA9IDEwOworCWNvbnN0IGludCBxaV94MiA9IFZJREVPU0laRV9YKGZyYW1lLT5yZXF1ZXN0KSAtIDEwLCBxaV9oID0gMTA7CisKKwkvKiBDYWxsIHRoZSB1c2VyIGNhbGxiYWNrLCBzZWUgaWYgd2UgbWF5IHByb2NlZWQgYWZ0ZXIgdGhhdCAqLworCWlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIG92ZXJsYXlIb29rKSkgeworCQlpZiAoR0VUX0NBTExCQUNLKHV2ZCwgb3ZlcmxheUhvb2spKHV2ZCwgZnJhbWUpIDwgMCkKKwkJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdlIGRyYXcgYSAobW9zdGx5KSBob2xsb3cgcmVjdGFuZ2xlIHdpdGggcWlfeHh4IGNvb3JkaW5hdGVzLgorCSAqIExlZnQgZWRnZSBzeW1ib2xpemVzIHRoZSBxdWV1ZSBpbmRleCAwOyByaWdodCBlZGdlIHN5bWJvbGl6ZXMKKwkgKiB0aGUgZnVsbCBjYXBhY2l0eSBvZiB0aGUgcXVldWUuCisJICovCisJYmFyTGVuZ3RoID0gcWlfeDIgLSBxaV94MSAtIDI7CisJaWYgKChiYXJMZW5ndGggPiAxMCkgJiYgKHV2ZC0+cGFsZXR0ZUJpdHMgJiAoMUwgPDwgVklERU9fUEFMRVRURV9SR0IyNCkpKSB7CisvKiBUT0RPICovCWxvbmcgdV9sbywgdV9oaSwgcV91c2VkOworCQlsb25nIG1fcmksIG1fd2ksIG1fbG8sIG1faGk7CisKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGZpbGwgem9uZXMgKHVzZWQgYXJlYXMgb2YgdGhlIHF1ZXVlKToKKwkJICogMCB4eHh4eHh4IHVfbG8gLi4uLi4uIHV2ZC0+ZHAucmkgeHh4eHh4eHggdV9oaSAuLi4uLiB1dmQtPmRwLmxlbmd0aAorCQkgKgorCQkgKiBpZiB1X2xvIDwgMCB0aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGZpbGxlci4KKwkJICovCisKKwkJcV91c2VkID0gUmluZ1F1ZXVlX0dldExlbmd0aCgmdXZkLT5kcCk7CisJCWlmICgodXZkLT5kcC5yaSArIHFfdXNlZCkgPj0gdXZkLT5kcC5sZW5ndGgpIHsKKwkJCXVfaGkgPSB1dmQtPmRwLmxlbmd0aDsKKwkJCXVfbG8gPSAocV91c2VkICsgdXZkLT5kcC5yaSkgJiAodXZkLT5kcC5sZW5ndGgtMSk7CisJCX0gZWxzZSB7CisJCQl1X2hpID0gKHFfdXNlZCArIHV2ZC0+ZHAucmkpOworCQkJdV9sbyA9IC0xOworCQl9CisKKwkJLyogQ29udmVydCBieXRlIGluZGljZXMgaW50byBzY3JlZW4gdW5pdHMgKi8KKwkJbV9yaSA9IHFpX3gxICsgKChiYXJMZW5ndGggKiB1dmQtPmRwLnJpKSAvIHV2ZC0+ZHAubGVuZ3RoKTsKKwkJbV93aSA9IHFpX3gxICsgKChiYXJMZW5ndGggKiB1dmQtPmRwLndpKSAvIHV2ZC0+ZHAubGVuZ3RoKTsKKwkJbV9sbyA9ICh1X2xvID4gMCkgPyAocWlfeDEgKyAoKGJhckxlbmd0aCAqIHVfbG8pIC8gdXZkLT5kcC5sZW5ndGgpKSA6IC0xOworCQltX2hpID0gcWlfeDEgKyAoKGJhckxlbmd0aCAqIHVfaGkpIC8gdXZkLT5kcC5sZW5ndGgpOworCisJCWZvciAoaj1xaV95MTsgaiA8IChxaV95MSArIHFpX2gpOyBqKyspIHsKKwkJCWZvciAoaT1xaV94MTsgaSA8IHFpX3gyOyBpKyspIHsKKwkJCQkvKiBEcmF3IGJvcmRlciBsaW5lcyAqLworCQkJCWlmICgoaiA9PSBxaV95MSkgfHwgKGogPT0gKHFpX3kxICsgcWlfaCAtIDEpKSB8fAorCQkJCSAgICAoaSA9PSBxaV94MSkgfHwgKGkgPT0gKHFpX3gyIC0gMSkpKSB7CisJCQkJCVJHQjI0X1BVVFBJWEVMKGZyYW1lLCBpLCBqLCAweEZGLCAweEZGLCAweEZGKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIEZvciBhbGwgb3RoZXIgcG9pbnRzIHRoZSBZIGNvb3JkaW5hdGUgZG9lcyBub3QgbWF0dGVyICovCisJCQkJaWYgKChpID49IG1fcmkpICYmIChpIDw9IChtX3JpICsgMykpKSB7CisJCQkJCVJHQjI0X1BVVFBJWEVMKGZyYW1lLCBpLCBqLCAweDAwLCAweEZGLCAweDAwKTsKKwkJCQl9IGVsc2UgaWYgKChpID49IG1fd2kpICYmIChpIDw9IChtX3dpICsgMykpKSB7CisJCQkJCVJHQjI0X1BVVFBJWEVMKGZyYW1lLCBpLCBqLCAweEZGLCAweDAwLCAweDAwKTsKKwkJCQl9IGVsc2UgaWYgKChpIDwgbV9sbykgfHwgKChpID4gbV9yaSkgJiYgKGkgPCBtX2hpKSkpCisJCQkJCVJHQjI0X1BVVFBJWEVMKGZyYW1lLCBpLCBqLCAweDAwLCAweDAwLCAweEZGKTsKKwkJCX0KKwkJfQorCX0KKworCXNwcmludGYodG1wLCAiJThseCIsIHV2ZC0+c3RhdHMuZnJhbWVfbnVtKTsKKwl1c2J2aWRlb19PdmVybGF5U3RyaW5nKHV2ZCwgZnJhbWUsIHgsIHksIHRtcCk7CisJeSArPSB5X2RpZmY7CisKKwlzcHJpbnRmKHRtcCwgIiU4bHgiLCB1dmQtPnN0YXRzLnVyYl9jb3VudCk7CisJdXNidmlkZW9fT3ZlcmxheVN0cmluZyh1dmQsIGZyYW1lLCB4LCB5LCB0bXApOworCXkgKz0geV9kaWZmOworCisJc3ByaW50Zih0bXAsICIlOGx4IiwgdXZkLT5zdGF0cy51cmJfbGVuZ3RoKTsKKwl1c2J2aWRlb19PdmVybGF5U3RyaW5nKHV2ZCwgZnJhbWUsIHgsIHksIHRtcCk7CisJeSArPSB5X2RpZmY7CisKKwlzcHJpbnRmKHRtcCwgIiU4bHgiLCB1dmQtPnN0YXRzLmRhdGFfY291bnQpOworCXVzYnZpZGVvX092ZXJsYXlTdHJpbmcodXZkLCBmcmFtZSwgeCwgeSwgdG1wKTsKKwl5ICs9IHlfZGlmZjsKKworCXNwcmludGYodG1wLCAiJThseCIsIHV2ZC0+c3RhdHMuaGVhZGVyX2NvdW50KTsKKwl1c2J2aWRlb19PdmVybGF5U3RyaW5nKHV2ZCwgZnJhbWUsIHgsIHksIHRtcCk7CisJeSArPSB5X2RpZmY7CisKKwlzcHJpbnRmKHRtcCwgIiU4bHgiLCB1dmQtPnN0YXRzLmlzb19za2lwX2NvdW50KTsKKwl1c2J2aWRlb19PdmVybGF5U3RyaW5nKHV2ZCwgZnJhbWUsIHgsIHksIHRtcCk7CisJeSArPSB5X2RpZmY7CisKKwlzcHJpbnRmKHRtcCwgIiU4bHgiLCB1dmQtPnN0YXRzLmlzb19lcnJfY291bnQpOworCXVzYnZpZGVvX092ZXJsYXlTdHJpbmcodXZkLCBmcmFtZSwgeCwgeSwgdG1wKTsKKwl5ICs9IHlfZGlmZjsKKworCXNwcmludGYodG1wLCAiJTh4IiwgdXZkLT52cGljLmNvbG91cik7CisJdXNidmlkZW9fT3ZlcmxheVN0cmluZyh1dmQsIGZyYW1lLCB4LCB5LCB0bXApOworCXkgKz0geV9kaWZmOworCisJc3ByaW50Zih0bXAsICIlOHgiLCB1dmQtPnZwaWMuaHVlKTsKKwl1c2J2aWRlb19PdmVybGF5U3RyaW5nKHV2ZCwgZnJhbWUsIHgsIHksIHRtcCk7CisJeSArPSB5X2RpZmY7CisKKwlzcHJpbnRmKHRtcCwgIiU4eCIsIHV2ZC0+dnBpYy5icmlnaHRuZXNzID4+IDgpOworCXVzYnZpZGVvX092ZXJsYXlTdHJpbmcodXZkLCBmcmFtZSwgeCwgeSwgdG1wKTsKKwl5ICs9IHlfZGlmZjsKKworCXNwcmludGYodG1wLCAiJTh4IiwgdXZkLT52cGljLmNvbnRyYXN0ID4+IDEyKTsKKwl1c2J2aWRlb19PdmVybGF5U3RyaW5nKHV2ZCwgZnJhbWUsIHgsIHksIHRtcCk7CisJeSArPSB5X2RpZmY7CisKKwlzcHJpbnRmKHRtcCwgIiU4ZCIsIHV2ZC0+dnBpYy53aGl0ZW5lc3MgPj4gOCk7CisJdXNidmlkZW9fT3ZlcmxheVN0cmluZyh1dmQsIGZyYW1lLCB4LCB5LCB0bXApOworCXkgKz0geV9kaWZmOworfQorCisvKgorICogdXNidmlkZW9fUmVwb3J0U3RhdGlzdGljcygpCisgKgorICogVGhpcyBwcm9jZWR1cmUgcHJpbnRzIHBhY2tldCBhbmQgdHJhbnNmZXIgc3RhdGlzdGljcy4KKyAqCisgKiBIaXN0b3J5OgorICogMTQtSmFuLTIwMDAgQ29ycmVjdGVkIGRlZmF1bHQgbXVsdGlwbGllci4KKyAqLworc3RhdGljIHZvaWQgdXNidmlkZW9fUmVwb3J0U3RhdGlzdGljcyhjb25zdCBzdHJ1Y3QgdXZkICp1dmQpCit7CisJaWYgKCh1dmQgIT0gTlVMTCkgJiYgKHV2ZC0+c3RhdHMudXJiX2NvdW50ID4gMCkpIHsKKwkJdW5zaWduZWQgbG9uZyBhbGxQYWNrZXRzLCBiYWRQYWNrZXRzLCBnb29kUGFja2V0cywgcGVyY2VudDsKKwkJYWxsUGFja2V0cyA9IHV2ZC0+c3RhdHMudXJiX2NvdW50ICogQ0FNRVJBX1VSQl9GUkFNRVM7CisJCWJhZFBhY2tldHMgPSB1dmQtPnN0YXRzLmlzb19za2lwX2NvdW50ICsgdXZkLT5zdGF0cy5pc29fZXJyX2NvdW50OworCQlnb29kUGFja2V0cyA9IGFsbFBhY2tldHMgLSBiYWRQYWNrZXRzOworCQkvKiBDYWxjdWxhdGUgcGVyY2VudGFnZSB3aXNlbHksIHJlbWVtYmVyIGludGVnZXIgbGltaXRzICovCisJCWFzc2VydChhbGxQYWNrZXRzICE9IDApOworCQlpZiAoZ29vZFBhY2tldHMgPCAoKCh1bnNpZ25lZCBsb25nKS0xKS8xMDApKQorCQkJcGVyY2VudCA9ICgxMDAgKiBnb29kUGFja2V0cykgLyBhbGxQYWNrZXRzOworCQllbHNlCisJCQlwZXJjZW50ID0gZ29vZFBhY2tldHMgLyAoYWxsUGFja2V0cyAvIDEwMCk7CisJCWluZm8oIlBhY2tldCBTdGF0aXN0aWNzOiBUb3RhbD0lbHUuIEVtcHR5PSVsdS4gVXNhZ2U9JWx1JSUiLAorCQkgICAgIGFsbFBhY2tldHMsIGJhZFBhY2tldHMsIHBlcmNlbnQpOworCQlpZiAodXZkLT5pc29fcGFja2V0X2xlbiA+IDApIHsKKwkJCXVuc2lnbmVkIGxvbmcgYWxsQnl0ZXMsIHhmZXJCeXRlczsKKwkJCWNoYXIgbXVsdGlwbGllciA9ICcgJzsKKwkJCWFsbEJ5dGVzID0gYWxsUGFja2V0cyAqIHV2ZC0+aXNvX3BhY2tldF9sZW47CisJCQl4ZmVyQnl0ZXMgPSB1dmQtPnN0YXRzLmRhdGFfY291bnQ7CisJCQlhc3NlcnQoYWxsQnl0ZXMgIT0gMCk7CisJCQlpZiAoeGZlckJ5dGVzIDwgKCgodW5zaWduZWQgbG9uZyktMSkvMTAwKSkKKwkJCQlwZXJjZW50ID0gKDEwMCAqIHhmZXJCeXRlcykgLyBhbGxCeXRlczsKKwkJCWVsc2UKKwkJCQlwZXJjZW50ID0geGZlckJ5dGVzIC8gKGFsbEJ5dGVzIC8gMTAwKTsKKwkJCS8qIFNjYWxlIHhmZXJCeXRlcyBmb3IgZWFzeSByZWFkaW5nICovCisJCQlpZiAoeGZlckJ5dGVzID4gMTAqMTAyNCkgeworCQkJCXhmZXJCeXRlcyAvPSAxMDI0OworCQkJCW11bHRpcGxpZXIgPSAnSyc7CisJCQkJaWYgKHhmZXJCeXRlcyA+IDEwKjEwMjQpIHsKKwkJCQkJeGZlckJ5dGVzIC89IDEwMjQ7CisJCQkJCW11bHRpcGxpZXIgPSAnTSc7CisJCQkJCWlmICh4ZmVyQnl0ZXMgPiAxMCoxMDI0KSB7CisJCQkJCQl4ZmVyQnl0ZXMgLz0gMTAyNDsKKwkJCQkJCW11bHRpcGxpZXIgPSAnRyc7CisJCQkJCQlpZiAoeGZlckJ5dGVzID4gMTAqMTAyNCkgeworCQkJCQkJCXhmZXJCeXRlcyAvPSAxMDI0OworCQkJCQkJCW11bHRpcGxpZXIgPSAnVCc7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpbmZvKCJUcmFuc2ZlciBTdGF0aXN0aWNzOiBUcmFuc2ZlcnJlZD0lbHUlY0IgVXNhZ2U9JWx1JSUiLAorCQkJICAgICB4ZmVyQnl0ZXMsIG11bHRpcGxpZXIsIHBlcmNlbnQpOworCQl9CisJfQorfQorCisvKgorICogdXNidmlkZW9fVGVzdFBhdHRlcm4oKQorICoKKyAqIFByb2NlZHVyZSBmb3JtcyBhIHRlc3QgcGF0dGVybiAoeWVsbG93IGdyaWQgb24gYmx1ZSBiYWNrZ3JvdW5kKS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogZnVsbGZyYW1lOiBpZiBUUlVFIHRoZW4gZW50aXJlIGZyYW1lIGlzIGZpbGxlZCwgb3RoZXJ3aXNlIHRoZSBwcm9jZWR1cmUKKyAqCSAgICAgIGNvbnRpbnVlcyBmcm9tIHRoZSBjdXJyZW50IHNjYW5saW5lLgorICogcG1vZGUgICAgICAwOiBmaWxsIHRoZSBmcmFtZSB3aXRoIHNvbGlkIGJsdWUgY29sb3IgKGxpa2Ugb24gVkNSIG9yIFRWKQorICoJICAgICAgMTogRHJhdyBhIGNvbG9yZWQgZ3JpZAorICoKKyAqIEhpc3Rvcnk6CisgKiAwMS1GZWItMjAwMCBDcmVhdGVkLgorICovCit2b2lkIHVzYnZpZGVvX1Rlc3RQYXR0ZXJuKHN0cnVjdCB1dmQgKnV2ZCwgaW50IGZ1bGxmcmFtZSwgaW50IHBtb2RlKQoreworCXN0cnVjdCB1c2J2aWRlb19mcmFtZSAqZnJhbWU7CisJaW50IG51bV9jZWxsID0gMDsKKwlpbnQgc2Nhbl9sZW5ndGggPSAwOworCXN0YXRpYyBpbnQgbnVtX3Bhc3MgPSAwOworCisJaWYgKHV2ZCA9PSBOVUxMKSB7CisJCWVycigiJXM6IHV2ZCA9PSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHV2ZC0+Y3VyZnJhbWUgPCAwKSB8fCAodXZkLT5jdXJmcmFtZSA+PSBVU0JWSURFT19OVU1GUkFNRVMpKSB7CisJCWVycigiJXM6IHV2ZC0+Y3VyZnJhbWU9JWQuIiwgX19GVU5DVElPTl9fLCB1dmQtPmN1cmZyYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdyYWIgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKwlmcmFtZSA9ICZ1dmQtPmZyYW1lW3V2ZC0+Y3VyZnJhbWVdOworCisJLyogT3B0aW9uYWxseSBzdGFydCBhdCB0aGUgYmVnaW5uaW5nICovCisJaWYgKGZ1bGxmcmFtZSkgeworCQlmcmFtZS0+Y3VybGluZSA9IDA7CisJCWZyYW1lLT5zZXFSZWFkX0xlbmd0aCA9IDA7CisJfQorI2lmIDAKKwl7CS8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSAqLworCQljaGFyIHRtcFsyMF07CisJCXVzYnZpZGVvX1ZpZGVvc2l6ZVRvU3RyaW5nKHRtcCwgc2l6ZW9mKHRtcCksIGZyYW1lLT5yZXF1ZXN0KTsKKwkJaW5mbygidGVzdHBhdHRlcm46IGZyYW1lPSVzIiwgdG1wKTsKKwl9CisjZW5kaWYKKwkvKiBGb3JtIGV2ZXJ5IHNjYW4gbGluZSAqLworCWZvciAoOyBmcmFtZS0+Y3VybGluZSA8IFZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KTsgZnJhbWUtPmN1cmxpbmUrKykgeworCQlpbnQgaTsKKwkJdW5zaWduZWQgY2hhciAqZiA9IGZyYW1lLT5kYXRhICsKKwkJCShWSURFT1NJWkVfWChmcmFtZS0+cmVxdWVzdCkgKiBWNExfQllURVNfUEVSX1BJWEVMICogZnJhbWUtPmN1cmxpbmUpOworCQlmb3IgKGk9MDsgaSA8IFZJREVPU0laRV9YKGZyYW1lLT5yZXF1ZXN0KTsgaSsrKSB7CisJCQl1bnNpZ25lZCBjaGFyIGNiPTB4ODA7CisJCQl1bnNpZ25lZCBjaGFyIGNnID0gMDsKKwkJCXVuc2lnbmVkIGNoYXIgY3IgPSAwOworCisJCQlpZiAocG1vZGUgPT0gMSkgeworCQkJCWlmIChmcmFtZS0+Y3VybGluZSAlIDMyID09IDApCisJCQkJCWNiID0gMCwgY2cgPSBjciA9IDB4RkY7CisJCQkJZWxzZSBpZiAoaSAlIDMyID09IDApIHsKKwkJCQkJaWYgKGZyYW1lLT5jdXJsaW5lICUgMzIgPT0gMSkKKwkJCQkJCW51bV9jZWxsKys7CisJCQkJCWNiID0gMCwgY2cgPSBjciA9IDB4RkY7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2IgPSAoKG51bV9jZWxsKjcpICsgbnVtX3Bhc3MpICYgMHhGRjsKKwkJCQkJY2cgPSAoKG51bV9jZWxsKjUpICsgbnVtX3Bhc3MqMikgJiAweEZGOworCQkJCQljciA9ICgobnVtX2NlbGwqMykgKyBudW1fcGFzcyozKSAmIDB4RkY7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBKdXN0IHRoZSBibHVlIHNjcmVlbiAqLworCQkJfQorCQkJCQorCQkJKmYrKyA9IGNiOworCQkJKmYrKyA9IGNnOworCQkJKmYrKyA9IGNyOworCQkJc2Nhbl9sZW5ndGggKz0gMzsKKwkJfQorCX0KKworCWZyYW1lLT5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9Eb25lOworCWZyYW1lLT5zZXFSZWFkX0xlbmd0aCArPSBzY2FuX2xlbmd0aDsKKwkrK251bV9wYXNzOworCisJLyogV2UgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHksIHJlZ2FyZGxlc3Mgb2YgRkxBR1NfT1ZFUkxBWV9TVEFUUyAqLworCXVzYnZpZGVvX092ZXJsYXlTdGF0cyh1dmQsIGZyYW1lKTsKK30KKworRVhQT1JUX1NZTUJPTCh1c2J2aWRlb19UZXN0UGF0dGVybik7CisKKworI2lmZGVmIERFQlVHCisvKgorICogdXNidmlkZW9fSGV4RHVtcCgpCisgKgorICogQSBkZWJ1Z2dpbmcgdG9vbC4gUHJpbnRzIGhleCBkdW1wcy4KKyAqCisgKiBIaXN0b3J5OgorICogMjktSnVsLTIwMDAgQWRkZWQgcHJpbnRpbmcgb2Ygb2Zmc2V0cy4KKyAqLwordm9pZCB1c2J2aWRlb19IZXhEdW1wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJY29uc3QgaW50IGJ5dGVzX3Blcl9saW5lID0gMzI7CisJY2hhciB0bXBbMTI4XTsgLyogMzIqMyArIDUgKi8KKwlpbnQgaSwgazsKKworCWZvciAoaT1rPTA7IGxlbiA+IDA7IGkrKywgbGVuLS0pIHsKKwkJaWYgKGkgPiAwICYmICgoaSAlIGJ5dGVzX3Blcl9saW5lKSA9PSAwKSkgeworCQkJcHJpbnRrKCIlc1xuIiwgdG1wKTsKKwkJCWs9MDsKKwkJfQorCQlpZiAoKGkgJSBieXRlc19wZXJfbGluZSkgPT0gMCkKKwkJCWsgKz0gc3ByaW50ZigmdG1wW2tdLCAiJTA0eDogIiwgaSk7CisJCWsgKz0gc3ByaW50ZigmdG1wW2tdLCAiJTAyeCAiLCBkYXRhW2ldKTsKKwl9CisJaWYgKGsgPiAwKQorCQlwcmludGsoIiVzXG4iLCB0bXApOworfQorCitFWFBPUlRfU1lNQk9MKHVzYnZpZGVvX0hleER1bXApOworCisjZW5kaWYKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogWFhYOiB0aGlzIHBpZWNlIG9mIGNyYXAgcmVhbGx5IHdhbnRzIHNvbWUgZXJyb3IgaGFuZGxpbmcuLiAqLworc3RhdGljIHZvaWQgdXNidmlkZW9fQ2xpZW50SW5jTW9kQ291bnQoc3RydWN0IHV2ZCAqdXZkKQoreworCWlmICh1dmQgPT0gTlVMTCkgeworCQllcnIoIiVzOiB1dmQgPT0gTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJaWYgKHV2ZC0+aGFuZGxlID09IE5VTEwpIHsKKwkJZXJyKCIlczogdXZkLT5oYW5kbGUgPT0gTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJaWYgKHV2ZC0+aGFuZGxlLT5tZF9tb2R1bGUgPT0gTlVMTCkgeworCQllcnIoIiVzOiB1dmQtPmhhbmRsZS0+bWRfbW9kdWxlID09IE5VTEwiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCWlmICghdHJ5X21vZHVsZV9nZXQodXZkLT5oYW5kbGUtPm1kX21vZHVsZSkpIHsKKwkJZXJyKCIlczogdHJ5X21vZHVsZV9nZXQoKSA9PSAwIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgdXNidmlkZW9fQ2xpZW50RGVjTW9kQ291bnQoc3RydWN0IHV2ZCAqdXZkKQoreworCWlmICh1dmQgPT0gTlVMTCkgeworCQllcnIoIiVzOiB1dmQgPT0gTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJaWYgKHV2ZC0+aGFuZGxlID09IE5VTEwpIHsKKwkJZXJyKCIlczogdXZkLT5oYW5kbGUgPT0gTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJaWYgKHV2ZC0+aGFuZGxlLT5tZF9tb2R1bGUgPT0gTlVMTCkgeworCQllcnIoIiVzOiB1dmQtPmhhbmRsZS0+bWRfbW9kdWxlID09IE5VTEwiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCW1vZHVsZV9wdXQodXZkLT5oYW5kbGUtPm1kX21vZHVsZSk7Cit9CisKK2ludCB1c2J2aWRlb19yZWdpc3RlcigKKwlzdHJ1Y3QgdXNidmlkZW8gKipwQ2FtcywKKwljb25zdCBpbnQgbnVtX2NhbXMsCisJY29uc3QgaW50IG51bV9leHRyYSwKKwljb25zdCBjaGFyICpkcml2ZXJOYW1lLAorCWNvbnN0IHN0cnVjdCB1c2J2aWRlb19jYiAqY2JUYmwsCisJc3RydWN0IG1vZHVsZSAqbWQsCisJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkX3RhYmxlKQoreworCXN0cnVjdCB1c2J2aWRlbyAqY2FtczsKKwlpbnQgaSwgYmFzZV9zaXplLCByZXN1bHQ7CisKKwkvKiBDaGVjayBwYXJhbWV0ZXJzIGZvciBzYW5pdHkgKi8KKwlpZiAoKG51bV9jYW1zIDw9IDApIHx8IChwQ2FtcyA9PSBOVUxMKSB8fCAoY2JUYmwgPT0gTlVMTCkpIHsKKwkJZXJyKCIlczogSWxsZWdhbCBjYWxsIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgcmVnaXN0cmF0aW9uIGNhbGxiYWNrIC0gbXVzdCBiZSBzZXQhICovCisJaWYgKGNiVGJsLT5wcm9iZSA9PSBOVUxMKSB7CisJCWVycigiJXM6IHByb2JlKCkgaXMgcmVxdWlyZWQhIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmFzZV9zaXplID0gbnVtX2NhbXMgKiBzaXplb2Yoc3RydWN0IHV2ZCkgKyBzaXplb2Yoc3RydWN0IHVzYnZpZGVvKTsKKwljYW1zID0gKHN0cnVjdCB1c2J2aWRlbyAqKSBrbWFsbG9jKGJhc2Vfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhbXMgPT0gTlVMTCkgeworCQllcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZC4gYnl0ZXMgZm9yIHVzYnZpZGVvIHN0cnVjdCIsIGJhc2Vfc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkYmcoIiVzOiBBbGxvY2F0ZWQgJCVwICglZC4gYnl0ZXMpIGZvciAlZC4gY2FtZXJhcyIsCisJICAgIF9fRlVOQ1RJT05fXywgY2FtcywgYmFzZV9zaXplLCBudW1fY2Ftcyk7CisJbWVtc2V0KGNhbXMsIDAsIGJhc2Vfc2l6ZSk7CisKKwkvKiBDb3B5IGNhbGxiYWNrcywgYXBwbHkgZGVmYXVsdHMgZm9yIHRob3NlIHRoYXQgYXJlIG5vdCBzZXQgKi8KKwltZW1tb3ZlKCZjYW1zLT5jYiwgY2JUYmwsIHNpemVvZihjYW1zLT5jYikpOworCWlmIChjYW1zLT5jYi5nZXRGcmFtZSA9PSBOVUxMKQorCQljYW1zLT5jYi5nZXRGcmFtZSA9IHVzYnZpZGVvX0dldEZyYW1lOworCWlmIChjYW1zLT5jYi5kaXNjb25uZWN0ID09IE5VTEwpCisJCWNhbXMtPmNiLmRpc2Nvbm5lY3QgPSB1c2J2aWRlb19EaXNjb25uZWN0OworCWlmIChjYW1zLT5jYi5zdGFydERhdGFQdW1wID09IE5VTEwpCisJCWNhbXMtPmNiLnN0YXJ0RGF0YVB1bXAgPSB1c2J2aWRlb19TdGFydERhdGFQdW1wOworCWlmIChjYW1zLT5jYi5zdG9wRGF0YVB1bXAgPT0gTlVMTCkKKwkJY2Ftcy0+Y2Iuc3RvcERhdGFQdW1wID0gdXNidmlkZW9fU3RvcERhdGFQdW1wOworCisJY2Ftcy0+bnVtX2NhbWVyYXMgPSBudW1fY2FtczsKKwljYW1zLT5jYW0gPSAoc3RydWN0IHV2ZCAqKSAmY2Ftc1sxXTsKKwljYW1zLT5tZF9tb2R1bGUgPSBtZDsKKwlpZiAoY2Ftcy0+bWRfbW9kdWxlID09IE5VTEwpCisJCXdhcm4oIiVzOiBtb2R1bGUgPT0gTlVMTCEiLCBfX0ZVTkNUSU9OX18pOworCWluaXRfTVVURVgoJmNhbXMtPmxvY2spOwkvKiB0byAxID09IGF2YWlsYWJsZSAqLworCisJZm9yIChpID0gMDsgaSA8IG51bV9jYW1zOyBpKyspIHsKKwkJc3RydWN0IHV2ZCAqdXAgPSAmY2Ftcy0+Y2FtW2ldOworCisJCXVwLT5oYW5kbGUgPSBjYW1zOworCisJCS8qIEFsbG9jYXRlIHVzZXJfZGF0YSBzZXBhcmF0ZWx5IGJlY2F1c2Ugb2Yga21hbGxvYydzIGxpbWl0cyAqLworCQlpZiAobnVtX2V4dHJhID4gMCkgeworCQkJdXAtPnVzZXJfc2l6ZSA9IG51bV9jYW1zICogbnVtX2V4dHJhOworCQkJdXAtPnVzZXJfZGF0YSA9IChjaGFyICopIGttYWxsb2ModXAtPnVzZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAodXAtPnVzZXJfZGF0YSA9PSBOVUxMKSB7CisJCQkJZXJyKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIHVzZXJfZGF0YSAoJWQuIGJ5dGVzKSIsCisJCQkJICAgIF9fRlVOQ1RJT05fXywgdXAtPnVzZXJfc2l6ZSk7CisJCQkJd2hpbGUgKGkpIHsKKwkJCQkJdXAgPSAmY2Ftcy0+Y2FtWy0taV07CisJCQkJCWtmcmVlKHVwLT51c2VyX2RhdGEpOworCQkJCX0KKwkJCQlrZnJlZShjYW1zKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWRiZygiJXM6IEFsbG9jYXRlZCBjYW1zWyVkXS51c2VyX2RhdGE9JCVwICglZC4gYnl0ZXMpIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBpLCB1cC0+dXNlcl9kYXRhLCB1cC0+dXNlcl9zaXplKTsKKwkJfQorCX0KKworCS8qCisJICogUmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggVVNCIHN0YWNrLgorCSAqLworCXN0cmNweShjYW1zLT5kcnZOYW1lLCAoZHJpdmVyTmFtZSAhPSBOVUxMKSA/IGRyaXZlck5hbWUgOiAiVW5rbm93biIpOworCWNhbXMtPnVzYmRydi5uYW1lID0gY2Ftcy0+ZHJ2TmFtZTsKKwljYW1zLT51c2JkcnYucHJvYmUgPSBjYW1zLT5jYi5wcm9iZTsKKwljYW1zLT51c2JkcnYuZGlzY29ubmVjdCA9IGNhbXMtPmNiLmRpc2Nvbm5lY3Q7CisJY2Ftcy0+dXNiZHJ2LmlkX3RhYmxlID0gaWRfdGFibGU7CisKKwkvKgorCSAqIFVwZGF0ZSBnbG9iYWwgaGFuZGxlIHRvIHVzYnZpZGVvLiBUaGlzIGlzIHZlcnkgaW1wb3J0YW50CisJICogYmVjYXVzZSBwcm9iZSgpIGNhbiBiZSBjYWxsZWQgYmVmb3JlIHVzYl9yZWdpc3RlcigpIHJldHVybnMuCisJICogSWYgdGhlIGhhbmRsZSBpcyBub3QgeWV0IHVwZGF0ZWQgdGhlbiB0aGUgcHJvYmUoKSB3aWxsIGZhaWwuCisJICovCisJKnBDYW1zID0gY2FtczsKKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmNhbXMtPnVzYmRydik7CisJaWYgKHJlc3VsdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NhbXM7IGkrKykgeworCQkJc3RydWN0IHV2ZCAqdXAgPSAmY2Ftcy0+Y2FtW2ldOworCQkJa2ZyZWUodXAtPnVzZXJfZGF0YSk7CisJCX0KKwkJa2ZyZWUoY2Ftcyk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworRVhQT1JUX1NZTUJPTCh1c2J2aWRlb19yZWdpc3Rlcik7CisKKy8qCisgKiB1c2J2aWRlb19EZXJlZ2lzdGVyKCkKKyAqCisgKiBQcm9jZWR1cmUgZnJlZXMgYWxsIHVzYnZpZGVvIGFuZCB1c2VyIGRhdGEgc3RydWN0dXJlcy4gQmUgd2FybmVkIHRoYXQKKyAqIGlmIHlvdSBoYWQgc29tZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY29tcG9uZW50cyBpbiAtPnVzZXIgZmllbGQgdGhlbgorICogeW91IHNob3VsZCBmcmVlIHRoZW0gYmVmb3JlIGNhbGxpbmcgaGVyZS4KKyAqLwordm9pZCB1c2J2aWRlb19EZXJlZ2lzdGVyKHN0cnVjdCB1c2J2aWRlbyAqKnBDYW1zKQoreworCXN0cnVjdCB1c2J2aWRlbyAqY2FtczsKKwlpbnQgaTsKKworCWlmIChwQ2FtcyA9PSBOVUxMKSB7CisJCWVycigiJXM6IHBDYW1zID09IE5VTEwiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCWNhbXMgPSAqcENhbXM7CisJaWYgKGNhbXMgPT0gTlVMTCkgeworCQllcnIoIiVzOiBjYW1zID09IE5VTEwiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJZGJnKCIlczogRGVyZWdpc3RlcmluZyAlcyBkcml2ZXIuIiwgX19GVU5DVElPTl9fLCBjYW1zLT5kcnZOYW1lKTsKKwl1c2JfZGVyZWdpc3RlcigmY2Ftcy0+dXNiZHJ2KTsKKworCWRiZygiJXM6IERlYWxsb2NhdGluZyBjYW1zPSQlcCAoJWQuIGNhbWVyYXMpIiwgX19GVU5DVElPTl9fLCBjYW1zLCBjYW1zLT5udW1fY2FtZXJhcyk7CisJZm9yIChpPTA7IGkgPCBjYW1zLT5udW1fY2FtZXJhczsgaSsrKSB7CisJCXN0cnVjdCB1dmQgKnVwID0gJmNhbXMtPmNhbVtpXTsKKwkJaW50IHdhcm5pbmcgPSAwOworCisJCWlmICh1cC0+dXNlcl9kYXRhICE9IE5VTEwpIHsKKwkJCWlmICh1cC0+dXNlcl9zaXplIDw9IDApCisJCQkJKyt3YXJuaW5nOworCQl9IGVsc2UgeworCQkJaWYgKHVwLT51c2VyX3NpemUgPiAwKQorCQkJCSsrd2FybmluZzsKKwkJfQorCQlpZiAod2FybmluZykgeworCQkJZXJyKCIlczogV2FybmluZzogdXNlcl9kYXRhPSQlcCB1c2VyX3NpemU9JWQuIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18sIHVwLT51c2VyX2RhdGEsIHVwLT51c2VyX3NpemUpOworCQl9IGVsc2UgeworCQkJZGJnKCIlczogRnJlZWluZyAlZC4gJCVwLT51c2VyX2RhdGE9JCVwIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18sIGksIHVwLCB1cC0+dXNlcl9kYXRhKTsKKwkJCWtmcmVlKHVwLT51c2VyX2RhdGEpOworCQl9CisJfQorCS8qIFdob2xlIGFycmF5IHdhcyBhbGxvY2F0ZWQgaW4gb25lIGNodW5rICovCisJZGJnKCIlczogRnJlZWQgJWQgdXZkIHN0cnVjdHVyZXMiLAorCSAgICBfX0ZVTkNUSU9OX18sIGNhbXMtPm51bV9jYW1lcmFzKTsKKwlrZnJlZShjYW1zKTsKKwkqcENhbXMgPSBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MKHVzYnZpZGVvX0RlcmVnaXN0ZXIpOworCisvKgorICogdXNidmlkZW9fRGlzY29ubmVjdCgpCisgKgorICogVGhpcyBwcm9jZWR1cmUgc3RvcHMgYWxsIGRyaXZlciBhY3Rpdml0eS4gRGVhbGxvY2F0aW9uIG9mCisgKiB0aGUgaW50ZXJmYWNlLXByaXZhdGUgc3RydWN0dXJlIChwb2ludGVkIGJ5ICdwdHInKSBpcyBkb25lIG5vdworICogKGlmIHdlIGRvbid0IGhhdmUgYW55IG9wZW4gZmlsZXMpIG9yIGxhdGVyLCB3aGVuIHRob3NlIGZpbGVzCisgKiBhcmUgY2xvc2VkLiBBZnRlciB0aGF0IGRyaXZlciBzaG91bGQgYmUgcmVtb3ZhYmxlLgorICoKKyAqIFRoaXMgY29kZSBoYW5kbGVzIHN1cnByaXNlIHJlbW92YWwuIFRoZSB1dmQtPnVzZXIgaXMgYSBjb3VudGVyIHdoaWNoCisgKiBpbmNyZW1lbnRzIG9uIG9wZW4oKSBhbmQgZGVjcmVtZW50cyBvbiBjbG9zZSgpLiBJZiB3ZSBzZWUgaGVyZSB0aGF0CisgKiB0aGlzIGNvdW50ZXIgaXMgbm90IDAgdGhlbiB3ZSBoYXZlIGEgY2xpZW50IHdobyBzdGlsbCBoYXMgdXMgb3BlbmVkLgorICogV2Ugc2V0IHV2ZC0+cmVtb3ZlX3BlbmRpbmcgZmxhZyBhcyBlYXJseSBhcyBwb3NzaWJsZSwgYW5kIGFmdGVyIHRoYXQKKyAqIGFsbCBhY2Nlc3MgdG8gdGhlIGNhbWVyYSB3aWxsIGdyYWNlZnVsbHkgZmFpbC4gVGhlc2UgZmFpbHVyZXMgc2hvdWxkCisgKiBwcm9tcHQgY2xpZW50IHRvIChldmVudHVhbGx5KSBjbG9zZSB0aGUgdmlkZW8gZGV2aWNlLCBhbmQgdGhlbiAtIGluCisgKiB1c2J2aWRlb192NGxfY2xvc2UoKSAtIHdlIGRlY3JlbWVudCB1dmQtPnV2ZF91c2VkIGFuZCB1c2FnZSBjb3VudGVyLgorICoKKyAqIEhpc3Rvcnk6CisgKiAyMi1KYW4tMjAwMCBBZGRlZCBwb2xsaW5nIG9mIE1PRF9JTl9VU0UgdG8gZGVsYXkgcmVtb3ZhbCB1bnRpbCBhbGwgdXNlcnMgZ29uZS4KKyAqIDI3LUphbi0yMDAwIFJld29ya2VkIHRvIGFsbG93IHBlbmRpbmcgZGlzY29ubmVjdHM7IHNlZSB4eHhfY2xvc2UoKQorICogMjQtTWF5LTIwMDAgQ29ycmVjdGVkIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb24gKE1PRF94eHhfVVNFX0NPVU5UKS4KKyAqIDE5LU9jdC0yMDAwIE1vdmVkIHRvIHVzYnZpZGVvIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgdXNidmlkZW9fRGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXZkICp1dmQgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKwlpbnQgaTsKKworCWlmICh1dmQgPT0gTlVMTCkgeworCQllcnIoIiVzKCQlcCk6IElsbGVnYWwgY2FsbC4iLCBfX0ZVTkNUSU9OX18sIGludGYpOworCQlyZXR1cm47CisJfQorCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CisKKwl1c2J2aWRlb19DbGllbnRJbmNNb2RDb3VudCh1dmQpOworCWlmICh1dmQtPmRlYnVnID4gMCkKKwkJaW5mbygiJXMoJXAuKSIsIF9fRlVOQ1RJT05fXywgaW50Zik7CisKKwlkb3duKCZ1dmQtPmxvY2spOworCXV2ZC0+cmVtb3ZlX3BlbmRpbmcgPSAxOyAvKiBOb3cgYWxsIElTTyBkYXRhIHdpbGwgYmUgaWdub3JlZCAqLworCisJLyogQXQgdGhpcyB0aW1lIHdlIGFzayB0byBjYW5jZWwgb3V0c3RhbmRpbmcgVVJCcyAqLworCUdFVF9DQUxMQkFDSyh1dmQsIHN0b3BEYXRhUHVtcCkodXZkKTsKKworCWZvciAoaT0wOyBpIDwgVVNCVklERU9fTlVNU0JVRjsgaSsrKQorCQl1c2JfZnJlZV91cmIodXZkLT5zYnVmW2ldLnVyYik7CisKKwl1c2JfcHV0X2Rldih1dmQtPmRldik7CisJdXZkLT5kZXYgPSBOVUxMOyAgICAJICAgIC8qIFVTQiBkZXZpY2UgaXMgbm8gbW9yZSAqLworCisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnV2ZC0+dmRldik7CisJaWYgKHV2ZC0+ZGVidWcgPiAwKQorCQlpbmZvKCIlczogVmlkZW8gdW5yZWdpc3RlcmVkLiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAodXZkLT51c2VyKQorCQlpbmZvKCIlczogSW4gdXNlLCBkaXNjb25uZWN0IHBlbmRpbmcuIiwgX19GVU5DVElPTl9fKTsKKwllbHNlCisJCXVzYnZpZGVvX0NhbWVyYVJlbGVhc2UodXZkKTsKKwl1cCgmdXZkLT5sb2NrKTsKKwlpbmZvKCJVU0IgY2FtZXJhIGRpc2Nvbm5lY3RlZC4iKTsKKworCXVzYnZpZGVvX0NsaWVudERlY01vZENvdW50KHV2ZCk7Cit9CisKKy8qCisgKiB1c2J2aWRlb19DYW1lcmFSZWxlYXNlKCkKKyAqCisgKiBUaGlzIGNvZGUgZG9lcyBmaW5hbCByZWxlYXNlIG9mIHV2ZC4gVGhpcyBoYXBwZW5zCisgKiBhZnRlciB0aGUgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCAtYW5kLSBhbGwgY2xpZW50cworICogY2xvc2VkIHRoZWlyIGZpbGVzLgorICoKKyAqIEhpc3Rvcnk6CisgKiAyNy1KYW4tMjAwMCBDcmVhdGVkLgorICovCitzdGF0aWMgdm9pZCB1c2J2aWRlb19DYW1lcmFSZWxlYXNlKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpZiAodXZkID09IE5VTEwpIHsKKwkJZXJyKCIlczogSWxsZWdhbCBjYWxsIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCVJpbmdRdWV1ZV9GcmVlKCZ1dmQtPmRwKTsKKwlpZiAoVkFMSURfQ0FMTEJBQ0sodXZkLCB1c2VyRnJlZSkpCisJCUdFVF9DQUxMQkFDSyh1dmQsIHVzZXJGcmVlKSh1dmQpOworCXV2ZC0+dXZkX3VzZWQgPSAwOwkvKiBUaGlzIGlzIGF0b21pYywgbm8gbmVlZCB0byB0YWtlIG11dGV4ICovCit9CisKKy8qCisgKiB1c2J2aWRlb19maW5kX3N0cnVjdCgpCisgKgorICogVGhpcyBjb2RlIHNlYXJjaGVzIHRoZSBhcnJheSBvZiBwcmVhbGxvY2F0ZWQgKHN0YXRpYykgc3RydWN0dXJlcworICogYW5kIHJldHVybnMgaW5kZXggb2YgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IGluIHVzZS4gUmV0dXJucyAtMQorICogaWYgdGhlcmUgYXJlIG5vIGZyZWUgc3RydWN0dXJlcy4KKyAqCisgKiBIaXN0b3J5OgorICogMjctSmFuLTIwMDAgQ3JlYXRlZC4KKyAqLworc3RhdGljIGludCB1c2J2aWRlb19maW5kX3N0cnVjdChzdHJ1Y3QgdXNidmlkZW8gKmNhbXMpCit7CisJaW50IHUsIHJ2ID0gLTE7CisKKwlpZiAoY2FtcyA9PSBOVUxMKSB7CisJCWVycigiTm8gdXNidmlkZW8gaGFuZGxlPyIpOworCQlyZXR1cm4gLTE7CisJfQorCWRvd24oJmNhbXMtPmxvY2spOworCWZvciAodSA9IDA7IHUgPCBjYW1zLT5udW1fY2FtZXJhczsgdSsrKSB7CisJCXN0cnVjdCB1dmQgKnV2ZCA9ICZjYW1zLT5jYW1bdV07CisJCWlmICghdXZkLT51dmRfdXNlZCkgLyogVGhpcyBvbmUgaXMgZnJlZSAqLworCQl7CisJCQl1dmQtPnV2ZF91c2VkID0gMTsJLyogSW4gdXNlIG5vdyAqLworCQkJaW5pdF9NVVRFWCgmdXZkLT5sb2NrKTsJLyogdG8gMSA9PSBhdmFpbGFibGUgKi8KKwkJCXV2ZC0+ZGV2ID0gTlVMTDsKKwkJCXJ2ID0gdTsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZjYW1zLT5sb2NrKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYnZpZGVvX2ZvcHMgPSB7CisJLm93bmVyID0gIFRISVNfTU9EVUxFLAorCS5vcGVuID0gICB1c2J2aWRlb192NGxfb3BlbiwKKwkucmVsZWFzZSA9dXNidmlkZW9fdjRsX2Nsb3NlLAorCS5yZWFkID0gICB1c2J2aWRlb192NGxfcmVhZCwKKwkubW1hcCA9ICAgdXNidmlkZW9fdjRsX21tYXAsCisJLmlvY3RsID0gIHVzYnZpZGVvX3Y0bF9pb2N0bCwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorfTsKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHVzYnZpZGVvX3RlbXBsYXRlID0geworCS5vd25lciA9ICAgICAgVEhJU19NT0RVTEUsCisJLnR5cGUgPSAgICAgICBWSURfVFlQRV9DQVBUVVJFLAorCS5oYXJkd2FyZSA9ICAgVklEX0hBUkRXQVJFX0NQSUEsCisJLmZvcHMgPSAgICAgICAmdXNidmlkZW9fZm9wcywKK307CisKK3N0cnVjdCB1dmQgKnVzYnZpZGVvX0FsbG9jYXRlRGV2aWNlKHN0cnVjdCB1c2J2aWRlbyAqY2FtcykKK3sKKwlpbnQgaSwgZGV2bnVtOworCXN0cnVjdCB1dmQgKnV2ZCA9IE5VTEw7CisKKwlpZiAoY2FtcyA9PSBOVUxMKSB7CisJCWVycigiTm8gdXNidmlkZW8gaGFuZGxlPyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkZXZudW0gPSB1c2J2aWRlb19maW5kX3N0cnVjdChjYW1zKTsKKwlpZiAoZGV2bnVtID09IC0xKSB7CisJCWVycigiSUJNIFVTQiBjYW1lcmEgZHJpdmVyOiBUb28gbWFueSBkZXZpY2VzISIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJdXZkID0gJmNhbXMtPmNhbVtkZXZudW1dOworCWRiZygiRGV2aWNlIGVudHJ5ICMlZC4gYXQgJCVwIiwgZGV2bnVtLCB1dmQpOworCisJLyogTm90IHJlbHlpbmcgdXBvbiBjYWxsZXIgd2UgaW5jcmVhc2UgbW9kdWxlIGNvdW50ZXIgb3Vyc2VsdmVzICovCisJdXNidmlkZW9fQ2xpZW50SW5jTW9kQ291bnQodXZkKTsKKworCWRvd24oJnV2ZC0+bG9jayk7CisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJdXZkLT5zYnVmW2ldLnVyYiA9IHVzYl9hbGxvY191cmIoRlJBTUVTX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHV2ZC0+c2J1ZltpXS51cmIgPT0gTlVMTCkgeworCQkJZXJyKCJ1c2JfYWxsb2NfdXJiKCVkLikgZmFpbGVkLiIsIEZSQU1FU19QRVJfREVTQyk7CisJCQl1dmQtPnV2ZF91c2VkID0gMDsKKwkJCXV2ZCA9IE5VTEw7CisJCQlnb3RvIGFsbG9jYXRlX2RvbmU7CisJCX0KKwl9CisJdXZkLT51c2VyPTA7CisJdXZkLT5yZW1vdmVfcGVuZGluZyA9IDA7CisJdXZkLT5sYXN0X2Vycm9yID0gMDsKKwlSaW5nUXVldWVfSW5pdGlhbGl6ZSgmdXZkLT5kcCk7CisKKwkvKiBJbml0aWFsaXplIHZpZGVvIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwl1dmQtPnZkZXYgPSB1c2J2aWRlb190ZW1wbGF0ZTsKKwlzcHJpbnRmKHV2ZC0+dmRldi5uYW1lLCAiJS4yMHMgVVNCIENhbWVyYSIsIGNhbXMtPmRydk5hbWUpOworCS8qCisJICogVGhlIGNsaWVudCBpcyBmcmVlIHRvIG92ZXJ3cml0ZSB0aG9zZSBiZWNhdXNlIHdlCisJICogcmV0dXJuIGNvbnRyb2wgdG8gdGhlIGNsaWVudCdzIHByb2JlIGZ1bmN0aW9uIHJpZ2h0IG5vdy4KKwkgKi8KK2FsbG9jYXRlX2RvbmU6CisJdXAgKCZ1dmQtPmxvY2spOworCXVzYnZpZGVvX0NsaWVudERlY01vZENvdW50KHV2ZCk7CisJcmV0dXJuIHV2ZDsKK30KKworRVhQT1JUX1NZTUJPTCh1c2J2aWRlb19BbGxvY2F0ZURldmljZSk7CisKK2ludCB1c2J2aWRlb19SZWdpc3RlclZpZGVvRGV2aWNlKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwljaGFyIHRtcDFbMjBdLCB0bXAyWzIwXTsJLyogQnVmZmVycyBmb3IgcHJpbnRpbmcgKi8KKworCWlmICh1dmQgPT0gTlVMTCkgeworCQllcnIoIiVzOiBJbGxlZ2FsIGNhbGwuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh1dmQtPnZpZGVvX2VuZHAgPT0gMCkgeworCQlpbmZvKCIlczogTm8gdmlkZW8gZW5kcG9pbnQgc3BlY2lmaWVkOyBkYXRhIHB1bXAgZGlzYWJsZWQuIiwgX19GVU5DVElPTl9fKTsKKwl9CisJaWYgKHV2ZC0+cGFsZXR0ZUJpdHMgPT0gMCkgeworCQllcnIoIiVzOiBObyBwYWxldHRlcyBzcGVjaWZpZWQhIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh1dmQtPmRlZmF1bHRQYWxldHRlID09IDApIHsKKwkJaW5mbygiJXM6IE5vIGRlZmF1bHQgcGFsZXR0ZSEiLCBfX0ZVTkNUSU9OX18pOworCX0KKworCXV2ZC0+bWF4X2ZyYW1lX3NpemUgPSBWSURFT1NJWkVfWCh1dmQtPmNhbnZhcykgKgorCQlWSURFT1NJWkVfWSh1dmQtPmNhbnZhcykgKiBWNExfQllURVNfUEVSX1BJWEVMOworCXVzYnZpZGVvX1ZpZGVvc2l6ZVRvU3RyaW5nKHRtcDEsIHNpemVvZih0bXAxKSwgdXZkLT52aWRlb3NpemUpOworCXVzYnZpZGVvX1ZpZGVvc2l6ZVRvU3RyaW5nKHRtcDIsIHNpemVvZih0bXAyKSwgdXZkLT5jYW52YXMpOworCisJaWYgKHV2ZC0+ZGVidWcgPiAwKSB7CisJCWluZm8oIiVzOiBpZmFjZT0lZC4gZW5kcG9pbnQ9JCUwMnggcGFsZXR0ZUJpdHM9JCUwOGx4IiwKKwkJICAgICBfX0ZVTkNUSU9OX18sIHV2ZC0+aWZhY2UsIHV2ZC0+dmlkZW9fZW5kcCwgdXZkLT5wYWxldHRlQml0cyk7CisJfQorCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnV2ZC0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpID09IC0xKSB7CisJCWVycigiJXM6IHZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVQSVBFOworCX0KKwlpZiAodXZkLT5kZWJ1ZyA+IDEpIHsKKwkJaW5mbygiJXM6IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgpIHN1Y2Nlc3NmdWwiLCBfX0ZVTkNUSU9OX18pOworCX0KKwlpZiAodXZkLT5kZXYgPT0gTlVMTCkgeworCQllcnIoIiVzOiB1dmQtPmRldiA9PSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5mbygiJXMgb24gL2Rldi92aWRlbyVkOiBjYW52YXM9JXMgdmlkZW9zaXplPSVzIiwKKwkgICAgICh1dmQtPmhhbmRsZSAhPSBOVUxMKSA/IHV2ZC0+aGFuZGxlLT5kcnZOYW1lIDogIj8/PyIsCisJICAgICB1dmQtPnZkZXYubWlub3IsIHRtcDIsIHRtcDEpOworCisJdXNiX2dldF9kZXYodXZkLT5kZXYpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHVzYnZpZGVvX1JlZ2lzdGVyVmlkZW9EZXZpY2UpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IHVzYnZpZGVvX3Y0bF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdXZkICp1dmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplICA9IHZtYS0+dm1fZW5kLXZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBwYWdlLCBwb3M7CisKKwlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzaXplID4gKCgoVVNCVklERU9fTlVNRlJBTUVTICogdXZkLT5tYXhfZnJhbWVfc2l6ZSkgKyBQQUdFX1NJWkUgLSAxKSAmIH4oUEFHRV9TSVpFIC0gMSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvcyA9ICh1bnNpZ25lZCBsb25nKSB1dmQtPmZidWY7CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCXBhZ2UgPSB2bWFsbG9jX3RvX3Bmbigodm9pZCAqKXBvcyk7CisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwgUEFHRV9TSVpFLCBQQUdFX1NIQVJFRCkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKworCQlzdGFydCArPSBQQUdFX1NJWkU7CisJCXBvcyArPSBQQUdFX1NJWkU7CisJCWlmIChzaXplID4gUEFHRV9TSVpFKQorCQkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJCWVsc2UKKwkJCXNpemUgPSAwOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogdXNidmlkZW9fdjRsX29wZW4oKQorICoKKyAqIFRoaXMgaXMgcGFydCBvZiBWaWRlbyA0IExpbnV4IEFQSS4gVGhlIGRyaXZlciBjYW4gYmUgb3BlbmVkIGJ5IG9uZQorICogY2xpZW50IG9ubHkgKGNoZWNrcyBpbnRlcm5hbCBjb3VudGVyICd1dmRzZXInKS4gVGhlIHByb2NlZHVyZQorICogdGhlbiBhbGxvY2F0ZXMgYnVmZmVycyBuZWVkZWQgZm9yIHZpZGVvIHByb2Nlc3NpbmcuCisgKgorICogSGlzdG9yeToKKyAqIDIyLUphbi0yMDAwIFJld3JvdGUsIG1vdmVkIHNjcmF0Y2ggYnVmZmVyIGFsbG9jYXRpb24gaGVyZS4gTm93IHRoZQorICogICAgICAgICAgICAgY2FtZXJhIGlzIGFsc28gaW5pdGlhbGl6ZWQgaGVyZSAob25jZSBwZXIgY29ubmVjdCksIGF0CisgKiAgICAgICAgICAgICBleHBlbnNlIG9mIFY0TCBjbGllbnQgKGl0IHdhaXRzIG9uIG9wZW4oKSBjYWxsKS4KKyAqIDI3LUphbi0yMDAwIFVzZWQgVVNCVklERU9fTlVNU0JVRiBhcyBudW1iZXIgb2YgVVJCIGJ1ZmZlcnMuCisgKiAyNC1NYXktMjAwMCBDb3JyZWN0ZWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbiAoTU9EX3h4eF9VU0VfQ09VTlQpLgorICovCitzdGF0aWMgaW50IHVzYnZpZGVvX3Y0bF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHV2ZCAqdXZkID0gKHN0cnVjdCB1dmQgKikgZGV2OworCWNvbnN0IGludCBzYl9zaXplID0gRlJBTUVTX1BFUl9ERVNDICogdXZkLT5pc29fcGFja2V0X2xlbjsKKwlpbnQgaSwgZXJyQ29kZSA9IDA7CisKKwlpZiAodXZkLT5kZWJ1ZyA+IDEpCisJCWluZm8oIiVzKCQlcCkiLCBfX0ZVTkNUSU9OX18sIGRldik7CisKKwl1c2J2aWRlb19DbGllbnRJbmNNb2RDb3VudCh1dmQpOworCWRvd24oJnV2ZC0+bG9jayk7CisKKwlpZiAodXZkLT51c2VyKSB7CisJCWVycigiJXM6IFNvbWVvbmUgdHJpZWQgdG8gb3BlbiBhbiBhbHJlYWR5IG9wZW5lZCBkZXZpY2UhIiwgX19GVU5DVElPTl9fKTsKKwkJZXJyQ29kZSA9IC1FQlVTWTsKKwl9IGVsc2UgeworCQkvKiBDbGVhciBzdGF0aXN0aWNzICovCisJCW1lbXNldCgmdXZkLT5zdGF0cywgMCwgc2l6ZW9mKHV2ZC0+c3RhdHMpKTsKKworCQkvKiBDbGVhbiBwb2ludGVycyBzbyB3ZSBrbm93IGlmIHdlIGFsbG9jYXRlZCBzb21ldGhpbmcgKi8KKwkJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspCisJCQl1dmQtPnNidWZbaV0uZGF0YSA9IE5VTEw7CisKKwkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZnJhbWUgYnVmZmVycyAqLworCQl1dmQtPmZidWZfc2l6ZSA9IFVTQlZJREVPX05VTUZSQU1FUyAqIHV2ZC0+bWF4X2ZyYW1lX3NpemU7CisJCXV2ZC0+ZmJ1ZiA9IHVzYnZpZGVvX3J2bWFsbG9jKHV2ZC0+ZmJ1Zl9zaXplKTsKKwkJUmluZ1F1ZXVlX0FsbG9jYXRlKCZ1dmQtPmRwLCBSSU5HX1FVRVVFX1NJWkUpOworCQlpZiAoKHV2ZC0+ZmJ1ZiA9PSBOVUxMKSB8fAorCQkgICAgKCFSaW5nUXVldWVfSXNBbGxvY2F0ZWQoJnV2ZC0+ZHApKSkgeworCQkJZXJyKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIGZidWYgb3IgZHAiLCBfX0ZVTkNUSU9OX18pOworCQkJZXJyQ29kZSA9IC1FTk9NRU07CisJCX0gZWxzZSB7CisJCQkvKiBBbGxvY2F0ZSBhbGwgYnVmZmVycyAqLworCQkJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1GUkFNRVM7IGkrKykgeworCQkJCXV2ZC0+ZnJhbWVbaV0uZnJhbWVTdGF0ZSA9IEZyYW1lU3RhdGVfVW51c2VkOworCQkJCXV2ZC0+ZnJhbWVbaV0uZGF0YSA9IHV2ZC0+ZmJ1ZiArIGkqKHV2ZC0+bWF4X2ZyYW1lX3NpemUpOworCQkJCS8qCisJCQkJICogU2V0IGRlZmF1bHQgc2l6ZXMgaW4gY2FzZSBJT0NUTCAoVklESU9DTUNBUFRVUkUpCisJCQkJICogaXMgbm90IHVzZWQgKHVzaW5nIHJlYWQoKSBpbnN0ZWFkKS4KKwkJCQkgKi8KKwkJCQl1dmQtPmZyYW1lW2ldLmNhbnZhcyA9IHV2ZC0+Y2FudmFzOworCQkJCXV2ZC0+ZnJhbWVbaV0uc2VxUmVhZF9JbmRleCA9IDA7CisJCQl9CisJCQlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQkJCXV2ZC0+c2J1ZltpXS5kYXRhID0ga21hbGxvYyhzYl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJCQlpZiAodXZkLT5zYnVmW2ldLmRhdGEgPT0gTlVMTCkgeworCQkJCQllcnJDb2RlID0gLUVOT01FTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChlcnJDb2RlICE9IDApIHsKKwkJCS8qIEhhdmUgdG8gZnJlZSBhbGwgdGhhdCBtZW1vcnkgKi8KKwkJCWlmICh1dmQtPmZidWYgIT0gTlVMTCkgeworCQkJCXVzYnZpZGVvX3J2ZnJlZSh1dmQtPmZidWYsIHV2ZC0+ZmJ1Zl9zaXplKTsKKwkJCQl1dmQtPmZidWYgPSBOVUxMOworCQkJfQorCQkJUmluZ1F1ZXVlX0ZyZWUoJnV2ZC0+ZHApOworCQkJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJCQlpZiAodXZkLT5zYnVmW2ldLmRhdGEgIT0gTlVMTCkgeworCQkJCQlrZnJlZSAodXZkLT5zYnVmW2ldLmRhdGEpOworCQkJCQl1dmQtPnNidWZbaV0uZGF0YSA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyogSWYgc28gZmFyIG5vIGVycm9ycyB0aGVuIHdlIHNoYWxsIHN0YXJ0IHRoZSBjYW1lcmEgKi8KKwlpZiAoZXJyQ29kZSA9PSAwKSB7CisJCS8qIFN0YXJ0IGRhdGEgcHVtcCBpZiB3ZSBoYXZlIHZhbGlkIGVuZHBvaW50ICovCisJCWlmICh1dmQtPnZpZGVvX2VuZHAgIT0gMCkKKwkJCWVyckNvZGUgPSBHRVRfQ0FMTEJBQ0sodXZkLCBzdGFydERhdGFQdW1wKSh1dmQpOworCQlpZiAoZXJyQ29kZSA9PSAwKSB7CisJCQlpZiAoVkFMSURfQ0FMTEJBQ0sodXZkLCBzZXR1cE9uT3BlbikpIHsKKwkJCQlpZiAodXZkLT5kZWJ1ZyA+IDEpCisJCQkJCWluZm8oIiVzOiBzZXR1cE9uT3BlbiBjYWxsYmFjayIsIF9fRlVOQ1RJT05fXyk7CisJCQkJZXJyQ29kZSA9IEdFVF9DQUxMQkFDSyh1dmQsIHNldHVwT25PcGVuKSh1dmQpOworCQkJCWlmIChlcnJDb2RlIDwgMCkgeworCQkJCQllcnIoIiVzOiBzZXR1cE9uT3BlbiBjYWxsYmFjayBmYWlsZWQgKCVkLikuIiwKKwkJCQkJICAgIF9fRlVOQ1RJT05fXywgZXJyQ29kZSk7CisJCQkJfSBlbHNlIGlmICh1dmQtPmRlYnVnID4gMSkgeworCQkJCQlpbmZvKCIlczogc2V0dXBPbk9wZW4gY2FsbGJhY2sgc3VjY2Vzc2Z1bCIsIF9fRlVOQ1RJT05fXyk7CisJCQkJfQorCQkJfQorCQkJaWYgKGVyckNvZGUgPT0gMCkgeworCQkJCXV2ZC0+c2V0dGluZ3NBZGp1c3RlZCA9IDA7CisJCQkJaWYgKHV2ZC0+ZGVidWcgPiAxKQorCQkJCQlpbmZvKCIlczogT3BlbiBzdWNjZWVkZWQuIiwgX19GVU5DVElPTl9fKTsKKwkJCQl1dmQtPnVzZXIrKzsKKwkJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSB1dmQ7CisJCQl9CisJCX0KKwl9CisJdXAoJnV2ZC0+bG9jayk7CisJaWYgKGVyckNvZGUgIT0gMCkKKwkJdXNidmlkZW9fQ2xpZW50RGVjTW9kQ291bnQodXZkKTsKKwlpZiAodXZkLT5kZWJ1ZyA+IDApCisJCWluZm8oIiVzOiBSZXR1cm5pbmcgJWQuIiwgX19GVU5DVElPTl9fLCBlcnJDb2RlKTsKKwlyZXR1cm4gZXJyQ29kZTsKK30KKworLyoKKyAqIHVzYnZpZGVvX3Y0bF9jbG9zZSgpCisgKgorICogVGhpcyBpcyBwYXJ0IG9mIFZpZGVvIDQgTGludXggQVBJLiBUaGUgcHJvY2VkdXJlCisgKiBzdG9wcyBzdHJlYW1pbmcgYW5kIGRlYWxsb2NhdGVzIGFsbCBidWZmZXJzIHRoYXQgd2VyZSBlYXJsaWVyCisgKiBhbGxvY2F0ZWQgaW4gdXNidmlkZW9fdjRsX29wZW4oKS4KKyAqCisgKiBIaXN0b3J5OgorICogMjItSmFuLTIwMDAgTW92ZWQgc2NyYXRjaCBidWZmZXIgZGVhbGxvY2F0aW9uIGhlcmUuCisgKiAyNy1KYW4tMjAwMCBVc2VkIFVTQlZJREVPX05VTVNCVUYgYXMgbnVtYmVyIG9mIFVSQiBidWZmZXJzLgorICogMjQtTWF5LTIwMDAgTW92ZWQgTU9EX0RFQ19VU0VfQ09VTlQgb3V0c2lkZSBvZiBjb2RlIHRoYXQgY2FuIHNsZWVwLgorICovCitzdGF0aWMgaW50IHVzYnZpZGVvX3Y0bF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHV2ZCAqdXZkID0gKHN0cnVjdCB1dmQgKikgZGV2OworCWludCBpOworCisJaWYgKHV2ZC0+ZGVidWcgPiAxKQorCQlpbmZvKCIlcygkJXApIiwgX19GVU5DVElPTl9fLCBkZXYpOworCisJZG93bigmdXZkLT5sb2NrKTsKKwlHRVRfQ0FMTEJBQ0sodXZkLCBzdG9wRGF0YVB1bXApKHV2ZCk7CisJdXNidmlkZW9fcnZmcmVlKHV2ZC0+ZmJ1ZiwgdXZkLT5mYnVmX3NpemUpOworCXV2ZC0+ZmJ1ZiA9IE5VTEw7CisJUmluZ1F1ZXVlX0ZyZWUoJnV2ZC0+ZHApOworCisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJa2ZyZWUodXZkLT5zYnVmW2ldLmRhdGEpOworCQl1dmQtPnNidWZbaV0uZGF0YSA9IE5VTEw7CisJfQorCisjaWYgVVNCVklERU9fUkVQT1JUX1NUQVRTCisJdXNidmlkZW9fUmVwb3J0U3RhdGlzdGljcyh1dmQpOworI2VuZGlmICAgIAorCisJdXZkLT51c2VyLS07CisJaWYgKHV2ZC0+cmVtb3ZlX3BlbmRpbmcpIHsKKwkJaWYgKHV2ZC0+ZGVidWcgPiAwKQorCQkJaW5mbygidXNidmlkZW9fdjRsX2Nsb3NlOiBGaW5hbCBkaXNjb25uZWN0LiIpOworCQl1c2J2aWRlb19DYW1lcmFSZWxlYXNlKHV2ZCk7CisJfQorCXVwKCZ1dmQtPmxvY2spOworCXVzYnZpZGVvX0NsaWVudERlY01vZENvdW50KHV2ZCk7CisKKwlpZiAodXZkLT5kZWJ1ZyA+IDEpCisJCWluZm8oIiVzOiBDb21wbGV0ZWQuIiwgX19GVU5DVElPTl9fKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXJldHVybiAwOworfQorCisvKgorICogdXNidmlkZW9fdjRsX2lvY3RsKCkKKyAqCisgKiBUaGlzIGlzIHBhcnQgb2YgVmlkZW8gNCBMaW51eCBBUEkuIFRoZSBwcm9jZWR1cmUgaGFuZGxlcyBpb2N0bCgpIGNhbGxzLgorICoKKyAqIEhpc3Rvcnk6CisgKiAyMi1KYW4tMjAwMCBDb3JyZWN0ZWQgVklESU9DU1BJQ1QgdG8gcmVqZWN0IHVuc3VwcG9ydGVkIHNldHRpbmdzLgorICovCitzdGF0aWMgaW50IHVzYnZpZGVvX3Y0bF9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB1dmQgKnV2ZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpCisJCXJldHVybiAtRUlPOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBWSURJT0NHQ0FQOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqYiA9IGFyZzsKKwkJCSpiID0gdXZkLT52Y2FwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHQ0hBTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisJCQkqdiA9IHV2ZC0+dmNoYW47CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ1NDSEFOOgorCQl7CQorCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7CisJCQlpZiAodi0+Y2hhbm5lbCAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NHUElDVDoKKwkJeworCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnBpYyA9IGFyZzsKKwkJCSpwaWMgPSB1dmQtPnZwaWM7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ1NQSUNUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcGljID0gYXJnOworCQkJLyoKKwkJCSAqIFVzZSB0ZW1wb3JhcnkgJ3ZpZGVvX3BpY3R1cmUnIHN0cnVjdHVyZSB0byBwcmVzZXJ2ZSBvdXIKKwkJCSAqIG93biBzZXR0aW5ncyAoc3VjaCBhcyBjb2xvciBkZXB0aCwgcGFsZXR0ZSkgdGhhdCB3ZQorCQkJICogYXJlbid0IGFsbG93aW5nIGV2ZXJ5b25lIChWNEwgY2xpZW50KSB0byBjaGFuZ2UuCisJCQkgKi8KKwkJCXV2ZC0+dnBpYy5icmlnaHRuZXNzID0gcGljLT5icmlnaHRuZXNzOworCQkJdXZkLT52cGljLmh1ZSA9IHBpYy0+aHVlOworCQkJdXZkLT52cGljLmNvbG91ciA9IHBpYy0+Y29sb3VyOworCQkJdXZkLT52cGljLmNvbnRyYXN0ID0gcGljLT5jb250cmFzdDsKKwkJCXV2ZC0+c2V0dGluZ3NBZGp1c3RlZCA9IDA7CS8qIFdpbGwgZm9yY2UgbmV3IHNldHRpbmdzICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ1NXSU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCisJCQlpZihWQUxJRF9DQUxMQkFDSyh1dmQsIHNldFZpZGVvTW9kZSkpIHsKKwkJCQlyZXR1cm4gR0VUX0NBTExCQUNLKHV2ZCwgc2V0VmlkZW9Nb2RlKSh1dmQsIHZ3KTsKKwkJCX0KKworCQkJaWYgKHZ3LT5mbGFncykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICh2dy0+Y2xpcGNvdW50KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHZ3LT53aWR0aCAhPSBWSURFT1NJWkVfWCh1dmQtPmNhbnZhcykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAodnctPmhlaWdodCAhPSBWSURFT1NJWkVfWSh1dmQtPmNhbnZhcykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DR1dJTjoKKwkJeworCQkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdncgPSBhcmc7CisKKwkJCXZ3LT54ID0gMDsKKwkJCXZ3LT55ID0gMDsKKwkJCXZ3LT53aWR0aCA9IFZJREVPU0laRV9YKHV2ZC0+dmlkZW9zaXplKTsKKwkJCXZ3LT5oZWlnaHQgPSBWSURFT1NJWkVfWSh1dmQtPnZpZGVvc2l6ZSk7CisJCQl2dy0+Y2hyb21ha2V5ID0gMDsKKwkJCWlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIGdldEZQUykpCisJCQkJdnctPmZsYWdzID0gR0VUX0NBTExCQUNLKHV2ZCwgZ2V0RlBTKSh1dmQpOworCQkJZWxzZSAKKwkJCQl2dy0+ZmxhZ3MgPSAxMDsgLyogRklYTUU6IGRvIGJldHRlciEgKi8KKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DR01CVUY6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19tYnVmICp2bSA9IGFyZzsKKwkJCWludCBpOworCisJCQltZW1zZXQodm0sIDAsIHNpemVvZigqdm0pKTsKKwkJCXZtLT5zaXplID0gdXZkLT5tYXhfZnJhbWVfc2l6ZSAqIFVTQlZJREVPX05VTUZSQU1FUzsKKwkJCXZtLT5mcmFtZXMgPSBVU0JWSURFT19OVU1GUkFNRVM7CisJCQlmb3IoaSA9IDA7IGkgPCBVU0JWSURFT19OVU1GUkFNRVM7IGkrKykgCisJCQkgIHZtLT5vZmZzZXRzW2ldID0gaSAqIHV2ZC0+bWF4X2ZyYW1lX3NpemU7CisKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DTUNBUFRVUkU6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19tbWFwICp2bSA9IGFyZzsKKworCQkJaWYgKHV2ZC0+ZGVidWcgPj0gMSkgeworCQkJCWluZm8oIlZJRElPQ01DQVBUVVJFOiBmcmFtZT0lZC4gc2l6ZT0lZHglZCwgZm9ybWF0PSVkLiIsCisJCQkJICAgICB2bS0+ZnJhbWUsIHZtLT53aWR0aCwgdm0tPmhlaWdodCwgdm0tPmZvcm1hdCk7CisJCQl9CisJCQkvKgorCQkJICogQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBzaXplIGlzIHN1cHBvcnRlZC4gSWYgdGhlIHJlcXVlc3RvcgorCQkJICogcmVxdWVzdHMgdG9vIGJpZyBhIGZyYW1lIHRoZW4gd2UgbWF5IGJlIHRyaWNrZWQgaW50byBhY2Nlc3NpbmcKKwkJCSAqIG91dHNpZGUgb2Ygb3duIHByZWFsbG9jYXRlZCBmcmFtZSBidWZmZXIgKGluIHV2ZC0+ZnJhbWUpLgorCQkJICogVGhpcyB3aWxsIGNhdXNlIG9vcHMgb3IgYSBzZWN1cml0eSBob2xlLiBUaGVvcmV0aWNhbGx5LCB3ZQorCQkJICogY291bGQgb25seSBjbGFtcCB0aGUgc2l6ZSBkb3duIHRvIGFjY2VwdGFibGUgYm91bmRzLCBidXQgdGhlbgorCQkJICogd2UnZCBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGluc2VydCBvdXIgc21hbGxlciBidWZmZXIgaW50bworCQkJICogbGFyZ2VyIGNhbGxlcidzIGJ1ZmZlci4uLiB0aGlzIGlzIG5vdCBhbiBlYXN5IHF1ZXN0aW9uLiBTbyB3ZQorCQkJICogaGVyZSBqdXN0IGZsYXRseSByZWplY3QgdG9vIGxhcmdlIHJlcXVlc3RzLCBhc3N1bWluZyB0aGF0IHRoZQorCQkJICogY2FsbGVyIHdpbGwgcmVzdWJtaXQgd2l0aCBzbWFsbGVyIHNpemUuIENhbGxlcnMgc2hvdWxkIGtub3cKKwkJCSAqIHdoYXQgc2l6ZSB3ZSBzdXBwb3J0IChyZXR1cm5lZCBieSBWSURJT0NHQ0FQKS4gSG93ZXZlciB2aWRjYXQsCisJCQkgKiBmb3Igb25lLCBkb2VzIG5vdCBjYXJlIGFuZCBhbGxvd3MgdG8gYXNrIGZvciBhbnkgc2l6ZS4KKwkJCSAqLworCQkJaWYgKCh2bS0+d2lkdGggPiBWSURFT1NJWkVfWCh1dmQtPmNhbnZhcykpIHx8CisJCQkgICAgKHZtLT5oZWlnaHQgPiBWSURFT1NJWkVfWSh1dmQtPmNhbnZhcykpKSB7CisJCQkJaWYgKHV2ZC0+ZGVidWcgPiAwKSB7CisJCQkJCWluZm8oIlZJRElPQ01DQVBUVVJFOiBTaXplPSVkeCVkIHRvbyBsYXJnZTsgIgorCQkJCQkgICAgICJhbGxvd2VkIG9ubHkgdXAgdG8gJWxkeCVsZCIsIHZtLT53aWR0aCwgdm0tPmhlaWdodCwKKwkJCQkJICAgICBWSURFT1NJWkVfWCh1dmQtPmNhbnZhcyksIFZJREVPU0laRV9ZKHV2ZC0+Y2FudmFzKSk7CisJCQkJfQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJLyogQ2hlY2sgaWYgdGhlIHBhbGV0dGUgaXMgc3VwcG9ydGVkICovCisJCQlpZiAoKCgxTCA8PCB2bS0+Zm9ybWF0KSAmIHV2ZC0+cGFsZXR0ZUJpdHMpID09IDApIHsKKwkJCQlpZiAodXZkLT5kZWJ1ZyA+IDApIHsKKwkJCQkJaW5mbygiVklESU9DTUNBUFRVUkU6IGZvcm1hdD0lZC4gbm90IHN1cHBvcnRlZCIKKwkJCQkJICAgICAiIChwYWxldHRlQml0cz0kJTA4bHgpIiwKKwkJCQkJICAgICB2bS0+Zm9ybWF0LCB1dmQtPnBhbGV0dGVCaXRzKTsKKwkJCQl9CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAoKHZtLT5mcmFtZSA8IDApIHx8ICh2bS0+ZnJhbWUgPj0gVVNCVklERU9fTlVNRlJBTUVTKSkgeworCQkJCWVycigiVklESU9DTUNBUFRVUkU6IHZtLmZyYW1lPSVkLiAhRSBbMC0lZF0iLCB2bS0+ZnJhbWUsIFVTQlZJREVPX05VTUZSQU1FUy0xKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmICh1dmQtPmZyYW1lW3ZtLT5mcmFtZV0uZnJhbWVTdGF0ZSA9PSBGcmFtZVN0YXRlX0dyYWJiaW5nKSB7CisJCQkJLyogTm90IGFuIGVycm9yIC0gY2FuIGhhcHBlbiAqLworCQkJfQorCQkJdXZkLT5mcmFtZVt2bS0+ZnJhbWVdLnJlcXVlc3QgPSBWSURFT1NJWkUodm0tPndpZHRoLCB2bS0+aGVpZ2h0KTsKKwkJCXV2ZC0+ZnJhbWVbdm0tPmZyYW1lXS5wYWxldHRlID0gdm0tPmZvcm1hdDsKKworCQkJLyogTWFyayBpdCBhcyByZWFkeSAqLworCQkJdXZkLT5mcmFtZVt2bS0+ZnJhbWVdLmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX1JlYWR5OworCisJCQlyZXR1cm4gdXNidmlkZW9fTmV3RnJhbWUodXZkLCB2bS0+ZnJhbWUpOworCQl9CisJCWNhc2UgVklESU9DU1lOQzoKKwkJeworCQkJaW50ICpmcmFtZU51bSA9IGFyZzsKKwkJCWludCByZXQ7CisKKwkJCWlmICgqZnJhbWVOdW0gPCAwIHx8ICpmcmFtZU51bSA+PSBVU0JWSURFT19OVU1GUkFNRVMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCisJCQlpZiAodXZkLT5kZWJ1ZyA+PSAxKQorCQkJCWluZm8oIlZJRElPQ1NZTkM6IHN5bmNpbmcgdG8gZnJhbWUgJWQuIiwgKmZyYW1lTnVtKTsKKwkJCWlmICh1dmQtPmZsYWdzICYgRkxBR1NfTk9fREVDT0RJTkcpCisJCQkJcmV0ID0gdXNidmlkZW9fR2V0RnJhbWUodXZkLCAqZnJhbWVOdW0pOworCQkJZWxzZSBpZiAoVkFMSURfQ0FMTEJBQ0sodXZkLCBnZXRGcmFtZSkpIHsKKwkJCQlyZXQgPSBHRVRfQ0FMTEJBQ0sodXZkLCBnZXRGcmFtZSkodXZkLCAqZnJhbWVOdW0pOworCQkJCWlmICgocmV0IDwgMCkgJiYgKHV2ZC0+ZGVidWcgPj0gMSkpIHsKKwkJCQkJZXJyKCJWSURJT0NTWU5DOiBnZXRGcmFtZSgpIHJldHVybmVkICVkLiIsIHJldCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQllcnIoIlZJRElPQ1NZTkM6IGdldEZyYW1lIGlzIG5vdCBzZXQiKTsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCisJCQkvKgorCQkJICogVGhlIGZyYW1lIGlzIGluIEZyYW1lU3RhdGVfRG9uZV9Ib2xkIHN0YXRlLiBSZWxlYXNlIGl0CisJCQkgKiByaWdodCBub3cgYmVjYXVzZSBpdHMgZGF0YSBpcyBhbHJlYWR5IG1hcHBlZCBpbnRvCisJCQkgKiB0aGUgdXNlciBzcGFjZSBhbmQgaXQncyB1cCB0byB0aGUgYXBwbGljYXRpb24gdG8KKwkJCSAqIG1ha2UgdXNlIG9mIGl0IHVudGlsIGl0IGFza3MgZm9yIGFub3RoZXIgZnJhbWUuCisJCQkgKi8KKwkJCXV2ZC0+ZnJhbWVbKmZyYW1lTnVtXS5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9VbnVzZWQ7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWNhc2UgVklESU9DR0ZCVUY6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19idWZmZXIgKnZiID0gYXJnOworCisJCQltZW1zZXQodmIsIDAsIHNpemVvZigqdmIpKTsKKyAJCQlyZXR1cm4gMDsKKyAJCX0KKwkJY2FzZSBWSURJT0NLRVk6CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFZJRElPQ0NBUFRVUkU6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljYXNlIFZJRElPQ1NGQlVGOgorCisJCWNhc2UgVklESU9DR1RVTkVSOgorCQljYXNlIFZJRElPQ1NUVU5FUjoKKworCQljYXNlIFZJRElPQ0dGUkVROgorCQljYXNlIFZJRElPQ1NGUkVROgorCisJCWNhc2UgVklESU9DR0FVRElPOgorCQljYXNlIFZJRElPQ1NBVURJTzoKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2J2aWRlb192NGxfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCB1c2J2aWRlb192NGxfZG9faW9jdGwpOworfQorCisvKgorICogdXNidmlkZW9fdjRsX3JlYWQoKQorICoKKyAqIFRoaXMgaXMgbW9zdGx5IGJvcmluZyBzdHVmZi4gV2Ugc2ltcGx5IGFzayBmb3IgYSBmcmFtZSBhbmQgd2hlbiBpdAorICogYXJyaXZlcyBjb3B5IGFsbCB0aGUgdmlkZW8gZGF0YSBmcm9tIGl0IGludG8gdXNlciBzcGFjZS4gVGhlcmUgaXMKKyAqIG5vIG9idmlvdXMgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAqCisgKiBIaXN0b3J5OgorICogMjAtT2N0LTIwMDAgQ3JlYXRlZC4KKyAqIDAxLU5vdi0yMDAwIEFkZGVkIG11dGV4ICh1dmQtPmxvY2spLgorICovCitzdGF0aWMgc3NpemVfdCB1c2J2aWRlb192NGxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHV2ZCAqdXZkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBub2Jsb2NrID0gZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0s7CisJaW50IGZybXggPSAtMSwgaTsKKwlzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lOworCisJaWYgKCFDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSB8fCAoYnVmID09IE5VTEwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh1dmQtPmRlYnVnID49IDEpCisJCWluZm8oIiVzOiAlWmQuIGJ5dGVzLCBub2Jsb2NrPSVkLiIsIF9fRlVOQ1RJT05fXywgY291bnQsIG5vYmxvY2spOworCisJZG93bigmdXZkLT5sb2NrKTsJCisKKwkvKiBTZWUgaWYgYSBmcmFtZSBpcyBjb21wbGV0ZWQsIHRoZW4gdXNlIGl0LiAqLworCWZvcihpID0gMDsgaSA8IFVTQlZJREVPX05VTUZSQU1FUzsgaSsrKSB7CisJCWlmICgodXZkLT5mcmFtZVtpXS5mcmFtZVN0YXRlID09IEZyYW1lU3RhdGVfRG9uZSkgfHwKKwkJICAgICh1dmQtPmZyYW1lW2ldLmZyYW1lU3RhdGUgPT0gRnJhbWVTdGF0ZV9Eb25lX0hvbGQpIHx8CisJCSAgICAodXZkLT5mcmFtZVtpXS5mcmFtZVN0YXRlID09IEZyYW1lU3RhdGVfRXJyb3IpKSB7CisJCQlmcm14ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogRklYTUU6IElmIHdlIGRvbid0IHN0YXJ0IGEgZnJhbWUgaGVyZSB0aGVuIHdobyBldmVyIGRvZXM/ICovCisJaWYgKG5vYmxvY2sgJiYgKGZybXggPT0gLTEpKSB7CisJCWNvdW50ID0gLUVBR0FJTjsKKwkJZ290byByZWFkX2RvbmU7CisJfQorCisJLyoKKwkgKiBJZiBubyBGcmFtZVN0YXRlX0RvbmUsIGxvb2sgZm9yIGEgRnJhbWVTdGF0ZV9HcmFiYmluZyBzdGF0ZS4KKwkgKiBTZWUgaWYgYSBmcmFtZSBpcyBpbiBwcm9jZXNzIChncmFiYmluZyksIHRoZW4gdXNlIGl0LgorCSAqIFdlIHdpbGwgbmVlZCB0byB3YWl0IHVudGlsIGl0IGJlY29tZXMgY29va2VkLCBvZiBjb3Vyc2UuCisJICovCisJaWYgKGZybXggPT0gLTEpIHsKKwkJZm9yKGkgPSAwOyBpIDwgVVNCVklERU9fTlVNRlJBTUVTOyBpKyspIHsKKwkJCWlmICh1dmQtPmZyYW1lW2ldLmZyYW1lU3RhdGUgPT0gRnJhbWVTdGF0ZV9HcmFiYmluZykgeworCQkJCWZybXggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBJZiBubyBmcmFtZSBpcyBhY3RpdmUsIHN0YXJ0IG9uZS4gV2UgZG9uJ3QgY2FyZSB3aGljaCBvbmUKKwkgKiBpdCB3aWxsIGJlLCBzbyAjMCBpcyBhcyBnb29kIGFzIGFueS4KKwkgKiBJbiByZWFkIGFjY2VzcyBtb2RlIHdlIGRvbid0IGhhdmUgY29udmVuaWVuY2Ugb2YgVklESU9DTUNBUFRVUkUKKwkgKiB0byBzcGVjaWZ5IHRoZSByZXF1ZXN0ZWQgcGFsZXR0ZSAodmlkZW8gZm9ybWF0KSBvbiBwZXItZnJhbWUKKwkgKiBiYXNpcy4gVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgdG8gcmV0dXJuIGRhdGEgaW4gLXNvbWUtIGZvcm1hdAorCSAqIGFuZCBqdXN0IGhvcGUgdGhhdCB0aGUgY2xpZW50IGtub3dzIHdoYXQgdG8gZG8gd2l0aCBpdC4KKwkgKiBUaGUgZGVmYXVsdCBmb3JtYXQgaXMgY29uZmlndXJlZCBpbiB1dmQtPmRlZmF1bHRQYWxldHRlIGZpZWxkCisJICogYXMgb25lIG9mIFZJREVPX1BBTEVUVEVfeHh4IHZhbHVlcy4gV2Ugc3R1ZmYgaXQgaW50byB0aGUgbmV3CisJICogZnJhbWUgYW5kIGluaXRpYXRlIHRoZSBmcmFtZSBmaWxsaW5nIHByb2Nlc3MuCisJICovCisJaWYgKGZybXggPT0gLTEpIHsKKwkJaWYgKHV2ZC0+ZGVmYXVsdFBhbGV0dGUgPT0gMCkgeworCQkJZXJyKCIlczogTm8gZGVmYXVsdCBwYWxldHRlOyBkb24ndCBrbm93IHdoYXQgdG8gZG8hIiwgX19GVU5DVElPTl9fKTsKKwkJCWNvdW50ID0gLUVGQVVMVDsKKwkJCWdvdG8gcmVhZF9kb25lOworCQl9CisJCWZybXggPSAwOworCQkvKgorCQkgKiBXZSBoYXZlIG5vIHBlci1mcmFtZSBjb250cm9sIG92ZXIgdmlkZW8gc2l6ZS4KKwkJICogVGhlcmVmb3JlIHdlIG9ubHkgY2FuIHVzZSB3aGF0ZXZlciBzaXplIHdhcworCQkgKiBzcGVjaWZpZWQgYXMgZGVmYXVsdC4KKwkJICovCisJCXV2ZC0+ZnJhbWVbZnJteF0ucmVxdWVzdCA9IHV2ZC0+dmlkZW9zaXplOworCQl1dmQtPmZyYW1lW2ZybXhdLnBhbGV0dGUgPSB1dmQtPmRlZmF1bHRQYWxldHRlOworCQl1dmQtPmZyYW1lW2ZybXhdLmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX1JlYWR5OworCQl1c2J2aWRlb19OZXdGcmFtZSh1dmQsIGZybXgpOworCQkvKiBOb3cgZnJhbWUgMCBpcyBzdXBwb3NlZCB0byBzdGFydCBmaWxsaW5nLi4uICovCisJfQorCisJLyoKKwkgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBhY3RpdmUgZnJhbWUuIEl0IGlzIGVpdGhlciBwcmV2aW91c2x5CisJICogY29tcGxldGVkIGZyYW1lIG9yIGZyYW1lIGluIHByb2dyZXNzIGJ1dCBub3QgY29tcGxldGVkIHlldC4KKwkgKi8KKwlmcmFtZSA9ICZ1dmQtPmZyYW1lW2ZybXhdOworCisJLyoKKwkgKiBTaXQgYmFjayAmIHdhaXQgdW50aWwgdGhlIGZyYW1lIGdldHMgZmlsbGVkIGFuZCBwb3N0cHJvY2Vzc2VkLgorCSAqIElmIHdlIGZhaWwgdG8gZ2V0IHRoZSBwaWN0dXJlIFtpbiB0aW1lXSB0aGVuIHJldHVybiB0aGUgZXJyb3IuCisJICogSW4gdGhpcyBjYWxsIHdlIHNwZWNpZnkgdGhhdCB3ZSB3YW50IHRoZSBmcmFtZSB0byBiZSB3YWl0ZWQgZm9yLAorCSAqIHBvc3Rwcm9jZXNzZWQgYW5kIHN3aXRjaGVkIGludG8gRnJhbWVTdGF0ZV9Eb25lX0hvbGQgc3RhdGUuIFRoaXMKKwkgKiBzdGF0ZSBpcyB1c2VkIHRvIGhvbGQgdGhlIGZyYW1lIGFzICJmdWxseSBjb21wbGV0ZWQiIGJldHdlZW4KKwkgKiBzdWJzZXF1ZW50IHBhcnRpYWwgcmVhZHMgb2YgdGhlIHNhbWUgZnJhbWUuCisJICovCisJaWYgKGZyYW1lLT5mcmFtZVN0YXRlICE9IEZyYW1lU3RhdGVfRG9uZV9Ib2xkKSB7CisJCWxvbmcgcnYgPSAtRUZBVUxUOworCQlpZiAodXZkLT5mbGFncyAmIEZMQUdTX05PX0RFQ09ESU5HKQorCQkJcnYgPSB1c2J2aWRlb19HZXRGcmFtZSh1dmQsIGZybXgpOworCQllbHNlIGlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIGdldEZyYW1lKSkKKwkJCXJ2ID0gR0VUX0NBTExCQUNLKHV2ZCwgZ2V0RnJhbWUpKHV2ZCwgZnJteCk7CisJCWVsc2UKKwkJCWVycigiZ2V0RnJhbWUgaXMgbm90IHNldCIpOworCQlpZiAoKHJ2ICE9IDApIHx8IChmcmFtZS0+ZnJhbWVTdGF0ZSAhPSBGcmFtZVN0YXRlX0RvbmVfSG9sZCkpIHsKKwkJCWNvdW50ID0gcnY7CisJCQlnb3RvIHJlYWRfZG9uZTsKKwkJfQorCX0KKworCS8qCisJICogQ29weSBieXRlcyB0byB1c2VyIHNwYWNlLiBXZSBhbGxvdyBmb3IgcGFydGlhbCByZWFkcywgd2hpY2gKKwkgKiBtZWFucyB0aGF0IHRoZSB1c2VyIGFwcGxpY2F0aW9uIGNhbiByZXF1ZXN0IHJlYWQgbGVzcyB0aGFuCisJICogdGhlIGZ1bGwgZnJhbWUgc2l6ZS4gSXQgaXMgdXAgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIGlzc3VlCisJICogc3Vic2VxdWVudCBjYWxscyB1bnRpbCBlbnRpcmUgZnJhbWUgaXMgcmVhZC4KKwkgKgorCSAqIEZpcnN0IHRoaW5ncyBmaXJzdCwgbWFrZSBzdXJlIHdlIGRvbid0IGNvcHkgbW9yZSB0aGFuIHdlCisJICogaGF2ZSAtIGV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIG1vcmUuIFRoYXQgd291bGQgYmUKKwkgKiBhIGJpZyBzZWN1cml0eSBlbWJhcmFzc21lbnQhCisJICovCisJaWYgKChjb3VudCArIGZyYW1lLT5zZXFSZWFkX0luZGV4KSA+IGZyYW1lLT5zZXFSZWFkX0xlbmd0aCkKKwkJY291bnQgPSBmcmFtZS0+c2VxUmVhZF9MZW5ndGggLSBmcmFtZS0+c2VxUmVhZF9JbmRleDsKKworCS8qCisJICogQ29weSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgdG8gdXNlciBzcGFjZS4gV2Ugc3RhcnQKKwkgKiBjb3B5aW5nIGZyb20gdGhlIHBvc2l0aW9uIHdoZXJlIHdlIGxhc3QgbGVmdCBpdCwgd2hpY2gKKwkgKiB3aWxsIGJlIHplcm8gZm9yIGEgbmV3IGZyYW1lIChub3QgcmVhZCBiZWZvcmUpLgorCSAqLworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBmcmFtZS0+ZGF0YSArIGZyYW1lLT5zZXFSZWFkX0luZGV4LCBjb3VudCkpIHsKKwkJY291bnQgPSAtRUZBVUxUOworCQlnb3RvIHJlYWRfZG9uZTsKKwl9CisKKwkvKiBVcGRhdGUgbGFzdCByZWFkIHBvc2l0aW9uICovCisJZnJhbWUtPnNlcVJlYWRfSW5kZXggKz0gY291bnQ7CisJaWYgKHV2ZC0+ZGVidWcgPj0gMSkgeworCQllcnIoIiVzOiB7Y29weX0gY291bnQgdXNlZD0lWmQsIG5ldyBzZXFSZWFkX0luZGV4PSVsZCIsCisJCQlfX0ZVTkNUSU9OX18sIGNvdW50LCBmcmFtZS0+c2VxUmVhZF9JbmRleCk7CisJfQorCisJLyogRmluYWxseSBjaGVjayBpZiB0aGUgZnJhbWUgaXMgZG9uZSB3aXRoIGFuZCAicmVsZWFzZSIgaXQgKi8KKwlpZiAoZnJhbWUtPnNlcVJlYWRfSW5kZXggPj0gZnJhbWUtPnNlcVJlYWRfTGVuZ3RoKSB7CisJCS8qIEFsbCBkYXRhIGhhcyBiZWVuIHJlYWQgKi8KKwkJZnJhbWUtPnNlcVJlYWRfSW5kZXggPSAwOworCisJCS8qIE1hcmsgaXQgYXMgYXZhaWxhYmxlIHRvIGJlIHVzZWQgYWdhaW4uICovCisJCXV2ZC0+ZnJhbWVbZnJteF0uZnJhbWVTdGF0ZSA9IEZyYW1lU3RhdGVfVW51c2VkOworCQlpZiAodXNidmlkZW9fTmV3RnJhbWUodXZkLCAoZnJteCArIDEpICUgVVNCVklERU9fTlVNRlJBTUVTKSkgeworCQkJZXJyKCIlczogdXNidmlkZW9fTmV3RnJhbWUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisJCX0KKwl9CityZWFkX2RvbmU6CisJdXAoJnV2ZC0+bG9jayk7CQorCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIE1ha2UgYWxsIG9mIHRoZSBibG9ja3Mgb2YgZGF0YSBjb250aWd1b3VzCisgKi8KK3N0YXRpYyBpbnQgdXNidmlkZW9fQ29tcHJlc3NJc29jaHJvbm91cyhzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwljaGFyICpjZGF0YTsKKwlpbnQgaSwgdG90bGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKKwkJaW50IG4gPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CisJCWludCBzdCA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzOworCisJCWNkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXIgKyB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKKworCQkvKiBEZXRlY3QgYW5kIGlnbm9yZSBlcnJvcmVkIHBhY2tldHMgKi8KKwkJaWYgKHN0IDwgMCkgeworCQkJaWYgKHV2ZC0+ZGVidWcgPj0gMSkKKwkJCQllcnIoIkRhdGEgZXJyb3I6IHBhY2tldD0lZC4gbGVuPSVkLiBzdGF0dXM9JWQuIiwgaSwgbiwgc3QpOworCQkJdXZkLT5zdGF0cy5pc29fZXJyX2NvdW50Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIERldGVjdCBhbmQgaWdub3JlIGVtcHR5IHBhY2tldHMgKi8KKwkJaWYgKG4gPD0gMCkgeworCQkJdXZkLT5zdGF0cy5pc29fc2tpcF9jb3VudCsrOworCQkJY29udGludWU7CisJCX0KKwkJdG90bGVuICs9IG47CS8qIExpdHRsZSBsb2NhbCBhY2NvdW50aW5nICovCisJCVJpbmdRdWV1ZV9FbnF1ZXVlKCZ1dmQtPmRwLCBjZGF0YSwgbik7CisJfQorCXJldHVybiB0b3RsZW47Cit9CisKK3N0YXRpYyB2b2lkIHVzYnZpZGVvX0lzb2NJcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaSwgcmV0LCBsZW47CisJc3RydWN0IHV2ZCAqdXZkID0gdXJiLT5jb250ZXh0OworCisJLyogV2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBpZiB3ZSBhcmUgYWJvdXQgdG8gYmUgcmVtb3ZlZCEgKi8KKwlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpKQorCQlyZXR1cm47CisjaWYgMAorCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7CisJCWluZm8oInVyYj0kJXAgc3RhdHVzPSVkLiBlcnJjb3VudD0lZC4gbGVuZ3RoPSVkLiIsCisJCSAgICAgdXJiLCB1cmItPnN0YXR1cywgdXJiLT5lcnJvcl9jb3VudCwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQlzdGF0aWMgaW50IGMgPSAwOworCQlpZiAoYysrICUgMTAwID09IDApCisJCQlpbmZvKCJObyBJc29jIGRhdGEiKTsKKwl9CisjZW5kaWYKKworCWlmICghdXZkLT5zdHJlYW1pbmcpIHsKKwkJaWYgKHV2ZC0+ZGVidWcgPj0gMSkKKwkJCWluZm8oIk5vdCBzdHJlYW1pbmcsIGJ1dCBpbnRlcnJ1cHQhIik7CisJCXJldHVybjsKKwl9CisJCisJdXZkLT5zdGF0cy51cmJfY291bnQrKzsKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoIDw9IDApCisJCWdvdG8gdXJiX2RvbmVfd2l0aDsKKworCS8qIENvcHkgdGhlIGRhdGEgcmVjZWl2ZWQgaW50byByaW5nIHF1ZXVlICovCisJbGVuID0gdXNidmlkZW9fQ29tcHJlc3NJc29jaHJvbm91cyh1dmQsIHVyYik7CisJdXZkLT5zdGF0cy51cmJfbGVuZ3RoID0gbGVuOworCWlmIChsZW4gPD0gMCkKKwkJZ290byB1cmJfZG9uZV93aXRoOworCisJLyogSGVyZSB3ZSBnb3Qgc29tZSBkYXRhICovCisJdXZkLT5zdGF0cy5kYXRhX2NvdW50ICs9IGxlbjsKKwlSaW5nUXVldWVfV2FrZVVwSW50ZXJydXB0aWJsZSgmdXZkLT5kcCk7CisKK3VyYl9kb25lX3dpdGg6CisJZm9yIChpID0gMDsgaSA8IEZSQU1FU19QRVJfREVTQzsgaSsrKSB7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzID0gMDsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoID0gMDsKKwl9CisJdXJiLT5zdGF0dXMgPSAwOworCXVyYi0+ZGV2ID0gdXZkLT5kZXY7CisJcmV0ID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0tFUk5FTCk7CisJaWYocmV0KQorCQllcnIoInVzYl9zdWJtaXRfdXJiIGVycm9yICglZCkiLCByZXQpOworCXJldHVybjsKK30KKworLyoKKyAqIHVzYnZpZGVvX1N0YXJ0RGF0YVB1bXAoKQorICoKKyAqIEhpc3Rvcnk6CisgKiAyNy1KYW4tMjAwMCBVc2VkIGlibWNhbS0+aWZhY2UsIGlibWNhbS0+aWZhY2VBbHRBY3RpdmUgaW5zdGVhZAorICogICAgICAgICAgICAgb2YgaGFyZGNvZGVkIHZhbHVlcy4gU2ltcGxpZmllZCBieSB1c2luZyBmb3IgbG9vcCwKKyAqICAgICAgICAgICAgIGFsbG93ZWQgYW55IG51bWJlciBvZiBVUkJzLgorICovCitzdGF0aWMgaW50IHVzYnZpZGVvX1N0YXJ0RGF0YVB1bXAoc3RydWN0IHV2ZCAqdXZkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSB1dmQtPmRldjsKKwlpbnQgaSwgZXJyRmxhZzsKKworCWlmICh1dmQtPmRlYnVnID4gMSkKKwkJaW5mbygiJXMoJCVwKSIsIF9fRlVOQ1RJT05fXywgdXZkKTsKKworCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpIHsKKwkJZXJyKCIlczogQ2FtZXJhIGlzIG5vdCBvcGVyYXRpb25hbCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwl1dmQtPmN1cmZyYW1lID0gLTE7CisKKwkvKiBBbHRlcm5hdGUgaW50ZXJmYWNlIDEgaXMgaXMgdGhlIGJpZ2dlc3QgZnJhbWUgc2l6ZSAqLworCWkgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYsIHV2ZC0+aWZhY2UsIHV2ZC0+aWZhY2VBbHRBY3RpdmUpOworCWlmIChpIDwgMCkgeworCQllcnIoIiVzOiB1c2Jfc2V0X2ludGVyZmFjZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CisJCXV2ZC0+bGFzdF9lcnJvciA9IGk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIHZpZGVvU3RhcnQpKQorCQlHRVRfQ0FMTEJBQ0sodXZkLCB2aWRlb1N0YXJ0KSh1dmQpOworCWVsc2UgCisJCWVycigiJXM6IHZpZGVvU3RhcnQgbm90IHNldCIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBXZSBkb3VibGUgYnVmZmVyIHRoZSBJc28gbGlzdHMgKi8KKwlmb3IgKGk9MDsgaSA8IFVTQlZJREVPX05VTVNCVUY7IGkrKykgeworCQlpbnQgaiwgazsKKwkJc3RydWN0IHVyYiAqdXJiID0gdXZkLT5zYnVmW2ldLnVyYjsKKwkJdXJiLT5kZXYgPSBkZXY7CisJCXVyYi0+Y29udGV4dCA9IHV2ZDsKKwkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKGRldiwgdXZkLT52aWRlb19lbmRwKTsKKwkJdXJiLT5pbnRlcnZhbCA9IDE7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXZkLT5zYnVmW2ldLmRhdGE7CisJCXVyYi0+Y29tcGxldGUgPSB1c2J2aWRlb19Jc29jSXJxOworCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gRlJBTUVTX1BFUl9ERVNDOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB1dmQtPmlzb19wYWNrZXRfbGVuICogRlJBTUVTX1BFUl9ERVNDOworCQlmb3IgKGo9az0wOyBqIDwgRlJBTUVTX1BFUl9ERVNDOyBqKyssIGsgKz0gdXZkLT5pc29fcGFja2V0X2xlbikgeworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBrOworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSB1dmQtPmlzb19wYWNrZXRfbGVuOworCQl9CisJfQorCisJLyogU3VibWl0IGFsbCBVUkJzICovCisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJZXJyRmxhZyA9IHVzYl9zdWJtaXRfdXJiKHV2ZC0+c2J1ZltpXS51cmIsIEdGUF9LRVJORUwpOworCQlpZiAoZXJyRmxhZykKKwkJCWVycigiJXM6IHVzYl9zdWJtaXRfaXNvYyglZCkgcmV0ICVkIiwgX19GVU5DVElPTl9fLCBpLCBlcnJGbGFnKTsKKwl9CisKKwl1dmQtPnN0cmVhbWluZyA9IDE7CisJaWYgKHV2ZC0+ZGVidWcgPiAxKQorCQlpbmZvKCIlczogc3RyZWFtaW5nPTEgdmlkZW9fZW5kcD0kJTAyeCIsIF9fRlVOQ1RJT05fXywgdXZkLT52aWRlb19lbmRwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHVzYnZpZGVvX1N0b3BEYXRhUHVtcCgpCisgKgorICogVGhpcyBwcm9jZWR1cmUgc3RvcHMgc3RyZWFtaW5nIGFuZCBkZWFsbG9jYXRlcyBVUkJzLiBUaGVuIGl0CisgKiBhY3RpdmF0ZXMgemVyby1iYW5kd2lkdGggYWx0LiBzZXR0aW5nIG9mIHRoZSB2aWRlbyBpbnRlcmZhY2UuCisgKgorICogSGlzdG9yeToKKyAqIDIyLUphbi0yMDAwIENvcnJlY3RlZCBvcmRlciBvZiBhY3Rpb25zIHRvIHdvcmsgYWZ0ZXIgc3VycHJpc2UgcmVtb3ZhbC4KKyAqIDI3LUphbi0yMDAwIFVzZWQgdXZkLT5pZmFjZSwgdXZkLT5pZmFjZUFsdEluYWN0aXZlIGluc3RlYWQgb2YgaGFyZGNvZGVkIHZhbHVlcy4KKyAqLworc3RhdGljIHZvaWQgdXNidmlkZW9fU3RvcERhdGFQdW1wKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpbnQgaSwgajsKKworCWlmICgodXZkID09IE5VTEwpIHx8ICghdXZkLT5zdHJlYW1pbmcpIHx8ICh1dmQtPmRldiA9PSBOVUxMKSkKKwkJcmV0dXJuOworCisJaWYgKHV2ZC0+ZGVidWcgPiAxKQorCQlpbmZvKCIlcygkJXApIiwgX19GVU5DVElPTl9fLCB1dmQpOworCisJLyogVW5zY2hlZHVsZSBhbGwgb2YgdGhlIGlzbyB0ZCdzICovCisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJdXNiX2tpbGxfdXJiKHV2ZC0+c2J1ZltpXS51cmIpOworCX0KKwlpZiAodXZkLT5kZWJ1ZyA+IDEpCisJCWluZm8oIiVzOiBzdHJlYW1pbmc9MCIsIF9fRlVOQ1RJT05fXyk7CisJdXZkLT5zdHJlYW1pbmcgPSAwOworCisJaWYgKCF1dmQtPnJlbW92ZV9wZW5kaW5nKSB7CisJCS8qIEludm9rZSBtaW5pZHJpdmVyJ3MgbWFnaWMgdG8gc3RvcCB0aGUgY2FtZXJhICovCisJCWlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIHZpZGVvU3RvcCkpCisJCQlHRVRfQ0FMTEJBQ0sodXZkLCB2aWRlb1N0b3ApKHV2ZCk7CisJCWVsc2UgCisJCQllcnIoIiVzOiB2aWRlb1N0b3Agbm90IHNldCIsIF9fRlVOQ1RJT05fXyk7CisKKwkJLyogU2V0IHBhY2tldCBzaXplIHRvIDAgKi8KKwkJaiA9IHVzYl9zZXRfaW50ZXJmYWNlKHV2ZC0+ZGV2LCB1dmQtPmlmYWNlLCB1dmQtPmlmYWNlQWx0SW5hY3RpdmUpOworCQlpZiAoaiA8IDApIHsKKwkJCWVycigiJXM6IHVzYl9zZXRfaW50ZXJmYWNlKCkgZXJyb3IgJWQuIiwgX19GVU5DVElPTl9fLCBqKTsKKwkJCXV2ZC0+bGFzdF9lcnJvciA9IGo7CisJCX0KKwl9Cit9CisKKy8qCisgKiB1c2J2aWRlb19OZXdGcmFtZSgpCisgKgorICogSGlzdG9yeToKKyAqIDI5LU1hci0wMCBBZGRlZCBjb3B5aW5nIG9mIHByZXZpb3VzIGZyYW1lIGludG8gdGhlIGN1cnJlbnQgb25lLgorICogNi1BdWctMDAgIEFkZGVkIG1vZGVsIDMgdmlkZW8gc2l6ZXMsIHJlbW92ZWQgcmVkdW5kYW50IHdpZHRoLCBoZWlnaHQuCisgKi8KK3N0YXRpYyBpbnQgdXNidmlkZW9fTmV3RnJhbWUoc3RydWN0IHV2ZCAqdXZkLCBpbnQgZnJhbWVudW0pCit7CisJc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZTsKKwlpbnQgbjsKKworCWlmICh1dmQtPmRlYnVnID4gMSkKKwkJaW5mbygidXNidmlkZW9fTmV3RnJhbWUoJCVwLCVkLikiLCB1dmQsIGZyYW1lbnVtKTsKKworCS8qIElmIHdlJ3JlIG5vdCBncmFiYmluZyBhIGZyYW1lIHJpZ2h0IG5vdyBhbmQgdGhlIG90aGVyIGZyYW1lIGlzICovCisJLyogIHJlYWR5IHRvIGJlIGdyYWJiZWQgaW50bywgdGhlbiB1c2UgaXQgaW5zdGVhZCAqLworCWlmICh1dmQtPmN1cmZyYW1lICE9IC0xKQorCQlyZXR1cm4gMDsKKworCS8qIElmIG5lY2Vzc2FyeSB3ZSBhZGp1c3QgcGljdHVyZSBzZXR0aW5ncyBiZXR3ZWVuIGZyYW1lcyAqLworCWlmICghdXZkLT5zZXR0aW5nc0FkanVzdGVkKSB7CisJCWlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIGFkanVzdFBpY3R1cmUpKQorCQkJR0VUX0NBTExCQUNLKHV2ZCwgYWRqdXN0UGljdHVyZSkodXZkKTsKKwkJdXZkLT5zZXR0aW5nc0FkanVzdGVkID0gMTsKKwl9CisKKwluID0gKGZyYW1lbnVtICsgMSkgJSBVU0JWSURFT19OVU1GUkFNRVM7CisJaWYgKHV2ZC0+ZnJhbWVbbl0uZnJhbWVTdGF0ZSA9PSBGcmFtZVN0YXRlX1JlYWR5KQorCQlmcmFtZW51bSA9IG47CisKKwlmcmFtZSA9ICZ1dmQtPmZyYW1lW2ZyYW1lbnVtXTsKKworCWZyYW1lLT5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9HcmFiYmluZzsKKwlmcmFtZS0+c2NhbnN0YXRlID0gU2NhblN0YXRlX1NjYW5uaW5nOworCWZyYW1lLT5zZXFSZWFkX0xlbmd0aCA9IDA7CS8qIEFjY3VtdWxhdGVkIGluIHh4eF9wYXJzZV9kYXRhKCkgKi8KKwlmcmFtZS0+ZGVpbnRlcmxhY2UgPSBEZWludGVybGFjZV9Ob25lOworCWZyYW1lLT5mbGFncyA9IDA7IC8qIE5vIGZsYWdzIHlldCwgdXAgdG8gbWluaWRyaXZlciAob3IgdXMpIHRvIHNldCB0aGVtICovCisJdXZkLT5jdXJmcmFtZSA9IGZyYW1lbnVtOworCisJLyoKKwkgKiBOb3JtYWxseSB3ZSB3b3VsZCB3YW50IHRvIGNvcHkgcHJldmlvdXMgZnJhbWUgaW50byB0aGUgY3VycmVudCBvbmUKKwkgKiBiZWZvcmUgd2UgZXZlbiBzdGFydCBmaWxsaW5nIGl0IHdpdGggZGF0YTsgdGhpcyBhbGxvd3MgdXMgdG8gc3RvcAorCSAqIGZpbGxpbmcgYXQgYW55IG1vbWVudDsgdG9wIHBvcnRpb24gb2YgdGhlIGZyYW1lIHdpbGwgYmUgbmV3IGFuZAorCSAqIGJvdHRvbSBwb3J0aW9uIHdpbGwgc3RheSBhcyBpdCB3YXMgaW4gcHJldmlvdXMgZnJhbWUuIElmIHdlIGRvbid0CisJICogZG8gdGhhdCB0aGVuIG1pc3NpbmcgY2h1bmtzIG9mIHZpZGVvIHN0cmVhbSB3aWxsIHJlc3VsdCBpbiBmbGlja2VyaW5nCisJICogcG9ydGlvbnMgb2Ygb2xkIGRhdGEgd2hhdGV2ZXIgaXQgd2FzIGJlZm9yZS4KKwkgKgorCSAqIElmIHdlIGNob29zZSBub3QgdG8gY29weSBwcmV2aW91cyBmcmFtZSAodG8sIGZvciBleGFtcGxlLCBzYXZlIGZldworCSAqIGJ1cyBjeWNsZXMgLSB0aGUgZnJhbWUgY2FuIGJlIHByZXR0eSBsYXJnZSEpIHRoZW4gd2UgaGF2ZSBhbiBvcHRpb24KKwkgKiB0byBjbGVhciB0aGUgZnJhbWUgYmVmb3JlIHVzaW5nLiBJZiB3ZSBleHBlcmllbmNlIGxvc3NlcyBpbiB0aGlzCisJICogbW9kZSB0aGVuIG1pc3NpbmcgcGljdHVyZSB3aWxsIGJlIGJsYWNrIChubyBmbGlja2VyaW5nKS4KKwkgKgorCSAqIEZpbmFsbHksIGlmIHVzZXIgY2hvb3NlcyBub3QgdG8gY2xlYW4gdGhlIGN1cnJlbnQgZnJhbWUgYmVmb3JlCisJICogZmlsbGluZyBpdCB3aXRoIGRhdGEgdGhlbiB0aGUgb2xkIGRhdGEgd2lsbCBiZSB2aXNpYmxlIGlmIHdlIGZhaWwKKwkgKiB0byByZWZpbGwgZW50aXJlIGZyYW1lIHdpdGggbmV3IGRhdGEuCisJICovCisJaWYgKCEodXZkLT5mbGFncyAmIEZMQUdTX1NFUEFSQVRFX0ZSQU1FUykpIHsKKwkJLyogVGhpcyBjb3BpZXMgcHJldmlvdXMgZnJhbWUgaW50byB0aGlzIG9uZSB0byBtYXNrIGxvc3NlcyAqLworCQlpbnQgcHJldiA9IChmcmFtZW51bSAtIDEgKyBVU0JWSURFT19OVU1GUkFNRVMpICUgVVNCVklERU9fTlVNRlJBTUVTOworCQltZW1tb3ZlKGZyYW1lLT5kYXRhLCB1dmQtPmZyYW1lW3ByZXZdLmRhdGEsIHV2ZC0+bWF4X2ZyYW1lX3NpemUpOworCX0gZWxzZSB7CisJCWlmICh1dmQtPmZsYWdzICYgRkxBR1NfQ0xFQU5fRlJBTUVTKSB7CisJCQkvKiBUaGlzIHByb3ZpZGVzIGEgImNsZWFuIiBmcmFtZSBidXQgc2xvd3MgdGhpbmdzIGRvd24gKi8KKwkJCW1lbXNldChmcmFtZS0+ZGF0YSwgMCwgdXZkLT5tYXhfZnJhbWVfc2l6ZSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1c2J2aWRlb19Db2xsZWN0UmF3RGF0YSgpCisgKgorICogVGhpcyBwcm9jZWR1cmUgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiAncHJvY2Vzc0RhdGEnIGNhbGxiYWNrIGlmIHlvdQorICogb25seSB3YW50IHRvIGR1bXAgdGhlIHJhdyBkYXRhIGZyb20gdGhlIGNhbWVyYSBpbnRvIHRoZSBvdXRwdXQKKyAqIGRldmljZSAoZnJhbWUgYnVmZmVyKS4gWW91IGNhbiBsb29rIGF0IGl0IHdpdGggVjRMIGNsaWVudCwgYnV0IHRoZQorICogaW1hZ2Ugd2lsbCBiZSB1bndhdGNoYWJsZS4gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGNvZGUgYW5kIG9mIHRoZQorICogbW9kZSBGTEFHU19OT19ERUNPRElORyBpcyBkZWJ1Z2dpbmcgYW5kIGNhcHR1cmluZyBvZiBkYXRhc3RyZWFtcyBmcm9tCisgKiBuZXcsIHVua25vd24gY2FtZXJhcy4gVGhpcyBwcm9jZWR1cmUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGludm9rZWQKKyAqIGluc3RlYWQgb2YgdGhlIHNwZWNpZmllZCBjYWxsYmFjayBoYW5kbGVyIHdoZW4gdXZkLT5mbGFncyBoYXMgYml0CisgKiBGTEFHU19OT19ERUNPRElORyBzZXQuIFRoZXJlZm9yZSwgYW55IHJlZ3VsYXIgYnVpbGQgb2YgYW55IGRyaXZlcgorICogYmFzZWQgb24gdXNidmlkZW8gY2FuIHVzZSB0aGlzIGZlYXR1cmUgYXQgYW55IHRpbWUuCisgKi8KK3N0YXRpYyB2b2lkIHVzYnZpZGVvX0NvbGxlY3RSYXdEYXRhKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSkKK3sKKwlpbnQgbjsKKworCWFzc2VydCh1dmQgIT0gTlVMTCk7CisJYXNzZXJ0KGZyYW1lICE9IE5VTEwpOworCisJLyogVHJ5IHRvIG1vdmUgZGF0YSBmcm9tIHF1ZXVlIGludG8gZnJhbWUgYnVmZmVyICovCisJbiA9IFJpbmdRdWV1ZV9HZXRMZW5ndGgoJnV2ZC0+ZHApOworCWlmIChuID4gMCkgeworCQlpbnQgbTsKKwkJLyogU2VlIGhvdyBtdWNoIHNwYWNlIHdlIGhhdmUgbGVmdCAqLworCQltID0gdXZkLT5tYXhfZnJhbWVfc2l6ZSAtIGZyYW1lLT5zZXFSZWFkX0xlbmd0aDsKKwkJaWYgKG4gPiBtKQorCQkJbiA9IG07CisJCS8qIE5vdyBtb3ZlIHRoYXQgbXVjaCBkYXRhIGludG8gZnJhbWUgYnVmZmVyICovCisJCVJpbmdRdWV1ZV9EZXF1ZXVlKAorCQkJJnV2ZC0+ZHAsCisJCQlmcmFtZS0+ZGF0YSArIGZyYW1lLT5zZXFSZWFkX0xlbmd0aCwKKwkJCW0pOworCQlmcmFtZS0+c2VxUmVhZF9MZW5ndGggKz0gbTsKKwl9CisJLyogU2VlIGlmIHdlIGZpbGxlZCB0aGUgZnJhbWUgKi8KKwlpZiAoZnJhbWUtPnNlcVJlYWRfTGVuZ3RoID49IHV2ZC0+bWF4X2ZyYW1lX3NpemUpIHsKKwkJZnJhbWUtPmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX0RvbmU7CisJCXV2ZC0+Y3VyZnJhbWUgPSAtMTsKKwkJdXZkLT5zdGF0cy5mcmFtZV9udW0rKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdXNidmlkZW9fR2V0RnJhbWUoc3RydWN0IHV2ZCAqdXZkLCBpbnQgZnJhbWVOdW0pCit7CisJc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSA9ICZ1dmQtPmZyYW1lW2ZyYW1lTnVtXTsKKworCWlmICh1dmQtPmRlYnVnID49IDIpCisJCWluZm8oIiVzKCQlcCwlZC4pIiwgX19GVU5DVElPTl9fLCB1dmQsIGZyYW1lTnVtKTsKKworCXN3aXRjaCAoZnJhbWUtPmZyYW1lU3RhdGUpIHsKKyAgICAgICAgY2FzZSBGcmFtZVN0YXRlX1VudXNlZDoKKwkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKKwkJCWluZm8oIiVzOiBGcmFtZVN0YXRlX1VudXNlZCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRUlOVkFMOworICAgICAgICBjYXNlIEZyYW1lU3RhdGVfUmVhZHk6CisgICAgICAgIGNhc2UgRnJhbWVTdGF0ZV9HcmFiYmluZzoKKyAgICAgICAgY2FzZSBGcmFtZVN0YXRlX0Vycm9yOgorICAgICAgICB7CisJCWludCBudHJpZXMsIHNpZ25hbFBlbmRpbmc7CisJcmVkbzoKKwkJaWYgKCFDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSkgeworCQkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKKwkJCQlpbmZvKCIlczogQ2FtZXJhIGlzIG5vdCBvcGVyYXRpb25hbCAoMSkiLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJbnRyaWVzID0gMDsgCisJCWRvIHsKKwkJCVJpbmdRdWV1ZV9JbnRlcnJ1cHRpYmxlU2xlZXBPbigmdXZkLT5kcCk7CisJCQlzaWduYWxQZW5kaW5nID0gc2lnbmFsX3BlbmRpbmcoY3VycmVudCk7CisJCQlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpKSB7CisJCQkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKKwkJCQkJaW5mbygiJXM6IENhbWVyYSBpcyBub3Qgb3BlcmF0aW9uYWwgKDIpIiwgX19GVU5DVElPTl9fKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWFzc2VydCh1dmQtPmZidWYgIT0gTlVMTCk7CisJCQlpZiAoc2lnbmFsUGVuZGluZykgeworCQkJCWlmICh1dmQtPmRlYnVnID49IDIpCisJCQkJCWluZm8oIiVzOiBTaWduYWw9JCUwOHgiLCBfX0ZVTkNUSU9OX18sIHNpZ25hbFBlbmRpbmcpOworCQkJCWlmICh1dmQtPmZsYWdzICYgRkxBR1NfUkVUUllfVklESU9DU1lOQykgeworCQkJCQl1c2J2aWRlb19UZXN0UGF0dGVybih1dmQsIDEsIDApOworCQkJCQl1dmQtPmN1cmZyYW1lID0gLTE7CisJCQkJCXV2ZC0+c3RhdHMuZnJhbWVfbnVtKys7CisJCQkJCWlmICh1dmQtPmRlYnVnID49IDIpCisJCQkJCQlpbmZvKCIlczogRm9yY2VkIHRlc3QgcGF0dGVybiBzY3JlZW4iLCBfX0ZVTkNUSU9OX18pOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBTdGFuZGFyZCBhbnN3ZXI6IEludGVycnVwdGVkISAqLworCQkJCQlpZiAodXZkLT5kZWJ1ZyA+PSAyKQorCQkJCQkJaW5mbygiJXM6IEludGVycnVwdGVkISIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCXJldHVybiAtRUlOVFI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBObyBzaWduYWxzIC0gd2UganVzdCBnb3QgbmV3IGRhdGEgaW4gZHAgcXVldWUgKi8KKwkJCQlpZiAodXZkLT5mbGFncyAmIEZMQUdTX05PX0RFQ09ESU5HKQorCQkJCQl1c2J2aWRlb19Db2xsZWN0UmF3RGF0YSh1dmQsIGZyYW1lKTsKKwkJCQllbHNlIGlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIHByb2Nlc3NEYXRhKSkKKwkJCQkJR0VUX0NBTExCQUNLKHV2ZCwgcHJvY2Vzc0RhdGEpKHV2ZCwgZnJhbWUpOworCQkJCWVsc2UgCisJCQkJCWVycigiJXM6IHByb2Nlc3NEYXRhIG5vdCBzZXQiLCBfX0ZVTkNUSU9OX18pOworCQkJfQorCQl9IHdoaWxlIChmcmFtZS0+ZnJhbWVTdGF0ZSA9PSBGcmFtZVN0YXRlX0dyYWJiaW5nKTsKKwkJaWYgKHV2ZC0+ZGVidWcgPj0gMikgeworCQkJaW5mbygiJXM6IEdyYWJiaW5nIGRvbmU7IHN0YXRlPSVkLiAoJWx1LiBieXRlcykiLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIGZyYW1lLT5mcmFtZVN0YXRlLCBmcmFtZS0+c2VxUmVhZF9MZW5ndGgpOworCQl9CisJCWlmIChmcmFtZS0+ZnJhbWVTdGF0ZSA9PSBGcmFtZVN0YXRlX0Vycm9yKSB7CisJCQlpbnQgcmV0ID0gdXNidmlkZW9fTmV3RnJhbWUodXZkLCBmcmFtZU51bSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWVycigiJXM6IHVzYnZpZGVvX05ld0ZyYW1lKCkgZmFpbGVkICglZC4pIiwgX19GVU5DVElPTl9fLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlnb3RvIHJlZG87CisJCX0KKwkJLyogTm90ZSB0aGF0IHdlIGZhbGwgdGhyb3VnaCB0byBtZWV0IG91ciBkZXN0aW55IGJlbG93ICovCisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcmFtZVN0YXRlX0RvbmU6CisJCS8qCisJCSAqIERvIGFsbCBuZWNlc3NhcnkgcG9zdHByb2Nlc3Npbmcgb2YgZGF0YSBwcmVwYXJlZCBpbgorCQkgKiAiaW50ZXJydXB0IiBjb2RlIGFuZCB0aGUgY29sbGVjdGluZyBjb2RlIGFib3ZlLiBUaGUKKwkJICogZnJhbWUgZ2V0cyBtYXJrZWQgYXMgRnJhbWVTdGF0ZV9Eb25lIGJ5IHF1ZXVlIHBhcnNpbmcgY29kZS4KKwkJICogVGhpcyBzdGF0dXMgbWVhbnMgdGhhdCB3ZSBjb2xsZWN0ZWQgZW5vdWdoIGRhdGEgYW5kCisJCSAqIG1vc3QgbGlrZWx5IHByb2Nlc3NlZCBpdCBhcyB3ZSB3ZW50IHRocm91Z2guIEhvd2V2ZXIKKwkJICogdGhlIGRhdGEgbWF5IG5lZWQgcG9zdHByb2Nlc3NpbmcsIHN1Y2ggYXMgZGVpbnRlcmxhY2luZworCQkgKiBvciBwaWN0dXJlIGFkanVzdG1lbnRzIGltcGxlbWVudGVkIGluIHNvZnR3YXJlIChob3Jyb3IhKQorCQkgKgorCQkgKiBBcyBzb29uIGFzIHRoZSBmcmFtZSBiZWNvbWVzICJmaW5hbCIgaXQgZ2V0cyBwcm9tb3RlZCB0bworCQkgKiBGcmFtZVN0YXRlX0RvbmVfSG9sZCBzdGF0dXMgd2hlcmUgaXQgd2lsbCByZW1haW4gdW50aWwgdGhlCisJCSAqIGNhbGxlciBjb25zdW1lZCBhbGwgdGhlIHZpZGVvIGRhdGEgZnJvbSB0aGUgZnJhbWUuIFRoZW4KKwkJICogdGhlIGVtcHR5IHNoZWxsIG9mIGV4LWZyYW1lIGlzIHRocm93biBvdXQgZm9yIGRvZ3MgdG8gZWF0LgorCQkgKiBCdXQgd2UsIHdvcnJpZWQgYWJvdXQgcGV0cywgd2lsbCByZWN5Y2xlIHRoZSBmcmFtZSEKKwkJICovCisJCXV2ZC0+c3RhdHMuZnJhbWVfbnVtKys7CisJCWlmICgodXZkLT5mbGFncyAmIEZMQUdTX05PX0RFQ09ESU5HKSA9PSAwKSB7CisJCQlpZiAoVkFMSURfQ0FMTEJBQ0sodXZkLCBwb3N0UHJvY2VzcykpCisJCQkJR0VUX0NBTExCQUNLKHV2ZCwgcG9zdFByb2Nlc3MpKHV2ZCwgZnJhbWUpOworCQkJaWYgKGZyYW1lLT5mbGFncyAmIFVTQlZJREVPX0ZSQU1FX0ZMQUdfU09GVFdBUkVfQ09OVFJBU1QpCisJCQkJdXNidmlkZW9fU29mdHdhcmVDb250cmFzdEFkanVzdG1lbnQodXZkLCBmcmFtZSk7CisJCX0KKwkJZnJhbWUtPmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX0RvbmVfSG9sZDsKKwkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKKwkJCWluZm8oIiVzOiBFbnRlcmVkIEZyYW1lU3RhdGVfRG9uZV9Ib2xkIHN0YXRlLiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAwOworCisJY2FzZSBGcmFtZVN0YXRlX0RvbmVfSG9sZDoKKwkJLyoKKwkJICogV2Ugc3RheSBpbiB0aGlzIHN0YXRlIGluZGVmaW5pdGVseSB1bnRpbCBzb21lb25lIGV4dGVybmFsLAorCQkgKiBsaWtlIGlvY3RsKCkgb3IgcmVhZCgpIGNhbGwgZmluaXNoZXMgZGlnZXN0aW5nIHRoZSBmcmFtZQorCQkgKiBkYXRhLiBUaGVuIGl0IHdpbGwgbWFyayB0aGUgZnJhbWUgYXMgRnJhbWVTdGF0ZV9VbnVzZWQgYW5kCisJCSAqIGl0IHdpbGwgYmUgcmVsZWFzZWQgYmFjayBpbnRvIHRoZSB3aWxkIHRvIHJvYW0gZnJlZWx5LgorCQkgKi8KKwkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKKwkJCWluZm8oIiVzOiBGcmFtZVN0YXRlX0RvbmVfSG9sZCBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDYXRjaC1hbGwgZm9yIG90aGVyIGNhc2VzLiBXZSBzaGFsbCBub3QgYmUgaGVyZS4gKi8KKwllcnIoIiVzOiBJbnZhbGlkIHN0YXRlICVkLiIsIF9fRlVOQ1RJT05fXywgZnJhbWUtPmZyYW1lU3RhdGUpOworCWZyYW1lLT5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9VbnVzZWQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1c2J2aWRlb19EZWludGVybGFjZUZyYW1lKCkKKyAqCisgKiBUaGlzIHByb2NlZHVyZSBkZWludGVybGFjZXMgdGhlIGdpdmVuIGZyYW1lLiBTb21lIGNhbWVyYXMgcHJvZHVjZQorICogb25seSBoYWxmIG9mIHNjYW5saW5lcyAtIHNvbWV0aW1lcyBvbmx5IGV2ZW4gbGluZXMsIHNvbWV0aW1lcyBvbmx5CisgKiBvZGQgbGluZXMuIFRoZSBkZWludGVybGFjaW5nIG1ldGhvZCBpcyBzdG9yZWQgaW4gZnJhbWUtPmRlaW50ZXJsYWNlCisgKiB2YXJpYWJsZS4KKyAqCisgKiBIZXJlIHdlIHNjYW4gdGhlIGZyYW1lIHZlcnRpY2FsbHkgYW5kIHJlcGxhY2UgbWlzc2luZyBzY2FubGluZXMgd2l0aAorICogYXZlcmFnZSBiZXR3ZWVuIHN1cnJvdW5kaW5nIG9uZXMgLSBiZWZvcmUgYW5kIGFmdGVyLiBJZiB3ZSBoYXZlIG5vCisgKiBsaW5lIGFib3ZlIHRoZW4gd2UganVzdCBjb3B5IG5leHQgbGluZS4gU2ltaWxhcmx5LCBpZiB3ZSBuZWVkIHRvCisgKiBjcmVhdGUgYSBsYXN0IGxpbmUgdGhlbiBwcmVjZWRpbmcgbGluZSBpcyB1c2VkLgorICovCit2b2lkIHVzYnZpZGVvX0RlaW50ZXJsYWNlRnJhbWUoc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lKQoreworCWlmICgodXZkID09IE5VTEwpIHx8IChmcmFtZSA9PSBOVUxMKSkKKwkJcmV0dXJuOworCisJaWYgKChmcmFtZS0+ZGVpbnRlcmxhY2UgPT0gRGVpbnRlcmxhY2VfRmlsbEV2ZW5MaW5lcykgfHwKKwkgICAgKGZyYW1lLT5kZWludGVybGFjZSA9PSBEZWludGVybGFjZV9GaWxsT2RkTGluZXMpKQorCXsKKwkJY29uc3QgaW50IHY0bF9saW5lc2l6ZSA9IFZJREVPU0laRV9YKGZyYW1lLT5yZXF1ZXN0KSAqIFY0TF9CWVRFU19QRVJfUElYRUw7CisJCWludCBpID0gKGZyYW1lLT5kZWludGVybGFjZSA9PSBEZWludGVybGFjZV9GaWxsRXZlbkxpbmVzKSA/IDAgOiAxOworCisJCWZvciAoOyBpIDwgVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpOyBpICs9IDIpIHsKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmZzMSwgKmZzMjsKKwkJCXVuc2lnbmVkIGNoYXIgKmZkOworCQkJaW50IGlwLCBpbiwgajsJLyogUHJldmlvdXMgYW5kIG5leHQgbGluZXMgKi8KKworCQkJLyoKKwkJCSAqIE5lZWQgdG8gYXZlcmFnZSBsaW5lcyBiZWZvcmUgYW5kIGFmdGVyICdpJy4KKwkJCSAqIElmIHdlIGdvIG91dCBvZiBib3VuZHMgc2Vla2luZyB0aG9zZSBsaW5lcyB0aGVuCisJCQkgKiB3ZSBwb2ludCBiYWNrIHRvIGV4aXN0aW5nIGxpbmUuCisJCQkgKi8KKwkJCWlwID0gaSAtIDE7CS8qIEZpcnN0LCBnZXQgcm91Z2ggbnVtYmVycyAqLworCQkJaW4gPSBpICsgMTsKKworCQkJLyogTm93IHZhbGlkYXRlICovCisJCQlpZiAoaXAgPCAwKQorCQkJCWlwID0gaW47CisJCQlpZiAoaW4gPj0gVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpKQorCQkJCWluID0gaXA7CisKKwkJCS8qIFNhbml0eSBjaGVjayAqLworCQkJaWYgKChpcCA8IDApIHx8IChpbiA8IDApIHx8CisJCQkgICAgKGlwID49IFZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KSkgfHwKKwkJCSAgICAoaW4gPj0gVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpKSkKKwkJCXsKKwkJCQllcnIoIkVycm9yOiBpcD0lZC4gaW49JWQuIHJlcS5oZWlnaHQ9JWxkLiIsCisJCQkJICAgIGlwLCBpbiwgVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogTm93IHdlIG5lZWQgdG8gYXZlcmFnZSBsaW5lcyAnaXAnIGFuZCAnaW4nIHRvIHByb2R1Y2UgbGluZSAnaScgKi8KKwkJCWZzMSA9IGZyYW1lLT5kYXRhICsgKHY0bF9saW5lc2l6ZSAqIGlwKTsKKwkJCWZzMiA9IGZyYW1lLT5kYXRhICsgKHY0bF9saW5lc2l6ZSAqIGluKTsKKwkJCWZkID0gZnJhbWUtPmRhdGEgKyAodjRsX2xpbmVzaXplICogaSk7CisKKwkJCS8qIEF2ZXJhZ2UgbGluZXMgYXJvdW5kIGRlc3RpbmF0aW9uICovCisJCQlmb3IgKGo9MDsgaiA8IHY0bF9saW5lc2l6ZTsgaisrKSB7CisJCQkJZmRbal0gPSAodW5zaWduZWQgY2hhcikoKCgodW5zaWduZWQpIGZzMVtqXSkgKworCQkJCQkJCSAoKHVuc2lnbmVkKWZzMltqXSkpID4+IDEpOworCQkJfQorCQl9CisJfQorCisJLyogT3B0aW9uYWxseSBkaXNwbGF5IHN0YXRpc3RpY3Mgb24gdGhlIHNjcmVlbiAqLworCWlmICh1dmQtPmZsYWdzICYgRkxBR1NfT1ZFUkxBWV9TVEFUUykKKwkJdXNidmlkZW9fT3ZlcmxheVN0YXRzKHV2ZCwgZnJhbWUpOworfQorCitFWFBPUlRfU1lNQk9MKHVzYnZpZGVvX0RlaW50ZXJsYWNlRnJhbWUpOworCisvKgorICogdXNidmlkZW9fU29mdHdhcmVDb250cmFzdEFkanVzdG1lbnQoKQorICoKKyAqIFRoaXMgY29kZSBhZGp1c3RzIHRoZSBjb250cmFzdCBvZiB0aGUgZnJhbWUsIGFzc3VtaW5nIFJHQjI0IGZvcm1hdC4KKyAqIEFzIG1vc3Qgc29mdHdhcmUgaW1hZ2UgcHJvY2Vzc2luZywgdGhpcyBqb2IgaXMgQ1BVLWludGVuc2l2ZS4KKyAqIEdldCBhIGNhbWVyYSB0aGF0IHN1cHBvcnRzIGhhcmR3YXJlIGFkanVzdG1lbnQhCisgKgorICogSGlzdG9yeToKKyAqIDA5LUZlYi0yMDAxICBDcmVhdGVkLgorICovCitzdGF0aWMgdm9pZCB1c2J2aWRlb19Tb2Z0d2FyZUNvbnRyYXN0QWRqdXN0bWVudChzdHJ1Y3QgdXZkICp1dmQsIAorCQkJCQkJc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSkKK3sKKwlpbnQgaSwgaiwgdjRsX2xpbmVzaXplOworCXNpZ25lZCBsb25nIGFkajsKKwljb25zdCBpbnQgY2NtID0gMTI4OyAvKiBDb2xvciBjb3JyZWN0aW9uIG1lZGlhbiAtIHNlZSBiZWxvdyAqLworCisJaWYgKCh1dmQgPT0gTlVMTCkgfHwgKGZyYW1lID09IE5VTEwpKSB7CisJCWVycigiJXM6IElsbGVnYWwgY2FsbC4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCWFkaiA9ICh1dmQtPnZwaWMuY29udHJhc3QgLSAweDgwMDApID4+IDg7IC8qIC0xMjguLisxMjcgPSAtY2NtLi4rKGNjbS0xKSovCisJUkVTVFJJQ1RfVE9fUkFOR0UoYWRqLCAtY2NtLCBjY20rMSk7CisJaWYgKGFkaiA9PSAwKSB7CisJCS8qIEluIHJhcmUgY2FzZSBvZiBubyBhZGp1c3RtZW50ICovCisJCXJldHVybjsKKwl9CisJdjRsX2xpbmVzaXplID0gVklERU9TSVpFX1goZnJhbWUtPnJlcXVlc3QpICogVjRMX0JZVEVTX1BFUl9QSVhFTDsKKwlmb3IgKGk9MDsgaSA8IFZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KTsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgKmZkID0gZnJhbWUtPmRhdGEgKyAodjRsX2xpbmVzaXplICogaSk7CisJCWZvciAoaj0wOyBqIDwgdjRsX2xpbmVzaXplOyBqKyspIHsKKwkJCXNpZ25lZCBsb25nIHYgPSAoc2lnbmVkIGxvbmcpIGZkW2pdOworCQkJLyogTWFnbmlmeSB1cCB0byAyIHRpbWVzLCByZWR1Y2UgZG93biB0byB6ZXJvICovCisJCQl2ID0gMTI4ICsgKChjY20gKyBhZGopICogKHYgLSAxMjgpKSAvIGNjbTsKKwkJCVJFU1RSSUNUX1RPX1JBTkdFKHYsIDAsIDB4RkYpOyAvKiBNdXN0IGZsYXR0ZW4gdGFpbHMgKi8KKwkJCWZkW2pdID0gKHVuc2lnbmVkIGNoYXIpIHY7CisJCX0KKwl9Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3VzYnZpZGVvLmggYi9kcml2ZXJzL3VzYi9tZWRpYS91c2J2aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzkwYTFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvdXNidmlkZW8uaApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaWZuZGVmIHVzYnZpZGVvX2gKKyNkZWZpbmUJdXNidmlkZW9faAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworLyogTW9zdCBoZWxwZnVsIGRlYnVnZ2luZyBhaWQgKi8KKyNkZWZpbmUgYXNzZXJ0KGV4cHIpICgodm9pZCkgKChleHByKSA/IDAgOiAoZXJyKCJhc3NlcnQgZmFpbGVkIGF0IGxpbmUgJWQiLF9fTElORV9fKSkpKQorCisjZGVmaW5lIFVTQlZJREVPX1JFUE9SVF9TVEFUUwkxCS8qIFNldCB0byAwIHRvIGJsb2NrIHN0YXRpc3RpY3Mgb24gY2xvc2UgKi8KKworLyogQml0IGZsYWdzIChvcHRpb25zKSAqLworI2RlZmluZSBGTEFHU19SRVRSWV9WSURJT0NTWU5DCQkoMSA8PCAwKQorI2RlZmluZQlGTEFHU19NT05PQ0hST01FCQkoMSA8PCAxKQorI2RlZmluZSBGTEFHU19ESVNQTEFZX0hJTlRTCQkoMSA8PCAyKQorI2RlZmluZSBGTEFHU19PVkVSTEFZX1NUQVRTCQkoMSA8PCAzKQorI2RlZmluZSBGTEFHU19GT1JDRV9URVNUUEFUVEVSTgkJKDEgPDwgNCkKKyNkZWZpbmUgRkxBR1NfU0VQQVJBVEVfRlJBTUVTCQkoMSA8PCA1KQorI2RlZmluZSBGTEFHU19DTEVBTl9GUkFNRVMJCSgxIDw8IDYpCisjZGVmaW5lCUZMQUdTX05PX0RFQ09ESU5HCQkoMSA8PCA3KQorCisvKiBCaXQgZmxhZ3MgZm9yIGZyYW1lcyAoYXBwbHkgdG8gdGhlIGZyYW1lIHdoZXJlIHRoZXkgYXJlIHNwZWNpZmllZCkgKi8KKyNkZWZpbmUgVVNCVklERU9fRlJBTUVfRkxBR19TT0ZUV0FSRV9DT05UUkFTVAkoMSA8PCAwKQorCisvKiBDYW1lcmEgY2FwYWJpbGl0aWVzIChtYXhpbXVtKSAqLworI2RlZmluZSBDQU1FUkFfVVJCX0ZSQU1FUyAgICAgICAzMgorI2RlZmluZSBDQU1FUkFfTUFYX0lTT19QQUNLRVQgICAxMDIzIC8qIDEwMjIgYWN0dWFsbHkgc2VudCBieSBjYW1lcmEgKi8KKyNkZWZpbmUgRlJBTUVTX1BFUl9ERVNDCQkoQ0FNRVJBX1VSQl9GUkFNRVMpCisjZGVmaW5lIEZSQU1FX1NJWkVfUEVSX0RFU0MJKENBTUVSQV9NQVhfSVNPX1BBQ0tFVCkKKworLyogVGhpcyBtYWNybyByZXN0cmljdHMgYW4gaW50IHZhcmlhYmxlIHRvIGFuIGluY2x1c2l2ZSByYW5nZSAqLworI2RlZmluZSBSRVNUUklDVF9UT19SQU5HRSh2LG1pLG1hKSB7IGlmICgodikgPCAobWkpKSAodikgPSAobWkpOyBlbHNlIGlmICgodikgPiAobWEpKSAodikgPSAobWEpOyB9CisKKyNkZWZpbmUgVjRMX0JZVEVTX1BFUl9QSVhFTCAgICAgMwkvKiBCZWNhdXNlIHdlIHByb2R1Y2UgUkdCMjQgKi8KKworLyoKKyAqIFVzZSB0aGlzIG1hY3JvIHRvIGNvbnN0cnVjdCBjb25zdGFudHMgZm9yIGRpZmZlcmVudCB2aWRlbyBzaXplcy4KKyAqIFdlIGhhdmUgdG8gZGVhbCB3aXRoIGRpZmZlcmVudCB2aWRlbyBzaXplcyB0aGF0IGhhdmUgdG8gYmUKKyAqIGNvbmZpZ3VyZWQgaW4gdGhlIGRldmljZSBvciBjb21wYXJlZCBhZ2FpbnN0IHdoZW4gd2UgcmVjZWl2ZQorICogYSBkYXRhLiBOb3JtYWxseSBvbmUgd291bGQgZGVmaW5lIGEgYnVuY2ggb2YgVklERU9TSVpFX3hfYnlfeQorICogI2RlZmluZXMgYW5kIHRoYXQncyB0aGUgZW5kIG9mIHN0b3J5LiBIb3dldmVyIHRoaXMgc29sdXRpb24KKyAqIGRvZXMgbm90IGFsbG93IHRvIGNvbnZlcnQgYmV0d2VlbiByZWFsIHBpeGVsIHNpemVzIGFuZCB0aGUKKyAqIGNvbnN0YW50IChpbnRlZ2VyKSB2YWx1ZSB0aGF0IG1heSBiZSB1c2VkIHRvIHRhZyBhIGZyYW1lIG9yCisgKiB3aGF0ZXZlci4gVGhlIHNldCBvZiBtYWNyb3MgYmVsb3cgY29uc3RydWN0cyB2aWRlb3NpemUgY29uc3RhbnRzCisgKiBmcm9tIHRoZSBwaXhlbCBzaXplIGFuZCBhbGxvd3MgdG8gcmVjb25zdHJ1Y3QgdGhlIHBpeGVsIHNpemUKKyAqIGZyb20gdGhlIGNvbWJpbmVkIHZhbHVlIGxhdGVyLgorICovCisjZGVmaW5lCVZJREVPU0laRSh4LHkpCSgoKHgpICYgMHhGRkZGTCkgfCAoKCh5KSAmIDB4RkZGRkwpIDw8IDE2KSkKKyNkZWZpbmUJVklERU9TSVpFX1godnMpCSgodnMpICYgMHhGRkZGTCkKKyNkZWZpbmUJVklERU9TSVpFX1kodnMpCSgoKHZzKSA+PiAxNikgJiAweEZGRkZMKQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHZpZGVvc2l6ZV90OworCisvKgorICogVGhpcyBtYWNybyBjaGVja3MgaWYgdGhlIGNhbWVyYSBpcyBzdGlsbCBvcGVyYXRpb25hbC4gVGhlICd1dmQnCisgKiBwb2ludGVyIG11c3QgYmUgdmFsaWQsIHV2ZC0+ZGV2IG11c3QgYmUgdmFsaWQsIHdlIGFyZSBub3QKKyAqIHJlbW92aW5nIHRoZSBkZXZpY2UgYW5kIHRoZSBkZXZpY2UgaGFzIG5vdCBlcnJlZCBvbiB1cy4KKyAqLworI2RlZmluZSBDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSAoXAorCSh1dmQgIT0gTlVMTCkgJiYgXAorCSgodXZkKS0+ZGV2ICE9IE5VTEwpICYmIFwKKwkoKHV2ZCktPmxhc3RfZXJyb3IgPT0gMCkgJiYgXAorCSghKHV2ZCktPnJlbW92ZV9wZW5kaW5nKSkKKworLyoKKyAqIFdlIHVzZSBtYWNyb3MgdG8gZG8gWVVWIC0+IFJHQiBjb252ZXJzaW9uIGJlY2F1c2UgdGhpcyBpcworICogdmVyeSBpbXBvcnRhbnQgZm9yIHNwZWVkIGFuZCB0b3RhbGx5IHVuaW1wb3J0YW50IGZvciBzaXplLgorICoKKyAqIFlVViAtPiBSR0IgQ29udmVyc2lvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQiA9IDEuMTY0KihZLTE2KQkJICAgICsgMi4wMTgqKFYtMTI4KQorICogRyA9IDEuMTY0KihZLTE2KSAtIDAuODEzKihVLTEyOCkgLSAwLjM5MSooVi0xMjgpCisgKiBSID0gMS4xNjQqKFktMTYpICsgMS41OTYqKFUtMTI4KQorICoKKyAqIElmIHlvdSBmYW5jeSBpbnRlZ2VyIGFyaXRobWV0aWNzIChhcyB5b3Ugc2hvdWxkKSwgaGVhciB0aGlzOgorICoKKyAqIDY1NTM2KkIgPSA3NjI4NCooWS0xNikJCSAgKyAxMzIyNTIqKFYtMTI4KQorICogNjU1MzYqRyA9IDc2Mjg0KihZLTE2KSAtICA1MzI4MSooVS0xMjgpIC0gIDI1NjI1KihWLTEyOCkKKyAqIDY1NTM2KlIgPSA3NjI4NCooWS0xNikgKyAxMDQ1OTUqKFUtMTI4KQorICoKKyAqIE1ha2Ugc3VyZSB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgd2l0aGluIFswLi4yNTVdIHJhbmdlLgorICovCisjZGVmaW5lIExJTUlUX1JHQih4KSAoKCh4KSA8IDApID8gMCA6ICgoKHgpID4gMjU1KSA/IDI1NSA6ICh4KSkpCisjZGVmaW5lIFlVVl9UT19SR0JfQllfVEhFX0JPT0sobXksbXUsbXYsbXIsbWcsbWIpIHsgXAorICAgIGludCBtbV95LCBtbV95YywgbW1fdSwgbW1fdiwgbW1fciwgbW1fZywgbW1fYjsgXAorICAgIG1tX3kgPSAobXkpIC0gMTY7ICBcCisgICAgbW1fdSA9IChtdSkgLSAxMjg7IFwKKyAgICBtbV92ID0gKG12KSAtIDEyODsgXAorICAgIG1tX3ljPSBtbV95ICogNzYyODQ7IFwKKyAgICBtbV9iID0gKG1tX3ljCQkrIDEzMjI1MiptbV92CSkgPj4gMTY7IFwKKyAgICBtbV9nID0gKG1tX3ljIC0gIDUzMjgxKm1tX3UgLSAgMjU2MjUqbW1fdgkpID4+IDE2OyBcCisgICAgbW1fciA9IChtbV95YyArIDEwNDU5NSptbV91CQkJKSA+PiAxNjsgXAorICAgIG1iID0gTElNSVRfUkdCKG1tX2IpOyBcCisgICAgbWcgPSBMSU1JVF9SR0IobW1fZyk7IFwKKyAgICBtciA9IExJTUlUX1JHQihtbV9yKTsgXAorfQorCisjZGVmaW5lCVJJTkdfUVVFVUVfU0laRQkJKDEyOCoxMDI0KQkvKiBNdXN0IGJlIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZQlSSU5HX1FVRVVFX0FEVkFOQ0VfSU5ERVgocnEsaW5kLG4pIChycSktPmluZCA9ICgocnEpLT5pbmQgKyAobikpICYgKChycSktPmxlbmd0aC0xKQorI2RlZmluZQlSSU5HX1FVRVVFX0RFUVVFVUVfQllURVMocnEsbikgUklOR19RVUVVRV9BRFZBTkNFX0lOREVYKHJxLHJpLG4pCisjZGVmaW5lCVJJTkdfUVVFVUVfUEVFSyhycSxvZnMpICgocnEpLT5xdWV1ZVsoKG9mcykgKyAocnEpLT5yaSkgJiAoKHJxKS0+bGVuZ3RoLTEpXSkKKworc3RydWN0IFJpbmdRdWV1ZSB7CisJdW5zaWduZWQgY2hhciAqcXVldWU7CS8qIERhdGEgZnJvbSB0aGUgSXNvYyBkYXRhIHB1bXAgKi8KKwlpbnQgbGVuZ3RoOwkJLyogSG93IG1hbnkgYnl0ZXMgYWxsb2NhdGVkIGZvciB0aGUgcXVldWUgKi8KKwlpbnQgd2k7CQkJLyogVGhhdCdzIHdoZXJlIHdlIHdyaXRlICovCisJaW50IHJpOwkJCS8qIFJlYWQgZnJvbSBoZXJlIHVudGlsIHlvdSBoaXQgd3JpdGUgaW5kZXggKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cWg7CS8qIFByb2Nlc3NlcyB3YWl0aW5nICovCit9OworCitlbnVtIFNjYW5TdGF0ZSB7CisJU2NhblN0YXRlX1NjYW5uaW5nLAkvKiBTY2FubmluZyBmb3IgaGVhZGVyICovCisJU2NhblN0YXRlX0xpbmVzCQkvKiBQYXJzaW5nIGxpbmVzICovCit9OworCisvKiBDb21wbGV0aW9uIHN0YXRlcyBvZiB0aGUgZGF0YSBwYXJzZXIgKi8KK2VudW0gUGFyc2VTdGF0ZSB7CisJc2Nhbl9Db250aW51ZSwJCS8qIEp1c3QgcGFyc2UgbmV4dCBpdGVtICovCisJc2Nhbl9OZXh0RnJhbWUsCQkvKiBGcmFtZSBkb25lLCBzZW5kIGl0IHRvIFY0TCAqLworCXNjYW5fT3V0LAkJLyogTm90IGVub3VnaCBkYXRhIGZvciBmcmFtZSAqLworCXNjYW5fRW5kUGFyc2UJCS8qIEVuZCBwYXJzaW5nICovCit9OworCitlbnVtIEZyYW1lU3RhdGUgeworCUZyYW1lU3RhdGVfVW51c2VkLAkvKiBVbnVzZWQgKG5vIE1DQVBUVVJFKSAqLworCUZyYW1lU3RhdGVfUmVhZHksCS8qIFJlYWR5IHRvIHN0YXJ0IGdyYWJiaW5nICovCisJRnJhbWVTdGF0ZV9HcmFiYmluZywJLyogSW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZ3JhYmJlZCBpbnRvICovCisJRnJhbWVTdGF0ZV9Eb25lLAkvKiBGaW5pc2hlZCBncmFiYmluZywgYnV0IG5vdCBiZWVuIHN5bmNlZCB5ZXQgKi8KKwlGcmFtZVN0YXRlX0RvbmVfSG9sZCwJLyogQXJlIHN5bmNpbmcgb3IgcmVhZGluZyAqLworCUZyYW1lU3RhdGVfRXJyb3IsCS8qIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQgd2hpbGUgcHJvY2Vzc2luZyAqLworfTsKKworLyoKKyAqIFNvbWUgZnJhbWVzIG1heSBjb250YWluIG9ubHkgZXZlbiBvciBvZGQgbGluZXMuIFRoaXMgdHlwZQorICogc3BlY2lmaWVzIHdoYXQgdHlwZSBvZiBkZWludGVybGFjaW5nIGlzIHJlcXVpcmVkLgorICovCitlbnVtIERlaW50ZXJsYWNlIHsKKwlEZWludGVybGFjZV9Ob25lPTAsCisJRGVpbnRlcmxhY2VfRmlsbE9kZExpbmVzLAorCURlaW50ZXJsYWNlX0ZpbGxFdmVuTGluZXMKK307CisKKyNkZWZpbmUgVVNCVklERU9fTlVNRlJBTUVTCTIJLyogSG93IG1hbnkgZnJhbWVzIHdlIHdvcmsgd2l0aCAqLworI2RlZmluZSBVU0JWSURFT19OVU1TQlVGCTIJLyogSG93IG1hbnkgVVJCcyBsaW5rZWQgaW4gYSByaW5nICovCisKKy8qIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgb25lIElzb2MgcmVxdWVzdCAtIFVSQiBhbmQgYnVmZmVyICovCitzdHJ1Y3QgdXNidmlkZW9fc2J1ZiB7CisJY2hhciAqZGF0YTsKKwlzdHJ1Y3QgdXJiICp1cmI7Cit9OworCitzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgeworCWNoYXIgKmRhdGE7CQkvKiBGcmFtZSBidWZmZXIgKi8KKwl1bnNpZ25lZCBsb25nIGhlYWRlcjsJLyogU2lnbmlmaWNhbnQgYml0cyBmcm9tIHRoZSBoZWFkZXIgKi8KKworCXZpZGVvc2l6ZV90IGNhbnZhczsJLyogVGhlIGNhbnZhcyAobWF4LiBpbWFnZSkgYWxsb2NhdGVkICovCisJdmlkZW9zaXplX3QgcmVxdWVzdDsJLyogVGhhdCdzIHdoYXQgdGhlIGFwcGxpY2F0aW9uIGFza2VkIGZvciAqLworCXVuc2lnbmVkIHNob3J0IHBhbGV0dGU7CS8qIFRoZSBkZXNpcmVkIGZvcm1hdCAqLworCisJZW51bSBGcmFtZVN0YXRlIGZyYW1lU3RhdGU7LyogU3RhdGUgb2YgZ3JhYmJpbmcgKi8KKwllbnVtIFNjYW5TdGF0ZSBzY2Fuc3RhdGU7CS8qIFN0YXRlIG9mIHNjYW5uaW5nICovCisJZW51bSBEZWludGVybGFjZSBkZWludGVybGFjZTsKKwlpbnQgZmxhZ3M7CQkvKiBVU0JWSURFT19GUkFNRV9GTEFHX3h4eCBiaXQgZmxhZ3MgKi8KKworCWludCBjdXJsaW5lOwkJLyogTGluZSBvZiBmcmFtZSB3ZSdyZSB3b3JraW5nIG9uICovCisKKwlsb25nIHNlcVJlYWRfTGVuZ3RoOwkvKiBSYXcgZGF0YSBsZW5ndGggb2YgZnJhbWUgKi8KKwlsb25nIHNlcVJlYWRfSW5kZXg7CS8qIEFtb3VudCBvZiBkYXRhIHRoYXQgaGFzIGJlZW4gYWxyZWFkeSByZWFkICovCisKKwl2b2lkICp1c2VyOwkJLyogQWRkaXRpb25hbCBkYXRhIHRoYXQgdXNlciBtYXkgbmVlZCAqLworfTsKKworLyogU3RhdGlzdGljcyB0aGF0IGNhbiBiZSBvdmVybGFpZCBvbiBzY3JlZW4gKi8KK3N0cnVjdCB1c2J2aWRlb19zdGF0aXN0aWNzIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmcmFtZV9udW07CS8qIFNlcXVlbnRpYWwgbnVtYmVyIG9mIHRoZSBmcmFtZSAqLworICAgICAgICB1bnNpZ25lZCBsb25nIHVyYl9jb3VudDsgICAgICAgIC8qIEhvdyBtYW55IFVSQnMgd2UgcmVjZWl2ZWQgc28gZmFyICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgdXJiX2xlbmd0aDsgICAgICAgLyogTGVuZ3RoIG9mIGxhc3QgVVJCICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YV9jb3VudDsgICAgICAgLyogSG93IG1hbnkgYnl0ZXMgd2UgcmVjZWl2ZWQgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyBoZWFkZXJfY291bnQ7ICAgICAvKiBIb3cgbWFueSBmcmFtZSBoZWFkZXJzIHdlIGZvdW5kICovCisJdW5zaWduZWQgbG9uZyBpc29fc2tpcF9jb3VudDsJLyogSG93IG1hbnkgZW1wdHkgSVNPIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwl1bnNpZ25lZCBsb25nIGlzb19lcnJfY291bnQ7CS8qIEhvdyBtYW55IGJhZCBJU08gcGFja2V0cyByZWNlaXZlZCAqLworfTsKKworc3RydWN0IHVzYnZpZGVvOworCitzdHJ1Y3QgdXZkIHsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CS8qIE11c3QgYmUgdGhlIGZpcnN0IGZpZWxkISAqLworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisJc3RydWN0IHVzYnZpZGVvICpoYW5kbGU7CS8qIFBvaW50cyBiYWNrIHRvIHRoZSBzdHJ1Y3QgdXNidmlkZW8gKi8KKwl2b2lkICp1c2VyX2RhdGE7CQkvKiBDYW1lcmEtZGVwZW5kZW50IGRhdGEgKi8KKwlpbnQgdXNlcl9zaXplOwkJCS8qIFNpemUgb2YgdGhhdCBjYW1lcmEtZGVwZW5kZW50IGRhdGEgKi8KKwlpbnQgZGVidWc7CQkJLyogRGVidWcgbGV2ZWwgZm9yIHVzYnZpZGVvICovCisJdW5zaWduZWQgY2hhciBpZmFjZTsJCS8qIFZpZGVvIGludGVyZmFjZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHZpZGVvX2VuZHA7CisJdW5zaWduZWQgY2hhciBpZmFjZUFsdEFjdGl2ZTsKKwl1bnNpZ25lZCBjaGFyIGlmYWNlQWx0SW5hY3RpdmU7IC8qIEFsdCBzZXR0aW5ncyAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBGTEFHU19VU0JWSURFT194eHggKi8KKwl1bnNpZ25lZCBsb25nIHBhbGV0dGVCaXRzOwkvKiBXaGljaCBwYWxldHRlcyB3ZSBhY2NlcHQ/ICovCisJdW5zaWduZWQgc2hvcnQgZGVmYXVsdFBhbGV0dGU7CS8qIFdoYXQgcGFsZXR0ZSB0byB1c2UgZm9yIHJlYWQoKSAqLworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwlpbnQgdXNlcjsJCS8qIHVzZXIgY291bnQgZm9yIGV4Y2x1c2l2ZSB1c2UgKi8KKworCXZpZGVvc2l6ZV90IHZpZGVvc2l6ZTsJLyogQ3VycmVudCBzZXR0aW5nICovCisJdmlkZW9zaXplX3QgY2FudmFzOwkvKiBUaGlzIGlzIHRoZSB3aWR0aCxoZWlnaHQgb2YgdGhlIFY0TCBjYW52YXMgKi8KKwlpbnQgbWF4X2ZyYW1lX3NpemU7CS8qIEJ5dGVzIGluIG9uZSB2aWRlbyBmcmFtZSAqLworCisJaW50IHV2ZF91c2VkOyAgICAgICAgCS8qIElzIHRoaXMgc3RydWN0dXJlIGluIHVzZT8gKi8KKwlpbnQgc3RyZWFtaW5nOwkJLyogQXJlIHdlIHN0cmVhbWluZyBJc29jaHJvbm91cz8gKi8KKwlpbnQgZ3JhYmJpbmc7CQkvKiBBcmUgd2UgZ3JhYmJpbmc/ICovCisJaW50IHNldHRpbmdzQWRqdXN0ZWQ7CS8qIEhhdmUgd2UgYWRqdXN0ZWQgY29udHJhc3QgZXRjLj8gKi8KKwlpbnQgbGFzdF9lcnJvcjsJCS8qIFdoYXQgY2FsYW1pdHkgc3RydWNrIHVzPyAqLworCisJY2hhciAqZmJ1ZjsJCS8qIFZpZGVvZGV2IGJ1ZmZlciBhcmVhICovCisJaW50IGZidWZfc2l6ZTsJCS8qIFZpZGVvZGV2IGJ1ZmZlciBzaXplICovCisKKwlpbnQgY3VyZnJhbWU7CisJaW50IGlzb19wYWNrZXRfbGVuOwkvKiBWaWRlb21vZGUtZGVwZW5kZW50LCBzYXZlcyBidXMgYmFuZHdpZHRoICovCisKKwlzdHJ1Y3QgUmluZ1F1ZXVlIGRwOwkvKiBJc29jIGRhdGEgcHVtcCAqLworCXN0cnVjdCB1c2J2aWRlb19mcmFtZSBmcmFtZVtVU0JWSURFT19OVU1GUkFNRVNdOworCXN0cnVjdCB1c2J2aWRlb19zYnVmIHNidWZbVVNCVklERU9fTlVNU0JVRl07CisKKwl2b2xhdGlsZSBpbnQgcmVtb3ZlX3BlbmRpbmc7CS8qIElmIHNldCB0aGVuIGFib3V0IHRvIGV4aXQgKi8KKworCXN0cnVjdCB2aWRlb19waWN0dXJlIHZwaWMsIHZwaWNfb2xkOwkvKiBQaWN0dXJlIHNldHRpbmdzICovCisJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgdmNhcDsJCS8qIFZpZGVvIGNhcGFiaWxpdGllcyAqLworCXN0cnVjdCB2aWRlb19jaGFubmVsIHZjaGFuOwkvKiBNYXkgYmUgdXNlZCBmb3IgdHVuZXIgc3VwcG9ydCAqLworCXN0cnVjdCB1c2J2aWRlb19zdGF0aXN0aWNzIHN0YXRzOworCWNoYXIgdmlkZW9OYW1lWzMyXTsJCS8qIEhvbGRzIG5hbWUgbGlrZSAidmlkZW83IiAqLworfTsKKworLyoKKyAqIHVzYnZpZGVvIGNhbGxiYWNrcyAodmlydHVhbCBtZXRob2RzKS4gVGhleSBhcmUgc2V0IHdoZW4gdXNidmlkZW8KKyAqIHNlcnZpY2VzIGFyZSByZWdpc3RlcmVkLiBBbGwgb2YgdGhlc2UgZGVmYXVsdCB0byBOVUxMLCBleGNlcHQgdGhvc2UKKyAqIHRoYXQgZGVmYXVsdCB0byB1c2J2aWRlby1wcm92aWRlZCBtZXRob2RzLgorICovCitzdHJ1Y3QgdXNidmlkZW9fY2IgeworCWludCAoKnByb2JlKShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqKTsKKwl2b2lkICgqdXNlckZyZWUpKHN0cnVjdCB1dmQgKik7CisJdm9pZCAoKmRpc2Nvbm5lY3QpKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOworCWludCAoKnNldHVwT25PcGVuKShzdHJ1Y3QgdXZkICopOworCXZvaWQgKCp2aWRlb1N0YXJ0KShzdHJ1Y3QgdXZkICopOworCXZvaWQgKCp2aWRlb1N0b3ApKHN0cnVjdCB1dmQgKik7CisJdm9pZCAoKnByb2Nlc3NEYXRhKShzdHJ1Y3QgdXZkICosIHN0cnVjdCB1c2J2aWRlb19mcmFtZSAqKTsKKwl2b2lkICgqcG9zdFByb2Nlc3MpKHN0cnVjdCB1dmQgKiwgc3RydWN0IHVzYnZpZGVvX2ZyYW1lICopOworCXZvaWQgKCphZGp1c3RQaWN0dXJlKShzdHJ1Y3QgdXZkICopOworCWludCAoKmdldEZQUykoc3RydWN0IHV2ZCAqKTsKKwlpbnQgKCpvdmVybGF5SG9vaykoc3RydWN0IHV2ZCAqLCBzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKik7CisJaW50ICgqZ2V0RnJhbWUpKHN0cnVjdCB1dmQgKiwgaW50KTsKKwlpbnQgKCpzdGFydERhdGFQdW1wKShzdHJ1Y3QgdXZkICp1dmQpOworCXZvaWQgKCpzdG9wRGF0YVB1bXApKHN0cnVjdCB1dmQgKnV2ZCk7CisJaW50ICgqc2V0VmlkZW9Nb2RlKShzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB2aWRlb193aW5kb3cgKnZ3KTsKK307CisKK3N0cnVjdCB1c2J2aWRlbyB7CisJaW50IG51bV9jYW1lcmFzOwkJLyogQXMgYWxsb2NhdGVkICovCisJc3RydWN0IHVzYl9kcml2ZXIgdXNiZHJ2OwkvKiBJbnRlcmZhY2UgdG8gdGhlIFVTQiBzdGFjayAqLworCWNoYXIgZHJ2TmFtZVs4MF07CQkvKiBEcml2ZXIgbmFtZSAqLworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsJCS8qIE11dGV4IHByb3RlY3RpbmcgY2FtZXJhIHN0cnVjdHVyZXMgKi8KKwlzdHJ1Y3QgdXNidmlkZW9fY2IgY2I7CQkvKiBUYWJsZSBvZiBjYWxsYmFja3MgKHZpcnR1YWwgbWV0aG9kcykgKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkdDsJLyogVmlkZW8gZGV2aWNlIHRlbXBsYXRlICovCisJc3RydWN0IHV2ZCAqY2FtOwkJCS8qIEFycmF5IG9mIGNhbWVyYSBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG1vZHVsZSAqbWRfbW9kdWxlOwkvKiBNaW5pZHJpdmVyIG1vZHVsZSAqLworfTsKKworCisvKgorICogVGhpcyBtYWNybyByZXRyaWV2ZXMgY2FsbGJhY2sgYWRkcmVzcyBmcm9tIHRoZSBzdHJ1Y3QgdXZkIG9iamVjdC4KKyAqIE5vIHZhbGlkaXR5IGNoZWNrcyBhcmUgZG9uZSBoZXJlLCBzbyBiZSBzdXJlIHRvIGNoZWNrIHRoZQorICogY2FsbGJhY2sgYmVmb3JlaGFuZCB3aXRoIFZBTElEX0NBTExCQUNLLgorICovCisjZGVmaW5lCUdFVF9DQUxMQkFDSyh1dmQsY2JOYW1lKSAoKHV2ZCktPmhhbmRsZS0+Y2IuY2JOYW1lKQorCisvKgorICogVGhpcyBtYWNybyByZXR1cm5zIGVpdGhlciBjYWxsYmFjayBwb2ludGVyIG9yIE5VTEwuIFRoaXMgaXMgc2FmZQorICogbWFjcm8sIG1lYW5pbmcgdGhhdCBtb3N0IG9mIGNvbXBvbmVudHMgb2YgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkCisgKiBtYXkgYmUgTlVMTCAtIHRoaXMgb25seSByZXN1bHRzIGluIE5VTEwgYmVpbmcgcmV0dXJuZWQuIFlvdSBtYXkKKyAqIHdpc2ggdG8gdXNlIHRoaXMgbWFjcm8gdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNhbGxiYWNrIGlzIGNhbGxhYmxlLgorICogSG93ZXZlciBrZWVwIGluIG1pbmQgdGhhdCB0aG9zZSBjaGVja3MgdGFrZSB0aW1lLgorICovCisjZGVmaW5lCVZBTElEX0NBTExCQUNLKHV2ZCxjYk5hbWUpICgoKCh1dmQpICE9IE5VTEwpICYmIFwKKwkJKCh1dmQpLT5oYW5kbGUgIT0gTlVMTCkpID8gR0VUX0NBTExCQUNLKHV2ZCxjYk5hbWUpIDogTlVMTCkKKworaW50ICBSaW5nUXVldWVfRGVxdWV1ZShzdHJ1Y3QgUmluZ1F1ZXVlICpycSwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuKTsKK2ludCAgUmluZ1F1ZXVlX0VucXVldWUoc3RydWN0IFJpbmdRdWV1ZSAqcnEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNkYXRhLCBpbnQgbik7Cit2b2lkIFJpbmdRdWV1ZV9XYWtlVXBJbnRlcnJ1cHRpYmxlKHN0cnVjdCBSaW5nUXVldWUgKnJxKTsKK3ZvaWQgUmluZ1F1ZXVlX0ZsdXNoKHN0cnVjdCBSaW5nUXVldWUgKnJxKTsKKworc3RhdGljIGlubGluZSBpbnQgUmluZ1F1ZXVlX0dldExlbmd0aChjb25zdCBzdHJ1Y3QgUmluZ1F1ZXVlICpycSkKK3sKKwlyZXR1cm4gKHJxLT53aSAtIHJxLT5yaSArIHJxLT5sZW5ndGgpICYgKHJxLT5sZW5ndGgtMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFJpbmdRdWV1ZV9HZXRGcmVlU3BhY2UoY29uc3Qgc3RydWN0IFJpbmdRdWV1ZSAqcnEpCit7CisJcmV0dXJuIHJxLT5sZW5ndGggLSBSaW5nUXVldWVfR2V0TGVuZ3RoKHJxKTsKK30KKwordm9pZCB1c2J2aWRlb19EcmF3TGluZSgKKwlzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyYW1lLAorCWludCB4MSwgaW50IHkxLAorCWludCB4MiwgaW50IHkyLAorCXVuc2lnbmVkIGNoYXIgY3IsIHVuc2lnbmVkIGNoYXIgY2csIHVuc2lnbmVkIGNoYXIgY2IpOwordm9pZCB1c2J2aWRlb19IZXhEdW1wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pOwordm9pZCB1c2J2aWRlb19TYXlBbmRXYWl0KGNvbnN0IGNoYXIgKndoYXQpOwordm9pZCB1c2J2aWRlb19UZXN0UGF0dGVybihzdHJ1Y3QgdXZkICp1dmQsIGludCBmdWxsZnJhbWUsIGludCBwbW9kZSk7CisKKy8qIE1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzICovCit1bnNpZ25lZCBsb25nIHVzYnZpZGVvX2t2aXJ0X3RvX3BhKHVuc2lnbmVkIGxvbmcgYWRyKTsKKworaW50IHVzYnZpZGVvX3JlZ2lzdGVyKAorCXN0cnVjdCB1c2J2aWRlbyAqKnBDYW1zLAorCWNvbnN0IGludCBudW1fY2FtcywKKwljb25zdCBpbnQgbnVtX2V4dHJhLAorCWNvbnN0IGNoYXIgKmRyaXZlck5hbWUsCisJY29uc3Qgc3RydWN0IHVzYnZpZGVvX2NiICpjYlRhYmxlLAorCXN0cnVjdCBtb2R1bGUgKm1kLAorCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZF90YWJsZSk7CitzdHJ1Y3QgdXZkICp1c2J2aWRlb19BbGxvY2F0ZURldmljZShzdHJ1Y3QgdXNidmlkZW8gKmNhbXMpOworaW50IHVzYnZpZGVvX1JlZ2lzdGVyVmlkZW9EZXZpY2Uoc3RydWN0IHV2ZCAqdXZkKTsKK3ZvaWQgdXNidmlkZW9fRGVyZWdpc3RlcihzdHJ1Y3QgdXNidmlkZW8gKip1dnQpOworCitpbnQgdXNidmlkZW9fdjRsX2luaXRpYWxpemUoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2KTsKKwordm9pZCB1c2J2aWRlb19EZWludGVybGFjZUZyYW1lKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSk7CisKKy8qCisgKiBUaGlzIGNvZGUgcGVyZm9ybXMgYm91bmRzIGNoZWNraW5nIC0gdXNlIGl0IHdoZW4gd29ya2luZyB3aXRoCisgKiBuZXcgZm9ybWF0cywgb3IgZWxzZSB5b3UgbWF5IGdldCBvb3BzZXMgYWxsIG92ZXIgdGhlIHBsYWNlLgorICogSWYgcGl4ZWwgZmFsbHMgb3V0IG9mIGJvdW5kcyB0aGVuIGl0IGdldHMgc2hvdmVkIGJhY2sgKGFzIGNsb3NlCisgKiB0byBwbGFjZSBvZiBvZmZlbmNlIGFzIHBvc3NpYmxlKSBhbmQgaXMgcGFpbnRlZCBicmlnaHQgcmVkLgorICoKKyAqIFRoZXJlIGFyZSB0d28gaW1wb3J0YW50IGNvbmNlcHRzOiBmcmFtZSB3aWR0aCwgaGVpZ2h0IGFuZAorICogVjRMIGNhbnZhcyB3aWR0aCwgaGVpZ2h0LiBUaGUgZm9ybWVyIGlzIHRoZSBhcmVhIHJlcXVlc3RlZCBieQorICogdGhlIGFwcGxpY2F0aW9uIC1mb3IgdGhpcyB2ZXJ5IGZyYW1lLS4gVGhlIGxhdHRlciBpcyB0aGUgbGFyZ2VzdAorICogcG9zc2libGUgZnJhbWUgdGhhdCB3ZSBjYW4gc2VydmUgKHdlIGFkdmVydGlzZSB0aGF0IHZpYSBWNEwgaW9jdGwpLgorICogVGhlIGZyYW1lIGRhdGEgaXMgZXhwZWN0ZWQgdG8gYmUgZm9ybWF0dGVkIGFzIGxpbmVzIG9mIGxlbmd0aAorICogVklERU9TSVpFX1goZnItPnJlcXVlc3QpLCB0b3RhbCBWSURFT1NJWkVfWShmcmFtZS0+cmVxdWVzdCkgbGluZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBSR0IyNF9QVVRQSVhFTCgKKwlzdHJ1Y3QgdXNidmlkZW9fZnJhbWUgKmZyLAorCWludCBpeCwgaW50IGl5LAorCXVuc2lnbmVkIGNoYXIgdnIsCisJdW5zaWduZWQgY2hhciB2ZywKKwl1bnNpZ25lZCBjaGFyIHZiKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnBmOworCWludCBsaW1pdGVyID0gMCwgbXgsIG15OworCW14ID0gaXg7CisJbXkgPSBpeTsKKwlpZiAobXggPCAwKSB7CisJCW14PTA7CisJCWxpbWl0ZXIrKzsKKwl9IGVsc2UgaWYgKG14ID49IFZJREVPU0laRV9YKChmciktPnJlcXVlc3QpKSB7CisJCW14PSBWSURFT1NJWkVfWCgoZnIpLT5yZXF1ZXN0KSAtIDE7CisJCWxpbWl0ZXIrKzsKKwl9CisJaWYgKG15IDwgMCkgeworCQlteSA9IDA7CisJCWxpbWl0ZXIrKzsKKwl9IGVsc2UgaWYgKG15ID49IFZJREVPU0laRV9ZKChmciktPnJlcXVlc3QpKSB7CisJCW15ID0gVklERU9TSVpFX1koKGZyKS0+cmVxdWVzdCkgLSAxOworCQlsaW1pdGVyKys7CisJfQorCXBmID0gKGZyKS0+ZGF0YSArIFY0TF9CWVRFU19QRVJfUElYRUwqKChpeSkqVklERU9TSVpFX1goKGZyKS0+cmVxdWVzdCkgKyAoaXgpKTsKKwlpZiAobGltaXRlcikgeworCQkqcGYrKyA9IDA7CisJCSpwZisrID0gMDsKKwkJKnBmKysgPSAweEZGOworCX0gZWxzZSB7CisJCSpwZisrID0gKHZiKTsKKwkJKnBmKysgPSAodmcpOworCQkqcGYrKyA9ICh2cik7CisJfQorfQorCisjZW5kaWYgLyogdXNidmlkZW9faCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvdmljYW0uYyBiL2RyaXZlcnMvdXNiL21lZGlhL3ZpY2FtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1ODU3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3ZpY2FtLmMKQEAgLTAsMCArMSwxNDA5IEBACisvKgorICogVVNCIFZpQ2FtIFdlYkNhbSBkcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKb2UgQnVya3MgKGpidXJrc0B3YXZpY2xlLm9yZyksCisgKiAgICAgICAgICAgICAgICAgICAgQ2hyaXN0b3BoZXIgTCBDaGVuZXkgKGNjaGVuZXlAY2hlbmV5LmN4KSwKKyAqICAgICAgICAgICAgICAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHN1c2UuY3opLAorICogICAgICAgICAgICAgICAgICAgIEpvaG4gVHluZXIgKGp0eW5lckBjcy51Y3IuZWR1KSwKKyAqICAgICAgICAgICAgICAgICAgICBNb25yb2UgV2lsbGlhbXMgKG1vbnJvZUBwb2JveC5jb20pCisgKgorICogU3VwcG9ydHMgM0NPTSBIb21lQ29ubmVjdCBQQyBEaWdpdGFsIFdlYkNhbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgYmFzZWQgaGVhdmlseSBvbiB0aGUgQ1BpQSB3ZWJjYW0gZHJpdmVyIHdoaWNoIHdhcworICogd3JpdHRlbiBieSBQZXRlciBQcmVnbGVyLCBTY290dCBKLiBCZXJ0aW4gYW5kIEpvaGFubmVzIEVyZGZlbHQKKyAqCisgKiBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgd2VyZSBhbHNvIGNvcGllZCBmcm9tIHVzYnZpZGVvLmMKKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byB0aGUgdGhlIHdob2xlIHRlYW0gYXQgU291cmNlZm9yZ2UgZm9yIGhlbHAgbWFraW5nCisgKiB0aGlzIGRyaXZlciBiZWNvbWUgYSByZWFsaXR5LiAgTm90YWJseToKKyAqIEFuZHkgQXJtc3Ryb25nIHdobyByZXZlcnNlIGVuZ2luZWVyZWQgdGhlIGNvbG9yIGVuY29kaW5nIGFuZAorICogUGF2ZWwgTWFjaGVrIGFuZCBDaHJpcyBDaGVuZXkgd2hvIHdvcmtlZCBvbiByZXZlcnNlIGVuZ2luZWVyaW5nIHRoZQorICogICAgY2FtZXJhIGNvbnRyb2xzIGFuZCB3cm90ZSB0aGUgZmlyc3QgZ2VuZXJhdGlvbiBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgInVzYnZpZGVvLmgiCisKKy8vICNkZWZpbmUgVklDQU1fREVCVUcKKworI2lmZGVmIFZJQ0FNX0RFQlVHCisjZGVmaW5lIEFEQkcobGluZW5vLGZtdCxhcmdzLi4uKSBwcmludGsoZm10LCBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGxpbmVubywgIyNhcmdzKQorI2RlZmluZSBEQkcoZm10LGFyZ3MuLi4pIEFEQkcoKF9fTElORV9fKSxLRVJOX0RFQlVHIF9fRklMRV9fIiglbGQpOiVzICglZCk6ImZtdCwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEQkcoZm1uLGFyZ3MuLi4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBEUklWRVJfQVVUSE9SICAgICAgICAgICAiSm9lIEJ1cmtzLCBqYnVya3NAd2F2aWNsZS5vcmciCisjZGVmaW5lIERSSVZFUl9ERVNDICAgICAgICAgICAgICJWaUNhbSBXZWJDYW0gRHJpdmVyIgorCisvKiBEZWZpbmUgdGhlc2UgdmFsdWVzIHRvIG1hdGNoIHlvdXIgZGV2aWNlICovCisjZGVmaW5lIFVTQl9WSUNBTV9WRU5ET1JfSUQJMHgwNGMxCisjZGVmaW5lIFVTQl9WSUNBTV9QUk9EVUNUX0lECTB4MDA5ZAorCisjZGVmaW5lIFZJQ0FNX0JZVEVTX1BFUl9QSVhFTCAgIDMKKyNkZWZpbmUgVklDQU1fTUFYX1JFQURfU0laRSAgICAgKDUxMioyNDIrMTI4KQorI2RlZmluZSBWSUNBTV9NQVhfRlJBTUVfU0laRSAgICAoVklDQU1fQllURVNfUEVSX1BJWEVMKjMyMCoyNDApCisjZGVmaW5lIFZJQ0FNX0ZSQU1FUyAgICAgICAgICAgIDIKKworI2RlZmluZSBWSUNBTV9IRUFERVJfU0laRSAgICAgICA2NAorCisjZGVmaW5lIGNsYW1wKCB4LCBsLCBoICkgICAgICAgIG1heF90KCBfX3R5cGVvZl9fKCB4ICksICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBsICksICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl90KCBfX3R5cGVvZl9fKCB4ICksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBoICksICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggeCApICkgKQorCisvKiBOb3Qgc3VyZSB3aGF0IGFsbCB0aGUgYnl0ZXMgaW4gdGhlc2UgY2hhcgorICogYXJyYXlzIGRvLCBidXQgdGhleSdyZSBuZWNlc3NhcnkgdG8gbWFrZQorICogdGhlIGNhbWVyYSB3b3JrLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNldHVwMVtdID0geworCTB4QjYsIDB4QzMsIDB4MUYsIDB4MDAsIDB4MDIsIDB4NjQsIDB4RTcsIDB4NjcsCisJMHhGRCwgMHhGRiwgMHgwRSwgMHhDMCwgMHhFNywgMHgwOSwgMHhERSwgMHgwMCwKKwkweDhFLCAweDAwLCAweEMwLCAweDA5LCAweDQwLCAweDAzLCAweEMwLCAweDE3LAorCTB4NDQsIDB4MDMsIDB4NEIsIDB4QUYsIDB4QzAsIDB4MDcsIDB4MDAsIDB4MDAsCisJMHg0QiwgMHhBRiwgMHg5NywgMHhDRiwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXAyW10gPSB7CisJMHhCNiwgMHhDMywgMHgwMywgMHgwMCwgMHgwMywgMHg2NCwgMHgxOCwgMHgwMCwKKwkweDAwLCAweDAwCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzZXR1cDNbXSA9IHsKKwkweEI2LCAweEMzLCAweDAxLCAweDAwLCAweDA2LCAweDY0LCAweDAwLCAweDAwCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzZXR1cDRbXSA9IHsKKwkweEI2LCAweEMzLCAweDhGLCAweDA2LCAweDAyLCAweDY0LCAweEU3LCAweDA3LAorCTB4MDAsIDB4MDAsIDB4MDgsIDB4QzAsIDB4RTcsIDB4MDcsIDB4MDAsIDB4MDAsCisJMHgzRSwgMHhDMCwgMHhFNywgMHgwNywgMHg1NCwgMHgwMSwgMHhBQSwgMHgwMCwKKwkweEU3LCAweDA3LCAweEM4LCAweDA1LCAweEI2LCAweDAwLCAweEU3LCAweDA3LAorCTB4NDIsIDB4MDEsIDB4RDIsIDB4MDAsIDB4RTcsIDB4MDcsIDB4N0MsIDB4MDAsCisJMHgxNiwgMHgwMCwgMHhFNywgMHgwNywgMHg1NiwgMHgwMCwgMHgxOCwgMHgwMCwKKwkweEU3LCAweDA3LCAweDA2LCAweDAwLCAweDkyLCAweEMwLCAweEU3LCAweDA3LAorCTB4MDAsIDB4MDAsIDB4MUUsIDB4QzAsIDB4RTcsIDB4MDcsIDB4RkYsIDB4RkYsCisJMHgyMiwgMHhDMCwgMHhFNywgMHgwNywgMHgwNCwgMHgwMCwgMHgyNCwgMHhDMCwKKwkweEU3LCAweDA3LCAweEVDLCAweDI3LCAweDI4LCAweEMwLCAweEU3LCAweDA3LAorCTB4MTYsIDB4MDEsIDB4OEUsIDB4MDAsIDB4RTcsIDB4ODcsIDB4MDEsIDB4MDAsCisJMHgwRSwgMHhDMCwgMHg5NywgMHhDRiwgMHhENywgMHgwOSwgMHgwMCwgMHhDMCwKKwkweEU3LCAweDc3LCAweDAxLCAweDAwLCAweDkyLCAweEMwLCAweDA5LCAweEMxLAorCTB4RTcsIDB4MDksIDB4RkUsIDB4MDUsIDB4MjQsIDB4MDEsIDB4RTcsIDB4MDksCisJMHgwNCwgMHgwNiwgMHgyNiwgMHgwMSwgMHhFNywgMHgwNywgMHgwNywgMHgwMCwKKwkweDkyLCAweEMwLCAweEU3LCAweDA1LCAweDAwLCAweEMwLCAweEMwLCAweERGLAorCTB4OTcsIDB4Q0YsIDB4MTcsIDB4MDAsIDB4NTcsIDB4MDAsIDB4MTcsIDB4MDIsCisJMHhENywgMHgwOSwgMHgwMCwgMHhDMCwgMHhFNywgMHg3NywgMHgwMSwgMHgwMCwKKwkweDkyLCAweEMwLCAweDBBLCAweEMxLCAweEU3LCAweDU3LCAweEZGLCAweEZGLAorCTB4RkEsIDB4MDUsIDB4MEQsIDB4QzAsIDB4RTcsIDB4NTcsIDB4MDAsIDB4MDAsCisJMHhGQSwgMHgwNSwgMHgwRiwgMHhDMCwgMHg5RiwgMHhBRiwgMHhDNiwgMHgwMCwKKwkweEU3LCAweDA1LCAweDAwLCAweEMwLCAweEM4LCAweDA1LCAweEMxLCAweDA1LAorCTB4QzAsIDB4MDUsIDB4QzAsIDB4REYsIDB4OTcsIDB4Q0YsIDB4MjcsIDB4REEsCisJMHhGQSwgMHgwNSwgMHhFRiwgMHgwNywgMHgwMSwgMHgwMCwgMHgwQiwgMHgwNiwKKwkweDczLCAweENGLCAweDlGLCAweEFGLCAweDc4LCAweDAxLCAweDlGLCAweEFGLAorCTB4MUEsIDB4MDMsIDB4NkUsIDB4Q0YsIDB4RTcsIDB4MDksIDB4RkMsIDB4MDUsCisJMHgyNCwgMHgwMSwgMHhFNywgMHgwOSwgMHgwMiwgMHgwNiwgMHgyNiwgMHgwMSwKKwkweEU3LCAweDA3LCAweDA3LCAweDAwLCAweDkyLCAweEMwLCAweEU3LCAweDA5LAorCTB4RkMsIDB4MDUsIDB4RkUsIDB4MDUsIDB4RTcsIDB4MDksIDB4MDIsIDB4MDYsCisJMHgwNCwgMHgwNiwgMHhFNywgMHgwOSwgMHgwMCwgMHgwNiwgMHhGQywgMHgwNSwKKwkweEU3LCAweDA5LCAweEZFLCAweDA1LCAweDAwLCAweDA2LCAweDI3LCAweERBLAorCTB4RkEsIDB4MDUsIDB4RTcsIDB4NTcsIDB4MDEsIDB4MDAsIDB4RkEsIDB4MDUsCisJMHgwMiwgMHhDQSwgMHgwNCwgMHhDMCwgMHg5NywgMHhDRiwgMHg5RiwgMHhBRiwKKwkweDY2LCAweDA1LCAweDk3LCAweENGLCAweEU3LCAweDA3LCAweDQwLCAweDAwLAorCTB4MDIsIDB4MDYsIDB4QzgsIDB4MDksIDB4RkMsIDB4MDUsIDB4OUYsIDB4QUYsCisJMHhEQSwgMHgwMiwgMHg5NywgMHhDRiwgMHhDRiwgMHgxNywgMHgwMiwgMHgwMCwKKwkweEVGLCAweDU3LCAweDgxLCAweDAwLCAweDA5LCAweDA2LCAweDlGLCAweEEwLAorCTB4QjYsIDB4MDEsIDB4RUYsIDB4NTcsIDB4ODAsIDB4MDAsIDB4MDksIDB4MDYsCisJMHg5RiwgMHhBMCwgMHg0MCwgMHgwMiwgMHhFRiwgMHg1NywgMHgwMSwgMHgwMCwKKwkweDBCLCAweDA2LCAweDlGLCAweEEwLCAweDQ2LCAweDAzLCAweEU3LCAweDA3LAorCTB4MDEsIDB4MDAsIDB4MEEsIDB4QzAsIDB4NDYsIDB4QUYsIDB4NDcsIDB4QUYsCisJMHg5RiwgMHhBRiwgMHg0MCwgMHgwMiwgMHhFNywgMHgwNywgMHgyRSwgMHgwMCwKKwkweDBBLCAweEMwLCAweEVGLCAweDg3LCAweDgwLCAweDAwLCAweDA5LCAweDA2LAorCTB4OTcsIDB4Q0YsIDB4MDAsIDB4MEUsIDB4MDEsIDB4MDAsIDB4QzAsIDB4NTcsCisJMHg1MSwgMHgwMCwgMHg5RiwgMHhDMCwgMHg5RSwgMHgwMiwgMHhDMCwgMHg1NywKKwkweDUwLCAweDAwLCAweDIwLCAweEMwLCAweEMwLCAweDU3LCAweDU1LCAweDAwLAorCTB4MTIsIDB4QzAsIDB4QzAsIDB4NTcsIDB4NTYsIDB4MDAsIDB4OUYsIDB4QzAsCisJMHg3MiwgMHgwMiwgMHg5RiwgMHhDRiwgMHhENiwgMHgwMiwgMHhDMSwgMHgwQiwKKwkweDA4LCAweDA2LCAweDAxLCAweEQwLCAweDZGLCAweDkwLCAweDA4LCAweDA2LAorCTB4QzAsIDB4MDcsIDB4MDgsIDB4MDAsIDB4QzEsIDB4MEIsIDB4MDgsIDB4MDYsCisJMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHg5NywgMHhDRiwgMHgyRiwgMHgwRSwKKwkweDAyLCAweDAwLCAweDA4LCAweDA2LCAweEMwLCAweDA3LCAweDA4LCAweDAwLAorCTB4QzEsIDB4MEIsIDB4MDgsIDB4MDYsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsCisJMHg5RiwgMHhDRiwgMHhENiwgMHgwMiwgMHgyRiwgMHgwRSwgMHgwMiwgMHgwMCwKKwkweDA5LCAweDA2LCAweEVGLCAweDg3LCAweDgwLCAweDAwLCAweDA5LCAweDA2LAorCTB4OUYsIDB4Q0YsIDB4RDYsIDB4MDIsIDB4RUYsIDB4NjcsIDB4N0YsIDB4RkYsCisJMHgwOSwgMHgwNiwgMHhFNywgMHg2NywgMHhGRiwgMHhGRCwgMHgyMiwgMHhDMCwKKwkweEU3LCAweDY3LCAweEVGLCAweEZGLCAweDI0LCAweEMwLCAweEU3LCAweDg3LAorCTB4MTAsIDB4MDAsIDB4MjgsIDB4QzAsIDB4OUYsIDB4QUYsIDB4QjgsIDB4MDUsCisJMHhFNywgMHg4NywgMHhFMCwgMHgyMSwgMHgyNCwgMHhDMCwgMHg5RiwgMHhBRiwKKwkweEE4LCAweDA1LCAweEU3LCAweDg3LCAweDA4LCAweDAwLCAweDI0LCAweEMwLAorCTB4RTcsIDB4NjcsIDB4REYsIDB4RkYsIDB4MjQsIDB4QzAsIDB4QzgsIDB4MDcsCisJMHgwQSwgMHgwMCwgMHhDMCwgMHgwNywgMHgwMCwgMHgwMCwgMHhDMSwgMHgwNywKKwkweDAxLCAweDAwLCAweDlGLCAweEFGLCAweDI4LCAweDA1LCAweDlGLCAweEFGLAorCTB4QjgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4OUUsIDB4MDAsIDB4OUYsIDB4QUYsCisJMHg0NCwgMHgwNSwgMHhFNywgMHg2NywgMHhGRiwgMHhGRSwgMHgyNCwgMHhDMCwKKwkweEMwLCAweDA5LCAweDIwLCAweEMwLCAweEU3LCAweDg3LCAweDAwLCAweDAxLAorCTB4MjQsIDB4QzAsIDB4QzAsIDB4NzcsIDB4MDAsIDB4MDIsIDB4MEYsIDB4QzEsCisJMHhFNywgMHg2NywgMHhGNywgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg2NywKKwkweEY3LCAweEZGLCAweDI0LCAweEMwLCAweEU3LCAweDg3LCAweDA4LCAweDAwLAorCTB4MjQsIDB4QzAsIDB4MDgsIDB4REEsIDB4NUUsIDB4QzEsIDB4RUYsIDB4MDcsCisJMHg4MCwgMHgwMCwgMHgwOSwgMHgwNiwgMHg5NywgMHhDRiwgMHhFRiwgMHgwNywKKwkweDAxLCAweDAwLCAweDBBLCAweDA2LCAweDk3LCAweENGLCAweEVGLCAweDA3LAorCTB4MDAsIDB4MDAsIDB4MEIsIDB4MDYsIDB4RUYsIDB4MDcsIDB4MDAsIDB4MDAsCisJMHgwQSwgMHgwNiwgMHhFRiwgMHg2NywgMHg3RiwgMHhGRiwgMHgwOSwgMHgwNiwKKwkweEVGLCAweDA3LCAweDAwLCAweDAwLCAweDBELCAweDA2LCAweEU3LCAweDY3LAorCTB4RUYsIDB4RkYsIDB4MjgsIDB4QzAsIDB4RTcsIDB4NjcsIDB4MTcsIDB4RDgsCisJMHgyNCwgMHhDMCwgMHhFNywgMHgwNywgMHgwMCwgMHgwMCwgMHgxRSwgMHhDMCwKKwkweEU3LCAweDA3LCAweEZGLCAweEZGLCAweDIyLCAweEMwLCAweDk3LCAweENGLAorCTB4QzgsIDB4MDcsIDB4MEUsIDB4MDYsIDB4OUYsIDB4QUYsIDB4REEsIDB4MDIsCisJMHhFNywgMHgwNywgMHgwMCwgMHgwMCwgMHhGMiwgMHgwNSwgMHhFNywgMHgwNywKKwkweDEwLCAweDAwLCAweEY2LCAweDA1LCAweEU3LCAweDA3LCAweDBFLCAweDA2LAorCTB4RjQsIDB4MDUsIDB4RTcsIDB4MDcsIDB4RDYsIDB4MDIsIDB4RjgsIDB4MDUsCisJMHhDOCwgMHgwNywgMHhGMiwgMHgwNSwgMHhDMSwgMHgwNywgMHgwMCwgMHg4MCwKKwkweDUwLCAweEFGLCAweDk3LCAweENGLCAweDJGLCAweDBDLCAweDAyLCAweDAwLAorCTB4MDcsIDB4MDYsIDB4MkYsIDB4MEMsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDYsCisJMHhFNywgMHgwNywgMHgwMCwgMHgwMCwgMHhGMiwgMHgwNSwgMHhFNywgMHgwNywKKwkweDEwLCAweDAwLCAweEY2LCAweDA1LCAweEU3LCAweDA3LCAweEUyLCAweDA1LAorCTB4RjQsIDB4MDUsIDB4RTcsIDB4MDcsIDB4Q0UsIDB4MDIsIDB4RjgsIDB4MDUsCisJMHhDOCwgMHgwNywgMHhGMiwgMHgwNSwgMHhDMSwgMHgwNywgMHgwMCwgMHg4MCwKKwkweDUxLCAweEFGLCAweDk3LCAweENGLCAweDlGLCAweEFGLCAweDY2LCAweDA0LAorCTB4OUYsIDB4QUYsIDB4MUEsIDB4MDMsIDB4NTksIDB4QUYsIDB4OTcsIDB4Q0YsCisJMHhDMCwgMHgwNywgMHgwRSwgMHgwMCwgMHhDMSwgMHgwQiwgMHgwQywgMHgwNiwKKwkweDQxLCAweEQxLCAweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEMwLCAweDA3LAorCTB4M0MsIDB4MDAsIDB4OUYsIDB4QUYsIDB4NDQsIDB4MDUsIDB4NjgsIDB4MDAsCisJMHhDMCwgMHgwNywgMHgzQiwgMHgwMCwgMHg5RiwgMHhBRiwgMHg0NCwgMHgwNSwKKwkweDZGLCAweDAwLCAweDBDLCAweDA2LCAweDY4LCAweDAwLCAweEUwLCAweDA3LAorCTB4MDQsIDB4MDEsIDB4RTgsIDB4MEIsIDB4MEEsIDB4MDYsIDB4RTgsIDB4MDcsCisJMHgwMCwgMHgwMCwgMHhFMCwgMHgwNywgMHgwMCwgMHgwMiwgMHhFMCwgMHgwNywKKwkweEVDLCAweDAxLCAweEUwLCAweDA3LCAweEZDLCAweEZGLCAweDk3LCAweENGLAorCTB4RTcsIDB4MDcsIDB4RkYsIDB4RkYsIDB4RkEsIDB4MDUsIDB4RUYsIDB4MDcsCisJMHgwMCwgMHgwMCwgMHgwQiwgMHgwNiwgMHhFNywgMHgwNywgMHgwRSwgMHgwNiwKKwkweDI0LCAweDAxLCAweEU3LCAweDA3LCAweDBFLCAweDA2LCAweEZFLCAweDA1LAorCTB4RTcsIDB4MDcsIDB4NDAsIDB4MDAsIDB4MjYsIDB4MDEsIDB4RTcsIDB4MDcsCisJMHg0MCwgMHgwMCwgMHgwNCwgMHgwNiwgMHhFNywgMHgwNywgMHgwNywgMHgwMCwKKwkweDkyLCAweEMwLCAweDk3LCAweENGLCAweEVGLCAweDA3LCAweDAyLCAweDAwLAorCTB4MEIsIDB4MDYsIDB4OUYsIDB4QUYsIDB4NzgsIDB4MDEsIDB4RUYsIDB4NzcsCisJMHg4MCwgMHgwMCwgMHgwNywgMHgwNiwgMHg5RiwgMHhDMCwgMHgxNCwgMHgwNCwKKwkweEVGLCAweDc3LCAweDAxLCAweDAwLCAweDA3LCAweDA2LCAweDM3LCAweEMwLAorCTB4RUYsIDB4NzcsIDB4MDEsIDB4MDAsIDB4MEQsIDB4MDYsIDB4MEYsIDB4QzEsCisJMHhFRiwgMHgwNywgMHgwMSwgMHgwMCwgMHgwRCwgMHgwNiwgMHhDMCwgMHgwNywKKwkweDAyLCAweDAwLCAweEMxLCAweDA3LCAweDMwLCAweDAwLCAweDlGLCAweEFGLAorCTB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4MDEsIDB4MDAsIDB4QzEsIDB4MDcsCisJMHgwMiwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDOCwgMHgwNywKKwkweEZGLCAweDRGLCAweDlGLCAweEFGLCAweEE4LCAweDA1LCAweEMwLCAweDA3LAorCTB4MzgsIDB4MDAsIDB4OUYsIDB4QUYsIDB4NDQsIDB4MDUsIDB4QzEsIDB4NzcsCisJMHgwMywgMHgwMCwgMHgwMiwgMHhDMSwgMHgwOCwgMHhEQSwgMHg3NSwgMHhDMSwKKwkweEMxLCAweDc3LCAweDAxLCAweDAwLCAweDBBLCAweEMxLCAweEMwLCAweDA3LAorCTB4MDEsIDB4MDAsIDB4QzEsIDB4MDcsIDB4MDIsIDB4MDAsIDB4OUYsIDB4QUYsCisJMHgyOCwgMHgwNSwgMHhFRiwgMHgwNywgMHgwMSwgMHgwMCwgMHgwNiwgMHgwNiwKKwkweDJDLCAweENGLCAweEMwLCAweDA3LCAweDAxLCAweDAwLCAweEMxLCAweDA3LAorCTB4MDQsIDB4MDAsIDB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4RUYsIDB4MDcsCisJMHgwMCwgMHgwMCwgMHgwNiwgMHgwNiwgMHgyMiwgMHhDRiwgMHhFRiwgMHgwNywKKwkweDAwLCAweDAwLCAweDBELCAweDA2LCAweEVGLCAweDU3LCAweDAxLCAweDAwLAorCTB4MDYsIDB4MDYsIDB4MUIsIDB4QzAsIDB4QzAsIDB4MDcsIDB4MDEsIDB4MDAsCisJMHhDMSwgMHgwNywgMHgwMSwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKKwkweEMwLCAweDA3LCAweDAyLCAweDAwLCAweEMxLCAweDA3LCAweDMwLCAweDAwLAorCTB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzgsIDB4MDcsIDB4RkYsIDB4NEYsCisJMHg5RiwgMHhBRiwgMHhBOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgzOCwgMHgwMCwKKwkweDlGLCAweEFGLCAweDQ0LCAweDA1LCAweEMxLCAweDY3LCAweDAzLCAweDAwLAorCTB4QzEsIDB4NTcsIDB4MDMsIDB4MDAsIDB4MDIsIDB4QzAsIDB4MDgsIDB4REEsCisJMHg3MywgMHhDMSwgMHhDMCwgMHgwNywgMHgwMiwgMHgwMCwgMHhDMSwgMHgwNywKKwkweDEyLCAweDAwLCAweEVGLCAweDU3LCAweDAwLCAweDAwLCAweDA2LCAweDA2LAorCTB4MDIsIDB4QzAsIDB4QzEsIDB4MDcsIDB4MjMsIDB4MDAsIDB4OUYsIDB4QUYsCisJMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgxNCwgMHgwMCwgMHhDMSwgMHgwQiwKKwkweEVBLCAweDA1LCAweDlGLCAweEFGLCAweDI4LCAweDA1LCAweEMwLCAweDA3LAorCTB4M0UsIDB4MDAsIDB4OUYsIDB4QUYsIDB4MEEsIDB4MDUsIDB4RTcsIDB4MDksCisJMHhFNCwgMHgwNSwgMHhGQSwgMHgwNSwgMHgyNywgMHhEOCwgMHhGQSwgMHgwNSwKKwkweEU3LCAweDA3LCAweDBFLCAweDA2LCAweEZDLCAweDA1LCAweEU3LCAweDA3LAorCTB4NEUsIDB4MDYsIDB4MDAsIDB4MDYsIDB4RTcsIDB4MDcsIDB4NDAsIDB4MDAsCisJMHgwMiwgMHgwNiwgMHg5RiwgMHhBRiwgMHg2NiwgMHgwNSwgMHg5RiwgMHhBRiwKKwkweEM2LCAweDAwLCAweDk3LCAweENGLCAweEMxLCAweDBCLCAweEUyLCAweDA1LAorCTB4NDEsIDB4RDAsIDB4MDEsIDB4RDIsIDB4QzEsIDB4MTcsIDB4MjMsIDB4MDAsCisJMHg5RiwgMHhBRiwgMHhEQywgMHgwNCwgMHhDMCwgMHgwNywgMHgwNCwgMHgwMCwKKwkweEMxLCAweDBCLCAweEUzLCAweDA1LCAweDlGLCAweEFGLCAweDI4LCAweDA1LAorCTB4QzAsIDB4MDcsIDB4MDYsIDB4MDAsIDB4QzEsIDB4MDksIDB4RTYsIDB4MDUsCisJMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywgMHgwNywgMHgwMCwKKwkweEMxLCAweDA5LCAweEU2LCAweDA1LCAweEMxLCAweEQxLCAweDlGLCAweEFGLAorCTB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4MEIsIDB4MDAsIDB4QzEsIDB4MDksCisJMHhFOCwgMHgwNSwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwgMHhDMCwgMHgwNywKKwkweDBDLCAweDAwLCAweEMxLCAweDA5LCAweEU4LCAweDA1LCAweEMxLCAweEQxLAorCTB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4MEQsIDB4MDAsCisJMHhDMSwgMHgwNywgMHgwOSwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKKwkweEMwLCAweDA3LCAweDAzLCAweDAwLCAweEMxLCAweDA3LCAweDMyLCAweDAwLAorCTB4OUYsIDB4QUYsIDB4MjgsIDB4MDUsIDB4QzAsIDB4MDcsIDB4MEYsIDB4MDAsCisJMHhDMSwgMHgwNywgMHgwMCwgMHgwMCwgMHg5RiwgMHhBRiwgMHgyOCwgMHgwNSwKKwkweDk3LCAweENGLCAweEU3LCAweDY3LCAweEZGLCAweEQ5LCAweDI0LCAweEMwLAorCTB4QzgsIDB4MDcsIDB4MEEsIDB4MDAsIDB4NDAsIDB4MDAsIDB4QzAsIDB4NjcsCisJMHgwMCwgMHgwMiwgMHgyNywgMHg4MCwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywKKwkweDAwLCAweDA0LCAweDI0LCAweEMwLCAweEU3LCAweDY3LCAweEZGLCAweEY5LAorCTB4MjQsIDB4QzAsIDB4MDEsIDB4RDIsIDB4MDgsIDB4REEsIDB4NzIsIDB4QzEsCisJMHhFNywgMHg4NywgMHgwMCwgMHgyMCwgMHgyNCwgMHhDMCwgMHg5NywgMHhDRiwKKwkweDI3LCAweDAwLCAweDFFLCAweEMwLCAweEU3LCAweDg3LCAweEZGLCAweDAwLAorCTB4MjIsIDB4QzAsIDB4RTcsIDB4NjcsIDB4N0YsIDB4RkYsIDB4MjQsIDB4QzAsCisJMHhFNywgMHg4NywgMHg4MCwgMHgwMCwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywKKwkweDgwLCAweDAwLCAweDI0LCAweEMwLCAweDk3LCAweENGLCAweDlGLCAweEFGLAorCTB4MEEsIDB4MDUsIDB4NjcsIDB4MDAsIDB4MUUsIDB4QzAsIDB4RTcsIDB4NjcsCisJMHhCRiwgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg4NywgMHg0MCwgMHgwMCwKKwkweDI0LCAweEMwLCAweEU3LCAweDg3LCAweDQwLCAweDAwLCAweDI0LCAweEMwLAorCTB4OTcsIDB4Q0YsIDB4OUYsIDB4QUYsIDB4MEEsIDB4MDUsIDB4RTcsIDB4NjcsCisJMHgwMCwgMHhGRiwgMHgyMiwgMHhDMCwgMHhFNywgMHg2NywgMHhGRiwgMHhGRSwKKwkweDI0LCAweEMwLCAweEU3LCAweDY3LCAweEZGLCAweEZFLCAweDI0LCAweEMwLAorCTB4QzEsIDB4MDksIDB4MjAsIDB4QzAsIDB4RTcsIDB4ODcsIDB4MDAsIDB4MDEsCisJMHgyNCwgMHhDMCwgMHg5NywgMHhDRiwgMHhDMCwgMHgwNywgMHg0MCwgMHgwMCwKKwkweEM4LCAweDA5LCAweEZDLCAweDA1LCAweEU3LCAweDY3LCAweDAwLCAweEZGLAorCTB4MjIsIDB4QzAsIDB4RTcsIDB4NjcsIDB4RkYsIDB4RkUsIDB4MjQsIDB4QzAsCisJMHhFNywgMHg2NywgMHhCRiwgMHhGRiwgMHgyNCwgMHhDMCwgMHhFNywgMHg2NywKKwkweEJGLCAweEZGLCAweDI0LCAweEMwLCAweDAwLCAweERBLCAweEU4LCAweDA5LAorCTB4MjAsIDB4QzAsIDB4RTcsIDB4ODcsIDB4NDAsIDB4MDAsIDB4MjQsIDB4QzAsCisJMHhFNywgMHg4NywgMHg0MCwgMHgwMCwgMHgyNCwgMHhDMCwgMHgwMCwgMHhEQSwKKwkweEU4LCAweDA5LCAweDIwLCAweEMwLCAweDZELCAweEMxLCAweEU3LCAweDg3LAorCTB4MDAsIDB4MDEsIDB4MjQsIDB4QzAsIDB4OTcsIDB4Q0YsIDB4RTcsIDB4MDcsCisJMHgzMiwgMHgwMCwgMHgxMiwgMHhDMCwgMHhFNywgMHg3NywgMHgwMCwgMHg4MCwKKwkweDEyLCAweEMwLCAweDdDLCAweEMwLCAweDk3LCAweENGLCAweEU3LCAweDA3LAorCTB4MjAsIDB4NEUsIDB4MTIsIDB4QzAsIDB4RTcsIDB4NzcsIDB4MDAsIDB4ODAsCisJMHgxMiwgMHhDMCwgMHg3QywgMHhDMCwgMHg5NywgMHhDRiwgMHgwOSwgMHgwMiwKKwkweDE5LCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDgwLCAweDk2LCAweDA5LAorCTB4MDQsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwNywgMHgwNSwgMHg4MSwgMHgwMiwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2V0dXA1W10gPSB7CisJMHhCNiwgMHhDMywgMHgyRiwgMHgwMSwgMHgwMywgMHg2NCwgMHgwRSwgMHgwMCwKKwkweDE0LCAweDAwLCAweDFBLCAweDAwLCAweDIwLCAweDAwLCAweDI2LCAweDAwLAorCTB4NEEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NkEsIDB4MDAsIDB4OTIsIDB4MDAsCisJMHg5QSwgMHgwMCwgMHhBMCwgMHgwMCwgMHhCMiwgMHgwMCwgMHhCOCwgMHgwMCwKKwkweEJFLCAweDAwLCAweEMyLCAweDAwLCAweEM4LCAweDAwLCAweENFLCAweDAwLAorCTB4REMsIDB4MDAsIDB4REEsIDB4MDAsIDB4RTIsIDB4MDAsIDB4RTAsIDB4MDAsCisJMHhFOCwgMHgwMCwgMHhFNiwgMHgwMCwgMHhFRSwgMHgwMCwgMHhFQywgMHgwMCwKKwkweEYyLCAweDAwLCAweEY4LCAweDAwLCAweDAyLCAweDAxLCAweDBBLCAweDAxLAorCTB4MEUsIDB4MDEsIDB4MTIsIDB4MDEsIDB4MUUsIDB4MDEsIDB4MjIsIDB4MDEsCisJMHgyOCwgMHgwMSwgMHgyQywgMHgwMSwgMHgzMiwgMHgwMSwgMHgzNiwgMHgwMSwKKwkweDQ0LCAweDAxLCAweDUwLCAweDAxLCAweDVFLCAweDAxLCAweDcyLCAweDAxLAorCTB4NzYsIDB4MDEsIDB4N0EsIDB4MDEsIDB4ODAsIDB4MDEsIDB4ODgsIDB4MDEsCisJMHg4QywgMHgwMSwgMHg5NCwgMHgwMSwgMHg5QywgMHgwMSwgMHhBMCwgMHgwMSwKKwkweEE0LCAweDAxLCAweEFBLCAweDAxLCAweEIwLCAweDAxLCAweEI0LCAweDAxLAorCTB4QkEsIDB4MDEsIDB4RDAsIDB4MDEsIDB4REEsIDB4MDEsIDB4RjYsIDB4MDEsCisJMHhGQSwgMHgwMSwgMHgwMiwgMHgwMiwgMHgzNCwgMHgwMiwgMHgzQywgMHgwMiwKKwkweDQ0LCAweDAyLCAweDRBLCAweDAyLCAweDUwLCAweDAyLCAweDU2LCAweDAyLAorCTB4NzQsIDB4MDIsIDB4NzgsIDB4MDIsIDB4N0UsIDB4MDIsIDB4ODQsIDB4MDIsCisJMHg4QSwgMHgwMiwgMHg4OCwgMHgwMiwgMHg5MCwgMHgwMiwgMHg4RSwgMHgwMiwKKwkweDk0LCAweDAyLCAweEEyLCAweDAyLCAweEE4LCAweDAyLCAweEFFLCAweDAyLAorCTB4QjQsIDB4MDIsIDB4QkEsIDB4MDIsIDB4QjgsIDB4MDIsIDB4QzAsIDB4MDIsCisJMHhCRSwgMHgwMiwgMHhDNCwgMHgwMiwgMHhEMCwgMHgwMiwgMHhENCwgMHgwMiwKKwkweEUwLCAweDAyLCAweEU2LCAweDAyLCAweEVFLCAweDAyLCAweEY4LCAweDAyLAorCTB4RkMsIDB4MDIsIDB4MDYsIDB4MDMsIDB4MUUsIDB4MDMsIDB4MjQsIDB4MDMsCisJMHgyOCwgMHgwMywgMHgzMCwgMHgwMywgMHgyRSwgMHgwMywgMHgzQywgMHgwMywKKwkweDRBLCAweDAzLCAweDRFLCAweDAzLCAweDU0LCAweDAzLCAweDU4LCAweDAzLAorCTB4NUUsIDB4MDMsIDB4NjYsIDB4MDMsIDB4NkUsIDB4MDMsIDB4N0EsIDB4MDMsCisJMHg4NiwgMHgwMywgMHg4RSwgMHgwMywgMHg5NiwgMHgwMywgMHhCMiwgMHgwMywKKwkweEI4LCAweDAzLCAweEM2LCAweDAzLCAweENDLCAweDAzLCAweEQ0LCAweDAzLAorCTB4REEsIDB4MDMsIDB4RTgsIDB4MDMsIDB4RjQsIDB4MDMsIDB4RkMsIDB4MDMsCisJMHgwNCwgMHgwNCwgMHgyMCwgMHgwNCwgMHgyQSwgMHgwNCwgMHgzMiwgMHgwNCwKKwkweDM2LCAweDA0LCAweDNFLCAweDA0LCAweDQ0LCAweDA0LCAweDQyLCAweDA0LAorCTB4NDgsIDB4MDQsIDB4NEUsIDB4MDQsIDB4NEMsIDB4MDQsIDB4NTQsIDB4MDQsCisJMHg1MiwgMHgwNCwgMHg1QSwgMHgwNCwgMHg1RSwgMHgwNCwgMHg2MiwgMHgwNCwKKwkweDY4LCAweDA0LCAweDc0LCAweDA0LCAweDdDLCAweDA0LCAweDgwLCAweDA0LAorCTB4ODgsIDB4MDQsIDB4OEMsIDB4MDQsIDB4OTQsIDB4MDQsIDB4OUEsIDB4MDQsCisJMHhBMiwgMHgwNCwgMHhBNiwgMHgwNCwgMHhBRSwgMHgwNCwgMHhCNCwgMHgwNCwKKwkweEMwLCAweDA0LCAweENDLCAweDA0LCAweEQ4LCAweDA0LCAweDJBLCAweDA1LAorCTB4NDYsIDB4MDUsIDB4NkMsIDB4MDUsIDB4MDAsIDB4MDAKK307CisKKy8qIHJ2bWFsbG9jIC8gcnZmcmVlIGNvcGllZCBmcm9tIHVzYnZpZGVvLmMKKyAqCisgKiBOb3Qgc3VyZSB3aHkgdGhlc2UgYXJlIG5vdCB5ZXQgbm9uLXN0YXRpY3Mgd2hpY2ggSSBjYW4gcmVmZXJlbmNlIHRocm91Z2gKKyAqIHVzYnZpZGVvLmggdGhlIHNhbWUgYXMgaXQgaXMgaW4gMi40LjIwLiAgSSBiZXQgdGhpcyB3aWxsIGdldCBmaXhlZCBzb21ldGltZQorICogaW4gdGhlIGZ1dHVyZS4KKyAqIAorKi8KK3N0YXRpYyB2b2lkICpydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqbWVtOworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJbWVtID0gdm1hbGxvY18zMihzaXplKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KKwlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlIChzaXplID4gMCkgeworCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBtZW07Cit9CisKK3N0YXRpYyB2b2lkIHJ2ZnJlZSh2b2lkICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCWlmICghbWVtKQorCQlyZXR1cm47CisKKwlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlICgobG9uZykgc2l6ZSA+IDApIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKwl2ZnJlZShtZW0pOworfQorCitzdHJ1Y3QgdmljYW1fY2FtZXJhIHsKKwl1MTYgc2h1dHRlcl9zcGVlZDsJLy8gY2FwdHVyZSBzaHV0dGVyIHNwZWVkCisJdTE2IGdhaW47CQkvLyBjYXB0dXJlIGdhaW4KKworCXU4ICpyYXdfaW1hZ2U7CQkvLyByYXcgZGF0YSBjYXB0dXJlZCBmcm9tIHRoZSBjYW1lcmEKKwl1OCAqZnJhbWVidWY7CQkvLyBwcm9jZXNzZWQgZGF0YSBpbiBSR0IyNCBmb3JtYXQKKwl1OCAqY250cmxidWY7CQkvLyBhcmVhIHVzZWQgdG8gc2VuZCBjb250cm9sIG1zZ3MKKworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsJLy8gdjRsIHZpZGVvIGRldmljZQorCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwkvLyB1c2IgZGV2aWNlCisKKwkvKiBndWFyZCBhZ2FpbnN0IHNpbXVsdGFuZW91cyBhY2Nlc3NlcyB0byB0aGUgY2FtZXJhICovCisJc3RydWN0IHNlbWFwaG9yZSBjYW1fbG9jazsKKworCWludCBpc19pbml0aWFsaXplZDsKKwl1OCBvcGVuX2NvdW50OworCXU4IGJ1bGtFbmRwb2ludDsKKwlpbnQgbmVlZHNEdW1teVJlYWQ7CisKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFT19QUk9DX0ZTKQorCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19kaXI7CisjZW5kaWYKKworfTsKKworc3RhdGljIGludCB2aWNhbV9wcm9iZSggc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCB2aWNhbV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK3N0YXRpYyB2b2lkIHJlYWRfZnJhbWUoc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWVudW0pOworc3RhdGljIHZvaWQgdmljYW1fZGVjb2RlX2NvbG9yKGNvbnN0IHU4ICosIHU4ICopOworCitzdGF0aWMgaW50IF9fc2VuZF9jb250cm9sX21zZyhzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0sCisJCQkgICAgICB1OCByZXF1ZXN0LAorCQkJICAgICAgdTE2IHZhbHVlLAorCQkJICAgICAgdTE2IGluZGV4LAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqY3AsCisJCQkgICAgICB1MTYgc2l6ZSkKK3sKKwlpbnQgc3RhdHVzOworCisJLyogY3AgbXVzdCBiZSBtZW1vcnkgdGhhdCBoYXMgYmVlbiBhbGxvY2F0ZWQgYnkga21hbGxvYyAqLworCisJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKGNhbS0+dWRldiwKKwkJCQkgdXNiX3NuZGN0cmxwaXBlKGNhbS0+dWRldiwgMCksCisJCQkJIHJlcXVlc3QsCisJCQkJIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgVVNCX1JFQ0lQX0RFVklDRSwgdmFsdWUsIGluZGV4LAorCQkJCSBjcCwgc2l6ZSwgMTAwMCk7CisKKwlzdGF0dXMgPSBtaW4oc3RhdHVzLCAwKTsKKworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCBzZW5kaW5nIGNvbnRyb2wgbWVzc2FnZSwgZXJyb3IgJWQuXG4iLAorCQkgICAgICAgc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHNlbmRfY29udHJvbF9tc2coc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtLAorCQkJICAgIHU4IHJlcXVlc3QsCisJCQkgICAgdTE2IHZhbHVlLAorCQkJICAgIHUxNiBpbmRleCwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICpjcCwKKwkJCSAgICB1MTYgc2l6ZSkKK3sKKwlpbnQgc3RhdHVzID0gLUVOT0RFVjsKKwlkb3duKCZjYW0tPmNhbV9sb2NrKTsKKwlpZiAoY2FtLT51ZGV2KSB7CisJCXN0YXR1cyA9IF9fc2VuZF9jb250cm9sX21zZyhjYW0sIHJlcXVlc3QsIHZhbHVlLAorCQkJCQkgICAgaW5kZXgsIGNwLCBzaXplKTsKKwl9CisJdXAoJmNhbS0+Y2FtX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CitzdGF0aWMgaW50Citpbml0aWFsaXplX2NhbWVyYShzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0pCit7CisJY29uc3Qgc3RydWN0IHsKKwkJdTggKmRhdGE7CisJCXUzMiBzaXplOworCX0gZmlybXdhcmVbXSA9IHsKKwkJeyAuZGF0YSA9IHNldHVwMSwgLnNpemUgPSBzaXplb2Yoc2V0dXAxKSB9LAorCQl7IC5kYXRhID0gc2V0dXAyLCAuc2l6ZSA9IHNpemVvZihzZXR1cDIpIH0sCisJCXsgLmRhdGEgPSBzZXR1cDMsIC5zaXplID0gc2l6ZW9mKHNldHVwMykgfSwKKwkJeyAuZGF0YSA9IHNldHVwNCwgLnNpemUgPSBzaXplb2Yoc2V0dXA0KSB9LAorCQl7IC5kYXRhID0gc2V0dXA1LCAuc2l6ZSA9IHNpemVvZihzZXR1cDUpIH0sCisJCXsgLmRhdGEgPSBzZXR1cDMsIC5zaXplID0gc2l6ZW9mKHNldHVwMykgfSwKKwkJeyAuZGF0YSA9IE5VTEwsIC5zaXplID0gMCB9CisJfTsKKworCWludCBlcnIsIGk7CisKKwlmb3IgKGkgPSAwLCBlcnIgPSAwOyBmaXJtd2FyZVtpXS5kYXRhICYmICFlcnI7IGkrKykgeworCQltZW1jcHkoY2FtLT5jbnRybGJ1ZiwgZmlybXdhcmVbaV0uZGF0YSwgZmlybXdhcmVbaV0uc2l6ZSk7CisKKwkJZXJyID0gc2VuZF9jb250cm9sX21zZyhjYW0sIDB4ZmYsIDAsIDAsCisJCQkJICAgICAgIGNhbS0+Y250cmxidWYsIGZpcm13YXJlW2ldLnNpemUpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9jYW1lcmFfcG93ZXIoc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtLCBpbnQgc3RhdGUpCit7CisJaW50IHN0YXR1czsKKworCWlmICgoc3RhdHVzID0gc2VuZF9jb250cm9sX21zZyhjYW0sIDB4NTAsIHN0YXRlLCAwLCBOVUxMLCAwKSkgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKHN0YXRlKSB7CisJCXNlbmRfY29udHJvbF9tc2coY2FtLCAweDU1LCAxLCAwLCBOVUxMLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordmljYW1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBpb2N0bG5yLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqdXNlcl9hcmcgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXR2YWwgPSAwOworCisJaWYgKCFjYW0pCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoIChpb2N0bG5yKSB7CisJCS8qIHF1ZXJ5IGNhcGFiaWxpdGllcyAqLworCWNhc2UgVklESU9DR0NBUDoKKwkJeworCQkJc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgYjsKKworCQkJREJHKCJWSURJT0NHQ0FQXG4iKTsKKwkJCW1lbXNldCgmYiwgMCwgc2l6ZW9mKGIpKTsKKwkJCXN0cmNweShiLm5hbWUsICJWaUNhbS1iYXNlZCBDYW1lcmEiKTsKKwkJCWIudHlwZSA9IFZJRF9UWVBFX0NBUFRVUkU7CisJCQliLmNoYW5uZWxzID0gMTsKKwkJCWIuYXVkaW9zID0gMDsKKwkJCWIubWF4d2lkdGggPSAzMjA7CS8qIFZJREVPU0laRV9DSUYgKi8KKwkJCWIubWF4aGVpZ2h0ID0gMjQwOworCQkJYi5taW53aWR0aCA9IDMyMDsJLyogVklERU9TSVpFXzQ4XzQ4ICovCisJCQliLm1pbmhlaWdodCA9IDI0MDsKKworCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJmIsIHNpemVvZihiKSkpCisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKworCQkJYnJlYWs7CisJCX0KKwkJLyogZ2V0L3NldCB2aWRlbyBzb3VyY2UgLSB3ZSBhcmUgYSBjYW1lcmEgYW5kIG5vdGhpbmcgZWxzZSAqLworCWNhc2UgVklESU9DR0NIQU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsIHY7CisKKwkJCURCRygiVklESU9DR0NIQU5cbiIpOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2LCB1c2VyX2FyZywgc2l6ZW9mKHYpKSkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAodi5jaGFubmVsICE9IDApIHsKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQl2LmNoYW5uZWwgPSAwOworCQkJc3RyY3B5KHYubmFtZSwgIkNhbWVyYSIpOworCQkJdi50dW5lcnMgPSAwOworCQkJdi5mbGFncyA9IDA7CisJCQl2LnR5cGUgPSBWSURFT19UWVBFX0NBTUVSQTsKKwkJCXYubm9ybSA9IDA7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZ2LCBzaXplb2YodikpKQorCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBWSURJT0NTQ0hBTjoKKwkJeworCQkJaW50IHY7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgdXNlcl9hcmcsIHNpemVvZih2KSkpCisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCURCRygiVklESU9DU0NIQU4gJWRcbiIsIHYpOworCisJCQlpZiAocmV0dmFsID09IDAgJiYgdiAhPSAwKQorCQkJCXJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLyogaW1hZ2UgcHJvcGVydGllcyAqLworCWNhc2UgVklESU9DR1BJQ1Q6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlIHZwOworCQkJREJHKCJWSURJT0NHUElDVFxuIik7CisJCQltZW1zZXQoJnZwLCAwLCBzaXplb2YgKHN0cnVjdCB2aWRlb19waWN0dXJlKSk7CisJCQl2cC5icmlnaHRuZXNzID0gY2FtLT5nYWluIDw8IDg7CisJCQl2cC5kZXB0aCA9IDI0OworCQkJdnAucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7CisJCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAmdnAsIHNpemVvZiAoc3RydWN0IHZpZGVvX3BpY3R1cmUpKSkKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgVklESU9DU1BJQ1Q6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlIHZwOworCQkJCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnZwLCB1c2VyX2FyZywgc2l6ZW9mKHZwKSkpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQlEQkcoIlZJRElPQ1NQSUNUIGRlcHRoID0gJWQsIHBhbCA9ICVkXG4iLCB2cC5kZXB0aCwKKwkJCSAgICB2cC5wYWxldHRlKTsKKworCQkJY2FtLT5nYWluID0gdnAuYnJpZ2h0bmVzcyA+PiA4OworCisJCQlpZiAodnAuZGVwdGggIT0gMjQKKwkJCSAgICB8fCB2cC5wYWxldHRlICE9IFZJREVPX1BBTEVUVEVfUkdCMjQpCisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvKiBnZXQvc2V0IGNhcHR1cmUgd2luZG93ICovCisJY2FzZSBWSURJT0NHV0lOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93IHZ3OworCQkJdncueCA9IDA7CisJCQl2dy55ID0gMDsKKwkJCXZ3LndpZHRoID0gMzIwOworCQkJdncuaGVpZ2h0ID0gMjQwOworCQkJdncuY2hyb21ha2V5ID0gMDsKKwkJCXZ3LmZsYWdzID0gMDsKKwkJCXZ3LmNsaXBzID0gTlVMTDsKKwkJCXZ3LmNsaXBjb3VudCA9IDA7CisKKwkJCURCRygiVklESU9DR1dJTlxuIik7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICh2b2lkICopJnZ3LCBzaXplb2YodncpKSkKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCisJCQkvLyBJJ20gbm90IHN1cmUgd2hhdCB0aGUgZGVhbCB3aXRoIGEgY2FwdHVyZSB3aW5kb3cgaXMsIGl0IGlzIHZlcnkgcG9vcmx5IGRlc2NyaWJlZAorCQkJLy8gaW4gdGhlIGRvYy4gIFNvIEkgd29uJ3Qgc3VwcG9ydCBpdCBub3cuCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBWSURJT0NTV0lOOgorCQl7CisKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgdnc7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdncsIHVzZXJfYXJnLCBzaXplb2YodncpKSkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCURCRygiVklESU9DU1dJTiAlZCB4ICVkXG4iLCB2dy53aWR0aCwgdncuaGVpZ2h0KTsKKwkJCQorCQkJaWYgKCB2dy53aWR0aCAhPSAzMjAgfHwgdncuaGVpZ2h0ICE9IDI0MCApCisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvKiBtbWFwIGludGVyZmFjZSAqLworCWNhc2UgVklESU9DR01CVUY6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19tYnVmIHZtOworCQkJaW50IGk7CisKKwkJCURCRygiVklESU9DR01CVUZcbiIpOworCQkJbWVtc2V0KCZ2bSwgMCwgc2l6ZW9mICh2bSkpOworCQkJdm0uc2l6ZSA9CisJCQkgICAgVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBWSUNBTV9GUkFNRVM7CisJCQl2bS5mcmFtZXMgPSBWSUNBTV9GUkFNRVM7CisJCQlmb3IgKGkgPSAwOyBpIDwgVklDQU1fRlJBTUVTOyBpKyspCisJCQkJdm0ub2Zmc2V0c1tpXSA9IFZJQ0FNX01BWF9GUkFNRV9TSVpFICogaTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgKHZvaWQgKikmdm0sIHNpemVvZih2bSkpKQorCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIFZJRElPQ01DQVBUVVJFOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fbW1hcCB2bTsKKwkJCS8vIGludCB2aWRlb19zaXplOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmdm0sIHVzZXJfYXJnLCBzaXplb2Yodm0pKSkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCURCRygiVklESU9DTUNBUFRVUkUgZnJhbWU9JWQsIGhlaWdodD0lZCwgd2lkdGg9JWQsIGZvcm1hdD0lZC5cbiIsdm0uZnJhbWUsdm0ud2lkdGgsdm0uaGVpZ2h0LHZtLmZvcm1hdCk7CisKKwkJCWlmICggdm0uZnJhbWUgPj0gVklDQU1fRlJBTUVTIHx8IHZtLmZvcm1hdCAhPSBWSURFT19QQUxFVFRFX1JHQjI0ICkKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCisJCQkvLyBpbiB0aGVvcnkgcmlnaHQgaGVyZSB3ZSdkIHN0YXJ0IHRoZSBpbWFnZSBjYXB0dXJpbmcKKwkJCS8vIChmaWxsIGluIGEgYnVsayB1cmIgYW5kIHN1Ym1pdCBpdCBhc3luY2hyb25vdXNseSkKKwkJCS8vCisJCQkvLyBJbnN0ZWFkIHdlJ3JlIGdvaW5nIHRvIGRvIGEgdG90YWwgaGFjayBqb2IgZm9yIG5vdyBhbmQKKwkJCS8vIHJldHJpZXZlIHRoZSBmcmFtZSBpbiBWSURJT0NTWU5DCisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIFZJRElPQ1NZTkM6CisJCXsKKwkJCWludCBmcmFtZTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJmZyYW1lLCB1c2VyX2FyZywgc2l6ZW9mKGludCkpKSB7CisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCURCRygiVklESU9DU1lOQzogJWRcbiIsIGZyYW1lKTsKKworCQkJcmVhZF9mcmFtZShjYW0sIGZyYW1lKTsKKwkJCXZpY2FtX2RlY29kZV9jb2xvcihjYW0tPnJhd19pbWFnZSwKKwkJCQkJICAgY2FtLT5mcmFtZWJ1ZiArCisJCQkJCSAgIGZyYW1lICogVklDQU1fTUFYX0ZSQU1FX1NJWkUgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvKiBwb2ludGxlc3MgdG8gaW1wbGVtZW50IG92ZXJsYXkgd2l0aCB0aGlzIGNhbWVyYSAqLworCWNhc2UgVklESU9DQ0FQVFVSRToKKwljYXNlIFZJRElPQ0dGQlVGOgorCWNhc2UgVklESU9DU0ZCVUY6CisJY2FzZSBWSURJT0NLRVk6CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJCS8qIHR1bmVyIGludGVyZmFjZSAtIHdlIGhhdmUgbm9uZSAqLworCWNhc2UgVklESU9DR1RVTkVSOgorCWNhc2UgVklESU9DU1RVTkVSOgorCWNhc2UgVklESU9DR0ZSRVE6CisJY2FzZSBWSURJT0NTRlJFUToKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwkJLyogYXVkaW8gaW50ZXJmYWNlIC0gd2UgaGF2ZSBub25lICovCisJY2FzZSBWSURJT0NHQVVESU86CisJY2FzZSBWSURJT0NTQVVESU86CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHZhbCA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAordmljYW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9CisJICAgIChzdHJ1Y3QgdmljYW1fY2FtZXJhICopIGRldi0+cHJpdjsKKwlEQkcoIm9wZW5cbiIpOworCisJaWYgKCFjYW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAidmljYW0gdmlkZW9fZGV2aWNlIGltcHJvcGVybHkgaW5pdGlhbGl6ZWQiKTsKKwl9CisKKwkvKiB0aGUgdmlkZW9kZXZfbG9jayBoZWxkIGFib3ZlIHVzIHByb3RlY3RzIHVzIGZyb20KKwkgKiBzaW11bHRhbmVvdXMgb3BlbnMuLi5mb3Igbm93LiB3ZSBwcm9iYWJseSBzaG91bGRuJ3QKKwkgKiByZWx5IG9uIHRoaXMgZmFjdCBmb3JldmVyLgorCSAqLworCisJaWYgKGNhbS0+b3Blbl9jb3VudCA+IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgInZpY2FtX29wZW4gY2FsbGVkIG9uIGFscmVhZHkgb3BlbmVkIGNhbWVyYSIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWNhbS0+cmF3X2ltYWdlID0ga21hbGxvYyhWSUNBTV9NQVhfUkVBRF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhbS0+cmF3X2ltYWdlKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNhbS0+ZnJhbWVidWYgPSBydm1hbGxvYyhWSUNBTV9NQVhfRlJBTUVfU0laRSAqIFZJQ0FNX0ZSQU1FUyk7CisJaWYgKCFjYW0tPmZyYW1lYnVmKSB7CisJCWtmcmVlKGNhbS0+cmF3X2ltYWdlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2FtLT5jbnRybGJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhbS0+Y250cmxidWYpIHsKKwkJa2ZyZWUoY2FtLT5yYXdfaW1hZ2UpOworCQlydmZyZWUoY2FtLT5mcmFtZWJ1ZiwgVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBWSUNBTV9GUkFNRVMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvLyBGaXJzdCB1cGxvYWQgZmlybXdhcmUsIHRoZW4gdHVybiB0aGUgY2FtZXJhIG9uCisKKwlpZiAoIWNhbS0+aXNfaW5pdGlhbGl6ZWQpIHsKKwkJaW5pdGlhbGl6ZV9jYW1lcmEoY2FtKTsKKworCQljYW0tPmlzX2luaXRpYWxpemVkID0gMTsKKwl9CisKKwlzZXRfY2FtZXJhX3Bvd2VyKGNhbSwgMSk7CisKKwljYW0tPm5lZWRzRHVtbXlSZWFkID0gMTsKKwljYW0tPm9wZW5fY291bnQrKzsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhbTsJCisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCit2aWNhbV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IG9wZW5fY291bnQ7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisKKwlEQkcoImNsb3NlXG4iKTsKKworCS8qIGl0J3Mgbm90IHRoZSBlbmQgb2YgdGhlIHdvcmxkIGlmCisJICogd2UgZmFpbCB0byB0dXJuIHRoZSBjYW1lcmEgb2ZmLgorCSAqLworCisJc2V0X2NhbWVyYV9wb3dlcihjYW0sIDApOworCisJa2ZyZWUoY2FtLT5yYXdfaW1hZ2UpOworCXJ2ZnJlZShjYW0tPmZyYW1lYnVmLCBWSUNBTV9NQVhfRlJBTUVfU0laRSAqIFZJQ0FNX0ZSQU1FUyk7CisJa2ZyZWUoY2FtLT5jbnRybGJ1Zik7CisKKwlkb3duKCZjYW0tPmNhbV9sb2NrKTsKKworCWNhbS0+b3Blbl9jb3VudC0tOworCW9wZW5fY291bnQgPSBjYW0tPm9wZW5fY291bnQ7CisJdWRldiA9IGNhbS0+dWRldjsKKworCXVwKCZjYW0tPmNhbV9sb2NrKTsKKworCWlmICghb3Blbl9jb3VudCAmJiAhdWRldikgeworCQlrZnJlZShjYW0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2aWNhbV9kZWNvZGVfY29sb3IoY29uc3QgdTggKmRhdGEsIHU4ICpyZ2IpCit7CisJLyogdmljYW1fZGVjb2RlX2NvbG9yIC0gQ29udmVydCBmcm9tIFZpY2FtIFktQ3ItQ2IgdG8gUkdCCisJICogQ29weXJpZ2h0IChDKSAyMDAyIE1vbnJvZSBXaWxsaWFtcyAobW9ucm9lQHBvYm94LmNvbSkKKwkgKi8KKworCWludCBpLCBwcmV2WSwgbmV4dFk7CisKKwlwcmV2WSA9IDUxMjsKKwluZXh0WSA9IDUxMjsKKworCWRhdGEgKz0gVklDQU1fSEVBREVSX1NJWkU7CisKKwlmb3IoIGkgPSAwOyBpIDwgMjQwOyBpKyssIGRhdGEgKz0gNTEyICkgeworCQljb25zdCBpbnQgeSA9ICggaSAqIDI0MiApIC8gMjQwOworCisJCWludCBqLCBwcmV2WCwgbmV4dFg7CisJCWludCBZLCBDciwgQ2I7CisKKwkJaWYgKCB5ID09IDI0MiAtIDEgKSB7CisJCQluZXh0WSA9IC01MTI7CisJCX0KKworCQlwcmV2WCA9IDE7CisJCW5leHRYID0gMTsKKworCQlmb3IgKCBqID0gMDsgaiA8IDMyMDsgaisrLCByZ2IgKz0gMyApIHsKKwkJCWNvbnN0IGludCB4ID0gKCBqICogNTEyICkgLyAzMjA7CisJCQljb25zdCB1OCAqIGNvbnN0IHNyYyA9ICZkYXRhW3hdOworCisJCQlpZiAoIHggPT0gNTEyIC0gMSApIHsKKwkJCQluZXh0WCA9IC0xOworCQkJfQorCisJCQlDciA9ICggc3JjW3ByZXZYXSAtIHNyY1swXSApICsKKwkJCQkoIHNyY1tuZXh0WF0gLSBzcmNbMF0gKTsKKwkJCUNyIC89IDI7CisKKwkJCUNiID0gKCBzcmNbcHJldlldIC0gc3JjW3ByZXZYICsgcHJldlldICkgKworCQkJCSggc3JjW3ByZXZZXSAtIHNyY1tuZXh0WCArIHByZXZZXSApICsKKwkJCQkoIHNyY1tuZXh0WV0gLSBzcmNbcHJldlggKyBuZXh0WV0gKSArCisJCQkJKCBzcmNbbmV4dFldIC0gc3JjW25leHRYICsgbmV4dFldICk7CisJCQlDYiAvPSA0OworCisJCQlZID0gMTE2MCAqICggc3JjWzBdICsgKCBDciAvIDIgKSAtIDE2ICk7CisKKwkJCWlmICggaSAmIDEgKSB7CisJCQkJaW50IEN0ID0gQ3I7CisJCQkJQ3IgPSBDYjsKKwkJCQlDYiA9IEN0OworCQkJfQorCisJCQlpZiAoICggeCBeIGkgKSAmIDEgKSB7CisJCQkJQ3IgPSAtQ3I7CisJCQkJQ2IgPSAtQ2I7CisJCQl9CisKKwkJCXJnYlswXSA9IGNsYW1wKCAoICggWSArICggMjAxNyAqIENiICkgKSArCisJCQkJCTUwMCApIC8gOTAwLCAwLCAyNTUgKTsKKwkJCXJnYlsxXSA9IGNsYW1wKCAoICggWSAtICggMzkyICogQ2IgKSAtCisJCQkJCSAgKCA4MTMgKiBDciApICkgKworCQkJCQkgIDUwMCApIC8gMTAwMCwgMCwgMjU1ICk7CisJCQlyZ2JbMl0gPSBjbGFtcCggKCAoIFkgKyAoIDE1OTQgKiBDciApICkgKworCQkJCQk1MDAgKSAvIDEzMDAsIDAsIDI1NSApOworCisJCQlwcmV2WCA9IC0xOworCQl9CisKKwkJcHJldlkgPSAtNTEyOworCX0KK30KKworc3RhdGljIHZvaWQKK3JlYWRfZnJhbWUoc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWVudW0pCit7CisJdW5zaWduZWQgY2hhciAqcmVxdWVzdCA9IGNhbS0+Y250cmxidWY7CisJaW50IHJlYWxTaHV0dGVyOworCWludCBuOworCWludCBhY3R1YWxfbGVuZ3RoOworCisJaWYgKGNhbS0+bmVlZHNEdW1teVJlYWQpIHsKKwkJY2FtLT5uZWVkc0R1bW15UmVhZCA9IDA7CisJCXJlYWRfZnJhbWUoY2FtLCBmcmFtZW51bSk7CisJfQorCisJbWVtc2V0KHJlcXVlc3QsIDAsIDE2KTsKKwlyZXF1ZXN0WzBdID0gY2FtLT5nYWluOwkvLyAwID0gMCUgZ2FpbiwgRkYgPSAxMDAlIGdhaW4KKworCXJlcXVlc3RbMV0gPSAwOwkvLyA1MTJ4MjQyIGNhcHR1cmUKKworCXJlcXVlc3RbMl0gPSAweDkwOwkvLyB0aGUgZnVuY3Rpb24gb2YgdGhlc2UgdHdvIGJ5dGVzCisJcmVxdWVzdFszXSA9IDB4MDc7CS8vIGlzIG5vdCB5ZXQgdW5kZXJzdG9vZAorCisJaWYgKGNhbS0+c2h1dHRlcl9zcGVlZCA+IDYwKSB7CisJCS8vIFNob3J0IGV4cG9zdXJlCisJCXJlYWxTaHV0dGVyID0KKwkJICAgICgoLTE1NjMxOTAwIC8gY2FtLT5zaHV0dGVyX3NwZWVkKSArIDI2MDUzMykgLyAxMDAwOworCQlyZXF1ZXN0WzRdID0gcmVhbFNodXR0ZXIgJiAweEZGOworCQlyZXF1ZXN0WzVdID0gKHJlYWxTaHV0dGVyID4+IDgpICYgMHhGRjsKKwkJcmVxdWVzdFs2XSA9IDB4MDM7CisJCXJlcXVlc3RbN10gPSAweDAxOworCX0gZWxzZSB7CisJCS8vIExvbmcgZXhwb3N1cmUKKwkJcmVhbFNodXR0ZXIgPSAxNTYwMCAvIGNhbS0+c2h1dHRlcl9zcGVlZCAtIDE7CisJCXJlcXVlc3RbNF0gPSAwOworCQlyZXF1ZXN0WzVdID0gMDsKKwkJcmVxdWVzdFs2XSA9IHJlYWxTaHV0dGVyICYgMHhGRjsKKwkJcmVxdWVzdFs3XSA9IHJlYWxTaHV0dGVyID4+IDg7CisJfQorCisJLy8gUGVyIEpvaG4gTWFya3VzIEJq+HJuZGFsZW4sIGJ5dGUgYXQgaW5kZXggOCBjYXVzZXMgcHJvYmxlbXMgaWYgaXQgaXNuJ3QgMAorCXJlcXVlc3RbOF0gPSAwOworCS8vIGJ5dGVzIDktMTUgZG8gbm90IHNlZW0gdG8gYWZmZWN0IGV4cG9zdXJlIG9yIGltYWdlIHF1YWxpdHkKKworCWRvd24oJmNhbS0+Y2FtX2xvY2spOworCisJaWYgKCFjYW0tPnVkZXYpIHsKKwkJZ290byBkb25lOworCX0KKworCW4gPSBfX3NlbmRfY29udHJvbF9tc2coY2FtLCAweDUxLCAweDgwLCAwLCByZXF1ZXN0LCAxNik7CisKKwlpZiAobiA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiIFByb2JsZW0gc2VuZGluZyBmcmFtZSBjYXB0dXJlIGNvbnRyb2wgbWVzc2FnZSIpOworCQlnb3RvIGRvbmU7CisJfQorCisJbiA9IHVzYl9idWxrX21zZyhjYW0tPnVkZXYsCisJCQkgdXNiX3JjdmJ1bGtwaXBlKGNhbS0+dWRldiwgY2FtLT5idWxrRW5kcG9pbnQpLAorCQkJIGNhbS0+cmF3X2ltYWdlLAorCQkJIDUxMiAqIDI0MiArIDEyOCwgJmFjdHVhbF9sZW5ndGgsIDEwMDAwKTsKKworCWlmIChuIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlByb2JsZW0gZHVyaW5nIGJ1bGsgcmVhZCBvZiBmcmFtZSBkYXRhOiAlZFxuIiwKKwkJICAgICAgIG4pOworCX0KKworIGRvbmU6CisJdXAoJmNhbS0+Y2FtX2xvY2spOworfQorCitzdGF0aWMgc3NpemVfdAordmljYW1fcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zICkKK3sKKwlzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlEQkcoInJlYWQgJWQgYnl0ZXMuXG4iLCAoaW50KSBjb3VudCk7CisKKwlpZiAoKnBwb3MgPj0gVklDQU1fTUFYX0ZSQU1FX1NJWkUpIHsKKwkJKnBwb3MgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKnBwb3MgPT0gMCkgeworCQlyZWFkX2ZyYW1lKGNhbSwgMCk7CisJCXZpY2FtX2RlY29kZV9jb2xvcihjYW0tPnJhd19pbWFnZSwKKwkJCQkgICBjYW0tPmZyYW1lYnVmICsKKwkJCQkgICAwICogVklDQU1fTUFYX0ZSQU1FX1NJWkUpOworCX0KKworCWNvdW50ID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgVklDQU1fTUFYX0ZSQU1FX1NJWkUgLSAqcHBvcyk7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJmNhbS0+ZnJhbWVidWZbKnBwb3NdLCBjb3VudCkpIHsKKwkJY291bnQgPSAtRUZBVUxUOworCX0gZWxzZSB7CisJCSpwcG9zICs9IGNvdW50OworCX0KKworCWlmIChjb3VudCA9PSBWSUNBTV9NQVhfRlJBTUVfU0laRSkgeworCQkqcHBvcyA9IDA7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyBpbnQKK3ZpY2FtX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCS8vIFRPRE86IGFsbG9jYXRlIHRoZSByYXcgZnJhbWUgYnVmZmVyIGlmIG5lY2Vzc2FyeQorCXVuc2lnbmVkIGxvbmcgcGFnZSwgcG9zOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSAgPSB2bWEtPnZtX2VuZC12bWEtPnZtX3N0YXJ0OworCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghY2FtKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCURCRygidmljYW1fbW1hcDogJWxkXG4iLCBzaXplKTsKKworCS8qIFdlIGxldCBtbWFwIGFsbG9jYXRlIGFzIG11Y2ggYXMgaXQgd2FudHMgYmVjYXVzZSBMaW51eCB3YXMgYWRkaW5nIDIwNDggYnl0ZXMKKwkgKiB0byB0aGUgc2l6ZSB0aGUgYXBwbGljYXRpb24gcmVxdWVzdGVkIGZvciBtbWFwIGFuZCBpdCB3YXMgc2NyZXdpbmcgYXBwcyB1cC4KKwkgaWYgKHNpemUgPiBWSUNBTV9GUkFNRVMqVklDQU1fTUFYX0ZSQU1FX1NJWkUpCisJIHJldHVybiAtRUlOVkFMOworCSAqLworCisJcG9zID0gKHVuc2lnbmVkIGxvbmcpY2FtLT5mcmFtZWJ1ZjsKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkKKwkJCXJldHVybiAtRUFHQUlOOworCisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJZWxzZQorCQkJc2l6ZSA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFT19QUk9DX0ZTKQorCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp2aWNhbV9wcm9jX3Jvb3QgPSBOVUxMOworCitzdGF0aWMgaW50IHZpY2FtX3JlYWRfaGVscGVyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCWludCBjb3VudCwgaW50ICplb2YsIGludCB2YWx1ZSkKK3sKKwljaGFyICpvdXQgPSBwYWdlOworCWludCBsZW47CisKKwlvdXQgKz0gc3ByaW50ZihvdXQsICIlZCIsdmFsdWUpOworCisJbGVuID0gb3V0IC0gcGFnZTsKKwlsZW4gLT0gb2ZmOworCWlmIChsZW4gPCBjb3VudCkgeworCQkqZW9mID0gMTsKKwkJaWYgKGxlbiA8PSAwKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlCisJCWxlbiA9IGNvdW50OworCisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHZpY2FtX3JlYWRfcHJvY19zaHV0dGVyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHZpY2FtX3JlYWRfaGVscGVyKHBhZ2Usc3RhcnQsb2ZmLGNvdW50LGVvZiwKKwkJCQkoKHN0cnVjdCB2aWNhbV9jYW1lcmEgKilkYXRhKS0+c2h1dHRlcl9zcGVlZCk7Cit9CisKK3N0YXRpYyBpbnQgdmljYW1fcmVhZF9wcm9jX2dhaW4oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gdmljYW1fcmVhZF9oZWxwZXIocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLAorCQkJCSgoc3RydWN0IHZpY2FtX2NhbWVyYSAqKWRhdGEpLT5nYWluKTsKK30KKworc3RhdGljIGludAordmljYW1fd3JpdGVfcHJvY19zaHV0dGVyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJCQkgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwl1MTYgc3RtcDsKKwljaGFyIGtidWZbOF07CisJc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0gKHN0cnVjdCB2aWNhbV9jYW1lcmEgKikgZGF0YTsKKworCWlmIChjb3VudCA+IDYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN0bXAgPSAodTE2KSBzaW1wbGVfc3RydG91bChrYnVmLCBOVUxMLCAxMCk7CisJaWYgKHN0bXAgPCA0IHx8IHN0bXAgPiAzMjAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYW0tPnNodXR0ZXJfc3BlZWQgPSBzdG1wOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50Cit2aWNhbV93cml0ZV9wcm9jX2dhaW4oc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwl1MTYgZ3RtcDsKKwljaGFyIGtidWZbOF07CisKKwlzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSAoc3RydWN0IHZpY2FtX2NhbWVyYSAqKSBkYXRhOworCisJaWYgKGNvdW50ID4gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZ3RtcCA9ICh1MTYpIHNpbXBsZV9zdHJ0b3VsKGtidWYsIE5VTEwsIDEwKTsKKwlpZiAoZ3RtcCA+IDI1NSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FtLT5nYWluID0gZ3RtcDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQKK3ZpY2FtX2NyZWF0ZV9wcm9jX3Jvb3Qodm9pZCkKK3sKKwl2aWNhbV9wcm9jX3Jvb3QgPSBjcmVhdGVfcHJvY19lbnRyeSgidmlkZW8vdmljYW0iLCBTX0lGRElSLCAwKTsKKworCWlmICh2aWNhbV9wcm9jX3Jvb3QpCisJCXZpY2FtX3Byb2Nfcm9vdC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImNvdWxkIG5vdCBjcmVhdGUgL3Byb2MgZW50cnkgZm9yIHZpY2FtISIpOworfQorCitzdGF0aWMgdm9pZAordmljYW1fZGVzdHJveV9wcm9jX3Jvb3Qodm9pZCkKK3sKKwlpZiAodmljYW1fcHJvY19yb290KQorCQlyZW1vdmVfcHJvY19lbnRyeSgidmlkZW8vdmljYW0iLCAwKTsKK30KKworc3RhdGljIHZvaWQKK3ZpY2FtX2NyZWF0ZV9wcm9jX2VudHJ5KHN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSkKK3sKKwljaGFyIG5hbWVbNjRdOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworCisJREJHKEtFUk5fSU5GTyAidmljYW06IGNyZWF0aW5nIHByb2MgZW50cnlcbiIpOworCisJaWYgKCF2aWNhbV9wcm9jX3Jvb3QgfHwgIWNhbSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAidmljYW06IGNvdWxkIG5vdCBjcmVhdGUgcHJvYyBlbnRyeSwgJXMgcG9pbnRlciBpcyBudWxsLlxuIiwKKwkJICAgICAgICghY2FtID8gImNhbWVyYSIgOiAicm9vdCIpKTsKKwkJcmV0dXJuOworCX0KKworCXNwcmludGYobmFtZSwgInZpZGVvJWQiLCBjYW0tPnZkZXYubWlub3IpOworCisJY2FtLT5wcm9jX2RpciA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIFNfSUZESVIsIHZpY2FtX3Byb2Nfcm9vdCk7CisKKwlpZiAoICFjYW0tPnByb2NfZGlyICkKKwkJcmV0dXJuOyAvLyBGSVhNRTogV2Ugc2hvdWxkIHByb2JhYmx5IHJldHVybiBhbiBlcnJvciBoZXJlCisJCisJZW50ID0gY3JlYXRlX3Byb2NfZW50cnkoInNodXR0ZXIiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkJY2FtLT5wcm9jX2Rpcik7CisJaWYgKGVudCkgeworCQllbnQtPmRhdGEgPSBjYW07CisJCWVudC0+cmVhZF9wcm9jID0gdmljYW1fcmVhZF9wcm9jX3NodXR0ZXI7CisJCWVudC0+d3JpdGVfcHJvYyA9IHZpY2FtX3dyaXRlX3Byb2Nfc2h1dHRlcjsKKwkJZW50LT5zaXplID0gNjQ7CisJfQorCisJZW50ID0gY3JlYXRlX3Byb2NfZW50cnkoImdhaW4iLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkJY2FtLT5wcm9jX2Rpcik7CisJaWYgKGVudCkgeworCQllbnQtPmRhdGEgPSBjYW07CisJCWVudC0+cmVhZF9wcm9jID0gdmljYW1fcmVhZF9wcm9jX2dhaW47CisJCWVudC0+d3JpdGVfcHJvYyA9IHZpY2FtX3dyaXRlX3Byb2NfZ2FpbjsKKwkJZW50LT5zaXplID0gNjQ7CisJfQorfQorCitzdGF0aWMgdm9pZAordmljYW1fZGVzdHJveV9wcm9jX2VudHJ5KHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0gPSAoc3RydWN0IHZpY2FtX2NhbWVyYSAqKSBwdHI7CisJY2hhciBuYW1lWzE2XTsKKworCWlmICggIWNhbS0+cHJvY19kaXIgKQorCQlyZXR1cm47CisKKwlzcHJpbnRmKG5hbWUsICJ2aWRlbyVkIiwgY2FtLT52ZGV2Lm1pbm9yKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgic2h1dHRlciIsIGNhbS0+cHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJnYWluIiwgY2FtLT5wcm9jX2Rpcik7CisJcmVtb3ZlX3Byb2NfZW50cnkobmFtZSx2aWNhbV9wcm9jX3Jvb3QpOworCWNhbS0+cHJvY19kaXIgPSBOVUxMOworCit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdmljYW1fY3JlYXRlX3Byb2Nfcm9vdCh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB2aWNhbV9kZXN0cm95X3Byb2Nfcm9vdCh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB2aWNhbV9jcmVhdGVfcHJvY19lbnRyeShzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW0pIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHZpY2FtX2Rlc3Ryb3lfcHJvY19lbnRyeSh2b2lkICpwdHIpIHsgfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpY2FtX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHZpY2FtX29wZW4sCisJLnJlbGVhc2UJPSB2aWNhbV9jbG9zZSwKKwkucmVhZAkJPSB2aWNhbV9yZWFkLAorCS5tbWFwCQk9IHZpY2FtX21tYXAsCisJLmlvY3RsCQk9IHZpY2FtX2lvY3RsLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdmljYW1fdGVtcGxhdGUgPSB7CisJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKKwkubmFtZSAJCT0gIlZpQ2FtLWJhc2VkIFVTQiBDYW1lcmEiLAorCS50eXBlIAkJPSBWSURfVFlQRV9DQVBUVVJFLAorCS5oYXJkd2FyZSAJPSBWSURfSEFSRFdBUkVfVklDQU0sCisJLmZvcHMgCQk9ICZ2aWNhbV9mb3BzLAorCS5taW5vciAJCT0gLTEsCit9OworCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdmljYW1fdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRShVU0JfVklDQU1fVkVORE9SX0lELCBVU0JfVklDQU1fUFJPRFVDVF9JRCl9LAorCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB2aWNhbV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB2aWNhbV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ2aWNhbSIsCisJLnByb2JlCQk9IHZpY2FtX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gdmljYW1fZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSB2aWNhbV90YWJsZQorfTsKKworLyoqCisgKgl2aWNhbV9wcm9iZQorICoJQGludGY6IHRoZSBpbnRlcmZhY2UKKyAqCUBpZDogdGhlIGRldmljZSBpZAorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiBhIG5ldyBkZXZpY2UgaXMgY29ubmVjdGVkIHRoYXQgaXQgdGhpbmtzCisgKgl0aGlzIGRyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluLgorICovCitzdGF0aWMgaW50Cit2aWNhbV9wcm9iZSggc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQgYnVsa0VuZHBvaW50ID0gMDsKKwljb25zdCBzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwlzdHJ1Y3QgdmljYW1fY2FtZXJhICpjYW07CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiVmlDYW0gYmFzZWQgd2ViY2FtIGNvbm5lY3RlZFxuIik7CisKKwlpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCURCRyhLRVJOX0RFQlVHICJJbnRlcmZhY2UgJWQuIGhhcyAldS4gZW5kcG9pbnRzIVxuIiwKKwkgICAgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsICh1bnNpZ25lZCkgKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzKSk7CisJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOworCisJaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApICYmCisJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpID09IDB4MDIpKSB7CisJCS8qIHdlIGZvdW5kIGEgYnVsayBpbiBlbmRwb2ludCAqLworCQlidWxrRW5kcG9pbnQgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJObyBidWxrIGluIGVuZHBvaW50IHdhcyBmb3VuZCA/ISAodGhpcyBpcyBiYWQpXG4iKTsKKwl9CisKKwlpZiAoKGNhbSA9CisJICAgICBrbWFsbG9jKHNpemVvZiAoc3RydWN0IHZpY2FtX2NhbWVyYSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJjb3VsZCBub3QgYWxsb2NhdGUga2VybmVsIG1lbW9yeSBmb3IgdmljYW1fY2FtZXJhIHN0cnVjdFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChjYW0sIDAsIHNpemVvZiAoc3RydWN0IHZpY2FtX2NhbWVyYSkpOworCisJY2FtLT5zaHV0dGVyX3NwZWVkID0gMTU7CisKKwlpbml0X01VVEVYKCZjYW0tPmNhbV9sb2NrKTsKKworCW1lbWNweSgmY2FtLT52ZGV2LCAmdmljYW1fdGVtcGxhdGUsCisJICAgICAgIHNpemVvZiAodmljYW1fdGVtcGxhdGUpKTsKKwljYW0tPnZkZXYucHJpdiA9IGNhbTsJLy8gc29ydCBvZiBhIHJldmVyc2UgbWFwcGluZyBmb3IgdGhvc2UgZnVuY3Rpb25zIHRoYXQgZ2V0IHZkZXYgb25seQorCisJY2FtLT51ZGV2ID0gZGV2OworCWNhbS0+YnVsa0VuZHBvaW50ID0gYnVsa0VuZHBvaW50OworCisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmY2FtLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSkgPT0gLTEpIHsKKwkJa2ZyZWUoY2FtKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXZpY2FtX2NyZWF0ZV9wcm9jX2VudHJ5KGNhbSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJWaUNhbSB3ZWJjYW0gZHJpdmVyIG5vdyBjb250cm9sbGluZyB2aWRlbyBkZXZpY2UgJWRcbiIsY2FtLT52ZGV2Lm1pbm9yKTsKKworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIGNhbSk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit2aWNhbV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCWludCBvcGVuX2NvdW50OworCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOworCisJLyogd2UgbXVzdCB1bnJlZ2lzdGVyIHRoZSBkZXZpY2UgYmVmb3JlIHRha2luZyBpdHMKKwkgKiBjYW1fbG9jay4gVGhpcyBpcyBiZWNhdXNlIHRoZSB2aWRlbyBvcGVuIGNhbGwKKwkgKiBob2xkcyB0aGUgc2FtZSBsb2NrIGFzIHZpZGVvIHVucmVnaXN0ZXIuIGlmIHdlCisJICogdW5yZWdpc3RlciBpbnNpZGUgb2YgdGhlIGNhbV9sb2NrIGFuZCBvcGVuIGFsc28KKwkgKiB1c2VzIHRoZSBjYW1fbG9jaywgd2UgZ2V0IGRlYWRsb2NrLgorCSAqLworCisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+dmRldik7CisKKwkvKiBzdG9wIHRoZSBjYW1lcmEgZnJvbSBiZWluZyB1c2VkICovCisKKwlkb3duKCZjYW0tPmNhbV9sb2NrKTsKKworCS8qIG1hcmsgdGhlIGNhbWVyYSBhcyBnb25lICovCisKKwljYW0tPnVkZXYgPSBOVUxMOworCisJdmljYW1fZGVzdHJveV9wcm9jX2VudHJ5KGNhbSk7CisKKwkvKiB0aGUgb25seSB0aGluZyBsZWZ0IHRvIGRvIGlzIHN5bmNocm9uaXplIHdpdGgKKwkgKiBvdXIgY2xvc2UvcmVsZWFzZSBmdW5jdGlvbiBvbiB3aG8gc2hvdWxkIHJlbGVhc2UKKwkgKiB0aGUgY2FtZXJhIG1lbW9yeS4gaWYgdGhlcmUgYXJlIGFueSB1c2VycyB1c2luZyB0aGUKKwkgKiBjYW1lcmEsIGl0J3MgdGhlaXIgam9iLiBpZiB0aGVyZSBhcmUgbm8gdXNlcnMsCisJICogaXQncyBvdXJzLgorCSAqLworCisJb3Blbl9jb3VudCA9IGNhbS0+b3Blbl9jb3VudDsKKworCXVwKCZjYW0tPmNhbV9sb2NrKTsKKworCWlmICghb3Blbl9jb3VudCkgeworCQlrZnJlZShjYW0pOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJWaUNhbS1iYXNlZCBXZWJDYW0gZGlzY29ubmVjdGVkXG4iKTsKK30KKworLyoKKyAqLworc3RhdGljIGludCBfX2luaXQKK3VzYl92aWNhbV9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKwlEQkcoS0VSTl9JTkZPICJWaUNhbS1iYXNlZCBXZWJDYW0gZHJpdmVyIHN0YXJ0dXBcbiIpOworCXZpY2FtX2NyZWF0ZV9wcm9jX3Jvb3QoKTsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnZpY2FtX2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidXNiX3JlZ2lzdGVyIGZhaWxlZCFcbiIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAordXNiX3ZpY2FtX2V4aXQodm9pZCkKK3sKKwlEQkcoS0VSTl9JTkZPCisJICAgICAgICJWaUNhbS1iYXNlZCBXZWJDYW0gZHJpdmVyIHNodXRkb3duXG4iKTsKKworCXVzYl9kZXJlZ2lzdGVyKCZ2aWNhbV9kcml2ZXIpOworCXZpY2FtX2Rlc3Ryb3lfcHJvY19yb290KCk7Cit9CisKK21vZHVsZV9pbml0KHVzYl92aWNhbV9pbml0KTsKK21vZHVsZV9leGl0KHVzYl92aWNhbV9leGl0KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5ZTc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3c5OTY4Y2YuYwpAQCAtMCwwICsxLDM4MjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZpZGVvNExpbnV4IGRyaXZlciBmb3IgVzk5Nls4N11DRiBKUEVHIFVTQiBEdWFsIE1vZGUgQ2FtZXJhIENoaXAuICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIC0gTWVtb3J5IG1hbmFnZW1lbnQgY29kZSBmcm9tIGJ0dHYgZHJpdmVyIGJ5IFJhbHBoIE1ldHpsZXIsICAgICAgICAgICAgICoKKyAqICAgTWFyY3VzIE1ldHpsZXIgYW5kIEdlcmQgS25vcnIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIC0gSTJDIGludGVyZmFjZSB0byBrZXJuZWwsIGhpZ2gtbGV2ZWwgaW1hZ2Ugc2Vuc29yIGNvbnRyb2wgcm91dGluZXMgYW5kICoKKyAqICAgc29tZSBzeW1ib2xpYyBuYW1lcyBmcm9tIE9WNTExIGRyaXZlciBieSBNYXJrIFcuIE1jQ2xlbGxhbmQuICAgICAgICAgICoKKyAqIC0gTG93LWxldmVsIEkyQyBmYXN0IHdyaXRlIGZ1bmN0aW9uIGJ5IFBpb3RyIEN6ZXJjemFrLiAgICAgICAgICAgICAgICAgICoKKyAqIC0gTG93LWxldmVsIEkyQyByZWFkIGZ1bmN0aW9uIGJ5IEZyZWRlcmljIEpvdWF1bHQuICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgInc5OTY4Y2YuaCIKKyNpbmNsdWRlICJ3OTk2OGNmX2RlY29kZXIuaCIKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2R1bGUgbWFjcm9zIGFuZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB3aW5ib25kX2lkX3RhYmxlKTsKKworTU9EVUxFX0FVVEhPUihXOTk2OENGX01PRFVMRV9BVVRIT1IiICJXOTk2OENGX0FVVEhPUl9FTUFJTCk7CitNT0RVTEVfREVTQ1JJUFRJT04oVzk5NjhDRl9NT0RVTEVfTkFNRSk7CitNT0RVTEVfVkVSU0lPTihXOTk2OENGX01PRFVMRV9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKFc5OTY4Q0ZfTU9EVUxFX0xJQ0VOU0UpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIlZpZGVvIik7CisKK3N0YXRpYyBpbnQgb3Ztb2RfbG9hZCA9IFc5OTY4Q0ZfT1ZNT0RfTE9BRDsKK3N0YXRpYyBpbnQgdnBwbW9kX2xvYWQgPSBXOTk2OENGX1ZQUE1PRF9MT0FEOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNpbWNhbXMgPSBXOTk2OENGX1NJTUNBTVM7CitzdGF0aWMgc2hvcnQgdmlkZW9fbnJbXT17WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSAtMX07IC8qLTE9Zmlyc3QgZnJlZSovCitzdGF0aWMgdW5zaWduZWQgaW50IHBhY2tldF9zaXplW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXOTk2OENGX1BBQ0tFVF9TSVpFfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtYXhfYnVmZmVyc1tdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXOTk2OENGX0JVRkZFUlN9Oworc3RhdGljIGludCBkb3VibGVfYnVmZmVyW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFc5OTY4Q0ZfRE9VQkxFX0JVRkZFUn07CitzdGF0aWMgaW50IGNsYW1waW5nW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0NMQU1QSU5HfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmaWx0ZXJfdHlwZVtdPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVzk5NjhDRl9GSUxURVJfVFlQRX07CitzdGF0aWMgaW50IGxhcmdldmlld1tdPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0xBUkdFVklFV307CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZGVjb21wcmVzc2lvbltdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFc5OTY4Q0ZfREVDT01QUkVTU0lPTn07CitzdGF0aWMgaW50IHVwc2NhbGluZ1tdPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX1VQU0NBTElOR307CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfcGFsZXR0ZVtdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gMH07CitzdGF0aWMgaW50IGZvcmNlX3JnYltdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9GT1JDRV9SR0J9Oworc3RhdGljIGludCBhdXRvYnJpZ2h0W10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0FVVE9CUklHSFR9Oworc3RhdGljIGludCBhdXRvZXhwW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0FVVE9FWFB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGxpZ2h0ZnJlcVtdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVzk5NjhDRl9MSUdIVEZSRVF9Oworc3RhdGljIGludCBiYW5kaW5nZmlsdGVyW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXOTk2OENGX0JBTkRJTkdGSUxURVJ9Oworc3RhdGljIHNob3J0IGNsb2NrZGl2W10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0NMT0NLRElWfTsKK3N0YXRpYyBpbnQgYmFja2xpZ2h0W10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV0gPSBXOTk2OENGX0JBQ0tMSUdIVH07CitzdGF0aWMgaW50IG1pcnJvcltdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9NSVJST1J9Oworc3RhdGljIGludCBtb25vY2hyb21lW10gPSB7WzAgLi4uIFc5OTY4Q0ZfTUFYX0RFVklDRVMtMV09Vzk5NjhDRl9NT05PQ0hST01FfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzc1tdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXOTk2OENGX0JSSUdIVE5FU1N9Oworc3RhdGljIHVuc2lnbmVkIGludCBodWVbXSA9IHtbMCAuLi4gVzk5NjhDRl9NQVhfREVWSUNFUy0xXSA9IFc5OTY4Q0ZfSFVFfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29sb3VyW109e1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gVzk5NjhDRl9DT0xPVVJ9Oworc3RhdGljIHVuc2lnbmVkIGludCBjb250cmFzdFtdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVzk5NjhDRl9DT05UUkFTVH07CitzdGF0aWMgdW5zaWduZWQgaW50IHdoaXRlbmVzc1tdID0ge1swIC4uLiBXOTk2OENGX01BWF9ERVZJQ0VTLTFdID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFc5OTY4Q0ZfV0hJVEVORVNTfTsKKyNpZmRlZiBXOTk2OENGX0RFQlVHCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZGVidWcgPSBXOTk2OENGX0RFQlVHX0xFVkVMOworc3RhdGljIGludCBzcGVjaWZpY19kZWJ1ZyA9IFc5OTY4Q0ZfU1BFQ0lGSUNfREVCVUc7CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGludCBwYXJhbV9udlsyNF07IC8qIG51bWJlciBvZiB2YWx1ZXMgcGVyIHBhcmFtZXRlciAqLworCisjaWZkZWYgQ09ORklHX0tNT0QKK21vZHVsZV9wYXJhbShvdm1vZF9sb2FkLCBib29sLCAwNjQ0KTsKK21vZHVsZV9wYXJhbSh2cHBtb2RfbG9hZCwgYm9vbCwgMDQ0NCk7CisjZW5kaWYKK21vZHVsZV9wYXJhbShzaW1jYW1zLCB1c2hvcnQsIDA2NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KHZpZGVvX25yLCBzaG9ydCwgJnBhcmFtX252WzBdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShwYWNrZXRfc2l6ZSwgdWludCwgJnBhcmFtX252WzFdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShtYXhfYnVmZmVycywgdXNob3J0LCAmcGFyYW1fbnZbMl0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGRvdWJsZV9idWZmZXIsIGJvb2wsICZwYXJhbV9udlszXSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoY2xhbXBpbmcsIGJvb2wsICZwYXJhbV9udls0XSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZmlsdGVyX3R5cGUsIHVzaG9ydCwgJnBhcmFtX252WzVdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShsYXJnZXZpZXcsIGJvb2wsICZwYXJhbV9udls2XSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZGVjb21wcmVzc2lvbiwgdXNob3J0LCAmcGFyYW1fbnZbN10sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KHVwc2NhbGluZywgYm9vbCwgJnBhcmFtX252WzhdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShmb3JjZV9wYWxldHRlLCB1c2hvcnQsICZwYXJhbV9udls5XSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZm9yY2VfcmdiLCB1c2hvcnQsICZwYXJhbV9udlsxMF0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGF1dG9icmlnaHQsIGJvb2wsICZwYXJhbV9udlsxMV0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGF1dG9leHAsIGJvb2wsICZwYXJhbV9udlsxMl0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGxpZ2h0ZnJlcSwgdXNob3J0LCAmcGFyYW1fbnZbMTNdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShiYW5kaW5nZmlsdGVyLCBib29sLCAmcGFyYW1fbnZbMTRdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShjbG9ja2Rpdiwgc2hvcnQsICZwYXJhbV9udlsxNV0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGJhY2tsaWdodCwgYm9vbCwgJnBhcmFtX252WzE2XSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWlycm9yLCBib29sLCAmcGFyYW1fbnZbMTddLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShtb25vY2hyb21lLCBib29sLCAmcGFyYW1fbnZbMThdLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShicmlnaHRuZXNzLCB1aW50LCAmcGFyYW1fbnZbMTldLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShodWUsIHVpbnQsICZwYXJhbV9udlsyMF0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGNvbG91ciwgdWludCwgJnBhcmFtX252WzIxXSwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoY29udHJhc3QsIHVpbnQsICZwYXJhbV9udlsyMl0sIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KHdoaXRlbmVzcywgdWludCwgJnBhcmFtX252WzIzXSwgMDQ0NCk7CisjaWZkZWYgVzk5NjhDRl9ERUJVRworbW9kdWxlX3BhcmFtKGRlYnVnLCB1c2hvcnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKHNwZWNpZmljX2RlYnVnLCBib29sLCAwNjQ0KTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0tNT0QKK01PRFVMRV9QQVJNX0RFU0Mob3Ztb2RfbG9hZCwgCisgICAgICAgICAgICAgICAgICJcbjwwfDE+IEF1dG9tYXRpYyAnb3ZjYW1jaGlwJyBtb2R1bGUgbG9hZGluZy4iCisgICAgICAgICAgICAgICAgICJcbjAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCisgICAgICAgICAgICAgICAgICJcbklmIGVuYWJsZWQsJ2luc21vZCcgc2VhcmNoZXMgZm9yIHRoZSByZXF1aXJlZCAnb3ZjYW1jaGlwJyIKKyAgICAgICAgICAgICAgICAgIlxubW9kdWxlIGluIHRoZSBzeXN0ZW0sIGFjY29yZGluZyB0byBpdHMgY29uZmlndXJhdGlvbiwgYW5kIgorICAgICAgICAgICAgICAgICAiXG5hdHRlbXB0cyB0byBsb2FkIHRoYXQgbW9kdWxlIGF1dG9tYXRpY2FsbHkuIFRoaXMgYWN0aW9uIGlzIgorICAgICAgICAgICAgICAgICAiXG5wZXJmb3JtZWQgb25jZSBhcyBzb29uIGFzIHRoZSAndzk5NjhjZicgbW9kdWxlIGlzIGxvYWRlZCIKKyAgICAgICAgICAgICAgICAgIlxuaW50byBtZW1vcnkuIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9PVk1PRF9MT0FEKSIuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0ModnBwbW9kX2xvYWQsIAorICAgICAgICAgICAgICAgICAiXG48MHwxPiBBdXRvbWF0aWMgJ3c5OTY4Y2YtdnBwJyBtb2R1bGUgbG9hZGluZy4iCisgICAgICAgICAgICAgICAgICJcbjAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCisgICAgICAgICAgICAgICAgICJcbklmIGVuYWJsZWQsIGV2ZXJ5IHRpbWUgYW4gYXBwbGljYXRpb24gYXR0ZW1wdHMgdG8gb3BlbiBhIgorICAgICAgICAgICAgICAgICAiXG5jYW1lcmEsICdpbnNtb2QnIHNlYXJjaGVzIGZvciB0aGUgdmlkZW8gcG9zdC1wcm9jZXNzaW5nIgorICAgICAgICAgICAgICAgICAiXG5tb2R1bGUgaW4gdGhlIHN5c3RlbSBhbmQgbG9hZHMgaXQgYXV0b21hdGljYWxseSAoaWYiCisgICAgICAgICAgICAgICAgICJcbnByZXNlbnQpLiBUaGUgb3B0aW9uYWwgJ3c5OTY4Y2YtdnBwJyBtb2R1bGUgYWRkcyBleHRyYSIKKyAgICAgICAgICAgICAgICAgIlxuIGltYWdlIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgdG8gdGhlICd3OTk2OGNmJyBtb2R1bGUsbGlrZSIKKyAgICAgICAgICAgICAgICAgIlxuc29mdHdhcmUgdXAtc2NhbGluZyxjb2xvdXIgY29udmVyc2lvbnMgYW5kIHZpZGVvIGRlY29kaW5nIgorICAgICAgICAgICAgICAgICAiXG5mb3IgdmVyeSBoaWdoIGZyYW1lIHJhdGVzLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfVlBQTU9EX0xPQUQpIi4iCisgICAgICAgICAgICAgICAgICJcbiIpOworI2VuZGlmCitNT0RVTEVfUEFSTV9ERVNDKHNpbWNhbXMsIAorICAgICAgICAgICAgICAgICAiXG48bj4gTnVtYmVyIG9mIGNhbWVyYXMgYWxsb3dlZCB0byBzdHJlYW0gc2ltdWx0YW5lb3VzbHkuIgorICAgICAgICAgICAgICAgICAiXG5uIG1heSB2YXJ5IGZyb20gMCB0byAiCisgICAgICAgICAgICAgICAgIF9fTU9EVUxFX1NUUklORyhXOTk2OENGX01BWF9ERVZJQ0VTKSIuIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9TSU1DQU1TKSIuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsCisgICAgICAgICAgICAgICAgICJcbjwtMXxuWywuLi5dPiBTcGVjaWZ5IFY0TCBtaW5vciBtb2RlIG51bWJlci4iCisgICAgICAgICAgICAgICAgICJcbiAtMSA9IHVzZSBuZXh0IGF2YWlsYWJsZSAoZGVmYXVsdCkiCisgICAgICAgICAgICAgICAgICJcbiAgbiA9IHVzZSBtaW5vciBudW1iZXIgbiAoaW50ZWdlciA+PSAwKSIKKyAgICAgICAgICAgICAgICAgIlxuWW91IGNhbiBzcGVjaWZ5IHVwIHRvICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9NQVhfREVWSUNFUykKKyAgICAgICAgICAgICAgICAgIiBjYW1lcmFzIHRoaXMgd2F5LiIKKyAgICAgICAgICAgICAgICAgIlxuRm9yIGV4YW1wbGU6IgorICAgICAgICAgICAgICAgICAiXG52aWRlb19ucj0tMSwyLC0xIHdvdWxkIGFzc2lnbiBtaW5vciBudW1iZXIgMiB0byIKKyAgICAgICAgICAgICAgICAgIlxudGhlIHNlY29uZCBjYW1lcmEgYW5kIHVzZSBhdXRvIGZvciB0aGUgZmlyc3QiCisgICAgICAgICAgICAgICAgICJcbm9uZSBhbmQgZm9yIGV2ZXJ5IG90aGVyIGNhbWVyYS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhwYWNrZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgIlxuPG5bLC4uLl0+IFNwZWNpZnkgdGhlIG1heGltdW0gZGF0YSBwYXlsb2FkIgorICAgICAgICAgICAgICAgICAiXG5zaXplIGluIGJ5dGVzIGZvciBhbHRlcm5hdGUgc2V0dGluZ3MsIGZvciBlYWNoIGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbm4gaXMgc2NhbGVkIGJldHdlZW4gNjMgYW5kIDEwMjMgIgorICAgICAgICAgICAgICAgICAiKGRlZmF1bHQgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX1BBQ0tFVF9TSVpFKSIpLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9idWZmZXJzLAorICAgICAgICAgICAgICAgICAiXG48blssLi4uXT4gRm9yIGFkdmFuY2VkIHVzZXJzLiIKKyAgICAgICAgICAgICAgICAgIlxuU3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdmlkZW8gZnJhbWUgYnVmZmVycyIKKyAgICAgICAgICAgICAgICAgIlxudG8gYWxsb2NhdGUgZm9yIGVhY2ggZGV2aWNlLCBmcm9tIDIgdG8gIgorICAgICAgICAgICAgICAgICBfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9NQVhfQlVGRkVSUykKKyAgICAgICAgICAgICAgICAgIi4gKGRlZmF1bHQgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0JVRkZFUlMpIikuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZG91YmxlX2J1ZmZlciwgCisgICAgICAgICAgICAgICAgICJcbjwwfDFbLC4uLl0+ICIKKyAgICAgICAgICAgICAgICAgIkhhcmR3YXJlIGRvdWJsZSBidWZmZXJpbmc6IDAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCisgICAgICAgICAgICAgICAgICJcbkl0IHNob3VsZCBiZSBlbmFibGVkIGlmIHlvdSB3YW50IHNtb290aCB2aWRlbyBvdXRwdXQ6IGlmIgorICAgICAgICAgICAgICAgICAiXG55b3Ugb2J0YWluIG91dCBvZiBzeW5jLiB2aWRlbywgZGlzYWJsZSBpdCwgb3IgdHJ5IHRvIgorICAgICAgICAgICAgICAgICAiXG5kZWNyZWFzZSB0aGUgJ2Nsb2NrZGl2JyBtb2R1bGUgcGFyYW1ldGVyIHZhbHVlLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfRE9VQkxFX0JVRkZFUikKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGNsYW1waW5nLCAKKyAgICAgICAgICAgICAgICAgIlxuPDB8MVssLi4uXT4gVmlkZW8gZGF0YSBjbGFtcGluZzogMCBkaXNhYmxlZCwgMSBlbmFibGVkLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfQ0xBTVBJTkcpCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhmaWx0ZXJfdHlwZSwgCisgICAgICAgICAgICAgICAgICJcbjwwfDF8MlssLi4uXT4gVmlkZW8gZmlsdGVyIHR5cGUuIgorICAgICAgICAgICAgICAgICAiXG4wIG5vbmUsIDEgKDEtMi0xKSAzLXRhcCBmaWx0ZXIsICIKKyAgICAgICAgICAgICAgICAgIjIgKDItMy02LTMtMikgNS10YXAgZmlsdGVyLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfRklMVEVSX1RZUEUpCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcblRoZSBmaWx0ZXIgaXMgdXNlZCB0byByZWR1Y2Ugbm9pc2UgYW5kIGFsaWFzaW5nIGFydGlmYWN0cyIKKyAgICAgICAgICAgICAgICAgIlxucHJvZHVjZWQgYnkgdGhlIENDRCBvciBDTU9TIGltYWdlIHNlbnNvciwgYW5kIHRoZSBzY2FsaW5nIgorICAgICAgICAgICAgICAgICAiIHByb2Nlc3MuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MobGFyZ2V2aWV3LCAKKyAgICAgICAgICAgICAgICAgIlxuPDB8MVssLi4uXT4gTGFyZ2UgdmlldzogMCBkaXNhYmxlZCwgMSBlbmFibGVkLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfTEFSR0VWSUVXKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0ModXBzY2FsaW5nLCAKKyAgICAgICAgICAgICAgICAgIlxuPDB8MVssLi4uXT4gU29mdHdhcmUgc2NhbGluZyAoZm9yIG5vbi1jb21wcmVzc2VkIHZpZGVvKToiCisgICAgICAgICAgICAgICAgICJcbjAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCisgICAgICAgICAgICAgICAgICJcbkRpc2FibGUgaXQgaWYgeW91IGhhdmUgYSBzbG93IENQVSBvciB5b3UgZG9uJ3QgaGF2ZSIKKyAgICAgICAgICAgICAgICAgIiBlbm91Z2ggbWVtb3J5LiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfVVBTQ0FMSU5HKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG5JZiAndzk5NjhjZi12cHAnIGlzIG5vdCBwcmVzZW50LCB0aGlzIHBhcmFtZXRlciBpcyIKKyAgICAgICAgICAgICAgICAgIiBzZXQgdG8gMC4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhkZWNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAiXG48MHwxfDJbLC4uLl0+IFNvZnR3YXJlIHZpZGVvIGRlY29tcHJlc3Npb246IgorICAgICAgICAgICAgICAgICAiXG4tIDAgZGlzYWJsZXMgZGVjb21wcmVzc2lvbiAoZG9lc24ndCBhbGxvdyBmb3JtYXRzIG5lZWRpbmciCisgICAgICAgICAgICAgICAgICIgZGVjb21wcmVzc2lvbikiCisgICAgICAgICAgICAgICAgICJcbi0gMSBmb3JjZXMgZGVjb21wcmVzc2lvbiAoYWxsb3dzIGZvcm1hdHMgbmVlZGluZyIKKyAgICAgICAgICAgICAgICAgIiBkZWNvbXByZXNzaW9uIG9ubHkpOyIKKyAgICAgICAgICAgICAgICAgIlxuLSAyIGFsbG93cyBhbnkgcGVybWl0dGVkIGZvcm1hdHMuIgorICAgICAgICAgICAgICAgICAiXG5Gb3JtYXRzIHN1cHBvcnRpbmcgY29tcHJlc3NlZCB2aWRlbyBhcmUgWVVWNDIyUCBhbmQiCisgICAgICAgICAgICAgICAgICIgWVVWNDIwUC9ZVVY0MjAgIgorICAgICAgICAgICAgICAgICAiXG5pbiBhbnkgcmVzb2x1dGlvbnMgd2hlcmUgYm90aCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSAiCisgICAgICAgICAgICAgICAgICJhIG11bHRpcGxlIG9mIDE2LiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfREVDT01QUkVTU0lPTikKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuSWYgJ3c5OTY4Y2YtdnBwJyBpcyBub3QgcHJlc2VudCwgZm9yY2luZyBkZWNvbXByZXNzaW9uIGlzICIKKyAgICAgICAgICAgICAgICAgIlxubm90IGFsbG93ZWQ7IGluIHRoaXMgY2FzZSB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gMi4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9wYWxldHRlLAorICAgICAgICAgICAgICAgICAiXG48MCIKKyAgICAgICAgICAgICAgICAgInwiIF9fTU9EVUxFX1NUUklORyhWSURFT19QQUxFVFRFX1VZVlkpCisgICAgICAgICAgICAgICAgICJ8IiBfX01PRFVMRV9TVFJJTkcoVklERU9fUEFMRVRURV9ZVVY0MjApCisgICAgICAgICAgICAgICAgICJ8IiBfX01PRFVMRV9TVFJJTkcoVklERU9fUEFMRVRURV9ZVVY0MjJQKQorICAgICAgICAgICAgICAgICAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfWVVWNDIwUCkKKyAgICAgICAgICAgICAgICAgInwiIF9fTU9EVUxFX1NUUklORyhWSURFT19QQUxFVFRFX1lVWVYpCisgICAgICAgICAgICAgICAgICJ8IiBfX01PRFVMRV9TVFJJTkcoVklERU9fUEFMRVRURV9ZVVY0MjIpCisgICAgICAgICAgICAgICAgICJ8IiBfX01PRFVMRV9TVFJJTkcoVklERU9fUEFMRVRURV9HUkVZKQorICAgICAgICAgICAgICAgICAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfUkdCNTU1KQorICAgICAgICAgICAgICAgICAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfUkdCNTY1KQorICAgICAgICAgICAgICAgICAifCIgX19NT0RVTEVfU1RSSU5HKFZJREVPX1BBTEVUVEVfUkdCMjQpCisgICAgICAgICAgICAgICAgICJ8IiBfX01PRFVMRV9TVFJJTkcoVklERU9fUEFMRVRURV9SR0IzMikKKyAgICAgICAgICAgICAgICAgIlssLi4uXT4iCisgICAgICAgICAgICAgICAgICIgRm9yY2UgcGljdHVyZSBwYWxldHRlLiIKKyAgICAgICAgICAgICAgICAgIlxuSW4gb3JkZXI6IgorICAgICAgICAgICAgICAgICAiXG4tIDAgYWxsb3dzIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6IgorICAgICAgICAgICAgICAgICAiXG4tIFVZVlkgICAgMTYgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGRpc2FibGVkIgorICAgICAgICAgICAgICAgICAiXG4tIFlVVjQyMCAgMTIgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGVuYWJsZWQiCisgICAgICAgICAgICAgICAgICJcbi0gWVVWNDIyUCAxNiBicHAgLSBPcmlnaW5hbCB2aWRlbywgY29tcHJlc3Npb24gZW5hYmxlZCIKKyAgICAgICAgICAgICAgICAgIlxuLSBZVVY0MjBQIDEyIGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBlbmFibGVkIgorICAgICAgICAgICAgICAgICAiXG4tIFlVVlkgICAgMTYgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkiCisgICAgICAgICAgICAgICAgICJcbi0gWVVWNDIyICAxNiBicHAgLSBTb2Z0d2FyZSBjb252ZXJzaW9uIGZyb20gVVlWWSIKKyAgICAgICAgICAgICAgICAgIlxuLSBHUkVZICAgICA4IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgorICAgICAgICAgICAgICAgICAiXG4tIFJHQjU1NSAgMTYgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkiCisgICAgICAgICAgICAgICAgICJcbi0gUkdCNTY1ICAxNiBicHAgLSBTb2Z0d2FyZSBjb252ZXJzaW9uIGZyb20gVVlWWSIKKyAgICAgICAgICAgICAgICAgIlxuLSBSR0IyNCAgIDI0IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZIgorICAgICAgICAgICAgICAgICAiXG4tIFJHQjMyICAgMzIgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkiCisgICAgICAgICAgICAgICAgICJcbldoZW4gbm90IDAsIHRoaXMgcGFyYW1ldGVyIHdpbGwgb3ZlcnJpZGUgJ2RlY29tcHJlc3Npb24nLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAwIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG5Jbml0aWFsIHBhbGV0dGUgaXMgIgorICAgICAgICAgICAgICAgICBfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9QQUxFVFRFX0RFQ09NUF9PTikiLiIKKyAgICAgICAgICAgICAgICAgIlxuSWYgJ3c5OTY4Y2YtdnBwJyBpcyBub3QgcHJlc2VudCwgdGhpcyBwYXJhbWV0ZXIgaXMiCisgICAgICAgICAgICAgICAgICIgc2V0IHRvIDkgKFVZVlkpLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3JnYiwgCisgICAgICAgICAgICAgICAgICJcbjwwfDFbLC4uLl0+IFJlYWQgUkdCIHZpZGVvIGRhdGEgaW5zdGVhZCBvZiBCR1I6IgorICAgICAgICAgICAgICAgICAiXG4gMSA9IHVzZSBSR0IgY29tcG9uZW50IG9yZGVyaW5nLiIKKyAgICAgICAgICAgICAgICAgIlxuIDAgPSB1c2UgQkdSIGNvbXBvbmVudCBvcmRlcmluZy4iCisgICAgICAgICAgICAgICAgICJcblRoaXMgcGFyYW1ldGVyIGhhcyBlZmZlY3Qgd2hlbiB1c2luZyBSR0JYIHBhbGV0dGVzIG9ubHkuIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9GT1JDRV9SR0IpCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhhdXRvYnJpZ2h0LAorICAgICAgICAgICAgICAgICAiXG48MHwxWywuLi5dPiBJbWFnZSBzZW5zb3IgYXV0b21hdGljYWxseSBjaGFuZ2VzIGJyaWdodG5lc3M6IgorICAgICAgICAgICAgICAgICAiXG4gMCA9IG5vLCAxID0geWVzIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9BVVRPQlJJR0hUKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoYXV0b2V4cCwKKyAgICAgICAgICAgICAgICAgIlxuPDB8MVssLi4uXT4gSW1hZ2Ugc2Vuc29yIGF1dG9tYXRpY2FsbHkgY2hhbmdlcyBleHBvc3VyZToiCisgICAgICAgICAgICAgICAgICJcbiAwID0gbm8sIDEgPSB5ZXMiCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0FVVE9FWFApCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhsaWdodGZyZXEsCisgICAgICAgICAgICAgICAgICJcbjw1MHw2MFssLi4uXT4gTGlnaHQgZnJlcXVlbmN5IGluIEh6OiIKKyAgICAgICAgICAgICAgICAgIlxuIDUwIGZvciBFdXJvcGVhbiBhbmQgQXNpYW4gbGlnaHRpbmcsIgorICAgICAgICAgICAgICAgICAiIDYwIGZvciBBbWVyaWNhbiBsaWdodGluZy4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0xJR0hURlJFUSkKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGJhbmRpbmdmaWx0ZXIsCisgICAgICAgICAgICAgICAgICJcbjwwfDFbLC4uLl0+IEJhbmRpbmcgZmlsdGVyIHRvIHJlZHVjZSBlZmZlY3RzIG9mIgorICAgICAgICAgICAgICAgICAiIGZsdW9yZXNjZW50IGxpZ2h0aW5nOiIKKyAgICAgICAgICAgICAgICAgIlxuIDAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCisgICAgICAgICAgICAgICAgICJcblRoaXMgZmlsdGVyIHRyaWVzIHRvIHJlZHVjZSB0aGUgcGF0dGVybiBvZiBob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAiXG5saWdodC9kYXJrIGJhbmRzIGNhdXNlZCBieSBzb21lICh1c3VhbGx5IGZsdW9yZXNjZW50KSIKKyAgICAgICAgICAgICAgICAgIiBsaWdodGluZy4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0JBTkRJTkdGSUxURVIpCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhjbG9ja2RpdiwKKyAgICAgICAgICAgICAgICAgIlxuPC0xfG5bLC4uLl0+ICIKKyAgICAgICAgICAgICAgICAgIkZvcmNlIHBpeGVsIGNsb2NrIGRpdmlzb3IgdG8gYSBzcGVjaWZpYyB2YWx1ZSAoZm9yIGV4cGVydHMpOiIKKyAgICAgICAgICAgICAgICAgIlxuICBuIG1heSB2YXJ5IGZyb20gMCB0byAxMjcuIgorICAgICAgICAgICAgICAgICAiXG4gLTEgZm9yIGF1dG9tYXRpYyB2YWx1ZS4iCisgICAgICAgICAgICAgICAgICJcblNlZSBhbHNvIHRoZSAnZG91YmxlX2J1ZmZlcicgbW9kdWxlIHBhcmFtZXRlci4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX0NMT0NLRElWKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFja2xpZ2h0LAorICAgICAgICAgICAgICAgICAiXG48MHwxWywuLi5dPiBPYmplY3RzIGFyZSBsaXQgZnJvbSBiZWhpbmQ6IgorICAgICAgICAgICAgICAgICAiXG4gMCA9IG5vLCAxID0geWVzIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9CQUNLTElHSFQpCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhtaXJyb3IsCisgICAgICAgICAgICAgICAgICJcbjwwfDFbLC4uLl0+IFJldmVyc2UgaW1hZ2UgaG9yaXpvbnRhbGx5OiIKKyAgICAgICAgICAgICAgICAgIlxuIDAgPSBubywgMSA9IHllcyIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfTUlSUk9SKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MobW9ub2Nocm9tZSwKKyAgICAgICAgICAgICAgICAgIlxuPDB8MVssLi4uXT4gVXNlIGltYWdlIHNlbnNvciBhcyBtb25vY2hyb21lIHNlbnNvcjoiCisgICAgICAgICAgICAgICAgICJcbiAwID0gbm8sIDEgPSB5ZXMiCisgICAgICAgICAgICAgICAgICJcbk5vdCBhbGwgdGhlIHNlbnNvcnMgc3VwcG9ydCBtb25vY2hyb21lIGNvbG9yLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfTU9OT0NIUk9NRSkKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGJyaWdodG5lc3MsIAorICAgICAgICAgICAgICAgICAiXG48blssLi4uXT4gU2V0IHBpY3R1cmUgYnJpZ2h0bmVzcyAoMC02NTUzNSkuIgorICAgICAgICAgICAgICAgICAiXG5EZWZhdWx0IHZhbHVlIGlzICJfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9CUklHSFRORVNTKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG5UaGlzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0IGlmICdhdXRvYnJpZ2h0JyBpcyBlbmFibGVkLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CitNT0RVTEVfUEFSTV9ERVNDKGh1ZSwgCisgICAgICAgICAgICAgICAgICJcbjxuWywuLi5dPiBTZXQgcGljdHVyZSBodWUgKDAtNjU1MzUpLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfSFVFKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoY29sb3VyLCAKKyAgICAgICAgICAgICAgICAgIlxuPG5bLC4uLl0+IFNldCBwaWN0dXJlIHNhdHVyYXRpb24gKDAtNjU1MzUpLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfQ09MT1VSKQorICAgICAgICAgICAgICAgICAiIGZvciBldmVyeSBkZXZpY2UuIgorICAgICAgICAgICAgICAgICAiXG4iKTsKK01PRFVMRV9QQVJNX0RFU0MoY29udHJhc3QsIAorICAgICAgICAgICAgICAgICAiXG48blssLi4uXT4gU2V0IHBpY3R1cmUgY29udHJhc3QgKDAtNjU1MzUpLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfQ09OVFJBU1QpCisgICAgICAgICAgICAgICAgICIgZm9yIGV2ZXJ5IGRldmljZS4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyh3aGl0ZW5lc3MsIAorICAgICAgICAgICAgICAgICAiXG48blssLi4uXT4gU2V0IHBpY3R1cmUgd2hpdGVuZXNzICgwLTY1NTM1KS4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIl9fTU9EVUxFX1NUUklORyhXOTk2OENGX1dISVRFTkVTUykKKyAgICAgICAgICAgICAgICAgIiBmb3IgZXZlcnkgZGV2aWNlLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CisjaWZkZWYgVzk5NjhDRl9ERUJVRworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywKKyAgICAgICAgICAgICAgICAgIlxuPG4+IERlYnVnZ2luZyBpbmZvcm1hdGlvbiBsZXZlbCwgZnJvbSAwIHRvIDY6IgorICAgICAgICAgICAgICAgICAiXG4wID0gbm9uZSAodXNlIGNhcmVmdWxseSkiCisgICAgICAgICAgICAgICAgICJcbjEgPSBjcml0aWNhbCBlcnJvcnMiCisgICAgICAgICAgICAgICAgICJcbjIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMiCisgICAgICAgICAgICAgICAgICJcbjMgPSBjb25maWd1cmF0aW9uIG9yIGdlbmVyYWwgbWVzc2FnZXMiCisgICAgICAgICAgICAgICAgICJcbjQgPSB3YXJuaW5ncyIKKyAgICAgICAgICAgICAgICAgIlxuNSA9IGNhbGxlZCBmdW5jdGlvbnMiCisgICAgICAgICAgICAgICAgICJcbjYgPSBmdW5jdGlvbiBpbnRlcm5hbHMiCisgICAgICAgICAgICAgICAgICJcbkxldmVsIDUgYW5kIDYgYXJlIHVzZWZ1bCBmb3IgdGVzdGluZyBvbmx5LCB3aGVuIG9ubHkgIgorICAgICAgICAgICAgICAgICAib25lIGRldmljZSBpcyB1c2VkLiIKKyAgICAgICAgICAgICAgICAgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFc5OTY4Q0ZfREVCVUdfTEVWRUwpIi4iCisgICAgICAgICAgICAgICAgICJcbiIpOworTU9EVUxFX1BBUk1fREVTQyhzcGVjaWZpY19kZWJ1ZywKKyAgICAgICAgICAgICAgICAgIlxuPDB8MT4gRW5hYmxlIG9yIGRpc2FibGUgc3BlY2lmaWMgZGVidWdnaW5nIG1lc3NhZ2VzOiIKKyAgICAgICAgICAgICAgICAgIlxuMCA9IHByaW50IG1lc3NhZ2VzIGNvbmNlcm5pbmcgZXZlcnkgbGV2ZWwiCisgICAgICAgICAgICAgICAgICIgPD0gJ2RlYnVnJyBsZXZlbC4iCisgICAgICAgICAgICAgICAgICJcbjEgPSBwcmludCBtZXNzYWdlcyBjb25jZXJuaW5nIHRoZSBsZXZlbCIKKyAgICAgICAgICAgICAgICAgIiBpbmRpY2F0ZWQgYnkgJ2RlYnVnJy4iCisgICAgICAgICAgICAgICAgICJcbkRlZmF1bHQgdmFsdWUgaXMgIgorICAgICAgICAgICAgICAgICBfX01PRFVMRV9TVFJJTkcoVzk5NjhDRl9TUEVDSUZJQ19ERUJVRykiLiIKKyAgICAgICAgICAgICAgICAgIlxuIik7CisjZW5kaWYgLyogVzk5NjhDRl9ERUJVRyAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvbWUgcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVmlkZW80bGludXggaW50ZXJmYWNlICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3OTk2OGNmX2ZvcHM7CitzdGF0aWMgaW50IHc5OTY4Y2Zfb3BlbihzdHJ1Y3QgaW5vZGUqLCBzdHJ1Y3QgZmlsZSopOworc3RhdGljIGludCB3OTk2OGNmX3JlbGVhc2Uoc3RydWN0IGlub2RlKiwgc3RydWN0IGZpbGUqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9tbWFwKHN0cnVjdCBmaWxlKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0Kik7CitzdGF0aWMgaW50IHc5OTY4Y2ZfaW9jdGwoc3RydWN0IGlub2RlKiwgc3RydWN0IGZpbGUqLCB1bnNpZ25lZCwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgc3NpemVfdCB3OTk2OGNmX3JlYWQoc3RydWN0IGZpbGUqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCopOworc3RhdGljIGludCB3OTk2OGNmX3Y0bF9pb2N0bChzdHJ1Y3QgaW5vZGUqLCBzdHJ1Y3QgZmlsZSosIHVuc2lnbmVkIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKik7CisKKy8qIFVTQi1zcGVjaWZpYyAqLworc3RhdGljIGludCB3OTk2OGNmX3N0YXJ0X3RyYW5zZmVyKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX3N0b3BfdHJhbnNmZXIoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2Zfd3JpdGVfcmVnKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9yZWFkX3JlZyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1MTYgaW5kZXgpOworc3RhdGljIGludCB3OTk2OGNmX3dyaXRlX2ZzYihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1MTYqIGRhdGEpOworc3RhdGljIGludCB3OTk2OGNmX3dyaXRlX3NiKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHUxNiB2YWx1ZSk7CitzdGF0aWMgaW50IHc5OTY4Y2ZfcmVhZF9zYihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl91cGxvYWRfcXVhbnRpemF0aW9udGFibGVzKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIHZvaWQgdzk5NjhjZl91cmJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qIExvdy1sZXZlbCBJMkMgKFNNQnVzKSBJL08gKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c19zdGFydChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c19zdG9wKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3dyaXRlX2J5dGUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgdTggdik7CitzdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfcmVhZF9ieXRlKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHU4KiB2KTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c193cml0ZV9hY2soc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfcmVhZF9hY2soc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfcmVmcmVzaF9idXMoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2FkYXBfcmVhZF9ieXRlKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgYWRkcmVzcywgdTgqIHZhbHVlKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9pMmNfYWRhcF9yZWFkX2J5dGVfZGF0YShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1MTYgYWRkcmVzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggc3ViYWRkcmVzcywgdTgqIHZhbHVlKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9pMmNfYWRhcF93cml0ZV9ieXRlKHN0cnVjdCB3OTk2OGNmX2RldmljZSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgYWRkcmVzcywgdTggc3ViYWRkcmVzcyk7CitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2FkYXBfZmFzdHdyaXRlX2J5dGVfZGF0YShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGFkZHJlc3MsIHU4IHN1YmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCB2YWx1ZSk7CisKKy8qIEkyQyBpbnRlcmZhY2UgdG8ga2VybmVsICovCitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2luaXQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX3NtYnVzX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyKiwgdTE2IGFkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLCB1bmlvbiBpMmNfc21idXNfZGF0YSopOworc3RhdGljIHUzMiB3OTk2OGNmX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciopOworc3RhdGljIGludCB3OTk2OGNmX2kyY19hdHRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50Kik7CitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2RldGFjaF9pbmZvcm0oc3RydWN0IGkyY19jbGllbnQqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9pMmNfY29udHJvbChzdHJ1Y3QgaTJjX2FkYXB0ZXIqLCB1bnNpZ25lZCBpbnQgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworLyogTWVtb3J5IG1hbmFnZW1lbnQgKi8KK3N0YXRpYyB2b2lkKiBydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpOworc3RhdGljIHZvaWQgcnZmcmVlKHZvaWQgKm1lbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfZGVhbGxvY2F0ZV9tZW1vcnkoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50ICB3OTk2OGNmX2FsbG9jYXRlX21lbW9yeShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKKworLyogSGlnaC1sZXZlbCBpbWFnZSBzZW5zb3IgY29udHJvbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKixpbnQgY2lkLGludCB2YWwpOworc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl9nZXRfY29udHJvbChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLGludCBjaWQsaW50ICp2YWwpOworc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl9jbWQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CitzdGF0aWMgaW50IHc5OTY4Y2Zfc2Vuc29yX2luaXQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2Zfc2Vuc29yX3VwZGF0ZV9zZXR0aW5ncyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKK3N0YXRpYyBpbnQgdzk5NjhjZl9zZW5zb3JfZ2V0X3BpY3R1cmUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2Zfc2Vuc29yX3VwZGF0ZV9waWN0dXJlKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0KTsKKworLyogT3RoZXIgaGVscGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgdzk5NjhjZl9jb25maWd1cmVfY2FtZXJhKHN0cnVjdCB3OTk2OGNmX2RldmljZSosc3RydWN0IHVzYl9kZXZpY2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gdzk5NjhjZl9tb2RlbF9pZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgZGV2X25yKTsKK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfYWRqdXN0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2ZfdHVybl9vbl9sZWQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CitzdGF0aWMgaW50IHc5OTY4Y2ZfaW5pdF9jaGlwKHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIGlubGluZSB1MTYgdzk5NjhjZl92YWxpZF9wYWxldHRlKHUxNiBwYWxldHRlKTsKK3N0YXRpYyBpbmxpbmUgdTE2IHc5OTY4Y2ZfdmFsaWRfZGVwdGgodTE2IHBhbGV0dGUpOworc3RhdGljIGlubGluZSB1OCB3OTk2OGNmX25lZWRfZGVjb21wcmVzc2lvbih1MTYgcGFsZXR0ZSk7CitzdGF0aWMgaW50IHc5OTY4Y2Zfc2V0X3BpY3R1cmUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgc3RydWN0IHZpZGVvX3BpY3R1cmUpOworc3RhdGljIGludCB3OTk2OGNmX3NldF93aW5kb3coc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgc3RydWN0IHZpZGVvX3dpbmRvdyk7CitzdGF0aWMgaW50IHc5OTY4Y2ZfcG9zdHByb2Nlc3NfZnJhbWUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCopOworc3RhdGljIGludCB3OTk2OGNmX2FkanVzdF93aW5kb3dfc2l6ZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqLCB1MTYqIHcsIHUxNiogaCk7CitzdGF0aWMgdm9pZCB3OTk2OGNmX2luaXRfZnJhbWVsaXN0KHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIHZvaWQgdzk5NjhjZl9wdXNoX2ZyYW1lKHN0cnVjdCB3OTk2OGNmX2RldmljZSosIHU4IGZfbnVtKTsKK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfcG9wX2ZyYW1lKHN0cnVjdCB3OTk2OGNmX2RldmljZSosc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCoqKTsKK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKik7CisKKy8qIEludGVybW9kdWxlIGNvbW11bmljYXRpb24gKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl92cHBtb2RfZGV0ZWN0KHN0cnVjdCB3OTk2OGNmX2RldmljZSopOworc3RhdGljIHZvaWQgdzk5NjhjZl92cHBtb2RfcmVsZWFzZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTeW1ib2xpYyBuYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFVzZWQgdG8gcmVwcmVzZW50IGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHRoZWlyIHJlc3BlY3RpdmUgc3ltYm9saWMgbmFtZXMgKi8KK3N0cnVjdCB3OTk2OGNmX3N5bWJvbGljX2xpc3QgeworCWNvbnN0IGludCBudW07CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIHN5bWJvbGljX2xpc3QgYXJyYXkuIFRoZQorICBlbmQgb2YgdGhlIGxpc3QgbXVzdCBiZSBtYXJrZWQgd2l0aCBhbiBlbGVtZW50IHRoYXQgaGFzIGEgTlVMTCBuYW1lLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKiAKK3N5bWJvbGljKHN0cnVjdCB3OTk2OGNmX3N5bWJvbGljX2xpc3QgbGlzdFtdLCBjb25zdCBpbnQgbnVtKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJaWYgKGxpc3RbaV0ubnVtID09IG51bSkKKwkJCXJldHVybiAobGlzdFtpXS5uYW1lKTsKKworCXJldHVybiAiVW5rbm93biI7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdzk5NjhjZl9zeW1ib2xpY19saXN0IGNhbWxpc3RbXSA9IHsKKwl7IFc5OTY4Q0ZfTU9EX0dFTkVSSUMsICJXOTk2Wzg3XUNGIEpQRUcgVVNCIER1YWwgTW9kZSBDYW1lcmEiIH0sCisJeyBXOTk2OENGX01PRF9DTFZCV0dQLCAiQ3JlYXRpdmUgTGFicyBWaWRlbyBCbGFzdGVyIFdlYkNhbSBHbyBQbHVzIiB9LAorCisJLyogT3RoZXIgY2FtZXJhcyAoaGF2aW5nIHRoZSBzYW1lIGRlc2NyaXB0b3JzIGFzIEdlbmVyaWMgVzk5Nls4N11DRikgKi8KKwl7IFc5OTY4Q0ZfTU9EX0FEUFZETUEsICJBcm9tYSBEaWdpIFBlbiBWR0EgRHVhbCBNb2RlIEFERy01MDAwIiB9LAorCXsgVzk5ODZDRl9NT0RfQUFVLCAiQVZlck1lZGlhIEFWZXJUViBVU0IiIH0sCisJeyBXOTk2OENGX01PRF9DTFZCV0csICJDcmVhdGl2ZSBMYWJzIFZpZGVvIEJsYXN0ZXIgV2ViQ2FtIEdvIiB9LAorCXsgVzk5NjhDRl9NT0RfTEwsICJMZWJvbiBMREMtMDM1QSIgfSwKKwl7IFc5OTY4Q0ZfTU9EX0VFRU1DLCAiRXpvbmljcyBFWi04MDIgRVpNZWdhIENhbSIgfSwKKwl7IFc5OTY4Q0ZfTU9EX09PRSwgIk9tbmlWaXNpb24gT1Y4NjEwLUVERSIgfSwKKwl7IFc5OTY4Q0ZfTU9EX09EUFZETVBDLCAiT1BDT00gRGlnaSBQZW4gVkdBIER1YWwgTW9kZSBQZW4gQ2FtZXJhIiB9LAorCXsgVzk5NjhDRl9NT0RfUERQSUksICJQcmV0ZWMgRGlnaSBQZW4tSUkiIH0sCisJeyBXOTk2OENGX01PRF9QRFA0ODAsICJQcmV0ZWMgRGlnaVBlbi00ODAiIH0sCisKKwl7ICAtMSwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHc5OTY4Y2Zfc3ltYm9saWNfbGlzdCBzZW5saXN0W10gPSB7CisJeyBDQ19PVjc2QkUsICAgIk9WNzZCRSIgfSwKKwl7IENDX09WNzYxMCwgICAiT1Y3NjEwIiB9LAorCXsgQ0NfT1Y3NjIwLCAgICJPVjc2MjAiIH0sCisJeyBDQ19PVjc2MjBBRSwgIk9WNzYyMEFFIiB9LAorCXsgQ0NfT1Y2NjIwLCAgICJPVjY2MjAiIH0sCisJeyBDQ19PVjY2MzAsICAgIk9WNjYzMCIgfSwKKwl7IENDX09WNjYzMEFFLCAiT1Y2NjMwQUUiIH0sCisJeyBDQ19PVjY2MzBBRiwgIk9WNjYzMEFGIiB9LAorCXsgLTEsIE5VTEwgfQorfTsKKworLyogVmlkZW80TGludXgxIHBhbGV0dGVzICovCitzdGF0aWMgc3RydWN0IHc5OTY4Y2Zfc3ltYm9saWNfbGlzdCB2NGwxX3BsaXN0W10gPSB7CisJeyBWSURFT19QQUxFVFRFX0dSRVksICAgICJHUkVZIiB9LAorCXsgVklERU9fUEFMRVRURV9ISTI0MCwgICAiSEkyNDAiIH0sCisJeyBWSURFT19QQUxFVFRFX1JHQjU2NSwgICJSR0I1NjUiIH0sCisJeyBWSURFT19QQUxFVFRFX1JHQjI0LCAgICJSR0IyNCIgfSwKKwl7IFZJREVPX1BBTEVUVEVfUkdCMzIsICAgIlJHQjMyIiB9LAorCXsgVklERU9fUEFMRVRURV9SR0I1NTUsICAiUkdCNTU1IiB9LAorCXsgVklERU9fUEFMRVRURV9ZVVY0MjIsICAiWVVWNDIyIiB9LAorCXsgVklERU9fUEFMRVRURV9ZVVlWLCAgICAiWVVZViIgfSwKKwl7IFZJREVPX1BBTEVUVEVfVVlWWSwgICAgIlVZVlkiIH0sCisJeyBWSURFT19QQUxFVFRFX1lVVjQyMCwgICJZVVY0MjAiIH0sCisJeyBWSURFT19QQUxFVFRFX1lVVjQxMSwgICJZVVY0MTEiIH0sCisJeyBWSURFT19QQUxFVFRFX1JBVywgICAgICJSQVciIH0sCisJeyBWSURFT19QQUxFVFRFX1lVVjQyMlAsICJZVVY0MjJQIiB9LAorCXsgVklERU9fUEFMRVRURV9ZVVY0MTFQLCAiWVVWNDExUCIgfSwKKwl7IFZJREVPX1BBTEVUVEVfWVVWNDIwUCwgIllVVjQyMFAiIH0sCisJeyBWSURFT19QQUxFVFRFX1lVVjQxMFAsICJZVVY0MTBQIiB9LAorCXsgLTEsIE5VTEwgfQorfTsKKworLyogRGVjb2RlciBlcnJvciBjb2RlczogKi8KK3N0YXRpYyBzdHJ1Y3Qgdzk5NjhjZl9zeW1ib2xpY19saXN0IGRlY29kZXJfZXJybGlzdFtdID0geworCXsgVzk5NjhDRl9ERUNfRVJSX0NPUlJVUFRFRF9EQVRBLCAiQ29ycnVwdGVkIGRhdGEiIH0sCisJeyBXOTk2OENGX0RFQ19FUlJfQlVGX09WRVJGTE9XLCAgICJCdWZmZXIgb3ZlcmZsb3ciIH0sCisJeyBXOTk2OENGX0RFQ19FUlJfTk9fU09JLCAgICAgICAgICJTT0kgbWFya2VyIG5vdCBmb3VuZCIgfSwgICAgIAorCXsgVzk5NjhDRl9ERUNfRVJSX05PX1NPRjAsICAgICAgICAiU09GMCBtYXJrZXIgbm90IGZvdW5kIiB9LAorCXsgVzk5NjhDRl9ERUNfRVJSX05PX1NPUywgICAgICAgICAiU09TIG1hcmtlciBub3QgZm91bmQiIH0sCisJeyBXOTk2OENGX0RFQ19FUlJfTk9fRU9JLCAgICAgICAgICJFT0kgbWFya2VyIG5vdCBmb3VuZCIgfSwKKwl7IC0xLCBOVUxMIH0KK307CisKKy8qIFVSQiBlcnJvciBjb2RlczogKi8KK3N0YXRpYyBzdHJ1Y3Qgdzk5NjhjZl9zeW1ib2xpY19saXN0IHVyYl9lcnJsaXN0W10gPSB7CisJeyAtRU5PTUVNLCAgICAiTm8gbWVtb3J5IGZvciBhbGxvY2F0aW9uIG9mIGludGVybmFsIHN0cnVjdHVyZXMiIH0sCisJeyAtRU5PU1BDLCAgICAiVGhlIGhvc3QgY29udHJvbGxlcidzIGJhbmR3aWR0aCBpcyBhbHJlYWR5IGNvbnN1bWVkIiB9LAorCXsgLUVOT0VOVCwgICAgIlVSQiB3YXMgY2FuY2VsZWQgYnkgdW5saW5rX3VyYiIgfSwKKwl7IC1FWERFViwgICAgICJJU08gdHJhbnNmZXIgb25seSBwYXJ0aWFsbHkgY29tcGxldGVkIiB9LAorCXsgLUVBR0FJTiwgICAgIlRvbyBtYXRjaCBzY2hlZHVsZWQgZm9yIHRoZSBmdXR1cmUiIH0sCisJeyAtRU5YSU8sICAgICAiVVJCIGFscmVhZHkgcXVldWVkIiB9LAorCXsgLUVGQklHLCAgICAgIlRvbyBtdWNoIElTTyBmcmFtZXMgcmVxdWVzdGVkIiB9LAorCXsgLUVOT1NSLCAgICAgIkJ1ZmZlciBlcnJvciAob3ZlcnJ1bikiIH0sCisJeyAtRVBJUEUsICAgICAiU3BlY2lmaWVkIGVuZHBvaW50IGlzIHN0YWxsZWQgKGRldmljZSBub3QgcmVzcG9uZGluZykifSwKKwl7IC1FT1ZFUkZMT1csICJCYWJibGUgKGJhZCBjYWJsZT8pIiB9LAorCXsgLUVQUk9UTywgICAgIkJpdC1zdHVmZiBlcnJvciAoYmFkIGNhYmxlPykiIH0sCisJeyAtRUlMU0VRLCAgICAiQ1JDL1RpbWVvdXQiIH0sCisJeyAtRVRJTUVET1VULCAiTkFLIChkZXZpY2UgZG9lcyBub3QgcmVzcG9uZCkiIH0sCisJeyAtMSwgTlVMTCB9Cit9OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkKiBydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCogbWVtOworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJbWVtID0gdm1hbGxvY18zMihzaXplKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KKwlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlIChzaXplID4gMCkgeworCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBtZW07Cit9CisKKworc3RhdGljIHZvaWQgcnZmcmVlKHZvaWQqIG1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJaWYgKCFtZW0pCisJCXJldHVybjsKKworCWFkciA9ICh1bnNpZ25lZCBsb25nKSBtZW07CisJd2hpbGUgKChsb25nKSBzaXplID4gMCkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJYWRyICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCXZmcmVlKG1lbSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEZWFsbG9jYXRlIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgdzk5NjhjZl9kZWFsbG9jYXRlX21lbW9yeShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwl1OCBpOworCisJLyogRnJlZSB0aGUgaXNvY2hyb25vdXMgdHJhbnNmZXIgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBXOTk2OENGX1VSQlM7IGkrKykgeworCQlrZnJlZShjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXSk7CisJCWNhbS0+dHJhbnNmZXJfYnVmZmVyW2ldID0gTlVMTDsKKwl9CisKKwkvKiBGcmVlIHRlbXBvcmFyeSBmcmFtZSBidWZmZXIgKi8KKwlpZiAoY2FtLT5mcmFtZV90bXAuYnVmZmVyKSB7CisJCXJ2ZnJlZShjYW0tPmZyYW1lX3RtcC5idWZmZXIsIGNhbS0+ZnJhbWVfdG1wLnNpemUpOworCQljYW0tPmZyYW1lX3RtcC5idWZmZXIgPSBOVUxMOworCX0KKworCS8qIEZyZWUgaGVscGVyIGJ1ZmZlciAqLworCWlmIChjYW0tPmZyYW1lX3ZwcC5idWZmZXIpIHsKKwkJcnZmcmVlKGNhbS0+ZnJhbWVfdnBwLmJ1ZmZlciwgY2FtLT5mcmFtZV92cHAuc2l6ZSk7CisJCWNhbS0+ZnJhbWVfdnBwLmJ1ZmZlciA9IE5VTEw7CisJfQorCisJLyogRnJlZSB2aWRlbyBmcmFtZSBidWZmZXJzICovCisJaWYgKGNhbS0+ZnJhbWVbMF0uYnVmZmVyKSB7CisJCXJ2ZnJlZShjYW0tPmZyYW1lWzBdLmJ1ZmZlciwgY2FtLT5uYnVmZmVycypjYW0tPmZyYW1lWzBdLnNpemUpOworCQljYW0tPmZyYW1lWzBdLmJ1ZmZlciA9IE5VTEw7CisJfQorCisJY2FtLT5uYnVmZmVycyA9IDA7CisKKwlEQkcoNSwgIk1lbW9yeSBzdWNjZXNzZnVsbHkgZGVhbGxvY2F0ZWQiKQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQWxsb2NhdGUgbWVtb3J5IGJ1ZmZlcnMgZm9yIFVTQiB0cmFuc2ZlcnMgYW5kIHZpZGVvIGZyYW1lcy4KKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgb3BlbigpIG9ubHkuCisgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3OTk2OGNmX2FsbG9jYXRlX21lbW9yeShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwljb25zdCB1MTYgcF9zaXplID0gd01heFBhY2tldFNpemVbY2FtLT5hbHRzZXR0aW5nLTFdOworCXZvaWQqIGJ1ZmYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaHdfYnVmc2l6ZSwgdnBwX2J1ZnNpemU7CisJdTggaSwgYnBwOworCisJLyogTk9URTogRGVhbGxvY2F0aW9uIGlzIGRvbmUgZWxzZXdoZXJlIGluIGNhc2Ugb2YgZXJyb3IgKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgbWF4IGFtb3VudCBvZiByYXcgZGF0YSBwZXIgZnJhbWUgZnJvbSB0aGUgZGV2aWNlICovCisJaHdfYnVmc2l6ZSA9IGNhbS0+bWF4d2lkdGgqY2FtLT5tYXhoZWlnaHQqMjsKKworCS8qIENhbGN1bGF0ZSB0aGUgbWF4IGJ1Zi4gc2l6ZSBuZWVkZWQgZm9yIHBvc3QtcHJvY2Vzc2luZyByb3V0aW5lcyAqLworCWJwcCA9ICh3OTk2OGNmX3ZwcCkgPyA0IDogMjsKKwlpZiAoY2FtLT51cHNjYWxpbmcpCisJCXZwcF9idWZzaXplID0gbWF4KFc5OTY4Q0ZfTUFYX1dJRFRIKlc5OTY4Q0ZfTUFYX0hFSUdIVCpicHAsCisJCSAgICAgICAgICAgICAgICAgIGNhbS0+bWF4d2lkdGgqY2FtLT5tYXhoZWlnaHQqYnBwKTsKKwllbHNlCisJCXZwcF9idWZzaXplID0gY2FtLT5tYXh3aWR0aCpjYW0tPm1heGhlaWdodCpicHA7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpc29jaHJvbm91cyB0cmFuc2ZlciBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IFc5OTY4Q0ZfVVJCUzsgaSsrKSB7CisJCWlmICghKGNhbS0+dHJhbnNmZXJfYnVmZmVyW2ldID0KKwkJICAgICAga21hbGxvYyhXOTk2OENGX0lTT19QQUNLRVRTKnBfc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CisJCQlEQkcoMSwgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGlzb2Nocm9ub3VzICIKKwkJCSAgICAgICAidHJhbnNmZXIgYnVmZmVycyAoJXUgYnl0ZXMpIiwgCisJCQkgICAgcF9zaXplICogVzk5NjhDRl9JU09fUEFDS0VUUykKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldChjYW0tPnRyYW5zZmVyX2J1ZmZlcltpXSwgMCwgVzk5NjhDRl9JU09fUEFDS0VUUypwX3NpemUpOworCX0KKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHRlbXBvcmFyeSBmcmFtZSBidWZmZXIgKi8KKwlpZiAoIShjYW0tPmZyYW1lX3RtcC5idWZmZXIgPSBydm1hbGxvYyhod19idWZzaXplKSkpIHsKKwkJREJHKDEsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0ZW1wb3JhcnkgIgorCQkgICAgICAgInZpZGVvIGZyYW1lIGJ1ZmZlciAoJWx1IGJ5dGVzKSIsIGh3X2J1ZnNpemUpCisJCXJldHVybiAtRU5PTUVNOworCX0KKwljYW0tPmZyYW1lX3RtcC5zaXplID0gaHdfYnVmc2l6ZTsKKwljYW0tPmZyYW1lX3RtcC5udW1iZXIgPSAtMTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGhlbHBlciBidWZmZXIgKi8KKwlpZiAodzk5NjhjZl92cHApIHsKKwkJaWYgKCEoY2FtLT5mcmFtZV92cHAuYnVmZmVyID0gcnZtYWxsb2ModnBwX2J1ZnNpemUpKSkgeworCQkJREJHKDEsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBoZWxwZXIgYnVmZmVyIgorCQkJICAgICAgICIgKCVsdSBieXRlcykiLCB2cHBfYnVmc2l6ZSkKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWNhbS0+ZnJhbWVfdnBwLnNpemUgPSB2cHBfYnVmc2l6ZTsKKwl9IGVsc2UKKwkJY2FtLT5mcmFtZV92cHAuYnVmZmVyID0gTlVMTDsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdmlkZW8gZnJhbWUgYnVmZmVycyAqLworCWNhbS0+bmJ1ZmZlcnMgPSBjYW0tPm1heF9idWZmZXJzOworCXdoaWxlIChjYW0tPm5idWZmZXJzID49IDIpIHsKKwkJaWYgKChidWZmID0gcnZtYWxsb2MoY2FtLT5uYnVmZmVycyAqIHZwcF9idWZzaXplKSkpCisJCQlicmVhazsKKwkJZWxzZQorCQkJY2FtLT5uYnVmZmVycy0tOworCX0KKworCWlmICghYnVmZikgeworCQlEQkcoMSwgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHZpZGVvIGZyYW1lIGJ1ZmZlcnMiKQorCQljYW0tPm5idWZmZXJzID0gMDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGNhbS0+bmJ1ZmZlcnMgIT0gY2FtLT5tYXhfYnVmZmVycykKKwkJREJHKDIsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICV1IHZpZGVvIGZyYW1lIGJ1ZmZlcnMuICIKKwkJICAgICAgICJPbmx5IG1lbW9yeSBmb3IgJXUgYnVmZmVycyBoYXMgYmVlbiBhbGxvY2F0ZWQiLAorCQkgICAgY2FtLT5tYXhfYnVmZmVycywgY2FtLT5uYnVmZmVycykKKworCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzOyBpKyspIHsKKwkJY2FtLT5mcmFtZVtpXS5idWZmZXIgPSBidWZmICsgaSp2cHBfYnVmc2l6ZTsKKwkJY2FtLT5mcmFtZVtpXS5zaXplID0gdnBwX2J1ZnNpemU7CisJCWNhbS0+ZnJhbWVbaV0ubnVtYmVyID0gaTsKKwkJLyogQ2lyY3VsYXIgbGlzdCAqLworCQlpZiAoaSAhPSBjYW0tPm5idWZmZXJzLTEpCisJCQljYW0tPmZyYW1lW2ldLm5leHQgPSAmY2FtLT5mcmFtZVtpKzFdOworCQllbHNlCisJCQljYW0tPmZyYW1lW2ldLm5leHQgPSAmY2FtLT5mcmFtZVswXTsKKwkJY2FtLT5mcmFtZVtpXS5zdGF0dXMgPSBGX1VOVVNFRDsKKwl9CisKKwlEQkcoNSwgIk1lbW9yeSBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkIikKKwlyZXR1cm4gMDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVU0Itc3BlY2lmaWMgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVGhpcyBpcyBhbiBoYW5kbGVyIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBhZnRlciB0aGUgVVJCcyBhcmUgY29tcGxldGVkLgorICBJdCBjb2xsZWN0cyBtdWx0aXBsZSBkYXRhIHBhY2tldHMgY29taW5nIGZyb20gdGhlIGNhbWVyYSBieSBwdXR0aW5nIHRoZW0KKyAgaW50byBmcmFtZSBidWZmZXJzOiBvbmUgb3IgbW9yZSB6ZXJvIGRhdGEgbGVuZ3RoIGRhdGEgcGFja2V0cyBhcmUgdXNlZCB0bworICBtYXJrIHRoZSBlbmQgb2YgYSB2aWRlbyBmcmFtZTsgdGhlIGZpcnN0IG5vbi16ZXJvIGRhdGEgcGFja2V0IGlzIHRoZSBzdGFydAorICBvZiB0aGUgbmV4dCB2aWRlbyBmcmFtZTsgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgaW4gYSBwYWNrZXQsIHRoZSBlbnRpcmUKKyAgdmlkZW8gZnJhbWUgaXMgZGlzY2FyZGVkIGFuZCBncmFiYmVkIGFnYWluLgorICBJZiB0aGVyZSBhcmUgbm8gcmVxdWVzdGVkIGZyYW1lcyBpbiB0aGUgRklGTyBsaXN0LCBwYWNrZXRzIGFyZSBjb2xsZWN0ZWQgaW50bworICBhIHRlbXBvcmFyeSBidWZmZXIuIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCB3OTk2OGNmX3VyYl9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtID0gKHN0cnVjdCB3OTk2OGNmX2RldmljZSopdXJiLT5jb250ZXh0OworCXN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqKiBmOworCXVuc2lnbmVkIGludCBsZW4sIHN0YXR1czsKKwl2b2lkKiBwb3M7CisJdTggaTsKKwlpbnQgZXJyID0gMDsKKworCWlmICgoIWNhbS0+c3RyZWFtaW5nKSB8fCBjYW0tPmRpc2Nvbm5lY3RlZCkgeworCQlEQkcoNCwgIkdvdCBpbnRlcnJ1cHQsIGJ1dCBub3Qgc3RyZWFtaW5nIikKKwkJcmV0dXJuOworCX0KKworCS8qICIoKmYpIiB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiAiY2FtLT5mcmFtZV9jdXJyZW50IiAqLworCWYgPSAmY2FtLT5mcmFtZV9jdXJyZW50OworCisJLyogSWYgYSBmcmFtZSBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHdlIGFyZSBncmFiYmluZyBpbnRvICAKKwkgICB0aGUgdGVtcG9yYXJ5IGZyYW1lLCB3ZSdsbCBzd2l0Y2ggdG8gdGhhdCByZXF1ZXN0ZWQgZnJhbWUgKi8KKwlpZiAoKCpmKSA9PSAmY2FtLT5mcmFtZV90bXAgJiYgKmNhbS0+cmVxdWVzdGVkX2ZyYW1lKSB7CisJCWlmIChjYW0tPmZyYW1lX3RtcC5zdGF0dXMgPT0gRl9HUkFCQklORykgeworCQkJdzk5NjhjZl9wb3BfZnJhbWUoY2FtLCAmY2FtLT5mcmFtZV9jdXJyZW50KTsKKwkJCSgqZiktPnN0YXR1cyA9IEZfR1JBQkJJTkc7CisJCQkoKmYpLT5sZW5ndGggPSBjYW0tPmZyYW1lX3RtcC5sZW5ndGg7CisJCQltZW1jcHkoKCpmKS0+YnVmZmVyLCBjYW0tPmZyYW1lX3RtcC5idWZmZXIsCisJCQkgICAgICAgKCpmKS0+bGVuZ3RoKTsKKwkJCURCRyg2LCAiU3dpdGNoZWQgZnJvbSB0ZW1wLiBmcmFtZSB0byBmcmFtZSAjJWQiLCAKKwkJCSAgICAoKmYpLT5udW1iZXIpCisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJCWxlbiA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwkJc3RhdHVzID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CisJCXBvcyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ICsgdXJiLT50cmFuc2Zlcl9idWZmZXI7CisKKwkJaWYgKHN0YXR1cyAmJiBsZW4gIT0gMCkgeworCQkJREJHKDQsICJVUkIgZmFpbGVkLCBlcnJvciBpbiBkYXRhIHBhY2tldCAiCisJCQkgICAgICAgIihlcnJvciAjJXUsICVzKSIsCisJCQkgICAgc3RhdHVzLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgc3RhdHVzKSkKKwkJCSgqZiktPnN0YXR1cyA9IEZfRVJST1I7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChsZW4pIHsgLyogc3RhcnQgb2YgZnJhbWUgKi8KKworCQkJaWYgKCgqZiktPnN0YXR1cyA9PSBGX1VOVVNFRCkgeworCQkJCSgqZiktPnN0YXR1cyA9IEZfR1JBQkJJTkc7CisJCQkJKCpmKS0+bGVuZ3RoID0gMDsKKwkJCX0KKworCQkJLyogQnVmZmVyIG92ZXJmbG93cyBzaG91bGRuJ3QgaGFwcGVuLCBob3dldmVyLi4uKi8KKwkJCWlmICgoKmYpLT5sZW5ndGggKyBsZW4gPiAoKmYpLT5zaXplKSB7CisJCQkJREJHKDQsICJCdWZmZXIgb3ZlcmZsb3c6IGJhZCBkYXRhIHBhY2tldHMiKQorCQkJCSgqZiktPnN0YXR1cyA9IEZfRVJST1I7CisJCQl9CisKKwkJCWlmICgoKmYpLT5zdGF0dXMgPT0gRl9HUkFCQklORykgeworCQkJCW1lbWNweSgoKmYpLT5idWZmZXIgKyAoKmYpLT5sZW5ndGgsIHBvcywgbGVuKTsKKwkJCQkoKmYpLT5sZW5ndGggKz0gbGVuOworCQkJfQorCisJCX0gZWxzZSBpZiAoKCpmKS0+c3RhdHVzID09IEZfR1JBQkJJTkcpIHsgLyogZW5kIG9mIGZyYW1lICovCisKKwkJCURCRyg2LCAiRnJhbWUgIyVkIHN1Y2Nlc3NmdWxseSBncmFiYmVkIiwgKCpmKS0+bnVtYmVyKQorCisJCQlpZiAoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKSB7CisJCQkJZXJyID0gdzk5NjhjZl92cHAtPmNoZWNrX2hlYWRlcnMoKCpmKS0+YnVmZmVyLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZiktPmxlbmd0aCk7CisJCQkJaWYgKGVycikgeworCQkJCQlEQkcoNCwgIlNraXAgY29ycnVwdGVkIGZyYW1lOiAlcyIsCisJCQkJCSAgICBzeW1ib2xpYyhkZWNvZGVyX2Vycmxpc3QsIGVycikpCisJCQkJCSgqZiktPnN0YXR1cyA9IEZfVU5VU0VEOworCQkJCQljb250aW51ZTsgLyogZ3JhYiB0aGlzIGZyYW1lIGFnYWluICovCisJCQkJfQorCQkJfQorCisJCQkoKmYpLT5zdGF0dXMgPSBGX1JFQURZOworCQkJKCpmKS0+cXVldWVkID0gMDsKKworCQkJLyogVGFrZSBhIHBvaW50ZXIgdG8gdGhlIG5ldyBmcmFtZSBmcm9tIHRoZSBGSUZPIGxpc3QuCisJCQkgICBJZiB0aGUgbGlzdCBpcyBlbXB0eSx3ZSdsbCB1c2UgdGhlIHRlbXBvcmFyeSBmcmFtZSovCisJCQlpZiAoKmNhbS0+cmVxdWVzdGVkX2ZyYW1lKQorCQkJCXc5OTY4Y2ZfcG9wX2ZyYW1lKGNhbSwgJmNhbS0+ZnJhbWVfY3VycmVudCk7CisJCQllbHNlIHsKKwkJCQljYW0tPmZyYW1lX2N1cnJlbnQgPSAmY2FtLT5mcmFtZV90bXA7CisJCQkJKCpmKS0+c3RhdHVzID0gRl9VTlVTRUQ7CisJCQl9CisKKwkJfSBlbHNlIGlmICgoKmYpLT5zdGF0dXMgPT0gRl9FUlJPUikKKwkJCSgqZiktPnN0YXR1cyA9IEZfVU5VU0VEOyAvKiBncmFiIGl0IGFnYWluICovCisKKwkJUERCR0coIkZyYW1lIGxlbmd0aCAlbHUgfCBwYWNrLiMldSB8IHBhY2subGVuLiAldSB8IHN0YXRlICVkIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpKCpmKS0+bGVuZ3RoLCBpLCBsZW4sICgqZiktPnN0YXR1cykKKworCX0gLyogZW5kIGZvciAqLworCisJLyogUmVzdWJtaXQgdGhpcyBVUkIgKi8KKwl1cmItPmRldiA9IGNhbS0+dXNiZGV2OworCXVyYi0+c3RhdHVzID0gMDsKKwlzcGluX2xvY2soJmNhbS0+dXJiX2xvY2spOworCWlmIChjYW0tPnN0cmVhbWluZykKKwkJaWYgKChlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSkgeworCQkJY2FtLT5taXNjb25maWd1cmVkID0gMTsKKwkJCURCRygxLCAiQ291bGRuJ3QgcmVzdWJtaXQgdGhlIFVSQjogZXJyb3IgJWQsICVzIiwKKwkJCSAgICBlcnIsIHN5bWJvbGljKHVyYl9lcnJsaXN0LCBlcnIpKQorCQl9CisJc3Bpbl91bmxvY2soJmNhbS0+dXJiX2xvY2spOworCisJLyogV2FrZSB1cCB0aGUgdXNlciBwcm9jZXNzICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYW0tPndhaXRfcXVldWUpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFNldHVwIHRoZSBVUkIgc3RydWN0dXJlcyBmb3IgdGhlIGlzb2Nocm9ub3VzIHRyYW5zZmVyLgorICBTdWJtaXQgdGhlIFVSQnMgc28gdGhhdCB0aGUgZGF0YSB0cmFuc2ZlciBiZWdpbnMuCisgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl9zdGFydF90cmFuc2ZlcihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGNhbS0+dXNiZGV2OworCXN0cnVjdCB1cmIqIHVyYjsKKwljb25zdCB1MTYgcF9zaXplID0gd01heFBhY2tldFNpemVbY2FtLT5hbHRzZXR0aW5nLTFdOworCXUxNiB3LCBoLCBkOworCWludCB2aWRjYXB0OworCXUzMiB0X3NpemU7CisJaW50IGVyciA9IDA7CisJczggaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBXOTk2OENGX1VSQlM7IGkrKykgeworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKFc5OTY4Q0ZfSVNPX1BBQ0tFVFMsIEdGUF9LRVJORUwpOworCQljYW0tPnVyYltpXSA9IHVyYjsKKwkJaWYgKCF1cmIpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2pdKTsKKwkJCURCRygxLCAiQ291bGRuJ3QgYWxsb2NhdGUgdGhlIFVSQiBzdHJ1Y3R1cmVzIikKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJdXJiLT5kZXYgPSB1ZGV2OworCQl1cmItPmNvbnRleHQgPSAodm9pZCopY2FtOworCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUodWRldiwgMSk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBXOTk2OENGX0lTT19QQUNLRVRTOworCQl1cmItPmNvbXBsZXRlID0gdzk5NjhjZl91cmJfY29tcGxldGU7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gY2FtLT50cmFuc2Zlcl9idWZmZXJbaV07CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHBfc2l6ZSpXOTk2OENGX0lTT19QQUNLRVRTOworCQl1cmItPmludGVydmFsID0gMTsKKwkJZm9yIChqID0gMDsgaiA8IFc5OTY4Q0ZfSVNPX1BBQ0tFVFM7IGorKykgeworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBwX3NpemUqajsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gcF9zaXplOworCQl9CisJfQorCisJLyogVHJhbnNmZXIgc2l6ZSBwZXIgZnJhbWUsIGluIFdPUkQgISAqLworCWQgPSBjYW0tPmh3X2RlcHRoOworCXcgPSBjYW0tPmh3X3dpZHRoOworCWggPSBjYW0tPmh3X2hlaWdodDsKKworCXRfc2l6ZSA9ICh3KmgqZCkvMTY7CisKKwllcnIgPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4YmYxNywgMHgwMCk7IC8qIHJlc2V0IGV2ZXJ5dGhpbmcgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweGJmMTAsIDB4MDApOyAvKiBub3JtYWwgb3BlcmF0aW9uICovCisKKwkvKiBUcmFuc2ZlciBzaXplICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdF9zaXplICYgMHhmZmZmLCAweDNkKTsgLyogbG93IGJpdHMgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB0X3NpemUgPj4gMTYsIDB4M2UpOyAgICAvKiBoaWdoIGJpdHMgKi8KKworCWlmIChjYW0tPnZwcF9mbGFnICYgVlBQX0RFQ09NUFJFU1NJT04pCisJCWVyciArPSB3OTk2OGNmX3VwbG9hZF9xdWFudGl6YXRpb250YWJsZXMoY2FtKTsKKworCXZpZGNhcHQgPSB3OTk2OGNmX3JlYWRfcmVnKGNhbSwgMHgxNik7IC8qIHJlYWQgcGljdHVyZSBzZXR0aW5ncyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHZpZGNhcHR8MHg4MDAwLCAweDE2KTsgLyogY2FwdC4gZW5hYmxlICovCisKKwllcnIgKz0gdXNiX3NldF9pbnRlcmZhY2UodWRldiwgMCwgY2FtLT5hbHRzZXR0aW5nKTsKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDhhMDUsIDB4M2MpOyAvKiBVU0IgRklGTyBlbmFibGUgKi8KKworCWlmIChlcnIgfHwgKHZpZGNhcHQgPCAwKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgVzk5NjhDRl9VUkJTOyBpKyspCisJCQl1c2JfZnJlZV91cmIoY2FtLT51cmJbaV0pOworCQlEQkcoMSwgIkNvdWxkbid0IHRlbGwgdGhlIGNhbWVyYSB0byBzdGFydCB0aGUgZGF0YSB0cmFuc2ZlciIpCisJCXJldHVybiBlcnI7CisJfQorCisJdzk5NjhjZl9pbml0X2ZyYW1lbGlzdChjYW0pOworCisJLyogQmVnaW4gdG8gZ3JhYiBpbnRvIHRoZSB0ZW1wb3JhcnkgYnVmZmVyICovCisJY2FtLT5mcmFtZV90bXAuc3RhdHVzID0gRl9VTlVTRUQ7CisJY2FtLT5mcmFtZV90bXAucXVldWVkID0gMDsKKwljYW0tPmZyYW1lX2N1cnJlbnQgPSAmY2FtLT5mcmFtZV90bXA7CisKKwlpZiAoIShjYW0tPnZwcF9mbGFnICYgVlBQX0RFQ09NUFJFU1NJT04pKQorCQlEQkcoNSwgIklzb2Nocm9ub3VzIHRyYW5zZmVyIHNpemU6ICVsdSBieXRlcy9mcmFtZSIsIAorCQkgICAgKHVuc2lnbmVkIGxvbmcpdF9zaXplKjIpCisKKwlEQkcoNSwgIlN0YXJ0aW5nIHRoZSBpc29jaHJvbm91cyB0cmFuc2Zlci4uLiIpCisKKwljYW0tPnN0cmVhbWluZyA9IDE7CisKKwkvKiBTdWJtaXQgdGhlIFVSQnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVzk5NjhDRl9VUkJTOyBpKyspIHsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIoY2FtLT51cmJbaV0sIEdGUF9LRVJORUwpOworCQlpZiAoZXJyKSB7CisJCQljYW0tPnN0cmVhbWluZyA9IDA7CisJCQlmb3IgKGogPSBpLTE7IGogPj0gMDsgai0tKSB7CisJCQkJdXNiX2tpbGxfdXJiKGNhbS0+dXJiW2pdKTsKKwkJCQl1c2JfZnJlZV91cmIoY2FtLT51cmJbal0pOworCQkJfQorCQkJREJHKDEsICJDb3VsZG4ndCBzZW5kIGEgdHJhbnNmZXIgcmVxdWVzdCB0byB0aGUgIgorCQkJICAgICAgICJVU0IgY29yZSAoZXJyb3IgIyVkLCAlcykiLCBlcnIsIAorCQkJICAgIHN5bWJvbGljKHVyYl9lcnJsaXN0LCBlcnIpKQorCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU3RvcCB0aGUgaXNvY2hyb25vdXMgdHJhbnNmZXIgYW5kIHNldCBhbHRlcm5hdGUgc2V0dGluZyB0byAwICgwTWIvcykuCisgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3OTk2OGNmX3N0b3BfdHJhbnNmZXIoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBjYW0tPnVzYmRldjsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisJaW50IGVyciA9IDA7CisJczggaTsKKworCWlmICghY2FtLT5zdHJlYW1pbmcpCisJCXJldHVybiAwOworCisJLyogVGhpcyBhdm9pZHMgcmFjZSBjb25kaXRpb25zIHdpdGggdXNiX3N1Ym1pdF91cmIoKSAKKwkgICBpbiB0aGUgVVJCIGNvbXBsZXRpdGlvbiBoYW5kbGVyICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+dXJiX2xvY2ssIGxvY2tfZmxhZ3MpOworCWNhbS0+c3RyZWFtaW5nID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPnVyYl9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWZvciAoaSA9IFc5OTY4Q0ZfVVJCUy0xOyBpID49IDA7IGktLSkKKwkJaWYgKGNhbS0+dXJiW2ldKSB7CisJCQl1c2Jfa2lsbF91cmIoY2FtLT51cmJbaV0pOworCQkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2ldKTsKKwkJCWNhbS0+dXJiW2ldID0gTlVMTDsKKwkJfQorCisJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKQorCQlnb3RvIGV4aXQ7CisKKwllcnIgPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MGEwNSwgMHgzYyk7IC8qIHN0b3AgVVNCIHRyYW5zZmVyICovCisJZXJyICs9IHVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIDAsIDApOyAvKiAwIE1iL3MgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDAwMDAsIDB4MzkpOyAvKiBkaXNhYmxlIEpQRUcgZW5jb2RlciAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAwMCwgMHgxNik7IC8qIHN0b3AgdmlkZW8gY2FwdHVyZSAqLworCisJaWYgKGVycikgeworCQlEQkcoMiwgIkZhaWxlZCB0byB0ZWxsIHRoZSBjYW1lcmEgdG8gc3RvcCB0aGUgaXNvY2hyb25vdXMgIgorCQkgICAgICAgInRyYW5zZmVyLiBIb3dldmVyIHRoaXMgaXMgbm90IGEgY3JpdGljYWwgZXJyb3IuIikKKwkJcmV0dXJuIC1FSU87CisJfQorCitleGl0OgorCURCRyg1LCAiSXNvY2hyb25vdXMgdHJhbnNmZXIgc3RvcHBlZCIpCisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXcml0ZSBhIFc5OTY4Q0YgcmVnaXN0ZXIuIAorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl93cml0ZV9yZWcoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQoreworCXN0cnVjdCB1c2JfZGV2aWNlKiB1ZGV2ID0gY2FtLT51c2JkZXY7CisJaW50IHJlczsKKworCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksIDAsCisJICAgICAgICAgICAgICAgICAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCBXOTk2OENGX1VTQl9DVFJMX1RJTUVPVVQpOworCisJaWYgKHJlcyA8IDApCisJCURCRyg0LCAiRmFpbGVkIHRvIHdyaXRlIGEgcmVnaXN0ZXIgIgorCQkgICAgICAgIih2YWx1ZSAweCUwNFgsIGluZGV4IDB4JTAyWCwgZXJyb3IgIyVkLCAlcykiLAorCQkgICAgdmFsdWUsIGluZGV4LCByZXMsIHN5bWJvbGljKHVyYl9lcnJsaXN0LCByZXMpKQorCisJcmV0dXJuIChyZXMgPj0gMCkgPyAwIDogLTE7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBSZWFkIGEgVzk5NjhDRiByZWdpc3Rlci4gCisgIFJldHVybiB0aGUgcmVnaXN0ZXIgdmFsdWUgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2ZfcmVhZF9yZWcoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHUxNiBpbmRleCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OworCXUxNiogYnVmZiA9IGNhbS0+Y29udHJvbF9idWZmZXI7CisJaW50IHJlczsKKworCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksIDEsCisJICAgICAgICAgICAgICAgICAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCSAgICAgICAgICAgICAgICAgICAgICAwLCBpbmRleCwgYnVmZiwgMiwgVzk5NjhDRl9VU0JfQ1RSTF9USU1FT1VUKTsKKworCWlmIChyZXMgPCAwKQorCQlEQkcoNCwgIkZhaWxlZCB0byByZWFkIGEgcmVnaXN0ZXIgIgorCQkgICAgICAgIihpbmRleCAweCUwMlgsIGVycm9yICMlZCwgJXMpIiwKKwkJICAgIGluZGV4LCByZXMsIHN5bWJvbGljKHVyYl9lcnJsaXN0LCByZXMpKQorCisJcmV0dXJuIChyZXMgPj0gMCkgPyAoaW50KSgqYnVmZikgOiAtMTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFdyaXRlIDY0LWJpdCBkYXRhIHRvIHRoZSBmYXN0IHNlcmlhbCBidXMgcmVnaXN0ZXJzLgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl93cml0ZV9mc2Ioc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHUxNiogZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OworCXUxNiB2YWx1ZTsKKwlpbnQgcmVzOworCisJdmFsdWUgPSAqZGF0YSsrOworCisJcmVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwgMCwKKwkgICAgICAgICAgICAgICAgICAgICAgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfREVWSUNFLAorCSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgMHgwNiwgZGF0YSwgNiwgVzk5NjhDRl9VU0JfQ1RSTF9USU1FT1VUKTsKKworCWlmIChyZXMgPCAwKQorCQlEQkcoNCwgIkZhaWxlZCB0byB3cml0ZSB0aGUgRlNCIHJlZ2lzdGVycyAiCisJCSAgICAgICAiKGVycm9yICMlZCwgJXMpIiwgcmVzLCBzeW1ib2xpYyh1cmJfZXJybGlzdCwgcmVzKSkKKworCXJldHVybiAocmVzID49IDApID8gMCA6IC0xOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgV3JpdGUgZGF0YSB0byB0aGUgc2VyaWFsIGJ1cyBjb250cm9sIHJlZ2lzdGVyLgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl93cml0ZV9zYihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgdTE2IHZhbHVlKQoreworCWludCBlcnIgPSAwOworCisJZXJyID0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB2YWx1ZSwgMHgwMSk7CisJdWRlbGF5KFc5OTY4Q0ZfSTJDX0JVU19ERUxBWSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUmVhZCBkYXRhIGZyb20gdGhlIHNlcmlhbCBidXMgY29udHJvbCByZWdpc3Rlci4KKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2ZfcmVhZF9zYihzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgdiA9IDA7CisKKwl2ID0gdzk5NjhjZl9yZWFkX3JlZyhjYW0sIDB4MDEpOworCXVkZWxheShXOTk2OENGX0kyQ19CVVNfREVMQVkpOworCisJcmV0dXJuIHY7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBVcGxvYWQgcXVhbnRpemF0aW9uIHRhYmxlcyBmb3IgdGhlIEpQRUcgY29tcHJlc3Npb24uCisgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHc5OTY4Y2Zfc3RhcnRfdHJhbnNmZXIoKS4KKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2ZfdXBsb2FkX3F1YW50aXphdGlvbnRhYmxlcyhzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwl1MTYgYSwgYjsKKwlpbnQgZXJyID0gMCwgaSwgajsKKworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAxMCwgMHgzOSk7IC8qIEpQRUcgY2xvY2sgZW5hYmxlICovCisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDMyOyBpKyssIGogKz0gMikgeworCQlhID0gWV9RVUFOVEFCTEVbal0gfCAoKHVuc2lnbmVkKShZX1FVQU5UQUJMRVtqKzFdKSA8PCA4KTsKKwkJYiA9IFVWX1FVQU5UQUJMRVtqXSB8ICgodW5zaWduZWQpKFVWX1FVQU5UQUJMRVtqKzFdKSA8PCA4KTsKKwkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgYSwgMHg0MCtpKTsKKwkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgYiwgMHg2MCtpKTsKKwl9CisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDEyLCAweDM5KTsgLyogSlBFRyBlbmNvZGVyIGVuYWJsZSAqLworCisJcmV0dXJuIGVycjsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMb3ctbGV2ZWwgSTJDIEkvTyBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBJMkMgdHJhbnNmZXIgZnVuY3Rpb25zOiAgICAgICAgICAgICAgICoKKyAqIGkyY19hZGFwX2Zhc3R3cml0ZV9ieXRlX2RhdGEoKSAoYXQgNDAwIGtIeiBiaXQgZnJlcXVlbmN5IG9ubHkpICAgICAgICAgICAqCisgKiBpMmNfYWRhcF9yZWFkX2J5dGVfZGF0YSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogaTJjX2FkYXBfcmVhZF9ieXRlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHc5OTY4Y2Zfc21idXNfc3RhcnQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMSk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTEgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMCk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTAgKi8KKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3N0b3Aoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMSk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTEgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMyk7IC8qIFNERT0xLCBTREE9MSwgU0NMPTEgKi8KKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3dyaXRlX2J5dGUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHU4IHYpCit7CisJdTggYml0OworCWludCBlcnIgPSAwLCBzZGE7CisKKwlmb3IgKGJpdCA9IDAgOyBiaXQgPCA4IDsgYml0KyspIHsKKwkJc2RhID0gKHYgJiAweDgwKSA/IDIgOiAwOworCQl2IDw8PSAxOworCQkvKiBTREU9MSwgU0RBPXNkYSwgU0NMPTAgKi8KKwkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDEwIHwgc2RhKTsKKwkJLyogU0RFPTEsIFNEQT1zZGEsIFNDTD0xICovCisJCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgxMSB8IHNkYSk7CisJCS8qIFNERT0xLCBTREE9c2RhLCBTQ0w9MCAqLworCQllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MTAgfCBzZGEpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3JlYWRfYnl0ZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgdTgqIHYpCit7CisJdTggYml0OworCWludCBlcnIgPSAwOworCisJKnYgPSAwOworCWZvciAoYml0ID0gMCA7IGJpdCA8IDggOyBiaXQrKykgeworCQkqdiA8PD0gMTsKKwkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTMpOworCQkqdiB8PSAodzk5NjhjZl9yZWFkX3NiKGNhbSkgJiAweDAwMDgpID8gMSA6IDA7CisJCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgwMDEyKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9zbWJ1c193cml0ZV9hY2soc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMCk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTAgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMSk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTEgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMCk7IC8qIFNERT0xLCBTREE9MCwgU0NMPTAgKi8KKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3JlYWRfYWNrKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwLCBzZGE7CisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMyk7IC8qIFNERT0xLCBTREE9MSwgU0NMPTEgKi8KKwlzZGEgPSAodzk5NjhjZl9yZWFkX3NiKGNhbSkgJiAweDA4KSA/IDEgOiAwOyAvKiBzZGEgPSBTREEgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAxMik7IC8qIFNERT0xLCBTREE9MSwgU0NMPTAgKi8KKwlpZiAoc2RhIDwgMCkKKwkJZXJyICs9IHNkYTsKKwlpZiAoc2RhID09IDEpIHsKKwkJREJHKDYsICJDb3VsZG4ndCByZWNlaXZlIHRoZSBBQ0siKQorCQllcnIgKz0gLTE7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCisvKiBUaGlzIHNlZW1zIHRvIHJlZnJlc2ggdGhlIGNvbW11bmljYXRpb24gdGhyb3VnaCB0aGUgc2VyaWFsIGJ1cyAqLworc3RhdGljIGludCB3OTk2OGNmX3NtYnVzX3JlZnJlc2hfYnVzKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwLCBqOworCisJZm9yIChqID0gMTsgaiA8PSAxMDsgaisrKSB7CisJCWVyciA9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDIwLCAweDAxKTsKKwkJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDAxKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKworLyogU01CdXMgcHJvdG9jb2w6IFMgQWRkciBXciBbQV0gU3ViYWRkciBbQV0gVmFsdWUgW0FdIFAgKi8KK3N0YXRpYyBpbnQgCit3OTk2OGNmX2kyY19hZGFwX2Zhc3R3cml0ZV9ieXRlX2RhdGEoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBhZGRyZXNzLCB1OCBzdWJhZGRyZXNzLHU4IHZhbHVlKQoreworCXUxNiogZGF0YSA9IGNhbS0+ZGF0YV9idWZmZXI7CisJaW50IGVyciA9IDA7CisKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c19yZWZyZXNoX2J1cyhjYW0pOworCisJLyogRW5hYmxlIFNCVVMgb3V0cHV0cyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3NiKGNhbSwgMHgwMDIwKTsKKworCWRhdGFbMF0gPSAweDA4MmYgfCAoKGFkZHJlc3MgJiAweDgwKSA/IDB4MTUwMCA6IDB4MCk7CisJZGF0YVswXSB8PSAoYWRkcmVzcyAmIDB4NDApID8gMHg0MDAwIDogMHgwOworCWRhdGFbMV0gPSAweDIwODIgfCAoKGFkZHJlc3MgJiAweDQwKSA/IDB4MDAwNSA6IDB4MCk7CisJZGF0YVsxXSB8PSAoYWRkcmVzcyAmIDB4MjApID8gMHgwMTUwIDogMHgwOworCWRhdGFbMV0gfD0gKGFkZHJlc3MgJiAweDEwKSA/IDB4NTQwMCA6IDB4MDsKKwlkYXRhWzJdID0gMHg4MjA4IHwgKChhZGRyZXNzICYgMHgwOCkgPyAweDAwMTUgOiAweDApOworCWRhdGFbMl0gfD0gKGFkZHJlc3MgJiAweDA0KSA/IDB4MDU0MCA6IDB4MDsKKwlkYXRhWzJdIHw9IChhZGRyZXNzICYgMHgwMikgPyAweDUwMDAgOiAweDA7CisJZGF0YVszXSA9IDB4MWQyMCB8ICgoYWRkcmVzcyAmIDB4MDIpID8gMHgwMDAxIDogMHgwKTsKKwlkYXRhWzNdIHw9IChhZGRyZXNzICYgMHgwMSkgPyAweDAwNTQgOiAweDA7CisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9mc2IoY2FtLCBkYXRhKTsKKworCWRhdGFbMF0gPSAweDgyMDggfCAoKHN1YmFkZHJlc3MgJiAweDgwKSA/IDB4MDAxNSA6IDB4MCk7CisJZGF0YVswXSB8PSAoc3ViYWRkcmVzcyAmIDB4NDApID8gMHgwNTQwIDogMHgwOworCWRhdGFbMF0gfD0gKHN1YmFkZHJlc3MgJiAweDIwKSA/IDB4NTAwMCA6IDB4MDsKKwlkYXRhWzFdID0gMHgwODIwIHwgKChzdWJhZGRyZXNzICYgMHgyMCkgPyAweDAwMDEgOiAweDApOworCWRhdGFbMV0gfD0gKHN1YmFkZHJlc3MgJiAweDEwKSA/IDB4MDA1NCA6IDB4MDsKKwlkYXRhWzFdIHw9IChzdWJhZGRyZXNzICYgMHgwOCkgPyAweDE1MDAgOiAweDA7CisJZGF0YVsxXSB8PSAoc3ViYWRkcmVzcyAmIDB4MDQpID8gMHg0MDAwIDogMHgwOworCWRhdGFbMl0gPSAweDIwODIgfCAoKHN1YmFkZHJlc3MgJiAweDA0KSA/IDB4MDAwNSA6IDB4MCk7CisJZGF0YVsyXSB8PSAoc3ViYWRkcmVzcyAmIDB4MDIpID8gMHgwMTUwIDogMHgwOworCWRhdGFbMl0gfD0gKHN1YmFkZHJlc3MgJiAweDAxKSA/IDB4NTQwMCA6IDB4MDsKKwlkYXRhWzNdID0gMHgwMDFkOworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfZnNiKGNhbSwgZGF0YSk7CisKKwlkYXRhWzBdID0gMHg4MjA4IHwgKCh2YWx1ZSAmIDB4ODApID8gMHgwMDE1IDogMHgwKTsKKwlkYXRhWzBdIHw9ICh2YWx1ZSAmIDB4NDApID8gMHgwNTQwIDogMHgwOworCWRhdGFbMF0gfD0gKHZhbHVlICYgMHgyMCkgPyAweDUwMDAgOiAweDA7CisJZGF0YVsxXSA9IDB4MDgyMCB8ICgodmFsdWUgJiAweDIwKSA/IDB4MDAwMSA6IDB4MCk7CisJZGF0YVsxXSB8PSAodmFsdWUgJiAweDEwKSA/IDB4MDA1NCA6IDB4MDsKKwlkYXRhWzFdIHw9ICh2YWx1ZSAmIDB4MDgpID8gMHgxNTAwIDogMHgwOworCWRhdGFbMV0gfD0gKHZhbHVlICYgMHgwNCkgPyAweDQwMDAgOiAweDA7CisJZGF0YVsyXSA9IDB4MjA4MiB8ICgodmFsdWUgJiAweDA0KSA/IDB4MDAwNSA6IDB4MCk7CisJZGF0YVsyXSB8PSAodmFsdWUgJiAweDAyKSA/IDB4MDE1MCA6IDB4MDsKKwlkYXRhWzJdIHw9ICh2YWx1ZSAmIDB4MDEpID8gMHg1NDAwIDogMHgwOworCWRhdGFbM10gPSAweGZlMWQ7CisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9mc2IoY2FtLCBkYXRhKTsKKworCS8qIERpc2FibGUgU0JVUyBvdXRwdXRzICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMDApOworCisJaWYgKCFlcnIpCisJCURCRyg1LCAiSTJDIHdyaXRlIGJ5dGUgZGF0YSBkb25lLCBhZGRyLjB4JTA0WCwgc3ViYWRkci4weCUwMlggIgorCQkgICAgICAgInZhbHVlIDB4JTAyWCIsIGFkZHJlc3MsIHN1YmFkZHJlc3MsIHZhbHVlKQorCWVsc2UKKwkJREJHKDUsICJJMkMgd3JpdGUgYnl0ZSBkYXRhIGZhaWxlZCwgYWRkci4weCUwNFgsICIKKwkJICAgICAgICJzdWJhZGRyLjB4JTAyWCwgdmFsdWUgMHglMDJYIiwgCisJCSAgICBhZGRyZXNzLCBzdWJhZGRyZXNzLCB2YWx1ZSkKKworCXJldHVybiBlcnI7Cit9CisKKworLyogU01CdXMgcHJvdG9jb2w6IFMgQWRkciBXciBbQV0gU3ViYWRkciBbQV0gUCBTIEFkZHIrMSBSZCBbQV0gW1ZhbHVlXSBOQSBQICovCitzdGF0aWMgaW50IAordzk5NjhjZl9pMmNfYWRhcF9yZWFkX2J5dGVfZGF0YShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBhZGRyZXNzLCB1OCBzdWJhZGRyZXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTgqIHZhbHVlKQoreworCWludCBlcnIgPSAwOworCisJLyogU2VyaWFsIGRhdGEgZW5hYmxlICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTMpOyAvKiBkb24ndCBjaGFuZ2UgISAqLworCisJZXJyICs9IHc5OTY4Y2Zfc21idXNfc3RhcnQoY2FtKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9ieXRlKGNhbSwgYWRkcmVzcyk7CisJZXJyICs9IHc5OTY4Y2Zfc21idXNfcmVhZF9hY2soY2FtKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9ieXRlKGNhbSwgc3ViYWRkcmVzcyk7CisJZXJyICs9IHc5OTY4Y2Zfc21idXNfcmVhZF9hY2soY2FtKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c19zdG9wKGNhbSk7CisJZXJyICs9IHc5OTY4Y2Zfc21idXNfc3RhcnQoY2FtKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9ieXRlKGNhbSwgYWRkcmVzcyArIDEpOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3JlYWRfYWNrKGNhbSk7CisJZXJyICs9IHc5OTY4Y2Zfc21idXNfcmVhZF9ieXRlKGNhbSwgdmFsdWUpOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3dyaXRlX2FjayhjYW0pOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3N0b3AoY2FtKTsKKworCS8qIFNlcmlhbCBkYXRhIGRpc2FibGUgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9zYihjYW0sIDB4MDAwMCk7CisKKwlpZiAoIWVycikKKwkJREJHKDUsICJJMkMgcmVhZCBieXRlIGRhdGEgZG9uZSwgYWRkci4weCUwNFgsICIKKwkJICAgICAgICJzdWJhZGRyLjB4JTAyWCwgdmFsdWUgMHglMDJYIiwgCisJCSAgICBhZGRyZXNzLCBzdWJhZGRyZXNzLCAqdmFsdWUpCisJZWxzZQorCQlEQkcoNSwgIkkyQyByZWFkIGJ5dGUgZGF0YSBmYWlsZWQsIGFkZHIuMHglMDRYLCAiCisJCSAgICAgICAic3ViYWRkci4weCUwMlgsIHdyb25nIHZhbHVlIDB4JTAyWCIsCisJCSAgICBhZGRyZXNzLCBzdWJhZGRyZXNzLCAqdmFsdWUpCisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qIFNNQnVzIHByb3RvY29sOiBTIEFkZHIrMSBSZCBbQV0gW1ZhbHVlXSBOQSBQICovCitzdGF0aWMgaW50IAordzk5NjhjZl9pMmNfYWRhcF9yZWFkX2J5dGUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgYWRkcmVzcywgdTgqIHZhbHVlKQoreworCWludCBlcnIgPSAwOworCisJLyogU2VyaWFsIGRhdGEgZW5hYmxlICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMTMpOworCisJZXJyICs9IHc5OTY4Y2Zfc21idXNfc3RhcnQoY2FtKTsKKwllcnIgKz0gdzk5NjhjZl9zbWJ1c193cml0ZV9ieXRlKGNhbSwgYWRkcmVzcyArIDEpOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3JlYWRfYWNrKGNhbSk7CisJZXJyICs9IHc5OTY4Y2Zfc21idXNfcmVhZF9ieXRlKGNhbSwgdmFsdWUpOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3dyaXRlX2FjayhjYW0pOworCWVyciArPSB3OTk2OGNmX3NtYnVzX3N0b3AoY2FtKTsKKyAKKwkvKiBTZXJpYWwgZGF0YSBkaXNhYmxlICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfc2IoY2FtLCAweDAwMDApOworCisJaWYgKCFlcnIpCisJCURCRyg1LCAiSTJDIHJlYWQgYnl0ZSBkb25lLCBhZGRyLjB4JTA0WCwgIgorCQkgICAgICAgInZhbHVlIDB4JTAyWCIsIGFkZHJlc3MsICp2YWx1ZSkKKwllbHNlCisJCURCRyg1LCAiSTJDIHJlYWQgYnl0ZSBmYWlsZWQsIGFkZHIuMHglMDRYLCAiCisJCSAgICAgICAid3JvbmcgdmFsdWUgMHglMDJYIiwgYWRkcmVzcywgKnZhbHVlKQorCisJcmV0dXJuIGVycjsKK30KKworCisvKiBTTUJ1cyBwcm90b2NvbDogUyBBZGRyIFdyIFtBXSBWYWx1ZSBbQV0gUCAqLworc3RhdGljIGludCAKK3c5OTY4Y2ZfaTJjX2FkYXBfd3JpdGVfYnl0ZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgYWRkcmVzcywgdTggdmFsdWUpCit7CisJREJHKDQsICJpMmNfd3JpdGVfYnl0ZSgpIGlzIGFuIHVuc3VwcG9ydGVkIHRyYW5zZmVyIG1vZGUiKQorCXJldHVybiAtRUlOVkFMOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEkyQyBpbnRlcmZhY2UgdG8ga2VybmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAordzk5NjhjZl9pMmNfc21idXNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBhZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwgdTggY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhKQoreworCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKKwl1OCBpOworCWludCBlcnIgPSAwOyAKKworCXN3aXRjaCAoYWRkcikgeworCQljYXNlIE9WNnh4MF9TSUQ6CisJCWNhc2UgT1Y3eHgwX1NJRDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHKDQsICJSZWplY3RlZCBzbGF2ZSBJRCAweCUwNFgiLCBhZGRyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNpemUgPT0gSTJDX1NNQlVTX0JZVEUpIHsKKwkJLyogV2h5IGFkZHIgPDw9IDE/IFNlZSBPVlhYWDBfU0lEIGRlZmluZXMgaW4gb3ZjYW1jaGlwLmggKi8KKwkJYWRkciA8PD0gMTsKKworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisgCQkJZXJyID0gdzk5NjhjZl9pMmNfYWRhcF93cml0ZV9ieXRlKGNhbSwgYWRkciwgY29tbWFuZCk7CisJCWVsc2UgaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIAorCQkJZXJyID0gdzk5NjhjZl9pMmNfYWRhcF9yZWFkX2J5dGUoY2FtLGFkZHIsJmRhdGEtPmJ5dGUpOworCisJfSBlbHNlIGlmIChzaXplID09IEkyQ19TTUJVU19CWVRFX0RBVEEpIHsKKwkJYWRkciA8PD0gMTsKKworCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpCisgCQkJZXJyID0gdzk5NjhjZl9pMmNfYWRhcF9mYXN0d3JpdGVfYnl0ZV9kYXRhKGNhbSwgYWRkciwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLCBkYXRhLT5ieXRlKTsKKwkJZWxzZSBpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkgeworCQkJZm9yIChpID0gMTsgaSA8PSBXOTk2OENGX0kyQ19SV19SRVRSSUVTOyBpKyspIHsKKwkJCQllcnIgPSB3OTk2OGNmX2kyY19hZGFwX3JlYWRfYnl0ZV9kYXRhKGNhbSxhZGRyLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLCAmZGF0YS0+Ynl0ZSk7CisJCQkJaWYgKGVycikgeworCQkJCQlpZiAodzk5NjhjZl9zbWJ1c19yZWZyZXNoX2J1cyhjYW0pKSB7CisJCQkJCQllcnIgPSAtRUlPOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCX0gZWxzZSB7CisJCURCRyg0LCAiVW5zdXBwb3J0ZWQgSTJDIHRyYW5zZmVyIG1vZGUgKCVkKSIsIHNpemUpCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHUzMiB3OTk2OGNmX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciogYWRhcCkKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFIHwKKwkgICAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEEgIHwKKwkgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBOworfQorCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9pMmNfYXR0YWNoX2luZm9ybShzdHJ1Y3QgaTJjX2NsaWVudCogY2xpZW50KQoreworCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtID0gaTJjX2dldF9hZGFwZGF0YShjbGllbnQtPmFkYXB0ZXIpOworCWNvbnN0IGNoYXIqIGNsaWVudG5hbWUgPSBpMmNfY2xpZW50bmFtZShjbGllbnQpOworCWludCBpZCA9IGNsaWVudC0+ZHJpdmVyLT5pZCwgZXJyID0gMDsKKworCWlmIChpZCA9PSBJMkNfRFJJVkVSSURfT1ZDQU1DSElQKSB7CisJCWNhbS0+c2Vuc29yX2NsaWVudCA9IGNsaWVudDsKKwkJZXJyID0gdzk5NjhjZl9zZW5zb3JfaW5pdChjYW0pOworCQlpZiAoZXJyKSB7CisJCQljYW0tPnNlbnNvcl9jbGllbnQgPSBOVUxMOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCURCRyg0LCAiUmVqZWN0ZWQgY2xpZW50IFslc10gd2l0aCBkcml2ZXIgWyVzXSIsIAorCQkgICAgY2xpZW50bmFtZSwgY2xpZW50LT5kcml2ZXItPm5hbWUpCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCURCRyg1LCAiSTJDIGF0dGFjaCBjbGllbnQgWyVzXSB3aXRoIGRyaXZlciBbJXNdIiwKKwkgICAgY2xpZW50bmFtZSwgY2xpZW50LT5kcml2ZXItPm5hbWUpCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHc5OTY4Y2ZfaTJjX2RldGFjaF9pbmZvcm0oc3RydWN0IGkyY19jbGllbnQqIGNsaWVudCkKK3sKKwlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKwljb25zdCBjaGFyKiBjbGllbnRuYW1lID0gaTJjX2NsaWVudG5hbWUoY2xpZW50KTsKKworCWlmIChjYW0tPnNlbnNvcl9jbGllbnQgPT0gY2xpZW50KQorCQljYW0tPnNlbnNvcl9jbGllbnQgPSBOVUxMOworCisJREJHKDUsICJJMkMgZGV0YWNoIGNsaWVudCBbJXNdIiwgY2xpZW50bmFtZSkKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgCit3OTk2OGNmX2kyY19jb250cm9sKHN0cnVjdCBpMmNfYWRhcHRlciogYWRhcHRlciwgdW5zaWduZWQgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB3OTk2OGNmX2kyY19pbml0KHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGFsZ28gPSB7CisJCS5uYW1lID0gICAgICAgICAgIlc5OTZbODddQ0YgYWxnb3JpdGhtIiwKKwkJLmlkID0gICAgICAgICAgICBJMkNfQUxHT19TTUJVUywKKwkJLnNtYnVzX3hmZXIgPSAgICB3OTk2OGNmX2kyY19zbWJ1c194ZmVyLAorCQkuYWxnb19jb250cm9sID0gIHc5OTY4Y2ZfaTJjX2NvbnRyb2wsCisJCS5mdW5jdGlvbmFsaXR5ID0gdzk5NjhjZl9pMmNfZnVuYywKKwl9OworCisJc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBhZGFwID0geworCQkuaWQgPSAgICAgICAgICAgICAgICBJMkNfQUxHT19TTUJVUyB8IEkyQ19IV19TTUJVU19XOTk2OENGLAorCQkuY2xhc3MgPSAgICAgICAgICAgICBJMkNfQ0xBU1NfQ0FNX0RJR0lUQUwsCisJCS5vd25lciA9ICAgICAgICAgICAgIFRISVNfTU9EVUxFLAorCQkuY2xpZW50X3JlZ2lzdGVyID0gICB3OTk2OGNmX2kyY19hdHRhY2hfaW5mb3JtLAorCQkuY2xpZW50X3VucmVnaXN0ZXIgPSB3OTk2OGNmX2kyY19kZXRhY2hfaW5mb3JtLAorCQkuYWxnbyA9ICAgICAgICAgICAgICAmYWxnbywKKwl9OworCisJbWVtY3B5KCZjYW0tPmkyY19hZGFwdGVyLCAmYWRhcCwgc2l6ZW9mKHN0cnVjdCBpMmNfYWRhcHRlcikpOworCXN0cmNweShjYW0tPmkyY19hZGFwdGVyLm5hbWUsICJ3OTk2OGNmIik7CisJaTJjX3NldF9hZGFwZGF0YSgmY2FtLT5pMmNfYWRhcHRlciwgY2FtKTsKKworCURCRyg2LCAiUmVnaXN0ZXJpbmcgSTJDIGFkYXB0ZXIgd2l0aCBrZXJuZWwuLi4iKQorCisJZXJyID0gaTJjX2FkZF9hZGFwdGVyKCZjYW0tPmkyY19hZGFwdGVyKTsKKwlpZiAoZXJyKQorCQlEQkcoMSwgIkZhaWxlZCB0byByZWdpc3RlciB0aGUgSTJDIGFkYXB0ZXIiKQorCWVsc2UKKwkJREJHKDUsICJJMkMgYWRhcHRlciByZWdpc3RlcmVkIikKKworCXJldHVybiBlcnI7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGVscGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFR1cm4gb24gdGhlIExFRCBvbiBzb21lIHdlYmNhbXMuIEEgYmVlcCBzaG91bGQgYmUgaGVhcmQgdG9vLgorICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdzk5NjhjZl90dXJuX29uX2xlZChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4ZmYwMCwgMHgwMCk7IC8qIHBvd2VyLWRvd24gKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweGJmMTcsIDB4MDApOyAvKiByZXNldCBldmVyeXRoaW5nICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHhiZjEwLCAweDAwKTsgLyogbm9ybWFsIG9wZXJhdGlvbiAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAxMCwgMHgwMSk7IC8qIHNlcmlhbCBidXMsIFNEUyBoaWdoICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDAxKTsgLyogc2VyaWFsIGJ1cywgU0RTIGxvdyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAxMCwgMHgwMSk7IC8qIC4uaGlnaCAnYmVlcC1iZWVwJyAqLworCisJaWYgKGVycikKKwkJREJHKDIsICJDb3VsZG4ndCB0dXJuIG9uIHRoZSBMRUQiKQorCisJREJHKDUsICJMRUQgdHVybmVkIG9uIikKKworCXJldHVybiBlcnI7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBXcml0ZSBzb21lIHJlZ2lzdGVycyBmb3IgdGhlIGRldmljZSBpbml0aWFsaXphdGlvbi4KKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBvbiBvcGVuKCkuCisgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3OTk2OGNmX2luaXRfY2hpcChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGh3X2J1ZnNpemUgPSBjYW0tPm1heHdpZHRoKmNhbS0+bWF4aGVpZ2h0KjIsCisJICAgICAgICAgICAgICB5MCA9IDB4MDAwMCwKKwkgICAgICAgICAgICAgIHUwID0geTAgKyBod19idWZzaXplLzIsCisJICAgICAgICAgICAgICB2MCA9IHUwICsgaHdfYnVmc2l6ZS80LAorCSAgICAgICAgICAgICAgeTEgPSB2MCArIGh3X2J1ZnNpemUvNCwKKwkgICAgICAgICAgICAgIHUxID0geTEgKyBod19idWZzaXplLzIsCisJICAgICAgICAgICAgICB2MSA9IHUxICsgaHdfYnVmc2l6ZS80OworCWludCBlcnIgPSAwOworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHhmZjAwLCAweDAwKTsgLyogcG93ZXIgb2ZmICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHhiZjEwLCAweDAwKTsgLyogcG93ZXIgb24gKi8KKworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4NDA1ZCwgMHgwMyk7IC8qIERSQU0gdGltaW5ncyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAzMCwgMHgwNCk7IC8qIFNEUkFNIHRpbWluZ3MgKi8KKworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHkwICYgMHhmZmZmLCAweDIwKTsgLyogWSBidWYuMCwgbG93ICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgeTAgPj4gMTYsIDB4MjEpOyAgICAvKiBZIGJ1Zi4wLCBoaWdoICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdTAgJiAweGZmZmYsIDB4MjQpOyAvKiBVIGJ1Zi4wLCBsb3cgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB1MCA+PiAxNiwgMHgyNSk7ICAgIC8qIFUgYnVmLjAsIGhpZ2ggKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB2MCAmIDB4ZmZmZiwgMHgyOCk7IC8qIFYgYnVmLjAsIGxvdyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHYwID4+IDE2LCAweDI5KTsgICAgLyogViBidWYuMCwgaGlnaCAqLworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgeTEgJiAweGZmZmYsIDB4MjIpOyAvKiBZIGJ1Zi4xLCBsb3cgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB5MSA+PiAxNiwgMHgyMyk7ICAgIC8qIFkgYnVmLjEsIGhpZ2ggKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB1MSAmIDB4ZmZmZiwgMHgyNik7IC8qIFUgYnVmLjEsIGxvdyAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHUxID4+IDE2LCAweDI3KTsgICAgLyogVSBidWYuMSwgaGlnaCAqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHYxICYgMHhmZmZmLCAweDJhKTsgLyogViBidWYuMSwgbG93ICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgdjEgPj4gMTYsIDB4MmIpOyAgICAvKiBWIGJ1Zi4xLCBoaWdoICovCisKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB5MSAmIDB4ZmZmZiwgMHgzMik7IC8qIEpQRUcgYnVmIDAgbG93ICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgeTEgPj4gMTYsIDB4MzMpOyAgICAvKiBKUEVHIGJ1ZiAwIGhpZ2ggKi8KKworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHkxICYgMHhmZmZmLCAweDM0KTsgLyogSlBFRyBidWYgMSBsb3cgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB5MSA+PiAxNiwgMHgzNSk7ICAgIC8qIEpQRUcgYnVnIDEgaGlnaCAqLworCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDM2KTsvKiBKUEVHIHJlc3RhcnQgaW50ZXJ2YWwgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCAweDA4MDQsIDB4MzcpOy8qSlBFRyBWTEUgRklGTyB0aHJlc2hvbGQqLworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIDB4MDAwMCwgMHgzOCk7LyogZGlzYWJsZSBodyB1cC1zY2FsaW5nICovCisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDNmKTsgLyogSlBFRy9NQ1RMIHRlc3QgZGF0YSAqLworCisJZXJyICs9IHc5OTY4Y2Zfc2V0X3BpY3R1cmUoY2FtLCBjYW0tPnBpY3R1cmUpOyAvKiB0aGlzIGJlZm9yZSAqLworCWVyciArPSB3OTk2OGNmX3NldF93aW5kb3coY2FtLCBjYW0tPndpbmRvdyk7CisKKwlpZiAoZXJyKQorCQlEQkcoMSwgIkNoaXAgaW5pdGlhbGl6YXRpb24gZmFpbGVkIikKKwllbHNlCisJCURCRyg1LCAiQ2hpcCBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQiKQorCisJcmV0dXJuIGVycjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJldHVybiBub24temVybyBpZiB0aGUgcGFsZXR0ZSBpcyBzdXBwb3J0ZWQsIDAgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW5saW5lIHUxNiB3OTk2OGNmX3ZhbGlkX3BhbGV0dGUodTE2IHBhbGV0dGUpCit7CisJdTggaSA9IDA7CisJd2hpbGUgKHc5OTY4Y2ZfZm9ybWF0bGlzdFtpXS5wYWxldHRlICE9IDApIHsKKwkJaWYgKHBhbGV0dGUgPT0gdzk5NjhjZl9mb3JtYXRsaXN0W2ldLnBhbGV0dGUpCisJCQlyZXR1cm4gcGFsZXR0ZTsKKwkJaSsrOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJldHVybiB0aGUgZGVwdGggY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcGFsZXR0ZS4KKyAgUGFsZXR0ZSBfbXVzdF8gYmUgc3VwcG9ydGVkICEKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGlubGluZSB1MTYgdzk5NjhjZl92YWxpZF9kZXB0aCh1MTYgcGFsZXR0ZSkKK3sKKwl1OCBpPTA7CisJd2hpbGUgKHc5OTY4Y2ZfZm9ybWF0bGlzdFtpXS5wYWxldHRlICE9IHBhbGV0dGUpCisJCWkrKzsKKworCXJldHVybiB3OTk2OGNmX2Zvcm1hdGxpc3RbaV0uZGVwdGg7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIGZvcm1hdCByZXF1aXJlcyBkZWNvbXByZXNzaW9uLCAwIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGlubGluZSB1OCB3OTk2OGNmX25lZWRfZGVjb21wcmVzc2lvbih1MTYgcGFsZXR0ZSkKK3sKKwl1OCBpID0gMDsKKwl3aGlsZSAodzk5NjhjZl9mb3JtYXRsaXN0W2ldLnBhbGV0dGUgIT0gMCkgeworCQlpZiAocGFsZXR0ZSA9PSB3OTk2OGNmX2Zvcm1hdGxpc3RbaV0ucGFsZXR0ZSkKKwkJCXJldHVybiB3OTk2OGNmX2Zvcm1hdGxpc3RbaV0uY29tcHJlc3Npb247CisJCWkrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBDaGFuZ2UgdGhlIHBpY3R1cmUgc2V0dGluZ3Mgb2YgdGhlIGNhbWVyYS4KKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50Cit3OTk2OGNmX3NldF9waWN0dXJlKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCBzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0KQoreworCXUxNiBmbXQsIGh3X2RlcHRoLCBod19wYWxldHRlLCByZWdfdiA9IDB4MDAwMDsKKwlpbnQgZXJyID0gMDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgdXNpbmcgYSB2YWxpZCBkZXB0aCAqLworCXBpY3QuZGVwdGggPSB3OTk2OGNmX3ZhbGlkX2RlcHRoKHBpY3QucGFsZXR0ZSk7CisKKwlmbXQgPSBwaWN0LnBhbGV0dGU7CisKKwlod19kZXB0aCA9IHBpY3QuZGVwdGg7IC8qIGRlcHRoIHVzZWQgYnkgdGhlIHdpbmJvbmQgY2hpcCAqLworCWh3X3BhbGV0dGUgPSBwaWN0LnBhbGV0dGU7IC8qIHBhbGV0dGUgdXNlZCBieSB0aGUgd2luYm9uZCBjaGlwICovCisKKwkvKiBWUyAmIEhTIHBvbGFyaXRpZXMgKi8KKwlyZWdfdiA9IChjYW0tPnZzX3BvbGFyaXR5IDw8IDEyKSB8IChjYW0tPmhzX3BvbGFyaXR5IDw8IDExKTsKKworCXN3aXRjaCAoZm10KQorCXsKKwkJY2FzZSBWSURFT19QQUxFVFRFX1VZVlk6CisJCQlyZWdfdiB8PSAweDAwMDA7CisJCQljYW0tPnZwcF9mbGFnID0gVlBQX05PTkU7CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMlA6CisJCQlyZWdfdiB8PSAweDAwMDI7CisJCQljYW0tPnZwcF9mbGFnID0gVlBQX0RFQ09NUFJFU1NJT047CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMDoKKwkJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMFA6CisJCQlyZWdfdiB8PSAweDAwMDM7CisJCQljYW0tPnZwcF9mbGFnID0gVlBQX0RFQ09NUFJFU1NJT047CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19QQUxFVFRFX1lVWVY6CisJCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjI6CisJCQlyZWdfdiB8PSAweDAwMDA7CisJCQljYW0tPnZwcF9mbGFnID0gVlBQX1NXQVBfWVVWX0JZVEVTOworCQkJaHdfcGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfVVlWWTsKKwkJCWJyZWFrOworCQkvKiBPcmlnaW5hbCB2aWRlbyBpcyB1c2VkIGluc3RlYWQgb2YgUkdCWCBwYWxldHRlcy4gCisJCSAgIFNvZnR3YXJlIGNvbnZlcnNpb24gbGF0ZXIuICovCisJCWNhc2UgVklERU9fUEFMRVRURV9HUkVZOgorCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCNTU1OgorCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCNTY1OgorCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCMjQ6CisJCWNhc2UgVklERU9fUEFMRVRURV9SR0IzMjoKKwkJCXJlZ192IHw9IDB4MDAwMDsgLyogVVlWWSAxNiBiaXQgaXMgdXNlZCAqLworCQkJaHdfZGVwdGggPSAxNjsKKwkJCWh3X3BhbGV0dGUgPSBWSURFT19QQUxFVFRFX1VZVlk7CisJCQljYW0tPnZwcF9mbGFnID0gVlBQX1VZVllfVE9fUkdCWDsKKwkJCWJyZWFrOworCX0KKworCS8qIE5PVEU6IGR1ZSB0byBtZW1vcnkgaXNzdWVzLCBpdCBpcyBiZXR0ZXIgdG8gZGlzYWJsZSB0aGUgaGFyZHdhcmUKKwkgICAgICAgICBkb3VibGUgYnVmZmVyaW5nIGR1cmluZyBjb21wcmVzc2lvbiAqLworCWlmIChjYW0tPmRvdWJsZV9idWZmZXIgJiYgIShjYW0tPnZwcF9mbGFnICYgVlBQX0RFQ09NUFJFU1NJT04pKQorCQlyZWdfdiB8PSAweDAwODA7CisKKwlpZiAoY2FtLT5jbGFtcGluZykKKwkJcmVnX3YgfD0gMHgwMDIwOworCisJaWYgKGNhbS0+ZmlsdGVyX3R5cGUgPT0gMSkKKwkJcmVnX3YgfD0gMHgwMDA4OworCWVsc2UgaWYgKGNhbS0+ZmlsdGVyX3R5cGUgPT0gMikKKwkJcmVnX3YgfD0gMHgwMDBjOworCisJaWYgKChlcnIgPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHJlZ192LCAweDE2KSkpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoKGVyciA9IHc5OTY4Y2Zfc2Vuc29yX3VwZGF0ZV9waWN0dXJlKGNhbSwgcGljdCkpKQorCQlnb3RvIGVycm9yOworCisJLyogSWYgYWxsIHdlbnQgd2VsbCwgdXBkYXRlIHRoZSBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgKi8KKwltZW1jcHkoJmNhbS0+cGljdHVyZSwgJnBpY3QsIHNpemVvZihwaWN0KSk7CisJY2FtLT5od19kZXB0aCA9IGh3X2RlcHRoOworCWNhbS0+aHdfcGFsZXR0ZSA9IGh3X3BhbGV0dGU7CisKKwkvKiBTZXR0aW5ncyBjaGFuZ2VkLCBzbyB3ZSBjbGVhciB0aGUgZnJhbWUgYnVmZmVycyAqLworCW1lbXNldChjYW0tPmZyYW1lWzBdLmJ1ZmZlciwgMCwgY2FtLT5uYnVmZmVycypjYW0tPmZyYW1lWzBdLnNpemUpOworCisJREJHKDQsICJQYWxldHRlIGlzICVzLCBkZXB0aCBpcyAldSBicHAiLAorCSAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBwaWN0LnBhbGV0dGUpLCBwaWN0LmRlcHRoKQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCURCRygxLCAiRmFpbGVkIHRvIGNoYW5nZSBwaWN0dXJlIHNldHRpbmdzIikKKwlyZXR1cm4gZXJyOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQ2hhbmdlIHRoZSBjYXB0dXJlIGFyZWEgc2l6ZSBvZiB0aGUgY2FtZXJhLgorICBUaGlzIGZ1bmN0aW9uIF9tdXN0XyBiZSBjYWxsZWQgX2FmdGVyXyB3OTk2OGNmX3NldF9waWN0dXJlKCkuCisgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludAordzk5NjhjZl9zZXRfd2luZG93KHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCBzdHJ1Y3QgdmlkZW9fd2luZG93IHdpbikKK3sKKwl1MTYgeCwgeSwgdywgaCwgc2N4LCBzY3ksIGN3LCBjaCwgYXgsIGF5OworCXVuc2lnbmVkIGxvbmcgZncsIGZoOworCXN0cnVjdCBvdmNhbWNoaXBfd2luZG93IHNfd2luOworCWludCBlcnIgPSAwOworCisJLyogV29yayBhcm91bmQgdG8gYXZvaWQgRlAgYXJpdGhtZXRpY3MgKi8KKwkjZGVmaW5lIF9fU0MoeCkgKCh4KSA8PCAxMCkKKwkjZGVmaW5lIF9fVU5TQyh4KSAoKHgpID4+IDEwKQorCisJLyogTWFrZSBzdXJlIHdlIGFyZSB1c2luZyBhIHN1cHBvcnRlZCByZXNvbHV0aW9uICovCisJaWYgKChlcnIgPSB3OTk2OGNmX2FkanVzdF93aW5kb3dfc2l6ZShjYW0sICh1MTYqKSZ3aW4ud2lkdGgsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNiopJndpbi5oZWlnaHQpKSkKKwkJZ290byBlcnJvcjsKKworCS8qIFNjYWxpbmcgZmFjdG9ycyAqLworCWZ3ID0gX19TQyh3aW4ud2lkdGgpIC8gY2FtLT5tYXh3aWR0aDsKKwlmaCA9IF9fU0Mod2luLmhlaWdodCkgLyBjYW0tPm1heGhlaWdodDsKKworCS8qIFNldCB1cCB0aGUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgdXNlZCBieSB0aGUgY2hpcCAqLworCWlmICgod2luLndpZHRoID4gY2FtLT5tYXh3aWR0aCkgfHwgKHdpbi5oZWlnaHQgPiBjYW0tPm1heGhlaWdodCkpIHsKKwkJY2FtLT52cHBfZmxhZyB8PSBWUFBfVVBTQ0FMRTsKKwkJLyogQ2FsY3VsYXRlIGxhcmdlc3QgdyxoIG1hbnRhaW5pbmcgdGhlIHNhbWUgdy9oIHJhdGlvICovCisJCXcgPSAoZncgPj0gZmgpID8gY2FtLT5tYXh3aWR0aCA6IF9fU0Mod2luLndpZHRoKS9maDsKKwkJaCA9IChmdyA+PSBmaCkgPyBfX1NDKHdpbi5oZWlnaHQpL2Z3IDogY2FtLT5tYXhoZWlnaHQ7CisJCWlmICh3IDwgY2FtLT5taW53aWR0aCkgLyoganVzdCBpbiBjYXNlICovCisJCQl3ID0gY2FtLT5taW53aWR0aDsKKwkJaWYgKGggPCBjYW0tPm1pbmhlaWdodCkgLyoganVzdCBpbiBjYXNlICovCisJCQloID0gY2FtLT5taW5oZWlnaHQ7CisJfSBlbHNlIHsKKwkJY2FtLT52cHBfZmxhZyAmPSB+VlBQX1VQU0NBTEU7CisJCXcgPSB3aW4ud2lkdGg7CisJCWggPSB3aW4uaGVpZ2h0OworCX0KKworCS8qIHgseSBvZmZzZXRzIG9mIHRoZSBjcm9wcGVkIGFyZWEgKi8KKwlzY3ggPSBjYW0tPnN0YXJ0X2Nyb3B4OworCXNjeSA9IGNhbS0+c3RhcnRfY3JvcHk7CisKKwkvKiBDYWxjdWxhdGUgY3JvcHBlZCBhcmVhIG1hbnRlaW5pbmcgdGhlIHJpZ2h0IHcvaCByYXRpbyAqLworCWlmIChjYW0tPmxhcmdldmlldyAmJiAhKGNhbS0+dnBwX2ZsYWcgJiBWUFBfVVBTQ0FMRSkpIHsKKwkJY3cgPSAoZncgPj0gZmgpID8gY2FtLT5tYXh3aWR0aCA6IF9fU0Mod2luLndpZHRoKS9maDsKKwkJY2ggPSAoZncgPj0gZmgpID8gX19TQyh3aW4uaGVpZ2h0KS9mdyA6IGNhbS0+bWF4aGVpZ2h0OworCX0gZWxzZSB7CisJCWN3ID0gdzsKKwkJY2ggPSBoOworCX0KKworCS8qIFNldHVwIHRoZSB3aW5kb3cgb2YgdGhlIHNlbnNvciAqLworCXNfd2luLmZvcm1hdCA9IFZJREVPX1BBTEVUVEVfVVlWWTsKKwlzX3dpbi53aWR0aCA9IGNhbS0+bWF4d2lkdGg7CisJc193aW4uaGVpZ2h0ID0gY2FtLT5tYXhoZWlnaHQ7CisJc193aW4ucXVhcnRlciA9IDA7IC8qIGZ1bGwgcHJvZ3Jlc3NpdmUgdmlkZW8gKi8KKworCS8qIENlbnRlciBpdCAqLworCXNfd2luLnggPSAoc193aW4ud2lkdGggLSBjdykgLyAyOworCXNfd2luLnkgPSAoc193aW4uaGVpZ2h0IC0gY2gpIC8gMjsKKworCS8qIENsb2NrIGRpdmlzb3IgKi8KKwlpZiAoY2FtLT5jbG9ja2RpdiA+PSAwKQorCQlzX3dpbi5jbG9ja2RpdiA9IGNhbS0+Y2xvY2tkaXY7IC8qIG1hbnVhbCBvdmVycmlkZSAqLworCWVsc2UKKwkJc3dpdGNoIChjYW0tPnNlbnNvcikgeworCQkJY2FzZSBDQ19PVjY2MjA6CisJCQkJc193aW4uY2xvY2tkaXYgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBDQ19PVjY2MzA6CisJCQkJc193aW4uY2xvY2tkaXYgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBDQ19PVjc2QkU6CisJCQljYXNlIENDX09WNzYxMDoKKwkJCWNhc2UgQ0NfT1Y3NjIwOgorCQkJCXNfd2luLmNsb2NrZGl2ID0gMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc193aW4uY2xvY2tkaXYgPSBXOTk2OENGX0RFRl9DTE9DS0RJVklTT1I7CisJCX0KKworCS8qIFdlIGhhdmUgdG8gc2NhbGUgd2luLnggYW5kIHdpbi55IG9mZnNldHMgKi8KKwlpZiAoIChjYW0tPmxhcmdldmlldyAmJiAhKGNhbS0+dnBwX2ZsYWcgJiBWUFBfVVBTQ0FMRSkpCisJICAgICB8fCAoY2FtLT52cHBfZmxhZyAmIFZQUF9VUFNDQUxFKSApIHsKKwkJYXggPSBfX1NDKHdpbi54KS9mdzsKKwkJYXkgPSBfX1NDKHdpbi55KS9maDsKKwl9IGVsc2UgeworCQlheCA9IHdpbi54OworCQlheSA9IHdpbi55OworCX0KKworCWlmICgoYXggKyBjdykgPiBjYW0tPm1heHdpZHRoKQorCQlheCA9IGNhbS0+bWF4d2lkdGggLSBjdzsKKworCWlmICgoYXkgKyBjaCkgPiBjYW0tPm1heGhlaWdodCkKKwkJYXkgPSBjYW0tPm1heGhlaWdodCAtIGNoOworCisJLyogQWRqdXN0IHdpbi54LCB3aW4ueSAqLworCWlmICggKGNhbS0+bGFyZ2V2aWV3ICYmICEoY2FtLT52cHBfZmxhZyAmIFZQUF9VUFNDQUxFKSkKKwkgICAgIHx8IChjYW0tPnZwcF9mbGFnICYgVlBQX1VQU0NBTEUpICkgeworCQl3aW4ueCA9IF9fVU5TQyhheCpmdyk7CisJCXdpbi55ID0gX19VTlNDKGF5KmZoKTsKKwl9IGVsc2UgeworCQl3aW4ueCA9IGF4OworCQl3aW4ueSA9IGF5OworCX0KKworCS8qIE9mZnNldHMgdXNlZCBieSB0aGUgY2hpcCAqLworCXggPSBheCArIHNfd2luLng7CisJeSA9IGF5ICsgc193aW4ueTsKKworCS8qIEdvICEgKi8KKwlpZiAoKGVyciA9IHc5OTY4Y2Zfc2Vuc29yX2NtZChjYW0sIE9WQ0FNQ0hJUF9DTURfU19NT0RFLCAmc193aW4pKSkKKwkJZ290byBlcnJvcjsKKworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHNjeCArIHgsIDB4MTApOworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHNjeSArIHksIDB4MTEpOworCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHNjeCArIHggKyBjdywgMHgxMik7CisJZXJyICs9IHc5OTY4Y2Zfd3JpdGVfcmVnKGNhbSwgc2N5ICsgeSArIGNoLCAweDEzKTsKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB3LCAweDE0KTsKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCBoLCAweDE1KTsKKworCS8qIEpQRUcgd2lkdGggJiBoZWlnaHQgKi8KKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCB3LCAweDMwKTsKKwllcnIgKz0gdzk5NjhjZl93cml0ZV9yZWcoY2FtLCBoLCAweDMxKTsKKworCS8qIFkgJiBVViBmcmFtZSBidWZmZXIgc3RyaWRlcyAoaW4gV09SRCkgKi8KKwlpZiAoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKSB7CisJCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHcvMiwgMHgyYyk7CisJCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHcvNCwgMHgyZCk7CisJfSBlbHNlCisJCWVyciArPSB3OTk2OGNmX3dyaXRlX3JlZyhjYW0sIHcsIDB4MmMpOworCisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCS8qIElmIGFsbCB3ZW50IHdlbGwsIHVwZGF0ZSB0aGUgZGV2aWNlIGRhdGEgc3RydWN0dXJlICovCisJbWVtY3B5KCZjYW0tPndpbmRvdywgJndpbiwgc2l6ZW9mKHdpbikpOworCWNhbS0+aHdfd2lkdGggPSB3OworCWNhbS0+aHdfaGVpZ2h0ID0gaDsKKworCS8qIFNldHRpbmdzIGNoYW5nZWQsIHNvIHdlIGNsZWFyIHRoZSBmcmFtZSBidWZmZXJzICovCisJbWVtc2V0KGNhbS0+ZnJhbWVbMF0uYnVmZmVyLCAwLCBjYW0tPm5idWZmZXJzKmNhbS0+ZnJhbWVbMF0uc2l6ZSk7CisKKwlEQkcoNCwgIlRoZSBjYXB0dXJlIGFyZWEgaXMgJWR4JWQsIE9mZnNldCAoeCx5KT0oJXUsJXUpIiwgCisJICAgIHdpbi53aWR0aCwgd2luLmhlaWdodCwgd2luLngsIHdpbi55KQorCisJUERCR0coIng9JXUgLHk9JXUsIHc9JXUsIGg9JXUsIGF4PSV1LCBheT0ldSwgc193aW4ueD0ldSwgc193aW4ueT0ldSwgIgorCSAgICAgICJjdz0ldSwgY2g9JXUsIHdpbi54PSV1LCB3aW4ueT0ldSwgd2luLndpZHRoPSV1LCB3aW4uaGVpZ2h0PSV1IiwKKwkgICAgICB4LCB5LCB3LCBoLCBheCwgYXksIHNfd2luLngsIHNfd2luLnksIGN3LCBjaCwgd2luLngsIHdpbi55LAorCSAgICAgIHdpbi53aWR0aCwgd2luLmhlaWdodCkKKworCXJldHVybiAwOworCitlcnJvcjoKKwlEQkcoMSwgIkZhaWxlZCB0byBjaGFuZ2UgdGhlIGNhcHR1cmUgYXJlYSBzaXplIikKKwlyZXR1cm4gZXJyOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgIEFkanVzdCB0aGUgYXNrZWQgdmFsdWVzIGZvciB3aW5kb3cgd2lkdGggYW5kIGhlaWdodC4KKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IAordzk5NjhjZl9hZGp1c3Rfd2luZG93X3NpemUoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHUxNiogd2lkdGgsIHUxNiogaGVpZ2h0KQoreworCXUxNiBtYXh3LCBtYXhoOworCisJaWYgKCgqd2lkdGggPCBjYW0tPm1pbndpZHRoKSB8fCAoKmhlaWdodCA8IGNhbS0+bWluaGVpZ2h0KSkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwltYXh3ID0gY2FtLT51cHNjYWxpbmcgJiYgIShjYW0tPnZwcF9mbGFnICYgVlBQX0RFQ09NUFJFU1NJT04pICYmCisJICAgICAgIHc5OTY4Y2ZfdnBwID8gbWF4KCh1MTYpVzk5NjhDRl9NQVhfV0lEVEgsIGNhbS0+bWF4d2lkdGgpCisJICAgICAgICAgICAgICAgICAgIDogY2FtLT5tYXh3aWR0aDsKKwltYXhoID0gY2FtLT51cHNjYWxpbmcgJiYgIShjYW0tPnZwcF9mbGFnICYgVlBQX0RFQ09NUFJFU1NJT04pICYmCisJICAgICAgIHc5OTY4Y2ZfdnBwID8gbWF4KCh1MTYpVzk5NjhDRl9NQVhfSEVJR0hULCBjYW0tPm1heGhlaWdodCkKKwkgICAgICAgICAgICAgICAgICAgOiBjYW0tPm1heGhlaWdodDsKKworCWlmICgqd2lkdGggPiBtYXh3KQorCQkqd2lkdGggPSBtYXh3OworCWlmICgqaGVpZ2h0ID4gbWF4aCkKKwkJKmhlaWdodCA9IG1heGg7CisKKwlpZiAoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKSB7CisJCSp3aWR0aCAgJj0gfjE1TDsgLyogbXVsdGlwbGUgb2YgMTYgKi8KKwkJKmhlaWdodCAmPSB+MTVMOworCX0KKworCVBEQkdHKCJXaW5kb3cgc2l6ZSBhZGp1c3RlZCB3PSV1LCBoPSV1ICIsICp3aWR0aCwgKmhlaWdodCkKKworCXJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSW5pdGlhbGl6ZSB0aGUgRklGTyBsaXN0IG9mIHJlcXVlc3RlZCBmcmFtZXMuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfaW5pdF9mcmFtZWxpc3Qoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJdTggaTsKKworCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzOyBpKyspIHsKKwkJY2FtLT5yZXF1ZXN0ZWRfZnJhbWVbaV0gPSBOVUxMOworCQljYW0tPmZyYW1lW2ldLnF1ZXVlZCA9IDA7CisJCWNhbS0+ZnJhbWVbaV0uc3RhdHVzID0gRl9VTlVTRUQ7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQWRkIGEgZnJhbWUgaW4gdGhlIEZJRk8gbGlzdCBvZiByZXF1ZXN0ZWQgZnJhbWVzLgorICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQuCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfcHVzaF9mcmFtZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgdTggZl9udW0pCit7CisJdTggZjsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5mbGlzdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWZvciAoZj0wOyBjYW0tPnJlcXVlc3RlZF9mcmFtZVtmXSAhPSBOVUxMOyBmKyspOworCWNhbS0+cmVxdWVzdGVkX2ZyYW1lW2ZdID0gJmNhbS0+ZnJhbWVbZl9udW1dOworCWNhbS0+ZnJhbWVbZl9udW1dLnF1ZXVlZCA9IDE7CisJY2FtLT5mcmFtZVtmX251bV0uc3RhdHVzID0gRl9VTlVTRUQ7IC8qIGNsZWFyIHRoZSBzdGF0dXMgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+Zmxpc3RfbG9jaywgbG9ja19mbGFncyk7CisKKwlEQkcoNiwgIkZyYW1lICMldSBwdXNoZWQgaW50byB0aGUgRklGTyBsaXN0LiBQb3NpdGlvbiAldSIsIGZfbnVtLCBmKQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUmVhZCwgc3RvcmUgYW5kIHJlbW92ZSB0aGUgZmlyc3QgcG9pbnRlciBpbiB0aGUgRklGTyBsaXN0IG9mIHJlcXVlc3RlZAorICBmcmFtZXMuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCAKK3c5OTY4Y2ZfcG9wX2ZyYW1lKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCBzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiogZnJhbWVwKQoreworCXU4IGk7CisKKwlzcGluX2xvY2soJmNhbS0+Zmxpc3RfbG9jayk7CisKKwkqZnJhbWVwID0gY2FtLT5yZXF1ZXN0ZWRfZnJhbWVbMF07CisKKwkvKiBTaGlmdCB0aGUgbGlzdCBvZiBwb2ludGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzLTE7IGkrKykKKwkJY2FtLT5yZXF1ZXN0ZWRfZnJhbWVbaV0gPSBjYW0tPnJlcXVlc3RlZF9mcmFtZVtpKzFdOworCWNhbS0+cmVxdWVzdGVkX2ZyYW1lW2ldID0gTlVMTDsKKworCXNwaW5fdW5sb2NrKCZjYW0tPmZsaXN0X2xvY2spOworCisJREJHKDYsIlBvcHBlZCBmcmFtZSAjJWQgZnJvbSB0aGUgbGlzdCIsICgqZnJhbWVwKS0+bnVtYmVyKQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSGlnaC1sZXZlbCB2aWRlbyBwb3N0LXByb2Nlc3Npbmcgcm91dGluZSBvbiBncmFiYmVkIGZyYW1lcy4KKyAgUmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IAordzk5NjhjZl9wb3N0cHJvY2Vzc19mcmFtZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqIGZyKQoreworCXZvaWQgKnBJbiA9IGZyLT5idWZmZXIsICpwT3V0ID0gY2FtLT5mcmFtZV92cHAuYnVmZmVyLCAqdG1wOworCXUxNiB3ID0gY2FtLT53aW5kb3cud2lkdGgsCisJICAgIGggPSBjYW0tPndpbmRvdy5oZWlnaHQsCisJICAgIGQgPSBjYW0tPnBpY3R1cmUuZGVwdGgsCisJICAgIGZtdCA9IGNhbS0+cGljdHVyZS5wYWxldHRlLAorCSAgICByZ2IgPSBjYW0tPmZvcmNlX3JnYiwKKwkgICAgaHdfdyA9IGNhbS0+aHdfd2lkdGgsCisJICAgIGh3X2ggPSBjYW0tPmh3X2hlaWdodCwKKwkgICAgaHdfZCA9IGNhbS0+aHdfZGVwdGg7CisJaW50IGVyciA9IDA7CisKKwkjZGVmaW5lIF9QU1dBUChwSW4sIHBPdXQpIHt0bXAgPSAocEluKTsgKHBJbikgPSAocE91dCk7IChwT3V0KSA9IHRtcDt9CisKKwlpZiAoY2FtLT52cHBfZmxhZyAmIFZQUF9ERUNPTVBSRVNTSU9OKSB7CisJCW1lbWNweShwT3V0LCBwSW4sIGZyLT5sZW5ndGgpOworCQlfUFNXQVAocEluLCBwT3V0KQorCQllcnIgPSB3OTk2OGNmX3ZwcC0+ZGVjb2RlKHBJbiwgZnItPmxlbmd0aCwgaHdfdywgaHdfaCwgcE91dCk7CisJCVBEQkdHKCJDb21wcmVzc2VkIGZyYW1lIGxlbmd0aDogJWx1IiwodW5zaWduZWQgbG9uZylmci0+bGVuZ3RoKQorCQlmci0+bGVuZ3RoID0gKGh3X3cqaHdfaCpod19kKS84OworCQlfUFNXQVAocEluLCBwT3V0KQorCQlpZiAoZXJyKSB7CisJCQlEQkcoNCwgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGRlY29kaW5nIHRoZSBmcmFtZTogIgorCQkJICAgICAgICIlcyIsIHN5bWJvbGljKGRlY29kZXJfZXJybGlzdCwgZXJyKSkKKwkJCXJldHVybiBlcnI7CisJCX0gZWxzZQorCQkJREJHKDYsICJGcmFtZSBkZWNvZGVkIikKKwl9CisKKwlpZiAoY2FtLT52cHBfZmxhZyAmIFZQUF9TV0FQX1lVVl9CWVRFUykgeworCQl3OTk2OGNmX3ZwcC0+c3dhcF95dXZieXRlcyhwSW4sIGZyLT5sZW5ndGgpOworCQlEQkcoNiwgIk9yaWdpbmFsIFVZVlkgY29tcG9uZW50IG9yZGVyaW5nIGNoYW5nZWQiKQorCX0KKworCWlmIChjYW0tPnZwcF9mbGFnICYgVlBQX1VQU0NBTEUpIHsKKwkJdzk5NjhjZl92cHAtPnNjYWxlX3VwKHBJbiwgcE91dCwgaHdfdywgaHdfaCwgaHdfZCwgdywgaCk7CisJCWZyLT5sZW5ndGggPSAodypoKmh3X2QpLzg7CisJCV9QU1dBUChwSW4sIHBPdXQpCisJCURCRyg2LCAiVmVydGljYWwgdXAtc2NhbGluZyBkb25lOiAldSwldSwldWJwcC0+JXUsJXUiLAorCQkgICAgaHdfdywgaHdfaCwgaHdfZCwgdywgaCkKKwl9CisKKwlpZiAoY2FtLT52cHBfZmxhZyAmIFZQUF9VWVZZX1RPX1JHQlgpIHsKKwkJdzk5NjhjZl92cHAtPnV5dnlfdG9fcmdieChwSW4sIGZyLT5sZW5ndGgsIHBPdXQsIGZtdCwgcmdiKTsKKwkJZnItPmxlbmd0aCA9ICh3KmgqZCkvODsKKwkJX1BTV0FQKHBJbiwgcE91dCkKKwkJREJHKDYsICJVWVZZLTE2Yml0IHRvICVzIGNvbnZlcnNpb24gZG9uZSIsIAorCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgZm10KSkKKwl9CisKKwlpZiAocE91dCA9PSBmci0+YnVmZmVyKQorCQltZW1jcHkoZnItPmJ1ZmZlciwgY2FtLT5mcmFtZV92cHAuYnVmZmVyLCBmci0+bGVuZ3RoKTsKKworCXJldHVybiAwOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEltYWdlIHNlbnNvciBjb250cm9sIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCAKK3c5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtLCBpbnQgY2lkLCBpbnQgdmFsKQoreworCXN0cnVjdCBvdmNhbWNoaXBfY29udHJvbCBjdGw7CisJaW50IGVycjsKKworCWN0bC5pZCA9IGNpZDsKKwljdGwudmFsdWUgPSB2YWw7CisKKwllcnIgPSB3OTk2OGNmX3NlbnNvcl9jbWQoY2FtLCBPVkNBTUNISVBfQ01EX1NfQ1RSTCwgJmN0bCk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgCit3OTk2OGNmX3NlbnNvcl9nZXRfY29udHJvbChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgaW50IGNpZCwgaW50KiB2YWwpCit7CisJc3RydWN0IG92Y2FtY2hpcF9jb250cm9sIGN0bDsKKwlpbnQgZXJyOworCisJY3RsLmlkID0gY2lkOworCisJZXJyID0gdzk5NjhjZl9zZW5zb3JfY21kKGNhbSwgT1ZDQU1DSElQX0NNRF9HX0NUUkwsICZjdGwpOworCWlmICghZXJyKQorCQkqdmFsID0gY3RsLnZhbHVlOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50Cit3OTk2OGNmX3NlbnNvcl9jbWQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0sIHVuc2lnbmVkIGludCBjbWQsIHZvaWQqIGFyZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCogYyA9IGNhbS0+c2Vuc29yX2NsaWVudDsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFjIHx8ICFjLT5kcml2ZXIgfHwgIWMtPmRyaXZlci0+Y29tbWFuZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyYyA9IGMtPmRyaXZlci0+Y29tbWFuZChjLCBjbWQsIGFyZyk7CisJLyogVGhlIEkyQyBkcml2ZXIgcmV0dXJucyAtRVBFUk0gb24gbm9uLXN1cHBvcnRlZCBjb250cm9scyAqLworCXJldHVybiAocmMgPCAwICYmIHJjICE9IC1FUEVSTSkgPyByYyA6IDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBVcGRhdGUgc29tZSBzZXR0aW5ncyBvZiB0aGUgaW1hZ2Ugc2Vuc29yLgorICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl91cGRhdGVfc2V0dGluZ3Moc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwkvKiBBdXRvIGJyaWdodG5lc3MgKi8KKwllcnIgPSB3OTk2OGNmX3NlbnNvcl9zZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfQVVUT0JSSUdIVCwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5hdXRvX2JydCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIEF1dG8gZXhwb3N1cmUgKi8KKwllcnIgPSB3OTk2OGNmX3NlbnNvcl9zZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfQVVUT0VYUCwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5hdXRvX2V4cCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIEJhbmRpbmcgZmlsdGVyICovCisJZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0JBTkRGSUxULCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW0tPmJhbmRmaWx0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogTGlnaHQgZnJlcXVlbmN5ICovCisJZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0ZSRVEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5saWdodGZyZXEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBCYWNrIGxpZ2h0ICovCisJZXJyID0gdzk5NjhjZl9zZW5zb3Jfc2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0JBQ0tMSUdIVCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW0tPmJhY2tsaWdodCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIE1pcnJvciAqLworCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9NSVJST1IsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5taXJyb3IpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEdldCBzb21lIGN1cnJlbnQgcGljdHVyZSBzZXR0aW5ncyBmcm9tIHRoZSBpbWFnZSBzZW5zb3IgYW5kIHVwZGF0ZSB0aGUKKyAgaW50ZXJuYWwgJ3BpY3R1cmUnIHN0cnVjdHVyZSBvZiB0aGUgY2FtZXJhLgorICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3OTk2OGNmX3NlbnNvcl9nZXRfcGljdHVyZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyLCB2OworCisJZXJyID0gdzk5NjhjZl9zZW5zb3JfZ2V0X2NvbnRyb2woY2FtLCBPVkNBTUNISVBfQ0lEX0NPTlQsICZ2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWNhbS0+cGljdHVyZS5jb250cmFzdCA9IHY7CisKKwllcnIgPSB3OTk2OGNmX3NlbnNvcl9nZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfQlJJR0hULCAmdik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwljYW0tPnBpY3R1cmUuYnJpZ2h0bmVzcyA9IHY7CisKKwllcnIgPSB3OTk2OGNmX3NlbnNvcl9nZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfU0FULCAmdik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwljYW0tPnBpY3R1cmUuY29sb3VyID0gdjsKKworCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX2dldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9IVUUsICZ2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWNhbS0+cGljdHVyZS5odWUgPSB2OworCisJREJHKDUsICJHb3QgcGljdHVyZSBzZXR0aW5ncyBmcm9tIHRoZSBpbWFnZSBzZW5zb3IiKQorCisJUERCR0coIkJyaWdodG5lc3MsIGNvbnRyYXN0LCBodWUsIGNvbG91ciwgd2hpdGVuZXNzIGFyZSAiCisJICAgICAgIiV1LCV1LCV1LCV1LCV1IiwgY2FtLT5waWN0dXJlLmJyaWdodG5lc3MsY2FtLT5waWN0dXJlLmNvbnRyYXN0LAorCSAgICAgIGNhbS0+cGljdHVyZS5odWUsIGNhbS0+cGljdHVyZS5jb2xvdXIsIGNhbS0+cGljdHVyZS53aGl0ZW5lc3MpCisKKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFVwZGF0ZSBwaWN0dXJlIHNldHRpbmdzIG9mIHRoZSBpbWFnZSBzZW5zb3IuCisgIFJldHVybnM6IDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50Cit3OTk2OGNmX3NlbnNvcl91cGRhdGVfcGljdHVyZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0KQoreworCWludCBlcnIgPSAwOworCisJaWYgKCghY2FtLT5zZW5zb3JfaW5pdGlhbGl6ZWQpCisJICAgIHx8IHBpY3QuY29udHJhc3QgIT0gY2FtLT5waWN0dXJlLmNvbnRyYXN0KSB7CisJCWVyciA9IHc5OTY4Y2Zfc2Vuc29yX3NldF9jb250cm9sKGNhbSwgT1ZDQU1DSElQX0NJRF9DT05ULAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LmNvbnRyYXN0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbDsKKwkJREJHKDQsICJDb250cmFzdCBjaGFuZ2VkIGZyb20gJXUgdG8gJXUiLAorCQkgICAgY2FtLT5waWN0dXJlLmNvbnRyYXN0LCBwaWN0LmNvbnRyYXN0KQorCQljYW0tPnBpY3R1cmUuY29udHJhc3QgPSBwaWN0LmNvbnRyYXN0OworCX0KKworCWlmICgoKCFjYW0tPnNlbnNvcl9pbml0aWFsaXplZCkgfHwgCisJICAgIHBpY3QuYnJpZ2h0bmVzcyAhPSBjYW0tPnBpY3R1cmUuYnJpZ2h0bmVzcykgJiYgKCFjYW0tPmF1dG9fYnJ0KSkgeworCQllcnIgPSB3OTk2OGNmX3NlbnNvcl9zZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfQlJJR0hULCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC5icmlnaHRuZXNzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbDsKKwkJREJHKDQsICJCcmlnaHRuZXNzIGNoYW5nZWQgZnJvbSAldSB0byAldSIsCisJCSAgICBjYW0tPnBpY3R1cmUuYnJpZ2h0bmVzcywgcGljdC5icmlnaHRuZXNzKQorCQljYW0tPnBpY3R1cmUuYnJpZ2h0bmVzcyA9IHBpY3QuYnJpZ2h0bmVzczsKKwl9CisKKwlpZiAoKCFjYW0tPnNlbnNvcl9pbml0aWFsaXplZCkgfHwgcGljdC5jb2xvdXIgIT0gY2FtLT5waWN0dXJlLmNvbG91cikgeworCQllcnIgPSB3OTk2OGNmX3NlbnNvcl9zZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfU0FULCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC5jb2xvdXIpOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsOworCQlEQkcoNCwgIkNvbG91ciBjaGFuZ2VkIGZyb20gJXUgdG8gJXUiLAorCQkgICAgY2FtLT5waWN0dXJlLmNvbG91ciwgcGljdC5jb2xvdXIpCisJCWNhbS0+cGljdHVyZS5jb2xvdXIgPSBwaWN0LmNvbG91cjsKKwl9CisKKwlpZiAoKCFjYW0tPnNlbnNvcl9pbml0aWFsaXplZCkgfHwgcGljdC5odWUgIT0gY2FtLT5waWN0dXJlLmh1ZSkgeworCQllcnIgPSB3OTk2OGNmX3NlbnNvcl9zZXRfY29udHJvbChjYW0sIE9WQ0FNQ0hJUF9DSURfSFVFLCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC5odWUpOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsOworCQlEQkcoNCwgIkh1ZSBjaGFuZ2VkIGZyb20gJXUgdG8gJXUiLAorCQkgICAgY2FtLT5waWN0dXJlLmh1ZSwgcGljdC5odWUpCisJCWNhbS0+cGljdHVyZS5odWUgPSBwaWN0Lmh1ZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlEQkcoNCwgIkZhaWxlZCB0byBjaGFuZ2Ugc2Vuc29yIHBpY3R1cmUgc2V0dGluZyIpCisJcmV0dXJuIGVycjsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDYW1lcmEgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHN1cHBvcnRlZCBpbWFnZSBzZW5zb3IgaXMgZGV0ZWN0ZWQuCisgIFJldHVybiAwIGlmIHRoZSBpbml0aWFsaXphdGlvbiBzdWNjZWVkcywgYSBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHc5OTY4Y2Zfc2Vuc29yX2luaXQoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoKGVyciA9IHc5OTY4Y2Zfc2Vuc29yX2NtZChjYW0sIE9WQ0FNQ0hJUF9DTURfSU5JVElBTElaRSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbS0+bW9ub2Nocm9tZSkpKQorCQlnb3RvIGVycm9yOworCisJaWYgKChlcnIgPSB3OTk2OGNmX3NlbnNvcl9jbWQoY2FtLCBPVkNBTUNISVBfQ01EX1FfU1VCVFlQRSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbS0+c2Vuc29yKSkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBOT1RFOiBNYWtlIHN1cmUgd2lkdGggYW5kIGhlaWdodCBhcmUgYSBtdWx0aXBsZSBvZiAxNiAqLworCXN3aXRjaCAoY2FtLT5zZW5zb3JfY2xpZW50LT5hZGRyKSB7CisJCWNhc2UgT1Y2eHgwX1NJRDoKKwkJCWNhbS0+bWF4d2lkdGggPSAzNTI7CisJCQljYW0tPm1heGhlaWdodCA9IDI4ODsKKwkJCWNhbS0+bWlud2lkdGggPSA2NDsKKwkJCWNhbS0+bWluaGVpZ2h0ID0gNDg7CisJCQlicmVhazsKKwkJY2FzZSBPVjd4eDBfU0lEOgorCQkJY2FtLT5tYXh3aWR0aCA9IDY0MDsKKwkJCWNhbS0+bWF4aGVpZ2h0ID0gNDgwOworCQkJY2FtLT5taW53aWR0aCA9IDY0OworCQkJY2FtLT5taW5oZWlnaHQgPSA0ODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHKDEsICJOb3Qgc3VwcG9ydGVkIGltYWdlIHNlbnNvciBkZXRlY3RlZCBmb3IgJXMiLAorCQkJICAgIHN5bWJvbGljKGNhbWxpc3QsIGNhbS0+aWQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVGhlc2UgdmFsdWVzIGRlcGVuZCBvbiB0aGUgb25lcyBpbiB0aGUgb3Z4eHgwLmMgc291cmNlcyAqLworCXN3aXRjaCAoY2FtLT5zZW5zb3IpIHsKKwkJY2FzZSBDQ19PVjc2MjA6CisJCQljYW0tPnN0YXJ0X2Nyb3B4ID0gMjg3OworCQkJY2FtLT5zdGFydF9jcm9weSA9IDM1OworCQkJLyogU2VlbXMgdG8gd29yayBhcm91bmQgYSBidWcgaW4gdGhlIGltYWdlIHNlbnNvciAqLworCQkJY2FtLT52c19wb2xhcml0eSA9IDE7CisJCQljYW0tPmhzX3BvbGFyaXR5ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2FtLT5zdGFydF9jcm9weCA9IDMyMDsKKwkJCWNhbS0+c3RhcnRfY3JvcHkgPSAzNTsKKwkJCWNhbS0+dnNfcG9sYXJpdHkgPSAxOworCQkJY2FtLT5oc19wb2xhcml0eSA9IDA7CisJfQorCisJaWYgKChlcnIgPSB3OTk2OGNmX3NlbnNvcl91cGRhdGVfc2V0dGluZ3MoY2FtKSkpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoKGVyciA9IHc5OTY4Y2Zfc2Vuc29yX3VwZGF0ZV9waWN0dXJlKGNhbSwgY2FtLT5waWN0dXJlKSkpCisJCWdvdG8gZXJyb3I7CisKKwljYW0tPnNlbnNvcl9pbml0aWFsaXplZCA9IDE7CisKKwlEQkcoMiwgIiVzIGltYWdlIHNlbnNvciBpbml0aWFsaXplZCIsIHN5bWJvbGljKHNlbmxpc3QsIGNhbS0+c2Vuc29yKSkKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJY2FtLT5zZW5zb3JfaW5pdGlhbGl6ZWQgPSAwOworCWNhbS0+c2Vuc29yID0gQ0NfVU5LTk9XTjsKKwlEQkcoMSwgIkltYWdlIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQgZm9yICVzICgvZGV2L3ZpZGVvJWQpLiAiCisJICAgICAgICJUcnkgdG8gZGV0YWNoIGFuZCBhdHRhY2ggdGhpcyBkZXZpY2UgYWdhaW4iLAorCSAgICBzeW1ib2xpYyhjYW1saXN0LCBjYW0tPmlkKSwgY2FtLT52NGxkZXYtPm1pbm9yKQorCXJldHVybiBlcnI7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBGaWxsIHNvbWUgYmFzaWMgZmllbGRzIGluIHRoZSBtYWluIGRldmljZSBkYXRhIHN0cnVjdHVyZS4KKyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBvbiB3OTk2OGNmX3VzYl9wcm9iZSgpIGZvciBlYWNoIHJlY29nbml6ZWQgCisgIGNhbWVyYS4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQKK3c5OTY4Y2ZfY29uZmlndXJlX2NhbWVyYShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSogdWRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHc5OTY4Y2ZfbW9kZWxfaWQgbW9kX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRldl9ucikKK3sKKwlpbml0X01VVEVYKCZjYW0tPmZpbGVvcF9zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbS0+b3Blbik7CisJc3Bpbl9sb2NrX2luaXQoJmNhbS0+dXJiX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjYW0tPmZsaXN0X2xvY2spOworCisJY2FtLT51c2VycyA9IDA7CisJY2FtLT5kaXNjb25uZWN0ZWQgPSAwOworCWNhbS0+aWQgPSBtb2RfaWQ7CisJY2FtLT5zZW5zb3IgPSBDQ19VTktOT1dOOworCWNhbS0+c2Vuc29yX2luaXRpYWxpemVkID0gMDsKKworCS8qIENhbGN1bGF0ZSB0aGUgYWx0ZXJuYXRlIHNldHRpbmcgbnVtYmVyIChmcm9tIDEgdG8gMTYpCisJICAgYWNjb3JkaW5nIHRvIHRoZSAncGFja2V0X3NpemUnIG1vZHVsZSBwYXJhbWV0ZXIgKi8KKwlpZiAocGFja2V0X3NpemVbZGV2X25yXSA8IFc5OTY4Q0ZfTUlOX1BBQ0tFVF9TSVpFKQorCQlwYWNrZXRfc2l6ZVtkZXZfbnJdID0gVzk5NjhDRl9NSU5fUEFDS0VUX1NJWkU7CisJZm9yIChjYW0tPmFsdHNldHRpbmcgPSAxOworCSAgICAgcGFja2V0X3NpemVbZGV2X25yXSA8IHdNYXhQYWNrZXRTaXplW2NhbS0+YWx0c2V0dGluZy0xXTsKKwkgICAgIGNhbS0+YWx0c2V0dGluZysrKTsKKworCWNhbS0+bWF4X2J1ZmZlcnMgPSAobWF4X2J1ZmZlcnNbZGV2X25yXSA8IDIgfHwgCisJICAgICAgICAgICAgICAgICAgICBtYXhfYnVmZmVyc1tkZXZfbnJdID4gVzk5NjhDRl9NQVhfQlVGRkVSUykKKwkgICAgICAgICAgICAgICAgICAgPyBXOTk2OENGX0JVRkZFUlMgOiAodTgpbWF4X2J1ZmZlcnNbZGV2X25yXTsKKworCWNhbS0+ZG91YmxlX2J1ZmZlciA9IChkb3VibGVfYnVmZmVyW2Rldl9ucl0gPT0gMCB8fCAKKwkgICAgICAgICAgICAgICAgICAgICAgZG91YmxlX2J1ZmZlcltkZXZfbnJdID09IDEpCisJICAgICAgICAgICAgICAgICAgICAgPyAodTgpZG91YmxlX2J1ZmZlcltkZXZfbnJdOlc5OTY4Q0ZfRE9VQkxFX0JVRkZFUjsKKworCWNhbS0+Y2xhbXBpbmcgPSAoY2xhbXBpbmdbZGV2X25yXSA9PSAwIHx8IGNsYW1waW5nW2Rldl9ucl0gPT0gMSkKKwkgICAgICAgICAgICAgICAgPyAodTgpY2xhbXBpbmdbZGV2X25yXSA6IFc5OTY4Q0ZfQ0xBTVBJTkc7CisJCisJY2FtLT5maWx0ZXJfdHlwZSA9IChmaWx0ZXJfdHlwZVtkZXZfbnJdID09IDAgfHwKKwkgICAgICAgICAgICAgICAgICAgIGZpbHRlcl90eXBlW2Rldl9ucl0gPT0gMSB8fAorCSAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3R5cGVbZGV2X25yXSA9PSAyKQorCSAgICAgICAgICAgICAgICAgICA/ICh1OClmaWx0ZXJfdHlwZVtkZXZfbnJdIDogVzk5NjhDRl9GSUxURVJfVFlQRTsKKworCWNhbS0+Y2FwdHVyZSA9IDE7CisKKwljYW0tPmxhcmdldmlldyA9IChsYXJnZXZpZXdbZGV2X25yXSA9PSAwIHx8IGxhcmdldmlld1tkZXZfbnJdID09IDEpCisJICAgICAgICAgICAgICAgICA/ICh1OClsYXJnZXZpZXdbZGV2X25yXSA6IFc5OTY4Q0ZfTEFSR0VWSUVXOworCisJY2FtLT5kZWNvbXByZXNzaW9uID0gKGRlY29tcHJlc3Npb25bZGV2X25yXSA9PSAwIHx8IAorCSAgICAgICAgICAgICAgICAgICAgICBkZWNvbXByZXNzaW9uW2Rldl9ucl0gPT0gMSB8fAorCSAgICAgICAgICAgICAgICAgICAgICBkZWNvbXByZXNzaW9uW2Rldl9ucl0gPT0gMikKKwkgICAgICAgICAgICAgICAgICAgICA/ICh1OClkZWNvbXByZXNzaW9uW2Rldl9ucl06Vzk5NjhDRl9ERUNPTVBSRVNTSU9OOworCisJY2FtLT51cHNjYWxpbmcgPSAodXBzY2FsaW5nW2Rldl9ucl0gPT0gMCB8fCAKKwkgICAgICAgICAgICAgICAgICB1cHNjYWxpbmdbZGV2X25yXSA9PSAxKQorCSAgICAgICAgICAgICAgICAgPyAodTgpdXBzY2FsaW5nW2Rldl9ucl0gOiBXOTk2OENGX1VQU0NBTElORzsKKworCWNhbS0+YXV0b19icnQgPSAoYXV0b2JyaWdodFtkZXZfbnJdID09IDAgfHwgYXV0b2JyaWdodFtkZXZfbnJdID09IDEpCisJICAgICAgICAgICAgICAgID8gKHU4KWF1dG9icmlnaHRbZGV2X25yXSA6IFc5OTY4Q0ZfQVVUT0JSSUdIVDsKKworCWNhbS0+YXV0b19leHAgPSAoYXV0b2V4cFtkZXZfbnJdID09IDAgfHwgYXV0b2V4cFtkZXZfbnJdID09IDEpCisJICAgICAgICAgICAgICAgID8gKHU4KWF1dG9leHBbZGV2X25yXSA6IFc5OTY4Q0ZfQVVUT0VYUDsKKworCWNhbS0+bGlnaHRmcmVxID0gKGxpZ2h0ZnJlcVtkZXZfbnJdID09IDUwIHx8IGxpZ2h0ZnJlcVtkZXZfbnJdID09IDYwKQorCSAgICAgICAgICAgICAgICAgPyAodTgpbGlnaHRmcmVxW2Rldl9ucl0gOiBXOTk2OENGX0xJR0hURlJFUTsKKworCWNhbS0+YmFuZGZpbHQgPSAoYmFuZGluZ2ZpbHRlcltkZXZfbnJdID09IDAgfHwgCisJICAgICAgICAgICAgICAgICBiYW5kaW5nZmlsdGVyW2Rldl9ucl0gPT0gMSkKKwkgICAgICAgICAgICAgICAgPyAodTgpYmFuZGluZ2ZpbHRlcltkZXZfbnJdIDogVzk5NjhDRl9CQU5ESU5HRklMVEVSOworCisJY2FtLT5iYWNrbGlnaHQgPSAoYmFja2xpZ2h0W2Rldl9ucl0gPT0gMCB8fCBiYWNrbGlnaHRbZGV2X25yXSA9PSAxKQorCSAgICAgICAgICAgICAgICAgPyAodTgpYmFja2xpZ2h0W2Rldl9ucl0gOiBXOTk2OENGX0JBQ0tMSUdIVDsKKworCWNhbS0+Y2xvY2tkaXYgPSAoY2xvY2tkaXZbZGV2X25yXSA9PSAtMSB8fCBjbG9ja2RpdltkZXZfbnJdID49IDApCisJICAgICAgICAgICAgICAgID8gKHM4KWNsb2NrZGl2W2Rldl9ucl0gOiBXOTk2OENGX0NMT0NLRElWOworCisJY2FtLT5taXJyb3IgPSAobWlycm9yW2Rldl9ucl0gPT0gMCB8fCBtaXJyb3JbZGV2X25yXSA9PSAxKQorCSAgICAgICAgICAgICAgPyAodTgpbWlycm9yW2Rldl9ucl0gOiBXOTk2OENGX01JUlJPUjsKKworCWNhbS0+bW9ub2Nocm9tZSA9IChtb25vY2hyb21lW2Rldl9ucl0gPT0gMCB8fCBtb25vY2hyb21lW2Rldl9ucl0gPT0gMSkKKwkgICAgICAgICAgICAgICAgICA/IG1vbm9jaHJvbWVbZGV2X25yXSA6IFc5OTY4Q0ZfTU9OT0NIUk9NRTsKKworCWNhbS0+cGljdHVyZS5icmlnaHRuZXNzID0gKHUxNilicmlnaHRuZXNzW2Rldl9ucl07CisJY2FtLT5waWN0dXJlLmh1ZSA9ICh1MTYpaHVlW2Rldl9ucl07CisJY2FtLT5waWN0dXJlLmNvbG91ciA9ICh1MTYpY29sb3VyW2Rldl9ucl07CisJY2FtLT5waWN0dXJlLmNvbnRyYXN0ID0gKHUxNiljb250cmFzdFtkZXZfbnJdOworCWNhbS0+cGljdHVyZS53aGl0ZW5lc3MgPSAodTE2KXdoaXRlbmVzc1tkZXZfbnJdOworCWlmICh3OTk2OGNmX3ZhbGlkX3BhbGV0dGUoKHUxNilmb3JjZV9wYWxldHRlW2Rldl9ucl0pKSB7CisJCWNhbS0+cGljdHVyZS5wYWxldHRlID0gKHUxNilmb3JjZV9wYWxldHRlW2Rldl9ucl07CisJCWNhbS0+Zm9yY2VfcGFsZXR0ZSA9IDE7CisJfSBlbHNlIHsKKwkJY2FtLT5mb3JjZV9wYWxldHRlID0gMDsKKwkJaWYgKGNhbS0+ZGVjb21wcmVzc2lvbiA9PSAwKQorCQkJY2FtLT5waWN0dXJlLnBhbGV0dGUgPSBXOTk2OENGX1BBTEVUVEVfREVDT01QX09GRjsKKwkJZWxzZSBpZiAoY2FtLT5kZWNvbXByZXNzaW9uID09IDEpCisJCQljYW0tPnBpY3R1cmUucGFsZXR0ZSA9IFc5OTY4Q0ZfUEFMRVRURV9ERUNPTVBfRk9SQ0U7CisJCWVsc2UKKwkJCWNhbS0+cGljdHVyZS5wYWxldHRlID0gVzk5NjhDRl9QQUxFVFRFX0RFQ09NUF9PTjsKKwl9CisJY2FtLT5waWN0dXJlLmRlcHRoID0gdzk5NjhjZl92YWxpZF9kZXB0aChjYW0tPnBpY3R1cmUucGFsZXR0ZSk7CisKKwljYW0tPmZvcmNlX3JnYiA9IChmb3JjZV9yZ2JbZGV2X25yXSA9PSAwIHx8IGZvcmNlX3JnYltkZXZfbnJdID09IDEpCisJICAgICAgICAgICAgICAgICA/ICh1OClmb3JjZV9yZ2JbZGV2X25yXSA6IFc5OTY4Q0ZfRk9SQ0VfUkdCOworCisJY2FtLT53aW5kb3cueCA9IDA7CisJY2FtLT53aW5kb3cueSA9IDA7CisJY2FtLT53aW5kb3cud2lkdGggPSBXOTk2OENGX1dJRFRIOworCWNhbS0+d2luZG93LmhlaWdodCA9IFc5OTY4Q0ZfSEVJR0hUOworCWNhbS0+d2luZG93LmNocm9tYWtleSA9IDA7CisJY2FtLT53aW5kb3cuY2xpcGNvdW50ID0gMDsKKwljYW0tPndpbmRvdy5mbGFncyA9IDA7CisKKwlEQkcoMywgIiVzIGNvbmZpZ3VyZWQgd2l0aCBzZXR0aW5ncyAjJXU6IiwKKwkgICAgc3ltYm9saWMoY2FtbGlzdCwgY2FtLT5pZCksIGRldl9ucikKKwkKKwlEQkcoMywgIi0gRGF0YSBwYWNrZXQgc2l6ZSBmb3IgVVNCIGlzb2Nocm5vdXMgdHJhbnNmZXI6ICV1IGJ5dGVzIiwKKwkgICAgd01heFBhY2tldFNpemVbY2FtLT5hbHRzZXR0aW5nLTFdKQorCQorCURCRygzLCAiLSBOdW1iZXIgb2YgcmVxdWVzdGVkIHZpZGVvIGZyYW1lIGJ1ZmZlcnM6ICV1IiwKKwkgICAgY2FtLT5tYXhfYnVmZmVycykKKworCWlmIChjYW0tPmRvdWJsZV9idWZmZXIpCisJCURCRygzLCAiLSBIYXJkd2FyZSBkb3VibGUgYnVmZmVyaW5nIGVuYWJsZWQiKQorCWVsc2UgCisJCURCRygzLCAiLSBIYXJkd2FyZSBkb3VibGUgYnVmZmVyaW5nIGRpc2FibGVkIikKKworCWlmIChjYW0tPmZpbHRlcl90eXBlID09IDApCisJCURCRygzLCAiLSBWaWRlbyBmaWx0ZXJpbmcgZGlzYWJsZWQiKQorCWVsc2UgaWYgKGNhbS0+ZmlsdGVyX3R5cGUgPT0gMSkKKwkJREJHKDMsICItIFZpZGVvIGZpbHRlcmluZyBlbmFibGVkOiB0eXBlIDEtMi0xIikKKwllbHNlIGlmIChjYW0tPmZpbHRlcl90eXBlID09IDIpCisJCURCRygzLCAiLSBWaWRlbyBmaWx0ZXJpbmcgZW5hYmxlZDogdHlwZSAyLTMtNi0zLTIiKQorCisJaWYgKGNhbS0+Y2xhbXBpbmcpCisJCURCRygzLCAiLSBWaWRlbyBkYXRhIGNsYW1waW5nIChDQ0lSLTYwMSBmb3JtYXQpIGVuYWJsZWQiKQorCWVsc2UKKwkJREJHKDMsICItIFZpZGVvIGRhdGEgY2xhbXBpbmcgKENDSVItNjAxIGZvcm1hdCkgZGlzYWJsZWQiKQorCisJaWYgKGNhbS0+bGFyZ2V2aWV3KQorCQlEQkcoMywgIi0gTGFyZ2UgdmlldyBlbmFibGVkIikKKwllbHNlCisJCURCRygzLCAiLSBMYXJnZSB2aWV3IGRpc2FibGVkIikKKworCWlmICgoY2FtLT5kZWNvbXByZXNzaW9uKSA9PSAwICYmICghY2FtLT5mb3JjZV9wYWxldHRlKSkKKwkJREJHKDMsICItIERlY29tcHJlc3Npb24gZGlzYWJsZWQiKQorCWVsc2UgaWYgKChjYW0tPmRlY29tcHJlc3Npb24pID09IDEgJiYgKCFjYW0tPmZvcmNlX3BhbGV0dGUpKQorCQlEQkcoMywgIi0gRGVjb21wcmVzc2lvbiBmb3JjZWQiKQorCWVsc2UgaWYgKChjYW0tPmRlY29tcHJlc3Npb24pID09IDIgJiYgKCFjYW0tPmZvcmNlX3BhbGV0dGUpKQorCQlEQkcoMywgIi0gRGVjb21wcmVzc2lvbiBhbGxvd2VkIikKKworCWlmIChjYW0tPnVwc2NhbGluZykKKwkJREJHKDMsICItIFNvZnR3YXJlIGltYWdlIHNjYWxpbmcgZW5hYmxlZCIpCisJZWxzZQorCQlEQkcoMywgIi0gU29mdHdhcmUgaW1hZ2Ugc2NhbGluZyBkaXNhYmxlZCIpCisKKwlpZiAoY2FtLT5mb3JjZV9wYWxldHRlKQorCQlEQkcoMywgIi0gSW1hZ2UgcGFsZXR0ZSBmb3JjZWQgdG8gJXMiLAorCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgY2FtLT5waWN0dXJlLnBhbGV0dGUpKQorCisJaWYgKGNhbS0+Zm9yY2VfcmdiKQorCQlEQkcoMywgIi0gUkdCIGNvbXBvbmVudCBvcmRlcmluZyB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiBCR1IiKQorCisJaWYgKGNhbS0+YXV0b19icnQpCisJCURCRygzLCAiLSBBdXRvIGJyaWdodG5lc3MgZW5hYmxlZCIpCisJZWxzZQorCQlEQkcoMywgIi0gQXV0byBicmlnaHRuZXNzIGRpc2FibGVkIikKKworCWlmIChjYW0tPmF1dG9fZXhwKQorCQlEQkcoMywgIi0gQXV0byBleHBvc3VyZSBlbmFibGVkIikKKwllbHNlCisJCURCRygzLCAiLSBBdXRvIGV4cG9zdXJlIGRpc2FibGVkIikKKworCWlmIChjYW0tPmJhY2tsaWdodCkKKwkJREJHKDMsICItIEJhY2tsaWdodCBleHBvc3VyZSBhbGdvcml0aG0gZW5hYmxlZCIpCisJZWxzZQorCQlEQkcoMywgIi0gQmFja2xpZ2h0IGV4cG9zdXJlIGFsZ29yaXRobSBkaXNhYmxlZCIpCisKKwlpZiAoY2FtLT5taXJyb3IpCisJCURCRygzLCAiLSBNaXJyb3IgZW5hYmxlZCIpCisJZWxzZQorCQlEQkcoMywgIi0gTWlycm9yIGRpc2FibGVkIikKKworCWlmIChjYW0tPmJhbmRmaWx0KQorCQlEQkcoMywgIi0gQmFuZGluZyBmaWx0ZXIgZW5hYmxlZCIpCisJZWxzZQorCQlEQkcoMywgIi0gQmFuZGluZyBmaWx0ZXIgZGlzYWJsZWQiKQorCisJREJHKDMsICItIFBvd2VyIGxpZ2h0aW5nIGZyZXF1ZW5jeTogJXUiLCBjYW0tPmxpZ2h0ZnJlcSkKKworCWlmIChjYW0tPmNsb2NrZGl2ID09IC0xKQorCQlEQkcoMywgIi0gQXV0b21hdGljIGNsb2NrIGRpdmlzb3IgZW5hYmxlZCIpCisJZWxzZQorCQlEQkcoMywgIi0gQ2xvY2sgZGl2aXNvcjogJWQiLCBjYW0tPmNsb2NrZGl2KQorCisJaWYgKGNhbS0+bW9ub2Nocm9tZSkKKwkJREJHKDMsICItIEltYWdlIHNlbnNvciB1c2VkIGFzIG1vbm9jaHJvbWUiKQorCWVsc2UKKwkJREJHKDMsICItIEltYWdlIHNlbnNvciBub3QgdXNlZCBhcyBtb25vY2hyb21lIikKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIElmIHRoZSB2aWRlbyBwb3N0LXByb2Nlc3NpbmcgbW9kdWxlIGlzIG5vdCBsb2FkZWQsIHNvbWUgcGFyYW1ldGVycworICBtdXN0IGJlIG92ZXJyaWRkZW4uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHc5OTY4Y2ZfYWRqdXN0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW0pCit7CisJaWYgKCF3OTk2OGNmX3ZwcCkgeworCQlpZiAoY2FtLT5kZWNvbXByZXNzaW9uID09IDEpIHsKKwkJCWNhbS0+ZGVjb21wcmVzc2lvbiA9IDI7CisJCQlEQkcoMiwgIlZpZGVvIHBvc3QtcHJvY2Vzc2luZyBtb2R1bGUgbm90IGZvdW5kOiAiCisJCQkgICAgICAgIidkZWNvbXByZXNzaW9uJyBwYXJhbWV0ZXIgZm9yY2VkIHRvIDIiKQorCQl9CisJCWlmIChjYW0tPnVwc2NhbGluZykgeworCQkJY2FtLT51cHNjYWxpbmcgPSAwOworCQkJREJHKDIsICJWaWRlbyBwb3N0LXByb2Nlc3NpbmcgbW9kdWxlIG5vdCBmb3VuZDogIgorCQkJICAgICAgICIndXBzY2FsaW5nJyBwYXJhbWV0ZXIgZm9yY2VkIHRvIDAiKQorCQl9CisJCWlmIChjYW0tPnBpY3R1cmUucGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1VZVlkpIHsKKwkJCWNhbS0+Zm9yY2VfcGFsZXR0ZSA9IDA7CisJCQlEQkcoMiwgIlZpZGVvIHBvc3QtcHJvY2Vzc2luZyBtb2R1bGUgbm90IGZvdW5kOiAiCisJCQkgICAgICAgIidmb3JjZV9wYWxldHRlJyBwYXJhbWV0ZXIgZm9yY2VkIHRvIDAiKQorCQl9CisJCWNhbS0+cGljdHVyZS5wYWxldHRlID0gVklERU9fUEFMRVRURV9VWVZZOworCQljYW0tPnBpY3R1cmUuZGVwdGggPSB3OTk2OGNmX3ZhbGlkX2RlcHRoKGNhbS0+cGljdHVyZS5wYWxldHRlKTsKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBSZWxlYXNlIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGUgZHJpdmVyLgorICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBkaXNjb25uZWN0IAorICAob3Igb24gY2xvc2UgaWYgZGVhbGxvY2F0aW9uIGhhcyBiZWVuIGRlZmVycmVkKQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCB3OTk2OGNmX3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWRvd24oJnc5OTY4Y2ZfZGV2bGlzdF9zZW0pOworCisJREJHKDIsICJWNEwgZGV2aWNlIGRlcmVnaXN0ZXJlZDogL2Rldi92aWRlbyVkIiwgY2FtLT52NGxkZXYtPm1pbm9yKQorCisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoY2FtLT52NGxkZXYpOworCWxpc3RfZGVsKCZjYW0tPnY0bGxpc3QpOworCWkyY19kZWxfYWRhcHRlcigmY2FtLT5pMmNfYWRhcHRlcik7CisJdzk5NjhjZl9kZWFsbG9jYXRlX21lbW9yeShjYW0pOworCWtmcmVlKGNhbS0+Y29udHJvbF9idWZmZXIpOworCWtmcmVlKGNhbS0+ZGF0YV9idWZmZXIpOworCisJdXAoJnc5OTY4Y2ZfZGV2bGlzdF9zZW0pOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZpZGVvNExpbnV4IGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB3OTk2OGNmX29wZW4oc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbHApCit7CisJc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW07CisJaW50IGVycjsKKworCS8qIFRoaXMgdGhlIG9ubHkgc2FmZSB3YXkgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCBkaXNjb25uZWN0ICovCisJaWYgKCFkb3duX3JlYWRfdHJ5bG9jaygmdzk5NjhjZl9kaXNjb25uZWN0KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWNhbSA9IChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKXZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCisJZG93bigmY2FtLT5kZXZfc2VtKTsKKworCWlmIChjYW0tPnNlbnNvciA9PSBDQ19VTktOT1dOKSB7CisJCURCRygyLCAiTm8gc3VwcG9ydGVkIGltYWdlIHNlbnNvciBoYXMgYmVlbiBkZXRlY3RlZCBieSB0aGUgIgorCQkgICAgICAgIidvdmNhbWNoaXAnIG1vZHVsZSBmb3IgdGhlICVzICgvZGV2L3ZpZGVvJWQpLiBNYWtlICIKKwkJICAgICAgICJzdXJlIGl0IGlzIGxvYWRlZCAqYmVmb3JlKiAocmUpY29ubmVjdGluZyB0aGUgY2FtZXJhLiIsCisJCSAgICBzeW1ib2xpYyhjYW1saXN0LCBjYW0tPmlkKSwgY2FtLT52NGxkZXYtPm1pbm9yKQorCQl1cCgmY2FtLT5kZXZfc2VtKTsKKwkJdXBfcmVhZCgmdzk5NjhjZl9kaXNjb25uZWN0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNhbS0+dXNlcnMpIHsKKwkJREJHKDIsICIlcyAoL2Rldi92aWRlbyVkKSBoYXMgYmVlbiBhbHJlYWR5IG9jY3VwaWVkIGJ5ICclcyciLAorCQkgICAgc3ltYm9saWMoY2FtbGlzdCwgY2FtLT5pZCksY2FtLT52NGxkZXYtPm1pbm9yLGNhbS0+Y29tbWFuZCkKKwkJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyl8fChmaWxwLT5mX2ZsYWdzICYgT19OREVMQVkpKSB7CisJCQl1cCgmY2FtLT5kZXZfc2VtKTsKKwkJCXVwX3JlYWQoJnc5OTY4Y2ZfZGlzY29ubmVjdCk7CisJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQl9CisJCXVwKCZjYW0tPmRldl9zZW0pOworCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfZXhjbHVzaXZlKGNhbS0+b3BlbiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW0tPmRpc2Nvbm5lY3RlZCB8fAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjYW0tPnVzZXJzKTsKKwkJaWYgKGVycikgeworCQkJdXBfcmVhZCgmdzk5NjhjZl9kaXNjb25uZWN0KTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKSB7CisJCQl1cF9yZWFkKCZ3OTk2OGNmX2Rpc2Nvbm5lY3QpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJZG93bigmY2FtLT5kZXZfc2VtKTsKKwl9CisKKwlEQkcoNSwgIk9wZW5pbmcgJyVzJywgL2Rldi92aWRlbyVkIC4uLiIsCisJICAgIHN5bWJvbGljKGNhbWxpc3QsIGNhbS0+aWQpLCBjYW0tPnY0bGRldi0+bWlub3IpCisKKwljYW0tPnN0cmVhbWluZyA9IDA7CisJY2FtLT5taXNjb25maWd1cmVkID0gMDsKKworCWlmICghdzk5NjhjZl92cHApCisJCWlmICgoZXJyID0gdzk5NjhjZl92cHBtb2RfZGV0ZWN0KGNhbSkpKQorCQkJZ290byBvdXQ7CisKKwlpZiAoKGVyciA9IHc5OTY4Y2ZfYWxsb2NhdGVfbWVtb3J5KGNhbSkpKQorCQlnb3RvIGRlYWxsb2NhdGVfbWVtb3J5OworCisJaWYgKChlcnIgPSB3OTk2OGNmX2luaXRfY2hpcChjYW0pKSkKKwkJZ290byBkZWFsbG9jYXRlX21lbW9yeTsKKworCWlmICgoZXJyID0gdzk5NjhjZl9zdGFydF90cmFuc2ZlcihjYW0pKSkKKwkJZ290byBkZWFsbG9jYXRlX21lbW9yeTsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGNhbTsKKworCWNhbS0+dXNlcnMrKzsKKwlzdHJjcHkoY2FtLT5jb21tYW5kLCBjdXJyZW50LT5jb21tKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbS0+d2FpdF9xdWV1ZSk7CisKKwlEQkcoNSwgIlZpZGVvIGRldmljZSBpcyBvcGVuIikKKworCXVwKCZjYW0tPmRldl9zZW0pOworCXVwX3JlYWQoJnc5OTY4Y2ZfZGlzY29ubmVjdCk7CisKKwlyZXR1cm4gMDsKKworZGVhbGxvY2F0ZV9tZW1vcnk6CisJdzk5NjhjZl9kZWFsbG9jYXRlX21lbW9yeShjYW0pOworb3V0OgorCURCRygyLCAiRmFpbGVkIHRvIG9wZW4gdGhlIHZpZGVvIGRldmljZSIpCisJdXAoJmNhbS0+ZGV2X3NlbSk7CisJdXBfcmVhZCgmdzk5NjhjZl9kaXNjb25uZWN0KTsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdzk5NjhjZl9yZWxlYXNlKHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBmaWxlKiBmaWxwKQoreworCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtOworCisJY2FtID0gKHN0cnVjdCB3OTk2OGNmX2RldmljZSopdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisKKwlkb3duKCZjYW0tPmRldl9zZW0pOyAvKiBwcmV2ZW50IGRpc2Nvbm5lY3QoKSB0byBiZSBjYWxsZWQgKi8KKworCXc5OTY4Y2Zfc3RvcF90cmFuc2ZlcihjYW0pOworCisJdzk5NjhjZl92cHBtb2RfcmVsZWFzZShjYW0pOworCisJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKSB7CisJCXc5OTY4Y2ZfcmVsZWFzZV9yZXNvdXJjZXMoY2FtKTsKKwkJdXAoJmNhbS0+ZGV2X3NlbSk7CisJCWtmcmVlKGNhbSk7CisJCXJldHVybiAwOworCX0KKworCWNhbS0+dXNlcnMtLTsKKwl3OTk2OGNmX2RlYWxsb2NhdGVfbWVtb3J5KGNhbSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX25yKCZjYW0tPm9wZW4sIDEpOworCisJREJHKDUsICJWaWRlbyBkZXZpY2UgY2xvc2VkIikKKwl1cCgmY2FtLT5kZXZfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3NpemVfdAordzk5NjhjZl9yZWFkKHN0cnVjdCBmaWxlKiBmaWxwLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QqIGZfcG9zKQoreworCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtOworCXN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqIGZyOworCWludCBlcnIgPSAwOworCisJY2FtID0gKHN0cnVjdCB3OTk2OGNmX2RldmljZSopdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisKKwlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjYW0tPmZpbGVvcF9zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKSB7CisJCURCRygyLCAiRGV2aWNlIG5vdCBwcmVzZW50IikKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChjYW0tPm1pc2NvbmZpZ3VyZWQpIHsKKwkJREJHKDIsICJUaGUgY2FtZXJhIGlzIG1pc2NvbmZpZ3VyZWQuIENsb3NlIGFuZCBvcGVuIGl0IGFnYWluLiIpCisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIWNhbS0+ZnJhbWVbMF0ucXVldWVkKQorCQl3OTk2OGNmX3B1c2hfZnJhbWUoY2FtLCAwKTsKKworCWlmICghY2FtLT5mcmFtZVsxXS5xdWV1ZWQpCisJCXc5OTY4Y2ZfcHVzaF9mcmFtZShjYW0sIDEpOworCisJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNhbS0+d2FpdF9xdWV1ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5mcmFtZVswXS5zdGF0dXMgPT0gRl9SRUFEWSB8fAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW0tPmZyYW1lWzFdLnN0YXR1cyA9PSBGX1JFQURZIHx8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbS0+ZGlzY29ubmVjdGVkKTsKKwlpZiAoZXJyKSB7CisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpIHsKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZyID0gKGNhbS0+ZnJhbWVbMF0uc3RhdHVzID09IEZfUkVBRFkpID8gJmNhbS0+ZnJhbWVbMF06JmNhbS0+ZnJhbWVbMV07CisKKwlpZiAodzk5NjhjZl92cHApCisJCXc5OTY4Y2ZfcG9zdHByb2Nlc3NfZnJhbWUoY2FtLCBmcik7CisKKwlpZiAoY291bnQgPiBmci0+bGVuZ3RoKQorCQljb3VudCA9IGZyLT5sZW5ndGg7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgZnItPmJ1ZmZlciwgY291bnQpKSB7CisJCWZyLT5zdGF0dXMgPSBGX1VOVVNFRDsKKwkJdXAoJmNhbS0+ZmlsZW9wX3NlbSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkqZl9wb3MgKz0gY291bnQ7CisKKwlmci0+c3RhdHVzID0gRl9VTlVTRUQ7CisKKwlEQkcoNSwgIiV6dSBieXRlcyByZWFkIiwgY291bnQpCisKKwl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIGludCB3OTk2OGNmX21tYXAoc3RydWN0IGZpbGUqIGZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtID0gKHN0cnVjdCB3OTk2OGNmX2RldmljZSopCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwl1bnNpZ25lZCBsb25nIHZzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCSAgICAgICAgICAgICAgcHNpemUgPSBjYW0tPm5idWZmZXJzICogY2FtLT5mcmFtZVswXS5zaXplLAorCSAgICAgICAgICAgICAgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0LAorCSAgICAgICAgICAgICAgcG9zID0gKHVuc2lnbmVkIGxvbmcpY2FtLT5mcmFtZVswXS5idWZmZXIsCisJICAgICAgICAgICAgICBwYWdlOworCisJaWYgKGNhbS0+ZGlzY29ubmVjdGVkKSB7CisJCURCRygyLCAiRGV2aWNlIG5vdCBwcmVzZW50IikKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNhbS0+bWlzY29uZmlndXJlZCkgeworCQlEQkcoMiwgIlRoZSBjYW1lcmEgaXMgbWlzY29uZmlndXJlZC4gQ2xvc2UgYW5kIG9wZW4gaXQgYWdhaW4iKQorCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlQREJHRygibW1hcHBpbmcgJWx1IGJ5dGVzLi4uIiwgdnNpemUpCisKKwlpZiAodnNpemUgPiBwc2l6ZSAtICh2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdoaWxlICh2c2l6ZSA+IDApIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlICsgdm1hLT52bV9wZ29mZiwKKwkJCQkJCVBBR0VfU0laRSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJdnNpemUgLT0gUEFHRV9TSVpFOworCX0KKworCURCRyg1LCAibW1hcCBtZXRob2Qgc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAordzk5NjhjZl9pb2N0bChzdHJ1Y3QgaW5vZGUqIGlub2RlLCBzdHJ1Y3QgZmlsZSogZmlscCwKKyAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW07CisJaW50IGVycjsKKworCWNhbSA9IChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKXZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2FtLT5maWxlb3Bfc2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkgeworCQlEQkcoMiwgIkRldmljZSBub3QgcHJlc2VudCIpCisJCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY2FtLT5taXNjb25maWd1cmVkKSB7CisJCURCRygyLCAiVGhlIGNhbWVyYSBpcyBtaXNjb25maWd1cmVkLiBDbG9zZSBhbmQgb3BlbiBpdCBhZ2Fpbi4iKQorCQl1cCgmY2FtLT5maWxlb3Bfc2VtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZXJyID0gdzk5NjhjZl92NGxfaW9jdGwoaW5vZGUsIGZpbHAsIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKworCXVwKCZjYW0tPmZpbGVvcF9zZW0pOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCB3OTk2OGNmX3Y0bF9pb2N0bChzdHJ1Y3QgaW5vZGUqIGlub2RlLCBzdHJ1Y3QgZmlsZSogZmlscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCit7CisJc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKiBjYW07CisJY29uc3QgY2hhciogdjRsMV9pb2N0bHNbXSA9IHsKKwkJIj8iLCAiQ0dBUCIsICJHQ0hBTiIsICJTQ0hBTiIsICJHVFVORVIiLCAiU1RVTkVSIiwgCisJCSJHUElDVCIsICJTUElDVCIsICJDQ0FQVFVSRSIsICJHV0lOIiwgIlNXSU4iLCAiR0ZCVUYiLAorCQkiU0ZCVUYiLCAiS0VZIiwgIkdGUkVRIiwgIlNGUkVRIiwgIkdBVURJTyIsICJTQVVESU8iLAorCQkiU1lOQyIsICJNQ0FQVFVSRSIsICJHTUJVRiIsICJHVU5JVCIsICJHQ0FQVFVSRSIsICJTQ0FQVFVSRSIsCisJCSJTUExBWU1PREUiLCAiU1dSSVRFTU9ERSIsICJHUExBWUlORk8iLCAiU01JQ1JPQ09ERSIsIAorCQkiR1ZCSUZNVCIsICJTVkJJRk1UIiAKKwl9OworCisJI2RlZmluZSBWNEwxX0lPQ1RMKGNtZCkgXAorCSAgICAgICAgKChfSU9DX05SKChjbWQpKSA8IHNpemVvZih2NGwxX2lvY3Rscykvc2l6ZW9mKGNoYXIqKSkgPyBcCisJICAgICAgICB2NGwxX2lvY3Rsc1tfSU9DX05SKChjbWQpKV0gOiAiPyIpCisKKwljYW0gPSAoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKil2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIFZJRElPQ0dDQVA6IC8qIGdldCB2aWRlbyBjYXBhYmlsaXR5ICovCisJeworCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSBjYXAgPSB7CisJCQkudHlwZSA9IFZJRF9UWVBFX0NBUFRVUkUgfCBWSURfVFlQRV9TQ0FMRVMsCisJCQkuY2hhbm5lbHMgPSAxLAorCQkJLmF1ZGlvcyA9IDAsCisJCQkubWlud2lkdGggPSBjYW0tPm1pbndpZHRoLAorCQkJLm1pbmhlaWdodCA9IGNhbS0+bWluaGVpZ2h0LAorCQl9OworCQlzcHJpbnRmKGNhcC5uYW1lLCAiVzk5Nls4N11DRiBVU0IgQ2FtZXJhICMlZCIsIAorCQkgICAgICAgIGNhbS0+djRsZGV2LT5taW5vcik7CisJCWNhcC5tYXh3aWR0aCA9IChjYW0tPnVwc2NhbGluZyAmJiB3OTk2OGNmX3ZwcCkKKwkJICAgICAgICAgICAgICAgPyBtYXgoKHUxNilXOTk2OENGX01BWF9XSURUSCwgY2FtLT5tYXh3aWR0aCkgCisJCSAgICAgICAgICAgICAgICAgOiBjYW0tPm1heHdpZHRoOworCQljYXAubWF4aGVpZ2h0ID0gKGNhbS0+dXBzY2FsaW5nICYmIHc5OTY4Y2ZfdnBwKQorCQkgICAgICAgICAgICAgICAgPyBtYXgoKHUxNilXOTk2OENGX01BWF9IRUlHSFQsIGNhbS0+bWF4aGVpZ2h0KQorCQkgICAgICAgICAgICAgICAgICA6IGNhbS0+bWF4aGVpZ2h0OworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY2FwLCBzaXplb2YoY2FwKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEQkcoNSwgIlZJRElPQ0dDQVAgc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DR0NIQU46IC8qIGdldCB2aWRlbyBjaGFubmVsIGluZm9ybWF0aW9ucyAqLworCXsKKwkJc3RydWN0IHZpZGVvX2NoYW5uZWwgY2hhbjsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaGFuLCBhcmcsIHNpemVvZihjaGFuKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoY2hhbi5jaGFubmVsICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzdHJjcHkoY2hhbi5uYW1lLCAiQ2FtZXJhIik7CisJCWNoYW4udHVuZXJzID0gMDsKKwkJY2hhbi5mbGFncyA9IDA7CisJCWNoYW4udHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOworCQljaGFuLm5vcm0gPSBWSURFT19NT0RFX0FVVE87CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjaGFuLCBzaXplb2YoY2hhbikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJREJHKDUsICJWSURJT0NHQ0hBTiBzdWNjZXNzZnVsbHkgY2FsbGVkIikKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NTQ0hBTjogLyogc2V0IGFjdGl2ZSBjaGFubmVsICovCisJeworCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCBjaGFuOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2hhbiwgYXJnLCBzaXplb2YoY2hhbikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNoYW4uY2hhbm5lbCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJREJHKDUsICJWSURJT0NTQ0hBTiBzdWNjZXNzZnVsbHkgY2FsbGVkIikKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NHUElDVDogLyogZ2V0IGltYWdlIHByb3BlcnRpZXMgb2YgdGhlIHBpY3R1cmUgKi8KKwl7CisJCWlmICh3OTk2OGNmX3NlbnNvcl9nZXRfcGljdHVyZShjYW0pKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZjYW0tPnBpY3R1cmUsIHNpemVvZihjYW0tPnBpY3R1cmUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURCRyg1LCAiVklESU9DR1BJQ1Qgc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DU1BJQ1Q6IC8qIGNoYW5nZSBwaWN0dXJlIHNldHRpbmdzICovCisJeworCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0OworCQlpbnQgZXJyID0gMDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnBpY3QsIGFyZywgc2l6ZW9mKHBpY3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICggKGNhbS0+Zm9yY2VfcGFsZXR0ZSB8fCAhdzk5NjhjZl92cHApIAorCQkgICAgICYmIHBpY3QucGFsZXR0ZSAhPSBjYW0tPnBpY3R1cmUucGFsZXR0ZSApIHsKKwkJCURCRyg0LCAiUGFsZXR0ZSAlcyByZWplY3RlZDogb25seSAlcyBpcyBhbGxvd2VkIiwKKwkJCSAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBwaWN0LnBhbGV0dGUpLAorCQkJICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIGNhbS0+cGljdHVyZS5wYWxldHRlKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCF3OTk2OGNmX3ZhbGlkX3BhbGV0dGUocGljdC5wYWxldHRlKSkgeworCQkJREJHKDQsICJQYWxldHRlICVzIG5vdCBzdXBwb3J0ZWQuIFZJRElPQ1NQSUNUIGZhaWxlZCIsCisJCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgcGljdC5wYWxldHRlKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFjYW0tPmZvcmNlX3BhbGV0dGUpIHsKKwkJICAgaWYgKGNhbS0+ZGVjb21wcmVzc2lvbiA9PSAwKSB7CisJCSAgICAgIGlmICh3OTk2OGNmX25lZWRfZGVjb21wcmVzc2lvbihwaWN0LnBhbGV0dGUpKSB7CisJCSAgICAgICAgIERCRyg0LCAiRGVjb21wcmVzc2lvbiBkaXNhYmxlZDogcGFsZXR0ZSAlcyBpcyBub3QgIgorCQkgICAgICAgICAgICAgICAgImFsbG93ZWQuIFZJRElPQ1NQSUNUIGZhaWxlZCIsCisJCSAgICAgICAgICAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBwaWN0LnBhbGV0dGUpKQorCQkgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJICAgICAgfQorCQkgICB9IGVsc2UgaWYgKGNhbS0+ZGVjb21wcmVzc2lvbiA9PSAxKSB7CisJCSAgICAgIGlmICghdzk5NjhjZl9uZWVkX2RlY29tcHJlc3Npb24ocGljdC5wYWxldHRlKSkgeworCQkgICAgICAgICBEQkcoNCwgIkRlY29tcHJlc3Npb24gZm9yY2VkOiBwYWxldHRlICVzIGlzIG5vdCAiCisJCSAgICAgICAgICAgICAgICAiYWxsb3dlZC4gVklESU9DU1BJQ1QgZmFpbGVkIiwKKwkJICAgICAgICAgICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIHBpY3QucGFsZXR0ZSkpCisJCSAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkgICAgICB9CisJCSAgIH0KKwkJfQorCisJCWlmIChwaWN0LmRlcHRoICE9IHc5OTY4Y2ZfdmFsaWRfZGVwdGgocGljdC5wYWxldHRlKSkgeworCQkJREJHKDQsICJSZXF1ZXN0ZWQgZGVwdGggJXUgYnBwIGlzIG5vdCB2YWxpZCBmb3IgJXMgIgorCQkJICAgICAgICJwYWxldHRlOiBpZ25vcmVkIGFuZCBjaGFuZ2VkIHRvICV1IGJwcCIsIAorCQkJICAgIHBpY3QuZGVwdGgsIHN5bWJvbGljKHY0bDFfcGxpc3QsIHBpY3QucGFsZXR0ZSksCisJCQkgICAgdzk5NjhjZl92YWxpZF9kZXB0aChwaWN0LnBhbGV0dGUpKQorCQkJcGljdC5kZXB0aCA9IHc5OTY4Y2ZfdmFsaWRfZGVwdGgocGljdC5wYWxldHRlKTsKKwkJfQorCisJCWlmIChwaWN0LnBhbGV0dGUgIT0gY2FtLT5waWN0dXJlLnBhbGV0dGUpIHsKKwkJCWlmKCpjYW0tPnJlcXVlc3RlZF9mcmFtZQorCQkJICAgfHwgY2FtLT5mcmFtZV9jdXJyZW50LT5xdWV1ZWQpIHsKKwkJCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUKKwkJCQkgICAgICAoIGNhbS0+d2FpdF9xdWV1ZSwKKwkJCQkgICAgICAgIGNhbS0+ZGlzY29ubmVjdGVkIHx8CisJCQkJICAgICAgICAoISpjYW0tPnJlcXVlc3RlZF9mcmFtZSAmJgorCQkJCSAgICAgICAgICFjYW0tPmZyYW1lX2N1cnJlbnQtPnF1ZXVlZCkgKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlyZXR1cm4gZXJyOworCQkJCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkKKwkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisKKwkJCWlmICh3OTk2OGNmX3N0b3BfdHJhbnNmZXIoY2FtKSkKKwkJCQlnb3RvIGlvY3RsX2ZhaWw7CisKKwkJCWlmICh3OTk2OGNmX3NldF9waWN0dXJlKGNhbSwgcGljdCkpCisJCQkJZ290byBpb2N0bF9mYWlsOworCisJCQlpZiAodzk5NjhjZl9zdGFydF90cmFuc2ZlcihjYW0pKQorCQkJCWdvdG8gaW9jdGxfZmFpbDsKKworCQl9IGVsc2UgaWYgKHc5OTY4Y2Zfc2Vuc29yX3VwZGF0ZV9waWN0dXJlKGNhbSwgcGljdCkpCisJCQlyZXR1cm4gLUVJTzsKKworCisJCURCRyg1LCAiVklESU9DU1BJQ1Qgc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DU1dJTjogLyogc2V0IGNhcHR1cmUgYXJlYSAqLworCXsKKwkJc3RydWN0IHZpZGVvX3dpbmRvdyB3aW47CisJCWludCBlcnIgPSAwOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmd2luLCBhcmcsIHNpemVvZih3aW4pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURCRyg2LCAiVklESU9DU1dJTiBjYWxsZWQ6IGNsaXBjb3VudD0lZCwgZmxhZ3M9JXUsICIKKwkJICAgICAgICJ4PSV1LCB5PSV1LCAldXgldSIsIHdpbi5jbGlwY291bnQsIHdpbi5mbGFncywKKwkJICAgIHdpbi54LCB3aW4ueSwgd2luLndpZHRoLCB3aW4uaGVpZ2h0KQorCisJCWlmICh3aW4uY2xpcGNvdW50ICE9IDAgfHwgd2luLmZsYWdzICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoKGVyciA9IHc5OTY4Y2ZfYWRqdXN0X3dpbmRvd19zaXplKGNhbSwgKHUxNiopJndpbi53aWR0aCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2Kikmd2luLmhlaWdodCkpKSB7CisJCQlEQkcoNCwgIlJlc29sdXRpb24gbm90IHN1cHBvcnRlZCAoJXV4JXUpLiAiCisJCQkgICAgICAgIlZJRElPQ1NXSU4gZmFpbGVkIiwgd2luLndpZHRoLCB3aW4uaGVpZ2h0KQorCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlmICh3aW4ueCAhPSBjYW0tPndpbmRvdy54IHx8CisJCSAgICB3aW4ueSAhPSBjYW0tPndpbmRvdy55IHx8CisJCSAgICB3aW4ud2lkdGggIT0gY2FtLT53aW5kb3cud2lkdGggfHwKKwkJICAgIHdpbi5oZWlnaHQgIT0gY2FtLT53aW5kb3cuaGVpZ2h0KSB7CisJCQlpZigqY2FtLT5yZXF1ZXN0ZWRfZnJhbWUKKwkJCSAgIHx8IGNhbS0+ZnJhbWVfY3VycmVudC0+cXVldWVkKSB7CisJCQkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlCisJCQkJICAgICAgKCBjYW0tPndhaXRfcXVldWUsCisJCQkJICAgICAgICBjYW0tPmRpc2Nvbm5lY3RlZCB8fAorCQkJCSAgICAgICAgKCEqY2FtLT5yZXF1ZXN0ZWRfZnJhbWUgJiYKKwkJCQkgICAgICAgICAhY2FtLT5mcmFtZV9jdXJyZW50LT5xdWV1ZWQpICk7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpCisJCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCisJCQlpZiAodzk5NjhjZl9zdG9wX3RyYW5zZmVyKGNhbSkpCisJCQkJZ290byBpb2N0bF9mYWlsOworCisJCQkvKiBUaGlzIF9tdXN0XyBiZSBjYWxsZWQgYmVmb3JlIHNldF93aW5kb3coKSAqLworCQkJaWYgKHc5OTY4Y2Zfc2V0X3BpY3R1cmUoY2FtLCBjYW0tPnBpY3R1cmUpKQorCQkJCWdvdG8gaW9jdGxfZmFpbDsKKworCQkJaWYgKHc5OTY4Y2Zfc2V0X3dpbmRvdyhjYW0sIHdpbikpCisJCQkJZ290byBpb2N0bF9mYWlsOworCisJCQlpZiAodzk5NjhjZl9zdGFydF90cmFuc2ZlcihjYW0pKQorCQkJCWdvdG8gaW9jdGxfZmFpbDsKKwkJfQorCisJCURCRyg1LCAiVklESU9DU1dJTiBzdWNjZXNzZnVsbHkgY2FsbGVkLiAiKQorCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ0dXSU46IC8qIGdldCBjdXJyZW50IHdpbmRvdyBwcm9wZXJ0aWVzICovCisJeworCQlpZiAoY29weV90b191c2VyKGFyZywmY2FtLT53aW5kb3csc2l6ZW9mKHN0cnVjdCB2aWRlb193aW5kb3cpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURCRyg1LCAiVklESU9DR1dJTiBzdWNjZXNzZnVsbHkgY2FsbGVkIikKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NHTUJVRjogLyogcmVxdWVzdCBmb3IgbWVtb3J5IChtYXBwZWQpIGJ1ZmZlciAqLworCXsKKwkJc3RydWN0IHZpZGVvX21idWYgbWJ1ZjsKKwkJdTggaTsKKworCQltYnVmLnNpemUgPSBjYW0tPm5idWZmZXJzICogY2FtLT5mcmFtZVswXS5zaXplOworCQltYnVmLmZyYW1lcyA9IGNhbS0+bmJ1ZmZlcnM7CisJCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZmZXJzOyBpKyspCisJCQltYnVmLm9mZnNldHNbaV0gPSAodW5zaWduZWQgbG9uZyljYW0tPmZyYW1lW2ldLmJ1ZmZlciAtCisJCQkgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyljYW0tPmZyYW1lWzBdLmJ1ZmZlcjsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJm1idWYsIHNpemVvZihtYnVmKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEQkcoNSwgIlZJRElPQ0dNQlVGIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQorCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ01DQVBUVVJFOiAvKiBzdGFydCB0aGUgY2FwdHVyZSB0byBhIGZyYW1lICovCisJeworCQlzdHJ1Y3QgdmlkZW9fbW1hcCBtbWFwOworCQlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiBmcjsKKwkJaW50IGVyciA9IDA7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtbWFwLCBhcmcsIHNpemVvZihtbWFwKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEQkcoNiwgIlZJRElPQ01DQVBUVVJFIGNhbGxlZDogZnJhbWUgIyV1LCBmb3JtYXQ9JXMsICVkeCVkIiwKKwkJICAgIG1tYXAuZnJhbWUsIHN5bWJvbGljKHY0bDFfcGxpc3QsIG1tYXAuZm9ybWF0KSwgCisJCSAgICBtbWFwLndpZHRoLCBtbWFwLmhlaWdodCkKKworCQlpZiAobW1hcC5mcmFtZSA+PSBjYW0tPm5idWZmZXJzKSB7CisJCQlEQkcoNCwgIkludmFsaWQgZnJhbWUgbnVtYmVyICgldSkuICIKKwkJCSAgICAgICAiVklESU9DTUNBUFRVUkUgZmFpbGVkIiwgbW1hcC5mcmFtZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKG1tYXAuZm9ybWF0IT1jYW0tPnBpY3R1cmUucGFsZXR0ZSAmJiAKKwkJICAgIChjYW0tPmZvcmNlX3BhbGV0dGUgfHwgIXc5OTY4Y2ZfdnBwKSkgeworCQkJREJHKDQsICJQYWxldHRlICVzIHJlamVjdGVkOiBvbmx5ICVzIGlzIGFsbG93ZWQiLAorCQkJICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIG1tYXAuZm9ybWF0KSwKKwkJCSAgICBzeW1ib2xpYyh2NGwxX3BsaXN0LCBjYW0tPnBpY3R1cmUucGFsZXR0ZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICghdzk5NjhjZl92YWxpZF9wYWxldHRlKG1tYXAuZm9ybWF0KSkgeworCQkJREJHKDQsICJQYWxldHRlICVzIG5vdCBzdXBwb3J0ZWQuICIKKwkJCSAgICAgICAiVklESU9DTUNBUFRVUkUgZmFpbGVkIiwgCisJCQkgICAgc3ltYm9saWModjRsMV9wbGlzdCwgbW1hcC5mb3JtYXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoIWNhbS0+Zm9yY2VfcGFsZXR0ZSkgeworCQkgICBpZiAoY2FtLT5kZWNvbXByZXNzaW9uID09IDApIHsKKwkJICAgICAgaWYgKHc5OTY4Y2ZfbmVlZF9kZWNvbXByZXNzaW9uKG1tYXAuZm9ybWF0KSkgeworCQkgICAgICAgICBEQkcoNCwgIkRlY29tcHJlc3Npb24gZGlzYWJsZWQ6IHBhbGV0dGUgJXMgaXMgbm90ICIKKwkJICAgICAgICAgICAgICAgICJhbGxvd2VkLiBWSURJT0NTUElDVCBmYWlsZWQiLAorCQkgICAgICAgICAgICAgc3ltYm9saWModjRsMV9wbGlzdCwgbW1hcC5mb3JtYXQpKQorCQkgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJICAgICAgfQorCQkgICB9IGVsc2UgaWYgKGNhbS0+ZGVjb21wcmVzc2lvbiA9PSAxKSB7CisJCSAgICAgIGlmICghdzk5NjhjZl9uZWVkX2RlY29tcHJlc3Npb24obW1hcC5mb3JtYXQpKSB7CisJCSAgICAgICAgIERCRyg0LCAiRGVjb21wcmVzc2lvbiBmb3JjZWQ6IHBhbGV0dGUgJXMgaXMgbm90ICIKKwkJICAgICAgICAgICAgICAgICJhbGxvd2VkLiBWSURJT0NTUElDVCBmYWlsZWQiLAorCQkgICAgICAgICAgICAgc3ltYm9saWModjRsMV9wbGlzdCwgbW1hcC5mb3JtYXQpKQorCQkgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJICAgICAgfQorCQkgICB9CisJCX0KKworCQlpZiAoKGVyciA9IHc5OTY4Y2ZfYWRqdXN0X3dpbmRvd19zaXplKGNhbSwgKHUxNiopJm1tYXAud2lkdGgsIAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MTYqKSZtbWFwLmhlaWdodCkpKSB7CisJCQlEQkcoNCwgIlJlc29sdXRpb24gbm90IHN1cHBvcnRlZCAoJWR4JWQpLiAiCisJCQkgICAgICAgIlZJRElPQ01DQVBUVVJFIGZhaWxlZCIsCisJCQkgICAgbW1hcC53aWR0aCwgbW1hcC5oZWlnaHQpCisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJZnIgPSAmY2FtLT5mcmFtZVttbWFwLmZyYW1lXTsKKworCQlpZiAobW1hcC53aWR0aCAgIT0gY2FtLT53aW5kb3cud2lkdGggfHwKKwkJICAgIG1tYXAuaGVpZ2h0ICE9IGNhbS0+d2luZG93LmhlaWdodCB8fAorCQkgICAgbW1hcC5mb3JtYXQgIT0gY2FtLT5waWN0dXJlLnBhbGV0dGUpIHsKKworCQkJc3RydWN0IHZpZGVvX3dpbmRvdyB3aW47CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0OworCisJCQlpZigqY2FtLT5yZXF1ZXN0ZWRfZnJhbWUKKwkJCSAgIHx8IGNhbS0+ZnJhbWVfY3VycmVudC0+cXVldWVkKSB7CisJCQkJREJHKDYsICJWSURJT0NNQ0FQVFVSRS4gQ2hhbmdlIHNldHRpbmdzIGZvciAiCisJCQkJICAgICAgICJmcmFtZSAjJXU6ICVkeCVkLCBmb3JtYXQgJXMuIFdhaXQuLi4iLAorCQkJCSAgICBtbWFwLmZyYW1lLCBtbWFwLndpZHRoLCBtbWFwLmhlaWdodCwKKwkJCSAgICAgICAgICAgIHN5bWJvbGljKHY0bDFfcGxpc3QsIG1tYXAuZm9ybWF0KSkKKwkJCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUKKwkJCQkgICAgICAoIGNhbS0+d2FpdF9xdWV1ZSwKKwkJCQkgICAgICAgIGNhbS0+ZGlzY29ubmVjdGVkIHx8CisJCQkJICAgICAgICAoISpjYW0tPnJlcXVlc3RlZF9mcmFtZSAmJgorCQkJCSAgICAgICAgICFjYW0tPmZyYW1lX2N1cnJlbnQtPnF1ZXVlZCkgKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlyZXR1cm4gZXJyOworCQkJCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkKKwkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisKKwkJCW1lbWNweSgmd2luLCAmY2FtLT53aW5kb3csIHNpemVvZih3aW4pKTsKKwkJCW1lbWNweSgmcGljdCwgJmNhbS0+cGljdHVyZSwgc2l6ZW9mKHBpY3QpKTsKKwkJCXdpbi53aWR0aCA9IG1tYXAud2lkdGg7CisJCQl3aW4uaGVpZ2h0ID0gbW1hcC5oZWlnaHQ7CisJCQlwaWN0LnBhbGV0dGUgPSBtbWFwLmZvcm1hdDsKKworCQkJaWYgKHc5OTY4Y2Zfc3RvcF90cmFuc2ZlcihjYW0pKQorCQkJCWdvdG8gaW9jdGxfZmFpbDsKKworCQkJLyogVGhpcyBiZWZvcmUgc2V0X3dpbmRvdyAqLworCQkJaWYgKHc5OTY4Y2Zfc2V0X3BpY3R1cmUoY2FtLCBwaWN0KSkgCisJCQkJZ290byBpb2N0bF9mYWlsOworCisJCQlpZiAodzk5NjhjZl9zZXRfd2luZG93KGNhbSwgd2luKSkKKwkJCQlnb3RvIGlvY3RsX2ZhaWw7CisKKwkJCWlmICh3OTk2OGNmX3N0YXJ0X3RyYW5zZmVyKGNhbSkpCisJCQkJZ290byBpb2N0bF9mYWlsOworCisJCX0gZWxzZSAJaWYgKGZyLT5xdWV1ZWQpIHsKKworCQkJREJHKDYsICJXYWl0IHVudGlsIGZyYW1lICMldSBpcyBmcmVlIiwgbW1hcC5mcmFtZSkKKwkJCQorCQkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNhbS0+d2FpdF9xdWV1ZSwgCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5kaXNjb25uZWN0ZWQgfHwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWZyLT5xdWV1ZWQpKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCWlmIChjYW0tPmRpc2Nvbm5lY3RlZCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCXc5OTY4Y2ZfcHVzaF9mcmFtZShjYW0sIG1tYXAuZnJhbWUpOworCQlEQkcoNSwgIlZJRElPQ01DQVBUVVJFKCV1KTogc3VjY2Vzc2Z1bGx5IGNhbGxlZCIsIG1tYXAuZnJhbWUpCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DU1lOQzogLyogd2FpdCB1bnRpbCB0aGUgY2FwdHVyZSBvZiBhIGZyYW1lIGlzIGZpbmlzaGVkICovCisJeworCQl1bnNpZ25lZCBpbnQgZl9udW07CisJCXN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqIGZyOworCQlpbnQgZXJyID0gMDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmZfbnVtLCBhcmcsIHNpemVvZihmX251bSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGZfbnVtID49IGNhbS0+bmJ1ZmZlcnMpIHsKKwkJCURCRyg0LCAiSW52YWxpZCBmcmFtZSBudW1iZXIgKCV1KS4gIgorCQkJICAgICAgICJWSURJT0NNQ0FQVFVSRSBmYWlsZWQiLCBmX251bSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJREJHKDYsICJWSURJT0NTWU5DIGNhbGxlZCBmb3IgZnJhbWUgIyV1IiwgZl9udW0pCisKKwkJZnIgPSAmY2FtLT5mcmFtZVtmX251bV07CisKKwkJc3dpdGNoIChmci0+c3RhdHVzKSB7CisJCWNhc2UgRl9VTlVTRUQ6CisJCQlpZiAoIWZyLT5xdWV1ZWQpIHsKKwkJCQlEQkcoNCwgIlZJRElPU1lOQzogRnJhbWUgIyV1IG5vdCByZXF1ZXN0ZWQhIiwKKwkJCQkgICAgZl9udW0pCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCWNhc2UgRl9FUlJPUjoKKwkJY2FzZSBGX0dSQUJCSU5HOgorCQkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNhbS0+d2FpdF9xdWV1ZSwgCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyLT5zdGF0dXMgPT0gRl9SRUFEWSkKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjYW0tPmRpc2Nvbm5lY3RlZCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCQlpZiAoY2FtLT5kaXNjb25uZWN0ZWQpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlicmVhazsKKwkJY2FzZSBGX1JFQURZOgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAodzk5NjhjZl92cHApCisJCQl3OTk2OGNmX3Bvc3Rwcm9jZXNzX2ZyYW1lKGNhbSwgZnIpOworCisJCWZyLT5zdGF0dXMgPSBGX1VOVVNFRDsKKworCQlEQkcoNSwgIlZJRElPQ1NZTkMoJXUpIHN1Y2Nlc3NmdWxseSBjYWxsZWQiLCBmX251bSkKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NHVU5JVDovKiByZXBvcnQgdGhlIHVuaXQgbnVtYmVycyBvZiB0aGUgYXNzb2NpYXRlZCBkZXZpY2VzKi8KKwl7CisJCXN0cnVjdCB2aWRlb191bml0IHVuaXQgPSB7CisJCQkudmlkZW8gPSBjYW0tPnY0bGRldi0+bWlub3IsCisJCQkudmJpID0gVklERU9fTk9fVU5JVCwKKwkJCS5yYWRpbyA9IFZJREVPX05PX1VOSVQsCisJCQkuYXVkaW8gPSBWSURFT19OT19VTklULAorCQkJLnRlbGV0ZXh0ID0gVklERU9fTk9fVU5JVCwKKwkJfTsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJnVuaXQsIHNpemVvZih1bml0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEQkcoNSwgIlZJRElPQ0dVTklUIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQorCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ0tFWToKKwkJcmV0dXJuIDA7CisKKwljYXNlIFZJRElPQ0dGQlVGOgorCXsKKwkJaWYgKGNsZWFyX3VzZXIoYXJnLCBzaXplb2Yoc3RydWN0IHZpZGVvX2J1ZmZlcikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJREJHKDUsICJWSURJT0NHRkJVRiBzdWNjZXNzZnVsbHkgY2FsbGVkIikKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NHVFVORVI6CisJeworCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgdHVuZXI7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdHVuZXIsIGFyZywgc2l6ZW9mKHR1bmVyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodHVuZXIudHVuZXIgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN0cmNweSh0dW5lci5uYW1lLCAibm9fdHVuZXIiKTsKKwkJdHVuZXIucmFuZ2Vsb3cgPSAwOworCQl0dW5lci5yYW5nZWhpZ2ggPSAwOworCQl0dW5lci5mbGFncyA9IFZJREVPX1RVTkVSX05PUk07CisJCXR1bmVyLm1vZGUgPSBWSURFT19NT0RFX0FVVE87CisJCXR1bmVyLnNpZ25hbCA9IDB4ZmZmZjsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJnR1bmVyLCBzaXplb2YodHVuZXIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURCRyg1LCAiVklESU9DR1RVTkVSIHN1Y2Nlc3NmdWxseSBjYWxsZWQiKQorCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ1NUVU5FUjoKKwl7CisJCXN0cnVjdCB2aWRlb190dW5lciB0dW5lcjsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0dW5lciwgYXJnLCBzaXplb2YodHVuZXIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICh0dW5lci50dW5lciAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHR1bmVyLm1vZGUgIT0gVklERU9fTU9ERV9BVVRPKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJREJHKDUsICJWSURJT0NTVFVORVIgc3VjY2Vzc2Z1bGx5IGNhbGxlZCIpCisJCXJldHVybiAwOworCX0KKworCWNhc2UgVklESU9DU0ZCVUY6CisJY2FzZSBWSURJT0NDQVBUVVJFOgorCWNhc2UgVklESU9DR0ZSRVE6CisJY2FzZSBWSURJT0NTRlJFUToKKwljYXNlIFZJRElPQ0dBVURJTzoKKwljYXNlIFZJRElPQ1NBVURJTzoKKwljYXNlIFZJRElPQ1NQTEFZTU9ERToKKwljYXNlIFZJRElPQ1NXUklURU1PREU6CisJY2FzZSBWSURJT0NHUExBWUlORk86CisJY2FzZSBWSURJT0NTTUlDUk9DT0RFOgorCWNhc2UgVklESU9DR1ZCSUZNVDoKKwljYXNlIFZJRElPQ1NWQklGTVQ6CisJCURCRyg0LCAiVW5zdXBwb3J0ZWQgVjRMMSBJT0N0bDogVklESU9DJXMgIgorCQkgICAgICAgIih0eXBlIDB4JTAxWCwgIgorCQkgICAgICAgIm4uIDB4JTAxWCwgIgorCQkgICAgICAgImRpci4gMHglMDFYLCAiIAorCQkgICAgICAgInNpemUgMHglMDJYKSIsCisJCSAgICBWNEwxX0lPQ1RMKGNtZCksCisJCSAgICBfSU9DX1RZUEUoY21kKSxfSU9DX05SKGNtZCksX0lPQ19ESVIoY21kKSxfSU9DX1NJWkUoY21kKSkKKworCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlZmF1bHQ6CisJCURCRyg0LCAiSW52YWxpZCBWNEwxIElPQ3RsOiBWSURJT0MlcyAiCisJCSAgICAgICAidHlwZSAweCUwMVgsICIKKwkJICAgICAgICJuLiAweCUwMVgsICIKKwkJICAgICAgICJkaXIuIDB4JTAxWCwgIgorCQkgICAgICAgInNpemUgMHglMDJYIiwKKwkJICAgIFY0TDFfSU9DVEwoY21kKSwKKwkJICAgIF9JT0NfVFlQRShjbWQpLF9JT0NfTlIoY21kKSxfSU9DX0RJUihjbWQpLF9JT0NfU0laRShjbWQpKQorCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwl9IC8qIGVuZCBvZiBzd2l0Y2ggKi8KKworaW9jdGxfZmFpbDoKKwljYW0tPm1pc2NvbmZpZ3VyZWQgPSAxOworCURCRygxLCAiVklESU9DJXMgZmFpbGVkIGJlY2F1c2Ugb2YgaGFyZHdhcmUgcHJvYmxlbXMuICIKKwkgICAgICAgIlRvIHVzZSB0aGUgY2FtZXJhLCBjbG9zZSBhbmQgb3BlbiBpdCBhZ2Fpbi4iLCBWNEwxX0lPQ1RMKGNtZCkpCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdzk5NjhjZl9mb3BzID0geworCS5vd25lciA9ICAgVEhJU19NT0RVTEUsCisJLm9wZW4gPSAgICB3OTk2OGNmX29wZW4sCisJLnJlbGVhc2UgPSB3OTk2OGNmX3JlbGVhc2UsCisJLnJlYWQgPSAgICB3OTk2OGNmX3JlYWQsCisJLmlvY3RsID0gICB3OTk2OGNmX2lvY3RsLAorCS5tbWFwID0gICAgdzk5NjhjZl9tbWFwLAorCS5sbHNlZWsgPSAgbm9fbGxzZWVrLAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVU0IgcHJvYmUgYW5kIFY0TCByZWdpc3RyYXRpb24sIGRpc2Nvbm5lY3QgYW5kIGlkX3RhYmxlW10gZGVmaW5pdGlvbiAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK3c5OTY4Y2ZfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlKiBpbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCogaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtOworCWludCBlcnIgPSAwOworCWVudW0gdzk5NjhjZl9tb2RlbF9pZCBtb2RfaWQ7CisJc3RydWN0IGxpc3RfaGVhZCogcHRyOworCXU4IHNjID0gMDsgLyogbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBjYW1lcmFzICovCisJc3RhdGljIHVuc2lnbmVkIHNob3J0IGRldl9uciA9IDA7IC8qIHdlIGFyZSBoYW5kbGluZyBkZXZpY2UgbnVtYmVyIG4gKi8KKworCWlmIChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSAgPT0gd2luYm9uZF9pZF90YWJsZVswXS5pZFZlbmRvciAmJgorCSAgICBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gd2luYm9uZF9pZF90YWJsZVswXS5pZFByb2R1Y3QpCisJCW1vZF9pZCA9IFc5OTY4Q0ZfTU9EX0NMVkJXR1A7IC8qIHNlZSBjYW1saXN0W10gdGFibGUgKi8KKwllbHNlIGlmIChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSAgPT0gd2luYm9uZF9pZF90YWJsZVsxXS5pZFZlbmRvciAmJgorCSAgICAgICAgIGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSB3aW5ib25kX2lkX3RhYmxlWzFdLmlkUHJvZHVjdCkKKwkJbW9kX2lkID0gVzk5NjhDRl9NT0RfR0VORVJJQzsgLyogc2VlIGNhbWxpc3RbXSB0YWJsZSAqLworCWVsc2UKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYW0gPSAoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKikKKwkgICAgICAgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IHc5OTY4Y2ZfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYW0pCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGNhbSwgMCwgc2l6ZW9mKCpjYW0pKTsKKworCWluaXRfTVVURVgoJmNhbS0+ZGV2X3NlbSk7CisJZG93bigmY2FtLT5kZXZfc2VtKTsKKworCWNhbS0+dXNiZGV2ID0gdWRldjsKKwkvKiBOT1RFOiBhIGxvY2FsIGNvcHkgaXMgdXNlZCB0byBhdm9pZCBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbnMgKi8KKwltZW1jcHkoJmNhbS0+ZGV2LCAmdWRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGRldmljZSkpOworCisJREJHKDIsICIlcyBkZXRlY3RlZCIsIHN5bWJvbGljKGNhbWxpc3QsIG1vZF9pZCkpCisKKwlpZiAoc2ltY2FtcyA+IFc5OTY4Q0ZfTUFYX0RFVklDRVMpCisJCXNpbWNhbXMgPSBXOTk2OENGX1NJTUNBTVM7CisKKwkvKiBIb3cgbWFueSBjYW1lcmFzIGFyZSBjb25uZWN0ZWQgPyAqLworCWRvd24oJnc5OTY4Y2ZfZGV2bGlzdF9zZW0pOworCWxpc3RfZm9yX2VhY2gocHRyLCAmdzk5NjhjZl9kZXZfbGlzdCkKKwkJc2MrKzsKKwl1cCgmdzk5NjhjZl9kZXZsaXN0X3NlbSk7CisKKwlpZiAoc2MgPj0gc2ltY2FtcykgeworCQlEQkcoMiwgIkRldmljZSByZWplY3RlZDogdG9vIG1hbnkgY29ubmVjdGVkIGNhbWVyYXMgIgorCQkgICAgICAgIihtYXguICV1KSIsIHNpbWNhbXMpCisJCWVyciA9IC1FUEVSTTsKKwkJZ290byBmYWlsOworCX0KKworCisJLyogQWxsb2NhdGUgMiBieXRlcyBvZiBtZW1vcnkgZm9yIGNhbWVyYSBjb250cm9sIFVTQiB0cmFuc2ZlcnMgKi8KKwlpZiAoIShjYW0tPmNvbnRyb2xfYnVmZmVyID0gKHUxNiopa21hbGxvYygyLCBHRlBfS0VSTkVMKSkpIHsKKwkJREJHKDEsIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgY2FtZXJhIGNvbnRyb2wgdHJhbnNmZXJzIikKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwltZW1zZXQoY2FtLT5jb250cm9sX2J1ZmZlciwgMCwgMik7CisKKwkvKiBBbGxvY2F0ZSA4IGJ5dGVzIG9mIG1lbW9yeSBmb3IgVVNCIGRhdGEgdHJhbnNmZXJzIHRvIHRoZSBGU0IgKi8KKwlpZiAoIShjYW0tPmRhdGFfYnVmZmVyID0gKHUxNiopa21hbGxvYyg4LCBHRlBfS0VSTkVMKSkpIHsKKwkJREJHKDEsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRhdGEgIgorCQkgICAgICAgInRyYW5zZmVycyB0byB0aGUgRlNCIikKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwltZW1zZXQoY2FtLT5kYXRhX2J1ZmZlciwgMCwgOCk7CisKKwkvKiBSZWdpc3RlciB0aGUgVjRMIGRldmljZSAqLworCWNhbS0+djRsZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKCFjYW0tPnY0bGRldikgeworCQlEQkcoMSwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgVjRMIHN0cnVjdHVyZSIpCisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlzdHJjcHkoY2FtLT52NGxkZXYtPm5hbWUsIHN5bWJvbGljKGNhbWxpc3QsIG1vZF9pZCkpOworCWNhbS0+djRsZGV2LT5vd25lciA9IFRISVNfTU9EVUxFOworCWNhbS0+djRsZGV2LT50eXBlID0gVklEX1RZUEVfQ0FQVFVSRSB8IFZJRF9UWVBFX1NDQUxFUzsKKwljYW0tPnY0bGRldi0+aGFyZHdhcmUgPSBWSURfSEFSRFdBUkVfVzk5NjhDRjsKKwljYW0tPnY0bGRldi0+Zm9wcyA9ICZ3OTk2OGNmX2ZvcHM7CisJY2FtLT52NGxkZXYtPm1pbm9yID0gdmlkZW9fbnJbZGV2X25yXTsKKwljYW0tPnY0bGRldi0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlOworCXZpZGVvX3NldF9kcnZkYXRhKGNhbS0+djRsZGV2LCBjYW0pOworCWNhbS0+djRsZGV2LT5kZXYgPSAmY2FtLT5kZXY7CisKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoY2FtLT52NGxkZXYsIFZGTF9UWVBFX0dSQUJCRVIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX25yW2Rldl9ucl0pOworCWlmIChlcnIpIHsKKwkJREJHKDEsICJWNEwgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKQorCQlpZiAoZXJyID09IC1FTkZJTEUgJiYgdmlkZW9fbnJbZGV2X25yXSA9PSAtMSkKKwkJCURCRygyLCAiQ291bGRuJ3QgZmluZCBhIGZyZWUgL2Rldi92aWRlb1ggbm9kZSIpCisJCXZpZGVvX25yW2Rldl9ucl0gPSAtMTsKKwkJZGV2X25yID0gKGRldl9uciA8IFc5OTY4Q0ZfTUFYX0RFVklDRVMtMSkgPyBkZXZfbnIrMSA6IDA7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlEQkcoMiwgIlY0TCBkZXZpY2UgcmVnaXN0ZXJlZCBhcyAvZGV2L3ZpZGVvJWQiLCBjYW0tPnY0bGRldi0+bWlub3IpCisKKwkvKiBTZXQgc29tZSBiYXNpYyBjb25zdGFudHMgKi8KKwl3OTk2OGNmX2NvbmZpZ3VyZV9jYW1lcmEoY2FtLCB1ZGV2LCBtb2RfaWQsIGRldl9ucik7CisKKwkvKiBBZGQgYSBuZXcgZW50cnkgaW50byB0aGUgbGlzdCBvZiBWNEwgcmVnaXN0ZXJlZCBkZXZpY2VzICovCisJZG93bigmdzk5NjhjZl9kZXZsaXN0X3NlbSk7CisJbGlzdF9hZGQoJmNhbS0+djRsbGlzdCwgJnc5OTY4Y2ZfZGV2X2xpc3QpOworCXVwKCZ3OTk2OGNmX2Rldmxpc3Rfc2VtKTsKKwlkZXZfbnIgPSAoZGV2X25yIDwgVzk5NjhDRl9NQVhfREVWSUNFUy0xKSA/IGRldl9ucisxIDogMDsKKworCXc5OTY4Y2ZfdHVybl9vbl9sZWQoY2FtKTsKKworCXc5OTY4Y2ZfaTJjX2luaXQoY2FtKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2FtKTsKKwl1cCgmY2FtLT5kZXZfc2VtKTsKKwlyZXR1cm4gMDsKKworZmFpbDogLyogRnJlZSB1bnVzZWQgbWVtb3J5ICovCisJaWYgKGNhbS0+Y29udHJvbF9idWZmZXIpCisJCWtmcmVlKGNhbS0+Y29udHJvbF9idWZmZXIpOworCWlmIChjYW0tPmRhdGFfYnVmZmVyKQorCQlrZnJlZShjYW0tPmRhdGFfYnVmZmVyKTsKKwlpZiAoY2FtLT52NGxkZXYpCisJCXZpZGVvX2RldmljZV9yZWxlYXNlKGNhbS0+djRsZGV2KTsKKwl1cCgmY2FtLT5kZXZfc2VtKTsKKwlrZnJlZShjYW0pOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHZvaWQgdzk5NjhjZl91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSogaW50ZikKK3sKKwlzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSA9IAorCSAgIChzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqKXVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlkb3duX3dyaXRlKCZ3OTk2OGNmX2Rpc2Nvbm5lY3QpOworCisJaWYgKGNhbSkgeworCQkvKiBQcmV2ZW50IGNvbmN1cnJlbnQgYWNjZXNzZXMgdG8gZGF0YSAqLworCQlkb3duKCZjYW0tPmRldl9zZW0pOyAKKworCQljYW0tPmRpc2Nvbm5lY3RlZCA9IDE7CisKKwkJREJHKDIsICJEaXNjb25uZWN0aW5nICVzLi4uIiwgc3ltYm9saWMoY2FtbGlzdCwgY2FtLT5pZCkpCisKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmY2FtLT5vcGVuKTsKKworCQlpZiAoY2FtLT51c2VycykgeworCQkJREJHKDIsICJUaGUgZGV2aWNlIGlzIG9wZW4gKC9kZXYvdmlkZW8lZCkhICIKKwkJCSAgICAgICAiUHJvY2VzcyBuYW1lOiAlcy4gRGVyZWdpc3RyYXRpb24gYW5kIG1lbW9yeSAiCisJCQkgICAgICAgImRlYWxsb2NhdGlvbiBhcmUgZGVmZXJyZWQgb24gY2xvc2UuIiwKKwkJCSAgICBjYW0tPnY0bGRldi0+bWlub3IsIGNhbS0+Y29tbWFuZCkKKwkJCWNhbS0+bWlzY29uZmlndXJlZCA9IDE7CisJCQl3OTk2OGNmX3N0b3BfdHJhbnNmZXIoY2FtKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FtLT53YWl0X3F1ZXVlKTsKKwkJfSBlbHNlCisJCQl3OTk2OGNmX3JlbGVhc2VfcmVzb3VyY2VzKGNhbSk7CisKKwkJdXAoJmNhbS0+ZGV2X3NlbSk7CisKKwkJaWYgKCFjYW0tPnVzZXJzKQorCQkJa2ZyZWUoY2FtKTsKKwl9CisKKwl1cF93cml0ZSgmdzk5NjhjZl9kaXNjb25uZWN0KTsKK30KKworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdzk5NjhjZl91c2JfZHJpdmVyID0geworCS5vd25lciA9ICAgICAgVEhJU19NT0RVTEUsCisJLm5hbWUgPSAgICAgICAidzk5NjhjZiIsCisJLmlkX3RhYmxlID0gICB3aW5ib25kX2lkX3RhYmxlLAorCS5wcm9iZSA9ICAgICAgdzk5NjhjZl91c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSB3OTk2OGNmX3VzYl9kaXNjb25uZWN0LAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2R1bGUgaW5pdCwgZXhpdCBhbmQgaW50ZXJtb2R1bGUgY29tbXVuaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdzk5NjhjZl92cHBtb2RfZGV0ZWN0KHN0cnVjdCB3OTk2OGNmX2RldmljZSogY2FtKQoreworCWlmICghdzk5NjhjZl92cHApCisJCWlmICh2cHBtb2RfbG9hZCkKKwkJCXJlcXVlc3RfbW9kdWxlKCJ3OTk2OGNmLXZwcCIpOworCisJZG93bigmdzk5NjhjZl92cHBtb2RfbG9jayk7CisKKwlpZiAoIXc5OTY4Y2ZfdnBwKSB7CisJCURCRyg0LCAiVmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSBub3QgZGV0ZWN0ZWQiKQorCQl3OTk2OGNmX2FkanVzdF9jb25maWd1cmF0aW9uKGNhbSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghdHJ5X21vZHVsZV9nZXQodzk5NjhjZl92cHAtPm93bmVyKSkgeworCQlEQkcoMSwgIkNvdWxkbid0IGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mICIKKwkJICAgICAgICJ0aGUgdmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSIpCisJCXVwKCZ3OTk2OGNmX3ZwcG1vZF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJdzk5NjhjZl92cHAtPmJ1c3krKzsKKworCURCRyg1LCAiVmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSBkZXRlY3RlZCIpCisKK291dDoKKwl1cCgmdzk5NjhjZl92cHBtb2RfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgdzk5NjhjZl92cHBtb2RfcmVsZWFzZShzdHJ1Y3Qgdzk5NjhjZl9kZXZpY2UqIGNhbSkKK3sKKwlkb3duKCZ3OTk2OGNmX3ZwcG1vZF9sb2NrKTsKKworCWlmICh3OTk2OGNmX3ZwcCAmJiB3OTk2OGNmX3ZwcC0+YnVzeSkgeworCQltb2R1bGVfcHV0KHc5OTY4Y2ZfdnBwLT5vd25lcik7CisJCXc5OTY4Y2ZfdnBwLT5idXN5LS07CisJCXdha2VfdXAoJnc5OTY4Y2ZfdnBwbW9kX3dhaXQpOworCQlEQkcoNSwgIlZpZGVvIHBvc3QtcHJvY2Vzc2luZyBtb2R1bGUgcmVsZWFzZWQiKQorCX0KKworCXVwKCZ3OTk2OGNmX3ZwcG1vZF9sb2NrKTsKK30KKworCitpbnQgdzk5NjhjZl92cHBtb2RfcmVnaXN0ZXIoc3RydWN0IHc5OTY4Y2ZfdnBwX3QqIHZwcCkKK3sKKwlkb3duKCZ3OTk2OGNmX3ZwcG1vZF9sb2NrKTsKKworCWlmICh3OTk2OGNmX3ZwcCkgeworCQlLREJHKDEsICJWaWRlbyBwb3N0LXByb2Nlc3NpbmcgbW9kdWxlIGFscmVhZHkgcmVnaXN0ZXJlZCIpCisJCXVwKCZ3OTk2OGNmX3ZwcG1vZF9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdzk5NjhjZl92cHAgPSB2cHA7CisJdzk5NjhjZl92cHAtPmJ1c3kgPSAwOworCisJS0RCRygyLCAiVmlkZW8gcG9zdC1wcm9jZXNzaW5nIG1vZHVsZSByZWdpc3RlcmVkIikKKwl1cCgmdzk5NjhjZl92cHBtb2RfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKworaW50IHc5OTY4Y2ZfdnBwbW9kX2RlcmVnaXN0ZXIoc3RydWN0IHc5OTY4Y2ZfdnBwX3QqIHZwcCkKK3sKKwlkb3duKCZ3OTk2OGNmX3ZwcG1vZF9sb2NrKTsKKworCWlmICghdzk5NjhjZl92cHApIHsKKwkJdXAoJnc5OTY4Y2ZfdnBwbW9kX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodzk5NjhjZl92cHAgIT0gdnBwKSB7CisJCUtEQkcoMSwgIk9ubHkgdGhlIG93bmVyIGNhbiB1bnJlZ2lzdGVyIHRoZSB2aWRlbyAiCisJCSAgICAgICAgInBvc3QtcHJvY2Vzc2luZyBtb2R1bGUiKQorCQl1cCgmdzk5NjhjZl92cHBtb2RfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh3OTk2OGNmX3ZwcC0+YnVzeSkgeworCQlLREJHKDIsICJWaWRlbyBwb3N0LXByb2Nlc3NpbmcgbW9kdWxlIGJ1c3kuIFdhaXQgZm9yIGl0IHRvIGJlICIKKwkJICAgICAgICAicmVsZWFzZWQuLi4iKQorCQl1cCgmdzk5NjhjZl92cHBtb2RfbG9jayk7CisJCXdhaXRfZXZlbnQodzk5NjhjZl92cHBtb2Rfd2FpdCwgIXc5OTY4Y2ZfdnBwLT5idXN5KTsKKwkJdzk5NjhjZl92cHAgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwl3OTk2OGNmX3ZwcCA9IE5VTEw7CisKKwl1cCgmdzk5NjhjZl92cHBtb2RfbG9jayk7CisKK291dDoKKwlLREJHKDIsICJWaWRlbyBwb3N0LXByb2Nlc3NpbmcgbW9kdWxlIHVucmVnaXN0ZXJlZCIpCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgdzk5NjhjZl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlLREJHKDIsIFc5OTY4Q0ZfTU9EVUxFX05BTUUiICJXOTk2OENGX01PRFVMRV9WRVJTSU9OKQorCUtEQkcoMywgVzk5NjhDRl9NT0RVTEVfQVVUSE9SKQorCisJaWYgKG92bW9kX2xvYWQpCisJCXJlcXVlc3RfbW9kdWxlKCJvdmNhbWNoaXAiKTsKKworCWlmICgoZXJyID0gdXNiX3JlZ2lzdGVyKCZ3OTk2OGNmX3VzYl9kcml2ZXIpKSkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3OTk2OGNmX21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogdzk5NjhjZl91c2JfZGlzY29ubmVjdCgpIHdpbGwgYmUgY2FsbGVkICovCisJdXNiX2RlcmVnaXN0ZXIoJnc5OTY4Y2ZfdXNiX2RyaXZlcik7CisKKwlLREJHKDIsIFc5OTY4Q0ZfTU9EVUxFX05BTUUiIGRlcmVnaXN0ZXJlZCIpCit9CisKKworbW9kdWxlX2luaXQodzk5NjhjZl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdCh3OTk2OGNmX21vZHVsZV9leGl0KTsKKworCitFWFBPUlRfU1lNQk9MKHc5OTY4Y2ZfdnBwbW9kX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wodzk5NjhjZl92cHBtb2RfZGVyZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmLmggYi9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjYmZlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3c5OTY4Y2YuaApAQCAtMCwwICsxLDMzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmlkZW80TGludXggZHJpdmVyIGZvciBXOTk2Wzg3XUNGIEpQRUcgVVNCIER1YWwgTW9kZSBDYW1lcmEgQ2hpcC4gICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfVzk5NjhDRl9IXworI2RlZmluZSBfVzk5NjhDRl9IXworCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvb3ZjYW1jaGlwLmg+CisKKyNpbmNsdWRlICJ3OTk2OGNmX3ZwcC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWZhdWx0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVzk5NjhDRl9PVk1PRF9MT0FEICAgICAgMSAgLyogYXV0b21hdGljICdvdmNhbWNoaXAnIG1vZHVsZSBsb2FkaW5nICovCisjZGVmaW5lIFc5OTY4Q0ZfVlBQTU9EX0xPQUQgICAgIDEgIC8qIGF1dG9tYXRpYyAndzk5NjhjZi12cHAnIG1vZHVsZSBsb2FkaW5nICovCisKKy8qIENvbW1lbnQvdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBlbmFibGUvZGlzYWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgVzk5NjhDRl9ERUJVRworCisvKiBUaGVzZSBoYXZlIGVmZmVjdCBvbmx5IGlmIFc5OTY4Q0ZfREVCVUcgaXMgZGVmaW5lZCAqLworI2RlZmluZSBXOTk2OENGX0RFQlVHX0xFVkVMICAgIDIgLyogZnJvbSAwIHRvIDYuIDAgZm9yIG5vIGRlYnVnIGluZm9ybWF0aW9ucyAqLworI2RlZmluZSBXOTk2OENGX1NQRUNJRklDX0RFQlVHIDAgLyogMCBvciAxICovCisKKyNkZWZpbmUgVzk5NjhDRl9NQVhfREVWSUNFUyAgICAzMgorI2RlZmluZSBXOTk2OENGX1NJTUNBTVMgICAgICAgIFc5OTY4Q0ZfTUFYX0RFVklDRVMgLyogc2ltdWx0YW5lb3VzIGNhbWVyYXMgKi8KKworI2RlZmluZSBXOTk2OENGX01BWF9CVUZGRVJTICAgMzIKKyNkZWZpbmUgVzk5NjhDRl9CVUZGRVJTICAgICAgIDIgLyogbi4gb2YgZnJhbWUgYnVmZmVycyBmcm9tIDIgdG8gTUFYX0JVRkZFUlMgKi8KKworLyogTWF4aW11bSBkYXRhIHBheWxvYWQgc2l6ZXMgaW4gYnl0ZXMgZm9yIGFsdGVybmF0ZSBzZXR0aW5ncyAqLworc3RhdGljIGNvbnN0IHUxNiB3TWF4UGFja2V0U2l6ZVtdID0gezEwMjMsIDk1OSwgODk1LCA4MzEsIDc2NywgNzAzLCA2MzksIDU3NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTExLCA0NDcsIDM4MywgMzE5LCAyNTUsIDE5MSwgMTI3LCAgNjN9OworI2RlZmluZSBXOTk2OENGX1BBQ0tFVF9TSVpFICAgICAgMTAyMyAvKiBhY2NvcmRpbmcgdG8gd01heFBhY2tldFNpemVzW10gKi8KKyNkZWZpbmUgVzk5NjhDRl9NSU5fUEFDS0VUX1NJWkUgIDYzIC8qIG1pbmltdW0gdmFsdWUgKi8KKyNkZWZpbmUgVzk5NjhDRl9JU09fUEFDS0VUUyAgICAgIDUgLyogbi5vZiBwYWNrZXRzIGZvciBpc29jaHJvbm91cyB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgVzk5NjhDRl9VU0JfQ1RSTF9USU1FT1VUIDEwMDAgLyogdGltZW91dCAobXMpIGZvciB1c2IgY29udHJvbCBjb21tYW5kcyAqLworI2RlZmluZSBXOTk2OENGX1VSQlMgICAgICAgICAgICAgMiAvKiBuLiBvZiBzY2hlZHVsZWQgVVJCcyBmb3IgSVNPIHRyYW5zZmVyICovCisKKyNkZWZpbmUgVzk5NjhDRl9JMkNfQlVTX0RFTEFZICAgIDQgLyogZGVsYXkgaW4gdXMgZm9yIEkyQyBiaXQgci93IG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgVzk5NjhDRl9JMkNfUldfUkVUUklFUyAgIDE1IC8qIG51bWJlciBvZiBtYXggSTJDIHIvdyByZXRyaWVzICovCisKKy8qIEF2YWlsYWJsZSB2aWRlbyBmb3JtYXRzICovCitzdHJ1Y3Qgdzk5NjhjZl9mb3JtYXQgeworCWNvbnN0IHUxNiBwYWxldHRlOworCWNvbnN0IHUxNiBkZXB0aDsKKwljb25zdCB1OCBjb21wcmVzc2lvbjsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdzk5NjhjZl9mb3JtYXQgdzk5NjhjZl9mb3JtYXRsaXN0W10gPSB7CisJeyBWSURFT19QQUxFVFRFX1VZVlksICAgIDE2LCAwIH0sIC8qIG9yaWdpbmFsIHZpZGVvICovCisJeyBWSURFT19QQUxFVFRFX1lVVjQyMlAsIDE2LCAxIH0sIC8qIHdpdGggSlBFRyBjb21wcmVzc2lvbiAqLworCXsgVklERU9fUEFMRVRURV9ZVVY0MjBQLCAxMiwgMSB9LCAvKiB3aXRoIEpQRUcgY29tcHJlc3Npb24gKi8KKwl7IFZJREVPX1BBTEVUVEVfWVVWNDIwLCAgMTIsIDEgfSwgLyogc2FtZSBhcyBZVVY0MjBQICovCisJeyBWSURFT19QQUxFVFRFX1lVWVYsICAgIDE2LCAwIH0sIC8qIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKwl7IFZJREVPX1BBTEVUVEVfWVVWNDIyLCAgMTYsIDAgfSwgLyogc29mdHdhcmUgY29udmVyc2lvbiAqLworCXsgVklERU9fUEFMRVRURV9HUkVZLCAgICAgOCwgMCB9LCAvKiBzb2Z0d2FyZSBjb252ZXJzaW9uICovCisJeyBWSURFT19QQUxFVFRFX1JHQjU1NSwgIDE2LCAwIH0sIC8qIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKwl7IFZJREVPX1BBTEVUVEVfUkdCNTY1LCAgMTYsIDAgfSwgLyogc29mdHdhcmUgY29udmVyc2lvbiAqLworCXsgVklERU9fUEFMRVRURV9SR0IyNCwgICAyNCwgMCB9LCAvKiBzb2Z0d2FyZSBjb252ZXJzaW9uICovCisJeyBWSURFT19QQUxFVFRFX1JHQjMyLCAgIDMyLCAwIH0sIC8qIHNvZnR3YXJlIGNvbnZlcnNpb24gKi8KKwl7IDAsICAgICAgICAgICAgICAgICAgICAgIDAsIDAgfSAgLyogMCBpcyBhIHRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCisjZGVmaW5lIFc5OTY4Q0ZfREVDT01QUkVTU0lPTiAgICAyIC8qIGRlY29tcDowPWRpc2FibGUsMT1mb3JjZSwyPWFueSBmb3JtYXRzICovCisjZGVmaW5lIFc5OTY4Q0ZfUEFMRVRURV9ERUNPTVBfT0ZGICAgVklERU9fUEFMRVRURV9VWVZZICAgIC8qIHdoZW4gZGVjb21wPTAgKi8KKyNkZWZpbmUgVzk5NjhDRl9QQUxFVFRFX0RFQ09NUF9GT1JDRSBWSURFT19QQUxFVFRFX1lVVjQyMFAgLyogd2hlbiBkZWNvbXA9MSAqLworI2RlZmluZSBXOTk2OENGX1BBTEVUVEVfREVDT01QX09OICAgIFZJREVPX1BBTEVUVEVfVVlWWSAgICAvKiB3aGVuIGRlY29tcD0yICovCisKKyNkZWZpbmUgVzk5NjhDRl9GT1JDRV9SR0IgICAgICAgIDAgIC8qIHJlYWQgUkdCIGluc3RlYWQgb2YgQkdSLCB5ZXM9MS9ubz0wICovCisKKyNkZWZpbmUgVzk5NjhDRl9NQVhfV0lEVEggICAgICA4MDAgLyogSGFzIGVmZmVjdCBpZiB1cC1zY2FsaW5nIGlzIG9uICovCisjZGVmaW5lIFc5OTY4Q0ZfTUFYX0hFSUdIVCAgICAgNjAwIC8qIEhhcyBlZmZlY3QgaWYgdXAtc2NhbGluZyBpcyBvbiAqLworI2RlZmluZSBXOTk2OENGX1dJRFRIICAgICAgICAgIDMyMCAvKiBmcm9tIDEyOCB0byAzNTIsIG11bHRpcGxlIG9mIDE2ICovCisjZGVmaW5lIFc5OTY4Q0ZfSEVJR0hUICAgICAgICAgMjQwIC8qIGZyb20gIDk2IHRvIDI4OCwgbXVsdGlwbGUgb2YgMTYgKi8KKworI2RlZmluZSBXOTk2OENGX0NMQU1QSU5HICAgICAgIDAgLyogMCBkaXNhYmxlLCAxIGVuYWJsZSB2aWRlbyBkYXRhIGNsYW1waW5nICovCisjZGVmaW5lIFc5OTY4Q0ZfRklMVEVSX1RZUEUgICAgMCAvKiAwIGRpc2FibGUgIDEgKDEtMi0xKSwgMiAoMi0zLTYtMy0yKSAqLworI2RlZmluZSBXOTk2OENGX0RPVUJMRV9CVUZGRVIgIDEgLyogMCBkaXNhYmxlLCAxIGVuYWJsZSBkb3VibGUgYnVmZmVyICovCisjZGVmaW5lIFc5OTY4Q0ZfTEFSR0VWSUVXICAgICAgMSAvKiAwIGRpc2FibGUsIDEgZW5hYmxlICovCisjZGVmaW5lIFc5OTY4Q0ZfVVBTQ0FMSU5HICAgICAgMCAvKiAwIGRpc2FibGUsIDEgZW5hYmxlICovCisKKyNkZWZpbmUgVzk5NjhDRl9NT05PQ0hST01FICAgICAwIC8qIDAgbm90IG1vbm9jaHJvbWUsIDEgbW9ub2Nocm9tZSBzZW5zb3IgKi8KKyNkZWZpbmUgVzk5NjhDRl9CUklHSFRORVNTICAgICAzMTAwMCAvKiBmcm9tIDAgdG8gNjU1MzUgKi8KKyNkZWZpbmUgVzk5NjhDRl9IVUUgICAgICAgICAgICAzMjc2OCAvKiBmcm9tIDAgdG8gNjU1MzUgKi8KKyNkZWZpbmUgVzk5NjhDRl9DT0xPVVIgICAgICAgICAzMjc2OCAvKiBmcm9tIDAgdG8gNjU1MzUgKi8KKyNkZWZpbmUgVzk5NjhDRl9DT05UUkFTVCAgICAgICA1MDAwMCAvKiBmcm9tIDAgdG8gNjU1MzUgKi8KKyNkZWZpbmUgVzk5NjhDRl9XSElURU5FU1MgICAgICAzMjc2OCAvKiBmcm9tIDAgdG8gNjU1MzUgKi8KKworI2RlZmluZSBXOTk2OENGX0FVVE9CUklHSFQgICAgIDAgLyogMCBkaXNhYmxlLCAxIGVuYWJsZSBhdXRvbWF0aWMgYnJpZ2h0bmVzcyAqLworI2RlZmluZSBXOTk2OENGX0FVVE9FWFAgICAgICAgIDEgLyogMCBkaXNhYmxlLCAxIGVuYWJsZSBhdXRvbWF0aWMgZXhwb3N1cmUgKi8KKyNkZWZpbmUgVzk5NjhDRl9MSUdIVEZSRVEgICAgICA1MCAvKiBsaWdodCBmcmVxdWVuY3kuIDUwSHogKEV1cm9wZSkgb3IgNjBIeiAqLworI2RlZmluZSBXOTk2OENGX0JBTkRJTkdGSUxURVIgIDAgLyogMCBkaXNhYmxlLCAxIGVuYWJsZSBiYW5kaW5nIGZpbHRlciAqLworI2RlZmluZSBXOTk2OENGX0JBQ0tMSUdIVCAgICAgIDAgLyogMCBvciAxLCAxPW9iamVjdCBpcyBsaXQgZnJvbSBiZWhpbmQgKi8KKyNkZWZpbmUgVzk5NjhDRl9NSVJST1IgICAgICAgICAwIC8qIDAgb3IgMSBbZG9uJ3RdIHJldmVyc2UgaW1hZ2UgaG9yaXpvbnRhbGx5Ki8KKworI2RlZmluZSBXOTk2OENGX0NMT0NLRElWICAgICAgICAgLTEgLyogLTEgPSBhdXRvbWF0aWMgY2xvY2sgZGl2aXNvciAqLworI2RlZmluZSBXOTk2OENGX0RFRl9DTE9DS0RJVklTT1IgIDAgLyogZGVmYXVsdCBzZW5zb3IgY2xvY2sgZGl2aXNvciB2YWx1ZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHbG9iYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVzk5NjhDRl9NT0RVTEVfTkFNRSAgICAgIlY0TCBkcml2ZXIgZm9yIFc5OTZbODddQ0YgSlBFRyBVU0IgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdWFsIE1vZGUgQ2FtZXJhIENoaXAiCisjZGVmaW5lIFc5OTY4Q0ZfTU9EVUxFX1ZFUlNJT04gICIxOjEuMzMtYmFzaWMiCisjZGVmaW5lIFc5OTY4Q0ZfTU9EVUxFX0FVVEhPUiAgICIoQykgMjAwMi0yMDA0IEx1Y2EgUmlzb2xpYSIKKyNkZWZpbmUgVzk5NjhDRl9BVVRIT1JfRU1BSUwgICAgIjxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIKKyNkZWZpbmUgVzk5NjhDRl9NT0RVTEVfTElDRU5TRSAgIkdQTCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHdpbmJvbmRfaWRfdGFibGVbXSA9IHsKKwl7CisJCS8qIENyZWF0aXZlIExhYnMgVmlkZW8gQmxhc3RlciBXZWJDYW0gR28gUGx1cyAqLworCQlVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDAzKSwKKwkJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpInc5OTY4Y2YiLAorCX0sCisJeworCQkvKiBHZW5lcmljIFc5OTZbODddQ0YgSlBFRyBVU0IgRHVhbCBNb2RlIENhbWVyYSAqLworCQlVU0JfREVWSUNFKDB4MTA0NiwgMHg5OTY3KSwKKwkJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpInc5OTY4Y2YiLAorCX0sCisJeyB9IC8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCisvKiBXOTk2Wzg3XUNGIGNhbWVyYSBtb2RlbHMsIGludGVybmFsIGlkczogKi8KK2VudW0gdzk5NjhjZl9tb2RlbF9pZCB7CisJVzk5NjhDRl9NT0RfR0VORVJJQyA9IDEsIC8qIEdlbmVyaWMgVzk5Nls4N11DRiBiYXNlZCBkZXZpY2UgKi8KKwlXOTk2OENGX01PRF9DTFZCV0dQID0gMTEsLypDcmVhdGl2ZSBMYWJzIFZpZGVvIEJsYXN0ZXIgV2ViQ2FtIEdvIFBsdXMqLworCVc5OTY4Q0ZfTU9EX0FEUFZETUEgPSAyMSwgLyogQXJvbWEgRGlnaSBQZW4gVkdBIER1YWwgTW9kZSBBREctNTAwMCAqLworCVc5OTg2Q0ZfTU9EX0FBVSA9IDMxLCAgICAgLyogQVZlck1lZGlhIEFWZXJUViBVU0IgKi8KKwlXOTk2OENGX01PRF9DTFZCV0cgPSAzNCwgIC8qIENyZWF0aXZlIExhYnMgVmlkZW8gQmxhc3RlciBXZWJDYW0gR28gKi8KKwlXOTk2OENGX01PRF9MTCA9IDM3LCAgICAgIC8qIExlYm9uIExEQy0wMzVBICovCisJVzk5NjhDRl9NT0RfRUVFTUMgPSA0MCwgICAvKiBFem9uaWNzIEVaLTgwMiBFWk1lZ2EgQ2FtICovCisJVzk5NjhDRl9NT0RfT09FID0gNDIsICAgICAvKiBPbW5pVmlzaW9uIE9WODYxMC1FREUgKi8KKwlXOTk2OENGX01PRF9PRFBWRE1QQyA9IDQzLC8qIE9QQ09NIERpZ2kgUGVuIFZHQSBEdWFsIE1vZGUgUGVuIENhbWVyYSAqLworCVc5OTY4Q0ZfTU9EX1BEUElJID0gNDYsICAgLyogUHJldGVjIERpZ2kgUGVuLUlJICovCisJVzk5NjhDRl9NT0RfUERQNDgwID0gNDksICAvKiBQcmV0ZWMgRGlnaVBlbi00ODAgKi8KK307CisKK2VudW0gdzk5NjhjZl9mcmFtZV9zdGF0dXMgeworCUZfUkVBRFksICAgICAgICAgICAgLyogZmluaXNoZWQgZ3JhYmJpbmcgJiByZWFkeSB0byBiZSByZWFkL3N5bmNlZCAqLworCUZfR1JBQkJJTkcsICAgICAgICAgLyogaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZ3JhYmJlZCBpbnRvICovCisJRl9FUlJPUiwgICAgICAgICAgICAvKiBzb21ldGhpbmcgYmFkIGhhcHBlbmVkIHdoaWxlIHByb2Nlc3NpbmcgKi8KKwlGX1VOVVNFRCAgICAgICAgICAgIC8qIHVudXNlZCAobm8gVklESU9DTUNBUFRVUkUpICovCit9OworCitzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90IHsKKwl2b2lkKiBidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXUzMiBsZW5ndGg7CisJaW50IG51bWJlcjsKKwllbnVtIHc5OTY4Y2ZfZnJhbWVfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90KiBuZXh0OworCXU4IHF1ZXVlZDsKK307CisKK2VudW0gdzk5NjhjZl92cHBfZmxhZyB7CisJVlBQX05PTkUgPSAweDAwLAorCVZQUF9VUFNDQUxFID0gMHgwMSwKKwlWUFBfU1dBUF9ZVVZfQllURVMgPSAweDAyLAorCVZQUF9ERUNPTVBSRVNTSU9OID0gMHgwNCwKKwlWUFBfVVlWWV9UT19SR0JYID0gMHgwOCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdzk5NjhjZl92cHBfdCogdzk5NjhjZl92cHA7CitzdGF0aWMgREVDTEFSRV9NVVRFWCh3OTk2OGNmX3ZwcG1vZF9sb2NrKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3OTk2OGNmX3ZwcG1vZF93YWl0KTsKKworc3RhdGljIExJU1RfSEVBRCh3OTk2OGNmX2Rldl9saXN0KTsgLyogaGVhZCBvZiBWNEwgcmVnaXN0ZXJlZCBjYW1lcmFzIGxpc3QgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKHc5OTY4Y2ZfZGV2bGlzdF9zZW0pOyAvKiBzZW1hcGhvcmUgZm9yIGxpc3QgdHJhdmVyc2FsICovCisKK3N0YXRpYyBERUNMQVJFX1JXU0VNKHc5OTY4Y2ZfZGlzY29ubmVjdCk7IC8qIHByZXZlbnQgcmFjZXMgd2l0aCBvcGVuKCkgKi8KKworLyogTWFpbiBkZXZpY2UgZHJpdmVyIHN0cnVjdHVyZSAqLworc3RydWN0IHc5OTY4Y2ZfZGV2aWNlIHsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsgLyogZGV2aWNlIHN0cnVjdHVyZSAqLworCisJZW51bSB3OTk2OGNmX21vZGVsX2lkIGlkOyAgIC8qIHByaXZhdGUgZGV2aWNlIGlkZW50aWZpZXIgKi8KKworCXN0cnVjdCB2aWRlb19kZXZpY2UqIHY0bGRldjsgLyogLT4gVjRMIHN0cnVjdHVyZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgdjRsbGlzdDsgICAgLyogZW50cnkgb2YgdGhlIGxpc3Qgb2YgVjRMIGNhbWVyYXMgKi8KKworCXN0cnVjdCB1c2JfZGV2aWNlKiB1c2JkZXY7ICAgICAgICAgICAvKiAtPiBtYWluIFVTQiBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXJiKiB1cmJbVzk5NjhDRl9VUkJTXTsgICAgICAgLyogLT4gVVNCIHJlcXVlc3QgYmxvY2sgc3RydWN0cyAqLworCXZvaWQqIHRyYW5zZmVyX2J1ZmZlcltXOTk2OENGX1VSQlNdOyAvKiAtPiBJU08gdHJhbnNmZXIgYnVmZmVycyAqLworCXUxNiogY29udHJvbF9idWZmZXI7ICAgICAgICAgICAgICAgICAvKiAtPiBidWZmZXIgZm9yIGNvbnRyb2wgcmVxLiovCisJdTE2KiBkYXRhX2J1ZmZlcjsgICAgICAgICAgICAgICAgICAgIC8qIC0+IGRhdGEgdG8gc2VuZCB0byB0aGUgRlNCICovCisKKwlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90IGZyYW1lW1c5OTY4Q0ZfTUFYX0JVRkZFUlNdOworCXN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QgZnJhbWVfdG1wOyAvKiB0ZW1wb3JhcnkgZnJhbWUgKi8KKwlzdHJ1Y3Qgdzk5NjhjZl9mcmFtZV90IGZyYW1lX3ZwcDsgLyogaGVscGVyIGZyYW1lLiovCisJc3RydWN0IHc5OTY4Y2ZfZnJhbWVfdCogZnJhbWVfY3VycmVudDsgLyogLT4gZnJhbWUgYmVpbmcgZ3JhYmJlZCAqLworCXN0cnVjdCB3OTk2OGNmX2ZyYW1lX3QqIHJlcXVlc3RlZF9mcmFtZVtXOTk2OENGX01BWF9CVUZGRVJTXTsKKworCXU4IG1heF9idWZmZXJzLCAgIC8qIG51bWJlciBvZiByZXF1ZXN0ZWQgYnVmZmVycyAqLworCSAgIGZvcmNlX3BhbGV0dGUsIC8qIHllcz0xL25vPTAgKi8KKwkgICBmb3JjZV9yZ2IsICAgICAvKiByZWFkIFJHQiBpbnN0ZWFkIG9mIEJHUiwgeWVzPTEsIG5vPTAgKi8KKwkgICBkb3VibGVfYnVmZmVyLCAvKiBoYXJkd2FyZSBkb3VibGUgYnVmZmVyaW5nIHllcz0xL25vPTAgKi8KKwkgICBjbGFtcGluZywgICAgICAvKiB2aWRlbyBkYXRhIGNsYW1waW5nIHllcz0xL25vPTAgKi8KKwkgICBmaWx0ZXJfdHlwZSwgICAvKiAwPWRpc2FibGVkLCAxPTMgdGFwLCAyPTUgdGFwIGZpbHRlciAqLworCSAgIGNhcHR1cmUsICAgICAgIC8qIDA9ZGlzYWJsZWQsIDE9ZW5hYmxlZCAqLworCSAgIGxhcmdldmlldywgICAgIC8qIDA9ZGlzYWJsZWQsIDE9ZW5hYmxlZCAqLworCSAgIGRlY29tcHJlc3Npb24sIC8qIDA9ZGlzYWJsZWQsIDE9Zm9yY2VkLCAyPWFsbG93ZWQgKi8KKwkgICB1cHNjYWxpbmc7ICAgICAvKiBzb2Z0d2FyZSBpbWFnZSBzY2FsaW5nLCAwPWVuYWJsZWQsIDE9ZGlzYWJsZWQgKi8KKworCXN0cnVjdCB2aWRlb19waWN0dXJlIHBpY3R1cmU7IC8qIGN1cnJlbnQgcGljdHVyZSBzZXR0aW5ncyAqLworCXN0cnVjdCB2aWRlb193aW5kb3cgd2luZG93OyAgIC8qIGN1cnJlbnQgd2luZG93IHNldHRpbmdzICovCisKKwl1MTYgaHdfZGVwdGgsICAgIC8qIGRlcHRoICh1c2VkIGJ5IHRoZSBjaGlwKSAqLworCSAgICBod19wYWxldHRlLCAgLyogcGFsZXR0ZSAodXNlZCBieSB0aGUgY2hpcCkgKi8KKwkgICAgaHdfd2lkdGgsICAgIC8qIHdpZHRoICh1c2VkIGJ5IHRoZSBjaGlwKSAqLworCSAgICBod19oZWlnaHQsICAgLyogaGVpZ2h0ICh1c2VkIGJ5IHRoZSBjaGlwKSAqLworCSAgICBoc19wb2xhcml0eSwgLyogMD1uZWdhdGl2ZSBzeW5jIHB1bHNlLCAxPXBvc2l0aXZlIHN5bmMgcHVsc2UgKi8KKwkgICAgdnNfcG9sYXJpdHksIC8qIDA9bmVnYXRpdmUgc3luYyBwdWxzZSwgMT1wb3NpdGl2ZSBzeW5jIHB1bHNlICovCisJICAgIHN0YXJ0X2Nyb3B4LCAvKiBwaXhlbHMgZnJvbSBIUyBpbmFjdGl2ZSBlZGdlIHRvIDFzdCBjcm9wcGVkIHBpeGVsKi8KKwkgICAgc3RhcnRfY3JvcHk7IC8qIHBpeGVscyBmcm9tIFZTIGluYWN0aXZlIGVkZ2UgdG8gMXN0IGNyb3BwZWQgcGl4ZWwqLworCisJZW51bSB3OTk2OGNmX3ZwcF9mbGFnIHZwcF9mbGFnOyAvKiBwb3N0LXByb2Nlc3Npbmcgcm91dGluZXMgaW4gdXNlICovCisKKwl1OCBuYnVmZmVycywgICAgICAvKiBudW1iZXIgb2YgYWxsb2NhdGVkIGZyYW1lIGJ1ZmZlcnMgKi8KKwkgICBhbHRzZXR0aW5nLCAgICAvKiBjYW1lcmEgYWx0ZXJuYXRlIHNldHRpbmcgKi8KKwkgICBkaXNjb25uZWN0ZWQsICAvKiBmbGFnOiB5ZXM9MSwgbm89MCAqLworCSAgIG1pc2NvbmZpZ3VyZWQsIC8qIGZsYWc6IHllcz0xLCBubz0wICovCisJICAgdXNlcnMsICAgICAgICAgLyogZmxhZzogbnVtYmVyIG9mIHVzZXJzIGhvbGRpbmcgdGhlIGRldmljZSAqLworCSAgIHN0cmVhbWluZzsgICAgIC8qIGZsYWc6IHllcz0xLCBubz0wICovCisKKwl1OCBzZW5zb3JfaW5pdGlhbGl6ZWQ7IC8qIGZsYWc6IHllcz0xLCBubz0wICovCisKKwkvKiBEZXRlcm1pbmVkIGJ5IHRoZSBpbWFnZSBzZW5zb3IgdHlwZTogKi8KKwlpbnQgc2Vuc29yLCAgICAgICAvKiB0eXBlIG9mIGltYWdlIHNlbnNvciBjaGlwIChDQ18qKSAqLworCSAgICBtb25vY2hyb21lOyAgIC8qIGltYWdlIHNlbnNvciBpcyAocHJvYmFibHkpIG1vbm9jaHJvbWUgKi8KKwl1MTYgbWF4d2lkdGgsICAgICAvKiBtYXhpbXVtIHdpZHRoIHN1cHBvcnRlZCBieSB0aGUgaW1hZ2Ugc2Vuc29yICovCisJICAgIG1heGhlaWdodCwgICAgLyogbWF4aW11bSBoZWlnaHQgc3VwcG9ydGVkIGJ5IHRoZSBpbWFnZSBzZW5zb3IgKi8KKwkgICAgbWlud2lkdGgsICAgICAvKiBtaW5pbXVtIHdpZHRoIHN1cHBvcnRlZCBieSB0aGUgaW1hZ2Ugc2Vuc29yICovCisJICAgIG1pbmhlaWdodDsgICAgLyogbWluaW11bSBoZWlnaHQgc3VwcG9ydGVkIGJ5IHRoZSBpbWFnZSBzZW5zb3IgKi8KKwl1OCAgYXV0b19icnQsICAgICAvKiBhdXRvIGJyaWdodG5lc3MgZW5hYmxlZCBmbGFnICovCisJICAgIGF1dG9fZXhwLCAgICAgLyogYXV0byBleHBvc3VyZSBlbmFibGVkIGZsYWcgKi8KKwkgICAgYmFja2xpZ2h0LCAgICAvKiBiYWNrbGlnaHQgZXhwb3N1cmUgYWxnb3JpdGhtIGZsYWcgKi8KKwkgICAgbWlycm9yLCAgICAgICAvKiBpbWFnZSBpcyByZXZlcnNlZCBob3Jpem9udGFsbHkgKi8KKwkgICAgbGlnaHRmcmVxLCAgICAvKiBwb3dlciAobGlnaHRpbmcpIGZyZXF1ZW5jeSAqLworCSAgICBiYW5kZmlsdDsgICAgIC8qIGJhbmRpbmcgZmlsdGVyIGVuYWJsZWQgZmxhZyAqLworCXM4ICBjbG9ja2RpdjsgICAgIC8qIGNsb2NrIGRpdmlzb3IgKi8KKworCS8qIEkyQyBpbnRlcmZhY2UgdG8ga2VybmVsICovCisJc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwdGVyOworCXN0cnVjdCBpMmNfY2xpZW50KiBzZW5zb3JfY2xpZW50OworCisJLyogTG9ja3MgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGRldl9zZW0sICAgIC8qIGZvciBwcm9iZSwgZGlzY29ubmVjdCxvcGVuIGFuZCBjbG9zZSAqLworCSAgICAgICAgICAgICAgICAgZmlsZW9wX3NlbTsgLyogZm9yIHJlYWQgYW5kIGlvY3RsICovCisJc3BpbmxvY2tfdCB1cmJfbG9jaywgICAvKiBmb3Igc3VibWl0X3VyYigpIGFuZCB1bmxpbmtfdXJiKCkgKi8KKwkgICAgICAgICAgIGZsaXN0X2xvY2s7IC8qIGZvciByZXF1ZXN0ZWQgZnJhbWUgbGlzdCBhY2Nlc3NlcyAqLworCXdhaXRfcXVldWVfaGVhZF90IG9wZW4sIHdhaXRfcXVldWU7CisKKwljaGFyIGNvbW1hbmRbMTZdOyAvKiBuYW1lIG9mIHRoZSBwcm9ncmFtIGhvbGRpbmcgdGhlIGRldmljZSAqLworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWFjcm9zIGZvciBkZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjdW5kZWYgREJHCisjdW5kZWYgS0RCRworI2lmZGVmIFc5OTY4Q0ZfREVCVUcKKy8qIEZvciBkZXZpY2Ugc3BlY2lmaWMgZGVidWdnaW5nIG1lc3NhZ2VzICovCisjCWRlZmluZSBEQkcobGV2ZWwsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKCAoKHNwZWNpZmljX2RlYnVnKSAmJiAoZGVidWcgPT0gKGxldmVsKSkpIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICgoIXNwZWNpZmljX2RlYnVnKSAmJiAoZGVidWcgPj0gKGxldmVsKSkpICkgeyAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoKGxldmVsKSA9PSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWRldl9lcnIoJmNhbS0+ZGV2LCBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgICAgICAgICAgIFwKKwkJZWxzZSBpZiAoKGxldmVsKSA9PSAyIHx8IChsZXZlbCkgPT0gMykgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlkZXZfaW5mbygmY2FtLT5kZXYsIGZtdCAiXG4iLCAjIyBhcmdzKTsgICAgICAgICAgICAgICBcCisJCWVsc2UgaWYgKChsZXZlbCkgPT0gNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJZGV2X3dhcm4oJmNhbS0+ZGV2LCBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgICAgICAgICAgXAorCQllbHNlIGlmICgobGV2ZWwpID49IDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWRldl9pbmZvKCZjYW0tPmRldiwgIlslczolZF0gIiBmbXQgIlxuIiwgICAgICAgICAgICAgIFwKKwkJCSAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzKTsgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLyogRm9yIGdlbmVyaWMga2VybmVsIChub3QgZGV2aWNlIHNwZWNpZmljKSBtZXNzYWdlcyAqLworIwlkZWZpbmUgS0RCRyhsZXZlbCwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICggKChzcGVjaWZpY19kZWJ1ZykgJiYgKGRlYnVnID09IChsZXZlbCkpKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAoKCFzcGVjaWZpY19kZWJ1ZykgJiYgKGRlYnVnID49IChsZXZlbCkpKSApIHsgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKChsZXZlbCkgPj0gMSAmJiAobGV2ZWwpIDw9IDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlwcl9pbmZvKCJ3OTk2OGNmOiAiIGZtdCAiXG4iLCAjIyBhcmdzKTsgICAgICAgICAgICAgICBcCisJCWVsc2UgaWYgKChsZXZlbCkgPj0gNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJcHJfZGVidWcoInc5OTY4Y2Y6IFslczolZF0gIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCAgXAorCQkJICAgICAgICAgX19MSU5FX18gLCAjIyBhcmdzKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZWxzZQorCS8qIE5vdCBkZWJ1Z2dpbmc6IG5vdGhpbmcgKi8KKyMJZGVmaW5lIERCRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7O30gd2hpbGUoMCk7CisjCWRlZmluZSBLREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKTsKKyNlbmRpZgorCisjdW5kZWYgUERCRworI2RlZmluZSBQREJHKGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZGV2X2luZm8oJmNhbS0+ZGV2LCAiWyVzOiVkXSAiIGZtdCAiXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fICwgIyMgYXJncyk7CisKKyN1bmRlZiBQREJHRworI2RlZmluZSBQREJHRyhmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKTsgLyogbm90aGluZzogaXQncyBhIHBsYWNlaG9sZGVyICovCisKKyNlbmRpZiAvKiBfVzk5NjhDRl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZl9kZWNvZGVyLmggYi9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmX2RlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWZhY2NiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvdzk5NjhjZl9kZWNvZGVyLmgKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmlkZW8gZGVjb2RlciBmb3IgdGhlIFc5OTZbODddQ0YgZHJpdmVyIGZvciBMaW51eC4gICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIDIwMDQgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgKgorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfVzk5NjhDRl9ERUNPREVSX0hfCisjZGVmaW5lIF9XOTk2OENGX0RFQ09ERVJfSF8KKworLyogQ29tbWVudC91bmNvbW1lbnQgdGhpcyBmb3IgaGlnaC9sb3cgcXVhbGl0eSBvZiBjb21wcmVzc2VkIHZpZGVvICovCisjZGVmaW5lIFc5OTY4Q0ZfREVDX0ZBU1RfTE9XUVVBTElUWV9WSURFTworCisjaWZkZWYgVzk5NjhDRl9ERUNfRkFTVF9MT1dRVUFMSVRZX1ZJREVPCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBZX1FVQU5UQUJMRVs2NF0gPSB7CisJMTYsICAxMSwgIDEwLCAgMTYsICAyNCwgIDQwLCAgNTEsICA2MSwKKwkxMiwgIDEyLCAgMTQsICAxOSwgIDI2LCAgNTgsICA2MCwgIDU1LAorCTE0LCAgMTMsICAxNiwgIDI0LCAgNDAsICA1NywgIDY5LCAgNTYsCisJMTQsICAxNywgIDIyLCAgMjksICA1MSwgIDg3LCAgODAsICA2MiwKKwkxOCwgIDIyLCAgMzcsICA1NiwgIDY4LCAxMDksIDEwMywgIDc3LAorCTI0LCAgMzUsICA1NSwgIDY0LCAgODEsIDEwNCwgMTEzLCAgOTIsCisJNDksICA2NCwgIDc4LCAgODcsIDEwMywgMTIxLCAxMjAsIDEwMSwKKwk3MiwgIDkyLCAgOTUsICA5OCwgMTEyLCAxMDAsIDEwMywgIDk5Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBVVl9RVUFOVEFCTEVbNjRdID0geworCTE3LCAgMTgsICAyNCwgIDQ3LCAgOTksICA5OSwgIDk5LCAgOTksCisJMTgsICAyMSwgIDI2LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwKKwkyNCwgIDI2LCAgNTYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorCTQ3LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisJOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKwk5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorCTk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisJOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OQorfTsKKyNlbHNlCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBZX1FVQU5UQUJMRVs2NF0gPSB7CisJIDgsICAgNSwgICA1LCAgIDgsICAxMiwgIDIwLCAgMjUsICAzMCwKKwkgNiwgICA2LCAgIDcsICAgOSwgIDEzLCAgMjksICAzMCwgIDI3LAorCSA3LCAgIDYsICAgOCwgIDEyLCAgMjAsICAyOCwgIDM0LCAgMjgsCisJIDcsICAgOCwgIDExLCAgMTQsICAyNSwgIDQzLCAgNDAsICAzMSwKKwkgOSwgIDExLCAgMTgsICAyOCwgIDM0LCAgNTQsICA1MSwgIDM4LAorCTEyLCAgMTcsICAyNywgIDMyLCAgNDAsICA1MiwgIDU2LCAgNDYsCisJMjQsICAzMiwgIDM5LCAgNDMsICA1MSwgIDYwLCAgNjAsICA1MCwKKwkzNiwgIDQ2LCAgNDcsICA0OSwgIDU2LCAgNTAsICA1MSwgIDQ5Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBVVl9RVUFOVEFCTEVbNjRdID0geworCSA4LCAgIDksICAxMiwgIDIzLCAgNDksICA0OSwgIDQ5LCAgNDksCisJIDksICAxMCwgIDEzLCAgMzMsICA0OSwgIDQ5LCAgNDksICA0OSwKKwkxMiwgIDEzLCAgMjgsICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LAorCTIzLCAgMzMsICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksCisJNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwKKwk0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LAorCTQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksCisJNDksICA0OSwgIDQ5LCAgNDksICA0OSwgIDQ5LCAgNDksICA0OQorfTsKKyNlbmRpZgorCisjZGVmaW5lIFc5OTY4Q0ZfREVDX0VSUl9DT1JSVVBURURfREFUQSAgLTEKKyNkZWZpbmUgVzk5NjhDRl9ERUNfRVJSX0JVRl9PVkVSRkxPVyAgICAtMgorI2RlZmluZSBXOTk2OENGX0RFQ19FUlJfTk9fU09JICAgICAgICAgIC0zCisjZGVmaW5lIFc5OTY4Q0ZfREVDX0VSUl9OT19TT0YwICAgICAgICAgLTQKKyNkZWZpbmUgVzk5NjhDRl9ERUNfRVJSX05PX1NPUyAgICAgICAgICAtNQorI2RlZmluZSBXOTk2OENGX0RFQ19FUlJfTk9fRU9JICAgICAgICAgIC02CisKK2V4dGVybiB2b2lkIHc5OTY4Y2ZfaW5pdF9kZWNvZGVyKHZvaWQpOworZXh0ZXJuIGludCB3OTk2OGNmX2NoZWNrX2hlYWRlcnMoY29uc3QgdW5zaWduZWQgY2hhciogUGluLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgQlVGX1NJWkUpOworZXh0ZXJuIGludCB3OTk2OGNmX2RlY29kZShjb25zdCBjaGFyKiBQaW4sIGNvbnN0IHVuc2lnbmVkIGxvbmcgQlVGX1NJWkUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBXLCBjb25zdCB1bnNpZ25lZCBILCBjaGFyKiBQb3V0KTsKKworI2VuZGlmIC8qIF9XOTk2OENGX0RFQ09ERVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3c5OTY4Y2ZfdnBwLmggYi9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmX3ZwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTMxN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS93OTk2OGNmX3ZwcC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVyZmFjZSBmb3IgdmlkZW8gcG9zdC1wcm9jZXNzaW5nIGZ1bmN0aW9ucyBmb3IgdGhlIFc5OTZbODddQ0YgZHJpdmVyICoKKyAqIGZvciBMaW51eC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1c5OTY4Q0ZfVlBQX0hfCisjZGVmaW5lIF9XOTk2OENGX1ZQUF9IXworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKK3N0cnVjdCB3OTk2OGNmX3ZwcF90IHsKKwlzdHJ1Y3QgbW9kdWxlKiBvd25lcjsKKwlpbnQgKCpjaGVja19oZWFkZXJzKShjb25zdCB1bnNpZ25lZCBjaGFyKiwgY29uc3QgdW5zaWduZWQgbG9uZyk7CisJaW50ICgqZGVjb2RlKShjb25zdCBjaGFyKiwgY29uc3QgdW5zaWduZWQgbG9uZywgY29uc3QgdW5zaWduZWQsCisJICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCwgY2hhciopOworCXZvaWQgKCpzd2FwX3l1dmJ5dGVzKSh2b2lkKiwgdW5zaWduZWQgbG9uZyk7CisJdm9pZCAoKnV5dnlfdG9fcmdieCkodTgqLCB1bnNpZ25lZCBsb25nLCB1OCosIHUxNiwgdTgpOworCXZvaWQgKCpzY2FsZV91cCkodTgqLCB1OCosIHUxNiwgdTE2LCB1MTYsIHUxNiwgdTE2KTsKKworCXU4IGJ1c3k7IC8qIHJlYWQtb25seSBmbGFnOiBtb2R1bGUgaXMvaXMgbm90IGluIHVzZSAqLworfTsKKworZXh0ZXJuIGludCB3OTk2OGNmX3ZwcG1vZF9yZWdpc3RlcihzdHJ1Y3Qgdzk5NjhjZl92cHBfdCopOworZXh0ZXJuIGludCB3OTk2OGNmX3ZwcG1vZF9kZXJlZ2lzdGVyKHN0cnVjdCB3OTk2OGNmX3ZwcF90Kik7CisKKyNlbmRpZiAvKiBfVzk5NjhDRl9WUFBfSF8gKi8K