diff --git a/+TableBlock/set_code.m b/+TableBlock/set_code.m index 01bea75a6b639c29d89048be715ab48c64df690d..ced61ca66e2e3312c48962190ff831fc68df7295 100644 --- a/+TableBlock/set_code.m +++ b/+TableBlock/set_code.m @@ -143,6 +143,8 @@ for i=1:size(outports,1) for j=1:size(out_handles,1) if strcmp(get_param(outports(i),'Name'),get_param(out_handles(j),'Name')) + % Set the port number so the ports line up properly. + %set_param(outports(i), 'Port', get_param(out_handles(j), 'Port')); found = 1; end end @@ -174,6 +176,10 @@ for j = 1:size(out_handles,1) add_block('simulink/Sinks/Out1',new_port); new_port_num = sprintf('%s/1',get_param(out_handles(j),'Name')); dest_port = sprintf('%s/%d','code',j); + + % Set the port number so the ports line up properly. + %set_param(new_port, 'Port', get_param(out_handles(j), 'Port')); + try add_line(getfullname(block_handle),dest_port,new_port_num); end diff --git a/@FindJavaObjects/findjobj.m b/@FindJavaObjects/findjobj.m new file mode 100644 index 0000000000000000000000000000000000000000..86fdd993197b3337538ce6889129c063ef4d7e9c --- /dev/null +++ b/@FindJavaObjects/findjobj.m @@ -0,0 +1,3460 @@ +function [handles,levels,parentIdx,listing] = findjobj(container,varargin) %#ok<*CTCH,*ASGLU,*MSNU,*NASGU> +disp("Number of input arguments: " + nargin) +celldisp(varargin) +%findjobj Find java objects contained within a specified java container or Matlab GUI handle +% +% Syntax: +% [handles, levels, parentIds, listing] = findjobj(container, 'PropName',PropValue(s), ...) +% +% Input parameters: +% container - optional handle to java container uipanel or figure. If unsupplied then current figure will be used +% 'PropName',PropValue - optional list of property pairs (case insensitive). PropName may also be named -PropName +% 'position' - filter results based on those elements that contain the specified X,Y position or a java element +% Note: specify a Matlab position (X,Y = pixels from bottom left corner), not a java one +% 'size' - filter results based on those elements that have the specified W,H (in pixels) +% 'class' - filter results based on those elements that contain the substring (or java class) PropValue +% Note1: filtering is case insensitive and relies on regexp, so you can pass wildcards etc. +% Note2: '-class' is an undocumented findobj PropName, but only works on Matlab (not java) classes +% 'property' - filter results based on those elements that possess the specified case-insensitive property string +% Note1: passing a property value is possible if the argument following 'property' is a cell in the +% format of {'propName','propValue'}. Example: FINDJOBJ(...,'property',{'Text','click me'}) +% Note2: partial property names (e.g. 'Tex') are accepted, as long as they're not ambiguous +% 'depth' - filter results based on specified depth. 0=top-level, Inf=all levels (default=Inf) +% 'flat' - same as specifying: 'depth',0 +% 'not' - negates the following filter: 'not','class','c' returns all elements EXCEPT those with class 'c' +% 'persist' - persist figure components information, allowing much faster results for subsequent invocations +% 'nomenu' - skip menu processing, for "lean" list of handles & much faster processing; +% This option is the default for HG containers but not for figure, Java or no container +% 'print' - display all java elements in a hierarchical list, indented appropriately +% Note1: optional PropValue of element index or handle to java container +% Note2: normally this option would be placed last, after all filtering is complete. Placing this +% option before some filters enables debug print-outs of interim filtering results. +% Note3: output is to the Matlab command window unless the 'listing' (4th) output arg is requested +% 'list' - same as 'print' +% 'debug' - list found component positions in the Command Window +% +% Output parameters: +% handles - list of handles to java elements +% levels - list of corresponding hierarchy level of the java elements (top=0) +% parentIds - list of indexes (in unfiltered handles) of the parent container of the corresponding java element +% listing - results of 'print'/'list' options (empty if these options were not specified) +% +% Note: If no output parameter is specified, then an interactive window will be displayed with a +% ^^^^ tree view of all container components, their properties and callbacks. +% +% Examples: +% findjobj; % display list of all javaelements of currrent figure in an interactive GUI +% handles = findjobj; % get list of all java elements of current figure (inc. menus, toolbars etc.) +% findjobj('print'); % list all java elements in current figure +% findjobj('print',6); % list all java elements in current figure, contained within its 6th element +% handles = findjobj(hButton); % hButton is a matlab button +% handles = findjobj(gcf,'position',getpixelposition(hButton,1)); % same as above but also return hButton's panel +% handles = findjobj(hButton,'persist'); % same as above, persist info for future reuse +% handles = findjobj('class','pushbutton'); % get all pushbuttons in current figure +% handles = findjobj('class','pushbutton','position',123,456); % get all pushbuttons at the specified position +% handles = findjobj(gcf,'class','pushbutton','size',23,15); % get all pushbuttons with the specified size +% handles = findjobj('property','Text','not','class','button'); % get all non-button elements with 'text' property +% handles = findjobj('-property',{'Text','click me'}); % get all elements with 'text' property = 'click me' +% +% Sample usage: +% hButton = uicontrol('string','click me'); +% jButton = findjobj(hButton,'nomenu'); +% % or: jButton = findjobj('property',{'Text','click me'}); +% jButton.setFlyOverAppearance(1); +% jButton.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.HAND_CURSOR)); +% set(jButton,'FocusGainedCallback',@myMatlabFunction); % some 30 callback points available... +% jButton.get; % list all changeable properties... +% +% hEditbox = uicontrol('style','edit'); +% jEditbox = findjobj(hEditbox,'nomenu'); +% jEditbox.setCaretColor(java.awt.Color.red); +% jEditbox.KeyTypedCallback = @myCallbackFunc; % many more callbacks where this came from... +% jEdit.requestFocus; +% +% Technical explanation & details: +% http://undocumentedmatlab.com/blog/findjobj/ +% http://undocumentedmatlab.com/blog/findjobj-gui-display-container-hierarchy/ +% +% Known issues/limitations: +% - Cannot currently process multiple container objects - just one at a time +% - Initial processing is a bit slow when the figure is laden with many UI components (so better use 'persist') +% - Passing a simple container Matlab handle is currently filtered by its position+size: should find a better way to do this +% - Matlab uipanels are not implemented as simple java panels, and so they can't be found using this utility +% - Labels have a write-only text property in java, so they can't be found using the 'property',{'Text','string'} notation +% +% Warning: +% This code heavily relies on undocumented and unsupported Matlab functionality. +% It works on Matlab 7+, but use at your own risk! +% +% Bugs and suggestions: +% Please send to Yair Altman (altmany at gmail dot com) +% +% Change log: +% 2019-07-03: Additional fix for R2018b; added separate findjobj_fast utility +% 2018-09-21: Fix for R2018b suggested by Eddie (FEX); speedup suggested by Martin Lehmann (FEX); alert if trying to use with uifigure +% 2017-04-13: Fixed two edge-cases (one suggested by H. Koch) +% 2016-04-19: Fixed edge-cases in old Matlab release; slightly improved performance even further +% 2016-04-14: Improved performance for the most common use-case (single input/output): improved code + allow inspecting groot +% 2016-04-11: Improved performance for the most common use-case (single input/output) +% 2015-01-12: Differentiate between overlapping controls (for example in different tabs); fixed case of docked figure +% 2014-10-20: Additional fixes for R2014a, R2014b +% 2014-10-13: Fixes for R2014b +% 2014-01-04: Minor fix for R2014a; check for newer FEX version up to twice a day only +% 2013-12-29: Only check for newer FEX version in non-deployed mode; handled case of invisible figure container +% 2013-10-08: Fixed minor edge case (retrieving multiple scroll-panes) +% 2013-06-30: Additional fixes for the upcoming HG2 +% 2013-05-15: Fix for the upcoming HG2 +% 2013-02-21: Fixed HG-Java warnings +% 2013-01-23: Fixed callbacks table grouping & editing bugs; added hidden properties to the properties tooltip; updated help section +% 2013-01-13: Improved callbacks table; fixed tree refresh failure; fixed: tree node-selection didn't update the props pane nor flash the selected component +% 2012-07-25: Fixes for R2012a as well as some older Matlab releases +% 2011-12-07: Fixed 'File is empty' messages in compiled apps +% 2011-11-22: Fix suggested by Ward +% 2011-02-01: Fixes for R2011a +% 2010-06-13: Fixes for R2010b; fixed download (m-file => zip-file) +% 2010-04-21: Minor fix to support combo-boxes (aka drop-down, popup-menu) on Windows +% 2010-03-17: Important release: Fixes for R2010a, debug listing, objects not found, component containers that should be ignored etc. +% 2010-02-04: Forced an EDT redraw before processing; warned if requested handle is invisible +% 2010-01-18: Found a way to display label text next to the relevant node name +% 2009-10-28: Fixed uitreenode warning +% 2009-10-27: Fixed auto-collapse of invisible container nodes; added dynamic tree tooltips & context-menu; minor fix to version-check display +% 2009-09-30: Fix for Matlab 7.0 as suggested by Oliver W; minor GUI fix (classname font) +% 2009-08-07: Fixed edge-case of missing JIDE tables +% 2009-05-24: Added support for future Matlab versions that will not support JavaFrame +% 2009-05-15: Added sanity checks for axes items +% 2009-04-28: Added 'debug' input arg; increased size tolerance 1px => 2px +% 2009-04-23: Fixed location of popupmenus (always 20px high despite what's reported by Matlab...); fixed uiinspect processing issues; added blog link; narrower action buttons +% 2009-04-09: Automatic 'nomenu' for uicontrol inputs; significant performance improvement +% 2009-03-31: Fixed position of some Java components; fixed properties tooltip; fixed node visibility indication +% 2009-02-26: Indicated components visibility (& auto-collapse non-visible containers); auto-highlight selected component; fixes in node icons, figure title & tree refresh; improved error handling; display FindJObj version update description if available +% 2009-02-24: Fixed update check; added dedicated labels icon +% 2009-02-18: Fixed compatibility with old Matlab versions +% 2009-02-08: Callbacks table fixes; use uiinspect if available; fix update check according to new FEX website +% 2008-12-17: R2008b compatibility +% 2008-09-10: Fixed minor bug as per Johnny Smith +% 2007-11-14: Fixed edge case problem with class properties tooltip; used existing object icon if available; added checkbox option to hide standard callbacks +% 2007-08-15: Fixed object naming relative property priorities; added sanity check for illegal container arg; enabled desktop (0) container; cleaned up warnings about special class objects +% 2007-08-03: Fixed minor tagging problems with a few Java sub-classes; displayed UIClassID if text/name/tag is unavailable +% 2007-06-15: Fixed problems finding HG components found by J. Wagberg +% 2007-05-22: Added 'nomenu' option for improved performance; fixed 'export handles' bug; fixed handle-finding/display bugs; "cleaner" error handling +% 2007-04-23: HTMLized classname tooltip; returned top-level figure Frame handle for figure container; fixed callbacks table; auto-checked newer version; fixed Matlab 7.2 compatibility issue; added HG objects tree +% 2007-04-19: Fixed edge case of missing figure; displayed tree hierarchy in interactive GUI if no output args; workaround for figure sub-menus invisible unless clicked +% 2007-04-04: Improved performance; returned full listing results in 4th output arg; enabled partial property names & property values; automatically filtered out container panels if children also returned; fixed finding sub-menu items +% 2007-03-20: First version posted on the MathWorks file exchange: http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=14317 +% +% See also: +% java, handle, findobj, findall, javaGetHandles, uiinspect (on the File Exchange) + +% License to use and modify this code is granted freely to all interested, as long as the original author is +% referenced and attributed as such. The original author maintains the right to be solely associated with this work. + +% Programmed and Copyright by Yair M. Altman: altmany(at)gmail.com +% $Revision: 1.52 $ $Date: 2019/07/03 19:09:23 $ + + % Ensure Java AWT is enabled + error(javachk('awt')); + + persistent pContainer pHandles pLevels pParentIdx pPositions + + try + % Initialize + handles = handle([]); + levels = []; + parentIdx = []; + positions = []; % Java positions start at the top-left corner + %sizes = []; + listing = ''; + hg_levels = []; + hg_handles = handle([]); % HG handles are double + hg_parentIdx = []; + nomenu = false; + menuBarFoundFlag = false; + hFig = []; + + % Force an EDT redraw before processing, to ensure all uicontrols etc. are rendered + drawnow; pause(0.02); + + % Default container is the current figure's root panel + if nargin + if isempty(container) % empty container - bail out + return; + elseif ischar(container) % container skipped - this is part of the args list... + varargin = [{container}, varargin]; + origContainer = getCurrentFigure; + [container,contentSize] = getRootPanel(origContainer); + elseif isequal(container,0) % root + origContainer = handle(container); + container = com.mathworks.mde.desk.MLDesktop.getInstance.getMainFrame; + contentSize = [container.getWidth, container.getHeight]; + elseif ishghandle(container) % && ~isa(container,'java.awt.Container') + container = container(1); % another current limitation... + hFig = ancestor(container,'figure'); + oldWarn = warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + try hJavaFrame = get(hFig,'JavaFrame'); catch, hJavaFrame = []; end + warning(oldWarn); + if isempty(hJavaFrame) % alert if trying to use with web-based (not Java-based) uifigure + error('YMA:findjobj:NonJavaFigure', 'Findjobj only works with Java-based figures, not web-based (App Designer) uifigures'); + end + origContainer = handle(container); + if isa(origContainer,'uimenu') || isa(origContainer,'matlab.ui.container.Menu') + % getpixelposition doesn't work for menus... - damn! + varargin = {'class','MenuPeer', 'property',{'Label',strrep(get(container,'Label'),'&','')}, varargin{:}}; + elseif ~isa(origContainer, 'figure') && ~isempty(hFig) && ~isa(origContainer, 'matlab.ui.Figure') + % For a single input & output, try using the fast variant + if nargin==1 && nargout==1 + try + handles = findjobj_fast(container); + if ~isempty(handles) + try handles = handle(handles,'callbackproperties'); catch, end + return + end + catch + % never mind - proceed normally using the slower variant below... + end + end + + % See limitations section above: should find a better way to directly refer to the element's java container + try + % Note: 'PixelBounds' is undocumented and unsupported, but much faster than getpixelposition! + % ^^^^ unfortunately, its Y position is inaccurate in some cases - damn! + %size = get(container,'PixelBounds'); + pos = fix(getpixelposition(container,1)); + %varargin = {'position',pos(1:2), 'size',pos(3:4), 'not','class','java.awt.Panel', varargin{:}}; + catch + try + figName = get(hFig,'name'); + if strcmpi(get(hFig,'number'),'on') + figName = regexprep(['Figure ' num2str(hFig) ': ' figName],': $',''); + end + mde = com.mathworks.mde.desk.MLDesktop.getInstance; + jFig = mde.getClient(figName); + if isempty(jFig), error('dummy'); end + catch + jFig = get(hJavaFrame,'FigurePanelContainer'); + end + pos = []; + try + pxsize = get(container,'PixelBounds'); + pos = [pxsize(1)+5, jFig.getHeight - (pxsize(4)-5)]; + catch + % never mind... + end + end + if size(pos,2) == 2 + pos(:,3:4) = 0; + end + if ~isempty(pos) + if isa(handle(container),'uicontrol') && strcmp(get(container,'style'),'popupmenu') + % popupmenus (combo-box dropdowns) are always 20px high + pos(2) = pos(2) + pos(4) - 20; + pos(4) = 20; + end + %varargin = {'position',pos(1:2), 'size',size(3:4)-size(1:2)-10, 'not','class','java.awt.Panel', varargin{:}}; + varargin = {'position',pos(1:2)+[0,pos(4)], 'size',pos(3:4), 'not','class','java.awt.Panel', 'nomenu', varargin{:}}; + end + elseif isempty(hFig) + hFig = handle(container); + end + [container,contentSize] = getRootPanel(hFig); + elseif isjava(container) + % Maybe a java container obj (will crash otherwise) + origContainer = container; + contentSize = [container.getWidth, container.getHeight]; + else + error('YMA:findjobj:IllegalContainer','Input arg does not appear to be a valid GUI object'); + end + else + % Default container = current figure + origContainer = getCurrentFigure; + [container,contentSize] = getRootPanel(origContainer); + end + + % Check persistency + if isequal(pContainer,container) + % persistency requested and the same container is reused, so reuse the hierarchy information + [handles,levels,parentIdx,positions] = deal(pHandles, pLevels, pParentIdx, pPositions); + else + % Pre-allocate space of complex data containers for improved performance + handles = repmat(handles,1,1000); + positions = zeros(1000,2); + + % Check whether to skip menu processing + nomenu = paramSupplied(varargin,'nomenu'); + + % Traverse the container hierarchy and extract the elements within + traverseContainer(container,0,1); + + % Remove unnecessary pre-allocated elements + dataLen = length(levels); + handles (dataLen+1:end) = []; + positions(dataLen+1:end,:) = []; + end + + % Process persistency check before any filtering is done + if paramSupplied(varargin,'persist') + [pContainer, pHandles, pLevels, pParentIdx, pPositions] = deal(container,handles,levels,parentIdx,positions); + end + + % Save data for possible future use in presentObjectTree() below + allHandles = handles; + allLevels = levels; + allParents = parentIdx; + selectedIdx = 1:length(handles); + %[positions(:,1)-container.getX, container.getHeight - positions(:,2)] + + % Debug-list all found compponents and their positions + if paramSupplied(varargin,'debug') + for origHandleIdx = 1 : length(allHandles) + thisObj = handles(origHandleIdx); + pos = sprintf('%d,%d %dx%d',[positions(origHandleIdx,:) getWidth(thisObj) getHeight(thisObj)]); + disp([repmat(' ',1,levels(origHandleIdx)) '[' pos '] ' char(toString(thisObj))]); + end + end + + % Process optional args + % Note: positions is NOT returned since it's based on java coord system (origin = top-left): will confuse Matlab users + processArgs(varargin{:}); + + % De-cell and trim listing, if only one element was found (no use for indented listing in this case) + if iscell(listing) && length(listing)==1 + listing = strtrim(listing{1}); + end + + % If no output args and no listing requested, present the FINDJOBJ interactive GUI + if nargout == 0 && isempty(listing) + + % Get all label positions + hg_labels = []; + labelPositions = getLabelsJavaPos(container); + + % Present the GUI (object tree) + if ~isempty(container) + presentObjectTree(); + else + warnInvisible(varargin{:}); + end + + % Display the listing, if this was specifically requested yet no relevant output arg was specified + elseif nargout < 4 && ~isempty(listing) + if ~iscell(listing) + disp(listing); + else + for listingIdx = 1 : length(listing) + disp(listing{listingIdx}); + end + end + end + + % If the number of output handles does not match the number of inputs, try to match via tooltips + if nargout && numel(handles) ~= numel(origContainer) + newHandles = handle([]); + switchHandles = false; + handlesToCheck = handles; + if isempty(handles) + handlesToCheck = allHandles; + end + for origHandleIdx = 1 : numel(origContainer) + try + thisContainer = origContainer(origHandleIdx); + if isa(thisContainer,'figure') || isa(thisContainer,'matlab.ui.Figure') + break; + end + try + newHandles(origHandleIdx) = handlesToCheck(origHandleIdx); %#ok + catch + % maybe no corresponding handle in [handles] + end + + % Assign a new random tooltip to the original (Matlab) handle + oldTooltip = get(thisContainer,'Tooltip'); + newTooltip = num2str(rand,99); + try + set(thisContainer,'TooltipString',newTooltip); + catch + set(thisContainer,'Tooltip',newTooltip); + end + drawnow; % force the Java handle to sync with the Matlab prop-change + try + % Search for a Java handle that has the newly-generated tooltip + for newHandleIdx = 1 : numel(handlesToCheck) + testTooltip = ''; + thisHandle = handlesToCheck(newHandleIdx); + try + testTooltip = char(thisHandle.getToolTipText); + catch + try testTooltip = char(thisHandle.getTooltipText); catch, end + end + if isempty(testTooltip) + % One more attempt - assume it's enclosed by a scroll-pane + try testTooltip = char(thisHandle.getViewport.getView.getToolTipText); catch, end + end + if strcmp(testTooltip, newTooltip) + newHandles(origHandleIdx) = thisHandle; + switchHandles = true; + break; + end + end + catch + % never mind - skip to the next handle + end + set(thisContainer,'Tooltip',oldTooltip); + catch + % never mind - skip to the next handle (maybe handle doesn't have a tooltip prop) + end + end + if switchHandles + handles = newHandles; + end + end + + % Display a warning if the requested handle was not found because it's invisible + if nargout && isempty(handles) + warnInvisible(varargin{:}); + end + + return; %debug point + + catch + % 'Cleaner' error handling - strip the stack info etc. + err = lasterror; %#ok + err.message = regexprep(err.message,'Error using ==> [^\n]+\n',''); + if isempty(findstr(mfilename,err.message)) + % Indicate error origin, if not already stated within the error message + err.message = [mfilename ': ' err.message]; + end + rethrow(err); + end + + %% Display a warning if the requested handle was not found because it's invisible + function warnInvisible(varargin) + try + if strcmpi(get(hFig,'Visible'),'off') + pos = get(hFig,'Position'); + set(hFig, 'Position',pos-[5000,5000,0,0], 'Visible','on'); + drawnow; pause(0.01); + [handles,levels,parentIdx,listing] = findjobj(origContainer,varargin{:}); + set(hFig, 'Position',pos, 'Visible','off'); + end + catch + % ignore - move on... + end + try + stk = dbstack; + stkNames = {stk.name}; + OutputFcnIdx = find(~cellfun(@isempty,regexp(stkNames,'_OutputFcn'))); + if ~isempty(OutputFcnIdx) + OutputFcnName = stkNames{OutputFcnIdx}; + warning('YMA:FindJObj:OutputFcn',['No Java reference was found for the requested handle, because the figure is still invisible in ' OutputFcnName '()']); + elseif ishandle(origContainer) && isprop(origContainer,'Visible') && strcmpi(get(origContainer,'Visible'),'off') + warning('YMA:FindJObj:invisibleHandle','No Java reference was found for the requested handle, probably because it is still invisible'); + end + catch + % Never mind... + end + end + + %% Check existence of a (case-insensitive) optional parameter in the params list + function [flag,idx] = paramSupplied(paramsList,paramName) + %idx = find(~cellfun('isempty',regexpi(paramsList(cellfun(@ischar,paramsList)),['^-?' paramName]))); + idx = find(~cellfun('isempty',regexpi(paramsList(cellfun('isclass',paramsList,'char')),['^-?' paramName]))); % 30/9/2009 fix for ML 7.0 suggested by Oliver W + flag = any(idx); + end + + %% Get current figure (even if its 'HandleVisibility' property is 'off') + function curFig = getCurrentFigure + oldShowHidden = get(0,'ShowHiddenHandles'); + set(0,'ShowHiddenHandles','on'); % minor fix per Johnny Smith + curFig = gcf; + set(0,'ShowHiddenHandles',oldShowHidden); + end + + %% Get Java reference to top-level (root) panel - actually, a reference to the java figure + function [jRootPane,contentSize] = getRootPanel(hFig) + try + contentSize = [0,0]; % initialize + jRootPane = hFig; + figName = get(hFig,'name'); + if strcmpi(get(hFig,'number'),'on') + figName = regexprep(['Figure ' num2str(hFig) ': ' figName],': $',''); + end + mde = com.mathworks.mde.desk.MLDesktop.getInstance; + jFigPanel = mde.getClient(figName); + jRootPane = jFigPanel; + jRootPane = jFigPanel.getRootPane; + catch + try + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + jFrame = get(hFig,'JavaFrame'); + jFigPanel = get(jFrame,'FigurePanelContainer'); + jRootPane = jFigPanel; + jRootPane = jFigPanel.getComponent(0).getRootPane; + catch + % Never mind + end + end + try + % If invalid RootPane - try another method... + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + jFrame = get(hFig,'JavaFrame'); + jAxisComponent = get(jFrame,'AxisComponent'); + jRootPane = jAxisComponent.getParent.getParent.getRootPane; + catch + % Never mind + end + try + % If invalid RootPane, retry up to N times + tries = 10; + while isempty(jRootPane) && tries>0 % might happen if figure is still undergoing rendering... + drawnow; pause(0.001); + tries = tries - 1; + jRootPane = jFigPanel.getComponent(0).getRootPane; + end + + % If still invalid, use FigurePanelContainer which is good enough in 99% of cases... (menu/tool bars won't be accessible, though) + if isempty(jRootPane) + jRootPane = jFigPanel; + end + contentSize = [jRootPane.getWidth, jRootPane.getHeight]; + + % Try to get the ancestor FigureFrame + jRootPane = jRootPane.getTopLevelAncestor; + catch + % Never mind - FigurePanelContainer is good enough in 99% of cases... (menu/tool bars won't be accessible, though) + end + end + + %% Traverse the container hierarchy and extract the elements within + function traverseContainer(jcontainer,level,parent) + persistent figureComponentFound menuRootFound + + % Record the data for this node + %disp([repmat(' ',1,level) '<= ' char(jcontainer.toString)]) + thisIdx = length(levels) + 1; + levels(thisIdx) = level; + parentIdx(thisIdx) = parent; + try newHandle = handle(jcontainer,'callbackproperties'); catch, newHandle = handle(jcontainer); end + try handles(thisIdx) = newHandle; catch, handles = newHandle; end + try + positions(thisIdx,:) = getXY(jcontainer); + %sizes(thisIdx,:) = [jcontainer.getWidth, jcontainer.getHeight]; + catch + positions(thisIdx,:) = [0,0]; + %sizes(thisIdx,:) = [0,0]; + end + if level>0 + positions(thisIdx,:) = positions(thisIdx,:) + positions(parent,:); + if ~figureComponentFound && ... + strcmp(jcontainer.getName,'fComponentContainer') && ... + isa(jcontainer,'com.mathworks.hg.peer.FigureComponentContainer') % there are 2 FigureComponentContainers - only process one... + + % restart coordinate system, to exclude menu & toolbar areas + positions(thisIdx,:) = positions(thisIdx,:) - [jcontainer.getRootPane.getX, jcontainer.getRootPane.getY]; + figureComponentFound = true; + end + elseif level==1 + positions(thisIdx,:) = positions(thisIdx,:) + positions(parent,:); + else + % level 0 - initialize flags used later + figureComponentFound = false; + menuRootFound = false; + end + parentId = length(parentIdx); + + % Traverse Menu items, unless the 'nomenu' option was requested + if ~nomenu + try + for child = 1 : getNumMenuComponents(jcontainer) + traverseContainer(jcontainer.getMenuComponent(child-1),level+1,parentId); + end + catch + % Probably not a Menu container, but maybe a top-level JMenu, so discard duplicates + %if isa(handles(end).java,'javax.swing.JMenuBar') + if ~menuRootFound && strcmp(class(java(handles(end))),'javax.swing.JMenuBar') %faster... + if removeDuplicateNode(thisIdx) + menuRootFound = true; + return; + end + end + end + end + + % Now recursively process all this node's children (if any), except menu items if so requested + %if isa(jcontainer,'java.awt.Container') + try % try-catch is faster than checking isa(jcontainer,'java.awt.Container')... + %if jcontainer.getComponentCount, jcontainer.getComponents, end + if ~nomenu || menuBarFoundFlag || isempty(strfind(class(jcontainer),'FigureMenuBar')) + lastChildComponent = java.lang.Object; + child = 0; + while (child < jcontainer.getComponentCount) + childComponent = jcontainer.getComponent(child); + % Looping over menus sometimes causes jcontainer to get mixed up (probably a JITC bug), so identify & fix + if isequal(childComponent,lastChildComponent) + child = child + 1; + childComponent = jcontainer.getComponent(child); + end + lastChildComponent = childComponent; + %disp([repmat(' ',1,level) '=> ' num2str(child) ': ' char(class(childComponent))]) + traverseContainer(childComponent,level+1,parentId); + child = child + 1; + end + else + menuBarFoundFlag = true; % use this flag to skip further testing for FigureMenuBar + end + catch + % do nothing - probably not a container + %dispError + end + + % ...and yet another type of child traversal... + try + if ~isdeployed % prevent 'File is empty' messages in compiled apps + jc = jcontainer.java; + else + jc = jcontainer; + end + for child = 1 : jc.getChildCount + traverseContainer(jc.getChildAt(child-1),level+1,parentId); + end + catch + % do nothing - probably not a container + %dispError + end + + % TODO: Add axis (plot) component handles + end + + %% Get the XY location of a Java component + function xy = getXY(jcontainer) + % Note: getX/getY are better than get(..,'X') (mem leaks), + % ^^^^ but sometimes they fail and revert to getx.m ... + % Note2: try awtinvoke() catch is faster than checking ismethod()... + % Note3: using AWTUtilities.invokeAndWait() directly is even faster than awtinvoke()... + try %if ismethod(jcontainer,'getX') + %positions(thisIdx,:) = [jcontainer.getX, jcontainer.getY]; + cls = getClass(jcontainer); + location = com.mathworks.jmi.AWTUtilities.invokeAndWait(jcontainer,getMethod(cls,'getLocation',[]),[]); + x = location.getX; + y = location.getY; + catch %else + try + x = com.mathworks.jmi.AWTUtilities.invokeAndWait(jcontainer,getMethod(cls,'getX',[]),[]); + y = com.mathworks.jmi.AWTUtilities.invokeAndWait(jcontainer,getMethod(cls,'getY',[]),[]); + catch + try + x = awtinvoke(jcontainer,'getX()'); + y = awtinvoke(jcontainer,'getY()'); + catch + x = get(jcontainer,'X'); + y = get(jcontainer,'Y'); + end + end + end + %positions(thisIdx,:) = [x, y]; + xy = [x,y]; + end + + %% Get the number of menu sub-elements + function numMenuComponents = getNumMenuComponents(jcontainer) + + % The following line will raise an Exception for anything except menus + numMenuComponents = jcontainer.getMenuComponentCount; + + % No error so far, so this must be a menu container... + % Note: Menu subitems are not visible until the top-level (root) menu gets initial focus... + % Try several alternatives, until we get a non-empty menu (or not...) + % TODO: Improve performance - this takes WAY too long... + if jcontainer.isTopLevelMenu && (numMenuComponents==0) + jcontainer.requestFocus; + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + drawnow; pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + jcontainer.setSelected(true); + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + drawnow; pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + jcontainer.doClick; % needed in order to populate the sub-menu components + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + drawnow; %pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + jcontainer.doClick; % close menu by re-clicking... + if (numMenuComponents == 0) + drawnow; %pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + end + else + % ok - found sub-items + % Note: no need to close menu since this will be done when focus moves to the FindJObj window + %jcontainer.doClick; % close menu by re-clicking... + end + end + end + jcontainer.setSelected(false); % de-select the menu + end + end + end + end + + %% Remove a specific tree node's data + function nodeRemovedFlag = removeDuplicateNode(thisIdx) + nodeRemovedFlag = false; + for idx = 1 : thisIdx-1 + if isequal(handles(idx),handles(thisIdx)) + levels(thisIdx) = []; + parentIdx(thisIdx) = []; + handles(thisIdx) = []; + positions(thisIdx,:) = []; + %sizes(thisIdx,:) = []; + nodeRemovedFlag = true; + return; + end + end + end + + %% Process optional args + function processArgs(varargin) + + % Initialize + invertFlag = false; + listing = ''; + + % Loop over all optional args + while ~isempty(varargin) && ~isempty(handles) + + % Process the arg (and all its params) + foundIdx = 1 : length(handles); + if iscell(varargin{1}), varargin{1} = varargin{1}{1}; end + if ~isempty(varargin{1}) && varargin{1}(1)=='-' + varargin{1}(1) = []; + end + switch lower(varargin{1}) + case 'not' + invertFlag = true; + case 'position' + [varargin,foundIdx] = processPositionArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'size' + [varargin,foundIdx] = processSizeArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'class' + [varargin,foundIdx] = processClassArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'property' + [varargin,foundIdx] = processPropertyArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'depth' + [varargin,foundIdx] = processDepthArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'flat' + varargin = {'depth',0, varargin{min(2:end):end}}; + [varargin,foundIdx] = processDepthArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case {'print','list'} + [varargin,listing] = processPrintArgs(varargin{:}); + case {'persist','nomenu','debug'} + % ignore - already handled in main function above + otherwise + error('YMA:findjobj:IllegalOption',['Option ' num2str(varargin{1}) ' is not a valid option. Type ''help ' mfilename ''' for the full options list.']); + end + + % If only parent-child pairs found + foundIdx = find(foundIdx); + if ~isempty(foundIdx) && isequal(parentIdx(foundIdx(2:2:end)),foundIdx(1:2:end)) + % Return just the children (the parent panels are uninteresting) + foundIdx(1:2:end) = []; + end + + % If several possible handles were found and the first is the container of the second + if length(foundIdx) == 2 && isequal(handles(foundIdx(1)).java, handles(foundIdx(2)).getParent) + % Discard the uninteresting component container + foundIdx(1) = []; + end + + % Filter the results + selectedIdx = selectedIdx(foundIdx); + handles = handles(foundIdx); + levels = levels(foundIdx); + parentIdx = parentIdx(foundIdx); + positions = positions(foundIdx,:); + + % Remove this arg and proceed to the next one + varargin(1) = []; + + end % Loop over all args + end + + %% Process 'print' option + function [varargin,listing] = processPrintArgs(varargin) + if length(varargin)<2 || ischar(varargin{2}) + % No second arg given, so use the first available element + listingContainer = handles(1); %#ok - used in evalc below + else + % Get the element to print from the specified second arg + if isnumeric(varargin{2}) && (varargin{2} == fix(varargin{2})) % isinteger doesn't work on doubles... + if (varargin{2} > 0) && (varargin{2} <= length(handles)) + listingContainer = handles(varargin{2}); %#ok - used in evalc below + elseif varargin{2} > 0 + error('YMA:findjobj:IllegalPrintFilter','Print filter index %g > number of available elements (%d)',varargin{2},length(handles)); + else + error('YMA:findjobj:IllegalPrintFilter','Print filter must be a java handle or positive numeric index into handles'); + end + elseif ismethod(varargin{2},'list') + listingContainer = varargin{2}; %#ok - used in evalc below + else + error('YMA:findjobj:IllegalPrintFilter','Print filter must be a java handle or numeric index into handles'); + end + varargin(2) = []; + end + + % use evalc() to capture output into a Matlab variable + %listing = evalc('listingContainer.list'); + + % Better solution: loop over all handles and process them one by one + listing = cell(length(handles),1); + for componentIdx = 1 : length(handles) + listing{componentIdx} = [repmat(' ',1,levels(componentIdx)) char(handles(componentIdx).toString)]; + end + end + + %% Process 'position' option + function [varargin,foundIdx] = processPositionArgs(varargin) + if length(varargin)>1 + positionFilter = varargin{2}; + %if (isjava(positionFilter) || iscom(positionFilter)) && ismethod(positionFilter,'getLocation') + try % try-catch is faster... + % Java/COM object passed - get its position + positionFilter = positionFilter.getLocation; + filterXY = [positionFilter.getX, positionFilter.getY]; + catch + if ~isscalar(positionFilter) + % position vector passed + if (length(positionFilter)>=2) && isnumeric(positionFilter) + % Remember that java coordinates start at top-left corner, Matlab coords start at bottom left... + %positionFilter = java.awt.Point(positionFilter(1), container.getHeight - positionFilter(2)); + filterXY = [container.getX + positionFilter(1), container.getY + contentSize(2) - positionFilter(2)]; + + % Check for full Matlab position vector (x,y,w,h) + %if (length(positionFilter)==4) + % varargin{end+1} = 'size'; + % varargin{end+1} = fix(positionFilter(3:4)); + %end + else + error('YMA:findjobj:IllegalPositionFilter','Position filter must be a java UI component, or X,Y pair'); + end + elseif length(varargin)>2 + % x,y passed as separate arg values + if isnumeric(positionFilter) && isnumeric(varargin{3}) + % Remember that java coordinates start at top-left corner, Matlab coords start at bottom left... + %positionFilter = java.awt.Point(positionFilter, container.getHeight - varargin{3}); + filterXY = [container.getX + positionFilter, container.getY + contentSize(2) - varargin{3}]; + varargin(3) = []; + else + error('YMA:findjobj:IllegalPositionFilter','Position filter must be a java UI component, or X,Y pair'); + end + else + error('YMA:findjobj:IllegalPositionFilter','Position filter must be a java UI component, or X,Y pair'); + end + end + + % Compute the required element positions in order to be eligible for a more detailed examination + % Note: based on the following constraints: 0 <= abs(elementX-filterX) + abs(elementY+elementH-filterY) < 7 + baseDeltas = [positions(:,1)-filterXY(1), positions(:,2)-filterXY(2)]; % faster than repmat()... + %baseHeight = - baseDeltas(:,2);% -abs(baseDeltas(:,1)); + %minHeight = baseHeight - 7; + %maxHeight = baseHeight + 7; + %foundIdx = ~arrayfun(@(b)(invoke(b,'contains',positionFilter)),handles); % ARGH! - disallowed by Matlab! + %foundIdx = repmat(false,1,length(handles)); + %foundIdx(length(handles)) = false; % faster than repmat()... + foundIdx = (abs(baseDeltas(:,1)) < 7) & (abs(baseDeltas(:,2)) < 7); % & (minHeight >= 0); + %fi = find(foundIdx); + %for componentIdx = 1 : length(fi) + %foundIdx(componentIdx) = handles(componentIdx).getBounds.contains(positionFilter); + + % Search for a point no farther than 7 pixels away (prevents rounding errors) + %foundIdx(componentIdx) = handles(componentIdx).getLocationOnScreen.distanceSq(positionFilter) < 50; % fails for invisible components... + + %p = java.awt.Point(positions(componentIdx,1), positions(componentIdx,2) + handles(componentIdx).getHeight); + %foundIdx(componentIdx) = p.distanceSq(positionFilter) < 50; + + %foundIdx(componentIdx) = sum(([baseDeltas(componentIdx,1),baseDeltas(componentIdx,2)+handles(componentIdx).getHeight]).^2) < 50; + + % Following is the fastest method found to date: only eligible elements are checked in detailed + % elementHeight = handles(fi(componentIdx)).getHeight; + % foundIdx(fi(componentIdx)) = elementHeight > minHeight(fi(componentIdx)) && ... + % elementHeight < maxHeight(fi(componentIdx)); + %disp([componentIdx,elementHeight,minHeight(fi(componentIdx)),maxHeight(fi(componentIdx)),foundIdx(fi(componentIdx))]) + %end + + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'size' option + function [varargin,foundIdx] = processSizeArgs(varargin) + if length(varargin)>1 + sizeFilter = lower(varargin{2}); + %if (isjava(sizeFilter) || iscom(sizeFilter)) && ismethod(sizeFilter,'getSize') + try % try-catch is faster... + % Java/COM object passed - get its size + sizeFilter = sizeFilter.getSize; + filterWidth = sizeFilter.getWidth; + filterHeight = sizeFilter.getHeight; + catch + if ~isscalar(sizeFilter) + % size vector passed + if (length(sizeFilter)>=2) && isnumeric(sizeFilter) + %sizeFilter = java.awt.Dimension(sizeFilter(1),sizeFilter(2)); + filterWidth = sizeFilter(1); + filterHeight = sizeFilter(2); + else + error('YMA:findjobj:IllegalSizeFilter','Size filter must be a java UI component, or W,H pair'); + end + elseif length(varargin)>2 + % w,h passed as separate arg values + if isnumeric(sizeFilter) && isnumeric(varargin{3}) + %sizeFilter = java.awt.Dimension(sizeFilter,varargin{3}); + filterWidth = sizeFilter; + filterHeight = varargin{3}; + varargin(3) = []; + else + error('YMA:findjobj:IllegalSizeFilter','Size filter must be a java UI component, or W,H pair'); + end + else + error('YMA:findjobj:IllegalSizeFilter','Size filter must be a java UI component, or W,H pair'); + end + end + %foundIdx = ~arrayfun(@(b)(invoke(b,'contains',sizeFilter)),handles); % ARGH! - disallowed by Matlab! + foundIdx(length(handles)) = false; % faster than repmat()... + for componentIdx = 1 : length(handles) + %foundIdx(componentIdx) = handles(componentIdx).getSize.equals(sizeFilter); + % Allow a 2-pixel tollerance to account for non-integer pixel sizes + foundIdx(componentIdx) = abs(handles(componentIdx).getWidth - filterWidth) <= 3 && ... % faster than getSize.equals() + abs(handles(componentIdx).getHeight - filterHeight) <= 3; + end + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'class' option + function [varargin,foundIdx] = processClassArgs(varargin) + if length(varargin)>1 + classFilter = varargin{2}; + %if ismethod(classFilter,'getClass') + try % try-catch is faster... + classFilter = char(classFilter.getClass); + catch + if ~ischar(classFilter) + error('YMA:findjobj:IllegalClassFilter','Class filter must be a java object, class or string'); + end + end + + % Now convert all java classes to java.lang.Strings and compare to the requested filter string + try + foundIdx(length(handles)) = false; % faster than repmat()... + jClassFilter = java.lang.String(classFilter).toLowerCase; + for componentIdx = 1 : length(handles) + % Note: JVM 1.5's String.contains() appears slightly slower and is available only since Matlab 7.2 + foundIdx(componentIdx) = handles(componentIdx).getClass.toString.toLowerCase.indexOf(jClassFilter) >= 0; + end + catch + % Simple processing: slower since it does extra processing within opaque.char() + for componentIdx = 1 : length(handles) + % Note: using @toChar is faster but returns java String, not a Matlab char + foundIdx(componentIdx) = ~isempty(regexpi(char(handles(componentIdx).getClass),classFilter)); + end + end + + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'property' option + function [varargin,foundIdx] = processPropertyArgs(varargin) + if length(varargin)>1 + propertyName = varargin{2}; + if iscell(propertyName) + if length(propertyName) == 2 + propertyVal = propertyName{2}; + propertyName = propertyName{1}; + elseif length(propertyName) == 1 + propertyName = propertyName{1}; + else + error('YMA:findjobj:IllegalPropertyFilter','Property filter must be a string (case insensitive name of property) or cell array {propName,propValue}'); + end + end + if ~ischar(propertyName) + error('YMA:findjobj:IllegalPropertyFilter','Property filter must be a string (case insensitive name of property) or cell array {propName,propValue}'); + end + propertyName = lower(propertyName); + %foundIdx = arrayfun(@(h)isprop(h,propertyName),handles); % ARGH! - disallowed by Matlab! + foundIdx(length(handles)) = false; % faster than repmat()... + + % Split processing depending on whether a specific property value was requested (ugly but faster...) + if exist('propertyVal','var') + for componentIdx = 1 : length(handles) + try + % Find out whether this element has the specified property + % Note: findprop() and its return value schema.prop are undocumented and unsupported! + prop = findprop(handles(componentIdx),propertyName); % faster than isprop() & enables partial property names + + % If found, compare it to the actual element's property value + foundIdx(componentIdx) = ~isempty(prop) && isequal(get(handles(componentIdx),prop.Name),propertyVal); + catch + % Some Java classes have a write-only property (like LabelPeer with 'Text'), so we end up here + % In these cases, simply assume that the property value doesn't match and continue + foundIdx(componentIdx) = false; + end + end + else + for componentIdx = 1 : length(handles) + try + % Find out whether this element has the specified property + % Note: findprop() and its return value schema.prop are undocumented and unsupported! + foundIdx(componentIdx) = ~isempty(findprop(handles(componentIdx),propertyName)); + catch + foundIdx(componentIdx) = false; + end + end + end + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'depth' option + function [varargin,foundIdx] = processDepthArgs(varargin) + if length(varargin)>1 + level = varargin{2}; + if ~isnumeric(level) + error('YMA:findjobj:IllegalDepthFilter','Depth filter must be a number (=maximal element depth)'); + end + foundIdx = (levels <= level); + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Convert property data into a string + function data = charizeData(data) + if isa(data,'com.mathworks.hg.types.HGCallback') + data = get(data,'Callback'); + end + if ~ischar(data) && ~isa(data,'java.lang.String') + newData = strtrim(evalc('disp(data)')); + try + newData = regexprep(newData,' +',' '); + newData = regexprep(newData,'Columns \d+ through \d+\s',''); + newData = regexprep(newData,'Column \d+\s',''); + catch + %never mind... + end + if iscell(data) + newData = ['{ ' newData ' }']; + elseif isempty(data) + newData = ''; + elseif isnumeric(data) || islogical(data) || any(ishandle(data)) || numel(data) > 1 %&& ~isscalar(data) + newData = ['[' newData ']']; + end + data = newData; + elseif ~isempty(data) + data = ['''' data '''']; + end + end % charizeData + + %% Prepare a hierarchical callbacks table data + function setProp(list,name,value,category) + prop = eval('com.jidesoft.grid.DefaultProperty();'); % prevent JIDE alert by run-time (not load-time) evaluation + prop.setName(name); + prop.setType(java.lang.String('').getClass); + prop.setValue(value); + prop.setEditable(true); + prop.setExpert(true); + %prop.setCategory(['' category ' callbacks']); + prop.setCategory([category ' callbacks']); + list.add(prop); + end % getTreeData + + %% Prepare a hierarchical callbacks table data + function list = getTreeData(data) + list = java.util.ArrayList(); + names = regexprep(data,'([A-Z][a-z]+).*','$1'); + %hash = java.util.Hashtable; + others = {}; + for propIdx = 1 : size(data,1) + if (propIdx < size(data,1) && strcmp(names{propIdx},names{propIdx+1})) || ... + (propIdx > 1 && strcmp(names{propIdx},names{propIdx-1})) + % Child callback property + setProp(list,data{propIdx,1},data{propIdx,2},names{propIdx}); + else + % Singular callback property => Add to 'Other' category at bottom of the list + others(end+1,:) = data(propIdx,:); %#ok + end + end + for propIdx = 1 : size(others,1) + setProp(list,others{propIdx,1},others{propIdx,2},'Other'); + end + end % getTreeData + + %% Get callbacks table data + function [cbData, cbHeaders, cbTableEnabled] = getCbsData(obj, stripStdCbsFlag) + % Initialize + cbData = {'(no callbacks)'}; + cbHeaders = {'Callback name'}; + cbTableEnabled = false; + cbNames = {}; + + try + try + classHdl = classhandle(handle(obj)); + cbNames = get(classHdl.Events,'Name'); + if ~isempty(cbNames) && ~iscom(obj) %only java-based please... + cbNames = strcat(cbNames,'Callback'); + end + propNames = get(classHdl.Properties,'Name'); + catch + % Try to interpret as an MCOS class object + try + oldWarn = warning('off','MATLAB:structOnObject'); + dataFields = struct(obj); + warning(oldWarn); + catch + dataFields = get(obj); + end + propNames = fieldnames(dataFields); + end + propCbIdx = []; + if ischar(propNames), propNames={propNames}; end % handle case of a single callback + if ~isempty(propNames) + propCbIdx = find(~cellfun(@isempty,regexp(propNames,'(Fcn|Callback)$'))); + cbNames = unique([cbNames; propNames(propCbIdx)]); %#ok logical is faster but less debuggable... + end + if ~isempty(cbNames) + if stripStdCbsFlag + cbNames = stripStdCbs(cbNames); + end + if iscell(cbNames) + cbNames = sort(cbNames); + if size(cbNames,1) < size(cbNames,2) + cbNames = cbNames'; + end + end + hgHandleFlag = 0; try hgHandleFlag = ishghandle(obj); catch, end %#ok + try + obj = handle(obj,'CallbackProperties'); + catch + hgHandleFlag = 1; + end + if hgHandleFlag + % HG handles don't allow CallbackProperties - search only for *Fcn + %cbNames = propNames(propCbIdx); + end + if iscom(obj) + cbs = obj.eventlisteners; + if ~isempty(cbs) + cbNamesRegistered = cbs(:,1); + cbData = setdiff(cbNames,cbNamesRegistered); + %cbData = charizeData(cbData); + if size(cbData,2) > size(cbData(1)) + cbData = cbData'; + end + cbData = [cbData, cellstr(repmat(' ',length(cbData),1))]; + cbData = [cbData; cbs]; + [sortedNames, sortedIdx] = sort(cbData(:,1)); + sortedCbs = cellfun(@charizeData,cbData(sortedIdx,2),'un',0); + cbData = [sortedNames, sortedCbs]; + else + cbData = [cbNames, cellstr(repmat(' ',length(cbNames),1))]; + end + elseif iscell(cbNames) + cbNames = sort(cbNames); + %cbData = [cbNames, get(obj,cbNames)']; + cbData = cbNames; + oldWarn = warning('off','MATLAB:hg:JavaSetHGProperty'); + warning('off','MATLAB:hg:PossibleDeprecatedJavaSetHGProperty'); + for idx = 1 : length(cbNames) + try + cbData{idx,2} = charizeData(get(obj,cbNames{idx})); + catch + cbData{idx,2} = '(callback value inaccessible)'; + end + end + warning(oldWarn); + else % only one event callback + %cbData = {cbNames, get(obj,cbNames)'}; + %cbData{1,2} = charizeData(cbData{1,2}); + try + cbData = {cbNames, charizeData(get(obj,cbNames))}; + catch + cbData = {cbNames, '(callback value inaccessible)'}; + end + end + cbHeaders = {'Callback name','Callback value'}; + cbTableEnabled = true; + end + catch + % never mind - use default (empty) data + end + end % getCbsData + + %% Get relative (0.0-1.0) divider location + function divLocation = getRalativeDivlocation(jDiv) + divLocation = jDiv.getDividerLocation; + if divLocation > 1 % i.e. [pixels] + visibleRect = jDiv.getVisibleRect; + if jDiv.getOrientation == 0 % vertical + start = visibleRect.getY; + extent = visibleRect.getHeight - start; + else + start = visibleRect.getX; + extent = visibleRect.getWidth - start; + end + divLocation = (divLocation - start) / extent; + end + end % getRalativeDivlocation + + %% Try to set a treenode icon based on a container's icon + function setTreeNodeIcon(treenode,container) + try + iconImage = []; + iconImage = container.getIcon; + if ~isempty(findprop(handle(iconImage),'Image')) % get(iconImage,'Image') is easier but leaks memory... + iconImage = iconImage.getImage; + else + a=b; %#ok cause an error + end + catch + try + iconImage = container.getIconImage; + catch + try + if ~isempty(iconImage) + ge = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment; + gd = ge.getDefaultScreenDevice; + gc = gd.getDefaultConfiguration; + image = gc.createCompatibleImage(iconImage.getIconWidth, iconImage.getIconHeight); % a BufferedImage object + g = image.createGraphics; + iconImage.paintIcon([], g, 0, 0); + g.dispose; + iconImage = image; + end + catch + % never mind... + end + end + end + if ~isempty(iconImage) + iconImage = setIconSize(iconImage); + treenode.setIcon(iconImage); + end + end % setTreeNodeIcon + + %% Present the object hierarchy tree + function presentObjectTree() + persistent lastVersionCheck + if isempty(lastVersionCheck), lastVersionCheck = now-1; end + + import java.awt.* + import javax.swing.* + hTreeFig = findall(0,'tag','findjobjFig'); + iconpath = [matlabroot, '/toolbox/matlab/icons/']; + cbHideStd = 0; % Initial state of the cbHideStdCbs checkbox + if isempty(hTreeFig) + % Prepare the figure + hTreeFig = figure('tag','findjobjFig','menuBar','none','toolBar','none','Name','FindJObj','NumberTitle','off','handleVisibility','off','IntegerHandle','off'); + figIcon = ImageIcon([iconpath 'tool_legend.gif']); + drawnow; + try + mde = com.mathworks.mde.desk.MLDesktop.getInstance; + jTreeFig = mde.getClient('FindJObj').getTopLevelAncestor; + jTreeFig.setIcon(figIcon); + catch + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + jTreeFig = get(hTreeFig,'JavaFrame'); + jTreeFig.setFigureIcon(figIcon); + end + vsplitPaneLocation = 0.8; + hsplitPaneLocation = 0.5; + else + % Remember cbHideStdCbs checkbox & dividers state for later + userdata = get(hTreeFig, 'userdata'); + try cbHideStd = userdata.cbHideStdCbs.isSelected; catch, end %#ok + try + vsplitPaneLocation = getRalativeDivlocation(userdata.vsplitPane); + hsplitPaneLocation = getRalativeDivlocation(userdata.hsplitPane); + catch + vsplitPaneLocation = 0.8; + hsplitPaneLocation = 0.5; + end + + % Clear the figure and redraw + clf(hTreeFig); + figure(hTreeFig); % bring to front + end + + % Traverse all HG children, if root container was a HG handle + if ishghandle(origContainer) %&& ~isequal(origContainer,container) + traverseHGContainer(origContainer,0,0); + end + + % Prepare the tree pane + warning('off','MATLAB:uitreenode:MigratingFunction'); % R2008b compatibility + warning('off','MATLAB:uitreenode:DeprecatedFunction'); % R2008a compatibility + tree_h = com.mathworks.hg.peer.UITreePeer; + try tree_h = javaObjectEDT(tree_h); catch, end + tree_hh = handle(tree_h,'CallbackProperties'); + hasChildren = sum(allParents==1) > 1; + icon = [iconpath 'upfolder.gif']; + [rootName, rootTitle] = getNodeName(container); + try + root = uitreenode('v0', handle(container), rootName, icon, ~hasChildren); + catch % old matlab version don't have the 'v0' option + root = uitreenode(handle(container), rootName, icon, ~hasChildren); + end + setTreeNodeIcon(root,container); % constructor must accept a char icon unfortunately, so need to do this afterwards... + if ~isempty(rootTitle) + set(hTreeFig, 'Name',['FindJObj - ' char(rootTitle)]); + end + nodedata.idx = 1; + nodedata.obj = container; + set(root,'userdata',nodedata); + root.setUserObject(container); + setappdata(root,'childHandle',container); + tree_h.setRoot(root); + treePane = tree_h.getScrollPane; + treePane.setMinimumSize(Dimension(50,50)); + jTreeObj = treePane.getViewport.getComponent(0); + jTreeObj.setShowsRootHandles(true) + jTreeObj.getSelectionModel.setSelectionMode(javax.swing.tree.TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); + %jTreeObj.setVisible(0); + %jTreeObj.getCellRenderer.setLeafIcon([]); + %jTreeObj.getCellRenderer.setOpenIcon(figIcon); + %jTreeObj.getCellRenderer.setClosedIcon([]); + treePanel = JPanel(BorderLayout); + treePanel.add(treePane, BorderLayout.CENTER); + progressBar = JProgressBar(0); + progressBar.setMaximum(length(allHandles) + length(hg_handles)); % = # of all nodes + treePanel.add(progressBar, BorderLayout.SOUTH); + + % Prepare the image pane +%disable for now, until we get it working... +%{ + try + hFig = ancestor(origContainer,'figure'); + [cdata, cm] = getframe(hFig); %#ok cm unused + tempfname = [tempname '.png']; + imwrite(cdata,tempfname); % don't know how to pass directly to BufferedImage, so use disk... + jImg = javax.imageio.ImageIO.read(java.io.File(tempfname)); + try delete(tempfname); catch end + imgPanel = JPanel(); + leftPanel = JSplitPane(JSplitPane.VERTICAL_SPLIT, treePanel, imgPanel); + leftPanel.setOneTouchExpandable(true); + leftPanel.setContinuousLayout(true); + leftPanel.setResizeWeight(0.8); + catch + leftPanel = treePanel; + end +%} + leftPanel = treePanel; + + % Prepare the inspector pane + classNameLabel = JLabel([' ' char(class(container))]); + classNameLabel.setForeground(Color.blue); + updateNodeTooltip(container, classNameLabel); + inspectorPanel = JPanel(BorderLayout); + inspectorPanel.add(classNameLabel, BorderLayout.NORTH); + % TODO: Maybe uncomment the following when we add the HG tree - in the meantime it's unused (java properties are un-groupable) + %objReg = com.mathworks.services.ObjectRegistry.getLayoutRegistry; + %toolBar = awtinvoke('com.mathworks.mlwidgets.inspector.PropertyView$ToolBarStyle','valueOf(Ljava.lang.String;)','GROUPTOOLBAR'); + %inspectorPane = com.mathworks.mlwidgets.inspector.PropertyView(objReg, toolBar); + inspectorPane = com.mathworks.mlwidgets.inspector.PropertyView; + identifiers = disableDbstopError; %#ok "dbstop if error" causes inspect.m to croak due to a bug - so workaround + inspectorPane.setObject(container); + inspectorPane.setAutoUpdate(true); + % TODO: Add property listeners + % TODO: Display additional props + inspectorTable = inspectorPane; + try + while ~isa(inspectorTable,'javax.swing.JTable') + inspectorTable = inspectorTable.getComponent(0); + end + catch + % R2010a + inspectorTable = inspectorPane.getComponent(0).getScrollPane.getViewport.getComponent(0); + end + toolTipText = 'hover mouse over the red classname above to see the full list of properties'; + inspectorTable.setToolTipText(toolTipText); + jideTableUtils = []; + try + % Try JIDE features - see http://www.jidesoft.com/products/JIDE_Grids_Developer_Guide.pdf + com.mathworks.mwswing.MJUtilities.initJIDE; + jideTableUtils = eval('com.jidesoft.grid.TableUtils;'); % prevent JIDE alert by run-time (not load-time) evaluation + jideTableUtils.autoResizeAllColumns(inspectorTable); + inspectorTable.setRowAutoResizes(true); + inspectorTable.getModel.setShowExpert(1); + catch + % JIDE is probably unavailable - never mind... + end + inspectorPanel.add(inspectorPane, BorderLayout.CENTER); + % TODO: Add data update listeners + + % Prepare the callbacks pane + callbacksPanel = JPanel(BorderLayout); + stripStdCbsFlag = true; % initial value + [cbData, cbHeaders, cbTableEnabled] = getCbsData(container, stripStdCbsFlag); + %{ + %classHdl = classhandle(handle(container)); + %eventNames = get(classHdl.Events,'Name'); + %if ~isempty(eventNames) + % cbNames = sort(strcat(eventNames,'Callback')); + % try + % cbData = [cbNames, get(container,cbNames)']; + % catch + % % R2010a + % cbData = cbNames; + % if isempty(cbData) + % cbData = {}; + % elseif ~iscell(cbData) + % cbData = {cbData}; + % end + % for idx = 1 : length(cbNames) + % cbData{idx,2} = get(container,cbNames{idx}); + % end + % end + % cbTableEnabled = true; + %else + % cbData = {'(no callbacks)',''}; + % cbTableEnabled = false; + %end + %cbHeaders = {'Callback name','Callback value'}; + %} + try + % Use JideTable if available on this system + %callbacksTableModel = javax.swing.table.DefaultTableModel(cbData,cbHeaders); %#ok + %callbacksTable = eval('com.jidesoft.grid.PropertyTable(callbacksTableModel);'); % prevent JIDE alert by run-time (not load-time) evaluation + try + list = getTreeData(cbData); %#ok + model = eval('com.jidesoft.grid.PropertyTableModel(list);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + % Auto-expand if only one category + if model.getRowCount==1 % length(model.getCategories)==1 fails for some unknown reason... + model.expandFirstLevel; + end + + %callbacksTable = eval('com.jidesoft.grid.TreeTable(model);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + callbacksTable = eval('com.jidesoft.grid.PropertyTable(model);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + %callbacksTable.expandFirstLevel; + callbacksTable.setShowsRootHandles(true); + callbacksTable.setShowTreeLines(false); + %callbacksTable.setShowNonEditable(0); %=SHOW_NONEDITABLE_NEITHER + callbacksPane = eval('com.jidesoft.grid.PropertyPane(callbacksTable);'); % prevent JIDE alert by run-time (not load-time) evaluation + callbacksPane.setShowDescription(false); + catch + callbacksTable = eval('com.jidesoft.grid.TreeTable(cbData,cbHeaders);'); % prevent JIDE alert by run-time (not load-time) evaluation + end + callbacksTable.setRowAutoResizes(true); + callbacksTable.setColumnAutoResizable(true); + callbacksTable.setColumnResizable(true); + jideTableUtils.autoResizeAllColumns(callbacksTable); + callbacksTable.setTableHeader([]); % hide the column headers since now we can resize columns with the gridline + callbacksLabel = JLabel(' Callbacks:'); % The column headers are replaced with a header label + callbacksLabel.setForeground(Color.blue); + %callbacksPanel.add(callbacksLabel, BorderLayout.NORTH); + + % Add checkbox to show/hide standard callbacks + callbacksTopPanel = JPanel; + callbacksTopPanel.setLayout(BoxLayout(callbacksTopPanel, BoxLayout.LINE_AXIS)); + callbacksTopPanel.add(callbacksLabel); + callbacksTopPanel.add(Box.createHorizontalGlue); + jcb = JCheckBox('Hide standard callbacks', cbHideStd); + set(handle(jcb,'CallbackProperties'), 'ActionPerformedCallback',{@cbHideStdCbs_Callback,callbacksTable}); + try + set(jcb, 'userdata',callbacksTable, 'tooltip','Hide standard Swing callbacks - only component-specific callbacks will be displayed'); + catch + jcb.setToolTipText('Hide standard Swing callbacks - only component-specific callbacks will be displayed'); + %setappdata(jcb,'userdata',callbacksTable); + end + callbacksTopPanel.add(jcb); + callbacksPanel.add(callbacksTopPanel, BorderLayout.NORTH); + catch + % Otherwise, use a standard Swing JTable (keep the headers to enable resizing) + callbacksTable = JTable(cbData,cbHeaders); + end + cbToolTipText = 'Callbacks may be ''strings'', @funcHandle or {@funcHandle,arg1,...}'; + callbacksTable.setToolTipText(cbToolTipText); + callbacksTable.setGridColor(inspectorTable.getGridColor); + cbNameTextField = JTextField; + cbNameTextField.setEditable(false); % ensure that the callback names are not modified... + cbNameCellEditor = DefaultCellEditor(cbNameTextField); + cbNameCellEditor.setClickCountToStart(intmax); % i.e, never enter edit mode... + callbacksTable.getColumnModel.getColumn(0).setCellEditor(cbNameCellEditor); + if ~cbTableEnabled + try callbacksTable.getColumnModel.getColumn(1).setCellEditor(cbNameCellEditor); catch, end + end + hModel = callbacksTable.getModel; + set(handle(hModel,'CallbackProperties'), 'TableChangedCallback',{@tbCallbacksChanged,container,callbacksTable}); + %set(hModel, 'UserData',container); + try + cbScrollPane = callbacksPane; %JScrollPane(callbacksPane); + %cbScrollPane.setHorizontalScrollBarPolicy(cbScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + catch + cbScrollPane = JScrollPane(callbacksTable); + cbScrollPane.setVerticalScrollBarPolicy(cbScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + end + callbacksPanel.add(cbScrollPane, BorderLayout.CENTER); + callbacksPanel.setToolTipText(cbToolTipText); + + % Prepare the top-bottom JSplitPanes + vsplitPane = JSplitPane(JSplitPane.VERTICAL_SPLIT, inspectorPanel, callbacksPanel); + vsplitPane.setOneTouchExpandable(true); + vsplitPane.setContinuousLayout(true); + vsplitPane.setResizeWeight(0.8); + + % Prepare the left-right JSplitPane + hsplitPane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, vsplitPane); + hsplitPane.setOneTouchExpandable(true); + hsplitPane.setContinuousLayout(true); + hsplitPane.setResizeWeight(0.6); + pos = getpixelposition(hTreeFig); + + % Prepare the bottom pane with all buttons + lowerPanel = JPanel(FlowLayout); + blogUrlLabel = 'Undocumented
Matlab.com
'; + jWebsite = createJButton(blogUrlLabel, @btWebsite_Callback, 'Visit the UndocumentedMatlab.com blog'); + jWebsite.setContentAreaFilled(0); + lowerPanel.add(jWebsite); + lowerPanel.add(createJButton('Refresh
tree', {@btRefresh_Callback, origContainer, hTreeFig}, 'Rescan the component tree, from the root down')); + lowerPanel.add(createJButton('Export to
workspace', {@btExport_Callback, jTreeObj, classNameLabel}, 'Export the selected component handles to workspace variable findjobj_hdls')); + lowerPanel.add(createJButton('Request
focus', {@btFocus_Callback, jTreeObj, root}, 'Set the focus on the first selected component')); + lowerPanel.add(createJButton('Inspect
object', {@btInspect_Callback, jTreeObj, root}, 'View the signature of all methods supported by the first selected component')); + lowerPanel.add(createJButton('Check for
updates', {@btCheckFex_Callback}, 'Check the MathWorks FileExchange for the latest version of FindJObj')); + + % Display everything on-screen + globalPanel = JPanel(BorderLayout); + globalPanel.add(hsplitPane, BorderLayout.CENTER); + globalPanel.add(lowerPanel, BorderLayout.SOUTH); + [obj, hcontainer] = javacomponent(globalPanel, [0,0,pos(3:4)], hTreeFig); + set(hcontainer,'units','normalized'); + drawnow; + hsplitPane.setDividerLocation(hsplitPaneLocation); % this only works after the JSplitPane is displayed... + vsplitPane.setDividerLocation(vsplitPaneLocation); % this only works after the JSplitPane is displayed... + %restoreDbstopError(identifiers); + + % Refresh & resize the screenshot thumbnail +%disable for now, until we get it working... +%{ + try + hAx = axes('Parent',hTreeFig, 'units','pixels', 'position',[10,10,250,150], 'visible','off'); + axis(hAx,'image'); + image(cdata,'Parent',hAx); + axis(hAx,'off'); + set(hAx,'UserData',cdata); + set(imgPanel, 'ComponentResizedCallback',{@resizeImg, hAx}, 'UserData',lowerPanel); + imgPanel.getGraphics.drawImage(jImg, 0, 0, []); + catch + % Never mind... + end +%} + % If all handles were selected (i.e., none were filtered) then only select the first + if (length(selectedIdx) == length(allHandles)) && ~isempty(selectedIdx) + selectedIdx = 1; + end + + % Store handles for callback use + userdata.handles = allHandles; + userdata.levels = allLevels; + userdata.parents = allParents; + userdata.hg_handles = hg_handles; + userdata.hg_levels = hg_levels; + userdata.hg_parents = hg_parentIdx; + userdata.initialIdx = selectedIdx; + userdata.userSelected = false; % Indicates the user has modified the initial selections + userdata.inInit = true; + userdata.jTree = jTreeObj; + userdata.jTreePeer = tree_h; + userdata.vsplitPane = vsplitPane; + userdata.hsplitPane = hsplitPane; + userdata.classNameLabel = classNameLabel; + userdata.inspectorPane = inspectorPane; + userdata.callbacksTable = callbacksTable; + userdata.jideTableUtils = jideTableUtils; + try + userdata.cbHideStdCbs = jcb; + catch + userdata.cbHideStdCbs = []; + end + + % Update userdata for use in callbacks + try + set(tree_h,'userdata',userdata); + catch + setappdata(handle(tree_h),'userdata',userdata); + end + try + set(callbacksTable,'userdata',userdata); + catch + setappdata(callbacksTable,'userdata',userdata); + end + set(hTreeFig,'userdata',userdata); + + % Select the root node if requested + % Note: we must do so here since all other nodes except the root are processed by expandNode + if any(selectedIdx==1) + tree_h.setSelectedNode(root); + end + + % Set the initial cbHideStdCbs state + try + if jcb.isSelected + drawnow; + evd.getSource.isSelected = jcb.isSelected; + cbHideStdCbs_Callback(jcb,evd,callbacksTable); + end + catch + % never mind... + end + + % Set the callback functions + set(tree_hh, 'NodeExpandedCallback', {@nodeExpanded, tree_h}); + set(tree_hh, 'NodeSelectedCallback', {@nodeSelected, tree_h}); + + % Set the tree mouse-click callback + % Note: default actions (expand/collapse) will still be performed? + % Note: MousePressedCallback is better than MouseClickedCallback + % since it fires immediately when mouse button is pressed, + % without waiting for its release, as MouseClickedCallback does + handleTree = tree_h.getScrollPane; + jTreeObj = handleTree.getViewport.getComponent(0); + jTreeObjh = handle(jTreeObj,'CallbackProperties'); + set(jTreeObjh, 'MousePressedCallback', {@treeMousePressedCallback,tree_h}); % context (right-click) menu + set(jTreeObjh, 'MouseMovedCallback', @treeMouseMovedCallback); % mouse hover tooltips + + % Update userdata + userdata.inInit = false; + try + set(tree_h,'userdata',userdata); + catch + setappdata(handle(tree_h),'userdata',userdata); + end + set(hTreeFig,'userdata',userdata); + + % Pre-expand all rows + %treePane.setVisible(false); + expandNode(progressBar, jTreeObj, tree_h, root, 0); + %treePane.setVisible(true); + %jTreeObj.setVisible(1); + + % Hide the progressbar now that we've finished expanding all rows + try + hsplitPane.getLeftComponent.setTopComponent(treePane); + catch + % Probably not a vSplitPane on the left... + hsplitPane.setLeftComponent(treePane); + end + hsplitPane.setDividerLocation(hsplitPaneLocation); % need to do it again... + + % Set keyboard focus on the tree + jTreeObj.requestFocus; + drawnow; + + % Check for a newer version (only in non-deployed mode, and only twice a day) + if ~isdeployed && now-lastVersionCheck > 0.5 + checkVersion(); + lastVersionCheck = now; + end + + % Reset the last error + lasterr(''); %#ok + end + + %% Rresize image pane + function resizeImg(varargin) %#ok - unused (TODO: waiting for img placement fix...) + try + hPanel = varargin{1}; + hAx = varargin{3}; + lowerPanel = get(hPanel,'UserData'); + newJPos = cell2mat(get(hPanel,{'X','Y','Width','Height'})); + newMPos = [1,get(lowerPanel,'Height'),newJPos(3:4)]; + set(hAx, 'units','pixels', 'position',newMPos, 'Visible','on'); + uistack(hAx,'top'); % no good... + set(hPanel,'Opaque','off'); % also no good... + catch + % Never mind... + dispError + end + return; + end + + %% "dbstop if error" causes inspect.m to croak due to a bug - so workaround by temporarily disabling this dbstop + function identifiers = disableDbstopError + dbStat = dbstatus; + idx = find(strcmp({dbStat.cond},'error')); + identifiers = [dbStat(idx).identifier]; + if ~isempty(idx) + dbclear if error; + msgbox('''dbstop if error'' had to be disabled due to a Matlab bug that would have caused Matlab to crash.', 'FindJObj', 'warn'); + end + end + + %% Restore any previous "dbstop if error" + function restoreDbstopError(identifiers) %#ok + for itemIdx = 1 : length(identifiers) + eval(['dbstop if error ' identifiers{itemIdx}]); + end + end + + %% Recursively expand all nodes (except toolbar/menubar) in startup + function expandNode(progressBar, tree, tree_h, parentNode, parentRow) + try + if nargin < 5 + parentPath = javax.swing.tree.TreePath(parentNode.getPath); + parentRow = tree.getRowForPath(parentPath); + end + tree.expandRow(parentRow); + progressBar.setValue(progressBar.getValue+1); + numChildren = parentNode.getChildCount; + if (numChildren == 0) + pause(0.0002); % as short as possible... + drawnow; + end + nodesToUnExpand = {'FigureMenuBar','MLMenuBar','MJToolBar','Box','uimenu','uitoolbar','ScrollBar'}; + numChildren = parentNode.getChildCount; + for childIdx = 0 : numChildren-1 + childNode = parentNode.getChildAt(childIdx); + + % Pre-select the node based upon the user's FINDJOBJ filters + try + nodedata = get(childNode, 'userdata'); + try + userdata = get(tree_h, 'userdata'); + catch + userdata = getappdata(handle(tree_h), 'userdata'); + end + %fprintf('%d - %s\n',nodedata.idx,char(nodedata.obj)) + if ~ishghandle(nodedata.obj) && ~userdata.userSelected && any(userdata.initialIdx == nodedata.idx) + pause(0.0002); % as short as possible... + drawnow; + if isempty(tree_h.getSelectedNodes) + tree_h.setSelectedNode(childNode); + else + newSelectedNodes = [tree_h.getSelectedNodes, childNode]; + tree_h.setSelectedNodes(newSelectedNodes); + end + end + catch + % never mind... + dispError + end + + % Expand child node if not leaf & not toolbar/menubar + if childNode.isLeafNode + + % This is a leaf node, so simply update the progress-bar + progressBar.setValue(progressBar.getValue+1); + + else + % Expand all non-leaves + expandNode(progressBar, tree, tree_h, childNode); + + % Re-collapse toolbar/menubar etc., and also invisible containers + % Note: if we simply did nothing, progressbar would not have been updated... + try + childHandle = getappdata(childNode,'childHandle'); %=childNode.getUserObject + visible = childHandle.isVisible; + catch + visible = 1; + end + visible = visible && isempty(findstr(get(childNode,'Name'),'color="gray"')); + %if any(strcmp(childNode.getName,nodesToUnExpand)) + %name = char(childNode.getName); + if any(cellfun(@(s)~isempty(strmatch(s,char(childNode.getName))),nodesToUnExpand)) || ~visible + childPath = javax.swing.tree.TreePath(childNode.getPath); + childRow = tree.getRowForPath(childPath); + tree.collapseRow(childRow); + end + end + end + catch + % never mind... + dispError + end + end + + %% Create utility buttons + function hButton = createJButton(nameStr, handler, toolTipText) + try + jButton = javax.swing.JButton(['
' nameStr]); + jButton.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.HAND_CURSOR)); + jButton.setToolTipText(toolTipText); + try + minSize = jButton.getMinimumSize; + catch + minSize = jButton.getMinimumSize; % for HG2 - strange indeed that this is needed! + end + jButton.setMinimumSize(java.awt.Dimension(minSize.getWidth,35)); + hButton = handle(jButton,'CallbackProperties'); + set(hButton,'ActionPerformedCallback',handler); + catch + % Never mind... + a= 1; + end + end + + %% Flash a component off/on for the specified duration + % note: starts with 'on'; if numTimes is odd then ends with 'on', otherwise with 'off' + function flashComponent(jComps,delaySecs,numTimes) + persistent redBorder redBorderPanels + try + % Handle callback data from right-click (context-menu) + if iscell(numTimes) + [jComps,delaySecs,numTimes] = deal(numTimes{:}); + end + + if isempty(redBorder) % reuse if possible + redBorder = javax.swing.border.LineBorder(java.awt.Color.red,2,0); + end + for compIdx = 1 : length(jComps) + try + oldBorder{compIdx} = jComps(compIdx).getBorder; %#ok grow + catch + oldBorder{compIdx} = []; %#ok grow + end + isSettable(compIdx) = ismethod(jComps(compIdx),'setBorder'); %#ok grow + if isSettable(compIdx) + try + % some components prevent border modification: + oldBorderFlag = jComps(compIdx).isBorderPainted; + if ~oldBorderFlag + jComps(compIdx).setBorderPainted(1); + isSettable(compIdx) = jComps(compIdx).isBorderPainted; %#ok grow + jComps(compIdx).setBorderPainted(oldBorderFlag); + end + catch + % do nothing... + end + end + if compIdx > length(redBorderPanels) + redBorderPanels{compIdx} = javax.swing.JPanel; + redBorderPanels{compIdx}.setBorder(redBorder); + redBorderPanels{compIdx}.setOpaque(0); % transparent interior, red border + end + try + redBorderPanels{compIdx}.setBounds(jComps(compIdx).getBounds); + catch + % never mind - might be an HG handle + end + end + for idx = 1 : 2*numTimes + if idx>1, pause(delaySecs); end % don't pause at start + visible = mod(idx,2); + for compIdx = 1 : length(jComps) + try + jComp = jComps(compIdx); + + % Prevent Matlab crash (java buffer overflow...) + if isa(jComp,'com.mathworks.mwswing.desk.DTSplitPane') || ... + isa(jComp,'com.mathworks.mwswing.MJSplitPane') + continue; + + % HG handles are highlighted by setting their 'Selected' property + elseif isa(jComp,'uimenu') || isa(jComp,'matlab.ui.container.Menu') + if visible + oldColor = get(jComp,'ForegroundColor'); + setappdata(jComp,'findjobj_oldColor',oldColor); + set(jComp,'ForegroundColor','red'); + else + oldColor = getappdata(jComp,'findjobj_oldColor'); + set(jComp,'ForegroundColor',oldColor); + rmappdata(jComp,'ForegroundColor'); + end + + elseif ishghandle(jComp) + if visible + set(jComp,'Selected','on'); + else + set(jComp,'Selected','off'); + end + + else %if isjava(jComp) + + jParent = jComps(compIdx).getParent; + + % Most Java components allow modifying their borders + if isSettable(compIdx) + if visible + jComp.setBorder(redBorder); + try jComp.setBorderPainted(1); catch, end %#ok + else %if ~isempty(oldBorder{compIdx}) + jComp.setBorder(oldBorder{compIdx}); + end + jComp.repaint; + + % The other Java components are highlighted by a transparent red-border + % panel that is placed on top of them in their parent's space + elseif ~isempty(jParent) + if visible + jParent.add(redBorderPanels{compIdx}); + jParent.setComponentZOrder(redBorderPanels{compIdx},0); + else + jParent.remove(redBorderPanels{compIdx}); + end + jParent.repaint + end + end + catch + % never mind - try the next component (if any) + end + end + drawnow; + end + catch + % never mind... + dispError; + end + return; % debug point + end % flashComponent + + %% Select tree node + function nodeSelected(src, evd, tree) %#ok + try + if iscell(tree) + [src,node] = deal(tree{:}); + else + node = evd.getCurrentNode; + end + %nodeHandle = node.getUserObject; + nodedata = get(node,'userdata'); + nodeHandle = nodedata.obj; + try + userdata = get(src,'userdata'); + catch + try + userdata = getappdata(java(src),'userdata'); + catch + userdata = getappdata(src,'userdata'); + end + if isempty(userdata) + try userdata = get(java(src),'userdata'); catch, end + end + end + if ~isempty(nodeHandle) && ~isempty(userdata) + numSelections = userdata.jTree.getSelectionCount; + selectionPaths = userdata.jTree.getSelectionPaths; + if (numSelections == 1) + % Indicate that the user has modified the initial selection (except if this was an initial auto-selected node) + if ~userdata.inInit + userdata.userSelected = true; + try + set(src,'userdata',userdata); + catch + try + setappdata(java(src),'userdata',userdata); + catch + setappdata(src,'userdata',userdata); + end + end + end + + % Update the fully-qualified class name label + numInitialIdx = length(userdata.initialIdx); + thisHandle = nodeHandle; + try + if ~ishghandle(thisHandle) + thisHandle = java(nodeHandle); + end + catch + % never mind... + end + if ~userdata.inInit || (numInitialIdx == 1) + userdata.classNameLabel.setText([' ' char(class(thisHandle))]); + else + userdata.classNameLabel.setText([' ' num2str(numInitialIdx) 'x handles (some handles hidden by unexpanded tree nodes)']); + end + if ishghandle(thisHandle) + userdata.classNameLabel.setText(userdata.classNameLabel.getText.concat(' (HG handle)')); + end + userdata.inspectorPane.dispose; % remove props listeners - doesn't work... + updateNodeTooltip(nodeHandle, userdata.classNameLabel); + + % Update the data properties inspector pane + % Note: we can't simply use the evd nodeHandle, because this node might have been DE-selected with only one other node left selected... + %nodeHandle = selectionPaths(1).getLastPathComponent.getUserObject; + nodedata = get(selectionPaths(1).getLastPathComponent,'userdata'); + nodeHandle = nodedata.obj; + %identifiers = disableDbstopError; % "dbstop if error" causes inspect.m to croak due to a bug - so workaround + userdata.inspectorPane.setObject(thisHandle); + + % Update the callbacks table + try + stripStdCbsFlag = getappdata(userdata.callbacksTable,'hideStdCbs'); + [cbData, cbHeaders, cbTableEnabled] = getCbsData(nodeHandle, stripStdCbsFlag); %#ok cbTableEnabled unused + try + % Use JideTable if available on this system + list = getTreeData(cbData); %#ok + callbacksTableModel = eval('com.jidesoft.grid.PropertyTableModel(list);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + % Expand if only one category + if length(callbacksTableModel.getCategories)==1 + callbacksTableModel.expandFirstLevel; + end + catch + callbacksTableModel = javax.swing.table.DefaultTableModel(cbData,cbHeaders); + end + set(handle(callbacksTableModel,'CallbackProperties'), 'TableChangedCallback',{@tbCallbacksChanged,nodeHandle,userdata.callbacksTable}); + %set(callbacksTableModel, 'UserData',nodeHandle); + userdata.callbacksTable.setModel(callbacksTableModel) + userdata.callbacksTable.setRowAutoResizes(true); + userdata.jideTableUtils.autoResizeAllColumns(userdata.callbacksTable); + catch + % never mind... + %dispError + end + pause(0.005); + drawnow; + %restoreDbstopError(identifiers); + + % Highlight the selected object (if visible) + flashComponent(nodeHandle,0.2,3); + + elseif (numSelections > 1) % Multiple selections + + % Get the list of all selected nodes + jArray = javaArray('java.lang.Object', numSelections); + toolTipStr = ''; + sameClassFlag = true; + for idx = 1 : numSelections + %jArray(idx) = selectionPaths(idx).getLastPathComponent.getUserObject; + nodedata = get(selectionPaths(idx).getLastPathComponent,'userdata'); + try + if ishghandle(nodedata.obj) + if idx==1 + jArray = nodedata.obj; + else + jArray(idx) = nodedata.obj; + end + else + jArray(idx) = java(nodedata.obj); + end + catch + jArray(idx) = nodedata.obj; + end + toolTipStr = [toolTipStr ' ' class(jArray(idx)) ' ']; %#ok grow + if (idx < numSelections), toolTipStr = [toolTipStr '
']; end %#ok grow + try + if (idx > 1) && sameClassFlag && ~isequal(jArray(idx).getClass,jArray(1).getClass) + sameClassFlag = false; + end + catch + if (idx > 1) && sameClassFlag && ~isequal(class(jArray(idx)),class(jArray(1))) + sameClassFlag = false; + end + end + end + toolTipStr = [toolTipStr '']; + + % Update the fully-qualified class name label + if sameClassFlag + classNameStr = class(jArray(1)); + else + classNameStr = 'handle'; + end + if all(ishghandle(jArray)) + if strcmp(classNameStr,'handle') + classNameStr = 'HG handles'; + else + classNameStr = [classNameStr ' (HG handles)']; + end + end + classNameStr = [' ' num2str(numSelections) 'x ' classNameStr]; + userdata.classNameLabel.setText(classNameStr); + userdata.classNameLabel.setToolTipText(toolTipStr); + + % Update the data properties inspector pane + %identifiers = disableDbstopError; % "dbstop if error" causes inspect.m to croak due to a bug - so workaround + if isjava(jArray) + jjArray = jArray; + else + jjArray = javaArray('java.lang.Object', numSelections); + for idx = 1 : numSelections + jjArray(idx) = java(jArray(idx)); + end + end + userdata.inspectorPane.getRegistry.setSelected(jjArray, true); + + % Update the callbacks table + try + % Get intersecting callback names & values + stripStdCbsFlag = getappdata(userdata.callbacksTable,'hideStdCbs'); + [cbData, cbHeaders, cbTableEnabled] = getCbsData(jArray(1), stripStdCbsFlag); %#ok cbHeaders & cbTableEnabled unused + if ~isempty(cbData) + cbNames = cbData(:,1); + for idx = 2 : length(jArray) + [cbData2, cbHeaders2] = getCbsData(jArray(idx), stripStdCbsFlag); %#ok cbHeaders2 unused + if ~isempty(cbData2) + newCbNames = cbData2(:,1); + [cbNames, cbIdx, cb2Idx] = intersect(cbNames,newCbNames); %#ok cb2Idx unused + cbData = cbData(cbIdx,:); + for cbIdx = 1 : length(cbNames) + newIdx = find(strcmp(cbNames{cbIdx},newCbNames)); + if ~isequal(cbData2,cbData) && ~isequal(cbData2{newIdx,2}, cbData{cbIdx,2}) + cbData{cbIdx,2} = ''; + end + end + else + cbData = cbData([],:); %=empty cell array + end + if isempty(cbData) + break; + end + end + end + cbHeaders = {'Callback name','Callback value'}; + try + % Use JideTable if available on this system + list = getTreeData(cbData); %#ok + callbacksTableModel = eval('com.jidesoft.grid.PropertyTableModel(list);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + % Expand if only one category + if length(callbacksTableModel.getCategories)==1 + callbacksTableModel.expandFirstLevel; + end + catch + callbacksTableModel = javax.swing.table.DefaultTableModel(cbData,cbHeaders); + end + set(handle(callbacksTableModel,'CallbackProperties'), 'TableChangedCallback',{@tbCallbacksChanged,jArray,userdata.callbacksTable}); + %set(callbacksTableModel, 'UserData',jArray); + userdata.callbacksTable.setModel(callbacksTableModel) + userdata.callbacksTable.setRowAutoResizes(true); + userdata.jideTableUtils.autoResizeAllColumns(userdata.callbacksTable); + catch + % never mind... + dispError + end + + pause(0.005); + drawnow; + %restoreDbstopError(identifiers); + + % Highlight the selected objects (if visible) + flashComponent(jArray,0.2,3); + end + + % TODO: Auto-highlight selected object (?) + %nodeHandle.requestFocus; + end + catch + dispError + end + end + + %% IFF utility function for annonymous cellfun funcs + function result = iff(test,trueVal,falseVal) %#ok + try + if test + result = trueVal; + else + result = falseVal; + end + catch + result = false; + end + end + + %% Get an HTML representation of the object's properties + function dataFieldsStr = getPropsHtml(nodeHandle, dataFields) + try + % Get a text representation of the fieldnames & values + undefinedStr = ''; + hiddenStr = ''; + dataFieldsStr = ''; % just in case the following croaks... + if isempty(dataFields) + return; + end + dataFieldsStr = evalc('disp(dataFields)'); + if dataFieldsStr(end)==char(10), dataFieldsStr=dataFieldsStr(1:end-1); end + + % Strip out callbacks + dataFieldsStr = regexprep(dataFieldsStr,'^\s*\w*Callback(Data)?:[^\n]*$','','lineanchors'); + + % Strip out internal HG2 mirror properties + dataFieldsStr = regexprep(dataFieldsStr,'^\s*\w*_I:[^\n]*$','','lineanchors'); + dataFieldsStr = regexprep(dataFieldsStr,'\n\n+','\n'); + + % Sort the fieldnames + %fieldNames = fieldnames(dataFields); + try + [a,b,c,d] = regexp(dataFieldsStr,'(\w*): '); + fieldNames = strrep(d,': ',''); + catch + fieldNames = fieldnames(dataFields); + end + try + [fieldNames, sortedIdx] = sort(fieldNames); + s = strsplit(dataFieldsStr, sprintf('\n'))'; + dataFieldsStr = strjoin(s(sortedIdx), sprintf('\n')); + catch + % never mind... - ignore, leave unsorted + end + + % Convert into a Matlab handle() + %nodeHandle = handle(nodeHandle); + try + % ensure this is a Matlab handle, not a java object + nodeHandle = handle(nodeHandle, 'CallbackProperties'); + catch + try + % HG handles don't allow CallbackProperties... + nodeHandle = handle(nodeHandle); + catch + % Some Matlab class objects simply cannot be converted into a handle() + end + end + + % HTMLize tooltip data + % First, set the fields' font based on its read-write status + for fieldIdx = 1 : length(fieldNames) + thisFieldName = fieldNames{fieldIdx}; + %accessFlags = get(findprop(nodeHandle,thisFieldName),'AccessFlags'); + try + hProp = findprop(nodeHandle,thisFieldName); + accessFlags = get(hProp,'AccessFlags'); + visible = get(hProp,'Visible'); + catch + accessFlags = []; + visible = 'on'; + try if hProp.Hidden, visible='off'; end, catch, end + end + %if isfield(accessFlags,'PublicSet') && strcmp(accessFlags.PublicSet,'on') + if (~isempty(hProp) && isprop(hProp,'SetAccess') && isequal(hProp.SetAccess,'public')) || ... % isequal(...'public') and not strcmpi(...) because might be a cell array of classes + (~isempty(accessFlags) && isfield(accessFlags,'PublicSet') && strcmpi(accessFlags.PublicSet,'on')) + % Bolden read/write fields + thisFieldFormat = ['' thisFieldName ':$2']; + %elseif ~isfield(accessFlags,'PublicSet') + elseif (isempty(hProp) || ~isprop(hProp,'SetAccess')) && ... + (isempty(accessFlags) || ~isfield(accessFlags,'PublicSet')) + % Undefined - probably a Matlab-defined field of com.mathworks.hg.peer.FigureFrameProxy... + thisFieldFormat = ['' thisFieldName ':$2']; + undefinedStr = ', undefined'; + else % PublicSet=='off' + % Gray-out & italicize any read-only fields + thisFieldFormat = ['' thisFieldName ':$2']; + end + if strcmpi(visible,'off') + %thisFieldFormat = ['' thisFieldFormat '']; %#ok + thisFieldFormat = regexprep(thisFieldFormat, {'(.*):(.*)','<.?b>'}, {'$1:$2',''}); %'(.*):(.*)', '$1:$2'); + hiddenStr = ', hidden'; + end + dataFieldsStr = regexprep(dataFieldsStr, ['([\s\n])' thisFieldName ':([^\n]*)'], ['$1' thisFieldFormat]); + end + catch + % never mind... - probably an ambiguous property name + %dispError + end + + % Method 1: simple
list + %dataFieldsStr = strrep(dataFieldsStr,char(10),' 
  '); + + % Method 2: 2-column + dataFieldsStr = regexprep(dataFieldsStr, '^\s*([^:]+:)([^\n]*)\n^\s*([^:]+:)([^\n]*)$', '', 'lineanchors'); + dataFieldsStr = regexprep(dataFieldsStr, '^[^<]\s*([^:]+:)([^\n]*)$', '', 'lineanchors'); + dataFieldsStr = ['(documented' undefinedStr hiddenStr ' & read-only fields)

  

 $1 $2    $3 $4 
 $1 $2  
' dataFieldsStr '
']; + end + + %% Update tooltip string with a node's data + function updateNodeTooltip(nodeHandle, uiObject) + try + toolTipStr = class(nodeHandle); + dataFieldsStr = ''; + + % Add HG annotation if relevant + if ishghandle(nodeHandle) + hgStr = ' HG Handle'; + else + hgStr = ''; + end + + % Prevent HG-Java warnings + oldWarn = warning('off','MATLAB:hg:JavaSetHGProperty'); + warning('off','MATLAB:hg:PossibleDeprecatedJavaSetHGProperty'); + warning('off','MATLAB:hg:Root'); + + % Note: don't bulk-get because (1) not all properties are returned & (2) some properties cause a Java exception + % Note2: the classhandle approach does not enable access to user-defined schema.props + ch = classhandle(handle(nodeHandle)); + dataFields = []; + [sortedNames, sortedIdx] = sort(get(ch.Properties,'Name')); + for idx = 1 : length(sortedIdx) + sp = ch.Properties(sortedIdx(idx)); + % TODO: some fields (see EOL comment below) generate a Java Exception from: com.mathworks.mlwidgets.inspector.PropertyRootNode$PropertyListener$1$1.run + if strcmp(sp.AccessFlags.PublicGet,'on') % && ~any(strcmp(sp.Name,{'FixedColors','ListboxTop','Extent'})) + try + dataFields.(sp.Name) = get(nodeHandle, sp.Name); + catch + dataFields.(sp.Name) = 'Error!'; + end + else + dataFields.(sp.Name) = '(no public getter method)'; + end + end + dataFieldsStr = getPropsHtml(nodeHandle, dataFields); + catch + % Probably a non-HG java object + try + % Note: the bulk-get approach enables access to user-defined schema-props, but not to some original classhandle Properties... + try + oldWarn3 = warning('off','MATLAB:structOnObject'); + dataFields = struct(nodeHandle); + warning(oldWarn3); + catch + dataFields = get(nodeHandle); + end + dataFieldsStr = getPropsHtml(nodeHandle, dataFields); + catch + % Probably a missing property getter implementation + try + % Inform the user - bail out on error + err = lasterror; %#ok + dataFieldsStr = ['

' strrep(err.message, char(10), '
')]; + catch + % forget it... + end + end + end + + % Restore warnings + try warning(oldWarn); catch, end + + % Set the object tooltip + if ~isempty(dataFieldsStr) + toolTipStr = [' ' char(toolTipStr) '' hgStr ': ' dataFieldsStr '']; + end + uiObject.setToolTipText(toolTipStr); + end + + %% Expand tree node + function nodeExpanded(src, evd, tree) %#ok + % tree = handle(src); + % evdsrc = evd.getSource; + evdnode = evd.getCurrentNode; + + if ~tree.isLoaded(evdnode) + + % Get the list of children TreeNodes + childnodes = getChildrenNodes(tree, evdnode); + + % Add the HG sub-tree (unless already included in the first tree) + childHandle = getappdata(evdnode.handle,'childHandle'); %=evdnode.getUserObject + if evdnode.isRoot && ~isempty(hg_handles) && ~isequal(hg_handles(1).java, childHandle) + childnodes = [childnodes, getChildrenNodes(tree, evdnode, true)]; + end + + % If we have a single child handle, wrap it within a javaArray for tree.add() to "swallow" + if (length(childnodes) == 1) + chnodes = childnodes; + childnodes = javaArray('com.mathworks.hg.peer.UITreeNode', 1); + childnodes(1) = java(chnodes); + end + + % Add child nodes to the current node + tree.add(evdnode, childnodes); + tree.setLoaded(evdnode, true); + end + end + + %% Get an icon image no larger than 16x16 pixels + function iconImage = setIconSize(iconImage) + try + iconWidth = iconImage.getWidth; + iconHeight = iconImage.getHeight; + if iconWidth > 16 + newHeight = fix(iconHeight * 16 / iconWidth); + iconImage = iconImage.getScaledInstance(16,newHeight,iconImage.SCALE_SMOOTH); + elseif iconHeight > 16 + newWidth = fix(iconWidth * 16 / iconHeight); + iconImage = iconImage.getScaledInstance(newWidth,16,iconImage.SCALE_SMOOTH); + end + catch + % never mind... - return original icon + end + end % setIconSize + + %% Get list of children nodes + function nodes = getChildrenNodes(tree, parentNode, isRootHGNode) + try + iconpath = [matlabroot, '/toolbox/matlab/icons/']; + nodes = handle([]); + try + userdata = get(tree,'userdata'); + catch + userdata = getappdata(handle(tree),'userdata'); + end + hdls = userdata.handles; + nodedata = get(parentNode,'userdata'); + if nargin < 3 + %isJavaNode = ~ishghandle(parentNode.getUserObject); + isJavaNode = ~ishghandle(nodedata.obj); + isRootHGNode = false; + else + isJavaNode = ~isRootHGNode; + end + + % Search for this parent node in the list of all nodes + parents = userdata.parents; + nodeIdx = nodedata.idx; + + if isJavaNode && isempty(nodeIdx) % Failback, in case userdata doesn't work for some reason... + for hIdx = 1 : length(hdls) + %if isequal(handle(parentNode.getUserObject), hdls(hIdx)) + if isequal(handle(nodedata.obj), hdls(hIdx)) + nodeIdx = hIdx; + break; + end + end + end + if ~isJavaNode + if isRootHGNode % =root HG node + thisChildHandle = userdata.hg_handles(1); + childName = getNodeName(thisChildHandle); + hasGrandChildren = any(parents==1); + icon = []; + if hasGrandChildren && length(hg_handles)>1 + childName = childName.concat(' - HG root container'); + icon = [iconpath 'figureicon.gif']; + end + try + nodes = uitreenode('v0', thisChildHandle, childName, icon, ~hasGrandChildren); + catch % old matlab version don't have the 'v0' option + try + nodes = uitreenode(thisChildHandle, childName, icon, ~hasGrandChildren); + catch + % probably an invalid handle - ignore... + end + end + + % Add the handler to the node's internal data + % Note: could also use 'userdata', but setUserObject() is recommended for TreeNodes + % Note2: however, setUserObject() sets a java *BeenAdapter object for HG handles instead of the required original class, so use setappdata + %nodes.setUserObject(thisChildHandle); + setappdata(nodes,'childHandle',thisChildHandle); + nodedata.idx = 1; + nodedata.obj = thisChildHandle; + set(nodes,'userdata',nodedata); + return; + else % non-root HG node + parents = userdata.hg_parents; + hdls = userdata.hg_handles; + end % if isRootHGNode + end % if ~isJavaNode + + % If this node was found, get the list of its children + if ~isempty(nodeIdx) + %childIdx = setdiff(find(parents==nodeIdx),nodeIdx); + childIdx = find(parents==nodeIdx); + childIdx(childIdx==nodeIdx) = []; % faster... + numChildren = length(childIdx); + for cIdx = 1 : numChildren + thisChildIdx = childIdx(cIdx); + try thisChildHandle = hdls(thisChildIdx); catch, continue, end + childName = getNodeName(thisChildHandle); + try + visible = thisChildHandle.Visible; + if visible + try visible = thisChildHandle.Width > 0; catch, end %#ok + end + if ~visible + childName = ['' char(childName) '']; %#ok grow + end + catch + % never mind... + end + hasGrandChildren = any(parents==thisChildIdx); + try + isaLabel = isa(thisChildHandle.java,'javax.swing.JLabel'); + catch + isaLabel = 0; + end + if hasGrandChildren && ~any(strcmp(class(thisChildHandle),{'axes'})) + icon = [iconpath 'foldericon.gif']; + elseif isaLabel + icon = [iconpath 'tool_text.gif']; + else + icon = []; + end + try + nodes(cIdx) = uitreenode('v0', thisChildHandle, childName, icon, ~hasGrandChildren); + catch % old matlab version don't have the 'v0' option + try + nodes(cIdx) = uitreenode(thisChildHandle, childName, icon, ~hasGrandChildren); + catch + % probably an invalid handle - ignore... + end + end + + % Use existing object icon, if available + try + setTreeNodeIcon(nodes(cIdx),thisChildHandle); + catch + % probably an invalid handle - ignore... + end + + % Pre-select the node based upon the user's FINDJOBJ filters + try + if isJavaNode && ~userdata.userSelected && any(userdata.initialIdx == thisChildIdx) + pause(0.0002); % as short as possible... + drawnow; + if isempty(tree.getSelectedNodes) + tree.setSelectedNode(nodes(cIdx)); + else + newSelectedNodes = [tree.getSelectedNodes, nodes(cIdx).java]; + tree.setSelectedNodes(newSelectedNodes); + end + end + catch + % never mind... + end + + % Add the handler to the node's internal data + % Note: could also use 'userdata', but setUserObject() is recommended for TreeNodes + % Note2: however, setUserObject() sets a java *BeenAdapter object for HG handles instead of the required original class, so use setappdata + % Note3: the following will error if invalid handle - ignore + try + if isJavaNode + thisChildHandle = thisChildHandle.java; + end + %nodes(cIdx).setUserObject(thisChildHandle); + setappdata(nodes(cIdx),'childHandle',thisChildHandle); + nodedata.idx = thisChildIdx; + nodedata.obj = thisChildHandle; + set(nodes(cIdx),'userdata',nodedata); + catch + % never mind (probably an invalid handle) - leave unchanged (like a leaf) + end + end + end + catch + % Never mind - leave unchanged (like a leaf) + %error('YMA:findjobj:UnknownNodeType', 'Error expanding component tree node'); + dispError + end + end + + %% Get a node's name + function [nodeName, nodeTitle] = getNodeName(hndl,charsLimit) + try + % Initialize (just in case one of the succeding lines croaks) + nodeName = ''; + nodeTitle = ''; + if ~ismethod(hndl,'getClass') + try + nodeName = class(hndl); + catch + nodeName = hndl.type; % last-ditch try... + end + else + nodeName = hndl.getClass.getSimpleName; + end + + % Strip away the package name, leaving only the regular classname + if ~isempty(nodeName) && ischar(nodeName) + nodeName = java.lang.String(nodeName); + nodeName = nodeName.substring(nodeName.lastIndexOf('.')+1); + end + if (nodeName.length == 0) + % fix case of anonymous internal classes, that do not have SimpleNames + try + nodeName = hndl.getClass.getName; + nodeName = nodeName.substring(nodeName.lastIndexOf('.')+1); + catch + % never mind - leave unchanged... + end + end + + % Get any unique identifying string (if available in one of several fields) + labelsToCheck = {'label','title','text','string','displayname','toolTipText','TooltipString','actionCommand','name','Tag','style'}; %,'UIClassID'}; + nodeTitle = ''; + strField = ''; %#ok - used for debugging + while ((~isa(nodeTitle,'java.lang.String') && ~ischar(nodeTitle)) || isempty(nodeTitle)) && ~isempty(labelsToCheck) + try + nodeTitle = get(hndl,labelsToCheck{1}); + strField = labelsToCheck{1}; %#ok - used for debugging + catch + % never mind - probably missing prop, so skip to next one + end + labelsToCheck(1) = []; + end + if length(nodeTitle) ~= numel(nodeTitle) + % Multi-line - convert to a long single line + nodeTitle = nodeTitle'; + nodeTitle = nodeTitle(:)'; + end + if isempty(char(nodeTitle)) + % No title - check whether this is an HG label whose text is gettable + try + location = hndl.getLocationOnScreen; + pos = [location.getX, location.getY, hndl.getWidth, hndl.getHeight]; + %dist = sum((labelPositions-repmat(pos,size(labelPositions,1),[1,1,1,1])).^2, 2); + dist = sum((labelPositions-repmat(pos,[size(labelPositions,1),1])).^2, 2); + [minVal,minIdx] = min(dist); + % Allow max distance of 8 = 2^2+2^2 (i.e. X&Y off by up to 2 pixels, W&H exact) + if minVal <= 8 % 8=2^2+2^2 + nodeTitle = get(hg_labels(minIdx),'string'); + % Preserve the label handles & position for the tooltip & context-menu + %hg_labels(minIdx) = []; + %labelPositions(minIdx,:) = []; + end + catch + % never mind... + end + end + if nargin<2, charsLimit = 25; end + extraStr = regexprep(nodeTitle,{sprintf('(.{%d,%d}).*',charsLimit,min(charsLimit,length(nodeTitle)-1)),' +'},{'$1...',' '},'once'); + if ~isempty(extraStr) + if ischar(extraStr) + nodeName = nodeName.concat(' (''').concat(extraStr).concat(''')'); + else + nodeName = nodeName.concat(' (').concat(num2str(extraStr)).concat(')'); + end + %nodeName = nodeName.concat(strField); + end + catch + % Never mind - use whatever we have so far + %dispError + end + end + + %% Strip standard Swing callbacks from a list of events + function evNames = stripStdCbs(evNames) + try + stdEvents = {'AncestorAdded', 'AncestorMoved', 'AncestorRemoved', 'AncestorResized', ... + 'ComponentAdded', 'ComponentRemoved', 'ComponentHidden', ... + 'ComponentMoved', 'ComponentResized', 'ComponentShown', ... + 'FocusGained', 'FocusLost', 'HierarchyChanged', ... + 'KeyPressed', 'KeyReleased', 'KeyTyped', ... + 'MouseClicked', 'MouseDragged', 'MouseEntered', 'MouseExited', ... + 'MouseMoved', 'MousePressed', 'MouseReleased', 'MouseWheelMoved', ... + 'PropertyChange', 'VetoableChange', ... + 'CaretPositionChanged', 'InputMethodTextChanged', ... + 'ButtonDown', 'Create', 'Delete'}; + stdEvents = [stdEvents, strcat(stdEvents,'Callback'), strcat(stdEvents,'Fcn')]; + evNames = setdiff(evNames,stdEvents)'; + catch + % Never mind... + dispError + end + end + + %% Callback function for checkbox + function cbHideStdCbs_Callback(src, evd, callbacksTable, varargin) %#ok + try + % Store the current checkbox value for later use + if nargin < 3 + try + callbacksTable = get(src,'userdata'); + catch + callbacksTable = getappdata(src,'userdata'); + end + end + if evd.getSource.isSelected + setappdata(callbacksTable,'hideStdCbs',1); + else + setappdata(callbacksTable,'hideStdCbs',[]); + end + + % Rescan the current node + try + userdata = get(callbacksTable,'userdata'); + catch + userdata = getappdata(callbacksTable,'userdata'); + end + nodepath = userdata.jTree.getSelectionModel.getSelectionPath; + try + ed.getCurrentNode = nodepath.getLastPathComponent; + nodeSelected(handle(userdata.jTreePeer),ed,[]); + catch + % ignore - probably no node selected + end + catch + % Never mind... + dispError + end + end + + %% Callback function for button + function btWebsite_Callback(src, evd, varargin) %#ok + try + web('http://UndocumentedMatlab.com','-browser'); + catch + % Never mind... + dispError + end + end + + %% Callback function for button + function btRefresh_Callback(src, evd, varargin) %#ok + try + % Set cursor shape to hourglass until we're done + hTreeFig = varargin{2}; + set(hTreeFig,'Pointer','watch'); + drawnow; + object = varargin{1}; + + % Re-invoke this utility to re-scan the container for all children + findjobj(object); + catch + % Never mind... + end + + % Restore default cursor shape + set(hTreeFig,'Pointer','arrow'); + end + + %% Callback function for button + function btExport_Callback(src, evd, varargin) %#ok + try + % Get the list of all selected nodes + if length(varargin) > 1 + jTree = varargin{1}; + numSelections = jTree.getSelectionCount; + selectionPaths = jTree.getSelectionPaths; + hdls = handle([]); + for idx = 1 : numSelections + %hdls(idx) = handle(selectionPaths(idx).getLastPathComponent.getUserObject); + nodedata = get(selectionPaths(idx).getLastPathComponent,'userdata'); + try + hdls(idx) = handle(nodedata.obj,'CallbackProperties'); + catch + if idx==1 % probably due to HG2: can't convert object to handle([]) + hdls = nodedata.obj; + else + hdls(idx) = nodedata.obj; + end + end + end + + % Assign the handles in the base workspace & inform user + assignin('base','findjobj_hdls',hdls); + classNameLabel = varargin{2}; + msg = ['Exported ' char(classNameLabel.getText.trim) ' to base workspace variable findjobj_hdls']; + else + % Right-click (context-menu) callback + data = varargin{1}; + obj = data{1}; + varName = data{2}; + if isempty(varName) + varName = inputdlg('Enter workspace variable name','FindJObj'); + if isempty(varName), return; end % bail out on + varName = varName{1}; + if isempty(varName) || ~ischar(varName), return; end % bail out on empty/null + varName = genvarname(varName); + end + assignin('base',varName,handle(obj,'CallbackProperties')); + msg = ['Exported object to base workspace variable ' varName]; + end + msgbox(msg,'FindJObj','help'); + catch + % Never mind... + dispError + end + end + + %% Callback function for button + function btFocus_Callback(src, evd, varargin) %#ok + try + % Request focus for the specified object + object = getTopSelectedObject(varargin{:}); + object.requestFocus; + catch + try + object = object.java.getPeer.requestFocus; + object.requestFocus; + catch + % Never mind... + %dispError + end + end + end + + %% Callback function for button + function btInspect_Callback(src, evd, varargin) %#ok + try + % Inspect the specified object + if length(varargin) == 1 + object = varargin{1}; + else + object = getTopSelectedObject(varargin{:}); + end + if isempty(which('uiinspect')) + + % If the user has not indicated NOT to be informed about UIInspect + if ~ispref('FindJObj','dontCheckUIInspect') + + % Ask the user whether to download UIINSPECT (YES, no, no & don't ask again) + answer = questdlg({'The object inspector requires UIINSPECT from the MathWorks File Exchange. UIINSPECT was created by Yair Altman, like this FindJObj utility.','','Download & install UIINSPECT?'},'UIInspect','Yes','No','No & never ask again','Yes'); + switch answer + case 'Yes' % => Yes: download & install + try + % Download UIINSPECT + baseUrl = 'http://www.mathworks.com/matlabcentral/fileexchange/17935'; + fileUrl = [baseUrl '?controller=file_infos&download=true']; + %file = urlread(fileUrl); + %file = regexprep(file,[char(13),char(10)],'\n'); %convert to OS-dependent EOL + + % Install... + %newPath = fullfile(fileparts(which(mfilename)),'uiinspect.m'); + %fid = fopen(newPath,'wt'); + %fprintf(fid,'%s',file); + %fclose(fid); + [fpath,fname,fext] = fileparts(which(mfilename)); + zipFileName = fullfile(fpath,'uiinspect.zip'); + urlwrite(fileUrl,zipFileName); + unzip(zipFileName,fpath); + rehash; + catch + % Error downloading: inform the user + msgbox(['Error in downloading: ' lasterr], 'UIInspect', 'warn'); %#ok + web(baseUrl); + end + + % ...and now run it... + %pause(0.1); + drawnow; + dummy = which('uiinspect'); %#ok used only to load into memory + uiinspect(object); + return; + + case 'No & never ask again' % => No & don't ask again + setpref('FindJObj','dontCheckUIInspect',1); + + otherwise + % forget it... + end + end + drawnow; + + % No UIINSPECT available - run the good-ol' METHODSVIEW()... + methodsview(object); + else + uiinspect(object); + end + catch + try + if isjava(object) + methodsview(object) + else + methodsview(object.java); + end + catch + % Never mind... + dispError + end + end + end + + %% Callback function for button + function btCheckFex_Callback(src, evd, varargin) %#ok + try + % Check the FileExchange for the latest version + web('http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=14317'); + catch + % Never mind... + dispError + end + end + + %% Check for existence of a newer version + function checkVersion() + try + % If the user has not indicated NOT to be informed + if ~ispref('FindJObj','dontCheckNewerVersion') + + % Get the latest version date from the File Exchange webpage + baseUrl = 'http://www.mathworks.com/matlabcentral/fileexchange/'; + webUrl = [baseUrl '14317']; % 'loadFile.do?objectId=14317']; + webPage = urlread(webUrl); + modIdx = strfind(webPage,'>Updates<'); + if ~isempty(modIdx) + webPage = webPage(modIdx:end); + % Note: regexp hangs if substr not found, so use strfind instead... + %latestWebVersion = regexprep(webPage,'.*?>(20[\d-]+).*','$1'); + dateIdx = strfind(webPage,'class="date">'); + if ~isempty(dateIdx) + latestDate = webPage(dateIdx(end)+13 : dateIdx(end)+23); + try + startIdx = dateIdx(end)+27; + descStartIdx = startIdx + strfind(webPage(startIdx:startIdx+999),''); + descEndIdx = startIdx + strfind(webPage(startIdx:startIdx+999),''); + descStr = webPage(descStartIdx(1)+3 : descEndIdx(1)-2); + descStr = regexprep(descStr,'',''); + catch + descStr = ''; + end + + % Get this file's latest date + thisFileName = which(mfilename); %#ok + try + thisFileData = dir(thisFileName); + try + thisFileDatenum = thisFileData.datenum; + catch % old ML versions... + thisFileDatenum = datenum(thisFileData.date); + end + catch + thisFileText = evalc('type(thisFileName)'); + thisFileLatestDate = regexprep(thisFileText,'.*Change log:[\s%]+([\d-]+).*','$1'); + thisFileDatenum = datenum(thisFileLatestDate,'yyyy-mm-dd'); + end + + % If there's a newer version on the File Exchange webpage (allow 2 days grace period) + if (thisFileDatenum < datenum(latestDate,'dd mmm yyyy')-2) + + % Ask the user whether to download the newer version (YES, no, no & don't ask again) + msg = {['A newer version (' latestDate ') of FindJObj is available on the MathWorks File Exchange:'], '', ... + ['\color{blue}' descStr '\color{black}'], '', ... + 'Download & install the new version?'}; + createStruct.Interpreter = 'tex'; + createStruct.Default = 'Yes'; + answer = questdlg(msg,'FindJObj','Yes','No','No & never ask again',createStruct); + switch answer + case 'Yes' % => Yes: download & install newer file + try + %fileUrl = [baseUrl '/download.do?objectId=14317&fn=findjobj&fe=.m']; + fileUrl = [baseUrl '/14317?controller=file_infos&download=true']; + %file = urlread(fileUrl); + %file = regexprep(file,[char(13),char(10)],'\n'); %convert to OS-dependent EOL + %fid = fopen(thisFileName,'wt'); + %fprintf(fid,'%s',file); + %fclose(fid); + [fpath,fname,fext] = fileparts(thisFileName); + zipFileName = fullfile(fpath,[fname '.zip']); + urlwrite(fileUrl,zipFileName); + unzip(zipFileName,fpath); + rehash; + catch + % Error downloading: inform the user + msgbox(['Error in downloading: ' lasterr], 'FindJObj', 'warn'); %#ok + web(webUrl); + end + case 'No & never ask again' % => No & don't ask again + setpref('FindJObj','dontCheckNewerVersion',1); + otherwise + % forget it... + end + end + end + else + % Maybe webpage not fully loaded or changed format - bail out... + end + end + catch + % Never mind... + end + end + + %% Get the first selected object (might not be the top one - depends on selection order) + function object = getTopSelectedObject(jTree, root) + try + object = []; + numSelections = jTree.getSelectionCount; + if numSelections > 0 + % Get the first object specified + %object = jTree.getSelectionPath.getLastPathComponent.getUserObject; + nodedata = get(jTree.getSelectionPath.getLastPathComponent,'userdata'); + else + % Get the root object (container) + %object = root.getUserObject; + nodedata = get(root,'userdata'); + end + object = nodedata.obj; + catch + % Never mind... + dispError + end + end + + %% Update component callback upon callbacksTable data change + function tbCallbacksChanged(src, evd, object, table) + persistent hash + try + % exit if invalid handle or already in Callback + %if ~ishandle(src) || ~isempty(getappdata(src,'inCallback')) % || length(dbstack)>1 %exit also if not called from user action + if isempty(hash), hash = java.util.Hashtable; end + if ~ishandle(src) || ~isempty(hash.get(src)) % || length(dbstack)>1 %exit also if not called from user action + return; + end + %setappdata(src,'inCallback',1); % used to prevent endless recursion % can't use getappdata(src,...) because it fails on R2010b!!! + hash.put(src,1); + + % Update the object's callback with the modified value + modifiedColIdx = evd.getColumn; + modifiedRowIdx = evd.getFirstRow; + if modifiedRowIdx>=0 %&& modifiedColIdx==1 %sanity check - should always be true + %table = evd.getSource; + %object = get(src,'userdata'); + modifiedRowIdx = table.getSelectedRow; % overcome issues with hierarchical table + cbName = strtrim(table.getValueAt(modifiedRowIdx,0)); + try + cbValue = strtrim(char(table.getValueAt(modifiedRowIdx,1))); + if ~isempty(cbValue) && ismember(cbValue(1),'{[@''') + cbValue = eval(cbValue); + end + if (~ischar(cbValue) && ~isa(cbValue, 'function_handle') && (~iscell(cbValue) || iscom(object(1)))) + revertCbTableModification(table, modifiedRowIdx, modifiedColIdx, cbName, object, ''); + else + for objIdx = 1 : length(object) + obj = object(objIdx); + if ~iscom(obj) + try + try + if isjava(obj) + obj = handle(obj,'CallbackProperties'); + end + catch + % never mind... + end + set(obj, cbName, cbValue); + catch + try + set(handle(obj,'CallbackProperties'), cbName, cbValue); + catch + % never mind - probably a callback-group header + end + end + else + cbs = obj.eventlisteners; + if ~isempty(cbs) + cbs = cbs(strcmpi(cbs(:,1),cbName),:); + obj.unregisterevent(cbs); + end + if ~isempty(cbValue) && ~strcmp(cbName,'-') + obj.registerevent({cbName, cbValue}); + end + end + end + end + catch + revertCbTableModification(table, modifiedRowIdx, modifiedColIdx, cbName, object, lasterr) %#ok + end + end + catch + % never mind... + end + %setappdata(src,'inCallback',[]); % used to prevent endless recursion % can't use setappdata(src,...) because it fails on R2010b!!! + hash.remove(src); + end + + %% Revert Callback table modification + function revertCbTableModification(table, modifiedRowIdx, modifiedColIdx, cbName, object, errMsg) %#ok + try + % Display a notification MsgBox + msg = 'Callbacks must be a ''string'', or a @function handle'; + if ~iscom(object(1)), msg = [msg ' or a {@func,args...} construct']; end + if ~isempty(errMsg), msg = {errMsg, '', msg}; end + msgbox(msg, ['Error setting ' cbName ' value'], 'warn'); + + % Revert to the current value + curValue = ''; + try + if ~iscom(object(1)) + curValue = charizeData(get(object(1),cbName)); + else + cbs = object(1).eventlisteners; + if ~isempty(cbs) + cbs = cbs(strcmpi(cbs(:,1),cbName),:); + curValue = charizeData(cbs(1,2)); + end + end + catch + % never mind... - clear the current value + end + table.setValueAt(curValue, modifiedRowIdx, modifiedColIdx); + catch + % never mind... + end + end % revertCbTableModification + + %% Get the Java positions of all HG text labels + function labelPositions = getLabelsJavaPos(container) + try + labelPositions = []; + + % Ensure we have a figure handle + try + h = hFig; %#ok unused + catch + hFig = getCurrentFigure; + end + + % Get the figure's margins from the Matlab properties + hg_labels = findall(hFig, 'Style','text'); + units = get(hFig,'units'); + set(hFig,'units','pixels'); + outerPos = get(hFig,'OuterPosition'); + innerPos = get(hFig,'Position'); + set(hFig,'units',units); + margins = abs(innerPos-outerPos); + + figX = container.getX; % =outerPos(1) + figY = container.getY; % =outerPos(2) + %figW = container.getWidth; % =outerPos(3) + figH = container.getHeight; % =outerPos(4) + + % Get the relevant screen pixel size + %monitorPositions = get(0,'MonitorPositions'); + %for monitorIdx = size(monitorPositions,1) : -1 : 1 + % screenSize = monitorPositions(monitorIdx,:); + % if (outerPos(1) >= screenSize(1)) % && (outerPos(1)+outerPos(3) <= screenSize(3)) + % break; + % end + %end + %monitorBaseY = screenSize(4) - monitorPositions(1,4); + + % Compute the labels' screen pixel position in Java units ([0,0] = top left) + for idx = 1 : length(hg_labels) + matlabPos = getpixelposition(hg_labels(idx),1); + javaX = figX + matlabPos(1) + margins(1); + javaY = figY + figH - matlabPos(2) - matlabPos(4) - margins(2); + labelPositions(idx,:) = [javaX, javaY, matlabPos(3:4)]; %#ok grow + end + catch + % never mind... + err = lasterror; %#ok debug point + end + end + + %% Traverse an HG container hierarchy and extract the HG elements within + function traverseHGContainer(hcontainer,level,parent) + try + % Record the data for this node + thisIdx = length(hg_levels) + 1; + hg_levels(thisIdx) = level; + hg_parentIdx(thisIdx) = parent; + try + hg_handles(thisIdx) = handle(hcontainer); + catch + hg_handles = handle(hcontainer); + end + parentId = length(hg_parentIdx); + + % Now recursively process all this node's children (if any) + %if ishghandle(hcontainer) + try % try-catch is faster than checking ishghandle(hcontainer)... + allChildren = allchild(handle(hcontainer)); + for childIdx = 1 : length(allChildren) + traverseHGContainer(allChildren(childIdx),level+1,parentId); + end + catch + % do nothing - probably not a container + %dispError + end + + % TODO: Add axis (plot) component handles + catch + % forget it... + end + end + + %% Debuggable "quiet" error-handling + function dispError + err = lasterror; %#ok + msg = err.message; + for idx = 1 : length(err.stack) + filename = err.stack(idx).file; + if ~isempty(regexpi(filename,mfilename)) + funcname = err.stack(idx).name; + line = num2str(err.stack(idx).line); + msg = [msg ' at ' funcname ' line #' line '']; %#ok grow + break; + end + end + disp(msg); + return; % debug point + end + + %% ML 7.0 - compatible ischar() function + function flag = ischar(data) + try + flag = builtin('ischar',data); + catch + flag = isa(data,'char'); + end + end + + %% Set up the uitree context (right-click) menu + function jmenu = setTreeContextMenu(obj,node,tree_h) + % Prepare the context menu (note the use of HTML labels) + import javax.swing.* + titleStr = getNodeTitleStr(obj,node); + titleStr = regexprep(titleStr,'


.*',''); + menuItem0 = JMenuItem(titleStr); + menuItem0.setEnabled(false); + menuItem0.setArmed(false); + %menuItem1 = JMenuItem('Export handle to findjobj_hdls'); + if isjava(obj), prefix = 'j'; else, prefix = 'h'; end %#ok + varname = strrep([prefix strtok(char(node.getName))], '$','_'); + varname = genvarname(varname); + varname(2) = upper(varname(2)); % ensure lowerCamelCase + menuItem1 = JMenuItem(['Export handle to ' varname]); + menuItem2 = JMenuItem('Export handle to...'); + menuItem3 = JMenuItem('Request focus (bring to front)'); + menuItem4 = JMenuItem('Flash component borders'); + menuItem5 = JMenuItem('Display properties & callbacks'); + menuItem6 = JMenuItem('Inspect object'); + + % Set the menu items' callbacks + set(handle(menuItem1,'CallbackProperties'), 'ActionPerformedCallback', {@btExport_Callback,{obj,varname}}); + set(handle(menuItem2,'CallbackProperties'), 'ActionPerformedCallback', {@btExport_Callback,{obj,[]}}); + set(handle(menuItem3,'CallbackProperties'), 'ActionPerformedCallback', {@requestFocus,obj}); + set(handle(menuItem4,'CallbackProperties'), 'ActionPerformedCallback', {@flashComponent,{obj,0.2,3}}); + set(handle(menuItem5,'CallbackProperties'), 'ActionPerformedCallback', {@nodeSelected,{tree_h,node}}); + set(handle(menuItem6,'CallbackProperties'), 'ActionPerformedCallback', {@btInspect_Callback,obj}); + + % Add all menu items to the context menu (with internal separator) + jmenu = JPopupMenu; + jmenu.add(menuItem0); + jmenu.addSeparator; + handleValue=[]; try handleValue = double(obj); catch, end; %#ok + if ~isempty(handleValue) + % For valid HG handles only + menuItem0a = JMenuItem('Copy handle value to clipboard'); + set(handle(menuItem0a,'CallbackProperties'), 'ActionPerformedCallback', sprintf('clipboard(''copy'',%.99g)',handleValue)); + jmenu.add(menuItem0a); + end + jmenu.add(menuItem1); + jmenu.add(menuItem2); + jmenu.addSeparator; + jmenu.add(menuItem3); + jmenu.add(menuItem4); + jmenu.add(menuItem5); + jmenu.add(menuItem6); + end % setTreeContextMenu + + %% Set the mouse-press callback + function treeMousePressedCallback(hTree, eventData, tree_h) %#ok hTree is unused + if eventData.isMetaDown % right-click is like a Meta-button + % Get the clicked node + clickX = eventData.getX; + clickY = eventData.getY; + jtree = eventData.getSource; + treePath = jtree.getPathForLocation(clickX, clickY); + try + % Modify the context menu based on the clicked node + node = treePath.getLastPathComponent; + userdata = get(node,'userdata'); + obj = userdata.obj; + jmenu = setTreeContextMenu(obj,node,tree_h); + + % TODO: remember to call jmenu.remove(item) in item callback + % or use the timer hack shown here to remove the item: + % timerFcn = {@menuRemoveItem,jmenu,item}; + % start(timer('TimerFcn',timerFcn,'StartDelay',0.2)); + + % Display the (possibly-modified) context menu + jmenu.show(jtree, clickX, clickY); + jmenu.repaint; + + % This is for debugging: + userdata.tree = jtree; + setappdata(gcf,'findjobj_hgtree',userdata) + catch + % clicked location is NOT on top of any node + % Note: can also be tested by isempty(treePath) + end + end + end % treeMousePressedCallback + + %% Remove the extra context menu item after display + function menuRemoveItem(hObj,eventData,jmenu,item) %#ok unused + jmenu.remove(item); + end % menuRemoveItem + + %% Get the title for the tooltip and context (right-click) menu + function nodeTitleStr = getNodeTitleStr(obj,node) + try + % Display the full classname and object name in the tooltip + %nodeName = char(node.getName); + %nodeName = strrep(nodeName, '',''); + %nodeName = strrep(nodeName, '',''); + nodeName = char(getNodeName(obj,99)); + [objClass,objName] = strtok(nodeName); + objName = objName(3:end-1); % strip leading ( and trailing ) + if isempty(objName), objName = '(none found)'; end + nodeName = char(node.getName); + objClass = char(obj.getClass.getName); + nodeTitleStr = sprintf('Class name: %s
Text/title: %s',objClass,objName); + + % If the component is invisible, state this in the tooltip + if ~isempty(strfind(nodeName,'color="gray"')) + nodeTitleStr = [nodeTitleStr '
*** Invisible ***']; + end + nodeTitleStr = [nodeTitleStr '
Right-click for context-menu']; + catch + % Possible not a Java object - try treating as an HG handle + try + handleValueStr = sprintf('#: %.99g',double(obj)); + try + type = ''; + type = get(obj,'type'); + type(1) = upper(type(1)); + catch + if ~ishandle(obj) + type = ['Invalid ' char(node.getName) '']; + handleValueStr = '!!!
Perhaps this handle was deleted after this UIInspect tree was
already drawn. Try to refresh by selecting any valid node handle'; + end + end + nodeTitleStr = sprintf('%s handle %s',type,handleValueStr); + try + % If the component is invisible, state this in the tooltip + if strcmp(get(obj,'Visible'),'off') + nodeTitleStr = [nodeTitleStr '
Invisible']; + end + catch + % never mind... + end + catch + % never mind... - ignore + end + end + end % getNodeTitleStr + + %% Handle tree mouse movement callback - used to set the tooltip & context-menu + function treeMouseMovedCallback(hTree, eventData) + try + x = eventData.getX; + y = eventData.getY; + jtree = eventData.getSource; + treePath = jtree.getPathForLocation(x, y); + try + % Set the tooltip string based on the hovered node + node = treePath.getLastPathComponent; + userdata = get(node,'userdata'); + obj = userdata.obj; + tooltipStr = getNodeTitleStr(obj,node); + set(hTree,'ToolTipText',tooltipStr) + catch + % clicked location is NOT on top of any node + % Note: can also be tested by isempty(treePath) + end + catch + dispError; + end + return; % denug breakpoint + end % treeMouseMovedCallback + + %% Request focus for a specific object handle + function requestFocus(hTree, eventData, obj) %#ok hTree & eventData are unused + % Ensure the object handle is valid + if isjava(obj) + obj.requestFocus; + return; + elseif ~ishandle(obj) + msgbox('The selected object does not appear to be a valid handle as defined by the ishandle() function. Perhaps this object was deleted after this hierarchy tree was already drawn. Refresh this tree by selecting a valid node handle and then retry.','FindJObj','warn'); + beep; + return; + end + + try + foundFlag = 0; + while ~foundFlag + if isempty(obj), return; end % sanity check + type = get(obj,'type'); + obj = double(obj); + foundFlag = any(strcmp(type,{'figure','axes','uicontrol'})); + if ~foundFlag + obj = get(obj,'Parent'); + end + end + feval(type,obj); + catch + % never mind... + dispError; + end + end % requestFocus + +end % FINDJOBJ + +% Fast implementation +function jControl = findjobj_fast(hControl, jContainer) + try jControl = hControl.getTable; return, catch, end % fast bail-out for old uitables + try jControl = hControl.JavaFrame.getGUIDEView; return, catch, end % bail-out for HG2 matlab.ui.container.Panel + oldWarn = warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); + if nargin < 2 || isempty(jContainer) + % Use a HG2 matlab.ui.container.Panel jContainer if the control's parent is a uipanel + try + hParent = get(hControl,'Parent'); + catch + % Probably indicates an invalid/deleted/empty handle + jControl = []; + return + end + try jContainer = hParent.JavaFrame.getGUIDEView; catch, jContainer = []; end + end + if isempty(jContainer) + hFig = ancestor(hControl,'figure'); + jf = get(hFig, 'JavaFrame'); + jContainer = jf.getFigurePanelContainer.getComponent(0); + end + warning(oldWarn); + jControl = []; + counter = 20; % 2018-09-21 speedup (100 x 0.001 => 20 x 0.005) - Martin Lehmann suggestion on FEX 2016-06-07 + specialTooltipStr = '!@#$%^&*'; + try % Fix for R2018b suggested by Eddie (FEX comment 2018-09-19) + tooltipPropName = 'TooltipString'; + oldTooltip = get(hControl,tooltipPropName); + set(hControl,tooltipPropName,specialTooltipStr); + catch + tooltipPropName = 'Tooltip'; + oldTooltip = get(hControl,tooltipPropName); + set(hControl,tooltipPropName,specialTooltipStr); + end + while isempty(jControl) && counter>0 + counter = counter - 1; + pause(0.005); + jControl = findTooltipIn(jContainer, specialTooltipStr); + end + set(hControl,tooltipPropName,oldTooltip); + try jControl.setToolTipText(oldTooltip); catch, end + try jControl = jControl.getParent.getView.getParent.getParent; catch, end % return JScrollPane if exists +end +function jControl = findTooltipIn(jContainer, specialTooltipStr) + try + jControl = []; % Fix suggested by H. Koch 11/4/2017 + tooltipStr = jContainer.getToolTipText; + %if strcmp(char(tooltipStr),specialTooltipStr) + if ~isempty(tooltipStr) && tooltipStr.startsWith(specialTooltipStr) % a bit faster + jControl = jContainer; + else + for idx = 1 : jContainer.getComponentCount + jControl = findTooltipIn(jContainer.getComponent(idx-1), specialTooltipStr); + if ~isempty(jControl), return; end + end + end + catch + % ignore + end +end + +%% TODO TODO TODO +%{ +- Enh: Improve interactive-GUI performance - esp. expandNode() +- Enh: Add property listeners - same problem in MathWork's inspect.m +- Enh: Display additional properties - same problem in MathWork's inspect.m +- Enh: Add axis (plot, Graphics) component handles +- Enh: Add figure thumbnail image below the java tree (& indicate corresponding jObject when selected) +- Enh: scroll initially-selected node into view (problem because treenode has no pixel location) +- Fix: java exceptions when getting some fields (com.mathworks.mlwidgets.inspector.PropertyRootNode$PropertyListener$1$1.run) +- Fix: use EDT if available (especially in flashComponent) +%} + + diff --git a/@GUI/init.m b/@GUI/init.m index 24525d16f6c0826860f33bc46e956c3578e2292a..114360734a5cf248522344214d9bbe20844e914b 100644 --- a/@GUI/init.m +++ b/@GUI/init.m @@ -15,8 +15,8 @@ elseif object.mode == 0 name = 'Table Tool'; end % main figure -object.fig = figure('units','pixels',... - 'position',[0 0 object.fig_width object.fig_height],... +object.fig = figure('Units','pixels',... + 'Position',[0 0 object.fig_width object.fig_height],... 'menubar','none',... 'name','Table Tool',... 'numbertitle','off',... @@ -27,43 +27,43 @@ object.fig = figure('units','pixels',... % edit button -object.edit_tog = uicontrol('style','toggle',... - 'units','pix',... - 'string','Edit',... +object.edit_tog = uicontrol('Style','togglebutton',... + 'Units','pix',... + 'String','Edit',... 'HorizontalAlign','left',... 'Parent',object.fig,... 'Value',object.edit,... 'callback',@(src,event)edit_tog_call(object,src,event)); % Save button -object.save_pb = uicontrol('style','push',... - 'units','pix',... - 'string','Save',... +object.save_pb = uicontrol('Style','pushbutton',... + 'Units','pix',... + 'String','Save',... 'HorizontalAlign','left',... 'Parent',object.fig,... 'callback',@(src,event)save_call(object,src,event)); % Close button -object.close_pb = uicontrol('style','push',... - 'units','pix',... - 'string','Close',... +object.close_pb = uicontrol('Style','pushbutton',... + 'Units','pix',... + 'String','Close',... 'HorizontalAlign','left',... 'Parent',object.fig,... 'callback',@(src,event)close_fig(object,src,event)); % Save external button -object.save_ext_pb = uicontrol('style','push',... - 'units','pix',... - 'string','Save Ext',... +object.save_ext_pb = uicontrol('Style','pushbutton',... + 'Units','pix',... + 'String','Save Ext',... 'HorizontalAlign','left',... 'Parent',object.fig,... 'callback',@(src,event)save_ext_call(object,src,event)); % Check button -object.check_pb = uicontrol('style','push',... - 'units','pix',... - 'string','Syntax',... +object.check_pb = uicontrol('Style','pushbutton',... + 'Units','pix',... + 'String','Syntax',... 'HorizontalAlign','left',... 'Parent',object.fig,... 'Max',2.0,... @@ -72,38 +72,38 @@ object.check_pb = uicontrol('style','push',... % PVS button -object.pvs_pb = uicontrol('style','push',... - 'units','pix',... - 'string','Typecheck',... +object.pvs_pb = uicontrol('Style','pushbutton',... + 'Units','pix',... + 'String','Typecheck',... 'HorizontalAlign','left',... 'Parent',object.fig,... 'callback',@(src,event)typecheck_call(object,src,event)); % Input/Output button -object.input_pb = uicontrol('style','push',... - 'units','pix',... - 'string','Ports',... +object.input_pb = uicontrol('Style','pushbutton',... + 'Units','pix',... + 'String','Ports',... 'HorizontalAlign','left',... 'Parent',object.fig,... 'callback',@(src,event)input_call(object,src,event)); % Settings button -object.settings_pb = uicontrol('style','push',... - 'units','pix',... - 'string','Settings',... +object.settings_pb = uicontrol('Style','pushbutton',... + 'Units','pix',... + 'String','Settings',... 'HorizontalAlign','left',... 'Parent',object.fig,... 'callback',@(src,event)settings_call(object,src,event)); % Expression Name Label -object.name_label = uicontrol('style','text',... - 'string','Expression Name',... +object.name_label = uicontrol('Style','text',... + 'String','Expression Name',... 'HorizontalAlign','right',... 'BackgroundColor',get(object.fig,'Color')); % Expression Name Edit box -object.function_name_control = uicontrol('style','edit',... - 'units','pix',... +object.function_name_control = uicontrol('Style','edit',... + 'Units','pix',... 'Parent',object.fig,... 'HorizontalAlign','center',... 'FontWeight','bold',... @@ -113,14 +113,14 @@ object.function_name_control = uicontrol('style','edit',... 'BackgroundColor',[1 1 1]); % input list label -object.input_label = uicontrol('style','text',... - 'string','Inputs',... +object.input_label = uicontrol('Style','text',... + 'String','Inputs',... 'HorizontalAlign','right',... 'BackgroundColor',get(object.fig,'Color')); % input list edit box -object.function_inputs_control = uicontrol('style','edit',... - 'units','pix',... +object.function_inputs_control = uicontrol('Style','edit',... + 'Units','pix',... 'Parent',object.fig,... 'HorizontalAlign','center',... 'FontWeight','bold',... diff --git a/@GUI/save_call.m b/@GUI/save_call.m index def7f8eedee9bec33214eb2d8fc6b29e1dcc6c6a..245655484a00757f237745d5aced8530d1353505 100644 --- a/@GUI/save_call.m +++ b/@GUI/save_call.m @@ -44,6 +44,8 @@ elseif object.mode == 1 load_system('simulink'); % generate the code + %object + %findobj(object) redo = object.check_output_consistent; if redo object.EMLGen.set_datatype(object.output_data_type); diff --git a/@GUI/textbox_callback.m b/@GUI/textbox_callback.m index f0829ae0970398d7c92f3cbcc8c8cc156c979311..3379381880744a40705088e19a1949fbdc151e39 100644 --- a/@GUI/textbox_callback.m +++ b/@GUI/textbox_callback.m @@ -39,6 +39,24 @@ if(~isempty(unicode2native(event.Character))) % hack because api does not update the string field of % textbox until after it loses focus. temporarily focus on % label, read string, refocus on textbox. + + % When we temporarily lose focus, we would want to save the cursor + % position so we can return to the cursor position were we left of. + + % The cursor position is a uicontrol property that is not exposed by + % Matlab. Since all Matlab uicontrols are based on underlying Java + % Swing controls, accessing these features is possible via their + % Java control peers. + + % the findobj function finds java objects contained within a specified + % Matlab GUI handle + + %class(src) + %{ + java_obj = findjobj(src); + java_obj = java_obj.getComponent(0).getComponent(0); + Cursor_Pos = java_obj.getCaretPosition(); + %} uicontrol(object.name_label); undo_data.action = 1; @@ -50,6 +68,7 @@ if(~isempty(unicode2native(event.Character))) object.undo_man.new_state(undo_data); uicontrol(src); + %java_obj.setCaretPosition(Cursor_Pos); figure(object.fig); object.update_undoredo; diff --git a/@RGrid/delete_g1s.m b/@RGrid/delete_g1s.m index 2c5258b1578a6fd3ec9f24baf9026cd6430d9f49..536ea6bfc54712537f3f19b3aa52138611e4c7c7 100644 --- a/@RGrid/delete_g1s.m +++ b/@RGrid/delete_g1s.m @@ -13,11 +13,10 @@ deleted = []; for i=1:size(object.Cells,2) if (object.Cells(i).Cell1 == cell) deleted = [deleted i]; - end end if(~isempty(deleted)) - delete(object.Cells(deleted).result); + delete([object.Cells(deleted).result]); object.Cells(deleted) = []; end end diff --git a/@RGrid/delete_g2s.m b/@RGrid/delete_g2s.m index cf356c529b4ee6309b79109ad4c0dc8bef7157af..4e7c5278d9f284ae471aac99127584b2dfa6eb1d 100644 --- a/@RGrid/delete_g2s.m +++ b/@RGrid/delete_g2s.m @@ -20,7 +20,7 @@ for i=1:size(object.Cells,2) end end if(~isempty(deleted)) - delete(object.Cells(deleted).result); + delete([object.Cells(deleted).result]); object.Cells(deleted) = []; end end diff --git a/Examples/Jin_Parnas_Example.mdl.r2010a b/Examples/Jin_Parnas_Example.mdl.r2010a new file mode 100644 index 0000000000000000000000000000000000000000..0b5a8b9ff481e6d5d2b1519f174c1d6a42f7cc32 --- /dev/null +++ b/Examples/Jin_Parnas_Example.mdl.r2010a @@ -0,0 +1,1243 @@ +Model { + Name "Jin_Parnas_Example" + Version 7.5 + MdlSubVersion 0 + GraphicalInterface { + NumRootInports 0 + NumRootOutports 0 + ParameterArgumentNames "" + ComputedModelVersion "1.2" + NumModelReferences 0 + NumTestPointedSignals 0 + } + SavedCharacterEncoding "ISO-8859-1" + SaveDefaultBlockParams on + ScopeRefreshTime 0.035000 + OverrideScopeRefreshTime on + DisableAllScopes off + DataTypeOverride "UseLocalSettings" + MinMaxOverflowLogging "UseLocalSettings" + MinMaxOverflowArchiveMode "Overwrite" + MaxMDLFileLineLength 120 + Created "Mon Jan 24 12:34:29 2011" + Creator "colin" + UpdateHistory "UpdateHistoryNever" + ModifiedByFormat "%" + LastModifiedBy "matthew" + ModifiedDateFormat "%" + LastModifiedDate "Thu May 15 15:26:50 2014" + RTWModifiedTimeStamp 322068405 + ModelVersionFormat "1.%" + ConfigurationManager "none" + SampleTimeColors off + SampleTimeAnnotations off + LibraryLinkDisplay "none" + WideLines off + ShowLineDimensions off + ShowPortDataTypes off + ShowLoopsOnError on + IgnoreBidirectionalLines off + ShowStorageClass off + ShowTestPointIcons on + ShowSignalResolutionIcons on + ShowViewerIcons on + SortedOrder off + ExecutionContextIcon off + ShowLinearizationAnnotations on + BlockNameDataTip off + BlockParametersDataTip off + BlockDescriptionStringDataTip off + ToolBar on + StatusBar on + BrowserShowLibraryLinks off + BrowserLookUnderMasks off + SimulationMode "normal" + LinearizationMsg "none" + Profile off + ParamWorkspaceSource "MATLABWorkspace" + AccelSystemTargetFile "accel.tlc" + AccelTemplateMakefile "accel_default_tmf" + AccelMakeCommand "make_rtw" + TryForcingSFcnDF off + RecordCoverage off + CovPath "/" + CovSaveName "covdata" + CovMetricSettings "dw" + CovNameIncrementing off + CovHtmlReporting on + CovForceBlockReductionOff on + covSaveCumulativeToWorkspaceVar on + CovSaveSingleToWorkspaceVar on + CovCumulativeVarName "covCumulativeData" + CovCumulativeReport off + CovReportOnPause on + CovModelRefEnable "Off" + CovExternalEMLEnable off + ExtModeBatchMode off + ExtModeEnableFloating on + ExtModeTrigType "manual" + ExtModeTrigMode "normal" + ExtModeTrigPort "1" + ExtModeTrigElement "any" + ExtModeTrigDuration 1000 + ExtModeTrigDurationFloating "auto" + ExtModeTrigHoldOff 0 + ExtModeTrigDelay 0 + ExtModeTrigDirection "rising" + ExtModeTrigLevel 0 + ExtModeArchiveMode "off" + ExtModeAutoIncOneShot off + ExtModeIncDirWhenArm off + ExtModeAddSuffixToVar off + ExtModeWriteAllDataToWs off + ExtModeArmWhenConnect on + ExtModeSkipDownloadWhenConnect off + ExtModeLogAll on + ExtModeAutoUpdateStatusClock on + BufferReuse on + ShowModelReferenceBlockVersion off + ShowModelReferenceBlockIO off + Array { + Type "Handle" + Dimension 1 + Simulink.ConfigSet { + $ObjectID 1 + Version "1.10.0" + Array { + Type "Handle" + Dimension 8 + Simulink.SolverCC { + $ObjectID 2 + Version "1.10.0" + StartTime "0.0" + StopTime "10.0" + AbsTol "auto" + FixedStep "auto" + InitialStep "auto" + MaxNumMinSteps "-1" + MaxOrder 5 + ZcThreshold "auto" + ConsecutiveZCsStepRelTol "10*128*eps" + MaxConsecutiveZCs "1000" + ExtrapolationOrder 4 + NumberNewtonIterations 1 + MaxStep "auto" + MinStep "auto" + MaxConsecutiveMinStep "1" + RelTol "1e-3" + SolverMode "Auto" + Solver "ode45" + SolverName "ode45" + SolverJacobianMethodControl "auto" + ShapePreserveControl "DisableAll" + ZeroCrossControl "UseLocalSettings" + ZeroCrossAlgorithm "Nonadaptive" + AlgebraicLoopSolver "TrustRegion" + SolverResetMethod "Fast" + PositivePriorityOrder off + AutoInsertRateTranBlk off + SampleTimeConstraint "Unconstrained" + InsertRTBMode "Whenever possible" + } + Simulink.DataIOCC { + $ObjectID 3 + Version "1.10.0" + Decimation "1" + ExternalInput "[t, u]" + FinalStateName "xFinal" + InitialState "xInitial" + LimitDataPoints on + MaxDataPoints "1000" + LoadExternalInput off + LoadInitialState off + SaveFinalState off + SaveCompleteFinalSimState off + SaveFormat "Array" + SaveOutput on + SaveState off + SignalLogging on + DSMLogging on + InspectSignalLogs off + SaveTime on + ReturnWorkspaceOutputs off + StateSaveName "xout" + TimeSaveName "tout" + OutputSaveName "yout" + SignalLoggingName "logsout" + DSMLoggingName "dsmout" + OutputOption "RefineOutputTimes" + OutputTimes "[]" + ReturnWorkspaceOutputsName "out" + Refine "1" + } + Simulink.OptimizationCC { + $ObjectID 4 + Version "1.10.0" + Array { + Type "Cell" + Dimension 7 + Cell "BooleansAsBitfields" + Cell "PassReuseOutputArgsAs" + Cell "PassReuseOutputArgsThreshold" + Cell "ZeroExternalMemoryAtStartup" + Cell "ZeroInternalMemoryAtStartup" + Cell "OptimizeModelRefInitCode" + Cell "NoFixptDivByZeroProtection" + PropName "DisabledProps" + } + BlockReduction on + BooleanDataType on + ConditionallyExecuteInputs on + InlineParams off + UseIntDivNetSlope off + InlineInvariantSignals off + OptimizeBlockIOStorage on + BufferReuse on + EnhancedBackFolding off + StrengthReduction off + EnforceIntegerDowncast on + ExpressionFolding on + BooleansAsBitfields off + BitfieldContainerType "uint_T" + EnableMemcpy on + MemcpyThreshold 64 + PassReuseOutputArgsAs "Structure reference" + ExpressionDepthLimit 2147483647 + FoldNonRolledExpr on + LocalBlockOutputs on + RollThreshold 5 + SystemCodeInlineAuto off + StateBitsets off + DataBitsets off + UseTempVars off + ZeroExternalMemoryAtStartup on + ZeroInternalMemoryAtStartup on + InitFltsAndDblsToZero off + NoFixptDivByZeroProtection off + EfficientFloat2IntCast off + EfficientMapNaN2IntZero on + OptimizeModelRefInitCode off + LifeSpan "inf" + MaxStackSize "Inherit from target" + BufferReusableBoundary on + SimCompilerOptimization "Off" + AccelVerboseBuild off + } + Simulink.DebuggingCC { + $ObjectID 5 + Version "1.10.0" + RTPrefix "error" + ConsistencyChecking "none" + ArrayBoundsChecking "none" + SignalInfNanChecking "none" + SignalRangeChecking "none" + ReadBeforeWriteMsg "UseLocalSettings" + WriteAfterWriteMsg "UseLocalSettings" + WriteAfterReadMsg "UseLocalSettings" + AlgebraicLoopMsg "warning" + ArtificialAlgebraicLoopMsg "warning" + SaveWithDisabledLinksMsg "warning" + SaveWithParameterizedLinksMsg "warning" + CheckSSInitialOutputMsg on + UnderspecifiedInitializationDetection "Classic" + MergeDetectMultiDrivingBlocksExec "none" + CheckExecutionContextPreStartOutputMsg off + CheckExecutionContextRuntimeOutputMsg off + SignalResolutionControl "UseLocalSettings" + BlockPriorityViolationMsg "warning" + MinStepSizeMsg "warning" + TimeAdjustmentMsg "none" + MaxConsecutiveZCsMsg "error" + SolverPrmCheckMsg "warning" + InheritedTsInSrcMsg "warning" + DiscreteInheritContinuousMsg "warning" + MultiTaskDSMMsg "error" + MultiTaskCondExecSysMsg "error" + MultiTaskRateTransMsg "error" + SingleTaskRateTransMsg "none" + TasksWithSamePriorityMsg "warning" + SigSpecEnsureSampleTimeMsg "warning" + CheckMatrixSingularityMsg "none" + IntegerOverflowMsg "warning" + Int32ToFloatConvMsg "warning" + ParameterDowncastMsg "error" + ParameterOverflowMsg "error" + ParameterUnderflowMsg "none" + ParameterPrecisionLossMsg "warning" + ParameterTunabilityLossMsg "warning" + FixptConstUnderflowMsg "none" + FixptConstOverflowMsg "none" + FixptConstPrecisionLossMsg "none" + UnderSpecifiedDataTypeMsg "none" + UnnecessaryDatatypeConvMsg "none" + VectorMatrixConversionMsg "none" + InvalidFcnCallConnMsg "error" + FcnCallInpInsideContextMsg "Use local settings" + SignalLabelMismatchMsg "none" + UnconnectedInputMsg "warning" + UnconnectedOutputMsg "warning" + UnconnectedLineMsg "warning" + SFcnCompatibilityMsg "none" + UniqueDataStoreMsg "none" + BusObjectLabelMismatch "warning" + RootOutportRequireBusObject "warning" + AssertControl "UseLocalSettings" + EnableOverflowDetection off + ModelReferenceIOMsg "none" + ModelReferenceVersionMismatchMessage "none" + ModelReferenceIOMismatchMessage "none" + ModelReferenceCSMismatchMessage "none" + UnknownTsInhSupMsg "warning" + ModelReferenceDataLoggingMessage "warning" + ModelReferenceSymbolNameMessage "warning" + ModelReferenceExtraNoncontSigs "error" + StateNameClashWarn "warning" + SimStateInterfaceChecksumMismatchMsg "warning" + StrictBusMsg "ErrorLevel1" + BusNameAdapt "WarnAndRepair" + NonBusSignalsTreatedAsBus "none" + LoggingUnavailableSignals "error" + BlockIODiagnostic "none" + } + Simulink.HardwareCC { + $ObjectID 6 + Version "1.10.0" + ProdBitPerChar 8 + ProdBitPerShort 16 + ProdBitPerInt 32 + ProdBitPerLong 32 + ProdIntDivRoundTo "Undefined" + ProdEndianess "Unspecified" + ProdWordSize 32 + ProdShiftRightIntArith on + ProdHWDeviceType "32-bit Generic" + TargetBitPerChar 8 + TargetBitPerShort 16 + TargetBitPerInt 32 + TargetBitPerLong 32 + TargetShiftRightIntArith on + TargetIntDivRoundTo "Undefined" + TargetEndianess "Unspecified" + TargetWordSize 32 + TargetTypeEmulationWarnSuppressLevel 0 + TargetPreprocMaxBitsSint 32 + TargetPreprocMaxBitsUint 32 + TargetHWDeviceType "Specified" + TargetUnknown off + ProdEqTarget on + } + Simulink.ModelReferenceCC { + $ObjectID 7 + Version "1.10.0" + UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" + CheckModelReferenceTargetMessage "error" + EnableParallelModelReferenceBuilds off + ParallelModelReferenceMATLABWorkerInit "None" + ModelReferenceNumInstancesAllowed "Multi" + PropagateVarSize "Infer from blocks in model" + ModelReferencePassRootInputsByReference on + ModelReferenceMinAlgLoopOccurrences off + PropagateSignalLabelsOutOfModel off + SupportModelReferenceSimTargetCustomCode off + } + Simulink.SFSimCC { + $ObjectID 8 + Version "1.10.0" + SFSimEnableDebug on + SFSimOverflowDetection on + SFSimEcho on + SimBlas on + SimCtrlC on + SimExtrinsic on + SimIntegrity on + SimUseLocalCustomCode off + SimBuildMode "sf_incremental_build" + } + Simulink.RTWCC { + $BackupClass "Simulink.RTWCC" + $ObjectID 9 + Version "1.10.0" + Array { + Type "Cell" + Dimension 6 + Cell "IncludeHyperlinkInReport" + Cell "GenerateTraceInfo" + Cell "GenerateTraceReport" + Cell "GenerateTraceReportSl" + Cell "GenerateTraceReportSf" + Cell "GenerateTraceReportEml" + PropName "DisabledProps" + } + SystemTargetFile "grt.tlc" + GenCodeOnly off + MakeCommand "make_rtw" + GenerateMakefile on + TemplateMakefile "grt_default_tmf" + GenerateReport off + SaveLog off + RTWVerbose on + RetainRTWFile off + ProfileTLC off + TLCDebug off + TLCCoverage off + TLCAssert off + ProcessScriptMode "Default" + ConfigurationMode "Optimized" + ConfigAtBuild off + RTWUseLocalCustomCode off + RTWUseSimCustomCode off + IncludeHyperlinkInReport off + LaunchReport off + TargetLang "C" + IncludeBusHierarchyInRTWFileBlockHierarchyMap off + IncludeERTFirstTime off + GenerateTraceInfo off + GenerateTraceReport off + GenerateTraceReportSl off + GenerateTraceReportSf off + GenerateTraceReportEml off + GenerateCodeInfo off + RTWCompilerOptimization "Off" + CheckMdlBeforeBuild "Off" + CustomRebuildMode "OnUpdate" + Array { + Type "Handle" + Dimension 2 + Simulink.CodeAppCC { + $ObjectID 10 + Version "1.10.0" + Array { + Type "Cell" + Dimension 19 + Cell "IgnoreCustomStorageClasses" + Cell "IgnoreTestpoints" + Cell "InsertBlockDesc" + Cell "SFDataObjDesc" + Cell "SimulinkDataObjDesc" + Cell "DefineNamingRule" + Cell "SignalNamingRule" + Cell "ParamNamingRule" + Cell "InlinedPrmAccess" + Cell "CustomSymbolStr" + Cell "CustomSymbolStrGlobalVar" + Cell "CustomSymbolStrType" + Cell "CustomSymbolStrField" + Cell "CustomSymbolStrFcn" + Cell "CustomSymbolStrFcnArg" + Cell "CustomSymbolStrBlkIO" + Cell "CustomSymbolStrTmpVar" + Cell "CustomSymbolStrMacro" + Cell "ReqsInCode" + PropName "DisabledProps" + } + ForceParamTrailComments off + GenerateComments on + IgnoreCustomStorageClasses on + IgnoreTestpoints off + IncHierarchyInIds off + MaxIdLength 31 + PreserveName off + PreserveNameWithParent off + ShowEliminatedStatement off + IncAutoGenComments off + SimulinkDataObjDesc off + SFDataObjDesc off + IncDataTypeInIds off + MangleLength 1 + CustomSymbolStrGlobalVar "$R$N$M" + CustomSymbolStrType "$N$R$M" + CustomSymbolStrField "$N$M" + CustomSymbolStrFcn "$R$N$M$F" + CustomSymbolStrFcnArg "rt$I$N$M" + CustomSymbolStrBlkIO "rtb_$N$M" + CustomSymbolStrTmpVar "$N$M" + CustomSymbolStrMacro "$R$N$M" + DefineNamingRule "None" + ParamNamingRule "None" + SignalNamingRule "None" + InsertBlockDesc off + SimulinkBlockComments on + EnableCustomComments off + InlinedPrmAccess "Literals" + ReqsInCode off + UseSimReservedNames off + } + Simulink.GRTTargetCC { + $BackupClass "Simulink.TargetCC" + $ObjectID 11 + Version "1.10.0" + Array { + Type "Cell" + Dimension 17 + Cell "GeneratePreprocessorConditionals" + Cell "IncludeMdlTerminateFcn" + Cell "CombineOutputUpdateFcns" + Cell "SuppressErrorStatus" + Cell "ERTCustomFileBanners" + Cell "GenerateSampleERTMain" + Cell "GenerateTestInterfaces" + Cell "ModelStepFunctionPrototypeControlCompliant" + Cell "CPPClassGenCompliant" + Cell "MultiInstanceERTCode" + Cell "PurelyIntegerCode" + Cell "SupportNonFinite" + Cell "SupportComplex" + Cell "SupportAbsoluteTime" + Cell "SupportContinuousTime" + Cell "SupportNonInlinedSFcns" + Cell "PortableWordSizes" + PropName "DisabledProps" + } + TargetFcnLib "ansi_tfl_table_tmw.mat" + TargetLibSuffix "" + TargetPreCompLibLocation "" + TargetFunctionLibrary "ANSI_C" + UtilityFuncGeneration "Auto" + ERTMultiwordTypeDef "System defined" + ERTCodeCoverageTool "None" + ERTMultiwordLength 256 + MultiwordLength 2048 + GenerateFullHeader on + GenerateSampleERTMain off + GenerateTestInterfaces off + IsPILTarget off + ModelReferenceCompliant on + ParMdlRefBuildCompliant on + CompOptLevelCompliant on + IncludeMdlTerminateFcn on + GeneratePreprocessorConditionals "Disable all" + CombineOutputUpdateFcns off + SuppressErrorStatus off + ERTFirstTimeCompliant off + IncludeFileDelimiter "Auto" + ERTCustomFileBanners off + SupportAbsoluteTime on + LogVarNameModifier "rt_" + MatFileLogging on + MultiInstanceERTCode off + SupportNonFinite on + SupportComplex on + PurelyIntegerCode off + SupportContinuousTime on + SupportNonInlinedSFcns on + SupportVariableSizeSignals off + EnableShiftOperators on + ParenthesesLevel "Nominal" + PortableWordSizes off + ModelStepFunctionPrototypeControlCompliant off + CPPClassGenCompliant off + AutosarCompliant off + UseMalloc off + ExtMode off + ExtModeStaticAlloc off + ExtModeTesting off + ExtModeStaticAllocSize 1000000 + ExtModeTransport 0 + ExtModeMexFile "ext_comm" + ExtModeIntrfLevel "Level1" + RTWCAPISignals off + RTWCAPIParams off + RTWCAPIStates off + GenerateASAP2 off + } + PropName "Components" + } + } + PropName "Components" + } + Name "Configuration" + CurrentDlgPage "Solver" + ConfigPrmDlgPosition " [ 200, 74, 1080, 704 ] " + } + PropName "ConfigurationSets" + } + Simulink.ConfigSet { + $PropName "ActiveConfigurationSet" + $ObjectID 1 + } + BlockDefaults { + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + NamePlacement "normal" + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + ShowName on + BlockRotation 0 + BlockMirror off + } + AnnotationDefaults { + HorizontalAlignment "center" + VerticalAlignment "middle" + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + UseDisplayTextAsClickCallback off + } + LineDefaults { + FontName "Helvetica" + FontSize 9 + FontWeight "normal" + FontAngle "normal" + } + BlockParameterDefaults { + Block { + BlockType Demux + Outputs "4" + DisplayOption "none" + BusSelectionMode off + } + Block { + BlockType Inport + Port "1" + UseBusObject off + BusObject "BusObject" + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + OutMin "[]" + OutMax "[]" + DataType "auto" + OutDataType "fixdt(1,16,0)" + OutScaling "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + SignalType "auto" + SamplingMode "auto" + LatchByDelayingOutsideSignal off + LatchInputForFeedbackSignals off + Interpolate on + } + Block { + BlockType Outport + Port "1" + UseBusObject off + BusObject "BusObject" + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + OutMin "[]" + OutMax "[]" + DataType "auto" + OutDataType "fixdt(1,16,0)" + OutScaling "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + SignalType "auto" + SamplingMode "auto" + SourceOfInitialOutputValue "Dialog" + OutputWhenDisabled "held" + InitialOutput "[]" + } + Block { + BlockType "S-Function" + FunctionName "system" + SFunctionModules "''" + PortCounts "[]" + SFunctionDeploymentMode off + } + Block { + BlockType SubSystem + ShowPortLabels "FromPortIcon" + Permissions "ReadWrite" + PermitHierarchicalResolution "All" + TreatAsAtomicUnit off + CheckFcnCallInpInsideContextMsg off + SystemSampleTime "-1" + RTWFcnNameOpts "Auto" + RTWFileNameOpts "Auto" + RTWMemSecFuncInitTerm "Inherit from model" + RTWMemSecFuncExecute "Inherit from model" + RTWMemSecDataConstants "Inherit from model" + RTWMemSecDataInternal "Inherit from model" + RTWMemSecDataParameters "Inherit from model" + SimViewingDevice off + DataTypeOverride "UseLocalSettings" + MinMaxOverflowLogging "UseLocalSettings" + } + Block { + BlockType Terminator + } + } + System { + Name "Jin_Parnas_Example" + Location [1009, 551, 1589, 811] + Open on + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + ReportName "simulink-default.rpt" + SIDHighWatermark 6 + Block { + BlockType SubSystem + Name "jin_ex" + SID 1 + Ports [2, 1] + Position [80, 54, 245, 121] + LibraryVersion "1.12" + UserDataPersistent on + UserData "DataTag0" + CopyFcn "TTdiag Copy" + DeleteFcn "TTdiag Delete" + OpenFcn "TTdiag Open Simulink" + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskDescription "Table Block" + MaskDisplay "port_label('input',1,'x');port_label('input',2,'y');port_label('output',1,'output');text(0.5," + " 0.9, 'Tabular Expression', 'horizontalAlignment', 'center')\ncolor('green')\ntext(0.5, 0.1, 'Checked', 'horizon" + "talAlignment', 'center')" + MaskIconFrame on + MaskIconOpaque on + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "normalized" + System { + Name "jin_ex" + Location [433, 447, 931, 747] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + Block { + BlockType Inport + Name "x" + SID 4 + Position [35, 38, 65, 52] + IconDisplay "Port number" + OutDataType "fixdt(1, 16)" + OutScaling "2^0" + } + Block { + BlockType Inport + Name "y" + SID 5 + Position [35, 38, 65, 52] + Port "2" + IconDisplay "Port number" + OutDataType "fixdt(1, 16)" + OutScaling "2^0" + } + Block { + BlockType SubSystem + Name "code" + SID 3 + Ports [2, 1] + Position [250, 49, 320, 96] + LibraryVersion "1.31" + PermitHierarchicalResolution "ExplicitOnly" + TreatAsAtomicUnit on + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskType "Stateflow" + MaskDescription "Embedded MATLAB block" + MaskDisplay "disp('jin_ex');" + MaskSelfModifiable on + MaskIconFrame on + MaskIconOpaque off + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "autoscale" + System { + Name "code" + Location [257, 457, 812, 717] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + SIDHighWatermark 19 + SIDPrevWatermark 13 + Block { + BlockType Inport + Name "x" + SID 1 + Position [20, 101, 40, 119] + IconDisplay "Port number" + OutDataType "sfix(16)" + OutScaling "2^0" + } + Block { + BlockType Inport + Name "y" + SID 18 + Position [20, 136, 40, 154] + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Demux + Name " Demux " + SID 15 + Ports [1, 1] + Position [270, 160, 320, 200] + Outputs "1" + } + Block { + BlockType "S-Function" + Name " SFunction " + SID 14 + Tag "Stateflow S-Function Jin_Parnas_Example 2" + Ports [2, 2] + Position [180, 100, 230, 160] + FunctionName "sf_sfun" + PortCounts "[2 2]" + EnableBusSupport off + Port { + PortNumber 2 + Name "output" + RTWStorageClass "Auto" + DataLoggingNameMode "SignalName" + } + } + Block { + BlockType Terminator + Name " Terminator " + SID 17 + Position [460, 171, 480, 189] + } + Block { + BlockType Outport + Name "output" + SID 19 + Position [460, 101, 480, 119] + IconDisplay "Port number" + } + Line { + SrcBlock " SFunction " + SrcPort 1 + DstBlock " Demux " + DstPort 1 + } + Line { + SrcBlock "x" + SrcPort 1 + DstBlock " SFunction " + DstPort 1 + } + Line { + SrcBlock "y" + SrcPort 1 + DstBlock " SFunction " + DstPort 2 + } + Line { + Name "output" + Labels [0, 0] + SrcBlock " SFunction " + SrcPort 2 + DstBlock "output" + DstPort 1 + } + Line { + SrcBlock " Demux " + SrcPort 1 + DstBlock " Terminator " + DstPort 1 + } + } + } + Block { + BlockType Outport + Name "output" + SID 6 + Position [35, 53, 65, 67] + IconDisplay "Port number" + OutDataType "fixdt(1, 16)" + OutScaling "2^0" + } + Line { + SrcBlock "x" + SrcPort 1 + DstBlock "code" + DstPort 1 + } + Line { + SrcBlock "y" + SrcPort 1 + DstBlock "code" + DstPort 2 + } + Line { + SrcBlock "code" + SrcPort 1 + DstBlock "output" + DstPort 1 + } + } + } + Annotation { + Name "Table1 from Jin and Parnas' paper \"Defining the meaning\nof tabular mathematical expressions\"\n\n" + "2 Dimensional normal function table of 2 variables\n\nprovable in PVS and CVC3" + Position [413, 93] + } + } +} +MatData { + NumRecords 1 + DataRecord { + Tag DataTag0 + Data " %)30 . > 8 ( $0 ! $ ! !-0T]3 0 $ $1A=&$. 2 8 ( #0 " + " % \" 8 ! 0 & & -T\" 0 $ ! !0 X #@,@ !@ @ ) 4" + " ( 0 + R ! ( \"P,@ %)30 . $#( 8 ( @ % \" $ ! 0 " + " % 0 !0 $ % 34-/4P . R#$ 8 ( $0 ! $ ! !-0T]3 0 T !&:6QE5W)A<'!E<" + "E]? #@ (@Q & \" $ !0 @ !9 0 $ #@ (@) & \" D !0 @ " + " !8\"0 0 $ @ %@) \" + -@! X @ . ( !@$ \"X\" 6 D 1W)I9# 0V5L;', 0V5L;#$" + " 8V]N9%]T97AT &-E;&Q?:6YD97@ <&%R96YT7V=R:60 8V5L;', 1W)I9 !P87)E;G1?8V5L; !S<&QI=%]P8@!N=6U?8V5L;', 9W)I9%]I;F1E>" + " !R1W)I9 !N97=?8V5L;%]P8@!D96QE=&5?8V5L;%]P8@!P8E]F;&%G $-E;&P '1?;V9F 0 # 0 \"H A 0 \"L B 0 \"P 7 0 \"T " + " ! , ! +@ \"$ ! +P \"( ! , !< ! ,0 $ P $ R (0 $ S " + " (@ $ T %P $ U 0 # 0 #8 A 0 #< B 0 #@ 7 0 #D !" + " , ! .@ \"$ ! .P \"( ! / !< ! /0 $ P $ ^ (0 $ _ (" + "@ $ ! %P $ !! 0 # 0 $( A 0 $, B 0 $0 7 0 $4 ! " + " , ! 1@ \"$ ! 1P \"( ! 2 !< ! 20 " + " " + " #@ . , 8 ( ! % \" " + "$ # 0 0 , >#PP X X !@ @ & 4 ( 0 $ ! D ( " + "\\#\\. , 8 ( ! % \" $ $ 0 0 0 >#T], X X !@ @ & 4" + " ( 0 $ ! D ( $ . 2 8 ( #0 % \" 8 ! 0 " + " & & -T\" 0 $ % 0 X X !@ @ & 4 ( 0 $ ! D " + " ( \\#\\. , 8 ( ! % \" $ # 0 0 , >#XP X X !@ @ " + " & 4 ( 0 $ ! D ( \"$ . 2 8 ( #0 % \" 8 " + " ! 0 & & -T\" 0 $ % 0 X X !@ @ & 4 ( 0 $ " + " ! D ( \\#\\. 4 8 ( #0 % \" @ ! 0 & ( " + " -T\" 0 , $ !@ < \" #@ #@ & \" 8 !0 @ ! 0 $ \"0 " + "@ (0 X X !@ @ & 4 ( 0 $ ! D ( \\#\\. 2 " + "8 ( #0 % \" 8 ! 0 & & -T\" 0 $ \" P X !( !@ " + " @ - 4 ( !@ $ ! 8 8 W0( ! 0 4 ! #@ #@ & \" " + "8 !0 @ ! 0 $ \"0 @ #P/PX !( !@ @ - 4 ( !@ $" + " ! 8 8 W0( ! 0 0 \" #@ # & \" 0 !0 @ ! P $" + " $ # 'D\\, . . 8 ( !@ % \" $ ! 0 ) \" / _#@ #" + " & \" 0 !0 @ ! ! $ $ $ 'D]/3 . . 8 ( !@ % \" " + "$ ! 0 ) \" ! #@ $@ & \" T !0 @ & 0 $ !@ !" + "@ #= @ $ ! \"0 $ . . 8 ( !@ % \" $ ! 0 ) \" " + " / _#@ #@ & \" 8 !0 @ ! 0 $ \"0 @ #P/PX X !@ " + " @ & 4 ( 0 $ ! D ( \\#\\. , 8 ( ! % \" " + " $ # 0 0 , >3XP X X !@ @ & 4 ( 0 $ ! D ( " + " \"$ . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ ) 0 " + " X X !@ @ & 4 ( 0 $ ! D ( \\#\\. . 8 ( !@ " + " % \" $ ! 0 ) \" / _#@ #@ & \" 8 !0 @ ! 0 " + " $ \"0 @ #P/PX !0 !@ @ - 4 ( \" $ ! 8 @ " + "W0( ! P @ * \"P ( . . 8 ( !@ % \" $ ! 0 ) \" " + " A #@ #@ & \" 8 !0 @ ! 0 $ \"0 @ 0 X !( !@ " + " @ - 4 ( !@ $ ! 8 8 W0( ! 0 ( # #@ $@ & \" " + " T !0 @ & 0 $ !@ !@ #= @ $ ! \"0 $ . . 8 ( !@ " + " % \" $ ! 0 ) \" / _#@ #@ & \" 8 !0 @ ! 0 " + " $ \"0 @ #P/PX X !@ @ & 4 ( 0 $ ! D ( " + " \\#\\. 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ ( @ " + " X X !@ @ $ 4 ( 0 < ! ! ' >%XR+7E>,@ . 2 8 ( !@ " + " % \" $ # 0 ) & / _ \\#\\ #P/PX !( !@ @ - " + " 4 ( !@ $ ! 8 8 W0( ! 0 0 \" #@ $@ & \" T !0 " + " @ & 0 $ !@ !@ #= @ $ ! \"@ ( . , 8 ( ! % \" " + " $ # 0 0 , >\"MY X !( !@ @ & 4 ( 0 , ! D 8 " + " \\#\\ #P/P / _#@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ " + " $ ! ! ( . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 " + " $ + @ X X !@ @ $ 4 ( 0 < ! ! ' >%XR*WE>,@ . 2 " + "8 ( !@ % \" $ # 0 ) & / _ \\#\\ #P/PX !( !@ " + " @ - 4 ( !@ $ ! 8 8 W0( ! 0 8 \" #@ $@ & \" " + " T !0 @ & 0 $ !@ !@ #= @ $ ! \" ( . . 8 ( ! " + " % \" $ ' 0 0 !P 'A>,BMY7C( #@ $@ & \" 8 !0 @ ! P " + "$ \"0 !@ #P/P / _ \\#\\. 2 8 ( #0 % \" 8 ! 0 " + " & & -T\" 0 $ & @ X !( !@ @ - 4 ( !@ $ ! " + " 8 8 W0( ! 0 H \" #@ #@ & \" 0 !0 @ ! !P $ $ " + " < !X7C(M>5XR X !( !@ @ & 4 ( 0 , ! D 8 \\#\\ #P/" + "P / _#@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ $ ! !@ " + "( . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ + @ " + "X P !@ @ $ 4 ( 0 , ! ! P!X*WD #@ $@ & \" 8 !0 @" + " ! P $ \"0 !@ #P/P / _ \\#\\. 2 8 ( #0 % \" " + " 8 ! 0 & & -T\" 0 $ ' @ X !( !@ @ - 4 ( !@ " + "$ ! 8 8 W0( ! 0 @ \" #@ #@ & \" 0 !0 @ ! !P " + "$ $ < !X7C(M>5XR X !( !@ @ & 4 ( 0 , ! D 8 " + "\\#\\ #P/P / _#@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ $" + " ! !P ( . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $" + " * @ X P !@ @ $ 4 ( 0 , ! ! P!X*WD #@ $@ & \" 8 " + " !0 @ ! P $ \"0 !@ #P/P / _ \\#\\. 2 8 ( #0 " + " % \" 8 ! 0 & & -T\" 0 $ ' @ X !( !@ @ - 4" + " ( !@ $ ! 8 8 W0( ! 0 L \" #@ #@ & \" 0 !0 @" + " ! !P $ $ < !X7C(K>5XR X !( !@ @ & 4 ( 0 , ! D " + " 8 \\#\\ #P/P / _#@ &@ & \" T !0 @ . 0 $ !@ #@ " + " #= @ $ ) P P - #@ \\ 0 $0 !( 3 ! X !( !@ @ - 4 " + " ( !@ $ ! 8 8 W0( ! 0 4 ! #@ $@ & \" T !0 @ " + " & 0 $ !@ !@ #= @ $ ! \"0 $ . 2 8 ( #0 % \" 8 " + " ! 0 & & -T\" 0 $ \" P X !( !@ @ - 4 ( !@ $ " + " ! 8 8 W0( ! 0 4 ! #@ $@ & \" T !0 @ & 0 $ " + " !@ !@ #= @ $ ! \"0 $ . . 8 ( ! % \" $ & 0 " + "0 !@ &II;E]E> #@ # & \" 0 !0 @ ! P $ $ # '@L>0 . F $ 8 (" + " @ % \" $ ! 0 % 0 !P $ C '0 8V5L;%]I;F1E> '!A'1?> " + " &-O;F1I=&EO;E]T97AT7WD !C;VYD:71I;VY?=&5X=%]O9F9S970 9W)I9%]P=7-H7W=I9'1H X P !@ @ & " + " 4 ( ! D #@ # & \" 8 !0 @ $ " + " \"0 . , 8 ( !@ % \" 0 ) X X !@ @ & " + " 4 ( 0 $ ! D ( . , 8 ( !@ % \" " + " 0 ) X X !@ @ & 4 ( 0 $ ! D ( . . " + " 8 ( !@ % \" $ ! 0 ) \" #@ # & \" 8 !" + "0 @ $ \"0 . . 8 ( !@ % \" $ ! 0 ) \"" + " #@ # & \" 8 !0 @ $ \"0 . . 8 ( !" + "@ % \" $ ! 0 ) \" &E #@ #@ & \" 8 !0 @ ! " + " 0 $ \"0 @ !.0 X X !@ @ & 4 ( 0 $ ! D ( " + " )$ . . 8 ( !@ % \" $ ! 0 ) \" \"1 #@ #@ & " + "\" 8 !0 @ ! 0 $ \"0 @ T0 X X !@ @ & 4 ( " + " 0 $ ! D ( /D . ^ 8 ( @ % \" $ ! 0 % 0 !" + "@ $ 2 0V5L;', 1W)I9#$ 1W)I9#( #@ # & \" 8 !0 @ $ \"" + "0 . , 8 ( !@ % \" 0 ) X P !@ @ & " + " 4 ( ! D #@ ) ! & \" ( !0 @ ! 0 $ !0 " + "$ P ! / $-E;&PQ $-E;&PR ')E0)\n output = x^2-y^2;\n end\nelseif(y==0)\n if(x<0)\n" + " output = x+y;\n elseif(x==0)\n output = x^2-y^2;\n elseif(x>0)\n output = x+y;\n end\nelseif(y>0)\n" + " if(x<0)\n output = x^2+y^2;\n elseif(x==0)\n output = x+y;\n elseif(x>0)\n output = x^2+y^2;\n end" + "\nend\n" + editorLayout "100 M4x1[205 227 1080 733]" + } + } + junction { + id 4 + position [23.5747 49.5747 7] + chart 2 + linkNode [2 0 0] + subviewer 2 + ssIdNumber 3 + type CONNECTIVE_JUNCTION + } + transition { + id 5 + labelString "{eML_blk_kernel();}" + labelPosition [32.125 19.875 102.544 14.964] + fontSize 12 + src { + intersection [0 0 1 0 23.5747 14.625 0 0] + } + dst { + id 4 + intersection [7 0 -1 -1 23.5747 42.5747 0 0] + } + midPoint [23.5747 24.9468] + chart 2 + linkNode [2 0 0] + dataLimits [23.575 23.575 14.625 34.575] + subviewer 2 + drawStyle SMART + executionOrder 1 + ssIdNumber 2 + } + data { + id 6 + ssIdNumber 4 + name "x" + linkNode [2 0 7] + scope INPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + method SF_INHERITED_TYPE + primitive SF_DOUBLE_TYPE + } + complexity SF_COMPLEX_INHERITED + } + dataType "Inherit: Same as Simulink" + } + data { + id 7 + ssIdNumber 5 + name "y" + linkNode [2 6 8] + scope INPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + method SF_INHERITED_TYPE + primitive SF_DOUBLE_TYPE + } + complexity SF_COMPLEX_INHERITED + frame SF_FRAME_NO + } + dataType "Inherit: Same as Simulink" + } + data { + id 8 + ssIdNumber 6 + name "output" + linkNode [2 7 0] + scope OUTPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + method SF_INHERITED_TYPE + primitive SF_DOUBLE_TYPE + isSigned 1 + wordLength "16" + } + complexity SF_COMPLEX_INHERITED + frame SF_FRAME_NO + } + dataType "Inherit: Same as Simulink" + } + instance { + id 9 + name "jin_ex/code" + machine 1 + chart 2 + } + target { + id 10 + name "sfun" + description "Default Simulink S-Function Target." + machine 1 + linkNode [1 0 0] + } +} diff --git a/Examples/ReadabilityExample.mdl b/Examples/ReadabilityExample.mdl index 6b727d404a29d25a13c121a5d587def6ef31eed4..b589cc9921e3f8c8497faca3b5e2516021a3d6a9 100644 --- a/Examples/ReadabilityExample.mdl +++ b/Examples/ReadabilityExample.mdl @@ -1,3 +1,4885 @@ +<<<<<<< HEAD +# MathWorks OPC Text Package +Model { + Version 10.4 + Description "Simulink model saved in R2021b" +} +__MWOPC_PACKAGE_BEGIN__ R2021b +__MWOPC_PART_BEGIN__ /[Content_Types].xml + + + + + + + + + + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /_rels/.rels + + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /metadata/coreProperties.xml + + + model + 2010-12-22T18:30:47Z + lawford + pesaraamarasekera + 2022-05-11T19:33:18Z + 24.0 + R2021b + + +__MWOPC_PART_BEGIN__ /metadata/mwcoreProperties.xml + + + application/vnd.mathworks.simulink.model + Simulink Model + R2021b + + +__MWOPC_PART_BEGIN__ /metadata/mwcorePropertiesExtension.xml + + + 33faaa3e-bf28-490c-80cd-a61f9200ea98 + + +__MWOPC_PART_BEGIN__ /metadata/mwcorePropertiesReleaseInfo.xml + + + + 9.11.0.1809720 + R2021b + Update 1 + Nov 02 2021 + 3710740051 + + +__MWOPC_PART_BEGIN__ /simulink/_rels/blockdiagram.xml.rels + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /simulink/_rels/configSetInfo.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/bddefaults.xml + + + +

center

+

middle

+
+ + + + + + + + + +

4

+

bar

+

off

+
+ +

1

+

off

+

Port number

+

off

+

[]

+

[]

+

Inherit: auto

+

off

+

off

+

inherit

+

-1

+

Inherit

+

-1

+

auto

+

auto

+

off

+

off

+

on

+
+ +

1

+

off

+

Port number

+

off

+

[]

+

[]

+

Inherit: auto

+

off

+

off

+

inherit

+

-1

+

Inherit

+

-1

+

auto

+

auto

+

off

+

Dialog

+

held

+

[]

+

off

+

off

+

0

+

on

+
+ +

system

+

''

+

[]

+

auto

+
+ +

FromPortIcon

+

ReadWrite

+

All

+

off

+

off

+

Sample time

+

-1

+

Auto

+

Auto

+

Auto

+

void_void

+

off

+

off

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

off

+

UseLocalSettings

+

AllNumericTypes

+

UseLocalSettings

+

off

+

off

+

NONE

+

off

+

expression

+

update diagram

+

off

+

off

+

on

+

off

+

off

+

off

+

0

+

off

+

off

+
+ +
+
+ +__MWOPC_PART_BEGIN__ /simulink/bdmxdata/UserData_1.mxarray BASE64 +AAFJTQAAAAAOAAAAeAAAAAYAAAAIAAAAEQAAAAAAAAABAAAAAAAAAAEABABNQ09TAQAEAERhdGEO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAAABAAAAEQAAAA4AAADA/AIABgAAAAgAAAAJAAAAAAAAAAUAAAAIAAAAAQAA +AJD8AgABAAAAAAAAAAIAAACQ/AIAAAFJTQAAAAAOAAAA8PsCAAYAAAAIAAAAAgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABQAAAAEAAAAFAAAATUNPUwAAAAAOAAAAqPsCAAYAAAAI +AAAAEQAAAAAAAAABAAAAAAAAAAEABABNQ09TAQAAAA0AAABGaWxlV3JhcHBlcl9fAAAADgAAAGj7 +AgAGAAAACAAAAAEAAAAAAAAABQAAAAgAAADHAwAAAQAAAAEAAAAAAAAADgAAADiqAAAGAAAACAAA +AAkAAAAAAAAABQAAAAgAAAAIqgAAAQAAAAEAAAAAAAAAAgAAAAiqAAADAAAA7wAAADANAACgDgAA +6BEAAGAnAADgogAACKoAAAAAAAAAAAAAR3JpZDAAQ2VsbHMAQ2VsbDEAY29uZABIb3Jpem9udGFs +QWxpZ25tZW50TW9kZQBtYW51YWwATWF4TW9kZQBNYXhfSQBNaW5Nb2RlAFN0cmluZ01vZGUAU3Ry +aW5nX0kAU3R5bGVNb2RlAFN0eWxlX0kAZWRpdABQb3NpdGlvbk1vZGUAUG9zaXRpb25fSQBCYWNr +Z3JvdW5kQ29sb3JNb2RlAEJhY2tncm91bmRDb2xvcl9JAENoaWxkcmVuAGhhbmRsZQBtYXRsYWIu +dWkuY29udHJvbC5DbGllbnRDb21wb25lbnQuU3RvcmFnZVVuaXRQb3MAVW5pdHNNb2RlAFVuaXRz +X0kAcGl4ZWxzAFJlZkZyYW1lTW9kZQBSZWZGcmFtZV9JAFNjcmVlblJlc29sdXRpb25Nb2RlAFNj +cmVlblJlc29sdXRpb25fSQBDaGFyYWN0ZXJXaWR0aE1vZGUAQ2hhcmFjdGVyV2lkdGhfSQBDaGFy +YWN0ZXJIZWlnaHRNb2RlAENoYXJhY3RlckhlaWdodF9JAFVuaXRzQ2FjaGUAUmVmRnJhbWVJbml0 +aWFsaXplZABvbgBDaGFyV2lkdGhJbml0aWFsaXplZABDaGFySGVpZ2h0SW5pdGlhbGl6ZWQARFBJ +SW5pdGlhbGl6ZWQAUG9zaXRpb25DYWNoZQBVbml0UG9zAG1hdGxhYi51aS5pbnRlcm5hbABWaXNp +YmxlTW9kZQBJbnRlcm5hbABTZXJpYWxpemFibGVBcHBsaWNhdGlvbkRhdGEAQ29weWFibGUAbWF0 +bGFiLmdyYXBoaWNzLmludGVybmFsLkdyYXBoaWNzQ29yZVByb3BlcnRpZXMuU2VyaWFsaXphYmxl +VUlDb250ZXh0TWVudQBHcmFwaGljc1BsYWNlaG9sZGVyAG1hdGxhYi5ncmFwaGljcwBtYXRsYWIu +Z3JhcGhpY3MuaW50ZXJuYWwuR3JhcGhpY3NDb3JlUHJvcGVydGllcy5Ub3BMZXZlbFNlcmlhbGl6 +ZWRPYmplY3QAb2ZmAEJlaW5nRGVsZXRlZABLZXlQcmVzc0Zjbk1vZGUAS2V5UHJlc3NGY25fSVMA +YW55AGZ1bmN0aW9uX2hhbmRsZV93b3Jrc3BhY2UAR3JpZDIAY2VsbHMAR1VJAEdyaWQxAG1haW5f +ZmlnAGZyYW1lAGZpZwBzY3JvbGxfdgBlZGl0X3RvZwBzYXZlX3BiAHB2c19wYgBjbG9zZV9wYgBz +YXZlX2V4dF9wYgBjaGVja19wYgBpbnB1dF9wYgBzZXR0aW5nc19wYgBmdW5jdGlvbl9uYW1lX2Nv +bnRyb2wAZnVuY3Rpb25fbmFtZV90ZXh0AGZ1bmN0aW9uX2lucHV0c190ZXh0AGZ1bmN0aW9uX2lu +cHV0c19jb250cm9sAGluaXRpYWxpemVkAGJsb2NrX2hhbmRsZQBzZXR0aW5ncwBoZWFkZXJfaGVp +Z2h0AGZpZ19oZWlnaHQAZmlnX3dpZHRoAHBiX29mZnNldABwYl93aWR0aABwYl9oZWlnaHQAaHR4 +X2hlaWdodAB0ZXh0X3dpZHRoAG5hbWVfbGFiZWwAaW5wdXRfbGFiZWwARGF0YQBQVlMAQ1ZDAHB2 +c19jaGVja2VkAG1vZGUARU1MR2VuAFRhYmxlQmxrAHNhdmVkAHZhbGlkYXRpb25fcmVwb3J0X2hh +bmRsZQBtdWx0aV90eXBlAG11bHRpX21vZGUAbXVsdGlfZ3JwAG11bHRpX29wdF9yZWcAbXVsdGlf +b3B0X291dABwcm92ZXJfb3B0X3B2cwBwcm92ZXJfb3B0X2N2YwB2ZXJzaW9uAHVuZG9fbWFuAHVu +ZG9fb3B0AHJlZG9fb3B0AGRlZmF1bHRfcHJvdmVyAFBWU19jb25zdABDVkNfY29uc3QARm9udFNp +emVNb2RlAEZvbnRXZWlnaHRNb2RlAEZvbnRXZWlnaHRfSQBib2xkAG1hdGxhYi51aS5pbnRlcm5h +bC5taXhpbi5Gb250UmVuZGVyYWJsZS5Gb250U3RvcmFnZQBwb2ludHMAbWF0bGFiLnVpLmludGVy +bmFsLlVuaXRQb3MuVW5pdHNDYWNoZQBtYXRsYWIudWkuaW50ZXJuYWwuVW5pdFBvcy5SZWZGcmFt +ZUluaXRpYWxpemVkAG1hdGxhYi51aS5pbnRlcm5hbC5Vbml0UG9zLkRQSUluaXRpYWxpemVkAG1h +dGxhYi51aS5pbnRlcm5hbC5Vbml0UG9zLlBvc2l0aW9uQ2FjaGUARm9udFN0b3JhZ2UAbWF0bGFi +LnVpLmludGVybmFsLm1peGluLk5vTWFyZ2luc1VuaXRzT25seVBvc2l0aW9uYWJsZS5PdXRlclBv +c2l0aW9uU3RvcmFnZQBVSUNvbnRyb2wAbWF0bGFiLnVpLmNvbnRyb2wAY29uZF90ZXh0AGNlbGxf +aW5kZXgAcGFyZW50X2dyaWQAR3JpZABwYXJlbnRfY2VsbABzcGxpdF9wYgBudW1fY2VsbHMAZ3Jp +ZF9pbmRleAByR3JpZABuZXdfY2VsbF9wYgBkZWxldGVfY2VsbF9wYgB3aWR0aABoZWlnaHQAZ3Jp +ZF9wYgBIb3Jpem9udGFsQWxpZ25tZW50X0kAbGVmdABDYWxsYmFja01vZGUAQ2FsbGJhY2tfSVMA +Q2VsbABzdWJncmlkAHBiX2ZsYWcAY29sb3IAY29uZGl0aW9uX3RleHRfd2lkdGgAY29uZGl0aW9u +X3RleHRfaGVpZ2h0AGNvbmRpdGlvbl90ZXh0X3gAY29uZGl0aW9uX3RleHRfeQBjb25kaXRpb25f +dGV4dF9vZmZzZXQAZ3JpZF9wdXNoX3dpZHRoAFNlcmlhbGl6YWJsZVVzZXJEYXRhAFJHcmlkAEVu +YWJsZU1vZGUAU3RvcmFnZVBvc2l0aW9uAFN0b3JhZ2VPdXRlclBvc2l0aW9uAENsb3NlUmVxdWVz +dEZjbk1vZGUAQ2xvc2VSZXF1ZXN0RmNuX0lTAFNpemVDaGFuZ2VkRmNuTW9kZQBTaXplQ2hhbmdl +ZEZjbl9JUwBNZW51QmFyTW9kZQBNZW51QmFyX0kAbm9uZQBOYW1lTW9kZQBOYW1lX0kATnVtYmVy +VGl0bGVNb2RlAE51bWJlclRpdGxlX0kAUG9pbnRlclNoYXBlQ0RhdGFfSVMAUG9pbnRlclNoYXBl +SG90U3BvdF9JUwBtYXRsYWIudWkuY29udGFpbmVyLkNvbnRhaW5lci5TZXJpYWxpemFibGVDaGls +ZHJlbgBMYWJlbE1vZGUATGFiZWxfSQBNZW51AG1hdGxhYi51aS5jb250YWluZXIAU2VwYXJhdG9y +TW9kZQBTZXBhcmF0b3JfSQBDaGVja2VkTW9kZQBDaGVja2VkX0kAQWNjZWxlcmF0b3JNb2RlAEFj +Y2VsZXJhdG9yX0kARW5hYmxlX0kAcmlnaHQAdGV4dAB0b2dnbGVidXR0b24AVmFsdWVNb2RlAFZh +bHVlX0kAV2ViQ29tcG9uZW50AFJlc2l6ZU1vZGUAbWF0bGFiLnVpLmludGVybmFsLm1peGluLlBy +aW50YWJsZS5QYXBlclBvc2l0aW9uU3RvcmFnZQBpbmNoZXMAUGFwZXJQb3NpdGlvblN0b3JhZ2UA +bWF0bGFiLnVpLmludGVybmFsLm1peGluLlByaW50YWJsZS5QYXBlclR5cGVTdG9yYWdlAFBhcGVy +VHlwZVN0b3JhZ2UAU2NyZWVuUGl4ZWxzUGVySW5jaE1vZGUARmlndXJlAG1hdGxhYi51aQBjb3Vu +dGVyX3RyaWFscwBjb3VudGVyX3JhbmdlAGV4Y2VwdABUVFNldHRpbmdzAHB2c19pbmNsdWRlcwBv +cGVuAGJ1dHRvbl93aWR0aABidXR0b25faGVpZ2h0AGJ1dHRvbl9vZmZzZXQAdGl0bGVfaGVpZ2h0 +AGxhYmVsX2hlaWdodABsYWJlbF93aWR0aAB0ZXh0X29mZnNldABpbmNsdWRlX3RleHQAY291bnRf +dGV4dAByYW5nZV90ZXh0AGV4Y2VwdF9jaGVjawBmdW5jdGlvbl9uYW1lAGZ1bmN0aW9uX2lucHV0 +cwBjaGVja2VkAGRhdGEAUFZTX2NoZWNrZXIAZGVmYXVsdF90eXBlAHB2c192ZXJzaW9uAG91dHB1 +dF90eXBlAGlucHV0X3R5cGUAdHlwZV9tb2RlAENWQ19jaGVja2VyAGNvbW1hbmQARU1MR2VuZXJh +dG9yAGRhdGF0eXBlAG11bHRpX291dHB1dABjdXJyZW50X2RlcHRoAHVuZG9fbGV2ZWwAVW5kb01h +bmFnZXIAcXVldWUAbWF4X2RlcHRoAENlbGwyAHJlc3VsdAByZXN1bHRfdGV4dABSQ2VsbAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAApAAAAKAAAAAAAAAAAAAAAMAAAAC8AAAAAAAAA +AAAAAAAAAAA3AAAAAAAAAAAAAAAAAAAAOgAAAAAAAAAAAAAAKQAAAHoAAAAAAAAAAAAAAH0AAAB8 +AAAAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAACbAAAAAAAAAAAA +AACwAAAArwAAAAAAAAAAAAAAfQAAAL0AAAAAAAAAAAAAACkAAADBAAAAAAAAAAAAAAApAAAAwwAA +AAAAAAAAAAAAxgAAAMUAAAAAAAAAAAAAAAAAAADKAAAAAAAAAAAAAAAAAAAAWQAAAAAAAAAAAAAA +AAAAANwAAAAAAAAAAAAAAAAAAADiAAAAAAAAAAAAAAAAAAAA5AAAAAAAAAAAAAAAAAAAAOkAAAAA +AAAAAAAAAAAAAADvAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA2AAAAAQAAAIkDAAABAAAANgAAAAEA +AAAYAAAAAQAAADYAAAABAAAAKgAAAAEAAAA2AAAAAQAAAEwAAAABAAAANgAAAAEAAABeAAAAAQAA +ADYAAAABAAAAgAAAAAEAAAA2AAAAAQAAAJIAAAABAAAANgAAAAEAAACuAAAAAQAAADYAAAABAAAA +xAAAAAEAAAA2AAAAAQAAAOUAAAABAAAANgAAAAEAAAD6AAAAAQAAADYAAAABAAAAEAEAAAEAAAA2 +AAAAAQAAADABAAABAAAANgAAAAEAAAAyAQAAAQAAADYAAAABAAAAQwEAAAEAAAA2AAAAAQAAAFkB +AAABAAAANgAAAAEAAABvAQAAAQAAADYAAAABAAAAhQEAAAEAAAA2AAAAAQAAAJsBAAABAAAANgAA +AAEAAACxAQAAAQAAADYAAAABAAAAvAEAAAEAAAA2AAAAAQAAAMIBAAABAAAANgAAAAEAAADMAQAA +AQAAADYAAAABAAAA0gEAAAEAAAA2AAAAAQAAANgBAAABAAAANgAAAAEAAADeAQAAAQAAADYAAAAB +AAAA5AEAAAEAAAA2AAAAAQAAAO4BAAABAAAANgAAAAEAAAD0AQAAAQAAADYAAAABAAAA+wEAAAEA +AAA2AAAAAQAAAAECAAABAAAANgAAAAEAAAALAgAAAQAAADYAAAABAAAAFgIAAAEAAAA2AAAAAQAA +ABwCAAABAAAANgAAAAEAAAAmAgAAAQAAADYAAAABAAAAMQIAAAEAAAA2AAAAAQAAADgCAAABAAAA +NgAAAAEAAABDAgAAAQAAADYAAAABAAAASQIAAAEAAAA2AAAAAQAAAFACAAABAAAANgAAAAEAAABW +AgAAAQAAADYAAAABAAAAXQIAAAEAAAA2AAAAAQAAAHICAAABAAAANgAAAAEAAACaAgAAAQAAADYA +AAABAAAAuAIAAAEAAAA2AAAAAQAAAMwCAAABAAAANgAAAAEAAADgAgAAAQAAADYAAAABAAAA9QIA +AAEAAAA2AAAAAQAAAAkDAAABAAAANgAAAAEAAAAdAwAAAQAAADYAAAABAAAAMQMAAAEAAAA2AAAA +AQAAAEYDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAQAAAOQAAAAK +AAAAAAAAAAAAAAAAAAAAAgAAAOMAAAAWAAAAAAAAAAAAAAAAAAAAAwAAAN0AAAAJAAAAAAAAAAAA +AAAAAAAABAAAANwAAAAHAAAAAAAAAAAAAAAAAAAABQAAANsAAAACAAAAAAAAAAAAAAAAAAAABgAA +AAEAAAAEAAAAAAAAAAAAAAABAAAAAAAAANgAAAAFAAAAAAAAAAAAAAAAAAAABwAAANcAAAAIAAAA +AAAAAAAAAAAAAAAACAAAAC0AAAAJAAAAAAAAAAAAAAAAAAAACQAAAAwAAAAHAAAAAAAAAAAAAAAA +AAAACgAAAAYAAAACAAAAAAAAAAAAAAAAAAAACwAAAAIAAAAEAAAAAAAAAAAAAAACAAAAAAAAAAMA +AAAGAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACAAAAAAAAAAAAAAAAAAAADQAAAAUAAAAHAAAAAAAA +AAAAAAAAAAAADgAAAAsAAAAEAAAAAAAAAAAAAAADAAAAAAAAAAcAAAACAAAAAAAAAAAAAAAAAAAA +DwAAAAgAAAAGAAAAAAAAAAAAAAAAAAAAEAAAAAkAAAACAAAAAAAAAAAAAAAAAAAAEQAAAAoAAAAJ +AAAAAAAAAAAAAAAAAAAAEgAAABcAAAAHAAAAAAAAAAAAAAAAAAAAEwAAABEAAAACAAAAAAAAAAAA +AAAAAAAAFAAAAA0AAAAEAAAAAAAAAAAAAAAEAAAAAAAAAA4AAAAGAAAAAAAAAAAAAAAAAAAAFQAA +AA8AAAACAAAAAAAAAAAAAAAAAAAAFgAAABAAAAAHAAAAAAAAAAAAAAAAAAAAFwAAABYAAAAEAAAA +AAAAAAAAAAAFAAAAAAAAABIAAAACAAAAAAAAAAAAAAAAAAAAGAAAABMAAAAGAAAAAAAAAAAAAAAA +AAAAGQAAABQAAAACAAAAAAAAAAAAAAAAAAAAGgAAABUAAAAJAAAAAAAAAAAAAAAAAAAAGwAAACIA +AAAHAAAAAAAAAAAAAAAAAAAAHAAAABwAAAACAAAAAAAAAAAAAAAAAAAAHQAAABgAAAAEAAAAAAAA +AAAAAAAGAAAAAAAAABkAAAAGAAAAAAAAAAAAAAAAAAAAHgAAABoAAAACAAAAAAAAAAAAAAAAAAAA +HwAAABsAAAAHAAAAAAAAAAAAAAAAAAAAIAAAACEAAAAEAAAAAAAAAAAAAAAHAAAAAAAAAB0AAAAC +AAAAAAAAAAAAAAAAAAAAIQAAAB4AAAAGAAAAAAAAAAAAAAAAAAAAIgAAAB8AAAACAAAAAAAAAAAA +AAAAAAAAIwAAACAAAAAHAAAAAAAAAAAAAAAAAAAAJAAAACcAAAAEAAAAAAAAAAAAAAAIAAAAAAAA +ACMAAAACAAAAAAAAAAAAAAAAAAAAJQAAACQAAAAGAAAAAAAAAAAAAAAAAAAAJgAAACUAAAACAAAA +AAAAAAAAAAAAAAAAJwAAACYAAAAHAAAAAAAAAAAAAAAAAAAAKAAAACwAAAAEAAAAAAAAAAAAAAAJ +AAAAAAAAACgAAAACAAAAAAAAAAAAAAAAAAAAKQAAACkAAAAGAAAAAAAAAAAAAAAAAAAAKgAAACoA +AAACAAAAAAAAAAAAAAAAAAAAKwAAACsAAAAIAAAAAAAAAAAAAAAAAAAALAAAAD4AAAAJAAAAAAAA +AAAAAAAAAAAALQAAADMAAAAHAAAAAAAAAAAAAAAAAAAALgAAADIAAAACAAAAAAAAAAAAAAAAAAAA +LwAAAC4AAAAEAAAAAAAAAAAAAAAKAAAAAAAAAC8AAAAGAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAC +AAAAAAAAAAAAAAAAAAAAMQAAADEAAAAHAAAAAAAAAAAAAAAAAAAAMgAAADgAAAAEAAAAAAAAAAAA +AAALAAAAAAAAADQAAAACAAAAAAAAAAAAAAAAAAAAMwAAADUAAAAGAAAAAAAAAAAAAAAAAAAANAAA +ADYAAAACAAAAAAAAAAAAAAAAAAAANQAAADcAAAAHAAAAAAAAAAAAAAAAAAAANgAAAD0AAAAEAAAA +AAAAAAAAAAAMAAAAAAAAADkAAAACAAAAAAAAAAAAAAAAAAAANwAAADoAAAAGAAAAAAAAAAAAAAAA +AAAAOAAAADsAAAACAAAAAAAAAAAAAAAAAAAAOQAAADwAAAAPAAAAAAAAAAAAAAAAAAAAOgAAANEA +AAACAAAAAAAAAAAAAAAAAAAAOwAAAD8AAAACAAAAAAAAAAAAAAAAAAAAPAAAAEAAAAAEAAAAAAAA +AAAAAAANAAAAAAAAAEEAAAAEAAAAAAAAAAAAAAAOAAAAAAAAAEIAAAAHAAAAAAAAAAAAAAAAAAAA +PQAAAEcAAAACAAAAAAAAAAAAAAAAAAAAPgAAAEMAAAAEAAAAAAAAAAAAAAAPAAAAAAAAAEQAAAAG +AAAAAAAAAAAAAAAAAAAAPwAAAEUAAAACAAAAAAAAAAAAAAAAAAAAQAAAAEYAAAAHAAAAAAAAAAAA +AAAAAAAAQQAAAEwAAAACAAAAAAAAAAAAAAAAAAAAQgAAAEgAAAAEAAAAAAAAAAAAAAAQAAAAAAAA +AEkAAAAGAAAAAAAAAAAAAAAAAAAAQwAAAEoAAAACAAAAAAAAAAAAAAAAAAAARAAAAEsAAAAHAAAA +AAAAAAAAAAAAAAAARQAAAFEAAAACAAAAAAAAAAAAAAAAAAAARgAAAE0AAAAEAAAAAAAAAAAAAAAR +AAAAAAAAAE4AAAAGAAAAAAAAAAAAAAAAAAAARwAAAE8AAAACAAAAAAAAAAAAAAAAAAAASAAAAFAA +AAAHAAAAAAAAAAAAAAAAAAAASQAAAFYAAAACAAAAAAAAAAAAAAAAAAAASgAAAFIAAAAEAAAAAAAA +AAAAAAASAAAAAAAAAFMAAAAGAAAAAAAAAAAAAAAAAAAASwAAAFQAAAACAAAAAAAAAAAAAAAAAAAA +TAAAAFUAAAAHAAAAAAAAAAAAAAAAAAAATQAAAFsAAAACAAAAAAAAAAAAAAAAAAAATgAAAFcAAAAE +AAAAAAAAAAAAAAATAAAAAAAAAFgAAAAGAAAAAAAAAAAAAAAAAAAATwAAAFkAAAACAAAAAAAAAAAA +AAAAAAAAUAAAAFoAAAAHAAAAAAAAAAAAAAAAAAAAUQAAAGAAAAACAAAAAAAAAAAAAAAAAAAAUgAA +AFwAAAAEAAAAAAAAAAAAAAAUAAAAAAAAAF0AAAAGAAAAAAAAAAAAAAAAAAAAUwAAAF4AAAACAAAA +AAAAAAAAAAAAAAAAVAAAAF8AAAALAAAAAAAAAAAAAAAAAAAAVQAAAGUAAAALAAAAAAAAAAAAAAAA +AAAAVgAAAGIAAAAEAAAAAAAAAAAAAAAVAAAAAAAAAGEAAAALAAAAAAAAAAAAAAAAAAAAVwAAAGQA +AAAEAAAAAAAAAAAAAAAWAAAAAAAAAGMAAAALAAAAAAAAAAAAAAAAAAAAWAAAAHwAAAALAAAAAAAA +AAAAAAAAAAAAWQAAAGcAAAAEAAAAAAAAAAAAAAAXAAAAAAAAAGYAAAALAAAAAAAAAAAAAAAAAAAA +WgAAAGkAAAAEAAAAAAAAAAAAAAAYAAAAAAAAAGgAAAALAAAAAAAAAAAAAAAAAAAAWwAAAGsAAAAE +AAAAAAAAAAAAAAAZAAAAAAAAAGoAAAALAAAAAAAAAAAAAAAAAAAAXAAAAG0AAAAEAAAAAAAAAAAA +AAAaAAAAAAAAAGwAAAALAAAAAAAAAAAAAAAAAAAAXQAAAG8AAAAEAAAAAAAAAAAAAAAbAAAAAAAA +AG4AAAALAAAAAAAAAAAAAAAAAAAAXgAAAHAAAAALAAAAAAAAAAAAAAAAAAAAXwAAAHIAAAAEAAAA +AAAAAAAAAAAcAAAAAAAAAHEAAAALAAAAAAAAAAAAAAAAAAAAYAAAAHQAAAAEAAAAAAAAAAAAAAAd +AAAAAAAAAHMAAAALAAAAAAAAAAAAAAAAAAAAYQAAAHkAAAALAAAAAAAAAAAAAAAAAAAAYgAAAHYA +AAAEAAAAAAAAAAAAAAAeAAAAAAAAAHUAAAALAAAAAAAAAAAAAAAAAAAAYwAAAHgAAAAEAAAAAAAA +AAAAAAAfAAAAAAAAAHcAAAALAAAAAAAAAAAAAAAAAAAAZAAAAHsAAAAEAAAAAAAAAAAAAAAgAAAA +AAAAAHoAAAALAAAAAAAAAAAAAAAAAAAAZQAAAIkAAAALAAAAAAAAAAAAAAAAAAAAZgAAAIEAAAAL +AAAAAAAAAAAAAAAAAAAAZwAAAH4AAAAEAAAAAAAAAAAAAAAhAAAAAAAAAH0AAAALAAAAAAAAAAAA +AAAAAAAAaAAAAIAAAAAEAAAAAAAAAAAAAAAiAAAAAAAAAH8AAAALAAAAAAAAAAAAAAAAAAAAaQAA +AIMAAAAEAAAAAAAAAAAAAAAjAAAAAAAAAIIAAAALAAAAAAAAAAAAAAAAAAAAagAAAIQAAAALAAAA +AAAAAAAAAAAAAAAAawAAAIYAAAAEAAAAAAAAAAAAAAAkAAAAAAAAAIUAAAALAAAAAAAAAAAAAAAA +AAAAbAAAAIgAAAAEAAAAAAAAAAAAAAAlAAAAAAAAAIcAAAALAAAAAAAAAAAAAAAAAAAAbQAAAJQA +AAALAAAAAAAAAAAAAAAAAAAAbgAAAIsAAAAEAAAAAAAAAAAAAAAmAAAAAAAAAIoAAAALAAAAAAAA +AAAAAAAAAAAAbwAAAI0AAAAEAAAAAAAAAAAAAAAnAAAAAAAAAIwAAAALAAAAAAAAAAAAAAAAAAAA +cAAAAI8AAAAEAAAAAAAAAAAAAAAoAAAAAAAAAI4AAAALAAAAAAAAAAAAAAAAAAAAcQAAAJEAAAAE +AAAAAAAAAAAAAAApAAAAAAAAAJAAAAALAAAAAAAAAAAAAAAAAAAAcgAAAJMAAAAEAAAAAAAAAAAA +AAAqAAAAAAAAAJIAAAAHAAAAAAAAAAAAAAAAAAAAcwAAAJkAAAACAAAAAAAAAAAAAAAAAAAAdAAA +AJUAAAAEAAAAAAAAAAAAAAArAAAAAAAAAJYAAAAGAAAAAAAAAAAAAAAAAAAAdQAAAJcAAAACAAAA +AAAAAAAAAAAAAAAAdgAAAJgAAAAHAAAAAAAAAAAAAAAAAAAAdwAAAJ0AAAACAAAAAAAAAAAAAAAA +AAAAeAAAAJoAAAAGAAAAAAAAAAAAAAAAAAAAeQAAAJsAAAACAAAAAAAAAAAAAAAAAAAAegAAAJwA +AAAHAAAAAAAAAAAAAAAAAAAAewAAAKIAAAACAAAAAAAAAAAAAAAAAAAAfAAAAJ4AAAAEAAAAAAAA +AAAAAAAsAAAAAAAAAJ8AAAAGAAAAAAAAAAAAAAAAAAAAfQAAAKAAAAACAAAAAAAAAAAAAAAAAAAA +fgAAAKEAAAAHAAAAAAAAAAAAAAAAAAAAfwAAAKYAAAACAAAAAAAAAAAAAAAAAAAAgAAAAKMAAAAG +AAAAAAAAAAAAAAAAAAAAgQAAAKQAAAACAAAAAAAAAAAAAAAAAAAAggAAAKUAAAAHAAAAAAAAAAAA +AAAAAAAAgwAAAKsAAAAEAAAAAAAAAAAAAAAtAAAAAAAAAKcAAAACAAAAAAAAAAAAAAAAAAAAhAAA +AKgAAAAGAAAAAAAAAAAAAAAAAAAAhQAAAKkAAAACAAAAAAAAAAAAAAAAAAAAhgAAAKoAAAAHAAAA +AAAAAAAAAAAAAAAAhwAAALAAAAAEAAAAAAAAAAAAAAAuAAAAAAAAAKwAAAACAAAAAAAAAAAAAAAA +AAAAiAAAAK0AAAAGAAAAAAAAAAAAAAAAAAAAiQAAAK4AAAACAAAAAAAAAAAAAAAAAAAAigAAAK8A +AAAHAAAAAAAAAAAAAAAAAAAAiwAAALUAAAAEAAAAAAAAAAAAAAAvAAAAAAAAALEAAAACAAAAAAAA +AAAAAAAAAAAAjAAAALIAAAAGAAAAAAAAAAAAAAAAAAAAjQAAALMAAAACAAAAAAAAAAAAAAAAAAAA +jgAAALQAAAAHAAAAAAAAAAAAAAAAAAAAjwAAALoAAAAEAAAAAAAAAAAAAAAwAAAAAAAAALYAAAAC +AAAAAAAAAAAAAAAAAAAAkAAAALcAAAAGAAAAAAAAAAAAAAAAAAAAkQAAALgAAAACAAAAAAAAAAAA +AAAAAAAAkgAAALkAAAAHAAAAAAAAAAAAAAAAAAAAkwAAAL8AAAAEAAAAAAAAAAAAAAAxAAAAAAAA +ALsAAAACAAAAAAAAAAAAAAAAAAAAlAAAALwAAAAGAAAAAAAAAAAAAAAAAAAAlQAAAL0AAAACAAAA +AAAAAAAAAAAAAAAAlgAAAL4AAAAHAAAAAAAAAAAAAAAAAAAAlwAAAMQAAAAEAAAAAAAAAAAAAAAy +AAAAAAAAAMAAAAACAAAAAAAAAAAAAAAAAAAAmAAAAMEAAAAGAAAAAAAAAAAAAAAAAAAAmQAAAMIA +AAACAAAAAAAAAAAAAAAAAAAAmgAAAMMAAAAHAAAAAAAAAAAAAAAAAAAAmwAAAMkAAAAEAAAAAAAA +AAAAAAAzAAAAAAAAAMUAAAACAAAAAAAAAAAAAAAAAAAAnAAAAMYAAAAGAAAAAAAAAAAAAAAAAAAA +nQAAAMcAAAACAAAAAAAAAAAAAAAAAAAAngAAAMgAAAAHAAAAAAAAAAAAAAAAAAAAnwAAAM4AAAAE +AAAAAAAAAAAAAAA0AAAAAAAAAMoAAAACAAAAAAAAAAAAAAAAAAAAoAAAAMsAAAAGAAAAAAAAAAAA +AAAAAAAAoQAAAMwAAAACAAAAAAAAAAAAAAAAAAAAogAAAM0AAAANAAAAAAAAAAAAAAAAAAAAowAA +AM8AAAAOAAAAAAAAAAAAAAAAAAAApAAAANAAAAAQAAAAAAAAAAAAAAAAAAAApQAAANIAAAASAAAA +AAAAAAAAAAAAAAAApgAAANMAAAATAAAAAAAAAAAAAAAAAAAApwAAANQAAAAUAAAAAAAAAAAAAAAA +AAAAqAAAANUAAAAVAAAAAAAAAAAAAAAAAAAAqQAAANYAAAAGAAAAAAAAAAAAAAAAAAAAqgAAANkA +AAACAAAAAAAAAAAAAAAAAAAAqwAAANoAAAAWAAAAAAAAAAAAAAAAAAAArAAAAN4AAAAWAAAAAAAA +AAAAAAAAAAAArQAAAN8AAAAWAAAAAAAAAAAAAAAAAAAArgAAAOAAAAAWAAAAAAAAAAAAAAAAAAAA +rwAAAOEAAAAWAAAAAAAAAAAAAAAAAAAAsAAAAOIAAAAAAAAAAAAAAAoAAAABAAAAAQAAALkDAAA7 +AAAAAQAAALoDAAA4AAAAAQAAALsDAADYAAAAAQAAALwDAADZAAAAAQAAAL0DAABOAAAAAQAAAL4D +AADaAAAAAQAAAL8DAADMAAAAAQAAAMADAAA+AAAAAQAAAMEDAABjAAAAAQAAAMIDAAAAAAAAAwAA +AAIAAAABAAAAtgMAADsAAAABAAAAtwMAADgAAAABAAAAuAMAAAUAAAADAAAAAQAAAJgDAADsAAAA +AQAAAJkDAADtAAAAAQAAAJoDAADuAAAAAQAAAJsDAACTAAAAAQAAAJwDAAAFAAAABAAAAAEAAACT +AwAAfgAAAAEAAACUAwAAfwAAAAEAAACVAwAAgAAAAAEAAACWAwAAkgAAAAEAAACXAwAAHQAAAAUA +AAAAAAAABgAAAAcAAAAAAAAABgAAAAgAAAABAAAAAAAAAAkAAAAAAAAABgAAAAoAAAAAAAAABgAA +AAsAAAABAAAAAQAAAAwAAAAAAAAABgAAAA0AAAAAAAAADgAAAA8AAAAAAAAABgAAABAAAAABAAAA +AgAAABEAAAAAAAAABgAAABIAAAABAAAAAwAAABMAAAABAAAABAAAABUAAAABAAAACQAAACoAAAAA +AAAABgAAACsAAAACAAAAAAAAACwAAAABAAAACgAAAC0AAAACAAAAAQAAAC4AAAABAAAACwAAADEA +AAAAAAAAMgAAADMAAAAAAAAAMgAAADQAAAAAAAAABgAAADUAAAABAAAAigMAAHAAAAAAAAAABgAA +AHEAAAAAAAAABgAAAHIAAAAAAAAAcwAAAHQAAAABAAAAjQMAAHsAAAABAAAAkgMAABYAAAAAAAAA +BgAAABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAAUAAAAb +AAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAAAYAAAAfAAAAAAAAAAYA +AAAgAAAAAQAAAAcAAAAhAAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAA +ACMAAAAmAAAAAAAAACMAAAAnAAAAAQAAAAgAAAAAAAAAJQAAADgAAAABAAAA2AAAADsAAAABAAAA +JAEAAAEAAAABAAAAJQEAAD4AAAABAAAAXwMAAEAAAAABAAAAYAMAAEEAAAABAAAAYQMAAEIAAAAB +AAAAYgMAAEMAAAABAAAAYwMAAEQAAAABAAAAZAMAAEUAAAABAAAAZQMAAEYAAAABAAAAZgMAAEcA +AAABAAAAZwMAAEgAAAABAAAAaAMAAEkAAAABAAAAaQMAAEoAAAABAAAAagMAAEsAAAABAAAAawMA +AEwAAAABAAAAbAMAAE0AAAABAAAAbQMAAE4AAAABAAAAcQMAAFcAAAABAAAAcgMAAFgAAAABAAAA +cwMAAFkAAAABAAAAdAMAAFoAAAABAAAAdgMAAFsAAAABAAAAeAMAAFwAAAABAAAAeQMAAF0AAAAB +AAAAegMAAF4AAAABAAAAfAMAAGAAAAABAAAAfQMAAGMAAAABAAAAfgMAAGUAAAABAAAAfwMAAGYA +AAABAAAAgAMAAGcAAAABAAAAgQMAAGgAAAABAAAAggMAAGoAAAABAAAAhQMAAGsAAAABAAAAhgMA +AGwAAAABAAAAhwMAAG0AAAABAAAAiAMAAAYAAAA5AAAAAQAAAKgAAACEAAAAAQAAAKkAAACFAAAA +AQAAAKoAAACGAAAAAQAAAKsAAACHAAAAAQAAAMEAAACIAAAAAQAAANcAAAAAAAAACQAAAAQAAAAB +AAAAIgAAAH4AAAABAAAAIwAAAH8AAAABAAAAJAAAAIAAAAABAAAAJQAAAIkAAAABAAAAJgAAAIoA +AAABAAAAJwAAAIsAAAABAAAAPQAAAJIAAAABAAAAPgAAAJMAAAABAAAAPwAAAB0AAAAFAAAAAAAA +AAYAAAAHAAAAAAAAAAYAAAAIAAAAAQAAAAwAAAAJAAAAAAAAAAYAAAAKAAAAAAAAAAYAAAALAAAA +AQAAAA0AAAAMAAAAAAAAAAYAAAANAAAAAAAAAA4AAAAPAAAAAAAAAAYAAAAQAAAAAQAAAA4AAAAR +AAAAAAAAAAYAAAASAAAAAQAAAA8AAAATAAAAAQAAABAAAAAVAAAAAQAAABUAAAAqAAAAAAAAAAYA +AAArAAAAAgAAAAAAAAAsAAAAAQAAABYAAAAtAAAAAgAAAAEAAAAuAAAAAQAAABcAAAAxAAAAAAAA +ADIAAAAzAAAAAAAAADIAAAA0AAAAAAAAAAYAAAA1AAAAAQAAABkAAABwAAAAAAAAAAYAAABxAAAA +AAAAAAYAAAByAAAAAAAAAHMAAAB0AAAAAQAAABwAAAB7AAAAAQAAACEAAAAWAAAAAAAAAAYAAAAQ +AAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAYAAAAGQAAAAAAAAAGAAAAGgAAAAEAAAARAAAAGwAAAAAA +AAAGAAAAHAAAAAIAAACQAAAAHQAAAAAAAAAGAAAAHgAAAAEAAAASAAAAHwAAAAAAAAAGAAAAIAAA +AAEAAAATAAAAIQAAAAAAAAAYAAAAIgAAAAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAA +JgAAAAAAAAAjAAAAJwAAAAEAAAAUAAAAAAAAAAoAAAAWAAAAAAAAAAYAAAAXAAAAAAAAAHUAAAAZ +AAAAAAAAAAYAAAAaAAAAAQAAABoAAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAB2AAAAAAAAAHUA +AAB3AAAAAAAAACMAAAB4AAAAAAAAACMAAAB5AAAAAQAAABsAAAAAAAAAEAAAABYAAAAAAAAABgAA +ABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAAHQAAABsAAAAAAAAABgAAABwAAAACAAAA +kAAAAB0AAAAAAAAABgAAAB4AAAABAAAAHgAAAB8AAAAAAAAABgAAACAAAAABAAAAHwAAACEAAAAA +AAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAAAAAAIwAAACYAAAAAAAAAIwAAACcA +AAABAAAAIAAAAAAAAAAVAAAABQAAAAAAAAAGAAAAjAAAAAAAAACNAAAACgAAAAAAAAAGAAAACwAA +AAEAAAAoAAAADAAAAAAAAAAGAAAADwAAAAAAAAAGAAAAEAAAAAEAAAApAAAAjgAAAAAAAAAGAAAA +jwAAAAEAAAArAAAAEwAAAAEAAAAsAAAAFQAAAAEAAAAxAAAAKwAAAAIAAAAAAAAALAAAAAEAAAAy +AAAALQAAAAIAAAABAAAALgAAAAEAAAAzAAAAMQAAAAAAAAAyAAAAMwAAAAAAAAAyAAAAmgAAAAEA +AAA0AAAAdAAAAAEAAAA3AAAAewAAAAEAAAA8AAAAFgAAAAAAAAAGAAAAEAAAABYAAAAAAAAABgAA +ABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAALQAAABsAAAAAAAAABgAAABwAAAACAAAA +kAAAAB0AAAAAAAAABgAAAB4AAAABAAAALgAAAB8AAAAAAAAABgAAACAAAAABAAAALwAAACEAAAAA +AAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAAAAAAIwAAACYAAAAAAAAAIwAAACcA +AAABAAAAMAAAAAAAAAAKAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAB1AAAAGQAAAAAAAAAGAAAAGgAA +AAEAAAA1AAAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAdgAAAAAAAAB1AAAAdwAAAAAAAAAjAAAA +eAAAAAAAAAAjAAAAeQAAAAEAAAA2AAAAAAAAABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAAABgAAAAZ +AAAAAAAAAAYAAAAaAAAAAQAAADgAAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAAAAAAAAYA +AAAeAAAAAQAAADkAAAAfAAAAAAAAAAYAAAAgAAAAAQAAADoAAAAhAAAAAAAAABgAAAAiAAAAAAAA +ACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMAAAAnAAAAAQAAADsAAAAAAAAA +CQAAAAQAAAABAAAAVgAAAH4AAAABAAAAVwAAAH8AAAABAAAAWAAAAIAAAAABAAAAWQAAAIkAAAAB +AAAAWgAAAIoAAAABAAAAWwAAAIsAAAABAAAAcQAAAJIAAAABAAAAcgAAAJMAAAABAAAAcwAAAB0A +AAAFAAAAAAAAAAYAAAAHAAAAAAAAAAYAAAAIAAAAAQAAAEAAAAAJAAAAAAAAAAYAAAAKAAAAAAAA +AAYAAAALAAAAAQAAAEEAAAAMAAAAAAAAAAYAAAANAAAAAAAAAA4AAAAPAAAAAAAAAAYAAAAQAAAA +AQAAAEIAAAARAAAAAAAAAAYAAAASAAAAAQAAAEMAAAATAAAAAQAAAEQAAAAVAAAAAQAAAEkAAAAq +AAAAAAAAAAYAAAArAAAAAgAAAAAAAAAsAAAAAQAAAEoAAAAtAAAAAgAAAAEAAAAuAAAAAQAAAEsA +AAAxAAAAAAAAADIAAAAzAAAAAAAAADIAAAA0AAAAAAAAAAYAAAA1AAAAAQAAAE0AAABwAAAAAAAA +AAYAAABxAAAAAAAAAAYAAAByAAAAAAAAAHMAAAB0AAAAAQAAAFAAAAB7AAAAAQAAAFUAAAAWAAAA +AAAAAAYAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAYAAAAGQAAAAAAAAAGAAAAGgAAAAEAAABF +AAAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAAAAAGAAAAHgAAAAEAAABGAAAAHwAAAAAA +AAAGAAAAIAAAAAEAAABHAAAAIQAAAAAAAAAYAAAAIgAAAAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAA +AAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAABIAAAAAAAAAAoAAAAWAAAAAAAAAAYAAAAXAAAA +AAAAAHUAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAE4AAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAB2 +AAAAAAAAAHUAAAB3AAAAAAAAACMAAAB4AAAAAAAAACMAAAB5AAAAAQAAAE8AAAAAAAAAEAAAABYA +AAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAAUQAAABsAAAAAAAAABgAA +ABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAUgAAAB8AAAAAAAAABgAAACAAAAABAAAA +UwAAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAAAAAAIwAAACYAAAAA +AAAAIwAAACcAAAABAAAAVAAAAAAAAAAVAAAABQAAAAAAAAAGAAAAjAAAAAAAAACNAAAACgAAAAAA +AAAGAAAACwAAAAEAAABcAAAADAAAAAAAAAAGAAAADwAAAAAAAAAGAAAAEAAAAAEAAABdAAAAjgAA +AAAAAAAGAAAAjwAAAAEAAABfAAAAEwAAAAEAAABgAAAAFQAAAAEAAABlAAAAKwAAAAIAAAAAAAAA +LAAAAAEAAABmAAAALQAAAAIAAAABAAAALgAAAAEAAABnAAAAMQAAAAAAAAAyAAAAMwAAAAAAAAAy +AAAAmgAAAAEAAABoAAAAdAAAAAEAAABrAAAAewAAAAEAAABwAAAAFgAAAAAAAAAGAAAAEAAAABYA +AAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAAYQAAABsAAAAAAAAABgAA +ABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAYgAAAB8AAAAAAAAABgAAACAAAAABAAAA +YwAAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAAAAAAIwAAACYAAAAA +AAAAIwAAACcAAAABAAAAZAAAAAAAAAAKAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAB1AAAAGQAAAAAA +AAAGAAAAGgAAAAEAAABpAAAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAdgAAAAAAAAB1AAAAdwAA +AAAAAAAjAAAAeAAAAAAAAAAjAAAAeQAAAAEAAABqAAAAAAAAABAAAAAWAAAAAAAAAAYAAAAXAAAA +AAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAGwAAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAd +AAAAAAAAAAYAAAAeAAAAAQAAAG0AAAAfAAAAAAAAAAYAAAAgAAAAAQAAAG4AAAAhAAAAAAAAABgA +AAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMAAAAnAAAAAQAA +AG8AAAAAAAAACQAAAAQAAAABAAAAigAAAH4AAAABAAAAiwAAAH8AAAABAAAAjAAAAIAAAAABAAAA +jQAAAIkAAAABAAAAjgAAAIoAAAABAAAAjwAAAIsAAAABAAAApQAAAJIAAAABAAAApgAAAJMAAAAB +AAAApwAAAB0AAAAFAAAAAAAAAAYAAAAHAAAAAAAAAAYAAAAIAAAAAQAAAHQAAAAJAAAAAAAAAAYA +AAAKAAAAAAAAAAYAAAALAAAAAQAAAHUAAAAMAAAAAAAAAAYAAAANAAAAAAAAAA4AAAAPAAAAAAAA +AAYAAAAQAAAAAQAAAHYAAAARAAAAAAAAAAYAAAASAAAAAQAAAHcAAAATAAAAAQAAAHgAAAAVAAAA +AQAAAH0AAAAqAAAAAAAAAAYAAAArAAAAAgAAAAAAAAAsAAAAAQAAAH4AAAAtAAAAAgAAAAEAAAAu +AAAAAQAAAH8AAAAxAAAAAAAAADIAAAAzAAAAAAAAADIAAAA0AAAAAAAAAAYAAAA1AAAAAQAAAIEA +AABwAAAAAAAAAAYAAABxAAAAAAAAAAYAAAByAAAAAAAAAHMAAAB0AAAAAQAAAIQAAAB7AAAAAQAA +AIkAAAAWAAAAAAAAAAYAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAYAAAAGQAAAAAAAAAGAAAA +GgAAAAEAAAB5AAAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAAAAAGAAAAHgAAAAEAAAB6 +AAAAHwAAAAAAAAAGAAAAIAAAAAEAAAB7AAAAIQAAAAAAAAAYAAAAIgAAAAAAAAAjAAAAJAAAAAAA +AAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAAB8AAAAAAAAAAoAAAAWAAAAAAAA +AAYAAAAXAAAAAAAAAHUAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAIIAAAAbAAAAAAAAAAYAAAAcAAAA +AgAAAJAAAAB2AAAAAAAAAHUAAAB3AAAAAAAAACMAAAB4AAAAAAAAACMAAAB5AAAAAQAAAIMAAAAA +AAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAAhQAAABsA +AAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAhgAAAB8AAAAAAAAABgAA +ACAAAAABAAAAhwAAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAAAAAA +IwAAACYAAAAAAAAAIwAAACcAAAABAAAAiAAAAAAAAAAVAAAABQAAAAAAAAAGAAAAjAAAAAAAAACN +AAAACgAAAAAAAAAGAAAACwAAAAEAAACQAAAADAAAAAAAAAAGAAAADwAAAAAAAAAGAAAAEAAAAAEA +AACRAAAAjgAAAAAAAAAGAAAAjwAAAAEAAACTAAAAEwAAAAEAAACUAAAAFQAAAAEAAACZAAAAKwAA +AAIAAAAAAAAALAAAAAEAAACaAAAALQAAAAIAAAABAAAALgAAAAEAAACbAAAAMQAAAAAAAAAyAAAA +MwAAAAAAAAAyAAAAmgAAAAEAAACcAAAAdAAAAAEAAACfAAAAewAAAAEAAACkAAAAFgAAAAAAAAAG +AAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAAlQAAABsA +AAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAlgAAAB8AAAAAAAAABgAA +ACAAAAABAAAAlwAAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAAAAAA +IwAAACYAAAAAAAAAIwAAACcAAAABAAAAmAAAAAAAAAAKAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAB1 +AAAAGQAAAAAAAAAGAAAAGgAAAAEAAACdAAAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAdgAAAAAA +AAB1AAAAdwAAAAAAAAAjAAAAeAAAAAAAAAAjAAAAeQAAAAEAAACeAAAAAAAAABAAAAAWAAAAAAAA +AAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAKAAAAAbAAAAAAAAAAYAAAAcAAAA +AgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAAKEAAAAfAAAAAAAAAAYAAAAgAAAAAQAAAKIAAAAh +AAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMA +AAAnAAAAAQAAAKMAAAAAAAAAFQAAAAUAAAAAAAAABgAAAIwAAAAAAAAAjQAAAAoAAAAAAAAABgAA +AAsAAAABAAAArAAAAAwAAAAAAAAABgAAAA8AAAAAAAAABgAAABAAAAABAAAArQAAAI4AAAAAAAAA +BgAAAI8AAAABAAAArwAAABMAAAABAAAAsAAAABUAAAABAAAAtQAAACsAAAACAAAAAAAAACwAAAAB +AAAAtgAAAC0AAAACAAAAAQAAAC4AAAABAAAAtwAAADEAAAAAAAAAMgAAADMAAAAAAAAAMgAAAJoA +AAABAAAAuAAAAHQAAAABAAAAuwAAAHsAAAABAAAAwAAAABYAAAAAAAAABgAAABAAAAAWAAAAAAAA +AAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAALEAAAAbAAAAAAAAAAYAAAAcAAAA +AgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAALIAAAAfAAAAAAAAAAYAAAAgAAAAAQAAALMAAAAh +AAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMA +AAAnAAAAAQAAALQAAAAAAAAACgAAABYAAAAAAAAABgAAABcAAAAAAAAAdQAAABkAAAAAAAAABgAA +ABoAAAABAAAAuQAAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAHYAAAAAAAAAdQAAAHcAAAAAAAAA +IwAAAHgAAAAAAAAAIwAAAHkAAAABAAAAugAAAAAAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAY +AAAAGQAAAAAAAAAGAAAAGgAAAAEAAAC8AAAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAA +AAAGAAAAHgAAAAEAAAC9AAAAHwAAAAAAAAAGAAAAIAAAAAEAAAC+AAAAIQAAAAAAAAAYAAAAIgAA +AAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAAC/AAAA +AAAAABYAAAAFAAAAAAAAAAYAAACMAAAAAAAAAI0AAAAKAAAAAAAAAAYAAAALAAAAAQAAAMIAAAAM +AAAAAAAAAAYAAAAPAAAAAAAAAAYAAAAQAAAAAQAAAMMAAACOAAAAAAAAAAYAAACPAAAAAQAAAMUA +AAATAAAAAQAAAMYAAAAVAAAAAQAAAMsAAACcAAAAAAAAAAYAAAArAAAAAgAAAAAAAAAsAAAAAQAA +AMwAAAAtAAAAAgAAAAEAAAAuAAAAAQAAAM0AAAAxAAAAAAAAADIAAAAzAAAAAAAAADIAAACaAAAA +AQAAAM4AAAB0AAAAAQAAANEAAAB7AAAAAQAAANYAAAAWAAAAAAAAAAYAAAAAAAAAEAAAABYAAAAA +AAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAAxwAAABsAAAAAAAAABgAAABwA +AAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAyAAAAB8AAAAAAAAABgAAACAAAAABAAAAyQAA +ACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAAAAAAIwAAACYAAAAAAAAA +IwAAACcAAAABAAAAygAAAAAAAAAKAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAB1AAAAGQAAAAAAAAAG +AAAAGgAAAAEAAADPAAAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAdgAAAAAAAAB1AAAAdwAAAAAA +AAAjAAAAeAAAAAAAAAAjAAAAeQAAAAEAAADQAAAAAAAAABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAA +ABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAANIAAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAA +AAAAAAYAAAAeAAAAAQAAANMAAAAfAAAAAAAAAAYAAAAgAAAAAQAAANQAAAAhAAAAAAAAABgAAAAi +AAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMAAAAnAAAAAQAAANUA +AAAAAAAABgAAADkAAAABAAAA9AAAAIQAAAABAAAA9QAAAIUAAAABAAAA9gAAAIYAAAABAAAA9wAA +AIcAAAABAAAADQEAAIgAAAABAAAAIwEAAAAAAAAFAAAABAAAAAEAAADvAAAAfgAAAAEAAADwAAAA +fwAAAAEAAADxAAAAgAAAAAEAAADyAAAAkgAAAAEAAADzAAAAHQAAAAUAAAAAAAAABgAAAAcAAAAA +AAAABgAAAAgAAAABAAAA2QAAAAkAAAAAAAAABgAAAAoAAAAAAAAABgAAAAsAAAABAAAA2gAAAAwA +AAAAAAAABgAAAA0AAAAAAAAADgAAAA8AAAAAAAAABgAAABAAAAABAAAA2wAAABEAAAAAAAAABgAA +ABIAAAABAAAA3AAAABMAAAABAAAA3QAAABUAAAABAAAA4gAAACoAAAAAAAAABgAAACsAAAACAAAA +AAAAACwAAAABAAAA4wAAAC0AAAACAAAAAQAAAC4AAAABAAAA5AAAADEAAAAAAAAAMgAAADMAAAAA +AAAAMgAAADQAAAAAAAAABgAAADUAAAABAAAA5gAAAHAAAAAAAAAABgAAAHEAAAAAAAAABgAAAHIA +AAAAAAAAcwAAAHQAAAABAAAA6QAAAHsAAAABAAAA7gAAABYAAAAAAAAABgAAABAAAAAWAAAAAAAA +AAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAN4AAAAbAAAAAAAAAAYAAAAcAAAA +AgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAAN8AAAAfAAAAAAAAAAYAAAAgAAAAAQAAAOAAAAAh +AAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMA +AAAnAAAAAQAAAOEAAAAAAAAACgAAABYAAAAAAAAABgAAABcAAAAAAAAAdQAAABkAAAAAAAAABgAA +ABoAAAABAAAA5wAAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAHYAAAAAAAAAdQAAAHcAAAAAAAAA +IwAAAHgAAAAAAAAAIwAAAHkAAAABAAAA6AAAAAAAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAY +AAAAGQAAAAAAAAAGAAAAGgAAAAEAAADqAAAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAA +AAAGAAAAHgAAAAEAAADrAAAAHwAAAAAAAAAGAAAAIAAAAAEAAADsAAAAIQAAAAAAAAAYAAAAIgAA +AAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAADtAAAA +AAAAABUAAAAFAAAAAAAAAAYAAACMAAAAAAAAAI0AAAAKAAAAAAAAAAYAAAALAAAAAQAAAPgAAAAM +AAAAAAAAAAYAAAAPAAAAAAAAAAYAAAAQAAAAAQAAAPkAAACOAAAAAAAAAAYAAACPAAAAAQAAAPsA +AAATAAAAAQAAAPwAAAAVAAAAAQAAAAEBAAArAAAAAgAAAAAAAAAsAAAAAQAAAAIBAAAtAAAAAgAA +AAEAAAAuAAAAAQAAAAMBAAAxAAAAAAAAADIAAAAzAAAAAAAAADIAAACaAAAAAQAAAAQBAAB0AAAA +AQAAAAcBAAB7AAAAAQAAAAwBAAAWAAAAAAAAAAYAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAY +AAAAGQAAAAAAAAAGAAAAGgAAAAEAAAD9AAAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAA +AAAGAAAAHgAAAAEAAAD+AAAAHwAAAAAAAAAGAAAAIAAAAAEAAAD/AAAAIQAAAAAAAAAYAAAAIgAA +AAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAAAAAQAA +AAAAAAoAAAAWAAAAAAAAAAYAAAAXAAAAAAAAAHUAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAAUBAAAb +AAAAAAAAAAYAAAAcAAAAAgAAAJAAAAB2AAAAAAAAAHUAAAB3AAAAAAAAACMAAAB4AAAAAAAAACMA +AAB5AAAAAQAAAAYBAAAAAAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAA +ABoAAAABAAAACAEAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAA +CQEAAB8AAAAAAAAABgAAACAAAAABAAAACgEAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAA +AAAAIwAAACUAAAAAAAAAIwAAACYAAAAAAAAAIwAAACcAAAABAAAACwEAAAAAAAAWAAAABQAAAAAA +AAAGAAAAjAAAAAAAAACNAAAACgAAAAAAAAAGAAAACwAAAAEAAAAOAQAADAAAAAAAAAAGAAAADwAA +AAAAAAAGAAAAEAAAAAEAAAAPAQAAjgAAAAAAAAAGAAAAjwAAAAEAAAARAQAAEwAAAAEAAAASAQAA +FQAAAAEAAAAXAQAAnAAAAAAAAAAGAAAAKwAAAAIAAAAAAAAALAAAAAEAAAAYAQAALQAAAAIAAAAB +AAAALgAAAAEAAAAZAQAAMQAAAAAAAAAyAAAAMwAAAAAAAAAyAAAAmgAAAAEAAAAaAQAAdAAAAAEA +AAAdAQAAewAAAAEAAAAiAQAAFgAAAAAAAAAGAAAAAAAAABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAA +ABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAABMBAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAA +AAAAAAYAAAAeAAAAAQAAABQBAAAfAAAAAAAAAAYAAAAgAAAAAQAAABUBAAAhAAAAAAAAABgAAAAi +AAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMAAAAnAAAAAQAAABYB +AAAAAAAACgAAABYAAAAAAAAABgAAABcAAAAAAAAAdQAAABkAAAAAAAAABgAAABoAAAABAAAAGwEA +ABsAAAAAAAAABgAAABwAAAACAAAAkAAAAHYAAAAAAAAAdQAAAHcAAAAAAAAAIwAAAHgAAAAAAAAA +IwAAAHkAAAABAAAAHAEAAAAAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAYAAAAGQAAAAAAAAAG +AAAAGgAAAAEAAAAeAQAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAAAAAGAAAAHgAAAAEA +AAAfAQAAHwAAAAAAAAAGAAAAIAAAAAEAAAAgAQAAIQAAAAAAAAAYAAAAIgAAAAAAAAAjAAAAJAAA +AAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAAAhAQAAAAAAABsAAAAPAAAA +AAAAAAYAAAAWAAAAAAAAAAYAAACdAAAAAQAAACoBAACeAAAAAQAAAC8BAACfAAAAAAAAAAYAAACg +AAAAAQAAADEBAAChAAAAAAAAAAYAAACiAAAAAQAAADMBAACjAAAAAAAAAAYAAACkAAAAAAAAAKUA +AACmAAAAAAAAAAYAAACnAAAAAQAAADQBAACoAAAAAAAAAAYAAACpAAAAAAAAADIAAACqAAAAAQAA +ADUBAACrAAAAAQAAADYBAACsAAAAAQAAAFgDAAArAAAAAgAAAAAAAAAsAAAAAQAAAFkDAAAtAAAA +AgAAAAEAAAAuAAAAAQAAAFoDAAAxAAAAAAAAACMAAAAzAAAAAAAAADIAAAC+AAAAAAAAAAYAAAC/ +AAAAAQAAAFwDAADCAAAAAQAAAF4DAADEAAAAAAAAAAYAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAA +AAAYAAAAGQAAAAAAAAAGAAAAGgAAAAEAAAAmAQAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAA +AAAAAAAGAAAAHgAAAAEAAAAnAQAAHwAAAAAAAAAGAAAAIAAAAAEAAAAoAQAAIQAAAAAAAAAYAAAA +IgAAAAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAAAp +AQAAAAAAABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAACsB +AAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAACwBAAAfAAAAAAAA +AAYAAAAgAAAAAQAAAC0BAAAhAAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAA +AAAAACMAAAAmAAAAAAAAACMAAAAnAAAAAQAAAC4BAAAAAAAAHAAAAAUAAAAAAAAABgAAAAcAAAAA +AAAABgAAAAgAAAABAAAANwEAAAkAAAAAAAAABgAAAAoAAAAAAAAABgAAAAsAAAABAAAAOAEAAAwA +AAAAAAAABgAAAA0AAAAAAAAADgAAAA8AAAAAAAAABgAAABAAAAABAAAAOQEAABEAAAAAAAAABgAA +ABIAAAABAAAAOgEAABMAAAABAAAAOwEAABUAAAABAAAAQAEAACsAAAACAAAAAAAAACwAAAABAAAA +QQEAAC0AAAACAAAAAQAAAC4AAAABAAAAQgEAADEAAAAAAAAAMgAAADMAAAAAAAAAMgAAADQAAAAA +AAAABgAAADUAAAABAAAARAEAAHAAAAAAAAAABgAAAHEAAAAAAAAABgAAAHIAAAAAAAAAcwAAAHQA +AAABAAAARwEAAHsAAAABAAAATAEAABYAAAAAAAAABgAAAAAAAAAQAAAAFgAAAAAAAAAGAAAAFwAA +AAAAAAAYAAAAGQAAAAAAAAAGAAAAGgAAAAEAAAA8AQAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAA +HQAAAAAAAAAGAAAAHgAAAAEAAAA9AQAAHwAAAAAAAAAGAAAAIAAAAAEAAAA+AQAAIQAAAAAAAAAY +AAAAIgAAAAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEA +AAA/AQAAAAAAAAoAAAAWAAAAAAAAAAYAAAAXAAAAAAAAAHUAAAAZAAAAAAAAAAYAAAAaAAAAAQAA +AEUBAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAB2AAAAAAAAAHUAAAB3AAAAAAAAACMAAAB4AAAA +AAAAACMAAAB5AAAAAQAAAEYBAAAAAAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAA +AAAABgAAABoAAAABAAAASAEAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4A +AAABAAAASQEAAB8AAAAAAAAABgAAACAAAAABAAAASgEAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAA +ACQAAAAAAAAAIwAAACUAAAAAAAAAIwAAACYAAAAAAAAAIwAAACcAAAABAAAASwEAAAAAAAAcAAAA +BQAAAAAAAAAGAAAABwAAAAAAAAAGAAAACAAAAAEAAABNAQAACQAAAAAAAAAGAAAACgAAAAAAAAAG +AAAACwAAAAEAAABOAQAADAAAAAAAAAAGAAAADQAAAAAAAAAOAAAADwAAAAAAAAAGAAAAEAAAAAEA +AABPAQAAEQAAAAAAAAAGAAAAEgAAAAEAAABQAQAAEwAAAAEAAABRAQAAFQAAAAEAAABWAQAAKwAA +AAIAAAAAAAAALAAAAAEAAABXAQAALQAAAAIAAAABAAAALgAAAAEAAABYAQAAMQAAAAAAAAAyAAAA +MwAAAAAAAAAyAAAANAAAAAAAAAAGAAAANQAAAAEAAABaAQAAcAAAAAAAAAAGAAAAcQAAAAAAAAAG +AAAAcgAAAAAAAABzAAAAdAAAAAEAAABdAQAAewAAAAEAAABiAQAAFgAAAAAAAAAGAAAAAAAAABAA +AAAWAAAAAAAAAAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAFIBAAAbAAAAAAAA +AAYAAAAcAAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAAFMBAAAfAAAAAAAAAAYAAAAgAAAA +AQAAAFQBAAAhAAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAm +AAAAAAAAACMAAAAnAAAAAQAAAFUBAAAAAAAACgAAABYAAAAAAAAABgAAABcAAAAAAAAAdQAAABkA +AAAAAAAABgAAABoAAAABAAAAWwEAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAHYAAAAAAAAAdQAA +AHcAAAAAAAAAIwAAAHgAAAAAAAAAIwAAAHkAAAABAAAAXAEAAAAAAAAQAAAAFgAAAAAAAAAGAAAA +FwAAAAAAAAAYAAAAGQAAAAAAAAAGAAAAGgAAAAEAAABeAQAAGwAAAAAAAAAGAAAAHAAAAAIAAACQ +AAAAHQAAAAAAAAAGAAAAHgAAAAEAAABfAQAAHwAAAAAAAAAGAAAAIAAAAAEAAABgAQAAIQAAAAAA +AAAYAAAAIgAAAAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAA +AAEAAABhAQAAAAAAABwAAAAFAAAAAAAAAAYAAAAHAAAAAAAAAAYAAAAIAAAAAQAAAGMBAAAJAAAA +AAAAAAYAAAAKAAAAAAAAAAYAAAALAAAAAQAAAGQBAAAMAAAAAAAAAAYAAAANAAAAAAAAAA4AAAAP +AAAAAAAAAAYAAAAQAAAAAQAAAGUBAAARAAAAAAAAAAYAAAASAAAAAQAAAGYBAAATAAAAAQAAAGcB +AAAVAAAAAQAAAGwBAAArAAAAAgAAAAAAAAAsAAAAAQAAAG0BAAAtAAAAAgAAAAEAAAAuAAAAAQAA +AG4BAAAxAAAAAAAAADIAAAAzAAAAAAAAADIAAAA0AAAAAAAAAAYAAAA1AAAAAQAAAHABAABwAAAA +AAAAAAYAAABxAAAAAAAAAAYAAAByAAAAAAAAAHMAAAB0AAAAAQAAAHMBAAB7AAAAAQAAAHgBAAAW +AAAAAAAAAAYAAAAAAAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoA +AAABAAAAaAEAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAaQEA +AB8AAAAAAAAABgAAACAAAAABAAAAagEAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAA +IwAAACUAAAAAAAAAIwAAACYAAAAAAAAAIwAAACcAAAABAAAAawEAAAAAAAAKAAAAFgAAAAAAAAAG +AAAAFwAAAAAAAAB1AAAAGQAAAAAAAAAGAAAAGgAAAAEAAABxAQAAGwAAAAAAAAAGAAAAHAAAAAIA +AACQAAAAdgAAAAAAAAB1AAAAdwAAAAAAAAAjAAAAeAAAAAAAAAAjAAAAeQAAAAEAAAByAQAAAAAA +ABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAHQBAAAbAAAA +AAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAAHUBAAAfAAAAAAAAAAYAAAAg +AAAAAQAAAHYBAAAhAAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMA +AAAmAAAAAAAAACMAAAAnAAAAAQAAAHcBAAAAAAAAHAAAAAUAAAAAAAAABgAAAAcAAAAAAAAABgAA +AAgAAAABAAAAeQEAAAkAAAAAAAAABgAAAAoAAAAAAAAABgAAAAsAAAABAAAAegEAAAwAAAAAAAAA +BgAAAA0AAAAAAAAADgAAAA8AAAAAAAAABgAAABAAAAABAAAAewEAABEAAAAAAAAABgAAABIAAAAB +AAAAfAEAABMAAAABAAAAfQEAABUAAAABAAAAggEAACsAAAACAAAAAAAAACwAAAABAAAAgwEAAC0A +AAACAAAAAQAAAC4AAAABAAAAhAEAADEAAAAAAAAAMgAAADMAAAAAAAAAMgAAADQAAAAAAAAABgAA +ADUAAAABAAAAhgEAAHAAAAAAAAAABgAAAHEAAAAAAAAABgAAAHIAAAAAAAAAcwAAAHQAAAABAAAA +iQEAAHsAAAABAAAAjgEAABYAAAAAAAAABgAAAAAAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAY +AAAAGQAAAAAAAAAGAAAAGgAAAAEAAAB+AQAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAA +AAAGAAAAHgAAAAEAAAB/AQAAHwAAAAAAAAAGAAAAIAAAAAEAAACAAQAAIQAAAAAAAAAYAAAAIgAA +AAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAACBAQAA +AAAAAAoAAAAWAAAAAAAAAAYAAAAXAAAAAAAAAHUAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAIcBAAAb +AAAAAAAAAAYAAAAcAAAAAgAAAJAAAAB2AAAAAAAAAHUAAAB3AAAAAAAAACMAAAB4AAAAAAAAACMA +AAB5AAAAAQAAAIgBAAAAAAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAA +ABoAAAABAAAAigEAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAA +iwEAAB8AAAAAAAAABgAAACAAAAABAAAAjAEAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAA +AAAAIwAAACUAAAAAAAAAIwAAACYAAAAAAAAAIwAAACcAAAABAAAAjQEAAAAAAAAcAAAABQAAAAAA +AAAGAAAABwAAAAAAAAAGAAAACAAAAAEAAACPAQAACQAAAAAAAAAGAAAACgAAAAAAAAAGAAAACwAA +AAEAAACQAQAADAAAAAAAAAAGAAAADQAAAAAAAAAOAAAADwAAAAAAAAAGAAAAEAAAAAEAAACRAQAA +EQAAAAAAAAAGAAAAEgAAAAEAAACSAQAAEwAAAAEAAACTAQAAFQAAAAEAAACYAQAAKwAAAAIAAAAA +AAAALAAAAAEAAACZAQAALQAAAAIAAAABAAAALgAAAAEAAACaAQAAMQAAAAAAAAAyAAAAMwAAAAAA +AAAyAAAANAAAAAAAAAAGAAAANQAAAAEAAACcAQAAcAAAAAAAAAAGAAAAcQAAAAAAAAAGAAAAcgAA +AAAAAABzAAAAdAAAAAEAAACfAQAAewAAAAEAAACkAQAAFgAAAAAAAAAGAAAAAAAAABAAAAAWAAAA +AAAAAAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAJQBAAAbAAAAAAAAAAYAAAAc +AAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAAJUBAAAfAAAAAAAAAAYAAAAgAAAAAQAAAJYB +AAAhAAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAA +ACMAAAAnAAAAAQAAAJcBAAAAAAAACgAAABYAAAAAAAAABgAAABcAAAAAAAAAdQAAABkAAAAAAAAA +BgAAABoAAAABAAAAnQEAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAHYAAAAAAAAAdQAAAHcAAAAA +AAAAIwAAAHgAAAAAAAAAIwAAAHkAAAABAAAAngEAAAAAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAA +AAAYAAAAGQAAAAAAAAAGAAAAGgAAAAEAAACgAQAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAA +AAAAAAAGAAAAHgAAAAEAAAChAQAAHwAAAAAAAAAGAAAAIAAAAAEAAACiAQAAIQAAAAAAAAAYAAAA +IgAAAAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAACj +AQAAAAAAABwAAAAFAAAAAAAAAAYAAAAHAAAAAAAAAAYAAAAIAAAAAQAAAKUBAAAJAAAAAAAAAAYA +AAAKAAAAAAAAAAYAAAALAAAAAQAAAKYBAAAMAAAAAAAAAAYAAAANAAAAAAAAAA4AAAAPAAAAAAAA +AAYAAAAQAAAAAQAAAKcBAAARAAAAAAAAAAYAAAASAAAAAQAAAKgBAAATAAAAAQAAAKkBAAAVAAAA +AQAAAK4BAAArAAAAAgAAAAAAAAAsAAAAAQAAAK8BAAAtAAAAAgAAAAEAAAAuAAAAAQAAALABAAAx +AAAAAAAAADIAAAAzAAAAAAAAADIAAAA0AAAAAAAAAAYAAAA1AAAAAQAAALIBAABwAAAAAAAAAAYA +AABxAAAAAAAAAAYAAAByAAAAAAAAAHMAAAB0AAAAAQAAALUBAAB7AAAAAQAAALoBAAAWAAAAAAAA +AAYAAAAAAAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAA +qgEAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAqwEAAB8AAAAA +AAAABgAAACAAAAABAAAArAEAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUA +AAAAAAAAIwAAACYAAAAAAAAAIwAAACcAAAABAAAArQEAAAAAAAAKAAAAFgAAAAAAAAAGAAAAFwAA +AAAAAAB1AAAAGQAAAAAAAAAGAAAAGgAAAAEAAACzAQAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAA +dgAAAAAAAAB1AAAAdwAAAAAAAAAjAAAAeAAAAAAAAAAjAAAAeQAAAAEAAAC0AQAAAAAAABAAAAAW +AAAAAAAAAAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAALYBAAAbAAAAAAAAAAYA +AAAcAAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAALcBAAAfAAAAAAAAAAYAAAAgAAAAAQAA +ALgBAAAhAAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAA +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 +AgAAAAAAAAAsAAAAAQAAAP8BAAAtAAAAAgAAAAEAAAAuAAAAAQAAAAACAAAxAAAAAAAAADIAAAAz +AAAAAAAAADIAAAAAAAAADQAAAI4AAAAAAAAABgAAAI8AAAABAAAAAgIAALMAAAAAAAAABgAAALQA +AAAAAAAAIwAAAK0AAAAAAAAABgAAAK4AAAABAAAAAwIAAKwAAAABAAAABAIAACsAAAACAAAAAAAA +ACwAAAABAAAABQIAAC0AAAACAAAAAQAAAC4AAAABAAAABgIAADEAAAAAAAAAMgAAADMAAAAAAAAA +MgAAAA0AAAC1AAAAAAAAAAYAAAC2AAAAAQAAAAoCAACOAAAAAAAAAAYAAACPAAAAAQAAAAwCAACt +AAAAAAAAAAYAAACuAAAAAQAAAA0CAACsAAAAAQAAAA4CAAArAAAAAgAAAAAAAAAsAAAAAQAAAA8C +AAAtAAAAAgAAAAEAAAAuAAAAAQAAABACAAAxAAAAAAAAADIAAAAzAAAAAAAAADIAAAAJAAAArQAA +AAAAAAAGAAAArgAAAAEAAAAUAgAArAAAAAEAAAA+AgAAKwAAAAIAAAAAAAAALAAAAAEAAAA/AgAA +LQAAAAIAAAABAAAALgAAAAEAAABAAgAAMQAAAAAAAAAyAAAAMwAAAAAAAAAyAAAACQAAAK0AAAAA +AAAABgAAAK4AAAABAAAAFQIAAKwAAAABAAAAIgIAACsAAAACAAAAAAAAACwAAAABAAAAIwIAAC0A +AAACAAAAAQAAAC4AAAABAAAAJAIAADEAAAAAAAAAMgAAADMAAAAAAAAAMgAAAAwAAACOAAAAAAAA +AAYAAACPAAAAAQAAABcCAACzAAAAAAAAAAYAAACtAAAAAAAAAAYAAACuAAAAAQAAABgCAACsAAAA +AQAAABkCAAArAAAAAgAAAAAAAAAsAAAAAQAAABoCAAAtAAAAAgAAAAEAAAAuAAAAAQAAABsCAAAx +AAAAAAAAADIAAAAzAAAAAAAAADIAAAAAAAAADQAAAI4AAAAAAAAABgAAAI8AAAABAAAAHQIAALMA +AAAAAAAABgAAALQAAAAAAAAAIwAAAK0AAAAAAAAABgAAAK4AAAABAAAAHgIAAKwAAAABAAAAHwIA +ACsAAAACAAAAAAAAACwAAAABAAAAIAIAAC0AAAACAAAAAQAAAC4AAAABAAAAIQIAADEAAAAAAAAA +MgAAADMAAAAAAAAAMgAAAA0AAAC1AAAAAAAAAAYAAAC2AAAAAQAAACUCAACOAAAAAAAAAAYAAACP +AAAAAQAAACcCAACtAAAAAAAAAAYAAACuAAAAAQAAACgCAACsAAAAAQAAACkCAAArAAAAAgAAAAAA +AAAsAAAAAQAAACoCAAAtAAAAAgAAAAEAAAAuAAAAAQAAACsCAAAxAAAAAAAAADIAAAAzAAAAAAAA +ADIAAAANAAAAsQAAAAAAAAAGAAAAsgAAAAAAAAAjAAAAswAAAAAAAAAGAAAAtAAAAAAAAAAjAAAA +rQAAAAAAAAAGAAAArgAAAAEAAAAsAgAArAAAAAEAAAAtAgAAKwAAAAIAAAAAAAAALAAAAAEAAAAu +AgAALQAAAAIAAAABAAAALgAAAAEAAAAvAgAAMQAAAAAAAAAyAAAAMwAAAAAAAAAyAAAADwAAAJwA +AAAAAAAABgAAALcAAAAAAAAAMgAAALUAAAAAAAAABgAAALYAAAABAAAAMAIAAI4AAAAAAAAABgAA +AI8AAAABAAAAMgIAAK0AAAAAAAAABgAAAK4AAAABAAAAMwIAAKwAAAABAAAANAIAACsAAAACAAAA +AAAAACwAAAABAAAANQIAAC0AAAACAAAAAQAAAC4AAAABAAAANgIAADEAAAAAAAAAMgAAADMAAAAA +AAAAMgAAAA8AAACcAAAAAAAAAAYAAAC3AAAAAAAAADIAAAC1AAAAAAAAAAYAAAC2AAAAAQAAADcC +AACOAAAAAAAAAAYAAACPAAAAAQAAADkCAACtAAAAAAAAAAYAAACuAAAAAQAAADoCAACsAAAAAQAA +ADsCAAArAAAAAgAAAAAAAAAsAAAAAQAAADwCAAAtAAAAAgAAAAEAAAAuAAAAAQAAAD0CAAAxAAAA +AAAAADIAAAAzAAAAAAAAADIAAAAJAAAArQAAAAAAAAAGAAAArgAAAAEAAABBAgAArAAAAAEAAABj +AgAAKwAAAAIAAAAAAAAALAAAAAEAAABkAgAALQAAAAIAAAABAAAALgAAAAEAAABlAgAAMQAAAAAA +AAAyAAAAMwAAAAAAAAAyAAAADwAAALEAAAAAAAAABgAAALIAAAAAAAAAIwAAALUAAAAAAAAABgAA +ALYAAAABAAAAQgIAAI4AAAAAAAAABgAAAI8AAAABAAAARAIAAK0AAAAAAAAABgAAAK4AAAABAAAA +RQIAAKwAAAABAAAARgIAACsAAAACAAAAAAAAACwAAAABAAAARwIAAC0AAAACAAAAAQAAAC4AAAAB +AAAASAIAADEAAAAAAAAAMgAAADMAAAAAAAAAMgAAAAsAAACOAAAAAAAAAAYAAACPAAAAAQAAAEoC +AACtAAAAAAAAAAYAAACuAAAAAQAAAEsCAACsAAAAAQAAAEwCAAArAAAAAgAAAAAAAAAsAAAAAQAA +AE0CAAAtAAAAAgAAAAEAAAAuAAAAAQAAAE4CAAAxAAAAAAAAADIAAAAzAAAAAAAAADIAAAAPAAAA +sQAAAAAAAAAGAAAAsgAAAAAAAAAjAAAAtQAAAAAAAAAGAAAAtgAAAAEAAABPAgAAjgAAAAAAAAAG +AAAAjwAAAAEAAABRAgAArQAAAAAAAAAGAAAArgAAAAEAAABSAgAArAAAAAEAAABTAgAAKwAAAAIA +AAAAAAAALAAAAAEAAABUAgAALQAAAAIAAAABAAAALgAAAAEAAABVAgAAMQAAAAAAAAAyAAAAMwAA +AAAAAAAyAAAACwAAAI4AAAAAAAAABgAAAI8AAAABAAAAVwIAAK0AAAAAAAAABgAAAK4AAAABAAAA +WAIAAKwAAAABAAAAWQIAACsAAAACAAAAAAAAACwAAAABAAAAWgIAAC0AAAACAAAAAQAAAC4AAAAB +AAAAWwIAADEAAAAAAAAAMgAAADMAAAAAAAAAMgAAAA0AAAC1AAAAAAAAAAYAAAC2AAAAAQAAAFwC +AACOAAAAAAAAAAYAAACPAAAAAQAAAF4CAACtAAAAAAAAAAYAAACuAAAAAQAAAF8CAACsAAAAAQAA +AGACAAArAAAAAgAAAAAAAAAsAAAAAQAAAGECAAAtAAAAAgAAAAEAAAAuAAAAAQAAAGICAAAxAAAA +AAAAADIAAAAzAAAAAAAAADIAAAAbAAAABQAAAAAAAAAGAAAABwAAAAAAAAAGAAAACAAAAAEAAABm +AgAACgAAAAAAAAAGAAAACwAAAAEAAABnAgAADAAAAAAAAAAGAAAADQAAAAAAAAAOAAAADwAAAAAA +AAAGAAAAEAAAAAEAAABoAgAAEQAAAAAAAAAGAAAAEgAAAAEAAABpAgAAEwAAAAEAAABqAgAAFQAA +AAEAAABvAgAAKwAAAAIAAAAAAAAALAAAAAEAAABwAgAALQAAAAIAAAABAAAALgAAAAEAAABxAgAA +MQAAAAAAAAAyAAAAMwAAAAAAAAAyAAAANAAAAAAAAAAGAAAANQAAAAEAAABzAgAAcAAAAAAAAAAG +AAAAcQAAAAAAAAAGAAAAcgAAAAAAAABzAAAAdAAAAAEAAAB2AgAAewAAAAEAAAB7AgAAFgAAAAAA +AAAGAAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAAawIA +ABsAAAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAbAIAAB8AAAAAAAAA +BgAAACAAAAABAAAAbQIAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAA +AAAAIwAAACYAAAAAAAAAIwAAACcAAAABAAAAbgIAAAAAAAAKAAAAFgAAAAAAAAAGAAAAFwAAAAAA +AAB1AAAAGQAAAAAAAAAGAAAAGgAAAAEAAAB0AgAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAdgAA +AAAAAAB1AAAAdwAAAAAAAAAjAAAAeAAAAAAAAAAjAAAAeQAAAAEAAAB1AgAAAAAAABAAAAAWAAAA +AAAAAAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAHcCAAAbAAAAAAAAAAYAAAAc +AAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAAHgCAAAfAAAAAAAAAAYAAAAgAAAAAQAAAHkC +AAAhAAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAA +ACMAAAAnAAAAAQAAAHoCAAAAAAAAEwAAAAUAAAAAAAAABgAAAIwAAAAAAAAAuAAAAAoAAAAAAAAA +BgAAAAsAAAABAAAAfAIAAAwAAAAAAAAABgAAAA0AAAAAAAAAuQAAAA8AAAAAAAAABgAAABAAAAAB +AAAAfQIAABEAAAAAAAAABgAAABMAAAABAAAAfgIAABUAAAABAAAAgwIAACsAAAACAAAAAAAAACwA +AAABAAAAhAIAAC0AAAACAAAAAQAAAC4AAAABAAAAhQIAADEAAAAAAAAAMgAAADMAAAAAAAAAMgAA +AHQAAAABAAAAiAIAAHsAAAABAAAAjQIAABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAAABgAAAAZAAAA +AAAAAAYAAAAaAAAAAQAAAH8CAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAe +AAAAAQAAAIACAAAfAAAAAAAAAAYAAAAgAAAAAQAAAIECAAAhAAAAAAAAABgAAAAiAAAAAAAAACMA +AAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMAAAAnAAAAAQAAAIICAAAAAAAACgAA +ABYAAAAAAAAABgAAABcAAAAAAAAAdQAAABkAAAAAAAAABgAAABoAAAABAAAAhgIAABsAAAAAAAAA +BgAAABwAAAACAAAAkAAAAHYAAAAAAAAAdQAAAHcAAAAAAAAAIwAAAHgAAAAAAAAAIwAAAHkAAAAB +AAAAhwIAAAAAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAYAAAAGQAAAAAAAAAGAAAAGgAAAAEA +AACJAgAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAAAAAGAAAAHgAAAAEAAACKAgAAHwAA +AAAAAAAGAAAAIAAAAAEAAACLAgAAIQAAAAAAAAAYAAAAIgAAAAAAAAAjAAAAJAAAAAAAAAAjAAAA +JQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAACMAgAAAAAAABsAAAAFAAAAAAAAAAYAAAAH +AAAAAAAAAAYAAAAIAAAAAQAAAI4CAAAKAAAAAAAAAAYAAAALAAAAAQAAAI8CAAAMAAAAAAAAAAYA +AAANAAAAAAAAAA4AAAAPAAAAAAAAAAYAAAAQAAAAAQAAAJACAAARAAAAAAAAAAYAAAASAAAAAQAA +AJECAAATAAAAAQAAAJICAAAVAAAAAQAAAJcCAAArAAAAAgAAAAAAAAAsAAAAAQAAAJgCAAAtAAAA +AgAAAAEAAAAuAAAAAQAAAJkCAAAxAAAAAAAAADIAAAAzAAAAAAAAADIAAAA0AAAAAAAAAAYAAAA1 +AAAAAQAAAJsCAABwAAAAAAAAAAYAAABxAAAAAAAAAAYAAAByAAAAAAAAAHMAAAB0AAAAAQAAAJ4C +AAB7AAAAAQAAAKMCAAAWAAAAAAAAAAYAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAYAAAAGQAA +AAAAAAAGAAAAGgAAAAEAAACTAgAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAAAAAGAAAA +HgAAAAEAAACUAgAAHwAAAAAAAAAGAAAAIAAAAAEAAACVAgAAIQAAAAAAAAAYAAAAIgAAAAAAAAAj +AAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAACWAgAAAAAAAAoA +AAAWAAAAAAAAAAYAAAAXAAAAAAAAAHUAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAJwCAAAbAAAAAAAA +AAYAAAAcAAAAAgAAAJAAAAB2AAAAAAAAAHUAAAB3AAAAAAAAACMAAAB4AAAAAAAAACMAAAB5AAAA +AQAAAJ0CAAAAAAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAAB +AAAAnwIAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAoAIAAB8A +AAAAAAAABgAAACAAAAABAAAAoQIAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAA +ACUAAAAAAAAAIwAAACYAAAAAAAAAIwAAACcAAAABAAAAogIAAAAAAAATAAAABQAAAAAAAAAGAAAA +jAAAAAAAAAC4AAAACgAAAAAAAAAGAAAACwAAAAEAAACkAgAADAAAAAAAAAAGAAAADQAAAAAAAAC5 +AAAADwAAAAAAAAAGAAAAEAAAAAEAAAClAgAAEQAAAAAAAAAGAAAAEwAAAAEAAACmAgAAFQAAAAEA +AACrAgAAKwAAAAIAAAAAAAAALAAAAAEAAACsAgAALQAAAAIAAAABAAAALgAAAAEAAACtAgAAMQAA +AAAAAAAyAAAAMwAAAAAAAAAyAAAAdAAAAAEAAACwAgAAewAAAAEAAAC1AgAAEAAAABYAAAAAAAAA +BgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAApwIAABsAAAAAAAAABgAAABwAAAAC +AAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAqAIAAB8AAAAAAAAABgAAACAAAAABAAAAqQIAACEA +AAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAAAAAAIwAAACYAAAAAAAAAIwAA +ACcAAAABAAAAqgIAAAAAAAAKAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAB1AAAAGQAAAAAAAAAGAAAA +GgAAAAEAAACuAgAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAdgAAAAAAAAB1AAAAdwAAAAAAAAAj +AAAAeAAAAAAAAAAjAAAAeQAAAAEAAACvAgAAAAAAABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAAABgA +AAAZAAAAAAAAAAYAAAAaAAAAAQAAALECAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAAAAAA +AAYAAAAeAAAAAQAAALICAAAfAAAAAAAAAAYAAAAgAAAAAQAAALMCAAAhAAAAAAAAABgAAAAiAAAA +AAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMAAAAnAAAAAQAAALQCAAAA +AAAAFAAAAAUAAAAAAAAABgAAAIwAAAAAAAAAjQAAAAoAAAAAAAAABgAAAAsAAAABAAAAtgIAAAwA +AAAAAAAABgAAAA8AAAAAAAAABgAAABAAAAABAAAAtwIAAI4AAAAAAAAABgAAAI8AAAABAAAAuQIA +ABMAAAABAAAAugIAABUAAAABAAAAvwIAACsAAAACAAAAAAAAACwAAAABAAAAwAIAAC0AAAACAAAA +AQAAAC4AAAABAAAAwQIAADEAAAAAAAAAMgAAADMAAAAAAAAAMgAAAHQAAAABAAAAxAIAAHsAAAAB +AAAAyQIAABYAAAAAAAAABgAAAAAAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAYAAAAGQAAAAAA +AAAGAAAAGgAAAAEAAAC7AgAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAAAAAGAAAAHgAA +AAEAAAC8AgAAHwAAAAAAAAAGAAAAIAAAAAEAAAC9AgAAIQAAAAAAAAAYAAAAIgAAAAAAAAAjAAAA +JAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAAC+AgAAAAAAAAoAAAAW +AAAAAAAAAAYAAAAXAAAAAAAAAHUAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAMICAAAbAAAAAAAAAAYA +AAAcAAAAAgAAAJAAAAB2AAAAAAAAAHUAAAB3AAAAAAAAACMAAAB4AAAAAAAAACMAAAB5AAAAAQAA +AMMCAAAAAAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAA +xQIAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAxgIAAB8AAAAA +AAAABgAAACAAAAABAAAAxwIAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUA +AAAAAAAAIwAAACYAAAAAAAAAIwAAACcAAAABAAAAyAIAAAAAAAAUAAAABQAAAAAAAAAGAAAAjAAA +AAAAAACNAAAACgAAAAAAAAAGAAAACwAAAAEAAADKAgAADAAAAAAAAAAGAAAADwAAAAAAAAAGAAAA +EAAAAAEAAADLAgAAjgAAAAAAAAAGAAAAjwAAAAEAAADNAgAAEwAAAAEAAADOAgAAFQAAAAEAAADT +AgAAKwAAAAIAAAAAAAAALAAAAAEAAADUAgAALQAAAAIAAAABAAAALgAAAAEAAADVAgAAMQAAAAAA +AAAyAAAAMwAAAAAAAAAyAAAAdAAAAAEAAADYAgAAewAAAAEAAADdAgAAFgAAAAAAAAAGAAAAAAAA +ABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAM8CAAAbAAAA +AAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAANACAAAfAAAAAAAAAAYAAAAg +AAAAAQAAANECAAAhAAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMA +AAAmAAAAAAAAACMAAAAnAAAAAQAAANICAAAAAAAACgAAABYAAAAAAAAABgAAABcAAAAAAAAAdQAA +ABkAAAAAAAAABgAAABoAAAABAAAA1gIAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAHYAAAAAAAAA +dQAAAHcAAAAAAAAAIwAAAHgAAAAAAAAAIwAAAHkAAAABAAAA1wIAAAAAAAAQAAAAFgAAAAAAAAAG +AAAAFwAAAAAAAAAYAAAAGQAAAAAAAAAGAAAAGgAAAAEAAADZAgAAGwAAAAAAAAAGAAAAHAAAAAIA +AACQAAAAHQAAAAAAAAAGAAAAHgAAAAEAAADaAgAAHwAAAAAAAAAGAAAAIAAAAAEAAADbAgAAIQAA +AAAAAAAYAAAAIgAAAAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAA +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 +FgAAAAAAAAAGAAAAAAAAABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAAABgAAAAZAAAAAAAAAAYAAAAa +AAAAAQAAAAwDAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAeAAAAAQAAAA0D +AAAfAAAAAAAAAAYAAAAgAAAAAQAAAA4DAAAhAAAAAAAAABgAAAAiAAAAAAAAACMAAAAkAAAAAAAA +ACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMAAAAnAAAAAQAAAA8DAAAAAAAACgAAABYAAAAAAAAA +BgAAABcAAAAAAAAAdQAAABkAAAAAAAAABgAAABoAAAABAAAAEwMAABsAAAAAAAAABgAAABwAAAAC +AAAAkAAAAHYAAAAAAAAAdQAAAHcAAAAAAAAAIwAAAHgAAAAAAAAAIwAAAHkAAAABAAAAFAMAAAAA +AAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAYAAAAGQAAAAAAAAAGAAAAGgAAAAEAAAAWAwAAGwAA +AAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAAAAAGAAAAHgAAAAEAAAAXAwAAHwAAAAAAAAAGAAAA +IAAAAAEAAAAYAwAAIQAAAAAAAAAYAAAAIgAAAAAAAAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAj +AAAAJgAAAAAAAAAjAAAAJwAAAAEAAAAZAwAAAAAAABQAAAAFAAAAAAAAAAYAAACMAAAAAAAAAI0A +AAAKAAAAAAAAAAYAAAALAAAAAQAAABsDAAAMAAAAAAAAAAYAAAAPAAAAAAAAAAYAAAAQAAAAAQAA +ABwDAACOAAAAAAAAAAYAAACPAAAAAQAAAB4DAAATAAAAAQAAAB8DAAAVAAAAAQAAACQDAAArAAAA +AgAAAAAAAAAsAAAAAQAAACUDAAAtAAAAAgAAAAEAAAAuAAAAAQAAACYDAAAxAAAAAAAAADIAAAAz +AAAAAAAAADIAAAB0AAAAAQAAACkDAAB7AAAAAQAAAC4DAAAWAAAAAAAAAAYAAAAAAAAAEAAAABYA +AAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAAIAMAABsAAAAAAAAABgAA +ABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAIQMAAB8AAAAAAAAABgAAACAAAAABAAAA +IgMAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAAAAAAIwAAACYAAAAA +AAAAIwAAACcAAAABAAAAIwMAAAAAAAAKAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAB1AAAAGQAAAAAA +AAAGAAAAGgAAAAEAAAAnAwAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAdgAAAAAAAAB1AAAAdwAA +AAAAAAAjAAAAeAAAAAAAAAAjAAAAeQAAAAEAAAAoAwAAAAAAABAAAAAWAAAAAAAAAAYAAAAXAAAA +AAAAABgAAAAZAAAAAAAAAAYAAAAaAAAAAQAAACoDAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAd +AAAAAAAAAAYAAAAeAAAAAQAAACsDAAAfAAAAAAAAAAYAAAAgAAAAAQAAACwDAAAhAAAAAAAAABgA +AAAiAAAAAAAAACMAAAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMAAAAnAAAAAQAA +AC0DAAAAAAAAFAAAAAUAAAAAAAAABgAAAIwAAAAAAAAAjQAAAAoAAAAAAAAABgAAAAsAAAABAAAA +LwMAAAwAAAAAAAAABgAAAA8AAAAAAAAABgAAABAAAAABAAAAMAMAAI4AAAAAAAAABgAAAI8AAAAB +AAAAMgMAABMAAAABAAAAMwMAABUAAAABAAAAOAMAACsAAAACAAAAAAAAACwAAAABAAAAOQMAAC0A +AAACAAAAAQAAAC4AAAABAAAAOgMAADEAAAAAAAAAMgAAADMAAAAAAAAAMgAAAHQAAAABAAAAPQMA +AHsAAAABAAAAQgMAABYAAAAAAAAABgAAAAAAAAAQAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAAYAAAA +GQAAAAAAAAAGAAAAGgAAAAEAAAA0AwAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAHQAAAAAAAAAG +AAAAHgAAAAEAAAA1AwAAHwAAAAAAAAAGAAAAIAAAAAEAAAA2AwAAIQAAAAAAAAAYAAAAIgAAAAAA +AAAjAAAAJAAAAAAAAAAjAAAAJQAAAAAAAAAjAAAAJgAAAAAAAAAjAAAAJwAAAAEAAAA3AwAAAAAA +AAoAAAAWAAAAAAAAAAYAAAAXAAAAAAAAAHUAAAAZAAAAAAAAAAYAAAAaAAAAAQAAADsDAAAbAAAA +AAAAAAYAAAAcAAAAAgAAAJAAAAB2AAAAAAAAAHUAAAB3AAAAAAAAACMAAAB4AAAAAAAAACMAAAB5 +AAAAAQAAADwDAAAAAAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoA +AAABAAAAPgMAABsAAAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAPwMA +AB8AAAAAAAAABgAAACAAAAABAAAAQAMAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAA +IwAAACUAAAAAAAAAIwAAACYAAAAAAAAAIwAAACcAAAABAAAAQQMAAAAAAAAXAAAABQAAAAAAAAAG +AAAAjAAAAAAAAACNAAAACgAAAAAAAAAGAAAACwAAAAEAAABDAwAADAAAAAAAAAAGAAAADQAAAAAA +AAC6AAAAuwAAAAAAAAAGAAAAvAAAAAEAAABEAwAADwAAAAAAAAAGAAAAEAAAAAEAAABFAwAAjgAA +AAAAAAAGAAAAjwAAAAEAAABHAwAAEwAAAAEAAABIAwAAFQAAAAEAAABNAwAAKwAAAAIAAAAAAAAA +LAAAAAEAAABOAwAALQAAAAIAAAABAAAALgAAAAEAAABPAwAAMQAAAAAAAAAyAAAAMwAAAAAAAAAy +AAAAdAAAAAEAAABSAwAAewAAAAEAAABXAwAAFgAAAAAAAAAGAAAAEAAAABYAAAAAAAAABgAAABcA +AAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAASQMAABsAAAAAAAAABgAAABwAAAACAAAAkAAA +AB0AAAAAAAAABgAAAB4AAAABAAAASgMAAB8AAAAAAAAABgAAACAAAAABAAAASwMAACEAAAAAAAAA +GAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAAAAAAIwAAACYAAAAAAAAAIwAAACcAAAAB +AAAATAMAAAAAAAAKAAAAFgAAAAAAAAAGAAAAFwAAAAAAAAB1AAAAGQAAAAAAAAAGAAAAGgAAAAEA +AABQAwAAGwAAAAAAAAAGAAAAHAAAAAIAAACQAAAAdgAAAAAAAAB1AAAAdwAAAAAAAAAjAAAAeAAA +AAAAAAAjAAAAeQAAAAEAAABRAwAAAAAAABAAAAAWAAAAAAAAAAYAAAAXAAAAAAAAABgAAAAZAAAA +AAAAAAYAAAAaAAAAAQAAAFMDAAAbAAAAAAAAAAYAAAAcAAAAAgAAAJAAAAAdAAAAAAAAAAYAAAAe +AAAAAQAAAFQDAAAfAAAAAAAAAAYAAAAgAAAAAQAAAFUDAAAhAAAAAAAAABgAAAAiAAAAAAAAACMA +AAAkAAAAAAAAACMAAAAlAAAAAAAAACMAAAAmAAAAAAAAACMAAAAnAAAAAQAAAFYDAAAAAAAABgAA +ABcAAAAAAAAAwAAAABsAAAAAAAAABgAAABwAAAACAAAAAQAAAHYAAAAAAAAAwAAAAHgAAAAAAAAA +IwAAAHkAAAABAAAAWwMAAAAAAAAGAAAAFwAAAAAAAADAAAAAGwAAAAAAAAAGAAAAHAAAAAIAAAAB +AAAAdgAAAAAAAADAAAAAeAAAAAAAAAAjAAAAeQAAAAEAAABdAwAAAAAAAAMAAADHAAAAAQAAAG4D +AADIAAAAAQAAAG8DAADJAAAAAQAAAHADAAABAAAA2wAAAAEAAAB1AwAAAQAAANsAAAABAAAAdwMA +AAEAAADbAAAAAQAAAHsDAAACAAAA5wAAAAEAAACDAwAA6AAAAAEAAACEAwAAAAAAAAoAAAAWAAAA +AAAAAAYAAAAXAAAAAAAAAHUAAAAZAAAAAAAAAAYAAAAaAAAAAQAAAIsDAAAbAAAAAAAAAAYAAAAc +AAAAAgAAAJAAAAB2AAAAAAAAAHUAAAB3AAAAAAAAACMAAAB4AAAAAAAAACMAAAB5AAAAAQAAAIwD +AAAAAAAAEAAAABYAAAAAAAAABgAAABcAAAAAAAAAGAAAABkAAAAAAAAABgAAABoAAAABAAAAjgMA +ABsAAAAAAAAABgAAABwAAAACAAAAkAAAAB0AAAAAAAAABgAAAB4AAAABAAAAjwMAAB8AAAAAAAAA +BgAAACAAAAABAAAAkAMAACEAAAAAAAAAGAAAACIAAAAAAAAAIwAAACQAAAAAAAAAIwAAACUAAAAA +AAAAIwAAACYAAAAAAAAAIwAAACcAAAABAAAAkQMAAAAAAAAFAAAAAwAAAAEAAACdAwAA7AAAAAEA +AACeAwAA7QAAAAEAAACfAwAA7gAAAAEAAACgAwAAkwAAAAEAAAChAwAABQAAAAMAAAABAAAAogMA +AOwAAAABAAAAowMAAO0AAAABAAAApAMAAO4AAAABAAAApQMAAJMAAAABAAAApgMAAAUAAAADAAAA +AQAAAKcDAADsAAAAAQAAAKgDAADtAAAAAQAAAKkDAADuAAAAAQAAAKoDAACTAAAAAQAAAKsDAAAF +AAAAAwAAAAEAAACsAwAA7AAAAAEAAACtAwAA7QAAAAEAAACuAwAA7gAAAAEAAACvAwAAkwAAAAEA +AACwAwAABQAAAAMAAAABAAAAsQMAAOwAAAABAAAAsgMAAO0AAAABAAAAswMAAO4AAAABAAAAtAMA +AJMAAAABAAAAtQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAABADgAAADAAAAAGAAAACAAAAAQAAAAA +AAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAAEAAEAHg8PTEOAAAAUAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAQHBAAAAAAACgeUAAAAAAAABp +QAAAAAAAAE5ADgAAAEgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAA +CQAAABgAAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAAAAAF +AAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAABAAAAAAAAAA4A +AABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAA +AAAA8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAABAcEAAAAAAAKB5 +QAAAAAAAAGlAAAAAAAAATkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +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 +AQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUAAAAA +AAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxlX3Bh +dGgAAAAADgAAAGgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAMgAAAAEAAAAAAAAAEAAA +ADIAAABzZiUwQChzcmMsZXZlbnQpdGV4dGJveF9jYWxsYmFjayhvYmplY3Qsc3JjLGV2ZW50KQAA +AAAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAAAAAJ +AAAAYW5vbnltb3VzAAAAAAAAAA4AAADIAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAJUA +AAABAAAAAAAAABAAAACVAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkvQXBwbGlj +YXRpb24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMvVGFidWxh +ciBFeHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvY3JlYXRlX3N0ZF90ZXh0Lm0AAAAO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAAANAAAABAAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAAAA +AAAAAAABAAAAAAAAABAAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAA +BAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOQA4AAABQ +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAOAAAABgAAAA4AAABQAAAA +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8A +AAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAJEAAAAAAAKB0QAAAAAAA +AGlAAAAAAAAATkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAA +AAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAPAAAAAgAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAsAAAAHAAAA +DgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAAEAADAHk8MAAO +AAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAA +AAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAA +ABgAAAAAAADdAgAAAAEAAAABAAAACQAAAAgAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAAwAAAABgAAAAgA +AAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQArAAAADgAAAFAAAAAGAAAACAAA +AAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAEBqQAAAAAAAoHRA +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 +BgAAABgAAAAAAADdAgAAAAEAAAABAAAAEgAAAAIAAAAOAAAAOAAAAAYAAAAIAAAAAgAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0A +AAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAwAA +AAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAA +GAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +TkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAA +BQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAEwAAAAYAAAAO +AAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAA +AAAAAPC/AAAAAADQckAAAAAAAACJQAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAI +AAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAQGpAAAAAAACg +dEAAAAAAAAA+QAAAAAAAAE5ADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAA +AAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAFAAAAAIAAAAOAAAASAAAAAYAAAAIAAAA +DQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAQ +AAAABwAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkA +AAAIAAAAAAAAAAAA8D8OAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAA +AAAAAAAJAAAAGAAAAHL8JUR9ye4/tHFEdcii7j++yj5TdvfsPw4AAAA4AAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAAMAAAAAYAAAAI +AAAABAAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAQAAQAeT09MA4AAABQAAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAJEAAAAAAAOBw +QAAAAAAAAGlAAAAAAAAATkAOAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAA +AQAAAAAAAAAJAAAAGAAAAHL8JUR9ye4/tHFEdcii7j++yj5TdvfsPw4AAABIAAAABgAAAAgAAAAN +AAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAEA +AAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAA +ACAAAAAAAAAAAADwvwAAAAAA0HJAAAAAAAAAiUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAI +AAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAA +AAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAk +QAAAAAAA4HBAAAAAAAAAaUAAAAAAAABOQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAA +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 +AQAAAAEAAAAZAAAABgAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAAB +AAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAA +ADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAA +AAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAg +AAAAAAAAAAAAJEAAAAAAAOBwQAAAAAAAAGlAAAAAAAAATkAOAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAaAAAAAgAA +AA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAA +AAAA3QIAAAABAAAAAQAAABYAAAAHAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAB +AAAABAAAAAEAAAAAAAAAEAAEAHk9PTAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAABADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACQAAAAgAAAAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +APA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgA +AAAAAAAAAADwPw4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +ABAAAQArAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAA +CQAAACAAAAAAAAAAAEBqQAAAAAAA4HBAAAAAAAAAPkAAAAAAAABOQA4AAAAQAQAABgAAAAgAAAAB +AAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUA +AAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAAAAAAEAAAADgAA +AJAAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAcAAAABAAAA +BwAAAG9iamVjdAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAA +AAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAFQAAAAkAAAAOAAAAQAQAAAYAAAAIAAAAAQAAAAAA +AAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAGAAQAAAAA3Q4AAADYAwAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAAAUABAAQAAAAAQAAAEAAAABtYXRsYWJyb290AAAAAAAAc2VwYXJhdG9y +AAAAAAAAAHNlbnRpbmVsAAAAAAAAAABmdW5jdGlvbl9oYW5kbGUADgAAAFAAAAAGAAAACAAAAAQA +AAAAAAAABQAAAAgAAAABAAAAHwAAAAEAAAAAAAAAEAAAAB8AAAAvQXBwbGljYXRpb25zL01BVExB +Ql9SMjAyMWIuYXBwAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAABAAAQAvAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAAEAABAEAAAAAOAAAAkAIAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAA +AAAFAAQAEQAAAAEAAABVAAAAZnVuY3Rpb24AAAAAAAAAAAB0eXBlAAAAAAAAAAAAAAAAAGZpbGUA +AAAAAAAAAAAAAAAAd29ya3NwYWNlAAAAAAAAAAB3aXRoaW5fZmlsZV9wYXRoAAAAAA4AAABgAAAA +BgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAACkAAAABAAAAAAAAABAAAAApAAAAc2YlMEAoc3Jj +LGV2ZW50KXBiX2NhbGwob2JqZWN0LHNyYyxldmVudCkAAAAAAAAADgAAAEAAAAAGAAAACAAAAAQA +AAAAAAAABQAAAAgAAAABAAAACQAAAAEAAAAAAAAAEAAAAAkAAABhbm9ueW1vdXMAAAAAAAAADgAA +AMAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAjQAAAAEAAAAAAAAAEAAAAI0AAAAvVXNl +cnMvcGVzYXJhYW1hcmFzZWtlcmEvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0L01hdGhXb3Jr +cy9NQVRMQUIgQWRkLU9ucy9Db2xsZWN0aW9ucy9UYWJ1bGFyIEV4cHJlc3Npb24gVG9vbGJveC9U +YWJsZVRvb2wvQENlbGwvc2V0X3BiLm0AAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAcAAAABAAAAA4AAAAwAAAA +BgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAABAAAAAAAAAADgAAAEgAAAAG +AAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAA +AAAAAAAAAQAAAAAAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAA +AAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAAAACJQAAAAAAAwIJADgAAADgAAAAGAAAA +CAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4 +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA +LkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAA +AAAAAAAAQGpAAAAAAADgcEAAAAAAAAA+QAAAAAAAAE5ADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAA +BQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAHQAAAAIAAAAO +AAAAOAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAAQAAAAEA +AAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAABgAA +ABQAAAAAAADdAgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAA +CAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABQ +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRA +DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAA +AADdAgAAAAEAAAABAAAAHgAAAAYAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAAAACJQAAAAAAAwIJADgAA +ADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAA +AAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAI +AAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAA +AAAJAAAAIAAAAAAAAAAAQGpAAAAAAADgcEAAAAAAAAA+QAAAAAAAAE5ADgAAAEgAAAAGAAAACAAA +AA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAA +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 +AQAAAAAAAAAQAAEAQAAAAA4AAACgAgAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUAAAAAAAAAAAAAAAAA +ZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxlX3BhdGgAAAAADgAA +AGgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAMgAAAAEAAAAAAAAAEAAAADIAAABzZiUw +QChzcmMsZXZlbnQpdGV4dGJveF9jYWxsYmFjayhvYmplY3Qsc3JjLGV2ZW50KQAAAAAAAA4AAABA +AAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAAAAAJAAAAYW5vbnlt +b3VzAAAAAAAAAA4AAADIAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAJUAAAABAAAAAAAA +ABAAAACVAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkvQXBwbGljYXRpb24gU3Vw +cG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMvVGFidWxhciBFeHByZXNz +aW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvY3JlYXRlX3N0ZF90ZXh0Lm0AAAAOAAAASAAAAAYA +AAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAA +AAEAAAAjAAAABAAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAA +AAAAABAAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAA +AAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOQA4AAABQAAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAJkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +AQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAkAAAABgAAAA4AAABQAAAABgAAAAgAAAAG +AAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAAANByQAAA +AAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAA +AAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAJEAAAAAAAEBqQAAAAAAAAGlAAAAAAAAA +TkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAA +AAAAAN0CAAAAAQAAAAEAAAAlAAAAAgAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAA +BgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAACEAAAAHAAAADgAAADAAAAAG +AAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAAEAADAHk+MAAOAAAAOAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAhADgAA +AEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADd +AgAAAAEAAAABAAAACQAAAAgAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAAwAAAABgAAAAgAAAAEAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQArAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAEBqQAAAAAAAQGpAAAAAAAAAPkAA +AAAAAABOQA4AAAAQAQAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4A +AABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA +3QIAAAABAAAAAQAAAAAAAAAEAAAADgAAAJAAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAABQAEAAcAAAABAAAABwAAAG9iamVjdAAADgAAAEgAAAAGAAAACAAAAA0AAAAA +AAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAIAAAAAkA +AAAOAAAAQAQAAAYAAAAIAAAAAQAAAAAAAAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAOAAAAMAAA +AAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAGAAQAAAAA3Q4AAADYAwAA +BgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAQAAAAAQAAAEAAAABt +YXRsYWJyb290AAAAAAAAc2VwYXJhdG9yAAAAAAAAAHNlbnRpbmVsAAAAAAAAAABmdW5jdGlvbl9o +YW5kbGUADgAAAFAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAHwAAAAEAAAAAAAAAEAAA +AB8AAAAvQXBwbGljYXRpb25zL01BVExBQl9SMjAyMWIuYXBwAA4AAAAwAAAABgAAAAgAAAAEAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQAvAAAADgAAADAAAAAGAAAACAAAAAQAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAEAAAAAOAAAAkAIAAAYAAAAIAAAAAgAAAAAA +AAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAEQAAAAEAAABVAAAAZnVuY3Rpb24AAAAAAAAA +AAB0eXBlAAAAAAAAAAAAAAAAAGZpbGUAAAAAAAAAAAAAAAAAd29ya3NwYWNlAAAAAAAAAAB3aXRo +aW5fZmlsZV9wYXRoAAAAAA4AAABgAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAACkAAAAB +AAAAAAAAABAAAAApAAAAc2YlMEAoc3JjLGV2ZW50KXBiX2NhbGwob2JqZWN0LHNyYyxldmVudCkA +AAAAAAAADgAAAEAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAACQAAAAEAAAAAAAAAEAAA +AAkAAABhbm9ueW1vdXMAAAAAAAAADgAAAMAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAA +jQAAAAEAAAAAAAAAEAAAAI0AAAAvVXNlcnMvcGVzYXJhYW1hcmFzZWtlcmEvTGlicmFyeS9BcHBs +aWNhdGlvbiBTdXBwb3J0L01hdGhXb3Jrcy9NQVRMQUIgQWRkLU9ucy9Db2xsZWN0aW9ucy9UYWJ1 +bGFyIEV4cHJlc3Npb24gVG9vbGJveC9UYWJsZVRvb2wvQENlbGwvc2V0X3BiLm0AAAAOAAAASAAA +AAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAA +AQAAAAEAAAAnAAAABAAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAAB +AAAAAAAAABAAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEA +AAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAQAAAAAAAAAOAAAAUAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAA +AACJQAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAQGpAAAAAAABAakAAAAAAAAA+QAAAAAAAAE5A +DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAA +AADdAgAAAAEAAAABAAAAKAAAAAIAAAAOAAAAOAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAA +SAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0C +AAAAAQAAAAEAAAAIAAAABQAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQA +AAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATkAOAAAAUAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAACRADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAG +AAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAKQAAAAYAAAAOAAAAUAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAA +AADQckAAAAAAAACJQAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAQGpAAAAAAABAakAAAAAAAAA+ +QAAAAAAAAE5ADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAA +BgAAABgAAAAAAADdAgAAAAEAAAABAAAAKgAAAAIAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAF +AAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAmAAAABwAAAA4A +AAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAA +AAAA8D8OAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAA +GAAAAHL8JUR9ye4/tHFEdcii7j++yj5TdvfsPw4AAABQAAAABgAAAAgAAAANAAAAAAAAAAUAAAAI +AAAACAAAAAEAAAABAAAAAAAAAAYAAAAgAAAAAAAA3QIAAAABAAAAAwAAAAoAAAAVAAAAIAAAAAkA +AAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAA +AAAAAAAAAAhADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAA +CQAAAAgAAAAAAAAAAAAAQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAAB +AAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAIAAAAKAAAADgAAADAAAAAGAAAACAAAAAQA +AAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAAEAADAG5ldwAOAAAAUAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAACRAAAAAAACAZkAAAAAA +AABZQAAAAAAAAD5ADgAAABABAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAA +AAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgA +AAAAAADdAgAAAAEAAAABAAAAAAAAAAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAFAAQABwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAA +DQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAJ +AAAACAAAAA4AAABABAAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4A +AAAwAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAA +ANgDAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAA +QAAAAG1hdGxhYnJvb3QAAAAAAABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0 +aW9uX2hhbmRsZQAOAAAAUAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAA +AAAQAAAAHwAAAC9BcHBsaWNhdGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAA +AAQAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAA +BAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACQAgAABgAAAAgAAAAC +AAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAA +AAAAAAAAAHR5cGUAAAAAAAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAA +AHdpdGhpbl9maWxlX3BhdGgAAAAADgAAAGAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAA +LQAAAAEAAAAAAAAAEAAAAC0AAABzZiUwQChzcmMsZXZlbnQpcGJfbmV3X2NhbGwob2JqZWN0LHNy +YyxldmVudCkAAAAOAAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAA +AAAQAAAACQAAAGFub255bW91cwAAAAAAAAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAA +AAEAAACNAAAAAQAAAAAAAAAQAAAAjQAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5 +L0FwcGxpY2F0aW9uIFN1cHBvcnQvTWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25z +L1RhYnVsYXIgRXhwcmVzc2lvbiBUb29sYm94L1RhYmxlVG9vbC9AR3JpZC9zZXRfcGIubQAAAA4A +AABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA +3QIAAAABAAAAAQAAACwAAAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAA +AAAAAAEAAAAAAAAAEAAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAAB +AAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAABAAAAAAAAAA4AAABQAAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAAANBy +QAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAB +AAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAJEAAAAAAAIBmQAAAAAAAAFlAAAAA +AAAAPkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAA +GAAAAAAAAN0CAAAAAQAAAAEAAAAtAAAAAgAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAAAAUAAAAI +AAAAAQAAAAEAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAA +AA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAA +AAAA3QIAAAABAAAAAQAAAAgAAAAFAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAB +AAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+QA4A +AABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAA +CAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAuAAAABgAAAA4AAABQ +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA +8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAG +AAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAJEAAAAAAAIBmQAAA +AAAAAFlAAAAAAAAAPkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAA +AAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAvAAAAAgAAAA4AAABIAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAACsAAAAH +AAAADgAAADgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAABgAAAAEAAAAAAAAAEAAAAAYA +AABkZWxldGUAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAA +AAkAAAAgAAAAAAAAAACAW0AAAAAAAIBmQAAAAAAAAFlAAAAAAAAAPkAOAAAAEAEAAAYAAAAIAAAA +AQAAAAAAAAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAF +AAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAAAAAABAAAAA4A +AACQAAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAHAAAAAQAA +AAcAAABvYmplY3QAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAA +AAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAkAAAAIAAAADgAAAEgEAAAGAAAACAAAAAEAAAAA +AAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAADAAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgA +AAABAAAAAQAAAAEAAAAAAAAABgAEAAAAAN0OAAAA4AMAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAFAAQAEAAAAAEAAABAAAAAbWF0bGFicm9vdAAAAAAAAHNlcGFyYXRv +cgAAAAAAAABzZW50aW5lbAAAAAAAAAAAZnVuY3Rpb25faGFuZGxlAA4AAABQAAAABgAAAAgAAAAE +AAAAAAAAAAUAAAAIAAAAAQAAAB8AAAABAAAAAAAAABAAAAAfAAAAL0FwcGxpY2F0aW9ucy9NQVRM +QUJfUjIwMjFiLmFwcAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAA +AAAAAAAQAAEALwAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAABAAAQBAAAAADgAAAJgCAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAABQAEABEAAAABAAAAVQAAAGZ1bmN0aW9uAAAAAAAAAAAAdHlwZQAAAAAAAAAAAAAAAABmaWxl +AAAAAAAAAAAAAAAAAHdvcmtzcGFjZQAAAAAAAAAAd2l0aGluX2ZpbGVfcGF0aAAAAAAOAAAAYAAA +AAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAwAAAAAQAAAAAAAAAQAAAAMAAAAHNmJTBAKHNy +YyxldmVudClwYl9kZWxldGVfY2FsbChvYmplY3Qsc3JjLGV2ZW50KQ4AAABAAAAABgAAAAgAAAAE +AAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAAAAAJAAAAYW5vbnltb3VzAAAAAAAAAA4A +AADIAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAJQAAAABAAAAAAAAABAAAACUAAAAL1Vz +ZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9NYXRoV29y +a3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMvVGFidWxhciBFeHByZXNzaW9uIFRvb2xib3gv +VGFibGVUb29sL0BHcmlkL3NldF9kZWxldGVfcGIubQAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAxAAAABAAA +AA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAABAAAAAAAAAA +DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAA +AADdAgAAAAAAAAAAAAAAAQAAAAAAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAAAACJQAAAAAAAwIJADgAA +ADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAA +AAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAI +AAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAA +AAAJAAAAIAAAAAAAAAAAgFtAAAAAAACAZkAAAAAAAABZQAAAAAAAAD5ADgAAAEgAAAAGAAAACAAA +AA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAA +MgAAAAIAAAAOAAAAOAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAF +AAQAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEA +AAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAA +BQAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAg +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkAOAAAAUAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAACRADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAA +BgAAABgAAAAAAADdAgAAAAEAAAABAAAAMwAAAAYAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAAAACJQAAA +AAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAA +AAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAE +AAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAgFtAAAAAAACAZkAAAAAAAABZQAAAAAAAAD5ADgAAAEgA +AAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAA +AAEAAAABAAAANAAAAAIAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +AQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAwAAAABwAAAA4AAABIAAAABgAAAAgAAAAN +AAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAkA +AAAIAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAA +AAgAAAAAAAAAAAAAQA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAA +AAAAABAAAwB4PjEADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAA +AAAACQAAACAAAAAAAAAAAMB8QAAAAAAAoHlAAAAAAAAAaUAAAAAAAABOQA4AAABIAAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAAAkAAAAYAAAAAAAAAAAA8D8AAAAAAADw +PwAAAAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAA +BgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAQAAAAAAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAAAACJQAAA +AAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAA +AAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAE +AAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAwHxAAAAAAACgeUAAAAAAAABpQAAAAAAAAE5ADgAAAEgA +AAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAA +AAEAAAABAAAAOAAAAAIAAAAOAAAAOAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAF +AAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAAEAEAAAYA +AAAIAAAAAQAAAAAAAAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAAAAAA +BAAAAA4AAACQAAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAH +AAAAAQAAAAcAAABvYmplY3QAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEA +AAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAgAAAAFAAAADgAAAFAEAAAGAAAACAAA +AAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAADAAAAAGAAAACAAAAA0AAAAAAAAA +BQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABgAEAAAAAN0OAAAA6AMAAAYAAAAIAAAAAgAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAEAAAAAEAAABAAAAAbWF0bGFicm9vdAAAAAAAAHNl +cGFyYXRvcgAAAAAAAABzZW50aW5lbAAAAAAAAAAAZnVuY3Rpb25faGFuZGxlAA4AAABQAAAABgAA +AAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAB8AAAABAAAAAAAAABAAAAAfAAAAL0FwcGxpY2F0aW9u +cy9NQVRMQUJfUjIwMjFiLmFwcAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAQAAEALwAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAABAAAQBAAAAADgAAAKACAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAA +AAEAAAAAAAAABQAEABEAAAABAAAAVQAAAGZ1bmN0aW9uAAAAAAAAAAAAdHlwZQAAAAAAAAAAAAAA +AABmaWxlAAAAAAAAAAAAAAAAAHdvcmtzcGFjZQAAAAAAAAAAd2l0aGluX2ZpbGVfcGF0aAAAAAAO +AAAAaAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAyAAAAAQAAAAAAAAAQAAAAMgAAAHNm +JTBAKHNyYyxldmVudCl0ZXh0Ym94X2NhbGxiYWNrKG9iamVjdCxzcmMsZXZlbnQpAAAAAAAADgAA +AEAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAACQAAAAEAAAAAAAAAEAAAAAkAAABhbm9u +eW1vdXMAAAAAAAAADgAAAMgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAlQAAAAEAAAAA +AAAAEAAAAJUAAAAvVXNlcnMvcGVzYXJhYW1hcmFzZWtlcmEvTGlicmFyeS9BcHBsaWNhdGlvbiBT +dXBwb3J0L01hdGhXb3Jrcy9NQVRMQUIgQWRkLU9ucy9Db2xsZWN0aW9ucy9UYWJ1bGFyIEV4cHJl +c3Npb24gVG9vbGJveC9UYWJsZVRvb2wvQEdVSS9jcmVhdGVfc3RkX3RleHQubQAAAA4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAAB +AAAAAQAAADkAAAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEA +AAAAAAAAEAAAAAAAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAA +AAAAAAAJAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5ADgAAAFAAAAAGAAAA +CAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAmQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEA +AAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAADoAAAAGAAAADgAAAFAAAAAGAAAACAAA +AAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJA +AAAAAAAAiUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAMB8QAAAAAAAoHlAAAAAAAAAaUAAAAAA +AABOQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAY +AAAAAAAA3QIAAAABAAAAAQAAADsAAAACAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgA +AAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAANwAAAAcAAAAOAAAAMAAA +AAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAQAAMAeD4xAA4AAAA4AAAA +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAAA1AAAACAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAUAAAAAYAAAAIAAAADQAAAAAAAAAFAAAA +CAAAAAcAAAABAAAAAQAAAAAAAAAGAAAAHAAAAAAAAN0CAAAAAQAAAAIAAAAEAAAANgAAAAkAAAAA +AAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgA +AAAAAAAAAAAAQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +AAkAAAAIAAAAAAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +AQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAACAAAACgAAAA4AAAAwAAAABgAAAAgAAAAE +AAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAABAAAwBuZXcADgAAAFAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAKCEQAAAAAAA4HpAAAAA +AAAATkAAAAAAAAA0QA4AAAAQAQAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAA +AAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAY +AAAAAAAA3QIAAAABAAAAAQAAAAAAAAAEAAAADgAAAJAAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgA +AAABAAAAAQAAAAEAAAAAAAAABQAEAAcAAAABAAAABwAAAG9iamVjdAAADgAAAEgAAAAGAAAACAAA +AA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAA +NQAAAAgAAAAOAAAAQAQAAAYAAAAIAAAAAQAAAAAAAAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAO +AAAAMAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAGAAQAAAAA3Q4A +AADYAwAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAQAAAAAQAA +AEAAAABtYXRsYWJyb290AAAAAAAAc2VwYXJhdG9yAAAAAAAAAHNlbnRpbmVsAAAAAAAAAABmdW5j +dGlvbl9oYW5kbGUADgAAAFAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAHwAAAAEAAAAA +AAAAEAAAAB8AAAAvQXBwbGljYXRpb25zL01BVExBQl9SMjAyMWIuYXBwAA4AAAAwAAAABgAAAAgA +AAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQAvAAAADgAAADAAAAAGAAAACAAA +AAQAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAEAAAAAOAAAAkAIAAAYAAAAIAAAA +AgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAEQAAAAEAAABVAAAAZnVuY3Rpb24A +AAAAAAAAAAB0eXBlAAAAAAAAAAAAAAAAAGZpbGUAAAAAAAAAAAAAAAAAd29ya3NwYWNlAAAAAAAA +AAB3aXRoaW5fZmlsZV9wYXRoAAAAAA4AAABgAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAA +AC0AAAABAAAAAAAAABAAAAAtAAAAc2YlMEAoc3JjLGV2ZW50KXBiX25ld19jYWxsKG9iamVjdCxz +cmMsZXZlbnQpAAAADgAAAEAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAACQAAAAEAAAAA +AAAAEAAAAAkAAABhbm9ueW1vdXMAAAAAAAAADgAAAMAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgA +AAABAAAAjQAAAAEAAAAAAAAAEAAAAI0AAAAvVXNlcnMvcGVzYXJhYW1hcmFzZWtlcmEvTGlicmFy +eS9BcHBsaWNhdGlvbiBTdXBwb3J0L01hdGhXb3Jrcy9NQVRMQUIgQWRkLU9ucy9Db2xsZWN0aW9u +cy9UYWJ1bGFyIEV4cHJlc3Npb24gVG9vbGJveC9UYWJsZVRvb2wvQEdyaWQvc2V0X3BiLm0AAAAO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAAA9AAAABAAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAAAA +AAAAAAABAAAAAAAAABAAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAA +AQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAQAAAAAAAAAOAAAAUAAAAAYAAAAI +AAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQ +ckAAAAAAAACJQAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAA +AAEAAAAAAAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAoIRAAAAAAADgekAAAAAAAABOQAAA +AAAAADRADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAA +ABgAAAAAAADdAgAAAAEAAAABAAAAPgAAAAIAAAAOAAAAOAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAA +AAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAwAAAAAA +AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAA +AAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANEAO +AAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAPwAAAAYAAAAOAAAA +UAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAA +APC/AAAAAADQckAAAAAAAACJQAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAA +BgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAoIRAAAAAAADgekAA +AAAAAABOQAAAAAAAADRADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEA +AAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAQAAAAAIAAAAOAAAASAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAA8AAAA +BwAAAA4AAAA4AAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAYAAAABAAAAAAAAABAAAAAG +AAAAZGVsZXRlAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAA +AAAJAAAAIAAAAAAAAAAAoIRAAAAAAACgeUAAAAAAAABOQAAAAAAAADRADgAAABABAAAGAAAACAAA +AAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAA +BQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAAAAAAAQAAAAO +AAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABwAAAAEA +AAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAA +AAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAA1AAAACAAAAA4AAABIBAAABgAAAAgAAAABAAAA +AAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAABgAAAAgAAAANAAAAAAAAAAUAAAAI +AAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAAOADAAAGAAAACAAAAAIAAAAAAAAABQAAAAgA +AAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1hdGxhYnJvb3QAAAAAAABzZXBhcmF0 +b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hhbmRsZQAOAAAAUAAAAAYAAAAIAAAA +BAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAAHwAAAC9BcHBsaWNhdGlvbnMvTUFU +TEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEA +AAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAA +AAAAAAAQAAEAQAAAAA4AAACYAgAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUAAAAAAAAAAAAAAAAAZmls +ZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxlX3BhdGgAAAAADgAAAGAA +AAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAMAAAAAEAAAAAAAAAEAAAADAAAABzZiUwQChz +cmMsZXZlbnQpcGJfZGVsZXRlX2NhbGwob2JqZWN0LHNyYyxldmVudCkOAAAAQAAAAAYAAAAIAAAA +BAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAACQAAAGFub255bW91cwAAAAAAAAAO +AAAAyAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAACUAAAAAQAAAAAAAAAQAAAAlAAAAC9V +c2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvTWF0aFdv +cmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVsYXIgRXhwcmVzc2lvbiBUb29sYm94 +L1RhYmxlVG9vbC9AR3JpZC9zZXRfZGVsZXRlX3BiLm0AAAAADgAAAEgAAAAGAAAACAAAAA0AAAAA +AAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAQgAAAAQA +AAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAQAAAAAAAA +AA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAA +AAAA3QIAAAAAAAAAAAAAAAEAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAB +AAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAAAAAAiUAAAAAAAMCCQA4A +AAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAA +AAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAA +CAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAA +AAAACQAAACAAAAAAAAAAAKCEQAAAAAAAoHlAAAAAAAAATkAAAAAAAAA0QA4AAABIAAAABgAAAAgA +AAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAA +AEMAAAACAAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAA +BQAEAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAAB +AAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0A +AAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACAAA +AAUAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAA +IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRADgAAAFAAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAkQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAA +AAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAEQAAAAGAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAAAAAAiUAA +AAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkA +AAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAA +AAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAA +BAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAKCEQAAAAAAAoHlAAAAAAAAATkAAAAAAAAA0QA4AAABI +AAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIA +AAABAAAAAQAAAEUAAAACAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAA +AAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAQQAAAAcAAAAOAAAASAAAAAYAAAAIAAAA +DQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAA1 +AAAACAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYA +AAAYAAAAAAAA3QIAAAABAAAAAQAAAAIAAAAKAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAlkAAAAAA +ACCMQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAI +AAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAA +AAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAA +AAEAAAAAAAAACQAAACAAAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAAiUAAAAAAAMCCQA4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAAB +AAAAAQAAAEcAAAACAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEA +AAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAlkAAAAAAACCMQA4AAAA4AAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +AC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAA +AAAAAAAAAADwPwAAAAAAAPA/AAAAAAAAiUAAAAAAAFiEQA4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAEgAAAACAAAA +DgAAABABAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAAEgAAAAG +AAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEA +AAABAAAAAAAAAAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAA +AAAAAAAFAAQABwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAA +CAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABA +BAAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAABgAAAAgA +AAANAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAANgDAAAGAAAACAAA +AAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1hdGxhYnJv +b3QAAAAAAABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hhbmRsZQAO +AAAAUAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAAHwAAAC9B +cHBsaWNhdGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAA +AAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACQAgAABgAAAAgAAAACAAAAAAAAAAUAAAAI +AAAAAQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUA +AAAAAAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxl +X3BhdGgAAAAADgAAAGAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAKwAAAAEAAAAAAAAA +EAAAACsAAABzZiUwQChzcmMsZXZlbnQpY2xvc2VfZmlnKG9iamVjdCxzcmMsZXZlbnQpAAAAAAAO +AAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAACQAAAGFu +b255bW91cwAAAAAAAAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAACKAAAAAQAA +AAAAAAAQAAAAigAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxpY2F0aW9u +IFN1cHBvcnQvTWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVsYXIgRXhw +cmVzc2lvbiBUb29sYm94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAAAAAAAA4AAABIAAAABgAAAAgA +AAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAA +AEkAAAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAA +EAAAAAAAAAAOAAAAEAEAAAYAAAAIAAAAAQAAAAAAAAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAAAAAAAABAAAAA4AAACQAAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAUABAAHAAAAAQAAAAcAAABvYmplY3QAAA4AAABIAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAgAAAAF +AAAADgAAAEAEAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAADAA +AAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABgAEAAAAAN0OAAAA2AMA +AAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAEAAAAAEAAABAAAAA +bWF0bGFicm9vdAAAAAAAAHNlcGFyYXRvcgAAAAAAAABzZW50aW5lbAAAAAAAAAAAZnVuY3Rpb25f +aGFuZGxlAA4AAABQAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAB8AAAABAAAAAAAAABAA +AAAfAAAAL0FwcGxpY2F0aW9ucy9NQVRMQUJfUjIwMjFiLmFwcAAOAAAAMAAAAAYAAAAIAAAABAAA +AAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEALwAAAA4AAAAwAAAABgAAAAgAAAAEAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQBAAAAADgAAAJACAAAGAAAACAAAAAIAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABEAAAABAAAAVQAAAGZ1bmN0aW9uAAAAAAAA +AAAAdHlwZQAAAAAAAAAAAAAAAABmaWxlAAAAAAAAAAAAAAAAAHdvcmtzcGFjZQAAAAAAAAAAd2l0 +aGluX2ZpbGVfcGF0aAAAAAAOAAAAYAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAsAAAA +AQAAAAAAAAAQAAAALAAAAHNmJTFAKHNyYyxldmVudClyZXNpemVfZmlnKG9iamVjdCxzcmMsZXZl +bnQpAAAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAA +AAAJAAAAYW5vbnltb3VzAAAAAAAAAA4AAADAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAA +AIoAAAABAAAAAAAAABAAAACKAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkvQXBw +bGljYXRpb24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMvVGFi +dWxhciBFeHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvaW5pdC5tAAAAAAAADgAAAEgA +AAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAA +AAEAAAABAAAASgAAAAQAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAAAAAAAAAAA +AQAAAAAAAAAQAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAABAAAQBmAAAADgAAADAIAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAQAAAAEAAAAAEA +AAAAAAAACQAAAAAIAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAA +AAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAA +AADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAA +APA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA +8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADw +PwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/ +AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8A +AAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAA +AAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAA +AAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAA +AADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAA +APA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA +8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADw +PwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/ +AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8A +AAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAA +AAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAA +AAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAA +AADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAA +APA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA +8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADw +PwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/ +AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8A +AAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAA +AAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAA +AAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAA +AADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAA +APA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA +8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADw +PwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/ +AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8A +AAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAA +AAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAA +AAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAA +AADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAA +APA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA +8D8AAAAAAADwPw4AAABAAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAIAAAABAAAAAAAA +AAkAAAAQAAAAAAAAAAAA8D8AAAAAAADwPw4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAeQAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAADAfEAAAAAAAEBqQAAAAAAAAGlAAAAA +AAAATkAOAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAA +GAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAI +AAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAEAAAAAAAAADgAAAFAA +AAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADw +vwAAAAAA0HJAAAAAAAAAiUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAMB8QAAAAAAAQGpAAAAA +AAAAaUAAAAAAAABOQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAA +AAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAEwAAAACAAAADgAAADgAAAAGAAAACAAAAAIAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgA +AAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAA +AAMAAAAAAAAADgAAABABAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAA +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 +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAADAfEAA +AAAAAEBqQAAAAAAAAGlAAAAAAAAATkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYA +AAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAABPAAAAAgAAAA4AAAA4AAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAA +MAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAQAAMAeC95AA4AAABQ +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAABA +cEAAAAAAAEBqQAAAAAAAAGlAAAAAAAAATkAOAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAADAAAAAQAAAAAAAAAJAAAAGAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPw4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAA +AAAAAAAAAAEAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEA +AAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAAAAAAiUAAAAAAAMCCQA4AAAA4AAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +AC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAA +AAAAAAAAAEBwQAAAAAAAQGpAAAAAAAAAaUAAAAAAAABOQA4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAFEAAAACAAAA +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 +AQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAO +AAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAA +AAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAA +AAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAA +AAAAAAkAAAAgAAAAAAAAAABAcEAAAAAAAEBqQAAAAAAAAGlAAAAAAAAATkAOAAAASAAAAAYAAAAI +AAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEA +AABUAAAAAgAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +AAkAAAAIAAAAAAAAAAAAAEAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAQAAEAeAAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAAB +AAAAAAAAAAkAAAAgAAAAAAAAAADAfEAAAAAAAOBwQAAAAAAAAGlAAAAAAAAATkAOAAAASAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAAGAAAAAAAAAAAAPA/AAAA +AAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAA +AAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAEAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAAAAAA +iUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +AAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAB +AAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAMB8QAAAAAAA4HBAAAAAAAAAaUAAAAAAAABOQA4A +AABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA +3QIAAAABAAAAAQAAAFYAAAACAAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAI +AAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAADgAAABAB +AAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAA +AA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAA +AAAAAAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAF +AAQABwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYA +AAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABQBAAABgAA +AAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAAOgDAAAGAAAACAAAAAIAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1hdGxhYnJvb3QAAAAA +AABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hhbmRsZQAOAAAAUAAA +AAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAAHwAAAC9BcHBsaWNh +dGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAB +AAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACgAgAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUAAAAAAAAA +AAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxlX3BhdGgA +AAAADgAAAGgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAMgAAAAEAAAAAAAAAEAAAADIA +AABzZiUwQChzcmMsZXZlbnQpdGV4dGJveF9jYWxsYmFjayhvYmplY3Qsc3JjLGV2ZW50KQAAAAAA +AA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAAAAAJAAAA +YW5vbnltb3VzAAAAAAAAAA4AAADIAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAJUAAAAB +AAAAAAAAABAAAACVAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkvQXBwbGljYXRp +b24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMvVGFidWxhciBF +eHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvY3JlYXRlX3N0ZF90ZXh0Lm0AAAAOAAAA +SAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0C +AAAAAQAAAAEAAABXAAAABAAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAAAAAAAA +AAABAAAAAAAAABAAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAA +AAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOQA4AAABQAAAA +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAJkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYA +AAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAABYAAAABgAAAA4AAABQAAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAA +ANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAADAfEAAAAAAAOBwQAAAAAAAAGlA +AAAAAAAATkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAG +AAAAGAAAAAAAAN0CAAAAAQAAAAEAAABZAAAAAgAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAAMAAAAAYAAAAIAAAABAAA +AAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAQAAMAeCp5AA4AAABQAAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAABAcEAAAAAAAOBwQAAAAAAA +AGlAAAAAAAAATkAOAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAA +AAAJAAAAGAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAEAAAAAAAAA +DgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAA +AAAAAADwvwAAAAAA0HJAAAAAAAAAiUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAA +CAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAEBwQAAAAAAA +4HBAAAAAAAAAaUAAAAAAAABOQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEA +AAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAFsAAAACAAAADgAAADgAAAAGAAAACAAA +AAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAA +AAAAAAAAAAMAAAAAAAAADgAAABABAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEA +AAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAA +ABgAAAAAAADdAgAAAAEAAAABAAAAAAAAAAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAI +AAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEA +AAAIAAAABQAAAA4AAABQBAAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAA +AA4AAAAwAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADd +DgAAAOgDAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAAB +AAAAQAAAAG1hdGxhYnJvb3QAAAAAAABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1 +bmN0aW9uX2hhbmRsZQAOAAAAUAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAA +AAAAAAAQAAAAHwAAAC9BcHBsaWNhdGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAA +CAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAI +AAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACgAgAABgAAAAgA +AAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlv +bgAAAAAAAAAAAHR5cGUAAAAAAAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAA +AAAAAHdpdGhpbl9maWxlX3BhdGgAAAAADgAAAGgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAB +AAAAMgAAAAEAAAAAAAAAEAAAADIAAABzZiUwQChzcmMsZXZlbnQpdGV4dGJveF9jYWxsYmFjayhv +YmplY3Qsc3JjLGV2ZW50KQAAAAAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAA +AAkAAAABAAAAAAAAABAAAAAJAAAAYW5vbnltb3VzAAAAAAAAAA4AAADIAAAABgAAAAgAAAAEAAAA +AAAAAAUAAAAIAAAAAQAAAJUAAAABAAAAAAAAABAAAACVAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2Vr +ZXJhL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMv +Q29sbGVjdGlvbnMvVGFidWxhciBFeHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvY3Jl +YXRlX3N0ZF90ZXh0Lm0AAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +AQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAABcAAAABAAAAA4AAAAwAAAABgAAAAgAAAAE +AAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAABAAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAABOQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAA +AAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkAOAAAASAAAAAYAAAAI +AAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEA +AABdAAAABgAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAA +AAkAAAAgAAAAAAAAAAAA8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAA +BgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAG +AAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4A +AABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAA +AABAcEAAAAAAAOBwQAAAAAAAAGlAAAAAAAAATkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAA +CAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAABeAAAAAgAAAA4AAAA4 +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA +AEAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAQAAMAeCt5 +AA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAA +AAAAAADAfEAAAAAAAKB0QAAAAAAAAGlAAAAAAAAATkAOAAAASAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAAGAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPw4A +AABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA +3QIAAAAAAAAAAAAAAAEAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAA +BAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAAAAAAiUAAAAAAAMCCQA4AAAA4 +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA +HEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAA +AAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAA +CQAAACAAAAAAAAAAAMB8QAAAAAAAoHRAAAAAAAAAaUAAAAAAAABOQA4AAABIAAAABgAAAAgAAAAN +AAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAGAA +AAACAAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAE +AAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAA +AAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAADgAAABABAAAGAAAACAAAAAEAAAAA +AAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgA +AAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAAAAAAAQAAAAOAAAAkAAA +AAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABwAAAAEAAAAHAAAA +b2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAG +AAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABQBAAABgAAAAgAAAABAAAAAAAAAAUA +AAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAYABAAAAADdDgAAAOgDAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1hdGxhYnJvb3QAAAAAAABzZXBhcmF0b3IAAAAA +AAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hhbmRsZQAOAAAAUAAAAAYAAAAIAAAABAAAAAAA +AAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAAHwAAAC9BcHBsaWNhdGlvbnMvTUFUTEFCX1Iy +MDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAA +EAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQ +AAEAQAAAAA4AAACgAgAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUA +BAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUAAAAAAAAAAAAAAAAAZmlsZQAAAAAA +AAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxlX3BhdGgAAAAADgAAAGgAAAAGAAAA +CAAAAAQAAAAAAAAABQAAAAgAAAABAAAAMgAAAAEAAAAAAAAAEAAAADIAAABzZiUwQChzcmMsZXZl +bnQpdGV4dGJveF9jYWxsYmFjayhvYmplY3Qsc3JjLGV2ZW50KQAAAAAAAA4AAABAAAAABgAAAAgA +AAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAAAAAJAAAAYW5vbnltb3VzAAAAAAAA +AA4AAADIAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAJUAAAABAAAAAAAAABAAAACVAAAA +L1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9NYXRo +V29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMvVGFidWxhciBFeHByZXNzaW9uIFRvb2xi +b3gvVGFibGVUb29sL0BHVUkvY3JlYXRlX3N0ZF90ZXh0Lm0AAAAOAAAASAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAABhAAAA +BAAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAABAAAAAA +AAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOQA4AAABQAAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAJkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAG +AAAAGAAAAAAAAN0CAAAAAQAAAAEAAABiAAAABgAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAAANByQAAAAAAAAIlAAAAA +AADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAA +CAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQA +AAABAAAAAAAAAAkAAAAgAAAAAAAAAADAfEAAAAAAAKB0QAAAAAAAAGlAAAAAAAAATkAOAAAASAAA +AAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAA +AQAAAAEAAABjAAAAAgAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEA +AAADAAAAAQAAAAAAAAAQAAMAeC15AA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAABAcEAAAAAAAKB0QAAAAAAAAGlAAAAAAAAATkAOAAAA +SAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAAGAAAAAAAAAAA +APA/AAAAAAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEA +AAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAEAAAAAAAAADgAAAFAAAAAGAAAACAAA +AAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJA +AAAAAAAAiUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAEBwQAAAAAAAoHRAAAAAAAAAaUAAAAAA +AABOQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAY +AAAAAAAA3QIAAAABAAAAAQAAAGUAAAACAAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgA +AAABAAAAAQAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAA +DgAAABABAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAAEgAAAAG +AAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEA +AAABAAAAAAAAAAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAA +AAAAAAAFAAQABwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAA +CAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABQ +BAAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAABgAAAAgA +AAANAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAAOgDAAAGAAAACAAA +AAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1hdGxhYnJv +b3QAAAAAAABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hhbmRsZQAO +AAAAUAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAAHwAAAC9B +cHBsaWNhdGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAA +AAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACgAgAABgAAAAgAAAACAAAAAAAAAAUAAAAI +AAAAAQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUA +AAAAAAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxl +X3BhdGgAAAAADgAAAGgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAMgAAAAEAAAAAAAAA +EAAAADIAAABzZiUwQChzcmMsZXZlbnQpdGV4dGJveF9jYWxsYmFjayhvYmplY3Qsc3JjLGV2ZW50 +KQAAAAAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAA +AAAJAAAAYW5vbnltb3VzAAAAAAAAAA4AAADIAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAA +AJUAAAABAAAAAAAAABAAAACVAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkvQXBw +bGljYXRpb24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMvVGFi +dWxhciBFeHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvY3JlYXRlX3N0ZF90ZXh0Lm0A +AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAA +AAAAAN0CAAAAAQAAAAEAAABmAAAABAAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAA +AAAAAAAAAAABAAAAAAAAABAAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAB +AAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOQA4A +AABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAA +CAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAABnAAAABgAAAA4AAABQ +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA +8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAA +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 +AAAAAAAAAAAAdHlwZQAAAAAAAAAAAAAAAABmaWxlAAAAAAAAAAAAAAAAAHdvcmtzcGFjZQAAAAAA +AAAAd2l0aGluX2ZpbGVfcGF0aAAAAAAOAAAAYAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEA +AAAsAAAAAQAAAAAAAAAQAAAALAAAAHNmJTMyQChzcmMsZXZlbnQpaGVscF9jYWxsKG9iamVjdCxz +cmMsZXZlbnQpAAAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAA +AAAAABAAAAAJAAAAYW5vbnltb3VzAAAAAAAAAA4AAADAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAI +AAAAAQAAAIoAAAABAAAAAAAAABAAAACKAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJh +cnkvQXBwbGljYXRpb24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlv +bnMvVGFidWxhciBFeHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvaW5pdC5tAAAAAAAA +DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAA +AADdAgAAAAEAAAABAAAAbQAAAAQAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAAA +AAAAAAAAAQAAAAAAAAAQAAAAAAAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAA +AAwAAAABAAAAAAAAABAAAAAMAAAAUHJvZHVjdCBIZWxwAAAAAA4AAABIAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAA +AAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAEA +AAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAA +AAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAADgAAAFAAAAAGAAAACAAAAA0AAAAAAAAA +BQAAAAgAAAAHAAAAAQAAAAEAAAAAAAAABgAAABwAAAAAAADdAgAAAAIAAAABAAAAagAAAGwAAAAL +AAAAAAAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUA +BAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAA +AAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAABAAAAABgAAAAgAAAAEAAAA +AAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAAAAAJAAAAVHlwZWNoZWNrAAAAAAAAAA4AAAAQ +AQAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgA +AAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAA +AAAAAAAEAAAADgAAAJAAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAA +BQAEAAcAAAABAAAABwAAAG9iamVjdAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAG +AAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACAAAAAUAAAAOAAAASAQAAAYA +AAAIAAAAAQAAAAAAAAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAGAAQAAAAA3Q4AAADgAwAABgAAAAgAAAACAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAQAAAAAQAAAEAAAABtYXRsYWJyb290AAAA +AAAAc2VwYXJhdG9yAAAAAAAAAHNlbnRpbmVsAAAAAAAAAABmdW5jdGlvbl9oYW5kbGUADgAAAFAA +AAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAHwAAAAEAAAAAAAAAEAAAAB8AAAAvQXBwbGlj +YXRpb25zL01BVExBQl9SMjAyMWIuYXBwAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAABAAAQAvAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAB +AAAAAQAAAAEAAAAAAAAAEAABAEAAAAAOAAAAmAIAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAFAAQAEQAAAAEAAABVAAAAZnVuY3Rpb24AAAAAAAAAAAB0eXBlAAAAAAAA +AAAAAAAAAGZpbGUAAAAAAAAAAAAAAAAAd29ya3NwYWNlAAAAAAAAAAB3aXRoaW5fZmlsZV9wYXRo +AAAAAA4AAABoAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAADMAAAABAAAAAAAAABAAAAAz +AAAAc2YlMzFAKHNyYyxldmVudClwdnNfZXh0X2NhbGxfc2ltKG9iamVjdCxzcmMsZXZlbnQpAAAA +AAAOAAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAACQAA +AGFub255bW91cwAAAAAAAAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAACKAAAA +AQAAAAAAAAAQAAAAigAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxpY2F0 +aW9uIFN1cHBvcnQvTWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVsYXIg +RXhwcmVzc2lvbiBUb29sYm94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAAAAAAAA4AAABIAAAABgAA +AAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAA +AQAAAHAAAAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAA +AAAAEAAAAAAAAAAOAAAASAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAWAAAAAQAAAAAA +AAAQAAAAFgAAAFBWUyBUeXBlY2hlY2sgU2ltVHlwZXMAAA4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAA +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 +EAAAADAAAABzZiUyOUAoc3JjLGV2ZW50KXByZl9maWxlX2NhbGwob2JqZWN0LHNyYyxldmVudCkO +AAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAACQAAAGFu +b255bW91cwAAAAAAAAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAACKAAAAAQAA +AAAAAAAQAAAAigAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxpY2F0aW9u +IFN1cHBvcnQvTWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVsYXIgRXhw +cmVzc2lvbiBUb29sYm94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAAAAAAAA4AAABIAAAABgAAAAgA +AAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAA +AHQAAAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAA +EAAAAAAAAAAOAAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAQAAAAAQAAAAAAAAAQ +AAAAEAAAAFBWUyBDaGVjayBTdGF0dXMOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUA +AAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAAA4AAAABgAA +AAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAA +SAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0C +AAAAAAAAAAAAAAADAAAAAAAAAA4AAAAQAQAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEA +AAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAA +AAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAAAAAAEAAAADgAAAJAAAAAGAAAACAAAAAIAAAAAAAAA +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 +DgAAAOADAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAAB +AAAAQAAAAG1hdGxhYnJvb3QAAAAAAABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1 +bmN0aW9uX2hhbmRsZQAOAAAAUAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAA +AAAAAAAQAAAAHwAAAC9BcHBsaWNhdGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAA +CAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAI +AAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACYAgAABgAAAAgA +AAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlv +bgAAAAAAAAAAAHR5cGUAAAAAAAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAA +AAAAAHdpdGhpbl9maWxlX3BhdGgAAAAADgAAAGgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAB +AAAANQAAAAEAAAAAAAAAEAAAADUAAABzZiUyNEAoc3JjLGV2ZW50KXByb3Zlcl9zZWxlY3RfY2Fs +bChvYmplY3Qsc3JjLGV2ZW50KQAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAA +AAkAAAABAAAAAAAAABAAAAAJAAAAYW5vbnltb3VzAAAAAAAAAA4AAADAAAAABgAAAAgAAAAEAAAA +AAAAAAUAAAAIAAAAAQAAAIoAAAABAAAAAAAAABAAAACKAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2Vr +ZXJhL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMv +Q29sbGVjdGlvbnMvVGFidWxhciBFeHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvaW5p +dC5tAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAA +BgAAABgAAAAAAADdAgAAAAEAAAABAAAAgAAAAAQAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAF +AAAACAAAAAAAAAAAAAAAAQAAAAAAAAAQAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUA +AAAIAAAAAQAAAAMAAAABAAAAAAAAABAAAwBQVlMADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAA +OAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAA +AAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQA +AAAAAADdAgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAAEAEAAAYAAAAIAAAAAQAAAAAAAAAFAAAACAAA +AAIAAAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +AQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAAAAAABAAAAA4AAACQAAAABgAAAAgAAAAC +AAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAHAAAAAQAAAAcAAABvYmplY3QAAA4A +AABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA +3QIAAAABAAAAAQAAAAgAAAAFAAAADgAAAEgEAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAA +AQAAAAEAAAAAAAAADgAAADAAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAABgAEAAAAAN0OAAAA4AMAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAA +AAAFAAQAEAAAAAEAAABAAAAAbWF0bGFicm9vdAAAAAAAAHNlcGFyYXRvcgAAAAAAAABzZW50aW5l +bAAAAAAAAAAAZnVuY3Rpb25faGFuZGxlAA4AAABQAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAA +AQAAAB8AAAABAAAAAAAAABAAAAAfAAAAL0FwcGxpY2F0aW9ucy9NQVRMQUJfUjIwMjFiLmFwcAAO +AAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEALwAAAA4A +AAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQBAAAAADgAA +AJgCAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABEAAAABAAAA +VQAAAGZ1bmN0aW9uAAAAAAAAAAAAdHlwZQAAAAAAAAAAAAAAAABmaWxlAAAAAAAAAAAAAAAAAHdv +cmtzcGFjZQAAAAAAAAAAd2l0aGluX2ZpbGVfcGF0aAAAAAAOAAAAaAAAAAYAAAAIAAAABAAAAAAA +AAAFAAAACAAAAAEAAAA1AAAAAQAAAAAAAAAQAAAANQAAAHNmJTIzQChzcmMsZXZlbnQpcHJvdmVy +X3NlbGVjdF9jYWxsKG9iamVjdCxzcmMsZXZlbnQpAAAADgAAAEAAAAAGAAAACAAAAAQAAAAAAAAA +BQAAAAgAAAABAAAACQAAAAEAAAAAAAAAEAAAAAkAAABhbm9ueW1vdXMAAAAAAAAADgAAAMAAAAAG +AAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAigAAAAEAAAAAAAAAEAAAAIoAAAAvVXNlcnMvcGVz +YXJhYW1hcmFzZWtlcmEvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0L01hdGhXb3Jrcy9NQVRM +QUIgQWRkLU9ucy9Db2xsZWN0aW9ucy9UYWJ1bGFyIEV4cHJlc3Npb24gVG9vbGJveC9UYWJsZVRv +b2wvQEdVSS9pbml0Lm0AAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAAB +AAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAACCAAAABAAAAA4AAAAwAAAABgAAAAgA +AAAEAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAABAAAAAAAAAADgAAADAAAAAGAAAACAAA +AAQAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAAEAAEAENWQzMOAAAASAAAAAYAAAAIAAAA +DQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAAD +AAAAAAAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUA +BAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAA +AAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAABQAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAABwAAAAEAAAABAAAAAAAAAAYAAAAcAAAAAAAA3QIAAAACAAAAAQAAAH8AAACB +AAAACwAAAAAAAAAOAAAAOAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAA +AAAFAAQAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAA +AAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAAMAAAAAYAAAAIAAAA +BAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAdAAAAA4AAAAQAQAABgAAAAgAAAAB +AAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUA +AAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAAAAAAEAAAADgAA +AJAAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAcAAAABAAAA +BwAAAG9iamVjdAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAA +AAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACAAAAAUAAAAOAAAASAQAAAYAAAAIAAAAAQAAAAAA +AAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAGAAQAAAAA3Q4AAADgAwAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAAAUABAAQAAAAAQAAAEAAAABtYXRsYWJyb290AAAAAAAAc2VwYXJhdG9y +AAAAAAAAAHNlbnRpbmVsAAAAAAAAAABmdW5jdGlvbl9oYW5kbGUADgAAAFAAAAAGAAAACAAAAAQA +AAAAAAAABQAAAAgAAAABAAAAHwAAAAEAAAAAAAAAEAAAAB8AAAAvQXBwbGljYXRpb25zL01BVExB +Ql9SMjAyMWIuYXBwAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAABAAAQAvAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAAEAABAEAAAAAOAAAAmAIAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAA +AAAFAAQAEQAAAAEAAABVAAAAZnVuY3Rpb24AAAAAAAAAAAB0eXBlAAAAAAAAAAAAAAAAAGZpbGUA +AAAAAAAAAAAAAAAAd29ya3NwYWNlAAAAAAAAAAB3aXRoaW5fZmlsZV9wYXRoAAAAAA4AAABoAAAA +BgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAADEAAAABAAAAAAAAABAAAAAxAAAAc2YlMjJAKHNy +YyxldmVudCl0eXBlY2hlY2tfY2FsbChvYmplY3Qsc3JjLGV2ZW50KQAAAAAAAAAOAAAAQAAAAAYA +AAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAACQAAAGFub255bW91cwAA +AAAAAAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAACKAAAAAQAAAAAAAAAQAAAA +igAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQv +TWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVsYXIgRXhwcmVzc2lvbiBU +b29sYm94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAIQAAAAEAAAA +DgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAAAAAAAO +AAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAACQAAAFR5 +cGVjaGVjawAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAA +AAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAAA4AAAABgAAAAgAAAACAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAI +AAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAA +AAADAAAAAAAAAA4AAABwAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAADwAAAAEAAAABAAAAAAAA +AAYAAAA8AAAAAAAA3QIAAAAKAAAAAQAAAG8AAABxAAAAcwAAAHUAAAB3AAAAeQAAAHoAAAB8AAAA +fgAAAIMAAAALAAAAAAAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUA +AAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAAAwAAAABgAA +AAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAABAABABFZGl0DgAAAEAAAAAGAAAA +CAAAAAQAAAAAAAAABQAAAAgAAAABAAAACwAAAAEAAAAAAAAAEAAAAAsAAABPdXRwdXQgTW9kZQAA +AAAADgAAABABAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAAEgA +AAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAA +AAEAAAABAAAAAAAAAAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAFAAQABwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAF +AAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4A +AABIBAAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAABgAA +AAgAAAANAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAAOADAAAGAAAA +CAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1hdGxh +YnJvb3QAAAAAAABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hhbmRs +ZQAOAAAAUAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAAHwAA +AC9BcHBsaWNhdGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAA +BQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACYAgAABgAAAAgAAAACAAAAAAAAAAUA +AAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5 +cGUAAAAAAAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9m +aWxlX3BhdGgAAAAADgAAAGgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAANAAAAAEAAAAA +AAAAEAAAADQAAABzZiUyMUAoc3JjLGV2ZW50KW11bHRpX3NlbGVjdF9jYWxsKG9iamVjdCxzcmMs +ZXZlbnQpAAAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAA +ABAAAAAJAAAAYW5vbnltb3VzAAAAAAAAAA4AAADAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAA +AQAAAIoAAAABAAAAAAAAABAAAACKAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkv +QXBwbGljYXRpb24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMv +VGFidWxhciBFeHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvaW5pdC5tAAAAAAAADgAA +AEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADd +AgAAAAEAAAABAAAAiAAAAAQAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAAAAAAA +AAAAAQAAAAAAAAAQAAAAAAAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAABAA +AAABAAAAAAAAABAAAAAQAAAATXVsdGlwbGUgT3V0cHV0cw4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAA +DgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAEAAAAB +AAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYA +AAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAADgAAABABAAAGAAAACAAAAAEAAAAAAAAABQAA +AAgAAAACAAAAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAA +AQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAAAAAAAQAAAAOAAAAkAAAAAYAAAAI +AAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABwAAAAEAAAAHAAAAb2JqZWN0 +AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAA +AAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABIBAAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAA +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 +AQAAAAAAAAAQAAAAigAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxpY2F0 +aW9uIFN1cHBvcnQvTWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVsYXIg +RXhwcmVzc2lvbiBUb29sYm94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAAAAAAAA4AAABIAAAABgAA +AAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAA +AQAAAIwAAAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAA +AAAAEAAAAAAAAAAOAAAASAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAWAAAAAQAAAAAA +AAAQAAAAFgAAAFBvcnRzIGFuZCBEYXRhIE1hbmFnZXIAAA4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAA +DgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAEAAAAB +AAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYA +AAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAADgAAAEgAAAAGAAAACAAAAAQAAAAAAAAABQAA +AAgAAAABAAAAEgAAAAEAAAAAAAAAEAAAABIAAABTaG93IGVkaXQgY29udHJvbHMAAAAAAAAOAAAA +SAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0C +AAAAAAAAAAAAAAADAAAAAAAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAAAwAAAA +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 +AHR5cGUAAAAAAAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhp +bl9maWxlX3BhdGgAAAAADgAAAGAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAALAAAAAEA +AAAAAAAAEAAAACwAAABzZiUxNkAoc3JjLGV2ZW50KWNsb3NlX2ZpZyhvYmplY3Qsc3JjLGV2ZW50 +KQAAAAAOAAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAA +CQAAAGFub255bW91cwAAAAAAAAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAACK +AAAAAQAAAAAAAAAQAAAAigAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxp +Y2F0aW9uIFN1cHBvcnQvTWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVs +YXIgRXhwcmVzc2lvbiBUb29sYm94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAAAAAAAA4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAAB +AAAAAQAAAJQAAAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEA +AAAAAAAAEAAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAFAAAAAQAA +AAAAAAAQAAAABQAAAENsb3NlAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAA +AQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAAOAAAAAYAAAAI +AAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAAAEgA +AAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAA +AAAAAAAAAAAAAwAAAAAAAAAOAAAAEAEAAAYAAAAIAAAAAQAAAAAAAAAFAAAACAAAAAIAAAABAAAA +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 +BgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAN +AAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAANgDAAAGAAAACAAAAAIA +AAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1hdGxhYnJvb3QA +AAAAAABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hhbmRsZQAOAAAA +UAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAAHwAAAC9BcHBs +aWNhdGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgA +AAABAAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACQAgAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUAAAAA +AAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxlX3Bh +dGgAAAAADgAAAGAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAALAAAAAEAAAAAAAAAEAAA +ACwAAABzZiUxM0Aoc3JjLGV2ZW50KW9wZW5fY2FsbChvYmplY3Qsc3JjLGV2ZW50KQAAAAAOAAAA +QAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAACQAAAGFub255 +bW91cwAAAAAAAAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAACKAAAAAQAAAAAA +AAAQAAAAigAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1 +cHBvcnQvTWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVsYXIgRXhwcmVz +c2lvbiBUb29sYm94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAAAAAAAA4AAABIAAAABgAAAAgAAAAN +AAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAJoA +AAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAEAAA +AAAAAAAOAAAAOAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAHAAAAAQAAAAAAAAAQAAAA +BwAAAE9wZW4uLi4ADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAA +AAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAAOAAAAAYAAAAIAAAAAgAAAAAA +AAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAA +AA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAA +AwAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQ +AAEAbgAAAA4AAAAQAQAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4A +AABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA +3QIAAAABAAAAAQAAAAAAAAAEAAAADgAAAJAAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAABQAEAAcAAAABAAAABwAAAG9iamVjdAAADgAAAEgAAAAGAAAACAAAAA0AAAAA +AAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACAAAAAUA +AAAOAAAAQAQAAAYAAAAIAAAAAQAAAAAAAAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAOAAAAMAAA +AAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAGAAQAAAAA3Q4AAADYAwAA +BgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAQAAAAAQAAAEAAAABt +YXRsYWJyb290AAAAAAAAc2VwYXJhdG9yAAAAAAAAAHNlbnRpbmVsAAAAAAAAAABmdW5jdGlvbl9o +YW5kbGUADgAAAFAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAHwAAAAEAAAAAAAAAEAAA +AB8AAAAvQXBwbGljYXRpb25zL01BVExBQl9SMjAyMWIuYXBwAA4AAAAwAAAABgAAAAgAAAAEAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQAvAAAADgAAADAAAAAGAAAACAAAAAQAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAEAAAAAOAAAAkAIAAAYAAAAIAAAAAgAAAAAA +AAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAEQAAAAEAAABVAAAAZnVuY3Rpb24AAAAAAAAA +AAB0eXBlAAAAAAAAAAAAAAAAAGZpbGUAAAAAAAAAAAAAAAAAd29ya3NwYWNlAAAAAAAAAAB3aXRo +aW5fZmlsZV9wYXRoAAAAAA4AAABgAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAACsAAAAB +AAAAAAAAABAAAAArAAAAc2YlMTJAKHNyYyxldmVudCluZXdfY2FsbChvYmplY3Qsc3JjLGV2ZW50 +KQAAAAAADgAAAEAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAACQAAAAEAAAAAAAAAEAAA +AAkAAABhbm9ueW1vdXMAAAAAAAAADgAAAMAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAA +igAAAAEAAAAAAAAAEAAAAIoAAAAvVXNlcnMvcGVzYXJhYW1hcmFzZWtlcmEvTGlicmFyeS9BcHBs +aWNhdGlvbiBTdXBwb3J0L01hdGhXb3Jrcy9NQVRMQUIgQWRkLU9ucy9Db2xsZWN0aW9ucy9UYWJ1 +bGFyIEV4cHJlc3Npb24gVG9vbGJveC9UYWJsZVRvb2wvQEdVSS9pbml0Lm0AAAAAAAAOAAAASAAA +AAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAA +AQAAAAEAAACcAAAABAAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAAB +AAAAAAAAABAAAAAAAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEA +AAAAAAAAEAADAE5ldwAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAA +AAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAAA4AAAABgAAAAgAAAACAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAI +AAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAA +AAADAAAAAAAAAA4AAABYAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAACgAAAAEAAAABAAAAAAAA +AAYAAAAoAAAAAAAA3QIAAAAFAAAAAQAAAJMAAACVAAAAlwAAAJkAAACbAAAACwAAAA4AAAA4AAAA +BgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAA +AN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAA +CAAAAAEAAAADAAAAAQAAAAAAAAAQAAMAeCx5AA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAACAVkAAAAAAAFB+QAAAAAAAQG9AAAAAAAAA +TkAOAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAAGAAA +AAAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAA +BQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAEAAAAAAAAADgAAAFAAAAAG +AAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAA +AAAA0HJAAAAAAAAAiUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAIBWQAAAAAAAUH5AAAAAAABA +b0AAAAAAAABOQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAA +AAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAJ4AAAACAAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAA +BQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAAN +AAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMA +AAAAAAAADgAAABABAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAA +AEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADd +AgAAAAEAAAABAAAAAAAAAAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAFAAQABwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAA +AA4AAABIBAAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAAOADAAAG +AAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1h +dGxhYnJvb3QAAAAAAABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hh +bmRsZQAOAAAAUAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAA +HwAAAC9BcHBsaWNhdGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAA +AAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACYAgAABgAAAAgAAAACAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAA +AHR5cGUAAAAAAAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhp +bl9maWxlX3BhdGgAAAAADgAAAGgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAMwAAAAEA +AAAAAAAAEAAAADMAAABzZiUxMUAoc3JjLGV2ZW50KXRleHRib3hfY2FsbGJhY2sob2JqZWN0LHNy +YyxldmVudCkAAAAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAA +AAAAABAAAAAJAAAAYW5vbnltb3VzAAAAAAAAAA4AAADAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAI +AAAAAQAAAIoAAAABAAAAAAAAABAAAACKAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJh +cnkvQXBwbGljYXRpb24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlv +bnMvVGFidWxhciBFeHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvaW5pdC5tAAAAAAAA +DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAA +AADdAgAAAAEAAAABAAAAnwAAAAQAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAAA +AAAAAAAAAQAAAAAAAAAQAAAAAAAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATkAOAAAA +UAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgA +AAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAoAAAAAYAAAAOAAAAUAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/ +AAAAAADQckAAAAAAAACJQAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAB +AAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAgFZAAAAAAABQfkAAAAAA +AEBvQAAAAAAAAE5ADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAA +AAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAoQAAAAIAAAAOAAAAOAAAAAYAAAAIAAAABAAAAAAA +AAAFAAAACAAAAAEAAAAGAAAAAQAAAAAAAAAQAAAABgAAAElucHV0cwAADgAAAFAAAAAGAAAACAAA +AAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAUQAAAAAAAUH5A +AAAAAAAAVEAAAAAAAABOQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAAB +AAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAEAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAA +AAAAiUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAUQAAAAAAAUH5AAAAAAAAAVEAAAAAAAABO +QA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAA +AAAA3QIAAAABAAAAAQAAAKMAAAACAAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAAB +AAAAAQAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUA +AAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAADgAA +AFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +JEAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAA +AAAAAN0CAAAAAQAAAAEAAACkAAAABgAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAO +AAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAA +AAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAA +AAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAA +AAAAAAkAAAAgAAAAAAAAAAAAFEAAAAAAAFB+QAAAAAAAAFRAAAAAAAAATkAOAAAASAAAAAYAAAAI +AAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEA +AAClAAAAAgAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +AAkAAAAIAAAAAAAAAAAAAEAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAQAAEAZgAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAAB +AAAAAAAAAAkAAAAgAAAAAAAAAACQekAAAAAAAFB+QAAAAAAAQG9AAAAAAAAATkAOAAAASAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAAGAAAAAAAAAAAAPA/AAAA +AAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAA +AAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAEAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAAAAAA +iUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +AAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAB +AAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAJB6QAAAAAAAUH5AAAAAAABAb0AAAAAAAABOQA4A +AABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA +3QIAAAABAAAAAQAAAKcAAAACAAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAI +AAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAADgAAABAB +AAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAA +AA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAA +AAAAAAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAF +AAQABwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYA +AAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABIBAAABgAA +AAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAAOADAAAGAAAACAAAAAIAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1hdGxhYnJvb3QAAAAA +AABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hhbmRsZQAOAAAAUAAA +AAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAAHwAAAC9BcHBsaWNh +dGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAB +AAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACYAgAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUAAAAAAAAA +AAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxlX3BhdGgA +AAAADgAAAGgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAMwAAAAEAAAAAAAAAEAAAADMA +AABzZiUxMEAoc3JjLGV2ZW50KXRleHRib3hfY2FsbGJhY2sob2JqZWN0LHNyYyxldmVudCkAAAAA +AA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAAAAAJAAAA +YW5vbnltb3VzAAAAAAAAAA4AAADAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAIoAAAAB +AAAAAAAAABAAAACKAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkvQXBwbGljYXRp +b24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMvVGFidWxhciBF +eHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvaW5pdC5tAAAAAAAADgAAAEgAAAAGAAAA +CAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAAB +AAAAqAAAAAQAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAA +AAAQAAAAAAAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAA +AAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATkAOAAAAUAAAAAYAAAAIAAAA +BgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAChADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEA +AAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAqQAAAAYAAAAOAAAAUAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAA +AACJQAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAkHpAAAAAAABQfkAAAAAAAEBvQAAAAAAAAE5A +DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAA +AADdAgAAAAEAAAABAAAAqgAAAAIAAAAOAAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEA +AAAPAAAAAQAAAAAAAAAQAAAADwAAAEV4cHJlc3Npb24gTmFtZQAOAAAAUAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAQHVAAAAAAABQfkAAAAAA +AABUQAAAAAAAAE5ADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAA +AAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAQAAAAAAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAAAACJ +QAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAA +CQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAQHVAAAAAAABQfkAAAAAAAABUQAAAAAAAAE5ADgAA +AEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADd +AgAAAAEAAAABAAAArAAAAAIAAAAOAAAAOAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgA +AAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAAUAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAB +AAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkQA4A +AABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA +3QIAAAABAAAAAQAAAK0AAAAGAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAA +BAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAAAAAAiUAAAAAAAMCCQA4AAAA4 +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA +HEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAA +AAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAA +CQAAACAAAAAAAAAAAEB1QAAAAAAAUH5AAAAAAAAAVEAAAAAAAABOQA4AAABIAAAABgAAAAgAAAAN +AAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAK4A +AAACAAAADgAAADgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAACAAAAAEAAAAAAAAAEAAA +AAgAAABTZXR0aW5ncw4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAA +AAAAAAkAAAAgAAAAAAAAAADAgkAAAAAAAFiBQAAAAAAAAFRAAAAAAAAAREAOAAAAEAEAAAYAAAAI +AAAAAQAAAAAAAAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAAAAAABAAA +AA4AAACQAAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAHAAAA +AQAAAAcAAABvYmplY3QAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAAB +AAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAgAAAAFAAAADgAAAEAEAAAGAAAACAAAAAEA +AAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAADAAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAABAAAAAQAAAAEAAAAAAAAABgAEAAAAAN0OAAAA2AMAAAYAAAAIAAAAAgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAEAAAAAEAAABAAAAAbWF0bGFicm9vdAAAAAAAAHNlcGFy +YXRvcgAAAAAAAABzZW50aW5lbAAAAAAAAAAAZnVuY3Rpb25faGFuZGxlAA4AAABQAAAABgAAAAgA +AAAEAAAAAAAAAAUAAAAIAAAAAQAAAB8AAAABAAAAAAAAABAAAAAfAAAAL0FwcGxpY2F0aW9ucy9N +QVRMQUJfUjIwMjFiLmFwcAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAQAAEALwAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAABAAAQBAAAAADgAAAJACAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEA +AAAAAAAABQAEABEAAAABAAAAVQAAAGZ1bmN0aW9uAAAAAAAAAAAAdHlwZQAAAAAAAAAAAAAAAABm +aWxlAAAAAAAAAAAAAAAAAHdvcmtzcGFjZQAAAAAAAAAAd2l0aGluX2ZpbGVfcGF0aAAAAAAOAAAA +YAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAvAAAAAQAAAAAAAAAQAAAALwAAAHNmJTlA +KHNyYyxldmVudClzZXR0aW5nc19jYWxsKG9iamVjdCxzcmMsZXZlbnQpAA4AAABAAAAABgAAAAgA +AAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAAAAAJAAAAYW5vbnltb3VzAAAAAAAA +AA4AAADAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAIoAAAABAAAAAAAAABAAAACKAAAA +L1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9NYXRo +V29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMvVGFidWxhciBFeHByZXNzaW9uIFRvb2xi +b3gvVGFibGVUb29sL0BHVUkvaW5pdC5tAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAsAAAAAQAAAAOAAAA +MAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAQAAAAAAAAAA4AAABI +AAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIA +AAAAAAAAAAAAAAEAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAA +AAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAAAAAAiUAAAAAAAMCCQA4AAAA4AAAA +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAHEAO +AAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAA +AAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAA +ACAAAAAAAAAAAMCCQAAAAAAAWIFAAAAAAAAAVEAAAAAAAABEQA4AAABIAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAALEAAAAC +AAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAEA +AAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAABAAAAAAAA +AAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAABEQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkA +AAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEAOAAAASAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAACyAAAA +BgAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAg +AAAAAAAAAAAA8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAA +AAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAA +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 +AAAAAAAA8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAYgEAAAAAA +AFiBQAAAAAAAAFRAAAAAAAAAREAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAAB +AAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAC2AAAAAgAAAA4AAAA4AAAABgAAAAgA +AAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAASAAA +AAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAA +AAAAAAAAAAADAAAAAAAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAAB +AAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAREAOAAAAUAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAACRADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAA +AQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAtwAAAAYAAAAOAAAAUAAAAAYAAAAI +AAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQ +ckAAAAAAAACJQAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAA +AAEAAAAAAAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAGIBAAAAAAABYgUAAAAAAAABUQAAA +AAAAAERADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAA +ABgAAAAAAADdAgAAAAEAAAABAAAAuAAAAAIAAAAOAAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAA +CAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAACQAAAFR5cGVjaGVjawAAAAAAAAAOAAAAUAAAAAYAAAAI +AAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAA4HpAAAAAAABY +gUAAAAAAAABUQAAAAAAAAERADgAAABABAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAA +AAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAA +BgAAABgAAAAAAADdAgAAAAEAAAABAAAAAAAAAAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYA +AAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAA +AAEAAAAIAAAABQAAAA4AAABABAAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAA +AAAAAA4AAAAwAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAA +AADdDgAAANgDAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAA +AAABAAAAQAAAAG1hdGxhYnJvb3QAAAAAAABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAA +AGZ1bmN0aW9uX2hhbmRsZQAOAAAAUAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAA +AQAAAAAAAAAQAAAAHwAAAC9BcHBsaWNhdGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAG +AAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYA +AAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACQAgAABgAA +AAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5j +dGlvbgAAAAAAAAAAAHR5cGUAAAAAAAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UA +AAAAAAAAAHdpdGhpbl9maWxlX3BhdGgAAAAADgAAAGAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgA +AAABAAAAMAAAAAEAAAAAAAAAEAAAADAAAABzZiU3QChzcmMsZXZlbnQpdHlwZWNoZWNrX2NhbGwo +b2JqZWN0LHNyYyxldmVudCkOAAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAA +AQAAAAAAAAAQAAAACQAAAGFub255bW91cwAAAAAAAAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAF +AAAACAAAAAEAAACKAAAAAQAAAAAAAAAQAAAAigAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9M +aWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvTWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxl +Y3Rpb25zL1RhYnVsYXIgRXhwcmVzc2lvbiBUb29sYm94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAA +AAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAY +AAAAAAAA3QIAAAABAAAAAQAAALoAAAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgA +AAAAAAAAAAAAAAEAAAAAAAAAEAAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAABAAAAAAAAAA4AAABQAAAA +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8A +AAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAADgekAAAAAAAFiBQAAAAAAA +AFRAAAAAAAAAREAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAA +AAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAC7AAAAAgAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAA +DQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAAD +AAAAAAAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkA +AAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAREAOAAAAUAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAACRADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAA +AAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAvAAAAAYAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAAAACJ +QAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAA +CQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAA4HpAAAAAAABYgUAAAAAAAABUQAAAAAAAAERADgAA +AEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADd +AgAAAAEAAAABAAAAvQAAAAIAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAABADgAAADgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgA +AAABAAAABgAAAAEAAAAAAAAAEAAAAAYAAABTeW50YXgAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAACQdUAAAAAAAFiBQAAAAAAAAFRA +AAAAAAAAREAOAAAAEAEAAAYAAAAIAAAAAQAAAAAAAAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAAAAAAAABAAAAA4AAACQAAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAUABAAHAAAAAQAAAAcAAABvYmplY3QAAA4AAABIAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAgAAAAF +AAAADgAAAEAEAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAADAA +AAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABgAEAAAAAN0OAAAA2AMA +AAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAEAAAAAEAAABAAAAA +bWF0bGFicm9vdAAAAAAAAHNlcGFyYXRvcgAAAAAAAABzZW50aW5lbAAAAAAAAAAAZnVuY3Rpb25f +aGFuZGxlAA4AAABQAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAB8AAAABAAAAAAAAABAA +AAAfAAAAL0FwcGxpY2F0aW9ucy9NQVRMQUJfUjIwMjFiLmFwcAAOAAAAMAAAAAYAAAAIAAAABAAA +AAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEALwAAAA4AAAAwAAAABgAAAAgAAAAEAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQBAAAAADgAAAJACAAAGAAAACAAAAAIAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABEAAAABAAAAVQAAAGZ1bmN0aW9uAAAAAAAA +AAAAdHlwZQAAAAAAAAAAAAAAAABmaWxlAAAAAAAAAAAAAAAAAHdvcmtzcGFjZQAAAAAAAAAAd2l0 +aGluX2ZpbGVfcGF0aAAAAAAOAAAAYAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAsAAAA +AQAAAAAAAAAQAAAALAAAAHNmJTZAKHNyYyxldmVudCljaGVja19jYWxsKG9iamVjdCxzcmMsZXZl +bnQpAAAAAA4AAABAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAA +AAAJAAAAYW5vbnltb3VzAAAAAAAAAA4AAADAAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAA +AIoAAAABAAAAAAAAABAAAACKAAAAL1VzZXJzL3Blc2FyYWFtYXJhc2VrZXJhL0xpYnJhcnkvQXBw +bGljYXRpb24gU3VwcG9ydC9NYXRoV29ya3MvTUFUTEFCIEFkZC1PbnMvQ29sbGVjdGlvbnMvVGFi +dWxhciBFeHByZXNzaW9uIFRvb2xib3gvVGFibGVUb29sL0BHVUkvaW5pdC5tAAAAAAAADgAAAEgA +AAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAA +AAEAAAABAAAAvwAAAAQAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAAAAAAAAAAA +AQAAAAAAAAAQAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABQAAAAEAAAAB +AAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAEAAAAAAAAADgAAAFAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAA +AAAAiUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAJB1QAAAAAAAWIFAAAAAAAAAVEAAAAAAAABE +QA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAA +AAAA3QIAAAABAAAAAQAAAMAAAAACAAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAAB +AAAAAQAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUA +AAAIAAAABQAAAAEAAAABAAAAAAAAAAYAAAAUAAAAAAAA3QIAAAAAAAAAAAAAAAMAAAAAAAAADgAA +AFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +JEAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAA +AAAAAN0CAAAAAQAAAAEAAADBAAAABgAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAO +AAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAA +AAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAA +AAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAA +AAAAAAkAAAAgAAAAAAAAAACQdUAAAAAAAFiBQAAAAAAAAFRAAAAAAAAAREAOAAAASAAAAAYAAAAI +AAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEA +AADCAAAAAgAAAA4AAAA4AAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAgAAAABAAAAAAAA +ABAAAAAIAAAAU2F2ZSBFeHQOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAA +AQAAAAAAAAAJAAAAIAAAAAAAAAAAQHBAAAAAAABYgUAAAAAAAABUQAAAAAAAAERADgAAABABAAAG +AAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0A +AAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAAAAA +AAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQA +BwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAAB +AAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABABAAABgAAAAgA +AAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAANgDAAAGAAAACAAAAAIAAAAAAAAA +BQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1hdGxhYnJvb3QAAAAAAABz +ZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hhbmRsZQAOAAAAUAAAAAYA +AAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAAHwAAAC9BcHBsaWNhdGlv +bnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAQAAEAQAAAAA4AAACQAgAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUAAAAAAAAAAAAA +AAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxlX3BhdGgAAAAA +DgAAAGAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAALwAAAAEAAAAAAAAAEAAAAC8AAABz +ZiU1QChzcmMsZXZlbnQpc2F2ZV9leHRfY2FsbChvYmplY3Qsc3JjLGV2ZW50KQAOAAAAQAAAAAYA +AAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAACQAAAGFub255bW91cwAA +AAAAAAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAACKAAAAAQAAAAAAAAAQAAAA +igAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQv +TWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVsYXIgRXhwcmVzc2lvbiBU +b29sYm94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAMQAAAAEAAAA +DgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAAAAAAAO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAA +AN0CAAAAAAAAAAAAAAABAAAAAAAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +ABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgA +AAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAA +AAkAAAAgAAAAAAAAAABAcEAAAAAAAFiBQAAAAAAAAFRAAAAAAAAAREAOAAAASAAAAAYAAAAIAAAA +DQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAADF +AAAAAgAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUA +BAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAA +AAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAABQAAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAREAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAA +AAAJAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRADgAAAEgAAAAGAAAACAAA +AA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAA +xgAAAAYAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJ +AAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAAAACJQAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAA +UAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAA +QHBAAAAAAABYgUAAAAAAAABUQAAAAAAAAERADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgA +AAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAxwAAAAIAAAAOAAAAOAAA +AAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAFAAAAAQAAAAAAAAAQAAAABQAAAENsb3NlAAAA +DgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAA +AAAAAOBlQAAAAAAAWIFAAAAAAAAAVEAAAAAAAABEQA4AAAAQAQAABgAAAAgAAAABAAAAAAAAAAUA +AAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAA +AAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAAAAAAEAAAADgAAAJAAAAAGAAAA +CAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAcAAAABAAAABwAAAG9iamVj +dAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgA +AAAAAADdAgAAAAEAAAABAAAACAAAAAUAAAAOAAAAQAQAAAYAAAAIAAAAAQAAAAAAAAAFAAAACAAA +AAIAAAABAAAAAQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAGAAQAAAAA3Q4AAADYAwAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAUABAAQAAAAAQAAAEAAAABtYXRsYWJyb290AAAAAAAAc2VwYXJhdG9yAAAAAAAAAHNl +bnRpbmVsAAAAAAAAAABmdW5jdGlvbl9oYW5kbGUADgAAAFAAAAAGAAAACAAAAAQAAAAAAAAABQAA +AAgAAAABAAAAHwAAAAEAAAAAAAAAEAAAAB8AAAAvQXBwbGljYXRpb25zL01BVExBQl9SMjAyMWIu +YXBwAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQAv +AAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAEAA +AAAOAAAAkAIAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAEQAA +AAEAAABVAAAAZnVuY3Rpb24AAAAAAAAAAAB0eXBlAAAAAAAAAAAAAAAAAGZpbGUAAAAAAAAAAAAA +AAAAd29ya3NwYWNlAAAAAAAAAAB3aXRoaW5fZmlsZV9wYXRoAAAAAA4AAABgAAAABgAAAAgAAAAE +AAAAAAAAAAUAAAAIAAAAAQAAACsAAAABAAAAAAAAABAAAAArAAAAc2YlNEAoc3JjLGV2ZW50KWNs +b3NlX2ZpZyhvYmplY3Qsc3JjLGV2ZW50KQAAAAAADgAAAEAAAAAGAAAACAAAAAQAAAAAAAAABQAA +AAgAAAABAAAACQAAAAEAAAAAAAAAEAAAAAkAAABhbm9ueW1vdXMAAAAAAAAADgAAAMAAAAAGAAAA +CAAAAAQAAAAAAAAABQAAAAgAAAABAAAAigAAAAEAAAAAAAAAEAAAAIoAAAAvVXNlcnMvcGVzYXJh +YW1hcmFzZWtlcmEvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0L01hdGhXb3Jrcy9NQVRMQUIg +QWRkLU9ucy9Db2xsZWN0aW9ucy9UYWJ1bGFyIEV4cHJlc3Npb24gVG9vbGJveC9UYWJsZVRvb2wv +QEdVSS9pbml0Lm0AAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +AQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAADJAAAABAAAAA4AAAAwAAAABgAAAAgAAAAE +AAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAABAAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0A +AAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADdAgAAAAAAAAAAAAAAAQAA +AAAAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAA +IAAAAAAAAAAAAPC/AAAAAADQckAAAAAAAACJQAAAAAAAwIJADgAAADgAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAcQA4AAAA4AAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAALkAOAAAAUAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAA4GVA +AAAAAABYgUAAAAAAAABUQAAAAAAAAERADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAG +AAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAygAAAAIAAAAOAAAAOAAAAAYA +AAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAA +AEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAFAAAAAQAAAAEAAAAAAAAABgAAABQAAAAAAADd +AgAAAAAAAAAAAAAAAwAAAAAAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAE +AAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAERADgAAAFAA +AAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAA +BgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAMsAAAAGAAAADgAAAFAAAAAG +AAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAA +AAAA0HJAAAAAAAAAiUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAOBlQAAAAAAAWIFAAAAAAAAA +VEAAAAAAAABEQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAA +AAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAMwAAAACAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAA +BQAAAAgAAAABAAAABAAAAAEAAAAAAAAAEAAEAFNhdmUOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAgFZAAAAAAABYgUAAAAAAAABUQAAA +AAAAAERADgAAABABAAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAA +AEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADd +AgAAAAEAAAABAAAAAAAAAAQAAAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAFAAQABwAAAAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAA +AA4AAABABAAABgAAAAgAAAABAAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAANgDAAAG +AAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1h +dGxhYnJvb3QAAAAAAABzZXBhcmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hh +bmRsZQAOAAAAUAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAA +HwAAAC9BcHBsaWNhdGlvbnMvTUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAA +AAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAQAAAAA4AAACQAgAABgAAAAgAAAACAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAA +AHR5cGUAAAAAAAAAAAAAAAAAZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhp +bl9maWxlX3BhdGgAAAAADgAAAGAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAKwAAAAEA +AAAAAAAAEAAAACsAAABzZiUzQChzcmMsZXZlbnQpc2F2ZV9jYWxsKG9iamVjdCxzcmMsZXZlbnQp +AAAAAAAOAAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAA +CQAAAGFub255bW91cwAAAAAAAAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAACK +AAAAAQAAAAAAAAAQAAAAigAAAC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxp +Y2F0aW9uIFN1cHBvcnQvTWF0aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVs +YXIgRXhwcmVzc2lvbiBUb29sYm94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAAAAAAAA4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAAB +AAAAAQAAAM4AAAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEA +AAAAAAAAEAAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAA +AAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAABAAAAAAAAAA4AAABQAAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAAANByQAAAAAAA +AIlAAAAAAADAgkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAA +AAAJAAAACAAAAAAAAAAAABxADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAA +AAEAAAAAAAAACQAAAAgAAAAAAAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAACAVkAAAAAAAFiBQAAAAAAAAFRAAAAAAAAAREAO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAADPAAAAAgAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAA +CAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAABQ +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAREAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRA +DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAA +AADdAgAAAAEAAAABAAAA0AAAAAYAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAAEAAAAAQAAAAAAAAAJAAAAIAAAAAAAAAAAAPC/AAAAAADQckAAAAAAAACJQAAAAAAAwIJADgAA +ADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAA +AAAcQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAI +AAAAAAAAAAAALkAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAA +AAAJAAAAIAAAAAAAAAAAgFZAAAAAAABYgUAAAAAAAABUQAAAAAAAAERADgAAAEgAAAAGAAAACAAA +AA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAA +0QAAAAIAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAQ +AAQARWRpdA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkA +AAAIAAAAAAAAAAAA8D8OAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAA +AAAAAAAJAAAAIAAAAAAAAAAAABRAAAAAAABYgUAAAAAAAABUQAAAAAAAAERADgAAABABAAAGAAAA +CAAAAAEAAAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAA +AAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAAAAAAAQA +AAAOAAAAkAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABwAA +AAEAAAAHAAAAb2JqZWN0AAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +AQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAABQAAAA4AAABABAAABgAAAAgAAAAB +AAAAAAAAAAUAAAAIAAAAAgAAAAEAAAABAAAAAAAAAA4AAAAwAAAABgAAAAgAAAANAAAAAAAAAAUA +AAAIAAAAAQAAAAEAAAABAAAAAAAAAAYABAAAAADdDgAAANgDAAAGAAAACAAAAAIAAAAAAAAABQAA +AAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAAAAABAAAAQAAAAG1hdGxhYnJvb3QAAAAAAABzZXBh +cmF0b3IAAAAAAAAAc2VudGluZWwAAAAAAAAAAGZ1bmN0aW9uX2hhbmRsZQAOAAAAUAAAAAYAAAAI +AAAABAAAAAAAAAAFAAAACAAAAAEAAAAfAAAAAQAAAAAAAAAQAAAAHwAAAC9BcHBsaWNhdGlvbnMv +TUFUTEFCX1IyMDIxYi5hcHAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAQAA +AAEAAAAAAAAAEAABAC8AAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAQAAEAQAAAAA4AAACQAgAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAUABAARAAAAAQAAAFUAAABmdW5jdGlvbgAAAAAAAAAAAHR5cGUAAAAAAAAAAAAAAAAA +ZmlsZQAAAAAAAAAAAAAAAAB3b3Jrc3BhY2UAAAAAAAAAAHdpdGhpbl9maWxlX3BhdGgAAAAADgAA +AGAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAALwAAAAEAAAAAAAAAEAAAAC8AAABzZiUy +QChzcmMsZXZlbnQpZWRpdF90b2dfY2FsbChvYmplY3Qsc3JjLGV2ZW50KQAOAAAAQAAAAAYAAAAI +AAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQAAAACQAAAGFub255bW91cwAAAAAA +AAAOAAAAwAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAACKAAAAAQAAAAAAAAAQAAAAigAA +AC9Vc2Vycy9wZXNhcmFhbWFyYXNla2VyYS9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvTWF0 +aFdvcmtzL01BVExBQiBBZGQtT25zL0NvbGxlY3Rpb25zL1RhYnVsYXIgRXhwcmVzc2lvbiBUb29s +Ym94L1RhYmxlVG9vbC9AR1VJL2luaXQubQAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUA +AAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAANMAAAAEAAAADgAA +ADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAAAAAAAOAAAA +SAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAAAAAGAAAAFAAAAAAAAN0C +AAAAAAAAAAAAAAABAAAAAAAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQA +AAABAAAAAAAAAAkAAAAgAAAAAAAAAAAA8L8AAAAAANByQAAAAAAAAIlAAAAAAADAgkAOAAAAOAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABxA +DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAA +AAAAAAAuQA4AAABQAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkA +AAAgAAAAAAAAAAAAFEAAAAAAAFiBQAAAAAAAAFRAAAAAAAAAREAOAAAASAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAADUAAAA +AgAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAB +AAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAUAAAABAAAAAQAAAAAA +AAAGAAAAFAAAAAAAAN0CAAAAAAAAAAAAAAADAAAAAAAAAA4AAABQAAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAQAAAAQAAAABAAAAAAAAAAkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +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 +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAAB +AAAAAQAAALQAAAAHAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEA +AAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAArwAAAAcAAAAOAAAASAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAACmAAAA +BwAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQBm +AAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAAEAADAHgs +eQAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAA +AAAAAN0CAAAAAQAAAAEAAACdAAAABwAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAgADdADgAAADgAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAECPQA4AAAA4AAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAWUAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +AAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgA +AAAAAADdAgAAAAEAAAABAAAA2QAAABAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAACrAAAABwAAAA4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAAB +AAAAAQAAAKIAAAAHAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEA +AAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAAQAAABEAAAAOAAAASAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAABAAAA +EQAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAY +AAAAAAAA3QIAAAABAAAAAQAAANoAAAASAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgA +AAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAAQAAABEAAAAOAAAASAAA +AAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAA +AQAAAAEAAADbAAAAEwAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAAQAAABEAAAAOAAAA +SAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0C +AAAAAQAAAAEAAADcAAAAFAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAA +BQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAiQAAAAsAAAAO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAACHAAAACwAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAA +AAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAH8AAAALAAAADgAAAEgAAAAGAAAA +CAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAAB +AAAAgQAAAAsAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAA +AAAJAAAACAAAAAAAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAA +AAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAA +BgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAN0AAAAVAAAADgAAAEgAAAAG +AAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEA +AAABAAAAkAAAAAsAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAA +AAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAACOAAAACwAAAA4AAAA4AAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAAEAEAAAYAAAAI +AAAAAQAAAAAAAAAFAAAACAAAAAIAAAABAAAAAQAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAAAAAABAAA +AA4AAACQAAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAHAAAA +AQAAAAcAAABvYmplY3QAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAAB +AAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAgAAAAFAAAADgAAAFAEAAAGAAAACAAAAAEA +AAAAAAAABQAAAAgAAAACAAAAAQAAAAEAAAAAAAAADgAAADAAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAABAAAAAQAAAAEAAAAAAAAABgAEAAAAAN0OAAAA6AMAAAYAAAAIAAAAAgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAEAAAAAEAAABAAAAAbWF0bGFicm9vdAAAAAAAAHNlcGFy +YXRvcgAAAAAAAABzZW50aW5lbAAAAAAAAAAAZnVuY3Rpb25faGFuZGxlAA4AAABQAAAABgAAAAgA +AAAEAAAAAAAAAAUAAAAIAAAAAQAAAB8AAAABAAAAAAAAABAAAAAfAAAAL0FwcGxpY2F0aW9ucy9N +QVRMQUJfUjIwMjFiLmFwcAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAQAAEALwAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAABAAAQBAAAAADgAAAKACAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEA +AAAAAAAABQAEABEAAAABAAAAVQAAAGZ1bmN0aW9uAAAAAAAAAAAAdHlwZQAAAAAAAAAAAAAAAABm +aWxlAAAAAAAAAAAAAAAAAHdvcmtzcGFjZQAAAAAAAAAAd2l0aGluX2ZpbGVfcGF0aAAAAAAOAAAA +aAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAyAAAAAQAAAAAAAAAQAAAAMgAAAHNmJTBA +KHNyYyxldmVudCl0ZXh0Ym94X2NhbGxiYWNrKG9iamVjdCxzcmMsZXZlbnQpAAAAAAAADgAAAEAA +AAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAACQAAAAEAAAAAAAAAEAAAAAkAAABhbm9ueW1v +dXMAAAAAAAAADgAAAMgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAlQAAAAEAAAAAAAAA +EAAAAJUAAAAvVXNlcnMvcGVzYXJhYW1hcmFzZWtlcmEvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBw +b3J0L01hdGhXb3Jrcy9NQVRMQUIgQWRkLU9ucy9Db2xsZWN0aW9ucy9UYWJ1bGFyIEV4cHJlc3Np +b24gVG9vbGJveC9UYWJsZVRvb2wvQEdVSS9jcmVhdGVfc3RkX3RleHQubQAAAA4AAABIAAAABgAA +AAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAA +AQAAAAcAAAAEAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAA +AAAAEAAAAAAAAAAOAAAAUAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAA +AAAJAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5ADgAAAFAAAAAGAAAACAAA +AAYAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAmQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAAB +AAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAN4AAAAGAAAADgAAAFAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAADwvwAAAAAA0HJAAAAA +AAAAiUAAAAAAAMCCQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAAAkAAAAIAAAAAAAAAAAAHEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAC5ADgAAAFAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAABAAAABAAAAAEAAAAAAAAACQAAACAAAAAAAAAAAEBwQAAAAAAAoHlAAAAAAAAAaUAAAAAAAABO +QA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAA +AAAA3QIAAAABAAAAAQAAAN8AAAACAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAG +AAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAABQAAAAcAAAAOAAAAMAAAAAYA +AAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAQAAQAeDw9MQ4AAAA4AAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAA +SAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0C +AAAAAQAAAAEAAAA1AAAACAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAEAAAACQAAAA4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAAB +AAAAAQAAAAoAAAAJAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEA +AAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAZAAAAAcAAAAOAAAAMAAAAAYAAAAIAAAABAAA +AAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAQAAMAeC15AA4AAABIAAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAAAkAAAAYAAAAAAAAAAAA8D8AAAAAAADwPwAAAAAA +APA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgA +AAAAAADdAgAAAAEAAAABAAAANgAAAAkAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAKAAAACQAAAA4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAAB +AAAAAQAAAF8AAAAHAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEA +AAAAAAAAEAADAHgreQAOAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAA +AAAAAAAJAAAAGAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAQAAAAJ +AAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgA +AAAAAADdAgAAAAEAAAABAAAAFQAAAAkAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAABaAAAABwAAAA4AAAAwAAAA +BgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAABAAAwB4KnkADgAAAEgAAAAG +AAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAACQAAABgAAAAAAAAAAADwPwAA +AAAAAPA/AAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAA +AAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAA2AAAACQAAAA4AAABIAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAABUAAAAJ +AAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgA +AAAAAADdAgAAAAEAAAABAAAAVQAAAAcAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAQAAEAeAAAAA4AAABIAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAMAAAABAAAAAAAAAAkAAAAYAAAAAAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/DgAAAEgAAAAG +AAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEA +AAABAAAABAAAAAkAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAA +AAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAgAAAACQAAAA4AAABIAAAABgAAAAgAAAANAAAA +AAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAFAAAAAH +AAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAAEAADAHgv +eQAOAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAAGAAA +AAAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAA +BgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAADYAAAAJAAAADgAAAEgAAAAG +AAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEA +AAABAAAAIAAAAAkAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAA +AAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAABLAAAABwAAAA4AAAAwAAAABgAAAAgAAAAEAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAABAAAQB5AAAADgAAAEgAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAACQAAABgAAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAA +8D8OAAAAYAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAsAAAABAAAAAQAAAAAAAAAGAAAALAAA +AAAAAN0CAAAAAQAAAAYAAAADAAAA4AAAAOEAAADiAAAA4wAAAOQAAAAWAAAAAAAAAA4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAAB +AAAAAQAAADUAAAAIAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEA +AAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACQAAAAgAAAAOAAAASAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAACAAAA +CgAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAY +AAAAAAAA3QIAAAABAAAAAQAAADUAAAAIAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgA +AAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACQAAAAgAAAAOAAAAMAAA +AAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAQAAEAZgAAAA4AAAAwAAAA +BgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAABAAAwB4LHkADgAAAJgBAAAG +AAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAcAAAABAAAAIwAAAHNl +dAAAAABpbnB1dHMAY291bnQAAHJhbmdlAABleGNlcHQAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAADAAAAAGAAAA +CAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAOAAAAAYAAAAI +AAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAQI9ADgAAADgA +AAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAABZ +QA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAA +AAAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJ +AAAACAAAAAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEA +AAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAA +AAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAEYAAAAPAAAADgAAADgAAAAGAAAA +CAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAAA4AAACQ +AAAABgAAAAgAAAAMAAAAAAAAAAUAAAAIAAAAFwAAAAEAAAABAAAAAAAAAAUAAABcAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAPguAAAGAAAACAAAAAEAAAAAAAAA +BQAAAAgAAAAXAAAAAQAAAAEAAAAAAAAADgAAADgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAAB +AAAAAAAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAAAAUA +AAAIAAAAAQAAAAAAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAAOAAAAAYAAAAIAAAAAgAA +AAAAAAAFAAAACAAAAAEAAAAAAAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAAADgAAAAGAAAA +CAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAAAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAAA4 +AAAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAAAAAABAAAAAAAAAAUABAABAAAAAQAAAAAA +AAAOAAAAYBIAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQAGQAA +AAEAAAB4BQAAR3JpZDIAAAAAAAAAAAAAAAAAAAAAAAAAAEdyaWQxAAAAAAAAAAAAAAAAAAAAAAAA +AABHcmlkMAAAAAAAAAAAAAAAAAAAAAAAAAAAbWFpbl9maWcAAAAAAAAAAAAAAAAAAAAAAGZyYW1l +AAAAAAAAAAAAAAAAAAAAAAAAAABmaWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2Nyb2xsX3YAAAAA +AAAAAAAAAAAAAAAAAGVkaXRfdG9nAAAAAAAAAAAAAAAAAAAAAABzYXZlX3BiAAAAAAAAAAAAAAAA +AAAAAAAAcHZzX3BiAAAAAAAAAAAAAAAAAAAAAAAAAGNsb3NlX3BiAAAAAAAAAAAAAAAAAAAAAABz +YXZlX2V4dF9wYgAAAAAAAAAAAAAAAAAAY2hlY2tfcGIAAAAAAAAAAAAAAAAAAAAAAGlucHV0X3Bi +AAAAAAAAAAAAAAAAAAAAAABzZXR0aW5nc19wYgAAAAAAAAAAAAAAAAAAZnVuY3Rpb25fbmFtZV9j +b250cm9sAAAAAGZ1bmN0aW9uX25hbWVfdGV4dAAAAAAAAABmdW5jdGlvbl9pbnB1dHNfdGV4dAAA +AAAAZnVuY3Rpb25faW5wdXRzX2NvbnRyb2wAAGVkaXQAAAAAAAAAAAAAAAAAAAAAAAAAAABpbml0 +aWFsaXplZAAAAAAAAAAAAAAAAAAAYmxvY2tfaGFuZGxlAAAAAAAAAAAAAAAAAHNldHRpbmdzAAAA +AAAAAAAAAAAAAAAAAABoZWFkZXJfaGVpZ2h0AAAAAAAAAAAAAAAAZmlnX2hlaWdodAAAAAAAAAAA +AAAAAAAAAGZpZ193aWR0aAAAAAAAAAAAAAAAAAAAAABwYl9vZmZzZXQAAAAAAAAAAAAAAAAAAAAA +cGJfd2lkdGgAAAAAAAAAAAAAAAAAAAAAAHBiX2hlaWdodAAAAAAAAAAAAAAAAAAAAABodHhfaGVp +Z2h0AAAAAAAAAAAAAAAAAAAAdGV4dF93aWR0aAAAAAAAAAAAAAAAAAAAAG5hbWVfbGFiZWwAAAAA +AAAAAAAAAAAAAABpbnB1dF9sYWJlbAAAAAAAAAAAAAAAAAAARGF0YQAAAAAAAAAAAAAAAAAAAAAA +AAAAAFBWUwAAAAAAAAAAAAAAAAAAAAAAAAAAAABDVkMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHZz +X2NoZWNrZWQAAAAAAAAAAAAAAAAAAG1vZGUAAAAAAAAAAAAAAAAAAAAAAAAAAABFTUxHZW4AAAAA +AAAAAAAAAAAAAAAAAAAAVGFibGVCbGsAAAAAAAAAAAAAAAAAAAAAAHNhdmVkAAAAAAAAAAAAAAAA +AAAAAAAAAAB2YWxpZGF0aW9uX3JlcG9ydF9oYW5kbGUAbXVsdGlfdHlwZQAAAAAAAAAAAAAAAAAA +AG11bHRpX21vZGUAAAAAAAAAAAAAAAAAAABtdWx0aV9ncnAAAAAAAAAAAAAAAAAAAAAAbXVsdGlf +b3B0X3JlZwAAAAAAAAAAAAAAAG11bHRpX29wdF9vdXQAAAAAAAAAAAAAAABwcm92ZXJfb3B0X3B2 +cwAAAAAAAAAAAAAAcHJvdmVyX29wdF9jdmMAAAAAAAAAAAAAAHZlcnNpb24AAAAAAAAAAAAAAAAA +AAAAAAB1bmRvX21hbgAAAAAAAAAAAAAAAAAAAAAAdW5kb19vcHQAAAAAAAAAAAAAAAAAAAAAAHJl +ZG9fb3B0AAAAAAAAAAAAAAAAAAAAAABkZWZhdWx0X3Byb3ZlcgAAAAAAAAAAAAAAUFZTX2NvbnN0 +AAAAAAAAAAAAAAAAAAAAAENWQ19jb25zdAAAAAAAAAAAAAAAAAAAAAAOAAAAMAAAAAYAAAAIAAAA +BgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAG +AAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAA +AAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAA +AAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAXkAOAAAAOAAAAAYAAAAIAAAA +BgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAwIJADgAAADgAAAAG +AAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAACJQA4A +AAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAA +AAAAFEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAA +CAAAAAAAAAAAAFRADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAACQAAAAgAAAAAAAAAAABEQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAkAAAAIAAAAAAAAAAAATkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAQG9ADgAAADAAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAA +AAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAA +AAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAA +AAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEA +AAAFAAAAAQAAAAAAAAAQAAAABQAAADAuNy40AAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAQA4AAAA4AAAABgAAAAgAAAAC +AAAAAAAAAAUAAAAIAAAAAQAAAAAAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAAOAAAAAYA +AAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAAAAAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAA +AMgCAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAA8AAAABAAAA +hwAAAHBhcmVudF9jZWxsAAAAAHBhcmVudF9ncmlkAAAAAGNlbGxzAAAAAAAAAAAAAHNwbGl0X3Bi +AAAAAAAAAG51bV9jZWxscwAAAAAAAGdyaWRfaW5kZXgAAAAAAHJHcmlkAAAAAAAAAAAAAG5ld19j +ZWxsX3BiAAAAAGRlbGV0ZV9jZWxsX3BiAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAA +AAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAA +AAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAAGgFAAAGAAAACAAAAAIAAAAAAAAA +BQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABYAAAABAAAAYAEAAHN1YmdyaWQAAAAAAAAAAAAA +AAAAAABjb25kAAAAAAAAAAAAAAAAAAAAAAAAY29uZF90ZXh0AAAAAAAAAAAAAAAAAGNlbGxfaW5k +ZXgAAAAAAAAAAAAAAABwYXJlbnRfZ3JpZAAAAAAAAAAAAAAAd2lkdGgAAAAAAAAAAAAAAAAAAAAA +AGhlaWdodAAAAAAAAAAAAAAAAAAAAABncmlkX3BiAAAAAAAAAAAAAAAAAAAAcGJfZmxhZwAAAAAA +AAAAAAAAAAAAAGNvbG9yAAAAAAAAAAAAAAAAAAAAAABjb25kaXRpb25fdGV4dF93aWR0aAAAY29u +ZGl0aW9uX3RleHRfaGVpZ2h0AGNvbmRpdGlvbl90ZXh0X3gAAAAAAABjb25kaXRpb25fdGV4dF95 +AAAAAAAAY29uZGl0aW9uX3RleHRfb2Zmc2V0AGdyaWRfcHVzaF93aWR0aAAAAAAAAAAOAAAAMAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAA +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAG +AAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAOAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAADgAA +ADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +AAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgA +AAAAAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAA +AAkAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAA +CQAAAAgAAAAAAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAAB +AAAAAAAAAAkAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEA +AAAAAAAACQAAAAgAAAAAAAAAAABpQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAATkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAACRADgAAADgAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAkQA4AAAA4AAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAANEAOAAAAOAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAD5A +DgAAAPgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAYAAAAB +AAAAEgAAAENlbGxzAEdyaWQxAEdyaWQyAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAA4AAAABgAAAAgAAAACAAAAAAAAAAUAAAAI +AAAAAQAAAAAAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAOAAAAOAAAAAYAAAAIAAAAAgAAAAAA +AAAFAAAACAAAAAEAAAAAAAAAAQAAAAAAAAAFAAQAAQAAAAEAAAAAAAAADgAAADgAAAAGAAAACAAA +AAIAAAAAAAAABQAAAAgAAAABAAAAAAAAAAEAAAAAAAAABQAEAAEAAAABAAAAAAAAAA4AAAA4AAAA +BgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAAAAAABAAAAAAAAAAUABAABAAAAAQAAAAAAAAAO +AAAAOAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAAAAAAAAQAAAAAAAAAFAAQAAQAAAAEA +AAAAAAAADgAAANAFAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAE +AA8AAAABAAAAHQEAAHB2c19pbmNsdWRlcwAAAGNvdW50ZXJfdHJpYWxzAGNvdW50ZXJfcmFuZ2UA +AGV4Y2VwdAAAAAAAAAAAAGZpZ193aWR0aAAAAAAAAGZpZ19oZWlnaHQAAAAAAG9wZW4AAAAAAAAA +AAAAAGZpZwAAAAAAAAAAAAAAAGJ1dHRvbl93aWR0aAAAAGJ1dHRvbl9oZWlnaHQAAGJ1dHRvbl9v +ZmZzZXQAAHRpdGxlX2hlaWdodAAAAGxhYmVsX2hlaWdodAAAAGxhYmVsX3dpZHRoAAAAAHRleHRf +b2Zmc2V0AAAAAGluY2x1ZGVfdGV4dAAAAGNvdW50X3RleHQAAAAAAHJhbmdlX3RleHQAAAAAAGV4 +Y2VwdF9jaGVjawAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAAB +AAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEA +AAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAA +AAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAA +AAAAAAkAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAACQAAAAgAAAAAAAAAAAB5QA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAkAAAAIAAAAAAAAAADAckAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAE5ADgAAADgAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAA+QA4AAAA4AAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAJEAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +AD5ADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgA +AAAAAAAAAAA+QA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +AAkAAAAIAAAAAAAAAADAUkAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAJAAAACAAAAAAAAAAAACRADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAA +AAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAA +AAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAA +AAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAA +AAAAAAEAAAAAAAAACQAAAAAAAAAOAAAACAMAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAFAAQAEAAAAAEAAACgAAAAR3JpZDAAAAAAAAAAAAAAAEdyaWQxAAAAAAAAAAAA +AABHcmlkMgAAAAAAAAAAAAAAZnVuY3Rpb25fbmFtZQAAAGZ1bmN0aW9uX2lucHV0cwBzZXR0aW5n +cwAAAAAAAAAAY2hlY2tlZAAAAAAAAAAAAG9wZW4AAAAAAAAAAAAAAABmaWcAAAAAAAAAAAAAAAAA +bXVsdGlfbW9kZQAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAAB +AAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEA +AAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAA +AAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAA +AAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAA +AAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAA +AAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAA +AAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAA +CQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJ +AAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkA +AAAAAAAADgAAAGgCAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAE +AA0AAAABAAAAaAAAAGRlZmF1bHRfdHlwZQBwdnNfdmVyc2lvbgAAb3V0cHV0X3R5cGUAAGlucHV0 +X3R5cGUAAABkYXRhAAAAAAAAAAAAbW9kZQAAAAAAAAAAAG11bHRpX21vZGUAAAB0eXBlX21vZGUA +AAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAAEAAEAHJl +YWwOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAA +AA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAA +DgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAO +AAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4A +AAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAA +ADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAA +AADwPw4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAA +AAAADgAAALgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAgA +AAABAAAAEAAAAGNvbW1hbmQAZGF0YQAAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAA +AAEAAAAEAAAAAQAAAAAAAAAQAAQAY3ZjMw4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAABABAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAAB +AAAAAQAAAAEAAAAAAAAABQAEAA0AAAABAAAAJwAAAGRhdGEAAAAAAAAAAABkYXRhdHlwZQAAAAAA +bXVsdGlfb3V0cHV0AAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAA +AAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAA +AAAAAAkAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAACQAAAAgAAAAAAAAAAADwPw4AAABYAQAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAUABAAOAAAAAQAAADgAAABxdWV1ZQAAAAAAAAAAAG1heF9kZXB0aAAAAAAAY3Vy +cmVudF9kZXB0aAB1bmRvX2xldmVsAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAB +AAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAABJQA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAkAEAAAYAAAAIAAAAAgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAFAAQADAAAAAEAAAA8AAAAQ2VsbDEAAAAAAAAAQ2VsbDIAAAAA +AAAAcmVzdWx0AAAAAAAAcmVzdWx0X3RleHQAY29sb3IAAAAAAAAAAAAAAA4AAAAwAAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAA +AAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAA +BgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAG +AAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAiAAAAAYAAAAIAAAACQAA +AAAAAAAFAAAACAAAAAEAAABYAAAAAQAAAAAAAAACAAAAWAAAAAABSU0AAAAADgAAAEgAAAAGAAAA +CAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAUAAAABAAAABQAAAE1DT1MA +AAAADgAAAAAAAAA +__MWOPC_PART_BEGIN__ /simulink/blockdiagram.xml + + + +

932f3cac-c6e8-4ef0-91e5-d14c0e1a6678

+

maci64

+ +

%<Auto>

+

%<Auto>

+

574183990

+

%<AutoIncrement:24.0>

+
+ +

none

+
+ +

normal

+ +

$bdroot

+ + $bdroot + + + + +
+
+ +

warning

+
+ + +

Ensure deterministic transfer (maximum delay)

+

Ensure data integrity only

+

Ensure deterministic transfer (minimum delay)

+

None

+
+
+ +
+
+ +__MWOPC_PART_BEGIN__ /simulink/configSet0.xml + + + +

[]

+

+ + +

[]

+

+

[]

+

0.0

+

10.0

+

auto

+

on

+

auto

+

auto

+

5

+

auto

+

10*128*eps

+

1000

+

4

+

1

+

auto

+

auto

+

1

+

1e-3

+

on

+

off

+

off

+

ode45

+

auto

+

auto

+

DisableAll

+

UseLocalSettings

+

Nonadaptive

+

TrustRegion

+

off

+

off

+

Fast

+

off

+

off

+

Unconstrained

+

Whenever possible

+

[]

+

off

+

off

+

ode3

+
+ +

[]

+

+

[]

+

1

+

[t, u]

+

xFinal

+

xInitial

+

on

+

1000

+

off

+

off

+

off

+

off

+

Array

+

ModelDataLogs

+

on

+

off

+

on

+

on

+

off

+

on

+

off

+

streamout

+

on

+

off

+

xout

+

tout

+

yout

+

logsout

+

dsmout

+

RefineOutputTimes

+

[]

+

out

+

1

+

off

+

timeseries

+

out.mat

+

[-inf, inf]

+
+ + + BooleansAsBitfields + PassReuseOutputArgsAs + PassReuseOutputArgsThreshold + ZeroExternalMemoryAtStartup + ZeroInternalMemoryAtStartup + OptimizeModelRefInitCode + NoFixptDivByZeroProtection + UseSpecifiedMinMax + EfficientTunableParamExpr + +

+

[]

+

on

+

on

+

on

+

Tunable

+

off

+

off

+

off

+

off

+

double

+

off

+

off

+

on

+

on

+

off

+

off

+

on

+

off

+

+

on

+

off

+

uint_T

+

Same as modeled

+

on

+

64

+

Structure reference

+

12

+

2147483647

+

on

+

5

+

off

+

off

+

Native Integer

+

on

+

on

+

off

+

off

+

off

+

on

+

inf

+

Inherit from target

+

on

+

off

+

off

+

off

+

on

+

on

+

off

+

off

+

level2

+

Balanced

+

on

+

off

+

off

+

GradualUnderflow

+

off

+
+ + + UseOnlyExistingSharedCode + +

+

[]

+

error

+

none

+

none

+

none

+

error

+

none

+

UseLocalSettings

+

UseLocalSettings

+

UseLocalSettings

+

warning

+

warning

+

warning

+

warning

+

on

+

Classic

+

none

+

off

+

UseLocalSettings

+

warning

+

warning

+

none

+

error

+

warning

+

warning

+

warning

+

warning

+

error

+

error

+

error

+

none

+

warning

+

none

+

warning

+

none

+

warning

+

warning

+

error

+

error

+

none

+

warning

+

warning

+

none

+

none

+

none

+

none

+

none

+

none

+

warning

+

none

+

warning

+

warning

+

warning

+

error

+

none

+

error

+

none

+

warning

+

warning

+

UseLocalSettings

+

on

+

off

+

none

+

error

+

none

+

none

+

warning

+

warning

+

none

+

warning

+

error

+

warning

+

warning

+

error

+

none

+

warning

+

none

+

warning

+

ErrorLevel1

+

WarnAndRepair

+

none

+

warning

+

warning

+

error

+

error

+

none

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

error

+

warning

+

warning

+

none

+

warning

+

warning

+

all

+

warning

+

on

+

warning

+

warning

+

off

+

+

none

+

off

+

warning

+

none

+
+ +

[]

+

+

[]

+

8

+

16

+

32

+

32

+

64

+

32

+

64

+

32

+

32

+

32

+

Char

+

None

+

Undefined

+

Unspecified

+

32

+

on

+

off

+

32-bit Generic

+

8

+

16

+

32

+

32

+

64

+

32

+

64

+

32

+

32

+

32

+

Char

+

None

+

on

+

off

+

Undefined

+

Unspecified

+

32

+

32

+

32

+

Specified

+

off

+

on

+

on

+

on

+

EmbeddedCoderHSP

+
+ +

[]

+

+

[]

+

IfOutOfDateOrStructuralChange

+

on

+

error

+

off

+

on

+

None

+

Multi

+

Infer from blocks in model

+

+

on

+

off

+

off

+

off

+
+ +

[]

+

+

[]

+

+

+

+

+

[]

+

+

+

+

+

+

+

on

+

on

+

on

+

off

+

off

+

off

+

off

+

off

+

on

+

50

+

on

+

on

+

on

+

65536

+

off

+

[]

+

NotSpecified

+

UseInterfaceOnly

+

off

+

None

+

+

generic

+

C

+

off

+

200

+

1024

+

off

+

+

+

mkl-dnn

+

on

+
+ + + IncludeHyperlinkInReport + GenerateTraceInfo + GenerateTraceReport + GenerateTraceReportSl + GenerateTraceReportSf + GenerateTraceReportEml + PortableWordSizes + GenerateWebview + GenerateCodeMetricsReport + GenerateCodeReplacementReport + GenerateMissedCodeReplacementReport + GenerateErtSFunction + CreateSILPILBlock + CodeExecutionProfiling + CodeProfilingSaveOptions + CodeProfilingInstrumentation + CodeStackProfiling + +

+

grt.tlc

+

None

+

off

+

off

+

+

off

+

make_rtw

+

on

+

off

+

+

grt_default_tmf

+

+

off

+

on

+

off

+

[]

+

off

+

off

+

off

+

off

+

off

+

off

+

+

+

+

+

+

+

+

+

+

+

+

Automatically locate an installed toolchain

+

Faster Builds

+

[]

+

off

+

off

+

off

+

None

+

off

+

executionProfile

+

SummaryOnly

+

off

+

off

+

C

+

None

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

[]

+

+

Off

+

1024

+

+

-1

+

discrete

+

200

+

off

+

1024

+

on

+

on

+

on

+

off

+

3.5

+

+

+

0

+

none

+

on

+

19.05

+

unspecified

+ + + + IgnoreCustomStorageClasses + IgnoreTestpoints + InsertBlockDesc + InsertPolySpaceComments + SFDataObjDesc + MATLABFcnDesc + SimulinkDataObjDesc + DefineNamingRule + SignalNamingRule + ParamNamingRule + InlinedPrmAccess + CustomSymbolStr + CustomSymbolStrGlobalVar + CustomSymbolStrType + CustomSymbolStrField + CustomSymbolStrFcn + CustomSymbolStrFcnArg + CustomSymbolStrBlkIO + CustomSymbolStrTmpVar + CustomSymbolStrMacro + ReqsInCode + BlockCommentType + InternalIdentifier + CustomSymbolStrModelFcn + CustomSymbolStrUtil + CustomSymbolStrEmxType + CustomSymbolStrEmxFcn + CustomUserTokenString + +

+

[]

+

+

off

+

on

+

Auto

+

on

+

off

+

31

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

1

+

8

+

$R$N$M

+

$N$R$M_T

+

$N$M

+

$R$N$M$F

+

$R$N

+

rt$I$N$M

+

rtb_$N$M

+

$N$M

+

$R$N$M

+

$N$C

+

emxArray_$M$N

+

emx$M$N

+

+

+

None

+

+

None

+

+

None

+

+

off

+

off

+

on

+

BlockPathComment

+

on

+

off

+

off

+

+

Shortened

+

Literals

+

off

+

off

+

[]

+

error

+
+ + + GeneratePreprocessorConditionals + IncludeMdlTerminateFcn + RemoveResetFunc + SuppressErrorStatus + ERTCustomFileBanners + GenerateSampleERTMain + GenerateTestInterfaces + ModelStepFunctionPrototypeControlCompliant + CPPClassGenCompliant + PortableWordSizes + PurelyIntegerCode + SupportComplex + SupportAbsoluteTime + SupportContinuousTime + SupportNonInlinedSFcns + PreserveStateflowLocalDataDimensions + GenerateAllocFcn + ExistingSharedCode + ParenthesesLevel + ERTMultiwordTypeDef + MultiwordTypeDef + RemoveDisableFunc + +

+

[]

+

ansi_tfl_table_tmw.mat

+

+

+

NOT IN USE

+

C89/C90 (ANSI)

+

None

+

Auto

+

System defined

+

2048

+

256

+

on

+

off

+

+

off

+

off

+

on

+

on

+

on

+

on

+

on

+

off

+

off

+

off

+

off

+

Auto

+

off

+

on

+

rt_

+

on

+

Nonreusable function

+

off

+

on

+

on

+

on

+

on

+

off

+

off

+

off

+

Nominal

+

Nominal

+

Simulink.SoftwareTarget.GRTCustomization

+

off

+

on

+

off

+

off

+

on

+

off

+

on

+

on

+

[]

+

[]

+

1,2,3,4,...

+

Size,Breakpoints,Table

+

Size,Breakpoints,Table

+

Column-major

+

error

+

$R$E

+

$R$E

+

$R_data

+ + None + +

off

+

off

+

off

+

off

+

1000000

+

0

+

ext_comm

+

+

Level1

+

off

+

off

+

off

+

off

+

off

+

Error

+
+
+
+ +

[]

+

Simulink Coverage Configuration Component

+

[]

+

Simulink Coverage

+

off

+

EntireSystem

+

on

+

off

+

/

+

covdata

+

+

dw

+

+

+

off

+

on

+

on

+

on

+

on

+

covCumulativeData

+

off

+

on

+

slcov_output/$ModelName$

+

$ModelName$_cvdata

+

on

+

off

+

+

off

+

on

+

1e-05

+

0.01

+

off

+

0

+

0

+

Masking

+
+
+

Configuration

+

Solver

+

[ 200, 197, 1080, 827 ]

+

+

+
+ +__MWOPC_PART_BEGIN__ /simulink/configSetInfo.xml + + + Configuration + + +__MWOPC_PART_BEGIN__ /simulink/graphicalInterface.xml + + +

0

+

0

+

+

0

+

0

+

0

+

0

+

0

+

0

+

0

+

Unset

+

0

+

Simulink

+

0

+

0

+

1

+
+ +__MWOPC_PART_BEGIN__ /simulink/modelDictionary.xml + + + + + + +__MWOPC_PART_BEGIN__ /simulink/ScheduleCore.xml + + + + + + + + + false + Default + -2147483648 + + + + +__MWOPC_PART_BEGIN__ /simulink/ScheduleEditor.xml + + + + + HighNumberFirst + Default + + + + + + Default + graph.Graph + + +__MWOPC_PART_BEGIN__ /simulink/stateflow/_rels/machine.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/stateflow/chart_8.xml + + +

f/code

+

[364 306 161 561]

+

[0 156.75 0 153.75]

+

[1 1 1366 768 1.25]

+

8

+

LIBRARY_TOOLBAR

+

6

+

CLUSTER_CHART

+

EML_CHART

+

2

+

1

+ +

f

+
+ + +

eML_blk_kernel()

+

[18 64.5 118 66]

+

12

+

SUBCHART

+

8

+

FUNC_STATE

+

CLUSTER_STATE

+ +

1

+

function output = f(x,y) +%%#eml +output=x-y; +if(y<0) + if(x<=1) + output = x-y; + elseif(x>1) + output = x+y; + end +elseif(y==0) + if(x<=1) + output = x*y; + elseif(x>1) + output = x; + end +elseif(y>0) + if(x<=1) + output = x/y; + elseif(x>1) + output = y; + end +end +

+

Matrix(4,1) +[205.0, 227.0, 1080.0, 733.0]

+

1

+
+
+ +

INPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+
+

SF_COMPLEX_INHERITED

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

INPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_NO

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

OUTPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+

1

+

16

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_NO

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

{eML_blk_kernel();}

+

[32.125 19.875 102.544 14.964]

+

12

+ +

[0 0 1 0 23.5747 14.625 0 0]

+
+ +

3

+

[1 0 -1 0 23.5747 42.5747 0 0]

+
+

[23.5747 24.9468]

+

[23.575 23.575 14.625 34.575]

+

8

+

SMART

+ +

BOTH_STICK

+
+

1

+
+ +

[23.5747 49.5747 7]

+

8

+

CONNECTIVE_JUNCTION

+
+
+
+ +__MWOPC_PART_BEGIN__ /simulink/stateflow/machine.xml + + + +

80000046

+ + +

Default Simulink S-Function Target.

+
+ +
+
+ +

7

+

f/code

+

8

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/_rels/system_1.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/systems/_rels/system_root.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/systems/system_1.xml + + +

[361, 208, 947, 921]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

off

+

Deduce

+

Simulink

+ +

[35, 38, 65, 52]

+

-1

+
+ +

[35, 38, 65, 52]

+

-2

+

2

+
+ +

[2, 1]

+

[250, 49, 320, 96]

+

-3

+

1.31

+

Stateflow.Translate.translate

+

ExplicitOnly

+

on

+

off

+

MATLAB Function

+ +
+ +

[35, 53, 65, 67]

+

-4

+
+ +

1

+

4#out:1

+

3#in:1

+
+ +

2

+

5#out:1

+

3#in:2

+
+ +

3

+

3#out:1

+

6#in:1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/system_3.xml + + +

[185, 218, 828, 891]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

off

+

Deduce

+

25

+

Simulink

+ +

[20, 101, 40, 119]

+

-1

+
+ +

[20, 136, 40, 154]

+

-2

+

2

+
+ +

[1, 1]

+

[270, 230, 320, 270]

+

2

+

1

+
+ +

Stateflow S-Function 2

+

[2, 2]

+

[180, 100, 230, 160]

+

1

+

sf_sfun

+

[2 2]

+

off

+

off

+

off

+ +

2

+

output

+
+
+ +

[460, 241, 480, 259]

+

3

+
+ +

[460, 101, 480, 119]

+

-6

+
+ +

6

+

3::1#out:1

+

[120, 0]

+

3::23#in:1

+
+ +

7

+

3::18#out:1

+

3::23#in:2

+
+ +

output

+

8

+

[0, 0]

+

3::23#out:2

+

3::19#in:1

+
+ +

9

+

3::24#out:1

+

3::25#in:1

+
+ +

10

+

3::23#out:1

+

3::24#in:1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/system_root.xml + + +

[645, 126, 1313, 799]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

on

+

off

+

Deduce

+

simulink-default.rpt

+

6

+

Simulink

+ +

[2, 1]

+

[105, 64, 270, 131]

+

-1

+

1.12

+

on

+

+

TTdiag Copy

+

TTdiag Delete

+

TTdiag Open Simulink

+

off

+ + port_label('input',1,'x');port_label('input',2,'y');port_label('output',1,'output');text(0.5, 0.9, 'Tabular Expression', 'horizontalAlignment', 'center');color('green');text(0.5, 0.1, 'Checked', 'horizontalAlignment', 'center') + Table Block + + +
+
+ +__MWOPC_PART_BEGIN__ /simulink/windowsInfo.xml + + + + +

1

+

[645.0, 126.0, 668.0, 673.0]

+ +

0

+

Left

+

50

+

50

+

9

+

Unset

+
+ +

1

+
+ +

1

+

1

+

SimulinkTopLevel

+

0

+

[630.0, 438.0]

+

1.0

+

[-127.5, -114.5]

+

[-127.5, -114.5, 630.0, 438.0]

+
+ + +

GLUE2:PropertyInspector

+

Property Inspector

+

0

+

+

+

0

+

Right

+

640

+

480

+

Unset

+
+ +

Simulink:Editor:ReferencedFiles

+

Referenced Files

+

0

+

+

{"filterShowRefModels":"true","filterShowRefSubs":"true","filterShowOnlyDirtyFiles":"false"} +

+

0

+

Left

+

640

+

480

+

Unset

+
+
+

AAAA/wAAAAD9AAAAAwAAAAAAAAC9AAAB+PwCAAAABPsAAAAWAEQAbwBjAGsAVwBpAGQAZwBlAHQAMwEAAAAxAAAB+AAAAAAAAAAA+wAAABYARABvAGMAawBXAGkAZABnAGUAdAA0AAAAAAD/////AAAAAAAAAAD7AAAAUgBHAEwAVQBFADIAIAB0AHIAZQBlACAAYwBvAG0AcABvAG4AZQBuAHQALwBHAEwAVQBFADIAIAB0AHIAZQBlACAAYwBvAG0AcABvAG4AZQBuAHQAAAAAAP////8AAABkAP////sAAABgAFMAaQBtAHUAbABpAG4AawA6AEUAZABpAHQAbwByADoAUgBlAGYAZQByAGUAbgBjAGUAZABGAGkAbABlAHMALwBSAGUAZgBlAHIAZQBuAGMAZQBkACAARgBpAGwAZQBzAAAAAAD/////AAAAiAD///8AAAABAAAAAAAAAAD8AgAAAAH7AAAAVABHAEwAVQBFADIAOgBQAHIAbwBwAGUAcgB0AHkASQBuAHMAcABlAGMAdABvAHIALwBQAHIAbwBwAGUAcgB0AHkAIABJAG4AcwBwAGUAYwB0AG8AcgAAAAAA/////wAAAawA////AAAAAwAAAAAAAAAA/AEAAAAB+/////8AAAAAAP////8AAAFZAP///wAAApwAAAHzAAAAAQAAAAIAAAABAAAAAvwAAAAA

+ +

167c9499-69fb-4016-9e96-f867813b6e8a

+
+

+

+
+ +__MWOPC_PACKAGE_END__ +======= Model { Name "ReadabilityExample" Version 7.5 @@ -1214,3 +6096,4 @@ Stateflow { linkNode [1 0 0] } } +>>>>>>> 6e8ce001ab8e32d0a66c7fab9f1c8f2d9f1bad69 diff --git a/Examples/ReadabilityExample.mdl.r2010a b/Examples/ReadabilityExample.mdl.r2010a new file mode 100644 index 0000000000000000000000000000000000000000..6b727d404a29d25a13c121a5d587def6ef31eed4 --- /dev/null +++ b/Examples/ReadabilityExample.mdl.r2010a @@ -0,0 +1,1216 @@ +Model { + Name "ReadabilityExample" + Version 7.5 + MdlSubVersion 0 + GraphicalInterface { + NumRootInports 0 + NumRootOutports 0 + ParameterArgumentNames "" + ComputedModelVersion "1.3" + NumModelReferences 0 + NumTestPointedSignals 0 + } + SavedCharacterEncoding "UTF-8" + SaveDefaultBlockParams on + ScopeRefreshTime 0.035000 + OverrideScopeRefreshTime on + DisableAllScopes off + DataTypeOverride "UseLocalSettings" + MinMaxOverflowLogging "UseLocalSettings" + MinMaxOverflowArchiveMode "Overwrite" + MaxMDLFileLineLength 120 + Created "Wed Dec 22 13:30:47 2010" + Creator "lawford" + UpdateHistory "UpdateHistoryNever" + ModifiedByFormat "%" + LastModifiedBy "matthew" + ModifiedDateFormat "%" + LastModifiedDate "Thu May 15 16:34:20 2014" + RTWModifiedTimeStamp 322072433 + ModelVersionFormat "1.%" + ConfigurationManager "None" + SampleTimeColors off + SampleTimeAnnotations off + LibraryLinkDisplay "none" + WideLines off + ShowLineDimensions off + ShowPortDataTypes off + ShowLoopsOnError on + IgnoreBidirectionalLines off + ShowStorageClass off + ShowTestPointIcons on + ShowSignalResolutionIcons on + ShowViewerIcons on + SortedOrder off + ExecutionContextIcon off + ShowLinearizationAnnotations on + BlockNameDataTip off + BlockParametersDataTip off + BlockDescriptionStringDataTip off + ToolBar on + StatusBar on + BrowserShowLibraryLinks off + BrowserLookUnderMasks off + SimulationMode "normal" + LinearizationMsg "none" + Profile off + ParamWorkspaceSource "MATLABWorkspace" + AccelSystemTargetFile "accel.tlc" + AccelTemplateMakefile "accel_default_tmf" + AccelMakeCommand "make_rtw" + TryForcingSFcnDF off + RecordCoverage off + CovPath "/" + CovSaveName "covdata" + CovMetricSettings "dw" + CovNameIncrementing off + CovHtmlReporting on + CovForceBlockReductionOff on + covSaveCumulativeToWorkspaceVar on + CovSaveSingleToWorkspaceVar on + CovCumulativeVarName "covCumulativeData" + CovCumulativeReport off + CovReportOnPause on + CovModelRefEnable "Off" + CovExternalEMLEnable off + ExtModeBatchMode off + ExtModeEnableFloating on + ExtModeTrigType "manual" + ExtModeTrigMode "normal" + ExtModeTrigPort "1" + ExtModeTrigElement "any" + ExtModeTrigDuration 1000 + ExtModeTrigDurationFloating "auto" + ExtModeTrigHoldOff 0 + ExtModeTrigDelay 0 + ExtModeTrigDirection "rising" + ExtModeTrigLevel 0 + ExtModeArchiveMode "off" + ExtModeAutoIncOneShot off + ExtModeIncDirWhenArm off + ExtModeAddSuffixToVar off + ExtModeWriteAllDataToWs off + ExtModeArmWhenConnect on + ExtModeSkipDownloadWhenConnect off + ExtModeLogAll on + ExtModeAutoUpdateStatusClock on + BufferReuse on + ShowModelReferenceBlockVersion off + ShowModelReferenceBlockIO off + Array { + Type "Handle" + Dimension 1 + Simulink.ConfigSet { + $ObjectID 1 + Version "1.10.0" + Array { + Type "Handle" + Dimension 8 + Simulink.SolverCC { + $ObjectID 2 + Version "1.10.0" + StartTime "0.0" + StopTime "10.0" + AbsTol "auto" + FixedStep "auto" + InitialStep "auto" + MaxNumMinSteps "-1" + MaxOrder 5 + ZcThreshold "auto" + ConsecutiveZCsStepRelTol "10*128*eps" + MaxConsecutiveZCs "1000" + ExtrapolationOrder 4 + NumberNewtonIterations 1 + MaxStep "auto" + MinStep "auto" + MaxConsecutiveMinStep "1" + RelTol "1e-3" + SolverMode "Auto" + Solver "ode45" + SolverName "ode45" + SolverJacobianMethodControl "auto" + ShapePreserveControl "DisableAll" + ZeroCrossControl "UseLocalSettings" + ZeroCrossAlgorithm "Nonadaptive" + AlgebraicLoopSolver "TrustRegion" + SolverResetMethod "Fast" + PositivePriorityOrder off + AutoInsertRateTranBlk off + SampleTimeConstraint "Unconstrained" + InsertRTBMode "Whenever possible" + } + Simulink.DataIOCC { + $ObjectID 3 + Version "1.10.0" + Decimation "1" + ExternalInput "[t, u]" + FinalStateName "xFinal" + InitialState "xInitial" + LimitDataPoints on + MaxDataPoints "1000" + LoadExternalInput off + LoadInitialState off + SaveFinalState off + SaveCompleteFinalSimState off + SaveFormat "Array" + SaveOutput on + SaveState off + SignalLogging on + DSMLogging on + InspectSignalLogs off + SaveTime on + ReturnWorkspaceOutputs off + StateSaveName "xout" + TimeSaveName "tout" + OutputSaveName "yout" + SignalLoggingName "logsout" + DSMLoggingName "dsmout" + OutputOption "RefineOutputTimes" + OutputTimes "[]" + ReturnWorkspaceOutputsName "out" + Refine "1" + } + Simulink.OptimizationCC { + $ObjectID 4 + Version "1.10.0" + Array { + Type "Cell" + Dimension 8 + Cell "BooleansAsBitfields" + Cell "PassReuseOutputArgsAs" + Cell "PassReuseOutputArgsThreshold" + Cell "ZeroExternalMemoryAtStartup" + Cell "ZeroInternalMemoryAtStartup" + Cell "OptimizeModelRefInitCode" + Cell "NoFixptDivByZeroProtection" + Cell "UseSpecifiedMinMax" + PropName "DisabledProps" + } + BlockReduction on + BooleanDataType on + ConditionallyExecuteInputs on + InlineParams off + UseIntDivNetSlope off + InlineInvariantSignals off + OptimizeBlockIOStorage on + BufferReuse on + EnhancedBackFolding off + StrengthReduction off + EnforceIntegerDowncast on + ExpressionFolding on + BooleansAsBitfields off + BitfieldContainerType "uint_T" + EnableMemcpy on + MemcpyThreshold 64 + PassReuseOutputArgsAs "Structure reference" + ExpressionDepthLimit 2147483647 + FoldNonRolledExpr on + LocalBlockOutputs on + RollThreshold 5 + SystemCodeInlineAuto off + StateBitsets off + DataBitsets off + UseTempVars off + ZeroExternalMemoryAtStartup on + ZeroInternalMemoryAtStartup on + InitFltsAndDblsToZero off + NoFixptDivByZeroProtection off + EfficientFloat2IntCast off + EfficientMapNaN2IntZero on + OptimizeModelRefInitCode off + LifeSpan "inf" + MaxStackSize "Inherit from target" + BufferReusableBoundary on + SimCompilerOptimization "Off" + AccelVerboseBuild off + } + Simulink.DebuggingCC { + $ObjectID 5 + Version "1.10.0" + RTPrefix "error" + ConsistencyChecking "none" + ArrayBoundsChecking "none" + SignalInfNanChecking "none" + SignalRangeChecking "none" + ReadBeforeWriteMsg "UseLocalSettings" + WriteAfterWriteMsg "UseLocalSettings" + WriteAfterReadMsg "UseLocalSettings" + AlgebraicLoopMsg "warning" + ArtificialAlgebraicLoopMsg "warning" + SaveWithDisabledLinksMsg "warning" + SaveWithParameterizedLinksMsg "warning" + CheckSSInitialOutputMsg on + UnderspecifiedInitializationDetection "Classic" + MergeDetectMultiDrivingBlocksExec "none" + CheckExecutionContextPreStartOutputMsg off + CheckExecutionContextRuntimeOutputMsg off + SignalResolutionControl "UseLocalSettings" + BlockPriorityViolationMsg "warning" + MinStepSizeMsg "warning" + TimeAdjustmentMsg "none" + MaxConsecutiveZCsMsg "error" + SolverPrmCheckMsg "warning" + InheritedTsInSrcMsg "warning" + DiscreteInheritContinuousMsg "warning" + MultiTaskDSMMsg "error" + MultiTaskCondExecSysMsg "error" + MultiTaskRateTransMsg "error" + SingleTaskRateTransMsg "none" + TasksWithSamePriorityMsg "warning" + SigSpecEnsureSampleTimeMsg "warning" + CheckMatrixSingularityMsg "none" + IntegerOverflowMsg "warning" + Int32ToFloatConvMsg "warning" + ParameterDowncastMsg "error" + ParameterOverflowMsg "error" + ParameterUnderflowMsg "none" + ParameterPrecisionLossMsg "warning" + ParameterTunabilityLossMsg "warning" + FixptConstUnderflowMsg "none" + FixptConstOverflowMsg "none" + FixptConstPrecisionLossMsg "none" + UnderSpecifiedDataTypeMsg "none" + UnnecessaryDatatypeConvMsg "none" + VectorMatrixConversionMsg "none" + InvalidFcnCallConnMsg "error" + FcnCallInpInsideContextMsg "Use local settings" + SignalLabelMismatchMsg "none" + UnconnectedInputMsg "warning" + UnconnectedOutputMsg "warning" + UnconnectedLineMsg "warning" + SFcnCompatibilityMsg "none" + UniqueDataStoreMsg "none" + BusObjectLabelMismatch "warning" + RootOutportRequireBusObject "warning" + AssertControl "UseLocalSettings" + EnableOverflowDetection off + ModelReferenceIOMsg "none" + ModelReferenceVersionMismatchMessage "none" + ModelReferenceIOMismatchMessage "none" + ModelReferenceCSMismatchMessage "none" + UnknownTsInhSupMsg "warning" + ModelReferenceDataLoggingMessage "warning" + ModelReferenceSymbolNameMessage "warning" + ModelReferenceExtraNoncontSigs "error" + StateNameClashWarn "warning" + SimStateInterfaceChecksumMismatchMsg "warning" + StrictBusMsg "ErrorLevel1" + BusNameAdapt "WarnAndRepair" + NonBusSignalsTreatedAsBus "none" + LoggingUnavailableSignals "error" + BlockIODiagnostic "none" + } + Simulink.HardwareCC { + $ObjectID 6 + Version "1.10.0" + ProdBitPerChar 8 + ProdBitPerShort 16 + ProdBitPerInt 32 + ProdBitPerLong 32 + ProdIntDivRoundTo "Undefined" + ProdEndianess "Unspecified" + ProdWordSize 32 + ProdShiftRightIntArith on + ProdHWDeviceType "32-bit Generic" + TargetBitPerChar 8 + TargetBitPerShort 16 + TargetBitPerInt 32 + TargetBitPerLong 32 + TargetShiftRightIntArith on + TargetIntDivRoundTo "Undefined" + TargetEndianess "Unspecified" + TargetWordSize 32 + TargetTypeEmulationWarnSuppressLevel 0 + TargetPreprocMaxBitsSint 32 + TargetPreprocMaxBitsUint 32 + TargetHWDeviceType "Specified" + TargetUnknown off + ProdEqTarget on + } + Simulink.ModelReferenceCC { + $ObjectID 7 + Version "1.10.0" + UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" + CheckModelReferenceTargetMessage "error" + EnableParallelModelReferenceBuilds off + ParallelModelReferenceMATLABWorkerInit "None" + ModelReferenceNumInstancesAllowed "Multi" + PropagateVarSize "Infer from blocks in model" + ModelReferencePassRootInputsByReference on + ModelReferenceMinAlgLoopOccurrences off + PropagateSignalLabelsOutOfModel off + SupportModelReferenceSimTargetCustomCode off + } + Simulink.SFSimCC { + $ObjectID 8 + Version "1.10.0" + SFSimEnableDebug on + SFSimOverflowDetection on + SFSimEcho on + SimBlas on + SimCtrlC on + SimExtrinsic on + SimIntegrity on + SimUseLocalCustomCode off + SimBuildMode "sf_incremental_build" + } + Simulink.RTWCC { + $BackupClass "Simulink.RTWCC" + $ObjectID 9 + Version "1.10.0" + Array { + Type "Cell" + Dimension 7 + Cell "IncludeHyperlinkInReport" + Cell "GenerateTraceInfo" + Cell "GenerateTraceReport" + Cell "GenerateTraceReportSl" + Cell "GenerateTraceReportSf" + Cell "GenerateTraceReportEml" + Cell "GenerateSLWebview" + PropName "DisabledProps" + } + SystemTargetFile "grt.tlc" + GenCodeOnly off + MakeCommand "make_rtw" + GenerateMakefile on + TemplateMakefile "grt_default_tmf" + GenerateReport off + SaveLog off + RTWVerbose on + RetainRTWFile off + ProfileTLC off + TLCDebug off + TLCCoverage off + TLCAssert off + ProcessScriptMode "Default" + ConfigurationMode "Optimized" + ConfigAtBuild off + RTWUseLocalCustomCode off + RTWUseSimCustomCode off + IncludeHyperlinkInReport off + LaunchReport off + TargetLang "C" + IncludeBusHierarchyInRTWFileBlockHierarchyMap off + IncludeERTFirstTime off + GenerateTraceInfo off + GenerateTraceReport off + GenerateTraceReportSl off + GenerateTraceReportSf off + GenerateTraceReportEml off + GenerateCodeInfo off + RTWCompilerOptimization "Off" + CheckMdlBeforeBuild "Off" + CustomRebuildMode "OnUpdate" + Array { + Type "Handle" + Dimension 2 + Simulink.CodeAppCC { + $ObjectID 10 + Version "1.10.0" + Array { + Type "Cell" + Dimension 21 + Cell "IgnoreCustomStorageClasses" + Cell "IgnoreTestpoints" + Cell "InsertBlockDesc" + Cell "InsertPolySpaceComments" + Cell "SFDataObjDesc" + Cell "MATLABFcnDesc" + Cell "SimulinkDataObjDesc" + Cell "DefineNamingRule" + Cell "SignalNamingRule" + Cell "ParamNamingRule" + Cell "InlinedPrmAccess" + Cell "CustomSymbolStr" + Cell "CustomSymbolStrGlobalVar" + Cell "CustomSymbolStrType" + Cell "CustomSymbolStrField" + Cell "CustomSymbolStrFcn" + Cell "CustomSymbolStrFcnArg" + Cell "CustomSymbolStrBlkIO" + Cell "CustomSymbolStrTmpVar" + Cell "CustomSymbolStrMacro" + Cell "ReqsInCode" + PropName "DisabledProps" + } + ForceParamTrailComments off + GenerateComments on + IgnoreCustomStorageClasses on + IgnoreTestpoints off + IncHierarchyInIds off + MaxIdLength 31 + PreserveName off + PreserveNameWithParent off + ShowEliminatedStatement off + IncAutoGenComments off + SimulinkDataObjDesc off + SFDataObjDesc off + IncDataTypeInIds off + MangleLength 1 + CustomSymbolStrGlobalVar "$R$N$M" + CustomSymbolStrType "$N$R$M_T" + CustomSymbolStrField "$N$M" + CustomSymbolStrFcn "$R$N$M$F" + CustomSymbolStrFcnArg "rt$I$N$M" + CustomSymbolStrBlkIO "rtb_$N$M" + CustomSymbolStrTmpVar "$N$M" + CustomSymbolStrMacro "$R$N$M" + DefineNamingRule "None" + ParamNamingRule "None" + SignalNamingRule "None" + InsertBlockDesc off + SimulinkBlockComments on + EnableCustomComments off + InlinedPrmAccess "Literals" + ReqsInCode off + UseSimReservedNames off + } + Simulink.GRTTargetCC { + $BackupClass "Simulink.TargetCC" + $ObjectID 11 + Version "1.10.0" + Array { + Type "Cell" + Dimension 17 + Cell "GeneratePreprocessorConditionals" + Cell "IncludeMdlTerminateFcn" + Cell "CombineOutputUpdateFcns" + Cell "SuppressErrorStatus" + Cell "ERTCustomFileBanners" + Cell "GenerateSampleERTMain" + Cell "GenerateTestInterfaces" + Cell "ModelStepFunctionPrototypeControlCompliant" + Cell "CPPClassGenCompliant" + Cell "PortableWordSizes" + Cell "PurelyIntegerCode" + Cell "SupportComplex" + Cell "SupportAbsoluteTime" + Cell "SupportContinuousTime" + Cell "SupportNonInlinedSFcns" + Cell "MultiInstanceERTCode" + Cell "SupportNonFinite" + PropName "DisabledProps" + } + TargetFcnLib "ansi_tfl_table_tmw.mat" + TargetLibSuffix "" + TargetPreCompLibLocation "" + TargetFunctionLibrary "ANSI_C" + UtilityFuncGeneration "Auto" + ERTMultiwordTypeDef "System defined" + ERTCodeCoverageTool "None" + ERTMultiwordLength 256 + MultiwordLength 2048 + GenerateFullHeader on + GenerateSampleERTMain off + GenerateTestInterfaces off + IsPILTarget off + ModelReferenceCompliant on + ParMdlRefBuildCompliant on + CompOptLevelCompliant on + IncludeMdlTerminateFcn on + GeneratePreprocessorConditionals "Disable all" + CombineOutputUpdateFcns off + SuppressErrorStatus off + ERTFirstTimeCompliant off + IncludeFileDelimiter "Auto" + ERTCustomFileBanners off + SupportAbsoluteTime on + LogVarNameModifier "rt_" + MatFileLogging on + MultiInstanceERTCode off + SupportNonFinite on + SupportComplex on + PurelyIntegerCode off + SupportContinuousTime on + SupportNonInlinedSFcns on + SupportVariableSizeSignals off + EnableShiftOperators on + ParenthesesLevel "Nominal" + PortableWordSizes off + ModelStepFunctionPrototypeControlCompliant off + CPPClassGenCompliant off + AutosarCompliant off + UseMalloc off + ExtMode off + ExtModeStaticAlloc off + ExtModeTesting off + ExtModeStaticAllocSize 1000000 + ExtModeTransport 0 + ExtModeMexFile "ext_comm" + ExtModeIntrfLevel "Level1" + RTWCAPISignals off + RTWCAPIParams off + RTWCAPIStates off + GenerateASAP2 off + } + PropName "Components" + } + } + PropName "Components" + } + Name "Configuration" + CurrentDlgPage "Solver" + ConfigPrmDlgPosition " [ 200, 197, 1080, 827 ] " + } + PropName "ConfigurationSets" + } + Simulink.ConfigSet { + $PropName "ActiveConfigurationSet" + $ObjectID 1 + } + BlockDefaults { + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + NamePlacement "normal" + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + ShowName on + BlockRotation 0 + BlockMirror off + } + AnnotationDefaults { + HorizontalAlignment "center" + VerticalAlignment "middle" + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + UseDisplayTextAsClickCallback off + } + LineDefaults { + FontName "Helvetica" + FontSize 9 + FontWeight "normal" + FontAngle "normal" + } + BlockParameterDefaults { + Block { + BlockType Demux + Outputs "4" + DisplayOption "none" + BusSelectionMode off + } + Block { + BlockType Inport + Port "1" + UseBusObject off + BusObject "BusObject" + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + OutMin "[]" + OutMax "[]" + DataType "auto" + OutDataType "fixdt(1,16,0)" + OutScaling "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + SignalType "auto" + SamplingMode "auto" + LatchByDelayingOutsideSignal off + LatchInputForFeedbackSignals off + Interpolate on + } + Block { + BlockType Outport + Port "1" + UseBusObject off + BusObject "BusObject" + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + OutMin "[]" + OutMax "[]" + DataType "auto" + OutDataType "fixdt(1,16,0)" + OutScaling "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + SignalType "auto" + SamplingMode "auto" + SourceOfInitialOutputValue "Dialog" + OutputWhenDisabled "held" + InitialOutput "[]" + } + Block { + BlockType "S-Function" + FunctionName "system" + SFunctionModules "''" + PortCounts "[]" + SFunctionDeploymentMode off + } + Block { + BlockType SubSystem + ShowPortLabels "FromPortIcon" + Permissions "ReadWrite" + PermitHierarchicalResolution "All" + TreatAsAtomicUnit off + CheckFcnCallInpInsideContextMsg off + SystemSampleTime "-1" + RTWFcnNameOpts "Auto" + RTWFileNameOpts "Auto" + RTWMemSecFuncInitTerm "Inherit from model" + RTWMemSecFuncExecute "Inherit from model" + RTWMemSecDataConstants "Inherit from model" + RTWMemSecDataInternal "Inherit from model" + RTWMemSecDataParameters "Inherit from model" + SimViewingDevice off + DataTypeOverride "UseLocalSettings" + MinMaxOverflowLogging "UseLocalSettings" + } + Block { + BlockType Terminator + } + } + System { + Name "ReadabilityExample" + Location [683, 246, 1311, 741] + Open on + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + ReportName "simulink-default.rpt" + SIDHighWatermark 6 + Block { + BlockType SubSystem + Name "f" + SID 1 + Ports [2, 1] + Position [105, 64, 270, 131] + LibraryVersion "1.12" + UserDataPersistent on + UserData "DataTag0" + CopyFcn "TTdiag Copy" + DeleteFcn "TTdiag Delete" + OpenFcn "TTdiag Open Simulink" + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskDescription "Table Block" + MaskDisplay "port_label('input',1,'x');port_label('input',2,'y');port_label('output',1,'output');text(0.5," + " 0.9, 'Tabular Expression', 'horizontalAlignment', 'center');color('green');text(0.5, 0.1, 'Checked', 'horizonta" + "lAlignment', 'center')" + MaskIconFrame on + MaskIconOpaque on + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "normalized" + System { + Name "f" + Location [399, 328, 945, 863] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + Block { + BlockType Inport + Name "x" + SID 4 + Position [35, 38, 65, 52] + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "y" + SID 5 + Position [35, 38, 65, 52] + Port "2" + IconDisplay "Port number" + } + Block { + BlockType SubSystem + Name "code" + SID 3 + Ports [2, 1] + Position [250, 49, 320, 96] + LibraryVersion "1.31" + PermitHierarchicalResolution "ExplicitOnly" + TreatAsAtomicUnit on + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskType "Stateflow" + MaskDescription "Embedded MATLAB block" + MaskDisplay "disp('f');" + MaskSelfModifiable on + MaskIconFrame on + MaskIconOpaque off + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "normalized" + System { + Name "code" + Location [223, 338, 826, 833] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + SIDHighWatermark 22 + Block { + BlockType Inport + Name "x" + SID 1 + Position [20, 101, 40, 119] + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "y" + SID 18 + Position [20, 136, 40, 154] + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Demux + Name " Demux " + SID 21 + Ports [1, 1] + Position [270, 230, 320, 270] + Outputs "1" + } + Block { + BlockType "S-Function" + Name " SFunction " + SID 20 + Tag "Stateflow S-Function ReadabilityExample 2" + Ports [2, 2] + Position [180, 100, 230, 160] + FunctionName "sf_sfun" + PortCounts "[2 2]" + EnableBusSupport off + Port { + PortNumber 2 + Name "output" + RTWStorageClass "Auto" + DataLoggingNameMode "SignalName" + } + } + Block { + BlockType Terminator + Name " Terminator " + SID 22 + Position [460, 241, 480, 259] + } + Block { + BlockType Outport + Name "output" + SID 19 + Position [460, 101, 480, 119] + IconDisplay "Port number" + } + Line { + SrcBlock "x" + SrcPort 1 + Points [120, 0] + DstBlock " SFunction " + DstPort 1 + } + Line { + SrcBlock "y" + SrcPort 1 + DstBlock " SFunction " + DstPort 2 + } + Line { + Name "output" + Labels [0, 0] + SrcBlock " SFunction " + SrcPort 2 + DstBlock "output" + DstPort 1 + } + Line { + SrcBlock " Demux " + SrcPort 1 + DstBlock " Terminator " + DstPort 1 + } + Line { + SrcBlock " SFunction " + SrcPort 1 + DstBlock " Demux " + DstPort 1 + } + } + } + Block { + BlockType Outport + Name "output" + SID 6 + Position [35, 53, 65, 67] + IconDisplay "Port number" + } + Line { + SrcBlock "x" + SrcPort 1 + DstBlock "code" + DstPort 1 + } + Line { + SrcBlock "y" + SrcPort 1 + DstBlock "code" + DstPort 2 + } + Line { + SrcBlock "code" + SrcPort 1 + DstBlock "output" + DstPort 1 + } + } + } + } +} +MatData { + NumRecords 1 + DataRecord { + Tag DataTag0 + Data " %)30 . > 8 ( $0 ! $ ! !-0T]3 0 $ $1A=&$. 2 8 ( #0 " + " % \" 8 ! 0 & & -T\" 0 $ ! !0 X # + !@ @ ) 4" + " ( 0 ) L ! ( \"0+ %)30 . \\\"L 8 ( @ % \" $ ! 0 " + " % 0 !0 $ % 34-/4P . J\"L 8 ( $0 ! $ ! !-0T]3 0 T !&:6QE5W)A<'" + "!E !R1W)I9 !N97=?8V5L;%]P8@!D96QE=&5?8V5L;%]P8@!P8E]F;&%G $-E;&P '1?;V9F 8 $ 0 \\ % 0 ! " + "& 0 !$ 4 0 !( 5 0 !, 0 0 !0 !@ 0 ! %0 4 ! %@ 8 ! " + " %P !0 ! & !4 ! &0 ! ! &@ $ P $ F (0 $ G (@ $ H " + " %P $ I 0 # 0 \"H A 0 \"L B 0 \"P 7 0 \"T ! , ! " + " +@ \"$ ! +P \"( ! , !< ! ,0 $ P $ R (0 $ S (@ $ T " + " %P $ U 0 # 0 #8 A 0 #< B 0 #@ 7 0 #D " + " " + " . X P !@ @ $ 4 ( 0 0 ! " + " ! ! !X/#TQ#@ #@ & \" 8 !0 @ ! 0 $ \"0 @ #P/PX P !@ " + " @ $ 4 ( 0 , ! ! P!X/C$ #@ #@ & \" 8 !0 @ ! 0 " + " $ \"0 @ 0 X !( !@ @ - 4 ( !@ $ ! 8 8 W" + "0( ! 0 4 ! #@ #@ & \" 8 !0 @ ! 0 $ \"0 @ #P/" + "PX !0 !@ @ - 4 ( !P $ ! 8 < W0( ! @ 0 & @ " + " . . 8 ( !@ % \" $ ! 0 ) \" ! #@ #@ & \" " + "8 !0 @ ! 0 $ \"0 @ #P/PX !( !@ @ - 4 ( !@ $" + " ! 8 8 W0( ! 0 ( # #@ $@ & \" T !0 @ & 0 $ " + " !@ !@ #= @ $ ! !0 $ . . 8 ( !@ % \" $ ! 0 " + " ) \" / _#@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ $ " + " ! ! ( . , 8 ( ! % \" $ # 0 0 , >3PP X X !@ @ " + " & 4 ( 0 $ ! D ( \\#\\. , 8 ( ! % \" $ " + " $ 0 0 0 >3T], X X !@ @ & 4 ( 0 $ ! D ( $ " + ". 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ ( 0 X " + "X !@ @ & 4 ( 0 $ ! D ( \\#\\. . 8 ( !@ " + "% \" $ ! 0 ) \" / _#@ #@ & \" 8 !0 @ ! 0 $ " + " \"0 @ #P/PX P !@ @ $ 4 ( 0 , ! ! P!Y/C #@ #@ " + "& \" 8 !0 @ ! 0 $ \"0 @ (0 X !( !@ @ - 4 " + "( !@ $ ! 8 8 W0( ! 0 @ ! #@ #@ & \" 8 !0 @ !" + " 0 $ \"0 @ #P/PX X !@ @ & 4 ( 0 $ ! D ( " + " \\#\\. . 8 ( !@ % \" $ ! 0 ) \" / _#@ % " + "& \" T !0 @ ( 0 $ !@ \" #= @ $ # !P D * @ X " + "X !@ @ & 4 ( 0 $ ! D ( \"$ . . 8 ( !@ %" + " \" $ ! 0 ) \" ! #@ $@ & \" T !0 @ & 0 $ " + " !@ !@ #= @ $ ! @ , . 2 8 ( #0 % \" 8 ! 0 &" + " & -T\" 0 $ ( 0 X X !@ @ & 4 ( 0 $ ! D ( " + " \\#\\. . 8 ( !@ % \" $ ! 0 ) \" / _#@ #@ " + "& \" 8 !0 @ ! 0 $ \"0 @ #P/PX !( !@ @ - 4 " + "( !@ $ ! 8 8 W0( ! 0 < \" #@ # & \" 0 !0 @ " + "! P $ $ # '@M>0 . 2 8 ( !@ % \" $ # 0 ) & " + " / _ \\#\\ #P/PX !( !@ @ - 4 ( !@ $ ! 8 8 W0( !" + " 0 8 \" #@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ $ !" + " !P ( . , 8 ( ! % \" $ # 0 0 , >\"MY X !( !@ @ &" + " 4 ( 0 , ! D 8 \\#\\ #P/P / _#@ $@ & \" T " + " !0 @ & 0 $ !@ !@ #= @ $ ! ! ( . 2 8 ( #0 % " + " \" 8 ! 0 & & -T\" 0 $ ) @ X P !@ @ $ 4 ( " + " 0 , ! ! P!X*GD #@ $@ & \" 8 !0 @ ! P $ \"0 !@ " + " #P/P / _ \\#\\. 2 8 ( #0 % \" 8 ! 0 & & -T\"" + " 0 $ & @ X !( !@ @ - 4 ( !@ $ ! 8 8 W0( ! " + " 0 D \" #@ # & \" 0 !0 @ ! 0 $ $ ! '@ . 2 8 ( " + " !@ % \" $ # 0 ) & / _ \\#\\ #P/PX !( !@ @ - " + " 4 ( !@ $ ! 8 8 W0( ! 0 0 \" #@ $@ & \" T " + " !0 @ & 0 $ !@ !@ #= @ $ ! \"@ ( . , 8 ( ! % " + " \" $ # 0 0 , >\"]Y X !( !@ @ & 4 ( 0 , ! D 8 " + " \\#\\ #P/P / _#@ $@ & \" T !0 @ & 0 $ !@ !@ " + " #= @ $ ! !@ ( . 2 8 ( #0 % \" 8 ! 0 & & -T\" " + " 0 $ * @ X P !@ @ $ 4 ( 0 $ ! ! 0!Y #@ $@ & " + " \" 8 !0 @ ! P $ \"0 !@ #P/P / _ \\#\\. 8 8 ( " + " #0 % \" L ! 0 & + -T\" 0 8 # \"P P - #@ \\ " + "$ X !( !@ @ - 4 ( !@ $ ! 8 8 W0( ! 0 4 ! " + " #@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ $ ! \" $ . " + " 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ \" P X !(" + " !@ @ - 4 ( !@ $ ! 8 8 W0( ! 0 4 ! #@ $@ & " + " \" T !0 @ & 0 $ !@ !@ #= @ $ ! \" $ . , 8 ( " + " ! % \" $ ! 0 0 $ 9@ X P !@ @ $ 4 ( 0 , ! " + " ! P!X+'D #@ )@! & \" ( !0 @ ! 0 $ !0 $ < ! (P '-E= !I" + ";G!U=', 8V]U;G0 ')A;F=E !E>&-E<'0 . . 8 ( !@ % \" $ ! 0 ) \"" + " / _#@ # & \" 8 !0 @ $ \"0 . . 8 ( !" + "@ % \" $ ! 0 ) \" 0(] #@ #@ & \" 8 !0 @ ! " + " 0 $ \"0 @ !90 X X !@ @ & 4 ( 0 $ ! D ( " + " . . 8 ( !@ % \" $ ! 0 ) \" / _#@ #@ & \"" + " 8 !0 @ ! 0 $ \"0 @ X X !@ @ & 4 ( 0" + " $ ! D ( . 4 X 8 ( 0 % \" 8 ! 0 . . " + " 8 ( @ % \" $ 0 % 0 0 $ #@ ,@\" & \" ( !0" + " @ ! 0 $ !0 $ \\ ! AP '!A'1?:&5" + "I9VAT &-O;F1I=&EO;E]T97AT7W@ !C;VYD:71I;VY?=&5X=%]Y 8V]N9&ET:6]N7W1E>'1?;V9F 8 ( $0 ! $ ! !-0T]3 0 $ $1A=&$. 2 8 ( #0 " + " % \" 8 ! 0 & & -T\" 0 $ ! !0 X !P(P !@ @ ) 4" + " ( 0 $ C ! ( ! (P %)30 . H\"( 8 ( @ % \" $ ! 0 " + " % 0 !0 $ % 34-/4P . 6\"( 8 ( $0 ! $ ! !-0T]3 0 T !&:6QE5W)A<'!E" + "'1?> !C;VYD:71I;VY?=&5X=%]Y &-" + "O;F1I=&EO;E]T97AT7V]F9G-E= !G X \"8 0 !@ @ \" " + " 4 ( 0 $ ! 4 ! ' 0 \", !S970 :6YP=71S &-O=6YT !R86YG90 97AC97!T " + " #@ #@ & \" 8 !0 @ ! 0 $ \"0 @ #P/PX P !@ @ & " + " 4 ( ! D #@ #@ & \" 8 !0 @ ! 0 $ " + "\"0 @ $\"/0 X X !@ @ & 4 ( 0 $ ! D ( 64 . " + ". 8 ( !@ % \" $ ! 0 ) \" #@ #@ & \" 8 " + " !0 @ ! 0 $ \"0 @ #P/PX X !@ @ & 4 ( 0 $ ! " + " D ( . . 8 ( !@ % \" $ ! 0 ) \" " + "#@ % . & \" $ !0 @ & 0 $ #@ #@ & \" ( !0 @ ! " + " $ !0 $ $ ! X !H!0 !@ @ \" 4 ( 0 $ ! 4 ! 6 " + "0 & ! !S=6)G'1?=VED=&@ &-O;F1I=&E" + "O;E]T97AT7VAE:6=H= !C;VYD:71I;VY?=&5X=%]X 8V]N9&ET:6]N7W1E>'1?>0 &-O;F1I=&EO;E]T97AT7V]F9G-E= !G '0 8V]L;W( X P !@ @ " + " & 4 ( ! D #@ # & \" 8 !0 @ $ " + " \"0 . , 8 ( !@ % \" 0 ) X P !@ @ " + "& 4 ( ! D #@ # & \" 8 !0 @ $ " + " \"0 . \" , 8 ( @ % \" $ ! 0 % 0 $ $ \"@ 1W)I9# " + " $=R:60Q !'4.5)\n output = 1;\nelseif(x<4.5)\n ou" + "tput = 0;\nend\n" + editorLayout "100 M4x1[205 227 1080 733]" + } + } + junction { + id 4 + position [23.5747 49.5747 7] + chart 2 + linkNode [2 0 0] + subviewer 2 + ssIdNumber 3 + type CONNECTIVE_JUNCTION + } + transition { + id 5 + labelString "{eML_blk_kernel();}" + labelPosition [32.125 19.875 102.544 14.964] + fontSize 12 + src { + intersection [0 0 1 0 23.5747 14.625 0 0] + } + dst { + id 4 + intersection [7 0 -1 -1 23.5747 42.5747 0 0] + } + midPoint [23.5747 24.9468] + chart 2 + linkNode [2 0 0] + dataLimits [23.575 23.575 14.625 34.575] + subviewer 2 + drawStyle SMART + executionOrder 1 + ssIdNumber 2 + } + data { + id 6 + ssIdNumber 4 + name "x" + linkNode [2 0 7] + scope INPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + primitive SF_INT8_TYPE + } + complexity SF_COMPLEX_INHERITED + } + dataType "int8" + } + data { + id 7 + ssIdNumber 5 + name "output" + linkNode [2 6 0] + scope OUTPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + method SF_INHERITED_TYPE + primitive SF_DOUBLE_TYPE + } + complexity SF_COMPLEX_INHERITED + frame SF_FRAME_NO + } + dataType "Inherit: Same as Simulink" + } + instance { + id 8 + name "type_test/code" + machine 1 + chart 2 + } + target { + id 9 + name "sfun" + description "Default Simulink S-Function Target." + machine 1 + linkNode [1 0 0] + } +} diff --git a/Examples/quadratic_roots.mdl b/Examples/quadratic_roots.mdl index caa8dc142c27c7c65aace158da90d60f4009ceaa..34ebfb1093a1fac2e43cd475ec0be163af2ebe70 100644 --- a/Examples/quadratic_roots.mdl +++ b/Examples/quadratic_roots.mdl @@ -1,3 +1,2871 @@ +<<<<<<< HEAD +# MathWorks OPC Text Package +Model { + Version 10.4 + Description "Simulink model saved in R2021b" +} +__MWOPC_PACKAGE_BEGIN__ R2021b +__MWOPC_PART_BEGIN__ /[Content_Types].xml + + + + + + + + + + + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /_rels/.rels + + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /metadata/coreProperties.xml + + + model + 2011-01-21T19:32:13Z + colin + pesaraamarasekera + 2022-05-05T14:17:31Z + 24.0 + R2021b + + +__MWOPC_PART_BEGIN__ /metadata/mwcoreProperties.xml + + + application/vnd.mathworks.simulink.model + Simulink Model + R2021b + + +__MWOPC_PART_BEGIN__ /metadata/mwcorePropertiesExtension.xml + + + a92f09b1-8e51-4338-9cb3-194c4b38362b + + +__MWOPC_PART_BEGIN__ /metadata/mwcorePropertiesReleaseInfo.xml + + + + 9.11.0.1809720 + R2021b + Update 1 + Nov 02 2021 + 3710740051 + + +__MWOPC_PART_BEGIN__ /simulink/_rels/blockdiagram.xml.rels + + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /simulink/_rels/configSetInfo.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/bddefaults.xml + + + +

center

+

middle

+
+ + + + + + + + + +

none

+

Inherit: auto

+

off

+
+ +

1

+

on

+

Sample based

+

[]

+

[]

+

Inherit: Inherit from 'Constant value'

+

off

+

inf

+

inf

+

off

+
+ +

4

+

bar

+

off

+
+ +

short

+

10

+

off

+

off

+

-1

+
+ +

1

+

off

+

Port number

+

off

+

[]

+

[]

+

Inherit: auto

+

off

+

off

+

inherit

+

-1

+

Inherit

+

-1

+

auto

+

auto

+

off

+

off

+

on

+
+ +

sin

+

-1

+

auto

+

on

+

-1

+
+ +

1

+

off

+

Port number

+

off

+

[]

+

[]

+

Inherit: auto

+

off

+

off

+

inherit

+

-1

+

Inherit

+

-1

+

auto

+

auto

+

off

+

Dialog

+

held

+

[]

+

off

+

off

+

0

+

on

+
+ +

system

+

''

+

[]

+

auto

+
+ +

Simulink.scopes.TimeScopeBlockCfg

+
+ +

FromPortIcon

+

ReadWrite

+

All

+

off

+

off

+

Sample time

+

-1

+

Auto

+

Auto

+

Auto

+

void_void

+

off

+

off

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

off

+

UseLocalSettings

+

AllNumericTypes

+

UseLocalSettings

+

off

+

off

+

NONE

+

off

+

expression

+

update diagram

+

off

+

off

+

on

+

off

+

off

+

off

+

0

+

off

+

off

+
+ +

round

+

++

+

All dimensions

+

1

+

off

+

Inherit: Inherit via internal rule

+

[]

+

[]

+

Inherit: Inherit via internal rule

+

off

+

Floor

+

off

+

-1

+
+ +
+
+ +__MWOPC_PART_BEGIN__ /simulink/bdmxdata/UserData_1.mxarray BASE64 +AAFJTQAAAAAOAAAAeAAAAAYAAAAIAAAAEQAAAAAAAAABAAAAAAAAAAEABABNQ09TAQAEAERhdGEO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAAABAAAABQAAAA4AAAD4PgAABgAAAAgAAAAJAAAAAAAAAAUAAAAIAAAAAQAA +AMg+AAABAAAAAAAAAAIAAADIPgAAAAFJTQAAAAAOAAAAKD4AAAYAAAAIAAAAAgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABQAAAAEAAAAFAAAATUNPUwAAAAAOAAAA4D0AAAYAAAAI +AAAAEQAAAAAAAAABAAAAAAAAAAEABABNQ09TAQAAAA0AAABGaWxlV3JhcHBlcl9fAAAADgAAAKA9 +AAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAAB5AAAAAQAAAAEAAAAAAAAADgAAALgLAAAGAAAACAAA +AAkAAAAAAAAABQAAAAgAAACICwAAAQAAAAEAAAAAAAAAAgAAAIgLAAADAAAALAAAANgBAAA4AgAA +OAIAAJAEAADACgAAiAsAAAAAAAAAAAAAR3JpZDAAQ2VsbHMAQ2VsbDEAY29uZF90ZXh0AGNlbGxf +aW5kZXgAcGFyZW50X2dyaWQAY2VsbHMAR3JpZABwYXJlbnRfY2VsbABzcGxpdF9wYgBudW1fY2Vs +bHMAZ3JpZF9pbmRleAByR3JpZABuZXdfY2VsbF9wYgBkZWxldGVfY2VsbF9wYgBwYl9mbGFnAENl +bGwAc3ViZ3JpZABjb25kAHdpZHRoAGhlaWdodABncmlkX3BiAGNvbG9yAGNvbmRpdGlvbl90ZXh0 +X3dpZHRoAGNvbmRpdGlvbl90ZXh0X2hlaWdodABjb25kaXRpb25fdGV4dF94AGNvbmRpdGlvbl90 +ZXh0X3kAY29uZGl0aW9uX3RleHRfb2Zmc2V0AGdyaWRfcHVzaF93aWR0aABSR3JpZABHcmlkMQBH +cmlkMgBDZWxsMgByZXN1bHRfdGV4dABSQ2VsbAByZXN1bHQAZnVuY3Rpb25fbmFtZQBmdW5jdGlv +bl9pbnB1dHMAc2V0dGluZ3MAY2hlY2tlZABvcGVuAG11bHRpX21vZGUARGF0YQBmaWcAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAB4AAAAA +AAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAYAAAAAwAAAAAAAAAAAAAAAAAAAAIAAAAXAAAABAAA +AAAAAAAAAAAAAAAAAAMAAAAPAAAAAgAAAAAAAAAAAAAAAAAAAAQAAAADAAAAAQAAAAAAAAAAAAAA +AAAAAAUAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAYAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAcAAAAO +AAAAAQAAAAAAAAAAAAAAAAAAAAgAAAANAAAAAgAAAAAAAAAAAAAAAAAAAAkAAAAMAAAAAQAAAAAA +AAAAAAAAAAAAAAoAAAALAAAAAgAAAAAAAAAAAAAAAAAAAAsAAAAKAAAAAQAAAAAAAAAAAAAAAAAA +AAwAAAAJAAAAAgAAAAAAAAAAAAAAAAAAAA0AAAAEAAAAAgAAAAAAAAAAAAAAAAAAAA4AAAAIAAAA +AQAAAAAAAAAAAAAAAAAAAA8AAAAHAAAAAgAAAAAAAAAAAAAAAAAAABAAAAAFAAAAAgAAAAAAAAAA +AAAAAAAAABEAAAAGAAAABAAAAAAAAAAAAAAAAAAAABIAAAAQAAAABAAAAAAAAAAAAAAAAAAAABMA +AAARAAAABAAAAAAAAAAAAAAAAAAAABQAAAASAAAABAAAAAAAAAAAAAAAAAAAABUAAAATAAAABAAA +AAAAAAAAAAAAAAAAABYAAAAUAAAABAAAAAAAAAAAAAAAAAAAABcAAAAVAAAABAAAAAAAAAAAAAAA +AAAAABgAAAAWAAAAAAAAAAAAAAAJAAAAAQAAAAEAAABsAAAAHwAAAAEAAABtAAAAIAAAAAEAAABu +AAAAJQAAAAEAAABvAAAAJgAAAAEAAABwAAAAJwAAAAEAAABxAAAAKAAAAAEAAAByAAAAKQAAAAEA +AABzAAAAKgAAAAEAAAB0AAAAAwAAAAIAAAABAAAAaQAAAB8AAAABAAAAagAAACAAAAABAAAAawAA +AAQAAAADAAAAAQAAAAwAAAAhAAAAAQAAAEoAAAAiAAAAAQAAAEsAAAAXAAAAAQAAAEwAAAAAAAAA +BAAAAAQAAAABAAAAAAAAAAUAAAABAAAAAQAAAAYAAAABAAAACgAAABAAAAABAAAACwAAAAAAAAAE +AAAABwAAAAEAAAAGAAAACwAAAAEAAAAHAAAADAAAAAEAAAAIAAAADQAAAAEAAAAJAAAAAAAAAAQA +AAAEAAAAAQAAAAIAAAAFAAAAAQAAAAMAAAAGAAAAAQAAAAQAAAAQAAAAAQAAAAUAAAAAAAAABgAA +AAQAAAABAAAADQAAAAUAAAABAAAADgAAAAYAAAABAAAARgAAABQAAAABAAAARwAAABUAAAABAAAA +SAAAABAAAAABAAAASQAAAAAAAAAFAAAACQAAAAEAAABBAAAABwAAAAEAAABCAAAACwAAAAEAAABD +AAAADAAAAAEAAABEAAAADQAAAAEAAABFAAAABgAAABIAAAABAAAADwAAAAQAAAABAAAAEAAAAAUA +AAABAAAAEQAAAAYAAAABAAAAPgAAABQAAAABAAAAPwAAABUAAAABAAAAQAAAAAAAAAAEAAAABwAA +AAEAAAA6AAAACwAAAAEAAAA7AAAADAAAAAEAAAA8AAAADQAAAAEAAAA9AAAAAAAAAAYAAAASAAAA +AQAAADQAAAAEAAAAAQAAADUAAAAFAAAAAQAAADYAAAAGAAAAAQAAADcAAAAUAAAAAQAAADgAAAAV +AAAAAQAAADkAAAAAAAAABQAAAAkAAAABAAAAEgAAAAcAAAABAAAAMAAAAAsAAAABAAAAMQAAAAwA +AAABAAAAMgAAAA0AAAABAAAAMwAAAAYAAAAEAAAAAQAAABMAAAAFAAAAAQAAABQAAAAGAAAAAQAA +ABUAAAAUAAAAAQAAABYAAAAVAAAAAQAAABcAAAAQAAAAAQAAABgAAAAAAAAABgAAABIAAAABAAAA +KgAAAAQAAAABAAAAKwAAAAUAAAABAAAALAAAAAYAAAABAAAALQAAABQAAAABAAAALgAAABUAAAAB +AAAALwAAAAAAAAAFAAAACQAAAAEAAAAZAAAABwAAAAEAAAAmAAAACwAAAAEAAAAnAAAADAAAAAEA +AAAoAAAADQAAAAEAAAApAAAABgAAAAQAAAABAAAAGgAAAAUAAAABAAAAGwAAAAYAAAABAAAAHAAA +ABQAAAABAAAAHQAAABUAAAABAAAAHgAAABAAAAABAAAAHwAAAAAAAAAGAAAABAAAAAEAAAAgAAAA +BQAAAAEAAAAhAAAABgAAAAEAAAAiAAAAFAAAAAEAAAAjAAAAFQAAAAEAAAAkAAAAEAAAAAEAAAAl +AAAAAAAAAAQAAAADAAAAAQAAAE0AAAAhAAAAAQAAAE4AAAAiAAAAAQAAAE8AAAAXAAAAAQAAAFAA +AAAAAAAABAAAAAMAAAABAAAAUQAAACEAAAABAAAAUgAAACIAAAABAAAAUwAAABcAAAABAAAAVAAA +AAAAAAAEAAAAAwAAAAEAAABVAAAAIQAAAAEAAABWAAAAIgAAAAEAAABXAAAAFwAAAAEAAABYAAAA +AAAAAAQAAAADAAAAAQAAAFkAAAAhAAAAAQAAAFoAAAAiAAAAAQAAAFsAAAAXAAAAAQAAAFwAAAAA +AAAABAAAAAMAAAABAAAAXQAAACEAAAABAAAAXgAAACIAAAABAAAAXwAAABcAAAABAAAAYAAAAAAA +AAAEAAAAAwAAAAEAAABhAAAAIQAAAAEAAABiAAAAIgAAAAEAAABjAAAAFwAAAAEAAABkAAAAAAAA +AAQAAAADAAAAAQAAAGUAAAAhAAAAAQAAAGYAAAAiAAAAAQAAAGcAAAAXAAAAAQAAAGgAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAEAAAA +AAAAAAUAAAAIAAAAAQAAAAIAAAABAAAAAAAAABAAAgB4MQAADgAAADgAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAAwAAAABgAAAAgA +AAAEAAAAAAAAAAUAAAAIAAAAAQAAAAIAAAABAAAAAAAAABAAAgB4MgAADgAAADgAAAAGAAAACAAA +AAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAQA4AAABIAAAA +BgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAAB +AAAAAQAAAAUAAAABAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEA +AAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAABQAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABwAA +AAEAAAABAAAAAAAAAAYAAAAcAAAAAAAA3QIAAAABAAAAAgAAAAQAAAAGAAAAAgAAAAAAAAAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +AABADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgA +AAAAAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAA +AAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAIAAAADAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAA +BQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAABQAAAAEAAAAO +AAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAA +AAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAA +ABgAAAAAAADdAgAAAAEAAAABAAAABAAAAAIAAAAOAAAAOAAAAAYAAAAIAAAABAAAAAAAAAAFAAAA +CAAAAAEAAAAGAAAAAQAAAAAAAAAQAAAABgAAAGIgfj0gMAAADgAAADgAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAABIAAAABgAAAAgA +AAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAA +AAgAAAABAAAADgAAADgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAABgAAAAEAAAAAAAAA +EAAAAAYAAABhID09IDAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYA +AAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAALAAAAAgAAAA4AAABIAAAABgAA +AAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAABIAAAABAAAAAAAAABAAAAASAAAAKGJeMikgLSA0KmEq +YyA9PSAwAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAACQAAAAgAAAAAAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEA +AAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAwAAAABAAAADgAAADgAAAAGAAAACAAA +AAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAQA4AAAA4AAAA +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8O +AAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAA +AAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAA +ABgAAAAAAADdAgAAAAEAAAABAAAADgAAAAIAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAA +CAAAAAEAAAAEAAAAAQAAAAAAAAAQAAQAYj49MA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAPAAAAAQAA +AA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAA +AAAAAAAA8D8OAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJ +AAAACAAAAAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEA +AAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAA +AAMAAAABAAAAAAAAABAAAwBiPDAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAI +AAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAA8AAAABAAAADgAAADgA +AAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADw +Pw4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAA +AAAAAAAA8D8OAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJ +AAAACAAAAAAAAAAAAPA/DgAAAFAAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAHAAAAAQAAAAEA +AAAAAAAABgAAABwAAAAAAADdAgAAAAEAAAACAAAAEAAAABEAAAACAAAAAAAAAA4AAAA4AAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +AABADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgA +AAAAAADdAgAAAAEAAAABAAAAAgAAAAMAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAA +AAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAPAAAAAQAAAA4AAABIAAAA +BgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAABEAAAABAAAAAAAAABAAAAARAAAAKGJeMikgLSA0 +KmEqYyA+IDAAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEA +AAAAAAAACQAAAAgAAAAAAAAAAAAAQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAA +AAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAwAAAABAAAADgAAADgAAAAGAAAA +CAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAA4 +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA +BEAOAAAAUAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAcAAAABAAAAAQAAAAAAAAAGAAAAHAAA +AAAAAN0CAAAAAQAAAAIAAAANAAAADgAAAAIAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAQA4AAAA4AAAABgAAAAgAAAAG +AAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAASAAAAAYA +AAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAA +AAEAAAACAAAAAwAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAA +AAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAwAAAABAAAADgAAADgAAAAGAAAACAAAAAQAAAAA +AAAABQAAAAgAAAABAAAABgAAAAEAAAAAAAAAEAAAAAYAAABhIH49IDAAAA4AAAA4AAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAASAAA +AAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAA +AQAAAAEAAAAKAAAAAQAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABBADgAAAFAAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAAHAAAAAQAAAAEAAAAAAAAABgAAABwAAAAAAADdAgAAAAEAAAACAAAACQAAAAsAAAACAAAA +AAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAI +AAAAAAAAAAAAAEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAA +AAAJAAAACAAAAAAAAAAAAABADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAA +AAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAAgAAAAMAAAAOAAAASAAAAAYAAAAIAAAA +DQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAK +AAAAAQAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkA +AAAIAAAAAAAAAAAA8D8OAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAA +AAAAAAAJAAAACAAAAAAAAAAAAPg/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAA +AQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACQAAAAIAAAAOAAAASAAAAAYAAAAI +AAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEA +AAAHAAAAAgAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +AAkAAAAIAAAAAAAAAAAAAEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAG +AAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAAAgAAAAMAAAAOAAAASAAAAAYA +AAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAA +AAEAAAAIAAAAAQAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAcAAAACAAAA +DgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAABAAAAAEAAAAAAAAAEAAEAC1jL2IO +AAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAAGAAAAAAA +AAAAAPA/AAAAAAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAA +AAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAQAAAACAAAADgAAAEgAAAAGAAAA +CAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAAB +AAAADQAAAAIAAAAOAAAAOAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAGAAAAAQAAAAAA +AAAQAAAABgAAAC1iLzIqYQAADgAAAEgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAwAA +AAEAAAAAAAAACQAAABgAAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8OAAAASAAAAAYAAAAIAAAA +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 +dXNoX3dpZHRoAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAAB +AAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEA +AAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAA +AAAAAAAJAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAAAkAAAAIAAAAAAAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAA +AAAAAQAAAAAAAAAJAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAADgAAADAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAGlADgAAADgAAAAGAAAA +CAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAABOQA4AAAA4 +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA +JEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAA +AAAAAAAAACRADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAA +CQAAAAgAAAAAAAAAAAA0QA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAAB +AAAAAAAAAAkAAAAIAAAAAAAAAAAAPkAOAAAA+AAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAFAAQABgAAAAEAAAASAAAAQ2VsbHMAR3JpZDEAR3JpZDIAAAAAAAAADgAA +ADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAA +MAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAw +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAAJAB +AAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAwAAAABAAAAPAAA +AENlbGwxAAAAAAAAAENlbGwyAAAAAAAAAHJlc3VsdAAAAAAAAHJlc3VsdF90ZXh0AGNvbG9yAAAA +AAAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJ +AAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkA +AAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAA +AAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAA +AAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAA +AAAADgAAAAgDAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABAA +AAABAAAAoAAAAEdyaWQwAAAAAAAAAAAAAABHcmlkMQAAAAAAAAAAAAAAR3JpZDIAAAAAAAAAAAAA +AGZ1bmN0aW9uX25hbWUAAABmdW5jdGlvbl9pbnB1dHMAc2V0dGluZ3MAAAAAAAAAAGNoZWNrZWQA +AAAAAAAAAABvcGVuAAAAAAAAAAAAAAAAZmlnAAAAAAAAAAAAAAAAAG11bHRpX21vZGUAAAAAAAAO +AAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4A +AAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAA +ADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAA +MAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAw +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAA +AAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAA +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAG +AAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAACIAAAABgAA +AAgAAAAJAAAAAAAAAAUAAAAIAAAAAQAAAFgAAAABAAAAAAAAAAIAAABYAAAAAAFJTQAAAAAOAAAA +SAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABQAAAAEAAAAF +AAAATUNPUwAAAAAOAAAAAAAAAA +__MWOPC_PART_BEGIN__ /simulink/bdmxdata/UserData_38.mxarray BASE64 +AAFJTQAAAAAOAAAAeAAAAAYAAAAIAAAAEQAAAAAAAAABAAAAAAAAAAEABABNQ09TAQAEAERhdGEO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAAABAAAABQAAAA4AAABISQAABgAAAAgAAAAJAAAAAAAAAAUAAAAIAAAAAQAA +ABhJAAABAAAAAAAAAAIAAAAYSQAAAAFJTQAAAAAOAAAAeEgAAAYAAAAIAAAAAgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABQAAAAEAAAAFAAAATUNPUwAAAAAOAAAAMEgAAAYAAAAI +AAAAEQAAAAAAAAABAAAAAAAAAAEABABNQ09TAQAAAA0AAABGaWxlV3JhcHBlcl9fAAAADgAAAPBH +AAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAACVAAAAAQAAAAEAAAAAAAAADgAAAPgNAAAGAAAACAAA +AAkAAAAAAAAABQAAAAgAAADIDQAAAQAAAAEAAAAAAAAAAgAAAMgNAAADAAAALAAAANgBAAA4AgAA +OAIAACAFAADQDAAAyA0AAAAAAAAAAAAAR3JpZDAAQ2VsbHMAQ2VsbDEAY29uZF90ZXh0AGNlbGxf +aW5kZXgAcGFyZW50X2dyaWQAY2VsbHMAR3JpZABwYXJlbnRfY2VsbABzcGxpdF9wYgBudW1fY2Vs +bHMAZ3JpZF9pbmRleAByR3JpZABuZXdfY2VsbF9wYgBkZWxldGVfY2VsbF9wYgBwYl9mbGFnAENl +bGwAc3ViZ3JpZABjb25kAHdpZHRoAGhlaWdodABncmlkX3BiAGNvbG9yAGNvbmRpdGlvbl90ZXh0 +X3dpZHRoAGNvbmRpdGlvbl90ZXh0X2hlaWdodABjb25kaXRpb25fdGV4dF94AGNvbmRpdGlvbl90 +ZXh0X3kAY29uZGl0aW9uX3RleHRfb2Zmc2V0AGdyaWRfcHVzaF93aWR0aABSR3JpZABHcmlkMQBH +cmlkMgBDZWxsMgByZXN1bHRfdGV4dABSQ2VsbAByZXN1bHQAZnVuY3Rpb25fbmFtZQBmdW5jdGlv +bl9pbnB1dHMAc2V0dGluZ3MAY2hlY2tlZABvcGVuAG11bHRpX21vZGUARGF0YQBmaWcAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAB4AAAAA +AAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAeAAAAAwAAAAAAAAAAAAAAAAAAAAIAAAAdAAAABAAA +AAAAAAAAAAAAAAAAAAMAAAARAAAAAgAAAAAAAAAAAAAAAAAAAAQAAAADAAAAAQAAAAAAAAAAAAAA +AAAAAAUAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAYAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAcAAAAQ +AAAAAQAAAAAAAAAAAAAAAAAAAAgAAAAPAAAAAgAAAAAAAAAAAAAAAAAAAAkAAAANAAAAAQAAAAAA +AAAAAAAAAAAAAAoAAAAMAAAAAgAAAAAAAAAAAAAAAAAAAAsAAAALAAAAAQAAAAAAAAAAAAAAAAAA +AAwAAAAKAAAAAgAAAAAAAAAAAAAAAAAAAA0AAAAEAAAAAgAAAAAAAAAAAAAAAAAAAA4AAAAFAAAA +AgAAAAAAAAAAAAAAAAAAAA8AAAAJAAAAAQAAAAAAAAAAAAAAAAAAABAAAAAIAAAAAgAAAAAAAAAA +AAAAAAAAABEAAAAGAAAAAgAAAAAAAAAAAAAAAAAAABIAAAAHAAAAAgAAAAAAAAAAAAAAAAAAABMA +AAAOAAAABAAAAAAAAAAAAAAAAAAAABQAAAASAAAABAAAAAAAAAAAAAAAAAAAABUAAAATAAAABAAA +AAAAAAAAAAAAAAAAABYAAAAUAAAABAAAAAAAAAAAAAAAAAAAABcAAAAVAAAABAAAAAAAAAAAAAAA +AAAAABgAAAAWAAAABAAAAAAAAAAAAAAAAAAAABkAAAAXAAAABAAAAAAAAAAAAAAAAAAAABoAAAAY +AAAABAAAAAAAAAAAAAAAAAAAABsAAAAZAAAABAAAAAAAAAAAAAAAAAAAABwAAAAaAAAABAAAAAAA +AAAAAAAAAAAAAB0AAAAbAAAABAAAAAAAAAAAAAAAAAAAAB4AAAAcAAAAAAAAAAAAAAAJAAAAAQAA +AAEAAACIAAAAHwAAAAEAAACJAAAAIAAAAAEAAACKAAAAJQAAAAEAAACLAAAAJgAAAAEAAACMAAAA +JwAAAAEAAACNAAAAKAAAAAEAAACOAAAAKQAAAAEAAACPAAAAKgAAAAEAAACQAAAAAwAAAAIAAAAB +AAAAhQAAAB8AAAABAAAAhgAAACAAAAABAAAAhwAAAAQAAAADAAAAAQAAAAwAAAAhAAAAAQAAAFYA +AAAiAAAAAQAAAFcAAAAXAAAAAQAAAFgAAAAAAAAABAAAAAQAAAABAAAAAAAAAAUAAAABAAAAAQAA +AAYAAAABAAAACgAAABAAAAABAAAACwAAAAAAAAAEAAAABwAAAAEAAAAGAAAACwAAAAEAAAAHAAAA +DAAAAAEAAAAIAAAADQAAAAEAAAAJAAAAAAAAAAQAAAAEAAAAAQAAAAIAAAAFAAAAAQAAAAMAAAAG +AAAAAQAAAAQAAAAQAAAAAQAAAAUAAAAAAAAABgAAAAQAAAABAAAADQAAAAUAAAABAAAADgAAAAYA +AAABAAAAUgAAABQAAAABAAAAUwAAABUAAAABAAAAVAAAABAAAAABAAAAVQAAAAAAAAAFAAAACQAA +AAEAAABHAAAABwAAAAEAAABOAAAACwAAAAEAAABPAAAADAAAAAEAAABQAAAADQAAAAEAAABRAAAA +BgAAABIAAAABAAAADwAAAAQAAAABAAAAEAAAAAUAAAABAAAAEQAAAAYAAAABAAAARAAAABQAAAAB +AAAARQAAABUAAAABAAAARgAAAAAAAAAEAAAABwAAAAEAAABAAAAACwAAAAEAAABBAAAADAAAAAEA +AABCAAAADQAAAAEAAABDAAAAAAAAAAYAAAASAAAAAQAAADoAAAAEAAAAAQAAADsAAAAFAAAAAQAA +ADwAAAAGAAAAAQAAAD0AAAAUAAAAAQAAAD4AAAAVAAAAAQAAAD8AAAAAAAAABQAAAAkAAAABAAAA +EgAAAAcAAAABAAAANgAAAAsAAAABAAAANwAAAAwAAAABAAAAOAAAAA0AAAABAAAAOQAAAAYAAAAE +AAAAAQAAABMAAAAFAAAAAQAAABQAAAAGAAAAAQAAABUAAAAUAAAAAQAAABYAAAAVAAAAAQAAABcA +AAAQAAAAAQAAABgAAAAAAAAABgAAAAQAAAABAAAAGQAAAAUAAAABAAAAGgAAAAYAAAABAAAAGwAA +ABQAAAABAAAAHAAAABUAAAABAAAAHQAAABAAAAABAAAAHgAAAAAAAAAGAAAAEgAAAAEAAAAwAAAA +BAAAAAEAAAAxAAAABQAAAAEAAAAyAAAABgAAAAEAAAAzAAAAFAAAAAEAAAA0AAAAFQAAAAEAAAA1 +AAAAAAAAAAUAAAAJAAAAAQAAAB8AAAAHAAAAAQAAACwAAAALAAAAAQAAAC0AAAAMAAAAAQAAAC4A +AAANAAAAAQAAAC8AAAAGAAAABAAAAAEAAAAgAAAABQAAAAEAAAAhAAAABgAAAAEAAAAiAAAAFAAA +AAEAAAAjAAAAFQAAAAEAAAAkAAAAEAAAAAEAAAAlAAAAAAAAAAYAAAAEAAAAAQAAACYAAAAFAAAA +AQAAACcAAAAGAAAAAQAAACgAAAAUAAAAAQAAACkAAAAVAAAAAQAAACoAAAAQAAAAAQAAACsAAAAA +AAAABgAAAAQAAAABAAAASAAAAAUAAAABAAAASQAAAAYAAAABAAAASgAAABQAAAABAAAASwAAABUA +AAABAAAATAAAABAAAAABAAAATQAAAAAAAAAEAAAAAwAAAAEAAABZAAAAIQAAAAEAAABaAAAAIgAA +AAEAAABbAAAAFwAAAAEAAABcAAAAAAAAAAQAAAADAAAAAQAAAF0AAAAhAAAAAQAAAF4AAAAiAAAA +AQAAAF8AAAAXAAAAAQAAAGAAAAAAAAAABAAAAAMAAAABAAAAYQAAACEAAAABAAAAYgAAACIAAAAB +AAAAYwAAABcAAAABAAAAZAAAAAAAAAAEAAAAAwAAAAEAAABlAAAAIQAAAAEAAABmAAAAIgAAAAEA +AABnAAAAFwAAAAEAAABoAAAAAAAAAAQAAAADAAAAAQAAAGkAAAAhAAAAAQAAAGoAAAAiAAAAAQAA +AGsAAAAXAAAAAQAAAGwAAAAAAAAABAAAAAMAAAABAAAAbQAAACEAAAABAAAAbgAAACIAAAABAAAA +bwAAABcAAAABAAAAcAAAAAAAAAAEAAAAAwAAAAEAAABxAAAAIQAAAAEAAAByAAAAIgAAAAEAAABz +AAAAFwAAAAEAAAB0AAAAAAAAAAQAAAADAAAAAQAAAHUAAAAhAAAAAQAAAHYAAAAiAAAAAQAAAHcA +AAAXAAAAAQAAAHgAAAAAAAAABAAAAAMAAAABAAAAeQAAACEAAAABAAAAegAAACIAAAABAAAAewAA +ABcAAAABAAAAfAAAAAAAAAAEAAAAAwAAAAEAAAB9AAAAIQAAAAEAAAB+AAAAIgAAAAEAAAB/AAAA +FwAAAAEAAACAAAAAAAAAAAQAAAADAAAAAQAAAIEAAAAhAAAAAQAAAIIAAAAiAAAAAQAAAIMAAAAX +AAAAAQAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAA4AAABAAAAABgAAAAgA +AAAEAAAAAAAAAAUAAAAIAAAAAQAAAAkAAAABAAAAAAAAABAAAAAJAAAAeDE6c2luZ2xlAAAAAAAA +AA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAA +AAAAAAAA8D8OAAAAQAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAJAAAAAQAAAAAAAAAQ +AAAACQAAAHgyOnNpbmdsZQAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAABADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAABQAAAAEAAAAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +APA/DgAAAFAAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAHAAAAAQAAAAEAAAAAAAAABgAAABwA +AAAAAADdAgAAAAEAAAACAAAABAAAAAYAAAACAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAAOAAAAAYAAAAIAAAA +BgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAAEgAAAAG +AAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEA +AAABAAAAAgAAAAMAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAA +AAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAFAAAAAQAAAA4AAAA4AAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAASAAAAAYAAAAI +AAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEA +AAAEAAAAAgAAAA4AAAA4AAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAYAAAABAAAAAAAA +ABAAAAAGAAAAYiB+PSAwAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAA +AQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAG +AAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACAAAAAEAAAAOAAAAOAAAAAYA +AAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAGAAAAAQAAAAAAAAAQAAAABgAAAGEgPT0gMAAADgAA +ADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAA +AADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAY +AAAAAAAA3QIAAAABAAAAAQAAAAsAAAACAAAADgAAAEgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgA +AAABAAAAEgAAAAEAAAAAAAAAEAAAABIAAAAoYipiKSAtIDQqYSpjID09IDAAAAAAAAAOAAAAOAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/ +DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAA +AADdAgAAAAEAAAABAAAADAAAAAEAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEA +AAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAABADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAA4AAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAASAAAAAYAAAAI +AAAABAAAAAAAAAAFAAAACAAAAAEAAAARAAAAAQAAAAAAAAAQAAAAEQAAAChiKmIpIC0gNCphKmMg +PCAwAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +AAkAAAAIAAAAAAAAAAAAAEAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +AQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAMAAAAAQAAAA4AAAA4AAAABgAAAAgAAAAG +AAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAAOAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAA +ADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAA +AADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAY +AAAAAAAA3QIAAAABAAAAAQAAAA8AAAACAAAADgAAADgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgA +AAABAAAABgAAAAEAAAAAAAAAEAAAAAYAAABiID49IDAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAASAAAAAYAAAAIAAAA +DQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAQ +AAAAAQAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkA +AAAIAAAAAAAAAAAA8D8OAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAA +AAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAA4AAAABgAAAAgAAAAEAAAAAAAAAAUAAAAI +AAAAAQAAAAUAAAABAAAAAAAAABAAAAAFAAAAYiA8IDAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAABADgAAAEgAAAAGAAAACAAA +AA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAA +EAAAAAEAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJ +AAAACAAAAAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEA +AAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAUAAAAAYAAAAIAAAADQAAAAAAAAAFAAAA +CAAAAAcAAAABAAAAAQAAAAAAAAAGAAAAHAAAAAAAAN0CAAAAAQAAAAIAAAARAAAAEgAAAAIAAAAA +AAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgA +AAAAAAAAAAAAQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +AAkAAAAIAAAAAAAAAAAACEAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +AQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAACAAAAAwAAAA4AAABIAAAABgAAAAgAAAAN +AAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAABAA +AAABAAAADgAAAEgAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAEQAAAAEAAAAAAAAAEAAA +ABEAAAAoYipiKSAtIDQqYSpjID4gMAAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAhADgAAAEgAAAAGAAAACAAAAA0AAAAA +AAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAADAAAAAEA +AAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAA +AAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAA +CQAAAAgAAAAAAAAAAAAEQA4AAABQAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAACAAAAAEAAAAB +AAAAAAAAAAYAAAAgAAAAAAAA3QIAAAABAAAAAwAAAA0AAAAOAAAADwAAAAIAAAAOAAAAOAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAhADgAA +ADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAA +AAAAQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAY +AAAAAAAA3QIAAAABAAAAAQAAAAIAAAADAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgA +AAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAADAAAAAEAAAAOAAAAOAAA +AAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAGAAAAAQAAAAAAAAAQAAAABgAAAGEgfj0gMAAA +DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAA +AAAAAAAAQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYA +AAAYAAAAAAAA3QIAAAABAAAAAQAAAAoAAAABAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAA +AAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAA4AAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAFEAOAAAAUAAAAAYAAAAI +AAAADQAAAAAAAAAFAAAACAAAAAcAAAABAAAAAQAAAAAAAAAGAAAAHAAAAAAAAN0CAAAAAQAAAAIA +AAAJAAAACwAAAAIAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAA +AAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAEAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAF +AAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAACAAAAAwAAAA4A +AABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA +3QIAAAABAAAAAQAAAAoAAAABAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAABEAOAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAJAAAAAgAA +AA4AAAA4AAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAYAAAABAAAAAAAAABAAAAAGAAAA +YiA9PSAwAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJ +AAAACAAAAAAAAAAAAABADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEA +AAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACAAAAAEAAAAOAAAAOAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAABADgAAADgAAAAGAAAA +CAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADwPw4AAAA4 +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA +8D8OAAAAUAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAcAAAABAAAAAQAAAAAAAAAGAAAAHAAA +AAAAAN0CAAAAAQAAAAIAAAAHAAAAEwAAAAIAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAQA4AAAA4AAAABgAAAAgAAAAG +AAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAASAAAAAYA +AAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAA +AAEAAAACAAAAAwAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAA +AAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAgAAAABAAAADgAAADgAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAQA4AAAA4AAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAOAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/ +DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAA +AADdAgAAAAEAAAABAAAABwAAAAIAAAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEA +AAAEAAAAAQAAAAAAAAAQAAQALWMvYg4AAABIAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAA +AAMAAAABAAAAAAAAAAkAAAAYAAAAAAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/DgAAAEgAAAAGAAAA +CAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAAB +AAAABAAAAAIAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAA +AAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAATAAAAAgAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAA +AAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAABAAAwBOYU4ADgAAAEgAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAABAAAAAwAAAAEAAAAAAAAACQAAABgAAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8O +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAAAEAAAAAgAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAA +AAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAA0AAAACAAAADgAAADgAAAAGAAAA +CAAAAAQAAAAAAAAABQAAAAgAAAABAAAABgAAAAEAAAAAAAAAEAAAAAYAAAAtYi8yKmEAAA4AAABI +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAAAkAAAAYAAAAAAAAAAAA +8D8AAAAAAADwPwAAAAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAA +AAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAABAAAAAIAAAAOAAAASAAAAAYAAAAIAAAA +DQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAO +AAAAAgAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAABAA +AwBOYU4ADgAAAEgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAACQAA +ABgAAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAA +CAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAEAAAAAgAAAA4AAABI +AAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIA +AAABAAAAAQAAABEAAAACAAAADgAAAFAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAHgAA +AAEAAAAAAAAAEAAAAB4AAAAoLWIgLSBzcXJ0KGIqYiAtIDQqYSpjKSkgLyAyKmEAAA4AAABIAAAA +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAAAkAAAAYAAAAAAAAAAAA8D8A +AAAAAADwPwAAAAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEA +AAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAABAAAAAIAAAAOAAAASAAAAAYAAAAIAAAADQAA +AAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAASAAAA +AgAAAA4AAABQAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAB4AAAABAAAAAAAAABAAAAAe +AAAAKC1iICsgc3FydChiKmIgLSA0KmEqYykpIC8gMiphAAAOAAAASAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAAGAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAADw +Pw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAA +AAAA3QIAAAABAAAAAQAAAAYAAAACAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAG +AAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAABwAAAAIAAAAOAAAAMAAAAAYA +AAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAQAAMATmFOAA4AAABIAAAABgAA +AAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAAAkAAAAYAAAAAAAAAAAA8D8AAAAA +AADwPwAAAAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAA +AAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAABgAAAAIAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAATAAAAAgAA +AA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAABAAAwBOYU4A +DgAAAEgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAACQAAABgAAAAA +AAAAAADwPwAAAAAAAPA/AAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYA +AAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAGAAAAAgAAAA4AAABIAAAABgAA +AAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAA +AQAAAA0AAAACAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAA +AAAAEAADAE5hTgAOAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAA +AAAJAAAAGAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAYAAAACAAAA +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 +BQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAAAOAAAAOAAAAAYAAAAI +AAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAADgAAADAA +AAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAOAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAA +DgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAO +AAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAA +AAAAAGlADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAA +AAgAAAAAAAAAAABOQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAAAkAAAAIAAAAAAAAAAAAJEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAB +AAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAACRADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgA +AAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAA0QA4AAAA4AAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAPkAOAAAA+AAAAAYAAAAIAAAA +AgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABgAAAAEAAAASAAAAQ2VsbHMAR3Jp +ZDEAR3JpZDIAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEA +AAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAA +AAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAA +AAAAAAkAAAAAAAAADgAAAJABAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAABQAEAAwAAAABAAAAPAAAAENlbGwxAAAAAAAAAENlbGwyAAAAAAAAAHJlc3VsdAAAAAAAAHJl +c3VsdF90ZXh0AGNvbG9yAAAAAAAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAA +AAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAA +AAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAA +AAAAAAABAAAAAAAAAAkAAAAAAAAADgAAAAgDAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAABQAEABAAAAABAAAAoAAAAEdyaWQwAAAAAAAAAAAAAABHcmlkMQAAAAAAAAAA +AAAAR3JpZDIAAAAAAAAAAAAAAGZ1bmN0aW9uX25hbWUAAABmdW5jdGlvbl9pbnB1dHMAc2V0dGlu +Z3MAAAAAAAAAAGNoZWNrZWQAAAAAAAAAAABvcGVuAAAAAAAAAAAAAAAAZmlnAAAAAAAAAAAAAAAA +AG11bHRpX21vZGUAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAA +AQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAAB +AAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEA +AAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAA +AAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAA +AAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAA +AAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAA +AAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAA +AAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAA +CQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJ +AAAAAAAAAA4AAACIAAAABgAAAAgAAAAJAAAAAAAAAAUAAAAIAAAAAQAAAFgAAAABAAAAAAAAAAIA +AABYAAAAAAFJTQAAAAAOAAAASAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAA +AAAAAAAFAAQABQAAAAEAAAAFAAAATUNPUwAAAAAOAAAAAAAAAA +__MWOPC_PART_BEGIN__ /simulink/blockdiagram.xml + + + +

05765f89-bb6f-43d7-b675-5de03ebe80a7

+

maci64

+ +

%<Auto>

+

%<Auto>

+

573581337

+

%<AutoIncrement:24.0>

+
+ +

none

+
+ +

normal

+ +

$bdroot

+ + $bdroot + + + + +
+
+ +

warning

+
+ + +

Ensure deterministic transfer (maximum delay)

+

Ensure data integrity only

+

Ensure deterministic transfer (minimum delay)

+

None

+
+
+ +
+
+ +__MWOPC_PART_BEGIN__ /simulink/configSet0.xml + + + +

[]

+

+ + +

[]

+

+

[]

+

0.0

+

10.0

+

auto

+

on

+

auto

+

auto

+

5

+

auto

+

10*128*eps

+

1000

+

4

+

1

+

auto

+

auto

+

1

+

1e-3

+

on

+

off

+

off

+

VariableStepDiscrete

+

auto

+

auto

+

DisableAll

+

UseLocalSettings

+

Nonadaptive

+

TrustRegion

+

off

+

off

+

Fast

+

off

+

off

+

Unconstrained

+

Whenever possible

+

[]

+

off

+

off

+

ode3

+
+ +

[]

+

+

[]

+

1

+

[t, u]

+

xFinal

+

xInitial

+

on

+

1000

+

off

+

off

+

off

+

off

+

Array

+

ModelDataLogs

+

on

+

off

+

on

+

on

+

off

+

on

+

off

+

streamout

+

on

+

off

+

xout

+

tout

+

yout

+

logsout

+

dsmout

+

RefineOutputTimes

+

[]

+

out

+

1

+

off

+

timeseries

+

out.mat

+

[-inf, inf]

+
+ + + BooleansAsBitfields + PassReuseOutputArgsAs + PassReuseOutputArgsThreshold + ZeroExternalMemoryAtStartup + ZeroInternalMemoryAtStartup + OptimizeModelRefInitCode + NoFixptDivByZeroProtection + UseSpecifiedMinMax + EfficientTunableParamExpr + +

+

[]

+

on

+

on

+

on

+

Tunable

+

off

+

off

+

off

+

off

+

double

+

off

+

off

+

on

+

on

+

off

+

off

+

on

+

off

+

+

on

+

off

+

uint_T

+

Same as modeled

+

on

+

64

+

Structure reference

+

12

+

2147483647

+

on

+

5

+

off

+

off

+

Native Integer

+

on

+

on

+

off

+

off

+

off

+

on

+

inf

+

Inherit from target

+

on

+

off

+

off

+

off

+

on

+

on

+

off

+

off

+

level2

+

Balanced

+

on

+

off

+

off

+

GradualUnderflow

+

off

+
+ + + UseOnlyExistingSharedCode + +

+

[]

+

error

+

none

+

none

+

none

+

error

+

none

+

UseLocalSettings

+

UseLocalSettings

+

UseLocalSettings

+

warning

+

warning

+

warning

+

warning

+

on

+

Classic

+

none

+

off

+

UseLocalSettings

+

warning

+

warning

+

none

+

error

+

warning

+

warning

+

warning

+

warning

+

error

+

error

+

error

+

none

+

warning

+

none

+

warning

+

none

+

warning

+

warning

+

error

+

error

+

none

+

warning

+

warning

+

none

+

none

+

none

+

none

+

none

+

none

+

warning

+

none

+

warning

+

warning

+

warning

+

error

+

none

+

error

+

none

+

warning

+

warning

+

UseLocalSettings

+

on

+

off

+

none

+

error

+

none

+

none

+

warning

+

warning

+

none

+

warning

+

error

+

warning

+

warning

+

error

+

none

+

warning

+

none

+

warning

+

ErrorLevel1

+

WarnAndRepair

+

none

+

warning

+

warning

+

error

+

error

+

none

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

error

+

warning

+

warning

+

none

+

warning

+

warning

+

all

+

warning

+

on

+

warning

+

warning

+

off

+

+

none

+

off

+

warning

+

none

+
+ +

[]

+

+

[]

+

8

+

16

+

32

+

32

+

64

+

32

+

64

+

32

+

32

+

32

+

Char

+

None

+

Undefined

+

Unspecified

+

32

+

on

+

off

+

32-bit Generic

+

8

+

16

+

32

+

32

+

64

+

32

+

64

+

32

+

32

+

32

+

Char

+

None

+

on

+

off

+

Undefined

+

Unspecified

+

32

+

32

+

32

+

Specified

+

off

+

on

+

on

+

on

+

EmbeddedCoderHSP

+
+ +

[]

+

+

[]

+

IfOutOfDateOrStructuralChange

+

on

+

error

+

off

+

on

+

None

+

Multi

+

Infer from blocks in model

+

+

on

+

off

+

off

+

off

+
+ +

[]

+

+

[]

+

+

+

+

+

[]

+

+

+

+

+

+

+

on

+

on

+

on

+

off

+

off

+

off

+

off

+

off

+

on

+

50

+

on

+

on

+

on

+

65536

+

off

+

[]

+

NotSpecified

+

UseInterfaceOnly

+

off

+

None

+

+

generic

+

C

+

off

+

200

+

1024

+

off

+

+

+

mkl-dnn

+

on

+
+ + + IncludeHyperlinkInReport + GenerateTraceInfo + GenerateTraceReport + GenerateTraceReportSl + GenerateTraceReportSf + GenerateTraceReportEml + PortableWordSizes + GenerateWebview + GenerateCodeMetricsReport + GenerateCodeReplacementReport + GenerateMissedCodeReplacementReport + GenerateErtSFunction + CreateSILPILBlock + CodeExecutionProfiling + CodeProfilingSaveOptions + CodeProfilingInstrumentation + CodeStackProfiling + +

+

grt.tlc

+

None

+

off

+

off

+

+

off

+

make_rtw

+

on

+

off

+

+

grt_default_tmf

+

+

off

+

on

+

off

+

[]

+

off

+

off

+

off

+

off

+

off

+

off

+

+

+

+

+

+

+

+

+

+

+

+

Automatically locate an installed toolchain

+

Faster Builds

+

[]

+

off

+

off

+

off

+

None

+

off

+

executionProfile

+

SummaryOnly

+

off

+

off

+

C

+

None

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

[]

+

+

Off

+

1024

+

+

-1

+

discrete

+

200

+

off

+

1024

+

on

+

on

+

on

+

off

+

3.5

+

+

+

0

+

none

+

on

+

19.05

+

unspecified

+ + + + IgnoreCustomStorageClasses + IgnoreTestpoints + InsertBlockDesc + SFDataObjDesc + SimulinkDataObjDesc + DefineNamingRule + SignalNamingRule + ParamNamingRule + InlinedPrmAccess + CustomSymbolStr + CustomSymbolStrGlobalVar + CustomSymbolStrType + CustomSymbolStrField + CustomSymbolStrFcn + CustomSymbolStrFcnArg + CustomSymbolStrBlkIO + CustomSymbolStrTmpVar + CustomSymbolStrMacro + ReqsInCode + BlockCommentType + InsertPolySpaceComments + MATLABFcnDesc + InternalIdentifier + CustomSymbolStrModelFcn + CustomSymbolStrUtil + CustomSymbolStrEmxType + CustomSymbolStrEmxFcn + CustomUserTokenString + +

+

[]

+

+

off

+

on

+

Auto

+

on

+

off

+

31

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

1

+

8

+

$R$N$M

+

$N$R$M_T

+

$N$M

+

$R$N$M$F

+

$R$N

+

rt$I$N$M

+

rtb_$N$M

+

$N$M

+

$R$N$M

+

$N$C

+

emxArray_$M$N

+

emx$M$N

+

+

+

None

+

+

None

+

+

None

+

+

off

+

off

+

on

+

BlockPathComment

+

on

+

off

+

off

+

+

Shortened

+

Literals

+

off

+

off

+

[]

+

error

+
+ + + GeneratePreprocessorConditionals + IncludeMdlTerminateFcn + RemoveResetFunc + SuppressErrorStatus + ERTCustomFileBanners + GenerateSampleERTMain + GenerateTestInterfaces + ModelStepFunctionPrototypeControlCompliant + CPPClassGenCompliant + PreserveStateflowLocalDataDimensions + PurelyIntegerCode + PortableWordSizes + SupportComplex + SupportAbsoluteTime + SupportContinuousTime + SupportNonInlinedSFcns + GenerateAllocFcn + ExistingSharedCode + ParenthesesLevel + ERTMultiwordTypeDef + MultiwordTypeDef + RemoveDisableFunc + +

+

[]

+

ansi_tfl_table_tmw.mat

+

+

+

NOT IN USE

+

C89/C90 (ANSI)

+

None

+

Auto

+

System defined

+

2048

+

256

+

on

+

off

+

+

off

+

off

+

on

+

on

+

on

+

on

+

on

+

off

+

off

+

off

+

off

+

Auto

+

off

+

on

+

rt_

+

on

+

Nonreusable function

+

off

+

on

+

on

+

on

+

on

+

off

+

off

+

off

+

Nominal

+

Nominal

+

Simulink.SoftwareTarget.GRTCustomization

+

off

+

on

+

off

+

off

+

on

+

off

+

on

+

on

+

[]

+

[]

+

1,2,3,4,...

+

Size,Breakpoints,Table

+

Size,Breakpoints,Table

+

Column-major

+

error

+

$R$E

+

$R$E

+

$R_data

+ + None + +

off

+

off

+

off

+

off

+

1000000

+

0

+

ext_comm

+

+

Level1

+

off

+

off

+

off

+

off

+

off

+

Error

+
+
+
+ +

[]

+

Simulink Coverage Configuration Component

+

[]

+

Simulink Coverage

+

off

+

EntireSystem

+

on

+

off

+

/

+

covdata

+

+

dw

+

+

+

off

+

on

+

on

+

on

+

on

+

covCumulativeData

+

off

+

on

+

slcov_output/$ModelName$

+

$ModelName$_cvdata

+

on

+

off

+

+

off

+

on

+

1e-05

+

0.01

+

off

+

0

+

0

+

Masking

+
+
+

Configuration

+

Solver

+

[ 200, 74, 1080, 704 ]

+

+

+
+ +__MWOPC_PART_BEGIN__ /simulink/configSetInfo.xml + + + Configuration + + +__MWOPC_PART_BEGIN__ /simulink/graphicalInterface.xml + + +

0

+

0

+

+

0

+

0

+

0

+

0

+

0

+

0

+

0

+

Unset

+

0

+

Simulink

+

0

+

0

+

1

+
+ +__MWOPC_PART_BEGIN__ /simulink/modelDictionary.xml + + + + + + +__MWOPC_PART_BEGIN__ /simulink/ScheduleCore.xml + + + + HighNumberLast + + true + + + + + false + Default + -2147483648 + + + true + + false + 1 + true + FiM + 40 + + FiM + -2139062017 + true + ZOHContinuous01 + + 1.0 + 0.0 + + 0 + + + + + + +__MWOPC_PART_BEGIN__ /simulink/ScheduleEditor.xml + + + + + + 40 + + #808080 + true + [0, 1] + FiM + + FiM + base + + + FiM + + + + Default + + + + + + 0,0 + 0,0,0,0 + + FiM + base + + 0,0 + + FiM + graph.Graph + + + + Default + graph.Graph + + +__MWOPC_PART_BEGIN__ /simulink/stateflow/_rels/machine.xml.rels + + + + + + +__MWOPC_PART_BEGIN__ /simulink/stateflow/chart_10.xml + + +

quad_fcn_fp/code

+

[293 257 161 328]

+

[0 156.75 0 153.75]

+

[1 1 1280 778 1.25]

+

10

+

LIBRARY_TOOLBAR

+

8

+

CLUSTER_CHART

+

EML_CHART

+

1

+

1

+ +

quad_fcn_fp

+
+ + +

eML_blk_kernel()

+

[18 64.5 118 66]

+

12

+

SUBCHART

+

10

+

FUNC_STATE

+

CLUSTER_STATE

+ +

1

+

function [x1,x2] = quad_fcn_fp(a,b,c) +%%#eml +x1=-c/b; +x2=NaN; +if(a == 0) + if(b ~= 0) + x1 = -c/b; + x2 = NaN; + elseif(b == 0) + x1 = NaN; + x2 = NaN; + end +elseif(a ~= 0) + if((b*b) - 4*a*c == 0) + x1 = -b/2*a; + x2 = NaN; + elseif((b*b) - 4*a*c < 0) + x1 = NaN; + x2 = NaN; + elseif((b*b) - 4*a*c > 0) + if(b >= 0) + x1 = (-b - sqrt(b*b - 4*a*c)) / 2*a; + x2 = c / (a* ((-b - sqrt(b*b - 4*a*c)) / 2*a)); + elseif(b < 0) + x1 = (-b + sqrt(b*b - 4*a*c)) / 2*a; + x2 = c / (a* ((-b + sqrt(b*b - 4*a*c)) / 2*a)); + end + end +end +

+

Matrix(4,1) +[205.0, 227.0, 1080.0, 733.0]

+

1

+
+
+ +

INPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+
+

SF_COMPLEX_INHERITED

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

OUTPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_NO

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

INPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+

1

+

16

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_INHERITED

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

INPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+

1

+

16

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_INHERITED

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

OUTPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+

1

+

16

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_NO

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

{eML_blk_kernel();}

+

[32.125 19.875 102.544 14.964]

+

12

+ +

[0 0 1 0 23.5747 14.625 0 0]

+
+ +

3

+

[1 0 -1 0 23.5747 42.5747 0 0]

+
+

[23.5747 24.9468]

+

[23.575 23.575 14.625 34.575]

+

10

+

SMART

+ +

BOTH_STICK

+
+

1

+
+ +

[23.5747 49.5747 7]

+

10

+

CONNECTIVE_JUNCTION

+
+
+
+ +__MWOPC_PART_BEGIN__ /simulink/stateflow/chart_20.xml + + +

quad_fcn_subtype/code

+

[293 257 161 328]

+

[0 156.75 0 153.75]

+

[1 1 1280 778 1.25]

+

20

+

LIBRARY_TOOLBAR

+

8

+

CLUSTER_CHART

+

EML_CHART

+

2

+

1

+ +

quad_fcn_subtype

+
+ + +

eML_blk_kernel()

+

[18 64.5 118 66]

+

12

+

SUBCHART

+

20

+

FUNC_STATE

+

CLUSTER_STATE

+ +

1

+

function [x1,x2] = quad_fcn_subtype(c,a,b) +%%#eml +x1=-c/b; +x2=-c/b; +if(a == 0) + if(b ~= 0) + x1 = -c/b; + x2 = -c/b; + end +elseif(a ~= 0) + if((b^2) - 4*a*c == 0) + x1 = -b/2*a; + x2 = -b/2*a; + elseif((b^2) - 4*a*c > 0) + if(b>=0) + x1 = (-b - sqrt(b^2 - 4*a*c)) / 2*a; + x2 = c / (a* ((-b - sqrt(b^2 - 4*a*c)) / 2*a)); + elseif(b<0) + x1 = (-b + sqrt(b^2 - 4*a*c)) / 2*a; + x2 = c / (a* ((-b + sqrt(b^2 - 4*a*c)) / 2*a)); + end + end +end +

+

Matrix(4,1) +[205.0, 227.0, 1080.0, 733.0]

+

1

+
+
+ +

INPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+
+

SF_COMPLEX_INHERITED

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

OUTPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_NO

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

INPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+

1

+

16

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_INHERITED

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

INPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+

1

+

16

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_INHERITED

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

OUTPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+

1

+

16

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_NO

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

{eML_blk_kernel();}

+

[32.125 19.875 102.544 14.964]

+

12

+ +

[0 0 1 0 23.5747 14.625 0 0]

+
+ +

3

+

[1 0 -1 0 23.5747 42.5747 0 0]

+
+

[23.5747 24.9468]

+

[23.575 23.575 14.625 34.575]

+

20

+

SMART

+ +

BOTH_STICK

+
+

1

+
+ +

[23.5747 49.5747 7]

+

20

+

CONNECTIVE_JUNCTION

+
+
+
+ +__MWOPC_PART_BEGIN__ /simulink/stateflow/machine.xml + + + +

80000046

+ + +

Default Simulink S-Function Target.

+
+ + +
+
+ +

9

+

quad_fcn_fp/code

+

10

+
+ +

9

+

quad_fcn_subtype/code

+

20

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/_rels/system_1.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/systems/_rels/system_38.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/systems/_rels/system_root.xml.rels + + + + + + +__MWOPC_PART_BEGIN__ /simulink/systems/system_1.xml + + +

[395, 327, 933, 805]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

off

+

Deduce

+

Simulink

+ +

[35, 38, 65, 52]

+

-1

+
+ +

[35, 38, 65, 52]

+

-2

+

2

+
+ +

[35, 38, 65, 52]

+

-3

+

3

+
+ +

[3, 2]

+

[250, 51, 320, 99]

+

-4

+

1.31

+

Stateflow.Translate.translate

+

ExplicitOnly

+

on

+

off

+

MATLAB Function

+ +
+ +

[35, 53, 65, 67]

+

-5

+
+ +

[35, 53, 65, 67]

+

-6

+

2

+
+ +

1

+

4#out:1

+

3#in:1

+
+ +

2

+

5#out:1

+

3#in:2

+
+ +

3

+

6#out:1

+

3#in:3

+
+ +

4

+

3#out:1

+

8#in:1

+
+ +

5

+

3#out:2

+

9#in:1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/system_3.xml + + +

[219, 337, 814, 775]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

off

+

Deduce

+

27

+

13

+

Simulink

+ +

[20, 101, 40, 119]

+

-1

+
+ +

[20, 136, 40, 154]

+

-2

+

2

+
+ +

[20, 171, 40, 189]

+

-3

+

3

+
+ +

[1, 1]

+

[270, 230, 320, 270]

+

2

+

1

+
+ +

Stateflow S-Function 2

+

[3, 3]

+

[180, 100, 230, 180]

+

1

+

sf_sfun

+

[3 3]

+

off

+

on

+

off

+ +

2

+

x1

+
+ +

3

+

x2

+
+
+ +

[460, 241, 480, 259]

+

3

+
+ +

[460, 101, 480, 119]

+

-7

+
+ +

[460, 136, 480, 154]

+

-8

+

2

+
+ +

8

+

3::1#out:1

+

3::25#in:1

+
+ +

9

+

3::18#out:1

+

3::25#in:2

+
+ +

10

+

3::19#out:1

+

3::25#in:3

+
+ +

x1

+

11

+

[0, 0]

+

3::25#out:2

+

3::5#in:1

+
+ +

x2

+

12

+

[0, 0]

+

3::25#out:3

+

3::20#in:1

+
+ +

13

+

3::26#out:1

+

3::27#in:1

+
+ +

14

+

3::25#out:1

+

3::26#in:1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/system_38.xml + + +

[395, 327, 933, 805]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

off

+

Deduce

+

Simulink

+ +

[35, 38, 65, 52]

+

-1

+
+ +

[35, 38, 65, 52]

+

-2

+

2

+
+ +

[35, 38, 65, 52]

+

-3

+

3

+
+ +

[3, 2]

+

[250, 51, 320, 99]

+

-4

+

1.31

+

Stateflow.Translate.translate

+

ExplicitOnly

+

on

+

off

+

MATLAB Function

+ +
+ +

[35, 53, 65, 67]

+

-5

+
+ +

[35, 53, 65, 67]

+

-6

+

2

+
+ +

1

+

41#out:1

+

40#in:1

+
+ +

2

+

42#out:1

+

40#in:2

+
+ +

3

+

43#out:1

+

40#in:3

+
+ +

4

+

40#out:1

+

44#in:1

+
+ +

5

+

40#out:2

+

45#in:1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/system_40.xml + + +

[219, 337, 814, 775]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

off

+

Deduce

+

27

+

13

+

Simulink

+ +

[20, 101, 40, 119]

+

-1

+
+ +

[20, 136, 40, 154]

+

-2

+

2

+
+ +

[20, 171, 40, 189]

+

-3

+

3

+
+ +

[1, 1]

+

[270, 230, 320, 270]

+

2

+

1

+
+ +

Stateflow S-Function 1

+

[3, 3]

+

[180, 100, 230, 180]

+

1

+

sf_sfun

+

[3 3]

+

off

+

on

+

off

+ +

2

+

x1

+
+ +

3

+

x2

+
+
+ +

[460, 241, 480, 259]

+

3

+
+ +

[460, 101, 480, 119]

+

-7

+
+ +

[460, 136, 480, 154]

+

-8

+

2

+
+ +

8

+

40::1#out:1

+

40::25#in:1

+
+ +

9

+

40::18#out:1

+

40::25#in:2

+
+ +

10

+

40::19#out:1

+

40::25#in:3

+
+ +

x1

+

11

+

[0, 0]

+

40::25#out:2

+

40::5#in:1

+
+ +

x2

+

12

+

[0, 0]

+

40::25#out:3

+

40::20#in:1

+
+ +

13

+

40::26#out:1

+

40::27#in:1

+
+ +

14

+

40::25#out:1

+

40::26#in:1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/system_root.xml + + +

[470, 174, 1298, 794]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

on

+

off

+

Deduce

+

89

+

simulink-default.rpt

+

46

+

Simulink

+ +

[3, 1]

+

[170, 157, 180, 243]

+

-1

+

off

+

3

+

bar

+

on

+
+ +

[35, 105, 65, 135]

+

-2

+

4

+
+ +

[35, 185, 65, 215]

+

-3

+

-5

+
+ +

[30, 30, 60, 60]

+

-4

+
+ +

[1, 2]

+

[370, 156, 375, 194]

+

-5

+

off

+

2

+
+ +

[1]

+

[505, 20, 595, 50]

+

-6

+

1

+
+ +

[1]

+

[515, 215, 605, 245]

+

-7

+

1

+
+ +

[1]

+

[430, 295, 520, 325]

+

-8

+

1

+
+ +

[1]

+

[435, 350, 525, 380]

+

-9

+

1

+
+ +

[1, 1]

+

[235, 152, 325, 208]

+

-10

+

roots

+

2

+

off

+
+ +

[]

+

[485, 59, 515, 91]

+

-11

+ +

8,19

+

Demux:o2quad_fcn_subtype:o2

+
+

Simulink.scopes.TimeScopeBlockCfg('CurrentConfiguration', extmgr.ConfigurationSet(extmgr.Configuration('Core','General UI',true),extmgr.Configuration('Core','Source UI',true),extmgr.Configuration('Sources','WiredSimulink',true,'DataLoggingSaveFormat','StructureWithTime','DataLoggingLimitDataPoints',true,'DataLoggingDecimation','1','DataLoggingDecimateData',true),extmgr.Configuration('Visuals','Time Domain',true,'SerializedDisplays',{struct('MinYLimReal','0.9','MaxYLimReal','1.1','YLabelReal','','MinYLimMag','0.9','MaxYLimMag','1.1','LegendVisibility','off','XGrid',true,'YGrid',true,'PlotMagPhase',false,'AxesColor',[0 0 0],'AxesTickColor',[0.686274509803922 0.686274509803922 0.686274509803922],'ColorOrder',[1 1 0.0666666666666667;0.0745098039215686 0.623529411764706 1;1 0.411764705882353 0.16078431372549;0.392156862745098 0.831372549019608 0.0745098039215686;0.717647058823529 0.274509803921569 1;0.0588235294117647 1 1;1 0.0745098039215686 0.650980392156863],'Title','%<SignalLabel>','LinePropertiesCache',{{}},'UserDefinedChannelNames',{{}},'NumLines',2,'LineNames',{{'Demux/2','quad_fcn_subtype/x2'}},'ShowContent',true,'Placement',1)},'DisplayPropertyDefaults',struct('MinYLimReal','0.9','MaxYLimReal','1.1','YLabelReal','','MinYLimMag','0.9','MaxYLimMag','1.1','LegendVisibility','off','XGrid',true,'YGrid',true,'PlotMagPhase',false,'AxesColor',[0 0 0],'AxesTickColor',[0.686274509803922 0.686274509803922 0.686274509803922],'ColorOrder',[1 1 0.0666666666666667;0.0745098039215686 0.623529411764706 1;1 0.411764705882353 0.16078431372549;0.392156862745098 0.831372549019608 0.0745098039215686;0.717647058823529 0.274509803921569 1;0.0588235294117647 1 1;1 0.0745098039215686 0.650980392156863],'Title','%<SignalLabel>','LinePropertiesCache',{{}},'UserDefinedChannelNames',{{}},'NumLines',0,'LineNames',{{[]}},'ShowContent',true,'Placement',1)),extmgr.Configuration('Tools','Plot Navigation',true),extmgr.Configuration('Tools','Measurements',true,'Version','2021b')),'Version','2021b','Location',[361 434 685 673])

+

1

+

on

+
+ +

[]

+

[475, 158, 505, 192]

+

-12

+ +

8,19

+

Demux:o1quad_fcn_subtype:o1

+
+

Simulink.scopes.TimeScopeBlockCfg('CurrentConfiguration', extmgr.ConfigurationSet(extmgr.Configuration('Core','General UI',true),extmgr.Configuration('Core','Source UI',true),extmgr.Configuration('Sources','WiredSimulink',true,'DataLoggingVariableName','ScopeData1','DataLoggingSaveFormat','StructureWithTime','DataLoggingLimitDataPoints',true,'DataLoggingDecimation','1','DataLoggingDecimateData',true),extmgr.Configuration('Visuals','Time Domain',true,'SerializedDisplays',{struct('MinYLimReal','-6.00000','MaxYLimReal','-4.00000','YLabelReal','','MinYLimMag','0.00000','MaxYLimMag','6.00000','LegendVisibility','off','XGrid',true,'YGrid',true,'PlotMagPhase',false,'AxesColor',[0 0 0],'AxesTickColor',[0.686274509803922 0.686274509803922 0.686274509803922],'ColorOrder',[1 1 0.0666666666666667;0.0745098039215686 0.623529411764706 1;1 0.411764705882353 0.16078431372549;0.392156862745098 0.831372549019608 0.0745098039215686;0.717647058823529 0.274509803921569 1;0.0588235294117647 1 1;1 0.0745098039215686 0.650980392156863],'Title','%<SignalLabel>','LinePropertiesCache',{{}},'UserDefinedChannelNames',{{}},'NumLines',2,'LineNames',{{'Demux/1','quad_fcn_subtype/x1'}},'ShowContent',true,'Placement',1)},'DisplayPropertyDefaults',struct('MinYLimReal','-6.00000','MaxYLimReal','-4.00000','YLabelReal','','MinYLimMag','0.00000','MaxYLimMag','6.00000','LegendVisibility','off','XGrid',true,'YGrid',true,'PlotMagPhase',false,'AxesColor',[0 0 0],'AxesTickColor',[0.686274509803922 0.686274509803922 0.686274509803922],'ColorOrder',[1 1 0.0666666666666667;0.0745098039215686 0.623529411764706 1;1 0.411764705882353 0.16078431372549;0.392156862745098 0.831372549019608 0.0745098039215686;0.717647058823529 0.274509803921569 1;0.0588235294117647 1 1;1 0.0745098039215686 0.650980392156863],'Title','%<SignalLabel>','LinePropertiesCache',{{}},'UserDefinedChannelNames',{{}},'NumLines',0,'LineNames',{{[]}},'ShowContent',true,'Placement',1)),extmgr.Configuration('Tools','Plot Navigation',true),extmgr.Configuration('Tools','Measurements',true,'Version','2021b')),'Version','2021b','Location',[37 522 442 784])

+

1

+

on

+
+ +

[2, 1]

+

[455, 25, 475, 45]

+

-13

+

off

+

|+-

+
+ +

[2, 1]

+

[480, 220, 500, 240]

+

-14

+

off

+

|+-

+
+ +

[3, 2]

+

[555, 301, 720, 369]

+

-15

+

1.12

+

on

+

+

TTdiag Copy

+

TTdiag Delete

+

TTdiag Open Simulink

+

off

+ + port_label('input',1,'a');port_label('input',2,'b');port_label('input',3,'c');port_label('output',1,'x1');port_label('output',2,'x2');text(0.5, 0.9, 'Tabular Expression', 'horizontalAlignment', 'center');color('red');text(0.5, 0.1, 'Not Checked', 'horizontalAlignment', 'center') + Table Block + + +
+ +

[3, 2]

+

[185, 31, 350, 99]

+

-16

+

1.12

+

on

+

+

TTdiag Copy

+

TTdiag Delete

+

TTdiag Open Simulink

+

off

+ + port_label('input',1,'c');port_label('input',2,'a');port_label('input',3,'b');port_label('output',1,'x1');port_label('output',2,'x2');text(0.5, 0.9, 'Tabular Expression', 'horizontalAlignment', 'center');color('red');text(0.5, 0.1, 'Not Checked', 'horizontalAlignment', 'center') + Table Block + + +
+ +

1

+

13#out:1

+

[45, 0; 0, 20]

+ +

2

+

[0, 105]

+

14#in:1

+
+ +

3

+

1#in:2

+
+
+ +

4

+

11#out:1

+

[30, 0; 0, 80; 40, 0]

+ +

5

+

14#in:2

+
+ +

6

+

[0, -115]

+

1#in:3

+
+
+ +

7

+

12#out:1

+

[20, 0; 0, 30; 30, 0]

+ +

8

+

14#in:3

+
+ +

9

+

[0, -185]

+

1#in:1

+
+
+ +

10

+

14#out:1

+

[20, 0; 0, -20]

+

10#in:1

+
+ +

11

+

10#out:1

+

[25, 0]

+

21#in:1

+
+ +

12

+

1#out:1

+

[30, 0; 0, -15; 25, 0]

+ +

13

+

27#in:1

+
+ +

14

+

[0, 275]

+

31#in:1

+
+
+ +

15

+

[0, 0]

+

21#out:2

+

[0, -5; 35, 0]

+

28#in:2

+
+ +

16

+

1#out:2

+

[40, 0; 0, 145; 25, 0]

+ +

17

+

28#in:1

+
+ +

18

+

32#in:1

+
+
+ +

19

+

28#out:1

+

30#in:1

+
+ +

20

+

27#out:1

+

29#in:1

+
+ +

21

+

[0, 0]

+

21#out:1

+

[10, 0]

+

27#in:2

+
+ +

This model demonstrates the use of predicate subtyping through +the implementation of quad_fcn, which will give the real roots +of a quadratic function. + +results are compared to the matlab function roots, results are +generally the same, although sometimes there is a small error +on the order of 1e-16. + +Currently does not activly check that inputs satisfy subtype +constraints, in these cases proper output is not guaranteed. + +This example will not work under CVC3 as complex functions like +sqrt are not supported. + +This example requires the NASA PVS libraries

+

[79, 267, 368, 419]

+

[0, 0, 0, 0]

+

-1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/windowsInfo.xml + + + + +

1

+

[470.0, 174.0, 828.0, 620.0]

+ +

0

+

Left

+

50

+

50

+

8

+

Unset

+
+ +

1

+
+ +

1

+

1

+

SimulinkTopLevel

+

0

+

[790.0, 385.0]

+

0.89473684210526316

+

[-63.845588235294088, 4.35294117647058]

+

[-63.845588235294088, 4.35294117647058, 882.94117647058818, 430.29411764705884]

+
+ + +

Simulink:Editor:ReferencedFiles

+

Referenced Files

+

0

+

+

{"filterShowRefModels":"true","filterShowRefSubs":"true","filterShowOnlyDirtyFiles":"false"} +

+

0

+

Left

+

640

+

480

+

Unset

+
+ +

GLUE2:PropertyInspector

+

Property Inspector

+

0

+

+

+

0

+

Right

+

640

+

480

+

Unset

+
+
+

AAAA/wAAAAD9AAAAAwAAAAAAAAC9AAAB+PwCAAAABPsAAAAWAEQAbwBjAGsAVwBpAGQAZwBlAHQAMwEAAAAxAAAB+AAAAAAAAAAA+wAAABYARABvAGMAawBXAGkAZABnAGUAdAA0AAAAAAD/////AAAAAAAAAAD7AAAAUgBHAEwAVQBFADIAIAB0AHIAZQBlACAAYwBvAG0AcABvAG4AZQBuAHQALwBHAEwAVQBFADIAIAB0AHIAZQBlACAAYwBvAG0AcABvAG4AZQBuAHQAAAAAAP////8AAABkAP////sAAABgAFMAaQBtAHUAbABpAG4AawA6AEUAZABpAHQAbwByADoAUgBlAGYAZQByAGUAbgBjAGUAZABGAGkAbABlAHMALwBSAGUAZgBlAHIAZQBuAGMAZQBkACAARgBpAGwAZQBzAAAAAAD/////AAAAiAD///8AAAABAAAAAAAAAAD8AgAAAAH7AAAAVABHAEwAVQBFADIAOgBQAHIAbwBwAGUAcgB0AHkASQBuAHMAcABlAGMAdABvAHIALwBQAHIAbwBwAGUAcgB0AHkAIABJAG4AcwBwAGUAYwB0AG8AcgAAAAAA/////wAAAawA////AAAAAwAAAAAAAAAA/AEAAAAB+/////8AAAAAAP////8AAAFZAP///wAAAzwAAAG+AAAAAQAAAAIAAAABAAAAAvwAAAAA

+ +

34490877-6e2a-4f6a-bbcd-64cdf4dabf57

+
+

+

+
+ +__MWOPC_PACKAGE_END__ +======= Model { Name "quadratic_roots" Version 7.5 @@ -2420,3 +5288,4 @@ Stateflow { linkNode [1 0 0] } } +>>>>>>> 6e8ce001ab8e32d0a66c7fab9f1c8f2d9f1bad69 diff --git a/Examples/quadratic_roots.mdl.r2010a b/Examples/quadratic_roots.mdl.r2010a new file mode 100644 index 0000000000000000000000000000000000000000..caa8dc142c27c7c65aace158da90d60f4009ceaa --- /dev/null +++ b/Examples/quadratic_roots.mdl.r2010a @@ -0,0 +1,2422 @@ +Model { + Name "quadratic_roots" + Version 7.5 + MdlSubVersion 0 + GraphicalInterface { + NumRootInports 0 + NumRootOutports 0 + ParameterArgumentNames "" + ComputedModelVersion "1.18" + NumModelReferences 0 + NumTestPointedSignals 0 + } + SavedCharacterEncoding "ISO-8859-1" + SaveDefaultBlockParams on + ScopeRefreshTime 0.035000 + OverrideScopeRefreshTime on + DisableAllScopes off + DataTypeOverride "UseLocalSettings" + MinMaxOverflowLogging "UseLocalSettings" + MinMaxOverflowArchiveMode "Overwrite" + MaxMDLFileLineLength 120 + Created "Fri Jan 21 14:32:13 2011" + Creator "colin" + UpdateHistory "UpdateHistoryNever" + ModifiedByFormat "%" + LastModifiedBy "matthew" + ModifiedDateFormat "%" + LastModifiedDate "Thu May 15 16:21:42 2014" + RTWModifiedTimeStamp 322071698 + ModelVersionFormat "1.%" + ConfigurationManager "none" + SampleTimeColors off + SampleTimeAnnotations off + LibraryLinkDisplay "none" + WideLines off + ShowLineDimensions off + ShowPortDataTypes off + ShowLoopsOnError on + IgnoreBidirectionalLines off + ShowStorageClass off + ShowTestPointIcons on + ShowSignalResolutionIcons on + ShowViewerIcons on + SortedOrder off + ExecutionContextIcon off + ShowLinearizationAnnotations on + BlockNameDataTip off + BlockParametersDataTip off + BlockDescriptionStringDataTip off + ToolBar on + StatusBar on + BrowserShowLibraryLinks off + BrowserLookUnderMasks off + SimulationMode "normal" + LinearizationMsg "none" + Profile off + ParamWorkspaceSource "MATLABWorkspace" + AccelSystemTargetFile "accel.tlc" + AccelTemplateMakefile "accel_default_tmf" + AccelMakeCommand "make_rtw" + TryForcingSFcnDF off + RecordCoverage off + CovPath "/" + CovSaveName "covdata" + CovMetricSettings "dw" + CovNameIncrementing off + CovHtmlReporting on + CovForceBlockReductionOff on + covSaveCumulativeToWorkspaceVar on + CovSaveSingleToWorkspaceVar on + CovCumulativeVarName "covCumulativeData" + CovCumulativeReport off + CovReportOnPause on + CovModelRefEnable "Off" + CovExternalEMLEnable off + ExtModeBatchMode off + ExtModeEnableFloating on + ExtModeTrigType "manual" + ExtModeTrigMode "normal" + ExtModeTrigPort "1" + ExtModeTrigElement "any" + ExtModeTrigDuration 1000 + ExtModeTrigDurationFloating "auto" + ExtModeTrigHoldOff 0 + ExtModeTrigDelay 0 + ExtModeTrigDirection "rising" + ExtModeTrigLevel 0 + ExtModeArchiveMode "off" + ExtModeAutoIncOneShot off + ExtModeIncDirWhenArm off + ExtModeAddSuffixToVar off + ExtModeWriteAllDataToWs off + ExtModeArmWhenConnect on + ExtModeSkipDownloadWhenConnect off + ExtModeLogAll on + ExtModeAutoUpdateStatusClock on + BufferReuse on + ShowModelReferenceBlockVersion off + ShowModelReferenceBlockIO off + Array { + Type "Handle" + Dimension 1 + Simulink.ConfigSet { + $ObjectID 1 + Version "1.10.0" + Array { + Type "Handle" + Dimension 8 + Simulink.SolverCC { + $ObjectID 2 + Version "1.10.0" + StartTime "0.0" + StopTime "10.0" + AbsTol "auto" + FixedStep "auto" + InitialStep "auto" + MaxNumMinSteps "-1" + MaxOrder 5 + ZcThreshold "auto" + ConsecutiveZCsStepRelTol "10*128*eps" + MaxConsecutiveZCs "1000" + ExtrapolationOrder 4 + NumberNewtonIterations 1 + MaxStep "auto" + MinStep "auto" + MaxConsecutiveMinStep "1" + RelTol "1e-3" + SolverMode "Auto" + Solver "VariableStepDiscrete" + SolverName "VariableStepDiscrete" + SolverJacobianMethodControl "auto" + ShapePreserveControl "DisableAll" + ZeroCrossControl "UseLocalSettings" + ZeroCrossAlgorithm "Nonadaptive" + AlgebraicLoopSolver "TrustRegion" + SolverResetMethod "Fast" + PositivePriorityOrder off + AutoInsertRateTranBlk off + SampleTimeConstraint "Unconstrained" + InsertRTBMode "Whenever possible" + } + Simulink.DataIOCC { + $ObjectID 3 + Version "1.10.0" + Decimation "1" + ExternalInput "[t, u]" + FinalStateName "xFinal" + InitialState "xInitial" + LimitDataPoints on + MaxDataPoints "1000" + LoadExternalInput off + LoadInitialState off + SaveFinalState off + SaveCompleteFinalSimState off + SaveFormat "Array" + SaveOutput on + SaveState off + SignalLogging on + DSMLogging on + InspectSignalLogs off + SaveTime on + ReturnWorkspaceOutputs off + StateSaveName "xout" + TimeSaveName "tout" + OutputSaveName "yout" + SignalLoggingName "logsout" + DSMLoggingName "dsmout" + OutputOption "RefineOutputTimes" + OutputTimes "[]" + ReturnWorkspaceOutputsName "out" + Refine "1" + } + Simulink.OptimizationCC { + $ObjectID 4 + Version "1.10.0" + Array { + Type "Cell" + Dimension 7 + Cell "BooleansAsBitfields" + Cell "PassReuseOutputArgsAs" + Cell "PassReuseOutputArgsThreshold" + Cell "ZeroExternalMemoryAtStartup" + Cell "ZeroInternalMemoryAtStartup" + Cell "OptimizeModelRefInitCode" + Cell "NoFixptDivByZeroProtection" + PropName "DisabledProps" + } + BlockReduction on + BooleanDataType on + ConditionallyExecuteInputs on + InlineParams off + UseIntDivNetSlope off + InlineInvariantSignals off + OptimizeBlockIOStorage on + BufferReuse on + EnhancedBackFolding off + StrengthReduction off + EnforceIntegerDowncast on + ExpressionFolding on + BooleansAsBitfields off + BitfieldContainerType "uint_T" + EnableMemcpy on + MemcpyThreshold 64 + PassReuseOutputArgsAs "Structure reference" + ExpressionDepthLimit 2147483647 + FoldNonRolledExpr on + LocalBlockOutputs on + RollThreshold 5 + SystemCodeInlineAuto off + StateBitsets off + DataBitsets off + UseTempVars off + ZeroExternalMemoryAtStartup on + ZeroInternalMemoryAtStartup on + InitFltsAndDblsToZero off + NoFixptDivByZeroProtection off + EfficientFloat2IntCast off + EfficientMapNaN2IntZero on + OptimizeModelRefInitCode off + LifeSpan "inf" + MaxStackSize "Inherit from target" + BufferReusableBoundary on + SimCompilerOptimization "Off" + AccelVerboseBuild off + } + Simulink.DebuggingCC { + $ObjectID 5 + Version "1.10.0" + RTPrefix "error" + ConsistencyChecking "none" + ArrayBoundsChecking "none" + SignalInfNanChecking "none" + SignalRangeChecking "none" + ReadBeforeWriteMsg "UseLocalSettings" + WriteAfterWriteMsg "UseLocalSettings" + WriteAfterReadMsg "UseLocalSettings" + AlgebraicLoopMsg "warning" + ArtificialAlgebraicLoopMsg "warning" + SaveWithDisabledLinksMsg "warning" + SaveWithParameterizedLinksMsg "warning" + CheckSSInitialOutputMsg on + UnderspecifiedInitializationDetection "Classic" + MergeDetectMultiDrivingBlocksExec "none" + CheckExecutionContextPreStartOutputMsg off + CheckExecutionContextRuntimeOutputMsg off + SignalResolutionControl "UseLocalSettings" + BlockPriorityViolationMsg "warning" + MinStepSizeMsg "warning" + TimeAdjustmentMsg "none" + MaxConsecutiveZCsMsg "error" + SolverPrmCheckMsg "warning" + InheritedTsInSrcMsg "warning" + DiscreteInheritContinuousMsg "warning" + MultiTaskDSMMsg "error" + MultiTaskCondExecSysMsg "error" + MultiTaskRateTransMsg "error" + SingleTaskRateTransMsg "none" + TasksWithSamePriorityMsg "warning" + SigSpecEnsureSampleTimeMsg "warning" + CheckMatrixSingularityMsg "none" + IntegerOverflowMsg "warning" + Int32ToFloatConvMsg "warning" + ParameterDowncastMsg "error" + ParameterOverflowMsg "error" + ParameterUnderflowMsg "none" + ParameterPrecisionLossMsg "warning" + ParameterTunabilityLossMsg "warning" + FixptConstUnderflowMsg "none" + FixptConstOverflowMsg "none" + FixptConstPrecisionLossMsg "none" + UnderSpecifiedDataTypeMsg "none" + UnnecessaryDatatypeConvMsg "none" + VectorMatrixConversionMsg "none" + InvalidFcnCallConnMsg "error" + FcnCallInpInsideContextMsg "Use local settings" + SignalLabelMismatchMsg "none" + UnconnectedInputMsg "warning" + UnconnectedOutputMsg "warning" + UnconnectedLineMsg "warning" + SFcnCompatibilityMsg "none" + UniqueDataStoreMsg "none" + BusObjectLabelMismatch "warning" + RootOutportRequireBusObject "warning" + AssertControl "UseLocalSettings" + EnableOverflowDetection off + ModelReferenceIOMsg "none" + ModelReferenceVersionMismatchMessage "none" + ModelReferenceIOMismatchMessage "none" + ModelReferenceCSMismatchMessage "none" + UnknownTsInhSupMsg "warning" + ModelReferenceDataLoggingMessage "warning" + ModelReferenceSymbolNameMessage "warning" + ModelReferenceExtraNoncontSigs "error" + StateNameClashWarn "warning" + SimStateInterfaceChecksumMismatchMsg "warning" + StrictBusMsg "ErrorLevel1" + BusNameAdapt "WarnAndRepair" + NonBusSignalsTreatedAsBus "none" + LoggingUnavailableSignals "error" + BlockIODiagnostic "none" + } + Simulink.HardwareCC { + $ObjectID 6 + Version "1.10.0" + ProdBitPerChar 8 + ProdBitPerShort 16 + ProdBitPerInt 32 + ProdBitPerLong 32 + ProdIntDivRoundTo "Undefined" + ProdEndianess "Unspecified" + ProdWordSize 32 + ProdShiftRightIntArith on + ProdHWDeviceType "32-bit Generic" + TargetBitPerChar 8 + TargetBitPerShort 16 + TargetBitPerInt 32 + TargetBitPerLong 32 + TargetShiftRightIntArith on + TargetIntDivRoundTo "Undefined" + TargetEndianess "Unspecified" + TargetWordSize 32 + TargetTypeEmulationWarnSuppressLevel 0 + TargetPreprocMaxBitsSint 32 + TargetPreprocMaxBitsUint 32 + TargetHWDeviceType "Specified" + TargetUnknown off + ProdEqTarget on + } + Simulink.ModelReferenceCC { + $ObjectID 7 + Version "1.10.0" + UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" + CheckModelReferenceTargetMessage "error" + EnableParallelModelReferenceBuilds off + ParallelModelReferenceMATLABWorkerInit "None" + ModelReferenceNumInstancesAllowed "Multi" + PropagateVarSize "Infer from blocks in model" + ModelReferencePassRootInputsByReference on + ModelReferenceMinAlgLoopOccurrences off + PropagateSignalLabelsOutOfModel off + SupportModelReferenceSimTargetCustomCode off + } + Simulink.SFSimCC { + $ObjectID 8 + Version "1.10.0" + SFSimEnableDebug on + SFSimOverflowDetection on + SFSimEcho on + SimBlas on + SimCtrlC on + SimExtrinsic on + SimIntegrity on + SimUseLocalCustomCode off + SimBuildMode "sf_incremental_build" + } + Simulink.RTWCC { + $BackupClass "Simulink.RTWCC" + $ObjectID 9 + Version "1.10.0" + Array { + Type "Cell" + Dimension 6 + Cell "IncludeHyperlinkInReport" + Cell "GenerateTraceInfo" + Cell "GenerateTraceReport" + Cell "GenerateTraceReportSl" + Cell "GenerateTraceReportSf" + Cell "GenerateTraceReportEml" + PropName "DisabledProps" + } + SystemTargetFile "grt.tlc" + GenCodeOnly off + MakeCommand "make_rtw" + GenerateMakefile on + TemplateMakefile "grt_default_tmf" + GenerateReport off + SaveLog off + RTWVerbose on + RetainRTWFile off + ProfileTLC off + TLCDebug off + TLCCoverage off + TLCAssert off + ProcessScriptMode "Default" + ConfigurationMode "Optimized" + ConfigAtBuild off + RTWUseLocalCustomCode off + RTWUseSimCustomCode off + IncludeHyperlinkInReport off + LaunchReport off + TargetLang "C" + IncludeBusHierarchyInRTWFileBlockHierarchyMap off + IncludeERTFirstTime off + GenerateTraceInfo off + GenerateTraceReport off + GenerateTraceReportSl off + GenerateTraceReportSf off + GenerateTraceReportEml off + GenerateCodeInfo off + RTWCompilerOptimization "Off" + CheckMdlBeforeBuild "Off" + CustomRebuildMode "OnUpdate" + Array { + Type "Handle" + Dimension 2 + Simulink.CodeAppCC { + $ObjectID 10 + Version "1.10.0" + Array { + Type "Cell" + Dimension 19 + Cell "IgnoreCustomStorageClasses" + Cell "IgnoreTestpoints" + Cell "InsertBlockDesc" + Cell "SFDataObjDesc" + Cell "SimulinkDataObjDesc" + Cell "DefineNamingRule" + Cell "SignalNamingRule" + Cell "ParamNamingRule" + Cell "InlinedPrmAccess" + Cell "CustomSymbolStr" + Cell "CustomSymbolStrGlobalVar" + Cell "CustomSymbolStrType" + Cell "CustomSymbolStrField" + Cell "CustomSymbolStrFcn" + Cell "CustomSymbolStrFcnArg" + Cell "CustomSymbolStrBlkIO" + Cell "CustomSymbolStrTmpVar" + Cell "CustomSymbolStrMacro" + Cell "ReqsInCode" + PropName "DisabledProps" + } + ForceParamTrailComments off + GenerateComments on + IgnoreCustomStorageClasses on + IgnoreTestpoints off + IncHierarchyInIds off + MaxIdLength 31 + PreserveName off + PreserveNameWithParent off + ShowEliminatedStatement off + IncAutoGenComments off + SimulinkDataObjDesc off + SFDataObjDesc off + IncDataTypeInIds off + MangleLength 1 + CustomSymbolStrGlobalVar "$R$N$M" + CustomSymbolStrType "$N$R$M" + CustomSymbolStrField "$N$M" + CustomSymbolStrFcn "$R$N$M$F" + CustomSymbolStrFcnArg "rt$I$N$M" + CustomSymbolStrBlkIO "rtb_$N$M" + CustomSymbolStrTmpVar "$N$M" + CustomSymbolStrMacro "$R$N$M" + DefineNamingRule "None" + ParamNamingRule "None" + SignalNamingRule "None" + InsertBlockDesc off + SimulinkBlockComments on + EnableCustomComments off + InlinedPrmAccess "Literals" + ReqsInCode off + UseSimReservedNames off + } + Simulink.GRTTargetCC { + $BackupClass "Simulink.TargetCC" + $ObjectID 11 + Version "1.10.0" + Array { + Type "Cell" + Dimension 17 + Cell "GeneratePreprocessorConditionals" + Cell "IncludeMdlTerminateFcn" + Cell "CombineOutputUpdateFcns" + Cell "SuppressErrorStatus" + Cell "ERTCustomFileBanners" + Cell "GenerateSampleERTMain" + Cell "GenerateTestInterfaces" + Cell "ModelStepFunctionPrototypeControlCompliant" + Cell "CPPClassGenCompliant" + Cell "MultiInstanceERTCode" + Cell "PurelyIntegerCode" + Cell "PortableWordSizes" + Cell "SupportComplex" + Cell "SupportAbsoluteTime" + Cell "SupportContinuousTime" + Cell "SupportNonInlinedSFcns" + Cell "SupportNonFinite" + PropName "DisabledProps" + } + TargetFcnLib "ansi_tfl_table_tmw.mat" + TargetLibSuffix "" + TargetPreCompLibLocation "" + TargetFunctionLibrary "ANSI_C" + UtilityFuncGeneration "Auto" + ERTMultiwordTypeDef "System defined" + ERTCodeCoverageTool "None" + ERTMultiwordLength 256 + MultiwordLength 2048 + GenerateFullHeader on + GenerateSampleERTMain off + GenerateTestInterfaces off + IsPILTarget off + ModelReferenceCompliant on + ParMdlRefBuildCompliant on + CompOptLevelCompliant on + IncludeMdlTerminateFcn on + GeneratePreprocessorConditionals "Disable all" + CombineOutputUpdateFcns off + SuppressErrorStatus off + ERTFirstTimeCompliant off + IncludeFileDelimiter "Auto" + ERTCustomFileBanners off + SupportAbsoluteTime on + LogVarNameModifier "rt_" + MatFileLogging on + MultiInstanceERTCode off + SupportNonFinite on + SupportComplex on + PurelyIntegerCode off + SupportContinuousTime on + SupportNonInlinedSFcns on + SupportVariableSizeSignals off + EnableShiftOperators on + ParenthesesLevel "Nominal" + PortableWordSizes off + ModelStepFunctionPrototypeControlCompliant off + CPPClassGenCompliant off + AutosarCompliant off + UseMalloc off + ExtMode off + ExtModeStaticAlloc off + ExtModeTesting off + ExtModeStaticAllocSize 1000000 + ExtModeTransport 0 + ExtModeMexFile "ext_comm" + ExtModeIntrfLevel "Level1" + RTWCAPISignals off + RTWCAPIParams off + RTWCAPIStates off + GenerateASAP2 off + } + PropName "Components" + } + } + PropName "Components" + } + Name "Configuration" + CurrentDlgPage "Solver" + ConfigPrmDlgPosition " [ 200, 74, 1080, 704 ] " + } + PropName "ConfigurationSets" + } + Simulink.ConfigSet { + $PropName "ActiveConfigurationSet" + $ObjectID 1 + } + BlockDefaults { + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + NamePlacement "normal" + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + ShowName on + BlockRotation 0 + BlockMirror off + } + AnnotationDefaults { + HorizontalAlignment "center" + VerticalAlignment "middle" + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + UseDisplayTextAsClickCallback off + } + LineDefaults { + FontName "Helvetica" + FontSize 9 + FontWeight "normal" + FontAngle "normal" + } + BlockParameterDefaults { + Block { + BlockType BusCreator + Inputs "4" + DisplayOption "none" + UseBusObject off + BusObject "BusObject" + NonVirtualBus off + } + Block { + BlockType Constant + Value "1" + VectorParams1D on + SamplingMode "Sample based" + OutMin "[]" + OutMax "[]" + OutDataTypeMode "Inherit from 'Constant value'" + OutDataType "fixdt(1,16,0)" + ConRadixGroup "Use specified scaling" + OutScaling "[]" + OutDataTypeStr "Inherit: Inherit from 'Constant value'" + LockScale off + SampleTime "inf" + FramePeriod "inf" + PreserveConstantTs off + } + Block { + BlockType Demux + Outputs "4" + DisplayOption "none" + BusSelectionMode off + } + Block { + BlockType Display + Format "short" + Decimation "10" + Floating off + SampleTime "-1" + } + Block { + BlockType Inport + Port "1" + UseBusObject off + BusObject "BusObject" + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + OutMin "[]" + OutMax "[]" + DataType "auto" + OutDataType "fixdt(1,16,0)" + OutScaling "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + SignalType "auto" + SamplingMode "auto" + LatchByDelayingOutsideSignal off + LatchInputForFeedbackSignals off + Interpolate on + } + Block { + BlockType MATLABFcn + MATLABFcn "sin" + OutputDimensions "-1" + OutputSignalType "auto" + Output1D on + SampleTime "-1" + } + Block { + BlockType Outport + Port "1" + UseBusObject off + BusObject "BusObject" + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + OutMin "[]" + OutMax "[]" + DataType "auto" + OutDataType "fixdt(1,16,0)" + OutScaling "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + SignalType "auto" + SamplingMode "auto" + SourceOfInitialOutputValue "Dialog" + OutputWhenDisabled "held" + InitialOutput "[]" + } + Block { + BlockType "S-Function" + FunctionName "system" + SFunctionModules "''" + PortCounts "[]" + SFunctionDeploymentMode off + } + Block { + BlockType Scope + ModelBased off + TickLabels "OneTimeTick" + ZoomMode "on" + Grid "on" + TimeRange "auto" + YMin "-5" + YMax "5" + SaveToWorkspace off + SaveName "ScopeData" + LimitDataPoints on + MaxDataPoints "5000" + Decimation "1" + SampleInput off + SampleTime "-1" + } + Block { + BlockType SubSystem + ShowPortLabels "FromPortIcon" + Permissions "ReadWrite" + PermitHierarchicalResolution "All" + TreatAsAtomicUnit off + CheckFcnCallInpInsideContextMsg off + SystemSampleTime "-1" + RTWFcnNameOpts "Auto" + RTWFileNameOpts "Auto" + RTWMemSecFuncInitTerm "Inherit from model" + RTWMemSecFuncExecute "Inherit from model" + RTWMemSecDataConstants "Inherit from model" + RTWMemSecDataInternal "Inherit from model" + RTWMemSecDataParameters "Inherit from model" + SimViewingDevice off + DataTypeOverride "UseLocalSettings" + MinMaxOverflowLogging "UseLocalSettings" + } + Block { + BlockType Sum + IconShape "rectangular" + Inputs "++" + CollapseMode "All dimensions" + CollapseDim "1" + InputSameDT on + AccumDataTypeStr "Inherit: Inherit via internal rule" + OutMin "[]" + OutMax "[]" + OutDataTypeMode "Same as first input" + OutDataType "fixdt(1,16,0)" + OutScaling "[]" + OutDataTypeStr "Inherit: Same as first input" + LockScale off + RndMeth "Floor" + SaturateOnIntegerOverflow on + SampleTime "-1" + } + Block { + BlockType Terminator + } + } + System { + Name "quadratic_roots" + Location [890, 569, 1678, 1011] + Open on + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + ReportName "simulink-default.rpt" + SIDHighWatermark 45 + Block { + BlockType BusCreator + Name "Bus\nCreator" + SID 14 + Ports [3, 1] + Position [170, 157, 180, 243] + ShowName off + Inputs "3" + DisplayOption "bar" + } + Block { + BlockType Constant + Name "Constant" + SID 11 + Position [35, 105, 65, 135] + Value "4" + } + Block { + BlockType Constant + Name "Constant1" + SID 12 + Position [35, 185, 65, 215] + Value "-5" + } + Block { + BlockType Constant + Name "Constant2" + SID 13 + Position [30, 30, 60, 60] + } + Block { + BlockType Demux + Name "Demux" + SID 21 + Ports [1, 2] + Position [370, 156, 375, 194] + ShowName off + Outputs "2" + DisplayOption "bar" + } + Block { + BlockType Display + Name "Display" + SID 29 + Ports [1] + Position [505, 20, 595, 50] + Decimation "1" + Lockdown off + } + Block { + BlockType Display + Name "Display1" + SID 30 + Ports [1] + Position [515, 215, 605, 245] + Decimation "1" + Lockdown off + } + Block { + BlockType Display + Name "Display2" + SID 31 + Ports [1] + Position [430, 295, 520, 325] + Decimation "1" + Lockdown off + } + Block { + BlockType Display + Name "Display3" + SID 32 + Ports [1] + Position [435, 350, 525, 380] + Decimation "1" + Lockdown off + } + Block { + BlockType MATLABFcn + Name "MATLAB Fcn" + SID 10 + Ports [1, 1] + Position [235, 152, 325, 208] + MATLABFcn "roots" + OutputDimensions "2" + Output1D off + } + Block { + BlockType Scope + Name "Scope" + SID 25 + Ports [] + Position [485, 59, 515, 91] + List { + ListType IOSignalStrings + set0ParseKeys "8,19" + set0Sigs "Demux:o2quad_fcn_subtype:o2" + } + Floating on + Location [361, 434, 685, 673] + Open off + NumInputPorts "1" + List { + ListType AxesTitles + axes1 "%" + } + DataFormat "StructureWithTime" + SampleTime "0" + } + Block { + BlockType Scope + Name "Scope1" + SID 26 + Ports [] + Position [475, 158, 505, 192] + List { + ListType IOSignalStrings + set0ParseKeys "8,19" + set0Sigs "Demux:o1quad_fcn_subtype:o1" + } + Floating on + Location [37, 522, 442, 784] + Open off + NumInputPorts "1" + List { + ListType AxesTitles + axes1 "%" + } + SaveName "ScopeData1" + DataFormat "StructureWithTime" + SampleTime "0" + } + Block { + BlockType Sum + Name "Sum" + SID 27 + Ports [2, 1] + Position [455, 25, 475, 45] + ShowName off + IconShape "round" + Inputs "|+-" + InputSameDT off + OutDataTypeMode "Inherit via internal rule" + OutDataTypeStr "Inherit: Inherit via internal rule" + SaturateOnIntegerOverflow off + } + Block { + BlockType Sum + Name "Sum1" + SID 28 + Ports [2, 1] + Position [480, 220, 500, 240] + ShowName off + IconShape "round" + Inputs "|+-" + InputSameDT off + OutDataTypeMode "Inherit via internal rule" + OutDataTypeStr "Inherit: Inherit via internal rule" + SaturateOnIntegerOverflow off + } + Block { + BlockType SubSystem + Name "quad_fcn_fp" + SID 38 + Ports [3, 2] + Position [555, 301, 720, 369] + LibraryVersion "1.12" + UserDataPersistent on + UserData "DataTag0" + CopyFcn "TTdiag Copy" + DeleteFcn "TTdiag Delete" + OpenFcn "TTdiag Open Simulink" + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskDescription "Table Block" + MaskDisplay "port_label('input',1,'a');port_label('input',2,'b');port_label('input',3,'c');port_label('out" + "put',1,'x1');port_label('output',2,'x2');text(0.5, 0.9, 'Tabular Expression', 'horizontalAlignment', 'center');c" + "olor('red');text(0.5, 0.1, 'Not Checked', 'horizontalAlignment', 'center')" + MaskIconFrame on + MaskIconOpaque on + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "normalized" + System { + Name "quad_fcn_fp" + Location [433, 447, 931, 747] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + Block { + BlockType Inport + Name "a" + SID 41 + Position [35, 38, 65, 52] + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "b" + SID 42 + Position [35, 38, 65, 52] + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "c" + SID 43 + Position [35, 38, 65, 52] + Port "3" + IconDisplay "Port number" + } + Block { + BlockType SubSystem + Name "code" + SID 40 + Ports [3, 2] + Position [250, 51, 320, 99] + LibraryVersion "1.31" + ErrorFcn "Stateflow.Translate.translate" + PermitHierarchicalResolution "ExplicitOnly" + TreatAsAtomicUnit on + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskType "Stateflow" + MaskDescription "Embedded MATLAB block" + MaskDisplay "disp('quad_fcn_fp');" + MaskSelfModifiable on + MaskIconFrame on + MaskIconOpaque off + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "normalized" + System { + Name "code" + Location [257, 457, 812, 717] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + SIDHighWatermark 24 + SIDPrevWatermark 13 + Block { + BlockType Inport + Name "a" + SID 1 + Position [20, 101, 40, 119] + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "b" + SID 18 + Position [20, 136, 40, 154] + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "c" + SID 19 + Position [20, 171, 40, 189] + Port "3" + IconDisplay "Port number" + } + Block { + BlockType Demux + Name " Demux " + SID 22 + Ports [1, 1] + Position [270, 180, 320, 220] + Outputs "1" + } + Block { + BlockType "S-Function" + Name " SFunction " + SID 21 + Tag "Stateflow S-Function quadratic_roots 1" + Ports [3, 3] + Position [180, 100, 230, 180] + FunctionName "sf_sfun" + PortCounts "[3 3]" + EnableBusSupport on + Port { + PortNumber 2 + Name "x1" + RTWStorageClass "Auto" + DataLoggingNameMode "SignalName" + } + Port { + PortNumber 3 + Name "x2" + RTWStorageClass "Auto" + DataLoggingNameMode "SignalName" + } + } + Block { + BlockType Terminator + Name " Terminator " + SID 24 + Position [460, 191, 480, 209] + } + Block { + BlockType Outport + Name "x1" + SID 5 + Position [460, 101, 480, 119] + IconDisplay "Port number" + } + Block { + BlockType Outport + Name "x2" + SID 20 + Position [460, 136, 480, 154] + Port "2" + IconDisplay "Port number" + } + Line { + SrcBlock "a" + SrcPort 1 + DstBlock " SFunction " + DstPort 1 + } + Line { + SrcBlock "b" + SrcPort 1 + DstBlock " SFunction " + DstPort 2 + } + Line { + SrcBlock "c" + SrcPort 1 + DstBlock " SFunction " + DstPort 3 + } + Line { + Name "x1" + Labels [0, 0] + SrcBlock " SFunction " + SrcPort 2 + DstBlock "x1" + DstPort 1 + } + Line { + Name "x2" + Labels [0, 0] + SrcBlock " SFunction " + SrcPort 3 + DstBlock "x2" + DstPort 1 + } + Line { + SrcBlock " Demux " + SrcPort 1 + DstBlock " Terminator " + DstPort 1 + } + Line { + SrcBlock " SFunction " + SrcPort 1 + DstBlock " Demux " + DstPort 1 + } + } + } + Block { + BlockType Outport + Name "x1" + SID 44 + Position [35, 53, 65, 67] + IconDisplay "Port number" + } + Block { + BlockType Outport + Name "x2" + SID 45 + Position [35, 53, 65, 67] + Port "2" + IconDisplay "Port number" + } + Line { + SrcBlock "a" + SrcPort 1 + DstBlock "code" + DstPort 1 + } + Line { + SrcBlock "b" + SrcPort 1 + DstBlock "code" + DstPort 2 + } + Line { + SrcBlock "c" + SrcPort 1 + DstBlock "code" + DstPort 3 + } + Line { + SrcBlock "code" + SrcPort 1 + DstBlock "x1" + DstPort 1 + } + Line { + SrcBlock "code" + SrcPort 2 + DstBlock "x2" + DstPort 1 + } + } + } + Block { + BlockType SubSystem + Name "quad_fcn_subtype" + SID 1 + Ports [3, 2] + Position [185, 31, 350, 99] + LibraryVersion "1.12" + UserDataPersistent on + UserData "DataTag1" + CopyFcn "TTdiag Copy" + DeleteFcn "TTdiag Delete" + OpenFcn "TTdiag Open Simulink" + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskDescription "Table Block" + MaskDisplay "port_label('input',1,'c');port_label('input',2,'a');port_label('input',3,'b');port_label('out" + "put',1,'x1');port_label('output',2,'x2');text(0.5, 0.9, 'Tabular Expression', 'horizontalAlignment', 'center');c" + "olor('red');text(0.5, 0.1, 'Not Checked', 'horizontalAlignment', 'center')" + MaskIconFrame on + MaskIconOpaque on + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "normalized" + System { + Name "quad_fcn_subtype" + Location [433, 447, 931, 747] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + Block { + BlockType Inport + Name "c" + SID 4 + Position [35, 38, 65, 52] + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "a" + SID 5 + Position [35, 38, 65, 52] + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "b" + SID 6 + Position [35, 38, 65, 52] + Port "3" + IconDisplay "Port number" + } + Block { + BlockType SubSystem + Name "code" + SID 3 + Ports [3, 2] + Position [250, 51, 320, 99] + LibraryVersion "1.31" + ErrorFcn "Stateflow.Translate.translate" + PermitHierarchicalResolution "ExplicitOnly" + TreatAsAtomicUnit on + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskType "Stateflow" + MaskDescription "Embedded MATLAB block" + MaskDisplay "disp('quad_fcn_subtype');" + MaskSelfModifiable on + MaskIconFrame on + MaskIconOpaque off + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "normalized" + System { + Name "code" + Location [257, 457, 812, 717] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + SIDHighWatermark 24 + SIDPrevWatermark 13 + Block { + BlockType Inport + Name "c" + SID 1 + Position [20, 101, 40, 119] + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "a" + SID 18 + Position [20, 136, 40, 154] + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "b" + SID 19 + Position [20, 171, 40, 189] + Port "3" + IconDisplay "Port number" + } + Block { + BlockType Demux + Name " Demux " + SID 22 + Ports [1, 1] + Position [270, 180, 320, 220] + Outputs "1" + } + Block { + BlockType "S-Function" + Name " SFunction " + SID 21 + Tag "Stateflow S-Function quadratic_roots 2" + Ports [3, 3] + Position [180, 100, 230, 180] + FunctionName "sf_sfun" + PortCounts "[3 3]" + EnableBusSupport on + Port { + PortNumber 2 + Name "x1" + RTWStorageClass "Auto" + DataLoggingNameMode "SignalName" + } + Port { + PortNumber 3 + Name "x2" + RTWStorageClass "Auto" + DataLoggingNameMode "SignalName" + } + } + Block { + BlockType Terminator + Name " Terminator " + SID 24 + Position [460, 191, 480, 209] + } + Block { + BlockType Outport + Name "x1" + SID 5 + Position [460, 101, 480, 119] + IconDisplay "Port number" + } + Block { + BlockType Outport + Name "x2" + SID 20 + Position [460, 136, 480, 154] + Port "2" + IconDisplay "Port number" + } + Line { + SrcBlock "c" + SrcPort 1 + DstBlock " SFunction " + DstPort 1 + } + Line { + SrcBlock "a" + SrcPort 1 + DstBlock " SFunction " + DstPort 2 + } + Line { + SrcBlock "b" + SrcPort 1 + DstBlock " SFunction " + DstPort 3 + } + Line { + Name "x1" + Labels [0, 0] + SrcBlock " SFunction " + SrcPort 2 + DstBlock "x1" + DstPort 1 + } + Line { + Name "x2" + Labels [0, 0] + SrcBlock " SFunction " + SrcPort 3 + DstBlock "x2" + DstPort 1 + } + Line { + SrcBlock " Demux " + SrcPort 1 + DstBlock " Terminator " + DstPort 1 + } + Line { + SrcBlock " SFunction " + SrcPort 1 + DstBlock " Demux " + DstPort 1 + } + } + } + Block { + BlockType Outport + Name "x1" + SID 8 + Position [35, 53, 65, 67] + IconDisplay "Port number" + } + Block { + BlockType Outport + Name "x2" + SID 9 + Position [35, 53, 65, 67] + Port "2" + IconDisplay "Port number" + } + Line { + SrcBlock "c" + SrcPort 1 + DstBlock "code" + DstPort 1 + } + Line { + SrcBlock "a" + SrcPort 1 + DstBlock "code" + DstPort 2 + } + Line { + SrcBlock "b" + SrcPort 1 + DstBlock "code" + DstPort 3 + } + Line { + SrcBlock "code" + SrcPort 1 + DstBlock "x1" + DstPort 1 + } + Line { + SrcBlock "code" + SrcPort 2 + DstBlock "x2" + DstPort 1 + } + } + } + Line { + SrcBlock "Constant2" + SrcPort 1 + Points [45, 0; 0, 15] + Branch { + Points [0, 110] + DstBlock "Bus\nCreator" + DstPort 1 + } + Branch { + Points [0, 5] + DstBlock "quad_fcn_subtype" + DstPort 2 + } + } + Line { + SrcBlock "Constant" + SrcPort 1 + Points [30, 0; 0, 80; 40, 0] + Branch { + DstBlock "Bus\nCreator" + DstPort 2 + } + Branch { + Points [0, -115] + DstBlock "quad_fcn_subtype" + DstPort 3 + } + } + Line { + SrcBlock "Constant1" + SrcPort 1 + Points [20, 0; 0, 30; 30, 0] + Branch { + DstBlock "Bus\nCreator" + DstPort 3 + } + Branch { + Points [0, -185] + DstBlock "quad_fcn_subtype" + DstPort 1 + } + } + Line { + SrcBlock "Bus\nCreator" + SrcPort 1 + Points [20, 0; 0, -20] + DstBlock "MATLAB Fcn" + DstPort 1 + } + Line { + SrcBlock "MATLAB Fcn" + SrcPort 1 + Points [25, 0] + DstBlock "Demux" + DstPort 1 + } + Line { + SrcBlock "quad_fcn_subtype" + SrcPort 1 + Points [30, 0; 0, -15; 25, 0] + Branch { + DstBlock "Sum" + DstPort 1 + } + Branch { + Points [0, 275] + DstBlock "Display2" + DstPort 1 + } + } + Line { + Labels [0, 0] + SrcBlock "Demux" + SrcPort 2 + Points [0, -5; 35, 0] + DstBlock "Sum1" + DstPort 2 + } + Line { + SrcBlock "quad_fcn_subtype" + SrcPort 2 + Points [40, 0; 0, 145; 25, 0] + Branch { + DstBlock "Sum1" + DstPort 1 + } + Branch { + DstBlock "Display3" + DstPort 1 + } + } + Line { + SrcBlock "Sum1" + SrcPort 1 + DstBlock "Display1" + DstPort 1 + } + Line { + SrcBlock "Sum" + SrcPort 1 + DstBlock "Display" + DstPort 1 + } + Line { + Labels [0, 0] + SrcBlock "Demux" + SrcPort 1 + Points [10, 0] + DstBlock "Sum" + DstPort 2 + } + Annotation { + Name "This model demonstrates the use of predicate subtyping through\nthe implementation of quad_fcn, whi" + "ch will give the real roots\nof a quadratic function.\n\nresults are compared to the matlab function roots, resu" + "lts are \ngenerally the same, although sometimes there is a small error\non the order of 1e-16.\n\nCurrently doe" + "s not activly check that inputs satisfy subtype\nconstraints, in these cases proper output is not guaranteed.\n\n" + "This example will not work under CVC3 as complex functions like\nsqrt are not supported.\n\nThis example require" + "s the NASA PVS libraries" + Position [223, 343] + } + } +} +MatData { + NumRecords 2 + DataRecord { + Tag DataTag1 + Data " %)30 . > 8 ( $0 ! $ ! !-0T]3 0 $ $1A=&$. 2 8 ( #0 " + " % \" 8 ! 0 & & -T\" 0 $ ! !0 X \"H/@ !@ @ ) " + "4 ( 0 '@^ ! ( !X/@ %)30 . V#T 8 ( @ % \" $ ! 0 " + " % 0 !0 $ % 34-/4P . D#T 8 ( $0 ! $ ! !-0T]3 0 T !&:6QE5W)A<'!E<" + "E]? #@ % ] & \" $ !0 @ !X 0 $ #@ +@+ & \" D !0 @ " + " \"(\"P 0 $ @ (@+ \" + -@! X @ . ( ) $ # \"@ B L 1W)I9# 0V5L;', 0V5L;#$" + " 8V]N9%]T97AT &-E;&Q?:6YD97@ <&%R96YT7V=R:60 8V5L;', 1W)I9 !P87)E;G1?8V5L; !S<&QI=%]P8@!N=6U?8V5L;', 9W)I9%]I;F1E>" + " !R1W)I9 !N97=?8V5L;%]P8@!D96QE=&5?8V5L;%]P8@!P8E]F;&%G $-E;&P '1?;V9F,BD@+2 T*F$J8R ]/2 P #@ #@ & \" 8 !0 " + " @ ! 0 $ \"0 @ #P/PX !( !@ @ - 4 ( !@ $ ! " + " 8 8 W0( ! 0 P ! #@ #@ & \" 8 !0 @ ! 0 $ \"0 " + " @ 0 X X !@ @ & 4 ( 0 $ ! D ( \\#\\. . " + " 8 ( !@ % \" $ ! 0 ) \" / _#@ $@ & \" T !0 " + " @ & 0 $ !@ !@ #= @ $ ! #@ ( . , 8 ( ! % \" " + " $ $ 0 0 0 8CX], X X !@ @ & 4 ( 0 $ ! D ( " + " \\#\\. 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ / 0 " + " X X !@ @ & 4 ( 0 $ ! D ( \\#\\. . 8 ( !@ " + " % \" $ ! 0 ) \" / _#@ #@ & \" 8 !0 @ ! 0 " + " $ \"0 @ #P/PX P !@ @ $ 4 ( 0 , ! ! P!B/# #@ " + " #@ & \" 8 !0 @ ! 0 $ \"0 @ 0 X !( !@ @ - " + " 4 ( !@ $ ! 8 8 W0( ! 0 \\ ! #@ #@ & \" 8 !0 " + " @ ! 0 $ \"0 @ #P/PX X !@ @ & 4 ( 0 $ ! " + " D ( \\#\\. . 8 ( !@ % \" $ ! 0 ) \" / _#@ " + " % & \" T !0 @ ' 0 $ !@ !P #= @ $ \" $ !$ \" " + " X X !@ @ & 4 ( 0 $ ! D ( $ . . 8 ( !@ " + " % \" $ ! 0 ) \" ! #@ $@ & \" T !0 @ & 0 " + " $ !@ !@ #= @ $ ! @ , . 2 8 ( #0 % \" 8 ! 0 " + " & & -T\" 0 $ / 0 X !( !@ @ $ 4 ( 0 !$ ! " + "! 1 *&)>,BD@+2 T*F$J8R ^(# #@ #@ & \" 8 !0 @ ! 0 $ \"0 " + " @ 0 X !( !@ @ - 4 ( !@ $ ! 8 8 W0( ! 0 P" + " ! #@ #@ & \" 8 !0 @ ! 0 $ \"0 @ #P/PX X !@ @" + " & 4 ( 0 $ ! D ( !$ . 4 8 ( #0 % \" < " + " ! 0 & ' -T\" 0 ( - #@ ( #@ #@ & \" 8 !0 @ " + " ! 0 $ \"0 @ 0 X X !@ @ & 4 ( 0 $ ! D " + " ( $ . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ " + " \" P X !( !@ @ - 4 ( !@ $ ! 8 8 W0( ! 0 P " + " ! #@ #@ & \" 0 !0 @ ! !@ $ $ 8 !A('X](# X X !@ @ " + "& 4 ( 0 $ ! D ( $ . 2 8 ( #0 % \" 8 !" + " 0 & & -T\" 0 $ * 0 X X !@ @ & 4 ( 0 $ ! " + " D ( \\#\\. . 8 ( !@ % \" $ ! 0 ) \" " + " !! #@ % & \" T !0 @ ' 0 $ !@ !P #= @ $ \" \"0 L " + " \" X X !@ @ & 4 ( 0 $ ! D ( $ . . 8 " + "( !@ % \" $ ! 0 ) \" ! #@ $@ & \" T !0 @ " + " & 0 $ !@ !@ #= @ $ ! @ , . 2 8 ( #0 % \" 8 " + "! 0 & & -T\" 0 $ * 0 X X !@ @ & 4 ( 0 $ !" + " D ( \\#\\. . 8 ( !@ % \" $ ! 0 ) \" " + " /@_#@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ $ ! \"0 ( " + " . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ ' @ X " + " X !@ @ & 4 ( 0 $ ! D ( $ . . 8 ( !@ %" + " \" $ ! 0 ) \" / _#@ $@ & \" T !0 @ & 0 $ " + " !@ !@ #= @ $ ! @ , . 2 8 ( #0 % \" 8 ! 0 &" + " & -T\" 0 $ ( 0 X X !@ @ & 4 ( 0 $ ! D ( " + " $ . . 8 ( !@ % \" $ ! 0 ) \" / _#@ #@ & " + " \" 8 !0 @ ! 0 $ \"0 @ #P/PX !( !@ @ - 4 ( " + " !@ $ ! 8 8 W0( ! 0 < \" #@ # & \" 0 !0 @ ! " + " ! $ $ $ \"UC+V(. 2 8 ( !@ % \" $ # 0 ) & " + "/ _ \\#\\ #P/PX !( !@ @ - 4 ( !@ $ ! 8 8 W0( ! " + " 0 0 \" #@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ $ ! " + " #0 ( . . 8 ( ! % \" $ & 0 0 !@ \"UB+S(J80 #@ $@ & " + " \" 8 !0 @ ! P $ \"0 !@ #P/P / _ \\#\\. 2 8 " + "( #0 % \" 8 ! 0 & & -T\" 0 $ $ @ X !( !@ @ " + "- 4 ( !@ $ ! 8 8 W0( ! 0 ! \" #@ % & \" 0 " + " !0 @ ! '@ $ $ !X H+6(@+2!S<7)T*&)>,B M(#0J82IC*2D@+R R*F$ X !( !@ @ & " + " 4 ( 0 , ! D 8 \\#\\ #P/P / _#@ $@ & \" T " + " !0 @ & 0 $ !@ !@ #= @ $ ! ! ( . 2 8 ( #0 % " + " \" 8 ! 0 & & -T\" 0 $ 1 @ X !0 !@ @ $ 4 ( " + " 0 !X ! ! > *\"UB(\"L@,BD@+2 T*F$J8R ^/2 P*7T #@ )@! & \" ( !0 @ ! 0 $ " + " !0 $ < ! (P '-E= !I;G!U=', 8V]U;G0 ')A;F=E !E>&-E<'0 . . 8 ( !@ % " + " \" $ ! 0 ) \" / _#@ # & \" 8 !0 @ $ " + " \"0 . . 8 ( !@ % \" $ ! 0 ) \" 0(] #@ #@ & " + " \" 8 !0 @ ! 0 $ \"0 @ !90 X X !@ @ & 4 ( " + " 0 $ ! D ( . . 8 ( !@ % \" $ ! 0 ) " + " \" #@ #@ & \" 8 !0 @ ! 0 $ \"0 @ X X " + " !@ @ & 4 ( 0 $ ! D ( \\#\\. 4 X 8 ( 0 % " + " \" 8 ! 0 . . 8 ( @ % \" $ 0 % 0 0 $ " + " #@ ,@\" & \" ( !0 @ ! 0 $ !0 $ \\ ! AP '!A'1?:&5I9VAT &-O;F1I=&EO;E]T97AT7W@ !C;VYD:71I;VY?=&5X=%]Y 8V]N9&ET:6" + "]N7W1E>'1?;V9F !" + "R1W)I9 !N97=?8V5L;%]P8@!D96QE=&5?8V5L;%]P8@!P8E]F;&%G $-E;&P '1?;V9F P ( = ! ," + " 1 @ 0 # 0 4 \" @ 8 ! @ " + " < 0 0 @ / @ D - 0 H " + " , @ L + 0 P * @ T $ @ " + " X % @ \\ ) 0 ! ( @ !$ & " + " @ !( ' @ !, . ! !0 2 ! " + " !4 3 ! !8 4 ! !< 5 ! !@ 6 !" + " !D 7 ! !H 8 ! !L 9 ! " + " !P : ! !T ; ! !X < ) 0 $ \"( 'P " + " $ \") ( $ \"* )0 $ \"+ )@ $ \", )P $ \"- * $ \". *0 $ \"/ " + " *@ $ \"0 P ( ! A0 !\\ ! A@ \" ! AP 0 # 0 P A 0 %8 B " + " 0 %< 7 0 %@ ! 0 ! 4 ! 0 8 ! \"@ ! ! \"P $ " + " !P $ & \"P $ ' # $ ( #0 $ ) 0 $ 0 ( % 0 , & " + " 0 0 0 0 4 !@ 0 ! #0 4 ! #@ 8 ! 4@ !0 ! 4P !4 ! 5" + " ! ! 50 % \"0 $ !' !P $ !. \"P $ !/ # $ !0 #0 $ !1 !" + "@ !( ! #P 0 ! $ 4 ! $0 8 ! 1 !0 ! 10 !4 ! 1@ $ !P " + " $ ! \"P $ !! # $ !\" #0 $ !# 8 2 0 #H $ 0 #L % 0 " + " #P & 0 #T 4 0 #X 5 0 #\\ !0 D ! $@ < ! -@ L ! -P " + " P ! . T ! .0 8 $ 0 !, % 0 !0 & 0 !4 4 0 !8 5 0 !" + "< 0 0 !@ !@ 0 ! &0 4 ! &@ 8 ! &P !0 ! ' !4 ! '0 ! " + " ! '@ & $@ $ P ! $ Q !0 $ R !@ $ S % $ T %0 $ " + " U 4 ) 0 !\\ ' 0 \"P + 0 \"T , 0 \"X - 0 \"\\ & ! " + "$ @ !0 $ A !@ $ B % $ C %0 $ D $ $ E 8 $ 0 \"8" + " % 0 \"< & 0 \"@ 4 0 \"D 5 0 \"H 0 0 \"L !@ 0 ! 2 " + " 4 ! 20 8 ! 2@ !0 ! 2P !4 ! 3 ! ! 30 $ P $ !9 (0 " + "$ !: (@ $ !; %P $ !< 0 # 0 %T A 0 %X B 0 %\\ 7 0 & " + " ! , ! 80 \"$ ! 8@ \"( ! 8P !< ! 9 $ P $ !E (0 $" + " !F (@ $ !G %P $ !H 0 # 0 &D A 0 &H B 0 &L 7 0 &P " + " ! , ! ;0 \"$ ! ;@ \"( ! ;P !< ! < $ P $ !Q (0 $ " + " !R (@ $ !S %P $ !T 0 # 0 '4 A 0 '8 B 0 '< 7 0 '@ " + " ! , ! >0 \"$ ! >@ \"( ! >P !< ! ? $ P $ !] (0 $ !" + "^ (@ $ !_ %P $ \" 0 # 0 ($ A 0 (( B 0 (, 7 0 (0 " + " " + " " + " . " + " X ! !@ @ $ 4 ( 0 D ! ! ) >#$Z *\"UB(\"L@&-E<'0 . . 8 ( !@ % \" $ ! 0 ) \" / _#" + "@ # & \" 8 !0 @ $ \"0 . . 8 ( !@ % \"" + " $ ! 0 ) \" 0(] #@ #@ & \" 8 !0 @ ! 0 $ \"" + "0 @ !90 X X !@ @ & 4 ( 0 $ ! D ( . . " + " 8 ( !@ % \" $ ! 0 ) \" #@ #@ & \" 8 !0" + " @ ! 0 $ \"0 @ X X !@ @ & 4 ( 0 $ ! " + " D ( \\#\\. 4 X 8 ( 0 % \" 8 ! 0 . . 8 ( @" + " % \" $ 0 % 0 0 $ #@ ,@\" & \" ( !0 @ ! " + "0 $ !0 $ \\ ! AP '!A'1?:&5I9VAT &-O;F1I=&" + "EO;E]T97AT7W@ !C;VYD:71I;VY?=&5X=%]Y 8V]N9&ET:6]N7W1E>'1?;V9F 8 ( $0 ! $ ! !-0T]3 0 $ $1A=&$. 2 8 ( #0 " + " % \" 8 ! 0 & & -T\" 0 $ ! !0 X #0)P !@ @ ) 4" + " ( 0 * G ! ( \"@)P %)30 . \"< 8 ( @ % \" $ ! 0 " + " % 0 !0 $ % 34-/4P . N\"8 8 ( $0 ! $ ! !-0T]3 0 T !&:6QE5W)A<'!" + "E " + "!R1W)I9 !N97=?8V5L;%]P8@!D96QE=&5?8V5L;%]P8@!P8E]F;&%G $-E;&P '1?;V9F#XP X X !@ @ & 4 ( 0 $ ! D " + " ( \\#\\. , 8 ( ! % \" $ # 0 0 , >#PP X X !@ @ " + " & 4 ( 0 $ ! D ( $ . 2 8 ( #0 % \" 8 " + " ! 0 & & -T\" 0 $ ( 0 X X !@ @ & 4 ( 0 $ " + "! D ( \\#\\. . 8 ( !@ % \" $ ! 0 ) \" " + " / _#@ #@ & \" 8 !0 @ ! 0 $ \"0 @ #P/PX !0 !@ @ " + " - 4 ( !P $ ! 8 < W0( ! @ < ) @ . . 8 " + "( !@ % \" $ ! 0 ) \" ! #@ #@ & \" 8 !0 @ " + " ! 0 $ \"0 @ 0 X !( !@ @ - 4 ( !@ $ ! 8 " + "8 W0( ! 0 ( # #@ $@ & \" T !0 @ & 0 $ !@ !@ " + " #= @ $ ! \" $ . . 8 ( !@ % \" $ ! 0 ) \" " + " / _#@ #@ & \" 8 !0 @ ! 0 $ \"0 @ #P/PX X !@ @ " + "& 4 ( 0 $ ! D ( \\#\\. 2 8 ( #0 % \" 8 " + " ! 0 & & -T\" 0 $ ' @ X P !@ @ $ 4 ( 0 $ " + "! ! 0!X #@ $@ & \" 8 !0 @ ! P $ \"0 !@ #P/P " + " / _ \\#\\. 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ " + " $ @ X !( !@ @ - 4 ( !@ $ ! 8 8 W0( ! 0 D " + "\" #@ # & \" 0 !0 @ ! P $ $ # '@J>0 . 2 8 ( !@ " + "% \" $ # 0 ) & / _ \\#\\ #P/PX !( !@ @ - 4 " + " ( !@ $ ! 8 8 W0( ! 0 8 \" #@ $@ & \" T !0 @ " + " & 0 $ !@ !@ #= @ $ ! !P ( . , 8 ( ! % \" $ " + "# 0 0 , >2MX X !( !@ @ & 4 ( 0 , ! D 8 \\#\\" + " #P/P / _#@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ $ !" + " !@ ( . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ )" + " @ X P !@ @ $ 4 ( 0 $ ! ! 0!Y #@ $@ & \" 8 " + " !0 @ ! P $ \"0 !@ #P/P / _ \\#\\. 6 8 ( #0 %" + " \" D ! 0 & ) -T\" 0 0 # \"@ L , ! . 2 8 " + "( #0 % \" 8 ! 0 & & -T\" 0 $ % 0 X !( !@ @ " + "- 4 ( !@ $ ! 8 8 W0( ! 0 @ ! #@ $@ & \" T " + " !0 @ & 0 $ !@ !@ #= @ $ ! @ , . 2 8 ( #0 % " + " \" 8 ! 0 & & -T\" 0 $ % 0 X !( !@ @ - 4 ( " + " !@ $ ! 8 8 W0( ! 0 @ ! #@ $ & \" 0 !0 @ ! " + " # $ $ P !F7W5N<')O=F%B;&4 #@ # & \" 0 !0 @ ! P $ " + "$ # '@L>0 . F $ 8 ( @ % \" $ ! 0 % 0 !P $ C '0 8V5L;%]I;F1E> '!A'1?> &-O;F1I=&EO;E]T97AT7WD !C;VYD:71I;VY?=&5X=%]O9F9S970 9W)I9%]P=7-H7W=I9'1H " + " X P !@ @ & 4 ( ! D #@ # & \" 8 !0 " + " @ $ \"0 . , 8 ( !@ % \" 0 ) " + " X X !@ @ & 4 ( 0 $ ! D ( . , 8 ( !@ " + " % \" 0 ) X X !@ @ & 4 ( 0 $ ! D " + " ( . . 8 ( !@ % \" $ ! 0 ) \" #@ # " + " & \" 8 !0 @ $ \"0 . . 8 ( !@ % \" $" + " ! 0 ) \" #@ # & \" 8 !0 @ $ \"0 " + " . . 8 ( !@ % \" $ ! 0 ) \" &E #@ #@ & \" " + " 8 !0 @ ! 0 $ \"0 @ !.0 X X !@ @ & 4 ( 0 " + "$ ! D ( )$ . . 8 ( !@ % \" $ ! 0 ) \" " + " \"1 #@ #@ & \" 8 !0 @ ! 0 $ \"0 @ T0 X X !@ " + " @ & 4 ( 0 $ ! D ( /D . ^ 8 ( @ % \" " + "$ ! 0 % 0 !@ $ 2 0V5L;', 1W)I9#$ 1W)I9#( #@ # & \" 8 !0 @" + " $ \"0 . , 8 ( !@ % \" 0 ) X" + " P !@ @ & 4 ( ! D #@ ) ! & \" ( !0 @ " + " ! 0 $ !0 $ P ! / $-E;&PQ $-E;&PR ')E0)\n if(y>5)\n output = x;\n e" + "lseif(y<3)\n output = y+x;\n end\nelseif(x<0)\n if(y>5)\n output = x*y;\n elseif(y<3)\n output = y;\n" + " end\nend\n" + editorLayout "100 M4x1[205 227 1080 733]" + } + } + junction { + id 4 + position [23.5747 49.5747 7] + chart 2 + linkNode [2 0 0] + subviewer 2 + ssIdNumber 3 + type CONNECTIVE_JUNCTION + } + transition { + id 5 + labelString "{eML_blk_kernel();}" + labelPosition [32.125 19.875 102.544 14.964] + fontSize 12 + src { + intersection [0 0 1 0 23.5747 14.625 0 0] + } + dst { + id 4 + intersection [7 0 -1 -1 23.5747 42.5747 0 0] + } + midPoint [23.5747 24.9468] + chart 2 + linkNode [2 0 0] + dataLimits [23.575 23.575 14.625 34.575] + subviewer 2 + drawStyle SMART + executionOrder 1 + ssIdNumber 2 + } + data { + id 6 + ssIdNumber 7 + name "x" + linkNode [2 0 7] + scope INPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + method SF_INHERITED_TYPE + primitive SF_DOUBLE_TYPE + isSigned 1 + wordLength "16" + } + complexity SF_COMPLEX_INHERITED + frame SF_FRAME_INHERITED + } + dataType "Inherit: Same as Simulink" + } + data { + id 7 + ssIdNumber 5 + name "y" + linkNode [2 6 8] + scope INPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + method SF_INHERITED_TYPE + primitive SF_DOUBLE_TYPE + } + complexity SF_COMPLEX_INHERITED + frame SF_FRAME_NO + } + dataType "Inherit: Same as Simulink" + } + data { + id 8 + ssIdNumber 6 + name "output" + linkNode [2 7 0] + scope OUTPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + method SF_INHERITED_TYPE + primitive SF_DOUBLE_TYPE + isSigned 1 + wordLength "16" + } + complexity SF_COMPLEX_INHERITED + frame SF_FRAME_NO + } + dataType "Inherit: Same as Simulink" + } + instance { + id 9 + name "f_unprovable/code" + machine 1 + chart 2 + } + target { + id 10 + name "sfun" + description "Default Simulink S-Function Target." + machine 1 + linkNode [1 0 0] + } +} diff --git a/FindJavaObjects/findjobj.asv b/FindJavaObjects/findjobj.asv new file mode 100644 index 0000000000000000000000000000000000000000..09f556cc99da34ab84c56d05a2e9373bae936489 --- /dev/null +++ b/FindJavaObjects/findjobj.asv @@ -0,0 +1,3459 @@ +function [handles,levels,parentIdx,listing] = findjobj(container),varargin) +%#ok<*CTCH,*ASGLU,*MSNU,*NASGU> +%findjobj Find java objects contained within a specified java container or Matlab GUI handle +% +% Syntax: +% [handles, levels, parentIds, listing] = findjobj(container, 'PropName',PropValue(s), ...) +% +% Input parameters: +% container - optional handle to java container uipanel or figure. If unsupplied then current figure will be used +% 'PropName',PropValue - optional list of property pairs (case insensitive). PropName may also be named -PropName +% 'position' - filter results based on those elements that contain the specified X,Y position or a java element +% Note: specify a Matlab position (X,Y = pixels from bottom left corner), not a java one +% 'size' - filter results based on those elements that have the specified W,H (in pixels) +% 'class' - filter results based on those elements that contain the substring (or java class) PropValue +% Note1: filtering is case insensitive and relies on regexp, so you can pass wildcards etc. +% Note2: '-class' is an undocumented findobj PropName, but only works on Matlab (not java) classes +% 'property' - filter results based on those elements that possess the specified case-insensitive property string +% Note1: passing a property value is possible if the argument following 'property' is a cell in the +% format of {'propName','propValue'}. Example: FINDJOBJ(...,'property',{'Text','click me'}) +% Note2: partial property names (e.g. 'Tex') are accepted, as long as they're not ambiguous +% 'depth' - filter results based on specified depth. 0=top-level, Inf=all levels (default=Inf) +% 'flat' - same as specifying: 'depth',0 +% 'not' - negates the following filter: 'not','class','c' returns all elements EXCEPT those with class 'c' +% 'persist' - persist figure components information, allowing much faster results for subsequent invocations +% 'nomenu' - skip menu processing, for "lean" list of handles & much faster processing; +% This option is the default for HG containers but not for figure, Java or no container +% 'print' - display all java elements in a hierarchical list, indented appropriately +% Note1: optional PropValue of element index or handle to java container +% Note2: normally this option would be placed last, after all filtering is complete. Placing this +% option before some filters enables debug print-outs of interim filtering results. +% Note3: output is to the Matlab command window unless the 'listing' (4th) output arg is requested +% 'list' - same as 'print' +% 'debug' - list found component positions in the Command Window +% +% Output parameters: +% handles - list of handles to java elements +% levels - list of corresponding hierarchy level of the java elements (top=0) +% parentIds - list of indexes (in unfiltered handles) of the parent container of the corresponding java element +% listing - results of 'print'/'list' options (empty if these options were not specified) +% +% Note: If no output parameter is specified, then an interactive window will be displayed with a +% ^^^^ tree view of all container components, their properties and callbacks. +% +% Examples: +% findjobj; % display list of all javaelements of currrent figure in an interactive GUI +% handles = findjobj; % get list of all java elements of current figure (inc. menus, toolbars etc.) +% findjobj('print'); % list all java elements in current figure +% findjobj('print',6); % list all java elements in current figure, contained within its 6th element +% handles = findjobj(hButton); % hButton is a matlab button +% handles = findjobj(gcf,'position',getpixelposition(hButton,1)); % same as above but also return hButton's panel +% handles = findjobj(hButton,'persist'); % same as above, persist info for future reuse +% handles = findjobj('class','pushbutton'); % get all pushbuttons in current figure +% handles = findjobj('class','pushbutton','position',123,456); % get all pushbuttons at the specified position +% handles = findjobj(gcf,'class','pushbutton','size',23,15); % get all pushbuttons with the specified size +% handles = findjobj('property','Text','not','class','button'); % get all non-button elements with 'text' property +% handles = findjobj('-property',{'Text','click me'}); % get all elements with 'text' property = 'click me' +% +% Sample usage: +% hButton = uicontrol('string','click me'); +% jButton = findjobj(hButton,'nomenu'); +% % or: jButton = findjobj('property',{'Text','click me'}); +% jButton.setFlyOverAppearance(1); +% jButton.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.HAND_CURSOR)); +% set(jButton,'FocusGainedCallback',@myMatlabFunction); % some 30 callback points available... +% jButton.get; % list all changeable properties... +% +% hEditbox = uicontrol('style','edit'); +% jEditbox = findjobj(hEditbox,'nomenu'); +% jEditbox.setCaretColor(java.awt.Color.red); +% jEditbox.KeyTypedCallback = @myCallbackFunc; % many more callbacks where this came from... +% jEdit.requestFocus; +% +% Technical explanation & details: +% http://undocumentedmatlab.com/blog/findjobj/ +% http://undocumentedmatlab.com/blog/findjobj-gui-display-container-hierarchy/ +% +% Known issues/limitations: +% - Cannot currently process multiple container objects - just one at a time +% - Initial processing is a bit slow when the figure is laden with many UI components (so better use 'persist') +% - Passing a simple container Matlab handle is currently filtered by its position+size: should find a better way to do this +% - Matlab uipanels are not implemented as simple java panels, and so they can't be found using this utility +% - Labels have a write-only text property in java, so they can't be found using the 'property',{'Text','string'} notation +% +% Warning: +% This code heavily relies on undocumented and unsupported Matlab functionality. +% It works on Matlab 7+, but use at your own risk! +% +% Bugs and suggestions: +% Please send to Yair Altman (altmany at gmail dot com) +% +% Change log: +% 2019-07-03: Additional fix for R2018b; added separate findjobj_fast utility +% 2018-09-21: Fix for R2018b suggested by Eddie (FEX); speedup suggested by Martin Lehmann (FEX); alert if trying to use with uifigure +% 2017-04-13: Fixed two edge-cases (one suggested by H. Koch) +% 2016-04-19: Fixed edge-cases in old Matlab release; slightly improved performance even further +% 2016-04-14: Improved performance for the most common use-case (single input/output): improved code + allow inspecting groot +% 2016-04-11: Improved performance for the most common use-case (single input/output) +% 2015-01-12: Differentiate between overlapping controls (for example in different tabs); fixed case of docked figure +% 2014-10-20: Additional fixes for R2014a, R2014b +% 2014-10-13: Fixes for R2014b +% 2014-01-04: Minor fix for R2014a; check for newer FEX version up to twice a day only +% 2013-12-29: Only check for newer FEX version in non-deployed mode; handled case of invisible figure container +% 2013-10-08: Fixed minor edge case (retrieving multiple scroll-panes) +% 2013-06-30: Additional fixes for the upcoming HG2 +% 2013-05-15: Fix for the upcoming HG2 +% 2013-02-21: Fixed HG-Java warnings +% 2013-01-23: Fixed callbacks table grouping & editing bugs; added hidden properties to the properties tooltip; updated help section +% 2013-01-13: Improved callbacks table; fixed tree refresh failure; fixed: tree node-selection didn't update the props pane nor flash the selected component +% 2012-07-25: Fixes for R2012a as well as some older Matlab releases +% 2011-12-07: Fixed 'File is empty' messages in compiled apps +% 2011-11-22: Fix suggested by Ward +% 2011-02-01: Fixes for R2011a +% 2010-06-13: Fixes for R2010b; fixed download (m-file => zip-file) +% 2010-04-21: Minor fix to support combo-boxes (aka drop-down, popup-menu) on Windows +% 2010-03-17: Important release: Fixes for R2010a, debug listing, objects not found, component containers that should be ignored etc. +% 2010-02-04: Forced an EDT redraw before processing; warned if requested handle is invisible +% 2010-01-18: Found a way to display label text next to the relevant node name +% 2009-10-28: Fixed uitreenode warning +% 2009-10-27: Fixed auto-collapse of invisible container nodes; added dynamic tree tooltips & context-menu; minor fix to version-check display +% 2009-09-30: Fix for Matlab 7.0 as suggested by Oliver W; minor GUI fix (classname font) +% 2009-08-07: Fixed edge-case of missing JIDE tables +% 2009-05-24: Added support for future Matlab versions that will not support JavaFrame +% 2009-05-15: Added sanity checks for axes items +% 2009-04-28: Added 'debug' input arg; increased size tolerance 1px => 2px +% 2009-04-23: Fixed location of popupmenus (always 20px high despite what's reported by Matlab...); fixed uiinspect processing issues; added blog link; narrower action buttons +% 2009-04-09: Automatic 'nomenu' for uicontrol inputs; significant performance improvement +% 2009-03-31: Fixed position of some Java components; fixed properties tooltip; fixed node visibility indication +% 2009-02-26: Indicated components visibility (& auto-collapse non-visible containers); auto-highlight selected component; fixes in node icons, figure title & tree refresh; improved error handling; display FindJObj version update description if available +% 2009-02-24: Fixed update check; added dedicated labels icon +% 2009-02-18: Fixed compatibility with old Matlab versions +% 2009-02-08: Callbacks table fixes; use uiinspect if available; fix update check according to new FEX website +% 2008-12-17: R2008b compatibility +% 2008-09-10: Fixed minor bug as per Johnny Smith +% 2007-11-14: Fixed edge case problem with class properties tooltip; used existing object icon if available; added checkbox option to hide standard callbacks +% 2007-08-15: Fixed object naming relative property priorities; added sanity check for illegal container arg; enabled desktop (0) container; cleaned up warnings about special class objects +% 2007-08-03: Fixed minor tagging problems with a few Java sub-classes; displayed UIClassID if text/name/tag is unavailable +% 2007-06-15: Fixed problems finding HG components found by J. Wagberg +% 2007-05-22: Added 'nomenu' option for improved performance; fixed 'export handles' bug; fixed handle-finding/display bugs; "cleaner" error handling +% 2007-04-23: HTMLized classname tooltip; returned top-level figure Frame handle for figure container; fixed callbacks table; auto-checked newer version; fixed Matlab 7.2 compatibility issue; added HG objects tree +% 2007-04-19: Fixed edge case of missing figure; displayed tree hierarchy in interactive GUI if no output args; workaround for figure sub-menus invisible unless clicked +% 2007-04-04: Improved performance; returned full listing results in 4th output arg; enabled partial property names & property values; automatically filtered out container panels if children also returned; fixed finding sub-menu items +% 2007-03-20: First version posted on the MathWorks file exchange: http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=14317 +% +% See also: +% java, handle, findobj, findall, javaGetHandles, uiinspect (on the File Exchange) + +% License to use and modify this code is granted freely to all interested, as long as the original author is +% referenced and attributed as such. The original author maintains the right to be solely associated with this work. + +% Programmed and Copyright by Yair M. Altman: altmany(at)gmail.com +% $Revision: 1.52 $ $Date: 2019/07/03 19:09:23 $ + + % Ensure Java AWT is enabled + error(javachk('awt')); + + persistent pContainer pHandles pLevels pParentIdx pPositions + + try + % Initialize + handles = handle([]); + levels = []; + parentIdx = []; + positions = []; % Java positions start at the top-left corner + %sizes = []; + listing = ''; + hg_levels = []; + hg_handles = handle([]); % HG handles are double + hg_parentIdx = []; + nomenu = false; + menuBarFoundFlag = false; + hFig = []; + + % Force an EDT redraw before processing, to ensure all uicontrols etc. are rendered + drawnow; pause(0.02); + + % Default container is the current figure's root panel + if nargin + if isempty(container) % empty container - bail out + return; + elseif ischar(container) % container skipped - this is part of the args list... + varargin = [{container}, varargin]; + origContainer = getCurrentFigure; + [container,contentSize] = getRootPanel(origContainer); + elseif isequal(container,0) % root + origContainer = handle(container); + container = com.mathworks.mde.desk.MLDesktop.getInstance.getMainFrame; + contentSize = [container.getWidth, container.getHeight]; + elseif ishghandle(container) % && ~isa(container,'java.awt.Container') + container = container(1); % another current limitation... + hFig = ancestor(container,'figure'); + oldWarn = warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + try hJavaFrame = get(hFig,'JavaFrame'); catch, hJavaFrame = []; end + warning(oldWarn); + if isempty(hJavaFrame) % alert if trying to use with web-based (not Java-based) uifigure + error('YMA:findjobj:NonJavaFigure', 'Findjobj only works with Java-based figures, not web-based (App Designer) uifigures'); + end + origContainer = handle(container); + if isa(origContainer,'uimenu') || isa(origContainer,'matlab.ui.container.Menu') + % getpixelposition doesn't work for menus... - damn! + varargin = {'class','MenuPeer', 'property',{'Label',strrep(get(container,'Label'),'&','')}, varargin{:}}; + elseif ~isa(origContainer, 'figure') && ~isempty(hFig) && ~isa(origContainer, 'matlab.ui.Figure') + % For a single input & output, try using the fast variant + if nargin==1 && nargout==1 + try + handles = findjobj_fast(container); + if ~isempty(handles) + try handles = handle(handles,'callbackproperties'); catch, end + return + end + catch + % never mind - proceed normally using the slower variant below... + end + end + + % See limitations section above: should find a better way to directly refer to the element's java container + try + % Note: 'PixelBounds' is undocumented and unsupported, but much faster than getpixelposition! + % ^^^^ unfortunately, its Y position is inaccurate in some cases - damn! + %size = get(container,'PixelBounds'); + pos = fix(getpixelposition(container,1)); + %varargin = {'position',pos(1:2), 'size',pos(3:4), 'not','class','java.awt.Panel', varargin{:}}; + catch + try + figName = get(hFig,'name'); + if strcmpi(get(hFig,'number'),'on') + figName = regexprep(['Figure ' num2str(hFig) ': ' figName],': $',''); + end + mde = com.mathworks.mde.desk.MLDesktop.getInstance; + jFig = mde.getClient(figName); + if isempty(jFig), error('dummy'); end + catch + jFig = get(hJavaFrame,'FigurePanelContainer'); + end + pos = []; + try + pxsize = get(container,'PixelBounds'); + pos = [pxsize(1)+5, jFig.getHeight - (pxsize(4)-5)]; + catch + % never mind... + end + end + if size(pos,2) == 2 + pos(:,3:4) = 0; + end + if ~isempty(pos) + if isa(handle(container),'uicontrol') && strcmp(get(container,'style'),'popupmenu') + % popupmenus (combo-box dropdowns) are always 20px high + pos(2) = pos(2) + pos(4) - 20; + pos(4) = 20; + end + %varargin = {'position',pos(1:2), 'size',size(3:4)-size(1:2)-10, 'not','class','java.awt.Panel', varargin{:}}; + varargin = {'position',pos(1:2)+[0,pos(4)], 'size',pos(3:4), 'not','class','java.awt.Panel', 'nomenu', varargin{:}}; + end + elseif isempty(hFig) + hFig = handle(container); + end + [container,contentSize] = getRootPanel(hFig); + elseif isjava(container) + % Maybe a java container obj (will crash otherwise) + origContainer = container; + contentSize = [container.getWidth, container.getHeight]; + else + error('YMA:findjobj:IllegalContainer','Input arg does not appear to be a valid GUI object'); + end + else + % Default container = current figure + origContainer = getCurrentFigure; + [container,contentSize] = getRootPanel(origContainer); + end + + % Check persistency + if isequal(pContainer,container) + % persistency requested and the same container is reused, so reuse the hierarchy information + [handles,levels,parentIdx,positions] = deal(pHandles, pLevels, pParentIdx, pPositions); + else + % Pre-allocate space of complex data containers for improved performance + handles = repmat(handles,1,1000); + positions = zeros(1000,2); + + % Check whether to skip menu processing + nomenu = paramSupplied(varargin,'nomenu'); + + % Traverse the container hierarchy and extract the elements within + traverseContainer(container,0,1); + + % Remove unnecessary pre-allocated elements + dataLen = length(levels); + handles (dataLen+1:end) = []; + positions(dataLen+1:end,:) = []; + end + + % Process persistency check before any filtering is done + if paramSupplied(varargin,'persist') + [pContainer, pHandles, pLevels, pParentIdx, pPositions] = deal(container,handles,levels,parentIdx,positions); + end + + % Save data for possible future use in presentObjectTree() below + allHandles = handles; + allLevels = levels; + allParents = parentIdx; + selectedIdx = 1:length(handles); + %[positions(:,1)-container.getX, container.getHeight - positions(:,2)] + + % Debug-list all found compponents and their positions + if paramSupplied(varargin,'debug') + for origHandleIdx = 1 : length(allHandles) + thisObj = handles(origHandleIdx); + pos = sprintf('%d,%d %dx%d',[positions(origHandleIdx,:) getWidth(thisObj) getHeight(thisObj)]); + disp([repmat(' ',1,levels(origHandleIdx)) '[' pos '] ' char(toString(thisObj))]); + end + end + + % Process optional args + % Note: positions is NOT returned since it's based on java coord system (origin = top-left): will confuse Matlab users + processArgs(varargin{:}); + + % De-cell and trim listing, if only one element was found (no use for indented listing in this case) + if iscell(listing) && length(listing)==1 + listing = strtrim(listing{1}); + end + + % If no output args and no listing requested, present the FINDJOBJ interactive GUI + if nargout == 0 && isempty(listing) + + % Get all label positions + hg_labels = []; + labelPositions = getLabelsJavaPos(container); + + % Present the GUI (object tree) + if ~isempty(container) + presentObjectTree(); + else + warnInvisible(varargin{:}); + end + + % Display the listing, if this was specifically requested yet no relevant output arg was specified + elseif nargout < 4 && ~isempty(listing) + if ~iscell(listing) + disp(listing); + else + for listingIdx = 1 : length(listing) + disp(listing{listingIdx}); + end + end + end + + % If the number of output handles does not match the number of inputs, try to match via tooltips + if nargout && numel(handles) ~= numel(origContainer) + newHandles = handle([]); + switchHandles = false; + handlesToCheck = handles; + if isempty(handles) + handlesToCheck = allHandles; + end + for origHandleIdx = 1 : numel(origContainer) + try + thisContainer = origContainer(origHandleIdx); + if isa(thisContainer,'figure') || isa(thisContainer,'matlab.ui.Figure') + break; + end + try + newHandles(origHandleIdx) = handlesToCheck(origHandleIdx); %#ok + catch + % maybe no corresponding handle in [handles] + end + + % Assign a new random tooltip to the original (Matlab) handle + oldTooltip = get(thisContainer,'Tooltip'); + newTooltip = num2str(rand,99); + try + set(thisContainer,'TooltipString',newTooltip); + catch + set(thisContainer,'Tooltip',newTooltip); + end + drawnow; % force the Java handle to sync with the Matlab prop-change + try + % Search for a Java handle that has the newly-generated tooltip + for newHandleIdx = 1 : numel(handlesToCheck) + testTooltip = ''; + thisHandle = handlesToCheck(newHandleIdx); + try + testTooltip = char(thisHandle.getToolTipText); + catch + try testTooltip = char(thisHandle.getTooltipText); catch, end + end + if isempty(testTooltip) + % One more attempt - assume it's enclosed by a scroll-pane + try testTooltip = char(thisHandle.getViewport.getView.getToolTipText); catch, end + end + if strcmp(testTooltip, newTooltip) + newHandles(origHandleIdx) = thisHandle; + switchHandles = true; + break; + end + end + catch + % never mind - skip to the next handle + end + set(thisContainer,'Tooltip',oldTooltip); + catch + % never mind - skip to the next handle (maybe handle doesn't have a tooltip prop) + end + end + if switchHandles + handles = newHandles; + end + end + + % Display a warning if the requested handle was not found because it's invisible + if nargout && isempty(handles) + warnInvisible(varargin{:}); + end + + return; %debug point + + catch + % 'Cleaner' error handling - strip the stack info etc. + err = lasterror; %#ok + err.message = regexprep(err.message,'Error using ==> [^\n]+\n',''); + if isempty(findstr(mfilename,err.message)) + % Indicate error origin, if not already stated within the error message + err.message = [mfilename ': ' err.message]; + end + rethrow(err); + end + + %% Display a warning if the requested handle was not found because it's invisible + function warnInvisible(varargin) + try + if strcmpi(get(hFig,'Visible'),'off') + pos = get(hFig,'Position'); + set(hFig, 'Position',pos-[5000,5000,0,0], 'Visible','on'); + drawnow; pause(0.01); + [handles,levels,parentIdx,listing] = findjobj(origContainer,varargin{:}); + set(hFig, 'Position',pos, 'Visible','off'); + end + catch + % ignore - move on... + end + try + stk = dbstack; + stkNames = {stk.name}; + OutputFcnIdx = find(~cellfun(@isempty,regexp(stkNames,'_OutputFcn'))); + if ~isempty(OutputFcnIdx) + OutputFcnName = stkNames{OutputFcnIdx}; + warning('YMA:FindJObj:OutputFcn',['No Java reference was found for the requested handle, because the figure is still invisible in ' OutputFcnName '()']); + elseif ishandle(origContainer) && isprop(origContainer,'Visible') && strcmpi(get(origContainer,'Visible'),'off') + warning('YMA:FindJObj:invisibleHandle','No Java reference was found for the requested handle, probably because it is still invisible'); + end + catch + % Never mind... + end + end + + %% Check existence of a (case-insensitive) optional parameter in the params list + function [flag,idx] = paramSupplied(paramsList,paramName) + %idx = find(~cellfun('isempty',regexpi(paramsList(cellfun(@ischar,paramsList)),['^-?' paramName]))); + idx = find(~cellfun('isempty',regexpi(paramsList(cellfun('isclass',paramsList,'char')),['^-?' paramName]))); % 30/9/2009 fix for ML 7.0 suggested by Oliver W + flag = any(idx); + end + + %% Get current figure (even if its 'HandleVisibility' property is 'off') + function curFig = getCurrentFigure + oldShowHidden = get(0,'ShowHiddenHandles'); + set(0,'ShowHiddenHandles','on'); % minor fix per Johnny Smith + curFig = gcf; + set(0,'ShowHiddenHandles',oldShowHidden); + end + + %% Get Java reference to top-level (root) panel - actually, a reference to the java figure + function [jRootPane,contentSize] = getRootPanel(hFig) + try + contentSize = [0,0]; % initialize + jRootPane = hFig; + figName = get(hFig,'name'); + if strcmpi(get(hFig,'number'),'on') + figName = regexprep(['Figure ' num2str(hFig) ': ' figName],': $',''); + end + mde = com.mathworks.mde.desk.MLDesktop.getInstance; + jFigPanel = mde.getClient(figName); + jRootPane = jFigPanel; + jRootPane = jFigPanel.getRootPane; + catch + try + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + jFrame = get(hFig,'JavaFrame'); + jFigPanel = get(jFrame,'FigurePanelContainer'); + jRootPane = jFigPanel; + jRootPane = jFigPanel.getComponent(0).getRootPane; + catch + % Never mind + end + end + try + % If invalid RootPane - try another method... + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + jFrame = get(hFig,'JavaFrame'); + jAxisComponent = get(jFrame,'AxisComponent'); + jRootPane = jAxisComponent.getParent.getParent.getRootPane; + catch + % Never mind + end + try + % If invalid RootPane, retry up to N times + tries = 10; + while isempty(jRootPane) && tries>0 % might happen if figure is still undergoing rendering... + drawnow; pause(0.001); + tries = tries - 1; + jRootPane = jFigPanel.getComponent(0).getRootPane; + end + + % If still invalid, use FigurePanelContainer which is good enough in 99% of cases... (menu/tool bars won't be accessible, though) + if isempty(jRootPane) + jRootPane = jFigPanel; + end + contentSize = [jRootPane.getWidth, jRootPane.getHeight]; + + % Try to get the ancestor FigureFrame + jRootPane = jRootPane.getTopLevelAncestor; + catch + % Never mind - FigurePanelContainer is good enough in 99% of cases... (menu/tool bars won't be accessible, though) + end + end + + %% Traverse the container hierarchy and extract the elements within + function traverseContainer(jcontainer,level,parent) + persistent figureComponentFound menuRootFound + + % Record the data for this node + %disp([repmat(' ',1,level) '<= ' char(jcontainer.toString)]) + thisIdx = length(levels) + 1; + levels(thisIdx) = level; + parentIdx(thisIdx) = parent; + try newHandle = handle(jcontainer,'callbackproperties'); catch, newHandle = handle(jcontainer); end + try handles(thisIdx) = newHandle; catch, handles = newHandle; end + try + positions(thisIdx,:) = getXY(jcontainer); + %sizes(thisIdx,:) = [jcontainer.getWidth, jcontainer.getHeight]; + catch + positions(thisIdx,:) = [0,0]; + %sizes(thisIdx,:) = [0,0]; + end + if level>0 + positions(thisIdx,:) = positions(thisIdx,:) + positions(parent,:); + if ~figureComponentFound && ... + strcmp(jcontainer.getName,'fComponentContainer') && ... + isa(jcontainer,'com.mathworks.hg.peer.FigureComponentContainer') % there are 2 FigureComponentContainers - only process one... + + % restart coordinate system, to exclude menu & toolbar areas + positions(thisIdx,:) = positions(thisIdx,:) - [jcontainer.getRootPane.getX, jcontainer.getRootPane.getY]; + figureComponentFound = true; + end + elseif level==1 + positions(thisIdx,:) = positions(thisIdx,:) + positions(parent,:); + else + % level 0 - initialize flags used later + figureComponentFound = false; + menuRootFound = false; + end + parentId = length(parentIdx); + + % Traverse Menu items, unless the 'nomenu' option was requested + if ~nomenu + try + for child = 1 : getNumMenuComponents(jcontainer) + traverseContainer(jcontainer.getMenuComponent(child-1),level+1,parentId); + end + catch + % Probably not a Menu container, but maybe a top-level JMenu, so discard duplicates + %if isa(handles(end).java,'javax.swing.JMenuBar') + if ~menuRootFound && strcmp(class(java(handles(end))),'javax.swing.JMenuBar') %faster... + if removeDuplicateNode(thisIdx) + menuRootFound = true; + return; + end + end + end + end + + % Now recursively process all this node's children (if any), except menu items if so requested + %if isa(jcontainer,'java.awt.Container') + try % try-catch is faster than checking isa(jcontainer,'java.awt.Container')... + %if jcontainer.getComponentCount, jcontainer.getComponents, end + if ~nomenu || menuBarFoundFlag || isempty(strfind(class(jcontainer),'FigureMenuBar')) + lastChildComponent = java.lang.Object; + child = 0; + while (child < jcontainer.getComponentCount) + childComponent = jcontainer.getComponent(child); + % Looping over menus sometimes causes jcontainer to get mixed up (probably a JITC bug), so identify & fix + if isequal(childComponent,lastChildComponent) + child = child + 1; + childComponent = jcontainer.getComponent(child); + end + lastChildComponent = childComponent; + %disp([repmat(' ',1,level) '=> ' num2str(child) ': ' char(class(childComponent))]) + traverseContainer(childComponent,level+1,parentId); + child = child + 1; + end + else + menuBarFoundFlag = true; % use this flag to skip further testing for FigureMenuBar + end + catch + % do nothing - probably not a container + %dispError + end + + % ...and yet another type of child traversal... + try + if ~isdeployed % prevent 'File is empty' messages in compiled apps + jc = jcontainer.java; + else + jc = jcontainer; + end + for child = 1 : jc.getChildCount + traverseContainer(jc.getChildAt(child-1),level+1,parentId); + end + catch + % do nothing - probably not a container + %dispError + end + + % TODO: Add axis (plot) component handles + end + + %% Get the XY location of a Java component + function xy = getXY(jcontainer) + % Note: getX/getY are better than get(..,'X') (mem leaks), + % ^^^^ but sometimes they fail and revert to getx.m ... + % Note2: try awtinvoke() catch is faster than checking ismethod()... + % Note3: using AWTUtilities.invokeAndWait() directly is even faster than awtinvoke()... + try %if ismethod(jcontainer,'getX') + %positions(thisIdx,:) = [jcontainer.getX, jcontainer.getY]; + cls = getClass(jcontainer); + location = com.mathworks.jmi.AWTUtilities.invokeAndWait(jcontainer,getMethod(cls,'getLocation',[]),[]); + x = location.getX; + y = location.getY; + catch %else + try + x = com.mathworks.jmi.AWTUtilities.invokeAndWait(jcontainer,getMethod(cls,'getX',[]),[]); + y = com.mathworks.jmi.AWTUtilities.invokeAndWait(jcontainer,getMethod(cls,'getY',[]),[]); + catch + try + x = awtinvoke(jcontainer,'getX()'); + y = awtinvoke(jcontainer,'getY()'); + catch + x = get(jcontainer,'X'); + y = get(jcontainer,'Y'); + end + end + end + %positions(thisIdx,:) = [x, y]; + xy = [x,y]; + end + + %% Get the number of menu sub-elements + function numMenuComponents = getNumMenuComponents(jcontainer) + + % The following line will raise an Exception for anything except menus + numMenuComponents = jcontainer.getMenuComponentCount; + + % No error so far, so this must be a menu container... + % Note: Menu subitems are not visible until the top-level (root) menu gets initial focus... + % Try several alternatives, until we get a non-empty menu (or not...) + % TODO: Improve performance - this takes WAY too long... + if jcontainer.isTopLevelMenu && (numMenuComponents==0) + jcontainer.requestFocus; + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + drawnow; pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + jcontainer.setSelected(true); + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + drawnow; pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + jcontainer.doClick; % needed in order to populate the sub-menu components + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + drawnow; %pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + jcontainer.doClick; % close menu by re-clicking... + if (numMenuComponents == 0) + drawnow; %pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + end + else + % ok - found sub-items + % Note: no need to close menu since this will be done when focus moves to the FindJObj window + %jcontainer.doClick; % close menu by re-clicking... + end + end + end + jcontainer.setSelected(false); % de-select the menu + end + end + end + end + + %% Remove a specific tree node's data + function nodeRemovedFlag = removeDuplicateNode(thisIdx) + nodeRemovedFlag = false; + for idx = 1 : thisIdx-1 + if isequal(handles(idx),handles(thisIdx)) + levels(thisIdx) = []; + parentIdx(thisIdx) = []; + handles(thisIdx) = []; + positions(thisIdx,:) = []; + %sizes(thisIdx,:) = []; + nodeRemovedFlag = true; + return; + end + end + end + + %% Process optional args + function processArgs(varargin) + + % Initialize + invertFlag = false; + listing = ''; + + % Loop over all optional args + while ~isempty(varargin) && ~isempty(handles) + + % Process the arg (and all its params) + foundIdx = 1 : length(handles); + if iscell(varargin{1}), varargin{1} = varargin{1}{1}; end + if ~isempty(varargin{1}) && varargin{1}(1)=='-' + varargin{1}(1) = []; + end + switch lower(varargin{1}) + case 'not' + invertFlag = true; + case 'position' + [varargin,foundIdx] = processPositionArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'size' + [varargin,foundIdx] = processSizeArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'class' + [varargin,foundIdx] = processClassArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'property' + [varargin,foundIdx] = processPropertyArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'depth' + [varargin,foundIdx] = processDepthArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'flat' + varargin = {'depth',0, varargin{min(2:end):end}}; + [varargin,foundIdx] = processDepthArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case {'print','list'} + [varargin,listing] = processPrintArgs(varargin{:}); + case {'persist','nomenu','debug'} + % ignore - already handled in main function above + otherwise + error('YMA:findjobj:IllegalOption',['Option ' num2str(varargin{1}) ' is not a valid option. Type ''help ' mfilename ''' for the full options list.']); + end + + % If only parent-child pairs found + foundIdx = find(foundIdx); + if ~isempty(foundIdx) && isequal(parentIdx(foundIdx(2:2:end)),foundIdx(1:2:end)) + % Return just the children (the parent panels are uninteresting) + foundIdx(1:2:end) = []; + end + + % If several possible handles were found and the first is the container of the second + if length(foundIdx) == 2 && isequal(handles(foundIdx(1)).java, handles(foundIdx(2)).getParent) + % Discard the uninteresting component container + foundIdx(1) = []; + end + + % Filter the results + selectedIdx = selectedIdx(foundIdx); + handles = handles(foundIdx); + levels = levels(foundIdx); + parentIdx = parentIdx(foundIdx); + positions = positions(foundIdx,:); + + % Remove this arg and proceed to the next one + varargin(1) = []; + + end % Loop over all args + end + + %% Process 'print' option + function [varargin,listing] = processPrintArgs(varargin) + if length(varargin)<2 || ischar(varargin{2}) + % No second arg given, so use the first available element + listingContainer = handles(1); %#ok - used in evalc below + else + % Get the element to print from the specified second arg + if isnumeric(varargin{2}) && (varargin{2} == fix(varargin{2})) % isinteger doesn't work on doubles... + if (varargin{2} > 0) && (varargin{2} <= length(handles)) + listingContainer = handles(varargin{2}); %#ok - used in evalc below + elseif varargin{2} > 0 + error('YMA:findjobj:IllegalPrintFilter','Print filter index %g > number of available elements (%d)',varargin{2},length(handles)); + else + error('YMA:findjobj:IllegalPrintFilter','Print filter must be a java handle or positive numeric index into handles'); + end + elseif ismethod(varargin{2},'list') + listingContainer = varargin{2}; %#ok - used in evalc below + else + error('YMA:findjobj:IllegalPrintFilter','Print filter must be a java handle or numeric index into handles'); + end + varargin(2) = []; + end + + % use evalc() to capture output into a Matlab variable + %listing = evalc('listingContainer.list'); + + % Better solution: loop over all handles and process them one by one + listing = cell(length(handles),1); + for componentIdx = 1 : length(handles) + listing{componentIdx} = [repmat(' ',1,levels(componentIdx)) char(handles(componentIdx).toString)]; + end + end + + %% Process 'position' option + function [varargin,foundIdx] = processPositionArgs(varargin) + if length(varargin)>1 + positionFilter = varargin{2}; + %if (isjava(positionFilter) || iscom(positionFilter)) && ismethod(positionFilter,'getLocation') + try % try-catch is faster... + % Java/COM object passed - get its position + positionFilter = positionFilter.getLocation; + filterXY = [positionFilter.getX, positionFilter.getY]; + catch + if ~isscalar(positionFilter) + % position vector passed + if (length(positionFilter)>=2) && isnumeric(positionFilter) + % Remember that java coordinates start at top-left corner, Matlab coords start at bottom left... + %positionFilter = java.awt.Point(positionFilter(1), container.getHeight - positionFilter(2)); + filterXY = [container.getX + positionFilter(1), container.getY + contentSize(2) - positionFilter(2)]; + + % Check for full Matlab position vector (x,y,w,h) + %if (length(positionFilter)==4) + % varargin{end+1} = 'size'; + % varargin{end+1} = fix(positionFilter(3:4)); + %end + else + error('YMA:findjobj:IllegalPositionFilter','Position filter must be a java UI component, or X,Y pair'); + end + elseif length(varargin)>2 + % x,y passed as separate arg values + if isnumeric(positionFilter) && isnumeric(varargin{3}) + % Remember that java coordinates start at top-left corner, Matlab coords start at bottom left... + %positionFilter = java.awt.Point(positionFilter, container.getHeight - varargin{3}); + filterXY = [container.getX + positionFilter, container.getY + contentSize(2) - varargin{3}]; + varargin(3) = []; + else + error('YMA:findjobj:IllegalPositionFilter','Position filter must be a java UI component, or X,Y pair'); + end + else + error('YMA:findjobj:IllegalPositionFilter','Position filter must be a java UI component, or X,Y pair'); + end + end + + % Compute the required element positions in order to be eligible for a more detailed examination + % Note: based on the following constraints: 0 <= abs(elementX-filterX) + abs(elementY+elementH-filterY) < 7 + baseDeltas = [positions(:,1)-filterXY(1), positions(:,2)-filterXY(2)]; % faster than repmat()... + %baseHeight = - baseDeltas(:,2);% -abs(baseDeltas(:,1)); + %minHeight = baseHeight - 7; + %maxHeight = baseHeight + 7; + %foundIdx = ~arrayfun(@(b)(invoke(b,'contains',positionFilter)),handles); % ARGH! - disallowed by Matlab! + %foundIdx = repmat(false,1,length(handles)); + %foundIdx(length(handles)) = false; % faster than repmat()... + foundIdx = (abs(baseDeltas(:,1)) < 7) & (abs(baseDeltas(:,2)) < 7); % & (minHeight >= 0); + %fi = find(foundIdx); + %for componentIdx = 1 : length(fi) + %foundIdx(componentIdx) = handles(componentIdx).getBounds.contains(positionFilter); + + % Search for a point no farther than 7 pixels away (prevents rounding errors) + %foundIdx(componentIdx) = handles(componentIdx).getLocationOnScreen.distanceSq(positionFilter) < 50; % fails for invisible components... + + %p = java.awt.Point(positions(componentIdx,1), positions(componentIdx,2) + handles(componentIdx).getHeight); + %foundIdx(componentIdx) = p.distanceSq(positionFilter) < 50; + + %foundIdx(componentIdx) = sum(([baseDeltas(componentIdx,1),baseDeltas(componentIdx,2)+handles(componentIdx).getHeight]).^2) < 50; + + % Following is the fastest method found to date: only eligible elements are checked in detailed + % elementHeight = handles(fi(componentIdx)).getHeight; + % foundIdx(fi(componentIdx)) = elementHeight > minHeight(fi(componentIdx)) && ... + % elementHeight < maxHeight(fi(componentIdx)); + %disp([componentIdx,elementHeight,minHeight(fi(componentIdx)),maxHeight(fi(componentIdx)),foundIdx(fi(componentIdx))]) + %end + + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'size' option + function [varargin,foundIdx] = processSizeArgs(varargin) + if length(varargin)>1 + sizeFilter = lower(varargin{2}); + %if (isjava(sizeFilter) || iscom(sizeFilter)) && ismethod(sizeFilter,'getSize') + try % try-catch is faster... + % Java/COM object passed - get its size + sizeFilter = sizeFilter.getSize; + filterWidth = sizeFilter.getWidth; + filterHeight = sizeFilter.getHeight; + catch + if ~isscalar(sizeFilter) + % size vector passed + if (length(sizeFilter)>=2) && isnumeric(sizeFilter) + %sizeFilter = java.awt.Dimension(sizeFilter(1),sizeFilter(2)); + filterWidth = sizeFilter(1); + filterHeight = sizeFilter(2); + else + error('YMA:findjobj:IllegalSizeFilter','Size filter must be a java UI component, or W,H pair'); + end + elseif length(varargin)>2 + % w,h passed as separate arg values + if isnumeric(sizeFilter) && isnumeric(varargin{3}) + %sizeFilter = java.awt.Dimension(sizeFilter,varargin{3}); + filterWidth = sizeFilter; + filterHeight = varargin{3}; + varargin(3) = []; + else + error('YMA:findjobj:IllegalSizeFilter','Size filter must be a java UI component, or W,H pair'); + end + else + error('YMA:findjobj:IllegalSizeFilter','Size filter must be a java UI component, or W,H pair'); + end + end + %foundIdx = ~arrayfun(@(b)(invoke(b,'contains',sizeFilter)),handles); % ARGH! - disallowed by Matlab! + foundIdx(length(handles)) = false; % faster than repmat()... + for componentIdx = 1 : length(handles) + %foundIdx(componentIdx) = handles(componentIdx).getSize.equals(sizeFilter); + % Allow a 2-pixel tollerance to account for non-integer pixel sizes + foundIdx(componentIdx) = abs(handles(componentIdx).getWidth - filterWidth) <= 3 && ... % faster than getSize.equals() + abs(handles(componentIdx).getHeight - filterHeight) <= 3; + end + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'class' option + function [varargin,foundIdx] = processClassArgs(varargin) + if length(varargin)>1 + classFilter = varargin{2}; + %if ismethod(classFilter,'getClass') + try % try-catch is faster... + classFilter = char(classFilter.getClass); + catch + if ~ischar(classFilter) + error('YMA:findjobj:IllegalClassFilter','Class filter must be a java object, class or string'); + end + end + + % Now convert all java classes to java.lang.Strings and compare to the requested filter string + try + foundIdx(length(handles)) = false; % faster than repmat()... + jClassFilter = java.lang.String(classFilter).toLowerCase; + for componentIdx = 1 : length(handles) + % Note: JVM 1.5's String.contains() appears slightly slower and is available only since Matlab 7.2 + foundIdx(componentIdx) = handles(componentIdx).getClass.toString.toLowerCase.indexOf(jClassFilter) >= 0; + end + catch + % Simple processing: slower since it does extra processing within opaque.char() + for componentIdx = 1 : length(handles) + % Note: using @toChar is faster but returns java String, not a Matlab char + foundIdx(componentIdx) = ~isempty(regexpi(char(handles(componentIdx).getClass),classFilter)); + end + end + + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'property' option + function [varargin,foundIdx] = processPropertyArgs(varargin) + if length(varargin)>1 + propertyName = varargin{2}; + if iscell(propertyName) + if length(propertyName) == 2 + propertyVal = propertyName{2}; + propertyName = propertyName{1}; + elseif length(propertyName) == 1 + propertyName = propertyName{1}; + else + error('YMA:findjobj:IllegalPropertyFilter','Property filter must be a string (case insensitive name of property) or cell array {propName,propValue}'); + end + end + if ~ischar(propertyName) + error('YMA:findjobj:IllegalPropertyFilter','Property filter must be a string (case insensitive name of property) or cell array {propName,propValue}'); + end + propertyName = lower(propertyName); + %foundIdx = arrayfun(@(h)isprop(h,propertyName),handles); % ARGH! - disallowed by Matlab! + foundIdx(length(handles)) = false; % faster than repmat()... + + % Split processing depending on whether a specific property value was requested (ugly but faster...) + if exist('propertyVal','var') + for componentIdx = 1 : length(handles) + try + % Find out whether this element has the specified property + % Note: findprop() and its return value schema.prop are undocumented and unsupported! + prop = findprop(handles(componentIdx),propertyName); % faster than isprop() & enables partial property names + + % If found, compare it to the actual element's property value + foundIdx(componentIdx) = ~isempty(prop) && isequal(get(handles(componentIdx),prop.Name),propertyVal); + catch + % Some Java classes have a write-only property (like LabelPeer with 'Text'), so we end up here + % In these cases, simply assume that the property value doesn't match and continue + foundIdx(componentIdx) = false; + end + end + else + for componentIdx = 1 : length(handles) + try + % Find out whether this element has the specified property + % Note: findprop() and its return value schema.prop are undocumented and unsupported! + foundIdx(componentIdx) = ~isempty(findprop(handles(componentIdx),propertyName)); + catch + foundIdx(componentIdx) = false; + end + end + end + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'depth' option + function [varargin,foundIdx] = processDepthArgs(varargin) + if length(varargin)>1 + level = varargin{2}; + if ~isnumeric(level) + error('YMA:findjobj:IllegalDepthFilter','Depth filter must be a number (=maximal element depth)'); + end + foundIdx = (levels <= level); + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Convert property data into a string + function data = charizeData(data) + if isa(data,'com.mathworks.hg.types.HGCallback') + data = get(data,'Callback'); + end + if ~ischar(data) && ~isa(data,'java.lang.String') + newData = strtrim(evalc('disp(data)')); + try + newData = regexprep(newData,' +',' '); + newData = regexprep(newData,'Columns \d+ through \d+\s',''); + newData = regexprep(newData,'Column \d+\s',''); + catch + %never mind... + end + if iscell(data) + newData = ['{ ' newData ' }']; + elseif isempty(data) + newData = ''; + elseif isnumeric(data) || islogical(data) || any(ishandle(data)) || numel(data) > 1 %&& ~isscalar(data) + newData = ['[' newData ']']; + end + data = newData; + elseif ~isempty(data) + data = ['''' data '''']; + end + end % charizeData + + %% Prepare a hierarchical callbacks table data + function setProp(list,name,value,category) + prop = eval('com.jidesoft.grid.DefaultProperty();'); % prevent JIDE alert by run-time (not load-time) evaluation + prop.setName(name); + prop.setType(java.lang.String('').getClass); + prop.setValue(value); + prop.setEditable(true); + prop.setExpert(true); + %prop.setCategory(['' category ' callbacks']); + prop.setCategory([category ' callbacks']); + list.add(prop); + end % getTreeData + + %% Prepare a hierarchical callbacks table data + function list = getTreeData(data) + list = java.util.ArrayList(); + names = regexprep(data,'([A-Z][a-z]+).*','$1'); + %hash = java.util.Hashtable; + others = {}; + for propIdx = 1 : size(data,1) + if (propIdx < size(data,1) && strcmp(names{propIdx},names{propIdx+1})) || ... + (propIdx > 1 && strcmp(names{propIdx},names{propIdx-1})) + % Child callback property + setProp(list,data{propIdx,1},data{propIdx,2},names{propIdx}); + else + % Singular callback property => Add to 'Other' category at bottom of the list + others(end+1,:) = data(propIdx,:); %#ok + end + end + for propIdx = 1 : size(others,1) + setProp(list,others{propIdx,1},others{propIdx,2},'Other'); + end + end % getTreeData + + %% Get callbacks table data + function [cbData, cbHeaders, cbTableEnabled] = getCbsData(obj, stripStdCbsFlag) + % Initialize + cbData = {'(no callbacks)'}; + cbHeaders = {'Callback name'}; + cbTableEnabled = false; + cbNames = {}; + + try + try + classHdl = classhandle(handle(obj)); + cbNames = get(classHdl.Events,'Name'); + if ~isempty(cbNames) && ~iscom(obj) %only java-based please... + cbNames = strcat(cbNames,'Callback'); + end + propNames = get(classHdl.Properties,'Name'); + catch + % Try to interpret as an MCOS class object + try + oldWarn = warning('off','MATLAB:structOnObject'); + dataFields = struct(obj); + warning(oldWarn); + catch + dataFields = get(obj); + end + propNames = fieldnames(dataFields); + end + propCbIdx = []; + if ischar(propNames), propNames={propNames}; end % handle case of a single callback + if ~isempty(propNames) + propCbIdx = find(~cellfun(@isempty,regexp(propNames,'(Fcn|Callback)$'))); + cbNames = unique([cbNames; propNames(propCbIdx)]); %#ok logical is faster but less debuggable... + end + if ~isempty(cbNames) + if stripStdCbsFlag + cbNames = stripStdCbs(cbNames); + end + if iscell(cbNames) + cbNames = sort(cbNames); + if size(cbNames,1) < size(cbNames,2) + cbNames = cbNames'; + end + end + hgHandleFlag = 0; try hgHandleFlag = ishghandle(obj); catch, end %#ok + try + obj = handle(obj,'CallbackProperties'); + catch + hgHandleFlag = 1; + end + if hgHandleFlag + % HG handles don't allow CallbackProperties - search only for *Fcn + %cbNames = propNames(propCbIdx); + end + if iscom(obj) + cbs = obj.eventlisteners; + if ~isempty(cbs) + cbNamesRegistered = cbs(:,1); + cbData = setdiff(cbNames,cbNamesRegistered); + %cbData = charizeData(cbData); + if size(cbData,2) > size(cbData(1)) + cbData = cbData'; + end + cbData = [cbData, cellstr(repmat(' ',length(cbData),1))]; + cbData = [cbData; cbs]; + [sortedNames, sortedIdx] = sort(cbData(:,1)); + sortedCbs = cellfun(@charizeData,cbData(sortedIdx,2),'un',0); + cbData = [sortedNames, sortedCbs]; + else + cbData = [cbNames, cellstr(repmat(' ',length(cbNames),1))]; + end + elseif iscell(cbNames) + cbNames = sort(cbNames); + %cbData = [cbNames, get(obj,cbNames)']; + cbData = cbNames; + oldWarn = warning('off','MATLAB:hg:JavaSetHGProperty'); + warning('off','MATLAB:hg:PossibleDeprecatedJavaSetHGProperty'); + for idx = 1 : length(cbNames) + try + cbData{idx,2} = charizeData(get(obj,cbNames{idx})); + catch + cbData{idx,2} = '(callback value inaccessible)'; + end + end + warning(oldWarn); + else % only one event callback + %cbData = {cbNames, get(obj,cbNames)'}; + %cbData{1,2} = charizeData(cbData{1,2}); + try + cbData = {cbNames, charizeData(get(obj,cbNames))}; + catch + cbData = {cbNames, '(callback value inaccessible)'}; + end + end + cbHeaders = {'Callback name','Callback value'}; + cbTableEnabled = true; + end + catch + % never mind - use default (empty) data + end + end % getCbsData + + %% Get relative (0.0-1.0) divider location + function divLocation = getRalativeDivlocation(jDiv) + divLocation = jDiv.getDividerLocation; + if divLocation > 1 % i.e. [pixels] + visibleRect = jDiv.getVisibleRect; + if jDiv.getOrientation == 0 % vertical + start = visibleRect.getY; + extent = visibleRect.getHeight - start; + else + start = visibleRect.getX; + extent = visibleRect.getWidth - start; + end + divLocation = (divLocation - start) / extent; + end + end % getRalativeDivlocation + + %% Try to set a treenode icon based on a container's icon + function setTreeNodeIcon(treenode,container) + try + iconImage = []; + iconImage = container.getIcon; + if ~isempty(findprop(handle(iconImage),'Image')) % get(iconImage,'Image') is easier but leaks memory... + iconImage = iconImage.getImage; + else + a=b; %#ok cause an error + end + catch + try + iconImage = container.getIconImage; + catch + try + if ~isempty(iconImage) + ge = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment; + gd = ge.getDefaultScreenDevice; + gc = gd.getDefaultConfiguration; + image = gc.createCompatibleImage(iconImage.getIconWidth, iconImage.getIconHeight); % a BufferedImage object + g = image.createGraphics; + iconImage.paintIcon([], g, 0, 0); + g.dispose; + iconImage = image; + end + catch + % never mind... + end + end + end + if ~isempty(iconImage) + iconImage = setIconSize(iconImage); + treenode.setIcon(iconImage); + end + end % setTreeNodeIcon + + %% Present the object hierarchy tree + function presentObjectTree() + persistent lastVersionCheck + if isempty(lastVersionCheck), lastVersionCheck = now-1; end + + import java.awt.* + import javax.swing.* + hTreeFig = findall(0,'tag','findjobjFig'); + iconpath = [matlabroot, '/toolbox/matlab/icons/']; + cbHideStd = 0; % Initial state of the cbHideStdCbs checkbox + if isempty(hTreeFig) + % Prepare the figure + hTreeFig = figure('tag','findjobjFig','menuBar','none','toolBar','none','Name','FindJObj','NumberTitle','off','handleVisibility','off','IntegerHandle','off'); + figIcon = ImageIcon([iconpath 'tool_legend.gif']); + drawnow; + try + mde = com.mathworks.mde.desk.MLDesktop.getInstance; + jTreeFig = mde.getClient('FindJObj').getTopLevelAncestor; + jTreeFig.setIcon(figIcon); + catch + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + jTreeFig = get(hTreeFig,'JavaFrame'); + jTreeFig.setFigureIcon(figIcon); + end + vsplitPaneLocation = 0.8; + hsplitPaneLocation = 0.5; + else + % Remember cbHideStdCbs checkbox & dividers state for later + userdata = get(hTreeFig, 'userdata'); + try cbHideStd = userdata.cbHideStdCbs.isSelected; catch, end %#ok + try + vsplitPaneLocation = getRalativeDivlocation(userdata.vsplitPane); + hsplitPaneLocation = getRalativeDivlocation(userdata.hsplitPane); + catch + vsplitPaneLocation = 0.8; + hsplitPaneLocation = 0.5; + end + + % Clear the figure and redraw + clf(hTreeFig); + figure(hTreeFig); % bring to front + end + + % Traverse all HG children, if root container was a HG handle + if ishghandle(origContainer) %&& ~isequal(origContainer,container) + traverseHGContainer(origContainer,0,0); + end + + % Prepare the tree pane + warning('off','MATLAB:uitreenode:MigratingFunction'); % R2008b compatibility + warning('off','MATLAB:uitreenode:DeprecatedFunction'); % R2008a compatibility + tree_h = com.mathworks.hg.peer.UITreePeer; + try tree_h = javaObjectEDT(tree_h); catch, end + tree_hh = handle(tree_h,'CallbackProperties'); + hasChildren = sum(allParents==1) > 1; + icon = [iconpath 'upfolder.gif']; + [rootName, rootTitle] = getNodeName(container); + try + root = uitreenode('v0', handle(container), rootName, icon, ~hasChildren); + catch % old matlab version don't have the 'v0' option + root = uitreenode(handle(container), rootName, icon, ~hasChildren); + end + setTreeNodeIcon(root,container); % constructor must accept a char icon unfortunately, so need to do this afterwards... + if ~isempty(rootTitle) + set(hTreeFig, 'Name',['FindJObj - ' char(rootTitle)]); + end + nodedata.idx = 1; + nodedata.obj = container; + set(root,'userdata',nodedata); + root.setUserObject(container); + setappdata(root,'childHandle',container); + tree_h.setRoot(root); + treePane = tree_h.getScrollPane; + treePane.setMinimumSize(Dimension(50,50)); + jTreeObj = treePane.getViewport.getComponent(0); + jTreeObj.setShowsRootHandles(true) + jTreeObj.getSelectionModel.setSelectionMode(javax.swing.tree.TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); + %jTreeObj.setVisible(0); + %jTreeObj.getCellRenderer.setLeafIcon([]); + %jTreeObj.getCellRenderer.setOpenIcon(figIcon); + %jTreeObj.getCellRenderer.setClosedIcon([]); + treePanel = JPanel(BorderLayout); + treePanel.add(treePane, BorderLayout.CENTER); + progressBar = JProgressBar(0); + progressBar.setMaximum(length(allHandles) + length(hg_handles)); % = # of all nodes + treePanel.add(progressBar, BorderLayout.SOUTH); + + % Prepare the image pane +%disable for now, until we get it working... +%{ + try + hFig = ancestor(origContainer,'figure'); + [cdata, cm] = getframe(hFig); %#ok cm unused + tempfname = [tempname '.png']; + imwrite(cdata,tempfname); % don't know how to pass directly to BufferedImage, so use disk... + jImg = javax.imageio.ImageIO.read(java.io.File(tempfname)); + try delete(tempfname); catch end + imgPanel = JPanel(); + leftPanel = JSplitPane(JSplitPane.VERTICAL_SPLIT, treePanel, imgPanel); + leftPanel.setOneTouchExpandable(true); + leftPanel.setContinuousLayout(true); + leftPanel.setResizeWeight(0.8); + catch + leftPanel = treePanel; + end +%} + leftPanel = treePanel; + + % Prepare the inspector pane + classNameLabel = JLabel([' ' char(class(container))]); + classNameLabel.setForeground(Color.blue); + updateNodeTooltip(container, classNameLabel); + inspectorPanel = JPanel(BorderLayout); + inspectorPanel.add(classNameLabel, BorderLayout.NORTH); + % TODO: Maybe uncomment the following when we add the HG tree - in the meantime it's unused (java properties are un-groupable) + %objReg = com.mathworks.services.ObjectRegistry.getLayoutRegistry; + %toolBar = awtinvoke('com.mathworks.mlwidgets.inspector.PropertyView$ToolBarStyle','valueOf(Ljava.lang.String;)','GROUPTOOLBAR'); + %inspectorPane = com.mathworks.mlwidgets.inspector.PropertyView(objReg, toolBar); + inspectorPane = com.mathworks.mlwidgets.inspector.PropertyView; + identifiers = disableDbstopError; %#ok "dbstop if error" causes inspect.m to croak due to a bug - so workaround + inspectorPane.setObject(container); + inspectorPane.setAutoUpdate(true); + % TODO: Add property listeners + % TODO: Display additional props + inspectorTable = inspectorPane; + try + while ~isa(inspectorTable,'javax.swing.JTable') + inspectorTable = inspectorTable.getComponent(0); + end + catch + % R2010a + inspectorTable = inspectorPane.getComponent(0).getScrollPane.getViewport.getComponent(0); + end + toolTipText = 'hover mouse over the red classname above to see the full list of properties'; + inspectorTable.setToolTipText(toolTipText); + jideTableUtils = []; + try + % Try JIDE features - see http://www.jidesoft.com/products/JIDE_Grids_Developer_Guide.pdf + com.mathworks.mwswing.MJUtilities.initJIDE; + jideTableUtils = eval('com.jidesoft.grid.TableUtils;'); % prevent JIDE alert by run-time (not load-time) evaluation + jideTableUtils.autoResizeAllColumns(inspectorTable); + inspectorTable.setRowAutoResizes(true); + inspectorTable.getModel.setShowExpert(1); + catch + % JIDE is probably unavailable - never mind... + end + inspectorPanel.add(inspectorPane, BorderLayout.CENTER); + % TODO: Add data update listeners + + % Prepare the callbacks pane + callbacksPanel = JPanel(BorderLayout); + stripStdCbsFlag = true; % initial value + [cbData, cbHeaders, cbTableEnabled] = getCbsData(container, stripStdCbsFlag); + %{ + %classHdl = classhandle(handle(container)); + %eventNames = get(classHdl.Events,'Name'); + %if ~isempty(eventNames) + % cbNames = sort(strcat(eventNames,'Callback')); + % try + % cbData = [cbNames, get(container,cbNames)']; + % catch + % % R2010a + % cbData = cbNames; + % if isempty(cbData) + % cbData = {}; + % elseif ~iscell(cbData) + % cbData = {cbData}; + % end + % for idx = 1 : length(cbNames) + % cbData{idx,2} = get(container,cbNames{idx}); + % end + % end + % cbTableEnabled = true; + %else + % cbData = {'(no callbacks)',''}; + % cbTableEnabled = false; + %end + %cbHeaders = {'Callback name','Callback value'}; + %} + try + % Use JideTable if available on this system + %callbacksTableModel = javax.swing.table.DefaultTableModel(cbData,cbHeaders); %#ok + %callbacksTable = eval('com.jidesoft.grid.PropertyTable(callbacksTableModel);'); % prevent JIDE alert by run-time (not load-time) evaluation + try + list = getTreeData(cbData); %#ok + model = eval('com.jidesoft.grid.PropertyTableModel(list);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + % Auto-expand if only one category + if model.getRowCount==1 % length(model.getCategories)==1 fails for some unknown reason... + model.expandFirstLevel; + end + + %callbacksTable = eval('com.jidesoft.grid.TreeTable(model);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + callbacksTable = eval('com.jidesoft.grid.PropertyTable(model);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + %callbacksTable.expandFirstLevel; + callbacksTable.setShowsRootHandles(true); + callbacksTable.setShowTreeLines(false); + %callbacksTable.setShowNonEditable(0); %=SHOW_NONEDITABLE_NEITHER + callbacksPane = eval('com.jidesoft.grid.PropertyPane(callbacksTable);'); % prevent JIDE alert by run-time (not load-time) evaluation + callbacksPane.setShowDescription(false); + catch + callbacksTable = eval('com.jidesoft.grid.TreeTable(cbData,cbHeaders);'); % prevent JIDE alert by run-time (not load-time) evaluation + end + callbacksTable.setRowAutoResizes(true); + callbacksTable.setColumnAutoResizable(true); + callbacksTable.setColumnResizable(true); + jideTableUtils.autoResizeAllColumns(callbacksTable); + callbacksTable.setTableHeader([]); % hide the column headers since now we can resize columns with the gridline + callbacksLabel = JLabel(' Callbacks:'); % The column headers are replaced with a header label + callbacksLabel.setForeground(Color.blue); + %callbacksPanel.add(callbacksLabel, BorderLayout.NORTH); + + % Add checkbox to show/hide standard callbacks + callbacksTopPanel = JPanel; + callbacksTopPanel.setLayout(BoxLayout(callbacksTopPanel, BoxLayout.LINE_AXIS)); + callbacksTopPanel.add(callbacksLabel); + callbacksTopPanel.add(Box.createHorizontalGlue); + jcb = JCheckBox('Hide standard callbacks', cbHideStd); + set(handle(jcb,'CallbackProperties'), 'ActionPerformedCallback',{@cbHideStdCbs_Callback,callbacksTable}); + try + set(jcb, 'userdata',callbacksTable, 'tooltip','Hide standard Swing callbacks - only component-specific callbacks will be displayed'); + catch + jcb.setToolTipText('Hide standard Swing callbacks - only component-specific callbacks will be displayed'); + %setappdata(jcb,'userdata',callbacksTable); + end + callbacksTopPanel.add(jcb); + callbacksPanel.add(callbacksTopPanel, BorderLayout.NORTH); + catch + % Otherwise, use a standard Swing JTable (keep the headers to enable resizing) + callbacksTable = JTable(cbData,cbHeaders); + end + cbToolTipText = 'Callbacks may be ''strings'', @funcHandle or {@funcHandle,arg1,...}'; + callbacksTable.setToolTipText(cbToolTipText); + callbacksTable.setGridColor(inspectorTable.getGridColor); + cbNameTextField = JTextField; + cbNameTextField.setEditable(false); % ensure that the callback names are not modified... + cbNameCellEditor = DefaultCellEditor(cbNameTextField); + cbNameCellEditor.setClickCountToStart(intmax); % i.e, never enter edit mode... + callbacksTable.getColumnModel.getColumn(0).setCellEditor(cbNameCellEditor); + if ~cbTableEnabled + try callbacksTable.getColumnModel.getColumn(1).setCellEditor(cbNameCellEditor); catch, end + end + hModel = callbacksTable.getModel; + set(handle(hModel,'CallbackProperties'), 'TableChangedCallback',{@tbCallbacksChanged,container,callbacksTable}); + %set(hModel, 'UserData',container); + try + cbScrollPane = callbacksPane; %JScrollPane(callbacksPane); + %cbScrollPane.setHorizontalScrollBarPolicy(cbScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + catch + cbScrollPane = JScrollPane(callbacksTable); + cbScrollPane.setVerticalScrollBarPolicy(cbScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + end + callbacksPanel.add(cbScrollPane, BorderLayout.CENTER); + callbacksPanel.setToolTipText(cbToolTipText); + + % Prepare the top-bottom JSplitPanes + vsplitPane = JSplitPane(JSplitPane.VERTICAL_SPLIT, inspectorPanel, callbacksPanel); + vsplitPane.setOneTouchExpandable(true); + vsplitPane.setContinuousLayout(true); + vsplitPane.setResizeWeight(0.8); + + % Prepare the left-right JSplitPane + hsplitPane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, vsplitPane); + hsplitPane.setOneTouchExpandable(true); + hsplitPane.setContinuousLayout(true); + hsplitPane.setResizeWeight(0.6); + pos = getpixelposition(hTreeFig); + + % Prepare the bottom pane with all buttons + lowerPanel = JPanel(FlowLayout); + blogUrlLabel = 'Undocumented
Matlab.com
'; + jWebsite = createJButton(blogUrlLabel, @btWebsite_Callback, 'Visit the UndocumentedMatlab.com blog'); + jWebsite.setContentAreaFilled(0); + lowerPanel.add(jWebsite); + lowerPanel.add(createJButton('Refresh
tree', {@btRefresh_Callback, origContainer, hTreeFig}, 'Rescan the component tree, from the root down')); + lowerPanel.add(createJButton('Export to
workspace', {@btExport_Callback, jTreeObj, classNameLabel}, 'Export the selected component handles to workspace variable findjobj_hdls')); + lowerPanel.add(createJButton('Request
focus', {@btFocus_Callback, jTreeObj, root}, 'Set the focus on the first selected component')); + lowerPanel.add(createJButton('Inspect
object', {@btInspect_Callback, jTreeObj, root}, 'View the signature of all methods supported by the first selected component')); + lowerPanel.add(createJButton('Check for
updates', {@btCheckFex_Callback}, 'Check the MathWorks FileExchange for the latest version of FindJObj')); + + % Display everything on-screen + globalPanel = JPanel(BorderLayout); + globalPanel.add(hsplitPane, BorderLayout.CENTER); + globalPanel.add(lowerPanel, BorderLayout.SOUTH); + [obj, hcontainer] = javacomponent(globalPanel, [0,0,pos(3:4)], hTreeFig); + set(hcontainer,'units','normalized'); + drawnow; + hsplitPane.setDividerLocation(hsplitPaneLocation); % this only works after the JSplitPane is displayed... + vsplitPane.setDividerLocation(vsplitPaneLocation); % this only works after the JSplitPane is displayed... + %restoreDbstopError(identifiers); + + % Refresh & resize the screenshot thumbnail +%disable for now, until we get it working... +%{ + try + hAx = axes('Parent',hTreeFig, 'units','pixels', 'position',[10,10,250,150], 'visible','off'); + axis(hAx,'image'); + image(cdata,'Parent',hAx); + axis(hAx,'off'); + set(hAx,'UserData',cdata); + set(imgPanel, 'ComponentResizedCallback',{@resizeImg, hAx}, 'UserData',lowerPanel); + imgPanel.getGraphics.drawImage(jImg, 0, 0, []); + catch + % Never mind... + end +%} + % If all handles were selected (i.e., none were filtered) then only select the first + if (length(selectedIdx) == length(allHandles)) && ~isempty(selectedIdx) + selectedIdx = 1; + end + + % Store handles for callback use + userdata.handles = allHandles; + userdata.levels = allLevels; + userdata.parents = allParents; + userdata.hg_handles = hg_handles; + userdata.hg_levels = hg_levels; + userdata.hg_parents = hg_parentIdx; + userdata.initialIdx = selectedIdx; + userdata.userSelected = false; % Indicates the user has modified the initial selections + userdata.inInit = true; + userdata.jTree = jTreeObj; + userdata.jTreePeer = tree_h; + userdata.vsplitPane = vsplitPane; + userdata.hsplitPane = hsplitPane; + userdata.classNameLabel = classNameLabel; + userdata.inspectorPane = inspectorPane; + userdata.callbacksTable = callbacksTable; + userdata.jideTableUtils = jideTableUtils; + try + userdata.cbHideStdCbs = jcb; + catch + userdata.cbHideStdCbs = []; + end + + % Update userdata for use in callbacks + try + set(tree_h,'userdata',userdata); + catch + setappdata(handle(tree_h),'userdata',userdata); + end + try + set(callbacksTable,'userdata',userdata); + catch + setappdata(callbacksTable,'userdata',userdata); + end + set(hTreeFig,'userdata',userdata); + + % Select the root node if requested + % Note: we must do so here since all other nodes except the root are processed by expandNode + if any(selectedIdx==1) + tree_h.setSelectedNode(root); + end + + % Set the initial cbHideStdCbs state + try + if jcb.isSelected + drawnow; + evd.getSource.isSelected = jcb.isSelected; + cbHideStdCbs_Callback(jcb,evd,callbacksTable); + end + catch + % never mind... + end + + % Set the callback functions + set(tree_hh, 'NodeExpandedCallback', {@nodeExpanded, tree_h}); + set(tree_hh, 'NodeSelectedCallback', {@nodeSelected, tree_h}); + + % Set the tree mouse-click callback + % Note: default actions (expand/collapse) will still be performed? + % Note: MousePressedCallback is better than MouseClickedCallback + % since it fires immediately when mouse button is pressed, + % without waiting for its release, as MouseClickedCallback does + handleTree = tree_h.getScrollPane; + jTreeObj = handleTree.getViewport.getComponent(0); + jTreeObjh = handle(jTreeObj,'CallbackProperties'); + set(jTreeObjh, 'MousePressedCallback', {@treeMousePressedCallback,tree_h}); % context (right-click) menu + set(jTreeObjh, 'MouseMovedCallback', @treeMouseMovedCallback); % mouse hover tooltips + + % Update userdata + userdata.inInit = false; + try + set(tree_h,'userdata',userdata); + catch + setappdata(handle(tree_h),'userdata',userdata); + end + set(hTreeFig,'userdata',userdata); + + % Pre-expand all rows + %treePane.setVisible(false); + expandNode(progressBar, jTreeObj, tree_h, root, 0); + %treePane.setVisible(true); + %jTreeObj.setVisible(1); + + % Hide the progressbar now that we've finished expanding all rows + try + hsplitPane.getLeftComponent.setTopComponent(treePane); + catch + % Probably not a vSplitPane on the left... + hsplitPane.setLeftComponent(treePane); + end + hsplitPane.setDividerLocation(hsplitPaneLocation); % need to do it again... + + % Set keyboard focus on the tree + jTreeObj.requestFocus; + drawnow; + + % Check for a newer version (only in non-deployed mode, and only twice a day) + if ~isdeployed && now-lastVersionCheck > 0.5 + checkVersion(); + lastVersionCheck = now; + end + + % Reset the last error + lasterr(''); %#ok + end + + %% Rresize image pane + function resizeImg(varargin) %#ok - unused (TODO: waiting for img placement fix...) + try + hPanel = varargin{1}; + hAx = varargin{3}; + lowerPanel = get(hPanel,'UserData'); + newJPos = cell2mat(get(hPanel,{'X','Y','Width','Height'})); + newMPos = [1,get(lowerPanel,'Height'),newJPos(3:4)]; + set(hAx, 'units','pixels', 'position',newMPos, 'Visible','on'); + uistack(hAx,'top'); % no good... + set(hPanel,'Opaque','off'); % also no good... + catch + % Never mind... + dispError + end + return; + end + + %% "dbstop if error" causes inspect.m to croak due to a bug - so workaround by temporarily disabling this dbstop + function identifiers = disableDbstopError + dbStat = dbstatus; + idx = find(strcmp({dbStat.cond},'error')); + identifiers = [dbStat(idx).identifier]; + if ~isempty(idx) + dbclear if error; + msgbox('''dbstop if error'' had to be disabled due to a Matlab bug that would have caused Matlab to crash.', 'FindJObj', 'warn'); + end + end + + %% Restore any previous "dbstop if error" + function restoreDbstopError(identifiers) %#ok + for itemIdx = 1 : length(identifiers) + eval(['dbstop if error ' identifiers{itemIdx}]); + end + end + + %% Recursively expand all nodes (except toolbar/menubar) in startup + function expandNode(progressBar, tree, tree_h, parentNode, parentRow) + try + if nargin < 5 + parentPath = javax.swing.tree.TreePath(parentNode.getPath); + parentRow = tree.getRowForPath(parentPath); + end + tree.expandRow(parentRow); + progressBar.setValue(progressBar.getValue+1); + numChildren = parentNode.getChildCount; + if (numChildren == 0) + pause(0.0002); % as short as possible... + drawnow; + end + nodesToUnExpand = {'FigureMenuBar','MLMenuBar','MJToolBar','Box','uimenu','uitoolbar','ScrollBar'}; + numChildren = parentNode.getChildCount; + for childIdx = 0 : numChildren-1 + childNode = parentNode.getChildAt(childIdx); + + % Pre-select the node based upon the user's FINDJOBJ filters + try + nodedata = get(childNode, 'userdata'); + try + userdata = get(tree_h, 'userdata'); + catch + userdata = getappdata(handle(tree_h), 'userdata'); + end + %fprintf('%d - %s\n',nodedata.idx,char(nodedata.obj)) + if ~ishghandle(nodedata.obj) && ~userdata.userSelected && any(userdata.initialIdx == nodedata.idx) + pause(0.0002); % as short as possible... + drawnow; + if isempty(tree_h.getSelectedNodes) + tree_h.setSelectedNode(childNode); + else + newSelectedNodes = [tree_h.getSelectedNodes, childNode]; + tree_h.setSelectedNodes(newSelectedNodes); + end + end + catch + % never mind... + dispError + end + + % Expand child node if not leaf & not toolbar/menubar + if childNode.isLeafNode + + % This is a leaf node, so simply update the progress-bar + progressBar.setValue(progressBar.getValue+1); + + else + % Expand all non-leaves + expandNode(progressBar, tree, tree_h, childNode); + + % Re-collapse toolbar/menubar etc., and also invisible containers + % Note: if we simply did nothing, progressbar would not have been updated... + try + childHandle = getappdata(childNode,'childHandle'); %=childNode.getUserObject + visible = childHandle.isVisible; + catch + visible = 1; + end + visible = visible && isempty(findstr(get(childNode,'Name'),'color="gray"')); + %if any(strcmp(childNode.getName,nodesToUnExpand)) + %name = char(childNode.getName); + if any(cellfun(@(s)~isempty(strmatch(s,char(childNode.getName))),nodesToUnExpand)) || ~visible + childPath = javax.swing.tree.TreePath(childNode.getPath); + childRow = tree.getRowForPath(childPath); + tree.collapseRow(childRow); + end + end + end + catch + % never mind... + dispError + end + end + + %% Create utility buttons + function hButton = createJButton(nameStr, handler, toolTipText) + try + jButton = javax.swing.JButton(['
' nameStr]); + jButton.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.HAND_CURSOR)); + jButton.setToolTipText(toolTipText); + try + minSize = jButton.getMinimumSize; + catch + minSize = jButton.getMinimumSize; % for HG2 - strange indeed that this is needed! + end + jButton.setMinimumSize(java.awt.Dimension(minSize.getWidth,35)); + hButton = handle(jButton,'CallbackProperties'); + set(hButton,'ActionPerformedCallback',handler); + catch + % Never mind... + a= 1; + end + end + + %% Flash a component off/on for the specified duration + % note: starts with 'on'; if numTimes is odd then ends with 'on', otherwise with 'off' + function flashComponent(jComps,delaySecs,numTimes) + persistent redBorder redBorderPanels + try + % Handle callback data from right-click (context-menu) + if iscell(numTimes) + [jComps,delaySecs,numTimes] = deal(numTimes{:}); + end + + if isempty(redBorder) % reuse if possible + redBorder = javax.swing.border.LineBorder(java.awt.Color.red,2,0); + end + for compIdx = 1 : length(jComps) + try + oldBorder{compIdx} = jComps(compIdx).getBorder; %#ok grow + catch + oldBorder{compIdx} = []; %#ok grow + end + isSettable(compIdx) = ismethod(jComps(compIdx),'setBorder'); %#ok grow + if isSettable(compIdx) + try + % some components prevent border modification: + oldBorderFlag = jComps(compIdx).isBorderPainted; + if ~oldBorderFlag + jComps(compIdx).setBorderPainted(1); + isSettable(compIdx) = jComps(compIdx).isBorderPainted; %#ok grow + jComps(compIdx).setBorderPainted(oldBorderFlag); + end + catch + % do nothing... + end + end + if compIdx > length(redBorderPanels) + redBorderPanels{compIdx} = javax.swing.JPanel; + redBorderPanels{compIdx}.setBorder(redBorder); + redBorderPanels{compIdx}.setOpaque(0); % transparent interior, red border + end + try + redBorderPanels{compIdx}.setBounds(jComps(compIdx).getBounds); + catch + % never mind - might be an HG handle + end + end + for idx = 1 : 2*numTimes + if idx>1, pause(delaySecs); end % don't pause at start + visible = mod(idx,2); + for compIdx = 1 : length(jComps) + try + jComp = jComps(compIdx); + + % Prevent Matlab crash (java buffer overflow...) + if isa(jComp,'com.mathworks.mwswing.desk.DTSplitPane') || ... + isa(jComp,'com.mathworks.mwswing.MJSplitPane') + continue; + + % HG handles are highlighted by setting their 'Selected' property + elseif isa(jComp,'uimenu') || isa(jComp,'matlab.ui.container.Menu') + if visible + oldColor = get(jComp,'ForegroundColor'); + setappdata(jComp,'findjobj_oldColor',oldColor); + set(jComp,'ForegroundColor','red'); + else + oldColor = getappdata(jComp,'findjobj_oldColor'); + set(jComp,'ForegroundColor',oldColor); + rmappdata(jComp,'ForegroundColor'); + end + + elseif ishghandle(jComp) + if visible + set(jComp,'Selected','on'); + else + set(jComp,'Selected','off'); + end + + else %if isjava(jComp) + + jParent = jComps(compIdx).getParent; + + % Most Java components allow modifying their borders + if isSettable(compIdx) + if visible + jComp.setBorder(redBorder); + try jComp.setBorderPainted(1); catch, end %#ok + else %if ~isempty(oldBorder{compIdx}) + jComp.setBorder(oldBorder{compIdx}); + end + jComp.repaint; + + % The other Java components are highlighted by a transparent red-border + % panel that is placed on top of them in their parent's space + elseif ~isempty(jParent) + if visible + jParent.add(redBorderPanels{compIdx}); + jParent.setComponentZOrder(redBorderPanels{compIdx},0); + else + jParent.remove(redBorderPanels{compIdx}); + end + jParent.repaint + end + end + catch + % never mind - try the next component (if any) + end + end + drawnow; + end + catch + % never mind... + dispError; + end + return; % debug point + end % flashComponent + + %% Select tree node + function nodeSelected(src, evd, tree) %#ok + try + if iscell(tree) + [src,node] = deal(tree{:}); + else + node = evd.getCurrentNode; + end + %nodeHandle = node.getUserObject; + nodedata = get(node,'userdata'); + nodeHandle = nodedata.obj; + try + userdata = get(src,'userdata'); + catch + try + userdata = getappdata(java(src),'userdata'); + catch + userdata = getappdata(src,'userdata'); + end + if isempty(userdata) + try userdata = get(java(src),'userdata'); catch, end + end + end + if ~isempty(nodeHandle) && ~isempty(userdata) + numSelections = userdata.jTree.getSelectionCount; + selectionPaths = userdata.jTree.getSelectionPaths; + if (numSelections == 1) + % Indicate that the user has modified the initial selection (except if this was an initial auto-selected node) + if ~userdata.inInit + userdata.userSelected = true; + try + set(src,'userdata',userdata); + catch + try + setappdata(java(src),'userdata',userdata); + catch + setappdata(src,'userdata',userdata); + end + end + end + + % Update the fully-qualified class name label + numInitialIdx = length(userdata.initialIdx); + thisHandle = nodeHandle; + try + if ~ishghandle(thisHandle) + thisHandle = java(nodeHandle); + end + catch + % never mind... + end + if ~userdata.inInit || (numInitialIdx == 1) + userdata.classNameLabel.setText([' ' char(class(thisHandle))]); + else + userdata.classNameLabel.setText([' ' num2str(numInitialIdx) 'x handles (some handles hidden by unexpanded tree nodes)']); + end + if ishghandle(thisHandle) + userdata.classNameLabel.setText(userdata.classNameLabel.getText.concat(' (HG handle)')); + end + userdata.inspectorPane.dispose; % remove props listeners - doesn't work... + updateNodeTooltip(nodeHandle, userdata.classNameLabel); + + % Update the data properties inspector pane + % Note: we can't simply use the evd nodeHandle, because this node might have been DE-selected with only one other node left selected... + %nodeHandle = selectionPaths(1).getLastPathComponent.getUserObject; + nodedata = get(selectionPaths(1).getLastPathComponent,'userdata'); + nodeHandle = nodedata.obj; + %identifiers = disableDbstopError; % "dbstop if error" causes inspect.m to croak due to a bug - so workaround + userdata.inspectorPane.setObject(thisHandle); + + % Update the callbacks table + try + stripStdCbsFlag = getappdata(userdata.callbacksTable,'hideStdCbs'); + [cbData, cbHeaders, cbTableEnabled] = getCbsData(nodeHandle, stripStdCbsFlag); %#ok cbTableEnabled unused + try + % Use JideTable if available on this system + list = getTreeData(cbData); %#ok + callbacksTableModel = eval('com.jidesoft.grid.PropertyTableModel(list);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + % Expand if only one category + if length(callbacksTableModel.getCategories)==1 + callbacksTableModel.expandFirstLevel; + end + catch + callbacksTableModel = javax.swing.table.DefaultTableModel(cbData,cbHeaders); + end + set(handle(callbacksTableModel,'CallbackProperties'), 'TableChangedCallback',{@tbCallbacksChanged,nodeHandle,userdata.callbacksTable}); + %set(callbacksTableModel, 'UserData',nodeHandle); + userdata.callbacksTable.setModel(callbacksTableModel) + userdata.callbacksTable.setRowAutoResizes(true); + userdata.jideTableUtils.autoResizeAllColumns(userdata.callbacksTable); + catch + % never mind... + %dispError + end + pause(0.005); + drawnow; + %restoreDbstopError(identifiers); + + % Highlight the selected object (if visible) + flashComponent(nodeHandle,0.2,3); + + elseif (numSelections > 1) % Multiple selections + + % Get the list of all selected nodes + jArray = javaArray('java.lang.Object', numSelections); + toolTipStr = ''; + sameClassFlag = true; + for idx = 1 : numSelections + %jArray(idx) = selectionPaths(idx).getLastPathComponent.getUserObject; + nodedata = get(selectionPaths(idx).getLastPathComponent,'userdata'); + try + if ishghandle(nodedata.obj) + if idx==1 + jArray = nodedata.obj; + else + jArray(idx) = nodedata.obj; + end + else + jArray(idx) = java(nodedata.obj); + end + catch + jArray(idx) = nodedata.obj; + end + toolTipStr = [toolTipStr ' ' class(jArray(idx)) ' ']; %#ok grow + if (idx < numSelections), toolTipStr = [toolTipStr '
']; end %#ok grow + try + if (idx > 1) && sameClassFlag && ~isequal(jArray(idx).getClass,jArray(1).getClass) + sameClassFlag = false; + end + catch + if (idx > 1) && sameClassFlag && ~isequal(class(jArray(idx)),class(jArray(1))) + sameClassFlag = false; + end + end + end + toolTipStr = [toolTipStr '']; + + % Update the fully-qualified class name label + if sameClassFlag + classNameStr = class(jArray(1)); + else + classNameStr = 'handle'; + end + if all(ishghandle(jArray)) + if strcmp(classNameStr,'handle') + classNameStr = 'HG handles'; + else + classNameStr = [classNameStr ' (HG handles)']; + end + end + classNameStr = [' ' num2str(numSelections) 'x ' classNameStr]; + userdata.classNameLabel.setText(classNameStr); + userdata.classNameLabel.setToolTipText(toolTipStr); + + % Update the data properties inspector pane + %identifiers = disableDbstopError; % "dbstop if error" causes inspect.m to croak due to a bug - so workaround + if isjava(jArray) + jjArray = jArray; + else + jjArray = javaArray('java.lang.Object', numSelections); + for idx = 1 : numSelections + jjArray(idx) = java(jArray(idx)); + end + end + userdata.inspectorPane.getRegistry.setSelected(jjArray, true); + + % Update the callbacks table + try + % Get intersecting callback names & values + stripStdCbsFlag = getappdata(userdata.callbacksTable,'hideStdCbs'); + [cbData, cbHeaders, cbTableEnabled] = getCbsData(jArray(1), stripStdCbsFlag); %#ok cbHeaders & cbTableEnabled unused + if ~isempty(cbData) + cbNames = cbData(:,1); + for idx = 2 : length(jArray) + [cbData2, cbHeaders2] = getCbsData(jArray(idx), stripStdCbsFlag); %#ok cbHeaders2 unused + if ~isempty(cbData2) + newCbNames = cbData2(:,1); + [cbNames, cbIdx, cb2Idx] = intersect(cbNames,newCbNames); %#ok cb2Idx unused + cbData = cbData(cbIdx,:); + for cbIdx = 1 : length(cbNames) + newIdx = find(strcmp(cbNames{cbIdx},newCbNames)); + if ~isequal(cbData2,cbData) && ~isequal(cbData2{newIdx,2}, cbData{cbIdx,2}) + cbData{cbIdx,2} = ''; + end + end + else + cbData = cbData([],:); %=empty cell array + end + if isempty(cbData) + break; + end + end + end + cbHeaders = {'Callback name','Callback value'}; + try + % Use JideTable if available on this system + list = getTreeData(cbData); %#ok + callbacksTableModel = eval('com.jidesoft.grid.PropertyTableModel(list);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + % Expand if only one category + if length(callbacksTableModel.getCategories)==1 + callbacksTableModel.expandFirstLevel; + end + catch + callbacksTableModel = javax.swing.table.DefaultTableModel(cbData,cbHeaders); + end + set(handle(callbacksTableModel,'CallbackProperties'), 'TableChangedCallback',{@tbCallbacksChanged,jArray,userdata.callbacksTable}); + %set(callbacksTableModel, 'UserData',jArray); + userdata.callbacksTable.setModel(callbacksTableModel) + userdata.callbacksTable.setRowAutoResizes(true); + userdata.jideTableUtils.autoResizeAllColumns(userdata.callbacksTable); + catch + % never mind... + dispError + end + + pause(0.005); + drawnow; + %restoreDbstopError(identifiers); + + % Highlight the selected objects (if visible) + flashComponent(jArray,0.2,3); + end + + % TODO: Auto-highlight selected object (?) + %nodeHandle.requestFocus; + end + catch + dispError + end + end + + %% IFF utility function for annonymous cellfun funcs + function result = iff(test,trueVal,falseVal) %#ok + try + if test + result = trueVal; + else + result = falseVal; + end + catch + result = false; + end + end + + %% Get an HTML representation of the object's properties + function dataFieldsStr = getPropsHtml(nodeHandle, dataFields) + try + % Get a text representation of the fieldnames & values + undefinedStr = ''; + hiddenStr = ''; + dataFieldsStr = ''; % just in case the following croaks... + if isempty(dataFields) + return; + end + dataFieldsStr = evalc('disp(dataFields)'); + if dataFieldsStr(end)==char(10), dataFieldsStr=dataFieldsStr(1:end-1); end + + % Strip out callbacks + dataFieldsStr = regexprep(dataFieldsStr,'^\s*\w*Callback(Data)?:[^\n]*$','','lineanchors'); + + % Strip out internal HG2 mirror properties + dataFieldsStr = regexprep(dataFieldsStr,'^\s*\w*_I:[^\n]*$','','lineanchors'); + dataFieldsStr = regexprep(dataFieldsStr,'\n\n+','\n'); + + % Sort the fieldnames + %fieldNames = fieldnames(dataFields); + try + [a,b,c,d] = regexp(dataFieldsStr,'(\w*): '); + fieldNames = strrep(d,': ',''); + catch + fieldNames = fieldnames(dataFields); + end + try + [fieldNames, sortedIdx] = sort(fieldNames); + s = strsplit(dataFieldsStr, sprintf('\n'))'; + dataFieldsStr = strjoin(s(sortedIdx), sprintf('\n')); + catch + % never mind... - ignore, leave unsorted + end + + % Convert into a Matlab handle() + %nodeHandle = handle(nodeHandle); + try + % ensure this is a Matlab handle, not a java object + nodeHandle = handle(nodeHandle, 'CallbackProperties'); + catch + try + % HG handles don't allow CallbackProperties... + nodeHandle = handle(nodeHandle); + catch + % Some Matlab class objects simply cannot be converted into a handle() + end + end + + % HTMLize tooltip data + % First, set the fields' font based on its read-write status + for fieldIdx = 1 : length(fieldNames) + thisFieldName = fieldNames{fieldIdx}; + %accessFlags = get(findprop(nodeHandle,thisFieldName),'AccessFlags'); + try + hProp = findprop(nodeHandle,thisFieldName); + accessFlags = get(hProp,'AccessFlags'); + visible = get(hProp,'Visible'); + catch + accessFlags = []; + visible = 'on'; + try if hProp.Hidden, visible='off'; end, catch, end + end + %if isfield(accessFlags,'PublicSet') && strcmp(accessFlags.PublicSet,'on') + if (~isempty(hProp) && isprop(hProp,'SetAccess') && isequal(hProp.SetAccess,'public')) || ... % isequal(...'public') and not strcmpi(...) because might be a cell array of classes + (~isempty(accessFlags) && isfield(accessFlags,'PublicSet') && strcmpi(accessFlags.PublicSet,'on')) + % Bolden read/write fields + thisFieldFormat = ['' thisFieldName ':$2']; + %elseif ~isfield(accessFlags,'PublicSet') + elseif (isempty(hProp) || ~isprop(hProp,'SetAccess')) && ... + (isempty(accessFlags) || ~isfield(accessFlags,'PublicSet')) + % Undefined - probably a Matlab-defined field of com.mathworks.hg.peer.FigureFrameProxy... + thisFieldFormat = ['' thisFieldName ':$2']; + undefinedStr = ', undefined'; + else % PublicSet=='off' + % Gray-out & italicize any read-only fields + thisFieldFormat = ['' thisFieldName ':$2']; + end + if strcmpi(visible,'off') + %thisFieldFormat = ['' thisFieldFormat '']; %#ok + thisFieldFormat = regexprep(thisFieldFormat, {'(.*):(.*)','<.?b>'}, {'$1:$2',''}); %'(.*):(.*)', '$1:$2'); + hiddenStr = ', hidden'; + end + dataFieldsStr = regexprep(dataFieldsStr, ['([\s\n])' thisFieldName ':([^\n]*)'], ['$1' thisFieldFormat]); + end + catch + % never mind... - probably an ambiguous property name + %dispError + end + + % Method 1: simple
list + %dataFieldsStr = strrep(dataFieldsStr,char(10),' 
  '); + + % Method 2: 2-column + dataFieldsStr = regexprep(dataFieldsStr, '^\s*([^:]+:)([^\n]*)\n^\s*([^:]+:)([^\n]*)$', '', 'lineanchors'); + dataFieldsStr = regexprep(dataFieldsStr, '^[^<]\s*([^:]+:)([^\n]*)$', '', 'lineanchors'); + dataFieldsStr = ['(documented' undefinedStr hiddenStr ' & read-only fields)

  

 $1 $2    $3 $4 
 $1 $2  
' dataFieldsStr '
']; + end + + %% Update tooltip string with a node's data + function updateNodeTooltip(nodeHandle, uiObject) + try + toolTipStr = class(nodeHandle); + dataFieldsStr = ''; + + % Add HG annotation if relevant + if ishghandle(nodeHandle) + hgStr = ' HG Handle'; + else + hgStr = ''; + end + + % Prevent HG-Java warnings + oldWarn = warning('off','MATLAB:hg:JavaSetHGProperty'); + warning('off','MATLAB:hg:PossibleDeprecatedJavaSetHGProperty'); + warning('off','MATLAB:hg:Root'); + + % Note: don't bulk-get because (1) not all properties are returned & (2) some properties cause a Java exception + % Note2: the classhandle approach does not enable access to user-defined schema.props + ch = classhandle(handle(nodeHandle)); + dataFields = []; + [sortedNames, sortedIdx] = sort(get(ch.Properties,'Name')); + for idx = 1 : length(sortedIdx) + sp = ch.Properties(sortedIdx(idx)); + % TODO: some fields (see EOL comment below) generate a Java Exception from: com.mathworks.mlwidgets.inspector.PropertyRootNode$PropertyListener$1$1.run + if strcmp(sp.AccessFlags.PublicGet,'on') % && ~any(strcmp(sp.Name,{'FixedColors','ListboxTop','Extent'})) + try + dataFields.(sp.Name) = get(nodeHandle, sp.Name); + catch + dataFields.(sp.Name) = 'Error!'; + end + else + dataFields.(sp.Name) = '(no public getter method)'; + end + end + dataFieldsStr = getPropsHtml(nodeHandle, dataFields); + catch + % Probably a non-HG java object + try + % Note: the bulk-get approach enables access to user-defined schema-props, but not to some original classhandle Properties... + try + oldWarn3 = warning('off','MATLAB:structOnObject'); + dataFields = struct(nodeHandle); + warning(oldWarn3); + catch + dataFields = get(nodeHandle); + end + dataFieldsStr = getPropsHtml(nodeHandle, dataFields); + catch + % Probably a missing property getter implementation + try + % Inform the user - bail out on error + err = lasterror; %#ok + dataFieldsStr = ['

' strrep(err.message, char(10), '
')]; + catch + % forget it... + end + end + end + + % Restore warnings + try warning(oldWarn); catch, end + + % Set the object tooltip + if ~isempty(dataFieldsStr) + toolTipStr = [' ' char(toolTipStr) '' hgStr ': ' dataFieldsStr '']; + end + uiObject.setToolTipText(toolTipStr); + end + + %% Expand tree node + function nodeExpanded(src, evd, tree) %#ok + % tree = handle(src); + % evdsrc = evd.getSource; + evdnode = evd.getCurrentNode; + + if ~tree.isLoaded(evdnode) + + % Get the list of children TreeNodes + childnodes = getChildrenNodes(tree, evdnode); + + % Add the HG sub-tree (unless already included in the first tree) + childHandle = getappdata(evdnode.handle,'childHandle'); %=evdnode.getUserObject + if evdnode.isRoot && ~isempty(hg_handles) && ~isequal(hg_handles(1).java, childHandle) + childnodes = [childnodes, getChildrenNodes(tree, evdnode, true)]; + end + + % If we have a single child handle, wrap it within a javaArray for tree.add() to "swallow" + if (length(childnodes) == 1) + chnodes = childnodes; + childnodes = javaArray('com.mathworks.hg.peer.UITreeNode', 1); + childnodes(1) = java(chnodes); + end + + % Add child nodes to the current node + tree.add(evdnode, childnodes); + tree.setLoaded(evdnode, true); + end + end + + %% Get an icon image no larger than 16x16 pixels + function iconImage = setIconSize(iconImage) + try + iconWidth = iconImage.getWidth; + iconHeight = iconImage.getHeight; + if iconWidth > 16 + newHeight = fix(iconHeight * 16 / iconWidth); + iconImage = iconImage.getScaledInstance(16,newHeight,iconImage.SCALE_SMOOTH); + elseif iconHeight > 16 + newWidth = fix(iconWidth * 16 / iconHeight); + iconImage = iconImage.getScaledInstance(newWidth,16,iconImage.SCALE_SMOOTH); + end + catch + % never mind... - return original icon + end + end % setIconSize + + %% Get list of children nodes + function nodes = getChildrenNodes(tree, parentNode, isRootHGNode) + try + iconpath = [matlabroot, '/toolbox/matlab/icons/']; + nodes = handle([]); + try + userdata = get(tree,'userdata'); + catch + userdata = getappdata(handle(tree),'userdata'); + end + hdls = userdata.handles; + nodedata = get(parentNode,'userdata'); + if nargin < 3 + %isJavaNode = ~ishghandle(parentNode.getUserObject); + isJavaNode = ~ishghandle(nodedata.obj); + isRootHGNode = false; + else + isJavaNode = ~isRootHGNode; + end + + % Search for this parent node in the list of all nodes + parents = userdata.parents; + nodeIdx = nodedata.idx; + + if isJavaNode && isempty(nodeIdx) % Failback, in case userdata doesn't work for some reason... + for hIdx = 1 : length(hdls) + %if isequal(handle(parentNode.getUserObject), hdls(hIdx)) + if isequal(handle(nodedata.obj), hdls(hIdx)) + nodeIdx = hIdx; + break; + end + end + end + if ~isJavaNode + if isRootHGNode % =root HG node + thisChildHandle = userdata.hg_handles(1); + childName = getNodeName(thisChildHandle); + hasGrandChildren = any(parents==1); + icon = []; + if hasGrandChildren && length(hg_handles)>1 + childName = childName.concat(' - HG root container'); + icon = [iconpath 'figureicon.gif']; + end + try + nodes = uitreenode('v0', thisChildHandle, childName, icon, ~hasGrandChildren); + catch % old matlab version don't have the 'v0' option + try + nodes = uitreenode(thisChildHandle, childName, icon, ~hasGrandChildren); + catch + % probably an invalid handle - ignore... + end + end + + % Add the handler to the node's internal data + % Note: could also use 'userdata', but setUserObject() is recommended for TreeNodes + % Note2: however, setUserObject() sets a java *BeenAdapter object for HG handles instead of the required original class, so use setappdata + %nodes.setUserObject(thisChildHandle); + setappdata(nodes,'childHandle',thisChildHandle); + nodedata.idx = 1; + nodedata.obj = thisChildHandle; + set(nodes,'userdata',nodedata); + return; + else % non-root HG node + parents = userdata.hg_parents; + hdls = userdata.hg_handles; + end % if isRootHGNode + end % if ~isJavaNode + + % If this node was found, get the list of its children + if ~isempty(nodeIdx) + %childIdx = setdiff(find(parents==nodeIdx),nodeIdx); + childIdx = find(parents==nodeIdx); + childIdx(childIdx==nodeIdx) = []; % faster... + numChildren = length(childIdx); + for cIdx = 1 : numChildren + thisChildIdx = childIdx(cIdx); + try thisChildHandle = hdls(thisChildIdx); catch, continue, end + childName = getNodeName(thisChildHandle); + try + visible = thisChildHandle.Visible; + if visible + try visible = thisChildHandle.Width > 0; catch, end %#ok + end + if ~visible + childName = ['' char(childName) '']; %#ok grow + end + catch + % never mind... + end + hasGrandChildren = any(parents==thisChildIdx); + try + isaLabel = isa(thisChildHandle.java,'javax.swing.JLabel'); + catch + isaLabel = 0; + end + if hasGrandChildren && ~any(strcmp(class(thisChildHandle),{'axes'})) + icon = [iconpath 'foldericon.gif']; + elseif isaLabel + icon = [iconpath 'tool_text.gif']; + else + icon = []; + end + try + nodes(cIdx) = uitreenode('v0', thisChildHandle, childName, icon, ~hasGrandChildren); + catch % old matlab version don't have the 'v0' option + try + nodes(cIdx) = uitreenode(thisChildHandle, childName, icon, ~hasGrandChildren); + catch + % probably an invalid handle - ignore... + end + end + + % Use existing object icon, if available + try + setTreeNodeIcon(nodes(cIdx),thisChildHandle); + catch + % probably an invalid handle - ignore... + end + + % Pre-select the node based upon the user's FINDJOBJ filters + try + if isJavaNode && ~userdata.userSelected && any(userdata.initialIdx == thisChildIdx) + pause(0.0002); % as short as possible... + drawnow; + if isempty(tree.getSelectedNodes) + tree.setSelectedNode(nodes(cIdx)); + else + newSelectedNodes = [tree.getSelectedNodes, nodes(cIdx).java]; + tree.setSelectedNodes(newSelectedNodes); + end + end + catch + % never mind... + end + + % Add the handler to the node's internal data + % Note: could also use 'userdata', but setUserObject() is recommended for TreeNodes + % Note2: however, setUserObject() sets a java *BeenAdapter object for HG handles instead of the required original class, so use setappdata + % Note3: the following will error if invalid handle - ignore + try + if isJavaNode + thisChildHandle = thisChildHandle.java; + end + %nodes(cIdx).setUserObject(thisChildHandle); + setappdata(nodes(cIdx),'childHandle',thisChildHandle); + nodedata.idx = thisChildIdx; + nodedata.obj = thisChildHandle; + set(nodes(cIdx),'userdata',nodedata); + catch + % never mind (probably an invalid handle) - leave unchanged (like a leaf) + end + end + end + catch + % Never mind - leave unchanged (like a leaf) + %error('YMA:findjobj:UnknownNodeType', 'Error expanding component tree node'); + dispError + end + end + + %% Get a node's name + function [nodeName, nodeTitle] = getNodeName(hndl,charsLimit) + try + % Initialize (just in case one of the succeding lines croaks) + nodeName = ''; + nodeTitle = ''; + if ~ismethod(hndl,'getClass') + try + nodeName = class(hndl); + catch + nodeName = hndl.type; % last-ditch try... + end + else + nodeName = hndl.getClass.getSimpleName; + end + + % Strip away the package name, leaving only the regular classname + if ~isempty(nodeName) && ischar(nodeName) + nodeName = java.lang.String(nodeName); + nodeName = nodeName.substring(nodeName.lastIndexOf('.')+1); + end + if (nodeName.length == 0) + % fix case of anonymous internal classes, that do not have SimpleNames + try + nodeName = hndl.getClass.getName; + nodeName = nodeName.substring(nodeName.lastIndexOf('.')+1); + catch + % never mind - leave unchanged... + end + end + + % Get any unique identifying string (if available in one of several fields) + labelsToCheck = {'label','title','text','string','displayname','toolTipText','TooltipString','actionCommand','name','Tag','style'}; %,'UIClassID'}; + nodeTitle = ''; + strField = ''; %#ok - used for debugging + while ((~isa(nodeTitle,'java.lang.String') && ~ischar(nodeTitle)) || isempty(nodeTitle)) && ~isempty(labelsToCheck) + try + nodeTitle = get(hndl,labelsToCheck{1}); + strField = labelsToCheck{1}; %#ok - used for debugging + catch + % never mind - probably missing prop, so skip to next one + end + labelsToCheck(1) = []; + end + if length(nodeTitle) ~= numel(nodeTitle) + % Multi-line - convert to a long single line + nodeTitle = nodeTitle'; + nodeTitle = nodeTitle(:)'; + end + if isempty(char(nodeTitle)) + % No title - check whether this is an HG label whose text is gettable + try + location = hndl.getLocationOnScreen; + pos = [location.getX, location.getY, hndl.getWidth, hndl.getHeight]; + %dist = sum((labelPositions-repmat(pos,size(labelPositions,1),[1,1,1,1])).^2, 2); + dist = sum((labelPositions-repmat(pos,[size(labelPositions,1),1])).^2, 2); + [minVal,minIdx] = min(dist); + % Allow max distance of 8 = 2^2+2^2 (i.e. X&Y off by up to 2 pixels, W&H exact) + if minVal <= 8 % 8=2^2+2^2 + nodeTitle = get(hg_labels(minIdx),'string'); + % Preserve the label handles & position for the tooltip & context-menu + %hg_labels(minIdx) = []; + %labelPositions(minIdx,:) = []; + end + catch + % never mind... + end + end + if nargin<2, charsLimit = 25; end + extraStr = regexprep(nodeTitle,{sprintf('(.{%d,%d}).*',charsLimit,min(charsLimit,length(nodeTitle)-1)),' +'},{'$1...',' '},'once'); + if ~isempty(extraStr) + if ischar(extraStr) + nodeName = nodeName.concat(' (''').concat(extraStr).concat(''')'); + else + nodeName = nodeName.concat(' (').concat(num2str(extraStr)).concat(')'); + end + %nodeName = nodeName.concat(strField); + end + catch + % Never mind - use whatever we have so far + %dispError + end + end + + %% Strip standard Swing callbacks from a list of events + function evNames = stripStdCbs(evNames) + try + stdEvents = {'AncestorAdded', 'AncestorMoved', 'AncestorRemoved', 'AncestorResized', ... + 'ComponentAdded', 'ComponentRemoved', 'ComponentHidden', ... + 'ComponentMoved', 'ComponentResized', 'ComponentShown', ... + 'FocusGained', 'FocusLost', 'HierarchyChanged', ... + 'KeyPressed', 'KeyReleased', 'KeyTyped', ... + 'MouseClicked', 'MouseDragged', 'MouseEntered', 'MouseExited', ... + 'MouseMoved', 'MousePressed', 'MouseReleased', 'MouseWheelMoved', ... + 'PropertyChange', 'VetoableChange', ... + 'CaretPositionChanged', 'InputMethodTextChanged', ... + 'ButtonDown', 'Create', 'Delete'}; + stdEvents = [stdEvents, strcat(stdEvents,'Callback'), strcat(stdEvents,'Fcn')]; + evNames = setdiff(evNames,stdEvents)'; + catch + % Never mind... + dispError + end + end + + %% Callback function for checkbox + function cbHideStdCbs_Callback(src, evd, callbacksTable, varargin) %#ok + try + % Store the current checkbox value for later use + if nargin < 3 + try + callbacksTable = get(src,'userdata'); + catch + callbacksTable = getappdata(src,'userdata'); + end + end + if evd.getSource.isSelected + setappdata(callbacksTable,'hideStdCbs',1); + else + setappdata(callbacksTable,'hideStdCbs',[]); + end + + % Rescan the current node + try + userdata = get(callbacksTable,'userdata'); + catch + userdata = getappdata(callbacksTable,'userdata'); + end + nodepath = userdata.jTree.getSelectionModel.getSelectionPath; + try + ed.getCurrentNode = nodepath.getLastPathComponent; + nodeSelected(handle(userdata.jTreePeer),ed,[]); + catch + % ignore - probably no node selected + end + catch + % Never mind... + dispError + end + end + + %% Callback function for button + function btWebsite_Callback(src, evd, varargin) %#ok + try + web('http://UndocumentedMatlab.com','-browser'); + catch + % Never mind... + dispError + end + end + + %% Callback function for button + function btRefresh_Callback(src, evd, varargin) %#ok + try + % Set cursor shape to hourglass until we're done + hTreeFig = varargin{2}; + set(hTreeFig,'Pointer','watch'); + drawnow; + object = varargin{1}; + + % Re-invoke this utility to re-scan the container for all children + findjobj(object); + catch + % Never mind... + end + + % Restore default cursor shape + set(hTreeFig,'Pointer','arrow'); + end + + %% Callback function for button + function btExport_Callback(src, evd, varargin) %#ok + try + % Get the list of all selected nodes + if length(varargin) > 1 + jTree = varargin{1}; + numSelections = jTree.getSelectionCount; + selectionPaths = jTree.getSelectionPaths; + hdls = handle([]); + for idx = 1 : numSelections + %hdls(idx) = handle(selectionPaths(idx).getLastPathComponent.getUserObject); + nodedata = get(selectionPaths(idx).getLastPathComponent,'userdata'); + try + hdls(idx) = handle(nodedata.obj,'CallbackProperties'); + catch + if idx==1 % probably due to HG2: can't convert object to handle([]) + hdls = nodedata.obj; + else + hdls(idx) = nodedata.obj; + end + end + end + + % Assign the handles in the base workspace & inform user + assignin('base','findjobj_hdls',hdls); + classNameLabel = varargin{2}; + msg = ['Exported ' char(classNameLabel.getText.trim) ' to base workspace variable findjobj_hdls']; + else + % Right-click (context-menu) callback + data = varargin{1}; + obj = data{1}; + varName = data{2}; + if isempty(varName) + varName = inputdlg('Enter workspace variable name','FindJObj'); + if isempty(varName), return; end % bail out on + varName = varName{1}; + if isempty(varName) || ~ischar(varName), return; end % bail out on empty/null + varName = genvarname(varName); + end + assignin('base',varName,handle(obj,'CallbackProperties')); + msg = ['Exported object to base workspace variable ' varName]; + end + msgbox(msg,'FindJObj','help'); + catch + % Never mind... + dispError + end + end + + %% Callback function for button + function btFocus_Callback(src, evd, varargin) %#ok + try + % Request focus for the specified object + object = getTopSelectedObject(varargin{:}); + object.requestFocus; + catch + try + object = object.java.getPeer.requestFocus; + object.requestFocus; + catch + % Never mind... + %dispError + end + end + end + + %% Callback function for button + function btInspect_Callback(src, evd, varargin) %#ok + try + % Inspect the specified object + if length(varargin) == 1 + object = varargin{1}; + else + object = getTopSelectedObject(varargin{:}); + end + if isempty(which('uiinspect')) + + % If the user has not indicated NOT to be informed about UIInspect + if ~ispref('FindJObj','dontCheckUIInspect') + + % Ask the user whether to download UIINSPECT (YES, no, no & don't ask again) + answer = questdlg({'The object inspector requires UIINSPECT from the MathWorks File Exchange. UIINSPECT was created by Yair Altman, like this FindJObj utility.','','Download & install UIINSPECT?'},'UIInspect','Yes','No','No & never ask again','Yes'); + switch answer + case 'Yes' % => Yes: download & install + try + % Download UIINSPECT + baseUrl = 'http://www.mathworks.com/matlabcentral/fileexchange/17935'; + fileUrl = [baseUrl '?controller=file_infos&download=true']; + %file = urlread(fileUrl); + %file = regexprep(file,[char(13),char(10)],'\n'); %convert to OS-dependent EOL + + % Install... + %newPath = fullfile(fileparts(which(mfilename)),'uiinspect.m'); + %fid = fopen(newPath,'wt'); + %fprintf(fid,'%s',file); + %fclose(fid); + [fpath,fname,fext] = fileparts(which(mfilename)); + zipFileName = fullfile(fpath,'uiinspect.zip'); + urlwrite(fileUrl,zipFileName); + unzip(zipFileName,fpath); + rehash; + catch + % Error downloading: inform the user + msgbox(['Error in downloading: ' lasterr], 'UIInspect', 'warn'); %#ok + web(baseUrl); + end + + % ...and now run it... + %pause(0.1); + drawnow; + dummy = which('uiinspect'); %#ok used only to load into memory + uiinspect(object); + return; + + case 'No & never ask again' % => No & don't ask again + setpref('FindJObj','dontCheckUIInspect',1); + + otherwise + % forget it... + end + end + drawnow; + + % No UIINSPECT available - run the good-ol' METHODSVIEW()... + methodsview(object); + else + uiinspect(object); + end + catch + try + if isjava(object) + methodsview(object) + else + methodsview(object.java); + end + catch + % Never mind... + dispError + end + end + end + + %% Callback function for button + function btCheckFex_Callback(src, evd, varargin) %#ok + try + % Check the FileExchange for the latest version + web('http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=14317'); + catch + % Never mind... + dispError + end + end + + %% Check for existence of a newer version + function checkVersion() + try + % If the user has not indicated NOT to be informed + if ~ispref('FindJObj','dontCheckNewerVersion') + + % Get the latest version date from the File Exchange webpage + baseUrl = 'http://www.mathworks.com/matlabcentral/fileexchange/'; + webUrl = [baseUrl '14317']; % 'loadFile.do?objectId=14317']; + webPage = urlread(webUrl); + modIdx = strfind(webPage,'>Updates<'); + if ~isempty(modIdx) + webPage = webPage(modIdx:end); + % Note: regexp hangs if substr not found, so use strfind instead... + %latestWebVersion = regexprep(webPage,'.*?>(20[\d-]+).*','$1'); + dateIdx = strfind(webPage,'class="date">'); + if ~isempty(dateIdx) + latestDate = webPage(dateIdx(end)+13 : dateIdx(end)+23); + try + startIdx = dateIdx(end)+27; + descStartIdx = startIdx + strfind(webPage(startIdx:startIdx+999),''); + descEndIdx = startIdx + strfind(webPage(startIdx:startIdx+999),''); + descStr = webPage(descStartIdx(1)+3 : descEndIdx(1)-2); + descStr = regexprep(descStr,'',''); + catch + descStr = ''; + end + + % Get this file's latest date + thisFileName = which(mfilename); %#ok + try + thisFileData = dir(thisFileName); + try + thisFileDatenum = thisFileData.datenum; + catch % old ML versions... + thisFileDatenum = datenum(thisFileData.date); + end + catch + thisFileText = evalc('type(thisFileName)'); + thisFileLatestDate = regexprep(thisFileText,'.*Change log:[\s%]+([\d-]+).*','$1'); + thisFileDatenum = datenum(thisFileLatestDate,'yyyy-mm-dd'); + end + + % If there's a newer version on the File Exchange webpage (allow 2 days grace period) + if (thisFileDatenum < datenum(latestDate,'dd mmm yyyy')-2) + + % Ask the user whether to download the newer version (YES, no, no & don't ask again) + msg = {['A newer version (' latestDate ') of FindJObj is available on the MathWorks File Exchange:'], '', ... + ['\color{blue}' descStr '\color{black}'], '', ... + 'Download & install the new version?'}; + createStruct.Interpreter = 'tex'; + createStruct.Default = 'Yes'; + answer = questdlg(msg,'FindJObj','Yes','No','No & never ask again',createStruct); + switch answer + case 'Yes' % => Yes: download & install newer file + try + %fileUrl = [baseUrl '/download.do?objectId=14317&fn=findjobj&fe=.m']; + fileUrl = [baseUrl '/14317?controller=file_infos&download=true']; + %file = urlread(fileUrl); + %file = regexprep(file,[char(13),char(10)],'\n'); %convert to OS-dependent EOL + %fid = fopen(thisFileName,'wt'); + %fprintf(fid,'%s',file); + %fclose(fid); + [fpath,fname,fext] = fileparts(thisFileName); + zipFileName = fullfile(fpath,[fname '.zip']); + urlwrite(fileUrl,zipFileName); + unzip(zipFileName,fpath); + rehash; + catch + % Error downloading: inform the user + msgbox(['Error in downloading: ' lasterr], 'FindJObj', 'warn'); %#ok + web(webUrl); + end + case 'No & never ask again' % => No & don't ask again + setpref('FindJObj','dontCheckNewerVersion',1); + otherwise + % forget it... + end + end + end + else + % Maybe webpage not fully loaded or changed format - bail out... + end + end + catch + % Never mind... + end + end + + %% Get the first selected object (might not be the top one - depends on selection order) + function object = getTopSelectedObject(jTree, root) + try + object = []; + numSelections = jTree.getSelectionCount; + if numSelections > 0 + % Get the first object specified + %object = jTree.getSelectionPath.getLastPathComponent.getUserObject; + nodedata = get(jTree.getSelectionPath.getLastPathComponent,'userdata'); + else + % Get the root object (container) + %object = root.getUserObject; + nodedata = get(root,'userdata'); + end + object = nodedata.obj; + catch + % Never mind... + dispError + end + end + + %% Update component callback upon callbacksTable data change + function tbCallbacksChanged(src, evd, object, table) + persistent hash + try + % exit if invalid handle or already in Callback + %if ~ishandle(src) || ~isempty(getappdata(src,'inCallback')) % || length(dbstack)>1 %exit also if not called from user action + if isempty(hash), hash = java.util.Hashtable; end + if ~ishandle(src) || ~isempty(hash.get(src)) % || length(dbstack)>1 %exit also if not called from user action + return; + end + %setappdata(src,'inCallback',1); % used to prevent endless recursion % can't use getappdata(src,...) because it fails on R2010b!!! + hash.put(src,1); + + % Update the object's callback with the modified value + modifiedColIdx = evd.getColumn; + modifiedRowIdx = evd.getFirstRow; + if modifiedRowIdx>=0 %&& modifiedColIdx==1 %sanity check - should always be true + %table = evd.getSource; + %object = get(src,'userdata'); + modifiedRowIdx = table.getSelectedRow; % overcome issues with hierarchical table + cbName = strtrim(table.getValueAt(modifiedRowIdx,0)); + try + cbValue = strtrim(char(table.getValueAt(modifiedRowIdx,1))); + if ~isempty(cbValue) && ismember(cbValue(1),'{[@''') + cbValue = eval(cbValue); + end + if (~ischar(cbValue) && ~isa(cbValue, 'function_handle') && (~iscell(cbValue) || iscom(object(1)))) + revertCbTableModification(table, modifiedRowIdx, modifiedColIdx, cbName, object, ''); + else + for objIdx = 1 : length(object) + obj = object(objIdx); + if ~iscom(obj) + try + try + if isjava(obj) + obj = handle(obj,'CallbackProperties'); + end + catch + % never mind... + end + set(obj, cbName, cbValue); + catch + try + set(handle(obj,'CallbackProperties'), cbName, cbValue); + catch + % never mind - probably a callback-group header + end + end + else + cbs = obj.eventlisteners; + if ~isempty(cbs) + cbs = cbs(strcmpi(cbs(:,1),cbName),:); + obj.unregisterevent(cbs); + end + if ~isempty(cbValue) && ~strcmp(cbName,'-') + obj.registerevent({cbName, cbValue}); + end + end + end + end + catch + revertCbTableModification(table, modifiedRowIdx, modifiedColIdx, cbName, object, lasterr) %#ok + end + end + catch + % never mind... + end + %setappdata(src,'inCallback',[]); % used to prevent endless recursion % can't use setappdata(src,...) because it fails on R2010b!!! + hash.remove(src); + end + + %% Revert Callback table modification + function revertCbTableModification(table, modifiedRowIdx, modifiedColIdx, cbName, object, errMsg) %#ok + try + % Display a notification MsgBox + msg = 'Callbacks must be a ''string'', or a @function handle'; + if ~iscom(object(1)), msg = [msg ' or a {@func,args...} construct']; end + if ~isempty(errMsg), msg = {errMsg, '', msg}; end + msgbox(msg, ['Error setting ' cbName ' value'], 'warn'); + + % Revert to the current value + curValue = ''; + try + if ~iscom(object(1)) + curValue = charizeData(get(object(1),cbName)); + else + cbs = object(1).eventlisteners; + if ~isempty(cbs) + cbs = cbs(strcmpi(cbs(:,1),cbName),:); + curValue = charizeData(cbs(1,2)); + end + end + catch + % never mind... - clear the current value + end + table.setValueAt(curValue, modifiedRowIdx, modifiedColIdx); + catch + % never mind... + end + end % revertCbTableModification + + %% Get the Java positions of all HG text labels + function labelPositions = getLabelsJavaPos(container) + try + labelPositions = []; + + % Ensure we have a figure handle + try + h = hFig; %#ok unused + catch + hFig = getCurrentFigure; + end + + % Get the figure's margins from the Matlab properties + hg_labels = findall(hFig, 'Style','text'); + units = get(hFig,'units'); + set(hFig,'units','pixels'); + outerPos = get(hFig,'OuterPosition'); + innerPos = get(hFig,'Position'); + set(hFig,'units',units); + margins = abs(innerPos-outerPos); + + figX = container.getX; % =outerPos(1) + figY = container.getY; % =outerPos(2) + %figW = container.getWidth; % =outerPos(3) + figH = container.getHeight; % =outerPos(4) + + % Get the relevant screen pixel size + %monitorPositions = get(0,'MonitorPositions'); + %for monitorIdx = size(monitorPositions,1) : -1 : 1 + % screenSize = monitorPositions(monitorIdx,:); + % if (outerPos(1) >= screenSize(1)) % && (outerPos(1)+outerPos(3) <= screenSize(3)) + % break; + % end + %end + %monitorBaseY = screenSize(4) - monitorPositions(1,4); + + % Compute the labels' screen pixel position in Java units ([0,0] = top left) + for idx = 1 : length(hg_labels) + matlabPos = getpixelposition(hg_labels(idx),1); + javaX = figX + matlabPos(1) + margins(1); + javaY = figY + figH - matlabPos(2) - matlabPos(4) - margins(2); + labelPositions(idx,:) = [javaX, javaY, matlabPos(3:4)]; %#ok grow + end + catch + % never mind... + err = lasterror; %#ok debug point + end + end + + %% Traverse an HG container hierarchy and extract the HG elements within + function traverseHGContainer(hcontainer,level,parent) + try + % Record the data for this node + thisIdx = length(hg_levels) + 1; + hg_levels(thisIdx) = level; + hg_parentIdx(thisIdx) = parent; + try + hg_handles(thisIdx) = handle(hcontainer); + catch + hg_handles = handle(hcontainer); + end + parentId = length(hg_parentIdx); + + % Now recursively process all this node's children (if any) + %if ishghandle(hcontainer) + try % try-catch is faster than checking ishghandle(hcontainer)... + allChildren = allchild(handle(hcontainer)); + for childIdx = 1 : length(allChildren) + traverseHGContainer(allChildren(childIdx),level+1,parentId); + end + catch + % do nothing - probably not a container + %dispError + end + + % TODO: Add axis (plot) component handles + catch + % forget it... + end + end + + %% Debuggable "quiet" error-handling + function dispError + err = lasterror; %#ok + msg = err.message; + for idx = 1 : length(err.stack) + filename = err.stack(idx).file; + if ~isempty(regexpi(filename,mfilename)) + funcname = err.stack(idx).name; + line = num2str(err.stack(idx).line); + msg = [msg ' at ' funcname ' line #' line '']; %#ok grow + break; + end + end + disp(msg); + return; % debug point + end + + %% ML 7.0 - compatible ischar() function + function flag = ischar(data) + try + flag = builtin('ischar',data); + catch + flag = isa(data,'char'); + end + end + + %% Set up the uitree context (right-click) menu + function jmenu = setTreeContextMenu(obj,node,tree_h) + % Prepare the context menu (note the use of HTML labels) + import javax.swing.* + titleStr = getNodeTitleStr(obj,node); + titleStr = regexprep(titleStr,'


.*',''); + menuItem0 = JMenuItem(titleStr); + menuItem0.setEnabled(false); + menuItem0.setArmed(false); + %menuItem1 = JMenuItem('Export handle to findjobj_hdls'); + if isjava(obj), prefix = 'j'; else, prefix = 'h'; end %#ok + varname = strrep([prefix strtok(char(node.getName))], '$','_'); + varname = genvarname(varname); + varname(2) = upper(varname(2)); % ensure lowerCamelCase + menuItem1 = JMenuItem(['Export handle to ' varname]); + menuItem2 = JMenuItem('Export handle to...'); + menuItem3 = JMenuItem('Request focus (bring to front)'); + menuItem4 = JMenuItem('Flash component borders'); + menuItem5 = JMenuItem('Display properties & callbacks'); + menuItem6 = JMenuItem('Inspect object'); + + % Set the menu items' callbacks + set(handle(menuItem1,'CallbackProperties'), 'ActionPerformedCallback', {@btExport_Callback,{obj,varname}}); + set(handle(menuItem2,'CallbackProperties'), 'ActionPerformedCallback', {@btExport_Callback,{obj,[]}}); + set(handle(menuItem3,'CallbackProperties'), 'ActionPerformedCallback', {@requestFocus,obj}); + set(handle(menuItem4,'CallbackProperties'), 'ActionPerformedCallback', {@flashComponent,{obj,0.2,3}}); + set(handle(menuItem5,'CallbackProperties'), 'ActionPerformedCallback', {@nodeSelected,{tree_h,node}}); + set(handle(menuItem6,'CallbackProperties'), 'ActionPerformedCallback', {@btInspect_Callback,obj}); + + % Add all menu items to the context menu (with internal separator) + jmenu = JPopupMenu; + jmenu.add(menuItem0); + jmenu.addSeparator; + handleValue=[]; try handleValue = double(obj); catch, end; %#ok + if ~isempty(handleValue) + % For valid HG handles only + menuItem0a = JMenuItem('Copy handle value to clipboard'); + set(handle(menuItem0a,'CallbackProperties'), 'ActionPerformedCallback', sprintf('clipboard(''copy'',%.99g)',handleValue)); + jmenu.add(menuItem0a); + end + jmenu.add(menuItem1); + jmenu.add(menuItem2); + jmenu.addSeparator; + jmenu.add(menuItem3); + jmenu.add(menuItem4); + jmenu.add(menuItem5); + jmenu.add(menuItem6); + end % setTreeContextMenu + + %% Set the mouse-press callback + function treeMousePressedCallback(hTree, eventData, tree_h) %#ok hTree is unused + if eventData.isMetaDown % right-click is like a Meta-button + % Get the clicked node + clickX = eventData.getX; + clickY = eventData.getY; + jtree = eventData.getSource; + treePath = jtree.getPathForLocation(clickX, clickY); + try + % Modify the context menu based on the clicked node + node = treePath.getLastPathComponent; + userdata = get(node,'userdata'); + obj = userdata.obj; + jmenu = setTreeContextMenu(obj,node,tree_h); + + % TODO: remember to call jmenu.remove(item) in item callback + % or use the timer hack shown here to remove the item: + % timerFcn = {@menuRemoveItem,jmenu,item}; + % start(timer('TimerFcn',timerFcn,'StartDelay',0.2)); + + % Display the (possibly-modified) context menu + jmenu.show(jtree, clickX, clickY); + jmenu.repaint; + + % This is for debugging: + userdata.tree = jtree; + setappdata(gcf,'findjobj_hgtree',userdata) + catch + % clicked location is NOT on top of any node + % Note: can also be tested by isempty(treePath) + end + end + end % treeMousePressedCallback + + %% Remove the extra context menu item after display + function menuRemoveItem(hObj,eventData,jmenu,item) %#ok unused + jmenu.remove(item); + end % menuRemoveItem + + %% Get the title for the tooltip and context (right-click) menu + function nodeTitleStr = getNodeTitleStr(obj,node) + try + % Display the full classname and object name in the tooltip + %nodeName = char(node.getName); + %nodeName = strrep(nodeName, '',''); + %nodeName = strrep(nodeName, '',''); + nodeName = char(getNodeName(obj,99)); + [objClass,objName] = strtok(nodeName); + objName = objName(3:end-1); % strip leading ( and trailing ) + if isempty(objName), objName = '(none found)'; end + nodeName = char(node.getName); + objClass = char(obj.getClass.getName); + nodeTitleStr = sprintf('Class name: %s
Text/title: %s',objClass,objName); + + % If the component is invisible, state this in the tooltip + if ~isempty(strfind(nodeName,'color="gray"')) + nodeTitleStr = [nodeTitleStr '
*** Invisible ***']; + end + nodeTitleStr = [nodeTitleStr '
Right-click for context-menu']; + catch + % Possible not a Java object - try treating as an HG handle + try + handleValueStr = sprintf('#: %.99g',double(obj)); + try + type = ''; + type = get(obj,'type'); + type(1) = upper(type(1)); + catch + if ~ishandle(obj) + type = ['Invalid ' char(node.getName) '']; + handleValueStr = '!!!
Perhaps this handle was deleted after this UIInspect tree was
already drawn. Try to refresh by selecting any valid node handle'; + end + end + nodeTitleStr = sprintf('%s handle %s',type,handleValueStr); + try + % If the component is invisible, state this in the tooltip + if strcmp(get(obj,'Visible'),'off') + nodeTitleStr = [nodeTitleStr '
Invisible']; + end + catch + % never mind... + end + catch + % never mind... - ignore + end + end + end % getNodeTitleStr + + %% Handle tree mouse movement callback - used to set the tooltip & context-menu + function treeMouseMovedCallback(hTree, eventData) + try + x = eventData.getX; + y = eventData.getY; + jtree = eventData.getSource; + treePath = jtree.getPathForLocation(x, y); + try + % Set the tooltip string based on the hovered node + node = treePath.getLastPathComponent; + userdata = get(node,'userdata'); + obj = userdata.obj; + tooltipStr = getNodeTitleStr(obj,node); + set(hTree,'ToolTipText',tooltipStr) + catch + % clicked location is NOT on top of any node + % Note: can also be tested by isempty(treePath) + end + catch + dispError; + end + return; % denug breakpoint + end % treeMouseMovedCallback + + %% Request focus for a specific object handle + function requestFocus(hTree, eventData, obj) %#ok hTree & eventData are unused + % Ensure the object handle is valid + if isjava(obj) + obj.requestFocus; + return; + elseif ~ishandle(obj) + msgbox('The selected object does not appear to be a valid handle as defined by the ishandle() function. Perhaps this object was deleted after this hierarchy tree was already drawn. Refresh this tree by selecting a valid node handle and then retry.','FindJObj','warn'); + beep; + return; + end + + try + foundFlag = 0; + while ~foundFlag + if isempty(obj), return; end % sanity check + type = get(obj,'type'); + obj = double(obj); + foundFlag = any(strcmp(type,{'figure','axes','uicontrol'})); + if ~foundFlag + obj = get(obj,'Parent'); + end + end + feval(type,obj); + catch + % never mind... + dispError; + end + end % requestFocus + +end % FINDJOBJ + +% Fast implementation +function jControl = findjobj_fast(hControl, jContainer) + try jControl = hControl.getTable; return, catch, end % fast bail-out for old uitables + try jControl = hControl.JavaFrame.getGUIDEView; return, catch, end % bail-out for HG2 matlab.ui.container.Panel + oldWarn = warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); + if nargin < 2 || isempty(jContainer) + % Use a HG2 matlab.ui.container.Panel jContainer if the control's parent is a uipanel + try + hParent = get(hControl,'Parent'); + catch + % Probably indicates an invalid/deleted/empty handle + jControl = []; + return + end + try jContainer = hParent.JavaFrame.getGUIDEView; catch, jContainer = []; end + end + if isempty(jContainer) + hFig = ancestor(hControl,'figure'); + jf = get(hFig, 'JavaFrame'); + jContainer = jf.getFigurePanelContainer.getComponent(0); + end + warning(oldWarn); + jControl = []; + counter = 20; % 2018-09-21 speedup (100 x 0.001 => 20 x 0.005) - Martin Lehmann suggestion on FEX 2016-06-07 + specialTooltipStr = '!@#$%^&*'; + try % Fix for R2018b suggested by Eddie (FEX comment 2018-09-19) + tooltipPropName = 'TooltipString'; + oldTooltip = get(hControl,tooltipPropName); + set(hControl,tooltipPropName,specialTooltipStr); + catch + tooltipPropName = 'Tooltip'; + oldTooltip = get(hControl,tooltipPropName); + set(hControl,tooltipPropName,specialTooltipStr); + end + while isempty(jControl) && counter>0 + counter = counter - 1; + pause(0.005); + jControl = findTooltipIn(jContainer, specialTooltipStr); + end + set(hControl,tooltipPropName,oldTooltip); + try jControl.setToolTipText(oldTooltip); catch, end + try jControl = jControl.getParent.getView.getParent.getParent; catch, end % return JScrollPane if exists +end +function jControl = findTooltipIn(jContainer, specialTooltipStr) + try + jControl = []; % Fix suggested by H. Koch 11/4/2017 + tooltipStr = jContainer.getToolTipText; + %if strcmp(char(tooltipStr),specialTooltipStr) + if ~isempty(tooltipStr) && tooltipStr.startsWith(specialTooltipStr) % a bit faster + jControl = jContainer; + else + for idx = 1 : jContainer.getComponentCount + jControl = findTooltipIn(jContainer.getComponent(idx-1), specialTooltipStr); + if ~isempty(jControl), return; end + end + end + catch + % ignore + end +end + +%% TODO TODO TODO +%{ +- Enh: Improve interactive-GUI performance - esp. expandNode() +- Enh: Add property listeners - same problem in MathWork's inspect.m +- Enh: Display additional properties - same problem in MathWork's inspect.m +- Enh: Add axis (plot, Graphics) component handles +- Enh: Add figure thumbnail image below the java tree (& indicate corresponding jObject when selected) +- Enh: scroll initially-selected node into view (problem because treenode has no pixel location) +- Fix: java exceptions when getting some fields (com.mathworks.mlwidgets.inspector.PropertyRootNode$PropertyListener$1$1.run) +- Fix: use EDT if available (especially in flashComponent) +%} + + diff --git a/FindJavaObjects/findjobj.m b/FindJavaObjects/findjobj.m new file mode 100644 index 0000000000000000000000000000000000000000..09f38e1633ffbd6a01fbd677ab7cbde07ba5a81a --- /dev/null +++ b/FindJavaObjects/findjobj.m @@ -0,0 +1,3459 @@ +function [handles,levels,parentIdx,listing] = findjobj(container)%,varargin) +%#ok<*CTCH,*ASGLU,*MSNU,*NASGU> +%findjobj Find java objects contained within a specified java container or Matlab GUI handle +% +% Syntax: +% [handles, levels, parentIds, listing] = findjobj(container, 'PropName',PropValue(s), ...) +% +% Input parameters: +% container - optional handle to java container uipanel or figure. If unsupplied then current figure will be used +% 'PropName',PropValue - optional list of property pairs (case insensitive). PropName may also be named -PropName +% 'position' - filter results based on those elements that contain the specified X,Y position or a java element +% Note: specify a Matlab position (X,Y = pixels from bottom left corner), not a java one +% 'size' - filter results based on those elements that have the specified W,H (in pixels) +% 'class' - filter results based on those elements that contain the substring (or java class) PropValue +% Note1: filtering is case insensitive and relies on regexp, so you can pass wildcards etc. +% Note2: '-class' is an undocumented findobj PropName, but only works on Matlab (not java) classes +% 'property' - filter results based on those elements that possess the specified case-insensitive property string +% Note1: passing a property value is possible if the argument following 'property' is a cell in the +% format of {'propName','propValue'}. Example: FINDJOBJ(...,'property',{'Text','click me'}) +% Note2: partial property names (e.g. 'Tex') are accepted, as long as they're not ambiguous +% 'depth' - filter results based on specified depth. 0=top-level, Inf=all levels (default=Inf) +% 'flat' - same as specifying: 'depth',0 +% 'not' - negates the following filter: 'not','class','c' returns all elements EXCEPT those with class 'c' +% 'persist' - persist figure components information, allowing much faster results for subsequent invocations +% 'nomenu' - skip menu processing, for "lean" list of handles & much faster processing; +% This option is the default for HG containers but not for figure, Java or no container +% 'print' - display all java elements in a hierarchical list, indented appropriately +% Note1: optional PropValue of element index or handle to java container +% Note2: normally this option would be placed last, after all filtering is complete. Placing this +% option before some filters enables debug print-outs of interim filtering results. +% Note3: output is to the Matlab command window unless the 'listing' (4th) output arg is requested +% 'list' - same as 'print' +% 'debug' - list found component positions in the Command Window +% +% Output parameters: +% handles - list of handles to java elements +% levels - list of corresponding hierarchy level of the java elements (top=0) +% parentIds - list of indexes (in unfiltered handles) of the parent container of the corresponding java element +% listing - results of 'print'/'list' options (empty if these options were not specified) +% +% Note: If no output parameter is specified, then an interactive window will be displayed with a +% ^^^^ tree view of all container components, their properties and callbacks. +% +% Examples: +% findjobj; % display list of all javaelements of currrent figure in an interactive GUI +% handles = findjobj; % get list of all java elements of current figure (inc. menus, toolbars etc.) +% findjobj('print'); % list all java elements in current figure +% findjobj('print',6); % list all java elements in current figure, contained within its 6th element +% handles = findjobj(hButton); % hButton is a matlab button +% handles = findjobj(gcf,'position',getpixelposition(hButton,1)); % same as above but also return hButton's panel +% handles = findjobj(hButton,'persist'); % same as above, persist info for future reuse +% handles = findjobj('class','pushbutton'); % get all pushbuttons in current figure +% handles = findjobj('class','pushbutton','position',123,456); % get all pushbuttons at the specified position +% handles = findjobj(gcf,'class','pushbutton','size',23,15); % get all pushbuttons with the specified size +% handles = findjobj('property','Text','not','class','button'); % get all non-button elements with 'text' property +% handles = findjobj('-property',{'Text','click me'}); % get all elements with 'text' property = 'click me' +% +% Sample usage: +% hButton = uicontrol('string','click me'); +% jButton = findjobj(hButton,'nomenu'); +% % or: jButton = findjobj('property',{'Text','click me'}); +% jButton.setFlyOverAppearance(1); +% jButton.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.HAND_CURSOR)); +% set(jButton,'FocusGainedCallback',@myMatlabFunction); % some 30 callback points available... +% jButton.get; % list all changeable properties... +% +% hEditbox = uicontrol('style','edit'); +% jEditbox = findjobj(hEditbox,'nomenu'); +% jEditbox.setCaretColor(java.awt.Color.red); +% jEditbox.KeyTypedCallback = @myCallbackFunc; % many more callbacks where this came from... +% jEdit.requestFocus; +% +% Technical explanation & details: +% http://undocumentedmatlab.com/blog/findjobj/ +% http://undocumentedmatlab.com/blog/findjobj-gui-display-container-hierarchy/ +% +% Known issues/limitations: +% - Cannot currently process multiple container objects - just one at a time +% - Initial processing is a bit slow when the figure is laden with many UI components (so better use 'persist') +% - Passing a simple container Matlab handle is currently filtered by its position+size: should find a better way to do this +% - Matlab uipanels are not implemented as simple java panels, and so they can't be found using this utility +% - Labels have a write-only text property in java, so they can't be found using the 'property',{'Text','string'} notation +% +% Warning: +% This code heavily relies on undocumented and unsupported Matlab functionality. +% It works on Matlab 7+, but use at your own risk! +% +% Bugs and suggestions: +% Please send to Yair Altman (altmany at gmail dot com) +% +% Change log: +% 2019-07-03: Additional fix for R2018b; added separate findjobj_fast utility +% 2018-09-21: Fix for R2018b suggested by Eddie (FEX); speedup suggested by Martin Lehmann (FEX); alert if trying to use with uifigure +% 2017-04-13: Fixed two edge-cases (one suggested by H. Koch) +% 2016-04-19: Fixed edge-cases in old Matlab release; slightly improved performance even further +% 2016-04-14: Improved performance for the most common use-case (single input/output): improved code + allow inspecting groot +% 2016-04-11: Improved performance for the most common use-case (single input/output) +% 2015-01-12: Differentiate between overlapping controls (for example in different tabs); fixed case of docked figure +% 2014-10-20: Additional fixes for R2014a, R2014b +% 2014-10-13: Fixes for R2014b +% 2014-01-04: Minor fix for R2014a; check for newer FEX version up to twice a day only +% 2013-12-29: Only check for newer FEX version in non-deployed mode; handled case of invisible figure container +% 2013-10-08: Fixed minor edge case (retrieving multiple scroll-panes) +% 2013-06-30: Additional fixes for the upcoming HG2 +% 2013-05-15: Fix for the upcoming HG2 +% 2013-02-21: Fixed HG-Java warnings +% 2013-01-23: Fixed callbacks table grouping & editing bugs; added hidden properties to the properties tooltip; updated help section +% 2013-01-13: Improved callbacks table; fixed tree refresh failure; fixed: tree node-selection didn't update the props pane nor flash the selected component +% 2012-07-25: Fixes for R2012a as well as some older Matlab releases +% 2011-12-07: Fixed 'File is empty' messages in compiled apps +% 2011-11-22: Fix suggested by Ward +% 2011-02-01: Fixes for R2011a +% 2010-06-13: Fixes for R2010b; fixed download (m-file => zip-file) +% 2010-04-21: Minor fix to support combo-boxes (aka drop-down, popup-menu) on Windows +% 2010-03-17: Important release: Fixes for R2010a, debug listing, objects not found, component containers that should be ignored etc. +% 2010-02-04: Forced an EDT redraw before processing; warned if requested handle is invisible +% 2010-01-18: Found a way to display label text next to the relevant node name +% 2009-10-28: Fixed uitreenode warning +% 2009-10-27: Fixed auto-collapse of invisible container nodes; added dynamic tree tooltips & context-menu; minor fix to version-check display +% 2009-09-30: Fix for Matlab 7.0 as suggested by Oliver W; minor GUI fix (classname font) +% 2009-08-07: Fixed edge-case of missing JIDE tables +% 2009-05-24: Added support for future Matlab versions that will not support JavaFrame +% 2009-05-15: Added sanity checks for axes items +% 2009-04-28: Added 'debug' input arg; increased size tolerance 1px => 2px +% 2009-04-23: Fixed location of popupmenus (always 20px high despite what's reported by Matlab...); fixed uiinspect processing issues; added blog link; narrower action buttons +% 2009-04-09: Automatic 'nomenu' for uicontrol inputs; significant performance improvement +% 2009-03-31: Fixed position of some Java components; fixed properties tooltip; fixed node visibility indication +% 2009-02-26: Indicated components visibility (& auto-collapse non-visible containers); auto-highlight selected component; fixes in node icons, figure title & tree refresh; improved error handling; display FindJObj version update description if available +% 2009-02-24: Fixed update check; added dedicated labels icon +% 2009-02-18: Fixed compatibility with old Matlab versions +% 2009-02-08: Callbacks table fixes; use uiinspect if available; fix update check according to new FEX website +% 2008-12-17: R2008b compatibility +% 2008-09-10: Fixed minor bug as per Johnny Smith +% 2007-11-14: Fixed edge case problem with class properties tooltip; used existing object icon if available; added checkbox option to hide standard callbacks +% 2007-08-15: Fixed object naming relative property priorities; added sanity check for illegal container arg; enabled desktop (0) container; cleaned up warnings about special class objects +% 2007-08-03: Fixed minor tagging problems with a few Java sub-classes; displayed UIClassID if text/name/tag is unavailable +% 2007-06-15: Fixed problems finding HG components found by J. Wagberg +% 2007-05-22: Added 'nomenu' option for improved performance; fixed 'export handles' bug; fixed handle-finding/display bugs; "cleaner" error handling +% 2007-04-23: HTMLized classname tooltip; returned top-level figure Frame handle for figure container; fixed callbacks table; auto-checked newer version; fixed Matlab 7.2 compatibility issue; added HG objects tree +% 2007-04-19: Fixed edge case of missing figure; displayed tree hierarchy in interactive GUI if no output args; workaround for figure sub-menus invisible unless clicked +% 2007-04-04: Improved performance; returned full listing results in 4th output arg; enabled partial property names & property values; automatically filtered out container panels if children also returned; fixed finding sub-menu items +% 2007-03-20: First version posted on the MathWorks file exchange: http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=14317 +% +% See also: +% java, handle, findobj, findall, javaGetHandles, uiinspect (on the File Exchange) + +% License to use and modify this code is granted freely to all interested, as long as the original author is +% referenced and attributed as such. The original author maintains the right to be solely associated with this work. + +% Programmed and Copyright by Yair M. Altman: altmany(at)gmail.com +% $Revision: 1.52 $ $Date: 2019/07/03 19:09:23 $ + + % Ensure Java AWT is enabled + error(javachk('awt')); + + persistent pContainer pHandles pLevels pParentIdx pPositions + + try + % Initialize + handles = handle([]); + levels = []; + parentIdx = []; + positions = []; % Java positions start at the top-left corner + %sizes = []; + listing = ''; + hg_levels = []; + hg_handles = handle([]); % HG handles are double + hg_parentIdx = []; + nomenu = false; + menuBarFoundFlag = false; + hFig = []; + + % Force an EDT redraw before processing, to ensure all uicontrols etc. are rendered + drawnow; pause(0.02); + + % Default container is the current figure's root panel + if nargin + if isempty(container) % empty container - bail out + return; + elseif ischar(container) % container skipped - this is part of the args list... + varargin = [{container}, varargin]; + origContainer = getCurrentFigure; + [container,contentSize] = getRootPanel(origContainer); + elseif isequal(container,0) % root + origContainer = handle(container); + container = com.mathworks.mde.desk.MLDesktop.getInstance.getMainFrame; + contentSize = [container.getWidth, container.getHeight]; + elseif ishghandle(container) % && ~isa(container,'java.awt.Container') + container = container(1); % another current limitation... + hFig = ancestor(container,'figure'); + oldWarn = warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + try hJavaFrame = get(hFig,'JavaFrame'); catch, hJavaFrame = []; end + warning(oldWarn); + if isempty(hJavaFrame) % alert if trying to use with web-based (not Java-based) uifigure + error('YMA:findjobj:NonJavaFigure', 'Findjobj only works with Java-based figures, not web-based (App Designer) uifigures'); + end + origContainer = handle(container); + if isa(origContainer,'uimenu') || isa(origContainer,'matlab.ui.container.Menu') + % getpixelposition doesn't work for menus... - damn! + varargin = {'class','MenuPeer', 'property',{'Label',strrep(get(container,'Label'),'&','')}, varargin{:}}; + elseif ~isa(origContainer, 'figure') && ~isempty(hFig) && ~isa(origContainer, 'matlab.ui.Figure') + % For a single input & output, try using the fast variant + if nargin==1 && nargout==1 + try + handles = findjobj_fast(container); + if ~isempty(handles) + try handles = handle(handles,'callbackproperties'); catch, end + return + end + catch + % never mind - proceed normally using the slower variant below... + end + end + + % See limitations section above: should find a better way to directly refer to the element's java container + try + % Note: 'PixelBounds' is undocumented and unsupported, but much faster than getpixelposition! + % ^^^^ unfortunately, its Y position is inaccurate in some cases - damn! + %size = get(container,'PixelBounds'); + pos = fix(getpixelposition(container,1)); + %varargin = {'position',pos(1:2), 'size',pos(3:4), 'not','class','java.awt.Panel', varargin{:}}; + catch + try + figName = get(hFig,'name'); + if strcmpi(get(hFig,'number'),'on') + figName = regexprep(['Figure ' num2str(hFig) ': ' figName],': $',''); + end + mde = com.mathworks.mde.desk.MLDesktop.getInstance; + jFig = mde.getClient(figName); + if isempty(jFig), error('dummy'); end + catch + jFig = get(hJavaFrame,'FigurePanelContainer'); + end + pos = []; + try + pxsize = get(container,'PixelBounds'); + pos = [pxsize(1)+5, jFig.getHeight - (pxsize(4)-5)]; + catch + % never mind... + end + end + if size(pos,2) == 2 + pos(:,3:4) = 0; + end + if ~isempty(pos) + if isa(handle(container),'uicontrol') && strcmp(get(container,'style'),'popupmenu') + % popupmenus (combo-box dropdowns) are always 20px high + pos(2) = pos(2) + pos(4) - 20; + pos(4) = 20; + end + %varargin = {'position',pos(1:2), 'size',size(3:4)-size(1:2)-10, 'not','class','java.awt.Panel', varargin{:}}; + varargin = {'position',pos(1:2)+[0,pos(4)], 'size',pos(3:4), 'not','class','java.awt.Panel', 'nomenu', varargin{:}}; + end + elseif isempty(hFig) + hFig = handle(container); + end + [container,contentSize] = getRootPanel(hFig); + elseif isjava(container) + % Maybe a java container obj (will crash otherwise) + origContainer = container; + contentSize = [container.getWidth, container.getHeight]; + else + error('YMA:findjobj:IllegalContainer','Input arg does not appear to be a valid GUI object'); + end + else + % Default container = current figure + origContainer = getCurrentFigure; + [container,contentSize] = getRootPanel(origContainer); + end + + % Check persistency + if isequal(pContainer,container) + % persistency requested and the same container is reused, so reuse the hierarchy information + [handles,levels,parentIdx,positions] = deal(pHandles, pLevels, pParentIdx, pPositions); + else + % Pre-allocate space of complex data containers for improved performance + handles = repmat(handles,1,1000); + positions = zeros(1000,2); + + % Check whether to skip menu processing + nomenu = paramSupplied(varargin,'nomenu'); + + % Traverse the container hierarchy and extract the elements within + traverseContainer(container,0,1); + + % Remove unnecessary pre-allocated elements + dataLen = length(levels); + handles (dataLen+1:end) = []; + positions(dataLen+1:end,:) = []; + end + + % Process persistency check before any filtering is done + if paramSupplied(varargin,'persist') + [pContainer, pHandles, pLevels, pParentIdx, pPositions] = deal(container,handles,levels,parentIdx,positions); + end + + % Save data for possible future use in presentObjectTree() below + allHandles = handles; + allLevels = levels; + allParents = parentIdx; + selectedIdx = 1:length(handles); + %[positions(:,1)-container.getX, container.getHeight - positions(:,2)] + + % Debug-list all found compponents and their positions + if paramSupplied(varargin,'debug') + for origHandleIdx = 1 : length(allHandles) + thisObj = handles(origHandleIdx); + pos = sprintf('%d,%d %dx%d',[positions(origHandleIdx,:) getWidth(thisObj) getHeight(thisObj)]); + disp([repmat(' ',1,levels(origHandleIdx)) '[' pos '] ' char(toString(thisObj))]); + end + end + + % Process optional args + % Note: positions is NOT returned since it's based on java coord system (origin = top-left): will confuse Matlab users + processArgs(varargin{:}); + + % De-cell and trim listing, if only one element was found (no use for indented listing in this case) + if iscell(listing) && length(listing)==1 + listing = strtrim(listing{1}); + end + + % If no output args and no listing requested, present the FINDJOBJ interactive GUI + if nargout == 0 && isempty(listing) + + % Get all label positions + hg_labels = []; + labelPositions = getLabelsJavaPos(container); + + % Present the GUI (object tree) + if ~isempty(container) + presentObjectTree(); + else + warnInvisible(varargin{:}); + end + + % Display the listing, if this was specifically requested yet no relevant output arg was specified + elseif nargout < 4 && ~isempty(listing) + if ~iscell(listing) + disp(listing); + else + for listingIdx = 1 : length(listing) + disp(listing{listingIdx}); + end + end + end + + % If the number of output handles does not match the number of inputs, try to match via tooltips + if nargout && numel(handles) ~= numel(origContainer) + newHandles = handle([]); + switchHandles = false; + handlesToCheck = handles; + if isempty(handles) + handlesToCheck = allHandles; + end + for origHandleIdx = 1 : numel(origContainer) + try + thisContainer = origContainer(origHandleIdx); + if isa(thisContainer,'figure') || isa(thisContainer,'matlab.ui.Figure') + break; + end + try + newHandles(origHandleIdx) = handlesToCheck(origHandleIdx); %#ok + catch + % maybe no corresponding handle in [handles] + end + + % Assign a new random tooltip to the original (Matlab) handle + oldTooltip = get(thisContainer,'Tooltip'); + newTooltip = num2str(rand,99); + try + set(thisContainer,'TooltipString',newTooltip); + catch + set(thisContainer,'Tooltip',newTooltip); + end + drawnow; % force the Java handle to sync with the Matlab prop-change + try + % Search for a Java handle that has the newly-generated tooltip + for newHandleIdx = 1 : numel(handlesToCheck) + testTooltip = ''; + thisHandle = handlesToCheck(newHandleIdx); + try + testTooltip = char(thisHandle.getToolTipText); + catch + try testTooltip = char(thisHandle.getTooltipText); catch, end + end + if isempty(testTooltip) + % One more attempt - assume it's enclosed by a scroll-pane + try testTooltip = char(thisHandle.getViewport.getView.getToolTipText); catch, end + end + if strcmp(testTooltip, newTooltip) + newHandles(origHandleIdx) = thisHandle; + switchHandles = true; + break; + end + end + catch + % never mind - skip to the next handle + end + set(thisContainer,'Tooltip',oldTooltip); + catch + % never mind - skip to the next handle (maybe handle doesn't have a tooltip prop) + end + end + if switchHandles + handles = newHandles; + end + end + + % Display a warning if the requested handle was not found because it's invisible + if nargout && isempty(handles) + warnInvisible(varargin{:}); + end + + return; %debug point + + catch + % 'Cleaner' error handling - strip the stack info etc. + err = lasterror; %#ok + err.message = regexprep(err.message,'Error using ==> [^\n]+\n',''); + if isempty(findstr(mfilename,err.message)) + % Indicate error origin, if not already stated within the error message + err.message = [mfilename ': ' err.message]; + end + rethrow(err); + end + + %% Display a warning if the requested handle was not found because it's invisible + function warnInvisible(varargin) + try + if strcmpi(get(hFig,'Visible'),'off') + pos = get(hFig,'Position'); + set(hFig, 'Position',pos-[5000,5000,0,0], 'Visible','on'); + drawnow; pause(0.01); + [handles,levels,parentIdx,listing] = findjobj(origContainer,varargin{:}); + set(hFig, 'Position',pos, 'Visible','off'); + end + catch + % ignore - move on... + end + try + stk = dbstack; + stkNames = {stk.name}; + OutputFcnIdx = find(~cellfun(@isempty,regexp(stkNames,'_OutputFcn'))); + if ~isempty(OutputFcnIdx) + OutputFcnName = stkNames{OutputFcnIdx}; + warning('YMA:FindJObj:OutputFcn',['No Java reference was found for the requested handle, because the figure is still invisible in ' OutputFcnName '()']); + elseif ishandle(origContainer) && isprop(origContainer,'Visible') && strcmpi(get(origContainer,'Visible'),'off') + warning('YMA:FindJObj:invisibleHandle','No Java reference was found for the requested handle, probably because it is still invisible'); + end + catch + % Never mind... + end + end + + %% Check existence of a (case-insensitive) optional parameter in the params list + function [flag,idx] = paramSupplied(paramsList,paramName) + %idx = find(~cellfun('isempty',regexpi(paramsList(cellfun(@ischar,paramsList)),['^-?' paramName]))); + idx = find(~cellfun('isempty',regexpi(paramsList(cellfun('isclass',paramsList,'char')),['^-?' paramName]))); % 30/9/2009 fix for ML 7.0 suggested by Oliver W + flag = any(idx); + end + + %% Get current figure (even if its 'HandleVisibility' property is 'off') + function curFig = getCurrentFigure + oldShowHidden = get(0,'ShowHiddenHandles'); + set(0,'ShowHiddenHandles','on'); % minor fix per Johnny Smith + curFig = gcf; + set(0,'ShowHiddenHandles',oldShowHidden); + end + + %% Get Java reference to top-level (root) panel - actually, a reference to the java figure + function [jRootPane,contentSize] = getRootPanel(hFig) + try + contentSize = [0,0]; % initialize + jRootPane = hFig; + figName = get(hFig,'name'); + if strcmpi(get(hFig,'number'),'on') + figName = regexprep(['Figure ' num2str(hFig) ': ' figName],': $',''); + end + mde = com.mathworks.mde.desk.MLDesktop.getInstance; + jFigPanel = mde.getClient(figName); + jRootPane = jFigPanel; + jRootPane = jFigPanel.getRootPane; + catch + try + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + jFrame = get(hFig,'JavaFrame'); + jFigPanel = get(jFrame,'FigurePanelContainer'); + jRootPane = jFigPanel; + jRootPane = jFigPanel.getComponent(0).getRootPane; + catch + % Never mind + end + end + try + % If invalid RootPane - try another method... + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + jFrame = get(hFig,'JavaFrame'); + jAxisComponent = get(jFrame,'AxisComponent'); + jRootPane = jAxisComponent.getParent.getParent.getRootPane; + catch + % Never mind + end + try + % If invalid RootPane, retry up to N times + tries = 10; + while isempty(jRootPane) && tries>0 % might happen if figure is still undergoing rendering... + drawnow; pause(0.001); + tries = tries - 1; + jRootPane = jFigPanel.getComponent(0).getRootPane; + end + + % If still invalid, use FigurePanelContainer which is good enough in 99% of cases... (menu/tool bars won't be accessible, though) + if isempty(jRootPane) + jRootPane = jFigPanel; + end + contentSize = [jRootPane.getWidth, jRootPane.getHeight]; + + % Try to get the ancestor FigureFrame + jRootPane = jRootPane.getTopLevelAncestor; + catch + % Never mind - FigurePanelContainer is good enough in 99% of cases... (menu/tool bars won't be accessible, though) + end + end + + %% Traverse the container hierarchy and extract the elements within + function traverseContainer(jcontainer,level,parent) + persistent figureComponentFound menuRootFound + + % Record the data for this node + %disp([repmat(' ',1,level) '<= ' char(jcontainer.toString)]) + thisIdx = length(levels) + 1; + levels(thisIdx) = level; + parentIdx(thisIdx) = parent; + try newHandle = handle(jcontainer,'callbackproperties'); catch, newHandle = handle(jcontainer); end + try handles(thisIdx) = newHandle; catch, handles = newHandle; end + try + positions(thisIdx,:) = getXY(jcontainer); + %sizes(thisIdx,:) = [jcontainer.getWidth, jcontainer.getHeight]; + catch + positions(thisIdx,:) = [0,0]; + %sizes(thisIdx,:) = [0,0]; + end + if level>0 + positions(thisIdx,:) = positions(thisIdx,:) + positions(parent,:); + if ~figureComponentFound && ... + strcmp(jcontainer.getName,'fComponentContainer') && ... + isa(jcontainer,'com.mathworks.hg.peer.FigureComponentContainer') % there are 2 FigureComponentContainers - only process one... + + % restart coordinate system, to exclude menu & toolbar areas + positions(thisIdx,:) = positions(thisIdx,:) - [jcontainer.getRootPane.getX, jcontainer.getRootPane.getY]; + figureComponentFound = true; + end + elseif level==1 + positions(thisIdx,:) = positions(thisIdx,:) + positions(parent,:); + else + % level 0 - initialize flags used later + figureComponentFound = false; + menuRootFound = false; + end + parentId = length(parentIdx); + + % Traverse Menu items, unless the 'nomenu' option was requested + if ~nomenu + try + for child = 1 : getNumMenuComponents(jcontainer) + traverseContainer(jcontainer.getMenuComponent(child-1),level+1,parentId); + end + catch + % Probably not a Menu container, but maybe a top-level JMenu, so discard duplicates + %if isa(handles(end).java,'javax.swing.JMenuBar') + if ~menuRootFound && strcmp(class(java(handles(end))),'javax.swing.JMenuBar') %faster... + if removeDuplicateNode(thisIdx) + menuRootFound = true; + return; + end + end + end + end + + % Now recursively process all this node's children (if any), except menu items if so requested + %if isa(jcontainer,'java.awt.Container') + try % try-catch is faster than checking isa(jcontainer,'java.awt.Container')... + %if jcontainer.getComponentCount, jcontainer.getComponents, end + if ~nomenu || menuBarFoundFlag || isempty(strfind(class(jcontainer),'FigureMenuBar')) + lastChildComponent = java.lang.Object; + child = 0; + while (child < jcontainer.getComponentCount) + childComponent = jcontainer.getComponent(child); + % Looping over menus sometimes causes jcontainer to get mixed up (probably a JITC bug), so identify & fix + if isequal(childComponent,lastChildComponent) + child = child + 1; + childComponent = jcontainer.getComponent(child); + end + lastChildComponent = childComponent; + %disp([repmat(' ',1,level) '=> ' num2str(child) ': ' char(class(childComponent))]) + traverseContainer(childComponent,level+1,parentId); + child = child + 1; + end + else + menuBarFoundFlag = true; % use this flag to skip further testing for FigureMenuBar + end + catch + % do nothing - probably not a container + %dispError + end + + % ...and yet another type of child traversal... + try + if ~isdeployed % prevent 'File is empty' messages in compiled apps + jc = jcontainer.java; + else + jc = jcontainer; + end + for child = 1 : jc.getChildCount + traverseContainer(jc.getChildAt(child-1),level+1,parentId); + end + catch + % do nothing - probably not a container + %dispError + end + + % TODO: Add axis (plot) component handles + end + + %% Get the XY location of a Java component + function xy = getXY(jcontainer) + % Note: getX/getY are better than get(..,'X') (mem leaks), + % ^^^^ but sometimes they fail and revert to getx.m ... + % Note2: try awtinvoke() catch is faster than checking ismethod()... + % Note3: using AWTUtilities.invokeAndWait() directly is even faster than awtinvoke()... + try %if ismethod(jcontainer,'getX') + %positions(thisIdx,:) = [jcontainer.getX, jcontainer.getY]; + cls = getClass(jcontainer); + location = com.mathworks.jmi.AWTUtilities.invokeAndWait(jcontainer,getMethod(cls,'getLocation',[]),[]); + x = location.getX; + y = location.getY; + catch %else + try + x = com.mathworks.jmi.AWTUtilities.invokeAndWait(jcontainer,getMethod(cls,'getX',[]),[]); + y = com.mathworks.jmi.AWTUtilities.invokeAndWait(jcontainer,getMethod(cls,'getY',[]),[]); + catch + try + x = awtinvoke(jcontainer,'getX()'); + y = awtinvoke(jcontainer,'getY()'); + catch + x = get(jcontainer,'X'); + y = get(jcontainer,'Y'); + end + end + end + %positions(thisIdx,:) = [x, y]; + xy = [x,y]; + end + + %% Get the number of menu sub-elements + function numMenuComponents = getNumMenuComponents(jcontainer) + + % The following line will raise an Exception for anything except menus + numMenuComponents = jcontainer.getMenuComponentCount; + + % No error so far, so this must be a menu container... + % Note: Menu subitems are not visible until the top-level (root) menu gets initial focus... + % Try several alternatives, until we get a non-empty menu (or not...) + % TODO: Improve performance - this takes WAY too long... + if jcontainer.isTopLevelMenu && (numMenuComponents==0) + jcontainer.requestFocus; + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + drawnow; pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + jcontainer.setSelected(true); + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + drawnow; pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + jcontainer.doClick; % needed in order to populate the sub-menu components + numMenuComponents = jcontainer.getMenuComponentCount; + if (numMenuComponents == 0) + drawnow; %pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + jcontainer.doClick; % close menu by re-clicking... + if (numMenuComponents == 0) + drawnow; %pause(0.001); + numMenuComponents = jcontainer.getMenuComponentCount; + end + else + % ok - found sub-items + % Note: no need to close menu since this will be done when focus moves to the FindJObj window + %jcontainer.doClick; % close menu by re-clicking... + end + end + end + jcontainer.setSelected(false); % de-select the menu + end + end + end + end + + %% Remove a specific tree node's data + function nodeRemovedFlag = removeDuplicateNode(thisIdx) + nodeRemovedFlag = false; + for idx = 1 : thisIdx-1 + if isequal(handles(idx),handles(thisIdx)) + levels(thisIdx) = []; + parentIdx(thisIdx) = []; + handles(thisIdx) = []; + positions(thisIdx,:) = []; + %sizes(thisIdx,:) = []; + nodeRemovedFlag = true; + return; + end + end + end + + %% Process optional args + function processArgs(varargin) + + % Initialize + invertFlag = false; + listing = ''; + + % Loop over all optional args + while ~isempty(varargin) && ~isempty(handles) + + % Process the arg (and all its params) + foundIdx = 1 : length(handles); + if iscell(varargin{1}), varargin{1} = varargin{1}{1}; end + if ~isempty(varargin{1}) && varargin{1}(1)=='-' + varargin{1}(1) = []; + end + switch lower(varargin{1}) + case 'not' + invertFlag = true; + case 'position' + [varargin,foundIdx] = processPositionArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'size' + [varargin,foundIdx] = processSizeArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'class' + [varargin,foundIdx] = processClassArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'property' + [varargin,foundIdx] = processPropertyArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'depth' + [varargin,foundIdx] = processDepthArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case 'flat' + varargin = {'depth',0, varargin{min(2:end):end}}; + [varargin,foundIdx] = processDepthArgs(varargin{:}); + if invertFlag, foundIdx = ~foundIdx; invertFlag = false; end + case {'print','list'} + [varargin,listing] = processPrintArgs(varargin{:}); + case {'persist','nomenu','debug'} + % ignore - already handled in main function above + otherwise + error('YMA:findjobj:IllegalOption',['Option ' num2str(varargin{1}) ' is not a valid option. Type ''help ' mfilename ''' for the full options list.']); + end + + % If only parent-child pairs found + foundIdx = find(foundIdx); + if ~isempty(foundIdx) && isequal(parentIdx(foundIdx(2:2:end)),foundIdx(1:2:end)) + % Return just the children (the parent panels are uninteresting) + foundIdx(1:2:end) = []; + end + + % If several possible handles were found and the first is the container of the second + if length(foundIdx) == 2 && isequal(handles(foundIdx(1)).java, handles(foundIdx(2)).getParent) + % Discard the uninteresting component container + foundIdx(1) = []; + end + + % Filter the results + selectedIdx = selectedIdx(foundIdx); + handles = handles(foundIdx); + levels = levels(foundIdx); + parentIdx = parentIdx(foundIdx); + positions = positions(foundIdx,:); + + % Remove this arg and proceed to the next one + varargin(1) = []; + + end % Loop over all args + end + + %% Process 'print' option + function [varargin,listing] = processPrintArgs(varargin) + if length(varargin)<2 || ischar(varargin{2}) + % No second arg given, so use the first available element + listingContainer = handles(1); %#ok - used in evalc below + else + % Get the element to print from the specified second arg + if isnumeric(varargin{2}) && (varargin{2} == fix(varargin{2})) % isinteger doesn't work on doubles... + if (varargin{2} > 0) && (varargin{2} <= length(handles)) + listingContainer = handles(varargin{2}); %#ok - used in evalc below + elseif varargin{2} > 0 + error('YMA:findjobj:IllegalPrintFilter','Print filter index %g > number of available elements (%d)',varargin{2},length(handles)); + else + error('YMA:findjobj:IllegalPrintFilter','Print filter must be a java handle or positive numeric index into handles'); + end + elseif ismethod(varargin{2},'list') + listingContainer = varargin{2}; %#ok - used in evalc below + else + error('YMA:findjobj:IllegalPrintFilter','Print filter must be a java handle or numeric index into handles'); + end + varargin(2) = []; + end + + % use evalc() to capture output into a Matlab variable + %listing = evalc('listingContainer.list'); + + % Better solution: loop over all handles and process them one by one + listing = cell(length(handles),1); + for componentIdx = 1 : length(handles) + listing{componentIdx} = [repmat(' ',1,levels(componentIdx)) char(handles(componentIdx).toString)]; + end + end + + %% Process 'position' option + function [varargin,foundIdx] = processPositionArgs(varargin) + if length(varargin)>1 + positionFilter = varargin{2}; + %if (isjava(positionFilter) || iscom(positionFilter)) && ismethod(positionFilter,'getLocation') + try % try-catch is faster... + % Java/COM object passed - get its position + positionFilter = positionFilter.getLocation; + filterXY = [positionFilter.getX, positionFilter.getY]; + catch + if ~isscalar(positionFilter) + % position vector passed + if (length(positionFilter)>=2) && isnumeric(positionFilter) + % Remember that java coordinates start at top-left corner, Matlab coords start at bottom left... + %positionFilter = java.awt.Point(positionFilter(1), container.getHeight - positionFilter(2)); + filterXY = [container.getX + positionFilter(1), container.getY + contentSize(2) - positionFilter(2)]; + + % Check for full Matlab position vector (x,y,w,h) + %if (length(positionFilter)==4) + % varargin{end+1} = 'size'; + % varargin{end+1} = fix(positionFilter(3:4)); + %end + else + error('YMA:findjobj:IllegalPositionFilter','Position filter must be a java UI component, or X,Y pair'); + end + elseif length(varargin)>2 + % x,y passed as separate arg values + if isnumeric(positionFilter) && isnumeric(varargin{3}) + % Remember that java coordinates start at top-left corner, Matlab coords start at bottom left... + %positionFilter = java.awt.Point(positionFilter, container.getHeight - varargin{3}); + filterXY = [container.getX + positionFilter, container.getY + contentSize(2) - varargin{3}]; + varargin(3) = []; + else + error('YMA:findjobj:IllegalPositionFilter','Position filter must be a java UI component, or X,Y pair'); + end + else + error('YMA:findjobj:IllegalPositionFilter','Position filter must be a java UI component, or X,Y pair'); + end + end + + % Compute the required element positions in order to be eligible for a more detailed examination + % Note: based on the following constraints: 0 <= abs(elementX-filterX) + abs(elementY+elementH-filterY) < 7 + baseDeltas = [positions(:,1)-filterXY(1), positions(:,2)-filterXY(2)]; % faster than repmat()... + %baseHeight = - baseDeltas(:,2);% -abs(baseDeltas(:,1)); + %minHeight = baseHeight - 7; + %maxHeight = baseHeight + 7; + %foundIdx = ~arrayfun(@(b)(invoke(b,'contains',positionFilter)),handles); % ARGH! - disallowed by Matlab! + %foundIdx = repmat(false,1,length(handles)); + %foundIdx(length(handles)) = false; % faster than repmat()... + foundIdx = (abs(baseDeltas(:,1)) < 7) & (abs(baseDeltas(:,2)) < 7); % & (minHeight >= 0); + %fi = find(foundIdx); + %for componentIdx = 1 : length(fi) + %foundIdx(componentIdx) = handles(componentIdx).getBounds.contains(positionFilter); + + % Search for a point no farther than 7 pixels away (prevents rounding errors) + %foundIdx(componentIdx) = handles(componentIdx).getLocationOnScreen.distanceSq(positionFilter) < 50; % fails for invisible components... + + %p = java.awt.Point(positions(componentIdx,1), positions(componentIdx,2) + handles(componentIdx).getHeight); + %foundIdx(componentIdx) = p.distanceSq(positionFilter) < 50; + + %foundIdx(componentIdx) = sum(([baseDeltas(componentIdx,1),baseDeltas(componentIdx,2)+handles(componentIdx).getHeight]).^2) < 50; + + % Following is the fastest method found to date: only eligible elements are checked in detailed + % elementHeight = handles(fi(componentIdx)).getHeight; + % foundIdx(fi(componentIdx)) = elementHeight > minHeight(fi(componentIdx)) && ... + % elementHeight < maxHeight(fi(componentIdx)); + %disp([componentIdx,elementHeight,minHeight(fi(componentIdx)),maxHeight(fi(componentIdx)),foundIdx(fi(componentIdx))]) + %end + + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'size' option + function [varargin,foundIdx] = processSizeArgs(varargin) + if length(varargin)>1 + sizeFilter = lower(varargin{2}); + %if (isjava(sizeFilter) || iscom(sizeFilter)) && ismethod(sizeFilter,'getSize') + try % try-catch is faster... + % Java/COM object passed - get its size + sizeFilter = sizeFilter.getSize; + filterWidth = sizeFilter.getWidth; + filterHeight = sizeFilter.getHeight; + catch + if ~isscalar(sizeFilter) + % size vector passed + if (length(sizeFilter)>=2) && isnumeric(sizeFilter) + %sizeFilter = java.awt.Dimension(sizeFilter(1),sizeFilter(2)); + filterWidth = sizeFilter(1); + filterHeight = sizeFilter(2); + else + error('YMA:findjobj:IllegalSizeFilter','Size filter must be a java UI component, or W,H pair'); + end + elseif length(varargin)>2 + % w,h passed as separate arg values + if isnumeric(sizeFilter) && isnumeric(varargin{3}) + %sizeFilter = java.awt.Dimension(sizeFilter,varargin{3}); + filterWidth = sizeFilter; + filterHeight = varargin{3}; + varargin(3) = []; + else + error('YMA:findjobj:IllegalSizeFilter','Size filter must be a java UI component, or W,H pair'); + end + else + error('YMA:findjobj:IllegalSizeFilter','Size filter must be a java UI component, or W,H pair'); + end + end + %foundIdx = ~arrayfun(@(b)(invoke(b,'contains',sizeFilter)),handles); % ARGH! - disallowed by Matlab! + foundIdx(length(handles)) = false; % faster than repmat()... + for componentIdx = 1 : length(handles) + %foundIdx(componentIdx) = handles(componentIdx).getSize.equals(sizeFilter); + % Allow a 2-pixel tollerance to account for non-integer pixel sizes + foundIdx(componentIdx) = abs(handles(componentIdx).getWidth - filterWidth) <= 3 && ... % faster than getSize.equals() + abs(handles(componentIdx).getHeight - filterHeight) <= 3; + end + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'class' option + function [varargin,foundIdx] = processClassArgs(varargin) + if length(varargin)>1 + classFilter = varargin{2}; + %if ismethod(classFilter,'getClass') + try % try-catch is faster... + classFilter = char(classFilter.getClass); + catch + if ~ischar(classFilter) + error('YMA:findjobj:IllegalClassFilter','Class filter must be a java object, class or string'); + end + end + + % Now convert all java classes to java.lang.Strings and compare to the requested filter string + try + foundIdx(length(handles)) = false; % faster than repmat()... + jClassFilter = java.lang.String(classFilter).toLowerCase; + for componentIdx = 1 : length(handles) + % Note: JVM 1.5's String.contains() appears slightly slower and is available only since Matlab 7.2 + foundIdx(componentIdx) = handles(componentIdx).getClass.toString.toLowerCase.indexOf(jClassFilter) >= 0; + end + catch + % Simple processing: slower since it does extra processing within opaque.char() + for componentIdx = 1 : length(handles) + % Note: using @toChar is faster but returns java String, not a Matlab char + foundIdx(componentIdx) = ~isempty(regexpi(char(handles(componentIdx).getClass),classFilter)); + end + end + + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'property' option + function [varargin,foundIdx] = processPropertyArgs(varargin) + if length(varargin)>1 + propertyName = varargin{2}; + if iscell(propertyName) + if length(propertyName) == 2 + propertyVal = propertyName{2}; + propertyName = propertyName{1}; + elseif length(propertyName) == 1 + propertyName = propertyName{1}; + else + error('YMA:findjobj:IllegalPropertyFilter','Property filter must be a string (case insensitive name of property) or cell array {propName,propValue}'); + end + end + if ~ischar(propertyName) + error('YMA:findjobj:IllegalPropertyFilter','Property filter must be a string (case insensitive name of property) or cell array {propName,propValue}'); + end + propertyName = lower(propertyName); + %foundIdx = arrayfun(@(h)isprop(h,propertyName),handles); % ARGH! - disallowed by Matlab! + foundIdx(length(handles)) = false; % faster than repmat()... + + % Split processing depending on whether a specific property value was requested (ugly but faster...) + if exist('propertyVal','var') + for componentIdx = 1 : length(handles) + try + % Find out whether this element has the specified property + % Note: findprop() and its return value schema.prop are undocumented and unsupported! + prop = findprop(handles(componentIdx),propertyName); % faster than isprop() & enables partial property names + + % If found, compare it to the actual element's property value + foundIdx(componentIdx) = ~isempty(prop) && isequal(get(handles(componentIdx),prop.Name),propertyVal); + catch + % Some Java classes have a write-only property (like LabelPeer with 'Text'), so we end up here + % In these cases, simply assume that the property value doesn't match and continue + foundIdx(componentIdx) = false; + end + end + else + for componentIdx = 1 : length(handles) + try + % Find out whether this element has the specified property + % Note: findprop() and its return value schema.prop are undocumented and unsupported! + foundIdx(componentIdx) = ~isempty(findprop(handles(componentIdx),propertyName)); + catch + foundIdx(componentIdx) = false; + end + end + end + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Process 'depth' option + function [varargin,foundIdx] = processDepthArgs(varargin) + if length(varargin)>1 + level = varargin{2}; + if ~isnumeric(level) + error('YMA:findjobj:IllegalDepthFilter','Depth filter must be a number (=maximal element depth)'); + end + foundIdx = (levels <= level); + varargin(2) = []; + else + foundIdx = []; + end + end + + %% Convert property data into a string + function data = charizeData(data) + if isa(data,'com.mathworks.hg.types.HGCallback') + data = get(data,'Callback'); + end + if ~ischar(data) && ~isa(data,'java.lang.String') + newData = strtrim(evalc('disp(data)')); + try + newData = regexprep(newData,' +',' '); + newData = regexprep(newData,'Columns \d+ through \d+\s',''); + newData = regexprep(newData,'Column \d+\s',''); + catch + %never mind... + end + if iscell(data) + newData = ['{ ' newData ' }']; + elseif isempty(data) + newData = ''; + elseif isnumeric(data) || islogical(data) || any(ishandle(data)) || numel(data) > 1 %&& ~isscalar(data) + newData = ['[' newData ']']; + end + data = newData; + elseif ~isempty(data) + data = ['''' data '''']; + end + end % charizeData + + %% Prepare a hierarchical callbacks table data + function setProp(list,name,value,category) + prop = eval('com.jidesoft.grid.DefaultProperty();'); % prevent JIDE alert by run-time (not load-time) evaluation + prop.setName(name); + prop.setType(java.lang.String('').getClass); + prop.setValue(value); + prop.setEditable(true); + prop.setExpert(true); + %prop.setCategory(['' category ' callbacks']); + prop.setCategory([category ' callbacks']); + list.add(prop); + end % getTreeData + + %% Prepare a hierarchical callbacks table data + function list = getTreeData(data) + list = java.util.ArrayList(); + names = regexprep(data,'([A-Z][a-z]+).*','$1'); + %hash = java.util.Hashtable; + others = {}; + for propIdx = 1 : size(data,1) + if (propIdx < size(data,1) && strcmp(names{propIdx},names{propIdx+1})) || ... + (propIdx > 1 && strcmp(names{propIdx},names{propIdx-1})) + % Child callback property + setProp(list,data{propIdx,1},data{propIdx,2},names{propIdx}); + else + % Singular callback property => Add to 'Other' category at bottom of the list + others(end+1,:) = data(propIdx,:); %#ok + end + end + for propIdx = 1 : size(others,1) + setProp(list,others{propIdx,1},others{propIdx,2},'Other'); + end + end % getTreeData + + %% Get callbacks table data + function [cbData, cbHeaders, cbTableEnabled] = getCbsData(obj, stripStdCbsFlag) + % Initialize + cbData = {'(no callbacks)'}; + cbHeaders = {'Callback name'}; + cbTableEnabled = false; + cbNames = {}; + + try + try + classHdl = classhandle(handle(obj)); + cbNames = get(classHdl.Events,'Name'); + if ~isempty(cbNames) && ~iscom(obj) %only java-based please... + cbNames = strcat(cbNames,'Callback'); + end + propNames = get(classHdl.Properties,'Name'); + catch + % Try to interpret as an MCOS class object + try + oldWarn = warning('off','MATLAB:structOnObject'); + dataFields = struct(obj); + warning(oldWarn); + catch + dataFields = get(obj); + end + propNames = fieldnames(dataFields); + end + propCbIdx = []; + if ischar(propNames), propNames={propNames}; end % handle case of a single callback + if ~isempty(propNames) + propCbIdx = find(~cellfun(@isempty,regexp(propNames,'(Fcn|Callback)$'))); + cbNames = unique([cbNames; propNames(propCbIdx)]); %#ok logical is faster but less debuggable... + end + if ~isempty(cbNames) + if stripStdCbsFlag + cbNames = stripStdCbs(cbNames); + end + if iscell(cbNames) + cbNames = sort(cbNames); + if size(cbNames,1) < size(cbNames,2) + cbNames = cbNames'; + end + end + hgHandleFlag = 0; try hgHandleFlag = ishghandle(obj); catch, end %#ok + try + obj = handle(obj,'CallbackProperties'); + catch + hgHandleFlag = 1; + end + if hgHandleFlag + % HG handles don't allow CallbackProperties - search only for *Fcn + %cbNames = propNames(propCbIdx); + end + if iscom(obj) + cbs = obj.eventlisteners; + if ~isempty(cbs) + cbNamesRegistered = cbs(:,1); + cbData = setdiff(cbNames,cbNamesRegistered); + %cbData = charizeData(cbData); + if size(cbData,2) > size(cbData(1)) + cbData = cbData'; + end + cbData = [cbData, cellstr(repmat(' ',length(cbData),1))]; + cbData = [cbData; cbs]; + [sortedNames, sortedIdx] = sort(cbData(:,1)); + sortedCbs = cellfun(@charizeData,cbData(sortedIdx,2),'un',0); + cbData = [sortedNames, sortedCbs]; + else + cbData = [cbNames, cellstr(repmat(' ',length(cbNames),1))]; + end + elseif iscell(cbNames) + cbNames = sort(cbNames); + %cbData = [cbNames, get(obj,cbNames)']; + cbData = cbNames; + oldWarn = warning('off','MATLAB:hg:JavaSetHGProperty'); + warning('off','MATLAB:hg:PossibleDeprecatedJavaSetHGProperty'); + for idx = 1 : length(cbNames) + try + cbData{idx,2} = charizeData(get(obj,cbNames{idx})); + catch + cbData{idx,2} = '(callback value inaccessible)'; + end + end + warning(oldWarn); + else % only one event callback + %cbData = {cbNames, get(obj,cbNames)'}; + %cbData{1,2} = charizeData(cbData{1,2}); + try + cbData = {cbNames, charizeData(get(obj,cbNames))}; + catch + cbData = {cbNames, '(callback value inaccessible)'}; + end + end + cbHeaders = {'Callback name','Callback value'}; + cbTableEnabled = true; + end + catch + % never mind - use default (empty) data + end + end % getCbsData + + %% Get relative (0.0-1.0) divider location + function divLocation = getRalativeDivlocation(jDiv) + divLocation = jDiv.getDividerLocation; + if divLocation > 1 % i.e. [pixels] + visibleRect = jDiv.getVisibleRect; + if jDiv.getOrientation == 0 % vertical + start = visibleRect.getY; + extent = visibleRect.getHeight - start; + else + start = visibleRect.getX; + extent = visibleRect.getWidth - start; + end + divLocation = (divLocation - start) / extent; + end + end % getRalativeDivlocation + + %% Try to set a treenode icon based on a container's icon + function setTreeNodeIcon(treenode,container) + try + iconImage = []; + iconImage = container.getIcon; + if ~isempty(findprop(handle(iconImage),'Image')) % get(iconImage,'Image') is easier but leaks memory... + iconImage = iconImage.getImage; + else + a=b; %#ok cause an error + end + catch + try + iconImage = container.getIconImage; + catch + try + if ~isempty(iconImage) + ge = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment; + gd = ge.getDefaultScreenDevice; + gc = gd.getDefaultConfiguration; + image = gc.createCompatibleImage(iconImage.getIconWidth, iconImage.getIconHeight); % a BufferedImage object + g = image.createGraphics; + iconImage.paintIcon([], g, 0, 0); + g.dispose; + iconImage = image; + end + catch + % never mind... + end + end + end + if ~isempty(iconImage) + iconImage = setIconSize(iconImage); + treenode.setIcon(iconImage); + end + end % setTreeNodeIcon + + %% Present the object hierarchy tree + function presentObjectTree() + persistent lastVersionCheck + if isempty(lastVersionCheck), lastVersionCheck = now-1; end + + import java.awt.* + import javax.swing.* + hTreeFig = findall(0,'tag','findjobjFig'); + iconpath = [matlabroot, '/toolbox/matlab/icons/']; + cbHideStd = 0; % Initial state of the cbHideStdCbs checkbox + if isempty(hTreeFig) + % Prepare the figure + hTreeFig = figure('tag','findjobjFig','menuBar','none','toolBar','none','Name','FindJObj','NumberTitle','off','handleVisibility','off','IntegerHandle','off'); + figIcon = ImageIcon([iconpath 'tool_legend.gif']); + drawnow; + try + mde = com.mathworks.mde.desk.MLDesktop.getInstance; + jTreeFig = mde.getClient('FindJObj').getTopLevelAncestor; + jTreeFig.setIcon(figIcon); + catch + warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); % R2008b compatibility + jTreeFig = get(hTreeFig,'JavaFrame'); + jTreeFig.setFigureIcon(figIcon); + end + vsplitPaneLocation = 0.8; + hsplitPaneLocation = 0.5; + else + % Remember cbHideStdCbs checkbox & dividers state for later + userdata = get(hTreeFig, 'userdata'); + try cbHideStd = userdata.cbHideStdCbs.isSelected; catch, end %#ok + try + vsplitPaneLocation = getRalativeDivlocation(userdata.vsplitPane); + hsplitPaneLocation = getRalativeDivlocation(userdata.hsplitPane); + catch + vsplitPaneLocation = 0.8; + hsplitPaneLocation = 0.5; + end + + % Clear the figure and redraw + clf(hTreeFig); + figure(hTreeFig); % bring to front + end + + % Traverse all HG children, if root container was a HG handle + if ishghandle(origContainer) %&& ~isequal(origContainer,container) + traverseHGContainer(origContainer,0,0); + end + + % Prepare the tree pane + warning('off','MATLAB:uitreenode:MigratingFunction'); % R2008b compatibility + warning('off','MATLAB:uitreenode:DeprecatedFunction'); % R2008a compatibility + tree_h = com.mathworks.hg.peer.UITreePeer; + try tree_h = javaObjectEDT(tree_h); catch, end + tree_hh = handle(tree_h,'CallbackProperties'); + hasChildren = sum(allParents==1) > 1; + icon = [iconpath 'upfolder.gif']; + [rootName, rootTitle] = getNodeName(container); + try + root = uitreenode('v0', handle(container), rootName, icon, ~hasChildren); + catch % old matlab version don't have the 'v0' option + root = uitreenode(handle(container), rootName, icon, ~hasChildren); + end + setTreeNodeIcon(root,container); % constructor must accept a char icon unfortunately, so need to do this afterwards... + if ~isempty(rootTitle) + set(hTreeFig, 'Name',['FindJObj - ' char(rootTitle)]); + end + nodedata.idx = 1; + nodedata.obj = container; + set(root,'userdata',nodedata); + root.setUserObject(container); + setappdata(root,'childHandle',container); + tree_h.setRoot(root); + treePane = tree_h.getScrollPane; + treePane.setMinimumSize(Dimension(50,50)); + jTreeObj = treePane.getViewport.getComponent(0); + jTreeObj.setShowsRootHandles(true) + jTreeObj.getSelectionModel.setSelectionMode(javax.swing.tree.TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); + %jTreeObj.setVisible(0); + %jTreeObj.getCellRenderer.setLeafIcon([]); + %jTreeObj.getCellRenderer.setOpenIcon(figIcon); + %jTreeObj.getCellRenderer.setClosedIcon([]); + treePanel = JPanel(BorderLayout); + treePanel.add(treePane, BorderLayout.CENTER); + progressBar = JProgressBar(0); + progressBar.setMaximum(length(allHandles) + length(hg_handles)); % = # of all nodes + treePanel.add(progressBar, BorderLayout.SOUTH); + + % Prepare the image pane +%disable for now, until we get it working... +%{ + try + hFig = ancestor(origContainer,'figure'); + [cdata, cm] = getframe(hFig); %#ok cm unused + tempfname = [tempname '.png']; + imwrite(cdata,tempfname); % don't know how to pass directly to BufferedImage, so use disk... + jImg = javax.imageio.ImageIO.read(java.io.File(tempfname)); + try delete(tempfname); catch end + imgPanel = JPanel(); + leftPanel = JSplitPane(JSplitPane.VERTICAL_SPLIT, treePanel, imgPanel); + leftPanel.setOneTouchExpandable(true); + leftPanel.setContinuousLayout(true); + leftPanel.setResizeWeight(0.8); + catch + leftPanel = treePanel; + end +%} + leftPanel = treePanel; + + % Prepare the inspector pane + classNameLabel = JLabel([' ' char(class(container))]); + classNameLabel.setForeground(Color.blue); + updateNodeTooltip(container, classNameLabel); + inspectorPanel = JPanel(BorderLayout); + inspectorPanel.add(classNameLabel, BorderLayout.NORTH); + % TODO: Maybe uncomment the following when we add the HG tree - in the meantime it's unused (java properties are un-groupable) + %objReg = com.mathworks.services.ObjectRegistry.getLayoutRegistry; + %toolBar = awtinvoke('com.mathworks.mlwidgets.inspector.PropertyView$ToolBarStyle','valueOf(Ljava.lang.String;)','GROUPTOOLBAR'); + %inspectorPane = com.mathworks.mlwidgets.inspector.PropertyView(objReg, toolBar); + inspectorPane = com.mathworks.mlwidgets.inspector.PropertyView; + identifiers = disableDbstopError; %#ok "dbstop if error" causes inspect.m to croak due to a bug - so workaround + inspectorPane.setObject(container); + inspectorPane.setAutoUpdate(true); + % TODO: Add property listeners + % TODO: Display additional props + inspectorTable = inspectorPane; + try + while ~isa(inspectorTable,'javax.swing.JTable') + inspectorTable = inspectorTable.getComponent(0); + end + catch + % R2010a + inspectorTable = inspectorPane.getComponent(0).getScrollPane.getViewport.getComponent(0); + end + toolTipText = 'hover mouse over the red classname above to see the full list of properties'; + inspectorTable.setToolTipText(toolTipText); + jideTableUtils = []; + try + % Try JIDE features - see http://www.jidesoft.com/products/JIDE_Grids_Developer_Guide.pdf + com.mathworks.mwswing.MJUtilities.initJIDE; + jideTableUtils = eval('com.jidesoft.grid.TableUtils;'); % prevent JIDE alert by run-time (not load-time) evaluation + jideTableUtils.autoResizeAllColumns(inspectorTable); + inspectorTable.setRowAutoResizes(true); + inspectorTable.getModel.setShowExpert(1); + catch + % JIDE is probably unavailable - never mind... + end + inspectorPanel.add(inspectorPane, BorderLayout.CENTER); + % TODO: Add data update listeners + + % Prepare the callbacks pane + callbacksPanel = JPanel(BorderLayout); + stripStdCbsFlag = true; % initial value + [cbData, cbHeaders, cbTableEnabled] = getCbsData(container, stripStdCbsFlag); + %{ + %classHdl = classhandle(handle(container)); + %eventNames = get(classHdl.Events,'Name'); + %if ~isempty(eventNames) + % cbNames = sort(strcat(eventNames,'Callback')); + % try + % cbData = [cbNames, get(container,cbNames)']; + % catch + % % R2010a + % cbData = cbNames; + % if isempty(cbData) + % cbData = {}; + % elseif ~iscell(cbData) + % cbData = {cbData}; + % end + % for idx = 1 : length(cbNames) + % cbData{idx,2} = get(container,cbNames{idx}); + % end + % end + % cbTableEnabled = true; + %else + % cbData = {'(no callbacks)',''}; + % cbTableEnabled = false; + %end + %cbHeaders = {'Callback name','Callback value'}; + %} + try + % Use JideTable if available on this system + %callbacksTableModel = javax.swing.table.DefaultTableModel(cbData,cbHeaders); %#ok + %callbacksTable = eval('com.jidesoft.grid.PropertyTable(callbacksTableModel);'); % prevent JIDE alert by run-time (not load-time) evaluation + try + list = getTreeData(cbData); %#ok + model = eval('com.jidesoft.grid.PropertyTableModel(list);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + % Auto-expand if only one category + if model.getRowCount==1 % length(model.getCategories)==1 fails for some unknown reason... + model.expandFirstLevel; + end + + %callbacksTable = eval('com.jidesoft.grid.TreeTable(model);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + callbacksTable = eval('com.jidesoft.grid.PropertyTable(model);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + %callbacksTable.expandFirstLevel; + callbacksTable.setShowsRootHandles(true); + callbacksTable.setShowTreeLines(false); + %callbacksTable.setShowNonEditable(0); %=SHOW_NONEDITABLE_NEITHER + callbacksPane = eval('com.jidesoft.grid.PropertyPane(callbacksTable);'); % prevent JIDE alert by run-time (not load-time) evaluation + callbacksPane.setShowDescription(false); + catch + callbacksTable = eval('com.jidesoft.grid.TreeTable(cbData,cbHeaders);'); % prevent JIDE alert by run-time (not load-time) evaluation + end + callbacksTable.setRowAutoResizes(true); + callbacksTable.setColumnAutoResizable(true); + callbacksTable.setColumnResizable(true); + jideTableUtils.autoResizeAllColumns(callbacksTable); + callbacksTable.setTableHeader([]); % hide the column headers since now we can resize columns with the gridline + callbacksLabel = JLabel(' Callbacks:'); % The column headers are replaced with a header label + callbacksLabel.setForeground(Color.blue); + %callbacksPanel.add(callbacksLabel, BorderLayout.NORTH); + + % Add checkbox to show/hide standard callbacks + callbacksTopPanel = JPanel; + callbacksTopPanel.setLayout(BoxLayout(callbacksTopPanel, BoxLayout.LINE_AXIS)); + callbacksTopPanel.add(callbacksLabel); + callbacksTopPanel.add(Box.createHorizontalGlue); + jcb = JCheckBox('Hide standard callbacks', cbHideStd); + set(handle(jcb,'CallbackProperties'), 'ActionPerformedCallback',{@cbHideStdCbs_Callback,callbacksTable}); + try + set(jcb, 'userdata',callbacksTable, 'tooltip','Hide standard Swing callbacks - only component-specific callbacks will be displayed'); + catch + jcb.setToolTipText('Hide standard Swing callbacks - only component-specific callbacks will be displayed'); + %setappdata(jcb,'userdata',callbacksTable); + end + callbacksTopPanel.add(jcb); + callbacksPanel.add(callbacksTopPanel, BorderLayout.NORTH); + catch + % Otherwise, use a standard Swing JTable (keep the headers to enable resizing) + callbacksTable = JTable(cbData,cbHeaders); + end + cbToolTipText = 'Callbacks may be ''strings'', @funcHandle or {@funcHandle,arg1,...}'; + callbacksTable.setToolTipText(cbToolTipText); + callbacksTable.setGridColor(inspectorTable.getGridColor); + cbNameTextField = JTextField; + cbNameTextField.setEditable(false); % ensure that the callback names are not modified... + cbNameCellEditor = DefaultCellEditor(cbNameTextField); + cbNameCellEditor.setClickCountToStart(intmax); % i.e, never enter edit mode... + callbacksTable.getColumnModel.getColumn(0).setCellEditor(cbNameCellEditor); + if ~cbTableEnabled + try callbacksTable.getColumnModel.getColumn(1).setCellEditor(cbNameCellEditor); catch, end + end + hModel = callbacksTable.getModel; + set(handle(hModel,'CallbackProperties'), 'TableChangedCallback',{@tbCallbacksChanged,container,callbacksTable}); + %set(hModel, 'UserData',container); + try + cbScrollPane = callbacksPane; %JScrollPane(callbacksPane); + %cbScrollPane.setHorizontalScrollBarPolicy(cbScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + catch + cbScrollPane = JScrollPane(callbacksTable); + cbScrollPane.setVerticalScrollBarPolicy(cbScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + end + callbacksPanel.add(cbScrollPane, BorderLayout.CENTER); + callbacksPanel.setToolTipText(cbToolTipText); + + % Prepare the top-bottom JSplitPanes + vsplitPane = JSplitPane(JSplitPane.VERTICAL_SPLIT, inspectorPanel, callbacksPanel); + vsplitPane.setOneTouchExpandable(true); + vsplitPane.setContinuousLayout(true); + vsplitPane.setResizeWeight(0.8); + + % Prepare the left-right JSplitPane + hsplitPane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, vsplitPane); + hsplitPane.setOneTouchExpandable(true); + hsplitPane.setContinuousLayout(true); + hsplitPane.setResizeWeight(0.6); + pos = getpixelposition(hTreeFig); + + % Prepare the bottom pane with all buttons + lowerPanel = JPanel(FlowLayout); + blogUrlLabel = 'Undocumented
Matlab.com
'; + jWebsite = createJButton(blogUrlLabel, @btWebsite_Callback, 'Visit the UndocumentedMatlab.com blog'); + jWebsite.setContentAreaFilled(0); + lowerPanel.add(jWebsite); + lowerPanel.add(createJButton('Refresh
tree', {@btRefresh_Callback, origContainer, hTreeFig}, 'Rescan the component tree, from the root down')); + lowerPanel.add(createJButton('Export to
workspace', {@btExport_Callback, jTreeObj, classNameLabel}, 'Export the selected component handles to workspace variable findjobj_hdls')); + lowerPanel.add(createJButton('Request
focus', {@btFocus_Callback, jTreeObj, root}, 'Set the focus on the first selected component')); + lowerPanel.add(createJButton('Inspect
object', {@btInspect_Callback, jTreeObj, root}, 'View the signature of all methods supported by the first selected component')); + lowerPanel.add(createJButton('Check for
updates', {@btCheckFex_Callback}, 'Check the MathWorks FileExchange for the latest version of FindJObj')); + + % Display everything on-screen + globalPanel = JPanel(BorderLayout); + globalPanel.add(hsplitPane, BorderLayout.CENTER); + globalPanel.add(lowerPanel, BorderLayout.SOUTH); + [obj, hcontainer] = javacomponent(globalPanel, [0,0,pos(3:4)], hTreeFig); + set(hcontainer,'units','normalized'); + drawnow; + hsplitPane.setDividerLocation(hsplitPaneLocation); % this only works after the JSplitPane is displayed... + vsplitPane.setDividerLocation(vsplitPaneLocation); % this only works after the JSplitPane is displayed... + %restoreDbstopError(identifiers); + + % Refresh & resize the screenshot thumbnail +%disable for now, until we get it working... +%{ + try + hAx = axes('Parent',hTreeFig, 'units','pixels', 'position',[10,10,250,150], 'visible','off'); + axis(hAx,'image'); + image(cdata,'Parent',hAx); + axis(hAx,'off'); + set(hAx,'UserData',cdata); + set(imgPanel, 'ComponentResizedCallback',{@resizeImg, hAx}, 'UserData',lowerPanel); + imgPanel.getGraphics.drawImage(jImg, 0, 0, []); + catch + % Never mind... + end +%} + % If all handles were selected (i.e., none were filtered) then only select the first + if (length(selectedIdx) == length(allHandles)) && ~isempty(selectedIdx) + selectedIdx = 1; + end + + % Store handles for callback use + userdata.handles = allHandles; + userdata.levels = allLevels; + userdata.parents = allParents; + userdata.hg_handles = hg_handles; + userdata.hg_levels = hg_levels; + userdata.hg_parents = hg_parentIdx; + userdata.initialIdx = selectedIdx; + userdata.userSelected = false; % Indicates the user has modified the initial selections + userdata.inInit = true; + userdata.jTree = jTreeObj; + userdata.jTreePeer = tree_h; + userdata.vsplitPane = vsplitPane; + userdata.hsplitPane = hsplitPane; + userdata.classNameLabel = classNameLabel; + userdata.inspectorPane = inspectorPane; + userdata.callbacksTable = callbacksTable; + userdata.jideTableUtils = jideTableUtils; + try + userdata.cbHideStdCbs = jcb; + catch + userdata.cbHideStdCbs = []; + end + + % Update userdata for use in callbacks + try + set(tree_h,'userdata',userdata); + catch + setappdata(handle(tree_h),'userdata',userdata); + end + try + set(callbacksTable,'userdata',userdata); + catch + setappdata(callbacksTable,'userdata',userdata); + end + set(hTreeFig,'userdata',userdata); + + % Select the root node if requested + % Note: we must do so here since all other nodes except the root are processed by expandNode + if any(selectedIdx==1) + tree_h.setSelectedNode(root); + end + + % Set the initial cbHideStdCbs state + try + if jcb.isSelected + drawnow; + evd.getSource.isSelected = jcb.isSelected; + cbHideStdCbs_Callback(jcb,evd,callbacksTable); + end + catch + % never mind... + end + + % Set the callback functions + set(tree_hh, 'NodeExpandedCallback', {@nodeExpanded, tree_h}); + set(tree_hh, 'NodeSelectedCallback', {@nodeSelected, tree_h}); + + % Set the tree mouse-click callback + % Note: default actions (expand/collapse) will still be performed? + % Note: MousePressedCallback is better than MouseClickedCallback + % since it fires immediately when mouse button is pressed, + % without waiting for its release, as MouseClickedCallback does + handleTree = tree_h.getScrollPane; + jTreeObj = handleTree.getViewport.getComponent(0); + jTreeObjh = handle(jTreeObj,'CallbackProperties'); + set(jTreeObjh, 'MousePressedCallback', {@treeMousePressedCallback,tree_h}); % context (right-click) menu + set(jTreeObjh, 'MouseMovedCallback', @treeMouseMovedCallback); % mouse hover tooltips + + % Update userdata + userdata.inInit = false; + try + set(tree_h,'userdata',userdata); + catch + setappdata(handle(tree_h),'userdata',userdata); + end + set(hTreeFig,'userdata',userdata); + + % Pre-expand all rows + %treePane.setVisible(false); + expandNode(progressBar, jTreeObj, tree_h, root, 0); + %treePane.setVisible(true); + %jTreeObj.setVisible(1); + + % Hide the progressbar now that we've finished expanding all rows + try + hsplitPane.getLeftComponent.setTopComponent(treePane); + catch + % Probably not a vSplitPane on the left... + hsplitPane.setLeftComponent(treePane); + end + hsplitPane.setDividerLocation(hsplitPaneLocation); % need to do it again... + + % Set keyboard focus on the tree + jTreeObj.requestFocus; + drawnow; + + % Check for a newer version (only in non-deployed mode, and only twice a day) + if ~isdeployed && now-lastVersionCheck > 0.5 + checkVersion(); + lastVersionCheck = now; + end + + % Reset the last error + lasterr(''); %#ok + end + + %% Rresize image pane + function resizeImg(varargin) %#ok - unused (TODO: waiting for img placement fix...) + try + hPanel = varargin{1}; + hAx = varargin{3}; + lowerPanel = get(hPanel,'UserData'); + newJPos = cell2mat(get(hPanel,{'X','Y','Width','Height'})); + newMPos = [1,get(lowerPanel,'Height'),newJPos(3:4)]; + set(hAx, 'units','pixels', 'position',newMPos, 'Visible','on'); + uistack(hAx,'top'); % no good... + set(hPanel,'Opaque','off'); % also no good... + catch + % Never mind... + dispError + end + return; + end + + %% "dbstop if error" causes inspect.m to croak due to a bug - so workaround by temporarily disabling this dbstop + function identifiers = disableDbstopError + dbStat = dbstatus; + idx = find(strcmp({dbStat.cond},'error')); + identifiers = [dbStat(idx).identifier]; + if ~isempty(idx) + dbclear if error; + msgbox('''dbstop if error'' had to be disabled due to a Matlab bug that would have caused Matlab to crash.', 'FindJObj', 'warn'); + end + end + + %% Restore any previous "dbstop if error" + function restoreDbstopError(identifiers) %#ok + for itemIdx = 1 : length(identifiers) + eval(['dbstop if error ' identifiers{itemIdx}]); + end + end + + %% Recursively expand all nodes (except toolbar/menubar) in startup + function expandNode(progressBar, tree, tree_h, parentNode, parentRow) + try + if nargin < 5 + parentPath = javax.swing.tree.TreePath(parentNode.getPath); + parentRow = tree.getRowForPath(parentPath); + end + tree.expandRow(parentRow); + progressBar.setValue(progressBar.getValue+1); + numChildren = parentNode.getChildCount; + if (numChildren == 0) + pause(0.0002); % as short as possible... + drawnow; + end + nodesToUnExpand = {'FigureMenuBar','MLMenuBar','MJToolBar','Box','uimenu','uitoolbar','ScrollBar'}; + numChildren = parentNode.getChildCount; + for childIdx = 0 : numChildren-1 + childNode = parentNode.getChildAt(childIdx); + + % Pre-select the node based upon the user's FINDJOBJ filters + try + nodedata = get(childNode, 'userdata'); + try + userdata = get(tree_h, 'userdata'); + catch + userdata = getappdata(handle(tree_h), 'userdata'); + end + %fprintf('%d - %s\n',nodedata.idx,char(nodedata.obj)) + if ~ishghandle(nodedata.obj) && ~userdata.userSelected && any(userdata.initialIdx == nodedata.idx) + pause(0.0002); % as short as possible... + drawnow; + if isempty(tree_h.getSelectedNodes) + tree_h.setSelectedNode(childNode); + else + newSelectedNodes = [tree_h.getSelectedNodes, childNode]; + tree_h.setSelectedNodes(newSelectedNodes); + end + end + catch + % never mind... + dispError + end + + % Expand child node if not leaf & not toolbar/menubar + if childNode.isLeafNode + + % This is a leaf node, so simply update the progress-bar + progressBar.setValue(progressBar.getValue+1); + + else + % Expand all non-leaves + expandNode(progressBar, tree, tree_h, childNode); + + % Re-collapse toolbar/menubar etc., and also invisible containers + % Note: if we simply did nothing, progressbar would not have been updated... + try + childHandle = getappdata(childNode,'childHandle'); %=childNode.getUserObject + visible = childHandle.isVisible; + catch + visible = 1; + end + visible = visible && isempty(findstr(get(childNode,'Name'),'color="gray"')); + %if any(strcmp(childNode.getName,nodesToUnExpand)) + %name = char(childNode.getName); + if any(cellfun(@(s)~isempty(strmatch(s,char(childNode.getName))),nodesToUnExpand)) || ~visible + childPath = javax.swing.tree.TreePath(childNode.getPath); + childRow = tree.getRowForPath(childPath); + tree.collapseRow(childRow); + end + end + end + catch + % never mind... + dispError + end + end + + %% Create utility buttons + function hButton = createJButton(nameStr, handler, toolTipText) + try + jButton = javax.swing.JButton(['
' nameStr]); + jButton.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.HAND_CURSOR)); + jButton.setToolTipText(toolTipText); + try + minSize = jButton.getMinimumSize; + catch + minSize = jButton.getMinimumSize; % for HG2 - strange indeed that this is needed! + end + jButton.setMinimumSize(java.awt.Dimension(minSize.getWidth,35)); + hButton = handle(jButton,'CallbackProperties'); + set(hButton,'ActionPerformedCallback',handler); + catch + % Never mind... + a= 1; + end + end + + %% Flash a component off/on for the specified duration + % note: starts with 'on'; if numTimes is odd then ends with 'on', otherwise with 'off' + function flashComponent(jComps,delaySecs,numTimes) + persistent redBorder redBorderPanels + try + % Handle callback data from right-click (context-menu) + if iscell(numTimes) + [jComps,delaySecs,numTimes] = deal(numTimes{:}); + end + + if isempty(redBorder) % reuse if possible + redBorder = javax.swing.border.LineBorder(java.awt.Color.red,2,0); + end + for compIdx = 1 : length(jComps) + try + oldBorder{compIdx} = jComps(compIdx).getBorder; %#ok grow + catch + oldBorder{compIdx} = []; %#ok grow + end + isSettable(compIdx) = ismethod(jComps(compIdx),'setBorder'); %#ok grow + if isSettable(compIdx) + try + % some components prevent border modification: + oldBorderFlag = jComps(compIdx).isBorderPainted; + if ~oldBorderFlag + jComps(compIdx).setBorderPainted(1); + isSettable(compIdx) = jComps(compIdx).isBorderPainted; %#ok grow + jComps(compIdx).setBorderPainted(oldBorderFlag); + end + catch + % do nothing... + end + end + if compIdx > length(redBorderPanels) + redBorderPanels{compIdx} = javax.swing.JPanel; + redBorderPanels{compIdx}.setBorder(redBorder); + redBorderPanels{compIdx}.setOpaque(0); % transparent interior, red border + end + try + redBorderPanels{compIdx}.setBounds(jComps(compIdx).getBounds); + catch + % never mind - might be an HG handle + end + end + for idx = 1 : 2*numTimes + if idx>1, pause(delaySecs); end % don't pause at start + visible = mod(idx,2); + for compIdx = 1 : length(jComps) + try + jComp = jComps(compIdx); + + % Prevent Matlab crash (java buffer overflow...) + if isa(jComp,'com.mathworks.mwswing.desk.DTSplitPane') || ... + isa(jComp,'com.mathworks.mwswing.MJSplitPane') + continue; + + % HG handles are highlighted by setting their 'Selected' property + elseif isa(jComp,'uimenu') || isa(jComp,'matlab.ui.container.Menu') + if visible + oldColor = get(jComp,'ForegroundColor'); + setappdata(jComp,'findjobj_oldColor',oldColor); + set(jComp,'ForegroundColor','red'); + else + oldColor = getappdata(jComp,'findjobj_oldColor'); + set(jComp,'ForegroundColor',oldColor); + rmappdata(jComp,'ForegroundColor'); + end + + elseif ishghandle(jComp) + if visible + set(jComp,'Selected','on'); + else + set(jComp,'Selected','off'); + end + + else %if isjava(jComp) + + jParent = jComps(compIdx).getParent; + + % Most Java components allow modifying their borders + if isSettable(compIdx) + if visible + jComp.setBorder(redBorder); + try jComp.setBorderPainted(1); catch, end %#ok + else %if ~isempty(oldBorder{compIdx}) + jComp.setBorder(oldBorder{compIdx}); + end + jComp.repaint; + + % The other Java components are highlighted by a transparent red-border + % panel that is placed on top of them in their parent's space + elseif ~isempty(jParent) + if visible + jParent.add(redBorderPanels{compIdx}); + jParent.setComponentZOrder(redBorderPanels{compIdx},0); + else + jParent.remove(redBorderPanels{compIdx}); + end + jParent.repaint + end + end + catch + % never mind - try the next component (if any) + end + end + drawnow; + end + catch + % never mind... + dispError; + end + return; % debug point + end % flashComponent + + %% Select tree node + function nodeSelected(src, evd, tree) %#ok + try + if iscell(tree) + [src,node] = deal(tree{:}); + else + node = evd.getCurrentNode; + end + %nodeHandle = node.getUserObject; + nodedata = get(node,'userdata'); + nodeHandle = nodedata.obj; + try + userdata = get(src,'userdata'); + catch + try + userdata = getappdata(java(src),'userdata'); + catch + userdata = getappdata(src,'userdata'); + end + if isempty(userdata) + try userdata = get(java(src),'userdata'); catch, end + end + end + if ~isempty(nodeHandle) && ~isempty(userdata) + numSelections = userdata.jTree.getSelectionCount; + selectionPaths = userdata.jTree.getSelectionPaths; + if (numSelections == 1) + % Indicate that the user has modified the initial selection (except if this was an initial auto-selected node) + if ~userdata.inInit + userdata.userSelected = true; + try + set(src,'userdata',userdata); + catch + try + setappdata(java(src),'userdata',userdata); + catch + setappdata(src,'userdata',userdata); + end + end + end + + % Update the fully-qualified class name label + numInitialIdx = length(userdata.initialIdx); + thisHandle = nodeHandle; + try + if ~ishghandle(thisHandle) + thisHandle = java(nodeHandle); + end + catch + % never mind... + end + if ~userdata.inInit || (numInitialIdx == 1) + userdata.classNameLabel.setText([' ' char(class(thisHandle))]); + else + userdata.classNameLabel.setText([' ' num2str(numInitialIdx) 'x handles (some handles hidden by unexpanded tree nodes)']); + end + if ishghandle(thisHandle) + userdata.classNameLabel.setText(userdata.classNameLabel.getText.concat(' (HG handle)')); + end + userdata.inspectorPane.dispose; % remove props listeners - doesn't work... + updateNodeTooltip(nodeHandle, userdata.classNameLabel); + + % Update the data properties inspector pane + % Note: we can't simply use the evd nodeHandle, because this node might have been DE-selected with only one other node left selected... + %nodeHandle = selectionPaths(1).getLastPathComponent.getUserObject; + nodedata = get(selectionPaths(1).getLastPathComponent,'userdata'); + nodeHandle = nodedata.obj; + %identifiers = disableDbstopError; % "dbstop if error" causes inspect.m to croak due to a bug - so workaround + userdata.inspectorPane.setObject(thisHandle); + + % Update the callbacks table + try + stripStdCbsFlag = getappdata(userdata.callbacksTable,'hideStdCbs'); + [cbData, cbHeaders, cbTableEnabled] = getCbsData(nodeHandle, stripStdCbsFlag); %#ok cbTableEnabled unused + try + % Use JideTable if available on this system + list = getTreeData(cbData); %#ok + callbacksTableModel = eval('com.jidesoft.grid.PropertyTableModel(list);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + % Expand if only one category + if length(callbacksTableModel.getCategories)==1 + callbacksTableModel.expandFirstLevel; + end + catch + callbacksTableModel = javax.swing.table.DefaultTableModel(cbData,cbHeaders); + end + set(handle(callbacksTableModel,'CallbackProperties'), 'TableChangedCallback',{@tbCallbacksChanged,nodeHandle,userdata.callbacksTable}); + %set(callbacksTableModel, 'UserData',nodeHandle); + userdata.callbacksTable.setModel(callbacksTableModel) + userdata.callbacksTable.setRowAutoResizes(true); + userdata.jideTableUtils.autoResizeAllColumns(userdata.callbacksTable); + catch + % never mind... + %dispError + end + pause(0.005); + drawnow; + %restoreDbstopError(identifiers); + + % Highlight the selected object (if visible) + flashComponent(nodeHandle,0.2,3); + + elseif (numSelections > 1) % Multiple selections + + % Get the list of all selected nodes + jArray = javaArray('java.lang.Object', numSelections); + toolTipStr = ''; + sameClassFlag = true; + for idx = 1 : numSelections + %jArray(idx) = selectionPaths(idx).getLastPathComponent.getUserObject; + nodedata = get(selectionPaths(idx).getLastPathComponent,'userdata'); + try + if ishghandle(nodedata.obj) + if idx==1 + jArray = nodedata.obj; + else + jArray(idx) = nodedata.obj; + end + else + jArray(idx) = java(nodedata.obj); + end + catch + jArray(idx) = nodedata.obj; + end + toolTipStr = [toolTipStr ' ' class(jArray(idx)) ' ']; %#ok grow + if (idx < numSelections), toolTipStr = [toolTipStr '
']; end %#ok grow + try + if (idx > 1) && sameClassFlag && ~isequal(jArray(idx).getClass,jArray(1).getClass) + sameClassFlag = false; + end + catch + if (idx > 1) && sameClassFlag && ~isequal(class(jArray(idx)),class(jArray(1))) + sameClassFlag = false; + end + end + end + toolTipStr = [toolTipStr '']; + + % Update the fully-qualified class name label + if sameClassFlag + classNameStr = class(jArray(1)); + else + classNameStr = 'handle'; + end + if all(ishghandle(jArray)) + if strcmp(classNameStr,'handle') + classNameStr = 'HG handles'; + else + classNameStr = [classNameStr ' (HG handles)']; + end + end + classNameStr = [' ' num2str(numSelections) 'x ' classNameStr]; + userdata.classNameLabel.setText(classNameStr); + userdata.classNameLabel.setToolTipText(toolTipStr); + + % Update the data properties inspector pane + %identifiers = disableDbstopError; % "dbstop if error" causes inspect.m to croak due to a bug - so workaround + if isjava(jArray) + jjArray = jArray; + else + jjArray = javaArray('java.lang.Object', numSelections); + for idx = 1 : numSelections + jjArray(idx) = java(jArray(idx)); + end + end + userdata.inspectorPane.getRegistry.setSelected(jjArray, true); + + % Update the callbacks table + try + % Get intersecting callback names & values + stripStdCbsFlag = getappdata(userdata.callbacksTable,'hideStdCbs'); + [cbData, cbHeaders, cbTableEnabled] = getCbsData(jArray(1), stripStdCbsFlag); %#ok cbHeaders & cbTableEnabled unused + if ~isempty(cbData) + cbNames = cbData(:,1); + for idx = 2 : length(jArray) + [cbData2, cbHeaders2] = getCbsData(jArray(idx), stripStdCbsFlag); %#ok cbHeaders2 unused + if ~isempty(cbData2) + newCbNames = cbData2(:,1); + [cbNames, cbIdx, cb2Idx] = intersect(cbNames,newCbNames); %#ok cb2Idx unused + cbData = cbData(cbIdx,:); + for cbIdx = 1 : length(cbNames) + newIdx = find(strcmp(cbNames{cbIdx},newCbNames)); + if ~isequal(cbData2,cbData) && ~isequal(cbData2{newIdx,2}, cbData{cbIdx,2}) + cbData{cbIdx,2} = ''; + end + end + else + cbData = cbData([],:); %=empty cell array + end + if isempty(cbData) + break; + end + end + end + cbHeaders = {'Callback name','Callback value'}; + try + % Use JideTable if available on this system + list = getTreeData(cbData); %#ok + callbacksTableModel = eval('com.jidesoft.grid.PropertyTableModel(list);'); %#ok prevent JIDE alert by run-time (not load-time) evaluation + + % Expand if only one category + if length(callbacksTableModel.getCategories)==1 + callbacksTableModel.expandFirstLevel; + end + catch + callbacksTableModel = javax.swing.table.DefaultTableModel(cbData,cbHeaders); + end + set(handle(callbacksTableModel,'CallbackProperties'), 'TableChangedCallback',{@tbCallbacksChanged,jArray,userdata.callbacksTable}); + %set(callbacksTableModel, 'UserData',jArray); + userdata.callbacksTable.setModel(callbacksTableModel) + userdata.callbacksTable.setRowAutoResizes(true); + userdata.jideTableUtils.autoResizeAllColumns(userdata.callbacksTable); + catch + % never mind... + dispError + end + + pause(0.005); + drawnow; + %restoreDbstopError(identifiers); + + % Highlight the selected objects (if visible) + flashComponent(jArray,0.2,3); + end + + % TODO: Auto-highlight selected object (?) + %nodeHandle.requestFocus; + end + catch + dispError + end + end + + %% IFF utility function for annonymous cellfun funcs + function result = iff(test,trueVal,falseVal) %#ok + try + if test + result = trueVal; + else + result = falseVal; + end + catch + result = false; + end + end + + %% Get an HTML representation of the object's properties + function dataFieldsStr = getPropsHtml(nodeHandle, dataFields) + try + % Get a text representation of the fieldnames & values + undefinedStr = ''; + hiddenStr = ''; + dataFieldsStr = ''; % just in case the following croaks... + if isempty(dataFields) + return; + end + dataFieldsStr = evalc('disp(dataFields)'); + if dataFieldsStr(end)==char(10), dataFieldsStr=dataFieldsStr(1:end-1); end + + % Strip out callbacks + dataFieldsStr = regexprep(dataFieldsStr,'^\s*\w*Callback(Data)?:[^\n]*$','','lineanchors'); + + % Strip out internal HG2 mirror properties + dataFieldsStr = regexprep(dataFieldsStr,'^\s*\w*_I:[^\n]*$','','lineanchors'); + dataFieldsStr = regexprep(dataFieldsStr,'\n\n+','\n'); + + % Sort the fieldnames + %fieldNames = fieldnames(dataFields); + try + [a,b,c,d] = regexp(dataFieldsStr,'(\w*): '); + fieldNames = strrep(d,': ',''); + catch + fieldNames = fieldnames(dataFields); + end + try + [fieldNames, sortedIdx] = sort(fieldNames); + s = strsplit(dataFieldsStr, sprintf('\n'))'; + dataFieldsStr = strjoin(s(sortedIdx), sprintf('\n')); + catch + % never mind... - ignore, leave unsorted + end + + % Convert into a Matlab handle() + %nodeHandle = handle(nodeHandle); + try + % ensure this is a Matlab handle, not a java object + nodeHandle = handle(nodeHandle, 'CallbackProperties'); + catch + try + % HG handles don't allow CallbackProperties... + nodeHandle = handle(nodeHandle); + catch + % Some Matlab class objects simply cannot be converted into a handle() + end + end + + % HTMLize tooltip data + % First, set the fields' font based on its read-write status + for fieldIdx = 1 : length(fieldNames) + thisFieldName = fieldNames{fieldIdx}; + %accessFlags = get(findprop(nodeHandle,thisFieldName),'AccessFlags'); + try + hProp = findprop(nodeHandle,thisFieldName); + accessFlags = get(hProp,'AccessFlags'); + visible = get(hProp,'Visible'); + catch + accessFlags = []; + visible = 'on'; + try if hProp.Hidden, visible='off'; end, catch, end + end + %if isfield(accessFlags,'PublicSet') && strcmp(accessFlags.PublicSet,'on') + if (~isempty(hProp) && isprop(hProp,'SetAccess') && isequal(hProp.SetAccess,'public')) || ... % isequal(...'public') and not strcmpi(...) because might be a cell array of classes + (~isempty(accessFlags) && isfield(accessFlags,'PublicSet') && strcmpi(accessFlags.PublicSet,'on')) + % Bolden read/write fields + thisFieldFormat = ['' thisFieldName ':$2']; + %elseif ~isfield(accessFlags,'PublicSet') + elseif (isempty(hProp) || ~isprop(hProp,'SetAccess')) && ... + (isempty(accessFlags) || ~isfield(accessFlags,'PublicSet')) + % Undefined - probably a Matlab-defined field of com.mathworks.hg.peer.FigureFrameProxy... + thisFieldFormat = ['' thisFieldName ':$2']; + undefinedStr = ', undefined'; + else % PublicSet=='off' + % Gray-out & italicize any read-only fields + thisFieldFormat = ['' thisFieldName ':$2']; + end + if strcmpi(visible,'off') + %thisFieldFormat = ['' thisFieldFormat '']; %#ok + thisFieldFormat = regexprep(thisFieldFormat, {'(.*):(.*)','<.?b>'}, {'$1:$2',''}); %'(.*):(.*)', '$1:$2'); + hiddenStr = ', hidden'; + end + dataFieldsStr = regexprep(dataFieldsStr, ['([\s\n])' thisFieldName ':([^\n]*)'], ['$1' thisFieldFormat]); + end + catch + % never mind... - probably an ambiguous property name + %dispError + end + + % Method 1: simple
list + %dataFieldsStr = strrep(dataFieldsStr,char(10),' 
  '); + + % Method 2: 2-column + dataFieldsStr = regexprep(dataFieldsStr, '^\s*([^:]+:)([^\n]*)\n^\s*([^:]+:)([^\n]*)$', '', 'lineanchors'); + dataFieldsStr = regexprep(dataFieldsStr, '^[^<]\s*([^:]+:)([^\n]*)$', '', 'lineanchors'); + dataFieldsStr = ['(documented' undefinedStr hiddenStr ' & read-only fields)

  

 $1 $2    $3 $4 
 $1 $2  
' dataFieldsStr '
']; + end + + %% Update tooltip string with a node's data + function updateNodeTooltip(nodeHandle, uiObject) + try + toolTipStr = class(nodeHandle); + dataFieldsStr = ''; + + % Add HG annotation if relevant + if ishghandle(nodeHandle) + hgStr = ' HG Handle'; + else + hgStr = ''; + end + + % Prevent HG-Java warnings + oldWarn = warning('off','MATLAB:hg:JavaSetHGProperty'); + warning('off','MATLAB:hg:PossibleDeprecatedJavaSetHGProperty'); + warning('off','MATLAB:hg:Root'); + + % Note: don't bulk-get because (1) not all properties are returned & (2) some properties cause a Java exception + % Note2: the classhandle approach does not enable access to user-defined schema.props + ch = classhandle(handle(nodeHandle)); + dataFields = []; + [sortedNames, sortedIdx] = sort(get(ch.Properties,'Name')); + for idx = 1 : length(sortedIdx) + sp = ch.Properties(sortedIdx(idx)); + % TODO: some fields (see EOL comment below) generate a Java Exception from: com.mathworks.mlwidgets.inspector.PropertyRootNode$PropertyListener$1$1.run + if strcmp(sp.AccessFlags.PublicGet,'on') % && ~any(strcmp(sp.Name,{'FixedColors','ListboxTop','Extent'})) + try + dataFields.(sp.Name) = get(nodeHandle, sp.Name); + catch + dataFields.(sp.Name) = 'Error!'; + end + else + dataFields.(sp.Name) = '(no public getter method)'; + end + end + dataFieldsStr = getPropsHtml(nodeHandle, dataFields); + catch + % Probably a non-HG java object + try + % Note: the bulk-get approach enables access to user-defined schema-props, but not to some original classhandle Properties... + try + oldWarn3 = warning('off','MATLAB:structOnObject'); + dataFields = struct(nodeHandle); + warning(oldWarn3); + catch + dataFields = get(nodeHandle); + end + dataFieldsStr = getPropsHtml(nodeHandle, dataFields); + catch + % Probably a missing property getter implementation + try + % Inform the user - bail out on error + err = lasterror; %#ok + dataFieldsStr = ['

' strrep(err.message, char(10), '
')]; + catch + % forget it... + end + end + end + + % Restore warnings + try warning(oldWarn); catch, end + + % Set the object tooltip + if ~isempty(dataFieldsStr) + toolTipStr = [' ' char(toolTipStr) '' hgStr ': ' dataFieldsStr '']; + end + uiObject.setToolTipText(toolTipStr); + end + + %% Expand tree node + function nodeExpanded(src, evd, tree) %#ok + % tree = handle(src); + % evdsrc = evd.getSource; + evdnode = evd.getCurrentNode; + + if ~tree.isLoaded(evdnode) + + % Get the list of children TreeNodes + childnodes = getChildrenNodes(tree, evdnode); + + % Add the HG sub-tree (unless already included in the first tree) + childHandle = getappdata(evdnode.handle,'childHandle'); %=evdnode.getUserObject + if evdnode.isRoot && ~isempty(hg_handles) && ~isequal(hg_handles(1).java, childHandle) + childnodes = [childnodes, getChildrenNodes(tree, evdnode, true)]; + end + + % If we have a single child handle, wrap it within a javaArray for tree.add() to "swallow" + if (length(childnodes) == 1) + chnodes = childnodes; + childnodes = javaArray('com.mathworks.hg.peer.UITreeNode', 1); + childnodes(1) = java(chnodes); + end + + % Add child nodes to the current node + tree.add(evdnode, childnodes); + tree.setLoaded(evdnode, true); + end + end + + %% Get an icon image no larger than 16x16 pixels + function iconImage = setIconSize(iconImage) + try + iconWidth = iconImage.getWidth; + iconHeight = iconImage.getHeight; + if iconWidth > 16 + newHeight = fix(iconHeight * 16 / iconWidth); + iconImage = iconImage.getScaledInstance(16,newHeight,iconImage.SCALE_SMOOTH); + elseif iconHeight > 16 + newWidth = fix(iconWidth * 16 / iconHeight); + iconImage = iconImage.getScaledInstance(newWidth,16,iconImage.SCALE_SMOOTH); + end + catch + % never mind... - return original icon + end + end % setIconSize + + %% Get list of children nodes + function nodes = getChildrenNodes(tree, parentNode, isRootHGNode) + try + iconpath = [matlabroot, '/toolbox/matlab/icons/']; + nodes = handle([]); + try + userdata = get(tree,'userdata'); + catch + userdata = getappdata(handle(tree),'userdata'); + end + hdls = userdata.handles; + nodedata = get(parentNode,'userdata'); + if nargin < 3 + %isJavaNode = ~ishghandle(parentNode.getUserObject); + isJavaNode = ~ishghandle(nodedata.obj); + isRootHGNode = false; + else + isJavaNode = ~isRootHGNode; + end + + % Search for this parent node in the list of all nodes + parents = userdata.parents; + nodeIdx = nodedata.idx; + + if isJavaNode && isempty(nodeIdx) % Failback, in case userdata doesn't work for some reason... + for hIdx = 1 : length(hdls) + %if isequal(handle(parentNode.getUserObject), hdls(hIdx)) + if isequal(handle(nodedata.obj), hdls(hIdx)) + nodeIdx = hIdx; + break; + end + end + end + if ~isJavaNode + if isRootHGNode % =root HG node + thisChildHandle = userdata.hg_handles(1); + childName = getNodeName(thisChildHandle); + hasGrandChildren = any(parents==1); + icon = []; + if hasGrandChildren && length(hg_handles)>1 + childName = childName.concat(' - HG root container'); + icon = [iconpath 'figureicon.gif']; + end + try + nodes = uitreenode('v0', thisChildHandle, childName, icon, ~hasGrandChildren); + catch % old matlab version don't have the 'v0' option + try + nodes = uitreenode(thisChildHandle, childName, icon, ~hasGrandChildren); + catch + % probably an invalid handle - ignore... + end + end + + % Add the handler to the node's internal data + % Note: could also use 'userdata', but setUserObject() is recommended for TreeNodes + % Note2: however, setUserObject() sets a java *BeenAdapter object for HG handles instead of the required original class, so use setappdata + %nodes.setUserObject(thisChildHandle); + setappdata(nodes,'childHandle',thisChildHandle); + nodedata.idx = 1; + nodedata.obj = thisChildHandle; + set(nodes,'userdata',nodedata); + return; + else % non-root HG node + parents = userdata.hg_parents; + hdls = userdata.hg_handles; + end % if isRootHGNode + end % if ~isJavaNode + + % If this node was found, get the list of its children + if ~isempty(nodeIdx) + %childIdx = setdiff(find(parents==nodeIdx),nodeIdx); + childIdx = find(parents==nodeIdx); + childIdx(childIdx==nodeIdx) = []; % faster... + numChildren = length(childIdx); + for cIdx = 1 : numChildren + thisChildIdx = childIdx(cIdx); + try thisChildHandle = hdls(thisChildIdx); catch, continue, end + childName = getNodeName(thisChildHandle); + try + visible = thisChildHandle.Visible; + if visible + try visible = thisChildHandle.Width > 0; catch, end %#ok + end + if ~visible + childName = ['' char(childName) '']; %#ok grow + end + catch + % never mind... + end + hasGrandChildren = any(parents==thisChildIdx); + try + isaLabel = isa(thisChildHandle.java,'javax.swing.JLabel'); + catch + isaLabel = 0; + end + if hasGrandChildren && ~any(strcmp(class(thisChildHandle),{'axes'})) + icon = [iconpath 'foldericon.gif']; + elseif isaLabel + icon = [iconpath 'tool_text.gif']; + else + icon = []; + end + try + nodes(cIdx) = uitreenode('v0', thisChildHandle, childName, icon, ~hasGrandChildren); + catch % old matlab version don't have the 'v0' option + try + nodes(cIdx) = uitreenode(thisChildHandle, childName, icon, ~hasGrandChildren); + catch + % probably an invalid handle - ignore... + end + end + + % Use existing object icon, if available + try + setTreeNodeIcon(nodes(cIdx),thisChildHandle); + catch + % probably an invalid handle - ignore... + end + + % Pre-select the node based upon the user's FINDJOBJ filters + try + if isJavaNode && ~userdata.userSelected && any(userdata.initialIdx == thisChildIdx) + pause(0.0002); % as short as possible... + drawnow; + if isempty(tree.getSelectedNodes) + tree.setSelectedNode(nodes(cIdx)); + else + newSelectedNodes = [tree.getSelectedNodes, nodes(cIdx).java]; + tree.setSelectedNodes(newSelectedNodes); + end + end + catch + % never mind... + end + + % Add the handler to the node's internal data + % Note: could also use 'userdata', but setUserObject() is recommended for TreeNodes + % Note2: however, setUserObject() sets a java *BeenAdapter object for HG handles instead of the required original class, so use setappdata + % Note3: the following will error if invalid handle - ignore + try + if isJavaNode + thisChildHandle = thisChildHandle.java; + end + %nodes(cIdx).setUserObject(thisChildHandle); + setappdata(nodes(cIdx),'childHandle',thisChildHandle); + nodedata.idx = thisChildIdx; + nodedata.obj = thisChildHandle; + set(nodes(cIdx),'userdata',nodedata); + catch + % never mind (probably an invalid handle) - leave unchanged (like a leaf) + end + end + end + catch + % Never mind - leave unchanged (like a leaf) + %error('YMA:findjobj:UnknownNodeType', 'Error expanding component tree node'); + dispError + end + end + + %% Get a node's name + function [nodeName, nodeTitle] = getNodeName(hndl,charsLimit) + try + % Initialize (just in case one of the succeding lines croaks) + nodeName = ''; + nodeTitle = ''; + if ~ismethod(hndl,'getClass') + try + nodeName = class(hndl); + catch + nodeName = hndl.type; % last-ditch try... + end + else + nodeName = hndl.getClass.getSimpleName; + end + + % Strip away the package name, leaving only the regular classname + if ~isempty(nodeName) && ischar(nodeName) + nodeName = java.lang.String(nodeName); + nodeName = nodeName.substring(nodeName.lastIndexOf('.')+1); + end + if (nodeName.length == 0) + % fix case of anonymous internal classes, that do not have SimpleNames + try + nodeName = hndl.getClass.getName; + nodeName = nodeName.substring(nodeName.lastIndexOf('.')+1); + catch + % never mind - leave unchanged... + end + end + + % Get any unique identifying string (if available in one of several fields) + labelsToCheck = {'label','title','text','string','displayname','toolTipText','TooltipString','actionCommand','name','Tag','style'}; %,'UIClassID'}; + nodeTitle = ''; + strField = ''; %#ok - used for debugging + while ((~isa(nodeTitle,'java.lang.String') && ~ischar(nodeTitle)) || isempty(nodeTitle)) && ~isempty(labelsToCheck) + try + nodeTitle = get(hndl,labelsToCheck{1}); + strField = labelsToCheck{1}; %#ok - used for debugging + catch + % never mind - probably missing prop, so skip to next one + end + labelsToCheck(1) = []; + end + if length(nodeTitle) ~= numel(nodeTitle) + % Multi-line - convert to a long single line + nodeTitle = nodeTitle'; + nodeTitle = nodeTitle(:)'; + end + if isempty(char(nodeTitle)) + % No title - check whether this is an HG label whose text is gettable + try + location = hndl.getLocationOnScreen; + pos = [location.getX, location.getY, hndl.getWidth, hndl.getHeight]; + %dist = sum((labelPositions-repmat(pos,size(labelPositions,1),[1,1,1,1])).^2, 2); + dist = sum((labelPositions-repmat(pos,[size(labelPositions,1),1])).^2, 2); + [minVal,minIdx] = min(dist); + % Allow max distance of 8 = 2^2+2^2 (i.e. X&Y off by up to 2 pixels, W&H exact) + if minVal <= 8 % 8=2^2+2^2 + nodeTitle = get(hg_labels(minIdx),'string'); + % Preserve the label handles & position for the tooltip & context-menu + %hg_labels(minIdx) = []; + %labelPositions(minIdx,:) = []; + end + catch + % never mind... + end + end + if nargin<2, charsLimit = 25; end + extraStr = regexprep(nodeTitle,{sprintf('(.{%d,%d}).*',charsLimit,min(charsLimit,length(nodeTitle)-1)),' +'},{'$1...',' '},'once'); + if ~isempty(extraStr) + if ischar(extraStr) + nodeName = nodeName.concat(' (''').concat(extraStr).concat(''')'); + else + nodeName = nodeName.concat(' (').concat(num2str(extraStr)).concat(')'); + end + %nodeName = nodeName.concat(strField); + end + catch + % Never mind - use whatever we have so far + %dispError + end + end + + %% Strip standard Swing callbacks from a list of events + function evNames = stripStdCbs(evNames) + try + stdEvents = {'AncestorAdded', 'AncestorMoved', 'AncestorRemoved', 'AncestorResized', ... + 'ComponentAdded', 'ComponentRemoved', 'ComponentHidden', ... + 'ComponentMoved', 'ComponentResized', 'ComponentShown', ... + 'FocusGained', 'FocusLost', 'HierarchyChanged', ... + 'KeyPressed', 'KeyReleased', 'KeyTyped', ... + 'MouseClicked', 'MouseDragged', 'MouseEntered', 'MouseExited', ... + 'MouseMoved', 'MousePressed', 'MouseReleased', 'MouseWheelMoved', ... + 'PropertyChange', 'VetoableChange', ... + 'CaretPositionChanged', 'InputMethodTextChanged', ... + 'ButtonDown', 'Create', 'Delete'}; + stdEvents = [stdEvents, strcat(stdEvents,'Callback'), strcat(stdEvents,'Fcn')]; + evNames = setdiff(evNames,stdEvents)'; + catch + % Never mind... + dispError + end + end + + %% Callback function for checkbox + function cbHideStdCbs_Callback(src, evd, callbacksTable, varargin) %#ok + try + % Store the current checkbox value for later use + if nargin < 3 + try + callbacksTable = get(src,'userdata'); + catch + callbacksTable = getappdata(src,'userdata'); + end + end + if evd.getSource.isSelected + setappdata(callbacksTable,'hideStdCbs',1); + else + setappdata(callbacksTable,'hideStdCbs',[]); + end + + % Rescan the current node + try + userdata = get(callbacksTable,'userdata'); + catch + userdata = getappdata(callbacksTable,'userdata'); + end + nodepath = userdata.jTree.getSelectionModel.getSelectionPath; + try + ed.getCurrentNode = nodepath.getLastPathComponent; + nodeSelected(handle(userdata.jTreePeer),ed,[]); + catch + % ignore - probably no node selected + end + catch + % Never mind... + dispError + end + end + + %% Callback function for button + function btWebsite_Callback(src, evd, varargin) %#ok + try + web('http://UndocumentedMatlab.com','-browser'); + catch + % Never mind... + dispError + end + end + + %% Callback function for button + function btRefresh_Callback(src, evd, varargin) %#ok + try + % Set cursor shape to hourglass until we're done + hTreeFig = varargin{2}; + set(hTreeFig,'Pointer','watch'); + drawnow; + object = varargin{1}; + + % Re-invoke this utility to re-scan the container for all children + findjobj(object); + catch + % Never mind... + end + + % Restore default cursor shape + set(hTreeFig,'Pointer','arrow'); + end + + %% Callback function for button + function btExport_Callback(src, evd, varargin) %#ok + try + % Get the list of all selected nodes + if length(varargin) > 1 + jTree = varargin{1}; + numSelections = jTree.getSelectionCount; + selectionPaths = jTree.getSelectionPaths; + hdls = handle([]); + for idx = 1 : numSelections + %hdls(idx) = handle(selectionPaths(idx).getLastPathComponent.getUserObject); + nodedata = get(selectionPaths(idx).getLastPathComponent,'userdata'); + try + hdls(idx) = handle(nodedata.obj,'CallbackProperties'); + catch + if idx==1 % probably due to HG2: can't convert object to handle([]) + hdls = nodedata.obj; + else + hdls(idx) = nodedata.obj; + end + end + end + + % Assign the handles in the base workspace & inform user + assignin('base','findjobj_hdls',hdls); + classNameLabel = varargin{2}; + msg = ['Exported ' char(classNameLabel.getText.trim) ' to base workspace variable findjobj_hdls']; + else + % Right-click (context-menu) callback + data = varargin{1}; + obj = data{1}; + varName = data{2}; + if isempty(varName) + varName = inputdlg('Enter workspace variable name','FindJObj'); + if isempty(varName), return; end % bail out on + varName = varName{1}; + if isempty(varName) || ~ischar(varName), return; end % bail out on empty/null + varName = genvarname(varName); + end + assignin('base',varName,handle(obj,'CallbackProperties')); + msg = ['Exported object to base workspace variable ' varName]; + end + msgbox(msg,'FindJObj','help'); + catch + % Never mind... + dispError + end + end + + %% Callback function for button + function btFocus_Callback(src, evd, varargin) %#ok + try + % Request focus for the specified object + object = getTopSelectedObject(varargin{:}); + object.requestFocus; + catch + try + object = object.java.getPeer.requestFocus; + object.requestFocus; + catch + % Never mind... + %dispError + end + end + end + + %% Callback function for button + function btInspect_Callback(src, evd, varargin) %#ok + try + % Inspect the specified object + if length(varargin) == 1 + object = varargin{1}; + else + object = getTopSelectedObject(varargin{:}); + end + if isempty(which('uiinspect')) + + % If the user has not indicated NOT to be informed about UIInspect + if ~ispref('FindJObj','dontCheckUIInspect') + + % Ask the user whether to download UIINSPECT (YES, no, no & don't ask again) + answer = questdlg({'The object inspector requires UIINSPECT from the MathWorks File Exchange. UIINSPECT was created by Yair Altman, like this FindJObj utility.','','Download & install UIINSPECT?'},'UIInspect','Yes','No','No & never ask again','Yes'); + switch answer + case 'Yes' % => Yes: download & install + try + % Download UIINSPECT + baseUrl = 'http://www.mathworks.com/matlabcentral/fileexchange/17935'; + fileUrl = [baseUrl '?controller=file_infos&download=true']; + %file = urlread(fileUrl); + %file = regexprep(file,[char(13),char(10)],'\n'); %convert to OS-dependent EOL + + % Install... + %newPath = fullfile(fileparts(which(mfilename)),'uiinspect.m'); + %fid = fopen(newPath,'wt'); + %fprintf(fid,'%s',file); + %fclose(fid); + [fpath,fname,fext] = fileparts(which(mfilename)); + zipFileName = fullfile(fpath,'uiinspect.zip'); + urlwrite(fileUrl,zipFileName); + unzip(zipFileName,fpath); + rehash; + catch + % Error downloading: inform the user + msgbox(['Error in downloading: ' lasterr], 'UIInspect', 'warn'); %#ok + web(baseUrl); + end + + % ...and now run it... + %pause(0.1); + drawnow; + dummy = which('uiinspect'); %#ok used only to load into memory + uiinspect(object); + return; + + case 'No & never ask again' % => No & don't ask again + setpref('FindJObj','dontCheckUIInspect',1); + + otherwise + % forget it... + end + end + drawnow; + + % No UIINSPECT available - run the good-ol' METHODSVIEW()... + methodsview(object); + else + uiinspect(object); + end + catch + try + if isjava(object) + methodsview(object) + else + methodsview(object.java); + end + catch + % Never mind... + dispError + end + end + end + + %% Callback function for button + function btCheckFex_Callback(src, evd, varargin) %#ok + try + % Check the FileExchange for the latest version + web('http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=14317'); + catch + % Never mind... + dispError + end + end + + %% Check for existence of a newer version + function checkVersion() + try + % If the user has not indicated NOT to be informed + if ~ispref('FindJObj','dontCheckNewerVersion') + + % Get the latest version date from the File Exchange webpage + baseUrl = 'http://www.mathworks.com/matlabcentral/fileexchange/'; + webUrl = [baseUrl '14317']; % 'loadFile.do?objectId=14317']; + webPage = urlread(webUrl); + modIdx = strfind(webPage,'>Updates<'); + if ~isempty(modIdx) + webPage = webPage(modIdx:end); + % Note: regexp hangs if substr not found, so use strfind instead... + %latestWebVersion = regexprep(webPage,'.*?>(20[\d-]+).*','$1'); + dateIdx = strfind(webPage,'class="date">'); + if ~isempty(dateIdx) + latestDate = webPage(dateIdx(end)+13 : dateIdx(end)+23); + try + startIdx = dateIdx(end)+27; + descStartIdx = startIdx + strfind(webPage(startIdx:startIdx+999),''); + descEndIdx = startIdx + strfind(webPage(startIdx:startIdx+999),''); + descStr = webPage(descStartIdx(1)+3 : descEndIdx(1)-2); + descStr = regexprep(descStr,'',''); + catch + descStr = ''; + end + + % Get this file's latest date + thisFileName = which(mfilename); %#ok + try + thisFileData = dir(thisFileName); + try + thisFileDatenum = thisFileData.datenum; + catch % old ML versions... + thisFileDatenum = datenum(thisFileData.date); + end + catch + thisFileText = evalc('type(thisFileName)'); + thisFileLatestDate = regexprep(thisFileText,'.*Change log:[\s%]+([\d-]+).*','$1'); + thisFileDatenum = datenum(thisFileLatestDate,'yyyy-mm-dd'); + end + + % If there's a newer version on the File Exchange webpage (allow 2 days grace period) + if (thisFileDatenum < datenum(latestDate,'dd mmm yyyy')-2) + + % Ask the user whether to download the newer version (YES, no, no & don't ask again) + msg = {['A newer version (' latestDate ') of FindJObj is available on the MathWorks File Exchange:'], '', ... + ['\color{blue}' descStr '\color{black}'], '', ... + 'Download & install the new version?'}; + createStruct.Interpreter = 'tex'; + createStruct.Default = 'Yes'; + answer = questdlg(msg,'FindJObj','Yes','No','No & never ask again',createStruct); + switch answer + case 'Yes' % => Yes: download & install newer file + try + %fileUrl = [baseUrl '/download.do?objectId=14317&fn=findjobj&fe=.m']; + fileUrl = [baseUrl '/14317?controller=file_infos&download=true']; + %file = urlread(fileUrl); + %file = regexprep(file,[char(13),char(10)],'\n'); %convert to OS-dependent EOL + %fid = fopen(thisFileName,'wt'); + %fprintf(fid,'%s',file); + %fclose(fid); + [fpath,fname,fext] = fileparts(thisFileName); + zipFileName = fullfile(fpath,[fname '.zip']); + urlwrite(fileUrl,zipFileName); + unzip(zipFileName,fpath); + rehash; + catch + % Error downloading: inform the user + msgbox(['Error in downloading: ' lasterr], 'FindJObj', 'warn'); %#ok + web(webUrl); + end + case 'No & never ask again' % => No & don't ask again + setpref('FindJObj','dontCheckNewerVersion',1); + otherwise + % forget it... + end + end + end + else + % Maybe webpage not fully loaded or changed format - bail out... + end + end + catch + % Never mind... + end + end + + %% Get the first selected object (might not be the top one - depends on selection order) + function object = getTopSelectedObject(jTree, root) + try + object = []; + numSelections = jTree.getSelectionCount; + if numSelections > 0 + % Get the first object specified + %object = jTree.getSelectionPath.getLastPathComponent.getUserObject; + nodedata = get(jTree.getSelectionPath.getLastPathComponent,'userdata'); + else + % Get the root object (container) + %object = root.getUserObject; + nodedata = get(root,'userdata'); + end + object = nodedata.obj; + catch + % Never mind... + dispError + end + end + + %% Update component callback upon callbacksTable data change + function tbCallbacksChanged(src, evd, object, table) + persistent hash + try + % exit if invalid handle or already in Callback + %if ~ishandle(src) || ~isempty(getappdata(src,'inCallback')) % || length(dbstack)>1 %exit also if not called from user action + if isempty(hash), hash = java.util.Hashtable; end + if ~ishandle(src) || ~isempty(hash.get(src)) % || length(dbstack)>1 %exit also if not called from user action + return; + end + %setappdata(src,'inCallback',1); % used to prevent endless recursion % can't use getappdata(src,...) because it fails on R2010b!!! + hash.put(src,1); + + % Update the object's callback with the modified value + modifiedColIdx = evd.getColumn; + modifiedRowIdx = evd.getFirstRow; + if modifiedRowIdx>=0 %&& modifiedColIdx==1 %sanity check - should always be true + %table = evd.getSource; + %object = get(src,'userdata'); + modifiedRowIdx = table.getSelectedRow; % overcome issues with hierarchical table + cbName = strtrim(table.getValueAt(modifiedRowIdx,0)); + try + cbValue = strtrim(char(table.getValueAt(modifiedRowIdx,1))); + if ~isempty(cbValue) && ismember(cbValue(1),'{[@''') + cbValue = eval(cbValue); + end + if (~ischar(cbValue) && ~isa(cbValue, 'function_handle') && (~iscell(cbValue) || iscom(object(1)))) + revertCbTableModification(table, modifiedRowIdx, modifiedColIdx, cbName, object, ''); + else + for objIdx = 1 : length(object) + obj = object(objIdx); + if ~iscom(obj) + try + try + if isjava(obj) + obj = handle(obj,'CallbackProperties'); + end + catch + % never mind... + end + set(obj, cbName, cbValue); + catch + try + set(handle(obj,'CallbackProperties'), cbName, cbValue); + catch + % never mind - probably a callback-group header + end + end + else + cbs = obj.eventlisteners; + if ~isempty(cbs) + cbs = cbs(strcmpi(cbs(:,1),cbName),:); + obj.unregisterevent(cbs); + end + if ~isempty(cbValue) && ~strcmp(cbName,'-') + obj.registerevent({cbName, cbValue}); + end + end + end + end + catch + revertCbTableModification(table, modifiedRowIdx, modifiedColIdx, cbName, object, lasterr) %#ok + end + end + catch + % never mind... + end + %setappdata(src,'inCallback',[]); % used to prevent endless recursion % can't use setappdata(src,...) because it fails on R2010b!!! + hash.remove(src); + end + + %% Revert Callback table modification + function revertCbTableModification(table, modifiedRowIdx, modifiedColIdx, cbName, object, errMsg) %#ok + try + % Display a notification MsgBox + msg = 'Callbacks must be a ''string'', or a @function handle'; + if ~iscom(object(1)), msg = [msg ' or a {@func,args...} construct']; end + if ~isempty(errMsg), msg = {errMsg, '', msg}; end + msgbox(msg, ['Error setting ' cbName ' value'], 'warn'); + + % Revert to the current value + curValue = ''; + try + if ~iscom(object(1)) + curValue = charizeData(get(object(1),cbName)); + else + cbs = object(1).eventlisteners; + if ~isempty(cbs) + cbs = cbs(strcmpi(cbs(:,1),cbName),:); + curValue = charizeData(cbs(1,2)); + end + end + catch + % never mind... - clear the current value + end + table.setValueAt(curValue, modifiedRowIdx, modifiedColIdx); + catch + % never mind... + end + end % revertCbTableModification + + %% Get the Java positions of all HG text labels + function labelPositions = getLabelsJavaPos(container) + try + labelPositions = []; + + % Ensure we have a figure handle + try + h = hFig; %#ok unused + catch + hFig = getCurrentFigure; + end + + % Get the figure's margins from the Matlab properties + hg_labels = findall(hFig, 'Style','text'); + units = get(hFig,'units'); + set(hFig,'units','pixels'); + outerPos = get(hFig,'OuterPosition'); + innerPos = get(hFig,'Position'); + set(hFig,'units',units); + margins = abs(innerPos-outerPos); + + figX = container.getX; % =outerPos(1) + figY = container.getY; % =outerPos(2) + %figW = container.getWidth; % =outerPos(3) + figH = container.getHeight; % =outerPos(4) + + % Get the relevant screen pixel size + %monitorPositions = get(0,'MonitorPositions'); + %for monitorIdx = size(monitorPositions,1) : -1 : 1 + % screenSize = monitorPositions(monitorIdx,:); + % if (outerPos(1) >= screenSize(1)) % && (outerPos(1)+outerPos(3) <= screenSize(3)) + % break; + % end + %end + %monitorBaseY = screenSize(4) - monitorPositions(1,4); + + % Compute the labels' screen pixel position in Java units ([0,0] = top left) + for idx = 1 : length(hg_labels) + matlabPos = getpixelposition(hg_labels(idx),1); + javaX = figX + matlabPos(1) + margins(1); + javaY = figY + figH - matlabPos(2) - matlabPos(4) - margins(2); + labelPositions(idx,:) = [javaX, javaY, matlabPos(3:4)]; %#ok grow + end + catch + % never mind... + err = lasterror; %#ok debug point + end + end + + %% Traverse an HG container hierarchy and extract the HG elements within + function traverseHGContainer(hcontainer,level,parent) + try + % Record the data for this node + thisIdx = length(hg_levels) + 1; + hg_levels(thisIdx) = level; + hg_parentIdx(thisIdx) = parent; + try + hg_handles(thisIdx) = handle(hcontainer); + catch + hg_handles = handle(hcontainer); + end + parentId = length(hg_parentIdx); + + % Now recursively process all this node's children (if any) + %if ishghandle(hcontainer) + try % try-catch is faster than checking ishghandle(hcontainer)... + allChildren = allchild(handle(hcontainer)); + for childIdx = 1 : length(allChildren) + traverseHGContainer(allChildren(childIdx),level+1,parentId); + end + catch + % do nothing - probably not a container + %dispError + end + + % TODO: Add axis (plot) component handles + catch + % forget it... + end + end + + %% Debuggable "quiet" error-handling + function dispError + err = lasterror; %#ok + msg = err.message; + for idx = 1 : length(err.stack) + filename = err.stack(idx).file; + if ~isempty(regexpi(filename,mfilename)) + funcname = err.stack(idx).name; + line = num2str(err.stack(idx).line); + msg = [msg ' at ' funcname ' line #' line '']; %#ok grow + break; + end + end + disp(msg); + return; % debug point + end + + %% ML 7.0 - compatible ischar() function + function flag = ischar(data) + try + flag = builtin('ischar',data); + catch + flag = isa(data,'char'); + end + end + + %% Set up the uitree context (right-click) menu + function jmenu = setTreeContextMenu(obj,node,tree_h) + % Prepare the context menu (note the use of HTML labels) + import javax.swing.* + titleStr = getNodeTitleStr(obj,node); + titleStr = regexprep(titleStr,'


.*',''); + menuItem0 = JMenuItem(titleStr); + menuItem0.setEnabled(false); + menuItem0.setArmed(false); + %menuItem1 = JMenuItem('Export handle to findjobj_hdls'); + if isjava(obj), prefix = 'j'; else, prefix = 'h'; end %#ok + varname = strrep([prefix strtok(char(node.getName))], '$','_'); + varname = genvarname(varname); + varname(2) = upper(varname(2)); % ensure lowerCamelCase + menuItem1 = JMenuItem(['Export handle to ' varname]); + menuItem2 = JMenuItem('Export handle to...'); + menuItem3 = JMenuItem('Request focus (bring to front)'); + menuItem4 = JMenuItem('Flash component borders'); + menuItem5 = JMenuItem('Display properties & callbacks'); + menuItem6 = JMenuItem('Inspect object'); + + % Set the menu items' callbacks + set(handle(menuItem1,'CallbackProperties'), 'ActionPerformedCallback', {@btExport_Callback,{obj,varname}}); + set(handle(menuItem2,'CallbackProperties'), 'ActionPerformedCallback', {@btExport_Callback,{obj,[]}}); + set(handle(menuItem3,'CallbackProperties'), 'ActionPerformedCallback', {@requestFocus,obj}); + set(handle(menuItem4,'CallbackProperties'), 'ActionPerformedCallback', {@flashComponent,{obj,0.2,3}}); + set(handle(menuItem5,'CallbackProperties'), 'ActionPerformedCallback', {@nodeSelected,{tree_h,node}}); + set(handle(menuItem6,'CallbackProperties'), 'ActionPerformedCallback', {@btInspect_Callback,obj}); + + % Add all menu items to the context menu (with internal separator) + jmenu = JPopupMenu; + jmenu.add(menuItem0); + jmenu.addSeparator; + handleValue=[]; try handleValue = double(obj); catch, end; %#ok + if ~isempty(handleValue) + % For valid HG handles only + menuItem0a = JMenuItem('Copy handle value to clipboard'); + set(handle(menuItem0a,'CallbackProperties'), 'ActionPerformedCallback', sprintf('clipboard(''copy'',%.99g)',handleValue)); + jmenu.add(menuItem0a); + end + jmenu.add(menuItem1); + jmenu.add(menuItem2); + jmenu.addSeparator; + jmenu.add(menuItem3); + jmenu.add(menuItem4); + jmenu.add(menuItem5); + jmenu.add(menuItem6); + end % setTreeContextMenu + + %% Set the mouse-press callback + function treeMousePressedCallback(hTree, eventData, tree_h) %#ok hTree is unused + if eventData.isMetaDown % right-click is like a Meta-button + % Get the clicked node + clickX = eventData.getX; + clickY = eventData.getY; + jtree = eventData.getSource; + treePath = jtree.getPathForLocation(clickX, clickY); + try + % Modify the context menu based on the clicked node + node = treePath.getLastPathComponent; + userdata = get(node,'userdata'); + obj = userdata.obj; + jmenu = setTreeContextMenu(obj,node,tree_h); + + % TODO: remember to call jmenu.remove(item) in item callback + % or use the timer hack shown here to remove the item: + % timerFcn = {@menuRemoveItem,jmenu,item}; + % start(timer('TimerFcn',timerFcn,'StartDelay',0.2)); + + % Display the (possibly-modified) context menu + jmenu.show(jtree, clickX, clickY); + jmenu.repaint; + + % This is for debugging: + userdata.tree = jtree; + setappdata(gcf,'findjobj_hgtree',userdata) + catch + % clicked location is NOT on top of any node + % Note: can also be tested by isempty(treePath) + end + end + end % treeMousePressedCallback + + %% Remove the extra context menu item after display + function menuRemoveItem(hObj,eventData,jmenu,item) %#ok unused + jmenu.remove(item); + end % menuRemoveItem + + %% Get the title for the tooltip and context (right-click) menu + function nodeTitleStr = getNodeTitleStr(obj,node) + try + % Display the full classname and object name in the tooltip + %nodeName = char(node.getName); + %nodeName = strrep(nodeName, '',''); + %nodeName = strrep(nodeName, '',''); + nodeName = char(getNodeName(obj,99)); + [objClass,objName] = strtok(nodeName); + objName = objName(3:end-1); % strip leading ( and trailing ) + if isempty(objName), objName = '(none found)'; end + nodeName = char(node.getName); + objClass = char(obj.getClass.getName); + nodeTitleStr = sprintf('Class name: %s
Text/title: %s',objClass,objName); + + % If the component is invisible, state this in the tooltip + if ~isempty(strfind(nodeName,'color="gray"')) + nodeTitleStr = [nodeTitleStr '
*** Invisible ***']; + end + nodeTitleStr = [nodeTitleStr '
Right-click for context-menu']; + catch + % Possible not a Java object - try treating as an HG handle + try + handleValueStr = sprintf('#: %.99g',double(obj)); + try + type = ''; + type = get(obj,'type'); + type(1) = upper(type(1)); + catch + if ~ishandle(obj) + type = ['Invalid ' char(node.getName) '']; + handleValueStr = '!!!
Perhaps this handle was deleted after this UIInspect tree was
already drawn. Try to refresh by selecting any valid node handle'; + end + end + nodeTitleStr = sprintf('%s handle %s',type,handleValueStr); + try + % If the component is invisible, state this in the tooltip + if strcmp(get(obj,'Visible'),'off') + nodeTitleStr = [nodeTitleStr '
Invisible']; + end + catch + % never mind... + end + catch + % never mind... - ignore + end + end + end % getNodeTitleStr + + %% Handle tree mouse movement callback - used to set the tooltip & context-menu + function treeMouseMovedCallback(hTree, eventData) + try + x = eventData.getX; + y = eventData.getY; + jtree = eventData.getSource; + treePath = jtree.getPathForLocation(x, y); + try + % Set the tooltip string based on the hovered node + node = treePath.getLastPathComponent; + userdata = get(node,'userdata'); + obj = userdata.obj; + tooltipStr = getNodeTitleStr(obj,node); + set(hTree,'ToolTipText',tooltipStr) + catch + % clicked location is NOT on top of any node + % Note: can also be tested by isempty(treePath) + end + catch + dispError; + end + return; % denug breakpoint + end % treeMouseMovedCallback + + %% Request focus for a specific object handle + function requestFocus(hTree, eventData, obj) %#ok hTree & eventData are unused + % Ensure the object handle is valid + if isjava(obj) + obj.requestFocus; + return; + elseif ~ishandle(obj) + msgbox('The selected object does not appear to be a valid handle as defined by the ishandle() function. Perhaps this object was deleted after this hierarchy tree was already drawn. Refresh this tree by selecting a valid node handle and then retry.','FindJObj','warn'); + beep; + return; + end + + try + foundFlag = 0; + while ~foundFlag + if isempty(obj), return; end % sanity check + type = get(obj,'type'); + obj = double(obj); + foundFlag = any(strcmp(type,{'figure','axes','uicontrol'})); + if ~foundFlag + obj = get(obj,'Parent'); + end + end + feval(type,obj); + catch + % never mind... + dispError; + end + end % requestFocus + +end % FINDJOBJ + +% Fast implementation +function jControl = findjobj_fast(hControl, jContainer) + try jControl = hControl.getTable; return, catch, end % fast bail-out for old uitables + try jControl = hControl.JavaFrame.getGUIDEView; return, catch, end % bail-out for HG2 matlab.ui.container.Panel + oldWarn = warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); + if nargin < 2 || isempty(jContainer) + % Use a HG2 matlab.ui.container.Panel jContainer if the control's parent is a uipanel + try + hParent = get(hControl,'Parent'); + catch + % Probably indicates an invalid/deleted/empty handle + jControl = []; + return + end + try jContainer = hParent.JavaFrame.getGUIDEView; catch, jContainer = []; end + end + if isempty(jContainer) + hFig = ancestor(hControl,'figure'); + jf = get(hFig, 'JavaFrame'); + jContainer = jf.getFigurePanelContainer.getComponent(0); + end + warning(oldWarn); + jControl = []; + counter = 20; % 2018-09-21 speedup (100 x 0.001 => 20 x 0.005) - Martin Lehmann suggestion on FEX 2016-06-07 + specialTooltipStr = '!@#$%^&*'; + try % Fix for R2018b suggested by Eddie (FEX comment 2018-09-19) + tooltipPropName = 'TooltipString'; + oldTooltip = get(hControl,tooltipPropName); + set(hControl,tooltipPropName,specialTooltipStr); + catch + tooltipPropName = 'Tooltip'; + oldTooltip = get(hControl,tooltipPropName); + set(hControl,tooltipPropName,specialTooltipStr); + end + while isempty(jControl) && counter>0 + counter = counter - 1; + pause(0.005); + jControl = findTooltipIn(jContainer, specialTooltipStr); + end + set(hControl,tooltipPropName,oldTooltip); + try jControl.setToolTipText(oldTooltip); catch, end + try jControl = jControl.getParent.getView.getParent.getParent; catch, end % return JScrollPane if exists +end +function jControl = findTooltipIn(jContainer, specialTooltipStr) + try + jControl = []; % Fix suggested by H. Koch 11/4/2017 + tooltipStr = jContainer.getToolTipText; + %if strcmp(char(tooltipStr),specialTooltipStr) + if ~isempty(tooltipStr) && tooltipStr.startsWith(specialTooltipStr) % a bit faster + jControl = jContainer; + else + for idx = 1 : jContainer.getComponentCount + jControl = findTooltipIn(jContainer.getComponent(idx-1), specialTooltipStr); + if ~isempty(jControl), return; end + end + end + catch + % ignore + end +end + +%% TODO TODO TODO +%{ +- Enh: Improve interactive-GUI performance - esp. expandNode() +- Enh: Add property listeners - same problem in MathWork's inspect.m +- Enh: Display additional properties - same problem in MathWork's inspect.m +- Enh: Add axis (plot, Graphics) component handles +- Enh: Add figure thumbnail image below the java tree (& indicate corresponding jObject when selected) +- Enh: scroll initially-selected node into view (problem because treenode has no pixel location) +- Fix: java exceptions when getting some fields (com.mathworks.mlwidgets.inspector.PropertyRootNode$PropertyListener$1$1.run) +- Fix: use EDT if available (especially in flashComponent) +%} + + diff --git a/Jin_Parnas_Example.mdl b/Jin_Parnas_Example.mdl new file mode 100644 index 0000000000000000000000000000000000000000..9b091f0f0e66b7e9f4f3141f1a05ad8be7506259 --- /dev/null +++ b/Jin_Parnas_Example.mdl @@ -0,0 +1,1688 @@ +# MathWorks OPC Text Package +Model { + Version 10.4 + Description "Simulink model saved in R2021b" +} +__MWOPC_PACKAGE_BEGIN__ R2021b +__MWOPC_PART_BEGIN__ /[Content_Types].xml + + + + + + + + + + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /_rels/.rels + + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /metadata/coreProperties.xml + + + model + 2011-01-24T17:34:29Z + colin + pesaraamarasekera + 2022-05-19T16:42:57Z + 24.0 + R2021b + + +__MWOPC_PART_BEGIN__ /metadata/mwcoreProperties.xml + + + application/vnd.mathworks.simulink.model + Simulink Model + R2021b + + +__MWOPC_PART_BEGIN__ /metadata/mwcorePropertiesExtension.xml + + + 7ddb53b8-c48f-4a73-bbf5-b511ad2448c4 + + +__MWOPC_PART_BEGIN__ /metadata/mwcorePropertiesReleaseInfo.xml + + + + 9.11.0.1873467 + R2021b + Update 3 + Feb 03 2022 + 2440358501 + + +__MWOPC_PART_BEGIN__ /simulink/_rels/blockdiagram.xml.rels + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /simulink/_rels/configSetInfo.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/bddefaults.xml + + + +

center

+

middle

+
+ + + + + + + + + +

4

+

bar

+

off

+
+ +

1

+

off

+

Port number

+

off

+

[]

+

[]

+

Inherit: auto

+

off

+

off

+

inherit

+

-1

+

Inherit

+

-1

+

auto

+

auto

+

off

+

off

+

on

+
+ +

1

+

off

+

Port number

+

off

+

[]

+

[]

+

Inherit: auto

+

off

+

off

+

inherit

+

-1

+

Inherit

+

-1

+

auto

+

auto

+

off

+

Dialog

+

held

+

[]

+

off

+

off

+

0

+

on

+
+ +

system

+

''

+

[]

+

auto

+
+ +

FromPortIcon

+

ReadWrite

+

All

+

off

+

off

+

Sample time

+

-1

+

Auto

+

Auto

+

Auto

+

void_void

+

off

+

off

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

off

+

UseLocalSettings

+

AllNumericTypes

+

UseLocalSettings

+

off

+

off

+

NONE

+

off

+

expression

+

update diagram

+

off

+

off

+

on

+

off

+

off

+

off

+

0

+

off

+

off

+
+ +
+
+ +__MWOPC_PART_BEGIN__ /simulink/bdmxdata/UserData_1.mxarray BASE64 +AAFJTQAAAAAOAAAAeAAAAAYAAAAIAAAAEQAAAAAAAAABAAAAAAAAAAEABABNQ09TAQAEAERhdGEO +AAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAA +AN0CAAAAAQAAAAEAAAABAAAABQAAAA4AAAAAMgAABgAAAAgAAAAJAAAAAAAAAAUAAAAIAAAAAQAA +ANAxAAABAAAAAAAAAAIAAADQMQAAAAFJTQAAAAAOAAAAMDEAAAYAAAAIAAAAAgAAAAAAAAAFAAAA +CAAAAAEAAAABAAAAAQAAAAAAAAAFAAQABQAAAAEAAAAFAAAATUNPUwAAAAAOAAAA6DAAAAYAAAAI +AAAAEQAAAAAAAAABAAAAAAAAAAEABABNQ09TAQAAAA0AAABGaWxlV3JhcHBlcl9fAAAADgAAAKgw +AAAGAAAACAAAAAEAAAAAAAAABQAAAAgAAABXAAAAAQAAAAEAAAAAAAAADgAAAFgJAAAGAAAACAAA +AAkAAAAAAAAABQAAAAgAAAAoCQAAAQAAAAEAAAAAAAAAAgAAACgJAAADAAAALAAAANgBAAA4AgAA +OAIAABgEAACICAAAKAkAAAAAAAAAAAAAR3JpZDAAQ2VsbHMAQ2VsbDEAY29uZF90ZXh0AGNlbGxf +aW5kZXgAcGFyZW50X2dyaWQAY2VsbHMAR3JpZABwYXJlbnRfY2VsbABzcGxpdF9wYgBudW1fY2Vs +bHMAZ3JpZF9pbmRleAByR3JpZABuZXdfY2VsbF9wYgBkZWxldGVfY2VsbF9wYgBwYl9mbGFnAENl +bGwAc3ViZ3JpZABjb25kAHdpZHRoAGhlaWdodABncmlkX3BiAGNvbG9yAGNvbmRpdGlvbl90ZXh0 +X3dpZHRoAGNvbmRpdGlvbl90ZXh0X2hlaWdodABjb25kaXRpb25fdGV4dF94AGNvbmRpdGlvbl90 +ZXh0X3kAY29uZGl0aW9uX3RleHRfb2Zmc2V0AGdyaWRfcHVzaF93aWR0aABSR3JpZABHcmlkMQBH +cmlkMgBDZWxsMgByZXN1bHRfdGV4dABSQ2VsbAByZXN1bHQAZnVuY3Rpb25fbmFtZQBmdW5jdGlv +bl9pbnB1dHMAc2V0dGluZ3MAY2hlY2tlZABvcGVuAG11bHRpX21vZGUARGF0YQBmaWcAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAB4AAAAA +AAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAABQAAAAAAAAAAAAAAAAAAAAEAAAATAAAAAwAAAAAAAAAAAAAAAAAAAAIAAAASAAAABAAA +AAAAAAAAAAAAAAAAAAMAAAAJAAAAAgAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAQAAAAAAAAAAAAAA +AAAAAAUAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAYAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAcAAAAC +AAAAAgAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAkAAAAHAAAAAgAAAAAA +AAAAAAAAAAAAAAoAAAAFAAAAAgAAAAAAAAAAAAAAAAAAAAsAAAAGAAAABAAAAAAAAAAAAAAAAAAA +AAwAAAAKAAAABAAAAAAAAAAAAAAAAAAAAA0AAAALAAAABAAAAAAAAAAAAAAAAAAAAA4AAAAMAAAA +BAAAAAAAAAAAAAAAAAAAAA8AAAANAAAABAAAAAAAAAAAAAAAAAAAABAAAAAOAAAABAAAAAAAAAAA +AAAAAAAAABEAAAAPAAAABAAAAAAAAAAAAAAAAAAAABIAAAAQAAAABAAAAAAAAAAAAAAAAAAAABMA +AAARAAAAAAAAAAAAAAAJAAAAAQAAAAEAAABKAAAAHwAAAAEAAABLAAAAIAAAAAEAAABMAAAAJQAA +AAEAAABNAAAAJgAAAAEAAABOAAAAJwAAAAEAAABPAAAAKAAAAAEAAABQAAAAKQAAAAEAAABRAAAA +KgAAAAEAAABSAAAAAwAAAAIAAAABAAAARwAAAB8AAAABAAAASAAAACAAAAABAAAASQAAAAQAAAAD +AAAAAQAAABAAAAAhAAAAAQAAACcAAAAiAAAAAQAAACgAAAAXAAAAAQAAACkAAAAAAAAABAAAAAQA +AAABAAAAAAAAAAUAAAABAAAAAQAAAAYAAAABAAAADgAAABAAAAABAAAADwAAAAAAAAAEAAAABwAA +AAEAAAAKAAAACwAAAAEAAAALAAAADAAAAAEAAAAMAAAADQAAAAEAAAANAAAAAAAAAAQAAAAEAAAA +AQAAAAIAAAAFAAAAAQAAAAMAAAAGAAAAAQAAAAQAAAAQAAAAAQAAAAUAAAAAAAAABAAAAAQAAAAB +AAAABgAAAAUAAAABAAAABwAAAAYAAAABAAAACAAAABAAAAABAAAACQAAAAAAAAAGAAAABAAAAAEA +AAARAAAABQAAAAEAAAASAAAABgAAAAEAAAAjAAAAFAAAAAEAAAAkAAAAFQAAAAEAAAAlAAAAEAAA +AAEAAAAmAAAAAAAAAAQAAAAHAAAAAQAAAB8AAAALAAAAAQAAACAAAAAMAAAAAQAAACEAAAANAAAA +AQAAACIAAAAAAAAABgAAAAQAAAABAAAAEwAAAAUAAAABAAAAFAAAAAYAAAABAAAAFQAAABQAAAAB +AAAAFgAAABUAAAABAAAAFwAAABAAAAABAAAAGAAAAAAAAAAGAAAABAAAAAEAAAAZAAAABQAAAAEA +AAAaAAAABgAAAAEAAAAbAAAAFAAAAAEAAAAcAAAAFQAAAAEAAAAdAAAAEAAAAAEAAAAeAAAAAAAA +AAQAAAADAAAAAQAAACoAAAAhAAAAAQAAACsAAAAiAAAAAQAAACwAAAAXAAAAAQAAAC0AAAAAAAAA +BAAAAAMAAAABAAAALgAAACEAAAABAAAALwAAACIAAAABAAAAMAAAABcAAAABAAAAMQAAAAAAAAAE +AAAAAwAAAAEAAAAyAAAAIQAAAAEAAAAzAAAAIgAAAAEAAAA0AAAAFwAAAAEAAAA1AAAAAAAAAAQA +AAADAAAAAQAAADYAAAAhAAAAAQAAADcAAAAiAAAAAQAAADgAAAAXAAAAAQAAADkAAAAAAAAABAAA +AAMAAAABAAAAOgAAACEAAAABAAAAOwAAACIAAAABAAAAPAAAABcAAAABAAAAPQAAAAAAAAADAAAA +AwAAAAEAAAA+AAAAIQAAAAEAAAA/AAAAIgAAAAEAAABAAAAAAwAAAAMAAAABAAAAQQAAACEAAAAB +AAAAQgAAACIAAAABAAAAQwAAAAMAAAADAAAAAQAAAEQAAAAhAAAAAQAAAEUAAAAiAAAAAQAAAEYA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAO +AAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAQAAMAeDwwAA4A +AAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAA +AAAA8D8OAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAAEAAAAAQAAAAAAAAAQAAQA +eD09MA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAI +AAAAAAAAAAAAAEAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAA +AAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAFAAAAAQAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAMAAAAAYAAAAIAAAA +BAAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAQAAMAeD4wAA4AAAA4AAAABgAAAAgAAAAG +AAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAACEAOAAAASAAAAAYA +AAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAA +AAEAAAAFAAAAAQAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAA +AAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAUAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAgAAAAB +AAAAAQAAAAAAAAAGAAAAIAAAAAAAAN0CAAAAAQAAAAMAAAAEAAAABgAAAAcAAAACAAAADgAAADgA +AAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAI +QA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAA +AAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAG +AAAAGAAAAAAAAN0CAAAAAQAAAAEAAAACAAAAAwAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUA +AAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAUAAAABAAAADgAA +ADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAA +AADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAY +AAAAAAAA3QIAAAABAAAAAQAAAAQAAAACAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgA +AAABAAAAAwAAAAEAAAAAAAAAEAADAHk8MAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAA +AAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAPA/DgAAADAAAAAGAAAACAAAAAQAAAAAAAAA +BQAAAAgAAAABAAAABAAAAAEAAAAAAAAAEAAEAHk9PTAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAABADgAAAEgAAAAGAAAACAAAAA0A +AAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACQAA +AAEAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAA +CAAAAAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAACQAAAAgAAAAAAAAAAADwPw4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEA +AAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA8D8OAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAA +AAEAAAADAAAAAQAAAAAAAAAQAAMAeT4wAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAACEAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAF +AAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAJAAAAAQAAAA4A +AAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAA +AAAA8D8OAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAA +CAAAAAAAAAAAAPA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAACQAAAAgAAAAAAAAAAADwPw4AAABQAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAACAAAAAEA +AAABAAAAAAAAAAYAAAAgAAAAAAAA3QIAAAABAAAAAwAAAAgAAAAKAAAACwAAAAIAAAAOAAAAOAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAABRA +DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAA +AAAAAAAAQA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYA +AAAYAAAAAAAA3QIAAAABAAAAAQAAAAIAAAADAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAA +AAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACQAAAAEAAAAOAAAA +OAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAA +APA/DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgA +AAAAAAAAAADwPw4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAA +AAkAAAAIAAAAAAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAA +AQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAIAAAAAgAAAA4AAAA4AAAABgAAAAgAAAAE +AAAAAAAAAAUAAAAIAAAAAQAAAAcAAAABAAAAAAAAABAAAAAHAAAAeF4yLXleMgAOAAAASAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAJAAAAGAAAAAAAAAAAAPA/AAAA +AAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAA +AAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAQAAAACAAAADgAAAEgAAAAGAAAACAAAAA0AAAAA +AAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAACgAAAAIA +AAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAQAAMAeCt5 +AA4AAABIAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAAAkAAAAYAAAA +AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAG +AAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAABgAAAAIAAAAOAAAASAAAAAYA +AAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAA +AAEAAAAIAAAAAgAAAA4AAAA4AAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAcAAAABAAAA +AAAAABAAAAAHAAAAeF4yK3leMgAOAAAASAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAAD +AAAAAQAAAAAAAAAJAAAAGAAAAAAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPw4AAABIAAAABgAAAAgA +AAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAA +AAYAAAACAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAA +BgAAABgAAAAAAADdAgAAAAEAAAABAAAACgAAAAIAAAAOAAAAOAAAAAYAAAAIAAAABAAAAAAAAAAF +AAAACAAAAAEAAAAHAAAAAQAAAAAAAAAQAAAABwAAAHheMi15XjIADgAAAEgAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAAAAAACQAAABgAAAAAAAAAAADwPwAAAAAAAPA/AAAA +AAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAA +GAAAAAAAAN0CAAAAAQAAAAEAAAAHAAAAAgAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAI +AAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAgAAAACAAAADgAAADgA +AAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAABAAAABwAAAAEAAAAAAAAAEAAAAAcAAAB4XjIteV4y +AA4AAABIAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAAAAAAAAkAAAAYAAAA +AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/DgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAG +AAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADdAgAAAAEAAAABAAAABwAAAAIAAAAOAAAASAAAAAYA +AAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAA +AAEAAAAKAAAAAgAAAA4AAAAwAAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAMAAAABAAAA +AAAAABAAAwB4K3kADgAAAEgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAwAAAAEAAAAA +AAAACQAAABgAAAAAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8OAAAASAAAAAYAAAAIAAAADQAAAAAA +AAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAEAAAAAgAA +AA4AAABIAAAABgAAAAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAA +AAAA3QIAAAABAAAAAQAAAAsAAAACAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAA +AAAAAAAAAAEAAAAAAAAAEAAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYA +AAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAGAAAAAgAAAA4AAABIAAAABgAA +AAgAAAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAA +AQAAAAsAAAACAAAADgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAA +AAAAEAAAAAAAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAA +AAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAHAAAAAgAAAA4AAABIAAAABgAAAAgAAAANAAAAAAAA +AAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAAAAsAAAACAAAA +DgAAADAAAAAGAAAACAAAAAQAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAAAAAAAO +AAAAaAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAA4AAAABAAAAAQAAAAAAAAAGAAAAOAAAAAAA +AN0CAAAAAQAAAAkAAAADAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAEAAAADgAA +AEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABgAAABgAAAAAAADd +AgAAAAEAAAABAAAABQAAAAEAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAFAAAACAAAAAYAAAAB +AAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAJAAAAAQAAAA4AAABIAAAABgAAAAgA +AAANAAAAAAAAAAUAAAAIAAAABgAAAAEAAAABAAAAAAAAAAYAAAAYAAAAAAAA3QIAAAABAAAAAQAA +AAIAAAADAAAADgAAAEgAAAAGAAAACAAAAA0AAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAA +BgAAABgAAAAAAADdAgAAAAEAAAABAAAABQAAAAEAAAAOAAAASAAAAAYAAAAIAAAADQAAAAAAAAAF +AAAACAAAAAYAAAABAAAAAQAAAAAAAAAGAAAAGAAAAAAAAN0CAAAAAQAAAAEAAAAJAAAAAQAAAA4A +AAA4AAAABgAAAAgAAAAEAAAAAAAAAAUAAAAIAAAAAQAAAAYAAAABAAAAAAAAABAAAAAGAAAAamlu +X2V4AAAOAAAAMAAAAAYAAAAIAAAABAAAAAAAAAAFAAAACAAAAAEAAAADAAAAAQAAAAAAAAAQAAMA +eCx5AA4AAACYAQAABgAAAAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAH +AAAAAQAAACMAAABzZXQAAAAAaW5wdXRzAGNvdW50AAByYW5nZQAAZXhjZXB0AAAAAAAADgAAADgA +AAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAADw +Pw4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAA +DgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAA +AAAAAECPQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkA +AAAIAAAAAAAAAAAAWUAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAA +AAAAAAAJAAAACAAAAAAAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAA +AQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAI +AAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAADgAAAEgAAAAGAAAACAAA +AAwAAAAAAAAABQAAAAgAAAAGAAAAAQAAAAEAAAAAAAAABQAAABgAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAOAAAAUA4AAAYAAAAIAAAAAQAAAAAAAAAFAAAACAAAAAYAAAABAAAAAQAAAAAAAAAO +AAAAOAAAAAYAAAAIAAAAAgAAAAAAAAAFAAAACAAAAAEAAAAAAAAAAQAAAAAAAAAFAAQAAQAAAAEA +AAAAAAAADgAAAMgCAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAE +AA8AAAABAAAAhwAAAHBhcmVudF9jZWxsAAAAAHBhcmVudF9ncmlkAAAAAGNlbGxzAAAAAAAAAAAA +AHNwbGl0X3BiAAAAAAAAAG51bV9jZWxscwAAAAAAAGdyaWRfaW5kZXgAAAAAAHJHcmlkAAAAAAAA +AAAAAG5ld19jZWxsX3BiAAAAAGRlbGV0ZV9jZWxsX3BiAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAF +AAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAAAAAOAAAAOAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAAAAADgAAADAAAAAGAAAA +CAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAI +AAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgA +AAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAAGgFAAAGAAAACAAA +AAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEABYAAAABAAAAYAEAAHN1YmdyaWQA +AAAAAAAAAAAAAAAAAABjb25kAAAAAAAAAAAAAAAAAAAAAAAAY29uZF90ZXh0AAAAAAAAAAAAAAAA +AGNlbGxfaW5kZXgAAAAAAAAAAAAAAABwYXJlbnRfZ3JpZAAAAAAAAAAAAAAAd2lkdGgAAAAAAAAA +AAAAAAAAAAAAAGhlaWdodAAAAAAAAAAAAAAAAAAAAABncmlkX3BiAAAAAAAAAAAAAAAAAAAAcGJf +ZmxhZwAAAAAAAAAAAAAAAAAAAGNvbG9yAAAAAAAAAAAAAAAAAAAAAABjb25kaXRpb25fdGV4dF93 +aWR0aAAAY29uZGl0aW9uX3RleHRfaGVpZ2h0AGNvbmRpdGlvbl90ZXh0X3gAAAAAAABjb25kaXRp +b25fdGV4dF95AAAAAAAAY29uZGl0aW9uX3RleHRfb2Zmc2V0AGdyaWRfcHVzaF93aWR0aAAAAAAA +AAAOAAAAMAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAA +AA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAA +DgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAO +AAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAA +AAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAA +AAAAAAAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAA +CAAAAAAAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAA +AAAACQAAAAgAAAAAAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAA +AAABAAAAAAAAAAkAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAA +AAEAAAAAAAAACQAAAAgAAAAAAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAA +AAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADgAAAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAB +AAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAABpQA4AAAA4AAAABgAAAAgAAAAGAAAAAAAAAAUA +AAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAATkAOAAAAOAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAAAAAAAAAAACRADgAAADgAAAAGAAAA +CAAAAAYAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAACQAAAAgAAAAAAAAAAAAkQA4AAAA4 +AAAABgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAkAAAAIAAAAAAAAAAAA +NEAOAAAAOAAAAAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAEAAAABAAAAAQAAAAAAAAAJAAAACAAA +AAAAAAAAAD5ADgAAAPgAAAAGAAAACAAAAAIAAAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAA +BQAEAAYAAAABAAAAEgAAAENlbGxzAEdyaWQxAEdyaWQyAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAG +AAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAACQAQAABgAAAAgAAAACAAAA +AAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAMAAAAAQAAADwAAABDZWxsMQAAAAAAAABD +ZWxsMgAAAAAAAAByZXN1bHQAAAAAAAByZXN1bHRfdGV4dABjb2xvcgAAAAAAAAAAAAAADgAAADAA +AAAGAAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAA +AAYAAAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAA +BgAAAAgAAAAGAAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAG +AAAACAAAAAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYA +AAAIAAAABgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAIAwAABgAA +AAgAAAACAAAAAAAAAAUAAAAIAAAAAQAAAAEAAAABAAAAAAAAAAUABAAQAAAAAQAAAKAAAABHcmlk +MAAAAAAAAAAAAAAAR3JpZDEAAAAAAAAAAAAAAEdyaWQyAAAAAAAAAAAAAABmdW5jdGlvbl9uYW1l +AAAAZnVuY3Rpb25faW5wdXRzAHNldHRpbmdzAAAAAAAAAABjaGVja2VkAAAAAAAAAAAAb3BlbgAA +AAAAAAAAAAAAAGZpZwAAAAAAAAAAAAAAAABtdWx0aV9tb2RlAAAAAAAADgAAADAAAAAGAAAACAAA +AAYAAAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAA +BgAAAAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAG +AAAAAAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYA +AAAAAAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAA +AAAAAAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAA +AAAAAAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAA +AAAABQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAMAAAAAYAAAAIAAAABgAAAAAA +AAAFAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAA4AAAAwAAAABgAAAAgAAAAGAAAAAAAA +AAUAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAADgAAADAAAAAGAAAACAAAAAYAAAAAAAAA +BQAAAAgAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAAAAAAOAAAAiAAAAAYAAAAIAAAACQAAAAAAAAAF +AAAACAAAAAEAAABYAAAAAQAAAAAAAAACAAAAWAAAAAABSU0AAAAADgAAAEgAAAAGAAAACAAAAAIA +AAAAAAAABQAAAAgAAAABAAAAAQAAAAEAAAAAAAAABQAEAAUAAAABAAAABQAAAE1DT1MAAAAADgAA +AAAAAAA +__MWOPC_PART_BEGIN__ /simulink/blockdiagram.xml + + + +

9734f98b-adbe-4c2f-88a6-663f30c5d99d

+

maci64

+ +

%<Auto>

+

%<Auto>

+

574864888

+

%<AutoIncrement:24.0>

+
+ +

none

+
+ +

normal

+ +

$bdroot

+ + $bdroot + + + + +
+
+ +

warning

+
+ + +

Ensure deterministic transfer (maximum delay)

+

Ensure data integrity only

+

Ensure deterministic transfer (minimum delay)

+

None

+
+
+ +
+
+ +__MWOPC_PART_BEGIN__ /simulink/configSet0.xml + + + +

[]

+

+ + +

[]

+

+

[]

+

0.0

+

10.0

+

auto

+

on

+

auto

+

auto

+

5

+

auto

+

10*128*eps

+

1000

+

4

+

1

+

auto

+

auto

+

1

+

1e-3

+

on

+

off

+

off

+

ode45

+

auto

+

auto

+

DisableAll

+

UseLocalSettings

+

Nonadaptive

+

TrustRegion

+

off

+

off

+

Fast

+

off

+

off

+

Unconstrained

+

Whenever possible

+

[]

+

off

+

off

+

ode3

+
+ +

[]

+

+

[]

+

1

+

[t, u]

+

xFinal

+

xInitial

+

on

+

1000

+

off

+

off

+

off

+

off

+

Array

+

ModelDataLogs

+

on

+

off

+

on

+

on

+

off

+

on

+

off

+

streamout

+

on

+

off

+

xout

+

tout

+

yout

+

logsout

+

dsmout

+

RefineOutputTimes

+

[]

+

out

+

1

+

off

+

timeseries

+

out.mat

+

[-inf, inf]

+
+ + + BooleansAsBitfields + PassReuseOutputArgsAs + PassReuseOutputArgsThreshold + ZeroExternalMemoryAtStartup + ZeroInternalMemoryAtStartup + OptimizeModelRefInitCode + NoFixptDivByZeroProtection + UseSpecifiedMinMax + EfficientTunableParamExpr + +

+

[]

+

on

+

on

+

on

+

Tunable

+

off

+

off

+

off

+

off

+

double

+

off

+

off

+

on

+

on

+

off

+

off

+

on

+

off

+

+

on

+

off

+

uint_T

+

Same as modeled

+

on

+

64

+

Structure reference

+

12

+

2147483647

+

on

+

5

+

off

+

off

+

Native Integer

+

on

+

on

+

off

+

off

+

off

+

on

+

inf

+

Inherit from target

+

on

+

off

+

off

+

off

+

on

+

on

+

off

+

off

+

level2

+

Balanced

+

on

+

off

+

off

+

GradualUnderflow

+

off

+
+ + + UseOnlyExistingSharedCode + +

+

[]

+

error

+

none

+

none

+

none

+

error

+

none

+

UseLocalSettings

+

UseLocalSettings

+

UseLocalSettings

+

warning

+

warning

+

warning

+

warning

+

on

+

Classic

+

none

+

off

+

UseLocalSettings

+

warning

+

warning

+

none

+

error

+

warning

+

warning

+

warning

+

warning

+

error

+

error

+

error

+

none

+

warning

+

none

+

warning

+

none

+

warning

+

warning

+

error

+

error

+

none

+

warning

+

warning

+

none

+

none

+

none

+

none

+

none

+

none

+

warning

+

none

+

warning

+

warning

+

warning

+

error

+

none

+

error

+

none

+

warning

+

warning

+

UseLocalSettings

+

on

+

off

+

none

+

error

+

none

+

none

+

warning

+

warning

+

none

+

warning

+

error

+

warning

+

warning

+

error

+

none

+

warning

+

none

+

warning

+

ErrorLevel1

+

WarnAndRepair

+

none

+

warning

+

warning

+

error

+

error

+

none

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

error

+

warning

+

warning

+

none

+

warning

+

warning

+

all

+

warning

+

on

+

warning

+

warning

+

off

+

+

none

+

off

+

warning

+

none

+
+ +

[]

+

+

[]

+

8

+

16

+

32

+

32

+

64

+

32

+

64

+

32

+

32

+

32

+

Char

+

None

+

Undefined

+

Unspecified

+

32

+

on

+

off

+

32-bit Generic

+

8

+

16

+

32

+

32

+

64

+

32

+

64

+

32

+

32

+

32

+

Char

+

None

+

on

+

off

+

Undefined

+

Unspecified

+

32

+

32

+

32

+

Specified

+

off

+

on

+

on

+

on

+

EmbeddedCoderHSP

+
+ +

[]

+

+

[]

+

IfOutOfDateOrStructuralChange

+

on

+

error

+

off

+

on

+

None

+

Multi

+

Infer from blocks in model

+

+

on

+

off

+

off

+

off

+
+ +

[]

+

+

[]

+

+

+

+

+

[]

+

+

+

+

+

+

+

on

+

on

+

on

+

off

+

off

+

off

+

off

+

off

+

on

+

50

+

on

+

on

+

on

+

65536

+

off

+

[]

+

NotSpecified

+

UseInterfaceOnly

+

off

+

None

+

+

generic

+

C

+

off

+

200

+

1024

+

off

+

+

+

mkl-dnn

+

on

+
+ + + IncludeHyperlinkInReport + GenerateTraceInfo + GenerateTraceReport + GenerateTraceReportSl + GenerateTraceReportSf + GenerateTraceReportEml + PortableWordSizes + GenerateWebview + GenerateCodeMetricsReport + GenerateCodeReplacementReport + GenerateMissedCodeReplacementReport + GenerateErtSFunction + CreateSILPILBlock + CodeExecutionProfiling + CodeProfilingSaveOptions + CodeProfilingInstrumentation + CodeStackProfiling + +

+

grt.tlc

+

None

+

off

+

off

+

+

off

+

make_rtw

+

on

+

off

+

+

grt_default_tmf

+

+

off

+

on

+

off

+

[]

+

off

+

off

+

off

+

off

+

off

+

off

+

+

+

+

+

+

+

+

+

+

+

+

Automatically locate an installed toolchain

+

Faster Builds

+

[]

+

off

+

off

+

off

+

None

+

off

+

executionProfile

+

SummaryOnly

+

off

+

off

+

C

+

None

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

[]

+

+

Off

+

1024

+

+

-1

+

discrete

+

200

+

off

+

1024

+

on

+

on

+

on

+

off

+

3.5

+

+

+

0

+

none

+

on

+

19.05

+

unspecified

+ + + + IgnoreCustomStorageClasses + IgnoreTestpoints + InsertBlockDesc + SFDataObjDesc + SimulinkDataObjDesc + DefineNamingRule + SignalNamingRule + ParamNamingRule + InlinedPrmAccess + CustomSymbolStr + CustomSymbolStrGlobalVar + CustomSymbolStrType + CustomSymbolStrField + CustomSymbolStrFcn + CustomSymbolStrFcnArg + CustomSymbolStrBlkIO + CustomSymbolStrTmpVar + CustomSymbolStrMacro + ReqsInCode + BlockCommentType + InsertPolySpaceComments + MATLABFcnDesc + InternalIdentifier + CustomSymbolStrModelFcn + CustomSymbolStrUtil + CustomSymbolStrEmxType + CustomSymbolStrEmxFcn + CustomUserTokenString + +

+

[]

+

+

off

+

on

+

Auto

+

on

+

off

+

31

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

1

+

8

+

$R$N$M

+

$N$R$M_T

+

$N$M

+

$R$N$M$F

+

$R$N

+

rt$I$N$M

+

rtb_$N$M

+

$N$M

+

$R$N$M

+

$N$C

+

emxArray_$M$N

+

emx$M$N

+

+

+

None

+

+

None

+

+

None

+

+

off

+

off

+

on

+

BlockPathComment

+

on

+

off

+

off

+

+

Shortened

+

Literals

+

off

+

off

+

[]

+

error

+
+ + + GeneratePreprocessorConditionals + IncludeMdlTerminateFcn + RemoveResetFunc + SuppressErrorStatus + ERTCustomFileBanners + GenerateSampleERTMain + GenerateTestInterfaces + ModelStepFunctionPrototypeControlCompliant + CPPClassGenCompliant + PortableWordSizes + PurelyIntegerCode + PreserveStateflowLocalDataDimensions + SupportComplex + SupportAbsoluteTime + SupportContinuousTime + SupportNonInlinedSFcns + GenerateAllocFcn + ExistingSharedCode + ParenthesesLevel + ERTMultiwordTypeDef + MultiwordTypeDef + RemoveDisableFunc + +

+

[]

+

ansi_tfl_table_tmw.mat

+

+

+

NOT IN USE

+

C89/C90 (ANSI)

+

None

+

Auto

+

System defined

+

2048

+

256

+

on

+

off

+

+

off

+

off

+

on

+

on

+

on

+

on

+

on

+

off

+

off

+

off

+

off

+

Auto

+

off

+

on

+

rt_

+

on

+

Nonreusable function

+

off

+

on

+

on

+

on

+

on

+

off

+

off

+

off

+

Nominal

+

Nominal

+

Simulink.SoftwareTarget.GRTCustomization

+

off

+

on

+

off

+

off

+

on

+

off

+

on

+

on

+

[]

+

[]

+

1,2,3,4,...

+

Size,Breakpoints,Table

+

Size,Breakpoints,Table

+

Column-major

+

error

+

$R$E

+

$R$E

+

$R_data

+ + None + +

off

+

off

+

off

+

off

+

1000000

+

0

+

ext_comm

+

+

Level1

+

off

+

off

+

off

+

off

+

off

+

Error

+
+
+
+ +

[]

+

Simulink Coverage Configuration Component

+

[]

+

Simulink Coverage

+

off

+

EntireSystem

+

on

+

off

+

/

+

covdata

+

+

dw

+

+

+

off

+

on

+

on

+

on

+

on

+

covCumulativeData

+

off

+

on

+

slcov_output/$ModelName$

+

$ModelName$_cvdata

+

on

+

off

+

+

off

+

on

+

1e-05

+

0.01

+

off

+

0

+

0

+

Masking

+
+
+

Configuration

+

Solver

+

[ 200, 74, 1080, 704 ]

+

+

+
+ +__MWOPC_PART_BEGIN__ /simulink/configSetInfo.xml + + + Configuration + + +__MWOPC_PART_BEGIN__ /simulink/graphicalInterface.xml + + +

0

+

0

+

+

0

+

0

+

0

+

0

+

0

+

0

+

0

+

Unset

+

0

+

Simulink

+

0

+

0

+

1

+
+ +__MWOPC_PART_BEGIN__ /simulink/modelDictionary.xml + + + + + + +__MWOPC_PART_BEGIN__ /simulink/ScheduleCore.xml + + + + + + + + + false + Default + -2147483648 + + + + +__MWOPC_PART_BEGIN__ /simulink/ScheduleEditor.xml + + + + + HighNumberFirst + Default + + + + + + Default + graph.Graph + + +__MWOPC_PART_BEGIN__ /simulink/stateflow/_rels/machine.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/stateflow/chart_8.xml + + +

jin_ex/code

+

[293 257 161 328]

+

[0 156.75 0 153.75]

+

[1 1 1280 778 1.25]

+

8

+

LIBRARY_TOOLBAR

+

6

+

CLUSTER_CHART

+

EML_CHART

+

2

+

1

+ +

jin_ex

+
+ + +

eML_blk_kernel()

+

[18 64.5 118 66]

+

12

+

SUBCHART

+

8

+

FUNC_STATE

+

CLUSTER_STATE

+ +

1

+

function output = jin_ex(x,y) +%%#eml +output=x^2-y^2; +if(y<0) + if(x<0) + output = x^2-y^2; + elseif(x==0) + output = x^2+y^2; + elseif(x>0) + output = x^2-y^2; + end +elseif(y==0) + if(x<0) + output = x+y; + elseif(x==0) + output = x^2-y^2; + elseif(x>0) + output = x+y; + end +elseif(y>0) + if(x<0) + output = x^2+y^2; + elseif(x==0) + output = x+y; + elseif(x>0) + output = x^2+y^2; + end +end +

+

Matrix(4,1) +[205.0, 227.0, 1080.0, 733.0]

+

1

+
+
+ +

INPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+
+

SF_COMPLEX_INHERITED

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

INPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_NO

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

OUTPUT_DATA

+ + +

-1

+
+ +

SF_INHERITED_TYPE

+

SF_DOUBLE_TYPE

+

1

+

16

+
+

SF_COMPLEX_INHERITED

+

SF_FRAME_NO

+ +

inherit

+
+
+

Inherit: Same as Simulink

+
+ +

{eML_blk_kernel();}

+

[32.125 19.875 102.544 14.964]

+

12

+ +

[0 0 1 0 23.5747 14.625 0 0]

+
+ +

3

+

[1 0 -1 0 23.5747 42.5747 0 0]

+
+

[23.5747 24.9468]

+

[23.575 23.575 14.625 34.575]

+

8

+

SMART

+ +

BOTH_STICK

+
+

1

+
+ +

[23.5747 49.5747 7]

+

8

+

CONNECTIVE_JUNCTION

+
+
+
+ +__MWOPC_PART_BEGIN__ /simulink/stateflow/machine.xml + + + +

80000046

+ + +

Default Simulink S-Function Target.

+
+ +
+
+ +

7

+

jin_ex/code

+

8

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/_rels/system_1.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/systems/_rels/system_root.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/systems/system_1.xml + + +

[395, 327, 933, 805]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

off

+

Deduce

+

Simulink

+ +

[35, 38, 65, 52]

+

-1

+
+ +

[35, 38, 65, 52]

+

-2

+

2

+
+ +

[2, 1]

+

[250, 49, 320, 96]

+

-3

+

1.31

+

Stateflow.Translate.translate

+

ExplicitOnly

+

on

+

off

+

MATLAB Function

+ +
+ +

[35, 53, 65, 67]

+

-4

+
+ +

1

+

4#out:1

+

3#in:1

+
+ +

2

+

5#out:1

+

3#in:2

+
+ +

3

+

3#out:1

+

6#in:1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/system_3.xml + + +

[219, 337, 814, 775]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

off

+

Deduce

+

22

+

13

+

Simulink

+ +

[20, 101, 40, 119]

+

-1

+
+ +

[20, 136, 40, 154]

+

-2

+

2

+
+ +

[1, 1]

+

[270, 230, 320, 270]

+

2

+

1

+
+ +

Stateflow S-Function 2

+

[2, 2]

+

[180, 100, 230, 160]

+

1

+

sf_sfun

+

[2 2]

+

off

+

off

+

off

+ +

2

+

output

+
+
+ +

[460, 241, 480, 259]

+

3

+
+ +

[460, 101, 480, 119]

+

-6

+
+ +

6

+

3::1#out:1

+

[120, 0]

+

3::20#in:1

+
+ +

7

+

3::18#out:1

+

3::20#in:2

+
+ +

output

+

8

+

[0, 0]

+

3::20#out:2

+

3::19#in:1

+
+ +

9

+

3::21#out:1

+

3::22#in:1

+
+ +

10

+

3::20#out:1

+

3::21#in:1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/system_root.xml + + +

[820, 431, 1440, 869]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

on

+

off

+

Deduce

+

simulink-default.rpt

+

7

+

Simulink

+ +

[2, 1]

+

[80, 54, 245, 121]

+

-1

+

1.12

+

on

+

+

TTdiag Copy

+

TTdiag Delete

+

TTdiag Open Simulink

+

off

+ + port_label('input',1,'x');port_label('input',2,'y');port_label('output',1,'output');text(0.5, 0.9, 'Tabular Expression', 'horizontalAlignment', 'center');color('red');text(0.5, 0.1, 'Not Checked', 'horizontalAlignment', 'center') + Table Block + + +
+ +

Table1 from Jin and Parnas' paper "Defining the meaning +of tabular mathematical expressions" + +2 Dimensional normal function table of 2 variables + +provable in PVS and CVC3

+

[286, 62, 540, 124]

+

[0, 0, 0, 0]

+

-1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/windowsInfo.xml + + + + +

1

+

[820.0, 431.0, 620.0, 438.0]

+ +

0

+

Left

+

50

+

50

+

9

+

Unset

+
+ +

1

+
+ +

1

+

1

+

SimulinkTopLevel

+

0

+

[582.0, 203.0]

+

1.0

+

[16.44140625, -6.5]

+

[16.44140625, -6.5, 582.0, 203.0]

+
+ + +

GLUE2:PropertyInspector

+

Property Inspector

+

0

+

+

+

0

+

Right

+

640

+

480

+

Unset

+
+ +

Simulink:Editor:ReferencedFiles

+

Referenced Files

+

0

+

+

{"filterShowRefModels":"true","filterShowRefSubs":"true","filterShowOnlyDirtyFiles":"false"} +

+

0

+

Left

+

640

+

480

+

Unset

+
+
+

AAAA/wAAAAD9AAAAAwAAAAAAAAC9AAAB+PwCAAAABPsAAAAWAEQAbwBjAGsAVwBpAGQAZwBlAHQAMwEAAAAxAAAB+AAAAAAAAAAA+wAAABYARABvAGMAawBXAGkAZABnAGUAdAA0AAAAAAD/////AAAAAAAAAAD7AAAAUgBHAEwAVQBFADIAIAB0AHIAZQBlACAAYwBvAG0AcABvAG4AZQBuAHQALwBHAEwAVQBFADIAIAB0AHIAZQBlACAAYwBvAG0AcABvAG4AZQBuAHQAAAAAAP////8AAABkAP////sAAABgAFMAaQBtAHUAbABpAG4AawA6AEUAZABpAHQAbwByADoAUgBlAGYAZQByAGUAbgBjAGUAZABGAGkAbABlAHMALwBSAGUAZgBlAHIAZQBuAGMAZQBkACAARgBpAGwAZQBzAAAAAAD/////AAAAiAD///8AAAABAAAAAAAAAAD8AgAAAAH7AAAAVABHAEwAVQBFADIAOgBQAHIAbwBwAGUAcgB0AHkASQBuAHMAcABlAGMAdABvAHIALwBQAHIAbwBwAGUAcgB0AHkAIABJAG4AcwBwAGUAYwB0AG8AcgAAAAAA/////wAAAawA////AAAAAwAAAAAAAAAA/AEAAAAB+/////8AAAAAAP////8AAAFZAP///wAAAmwAAAEIAAAAAQAAAAIAAAABAAAAAvwAAAAA

+ +

dfa218ac-b7e7-479f-998c-2ba17f16a395

+
+

+

+
+ +__MWOPC_PACKAGE_END__ diff --git a/Jin_Parnas_Example.mdl.r2010a b/Jin_Parnas_Example.mdl.r2010a new file mode 100644 index 0000000000000000000000000000000000000000..0b5a8b9ff481e6d5d2b1519f174c1d6a42f7cc32 --- /dev/null +++ b/Jin_Parnas_Example.mdl.r2010a @@ -0,0 +1,1243 @@ +Model { + Name "Jin_Parnas_Example" + Version 7.5 + MdlSubVersion 0 + GraphicalInterface { + NumRootInports 0 + NumRootOutports 0 + ParameterArgumentNames "" + ComputedModelVersion "1.2" + NumModelReferences 0 + NumTestPointedSignals 0 + } + SavedCharacterEncoding "ISO-8859-1" + SaveDefaultBlockParams on + ScopeRefreshTime 0.035000 + OverrideScopeRefreshTime on + DisableAllScopes off + DataTypeOverride "UseLocalSettings" + MinMaxOverflowLogging "UseLocalSettings" + MinMaxOverflowArchiveMode "Overwrite" + MaxMDLFileLineLength 120 + Created "Mon Jan 24 12:34:29 2011" + Creator "colin" + UpdateHistory "UpdateHistoryNever" + ModifiedByFormat "%" + LastModifiedBy "matthew" + ModifiedDateFormat "%" + LastModifiedDate "Thu May 15 15:26:50 2014" + RTWModifiedTimeStamp 322068405 + ModelVersionFormat "1.%" + ConfigurationManager "none" + SampleTimeColors off + SampleTimeAnnotations off + LibraryLinkDisplay "none" + WideLines off + ShowLineDimensions off + ShowPortDataTypes off + ShowLoopsOnError on + IgnoreBidirectionalLines off + ShowStorageClass off + ShowTestPointIcons on + ShowSignalResolutionIcons on + ShowViewerIcons on + SortedOrder off + ExecutionContextIcon off + ShowLinearizationAnnotations on + BlockNameDataTip off + BlockParametersDataTip off + BlockDescriptionStringDataTip off + ToolBar on + StatusBar on + BrowserShowLibraryLinks off + BrowserLookUnderMasks off + SimulationMode "normal" + LinearizationMsg "none" + Profile off + ParamWorkspaceSource "MATLABWorkspace" + AccelSystemTargetFile "accel.tlc" + AccelTemplateMakefile "accel_default_tmf" + AccelMakeCommand "make_rtw" + TryForcingSFcnDF off + RecordCoverage off + CovPath "/" + CovSaveName "covdata" + CovMetricSettings "dw" + CovNameIncrementing off + CovHtmlReporting on + CovForceBlockReductionOff on + covSaveCumulativeToWorkspaceVar on + CovSaveSingleToWorkspaceVar on + CovCumulativeVarName "covCumulativeData" + CovCumulativeReport off + CovReportOnPause on + CovModelRefEnable "Off" + CovExternalEMLEnable off + ExtModeBatchMode off + ExtModeEnableFloating on + ExtModeTrigType "manual" + ExtModeTrigMode "normal" + ExtModeTrigPort "1" + ExtModeTrigElement "any" + ExtModeTrigDuration 1000 + ExtModeTrigDurationFloating "auto" + ExtModeTrigHoldOff 0 + ExtModeTrigDelay 0 + ExtModeTrigDirection "rising" + ExtModeTrigLevel 0 + ExtModeArchiveMode "off" + ExtModeAutoIncOneShot off + ExtModeIncDirWhenArm off + ExtModeAddSuffixToVar off + ExtModeWriteAllDataToWs off + ExtModeArmWhenConnect on + ExtModeSkipDownloadWhenConnect off + ExtModeLogAll on + ExtModeAutoUpdateStatusClock on + BufferReuse on + ShowModelReferenceBlockVersion off + ShowModelReferenceBlockIO off + Array { + Type "Handle" + Dimension 1 + Simulink.ConfigSet { + $ObjectID 1 + Version "1.10.0" + Array { + Type "Handle" + Dimension 8 + Simulink.SolverCC { + $ObjectID 2 + Version "1.10.0" + StartTime "0.0" + StopTime "10.0" + AbsTol "auto" + FixedStep "auto" + InitialStep "auto" + MaxNumMinSteps "-1" + MaxOrder 5 + ZcThreshold "auto" + ConsecutiveZCsStepRelTol "10*128*eps" + MaxConsecutiveZCs "1000" + ExtrapolationOrder 4 + NumberNewtonIterations 1 + MaxStep "auto" + MinStep "auto" + MaxConsecutiveMinStep "1" + RelTol "1e-3" + SolverMode "Auto" + Solver "ode45" + SolverName "ode45" + SolverJacobianMethodControl "auto" + ShapePreserveControl "DisableAll" + ZeroCrossControl "UseLocalSettings" + ZeroCrossAlgorithm "Nonadaptive" + AlgebraicLoopSolver "TrustRegion" + SolverResetMethod "Fast" + PositivePriorityOrder off + AutoInsertRateTranBlk off + SampleTimeConstraint "Unconstrained" + InsertRTBMode "Whenever possible" + } + Simulink.DataIOCC { + $ObjectID 3 + Version "1.10.0" + Decimation "1" + ExternalInput "[t, u]" + FinalStateName "xFinal" + InitialState "xInitial" + LimitDataPoints on + MaxDataPoints "1000" + LoadExternalInput off + LoadInitialState off + SaveFinalState off + SaveCompleteFinalSimState off + SaveFormat "Array" + SaveOutput on + SaveState off + SignalLogging on + DSMLogging on + InspectSignalLogs off + SaveTime on + ReturnWorkspaceOutputs off + StateSaveName "xout" + TimeSaveName "tout" + OutputSaveName "yout" + SignalLoggingName "logsout" + DSMLoggingName "dsmout" + OutputOption "RefineOutputTimes" + OutputTimes "[]" + ReturnWorkspaceOutputsName "out" + Refine "1" + } + Simulink.OptimizationCC { + $ObjectID 4 + Version "1.10.0" + Array { + Type "Cell" + Dimension 7 + Cell "BooleansAsBitfields" + Cell "PassReuseOutputArgsAs" + Cell "PassReuseOutputArgsThreshold" + Cell "ZeroExternalMemoryAtStartup" + Cell "ZeroInternalMemoryAtStartup" + Cell "OptimizeModelRefInitCode" + Cell "NoFixptDivByZeroProtection" + PropName "DisabledProps" + } + BlockReduction on + BooleanDataType on + ConditionallyExecuteInputs on + InlineParams off + UseIntDivNetSlope off + InlineInvariantSignals off + OptimizeBlockIOStorage on + BufferReuse on + EnhancedBackFolding off + StrengthReduction off + EnforceIntegerDowncast on + ExpressionFolding on + BooleansAsBitfields off + BitfieldContainerType "uint_T" + EnableMemcpy on + MemcpyThreshold 64 + PassReuseOutputArgsAs "Structure reference" + ExpressionDepthLimit 2147483647 + FoldNonRolledExpr on + LocalBlockOutputs on + RollThreshold 5 + SystemCodeInlineAuto off + StateBitsets off + DataBitsets off + UseTempVars off + ZeroExternalMemoryAtStartup on + ZeroInternalMemoryAtStartup on + InitFltsAndDblsToZero off + NoFixptDivByZeroProtection off + EfficientFloat2IntCast off + EfficientMapNaN2IntZero on + OptimizeModelRefInitCode off + LifeSpan "inf" + MaxStackSize "Inherit from target" + BufferReusableBoundary on + SimCompilerOptimization "Off" + AccelVerboseBuild off + } + Simulink.DebuggingCC { + $ObjectID 5 + Version "1.10.0" + RTPrefix "error" + ConsistencyChecking "none" + ArrayBoundsChecking "none" + SignalInfNanChecking "none" + SignalRangeChecking "none" + ReadBeforeWriteMsg "UseLocalSettings" + WriteAfterWriteMsg "UseLocalSettings" + WriteAfterReadMsg "UseLocalSettings" + AlgebraicLoopMsg "warning" + ArtificialAlgebraicLoopMsg "warning" + SaveWithDisabledLinksMsg "warning" + SaveWithParameterizedLinksMsg "warning" + CheckSSInitialOutputMsg on + UnderspecifiedInitializationDetection "Classic" + MergeDetectMultiDrivingBlocksExec "none" + CheckExecutionContextPreStartOutputMsg off + CheckExecutionContextRuntimeOutputMsg off + SignalResolutionControl "UseLocalSettings" + BlockPriorityViolationMsg "warning" + MinStepSizeMsg "warning" + TimeAdjustmentMsg "none" + MaxConsecutiveZCsMsg "error" + SolverPrmCheckMsg "warning" + InheritedTsInSrcMsg "warning" + DiscreteInheritContinuousMsg "warning" + MultiTaskDSMMsg "error" + MultiTaskCondExecSysMsg "error" + MultiTaskRateTransMsg "error" + SingleTaskRateTransMsg "none" + TasksWithSamePriorityMsg "warning" + SigSpecEnsureSampleTimeMsg "warning" + CheckMatrixSingularityMsg "none" + IntegerOverflowMsg "warning" + Int32ToFloatConvMsg "warning" + ParameterDowncastMsg "error" + ParameterOverflowMsg "error" + ParameterUnderflowMsg "none" + ParameterPrecisionLossMsg "warning" + ParameterTunabilityLossMsg "warning" + FixptConstUnderflowMsg "none" + FixptConstOverflowMsg "none" + FixptConstPrecisionLossMsg "none" + UnderSpecifiedDataTypeMsg "none" + UnnecessaryDatatypeConvMsg "none" + VectorMatrixConversionMsg "none" + InvalidFcnCallConnMsg "error" + FcnCallInpInsideContextMsg "Use local settings" + SignalLabelMismatchMsg "none" + UnconnectedInputMsg "warning" + UnconnectedOutputMsg "warning" + UnconnectedLineMsg "warning" + SFcnCompatibilityMsg "none" + UniqueDataStoreMsg "none" + BusObjectLabelMismatch "warning" + RootOutportRequireBusObject "warning" + AssertControl "UseLocalSettings" + EnableOverflowDetection off + ModelReferenceIOMsg "none" + ModelReferenceVersionMismatchMessage "none" + ModelReferenceIOMismatchMessage "none" + ModelReferenceCSMismatchMessage "none" + UnknownTsInhSupMsg "warning" + ModelReferenceDataLoggingMessage "warning" + ModelReferenceSymbolNameMessage "warning" + ModelReferenceExtraNoncontSigs "error" + StateNameClashWarn "warning" + SimStateInterfaceChecksumMismatchMsg "warning" + StrictBusMsg "ErrorLevel1" + BusNameAdapt "WarnAndRepair" + NonBusSignalsTreatedAsBus "none" + LoggingUnavailableSignals "error" + BlockIODiagnostic "none" + } + Simulink.HardwareCC { + $ObjectID 6 + Version "1.10.0" + ProdBitPerChar 8 + ProdBitPerShort 16 + ProdBitPerInt 32 + ProdBitPerLong 32 + ProdIntDivRoundTo "Undefined" + ProdEndianess "Unspecified" + ProdWordSize 32 + ProdShiftRightIntArith on + ProdHWDeviceType "32-bit Generic" + TargetBitPerChar 8 + TargetBitPerShort 16 + TargetBitPerInt 32 + TargetBitPerLong 32 + TargetShiftRightIntArith on + TargetIntDivRoundTo "Undefined" + TargetEndianess "Unspecified" + TargetWordSize 32 + TargetTypeEmulationWarnSuppressLevel 0 + TargetPreprocMaxBitsSint 32 + TargetPreprocMaxBitsUint 32 + TargetHWDeviceType "Specified" + TargetUnknown off + ProdEqTarget on + } + Simulink.ModelReferenceCC { + $ObjectID 7 + Version "1.10.0" + UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" + CheckModelReferenceTargetMessage "error" + EnableParallelModelReferenceBuilds off + ParallelModelReferenceMATLABWorkerInit "None" + ModelReferenceNumInstancesAllowed "Multi" + PropagateVarSize "Infer from blocks in model" + ModelReferencePassRootInputsByReference on + ModelReferenceMinAlgLoopOccurrences off + PropagateSignalLabelsOutOfModel off + SupportModelReferenceSimTargetCustomCode off + } + Simulink.SFSimCC { + $ObjectID 8 + Version "1.10.0" + SFSimEnableDebug on + SFSimOverflowDetection on + SFSimEcho on + SimBlas on + SimCtrlC on + SimExtrinsic on + SimIntegrity on + SimUseLocalCustomCode off + SimBuildMode "sf_incremental_build" + } + Simulink.RTWCC { + $BackupClass "Simulink.RTWCC" + $ObjectID 9 + Version "1.10.0" + Array { + Type "Cell" + Dimension 6 + Cell "IncludeHyperlinkInReport" + Cell "GenerateTraceInfo" + Cell "GenerateTraceReport" + Cell "GenerateTraceReportSl" + Cell "GenerateTraceReportSf" + Cell "GenerateTraceReportEml" + PropName "DisabledProps" + } + SystemTargetFile "grt.tlc" + GenCodeOnly off + MakeCommand "make_rtw" + GenerateMakefile on + TemplateMakefile "grt_default_tmf" + GenerateReport off + SaveLog off + RTWVerbose on + RetainRTWFile off + ProfileTLC off + TLCDebug off + TLCCoverage off + TLCAssert off + ProcessScriptMode "Default" + ConfigurationMode "Optimized" + ConfigAtBuild off + RTWUseLocalCustomCode off + RTWUseSimCustomCode off + IncludeHyperlinkInReport off + LaunchReport off + TargetLang "C" + IncludeBusHierarchyInRTWFileBlockHierarchyMap off + IncludeERTFirstTime off + GenerateTraceInfo off + GenerateTraceReport off + GenerateTraceReportSl off + GenerateTraceReportSf off + GenerateTraceReportEml off + GenerateCodeInfo off + RTWCompilerOptimization "Off" + CheckMdlBeforeBuild "Off" + CustomRebuildMode "OnUpdate" + Array { + Type "Handle" + Dimension 2 + Simulink.CodeAppCC { + $ObjectID 10 + Version "1.10.0" + Array { + Type "Cell" + Dimension 19 + Cell "IgnoreCustomStorageClasses" + Cell "IgnoreTestpoints" + Cell "InsertBlockDesc" + Cell "SFDataObjDesc" + Cell "SimulinkDataObjDesc" + Cell "DefineNamingRule" + Cell "SignalNamingRule" + Cell "ParamNamingRule" + Cell "InlinedPrmAccess" + Cell "CustomSymbolStr" + Cell "CustomSymbolStrGlobalVar" + Cell "CustomSymbolStrType" + Cell "CustomSymbolStrField" + Cell "CustomSymbolStrFcn" + Cell "CustomSymbolStrFcnArg" + Cell "CustomSymbolStrBlkIO" + Cell "CustomSymbolStrTmpVar" + Cell "CustomSymbolStrMacro" + Cell "ReqsInCode" + PropName "DisabledProps" + } + ForceParamTrailComments off + GenerateComments on + IgnoreCustomStorageClasses on + IgnoreTestpoints off + IncHierarchyInIds off + MaxIdLength 31 + PreserveName off + PreserveNameWithParent off + ShowEliminatedStatement off + IncAutoGenComments off + SimulinkDataObjDesc off + SFDataObjDesc off + IncDataTypeInIds off + MangleLength 1 + CustomSymbolStrGlobalVar "$R$N$M" + CustomSymbolStrType "$N$R$M" + CustomSymbolStrField "$N$M" + CustomSymbolStrFcn "$R$N$M$F" + CustomSymbolStrFcnArg "rt$I$N$M" + CustomSymbolStrBlkIO "rtb_$N$M" + CustomSymbolStrTmpVar "$N$M" + CustomSymbolStrMacro "$R$N$M" + DefineNamingRule "None" + ParamNamingRule "None" + SignalNamingRule "None" + InsertBlockDesc off + SimulinkBlockComments on + EnableCustomComments off + InlinedPrmAccess "Literals" + ReqsInCode off + UseSimReservedNames off + } + Simulink.GRTTargetCC { + $BackupClass "Simulink.TargetCC" + $ObjectID 11 + Version "1.10.0" + Array { + Type "Cell" + Dimension 17 + Cell "GeneratePreprocessorConditionals" + Cell "IncludeMdlTerminateFcn" + Cell "CombineOutputUpdateFcns" + Cell "SuppressErrorStatus" + Cell "ERTCustomFileBanners" + Cell "GenerateSampleERTMain" + Cell "GenerateTestInterfaces" + Cell "ModelStepFunctionPrototypeControlCompliant" + Cell "CPPClassGenCompliant" + Cell "MultiInstanceERTCode" + Cell "PurelyIntegerCode" + Cell "SupportNonFinite" + Cell "SupportComplex" + Cell "SupportAbsoluteTime" + Cell "SupportContinuousTime" + Cell "SupportNonInlinedSFcns" + Cell "PortableWordSizes" + PropName "DisabledProps" + } + TargetFcnLib "ansi_tfl_table_tmw.mat" + TargetLibSuffix "" + TargetPreCompLibLocation "" + TargetFunctionLibrary "ANSI_C" + UtilityFuncGeneration "Auto" + ERTMultiwordTypeDef "System defined" + ERTCodeCoverageTool "None" + ERTMultiwordLength 256 + MultiwordLength 2048 + GenerateFullHeader on + GenerateSampleERTMain off + GenerateTestInterfaces off + IsPILTarget off + ModelReferenceCompliant on + ParMdlRefBuildCompliant on + CompOptLevelCompliant on + IncludeMdlTerminateFcn on + GeneratePreprocessorConditionals "Disable all" + CombineOutputUpdateFcns off + SuppressErrorStatus off + ERTFirstTimeCompliant off + IncludeFileDelimiter "Auto" + ERTCustomFileBanners off + SupportAbsoluteTime on + LogVarNameModifier "rt_" + MatFileLogging on + MultiInstanceERTCode off + SupportNonFinite on + SupportComplex on + PurelyIntegerCode off + SupportContinuousTime on + SupportNonInlinedSFcns on + SupportVariableSizeSignals off + EnableShiftOperators on + ParenthesesLevel "Nominal" + PortableWordSizes off + ModelStepFunctionPrototypeControlCompliant off + CPPClassGenCompliant off + AutosarCompliant off + UseMalloc off + ExtMode off + ExtModeStaticAlloc off + ExtModeTesting off + ExtModeStaticAllocSize 1000000 + ExtModeTransport 0 + ExtModeMexFile "ext_comm" + ExtModeIntrfLevel "Level1" + RTWCAPISignals off + RTWCAPIParams off + RTWCAPIStates off + GenerateASAP2 off + } + PropName "Components" + } + } + PropName "Components" + } + Name "Configuration" + CurrentDlgPage "Solver" + ConfigPrmDlgPosition " [ 200, 74, 1080, 704 ] " + } + PropName "ConfigurationSets" + } + Simulink.ConfigSet { + $PropName "ActiveConfigurationSet" + $ObjectID 1 + } + BlockDefaults { + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + NamePlacement "normal" + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + ShowName on + BlockRotation 0 + BlockMirror off + } + AnnotationDefaults { + HorizontalAlignment "center" + VerticalAlignment "middle" + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + UseDisplayTextAsClickCallback off + } + LineDefaults { + FontName "Helvetica" + FontSize 9 + FontWeight "normal" + FontAngle "normal" + } + BlockParameterDefaults { + Block { + BlockType Demux + Outputs "4" + DisplayOption "none" + BusSelectionMode off + } + Block { + BlockType Inport + Port "1" + UseBusObject off + BusObject "BusObject" + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + OutMin "[]" + OutMax "[]" + DataType "auto" + OutDataType "fixdt(1,16,0)" + OutScaling "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + SignalType "auto" + SamplingMode "auto" + LatchByDelayingOutsideSignal off + LatchInputForFeedbackSignals off + Interpolate on + } + Block { + BlockType Outport + Port "1" + UseBusObject off + BusObject "BusObject" + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + OutMin "[]" + OutMax "[]" + DataType "auto" + OutDataType "fixdt(1,16,0)" + OutScaling "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + SignalType "auto" + SamplingMode "auto" + SourceOfInitialOutputValue "Dialog" + OutputWhenDisabled "held" + InitialOutput "[]" + } + Block { + BlockType "S-Function" + FunctionName "system" + SFunctionModules "''" + PortCounts "[]" + SFunctionDeploymentMode off + } + Block { + BlockType SubSystem + ShowPortLabels "FromPortIcon" + Permissions "ReadWrite" + PermitHierarchicalResolution "All" + TreatAsAtomicUnit off + CheckFcnCallInpInsideContextMsg off + SystemSampleTime "-1" + RTWFcnNameOpts "Auto" + RTWFileNameOpts "Auto" + RTWMemSecFuncInitTerm "Inherit from model" + RTWMemSecFuncExecute "Inherit from model" + RTWMemSecDataConstants "Inherit from model" + RTWMemSecDataInternal "Inherit from model" + RTWMemSecDataParameters "Inherit from model" + SimViewingDevice off + DataTypeOverride "UseLocalSettings" + MinMaxOverflowLogging "UseLocalSettings" + } + Block { + BlockType Terminator + } + } + System { + Name "Jin_Parnas_Example" + Location [1009, 551, 1589, 811] + Open on + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + ReportName "simulink-default.rpt" + SIDHighWatermark 6 + Block { + BlockType SubSystem + Name "jin_ex" + SID 1 + Ports [2, 1] + Position [80, 54, 245, 121] + LibraryVersion "1.12" + UserDataPersistent on + UserData "DataTag0" + CopyFcn "TTdiag Copy" + DeleteFcn "TTdiag Delete" + OpenFcn "TTdiag Open Simulink" + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskDescription "Table Block" + MaskDisplay "port_label('input',1,'x');port_label('input',2,'y');port_label('output',1,'output');text(0.5," + " 0.9, 'Tabular Expression', 'horizontalAlignment', 'center')\ncolor('green')\ntext(0.5, 0.1, 'Checked', 'horizon" + "talAlignment', 'center')" + MaskIconFrame on + MaskIconOpaque on + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "normalized" + System { + Name "jin_ex" + Location [433, 447, 931, 747] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + Block { + BlockType Inport + Name "x" + SID 4 + Position [35, 38, 65, 52] + IconDisplay "Port number" + OutDataType "fixdt(1, 16)" + OutScaling "2^0" + } + Block { + BlockType Inport + Name "y" + SID 5 + Position [35, 38, 65, 52] + Port "2" + IconDisplay "Port number" + OutDataType "fixdt(1, 16)" + OutScaling "2^0" + } + Block { + BlockType SubSystem + Name "code" + SID 3 + Ports [2, 1] + Position [250, 49, 320, 96] + LibraryVersion "1.31" + PermitHierarchicalResolution "ExplicitOnly" + TreatAsAtomicUnit on + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskType "Stateflow" + MaskDescription "Embedded MATLAB block" + MaskDisplay "disp('jin_ex');" + MaskSelfModifiable on + MaskIconFrame on + MaskIconOpaque off + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "autoscale" + System { + Name "code" + Location [257, 457, 812, 717] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + SIDHighWatermark 19 + SIDPrevWatermark 13 + Block { + BlockType Inport + Name "x" + SID 1 + Position [20, 101, 40, 119] + IconDisplay "Port number" + OutDataType "sfix(16)" + OutScaling "2^0" + } + Block { + BlockType Inport + Name "y" + SID 18 + Position [20, 136, 40, 154] + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Demux + Name " Demux " + SID 15 + Ports [1, 1] + Position [270, 160, 320, 200] + Outputs "1" + } + Block { + BlockType "S-Function" + Name " SFunction " + SID 14 + Tag "Stateflow S-Function Jin_Parnas_Example 2" + Ports [2, 2] + Position [180, 100, 230, 160] + FunctionName "sf_sfun" + PortCounts "[2 2]" + EnableBusSupport off + Port { + PortNumber 2 + Name "output" + RTWStorageClass "Auto" + DataLoggingNameMode "SignalName" + } + } + Block { + BlockType Terminator + Name " Terminator " + SID 17 + Position [460, 171, 480, 189] + } + Block { + BlockType Outport + Name "output" + SID 19 + Position [460, 101, 480, 119] + IconDisplay "Port number" + } + Line { + SrcBlock " SFunction " + SrcPort 1 + DstBlock " Demux " + DstPort 1 + } + Line { + SrcBlock "x" + SrcPort 1 + DstBlock " SFunction " + DstPort 1 + } + Line { + SrcBlock "y" + SrcPort 1 + DstBlock " SFunction " + DstPort 2 + } + Line { + Name "output" + Labels [0, 0] + SrcBlock " SFunction " + SrcPort 2 + DstBlock "output" + DstPort 1 + } + Line { + SrcBlock " Demux " + SrcPort 1 + DstBlock " Terminator " + DstPort 1 + } + } + } + Block { + BlockType Outport + Name "output" + SID 6 + Position [35, 53, 65, 67] + IconDisplay "Port number" + OutDataType "fixdt(1, 16)" + OutScaling "2^0" + } + Line { + SrcBlock "x" + SrcPort 1 + DstBlock "code" + DstPort 1 + } + Line { + SrcBlock "y" + SrcPort 1 + DstBlock "code" + DstPort 2 + } + Line { + SrcBlock "code" + SrcPort 1 + DstBlock "output" + DstPort 1 + } + } + } + Annotation { + Name "Table1 from Jin and Parnas' paper \"Defining the meaning\nof tabular mathematical expressions\"\n\n" + "2 Dimensional normal function table of 2 variables\n\nprovable in PVS and CVC3" + Position [413, 93] + } + } +} +MatData { + NumRecords 1 + DataRecord { + Tag DataTag0 + Data " %)30 . > 8 ( $0 ! $ ! !-0T]3 0 $ $1A=&$. 2 8 ( #0 " + " % \" 8 ! 0 & & -T\" 0 $ ! !0 X #@,@ !@ @ ) 4" + " ( 0 + R ! ( \"P,@ %)30 . $#( 8 ( @ % \" $ ! 0 " + " % 0 !0 $ % 34-/4P . R#$ 8 ( $0 ! $ ! !-0T]3 0 T !&:6QE5W)A<'!E<" + "E]? #@ (@Q & \" $ !0 @ !9 0 $ #@ (@) & \" D !0 @ " + " !8\"0 0 $ @ %@) \" + -@! X @ . ( !@$ \"X\" 6 D 1W)I9# 0V5L;', 0V5L;#$" + " 8V]N9%]T97AT &-E;&Q?:6YD97@ <&%R96YT7V=R:60 8V5L;', 1W)I9 !P87)E;G1?8V5L; !S<&QI=%]P8@!N=6U?8V5L;', 9W)I9%]I;F1E>" + " !R1W)I9 !N97=?8V5L;%]P8@!D96QE=&5?8V5L;%]P8@!P8E]F;&%G $-E;&P '1?;V9F 0 # 0 \"H A 0 \"L B 0 \"P 7 0 \"T " + " ! , ! +@ \"$ ! +P \"( ! , !< ! ,0 $ P $ R (0 $ S " + " (@ $ T %P $ U 0 # 0 #8 A 0 #< B 0 #@ 7 0 #D !" + " , ! .@ \"$ ! .P \"( ! / !< ! /0 $ P $ ^ (0 $ _ (" + "@ $ ! %P $ !! 0 # 0 $( A 0 $, B 0 $0 7 0 $4 ! " + " , ! 1@ \"$ ! 1P \"( ! 2 !< ! 20 " + " " + " #@ . , 8 ( ! % \" " + "$ # 0 0 , >#PP X X !@ @ & 4 ( 0 $ ! D ( " + "\\#\\. , 8 ( ! % \" $ $ 0 0 0 >#T], X X !@ @ & 4" + " ( 0 $ ! D ( $ . 2 8 ( #0 % \" 8 ! 0 " + " & & -T\" 0 $ % 0 X X !@ @ & 4 ( 0 $ ! D " + " ( \\#\\. , 8 ( ! % \" $ # 0 0 , >#XP X X !@ @ " + " & 4 ( 0 $ ! D ( \"$ . 2 8 ( #0 % \" 8 " + " ! 0 & & -T\" 0 $ % 0 X X !@ @ & 4 ( 0 $ " + " ! D ( \\#\\. 4 8 ( #0 % \" @ ! 0 & ( " + " -T\" 0 , $ !@ < \" #@ #@ & \" 8 !0 @ ! 0 $ \"0 " + "@ (0 X X !@ @ & 4 ( 0 $ ! D ( \\#\\. 2 " + "8 ( #0 % \" 8 ! 0 & & -T\" 0 $ \" P X !( !@ " + " @ - 4 ( !@ $ ! 8 8 W0( ! 0 4 ! #@ #@ & \" " + "8 !0 @ ! 0 $ \"0 @ #P/PX !( !@ @ - 4 ( !@ $" + " ! 8 8 W0( ! 0 0 \" #@ # & \" 0 !0 @ ! P $" + " $ # 'D\\, . . 8 ( !@ % \" $ ! 0 ) \" / _#@ #" + " & \" 0 !0 @ ! ! $ $ $ 'D]/3 . . 8 ( !@ % \" " + "$ ! 0 ) \" ! #@ $@ & \" T !0 @ & 0 $ !@ !" + "@ #= @ $ ! \"0 $ . . 8 ( !@ % \" $ ! 0 ) \" " + " / _#@ #@ & \" 8 !0 @ ! 0 $ \"0 @ #P/PX X !@ " + " @ & 4 ( 0 $ ! D ( \\#\\. , 8 ( ! % \" " + " $ # 0 0 , >3XP X X !@ @ & 4 ( 0 $ ! D ( " + " \"$ . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ ) 0 " + " X X !@ @ & 4 ( 0 $ ! D ( \\#\\. . 8 ( !@ " + " % \" $ ! 0 ) \" / _#@ #@ & \" 8 !0 @ ! 0 " + " $ \"0 @ #P/PX !0 !@ @ - 4 ( \" $ ! 8 @ " + "W0( ! P @ * \"P ( . . 8 ( !@ % \" $ ! 0 ) \" " + " A #@ #@ & \" 8 !0 @ ! 0 $ \"0 @ 0 X !( !@ " + " @ - 4 ( !@ $ ! 8 8 W0( ! 0 ( # #@ $@ & \" " + " T !0 @ & 0 $ !@ !@ #= @ $ ! \"0 $ . . 8 ( !@ " + " % \" $ ! 0 ) \" / _#@ #@ & \" 8 !0 @ ! 0 " + " $ \"0 @ #P/PX X !@ @ & 4 ( 0 $ ! D ( " + " \\#\\. 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ ( @ " + " X X !@ @ $ 4 ( 0 < ! ! ' >%XR+7E>,@ . 2 8 ( !@ " + " % \" $ # 0 ) & / _ \\#\\ #P/PX !( !@ @ - " + " 4 ( !@ $ ! 8 8 W0( ! 0 0 \" #@ $@ & \" T !0 " + " @ & 0 $ !@ !@ #= @ $ ! \"@ ( . , 8 ( ! % \" " + " $ # 0 0 , >\"MY X !( !@ @ & 4 ( 0 , ! D 8 " + " \\#\\ #P/P / _#@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ " + " $ ! ! ( . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 " + " $ + @ X X !@ @ $ 4 ( 0 < ! ! ' >%XR*WE>,@ . 2 " + "8 ( !@ % \" $ # 0 ) & / _ \\#\\ #P/PX !( !@ " + " @ - 4 ( !@ $ ! 8 8 W0( ! 0 8 \" #@ $@ & \" " + " T !0 @ & 0 $ !@ !@ #= @ $ ! \" ( . . 8 ( ! " + " % \" $ ' 0 0 !P 'A>,BMY7C( #@ $@ & \" 8 !0 @ ! P " + "$ \"0 !@ #P/P / _ \\#\\. 2 8 ( #0 % \" 8 ! 0 " + " & & -T\" 0 $ & @ X !( !@ @ - 4 ( !@ $ ! " + " 8 8 W0( ! 0 H \" #@ #@ & \" 0 !0 @ ! !P $ $ " + " < !X7C(M>5XR X !( !@ @ & 4 ( 0 , ! D 8 \\#\\ #P/" + "P / _#@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ $ ! !@ " + "( . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $ + @ " + "X P !@ @ $ 4 ( 0 , ! ! P!X*WD #@ $@ & \" 8 !0 @" + " ! P $ \"0 !@ #P/P / _ \\#\\. 2 8 ( #0 % \" " + " 8 ! 0 & & -T\" 0 $ ' @ X !( !@ @ - 4 ( !@ " + "$ ! 8 8 W0( ! 0 @ \" #@ #@ & \" 0 !0 @ ! !P " + "$ $ < !X7C(M>5XR X !( !@ @ & 4 ( 0 , ! D 8 " + "\\#\\ #P/P / _#@ $@ & \" T !0 @ & 0 $ !@ !@ #= @ $" + " ! !P ( . 2 8 ( #0 % \" 8 ! 0 & & -T\" 0 $" + " * @ X P !@ @ $ 4 ( 0 , ! ! P!X*WD #@ $@ & \" 8 " + " !0 @ ! P $ \"0 !@ #P/P / _ \\#\\. 2 8 ( #0 " + " % \" 8 ! 0 & & -T\" 0 $ ' @ X !( !@ @ - 4" + " ( !@ $ ! 8 8 W0( ! 0 L \" #@ #@ & \" 0 !0 @" + " ! !P $ $ < !X7C(K>5XR X !( !@ @ & 4 ( 0 , ! D " + " 8 \\#\\ #P/P / _#@ &@ & \" T !0 @ . 0 $ !@ #@ " + " #= @ $ ) P P - #@ \\ 0 $0 !( 3 ! X !( !@ @ - 4 " + " ( !@ $ ! 8 8 W0( ! 0 4 ! #@ $@ & \" T !0 @ " + " & 0 $ !@ !@ #= @ $ ! \"0 $ . 2 8 ( #0 % \" 8 " + " ! 0 & & -T\" 0 $ \" P X !( !@ @ - 4 ( !@ $ " + " ! 8 8 W0( ! 0 4 ! #@ $@ & \" T !0 @ & 0 $ " + " !@ !@ #= @ $ ! \"0 $ . . 8 ( ! % \" $ & 0 " + "0 !@ &II;E]E> #@ # & \" 0 !0 @ ! P $ $ # '@L>0 . F $ 8 (" + " @ % \" $ ! 0 % 0 !P $ C '0 8V5L;%]I;F1E> '!A'1?> " + " &-O;F1I=&EO;E]T97AT7WD !C;VYD:71I;VY?=&5X=%]O9F9S970 9W)I9%]P=7-H7W=I9'1H X P !@ @ & " + " 4 ( ! D #@ # & \" 8 !0 @ $ " + " \"0 . , 8 ( !@ % \" 0 ) X X !@ @ & " + " 4 ( 0 $ ! D ( . , 8 ( !@ % \" " + " 0 ) X X !@ @ & 4 ( 0 $ ! D ( . . " + " 8 ( !@ % \" $ ! 0 ) \" #@ # & \" 8 !" + "0 @ $ \"0 . . 8 ( !@ % \" $ ! 0 ) \"" + " #@ # & \" 8 !0 @ $ \"0 . . 8 ( !" + "@ % \" $ ! 0 ) \" &E #@ #@ & \" 8 !0 @ ! " + " 0 $ \"0 @ !.0 X X !@ @ & 4 ( 0 $ ! D ( " + " )$ . . 8 ( !@ % \" $ ! 0 ) \" \"1 #@ #@ & " + "\" 8 !0 @ ! 0 $ \"0 @ T0 X X !@ @ & 4 ( " + " 0 $ ! D ( /D . ^ 8 ( @ % \" $ ! 0 % 0 !" + "@ $ 2 0V5L;', 1W)I9#$ 1W)I9#( #@ # & \" 8 !0 @ $ \"" + "0 . , 8 ( !@ % \" 0 ) X P !@ @ & " + " 4 ( ! D #@ ) ! & \" ( !0 @ ! 0 $ !0 " + "$ P ! / $-E;&PQ $-E;&PR ')E0)\n output = x^2-y^2;\n end\nelseif(y==0)\n if(x<0)\n" + " output = x+y;\n elseif(x==0)\n output = x^2-y^2;\n elseif(x>0)\n output = x+y;\n end\nelseif(y>0)\n" + " if(x<0)\n output = x^2+y^2;\n elseif(x==0)\n output = x+y;\n elseif(x>0)\n output = x^2+y^2;\n end" + "\nend\n" + editorLayout "100 M4x1[205 227 1080 733]" + } + } + junction { + id 4 + position [23.5747 49.5747 7] + chart 2 + linkNode [2 0 0] + subviewer 2 + ssIdNumber 3 + type CONNECTIVE_JUNCTION + } + transition { + id 5 + labelString "{eML_blk_kernel();}" + labelPosition [32.125 19.875 102.544 14.964] + fontSize 12 + src { + intersection [0 0 1 0 23.5747 14.625 0 0] + } + dst { + id 4 + intersection [7 0 -1 -1 23.5747 42.5747 0 0] + } + midPoint [23.5747 24.9468] + chart 2 + linkNode [2 0 0] + dataLimits [23.575 23.575 14.625 34.575] + subviewer 2 + drawStyle SMART + executionOrder 1 + ssIdNumber 2 + } + data { + id 6 + ssIdNumber 4 + name "x" + linkNode [2 0 7] + scope INPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + method SF_INHERITED_TYPE + primitive SF_DOUBLE_TYPE + } + complexity SF_COMPLEX_INHERITED + } + dataType "Inherit: Same as Simulink" + } + data { + id 7 + ssIdNumber 5 + name "y" + linkNode [2 6 8] + scope INPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + method SF_INHERITED_TYPE + primitive SF_DOUBLE_TYPE + } + complexity SF_COMPLEX_INHERITED + frame SF_FRAME_NO + } + dataType "Inherit: Same as Simulink" + } + data { + id 8 + ssIdNumber 6 + name "output" + linkNode [2 7 0] + scope OUTPUT_DATA + machine 1 + props { + array { + size "-1" + } + type { + method SF_INHERITED_TYPE + primitive SF_DOUBLE_TYPE + isSigned 1 + wordLength "16" + } + complexity SF_COMPLEX_INHERITED + frame SF_FRAME_NO + } + dataType "Inherit: Same as Simulink" + } + instance { + id 9 + name "jin_ex/code" + machine 1 + chart 2 + } + target { + id 10 + name "sfun" + description "Default Simulink S-Function Target." + machine 1 + linkNode [1 0 0] + } +} diff --git a/TTdiag.m b/TTdiag.m index 10c27e6a2be4791fe82e053df2fc7d0cf409e38e..f0e1998fa8c1d32f58ff3259701be23d8f4a0c3a 100644 --- a/TTdiag.m +++ b/TTdiag.m @@ -54,7 +54,7 @@ switch Action, end if ~data.valid errordlg(... - DAStudio.message('Block Data has been corputed'),... + DAStudio.message('Block Data has been corrupted'),... 'Error', 'modal'); return end diff --git a/TableLibrary.mdl b/TableLibrary.mdl index 810af9743e135e8c77bce722864c7e9a2091a678..fcfcd8302c3361fe35652df0f22ba54905ecf0c4 100644 --- a/TableLibrary.mdl +++ b/TableLibrary.mdl @@ -1,679 +1,1000 @@ -Library { - Name "TableLibrary" - Version 7.5 - MdlSubVersion 0 - SavedCharacterEncoding "UTF-8" - LibraryType "BlockLibrary" - SaveDefaultBlockParams on - ScopeRefreshTime 0.035000 - OverrideScopeRefreshTime on - DisableAllScopes off - MaxMDLFileLineLength 120 - Created "Thu Apr 8 11:30:49 2010" - Creator "elesc" - UpdateHistory "UpdateHistoryNever" - ModifiedByFormat "%" - LastModifiedBy "colin" - ModifiedDateFormat "%" - LastModifiedDate "Tue Sep 21 13:08:03 2010" - RTWModifiedTimeStamp 206975269 - ModelVersionFormat "1.%" - ConfigurationManager "None" - SampleTimeColors off - SampleTimeAnnotations off - LibraryLinkDisplay "none" - WideLines off - ShowLineDimensions off - ShowPortDataTypes off - ShowLoopsOnError on - IgnoreBidirectionalLines off - ShowStorageClass off - ShowTestPointIcons on - ShowSignalResolutionIcons on - ShowViewerIcons on - SortedOrder off - ExecutionContextIcon off - ShowLinearizationAnnotations on - BlockNameDataTip off - BlockParametersDataTip off - BlockDescriptionStringDataTip off - ToolBar on - StatusBar on - BrowserShowLibraryLinks off - BrowserLookUnderMasks off - SimulationMode "normal" - LinearizationMsg "none" - Profile off - ParamWorkspaceSource "MATLABWorkspace" - RecordCoverage off - CovSaveName "covdata" - CovMetricSettings "dw" - CovNameIncrementing off - CovHtmlReporting on - CovForceBlockReductionOff on - covSaveCumulativeToWorkspaceVar on - CovSaveSingleToWorkspaceVar on - CovCumulativeReport off - CovReportOnPause on - CovModelRefEnable "Off" - CovExternalEMLEnable off - ExtModeBatchMode off - ExtModeEnableFloating on - ExtModeTrigType "manual" - ExtModeTrigMode "normal" - ExtModeTrigPort "1" - ExtModeTrigElement "any" - ExtModeTrigDuration 1000 - ExtModeTrigDurationFloating "auto" - ExtModeTrigHoldOff 0 - ExtModeTrigDelay 0 - ExtModeTrigDirection "rising" - ExtModeTrigLevel 0 - ExtModeArchiveMode "off" - ExtModeAutoIncOneShot off - ExtModeIncDirWhenArm off - ExtModeAddSuffixToVar off - ExtModeWriteAllDataToWs off - ExtModeArmWhenConnect on - ExtModeSkipDownloadWhenConnect off - ExtModeLogAll on - ExtModeAutoUpdateStatusClock on - ShowModelReferenceBlockVersion off - ShowModelReferenceBlockIO off - Array { - Type "Handle" - Dimension 1 - Simulink.ConfigSet { - $ObjectID 1 - Version "1.10.0" - Array { - Type "Handle" - Dimension 8 - Simulink.SolverCC { - $ObjectID 2 - Version "1.10.0" - StartTime "0.0" - StopTime "10.0" - AbsTol "auto" - FixedStep "auto" - InitialStep "auto" - MaxNumMinSteps "-1" - MaxOrder 5 - ZcThreshold "auto" - ConsecutiveZCsStepRelTol "10*128*eps" - MaxConsecutiveZCs "1000" - ExtrapolationOrder 4 - NumberNewtonIterations 1 - MaxStep "auto" - MinStep "auto" - MaxConsecutiveMinStep "1" - RelTol "1e-3" - SolverMode "Auto" - Solver "ode45" - SolverName "ode45" - SolverJacobianMethodControl "auto" - ShapePreserveControl "DisableAll" - ZeroCrossControl "UseLocalSettings" - ZeroCrossAlgorithm "Nonadaptive" - AlgebraicLoopSolver "TrustRegion" - SolverResetMethod "Fast" - PositivePriorityOrder off - AutoInsertRateTranBlk off - SampleTimeConstraint "Unconstrained" - InsertRTBMode "Whenever possible" - } - Simulink.DataIOCC { - $ObjectID 3 - Version "1.10.0" - Decimation "1" - ExternalInput "[t, u]" - FinalStateName "xFinal" - InitialState "xInitial" - LimitDataPoints on - MaxDataPoints "1000" - LoadExternalInput off - LoadInitialState off - SaveFinalState off - SaveCompleteFinalSimState off - SaveFormat "Array" - SaveOutput on - SaveState off - SignalLogging on - DSMLogging on - InspectSignalLogs off - SaveTime on - ReturnWorkspaceOutputs off - StateSaveName "xout" - TimeSaveName "tout" - OutputSaveName "yout" - SignalLoggingName "logsout" - DSMLoggingName "dsmout" - OutputOption "RefineOutputTimes" - OutputTimes "[]" - ReturnWorkspaceOutputsName "out" - Refine "1" - } - Simulink.OptimizationCC { - $ObjectID 4 - Version "1.10.0" - Array { - Type "Cell" - Dimension 7 - Cell "BooleansAsBitfields" - Cell "PassReuseOutputArgsAs" - Cell "PassReuseOutputArgsThreshold" - Cell "ZeroExternalMemoryAtStartup" - Cell "ZeroInternalMemoryAtStartup" - Cell "OptimizeModelRefInitCode" - Cell "NoFixptDivByZeroProtection" - PropName "DisabledProps" - } - BlockReduction on - BooleanDataType on - ConditionallyExecuteInputs on - InlineParams off - UseIntDivNetSlope off - InlineInvariantSignals off - OptimizeBlockIOStorage on - BufferReuse on - EnhancedBackFolding off - StrengthReduction off - EnforceIntegerDowncast on - ExpressionFolding on - BooleansAsBitfields off - BitfieldContainerType "uint_T" - EnableMemcpy on - MemcpyThreshold 64 - PassReuseOutputArgsAs "Structure reference" - ExpressionDepthLimit 2147483647 - FoldNonRolledExpr on - LocalBlockOutputs on - RollThreshold 5 - SystemCodeInlineAuto off - StateBitsets off - DataBitsets off - UseTempVars off - ZeroExternalMemoryAtStartup on - ZeroInternalMemoryAtStartup on - InitFltsAndDblsToZero off - NoFixptDivByZeroProtection off - EfficientFloat2IntCast off - EfficientMapNaN2IntZero on - OptimizeModelRefInitCode off - LifeSpan "inf" - MaxStackSize "Inherit from target" - BufferReusableBoundary on - SimCompilerOptimization "Off" - AccelVerboseBuild off - } - Simulink.DebuggingCC { - $ObjectID 5 - Version "1.10.0" - RTPrefix "error" - ConsistencyChecking "none" - ArrayBoundsChecking "none" - SignalInfNanChecking "none" - SignalRangeChecking "none" - ReadBeforeWriteMsg "UseLocalSettings" - WriteAfterWriteMsg "UseLocalSettings" - WriteAfterReadMsg "UseLocalSettings" - AlgebraicLoopMsg "warning" - ArtificialAlgebraicLoopMsg "warning" - SaveWithDisabledLinksMsg "warning" - SaveWithParameterizedLinksMsg "warning" - CheckSSInitialOutputMsg on - UnderspecifiedInitializationDetection "Classic" - MergeDetectMultiDrivingBlocksExec "none" - CheckExecutionContextPreStartOutputMsg off - CheckExecutionContextRuntimeOutputMsg off - SignalResolutionControl "UseLocalSettings" - BlockPriorityViolationMsg "warning" - MinStepSizeMsg "warning" - TimeAdjustmentMsg "none" - MaxConsecutiveZCsMsg "error" - SolverPrmCheckMsg "warning" - InheritedTsInSrcMsg "warning" - DiscreteInheritContinuousMsg "warning" - MultiTaskDSMMsg "error" - MultiTaskCondExecSysMsg "error" - MultiTaskRateTransMsg "error" - SingleTaskRateTransMsg "none" - TasksWithSamePriorityMsg "warning" - SigSpecEnsureSampleTimeMsg "warning" - CheckMatrixSingularityMsg "none" - IntegerOverflowMsg "warning" - Int32ToFloatConvMsg "warning" - ParameterDowncastMsg "error" - ParameterOverflowMsg "error" - ParameterUnderflowMsg "none" - ParameterPrecisionLossMsg "warning" - ParameterTunabilityLossMsg "warning" - FixptConstUnderflowMsg "none" - FixptConstOverflowMsg "none" - FixptConstPrecisionLossMsg "none" - UnderSpecifiedDataTypeMsg "none" - UnnecessaryDatatypeConvMsg "none" - VectorMatrixConversionMsg "none" - InvalidFcnCallConnMsg "error" - FcnCallInpInsideContextMsg "Use local settings" - SignalLabelMismatchMsg "none" - UnconnectedInputMsg "warning" - UnconnectedOutputMsg "warning" - UnconnectedLineMsg "warning" - SFcnCompatibilityMsg "none" - UniqueDataStoreMsg "none" - BusObjectLabelMismatch "warning" - RootOutportRequireBusObject "warning" - AssertControl "UseLocalSettings" - EnableOverflowDetection off - ModelReferenceIOMsg "none" - ModelReferenceVersionMismatchMessage "none" - ModelReferenceIOMismatchMessage "none" - ModelReferenceCSMismatchMessage "none" - UnknownTsInhSupMsg "warning" - ModelReferenceDataLoggingMessage "warning" - ModelReferenceSymbolNameMessage "warning" - ModelReferenceExtraNoncontSigs "error" - StateNameClashWarn "warning" - SimStateInterfaceChecksumMismatchMsg "warning" - StrictBusMsg "Warning" - BusNameAdapt "WarnAndRepair" - NonBusSignalsTreatedAsBus "none" - LoggingUnavailableSignals "error" - BlockIODiagnostic "none" - } - Simulink.HardwareCC { - $ObjectID 6 - Version "1.10.0" - ProdBitPerChar 8 - ProdBitPerShort 16 - ProdBitPerInt 32 - ProdBitPerLong 32 - ProdIntDivRoundTo "Undefined" - ProdEndianess "Unspecified" - ProdWordSize 32 - ProdShiftRightIntArith on - ProdHWDeviceType "32-bit Generic" - TargetBitPerChar 8 - TargetBitPerShort 16 - TargetBitPerInt 32 - TargetBitPerLong 32 - TargetShiftRightIntArith on - TargetIntDivRoundTo "Undefined" - TargetEndianess "Unspecified" - TargetWordSize 32 - TargetTypeEmulationWarnSuppressLevel 0 - TargetPreprocMaxBitsSint 32 - TargetPreprocMaxBitsUint 32 - TargetHWDeviceType "Specified" - TargetUnknown off - ProdEqTarget on - } - Simulink.ModelReferenceCC { - $ObjectID 7 - Version "1.10.0" - UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" - CheckModelReferenceTargetMessage "error" - EnableParallelModelReferenceBuilds off - ParallelModelReferenceMATLABWorkerInit "None" - ModelReferenceNumInstancesAllowed "Multi" - PropagateVarSize "Infer from blocks in model" - ModelReferencePassRootInputsByReference on - ModelReferenceMinAlgLoopOccurrences off - PropagateSignalLabelsOutOfModel off - SupportModelReferenceSimTargetCustomCode off - } - Simulink.SFSimCC { - $ObjectID 8 - Version "1.10.0" - SFSimEnableDebug on - SFSimOverflowDetection on - SFSimEcho on - SimBlas on - SimCtrlC on - SimExtrinsic on - SimIntegrity on - SimUseLocalCustomCode off - SimBuildMode "sf_incremental_build" - } - Simulink.RTWCC { - $BackupClass "Simulink.RTWCC" - $ObjectID 9 - Version "1.10.0" - Array { - Type "Cell" - Dimension 6 - Cell "IncludeHyperlinkInReport" - Cell "GenerateTraceInfo" - Cell "GenerateTraceReport" - Cell "GenerateTraceReportSl" - Cell "GenerateTraceReportSf" - Cell "GenerateTraceReportEml" - PropName "DisabledProps" - } - SystemTargetFile "grt.tlc" - GenCodeOnly off - MakeCommand "make_rtw" - GenerateMakefile on - TemplateMakefile "grt_default_tmf" - GenerateReport off - SaveLog off - RTWVerbose on - RetainRTWFile off - ProfileTLC off - TLCDebug off - TLCCoverage off - TLCAssert off - ProcessScriptMode "Default" - ConfigurationMode "Optimized" - ConfigAtBuild off - RTWUseLocalCustomCode off - RTWUseSimCustomCode off - IncludeHyperlinkInReport off - LaunchReport off - TargetLang "C" - IncludeBusHierarchyInRTWFileBlockHierarchyMap off - IncludeERTFirstTime off - GenerateTraceInfo off - GenerateTraceReport off - GenerateTraceReportSl off - GenerateTraceReportSf off - GenerateTraceReportEml off - GenerateCodeInfo off - RTWCompilerOptimization "Off" - CheckMdlBeforeBuild "Off" - CustomRebuildMode "OnUpdate" - Array { - Type "Handle" - Dimension 2 - Simulink.CodeAppCC { - $ObjectID 10 - Version "1.10.0" - Array { - Type "Cell" - Dimension 19 - Cell "IgnoreCustomStorageClasses" - Cell "IgnoreTestpoints" - Cell "InsertBlockDesc" - Cell "SFDataObjDesc" - Cell "SimulinkDataObjDesc" - Cell "DefineNamingRule" - Cell "SignalNamingRule" - Cell "ParamNamingRule" - Cell "InlinedPrmAccess" - Cell "CustomSymbolStr" - Cell "CustomSymbolStrGlobalVar" - Cell "CustomSymbolStrType" - Cell "CustomSymbolStrField" - Cell "CustomSymbolStrFcn" - Cell "CustomSymbolStrFcnArg" - Cell "CustomSymbolStrBlkIO" - Cell "CustomSymbolStrTmpVar" - Cell "CustomSymbolStrMacro" - Cell "ReqsInCode" - PropName "DisabledProps" - } - ForceParamTrailComments off - GenerateComments on - IgnoreCustomStorageClasses on - IgnoreTestpoints off - IncHierarchyInIds off - MaxIdLength 31 - PreserveName off - PreserveNameWithParent off - ShowEliminatedStatement off - IncAutoGenComments off - SimulinkDataObjDesc off - SFDataObjDesc off - IncDataTypeInIds off - MangleLength 1 - CustomSymbolStrGlobalVar "$R$N$M" - CustomSymbolStrType "$N$R$M" - CustomSymbolStrField "$N$M" - CustomSymbolStrFcn "$R$N$M$F" - CustomSymbolStrFcnArg "rt$I$N$M" - CustomSymbolStrBlkIO "rtb_$N$M" - CustomSymbolStrTmpVar "$N$M" - CustomSymbolStrMacro "$R$N$M" - DefineNamingRule "None" - ParamNamingRule "None" - SignalNamingRule "None" - InsertBlockDesc off - SimulinkBlockComments on - EnableCustomComments off - InlinedPrmAccess "Literals" - ReqsInCode off - UseSimReservedNames off - } - Simulink.GRTTargetCC { - $BackupClass "Simulink.TargetCC" - $ObjectID 11 - Version "1.10.0" - Array { - Type "Cell" - Dimension 17 - Cell "GeneratePreprocessorConditionals" - Cell "IncludeMdlTerminateFcn" - Cell "CombineOutputUpdateFcns" - Cell "SuppressErrorStatus" - Cell "ERTCustomFileBanners" - Cell "GenerateSampleERTMain" - Cell "GenerateTestInterfaces" - Cell "ModelStepFunctionPrototypeControlCompliant" - Cell "CPPClassGenCompliant" - Cell "MultiInstanceERTCode" - Cell "PurelyIntegerCode" - Cell "SupportNonFinite" - Cell "SupportComplex" - Cell "SupportAbsoluteTime" - Cell "SupportContinuousTime" - Cell "SupportNonInlinedSFcns" - Cell "PortableWordSizes" - PropName "DisabledProps" - } - TargetFcnLib "ansi_tfl_table_tmw.mat" - TargetLibSuffix "" - TargetPreCompLibLocation "" - TargetFunctionLibrary "ANSI_C" - UtilityFuncGeneration "Auto" - ERTMultiwordTypeDef "System defined" - ERTCodeCoverageTool "None" - ERTMultiwordLength 256 - MultiwordLength 2048 - GenerateFullHeader on - GenerateSampleERTMain off - GenerateTestInterfaces off - IsPILTarget off - ModelReferenceCompliant on - ParMdlRefBuildCompliant on - CompOptLevelCompliant on - IncludeMdlTerminateFcn on - GeneratePreprocessorConditionals "Disable all" - CombineOutputUpdateFcns off - SuppressErrorStatus off - ERTFirstTimeCompliant off - IncludeFileDelimiter "Auto" - ERTCustomFileBanners off - SupportAbsoluteTime on - LogVarNameModifier "rt_" - MatFileLogging on - MultiInstanceERTCode off - SupportNonFinite on - SupportComplex on - PurelyIntegerCode off - SupportContinuousTime on - SupportNonInlinedSFcns on - SupportVariableSizeSignals off - EnableShiftOperators on - ParenthesesLevel "Nominal" - PortableWordSizes off - ModelStepFunctionPrototypeControlCompliant off - CPPClassGenCompliant off - AutosarCompliant off - UseMalloc off - ExtMode off - ExtModeStaticAlloc off - ExtModeTesting off - ExtModeStaticAllocSize 1000000 - ExtModeTransport 0 - ExtModeMexFile "ext_comm" - ExtModeIntrfLevel "Level1" - RTWCAPISignals off - RTWCAPIParams off - RTWCAPIStates off - GenerateASAP2 off - } - PropName "Components" - } - } - PropName "Components" - } - Name "Configuration" - CurrentDlgPage "Solver" - ConfigPrmDlgPosition " [ 200, 74, 1080, 704 ] " - } - PropName "ConfigurationSets" - } - BlockDefaults { - ForegroundColor "black" - BackgroundColor "white" - DropShadow off - NamePlacement "normal" - FontName "Helvetica" - FontSize 10 - FontWeight "normal" - FontAngle "normal" - ShowName on - BlockRotation 0 - BlockMirror off - } - AnnotationDefaults { - HorizontalAlignment "center" - VerticalAlignment "middle" - ForegroundColor "black" - BackgroundColor "white" - DropShadow off - FontName "Helvetica" - FontSize 10 - FontWeight "normal" - FontAngle "normal" - UseDisplayTextAsClickCallback off - } - LineDefaults { - FontName "Helvetica" - FontSize 9 - FontWeight "normal" - FontAngle "normal" - } - BlockParameterDefaults { - Block { - BlockType Inport - Port "1" - UseBusObject off - BusObject "BusObject" - BusOutputAsStruct off - PortDimensions "-1" - VarSizeSig "Inherit" - SampleTime "-1" - OutMin "[]" - OutMax "[]" - DataType "auto" - OutDataType "fixdt(1,16,0)" - OutScaling "[]" - OutDataTypeStr "Inherit: auto" - LockScale off - SignalType "auto" - SamplingMode "auto" - LatchByDelayingOutsideSignal off - LatchInputForFeedbackSignals off - Interpolate on - } - Block { - BlockType SubSystem - ShowPortLabels "FromPortIcon" - Permissions "ReadWrite" - PermitHierarchicalResolution "All" - TreatAsAtomicUnit off - CheckFcnCallInpInsideContextMsg off - SystemSampleTime "-1" - RTWFcnNameOpts "Auto" - RTWFileNameOpts "Auto" - RTWMemSecFuncInitTerm "Inherit from model" - RTWMemSecFuncExecute "Inherit from model" - RTWMemSecDataConstants "Inherit from model" - RTWMemSecDataInternal "Inherit from model" - RTWMemSecDataParameters "Inherit from model" - SimViewingDevice off - DataTypeOverride "UseLocalSettings" - MinMaxOverflowLogging "UseLocalSettings" - } - } - System { - Name "TableLibrary" - Location [193, 302, 773, 562] - Open on - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "100" - ReportName "simulink-default.rpt" - SIDHighWatermark 8 - Block { - BlockType SubSystem - Name "Tabular Expression" - SID 1 - Ports [1] - Position [70, 32, 235, 98] - CopyFcn "TTdiag Copy" - DeleteFcn "TTdiag Delete" - OpenFcn "TTdiag Open Simulink" - MinAlgLoopOccurrences off - PropExecContextOutsideSubsystem off - RTWSystemCode "Auto" - FunctionWithSeparateData off - Opaque off - RequestExecContextInheritance off - MaskHideContents off - MaskDescription "Table Block" - MaskDisplay "port_label('input',1,'Input');\ntext(0.5,0.6,'Tabular Expression', 'horizontalAlignment', 'ce" - "nter')\ncolor('red')\ntext(0.5,0.4,'Not Checked', 'horizontalAlignment', 'center')" - MaskIconFrame on - MaskIconOpaque on - MaskIconRotate "none" - MaskPortRotate "default" - MaskIconUnits "normalized" - System { - Name "Tabular Expression" - Location [433, 447, 931, 747] - Open off - ModelBrowserVisibility off - ModelBrowserWidth 200 - ScreenColor "white" - PaperOrientation "landscape" - PaperPositionMode "auto" - PaperType "usletter" - PaperUnits "inches" - TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] - TiledPageScale 1 - ShowPageBoundaries off - ZoomFactor "100" - Block { - BlockType Inport - Name "In1" - SID 2 - Position [110, 103, 140, 117] - IconDisplay "Port number" - OutDataType "fixdt(1, 16)" - OutScaling "2^0" - } - } - } - } +# MathWorks OPC Text Package +Model { + Version 10.4 + Description "Simulink model saved in R2021b" } +__MWOPC_PACKAGE_BEGIN__ R2021b +__MWOPC_PART_BEGIN__ /[Content_Types].xml + + + + + + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /_rels/.rels + + + + + + + + + + + + +__MWOPC_PART_BEGIN__ /metadata/coreProperties.xml + + + library + 2010-04-08T15:30:49Z + elesc + pesaraamarasekera + 2022-05-22T01:18:50Z + 24.0 + R2021b + + +__MWOPC_PART_BEGIN__ /metadata/mwcoreProperties.xml + + + application/vnd.mathworks.simulink.model + Simulink Model + R2021b + + +__MWOPC_PART_BEGIN__ /metadata/mwcorePropertiesExtension.xml + + + 14ca3fb9-c549-4327-959d-be9ebf62328f + + +__MWOPC_PART_BEGIN__ /metadata/mwcorePropertiesReleaseInfo.xml + + + + 9.11.0.1873467 + R2021b + Update 3 + Feb 03 2022 + 2440358501 + + +__MWOPC_PART_BEGIN__ /simulink/_rels/blockdiagram.xml.rels + + + + + + + +__MWOPC_PART_BEGIN__ /simulink/_rels/configSetInfo.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/bddefaults.xml + + + +

center

+

middle

+
+ + + + + + + + + +

1

+

off

+

Port number

+

off

+

[]

+

[]

+

Inherit: auto

+

off

+

off

+

inherit

+

-1

+

Inherit

+

-1

+

auto

+

auto

+

off

+

off

+

on

+
+ +

FromPortIcon

+

ReadWrite

+

All

+

off

+

off

+

Sample time

+

-1

+

Auto

+

Auto

+

Auto

+

void_void

+

off

+

off

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

Inherit from model

+

off

+

UseLocalSettings

+

AllNumericTypes

+

UseLocalSettings

+

off

+

off

+

NONE

+

off

+

expression

+

update diagram

+

off

+

off

+

on

+

off

+

off

+

off

+

0

+

off

+

off

+
+
+
+ +__MWOPC_PART_BEGIN__ /simulink/blockdiagram.xml + + + +

9d540185-51f6-4fd1-b327-fe0353af8803

+

BlockLibrary

+

maci64

+ +

%<Auto>

+

%<Auto>

+

206975269

+

%<AutoIncrement:24.0>

+
+ +

none

+
+ +

normal

+
+ +

warning

+
+ +
+
+ +__MWOPC_PART_BEGIN__ /simulink/configSet0.xml + + + +

[]

+

+ + +

[]

+

+

[]

+

0.0

+

10.0

+

auto

+

on

+

auto

+

auto

+

5

+

auto

+

10*128*eps

+

1000

+

4

+

1

+

auto

+

auto

+

1

+

1e-3

+

on

+

off

+

off

+

ode45

+

auto

+

auto

+

DisableAll

+

UseLocalSettings

+

Nonadaptive

+

TrustRegion

+

off

+

off

+

Fast

+

off

+

off

+

Unconstrained

+

Whenever possible

+

[]

+

off

+

off

+

ode3

+
+ +

[]

+

+

[]

+

1

+

[t, u]

+

xFinal

+

xInitial

+

on

+

1000

+

off

+

off

+

off

+

off

+

Array

+

ModelDataLogs

+

on

+

off

+

on

+

on

+

off

+

on

+

off

+

streamout

+

on

+

off

+

xout

+

tout

+

yout

+

logsout

+

dsmout

+

RefineOutputTimes

+

[]

+

out

+

1

+

off

+

timeseries

+

out.mat

+

[-inf, inf]

+
+ + + BooleansAsBitfields + PassReuseOutputArgsAs + PassReuseOutputArgsThreshold + ZeroExternalMemoryAtStartup + ZeroInternalMemoryAtStartup + OptimizeModelRefInitCode + NoFixptDivByZeroProtection + UseSpecifiedMinMax + EfficientTunableParamExpr + +

+

[]

+

on

+

on

+

on

+

Tunable

+

off

+

off

+

off

+

off

+

double

+

off

+

off

+

on

+

on

+

off

+

off

+

on

+

off

+

+

on

+

off

+

uint_T

+

Same as modeled

+

on

+

64

+

Structure reference

+

12

+

2147483647

+

on

+

5

+

off

+

off

+

Native Integer

+

on

+

on

+

off

+

off

+

off

+

on

+

inf

+

Inherit from target

+

on

+

off

+

off

+

off

+

on

+

on

+

off

+

off

+

level2

+

Balanced

+

on

+

off

+

off

+

GradualUnderflow

+

off

+
+ + + UseOnlyExistingSharedCode + +

+

[]

+

error

+

none

+

none

+

none

+

error

+

none

+

UseLocalSettings

+

UseLocalSettings

+

UseLocalSettings

+

warning

+

warning

+

warning

+

warning

+

on

+

Classic

+

none

+

off

+

UseLocalSettings

+

warning

+

warning

+

none

+

error

+

warning

+

warning

+

warning

+

warning

+

error

+

error

+

error

+

none

+

warning

+

none

+

warning

+

none

+

warning

+

warning

+

error

+

error

+

none

+

warning

+

warning

+

none

+

none

+

none

+

none

+

none

+

none

+

warning

+

none

+

warning

+

warning

+

warning

+

error

+

none

+

error

+

none

+

warning

+

warning

+

UseLocalSettings

+

on

+

off

+

none

+

error

+

none

+

none

+

warning

+

warning

+

none

+

warning

+

error

+

warning

+

warning

+

error

+

none

+

warning

+

none

+

warning

+

ErrorLevel1

+

WarnAndRepair

+

none

+

warning

+

warning

+

error

+

error

+

none

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

warning

+

error

+

warning

+

warning

+

none

+

warning

+

warning

+

all

+

warning

+

on

+

warning

+

warning

+

off

+

+

none

+

off

+

warning

+

none

+
+ +

[]

+

+

[]

+

8

+

16

+

32

+

32

+

64

+

32

+

64

+

32

+

32

+

32

+

Char

+

None

+

Undefined

+

Unspecified

+

32

+

on

+

off

+

32-bit Generic

+

8

+

16

+

32

+

32

+

64

+

32

+

64

+

32

+

32

+

32

+

Char

+

None

+

on

+

off

+

Undefined

+

Unspecified

+

32

+

32

+

32

+

Specified

+

off

+

on

+

on

+

on

+

EmbeddedCoderHSP

+
+ +

[]

+

+

[]

+

IfOutOfDateOrStructuralChange

+

on

+

error

+

off

+

on

+

None

+

Multi

+

Infer from blocks in model

+

+

on

+

off

+

off

+

off

+
+ +

[]

+

+

[]

+

+

+

+

+

[]

+

+

+

+

+

+

+

on

+

on

+

on

+

off

+

on

+

off

+

off

+

off

+

on

+

50

+

on

+

on

+

on

+

65536

+

off

+

[]

+

NotSpecified

+

UseInterfaceOnly

+

off

+

None

+

+

generic

+

C

+

off

+

200

+

1024

+

off

+

+

+

mkl-dnn

+

on

+
+ + + IncludeHyperlinkInReport + GenerateTraceInfo + GenerateTraceReport + GenerateTraceReportSl + GenerateTraceReportSf + GenerateTraceReportEml + PortableWordSizes + GenerateWebview + GenerateCodeMetricsReport + GenerateCodeReplacementReport + GenerateMissedCodeReplacementReport + GenerateErtSFunction + CreateSILPILBlock + CodeExecutionProfiling + CodeProfilingSaveOptions + CodeProfilingInstrumentation + CodeStackProfiling + +

+

grt.tlc

+

None

+

off

+

off

+

+

off

+

make_rtw

+

on

+

off

+

+

grt_default_tmf

+

+

off

+

on

+

off

+

[]

+

off

+

off

+

off

+

off

+

off

+

off

+

+

+

+

+

+

+

+

+

+

+

+

Automatically locate an installed toolchain

+

Faster Builds

+

[]

+

off

+

off

+

off

+

None

+

off

+

executionProfile

+

SummaryOnly

+

off

+

off

+

C

+

None

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

[]

+

+

Off

+

1024

+

+

-1

+

discrete

+

200

+

off

+

1024

+

on

+

on

+

on

+

off

+

3.5

+

+

+

0

+

none

+

on

+

19.05

+

unspecified

+ + + + IgnoreCustomStorageClasses + IgnoreTestpoints + InsertBlockDesc + SFDataObjDesc + SimulinkDataObjDesc + DefineNamingRule + SignalNamingRule + ParamNamingRule + InlinedPrmAccess + CustomSymbolStr + CustomSymbolStrGlobalVar + CustomSymbolStrType + CustomSymbolStrField + CustomSymbolStrFcn + CustomSymbolStrFcnArg + CustomSymbolStrBlkIO + CustomSymbolStrTmpVar + CustomSymbolStrMacro + ReqsInCode + BlockCommentType + InsertPolySpaceComments + MATLABFcnDesc + InternalIdentifier + CustomSymbolStrModelFcn + CustomSymbolStrUtil + CustomSymbolStrEmxType + CustomSymbolStrEmxFcn + CustomUserTokenString + +

+

[]

+

+

off

+

on

+

Auto

+

on

+

off

+

31

+

off

+

off

+

off

+

off

+

off

+

off

+

off

+

1

+

8

+

$R$N$M

+

$N$R$M_T

+

$N$M

+

$R$N$M$F

+

$R$N

+

rt$I$N$M

+

rtb_$N$M

+

$N$M

+

$R$N$M

+

$N$C

+

emxArray_$M$N

+

emx$M$N

+

+

+

None

+

+

None

+

+

None

+

+

off

+

off

+

on

+

BlockPathComment

+

on

+

off

+

off

+

+

Shortened

+

Literals

+

off

+

off

+

[]

+

error

+
+ + + GeneratePreprocessorConditionals + IncludeMdlTerminateFcn + RemoveResetFunc + SuppressErrorStatus + ERTCustomFileBanners + GenerateSampleERTMain + GenerateTestInterfaces + ModelStepFunctionPrototypeControlCompliant + CPPClassGenCompliant + PortableWordSizes + PurelyIntegerCode + PreserveStateflowLocalDataDimensions + SupportComplex + SupportAbsoluteTime + SupportContinuousTime + SupportNonInlinedSFcns + GenerateAllocFcn + ExistingSharedCode + ParenthesesLevel + ERTMultiwordTypeDef + MultiwordTypeDef + RemoveDisableFunc + +

+

[]

+

ansi_tfl_table_tmw.mat

+

+

+

NOT IN USE

+

C89/C90 (ANSI)

+

None

+

Auto

+

System defined

+

2048

+

256

+

on

+

off

+

+

off

+

off

+

on

+

on

+

on

+

on

+

on

+

off

+

off

+

off

+

off

+

Auto

+

off

+

on

+

rt_

+

on

+

Nonreusable function

+

off

+

on

+

on

+

on

+

on

+

off

+

off

+

off

+

Nominal

+

Nominal

+

Simulink.SoftwareTarget.GRTCustomization

+

off

+

on

+

off

+

off

+

on

+

off

+

on

+

on

+

[]

+

[]

+

1,2,3,4,...

+

Size,Breakpoints,Table

+

Size,Breakpoints,Table

+

Column-major

+

error

+

$R$E

+

$R$E

+

$R_data

+ + None + +

off

+

off

+

off

+

off

+

1000000

+

0

+

ext_comm

+

+

Level1

+

off

+

off

+

off

+

off

+

off

+

Error

+
+
+
+ +

[]

+

Simulink Coverage Configuration Component

+

[]

+

Simulink Coverage

+

off

+

EntireSystem

+

on

+

off

+

/

+

covdata

+

+

dw

+

+

+

off

+

on

+

on

+

on

+

on

+

covCumulativeData

+

off

+

on

+

slcov_output/$ModelName$

+

$ModelName$_cvdata

+

on

+

off

+

+

off

+

on

+

1e-05

+

0.01

+

off

+

0

+

0

+

Masking

+
+
+

Configuration

+

Solver

+

[ 200, 74, 1080, 704 ]

+

+

+
+ +__MWOPC_PART_BEGIN__ /simulink/configSetInfo.xml + + + Configuration + + +__MWOPC_PART_BEGIN__ /simulink/libraryBrowser/_rels/slLibraryBrowser.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/libraryBrowser/slLibraryBrowser.xml +Tabular ExpressionTable Block$bdroot/Tabular ExpressionTTdiag Open Simulink070 32 235 98Tabular@20@Expression.svgsignal.in_signal:1SubSystem +__MWOPC_PART_BEGIN__ /simulink/libraryBrowser/Tabular@20@Expression.svg +InputTabular ExpressionNot Checked + +__MWOPC_PART_BEGIN__ /simulink/modelDictionary.xml + + + + + + +__MWOPC_PART_BEGIN__ /simulink/systems/_rels/system_root.xml.rels + + + + + +__MWOPC_PART_BEGIN__ /simulink/systems/system_1.xml + + +

[395, 327, 933, 805]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

off

+

Deduce

+

Simulink

+ +

[110, 103, 140, 117]

+

-1

+
+
+ +__MWOPC_PART_BEGIN__ /simulink/systems/system_root.xml + + +

[155, 182, 775, 620]

+

[0.000000, 0.000000, 0.000000, 0.000000]

+

off

+

Deduce

+

simulink-default.rpt

+

8

+

Simulink

+ +

[1]

+

[70, 32, 235, 98]

+

-1

+

TTdiag Copy

+

TTdiag Delete

+

TTdiag Open Simulink

+

off

+ + port_label('input',1,'Input'); +text(0.5,0.6,'Tabular Expression', 'horizontalAlignment', 'center') +color('red') +text(0.5,0.4,'Not Checked', 'horizontalAlignment', 'center') + Table Block + + +
+
+ +__MWOPC_PART_BEGIN__ /simulink/windowsInfo.xml + + + +

[]

+

+

+
+ +__MWOPC_PACKAGE_END__ diff --git a/TableLibrary.mdl.r2010a b/TableLibrary.mdl.r2010a new file mode 100644 index 0000000000000000000000000000000000000000..810af9743e135e8c77bce722864c7e9a2091a678 --- /dev/null +++ b/TableLibrary.mdl.r2010a @@ -0,0 +1,679 @@ +Library { + Name "TableLibrary" + Version 7.5 + MdlSubVersion 0 + SavedCharacterEncoding "UTF-8" + LibraryType "BlockLibrary" + SaveDefaultBlockParams on + ScopeRefreshTime 0.035000 + OverrideScopeRefreshTime on + DisableAllScopes off + MaxMDLFileLineLength 120 + Created "Thu Apr 8 11:30:49 2010" + Creator "elesc" + UpdateHistory "UpdateHistoryNever" + ModifiedByFormat "%" + LastModifiedBy "colin" + ModifiedDateFormat "%" + LastModifiedDate "Tue Sep 21 13:08:03 2010" + RTWModifiedTimeStamp 206975269 + ModelVersionFormat "1.%" + ConfigurationManager "None" + SampleTimeColors off + SampleTimeAnnotations off + LibraryLinkDisplay "none" + WideLines off + ShowLineDimensions off + ShowPortDataTypes off + ShowLoopsOnError on + IgnoreBidirectionalLines off + ShowStorageClass off + ShowTestPointIcons on + ShowSignalResolutionIcons on + ShowViewerIcons on + SortedOrder off + ExecutionContextIcon off + ShowLinearizationAnnotations on + BlockNameDataTip off + BlockParametersDataTip off + BlockDescriptionStringDataTip off + ToolBar on + StatusBar on + BrowserShowLibraryLinks off + BrowserLookUnderMasks off + SimulationMode "normal" + LinearizationMsg "none" + Profile off + ParamWorkspaceSource "MATLABWorkspace" + RecordCoverage off + CovSaveName "covdata" + CovMetricSettings "dw" + CovNameIncrementing off + CovHtmlReporting on + CovForceBlockReductionOff on + covSaveCumulativeToWorkspaceVar on + CovSaveSingleToWorkspaceVar on + CovCumulativeReport off + CovReportOnPause on + CovModelRefEnable "Off" + CovExternalEMLEnable off + ExtModeBatchMode off + ExtModeEnableFloating on + ExtModeTrigType "manual" + ExtModeTrigMode "normal" + ExtModeTrigPort "1" + ExtModeTrigElement "any" + ExtModeTrigDuration 1000 + ExtModeTrigDurationFloating "auto" + ExtModeTrigHoldOff 0 + ExtModeTrigDelay 0 + ExtModeTrigDirection "rising" + ExtModeTrigLevel 0 + ExtModeArchiveMode "off" + ExtModeAutoIncOneShot off + ExtModeIncDirWhenArm off + ExtModeAddSuffixToVar off + ExtModeWriteAllDataToWs off + ExtModeArmWhenConnect on + ExtModeSkipDownloadWhenConnect off + ExtModeLogAll on + ExtModeAutoUpdateStatusClock on + ShowModelReferenceBlockVersion off + ShowModelReferenceBlockIO off + Array { + Type "Handle" + Dimension 1 + Simulink.ConfigSet { + $ObjectID 1 + Version "1.10.0" + Array { + Type "Handle" + Dimension 8 + Simulink.SolverCC { + $ObjectID 2 + Version "1.10.0" + StartTime "0.0" + StopTime "10.0" + AbsTol "auto" + FixedStep "auto" + InitialStep "auto" + MaxNumMinSteps "-1" + MaxOrder 5 + ZcThreshold "auto" + ConsecutiveZCsStepRelTol "10*128*eps" + MaxConsecutiveZCs "1000" + ExtrapolationOrder 4 + NumberNewtonIterations 1 + MaxStep "auto" + MinStep "auto" + MaxConsecutiveMinStep "1" + RelTol "1e-3" + SolverMode "Auto" + Solver "ode45" + SolverName "ode45" + SolverJacobianMethodControl "auto" + ShapePreserveControl "DisableAll" + ZeroCrossControl "UseLocalSettings" + ZeroCrossAlgorithm "Nonadaptive" + AlgebraicLoopSolver "TrustRegion" + SolverResetMethod "Fast" + PositivePriorityOrder off + AutoInsertRateTranBlk off + SampleTimeConstraint "Unconstrained" + InsertRTBMode "Whenever possible" + } + Simulink.DataIOCC { + $ObjectID 3 + Version "1.10.0" + Decimation "1" + ExternalInput "[t, u]" + FinalStateName "xFinal" + InitialState "xInitial" + LimitDataPoints on + MaxDataPoints "1000" + LoadExternalInput off + LoadInitialState off + SaveFinalState off + SaveCompleteFinalSimState off + SaveFormat "Array" + SaveOutput on + SaveState off + SignalLogging on + DSMLogging on + InspectSignalLogs off + SaveTime on + ReturnWorkspaceOutputs off + StateSaveName "xout" + TimeSaveName "tout" + OutputSaveName "yout" + SignalLoggingName "logsout" + DSMLoggingName "dsmout" + OutputOption "RefineOutputTimes" + OutputTimes "[]" + ReturnWorkspaceOutputsName "out" + Refine "1" + } + Simulink.OptimizationCC { + $ObjectID 4 + Version "1.10.0" + Array { + Type "Cell" + Dimension 7 + Cell "BooleansAsBitfields" + Cell "PassReuseOutputArgsAs" + Cell "PassReuseOutputArgsThreshold" + Cell "ZeroExternalMemoryAtStartup" + Cell "ZeroInternalMemoryAtStartup" + Cell "OptimizeModelRefInitCode" + Cell "NoFixptDivByZeroProtection" + PropName "DisabledProps" + } + BlockReduction on + BooleanDataType on + ConditionallyExecuteInputs on + InlineParams off + UseIntDivNetSlope off + InlineInvariantSignals off + OptimizeBlockIOStorage on + BufferReuse on + EnhancedBackFolding off + StrengthReduction off + EnforceIntegerDowncast on + ExpressionFolding on + BooleansAsBitfields off + BitfieldContainerType "uint_T" + EnableMemcpy on + MemcpyThreshold 64 + PassReuseOutputArgsAs "Structure reference" + ExpressionDepthLimit 2147483647 + FoldNonRolledExpr on + LocalBlockOutputs on + RollThreshold 5 + SystemCodeInlineAuto off + StateBitsets off + DataBitsets off + UseTempVars off + ZeroExternalMemoryAtStartup on + ZeroInternalMemoryAtStartup on + InitFltsAndDblsToZero off + NoFixptDivByZeroProtection off + EfficientFloat2IntCast off + EfficientMapNaN2IntZero on + OptimizeModelRefInitCode off + LifeSpan "inf" + MaxStackSize "Inherit from target" + BufferReusableBoundary on + SimCompilerOptimization "Off" + AccelVerboseBuild off + } + Simulink.DebuggingCC { + $ObjectID 5 + Version "1.10.0" + RTPrefix "error" + ConsistencyChecking "none" + ArrayBoundsChecking "none" + SignalInfNanChecking "none" + SignalRangeChecking "none" + ReadBeforeWriteMsg "UseLocalSettings" + WriteAfterWriteMsg "UseLocalSettings" + WriteAfterReadMsg "UseLocalSettings" + AlgebraicLoopMsg "warning" + ArtificialAlgebraicLoopMsg "warning" + SaveWithDisabledLinksMsg "warning" + SaveWithParameterizedLinksMsg "warning" + CheckSSInitialOutputMsg on + UnderspecifiedInitializationDetection "Classic" + MergeDetectMultiDrivingBlocksExec "none" + CheckExecutionContextPreStartOutputMsg off + CheckExecutionContextRuntimeOutputMsg off + SignalResolutionControl "UseLocalSettings" + BlockPriorityViolationMsg "warning" + MinStepSizeMsg "warning" + TimeAdjustmentMsg "none" + MaxConsecutiveZCsMsg "error" + SolverPrmCheckMsg "warning" + InheritedTsInSrcMsg "warning" + DiscreteInheritContinuousMsg "warning" + MultiTaskDSMMsg "error" + MultiTaskCondExecSysMsg "error" + MultiTaskRateTransMsg "error" + SingleTaskRateTransMsg "none" + TasksWithSamePriorityMsg "warning" + SigSpecEnsureSampleTimeMsg "warning" + CheckMatrixSingularityMsg "none" + IntegerOverflowMsg "warning" + Int32ToFloatConvMsg "warning" + ParameterDowncastMsg "error" + ParameterOverflowMsg "error" + ParameterUnderflowMsg "none" + ParameterPrecisionLossMsg "warning" + ParameterTunabilityLossMsg "warning" + FixptConstUnderflowMsg "none" + FixptConstOverflowMsg "none" + FixptConstPrecisionLossMsg "none" + UnderSpecifiedDataTypeMsg "none" + UnnecessaryDatatypeConvMsg "none" + VectorMatrixConversionMsg "none" + InvalidFcnCallConnMsg "error" + FcnCallInpInsideContextMsg "Use local settings" + SignalLabelMismatchMsg "none" + UnconnectedInputMsg "warning" + UnconnectedOutputMsg "warning" + UnconnectedLineMsg "warning" + SFcnCompatibilityMsg "none" + UniqueDataStoreMsg "none" + BusObjectLabelMismatch "warning" + RootOutportRequireBusObject "warning" + AssertControl "UseLocalSettings" + EnableOverflowDetection off + ModelReferenceIOMsg "none" + ModelReferenceVersionMismatchMessage "none" + ModelReferenceIOMismatchMessage "none" + ModelReferenceCSMismatchMessage "none" + UnknownTsInhSupMsg "warning" + ModelReferenceDataLoggingMessage "warning" + ModelReferenceSymbolNameMessage "warning" + ModelReferenceExtraNoncontSigs "error" + StateNameClashWarn "warning" + SimStateInterfaceChecksumMismatchMsg "warning" + StrictBusMsg "Warning" + BusNameAdapt "WarnAndRepair" + NonBusSignalsTreatedAsBus "none" + LoggingUnavailableSignals "error" + BlockIODiagnostic "none" + } + Simulink.HardwareCC { + $ObjectID 6 + Version "1.10.0" + ProdBitPerChar 8 + ProdBitPerShort 16 + ProdBitPerInt 32 + ProdBitPerLong 32 + ProdIntDivRoundTo "Undefined" + ProdEndianess "Unspecified" + ProdWordSize 32 + ProdShiftRightIntArith on + ProdHWDeviceType "32-bit Generic" + TargetBitPerChar 8 + TargetBitPerShort 16 + TargetBitPerInt 32 + TargetBitPerLong 32 + TargetShiftRightIntArith on + TargetIntDivRoundTo "Undefined" + TargetEndianess "Unspecified" + TargetWordSize 32 + TargetTypeEmulationWarnSuppressLevel 0 + TargetPreprocMaxBitsSint 32 + TargetPreprocMaxBitsUint 32 + TargetHWDeviceType "Specified" + TargetUnknown off + ProdEqTarget on + } + Simulink.ModelReferenceCC { + $ObjectID 7 + Version "1.10.0" + UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" + CheckModelReferenceTargetMessage "error" + EnableParallelModelReferenceBuilds off + ParallelModelReferenceMATLABWorkerInit "None" + ModelReferenceNumInstancesAllowed "Multi" + PropagateVarSize "Infer from blocks in model" + ModelReferencePassRootInputsByReference on + ModelReferenceMinAlgLoopOccurrences off + PropagateSignalLabelsOutOfModel off + SupportModelReferenceSimTargetCustomCode off + } + Simulink.SFSimCC { + $ObjectID 8 + Version "1.10.0" + SFSimEnableDebug on + SFSimOverflowDetection on + SFSimEcho on + SimBlas on + SimCtrlC on + SimExtrinsic on + SimIntegrity on + SimUseLocalCustomCode off + SimBuildMode "sf_incremental_build" + } + Simulink.RTWCC { + $BackupClass "Simulink.RTWCC" + $ObjectID 9 + Version "1.10.0" + Array { + Type "Cell" + Dimension 6 + Cell "IncludeHyperlinkInReport" + Cell "GenerateTraceInfo" + Cell "GenerateTraceReport" + Cell "GenerateTraceReportSl" + Cell "GenerateTraceReportSf" + Cell "GenerateTraceReportEml" + PropName "DisabledProps" + } + SystemTargetFile "grt.tlc" + GenCodeOnly off + MakeCommand "make_rtw" + GenerateMakefile on + TemplateMakefile "grt_default_tmf" + GenerateReport off + SaveLog off + RTWVerbose on + RetainRTWFile off + ProfileTLC off + TLCDebug off + TLCCoverage off + TLCAssert off + ProcessScriptMode "Default" + ConfigurationMode "Optimized" + ConfigAtBuild off + RTWUseLocalCustomCode off + RTWUseSimCustomCode off + IncludeHyperlinkInReport off + LaunchReport off + TargetLang "C" + IncludeBusHierarchyInRTWFileBlockHierarchyMap off + IncludeERTFirstTime off + GenerateTraceInfo off + GenerateTraceReport off + GenerateTraceReportSl off + GenerateTraceReportSf off + GenerateTraceReportEml off + GenerateCodeInfo off + RTWCompilerOptimization "Off" + CheckMdlBeforeBuild "Off" + CustomRebuildMode "OnUpdate" + Array { + Type "Handle" + Dimension 2 + Simulink.CodeAppCC { + $ObjectID 10 + Version "1.10.0" + Array { + Type "Cell" + Dimension 19 + Cell "IgnoreCustomStorageClasses" + Cell "IgnoreTestpoints" + Cell "InsertBlockDesc" + Cell "SFDataObjDesc" + Cell "SimulinkDataObjDesc" + Cell "DefineNamingRule" + Cell "SignalNamingRule" + Cell "ParamNamingRule" + Cell "InlinedPrmAccess" + Cell "CustomSymbolStr" + Cell "CustomSymbolStrGlobalVar" + Cell "CustomSymbolStrType" + Cell "CustomSymbolStrField" + Cell "CustomSymbolStrFcn" + Cell "CustomSymbolStrFcnArg" + Cell "CustomSymbolStrBlkIO" + Cell "CustomSymbolStrTmpVar" + Cell "CustomSymbolStrMacro" + Cell "ReqsInCode" + PropName "DisabledProps" + } + ForceParamTrailComments off + GenerateComments on + IgnoreCustomStorageClasses on + IgnoreTestpoints off + IncHierarchyInIds off + MaxIdLength 31 + PreserveName off + PreserveNameWithParent off + ShowEliminatedStatement off + IncAutoGenComments off + SimulinkDataObjDesc off + SFDataObjDesc off + IncDataTypeInIds off + MangleLength 1 + CustomSymbolStrGlobalVar "$R$N$M" + CustomSymbolStrType "$N$R$M" + CustomSymbolStrField "$N$M" + CustomSymbolStrFcn "$R$N$M$F" + CustomSymbolStrFcnArg "rt$I$N$M" + CustomSymbolStrBlkIO "rtb_$N$M" + CustomSymbolStrTmpVar "$N$M" + CustomSymbolStrMacro "$R$N$M" + DefineNamingRule "None" + ParamNamingRule "None" + SignalNamingRule "None" + InsertBlockDesc off + SimulinkBlockComments on + EnableCustomComments off + InlinedPrmAccess "Literals" + ReqsInCode off + UseSimReservedNames off + } + Simulink.GRTTargetCC { + $BackupClass "Simulink.TargetCC" + $ObjectID 11 + Version "1.10.0" + Array { + Type "Cell" + Dimension 17 + Cell "GeneratePreprocessorConditionals" + Cell "IncludeMdlTerminateFcn" + Cell "CombineOutputUpdateFcns" + Cell "SuppressErrorStatus" + Cell "ERTCustomFileBanners" + Cell "GenerateSampleERTMain" + Cell "GenerateTestInterfaces" + Cell "ModelStepFunctionPrototypeControlCompliant" + Cell "CPPClassGenCompliant" + Cell "MultiInstanceERTCode" + Cell "PurelyIntegerCode" + Cell "SupportNonFinite" + Cell "SupportComplex" + Cell "SupportAbsoluteTime" + Cell "SupportContinuousTime" + Cell "SupportNonInlinedSFcns" + Cell "PortableWordSizes" + PropName "DisabledProps" + } + TargetFcnLib "ansi_tfl_table_tmw.mat" + TargetLibSuffix "" + TargetPreCompLibLocation "" + TargetFunctionLibrary "ANSI_C" + UtilityFuncGeneration "Auto" + ERTMultiwordTypeDef "System defined" + ERTCodeCoverageTool "None" + ERTMultiwordLength 256 + MultiwordLength 2048 + GenerateFullHeader on + GenerateSampleERTMain off + GenerateTestInterfaces off + IsPILTarget off + ModelReferenceCompliant on + ParMdlRefBuildCompliant on + CompOptLevelCompliant on + IncludeMdlTerminateFcn on + GeneratePreprocessorConditionals "Disable all" + CombineOutputUpdateFcns off + SuppressErrorStatus off + ERTFirstTimeCompliant off + IncludeFileDelimiter "Auto" + ERTCustomFileBanners off + SupportAbsoluteTime on + LogVarNameModifier "rt_" + MatFileLogging on + MultiInstanceERTCode off + SupportNonFinite on + SupportComplex on + PurelyIntegerCode off + SupportContinuousTime on + SupportNonInlinedSFcns on + SupportVariableSizeSignals off + EnableShiftOperators on + ParenthesesLevel "Nominal" + PortableWordSizes off + ModelStepFunctionPrototypeControlCompliant off + CPPClassGenCompliant off + AutosarCompliant off + UseMalloc off + ExtMode off + ExtModeStaticAlloc off + ExtModeTesting off + ExtModeStaticAllocSize 1000000 + ExtModeTransport 0 + ExtModeMexFile "ext_comm" + ExtModeIntrfLevel "Level1" + RTWCAPISignals off + RTWCAPIParams off + RTWCAPIStates off + GenerateASAP2 off + } + PropName "Components" + } + } + PropName "Components" + } + Name "Configuration" + CurrentDlgPage "Solver" + ConfigPrmDlgPosition " [ 200, 74, 1080, 704 ] " + } + PropName "ConfigurationSets" + } + BlockDefaults { + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + NamePlacement "normal" + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + ShowName on + BlockRotation 0 + BlockMirror off + } + AnnotationDefaults { + HorizontalAlignment "center" + VerticalAlignment "middle" + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + UseDisplayTextAsClickCallback off + } + LineDefaults { + FontName "Helvetica" + FontSize 9 + FontWeight "normal" + FontAngle "normal" + } + BlockParameterDefaults { + Block { + BlockType Inport + Port "1" + UseBusObject off + BusObject "BusObject" + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + OutMin "[]" + OutMax "[]" + DataType "auto" + OutDataType "fixdt(1,16,0)" + OutScaling "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + SignalType "auto" + SamplingMode "auto" + LatchByDelayingOutsideSignal off + LatchInputForFeedbackSignals off + Interpolate on + } + Block { + BlockType SubSystem + ShowPortLabels "FromPortIcon" + Permissions "ReadWrite" + PermitHierarchicalResolution "All" + TreatAsAtomicUnit off + CheckFcnCallInpInsideContextMsg off + SystemSampleTime "-1" + RTWFcnNameOpts "Auto" + RTWFileNameOpts "Auto" + RTWMemSecFuncInitTerm "Inherit from model" + RTWMemSecFuncExecute "Inherit from model" + RTWMemSecDataConstants "Inherit from model" + RTWMemSecDataInternal "Inherit from model" + RTWMemSecDataParameters "Inherit from model" + SimViewingDevice off + DataTypeOverride "UseLocalSettings" + MinMaxOverflowLogging "UseLocalSettings" + } + } + System { + Name "TableLibrary" + Location [193, 302, 773, 562] + Open on + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + ReportName "simulink-default.rpt" + SIDHighWatermark 8 + Block { + BlockType SubSystem + Name "Tabular Expression" + SID 1 + Ports [1] + Position [70, 32, 235, 98] + CopyFcn "TTdiag Copy" + DeleteFcn "TTdiag Delete" + OpenFcn "TTdiag Open Simulink" + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + MaskDescription "Table Block" + MaskDisplay "port_label('input',1,'Input');\ntext(0.5,0.6,'Tabular Expression', 'horizontalAlignment', 'ce" + "nter')\ncolor('red')\ntext(0.5,0.4,'Not Checked', 'horizontalAlignment', 'center')" + MaskIconFrame on + MaskIconOpaque on + MaskIconRotate "none" + MaskPortRotate "default" + MaskIconUnits "normalized" + System { + Name "Tabular Expression" + Location [433, 447, 931, 747] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + Block { + BlockType Inport + Name "In1" + SID 2 + Position [110, 103, 140, 117] + IconDisplay "Port number" + OutDataType "fixdt(1, 16)" + OutScaling "2^0" + } + } + } + } +} diff --git a/demo_1.slx b/demo_1.slx new file mode 100644 index 0000000000000000000000000000000000000000..aba118964349cdc219326733f6a25b7c27ad38b0 Binary files /dev/null and b/demo_1.slx differ diff --git a/demo_table.cvc b/demo_table.cvc new file mode 100644 index 0000000000000000000000000000000000000000..b36de2417eadba8f2587ebdc695365e114965b21 --- /dev/null +++ b/demo_table.cvc @@ -0,0 +1,13 @@ +x:REAL; +ECHO "begin1"; +PUSH; +QUERY (NOT ( (x>1) AND (x<1) ) AND +NOT ( (x>1) AND (x = 1) ) AND +NOT ( (x<1) AND (x = 1) )); +POP; +ECHO "end1"; +ECHO "begin2"; +PUSH; +QUERY ((x>1) OR (x<1) OR (x = 1)); +POP; +ECHO "end2"; diff --git a/f.cvc b/f.cvc new file mode 100644 index 0000000000000000000000000000000000000000..d0499af6b3c14d090175a9a1f4e53bfc07467958 --- /dev/null +++ b/f.cvc @@ -0,0 +1,24 @@ +x:REAL; +y:REAL; +ECHO "begin1"; +PUSH; +QUERY (NOT ( (y<0) AND (y = 0) ) AND +NOT ( (y<0) AND (y>0) ) AND +NOT ( (y = 0) AND (y>0) )); +POP; +ECHO "end1"; +ECHO "begin2"; +PUSH; +QUERY ((y<0) OR (y = 0) OR (y>0)); +POP; +ECHO "end2"; +ECHO "begin3"; +PUSH; +QUERY (NOT ( (x<=1) AND (x>1) )); +POP; +ECHO "end3"; +ECHO "begin4"; +PUSH; +QUERY ((x<=1) OR (x>1)); +POP; +ECHO "end4"; diff --git a/jin_ex.cvc b/jin_ex.cvc new file mode 100644 index 0000000000000000000000000000000000000000..29a8da1a34783cab3d30d1aad55e411ac7f42433 --- /dev/null +++ b/jin_ex.cvc @@ -0,0 +1,26 @@ +x:REAL; +y:REAL; +ECHO "begin1"; +PUSH; +QUERY (NOT ( (y<0) AND (y = 0) ) AND +NOT ( (y<0) AND (y>0) ) AND +NOT ( (y = 0) AND (y>0) )); +POP; +ECHO "end1"; +ECHO "begin2"; +PUSH; +QUERY ((y<0) OR (y = 0) OR (y>0)); +POP; +ECHO "end2"; +ECHO "begin3"; +PUSH; +QUERY (NOT ( (x<0) AND (x = 0) ) AND +NOT ( (x<0) AND (x>0) ) AND +NOT ( (x = 0) AND (x>0) )); +POP; +ECHO "end3"; +ECHO "begin4"; +PUSH; +QUERY ((x<0) OR (x = 0) OR (x>0)); +POP; +ECHO "end4"; diff --git a/slprj/_jitprj/sqY5Getm4iZJ4IFucNwUcyB.l b/slprj/_jitprj/sqY5Getm4iZJ4IFucNwUcyB.l new file mode 100644 index 0000000000000000000000000000000000000000..3eb60f9c3227aba8749ff462030b31e5a45d76f9 Binary files /dev/null and b/slprj/_jitprj/sqY5Getm4iZJ4IFucNwUcyB.l differ diff --git a/slprj/_jitprj/sqY5Getm4iZJ4IFucNwUcyB.mat b/slprj/_jitprj/sqY5Getm4iZJ4IFucNwUcyB.mat new file mode 100644 index 0000000000000000000000000000000000000000..f809256696de2312b68179d163ffd1eea90e0ffc Binary files /dev/null and b/slprj/_jitprj/sqY5Getm4iZJ4IFucNwUcyB.mat differ diff --git a/slprj/_sfprj/EMLReport/sqY5Getm4iZJ4IFucNwUcyB.mat b/slprj/_sfprj/EMLReport/sqY5Getm4iZJ4IFucNwUcyB.mat new file mode 100644 index 0000000000000000000000000000000000000000..6a37be6757b3b860a74d6f62ecf79d41d24e647d Binary files /dev/null and b/slprj/_sfprj/EMLReport/sqY5Getm4iZJ4IFucNwUcyB.mat differ diff --git a/slprj/_sfprj/precompile/BowI5YMW1AWxfhCwnohcRB.mat b/slprj/_sfprj/precompile/BowI5YMW1AWxfhCwnohcRB.mat new file mode 100644 index 0000000000000000000000000000000000000000..148b09956bc7513f2afc536367c87d45e30f6086 Binary files /dev/null and b/slprj/_sfprj/precompile/BowI5YMW1AWxfhCwnohcRB.mat differ diff --git a/slprj/_sfprj/untitled/_self/sfun/info/binfo.mat b/slprj/_sfprj/untitled/_self/sfun/info/binfo.mat new file mode 100644 index 0000000000000000000000000000000000000000..336edac76297b834169276be76029183443c0a01 Binary files /dev/null and b/slprj/_sfprj/untitled/_self/sfun/info/binfo.mat differ diff --git a/slprj/_sfprj/untitled/amsi_serial.mat b/slprj/_sfprj/untitled/amsi_serial.mat new file mode 100644 index 0000000000000000000000000000000000000000..ca5b1b9f6cca2e3496f19472637c8b7d679b0991 Binary files /dev/null and b/slprj/_sfprj/untitled/amsi_serial.mat differ diff --git a/untitled1.slx b/untitled1.slx new file mode 100644 index 0000000000000000000000000000000000000000..8d1da3e040d6538399728da1317d358859e411a9 Binary files /dev/null and b/untitled1.slx differ