From 691cc51ee8c9e036a5e44af1668399004a2f9a43 Mon Sep 17 00:00:00 2001 From: chudov Date: Sun, 2 May 2010 17:04:51 +0000 Subject: [PATCH] CUETools & CUERipper: Local metadata cache implemented CUETools: register qaac.exe in external encoders CUERipper: hopefully fixed problems with Matrox desktop manager CUERipper: now remembers the drive which was last used CUERipper: added a way to reload metadata taglib-sharp: fixed incompatibility with tags produced by qaac.exe --- CUEControls/BNComboBox.cs | 88 ++-- CUEControls/CUEControls.csproj | 6 +- CUEControls/ImgComboBox.cs | 480 ++++++++++++++++++ CUERipper/frmCUERipper.Designer.cs | 200 ++++---- CUERipper/frmCUERipper.cs | 474 +++++++++-------- CUERipper/frmCUERipper.resx | 153 +++--- CUERipper/frmProperties.cs | 46 +- CUETools.AccurateRip/AccurateRip.cs | 2 +- CUETools.Processor/CUETools.Processor.csproj | 1 + CUETools.Processor/Processor.cs | 220 +++++--- CUETools.Processor/Tagging.cs | 1 + .../Resources/more/icons/card--pencil.png | Bin 0 -> 559 bytes CUETools/Resources/more/icons/tag-label.png | Bin 0 -> 690 bytes CUETools/frmCUETools.cs | 14 +- CUETools/frmChoice.Designer.cs | 10 +- CUETools/frmChoice.cs | 152 ++---- CUETools/frmChoice.resx | 190 ++++--- ThirdParty/taglib-sharp.dll | Bin 299008 -> 299008 bytes 18 files changed, 1287 insertions(+), 750 deletions(-) create mode 100644 CUEControls/ImgComboBox.cs create mode 100644 CUETools/Resources/more/icons/card--pencil.png create mode 100644 CUETools/Resources/more/icons/tag-label.png diff --git a/CUEControls/BNComboBox.cs b/CUEControls/BNComboBox.cs index 5eb4ee3..088caef 100644 --- a/CUEControls/BNComboBox.cs +++ b/CUEControls/BNComboBox.cs @@ -30,9 +30,9 @@ namespace CUEControls private Rectangle rectBtn = new Rectangle(0, 0, 1, 1); private Rectangle rectContent = new Rectangle(0, 0, 1, 1); - private ToolStripControlHost _controlHost; + //private ToolStripControlHost _controlHost; private ListBox _listBox; - private ToolStripDropDown _popupControl; + //private ToolStripDropDown _popupControl; private TextBox _textBox; private DrawMode _drawMode = DrawMode.Normal; @@ -153,9 +153,9 @@ namespace CUEControls _isDroppedDown = value; - if (!_isDroppedDown && _popupControl.IsDropDown) + if (!_isDroppedDown && _listBox.Visible) { - _popupControl.Close(); + _listBox.Visible = false; hovered = this.RectangleToScreen(this.ClientRectangle).Contains(MousePosition); } @@ -163,7 +163,9 @@ namespace CUEControls { _listBox.Width = _dropDownWidth; _listBox.Height = CalculateListHeight(); - _popupControl.Show(this, CalculateDropPosition(), ToolStripDropDownDirection.BelowRight); + _listBox.Location = CalculateDropPosition(); + _listBox.Show(); + //_popupControl.Show(this, CalculateDropPosition(), ToolStripDropDownDirection.BelowRight); Capture = false; _listBox.Capture = true; } @@ -199,11 +201,12 @@ namespace CUEControls { get { - return _popupControl.DropShadowEnabled; + return true; // _popupControl.DropShadowEnabled; } set { - _popupControl.DropShadowEnabled = value; + // TODO + //_popupControl.DropShadowEnabled = value; } } @@ -265,7 +268,7 @@ namespace CUEControls _radius.TopRight = 6; this.Height = 21; - this.Width = 95; + this.Width = 95 + 100; this.SuspendLayout(); _textBox = new TextBox(); @@ -278,32 +281,36 @@ namespace CUEControls _textBox.Padding = new Padding(0); _textBox.TextAlign = HorizontalAlignment.Left; _textBox.Font = base.Font; - this.Controls.Add(_textBox); + + _listBox = new ListBox(); + _listBox.IntegralHeight = true; + _listBox.BorderStyle = BorderStyle.None; + _listBox.SelectionMode = SelectionMode.One; + _listBox.DrawMode = DrawMode.OwnerDrawFixed; + _listBox.Font = base.Font; + //_listBox.DrawMode = DrawMode.Normal; + _listBox.BindingContext = new BindingContext(); + _listBox.Visible = false; + _listBox.Parent = this; + + this.Controls.Add(_textBox); + this.Controls.Add(_listBox); this.ResumeLayout(false); AdjustControls(); - _listBox = new ListBox(); - _listBox.IntegralHeight = true; - _listBox.BorderStyle = BorderStyle.None; - _listBox.SelectionMode = SelectionMode.One; - _listBox.DrawMode = DrawMode.OwnerDrawFixed; - _listBox.Font = base.Font; - //_listBox.DrawMode = DrawMode.Normal; - _listBox.BindingContext = new BindingContext(); + //_controlHost = new ToolStripControlHost(_listBox); + //_controlHost.Padding = new Padding(0); + //_controlHost.Margin = new Padding(0); + //_controlHost.AutoSize = false; - _controlHost = new ToolStripControlHost(_listBox); - _controlHost.Padding = new Padding(0); - _controlHost.Margin = new Padding(0); - _controlHost.AutoSize = false; - - _popupControl = new ToolStripDropDown(); - _popupControl.Padding = new Padding(0); - _popupControl.Margin = new Padding(0); - _popupControl.AutoSize = true; - _popupControl.AutoClose = true; - _popupControl.DropShadowEnabled = true; - _popupControl.Items.Add(_controlHost); + //_popupControl = new ToolStripDropDown(); + //_popupControl.Padding = new Padding(0); + //_popupControl.Margin = new Padding(0); + //_popupControl.AutoSize = true; + //_popupControl.AutoClose = true; + //_popupControl.DropShadowEnabled = true; + //_popupControl.Items.Add(_controlHost); _dropDownWidth = this.Width; @@ -317,8 +324,8 @@ namespace CUEControls _listBox.MouseMove += new MouseEventHandler(_listBox_MouseMove); //(_listBox.DataManager as CurrencyManager).ListChanged += new ListChangedEventHandler(BNComboBox_ListChanged); - _popupControl.Closing += new ToolStripDropDownClosingEventHandler(_popupControl_Closing); - _popupControl.Closed += new ToolStripDropDownClosedEventHandler(_popupControl_Closed); + //_popupControl.Closing += new ToolStripDropDownClosingEventHandler(_popupControl_Closing); + //_popupControl.Closed += new ToolStripDropDownClosedEventHandler(_popupControl_Closed); _textBox.Resize += new EventHandler(_textBox_Resize); _textBox.TextChanged += new EventHandler(_textBox_TextChanged); @@ -331,6 +338,17 @@ namespace CUEControls #region Overrides + protected override CreateParams CreateParams + { + //[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] + get + { + CreateParams cp = base.CreateParams; + cp.Style &= ~0x06000000; + return cp; + } + } + protected override void OnCreateControl() { base.OnCreateControl(); @@ -423,7 +441,7 @@ namespace CUEControls Invalidate(true); } if (!this.RectangleToScreen(this.ClientRectangle).Contains(MousePosition) && - (!IsDroppedDown || !_popupControl.RectangleToScreen(_popupControl.ClientRectangle).Contains(MousePosition))) + (!IsDroppedDown || !_listBox.RectangleToScreen(_listBox.ClientRectangle).Contains(MousePosition))) base.OnMouseLeave(e); } @@ -460,7 +478,7 @@ namespace CUEControls get { if (base.ContainsFocus) return true; - if (this.IsDroppedDown && _popupControl.ContainsFocus) return true; + if (this.IsDroppedDown && _listBox.ContainsFocus) return true; //if (this.IsDroppedDown && _listBox.ContainsFocus) return true; if (this._dropDownStyle != ComboBoxStyle.DropDownList && _textBox.ContainsFocus) return true; return false; @@ -1037,9 +1055,9 @@ namespace CUEControls private Point CalculateDropPosition() { Point point = new Point(0, this.Height); - if ((this.PointToScreen(new Point(0, 0)).Y + this.Height + _controlHost.Height) > Screen.PrimaryScreen.WorkingArea.Height) + if ((this.PointToScreen(new Point(0, 0)).Y + this.Height + _listBox.Height) > Screen.PrimaryScreen.WorkingArea.Height) { - point.Y = -this._controlHost.Height - 7; + point.Y = -this._listBox.Height - 7; } return point; } diff --git a/CUEControls/CUEControls.csproj b/CUEControls/CUEControls.csproj index 61ab018..5b372e4 100644 --- a/CUEControls/CUEControls.csproj +++ b/CUEControls/CUEControls.csproj @@ -42,9 +42,6 @@ - - Component - Component @@ -52,6 +49,9 @@ FileSystemTreeView.cs + + Component + UserControl diff --git a/CUEControls/ImgComboBox.cs b/CUEControls/ImgComboBox.cs new file mode 100644 index 0000000..aca2765 --- /dev/null +++ b/CUEControls/ImgComboBox.cs @@ -0,0 +1,480 @@ +using System.Windows.Forms; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms.Design; +using System.ComponentModel; +using System; + +namespace CUEControls +{ + public class ImgComboBox : ComboBox + { + private Rectangle rectBtn = new Rectangle(0, 0, 1, 1); + private Rectangle rectContent = new Rectangle(0, 0, 1, 1); + private Rectangle rectTextBounds = new Rectangle(0, 0, 1, 1); + private RectRadius _radius = new RectRadius(2, 6, 2, 2); + + public ImgComboBox() + { + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + SetStyle(ControlStyles.ResizeRedraw, true); + SetStyle(ControlStyles.SupportsTransparentBackColor, true); + //SetStyle(ControlStyles.UserMouse, true); + SetStyle(ControlStyles.UserPaint, true); + //SetStyle(ControlStyles.Selectable, true); + base.BackColor = Color.Transparent; + base.DrawMode = DrawMode.OwnerDrawFixed; + AdjustControls(); + } + + #region Properties + + private string _text; + + [Localizable(true),Bindable(true)] + public override string Text + { + get + { + if (DropDownStyle != ComboBoxStyle.DropDownList || Items.Count != 0) + return base.Text; + return _text; + } + set + { + if (DropDownStyle != ComboBoxStyle.DropDownList || Items.Count != 0) + base.Text = value; + _text = value; + Invalidate(); + } + } + + private DrawMode _drawMode = DrawMode.Normal; + + [DefaultValue(DrawMode.Normal)] + [Category("Behavior"), Description("Indicates whether the user code or this control will handle the drawing of elements in the list.")] + public new DrawMode DrawMode + { + get { return _drawMode; } + set + { + _drawMode = value; + base.DrawMode = value == DrawMode.Normal ? DrawMode.OwnerDrawFixed : value; + } + } + + [Category("Appearance"), Description("Selects the radius of combobox edges.")] + [DefaultValue("2, 6, 2, 2")] + public RectRadius Radius + { + get { return _radius; } + set { if (value != null) _radius = value; } + } + private ImageList _imageList = null; + + public ImageList ImageList + { + get + { + return _imageList; + } + set + { + _imageList = value; + AdjustControls(); + } + } + + private string _imageKeyMember = null; + + [Category("Data"), Description("Indicates the property to use as a key to select images from ImageList."), DefaultValue(null)] + [TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + [Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(System.Drawing.Design.UITypeEditor))] + [Browsable(true)] + public string ImageKeyMember + { + get + { + return _imageKeyMember; + } + set + { + _imageKeyMember = value; + } + } + + #endregion + + protected virtual Color GetOuterBorderColor() + { + return (Enabled) ? BackColor : BackColor; + } + + protected virtual Color GetInnerBorderColor() + { + return (Enabled) ? BackColor : SystemColors.Control; + } + + private void AdjustControls() + { + rectTextBounds.X = ClientRectangle.Left + 5 + (ImageList != null ? ImageList.ImageSize.Width + 5 : 0); + rectTextBounds.Y = ClientRectangle.Top + 4; + rectTextBounds.Width = ClientRectangle.Width - rectTextBounds.X - 18; + rectTextBounds.Height = ClientRectangle.Height - 8; + + rectBtn.X = ClientRectangle.Width - 18; + rectBtn.Y = ClientRectangle.Top + 4; + rectBtn.Width = 18; + rectBtn.Height = ClientRectangle.Height - 8; + + rectContent.X = ClientRectangle.Left; + rectContent.Y = ClientRectangle.Top; + rectContent.Width = ClientRectangle.Width; + rectContent.Height = ClientRectangle.Height; + + Invalidate(true); + } + + private int GetImageKey(int index) + { + if (this.ImageList == null || index < 0) + return -1; + object key = FilterItemOnProperty(Items[index], ImageKeyMember ?? DisplayMember); + if (key == null) + return -1; + if (key is int) + return (int)key; + if (key is string) + return this.ImageList.Images.IndexOfKey(key as string); + return -1; + } + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + AdjustControls(); + } + + protected override void OnDrawItem(DrawItemEventArgs e) + { + if (_drawMode != DrawMode.Normal) + { + base.OnDrawItem(e); + return; + } + if ((e.State & DrawItemState.ComboBoxEdit) != 0) + return; + //if (e.State == DrawItemState. + //int _hoverItem = SelectedIndex; + Color fg = e.ForeColor; // _hoverItem != -1 && _hoverItem == e.Index ? SystemColors.HighlightText : ForeColor; + Color bg = e.BackColor; // _hoverItem != -1 && _hoverItem == e.Index ? SystemColors.Highlight : BackColor; + + if (bg == SystemColors.Window || bg.A < 255) + e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds); + else using (Brush b = new SolidBrush(bg)) + e.Graphics.FillRectangle(b, e.Bounds); + + if (e.Index >= 0) + { + Rectangle textBounds = e.Bounds; + + textBounds.X += 5; + textBounds.Width -= 5; + + // image + if (this.ImageList != null) + { + int idx = GetImageKey(e.Index); + if (idx >= 0) + this.ImageList.Draw(e.Graphics, e.Bounds.X + 5, e.Bounds.Y, idx); + textBounds.X += this.ImageList.ImageSize.Width + 5; + textBounds.Width -= this.ImageList.ImageSize.Width + 5; + } + + //text + StringFormat sf = new StringFormat(StringFormatFlags.NoWrap); + sf.Alignment = StringAlignment.Near; + textBounds.Offset(-3, 0); + //textBounds.Height = _textBox.Height; + e.Graphics.DrawString(GetItemText(Items[e.Index]), this.Font, new SolidBrush(fg), textBounds, sf); + } + //base.OnDrawItem(e); + } + + protected override void OnPaint(PaintEventArgs e) + { + bool hovered = this.RectangleToScreen(this.ClientRectangle).Contains(MousePosition); + + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + + //content border + Rectangle rectCont = rectContent; + rectCont.X += 1; + rectCont.Y += 1; + rectCont.Width -= 3; + rectCont.Height -= 3; + GraphicsPath pathContentBorder = CreateRoundRectangle(rectCont, Radius.TopLeft, Radius.TopRight, Radius.BottomRight, + Radius.BottomLeft); + + //button border + Rectangle rectButton = rectBtn; + rectButton.X += 1; + rectButton.Y += 1; + rectButton.Width -= 3; + rectButton.Height -= 3; + GraphicsPath pathBtnBorder = CreateRoundRectangle(rectButton, 0, Radius.TopRight, Radius.BottomRight, 0); + + //outer border + Rectangle rectOuter = rectContent; + rectOuter.Width -= 1; + rectOuter.Height -= 1; + GraphicsPath pathOuterBorder = CreateRoundRectangle(rectOuter, Radius.TopLeft, Radius.TopRight, Radius.BottomRight, + Radius.BottomLeft); + + //inner border + Rectangle rectInner = rectContent; + rectInner.X += 1; + rectInner.Y += 1; + rectInner.Width -= 3; + rectInner.Height -= 3; + GraphicsPath pathInnerBorder = CreateRoundRectangle(rectInner, Radius.TopLeft, Radius.TopRight, Radius.BottomRight, + Radius.BottomLeft); + + //brushes and pens + Color foreColor = Color.FromArgb(DroppedDown ? 100 : 50, ForeColor); + Brush brInnerBrush = new LinearGradientBrush( + new Rectangle(rectInner.X, rectInner.Y, rectInner.Width, rectInner.Height + 1), + Color.FromArgb((hovered || DroppedDown || Focused) ? 200 : 100, ForeColor), + Color.Transparent, + LinearGradientMode.Vertical); + Brush brBackground; + if (this.DropDownStyle == ComboBoxStyle.DropDownList) + brBackground = new LinearGradientBrush(pathInnerBorder.GetBounds(), BackColor, hovered ? Color.FromArgb(100, SystemColors.HotTrack) : foreColor, LinearGradientMode.Vertical); + else + brBackground = new SolidBrush(BackColor); + Pen penInnerBorder = new Pen(brInnerBrush, 0); + LinearGradientBrush brButtonLeft = new LinearGradientBrush(rectBtn, BackColor, ForeColor, LinearGradientMode.Vertical); + ColorBlend blend = new ColorBlend(); + blend.Colors = new Color[] { Color.Transparent, foreColor, Color.Transparent }; + blend.Positions = new float[] { 0.0f, 0.5f, 1.0f }; + brButtonLeft.InterpolationColors = blend; + Pen penLeftButton = new Pen(brButtonLeft, 0); + Brush brButton = new LinearGradientBrush(pathBtnBorder.GetBounds(), BackColor, foreColor, LinearGradientMode.Vertical); + + //draw + e.Graphics.FillPath(brBackground, pathContentBorder); + if (DropDownStyle != ComboBoxStyle.DropDownList) + { + e.Graphics.FillPath(brButton, pathBtnBorder); + } + Color outerBorderColor = GetOuterBorderColor(); + if (outerBorderColor.IsSystemColor) + { + Pen penOuterBorder = SystemPens.FromSystemColor(outerBorderColor); + e.Graphics.DrawPath(penOuterBorder, pathOuterBorder); + } + else using (Pen penOuterBorder = new Pen(outerBorderColor)) + e.Graphics.DrawPath(penOuterBorder, pathOuterBorder); + e.Graphics.DrawPath(penInnerBorder, pathInnerBorder); + + e.Graphics.DrawLine(penLeftButton, rectBtn.Left + 1, rectInner.Top + 1, rectBtn.Left + 1, rectInner.Bottom - 1); + + + //Glimph + Rectangle rectGlimph = rectButton; + rectButton.Width -= 4; + e.Graphics.TranslateTransform(rectGlimph.Left + rectGlimph.Width / 2.0f, rectGlimph.Top + rectGlimph.Height / 2.0f); + GraphicsPath path = new GraphicsPath(); + PointF[] points = new PointF[3]; + points[0] = new PointF(-6 / 2.0f, -3 / 2.0f); + points[1] = new PointF(6 / 2.0f, -3 / 2.0f); + points[2] = new PointF(0, 6 / 2.0f); + path.AddLine(points[0], points[1]); + path.AddLine(points[1], points[2]); + path.CloseFigure(); + e.Graphics.RotateTransform(0); + + SolidBrush br = new SolidBrush(Enabled ? Color.Gray : Color.Gainsboro); + e.Graphics.FillPath(br, path); + e.Graphics.ResetTransform(); + br.Dispose(); + path.Dispose(); + + // image + if (ImageList != null) + { + int idx = GetImageKey(SelectedIndex); + if (idx >= 0) + this.ImageList.Draw(e.Graphics, rectTextBounds.Left - this.ImageList.ImageSize.Width - 5, rectContent.Y + 2, idx); + } + + //text + if (DropDownStyle == ComboBoxStyle.DropDownList) + { + StringFormat sf = new StringFormat(StringFormatFlags.NoWrap); + sf.Alignment = StringAlignment.Near; + + Rectangle rectText = rectTextBounds; + rectText.Offset(-3, 0); + + SolidBrush foreBrush = new SolidBrush(ForeColor); + if (Enabled) + { + e.Graphics.DrawString(Text, this.Font, foreBrush, rectText, sf); + } + else + { + ControlPaint.DrawStringDisabled(e.Graphics, Text, Font, BackColor, rectText, sf); + } + } + /* + Dim foreBrush As SolidBrush = New SolidBrush(color) + If (enabled) Then + g.DrawString(text, font, foreBrush, rect, sf) + Else + ControlPaint.DrawStringDisabled(g, text, font, backColor, _ + rect, sf) + End If + foreBrush.Dispose()*/ + + + pathContentBorder.Dispose(); + pathOuterBorder.Dispose(); + pathInnerBorder.Dispose(); + pathBtnBorder.Dispose(); + + penInnerBorder.Dispose(); + penLeftButton.Dispose(); + + brBackground.Dispose(); + brInnerBrush.Dispose(); + brButtonLeft.Dispose(); + brButton.Dispose(); + } + + public static GraphicsPath CreateRoundRectangle(Rectangle rectangle, int topLeftRadius, int topRightRadius, + int bottomRightRadius, int bottomLeftRadius) + { + GraphicsPath path = new GraphicsPath(); + int l = rectangle.Left; + int t = rectangle.Top; + int w = rectangle.Width; + int h = rectangle.Height; + + if (topLeftRadius > 0) + { + path.AddArc(l, t, topLeftRadius * 2, topLeftRadius * 2, 180, 90); + } + path.AddLine(l + topLeftRadius, t, l + w - topRightRadius, t); + if (topRightRadius > 0) + { + path.AddArc(l + w - topRightRadius * 2, t, topRightRadius * 2, topRightRadius * 2, 270, 90); + } + path.AddLine(l + w, t + topRightRadius, l + w, t + h - bottomRightRadius); + if (bottomRightRadius > 0) + { + path.AddArc(l + w - bottomRightRadius * 2, t + h - bottomRightRadius * 2, + bottomRightRadius * 2, bottomRightRadius * 2, 0, 90); + } + path.AddLine(l + w - bottomRightRadius, t + h, l + bottomLeftRadius, t + h); + if (bottomLeftRadius > 0) + { + path.AddArc(l, t + h - bottomLeftRadius * 2, bottomLeftRadius * 2, bottomLeftRadius * 2, 90, 90); + } + path.AddLine(l, t + h - bottomLeftRadius, l, t + topLeftRadius); + path.CloseFigure(); + return path; + } + } + + [TypeConverter(typeof(RectRadiusConverter))] + public class RectRadius : ICloneable + { + public static readonly RectRadius Default = new RectRadius(); + public RectRadius() + : this(0,0,0,0) + { + } + public RectRadius(int topLeft, int topRight, int bottomLeft, int bottomRight) + { + TopLeft = topLeft; + TopRight = topRight; + BottomLeft = bottomLeft; + BottomRight = bottomRight; + } + public override bool Equals(object other) + { + RectRadius rrOther = other as RectRadius; + return rrOther.TopLeft == TopLeft && rrOther.TopRight == TopRight && rrOther.BottomLeft == BottomLeft && rrOther.BottomRight == BottomRight; + } + public override int GetHashCode() + { + return base.GetHashCode(); + } + object ICloneable.Clone() + { + return new RectRadius(TopLeft, TopRight, BottomLeft, BottomRight); + } + [RefreshProperties(RefreshProperties.All)] + public int TopLeft { get; set; } + [RefreshProperties(RefreshProperties.All)] + public int TopRight {get; set; } + [RefreshProperties(RefreshProperties.All)] + public int BottomLeft { get; set; } + [RefreshProperties(RefreshProperties.All)] + public int BottomRight { get; set; } + } + + // Summary: + // Converts rectangles from one data type to another. Access this class through + // the System.ComponentModel.TypeDescriptor. + public class RectRadiusConverter : TypeConverter + { + public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) + { + PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(RectRadius), attributes); + return props.Sort(new string[] { "TopLeft", "TopRight", "BottomLeft", "BottomRight" }); + } + + public override bool GetPropertiesSupported(ITypeDescriptorContext context) + { + return true; + } + } + + public class ImgComboBoxItem + { + string text; + string imageKey; + T value; + + public string ImageKey + { + get + { + return imageKey; + } + } + + public override string ToString() + { + return text ?? value.ToString(); + } + + public T Value + { + get + { + return value; + } + } + + public ImgComboBoxItem(string text, string imageKey, T value) + { + this.text = text; + this.imageKey = imageKey; + this.value = value; + } + } +} diff --git a/CUERipper/frmCUERipper.Designer.cs b/CUERipper/frmCUERipper.Designer.cs index 8e7f9cf..3416552 100644 --- a/CUERipper/frmCUERipper.Designer.cs +++ b/CUERipper/frmCUERipper.Designer.cs @@ -30,6 +30,13 @@ namespace CUERipper { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmCUERipper)); + CUEControls.RectRadius rectRadius1 = new CUEControls.RectRadius(); + CUEControls.RectRadius rectRadius2 = new CUEControls.RectRadius(); + CUEControls.RectRadius rectRadius3 = new CUEControls.RectRadius(); + CUEControls.RectRadius rectRadius4 = new CUEControls.RectRadius(); + CUEControls.RectRadius rectRadius5 = new CUEControls.RectRadius(); + CUEControls.RectRadius rectRadius6 = new CUEControls.RectRadius(); + CUEControls.RectRadius rectRadius7 = new CUEControls.RectRadius(); this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusLabelMusicBrainz = new System.Windows.Forms.ToolStripStatusLabel(); @@ -49,25 +56,27 @@ namespace CUERipper this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.variousToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.fixEncodingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.reloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.numericWriteOffset = new System.Windows.Forms.NumericUpDown(); this.lblWriteOffset = new System.Windows.Forms.Label(); this.checkBoxEACMode = new System.Windows.Forms.CheckBox(); this.groupBoxSettings = new System.Windows.Forms.GroupBox(); - this.bnComboBoxLosslessOrNot = new CUEControls.BNComboBox(); + this.bnComboBoxLosslessOrNot = new CUEControls.ImgComboBox(); this.losslessOrNotBindingSource = new System.Windows.Forms.BindingSource(this.components); this.bindingSourceCR = new System.Windows.Forms.BindingSource(this.components); - this.bnComboBoxEncoder = new CUEControls.BNComboBox(); + this.bnComboBoxEncoder = new CUEControls.ImgComboBox(); this.encodersBindingSource = new System.Windows.Forms.BindingSource(this.components); this.labelSecureMode = new System.Windows.Forms.Label(); - this.bnComboBoxFormat = new CUEControls.BNComboBox(); + this.bnComboBoxFormat = new CUEControls.ImgComboBox(); this.formatsBindingSource = new System.Windows.Forms.BindingSource(this.components); this.labelEncoderMinMode = new System.Windows.Forms.Label(); - this.bnComboBoxImage = new CUEControls.BNComboBox(); + this.bnComboBoxImage = new CUEControls.ImgComboBox(); this.cUEStylesBindingSource = new System.Windows.Forms.BindingSource(this.components); this.labelEncoderMaxMode = new System.Windows.Forms.Label(); this.labelEncoderMode = new System.Windows.Forms.Label(); this.trackBarEncoderMode = new System.Windows.Forms.TrackBar(); this.trackBarSecureMode = new System.Windows.Forms.TrackBar(); + this.drivesBindingSource = new System.Windows.Forms.BindingSource(this.components); this.imageListChecked = new System.Windows.Forms.ImageList(this.components); this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.progressBarErrors = new ProgressODoom.ProgressBarEx(); @@ -79,12 +88,11 @@ namespace CUERipper this.plainProgressPainter2 = new ProgressODoom.PlainProgressPainter(); this.txtOutputPath = new System.Windows.Forms.TextBox(); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.bnComboBoxRelease = new CUEControls.BNComboBox(); + this.bnComboBoxRelease = new CUEControls.ImgComboBox(); this.releasesBindingSource = new System.Windows.Forms.BindingSource(this.components); this.imageListMetadataSource = new System.Windows.Forms.ImageList(this.components); - this.bnComboBoxDrives = new CUEControls.BNComboBox(); - this.drivesBindingSource = new System.Windows.Forms.BindingSource(this.components); - this.bnComboBoxOutputFormat = new CUEControls.BNComboBox(); + this.bnComboBoxDrives = new CUEControls.ImgComboBox(); + this.bnComboBoxOutputFormat = new CUEControls.ImgComboBox(); this.statusStrip1.SuspendLayout(); this.contextMenuStripRelease.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numericWriteOffset)).BeginInit(); @@ -96,8 +104,8 @@ namespace CUERipper ((System.ComponentModel.ISupportInitialize)(this.cUEStylesBindingSource)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.trackBarEncoderMode)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.trackBarSecureMode)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.releasesBindingSource)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.drivesBindingSource)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.releasesBindingSource)).BeginInit(); this.SuspendLayout(); // // statusStrip1 @@ -127,6 +135,8 @@ namespace CUERipper | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); this.toolStripStatusLabelMusicBrainz.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner; this.toolStripStatusLabelMusicBrainz.Image = global::CUERipper.Properties.Resources.musicbrainz; + this.toolStripStatusLabelMusicBrainz.IsLink = true; + this.toolStripStatusLabelMusicBrainz.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; this.toolStripStatusLabelMusicBrainz.Name = "toolStripStatusLabelMusicBrainz"; resources.ApplyResources(this.toolStripStatusLabelMusicBrainz, "toolStripStatusLabelMusicBrainz"); this.toolStripStatusLabelMusicBrainz.Click += new System.EventHandler(this.toolStripStatusLabelMusicBrainz_Click); @@ -228,7 +238,8 @@ namespace CUERipper this.contextMenuStripRelease.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.editToolStripMenuItem, this.variousToolStripMenuItem, - this.fixEncodingToolStripMenuItem}); + this.fixEncodingToolStripMenuItem, + this.reloadToolStripMenuItem}); this.contextMenuStripRelease.Name = "contextMenuStripRelease"; resources.ApplyResources(this.contextMenuStripRelease, "contextMenuStripRelease"); this.contextMenuStripRelease.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripRelease_Opening); @@ -251,6 +262,12 @@ namespace CUERipper resources.ApplyResources(this.fixEncodingToolStripMenuItem, "fixEncodingToolStripMenuItem"); this.fixEncodingToolStripMenuItem.Click += new System.EventHandler(this.fixEncodingToolStripMenuItem_Click); // + // reloadToolStripMenuItem + // + this.reloadToolStripMenuItem.Name = "reloadToolStripMenuItem"; + resources.ApplyResources(this.reloadToolStripMenuItem, "reloadToolStripMenuItem"); + this.reloadToolStripMenuItem.Click += new System.EventHandler(this.reloadToolStripMenuItem_Click); + // // numericWriteOffset // resources.ApplyResources(this.numericWriteOffset, "numericWriteOffset"); @@ -299,24 +316,21 @@ namespace CUERipper // // bnComboBoxLosslessOrNot // - this.bnComboBoxLosslessOrNot.BackColor = System.Drawing.Color.White; + this.bnComboBoxLosslessOrNot.BackColor = System.Drawing.Color.Transparent; this.bnComboBoxLosslessOrNot.DataSource = this.losslessOrNotBindingSource; - this.bnComboBoxLosslessOrNot.DropDownHeight = 200; this.bnComboBoxLosslessOrNot.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.bnComboBoxLosslessOrNot.DropDownWidth = 80; this.bnComboBoxLosslessOrNot.ForeColor = System.Drawing.SystemColors.ControlText; this.bnComboBoxLosslessOrNot.ImageKeyMember = "ImageKey"; this.bnComboBoxLosslessOrNot.ImageList = null; - this.bnComboBoxLosslessOrNot.IsDroppedDown = false; resources.ApplyResources(this.bnComboBoxLosslessOrNot, "bnComboBoxLosslessOrNot"); - this.bnComboBoxLosslessOrNot.MaxDropDownItems = 8; - this.bnComboBoxLosslessOrNot.MinimumSize = new System.Drawing.Size(40, 21); + this.bnComboBoxLosslessOrNot.MinimumSize = new System.Drawing.Size(40, 0); this.bnComboBoxLosslessOrNot.Name = "bnComboBoxLosslessOrNot"; - this.bnComboBoxLosslessOrNot.Radius = ((CUEControls.BNRadius)(resources.GetObject("bnComboBoxLosslessOrNot.Radius"))); - this.bnComboBoxLosslessOrNot.SelectedIndex = -1; - this.bnComboBoxLosslessOrNot.SelectedItem = null; - this.bnComboBoxLosslessOrNot.Sorted = false; - this.bnComboBoxLosslessOrNot.SelectedIndexChanged += new System.EventHandler(this.bnComboBoxLosslessOrNot_SelectedIndexChanged); + rectRadius1.BottomLeft = 2; + rectRadius1.BottomRight = 2; + rectRadius1.TopLeft = 2; + rectRadius1.TopRight = 6; + this.bnComboBoxLosslessOrNot.Radius = rectRadius1; + this.bnComboBoxLosslessOrNot.SelectedValueChanged += new System.EventHandler(this.bnComboBoxLosslessOrNot_SelectedValueChanged); // // losslessOrNotBindingSource // @@ -325,27 +339,24 @@ namespace CUERipper // // bindingSourceCR // - this.bindingSourceCR.DataSource = typeof(CUERipper.frmCUERipper); + this.bindingSourceCR.DataSource = typeof(CUERipper.CUERipperData); // // bnComboBoxEncoder // - this.bnComboBoxEncoder.BackColor = System.Drawing.Color.White; + this.bnComboBoxEncoder.BackColor = System.Drawing.Color.Transparent; this.bnComboBoxEncoder.DataSource = this.encodersBindingSource; - this.bnComboBoxEncoder.DropDownHeight = 200; this.bnComboBoxEncoder.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.bnComboBoxEncoder.DropDownWidth = 80; this.bnComboBoxEncoder.ForeColor = System.Drawing.SystemColors.ControlText; this.bnComboBoxEncoder.ImageList = null; - this.bnComboBoxEncoder.IsDroppedDown = false; resources.ApplyResources(this.bnComboBoxEncoder, "bnComboBoxEncoder"); - this.bnComboBoxEncoder.MaxDropDownItems = 8; - this.bnComboBoxEncoder.MinimumSize = new System.Drawing.Size(40, 21); + this.bnComboBoxEncoder.MinimumSize = new System.Drawing.Size(40, 0); this.bnComboBoxEncoder.Name = "bnComboBoxEncoder"; - this.bnComboBoxEncoder.Radius = ((CUEControls.BNRadius)(resources.GetObject("bnComboBoxEncoder.Radius"))); - this.bnComboBoxEncoder.SelectedIndex = -1; - this.bnComboBoxEncoder.SelectedItem = null; - this.bnComboBoxEncoder.Sorted = false; - this.bnComboBoxEncoder.SelectedIndexChanged += new System.EventHandler(this.comboBoxEncoder_SelectedIndexChanged); + rectRadius2.BottomLeft = 2; + rectRadius2.BottomRight = 2; + rectRadius2.TopLeft = 2; + rectRadius2.TopRight = 6; + this.bnComboBoxEncoder.Radius = rectRadius2; + this.bnComboBoxEncoder.SelectedValueChanged += new System.EventHandler(this.bnComboBoxEncoder_SelectedValueChanged); // // encodersBindingSource // @@ -359,24 +370,20 @@ namespace CUERipper // // bnComboBoxFormat // - this.bnComboBoxFormat.BackColor = System.Drawing.Color.White; + this.bnComboBoxFormat.BackColor = System.Drawing.Color.Transparent; this.bnComboBoxFormat.DataSource = this.formatsBindingSource; - this.bnComboBoxFormat.DropDownHeight = 200; this.bnComboBoxFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.bnComboBoxFormat.DropDownWidth = 80; this.bnComboBoxFormat.ForeColor = System.Drawing.SystemColors.ControlText; this.bnComboBoxFormat.ImageKeyMember = "DotExtension"; this.bnComboBoxFormat.ImageList = null; - this.bnComboBoxFormat.IsDroppedDown = false; resources.ApplyResources(this.bnComboBoxFormat, "bnComboBoxFormat"); - this.bnComboBoxFormat.MaxDropDownItems = 8; - this.bnComboBoxFormat.MinimumSize = new System.Drawing.Size(40, 21); this.bnComboBoxFormat.Name = "bnComboBoxFormat"; - this.bnComboBoxFormat.Radius = ((CUEControls.BNRadius)(resources.GetObject("bnComboBoxFormat.Radius"))); - this.bnComboBoxFormat.SelectedIndex = -1; - this.bnComboBoxFormat.SelectedItem = null; - this.bnComboBoxFormat.Sorted = false; - this.bnComboBoxFormat.SelectedIndexChanged += new System.EventHandler(this.bnComboBoxFormat_SelectedIndexChanged); + rectRadius3.BottomLeft = 2; + rectRadius3.BottomRight = 2; + rectRadius3.TopLeft = 2; + rectRadius3.TopRight = 6; + this.bnComboBoxFormat.Radius = rectRadius3; + this.bnComboBoxFormat.SelectedValueChanged += new System.EventHandler(this.bnComboBoxFormat_SelectedValueChanged); // // formatsBindingSource // @@ -390,22 +397,19 @@ namespace CUERipper // // bnComboBoxImage // - this.bnComboBoxImage.BackColor = System.Drawing.Color.White; + this.bnComboBoxImage.BackColor = System.Drawing.Color.Transparent; this.bnComboBoxImage.DataSource = this.cUEStylesBindingSource; - this.bnComboBoxImage.DropDownHeight = 200; this.bnComboBoxImage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.bnComboBoxImage.DropDownWidth = 80; this.bnComboBoxImage.ForeColor = System.Drawing.SystemColors.ControlText; this.bnComboBoxImage.ImageList = null; - this.bnComboBoxImage.IsDroppedDown = false; resources.ApplyResources(this.bnComboBoxImage, "bnComboBoxImage"); - this.bnComboBoxImage.MaxDropDownItems = 8; - this.bnComboBoxImage.MinimumSize = new System.Drawing.Size(40, 21); + this.bnComboBoxImage.MinimumSize = new System.Drawing.Size(40, 0); this.bnComboBoxImage.Name = "bnComboBoxImage"; - this.bnComboBoxImage.Radius = ((CUEControls.BNRadius)(resources.GetObject("bnComboBoxImage.Radius"))); - this.bnComboBoxImage.SelectedIndex = -1; - this.bnComboBoxImage.SelectedItem = null; - this.bnComboBoxImage.Sorted = false; + rectRadius4.BottomLeft = 2; + rectRadius4.BottomRight = 2; + rectRadius4.TopLeft = 2; + rectRadius4.TopRight = 6; + this.bnComboBoxImage.Radius = rectRadius4; // // cUEStylesBindingSource // @@ -432,11 +436,16 @@ namespace CUERipper // trackBarSecureMode // resources.ApplyResources(this.trackBarSecureMode, "trackBarSecureMode"); - this.trackBarSecureMode.LargeChange = 3; + this.trackBarSecureMode.LargeChange = 1; this.trackBarSecureMode.Maximum = 2; this.trackBarSecureMode.Name = "trackBarSecureMode"; this.trackBarSecureMode.Scroll += new System.EventHandler(this.trackBarSecureMode_Scroll); // + // drivesBindingSource + // + this.drivesBindingSource.DataMember = "Drives"; + this.drivesBindingSource.DataSource = this.bindingSourceCR; + // // imageListChecked // this.imageListChecked.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListChecked.ImageStream"))); @@ -529,26 +538,23 @@ namespace CUERipper // // bnComboBoxRelease // - this.bnComboBoxRelease.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.bnComboBoxRelease.BackColor = System.Drawing.Color.Transparent; this.bnComboBoxRelease.ContextMenuStrip = this.contextMenuStripRelease; this.bnComboBoxRelease.DataSource = this.releasesBindingSource; - this.bnComboBoxRelease.DropDownHeight = 200; this.bnComboBoxRelease.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.bnComboBoxRelease.DropDownWidth = 552; this.bnComboBoxRelease.ForeColor = System.Drawing.SystemColors.ControlText; this.bnComboBoxRelease.ImageKeyMember = "ImageKey"; this.bnComboBoxRelease.ImageList = this.imageListMetadataSource; - this.bnComboBoxRelease.IsDroppedDown = false; resources.ApplyResources(this.bnComboBoxRelease, "bnComboBoxRelease"); - this.bnComboBoxRelease.MaxDropDownItems = 8; - this.bnComboBoxRelease.MinimumSize = new System.Drawing.Size(61, 21); + this.bnComboBoxRelease.MinimumSize = new System.Drawing.Size(61, 0); this.bnComboBoxRelease.Name = "bnComboBoxRelease"; - this.bnComboBoxRelease.Radius = ((CUEControls.BNRadius)(resources.GetObject("bnComboBoxRelease.Radius"))); - this.bnComboBoxRelease.SelectedIndex = -1; - this.bnComboBoxRelease.SelectedItem = null; - this.bnComboBoxRelease.Sorted = false; + rectRadius5.BottomLeft = 2; + rectRadius5.BottomRight = 2; + rectRadius5.TopLeft = 2; + rectRadius5.TopRight = 6; + this.bnComboBoxRelease.Radius = rectRadius5; this.toolTip1.SetToolTip(this.bnComboBoxRelease, resources.GetString("bnComboBoxRelease.ToolTip")); - this.bnComboBoxRelease.SelectedIndexChanged += new System.EventHandler(this.bnComboBoxRelease_SelectedIndexChanged); + this.bnComboBoxRelease.SelectedValueChanged += new System.EventHandler(this.bnComboBoxRelease_SelectedValueChanged); // // releasesBindingSource // @@ -561,53 +567,42 @@ namespace CUERipper this.imageListMetadataSource.TransparentColor = System.Drawing.Color.Transparent; this.imageListMetadataSource.Images.SetKeyName(0, "musicbrainz"); this.imageListMetadataSource.Images.SetKeyName(1, "freedb"); + this.imageListMetadataSource.Images.SetKeyName(2, "local"); // // bnComboBoxDrives // - this.bnComboBoxDrives.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.bnComboBoxDrives.BackColor = System.Drawing.Color.Transparent; this.bnComboBoxDrives.DataSource = this.drivesBindingSource; - this.bnComboBoxDrives.DropDownHeight = 200; this.bnComboBoxDrives.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.bnComboBoxDrives.DropDownWidth = 552; this.bnComboBoxDrives.ForeColor = System.Drawing.SystemColors.ControlText; this.bnComboBoxDrives.ImageKeyMember = "ImageKey"; this.bnComboBoxDrives.ImageList = this.imageListMetadataSource; - this.bnComboBoxDrives.IsDroppedDown = false; resources.ApplyResources(this.bnComboBoxDrives, "bnComboBoxDrives"); - this.bnComboBoxDrives.MaxDropDownItems = 8; - this.bnComboBoxDrives.MinimumSize = new System.Drawing.Size(61, 21); + this.bnComboBoxDrives.MinimumSize = new System.Drawing.Size(61, 0); this.bnComboBoxDrives.Name = "bnComboBoxDrives"; - this.bnComboBoxDrives.Radius = ((CUEControls.BNRadius)(resources.GetObject("bnComboBoxDrives.Radius"))); - this.bnComboBoxDrives.SelectedIndex = -1; - this.bnComboBoxDrives.SelectedItem = null; - this.bnComboBoxDrives.Sorted = false; - this.bnComboBoxDrives.SelectedIndexChanged += new System.EventHandler(this.bnComboBoxDrives_SelectedIndexChanged); - // - // drivesBindingSource - // - this.drivesBindingSource.DataMember = "Drives"; - this.drivesBindingSource.DataSource = this.bindingSourceCR; + rectRadius6.BottomLeft = 2; + rectRadius6.BottomRight = 2; + rectRadius6.TopLeft = 2; + rectRadius6.TopRight = 6; + this.bnComboBoxDrives.Radius = rectRadius6; + this.bnComboBoxDrives.SelectedValueChanged += new System.EventHandler(this.bnComboBoxDrives_SelectedValueChanged); // // bnComboBoxOutputFormat // - this.bnComboBoxOutputFormat.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.bnComboBoxOutputFormat.DropDownHeight = 200; - this.bnComboBoxOutputFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown; - this.bnComboBoxOutputFormat.DropDownWidth = 552; + this.bnComboBoxOutputFormat.BackColor = System.Drawing.Color.Transparent; this.bnComboBoxOutputFormat.ForeColor = System.Drawing.SystemColors.ControlText; this.bnComboBoxOutputFormat.ImageList = null; - this.bnComboBoxOutputFormat.IsDroppedDown = false; resources.ApplyResources(this.bnComboBoxOutputFormat, "bnComboBoxOutputFormat"); - this.bnComboBoxOutputFormat.MaxDropDownItems = 8; - this.bnComboBoxOutputFormat.MinimumSize = new System.Drawing.Size(40, 21); + this.bnComboBoxOutputFormat.MinimumSize = new System.Drawing.Size(40, 0); this.bnComboBoxOutputFormat.Name = "bnComboBoxOutputFormat"; - this.bnComboBoxOutputFormat.Radius = ((CUEControls.BNRadius)(resources.GetObject("bnComboBoxOutputFormat.Radius"))); - this.bnComboBoxOutputFormat.SelectedIndex = -1; - this.bnComboBoxOutputFormat.SelectedItem = null; - this.bnComboBoxOutputFormat.Sorted = false; - this.bnComboBoxOutputFormat.DroppedDown += new System.EventHandler(this.bnComboBoxOutputFormat_DroppedDown); + rectRadius7.BottomLeft = 2; + rectRadius7.BottomRight = 2; + rectRadius7.TopLeft = 2; + rectRadius7.TopRight = 6; + this.bnComboBoxOutputFormat.Radius = rectRadius7; this.bnComboBoxOutputFormat.Leave += new System.EventHandler(this.bnComboBoxOutputFormat_Leave); this.bnComboBoxOutputFormat.MouseLeave += new System.EventHandler(this.bnComboBoxOutputFormat_MouseLeave); + this.bnComboBoxOutputFormat.DropDown += new System.EventHandler(this.bnComboBoxOutputFormat_DroppedDown); this.bnComboBoxOutputFormat.TextChanged += new System.EventHandler(this.bnComboBoxOutputFormat_TextChanged); // // frmCUERipper @@ -647,8 +642,8 @@ namespace CUERipper ((System.ComponentModel.ISupportInitialize)(this.cUEStylesBindingSource)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.trackBarEncoderMode)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.trackBarSecureMode)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.releasesBindingSource)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.drivesBindingSource)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.releasesBindingSource)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -693,24 +688,25 @@ namespace CUERipper private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelMusicBrainz; private System.Windows.Forms.TextBox txtOutputPath; private System.Windows.Forms.ToolTip toolTip1; - private CUEControls.BNComboBox bnComboBoxImage; + private CUEControls.ImgComboBox bnComboBoxImage; private System.Windows.Forms.BindingSource bindingSourceCR; private System.Windows.Forms.ImageList imageListMetadataSource; private System.Windows.Forms.BindingSource cUEStylesBindingSource; - private CUEControls.BNComboBox bnComboBoxRelease; + private CUEControls.ImgComboBox bnComboBoxRelease; private System.Windows.Forms.BindingSource releasesBindingSource; - private CUEControls.BNComboBox bnComboBoxDrives; + private CUEControls.ImgComboBox bnComboBoxDrives; private System.Windows.Forms.BindingSource drivesBindingSource; - private CUEControls.BNComboBox bnComboBoxFormat; + private CUEControls.ImgComboBox bnComboBoxFormat; private System.Windows.Forms.BindingSource formatsBindingSource; - private CUEControls.BNComboBox bnComboBoxEncoder; + private CUEControls.ImgComboBox bnComboBoxEncoder; private System.Windows.Forms.BindingSource encodersBindingSource; - private CUEControls.BNComboBox bnComboBoxLosslessOrNot; + private CUEControls.ImgComboBox bnComboBoxLosslessOrNot; private System.Windows.Forms.BindingSource losslessOrNotBindingSource; - private CUEControls.BNComboBox bnComboBoxOutputFormat; + private CUEControls.ImgComboBox bnComboBoxOutputFormat; private System.Windows.Forms.ImageList imageListChecked; private System.Windows.Forms.ToolStripMenuItem variousToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem fixEncodingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem reloadToolStripMenuItem; } } diff --git a/CUERipper/frmCUERipper.cs b/CUERipper/frmCUERipper.cs index 085af54..4cb771a 100644 --- a/CUERipper/frmCUERipper.cs +++ b/CUERipper/frmCUERipper.cs @@ -28,11 +28,13 @@ namespace CUERipper private StartStop _startStop; private CUEConfig _config; private CUESheet cueSheet; - private ReleaseInfo selectedRelease; + private CUEMetadataEntry selectedRelease; private DriveInfo selectedDriveInfo; private string _pathOut; string _defaultLosslessFormat, _defaultLossyFormat, _defaultHybridFormat; private CUEControls.ShellIconMgr m_icon_mgr; + private string defaultDrive; + internal CUERipperData data = new CUERipperData(); public frmCUERipper() { @@ -55,65 +57,6 @@ namespace CUERipper "%music%\\%artist%\\[%year% - ]%album%[ - %edition%]$ifgreater($max(%discnumber%,%totaldiscs%),1, - cd %discnumber%,)[' ('%unique%')']\\%artist% - %album%[ - %edition%].cue" }; - private BindingList cueStyles = new BindingList { "image", "tracks" }; - //private BindingList losslessOrNot = new BindingList { "lossless", "lossy" }; - private BindingList> losslessOrNot = new BindingList> { - new BNComboBoxItem("lossless", "checked", AudioEncoderType.Lossless), - new BNComboBoxItem("lossy", "unchecked", AudioEncoderType.Lossy) - }; - private BindingList releases = new BindingList(); - private BindingList drives = new BindingList(); - private BindingList formats = new BindingList(); - private BindingList encoders = new BindingList(); - - public BindingList CUEStyles - { - get - { - return cueStyles; - } - } - - public BindingList> LosslessOrNot - { - get - { - return losslessOrNot; - } - } - - public BindingList Releases - { - get - { - return releases; - } - } - - public BindingList Drives - { - get - { - return drives; - } - } - - public BindingList Formats - { - get - { - return formats; - } - } - - public BindingList Encoders - { - get - { - return encoders; - } - } - private void frmCUERipper_Load(object sender, EventArgs e) { SettingsReader sr = new SettingsReader("CUERipper", "settings.txt", Application.ExecutablePath); @@ -125,7 +68,7 @@ namespace CUERipper //_config.preserveHTOA = sr.LoadBoolean("PreserveHTOA") ?? false; //_config.createM3U = sr.LoadBoolean("CreateM3U") ?? true; - bindingSourceCR.DataSource = this; + bindingSourceCR.DataSource = data; bnComboBoxDrives.ImageList = m_icon_mgr.ImageList; bnComboBoxFormat.ImageList = m_icon_mgr.ImageList; SetupControls(); @@ -142,6 +85,7 @@ namespace CUERipper bnComboBoxImage.SelectedIndex = sr.LoadInt32("ComboImage", 0, bnComboBoxImage.Items.Count - 1) ?? 0; trackBarSecureMode.Value = sr.LoadInt32("SecureMode", 0, trackBarSecureMode.Maximum - 1) ?? 1; trackBarSecureMode_Scroll(this, new EventArgs()); + defaultDrive = sr.Load("DefaultDrive"); UpdateDrives(); } @@ -171,7 +115,10 @@ namespace CUERipper if (val == DBT_DEVICEARRIVAL || val == DBT_DEVICEREMOVECOMPLETE) UpdateDrive(); else if (val == DBT_DEVNODES_CHANGED) - UpdateDrives(); + { + if (_workThread == null) + UpdateDrives(); + } } base.WndProc(ref m); } @@ -179,7 +126,7 @@ namespace CUERipper private void DrivesLookup(object o) { // Lookup - drives.RaiseListChangedEvents = false; + data.Drives.RaiseListChangedEvents = false; foreach (char drive in CDDrivesList.DrivesAvailable()) { ICDRipper reader = null; @@ -204,35 +151,40 @@ namespace CUERipper } catch { - drives.Add(new DriveInfo(m_icon_mgr, drive + ":\\", ex.Message)); + data.Drives.Add(new DriveInfo(m_icon_mgr, drive + ":\\", ex.Message)); continue; } } if (!AccurateRipVerify.FindDriveReadOffset(arName, out driveOffset)) ; //throw new Exception("Failed to find drive read offset for drive" + _ripper.ARName); reader.DriveOffset = driveOffset; - drives.Add(new DriveInfo(m_icon_mgr, drive + ":\\", reader)); + data.Drives.Add(new DriveInfo(m_icon_mgr, drive + ":\\", reader)); } - _workThread = null; this.BeginInvoke((MethodInvoker)delegate() { + data.Drives.RaiseListChangedEvents = true; + data.Drives.ResetBindings(); + for(int i = 0; i < bnComboBoxDrives.Items.Count; i++) + if ((bnComboBoxDrives.Items[i] as DriveInfo).Path == defaultDrive) + bnComboBoxDrives.SelectedIndex = i; + _workThread = null; SetupControls(); - drives.RaiseListChangedEvents = true; - drives.ResetBindings(); - if (drives.Count == 0) + if (data.Drives.Count == 0) bnComboBoxDrives.Text = Properties.Resources.NoDrives; + else + UpdateDrive(); }); } private void UpdateDrives() { buttonGo.Enabled = false; - foreach (DriveInfo driveInfo in drives) + foreach (DriveInfo driveInfo in data.Drives) if (driveInfo.drive != null) driveInfo.drive.Close(); - drives.Clear(); + data.Drives.Clear(); listTracks.Items.Clear(); - releases.Clear(); + data.Releases.Clear(); selectedRelease = null; selectedDriveInfo = null; bnComboBoxRelease.Text = ""; @@ -259,8 +211,8 @@ namespace CUERipper bnComboBoxOutputFormat.Visible = outputFormatVisible; txtOutputPath.Visible = !outputFormatVisible; txtOutputPath.Enabled = !running && !outputFormatVisible; - bnComboBoxRelease.Enabled = !running && releases.Count > 0; - bnComboBoxDrives.Enabled = !running && drives.Count > 0; + bnComboBoxRelease.Enabled = !running && data.Releases.Count > 0; + bnComboBoxDrives.Enabled = !running && data.Drives.Count > 0; bnComboBoxOutputFormat.Enabled = listTracks.Enabled = groupBoxSettings.Enabled = !running; @@ -399,7 +351,7 @@ namespace CUERipper { this.BeginInvoke((MethodInvoker)delegate() { - releases.Clear(); + data.Releases.Clear(); selectedRelease = null; bnComboBoxRelease.Text = ex.Message; }); @@ -424,6 +376,8 @@ namespace CUERipper bnComboBoxOutputFormat.Items.RemoveAt(OutputPathUseTemplates.Length + 10); } + selectedRelease.metadata.Save(); + cueSheet.CopyMetadata(selectedRelease.metadata); cueSheet.OutputStyle = bnComboBoxImage.SelectedIndex == 0 ? CUEStyle.SingleFileWithCUE : CUEStyle.GapsAppended; @@ -458,7 +412,7 @@ namespace CUERipper private void UpdateRelease() { listTracks.Items.Clear(); - selectedRelease = bnComboBoxRelease.SelectedItem as ReleaseInfo; + selectedRelease = bnComboBoxRelease.SelectedItem as CUEMetadataEntry; comboBoxOutputFormat_TextUpdate(this, new EventArgs()); if (selectedRelease == null) return; @@ -485,43 +439,42 @@ namespace CUERipper }); } - private ReleaseInfo CreateCUESheet(ICDRipper audioSource, Release release, CDEntry cdEntry) + private CUEMetadataEntry CreateCUESheet(ICDRipper audioSource, Release release) { - ReleaseInfo r = new ReleaseInfo(_config, audioSource.TOC); - General.SetCUELine(r.metadata.Attributes, "REM", "GENRE", "", true); - General.SetCUELine(r.metadata.Attributes, "REM", "DATE", "", false); - if (release != null) - { - r.metadata.FillFromMusicBrainz(release); - r.ImageKey = "musicbrainz"; - } - else if (cdEntry != null) - { - r.metadata.FillFromFreedb(cdEntry); - r.ImageKey = "freedb"; - } - else - { - r.metadata.Artist = "Unknown Artist"; - r.metadata.Title = "Unknown Title"; - for (int i = 0; i < audioSource.TOC.AudioTracks; i++) - { - r.metadata.Tracks[i].Title = string.Format("Track {0:00}", i + 1); - r.metadata.Tracks[i].Artist = r.metadata.Artist; - } - } - if (r.metadata.Genre == "") r.metadata.Genre = ""; - if (r.metadata.Year == "") r.metadata.Year = ""; - return r; + CUEMetadataEntry entry = new CUEMetadataEntry(audioSource.TOC, "musicbrainz"); + entry.metadata.FillFromMusicBrainz(release, entry.TOC.FirstAudio - 1); + return entry; } + private CUEMetadataEntry CreateCUESheet(ICDRipper audioSource, CDEntry cdEntry) + { + CUEMetadataEntry entry = new CUEMetadataEntry(audioSource.TOC, "freedb"); + entry.metadata.FillFromFreedb(cdEntry, entry.TOC.FirstAudio - 1); + return entry; + } + + private CUEMetadataEntry CreateCUESheet(ICDRipper audioSource) + { + CUEMetadataEntry entry = new CUEMetadataEntry(audioSource.TOC, "local"); + entry.metadata.Artist = "Unknown Artist"; + entry.metadata.Title = "Unknown Title"; + for (int i = 0; i < entry.TOC.AudioTracks; i++) + { + entry.metadata.Tracks[i].Title = string.Format("Track {0:00}", i + 1); + entry.metadata.Tracks[i].Artist = entry.metadata.Artist; + } + return entry; + } + + private bool loadAllMetadata = false; + private void Lookup(object o) { ICDRipper audioSource = o as ICDRipper; int mbresults_count = 0; // have to cache results.Count, because it sometimes hangs in it, and we don't want UI thread to hang. string musicbrainzError = ""; - releases.RaiseListChangedEvents = false; + data.Releases.RaiseListChangedEvents = false; cueSheet = new CUESheet(_config); cueSheet.OpenCD(audioSource); @@ -532,86 +485,103 @@ namespace CUERipper cueSheet.CTDB.UploadHelper.onProgress += new EventHandler(UploadProgress); this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " AccurateRip..."; }); cueSheet.UseAccurateRip(); - this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " MusicBrainz..."; }); General.SetCUELine(cueSheet.Attributes, "REM", "DISCID", AccurateRipVerify.CalculateCDDBId(audioSource.TOC), false); General.SetCUELine(cueSheet.Attributes, "REM", "COMMENT", _config.createEACLOG ? "ExactAudioCopy v0.99pb4" : audioSource.RipperVersion, true); - ReleaseQueryParameters p = new ReleaseQueryParameters(); - p.DiscId = audioSource.TOC.MusicBrainzId; - Query results = Release.Query(p); - MusicBrainzService.XmlRequest += new EventHandler(MusicBrainz_LookupProgress); - try { - foreach (Release release in results) - { - release.GetEvents(); - release.GetTracks(); - releases.Add(CreateCUESheet(audioSource, release, null)); - } - mbresults_count = results.Count; + CUEMetadata cache = CUEMetadata.Load(audioSource.TOC.TOCID); + if (cache != null) + data.Releases.Add(new CUEMetadataEntry(cache, audioSource.TOC, "local")); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message); - if (!(ex is MusicBrainzNotFoundException)) - musicbrainzError = ex.Message; } - MusicBrainzService.XmlRequest -= new EventHandler(MusicBrainz_LookupProgress); - - FreedbHelper m_freedb = new FreedbHelper(); - - m_freedb.UserName = "gchudov"; - m_freedb.Hostname = "gmail.com"; - m_freedb.ClientName = "CUERipper"; - m_freedb.Version = "2.0.8"; - m_freedb.SetDefaultSiteAddress(Properties.Settings.Default.MAIN_FREEDB_SITEADDRESS); - - QueryResult queryResult; - QueryResultCollection coll; - string code = string.Empty; - try + if (data.Releases.Count == 0 || loadAllMetadata) { - MusicBrainz_LookupProgress(this, null); - code = m_freedb.Query(AccurateRipVerify.CalculateCDDBQuery(audioSource.TOC), out queryResult, out coll); - if (code == FreedbHelper.ResponseCodes.CODE_200) + loadAllMetadata = false; + + this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " MusicBrainz..."; }); + + ReleaseQueryParameters p = new ReleaseQueryParameters(); + p.DiscId = audioSource.TOC.MusicBrainzId; + Query results = Release.Query(p); + MusicBrainzService.XmlRequest += new EventHandler(MusicBrainz_LookupProgress); + + try { - CDEntry cdEntry; - MusicBrainz_LookupProgress(this, null); - code = m_freedb.Read(queryResult, out cdEntry); - if (code == FreedbHelper.ResponseCodes.CODE_210) + foreach (Release release in results) { - ReleaseInfo r = CreateCUESheet(audioSource, null, cdEntry); - releases.Add(r); + release.GetEvents(); + release.GetTracks(); + data.Releases.Add(CreateCUESheet(audioSource, release)); } + mbresults_count = results.Count; } - else - if (code == FreedbHelper.ResponseCodes.CODE_210 || - code == FreedbHelper.ResponseCodes.CODE_211 ) + catch (Exception ex) { - foreach (QueryResult qr in coll) + System.Diagnostics.Trace.WriteLine(ex.Message); + if (!(ex is MusicBrainzNotFoundException)) + musicbrainzError = ex.Message; + } + MusicBrainzService.XmlRequest -= new EventHandler(MusicBrainz_LookupProgress); + + + FreedbHelper m_freedb = new FreedbHelper(); + + m_freedb.UserName = "gchudov"; + m_freedb.Hostname = "gmail.com"; + m_freedb.ClientName = "CUERipper"; + m_freedb.Version = "2.0.8"; + m_freedb.SetDefaultSiteAddress(Properties.Settings.Default.MAIN_FREEDB_SITEADDRESS); + + QueryResult queryResult; + QueryResultCollection coll; + string code = string.Empty; + try + { + MusicBrainz_LookupProgress(this, null); + code = m_freedb.Query(AccurateRipVerify.CalculateCDDBQuery(audioSource.TOC), out queryResult, out coll); + if (code == FreedbHelper.ResponseCodes.CODE_200) { CDEntry cdEntry; MusicBrainz_LookupProgress(this, null); - code = m_freedb.Read(qr, out cdEntry); + code = m_freedb.Read(queryResult, out cdEntry); if (code == FreedbHelper.ResponseCodes.CODE_210) { - ReleaseInfo r = CreateCUESheet(audioSource, null, cdEntry); - releases.Add(r); + CUEMetadataEntry r = CreateCUESheet(audioSource, cdEntry); + data.Releases.Add(r); } } + else + if (code == FreedbHelper.ResponseCodes.CODE_210 || + code == FreedbHelper.ResponseCodes.CODE_211) + { + foreach (QueryResult qr in coll) + { + CDEntry cdEntry; + MusicBrainz_LookupProgress(this, null); + code = m_freedb.Read(qr, out cdEntry); + if (code == FreedbHelper.ResponseCodes.CODE_210) + { + CUEMetadataEntry r = CreateCUESheet(audioSource, cdEntry); + data.Releases.Add(r); + } + } + } + } + catch (Exception ex) + { + System.Diagnostics.Trace.WriteLine(ex.Message); } } - catch (Exception ex) - { - System.Diagnostics.Trace.WriteLine(ex.Message); - } - if (releases.Count == 0) + if (data.Releases.Count == 0) { - releases.Add(CreateCUESheet(audioSource, null, null)); + data.Releases.Add(CreateCUESheet(audioSource)); } _workThread = null; if (musicbrainzError != "") @@ -619,8 +589,8 @@ namespace CUERipper this.BeginInvoke((MethodInvoker)delegate() { SetupControls(); - releases.RaiseListChangedEvents = true; - releases.ResetBindings(); + data.Releases.RaiseListChangedEvents = true; + data.Releases.ResetBindings(); //bnComboBoxRelease.SelectedIndex = 0; toolStripStatusAr.Enabled = cueSheet.ArVerify.ARStatus == null; toolStripStatusAr.Text = cueSheet.ArVerify.ARStatus == null ? cueSheet.ArVerify.WorstTotal().ToString() : ""; @@ -637,10 +607,12 @@ namespace CUERipper private void UpdateDrive() { - selectedDriveInfo = bnComboBoxDrives.SelectedItem as DriveInfo; - if (selectedDriveInfo == null) + if (bnComboBoxDrives.SelectedItem as DriveInfo == null) return; + selectedDriveInfo = bnComboBoxDrives.SelectedItem as DriveInfo; + defaultDrive = selectedDriveInfo.Path; + toolStripStatusAr.Enabled = false; toolStripStatusAr.Text = ""; toolStripStatusAr.ToolTipText = ""; @@ -652,7 +624,7 @@ namespace CUERipper toolStripStatusLabelMusicBrainz.ToolTipText = ""; buttonGo.Enabled = false; listTracks.Items.Clear(); - releases.Clear(); + data.Releases.Clear(); selectedRelease = null; bnComboBoxRelease.Enabled = false; bnComboBoxRelease.Text = ""; @@ -677,6 +649,7 @@ namespace CUERipper numericWriteOffset.Value = selectedDriveInfo.drive.DriveOffset; //selectedDriveInfo.drive.Close(); bnComboBoxRelease.Text = ex.Message; + //bnComboBoxRelease.Enabled = false; return; } if (selectedDriveInfo.drive.TOC.AudioTracks == 0) @@ -732,22 +705,21 @@ namespace CUERipper { if (selectedRelease == null) return; bool isVarious = false; - for (int i = 0; i < selectedRelease.metadata.TOC.AudioTracks; i++) + for (int i = 0; i < selectedRelease.metadata.Tracks.Count; i++) if (selectedRelease.metadata.Tracks[i].Artist != selectedRelease.metadata.Artist) isVarious = true; variousToolStripMenuItem.Enabled = selectedRelease.ImageKey == "freedb" && !isVarious; - ReleaseInfo r = new ReleaseInfo(_config, selectedRelease.metadata.TOC); - r.metadata.CopyMetadata(selectedRelease.metadata); - fixEncodingToolStripMenuItem.Enabled = selectedRelease.ImageKey == "freedb" && r.metadata.FreedbToEncoding(); + CUEMetadata copy = new CUEMetadata(selectedRelease.metadata); + fixEncodingToolStripMenuItem.Enabled = selectedRelease.ImageKey == "freedb" && copy.FreedbToEncoding(); } private void editToolStripMenuItem_Click(object sender, EventArgs e) { if (selectedRelease == null) return; frmProperties frm = new frmProperties(); - frm.CUE = selectedRelease.metadata; + frm.Metadata = selectedRelease.metadata; frm.ShowDialog(); - releases.ResetItem(bnComboBoxRelease.SelectedIndex); + data.Releases.ResetItem(bnComboBoxRelease.SelectedIndex); comboBoxOutputFormat_TextUpdate(sender, e); } @@ -756,7 +728,7 @@ namespace CUERipper if (selectedRelease == null) return; selectedRelease.metadata.FreedbToVarious(); UpdateRelease(); - releases.ResetItem(bnComboBoxRelease.SelectedIndex); + data.Releases.ResetItem(bnComboBoxRelease.SelectedIndex); } private void fixEncodingToolStripMenuItem_Click(object sender, EventArgs e) @@ -764,10 +736,23 @@ namespace CUERipper if (selectedRelease == null) return; selectedRelease.metadata.FreedbToEncoding(); UpdateRelease(); - releases.ResetItem(bnComboBoxRelease.SelectedIndex); + data.Releases.ResetItem(bnComboBoxRelease.SelectedIndex); comboBoxOutputFormat_TextUpdate(sender, e); } + private void reloadToolStripMenuItem_Click(object sender, EventArgs e) + { + loadAllMetadata = true; + data.Releases.Clear(); + selectedRelease = null; + UpdateRelease(); + _workThread = new Thread(Lookup); + _workThread.Priority = ThreadPriority.BelowNormal; + _workThread.IsBackground = true; + SetupControls(); + _workThread.Start(selectedDriveInfo.drive); + } + private void frmCUERipper_FormClosed(object sender, FormClosedEventArgs e) { SettingsWriter sw = new SettingsWriter("CUERipper", "settings.txt", Application.ExecutablePath); @@ -786,6 +771,8 @@ namespace CUERipper for (int iFormat = bnComboBoxOutputFormat.Items.Count - 1; iFormat >= OutputPathUseTemplates.Length; iFormat--) sw.Save(string.Format("OutputPathUseTemplate{0}", iFormat - OutputPathUseTemplates.Length), bnComboBoxOutputFormat.Items[iFormat].ToString()); + if (defaultDrive != null) + sw.Save("DefaultDrive", defaultDrive); sw.Close(); } @@ -803,7 +790,7 @@ namespace CUERipper } set { - foreach (FormatInfo fmt in formats) + foreach (FormatInfo fmt in data.Formats) if (fmt.ToString() == value) bnComboBoxFormat.SelectedItem = fmt; } @@ -823,11 +810,11 @@ namespace CUERipper { get { - return (bnComboBoxLosslessOrNot.SelectedItem as BNComboBoxItem).Value; + return (bnComboBoxLosslessOrNot.SelectedItem as ImgComboBoxItem).Value; } set { - foreach (BNComboBoxItem item in losslessOrNot) + foreach (ImgComboBoxItem item in data.LosslessOrNot) if (value == item.Value) { bnComboBoxLosslessOrNot.SelectedItem = item; @@ -842,7 +829,7 @@ namespace CUERipper _config.createEACLOG = checkBoxEACMode.Checked; } - private void comboBoxEncoder_SelectedIndexChanged(object sender, EventArgs e) + private void bnComboBoxEncoder_SelectedValueChanged(object sender, EventArgs e) { if (SelectedOutputAudioFormat == null) return; @@ -902,7 +889,10 @@ namespace CUERipper private void frmCUERipper_KeyDown(object sender, KeyEventArgs e) { if (_workThread == null && e.KeyCode == Keys.F5) + { + loadAllMetadata = true; UpdateDrives(); + } } private void comboBoxOutputFormat_SelectedIndexChanged(object sender, EventArgs e) @@ -913,17 +903,25 @@ namespace CUERipper private void comboBoxOutputFormat_TextUpdate(object sender, EventArgs e) { if (selectedFormat == null) return; + if (selectedRelease == null) + { + txtOutputPath.Text = ""; + return; + } CUEStyle style = bnComboBoxImage.SelectedIndex == 0 ? CUEStyle.SingleFileWithCUE : CUEStyle.GapsAppended; - txtOutputPath.Text = selectedRelease == null ? "" : selectedRelease.metadata.GenerateUniqueOutputPath(bnComboBoxOutputFormat.Text, + CUESheet sheet = new CUESheet(_config); + sheet.TOC = selectedDriveInfo.drive.TOC; + sheet.CopyMetadata(selectedRelease.metadata); + txtOutputPath.Text = sheet.GenerateUniqueOutputPath(bnComboBoxOutputFormat.Text, style == CUEStyle.SingleFileWithCUE ? "." + selectedFormat.ToString() : ".cue", CUEAction.Encode, null); } - private void bnComboBoxRelease_SelectedIndexChanged(object sender, EventArgs e) + private void bnComboBoxRelease_SelectedValueChanged(object sender, EventArgs e) { UpdateRelease(); } - private void bnComboBoxDrives_SelectedIndexChanged(object sender, EventArgs e) + private void bnComboBoxDrives_SelectedValueChanged(object sender, EventArgs e) { if (_workThread == null) UpdateDrive(); @@ -931,11 +929,11 @@ namespace CUERipper private FormatInfo selectedFormat; - private void bnComboBoxFormat_SelectedIndexChanged(object sender, EventArgs e) + private void bnComboBoxFormat_SelectedValueChanged(object sender, EventArgs e) { selectedFormat = bnComboBoxFormat.SelectedItem as FormatInfo; - encoders.Clear(); + data.Encoders.Clear(); if (SelectedOutputAudioFmt == null) return; @@ -952,7 +950,7 @@ namespace CUERipper break; } - encoders.RaiseListChangedEvents = false; + data.Encoders.RaiseListChangedEvents = false; foreach (CUEToolsUDC encoder in _config.encoders) if (encoder.extension == SelectedOutputAudioFmt.extension) @@ -961,24 +959,24 @@ namespace CUERipper continue; if (SelectedOutputAudioType == AudioEncoderType.Lossy && (encoder.lossless && !selectedFormat.lossyWAV)) continue; - encoders.Add(encoder); + data.Encoders.Add(encoder); } CUEToolsUDC select = SelectedOutputAudioFormat.StartsWith("lossy.") ? SelectedOutputAudioFmt.encoderLossless : SelectedOutputAudioType == AudioEncoderType.Lossless ? SelectedOutputAudioFmt.encoderLossless : SelectedOutputAudioFmt.encoderLossy; - encoders.RaiseListChangedEvents = true; - encoders.ResetBindings(); + data.Encoders.RaiseListChangedEvents = true; + data.Encoders.ResetBindings(); bnComboBoxEncoder.SelectedItem = select; comboBoxOutputFormat_TextUpdate(sender, e); } - private void bnComboBoxLosslessOrNot_SelectedIndexChanged(object sender, EventArgs e) + private void bnComboBoxLosslessOrNot_SelectedValueChanged(object sender, EventArgs e) { if (bnComboBoxLosslessOrNot.SelectedItem == null) return; - formats.Clear(); - formats.RaiseListChangedEvents = false; + data.Formats.Clear(); + data.Formats.RaiseListChangedEvents = false; foreach (KeyValuePair format in _config.formats) { if (SelectedOutputAudioType == AudioEncoderType.Lossless && !format.Value.allowLossless) @@ -987,7 +985,7 @@ namespace CUERipper continue; if (SelectedOutputAudioType == AudioEncoderType.Lossy && !format.Value.allowLossy) continue; - formats.Add(new FormatInfo(format.Value, false)); + data.Formats.Add(new FormatInfo(format.Value, false)); } foreach (KeyValuePair format in _config.formats) { @@ -997,7 +995,7 @@ namespace CUERipper continue; if (SelectedOutputAudioType == AudioEncoderType.NoAudio) continue; - formats.Add(new FormatInfo(format.Value, true)); + data.Formats.Add(new FormatInfo(format.Value, true)); } string select = null; switch (SelectedOutputAudioType) @@ -1012,8 +1010,8 @@ namespace CUERipper select = _defaultHybridFormat; break; } - formats.RaiseListChangedEvents = true; - formats.ResetBindings(); + data.Formats.RaiseListChangedEvents = true; + data.Formats.ResetBindings(); SelectedOutputAudioFormat = select; } @@ -1045,7 +1043,7 @@ namespace CUERipper private void bnComboBoxOutputFormat_DroppedDown(object sender, EventArgs e) { - if (!outputFormatVisible || bnComboBoxOutputFormat.IsDroppedDown || bnComboBoxOutputFormat.Focused) + if (!outputFormatVisible || bnComboBoxOutputFormat.DroppedDown || bnComboBoxOutputFormat.Focused) return; outputFormatVisible = false; bnComboBoxOutputFormat.Visible = false; @@ -1123,34 +1121,6 @@ namespace CUERipper } } - public class ReleaseInfo - { - public CUESheet metadata; - private string imageKey; - public string ImageKey - { - get - { - return imageKey; - } - set - { - imageKey = value; - } - } - - public ReleaseInfo(CUEConfig config, CDImageLayout TOC) - { - metadata = new CUESheet(config); - metadata.TOC = TOC; - } - - public override string ToString() - { - return string.Format("{0}{1} - {2}", metadata.Year != "" ? metadata.Year + ": " : "", metadata.Artist, metadata.Title); - } - } - public class DriveInfo { public ICDRipper drive; @@ -1158,6 +1128,14 @@ namespace CUERipper DirectoryInfo di; CUEControls.IIconManager iconMgr; + public string Path + { + get + { + return di.FullName; + } + } + public int ImageKey { get @@ -1185,4 +1163,66 @@ namespace CUERipper return drive != null ? drive.Path : this.di.FullName + ": " + error; } } + + internal class CUERipperData + { + private BindingList cueStyles = new BindingList { "image", "tracks" }; + //private BindingList losslessOrNot = new BindingList { "lossless", "lossy" }; + private BindingList> losslessOrNot = new BindingList> { + new ImgComboBoxItem("lossless", "checked", AudioEncoderType.Lossless), + new ImgComboBoxItem("lossy", "unchecked", AudioEncoderType.Lossy) + }; + private BindingList releases = new BindingList(); + private BindingList drives = new BindingList(); + private BindingList formats = new BindingList(); + private BindingList encoders = new BindingList(); + + public BindingList CUEStyles + { + get + { + return cueStyles; + } + } + + public BindingList> LosslessOrNot + { + get + { + return losslessOrNot; + } + } + + public BindingList Releases + { + get + { + return releases; + } + } + + public BindingList Drives + { + get + { + return drives; + } + } + + public BindingList Formats + { + get + { + return formats; + } + } + + public BindingList Encoders + { + get + { + return encoders; + } + } + } } diff --git a/CUERipper/frmCUERipper.resx b/CUERipper/frmCUERipper.resx index 1d578e6..48727c6 100644 --- a/CUERipper/frmCUERipper.resx +++ b/CUERipper/frmCUERipper.resx @@ -360,25 +360,31 @@ 17, 17 - 152, 22 + 149, 22 Edit - 152, 22 + 149, 22 Various Artists - 152, 22 + 149, 22 Fix Encoding + + 149, 22 + + + Reload + - 153, 92 + 150, 92 contextMenuStripRelease @@ -479,25 +485,20 @@ 6, 19 - - - AAEAAAD/////AQAAAAAAAAAMAgAAAEJDVUVDb250cm9scywgVmVyc2lvbj0yLjAuOC4wLCBDdWx0dXJl - PW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwFAQAAABRDVUVDb250cm9scy5CTlJhZGl1cwQAAAAI - X3RvcExlZnQJX3RvcFJpZ2h0C19ib3R0b21MZWZ0DF9ib3R0b21SaWdodAAAAAAICAgIAgAAAAIAAAAG - AAAAAgAAAAIAAAAL - - 80, 21 39 + + lossless + bnComboBoxLosslessOrNot - CUEControls.BNComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null groupBoxSettings @@ -511,25 +512,20 @@ 92, 46 - - - AAEAAAD/////AQAAAAAAAAAMAgAAAEJDVUVDb250cm9scywgVmVyc2lvbj0yLjAuOC4wLCBDdWx0dXJl - PW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwFAQAAABRDVUVDb250cm9scy5CTlJhZGl1cwQAAAAI - X3RvcExlZnQJX3RvcFJpZ2h0C19ib3R0b21MZWZ0DF9ib3R0b21SaWdodAAAAAAICAgIAgAAAAIAAAAG - AAAAAgAAAAIAAAAL - - 80, 21 38 + + libFlac + bnComboBoxEncoder - CUEControls.BNComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null groupBoxSettings @@ -570,25 +566,20 @@ 92, 19 - - - AAEAAAD/////AQAAAAAAAAAMAgAAAEJDVUVDb250cm9scywgVmVyc2lvbj0yLjAuOC4wLCBDdWx0dXJl - PW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwFAQAAABRDVUVDb250cm9scy5CTlJhZGl1cwQAAAAI - X3RvcExlZnQJX3RvcFJpZ2h0C19ib3R0b21MZWZ0DF9ib3R0b21SaWdodAAAAAAICAgIAgAAAAIAAAAG - AAAAAgAAAAIAAAAL - - 80, 21 37 + + flac + bnComboBoxFormat - CUEControls.BNComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null groupBoxSettings @@ -641,25 +632,20 @@ 6, 46 - - - AAEAAAD/////AQAAAAAAAAAMAgAAAEJDVUVDb250cm9scywgVmVyc2lvbj0yLjAuOC4wLCBDdWx0dXJl - PW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwFAQAAABRDVUVDb250cm9scy5CTlJhZGl1cwQAAAAI - X3RvcExlZnQJX3RvcFJpZ2h0C19ib3R0b21MZWZ0DF9ib3R0b21SaWdodAAAAAAICAgIAgAAAAIAAAAG - AAAAAgAAAAIAAAAL - - 80, 21 34 + + image + bnComboBoxImage - CUEControls.BNComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null groupBoxSettings @@ -814,6 +800,9 @@ 7 + + 998, 56 + 207, 17 @@ -965,8 +954,8 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAa - CQAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAS + CgAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -996,34 +985,34 @@ AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wIAAXoCUQt6AQAB7Q8K IAABUQEAAREBEwEAAQ8KegG1BAQD8wEEA/MCBAFfAQohAAG8A/8BEwEPCXoBtQMEAfQCBAH0AQQB9AIE - AfQCBAEKIQABvAT/AQAJegG1AaICBAH/AgQB/wEEAf8CBAH/AgQBCiAAAVEBDwHrAgcBvAEAAREEAAER - A3oBtQGiAwQD/wEEA/8DBAEKIAABegFRAQ8CAAH/AQABDwH3Av8BkgIRAnoBtQGiBQQB/wEEAf8FBAEK - IAAEegEAAf8BAAERBP8BvAEAAnoBtQGiBQQB/wEEAf8FBAEKIAAErgEAAf8CAAETAbwD/wEAAq4BtQGi - DQQBCiAABK4BAAH/AQABEgEPAwAB/wEAAq4N/wH0AfMB7CAABK4BAAH/AQ8BAAERAhIBAAH/AQACrgH/ - AaIC/wEEA/8CBAP/AgQB7CAABK4BAAL/AZIBEQEAAQ8BAAH/AQACrgH/AaIC/wEEAv8BBAT/AQQB9AHz - AewgAASuAQABBwP/AbwB6gEAAf8BAAKuAf8BogL/AQQC/wQEAf8DBAEKIAAErgERARMBBwb/AQACrgH/ - AaIBBAH/AQQC/wEEAv8BBAH/AQQB9AHzAQogAAWuAREBAAERAZIE/wEAAq4B/wGGAv8CBAL/AgQD/wIE - AewgAAeuAREBAAEPAesBvAH/AQACrgH/AYYL/wH0AfMB7CEACa4BDwEAARMBEQGuAQAC/wG1C/8B9AEH - IAABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD/wEAAYABAXYAAYABAQYACw== + AfQCBAEKAfEC7gHyAQAB8gTuAfIBAAHyAu4B8REAAbwE/wEACXoBtQGiAgQB/wIEAf8BBAH/AgQB/wIE + AQoBvAH1AfQDBwT0AwcB9AH1AbwQAAFRAQ8B6wIHAbwBAAERBAABEQN6AbUBogMEA/8BBAP/AwQBCgHw + AfQC8wH0BvMB9ALzAfQB8BAAAXoBUQEPAgAB/wEAAQ8B9wL/AZICEQJ6AbUBogUEAf8BBAH/BQQBCgHw + AfQM8wH0AfAQAAR6AQAB/wEAAREE/wG8AQACegG1AaIFBAH/AQQB/wUEAQoB8AH0DPMB9AHwEAAErgEA + Af8CAAETAbwD/wEAAq4BtQGiDQQBCgHxAfUF9AEAAXMB7gT0AfUB8RAABK4BAAH/AQABEgEPAwAB/wEA + Aq4N/wH0AfMB7AHyAfUF9AEcAcMBUQEIA/QB9QHyEAAErgEAAf8BDwEAARECEgEAAf8BAAKuAf8BogL/ + AQQD/wIEA/8CBAHsAfIG9QEbAVgBegFRAQgD9QHyEAAErgEAAv8BkgERAQABDwEAAf8BAAKuAf8BogL/ + AQQC/wEEBP8BBAH0AfMB7AHyAf8G9QEaAVgBegFRARoB9QH/AfIQAASuAQABBwP/AbwB6gEAAf8BAAKu + Af8BogL/AQQC/wQEAf8DBAEKAfII/wEaAVgBegFRARoB/wHyEAAErgERARMBBwb/AQACrgH/AaIBBAH/ + AQQC/wEEAv8BBAH/AQQB9AHzAQoB8gn/ARsBWAF6Ae0B8AHyEAAFrgERAQABEQGSBP8BAAKuAf8BhgL/ + AgQC/wIEA/8CBAHsAfMK8gHwAe8B9AHtAbwQAAeuAREBAAEPAesBvAH/AQACrgH/AYYL/wH0AfMB7AwA + AfQB7gEWAW8RAAmuAQ8BAAETAREBrgEAAv8BtQv/AfQBBw0AAfQBFgHzEAABQgFNAT4HAAE+AwABKAMA + AUADAAEQAwABAQEAAQEFAAGAFwAD/wEAAYABAQIAAv8GAAL/BgABCAEQXgAB/wHwAgABgAEBAgAB/wH4 + AgAL 6, 33 - - - AAEAAAD/////AQAAAAAAAAAMAgAAAEJDVUVDb250cm9scywgVmVyc2lvbj0yLjAuOC4wLCBDdWx0dXJl - PW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwFAQAAABRDVUVDb250cm9scy5CTlJhZGl1cwQAAAAI - X3RvcExlZnQJX3RvcFJpZ2h0C19ib3R0b21MZWZ0DF9ib3R0b21SaWdodAAAAAAICAgIAgAAAAIAAAAG - AAAAAgAAAAIAAAAL - - 552, 21 35 + + Releases + Right-lick to edit release info @@ -1031,7 +1020,7 @@ bnComboBoxRelease - CUEControls.BNComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null $this @@ -1039,31 +1028,23 @@ 2 - - 998, 56 - 6, 6 - - - AAEAAAD/////AQAAAAAAAAAMAgAAAEJDVUVDb250cm9scywgVmVyc2lvbj0yLjAuOC4wLCBDdWx0dXJl - PW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwFAQAAABRDVUVDb250cm9scy5CTlJhZGl1cwQAAAAI - X3RvcExlZnQJX3RvcFJpZ2h0C19ib3R0b21MZWZ0DF9ib3R0b21SaWdodAAAAAAICAgIAgAAAAIAAAAG - AAAAAgAAAAIAAAAL - - 552, 21 36 + + Drives + bnComboBoxDrives - CUEControls.BNComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null $this @@ -1074,14 +1055,6 @@ 6, 60 - - - AAEAAAD/////AQAAAAAAAAAMAgAAAEJDVUVDb250cm9scywgVmVyc2lvbj0yLjAuOC4wLCBDdWx0dXJl - PW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwFAQAAABRDVUVDb250cm9scy5CTlJhZGl1cwQAAAAI - X3RvcExlZnQJX3RvcFJpZ2h0C19ib3R0b21MZWZ0DF9ib3R0b21SaWdodAAAAAAICAgIAgAAAAIAAAAG - AAAAAgAAAAIAAAAL - - 552, 21 @@ -1092,7 +1065,7 @@ bnComboBoxOutputFormat - CUEControls.BNComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.0.8.0, Culture=neutral, PublicKeyToken=null $this @@ -1593,6 +1566,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + reloadToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + losslessOrNotBindingSource @@ -1623,6 +1602,12 @@ System.Windows.Forms.BindingSource, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + drivesBindingSource + + + System.Windows.Forms.BindingSource, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + imageListChecked @@ -1683,12 +1668,6 @@ System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - drivesBindingSource - - - System.Windows.Forms.BindingSource, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - frmCUERipper diff --git a/CUERipper/frmProperties.cs b/CUERipper/frmProperties.cs index 4ef5916..46c9bbb 100644 --- a/CUERipper/frmProperties.cs +++ b/CUERipper/frmProperties.cs @@ -18,41 +18,27 @@ namespace CUETools.Processor private void frmProperties_Load(object sender, EventArgs e) { - textArtist.Text = _cueSheet.Artist; - textTitle.Text = _cueSheet.Title; - textYear.Text = _cueSheet.Year; - textGenre.Text = _cueSheet.Genre; - textCatalog.Text = _cueSheet.Catalog; - textBoxDiscNumber.Text = _cueSheet.DiscNumber; - textBoxTotalDiscs.Text = _cueSheet.TotalDiscs; + textArtist.Text = Metadata.Artist; + textTitle.Text = Metadata.Title; + textYear.Text = Metadata.Year; + textGenre.Text = Metadata.Genre; + textCatalog.Text = Metadata.Catalog; + textBoxDiscNumber.Text = Metadata.DiscNumber; + textBoxTotalDiscs.Text = Metadata.TotalDiscs; } - public CUESheet CUE - { - get - { - return _cueSheet; - } - set - { - _cueSheet = value; - } - } - - CUESheet _cueSheet; + public CUEMetadata Metadata { get; set; } private void button1_Click(object sender, EventArgs e) { - foreach (TrackInfo track in _cueSheet.Tracks) - if (track.Artist == _cueSheet.Artist) - track.Artist = textArtist.Text; - _cueSheet.Artist = textArtist.Text; - _cueSheet.Title = textTitle.Text; - _cueSheet.Year = textYear.Text; - _cueSheet.Genre = textGenre.Text; - _cueSheet.Catalog = textCatalog.Text; - _cueSheet.DiscNumber = textBoxDiscNumber.Text; - _cueSheet.TotalDiscs = textBoxTotalDiscs.Text; + Metadata.Tracks.ForEach(track => track.Artist = track.Artist == Metadata.Artist ? textArtist.Text : track.Artist); + Metadata.Artist = textArtist.Text; + Metadata.Title = textTitle.Text; + Metadata.Year = textYear.Text; + Metadata.Genre = textGenre.Text; + Metadata.Catalog = textCatalog.Text; + Metadata.DiscNumber = textBoxDiscNumber.Text; + Metadata.TotalDiscs = textBoxTotalDiscs.Text; } } } \ No newline at end of file diff --git a/CUETools.AccurateRip/AccurateRip.cs b/CUETools.AccurateRip/AccurateRip.cs index 25f294a..92ac657 100644 --- a/CUETools.AccurateRip/AccurateRip.cs +++ b/CUETools.AccurateRip/AccurateRip.cs @@ -1054,7 +1054,7 @@ namespace CUETools.AccurateRip public static bool FindDriveReadOffset(string driveName, out int driveReadOffset) { string fileName = System.IO.Path.Combine(CachePath, "DriveOffsets.bin"); - if (!File.Exists(fileName) || (DateTime.Now - File.GetLastWriteTime(fileName) > TimeSpan.FromDays(1)) ) + if (!File.Exists(fileName) || (DateTime.Now - File.GetLastWriteTime(fileName) > TimeSpan.FromDays(10)) ) { HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.accuraterip.com/accuraterip/DriveOffsets.bin"); req.Method = "GET"; diff --git a/CUETools.Processor/CUETools.Processor.csproj b/CUETools.Processor/CUETools.Processor.csproj index 18f3254..a709ae8 100644 --- a/CUETools.Processor/CUETools.Processor.csproj +++ b/CUETools.Processor/CUETools.Processor.csproj @@ -69,6 +69,7 @@ + diff --git a/CUETools.Processor/Processor.cs b/CUETools.Processor/Processor.cs index 2260fd2..c9977de 100644 --- a/CUETools.Processor/Processor.cs +++ b/CUETools.Processor/Processor.cs @@ -1045,6 +1045,7 @@ namespace CUETools.Processor encoders.Add(new CUEToolsUDC("lame cbr", "mp3", false, "96 128 192 256 320", "256", "lame.exe", "-m s -q 0 -b %M --noreplaygain - %O")); encoders.Add(new CUEToolsUDC("oggenc", "ogg", false, "-1 -0.5 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8", "3", "oggenc.exe", "-q %M - -o %O")); encoders.Add(new CUEToolsUDC("nero aac", "m4a", false, "0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9", "0.4", "neroAacEnc.exe", "-q %M -if - -of %O")); + encoders.Add(new CUEToolsUDC("qaac tvbr", "m4a", false, "10 20 30 40 50 60 70 80 90 100 110 127", "80", "qaac.exe", "-s -V %M -q 2 - -o %O")); decoders.Add("takc", new CUEToolsUDC("takc", "tak", true, "", "", "takc.exe", "-d %I -")); decoders.Add("ffmpeg alac", new CUEToolsUDC("ffmpeg alac", "m4a", true, "", "", "ffmpeg.exe", "%I -f wav -")); @@ -1638,6 +1639,7 @@ string status = processor.Go(); private List _albumArt = new List(); private int _padding = 8192; private IWebProxy proxy; + private CUEMetadata taglibMetadata; public event EventHandler PasswordRequired; public event EventHandler CUEToolsProgress; @@ -1748,6 +1750,7 @@ string status = processor.Go(); Genre = metadata.Genre; Artist = metadata.Artist; Title = metadata.Title; + Catalog = metadata.Catalog; for (int i = 0; i < Tracks.Count; i++) { Tracks[i].Title = metadata.Tracks[i].Title; @@ -1755,6 +1758,45 @@ string status = processor.Go(); } } + public void CopyMetadata(CUEMetadata metadata) + { + TotalDiscs = metadata.TotalDiscs; + DiscNumber = metadata.DiscNumber; + Year = metadata.Year; + Genre = metadata.Genre; + Artist = metadata.Artist; + Title = metadata.Title; + Catalog = metadata.Catalog; + for (int i = 0; i < Tracks.Count; i++) + { + Tracks[i].Title = metadata.Tracks[i].Title; + Tracks[i].Artist = metadata.Tracks[i].Artist; + // ISRC? + } + } + + public CUEMetadata Metadata + { + get + { + CUEMetadata metadata = new CUEMetadata(TOC.TOCID, (int)TOC.AudioTracks); + metadata.TotalDiscs = TotalDiscs; + metadata.DiscNumber = DiscNumber; + metadata.Year = Year; + metadata.Genre = Genre; + metadata.Artist = Artist; + metadata.Title = Title; + metadata.Catalog = Catalog; + for (int i = 0; i < Tracks.Count; i++) + { + metadata.Tracks[i].Title = Tracks[i].Title; + metadata.Tracks[i].Artist = Tracks[i].Artist; + // ISRC? + } + return metadata; + } + } + public void FillFromMusicBrainz(MusicBrainz.Release release) { string date = release.GetEvents().Count > 0 ? release.GetEvents()[0].Date : null; @@ -1818,9 +1860,28 @@ string status = processor.Go(); } } - public List LookupAlbumInfo(bool useFreedb, bool useMusicBrainz) + public List LookupAlbumInfo(bool useFreedb, bool useMusicBrainz, bool useCache) { List Releases = new List(); + StringCollection DiscIds = new StringCollection(); + DiscIds.Add(_toc.MusicBrainzId); + + if (useCache) + { + try + { + CUEMetadata cache = CUEMetadata.Load(TOC.TOCID); + if (cache != null) + Releases.Add(new CUEMetadataEntry(cache, TOC, "local")); + } + catch (Exception ex) + { + System.Diagnostics.Trace.WriteLine(ex.Message); + } + } + + Releases.Add(new CUEMetadataEntry(Metadata, TOC, "cue")); + Releases.Add(new CUEMetadataEntry(new CUEMetadata(taglibMetadata), TOC, "tags")); if (useFreedb) { @@ -1846,7 +1907,14 @@ string status = processor.Go(); ShowProgress("Looking up album via Freedb... " + queryResult.Discid, 0.5, null, null); code = m_freedb.Read(queryResult, out cdEntry); if (code == FreedbHelper.ResponseCodes.CODE_210) - Releases.Add(cdEntry); + { + CUEMetadata metadata = new CUEMetadata(TOC.TOCID, (int)TOC.AudioTracks); + metadata.FillFromFreedb(cdEntry, TOC.FirstAudio - 1); + CDImageLayout toc = TocFromCDEntry(cdEntry); + if (!DiscIds.Contains(toc.MusicBrainzId)) + DiscIds.Add(toc.MusicBrainzId); + Releases.Add(new CUEMetadataEntry(metadata, toc, "freedb")); + } } else if (code == FreedbHelper.ResponseCodes.CODE_210 || @@ -1859,7 +1927,14 @@ string status = processor.Go(); CheckStop(); code = m_freedb.Read(qr, out cdEntry); if (code == FreedbHelper.ResponseCodes.CODE_210) - Releases.Add(cdEntry); + { + CUEMetadata metadata = new CUEMetadata(TOC.TOCID, (int)TOC.AudioTracks); + metadata.FillFromFreedb(cdEntry, TOC.FirstAudio - 1); + CDImageLayout toc = TocFromCDEntry(cdEntry); + if (!DiscIds.Contains(toc.MusicBrainzId)) + DiscIds.Add(toc.MusicBrainzId); + Releases.Add(new CUEMetadataEntry(metadata, toc,"freedb")); + } } } } @@ -1874,16 +1949,8 @@ string status = processor.Go(); { ShowProgress("Looking up album via MusicBrainz...", 0.0, null, null); - StringCollection DiscIds = new StringCollection(); - DiscIds.Add(_toc.MusicBrainzId); //if (_tocFromLog != null && !DiscIds.Contains(_tocFromLog.MusicBrainzId)) // DiscIds.Add(_tocFromLog.MusicBrainzId); - foreach (CDEntry cdEntry in Releases) - { - CDImageLayout toc = TocFromCDEntry(cdEntry); - if (!DiscIds.Contains(toc.MusicBrainzId)) - DiscIds.Add(toc.MusicBrainzId); - } MusicBrainzService.XmlRequest += new EventHandler(MusicBrainz_LookupProgress); foreach (string DiscId in DiscIds) @@ -1909,7 +1976,9 @@ string status = processor.Go(); ; } catch { } - Releases.Add(release); + CUEMetadata metadata = new CUEMetadata(TOC.TOCID, (int)TOC.AudioTracks); + metadata.FillFromMusicBrainz(release, TOC.FirstAudio - 1); + Releases.Add(new CUEMetadataEntry(metadata, TOC, "musicbrainz")); } } catch (Exception ex) @@ -2499,59 +2568,44 @@ string status = processor.Go(); _fileInfo = _tracks[0]._fileInfo; _tracks[0]._fileInfo = null; } + taglibMetadata = new CUEMetadata(TOC.TOCID, (int)TOC.AudioTracks); + taglibMetadata.Artist = GetCommonTag(file => file.Tag.JoinedAlbumArtists) ?? GetCommonTag(file => file.Tag.JoinedPerformers) ?? ""; + taglibMetadata.Title = GetCommonTag(file => file.Tag.Album) ?? ""; + taglibMetadata.Year = GetCommonTag(file => file.Tag.Year != 0 ? file.Tag.Year.ToString() : null) ?? ""; + taglibMetadata.Genre = GetCommonTag(file => file.Tag.JoinedGenres) ?? ""; + taglibMetadata.TotalDiscs = GetCommonTag(file => file.Tag.DiscCount != 0 ? file.Tag.DiscCount.ToString() : null) ?? ""; + taglibMetadata.DiscNumber = GetCommonTag(file => file.Tag.Disc != 0 ? file.Tag.Disc.ToString() : null) ?? ""; + for (i = 0; i < TrackCount; i++) + { + TrackInfo track = _tracks[i]; + taglibMetadata.Tracks[i].Artist = (_hasTrackFilenames && track._fileInfo != null ? track._fileInfo.Tag.JoinedPerformers : + _hasEmbeddedCUESheet && _fileInfo != null ? Tagging.TagListToSingleValue(Tagging.GetMiscTag(_fileInfo, String.Format("cue_track{0:00}_ARTIST", i + 1))) : + null) ?? ""; + taglibMetadata.Tracks[i].Title = (_hasTrackFilenames && track._fileInfo != null ? track._fileInfo.Tag.Title : + _hasEmbeddedCUESheet && _fileInfo != null ? Tagging.TagListToSingleValue(Tagging.GetMiscTag(_fileInfo, String.Format("cue_track{0:00}_TITLE", i + 1))) : + null) ?? ""; + } + if (_config.fillUpCUE) { - if (_config.overwriteCUEData || General.FindCUELine(_attributes, "PERFORMER") == null) - { - string value = GetCommonTag(delegate(TagLib.File file) { return file.Tag.JoinedAlbumArtists; }); - if (value == null) - value = GetCommonTag(delegate(TagLib.File file) { return file.Tag.JoinedPerformers; }); - if (value != null && value != "") - General.SetCUELine(_attributes, "PERFORMER", value, true); - } - if (_config.overwriteCUEData || General.FindCUELine(_attributes, "TITLE") == null) - { - string value = GetCommonTag(delegate(TagLib.File file) { return file.Tag.Album; }); - if (value != null) - General.SetCUELine(_attributes, "TITLE", value, true); - } - if (_config.overwriteCUEData || General.FindCUELine(_attributes, "REM", "DATE") == null) - { - string value = GetCommonTag(delegate(TagLib.File file) { return file.Tag.Year != 0 ? file.Tag.Year.ToString() : null; }); - if (value != null) - General.SetCUELine(_attributes, "REM", "DATE", value, false); - } - if (_config.overwriteCUEData || General.FindCUELine(_attributes, "REM", "GENRE") == null) - { - string value = GetCommonTag(delegate(TagLib.File file) { return file.Tag.JoinedGenres; }); - if (value != null) - General.SetCUELine(_attributes, "REM", "GENRE", value, true); - } - if (_config.overwriteCUEData || TotalDiscs == "") - { - string value = GetCommonTag(delegate(TagLib.File file) { return file.Tag.DiscCount != 0 ? file.Tag.DiscCount.ToString() : null; }); - if (value != null) - TotalDiscs = value; - } - if (_config.overwriteCUEData || DiscNumber == "") - { - string value = GetCommonTag(delegate(TagLib.File file) { return file.Tag.Disc != 0 ? file.Tag.Disc.ToString() : null; }); - if (value != null) - DiscNumber = value; - } + if ((_config.overwriteCUEData || General.FindCUELine(_attributes, "PERFORMER") == null) && taglibMetadata.Artist != "") + General.SetCUELine(_attributes, "PERFORMER", taglibMetadata.Artist, true); + if ((_config.overwriteCUEData || General.FindCUELine(_attributes, "TITLE") == null) && taglibMetadata.Title != "") + General.SetCUELine(_attributes, "TITLE", taglibMetadata.Title, true); + if ((_config.overwriteCUEData || General.FindCUELine(_attributes, "REM", "DATE") == null) && taglibMetadata.Year != "") + General.SetCUELine(_attributes, "REM", "DATE", taglibMetadata.Year, false); + if ((_config.overwriteCUEData || General.FindCUELine(_attributes, "REM", "GENRE") == null) && taglibMetadata.Genre != "") + General.SetCUELine(_attributes, "REM", "GENRE", taglibMetadata.Genre, true); + if ((_config.overwriteCUEData || TotalDiscs == "") && taglibMetadata.TotalDiscs != "") + TotalDiscs = taglibMetadata.TotalDiscs; + if ((_config.overwriteCUEData || DiscNumber == "") && taglibMetadata.DiscNumber != "") + DiscNumber = taglibMetadata.DiscNumber; for (i = 0; i < TrackCount; i++) { - TrackInfo track = _tracks[i]; - string artist = _hasTrackFilenames && track._fileInfo != null ? track._fileInfo.Tag.JoinedPerformers : - _hasEmbeddedCUESheet && _fileInfo != null ? Tagging.TagListToSingleValue(Tagging.GetMiscTag(_fileInfo, String.Format("cue_track{0:00}_ARTIST", i + 1))) : - null; - string title = _hasTrackFilenames && track._fileInfo != null ? track._fileInfo.Tag.Title : - _hasEmbeddedCUESheet && _fileInfo != null ? Tagging.TagListToSingleValue(Tagging.GetMiscTag(_fileInfo, String.Format("cue_track{0:00}_TITLE", i + 1))) : - null; - if ((_config.overwriteCUEData || track.Artist == "") && artist != null && artist != "") - track.Artist = artist; - if ((_config.overwriteCUEData || track.Title == "") && title != null) - track.Title = title; + if ((_config.overwriteCUEData || _tracks[i].Artist == "") && taglibMetadata.Tracks[i].Artist != "") + _tracks[i].Artist = taglibMetadata.Tracks[i].Artist; + if ((_config.overwriteCUEData || _tracks[i].Title == "") && taglibMetadata.Tracks[i].Title != "") + _tracks[i].Title = taglibMetadata.Tracks[i].Title; } } @@ -4055,32 +4109,46 @@ string status = processor.Go(); _albumArt.Add(picture); return; } - if ((_config.extractAlbumArt || _config.embedAlbumArt) && _inputDir != null) + if ((_config.extractAlbumArt || _config.embedAlbumArt) && !_isCD) { List names = new List(); names.Add("folder.jpg"); names.Add("cover.jpg"); names.Add("albumart.jpg"); + names.Add("thumbnail.jpg"); names.Add("albumartlarge.jpg"); + names.Add("front.jpg"); + foreach (string name in names) { - string imgPath = Path.Combine(_inputDir, name); - if (File.Exists(imgPath)) + string imgPath = Path.Combine(_isArchive ? _archiveCUEpath : _inputDir, name); + bool exists = _isArchive ? _archiveContents.Contains(imgPath) : File.Exists(imgPath); + if (exists) { - TagLib.Picture pic = new TagLib.Picture(imgPath); + TagLib.File.IFileAbstraction file = _isArchive + ? (TagLib.File.IFileAbstraction)new ArchiveFileAbstraction(this, imgPath) + : (TagLib.File.IFileAbstraction)new TagLib.File.LocalFileAbstraction(imgPath); + TagLib.Picture pic = new TagLib.Picture(file); pic.Description = name; _albumArt.Add(pic); return; } } - foreach (string imgPath in Directory.GetFiles(_inputDir, "*.jpg")) + if (!_isArchive) { - TagLib.Picture pic = new TagLib.Picture(imgPath); - pic.Description = Path.GetFileName(imgPath); - _albumArt.Add(pic); - if (Action != CUEAction.Encode) - return; + // TODO: archive case + foreach (string imgPath in Directory.GetFiles(_inputDir, "*.jpg", SearchOption.AllDirectories)) + { + TagLib.Picture pic = new TagLib.Picture(imgPath); + if (imgPath.StartsWith(_inputDir)) + pic.Description = imgPath.Substring(_inputDir.Length).Trim(Path.DirectorySeparatorChar); + else + pic.Description = Path.GetFileName(imgPath); + _albumArt.Add(pic); + if (Action != CUEAction.Encode) + return; + } } if (_albumArt.Count != 0) @@ -4809,12 +4877,7 @@ string status = processor.Go(); if (files == null) audioFiles = Directory.GetFiles(dir == "" ? "." : dir, "*." + format.Key); else - { - audioFiles = files.FindAll(delegate(string s) - { - return Path.GetDirectoryName(s) == dir && Path.GetExtension(s).ToLower() == "." + format.Key; - }).ToArray(); - } + audioFiles = files.FindAll(s => Path.GetDirectoryName(s) == dir && Path.GetExtension(s).ToLower() == "." + format.Key).ToArray(); if (audioFiles.Length == filePos.Count) { Array.Sort(audioFiles); @@ -4836,12 +4899,13 @@ string status = processor.Go(); foundAll = false; break; } - audioFiles = fileGroup.files.ConvertAll(delegate(FileSystemInfo info) { return info.FullName; }).ToArray(); + audioFiles = fileGroup.files.ConvertAll(info => info.FullName).ToArray(); Array.Sort(audioFiles); extension = fileGroup.main.Extension.ToLower().TrimStart('.'); foundAll = true; } } + // Choose filegroup by DISCID? } if (!foundAll) diff --git a/CUETools.Processor/Tagging.cs b/CUETools.Processor/Tagging.cs index 4bb7e8b..27adc19 100644 --- a/CUETools.Processor/Tagging.cs +++ b/CUETools.Processor/Tagging.cs @@ -21,6 +21,7 @@ namespace CUETools.Processor if (fileInfo is TagLib.Mpeg4.File) { // remove fb2k/nero nasty tags mess + //if (((TagLib.Mpeg4.File)fileInfo).UserData. ((TagLib.Mpeg4.File)fileInfo).UserData.RemoveChild("tags"); TagLib.Mpeg4.AppleTag mpeg4 = (TagLib.Mpeg4.AppleTag)fileInfo.GetTag(TagLib.TagTypes.Apple, true); return true; diff --git a/CUETools/Resources/more/icons/card--pencil.png b/CUETools/Resources/more/icons/card--pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..d7fa8d790bb10734b8bc3e200e2259989d37255c GIT binary patch literal 559 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm z@{>{(JaZG%Q-e|yQz{EjrrIztFkbX@aSW-rm9!>)=cLAo6DKxG9QgU4_3%v7c1fFc zv71Zwl&yWk%6!;GjZNs_|Ns9(^*(;G(!O?`eNS3KMhausPbOB?&WmUMe(#f7-qKQX z{LxXtz;)}Yb@uH2ZXBW?JL}(kjt}pS9{hiNd*%QC|JHo^|K#N4|M7dPzS?`}U!H$| zzvTbF|IdGTe&2r1kF%efdCbq18A?dJFnn{Pu<79C(Akd8!IK%6On-WPeLPQnBikQV zts`u9`>f6se0Sn+p19ENaM^;i*wtKYnW@nm!#u*stS-@l_5{ye=a+h+ZI zx1>)GkHofI`*RCY1CJ>zOyCdX?y;N@w`{(Bok7!_pVAr~efjg^4kkP{XiPl4Et%(4 z+ESiJ4rdK4C&*2R6WhS3@chru=7&t||Hax)t__#exuYfN@|TK4!lh zzk>V1!N=wAALNu&iY<_v5I2D_K|H~jK|X=?730fPCc*y;E*@nm5o1?ZpW)W;RkE{Q zK-|D+Z^gekGiOen+BmtpJMq(>pSM$bdbPK|yIsz5#Qm6p;RG2E-VXjt%$H7UZa>8c2+CLSd9=WVZ`F3@6xhd+&latfZ>dtWZEajQPpvK0<=+MB(5Y6SSrSsxD RKLY~;gQu&X%Q~loCID{({g(g$ literal 0 HcmV?d00001 diff --git a/CUETools/Resources/more/icons/tag-label.png b/CUETools/Resources/more/icons/tag-label.png new file mode 100644 index 0000000000000000000000000000000000000000..354f9ee1079657f98e0e331ac35a1348dcd9c45b GIT binary patch literal 690 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm z@{>{(JaZG%Q-e|yQz{EjrrIztFok%!IEGZ*>X{s$aVb#b`2PL#?PXos&eb0=T4d6i zYg)8ndDoxomz(6cB$I7hruv4rIQ|d_OK=f;>c&?U>9}EfRrJ|S(-*ZTxHvwV_9en{ zu7&x*JN}!CWrf+_op1cS`_AXTwdZWV&#SgUMynWpqBB0>0 zRN#h(-b4=`hBXoS^(}LYEN_Ks%{Y_hk-BNub_3_FQCsg8?L2m!N#^I-lPA5IwwWa_ z4cd55QbuOJr^*D6r59374qdv*+0}fXEoZl{L1=^1N|vcnXE#oi%$&19Q>SZNbzb?F z7`@HL2N?It-8_19mfOMzUxhB|kbu>aN4<{LO@DCy=KdG|)s9|2WdCN_=2wOi8^V_# z_Asg18MJoa^XLQYoMm^uSIn#Vvz6!mbfZr{Q!CQE5^g_OIq9KC%8XO}*R!@x*)UHv zLPU0P-T#O`&zbaUw9K|VSHGp0oqhOd!Hv^}F>|8kBo!`{TxM&zsPVv!*(p-YmuIs5 z*|eY8{p;=mJCURh)=l+mGMz4;I=B4bgBKx>%wvLIvi*4#!v2O$^c-um9h>*;2USc> zzC80dT9r25G`S-`O=0@`72U#Ns&mw2*_aw9h85T{9#oHSIo$u;Sn|#fz6_Jqx>XmH z7fv;`c>O(I@rUlg;x8*ATgxIE{mdGl+|8|}ZWcTYI$Ctqf@ezOZ literal 0 HcmV?d00001 diff --git a/CUETools/frmCUETools.cs b/CUETools/frmCUETools.cs index 79136ae..414d7aa 100644 --- a/CUETools/frmCUETools.cs +++ b/CUETools/frmCUETools.cs @@ -745,7 +745,19 @@ namespace JDP { if (_batchPaths.Count == 0 && action == CUEAction.Encode) { if (checkBoxUseFreeDb.Checked || checkBoxUseMusicBrainz.Checked) - releases = cueSheet.LookupAlbumInfo(checkBoxUseFreeDb.Checked, checkBoxUseMusicBrainz.Checked); + releases = cueSheet.LookupAlbumInfo(checkBoxUseFreeDb.Checked, checkBoxUseMusicBrainz.Checked, true); + } + else // if checkBoxUseMetadataCache.Checked + { + try + { + CUEMetadata cache = CUEMetadata.Load(cueSheet.TOC.TOCID); + if (cache != null) + cueSheet.CopyMetadata(cache); + } + catch + { + } } this.Invoke((MethodInvoker)delegate() diff --git a/CUETools/frmChoice.Designer.cs b/CUETools/frmChoice.Designer.cs index b6fdcda..707685a 100644 --- a/CUETools/frmChoice.Designer.cs +++ b/CUETools/frmChoice.Designer.cs @@ -82,10 +82,12 @@ namespace JDP // this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); this.imageList1.TransparentColor = System.Drawing.Color.Transparent; - this.imageList1.Images.SetKeyName(0, "eac3.ico"); - this.imageList1.Images.SetKeyName(1, "freedb.ico"); - this.imageList1.Images.SetKeyName(2, "musicbrainz.ico"); - this.imageList1.Images.SetKeyName(3, "cue3.ico"); + this.imageList1.Images.SetKeyName(0, "eac"); + this.imageList1.Images.SetKeyName(1, "freedb"); + this.imageList1.Images.SetKeyName(2, "musicbrainz"); + this.imageList1.Images.SetKeyName(3, "cue"); + this.imageList1.Images.SetKeyName(4, "tags"); + this.imageList1.Images.SetKeyName(5, "local"); // // textBox1 // diff --git a/CUETools/frmChoice.cs b/CUETools/frmChoice.cs index 9e2c83f..e6d6f6c 100644 --- a/CUETools/frmChoice.cs +++ b/CUETools/frmChoice.cs @@ -8,8 +8,6 @@ using System.IO; using System.Windows.Forms; using CUETools.CDImage; using CUETools.Processor; -using MusicBrainz; -using Freedb; namespace JDP { @@ -43,38 +41,26 @@ namespace JDP item.Tag = pic; listChoices.Items.Add(item); } - else if (i is MusicBrainz.Release) + else if (i is CUEMetadataEntry) { - ReleaseInfo r = new ReleaseInfo(CUE, i as MusicBrainz.Release); - ListViewItem item = new ListViewItem(r.Text, 2); - item.Tag = r; - listChoices.Items.Add(item); - } - else if (i is Freedb.CDEntry) - { - ReleaseInfo r = new ReleaseInfo(CUE, i as Freedb.CDEntry); - ListViewItem item = new ListViewItem(r.Text, 1); - item.Tag = r; + CUEMetadataEntry entry = i as CUEMetadataEntry; + ListViewItem item = new ListViewItem(entry.ToString(), entry.ImageKey); + item.Tag = entry; listChoices.Items.Add(item); - // check if the entry contains non-iso characters, - // and add a second one if it does - ReleaseInfo r2 = new ReleaseInfo(CUE, i as Freedb.CDEntry); - r2.FixEncoding(); - if (!r.Equals(r2)) + if (entry.ImageKey == "freedb") { - item = new ListViewItem(r2.Text, 1); - item.Tag = r2; - listChoices.Items.Add(item); + // check if the entry contains non-iso characters, + // and add a second one if it does + CUEMetadata copy = new CUEMetadata(entry.metadata); + if (copy.FreedbToEncoding()) + { + entry = new CUEMetadataEntry(copy, entry.TOC, entry.ImageKey); + item = new ListViewItem(entry.ToString(), entry.ImageKey); + item.Tag = entry; + listChoices.Items.Add(item); + } } - return; - } - else if (i is CUESheet) - { - ReleaseInfo r = new ReleaseInfo(CUE); - ListViewItem item = new ListViewItem(r.Text, 3); - item.Tag = r; - listChoices.Items.Add(item); } else { @@ -88,8 +74,6 @@ namespace JDP { set { - if (CUE != null) - AddItem(CUE); foreach (object i in value) AddItem(i); if (CUE != null) @@ -133,12 +117,12 @@ namespace JDP } } - private ReleaseInfo ChosenRelease + private CUEMetadataEntry ChosenRelease { get { object o = ChosenObject; - return o != null && o is ReleaseInfo ? o as ReleaseInfo : null; + return o != null && o is CUEMetadataEntry ? o as CUEMetadataEntry : null; } } @@ -152,10 +136,11 @@ namespace JDP private void frmChoice_FormClosing(object sender, FormClosingEventArgs e) { - ReleaseInfo ri = ChosenRelease; + CUEMetadataEntry ri = ChosenRelease; if (e.CloseReason != CloseReason.None || DialogResult != DialogResult.OK || ri == null || CUE == null) return; CUE.CopyMetadata(ri.metadata); + ri.metadata.Save(); } private void AutoResizeTracks() @@ -176,7 +161,7 @@ namespace JDP TagLib.IPicture picture = item as TagLib.IPicture; using (MemoryStream imageStream = new MemoryStream(picture.Data.Data, 0, picture.Data.Count)) try { pictureBox1.Image = Image.FromStream(imageStream); } - catch { } + catch { } textBox1.Hide(); pictureBox1.Show(); tableLayoutPanel1.SetRowSpan(pictureBox1, 4); @@ -185,17 +170,17 @@ namespace JDP { textBox1.Text = (item as CUEToolsSourceFile).contents.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n"); } - else if (item != null && item is ReleaseInfo) + else if (item != null && item is CUEMetadataEntry) { - ReleaseInfo r = (item as ReleaseInfo); + CUEMetadataEntry r = (item as CUEMetadataEntry); listTracks.Items.Clear(); - foreach (TrackInfo track in r.metadata.Tracks) + foreach (CUETrackMetadata track in r.metadata.Tracks) { listTracks.Items.Add(new ListViewItem(new string[] { track.Title, (listTracks.Items.Count + 1).ToString(), - r.metadata.TOC[listTracks.Items.Count + r.metadata.TOC.FirstAudio].StartMSF, - r.metadata.TOC[listTracks.Items.Count + r.metadata.TOC.FirstAudio].LengthMSF + r.TOC[listTracks.Items.Count + r.TOC.FirstAudio].StartMSF, + r.TOC[listTracks.Items.Count + r.TOC.FirstAudio].LengthMSF })); } AutoResizeTracks(); @@ -237,7 +222,7 @@ namespace JDP private void listTracks_AfterLabelEdit(object sender, LabelEditEventArgs e) { - ReleaseInfo ri = ChosenRelease; + CUEMetadataEntry ri = ChosenRelease; if (ri != null && e.Label != null) ri.metadata.Tracks[e.Item].Title = e.Label; } @@ -246,13 +231,13 @@ namespace JDP { if (e.KeyCode == Keys.Enter) { - if (listTracks.FocusedItem.Index + 1 < listTracks.Items.Count) // && e.editing - { - listTracks.FocusedItem.Selected = false; - listTracks.FocusedItem = listTracks.Items[listTracks.FocusedItem.Index + 1]; - listTracks.FocusedItem.Selected = true; - listTracks.FocusedItem.BeginEdit(); - } + if (listTracks.FocusedItem.Index + 1 < listTracks.Items.Count) // && e.editing + { + listTracks.FocusedItem.Selected = false; + listTracks.FocusedItem = listTracks.Items[listTracks.FocusedItem.Index + 1]; + listTracks.FocusedItem.Selected = true; + listTracks.FocusedItem.BeginEdit(); + } } } @@ -270,13 +255,13 @@ namespace JDP private void listMetadata_AfterLabelEdit(object sender, LabelEditEventArgs e) { ListViewItem item = ChosenItem; - ReleaseInfo r = ChosenRelease; + CUEMetadataEntry r = ChosenRelease; if (e.Label != null && item != null && r != null) { switch (e.Item) { case 0: - foreach (TrackInfo track in r.metadata.Tracks) + foreach (CUETrackMetadata track in r.metadata.Tracks) if (track.Artist == r.metadata.Artist) track.Artist = e.Label; r.metadata.Artist = e.Label; @@ -287,7 +272,7 @@ namespace JDP case 4: r.metadata.DiscNumber = e.Label; break; case 5: r.metadata.TotalDiscs = e.Label; break; } - item.Text = r.Text; + item.Text = r.ToString(); } } @@ -297,67 +282,4 @@ namespace JDP PictureBoxSizeMode.CenterImage : PictureBoxSizeMode.Zoom; } } - - sealed class ReleaseInfo - { - public CUESheet metadata; - - public ReleaseInfo(CUESheet cue) - { - metadata = new CUESheet(cue.Config); - metadata.TOC = cue.TOC; - metadata.CopyMetadata(cue); - } - - public ReleaseInfo(CUESheet cue, Freedb.CDEntry release) - { - metadata = new CUESheet(cue.Config); - metadata.TOC = cue.TocFromCDEntry(release); - metadata.FillFromFreedb(release); - } - - public ReleaseInfo(CUESheet cue, MusicBrainz.Release release) - { - metadata = new CUESheet(cue.Config); - metadata.TOC = cue.TOC; - metadata.FillFromMusicBrainz(release); - } - - private string FixEncoding(string src) - { - Encoding iso = Encoding.GetEncoding("iso-8859-1"); - return Encoding.Default.GetString(iso.GetBytes(src)); - } - - public string Text - { - get - { - return string.Format("{0}: {1} - {2}", - metadata.Year == "" ? "YYYY" : metadata.Year, - metadata.Artist == "" ? "Unknown Artist" : metadata.Artist, - metadata.Title == "" ? "Unknown Title" : metadata.Title); - } - } - - public void FixEncoding() - { - metadata.Artist = FixEncoding(metadata.Artist); - metadata.Title = FixEncoding(metadata.Title); - foreach (TrackInfo track in metadata.Tracks) - { - track.Title = FixEncoding(track.Title); - track.Artist = FixEncoding(track.Artist); - } - } - - public bool Equals(ReleaseInfo r) - { - bool equal = metadata.Title == r.metadata.Title && metadata.Artist == r.metadata.Artist; - for (int t = 0; t < metadata.TrackCount; t++) - if (r.metadata.Tracks[t].Title != metadata.Tracks[t].Title || r.metadata.Tracks[t].Artist != metadata.Tracks[t].Artist) - equal = false; - return equal; - } - } -} \ No newline at end of file +} diff --git a/CUETools/frmChoice.resx b/CUETools/frmChoice.resx index be18e9f..315b585 100644 --- a/CUETools/frmChoice.resx +++ b/CUETools/frmChoice.resx @@ -166,83 +166,119 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACg - EQAAAk1TRnQBSQFMAgEBBAEAAQwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8ALgADAgEDAxQBHAMw - AUwDRAF5A1ABmgNQAaQDUAGaA0QBeQMwAUwDFAEcAwMBBAgAA5YB/wEfAgAB/wEfAgAB/wEfAgAB/wEf - AgAB/wEfAgAB/wEfAgAB/wEfAgAB/wEfAgAB/wEfAgAB/wEfAgAB/wEfAgAB/wEfAgAB/wEfAgAB/wEf - AgAB/wEfAgAB/wQAAVIBzAL/AR8CmQH/AR8CmQH/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/ - AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/EAADAgEDAxQBHAMwAUwDRAF5A1ABmgNQ - AaQDUAGaA0QBeQMwAUwDFAEcAwMBBBAAAwQBBgMkATYDUwGwAWMCXgHlAXwCZAH7AbMCqQH/AXwCbQH7 - A2AB6wNaAdMDUwGsA0cBggMoATwDBwEJBAABzAKZAf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8D6gH/ - A+oB/wPqAf8BgAIAAf8D6gH/A+oB/wPqAf8BgAIAAf8BgAIAAf8BUgIAAf8BHwIAAf8BHwKZAf8DAAH/ - AxUB/wM5Af8DAAH/AwgB/wFSAcwC/wFSAcwC/wFSAcwC/wFSAcwC/wFSAcwC/wFSAcwC/wFSAcwC/wFS - AcwC/wFSAcwC/wFSAcwC/wgAAwQBBgMkATYDUwGwAWMCXgHlAXwCZAH7AbMCqQH/AXwCbQH7A2AB6wNa - AdMDUwGsA0cBggMoATwDBwEJCAADAgEDAzEBTwNcAeoBzwK0Av8C3QL/AuIC/wLoAv8C7gL/AvMB/wPP - Af8DXwHzA1gBxgNMAZIDKAE8AwMBBAHMApkB/wGAAgAB/wGAAgAB/wGAAgAB/wPxAf8BgAIAAf8BgAIA - Af8D8QH/AYACAAH/A/EB/wGAAgAB/wGAAgAB/wPxAf8BgAIAAf8BgAIAAf8BHwIAAf8DAAH/A8wN/wM5 - Af8DCAH/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/ - BAADAgEDAzEBTwNcAeoBzwK0Av8C3QL/AuIC/wLoAv8C7gL/AvMB/wPPAf8DXwHzA1gBxgNMAZIDKAE8 - AwMBBAQAAyYBOANtAfcB9QLHAv8C0gL/AtgC/wLdAv8C4gL/AugC/wL0Bf8D9QH/A4UB+wNYAcYDRwGC - AxQBHAHMApkB/wGZAQABHwH/AYACAAH/AYACAAX/AYACAAH/AYACAAX/AYACAAX/AYACAAH/AYACAAX/ - AYACAAH/AYACAAH/AR8CAAH/AwAB/wPMEf8DAAH/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/ - AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/BAADJgE4A20B9wH1AscC/wLSAv8C2AL/At0C/wLiAv8C6AL/ - AvQF/wP1Af8DhQH7A1gBxgNHAYIDFAEcAwcBCQNeAd0B9QLNAv8CzwL/As0C/wLSAv8C2AL/At0C/wLi - Av8C+gn/A/UB/wNfAfMDUwGsAzABTAHMApkB/wGZAQABHwH/AYACAAH/AYACAAH/AYACAA3/AYACAA3/ - AYACAAH/AYACAAH/AYACAAH/AR8CAAH/AR8CmQH/AwgB/wNjAf8DwAH/A8AB/wPMAf8DAAH/AxUB/wMA - Af8DAAH/AwAB/wMAAf8DFQH/AVIBzAL/AVIBzAL/AVIBzAL/AwcBCQNeAd0B9QLNAv8CzwL/As0C/wLS - Av8C2AL/At0C/wLiAv8C+gn/A/UB/wNfAfMDUwGsAzABTAM+AWoBxgKxAv8C2QL/AtQC/wLPAv8CzQL/ - AdQB2wL/AdcB4gL/AeQB6hH/AdICzAH/A1oB0wNDAXcBzAKZAf8BmQEAAR8B/wGAAgAB/wGAAgAB/wGA - AgAB/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wEfAgAB/wFS - AcwC/wEfApkB/wMIAf8DAAH/AwAF/wMAAf8DCAH/AaQCoAn/A5kB/wMVAf8DFQH/AVIBzAL/AVIBzAL/ - Az4BagHGArEC/wLZAv8C1AL/As8C/wLNAv8B1AHbAv8B1wHiAv8B5AHqEf8B0gLMAf8DWgHTA0MBdwNW - AbYB/wLjAf8BAAEaARsB/wEAARoBGwH/AQABGgEbAv8B3gHnAf8BAAEaARsC/wHRAfMB/wEAARoBGwL/ - AfgC/wFaAmAB/wEAARoBGwH/AVoCYAH/AcwCmQH/AVwCVQHqA04BlAHMApkB/wGZAQABHwH/AYACAAH/ - AYACAAH/AYACAAH/AYACAAH/AYACAAX/AYACAAX/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/ - AR8CAAH/AVIBzAL/AVIBzAL/AVIBzAL/AVIBzAL/AwAF/wMAAf8DFRH/A8wB/wMAAf8BUgHMAv8BUgHM - Av8DVgG2Af8C4wH/AVoCYAH/AQABGgEbAf8BWgJgAv8B3gHnAf8BWgJgAf8BAAEaARsB/wFaAmAC/wH4 - Av8BAAEaARsB/wEAARoBGwH/AQABGgEbAf8BzAKZAf8BXAJVAeoDTgGUA2EB4gH/AucB/wEAARoBGwL/ - At4C/wLgAv8B7wH8Af8BAAEaARsC/wHiAfwB/wEAARoBGwH/AfwB8AH5Af8BAAEaARsB/wHMApkB/wEA - ARoBGwH/AcwCmQH/AW0CbAH3A1EBoQHMApkB/wGZAQABHwH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/ - AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AR8CAAH/ - AZkCUgH/AZkCUgH/AZkCUgH/AZkCUgH/AwAF/wMAAf8DAAH/AzkB/wPMDf8DAAH/AZkCUgH/AZkCUgH/ - A2EB4gH/AucB/wEAARoBGwL/At4B/wEAARoBGwL/Ae8B/AH/AQABGgEbAv8B4gH8Af8BAAEaARsB/wH8 - AfAB+QH/AQABGgEbAf8BzAKZAf8BzAKZAf8BzAKZAf8BbQJsAfcDUQGhAZ4CjAH/AekCvgH/AQABGgEb - Af8BAAEaARsB/wH5AtYC/wHpAfMB/wEAARoBGwH/AQABGgEbAf8BAAEaARsB/wH5AegB7AH/AQABGgEb - Af8B5gK6Af8B5gK9Af8B5gLAAf8BpgKUAf8DTgGUNP8D8QH/A+oB/wOAAf8BmQJSAf8BmQJSAf8BmQJS - Af8BmQJSAf8DAAX/AwAB/wNBAf8DCAH/AwAB/wMAAf8DAAX/AwAB/wGZAlIB/wGZAlIB/wGeAowB/wHp - Ar4B/wEAARoBGwH/AfMCxQH/AfkC1gL/AekB8wH/AQABGgEbAv8B6QHzAf8BAAEaARsB/wH5AegB7AH/ - AQABGgEbAf8BAAEaARsB/wHmAr0B/wHmAsAB/wGmApQB/wNOAZQDXQHSAdsCqAH/AQABGgEbAf8B6gK3 - Af8B8wLNAv8B7gH8Af8BAAEaARsC/wHSAfUB/wEAARoBGwL/AfQB/AH/AQABGgEbAv8C2AH/AQABGgEb - Av8C4gH/A2IB9gNDAXcE/wGZAQABHwn/AYACAA3/AYACAAH/AYACAA3/AYACAAH/AYACAAH/A4AB/wGZ - AlIB/wGZAlIB/wGZAlIB/wGZAlIB/wMABf8DCAH/AwAB/wMVAf8DQQH/A0EB/wMABf8DAAH/AZkCUgH/ - AZkCUgH/A10B0gHbAqgB/wEAARoBGwH/AeoCtwH/AQABGgEbAv8B7gH8Af8BAAEaARsC/wHSAfUB/wEA - ARoBGwL/AfQB/AH/AQABGgEbAv8C2AL/At0C/wLiAf8DYgH2A0MBdwNWAbEB1QKiAf8BAAEaARsB/wEA - ARoBGwH/AQABGgEbAv8B9gL/AVoCYAH/AQABGgEbAf8BWgJgAv8B4AHnAf8BWgJgAf8BAAEaARsB/wFa - AmAC/wLdAf8DWgHkAzABTAT/AZkBAAEfCf8BgAIACf8BgAIAEf8BgAIAAf8D8QH/A+oB/wOAAf8BmQJS - Af8BmQJSAf8BmQJSAf8BmQJSAf8DAAn/A5kB/wMVAf8DAAH/AwgB/wMABf8DAAH/AZkCUgH/AZkCUgH/ - A1YBsQHVAqIB/wFaAmAB/wEAARoBGwH/AVoCYAL/AfYC/wEAARoBGwL/AdIB9QH/AQABGgEbAv8B4AHn - Af8BAAEaARsB/wEAARoBGwH/AQABGgEbAv8C3QH/A1oB5AMwAUwDMgFQAcMCvxL/AewB8QL/AdsB5wL/ - AdkB3gL/AtQC/wLPAv8CzQL/AtIB/wHGAq0B/wNTAawDFAEbBP8BmQEAAR8J/wGAAgAJ/wGAAgAB/wGA - AgAB/wGAAgAB/wGAAgAF/wGAAgAB/wGAAgAB/wGAAgAB/wEfAgAB/wGZAlIB/wGZAlIB/wGZAlIB/wGZ - AlIB/wMAAf8DwA3/A8wB/wNLAf8DAAX/AwAB/wGZAlIB/wGZAlIB/wMyAVABwwK/Ev8B7AHxAv8B2wHn - Av8B2QHeAv8C1AL/As8C/wLNAv8C0gH/AcYCrQH/A1MBrAMUARsEAANaAcAD9Qr/Av4C/wLnAv8C4wL/ - At4C/wLZAv8C1AL/As8B/wH1AscB/wNfAeMDIwE0AwIBAwT/AZkBAAEfAf8BgAIABf8BgAIACf8BgAIA - Cf8BgAIABf8BgAIAAf8D8QH/A+oB/wEfAgAB/wGZAlIB/wGZAlIB/wGZAlIB/wGZAlIB/wMVAf8DOQH/ - A8AZ/wMAAf8BmQJSAf8BmQJSAf8EAANaAcAD9Qr/Av4C/wLnAv8C4wL/At4C/wLZAv8C1AL/As8B/wH1 - AscB/wNfAeMDIwE0AwIBAwQAAxcBIANiAe8D9Qb/AvgC/wLsAv8C5wL/AuMC/wLeAv8C2QH/AfUCzQH/ - A20B9wMwAU0DBAEGBAAE/wGZAh8J/wGAAgAB/wGAAgAJ/wGAAgAB/wGAAgAN/wGAAgAB/wGAAgAB/wOG - Af8BmQJSAf8BmQJSAf8BmQJSAf8BmQJSAf8BmQJSAf8DFQH/AwAB/wMVAf8DmRH/AwAB/wGZAlIB/wGZ - AlIB/wQAAxcBIANiAe8D9Qb/AvgC/wLsAv8C5wL/AuMC/wLeAv8C2QH/AfUCzQH/A20B9wMwAU0DBAEG - DAADFwEgA1oBwAPGAv8C9wL/AvIC/wLsAv8C5wL/AuMB/wHGArEB/wNeAdADJAE2AwIBAwgABP8BmQIf - Lf8D8QH/A+oB/wOGAf8BmQJSAf8BmQJSAf8BmQJSAf8BmQJSAf8BmQJSAf8BmQJSAf8BmQJSAf8DFQH/ - AwAB/wMIAf8DYwH/A8wF/wMAAf8BmQJSAf8BmQJSAf8IAAMXASADWgHAA8YC/wL3Av8C8gL/AuwC/wLn - Av8C4wH/AcYCsQH/A14B0AMkATYDAgEDGAADMgFQA1EBogNdAdIBjAKJAf8DYAHUA1QBpgM3AVoDBQEH - EAAI/wHMApkt/wPxAf8DwAH/BAABmQJSAf8BmQJSAf8BmQJSAf8BmQJSAf8BmQJSAf8BmQJSAf8BmQJS - Af8BmQJSAf8BmQJSAf8DCAH/AwAB/wM5Af8DFQH/AZkCUgH/FAADMgFQA1EBogNdAdIBjAKJAf8DYAHU - A1QBpgM3AVoDBQEHEAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAAeABAwIA - AYABAQHgAQMBwAEBBAABwAEBAYAFAAGAAQABgAUAAYBBAAGABQABgAEAAYABAQQAAYABAQHAAQMEAAHA - AQMB8AEPAgABgAEBAfABDws= + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAC + GgAAAk1TRnQBSQFMAgEBBgEAAQwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABIAMAAQEBAAEgBgABIB4AAh4BHQEqAj8BNwF3Ah4BHQEq8AACHgEdASkCQgE6AXQC/wHwAf8CQgE6 + AXQCHgEdASnoAAIeAR0BKAJGAT4BcQL/AfAB/wLpAdoD/wHxAf8CRgE+AXECHgEdASggAAI2ATIBWQJA + ATcBdgJAATcBdgIvASwBSwQAAi8BLAFLAkABNwF2AkABNwF2AkABNwF2AkABNwF2Ai8BLAFLBAACLwEs + AUsCQAE3AXYCQAE3AXYCNgEyAVmAAAIeAR0BJwJIAUEBbwL/AfAB/wHrAd0BsQH/AfcBwQE4Af8B7QHf + AbMD/wHyAf8CSAFBAW8CHgEdASccAAJFAT0BcgL5AekB/wLzAeMB/wJzAWUBtQI9ATQBeAKLAX0BwwLz + AeMB/wLzAeMB/wLzAeMB/wLzAeMB/wKLAX0BwwI9ATQBeAJzAWUBtQLzAeMB/wL5AekB/wJFAT0BcoAA + AkkBQQFuAv8B8AH/AukB2gH/AecBqwEiAf8B5wGrASIB/wHnAasBIgH/AeoB2wGwA/8B9AH/AkkBQQFu + Ah4BHQEnGAACSAFBAW8C9AHmAf8C6QHaAf8C7wHgAf8C9AHmAf8C7wHgAf8C6QHaAf8C6QHaAf8C6QHa + Af8C6QHaAf8C7wHgAf8C9AHmAf8C7wHgAf8C6QHaAf8C9AHmAf8CSAFBAW+AAAIeAR0BJwJKAUIBbQL/ + AfEB/wHnAdcBqwH/AdcBlgENAf8B1wGWAQ0B/wHXAZYBDQH/AegB2AGuA/8B9QH/AkoBQgFtAh4BHQEn + FAACSQFCAW4C9gHoAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHe + Af8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C9gHoAf8CSQFCAW6EAAIdARwBJgJKAUMBbAL/AfIB/wHl + AdQBqQH/Ac0BiQEAAf8BzQGJAQAB/wHNAYkBAAH/AegB1wGvA/8B9wH/AkoBQwFsAh0BHAEmEAACSgFD + AW0C9wHsAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHj + Af8C7gHjAf8C7gHjAf8C7gHjAf8C9wHsAf8CSgFDAW2IAAIdARwBJgJKAUMBawL/AfQB/wHnAdYBrAH/ + AdEBjgEFAf8B0QGOAQUB/wHRAY4BBQH/AewB2wGzA/8B+AH/AkoBQwFrAh0BHAEmDAACSgFDAWsC+QHv + Af8C8QHoAf8C8QHoAf8C8QHoAf8C8QHoAf8C8QHoAf8DAAH/AVABhQGTAf8BuALLAf8C8QHoAf8C8QHo + Af8C8QHoAf8C8QHoAf8C+QHvAf8CSgFDAWuMAAIdARwBJgJLAUQBawL/AfUB/wHrAdwBswH/Ad8BoQEY + Af8B3wGhARgB/wHfAaEBGAH/AfEB4gG7A/8B+gH/AksBRAFrAx0BJggAAksBRAFqAvoB8wH/AvUB7gH/ + AvUB7gH/AvUB7gH/AvUB7gH/AvUB7gH/AXsBsQHAAf8B2QH0Av8BPgGcAasB/wG1AdMB1AH/AvUB7gH/ + AvUB7gH/AvUB7gH/AvoB8wH/AksBRAFqkAADHQEmAkwBRQFqAv8B9wH/AfIB5AG7Af8B8AG4AS8B/wHw + AbgBLwH/AfABuAEvAf8C+AH0A/8B+wH/AkwBRQFqAh0BHAElBAACTAFFAWkC/AH3Af8C+AHzAf8C+AHz + Af8C+AHzAf8C+AHzAf8C+AHzAf8B1AHmAecB/wFIAbQBwwH/AXgB5gH3Af8BPwGdAa0B/wG2AdUB1wH/ + AvgB8wH/AvgB8wH/AvwB9wH/AkwBRQFplAACHQEcASUCTAFFAWkC/wH4Af8B9wHqAcMB/wH9AckBQAH/ + AfkB7AHHAf8C+wH3Af8C/AH5A/8B/AH/AkwBRQFpAh0BHAElAkwBRQFoAv0B+gH/AvsB9wH/AvsB9wH/ + AvsB9wH/AvsB9wH/AvsB9wH/AvsB9wH/Ab4B5QHoAf8BSQG1AcUB/wF4AeYB9wH/AUABngGuAf8BuQHY + AdsB/wL7AfcB/wL9AfoB/wJMAUUBaJgAAh0BHAElAkwBRQFoAv8B+gH/AvgB9AH/AvsB9wH/AugB3gH/ + AtgByQH/AugB3gP/Af4B/wJMAUUBaAJNAUcBaAL+Af0B/wL9AfsB/wL9AfsB/wL9AfsB/wL9AfsB/wL9 + AfsB/wL9AfsB/wL9AfsB/wHAAeYB6wH/AUoBtQHGAf8BeAHmAfcB/wFAAZ4BrwH/Ab4B2AHcAf8C/gH9 + Af8CTQFHAWicAAIdARwBJQJNAUYBaAL/AfsB/wL8AfkB/wLLAbsB/wQAAssBvAP/Af4B/wJNAUYBaAJO + AUcBZyT/AcEB6AHuAf8BSgG2AccB/wF4AeYB9wH/A5MB/wPVAf8CTgFHAWegAAIdARwBJQJNAUYBZwL/ + AfwB/wLUAcoB/wKvAZ8B/wLUAcsD/wH+Af8CTQFGAWcCOwE3AU0CTgFHAWYCTgFHAWYCTgFHAWYCTgFH + AWYCTgFHAWYCTgFHAWYCTgFHAWYCTgFHAWYCTgFHAWYCTgFHAWYBVQFmAWABjAJeAVgBpwP3Af8CSQFY + AbsCRgFVAXqkAAMcASQCTgFHAWcC/wH+A/8B/gP/Af4F/wJOAUcBZzAAAxsBJAJBAU4BfAKAAv8CJwGM + AcGoAAMcASQCTgFHAWYCTgFHAWYCTgFHAWYCTgFHAWYCOwE4AU00AAImASwBOQItAZUBrwInATQBQIwA + AwIBAwMUARwDMAFMA0QBeQNQAZoDUAGkA1ABmgNEAXkDMAFMAxQBHAMDAQQIAAOWAf8BHgIAAf8BHgIA + Af8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIA + Af8BHgIAAf8BHgIAAf8BHgIAAf8EAAFRAcwC/wEeApkB/wEeApkB/wFRAcwC/wFRAcwC/wFRAcwC/wFR + AcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/xAAAwIBAwMUARwDMAFM + A0QBeQNQAZoDUAGkA1ABmgNEAXkDMAFMAxQBHAMDAQQQAAMEAQYDJAE2A1MBsAFjAl4B5QF5AmIB+wGz + AqkB/wF5AmoB+wNgAesDWgHTA1MBrANHAYIDKAE8AwcBCQQAAcwCmQH/AYACAAH/AYACAAH/AYACAAH/ + AYACAAH/A+oB/wPqAf8D6gH/AYACAAH/A+oB/wPqAf8D6gH/AYACAAH/AYACAAH/AVECAAH/AR4CAAH/ + AR4CmQH/AwAB/wMUAf8DOAH/AwAB/wMHAf8BUQHMAv8BUQHMAv8BUQHMAv8BUQHMAv8BUQHMAv8BUQHM + Av8BUQHMAv8BUQHMAv8BUQHMAv8BUQHMAv8IAAMEAQYDJAE2A1MBsAFjAl4B5QF5AmIB+wGzAqkB/wF5 + AmoB+wNgAesDWgHTA1MBrANHAYIDKAE8AwcBCQgAAwIBAwMxAU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/ + Au4C/wLzAf8DzwH/A18B8wNYAcYDTAGSAygBPAMDAQQBzAKZAf8BgAIAAf8BgAIAAf8BgAIAAf8D8QH/ + AYACAAH/AYACAAH/A/EB/wGAAgAB/wPxAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/AYACAAH/AR4CAAH/ + AwAB/wPMDf8DOAH/AwcB/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFR + AcwC/wFRAcwC/wQAAwIBAwMxAU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/Au4C/wLzAf8DzwH/A18B8wNY + AcYDTAGSAygBPAMDAQQEAAMmATgDbQH3AfUCxwL/AtIC/wLYAv8C3QL/AuIC/wLoAv8C9AX/A/UB/wOE + AfsDWAHGA0cBggMUARwBzAKZAf8BmQEAAR4B/wGAAgAB/wGAAgAF/wGAAgAB/wGAAgAF/wGAAgAF/wGA + AgAB/wGAAgAF/wGAAgAB/wGAAgAB/wEeAgAB/wMAAf8DzBH/AwAB/wFRAcwC/wFRAcwC/wFRAcwC/wFR + AcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wQAAyYBOANtAfcB9QLHAv8C0gL/AtgC/wLd + Av8C4gL/AugC/wL0Bf8D9QH/A4QB+wNYAcYDRwGCAxQBHAMHAQkDXgHdAfUCzQL/As8C/wLNAv8C0gL/ + AtgC/wLdAv8C4gL/AvoJ/wP1Af8DXwHzA1MBrAMwAUwBzAKZAf8BmQEAAR4B/wGAAgAB/wGAAgAB/wGA + AgAN/wGAAgAN/wGAAgAB/wGAAgAB/wGAAgAB/wEeAgAB/wEeApkB/wMHAf8DYgH/A8AB/wPAAf8DzAH/ + AwAB/wMUAf8DAAH/AwAB/wMAAf8DAAH/AxQB/wFRAcwC/wFRAcwC/wFRAcwC/wMHAQkDXgHdAfUCzQL/ + As8C/wLNAv8C0gL/AtgC/wLdAv8C4gL/AvoJ/wP1Af8DXwHzA1MBrAMwAUwDPgFqAcYCsQL/AtkC/wLU + Av8CzwL/As0C/wHUAdsC/wHXAeIC/wHkAeoR/wHSAswB/wNaAdMDQwF3AcwCmQH/AZkBAAEeAf8BgAIA + Af8BgAIAAf8BgAIAAf8BgAIAAf8BgAIABf8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIA + Af8BHgIAAf8BUQHMAv8BHgKZAf8DBwH/AwAB/wMABf8DAAH/AwcB/wGkAqAJ/wOZAf8DFAH/AxQB/wFR + AcwC/wFRAcwC/wM+AWoBxgKxAv8C2QL/AtQC/wLPAv8CzQL/AdQB2wL/AdcB4gL/AeQB6hH/AdICzAH/ + A1oB0wNDAXcDVgG2Af8C4wH/AQABGQEaAf8BAAEZARoB/wEAARkBGgL/Ad4B5wH/AQABGQEaAv8B0QHz + Af8BAAEZARoC/wH4Av8BWQJfAf8BAAEZARoB/wFZAl8B/wHMApkB/wFcAlUB6gNOAZQBzAKZAf8BmQEA + AR4B/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAB/wGAAgAB/wGA + AgAB/wGAAgAB/wEeAgAB/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wMABf8DAAH/AxQR/wPMAf8DAAH/ + AVEBzAL/AVEBzAL/A1YBtgH/AuMB/wFZAl8B/wEAARkBGgH/AVkCXwL/Ad4B5wH/AVkCXwH/AQABGQEa + Af8BWQJfAv8B+AL/AQABGQEaAf8BAAEZARoB/wEAARkBGgH/AcwCmQH/AVwCVQHqA04BlANhAeIB/wLn + Af8BAAEZARoC/wLeAv8C4AL/Ae8B/AH/AQABGQEaAv8B4gH8Af8BAAEZARoB/wH8AfAB+QH/AQABGQEa + Af8BzAKZAf8BAAEZARoB/wHMApkB/wFtAmwB9wNRAaEBzAKZAf8BmQEAAR4B/wGAAgAB/wGAAgAB/wGA + AgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGA + AgAB/wEeAgAB/wGZAlEB/wGZAlEB/wGZAlEB/wGZAlEB/wMABf8DAAH/AwAB/wM4Af8DzA3/AwAB/wGZ + AlEB/wGZAlEB/wNhAeIB/wLnAf8BAAEZARoC/wLeAf8BAAEZARoC/wHvAfwB/wEAARkBGgL/AeIB/AH/ + AQABGQEaAf8B/AHwAfkB/wEAARkBGgH/AcwCmQH/AcwCmQH/AcwCmQH/AW0CbAH3A1EBoQGeAowB/wHp + Ar4B/wEAARkBGgH/AQABGQEaAf8B+QLWAv8B6QHzAf8BAAEZARoB/wEAARkBGgH/AQABGQEaAf8B+QHo + AewB/wEAARkBGgH/AeYCugH/AeYCvQH/AeYCwAH/AaYClAH/A04BlDT/A/EB/wPqAf8DgAH/AZkCUQH/ + AZkCUQH/AZkCUQH/AZkCUQH/AwAF/wMAAf8DQAH/AwcB/wMAAf8DAAH/AwAF/wMAAf8BmQJRAf8BmQJR + Af8BngKMAf8B6QK+Af8BAAEZARoB/wHzAsUB/wH5AtYC/wHpAfMB/wEAARkBGgL/AekB8wH/AQABGQEa + Af8B+QHoAewB/wEAARkBGgH/AQABGQEaAf8B5gK9Af8B5gLAAf8BpgKUAf8DTgGUA10B0gHbAqgB/wEA + ARkBGgH/AeoCtwH/AfMCzQL/Ae4B/AH/AQABGQEaAv8B0gH1Af8BAAEZARoC/wH0AfwB/wEAARkBGgL/ + AtgB/wEAARkBGgL/AuIB/wNiAfYDQwF3BP8BmQEAAR4J/wGAAgAN/wGAAgAB/wGAAgAN/wGAAgAB/wGA + AgAB/wOAAf8BmQJRAf8BmQJRAf8BmQJRAf8BmQJRAf8DAAX/AwcB/wMAAf8DFAH/A0AB/wNAAf8DAAX/ + AwAB/wGZAlEB/wGZAlEB/wNdAdIB2wKoAf8BAAEZARoB/wHqArcB/wEAARkBGgL/Ae4B/AH/AQABGQEa + Av8B0gH1Af8BAAEZARoC/wH0AfwB/wEAARkBGgL/AtgC/wLdAv8C4gH/A2IB9gNDAXcDVgGxAdUCogH/ + AQABGQEaAf8BAAEZARoB/wEAARkBGgL/AfYC/wFZAl8B/wEAARkBGgH/AVkCXwL/AeAB5wH/AVkCXwH/ + AQABGQEaAf8BWQJfAv8C3QH/A1oB5AMwAUwE/wGZAQABHgn/AYACAAn/AYACABH/AYACAAH/A/EB/wPq + Af8DgAH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AwAJ/wOZAf8DFAH/AwAB/wMHAf8DAAX/AwAB/wGZ + AlEB/wGZAlEB/wNWAbEB1QKiAf8BWQJfAf8BAAEZARoB/wFZAl8C/wH2Av8BAAEZARoC/wHSAfUB/wEA + ARkBGgL/AeAB5wH/AQABGQEaAf8BAAEZARoB/wEAARkBGgL/At0B/wNaAeQDMAFMAzIBUAHDAr8S/wHs + AfEC/wHbAecC/wHZAd4C/wLUAv8CzwL/As0C/wLSAf8BxgKtAf8DUwGsAxQBGwT/AZkBAAEeCf8BgAIA + Cf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BHgIAAf8BmQJRAf8BmQJR + Af8BmQJRAf8BmQJRAf8DAAH/A8AN/wPMAf8DSgH/AwAF/wMAAf8BmQJRAf8BmQJRAf8DMgFQAcMCvxL/ + AewB8QL/AdsB5wL/AdkB3gL/AtQC/wLPAv8CzQL/AtIB/wHGAq0B/wNTAawDFAEbBAADWgHAA/UK/wL+ + Av8C5wL/AuMC/wLeAv8C2QL/AtQC/wLPAf8B9QLHAf8DXwHjAyMBNAMCAQME/wGZAQABHgH/AYACAAX/ + AYACAAn/AYACAAn/AYACAAX/AYACAAH/A/EB/wPqAf8BHgIAAf8BmQJRAf8BmQJRAf8BmQJRAf8BmQJR + Af8DFAH/AzgB/wPAGf8DAAH/AZkCUQH/AZkCUQH/BAADWgHAA/UK/wL+Av8C5wL/AuMC/wLeAv8C2QL/ + AtQC/wLPAf8B9QLHAf8DXwHjAyMBNAMCAQMEAAMXASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/ + AtkB/wH1As0B/wNtAfcDMAFNAwQBBgQABP8BmQIeCf8BgAIAAf8BgAIACf8BgAIAAf8BgAIADf8BgAIA + Af8BgAIAAf8DhgH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AxQB/wMAAf8DFAH/A5kR/wMA + Af8BmQJRAf8BmQJRAf8EAAMXASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/AtkB/wH1As0B/wNt + AfcDMAFNAwQBBgwAAxcBIANaAcADxgL/AvcC/wLyAv8C7AL/AucC/wLjAf8BxgKxAf8DXgHQAyQBNgMC + AQMIAAT/AZkCHi3/A/EB/wPqAf8DhgH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/ + AZkCUQH/AxQB/wMAAf8DBwH/A2IB/wPMBf8DAAH/AZkCUQH/AZkCUQH/CAADFwEgA1oBwAPGAv8C9wL/ + AvIC/wLsAv8C5wL/AuMB/wHGArEB/wNeAdADJAE2AwIBAxgAAzIBUANRAaIDXQHSAYwCiQH/A2AB1ANU + AaYDNwFaAwUBBxAACP8BzAKZLf8D8QH/A8AB/wQAAZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/ + AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AwcB/wMAAf8DOAH/AxQB/wGZAlEB/xQAAzIBUANRAaIDXQHS + AYwCiQH/A2AB1ANUAaYDNwFaAwUBBxAAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYA + A/8BAAHjA/8EAAHBA/8EAAGAAf8BCAEQBQABfwcAAT8HAAEfBgABgAEPBgABwAEHBgAB4AEDBgAB8AEB + BgAB+AcAAfwHAAH+AQgGAAH/BwAB/wGAAf8B8AQAAf8BwAH/AfgEAAHgAQMCAAGAAQEB4AEDAcABAQQA + AcABAQGABQABgAEAAYAFAAGAQQABgAUAAYABAAGAAQEEAAGAAQEBwAEDBAABwAEDAfABDwIAAYABAQHw + AQ8L diff --git a/ThirdParty/taglib-sharp.dll b/ThirdParty/taglib-sharp.dll index c6182472e38650f574eb6bff463fb649f533cad0..58b1dbabbd1c4516e51c1b2614e21653a17457e2 100644 GIT binary patch delta 97312 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

}^O7J`fg{K!2 zvo3p`&gA6F9)_TW5!~#huCPQ|4N}3J{}~kdSQF*uJD05)83iXxT-{&)71V(J1_~`m z7#A@WqX{wVuro1hd)gJgTYHypuy8Pnd_#iCOF|C9P}H!&J8pu z!6L3NP;^Iup`hpk$c*yI5jRyB<0jYM)L?9!yzHhTW8CBuH?`nvzm9_kk|x~(t+SH7 zrOqfY+4WW{qtN8jw_F&7CkxzO!YDF%>ut~|)6LsPjG~iy?&u2(F*0z0*Y9$%G1dG6 zEesag>~}|jg?lCg1D8Sr0|SG`%*mAx6c`0J&wAhn%Crw3f|ghQdT0&p0I<|DGcvGf zvB3RXq6ACcEZ{|n@&bASMSV&P1w~*PwaGb;CW?Ul%v8<6$N=iLJOXJE+bsAvossdv z=&4=+c+u-g)0~qLw6lFKXX$C3p0U> zb7l=t>y|}Bi-mzr3*5O2QU-5$I5MnQ=*kXt7v1WoaoOw7v4QG!0>!4~!j9Z(ZjUBXfN^J6~ z7m-}h^{7Qf%99H}N;4Ww)_iHqC^|Xzr4*yl1&h3%mxIW%}BV(P(nX zYu$KE=dwYZE6gqkZs`lMgI&xm#-r`d&M^xduDqPkwg;%KD`u$932&9iaEc4E!dfCM z8qX%ZF<}RVxMZ)E8R#^VeLurtJwoze0h zn=@dxi^JT5&ly4t=+2Ostnh)G(P*;H2T%$N{GbF+opzH8K7vx`%nwTN@Gk-RiQJf+ z^f8^$XmZ9!kVU;8LD6sq%>MWhVd*`nrIw#SSt8~WNNwXMC3sGAP=n^QlVAmJzzPIE zBNR*mD}Z}q(&USuK$)@TGsvWcNDA+vD!d0($nyoH(C~{wy$q;4V}isdIL8zPs52BS z5@bb6$ZXnjf^6V~%*~$P0qT(&uz39>=fFyBP1OJ!i-y2DfrDqO|H zpr(T|E!1@O{6nA>kaCQU3|zt-+KPf4`SPF=mNWkWD+8Mb$aqkq)!_iGLI>LbT{?aZ zv2+|{184!P;MXul#mO08CHyK9N$$!4h zt0zex0|QsB5ZH)=pmovjm>Jl#qL`{d)`G`jbl4#rEfK9aCdlA`E;F+>E2P~GQU+2E zavDr|eKm-OT|HPPim4jpewcbN2fK2RGLZ2gKf;xRIM|hgWujD>szDxts|Rr~)lc60 zL(UXb#Oj(cfgKE1ud9jVHeDH}YLJl-8Ge|tn+1N_Gcv|b4)|pV%O}i>*d{v!Xiwhu zOB1wx;um;p#qS;sHAV)mS`kp_f;$kPdJ@tQ0@agfdqku~K!VIHti@sAL5-pr>I?-M zN}$Gr`s6>qW!Nmk6DKG9(GbyOWZ;5U`zPVm{+vG= zj2|W+{i6lhmx6TC$@G9^M(NE`e+?NKwI=)gQx^qS>?~sX0!0QI3k3>#=9R6~2KBBMVeqx1AaMn(}Ca7`ek ziM#;-yzL3J1!($0Mn*M8!RaR$8Rb+7_SVaoigl)QGcn3Cf+@-A+wL*)GYU=*Vq#P_ z1^a{CPsNi!Re=%81+@aCa{19 zevg70PDrD^@R8f;vdoMM5S1u)vFNa}^kpLS7T=hj$jm5Q4{vyY_jiCs(ct~++idv; zAeVs#nj!W+$} z5bHlN7w{b8^qVY<7W$T;fU^SW*X9#q(y#`#gxT2pG9y6yZEZlBKy%zo|HRxOnjBae ztr-QU*RV1cSb+v|gxLhy#EeP>SwRE6puLj_CkwL+vI??^N95aroW%k0t{}S*XTIHZ zH8w^K9#AM~OE3wti}xB$k78p~lXU>O#u3zq^91$bq9A(mA;Qz=vN7s28cjdT#%RoF zG@X&1(X}4bkz!)7Vqjp<1Pv({Ezx8s&^X8fn#$JUVC%~iGXxDO745+;d<`b7WySn-xlvIqEie4Z~fj9^$4lSr1T4uUTMIatRP6{E%R0QH6q)fD?uVZ7BkT%f*|Ype=6b=sdXnsLBlra6Wc1@UT2+NQa3-OH8YZsc4cGLjhC16$1mC#$gr)Hl`ww zQOsbr7RYV+3=9m}V7IM;*`dm%!@~v|-iMmQR1^j>MFZq+OgWHwFezM46F1~z7e{rP z8B@`u>E}5arRxvC?B!z9!DWD$AvV8V1N#lM9uw>zrXrA0SpD_}W(TJG!$79MJb>nJ zka;jETu#I8w`4%H>&xtI18o%(l#nwc1J@$(C=hdB zrqO+-qCL}d`55Jlkcw_WXweNaN(Xk50l4&j2HABCExq^hF)A~yodA0q7cr`phOg2F_@UAOiJ|RBvj!a>8 zPC@p3FHl7x#VN?nA;_NZ4JyQcvNEt0mxBhCeL(FXLH2xKNPnP$iGfXsSHrI!q-Etj zJ|W(JV!q(I1=Mcm%=ZWB4glH3uk9(suMr4ha)7pof(&4))@5X15#-3PW?*2;uVe!4 zMuo`c+0vlh5?pt{ zCoKqbi3@WJvgC(>EECYS5)#k|2QhgBdGaF|8Mt&b1i1ux#PTCSMlS{ps)II@fkdJ} z_COUeiwScJ31~!vEZTdIPe|aOSRmME)9(r}zE+9>*RtFk`LUp`71HMQx3B@K>8}JC z9U0Z8>j*JQM#h2ciU+xZP1{_EO(OvmKM?57B8 zSfCwt!t6rq;J5}G&dbi3p9TsNAx=S-{O_y`Y&sn5ocZaD3|wl=IvmV`Ecu`fY8-+r z`O6p?*zzKH*z+@{PZwr1VLUhej4-1!q+!ckXT-?BlF!V}z^2Px#HKr4MT9Y)(QJB) z2%{CF^Yr~9jN+!?ITBY;b6qT})(PD90c~!R(&sL6&}Aqnu3~0jt6~<*_h4s$?03`S zE~=Q$Ey}3Pcxbx0D5Dw^pWgI%QATmbknQE7jAo4WAQLshKsAa1lZFW^=u{B~jhpNY zYqu85p>tA+wJT{SMI@pyDr6i>by1G z8@CXn21p5Z^Vk_622M8?XEbNboSrStD8raFy+fRFKO4lT>An(-I*eJDVL7OJR{dGY-fLf3XAnt%nvobNvW?*303Lk=JE2`52%>_-* zlVnsg1J43!OR*Kr0tLJEQ-bwLZkk-or>;K*EXMsQ>= zL?JkG7mN@bdCm)x2wsB+5)4$0v+OmPH*T|o4DbJ``UjWKYu-UgeT2giH zpfPYcCXGT+i{A=DGcjuvp>m5sT+p#?%nTL`3=F$Lts}4&W^hN7TU&%3yeprJiH!vu zUK%B!+zT0Rd2)}7U5AYwRKiVvD9>mT0SQ=L?jppDL9rt!{flukF^lDwf{G?)a7&O^ zTb7N9odbFjNj8c54;)}j0WD?>fiG|aY3F7a)8k>6vVIR* z*=E4Vz);U5S__h3f*4lq3o4i3M}yRU1Fa$z2dl7n16l~jR1FdW9~M&k2_(r>4YD)8 z0yMbr9V8$DQN0498YBdcsoKvV$!ZX(5y=W#vS|Ge9%VUqJ%ZAQHTO62z!|0}_)0YZvFb7sv!L32F>D zPFB}5X&mPOxd!Y|keHRn|NsA)G>(Bq!JY++vVcX8f)>nz*IFKete16^fvlDVE!FU5 zWMBYcb`XbwfkBR`8sq|$b#z4x3=F2A)Lab;buKmw@km$D+B-(*vP&4P#ROKs%`OoM zUSP}w3Qj22)@G`HJ6%DAQM8^Dv`Q1?fjb}u$jx8|$eG}En;M`)Z^IavA|NaKm>6ss zR1#rq1qQDy2pi^7#7a((>yX#xfs&(E9xSnd6M+slQ$3gg%4l3#c}$RW!c+|kN*!(p z4U>bU3P{j{fg{T^9zw>Kuk!MIS(Ts44*E1goE*h-Lyy)!8#Kuz<#Z*h*%Bk~tGd6I99t zv;-PSju|9Z4N_sb17t!qNWgL}mq9D1E6(mp%BEh*4#HjrV%8im>{o-8rteGH2 zF;#=ig%sSYnKUkfod^yjaJD=150n`%z_Z<1lx!CW&S}kz3=ANQlOA9-99Y4foLtJ>R(LL4+JubK(ZCcDd5}$vi*)0qYNl7nKCe$L-Gt0gA9X; z1B5NdR1LNfk$*t8Am<-Y+63nxumm_2fU*JDqu^`+%03V|cIJ8p7LX)3V8D{#G%pWH z^PqLo(8OE|N^@+?wV-s&#!?GP!faX$(grLH6B!s74uIN1pfzz^Oya$@3=B-XoMOz2 zI5oUMZ5vPxCCs87B*>Cq4jT1h&o|~^VAF8|)8WwJ4e-o|y!Bi`R`3XiFnDlH0zA0J z!^Qz_qCnQrLFWnt+4?e#9>C`DmLlfyK%E=5{9DuaYA{+t&ZlD4b`fOFcc0Fr$>G4{O;*7D=%e5HQ7~`hT(_$=PjGZp5&A1g}KZ|xD=(MQm6Lc6wr@z!@ zG~@^62wg=Ea86*+D4MRR!zc}LSsTJ5(?fI^4PYju!%T290BaV9YX%J;ak7;x00sIz z_{8P}By-qw8G{+krbp>AItYV~uhMd3LM}YEuhnHVWaI(I605eoAZvd4^jCU}+RC8O z4DhHU=ORHi(BVPQ6S{UFg`R~zW4Jz8D~q;2S_IpJBbZHyLE{?8kvb4=zWDTg`i$Z# zpdn1Cln!V?65Q!4kevQgpV5RHG!PD+(9{T;X2d8h7Qn>7vWNqbws^ITIP=S=8yYbh zLRvq^V6yj>lnk@N@%J#8Dgl$X6$U@O{_9zEL8`E5wErY zCpZgmv4OJy_dVEhg%@xa^O-TqPB%7TG$2jKauY@asEg!5f$`9UQ4SIqH{nL}nlh%5 zX6klR(%kW={(&AtLD36-h60UHP)_n+@L}t0_ciBB4~>2Fcg7A&=j3P zD5{4V4iZ9BwFIFGst6>4rU;}D)#V@&G)2!aOah636(zB0!Tk3DLlsB_tO}t>3AADs zC8R(iXo><*6ipAXV3cL7oStXFDD47DRl+RVN{F1N0XnItl^rxWEScZU&cMdTkzWNG zI)R=gb`_DkASGq>^s^R>{_;%v(6fPbSmk+nw8fd(XXU?VWMC_j084DQwq$ezO-(gf zF@lb-im8xYe$|SRkxfURp`f^S`fY2*8b-D05jKqSjB3*>Y#3*$g@7~$gH9og0`hI?;C(o~mEj zGI}b2%5MohMlH0}w9%j;4bW=Z?ZI}88jOOVX-^45KBnq8M#vdb(|hb0RTy=qZ?tEW zW7L^`!Jg5;8**-#3H;o!42WBl+44_<-2yIuMOk$CSlIH9gXYS?0-z!c=C~tp$9X$2 z+OcKmGZf_4Oz(GKlmZ(r%&A=@2r-_QvlL`Jc&0s$O-ERe1#C$XL?hl`lZou1;ssIA6lz)-+clf}ruQk}!dz|sRc zmJ`a)h4D4&rf>CNY+&@5Zsy7O1HN7`%mCcOxA9`MVS})@*Lg7tGu9^Xp$Vvtpsti;IdU9ZV8-Q4dT|pxiuhe2b^0A;!c8d>pAqRK+;>_+}R-RJ~(#{h(`5^8yI2Tkz7kz+p7lLGe zfw*Gew6+LTcEAoKvt!Z_n6BiGJ-JD%_3W5iHOVKuy#A{23*Lnn490XzvB{Ke2eo zNP2}oqjh})BLkOsB$u`(GsFP4{1(vAeJf}^6nN5>2PWRi$N=hhaj}W%Uj`qn$ix8Z zmEA!b_~K%Q?9=9CW`OO}1~DPM_?ysPJU6Jf4kGH=n5ua}93E!q$k!!U*IfYKbqDE( zb=^0BM!vv9S)#Qdai(gJPF?OIH}JAhP@%*m4v~RK)e3<6vSPJ@%nU3Rvp_v&rfRTI zHAtj>RxKY$o~at-8b}a=!md^bBq{+m2)uh6#Mfv7mHqr6nQ9Q34+3 z*q9W^ZFiV7Kvsjs=OO#U5uIl_rfRS)hz>KzWaJJrC>dxeF+n0pD-9MW;1GbNK=AMp zxNi&^KLRBr`G3W_&@@sDiV!yDT2ShME*yre`~^obIHs8M+os0^F-k&qG(gg6J}5zR zA+g0HxwW;SiJKigaq~eGvgd;mH#--*cqC}7{vt$_jU~SwG>+{C;pT(VMGq+NfI55N z%mx*i{w0V}h_PcjdoZK6WCtjXEC=OIP?`X@${@AxbnjqB8Ag%m8NrNNoN!g(qYogf z#3847X2~mL>2nvc7)?JC%xKK$H{CjtQHocGyQt0xHfuE9F@#Zgx={$@d~Zn2tjofx z%c#YwW5@(q2vmev?8?Ok+Y`zL+Y`#B0ooI)Aq-kk&BTmYP9zh`sK_Wd-7b_-!V=U! zB+3*KbW{368Rdi_&H``V(_z#CFJ78{Ae2#63RwcQ*hmth9khn#e<-6`8bltlfC;2g zLynDsjjI?m48qMOW+cweR1FGSw){>|DRm9B+_DQabHI`hqL|siE0l^)vN5pnuz|M$ zgH?0ncY`7lqL(ATXL@%SqZFgy^krd;hV@8NZ23JPbqtW1i!cTThWnr$4!Yb$h-FQZ zTo7aOd%;C4=(egp&*-nf(vnOZ7pVq+t?w&gXA6_n8YMdXhD+s zB`xq`dxY1RrVB?fYM4MgCLzSE0rD7Vr06;*oI#Vupox4TW(}~f?j!qZdVU0B6{Fzv zR}qZLj3U$dA{licNjHa4aQcc!#$p9xtT8c6g`fT)!py(|JrMvj{0>^C6UxBApqMe2@_L&4M+eS3bkS&DW+-=1&-%hVUU0XSS@tB zKG;l%7H|OVXVQ2CFS_qTif+&}0rY^5o*ww%Bgib25*xJ5Sd5__eAy8*0}Hsw2KfP0 zQiCw~bO(^(;8_9z(8wmr;T>QDK_^9n_M0(-9SPog90V8`7@jaN z2#OUygjCb@wV?0;Pg5#^@+p^`mJw6YHY0`t4S5jX48md702cyAOht!~r9d2n)HRTl z0#p}>!>l0&;u$d&JwcWNaiCHR(^teW@-hCJzCDIfp7Gc8>oJUK{36B-1sX7OM2x5N z#4@V$nIH?AOm~cB)X?+;iNTx+;vn3Tge;XbeNrr=NqrGajEfDlqZ`z#)nyXX0xcv0 zkF-famzo&~qpdU3VPe-3)3RbJ0-3-prXd9Kl^Ih}jWI)kn1&*V=Lg|2Ll==Ds}P5( zsD~(F$_Je`$P7261H}*!kC`bSyjlxp2uKWO2vZS=$CM8`&kt&b5mV75n9o3qpg#f7oIoWFM&~< zQD%Bt0%M*iXq`W}psQQT$iUKBF$tXDe zS|XzyH>eoq(bf`T(&(H1Kao*M5>z({F+mF7vyhchkUTuyDv43G9yGMf#U@tt$e5vE z5u11sn+b@PDAEAal0{))TB@iDOiLHd0n;)?N5Hgf(F-swSHxus(kIVZWB_4s6~#ap z+(mT|22arn2!pri5`@85^urv&;xAG$1M3$k3V|>Li&`KIp`vXNhH%jf2t%Yu#C*DF zGNTovAZP`-Dx=8uvSh{((3sfi6h=Al2L62A>F-k*>_i90x2lF#+;!*8p>`nXDEtVKpY+@=M0F$3*}q`armH|2OthVl=BM25rA^OfH;Cs z&OZ=G2+HBGU?`9m265`SREvZ_JP{C&OSMP_#1VyZ)Ic0DD8~TAfdz~ehyx257Z3*) zG=3lsENmh`99ZBafjF?x$pLX>HR>VZTn6I70;mDRk%!va1>z_`Ia5F!MJQ(;h@%AM ztN?M8p`1-1jtZ2s2gFf@a*lyGYEaGv3x#shIV~WLC6v<#;#h$>^{PcPKs;+OPqk_uQY>jD*^`O$X0mRFJN_Bxaxlqm&5GN1HnFr$JLpduzoB}9k z6Npm?)&26^P%8;J1MIZ3uoJh+p515SRfH09`Nvb-*GJzY`(9 z2E^||@V9~Zpfm5F>JNbUJqY*7e@i!s(E+GD91m6$D--6&rfcRSx{3H+`bd)2+{Q9CCkO1gtPKZEJ z8Hf*BC-ApULye;$YrI`k8&e+7uY7a_k1#NP+w*Q*xo0SWAf z38)qw1Mv?a_!mI@g9!dD5dRQ@{{+N8jNrcm@sA+*KR|rYnT1dXG1)T|C>(>zgW7*Q zAc5mh0WQ@dF%bU*g0BGLpG5GrK>Sk(z6pqb8o{>%@y{Um9w7c%1V0GGKL_E1%l{aV zz3w1t9)K1iuQzzl7kofcTdY{5}x>3W7fa#J>vT{}XPw$i%?%Pq^+P z69XFyyAYGc^zFY37;~8G7uhouXcavGlYhXZlLJU33{3Wc$$en*9hg*d1j$B$$ys1> zADDaqCIg&6vQ1#}6qx)4Cf%Gt;t(_Q!0bt2GOQkK=oK*M6`0g;0V&M`lUu;#FEHug z3KDMulSja$nj1(Y4@|BAlaIipoI6O|1WaBAlZGB3kqcll-4n!K4kjOa)`K|mULZ0Y zOg4ha&0z8_m~{09$u@(@{a}*a2P6^;CLw;B?!!>Pq*1`ez$TdwIw`AYsSiVe#thI9 zXwg})y2oG=61LpFApMCTvc6~{h$`9%CK>%e67FDfCzyN=CiVS6;CRGDK z;)}tgNg#-Q6imtnf!OU}aypp&4JH+XLE`;j@-LXIuM7bR?F5q-!K7>`NTeA|?gx|1 zVIUEEFj)^KcZ12_VA4JuBwGz8Z-Pnb2#`o1nCu0U2f^fLFex4hl63}?we?_XHJH2& zCb^?P(%xXQ8BCr8lcLce@oX?T7feC|b1#_v5==_RfYkVc$x1LeA57i_lk%}3*>Es9 z7fjxa1;_tiFvm0wBwYz6A?$--Hh(-wJQhq&29q`kAdw<4c?(SHB!Wa-z+@Vj+yExI zl0f1nU@{3zP6Lz1$sqCEWQO_zt)ksv4rdBTs2)td1(V9DAdyHgIT=je2a~L6AaQ>% zIUh{E2a^z4`*e_OI+*MSlPAICYcR=}0g_b(lf@Yf1x{K;li?h#qN8ATN+w9r0x8ASyhvY>nFHB>>TI2Q*_KU&SWT^uxYh;+5uF4(e|$u*3Q zJfMXz!YtbAf-L!k(;w6@O3H#KSwWYl>A)6VUO+4-nl4t$=-~p@qzTdl+V{p@TFSt{ z#KWN@&XGTf4RJ0W2k$*OHeDtTE|^K@5GHM3RLf`v^6$+$#)XVJ)2r(ltr>NuZ?9)` zGX|e|#iX%}je!j^Wh2Q3;X#hLVk`2>Vt|~+sRp@Lw#aX~K?9>AKlt`c_WYTk?Ne;| z7p5mPFq&|ITnk=4SU7!N1EZuGcqxwn=v>15C2S0AEXJT^J!a4~M~H=jcN-Yp81ts9 zG&0VxKLZb0@Lj3AOhurjRJD5<8CbNnIEt=dNP`wsL8Q5vitbGR-N^VzA0!5vg5%QV z=K$-6a746K*bydx52@02VlO(gou`>m85BSUEsWBPKc@S%FiJ6LWpB@DVPs-t{4qVd z6+AoE+sf$1U6IXDP}B;(ZEyO$Rz?fPoay3ijC_eKl0vgU zr72|m?*b?#d(n5%U1|ZmE#fnT2LLlGEiWk9G;y?_N6DzVoRU;=}gg_YwT}Zs>4w?`s>!1sX7ro12D5wW76oXnR zAy)JQO__vv5koFYK9H9bE8;>I5-$=$6Os}ul0g>|FH%7hlCBpk(nA*$FET?Dk`XI% zKo=4(@<0=k6)Ort7ZNXuLKBh`D@s8Kf%BidoOls@WfwFoYJ>OqU8pjIl074@MhQxY$NFCv4gQWh(khNencya>Lw z45~^+tY{vZDi!e}_>wcIDpj%iqGf2xRK<(nOVOap)WnL`p{Y_6FWQDCq%Kx;09{DD z=meUOhFH-hB%yi+E;e}$%+#+bR&)zV8Az3;coBS29MoZ2VnvV8RB4G9y+RYx7AyLK zE+k$AS@#E8tOqqrN37@%nlc^nBKUehs488tB9=VV452Gt#DgZJCsrheE`*uJ^u>zm z<lQ$AC0x#S{ zN{Yr}MRv%_xY*>4#f#j~giOSW0?>uTiz3j3OvQ?l(1pZ{vLHhB3~W%BnTZvZK*SJ2 z;zc!RLgr#cZRkScMSW;O7Ggy+(1pZ{7N7}PiWRM@M;8+>+Jq)#C04WtT}ZqLy4V%w z)&@{BNK&F0)STgF7ZWQwf}(|84881N7Z)qKV~A4!v5TX}D!YVO(K%FuB+#v9ZveHk zz)KgI8FCmH7`}iuloihdE!esQTCl~;qVblQfsIMyJ?OA;A?CVcpyidqpd~!qMbnpE zVpISvz~q{Kcp{?=czN0O{l!7k7lte7S1Ti5?FkeB|c2rA)R$YP!Hl}J>5L*Vc z0+Xp)9>kV|uode;90d>uw5#$lY-y$@Bka}nV^v;3($oeOro_QaV93PC14Nb zg94~l1+->H94u)88rWiDssRaUfWoX+2_#t!BJ*#9HyF!+HYhrP23?sT!gs*JAh$Vy zM!T6Lz$P&Q4FL&&`vc%Ln;=VT zB|vHp&0fdqEJc8^;Sp?+Dz@WkaS+@xaPVgciESnxBAWVr6xAkT19XYGJ~XJ=KQ6gP7!EbTOI=g!w*m{gd`GBF5rSF z$_KGQYd7s7eD?gs(>G3Kl;a2I2tJtLlIi!RGK$wP0~zQB5doh^R2}z_6 za>zO}{19J8_#wogBiV0&mg|5PzpyZXZY2UA%LPAe53x`Vw9f(D{R1yoWMZzby#Xpe zASXhCR$MM(tGxwU*8L7@9m)zqblnimEcx&==^=V=5wBN(CI1}g>_xbp)0w9;x-$w) z_nyw^#aJ_a+H}U_jH1)yW-v-H8f`D1!Dzy$1a>;o5q_X$wU99n7J2RneeR+g)6dRi zEM*ePpYAe?v7J$H`k7gbYK$V&v+prVPUo4;$irweU2-;~i5}P_h}JCdyclTx>Xdxg zYE|aCCyWd%`7EF_0=SE8rdQ8qyr}~^i>~$_DA1V2{WK_Cm5VRf7zKoX!Y3vmJb00dv0C^bd0w3wq<11;TTsyM z09gPIT2{1E)u+2GWHeUU0BS=RgI3?NMsTx3jLTom$iQWES5!*@bbnZ{^YqyZ85eddwn5Ys@o1moH*;VcanN%_2q#Mz9gG)0Gx8Mlf!eUcH#n zfl+Y!p2dvv{2;3g6jZ!oU9v40?Pp-v56L48|Pn;`z4IPcCN+VZ1S2 zZUv)PCa91CA1k2k#>5OdL{kG)wu8pP1jn@D6a;ZCC~*OhzSl97DFy3 zF&6OYPy!5W%xoGa>j?;=u7YU1=SoLp`X-?E#gbpw=9yM#x8q)Zt9*pzDyhw3=|rGlTOHUIqI= zKCr5XWD91N{QV%l8I+rU0K|h;6`(Q=e76S^UK0<3^x(~)hd?Ueb{uA8;4%iAD+ao< z1mt<=#vYy!1_nme3zs2= z&e+PR%(!d%o~?}4;EOlJxBG8ne8|Xnbh_aVMzwm-5xYDbV)~%UMvMcTy0yUDy+FtR z@G&x=oc^N;?X+qjI;|ikq|^EZ+G*7S^+!Pj8&kCoh^-CkSTI%Vf!MkrHmINa7SvA_ zHmGN20Ig91-GahY4Kj<14SYo=69WSSXm5{pIg@BDNSsNmRv*-BjAUY}1{uy&4Kgaf z5_EZ#0jO7~3Kn3h266H~Ff*`4)PhtnK}2fRL2AUoMu}^|%v7ze2N^0J0XCbd8pL6$ z2D#U0rkIu-Q#D8ztiK1^V*wFBbj`pnL!6IP3ko1D&^`^&K{BAwlmAx?4VPMwtJ#=q zK|#XCQVR+VHZ6wfTXr%kMS_MebU2upi%){82O);K6QH<*i+%^4(JsVL2R^VJE?NdU zNLYvgvcD8A$^_~i2{F_i2b(Zme;1>uI9$>n6zD<>&@q$g(YqLDs~%@$;A&t5skQ?h zQ<27`aRO9IG1oFNF|gEuB$)C~PM6-zs0uzu4Rpw_09vvzh9(OmM6v)enYgss#ftxc zlLaWszk+NBotFk$r3Sg)7o-en`%fkV0|RIqm3BIlXe~&N3G9IU)1U^iDQKXBNgON= z+WAvs%FMu`aRwx10*YLwY7muQ2TBo!AOQ)mQs~AXuxSu2XF<)r{Y)Bv;r;(#(EdND zm;;>@*4D-V?)1wsRf9}|rhxh?$i=+yOI<-`f_wa+)C$`21H#~KKOm#;z_*W~Z2JKl zh)6*oGmty?ps)mY?!gjZ2mcex0yj=Um(jxZ0dX-fFo2>#{vRxWK}~xm22k_}qD7Ad zGt|#;c*2r2^v@EQ3Wy*dsKl;#t~Iu^AJ&$2r>jYu0R0`jw`SP*uk*4 z0u97~`<6@$pr`^xiTuA}L|}t%htt{x>2!gPWS`6cKK>woAEP4tNQAi%v3dI#)kHw* z5p5^PfXMV4`xq}Pal2hFE*6`h&BXg{L|`;|h50@{`E|MDEAgYL`h@pU8!w_`7LocZOVSqG<%V7=T;y_S$Sp{^oSaIO= zyaS9H z$%mhMCd{fW20Ew;vTVWL48P89DahTCZY{9?(|FuA8n9DITFo;1c;%A)hdxWt=wuq@(5oD$)gw9uIWMIn@ zV$gt?a`y;hzQik#c2MEK!qC9Tz#tAWpb%_;`1G2ij4_PQrr$iusKOS^z`$j(XFBsS zMpedX(>0GV8p@_a%+1yBW2tqM9-@51!( z6O2k07eOsbCLMM*ru<8wzAbb9We^1_&6o`s8Qy~mPzDBuqC8L<0?phsXfQFb6je;$ zc!E(lwE-jwx)=j|s%3)~NU8%>OdBLN0VD?2tpnoDf^&62+$C_X9*DaR&eaETcTCqj z$tWv&2qcQI$_ONNYI^iZM%jAsQX;VFrXbN>pq4V2YX;(8LDgsu61xKu11qrrai4*> z2(v9gVrHOaGGHZEAnrRQ?b}k0C1{)Bcp?EsuDMlGvu434@5$OEFA`v*( z0i;R}&UFNFHQ-z)5Z7pW)G0=#dMmi7D@fD@&UFKE{oq`85H|wO^#E~`;9O4-HwVu3 z0&&aWTyGG!0nYUSal0T~bq2NuUl4x^gwMd%;0NN)gLC~s+!fQ6PBZElZvu%Tf-e{( zwF@K$4nEMyjzve{+)$A0x#^9k8Fd*2r>{TFD8raN{mf~`UdHU{QD+!C7_+C_on=&< z&T^K~62i6>y8=q2LJSHG(`GPaF;#~%F|b5wT%A7gETbIbmFXMKGKxrE1-1R-n5v_g z7+A`3n5rYebhL)k^t)#nt0Z$kgGEA&8k<3Tu`Ssd*o4`&)dbn|uT3vF$EXT9v*_YI z9zk{;c0u-hh3QMrG5Tx5G;L>NV3Uf!sKZta7O9H^<)7=IUN(oevJi*Hjp?%I8I^=? zf?6+E?(qq6{1eLqmwej;&oiE2biGjwszN|60BaRv%D)A2tzPkMPzw)anijJG69ed= z2~f!nse2GNT5^%Gn9ZPsp`ci7 zy6h#!CdgSR8jN?QpS;9qpn4bN5YX0dMg|uK1_oJ1(5C5RkpJ$12kSsL(%zpgcbQQ_ z=mE%kpcy!(e_{n-?@jl(%%}@KSevUDbiWQalLq`IK4HiihoI~AcsNS?L1zJS>PT|t zpJQhL-DAzpz*Z~@x>WEXC~CDOIZC}57?{APPVuq}vgH3@W?%y!V-BlmkPb)$odLkc zUOXAp_GVz1{^c^GvJb?y20~04_dy1-<%1?6AAq4_#9QhwX&IHX+g2qCHSRsa; zg88g^04X{J_n5sbm&c>Yo1QZ#Ndn3U@`AFoJiMU`(g{`uI)%myqLM8iZVyrj$TC%{fK(&PB0_@)ruEr$`D=^@ zjKb3ct}z}~eh#uyj;T5wl*Ejfsxz1vSite7WyDmS3Fb^UyUysyC^Ws|I^%ojNgQ=W zpacXx-#ue`^$o_Aj5DUI-ejy|ES$dJCZh=C9Kgr$L&*-^WcH zKOeH>QW_BBycN82b5&kLCZtIOE6j3c<$*#mt7)`di!;o(Svc(a_2jYOej-4 zs!R-}(+F~dyH2YA=54FOw~1@a0g%ag*+t# zYV?6+7(k5=T?Ph*-=H~z>RM1=5jIl;;*dU51Jb1x6~a_q2RDly!ofaO15yT>*=ayl z4&q=cpFaB`qnaXY4hK98C&spjU8|3YSx1DqFH?sfJeM>5(L+Wp)R`N8(4eR`V&-PL z^&`f5#%0rYKVsBj6rBFz5#u*T=jrz!GpbpFPRG~c5(hP3gbi33KvS&Bp!t2!OifdzCsfDnU5`1Fz| zjE;;yrf++~XsQg3RkZ0p7I}dP$UwUxcM((BbiSvIYZ&iN-~E(PiqU!dwWo~V+3GdQ zK&z|+z+?)ToChY~fk}~akgO4yi~*A!U~&VPd;=z>DnM#7z+?xQTmvR=fk}o+kgN)r z^Z=7NU~(Rqd{Gakq^dxQlE7pKnA`;>KY>ZHYLKi2n5+Sl^T6Z_FsW7pl63=bSmVn7=VDbo#C5=A9hlq$CZT~3W;3*d)cAnOJ}`L=OmcL9#2vt78kn30CO3h}J7AKj zlc7MXzDNl~6}f=PJ}`L?Od527jEDl0Jz(+xnEV7LWx7GK9$>NzOwIw5SHL7o4@lMo zOlE+|Szz)6nEV7LWqLts>f^xF3@~{NOnw5Ba(y6a4=`B)CbxjePhirZA0%4x876|%=z+9FsuOYGBd}OlE+|1~54f zOg;dUVv|8CoxtQYF!=~f3QYlt>w(D#Fj)pBkAX?4sUX=LFu7+cI3@E;0}0uH$ucmx z4otoPlS?7TgB-ICs#7sfD1H2e z(bEuACku0EhY51zgYJ#z;V1^NsOZp}Hff{dJ5E^5I zYTXY;8Cj4D&=?nFun5#aLAwbv2{OM4ndM+&W(7}kXrzF~Bh^4FeqMvD0CgXj89>{4 zwHX-%!PD_vOd4-MZQZxvg?)uW%o^`NGonoF8u05fg;}(n1X=PEr>Fd6bkqbLcdxq@ zvEc^P#usANcn@m3w?U4|DuVPm&i!PxWfYvu=r6&jHeK}>V-|$Ntp;*F6SEM5#)s*f ze}T@{1*tKD3Ts4x2fHE1sDs)dp!=bH**Nk+cdhesLgzNQ*g5KSrmOvC41gHQs5X7V zZ$^CxM+Rn8GzSA4X!1~7l2edn78jckqsF!AUw$*1L)009)j@8bOa_G%6SIaos7b-c z#LQCs40JT)M^LcAd7q}2{$W&tXl7KKzVQ#}L>G|bRWMD0FOotWJg4!OQ5~XL6J34r zQ_!Lqmi$xTXi(+MpA3oxc8%ES6aO-bOUE(5uPMC@Ym0*do-My|`r*HfE)Y{0)ut={ z19jFxP7(rJ0rL^)47$(LEB`T?sDgZ`%frMDwo>C0Xq*WW+01Nm5ghqHK>hBx>6iX7 z1~Z0DSNqR6ol$W5zWo!q70BevOGqOR57@wt!ofh}_D?4;ng{oUleh9~$!c%nS_L`Cq^> z%FUVo72MtBxd$sp-@+ntdLlE^B*q)lzc4ddF?LPYXJK*`1WhS|J!Ztk3A%?|Z+a^W z(+pA2L2<$yf*j!cz&XGxy7IfG8?iD$CLuwKSH$c=2NED%mM+Z3F31L6sK5!jOc{J9 zkVG%oBu+t2ut}Wa@(ObWIrG1P+$zYXQN|1!b`fOPF$UcmR|CotnjjXaUx%!pOOOk! zpG#c6USX~v7sLQg@KnFJAs_tmcI%k`|NldT#SBf^IU&6rVQxWguy$^!M?mX8#MwE) zZq?>vX9wTaDju2t9dwo-n4=?#5d8rflmPdkt}?ObGv1mW&c@`#Xf}No8JXABHns={nK znu6?*eU(#Y!@45Ee1d#pf~?>ZnHLH2LAC>Ga|yD;j1c4%j}Yb+pUT^M8U; zinb(Y{x49fW@gI=yWunFj6&qL!hLueFX3X^tMD77i<3hv{|~6j`OC<_#gYGyk%3E? zN83V>C;$KSKyD@jagewm59F$q{r7kTd34wXdGZye&){Z~XZ$;T2RD-mr&&I^S#SB{S1>!O1vokSpfyRJ9Jg}S=Xljay0d(jFXbiLH z1jtGbCI+qs(A;>D&|HRsVlWpp=2R2|=N<+P2QPzjK@G8@4`6N-Nb^yUwADPAX3&;` zq82z8G#FQO4$cM5%@;|`hbcY@(whY5o&s^#fVtEE3Nq>2Hb^ltDAzGCypdvLut{QI zP!29B%FIhI2Du+}4E&Gz3=GPl!3+wrObnpY9hKcfJwbz{2C_^HJkv9UnA8D8ukHE4&0zhW+1%gP) zK#+QEFzFsRgTtO7A`qmjq8=IkiXZ1 zMNUTC3$zCN*qY&e1Or1cBgpsG3}TTC$_&+D4jY4RB*?fkks!?uu^_fjB8W^$-0mRC zq`_IQ6U@NC%5a8h5r;4%1A|%!0|O_+6{bZT%!~pI-60@381HHrhYQr-Yhr|WXkJEkV=poi02&*;{9Yg0XF4j7MRPyd7ikJJwt>kVk?S;t89v1B(iLX>6>nf5%&47UYQV_wB*b5V zk)bYh10y3tXXpk-Hina-OF7sWczsVZurXW?1(Ekc{T0|4o`r@efYi5QRUaA-QWIMr z-m1XHkQR zN2Bz$*ci@7)jMmkF}#TK)&e=gSqtP|?8fQ&yix4{o)`p70k|$1{qx$ouS3X z&;cfAfJIhBgDlt_4Kn{+G{oc%9dw6A)bp@0-1p7lVq;ho10vVPfQ;S|)1kx0a2PCd zJ_;1b=VB)7fE@RR5n===*zI-M7?#Jn=z@aUQx_zALJuN~h?-a)Hijs_%M5G`SK>fq z4w(HK%m&$853~4h+zCB42KIQ6^+NHN_1GBBfvtZL1&Zk>A(su%jlO5V#$e=ofq{+T zegcSeF!;mB#_%cuME*zsIhr96r0Yot%+WAsT}YHO1UXvSkWq#KQ~EPl`d^~*_Ch13 z>HPH_poK>alNq*1Y-GO7uoBFh#;`@=0P_uoop9c1=GzR1;k?VtcNs3jc@LN$Fx&<6 zS|mz1zc4>y;0OSf@*v(n<|hn7aNaeBrwj^U-Z9QI5>FYPG3eGqxi=(OS)MUiLwOIu zl6FwuD~W3i&lnt_yw4JxEYBI7!MrvOdoCfC=M3Hu9s`5qQ-4v`Dw5Y2UNXE0tOvOi#8qH<#lRB;;TcFOu)Jn4fbuLQEg9c1gg|&4 z?vkdAZy2hWAKzIzLk~%DJ7*v8m zHncD_Nt&~~W$+1R&|qL-IKs#vY0vVGp#rq_kfBYYgfo-nJ;Pi$&yw*I!>;LTotYBr zkH7`9m_9LF0G%1l@Qm}4WGTxR21U@qL563X_a&=XzA&gjdG93I8NV<@KzYJatSny` z_Ca|nVBRq(&jQRl3FftN>;&^Jf_cXnj)Hlg>!I9>QZre;FmQ*1Jk!Q-QEDE`R|an| zZyLu9sUULI zko|2O_0q2y{xNKVO7==iGyY@P4du<2e$DWo;V_i9Tw0p(Kf@U)Z?p7k1_s6#5FW#E z>8A_~j31%AD`1{L6v#1+3=ERzSr`~sgL#m^XJkAP#Q?JZ7y~Hq85tjdC7&@~l)A>k z#HbJr(g+ItJ1oqMT2S5-sXHvJjOJh-B=Ff8J-|GW?-iKY8H3KTqPn2YH%@iKk@aT$&<>=w6W=4Y${t&U?j!f;gFmRXRo1Ijxq?#e98 zcmT`;6$X}!VvLvJymu^Oj33~u$j~+hXBj?LIYxabFJ4BR zRh}^m%FC0HV^v^W2IpzADltBS^Nd+l7(YUI^$dA3)~srb44^q;hBk&g8CO;fMjI%v zT;>{s7GpV>cZ@?`(3DY|u^qx=&=$00)MlIl=79nq#G3=>U1QK@TnguXWzk{W0OlQI z0Qp{@@eqW^QD4H%$f(bF0?KXVW@prAHkz0V#fYBMsJHRc< zXuuc-<$dKAU^HaRfb!UQL>UbktD!tc9sx!p#$G7TpGTC@h;adwx3Qjwoza-_0hGI! zhnvxukuwou{Yf4HMiWM9DDMi7D5D9Z9+Y>V=QV>VqXU%pf=8Oslrb2}`^fW}!Hh8# z%KObD&1lA00p+pszGg6I?1J({cz+0VSab zR!c?|Fb@>m@vK&iEpT2ss|_PZGDsyP1=%r9f$%t5I15?r80SEF-7@8@c8n{byc-g) z>ly4AkAS(;7?#S^vDz`}q=JkAS(wS<$k+_$&0%$6oCW7CWp!s<1?C;$096uRj9bAx zP%-*|wnt*3$(A(U4u`u z@)m-4^^8ZM+%2+C83GtDfO!)cj>&Ff4PfNS067K}7SC9N7!%;UcdQ|d`Cwif$6C3s ztf7oGP~HuR*9@VIolu@P*KgKP#%WMqsWc;7DB}_+Z>JmwTNq>LE-3e?91mL<;}j-$Z69UKFdk4MKUIXc~ck|!G}h@)c}(jEAATSMv321&r6AynphoY=w-kpgbXk9=2k}zfhj4!X&m5 zM!{UL(-%h)OzcjSVqHijb%lJd`3YZyyFo1Ynu zFsRB4vehxhfUc)tIK}`9i+aYTVBSQA2!)Mo^^7~gyf%(S3Z{$=jF+IiH42B=8WpPsUHG9Cf*AYSTbyaMHcywuCcQwXvi z;-x-tRWrTHmno-S2P_VX%xesj7(GB&YJ*+H%|4m&3WNu)bEYt^1dn7qHWP#&mdGL7*vloz1L%{YzmPCb+hYX44W zd;;Zx+P~8o--3B<919g$S!OVPh4NM_3bD^%{0HT2Rb*wE$;eg$@?0Co0YxG9nT-5U z-f2ZvmRXGAP~I&?A@*5}3Q*olMOK#Cj2b22M9{|ZTTzI8Hlra#Qlf-Yfq4$2HJr!I zIFHc<&eLF?&*%r|F*7Y>i~#c>4TVLFSHV0;LtzQyKPV5>P*}#uQwnnE5e860VFja0 zDLfHmF|B6wF9S(J+J$Qw>!CbQV{a{E3zP>6#I=k&pgd5UaV;Yocmek_PEeb1Eu#XI z2Wm2|Wz+}rK&37#%UVWrD6dlq#EUFv0ND>|Zmng^2TMX)TWcBH!8}lF%ba~3;|?$n z)Y`IRU(a|5%6lSZ$G(w~rvl_`NNZ~|qY0P?N>4HDn;B=odGV~<7+I=7DnW9o>^m4I zfOz!`Z5-~(1?;;S=YqHlZ5-jsrR=*Iw?TQ{T-EG*823SW>B`bfdl-*Fc`eGX8TK%q zgYssBdDoykP&vDY@g9^HE(uck0>T3)=RJ%q)gZ^zH*#!Je#)?ik);O2g@nZ(#tg4n*ELJdl^52d7!Z9VBg317s`7g)xmy%k*gMD3dn~F%!e4I;5=@|BaA9= zo(A(#MiU6HUZRAPndvyA9fZrFr?Q&;1fv_6cZ|bDl#}TMqaT##Bg)5gf-wTZV^9~f zWIVwLNx+b#cY^U4I5{6<&=C`1I>q=0%xh#|77t)P&6v;#b6O_L8O91IufBwHEBkrI zJ7DfH4p3L~BI6S8j2b7nla+>`L zV*uz}ZE)%Foc$`}TsZGD`%T8RaNaZ4JB&BLyjF>ldd>v4dyLGW1GpL5I22X?us>qt zhVqP5nK&LXia>eJs_cx98SSCG099_r$BZ6O9w=8lVGMxsKt;c{Qq99M2hNfO(+u)`;T; zqXFogaE56Nt*VY3Zy9fZd63fgBO?pwh;V3y@|p1hm*W3B(qcm~QgU&?9vhsgxO zW0<6NmV=k+A(S^u?J@@+(+?aPTwz0G*!BFp*)M+6xW= zCKJ%eJ;OAHvuZy%gqXHKdDqmKIE9%QriX_zX)+#~-WbYc&VLmw2Wn1QGDoPIo% z$+iA2SP&FkmW+x_AK*MUPDLgb&?)Q;$2hgseL0nw1i`#E1`~BRP9-KSFt3HdMm?BQ znaL8$b5oDvRAq99@_f~!IMtZKpuBK(OGb636fo}?2dLwv&UBz2$_4ej)R`1O$GkH@ zdS2>G6;K|i=cU2)1j+;Tyfm0>KnK7x9OF38Ex@SBv;xX|#4XCG$;1FU44&Z_hd7S_ zqZU&Rl&8ZZ%BaP31j+;T*tD4pW`oPHV;rC^n>JGi=+tOf%+zDoBQ79F08ej0Q|UppxA@+>8cH0ieT>7>;plOdO!)D-6dtKwU&5CeYpW3=GFOKwU&5rZZ4EP#4jdNe6UJJ;N~$P#4jdsRhad zbrDUNo-Bk^&>WyXq6w1?=m>j;V;rD9qAAlHC{Kh}n$eW$3zVnK`XFYCv3uV;m*C+>Dk?SD?H`-q#FPOeWxox?>zuc%>Pwn0lbR<-F{S)=Y1pysf<4 zjMhvppkwnHj&XqcvNlXhpgd4t)`sa1ly{$(oza#l26Ui4L;W$1@4VcMwoF^V++!U4 zeC&*NOd=~mwb?Na4L)v0JEj~c&ykOv(VpoHl$XHA&1lc00y=k};TT6fA3LK1Qwx+g zjgOnrf$0vEx0a8c(UHk!HN?!reB6wVOj97ddXAfX?2JxKUm#qL=X~6ZPE0F{$ix-jj5@;v$38C{uV)iO9j-I%Vxcysx=8Qqw4K!^P^9OKx{ufXWeGy}>z!LQEf&h!Dw1C76U zF!_M40bn==9)Iy*S^(yON{=i~52gbU9!IIVG?ORO9SDzsSscXU09_Zr02vC0pQx?=!bo@TQ6 zF=c{zkO6@}rV=o(jboeodxk)!8VCfOfsN*5x{=B#t_DI0>WdMqOq7Woaq4QN(6>BhAA3rIm4M2 zfG$7)^LBAYFx>!McL3%c;f!GV1Le)rxX2mFBmuhmfT4|HxyB97D5gRvZ;Qr7&iWXp zIZ*BajcW|COd_CL5g6JS&T6=_#xYHU^Q>7Dn07#Uw=^DcCNU*|?n{8iXe!eg&}9h> zZ5*JAJ(cMuln1KVQ<d%wP(K^8RT2;LKnuhw}I}|8izB)j@gcnv7hTOl?q}y(Sx17E>>j z7p%#{mBlm_%1hV$%bCqoKL^Tf&}8JwW?BN}&D8wMnZvXi%3G(&$d$vi12Xl znagAXy8MBmh2gN~HHLhq4~Icnt&!oRrZ86llLF|X2Zlz5o0@E_g-jk$-V04Bt|F!> zP~HzsC9V>tGxbm|kCr-DDH9LqMhJ#R1_do8u5u;^C{IUAovVVW0?M<{y2x3@^a;#+ z#u%oh%T>+90ysbZ^{B%wS|4O`8m0p)?lHmjL@pe=fE%~it` z1C<2TTs2G$P#&oIt!3(k@<7#ZEz@i$4^;iuF|B~|K-F&@(>5p%RQ=X79ftBi)o(r1 zMJNwc{WdV&I|i-)K-F&p(;KKHsQPVW`U&NMs^3N?_T!)chE%^zOd?PosQPVUQiAe8 zwP-Vw0h9--MVpyIpgd6Z+rpFr<$@=nmP#&m; zoyK$x%Bu%evD29zL%ED|hiNB-2d-l0Fr5JN z+BoKFnKI5{`T^yw*RtW7!=wSaz=h!$gSDU=<6I^a(Df}0Z45T@j$HGZ4uE-(A=dd! zC%`;NKV&}BcQ6lBZP!O~&1Vt@UGoC2a<~~6GReYu&sY~R8G?C`!NMg>u3%mphp{$0 z;|eBUD9={=DZ>h;P$&TR0Z&foE2?F+I8g zDt15t#m%^l={1~Z$+(^AGo07SwVmlNmPYq zI?MC{%InZ!WjV{_aUY^|I+!;P%mc+FC-+&VYY-mCVsS&}b4>T3yba>!%;%V%fq9VX z^BfcCDsE8c3e*Qa$7J&WWM&(KxtImhIi{%(z}?3-@POEPru9%sW^sP*3rq*0yxro` zOqZC>L3u~PyxUM7hd4j?C8qBX9(Y{%3KQc)uoV&|oZO7pn7H6P4d&}iB5)ov(@iFY zhmh(MJcE3TX)ah2GBA9H=^&H`8W_IEbOXu*4GceE5_tr(B9rAYQw^ARi~}@A{)}lK znAgU^t}D*{jOhe~#~`dL!~Kkj<1ttt1B0Y0_e&KQ;Kj1l)&ri3RTw?RsnA4~_JJkaFCFD8YjAUQ|@^P4FI%mX?5 z8pCg<<8Yo6_aCMQ5FU8Fz&|FDXCQrT9J_VBxc@WBKzS#1O&R|)sepO)Z5%gsUo-q? z(gAZphFUWIXR?R$;<*1a#lU%)+ziZ>5FU6sn~}K%!ejWW8^_JaJQdC>;AUc82IpmR zGc)f1^Nukx>Q!;GFdIGxJFT99QLmAkjoA;vW#H3m=VoV)2J@bAis_j$vNOkld2Jl3 zU|u4a_l(n2ua}#hIUmZi)0@oA!CVL7G5*zU<#9%aTMv9G72&KL3youZfru#fneSzznfE_AC<2 zIbhy2hU0p7xFwlYUxDO6y!uz%vdji>?ssklW*aaMR1vWAC^653^Z0pGm{)*#Z5$W$ zM0r%1H$Zte_3p5#GJ}i+EzbZIud2*Dz;e?VUg=5ks50Mz@_y(YVOL{*4CS%tE7tR< zGrxgy1@tv|G?;&Yc`e}SY)xjD*C1m-zGvsrV*Uc*arASpW6)vtegl@{$deW2(P0jT z@@n)!yl5zIihe1J4s!;S=gsw=L5H~j%3G}el%ZaSxdO`Fq5qUYhq(dFI|d$^)nV3s z3${X{gfoj%huH?g0}l`AGUq^e;NbyX<|R-b$oIO;3h%)B7&yeGnRJ;mpghp%fG+b9 zC=WC`pjXdq@*boVGCW|wyambw4G$PHANT;0gEV@KnD2mjps<+3X~g{bBS;R!yT)L` z%r@(p7SnZfsfO(MO*@1ZvnAZlb z0bH1mKzX29QWxg4U>+okx-wq{^B|?HEAzcC;Q9|Tt?kbI9xMs6-jdOSS>h|m-5_2P zj|Vf)H!zPw$1sz}lUW4H^EAxo@nn{P^70Hzc|4g_AUuW+!)hK+<{41l9K%K)FXk;! z-bTX?9&cvx@8J5cjp3+aKaVf7<#(_Z47Uuq8U2|CrA#|=|0U9&Mf~E zT>n7|ns8<$-$L;mo#B9;nwH&g=u_frg7CmU2jk zFN5+xo$g5H15h5Q(;db91jGY%A3?qDC}xgdAh#Xk0QIb+nN6TPP{%r&IRVN8^~htG zTcA8pk35EX1(XNsbjLDZf$~6|?pS8fK@Fg`52#}u$E@=kVgsmS9mgC2=G7nL0QIcn znQOpY$iQ|y^8zRj)Ui%rUJK=cI@Sryd!Rhf*mWXv#UF^FppJDS^A0Ev)Ui%tX88+| z1C3oLF}px{ppJDi^9Bg79z1rP%=`hu1&>{)Fvt9ZXasevQ<&#Kd7zGUD)S#G57ei;r!l{P@<1KyH0Bb}`N#~%I6xiibmkdQ9;joT&b$Z8s|Sr;XD~m2azQ=o z3}zNa&;kfZ$2ya_0LlZ6U1u_bmM4RP6x6ZKV!i^E19hykn14Wdpt0+0W>zMMDWHyZ zHnRwn2kKboFk3)*-|Km~8FQFppj=STI+wWt$^(sE=Q1yW@<1KyJmwQn9;joT$NUD$ z19hzPnFW|37J@p~`OGFz9;jnoz#IYPfjZU&%r#KnO}=_|#zN)=P%fxvUC4X{$^&(t zi_A21J82(j~&F+X7ksRZ#X87r8LIlw#) zP!_FV_JZ<2S+s&V3CfE$VrQ&mu7vW^jJO#qnI}SdplGVEVqO8|g5s%)`2ds$>bq1k zUx)HQQ^wWI@1ZASr3_rYGw|A@<5rnnYq3a$_3@-7Upg!50sl*nCC%xpd8!EyaCGl%_Gg& z%6u5g0}X|>F<*u9KpD1;`30BA4KC$qt^_*%x+NLB{0tq$^)$k>}3vv@?L=D;-I`FE|9)7DDMYY zE)U9^1C}e}tA|*zP!XiG4l217%xi=4Kx@f+nOA^$jo>)!W!?bh9b@>e#>v^sY|jre zNrP_mrNTnpw+WAHKl$uXIE0+=_EA>3GycM9`U2oF5|F_rlT znAZjl->J;if*{9$c$qBIn0E;>g6dz;EQ&PKOy*-?Nl1@=Ci7V+59FAc%om_Mko7Z} z|3Z17Zu(4SRw0m~&p1Kd^qI`OU>?MZnaoCD9%N!>4zm@Q2a@AvoWtx4;?*;NxR#7_ znY}?=Ft3wqE^{cD2Wo^*;F`}I59UEsE@ZBS^R6*0WZnVcF&r^gb}{4xVMqIwByI^=%AKjJX+CFh_v7py{piEGwBqL_v~m93PBd zGpu6X0OkERW@lW*yaUXGOdPCYz90rt32IWP^R8xo4(35x6swv4fq9S?#cF0oagfSm z;NogEvjBuw4_>6an%M-x1&`yeVRnJ?KuwA@%o$J~C~vQ2E`{JWtNnL1RJP;+QzH~<$(&QZOkT69;msoow)$Y12s3cGdDna zpu%eh^HC@dRCw)RegfsO^47m**vT9(1+fBDdhKK`fbu}ija|%Jp*&D?V;A!kC=b-! z*v;%O4bcZ`ZtP}`h4MhnjXlgcP#&ncv4?pAlm}{U>}6g6<(2Sq*E8;AJ_6-}#_{(t z|A+EG&5eD`yfP3gK+TQ)%ra0OsJXG9*#XJ})nf;k1E4%mHFkix1j++7Hx4qlKzX2X z{DaIZpgd4(qy7-{4k#DY+&IL12g(CAHx4tuf$~7jjl;|WvJl6Bnj1%$6`(v&bK?lJ z3zP?HZX9I}f$~7jjibyJP#$O;{}^)zlm}{U9IIzu1LcCo@sBg_f$~7(_{W(aKzX31 z$O+~TP#&l$a)Ma|bP6hT9RDP<3X}(GikxKjfbu|1kyFeOP#&l$a*DYI$^$h;PBYgZ zfpS4p<)@i>Ga#r@(m{%;%Y3zOGX=G3^G3LF-Y@-6^ap;&7vff}WgzzLvIK6pqFn54?AZK4=xW)Vv!s7td zl((4~RiX7?srqY%+svG*AY>vehTHKna<*U#QYY*V<5T0pis&fEMJR z=Y7q55X1%7f0m4In9qQD5RGq`3-m$8OlJ6O`h@ol^9C?)8p99M7rbwn84W;k(>NH- z-toR=<^c0Rv2DrtmRSJKW9NIzEDz_2GQMLr0Q2fWO8NNSGq-@bAf5!@N9GA&9%z6} zp6?Sgiy_Dgkengk7v?1p9(X?ME3=3ZSdIfUpY@eF#1zb9ur)L1`^H=W=XvmbXKt{7 z$%XO#U|s{^)ib!8v9bPQjg7I?s{xWyKc@=yNEXScde=}EBW|j|d z-d1*27GrCOzHqZ^4D2j!P+p>$B_jt*43w8+*38Gj(g5Yvmz#C+aj{s~fHXETG?`7{ z<7N2*<@KA*;NxdmVGEL*%&@?00iPg?s2zw0s_$3w39+byd64>Eh{Y1jgVgszEDlf} zsJSl0k__d6n(IO=g;3tcdTs$mVU{{57gVPUv-CiDpn6+`WhRsds<%a0mP2`RjeG# z2`CR##mckjxI$EdI`r}^Hc%d@hE-tM0Of&d*m?z)8&EE&idAH>af4_CRk4aJK2RR0 zidACS0Of(ISS6NyP#&lSrOa{~$^*5alv!>6; z5DP&~C{-2#C=b+3Qe!cO@<7WS)L2}gJkYR{I!ii~2Wlg#vy?)4p!!~er5(xx)%O}K zv!FaseXq%~2Fe3f_nIvA`=MM=eXqrG5y}JA_gXAZpgd50ug&re$^+H++AN$N5NCtx zdmR>OC=XQM>#*oSd7%1Um&F0f1J(DsEWuD7sJho+-Js7a8hw?!6y#dQ1C=XQM8?s!1@<8>yAGA|&2kUQ15N7Lvb^yE*ME@h9`-CM-XQBi7G7g;VlnUm^S~>#omo7fJkSbl zXO_889%zNO3(Ha{541qrg=HO-2U^GF%CZB>E0ylzaAo1~g_sFipzX#Y;tQ?+mP<=B zy0OSYB|$5+-C0~9Jn%e#JIf3(4^kbuv#bR3Kn{)Ma%Z^==W#Q7vfPF9p0Rqdd<63# z!_+=3tbP#dL5mLpSa?A^(Eg6+W=|OcSVTcwhBl6GX4e=3SQNlK(A?lIzCe}*U>;=D zI)vp3ln0s{3}aF82N?>P8w_WO1@k~oJIWW%(hcXSb49Vtg7df;V_24edEol*8EY)d zVK5is(s-6fU>;<{K{CrLC=ayZAerSeln2^ykisGt0J6S~1GM2Fg+(381ND&TB@JM5(DAYbAZ z^B`f7#}X0*l7kH37qA=v^B`eS$npuy1BJy?zCsqIV30}>?=4>`OB|F}U&8sFuaadN zlv~32pRbnXES$&A-^jum0@KLP-^$_w=ZW)ovQ&e4pitY&)yuL0%xmMYFn`a`$Fc*; z^8@n^KzX3m4t*>qpggmBu033REEm9Bi0}JYm_or8f|on=v2a0opydvIEHY3YXthHh zO9+$)TJ6xs(gEdxRy*{u?1l2;%|&_oSWZBBpedO?mMdW(8$ez7`a@iOEX%?{Tu^J) zlChs<1DFRH+v#WVjsVF)#&#yMj0OmF_d{;B)pToiv15ygf>2q1;#esMr3oRMvvMhu1p0Unl*#_ZpfVNW2XW0kl zfr9iI>wK0MU>;~ClMDYs7LIt3DUg*+3t0rfJdl~}JPYet+TdJE#>Fi2AUyEo`eK$1 zU>;-`buo)Z0?3#)@chtXmJ>-39%z1O3CkNO4>TjRl!YT1A_tl+TE@`uSik$TgOXD_9P|d2={duqdQ}jR6mytzr>R1@k!cEln9$vlu{mj+QoD zt65SYJceM)1pYNF7ofa6nFRjzEDmX4eGI{t>Rg*xDxkbP8Fj8LEIaC<++fQNo^31^ z=@6xPG95fSSf)UEF_!84yI43t*NZT;F{D`L@$Y5{fbw!Ixf%DctcLQ+Elc_LvYdeO zKxus+OHC%o%ogyf*L^G|Sr8s*)$0M46T%yJCM12xGnv)qF6Kuz*1EHA*k`ePiRHu)8nKVU9o_3Bj?u6&5QK~3_jEOJmD zs7Zc}MF+|QHOa5BI6!%zCi!(1UnmdMB)`rQ4dsEFn zC4>v!Aaavs2b2eDlHX!E3gv;Ch+u@9Kr*)f}gXbKzX1Qs?S-zfO(MG;U&x2Vvs&i*?EoOCCd#s z?=HhD7Qs@m97mqPYlb&0l2D$W)q93FEQ(N`rPcd-hBqvlP_CQRQ-(JzhEQIF6-c8c zl$QqPIYN0=V4f$G*9YbWLV0t+yhtz)QZ>I}Nrdu1Rr4E`OehaDUR3{vB?rm{&GWor zDS`4pEx0!mZxAIWWwYt%LgzIqVX$BK{v<> z5N|8{50)!n9%R+uFBXL!upEcG^;3plEE-TAsIm2n#Q?$sZ=LzY5(?*8GX7<$F9LHR z7XD?a0`ovtOymE{vJlSWX8g}`5YBtX%E0;n%mcOj64;nn|ATpu_A(nQdoRQ>p!PBw zs{oV-YA>_1T0?oD_A)!GOFfheY7}#@`apT0HZcclD3}Ln6>_pBfO()c@jQM`))!D- ztLjRA9@Yf#i3LZ%XEpG#?tt<@{R073j((71AZ=nnRueD}l82#5;C%^ z91}s-gFRM0n!NS zkmT`uv$lYFZ5)?v*cp9Td!W4AHcuIRSm#4|pwr@fSeHY2W?V@EKCJ7ZJa@$m0Uy>K zP~KA;Q$}Cb15jT5CmS0sU)GaQE~p0ZV`W_lvL2GW{8+WXyf%jaHUf-(tUgd4sB!7X z8nFtb64dIy%izZvu^Pk!wfge~0$3BkJV>iQfHecm1BHwwV*qOfj91UuAP~U%1;*vP z#t_6BvIb%d$ckXlK@_sdqkj`^#GLjSN9r24eKj7Z?Zrw zE8jMVnQ>zG1nO8V;k;)84XpJEP%fL@TY)ClBXFJrQw!@kD390ft3WI32Pn@)<+ngP ztIc+Zp)M+~89G=!pgc)C2Eh*2X>i_qhECQ6P@a+wSTNmq(dMJ0jJeOb> z>+~HEL)Xg-3-+?Eg!7~Y`&oB_d5}ywf%OoW*T$e_rzALm^$MJ)EjWpF!A_7V(>QKO znF>y2JqP7IkunvW&Uy>VGqE!joXN_!3tazA<8ZJu6`alLx(lK)*v?dNE^8%}mt)LnSBJY4EIO?Sb-U+hqx^VLb!qDe|miy#eJdwJQ=_&+51b zV(3!4TER`M{%~Hq;1G&{f55!S42SHt2_9hGy%%CV=p?PftXIIii414$ z4hbG%U9k@&2RSq680!Hr57c5b=ReMR2E+rM9|$^1@&xM@5SQT@<0HEx0w-9N_JcHn zDw(r_Cs|FvJV+&TlGP2&d&US_*ME{V4a)ngThDQlwH?Zf(7P&ligg8)XDv8W;56%Y zD9>H*s^D4HqhMY=WVQY|)=OY6WVQY|)~iq+Xtn-1)*E2nGe*!3fOD)rp}aV;1p?<; zr4K+H8lZPe@FJ@wn0E}kap4lH4wMJlxNwP8AIt-7T(~cIiPaXutLL=STOe?mHQ@-z z7)Wt>m31wc2P*X}8LzT#h4U5&TxH!4=LxZ2XFUn$U1PYxdI`>(DR7hZ4xBex;5O?E zFmD=1i`_fHJFIL+LH14KsBf|RDtMQb56W$^`zv^lRR+vE#sS)Xai3Kl$^-f0KC23t z2XfjR&ikyp!92*c^h4G|P#&mb@sRZ>ln3fbJY+os<$=ZuAF^J7@}}48u(CX4y#wa9 zaTwX3W_!r`56W}32gwB-1Gy9uG7niZ!90-lnJf=k8{j;7rYEd3!8}Nh;3?~JC=b+P ze9C$V%xmMQvX^Fh#(EaY>$0zxXL`nZ2f~#o;biA|&T4!dWFg23X~vhV9uOYK4T(E! zuUG@1yk+(e*j}+lf_abz)oa#5Fb||pf%!FSBb>+0_?ERB&eLFi$2uF%W3FfVz`7L7 zg`C^+k##MU2U_*;k#z@z2VOk!k#)uikkcSjD<4^xLwTTW1)o{>fO%~U+wI>od|^Ee zFwY0dt9IHY#Ksm0Qk65fdldoNEx?Wv8=3+-w>*AiS4O zMNE8b6*nQg-%gf{0&FL4g6qGD4D8O=gap_=fF&UbN{H>v9gtE`KxMKBu^qSv=5cIs z;S?5S`vT=11@lzzL*zgM7@};pP+lF^X*N-|Kq&8)3y7BjmvCOHuqK<_V~~zE4l^z< zZf!PgC=ax~PMggF$^#v(rp@LG<$=~2X|wr5d7#vy%@zUSfw$~wv(13;z-5sR+s=9j z7re7YkL@6o2TE9aY^T6HNb#f3b_2`=X!^)@?GQF(JMavwl%dqML)eH-<~fAd>T1bo z%+>+nf!%G)7XAV($KmTH%45nF59LL;-C;9jONa7O-8h9!*-D_iGO%0?l-KQ6%3{ja z`2w6i+BoKbxznJMYr#tAL3yAR(57t5puC-KuNh3))(O9>j;H zZ2d1m4h8izy?IU9R)Be+FucZK&gSq6+&*dpFBY?4^LPbP+QtEjLkqS5C@;*!l+l7M z0?eDnkm){O*n+JN%!4FkE4JBS9>`EjMk}_JaNaXkE4IC09%PKghV3Gl2ieBtz;+YF z1C0-WV%vf335W~cExJpj?hfq9T29v?QQHy|78+c-dDJU(pPU~U_@4EJSIgz`Y8rZ1Zol-J_U z&gjSH0Od_|=VtU{^Mvw1rKUeyJd_72HT~H#puBnRPZ zUGf+<87L3bC68exWLp5`fo4jQ z*j7M!pqY{+wgV6zgSKG3C1Wxh*B6i#ko26)rUB-Gf-Q?FnN960NDk5hOl3=h@<1)X zRJI%_4;1&QYzv?~&_4K7wmVQBXz61r+Y=}cwDd8R?G2a*I+XKtJzFZA-n+8PeDuKzJPIJl->8u)Tot?s&Xr z$YA>b<#j57KCz!WU{4!d7$nqk4RQMTLF~&M2bfw zhpiUO1NktMC68?pn0E|ZI~205g7QG+MIqZ}Fb|@#i0w3-XUtm4_6*E}48fPPeFXC$ zrj)b&gz`Y9l(W?fv4Gvi0UDsLVAFx}Km*hjY%X9Pxt zUVwR!T5TR%11HGPHU?0&J&$byln1J|=d-ys$q{K~SB zt%8dQv_A&231tae3q%rJKrUnR;RY)OpT570?E;hsI&XhDn+y*`4s_oB3bsQ~9_YON zm23>W5IN9!`>WV;pu9X88TO#pGhC+vHPY-ID` zhZvJ5C3lIRS1ke6#XWIehK@#FFwqIZ#=&Xn+kzH&o zf?$>4vm$n}xqx}~pdB%)+Z1Qj}H{)kE4LDDO`3sv7oX5=cjm;X&gLLJ;v$;Tc z;LiJZwiY>%6_C#RcQ$Q#2oKbG|H&2s=0R3T{$hIqd0K>#-C7YO2Xg5<5mt5=IPa$j8~YmwkAX*oMU7w2eKDBV$nY`Ll98MJ37Geg@p;%fZf|Fhh;y?GKzLy5x!EP4JdpL=>=6(i*m`dE`cyC%Vm&u|3z*l)P#A8>$isdB%!63Z z!!EK5;d>r-87L2AJrBDB_%uU^^*rnz5FXfi9`*nz4`e+L`veFNY&{SA+iPVXoaEnapF z2oG#MFS`Mh2eO`*{RV^www{;$feEDlCsD#F#Lmn9A1v9(a4X7^k&j*46l7>4!)Gwh z9LfWQ3?F+7mDnJB^QhgE_eW_mC0f zHa>O*3y4xs!r)`q0P`Rr!^iFp<~1_xkG5pwXHSOmZh?6v;B|8k8UIC}=HX{Q0p)=l z!_R&J$^$uupPd7|itZt2U`($LKf6E@xc~PM>>7S{35X=vG5qW`5FR+7_}N>)JcwiX z*%yO(kVGoLz6Q#>8Dq&Pz}}Dz_5>ryLIHLY@OrR^oT;(wi~{U75FXe*0d^Mx zp*(Fc&jdWW_>eI$;iQ2O`xGb-@W5dq#2yIdK^!B*t^poie8||7sLm_Qo&x28EEHzXf$~5W3bRXqM;;-8 zFU+n0;eqWFX4io7>Oo0Qm^}l+1zRZ0UI6AnEEHz%2lF6-FT#EV%!61j!p?9G9Khgn zEk)QlpgfTEBJ2ksJaF8Lu%CeNz}AbfUx4zG^+PQgMc4(vqnnVx7h#tG^B~rXu$zN< zjSQSgmW-n8)8#fWDKXvhnl7<{DX9K|7Xt$$!>xfL>uF%|bFi5Z@~syG0~5m+F9rr? zhTmXu5St0gzU5Vq@I9+Hhz%l{7?f=hY&~rdn?@m2Pv^jw0DDpvOoF_mfjjOs!HPC> zf&x(AdwSm{Cb2LxZxGMU8x)*AV0nZHBLj#HA(oJAA85md?rh0=e>jY_IWS9q5vlL8%EM{atu#p|a$N(`K;UGo^NN|F@3{$xV>=cNa zm!KPgm>57p%uruKBtX`{G=SLHjE2P#$bYyk0L2{4{OJu_n8f%tfIZ@10Fv3@J$=I# zCb8)UwlJ}Q2qB&AVDInX1bKfSSY?_zNF_);GXtvZ^nY8JB0yzI#8xIfrX$|d9S$;y zO)t2@#8!U>to0@mc^~ZWr(h9eHY8C%)PvaAlI9z*E@Dgr1r`%SMkrVVh(n!_1BJ1G z%=8c2m}I6;*~X+|1j3}^K~K|>sS`m1eBN)`~cq?6NKwlnE5ar!`l_`x+Mq3LtB zGYRn_n}i$zYLL7H3Q#777vdoIr-O3>vW8n;)BkN}QsM)tWd^HaVG!||Zm^R{j6>cB zl4`VvHui zm*89kDZ(J-5-3)f7}C@kru!ab;uHx7Cz51vV1s-JimK@kb}{)FL7WCsjv9#&XJR9# z7o1`enLc4R6B`RFgT6PMtA-NQ5L-azg6sl?ET&n+co5<#P_kuW&X(3_I(=-pd0=!a*=w*_Mfck>MDa-7Eu&2}qhh3l_NoCP8c_28j4w zu+g8v;t=(amIkPLVPb&PN+9)&3?PyTT=_6FfMh|H54f@NOBm!=2njNji2;-y7*R;f zkf4ePy&Ef_gbu4XK@r5u#K7ST@;xZGF-|wU%p^H|!&xSw>3%nu*rtEj%fwU93zmnF z!eF+fFDP1+z-)*JL>5FcG03Qb%)?}B`-1YD5m*-qVaMn-{oZLNF%gh~j0^}86#vtg z?PJoYhd6-*Bf*VUs;Q5ru5n<~U@hwDEA}&KfU6s322j34&F`R8%EX|d4GLFi(LJ5# z022=fC=oLq;-4CugAfZ7nd-{w6OeXc3-k_ZO zl9P!6)apWJgAxQW1qUca!io$~f`runfMH@to9=y(Nl+vPoXQ}L zWDuK)A=rC*!9gY&BVtNTNQkQHLPNCSDw9+_tm@4M2UjVWY{W~pfrGajtOmpeMFl7b zK+(bk?HEGDkx7Uwx(H)E!z8dlbHIi!0<)2=2WenpfLI1mxfZMv)N^2F*y0OnaPI@_ zLKkObK!`Ac>Kz6q22e|sk>LMK0hVjXrii zNO1}B6R09%Vz5vKu^}M@YJNgmw#*E?exR%@;RlliHx(I}p;`6}xbOvK9&k~3oXIo> z66_FC*$)&EAnO?!Kx{}pV1kY>cp88Vg@hKQ@dhFFz`8(r3sML|NG1kjzv=IeGs#T< zahyr3-V&_H1?(;ao0-8MO@xsFAq(ljsYO4o9|!^UQpOVf*wRN zF@V|$j11U%-aH_su(2-4$PK9D!U5?v_lrY>9-L)Tu?87}t^JG~YLJ%SHx*E#hV)s% zBGVhMGf6U8Lt;CC7=thkO;AKL6g;}a49ZUj&M}EG>3dIaxXPr2-q7MW&m>d79Gn0_ z2^rQlL(gT549Fsoq_`2R3t1eJPm95=3*?Z6Bua>zv9PtlZ5Ct+P;(Qt#D*C+{oHvb zLXD5LzSFrbFe#yoI_v-!Cy=3JNSX#UT_I5qX~4n;z(K(eVM9n#)Eoxao)^IZV+I;v zf@uaxAR7l^qmm#mGBQ9&kQ14(utC)}6GM?bC|QEokVZcfH1ppFTMQ$?bq1t90Qm`4 zLLfvS6)l8>I24%;Qx8l1AS+2?$1^Z8;L-p|3+N;h1H|nJaeN}vIW94o)PpKTMg|FQ zPy^=&xX@4 zMF>O$LL!SpyatLoSRW0(Y=~}9 zK*74VAT}s)K(!U5g$M~QP$0ls50J(g#4Vt@1y(dbx(5(lpeYzehLCy(kU_Bypm0YR z4e<^mgBUn8Ar?TKf=PlL%?O@X0`=-aC7C=}7os1IDhrz3K!|XIECy*{Vo;ync#TOM zJcE%0N%f$ia~1}DuyGDx5;QCa8?*z3G9>MzmfhIJS-}H)Z191-={K%0$%H|A>mV<{ z!U*C)WDyUr%@7h<9J4hJaxW8uk3YETCp?tiaFt2J4&qZ#yBu}w2I3A(5?t#rz^V*z zmw5W0t4u=Bgaqmkl7NgS!+5nYcmIQQ&E) z4cC}>Q0gn#^ayD3gahV)>A$WqS&`Ss1o@eV0}?47{@{Ks2W-@8`h;yv8b*+Q4P=rC znGLZVQ~Zm23}uqOecZ@3pEWwEP;>$G9a~( zQBP0`fs7k7frl!Y!6t#4&LB0AxCPk&s{D~ert9xy5}&SclSxGiw_VdgjfHxowh26y zAWQDuaH76){gUW7*P=r6I zTM8+XV!>GnLV_F$8x?{CR9z^@q2!Xh3x@~Uu0O#AjhzpL6KoK!y$&% z42cY@87?xcVUS~3!=T8phT#yy8iquMH4GOS)-z-=u4hnWSkI8hxSk=AVLih|h7Al^ zj2jpf88$HFF>YW;WZ1xPkzpf)8pB2gMTU(G{}?thBr-C>gPw&Ah_^BfsVIBmE*8A~{MMI#wO%fb>NYQg$4!Dwr3C6o+Av(L9@6g zGOkdylQ_a)s;4A=kk8Q7gJ6rF zFqCi>a6bV%=nYu>4nu_AEbcd8**oB1xx=6>IGyPplT7`ipa+r<8U6%4m0ZaXY{w?G zl0hW+G@B+9D4q3sf9* zgFdbv3nj!LnzfD(o}*F?q}Qmds+ zz~-2M%`pL+vy%~&Btfyx&A5`G!jA2NoD1XOpy_(|nIsrprn}!~Qsyxfj{(~g!%b%^ zGxRW?3|(5!(F0zQ+QXO@9-`307#i-c(8CxT-m1{U_#^~Gf)+{kFoKqr%>n13IUsEu zOTfl00UNgjEWQLPemV3s!xBbbUl0je>$-&TN_dFE62`;f{t8PNPlvZEECHLmgb}nd zRBQ>@=rv#?)_{#z!+1G#`l1I+cJ+x&>*aYAIl$bsA;SdDJ4~P=WeX!HSIRKi>1m3~FoB9a875F(mthLil2ub-N)9wq(_sSTI31?T zHZI~SOrRoAhUtGqx|#`7m{yIsnhjHOAiuN?SOQeK@e0W>aYfEo+sVjgw?a*ZNhR`_ znhR5y)@?OLX4A+IYK+Wok<9AT=RIbU0p$mfPsBsOPAUOADFp0{5HLFjY-$MDj2f^R zEnxLN;24Mjhe!%oeG6D+3==4C^gz{syyn9Q%Go~P6B2sBYNjxO3X?e?HTB{pV566S zja~y15?=#WR00mKEnu<)Y{3?=Wm}j)w=`}6htU=$kOg~~LKNaPk1&NOlxu<#X{Y89 zrV`Gt0(+QBIG1al0h^G?a6R(8<{7X#G2rqp27E2$^c_!_c4PP51-$#TO=!=f5z4 zj)(XHHs=eIN$g4;7G_ZC%)$(k-BQm8DgjxTK^IlBFoV(<3o|Gbd6+@PEhtTY)8SzT zMLP>K$ipnmAmc>9vMkJ?qb_8aK_!d~GdTG$gW?`k!JO2c$ix!IrKiFiqL8S!lTk1( zQ%{8%6f`Q#(s5;aI$%fWFxP_&)d5>+0yfkHY?%(&bvj_nbimHiVFtN8JtAw18z=z|LREppbN7df;;=%}_QeP_U{QPXVVO5IKQs3Iiy6^)Q37*A%d}DPV0= z7(mf5g#nbWr+}L?Q^0lj9A;4BUjkM+kx@S>XZrc)OrimxnBD^p(j(x2+5>j^8L;9j zV8wgDF1rI}-vL{(2dWYjeNVuF&%y*s4J=IIA=^z}Fil{t_hztF(PLm>$Y!`@2BL$Z z{Ah+FV16=`U(N6a%r9nm45p14!oajOLo%3lW|(CLS`I&(;iM>NGx;NHAxRMZ%KEJY zh<;?v2<6WN^Iuu71<~~kudEM)7!0qhuS+~;Vqmz;bd5=wnStSzwTcvoeq?PXb(jUj zXOIEWkE~UpvFg&vU2NmFz zg=p-Pab^RFbI3txEhwE2rR$({FO;4OrTw6^J(zxFeM%Oj|CRMUF#X6{94h`vb|o7F z!)yi_v6J;+M!MKZc96g>v1AUA4^}Bd=zU=Nk@Y1g{TNCIfazD(EMWSPwFH#bgwhUB zItfabLFsld{mOcpGBYOw!(w(}m3n1P28L`7TNP(+ki`n>Ao`K@F);ng+5}2_fayop zF;Kb?N_Rl%Sx|Z%l;+Zam~$1%e+H$$LTM!pXCAP<^(xIgprAgY4WeIJcR=YmPN$=$q(cJ_vs?Kg0*l0w9Om8$jrEF#X878ce^k4hGYYtQSM+euHEIi2h~) z1_ook`acHE!VrPO!eAGvB#VF?6ln^gUs+3n=||R%P+H%VS(Jg{Fw-?AXDFQvrJJGj zV<^om22rOBrJbR4GL$|HqU)KiF+Bz`n65D~i$gT1s4y@{GhAa*QH9V8^g%w4kOGa1 z&1Ptj(li9|r>QWSg6J(e2P{Bzg0zYYM7;}?e&P+`gT|z0Gw{m0L_+up@gVgN6<87& z80tY5ElGk%oJ;~q+%#6ngz#OUbPJR|0;O59pz=`qNeP61q!vOyse{lAlR@S^P;Hq4 z;Xi@WDa#>zmK6;3V4ogY0TFOn4WUzZL+FIFAOj}o9=QtPw_JnJ4mUyKAN8Kxgz#G) zK5QWGqKebqY{A0ZKPOX$DECJd{p=()FO5 zzQ6`S1s*_Y2Pue#1Sq`#N*{pI4AKyJ1t<-=mJ4hSl+Pdom50&^P`Uw1AAr#HOb;Lo zCeV#oAOjp^AsQDz=>t%jK@K9W0HqV4bOV%L0HqH=X$EvmwNFf1_1i>6#5~2L#IwX}#Jk1kimwqrBz{5suJ~v1f8wDM zMG{jaG$hR=T_n9EgC)ZyVm<7+cSxR+ye#=v@~)N-ly zQd^`>O5K){mbR64mG+emk?xe9DZNqpi1aDx%hI=`-%5X${w3`#6DgA_lP4orFKa97 zEE^#kCz~o;EjwFwwd@hub#hzej>_GXW0JR&&zA3#pDVvwe!Ki}`K$6T<^RYtDex(X zD5xr!C^#u(DO4&WM4KE-K@a}}2M zYZYttYpvDVs$PubKhplH{ac$)M^nd0$5F>! zCqgGpr%Y$D&Mlp1I{$QpbR~7Qb&Yj{bt84Nb?bF6=-$wMr^})zrYEOosAr?+rst!V zr&q5xM{m8}LA}R%FZBfUrS%o{)%11r9rWu%^%M28^^5c?^*i*p>L1fTt$oQi1A7dqxB9mT|)h3%w&YMg!J!5*`^quK9Qxh{s zvw-c@Uzv7_)c+5SQ($0l3fs%gz)&CFiIvS59ijzOgUo&&Ggk*Dz9|-T(*VRA%lNx` zFmbNL#|AJqvKlCxF>L!5F6IQ8`gI(RY)lLrIh@&;7`Ah`vN192;&5kUVmQFz$;QNR zn8TZmiQzPdFB=oXISzj|CWfmVfox0+H#maXm>BMIgt9R)Jm3gtV`6y55y{5H@RB2% zjfvp{M=To?!)K0oHYSE29Eog948J*&*_ap@IaAq~7+5&d*%TONF*7q*F&Isstj_FT z|Bzu7gNNWmhE)t+f{z(iG582tGp=Ir6Le%)#SkE9%ea~$OwgBcHA93TE5mArD8Y#g zs~KVh{TWv?#0gq6u4YIObYxh~kR)i!xP~E5(4TP)LzW;b!y1Mh!HEoO7%~KX8P_lr z2wF3)VJH%GWLU#cB52FFo}o(cEz^328bQ{2hV=|}f)g3mGc*XkXIjtDBxudJo}oq1 zkzqYUo1iV@28Jnu6B#xzOcG>e*uXGB@Ga8@hG~NDnKm%Y5VU68z%WbDkzoVF96?*g zjSMRUCo*hgSSHBIu#sVjpfS@%hE;;5OdA>22wF34WLPKY$gq)NgP<+rCWak?6B#x! z>=IOGuHVG4N6?ya6T?11M}|!d2Lx>yH#3|Qv}WAQa6*ukVKc)i!HEo;8O{jWGi_!# zCTPpFnc;$N9O)xFg8Qu#MrK;6#RP3=aeinYJ-J60~OA#_&YY zkzpIdGeKL%?F_F3r!sG6cq7Qlu$|$Z;6#S)3?Bs5nYUXpd=j)~+|KYt(2-#~!#6=& z#vKfQ1gA3ZVE8A<%CLihL1-ew4hAM6b>pQ*{LS}!Or zC2lRQE}rlI-_FTm@8W>m^ z8W!nqem{Xd{ke`-ToLa(=UX)*2z)+lDT9lm1P?A`bo?60?UzS=_UX)pq zI=!)iSwy-Zu_S{bF{!wuC^5MtGe3`^q_QBjm?60+HE}veC9?u=Vp>UR5kpaGK~7?F z>U7^qW(kg>)Z+Y{vecsKCRNNj_NjR(47rI#*{MYg1&Kwec_j>)c`2zC3?=ymE{P?H z48$@zIH(?3=-%W)NFWTusbBqrsgPWP)} z7Mq@1!z?9SkeHt8SDKrYTEviFl$oBHmzXpCb`7)c^n2yZ^3yqLnbWwE^9w2&GE-9X zN~WJ^U{;%6(8#PZeRdh$Z4%sP@~smUezMGQ%mC8>@%ndx~9xrr4F>7|(|(`}lV zC4=)4b5n~MQc{bPi!uv93X2)Q;aAL%n3CdFl$e{Dm+q8V!T@qeF+)XWUb;tWVoGWe zLs?Q$CX5NT!Y8x1gdsOIF>m^YR_0R9lKimLqT|~bnP0P$l1z89U zrDBHU(jsthCFT^RCZ<$|<`q}wC1<3jfCC@on*5|JhUARIyu8#L-~5zRhFlPll#`#F zT|B+Nj9GfRTRF4fbahZ*2$eI-PX7)PyI006IsGt*wW^F+aC%i4v+VS=dS)RRP~bY2 zloVwqm6oJ3xTGePrl)7-rGrc^o*q`toFnR3lwO*fnpfginv>&Nk(^opN)Xfklrx)5 zH?Lq;=Jd+X%wq^C%FLZUrGnX%D?PO&-Z?QZyeM<}#|maC@#55y_<;Q4Opq=H$D*Rd zN(Sfrg39SBmCXA%gHuZ&Nnm<>6|?E|8CA^k(=S&s>xg;gl^7c_fXoWXFG891p>MCwVu5Km<#?HEyW(Fp@CXP;)x)$cnM!F^@W@awVhL#p)2A0zss+o&;J&Qq( z_AheHEhwp+u3p2e!S4%7*}j>14545vrU!H}OHW@>!z|9@n358dn3tZ);G0-6y{wkG zak^a{v%>TRZOqcsRqL1~r(4uB%TLd$V>S}8vCD~%&&+6`6reCjPmgBXt%Z-nB1EtQKN@I|u%JdCw%-qwJ>zQq)7u7Rs>OgdYJ?RXIbR-eq z#Jt4x)D(z_XUg<#^~|cwW(kHMlQgEYH8A@sn={yyq}iFq$6GMi*qO)2mlq`#STZ2n zn+Q@3wwHDK#0F*w{gebl1{<)RRG8*8gl0nn6y1h~)895QH?x64%FJZ?{zhgAOXvLD zu*~Ajq?}Ylq6x`&0_7xd)OzNXCFW$N_!p!WC4yockzg8|nANB6ZDLNF9@xb!H9fMK zSy(hx*N{O)B{#JsBR|EU!py+Hz#=hqdSf%QA!F+F&CSe8(;qZ5e^fyPq#44o<|uBp zfcuntdR_~&$aM8qX0iGd1{*u$_;^qbgs{Ll%_b?o0u*ei3^pK{cqliG!3HD^VrHC3TtQr z1En>Dt(FXqDJdbD$=SsW`33R8rAhD#15_Xcmn0UIFfcG|f84{oS5r&Uk->+-i6NB1 zmqCHSks*j7gu#;`m?4CLLC}@Kk0F@BmBE+6iNS}#b^5$*%xk76Y-g4f4q*slaAa_1 z@MZ{M@Mj2NaAfe=Ubdats#L(n;r%C;X*<2z54oh>k!<7Ken5wXSCpMifss+LVdeC* zjx1Xk_ik@;V##ByKg%f0z#%HwaF$W1F@;5eL6|{+omsGnN2oCcCd$vwBGj0|#|PsJ zg88z1vTzYTc4nc*6i$Q!W?7+z2}njj6fnUQ@Uk;OC8y`Ru$Zyl=2DQ?4m-EOngFxoD9r-LJd!+|8rrHH+UOB9e$9>Lma{4oCkMBvP%NXUU?Ygl4y8fC#mEM76DNlv zJ0}xVSg>IUhfw1ep~f#9957wmKfAN&u+*Pr6l%C4%+4aza6zcyicrG^khLH&h({%$ z9+lvO#DN4vT7s9IMMwe`0TSHoOhPajP~1o$q5`6l6B-i|Ae$sWQ31lDf(?9U8HFTx z*qMbSz)>-MjSq`9qviA)J}g!qAg493YA^^jG_W!-2sJvgvNH-bt$?PDh6WaPCMFIx zkbi_3nAwCGSTq=f8Q4XIn$|E1GjOsqLRn1HV|-Z(8J|u+=gT6d12$B!;Ru@oqfnzK zABO@nnBtIR=jPxLYHER^h6bTV&*=hwELVlVIt196g&JN6H8g?LGc1 z35=Yc93Wc-8_rJu8o+XgB~z&3>GrFEES!ukxlF&DZct!n=Ykmu&J;eJf(=UqLqS@nKMrL{49M^j*P9-Cx@|wbFi=pH6^erFiigx#-hvzj?z8sqC&EaLXBUxD~GdiGHHN9 z{0}%!e_xac5*-rz z`DA6-A&$Nt#nPt_GJFX{C%aJN5~z_&*w~pkgc_Hyun9FT0lBDg3DiYXqFGXS&N8xc zu`_eBf>cjuiD5a)cz61#7?vX-zc*@t{5~y~MS*eR^zE@MI-n455&(z89ca>S5}5uy zmSv6%s6YTEZy^^cb~d5L6GARRjS)hP5nyxI$FXEEo}Dfc&myOJmQkn)R211V3N>o5 zvNLfC=0c5X)BvU2Mh&5+60olLcot1@kf$_6K}LSz6l&Dq5^7=rOU{pH=?42)Lok;c zoJ_!lh6*<*N|_*RS$0-115}uRgqKGqurM-uPLE1tdB=Emx@QuLCF9xY%}FeM+&qj7 z>>-KiKAB0%)BTfKET^j{vuI5hOlA>d=U`+2ok2Ezax#l9XlMJfyWXHq6G+U9fq`L9 zISa#{bQXr7V3*)h{!6!IRPXq$m($BGEuDIplYxQ3*(xSHzbHGVBr!cFGfB5NBeAF; zCO;`FCMY#0HL*AqMMAG2C5eH7!JvW#WCa-ef!GRQCIiFto5?Kv+zucih{*QW$t;)I XxAPUS{NiUyu-Gox!1A7dq5(SqH)9|T delta 95674 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⁢;zj=uBB1sn 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 QBw(^#uz}@0|3m|J01Ph|$N&HU