getprop("ro.product.device") == "gauguin" || abort("E3004: This package is for \"gauguin\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.2.0.RJSTWXM:user/release-keys");
ui_print("Target: Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.4.0.RJSTWXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.2.0.RJSTWXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.4.0.RJSTWXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.2.0.RJSTWXM:user/release-keys or Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.4.0.RJSTWXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:6bab3d7387a8b57bdf0f2766a4c74fb72e7306eb"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:7593c40386be0e7b8259f18e161ac5b8a390bcbb")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:6bab3d7387a8b57bdf0f2766a4c74fb72e7306eb"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:7593c40386be0e7b8259f18e161ac5b8a390bcbb"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "108,1,33,44,54,56,60,88,89,21347,21348,21378,21379,27543,27544,28958,57976,57982,57983,59104,59105,60835,60836,61671,61672,62879,62880,63031,63032,63956,63957,65536,65553,68338,68339,69324,69325,70690,70691,71140,71141,73310,73311,73572,73573,73665,73666,73916,73917,74133,74135,74273,74277,74285,74358,74370,74374,74378,74379,75829,75835,75869,75870,75876,75882,75883,75884,75889,75895,75896,75897,77995,77996,78620,78624,78646,78647,78664,78665,79630,79631,80281,80282,82213,82216,82224,82225,82247,82248,82252,82253,82687,82688,82848,82849,82880,82886,82887,83219,83339,83345,83346,655375,655377,671835,673868,684547,684692,684693") == "6c0cdbcd33749e1d2f03131187b9349ee9ae16bf" || 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"), "108,1,33,44,54,56,60,88,89,21347,21348,21378,21379,27543,27544,28958,57976,57982,57983,59104,59105,60835,60836,61671,61672,62879,62880,63031,63032,63956,63957,65536,65553,68338,68339,69324,69325,70690,70691,71140,71141,73310,73311,73572,73573,73665,73666,73916,73917,74133,74135,74273,74277,74285,74358,74370,74374,74378,74379,75829,75835,75869,75870,75876,75882,75883,75884,75889,75895,75896,75897,77995,77996,78620,78624,78646,78647,78664,78665,79630,79631,80281,80282,82213,82216,82224,82225,82247,82248,82252,82253,82687,82688,82848,82849,82880,82886,82887,83219,83339,83345,83346,655375,655377,671835,673868,684547,684692,684693") && 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"), "714,1,29,39,43,48,49,128,136,142,143,1817,1821,1834,2299,2304,2305,2549,2553,2558,2559,2561,2565,2567,2568,2591,2592,2628,2632,2682,2683,2842,2843,2846,2850,2854,2855,2858,2859,3004,3073,5128,5179,5266,5267,5394,5400,7768,7769,16912,16913,17929,17931,17932,17933,17935,17938,17939,17940,17942,17944,17945,17946,17948,17950,17951,17952,17954,17956,17957,17958,17960,17962,17963,17964,17966,17968,17973,17975,17978,17980,17983,17985,17993,17995,17998,18000,18001,18002,18004,18006,18007,18008,18011,18013,18014,18015,18017,18019,18020,18021,18023,18025,18026,18027,18029,18031,18032,18033,18035,18037,18038,18039,18048,18049,18068,18069,18070,18071,18075,18076,18077,18078,18081,18082,18083,18084,18087,18088,18089,18090,18093,18094,18095,18096,18100,18101,18102,18103,18106,18107,18108,18109,18113,18114,18118,18119,18123,18124,18128,18129,18133,18134,18135,18136,18145,18146,18147,18148,18151,18152,18153,18154,18157,18158,18159,18160,18163,18164,18165,18166,18168,18170,18462,18463,18578,18579,19614,19622,32768,32795,34261,34262,34284,34285,34555,34557,34630,34631,35165,35166,36396,36398,36446,36447,41156,41158,41825,41827,42381,42383,42966,42967,43873,43874,43882,43883,44104,44105,47474,47475,48091,48092,49819,49820,65536,65559,77152,77153,77157,77159,77176,77177,77212,77213,77222,77223,77366,77367,77417,77418,77424,77425,78130,78131,78140,78141,78192,78193,78218,78219,78252,78253,78360,78361,78396,78397,78402,78403,78464,78465,78888,78889,82919,82920,83062,83063,83065,83067,83131,83132,83202,83203,83270,83271,83273,83274,83276,83277,83336,83338,83340,83341,83405,83406,83476,83477,83544,83545,83547,83548,83550,83556,83558,83559,83561,83563,83565,83576,83636,83637,83639,83640,83650,83651,83717,83718,83795,83796,83873,83874,83950,83951,84030,84031,84107,84108,84184,84185,84261,84262,84276,84277,84340,84341,84416,84417,84494,84495,84571,84572,84644,84645,84647,84648,84660,84666,84726,84727,84729,84730,84796,84797,84799,84800,84864,84865,84867,84868,84931,84932,84934,84935,84998,84999,85001,85002,85065,85066,85068,85069,85132,85133,85135,85136,85200,85201,85203,85204,85269,85270,85339,85340,85416,85417,85492,85493,85570,85571,85573,85574,85637,85638,85640,85641,85705,85706,85708,85709,85772,85773,85775,85776,85839,85840,85842,85843,85905,85906,85908,85909,85970,85971,85973,85974,86050,86051,86124,86125,86127,86128,86192,86193,86195,86196,86263,86264,86266,86267,86332,86333,86335,86336,86403,86404,86406,86407,86473,86474,86476,86477,86480,86481,86546,86547,86548,86549,86619,86620,86621,86622,86695,86696,86698,86699,86767,86768,86770,86771,86779,86780,86839,86840,86842,86843,86908,86909,86911,86912,86981,86982,86984,86985,87050,87051,87053,87054,87122,87123,87125,87126,87191,87192,87194,87195,87261,87262,87264,87265,87325,87326,87328,87329,87391,87392,87460,87461,87526,87527,87529,87530,87590,87591,87593,87594,87656,87657,87722,87723,87725,87726,87785,87786,87788,87789,87857,87858,87860,87861,87929,87930,88002,88003,88079,88080,88093,88094,88158,88159,88233,88234,88236,88237,88300,88301,88303,88304,88367,88368,88370,88371,88434,88435,88437,88438,88501,88502,88504,88505,88566,88567,88569,88570,88631,88632,88634,88635,88711,88712,88784,88785,88787,88788,88852,88853,88855,88856,88922,88923,88925,88926,88991,88992,88994,88995,89062,89063,89065,89066,89134,89135,89137,89138,89206,89207,89208,89209,89281,89282,89283,89284,89356,89357,89359,89360,89428,89429,89431,89432,89434,89435,89501,89502,89504,89505,89573,89574,89642,89643,89645,89646,89711,89712,89714,89715,89782,89783,89785,89786,89851,89852,89854,89855,89920,89921,89923,89924,89984,89985,89987,89988,90050,90051,90118,90119,90184,90185,90187,90188,90248,90249,90251,90252,90314,90315,90380,90381,90383,90384,90443,90444,90446,90447,90514,90515,90517,90518,95124,95125,95257,95258,95349,95350,95700,95701,95762,95763,95912,95913,95992,95993,96025,96026,96102,96103,96171,96172,96268,96269,96361,96362,96434,96435,96480,96481,96601,96602,96628,96629,96631,96632,96664,96665,96826,96827,96898,96899,96951,96952,97276,97277,97279,97280,97374,97375,97499,97500,97593,97594,97633,97634,97661,97662,97725,97726,97797,97798,97863,97865,97866,97868,97969,97971,97977,97981,98304,98337,98590,360460,360468,361633,362724,368473,368559,368560") == "e0c6246cf46cf8e2cb94bf92ce6150ed7cf700c2" || 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"), "714,1,29,39,43,48,49,128,136,142,143,1817,1821,1834,2299,2304,2305,2549,2553,2558,2559,2561,2565,2567,2568,2591,2592,2628,2632,2682,2683,2842,2843,2846,2850,2854,2855,2858,2859,3004,3073,5128,5179,5266,5267,5394,5400,7768,7769,16912,16913,17929,17931,17932,17933,17935,17938,17939,17940,17942,17944,17945,17946,17948,17950,17951,17952,17954,17956,17957,17958,17960,17962,17963,17964,17966,17968,17973,17975,17978,17980,17983,17985,17993,17995,17998,18000,18001,18002,18004,18006,18007,18008,18011,18013,18014,18015,18017,18019,18020,18021,18023,18025,18026,18027,18029,18031,18032,18033,18035,18037,18038,18039,18048,18049,18068,18069,18070,18071,18075,18076,18077,18078,18081,18082,18083,18084,18087,18088,18089,18090,18093,18094,18095,18096,18100,18101,18102,18103,18106,18107,18108,18109,18113,18114,18118,18119,18123,18124,18128,18129,18133,18134,18135,18136,18145,18146,18147,18148,18151,18152,18153,18154,18157,18158,18159,18160,18163,18164,18165,18166,18168,18170,18462,18463,18578,18579,19614,19622,32768,32795,34261,34262,34284,34285,34555,34557,34630,34631,35165,35166,36396,36398,36446,36447,41156,41158,41825,41827,42381,42383,42966,42967,43873,43874,43882,43883,44104,44105,47474,47475,48091,48092,49819,49820,65536,65559,77152,77153,77157,77159,77176,77177,77212,77213,77222,77223,77366,77367,77417,77418,77424,77425,78130,78131,78140,78141,78192,78193,78218,78219,78252,78253,78360,78361,78396,78397,78402,78403,78464,78465,78888,78889,82919,82920,83062,83063,83065,83067,83131,83132,83202,83203,83270,83271,83273,83274,83276,83277,83336,83338,83340,83341,83405,83406,83476,83477,83544,83545,83547,83548,83550,83556,83558,83559,83561,83563,83565,83576,83636,83637,83639,83640,83650,83651,83717,83718,83795,83796,83873,83874,83950,83951,84030,84031,84107,84108,84184,84185,84261,84262,84276,84277,84340,84341,84416,84417,84494,84495,84571,84572,84644,84645,84647,84648,84660,84666,84726,84727,84729,84730,84796,84797,84799,84800,84864,84865,84867,84868,84931,84932,84934,84935,84998,84999,85001,85002,85065,85066,85068,85069,85132,85133,85135,85136,85200,85201,85203,85204,85269,85270,85339,85340,85416,85417,85492,85493,85570,85571,85573,85574,85637,85638,85640,85641,85705,85706,85708,85709,85772,85773,85775,85776,85839,85840,85842,85843,85905,85906,85908,85909,85970,85971,85973,85974,86050,86051,86124,86125,86127,86128,86192,86193,86195,86196,86263,86264,86266,86267,86332,86333,86335,86336,86403,86404,86406,86407,86473,86474,86476,86477,86480,86481,86546,86547,86548,86549,86619,86620,86621,86622,86695,86696,86698,86699,86767,86768,86770,86771,86779,86780,86839,86840,86842,86843,86908,86909,86911,86912,86981,86982,86984,86985,87050,87051,87053,87054,87122,87123,87125,87126,87191,87192,87194,87195,87261,87262,87264,87265,87325,87326,87328,87329,87391,87392,87460,87461,87526,87527,87529,87530,87590,87591,87593,87594,87656,87657,87722,87723,87725,87726,87785,87786,87788,87789,87857,87858,87860,87861,87929,87930,88002,88003,88079,88080,88093,88094,88158,88159,88233,88234,88236,88237,88300,88301,88303,88304,88367,88368,88370,88371,88434,88435,88437,88438,88501,88502,88504,88505,88566,88567,88569,88570,88631,88632,88634,88635,88711,88712,88784,88785,88787,88788,88852,88853,88855,88856,88922,88923,88925,88926,88991,88992,88994,88995,89062,89063,89065,89066,89134,89135,89137,89138,89206,89207,89208,89209,89281,89282,89283,89284,89356,89357,89359,89360,89428,89429,89431,89432,89434,89435,89501,89502,89504,89505,89573,89574,89642,89643,89645,89646,89711,89712,89714,89715,89782,89783,89785,89786,89851,89852,89854,89855,89920,89921,89923,89924,89984,89985,89987,89988,90050,90051,90118,90119,90184,90185,90187,90188,90248,90249,90251,90252,90314,90315,90380,90381,90383,90384,90443,90444,90446,90447,90514,90515,90517,90518,95124,95125,95257,95258,95349,95350,95700,95701,95762,95763,95912,95913,95992,95993,96025,96026,96102,96103,96171,96172,96268,96269,96361,96362,96434,96435,96480,96481,96601,96602,96628,96629,96631,96632,96664,96665,96826,96827,96898,96899,96951,96952,97276,97277,97279,97280,97374,97375,97499,97500,97593,97594,97633,97634,97661,97662,97725,97726,97797,97798,97863,97865,97866,97868,97969,97971,97977,97981,98304,98337,98590,360460,360468,361633,362724,368473,368559,368560") && 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"), "110,1,16,3110,3111,3417,3418,3444,3445,6155,6156,10000,10001,10581,10582,12353,12357,12445,12446,12453,12454,12482,15092,15100,15101,15140,15141,23323,23324,31311,31313,31443,31448,32726,32727,32768,32777,33098,33102,33621,33622,33634,33638,33642,33643,35483,35487,35529,35530,35538,36921,46091,46092,50007,50011,50042,50044,50337,50340,54140,54141,63983,63984,65536,65543,73534,73541,75017,75018,75023,75024,75152,75158,75159,75160,75172,75178,75179,75180,82986,82987,84208,84212,85219,85220,86010,86011,88377,88378,98304,98313,101672,101673,101749,101750,103928,103929,120279,120280,120539,120540,120736,120737,122648,229384,229385,258505,259288,263398,263466,263467") == "3e86bafc25ef285b8090a4b2b7dbfd727b08ec63" || 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"), "110,1,16,3110,3111,3417,3418,3444,3445,6155,6156,10000,10001,10581,10582,12353,12357,12445,12446,12453,12454,12482,15092,15100,15101,15140,15141,23323,23324,31311,31313,31443,31448,32726,32727,32768,32777,33098,33102,33621,33622,33634,33638,33642,33643,35483,35487,35529,35530,35538,36921,46091,46092,50007,50011,50042,50044,50337,50340,54140,54141,63983,63984,65536,65543,73534,73541,75017,75018,75023,75024,75152,75158,75159,75160,75172,75178,75179,75180,82986,82987,84208,84212,85219,85220,86010,86011,88377,88378,98304,98313,101672,101673,101749,101750,103928,103929,120279,120280,120539,120540,120736,120737,122648,229384,229385,258505,259288,263398,263466,263467") && 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,16,24,25,246,247,249,255,274,275") == "81400df83a8ccb44875297092a077170e9aca537" || 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,16,24,25,246,247,249,255,274,275") && 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"), "24,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,98324,98327,113041,113381,115180,115220,115221") == "98eae8f1adc4888fbd56f6e1be2e757f2bf288ac" || 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"), "24,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,98324,98327,113041,113381,115180,115220,115221") && 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/abl_ecc.elf", "/dev/block/bootdevice/by-name/abl");
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/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/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
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/abl_ecc.elf", "/dev/block/bootdevice/by-name/ablbak");
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/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 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.");

# Update dynamic partition metadata

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

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

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