getprop("ro.product.device") == "gram" || abort("E3004: This package is for \"gram\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: POCO/gram_in/gram:10/QKQ1.191215.002/V11.0.2.0.QJPINXM:user/release-keys");
ui_print("Target: POCO/gram_in/gram:10/QKQ1.191215.002/V11.0.3.0.QJPINXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/gram_in/gram:10/QKQ1.191215.002/V11.0.2.0.QJPINXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/gram_in/gram:10/QKQ1.191215.002/V11.0.3.0.QJPINXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/gram_in/gram:10/QKQ1.191215.002/V11.0.2.0.QJPINXM:user/release-keys or POCO/gram_in/gram:10/QKQ1.191215.002/V11.0.3.0.QJPINXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:134217728:bb19cc17d221b219d14050c05ea96bf57612dd55",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:e409e914bcb9b009b1b958f581c1182b54ca989b") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:bb19cc17d221b219d14050c05ea96bf57612dd55\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:e409e914bcb9b009b1b958f581c1182b54ca989b\" has unexpected contents.");
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "120,1,189,216,225,278,279,539,543,555,556,575,576,1893,1894,2316,26217,26223,26224,27591,27592,32768,32770,32921,32943,32993,32994,33208,33210,33333,33337,33344,33345,33353,33357,33362,33363,34433,34437,34445,34446,34937,34941,34957,34958,34970,34974,34978,34979,36191,36197,36229,36230,36236,36242,36243,36244,36249,36255,36256,36257,36374,36380,36386,36387,37435,37436,37777,37781,37799,37800,38063,38067,38075,38076,39611,39612,39614,39615,39620,39621,39701,39702,40923,40924,40930,40932,41557,41696,43005,43006,43027,43028,43034,43036,43470,43471,43501,43507,43508,43509,43606,43612,43613,98306,98457,163842,163993,229378,229529,294914,295065,402065,402092,589832,589846,620694,622607,632475,632609,632610") == "0507129d24569915d00be25eb7ce1c298a9bc067" || 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"), "120,1,189,216,225,278,279,539,543,555,556,575,576,1893,1894,2316,26217,26223,26224,27591,27592,32768,32770,32921,32943,32993,32994,33208,33210,33333,33337,33344,33345,33353,33357,33362,33363,34433,34437,34445,34446,34937,34941,34957,34958,34970,34974,34978,34979,36191,36197,36229,36230,36236,36242,36243,36244,36249,36255,36256,36257,36374,36380,36386,36387,37435,37436,37777,37781,37799,37800,38063,38067,38075,38076,39611,39612,39614,39615,39620,39621,39701,39702,40923,40924,40930,40932,41557,41696,43005,43006,43027,43028,43034,43036,43470,43471,43501,43507,43508,43509,43606,43612,43613,98306,98457,163842,163993,229378,229529,294914,295065,402065,402092,589832,589846,620694,622607,632475,632609,632610") && 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"), "160,1,106,116,120,125,126,207,211,216,217,1922,1926,2404,2405,2410,2411,2674,2678,2682,2683,2685,2691,2734,2742,2746,2747,2770,2771,2807,2811,2861,2862,2874,2878,2882,2883,2886,2892,2893,2894,3217,3218,3223,3227,3240,3247,3256,3257,3829,4156,4175,4234,14797,14798,14977,15028,15596,15597,15601,15603,15606,15608,15611,15613,15616,15618,15621,15623,15626,15628,15632,15634,15635,15636,15638,15640,15641,15642,15644,15646,15647,15648,15656,15658,15659,15660,15662,15664,15665,15666,15670,15671,15675,15677,15680,15682,15685,15687,15690,15692,15695,15697,15698,15699,15708,15709,15710,15711,15732,15733,15734,15735,15740,15741,15745,15746,15750,15751,15755,15756,15761,15762,15766,15767,15768,15769,15772,15773,15774,15775,15778,15779,15780,15781,15784,15785,16133,16134,16385,16386,17160,17164,22269,32770,32845,98306,98381,163842,163917,229378,229453,294914,294989,295009,295010,308313,309314,314218,314294,314295") == "9e462de130e2df05df838137c571ffd3603dd929" || 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"), "160,1,106,116,120,125,126,207,211,216,217,1922,1926,2404,2405,2410,2411,2674,2678,2682,2683,2685,2691,2734,2742,2746,2747,2770,2771,2807,2811,2861,2862,2874,2878,2882,2883,2886,2892,2893,2894,3217,3218,3223,3227,3240,3247,3256,3257,3829,4156,4175,4234,14797,14798,14977,15028,15596,15597,15601,15603,15606,15608,15611,15613,15616,15618,15621,15623,15626,15628,15632,15634,15635,15636,15638,15640,15641,15642,15644,15646,15647,15648,15656,15658,15659,15660,15662,15664,15665,15666,15670,15671,15675,15677,15680,15682,15685,15687,15690,15692,15695,15697,15698,15699,15708,15709,15710,15711,15732,15733,15734,15735,15740,15741,15745,15746,15750,15751,15755,15756,15761,15762,15766,15767,15768,15769,15772,15773,15774,15775,15778,15779,15780,15781,15784,15785,16133,16134,16385,16386,17160,17164,22269,32770,32845,98306,98381,163842,163917,229378,229453,294914,294989,295009,295010,308313,309314,314218,314294,314295") && 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"), "356,1,84,100,104,108,109,2753,2754,4377,4381,6501,6504,6508,6509,6548,6549,6556,6562,6563,6564,7275,7279,7286,7287,7293,7299,7300,7301,7361,7365,7370,7371,8119,8120,11079,11083,15296,15297,18052,18053,21525,21526,22164,22168,22938,22939,23302,23306,23813,23814,23826,23832,23833,23834,25674,25678,27115,27116,32768,32770,32831,32844,34081,34082,34487,34488,41653,41654,49656,49657,51120,51121,62190,62191,62197,62198,62204,62210,62211,62212,62340,62346,62347,62348,62360,62366,62367,62368,62371,62372,62378,62384,62385,62386,62409,62415,62416,62417,63261,63262,65536,65549,65550,65551,76741,76742,78422,78424,92218,92219,92633,92634,93232,93233,98304,98306,98367,98380,99691,99692,104445,104446,106697,106698,106885,106886,106897,106903,106904,106905,106915,106916,106921,106925,106930,106931,106935,106941,106945,106946,106952,106958,106959,106960,106972,106978,106979,106980,106990,106996,106997,106998,107000,107007,107013,107014,108771,108772,108778,108779,108913,108914,110122,110129,110183,110190,110195,110202,110227,110234,110254,110261,110279,110286,110302,110303,110311,110313,110483,110484,110485,110486,110487,110488,110489,110490,110527,110529,110537,110538,110543,110544,110815,110819,110823,110825,110830,110834,110835,110839,110840,110844,110845,110849,110850,110854,110855,110859,110860,110864,110865,110878,110879,110883,110884,110888,110889,110893,110894,110896,110897,110901,110902,110906,110907,110909,110910,110914,110915,110919,110920,110924,110925,110929,110930,110934,110935,110939,110940,110944,110945,110947,110951,110955,110956,110960,110961,110965,110966,110970,110971,110973,110974,110978,110979,110981,110982,110986,110987,110989,110990,110994,110995,110999,111000,111002,111003,111007,111008,111155,111192,111410,112127,112128,115697,115698,116861,116862,121590,121591,126074,126076,126086,126129,128923,128925,131072,131090,132346,132347,133923,133925,133933,133934,135916,135918,140065,140066,141983,141984,143596,143598,143623,143624,143646,143648,153061,153062,153065,153066,153668,153670,154096,154098,154277,154279,154324,154326,154451,154453,155707,155709,156786,156788,156929,156933,157049,157051,157503,157504,159133,159134,159778,159779,163411,163412,163840,163842,163903,163942,166146,166147,170876,170877,170902,170904,170922,229378,229439,229445,229452,252758,253527,257546,257612,257613") == "c5771386d5f81e1c71e6d5461585d4da4c2c2ca8" || 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
check_first_block(map_partition("product"));
ifelse (block_image_recover(map_partition("product"), "356,1,84,100,104,108,109,2753,2754,4377,4381,6501,6504,6508,6509,6548,6549,6556,6562,6563,6564,7275,7279,7286,7287,7293,7299,7300,7301,7361,7365,7370,7371,8119,8120,11079,11083,15296,15297,18052,18053,21525,21526,22164,22168,22938,22939,23302,23306,23813,23814,23826,23832,23833,23834,25674,25678,27115,27116,32768,32770,32831,32844,34081,34082,34487,34488,41653,41654,49656,49657,51120,51121,62190,62191,62197,62198,62204,62210,62211,62212,62340,62346,62347,62348,62360,62366,62367,62368,62371,62372,62378,62384,62385,62386,62409,62415,62416,62417,63261,63262,65536,65549,65550,65551,76741,76742,78422,78424,92218,92219,92633,92634,93232,93233,98304,98306,98367,98380,99691,99692,104445,104446,106697,106698,106885,106886,106897,106903,106904,106905,106915,106916,106921,106925,106930,106931,106935,106941,106945,106946,106952,106958,106959,106960,106972,106978,106979,106980,106990,106996,106997,106998,107000,107007,107013,107014,108771,108772,108778,108779,108913,108914,110122,110129,110183,110190,110195,110202,110227,110234,110254,110261,110279,110286,110302,110303,110311,110313,110483,110484,110485,110486,110487,110488,110489,110490,110527,110529,110537,110538,110543,110544,110815,110819,110823,110825,110830,110834,110835,110839,110840,110844,110845,110849,110850,110854,110855,110859,110860,110864,110865,110878,110879,110883,110884,110888,110889,110893,110894,110896,110897,110901,110902,110906,110907,110909,110910,110914,110915,110919,110920,110924,110925,110929,110930,110934,110935,110939,110940,110944,110945,110947,110951,110955,110956,110960,110961,110965,110966,110970,110971,110973,110974,110978,110979,110981,110982,110986,110987,110989,110990,110994,110995,110999,111000,111002,111003,111007,111008,111155,111192,111410,112127,112128,115697,115698,116861,116862,121590,121591,126074,126076,126086,126129,128923,128925,131072,131090,132346,132347,133923,133925,133933,133934,135916,135918,140065,140066,141983,141984,143596,143598,143623,143624,143646,143648,153061,153062,153065,153066,153668,153670,154096,154098,154277,154279,154324,154326,154451,154453,155707,155709,156786,156788,156929,156933,157049,157051,157503,157504,159133,159134,159778,159779,163411,163412,163840,163842,163903,163942,166146,166147,170876,170877,170902,170904,170922,229378,229439,229445,229452,252758,253527,257546,257612,257613") && 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;

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

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

# ---- 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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
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/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/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/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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
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/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
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/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
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/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

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

# Patch partition product

ui_print("Patching product image after verification.");
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 vendor

ui_print("Patching vendor image after verification.");
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

ui_print("Patching system image after verification.");
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.");

# --- End patching dynamic partitions ---

show_progress(0.100000, 2);

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
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");
