Hello Guix,
I'm very happy to present a V3 of a proposal towards decentralizing substitute
distribution with ERIS. An initial version [1] and a V2 [2] are now almost a
years old!
The idea is to use ERIS (Encoding for Robust Immutable Storage) [3] to allow
more decentralized substitute distribution. ERIS defines an encoding of
content into uniformly sized, encrypted and content-addressed blocks
(32KiB). The content can be decoded from the blocks given a short identifier
called the read capability. It allows a network-optimized form of
content-addressing.
Blocks can be transported over many different transport protocols, such as
HTTP, CoAP, GNUnet, IPFS or a SD card sent via pigeons. Only the read
capability must be transmited securely. Given an authentic read capability,
the content can be decoded correctly from blocks that might have been
transported over unreliable (and untrusted) protocols.
For Guix, substitutes (Nar files) are encoded using ERIS and the read
capability is added to the signed Narinfos. The read capability published in
the Narinfo can then be used to decode the Nar from blocks that are fetched
from many peers over many different protocols.
This version of the patches allows blocks to be fetched over HTTP and IPFS.
A summary of this patch series:
- Use the stable version of the ERIS encoding (version 1.0.0)
- Add two fields to Narinfos (ERIS and ERISFormat)
- Store blocks of published substitutes in a local block store (in
`/var/guix/eris`)
- Add an endpoint for resolving ERIS blocks over HTTP (a la RFC 2169)
- Use ERIS when fetching substitutes
- Use IPFS for de-referencing ERIS blocks
Testing procedure is a bit tedious, but described in the V2:
Please give it a try or a read.
Two commits are marked as WIP and have some todos regarding
configuration. Suggestions in how to go about Guix wide configuration are very
welcome.
Some further ideas include:
- We've been researching CoAP (RFC 7252) as a transport protocol for
blocks. It is lightweight, performant, well-specified and optimized for
small implementations, meaning it can be reasonably implemented in pure
Guile. This would allow more light-weight peer connections (over UDP) and
also discovery of local peers via CoAP service discovery [4] - very similar
to how Avahi is currently used.
- Publish substitutes to IPFS. Currently substitutes are not published to
IPFS. It might make sense to add a CLI command that does this. In a previous
verion of the series this was done when a substitute is requested over
HTTP. But it seems to make sense to publish on IPFS (or other protocols)
independantly of the HTTP endpoints.
- Use an optimized format for encoding Nars. Based on some investigation into
SquashFS, EROFS and de-duplication of files in substitutes [5], we have an
initial proposal of how to encode Nars (and in general file system trees) in
ERIS so that common files are de-duplicated:
- More transport protocols.
Thanks for making it so far! :) I'd be very happy for your thoughs and
ideas. There might also be opportunity to discuss these ideas at Guix Days in
February.
Best regards and a happy new year,
pukkamustard
pukkamustard (8):
publish: Add ERIS URN to narinfo.
publish: Store ERIS encoded blocks to a local block store.
publish: Add HTTP endpoint for resolving ERIS blocks.
WIP: substitute: Fetch substitutes using ERIS.
eris/http: Add HTTP block de-referencer.
WIP: eris: Use HTTP to get ERIS blocks.
eris: Use parameterized %eris-peers when getting blocks.
eris: Use IPFS to get ERIS blocks.
Makefile.am | 4 +
configure.ac | 5 +
gnu/packages/package-management.scm | 1 +
guix/eris.scm | 95 ++++++++++++
guix/eris/fs-store.scm | 66 +++++++++
guix/eris/http.scm | 82 +++++++++++
guix/eris/ipfs.scm | 214 ++++++++++++++++++++++++++++
guix/narinfo.scm | 16 ++-
guix/scripts/publish.scm | 55 ++++++-
guix/scripts/substitute.scm | 44 ++++--
10 files changed, 563 insertions(+), 19 deletions(-)
create mode 100644 guix/eris.scm
create mode 100644 guix/eris/fs-store.scm
create mode 100644 guix/eris/http.scm
create mode 100644 guix/eris/ipfs.scm
base-commit: c37b6fba1af0d823bd18c753484459b40fc8c041
prerequisite-patch-id: 38bf058b6e298a205d7c9bc19f6358ee3cd5257b
prerequisite-patch-id: b2bb0971706132f1f02d99a9a7504fb195d6a74a
prerequisite-patch-id: 60537c1eb34acc412769470c7ee90043bde600f9
prerequisite-patch-id: 71cb6edb430a0b8371b4c06d171b51e781bfe348
prerequisite-patch-id: 38a019a8380ac8dfb77bfb6304159ce8ca6d32dd
prerequisite-patch-id: a53a66ddac48c405f30debc74b267de5895394c9
prerequisite-patch-id: 165aa2669327788a9e51436b8000643da742b16e
prerequisite-patch-id: 2812cebf583538f6bdd2acccd6e0825ceca7ba25
prerequisite-patch-id: 0d04d66369e86604a7bbd59c28cafe3ee3bd7730
prerequisite-patch-id: ccb6e14312ab11227f5547d17cd7c5df2341238a
prerequisite-patch-id: 0b7662f5b8b11edd52fd902d8e70827a6661323c
prerequisite-patch-id: 26ee9dc07a521052655c3bdaf849febaf0464e50
prerequisite-patch-id: 8b2b3209e7f0053d75b52c2475a76feed2114de2
prerequisite-patch-id: 2fdb157131a90a1542357acaf17cb34db4ca7f9b
prerequisite-patch-id: 1ddca41aca5544ab9fa3fa868271976293db1518
prerequisite-patch-id: 04eb88d682cb51708eba1dcd5e20e7b468daf1ce
prerequisite-patch-id: 531d5e5039f76948cdf3fc21ccd9dc61fd9682f0
prerequisite-patch-id: 17a795a4022a0c80b2df3f362fa965ad65f42191
prerequisite-patch-id: 4216fc57a30c8c1d3db94a48aae78b73d9a2c77e
prerequisite-patch-id: 305b8cf69729cb3d6167bb60189e6a9e1d228fd8
prerequisite-patch-id: 60de21549abd45931b5ecad335acb88a5369696c
prerequisite-patch-id: 27c2475ac075bd74804106bbfab927cc168333a4
prerequisite-patch-id: 5f8bd6b339c6fc14deba1929a5cd934e3a8bbb68
prerequisite-patch-id: 93ad6954d493f65bf032525c09996de41c51de1d
prerequisite-patch-id: 6195fafe0e46bf1b6ae15f08a1d1fa3c98b89cab
prerequisite-patch-id: ee11d213a4ee466dff6379eeaeea292b6ba93fb0
prerequisite-patch-id: 857e9a0f3d1bc9ad5584c44bc767683a53e44972
prerequisite-patch-id: b87a0615ac48fe8950281f797cd2d096a98f4a2c
prerequisite-patch-id: c554e46d5d315cd349df21ba153ef6ed580f0b3c
prerequisite-patch-id: 232075806f66963ae7aa260cb6fd3e537f30f1e4
prerequisite-patch-id: 4c5479903595202ac84dcd5978c7c58f542110a4
prerequisite-patch-id: 9e68c0bacd9228f62607d52285f587988a49a6c6
prerequisite-patch-id: b6bcee4d778d2cbf9bcd3d55bb39a65fa5659a61
prerequisite-patch-id: d6702e7370f001971201f5f751719f888b1b9354
prerequisite-patch-id: ead326db75ec4a111dd64f56c985853319a3d55c
prerequisite-patch-id: 2633f1445ab40e07536b7c0d0c7df2ca8699bc57
prerequisite-patch-id: 05955431fa785aabe4c11545fdbce46aff5c3deb
prerequisite-patch-id: 4b212323a81b84bebacdeab2bda9f3efff768542
prerequisite-patch-id: 38106d6e8e5c6bcabed45f2a469ba2609ef8a904
prerequisite-patch-id: 482714ab5f307400a641012270afe5e6a392245c
prerequisite-patch-id: 70739c3de04e8d66181af4850973a778de614385
prerequisite-patch-id: 464301961e7060a9d80879881114b76df3314d5c
prerequisite-patch-id: 9096c39f5006697843fc26c1e32735f5bbc65da8
prerequisite-patch-id: 240bac4d775f14296009b6e8f41dc7fee540724a
prerequisite-patch-id: 797bca2dd99a05e6886436a3eadf09037c19f174
prerequisite-patch-id: 0f37a06624e40cc1ea41c9f9dcc4097e98f0bc38
prerequisite-patch-id: e238c0b3d0889467b98693cd01db27331d1dad1b
prerequisite-patch-id: 8fdcafd9def3b02af3a8df411ea6b2372b8ac0fb
prerequisite-patch-id: 470061e10a39b26c52d53cce5c65a2295feefbd2
prerequisite-patch-id: 6aa5474a3378080a6536d46a3616833df711e65c
prerequisite-patch-id: c8247c4fb50de660e145ff4b1bdb586d23cc9c59
prerequisite-patch-id: 7fdbe491552bcc0b718f3d82418a49bc3b225f79
prerequisite-patch-id: 1f26481841f7d528c236a07c988c6410f4b1ec1e
prerequisite-patch-id: 9a4c598e9efeedce6f577cba794a5f3f6762c0c0
prerequisite-patch-id: cc12fbcd08457f67b9f0a947088fe69d4b593e5c
prerequisite-patch-id: 736edff89d49035031cbd647fa99ed57e6e4f71e
prerequisite-patch-id: d6e0c13f594235607d36a8d7cdf7390e4530dfdf
prerequisite-patch-id: edbcbb20b76e5c64eb0d9c3971101c7e67aed63f
prerequisite-patch-id: 6381b67d4b369d5f6ab111446e5082f179c906c8
prerequisite-patch-id: 7744b2dd228f3963c73acbf4dad19884ca4ab819
prerequisite-patch-id: 77fd89d1fcc9cb2d08c72f13c76c1c1b5bf09f0d
prerequisite-patch-id: 5721541afe5a74e0cab98717a0b684f24dfb0bd9
prerequisite-patch-id: 16c506e2b7929ed0f63484be8af3e46d83b7e9c1
prerequisite-patch-id: 8a2c2e203e13fdb52cd2249e9e966ad89834f468
prerequisite-patch-id: 134efcd91e8eddb574dd7ca84fbf97c7dc55dab3
prerequisite-patch-id: 0b80209b680bc0da99f29a088b63ad529390475f
prerequisite-patch-id: c206070aeaea4969fb718a1eab2a672eb6887be3
prerequisite-patch-id: 06e9164d837f5fe0fed7f53a6520eb119ad9c07d
prerequisite-patch-id: c5cd707027c858c8c1360fca569036fd0e98d7c8
prerequisite-patch-id: 561ffda841ebf652dd4f0d6e59dffcc5b26aed3f
prerequisite-patch-id: f96dc76e70647bd2e4097b36fae74ecd2b4ef706
prerequisite-patch-id: a31940d97c85bb1126e4d5e613f73a0d4e6e3ce3
prerequisite-patch-id: 204940d7d89e985068e5ab6cbd0c9753d5e6cbb6
prerequisite-patch-id: b9a0811fa8aa30c6bb67b3e6d76e2e0d73e5e300
prerequisite-patch-id: 3b683f608d01c23bcde0c179cfdc8f83ba430f9d
prerequisite-patch-id: 9c7ad92ccae90d137e22c6f5dd2df6ba5006b10a
prerequisite-patch-id: 07256b1e50c1a9ffcad34724bd2a0e9c8fc2dec1
prerequisite-patch-id: e48b0932283f2e81e5226b1e9eaeff4d25200aa9
prerequisite-patch-id: bf53daf969eddd302c084b2f77c707005fd6226a
prerequisite-patch-id: 3aaeaf0c560dd750c0000f9871b461c348060fb8
prerequisite-patch-id: fb09c518a1e1eab86bd0e3dc9337d01abfb3aede
prerequisite-patch-id: a6d38e15437ed0e19ca8de6d7ea8bec9f403a347
prerequisite-patch-id: 0582bad0ad1f76d7f3bb32ff9e1b986708fe92ab
prerequisite-patch-id: 8c93bd940ae761f1ee27b3514c751a6b67fe648c
prerequisite-patch-id: 547a83c461648121d964e0d677271ffae513ded0
prerequisite-patch-id: 93f020e5ace6a0034683807ab1acbaacd14c6c49
prerequisite-patch-id: 8d871c380f84927be637e51dbd79298030a26211
prerequisite-patch-id: bf4084d999bb48633f9b313fd5c1611a7f6880e0
prerequisite-patch-id: 5e105f911cecdb68d91b3b0e698351366af8c0ea
prerequisite-patch-id: 428685a07eca306ff9b7804835d92a414651182c
prerequisite-patch-id: 0bc436f66c4256680592ec5e11c3bca9e6735430
prerequisite-patch-id: 129c52d7ee4eba0666bcd088c85292a2230e714f
prerequisite-patch-id: f42112e78fb5483035525aff61cc06a7dfd16e92
prerequisite-patch-id: 5dee96fef77d3ad04e7b8fb96f7f75d6d02cd287
prerequisite-patch-id: d36b9670d2734ece43529aa7b502eb5d142cd6b9
prerequisite-patch-id: e6cc80f307552a886e39113007dc62b326f32adf
prerequisite-patch-id: ef3fa2f68f986c7ec54e9eca0446e30ee72c847e
prerequisite-patch-id: 4e9255e48ae5452b35e058f149e77745c04fc436
prerequisite-patch-id: 1054691ce867cd6085bde390306e8df1cdc61e48
prerequisite-patch-id: f544cb093aaa2aa36783b05ea1c09fae389bf6bf
prerequisite-patch-id: a0002a2545cbc48285dbea6f636cca51c7886560
prerequisite-patch-id: dfe2ed731d951b076a5896df61e08c604d1d9efb
prerequisite-patch-id: 177b76db09d5e96ff0191e54d62f969c62239d43
prerequisite-patch-id: 392ee4da803f87deb0175842281dc404d65a2ee4
prerequisite-patch-id: a1a7038d4d35ed6b6352d2300c9c4fe8cd7d4c3e
prerequisite-patch-id: e63d8db9db9124fb8ad50c384f7468980ba25b47
prerequisite-patch-id: 878f0ef3ffaabbc15d2ee4ee0564347f82926a8d
prerequisite-patch-id: e8f134c6370d435f1716cfe9647d965ae7a4b1a9
prerequisite-patch-id: 7470f65f04ba4451f50e6c5f18ec14b51a858d01
prerequisite-patch-id: 20a28e6b1d370ba73029f263f6fa9e9a8d1160c1
prerequisite-patch-id: 16ccc436c7c92fb9e41dd9634d211576e4190337
prerequisite-patch-id: be1b5a39649b32ab1361c95d1b4736cf0074179d
prerequisite-patch-id: 6ebca863c5453ecd1b9023646a229215ebd13452
prerequisite-patch-id: c6a0cd51aa6890d7ba6abbc6f08519a946ecbb0e
prerequisite-patch-id: 1cbcafd9adf73b1664bf416a983b64781ccb3de1
prerequisite-patch-id: 5beac63517a1c0b8361e48cdb76031353571f899
prerequisite-patch-id: a28e0e677e8e70bde296b9eaad861da05f3a7572
prerequisite-patch-id: dbb7feae5390a6aec98ab0618a477983d217882f
prerequisite-patch-id: faba2d31c61942f6f3ded0d4f6ed20ff52ebe865
prerequisite-patch-id: e9c4b4b08a2f4e9bfa08fba2c96f5acb2ff1361c
prerequisite-patch-id: f95e278262ce40c3c304c3b0b97cdac02ab6cdc1
prerequisite-patch-id: 015cece7899c9b8af24dd542ceca65dafa2e6d4b
prerequisite-patch-id: d57c54b60fd3fd151e7c3318df13cf2901c042a8
prerequisite-patch-id: 9a48f08769b01f60fa369881c0e1c0f4f5a62601
prerequisite-patch-id: 45d3527827fb17fb8946943ebe29fe61285ff8fc
prerequisite-patch-id: a78104964358350ebb7ba4071d51b857a563b389
prerequisite-patch-id: 4c1247c66fa368185d6c5f1b91136cace31d2996
prerequisite-patch-id: ee23d06d8d676221dedefd0beeace4b2249f6203
prerequisite-patch-id: 76f871743dd063789d1ba543131205072da2e514
prerequisite-patch-id: 9f83e1a4b61a58e28055e02a3ea5f0d936c4a272
prerequisite-patch-id: 26a603cc8e14ff53e47cd23b88f380129b84a687
prerequisite-patch-id: 6f2ad843478baf980135f9f0996d0dbdfb2fe260
prerequisite-patch-id: db2c8aae4743505ad5a36fd6586e651206406a58
prerequisite-patch-id: 217b648e20131c63182a317e8aa963c3440e9956
prerequisite-patch-id: 02a38f9e6b58d115e7b1310933e72a6a718c8002
prerequisite-patch-id: 8bbedde3db4944f76e546a085dfc53937e733b0a
prerequisite-patch-id: 27cd4a8b3b7daa02fa2aa549ed2c584ac58b118d
prerequisite-patch-id: 6796a96b4cc332e170c9893515351a133bf3cbd9
prerequisite-patch-id: 028b42964bbcdb390f77c3fec97db30f42b29478
prerequisite-patch-id: c5d78227865719237dcb0356811008a5fa8c8a04
prerequisite-patch-id: 12e290b368ffbf85afcdbc66b5eeba744d015814
prerequisite-patch-id: d2a58d75b6c38a03da5a74c67195f6ed17840d29
prerequisite-patch-id: 4814320bf2499370e3ea6fb3bb6899239c3ae6ee
prerequisite-patch-id: 956a1c74c9772838f4b1a46baa99375bc594e51b
prerequisite-patch-id: b667030ab4aef0d15c68aac6ca1de8b9fef4eb19
prerequisite-patch-id: 9f9f39201b649d16cbe75da5e073fd5a9d12f97e
prerequisite-patch-id: f669c71c4852e5ee6d46a20c3f3386f19df5d07a
prerequisite-patch-id: 8122fd0b90e20029a339833b1a055da7dedfa21a
prerequisite-patch-id: 94584e23cc9f1e37bbc3c54ac950d1ea76f5e900
prerequisite-patch-id: 184fcb20369b70452f1b9dbb9973f8870b2595ce
prerequisite-patch-id: 6499fe37c121b9843b6d1988cfb1f11ef1193939
prerequisite-patch-id: 83407b3f6fb4d24f9947cdbcef079744bab36da8
prerequisite-patch-id: ba131ace8fbc158e1ab7b5c1854eb80fafb8cefe
prerequisite-patch-id: 9706095b8330b04e91cbc43064cc3e769807840e
prerequisite-patch-id: 2e8d8005aca3e5d66768cf667d1261762609c61f
prerequisite-patch-id: 95747be36e38ae854fd4fd65f23194c2ec60eb87
prerequisite-patch-id: d389d08e983165dfb1fef9e7cbe38481efd29ccf
prerequisite-patch-id: 66a0804e05983681af77fb26a0ce409ce050b733
prerequisite-patch-id: 82caea0441d0954e3e159de8708e24ca83514c1e
prerequisite-patch-id: a966347d564354f512f71a875be7bd9d610fb4e6
prerequisite-patch-id: bd318b9b11b1e4568986bba81063269db42fcd4e
prerequisite-patch-id: ec228f3dfab23d4d166023d327f0efe271fa20f1
prerequisite-patch-id: 33d563137eaea059421d7c800a92296a8b670ee6
prerequisite-patch-id: 597038c4efb635d3afa6882f7b380816639926dc
prerequisite-patch-id: e50ae62c7af2f3c014bbd424f9dc6a916abfbb8e
prerequisite-patch-id: c229274d1cd5f8ed8b7429560ce4cd7ad788af65
prerequisite-patch-id: 263f50ff048ac6964c4af48104123f0a6f55cb95
prerequisite-patch-id: a514d6fa23dd6a2e4001d89715342155849e0dfc
prerequisite-patch-id: 325a0dfe5940ee861ad1729a305ba3d13d61bb85
prerequisite-patch-id: 2b0f90f5f5ad85b7fab1ee2340b6fa88255800b3
prerequisite-patch-id: 23d1e2410c7f933f6b2f467378c11e7d66c7a653
prerequisite-patch-id: de4ea7504ff38ab882b4e5e3087116246d91465a
prerequisite-patch-id: 42d09d8fca07831b7eb57909e11a5f47c1dcad9d
prerequisite-patch-id: 839d672c34031518dc716a7d5b2f36c174c1a19d
prerequisite-patch-id: ac6cb5491164b907cd0b4802a06568d2a8671017
prerequisite-patch-id: 9da135c032972d11f7682f3c5e3f695741ea8fbd
prerequisite-patch-id: ef7989acb42b3da2c340634ee07895770d26b88e
prerequisite-patch-id: 221b01cd4f38453080f721f4f07e0fb5e1108ab9
prerequisite-patch-id: 93c27c637a45114ee87fbe02beec8475da9e3592
prerequisite-patch-id: 16a07eb39ffcb7fecc9de389fbce66455bd8815e
prerequisite-patch-id: b05d09d133e8131d600fe9c087703327633372aa
prerequisite-patch-id: 649e822307b5adb031dad10dc38739155bf5ae27
prerequisite-patch-id: 0c87eb233edb1362d249f4828486d1526e33afa3
prerequisite-patch-id: 2b62e27c777741fcc8c28f61ea9cd48fb99e894f
prerequisite-patch-id: 063f7ffd5ff936f8493205d5aefea1421d52a8ca
prerequisite-patch-id: 622cbebc7a82fb9789506c31329d9c9f4fbabe95
prerequisite-patch-id: 7bef9850ce8d1cd904a32f18c2202a8c8319091b
prerequisite-patch-id: 3b454a5ddafb74a01e56515d3c22da496d2a1626
prerequisite-patch-id: 6269a9d9e5e76fbc034aa68dafd8e159912bbb2b
prerequisite-patch-id: 77e4d852c6ff934e64cfc67e9ae350e26a83008a
prerequisite-patch-id: 0d682ba3d1fd449326b1fb78b8a2f26f4cc695e1
prerequisite-patch-id: 4a02b8ff27880d5e182b5b0a62949f1861f7b396
prerequisite-patch-id: 2a0cc98bcf98efae96bc66f6d008ffdb85242952
prerequisite-patch-id: 5a62132a7f9889af3c45030163cf0ca5e96e24e9
prerequisite-patch-id: f63e64247a3106ce799c326608dc92e7a625bc84
prerequisite-patch-id: 320967154285a6b2bee8fe8a5687a84712f2cff9
prerequisite-patch-id: dee3e1bb39bb08e09bfa27f86cbe042e23f10d04
prerequisite-patch-id: 340e81de5468a8af063674aeae405b184315e886
prerequisite-patch-id: 8cf7228cca56823149287eb677441f2b831d7127
prerequisite-patch-id: ff8fa83584b7025c9d55880e81be8e612e5190ed
prerequisite-patch-id: 3338fcba95ed51c00ffbf601093428915f89ecb4
prerequisite-patch-id: b735a0ba361b3dc3dbe366649535887901518f85
prerequisite-patch-id: 46d3971d3bfbc67438ffce11be263981ae9b4621
prerequisite-patch-id: cba3717d29ab9acfef78f7e70269d8deffc2b91b
prerequisite-patch-id: 238d14ef175c0368e0c16f1d2ef9a5ec2d24efca
prerequisite-patch-id: 1d51aa1c1e3a82251d203de985be62a0b9402752
prerequisite-patch-id: d9dc5987e2ce1d8d3d45227ba89cc1bb688fd312
prerequisite-patch-id: be97255da5e7c9f3bc824785fcd7d58863ed821b
prerequisite-patch-id: 9d47fce0cc920022068265c72b9d72f02c8f75c3
prerequisite-patch-id: 0159d32f88bfd90eb4ff1eec43640c2c5482a4f9
prerequisite-patch-id: 2500f00e09cde491099d34567ca7e356d96a0b64
prerequisite-patch-id: 167fba505b6a0791ba4eea4de37ab8509c5f53b3
prerequisite-patch-id: 3e9769087da4ee6b1557eb5e1cbc3e8527520701
prerequisite-patch-id: aedc29d90774552741df4ff3c77a234397246f2c
prerequisite-patch-id: 40f53217c453e002092469a32b43d317d77848d6
prerequisite-patch-id: a7c13980dbc2933e77706296a18a607e02aaf39b
prerequisite-patch-id: 652ffa323a151f3d116b02b5b342cba239cd88ac
prerequisite-patch-id: db6a4954d8ca87b0f7437e4c35c20be142f49bd7
prerequisite-patch-id: 5e4d4bf7ffcbc391bd8e473e347d2ad4ce70dec9
prerequisite-patch-id: be894f7c7db836724d92ff46d1cf7772899f99a0
prerequisite-patch-id: 7f8f6c49ef0e526c4920744a61132f798dcabc41
prerequisite-patch-id: db4b76df1c799482628afca46efef0fa687c546a
prerequisite-patch-id: 9a2d794ab564ad0cd7aad5c8551fc2ffae9e5db4
prerequisite-patch-id: 017c8c510a7e683119f8f720c9c13a111b9de9a5
prerequisite-patch-id: b5dd7d30ca7d567e6877e0f6ae6b942abcafbf4b
prerequisite-patch-id: a9a37c8beaebab4207cab2447b30e2b559d76e49
prerequisite-patch-id: 7a11e631dd100776319d05bc31d5dca4c90b686d
prerequisite-patch-id: 4c84745aee8ba2835a8b425ca090e3ec1ad7205c
prerequisite-patch-id: eace61f02ecbb0b5802b342f34ca5a331421edfe
prerequisite-patch-id: 955131799e4b4b8fc5e06de951875c61c8e06883
prerequisite-patch-id: c0255702fd789d06f0f0096c949dca551956df16
prerequisite-patch-id: 03d030fdb65c756f6870a639a2f19d9b2bd7884b
prerequisite-patch-id: 44686e39403fd7624d1b023f80170123c6cc6aa5
prerequisite-patch-id: b6c23623df08ac834bc1b5f172eede03543822a2
prerequisite-patch-id: c4a56f193a7df3b4da4057fc3376411363403f24
prerequisite-patch-id: 26a2355cd6f9d9fcb120c97b07fce4c7b41f4658
prerequisite-patch-id: f2c32e18e50c3dc1c41cb17173b8633d049f66da
prerequisite-patch-id: 7c0686a24cd8dcc8431dd5922d76dad9bcb2788a
prerequisite-patch-id: d134f3f1cf36457db602408790e279b102362dc4
prerequisite-patch-id: