[Bps-public-commit] SD branch, debbugs, updated. 0.74-53-g60b1b2a

Christine Spang spang at bestpractical.com
Sat Aug 7 00:29:00 EDT 2010


The branch, debbugs has been updated
  discards  ff76bd5055038b764a4a38c238e8d895fd714f92 (commit)
  discards  72f64d20a5cbfa44b8e48a1c8e5b3f8c5efdc1f3 (commit)
  discards  4c905b151500571b38945d2d3e44a944ee31627c (commit)
  discards  f582f341ada6b4af86adab3e5d631e0dcc2807a2 (commit)
       via  60b1b2a011b139fb78b798a97993e8b254b8ce63 (commit)
       via  4b923cb34c2578f837d995847897d38bd12607e3 (commit)
       via  14dd37ebfabd3c973d83b119fdc05b7ee80f036a (commit)
       via  1cbe1ac3cf67225d1f64c2fd9d781bf641e30cd4 (commit)
       via  3f84da7dc72997a80a9428f0f716892dc7a2c12d (commit)
       via  1311d4ed8aaccfcebcebee31bb9e1bcbdbf12417 (commit)
       via  5a9fdaef1630b31d67b3cbab16637e24ddb3ff1c (commit)
       via  f2f887c4a0330dd903d2f299af3dd40ef76d960e (commit)
       via  00a04f9b894b34d52be2f18e37e30f28b7d9fb2c (commit)
       via  354db4babff7b855790e213d097fb1884ccbac56 (commit)
       via  efaf967772189b44bb4a82141ef2190f0cd67ccc (commit)
       via  62b3400cbd304b2822d00e6b7a62f24f8c536fdb (commit)
       via  e30b0597a3be2b23c51aa75b18549f1181b7618c (commit)
       via  f43ff3c0023831a68d3ca3845d5fbc0bbda6061c (commit)
       via  e3ad8f6a9d2b60a27af7decac8c1465b8b024b88 (commit)
       via  33e2f669d0ed5ead1e3f68cdd8cc54a6ed100967 (commit)
       via  f141297bae761d030ab21eee3a755aa9d6b6c0e8 (commit)
       via  925869ba6c0b8997effa043634c747dbe33443d3 (commit)
       via  cc931ee44bd1128a1f97d0060cf6305377d85771 (commit)
       via  40a0a98ea7f523f60f16324d73324f06f52135c1 (commit)
       via  d77ab26d82d0a3ff2dfe772a75a0bb903cc3b48f (commit)
       via  6506454146dba16f9339ef75cca3658b11264bec (commit)
       via  f081ec0357efbeaed4cec2b2ae656c08b93c6070 (commit)
       via  c2f4aed1a60fb0657eeb08fb23c5bd11b6742fa5 (commit)
       via  344b0841bd3c6802bea32ff2903b7c76ce82ca67 (commit)
       via  cf53960a8088887326bc822dc83769fa01aca3bf (commit)
       via  9eee276401ecd84f6f3b3e9a7638fbffb492a0da (commit)
       via  d6d404987ea0d309beba2c39b7185d48b89a7219 (commit)
       via  2f5eb9abc97bfe17567e8eec347f0e55584fe8a8 (commit)
       via  6ec433d0d422c2787602d517f93bd768586419c0 (commit)
       via  a815d197a452b0334ac99b38634cdc11cfe184a2 (commit)
       via  a035b4c1e1709476ba4eb840ad8e9c42effa680c (commit)
       via  3a41d9c71c4103136afb58e33fc2d26f3ab701d3 (commit)
       via  1e2cfc9d467365125964c2d40d839df6f3c6b79a (commit)
       via  fc26ee6b21f617cac67549717b792065c64f3601 (commit)
       via  8ab4f3c558c2a7e5bbcbdce88da911bb17d23cc8 (commit)
       via  92f4f8ea49f2367e1dd3948d2d62874f888ae790 (commit)
       via  dd0107f736fc025bdc86ee1627ee51cb6e92a6cd (commit)
       via  d0b3d1ca5f88d3231b7fc395bccf7d9eeac7bd54 (commit)
       via  14b4daf54754968fdd0d918b1a164e45f344bdb8 (commit)
       via  7aa24740e2aab14219b48e17b6f60cedd3db319b (commit)
       via  6f9cc6a9c4cdf1ac37f53ff5ec9c3fec4d2343c9 (commit)
       via  e47c982c87a836762c6fee29864f8c4e71a32bbf (commit)
       via  127b6c462b05f8fefff7c9a7be2ac9e17e410422 (commit)
       via  b8b7de9cd8bb3d535acb64a60c83b0e0f35bfa6b (commit)
       via  657480943012211ac0d22e22480746eaf8718199 (commit)
       via  df20d4c354c536d0f0dbfc42b16585715f82f7e5 (commit)
       via  f6382766737c7d96ec7c6c286a94b9bbe8d90ab0 (commit)
       via  21b642339593273e7be3ab9b6eb9ba429f27ba0e (commit)
       via  e952ce11ccb158108ff9ae32544d1964b9f5329e (commit)
       via  933ae5a5dd84fc324f4a430576fe2af22e0d81f8 (commit)
       via  5959c66f0e956a5e1784baa184beec5aaa9b5a3f (commit)
       via  ac0f5019a971e18fab04b3b190e357af097b4752 (commit)
       via  734062f1a8daafbefe9452fabfca39f8fde99e0c (commit)
       via  13e6fa7503911fc897bbed2194e08d1313a9528b (commit)
       via  952e31e8e441b6ec38f00ed4a694f8208802d4f4 (commit)
       via  d9c7be22a9c07e156be68c73bdd301c6753adbc7 (commit)
       via  7afed64ed38eec5cee98567f4b879550574b6790 (commit)
       via  16d6a203b56c6e95ba22c03841c08def34eb84b8 (commit)
       via  0cf0f4946332eed4c8d275930826b7027c07464e (commit)
       via  d673e024d37c1e6f157bd60dee313d7ea4674025 (commit)
       via  03a82b8fe04a8318966994fe756cc619e931d393 (commit)
       via  c6e4a12bbf134cd814bd170e429106793dc128b9 (commit)
       via  5c9f0476c78d97554325d4264fada915d05a6026 (commit)
       via  4704b26b53e46be83128098204dba771b7bb2f0b (commit)
       via  069619d34ffce7500e6679ba8a85a7175f3a6198 (commit)
       via  2747ad9f6e2a1464e4f9c0e829d93ffcdd847f38 (commit)
       via  ec5c78d9b2b4f0e0aff59d62059a07d09241eccc (commit)
       via  8a73b7eee07ad9d8ea44273960a67cebfdbe6e93 (commit)
       via  dc2c41ce0117d5c7e1d249d0a3eaa963d41f8815 (commit)
       via  db3e5c97b37142c5f6d6a6a52d4263a89d353663 (commit)
       via  47ea794bfa20efa5df16b3a6b367f2e2930ca867 (commit)
       via  56847fb52dd7519f379cec161b64959dbe2018d9 (commit)
       via  95ef7bbffb7163d72a1ba851410383d6d592cd1e (commit)
       via  ea470c12b37b882dc27f04d716b10edd1eafb4f8 (commit)
       via  6916fc9aca20b6b6e7015322938fe36356695447 (commit)
       via  0f1546880cd709a57c1ce8a3b37ce84796c31e90 (commit)
       via  6f6d231fc7adb368c36b04ce9312e4cf0bf97671 (commit)
       via  0a6b5225a76a875c198b4829db443e91c9b3f5eb (commit)
       via  fa39770485fe48ef3d8c22ec0a46ce93de4eb4ce (commit)
       via  04b6eaa47d1c6b8cad57b6681a934f41b2f2ccbc (commit)
       via  99a438df879476209cb732004e8664a3d41f63a1 (commit)
       via  93b1d22638b8852f858e8b9787ce734b0fe1d9e0 (commit)
       via  ad32aa51302cc200ae4910fd0c161ca436f92359 (commit)
       via  bd07bb5f13e50f36eff1b06154da26870ae35bc5 (commit)
       via  8e0432d8059e90445b41673c1951c904a7c4c107 (commit)
       via  aaa76462ea4362fe9dcb76d5099853f8fd1104a0 (commit)
       via  01245b709ebead68501f83d41ac05d960f1603d3 (commit)
       via  77593a769d0616b40da7003e29ea8daad9462197 (commit)
       via  c4d4212edaa19f2543246d5814cb5349c9f32394 (commit)
       via  288526b4433e717974cbf4386b47ec656335e0f1 (commit)
       via  4f658f5a30e4922ba2c42e01b642763b01a12fa1 (commit)
       via  e0c6bf70a5d617f549db67c51b158962d89eb0bd (commit)
       via  b3bf66eadbcf68beee54b68a0dceb5e13d2ccf5f (commit)
       via  ac59d47435352183a8e7d6606f50677665b4d7f6 (commit)
       via  0d27c86dee4085b8340211f957ee67631e53b0e9 (commit)
       via  9a2896ec0243179d0c4c4a91e74b484eee25a5db (commit)
       via  642968b1136e4945ccede9ce64d90a84470cd611 (commit)
       via  b34d29e3257a400b44686ea9c78eaccf91161e41 (commit)
       via  300ef67c93bc858c077d96c35950e9255cc6e405 (commit)
       via  304feb85bddd7dc0ac19bd6e24a0a27273ece504 (commit)
       via  6e6411f71b746d46c5af7d5062bfd225cf876d86 (commit)
       via  2b7c577ab4c96c291860ba001b075d823beb5a43 (commit)
       via  eaec8a43e63e5dc9c26637059dd778a533e46050 (commit)
       via  4b7a0908609f51aba6b57625fdb174a0576901f1 (commit)
       via  4769f5aef694ead6018e328ba48e24b2606be132 (commit)
       via  b3af3f07bce9a058fce3ceba4c2f3f8a0500f9ad (commit)
       via  a24bafedc14268fcdc3a1f62f4bf8b4f9962fb98 (commit)
       via  d3bb97004d18544db272f7e40137fe94ea7eb2d9 (commit)
       via  fd9973cf52c27d7aaf806f7924e271fcbcdf7000 (commit)
       via  b4a3a4725682e3a11f70eeb6c80aa40bc4d12788 (commit)
       via  5ca458f9445831b4d7a2569742b5720fab6757c2 (commit)
       via  e5d18062eeeaa00aaab8b06a35ee2302fedc26d6 (commit)
       via  209e982ebdb2ab6283074007d39f546ac9e28827 (commit)
       via  de37c2b45a9f9877b65906e93c0cf2defc404360 (commit)
       via  f02bcca6ccc39d9355b277cead100da74709f0e9 (commit)
       via  006f918514d6241f1e06b171dc933d346fc90c97 (commit)
       via  50c2fbabc83196882adf4a5eb722ac78e6f222fc (commit)
       via  bf7008a0599a9ba3afc91d2f59b2818cdc47e02a (commit)
       via  69509b20dfd41a3d42aa7223002b2fe03cbf2076 (commit)
       via  3b1959ddb2f0cfdba6fde5dbdc996cd4cd58454e (commit)
       via  03af7c80233cbac7f11a8fa3252afb6c67a80dbc (commit)
       via  50e75ff3b8eb57f55ecb263134258ed1efc6fab1 (commit)
       via  74a4b300904e6defe1ae2ac419d05cc9855cad5b (commit)
       via  32a70545d98457086757575596a4025816600746 (commit)
       via  64a7d9703c5c65b18a8fc3d95996f3b11fac961d (commit)
       via  18bcee482e3ba3c08a1a27186656bc1038d52ab9 (commit)
       via  c9661c0249206a6d001bb7c956add99dcaa223e9 (commit)
       via  954c863776b34060c20cf191e09e671e2a8e94a6 (commit)
       via  b3cc86338aa96d7e5d5728f1df084f143923db07 (commit)
       via  e69f08d6d1b653390e9d7cd1947bb9a9cb6fedca (commit)
       via  696f19491e5a557b39d98e1d773f53716914d8ec (commit)
       via  67a73323e34a9015ead1445fe09b5cbe28203978 (commit)
       via  08e358b1250973ac61baf99e3fef44a1f976f1e6 (commit)
       via  97ac71441568c508b5f67aee2a61b82db23fd9d8 (commit)
       via  2ac5ef9eb36ae10f9f4ce8599206ae193c29db14 (commit)
       via  6357a0f6e3b2bed58fa5378c10067cca6f56fd67 (commit)
       via  967157c51186cdd0d93e05ccc00c8fa33926a8d0 (commit)
       via  7aa500791846dd7be650871c952c6518e344752b (commit)
       via  1757aee005519591008033812ab5a45b99c34de7 (commit)
       via  d83c23dd2cabeca9bdccaf0391cf5e8b86c770ec (commit)
       via  e58130de8bf95ebdbcca3a690052d7ec67a7fc5b (commit)
       via  a2d60c44c3c42dd55dcf3bafd18799db22246bf9 (commit)
       via  e26cabb4039eabad2e9dce21cb706ae71764b1b6 (commit)
       via  e994577f7dc73c775abbcadf2fd87d798022114b (commit)
       via  a3dcdf23a1f5bf05d2a42705929084e1ef109d49 (commit)
       via  64fd08c2dea0819a30179a168ceebb8f19a4625e (commit)
       via  fce493ca7ac6129493ea3a38ebece5233f14423e (commit)
       via  03d81ccb794e7ba05ddf3570ffdb1f3d9ef94d5f (commit)
       via  461c879eb045b95b18210e4367b0b402aaf3699a (commit)
       via  c02ca2731bbf1c9dd0626791cafa6089d0e79294 (commit)
       via  23eb7285417f73c8d5d22a9b9d60e32c19c3e42c (commit)
       via  5b1036fa4b4535d62f780860e107d66a01ad13a5 (commit)
       via  667a6c163b6c2c3f3c0ca208f3e6be93d8537ac2 (commit)
       via  47fa33139a05c90ae5dc646afe8e34eb78137c6a (commit)
       via  bcaecc8970596d25b6fd71999d120b092943d48d (commit)
       via  d0f4da82acf88db9c5538fcacd167c190d30c565 (commit)
       via  b182620ae89fedce08fb12151aaeeeb20c3da053 (commit)
       via  3ca1bc96cdb3a204880414dab2dbedc26696202a (commit)
       via  31b9e47939323ed14123ff90d6bb269593a5662d (commit)
       via  a75685711fd27baa0a1c83549c632a571419a6a3 (commit)
       via  d60d970b3b140adfa42e719be86513ac531d382b (commit)
       via  f3c6ac313c3f948bfb5043250ed0ea981cbee945 (commit)
       via  2929b6cba268e349d9d62f9d46db49388e94e8fa (commit)
       via  7a5545a8b8f3e0e1d1d78c62e906e9d7841a80f5 (commit)
       via  28d0ac886eb3937cb8984699b85fd44cef9583e7 (commit)
       via  63979a4ec9204f4cf2adfabededcb78ecb03e0e3 (commit)
       via  03cc191bb8f909bad37beab9e7fb56a7b7d1460b (commit)
       via  05dd4fd5a5b54a122ef83a2b125e103c2e5723b5 (commit)
       via  0d7a4aada69fa9c07ee2bb843deda51a386adff4 (commit)
       via  234e43e269c4e941957007de2c1714eed7f230e3 (commit)
       via  4f04016383d1d36a54757bf2be5dbfa2807f2234 (commit)
       via  2b57ba33170e8356a51d68f042c6f26872636516 (commit)
       via  831f58dca13dff2e2aa54f4ac1c597a7e2534948 (commit)
       via  9b5d23dea497dd81e7744a18c774fe3c15cd4e00 (commit)
       via  715dea1d10d35be32b612bf4ca0f28ce60cfe812 (commit)
       via  4097e064500fc8862b707857ff2f297bcc5b0ab5 (commit)
       via  bf5fc43724512b0f28c5ed7c8a7183a097f11fbe (commit)
       via  d02accac84c588b99422aa602f40e2ee1b6228da (commit)
       via  d15e489bbb0aec5721fa0b50097f42f186f5e636 (commit)
       via  6f19c6323b7ff68fa8780c061e3bb96882307126 (commit)
       via  4b0b745c0c98ef60e78f64183ce4ae5498a85d25 (commit)
       via  52f9716da5eaf8d8f27e2a4ba2c808027efc3289 (commit)
       via  97c35f96635de1e88a7c67a629a9aba7fe1af113 (commit)
       via  fa5c5d6ce51c08eaa50f5c8c806bc956dcf78e86 (commit)
       via  21e30bf244bcacdff7cd83aeaa3ab59b2f2c3c78 (commit)
       via  602082a0b0f68318067d1b5cab69aeaee40eb7d2 (commit)
       via  be1fb10a523b3b04ad3277aebdd25724cc9c163d (commit)
       via  4ea3da43f2dc7dbdb30bdc21cfd6c1124660b867 (commit)
       via  686b9fbfc794cf210ea78ad77261741b63a79afa (commit)
       via  1aeff8d9beb33221174253fca5e11a4d9d0748a8 (commit)
       via  98050315fdbee52f7bdacdce2fe015dd4309142e (commit)
       via  653cbdcbb615a279daf151c926a3f743be986604 (commit)
       via  fab3b2841bee6a0520ce75d1aaa4f29f5bb17edd (commit)
       via  121113ad0a04b919bf546c611dc14206a0562a7e (commit)
       via  ac045920008b57d06ad52a078e027da40e0d1c45 (commit)
       via  ba9e1e4f6f52257db25fed719c90d9a1a98bdb52 (commit)
       via  cc3971743306c56009874ccd751bf0a3f5bdcb7d (commit)
       via  61ea767128fea0ef8f1281f1db1b75ef62011b3b (commit)
       via  2196603acae32970dcf47603afb0bd6630343fd0 (commit)
       via  16b8aabec64ff51006e82beadb6f7bbd524d8e61 (commit)
       via  eba358f0532a8136677306decaf6c51e2c446a21 (commit)
       via  2453aa8913a9651a5c13a9dd3787bc58f16ff4f0 (commit)
       via  84cb81e3a2286cb6c9d9409c355abdeeba153098 (commit)
       via  8262b48c186e1fba806a84b4c987511e224aeed7 (commit)
       via  3d369fa1c0ccc678c54f9f1f9661454e6b722731 (commit)
       via  c84c991f838dc6c4cd0e2c46a6ca9a92cdf03b2d (commit)
       via  233ac8e5ba0061753966f0ee9a9f9d292a63c7d8 (commit)
       via  77ce50e93b87ff3efe9028b3e197b974e2b190cc (commit)
       via  f744573a696e658b08fb7a651c40fb3a207d5737 (commit)
       via  fe241e27b7ef64b2dff0586c6ce287e18537807e (commit)
       via  d5f02b79c73b7f71d4cabdc9210bb37b05494c86 (commit)
       via  cbc820d18f7c39d002950976bb236b7b2ec58991 (commit)
       via  83d39a83be02f6b5a41e2f54c7a4dae15e2ba246 (commit)
       via  a2cdc75db814f41d9730e26fa87249af3a3edbf9 (commit)
       via  9c217b05313e68a14d97998022dc9c3c833e9ccf (commit)
       via  8686622a6d6bcd6079a3c16684d42424c693bb73 (commit)
       via  fd7aeed7984c928f06d1c9e6ab386bf347f03779 (commit)
       via  0cd4e635edc0a5b42412ad4cfdfcd8f5d4696fdc (commit)
       via  8af979ee6f9df5c449bec83a1a2bc1856c33b418 (commit)
       via  d12ea619736ba858799831af439c741a04c1134a (commit)
       via  c60c11f6de4ec36548af8de48be08bfe900454bf (commit)
       via  abf990efc2578eb9715c67e818754f0a743238f9 (commit)
       via  47b999d0e4c971867748dd079bcb11705e029217 (commit)
       via  6ea9d6bb28ee41b9630a175cbfb5015722086393 (commit)
       via  994cbcd76a4c177a572ccf83aeb095d8d4164785 (commit)
       via  dfb47f3098dc47a228620df53398dafa1be87c71 (commit)
       via  d2c018dc60d3c7de12a3684527fda1dd6d13d97f (commit)
       via  d5025c4568b8f683f50d6d894193c3122a0e73b0 (commit)
       via  8092592607b0927aaa31ab96847efbfcbd083936 (commit)
       via  3893c4689a0cb9b2219400a7d790eb37b1bf5812 (commit)
       via  75b907550fcabf9e803ce4459fe17853e040360a (commit)
       via  4e1d982122c0c0fc9a036d2a191f86225ce55d9e (commit)
       via  e0d4f670b42e5bfb2e13a3631af3359977ab4652 (commit)
       via  d3f6758b9c0807b726b1572adc2c319b3be08c91 (commit)
       via  d9f6fd26209c76c3da5dc527301c6ec7b6e60568 (commit)
       via  c92489b0302829cb4efbfb5e8622a01428b7412a (commit)
       via  ce3537f9096e41fbb4e2ca5bcc213e36768d30c7 (commit)
       via  9e2a901b33fe88e94d8ba9b88459bb2281535c9e (commit)
       via  8eefeff3c6b8375045c11d9447008c8ca3c1dfde (commit)
       via  e567c8470a5045b430ecf523cf2abc5a5caf699f (commit)
       via  97fced574f7af4be040fca959f798894ca6eff7e (commit)
       via  8b30d09c3547fef6b04e397154ae69e024a1025f (commit)
       via  3573e587fd426ec74ba100d5a94805cf64bc498e (commit)
       via  b7cf5a3566ac3e58caeee1cded90d702b23cda38 (commit)
       via  0b4d907bbabb068ae3ccb1f612acfb3b484fa96d (commit)
       via  8ac8f7166b748313c669fc52f37cfd97df46ca4b (commit)
       via  02289830494b5e751ff6999bd80d8a679e2afd9b (commit)
       via  8fcb31f9602f8d54efd2af6b25c409e69299d8fc (commit)
       via  2e691b99569c6431bdacc6e8cd2eac553efbfabe (commit)
       via  7753d74636de3681c639debf49edd9c92682f3f8 (commit)
       via  21696337a9ef28e6dd5e2ec519bc2508f25d870b (commit)
       via  7946fb4af3fa2dd230108c66c595a66663d34c9b (commit)
       via  7a993df98b40970525e83ec8f7965fcb7ccbfa6b (commit)
       via  fe48b331e95b28b61916aa0c4fd769b7069ef2a7 (commit)
       via  47780a294cc68c10217ac5a7eaee5f9f47215862 (commit)
       via  4a7bb005ce6e0cd50737a8893cab492f62f52dac (commit)
       via  bc56d697174c1ffb3f6fe8eff71303b7c1a9274a (commit)
       via  81ce3ee562963647e7cb0e893cae2a0c7d57b61d (commit)
       via  426b4ff23b20c434291f9f3e5a18dbb483eb0963 (commit)
       via  c03378a8201dabe73a0f56fda4d705169cd7de28 (commit)
       via  d895e8502b5635a79cd974fb53d2a05d84c0d99f (commit)
       via  a17e63284f41ebe19900943c524612927010d00e (commit)
       via  e9935402d19dc1b9f6b1890b2182b49cc3ef46d5 (commit)
       via  da8b6b77990621edbac8ed91e11841d96b92c82e (commit)
       via  c5fb6bdee1001711f7114d908eff8363ab4f2639 (commit)
       via  d3ff5b53308276a700b6c74b910611c034df9c5e (commit)
       via  d9d5d205e9af1d2a01aa5e3c9dfa619d2f7ce20e (commit)
       via  7cafd88b8c9268c2f1cba4c2fc839176281e94dd (commit)
       via  82861066066ac51d8c947a5c128b5fbe1982ec9e (commit)
       via  f48aca6dea4f753a89528ed122bfb1abda235fc0 (commit)
       via  42e88417114f719ddceb56b07cdd3b5029a33de9 (commit)
       via  72f08d65d88b800bca837c56f0061890f76d7af3 (commit)
       via  be94243d53c94600b8c334de940979a3b4957fbd (commit)
       via  789b06e45e18068cee1ebcdc25f45869a6cb7463 (commit)
       via  d3eca042c433951ec45fe89e893535a5902a6851 (commit)
       via  7300f47adf0fa6c709105a4e6a76e658180c4362 (commit)
       via  3554472eecd44ea3799b23dda09eb438ec81cca0 (commit)
       via  395333503b67d565e0f6611a2a61436b6723fe15 (commit)
       via  dc543e9025bd00ead02987240a4b82f384867bfd (commit)
       via  1bee4fd1068661c8364b1d5293ba62b12c67e161 (commit)
       via  fd8ecfbb884800ac8b8175c3ddbe789d1e277b76 (commit)
       via  0cf13ad324b39026f4273451f9ec93620a55dcca (commit)
       via  a82a51e31aaef6348a2f6fd74b19f1615cff8274 (commit)
       via  15aafc4ae55bb6f8d32455102cf6342953427e17 (commit)
       via  bea95c69603837dc140e34d06773ae33742c7644 (commit)
       via  73763bcf220d16513fb3999110dec5545b89df6f (commit)
       via  12736f2bb1a27fdd5adeab7f3083e5900287e65c (commit)
       via  58868c32e5dc978c6014769c195f87599291247c (commit)
       via  2c7380eb4f254de855a3f0d8aed5eb9ba02dc71c (commit)
       via  bf250814eb24b08b887ea20280c6b107d9610643 (commit)
       via  e0a3e2e43c8134176beb1a4137c00ac1c773c6ad (commit)
       via  355ed5828b3b5da51dd3cf9ee09434f18729a407 (commit)
       via  40080f5ce4697bb4425fdcda2baa1bc286b705ee (commit)
       via  8c01ba88e44b0170a93b2f93f04e529db48ec7fc (commit)
       via  f55c04f93606dab43fd9dc9b99c695c2abbf651e (commit)
       via  bdfa44778b5ca8caf2c831900bff07f3f89f682a (commit)
       via  b579dd8a176e9a787707ec63df888b3c6ae88f38 (commit)
       via  ac30941b6d71769156fdabb3cd1bd315d943d1a5 (commit)
       via  a2bf82f2d000b31c782482b4a0497b3f2b166a63 (commit)
       via  bcac84ef7ac2e31bee5c8f7ed471c9beb986f162 (commit)
       via  f95cff9f028b8b13cc8a67e59e84b7f149ae567a (commit)
       via  eaf67947af885b073cc2c0ba01c1284ecd547ddc (commit)
       via  6929bf3b893c05b960ed9adac0b22b3a4ac1e15c (commit)
       via  c0392e2dccbdccd5595335fd38cb6a747b509fe7 (commit)
       via  669e4c0549d2cc35c6196d12f45ae7d568037ee7 (commit)
       via  fa281533edfd88f1753753ea31de68af0afc4ddf (commit)
       via  aa394a6d833722b9fc1963f770a6d2ef20c3e0fa (commit)
       via  1482d04bb00bef7aa701e0b2f51b778fd6b7232f (commit)
       via  5d717a6df7e92e6b67c50388cb76986563c93aad (commit)
       via  13d4df95de3381dc47574f388fbbece7c2268368 (commit)
       via  afd8976a2037884ec85ca961a2bef5bf8cd268a4 (commit)
       via  e51d29b8e5a112f945b38cb9271e60a13ec81aae (commit)
       via  48c0c57ecb232d64295b12c72b37ae89021e2691 (commit)
       via  1d7d3591a26f025bac6351522956c23de9fc1de9 (commit)
       via  4e5889699b344ed65e99c53ab3e258939e0fbf94 (commit)
       via  27151eac58c0d98ebbf8268e01504722958de342 (commit)
       via  55b19743800b732a01803dedce247a55c2e2f644 (commit)
       via  254abd6f0d9aec10cbc64565d52084a8d7fd2ec7 (commit)
       via  993870d1058ec8e2c6de1512909054302777afaf (commit)
       via  d110bfaaf6a2ebdc4979e7a134d120dd8b36430d (commit)
       via  3cc8437f1890481f7618c4655634ed45f9da4e08 (commit)
       via  ea8458fd1163fd0dd8f39011c27c95dcceeafc84 (commit)
       via  ac31ba362732855f82e87e1dc30e07461a990256 (commit)
       via  90eca29364443088fafa46b48ba7b1d2db0a9d90 (commit)
       via  acb3e33ce6e2d745c59ccc3c0a1f0c0aa4d0123f (commit)
       via  4cffce880542a8f0cd14509a0c942d99be414c26 (commit)
       via  44f9e888e04ec1dc5974525a93b34b07e115ec78 (commit)
       via  a4b0508d1dabcc7b448ffdf51cdc36993adcd423 (commit)
       via  f624fd2a3a59f5462180620c1e54ec5292163549 (commit)
       via  6f9e31d5b9898a1c6d4a23b20cc13ae0f5dfc598 (commit)
       via  48e062210fa330d834263cc99b905f10855b92d8 (commit)
       via  d8cf98d1fceda68f32a5dfbab9fb5a0ba4d60430 (commit)
       via  7ff676c9fe83a16b46f6dfd168482b38ed523776 (commit)
       via  a9e5b5957fe3c4b4526e825201dd2841c375f8e4 (commit)
       via  bf784c9f13886e60175e6dbf81402de3c05cc3f0 (commit)
       via  a9d6b82fdb6b5c0c2573351edeadf85d0ad1d5c4 (commit)
       via  11158d0f00d5c768e0fe05d6d55d92fd2f87c739 (commit)
       via  5e976d07778dae7c95a5fda45804bbb829b105b1 (commit)
       via  b6c8323b9ca392cb3619cb321ddb5275b01c8648 (commit)
       via  0a4e1f2de20a98cbb1e3cadc84be214b3b2eee87 (commit)
       via  1efca95c0c85cb96785ee7ece8155e31b4c76424 (commit)
       via  b33f2f20ac6f7db5d3568d74ed0f6baf435e15c8 (commit)
       via  1c4c703922acdff74cd0f8352b790576311bbcc3 (commit)
       via  4ea89072bfd9576201e13e5aef40c054209e328e (commit)
       via  ddfac2dee4a0152e8d7d61d33fbbf12528ad1ab6 (commit)
       via  0a38d002f7e4b21951e9f1495cae3f9cd6f44533 (commit)
       via  a850853c1c52c294f328c34400a4bd9087dd23d5 (commit)
       via  65a2364e0b9467094d9f244eac7780a0f5c30d13 (commit)
       via  cdcfeed21b4c4cbab735ed2dfa7d5dfe3257d242 (commit)
       via  673beb87b9fdc8f3dd1c7fa18760ddf219031913 (commit)
       via  926bd362ef4ce2a7ec69370cf9eef7736df1729b (commit)
       via  f983de65a7514296782e1a343ac072f03e9ad285 (commit)
       via  1dcc7f59764a7c79f2e01002776b5af0476ba23a (commit)
       via  4c3a92b82188a5f7d9f94131aa1216337ffeff62 (commit)
       via  5027d6850e3e2ddb77b6c8b57a0960101981434a (commit)
       via  d423043e603b2a3c044999f18640dacb5461d235 (commit)
       via  c9fd2b9c190f7bfeefadca2e9fc2e6e7645d29dd (commit)
       via  1d99432f41e5ea8c3074d10eeaec00fccd16d1a6 (commit)
       via  54936539b8f8d16cd248d2714371b01198cc2618 (commit)
       via  bbb5436471d81f84feeb7d859f6ff612e52c458b (commit)
       via  7402ff5643a991375f5f784b5d14957523d8ca5a (commit)
       via  8d949e32df6b7f6b43f6849259354dc345cc958e (commit)
       via  744bf184defdb2c5ba93363d32c5f0ff9cc7be7a (commit)
       via  51734e6c2444b99149bdfd4043167e70f5589fb4 (commit)
       via  f7bab038816a23d8c032408f79ed59350619e2be (commit)
       via  0d2b273968b51c88e0653b795372644f410a7c60 (commit)
       via  5c7f66ab8426ad14118ef3f3689688815daaa22c (commit)
       via  4f13565efd1d31cf612540c407684d89c4f6aaac (commit)
       via  adb203dde5130a3a6922e3fe804a1d88a9bc00e6 (commit)
       via  5fc301e5745544bef838addc9422566e09808c09 (commit)
       via  d6b64c3c789bd43abc190fdfbb99857a5d8299e4 (commit)
       via  5792d21821ef37c44eda97360bca16fb6190b758 (commit)
       via  cf1ed5fb76848f80dcf232e15b147cefb7659ffb (commit)
       via  3942ad3afb4e724c552c8657fcc27dbfd11086c2 (commit)
       via  aad100ca4c96e0c91a6370f2fd34aa4ddf822b97 (commit)
       via  49037ac8fab216783e01d8a52146e7c71170ee77 (commit)
       via  6797ae93e8b1777acfaef1bc269b18f458ebe5a8 (commit)
       via  848ae5fd396868fd6c5cf47a78dff4a1e165d490 (commit)
       via  127405ff6ba255d0420ad9fc5783e5c0be3dafb6 (commit)
       via  ae4d1d67bcce1679ef251ccc569695d97c195607 (commit)
       via  e177896ba4bc913fc24709767c88f832e7b0ecaf (commit)
       via  5895e512b1e94cbb5b5060e77e4f68cc0780f80f (commit)
       via  1b56582776038fd784f2570e739409cfd002259b (commit)
       via  95eb5eb6b4d2e0a1afb11d0e9c009ef47cb85e0a (commit)
       via  c4c51c48d97ae029048ae7ea48c5e2099c5cfcb5 (commit)
       via  c687bfb6ad8bd9f13e328608c20c2d846cce8941 (commit)
       via  a0f6df34e2cca3e1b4386cf86a1b53006242a376 (commit)
       via  b73e9d019515a7dc3c10b63a28e5d1fa898ebbae (commit)
       via  ba1029e36f1703653ec7733a61d8269461fd8cda (commit)
       via  e9f3a571d13c08f41f5c1094831649c30aca5c66 (commit)
       via  57aca1c12806ad1ce8e1b1a6d65ed8cb6a6c7769 (commit)
       via  bb03d45483d78be88a6a3355b8fa19ab87e0fbea (commit)
       via  21e9cc18777b167ed489a3d0511442ba0b27d452 (commit)
       via  1dc867e58a83547a7210b5de0bd49607730f508a (commit)
       via  0830c1562edb1c49e91ab770bf43a35362b20280 (commit)
       via  ece879a2f8c9842ffe844dae9ae5a5aabc8dcbe7 (commit)
       via  765a8597ee96f9575f6eee3ce55a8cb63a8b550f (commit)
       via  150a45689d1d5e382b17db5cc5e18957168e35c4 (commit)
       via  0a3ab5a227a546875e34efe545629e82659cad21 (commit)
       via  baab715e2a0d850545c29004a42847c0717ffe19 (commit)
       via  3d1019bdcc92e39862ef55042424d115d8243302 (commit)
       via  3136814876d448b703a3ef9b615fe3cc32514c28 (commit)
       via  afa4d9b9e60a45a225b76af876e7c5eeea39e2fe (commit)
       via  c2157afdf83d4d014605ec45a5cf44fe2c784935 (commit)
       via  003086fcb2062b831c6404aa5b107b614899f902 (commit)
       via  6746257d389be543fd4c7f6adcbf2052ac58980a (commit)
       via  11f127b4e2b97bc14f820454345734550494782b (commit)
       via  76cc1896c3f05f5ef9063499a1ef33f614ce0c0e (commit)
       via  47f311075594e3a95b6277edaefb738edae056da (commit)
       via  2d28e2aa641809fb298c52b76a06576f78583dc4 (commit)
       via  5c44257a118604a86b4772a5d26dc6dd21ae8e75 (commit)
       via  831d7fa1857c79b1546da0caeb14755811e85600 (commit)
       via  2534bf35fa5632440c39ac648c0a64aca6f8d504 (commit)
       via  55fb218a884cae6bb997abaac77b504e4c9f0136 (commit)
       via  05972d6cc5a2b74b1afc3e4e7a94282c07cd8e04 (commit)
       via  1c1e1a9094c72a41286956623c513f4aef0bd398 (commit)
       via  9d6a0232273b1752073bccb063296a6d1731253e (commit)
       via  43ddf1d152afa136859fabbdefad67a8d26a3b0a (commit)
       via  1ca629cba73a03b21007bce0c9bae93a09526b87 (commit)
       via  27df700f79af4c2630a92ef696125207cc05f3f8 (commit)
       via  d6da3a5a36ffb438709dca0fa898b57290de2122 (commit)
       via  1214ae98a1ce7ed24124c9ca8fc6899f094e72bd (commit)
       via  bdb68aeffe760120fc63b1322febd2e1cdf69852 (commit)
       via  00a3e26b1b315974f0a8b677e8836f43a4727f3f (commit)
       via  395c8bedb026d86349466e5e385e93242176d9fc (commit)
       via  c074790c16eac9a6cc4b07f2026eb94dde47666d (commit)
       via  6c173fdfcd794d9975263c7f6bb838a5f37a574c (commit)
       via  2877f7df90f21039aec81ac6a0c62519e75f6a9f (commit)
       via  96092d443b526ec8228ca28596d0175fcce96381 (commit)
       via  6190f1553d53c45ab1c523ea394dd747de0b73ff (commit)
       via  d07ad8c51033cd1f2ec6edda537bdb3c788acd1e (commit)
       via  1f3494a2cb6a0c05c57ec372e5a449892c4c8bb5 (commit)
       via  a63f299cdf1d785d4c8e823b69f77651726925c3 (commit)
       via  f16af90bf40b6666e7b5fb240092eaa22528abf9 (commit)
       via  9642bc24a118467a7739edd6455e55bec6d1e4d8 (commit)
       via  296c389728df2b46bdc4789bb4b4ad28ab681353 (commit)
       via  7f3a948407dc9fa682cf95093b015e8e0b984b21 (commit)
       via  52e2d13a80216c7018320af4f6635d89ca5bfcf6 (commit)
       via  dc49334f0e8aa454c6c1559581697435a6dca484 (commit)
       via  07fe33cc2ce5a0c786853a03efd55f8bcaa2524f (commit)
       via  749988985081e806a6fd6dc9efa0e890f7a4aeac (commit)
       via  0801f61c681fab3d045844d42a03675c907f07c1 (commit)
       via  5858689cd4e10898a6725ff03955031dc6074a3e (commit)
       via  c2dde6fd402344a8d8887c8fb8807f0edfbd11b3 (commit)
       via  a9f3e3fa9fa5712012d838e2b92b65cab8c8f253 (commit)
       via  6391328c16946cddd2e05ab12b14a33b05e93178 (commit)
       via  fa5cdd14f6d003e19bff5209d5baec5d33b39462 (commit)
       via  a5a74a1128c51100e738284784bb379f226bf439 (commit)
       via  4d3a17ab3b24b2eb937d65925169701eb5648db2 (commit)
       via  d0a99c3955fd54b78009c9b4e0de16e55f03c6a2 (commit)
       via  11425496351bfe55d6967a37d3dd4df8be2d54e5 (commit)
       via  cc9bc1ebdc53ad1bfd35069570eeb778706de8b4 (commit)
       via  ba7087c86dc432b460b518bff5f07460c9548a3e (commit)
       via  d1961a07c10f425e03d9e0b7d77e51cf399e5eaa (commit)
       via  51a4c8f634892f633fced404cb389f48406cde22 (commit)
       via  6a5853eec7b9eee0ff219cc6e9df0786d37434bd (commit)
       via  1a3e560bbc64b2a0ab8bd808c2f66088146ef60b (commit)
       via  1a02fd13c7570d416a9e76678f0465ef42dbef35 (commit)
       via  d6c20712bc1b318dc952cb96f7185e8f0aeb6fbd (commit)
       via  fc679e773adad13a80006e721dbd1b217e43dec3 (commit)
       via  9448f6b069fffc84772f2db5958f084e03abb38e (commit)
       via  ed6847cfe68a7d1b7fc3692aa0e6350efc0f97ba (commit)
       via  9003c2a45c355db7a75d7a69f7eb84a5fdf8f4fe (commit)
       via  e611e17b537573972897eebc90f6d491bd4cb06e (commit)
       via  81fbc2faa95c996f7798c470fc920305f99fb13e (commit)
       via  78a782f7f925bfdd7da22d80fd69cf532709d0f4 (commit)
       via  1347cbdd10449f65f782596f725e99393eaeb5b9 (commit)
       via  a70eb78982a99bd484d565bbbebb3de3cd757f38 (commit)
       via  e34136b42889036fa472977d52ea35e411c4781b (commit)
       via  fcede13af3a9ef9fc2420b6845cf62e9a6a6da3c (commit)
       via  42fb0953bd03af75b52c4d5935a333e68ca2170a (commit)
       via  523a3cb433fb3629dcc6fa4631575d1a1df9a284 (commit)
       via  d181f47561a42f1883067ad70ffe8c41a97d108e (commit)
       via  9a266ef120c77acbdc5f4c4a1ac269c16973c71e (commit)
       via  969f864ed4c398226db23208f6e2c9f7f7820f7d (commit)
       via  ea3c47248223889c3e6a41910c833921a1863fc1 (commit)
       via  35e12d44978131a7d5b2ce0437998885ae2cce8e (commit)
       via  a382579520082151174f46b17d40a9c6dbe70a44 (commit)
       via  4aa7fafe0993c5b7048f54c0c80144894a1bb6b2 (commit)
       via  7b093f9ad01cbcbb366a8247a16ad5df3400b82f (commit)
       via  2351a4e4ec9748c34eae06c0179f778e99e0ea4f (commit)
       via  9d7f5a16813afcc7b466d8a1191302694da8b82d (commit)
       via  7ae8e2fed0beefa0446e67b667dd3b4b013e4e83 (commit)
       via  f7f249158237b2619ca33ddd79912ae8d883b33c (commit)
       via  5f6334bec5787d812fa77839f55020efb946dff8 (commit)
       via  0c8ab7ddc99b8b90e91b219500d294a5494ff81e (commit)
       via  7f036cc3c8c24cd7107dc4efcf05fc4c318f7481 (commit)
       via  bb1ebf839782436da2b52bab66bfc52298cdf657 (commit)
       via  18ba897548210528cdead4148c79654d1e8d6803 (commit)
       via  4a64311267198f93c54ac387184f7079dd13b0f4 (commit)
       via  66994d51da5c274dd3d34e05235f7fb40c164c50 (commit)
       via  d620eb235e15520bba143fc8d18838f51fc7c837 (commit)
       via  75c1e476fc78cbcae7b27d4415848827c85d93a9 (commit)
       via  066edd63e204470b4c6cd7b6baa501c53e0ada9b (commit)
       via  1f899363a5fa4e3c62fc18cce7ad92fc63bd95af (commit)
       via  020c104f011e1b81ef501c1a5dcbde41a63a6baf (commit)
       via  e88465220ad940de0c354864c915c27efdee265b (commit)
       via  028c814c0a875c788284d16389425172d768d733 (commit)
       via  dbd6b6a49d5ac3cd14b273f0e9cfed47a465df4e (commit)
       via  1e1a24145a29f17e9c237089ad64a5561055f5ca (commit)
       via  f4637d4b612bc11836999418bc0e2cd23f534331 (commit)
       via  0d97770652ce3620cf00d13a7e57a88dd6cb44e7 (commit)
       via  177c2a303a62b91652467a0e04ab4556a3caf47a (commit)
       via  8c943173fa41d952f2592b897ade584e33bd6b8f (commit)
       via  77ed346a2630984c32552672612c7795a6f4f12a (commit)
       via  b8d8e2988d888831dcaee3159fef2cb7159caaa6 (commit)
       via  0be7a99b0f532b63586169a63ac11f429fd88440 (commit)
       via  d99e1ebf1d26756c7a246f4c760ce2c6e9f325a1 (commit)
       via  b8fedc83507ff531fff0d3ac2436e8ba8518fde4 (commit)
       via  685f79afd2b10da910e4e8a08cb7a7bad8f2342f (commit)
       via  9c23280fa6515b37925c47df1c75f9aba4af80a6 (commit)
       via  6135b51a3fcda1d6ed514f7fe370c5a159be9c21 (commit)
       via  d8cff9f05a2b7f9c2881053ee7bbc6009fb92145 (commit)
       via  941b3e7091dfd884dc48ed91941ae08f6a52b600 (commit)
       via  1dcc04ba75b42b9e802c133933d800b9473b9b19 (commit)
       via  3da972c883440fa6d9518a24e18de466271035dd (commit)
       via  160a02568cfb720128010424ffbeb6d96558f38a (commit)
       via  d2db62d588d3e79ce780ca8016b464f5140796e8 (commit)
       via  a58dbab3feff23e506d1c818673a24994e43f85a (commit)
       via  69bb11bdb1f04306f006219a693eb22148f6098b (commit)
       via  5b7e7c24818fc42c3937df6316934c1de4889558 (commit)
       via  397572078a284ccbeec030bf6a7744ed9e6d02ea (commit)
       via  40901580c3fed64bb4f5d3177eea389d1943baef (commit)
       via  a6498dc8e09fefdb57da57fe04f58143eced6f4a (commit)
       via  332aa75eaa856c47443cc4ed478d69258978e5ad (commit)
       via  c7b7b3aa577ca6b3d799255f9ead296219cd0e1e (commit)
       via  66c3c8e5de5de0a0ed3da46349a2d5ca4a055e22 (commit)
       via  42f1d3b756146e090f5785bd169ead859bf5ef8c (commit)
       via  95c22c6a0a7ebdf6647c1283f4ce48de6de72aa0 (commit)
       via  370cb8dfecdec5b04677d3112c12d54849b57cab (commit)
       via  6f1c1449710523b4c0b9641f5073459f639f8b02 (commit)
       via  59eafa1876c313229e3c59716e1d206bb9462d9c (commit)
       via  3223c3a8bab134ac670b0c98b562c2ea2f930f6f (commit)
       via  cc1b71c05390ea8091d407f44b8e432be4268859 (commit)
       via  673bd42bd12b8380a8225cc1fa51b1e58c7120e1 (commit)
       via  a7dee64d991aefd5be002f16c15779749baadd76 (commit)
       via  f1c2afdde488ad70e28fd153b2bc41c826a65309 (commit)
       via  f1da7976bb60d4c14e1b919da96133fb846cf599 (commit)
       via  dc749e3d1fad3b3a35eb4c6558a0425635358ea2 (commit)
       via  2de7ef307fbdeec713e96c268d5692a8f7750530 (commit)
       via  5c51b409f6b21fc525b4b4924c749db15bd8d7e8 (commit)
       via  63da9d7759cfc9248f32ae84c3386982ebcc962e (commit)
       via  606d6d4009f62c711e9a9dfc5c1529ed395be6de (commit)
       via  4d80ee3fb6015f0ba82dd0b6bdfadd437e725767 (commit)
       via  cf810a51f9f5a8e36b4dd0914204f745e65f5b5b (commit)
       via  1dda901b47e06f07be308993bc9dc6d81898ae05 (commit)
       via  89d7d7c6d563a8d2d2da4e16972d811e1e716594 (commit)
       via  67e853964e310f2403bca7ae894e236d3483035c (commit)
       via  068ebe339304d08fe954afca1f1065730aa66c23 (commit)
       via  5462a024150517ae0c239d26e648e87a334057fe (commit)
       via  e5f4c8706a669412acc389be7db1ba89c37df1d9 (commit)
       via  e1a372151b30cd43e3dea800201ab77b2a9dceb5 (commit)
       via  dba8d1252e0643e84ae5d3ca61e2b4271e674b0c (commit)
       via  6a6766e33dda148c38341952f82681e75c5491c2 (commit)
       via  b389c5f4c220881153dd272fd6c4c8d7ad49cb4e (commit)
       via  1b118ca11c996178750be50d18cc08c10f7c3c1a (commit)
       via  eefdc7a9ca270208f9c8620d9563d26738752da4 (commit)
       via  ad4653798da40c764ea3a32df040a5954c17d64d (commit)
       via  86a82700f16e246949167640f3667055784d527f (commit)
       via  93968b078d3ba0133bd0b1501961ee887f8ab4c2 (commit)
       via  49b0cfc661954e0a4a7bd88cdfe92986a3e60894 (commit)
       via  43c34ea75cf682a3d4c0e7f4571c9914fb40b646 (commit)
       via  8a0ba2fd7cad84dc158ef122a20d2e0fae539f3f (commit)
       via  eaeeaf96fc74a6f899a40226648fd5efc644695d (commit)
       via  9cf915dc18b7da4bd76f568dc2f8eece6e1837a5 (commit)
       via  691c5562ad7fe9df4b9c03286e1e2e74665711ec (commit)
       via  0981189b99ef9599b4a16287188e20129e4df78c (commit)
       via  a1bda7e8a3c7cf87d95b97d546da491858af0821 (commit)
       via  8a68a5f9a68b2fce26793b87565e300c5a101c75 (commit)
       via  ba375d4f466053e4aae8e83e7f118244b8dbfd4a (commit)
       via  75768136db2286d854a14694024a7bef8afdd21c (commit)
       via  8dd19f7a85d8ede42185b20c9e0dc7710b1cef75 (commit)
       via  722e63fa42896925dfe5b3dfc8e5f28d1a9dc06c (commit)
       via  bdb4f9b9a55fd0d293aadf85b13f7408215c270d (commit)
       via  c94f96f7447b5b34688befacbe80420b527b5717 (commit)
       via  523b78b28c9a8ccbcd24dee78ac1a8bf2780dfa7 (commit)
       via  9dabd55d3e14d0221a811ffb4bcf4e9391c497b3 (commit)
       via  8cee4d1bfeb4b44f1620bdd09180afaa2b864e69 (commit)
       via  752716b429f8dc62e00036561ebe397f18bc0654 (commit)
       via  63e7985306d48df606e27e65eae9be695e3c0406 (commit)
       via  699dca193171359568731949a3228e0f8f0fa76c (commit)
       via  cec42b7ffb717679385508eed272d4cdf9aa7a15 (commit)
       via  4e47fbe26eaf0eb82b551bfc5233c678e3eda248 (commit)
       via  d542bb5aea0405a16f88f285ac22d5c206dd0ec0 (commit)
       via  4646320c12561521aac9c109c9d2d26b59888e2a (commit)
       via  f45fb8d00015e25c586633d1ded903b562869ebc (commit)
       via  2cb5588600010c4e9ec0d6df406335b5a9b88790 (commit)
       via  72013be6034d1f011c115fa5e91940fe0801c4b1 (commit)
       via  6d1bccdbbf5ba6243e8ab5368f8ddc31b5d2f0dc (commit)
       via  f94e80a846488b1391d37a214d5488f40e5b8e86 (commit)
       via  115e1fd41b05120f4d5240ce003775c62ca77ebc (commit)
       via  635ebfe9cb2b9c9bbb1b94138c81fb4043400c60 (commit)
       via  968647040f6a292d164ea095e79b73c9ae6cdb37 (commit)
       via  84756ab85e5502a19da128ba098f8634667b6ea9 (commit)
       via  2bcc611a5b6588b5f8ccf1679fec226b399374d6 (commit)
       via  92db2198f80f1bb8e84f56bb26cbdec8fd339f4a (commit)
       via  ae4b47b85065bd385fea2e8ce5ede434e775bd8e (commit)
       via  bab9845a4b61d35f33f8bd03a70d5d6b9c0308b8 (commit)
       via  0388e047d94ec33264a7373d8f5218a2541e9381 (commit)
       via  55c331c6d2035d122f3a2bc24a22da9071c9a80c (commit)
       via  9bb25827b02d806b66875922894a3f9b7641b80e (commit)
       via  557138559d4b45ec9c48351bc624f61a949d1714 (commit)
       via  f27fa2d4275322be6b5fef25c5358b42a81c5e4d (commit)
       via  c7dc990a436d2965f8a4718e696c0d1a397d4f2f (commit)
       via  f745190450fcec476c8de4c37a793b6868062a4f (commit)
       via  52350309dde15490d97e52282fefcc68525c5266 (commit)
       via  61730bf74296d1e554d1881fc532185281551d76 (commit)
       via  a4462565e214dff4b861addeeea0f4dd0d6be29c (commit)
       via  b07aaa888e94a195d0c867a34ae5361963de4953 (commit)
       via  7336314a1a99297e389eb694cc8fbe4652f5b739 (commit)
       via  e9c8b00e8ef32c2ffb5901a4b089ebf8b09d651b (commit)
       via  65925c18b5d4aa5b5f3e4d4de405af11875c76ea (commit)
       via  bd87dc370c5f8608a6381af6619d81630056190c (commit)
       via  93ae0fc068f81eaf26f2a224357578f41c637182 (commit)
       via  89eb9f94545cd492cf596b0ec156d74f3144385d (commit)
       via  2e50f235e6f3914ca3159046887e2fbdec05f62a (commit)
       via  5defd8e1dbed0a95900fd15d9b7d65176b40b1e4 (commit)
       via  b8b80b38f040e0de79858a89c6610ac2d7872697 (commit)
       via  cfd88cc4239cf51fba6d06b42672fe8457fdb028 (commit)
       via  46a04e47e42fd5b370ef94b3a6991e981a96b6e3 (commit)
       via  e9fcb48e4085fb20c2ef81c279e2f97fc2cbbbe6 (commit)
       via  892cf4bb9e842c7eeea51d4428c176920af380a8 (commit)
       via  2d51996df1817a53bc5dc718de84beb9fc3a009d (commit)
       via  38289959048b21fd8f393eac7ce00f01a7e11717 (commit)
       via  a6293a3a7de93df42f41372e404beb2c512cc6c1 (commit)
       via  113eb1253b73af8f08cb505963a74f50572a6c6b (commit)
       via  11d731385f40db125aad0b15a99ab4c43010efea (commit)
       via  66abf65709144e28a86b775e1a233c976802ddf1 (commit)
       via  9034e8d8d4a3237f102cf85b696ac5d99e6edc03 (commit)
       via  2e58c0922b51f1d3eb261f330faf01edd3cffff9 (commit)
       via  9a6805493efd231e795b2a6ab3dec6728443e01f (commit)
       via  7c3a5e43351c2b2b64a6cb4b27ef18d4276e91c4 (commit)
       via  0303c71d6ed97feb671c6fec59ad07bcb57aa542 (commit)
       via  0be1a19795c6577441a06b55e6a64945fde00119 (commit)
       via  3d0e69e535739c122e75e8608965368ad3a285a5 (commit)
       via  5a472271e4baaa59699a8679179f8b3e8cd312b5 (commit)
       via  11d48486319a7f5497b4058c015858ca4c9fffde (commit)
       via  020aa9b513bed8e5a31ac232670e76a22aea3ccd (commit)
       via  b92a8441e6b92dbfad6cf24928622e634c47022a (commit)
       via  4a26b1a59502204a2da0e56643e712aade2d4148 (commit)
       via  56ecb5720aa95e2367a0ec58887769c817d534ed (commit)
       via  14afa33ae93d67ac60e40fb076938dc38577db26 (commit)
       via  e2e5411c72e06f7eb38952cc93c188e32e093783 (commit)
       via  8c0b42d54abbfc41716066e12bf7fc2ddd069932 (commit)
       via  f5722661c233e5c6bab7bb07939d9cffebc6189d (commit)
       via  b75ef71af6dd9a578d555aa9c94bd2e5577fba9a (commit)
       via  66bd09fa805b76e2c179fa718c7de17ac55e8cd9 (commit)
       via  fe284d709650dc93f0a6d20b93597a7100eefa1a (commit)
       via  d2eb30d1abc1533530455517af464ed013d9a038 (commit)
       via  1b4bea7d1b6d2524af2cc85e7bf46bc07d758716 (commit)
       via  51f60d18fb24a3acac43acda43a4f57e0c39cd9d (commit)
       via  9936b0f26b29240c32733f42f2e68510b44e5d52 (commit)
       via  e66ad0972f1717cf144ccfc039afc4ed15601f39 (commit)
       via  4ae79476683505a30b127ec037a4337c5491c4f6 (commit)
       via  e3a4b1b8af488e9af6ab3fdf47206e86c77ceea4 (commit)
       via  a0a2e5d1d5c9922af0822e7ebffcfd13eb93adc6 (commit)
       via  94612babd24981b72c085189a6de053a8537a5ea (commit)
       via  d3e38918cbfb7e25f40bffb98af9763f84cbeb4b (commit)
       via  a289954060f4e505f9017103dac9250d1e9c1e64 (commit)
       via  4654b5ca4ef34a806ad2421ad9338ec2b8828f45 (commit)
       via  bd82ff96ccc3c2d06a7bb6073202b4597c84d707 (commit)
       via  e5f4e9a673a86274d7d16abb744d62d3abafce98 (commit)
       via  be9dd9d9d756d277d64dd51c49d50c393c77ebb6 (commit)
       via  8229a5560c9b338a2e28c079e7c6e73b9c5739fb (commit)
       via  4d2ed3055faa4241e018f413b13705ca959e3ece (commit)
       via  47df532668c107e909890e95b5b94532cd051747 (commit)
       via  e988a91a5b8d81345f94abcf54b7ec3502299e11 (commit)
       via  9497eab797f3896b28444b267dfd3b84ab036185 (commit)
       via  b97c04c4a197f419eab45688b4156a65ccb6a44e (commit)
       via  49cc5c3553f13b0451d2055511faa8d93ec717a0 (commit)
       via  90dbae21abbb3add1c54895ca4924d401c977481 (commit)
       via  9dbef02dc27ef443617e94f27a011d2106ae3244 (commit)
       via  7b169abe5811031f4ec6fe919abc31204e9e9d87 (commit)
       via  5eae4b4023ff8b74369c7967b3789e5db3d86516 (commit)
       via  46314563ac365e29175ef2f418340a10f48eb053 (commit)
       via  957e9cf45ce60fd2c6e0526f89277383eb554f55 (commit)
       via  10271fb80eb6ac05dbdd96ba8d710dfce960ba91 (commit)
       via  e6c2f06a38df910976f59b1a4e380dc6291ca9f8 (commit)
       via  2be23d9cef3e2f8a9d464b9f449666ac87ea5c96 (commit)
       via  5a01a7b4a8ff04c6f202e42d7745f75ce36fc4db (commit)
       via  900f58dcc2bf90ab609fff39abb513052f4bd473 (commit)
       via  b50a9e7f7f70269c7c421b5ba4440877acc4f6f3 (commit)
       via  c51da0e1762a211857c30d4dc3dcab8a4cd932a7 (commit)
       via  4afb32a295995920e73bdd8980abb91516b66af2 (commit)
       via  6eca8bea650cd98f01103a888508372ebb26f444 (commit)
       via  ca59c3c0884aaa32871c2970b8cf8cdff3214936 (commit)
       via  fb27f987c2e81797a6c31ac25ddfb729c29fa1c9 (commit)
       via  4a3157df834f6bce64189376b70a4cab92adcfc6 (commit)
       via  8fd157776766b24cf96a8eca4fde9882ea00c892 (commit)
       via  d401ed000a82562179634e85cc6a1ebec1c17f34 (commit)
       via  e9e2326ea21137817f88c5dd32db935b9a901a1f (commit)
       via  875ed6c2092376cdc7169ad82ecbed3ae70d0969 (commit)
       via  53101784b08344e047ad95b189ed3d0607ea2e90 (commit)
       via  0dcb3f925a8a9672f7cd4b107f31f9874f3ec8e7 (commit)
       via  d114cce6c06801ac263de76c514d5159b978e04a (commit)
       via  869366cf4bf6469b82ecf3ac822e44d1f0dfafbd (commit)
       via  0934ed05485a48e35f7153a1492e5604e5172dc5 (commit)
       via  be75f8bf8883520d81cc0b8fe6922b76c917496f (commit)
       via  609ed4b5e551192036c95dbf3c15f3de11798f43 (commit)
       via  7c9cb2404cd2b1e4c7ed15fc2be76ba1246acedf (commit)
       via  435443ea15e349404f58da2b7708e2c33072314a (commit)
       via  cd419fb279aae5741c7c36fc91c5d15d3f540344 (commit)
       via  616356601606f35544a391786750d1364042ef9d (commit)
       via  cec69924b57c5aee313a060f62dfa478a7974ac4 (commit)
       via  633d9d03d18d319113f27de48b705dbf154190f3 (commit)
       via  22fca20385421e6461af663a97723c75c700515e (commit)
       via  b218fdae1be844efb2ae70cebcf7549c5893924c (commit)
       via  9d5880914f5a28613ac75cc3342e06f81f4ff746 (commit)
       via  6db0f12c5c99ea7afde41bb42a5fce3174fe1865 (commit)
       via  dfe93d8de5979fd5f07b82aea451d84f515a6292 (commit)
       via  0176794c256d3999ea2256bfe80e2a5a97f700c6 (commit)
       via  84c5709e4196be75a063f3431b8a5218f740582f (commit)
       via  b4b394ec9fc98af486044a9cfa17d49149092a7e (commit)
       via  c9e6027448eeef72a974dd558ddd8873c9599746 (commit)
       via  56b578d26a5bf362dec6b86e3d304e9de57343ee (commit)
       via  94cf448670d7a8506ad0592fc469b2a3d2022f66 (commit)
       via  28f9b4dfddb4d8ac719ec6a7779ba0aa24908f7a (commit)
       via  c391ab716a9e7d338ffe7f011d6dc31e58589510 (commit)
       via  b7f236a375f1ca7412ec70eeaa3657dd2b5ae2c2 (commit)
       via  d7878e886adaf1898d3333ecf958fabe96c603a6 (commit)
       via  d895a42828fca26b94a7a092c67d8eb8047deea1 (commit)
       via  2669a2f4048ad424d78ab79b36ef6c01e3a84f33 (commit)
       via  cfaea3ed7bd7ec12c7b31ebc41f1cb585a111061 (commit)
       via  4a6978e1983fb26b1aaadd961166d0629e20c971 (commit)
       via  bfd9bbe7a30a89901612c2f69a6ddeb1a56adff7 (commit)
       via  52fc5a8399654b51d197b672516af5d452a06d7d (commit)
       via  76e9fb05f66d247564ffff32832c485bd0b49a72 (commit)
       via  ab2e2334c3694b343252b073e5b48cce740431bd (commit)
       via  99825a89b2394636679d2a8dfd1f23e6e43a9c33 (commit)
       via  1f1640e7a48b5f40d32793da0bd3bec6c610dbf9 (commit)
       via  be7c43fc78f85ca5755e593a15c0ce0d3e94a592 (commit)
       via  8d11921df6790e28d6e63162740bd1ad38a42372 (commit)
       via  7850dbb1101cbc89a580d9cc3d5363f0cb630e4e (commit)
       via  cb1fd9779913bff8c9659f63bc75e7212461ef7e (commit)
       via  8b0a1371c5cb3926388c162e2e44cfca76f2653c (commit)
       via  c9b1bc5a4fb870e3f957b6b2b8a70e941de43c8d (commit)
       via  e22f7c54ce5ed757b511ff9e16f18feb5368a675 (commit)
       via  72aa290176a3c27d3f9519a7257dc920da45f5f8 (commit)
       via  35021da61ac4d9bf7e34dfbd0ef08adffc4f4b72 (commit)
       via  f18855f50a3b78c5125d1c5bd44f54c266710397 (commit)
       via  696640928b7d333bf772a1ed674b7447bf58e7ba (commit)
       via  a25cf68604902c7e13e5cb7b91529827ef167f87 (commit)
       via  d65e72c0432ad90c5ad04e323d61c9ab305e8ed0 (commit)
       via  0bdf4cbbe4491c5c93ca79b6f2a0bf78c60e23c3 (commit)
       via  d5dcdd72ba5b3c8f90b8529d14b1f4174821f7c2 (commit)
       via  a1ff1a311dc55a143b74e79b3b2a7f063b9fc310 (commit)
       via  b7d9b44ce6987141fce5b1221008deb129f3f23b (commit)
       via  b10496978f50a84fc5361a4d5bc07a52acae2ff0 (commit)
       via  b0c5274a221b90513e6d793f54e9701797252a89 (commit)
       via  b2f68d38e1727d4955dcdb3aaa1fa3bce0ca9e04 (commit)
       via  0f90442452697e56f13433e94bb47ad77b44997f (commit)
       via  f0003ba5c3b5bb1b09e4f9d86f257b255f1a6005 (commit)
       via  099562c5c4dd4290bad3b7b7e3a6a61cc7d783e8 (commit)
       via  7586bc3225bd391f7dce3650ef8021b4e6be4d21 (commit)
       via  60d816dd506849a836f49bb75d1e61eaa53ff08b (commit)
       via  307a6aa73839936759360e863b96da7fecf9bc2e (commit)
       via  1a5e7749be9d714f36b4880a31a74e84a73ab95f (commit)
       via  24e03082d4dfd53b447d2b9d8f4dec659232f3f4 (commit)
       via  c75fdce017f9239a3de2411f6eda4398209c002d (commit)
       via  76c2546a3ee4e1d17dc20effa45dc922fe93b4da (commit)
       via  7fbcfd3e63a8272a2d8bc56cd10761e42d88f729 (commit)
       via  cc57f1c2f6d38d429553572942436ac2d26eae0b (commit)
       via  a3467be08207a53d27674ac36d583105df52e674 (commit)
       via  46dea63c9db60ab9e50d89a8a866ff6fc82d89d3 (commit)
       via  9bdea6891eabbdeccbed4dcbc30cc07d30a0e071 (commit)
       via  62044e95340c4374e33c92fe453fc830e5398c31 (commit)
       via  fa1f481ca2b5e8fcd6411bcd17cf4758f309d0fa (commit)
       via  e7402fb4daceb9161f43ec108851fd382dc5842c (commit)
       via  dd1fb7b5d0edde7cab849b2d1ebcc3517c8a5f99 (commit)
       via  49293651d6e84a9a428d44664e89c9ee98f51beb (commit)
       via  18b243e6c248c486542b2e1785a1154cb08fc04b (commit)
       via  055d869e77d318b0978b5bd24a956b5b18603682 (commit)
       via  dfa4972e5e24872f59f618d936e22681376c6707 (commit)
       via  0059f5b42608c96e853b56173073c2f3d2195290 (commit)
       via  82782a0b87e94de80e2ed0d3a774df6f858d9d9d (commit)
       via  b11e62955d307cbedd41416629fcb848e7d95de2 (commit)
       via  ffe5ec17280c9ea65e95e498f2c470fdfab96ea9 (commit)
       via  e0d24474bb0c4fc8c515e47676ce1702b4b5e1a3 (commit)
       via  9e51832ed5702164200766706d5498b34b7a06e8 (commit)
       via  8d1c44335c6cb4198e08232910fb43a3c9395696 (commit)
       via  2828d49b8bfee2a4996013a9258a0f8b1df5414c (commit)
       via  310310a33a5df596adaf95c45330a38e47e3dc4f (commit)
       via  ff9e1081221a395030cbb1e37646bdc414f87b4a (commit)
       via  d1d0ebfd9e4ecbace12e9249419d7a3afccd1edd (commit)
       via  6f6a17a82ac5960b83ea4813f3eb14b03b7b08e8 (commit)
       via  8e7e481531f597c23283753fb6998eff308ccaa1 (commit)
       via  12a410abecf5497234aba043de6bd7bf6f8a9dbc (commit)
       via  42ad7c2b37d4a10989ae01f40cf2c4fbf7d7f7a9 (commit)
       via  8d518acb8aeffed854df487701f5f9a5e71723ad (commit)
       via  b8f80f133cbb018c74e54c052c38a7cdf6149b2d (commit)
       via  925a5dcbf9aad3d596fadd577ac58f24489d6b51 (commit)
       via  79228c6d7ad69e9c5e22141a4c532f527f89e653 (commit)
       via  c6b68a3693dc67a7b8fa63a1e35bd394c5fc323b (commit)
       via  c8ae5c33f1a6b0a9a87f5acac79711e24c3372c9 (commit)
       via  2565e7937ae39bf8602568b3f947e65467d688b2 (commit)
       via  4ad2cfc41cd61c7f9c03e17ccf657a02f14b09d5 (commit)
       via  10d8135a9564b97ad18b47504c1e38cbe10c3f47 (commit)
       via  ffd1f7a9657d503bfb87100f9dd4d1df55dc3589 (commit)
       via  e06d4cf0145b894cb2e3a1c7d35067db43dbb117 (commit)
       via  06edd417e613ef5a1b9437c64cd3b4b69f111057 (commit)
       via  a9331b4b471c178d9c24da9711cc1202754e92b4 (commit)
       via  1a8fa9a2bd8aeb92cba513a3191e95941097aab3 (commit)
       via  d59edf42f6613fc42e6cfa5ad3ebb42deabbaba2 (commit)
       via  0cdb1d38d075484d6cb17802b125e800cea76398 (commit)
       via  e34fd1e6536afb4acfc227e48702bf3bcff656b0 (commit)
       via  c5b35afb2c5ac18b2c73c675b28d66ec71518702 (commit)
       via  67df9514fe21601e2d2522e0ac213c91d5a32352 (commit)
       via  62b6ff23f4c56e134161c16da27fc142550bb675 (commit)
       via  17e28f69287a0923bd5ef49a9b8d936ce64010c5 (commit)
       via  46de4d3eac77ca82b5977cbe6a21c28715cafbfc (commit)
       via  1bd8e460fd9b1b7c38ecace2cabb7e696889e06c (commit)
       via  7b0141634351eb4bf91d5cbb39f17a074c492f46 (commit)
       via  35c505f9dbdb0d246f68a13a4ba999fd926aa68d (commit)
       via  365d369fe38f1c695a62b8120a91dd24d3b6c4b6 (commit)
       via  a882f346aae429f0edc2d924079ad9ad0fb2d4c7 (commit)
       via  6097b2f7981ab8fa01b85675680b397903ed8ce5 (commit)
       via  c92078b44a4a684d346329bc3285c42be61e55b0 (commit)
       via  0b7c5959ac25a1111eb5b4561957fe399cf35ae3 (commit)
       via  b702eb12916a63202407c167e61662e53c112142 (commit)
       via  826b901fe8ac75e6b4156ad852b9d6a1cc7a2231 (commit)
       via  80bd43e0a35cff91c0bc2b7bd91cb0ca8dcf96e5 (commit)
       via  d1bd9c4984ca4b543b4cd7dc14812fa89f7b86a4 (commit)
       via  6112620078e6d31147195d9be1f04d2087f19780 (commit)
       via  a34a90c16b57532dbda071cccbc16f1782f14076 (commit)
       via  c6e631b41e14cf721e29f5f531e6e4fb4e113cb7 (commit)
       via  0bfc4464a3c441e097bedb02e458cd38ae55b0b4 (commit)
       via  f2dcd95a40cc42123fff38a28b7b917aeb4f87fd (commit)
       via  82f7882be2b78bf94f4c76632bcf4e954690e3df (commit)
       via  dd7af68a0fc91db625173cae6babbd6a1d452c8e (commit)
       via  62e1b465d8e74219d25a18fab0d6f5dbff4b2b79 (commit)
       via  4964a95ce2409a9789a2d76a2c975d998b650156 (commit)
       via  e9c787710dd7d2ff77c9b94c2146b7478e33b55b (commit)
       via  65075dab617431a0da1d58cd1dc1d9ce40019e60 (commit)
       via  f0bdba8dd1f01486c6883d157c895c4c3fd78975 (commit)
       via  f16cab005bf73ba97122e40e63b376dd6135ac9f (commit)
       via  c91fe759df7626a8a05fa40deb4d2296a68f3660 (commit)
       via  9f006d012c018990b7a1a48abbe348104f2a1f47 (commit)
       via  3370e130bfeae739128cc49b15509b599fc1282f (commit)
       via  911bc729c10fdb9780be1da28306f949009f2c46 (commit)
       via  8f0213019daaa331645aad360d256e7646a7949e (commit)
       via  9ec164276e2322da49034a8ea9fe9590ca0ca050 (commit)
       via  64d4c7103ecf6f95d805f4d6454f891a6f423ab7 (commit)
       via  72100c98a5dc325ccbe1571e04f4e61713fd9182 (commit)
       via  f7cebd3b71e88c67089b6991e2940e7621114228 (commit)
       via  0f2eb5bdc3af5d518f171833eaa61650c22f080e (commit)
       via  84ccc1092def598da01d592885c2a7aadc4064e1 (commit)
       via  f8c08be8390fa77a79e33230047e6fec94c037b3 (commit)
       via  f7c3a9dfecdf8120d00ad3649e6ef94e60d94563 (commit)
       via  c2d2b7d600bee90d6e14713d4a70f8297ed8c1c1 (commit)
       via  f414a1bc94d33cc2ba85ca3aea0570cd5b909ec0 (commit)
       via  5704afac9b524c4646f35643471e96abf2721f38 (commit)
       via  9105bb91378796903ff46d649315f3960e9d888b (commit)
       via  d221f181e5fddf7389976716e198f495a84870f2 (commit)
       via  fad78afe0833393d5e498469e743f2d69cbc3ff4 (commit)
       via  b0140cc21a982eb354b36ecacb68ec3d5e089b01 (commit)
       via  0a4dd269c2beb9c06dd91f2cb3f4240d2f05f30e (commit)
       via  cbfdcf93b88023b0f9b7a3405aa11de02fc271df (commit)
       via  6c3c8cf1190d8141f1bea6bc8223b3e9c67ca8be (commit)
       via  f28d38cbd37ea4add20f99d8fe314cab622af2b5 (commit)
       via  476d666f86322b8701968a4814d9e0437368d3f6 (commit)
       via  f42636c1bf79e2bdf6b74f7c385a11ffceae4c9c (commit)
       via  8dbdcfafac7af4baec72656791953a0f923a593d (commit)
       via  3ac85f6dee38050d24a7808216f98ec9654891a8 (commit)
       via  a351a49bbe419d1b4a0b415d759923402ef3053d (commit)
       via  7a63ae249319a2e7d5e53bbf3ab4bb0c483cda31 (commit)
       via  708df25a7df731469edfe6f3894c2b45d8674eb5 (commit)
       via  c789a6e40d91daf9912d729c125594b65e71af2e (commit)
       via  e035eb414d5d5f04646e610e2e430935a12d5a27 (commit)
       via  34211ec5fcc93be6f8dd726378c41ef8dc8a29a5 (commit)
       via  92aeed256a2c552f7aa44cdc72837e8b7cb11d3d (commit)
       via  ee0336b0ac320037eec1083c1ab019144f820caa (commit)
       via  a355db734a2914e2676a00e51ead07e63a46f5f6 (commit)
       via  53a88b1c32f68ef9486b172e76c95f2d80554e5f (commit)
       via  25ed888b9ba8989e26f6998781d1d3411ad4d6cf (commit)
       via  51cdfdaa0ec77e612f359216cc13440b8657c2d5 (commit)
       via  b859f3ec2ac15013b8ea4a276babc95729bc6622 (commit)
       via  96e4e25ddbd8005a45213b615c1e9234f10969d0 (commit)
       via  637d01073d2e00ecb023720eee5180a3cab7af4e (commit)
       via  fa3c62abfe51ba0b92787b2cbe1e5c1ef4deea1f (commit)
       via  769781e04f90b73e2aa56ce485eaf90675ba9de3 (commit)
       via  6b3a6add85d5b810fbded6c0438d718d90cec23f (commit)
       via  ab5aca41f91f79bdaaccca02a3b0260677253ba9 (commit)
       via  dcf3d819617c254781182249d692806a303ddb38 (commit)
       via  97820b6b194685670240e24c1fc2a39fc1815706 (commit)
       via  287f881fc8ab04fef79926dd2bcab533ca36e23c (commit)
       via  c08132c716d03b64744caa98ba173e24bec39739 (commit)
       via  b71b4d3da9582eb7e4844ad4e12b56e5cab5f6c9 (commit)
       via  64a23b7ef2b00d2a5ce6905b61fc940cb02ab469 (commit)
       via  1179d109ca31e8fef3e27ac775c907c5fe04aa1f (commit)
       via  43ef2c729b25ef42b0aecdc350e433b2acd69d55 (commit)
       via  4fa65c056ed3aac7b34cfe076d55d5d5e83d5543 (commit)
       via  34f3f2952b0560d00538484e44f30d4c997add8f (commit)
       via  2ca420ec4d3c07a7b0625d9e0b16e455646f3a49 (commit)
       via  9fe2c16d5158d1e7fd0110d1b6b13af44986895a (commit)
       via  0eade1b94da17acd0b406074b0909aff6edced66 (commit)
       via  c2a1a72ec6323025a5b13cb9ec9e190a7d74ff1d (commit)
       via  aaccc61d153961f15e13f895d44831c855a81a07 (commit)
       via  e7c95e889d9a072d31c5bc06eac16ee5ef4497ed (commit)
       via  6d3de9eceb5243e91fe4d77050240a148bca012b (commit)
       via  e2f89b0a2730a94b1ebfca26a5b55fde3271080f (commit)
       via  6df230b7a9de8ad00b70095571e7e6c32091ea4b (commit)
       via  4d4f354ffa2aafd77f3490e6d0124fe20b70dd01 (commit)
       via  c70c786df1c93cd27a58b747d1287ae2458e49b8 (commit)
       via  9e7e3a74abe172e37d2b28b46078a0d6fad4fbae (commit)
       via  dc8d4df490d949b7b90bfa8f4c534a0f8477cb0b (commit)
       via  62cbbbe8a299280edb79e46f3eec479d013da974 (commit)
       via  44ada90508a40f77a8feed86fb89b86788b8f7dc (commit)
       via  bb87994a4aa27f129116a592fa214d2d41a99f3f (commit)
       via  c0f99573fac0d8660757cc2c7add29da346c2aed (commit)
       via  86733e547edcfe125539a3b134b11c24e9e95c84 (commit)
       via  b0fee322b993c9ecb12cdf4293e02abe8883f12f (commit)
       via  4b9bfada8e5937014a665874c447d750d1739f39 (commit)
       via  2037cfe3a92eeaa02a530f844d6d5c90c218db1c (commit)
       via  b6d411532edfb5749a352383811d4573f4c3afe3 (commit)
       via  d6aa5a336fa5205947585ec6f9e603af024fdbec (commit)
       via  d8572303d87996b7afa13cabb5817072de7b1e08 (commit)
       via  ffd90abfa369b5b7fdbd200f4972528e9c0dc4da (commit)
       via  31de1fac692d23b61a81a024f2c720315f337b85 (commit)
       via  9ae190eb3fdb74d7139d693d1d504fb9e1b284b4 (commit)
       via  118b95b27b08d0176645ee01eb8ddf9cc9148bf8 (commit)
       via  6f32ff31fa06f791cea023ccd7a5e1b446b126a4 (commit)
       via  918ea3a7ce7fc0ccefad3a89ce30f37bddee874f (commit)
       via  569d010875aaa6a6e2e43582addf6cc150241fe7 (commit)
       via  264ba3fbfb24ce56542cdfe18fccbcdf3f972c3e (commit)
       via  6a6c24ed1d5463b8ffd39fefb17659da1b4d8f6a (commit)
       via  3398799bb0f7793eddaeb5deb1f282b34cd7d80d (commit)
       via  07c5094f30ccc829f5c1175cb22c5da780463ff2 (commit)
       via  bfb653598229a7917461999bc482a9a5a950d320 (commit)
       via  a1d94ca21f8571b6b35eac1f2e659a93d00a13af (commit)
       via  8d1e8a6f47f949cde43a7772dba0110e3f418c7b (commit)
       via  92049ad32b5f4af6616c8cc24876c8bcd94aeaaa (commit)
       via  6dbdea5e95e0a9839a631a83018461e0466a1dd6 (commit)
       via  dad97cf1ec7f027207c9f97a1d2bd67c99898822 (commit)
       via  2f4a368196c6798ff39559818c5f3e5fb6f78564 (commit)
       via  480dee5c2454b8c726ddf37ddac375e8210fced1 (commit)
       via  27f057146cb60723634fd91e066cb1564a9f6442 (commit)
       via  bfd75c2bba2f4b14829053ab567f8d3f082839df (commit)
       via  20939be5b8356ecd20a2e66ab49ef65ec1e320ce (commit)
       via  35eca0bd71a81eb2f8f5f0303f2448fc373e4425 (commit)
       via  7d66ef69e08283e030511a3c0ae5475afad6ab68 (commit)
       via  93bebfa785525ded9b9cedca4937477f9b4a4f79 (commit)
       via  c8a4802591171e9aea14e705ad1a2f3ee4f6e8a3 (commit)
       via  9e636e2fd7d53dd6590b2018fb6fff3fb004effb (commit)
       via  33edcbccfaa6bbb02892639dac287d96bb7a85a0 (commit)
       via  786c44b3b95b98d037a154ad5a8a15fd07caaf4b (commit)
       via  a75cf7be41d205c5dd1744a1aa9e415af135fe2a (commit)
       via  57acf8eb3abaa8ef24b0da6fcf875c629726965b (commit)
       via  593917d6eeb2a58e09bcb68f661c936f452d8ac4 (commit)
       via  a2e198b19b155ddfbab8244a2d6e8d2d66b4f57c (commit)
       via  1ead49ee6dd6c0c0213e8db09efb81965940d0be (commit)
       via  fedc98e14ef3426d99828a4a20313e769d48b0ef (commit)
       via  261ab308193ff84a2f4e5ce8e0970bf9ff13bc29 (commit)
       via  8d64ecca480b5d5dac89e83a38762c3242ec1567 (commit)
       via  16432732b7aa64d5bb053a1e1cd4c2ffe7bd0dbe (commit)
       via  b85392b80f3121bc616f00635b3f2e0602e0bba1 (commit)
       via  df923bf1e7c5b5d7766b63766f7a32006b070071 (commit)
       via  6bda2761cb886c6bc659acbfe4588b78e7ffee79 (commit)
       via  2bb884e215052cb59bc7666d6965df52d4301b83 (commit)
       via  82e340c4b01fca0d21f532a4df5e01cecc6d2364 (commit)
       via  dd00cd131d64157584c79f7cc68e877fbcd1515e (commit)
       via  6a8655684a9f041647cf62a9d6cfe9f7e2e290d4 (commit)
       via  0b63239adb19d25f153a7ce6638d1f756cf2e6ac (commit)
       via  83c04c0b5ebad6e0258e7a1bfb7cd1c015dc6fcd (commit)
       via  80ff9ace88fffbd868728d5cdf87eb813851909d (commit)
       via  c3b70fb15fdcc52cd54bc94655b67c6245cfdcf7 (commit)
       via  a4c3c6d93cb1fec8eab334319015d0e2afb458b0 (commit)
       via  b2410570d152c32b38a7b122d56ffaea396c739a (commit)
       via  8b4d8f26cc3daeec84f55dcc0502f6fd719127d2 (commit)
       via  bb5d5c86e0cdacd9ac204bdba3f40b303cab231f (commit)
       via  46d6639cfa237e4081fdb6be260a5239632eae39 (commit)
       via  0e0069370a906918e5d63f1ba8a8e7449a30b570 (commit)
       via  dfb5e883ef1b38bc979d7ca8656996b96ae8af8d (commit)
       via  159fffd57211b0ec11676aa90ba71e23cea522bd (commit)
       via  9d3c8b32079d2613c68f69641fd53e6431d25d25 (commit)
       via  10f0a36ce0470175a1ea29b140ce107727fe1f74 (commit)
       via  cd8ca6634730cc3b6aaf925888a6960265de2e99 (commit)
       via  92051350efd6b499afcaadb4346f3754d595f782 (commit)
       via  07b8f41c3801977c15b5fee67639d1fdec10566b (commit)
       via  06a07622f766b5b71f9642db98d6e35206fe12ae (commit)
       via  5cbd6ed195c7ae8ed14503794137704af5ebd3b4 (commit)
       via  e5c32a1008483c173127cfe0f2e3565c52bd3fa0 (commit)
       via  efce3d8c64a3670ebd6e133bbc16b75fa4cf2729 (commit)
       via  a0ad86868c332e5c7c5cebb746f334bf7d790313 (commit)
       via  83fe5b9ccfabd886c20c6bfe34fc31742bc835aa (commit)
       via  2d4787568917e81191bb864dd47b6f94f66fb3b1 (commit)
       via  3bcf06790bf9dc6a953f92cfd7fde394290553e9 (commit)
       via  463fe256e2024670eba320203669bd9621615910 (commit)
       via  4ecb3a29841d5dc56df79488891f7e1023f5559e (commit)
       via  4a7cd96a2c0f2049b42dfa774514be6afc155d08 (commit)
       via  1dd8c8e6fcdc0b2cc43faf54c7ad2b28c74e14a0 (commit)
       via  8b49bf38224dd20176075e7a7858b3034e4c410c (commit)
       via  26caf97420a70fda8cb570be0e9fe8c2a2dcc349 (commit)
       via  5bfda994750fe272154607b7c7ae1cfd9a71167d (commit)
       via  92562034a2ce74d383711f14d713fb2ddd1493d5 (commit)
       via  059b86cfc247887484571c5c1eedd7fc880c647e (commit)
       via  4852c738adad71ebb1732340bd64364ad0bf15cf (commit)
       via  e2ce47843ff8847f2228f248fbc6d3ae571c2687 (commit)
       via  a41e932cd70388361a76f989816ecc1cb72c37a4 (commit)
       via  1bf615c15ab39b13e891d8a16941d6b4fe262f47 (commit)
       via  52573f9803675927ea82cb82b948bdec7e6377f2 (commit)
       via  fc57604b68ba50396e19298b9620c1f8a210551f (commit)
       via  52cbe440e7d8e52242a85570d8da4426f570eedb (commit)

This update added new revisions after undoing existing revisions.  That is
to say, the old revision is not a strict subset of the new revision.  This
situation occurs when you --force push a change and generate a repository
containing something like this:

 * -- * -- B -- O -- O -- O (ff76bd5055038b764a4a38c238e8d895fd714f92)
            \
             N -- N -- N (60b1b2a011b139fb78b798a97993e8b254b8ce63)

When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.

Summary of changes:
 .gitignore                                         |   11 +
 .shipit                                            |   10 +
 Changes                                            |   66 ++
 MANIFEST                                           |  177 +++++
 MANIFEST.SKIP                                      |   12 +
 Makefile.PL                                        |   89 ++-
 README                                             |    9 +-
 bin/darcs-sd                                       |   20 +
 bin/git-sd                                         |   52 ++
 bin/sd                                             |   33 +-
 contrib/git-post-commit-close-ticket               |   17 +
 contrib/sdticket.vim                               |  103 +++
 README => doc/testing                              |    2 +-
 etc/sd.bash                                        |    7 +
 inc/Module/AutoInstall.pm                          |  768 -------------------
 inc/Module/Install.pm                              |  364 ---------
 inc/Module/Install/AutoInstall.pm                  |   61 --
 inc/Module/Install/Base.pm                         |   72 --
 inc/Module/Install/Can.pm                          |   82 --
 inc/Module/Install/Fetch.pm                        |   93 ---
 inc/Module/Install/Include.pm                      |   34 -
 inc/Module/Install/Makefile.pm                     |  251 -------
 inc/Module/Install/Metadata.pm                     |  487 ------------
 inc/Module/Install/Win32.pm                        |   64 --
 inc/Module/Install/WriteAll.pm                     |   40 -
 lib/App/SD.pm                                      |   68 ++-
 lib/App/SD/CLI.pm                                  |   72 ++
 lib/App/SD/CLI/Command.pm                          |   43 +-
 lib/App/SD/CLI/Command/Attachment/Content.pm       |    9 +-
 lib/App/SD/CLI/Command/Attachment/Create.pm        |    9 +-
 lib/App/SD/CLI/Command/Browser.pm                  |   67 ++
 lib/App/SD/CLI/Command/Clone.pm                    |   48 ++
 lib/App/SD/CLI/Command/Help.pm                     |   53 +-
 lib/App/SD/CLI/Command/Help/About.pm               |   21 +-
 lib/App/SD/CLI/Command/Help/Aliases.pm             |   75 ++
 lib/App/SD/CLI/Command/Help/Attachments.pm         |   33 +-
 lib/App/SD/CLI/Command/Help/Authors.pm             |    8 +-
 lib/App/SD/CLI/Command/Help/Comments.pm            |   44 +-
 lib/App/SD/CLI/Command/Help/Config.pm              |  100 +++
 lib/App/SD/CLI/Command/Help/Copying.pm             |    4 +-
 lib/App/SD/CLI/Command/Help/Environment.pm         |   39 +-
 lib/App/SD/CLI/Command/Help/History.pm             |   52 ++
 lib/App/SD/CLI/Command/Help/Intro.pm               |   65 ++
 lib/App/SD/CLI/Command/Help/Search.pm              |   82 ++-
 lib/App/SD/CLI/Command/Help/Settings.pm            |   44 ++
 lib/App/SD/CLI/Command/Help/Sync.pm                |  149 +++-
 lib/App/SD/CLI/Command/Help/Tickets.pm             |   82 ++-
 .../SD/CLI/Command/Help/ticket_summary_format.pm   |   45 ++
 lib/App/SD/CLI/Command/Init.pm                     |   38 +
 lib/App/SD/CLI/Command/Log.pm                      |   96 +++
 lib/App/SD/CLI/Command/Publish.pm                  |  218 ++++++
 lib/App/SD/CLI/Command/Pull.pm                     |    9 -
 lib/App/SD/CLI/Command/Push.pm                     |    9 -
 lib/App/SD/CLI/Command/Server.pm                   |   11 +-
 lib/App/SD/CLI/Command/Shell.pm                    |   48 ++-
 lib/App/SD/CLI/Command/Ticket/Attachment/Create.pm |   25 +-
 lib/App/SD/CLI/Command/Ticket/Attachment/Search.pm |    7 +-
 .../SD/CLI/Command/Ticket/{Show.pm => Basics.pm}   |    6 +-
 lib/App/SD/CLI/Command/Ticket/Comment.pm           |    4 +-
 lib/App/SD/CLI/Command/Ticket/Comment/Create.pm    |   26 +-
 lib/App/SD/CLI/Command/Ticket/Comment/Update.pm    |    7 +-
 lib/App/SD/CLI/Command/Ticket/Comments.pm          |   37 +-
 lib/App/SD/CLI/Command/Ticket/Create.pm            |  123 ++--
 lib/App/SD/CLI/Command/Ticket/Details.pm           |   29 +-
 lib/App/SD/CLI/Command/Ticket/Resolve.pm           |   14 -
 lib/App/SD/CLI/Command/Ticket/Review.pm            |  186 +++++
 lib/App/SD/CLI/Command/Ticket/Search.pm            |  113 +++-
 lib/App/SD/CLI/Command/Ticket/Show.pm              |  178 +++++-
 lib/App/SD/CLI/Command/Ticket/Update.pm            |  142 +++--
 lib/App/SD/CLI/Command/Version.pm                  |   15 +
 lib/App/SD/CLI/Dispatcher.pm                       |  234 ++++++
 lib/App/SD/CLI/Model/Attachment.pm                 |    4 +-
 lib/App/SD/CLI/Model/Ticket.pm                     |  249 ++++++-
 lib/App/SD/CLI/Model/TicketComment.pm              |    4 +-
 lib/App/SD/CLI/NewReplicaCommand.pm                |  145 ++++
 lib/App/SD/Collection/Attachment.pm                |   10 +-
 lib/App/SD/Collection/Comment.pm                   |    9 +-
 lib/App/SD/Collection/Ticket.pm                    |    9 +-
 lib/App/SD/Config.pm                               |  184 +++++
 lib/App/SD/ForeignReplica.pm                       |  329 +++++++--
 lib/App/SD/ForeignReplica/PullEncoder.pm           |  187 +++++-
 lib/App/SD/ForeignReplica/PushEncoder.pm           |   61 ++-
 lib/App/SD/Model/Attachment.pm                     |    9 +-
 lib/App/SD/Model/Comment.pm                        |   23 +-
 lib/App/SD/Model/Ticket.pm                         |  226 +++++--
 lib/App/SD/Record.pm                               |   16 +-
 lib/App/SD/Replica/debbugs.pm                      |   77 ++-
 lib/App/SD/Replica/debbugs/PullEncoder.pm          |  628 +++++++++++++++-
 lib/App/SD/Replica/debbugs/PushEncoder.pm          |    7 +-
 lib/App/SD/Replica/gcode.pm                        |  147 ++++
 lib/App/SD/Replica/gcode/PullEncoder.pm            |  536 +++++++++++++
 lib/App/SD/Replica/gcode/PushEncoder.pm            |  195 +++++
 lib/App/SD/Replica/github.pm                       |  119 +++
 lib/App/SD/Replica/github/PullEncoder.pm           |  248 ++++++
 lib/App/SD/Replica/github/PushEncoder.pm           |  152 ++++
 lib/App/SD/Replica/hm.pm                           |  206 +++---
 lib/App/SD/Replica/hm/PullEncoder.pm               |  338 ++++-----
 lib/App/SD/Replica/hm/PushEncoder.pm               |  345 +++++++--
 lib/App/SD/Replica/lighthouse.pm                   |  187 +++++
 lib/App/SD/Replica/lighthouse/PullEncoder.pm       |  411 ++++++++++
 lib/App/SD/Replica/lighthouse/PushEncoder.pm       |  202 +++++
 lib/App/SD/Replica/redmine.pm                      |   72 ++
 lib/App/SD/Replica/redmine/PullEncoder.pm          |  226 ++++++
 lib/App/SD/Replica/redmine/PushEncoder.pm          |  148 ++++
 lib/App/SD/Replica/rt.pm                           |  139 ++---
 lib/App/SD/Replica/rt/PullEncoder.pm               |  423 ++++++-----
 lib/App/SD/Replica/rt/PushEncoder.pm               |   68 +--
 lib/App/SD/Replica/trac.pm                         |  126 ++++
 lib/App/SD/Replica/trac/PullEncoder.pm             |  366 +++++++++
 lib/App/SD/Replica/trac/PushEncoder.pm             |  114 +++
 lib/App/SD/Server.pm                               |   29 +
 lib/App/SD/Server/Dispatcher.pm                    |  133 ++++
 lib/App/SD/Server/View.pm                          |  792 ++++++++++++++++++++
 lib/App/SD/Test.pm                                 |  137 +++-
 lib/App/SD/Util.pm                                 |   73 ++
 share/web/static/css/main.css                      |  774 +++++++++++++++++++
 share/web/static/images/gradient.png               |  Bin 0 -> 107 bytes
 share/web/static/images/sd.png                     |  Bin 0 -> 2074 bytes
 t/01-create.t                                      |   14 +-
 t/02-create-with-editor.t                          |   89 ++-
 t/03-update-ticket-with-editor.t                   |  183 ++++-
 t/04-update-ticket-comment-with-editor.t           |   18 +-
 t/06-ticket-show.t                                 |  120 +++
 t/07-sort-group.t                                  |  132 ++++
 t/attachment-content.t                             |   10 +-
 t/big-hm-rt.t                                      |    2 +-
 t/data/sd-ticket-create-verbose.tmpl               |   23 +
 t/data/sd-ticket-create.tmpl                       |   16 +
 t/data/sd-ticket-update-all-props.tmpl             |   18 +
 t/data/sd-ticket-update-verbose-all-props.tmpl     |   25 +
 t/data/sd-ticket-update-verbose.tmpl               |   23 +
 t/data/sd-ticket-update.tmpl                       |   17 +
 t/no-email.t                                       |   51 ++
 t/scripts/ticket-comment-update-editor.pl          |    7 +-
 t/scripts/ticket-create-editor.pl                  |   39 +-
 t/scripts/ticket-update-editor.pl                  |   58 ++-
 t/sd-attachments.t                                 |   15 +-
 t/sd-comments.t                                    |   48 +-
 t/sd-dispatcher.t                                  |  217 ++++++
 t/sd-gcode/basic.t                                 |   77 ++
 t/sd-github/basic.t                                |   68 ++
 t/sd-hm/attachments.t                              |   71 ++
 t/{sd-hm.t => sd-hm/basics.t}                      |   46 +-
 t/sd-hm/comments.t                                 |   72 ++
 t/sd-hm/comments1.t                                |   66 ++
 t/sd-hm/group.t                                    |  140 ++++
 t/sd-hm/push-reporter-not-pro.t                    |  128 ++++
 t/sd-hm/push-reporter-pro.t                        |  144 ++++
 t/sd-hm/tag.t                                      |  110 +++
 t/sd-hm/update.t                                   |   69 ++
 t/sd-lighthouse/basic.t                            |   68 ++
 t/sd-lighthouse/real-push.t                        |  150 ++++
 t/sd-log.t                                         |   71 ++
 t/sd-redmine/README                                |   34 +
 t/sd-redmine/basic.t                               |   69 ++
 t/sd-redmine/clone.t                               |  119 +++
 t/sd-redmine/net_redmine_test.pl                   |   61 ++
 t/sd-rt.t                                          |  229 ------
 t/sd-rt/basic.t                                    |  339 +++++++++
 t/sd-rt/bogus-rt-data.t                            |  103 +++
 t/sd-rt/pull-owner.t                               |  167 ++++
 t/sd-rt/pull-watchers.t                            |  523 +++++++++++++
 t/sd-rt/race-condition.t                           |  133 ++++
 t/sd-rt/rt-auto-open-conflict.t                    |   86 +++
 t/sd-rt/sd-rt-hm-single.t                          |  127 ++++
 t/{ => sd-rt}/sd-rt-hm.t                           |   38 +-
 t/{sd-rt-hm.t => sd-rt/sd-rt-n-foreign-sync.t}     |  200 ++---
 t/sd-rt/sd-rt-permission.t                         |  182 +++++
 t/sd-trac/basic.t                                  |  244 ++++++
 t/sd-trac/push-comment.t                           |  137 ++++
 t/sd-trac/push-new-ticket-to-trac-then-pull.t      |  107 +++
 t/sd-trac/setup_trac.pl                            |  138 ++++
 t/sd-usage.t                                       |  162 ++++
 t/sd-validation.t                                  |   41 +-
 t/server.t                                         |  101 +++
 tools/shipwright-package                           |   64 ++
 tools/shipwright-package-minimal                   |   47 ++
 {t => xt/release}/00-dependencies.t                |    2 +-
 xt/release/99-pod-coverage.t                       |   15 +
 xt/release/99-pod.t                                |    5 +
 180 files changed, 16294 insertions(+), 4178 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 .shipit
 create mode 100644 Changes
 create mode 100644 MANIFEST
 create mode 100644 MANIFEST.SKIP
 create mode 100755 bin/darcs-sd
 create mode 100755 bin/git-sd
 create mode 100755 contrib/git-post-commit-close-ticket
 create mode 100644 contrib/sdticket.vim
 copy README => doc/testing (88%)
 create mode 100644 etc/sd.bash
 delete mode 100644 inc/Module/AutoInstall.pm
 delete mode 100644 inc/Module/Install.pm
 delete mode 100644 inc/Module/Install/AutoInstall.pm
 delete mode 100644 inc/Module/Install/Base.pm
 delete mode 100644 inc/Module/Install/Can.pm
 delete mode 100644 inc/Module/Install/Fetch.pm
 delete mode 100644 inc/Module/Install/Include.pm
 delete mode 100644 inc/Module/Install/Makefile.pm
 delete mode 100644 inc/Module/Install/Metadata.pm
 delete mode 100644 inc/Module/Install/Win32.pm
 delete mode 100644 inc/Module/Install/WriteAll.pm
 create mode 100644 lib/App/SD/CLI.pm
 create mode 100644 lib/App/SD/CLI/Command/Browser.pm
 create mode 100644 lib/App/SD/CLI/Command/Clone.pm
 create mode 100644 lib/App/SD/CLI/Command/Help/Aliases.pm
 create mode 100644 lib/App/SD/CLI/Command/Help/Config.pm
 create mode 100644 lib/App/SD/CLI/Command/Help/History.pm
 create mode 100644 lib/App/SD/CLI/Command/Help/Intro.pm
 create mode 100644 lib/App/SD/CLI/Command/Help/Settings.pm
 create mode 100644 lib/App/SD/CLI/Command/Help/ticket_summary_format.pm
 create mode 100644 lib/App/SD/CLI/Command/Init.pm
 create mode 100644 lib/App/SD/CLI/Command/Log.pm
 create mode 100644 lib/App/SD/CLI/Command/Publish.pm
 delete mode 100644 lib/App/SD/CLI/Command/Pull.pm
 delete mode 100644 lib/App/SD/CLI/Command/Push.pm
 copy lib/App/SD/CLI/Command/Ticket/{Show.pm => Basics.pm} (65%)
 delete mode 100644 lib/App/SD/CLI/Command/Ticket/Resolve.pm
 create mode 100644 lib/App/SD/CLI/Command/Ticket/Review.pm
 create mode 100644 lib/App/SD/CLI/Command/Version.pm
 create mode 100644 lib/App/SD/CLI/Dispatcher.pm
 create mode 100644 lib/App/SD/CLI/NewReplicaCommand.pm
 create mode 100644 lib/App/SD/Config.pm
 create mode 100644 lib/App/SD/Replica/gcode.pm
 create mode 100644 lib/App/SD/Replica/gcode/PullEncoder.pm
 create mode 100644 lib/App/SD/Replica/gcode/PushEncoder.pm
 create mode 100644 lib/App/SD/Replica/github.pm
 create mode 100644 lib/App/SD/Replica/github/PullEncoder.pm
 create mode 100644 lib/App/SD/Replica/github/PushEncoder.pm
 create mode 100644 lib/App/SD/Replica/lighthouse.pm
 create mode 100644 lib/App/SD/Replica/lighthouse/PullEncoder.pm
 create mode 100644 lib/App/SD/Replica/lighthouse/PushEncoder.pm
 create mode 100644 lib/App/SD/Replica/redmine.pm
 create mode 100644 lib/App/SD/Replica/redmine/PullEncoder.pm
 create mode 100644 lib/App/SD/Replica/redmine/PushEncoder.pm
 create mode 100644 lib/App/SD/Replica/trac.pm
 create mode 100644 lib/App/SD/Replica/trac/PullEncoder.pm
 create mode 100644 lib/App/SD/Replica/trac/PushEncoder.pm
 create mode 100644 lib/App/SD/Server.pm
 create mode 100644 lib/App/SD/Server/Dispatcher.pm
 create mode 100644 lib/App/SD/Server/View.pm
 create mode 100644 lib/App/SD/Util.pm
 create mode 100644 share/web/static/css/main.css
 create mode 100644 share/web/static/images/gradient.png
 create mode 100644 share/web/static/images/sd.png
 create mode 100644 t/06-ticket-show.t
 create mode 100644 t/07-sort-group.t
 create mode 100644 t/data/sd-ticket-create-verbose.tmpl
 create mode 100644 t/data/sd-ticket-create.tmpl
 create mode 100644 t/data/sd-ticket-update-all-props.tmpl
 create mode 100644 t/data/sd-ticket-update-verbose-all-props.tmpl
 create mode 100644 t/data/sd-ticket-update-verbose.tmpl
 create mode 100644 t/data/sd-ticket-update.tmpl
 create mode 100644 t/no-email.t
 create mode 100644 t/sd-dispatcher.t
 create mode 100644 t/sd-gcode/basic.t
 create mode 100644 t/sd-github/basic.t
 create mode 100644 t/sd-hm/attachments.t
 rename t/{sd-hm.t => sd-hm/basics.t} (66%)
 create mode 100644 t/sd-hm/comments.t
 create mode 100644 t/sd-hm/comments1.t
 create mode 100644 t/sd-hm/group.t
 create mode 100644 t/sd-hm/push-reporter-not-pro.t
 create mode 100644 t/sd-hm/push-reporter-pro.t
 create mode 100644 t/sd-hm/tag.t
 create mode 100644 t/sd-hm/update.t
 create mode 100644 t/sd-lighthouse/basic.t
 create mode 100644 t/sd-lighthouse/real-push.t
 create mode 100644 t/sd-log.t
 create mode 100644 t/sd-redmine/README
 create mode 100644 t/sd-redmine/basic.t
 create mode 100644 t/sd-redmine/clone.t
 create mode 100755 t/sd-redmine/net_redmine_test.pl
 delete mode 100644 t/sd-rt.t
 create mode 100644 t/sd-rt/basic.t
 create mode 100644 t/sd-rt/bogus-rt-data.t
 create mode 100644 t/sd-rt/pull-owner.t
 create mode 100644 t/sd-rt/pull-watchers.t
 create mode 100644 t/sd-rt/race-condition.t
 create mode 100644 t/sd-rt/rt-auto-open-conflict.t
 create mode 100644 t/sd-rt/sd-rt-hm-single.t
 copy t/{ => sd-rt}/sd-rt-hm.t (87%)
 rename t/{sd-rt-hm.t => sd-rt/sd-rt-n-foreign-sync.t} (53%)
 create mode 100644 t/sd-rt/sd-rt-permission.t
 create mode 100644 t/sd-trac/basic.t
 create mode 100644 t/sd-trac/push-comment.t
 create mode 100644 t/sd-trac/push-new-ticket-to-trac-then-pull.t
 create mode 100644 t/sd-trac/setup_trac.pl
 create mode 100644 t/sd-usage.t
 create mode 100644 t/server.t
 create mode 100644 tools/shipwright-package
 create mode 100644 tools/shipwright-package-minimal
 rename {t => xt/release}/00-dependencies.t (97%)
 create mode 100644 xt/release/99-pod-coverage.t
 create mode 100644 xt/release/99-pod.t

- Log -----------------------------------------------------------------
commit f2f887c4a0330dd903d2f299af3dd40ef76d960e
Author: Christine Spang <spang at bestpractical.com>
Date:   Wed Aug 26 18:22:28 2009 +0100

    Wrap long lines in PullEncoder.pm

diff --git a/lib/App/SD/ForeignReplica/PullEncoder.pm b/lib/App/SD/ForeignReplica/PullEncoder.pm
index fefe3af..308ae4c 100644
--- a/lib/App/SD/ForeignReplica/PullEncoder.pm
+++ b/lib/App/SD/ForeignReplica/PullEncoder.pm
@@ -43,19 +43,22 @@ sub transcode_ticket {
     my @changesets;
 
     if ( my $ticket_last_modified = $self->ticket_last_modified($ticket) ) {
-
-        $last_modified = $ticket_last_modified if ( !$last_modified || $ticket_last_modified > $last_modified );
+        $last_modified = $ticket_last_modified
+            if ( !$last_modified || $ticket_last_modified > $last_modified );
     }
 
     my $transactions = $self->find_matching_transactions(
         ticket               => $ticket,
-        starting_transaction => $self->sync_source->app_handle->handle->last_changeset_from_source(
+        starting_transaction =>
+            $self->sync_source->app_handle->handle->last_changeset_from_source(
             $self->sync_source->uuid_for_remote_id( $self->ticket_id($ticket) )
-            ) || 1
+            ) || 1,
     );
 
     my $changesets;
-    ( $last_modified, $changesets ) = $self->transcode_history( $ticket, $transactions, $last_modified );
+    ( $last_modified, $changesets ) = $self->transcode_history(
+        $ticket, $transactions, $last_modified );
+
     return ( $last_modified, $changesets );
 }
 
@@ -71,12 +74,15 @@ sub transcode_history {
 
     # Walk transactions newest to oldest.
     my $txn_counter         = 0;
-    my ($initial_state, $final_state)          = $self->translate_ticket_state($ticket, $transactions);
+    my ($initial_state, $final_state)
+        = $self->translate_ticket_state($ticket, $transactions);
 
 
     for my $txn ( sort { $b->{'serial'} <=> $a->{'serial'} } @$transactions ) {
-        $last_modified = $txn->{timestamp} if ( !$last_modified || ( $txn->{timestamp} > $last_modified ) );
-        $self->sync_source->log_debug( "$ticket_id Transcoding transaction " . ++$txn_counter . " of " . scalar @$transactions );
+        $last_modified = $txn->{timestamp}
+            if ( !$last_modified || ( $txn->{timestamp} > $last_modified ) );
+        $self->sync_source->log_debug( "$ticket_id Transcoding transaction "
+            . ++$txn_counter . " of " . scalar @$transactions );
 
         my $changeset = $self->transcode_one_txn( $txn, $initial_state, $final_state );
         next unless $changeset && $changeset->has_changes;
@@ -115,16 +121,17 @@ modified before that datetime
 sub _only_pull_tickets_modified_after {
     my $self = shift;
 
-    # last modified date is in GMT and searches are in user-time XXX -check assumption
-    # because of this, we really want to back that date down by one day to catch overlap
-    # XXX TODO we are playing FAST AND LOOSE WITH DATE MATH
+    # last modified date is in GMT and searches are in user-time XXX -check
+    # assumption because of this, we really want to back that date down by one
+    # day to catch overlap
+    # XXX TODO we are playing FAST AND LOOSE WITH DATE
     # XXX TODO THIS WILL HURT US SOME DAY
     # At that time, Jesse will buy you a beer.
     my $last_pull = $self->sync_source->upstream_last_modified_date();
     return undef unless $last_pull;
     my $before = App::SD::Util::string_to_datetime($last_pull);
-    die "Failed to parse '" . $self->sync_source->upstream_last_modified_date() . "' as a timestamp"
-        unless ($before);
+    die "Failed to parse '" . $self->sync_source->upstream_last_modified_date()
+        . "' as a timestamp" unless ($before);
 
     # 26 hours ago deals with most any possible timezone/dst edge case
     $before->subtract( hours => 26 );
@@ -133,8 +140,8 @@ sub _only_pull_tickets_modified_after {
 }
 
 sub new_comment_creation_change {
-	my $self = shift;
-	return Prophet::Change->new(
+    my $self = shift;
+    return Prophet::Change->new(
         {
             record_type => 'comment',
             record_uuid =>  $self->sync_source->uuid_generator->create_str()

commit 5a9fdaef1630b31d67b3cbab16637e24ddb3ff1c
Author: Christine Spang <spang at bestpractical.com>
Date:   Wed Aug 26 18:24:01 2009 +0100

    Add debbugs deps to Makefile.PL

diff --git a/Makefile.PL b/Makefile.PL
index 75e5f87..58ea538 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -68,6 +68,11 @@ feature 'Lighthouse sync' => (
     'Net::Lighthouse' => 0.01,
 );
 
+feature 'Debbugs sync (experimental)' => (
+    -default     => 0,
+    'SOAP::Lite' => 0,
+);
+
 install_script('bin/sd');
 install_script('bin/git-sd');
 install_script('bin/darcs-sd');

commit 1311d4ed8aaccfcebcebee31bb9e1bcbdbf12417
Author: Christine Spang <spang at bestpractical.com>
Date:   Sun Sep 6 22:50:45 2009 -0400

    add missing stubs in ForeignReplica.pm for methods that subclasses must implement

diff --git a/lib/App/SD/ForeignReplica/PullEncoder.pm b/lib/App/SD/ForeignReplica/PullEncoder.pm
index 308ae4c..a6b090e 100644
--- a/lib/App/SD/ForeignReplica/PullEncoder.pm
+++ b/lib/App/SD/ForeignReplica/PullEncoder.pm
@@ -34,7 +34,7 @@ sub run {
     return [ sort { App::SD::Util::string_to_datetime($a->created) <=> App::SD::Util::string_to_datetime( $b->created) } @changesets];
 }
 
-sub ticket_last_modified { undef}
+sub ticket_last_modified { undef }
 
 sub transcode_ticket {
     my $self          = shift;
@@ -93,6 +93,13 @@ sub transcode_history {
     return ( $last_modified, \@changesets );
 }
 
+sub find_matching_tickets {
+    die 'find_matching_transactions must be implemented';
+}
+
+sub find_matching_transactions {
+    die 'find_matching_transactions must be implemented';
+}
 
 sub translate_ticket_state {
     die 'translate_ticket_state must be implemented';

commit 3f84da7dc72997a80a9428f0f716892dc7a2c12d
Author: Christine Spang <spang at bestpractical.com>
Date:   Thu Aug 5 15:39:51 2010 -0400

    remove trailing whitespace in ForeignReplica.pm

diff --git a/lib/App/SD/ForeignReplica.pm b/lib/App/SD/ForeignReplica.pm
index aa76108..21484f0 100644
--- a/lib/App/SD/ForeignReplica.pm
+++ b/lib/App/SD/ForeignReplica.pm
@@ -76,32 +76,32 @@ sub record_pushed_transactions {
     my $earliest_valid_txn_date;
 
     # walk through every transaction on the ticket, starting with the latest
-    
+
     for my $txn ( $self->get_txn_list_by_date($args{ticket}) ) {
-       
+
         # walk backwards through all transactions on the ticket we just updated
         # Skip any transaction where the remote user isn't me, this might include any transaction
         # RT created with a scrip on your behalf
-   
+
         next unless $txn->{creator} eq $self->foreign_username;
 
         # get the completion time _after_ we do our next round trip to rt to try to make sure
         # a bit of lag doesn't skew us to the wrong side of a 1s boundary
-      
-     
+
+
        if (!$earliest_valid_txn_date){
             my $change_window =  time() - $args{start_time};
             # skip any transaction created more than 5 seconds before the push started.
             # I can't think of any reason that number shouldn't be 1, but clocks are fickle
-            $earliest_valid_txn_date = $txn->{created} - ($change_window + 5); 
-        }      
+            $earliest_valid_txn_date = $txn->{created} - ($change_window + 5);
+        }
 
         last if $txn->{created} < $earliest_valid_txn_date;
 
         # if the transaction id is older than the id of the last changeset
         # we got from the original source of this changeset, we're done
         last if $txn->{id} <= $self->app_handle->handle->last_changeset_from_source($args{changeset}->original_source_uuid);
-        
+
         # if the transaction from RT is more recent than the most recent
         # transaction we got from the original source of the changeset
         # then we should record that we sent that transaction upstream
@@ -113,11 +113,11 @@ sub record_pushed_transactions {
         );
     }
 }
-    
+
 
 =head2 record_pushed_transaction $foreign_transaction_id, $changeset
 
-Record that this replica was the original source of $foreign_transaction_id 
+Record that this replica was the original source of $foreign_transaction_id
 (with changeset $changeset)
 
 =cut
@@ -149,7 +149,7 @@ once we've done a pull from the remote replica, we can safely expire
 all records of this type for the remote replica (they'll be
 obsolete)
 
-We use this cache to avoid integrating changesets we've pushed to the 
+We use this cache to avoid integrating changesets we've pushed to the
 remote replica when doing a subsequent pull
 
 =cut
@@ -226,7 +226,7 @@ sub remote_uri_path_for_id {
 
 =head2 uuid_for_remote_id $id
 
-lookup the uuid for the remote record id. If we don't find it, 
+lookup the uuid for the remote record id. If we don't find it,
 construct it out of the remote url and the remote uri path for the record id;
 
 =cut

commit 1cbe1ac3cf67225d1f64c2fd9d781bf641e30cd4
Author: Christine Spang <spang at bestpractical.com>
Date:   Thu Aug 5 15:41:06 2010 -0400

    cleanups, POD additions, interface additions

diff --git a/lib/App/SD/ForeignReplica/PullEncoder.pm b/lib/App/SD/ForeignReplica/PullEncoder.pm
index a6b090e..15b1762 100644
--- a/lib/App/SD/ForeignReplica/PullEncoder.pm
+++ b/lib/App/SD/ForeignReplica/PullEncoder.pm
@@ -36,6 +36,17 @@ sub run {
 
 sub ticket_last_modified { undef }
 
+=head2 transcode_ticket $ticket, $last_modified
+
+Morph a ticket's history into changesets.
+
+XXX what is last_modified for? currently it is always passed in as undef
+and seems to do nothing
+
+Return ($last_modified, $changesets).
+
+=cut
+
 sub transcode_ticket {
     my $self          = shift;
     my $ticket        = shift;
@@ -62,14 +73,21 @@ sub transcode_ticket {
     return ( $last_modified, $changesets );
 }
 
+=head2 transcode_history $ticket $transactions $last_modified
+
+Translates transactions from the foreign source for the given ticket and
+returns an updated last_modified date and a set of Prophet::ChangeSet objects
+that correspond to the transactions.
+
+=cut
 
 sub transcode_history {
     my $self          = shift;
     my $ticket        = shift;
     my $transactions  = shift;
     my $last_modified = shift;
-    my $ticket_id     = $self->ticket_id($ticket);
 
+    my $ticket_id     = $self->ticket_id($ticket);
     my @changesets;
 
     # Walk transactions newest to oldest.
@@ -81,14 +99,17 @@ sub transcode_history {
     for my $txn ( sort { $b->{'serial'} <=> $a->{'serial'} } @$transactions ) {
         $last_modified = $txn->{timestamp}
             if ( !$last_modified || ( $txn->{timestamp} > $last_modified ) );
+
         $self->sync_source->log_debug( "$ticket_id Transcoding transaction "
             . ++$txn_counter . " of " . scalar @$transactions );
 
-        my $changeset = $self->transcode_one_txn( $txn, $initial_state, $final_state );
-        next unless $changeset && $changeset->has_changes;
-
-        # the changesets are older than the ones that came before, so they goes first
-        unshift @changesets, $changeset;
+        my $changeset = $self->transcode_one_txn(
+            $txn, $initial_state, $final_state );
+        if ( $changeset && $changeset->has_changes ) {
+            # the new changeset is older than the ones that came before, so it
+            # goes first
+            unshift @changesets, $changeset;
+        }
     }
     return ( $last_modified, \@changesets );
 }
@@ -105,6 +126,10 @@ sub translate_ticket_state {
     die 'translate_ticket_state must be implemented';
 }
 
+sub transcode_one_txn {
+    die 'transcode_one_txn must be implemented';
+}
+
 sub warp_list_to_old_value {
     my $self    = shift;
     my $current = shift;

commit 14dd37ebfabd3c973d83b119fdc05b7ee80f036a
Author: Christine Spang <spang at bestpractical.com>
Date:   Fri Aug 6 15:22:24 2010 -0400

    sorta working import

diff --git a/lib/App/SD/Replica/debbugs.pm b/lib/App/SD/Replica/debbugs.pm
index 115ffc2..8b7ca65 100644
--- a/lib/App/SD/Replica/debbugs.pm
+++ b/lib/App/SD/Replica/debbugs.pm
@@ -2,17 +2,15 @@ package App::SD::Replica::debbugs;
 use Any::Moose;
 extends qw/App::SD::ForeignReplica/;
 
-use Params::Validate qw(:all);
 use Memoize;
 
-use Prophet::ChangeSet;
-
 use constant scheme => 'debbugs';
+use constant pull_encoder => 'App::SD::Replica::debbugs::PullEncoder';
+use constant push_encoder => 'App::SD::Replica::debbugs::PushEncoder';
 
-# FIXME: what should this actually be?
-has debbugs => ( isa => 'Net::Debbugs', is => 'rw');
-has remote_url => ( isa => 'Str', is => 'rw');
-has debbugs_query => ( isa => 'Str', is => 'rw');
+has debbugs    => ( isa => 'SOAP::Lite', is   => 'rw' );
+has remote_url => ( isa => 'Str', is          => 'rw');
+has query      => ( isa => 'HashRef', is      => 'rw');
 
 =head2 BUILD
 
@@ -24,15 +22,56 @@ sub BUILD {
     my $self = shift;
 
     # require any specific libs needed by this foreign replica
+    require SOAP::Lite;
+
+    # parse the given url / query
+    my ($server, $query) = $self->{url} =~ m/^debbugs:(.*?)\|(.*)$/;
+    print "\n$server\n";
+    print $query . "\n";
+    ($server, $query) = $self->{url} =~ m/^debbugs:(.*?)\|(.*)$/
+        or die "Can't parse debbugs query. "
+            . "Expected debbugs:http://bugs.example.org|QUERY.\n";
+    # QUERY looks like: submitter=spang at mit.edu,owner=spang at mit.edu
+
+    # $self->remote_url( "$server/cgi-bin/soap.cgi" );
+    $self->remote_url( $server );
 
-    # parse the given url
-    # my ($foo, $bar, $baz) = $self->{url} =~ m/regex-here/
+    # XXX TODO make this more robust (quoted values etc)
+    my %query_hash = split /=|,/, $query;
+    # use Data::Dump qw(pp);
+    # pp %query_hash;
 
-    # ...
+    # queries to support: all things that are passed to get_status, get_newest
+    $self->query( \%query_hash );
+
+    # debbugs sync does not require auth
+    $self->debbugs(SOAP::Lite->uri('Debbugs/SOAP')->proxy($self->remote_url));
 }
 
 sub record_pushed_transactions {}
 
+=head2 uuid
+
+Return the replica's UUID
+XXX cut-n-paste directly from RT sync, should move to ForeignReplica?
+
+=cut
+
+sub uuid {
+    my $self = shift;
+    return $self->uuid_for_url( join( '/', $self->remote_url, $self->query ) );
+
+}
+
+=head2 remote_uri_path_for_id
+
+=cut
+
+sub remote_uri_path_for_id {
+    my ($self, $id) = @_;
+    return "/cgi-bin/bugreport.cgi?bug=$id";
+}
+
 __PACKAGE__->meta->make_immutable;
 no Any::Moose;
 1;
diff --git a/lib/App/SD/Replica/debbugs/PullEncoder.pm b/lib/App/SD/Replica/debbugs/PullEncoder.pm
index a523f4e..a65f2b6 100644
--- a/lib/App/SD/Replica/debbugs/PullEncoder.pm
+++ b/lib/App/SD/Replica/debbugs/PullEncoder.pm
@@ -1,87 +1,524 @@
 package App::SD::Replica::debbugs::PullEncoder;
 use Any::Moose;
+extends 'App::SD::ForeignReplica::PullEncoder';
 
 use Params::Validate qw(:all);
 use Memoize;
+use Mail::Address qw();
+
+use Prophet::ChangeSet;
+use Prophet::Change;
+
+use DateTime;
 
 has sync_source => (
     isa => 'App::SD::Replica::debbugs',
     is => 'rw',
 );
 
-our $DEBUG = $Prophet::Handle::DEBUG;
+my $DEBUG = 1;
+
+# methods used in RUN
+
+=head2 ticket_last_modified $ticket
+
+Given a ticket, returns when it was last modified.
+
+XXX what format should this be in?
+
+=cut
+
+# used in transcode_ticket, which is called from RUN
+sub ticket_last_modified {
+    my ($self, $ticket) = @_;
+
+    return $ticket->{last_modified};
+}
+
+=head2 ticket_id $ticket
+
+Given a ticket, returns its ID. In the case of Debbugs,
+this is the bug's bug number.
+
+=cut
+
+sub ticket_id {
+    my ($self, $ticket) = @_;
+
+    return $ticket->{id};
+}
+
+=head2 find_matching_tickets( query => QUERY )
+
+Looks up ticket numbers matching the query and returns an arrayref listing
+their statuses.
+
+This method is called from App::SD::ForeignReplica::PullEncoder's run method,
+and is the first method called there.
 
-sub run {
+=cut
+
+sub find_matching_tickets {
     my $self = shift;
-    my %args = validate( @_, {
-            # mandatory args go here
-            example => 1,
+    my %args = @_;
+
+    if ( $DEBUG ) {
+        print "* query is:\n";
+        use Data::Dump qw(pp);
+        pp $args{query};
+    }
+
+    # XXX TODO: sanity-check the query (don't try to send anything to debbugs
+    # that it doesn't understand)
+
+    # an arrayref of bug numbers
+    my $bug_numbers;
+
+    if ( $args{query}->{bugnumber} ) {
+        $bug_numbers = [ $args{query}->{bugnumber} ];
+    }
+    else {
+        $bug_numbers
+            = $self->sync_source->debbugs->get_bugs( %{ $args{query} } )->result();
+    }
+
+    if ( $DEBUG ) {
+        print "* matching bug numbers:\n";
+        pp $bug_numbers;
+    }
+
+    # we also need to get the bug statuses, because we'll need some more
+    # information in the ticket objects than just the bug numbers, for
+    # the API that SD gives us
+    my $bug_statuses = $self->sync_source->debbugs->get_status(
+        @{ $bug_numbers } )->result();
+
+    # it's OK to throw away the keys because the hashes for each bug
+    # still have the bug number in them (under the key 'id')
+    my @bug_statuses = values %{ $bug_statuses };
+
+    return wantarray ? @bug_statuses : \@bug_statuses;
+}
+
+=head2 find_matching_transactions { ticket => $id, starting_transaction => $num  }
+
+Returns a reference to an array of all transactions (as hashes) on ticket $id
+after transaction $num.
+
+XXX this method assumes that the foreign source has GLOBAL SEQUENCE NUMBER.
+How do we work around this?
+
+=cut
+
+sub find_matching_transactions {
+    my $self = shift;
+    my %args = validate( @_, { ticket => 1, starting_transaction => 1 } );
+
+    if ( $DEBUG ) {
+        warn "* find_matching_transactions\n";
+    }
+
+    # get_machine_readable_bug_log guarantees returned transactions to
+    # be in order from oldest to newest
+    my @raw_txns
+        = @{ $self->sync_source->debbugs->get_machine_readable_bug_log(
+            $self->ticket_id( $args{ticket} ))->result() };
+
+    my @txns;
+    # XXX this is mostly copy-pasted from the trac sync
+    for my $txn ( @raw_txns ) {
+        my $txn_id = $txn->{log_entry_num};
+
+        # we need to use the datetime representation an awful
+        # lot, so might as well only create it once, here
+        $txn->{date} = DateTime->from_epoch( epoch => $txn->{time} );
+
+        # Skip things we know we've already pulled
+        next if $txn_id < ( $args{'starting_transaction'} || 0 );
+        # Skip things we've pushed
+        next if ($self->sync_source->foreign_transaction_originated_locally(
+                $txn_id, $self->ticket_id( $args{'ticket'} )));
+
+        # ok. it didn't originate locally. we might want to integrate it
+        # XXX what is the difference between timestamp and serial?
+        push @txns, { timestamp => $txn->{time},
+                      serial => $txn_id,
+                      object => $txn};
+    }
+    $self->sync_source->log_debug('Done looking at pulled txns');
+    return \@txns;
+
+}
+
+=head2 translate_ticket_state
+
+XXX wtf is this supposed to do?
+
+=cut
+
+sub translate_ticket_state {
+    my $self          = shift;
+    my $ticket_object = shift;
+    my $transactions = shift;
+
+    if ( $DEBUG ) {
+        warn "* translate_ticket_state\n";
+    }
+
+    my $created = DateTime->from_epoch( epoch => $ticket_object->{date} );
+
+    my $ticket_data = {
+
+        $self->sync_source->uuid . '-id' => $self->ticket_id( $ticket_object ),
+
+        status      => $self->_determine_bug_status( $ticket_object ),
+        created     => ( $created->ymd . " " . $created->hms ),
+
+        owner       => ( $ticket_object->{owner} || undef ),
+        reporter    => ( $ticket_object->{originator} || undef ),
+        title       => ( $ticket_object->{subject} || undef ),
+        tags        => ( $ticket_object->{tags} || undef ),
+        package     => ( $ticket_object->{package} || undef ),
+        severity    => ( $ticket_object->{severity} || undef ),
+    };
+
+    # # delete undefined and empty fields
+    # delete $ticket_data->{$_}
+    #     for grep !defined $ticket_data->{$_} || $ticket_data->{$_} eq '', keys %$ticket_data;
+
+    return ($ticket_object, $ticket_data);
+}
+
+=head2 transcode_one_txn $txn_wrapper, $ticket, $ticket_final
+
+Turn a single transaction into a Prophet ChangeSet. May
+return zero or one changesets (some transactions aren't
+worth creating changesets for).
+
+=cut
+
+# XXX mostly stolen from the trac replica
+sub transcode_one_txn {
+    my ( $self, $txn_wrapper, $ticket, $ticket_final ) = (@_);
+
+    if ( $DEBUG ) {
+        warn "* transcode_one_txn\n";
+    }
+
+    my $txn = $txn_wrapper->{object};
+
+    # for now we're not recording outgoing messages locally; most
+    # of them are boring (and one is always present before the actual
+    # incoming message that creates the bug, which is a slight
+    # complexity that we'd prefer to ignore for now.
+
+    # return if ( $txn->{type} eq 'outgoing-message' );
+
+    # XXX testing
+    if ( $DEBUG ) {
+        unless ( $txn->{type} eq 'create' ) {
+            warn "- skipping txn with type $txn->{type}\n";
+            return;
         }
+    }
+
+    # my $ticket_uuid = $self->sync_source->uuid_for_remote_id(
+    #     $ticket->{ $self->sync_source->uuid . '-id' } );
+    my $ticket_uuid = $self->sync_source->uuid_for_remote_id( $ticket->{id} );
+
+    my %transcode_dispatch = (
+        'create'           => \&_transcode_create_txn,
+        'close'            => \&_transcode_close_txn,
+        'change'           => \&_transcode_change_txn,
+        'incoming-message' => \&_transcode_comment_txn,
     );
 
-    # TODO: code goes here
+    my $sub = $transcode_dispatch{ $txn->{type} };
+
+    if ( $sub ) {
+        warn "- dispatching to $txn->{type}\n";
+        return $sub->( $self, $txn, $ticket, $ticket_final, $ticket_uuid );
+    }
+    else {
+        die "Attempt to transcode unknown log entry type '$txn->{type}'.".
+            "Please update debbugs bridge for changed API!\n";
+    }
 }
 
-our %PROP_MAP = (
-    remote_prop             => 'sd_prop',
-    # ...
+=head2 database_settings
+
+Custom settings for this foreign replica.
+
+=cut
+
+sub database_settings {
+    my $self = shift;
+
+    my @resolutions = qw(fixed wontfix);
+
+    my @active_statuses = qw(open pending blocked);
+
+    return {
+        active_statuses => [@active_statuses],
+        statuses => [ @active_statuses, @resolutions ],
+    };
 }
 
-=head2 translate_prop_names L<Prophet::ChangeSet>
+=head1 INTERNAL FUNCTIONS
+
+This stuff isn't required by the SD foreign replica API; they're merely used
+internally to this module and called by things that are implementing part of
+the interface.
 
 =cut
 
-sub translate_prop_names {
-    my $self      = shift;
-    my $changeset = shift;
+sub _determine_bug_status {
+    my ($self, $ticket_obj) = @_;
 
-    # ...
+    if ( $ticket_obj->{archived} ) {
+        return 'archived';
+    }
+    elsif ( $ticket_obj->{fixed} ) {
+        return 'fixed';
+    }
+    elsif ( $ticket_obj->{blockedby} ) {
+        return 'blocked';
+    }
+    elsif ( $ticket_obj->{pending} eq 'pending-fixed' ) {
+        return 'pending';
+    }
+    else {
+        return 'open';
+    }
+}
+
+sub _transcode_create_txn {
+    my ($self, $txn, $ticket, $ticket_final, $ticket_uuid) = @_;
+
+    use Data::Dump qw(pp);
+    warn pp $txn;
+
+    my $changeset = $self->_create_changeset(
+        $txn, $ticket_uuid,
+        $self->resolve_user_id_to_email( $txn->{submitter} ),
+    );
+
+    my $change = Prophet::Change->new(
+        {   record_type => 'ticket',
+            record_uuid => $ticket_uuid,
+            change_type => 'add_file'
+        }
+    );
+
+    for my $prop ( qw(package severity version) ) {
+        $change->add_prop_change(
+            name => $prop,
+            old => '',
+            new => $txn->{pseudo_headers}->{$prop},
+        );
+    }
+
+    $change->add_prop_change(
+        name => 'subject',
+        old => '',
+        new => $txn->{title},
+    );
+
+    $change->add_prop_change(
+        name => 'reporter',
+        old => '',
+        new => $txn->{submitter},
+    );
+
+    $changeset->add_change( { change => $change } );
+
+    # creates basically always have comments too
+    my $comment = $self->_create_new_comment( $txn, $ticket_uuid );
+
+    if ( $comment ) {
+        $changeset->add_change( { change => $comment } );
+    }
 
     return $changeset;
 }
 
-=head2 resolve_user_id_to_email ID
+sub _create_changeset {
+    my ($self, $txn, $ticket_uuid, $creator) = @_;
+
+    my $changeset = Prophet::ChangeSet->new(
+        {   original_source_uuid => $ticket_uuid,
+            original_sequence_no => $txn->{id},
+            creator => $creator,
+            created => $txn->{date}->ymd . " " . $txn->{date}->hms
+        }
+    );
 
-This is only implemented in Hiveminder::PullEncoder; in RT::PullEncoder
-it's resolve_user_id_to. What's this for, actually?
+    return $changeset;
+}
+
+sub _transcode_comment_txn {
+    my ($self, $txn, $ticket, $ticket_final, $ticket_uuid) = @_;
+
+    my $changeset = $self->_create_changeset(
+        $txn, $ticket_uuid,
+        $self->resolve_user_id_to_email( $txn->{from} ),
+    );
+
+    my $comment = $self->_create_new_comment( $txn, $ticket_uuid );
+
+    if ( $comment ) {
+        $changeset->add_change( { change => $comment } );
+    }
+}
+
+=head2 _create_new_comment $txn, $ticket_uuid
+
+Given a transaction and a ticket UUID, creates a new comment based on the email
+body. May return undef if the message was blank.
 
 =cut
 
-sub resolve_user_id_to_email {
-    my $self = shift;
-    my $id   = shift;
-    return undef unless ($id);
+sub _create_new_comment {
+    my ($self, $txn, $ticket_uuid) = @_;
 
-    # ...
+    my $message = $txn->{body};
+    my $comment = $self->new_comment_creation_change();
+
+    if ( $message !~ /^\s*$/s ) {
+        $comment->add_prop_change(
+            name => 'created',
+            new => $txn->{date}->ymd . ' ' . $txn->{date}->hms,
+        );
+        $comment->add_prop_change(
+            name => 'creator',
+            new => $self->resolve_user_id_to_email( $txn->{from} ),
+        );
+        $comment->add_prop_change( name => 'content', new => $message );
+        $comment->add_prop_change(
+            name => 'content_type',
+            new => 'text/plain',
+        );
+        $comment->add_prop_change( name => 'ticket', new => $ticket_uuid );
 
-    # returns email address mapping to user id
+        return $comment;
+    }
 }
 
-memoize 'resolve_user_id_to_email';
+sub _transcode_close_txn {
+    my ($self, $txn, $ticket, $ticket_final, $ticket_uuid) = @_;
+
+    my $changeset = $self->_create_changeset(
+        $txn, $ticket_uuid,
+        $self->resolve_user_id_to_email( $txn->{from} ),
+    );
+
+    my $change = Prophet::Change->new(
+        {   record_type => 'ticket',
+            record_uuid => $ticket_uuid,
+            change_type => 'update_file'
+        }
+    );
+
+    $change->add_prop_change(
+        name => 'status',
+        # XXX how to determine the previous state of this bug?
+        old => 'unknown',
+        new => 'fixed',
+    );
+
+    # mails to nnnnnn-close@ always contain a comment too, but
+    # there's also the BTS close command -- this stuff should
+    # be abstracted away by the server-side code in the SOAP call
+    my $comment = $self->_create_new_comment( $txn, $ticket_uuid );
+
+    if ( $comment ) {
+        $changeset->add_change( { change => $comment } );
+    }
+
+    return $changeset;
+}
+
+sub _transcode_change_txn {
+    my ($self, $txn, $ticket, $ticket_final, $ticket_uuid) = @_;
+
+    # changes from old bugs that don't record metadata in the log are ignored
+    # for now, because they're a pain to parse (and if you go back far enough,
+    # nothing at all is actually recorded)
+    if ( $txn->{command} ) {
+        my $changeset = Prophet::ChangeSet->new(
+            {   original_source_uuid => $ticket_uuid,
+                original_sequence_no => $txn->{id},
+                creator => $self->resolve_user_id_to_email( $txn->{from} ),
+                created => $txn->{date}->ymd . " " . $txn->{date}->hms
+            }
+        );
+
+        my $change = Prophet::Change->new(
+            {   record_type => 'ticket',
+                record_uuid => $ticket_uuid,
+                change_type => 'update_file'
+            }
+        );
+
+        for my $prop ( keys %{ $txn->{old_data} } ) {
+            $prop = lc $prop;
+            $change->add_prop_change(
+                # XXX are we doing any translation between debbugs and SD
+                # with %PROP_MAP?
+                name => $prop,
+                old  => $txn->{old_data}->{$prop},
+                new  => $txn->{new_data}->{$prop},
+            );
+        }
+
+        $changeset->add_change( { change => $change } )
+            if $change->has_prop_changes;
+
+        return $changeset->has_changes ? $changeset : undef;
+    }
+}
 
-=head2 find_matching_tickets QUERY
+# our %PROP_MAP = (
+#     package                 => 'component',
+#     originator              => 'reporter',
+#     # remote_prop => 'sd_prop',
+# );
+
+=head2 translate_prop_names L<Prophet::ChangeSet>
 
 =cut
 
-sub find_matching_tickets {
-    my $self = shift;
-    my ($query) = validate_pos(@_, 1);
-    return $self->sync_source->rt->search( type => 'ticket', query => $query );
+sub translate_prop_names {
+    my $self      = shift;
+    my $changeset = shift;
+
+    # ...
+
+    return $changeset;
 }
 
-=head2 find_matching_transactions TASK, START
+=head2 resolve_user_id_to_email ID
+
+Transform a remote user id to an email address. In the case of
+debbugs, we just parse the full address and return only the
+address part, for now.
 
 =cut
 
-sub find_matching_transactions {
+sub resolve_user_id_to_email {
     my $self = shift;
-    my %args = validate( @_, { task => 1, starting_transaction => 1 } );
+    my $id   = shift;
 
-    # ...
+    # we'll throw away the name for now
+    my $email = Mail::Address->parse( $id );
+
+    return $email;
 
-    return \@matched;
 }
 
+memoize 'resolve_user_id_to_email';
+
 __PACKAGE__->meta->make_immutable;
 no Any::Moose;
+
 1;

commit 4b923cb34c2578f837d995847897d38bd12607e3
Author: Christine Spang <spang at bestpractical.com>
Date:   Fri Aug 6 15:46:59 2010 -0400

    oh hey it kinda works

diff --git a/lib/App/SD/Replica/debbugs/PullEncoder.pm b/lib/App/SD/Replica/debbugs/PullEncoder.pm
index a65f2b6..2f5492e 100644
--- a/lib/App/SD/Replica/debbugs/PullEncoder.pm
+++ b/lib/App/SD/Replica/debbugs/PullEncoder.pm
@@ -330,6 +330,12 @@ sub _transcode_create_txn {
         new => $txn->{submitter},
     );
 
+    $change->add_prop_change(
+        name => 'status',
+        old => '',
+        new => 'open',
+    );
+
     $changeset->add_change( { change => $change } );
 
     # creates basically always have comments too
@@ -347,7 +353,7 @@ sub _create_changeset {
 
     my $changeset = Prophet::ChangeSet->new(
         {   original_source_uuid => $ticket_uuid,
-            original_sequence_no => $txn->{id},
+            original_sequence_no => $txn->{log_entry_num},
             creator => $creator,
             created => $txn->{date}->ymd . " " . $txn->{date}->hms
         }

commit 60b1b2a011b139fb78b798a97993e8b254b8ce63
Author: Christine Spang <spang at bestpractical.com>
Date:   Sat Aug 7 00:14:39 2010 -0400

    integrate changesets other than creates

diff --git a/lib/App/SD/Replica/debbugs/PullEncoder.pm b/lib/App/SD/Replica/debbugs/PullEncoder.pm
index 2f5492e..25021cb 100644
--- a/lib/App/SD/Replica/debbugs/PullEncoder.pm
+++ b/lib/App/SD/Replica/debbugs/PullEncoder.pm
@@ -22,9 +22,8 @@ my $DEBUG = 1;
 
 =head2 ticket_last_modified $ticket
 
-Given a ticket, returns when it was last modified.
-
-XXX what format should this be in?
+Given a ticket, returns when it was last modified
+as a unix epoch.
 
 =cut
 
@@ -37,7 +36,7 @@ sub ticket_last_modified {
 
 =head2 ticket_id $ticket
 
-Given a ticket, returns its ID. In the case of Debbugs,
+Given a ticket, returns its ID from the foreign source. In the case of Debbugs,
 this is the bug's bug number.
 
 =cut
@@ -146,8 +145,8 @@ sub find_matching_transactions {
                       object => $txn};
     }
     $self->sync_source->log_debug('Done looking at pulled txns');
-    return \@txns;
 
+    return \@txns;
 }
 
 =head2 translate_ticket_state
@@ -180,13 +179,13 @@ sub translate_ticket_state {
         tags        => ( $ticket_object->{tags} || undef ),
         package     => ( $ticket_object->{package} || undef ),
         severity    => ( $ticket_object->{severity} || undef ),
+        id          => ( $ticket_object->{id} || undef ),
     };
 
-    # # delete undefined and empty fields
-    # delete $ticket_data->{$_}
-    #     for grep !defined $ticket_data->{$_} || $ticket_data->{$_} eq '', keys %$ticket_data;
-
-    return ($ticket_object, $ticket_data);
+    # $ticket will be updated as we walk backwards through log entries.
+    # Eventually, $ticket should be the beginning state of the ticket
+    # (just after create).
+    return ($ticket_data, $ticket_data);
 }
 
 =head2 transcode_one_txn $txn_wrapper, $ticket, $ticket_final
@@ -212,15 +211,15 @@ sub transcode_one_txn {
     # incoming message that creates the bug, which is a slight
     # complexity that we'd prefer to ignore for now.
 
-    # return if ( $txn->{type} eq 'outgoing-message' );
+    return if ( $txn->{type} eq 'outgoing-message' );
 
     # XXX testing
-    if ( $DEBUG ) {
-        unless ( $txn->{type} eq 'create' ) {
-            warn "- skipping txn with type $txn->{type}\n";
-            return;
-        }
-    }
+    # if ( $DEBUG ) {
+    #     unless ( $txn->{type} eq 'create' ) {
+    #         warn "- skipping txn with type $txn->{type}\n";
+    #         return;
+    #     }
+    # }
 
     # my $ticket_uuid = $self->sync_source->uuid_for_remote_id(
     #     $ticket->{ $self->sync_source->uuid . '-id' } );
@@ -254,9 +253,9 @@ Custom settings for this foreign replica.
 sub database_settings {
     my $self = shift;
 
-    my @resolutions = qw(fixed wontfix);
+    my @resolutions = qw(closed wontfix);
 
-    my @active_statuses = qw(open pending blocked);
+    my @active_statuses = qw(open pending stalled);
 
     return {
         active_statuses => [@active_statuses],
@@ -279,10 +278,10 @@ sub _determine_bug_status {
         return 'archived';
     }
     elsif ( $ticket_obj->{fixed} ) {
-        return 'fixed';
+        return 'closed';
     }
     elsif ( $ticket_obj->{blockedby} ) {
-        return 'blocked';
+        return 'stalled';
     }
     elsif ( $ticket_obj->{pending} eq 'pending-fixed' ) {
         return 'pending';
@@ -295,8 +294,8 @@ sub _determine_bug_status {
 sub _transcode_create_txn {
     my ($self, $txn, $ticket, $ticket_final, $ticket_uuid) = @_;
 
-    use Data::Dump qw(pp);
-    warn pp $txn;
+    # use Data::Dump qw(pp);
+    # warn pp $txn;
 
     my $changeset = $self->_create_changeset(
         $txn, $ticket_uuid,
@@ -319,7 +318,7 @@ sub _transcode_create_txn {
     }
 
     $change->add_prop_change(
-        name => 'subject',
+        name => 'summary',
         old => '',
         new => $txn->{title},
     );
@@ -336,10 +335,17 @@ sub _transcode_create_txn {
         new => 'open',
     );
 
+    $change->add_prop_change(
+        name => 'debian-id',
+        old => '',
+        new => $ticket->{id},
+    );
+
     $changeset->add_change( { change => $change } );
 
     # creates basically always have comments too
-    my $comment = $self->_create_new_comment( $txn, $ticket_uuid );
+    my $comment = $self->_create_new_comment( $txn, $ticket_uuid,
+        $self->resolve_user_id_to_email( $txn->{submitter} ) );
 
     if ( $comment ) {
         $changeset->add_change( { change => $comment } );
@@ -365,15 +371,23 @@ sub _create_changeset {
 sub _transcode_comment_txn {
     my ($self, $txn, $ticket, $ticket_final, $ticket_uuid) = @_;
 
+    my %to_hash = map { $_ => 1 } @{ $txn->{to} };
+
+    # don't record control messages; their data should be recorded
+    # elsewhere
+    return if $to_hash{'control at bugs.debian.org'};
+
     my $changeset = $self->_create_changeset(
         $txn, $ticket_uuid,
         $self->resolve_user_id_to_email( $txn->{from} ),
     );
 
-    my $comment = $self->_create_new_comment( $txn, $ticket_uuid );
+    my $comment = $self->_create_new_comment( $txn, $ticket_uuid,
+        $self->resolve_user_id_to_email( $txn->{from} ) );
 
     if ( $comment ) {
         $changeset->add_change( { change => $comment } );
+        return $changeset;
     }
 }
 
@@ -385,7 +399,7 @@ body. May return undef if the message was blank.
 =cut
 
 sub _create_new_comment {
-    my ($self, $txn, $ticket_uuid) = @_;
+    my ($self, $txn, $ticket_uuid, $creator) = @_;
 
     my $message = $txn->{body};
     my $comment = $self->new_comment_creation_change();
@@ -397,7 +411,7 @@ sub _create_new_comment {
         );
         $comment->add_prop_change(
             name => 'creator',
-            new => $self->resolve_user_id_to_email( $txn->{from} ),
+            new => $creator,
         );
         $comment->add_prop_change( name => 'content', new => $message );
         $comment->add_prop_change(
@@ -427,15 +441,18 @@ sub _transcode_close_txn {
 
     $change->add_prop_change(
         name => 'status',
-        # XXX how to determine the previous state of this bug?
+        # XXX how to determine the previous state of this bug? we
+        # don't really know it
         old => 'unknown',
-        new => 'fixed',
+        new => 'closed',
     );
+    $ticket->{status} = 'closed';
 
     # mails to nnnnnn-close@ always contain a comment too, but
     # there's also the BTS close command -- this stuff should
     # be abstracted away by the server-side code in the SOAP call
-    my $comment = $self->_create_new_comment( $txn, $ticket_uuid );
+    my $comment = $self->_create_new_comment( $txn, $ticket_uuid,
+        $self->resolve_user_id_to_email( $txn->{from} ) );
 
     if ( $comment ) {
         $changeset->add_change( { change => $comment } );
@@ -451,12 +468,9 @@ sub _transcode_change_txn {
     # for now, because they're a pain to parse (and if you go back far enough,
     # nothing at all is actually recorded)
     if ( $txn->{command} ) {
-        my $changeset = Prophet::ChangeSet->new(
-            {   original_source_uuid => $ticket_uuid,
-                original_sequence_no => $txn->{id},
-                creator => $self->resolve_user_id_to_email( $txn->{from} ),
-                created => $txn->{date}->ymd . " " . $txn->{date}->hms
-            }
+        my $changeset = $self->_create_changeset(
+            $txn, $ticket_uuid,
+            $self->resolve_user_id_to_email( $txn->{requester} ),
         );
 
         my $change = Prophet::Change->new(
@@ -466,16 +480,38 @@ sub _transcode_change_txn {
             }
         );
 
-        for my $prop ( keys %{ $txn->{old_data} } ) {
-            $prop = lc $prop;
-            $change->add_prop_change(
-                # XXX are we doing any translation between debbugs and SD
-                # with %PROP_MAP?
-                name => $prop,
-                old  => $txn->{old_data}->{$prop},
-                new  => $txn->{new_data}->{$prop},
-            );
+        # it turns out we probably want to do different things
+        # for each available command
+        my %transcode_change_dispatch = (
+            'tag'           => \&_transcode_tag_change,
+            'package'       => \&_transcode_package_change,
+            'submitter'     => \&_transcode_submitter_change,
+        );
+
+        my $sub = $transcode_change_dispatch{ $txn->{command} };
+
+        if ( $sub ) {
+            warn "- dispatching to $txn->{command}\n";
+            $sub->( $self, $txn, $ticket, $ticket_final, $change);
         }
+        else {
+            use Data::Dump qw(pp);
+            pp $txn;
+            die "Attempt to transcode unknown change command ".
+                "'$txn->{command}'. Please update debbugs bridge for ".
+                "changed API!\n";
+        }
+
+        # for my $prop ( keys %{ $txn->{old_data} } ) {
+        #     $prop = lc $prop;
+        #     $change->add_prop_change(
+        #         # XXX are we doing any translation between debbugs and SD
+        #         # with %PROP_MAP?
+        #         name => $prop,
+        #         old  => $txn->{old_data}->{$prop},
+        #         new  => $txn->{new_data}->{$prop},
+        #     );
+        # }
 
         $changeset->add_change( { change => $change } )
             if $change->has_prop_changes;
@@ -484,24 +520,98 @@ sub _transcode_change_txn {
     }
 }
 
+sub _transcode_tag_change {
+    my ($self, $txn, $ticket, $ticket_final, $change) = @_;
+
+    my %old_keywords = map { $_ => 1 }
+        split( / /, $txn->{old_data}->{keywords} );
+    my %new_keywords = map { $_ => 1 }
+        split( / /, $txn->{new_data}->{keywords} );
+
+    my (%additions, %subtractions);
+    for my $new_keyword ( keys %new_keywords ) {
+        $additions{ $new_keyword } = 1 unless $old_keywords{ $new_keyword };
+    }
+    for my $old_keyword ( keys %old_keywords ) {
+        $subtractions{ $old_keyword } = 1 unless $new_keywords{ $old_keyword };
+    }
+
+    # sometimes we need to do special things based on keywords, e.g.
+    # for 'pending', which affects status, not keywords
+    if ( $additions{pending} ) {
+        $change->add_prop_change(
+            name => 'status',
+            # XXX how to determine previous status?
+            old  => 'unknown',
+            new  => 'pending',
+        );
+        $ticket->{status} = 'pending';
+        delete $new_keywords{pending};
+    }
+    elsif ( $subtractions{pending} ) {
+        my $old_status = $ticket->{status};
+        $ticket->{status} = 'pending';
+        $change->add_prop_change(
+            name => 'status',
+            old  => $old_status,
+            new  => $self->_determine_bug_status( $ticket ),
+        );
+        delete $old_keywords{pending};
+    }
+
+    # pending can change at the same time as other keyword
+    # additions / subtractions, so add those too if they exist
+    if ( keys %old_keywords || keys %new_keywords ) {
+        $change->add_prop_change(
+            name => 'tags',
+            old  => join( ' ', sort keys %old_keywords ),
+            new  => join( ' ', sort keys %new_keywords ),
+        );
+        $ticket->{tags} = join( ' ', sort keys %new_keywords );
+    }
+}
+
+# this happens when a bug is reassigned to a different package
+sub _transcode_package_change {
+    my ($self, $txn, $ticket, $ticket_final, $change) = @_;
+
+    $change->add_prop_change(
+        name => 'package',
+        old => $txn->{old_data}->{package},
+        new => $txn->{new_data}->{package},
+    );
+    $ticket->{package} = $txn->{new_data}->{package};
+}
+
+sub _transcode_submitter_change {
+    my ($self, $txn, $ticket, $ticket_final, $change) = @_;
+
+    $change->add_prop_change(
+        name => 'reporter',
+        old => $txn->{old_data}->{originator},
+        new => $txn->{new_data}->{originator},
+    );
+    $ticket->{reporter} = $txn->{old_data}->{originator};
+}
+
 # our %PROP_MAP = (
 #     package                 => 'component',
 #     originator              => 'reporter',
 #     # remote_prop => 'sd_prop',
 # );
 
-=head2 translate_prop_names L<Prophet::ChangeSet>
+# =head2 translate_prop_names L<Prophet::ChangeSet>
 
-=cut
+# =cut
 
-sub translate_prop_names {
-    my $self      = shift;
-    my $changeset = shift;
+# sub translate_prop_names {
+#     my $self      = shift;
+#     my $changeset = shift;
 
-    # ...
+#     # ...
 
-    return $changeset;
-}
+#     return $changeset;
+# }
 
 =head2 resolve_user_id_to_email ID
 
@@ -515,11 +625,10 @@ sub resolve_user_id_to_email {
     my $self = shift;
     my $id   = shift;
 
-    # we'll throw away the name for now
-    my $email = Mail::Address->parse( $id );
-
-    return $email;
+    my @addrs = Mail::Address->parse( $id );
 
+    # we'll throw away the name for now
+    return $addrs[0]->address;
 }
 
 memoize 'resolve_user_id_to_email';

-----------------------------------------------------------------------



More information about the Bps-public-commit mailing list