Introduction

This is a forecast report. The goal is to assist users in evaluating current forecasts in the context of past forecasts and to translate the forecast component into key assumptions about food security.

The report includes the following key components:

  1. A verbal summary of assumptions based on the statistics in this forecast [NOT UPDATED]

  2. Mean Area, Production, and Yield over the years 2006 to 2016:This provides context for interpreting the grain data

  3. Historical Out of Sample Forecast Error Averaged Over a 10 Year+ Period. We show the Mean Absolute Percent Error (MAPE).

  4. Yield Forecast, (based on May 2022 Precip, NDVI, Et0 ) expressed as percent of mean yield over the period 2006 - 2016.

  5. Forecasts and Forecast Error in Analog Years We show specific forecasts and forecast error for years when the climate patterns are similar to what is expected in the current season.


Summary Figures

Mean area, production, and yields for the years 2006 to 2016.



Out of Sample Forecast Error (MAPE)

Mean Absolute Percent Error (MAPE) calculated based on historical out of sample seasonal forecasts. Lower scores indicate greater accuracy. Forecasts are based on model type MODEL1



Yield Forecast for May 2022

Forecast values expressed as percent of Mean Yields over the Years 2006 - 2016.

The figure shows predicted percent of mean (center) as well as lower (left) and higher (right) predicted percent of mean intervals.



Static and Dynamic Version of Main Forecast

Roll over the polygon borders to get the district name and % of mean forecast value.

Static Version

This map shows the main % of mean forecast value along with district lables for reference.

This table shows the forecast percentage of mean values in the above table along with the mean yield values from the first figure.


Table of Mean Yields and Predicted Percent of Mean Values
District % of mean % of mean (low) % of mean (high)
Mombasa 107 63 150
Kilifi 133 71 195
Tana River 97 79 115
Taita Taveta 84 11 157
Makueni 181 92 270
Nyandarua 61 41 82
Nyeri 96 78 114
Kirinyaga 67 38 97
Murang'a 44 18 69
Kiambu 116 60 173
West Pokot 74 41 107
Trans Nzoia 78 66 89
Uasin Gishu 123 111 134
Elgeyo-Marakwet 116 108 123
Nandi 116 93 139
Laikipia 78 43 114
Nakuru 94 68 120
Narok 106 96 115
Kericho 123 104 142
Bomet 117 91 143
Kakamega 117 107 127
Bungoma 111 99 122
Busia 90 74 105
Siaya 99 66 133
Kisumu 117 76 157
Homa Bay 65 36 94
Migori 72 43 101
Kisii 54 27 82
Nyamira 102 78 126

Discrete Map

This map shows the main % of mean forecast binned into discrete values. Averages are based on the most recent 10 year period of observed yields: 2006 - 2016

Analog Year Forecasts

Yield forecasts in analog years. <–DESCRIPTION OF ANALOG YEAR PROCESS–>.
***


Analog Year Forecasts Errors

Forecast errors in analog years. If observed data is not available in a given year we cannot calculate forecast errors. Values are expressed a percentage of observed yields in a given year (t):


\[\frac{(observed_{(t)}-forecast_{(t)})}{observed_{(t)}}\] ***

Positive (+) values indicate an under prediction. Negative (-) values indicate an over prediction.



  1. Extra/Extended Trees. A type of Random Forest Model↩︎

LS0tCnRpdGxlOiAiRm9yZWNhc3QgUmVwb3J0IHdpdGggQW5hbG9nIFllYXJzLUtlbnlhIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCmZpZ193aWR0aDogNwpmaWdfaGVpZ2h0OiA2CmZpZ19jYXB0aW9uOiB0cnVlCi0tLQoKYGBge3IsZXZhbD1UUlVFLGVjaG89RkFMU0Usd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9J2hpZGUnfQojLS0tLS0tLS0tLS0tLS0tLS0tLUJhc2UgU2V0dXAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpybShsaXN0PWxzKCkpCgpMQVBUT1A8LVRSVUUKCiMtLS1TZXQgUHJvamVjdCBEaXJlY3RvcmllcwpkaXJHPC0nL1ZvbHVtZXMvR29vZ2xlRHJpdmUvJwppZihMQVBUT1A9PVRSVUUpe2Rpckc8LSIvVm9sdW1lcy9Hb29nbGVEcml2ZS0xMTYxMDk3MjU5MTgxOTM3MzM0NTQvIn0KCmRpckJhc2U8LXBhc3RlMChkaXJHLCdNeSBEcml2ZS8nKQoKCmRpckJhc2UyPC1wYXN0ZTAoZGlyRywnU2hhcmVkIGRyaXZlcy9DSEMgVGVhbSBEcml2ZSAvJykKCiMtUHJvamVjdCBEaXJlY3RvcmllcwpkaXJQcm9qPC1wYXN0ZTAoZGlyQmFzZTIsJ3Byb2plY3RfbWFjaGluZV9sZWFybmluZ19mb3JlY2FzdGluZy8nKSAjcHJvamVjdCBkaXJlY3RvcnkKCmRpclZpZXdlcjwtcGFzdGUwKGRpclByb2osJ3ZpZXdlci8nKQpkaXJWaWV3ZXJPdXRTdGF0aWM8LXBhc3RlMChkaXJWaWV3ZXIsJ3ZpZXdlcl9zdGF0aWNfc2hhcGVzLycpCmRpclZpZXdlckR5bmFtaWM8LXBhc3RlMChkaXJWaWV3ZXIsJ3ZpZXdlcl9keW5hbWljX3NoYXBlcy8nKQoKZGlyUmVwb3J0PC1wYXN0ZTAoZGlyUHJvaiwnZm9yZWNhc3RfcmVwb3J0aW5nLycpCmRpclJlcG9ydFJkYXRhPC1wYXN0ZTAoZGlyUmVwb3J0LCdmb3JlY2FzdF9yZXBvcnRpbmdfUmRhdGEvJykKCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJhc3RlcikKbGlicmFyeShyZ2RhbCkKbGlicmFyeShtZ2N2KQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShzZikKbGlicmFyeShybWFwc2hhcGVyKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShmb3JjYXRzKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoc2hpbnkpCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojUGFyYW1ldGVycwpDVVJSRU5UX1lFQVI8LTIwMjIKTU9OVEg8LTUKREVLQUQ8LTMKTU9ERUw8LSdFVCcKQ09VTlRSWTwtJ0tlbnlhJwpQUk9EVUNUPC0nTWFpemUnCiNDUk9QX0FSRUE8LTIgICNQZXJjZW50CkFOQUxPR19ZRUFSUzwtYygxOTk5LDIwMDAsMjAwMSwyMDA4LDIwMDksMjAxMSwyMDEyLDIwMTcpCgptb250aF9uYW1lPC1tb250aC5uYW1lW01PTlRIXSAjbW9udGggdGhlIHByb2R1Y3QgaXMgYmFzZWQgb24KCiMtLUxvYWQgRXhpc3RpbmcgUGxvdHMKc2V0d2QoZGlyUmVwb3J0UmRhdGEpCmxvYWQoZmlsZT1wYXN0ZTAoJzIwX2ZvcmVjYXN0X3JlcG9ydGluZ19tYWluX3Bsb3RzJyxtb250aF9uYW1lLENPVU5UUlksJ18nLE1PREVMLCdfJyxQUk9EVUNULCcuUmRhdGEnKSkKbG9hZChmaWxlPXBhc3RlMCgnMDFfZm9yZWNhc3RfcmVwb3J0X2Fnc3RhdG1hcHNfJyxDT1VOVFJZLCdfJyxQUk9EVUNULCcuUmRhdGEnKSkKYGBgCiMgSW50cm9kdWN0aW9uClRoaXMgaXMgYSBmb3JlY2FzdCByZXBvcnQuICoqVGhlIGdvYWwgaXMgdG8gYXNzaXN0IHVzZXJzIGluIGV2YWx1YXRpbmcgY3VycmVudCBmb3JlY2FzdHMgaW4gdGhlIGNvbnRleHQgb2YgcGFzdCBmb3JlY2FzdHMqKiBhbmQgKip0byB0cmFuc2xhdGUgdGhlIGZvcmVjYXN0IGNvbXBvbmVudCBpbnRvIGtleSBhc3N1bXB0aW9ucyBhYm91dCBmb29kIHNlY3VyaXR5LioqCgpUaGUgcmVwb3J0IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcga2V5IGNvbXBvbmVudHM6CgoxLiAqKipBIHZlcmJhbCBzdW1tYXJ5IG9mIGFzc3VtcHRpb25zIGJhc2VkIG9uIHRoZSBzdGF0aXN0aWNzIGluIHRoaXMgZm9yZWNhc3QgW05PVCBVUERBVEVEXSoqKiAKCjIuICoqKk1lYW4gQXJlYSwgUHJvZHVjdGlvbiwgYW5kIFlpZWxkIG92ZXIgdGhlIHllYXJzIGByIGxpc192YXJzX3JlcG9ydCRtaW5fYWdgIHRvIGByIGxpc192YXJzX3JlcG9ydCRtYXhfYWdgOioqKlRoaXMgcHJvdmlkZXMgY29udGV4dCBmb3IgaW50ZXJwcmV0aW5nIHRoZSBncmFpbiBkYXRhCgozLiAqKipIaXN0b3JpY2FsIE91dCBvZiBTYW1wbGUgRm9yZWNhc3QgRXJyb3IgQXZlcmFnZWQgT3ZlciBhIDEwIFllYXIrIFBlcmlvZCoqKi4gV2Ugc2hvdyB0aGUgKioqTSoqKmVhbiAqKipBKioqYnNvbHV0ZSAqKipQKioqZXJjZW50ICoqKkUqKipycm9yICgqKipNQVBFKioqKS4KCjQuICoqKllpZWxkIEZvcmVjYXN0KioqLCAoYmFzZWQgb24gYHIgbGlzX3ZhcnNfcmVwb3J0JG1vbnRoX25hbWVgIGByIGxpc192YXJzX3JlcG9ydCRtYXhfZXZhcl95ZWFyYCBgciBsaXNfdmFyc19yZXBvcnQkdmFyX25hbWVgICkgZXhwcmVzc2VkIGFzICoqcGVyY2VudCBvZiBtZWFuIHlpZWxkKiogb3ZlciB0aGUgcGVyaW9kIGByIGxpc192YXJzX3JlcG9ydCRtaW5fYWdgIC0gYHIgbGlzX3ZhcnNfcmVwb3J0JG1heF9hZ2AuCgo1LiAqKipGb3JlY2FzdHMgYW5kIEZvcmVjYXN0IEVycm9yIGluIEFuYWxvZyBZZWFycyoqKiBXZSBzaG93IHNwZWNpZmljIGZvcmVjYXN0cyBhbmQgZm9yZWNhc3QgZXJyb3IgZm9yIHllYXJzIHdoZW4gdGhlIGNsaW1hdGUgcGF0dGVybnMgYXJlIHNpbWlsYXIgdG8gd2hhdCBpcyBleHBlY3RlZCBpbiB0aGUgY3VycmVudCBzZWFzb24uCgo8IS0tICMgQXNzdW1wdGlvbiBTdGF0ZW1lbnRzIFtOT1QgWUVUIFVQREFURUQgRk9SIFRISVMgUkVQT1JUXSAtLT4KCjwhLS0gIyMjIyBBdmVyYWdlIEZvcmVjYXN0IEVycm9yIEZvciBUaGlzIFBvaW50IGluIHRoZSBTZWFzb24gLS0+CjwhLS0gQXQgdGhpcyBwb2ludCBpbiB0aGUgc2Vhc29uICoqKmhpc3RvcmljYWwgZm9yZWNhc3QgZXJyb3IsIGlzIG9uIGF2ZXJhZ2UsIGJlbG93IDUwJSBmb3IgNDYgb3V0IG9mIHRoZSA0NiBhZG1pbiB1bml0cyoqKiB1c2VkIGluIHRoZSBmb3JlY2FzdC4gLS0+Cgo8IS0tICoqKiAtLT4KCjwhLS0gIyMjIyBBZG1pbiBVbml0cyBGb3JlY2FzdCB0byBoYXZlIEFib3ZlIG9yIEJlbG93IEF2ZXJhZ2UgWWllbGRzIC0tPgo8IS0tIE9mIHRob3NlICoqKjQ2IGFkbWluIHVuaXRzOioqKiAtLT4KCjwhLS0gKjMgYXJlIGZvcmVjYXN0IHRvIGJlIHNldmVyZWx5IGJlbG93IGF2ZXJhZ2VeW0F2ZXJhZ2VzIGFyZSBiYXNlZCBvbiB0aGUgbW9zdCByZWNlbnQgMTAgeWVhciBwZXJpb2Qgb2Ygb2JzZXJ2ZWQgeWllbGRzOiBgciBsaXNfdmFyc19yZXBvcnQkbWluX2FnYCAtIGByIGxpc192YXJzX3JlcG9ydCRtYXhfYWdgXSAoPDUwJSBvZiBhdmVyYWdlKSAgIC0tPgo8IS0tICoxNiBhcmUgZm9yZWNhc3QgdG8gYmUgYmVsb3cgYXZlcmFnZSAoPCA5MCUgb2YgYXZlcmFnZSkgICAtLT4KPCEtLSAqMTQgYXJlIGZvcmVjYXN0IHRvIGJlIGF2ZXJhZ2UgKGJldHdlZW4gOTAgdG8gMTEwJSBvZiBhdmVyYWdlKSAgIC0tPgo8IS0tICoxNiBhcmUgZm9yZWNhc3QgdG8gYmUgYWJvdmUgYXZlcmFnZSAoPiAxMTAlIG9mIGF2ZXJhZ2UpICAgLS0+Cgo8IS0tICoqQXZlcmFnZXMqKiBhcmUgYmFzZWQgb24gdGhlIG1vc3QgcmVjZW50IDEwIHllYXIgcGVyaW9kIG9mIG9ic2VydmVkIHlpZWxkczogYHIgbGlzX3ZhcnNfcmVwb3J0JG1pbl9hZ2AgLSBgciBsaXNfdmFyc19yZXBvcnQkbWF4X2FnYCAtLT4KCjwhLS0gKioqICAtLT4KCjwhLS0gKioqVGhlIGZvcmVjYXN0IGlkZW50aWZpZXMgc2V2ZXJlIHlpZWxkIGlzc3VlcyAobG93ZXN0IG9uIHJlY29yZCkgaW4gdGhlIGZvbGxvd2luZyBhZG1pbiB1bml0czoqKiogLS0+CjwhLS0gTW9tYmFzYSwgRW1idSwgQnVzaWEgLS0+Cgo8IS0tICoqKlRoZSBmb3JlY2FzdCBpZGVudGlmaWVzIHN1YnN0YW50aWFsbHkgYmVsb3ctYXZlcmFnZSB5aWVsZHMgKGFtb25nIHRoZSBsb3dlc3QgMyBvbiByZWNvcmQpIGluIHRoZSBmb2xsb3dpbmcgYWRtaW4gdW5pdHM6KioqIC0tPgo8IS0tIE1vbWJhc2EsIFRhaXRhIFRhdmV0YSwgRW1idSwgTnlhbmRhcnVhLCBOYW5kaSwgQmFyaW5nbywgTGFpa2lwaWEsIE5ha3VydSwgS2FrYW1lZ2EsIEJ1c2lhLCBLaXN1bXUsIE1pZ29yaSwgS2lzaWkgLS0+Cgo8IS0tICoqKlRoZSBmb3JlY2FzdCBpZGVudGlmaWVzIHN1YnN0YW50aWFsbHkgYWJvdmUtbm9ybWFsIHlpZWxkcyAoYW1vbmcgdGhlIGhpZ2hlc3QgMyBvZiByZWNvcmQpIGluIHRoZSBmb2xsb3dpbmcgYWRtaW4gdW5pdHM6KioqIC0tPgo8IS0tIE55ZXJpLCBFbGdleW8tTWFyYWt3ZXQsIEtlcmljaG8sIEJvbWV0IC0tPgoKKioqCgojIFN1bW1hcnkgRmlndXJlcwoKIyMjIyBNZWFuIGFyZWEsIHByb2R1Y3Rpb24sIGFuZCB5aWVsZHMgZm9yIHRoZSB5ZWFycyBgciBsaXNfdmFyc19yZXBvcnQkbWluX2FnYCB0byBgciBsaXNfdmFyc19yZXBvcnQkbWF4X2FnYC4KCioqKgpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KcDFhbGwKYGBgCioqKgoKCgoKCiMjIyMgT3V0IG9mIFNhbXBsZSBGb3JlY2FzdCBFcnJvciAoTUFQRSkKTWVhbiBBYnNvbHV0ZSBQZXJjZW50IEVycm9yIChNQVBFKSBjYWxjdWxhdGVkIGJhc2VkIG9uIGhpc3RvcmljYWwgb3V0IG9mIHNhbXBsZSBzZWFzb25hbCBmb3JlY2FzdHMuICoqTG93ZXIgc2NvcmVzIGluZGljYXRlIGdyZWF0ZXIgYWNjdXJhY3kqKi4gRm9yZWNhc3RzIGFyZSBiYXNlZCBvbiBtb2RlbCB0eXBlIGBNT0RFTGBeW0V4dHJhL0V4dGVuZGVkIFRyZWVzLiBBIHR5cGUgb2YgUmFuZG9tIEZvcmVzdCBNb2RlbF0KCioqKgpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KcDIKYGBgCioqKgoKCiMgWWllbGQgRm9yZWNhc3QgZm9yIGByIGxpc192YXJzX3JlcG9ydCRtb250aF9uYW1lYCBgciBsaXNfdmFyc19yZXBvcnQkbWF4X2V2YXJfeWVhcmAgCkZvcmVjYXN0IHZhbHVlcyBleHByZXNzZWQgYXMgcGVyY2VudCBvZiBNZWFuIFlpZWxkcyBvdmVyIHRoZSBZZWFycyBgciBsaXNfdmFyc19yZXBvcnQkbWluX2FnYCAtIGByIGxpc192YXJzX3JlcG9ydCRtYXhfYWdgLiAKClRoZSBmaWd1cmUgc2hvd3MgKioqcHJlZGljdGVkIHBlcmNlbnQgb2YgbWVhbioqKiAoY2VudGVyKSBhcyB3ZWxsIGFzIGxvd2VyIChsZWZ0KSBhbmQgaGlnaGVyIChyaWdodCkgKioqcHJlZGljdGVkIHBlcmNlbnQgb2YgbWVhbioqKiBpbnRlcnZhbHMuCgoqKioKYGBge3IsZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTgsZmlnLmhlaWdodD04fQojcDM8LWdncGxvdGx5KHA9cDMsdG9vbHRpcD1jKCdkaXN0cmljdCcsJ3Blcl9vZl9tZWFuJykpCnAxCmBgYAoqKioKCiMjIyMgU3RhdGljIGFuZCBEeW5hbWljIFZlcnNpb24gb2YgTWFpbiBGb3JlY2FzdApSb2xsIG92ZXIgdGhlIHBvbHlnb24gYm9yZGVycyB0byBnZXQgdGhlIGRpc3RyaWN0IG5hbWUgYW5kICUgb2YgbWVhbiBmb3JlY2FzdCB2YWx1ZS4KCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJyxmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTh9CiNwMUxzCnAxTDwtZ2dwbG90bHkocDFMLHRvb2x0aXA9YygnYWRtaW4xJywndmFsdWUnKSkgJT4lIGxheW91dChsZWdlbmQgPSBsaXN0KG9yaWVudGF0aW9uID0gImgiLCB4ID0gMC40LCB5ID0gLTAuMikpCnAxTApgYGAKIyMjIyBTdGF0aWMgVmVyc2lvbgpUaGlzIG1hcCBzaG93cyB0aGUgbWFpbiAlIG9mIG1lYW4gZm9yZWNhc3QgdmFsdWUgYWxvbmcgd2l0aCBkaXN0cmljdCBsYWJsZXMgZm9yIHJlZmVyZW5jZS4KYGBge3IsZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLmFsaWduPSdjZW50ZXInLGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9OH0KcDFMcwoKYGBgCgojIyMjIFRoaXMgdGFibGUgc2hvd3MgdGhlIGZvcmVjYXN0IHBlcmNlbnRhZ2Ugb2YgbWVhbiB2YWx1ZXMgaW4gdGhlIGFib3ZlIHRhYmxlIGFsb25nIHdpdGggdGhlIG1lYW4geWllbGQgdmFsdWVzIGZyb20gdGhlIGZpcnN0IGZpZ3VyZS4gCioqKgpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KdDE8LWtuaXRyOjprYWJsZShkdGFiLCBjYXB0aW9uID0gJ1RhYmxlIG9mIE1lYW4gWWllbGRzIGFuZCBQcmVkaWN0ZWQgUGVyY2VudCBvZiBNZWFuIFZhbHVlcycpCnQxPC1rYWJsZV9zdHlsaW5nKHQxLGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsImNvbmRlbnNlZCIpKQpzY3JvbGxfYm94KHQxLCBoZWlnaHQgPSAnMzAwcHgnLCB3aWR0aCA9ICcxMDAlJywKICBib3hfY3NzID0gImJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IHBhZGRpbmc6IDFweDsgIiwgZXh0cmFfY3NzID0gTlVMTCwKICBmaXhlZF90aGVhZCA9IFRSVUUpCgoKYGBgCioqKgoKIyMjIyBEaXNjcmV0ZSBNYXAKVGhpcyBtYXAgc2hvd3MgdGhlIG1haW4gJSBvZiBtZWFuIGZvcmVjYXN0IGJpbm5lZCBpbnRvIGRpc2NyZXRlIHZhbHVlcy4gKipBdmVyYWdlcyoqIGFyZSBiYXNlZCBvbiB0aGUgbW9zdCByZWNlbnQgMTAgeWVhciBwZXJpb2Qgb2Ygb2JzZXJ2ZWQgeWllbGRzOiBgciBsaXNfdmFyc19yZXBvcnQkbWluX2FnYCAtIGByIGxpc192YXJzX3JlcG9ydCRtYXhfYWdgCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJyxmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTh9CnAxTGMKCmBgYAoKIyBBbmFsb2cgWWVhciBGb3JlY2FzdHMKWWllbGQgZm9yZWNhc3RzIGluIGFuYWxvZyB5ZWFycy4gPC0tREVTQ1JJUFRJT04gT0YgQU5BTE9HIFlFQVIgUFJPQ0VTUy0tPi4gIAoqKioKYGBge3IsZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTcuNSxmaWcuaGVpZ2h0PTcuNX0KcDMKYGBgCioqKgoKIyBBbmFsb2cgWWVhciBGb3JlY2FzdHMgRXJyb3JzCkZvcmVjYXN0IGVycm9ycyBpbiBhbmFsb2cgeWVhcnMuIElmIG9ic2VydmVkIGRhdGEgaXMgbm90IGF2YWlsYWJsZSBpbiBhIGdpdmVuIHllYXIgd2UgY2Fubm90IGNhbGN1bGF0ZSBmb3JlY2FzdCBlcnJvcnMuIFZhbHVlcyBhcmUgZXhwcmVzc2VkIGEgcGVyY2VudGFnZSAgb2Ygb2JzZXJ2ZWQgeWllbGRzIGluIGEgZ2l2ZW4geWVhciBfKHQpXzoKCioqKgokJFxmcmFjeyhvYnNlcnZlZF97KHQpfS1mb3JlY2FzdF97KHQpfSl9e29ic2VydmVkX3sodCl9fSQkCioqKgoKKioqUG9zaXRpdmUgKCspKioqIHZhbHVlcyBpbmRpY2F0ZSBhbiBfdW5kZXIgcHJlZGljdGlvbl8uICoqKk5lZ2F0aXZlICgtKSoqKiB2YWx1ZXMgaW5kaWNhdGUgYW4gX292ZXIgcHJlZGljdGlvbl8uCgoqKioKYGBge3IsZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTcuNSxmaWcuaGVpZ2h0PTcuNX0KcDQKYGBg