getprop("ro.product.device") == "picasso" || abort("E3004: This package is for \"picasso\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/picasso/picasso:11/RKQ1.200826.002/V12.1.6.0.RGICNXM:user/release-keys");
ui_print("Target: Redmi/picasso/picasso:11/RKQ1.200826.002/V12.1.8.0.RGICNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/picasso/picasso:11/RKQ1.200826.002/V12.1.6.0.RGICNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/picasso/picasso:11/RKQ1.200826.002/V12.1.8.0.RGICNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/picasso/picasso:11/RKQ1.200826.002/V12.1.6.0.RGICNXM:user/release-keys or Redmi/picasso/picasso:11/RKQ1.200826.002/V12.1.8.0.RGICNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c65c40ee3d7d24825d90dcb1d09450e5b3bf35e6"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:1e6389739bb9806bfd8b704569e3128c0154a623")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c65c40ee3d7d24825d90dcb1d09450e5b3bf35e6"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:1e6389739bb9806bfd8b704569e3128c0154a623"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "18,1,31,41,51,53,57,1990,1991,2036,2037,2053,851969,851983,868159,870781,884578,884763,884764") == "6ef07ea398c6777518c7bb7877794ee82c68f1b0" || 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"), "18,1,31,41,51,53,57,1990,1991,2036,2037,2053,851969,851983,868159,870781,884578,884763,884764") && 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"), "302,1,27,37,41,46,47,126,134,140,141,1815,1819,2296,2297,2303,2307,2311,2312,2317,2318,2323,2329,2330,2331,2575,2579,2584,2585,2587,2591,2593,2594,2617,2618,2654,2658,2708,2709,2844,2845,2856,2862,2863,2864,2867,2873,2874,2875,2878,2879,4333,4384,4479,4480,4521,4562,6998,6999,16357,16358,16925,16986,17372,17374,17375,17376,17378,17381,17382,17383,17385,17387,17388,17389,17391,17393,17394,17395,17397,17399,17400,17401,17403,17405,17406,17407,17409,17411,17416,17418,17421,17423,17426,17428,17436,17438,17441,17443,17444,17445,17447,17449,17450,17451,17454,17456,17457,17458,17460,17462,17463,17464,17466,17468,17469,17470,17472,17474,17475,17476,17478,17480,17481,17482,17491,17492,17511,17512,17513,17514,17518,17519,17520,17521,17524,17525,17526,17527,17530,17531,17532,17533,17536,17537,17538,17539,17543,17544,17545,17546,17549,17550,17551,17552,17556,17557,17561,17562,17566,17567,17571,17572,17576,17577,17578,17579,17588,17589,17590,17591,17594,17595,17596,17597,17600,17601,17602,17603,17606,17607,17608,17609,17611,17613,17905,17906,18021,18022,19038,19043,22945,22946,24217,24218,25845,25848,26995,26997,27945,27947,28117,28120,29488,29489,32667,32669,32768,32793,35011,35012,41701,41704,45432,45434,51228,51229,54128,54129,54131,54132,54180,54181,65536,65555,81402,81403,88471,88472,88573,88575,89375,89380,89473,89474,94592,94593,97839,97841,97889,97890,98304,98324,102529,102530,103164,103166,103804,103806,104354,104356,104939,104940,105846,105847,105856,105857,105945,105946,110277,110278,110894,110895,112622,112623,128027,128028,128032,128034,128051,128052,128087,128088,128097,128098,128100,128101,128151,128152,128158,128159,128864,128865,128920,128921,128946,128947,128981,128982,129088,129089,129127,129128,129133,129134,129209,393231,393234,410779,412033,418565,418658,418659") == "670679c4b35c8d5c352a44e636bac5acec551a73" || 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"), "302,1,27,37,41,46,47,126,134,140,141,1815,1819,2296,2297,2303,2307,2311,2312,2317,2318,2323,2329,2330,2331,2575,2579,2584,2585,2587,2591,2593,2594,2617,2618,2654,2658,2708,2709,2844,2845,2856,2862,2863,2864,2867,2873,2874,2875,2878,2879,4333,4384,4479,4480,4521,4562,6998,6999,16357,16358,16925,16986,17372,17374,17375,17376,17378,17381,17382,17383,17385,17387,17388,17389,17391,17393,17394,17395,17397,17399,17400,17401,17403,17405,17406,17407,17409,17411,17416,17418,17421,17423,17426,17428,17436,17438,17441,17443,17444,17445,17447,17449,17450,17451,17454,17456,17457,17458,17460,17462,17463,17464,17466,17468,17469,17470,17472,17474,17475,17476,17478,17480,17481,17482,17491,17492,17511,17512,17513,17514,17518,17519,17520,17521,17524,17525,17526,17527,17530,17531,17532,17533,17536,17537,17538,17539,17543,17544,17545,17546,17549,17550,17551,17552,17556,17557,17561,17562,17566,17567,17571,17572,17576,17577,17578,17579,17588,17589,17590,17591,17594,17595,17596,17597,17600,17601,17602,17603,17606,17607,17608,17609,17611,17613,17905,17906,18021,18022,19038,19043,22945,22946,24217,24218,25845,25848,26995,26997,27945,27947,28117,28120,29488,29489,32667,32669,32768,32793,35011,35012,41701,41704,45432,45434,51228,51229,54128,54129,54131,54132,54180,54181,65536,65555,81402,81403,88471,88472,88573,88575,89375,89380,89473,89474,94592,94593,97839,97841,97889,97890,98304,98324,102529,102530,103164,103166,103804,103806,104354,104356,104939,104940,105846,105847,105856,105857,105945,105946,110277,110278,110894,110895,112622,112623,128027,128028,128032,128034,128051,128052,128087,128088,128097,128098,128100,128101,128151,128152,128158,128159,128864,128865,128920,128921,128946,128947,128981,128982,129088,129089,129127,129128,129133,129134,129209,393231,393234,410779,412033,418565,418658,418659") && 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"), "144,1,25,30,31,33,34,150,154,158,159,171,177,178,179,3119,3120,15396,15397,15452,15453,31999,32000,32768,32785,34480,34481,37972,37973,41830,41831,41838,41840,42003,42004,42007,42008,42014,42016,42034,42035,42037,42038,42076,42080,42084,42088,42089,42101,42516,42517,42888,42889,44374,44375,44464,44466,44468,44469,44471,44472,44474,44475,44477,44478,44480,44481,44483,44484,44494,44495,44497,44498,44500,44501,44503,44504,44506,44507,44509,44510,44520,44521,44541,44542,44548,44549,44569,44570,44586,44587,44591,44592,44609,44610,44615,44616,44635,44636,44650,44651,44655,44656,44675,44676,44682,44683,44703,44704,44719,44720,44724,44725,44727,44728,44730,44731,44733,44734,44736,44737,44739,44740,44742,44743,44745,44746,44748,44749,44751,44752,44754,44755,44765,44767,44771,44777,44778,44779,45416,45420,45573,46299,46324,46325") == "c8676b1d8649afe130d33901a8bc1d53e0433719" || 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"), "144,1,25,30,31,33,34,150,154,158,159,171,177,178,179,3119,3120,15396,15397,15452,15453,31999,32000,32768,32785,34480,34481,37972,37973,41830,41831,41838,41840,42003,42004,42007,42008,42014,42016,42034,42035,42037,42038,42076,42080,42084,42088,42089,42101,42516,42517,42888,42889,44374,44375,44464,44466,44468,44469,44471,44472,44474,44475,44477,44478,44480,44481,44483,44484,44494,44495,44497,44498,44500,44501,44503,44504,44506,44507,44509,44510,44520,44521,44541,44542,44548,44549,44569,44570,44586,44587,44591,44592,44609,44610,44615,44616,44635,44636,44650,44651,44655,44656,44675,44676,44682,44683,44703,44704,44719,44720,44724,44725,44727,44728,44730,44731,44733,44734,44736,44737,44739,44740,44742,44743,44745,44746,44748,44749,44751,44752,44754,44755,44765,44767,44771,44777,44778,44779,45416,45420,45573,46299,46324,46325") && 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"), "12,1,12,13,14,22,23,242,243,245,251,270,271") == "845c7c39bc9a768e9d5c2c088bdd524121d4540e" || 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"), "12,1,12,13,14,22,23,242,243,245,251,270,271") && 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"), "290,1,35,42,46,50,51,57,63,64,65,79,85,86,87,145,149,154,155,228,234,238,239,245,251,252,253,447,451,455,456,459,463,468,469,472,473,479,485,486,487,509,515,516,517,1228,1232,1250,1251,1255,1261,1262,1263,1265,1266,1277,1283,1284,1285,1295,1296,1301,1305,1309,1310,1314,1320,1324,1325,1332,1338,1339,1340,1352,1358,1359,1360,1362,1369,1375,1382,1387,1394,1424,1431,1450,1457,1475,1480,1497,1504,1520,1521,1612,1614,1617,1618,1630,1631,1632,1633,1634,1635,1642,1643,1666,1667,1709,1714,1717,1720,1723,1726,1729,1731,1735,1736,1740,1743,1748,1749,1752,1754,1831,1832,1833,1834,1842,1843,2227,2233,2238,2240,2245,2247,2251,2255,2256,2260,2261,2265,2266,2270,2271,2275,2276,2280,2281,2283,2290,2294,2295,2299,2300,2304,2305,2309,2310,2314,2315,2319,2320,2324,2325,2327,2328,2332,2333,2337,2338,2342,2343,2347,2348,2352,2353,2357,2358,2362,2363,2365,2369,2373,2374,2378,2379,2381,2382,2384,2385,2389,2390,2394,2395,2397,2398,2402,2403,2407,2408,2412,2413,2417,2418,2420,2421,2425,2426,2428,2432,2441,2446,2476,2479,2591,5051,5052,5186,5862,6115,6116,7723,7724,7782,7783,7921,7922,8231,8232,13413,13414,13486,13487,13495,13496,13631,13632,13636,13637,13690,13691,13701,13702,13735,13736,13755,13756,13808,13809,13954,13955,14030,14031,14177,14178,18928,18930,19069,19070,19095,19096,19192,19193,19244,19245,19256,19257,19307,19308,19383,19384,19447,19448,19710,19711,20215,20216,24090,24091,24147,24148,24572,24573,30647,65560,65562,69909,70119,71234,71263,71264") == "21946e1d40ecce5347c795fb89eb00e358269137" || 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"), "290,1,35,42,46,50,51,57,63,64,65,79,85,86,87,145,149,154,155,228,234,238,239,245,251,252,253,447,451,455,456,459,463,468,469,472,473,479,485,486,487,509,515,516,517,1228,1232,1250,1251,1255,1261,1262,1263,1265,1266,1277,1283,1284,1285,1295,1296,1301,1305,1309,1310,1314,1320,1324,1325,1332,1338,1339,1340,1352,1358,1359,1360,1362,1369,1375,1382,1387,1394,1424,1431,1450,1457,1475,1480,1497,1504,1520,1521,1612,1614,1617,1618,1630,1631,1632,1633,1634,1635,1642,1643,1666,1667,1709,1714,1717,1720,1723,1726,1729,1731,1735,1736,1740,1743,1748,1749,1752,1754,1831,1832,1833,1834,1842,1843,2227,2233,2238,2240,2245,2247,2251,2255,2256,2260,2261,2265,2266,2270,2271,2275,2276,2280,2281,2283,2290,2294,2295,2299,2300,2304,2305,2309,2310,2314,2315,2319,2320,2324,2325,2327,2328,2332,2333,2337,2338,2342,2343,2347,2348,2352,2353,2357,2358,2362,2363,2365,2369,2373,2374,2378,2379,2381,2382,2384,2385,2389,2390,2394,2395,2397,2398,2402,2403,2407,2408,2412,2413,2417,2418,2420,2421,2425,2426,2428,2432,2441,2446,2476,2479,2591,5051,5052,5186,5862,6115,6116,7723,7724,7782,7783,7921,7922,8231,8232,13413,13414,13486,13487,13495,13496,13631,13632,13636,13637,13690,13691,13701,13702,13735,13736,13755,13756,13808,13809,13954,13955,14030,14031,14177,14178,18928,18930,19069,19070,19095,19096,19192,19193,19244,19245,19256,19257,19307,19308,19383,19384,19447,19448,19710,19711,20215,20216,24090,24091,24147,24148,24572,24573,30647,65560,65562,69909,70119,71234,71263,71264") && 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;

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


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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
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/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
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.");

# 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.500000, 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 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.");

# --- 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:c65c40ee3d7d24825d90dcb1d09450e5b3bf35e6"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:1e6389739bb9806bfd8b704569e3128c0154a623"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:1e6389739bb9806bfd8b704569e3128c0154a623")));

# ---- 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);
