getprop("ro.product.device") == "sakura" || abort("E3004: This package is for \"sakura\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: xiaomi/sakura/sakura:9/PKQ1.180917.001/V11.0.3.0.PDICNXM:user/release-keys");
ui_print("Target: xiaomi/sakura/sakura:9/PKQ1.180917.001/V11.0.4.0.PDICNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/sakura/sakura:9/PKQ1.180917.001/V11.0.3.0.PDICNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/sakura/sakura:9/PKQ1.180917.001/V11.0.4.0.PDICNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/sakura/sakura:9/PKQ1.180917.001/V11.0.3.0.PDICNXM:user/release-keys or xiaomi/sakura/sakura:9/PKQ1.180917.001/V11.0.4.0.PDICNXM: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:23567690:d8f919abaf12a95a4bbce0a10097cae1e8a6f709:23567690:3f53bb5835545c91cd4d507da496340fed8f14f9") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:23567690:d8f919abaf12a95a4bbce0a10097cae1e8a6f709:23567690:3f53bb5835545c91cd4d507da496340fed8f14f9\" has unexpected contents.");
apply_patch_space(214745088) || 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", "100,1,208,223,530,8303,32770,32959,78311,83937,92607,93268,93798,95185,98306,98495,136774,148837,163842,164031,173469,184647,194678,199218,229378,229567,258165,267143,290004,290026,290047,290154,290422,290525,290563,292284,292356,292379,294914,295103,371149,371153,371171,371177,371253,371325,372020,372069,372532,372536,372557,372593,372643,372648,372778,372822,373645,373697,373748,373774,373810,373822,373830,373848,374019,374202,374266,374284,374344,374390,374546,374579,374614,374663,374770,374810,374812,374814,374815,375707,375709,375727,375729,375735,375736,375740,375741,375747,375760,375865,524296,528344,575247,578471,709915,709917,740631,774155,780254,780261,786432") == "1f4a3c2cfc381b29c3d6813323b4a140dd8d9e9a" || 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", "100,1,208,223,530,8303,32770,32959,78311,83937,92607,93268,93798,95185,98306,98495,136774,148837,163842,164031,173469,184647,194678,199218,229378,229567,258165,267143,290004,290026,290047,290154,290422,290525,290563,292284,292356,292379,294914,295103,371149,371153,371171,371177,371253,371325,372020,372069,372532,372536,372557,372593,372643,372648,372778,372822,373645,373697,373748,373774,373810,373822,373830,373848,374019,374202,374266,374284,374344,374390,374546,374579,374614,374663,374770,374810,374812,374814,374815,375707,375709,375727,375729,375735,375736,375740,375741,375747,375760,375865,524296,528344,575247,578471,709915,709917,740631,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", "20,1,69,71,73,80,327,4112,32770,32832,98306,98368,151889,163840,163842,229376,229378,258044,260078,260085,262144") == "b70cb7578c60f9fca7397eaf9f6eeb9e8e39079e" || 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", "20,1,69,71,73,80,327,4112,32770,32832,98306,98368,151889,163840,163842,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:23567690:d8f919abaf12a95a4bbce0a10097cae1e8a6f709:23567690:3f53bb5835545c91cd4d507da496340fed8f14f9",
            "-", 3f53bb5835545c91cd4d507da496340fed8f14f9, 23567690,
            d8f919abaf12a95a4bbce0a10097cae1e8a6f709, 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/splash.img", "/dev/block/bootdevice/by-name/splash");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/emmc_appsboot.mbn", "/dev/block/bootdevice/by-name/aboot");
package_extract_file("firmware-update/lksecapp.mbn", "/dev/block/bootdevice/by-name/lksecapp");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/sbl1.mbn", "/dev/block/bootdevice/by-name/sbl1");
package_extract_file("firmware-update/cmnlib64_30.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/cmnlib_30.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/emmc_appsboot.mbn", "/dev/block/bootdevice/by-name/abootbak");
package_extract_file("firmware-update/lksecapp.mbn", "/dev/block/bootdevice/by-name/lksecappbak");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/sbl1.mbn", "/dev/block/bootdevice/by-name/sbl1bak");
package_extract_file("firmware-update/cmnlib64_30.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib_30.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/adspso.bin", "/dev/block/bootdevice/by-name/dsp");
show_progress(0.100000, 2);
