getprop("ro.product.device") == "px30_evb" || abort("E3004: This package is for \"px30_evb\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/145958:userdebug/test-keys");
ui_print("Target: rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/113005:userdebug/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/145958:userdebug/test-keys" ||
    getprop("ro.build.fingerprint") == "rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/113005:userdebug/test-keys" ||
    abort("E3001: Package expects build fingerprint of rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/145958:userdebug/test-keys or rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/113005:userdebug/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
apply_patch_check("EMMC:/dev/block/by-name/boot:24616960:4085d75124b96e9cf179c98f7a5a3ea15c4108cd:24616960:d9ea47defa825cc974779b46fd76ebc5afb72d43") || abort("E3005: \"EMMC:/dev/block/by-name/boot:24616960:4085d75124b96e9cf179c98f7a5a3ea15c4108cd:24616960:d9ea47defa825cc974779b46fd76ebc5afb72d43\" has unexpected contents.");
apply_patch_space(88481792) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1("/dev/block/by-name/system", "268,1,203,214,383,6262,6271,6303,6305,6461,6462,6877,6879,7454,7455,16455,16457,17729,17730,18062,18064,18167,18170,18196,21716,21782,21785,23892,23895,24126,24129,24139,24142,24240,24241,24930,24931,24938,24940,24976,24979,25004,25005,25010,25014,25022,25025,26362,26365,26793,26794,26815,26817,26825,26826,26828,26830,26836,26837,28789,28791,29289,29290,29295,29297,29406,29409,29728,29729,29744,29746,29767,29768,29772,29774,29786,29789,29809,29810,29816,29819,31264,31265,31323,31325,31333,31334,32656,32658,32768,32770,33389,33390,33415,33417,33441,33442,33444,33446,33454,33455,33482,33484,33634,33635,33637,33639,33648,33651,33736,33739,33755,33756,33803,33805,33858,33861,34232,34233,35718,35719,36168,36169,36210,36211,36222,36223,57981,57982,67586,67588,67598,67648,69076,69078,70549,70550,71259,71260,74748,76932,77484,77485,77981,77982,98106,98109,98304,98306,98805,98806,101487,101488,105064,105065,105271,105272,111342,111343,126507,126508,126524,126525,128948,128950,130532,130533,130536,130537,131072,131073,139486,139487,141177,141178,142618,142619,143048,143049,143778,143779,143827,143828,143832,143833,143835,143836,143837,143838,144097,144098,144107,144108,144587,144588,144610,144611,144612,144613,144743,144744,144962,144963,145049,145050,145066,145070,145081,145082,145086,145088,145095,145100,145171,145172,145181,145183,145192,151940,152943,157503,158821,163842,164030,229378,229566,289137,289296,289736,289750,289753,289788,292159,294902,294914,295102,297210,297352,297392,297792,297847,298078,298081,298119,298121,298398,298404,307762,307763,308672,308745,308757,309015,309068,309098,309127,309191,309264,309266,316860,321532,322762,322764,322775,387062,387072,390122,390129,393216") == "3e61016ba67326ceef16c99f10aad2dac3b533b2" || block_image_verify("/dev/block/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/by-name/system");
ifelse (block_image_recover("/dev/block/by-name/system", "268,1,203,214,383,6262,6271,6303,6305,6461,6462,6877,6879,7454,7455,16455,16457,17729,17730,18062,18064,18167,18170,18196,21716,21782,21785,23892,23895,24126,24129,24139,24142,24240,24241,24930,24931,24938,24940,24976,24979,25004,25005,25010,25014,25022,25025,26362,26365,26793,26794,26815,26817,26825,26826,26828,26830,26836,26837,28789,28791,29289,29290,29295,29297,29406,29409,29728,29729,29744,29746,29767,29768,29772,29774,29786,29789,29809,29810,29816,29819,31264,31265,31323,31325,31333,31334,32656,32658,32768,32770,33389,33390,33415,33417,33441,33442,33444,33446,33454,33455,33482,33484,33634,33635,33637,33639,33648,33651,33736,33739,33755,33756,33803,33805,33858,33861,34232,34233,35718,35719,36168,36169,36210,36211,36222,36223,57981,57982,67586,67588,67598,67648,69076,69078,70549,70550,71259,71260,74748,76932,77484,77485,77981,77982,98106,98109,98304,98306,98805,98806,101487,101488,105064,105065,105271,105272,111342,111343,126507,126508,126524,126525,128948,128950,130532,130533,130536,130537,131072,131073,139486,139487,141177,141178,142618,142619,143048,143049,143778,143779,143827,143828,143832,143833,143835,143836,143837,143838,144097,144098,144107,144108,144587,144588,144610,144611,144612,144613,144743,144744,144962,144963,145049,145050,145066,145070,145081,145082,145086,145088,145095,145100,145171,145172,145181,145183,145192,151940,152943,157503,158821,163842,164030,229378,229566,289137,289296,289736,289750,289753,289788,292159,294902,294914,295102,297210,297352,297392,297792,297847,298078,298081,298119,298121,298398,298404,307762,307763,308672,308745,308757,309015,309068,309098,309127,309191,309264,309266,316860,321532,322762,322764,322775,387062,387072,390122,390129,393216") && block_image_verify("/dev/block/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat"), ui_print("system recovered successfully."), abort("E1004: system partition fails to recover"));
endif;
if (range_sha1("/dev/block/by-name/vendor", "60,1,53,55,96,3079,3086,3115,3116,3150,3151,3211,3212,4232,4329,4339,4354,4585,4614,4634,4635,5141,5142,5674,5675,10599,10610,14896,14925,15334,15335,15398,15399,20037,20038,20505,22098,24997,25726,26380,29425,31886,31894,32200,32201,32539,32540,32768,32770,32817,32818,37765,37766,37767,38072,38073,66263,96760,97524,97531,98304") == "ef364483c3262379437aaf4491ed51bec42b8b7f" || block_image_verify("/dev/block/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/by-name/vendor");
ifelse (block_image_recover("/dev/block/by-name/vendor", "60,1,53,55,96,3079,3086,3115,3116,3150,3151,3211,3212,4232,4329,4339,4354,4585,4614,4634,4635,5141,5142,5674,5675,10599,10610,14896,14925,15334,15335,15398,15399,20037,20038,20505,22098,24997,25726,26380,29425,31886,31894,32200,32201,32539,32540,32768,32770,32817,32818,37765,37766,37767,38072,38073,66263,96760,97524,97531,98304") && block_image_verify("/dev/block/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat"), ui_print("vendor recovered successfully."), abort("E2004: vendor partition fails to recover"));
endif;
if (range_sha1("/dev/block/by-name/oem", "22,1,36,37,39,2053,2060,2750,2754,6061,6062,6064,6065,8973,9005,32768,32770,32801,32802,64504,65014,65021,65536") == "cf888fc3bf909855bd2e2458404d3872f6b05078" || block_image_verify("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat")) then
ui_print("Verified oem image...");
else
check_first_block("/dev/block/by-name/oem");
ifelse (block_image_recover("/dev/block/by-name/oem", "22,1,36,37,39,2053,2060,2750,2754,6061,6062,6064,6065,8973,9005,32768,32770,32801,32802,64504,65014,65021,65536") && block_image_verify("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat"), ui_print("oem recovered successfully."), abort("E2004: oem partition fails to recover"));
endif;

# ---- start making changes here ----

ui_print("Patching system image after verification.");
show_progress(0.800000, 0);
block_image_update("/dev/block/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update("/dev/block/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
ui_print("Patching oem image after verification.");
show_progress(0.100000, 0);
block_image_update("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat") ||
  abort("E2001: Failed to update oem image.");
ui_print("Patching boot image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/by-name/boot:24616960:4085d75124b96e9cf179c98f7a5a3ea15c4108cd:24616960:d9ea47defa825cc974779b46fd76ebc5afb72d43",
            "-", d9ea47defa825cc974779b46fd76ebc5afb72d43, 24616960,
            4085d75124b96e9cf179c98f7a5a3ea15c4108cd,
            package_extract_file("patch/boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:24616960:4085d75124b96e9cf179c98f7a5a3ea15c4108cd:24616960:d9ea47defa825cc974779b46fd76ebc5afb72d43");
ui_print("Writing uboot loader img...");
package_extract_file("uboot.img", "/dev/block/by-name/uboot");
set_progress(1.000000);
