getprop("ro.product.device") == "beryllium" || abort("E3004: This package is for \"beryllium\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/beryllium/beryllium:9/PKQ1.180729.001/9.6.6:user/release-keys");
ui_print("Target: Xiaomi/beryllium/beryllium:9/PKQ1.180729.001/9.6.13:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/beryllium/beryllium:9/PKQ1.180729.001/9.6.6:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/beryllium/beryllium:9/PKQ1.180729.001/9.6.13:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/beryllium/beryllium:9/PKQ1.180729.001/9.6.6:user/release-keys or Xiaomi/beryllium/beryllium:9/PKQ1.180729.001/9.6.13:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 5);
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:50386250:9a6531ae977857993f0c882d98c78ee4bf1644f2:50386250:0fdfa87886110df740f0e33ee0fc9fb0769d8082") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:50386250:9a6531ae977857993f0c882d98c78ee4bf1644f2:50386250:0fdfa87886110df740f0e33ee0fc9fb0769d8082\" has unexpected contents.");
apply_patch_space(50386250) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "194,1,208,223,553,8303,8310,8311,8312,8607,9027,9815,9832,10283,10284,11207,11215,11473,11474,14992,14993,15352,15383,15560,15944,15963,15965,25747,25748,25791,25793,25802,25803,25935,25936,25941,25942,31821,31822,32229,32230,32234,32236,32238,32463,32468,32470,32479,32480,32505,32506,32512,32518,32768,32770,33979,33980,34289,34291,34293,34294,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34308,34309,34311,34312,34313,34314,34316,34317,34319,34320,34321,34322,34323,34324,34326,34327,34328,34330,34332,34334,34745,34747,34748,34749,34858,34859,34925,34926,34938,34939,35475,35476,35499,35500,35503,35504,35634,35635,35657,35658,35690,35691,35692,35693,37170,37171,37174,37182,37188,37189,37449,37450,37501,37509,37523,37524,38814,38815,38875,38876,38962,38963,38966,38967,39177,39178,39242,39243,39244,39245,39255,40051,40061,40062,40065,40068,40078,40079,40133,40148,40149,40150,40153,40154,40169,40170,40175,40176,40540,40541,40548,40550,40552,40553,40602,40604,40710,40711,40732,40734,45303,45304,47670,47671,47710,47799,47808,47846,47863,98306,98495,163842,164031,229378,229567,294914,295103,524296,528344,772219,774155,780254,780261,786432") == "e2c66729321cc37f0f9cc7380052524daccd7900" || block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "194,1,208,223,553,8303,8310,8311,8312,8607,9027,9815,9832,10283,10284,11207,11215,11473,11474,14992,14993,15352,15383,15560,15944,15963,15965,25747,25748,25791,25793,25802,25803,25935,25936,25941,25942,31821,31822,32229,32230,32234,32236,32238,32463,32468,32470,32479,32480,32505,32506,32512,32518,32768,32770,33979,33980,34289,34291,34293,34294,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34308,34309,34311,34312,34313,34314,34316,34317,34319,34320,34321,34322,34323,34324,34326,34327,34328,34330,34332,34334,34745,34747,34748,34749,34858,34859,34925,34926,34938,34939,35475,35476,35499,35500,35503,35504,35634,35635,35657,35658,35690,35691,35692,35693,37170,37171,37174,37182,37188,37189,37449,37450,37501,37509,37523,37524,38814,38815,38875,38876,38962,38963,38966,38967,39177,39178,39242,39243,39244,39245,39255,40051,40061,40062,40065,40068,40078,40079,40133,40148,40149,40150,40153,40154,40169,40170,40175,40176,40540,40541,40548,40550,40552,40553,40602,40604,40710,40711,40732,40734,45303,45304,47670,47671,47710,47799,47808,47846,47863,98306,98495,163842,164031,229378,229567,294914,295103,524296,528344,772219,774155,780254,780261,786432") && block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/vendor", "184,1,70,71,73,80,210,4112,4119,4383,4384,5060,5061,5402,5403,7699,7700,8192,8193,9872,9906,10676,10677,11643,11646,11664,11665,11683,11684,12282,12283,12738,12739,13259,13260,17040,17041,17168,17169,17728,17729,18094,18095,18116,18118,24813,24814,24815,24816,25230,25231,25660,25661,26252,26253,26295,26296,26344,26345,26389,26395,26409,26410,26411,26412,26957,26961,26996,26997,27061,27062,27373,27375,27446,27447,28236,28245,29374,29376,30260,30261,31194,31195,32768,32770,33730,33731,34028,34029,46494,46495,64504,64505,64710,64711,69317,69318,73942,73943,76850,78801,78802,79680,79681,79779,82829,82830,83786,83905,92184,92185,92384,92385,93714,93715,98304,98306,117411,117412,120068,120069,120605,120606,120668,120704,122804,122811,125233,125236,125238,125239,125246,125247,125252,125253,129736,129737,129739,129740,129745,129746,129751,129752,129756,129757,129759,129760,129765,129766,129768,129771,130736,130745,142915,142916,149404,149405,160017,160018,163840,163842,165504,165505,166811,166812,173457,173458,185575,185576,189152,189153,189225,189267,190806,190812,194331,194332,194820,194832,229376,229378,258044,260078,260085,262144") == "a870f12e6c4881be12241ae7682bd9d5b9b71be6" || block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "184,1,70,71,73,80,210,4112,4119,4383,4384,5060,5061,5402,5403,7699,7700,8192,8193,9872,9906,10676,10677,11643,11646,11664,11665,11683,11684,12282,12283,12738,12739,13259,13260,17040,17041,17168,17169,17728,17729,18094,18095,18116,18118,24813,24814,24815,24816,25230,25231,25660,25661,26252,26253,26295,26296,26344,26345,26389,26395,26409,26410,26411,26412,26957,26961,26996,26997,27061,27062,27373,27375,27446,27447,28236,28245,29374,29376,30260,30261,31194,31195,32768,32770,33730,33731,34028,34029,46494,46495,64504,64505,64710,64711,69317,69318,73942,73943,76850,78801,78802,79680,79681,79779,82829,82830,83786,83905,92184,92185,92384,92385,93714,93715,98304,98306,117411,117412,120068,120069,120605,120606,120668,120704,122804,122811,125233,125236,125238,125239,125246,125247,125252,125253,129736,129737,129739,129740,129745,129746,129751,129752,129756,129757,129759,129760,129765,129766,129768,129771,130736,130745,142915,142916,149404,149405,160017,160018,163840,163842,165504,165505,166811,166812,173457,173458,185575,185576,189152,189153,189225,189267,190806,190812,194331,194332,194820,194832,229376,229378,258044,260078,260085,262144") && block_image_verify("/dev/block/bootdevice/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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:50386250:9a6531ae977857993f0c882d98c78ee4bf1644f2:50386250:0fdfa87886110df740f0e33ee0fc9fb0769d8082",
            "-", 0fdfa87886110df740f0e33ee0fc9fb0769d8082, 50386250,
            9a6531ae977857993f0c882d98c78ee4bf1644f2, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/bootdevice/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.");
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
package_extract_file("firmware-update/dsp.img", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/cmnlib64.img", "/dev/block/bootdevice/by-name/cmnlib64_a");
package_extract_file("firmware-update/aop.img", "/dev/block/bootdevice/by-name/aop_a");
package_extract_file("firmware-update/devcfg.img", "/dev/block/bootdevice/by-name/devcfg_a");
package_extract_file("firmware-update/qupfw.img", "/dev/block/bootdevice/by-name/qupfw_a");
package_extract_file("firmware-update/tz.img", "/dev/block/bootdevice/by-name/tz_a");
package_extract_file("firmware-update/storsec.img", "/dev/block/bootdevice/by-name/storsec_a");
package_extract_file("firmware-update/keymaster.img", "/dev/block/bootdevice/by-name/keymaster_a");
package_extract_file("firmware-update/bluetooth.img", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/xbl.img", "/dev/block/bootdevice/by-name/xbl_a");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_a");
package_extract_file("firmware-update/xbl_config.img", "/dev/block/bootdevice/by-name/xbl_config_a");
package_extract_file("firmware-update/cmnlib.img", "/dev/block/bootdevice/by-name/cmnlib_a");
package_extract_file("firmware-update/hyp.img", "/dev/block/bootdevice/by-name/hyp_a");
package_extract_file("firmware-update/cmnlib64.img", "/dev/block/bootdevice/by-name/cmnlib64_b");
package_extract_file("firmware-update/aop.img", "/dev/block/bootdevice/by-name/aop_b");
package_extract_file("firmware-update/devcfg.img", "/dev/block/bootdevice/by-name/devcfg_b");
package_extract_file("firmware-update/qupfw.img", "/dev/block/bootdevice/by-name/qupfw_b");
package_extract_file("firmware-update/tz.img", "/dev/block/bootdevice/by-name/tz_b");
package_extract_file("firmware-update/storsec.img", "/dev/block/bootdevice/by-name/storsec_b");
package_extract_file("firmware-update/keymaster.img", "/dev/block/bootdevice/by-name/keymaster_b");
package_extract_file("firmware-update/xbl.img", "/dev/block/bootdevice/by-name/xbl_b");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_b");
package_extract_file("firmware-update/xbl_config.img", "/dev/block/bootdevice/by-name/xbl_config_b");
package_extract_file("firmware-update/cmnlib.img", "/dev/block/bootdevice/by-name/cmnlib_b");
package_extract_file("firmware-update/hyp.img", "/dev/block/bootdevice/by-name/hyp_b");
package_extract_file("firmware-update/modem.img", "/dev/block/bootdevice/by-name/modem");
show_progress(0.100000, 2);
