From c6715bbb8b7f896b6482dd05c3418ab5ad835b99 Mon Sep 17 00:00:00 2001 From: Marcin Wojciechowski Date: Tue, 2 Jun 2015 10:23:22 +0100 Subject: [PATCH 1/2] Added VS2015 support VS2015 support + solution upgraded to 2013 + .NET upgraded to 4.6 --- GoToDef.csproj | 21 ++++++++++++++++++--- GoToDef.sln | 6 ++++-- source.extension.vsixmanifest | 5 ++++- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/GoToDef.csproj b/GoToDef.csproj index d7c0237..c863444 100644 --- a/GoToDef.csproj +++ b/GoToDef.csproj @@ -1,5 +1,6 @@  - + + Debug AnyCPU @@ -11,9 +12,16 @@ Properties GoToDef GoToDef - v4.0 + v4.6 512 false + 12.0 + + + + + 4.0 + true @@ -23,6 +31,7 @@ DEBUG;TRACE prompt 4 + false pdbonly @@ -31,6 +40,7 @@ TRACE prompt 4 + false @@ -104,8 +114,13 @@ + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + - + + + \ No newline at end of file diff --git a/Backup/GoToDef.sln b/Backup/GoToDef.sln new file mode 100644 index 0000000..a0373fd --- /dev/null +++ b/Backup/GoToDef.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GoToDef", "GoToDef.csproj", "{25815605-0093-48EC-A89B-44F70EBDED65}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {25815605-0093-48EC-A89B-44F70EBDED65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {25815605-0093-48EC-A89B-44F70EBDED65}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25815605-0093-48EC-A89B-44F70EBDED65}.Release|Any CPU.ActiveCfg = Release|Any CPU + {25815605-0093-48EC-A89B-44F70EBDED65}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Backup/GoToDefMouseHandler.cs b/Backup/GoToDefMouseHandler.cs new file mode 100644 index 0000000..c653ae7 --- /dev/null +++ b/Backup/GoToDefMouseHandler.cs @@ -0,0 +1,355 @@ +using System; +using System.ComponentModel.Composition; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Input; +using Microsoft.VisualStudio; +using Microsoft.VisualStudio.Editor; +using Microsoft.VisualStudio.OLE.Interop; +using Microsoft.VisualStudio.Shell.Interop; +using Microsoft.VisualStudio.Text; +using Microsoft.VisualStudio.Text.Classification; +using Microsoft.VisualStudio.Text.Editor; +using Microsoft.VisualStudio.Text.Operations; +using Microsoft.VisualStudio.Utilities; +using Microsoft.VisualStudio.Shell; + +namespace GoToDef +{ + [Export(typeof(IKeyProcessorProvider))] + [TextViewRole(PredefinedTextViewRoles.Document)] + [ContentType("code")] + [Name("GotoDef")] + [Order(Before = "VisualStudioKeyboardProcessor")] + internal sealed class GoToDefKeyProcessorProvider : IKeyProcessorProvider + { + public KeyProcessor GetAssociatedProcessor(IWpfTextView view) + { + return view.Properties.GetOrCreateSingletonProperty(typeof(GoToDefKeyProcessor), + () => new GoToDefKeyProcessor(CtrlKeyState.GetStateForView(view))); + } + } + + /// + /// The state of the control key for a given view, which is kept up-to-date by a combination of the + /// key processor and the mouse process + /// + internal sealed class CtrlKeyState + { + internal static CtrlKeyState GetStateForView(ITextView view) + { + return view.Properties.GetOrCreateSingletonProperty(typeof(CtrlKeyState), () => new CtrlKeyState()); + } + + bool _enabled = false; + + internal bool Enabled + { + get + { + // Check and see if ctrl is down but we missed it somehow. + bool ctrlDown = (Keyboard.Modifiers & ModifierKeys.Control) != 0 && + (Keyboard.Modifiers & ModifierKeys.Shift) == 0; + if (ctrlDown != _enabled) + Enabled = ctrlDown; + + return _enabled; + } + set + { + bool oldVal = _enabled; + _enabled = value; + if (oldVal != _enabled) + { + var temp = CtrlKeyStateChanged; + if (temp != null) + temp(this, new EventArgs()); + } + } + } + + internal event EventHandler CtrlKeyStateChanged; + } + + /// + /// Listen for the control key being pressed or released to update the CtrlKeyStateChanged for a view. + /// + internal sealed class GoToDefKeyProcessor : KeyProcessor + { + CtrlKeyState _state; + + public GoToDefKeyProcessor(CtrlKeyState state) + { + _state = state; + } + + void UpdateState(KeyEventArgs args) + { + _state.Enabled = (args.KeyboardDevice.Modifiers & ModifierKeys.Control) != 0 && + (args.KeyboardDevice.Modifiers & ModifierKeys.Shift) == 0; + } + + public override void PreviewKeyDown(KeyEventArgs args) + { + UpdateState(args); + } + + public override void PreviewKeyUp(KeyEventArgs args) + { + UpdateState(args); + } + } + + [Export(typeof(IMouseProcessorProvider))] + [TextViewRole(PredefinedTextViewRoles.Document)] + [ContentType("code")] + [Name("GotoDef")] + [Order(Before = "WordSelection")] + internal sealed class GoToDefMouseHandlerProvider : IMouseProcessorProvider + { + [Import] + IClassifierAggregatorService AggregatorFactory = null; + + [Import] + ITextStructureNavigatorSelectorService NavigatorService = null; + + [Import] + SVsServiceProvider GlobalServiceProvider = null; + + public IMouseProcessor GetAssociatedProcessor(IWpfTextView view) + { + var buffer = view.TextBuffer; + + IOleCommandTarget shellCommandDispatcher = GetShellCommandDispatcher(view); + + if (shellCommandDispatcher == null) + return null; + + return new GoToDefMouseHandler(view, + shellCommandDispatcher, + AggregatorFactory.GetClassifier(buffer), + NavigatorService.GetTextStructureNavigator(buffer), + CtrlKeyState.GetStateForView(view)); + } + + #region Private helpers + + /// + /// Get the SUIHostCommandDispatcher from the global service provider. + /// + IOleCommandTarget GetShellCommandDispatcher(ITextView view) + { + return GlobalServiceProvider.GetService(typeof(SUIHostCommandDispatcher)) as IOleCommandTarget; + } + + #endregion + } + + /// + /// Handle ctrl+click on valid elements to send GoToDefinition to the shell. Also handle mouse moves + /// (when control is pressed) to highlight references for which GoToDefinition will (likely) be valid. + /// + internal sealed class GoToDefMouseHandler : MouseProcessorBase + { + IWpfTextView _view; + CtrlKeyState _state; + IClassifier _aggregator; + ITextStructureNavigator _navigator; + IOleCommandTarget _commandTarget; + + public GoToDefMouseHandler(IWpfTextView view, IOleCommandTarget commandTarget, IClassifier aggregator, + ITextStructureNavigator navigator, CtrlKeyState state) + { + _view = view; + _commandTarget = commandTarget; + _state = state; + _aggregator = aggregator; + _navigator = navigator; + + _state.CtrlKeyStateChanged += (sender, args) => + { + if (_state.Enabled) + this.TryHighlightItemUnderMouse(RelativeToView(Mouse.PrimaryDevice.GetPosition(_view.VisualElement))); + else + this.SetHighlightSpan(null); + }; + + // Some other points to clear the highlight span: + + _view.LostAggregateFocus += (sender, args) => this.SetHighlightSpan(null); + _view.VisualElement.MouseLeave += (sender, args) => this.SetHighlightSpan(null); + } + + #region Mouse processor overrides + + // Remember the location of the mouse on left button down, so we only handle left button up + // if the mouse has stayed in a single location. + Point? _mouseDownAnchorPoint; + + public override void PostprocessMouseLeftButtonDown(MouseButtonEventArgs e) + { + _mouseDownAnchorPoint = RelativeToView(e.GetPosition(_view.VisualElement)); + } + + public override void PreprocessMouseMove(MouseEventArgs e) + { + if (!_mouseDownAnchorPoint.HasValue && _state.Enabled && e.LeftButton == MouseButtonState.Released) + { + TryHighlightItemUnderMouse(RelativeToView(e.GetPosition(_view.VisualElement))); + } + else if (_mouseDownAnchorPoint.HasValue) + { + // Check and see if this is a drag; if so, clear out the highlight. + var currentMousePosition = RelativeToView(e.GetPosition(_view.VisualElement)); + if (InDragOperation(_mouseDownAnchorPoint.Value, currentMousePosition)) + { + _mouseDownAnchorPoint = null; + this.SetHighlightSpan(null); + } + } + } + + private bool InDragOperation(Point anchorPoint, Point currentPoint) + { + // If the mouse up is more than a drag away from the mouse down, this is a drag + return Math.Abs(anchorPoint.X - currentPoint.X) >= SystemParameters.MinimumHorizontalDragDistance || + Math.Abs(anchorPoint.Y - currentPoint.Y) >= SystemParameters.MinimumVerticalDragDistance; + } + + public override void PreprocessMouseLeave(MouseEventArgs e) + { + _mouseDownAnchorPoint = null; + } + + public override void PreprocessMouseUp(MouseButtonEventArgs e) + { + if (_mouseDownAnchorPoint.HasValue && _state.Enabled) + { + var currentMousePosition = RelativeToView(e.GetPosition(_view.VisualElement)); + + if (!InDragOperation(_mouseDownAnchorPoint.Value, currentMousePosition)) + { + _state.Enabled = false; + + this.SetHighlightSpan(null); + _view.Selection.Clear(); + this.DispatchGoToDef(); + + e.Handled = true; + } + } + + _mouseDownAnchorPoint = null; + } + + #endregion + + #region Private helpers + + Point RelativeToView(Point position) + { + return new Point(position.X + _view.ViewportLeft, position.Y + _view.ViewportTop); + } + + bool TryHighlightItemUnderMouse(Point position) + { + bool updated = false; + + try + { + var line = _view.TextViewLines.GetTextViewLineContainingYCoordinate(position.Y); + if (line == null) + return false; + + var bufferPosition = line.GetBufferPositionFromXCoordinate(position.X); + + if (!bufferPosition.HasValue) + return false; + + // Quick check - if the mouse is still inside the current underline span, we're already set + var currentSpan = CurrentUnderlineSpan; + if (currentSpan.HasValue && currentSpan.Value.Contains(bufferPosition.Value)) + { + updated = true; + return true; + } + + var extent = _navigator.GetExtentOfWord(bufferPosition.Value); + if (!extent.IsSignificant) + return false; + + // For C#, we ignore namespaces after using statements - GoToDef will fail for those + if (_view.TextBuffer.ContentType.IsOfType("csharp")) + { + string lineText = bufferPosition.Value.GetContainingLine().GetText().Trim(); + if (lineText.StartsWith("using", StringComparison.OrdinalIgnoreCase)) + return false; + } + + // Now, check for valid classification type. C# and C++ (at least) classify the things we are interested + // in as either "identifier" or "user types" (though "identifier" will yield some false positives). VB, unfortunately, + // doesn't classify identifiers. + foreach (var classification in _aggregator.GetClassificationSpans(extent.Span)) + { + var name = classification.ClassificationType.Classification.ToLower(); + if ((name.Contains("identifier") || name.Contains("user types")) && + SetHighlightSpan(classification.Span)) + { + updated = true; + return true; + } + } + + // No update occurred, so return false + return false; + } + finally + { + if (!updated) + SetHighlightSpan(null); + } + } + + SnapshotSpan? CurrentUnderlineSpan + { + get + { + var classifier = UnderlineClassifierProvider.GetClassifierForView(_view); + if (classifier != null && classifier.CurrentUnderlineSpan.HasValue) + return classifier.CurrentUnderlineSpan.Value.TranslateTo(_view.TextSnapshot, SpanTrackingMode.EdgeExclusive); + else + return null; + } + } + + bool SetHighlightSpan(SnapshotSpan? span) + { + var classifier = UnderlineClassifierProvider.GetClassifierForView(_view); + if (classifier != null) + { + if (span.HasValue) + Mouse.OverrideCursor = Cursors.Hand; + else + Mouse.OverrideCursor = null; + + classifier.SetUnderlineSpan(span); + return true; + } + + return false; + } + + bool DispatchGoToDef() + { + Guid cmdGroup = VSConstants.GUID_VSStandardCommandSet97; + int hr = _commandTarget.Exec(ref cmdGroup, + (uint)VSConstants.VSStd97CmdID.GotoDefn, + (uint)OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, + System.IntPtr.Zero, + System.IntPtr.Zero); + return ErrorHandler.Succeeded(hr); + } + + #endregion + } +} diff --git a/Backup/GoToDefinition-icon.png b/Backup/GoToDefinition-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0523222aa57c84c658d09ce4f4cdefd7038da56e GIT binary patch literal 463 zcmV;=0WkiFP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0c1%;K~z{r?Ul_D zf9EI$_UQ2;NPCXhl|QN#J>i;2J&l!{t_q$~o1CWna$$?r(~z(@;n*m8cD zo3|k}H@h;>0!sbg1jxh3_uL<%&sOw@m*;tQ0+BgKyXr$qRKyV^gjy{{O4M&S(Eo8KrMvign)on&mVD7D}U|@O(d1& zfPf-kfPi9gfq*XCfPkWY0Re?>{n-3S{yiWdGKxi^;vOI%1U@Sf5k)Bx5kf_02XiZ1 zGaw+%f$9t|-c-Gv-Wl6iGg^}=?qyS$wP!zyVfi)lVf$F7$kAlv3da;mG$gJ1w8&!7 zFm$3YWhWaU8057)oAP)6?dPw~>-!lO{`~Xy?v?A0beG(nN3P=!pxwb&B}yYlAVJP7 z@gW_|gH1kOr&tDHXhT9G9>oU|QKeX1T-(0ywe&m?%ulXz!RIu$>+TF`gF>6Rz>;Vs zn|~rV-yH1JsE9zByn~xT8@7@b-*)b$F0^sNA)JxZp@ag&gHVVQD!I4hh#K>sp!O~> zxt}esz_})nL9QDZK#YcCgNDpNu?>jlC{jwG<=OZdlCi|0A~|qCo1DD7zwTz3K*!7= zQK?NQ0N?;pKmFzi+(00~4um_VrxsdQtiX0yph5JnbgB4Xy$c|MX&XEBU?0o6eV+NE zU>8bj$bFh|z=B=do4SeN!|5=+-qS}%)~82DZ)8A-2SBdjNQD(lJx4I$KA^n;-aB7M z25`V&#T1&Tp&?S42)6M0kvD?lg`QZ5v745B0Gf)8(dFp(~uXiEd(>T20-7z zf;ouFoC>Ol9zwcGg>vJ9?J~pG8WA~RzS)H*SHH|c$AkE078jRd*w7ngo9^BCPfyQB zuyr|tv2cESX6Lb=vwYi*8I#%A*^AW4)zj2DY`rfd#qXS&p5vZ5FE$NcHor%X1h2&V zjlauve)=N&x_pj*Iv~D978Pd&E)kX*)*u!r0vJzkwoKC?<)X!l(bdSLaN0cBQU|Y!K3Kf_gebqwl`iG%;s2gfZLhw`J4HWW1M~VdOzE^ z{&4YrhcK9cOfbTaHsv`ZJt;r6F7QcsjVC71;KnN4O1fDYR6fTl*Pm2NK zK{-RhFZZPl4BQ7=AcZ6{H(`u-t z3F!B_Hq$y8H-hW&;}9$^EJ&Pl+_@}%ru=U^O-M~^O)kw8Tg&D#cdaLkCw6XE?x($c z9yy+w4%#;RRukU3JY9X^_rWI^FPJyTH|V#hHyA|ENL|uWAjCT47p@b%o0!C}*{8bS zH^z5kk*3nBri4pO%bjSnP4ahuhyIPyoFVP{dP!h-?2$wR<3hMGml48Zvc=!r9 z{LD@dHgDSC)G4o=7U?%ouPN4L4-IfGRnA>sHxndBD)I!hoX$s{dliK-7BbUIXf3(d z-8V1$_sJS1DH-My{`%soe`wZfZZyVJ|1O^_Y3mKGw5_CI7viA&p0CO6)L+!~J5Zn4 zTK>wuUN7Cq;GS&($qu7J9v2bh%tbDXR$Skjb>;xb2Vc?=ycjM4meJkpy>&$&rbX2yOcVE@* zwODnf1+f1Ch5YlYsyD~5+L7x8Efl&CM@rO4@fkB2Gj4YBq($~}QjB)2$`m%qj-Z1k z0)_(re7cE18%fyn;AQ^R#T^xf6?z-#3<)3UmGlj+g%&==FiBL#sASEfejM_`I9Y7G z?-2da0&N(L;L2W|T3ue9=#oiEO;zM?m&)}b<(%vSu{F*)x*!= zY-fi%$tTx4-8^G2MGeDe1z^tf2S{VQ1^bBeKKXuKv3kl}Y_|a5xWCXLZBExWl7zD5ivoeFE@dTCf(F((5 zk!7@{{G7h@bVrdxN(DtRr=KIzEc?v2BW49|W)GqZV;?F=Yw29AIcb~60gZ?Mj#U(N zFfMpQcv+M@|DJrTow(Q!Ss%AC1jgJTFDqY=T`_k%_e~U{6{ZEx?hL9-=?$n&_@$M_ z_vqIN)g_fhUH?9D%Q6qcfu^gh9_GN?_*gHp$GfEL_Um!kpSI38xvL~Q_s`$um_3#J#X4fx_+4~T{TapemDVhN&<2o&9i zXGtK`Z)(`g2u+Ky44oaw(u=l7ezY zFsUDRgto2?uw|NI%y4A*k8|`kEoG7`0&c|rU!haABf*i;zpS6xb-4Y}v3mzHFn} z7MKwlN1LkZsavL-r2ug)MXMthajucBqGq3` z&yOJ_ zvLgoOkK)72X3Rm&{KpD&H2KrgNm4d4Em8z@9m{9;t6ZE`!$`cHdrct{u*rCER%1LQe0_yKjM(&*uX6ZYKk`4Tl{!U@poJJjc&{9F8bnzZ!iL zzA;%`Ea`7$9yn&e=7vs7`psU`qSZ>-KH8tf@0Q;RV1M;m&BAr}i5jXiVqg5K!e|B^ z>9gCry@7r~`~_T1;UB3h%3%yv5%?gMC(bX-R2ZuiRqnp108SUq8Lkr>IG4&4a*L%6 zi5F^bWNdtAT4}y+=x$bh@YN4=DA=FD`vG$UKf zUou6bihCC2E3{7Ea>tl`JfN=Mh~71?>OYvmfW%_9q@{n2!;Z&Lr}*SmxL3GU8Z21O z+s<1r+Ap2XUe4jn2bkQ9L0V0k*Dt8<*yek6iUpZfs};GW$u-&K>izxv>;i!&iAQ;H zm}bO4(g5R-^T0s(Z4s_<+P(3<^TzlR{j&BFfhdodEqM?WD|FTeOcYk&F>o|ij|3|1 zbXY_wxDXW|Wfhs5un?QTtC@XskSH`ici62uY4qNhOmcr3J;KZ)9v@?>r0|g2Zzl0? z^D~5RM&R2%Xf>;lc%Xr0NDRYQ+EW^0qMm+3O9XN|6o?uq^%!^Y=eRda1h%Uvy)ai3cqqkNtDR5=+THSn-IsXeDaPGR9oPG860|Fd^WuVa-#ycp)3b(!enRJ-S4=<#zn5F(`3&H63W1k^j6Z57aw>WnDq#E8 z>vQ6~7H=o|I0QWv105ZwJAz>^Jv=~^p@BZ5y1Zud%j&+tL(QhiInII3=(3M{rv3YE z>2V1zChj6GBO5u}D0}MR!(l~6CvJ_Dm^L`NfsG05dkY;O{gVeAy&YkJ76N)I zNFU}-cx9#>lcJ#-g)Yzu6f|4s(-?PdW)a+&C^Bt7ME2s8pRgJ3&+mg4JEJQi|7Ccc zG9n<7lu>&5jV~jp)VgZyjA;rgR+Dyqfk6x@CG#FP?fsCPE&sJA<)T~q2jT>MopABh z-GCu&l4RL{IJkK7h_wy-k+6G+g{o$2tw^*Wt{V_lL`X?N;MHF!hHvNbA%~oi#DDaW zBZD7Gn;-mb+U&a^z8Pr1EX_*aW7g`Sz!nfA-a*Thi449Mc!2M4;ra=?ECtmn)!)h+ zpEBV2tXI_!caXCKB>mrCbvQ5)3yyo-2gYa$Wx5 z=1lxi(GdA3@WqCG+N&OCi!2mX1P%c{=O~UUjVXn1Ax2I)exRC~+SuCzME0UCErI!V z@Kba{IZA4|00F@d{$~NF(ZJ&X0nr~wi3+KD>RW-}p~LZq1qf(=Ou zn?h032ReaxQMcZ3*wPE$#Y%y~_6rho{ua0u0|iUF;X_m!Ajf7012)s#kF=$R9pxXm zq5$b%RlDBwIalAQsmMFC4?hj>el#QAa?5b>KhE))ZqsXtH(CJmvjS!P)eV`6jS&|p zPRRXhU9i#J5_DWp5GPU{Auf;|u^I$BXb^E0pOk6SwU$*#5J&Piq;^9V=8q-vfZVe* z3TR_canv8S>?oo?aQ_cRiOAr_7`20l4P5%))VIgvF&gkeMwlNnReYEP1h5Hi?S|a# znWe2B;rFEAF1B443t*YsL!oOQZoX(EEXB=!*kB7C#jFmnL6BT8H<{7C#i2oirTlX` zOdvRZ1GKW+#zA~Jws^P+*)}+xAS&%1`JTub3{=R^Rn;c}C9N5wCD2-!x^}Q%FNVY- zLrW2KK)2ZPx+toG2jgo9MoDISFVST*hRv&`iWutTGwUG&!$M|G+zhbA#f}trHtu2z zzxn^9UW{bOR35B@HyMl2rmM3->=%LbWA+$qW1!eyI*M;A$XlsS4~xXmYU;cnNF%FP zWf-Z7KZ(RlufCY%UfVYPmEXdGX0KCl7w3fs}7X9w|LK9sT-y08GIRNv)0dGWnUPL1%rd1JUV3Kf&%`Xcz zSL)B3T=v*g;0$MY!rRC62hO5=H-qQzD)ZUu;w=s{7B$B-*I?f?-^8>7tQ8aukNq-~8M%Fh+GeoNEp2_h@ zl4D)b$^`t7l8uKM&FfzR%-V2fB3?bM|G>MJU6+IZXw6w;Q&l1#eaf3V%vwi9?FX;9 zUHJp)ILGoW+S5X~5zZ9(hK{DdS6h}GQHovey1Bx+?gakB9PswQdzPPv^#*H)OSKSt z^;yZ0(ulId9sjiN6{fR4f0=NCaEJ#zG=}X!R`!m|$x)*-Kj>w;+xRwnb;FkJU3$6Z zD0>sQpDBT3T}Iq1FLc+o&4GPW2S`1rbBPxhR_sNu;xDE=(qUV8_t$Vufpf42TsU8OM8?`WS5C&i977w8zZzx; zcoCln;jUPntl8=mn0k)OKgoEF*l*vBQ3lork;lwT=HEX>EtA%;JwB;AsWYCfht(st zyi@?1T1iN)tNE+^{-~#&}kRn$gdy< zA}uty(Od)(0LOQu{zB$6HtRS$5N%aS`aVzE&8&nAK*$za{d~#g&1f}sjnO2{l1=Dx z1V*qV-F>nV;VC=<)4zNURw{?Ap#JqN5{Lagg_5_GU3Cd{vW|O3H>n^TqD-~l1<%PZ zt|Oyok(-g5C!lvb0Z9$JwQY}q5gi~gSz%QW;U3`Ytf;gY{*aqID1>E#yNO1VEs7I@iGsx;HNkS1I(O$f#>v{!8vtq5 zkD()s&o;Mk#|J~Uu&0!I(Jy(IN3 zX059-`F;0mpn2pl{9=;R1^zn68g^8YIh8Z7$?TT!J@0b~n{~zi`P5N9*%F@kz>lj2 zQ)lqY-z&bDi&9;~iY@0OWMp{R$!BOG3D7Yq@nNZSdV9`bm3G@U9x)l!c~IHv?b2Y` zro9+S6@)|0o~(~`pD`4H;j%N6TGVRdeW&CAe{fcxAghb_$LE51^?Rr%{sbR8=s}P$ z{ep`xaaPwF)E99Uyl_dFL=pTyF~QsN$IV;f%|eof2R;!-?UnkJK>g_FMQ49c{X_@w zWK8>Zjo*Yn5kL;KdQBD<*zW&7qo8tdVgu!=ah$q(h;5m4sYElxMQ13X;?<{?Os|wE z{}|CRAg?uvdq(CC5ORBNq%V5ujXzw(!=LWt_Rci2Uc<*O(JN;S0t|AulP>HV>rYCD zag(LaD4%sFioVxxJij@R*9HSB@7&p)-rbMnYHWFAH$zdJx+$255c*?}2g(9dSOmp% z24$*Dd_s79v`&?(rrW>}SoH!or~T0!#xdy4W3L~)faEZ69jRsg!YOLT4^teq^}Qiu zzFUEZrY911PLe$f@QikiOiaKtA{F<=dXHcPKf+P2d4(=N(K+pN@W_o9qF!RTo#$xn zHf3+8Fo*3nU8qh^kgBlfSR;LR-j(1&yL#W^vB=@<3*)rf*XKCy1DiAIh`9k8!p5k$ zI-kh++8+|Oo^34FLu(vF@Cj(f_ciVh?%qbINh=7?zZ}Vj2|%JO%A_7?Zq6gJ4aX;E zoJO@i*9u$SmK0_wj`?-dun5p^kxy+1>kCs`gj1^s&5}F(&qAXt{KwQMR{u&e4Wq-o z!*CBxVN$&yGz=IeH#m>hiPX#^<>xMKcDC|~I~aroX;?%N=Y66h%@Pl?Op%{7O%7-4 z*~IvaN0Sa9D@8Ekrbpc*^3P=JM&~K-a#+WVIDj^zqB^ZyJu(KPYvsz!9;)Xn^9J7_ z%Da(;iDOm%mh(2s`Xp~(j<+Sb_VIGmurSkI+K|GJ=weKaFgMynzW=4~uscFxQxq=3 zylDnAfY#%WDOWl3YzY<%Nf z!)8{7LW$1Y3mEfmF{I$rkGh}uiJ++RG-GqwaU0HvVx1uoY&Z;T)!H8oyVyRW@`@N8 z3sEep@P*B_Ql!s6OQ^>QqJXiA+zI7Xrp#f$AaIMx;_+|3hxRpCOJIlGdb%up_kH5T z!)#Z`9rsjh(<8KrC>RkBU`%M3`O6d`*;vPJgYG2s!?U}(?@L<;3-qd{O%P4T)fnbUbGlLVHAe9pc#aDlg z)r2}H{^={){a23ai& zG@%YRxTH0GCPni=;dNfe(dn_Cb8Y#WjLT- zyMmk{*9Pat{5FysO3{A+=$~3$qJVgAa;evjuy-l|W zRv7Y5jKSUuFC0zNB-0;WH?xy~*6@`MrIWX4gT93e?2(Mf`gBTz&zVxM zd|zIl#2MZ{)gj13YzQ2DxU(T)FU~lla_FhC9e(U`Xyh-ntqWD#YO#&99lF+LiRqPy zX(l}N;a0|d*3>BryRShRsZqn$uU4!{qt&La%7eUQ8&bKFUP)?pSx0r$LUr_9tsvUL z?@m#PTD)C`ng485Jl+%eE>GY-V=2&=$5W9a_qRuGquCceTFP!*$aY^QJg z@^-Y|mJ6ED*oEVyaF#HrmlmPnp}AA6nrVD%jFS$;;Pp}EFgMg4f0B+38~{q)37Y*< zPzT3-krfG2t1;_9r2U2+1d3Gd2!dpU_u1}uAHvDJy|yQn=(#0F;@FHN86A{kSNiaR z9dsxB$Jhff9%IcHFa9U^ClD(O37%U`%l$;_oNVU>RSm?SC`}D%$v4#&70900K*;g5 z=%OD#l<#UDAaH6^K)L&8`n2<9Js+(8F_9lK=N`O26=2vNwjM$^dwowubeO#K=QuJD zZrZ5+dWThsW7q0<{Bm^-2WF?+qy!Y@_mHP;m>VoCQp~InWe7yVD68irdK{$@#{I z+f$=uu?5v*Rvsmuu*;;+Ou#1n6kVqvtCMzQX&(VZ?FG+HQ+ajN@N+gN|BxtOVZ@`K zS<$WtT#+$cm!^QjXleW@-ilAc*3ONyT;YLzXA4bcL@V0~?{y+Gc)w%bEW(Ml>5Za^ zm%%Qe?V__IOd%gk9nLJef4WyEGZ!pY+q#H3_gf$HSF>D$qD^8Lh`eM&Q$VckT-IOz ziQadu5xR$5pvlkmBv0TQV?gWkr*q*Y)9&9u#F{z3J;u|1est)yR@WQb*`<9(ESREI z#GC{Ix=t@3PY0E{aIFW#3xl*oIXsre1>pqyJ;$2RJk!r-I(GI_$yTgMJ?oZ8r4;J$ zs0%>vR8tlP;~dipsD>-I+{0H)FHH;Qh>ulR_ZJv*?Bzd^h1EWA>jsYBvwP*b%12)s z+!Q3Ix(ky@`}!qsz11Uuen|{QQQ1JHlOECtUO`cL1i!x5aB?`ZSOc;{dfBj=&*O?M z)*8THb_1i-^J;_coV?bF`Cm7~>H^AjllJ(C?e<(=e;YN=4RM)3~g zO@YFZ*+fyi;m(+uX0|^28IH)_VQ;LW*GIi&{DKJhalB(LAHy`dH<0zC_wo87=%ux- zh>~6)Mt_e(8v5=*vO*is9v*A^3#5+RdcWsoptLEaxK;8>w}J$e==-{B*Wocg`@Ag)y8r12#87zz0wVW83F{9Qhb`BW=$Er7K8dlRIO=X%^hg~LVFn> zD|V~kY87_V!5?@3sNlpG6z)rd5-= zbiP+OxgT|4zyE<@mvAEe&=mPz*ZT)yL7&8jiw(qQJnP?)6iYX=Zo#|zWwa4)!z;YcAt z{d#OcsVxLT#Z+C)Y`$q`q{@HLkmuiX1xJNjkTW+I9tL`_A;9c z=k@Wmb@}YDPvX{JE4Fv&+aHU~R_+#W`u@%Gb`522>=)W0{PoY=&!z+p1{2(74%y3V zcnjrhqhFEK`*r6(_~=qQ;c%Uc75&@-bLwJD2Qy&g5=|lEG|{BeFT|5-<~=#WyseF% zpPCLCAwwR40G2`-mxv%;n)p2VNK!N%2JE#abwUolnbM8_6LuU=Sp%dPt@1c0QurW7YF*H) z(b%yQI(`&jBEv*?o^b1(Y4nf`at&D{r`hTqAT04RB#_$7Qc}35q`h;0iulT#^VpA-H(mVl7GQk675Si zNV7cXJHr}qlI3b*GWvKSv>Sj;xm=AzXE^Mq=NCF!>ZwgQD|#_{|#bcd??oxStVT_FjdX@G{m3h;&tGV zHX^P1Z6vyrmD#k1*u)d}9~5J9VW>Yua}@(!ZR-JD7x^)nl;%aG_Q5TR*7H%>K-rLr zYHZ=pJ`9guZ<1-SeuY%I`530$CexO`ltk@s2dD879kg2&--fD>2O$Pj_!#9|DesD@c96*M#{ybLnHqXJbIUZ_EY=GT^SrlbfuOoM%y?NA^MI|#u( zmIvy*qg%0Ru*k{$Yxa+lO|US8hb;fq@>eT!Z)>o4oV&pl1amBHWA|SM^Xc_K5weaX4mXH!*G^*3O6iQkEs_@FjX-o=KqY&?4>x^{ zrJ-RNRgl;TqVe4yPr=;w)I|`MjwjEA0raWAGMUDM#n#QB@c+ zsJ_0OIqQ1#*zcWOQX4O zm$;q((t6<)Kxm*3fZH;zL--GHRM5Y|)*Cb);segE2Yv=6+c*}?Wv=9_c%VWN zm4S9Ue5fpZMY<0-!u5Aam;T7f)bOnxY?b$=MHzO))#L7amT5K9ol4=M_%bu`6qvY% zR7@I_i0V5Sqd>Mgk864v?r)1Go1kll0Yu`Il(8mj#bpB$|$#Vkh_#)G6aRR{XsqZ|BNFFP0- zzHF%kj&yAQ=}Nc)ivQh%86UV}@qu5qxU&4JhWJu-i_u0|wj)9+ykWC!g-E?kq!NNR z|ECLZ=$l-6RI-WmlW1Ngo&nEL{3p>=m|yHn<@rf8$MKZ;c3(pURY8(wbhAps+|b{v zY47Tvbv*xQzhqSb&Z{z=0GAF-_v9#_=y=g5CInLhqZja*t*4@sCa2-Qf-W7jT;cnF z@!e?IC$4VLx&C1aU|Z{#deTigHg>5mb6?GWrGe3rk7k$k*gg|{pxjBrQF4Mez5Wh- zaILC^A7NG%#t#L)*;DBq!}??4G{~YQgg`27Z2L~Be!LkB@ta=I{usH5TV{mnpcGKuilav8a{ zs?09Ys3`d}{c^m}o00Ki56HpxJMzkNW(*&{I6kYNDu~gH$rjT9DG1}-FzwXKfBDK1 z3BO`|wLcUB-4_Xa=O$Lu{sqpUEcK3sC;to9z(W7S6FR;@KmG&Ds{@?S3cPk?jQ}*R z6FLd`aa4=wlg-a zmj^fcO%RNpSNdOq7P=Wb_d<7psn5MB&vmK3_%uf%O3U!?m-69T9z=XKM=n|t>T4vw zn_DPsY2#aMxIQzV%>%@D!k&bj^$NR?zHIRT8gZ7^IF}TwIM2~O^$9Hu*}J2aNbV}f ziRnh6$NzSorobb4Em-kn%$;miH3*ssJvWQ>R729-d~S_7}MNDJCA7sPzh*pU$UR?UC15 zHPbnFK56Pbx0*a_;$7Dg4Qhz>8#E7&+BsZU^wi%e>@cyO`S3(M&wv|0E`z>@8xMcK zEsL7FkvXDnrjJjB^plVZss`G?z)v=xzKluupl+6Fk=O&Q$6S_JSWR_ zOB_>`sIgVZD;nqPV3j+kC`KuBnvp(>Fj;W&7tS9Z4|H-TWD-1_Zq94>iL6o@eU9V9 zE4XXS{w+vplI$1T(%wNoT|2!N1rG0A4&Jrf%`&n`cbq-W-qoXz*67e}?yj!9JU8Nb zHrUu5&rS?k3V8GU5UV}VHkl%EoB7>uEMj@c1a^_o%dtv*PKz`w!I1fE|E}XepiLD3j@%n({h;_yd?jv>%b zkVtm0uWTl-HJZlZun7#z$&$$nGBH9C-s*J<57y7CG4a+vlKqMQt?e?qcVhMHMj8f2 zymyN&nmYi+(2-|%F5MOh=(mz`muEMU3$q+eRg9e1jpj0@gg}vq_e?~J|1im#&3tV% z+yAB=#Aazvbq)bMC>(Q2(~*}3S8AoZ%|tOyqZEC{Jkne(9|%`Fj<^v5=dnF-nb-gm zwJv=b-BNFG3;83oXmGgR#VM#(FnJaH<+dyGWTb8vabMTW)+nDgPx>Reybbs&OlgU{ zC6~!@!V&jh4?VpxR9pE0=<-)u$N@5OhS%fZ=EHrw>Z4ys&1n1I<~zA#OQEq%cwS@A z-PC;W$751&SsYq7Wvia453FaPzEZ8Pb`mk{VlU?U8jXe&pZl%8aHii7=#_Kmq&yB^ z1G*>~$ub-rI#6~gVzc{{?~^ki(+o7ZnHp^Y%NCyQYj)+Ac_HXMX^sb$3&1hooLC8s zRpDoL`GXJB0V024-c9C+Bp~D34KErdW}BK(q#tz#;i|Rig!uT{X8TJzQ;-Zux7oj%j5^e5QExZ!?Vq6QtfFo} z?^>W)HU_D^hkC0qSiEWROP5Z7cqJrC8OUGTdNeqn$M=(ry=AX&NT}7gI~RkH;+)z#JpI+ZeF#YT4=&cYB{?u#HMoD`$N2Rl79OHV^ z1_?HrvTGM!lP@$f-3}lKtiC^8x)ks_?gr}V>e_z493(VOpzX*j*8elodcSz>s$AbP zzmCs-V)g(`gPS;GNZT*v#c?S+O%BJc&HL1R03;|@8UAi?rqby&lMdBi;yCaM?w~E~ zBwUpBr5;P1^>x2?S#r3$%U)aDpUH>eK#~Z4)F{0@$E&JdxMY#HeO6$bCq5(I0a{yL z&i>YNzSEK!iTBsIOr>bPA1%Zn9(;d_jO!6(MzfI0MI23%%jfY%>2q z^p(nGJKpRHnVOjuNT*Tr8bm%@MY})^L~jjoXC%%wrVAV1A5FEMRsL1%aJNg0=&MjE z8#nWyNh??ePadC_5?Y_1lKkn~|3NP0mO3>hT^Cf=!%<1?c4b1gBeW0#UQ6)t;@Z2% z`7a=XXkPHTZ4!Vn9pNjsCZ(CnEY)M_B#d8JN} zP@V>Tzq|68#`!7Yol6gxLbiHvM%zIs%djOZq?OwqEW~eX13qJLAntK%yPmMsYjmSd z7s^cfg26O<{6D=caA8|hnG(}PXkqg#l(wLdtTUVFo~tjOthmEg$Z&%t9h};Gg;!vo zQY)q01Z68hi1WCtzqozs=;s?!-*jbN=5X(~?+IFDTwoXwX$vsUkKxu<8^oPuuUof$F22GuY>@Rl4!ZREcwe+q zK0ZVINe8d}pLwzz)a)`c`;C?vHo$q3j1 z{*5e|95x=h{>k%Dv?fmL8J|} zUT>tL?|M+SU9AIF;D06k{u;tC5H&X^pAn;P-3`9K(|BA(iqXLv2Y^t~EM>-eE;5)i zD8-xRj47(#AT@w1nblS{=2{uoSq?24*! zJK%ZVEeWL)m3_^6wwy19LMXvzwG6!OeuoDEhjr{4{dsllLYacgj6c7Ag#%$@q*4K8 zC9>)Jl`@lq2v}u#H{s{2q@=%rF#d7WwiGH+Sa9~J$>yBwtYUq-XW`7Pu6THq&klsU zB2*_rGXQZ^^iw7%q=yXQ{E*B40FB-gRIB)=XeBXh$df7IW+DFz_3?b=IDpN1u~!U3 zFI2n9+UQ_7ZqqUI_~q@qcBZ3R53Mkj1F_kgpA&~yAW@1_N60`!zQjx)Vs_(gPFQL_ z>rN3)hI)pqyH>i)0lWvL$UP^{-1Njx5>U2DE<9A3%E7BJV!k#cOx6QxKz?iOJfr?Z z9x_%0kBVQYtYgF&q7#N7=9Ti@4!055l}lkEr;+T^$=oWto991ze=c8pB<$?70W?PAYS4}-DGvDQN3b4nH4Du0Lu(4UlH3`y$o zse?dGAP|^_3(=#6?YQZO*`n|UT%B4s4DSWHF`l&UbF zf{;{7nEO-mBu~$;bV3mSG`SIpxBf?HAXyPNwi6KaYs0T(o?B}(8!s7do_jJe-^C8! zHG48sz)VoP_GVsLzMJC5ryzQA+Gv4O*-AhE?IaBy6MB=+^yRVS(5Qh;~1o|or4GNhJrX#(6!w=NI1I(IueX=!%wIo9h& z4kLoYV^6!yE*p*&YOHZ;r<*-^?jyPS#rCl5W)^&x-<;e_BZf1{=i=tUfz=Yi@ZB0L zuHnxeSP91;2q(|B_5G1q*1!7wNbG%l z>;rlQSgVhg9J>3RaI=gxL)ZCu;Rd$8P+DB%*t9-4BFE;vIiINVwjX5ln2)^6N^x*8k%$>2=8s>{gxkEqUS&-ci_Xd3E1wH89~woerA+CIk{ zUE*;73kEU-Hs<;J!TmT;x|t0dk@Tq(*gIWYu+u$HzH8{h8hTq=slR7k#II1b{5cMV zKRvMcR{{%O6VugusBJL<6H`yxIg4h#3@`aIzVB%)13VJhgquc_yYB%$P6CzNQtJSB z1#kZ#tyY9@{k@^Il!Gz7uN=UV(@-Wn9>I*8mr7BrrR$3k(LaV`Rja47q{^Oc|6dG9 zYpo_-%L79yXGPK>?|5EV?tsqz=Q|b89!DAXr(cAjq>(AG(7=#lN&Sjpr_ftW_&=`S z&-Ox!_5&J6T5I^q0#p`C)kFy+)Y4vaNbCl&Vs{?0qyTDrV6O}{Tvbp$qoHn;AL$u4 zEVh|*3{X-~feDip3a3I(YX5RJdo|u)KoXnA%8$f8A!c`J4`{8pgIXvU*ZAO}#+w!{ zptslG)axvw?cEMrU1DQ@vLWX6ICX!ZG6p=H{GQ#DF@Rh8v+uR(-swKG>n_=sVH3(FEJ&?a&v=?Vc z@H@tio}Ew%$r3HYD(_c)B}F*9(_JFBGV83AG_RE!2i!`DPTvuue2jSK_7_6}81yqk zEOZeESK;RX*8!zD{?Kv)n727FB-h+fk zU<*e``Fm_tVvSb3MTZB#cDW+p`7J-u%Pp!f_ME;8EJgkiWPYUEpG;cye$6o18E8zN z)!sehF2h1bG_)A#B7i%1K+h;*P9$%{N*U}U3`Fc>z~St3AI!AcKLzw>Gt%RUy!e*8 zaa|o1i*=S! z8!5_8Z7H0xRVLqTF2+5Ji5(a}WK}m7uvg4z37T;vH6#igGI%>iS#f6wcbnndlo&UK z%S_O(UM3a|=Q=KxA-*RL6MvmySl&#qsp-IhgREkcI5r7SF~O3DZ+g-i>2*0uWrk-5 zFUzJvh`yQnsuA8>{YR;%2`pha#TS3;^Lq4|8v|8KuVTrx?eKeIQ{FdkOJR24OBxFT zZcmLF!^I(I3T-B;<29#82nWJjKKm^!#@c|`-S&FT$j zx8g)(X7+6iPpd0})-wB(Y|iNcftI)0%w*%*WWWq978*EZXH(8`u?gr|zZ!KAo!QIx zV0+ispRcNovX^g&K|l5*yLe<~Ja5PN0St=4e0a2&NGx{R;bVTABBRBT%a)#qyzGx_ z8Qs@kJrcC+^VuEkMRh2$s1;g95=+nJ2oSBP|gn7j

3DQd1R}~aZG9~)l4N9q^2B+PO9WM@`P8_7|&Ow}> ziJb6%6f@uF{1N;L`g?14hxJaz9^q1hrC>7_#AcP`C(6@j=CR!3q9tI4kc9fs?>nIdTO=oqa^jK{8~g*8P-eF~Elzk{M};6z6#w zt!QEqsFlwx1<}6+*6s)IJA}m+uugm@Q!JwXcjUQ?Imlx6R(@&yT;wLH86 zPzXMW4gl_BfAz}2JE%LUO0Jn5VFf*roPjbDq^~AZ#p3B0+b=2cpMGF6*q<^5yC39Q k-0aKh_CHFs`waw#=xw^*x@iA10}mu6CNEkeY#98%03JwhOaK4? literal 0 HcmV?d00001 diff --git a/Backup/ms-pl.txt b/Backup/ms-pl.txt new file mode 100644 index 0000000..da3dc93 --- /dev/null +++ b/Backup/ms-pl.txt @@ -0,0 +1,31 @@ +Microsoft Public License (Ms-PL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions + +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + +A "contribution" is the original software, or any additions or changes to the software. + +A "contributor" is any person that distributes its contribution under this license. + +"Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + +(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + +(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + +(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + +(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + +(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. \ No newline at end of file diff --git a/Backup/source.extension.vsixmanifest b/Backup/source.extension.vsixmanifest new file mode 100644 index 0000000..65a5a54 --- /dev/null +++ b/Backup/source.extension.vsixmanifest @@ -0,0 +1,35 @@ + + + + Go To Definition + Noah Richards + 2.6 + Make ctrl+click perform a "Go To Definition" on the identifier under the cursor. + Also, when the ctrl key is held down, highlight identifiers that look like they have + definitions to navigate to. + 1033 + http://blogs.msdn.com/noahric + ms-pl.txt + GoToDefinition-icon.png + GoToDefinition-screenshot.png + + + Pro + + + Pro + + + Pro + + + Pro + + + + + + + |%CurrentProject%| + + diff --git a/GoToDef.csproj b/GoToDef.csproj index c863444..1af5322 100644 --- a/GoToDef.csproj +++ b/GoToDef.csproj @@ -15,12 +15,12 @@ v4.6 512 false - 12.0 + 14.0 - 4.0 + 12.0 diff --git a/GoToDef.sln b/GoToDef.sln index a0373fd..1ed44d7 100644 --- a/GoToDef.sln +++ b/GoToDef.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GoToDef", "GoToDef.csproj", "{25815605-0093-48EC-A89B-44F70EBDED65}" EndProject diff --git a/UpgradeLog.htm b/UpgradeLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..b0085ee7f2b2504ff49f3b68bde1d6aae37fb641 GIT binary patch literal 43424 zcmeI5`BNLolE?ek-H81kH1@tRvmS1n!}B~70)&k@%w@3sn0SE^w>XSAJ@fWY-`&r* zl5%&oL`y9s%&ZB8)ZNupSy`D`c~y1mfB)z2(GSr?^fnrgmZJ~Rd{l}G(N1(49YmGr z*XTc@e~(n7n@=ICM(fdev>BB---=G6BWe|*GtMf}%cv{r!f8tq@(hUJvQ#1!q;Rs}Axb*T*5H)o6qIo7`RJyqn`LCBmf2 zcMIs5}2oqtQ*P><-%z> zx®E~nss3Pm^R<)0jn82=R9k4Gf#s^?udzD2H%IXj_MAANhC6=)xRW@)iay>)6@ z+d`CVEjbEXi1WR!wqYb5Rk^-$`29-ldTr7${B>{iU$htl*D??!sUFhLTy42A6eyDv z6!?nUyWp#Rqy~e)C}bN3Pm_oS&fZMzrr}t@(9Gzc0Y}aWokX zUVooOzqABfb3rn3at*N`U0~nI79oo6qG&f9Sa)-^0+odCqi6|gZ*yN9c!v}|io~g9 z>g`af`K{|$jwhSUI=f!s`h+oSwpodEk~Bs)U)|fKuhzzY45Tt2>8ovrWnYVsg#8IH z1WBXK3+G>se|e&;-ZS;@Iqq8I;dwIA`=WTD$x z<5O@p%UEzD5XBy2$@;Iq16<3BRv2rU(dE;?UPGm|$N*gFM>FZz+DL9Yn>=PQH!t9% z?3FwZarBT;pE#XU$%$h-W~$LWX|HN$>LWZfv(4vVz8PIOPe7VazSt4tkY&@H)*Rp9 z+N^MulKk^{;11?-%#GyS>W@ZlF}Grv?c=bQo_c!c`B%MDh~o2aBjxRo#6c%N*^*er z>-cnSZIf~)Ypr|o&kNWSN!~FMc@*tkOQhzRyZ~AJ{4zOsr!v`o`H5vSly}KZtG1+F znz7Te-HgpUMOMs{6E^b9VXx~Y+{8`CwY~}LH z^7b}HgZ z#svBOd2d5P*v6v@@Q4s0z1lwo;%_&K?@=dLAD26HzU0hG*PP|VlUDF!;SOVH_$!e{|AabQ>V(9u9 zUgsM@ejOglTlo&Ot9jz`u{WGlq-8^K)^UrRYfN45Y1%O#b-h&AdJf`XYp{}9O_HnV zSke&3lCnUzpNaLn2(xaJ%y9eWo#pwZ%`z=BaM*Y+OzbF1(p@lV}xvM)|a+8}AS2OmB@dUp1>O zSLCsiCW&)SJ`-$fC7!bd=D1~^q**qApg2kAu?CZ53cAlGE7q^_u{AOCnWQPCQB>D7 zj9@4qkS`|aaih@cS#nIuZ+Bh>J>AlFUsUnb%_lGUXQJ_QnYkwooThY=KgQ2=jo524 zOQAV@24|E{)V+NN_Y7Me$HZFwH7__B+gXGpEb?Y`dQy0clai{=bMOLLE;G&@=gVuA zpfCDc&N<#H&*q_Fyv}5H+pp!tme$WDzb3ivq76T9jq6%*X=Uy_cC*hURloUW-XD%X z|3<6kKD8cgyiPN4?JM?^oA7Hlc9wVjp;d198RYex*K#%sdOAMP^GQ3EV(EKa(a%}GDc>v`AR&`Uduv|B+d zu!=#$vV1a_-IsPSY0bs2iN0`ha<_h3D4)s{nAF=|q*zuvH3vE`kLHigL2G%((&ZDJ z+uFK349!L5Om#Q(at@phG(Y5%t967__fTt!+CHli$0wE@F*~T;KHBdkyDPY&q-Lb8 zfh&Ki_`_RXUrRn!lIFY4T5I24!L?Q1M7tWLPYSGJ2y@|N=h7awbIilDbNhXfM%#ZdNA!6Qyb2>;0kU#W+6^VDO0(&xeU`e@&3-uRdx$-mp}w2? zI^q{M=+MWs)($Ocna9weHpAY{Jy~(lP5icfpk3GatWy@>?`5`YSJf{LlIS6veg^Uq z=kly9|1HWsX8-6fE@LQf>v8luuv?{Er|{l|`eW?LSVSuNqG|T2X)jyx`ZLF<-XW1C zez&j7#=hPyMhnEOMRwcz`djGjUi`wHuO;Jfc?{01a-6*`)hdRyc#DoN(&q|2UqHuC z*X3hKYzfYn=wSuip3(XKx)?akW-s}Gcq zyS_JoJjy(tq?JZGOReWXD*|(aare?siMtnk_rd8B_zUptlHM!8ya3Jz+Pnqs5D<4b z-=@Y6_h!K24fV%qxx>{7(1gVZv>T?@IVDAoPop`$=Z-?>oLvG*SdW0sD=>b_7?*%@ zMeQ+Q7rEZ%Y#aEmxKgIJNR55^*Iw6E&S#Lh8R|$Im8o|^>sj_Glo{O=JuI*fdX;fL zox1LKMsef0Z^-bTPk^jqe775+|h9HGTH=Wpq=1O{iW%{J{T z&_M8%vw2HjON{P-z6OEvj^hw_7Jxm?`3&RO1m8Ds|D0d#01*YAf@RV1?G3e-!E+kC z0 z_3mEo>`<~yn|^xLEZ73aPt?&K=UGO7$n|qtP5^TUp6zj*rq4GH$~$^3a;nX2t2FX~v^jCux7_G-)2& z->Nt7y=vP<=RK{?_&L6>(4yrTrDZU@b#35QR4 z(;iC|-Dn=m5qfz6O}~gv9Y*tApdY`Wp^wmsd(JveqkYS0xZ6`K+zs(c|Q}JZMc@((0Gy7@^iN6YmZiAw0RBues@Py{R}dlxJ(tJ&Z7q731M7?>5Bqqq=ch=~ zL&m~q2SRzMm$3-t=fRGDJ3C%P_qLL;kfoCDPG&5Q(UnW+-UYPkI7ii)ME^eHSVY&3 zQ8vS!OO7Y#?h&V>*D2RioQj*r(d0|$-9?VdLJV_NMCUGGe`F=3)mOQv?A8L-U=?ls z-f4en{r6anDR8=?<#Udo>1B}KPpPX&^)0QHF;Tp(Ow4m?egwiGdVieHH1|IMMRR$< zS=eXT#}Xs>jP{@5c!q_#z=}+O*A<^Hj89SE9`|IG=79c`Hbu&x0!7cBDY9Py6L}+5 zXts|9QEp%!oX&wW#Ml&VA5%-1D#tQJ9YxQ*V6@Mb;0@8o5~ES};}AG!Zp6>&U+dxW zAVz52%W;*~(?C?&Yg*`z{Doy;Jf&B8KEm^qk?#TLit(H}OW4P?vipkHi;QL&*iY#} z(eEDDy&MOruMDQLHiuxOJClsF7s!)P>KUIm++X3IWJ|R4)^UtGi?nzSRZqZ4oYd## z9Y(zI%1>u(V+=pkgAZ}8*3ff$pBiio8R|ji8l_Xz2@n6;lkLE6=E>40RFxs#r}CQVGqiIA;tUSwfpi z&noJgq+F{Kee|7N6022mLC0s=jqc5z-`OgIEvcOJDI(mhm0OGp^^jDudr= z&OcJ}8GERBahf_+j$i2e4W-JP521?>X{o&P61cuXXTPGy5?8xu=`VaLVAN0f4C7GL zC|kHfgm?msPqgi)mkVbB$I<7qW3$+RkJS9Ycs3nA>y*qul`U}Bs^B@}P}Wm1*BNlD z^u5HVpEl3HaS$k?>k#(`fidV{p3y?InxMukR2-(a4_uFe*9ce^f&LMgT5ZstAgv-# zIZLBm68(-_Q`C4)y=iI=MmLTsUfN#z~@iElP$l%f@-JzN6J@$E;-P>e#({2e@)$eASuHwuR!?sb4OYF zk6?I0?QyOq7=!$RQy?lby<~j7e2=MBb?sh3wLNfKq2CQkwz)G5&C9fyqwg_3qDqDS zB!|Lg7aquNEBZf#JBrFD==~K~4s-X5qums=UZ%G_K2zXc0+$P5DYkyYoej?S!E}Q9 z%G|HhTB}a;&`D#RU`)>#nfxa0DjkK6OY|=p+^5`s+8aAJ&JXKNCh?Acdy|RYN+YS! zda!1U{2{$(MJu%S&X+w#p#79u1@LtrQCs61ZsH^%N>< zmuKS^T3J%=O>4bs;jOSgYL(pHKcQWu%3jGnivqT09=AxpbEOwP?^0Lg7jDOnt@8V4 zE7I%y>GrnrZ|mRs%^HhnZcoZ5$FDq}e2IAN;-$koEbU@Nr4aqWH^fYOUT-C`@pi$n z^q#UuZY`z|{j0%#xh%{@g|2{7J&Z-~bxh|Wrm9xS!0K-jrjbY!|I=H{$e6lQewWQD^foYqX~KwC=2EQ8U)|TiV_sS$Sn*Kk?P< zme!7U4*C6{+94zzrIwl{(tWXBQ`TG=UCF1OmXIFQZX9WYY`o2eR{uN@5J3Q168K z&`7Fn?t6RD1r=Z7)o4fXF5kcN4KdRbNt)mC7I&`eJ;f)=riAs|!$t6{)T9OS+W7*+h5g**lYrW~pM>m=*YexANVD&5zNK;8Xu@ z4>-uq$_shx?1{%h+EE!4J>T98_43j%O-s$T6|k{6CoX2uG4`)|z+SD6;k@=@d#s;8 z(Y!myg;PB|exp2;GtbX#JPMAh_Lc}eO{slxt-{f0vb33}r;gcn(`shd$-bL~N3G^E zk5=#0(5l>#ix0HpMtc^M{5I{9)Lz*-vYGknXKF}wldK2*RbMA$&AayNFVCTR^X_In znmzB-F7N!m3q4vu6H6D@jfsvu+S!^m8^5ex&Er%Yq8)+WD@=Nw z^*lzOBS=TJiVs9>vwZfni|W{OY4J|*I64iz)c8%iK6=&tEc|PAyKkwnTsg_Hd`7lB zH>0`5AwMT$3j7)UNqHY%`6im@{$A+$W%qB~*Kf0!_!epDw$U~(-6lI(H1<6e$Rg<} zXl2vnp~Y_>7T?7?y@^;HGkz;pR7uEfe=n31AED^Y4{_8IzmXz@(Hyp3kK4X~FXLuQ zdXWr|@t9vb(8Ze@~gen-DLLG_+7(){vBVwi@Npd{LXU$ zKSjSe7{5`gUL6nTpVU&#pIz-We%FBfBTpNyMgPfD25ZRHf1|b5kdQU}so#ODrw+76 zoUI*V{xwIp`V!TXn%P}WqgKeJn(mMcJR$zkv!y$(?iLt70{0*J{nZ_nhg|1e@kF5k z)_1Mbl)H&DWO|ZDp1XGBXHl(@{s|*bMT=#|o&~YF`R`>rjkWYob6%uk;3?{QoSKs% zum664R!MqgkI745b7NEO5W2;LmLt=?eC@BWd7RevjoUTvL1ar{_T4NF*UC&X<1@?H z<9AZT@kpHW=|ZO}$K&5y>7)E?9yF%C=WTuH1$1ND($%k-*X}jOOcIgQO3hfeZ2kyh z7LRm4Pk!qWGMVI?MULal5v`xtyZWC3vp&U|$vNf0=1E;_wExvsKTcSc(sL;nXyO7^ z=KkQNwMylF8snACzijSjalUqTF5$syzBS4ggc9&DOYdfu#y+WKa4f=0K6CrztF))z zLsNBfCf;5&)COKV=FJ_oZ!Tu*cWJEVG^wYU-hw0>Zg14lv(Q=-Fwb6I+&Ndt+^5kg zUMtO}tNcO5+Tw(Ke*J3oQvX0w;YuqGv7Pg)7TL2}W7MZTJczaPZMBVX%GNkpcWre( zUSrq#y#8^;w6(6ZuR^=~b#Cv}$@}jpxA|`r{U470=|cM>^~8(bD{2__JB*a=KBtB> zw>*CBcZ*lL{lDAjE%Irs-@5hS6DMiP^DG0y{%u9A(s!-Tfx3OB-#cTyYNgj!r9?SN zqaAnLQUC5@XSPO`#%|teeeY$(D_luCs(!+H!m<%ut%+-&s>iMtqSa^&E8a<0&48Dz z)fi^DYds5Yx@Ke8p^eOfovxXLEed;H`lGa%o`*7jOLFLU8-`exkj;2UruMVg{~+l} zYe|RlxYBf5vD0-rp4A%xKi`WKDT8({pJ#O3QJ&{nB+y!AalKs6Aw1WAU?< zhIoo5HUc|_^R)*k6~<&#jO(Ro=5tr$%yOH<^1I6}f)_1*CHs-YBH3qNSYe)^maZY+ zM4kSQ^({FN&m}>6_sPD~WUYFBvW%gO*a~VG#U%Gq{NgA)P+1|YL&hYTP3A6J+~XpnPl(xY36it7PfmP+#mUAZVuMhG2eC$hOPa`l^AMw00zyli_9Snjr+N%+dN>ok*ZZPw zc1KhUTML?b@xNa01oGL6C8X!f$-TWZZqs?iTI*C^*50OSZzR^c0`=a*bRN;N9`cYB zC1}@5+*;9~q&uC5m3%65qPLDID=Pk4fAY?~c2L<4cWYZ)T|LL5`W~9CDbydC{TtqM zw^O=ty}>5y4Y+z5w`8j^T&<=rp}F+-V80ryH{RL1>kb@`Y$v=ZSvzjM5l?hh21~T- zK~B)ER9W2dc>x+Fcu5JG*6s(g{(Asp5>83^|>YsYE2m*#BgP5FFJ0sSYYEL$xd z(s{`0jhaHSujyTjp7Y90mflVNABQZZxE0$v?a?%?qW?-ZD|EAtzDcs0(as@{?z48* z9u(V=TSYI#Z`PI8m916Q*}q%SGTin=kg`JsqEYSbh-2EdmSftr8viOCjjplVT$%5E zFgvb^UA={BpMH9fvvhRiY21nzkk&`i7kVp>y$#eP>m~_oo~QCc?0>}@&HjA$$*-oS zN71?#NoGrLYo9!J->-f06zHsdN=K6Exa|I9Xkv?FF5M4(EWbsK<}ZpM+e>?>W1>ruIS+YjIUjBi6Y$l5|`W`>PlXk_lepW5#1je)XpGV zr|wjyEVix>LdM`coeM(>2=44UkK_1&Bk5wmu_D_dB z$e!Lzsl6;dW6;AM51n7S6K6BC*gBmaWVKzg8fpmT!QwqP`Y%d*E~6i{SR3;(pNzSPo1Uz zzI0^m_#b4eU9uJ0pYRE>R-`PQ!|BAXu!p=zc3!02Jk`^ligLBD?TC0nnn-J!_V3|Z z&-DBL{A#6k