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/102648:userdebug/test-keys");
ui_print("Target: rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/095951:userdebug/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/102648:userdebug/test-keys" ||
    getprop("ro.build.fingerprint") == "rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/095951:userdebug/test-keys" ||
    abort("E3001: Package expects build fingerprint of rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/102648:userdebug/test-keys or rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/095951:userdebug/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
apply_patch_check("EMMC:/dev/block/by-name/boot:24614912:886f56440cbc26aed9d7e1a4157bdc984c5cb118:24614912:bfe25d82c2c4d3b1c209d0a2b9f2c0fa25242f24") || abort("E3005: \"EMMC:/dev/block/by-name/boot:24614912:886f56440cbc26aed9d7e1a4157bdc984c5cb118:24614912:bfe25d82c2c4d3b1c209d0a2b9f2c0fa25242f24\" has unexpected contents.");
apply_patch_space(52625408) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1("/dev/block/by-name/system", "298,1,203,214,379,6262,6271,6303,6305,6461,6462,6877,6879,7454,7455,16954,16955,17287,17289,17392,17395,17421,17422,20938,20941,21007,21010,23117,23120,23351,23354,23364,23367,23465,23466,24155,24156,24163,24165,24201,24204,24229,24230,24235,24239,24247,24250,25587,25590,26018,26019,26040,26042,26050,26051,26053,26055,26061,26062,28014,28016,28514,28515,28520,28522,28631,28634,28953,28954,28969,28971,28992,28993,28997,28999,29011,29014,29034,29035,29041,29044,30489,30490,30548,30550,30558,30559,31881,31883,32424,32425,32450,32452,32476,32477,32479,32481,32489,32490,32517,32519,32669,32670,32672,32674,32683,32686,32768,32770,32961,32964,32980,32981,33028,33030,33083,33086,33457,33458,34943,34944,35393,35394,35435,35436,35447,35448,57206,57207,66811,66813,76709,76710,77206,77207,97840,97841,98304,98306,100712,100713,104289,104290,104496,104497,110567,110568,125732,125733,125749,125750,128173,128175,129757,129758,129761,129762,130520,130521,131072,131073,141844,141845,142274,142275,143004,143005,143053,143054,143058,143059,143061,143062,143063,143064,143323,143324,143333,143334,143813,143814,143836,143837,143838,143839,143969,143970,144188,144189,144275,144276,144292,144296,144307,144308,144312,144314,144321,144326,144397,144398,144407,144409,144418,144419,144479,144481,144490,144491,144516,144518,144548,144549,144551,144554,158394,158397,158414,158415,158622,158626,159486,159489,163543,163546,163840,163842,164366,164367,164567,164569,164635,164638,164737,164739,165198,165199,165217,165219,165230,165231,165344,165346,165375,165376,165380,165384,165395,165398,165415,165420,165430,165431,165523,165525,165541,165542,165544,165546,165558,165561,165583,165586,165709,165711,165887,165888,165966,165968,166000,166001,166760,166762,166765,166766,166771,166773,166783,166786,166924,166925,206264,206265,225978,225980,229376,229378,262244,262245,262788,262791,262799,294914,295102,383713,387072,390122,390129,393216") == "8d545e2913f1f83bca36e63c58553f6224136628" || 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", "298,1,203,214,379,6262,6271,6303,6305,6461,6462,6877,6879,7454,7455,16954,16955,17287,17289,17392,17395,17421,17422,20938,20941,21007,21010,23117,23120,23351,23354,23364,23367,23465,23466,24155,24156,24163,24165,24201,24204,24229,24230,24235,24239,24247,24250,25587,25590,26018,26019,26040,26042,26050,26051,26053,26055,26061,26062,28014,28016,28514,28515,28520,28522,28631,28634,28953,28954,28969,28971,28992,28993,28997,28999,29011,29014,29034,29035,29041,29044,30489,30490,30548,30550,30558,30559,31881,31883,32424,32425,32450,32452,32476,32477,32479,32481,32489,32490,32517,32519,32669,32670,32672,32674,32683,32686,32768,32770,32961,32964,32980,32981,33028,33030,33083,33086,33457,33458,34943,34944,35393,35394,35435,35436,35447,35448,57206,57207,66811,66813,76709,76710,77206,77207,97840,97841,98304,98306,100712,100713,104289,104290,104496,104497,110567,110568,125732,125733,125749,125750,128173,128175,129757,129758,129761,129762,130520,130521,131072,131073,141844,141845,142274,142275,143004,143005,143053,143054,143058,143059,143061,143062,143063,143064,143323,143324,143333,143334,143813,143814,143836,143837,143838,143839,143969,143970,144188,144189,144275,144276,144292,144296,144307,144308,144312,144314,144321,144326,144397,144398,144407,144409,144418,144419,144479,144481,144490,144491,144516,144518,144548,144549,144551,144554,158394,158397,158414,158415,158622,158626,159486,159489,163543,163546,163840,163842,164366,164367,164567,164569,164635,164638,164737,164739,165198,165199,165217,165219,165230,165231,165344,165346,165375,165376,165380,165384,165395,165398,165415,165420,165430,165431,165523,165525,165541,165542,165544,165546,165558,165561,165583,165586,165709,165711,165887,165888,165966,165968,166000,166001,166760,166762,166765,166766,166771,166773,166783,166786,166924,166925,206264,206265,225978,225980,229376,229378,262244,262245,262788,262791,262799,294914,295102,383713,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", "110,1,53,55,96,3079,3086,3115,3116,3150,3151,3211,3212,4349,4354,4585,4614,4634,4635,5141,5142,5674,5675,10599,10610,14896,14925,15334,15335,15398,15399,20037,20038,20505,22098,25573,26302,26956,28331,29395,30001,32556,32564,32768,32770,32817,32818,37015,37016,37354,37355,37991,37992,40719,40720,41217,41218,42195,42196,42519,42520,43010,43011,43030,43031,43429,43430,48114,48115,50168,50169,50368,50369,50570,50571,50727,50728,51047,51049,51326,51327,51361,51362,51442,51443,52676,52681,52949,52981,53003,53004,53704,53705,54441,54442,59411,59421,64646,64647,64780,64813,65342,65343,65924,65930,66187,95097,96760,97524,97531,98304") == "33cdd6fbffea2808f09ac9a6ca15c88bf8f805b4" || 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", "110,1,53,55,96,3079,3086,3115,3116,3150,3151,3211,3212,4349,4354,4585,4614,4634,4635,5141,5142,5674,5675,10599,10610,14896,14925,15334,15335,15398,15399,20037,20038,20505,22098,25573,26302,26956,28331,29395,30001,32556,32564,32768,32770,32817,32818,37015,37016,37354,37355,37991,37992,40719,40720,41217,41218,42195,42196,42519,42520,43010,43011,43030,43031,43429,43430,48114,48115,50168,50169,50368,50369,50570,50571,50727,50728,51047,51049,51326,51327,51361,51362,51442,51443,52676,52681,52949,52981,53003,53004,53704,53705,54441,54442,59411,59421,64646,64647,64780,64813,65342,65343,65924,65930,66187,95097,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,2752,2759,2762,6069,6070,8976,11987,32768,32770,32801,32802,64504,65014,65021,65536") == "8e912674babe9554fadac5facbdc719c37654591" || 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,2752,2759,2762,6069,6070,8976,11987,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:24614912:886f56440cbc26aed9d7e1a4157bdc984c5cb118:24614912:bfe25d82c2c4d3b1c209d0a2b9f2c0fa25242f24",
            "-", bfe25d82c2c4d3b1c209d0a2b9f2c0fa25242f24, 24614912,
            886f56440cbc26aed9d7e1a4157bdc984c5cb118,
            package_extract_file("patch/boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:24614912:886f56440cbc26aed9d7e1a4157bdc984c5cb118:24614912:bfe25d82c2c4d3b1c209d0a2b9f2c0fa25242f24");
ui_print("Writing uboot loader img...");
package_extract_file("uboot.img", "/dev/block/by-name/uboot");
set_progress(1.000000);
