getprop("ro.product.device") == "sweet" || abort("E3004: This package is for \"sweet\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/sweet_tr2/sweet:11/RKQ1.210614.002/V816.0.10.0.THGTRXM:user/release-keys");
ui_print("Target: Redmi/sweet_tr2/sweet:11/RKQ1.210614.002/V816.0.12.0.THGTRXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/sweet_tr2/sweet:11/RKQ1.210614.002/V816.0.10.0.THGTRXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/sweet_tr2/sweet:11/RKQ1.210614.002/V816.0.12.0.THGTRXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/sweet_tr2/sweet:11/RKQ1.210614.002/V816.0.10.0.THGTRXM:user/release-keys or Redmi/sweet_tr2/sweet:11/RKQ1.210614.002/V816.0.12.0.THGTRXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:e3e03b7bf9a410d90fb0e2d728c9674c08b66fc6"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:61ff46e1a7a3f4590bd42a5a5ca5521c4b32f5a6")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:e3e03b7bf9a410d90fb0e2d728c9674c08b66fc6"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:61ff46e1a7a3f4590bd42a5a5ca5521c4b32f5a6"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "8,0,12288,24576,36864,61440,147456,159744,346165") == "a3f51b20796c4c6c3d88c5c3b8efe8a768b9288c" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "8,0,12288,24576,36864,61440,147456,159744,346165") && block_image_verify(map_partition("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(map_partition("vendor"), "408,1,121,132,134,141,142,222,228,236,237,2109,2111,2131,2132,2139,2141,2147,2148,2393,2395,2402,2403,2409,2411,2416,2417,2426,2428,2433,2434,2439,2441,2446,2447,2460,2462,2468,2469,2472,2473,2483,2485,2491,2492,3278,3279,5900,5901,14635,14636,15640,15642,15646,15648,15649,15650,15671,15672,15673,15674,15677,15678,15683,15684,15685,15686,15690,15691,15695,15696,15700,15701,15705,15706,15710,15711,15715,15716,15717,15718,15721,15723,15724,15725,15727,15729,15730,15731,15734,15735,15736,15737,15740,15741,15742,15743,15746,15747,15748,15749,15752,15753,15754,15755,15759,15760,15764,15765,15768,15770,15774,15775,15778,15780,15781,15782,15786,15787,15788,15789,15792,15793,15794,15795,15798,15799,15800,15801,15804,15805,15806,15807,15810,15812,15813,15814,15817,15818,15819,15820,15825,15826,15830,15831,15835,15836,15840,15841,15845,15846,16207,16208,17123,17129,32768,32770,32859,32887,58660,58661,59290,59292,59321,59323,59869,59870,60092,60093,65536,65558,81751,81752,81756,81758,81775,81776,81811,81812,81821,81822,81824,81825,81879,81880,81884,81885,81961,81962,81968,81969,81994,81995,82033,82034,82140,82141,82202,82203,82334,82338,82811,82812,82836,82837,82891,82892,83289,83290,83296,83297,83313,83314,83429,83430,83432,83434,83498,83499,83569,83570,83637,83638,83640,83641,83643,83653,83712,83713,83715,83717,83778,83779,83781,83782,83842,83843,83845,83846,83909,83910,83912,83913,83980,83981,83983,83984,84051,84052,84121,84122,84190,84191,84262,84263,84265,84266,84331,84332,84334,84335,84399,84400,84402,84403,84467,84468,84470,84471,84538,84539,84541,84542,84609,84610,84612,84613,84677,84678,84680,84681,84745,84746,84748,84749,84813,84814,84817,84818,84882,84883,84885,84886,84951,84952,84954,84955,84957,84958,85021,85022,85024,85025,85028,85030,88842,88843,94046,94047,94103,94104,94137,94138,94202,94203,94353,94354,94433,94434,94458,94459,94529,94530,94597,94598,94629,94630,94722,94723,94795,94796,94820,94821,94907,94908,94947,94948,94950,94951,94983,94984,95205,95206,95322,95323,95394,95395,95451,95452,95593,95594,95595,95596,95706,95707,95772,95773,95803,95804,95852,95853,95923,95924,96006,96007,96261,96263,96319,96320,96610,96614,96622,96624,96632,96635,96637,96641,96655,96656,96817,96823,96959,96963,96971,96972,96973,96974,97030,97032,97038,97040,97078,97103,98142,98306,98395,163842,163931,229378,229467,294914,295003,360465,360470,367348,368569,374412,374498,374499") == "f2423fa56858b4a8bbda47b2516e966f5e7ac6ee" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "408,1,121,132,134,141,142,222,228,236,237,2109,2111,2131,2132,2139,2141,2147,2148,2393,2395,2402,2403,2409,2411,2416,2417,2426,2428,2433,2434,2439,2441,2446,2447,2460,2462,2468,2469,2472,2473,2483,2485,2491,2492,3278,3279,5900,5901,14635,14636,15640,15642,15646,15648,15649,15650,15671,15672,15673,15674,15677,15678,15683,15684,15685,15686,15690,15691,15695,15696,15700,15701,15705,15706,15710,15711,15715,15716,15717,15718,15721,15723,15724,15725,15727,15729,15730,15731,15734,15735,15736,15737,15740,15741,15742,15743,15746,15747,15748,15749,15752,15753,15754,15755,15759,15760,15764,15765,15768,15770,15774,15775,15778,15780,15781,15782,15786,15787,15788,15789,15792,15793,15794,15795,15798,15799,15800,15801,15804,15805,15806,15807,15810,15812,15813,15814,15817,15818,15819,15820,15825,15826,15830,15831,15835,15836,15840,15841,15845,15846,16207,16208,17123,17129,32768,32770,32859,32887,58660,58661,59290,59292,59321,59323,59869,59870,60092,60093,65536,65558,81751,81752,81756,81758,81775,81776,81811,81812,81821,81822,81824,81825,81879,81880,81884,81885,81961,81962,81968,81969,81994,81995,82033,82034,82140,82141,82202,82203,82334,82338,82811,82812,82836,82837,82891,82892,83289,83290,83296,83297,83313,83314,83429,83430,83432,83434,83498,83499,83569,83570,83637,83638,83640,83641,83643,83653,83712,83713,83715,83717,83778,83779,83781,83782,83842,83843,83845,83846,83909,83910,83912,83913,83980,83981,83983,83984,84051,84052,84121,84122,84190,84191,84262,84263,84265,84266,84331,84332,84334,84335,84399,84400,84402,84403,84467,84468,84470,84471,84538,84539,84541,84542,84609,84610,84612,84613,84677,84678,84680,84681,84745,84746,84748,84749,84813,84814,84817,84818,84882,84883,84885,84886,84951,84952,84954,84955,84957,84958,85021,85022,85024,85025,85028,85030,88842,88843,94046,94047,94103,94104,94137,94138,94202,94203,94353,94354,94433,94434,94458,94459,94529,94530,94597,94598,94629,94630,94722,94723,94795,94796,94820,94821,94907,94908,94947,94948,94950,94951,94983,94984,95205,95206,95322,95323,95394,95395,95451,95452,95593,95594,95595,95596,95706,95707,95772,95773,95803,95804,95852,95853,95923,95924,96006,96007,96261,96263,96319,96320,96610,96614,96622,96624,96632,96635,96637,96641,96655,96656,96817,96823,96959,96963,96971,96972,96973,96974,97030,97032,97038,97040,97078,97103,98142,98306,98395,163842,163931,229378,229467,294914,295003,360465,360470,367348,368569,374412,374498,374499") && block_image_verify(map_partition("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(map_partition("product"), "46,0,36864,49152,73728,86016,135168,147456,172032,196608,233472,270336,282624,294912,344064,380928,393216,405504,417792,430080,442368,565248,577536,602112,663552,700416,712704,737280,749568,761856,774144,811008,823296,835584,872448,884736,897024,933888,958464,983040,995328,1007616,1032192,1044480,1056768,1130496,1155072") == "c300587e636aea292cfbef80bb662856cee96259" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
ifelse (block_image_recover(map_partition("product"), "46,0,36864,49152,73728,86016,135168,147456,172032,196608,233472,270336,282624,294912,344064,380928,393216,405504,417792,430080,442368,565248,577536,602112,663552,700416,712704,737280,749568,761856,774144,811008,823296,835584,872448,884736,897024,933888,958464,983040,995328,1007616,1032192,1044480,1056768,1130496,1155072") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product partition fails to recover"));
endif;
if (range_sha1(map_partition("odm"), "14,1,14,33,34,35,36,44,45,323,324,327,336,352,353") == "b564df7a2f93c51aec6537825caa2c2026b4f7c1" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
ifelse (block_image_recover(map_partition("odm"), "14,1,14,33,34,35,36,44,45,323,324,327,336,352,353") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm partition fails to recover"));
endif;
if (range_sha1(map_partition("system_ext"), "6,0,12288,24576,86016,98304,185375") == "2d27534deb7ca62afdab3c3e6cd77ac4225e39a4" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "6,0,12288,24576,86016,98304,185375") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;
if (range_sha1(map_partition("mi_ext"), "2,0,647") == "a76d55fb3bdb6e42f3b4636f987c0ecef776a96d" || block_image_verify(map_partition("mi_ext"), package_extract_file("mi_ext.transfer.list"), "mi_ext.new.dat", "mi_ext.patch.dat")) then
ui_print("Verified mi_ext image...");
else
ifelse (block_image_recover(map_partition("mi_ext"), "2,0,647") && block_image_verify(map_partition("mi_ext"), package_extract_file("mi_ext.transfer.list"), "mi_ext.new.dat", "mi_ext.patch.dat"), ui_print("mi_ext recovered successfully."), abort("E2004: mi_ext partition fails to recover"));
endif;

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


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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/cmnlib.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/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
package_extract_file("firmware-update/km41.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib.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/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
package_extract_file("firmware-update/km41.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");

# --- Start patching dynamic partitions ---


# Patch partition vendor

ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Patch partition system_ext

ui_print("Patching system_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat") ||
  abort("E2001: Failed to update system_ext image.");

# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition system

ui_print("Patching system image after verification.");
show_progress(0.400000, 0);
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# Patch partition product

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Patch partition odm

ui_print("Patching odm image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat") ||
  abort("E2001: Failed to update odm image.");

# Patch partition mi_ext

ui_print("Patching mi_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("mi_ext"), package_extract_file("mi_ext.transfer.list"), "mi_ext.new.dat", "mi_ext.patch.dat") ||
  abort("E2001: Failed to update mi_ext image.");

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:e3e03b7bf9a410d90fb0e2d728c9674c08b66fc6"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:61ff46e1a7a3f4590bd42a5a5ca5521c4b32f5a6"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:61ff46e1a7a3f4590bd42a5a5ca5521c4b32f5a6")));

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
set_progress(1.000000);
