<!DOCTYPE html><html><head><title></title><style type="text/css">p.MsoNormal,p.MsoNoSpacing{margin:0}</style></head><body><div style="" class="markdown-here-wrapper"><p style="margin: 0px 0px 1.2em !important;">Hey, remember last month when <a href="https://lists.andrew.cmu.edu/pipermail/cyrus-devel/2019-November/004509.html">I asked about releasing Cyrus v3.2</a>?</p>
<p style="margin: 0px 0px 1.2em !important;">That thread had some more conversation about what needs to get done before v3.2, and I wanted to come back to it and turn some things on their head.</p>
<p style="margin: 0px 0px 1.2em !important;">Right now, we’re talking about Cyrus releases being feature-bound.  “We’ll release v3.2 when feature X is done.”  I think we’re not being well-served by that.  As feature X is delayed (for various reasons that we can’t easily eliminate), it doesn’t just delay the feature, but also all the other minor bugfixes and optimizations that we’ve made in the master branch.  Also, it sets up the idea that we delay releases for the sake of fixes, instead of releasing the fixes that are ready.</p>
<p style="margin: 0px 0px 1.2em !important;">That is:  every additional criteria for a new release is another doorway to delay.  Instead of opening those doors, I would rather try to eliminate all of them.</p>
<p style="margin: 0px 0px 1.2em !important;">I propose that instead of tying releases to milestones, we tie them to the calendar.  For the sake of full disclosure: I am modeling this suggestion on <a href="https://metacpan.org/pod/perlpolicy">the release cycle of perl</a>, which I ran for several years.  I found the process more than satisfactory, then.</p>
<ol style="margin: 1.2em 0px;padding-left: 2em;">
<li style="margin: 0.5em 0px;"><p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">A new <em>unstable release</em> of Cyrus is made every month.  We promise only that it compiled and passed the Cassandane test suite on the release manager’s computer.  It might contain regressions from previous unstable releases, it might have crashers or corruptors.  We try to avoid any of these, but the goal here is a snapshot for easy month-to-month testing.  These are the odd-middle-digit releases.  (3.3.x)</p>
</li>
<li style="margin: 0.5em 0px;"><p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">A new <em>major release</em> of Cyrus is made every year.  We will have tested it on as many configurations as we can readily test.  We will have, some time before the release, frozen the branch for risky changes, to reduce churn.  In the meantime, new work lives in feature branches.  (The changelogs from each unstable release provide a good basis for the whole-year changelog!) These are the even-middle-digit third-digit-zero releases. (3.4.0)</p>
</li>
<li style="margin: 0.5em 0px;"><p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">A new <em>maintenance release</em> of Cyrus is made for the last two stable releases when there are enough fixes to critical bugs to warrant it.  These are the even-middle-digit third-digit-nonzero releases (3.4.1)</p>
</li>
</ol>
<p style="margin: 0px 0px 1.2em !important;">For the above to work, some more properties need to be maintained.</p>
<p style="margin: 0px 0px 1.2em !important;">Maintenance releases should be no-brainers to install, so they must only fix regressions, crashers, security vulnerabilities, and the like.  This means that once you’re on 3.4.0, you can always upgrade within the 3.4 series with a minimum risk.  It also means you get no optimizations, features, and the like.</p>
<p style="margin: 0px 0px 1.2em !important;">Major releases must clearly document any incompatible changes or upgrade steps required.  Because non-regression bugfixes aren’t backported, we want everyone to be able to upgrade from major release to major release, so incompatible changes must be kept to a minimum.</p>
<p style="margin: 0px 0px 1.2em !important;">In part, this is just “don’t kill off a feature people use just because it’s a little annoying.”  The more important one is “don’t introduce half-baked things that might need to change,” because people will come to rely on them before you get the updates finished.  For features that will require multiple years to get right, they have to go behind a default-off configuration option.  I’d strongly suggest they all have a uniform substring like “unstable”.  That way, when a complaint comes in that the behavior of JMAP calendaring has changed, we can reply, “well, to use it, you had to turn on the unstable_jmap_calendaring” option.</p>
<p style="margin: 0px 0px 1.2em !important;">If we go with this policy, we’ll need to…</p>
<ol style="margin: 1.2em 0px;padding-left: 2em;">
<li style="margin: 0.5em 0px;"><p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">identify what issues are <em>blockers</em> to v3.2.0, meaning they’re regressions from v3.0 and would reasonably prevent someone from upgrading; this does <em>not</em> include all known bugs, since they may be bugs that already exist in the last stable release!</p>
</li>
<li style="margin: 0.5em 0px;"><p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">pick a release target for v3.2.0; I will arbitrarily suggest March 2 as “not too far off, but far off enough that we can get things in order”; also, if you’re American, March 2 is 3/2 ;-)</p>
</li>
<li style="margin: 0.5em 0px;"><p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">produce a changleog, and especially identify what changes in master need documentation as “incompatible changes”</p>
</li>
<li style="margin: 0.5em 0px;"><p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">produce a list of changes in master that should be put behind an unstable configuration option and then do it</p>
</li>
<li style="margin: 0.5em 0px;"><p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">decide when to stop merging non-release-related things to master</p>
</li>
<li style="margin: 0.5em 0px;"><p style="margin: 0px 0px 1.2em !important;margin: 0.5em 0px !important;">make a plan for who will do monthly snapshot releases</p>
</li>
</ol>
<p style="margin: 0px 0px 1.2em !important;">I’ve spoken with ellie and Bron about just a few of these, such that I don’t think it’s all crazy.  (ellie notes, correctly, I think, that the first set of releases like this will be the hard ones, where we work out things like “how do we keep track of incompatibilities, upgrade steps, and also how do we make snapshots dead easy to release.”)  If there’s general agreement, I am definitely ready to pitch in and help try to make it work!</p>
<p style="margin: 0px 0px 1.2em !important;">—<br>rjbs</p>
<div style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;" title="MDH:PGRpdiBjbGFzcz0ibWFya2Rvd24taGVyZS13cmFwcGVyIiBkYXRhLW1kLXVybD0iZG9nZm9vZC5m
YXN0bWFpbC5jb20iIHN0eWxlPSIiIG1hcmtkb3duLWhlcmUtd3JhcHBlci1jb250ZW50LW1vZGlm
aWVkPSJ0cnVlIj48L2Rpdj48ZGl2PkhleSwgcmVtZW1iZXIgbGFzdCBtb250aCB3aGVuIFtJIGFz
a2VkIGFib3V0IHJlbGVhc2luZyBDeXJ1czxicj48L2Rpdj48ZGl2PnYzLjJdKDxhIGhyZWY9Imh0
dHBzOi8vbGlzdHMuYW5kcmV3LmNtdS5lZHUvcGlwZXJtYWlsL2N5cnVzLWRldmVsLzIwMTktTm92
ZW1iZXIvMDA0NTA5Lmh0bWwiPmh0dHBzOi8vbGlzdHMuYW5kcmV3LmNtdS5lZHUvcGlwZXJtYWls
L2N5cnVzLWRldmVsLzIwMTktTm92ZW1iZXIvMDA0NTA5Lmh0bWw8L2E+KT88YnI+PC9kaXY+PGRp
dj48YnI+PC9kaXY+PGRpdj5UaGF0IHRocmVhZCBoYWQgc29tZSBtb3JlIGNvbnZlcnNhdGlvbiBh
Ym91dCB3aGF0IG5lZWRzIHRvIGdldCBkb25lIGJlZm9yZSB2My4yLCBhbmQgSSB3YW50ZWQgdG8g
Y29tZSBiYWNrIHRvIGl0IGFuZCB0dXJuIHNvbWUgdGhpbmdzIG9uIHRoZWlyIGhlYWQuPGJyPjwv
ZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+UmlnaHQgbm93LCB3ZSdyZSB0YWxraW5nIGFib3V0IEN5
cnVzIHJlbGVhc2VzIGJlaW5nIGZlYXR1cmUtYm91bmQuJm5ic3A7ICJXZSdsbCByZWxlYXNlIHYz
LjIgd2hlbiBmZWF0dXJlIFggaXMgZG9uZS4iJm5ic3A7IEkgdGhpbmsgd2UncmUgbm90IGJlaW5n
IHdlbGwtc2VydmVkIGJ5IHRoYXQuJm5ic3A7IEFzIGZlYXR1cmUgWCBpcyBkZWxheWVkIChmb3Ig
dmFyaW91cyByZWFzb25zIHRoYXQgd2UgY2FuJ3QgZWFzaWx5IGVsaW1pbmF0ZSksIGl0IGRvZXNu
J3QganVzdCBkZWxheSB0aGUgZmVhdHVyZSwgYnV0IGFsc28gYWxsIHRoZSBvdGhlciBtaW5vciBi
dWdmaXhlcyBhbmQgb3B0aW1pemF0aW9ucyB0aGF0IHdlJ3ZlIG1hZGUgaW4gdGhlIG1hc3RlciBi
cmFuY2guJm5ic3A7IEFsc28sIGl0IHNldHMgdXAgdGhlIGlkZWEgdGhhdCB3ZSBkZWxheSByZWxl
YXNlcyBmb3IgdGhlIHNha2Ugb2YgZml4ZXMsIGluc3RlYWQgb2YgcmVsZWFzaW5nIHRoZSBmaXhl
cyB0aGF0IGFyZSByZWFkeS48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaGF0IGlzOiZu
YnNwOyBldmVyeSBhZGRpdGlvbmFsIGNyaXRlcmlhIGZvciBhIG5ldyByZWxlYXNlIGlzIGFub3Ro
ZXIgZG9vcndheSB0byBkZWxheS4mbmJzcDsgSW5zdGVhZCBvZiBvcGVuaW5nIHRob3NlIGRvb3Jz
LCBJIHdvdWxkIHJhdGhlciB0cnkgdG8gZWxpbWluYXRlIGFsbCBvZiB0aGVtLjxicj48L2Rpdj48
ZGl2Pjxicj48L2Rpdj48ZGl2PkkgcHJvcG9zZSB0aGF0IGluc3RlYWQgb2YgdHlpbmcgcmVsZWFz
ZXMgdG8gbWlsZXN0b25lcywgd2UgdGllIHRoZW0gdG8gdGhlIGNhbGVuZGFyLiZuYnNwOyBGb3Ig
dGhlIHNha2Ugb2YgZnVsbCBkaXNjbG9zdXJlOiBJIGFtIG1vZGVsaW5nIHRoaXMgc3VnZ2VzdGlv
biBvbiBbdGhlIHJlbGVhc2UgY3ljbGUgb2YgcGVybF0oPGEgaHJlZj0iaHR0cHM6Ly9tZXRhY3Bh
bi5vcmcvcG9kL3Blcmxwb2xpY3kiPmh0dHBzOi8vbWV0YWNwYW4ub3JnL3BvZC9wZXJscG9saWN5
PC9hPiksIHdoaWNoIEkgcmFuIGZvciBzZXZlcmFsIHllYXJzLiZuYnNwOyBJIGZvdW5kIHRoZSBw
cm9jZXNzIG1vcmUgdGhhbiBzYXRpc2ZhY3RvcnksIHRoZW4uPGJyPjwvZGl2PjxkaXY+PGJyPjwv
ZGl2PjxkaXY+MS4mbmJzcDsgQSBuZXcgKnVuc3RhYmxlIHJlbGVhc2UqIG9mIEN5cnVzIGlzIG1h
ZGUgZXZlcnkgbW9udGguJm5ic3A7IFdlIHByb21pc2Ugb25seSB0aGF0IGl0IGNvbXBpbGVkIGFu
ZCBwYXNzZWQgdGhlIENhc3NhbmRhbmUgdGVzdCBzdWl0ZSBvbiB0aGUgcmVsZWFzZSBtYW5hZ2Vy
J3MgY29tcHV0ZXIuJm5ic3A7IEl0IG1pZ2h0IGNvbnRhaW4gcmVncmVzc2lvbnMgZnJvbSBwcmV2
aW91cyB1bnN0YWJsZSByZWxlYXNlcywgaXQgbWlnaHQgaGF2ZSBjcmFzaGVycyBvciBjb3JydXB0
b3JzLiZuYnNwOyBXZSB0cnkgdG8gYXZvaWQgYW55IG9mIHRoZXNlLCBidXQgdGhlIGdvYWwgaGVy
ZSBpcyBhIHNuYXBzaG90IGZvciBlYXN5IG1vbnRoLXRvLW1vbnRoIHRlc3RpbmcuJm5ic3A7IFRo
ZXNlIGFyZSB0aGUgb2RkLW1pZGRsZS1kaWdpdCByZWxlYXNlcy4mbmJzcDsgKDMuMy54KTxicj48
L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjIuJm5ic3A7IEEgbmV3ICptYWpvciByZWxlYXNlKiBv
ZiBDeXJ1cyBpcyBtYWRlIGV2ZXJ5IHllYXIuJm5ic3A7IFdlIHdpbGwgaGF2ZSB0ZXN0ZWQgaXQg
b24gYXMgbWFueSBjb25maWd1cmF0aW9ucyBhcyB3ZSBjYW4gcmVhZGlseSB0ZXN0LiZuYnNwOyBX
ZSB3aWxsIGhhdmUsIHNvbWUgdGltZSBiZWZvcmUgdGhlIHJlbGVhc2UsIGZyb3plbiB0aGUgYnJh
bmNoIGZvciByaXNreSBjaGFuZ2VzLCB0byByZWR1Y2UgY2h1cm4uJm5ic3A7IEluIHRoZSBtZWFu
dGltZSwgbmV3IHdvcmsgbGl2ZXMgaW4gZmVhdHVyZSBicmFuY2hlcy4mbmJzcDsgKFRoZSBjaGFu
Z2Vsb2dzIGZyb20gZWFjaCB1bnN0YWJsZSByZWxlYXNlIHByb3ZpZGUgYSBnb29kIGJhc2lzIGZv
ciB0aGUgd2hvbGUteWVhciBjaGFuZ2Vsb2chKSBUaGVzZSBhcmUgdGhlIGV2ZW4tbWlkZGxlLWRp
Z2l0IHRoaXJkLWRpZ2l0LXplcm8gcmVsZWFzZXMuICgzLjQuMCk8YnI+PC9kaXY+PGRpdj48YnI+
PC9kaXY+PGRpdj4zLiZuYnNwOyBBIG5ldyAqbWFpbnRlbmFuY2UgcmVsZWFzZSogb2YgQ3lydXMg
aXMgbWFkZSBmb3IgdGhlIGxhc3QgdHdvIHN0YWJsZSByZWxlYXNlcyB3aGVuIHRoZXJlIGFyZSBl
bm91Z2ggZml4ZXMgdG8gY3JpdGljYWwgYnVncyB0byB3YXJyYW50IGl0LiZuYnNwOyBUaGVzZSBh
cmUgdGhlIGV2ZW4tbWlkZGxlLWRpZ2l0IHRoaXJkLWRpZ2l0LW5vbnplcm8gcmVsZWFzZXMgKDMu
NC4xKTxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkZvciB0aGUgYWJvdmUgdG8gd29yaywg
c29tZSBtb3JlIHByb3BlcnRpZXMgbmVlZCB0byBiZSBtYWludGFpbmVkLjxicj48L2Rpdj48ZGl2
Pjxicj48L2Rpdj48ZGl2Pk1haW50ZW5hbmNlIHJlbGVhc2VzIHNob3VsZCBiZSBuby1icmFpbmVy
cyB0byBpbnN0YWxsLCBzbyB0aGV5IG11c3Qgb25seSBmaXggcmVncmVzc2lvbnMsIGNyYXNoZXJz
LCBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMsIGFuZCB0aGUgbGlrZS4mbmJzcDsgVGhpcyBtZWFu
cyB0aGF0IG9uY2UgeW91J3JlIG9uIDMuNC4wLCB5b3UgY2FuIGFsd2F5cyB1cGdyYWRlIHdpdGhp
biB0aGUgMy40IHNlcmllcyB3aXRoIGEgbWluaW11bSByaXNrLiZuYnNwOyBJdCBhbHNvIG1lYW5z
IHlvdSBnZXQgbm8gb3B0aW1pemF0aW9ucywgZmVhdHVyZXMsIGFuZCB0aGUgbGlrZS48YnI+PC9k
aXY+PGRpdj48YnI+PC9kaXY+PGRpdj5NYWpvciByZWxlYXNlcyBtdXN0IGNsZWFybHkgZG9jdW1l
bnQgYW55IGluY29tcGF0aWJsZSBjaGFuZ2VzIG9yIHVwZ3JhZGUgc3RlcHMgcmVxdWlyZWQuJm5i
c3A7IEJlY2F1c2Ugbm9uLXJlZ3Jlc3Npb24gYnVnZml4ZXMgYXJlbid0IGJhY2twb3J0ZWQsIHdl
IHdhbnQgZXZlcnlvbmUgdG8gYmUgYWJsZSB0byB1cGdyYWRlIGZyb20gbWFqb3IgcmVsZWFzZSB0
byBtYWpvciByZWxlYXNlLCBzbyBpbmNvbXBhdGlibGUgY2hhbmdlcyBtdXN0IGJlIGtlcHQgdG8g
YSBtaW5pbXVtLjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkluIHBhcnQsIHRoaXMgaXMg
anVzdCAiZG9uJ3Qga2lsbCBvZmYgYSBmZWF0dXJlIHBlb3BsZSB1c2UganVzdCBiZWNhdXNlIGl0
J3MgYSBsaXR0bGUgYW5ub3lpbmcuIiZuYnNwOyBUaGUgbW9yZSBpbXBvcnRhbnQgb25lIGlzICJk
b24ndCBpbnRyb2R1Y2UgaGFsZi1iYWtlZCB0aGluZ3MgdGhhdCBtaWdodCBuZWVkIHRvIGNoYW5n
ZSwiIGJlY2F1c2UgcGVvcGxlIHdpbGwgY29tZSB0byByZWx5IG9uIHRoZW0gYmVmb3JlIHlvdSBn
ZXQgdGhlIHVwZGF0ZXMgZmluaXNoZWQuJm5ic3A7IEZvciBmZWF0dXJlcyB0aGF0IHdpbGwgcmVx
dWlyZSBtdWx0aXBsZSB5ZWFycyB0byBnZXQgcmlnaHQsIHRoZXkgaGF2ZSB0byBnbyBiZWhpbmQg
YSBkZWZhdWx0LW9mZiBjb25maWd1cmF0aW9uIG9wdGlvbi4mbmJzcDsgSSdkIHN0cm9uZ2x5IHN1
Z2dlc3QgdGhleSBhbGwgaGF2ZSBhIHVuaWZvcm0gc3Vic3RyaW5nIGxpa2UgInVuc3RhYmxlIi4m
bmJzcDsgVGhhdCB3YXksIHdoZW4gYSBjb21wbGFpbnQgY29tZXMgaW4gdGhhdCB0aGUgYmVoYXZp
b3Igb2YgSk1BUCBjYWxlbmRhcmluZyBoYXMgY2hhbmdlZCwgd2UgY2FuIHJlcGx5LCAid2VsbCwg
dG8gdXNlIGl0LCB5b3UgaGFkIHRvIHR1cm4gb24gdGhlIHVuc3RhYmxlX2ptYXBfY2FsZW5kYXJp
bmciIG9wdGlvbi48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JZiB3ZSBnbyB3aXRoIHRo
aXMgcG9saWN5LCB3ZSdsbCBuZWVkIHRv4oCmPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+
MS4mbmJzcDsgaWRlbnRpZnkgd2hhdCBpc3N1ZXMgYXJlICpibG9ja2VycyogdG8gdjMuMi4wLCBt
ZWFuaW5nIHRoZXkncmUgcmVncmVzc2lvbnMgZnJvbSB2My4wIGFuZCB3b3VsZCByZWFzb25hYmx5
IHByZXZlbnQgc29tZW9uZSBmcm9tIHVwZ3JhZGluZzsgdGhpcyBkb2VzICpub3QqIGluY2x1ZGUg
YWxsIGtub3duIGJ1Z3MsIHNpbmNlIHRoZXkgbWF5IGJlIGJ1Z3MgdGhhdCBhbHJlYWR5IGV4aXN0
IGluIHRoZSBsYXN0IHN0YWJsZSByZWxlYXNlITxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2
PjIuJm5ic3A7IHBpY2sgYSByZWxlYXNlIHRhcmdldCBmb3IgdjMuMi4wOyBJIHdpbGwgYXJiaXRy
YXJpbHkgc3VnZ2VzdCBNYXJjaCAyIGFzICJub3QgdG9vIGZhciBvZmYsIGJ1dCBmYXIgb2ZmIGVu
b3VnaCB0aGF0IHdlIGNhbiBnZXQgdGhpbmdzIGluIG9yZGVyIjsgYWxzbywgaWYgeW91J3JlIEFt
ZXJpY2FuLCBNYXJjaCAyIGlzIDMvMiA7LSk8YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj4z
LiZuYnNwOyBwcm9kdWNlIGEgY2hhbmdsZW9nLCBhbmQgZXNwZWNpYWxseSBpZGVudGlmeSB3aGF0
IGNoYW5nZXMgaW4gbWFzdGVyIG5lZWQgZG9jdW1lbnRhdGlvbiBhcyAiaW5jb21wYXRpYmxlIGNo
YW5nZXMiPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+NC4mbmJzcDsgcHJvZHVjZSBhIGxp
c3Qgb2YgY2hhbmdlcyBpbiBtYXN0ZXIgdGhhdCBzaG91bGQgYmUgcHV0IGJlaGluZCBhbiB1bnN0
YWJsZSBjb25maWd1cmF0aW9uIG9wdGlvbiBhbmQgdGhlbiBkbyBpdDxicj48L2Rpdj48ZGl2Pjxi
cj48L2Rpdj48ZGl2PjUuJm5ic3A7IGRlY2lkZSB3aGVuIHRvIHN0b3AgbWVyZ2luZyBub24tcmVs
ZWFzZS1yZWxhdGVkIHRoaW5ncyB0byBtYXN0ZXI8YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp
dj42LiZuYnNwOyBtYWtlIGEgcGxhbiBmb3Igd2hvIHdpbGwgZG8gbW9udGhseSBzbmFwc2hvdCBy
ZWxlYXNlczxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkkndmUgc3Bva2VuIHdpdGggZWxs
aWUgYW5kIEJyb24gYWJvdXQganVzdCBhIGZldyBvZiB0aGVzZSwgc3VjaCB0aGF0IEkgZG9uJ3Qg
dGhpbmsgaXQncyBhbGwgY3JhenkuJm5ic3A7IChlbGxpZSBub3RlcywgY29ycmVjdGx5LCBJIHRo
aW5rLCB0aGF0IHRoZSBmaXJzdCBzZXQgb2YgcmVsZWFzZXMgbGlrZSB0aGlzIHdpbGwgYmUgdGhl
IGhhcmQgb25lcywgd2hlcmUgd2Ugd29yayBvdXQgdGhpbmdzIGxpa2UgImhvdyBkbyB3ZSBrZWVw
IHRyYWNrIG9mIGluY29tcGF0aWJpbGl0aWVzLCB1cGdyYWRlIHN0ZXBzLCBhbmQgYWxzbyBob3cg
ZG8gd2UgbWFrZSBzbmFwc2hvdHMgZGVhZCBlYXN5IHRvIHJlbGVhc2UuIikmbmJzcDsgSWYgdGhl
cmUncyBnZW5lcmFsIGFncmVlbWVudCwgSSBhbSBkZWZpbml0ZWx5IHJlYWR5IHRvIHBpdGNoIGlu
IGFuZCBoZWxwIHRyeSB0byBtYWtlIGl0IHdvcmshPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2Pjxk
aXY+LS08YnI+PC9kaXY+PGRpdj5yamJzPGJyPjwvZGl2Pg=="></div></div><div><br></div></body></html>