From 8b60b4e8a670b580116e59f9dedce8b08d84bc20 Mon Sep 17 00:00:00 2001 From: Ricky Reusser Date: Mon, 23 Oct 2017 17:05:36 -0700 Subject: [PATCH 01/43] Mirror point selection in graph data --- src/plots/cartesian/select.js | 45 +++++++++++ src/traces/scatter/attributes.js | 104 ++++++++++++++++++++++++++ test/image/mocks/point-selection.json | 49 ++++++++++++ test/jasmine/tests/select_test.js | 38 ++++++++++ 4 files changed, 236 insertions(+) create mode 100644 test/image/mocks/point-selection.json diff --git a/src/plots/cartesian/select.js b/src/plots/cartesian/select.js index 98afbcd5e84..ed6fd7880cd 100644 --- a/src/plots/cartesian/select.js +++ b/src/plots/cartesian/select.js @@ -201,7 +201,11 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { else selection = thisSelection; } + eventData = {points: selection}; + + updateSelectionState(gd, eventData); + fillRangeItems(eventData, poly, pts); dragOptions.gd.emit('plotly_selecting', eventData); } @@ -221,15 +225,56 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { searchInfo.selectPoints(searchInfo, false); } + updateSelectionState(gd, {points: []}); + gd.emit('plotly_deselect', null); } else { + updateSelectionState(gd, eventData); + dragOptions.gd.emit('plotly_selected', eventData); } }); }; }; +function updateSelectionState(gd, eventData) { + var i, pt, trace, fullTrace; + var data = gd.data; + var fullData = gd._fullData; + + // Remove existing from data: + for(i = 0; i < data.length; i++) { + if(data[i].selectedpoints) delete data[i].selectedpoints; + } + + // Remove existing from fullData: + for(i = 0; i < fullData.length; i++) { + if(fullData[i].selectedpoints) delete fullData[i].selectedpoints; + } + + if(!eventData || !eventData.points) { + return; + } + + var pts = eventData.points; + for(i = 0; i < pts.length; i++) { + pt = pts[i]; + trace = pt.data; + fullTrace = pt.fullData; + + if(!trace.selectedpoints) { + trace.selectedpoints = []; + } + trace.selectedpoints.push(pt.pointNumber); + + if(!fullTrace.selectedpoints) { + fullTrace.selectedpoints = []; + } + fullTrace.selectedpoints.push(pt.pointNumber); + } +} + function fillSelectionItem(selection, searchInfo) { if(Array.isArray(selection)) { var trace = searchInfo.cd[0].trace; diff --git a/src/traces/scatter/attributes.js b/src/traces/scatter/attributes.js index 4b719db4a9a..b6843e04a09 100644 --- a/src/traces/scatter/attributes.js +++ b/src/traces/scatter/attributes.js @@ -377,6 +377,110 @@ module.exports = { }, colorAttributes('marker') ), + selected: { + marker: extendFlat({ + opacity: { + valType: 'number', + min: 0, + max: 1, + arrayOk: true, + role: 'style', + editType: 'style', + description: 'Sets the marker opacity of selected points.' + }, + size: { + valType: 'number', + min: 0, + dflt: 6, + arrayOk: true, + role: 'style', + editType: 'calcIfAutorange', + description: 'Sets the marker size (in px) of selected points.' + }, + line: extendFlat({ + width: { + valType: 'number', + min: 0, + arrayOk: true, + role: 'style', + editType: 'style', + description: 'Sets the width (in px) of the lines bounding selected marker points.' + }, + editType: 'calc' + }, + colorAttributes('marker.line') + ), + editType: 'calc' + }, + colorAttributes('marker') + ) + }, + unselected: { + marker: extendFlat({ + opacity: { + valType: 'number', + min: 0, + max: 1, + arrayOk: true, + role: 'style', + editType: 'style', + description: 'Sets the marker opacity of unselected points, applied only when a selection exists.' + }, + size: { + valType: 'number', + min: 0, + dflt: 6, + arrayOk: true, + role: 'style', + editType: 'calcIfAutorange', + description: 'Sets the marker size (in px) of unselected points.' + }, + line: extendFlat({ + width: { + valType: 'number', + min: 0, + arrayOk: true, + role: 'style', + editType: 'style', + description: 'Sets the width (in px) of the lines bounding unselected marker points.' + }, + editType: 'calc' + }, + colorAttributes('marker.line') + ), + editType: 'calc' + }, + colorAttributes('marker') + ) + }, + selectedpoints: { + valType: 'data_array', + role: 'info', + arrayOk: true, + editType: 'calc', + description: 'Integer index of selected points.', + }, + selectedids: { + valType: 'data_array', + role: 'info', + arrayOk: true, + editType: 'calc', + description: 'ID of selected points.', + }, + hoverpoints: { + valType: 'data_array', + role: 'info', + arrayOk: true, + editType: 'calc', + description: 'Integer index of hovered points.', + }, + hoverids: { + valType: 'data_array', + role: 'info', + arrayOk: true, + editType: 'calc', + description: 'ID of hovered points.', + }, textposition: { valType: 'enumerated', values: [ diff --git a/test/image/mocks/point-selection.json b/test/image/mocks/point-selection.json new file mode 100644 index 00000000000..c6e6af1939f --- /dev/null +++ b/test/image/mocks/point-selection.json @@ -0,0 +1,49 @@ +{ + "data": [{ + "x": [1, 2, 3, 4, 5, 6], + "y": [1, 3, 2, 4, 5, 7], + "ids": ["a", "b", "c", "d", "e", "f"], + "marker": { + "color": "red", + "size": 12 + }, + "selected": { + "marker": { + "color": "blue", + "size": 24 + } + }, + "unselected": { + "marker": { + "color": "green", + "size": 6, + "opacity": 0.5 + } + } + }, { + "x": [1, 2, 3, 4, 5, 6], + "y": [6, 5, 6, 5, 4, 3], + "ids": ["a", "b", "c", "d", "e", "f"], + "marker": { + "color": "blue", + "size": 12 + }, + "selected": { + "marker": { + "color": "blue", + "size": 24 + } + }, + "unselected": { + "marker": { + "color": "green", + "size": 6, + "opacity": 0.5 + } + } + }], + "layout": { + "dragmode": "lasso" + } +} + diff --git a/test/jasmine/tests/select_test.js b/test/jasmine/tests/select_test.js index 72f29593e3f..b99cbed4811 100644 --- a/test/jasmine/tests/select_test.js +++ b/test/jasmine/tests/select_test.js @@ -261,6 +261,44 @@ describe('Test select box and lasso in general:', function() { .then(done); }); + it('should set selected points in graph data', function(done) { + resetEvents(gd); + + drag(lassoPath); + + selectedPromise.then(function() { + expect(selectingCnt).toBe(3, 'with the correct selecting count'); + expect(gd.data[0].selectedpoints).toEqual([10]); + + return doubleClick(250, 200); + }) + .then(deselectPromise) + .then(function() { + expect(gd.data[0].selectedpoints).toBeUndefined(); + }) + .catch(fail) + .then(done); + }); + + it('should set selected points in full data', function(done) { + resetEvents(gd); + + drag(lassoPath); + + selectedPromise.then(function() { + expect(selectingCnt).toBe(3, 'with the correct selecting count'); + expect(gd._fullData[0].selectedpoints).toEqual([10]); + + return doubleClick(250, 200); + }) + .then(deselectPromise) + .then(function() { + expect(gd._fullData[0].selectedpoints).toBeUndefined(); + }) + .catch(fail) + .then(done); + }); + it('should trigger selecting/selected/deselect events for touches', function(done) { resetEvents(gd); From b209a553ba6df14e9625c949339ef8f5a194bfee Mon Sep 17 00:00:00 2001 From: Ricky Reusser Date: Wed, 25 Oct 2017 09:38:21 -0700 Subject: [PATCH 02/43] Partial stateful select --- src/plots/cartesian/select.js | 18 ++++-- .../scatter/apply_selection_to_calcdata.js | 41 ++++++++++++++ src/traces/scatter/attributes.js | 21 +++---- src/traces/scatter/calc.js | 7 +++ src/traces/scatter/defaults.js | 3 + src/traces/scatter/interaction_defaults.js | 56 +++++++++++++++++++ src/traces/scatter/marker_defaults.js | 9 +++ test/image/mocks/point-selection.json | 17 +++++- 8 files changed, 154 insertions(+), 18 deletions(-) create mode 100644 src/traces/scatter/apply_selection_to_calcdata.js create mode 100644 src/traces/scatter/interaction_defaults.js diff --git a/src/plots/cartesian/select.js b/src/plots/cartesian/select.js index ed6fd7880cd..f855d5ccf7a 100644 --- a/src/plots/cartesian/select.js +++ b/src/plots/cartesian/select.js @@ -204,10 +204,15 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { eventData = {points: selection}; - updateSelectionState(gd, eventData); + updatedSelectedState(gd, eventData); fillRangeItems(eventData, poly, pts); dragOptions.gd.emit('plotly_selecting', eventData); + + var bpms = gd._fullLayout._basePlotModules; + for (var i = 0; i < bpms.length; i++) { + bpms[i].plot(gd, null, {duration: 0}); + } } ); }; @@ -225,20 +230,25 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { searchInfo.selectPoints(searchInfo, false); } - updateSelectionState(gd, {points: []}); + updatedSelectedState(gd, {points: []}); gd.emit('plotly_deselect', null); } else { - updateSelectionState(gd, eventData); + updatedSelectedState(gd, eventData); dragOptions.gd.emit('plotly_selected', eventData); } + + var bpms = gd._fullLayout._basePlotModules; + for (var i = 0; i < bpms.length; i++) { + bpms[i].plot(gd, null, {duration: 0}); + } }); }; }; -function updateSelectionState(gd, eventData) { +function updatedSelectedState(gd, eventData) { var i, pt, trace, fullTrace; var data = gd.data; var fullData = gd._fullData; diff --git a/src/traces/scatter/apply_selection_to_calcdata.js b/src/traces/scatter/apply_selection_to_calcdata.js new file mode 100644 index 00000000000..943f1ac9bb0 --- /dev/null +++ b/src/traces/scatter/apply_selection_to_calcdata.js @@ -0,0 +1,41 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + + +'use strict'; + +module.exports = function applySelectionToCalcdata (cd) { + var i; + console.log('cd:', cd); + + var trace = cd[0].t; + console.log('trace:', trace); + + var selectedpoints = trace.selectedpoints; + var selectedids = trace.selectedids; + + if (!selectedpoints) { + return; + } + + var selectedPointIndex = {}; + for (i = 0; i < selectedpoints.length; i++) { + selectedPointIndex[selectedpoints[i]] = true; + } + + for (i = 0; i < cd.length; i++) { + var pt = cd[i]; + + if (!selectedpoints) { + delete pt.selected; + } else { + pt.selected = !!selectedPointIndex[i]; + } + } + +} diff --git a/src/traces/scatter/attributes.js b/src/traces/scatter/attributes.js index b6843e04a09..2ffca513829 100644 --- a/src/traces/scatter/attributes.js +++ b/src/traces/scatter/attributes.js @@ -421,6 +421,7 @@ module.exports = { valType: 'number', min: 0, max: 1, + dflt: 0.5, arrayOk: true, role: 'style', editType: 'style', @@ -454,32 +455,28 @@ module.exports = { ) }, selectedpoints: { - valType: 'data_array', + valType: 'any', role: 'info', - arrayOk: true, editType: 'calc', - description: 'Integer index of selected points.', + description: 'Array containing integer indices of selected points.', }, selectedids: { - valType: 'data_array', + valType: 'any', role: 'info', - arrayOk: true, editType: 'calc', - description: 'ID of selected points.', + description: 'Array containing `ids` of selected points.', }, hoverpoints: { - valType: 'data_array', + valType: 'any', role: 'info', - arrayOk: true, editType: 'calc', - description: 'Integer index of hovered points.', + description: 'Array containing integer indices of hovered points.', }, hoverids: { - valType: 'data_array', + valType: 'any', role: 'info', - arrayOk: true, editType: 'calc', - description: 'ID of hovered points.', + description: 'Array containing `ids` of hovered points.', }, textposition: { valType: 'enumerated', diff --git a/src/traces/scatter/calc.js b/src/traces/scatter/calc.js index e5c64209128..70d9f744413 100644 --- a/src/traces/scatter/calc.js +++ b/src/traces/scatter/calc.js @@ -17,6 +17,7 @@ var BADNUM = require('../../constants/numerical').BADNUM; var subTypes = require('./subtypes'); var calcColorscale = require('./colorscale_calc'); var arraysToCalcdata = require('./arrays_to_calcdata'); +var applySelectionToCalcdata = require('./apply_selection_to_calcdata'); module.exports = function calc(gd, trace) { @@ -31,6 +32,10 @@ module.exports = function calc(gd, trace) { s, i; + var selectedPointIndex = {}; + var hoverPointIndex = {}; + var idIndex; + // cancel minimum tick spacings (only applies to bars and boxes) xa._minDtick = 0; ya._minDtick = 0; @@ -124,6 +129,8 @@ module.exports = function calc(gd, trace) { arraysToCalcdata(cd, trace); + applySelectionToCalcdata(cd); + gd.firstscatter = false; return cd; }; diff --git a/src/traces/scatter/defaults.js b/src/traces/scatter/defaults.js index 9699469615f..79660495533 100644 --- a/src/traces/scatter/defaults.js +++ b/src/traces/scatter/defaults.js @@ -21,6 +21,7 @@ var handleLineShapeDefaults = require('./line_shape_defaults'); var handleTextDefaults = require('./text_defaults'); var handleFillColorDefaults = require('./fillcolor_defaults'); var errorBarsSupplyDefaults = require('../../components/errorbars/defaults'); +var handleInteractionDefaults = require('./interaction_defaults'); module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { @@ -40,6 +41,8 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('hovertext'); coerce('mode', defaultMode); + handleInteractionDefaults(traceIn, traceOut, coerce); + if(subTypes.hasLines(traceOut)) { handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce); handleLineShapeDefaults(traceIn, traceOut, coerce); diff --git a/src/traces/scatter/interaction_defaults.js b/src/traces/scatter/interaction_defaults.js new file mode 100644 index 00000000000..9780b871d60 --- /dev/null +++ b/src/traces/scatter/interaction_defaults.js @@ -0,0 +1,56 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + + +'use strict'; + +var Lib = require('../../lib'); +var isNumeric = require('fast-isnumeric'); + +module.exports = function supplyInteractionDefaults (traceIn, traceOut, coerce) { + + function coerceInteractionDefault(attr, containsNumbers) { + var i, arr; + + if (!Array.isArray(traceIn[attr])) { + return; + } + coerce(attr); + + arr = traceOut[attr]; + + console.log('arr:', arr); + + if (containsNumbers) { + for (i = arr.length - 1; i >= 0; i--) { + if (!isNumeric(arr[i])) { + arr.splice(i, 1); + } else { + arr[i] = +arr[i]; + } + } + } else { // only other implemented is integer: + for (i = arr.length - 1; i >= 0; i--) { + if (!arr[i]) { + arr.splice(i, 1); + } else { + arr[i] = String(arr[i]); + } + } + } + + if (arr.length === 0) { + delete traceOut[attr]; + } + } + + coerceInteractionDefault('selectedpoints', true); + coerceInteractionDefault('selectedids'); + coerceInteractionDefault('hoverpoints', true); + coerceInteractionDefault('hoverids'); +}; diff --git a/src/traces/scatter/marker_defaults.js b/src/traces/scatter/marker_defaults.js index caf679bd35f..6a2af652a12 100644 --- a/src/traces/scatter/marker_defaults.js +++ b/src/traces/scatter/marker_defaults.js @@ -39,6 +39,15 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: 'marker.', cLetter: 'c'}); } + coerce('selected.marker.opacity', isBubble ? 0.7 : 1); + coerce('unselected.marker.opacity', 0.5); + + coerce('selected.marker.color', defaultColor); + coerce('unselected.marker.color', defaultColor); + + coerce('selected.marker.size') + coerce('unselected.marker.size') + if(!opts.noLine) { // if there's a line with a different color than the marker, use // that line color as the default marker line color diff --git a/test/image/mocks/point-selection.json b/test/image/mocks/point-selection.json index c6e6af1939f..0e9986b4586 100644 --- a/test/image/mocks/point-selection.json +++ b/test/image/mocks/point-selection.json @@ -7,6 +7,7 @@ "color": "red", "size": 12 }, + "selectedpoints": [1, 2, 3], "selected": { "marker": { "color": "blue", @@ -19,7 +20,13 @@ "size": 6, "opacity": 0.5 } - } + }, + "transforms": [{ + "type": "filter", + "target": "x", + "operation": "][", + "value": [3.5, 4.5] + }] }, { "x": [1, 2, 3, 4, 5, 6], "y": [6, 5, 6, 5, 4, 3], @@ -40,7 +47,13 @@ "size": 6, "opacity": 0.5 } - } + }, + "transforms": [{ + "type": "filter", + "target": "x", + "operation": "][", + "value": [3.5, 4.5] + }] }], "layout": { "dragmode": "lasso" From 6903d31ff5a4f03b1e74b7c8af934ba6548ee177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 15:48:34 -0400 Subject: [PATCH 03/43] remove we won't do in this PR - namely, hoveredpoints, marker.size and marker.lin selected/unselected attributes. --- src/traces/scatter/attributes.js | 92 +++++++++++--------------------- 1 file changed, 31 insertions(+), 61 deletions(-) diff --git a/src/traces/scatter/attributes.js b/src/traces/scatter/attributes.js index 2ffca513829..fb9611131c4 100644 --- a/src/traces/scatter/attributes.js +++ b/src/traces/scatter/attributes.js @@ -378,82 +378,61 @@ module.exports = { colorAttributes('marker') ), selected: { - marker: extendFlat({ + marker: { opacity: { valType: 'number', min: 0, max: 1, - arrayOk: true, role: 'style', editType: 'style', description: 'Sets the marker opacity of selected points.' }, - size: { - valType: 'number', - min: 0, - dflt: 6, - arrayOk: true, + color: { + valType: 'color', role: 'style', - editType: 'calcIfAutorange', - description: 'Sets the marker size (in px) of selected points.' + editType: 'style', + description: 'Sets the marker color of selected points.' }, - line: extendFlat({ - width: { - valType: 'number', - min: 0, - arrayOk: true, - role: 'style', - editType: 'style', - description: 'Sets the width (in px) of the lines bounding selected marker points.' - }, - editType: 'calc' + editType: 'style' + }, + textfont: { + color: { + valType: 'color', + role: 'style', + editType: 'style', + description: 'Sets the text font color of selected points.' }, - colorAttributes('marker.line') - ), - editType: 'calc' + editType: 'style' }, - colorAttributes('marker') - ) + editType: 'style' }, unselected: { - marker: extendFlat({ + marker: { opacity: { valType: 'number', min: 0, max: 1, - dflt: 0.5, - arrayOk: true, role: 'style', editType: 'style', description: 'Sets the marker opacity of unselected points, applied only when a selection exists.' }, - size: { - valType: 'number', - min: 0, - dflt: 6, - arrayOk: true, + color: { + valType: 'color', role: 'style', - editType: 'calcIfAutorange', - description: 'Sets the marker size (in px) of unselected points.' + editType: 'style', + description: 'Sets the marker color of unselected points, applied only when a selection exists.' }, - line: extendFlat({ - width: { - valType: 'number', - min: 0, - arrayOk: true, - role: 'style', - editType: 'style', - description: 'Sets the width (in px) of the lines bounding unselected marker points.' - }, - editType: 'calc' + editType: 'style' + }, + textfont: { + color: { + valType: 'color', + role: 'style', + editType: 'style', + description: 'Sets the text font color of unselected points, applied only when a selection exists.' }, - colorAttributes('marker.line') - ), - editType: 'calc' + editType: 'style' }, - colorAttributes('marker') - ) - }, selectedpoints: { valType: 'any', role: 'info', @@ -466,18 +445,9 @@ module.exports = { editType: 'calc', description: 'Array containing `ids` of selected points.', }, - hoverpoints: { - valType: 'any', - role: 'info', - editType: 'calc', - description: 'Array containing integer indices of hovered points.', - }, - hoverids: { - valType: 'any', - role: 'info', - editType: 'calc', - description: 'Array containing `ids` of hovered points.', + editType: 'style' }, + textposition: { valType: 'enumerated', values: [ From 3ef323f5f2eee83a0cc8290b9b4ef55486cbc2cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 15:51:30 -0400 Subject: [PATCH 04/43] mv 'selectedpoints' & 'selectedids' to global trace attrs/defaults - and coerce if module's `selectPoints` method exists - don't dive into `selectedpoints` array (leave that for calc, later). --- src/plots/attributes.js | 29 +++++++++++ src/plots/plots.js | 5 ++ src/traces/scatter/attributes.js | 12 ----- src/traces/scatter/defaults.js | 4 -- src/traces/scatter/interaction_defaults.js | 56 ---------------------- 5 files changed, 34 insertions(+), 72 deletions(-) delete mode 100644 src/traces/scatter/interaction_defaults.js diff --git a/src/plots/attributes.js b/src/plots/attributes.js index 40c36be371c..575b194e811 100644 --- a/src/plots/attributes.js +++ b/src/plots/attributes.js @@ -94,6 +94,35 @@ module.exports = { 'DOM elements' ].join(' ') }, + + // N.B. these cannot be 'data_array' as they do not have the same length as + // other data arrays and arrayOk attributes in general + // + // TODO maybe add another valType: + // https://github.com/plotly/plotly.js/issues/1894 + selectedpoints: { + valType: 'any', + role: 'info', + editType: 'calc', + description: [ + 'Array containing integer indices of selected points.', + 'Has an effect only for traces that support selections.', + 'Note that an empty array means an empty selection where the `unselected`', + 'are turned on for all points, whereas, any other non-array values means no', + 'selection all where the `selected` and `unselected` styles have no effect.' + ].join(' ') + }, + selectedids: { + valType: 'any', + role: 'info', + editType: 'calc', + description: [ + 'Array containing `ids` of selected points.', + 'Has an effect only for traces that support selections.', + '...' + ].join(' ') + }, + hoverinfo: { valType: 'flaglist', role: 'info', diff --git a/src/plots/plots.js b/src/plots/plots.js index 7e0973196f6..2618f0593af 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -1022,6 +1022,11 @@ plots.supplyTraceDefaults = function(traceIn, traceOutIndex, layout, traceInInde traceOut.visible = !!traceOut.visible; } + if(_module && _module.selectPoints) { + coerce('selectedpoints'); + coerce('selectedids'); + } + plots.supplyTransformDefaults(traceIn, traceOut, layout); } diff --git a/src/traces/scatter/attributes.js b/src/traces/scatter/attributes.js index fb9611131c4..1fca454b491 100644 --- a/src/traces/scatter/attributes.js +++ b/src/traces/scatter/attributes.js @@ -433,18 +433,6 @@ module.exports = { }, editType: 'style' }, - selectedpoints: { - valType: 'any', - role: 'info', - editType: 'calc', - description: 'Array containing integer indices of selected points.', - }, - selectedids: { - valType: 'any', - role: 'info', - editType: 'calc', - description: 'Array containing `ids` of selected points.', - }, editType: 'style' }, diff --git a/src/traces/scatter/defaults.js b/src/traces/scatter/defaults.js index 79660495533..9293d452f79 100644 --- a/src/traces/scatter/defaults.js +++ b/src/traces/scatter/defaults.js @@ -21,8 +21,6 @@ var handleLineShapeDefaults = require('./line_shape_defaults'); var handleTextDefaults = require('./text_defaults'); var handleFillColorDefaults = require('./fillcolor_defaults'); var errorBarsSupplyDefaults = require('../../components/errorbars/defaults'); -var handleInteractionDefaults = require('./interaction_defaults'); - module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { @@ -41,8 +39,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('hovertext'); coerce('mode', defaultMode); - handleInteractionDefaults(traceIn, traceOut, coerce); - if(subTypes.hasLines(traceOut)) { handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce); handleLineShapeDefaults(traceIn, traceOut, coerce); diff --git a/src/traces/scatter/interaction_defaults.js b/src/traces/scatter/interaction_defaults.js deleted file mode 100644 index 9780b871d60..00000000000 --- a/src/traces/scatter/interaction_defaults.js +++ /dev/null @@ -1,56 +0,0 @@ -/** -* Copyright 2012-2017, Plotly, Inc. -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. -*/ - - -'use strict'; - -var Lib = require('../../lib'); -var isNumeric = require('fast-isnumeric'); - -module.exports = function supplyInteractionDefaults (traceIn, traceOut, coerce) { - - function coerceInteractionDefault(attr, containsNumbers) { - var i, arr; - - if (!Array.isArray(traceIn[attr])) { - return; - } - coerce(attr); - - arr = traceOut[attr]; - - console.log('arr:', arr); - - if (containsNumbers) { - for (i = arr.length - 1; i >= 0; i--) { - if (!isNumeric(arr[i])) { - arr.splice(i, 1); - } else { - arr[i] = +arr[i]; - } - } - } else { // only other implemented is integer: - for (i = arr.length - 1; i >= 0; i--) { - if (!arr[i]) { - arr.splice(i, 1); - } else { - arr[i] = String(arr[i]); - } - } - } - - if (arr.length === 0) { - delete traceOut[attr]; - } - } - - coerceInteractionDefault('selectedpoints', true); - coerceInteractionDefault('selectedids'); - coerceInteractionDefault('hoverpoints', true); - coerceInteractionDefault('hoverids'); -}; From 1efe144f38eb57af6112227aa1b78445d4fda70c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 15:55:19 -0400 Subject: [PATCH 05/43] improve updateSelectedState - make distinction between selectedpoints: [] and selectedpoint: undefined stats, where the former mean all pts are unselected and the latter means no selection at all. --- src/plots/cartesian/select.js | 65 ++++++++++++++--------------------- 1 file changed, 26 insertions(+), 39 deletions(-) diff --git a/src/plots/cartesian/select.js b/src/plots/cartesian/select.js index f855d5ccf7a..aeb4899bced 100644 --- a/src/plots/cartesian/select.js +++ b/src/plots/cartesian/select.js @@ -24,7 +24,9 @@ var MINSELECT = constants.MINSELECT; function getAxId(ax) { return ax._id; } module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { - var zoomLayer = dragOptions.gd._fullLayout._zoomlayer, + var gd = dragOptions.gd, + fullLayout = gd._fullLayout, + zoomLayer = fullLayout._zoomlayer, dragBBox = dragOptions.element.getBoundingClientRect(), plotinfo = dragOptions.plotinfo, xs = plotinfo.xaxis._offset, @@ -66,8 +68,7 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { // find the traces to search for selection points var searchTraces = []; - var gd = dragOptions.gd; - var throttleID = gd._fullLayout._uid + constants.SELECTID; + var throttleID = fullLayout._uid + constants.SELECTID; var selection = []; var i, cd, trace, searchInfo, eventData; @@ -201,11 +202,8 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { else selection = thisSelection; } - eventData = {points: selection}; - - updatedSelectedState(gd, eventData); - + updateSelectedState(gd, searchTraces, eventData); fillRangeItems(eventData, poly, pts); dragOptions.gd.emit('plotly_selecting', eventData); @@ -230,13 +228,10 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { searchInfo.selectPoints(searchInfo, false); } - updatedSelectedState(gd, {points: []}); - + updateSelectedState(gd, searchTraces); gd.emit('plotly_deselect', null); } else { - updatedSelectedState(gd, eventData); - dragOptions.gd.emit('plotly_selected', eventData); } @@ -248,40 +243,32 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { }; }; -function updatedSelectedState(gd, eventData) { - var i, pt, trace, fullTrace; - var data = gd.data; - var fullData = gd._fullData; - - // Remove existing from data: - for(i = 0; i < data.length; i++) { - if(data[i].selectedpoints) delete data[i].selectedpoints; - } +function updateSelectedState(gd, searchTraces, eventData) { + var i, searchInfo; - // Remove existing from fullData: - for(i = 0; i < fullData.length; i++) { - if(fullData[i].selectedpoints) delete fullData[i].selectedpoints; - } + if(eventData) { + var pts = eventData.points || []; - if(!eventData || !eventData.points) { - return; - } + for(i = 0; i < searchTraces.length; i++) { + searchInfo = searchTraces[i]; + searchInfo.cd[0].trace.selectedpoints = []; + searchInfo.cd[0].trace._input.selectedpoints = []; + } - var pts = eventData.points; - for(i = 0; i < pts.length; i++) { - pt = pts[i]; - trace = pt.data; - fullTrace = pt.fullData; + for(i = 0; i < pts.length; i++) { + var pt = pts[i]; + var ptNumber = pt.pointNumber; - if(!trace.selectedpoints) { - trace.selectedpoints = []; + pt.data.selectedpoints.push(ptNumber); + pt.fullData.selectedpoints.push(ptNumber); } - trace.selectedpoints.push(pt.pointNumber); - - if(!fullTrace.selectedpoints) { - fullTrace.selectedpoints = []; + } + else { + for(i = 0; i < searchTraces.length; i++) { + searchInfo = searchTraces[i]; + delete searchInfo.cd[0].trace.selectedpoints; + delete searchInfo.cd[0].trace._input.selectedpoints; } - fullTrace.selectedpoints.push(pt.pointNumber); } } From 9f3f58d9b654a7655ef057623f3468a4ed42c07e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 15:59:05 -0400 Subject: [PATCH 06/43] introduce new on-select update strategy: - use trace module style method to update DOM nodes (or call relevent gl update methods for gl-based trace types) - add *new* call signature for style methods to style per-trace inside of per-graph (as not all traces in one graph are selected in general). --- src/plots/cartesian/select.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/plots/cartesian/select.js b/src/plots/cartesian/select.js index aeb4899bced..7f60301df0b 100644 --- a/src/plots/cartesian/select.js +++ b/src/plots/cartesian/select.js @@ -84,6 +84,7 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { ) { searchTraces.push({ selectPoints: trace._module.selectPoints, + style: trace._module.style, cd: cd, xaxis: dragOptions.xaxes[0], yaxis: dragOptions.yaxes[0] @@ -95,6 +96,7 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { searchTraces.push({ selectPoints: trace._module.selectPoints, + style: trace._module.style, cd: cd, xaxis: axes.getFromId(gd, trace.xaxis), yaxis: axes.getFromId(gd, trace.yaxis) @@ -206,11 +208,6 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { updateSelectedState(gd, searchTraces, eventData); fillRangeItems(eventData, poly, pts); dragOptions.gd.emit('plotly_selecting', eventData); - - var bpms = gd._fullLayout._basePlotModules; - for (var i = 0; i < bpms.length; i++) { - bpms[i].plot(gd, null, {duration: 0}); - } } ); }; @@ -234,11 +231,6 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { else { dragOptions.gd.emit('plotly_selected', eventData); } - - var bpms = gd._fullLayout._basePlotModules; - for (var i = 0; i < bpms.length; i++) { - bpms[i].plot(gd, null, {duration: 0}); - } }); }; }; @@ -270,6 +262,11 @@ function updateSelectedState(gd, searchTraces, eventData) { delete searchInfo.cd[0].trace._input.selectedpoints; } } + + for(i = 0; i < searchTraces.length; i++) { + searchInfo = searchTraces[i]; + if(searchInfo.style) searchInfo.style(gd, searchInfo.cd); + } } function fillSelectionItem(selection, searchInfo) { From 782bc66e76149cd292ca1359302e9fe2d296fdb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:02:19 -0400 Subject: [PATCH 07/43] persistent selections for 'scatter' traces - coerce selected/unselected marker.opacity, marker.color and textfont.color - add Drawing.selectedPointStyle and Drawing.selectedTextStyle to update DOM nodes when `selectedpoints` exists - replace apply_selection_to_calcdata by calc_selection - add support for per-trace Scatter.style call signature - rm DOM styling in Scatter.selectPoints --- src/components/drawing/index.js | 55 +++++++++++++++++++ .../scatter/apply_selection_to_calcdata.js | 41 -------------- src/traces/scatter/calc.js | 10 +--- src/traces/scatter/calc_selection.js | 27 +++++++++ src/traces/scatter/index.js | 2 +- src/traces/scatter/marker_defaults.js | 18 +++--- src/traces/scatter/select.js | 26 ++------- src/traces/scatter/style.js | 37 ++++++++----- src/traces/scatter/text_defaults.js | 13 ++++- 9 files changed, 134 insertions(+), 95 deletions(-) delete mode 100644 src/traces/scatter/apply_selection_to_calcdata.js create mode 100644 src/traces/scatter/calc_selection.js diff --git a/src/components/drawing/index.js b/src/components/drawing/index.js index b949d8d8393..0131db6b4f1 100644 --- a/src/components/drawing/index.js +++ b/src/components/drawing/index.js @@ -22,6 +22,7 @@ var svgTextUtils = require('../../lib/svg_text_utils'); var xmlnsNamespaces = require('../../constants/xmlns_namespaces'); var alignment = require('../../constants/alignment'); var LINE_SPACING = alignment.LINE_SPACING; +var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; var subTypes = require('../../traces/scatter/subtypes'); var makeBubbleSizeFn = require('../../traces/scatter/make_bubble_size_func'); @@ -426,6 +427,35 @@ drawing.pointStyle = function(s, trace, gd) { }); }; +drawing.selectedPointStyle = function(s, trace) { + if(!s.size() || !trace.selectedpoints) return; + + var selectedAttrs = trace.selected || {}; + var unselectedAttrs = trace.unselected || {}; + + s.style('opacity', function(d) { + return d.selected ? + (selectedAttrs.marker || {}).opacity : + (unselectedAttrs.marker || {}).opacity; + }); + + // which is slightly different than: + // ((d.mo + 1 || opacity + 1) - 1) * (d.dim ? DESELECTDIM : 1); + // in https://github.com/plotly/plotly.js/blob/master/src/traces/scatter/select.js + + s.each(function(d) { + var pt = d3.select(this); + var smc = (selectedAttrs.marker || {}).color; + var usmc = (unselectedAttrs.marker || {}).color; + + if(d.selected) { + if(smc) Color.fill(pt, smc); + } else { + if(usmc) Color.fill(pt, usmc); + } + }); +}; + drawing.tryColorscale = function(marker, prefix) { var cont = prefix ? Lib.nestedProperty(marker, prefix).get() : marker, scl = cont.colorscale, @@ -483,6 +513,31 @@ drawing.textPointStyle = function(s, trace, gd) { }); }; +drawing.selectedTextStyle = function(s, trace) { + if(!s.size() || !trace.selectedpoints) return; + + var selectedAttrs = trace.selected || {}; + var unselectedAttrs = trace.unselected || {}; + + s.each(function(d) { + var tx = d3.select(this); + var tc = d.tc || trace.textfont.color; + var stc = (selectedAttrs.textfont || {}).color; + var utc = (unselectedAttrs.textfont || {}).color; + var tc2; + + if(d.selected) { + if(stc) tc2 = stc; + else tc2 = Color.addOpacity(tc, 1); + } else { + if(utc) tc2 = utc; + else tc2 = Color.addOpacity(tc, DESELECTDIM); + } + + Color.fill(tx, tc2); + }); +}; + // generalized Catmull-Rom splines, per // http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf var CatmullRomExp = 0.5; diff --git a/src/traces/scatter/apply_selection_to_calcdata.js b/src/traces/scatter/apply_selection_to_calcdata.js deleted file mode 100644 index 943f1ac9bb0..00000000000 --- a/src/traces/scatter/apply_selection_to_calcdata.js +++ /dev/null @@ -1,41 +0,0 @@ -/** -* Copyright 2012-2017, Plotly, Inc. -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. -*/ - - -'use strict'; - -module.exports = function applySelectionToCalcdata (cd) { - var i; - console.log('cd:', cd); - - var trace = cd[0].t; - console.log('trace:', trace); - - var selectedpoints = trace.selectedpoints; - var selectedids = trace.selectedids; - - if (!selectedpoints) { - return; - } - - var selectedPointIndex = {}; - for (i = 0; i < selectedpoints.length; i++) { - selectedPointIndex[selectedpoints[i]] = true; - } - - for (i = 0; i < cd.length; i++) { - var pt = cd[i]; - - if (!selectedpoints) { - delete pt.selected; - } else { - pt.selected = !!selectedPointIndex[i]; - } - } - -} diff --git a/src/traces/scatter/calc.js b/src/traces/scatter/calc.js index 70d9f744413..b50551169c4 100644 --- a/src/traces/scatter/calc.js +++ b/src/traces/scatter/calc.js @@ -17,8 +17,7 @@ var BADNUM = require('../../constants/numerical').BADNUM; var subTypes = require('./subtypes'); var calcColorscale = require('./colorscale_calc'); var arraysToCalcdata = require('./arrays_to_calcdata'); -var applySelectionToCalcdata = require('./apply_selection_to_calcdata'); - +var calcSelection = require('./calc_selection'); module.exports = function calc(gd, trace) { var xa = Axes.getFromId(gd, trace.xaxis || 'x'), @@ -32,10 +31,6 @@ module.exports = function calc(gd, trace) { s, i; - var selectedPointIndex = {}; - var hoverPointIndex = {}; - var idIndex; - // cancel minimum tick spacings (only applies to bars and boxes) xa._minDtick = 0; ya._minDtick = 0; @@ -128,8 +123,7 @@ module.exports = function calc(gd, trace) { } arraysToCalcdata(cd, trace); - - applySelectionToCalcdata(cd); + calcSelection(cd, trace); gd.firstscatter = false; return cd; diff --git a/src/traces/scatter/calc_selection.js b/src/traces/scatter/calc_selection.js new file mode 100644 index 00000000000..ef821498b3b --- /dev/null +++ b/src/traces/scatter/calc_selection.js @@ -0,0 +1,27 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var isNumeric = require('fast-isnumeric'); + +module.exports = function calcSelection(cd, trace) { + var selectedpoints = trace.selectedpoints; + + // TODO ids vs points?? + + if(Array.isArray(selectedpoints)) { + for(var i = 0; i < selectedpoints.length; i++) { + var ptNumber = selectedpoints[i]; + + if(isNumeric(ptNumber)) { + cd[+ptNumber].selected = 1; + } + } + } +}; diff --git a/src/traces/scatter/index.js b/src/traces/scatter/index.js index 6817e4c8162..e886ebd2716 100644 --- a/src/traces/scatter/index.js +++ b/src/traces/scatter/index.js @@ -26,7 +26,7 @@ Scatter.calc = require('./calc'); Scatter.arraysToCalcdata = require('./arrays_to_calcdata'); Scatter.plot = require('./plot'); Scatter.colorbar = require('./colorbar'); -Scatter.style = require('./style'); +Scatter.style = require('./style').style; Scatter.hoverPoints = require('./hover'); Scatter.selectPoints = require('./select'); Scatter.animatable = true; diff --git a/src/traces/scatter/marker_defaults.js b/src/traces/scatter/marker_defaults.js index 6a2af652a12..8cb7e25846a 100644 --- a/src/traces/scatter/marker_defaults.js +++ b/src/traces/scatter/marker_defaults.js @@ -12,6 +12,7 @@ var Color = require('../../components/color'); var hasColorscale = require('../../components/colorscale/has_colorscale'); var colorscaleDefaults = require('../../components/colorscale/defaults'); +var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; var subTypes = require('./subtypes'); @@ -19,6 +20,7 @@ var subTypes = require('./subtypes'); * opts: object of flags to control features not all marker users support * noLine: caller does not support marker lines * gradient: caller supports gradients + * noSelect: caller does not support selected/unselected attribute containers */ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout, coerce, opts) { var isBubble = subTypes.isBubble(traceIn), @@ -31,7 +33,7 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout if(lineColor) defaultColor = lineColor; coerce('marker.symbol'); - coerce('marker.opacity', isBubble ? 0.7 : 1); + var mo = coerce('marker.opacity', isBubble ? 0.7 : 1); coerce('marker.size'); coerce('marker.color', defaultColor); @@ -39,14 +41,14 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: 'marker.', cLetter: 'c'}); } - coerce('selected.marker.opacity', isBubble ? 0.7 : 1); - coerce('unselected.marker.opacity', 0.5); + if(!opts.noSelect) { + var moEffective = Array.isArray(mo) ? 1 : mo; + coerce('selected.marker.opacity', moEffective); + coerce('unselected.marker.opacity', DESELECTDIM * moEffective); - coerce('selected.marker.color', defaultColor); - coerce('unselected.marker.color', defaultColor); - - coerce('selected.marker.size') - coerce('unselected.marker.size') + coerce('selected.marker.color'); + coerce('unselected.marker.color'); + } if(!opts.noLine) { // if there's a line with a different color than the marker, use diff --git a/src/traces/scatter/select.js b/src/traces/scatter/select.js index 7dd2b1cd1c4..099977a409f 100644 --- a/src/traces/scatter/select.js +++ b/src/traces/scatter/select.js @@ -10,7 +10,6 @@ 'use strict'; var subtypes = require('./subtypes'); -var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; module.exports = function selectPoints(searchInfo, polygon) { var cd = searchInfo.cd, @@ -18,20 +17,18 @@ module.exports = function selectPoints(searchInfo, polygon) { ya = searchInfo.yaxis, selection = [], trace = cd[0].trace, - marker = trace.marker, i, di, x, y; - // TODO: include lines? that would require per-segment line properties var hasOnlyLines = (!subtypes.hasMarkers(trace) && !subtypes.hasText(trace)); if(hasOnlyLines) return []; - var opacity = Array.isArray(marker.opacity) ? 1 : marker.opacity; - if(polygon === false) { // clear selection - for(i = 0; i < cd.length; i++) cd[i].dim = 0; + for(i = 0; i < cd.length; i++) { + cd[i].selected = 0; + } } else { for(i = 0; i < cd.length; i++) { @@ -45,23 +42,12 @@ module.exports = function selectPoints(searchInfo, polygon) { x: xa.c2d(di.x), y: ya.c2d(di.y) }); - di.dim = 0; + di.selected = 1; + } else { + di.selected = 0; } - else di.dim = 1; } } - // do the dimming here, as well as returning the selection - // The logic here duplicates Drawing.pointStyle, but I don't want - // d.dim in pointStyle in case something goes wrong with selection. - cd[0].node3.selectAll('path.point') - .style('opacity', function(d) { - return ((d.mo + 1 || opacity + 1) - 1) * (d.dim ? DESELECTDIM : 1); - }); - cd[0].node3.selectAll('text') - .style('opacity', function(d) { - return d.dim ? DESELECTDIM : 1; - }); - return selection; }; diff --git a/src/traces/scatter/style.js b/src/traces/scatter/style.js index b4475f53d6c..bd27c38e189 100644 --- a/src/traces/scatter/style.js +++ b/src/traces/scatter/style.js @@ -10,29 +10,21 @@ 'use strict'; var d3 = require('d3'); - var Drawing = require('../../components/drawing'); var ErrorBars = require('../../components/errorbars'); - -module.exports = function style(gd) { - var s = d3.select(gd).selectAll('g.trace.scatter'); +function style(gd, cd) { + var s = cd ? cd[0].node3 : d3.select(gd).selectAll('g.trace.scatter'); s.style('opacity', function(d) { return d[0].trace.opacity; }); - s.selectAll('g.points') - .each(function(d) { - var el = d3.select(this); - var pts = el.selectAll('path.point'); - var trace = d.trace || d[0].trace; - - pts.call(Drawing.pointStyle, trace, gd); - - el.selectAll('text') - .call(Drawing.textPointStyle, trace, gd); - }); + s.selectAll('g.points').each(function(d) { + var sel = d3.select(this); + var trace = d.trace || d[0].trace; + stylePoints(sel, trace, gd); + }); s.selectAll('g.trace path.js-line') .call(Drawing.lineGroupStyle); @@ -41,4 +33,19 @@ module.exports = function style(gd) { .call(Drawing.fillGroupStyle); s.call(ErrorBars.style); +} + +function stylePoints(sel, trace, gd) { + var pts = sel.selectAll('path.point'); + var txs = sel.selectAll('text'); + + Drawing.pointStyle(pts, trace, gd); + Drawing.textPointStyle(txs, trace, gd); + Drawing.selectedPointStyle(pts, trace); + Drawing.selectedTextStyle(txs, trace); +} + +module.exports = { + style: style, + stylePoints: stylePoints }; diff --git a/src/traces/scatter/text_defaults.js b/src/traces/scatter/text_defaults.js index 2860d127825..18af9ef07ba 100644 --- a/src/traces/scatter/text_defaults.js +++ b/src/traces/scatter/text_defaults.js @@ -11,9 +11,18 @@ var Lib = require('../../lib'); +/* + * opts: object of flags to control features not all text users support + * noSelect: caller does not support selected/unselected attribute containers + */ +module.exports = function(traceIn, traceOut, layout, coerce, opts) { + opts = opts || {}; -// common to 'scatter', 'scatter3d' and 'scattergeo' -module.exports = function(traceIn, traceOut, layout, coerce) { coerce('textposition'); Lib.coerceFont(coerce, 'textfont', layout.font); + + if(!opts.noSelect) { + coerce('selected.textfont.color'); + coerce('unselected.textfont.color'); + } }; From ec0578bfc4fae682adc34eeb9cad72406bb24688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:20:33 -0400 Subject: [PATCH 08/43] persistent selection for 'scattercarpet' and 'scatteternary' - ... by simply propagation 'scatter' logic. --- src/traces/scattercarpet/attributes.js | 4 ++++ src/traces/scattercarpet/calc.js | 3 ++- src/traces/scattercarpet/style.js | 16 ++++++++-------- src/traces/scatterternary/attributes.js | 4 ++++ src/traces/scatterternary/calc.js | 3 ++- src/traces/scatterternary/style.js | 16 ++++++++-------- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/traces/scattercarpet/attributes.js b/src/traces/scattercarpet/attributes.js index 391a5b9a727..886fa2aa955 100644 --- a/src/traces/scattercarpet/attributes.js +++ b/src/traces/scattercarpet/attributes.js @@ -110,6 +110,10 @@ module.exports = { textfont: scatterAttrs.textfont, textposition: scatterAttrs.textposition, + + selected: scatterAttrs.selected, + unselected: scatterAttrs.unselected, + hoverinfo: extendFlat({}, plotAttrs.hoverinfo, { flags: ['a', 'b', 'text', 'name'] }), diff --git a/src/traces/scattercarpet/calc.js b/src/traces/scattercarpet/calc.js index 25888b59b02..58f57fe1361 100644 --- a/src/traces/scattercarpet/calc.js +++ b/src/traces/scattercarpet/calc.js @@ -16,6 +16,7 @@ var Axes = require('../../plots/cartesian/axes'); var subTypes = require('../scatter/subtypes'); var calcColorscale = require('../scatter/colorscale_calc'); var arraysToCalcdata = require('../scatter/arrays_to_calcdata'); +var calcSelection = require('../scatter/calc_selection'); var lookupCarpet = require('../carpet/lookup_carpetid'); module.exports = function calc(gd, trace) { @@ -67,8 +68,8 @@ module.exports = function calc(gd, trace) { } calcColorscale(trace); - arraysToCalcdata(cd, trace); + calcSelection(cd, trace); return cd; }; diff --git a/src/traces/scattercarpet/style.js b/src/traces/scattercarpet/style.js index 8ead87cc97e..b6241334f05 100644 --- a/src/traces/scattercarpet/style.js +++ b/src/traces/scattercarpet/style.js @@ -9,19 +9,19 @@ 'use strict'; -var scatterStyle = require('../scatter/style'); - - -module.exports = function style(gd) { - var modules = gd._fullLayout._modules; +var scatterStyle = require('../scatter/style').style; +module.exports = function style(gd, cd) { // we're just going to call scatter style... if we already // called it, don't need to redo. // Later though we may want differences, or we may make style // more specific in its scope, then we can remove this. - for(var i = 0; i < modules.length; i++) { - if(modules[i].name === 'scatter') return; + if(!cd) { + var modules = gd._fullLayout._modules; + for(var i = 0; i < modules.length; i++) { + if(modules[i].name === 'scatter') return; + } } - scatterStyle(gd); + scatterStyle(gd, cd); }; diff --git a/src/traces/scatterternary/attributes.js b/src/traces/scatterternary/attributes.js index 5af29cb9f89..5f5c333fbff 100644 --- a/src/traces/scatterternary/attributes.js +++ b/src/traces/scatterternary/attributes.js @@ -139,6 +139,10 @@ module.exports = { textfont: scatterAttrs.textfont, textposition: scatterAttrs.textposition, + + selected: scatterAttrs.selected, + unselected: scatterAttrs.unselected, + hoverinfo: extendFlat({}, plotAttrs.hoverinfo, { flags: ['a', 'b', 'c', 'text', 'name'] }), diff --git a/src/traces/scatterternary/calc.js b/src/traces/scatterternary/calc.js index c0a5d958212..bc0cec5ea9a 100644 --- a/src/traces/scatterternary/calc.js +++ b/src/traces/scatterternary/calc.js @@ -16,11 +16,11 @@ var Axes = require('../../plots/cartesian/axes'); var subTypes = require('../scatter/subtypes'); var calcColorscale = require('../scatter/colorscale_calc'); var arraysToCalcdata = require('../scatter/arrays_to_calcdata'); +var calcSelection = require('../scatter/calc_selection'); var dataArrays = ['a', 'b', 'c']; var arraysToFill = {a: ['b', 'c'], b: ['a', 'c'], c: ['a', 'b']}; - module.exports = function calc(gd, trace) { var ternary = gd._fullLayout[trace.subplot], displaySum = ternary.sum, @@ -90,6 +90,7 @@ module.exports = function calc(gd, trace) { calcColorscale(trace); arraysToCalcdata(cd, trace); + calcSelection(cd, trace); return cd; }; diff --git a/src/traces/scatterternary/style.js b/src/traces/scatterternary/style.js index 8ead87cc97e..b6241334f05 100644 --- a/src/traces/scatterternary/style.js +++ b/src/traces/scatterternary/style.js @@ -9,19 +9,19 @@ 'use strict'; -var scatterStyle = require('../scatter/style'); - - -module.exports = function style(gd) { - var modules = gd._fullLayout._modules; +var scatterStyle = require('../scatter/style').style; +module.exports = function style(gd, cd) { // we're just going to call scatter style... if we already // called it, don't need to redo. // Later though we may want differences, or we may make style // more specific in its scope, then we can remove this. - for(var i = 0; i < modules.length; i++) { - if(modules[i].name === 'scatter') return; + if(!cd) { + var modules = gd._fullLayout._modules; + for(var i = 0; i < modules.length; i++) { + if(modules[i].name === 'scatter') return; + } } - scatterStyle(gd); + scatterStyle(gd, cd); }; From 1bd832e7a0d5c4457c8a8d223cf1dc065b59c728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:14:50 -0400 Subject: [PATCH 09/43] persistent selections for 'box' and 'violin' traces - coerce only 'marker.opacity' and 'marker.color', (textfont.color isn't a thing yet for these trace types). --- src/traces/box/attributes.js | 10 +++++ src/traces/box/calc.js | 9 +++++ src/traces/box/defaults.js | 8 +++- src/traces/box/select.js | 16 ++------ src/traces/box/style.js | 46 ++++++++++++---------- src/traces/violin/attributes.js | 3 ++ src/traces/violin/style.js | 68 ++++++++++++++++----------------- 7 files changed, 91 insertions(+), 69 deletions(-) diff --git a/src/traces/box/attributes.js b/src/traces/box/attributes.js index baa4e056210..2cf4c0b2f78 100644 --- a/src/traces/box/attributes.js +++ b/src/traces/box/attributes.js @@ -214,6 +214,16 @@ module.exports = { editType: 'plot' }, fillcolor: scatterAttrs.fillcolor, + + selected: { + marker: scatterAttrs.selected.marker, + editType: 'style' + }, + unselected: { + marker: scatterAttrs.unselected.marker, + editType: 'style' + }, + hoveron: { valType: 'flaglist', flags: ['boxes', 'points'], diff --git a/src/traces/box/calc.js b/src/traces/box/calc.js index 2f79e0c368c..2ded0b06d31 100644 --- a/src/traces/box/calc.js +++ b/src/traces/box/calc.js @@ -193,6 +193,15 @@ function arraysToCalcdata(pt, trace, i) { pt[trace2calc[k]] = trace[k][i]; } } + + var selectedpoints = trace.selectedpoints; + + // TODO this is slow + if(Array.isArray(selectedpoints)) { + if(selectedpoints.indexOf(pt.i) !== -1) { + pt.selected = 1; + } + } } function sortByVal(a, b) { return a.v - b.v; } diff --git a/src/traces/box/defaults.js b/src/traces/box/defaults.js index 9ea8e7964af..79a127f18b3 100644 --- a/src/traces/box/defaults.js +++ b/src/traces/box/defaults.js @@ -11,6 +11,7 @@ var Lib = require('../../lib'); var Registry = require('../../registry'); var Color = require('../../components/color'); +var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; var attributes = require('./attributes'); @@ -71,7 +72,7 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) { coerce('pointpos', points === 'all' ? -1.5 : 0); coerce('marker.symbol'); - coerce('marker.opacity'); + var mo = coerce('marker.opacity'); coerce('marker.size'); coerce('marker.color', traceOut.line.color); coerce('marker.line.color'); @@ -82,6 +83,11 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) { coerce('marker.line.outlierwidth'); } + coerce('selected.marker.opacity', mo); + coerce('unselected.marker.opacity', DESELECTDIM * mo); + coerce('selected.marker.color'); + coerce('unselected.marker.color'); + coerce('text'); } else { delete traceOut.marker; diff --git a/src/traces/box/select.js b/src/traces/box/select.js index 755246dd20a..f6b8fc76e81 100644 --- a/src/traces/box/select.js +++ b/src/traces/box/select.js @@ -8,24 +8,18 @@ 'use strict'; -var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; - module.exports = function selectPoints(searchInfo, polygon) { var cd = searchInfo.cd; var xa = searchInfo.xaxis; var ya = searchInfo.yaxis; - var trace = cd[0].trace; - var node3 = cd[0].node3; var selection = []; var i, j; - if(trace.visible !== true) return []; - if(polygon === false) { for(i = 0; i < cd.length; i++) { for(j = 0; j < (cd[i].pts || []).length; j++) { // clear selection - cd[i].pts[j].dim = 0; + cd[i].pts[j].selected = 0; } } } else { @@ -41,17 +35,13 @@ module.exports = function selectPoints(searchInfo, polygon) { x: xa.c2d(pt.x), y: ya.c2d(pt.y) }); - pt.dim = 0; + pt.selected = 1; } else { - pt.dim = 1; + pt.selected = 0; } } } } - node3.selectAll('.point').style('opacity', function(d) { - return d.dim ? DESELECTDIM : 1; - }); - return selection; }; diff --git a/src/traces/box/style.js b/src/traces/box/style.js index 7dd3ae4a4c7..fcb75d7e6ac 100644 --- a/src/traces/box/style.js +++ b/src/traces/box/style.js @@ -9,29 +9,33 @@ 'use strict'; var d3 = require('d3'); - var Color = require('../../components/color'); var Drawing = require('../../components/drawing'); +module.exports = function style(gd, cd) { + var s = cd ? cd[0].node3 : d3.select(gd).selectAll('g.trace.boxes'); + + s.style('opacity', function(d) { return d[0].trace.opacity; }); + + s.each(function(d) { + var el = d3.select(this); + var trace = d[0].trace; + var lineWidth = trace.line.width; + + el.selectAll('path.box') + .style('stroke-width', lineWidth + 'px') + .call(Color.stroke, trace.line.color) + .call(Color.fill, trace.fillcolor); + + el.selectAll('path.mean') + .style({ + 'stroke-width': lineWidth, + 'stroke-dasharray': (2 * lineWidth) + 'px,' + lineWidth + 'px' + }) + .call(Color.stroke, trace.line.color); -module.exports = function style(gd) { - var s = d3.select(gd).selectAll('g.trace.boxes'); - - s.style('opacity', function(d) { return d[0].trace.opacity; }) - .each(function(d) { - var trace = d[0].trace, - lineWidth = trace.line.width; - d3.select(this).selectAll('path.box') - .style('stroke-width', lineWidth + 'px') - .call(Color.stroke, trace.line.color) - .call(Color.fill, trace.fillcolor); - d3.select(this).selectAll('path.mean') - .style({ - 'stroke-width': lineWidth, - 'stroke-dasharray': (2 * lineWidth) + 'px,' + lineWidth + 'px' - }) - .call(Color.stroke, trace.line.color); - d3.select(this).selectAll('g.points path') - .call(Drawing.pointStyle, trace, gd); - }); + var pts = el.selectAll('path.point'); + Drawing.pointStyle(pts, trace, gd); + Drawing.selectedPointStyle(pts, trace); + }); }; diff --git a/src/traces/violin/attributes.js b/src/traces/violin/attributes.js index 6f7540cf7a2..b01ce5a3a45 100644 --- a/src/traces/violin/attributes.js +++ b/src/traces/violin/attributes.js @@ -229,6 +229,9 @@ module.exports = { ].join(' ') }, + selected: boxAttrs.selected, + unselected: boxAttrs.unselected, + hoveron: { valType: 'flaglist', flags: ['violins', 'points', 'kde'], diff --git a/src/traces/violin/style.js b/src/traces/violin/style.js index a3f0c2d8db0..65336f3a065 100644 --- a/src/traces/violin/style.js +++ b/src/traces/violin/style.js @@ -9,39 +9,39 @@ 'use strict'; var d3 = require('d3'); -var Drawing = require('../../components/drawing'); var Color = require('../../components/color'); - -module.exports = function style(gd) { - var traces = d3.select(gd).selectAll('g.trace.violins'); - - traces.style('opacity', function(d) { return d[0].trace.opacity; }) - .each(function(d) { - var trace = d[0].trace; - var sel = d3.select(this); - var box = trace.box || {}; - var boxLine = box.line || {}; - var meanline = trace.meanline || {}; - var meanLineWidth = meanline.width; - - sel.selectAll('path.violin') - .style('stroke-width', trace.line.width + 'px') - .call(Color.stroke, trace.line.color) - .call(Color.fill, trace.fillcolor); - - sel.selectAll('path.box') - .style('stroke-width', boxLine.width + 'px') - .call(Color.stroke, boxLine.color) - .call(Color.fill, box.fillcolor); - - sel.selectAll('g.points path') - .call(Drawing.pointStyle, trace, gd); - - sel.selectAll('path.mean') - .style({ - 'stroke-width': meanLineWidth + 'px', - 'stroke-dasharray': (2 * meanLineWidth) + 'px,' + meanLineWidth + 'px' - }) - .call(Color.stroke, meanline.color); - }); +var stylePoints = require('../scatter/style').stylePoints; + +module.exports = function style(gd, cd) { + var s = cd ? cd[0].node3 : d3.select(gd).selectAll('g.trace.violins'); + + s.style('opacity', function(d) { return d[0].trace.opacity; }); + + s.each(function(d) { + var trace = d[0].trace; + var sel = d3.select(this); + var box = trace.box || {}; + var boxLine = box.line || {}; + var meanline = trace.meanline || {}; + var meanLineWidth = meanline.width; + + sel.selectAll('path.violin') + .style('stroke-width', trace.line.width + 'px') + .call(Color.stroke, trace.line.color) + .call(Color.fill, trace.fillcolor); + + sel.selectAll('path.box') + .style('stroke-width', boxLine.width + 'px') + .call(Color.stroke, boxLine.color) + .call(Color.fill, box.fillcolor); + + sel.selectAll('path.mean') + .style({ + 'stroke-width': meanLineWidth + 'px', + 'stroke-dasharray': (2 * meanLineWidth) + 'px,' + meanLineWidth + 'px' + }) + .call(Color.stroke, meanline.color); + + stylePoints(sel, trace, gd); + }); }; From 10c5b7b50a8a7e4d9cdbce7fc53aac7d0a37ce67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:24:12 -0400 Subject: [PATCH 10/43] persistent selection for 'scattergeo' - in which we needed to expose a 'style' method. - note that geo trace cannot rely on the the style method loop in Plots.style because it needs to call style in the fetch-topojson callback. - so ScatterGeo.style only work per-trace! --- src/traces/scattergeo/attributes.js | 3 ++ src/traces/scattergeo/calc.js | 2 ++ src/traces/scattergeo/index.js | 1 + src/traces/scattergeo/plot.js | 44 +++-------------------------- src/traces/scattergeo/select.js | 19 ++----------- src/traces/scattergeo/style.js | 44 +++++++++++++++++++++++++++++ 6 files changed, 57 insertions(+), 56 deletions(-) create mode 100644 src/traces/scattergeo/style.js diff --git a/src/traces/scattergeo/attributes.js b/src/traces/scattergeo/attributes.js index a6075bdd81f..95d7e9672b6 100644 --- a/src/traces/scattergeo/attributes.js +++ b/src/traces/scattergeo/attributes.js @@ -118,6 +118,9 @@ module.exports = overrideAll({ }, fillcolor: scatterAttrs.fillcolor, + selected: scatterAttrs.selected, + unselected: scatterAttrs.unselected, + hoverinfo: extendFlat({}, plotAttrs.hoverinfo, { flags: ['lon', 'lat', 'location', 'text', 'name'] }) diff --git a/src/traces/scattergeo/calc.js b/src/traces/scattergeo/calc.js index 8f2fcdee80f..668e4e24aed 100644 --- a/src/traces/scattergeo/calc.js +++ b/src/traces/scattergeo/calc.js @@ -14,6 +14,7 @@ var BADNUM = require('../../constants/numerical').BADNUM; var calcMarkerColorscale = require('../scatter/colorscale_calc'); var arraysToCalcdata = require('../scatter/arrays_to_calcdata'); +var calcSelection = require('../scatter/calc_selection'); module.exports = function calc(gd, trace) { var hasLocationData = Array.isArray(trace.locations); @@ -37,6 +38,7 @@ module.exports = function calc(gd, trace) { arraysToCalcdata(calcTrace, trace); calcMarkerColorscale(trace); + calcSelection(calcTrace, trace); return calcTrace; }; diff --git a/src/traces/scattergeo/index.js b/src/traces/scattergeo/index.js index 4e8c989ee33..3f71a2eeda9 100644 --- a/src/traces/scattergeo/index.js +++ b/src/traces/scattergeo/index.js @@ -16,6 +16,7 @@ ScatterGeo.supplyDefaults = require('./defaults'); ScatterGeo.colorbar = require('../scatter/colorbar'); ScatterGeo.calc = require('./calc'); ScatterGeo.plot = require('./plot'); +ScatterGeo.style = require('./style'); ScatterGeo.hoverPoints = require('./hover'); ScatterGeo.eventData = require('./event_data'); ScatterGeo.selectPoints = require('./select'); diff --git a/src/traces/scattergeo/plot.js b/src/traces/scattergeo/plot.js index 42965cee10c..cb736f8f163 100644 --- a/src/traces/scattergeo/plot.js +++ b/src/traces/scattergeo/plot.js @@ -11,15 +11,13 @@ var d3 = require('d3'); -var Drawing = require('../../components/drawing'); -var Color = require('../../components/color'); - var Lib = require('../../lib'); var BADNUM = require('../../constants/numerical').BADNUM; var getTopojsonFeatures = require('../../lib/topojson_utils').getTopojsonFeatures; var locationToFeature = require('../../lib/geo_location_utils').locationToFeature; var geoJsonUtils = require('../../lib/geojson_utils'); var subTypes = require('../scatter/subtypes'); +var style = require('./style'); module.exports = function plot(geo, calcData) { for(var i = 0; i < calcData.length; i++) { @@ -79,10 +77,10 @@ module.exports = function plot(geo, calcData) { .append('text') .each(function(calcPt) { removeBADNUM(calcPt, this); }); } - }); - // call style here within topojson request callback - style(geo); + // call style here within topojson request callback + style(geo.graphDiv, calcTrace); + }); }; function calcGeoJSON(calcTrace, topojson) { @@ -100,37 +98,3 @@ function calcGeoJSON(calcTrace, topojson) { calcPt.lonlat = feature ? feature.properties.ct : [BADNUM, BADNUM]; } } - -function style(geo) { - var gTraces = geo.layers.frontplot.selectAll('.trace.scattergeo'); - - gTraces.style('opacity', function(calcTrace) { - return calcTrace[0].trace.opacity; - }); - - gTraces.each(function(calcTrace) { - var trace = calcTrace[0].trace; - var group = d3.select(this); - - group.selectAll('path.point') - .call(Drawing.pointStyle, trace, geo.graphDiv); - group.selectAll('text') - .call(Drawing.textPointStyle, trace, geo.graphDiv); - }); - - // this part is incompatible with Drawing.lineGroupStyle - gTraces.selectAll('path.js-line') - .style('fill', 'none') - .each(function(d) { - var path = d3.select(this); - var trace = d.trace; - var line = trace.line || {}; - - path.call(Color.stroke, line.color) - .call(Drawing.dashLine, line.dash || '', line.width || 0); - - if(trace.fill !== 'none') { - path.call(Color.fill, trace.fillcolor); - } - }); -} diff --git a/src/traces/scattergeo/select.js b/src/traces/scattergeo/select.js index aeacd646423..31601b142f9 100644 --- a/src/traces/scattergeo/select.js +++ b/src/traces/scattergeo/select.js @@ -9,7 +9,6 @@ 'use strict'; var subtypes = require('../scatter/subtypes'); -var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; module.exports = function selectPoints(searchInfo, polygon) { var cd = searchInfo.cd; @@ -17,19 +16,15 @@ module.exports = function selectPoints(searchInfo, polygon) { var ya = searchInfo.yaxis; var selection = []; var trace = cd[0].trace; - var node3 = cd[0].node3; var di, lonlat, x, y, i; var hasOnlyLines = (!subtypes.hasMarkers(trace) && !subtypes.hasText(trace)); if(hasOnlyLines) return []; - var marker = trace.marker; - var opacity = Array.isArray(marker.opacity) ? 1 : marker.opacity; - if(polygon === false) { for(i = 0; i < cd.length; i++) { - cd[i].dim = 0; + cd[i].selected = 0; } } else { for(i = 0; i < cd.length; i++) { @@ -44,20 +39,12 @@ module.exports = function selectPoints(searchInfo, polygon) { lon: lonlat[0], lat: lonlat[1] }); - di.dim = 0; + di.selected = 1; } else { - di.dim = 1; + di.selected = 0; } } } - node3.selectAll('path.point').style('opacity', function(d) { - return ((d.mo + 1 || opacity + 1) - 1) * (d.dim ? DESELECTDIM : 1); - }); - - node3.selectAll('text').style('opacity', function(d) { - return d.dim ? DESELECTDIM : 1; - }); - return selection; }; diff --git a/src/traces/scattergeo/style.js b/src/traces/scattergeo/style.js new file mode 100644 index 00000000000..e4194bea969 --- /dev/null +++ b/src/traces/scattergeo/style.js @@ -0,0 +1,44 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var d3 = require('d3'); +var Drawing = require('../../components/drawing'); +var Color = require('../../components/color'); + +var stylePoints = require('../scatter/style').stylePoints; + +module.exports = function style(gd, calcTrace) { + if(calcTrace) styleTrace(gd, calcTrace); +}; + +function styleTrace(gd, calcTrace) { + var trace = calcTrace[0].trace; + var s = calcTrace[0].node3; + + s.style('opacity', calcTrace[0].trace.opacity); + + stylePoints(s, trace, gd); + + // this part is incompatible with Drawing.lineGroupStyle + s.selectAll('path.js-line') + .style('fill', 'none') + .each(function(d) { + var path = d3.select(this); + var trace = d.trace; + var line = trace.line || {}; + + path.call(Color.stroke, line.color) + .call(Drawing.dashLine, line.dash || '', line.width || 0); + + if(trace.fill !== 'none') { + path.call(Color.fill, trace.fillcolor); + } + }); +} From eeace5b796740801e169c556b00061a65b478013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:26:59 -0400 Subject: [PATCH 11/43] persistent selections for 'choropleth' - in which a new style per-trace-only style() method is added (similar to 'scattergeo') AND a new attribute: 'marker.opacity' to make selection behavior be attribute-describable. --- src/traces/choropleth/attributes.js | 38 +++++++++++++++++---- src/traces/choropleth/calc.js | 2 ++ src/traces/choropleth/defaults.js | 9 +++-- src/traces/choropleth/index.js | 1 + src/traces/choropleth/plot.js | 35 +++---------------- src/traces/choropleth/select.js | 13 ++----- src/traces/choropleth/style.js | 53 +++++++++++++++++++++++++++++ 7 files changed, 102 insertions(+), 49 deletions(-) create mode 100644 src/traces/choropleth/style.js diff --git a/src/traces/choropleth/attributes.js b/src/traces/choropleth/attributes.js index 6c9ffb93cbf..65957f6e81b 100644 --- a/src/traces/choropleth/attributes.js +++ b/src/traces/choropleth/attributes.js @@ -8,7 +8,7 @@ 'use strict'; -var ScatterGeoAttrs = require('../scattergeo/attributes'); +var scatterGeoAttrs = require('../scattergeo/attributes'); var colorscaleAttrs = require('../../components/colorscale/attributes'); var colorbarAttrs = require('../../components/colorbar/attributes'); var plotAttrs = require('../../plots/attributes'); @@ -17,7 +17,7 @@ var extend = require('../../lib/extend'); var extendFlat = extend.extendFlat; var extendDeepAll = extend.extendDeepAll; -var ScatterGeoMarkerLineAttrs = ScatterGeoAttrs.marker.line; +var scatterGeoMarkerLineAttrs = scatterGeoAttrs.marker.line; module.exports = extendFlat({ locations: { @@ -28,23 +28,49 @@ module.exports = extendFlat({ 'See `locationmode` for more info.' ].join(' ') }, - locationmode: ScatterGeoAttrs.locationmode, + locationmode: scatterGeoAttrs.locationmode, z: { valType: 'data_array', editType: 'calc', description: 'Sets the color values.' }, - text: extendFlat({}, ScatterGeoAttrs.text, { + text: extendFlat({}, scatterGeoAttrs.text, { description: 'Sets the text elements associated with each location.' }), marker: { line: { - color: ScatterGeoMarkerLineAttrs.color, - width: extendFlat({}, ScatterGeoMarkerLineAttrs.width, {dflt: 1}), + color: scatterGeoMarkerLineAttrs.color, + width: extendFlat({}, scatterGeoMarkerLineAttrs.width, {dflt: 1}), editType: 'calc' }, + opacity: { + valType: 'number', + arrayOk: true, + min: 0, + max: 1, + dflt: 1, + role: 'style', + editType: 'style', + description: 'Sets the opacity of the locations.' + }, editType: 'calc' }, + + selected: { + marker: { + opacity: scatterGeoAttrs.selected.marker.opacity, + editType: 'plot' + }, + editType: 'plot' + }, + unselected: { + marker: { + opacity: scatterGeoAttrs.unselected.marker.opacity, + editType: 'plot' + }, + editType: 'plot' + }, + hoverinfo: extendFlat({}, plotAttrs.hoverinfo, { editType: 'calc', flags: ['location', 'z', 'text', 'name'] diff --git a/src/traces/choropleth/calc.js b/src/traces/choropleth/calc.js index f4e479a98f7..960e85ec038 100644 --- a/src/traces/choropleth/calc.js +++ b/src/traces/choropleth/calc.js @@ -14,6 +14,7 @@ var BADNUM = require('../../constants/numerical').BADNUM; var colorscaleCalc = require('../../components/colorscale/calc'); var arraysToCalcdata = require('../scatter/arrays_to_calcdata'); +var calcSelection = require('../scatter/calc_selection'); module.exports = function calc(gd, trace) { var len = trace.locations.length; @@ -30,6 +31,7 @@ module.exports = function calc(gd, trace) { arraysToCalcdata(calcTrace, trace); colorscaleCalc(trace, trace.z, '', 'z'); + calcSelection(calcTrace, trace); return calcTrace; }; diff --git a/src/traces/choropleth/defaults.js b/src/traces/choropleth/defaults.js index 9b279725c69..307d5948cbe 100644 --- a/src/traces/choropleth/defaults.js +++ b/src/traces/choropleth/defaults.js @@ -10,10 +10,9 @@ 'use strict'; var Lib = require('../../lib'); - var colorscaleDefaults = require('../../components/colorscale/defaults'); var attributes = require('./attributes'); - +var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { @@ -45,6 +44,12 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('marker.line.color'); coerce('marker.line.width'); + var mo = coerce('marker.opacity'); + var moEffective = Array.isArray(mo) ? 1 : mo; + + coerce('selected.marker.opacity', moEffective); + coerce('unselected.marker.opacity', DESELECTDIM * moEffective); + colorscaleDefaults( traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'} ); diff --git a/src/traces/choropleth/index.js b/src/traces/choropleth/index.js index a5940e41cd6..3c946176017 100644 --- a/src/traces/choropleth/index.js +++ b/src/traces/choropleth/index.js @@ -16,6 +16,7 @@ Choropleth.supplyDefaults = require('./defaults'); Choropleth.colorbar = require('../heatmap/colorbar'); Choropleth.calc = require('./calc'); Choropleth.plot = require('./plot'); +Choropleth.style = require('./style'); Choropleth.hoverPoints = require('./hover'); Choropleth.eventData = require('./event_data'); Choropleth.selectPoints = require('./select'); diff --git a/src/traces/choropleth/plot.js b/src/traces/choropleth/plot.js index 1d2c30d4234..982aef72f3e 100644 --- a/src/traces/choropleth/plot.js +++ b/src/traces/choropleth/plot.js @@ -6,19 +6,16 @@ * LICENSE file in the root directory of this source tree. */ - 'use strict'; var d3 = require('d3'); var Lib = require('../../lib'); -var Color = require('../../components/color'); -var Drawing = require('../../components/drawing'); -var Colorscale = require('../../components/colorscale'); var polygon = require('../../lib/polygon'); var getTopojsonFeatures = require('../../lib/topojson_utils').getTopojsonFeatures; var locationToFeature = require('../../lib/geo_location_utils').locationToFeature; +var style = require('./style'); module.exports = function plot(geo, calcData) { for(var i = 0; i < calcData.length; i++) { @@ -46,9 +43,10 @@ module.exports = function plot(geo, calcData) { .classed('choroplethlocation', true); paths.exit().remove(); - }); - style(geo); + // call style here within topojson request callback + style(geo.graphDiv, calcTrace); + }); }; function calcGeoJSON(calcTrace, topojson) { @@ -176,28 +174,3 @@ function feature2polygons(feature) { return polygons; } - -function style(geo) { - var gTraces = geo.layers.backplot.selectAll('.trace.choropleth'); - - gTraces.each(function(calcTrace) { - var trace = calcTrace[0].trace; - var marker = trace.marker || {}; - var markerLine = marker.line || {}; - - var sclFunc = Colorscale.makeColorScaleFunc( - Colorscale.extractScale( - trace.colorscale, - trace.zmin, - trace.zmax - ) - ); - - d3.select(this).selectAll('.choroplethlocation').each(function(d) { - d3.select(this) - .attr('fill', sclFunc(d.z)) - .call(Color.stroke, d.mlc || markerLine.color) - .call(Drawing.dashLine, '', d.mlw || markerLine.width || 0); - }); - }); -} diff --git a/src/traces/choropleth/select.js b/src/traces/choropleth/select.js index 209b1ba35a7..18d4a5e5ee5 100644 --- a/src/traces/choropleth/select.js +++ b/src/traces/choropleth/select.js @@ -8,20 +8,17 @@ 'use strict'; -var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; - module.exports = function selectPoints(searchInfo, polygon) { var cd = searchInfo.cd; var xa = searchInfo.xaxis; var ya = searchInfo.yaxis; var selection = []; - var node3 = cd[0].node3; var i, di, ct, x, y; if(polygon === false) { for(i = 0; i < cd.length; i++) { - cd[i].dim = 0; + cd[i].selected = 0; } } else { for(i = 0; i < cd.length; i++) { @@ -39,16 +36,12 @@ module.exports = function selectPoints(searchInfo, polygon) { lon: ct[0], lat: ct[1] }); - di.dim = 0; + di.selected = 1; } else { - di.dim = 1; + di.selected = 0; } } } - node3.selectAll('path').style('opacity', function(d) { - return d.dim ? DESELECTDIM : 1; - }); - return selection; }; diff --git a/src/traces/choropleth/style.js b/src/traces/choropleth/style.js new file mode 100644 index 00000000000..d351326e8cf --- /dev/null +++ b/src/traces/choropleth/style.js @@ -0,0 +1,53 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +var d3 = require('d3'); +var Color = require('../../components/color'); +var Drawing = require('../../components/drawing'); +var Colorscale = require('../../components/colorscale'); + +module.exports = function style(gd, calcTrace) { + if(calcTrace) styleTrace(gd, calcTrace); +}; + +function styleTrace(gd, calcTrace) { + var trace = calcTrace[0].trace; + var s = calcTrace[0].node3; + var locs = s.selectAll('.choroplethlocation'); + var marker = trace.marker || {}; + var markerLine = marker.line || {}; + + var sclFunc = Colorscale.makeColorScaleFunc( + Colorscale.extractScale( + trace.colorscale, + trace.zmin, + trace.zmax + ) + ); + + locs.each(function(d) { + d3.select(this) + .attr('fill', sclFunc(d.z)) + .call(Color.stroke, d.mlc || markerLine.color) + .call(Drawing.dashLine, '', d.mlw || markerLine.width || 0) + .style('opacity', marker.opacity); + }); + + if(trace.selectedpoints) { + var selectedAttrs = trace.selected || {}; + var unselectedAttrs = trace.unselected || {}; + + locs.style('opacity', function(d) { + return d.selected ? + selectedAttrs.marker.opacity : + unselectedAttrs.marker.opacity; + }); + } +} From bf039ab9f079532185f3a12660f21b587e52e1ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:29:35 -0400 Subject: [PATCH 12/43] resolve #1862 - add `marker.opacity` to bar (& histogram) traces - by doing so, we can use Drawing.pointStyle straight-up! --- src/components/drawing/index.js | 10 +++---- src/traces/bar/attributes.js | 12 ++++++++- src/traces/bar/style.js | 46 +++++++-------------------------- 3 files changed, 24 insertions(+), 44 deletions(-) diff --git a/src/components/drawing/index.js b/src/components/drawing/index.js index 0131db6b4f1..ebe98c94e57 100644 --- a/src/components/drawing/index.js +++ b/src/components/drawing/index.js @@ -249,8 +249,6 @@ drawing.symbolNumber = function(v) { }; function singlePointStyle(d, sel, trace, markerScale, lineScale, marker, markerLine, gd) { - // only scatter & box plots get marker path and opacity - // bars, histograms don't if(Registry.traceIs(trace, 'symbols')) { var sizeFn = makeBubbleSizeFn(trace); @@ -277,12 +275,13 @@ function singlePointStyle(d, sel, trace, markerScale, lineScale, marker, markerL return drawing.symbolFuncs[xBase](r) + (x >= 200 ? DOTPATH : ''); - }) - .style('opacity', function(d) { - return (d.mo + 1 || marker.opacity + 1) - 1; }); } + sel.style('opacity', function(d) { + return (d.mo + 1 || marker.opacity + 1) - 1; + }); + var perPointGradient = false; // 'so' is suspected outliers, for box plots @@ -410,7 +409,6 @@ drawing.singlePointStyle = function(d, sel, trace, markerScale, lineScale, gd) { var marker = trace.marker; singlePointStyle(d, sel, trace, markerScale, lineScale, marker, marker.line, gd); - }; drawing.pointStyle = function(s, trace, gd) { diff --git a/src/traces/bar/attributes.js b/src/traces/bar/attributes.js index fe07126e117..17a0a39d97f 100644 --- a/src/traces/bar/attributes.js +++ b/src/traces/bar/attributes.js @@ -38,7 +38,17 @@ var marker = extendFlat({ editType: 'calc' }, colorAttributes('marker'), { showscale: scatterMarkerAttrs.showscale, - colorbar: colorbarAttrs + colorbar: colorbarAttrs, + opacity: { + valType: 'number', + arrayOk: true, + dflt: 1, + min: 0, + max: 1, + role: 'style', + editType: 'style', + description: 'Sets the opacity of the bars.' + } }); diff --git a/src/traces/bar/style.js b/src/traces/bar/style.js index 633a89dbc7d..9fb91d69e48 100644 --- a/src/traces/bar/style.js +++ b/src/traces/bar/style.js @@ -10,16 +10,13 @@ 'use strict'; var d3 = require('d3'); - -var Color = require('../../components/color'); var Drawing = require('../../components/drawing'); var ErrorBars = require('../../components/errorbars'); - -module.exports = function style(gd) { - var s = d3.select(gd).selectAll('g.trace.bars'), - barcount = s.size(), - fullLayout = gd._fullLayout; +module.exports = function style(gd, cd) { + var s = cd ? cd[0].node3 : d3.select(gd).selectAll('g.trace.bars'); + var barcount = s.size(); + var fullLayout = gd._fullLayout; // trace styling s.style('opacity', function(d) { return d[0].trace.opacity; }) @@ -36,38 +33,13 @@ module.exports = function style(gd) { } }); - // then style the individual bars s.selectAll('g.points').each(function(d) { - var trace = d[0].trace, - marker = trace.marker, - markerLine = marker.line, - markerScale = Drawing.tryColorscale(marker, ''), - lineScale = Drawing.tryColorscale(marker, 'line'); - - d3.select(this).selectAll('path').each(function(d) { - // allow all marker and marker line colors to be scaled - // by given max and min to colorscales - var fillColor, - lineColor, - lineWidth = (d.mlw + 1 || markerLine.width + 1) - 1, - p = d3.select(this); - - if('mc' in d) fillColor = d.mcc = markerScale(d.mc); - else if(Array.isArray(marker.color)) fillColor = Color.defaultLine; - else fillColor = marker.color; - - p.style('stroke-width', lineWidth + 'px') - .call(Color.fill, fillColor); - if(lineWidth) { - if('mlc' in d) lineColor = d.mlcc = lineScale(d.mlc); - // weird case: array wasn't long enough to apply to every point - else if(Array.isArray(markerLine.color)) lineColor = Color.defaultLine; - else lineColor = markerLine.color; + var sel = d3.select(this); + var pts = sel.selectAll('.point'); + var trace = d[0].trace; - p.call(Color.stroke, lineColor); - } - }); + Drawing.pointStyle(pts, trace, gd); }); - s.call(ErrorBars.style); + ErrorBars.style(s); }; From 5cfadbd5ef8fed78740b82ec77ae982e40abf7d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:34:42 -0400 Subject: [PATCH 13/43] persistent selection for 'bar' & 'histogram' traces - note that Drawing.font needs to be called in Bar.plot to find out if the text label fit inside the bars. --- src/traces/bar/arrays_to_calcdata.js | 2 ++ src/traces/bar/attributes.js | 4 +++- src/traces/bar/calc.js | 4 ++-- src/traces/bar/defaults.js | 4 +++- src/traces/bar/plot.js | 11 +++++++++-- src/traces/bar/select.js | 16 +++------------- src/traces/bar/style.js | 23 +++++++++++++++++++++++ src/traces/bar/style_defaults.js | 11 ++++++++++- src/traces/histogram/attributes.js | 3 +++ src/traces/histogram/calc.js | 2 ++ 10 files changed, 60 insertions(+), 20 deletions(-) diff --git a/src/traces/bar/arrays_to_calcdata.js b/src/traces/bar/arrays_to_calcdata.js index 675364e9920..f209e0b4cca 100644 --- a/src/traces/bar/arrays_to_calcdata.js +++ b/src/traces/bar/arrays_to_calcdata.js @@ -14,6 +14,8 @@ var mergeArray = require('../../lib').mergeArray; // arrayOk attributes, merge them into calcdata array module.exports = function arraysToCalcdata(cd, trace) { + for(var i = 0; i < cd.length; i++) cd[i].i = i; + mergeArray(trace.text, cd, 'tx'); mergeArray(trace.hovertext, cd, 'htx'); diff --git a/src/traces/bar/attributes.js b/src/traces/bar/attributes.js index 17a0a39d97f..c0b26e8f086 100644 --- a/src/traces/bar/attributes.js +++ b/src/traces/bar/attributes.js @@ -51,7 +51,6 @@ var marker = extendFlat({ } }); - module.exports = { x: scatterAttrs.x, x0: scatterAttrs.x0, @@ -160,6 +159,9 @@ module.exports = { marker: marker, + selected: scatterAttrs.selected, + unselected: scatterAttrs.unselected, + r: scatterAttrs.r, t: scatterAttrs.t, diff --git a/src/traces/bar/calc.js b/src/traces/bar/calc.js index 40389a6d514..632ce0adec6 100644 --- a/src/traces/bar/calc.js +++ b/src/traces/bar/calc.js @@ -14,9 +14,8 @@ var isNumeric = require('fast-isnumeric'); var Axes = require('../../plots/cartesian/axes'); var hasColorscale = require('../../components/colorscale/has_colorscale'); var colorscaleCalc = require('../../components/colorscale/calc'); - var arraysToCalcdata = require('./arrays_to_calcdata'); - +var calcSelection = require('../scatter/calc_selection'); module.exports = function calc(gd, trace) { // depending on bar direction, set position and size axes @@ -92,6 +91,7 @@ module.exports = function calc(gd, trace) { } arraysToCalcdata(cd, trace); + calcSelection(cd, trace); return cd; }; diff --git a/src/traces/bar/defaults.js b/src/traces/bar/defaults.js index 84e26f5a0f2..259759ef3a4 100644 --- a/src/traces/bar/defaults.js +++ b/src/traces/bar/defaults.js @@ -17,7 +17,6 @@ var handleStyleDefaults = require('../bar/style_defaults'); var errorBarsSupplyDefaults = require('../../components/errorbars/defaults'); var attributes = require('./attributes'); - module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); @@ -44,11 +43,14 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout var hasBoth = Array.isArray(textPosition) || textPosition === 'auto', hasInside = hasBoth || textPosition === 'inside', hasOutside = hasBoth || textPosition === 'outside'; + if(hasInside || hasOutside) { var textFont = coerceFont(coerce, 'textfont', layout.font); if(hasInside) coerceFont(coerce, 'insidetextfont', textFont); if(hasOutside) coerceFont(coerce, 'outsidetextfont', textFont); coerce('constraintext'); + coerce('selected.textfont.color'); + coerce('unselected.textfont.color'); } handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout); diff --git a/src/traces/bar/plot.js b/src/traces/bar/plot.js index 2e37ef7292a..83de22f5e06 100644 --- a/src/traces/bar/plot.js +++ b/src/traces/bar/plot.js @@ -42,10 +42,14 @@ module.exports = function plot(gd, plotinfo, cdbar) { bartraces.enter().append('g') .attr('class', 'trace bars'); + bartraces.each(function(d) { + d[0].node3 = d3.select(this); + }); + bartraces.append('g') .attr('class', 'points') .each(function(d) { - var sel = d[0].node3 = d3.select(this); + var sel = d3.select(this); var t = d[0].t; var trace = d[0].trace; var poffset = t.poffset; @@ -146,6 +150,8 @@ module.exports = function plot(gd, plotinfo, cdbar) { }; function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { + var textPosition; + function appendTextNode(bar, text, textFont) { var textSelection = bar.append('text') .text(text) @@ -157,6 +163,7 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { // tex and regular text together 'data-notex': 1 }) + .classed('bartext-' + textPosition, true) .call(Drawing.font, textFont) .call(svgTextUtils.convertToTspans, gd); @@ -170,7 +177,7 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { var text = getText(trace, i); if(!text) return; - var textPosition = getTextPosition(trace, i); + textPosition = getTextPosition(trace, i); if(textPosition === 'none') return; var textFont = getTextFont(trace, i, gd._fullLayout.font), diff --git a/src/traces/bar/select.js b/src/traces/bar/select.js index 76b1b786b7f..16f40dbaec3 100644 --- a/src/traces/bar/select.js +++ b/src/traces/bar/select.js @@ -8,20 +8,17 @@ 'use strict'; -var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; - module.exports = function selectPoints(searchInfo, polygon) { var cd = searchInfo.cd; var xa = searchInfo.xaxis; var ya = searchInfo.yaxis; var selection = []; - var node3 = cd[0].node3; var i; if(polygon === false) { // clear selection for(i = 0; i < cd.length; i++) { - cd[i].dim = 0; + cd[i].selected = 0; } } else { for(i = 0; i < cd.length; i++) { @@ -33,19 +30,12 @@ module.exports = function selectPoints(searchInfo, polygon) { x: xa.c2d(di.x), y: ya.c2d(di.y) }); - di.dim = 0; + di.selected = 1; } else { - di.dim = 1; + di.selected = 0; } } } - node3.selectAll('.point').style('opacity', function(d) { - return d.dim ? DESELECTDIM : 1; - }); - node3.selectAll('text').style('opacity', function(d) { - return d.dim ? DESELECTDIM : 1; - }); - return selection; }; diff --git a/src/traces/bar/style.js b/src/traces/bar/style.js index 9fb91d69e48..ad5d0164852 100644 --- a/src/traces/bar/style.js +++ b/src/traces/bar/style.js @@ -36,9 +36,32 @@ module.exports = function style(gd, cd) { s.selectAll('g.points').each(function(d) { var sel = d3.select(this); var pts = sel.selectAll('.point'); + var txs = sel.selectAll('text'); var trace = d[0].trace; Drawing.pointStyle(pts, trace, gd); + Drawing.selectedPointStyle(pts, trace); + + txs.each(function(d) { + var tx = d3.select(this); + var textFont; + + if(tx.classed('bartext-inside')) { + textFont = trace.insidetextfont; + } else if(tx.classed('bartext-outside')) { + textFont = trace.outsidetextfont; + } + if(!textFont) textFont = trace.textfont; + + function cast(k) { + var cont = textFont[k]; + return Array.isArray(cont) ? cont[d.i] : cont; + } + + Drawing.font(tx, cast('family'), cast('size'), cast('color')); + }); + + Drawing.selectedTextStyle(txs, trace); }); ErrorBars.style(s); diff --git a/src/traces/bar/style_defaults.js b/src/traces/bar/style_defaults.js index 3ccd7494554..69bd8c09140 100644 --- a/src/traces/bar/style_defaults.js +++ b/src/traces/bar/style_defaults.js @@ -12,7 +12,7 @@ var Color = require('../../components/color'); var hasColorscale = require('../../components/colorscale/has_colorscale'); var colorscaleDefaults = require('../../components/colorscale/defaults'); - +var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout) { coerce('marker.color', defaultColor); @@ -32,4 +32,13 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, default } coerce('marker.line.width'); + + var mo = coerce('marker.opacity'); + var moEffective = Array.isArray(mo) ? 1 : mo; + + coerce('selected.marker.opacity', moEffective); + coerce('unselected.marker.opacity', DESELECTDIM * moEffective); + + coerce('selected.marker.color'); + coerce('unselected.marker.color'); }; diff --git a/src/traces/histogram/attributes.js b/src/traces/histogram/attributes.js index 2abb11323e7..acd3453144f 100644 --- a/src/traces/histogram/attributes.js +++ b/src/traces/histogram/attributes.js @@ -191,6 +191,9 @@ module.exports = { marker: barAttrs.marker, + selected: barAttrs.selected, + unselected: barAttrs.unselected, + error_y: barAttrs.error_y, error_x: barAttrs.error_x, diff --git a/src/traces/histogram/calc.js b/src/traces/histogram/calc.js index ebf22aaf7f2..95a80db06b9 100644 --- a/src/traces/histogram/calc.js +++ b/src/traces/histogram/calc.js @@ -15,6 +15,7 @@ var Lib = require('../../lib'); var Axes = require('../../plots/cartesian/axes'); var arraysToCalcdata = require('../bar/arrays_to_calcdata'); +var calcSelection = require('../scatter/calc_selection'); var binFunctions = require('./bin_functions'); var normFunctions = require('./norm_functions'); var doAvg = require('./average'); @@ -196,6 +197,7 @@ module.exports = function calc(gd, trace) { } arraysToCalcdata(cd, trace); + calcSelection(cd, trace); return cd; }; From f54a08a0e34b8de127ee9cae8a890a886cd58042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:36:26 -0400 Subject: [PATCH 14/43] persistent selections for 'scattermapbox' - support only 'marker.opacity' until we bump mapbox-gl --- src/traces/scattermapbox/attributes.js | 11 +++++ src/traces/scattermapbox/convert.js | 15 +++++-- src/traces/scattermapbox/defaults.js | 13 ++++-- src/traces/scattermapbox/index.js | 7 ++++ src/traces/scattermapbox/select.js | 13 ++---- test/jasmine/tests/scattermapbox_test.js | 51 ++++++++++-------------- 6 files changed, 63 insertions(+), 47 deletions(-) diff --git a/src/traces/scattermapbox/attributes.js b/src/traces/scattermapbox/attributes.js index a907e34905d..3a27f18924a 100644 --- a/src/traces/scattermapbox/attributes.js +++ b/src/traces/scattermapbox/attributes.js @@ -107,6 +107,17 @@ module.exports = overrideAll({ textfont: mapboxAttrs.layers.symbol.textfont, textposition: mapboxAttrs.layers.symbol.textposition, + selected: { + marker: { + opacity: scatterAttrs.selected.marker.opacity + } + }, + unselected: { + marker: { + opacity: scatterAttrs.unselected.marker.opacity + } + }, + hoverinfo: extendFlat({}, plotAttrs.hoverinfo, { flags: ['lon', 'lat', 'text', 'name'] }) diff --git a/src/traces/scattermapbox/convert.js b/src/traces/scattermapbox/convert.js index 7b88ee647d6..790d97eb962 100644 --- a/src/traces/scattermapbox/convert.js +++ b/src/traces/scattermapbox/convert.js @@ -185,8 +185,15 @@ function makeCircleGeoJSON(calcTrace, hash) { sizeFn = makeBubbleSizeFn(trace); } - function combineOpacities(d, mo) { - return trace.opacity * mo * (d.dim ? DESELECTDIM : 1); + var combineOpacities; + if(trace.selectedpoints) { + combineOpacities = function(d, mo) { + return trace.opacity * mo * (d.selected ? 1 : DESELECTDIM); + }; + } else { + combineOpacities = function(d, mo) { + return trace.opacity * mo; + }; } var opacityFn; @@ -195,7 +202,7 @@ function makeCircleGeoJSON(calcTrace, hash) { var mo = isNumeric(d.mo) ? +Lib.constrain(d.mo, 0, 1) : 0; return combineOpacities(d, mo); }; - } else if(trace._hasDimmedPts) { + } else if(trace.selectedpoints) { opacityFn = function(d) { return combineOpacities(d, marker.opacity); }; @@ -343,7 +350,7 @@ function calcCircleOpacity(trace, hash) { var marker = trace.marker; var out; - if(Array.isArray(marker.opacity) || trace._hasDimmedPts) { + if(Array.isArray(marker.opacity) || trace.selectedpoints) { var vals = Object.keys(hash[OPACITY_PROP]); var stops = []; diff --git a/src/traces/scattermapbox/defaults.js b/src/traces/scattermapbox/defaults.js index 4ff10674e2e..6b6d4c1f6f5 100644 --- a/src/traces/scattermapbox/defaults.js +++ b/src/traces/scattermapbox/defaults.js @@ -16,10 +16,9 @@ var handleMarkerDefaults = require('../scatter/marker_defaults'); var handleLineDefaults = require('../scatter/line_defaults'); var handleTextDefaults = require('../scatter/text_defaults'); var handleFillColorDefaults = require('../scatter/fillcolor_defaults'); - +var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; var attributes = require('./attributes'); - module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); @@ -41,7 +40,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } if(subTypes.hasMarkers(traceOut)) { - handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce, {noLine: true}); + handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce, {noLine: true, noSelect: true}); // array marker.size and marker.color are only supported with circles @@ -53,10 +52,16 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout if(Array.isArray(marker.size)) marker.size = marker.size[0]; if(Array.isArray(marker.color)) marker.color = marker.color[0]; } + + // only marker.opacity for now + var mo = traceOut.marker.opacity; + var moEffective = Array.isArray(mo) ? 1 : mo; + coerce('selected.marker.opacity', moEffective); + coerce('unselected.marker.opacity', DESELECTDIM * moEffective); } if(subTypes.hasText(traceOut)) { - handleTextDefaults(traceIn, traceOut, layout, coerce); + handleTextDefaults(traceIn, traceOut, layout, coerce, {noSelect: true}); } coerce('fill'); diff --git a/src/traces/scattermapbox/index.js b/src/traces/scattermapbox/index.js index 251432a82ff..aff2dc9bf5f 100644 --- a/src/traces/scattermapbox/index.js +++ b/src/traces/scattermapbox/index.js @@ -20,6 +20,13 @@ ScatterMapbox.hoverPoints = require('./hover'); ScatterMapbox.eventData = require('./event_data'); ScatterMapbox.selectPoints = require('./select'); +ScatterMapbox.style = function(_, cd) { + if(cd) { + var trace = cd[0].trace; + trace._glTrace.update(cd); + } +}; + ScatterMapbox.moduleType = 'trace'; ScatterMapbox.name = 'scattermapbox'; ScatterMapbox.basePlotModule = require('../../plots/mapbox'); diff --git a/src/traces/scattermapbox/select.js b/src/traces/scattermapbox/select.js index 35eaf523e9a..6e2dc7f25a4 100644 --- a/src/traces/scattermapbox/select.js +++ b/src/traces/scattermapbox/select.js @@ -20,15 +20,11 @@ module.exports = function selectPoints(searchInfo, polygon) { var di, lonlat, x, y, i; - // flag used in ./convert.js - // to not insert data-driven 'circle-opacity' when we don't need to - trace._hasDimmedPts = false; - if(!subtypes.hasMarkers(trace)) return []; if(polygon === false) { for(i = 0; i < cd.length; i++) { - cd[i].dim = 0; + cd[i].selected = 0; } } else { for(i = 0; i < cd.length; i++) { @@ -38,20 +34,17 @@ module.exports = function selectPoints(searchInfo, polygon) { y = ya.c2p(lonlat); if(polygon.contains([x, y])) { - trace._hasDimmedPts = true; selection.push({ pointNumber: i, lon: lonlat[0], lat: lonlat[1] }); - di.dim = 0; + di.selected = 1; } else { - di.dim = 1; + di.selected = 0; } } } - trace._glTrace.update(cd); - return selection; }; diff --git a/test/jasmine/tests/scattermapbox_test.js b/test/jasmine/tests/scattermapbox_test.js index 3c8b98e12d0..f4efc19421b 100644 --- a/test/jasmine/tests/scattermapbox_test.js +++ b/test/jasmine/tests/scattermapbox_test.js @@ -110,7 +110,7 @@ describe('scattermapbox defaults', function() { describe('scattermapbox convert', function() { 'use strict'; - function _convert(trace, selected) { + function _convert(trace) { var gd = { data: [trace] }; Plots.supplyDefaults(gd); @@ -118,18 +118,6 @@ describe('scattermapbox convert', function() { Plots.doCalcdata(gd, fullTrace); var calcTrace = gd.calcdata[0]; - - if(selected) { - var hasDimmedPts = false; - - selected.forEach(function(v, i) { - if(v) hasDimmedPts = true; - calcTrace[i].dim = v; - }); - - fullTrace._hasDimmedPts = hasDimmedPts; - } - return convert(calcTrace); } @@ -226,36 +214,41 @@ describe('scattermapbox convert', function() { }; var specs = [{ - patch: {}, - selected: [0, 1, 1], - expected: {stops: [[0, 1], [1, 0.2]], props: [0, 1, 1]} + patch: { + selectedpoints: [1, 2] + }, + expected: {stops: [[0, 0.2], [1, 1]], props: [0, 1, 1]} }, { - patch: {opacity: 0.5}, - selected: [0, 1, 1], - expected: {stops: [[0, 0.5], [1, 0.1]], props: [0, 1, 1]} + patch: { + opacity: 0.5, + selectedpoints: [1, 2] + }, + expected: {stops: [[0, 0.1], [1, 0.5]], props: [0, 1, 1]} }, { patch: { - marker: {opacity: 0.6} + marker: {opacity: 0.6}, + selectedpoints: [1, 2] }, - selected: [1, 0, 1], - expected: {stops: [[0, 0.12], [1, 0.6]], props: [0, 1, 0]} + expected: {stops: [[0, 0.12], [1, 0.6]], props: [0, 1, 1]} }, { patch: { - marker: {opacity: [0.5, 1, 0.6]} + marker: { + opacity: [0.5, 1, 0.6], + }, + selectedpoints: [0, 2] }, - selected: [1, 0, 1], - expected: {stops: [[0, 0.1], [1, 1], [2, 0.12]], props: [0, 1, 2]} + expected: {stops: [[0, 0.5], [1, 0.2], [2, 0.6]], props: [0, 1, 2]} }, { patch: { - marker: {opacity: [2, null, -0.6]} + marker: {opacity: [2, null, -0.6]}, + selectedpoints: [0, 1, 2] }, - selected: [1, 1, 1], - expected: {stops: [[0, 0.2], [1, 0]], props: [0, 1, 1]} + expected: {stops: [[0, 1], [1, 0]], props: [0, 1, 1]} }]; specs.forEach(function(s, i) { var msg0 = '- case ' + i + ' '; - var opts = _convert(Lib.extendDeep({}, _base, s.patch), s.selected); + var opts = _convert(Lib.extendDeep({}, _base, s.patch)); expect(opts.circle.paint['circle-opacity'].stops) .toEqual(s.expected.stops, msg0 + 'stops'); From d4d1728dc1a682abfe2c5831cddef60c3c8f7dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:36:53 -0400 Subject: [PATCH 15/43] don't coerce selected/unselected in scatter3d traces --- src/traces/scatter3d/defaults.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/traces/scatter3d/defaults.js b/src/traces/scatter3d/defaults.js index 89e0985709f..f33ded47f93 100644 --- a/src/traces/scatter3d/defaults.js +++ b/src/traces/scatter3d/defaults.js @@ -43,11 +43,11 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } if(subTypes.hasMarkers(traceOut)) { - handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce); + handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce, {noSelect: true}); } if(subTypes.hasText(traceOut)) { - handleTextDefaults(traceIn, traceOut, layout, coerce); + handleTextDefaults(traceIn, traceOut, layout, coerce, {noSelect: true}); } var lineColor = (traceOut.line || {}).color, From eeaca743d0621cbba3ddd0a4d0630565c0819f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:37:37 -0400 Subject: [PATCH 16/43] do not implement persistent selections in scattergl traces (for now) - wait until regl rewrite. --- src/plots/plots.js | 2 +- src/traces/scattergl/defaults.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plots/plots.js b/src/plots/plots.js index 2618f0593af..a666aca97d7 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -1022,7 +1022,7 @@ plots.supplyTraceDefaults = function(traceIn, traceOutIndex, layout, traceInInde traceOut.visible = !!traceOut.visible; } - if(_module && _module.selectPoints) { + if(_module && _module.selectPoints && traceOut.type !== 'scattergl') { coerce('selectedpoints'); coerce('selectedids'); } diff --git a/src/traces/scattergl/defaults.js b/src/traces/scattergl/defaults.js index 442363ae113..b2bbdf5ca98 100644 --- a/src/traces/scattergl/defaults.js +++ b/src/traces/scattergl/defaults.js @@ -42,7 +42,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } if(subTypes.hasMarkers(traceOut)) { - handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce); + handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce, {noSelect: true}); } coerce('fill'); From 5ca8b36725caafd759ada141b214700734978403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 16:37:46 -0400 Subject: [PATCH 17/43] improve point-selection mock --- test/image/baselines/point-selection.png | Bin 0 -> 27898 bytes test/image/mocks/point-selection.json | 31 +++++++++++++++-------- 2 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 test/image/baselines/point-selection.png diff --git a/test/image/baselines/point-selection.png b/test/image/baselines/point-selection.png new file mode 100644 index 0000000000000000000000000000000000000000..1a0ae5b63d23d943747f3ae99e016e443ec4b670 GIT binary patch literal 27898 zcmeFZWn5Hk-!^JcqO^2_fHFf!N~<&oNDn zbFedK&TbOmflnsxYWJQw!*WJh?v{>+=}OXt*OU!?XcCD_1VwAl`AKhHzMRJPYl57e zyQ?6Cyy3ya`kOe&pRyb*a_pgOq@O=)%683yY8W&W8UU?7 zPHdEDzvMo<9lzl1-@F{qbW{Zrz-iz}&|wf4rzi?F@$S#(BGbROB`7cg-2f(bGk3ywUi~ zK6h<z$_Uo5ujh!S^QY{sQFW{Kv~ zh`k>nrKc{nrDITd@0sNB!A7zLk6Ep;-%i!Ia=GK^xmxk}0e>DH7d-k$gD-3OIeK}E zhsBTQ)NMw}@(zAR_{TuJm~5* zJKoc;n0hHuUA#J4H9*gKu#s{Mtq&%N8!EPL10Pw=e@S&7bsb=Zoh_QvIeqjv0v6a= ztEt-k)#zj?@755mWSB?4*yC9b=2EAjB6%tv!|6l!joFS&_q8zsy(i0Jl&4XN;~YV( z>d;%>KU*M&ID?o`qN_73)Y6+hY|2%0+ey#V4YpUbRS^CYozUbr(WuYoULJRiT%17; zMNqZsE^l%hSQGD+GK^N~f7GA;Ye%mnoIxP%KUpRomp09{e!I4VGzd7$9@MgM9$zOb zHjJ7tHa$Xm*eC+h*VLb9G_zW@78@aR1Y7LOZE2zqDbD_;yUJ(s2h*vS3h60 z$i(^H#KZ5?V2YXe-JAiGr_#5NPtS9Rik74CRW0X#O-00!u`4L)>BUmld2QL+^kjsT z6V|lq`1#eAyA1>p(N_ystyV7aicLOemkT~9;j%wE*j@j0k4zJxRiy zxBBRvTEg_+QUSF|4x8J2#ZrGBq;9XTfP9SP?1}L_#o9&Gs|wbp9kove6e$8b;~P_W z$jhkWE@`888Y#RyMrAMP>nvKx3kFp6-yV;QAI&PqI<9DM(ug`HCVI}sJNGDadCK@r zM=HvBqg<}?yZIb$4G6d`!<>}(-R5tjhNpCecz-65ojpmj1k_+-F6^!gZpOV}f-ej{ebmWvaErM5rx-Ht}S2QklLs(K=c8g8lAij{Ldms@0;VT9 z8&nG3vf-JG+;(#*{8HV`j_ho6auhFCClD*Y8 z(_IhWErLhf@v2kl)Jc@|EE>3<=`FAby-itcP;5o%w~ypJFs3@W?JFH@*!__cI3Lt0 z?wzlKSCKpT(48sgd3(<|U&9Rn_>)NV)eC92i0SQbP|1yVvG?B+gWD0;JBAegNNSTiD!%ER9ml==rQo9 zln)Qpwf}HehI1gIZlu(X`bVD_`!2P&V=>U#6@>~-CVt`qoIn&?@Js;`i;=qjO05b<=Ja4k*7W+o%DEKY=(l!i3jze<^>@o- zQ}H1;e{sro9`e0X5VqS5<)O`>=U+PVuPlJKguiZcy?sBmx>~Y3;@Gt!l-Hz^1*YH^DEqto zz5yP@rgda9LOKRt#&B_IQQv)mGoXrL3Q}hA%5n8zxwuOuLBydtJaMgJj>$PZJl1Mr&8U3Lo^2VcCE=A=IZe5ZP`Wp}5PS4I#ZNsxK zG5R0;6u9@9pry5SeNw-`lt=B2&`-To{rJ|duATnXVYGQbxz&J)`zVJZ!=pg^(aJuF zu7ll;nP=3dKl%@PwrYhqxwsU?-CxQiX7BUcis3-a=`Q?kP@WP1YlwRFIYs(#;7X$K z&ui2s4{g4^jY7C?4_UWuE_}_jZ2QIhh0mbq^U_ui<^1t>d7WoerqTXoDG=JYtdl+8 zCA#z|k3}$hPLp*{D4DcKk3EHRbTX6uHYHLodU+OK->LQdD+>Qk>Z6seGpB(#A^SNzGduN>!S5PG=^}7toS)Ct& zU2-z_l5|LAh$|@Jd$gavGI5>jOk&EV6SfUR%`RlGlE@se>~F6`qfn?#9Tp3HT|Ei6 zW!6l0L+U6D-apxk!GCkz+#lP z{gaf^q+r9*y8Tb#L&L8j-2}0ac>dmi;Epq4thec*WVg`v&EQQ6?ogv>@<3Wru5w$+ z(8^S~aCW^@<9Tz-8JxD3k}m<27KZbfqHZ~~ef976UOEHbz2ET@O*s4+zukdDW313$ zdx8B5_~X4#^w>YT6U6e^obKYu%MiroH3W*%VF=AvNufqP|JX+Gg zjK7`0GdTEwiel^m4kWNb7HzK#{+&F_$r`^Ag zK{!ZHjss!&q(K}e0z(B@&Vt8!b#kYFegS+AZfXTCB%(bz3eO6ya~Nk1iXbl*7#<9K zPKEe?dHGDrz!;*Y$hl3$pwRJ|%Y(67Mf4V`eXY8ODNmY9KxNz$TIWNph_?Ust9i6B zEaIEP$;&~m7x?b)v@E66@UEden=W>OP%iSUe=4J&tHnk!nNycrSJ{V+tw-eyM&-$I zymfLU=rumTVruVlslB>Gu-Zv^6iH!viZ?j@C6cjOW`P1 zsbCg^vUhRo4{+L^`v6~A2PJrabUtt)8dZFXm++w*Z2w$ksjshqYTLMhO_fj&#kKUp z&3f=VMUoci8Oe5{HKebNlsQD_=2y1D1U@_j=0X13RZdSW*TrN&oq-hWuplT2v$QcD2@|x5;qi-9ogb;2 z@S)c|0hUwpBp^6Qfi2mD@2+856Y6f(?zuecMVT1wCHp7qsetw&Kb~SfzAELt9aG#X-ew&#{S4S{**|REa-+u}P@`7FD7Mq=JMOmRlu-6S ziSmRvtgxq&iK>{u;pCA>Ch0}&UzyhjwIqr??kN+J?Y3ouNk{2j!THBQ*_)>LuZI|W z?(eQ29z)EQxi|P$N_)m2QqHR>+>G8XGB{V)e2nNHbI_fHi63ZM5JE&i zsE7w?L^cS{IGs6ewBWA4ci8u~P*k zWHjb{iCbUZ`ch+h%fIc@-{PEQC0t6_^G)^9=dYQaG$0+Uw9J5TF|!<_C5qD)E7T7x z=N{upW`soJwspO@1yVt>F)&=?PGSV5k{j4Ih0|2gs)OmF4VdDq=n2s6|6ji-hZ(MR ztl`r4v%16vE8CuS7DCK8yOE-976rhE_)nck|J{XH*G3kErJV+^B0G%N8XrS=MFKoL z`)S;;d;>SI{@)hhyr9=j8*rb=7e*)IWEHS=Ux*^1^%>8~Gg4H^`;Vq)nMCLX|CZ(i zGz?PKjjZ%HjIw@qmVa^PqQW?HQPU8vJ%nj8+ zrH1R>z}s4HH3fqDp8`cc1~+&91;){LzxhkZl*7Ycs;(^6#$p!`Gb)^ywr-*?p=sDk zF!yp91VPdcg0>k;CT^X?J1>ZU#B_Bm$s7!Wgh(ms7b!5!4^KCyt9RSmK|C~NGi z)3{;9P6;e~=H7YYrI~DkcvIc~Zc*R@^!%y4rd@^I`j=%u!iR=R?c(geebC%|maYi8 z>njil#5|l775F?9*TRdWA2g-a@iEx;XwW=Zd8#qI4M&M2HqRHEkToe#Z~t{*$j0Sm zfFEwJjq~;8=u#YJzAJM5Os04RMTS64a#540N9X7sD-n|KY)7 z4ds6GBk$)9CBz_%%%sL131Feix8r6uYo8(&nXZANc%A7jK(E+;uW~VVtm^1%n*7Bz zdZ>dtSez$XKnhl-fVJ0WCTLS{pZxYD=ag~=S@qQ#%HjK8_{4D9_^y>tg1%?=K4@Ul zm|2(jYQ44=J?jWYN^GLh3X=90$S5y1TVS+ExmR0ndMn4vKd_VV1Ldzw3~^(i0eXG5 zj-!IT$wQRlGgE+H%g@do)z-WlIBj`8zjBC368P>sy9EkY5yQ!j2YvBD0K7p{bu@c` zpt6l7)XTB@kC6!~WE;?MJNw0- zQWXs0@QOr6FZ8(x!dO4HwCn0jQT!#Hn|MM!fnb12Frfse79a-{E__aN_aoV_+L0_$4>M?;kRO4N~xiX>;ij?JIi-!6!U;SyMK5??5zE1%- z+zFCSN$u&+6cE3ptmLy8Zi(Wh{t(II>gK&I{K@U*p{cwMDkHunE*UbhHA%Aidp|TC zR35E?JeMhP38CxK`27i4{q*M3^Y)^&4?$_p|K)NLF=qYj-opEo*i6;9*5jkKW3MIM z%yn4d?dig%P_x1e_(F=QPoYvUaW=}pBmWs3nUuS~MhzO{fa?GxJeKn=0yxNzX-TB8 zJlej*gc{}2Me{B(Z1m3t$i=2d#z{VY!IW=zK$j`arWhGU;5lBx^^WKOVs_Tx_%*beue@g6D{@PjnJ zTm)~hx+HQ^ecV{^zO=^?4B!17XOS$-VN^U(Mou-lj#L$-m0YS5^6L`l1wwOdoZNmcc@Xts2y-%`S&o#KQS zfgS={dwjIN{+U9fdDMN}ghtGHTB%|(6q50HuG5AL71!^>yX3wSvxwY^gKM|sdwP$T4BK!$E@HwVY3bAMR)RH&0P; zdY3!(tqx@eAZ$5>a1a_>~0qD7?wD;|r@tx_7c7tv%v1gcK&Dg?J%$7SR=S=aw)0S2L} zB22Gu(?oBtc<;30Cy@B;nx;EbE_8p0H}-U64& zNef&DXq(v73&ClC7{*$*#kM55k1br#=MKVY-D^Jlx>nXKu{6-SityE{=_aQ2b9JTt zHbWzZGIV8jM~bl$=p7gz+pW;i?vx{ooNt}ydutbCn{0}@6 zEZVy&RU#UF=JjK)A}qb*K3stTH23ue@8v^x@of;kfH$7RQbp+!YE>DR0e?~Z!Mpi2 z+lC9h+0hYElqAX}cj`&@w>@h}?5dzqZ#v37osnN_-fzmJ`8Mz|MGCUO8Yr^wNqa8b zGbnl#u!Ao=zHqIn{{e)^jtORzHx2#NRqlYaERAhDa)eaNtc{n|OuHq5tm$xxf)v>P~|5DZVrrnH#H`SADs#~l-g)=rEl}S}u z?kO_2PC;V5kImj23Rk3#Xk;peZ(pFMlR8WsU2lIgW9liTGhMLSqsF`V>P_8)58wRA zphj-SWGGPLx;T8dPgNj^eHJTGNDwPgakZG!ue`OJHL1lj%wn|jJTru3`HR?8FcBFv z($fqT1wNK)>5*+v!p)w4Sd^0I+`n>_cb)qO_j!!DZ=nEu?3;)eB;N5MzxtB z9H|695%2zq1|#YkldFFgwqBq@J=-uPU#aO~pF7I#DO7YHABj(K`H>to#9l8Kv?sdB;0n9!stOhl}gKtY?N#Uh#&fy|PpJl=32#FnW6jbqT7 zy%ft_pEqfTwHse`q?0Aktnk7IbF`vo6R0( zN1MMR(DMvBKP9Z43vcMubRPT>LzP#vR;=?O&4&e6w){>OTMsXL7`wN$B-!S=yh(4{ z=+tfgl^=-M;7p!=JkVeVWiTwwK*@~yPtGuVu&%VjA9Dd zO2Pc~-_vc9)}kI6*bRZ`Afj|AjFOS~P7r)SOweW!)MGVr+B`4~wPel$nV&8X{?Q>s zU4?lq-k}wFkp^#|Cq9tviatmC60$~WUOoHfLVXZH>_P zZcDOzVb2z8qxXEZzj$kK%A(UwEiIcA#ozV!{wV{7R#|c&*pIzxP7P(W`dV||6?T`z z1S*s@@zFyKYJi}u((4TZraYo5G=xpc@bX$;i}}w#%Lv737(ct06OZXl=LQ16ts&cE zP{l8UVU|bp6E|#FJM*6K+J>$vM6K~5TpS1Dre^Y1$9wu-SWJ*>87l}UA)H3&Ptx~a zF+q*Ioy9=kDkfpGhyf_b)lHE=O|+IU!)tX+kDWJpeEHxAq&vEqlvgVh>n$ypQE7sB zO_F|%;t@e>Dlom9399&<*EiuOK$7a%ZFsAMWb=Q~`+!>9~A zd<#KPIt||Sr`kW_nHfe&?@vIy*%y+<50HdCMJMuUNS_7I)3*VmZxqma1I*bzKoc6soRi!(%iz$ z22+2RxvWyLj(%o2_(d1vY<}a5Jce)tcq7<5ylXJc#Q$Nbv!QUCtxx>+^Kal4LJado zaB$&oGYz;5Wu)qzz@S&J&&MUIuKCota=z?HmL0+~_8By05^+&RhZ5uWXX|wsUDc@* zbY4)}7KhDL40se1nb3-WW}B8s1#LAha%;1G+tAfkHOA^s%>5bw+Tq(@0(6T)Tj)f- zVLPtj5@o|uTg%SZ7ZEcT<|o~&nPjB)${z5Dx-2bBL&d0Z+h%_Iz7ifQtdKT5(5B3!0(aU6<^P=Z0bB zCx8kx{0${C`&U;VthcStCOEY+x_^tjjG^;yK?1B^GvzuBi7Cza?u=(_njRiN$rb7k z&^Bx8o@H{H7{fZh8o(Ks@!$VjZ`#8PGiM}z5d~kU$!cDbyO@-h9h`qA@A83PMB3(4##jfTVmGcH}b%>5Dh0_UVnAUjNP@vEx_zG(1dpi`s zH|x3$4Ra-Tmo@e=c=DN7;$RaziJ+#Cxa^MZCxzlKK z`{;F+9g%h&jA4ayCRQ~CBq&y1VTL#m0BA)?IKOZ|x(Zy4+E{07*KbXf`w<8Qg0!W< z9bIViWqK4)Jt+YWR^C5*K@=u#@p{n-ohHOUFBakYp&*Spi!FrRpt%`XFwYQMu!m>Eyy2 zd6@H!yLC(5Yu<=uqDQG>L6-4&kX#EQdaE4xHUC3mEpN15f$54=g74mDBoHT+wfFua zgC&8m@@`)}fXy9F_wI=WzHgKdqQRl^EYGOW(|K{z&^h^~J3= zP6{uy%Gmuc^+EAa*o=*}9}XlM3!lu`=sL#ULVs&ljV}!at%;+tcbE%|>v?H-D+DIa z&Qs?8wqKR{VxMsJrbO~pX3Z50_nTrCYkJT^y=RU5dn+^bk6fpcZNy2Sx7;598_AMH zWEzdkQ;8PVoKF{LcpU;vYEA6jZ!!C2ej?_}&_BVzOmsDO|!SjfRpwWt`PS}i{==y`(_ zBOdc)``(fHPl;#a#|x7gmC^~Tk7(9zq7Uli1`4P>xBAW*)ObZ~E@;cD%b3UkZxUO( zy*A!X16l`vJ7*bkjI)ela4-K?T-B#n_LO!<-Q|He?2Py!E-cSb*r^8PI4ZZdO_^sD7Mzg~*t$D`K6T(R^V^OWTSd8+;g1T+exVHwtO%6@c^!Xy)$9_^L*l1R7)W<)< zX;U2QlvtB=YWj6>;M3CC8Otggqy&VaJ~4OH2}q25@{P(v4;D1o65MCnuq|LEvt`b$ ztv5xMJG=#Vw_0_lGpu;zWQ_Zr3f09p#KZ_U49HML#neuNKZ=$+*AvoTUU)nlt+n%L zirB|{X6M)B#Yho{0|je!2Jr5)bl}}Z51(lR*sgn_p-XxnRlT>EyZ-S!i3dmN#N!XQ z;C(sV>ziNu2qDF`BRlI8?g^IrV^U*X;sd#SO$=jqbM*6<5B=TTo+kPqIf`;?@Z45} z%O0u6fAGon`L$wIu)0E$%OxxB66v@_AGB&3r8^PEm(R{u=kp`}j!RM#(+Kb39;1h; zSdYfr+D^R5tD*oGVVLKw{&9O3t40M`fm?AQlzPHR@F#7f7drH40rZ|NiV3xm{jN*O z>4pu#59cwVU6D-C5y8Dh>fD*JV?UOq4RViL%mua+4@M@j*O|SC#2&w>w2Gl!*MlePzO^M<-Wx7r~nwrO-51d5M5{L@ig z38A`HYH}^HyU7K{b8IlgYd#Y%4-;ntq<%sKpy~AxCH8~pTUhC-0m$Jx1*RsIE(>h3 z!Nf>BBDxHoR7rcwbpLhb$Osu}8to$dTtneVNIt3Zl;pFLQbrkS1@ysP?y=g<{dN%e zUHRIu{pE-9RAPG5(OsHuUm?MT*S;e-o)g)~^>RxRq~}Q8uV>B2hi06Sg`*U))67d-B;aqJRp@(0-7=ETm+Ga3ZYV!O7W)fhUExB^s2OZDIpz zQFTXVa~~iT8p%+Bdvd>4uOo$LlTuWMF(wx=gfA^yJ3rUYGMA>*5FDoP2(p0|J(+?> z$k2K4u6JSMmSlEs4UvPsJD=f-KGKIw!u{JF6dS=zey(^Ktpv z2Eun!r(u^!5_nk0{f}#U^G%F$bh7V3UZ(=8gy&}nXkf~s>Vw{wJXl$Apvg3sMdm0v zR(*|zj2b( zc?3rzzjAAZJ)rR=x9gM@AR1~(p%Q%hDl8{V9!}dCRk>4nL#`x(GSj>sivlF^WGNOr z-fMaLD7_U2;10up8JwF@xq#D#yhF426n?@OvH=CkD_uGCJ$=F@^u&^eBoAnDXGa@P zS)pW7Cct`hv!4AoUCJNk20;p~Nh7A0{?#2Uuok9kiff$WkX55M?48+k!aQ2_u8cRi$EDcT?9v+CrKcpIVH?+Ibemki}v-(08nY@KTqFMB{FiiuK10_jI>6+ z3oYJC={iK;O9lu!d~E;+A|Xf(UY*wh1H%VQ8UHC$Mra7$VZfKjb)LVhJe60=OEXw~ zOgeZ$ywz~3)hUS-T9-lG2)HxB$Ei4oncGw^T)&$apFQP~3oI_g_TL*x9u*LCdQ@mG zYa*fQU8?1a!>YdtNAlTKZ?rY>jAoLeT&&+R49uAq-}>u1ph)242qy9ta$L;AOUaQ} zIm~}F6U-n5^SeqJF_GkCJ$oDM_%kTY(#LwM^MH&0&8C6A92Oo*OuyKbzuLpIP#<)w zl@bsmWt3sFNoLZH3%t+ZnG)w`K1hRI`XkTD)Iyh7WiyDB{B;AsGrXTR1Ywffdr} zTMXWfGyg)A0PNW0rpx?iiH!RZt0FYgfWKjWr4sn#znl+W91cWp!!xBIN?DcKGc0B? z@F$3M_{?A%f=Mjenvoeca~Muv&Ah;t$!*9;;`Cj)FD7*$1gIm8 zXQtJWsQSghGc@UBP!Jhcrp0HbOx=JkGCbS?eYNSasG z##Nf8D%)O#OhxnR8&YHaT5u^(jd-dRQ3_T?x84z=1p&Xom5 z^$Gvpe+yLluW@px>GTt-+@K;O58=U`0w3D0JHtvBYgv4DXX3E>L##?PXtLa4gcG#o za%i9K4d%}h<1&yq5WnM!CW?6_?WJ!W(){rZb23y96)BIHeb!&daXiarZRt*qT7rn_ zHy~WM1gvaNt*Mb7XX*T=Y?LbHogW#b5R#$rGP94TGm>4LPQVXwyn|WTXu-N zz_)CA$yfwp^*vbxw+6Q{=v3v=?L66==c+f(2gZNWW`$h~WbDlZn!77t(VtiYZ?nXJ z$Roe@VcNdFCy2;>Wtf9r)G-Fkh$K7#&i82s7l`lvV?g24$5kEp08mClkpd$p(!pajY;m(|oMJ3@acZh&@Xs z3sftY$liEX0M46-rP8sR0xuZ+YsOqywLzAal8iB zAg{0ym4Q%+RSumfS7zS8d4OQ$H|Z+wjm-{E5+^84Z(=c*=ILtrBF8ym67}P;~)s(lWCXP zr%dlKamvS-xDm(C)-EmPvZG(`dKbGCYRTXuW`ebT()?FvM8J_{jmQ;s`|cS=ETWSL z4sF9Z6L{J`)CkYNv_p~*nd1ghAdj|yeA=6%Jwi{u3~0^`shIMco>;I`!r|X;^JmA9 zycq5-I{h+<4dxZ=!H4yDk)S!*olifvyILjHQ|(Cvh}P-%GL+ZuPq-f=pFg|;DrZh= zjKH)5&|x|E>FT%qn5duW)z%P>xg-)3+|dZg$KQ&F9#&Xo88ZJ-X4`eFeke%2TGr6L zy-Zi~LU$$+J+DuCCDhpCI|3*c#@2}eP5tAj&Ppxvc;{G7++F?lGd5?HvE7L~R}hxX zBOe}3$@%Xl`fd*q#6C5ulm&$m9;gQjbS~LNqJRWGtP{M&E4gt~E>`Kbn)E%wAtR%E5&h=%g=;)9buwQ*LweCxJPUm#&#k(@({ppGd4?dT4}CG!@IR}UtEa}TpU*Jttz_A-wf`E-nJ9y} zqU~v5HqdjpW-Q^Nm*}UT;Q%#gsx#XQmXtOxa^IWUPhvfVz-azDdTb;p_EYK(K@9sjQ0-iSUepC8`u z?tLUf;T#-+dA#QLDSq7bK|~us+Zfxbo)h6BWuIN!^)~-KB2%`Cn}{LgLKZyxgHOG-z8KAK$?Yst&b9-PPrP^teK=uJum+E%!nqaS&%rfnLai zsl$$=!LJU(mbHy!o$MN;Hv{?XQ(no_-cI!_i}QP8 zq|gDu%Rs}eN3hZOH`z1pHCSaMl9wgtVn`Vf0m`n?@)0G77V9=+=KT+3$$5n;i@WhE zT)RiG!EudP-KKkZM9%OT+V1w3LjS zX+;rzk0aI|R9yx?It!G-RLu-H8@;bXdsCq+o@QZ6i$009oID>lZwOnCPn+l&+@JN01r`kqjcn@ZN zogg;0KhKSGjwcqdq3i0g%Ghh$MuvNgh%qXB$Id26z&?mh?E{4k%^g4kH2>vo{-dqj z#EG8VV}r7=pc|Fd0N%D_6iJLJSJJaT?BCanXjH4QWK5GB0sD7@9yB_is(+$~qW)A4 zRG83VI(-o>{4@x#D?2Jik=_)O(aZ$n-qdK(4SrjEES_^20NrCC#s4Miu0!bR>Ik*sq6RV&%+kXZTxvoG>WFacQF9cIe|GZEJLAfQI5B-d|i~`Ib5Ubgk zuYP8OtxkV(R|CqP^!0OqFv2SLA(3!a{RU5u2X|in(E?x@I%#{L6y3g4Ne*;A*s{fA z@Ddu>_K8%!l^k`)XsVT@!h%pwCz!}{Zr{dWwSfh;I&;N5++&cOjhpHwRuv4kU-u1I z{-+pV*V1nMhb2Lqh5@BaI|R(f30x|Wk{*y4IMvy-&xPAQ)w!S-69jG$ykP_8Cr)}- zY-@)te{wSb!g(&uFFVr^oyLz{+-b=fz;DhF=33kO`q_)x=A@?v(14@5O{ugRo<0K- z#MrsC%1g3MOrs85ZBOQ12=p#3y&re@DH7@DKZUoZXl{@Z15S|n5+IR1r_75v{uqM} zy3Fa&)cLU^6#%B4kVye2I=2PQbiq-W3IqU8G)|>MPcmp`p^9x*hKFfW2`cJwR#$p$Oj`wR%ZzV8xDV;}ti>wbqUYK<{s+NM0NuM zgOH2lWP?^+EjP2h>EGE7@&f^2?d~l7wX0WOVYvnXi>cIP-tn2^Vz0}V=0YHCC(j!5 zQ80_(K%N9mZCobM8+vQ%KWXD>yDr2xUlPXq>TyBEa5NrHo7wrtrTDoIR4}zo2ZP0MXXHW;tGy;vHPG@0&@+S8=>Wmx@k284geZs1RQDu zdIAhkX95;UtHOCEP`T@~yWj1rtOUT!UR}XamBY2$+g#{D83-Db*~jYub}fjQksIjE z@4UW+17S_O2O_JFX(kT~Ac2QLpP{-2oi~?dB>x7+%a#WV>*=Y$Y}HB&_YydDhjt|B z-LSAmWC%$DVSnj>DTIRa&MPJDVG;vG>}3{XLwvFCPZE=SV?j+6P@5 zva*p9aEoT<6sW;bTq*kxwtd`SBtJ-)`*g zcKP$xc<=BEhJn&O@@s(WD}A<#9wlt^259lZs)K=HVE`(eunU@=zu68qibm{si9y@v zx{fTk)Q^wn*Wb$=X7k_Ies?F5m{DBm_~?)fb!Ox`!u8C%ap8P0tul473cfJ9h@Jo{ zmNqa@xan9c85RSWlfTviBIgMV7|y4*T8=exjPyI)>kgoNNDlzLHh=(ZH&Ww*esimm zab$)hZ2a1{k-OAfeex=<5%qHT2;}p-zm6F|gd+xQ)FwSj29zewlObHKV1AYtOI!wB z+QowmDkLr-GVP49;kx|EgVXN8l9xpV2o?|JfsBD(WEn_yxD1Djb%(KoKx&`|Mv+?a z0D7*0+AId_Q!5x7xe7+dV#W_w-P_sj+};OFDRan@M(e`kFhG(3MiJm7f(%sM9(AUnd|F&1GE-;k`k$P*nAX!@tY| zQ*ZTzgAH54auVv<{J{-e_&FCrlKC1{Omuh&OGA}SdjZ9_SI}fH38v_GSZck3=~+WD zRX8A~JN&VV{S~4MZh#TG0DSY)%%*8znS?R}qf?nVVB-k%?!7Y)y@~!5lgGRStoC)>CDIE*P1kykdbKc$4I3@xfFC?4n9Ff( zvKNH#JORTsmaU}blH8!(`JdA0V<4qfv%nyjGfb*%of~P9nFfN#mV&|pivWkBCf!Q# z2eR7i^N#>u=XH#Qx3XOJlcmPAh(V{ZItnRr&O9nsD=H?5Ubc_S(RHW}QD+7UpWk%? z4&-{}HElU(XX5bv4kx+Bmy|Z+(m%xngxOjVTMJQ=Ej5oyfZv}27j4E__IAGU?r4;5v;pt=5O-@TF;C)a+x?jW;Suq%cseJ#6uoC@eF zT`a$>EGg)sTZb`BX#H?7s6{lKVSpBNWMT%<^-Y~cIT~W2>kZ6F{=8CtTP;@>KJ+)(n zwibHx(r~nEBdy4`-22!w2+Qd_qmplKBM$37>PhHT@u*+Ik)2v*;uop+?jNpJv2i7S z=M#xeOXGx50^`vb!>XI-G3&B69sMiL-9!n~8xBS_4-chtox=LH>YS0ESU;uB(Mr8> zDmr+mrhf@x$x`RKqzBrcHzjrh>b$kT?#Z^mWr09avhF}@`Z@bSF`$GTYx?|s-pK*| zQ4|lrIfqgR0k3Pl{j-S;%v2S*HMy;gKo40=BSZ{bGt5S0Wf*FH+>TUFS{8dNXN#4R z-Eaa-Lw?09ohD{)LBpS0bkrrfH&?$4l3i3kf%i1dET5Cw%(%(ja&K#dJwmE%)LruF z1na9h-(X3XDH?;SMM10*6i5Za#Atou&GwyC;!6Tq?|-sn&T`;i(W!tLcquTnc^EvzDGMAcOYp-VhT zZQ>I7d!AkCy>rIIO|(j|<1XG(wn0kklUs~mU)?I_qqV~H2hiD| zl&lC#0V?Y47vK<82WseKj=so5>_k>6{3MFaTgem$b4xdUz)uxKA(0$J^i1=~zDs%K zS42hiXWQf1fn;9AwYGW**zElsi7>Qljepw^qoPW|k#!3w)VQmuv<&HPNAc3>VFNs?&e-Dcg7Z2CpSk&PXMD}qU$@j&*XHZHaAV)CKIiGk zh5h977;f-W5|S?8G^C?6`Wek^U*!h~PXx`)r0a8fUN;Etiv&WLxUamGA8WXTh=d8# z;R{wBl{Uq*bpv9D7B@S8#3&1bJedIy@eWmL+Kvv&p^^nS!x9M4e+_(sdocF@QqAAo zj@x%0Uz^U{;gh_Ao>y5Fe<8HrFER6VXQTSYXqe;2=Mz|UqO3?7HJ!-sKHsk>3?R8K z{Gf1X4?}*V5G0hvK~M%kky-2rN*SBNYr8~mM3L7YGi`hEA1upf)i7hFct-sWKhzTe zer`^V^89Mu0%Vmn)mvclVt^uk@jRx8Oc8ysagXozG0OOb9NM^D1tHD~3qFU<90KmG zzNhlbfu-3HxOE{qf^@u$VE_uO1>e8WmW;# zUF{CgB?Azl{3%4(e-^garYB=NV9J#wCi380)`!b&?6ATO>q&HKE+W&jUpQYUXG@|g zm16Cx$Ypzvz;i@E4u9hm*HLIbpnQ$TA|Fwjb+YN{AlC3<$8ei$=p2Sz$IBPixM_AE6gYe3DkE!R3-~ zZe7q@{^sSIRGLLkxMW}dm6z^24;d-4o&%$@L#OZO3=-?_;{Z=UIWePRa9RKYmFy<9 zV>N9+HXx=Hu!!QCCMPY7M@dusdU!C6r%ut=zXW)u9 zvxtl!o;F~kmSO;Y!oh|&eMxl>ufCRERqUJznCR{QupSV>^g9+8X{O=lvH{dN?4*4Y z&_r*hZ(pA?fqfV-wgIc~fK}ve2Kh%3l$;eH9Q~LC{}C@Wk;nh)FLZkQ>i1@v6kZZHVh{*uPf6IQs$%DZs~8JptFT zwhs3FU+iP#1?(xU0fJEff#5h+Xbg%HqN7|&NDXs^#AyTObBTCPdd`0hNz0j_O9m8oXnM`6EmwdLEB+#Q^<3V&IkLgLd|Gb^F@$Zv zV1{Y_m}^6N`cY>A0exH>8yMdMLp$=j=2$VHN3$_GG%sar>RZcK3!p{t?!#8dE6|lb z=Lw}Ucnz3F92xV%Ze zkP|`d#LVxBb{Pf5l_WD>0#+zi4Q!+7H3&r6clzWjS7Fmh3Tk!4v#U z&K1z4Vt>4BcXZ89-zt|x1)YWl)!M-MKWFlf5TdAqllx#TC_g~RWzyq3?s2O5WoS(m zOAwKn|Dmhr(eB*L_J~v5aH*a5zCeGjKHmZYdCeJ2TpiExQ?+0nTN4mgYm(nMNP$|8 zkDJ6u!0J+v?{j|BLx_O=4e(1&VjJy(*dHOQHS&`8MsIqHAHJ2!a&7m~msEQSw(lc$ zjGc}V>0W!-S#NR=si>!6a=*A5@Ny&vd+&equbnG1)9N$2ed zxv-d*w1Ntq;!CKQO}I?~QsphvDIbgGf&>Ec{ExKYUtycQ9ZXu9LYDEiQeW=4+X-D%RCM~&AnE_7y)zGodVT-6bDE-asN_&6 z3eiDi$d;un(Tp{FA-iNNOV$V{rKH7n6lpObOOqw*G-s$ZII?Al#-W*#vhO6{`!i-v zbH3Fdzu)z{et(_6T-RJ?`8=QJxu560@Av!lK_5915{kc5ekP|+Z{v4#9TT! z2h*VbvDi-8XLrkDR>{3(3P*Dx655E47-NiJdZ%~&02Y9t)v|~Bf8sJOx43)e( zUd{%V2Q`CG4F%}aydAJ0{j~@pSNMc7h<_QK; z1eA8_U(OQF{1nBcw%2(%s|b zBWRa_xe{-Tx5p}SJnXswU+uc0($UEY{4rAwyb>li9cx=rQaqjI6O+~=kjOw}xvR6@ zQWskHVE9FV5WnpQ@wO;(#6irZ{p(`5{(J)Q0R;)H#^>_qiN+VI$Dc*ynrc(?izUgp z)C-?Jx(^go;fi^u^=X{V4o9^7nxJA@&HxM0?*jPXx~hU6sDVX|a#(A@=@`HQdr#DI zwL)X5gw_l;Vbv-F_oDag&F|H~Cq9K0RLrO3XW9lP>r1rqOGVh~) z_bb=;Ua}pYu!NjejK=h^FSTDBm?Gk`)nn1=L6i`R)+PV9jaNZbX5dpnOQC-YqD($p z+~DVzeQ!x{D=IJ8>@_$n8y`Nzam zdyi5z7F|d^7U6rEJ{0oIw`GQ(bu)*$C{~GO@uOXwz;o=^W~f94Fp|X_R|ojsINdqK z6(BG|yPda@{G)0^Bww|td_-hk(4&ibuea4@PEVd`vK?<5l>Gzg$ODf>Dx!!ZqyL<+ z&N|KNd!u_*hjNyRg2&fCej~rbgxJ=;E3V|yNilH~6O(OWklqNWCPvq8iV7f1dUi}L zM~nrE^7Dc4$zTo|*ys zu)QsZZ0VcNmdQa*iMgbFRJ29tVWDsnY8i1lRZ+taa)8pLqPw7((oLnz&%AQ?fhzC* zk)z?`x@oF`_o4JyYE7k*6LDtQMjjq2g=$`4RA6Kqr<@S!^^ACTY2Nc9SJ%|G)q27q zPa;MPcJ5!Fva11^;2@Ft(yo``NXe65!!50?y&xAr-uSEk?H2zRylLu3vh39tE960X z^fxmBFx4Hd@$1B zV2S>`(Y)Z_opRt8K+=hGaF$2|CB*@-{cTO-fn8Uk)ge!(h|WJ?ATPiW#b*d}U_0Zu zMW=%N^N{OBy71@bcG_n1LLh@U=VXMz>2;UHN>F4#L|CQ{_?)uEjT1XFgH=o9*YJxd zD2T;!NUZ~Yl02B_;^Vh#?L|v~n!_lIWEtl|M@Xp58Yd^HSN2H0J*EKiu_w(e#&fs? zmK%abF-+?Z_#EjD^Zyz>xQH)`5!5d08=VESR7o$e6ysnFjvitk`2N`GL*p%ee<+@l zD^4i?LM;qz;|3C16hH4LmLWZu+3!dW89HCkSr6$nfpY;Q#5JH~7o4 zSfDGKM0bxK(}%<67Cv=rH*n_h0}1YwixJ3e()D8sHu7>K%6;Ri!5`->nojgQ)!vNU zV~_9NV^e!%qT!G9X`tb#T5C}&2qzpr7H9@jbSZTyt?OHa3b01N$xQ-8uotHw0~rHi zh2ec`s1PzH$lpAvd<8eBQ3?Uk4(D1HTrVrXTi?O0x8*AS01a%aYnn=j+Ed_cDh<7B zY;Z;n3Y?M#|G@rquOv)jJd%eI!q?1jk3{}e3q0BbiEwLg7}r31hu(Hs=_>-{hW-YO zv-s4eZrCw!w{HEBrwhPV7k3GJ8IlOVzjCx=LUp`>?~w~P8!0e3 z73gERKsr@2hYrjAeXFsl&cCClRDCa#4AQ{bX8BZ5;p=b${5vfoabcoCmiAoqauUci zLO!H>QL0sTlj_^~V>rI|E;lEjM-+MYD1u|E2#S)%0Xy?RK(^MC>VAH=84|y~f5r5e zEJim9)@jZrxoowpJ25kOc7iKqSN1n9kS^15U2Ey}?3PU36=+&!Az9l$&i@R83d?%* zh<+MRn%e*y#T%IY_^yl1jX>fNb(UpaV<445+#`ek!Dbxc}VMFh@8sUhX#n(jlTeip`s zCG2_7egK2*^>N|SRGm17`D3=aT3-S)d_7Zh7l$5t=)0^DvQ*qj%h)p-Y+5-G277At zGDU6~+r2RG6ZyWK9yoJ^MWB30{l*A}yA2@jt-T}V+TzAHKY9}PWo8?0zUP-*rEH}* z+-tsBkSG7;vW>VfVbND5|B!b`aO3j9p3F~T{qtx!HaPulWef*vc5vB1ZE32l=tRF3 zLWZGIsafWDd%LCMjxQ|o?}KqlDO~j8(bKONO`*O(t!ZN?^A9(Tom2vT5)2nW$i5mb zJ@JW&32M&Wglh_+JaYK+y7<(bBHl+2wJtwh00WAs=JsSTv24Fi6pej-g^gG69I(-|W zAMkDQTX>=I=|On$TThk#boq-*Hlry7oN=B8`Tn|hXAwSY6sL#@fS)-ld;ap}C82i* z-e$+<9SPubY#C~c;nhq-_D2<|iXMlD*Q(Os;KQ=(UWo;@nFmy^#I3_)&N}d4_s_iz zC%2tIF`!2>j{uv+7q4C%h%@H~QcxBYn+}(@x^X}2AYHIn2Fje=MSPMiBqhhF5NjE@ zthB2jg`~%3P7i%xaFnjI%pbZ`BtX7$Q#%WTlZ>q*r<=f%@chn_sL#=}k*e@~@e&Aj zv9`%1XzK0pV~Adm)x&a@(o=T|<8C^vhL!mcV$*N`o5lsV08pY~HNOtTD_}oiH35e> z_z#vajmR;+l(?7z`*5ny{|ot#{!6~p#Qvw?z<=NVzh*A}W9Zr$_-wYQ=fJWRNyPY| z7^vePte|OD=n@@De>Mj!w+;MY8h1HFzQlY1q3LM+MnI&IgjpM1<9IYNYqqzz-eCq!{*w z@jBu4vcf1ttzmuFsh^_=%`qrHU-Prop1RZK#HorJlvH#x7(Skn&iHVa40-R_N89G;*i z8e?#nWUZv>c5{o!d37MyBe3dFbfweNpDN%2TtQU&G-CU`dy4&)^%9xkBFIw?xC9lq zS-WQW0LKyG3Wp5dK39|cmqLeS-#j)|CV6?OZ#fwlP`HQUwv}qYikL9Lnxz4AS!F2a zF7@6GpNUXs*bsLNR8KY~!qWyoQyu8FT3%rRNf3d2gI!vfmQUI@&_gM9zib=1G>tsB zfDF{!4f*IR1vbS8MhLU^AZ2lK!t0!$kz9VOM7&D;M3c3@jMkfjd)D8OHmfD95v~kc z+t-L9qKp!n*O;!-W+ExCZ6Od~?F3vOKL8%PilZ`v3J7wDLEOwp<>`kE$Mg7r6PXbU zxt&t4ZtY*yQi?ZH?nlvCHg11j*YI$+>~haM{gyoVuukZM`o;S9_wx#`!4SLgo!`*6 z3lwfts7GWC!xI=jObhOIVCxGL+ou#TXwtGN3~n|Jbh?Cq!DiB$y)kz*KhHTEca^@w z08jwGQQ|0Zw4uKK8bUiK*rK?CNZ4%?;njHlV$E!_{+n>)sAee|-<- z!<^B)32MA~(9+TLSnzI{8-GKfJdRq$z99QM>8h&2!|-{(%RPwn1$Op&2Z3>4J5A+| z(QUpJG`>+mB3QLS0BQ*?xubCrRE@A1FK2QiN96L-EDfgC*iBNG958$ybUpxrPudUL zsX>U3HVVoHS-G~a{a>h4lyqK|HaUu(fOdN*7|-so!JfGc+8USk9MiKrY$XM>ckjXo z^6NF`ZYg-QqFmN;AV*3{{2;qfFq`E`j(oeS4xZ*anR^DSBD?U8*D^A=iZ{Rl)Vh*& z4ctwic6b94-rh>J?K;n7tI+R2D8mAQw%TEdmaWaRz-0*-?v0t-YDEW0m|nJk^H}$s zAtg^$p2I|0)rse#v};(IgSN`rq5)m=@$yY$DP`86SsFYVYF>WdA}{5(PEBABhh_N$ z?Ij-xldiBeq8vQ;>qEHTznD5AoiKn>^nOJpR43mkG|TFH_GzJ$m;!Z+n0j^)S;&bk z-5UfQZgFRu)!hSJzJ}TRW7a(6)aM@r#E!1{@@u@Kb_Fn(k>W(0BTqjHLPVT`$=Vgp zC>!by0M#!XQmoj-d?6ix%3!6JWIUbV%)TU;!lw1&vp+Jy$UHzUm1y0!gUMDtzY%^1 zrkiTdeBlK0^bH+>92Ap7Zwlyo-Cu9?{>*&A2!=LYe^oM_+6|w(4Fk(^r)y$Z)C%T( z-ydt?$iw4tYa^4_tP{ru&NMGSS>_AM`vKrA!e#y=lLWsL4hDCU3`dw~_#Y(ThZ|)@ zVVL1@13V?fGO376V7~Czzk~7bU?5ZQ-f(- F{U0fKVS)ev literal 0 HcmV?d00001 diff --git a/test/image/mocks/point-selection.json b/test/image/mocks/point-selection.json index 0e9986b4586..47529ae6921 100644 --- a/test/image/mocks/point-selection.json +++ b/test/image/mocks/point-selection.json @@ -1,23 +1,24 @@ { "data": [{ + "mode": "lines+markers+text", "x": [1, 2, 3, 4, 5, 6], "y": [1, 3, 2, 4, 5, 7], "ids": ["a", "b", "c", "d", "e", "f"], + "text": ["a", "b", "c", "d", "e", "f"], "marker": { - "color": "red", + "color": "#67353E", "size": 12 }, + "textposition": "top left", "selectedpoints": [1, 2, 3], "selected": { "marker": { - "color": "blue", - "size": 24 + "color": "blue" } }, "unselected": { "marker": { "color": "green", - "size": 6, "opacity": 0.5 } }, @@ -28,23 +29,25 @@ "value": [3.5, 4.5] }] }, { + "mode": "lines+markers+text", "x": [1, 2, 3, 4, 5, 6], "y": [6, 5, 6, 5, 4, 3], "ids": ["a", "b", "c", "d", "e", "f"], + "text": ["a", "b", "c", "d", "e", "f"], "marker": { - "color": "blue", + "color": "#34ABA2", "size": 12 }, + "textposition": "top left", + "selectedpoints": [], "selected": { "marker": { - "color": "blue", - "size": 24 + "color": "green" } }, "unselected": { "marker": { - "color": "green", - "size": 6, + "color": "blue", "opacity": 0.5 } }, @@ -56,7 +59,13 @@ }] }], "layout": { - "dragmode": "lasso" + "dragmode": "lasso", + "legend": { + "x": 0, + "y": 1, + "xanchor": "left", + "yanchor": "bottom" + }, + "width": 600 } } - From 4e83ef792d00c9db3a7218ed51c4eb449875ff02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 2 Nov 2017 18:00:31 -0400 Subject: [PATCH 18/43] fixup bar/histogram tests --- src/traces/bar/plot.js | 4 +-- test/jasmine/tests/histogram_test.js | 52 ++++++++++++++-------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/traces/bar/plot.js b/src/traces/bar/plot.js index 83de22f5e06..8b7912916b6 100644 --- a/src/traces/bar/plot.js +++ b/src/traces/bar/plot.js @@ -156,14 +156,13 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { var textSelection = bar.append('text') .text(text) .attr({ - 'class': 'bartext', + 'class': 'bartext bartext-' + textPosition, transform: '', 'text-anchor': 'middle', // prohibit tex interpretation until we can handle // tex and regular text together 'data-notex': 1 }) - .classed('bartext-' + textPosition, true) .call(Drawing.font, textFont) .call(svgTextUtils.convertToTspans, gd); @@ -208,6 +207,7 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { if(textPosition === 'auto') { if(isOutmostBar) { // draw text using insideTextFont and check if it fits inside bar + textPosition = 'inside'; textSelection = appendTextNode(bar, text, insideTextFont); textBB = Drawing.bBox(textSelection.node()), diff --git a/test/jasmine/tests/histogram_test.js b/test/jasmine/tests/histogram_test.js index e9ae22bc786..60f4d57abd0 100644 --- a/test/jasmine/tests/histogram_test.js +++ b/test/jasmine/tests/histogram_test.js @@ -206,10 +206,10 @@ describe('Test histogram', function() { expect(out).toEqual([ // full calcdata has x and y too (and t in the first one), // but those come later from setPositions. - {b: 0, p: d70, s: 2, pts: [0, 1], p0: d70, p1: d70}, - {b: 0, p: d71, s: 1, pts: [2], p0: d71, p1: d71}, - {b: 0, p: d72, s: 0, pts: [], p0: d72, p1: d72}, - {b: 0, p: d73, s: 1, pts: [3], p0: d73, p1: d73} + {i: 0, b: 0, p: d70, s: 2, pts: [0, 1], p0: d70, p1: d70}, + {i: 1, b: 0, p: d71, s: 1, pts: [2], p0: d71, p1: d71}, + {i: 2, b: 0, p: d72, s: 0, pts: [], p0: d72, p1: d72}, + {i: 3, b: 0, p: d73, s: 1, pts: [3], p0: d73, p1: d73} ]); // All data on exact months: shift so bin center is on (31-day months) @@ -223,10 +223,10 @@ describe('Test histogram', function() { var d70mar = Date.UTC(1970, 2, 2, 12); var d70apr = Date.UTC(1970, 3, 1); expect(out).toEqual([ - {b: 0, p: d70, s: 2, pts: [0, 1], p0: d70, p1: d70}, - {b: 0, p: d70feb, s: 1, pts: [2], p0: d70feb, p1: d70feb}, - {b: 0, p: d70mar, s: 0, pts: [], p0: d70mar, p1: d70mar}, - {b: 0, p: d70apr, s: 1, pts: [3], p0: d70apr, p1: d70apr} + {i: 0, b: 0, p: d70, s: 2, pts: [0, 1], p0: d70, p1: d70}, + {i: 1, b: 0, p: d70feb, s: 1, pts: [2], p0: d70feb, p1: d70feb}, + {i: 2, b: 0, p: d70mar, s: 0, pts: [], p0: d70mar, p1: d70mar}, + {i: 3, b: 0, p: d70apr, s: 1, pts: [3], p0: d70apr, p1: d70apr} ]); // data on exact days: shift so each bin goes from noon to noon @@ -248,11 +248,11 @@ describe('Test histogram', function() { expect(out).toEqual([ // dec 31 12:00 -> jan 31 12:00, middle is jan 16 - {b: 0, p: Date.UTC(1970, 0, 16), s: 2, pts: [0, 1], p0: Date.UTC(1970, 0, 1), p1: Date.UTC(1970, 0, 31)}, + {i: 0, b: 0, p: Date.UTC(1970, 0, 16), s: 2, pts: [0, 1], p0: Date.UTC(1970, 0, 1), p1: Date.UTC(1970, 0, 31)}, // jan 31 12:00 -> feb 28 12:00, middle is feb 14 12:00 - {b: 0, p: Date.UTC(1970, 1, 14, 12), s: 1, pts: [2], p0: Date.UTC(1970, 1, 1), p1: Date.UTC(1970, 1, 28)}, - {b: 0, p: Date.UTC(1970, 2, 16), s: 0, pts: [], p0: Date.UTC(1970, 2, 1), p1: Date.UTC(1970, 2, 31)}, - {b: 0, p: Date.UTC(1970, 3, 15, 12), s: 1, pts: [3], p0: Date.UTC(1970, 3, 1), p1: Date.UTC(1970, 3, 30)} + {i: 1, b: 0, p: Date.UTC(1970, 1, 14, 12), s: 1, pts: [2], p0: Date.UTC(1970, 1, 1), p1: Date.UTC(1970, 1, 28)}, + {i: 2, b: 0, p: Date.UTC(1970, 2, 16), s: 0, pts: [], p0: Date.UTC(1970, 2, 1), p1: Date.UTC(1970, 2, 31)}, + {i: 3, b: 0, p: Date.UTC(1970, 3, 15, 12), s: 1, pts: [3], p0: Date.UTC(1970, 3, 1), p1: Date.UTC(1970, 3, 30)} ]); }); @@ -268,10 +268,10 @@ describe('Test histogram', function() { x3 = x2 + oneDay; expect(out).toEqual([ - {b: 0, p: x0, s: 2, pts: [0, 1], p0: x0, p1: x0}, - {b: 0, p: x1, s: 1, pts: [2], p0: x1, p1: x1}, - {b: 0, p: x2, s: 0, pts: [], p0: x2, p1: x2}, - {b: 0, p: x3, s: 1, pts: [3], p0: x3, p1: x3} + {i: 0, b: 0, p: x0, s: 2, pts: [0, 1], p0: x0, p1: x0}, + {i: 1, b: 0, p: x1, s: 1, pts: [2], p0: x1, p1: x1}, + {i: 2, b: 0, p: x2, s: 0, pts: [], p0: x2, p1: x2}, + {i: 3, b: 0, p: x3, s: 1, pts: [3], p0: x3, p1: x3} ]); }); @@ -295,7 +295,7 @@ describe('Test histogram', function() { }); expect(out).toEqual([ - {b: 0, p: 3, s: 3, width1: 2, pts: [0, 1, 2], p0: 2, p1: 3.9} + {i: 0, b: 0, p: 3, s: 3, width1: 2, pts: [0, 1, 2], p0: 2, p1: 3.9} ]); }); @@ -308,7 +308,7 @@ describe('Test histogram', function() { }); expect(out).toEqual([ - {b: 0, p: 1.1, s: 3, width1: 0.5, pts: [0, 1, 2], p0: 1.1, p1: 1.1} + {i: 0, b: 0, p: 1.1, s: 3, width1: 0.5, pts: [0, 1, 2], p0: 1.1, p1: 1.1} ]); }); @@ -321,7 +321,7 @@ describe('Test histogram', function() { }); expect(out).toEqual([ - {b: 0, p: 17, s: 2, width1: 2, pts: [2, 4], p0: 17, p1: 17} + {i: 0, b: 0, p: 17, s: 2, width1: 2, pts: [2, 4], p0: 17, p1: 17} ]); }); @@ -334,7 +334,7 @@ describe('Test histogram', function() { }); expect(out).toEqual([ - {b: 0, p: 13, s: 2, width1: 8, pts: [1, 3], p0: 13, p1: 13} + {i: 0, b: 0, p: 13, s: 2, width1: 8, pts: [1, 3], p0: 13, p1: 13} ]); }); @@ -348,7 +348,7 @@ describe('Test histogram', function() { var p = 1296691200000; expect(out).toEqual([ - {b: 0, p: p, s: 2, width1: 2 * 24 * 3600 * 1000, pts: [1, 3], p0: p, p1: p} + {i: 0, b: 0, p: p, s: 2, width1: 2 * 24 * 3600 * 1000, pts: [1, 3], p0: p, p1: p} ]); }); @@ -361,7 +361,7 @@ describe('Test histogram', function() { }); expect(out).toEqual([ - {b: 0, p: 97, s: 2, width1: 1, pts: [1, 3], p0: 97, p1: 97} + {i: 0, b: 0, p: 97, s: 2, width1: 1, pts: [1, 3], p0: 97, p1: 97} ]); }); @@ -453,10 +453,10 @@ describe('Test histogram', function() { it('makes the right base histogram', function() { var baseOut = _calc(base); expect(baseOut).toEqual([ - {b: 0, p: 2, s: 1, pts: [0], p0: 0, p1: 0}, - {b: 0, p: 7, s: 2, pts: [1, 4], p0: 5, p1: 5}, - {b: 0, p: 12, s: 3, pts: [2, 5, 7], p0: 10, p1: 10}, - {b: 0, p: 17, s: 4, pts: [3, 6, 8, 9], p0: 15, p1: 15}, + {i: 0, b: 0, p: 2, s: 1, pts: [0], p0: 0, p1: 0}, + {i: 1, b: 0, p: 7, s: 2, pts: [1, 4], p0: 5, p1: 5}, + {i: 2, b: 0, p: 12, s: 3, pts: [2, 5, 7], p0: 10, p1: 10}, + {i: 3, b: 0, p: 17, s: 4, pts: [3, 6, 8, 9], p0: 15, p1: 15}, ]); }); From 67cefad78a4525577a15b2fb835389bba556deba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Fri, 3 Nov 2017 14:45:35 -0400 Subject: [PATCH 19/43] fixup bar path selector --- src/traces/bar/style.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/traces/bar/style.js b/src/traces/bar/style.js index ad5d0164852..cecdd00239d 100644 --- a/src/traces/bar/style.js +++ b/src/traces/bar/style.js @@ -35,7 +35,7 @@ module.exports = function style(gd, cd) { s.selectAll('g.points').each(function(d) { var sel = d3.select(this); - var pts = sel.selectAll('.point'); + var pts = sel.selectAll('path'); var txs = sel.selectAll('text'); var trace = d[0].trace; From 10a2fa9521e67b2ab186c141d8b2b059750eec47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Fri, 3 Nov 2017 17:32:34 -0400 Subject: [PATCH 20/43] add selected.marker.size support --- src/components/drawing/index.js | 111 ++++++++++++++++------- src/traces/bar/attributes.js | 20 +++- src/traces/box/defaults.js | 2 + src/traces/scatter/attributes.js | 14 +++ src/traces/scatter/marker_defaults.js | 3 + test/image/baselines/point-selection.png | Bin 27898 -> 28115 bytes test/image/mocks/point-selection.json | 3 +- 7 files changed, 118 insertions(+), 35 deletions(-) diff --git a/src/components/drawing/index.js b/src/components/drawing/index.js index ebe98c94e57..21ba84470e6 100644 --- a/src/components/drawing/index.js +++ b/src/components/drawing/index.js @@ -248,6 +248,11 @@ drawing.symbolNumber = function(v) { return Math.floor(Math.max(v, 0)); }; +function makePointPath(symbolNumber, r) { + var base = symbolNumber % 100; + return drawing.symbolFuncs[base](r) + (symbolNumber >= 200 ? DOTPATH : ''); +} + function singlePointStyle(d, sel, trace, markerScale, lineScale, marker, markerLine, gd) { if(Registry.traceIs(trace, 'symbols')) { var sizeFn = makeBubbleSizeFn(trace); @@ -256,8 +261,9 @@ function singlePointStyle(d, sel, trace, markerScale, lineScale, marker, markerL var r; // handle multi-trace graph edit case - if(d.ms === 'various' || marker.size === 'various') r = 3; - else { + if(d.ms === 'various' || marker.size === 'various') { + r = 3; + } else { r = subTypes.isBubble(trace) ? sizeFn(d.ms) : (marker.size || 6) / 2; } @@ -266,15 +272,13 @@ function singlePointStyle(d, sel, trace, markerScale, lineScale, marker, markerL d.mrc = r; // turn the symbol into a sanitized number - var x = drawing.symbolNumber(d.mx || marker.symbol) || 0, - xBase = x % 100; + var x = drawing.symbolNumber(d.mx || marker.symbol) || 0; // save if this marker is open // because that impacts how to handle colors d.om = x % 200 >= 100; - return drawing.symbolFuncs[xBase](r) + - (x >= 200 ? DOTPATH : ''); + return makePointPath(x, r); }); } @@ -443,14 +447,42 @@ drawing.selectedPointStyle = function(s, trace) { s.each(function(d) { var pt = d3.select(this); - var smc = (selectedAttrs.marker || {}).color; - var usmc = (unselectedAttrs.marker || {}).color; + var marker = trace.marker || {}; + var selectedMarker = selectedAttrs.marker || {}; + var unselectedMarker = unselectedAttrs.marker || {}; + + var smc = selectedMarker.color; + var usmc = unselectedMarker.color; if(d.selected) { if(smc) Color.fill(pt, smc); } else { if(usmc) Color.fill(pt, usmc); } + + if(Registry.traceIs(trace, 'symbols')) { + var sms = selectedMarker.size; + var smx = selectedMarker.symbol; + var usms = unselectedMarker.size; + var usmx = unselectedMarker.symbol; + var mrc = d.mrc; + var mx = d.mx || marker.symbol || 0; + var mrc2; + var mx2; + + if(d.selected) { + mrc2 = (sms + 1) ? sms / 2 : mrc; + mx2 = smx || mx; + } else { + mrc2 = (usms + 1) ? usms / 2 : mrc; + mx2 = usmx || mx; + } + + // save for selectedTextStyle + d.mrc2 = mrc2; + + pt.attr('d', makePointPath(drawing.symbolNumber(mx2), mrc2)); + } }); }; @@ -467,8 +499,39 @@ drawing.tryColorscale = function(marker, prefix) { else return Lib.identity; }; -// draw text at points var TEXTOFFSETSIGN = {start: 1, end: -1, middle: 0, bottom: 1, top: -1}; + +function textPointPosition(s, textPosition, fontSize, markerRadius) { + var group = d3.select(s.node().parentNode); + + var v = textPosition.indexOf('top') !== -1 ? + 'top' : + textPosition.indexOf('bottom') !== -1 ? 'bottom' : 'middle'; + var h = textPosition.indexOf('left') !== -1 ? + 'end' : + textPosition.indexOf('right') !== -1 ? 'start' : 'middle'; + + // if markers are shown, offset a little more than + // the nominal marker size + // ie 2/1.6 * nominal, bcs some markers are a bit bigger + var r = markerRadius ? markerRadius / 0.8 + 1 : 0; + + var numLines = (svgTextUtils.lineCount(s) - 1) * LINE_SPACING + 1; + var dx = TEXTOFFSETSIGN[h] * r; + var dy = fontSize * 0.75 + TEXTOFFSETSIGN[v] * r + + (TEXTOFFSETSIGN[v] - 1) * numLines * fontSize / 2; + + // fix the overall text group position + s.attr('text-anchor', h); + group.attr('transform', 'translate(' + dx + ',' + dy + ')'); +} + +function extracTextFontSize(d, trace) { + var fontSize = d.ts || trace.textfont.size; + return (isNumeric(fontSize) && fontSize > 0) ? fontSize : 0; +} + +// draw text at points drawing.textPointStyle = function(s, trace, gd) { s.each(function(d) { var p = d3.select(this); @@ -479,35 +542,16 @@ drawing.textPointStyle = function(s, trace, gd) { return; } - var pos = d.tp || trace.textposition, - v = pos.indexOf('top') !== -1 ? 'top' : - pos.indexOf('bottom') !== -1 ? 'bottom' : 'middle', - h = pos.indexOf('left') !== -1 ? 'end' : - pos.indexOf('right') !== -1 ? 'start' : 'middle', - fontSize = d.ts || trace.textfont.size, - // if markers are shown, offset a little more than - // the nominal marker size - // ie 2/1.6 * nominal, bcs some markers are a bit bigger - r = d.mrc ? (d.mrc / 0.8 + 1) : 0; - - fontSize = (isNumeric(fontSize) && fontSize > 0) ? fontSize : 0; + var pos = d.tp || trace.textposition; + var fontSize = extracTextFontSize(d, trace); p.call(drawing.font, d.tf || trace.textfont.family, fontSize, d.tc || trace.textfont.color) - .attr('text-anchor', h) .text(text) - .call(svgTextUtils.convertToTspans, gd); - - var pgroup = d3.select(this.parentNode); - var numLines = (svgTextUtils.lineCount(p) - 1) * LINE_SPACING + 1; - var dx = TEXTOFFSETSIGN[h] * r; - var dy = fontSize * 0.75 + TEXTOFFSETSIGN[v] * r + - (TEXTOFFSETSIGN[v] - 1) * numLines * fontSize / 2; - - // fix the overall text group position - pgroup.attr('transform', 'translate(' + dx + ',' + dy + ')'); + .call(svgTextUtils.convertToTspans, gd) + .call(textPointPosition, pos, fontSize, d.mrc); }); }; @@ -520,6 +564,8 @@ drawing.selectedTextStyle = function(s, trace) { s.each(function(d) { var tx = d3.select(this); var tc = d.tc || trace.textfont.color; + var tp = d.tp || trace.textposition; + var fontSize = extracTextFontSize(d, trace); var stc = (selectedAttrs.textfont || {}).color; var utc = (unselectedAttrs.textfont || {}).color; var tc2; @@ -533,6 +579,7 @@ drawing.selectedTextStyle = function(s, trace) { } Color.fill(tx, tc2); + textPointPosition(tx, tp, fontSize, d.mrc2 || d.mrc); }); }; diff --git a/src/traces/bar/attributes.js b/src/traces/bar/attributes.js index c0b26e8f086..a0552de269e 100644 --- a/src/traces/bar/attributes.js +++ b/src/traces/bar/attributes.js @@ -159,8 +159,24 @@ module.exports = { marker: marker, - selected: scatterAttrs.selected, - unselected: scatterAttrs.unselected, + selected: { + marker: { + opacity: scatterAttrs.selected.marker.opacity, + color: scatterAttrs.selected.marker.color, + editType: 'style' + }, + textfont: scatterAttrs.selected.textfont, + editType: 'style' + }, + unselected: { + marker: { + opacity: scatterAttrs.unselected.marker.opacity, + color: scatterAttrs.unselected.marker.color, + editType: 'style' + }, + textfont: scatterAttrs.unselected.textfont, + editType: 'style' + }, r: scatterAttrs.r, t: scatterAttrs.t, diff --git a/src/traces/box/defaults.js b/src/traces/box/defaults.js index 79a127f18b3..d5d836fb956 100644 --- a/src/traces/box/defaults.js +++ b/src/traces/box/defaults.js @@ -87,6 +87,8 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) { coerce('unselected.marker.opacity', DESELECTDIM * mo); coerce('selected.marker.color'); coerce('unselected.marker.color'); + coerce('selected.marker.size'); + coerce('unselected.marker.size'); coerce('text'); } else { diff --git a/src/traces/scatter/attributes.js b/src/traces/scatter/attributes.js index 1fca454b491..a7eb216d80b 100644 --- a/src/traces/scatter/attributes.js +++ b/src/traces/scatter/attributes.js @@ -393,6 +393,13 @@ module.exports = { editType: 'style', description: 'Sets the marker color of selected points.' }, + size: { + valType: 'number', + min: 0, + role: 'style', + editType: 'style', + description: 'Sets the marker size of selected points.' + }, editType: 'style' }, textfont: { @@ -422,6 +429,13 @@ module.exports = { editType: 'style', description: 'Sets the marker color of unselected points, applied only when a selection exists.' }, + size: { + valType: 'number', + min: 0, + role: 'style', + editType: 'style', + description: 'Sets the marker size of unselected points, applied only when a selection exists.' + }, editType: 'style' }, textfont: { diff --git a/src/traces/scatter/marker_defaults.js b/src/traces/scatter/marker_defaults.js index 8cb7e25846a..214c0105cc8 100644 --- a/src/traces/scatter/marker_defaults.js +++ b/src/traces/scatter/marker_defaults.js @@ -48,6 +48,9 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout coerce('selected.marker.color'); coerce('unselected.marker.color'); + + coerce('selected.marker.size'); + coerce('unselected.marker.size'); } if(!opts.noLine) { diff --git a/test/image/baselines/point-selection.png b/test/image/baselines/point-selection.png index 1a0ae5b63d23d943747f3ae99e016e443ec4b670..f161239eaae9d3dad05e8bd0268e3baf20381e51 100644 GIT binary patch literal 28115 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�%CqXaBjN%fj|%_p9W@JZFa#2>iBFGH0k-e%K#Jerw^ZyCOU|H(keH$e4xrr z3BJgYg(Qp#v2VZC|;vfy8i zL%YJ7zghtuM5mELEG^TdE2VDdkzlEa=W1A!$7rox!pYi21%@SHMwt%y&}8#58o*=M zlY8oH4v1RH|0S*o&)5dxXz3D7LjJl`ws@1c$etO+DEojhMi3+mgPwt0bqfAN> zfo%U5%**H!?43#9C?`wb87r4JxumGVTTcSzbmub@AJ26MCpXdJxPV5i$dI{}aUgKZ z_S+L=F`%Hd-k7txEbxtMakxK@>lyXzSiRE@fEjI_DdSe$**dE5$E)8w7kY_+pWKKK z+LYan$rT{HzTj*?hw0WCp5eV`HAeY#&J`}T32z*8r)~%(f#8I@rc-FUD83)<_J6t` z#q@-ng-^`(X>+7X{sm?9jctue1RocSqs>O@48&5gYv1@ag836ColjSNxdDxs8}|lL zYW_PUBXO4M0{iNa<0kzAQfV}vm{snxxyVQE;*Dgs%@>^DsPJ+{CzM*NV_$f_X{8dS zT>it!slFG=iFJ3^T-gzxA}1FcYiwGEGuMth-1SFNwd(J`1dVXYw{GK)Id$X>H{$1M zb;3P~ z>n1pH-UR)%9m|G?$<==8hCwEj1bG4tVQl9s_gCj?VZ)_eEk8La7!8)M>RoP^Q%p)w zMh8qThBDoIPNlGY4R9sLRgSis6jAt&&CQmcM?cXl-(T4cpqu96GF%rQx*!|LP$+@I zN*%_nqv*Chw;b%Iw(NB&r0wXdWbiHD9Nku2l|SMNOGx>|AE^r^UT_Z)E4m$Oyz)+ZswilYhEq)aS={XZqZs z^U*S@)`P{lsAmwF(Vg)&UIdQIMJbd#ris-*zmynzGv-C;Pc--EyjlvVrYY|e6usZc z4Trv1T9XQ-HU(p=bg{)K?C5d+aOKEeiIhy#WW^gM>|j%=rhVZ@A2%T2d~Qamn%t(Y z*xMy2fMh-r9eLR2JE0u2!ktP$2@|~EO-iP6xO}8szQ7k-A)Oz$G1h8OQni808>z0j;px~H8)sZW zm;658{hhXa@6FTA#nc3OtB-iW2`*M-?N8i-)E!LFa|UlKxl*+yxxHnOI0xb4Lt@_KRycT4f%+bYKJH?5$Q;Co#S_;)z( z`n}{*yRLN7%sh)n_3amJFU(^ikG{HWF2+$w2VZ7kl#V%1(Mmb~B?S4BOCDB!cO9wI z-&}iinB{b7XqGPDt}JaafBflNVtz^AAIYhVg*giR2t&e;01B%ERFs>H+(QOAq|+tm z$1U?-4&)ng0*Gw06I;aj^dLuwz`4IeU2%7X1SQxsR7YAr$lV!q7*U}&y9tOI18w!4+|EciH%E;P_Iy`xmG`m`o<)i$h)gs-sWp6@AnP;0$8&VJ z$Ju!`&J^wDt`f9aqG|JGaUO(|{ZB=lJ-wl~QGzj#=llG4)yma!7S)$-mPCq3%1rz@ zIr7oZ&rwXc&0&{#Kn=VF5Dr{8*R$t<$a|~Awp~9tk+ie30V1=@n|f|%=FMqQoIiT5 z=kkuKF;V|z>-@#-N)ZGuOn-1Qb4~mQlxD6%z{PAIGFw66Iq$O4IJ%2{c8dUunzm+&La|BpnCF9HGWX|jXn9^W zeXaYjm(2JKZna3K9*S#S5&T#@<1-Ddylhj-jzH?|8&+STN{kxrD=^6fh^2lWM9>5y z5T%NCiqHX3z63<%t7Xo_%fq31j8dl6R>-Ssm)T%xtQwZ^9&#vjw%L)fB}wMc zXD%#xxw^f07D7;Z$oO`Ph6dGj=Nep*IS=TUhA7b$*eDy zc2qg7Y}-b?GjBob?)(jAJ@X~jJdcvaX`zJs6>xImQSiqiE`Jd?pdbTMZwOr$@X=$f zbdL4b;5~GGK%Oij#qmM7j=HOnHxEj$VL8rfKUSAA6R9-vGyaX+shYKhL4XiZPep~b zqa=>m6S<%WE(>lDJY#IWu3Oahb?0fI#7Q)*TAwgP#`WNS(RMs^t73M%7tA? zP{Nuv2%qWUgi7607&i{G&$2(!gAaanSV3Dz7o?cEg;GiSXc*)?D&W>=S#PLpr^8|C z-qlJ6&?)M7#6b(!g8(Y9*KIet<7F%K;u_kt8S#!1^seB4Kyy%b6&5nRnEPV6FdSN? zHmfq?=QAeL)|2Lz$xrCn_`225{IIq=&A%{5mIQSsp1w_PtfTGmSrQbPkx1Xeuy&$9 z-8g-2nDG;5e=lqgg4-sP!gE<*u~&VI=8v{>>(KGRh29K~@L zPyaIP-K!UDQVU;KMO>t}J)HH8gQD|l_GdGPMF#9dmF;jUpwbGj)FZ;UaZ$ZBW{2^Z zB93VYv()*psEII&jk{3RE`D4?==D}Q;H}E(o=hcMNZv~jdJMObJ#F}2fhv*Wk6vcp zMwi;oGE1#jHz6Nia7PQ2s$2Q~HyKxfDx%teis|i*LeRM=6ZAvpe#Rp8Nl^R=B0Z-u zVjs?0f-Z#yprN2O&p`4~ITxgQoG+LMTGe?+Tz_-3l_7+9@U_8NEh-cX_kXaL{C*Qc ziZsbkeNxSq4Y~K&=i(Vbm#639mH&2MI0U@W!8F-YX(aTz;y^yzy*~LuRn0mj(D!x@ z8Rufete(s$Jt&6*7No`!{v+At?$nJl1lY#{ z7v?`S*q;7FIw~ZCEZl3QVxqL`zCoHL&t5Hk1g!$N7kTQ{cdgYWCgB{g^Tq&Cv9G)h zjE9%L&Jh9ss~-%75oj#u?xQUW%&Kucg2Oi5lKlhssu%(O#KQXD3TF$fJ+@sNoO>@tMfvzXR^}+S|063`fTI7=i87Eo*7|iB>r*2_AF{{;0hBkQ= zv^0ajx8+;Z*8vouHI5VtnwEeGAf77$JnjRLuReSP{88wTs&gQ+Ts#f}l>)FJ9N*zH zY>`yH-GFO z)*HH_3?#G%8lD|kB=DJkyaxDy=m{&}qr?+v;MAc2Wpv9Nqa&ZYCE;{oFT51TNP>C{ zQ4{zN+2B0}zJuzffm$lUZbP@MBI zHT*Y!Z3-G`o9~N9A_S{)K_!Ta5|{sXxhXx8f|1j_^0m=Nd!+QfsnCkWcaTF=DQY<| zqX#;oV@if(1~&L2_bX_>|Erm*{$VgAoXyW&xNlP}e$*8dN+Esk+|IP3io!k`R(I$Z zU21<@XLp@uXLL)MZ*Y4gn46Qi1=K|?Drj=wJwQvC#5V--vsLz4$+mb78qh7?Kh%{Q zXb%_ukss<6ckKG6L>NSOC}+RO_d{0BDMKZkwmarMamn85LNHU)1?OemB6IoWqxpXN zovvtQzfH~Sk2&4cL6)uwG_`s7(HYtrs__)}4jB^ELzA~k;L?bIPcQNygXsF34lZ>E zdw`;D!q7PrTV?KMuy+0op++zmDuG%Ey3M2=7R71BkU*}K0BTs%v zmE6@K!17Ade*{7J{I3N``yw+5V}lQ_xJ2jS`9Tf5I{BNd(DLdHwt|LG>H58A`#TRI z=4n$KOwAEtWyn4Xx7Kxl^k*wQo=*C4v_E(*0{&Qh7&N|W@RKl~quGRSztxN}DzRtSz_6W~R&TcJyP|X1uB_UEajc!=>9`SHh7aOrlw4 zMwympThUueg%dX3CWWtA@WlTlF#OV8?d_5vdPkK3(@mA~cJC4&Un~&?W5!-_T5ZbV zseIt$dVm3zZawdaoZo*5_zky!O@8$?vgq$#9;@`4$-R;c&2SblY*IAee{xmSKG%Eq z2T{`HkS6o^Tn$3MQF`-iZbCxI8u#-7WoioB%jXBpOa<^Y*PXW zGI!yohc|LQwybYy1}5jDrb5QVdrv=ubB}Mu*YB%9@?jiYH=nHo3M8skyDC~!-f6b3 z^L1esB2%fFkAk`7Og22{X&>O>`-;%SI$-qQ>0`R@{EYH-`!=XZLb2h4=~j0cE4ev3 zQhHrs_+5K-7-)pGULK=lnmgixMchuz@m4?>*4_kt)Q`)bnOt7ru<`MSZhaPgyHBQx z6}KOn7L}(Rx;~=+JP5mt$H@t-aDL z+HzXymCstqQUXl68GCce6eOAn>IB%A6|3^F&l3+Ht)T}2{P)|P^ATw9zMHr9O71CS z3ZKG_&3}?2mlEUj--^^s@|u&ftUjhl>35RDI7in9$dA&wDTZT>6ghSViB;bG6ySfYS-$QO;377XCvuE_zLX z-Jno*HlTdAxtEhftZ2%klW)4D6|R_}ZN~7e;BFrk(`rZ2y?LyrF9E;!w>(cnzy(+M zE3>}SzT0KX!n$x=FqANb56v($FHYa-1PLwxgli5;)|)pil}2}Zojw22P;70mZ2+w1 zUySBnx_ps)><(N8QbV8vs4g(_37uB_J=r4pe0*gw31n&jy3-1>XpiG8+K>g`wR{G; zmc!NG|B#!6SU=i5fj8dM2_yHM5itp)@SP4rr_D=CZB@UQbh~2owxACz(eq~sLk#I2 zD^yCII6aROW^AljCJvgV0^1&C-o;LgQj^IRy?v-bHxh{L4s;fD@uZxNAG84&`(4T4 zp}=&dkgBF$Lfpgad$)iG8^M%xz4Hv^4Xr<~`halN7V(&jtO zzm+!N&3Zsch~bMUECgi%gQ8QmVl|k{anq|{9c^vMX2I*J9st99e^{1q|4HEYNg*|+ zl6acu%Yd7gKnmC;b4B(Nrdu4KBt5ky9#jRFem$u59}j}{%`@v^wGsO z1Ar%*`M8qy3A{3nY)o?8axJQr3;?=#YHE=+;;|_bmq3bd@^LH&42#eH&F{w(J%2Ik z^EA=L&e8melc2uPV*&D8&a$bb4}n+4$7M)PSZYLOYo7R%F{ywhxu;$_U?L~}hb8|6 z>mp?YC`oE|KLsqChNwor5GSG%OO?(g?B<4nDtR)Qtt0E?A60$>C{7^2GZn1@1ez&) zHxqRa6ZsLpczpr3;0gh@AYeOJtB0)|_!6uVmHb8E#8(=*jHnUFr@DiRc&fM+f_pEL z`)K!mF`z6~Jj}k=@TFGAWw@o7U6vL>*HASvUj(eEz5-AM-k_cI88^Ix3=-u5rN2$} zz)}ec9XEq)K|}~@1`*wA!{oRS*m72qHyz86m|G4|T;zEw zim$}aZ-i+P&X0$&p<3d2iDLoT>KDhesQ2hlm$m**alku=sM2K=zY_0Ll|sJjGoUO9 zrPw&#y#@)I?1gwg=$s#c5_!!zIG(T%f3_>9NI@d*c7}kTYaq|ND_hZt4<>%M;{|{p zuwe3=9n8<*ho*0h)dl7ePy(vF5_*5lDw_W&-zuh%1Y!dU52k=ErNluOAr3N zY13I=*JpFy>84)uJ}okzMimas1ZDLK&p@6!fd~)C3ax0aXZI%n@DV(HGs`o+mKKlw zM*Z3Z3=Lx!21_(b#KAc14u&d-oi{b0Smq8$;~5ahBq+$^n<%c_7OE1}adUHvrN79D zj+W0ll^HZFV%8A)ufr)2031Wd1yv4`QzK2QT(y7KH`KqR4#?@xkM`=1__@WMha_hE z3KGeguY9@nLo8Ia1PiwJvgU6O@ftf{SVxb8 z3CB#8C+E9gUk}Onj+YrJd&Ws{v$XX1Jv73I*}&v>_rf=iuUca84=4Q4-CxXU@*_ET zhko!4R*-ysUaV`zNsgd9{i@ZnLDI4B78q8~1RXB5HF}_F`X@LjKwtRfdvKTUWMK6N zi!QiFwA#;g6n2z9KV|qq!5~J=zd-?LLv8OtF#__bL~?xXL@4i+t%P8bzW0Jf&da9( z0Vbg3jgTxr*u%!UKIt_1KPPib-|7Vq7@*C4#t8?jy^Cr9vZr4k6u8q{6x7J~QKHNc zVCr_spA-P9M7MMwaO4kwKM!4SJ6#RFS&I=Ps z!KCoct+H+ZXW;TwUa{I`u$HvtQ&k`jNdUCgc@7#UnwpsxSa07vs;O9QMn$c^?>;; z@~h+N8si^2%;dYeQwky}0n_o`#|wC*%Mn1S_~{?06d7cnD4h?wYlg8V{_RVm)8U4{ z$_fw88-EQ9fs7PC6IA3xC$L!Nw-K?!ntu#f?3@aN<2lIZ3^9=-aL-T*e$IdAqaVTr zO)ssEhXGjkFiOH+|7Mj}!DZeg_U^*u`qe>3WE40la5F<-4lS(v;md4Ls%wK1a9tcv z+!%_T2bJ$UgSxIFK=U&S%=pE8i^K1os`qr9c)uKMVcl~nhV9_eqZS<{WC@^I{ZEyL zo+?`NJ*Q-g{9y7tPbLn^1d#$ub8|5k0&#vs3Ks#I%tVI#KDxO%hEql5FxIbyo74Dn zlS1&J_Jx>iFsq^HZ@L3+4#2jX8}P>4IZJrwY{KNu4QTD$w4r{W^+K-UUr<;-dSYex z%U2zG-&yV$S#nV9?bJqpVmS z{Naq#1vfrg%b5q6RUE!3y+z&9PM2dg{5f%^4U8CzHPy93Rne5Mzm9(>G*js-DiYH! z`VP?ccr!??yK<(-3qr@n?o%!GK}i)&hFi;zPsdueMi>1mm(*s*qKKLUFEtN6y_hXMJ9%wcHD&)%$KK-mys`(NiEy#4!evY- zT7L88{-R6p8s~7CBYx&}^DsH*G)DGXQ1``{cP$ls>aTKBlQ!X>NcJ1{Z`Rr%$x=z`=Aag9J8gNKnz(_s_@)SJ<8d% zzY&bML<-5BRF8`S6!fd|un1pyFm3G8I9`=0Xx-V`2WmM~X6m=g!Z1Ig#TMB$O(y^J zuNo)7obushoX%wV@V&S&&mE&s(8nX#52fIA9wLZ;H0(mpAT9KM?eT^tV8_ob+{f{T z;qfzKD^ODV76^V5qBpBBQW%8H5YF!BA3Dq3`ueI&J&fds#{6ESj8XY!dTa^T1Pz)uxiP$y!Fgd=~Nmfo5?H;ht2@=Q!C()+G=!QJUTm#C!c&j)ld<^2Y>X_FOBk)Wvh@V+*$uu9zk zUAI-c+(IG!ja}=N#EN?Ef~$4t2Mys~us0*2*UHJ$o6SF>U8oiUk}kOuM3yf<4=ZF7 zo`(brY%onVqg!Y*o%Z{>ObXJGueG*VsLvJ|a&_#XVuhlYcV9RooAxz#|f^u>oF z&2kwJ&gj)Q&tO(HaxXq(1#j8tho0anUmO)|^xwP{7fM0JhbMq9X38;Qa!;*15vsZc zevd@KK21YL%#|I+{Usp;`RX&hEv6gbMW^*fZW%~Zv)u1gwjX`#>2NL39|8tZ=rOr3 z!4Hf`-k-n(r`W|-tBU>^>*D69^I9}+X=#a>YS*Z`I~K5})zaA+U+F%r9z`B_hY%zC zTmnKvbks_c2Pdq3m~Bx^g0j$GhwpG~wDJ>g)<-s$M1G-?*#cT{Q3ik9X*-H6B-g60%=h+E@}7 zZatN=R6!E#I>a;U-fXzqyBjqcp#vHa;8$S8oaNaIB{3pr`Va~3)|j?I){hSxgkr!y zEjf^~gfe4RJD<4F?B2y$T}0rlAhA7XFtQiE2nTP1ss3%zDW^H(0W()uEc5 z^m_D0vrII7QoRTYXv4UY=DsB*&!MSrOg`usS$8)WD z1gOK}WSXv)nhH>a6L?`$s3H6<$U>rSq9*2nN@&E4uRlmz*b@=)0tu}NoYR6}SX zDQe1S>%D%?y<;e=C`|M#z>cxMiWHDZ_*Uuz7#km%fTI6usf`MojOe=U-znj{_#OI77Ig(WlrOq%Zz$#QXYC}F@W!|VDtbN1O)38@i0mG1WbA}nDPT(tI| zi%uubldUnm3~D_51R|JPnFt=I{7ni`*LS;4hB8O*qtk+x@6EK|;d-Z*0|>`NmFdL% zvp>9bPq?EO+KP9QU9xc60HsYf-7ZusS8&2X$x}pqo(tOoE@EUTh2b{Ho-}ueLjy;A z=t2OQ4!Ze%HRL(#v8Mgo0rZXu-2w-FraN>Y$Z-uot}J8%{ZUOa$jeFaqX-R8=7)9t z@H?-7ohQw~&b3Jw3-rq6o&L$W)oHz?z|Mlm?0?dVwtP#Vv6ckDzOF_B*?R2?OOgg} zj#-SD{4;z5%ig2Bc5U&|Hvup&oe;0?h;*hh$-k*oaYwhZI|7H|GDFbi-QMX9wPccN zdjzk1|1f(@DiprMZFu%KO7R!SJ$Mn;M;8(y^40`xQ`QNY$?85j1y!bns0?PQLNrD!Q?V6I&hZhYWin#tpM%k;`N_Nu(J@U@2)L^yqNANw!_jC!m(+}h&u+1@)jG#k zxTZmmf<~q2`^GIA?!*=A0=IGgSL<&9+&*}9{OyBjJ6R*sdeQ89AKJh>UmmoQd4jCj zvyVdEbLI<9OZ_Vc%yJMYj|nIYbwNF@n&afrGq%%f`NPeK0E=5N(5<+n=+tW_`jR9; z1ChD$)jvrQOh~SM)G+t-jME>H!*;&SK}z<62_0;W@7iP|y~PVK8z!?@`gIaozl*GV zoMntQPuwcqa=t0AT|X00$?o!^@|h4Fz{&=}uTJ1=`F~EXM_(d?fHA6crJIIkq8ET5 zdi9`8pQ)JUPz17?Z$BC$f0Xr`$4#gBYvX_BYWYVW9}0wA(NsPpg037m;}3t{B7!x4 z?x$NOV9w)zo*+CIp5tV<96IJgzN<223>aj7O<>Vf3IOi+m)uE?_E>9|#v0vC=Ej$u z77}NE=ySl#i$+TKl*5Q5>xUdYCq9(q8R|euxnSj*UqXI$ERy5-LEi~KH+vII1!mKQ zSk7T0iyQ&>3u@+xe99=P?zcW;X{SXTMkENc1O`e4I0gTMSBuU*gDSkxqqgX0;N1uZ z<6w~gr@b=|hq8V9c#A@IqU`$;GNmHf_XZIeCcBVCNFfwL)+e$Ik&-1_Vv>kRXu*_< zQWTPXmn_+T=RITVd7k(G_dVX%Ok@x~}v5em~dPAT@g=x1vRZ!n{+K zH$F|mI7ym}Fg|gLTbw=5B|Uw*p@1=no<#+AH$@`E5pv>CXUi0CwHkYObEs=aPdxheJfnZqF~`Ai+V z?X<*BWl|j+ZfBUcn|hw!I&IF_{>%F>MdjmzJK`I%nkYwzxXs0y&)cjFc{G)L%NIHTI9R!}L?~e=Mgggyt%h3})TipYV7K>B4 zS{)~A#3c5+7?@zH8o3TFT0I(lR!~y`shMXT+|cnfxgk| z=R@~>sDN}L$3btyMj2;IzrB*+0E<9{i<=4ouA#0))}3+St8usAvN0$@3XMNHBC#)R zxjFglJ4|k0T%|n$-x;@uk4Y$WScKI&Z@j-1 z(;X?RCh0|$vaeAH?-bOGBBL&>!&-+?ussklFfmi z2b?bbe90Fjf0}pC#C?LaRz(!*S9k8brw?Jgj_LlP4uXffG?=7KE#RAhGkv{8$S)p% z3q$MxI6-9pM^n;W&!o4T&D`uvO7R8TkGP=z~_75s%x=e!VrUR38=xh&m!j z8FcE=pqfUM(;qKJDQ~y8p)>OG1x?Ymp^)0ADa(Z>p&-Vx{r>#yZ9d6sU>LfGKp|F3 zltwW+h{2c3Z{hqHf7#rr{%@s^%z!@ESZGK1tLMEtm=Vo0#ablWnyy;m4r1OCx|(|H zP%f;ZFXx90?=Mad@E6*mAL}wCRzsJ-ZFsC=Xd$2n2_f9NWS`N}nAlkU3w;eZ*bQKv z%LX!u_fCQ})4ltIiHR)x%aODJ?ss!^lLREC?ncX-yC1%LR#w?|xCQ+ZvG-v%JV?7Y zFCdvlBoiXqI)roq=09-ffZQ2(zSLllqWNmEXZ;?&2$pS4EC3(0otw03VD5dygDoE3 zI0$Tn?)Z$#=-08ydlx;lb?t;TnQw@0rDj4M%&j8)Sn}-d?$Djga1%WRnZqZkGBpxq zsG!aUSPm!}kfvkm#4kk-vEN*4Xxspgh-;`qn0lSmRY5Gw%xGZD1jw9JvY-8&R$|xe z;yl$LWjpLnEJO9b`J{M#t*G{BPMGQ^Yq3)fFKB(KhG|<%I#6Q9zD!?0TgZ1itJH7V zx8VAD0pa6jX5v26!_nST0ge%M1#F|CIu*Z$J{NF1yRzoX2lO1+eC^t`J7zT83TECj zqvj@B?7n4mxFZQ{OS|qj*N)}0c3q)!d46vf;bekYva?TRM{=$}@}#|FOtRwCJ_fH~3cBOgq5FQ@ z$MUMMp8z0E`N3AOUsO!Dm~N@kit$+-A9-@Vt9#+syM$Qx#;~m++H|Ji{QepB*3G}6 z3IoF3ebzBP$+2lndM|>#Avw zQ-~DPQoJJ-zkGUe7i`x324-2wPL?mGQZ)0YJPd1*6Nz zq0As)xv6}im7K-D^s{kYiTDjnYIs`R4>x!XdZOg@Zt}Ph_BLe6pJN7NRxntj*TyYz zInRFr@n64A@kyOICTk2JiE7A+Ih*aW6rcEF6C5ne*Y!GLVY;MPQa=i$eys2hDk>Y+ zH9BCbCr<`34>P=(4;vgTz;_}u^i0&pNKRbB&}uk*?y=+)3hzDnZ|}z%5#Km@uK%-T z#G6F^G;SA*Vja-M#3=TEL}$2IMlUZ~MyINd^u3J-LB!ss4IzR!YeYM*8USCHA`78c z^r@Bxg6GR-Oo0sh#o?>46jao+U26UjGj9`>8R|X-lN2@K%HDWtnw$XWimyPOKmtT< z{G}I(K95xC4iRBmxv$5yJyjqO_J9U+<-h*f1^77wm|=ZA2}uk_dF-bUK|V{3Taan8Q&lL`wMHOf&@{RlEVVsP`NEqxkt3`hDLB}=`NU7 z+*Xxs|7aGiD(|y{)LxMKPeqow@abpF^7x9Xz$Fj#BuV~Q!)L!n9;XIbLe|I9fcE9R zLF)+1{Wn*vj;fyKQ@Oy?@_?@dtQ-(#rp+$n-J(w5mx}m{3sMwXKS+;cg~+vGtrM^_FZ%&vC47GacFGFk zy;g~=eAv^rZ>kFUFQfs@NsY}3M`3`Uc>PxbA}}#T`cQFkoJbOESXGg&2XbfFc&%?3 z0vPi|^1+}$O@pkVYhdJnG-VCVb2`*2F&h4^i-Ghxk(0Ltby{1+}X^dPHTgF*a#PIo2 z$L=@r$k@YFD#M!V@4d19xX{I=Pk><(3gPyB0)D8PuYI;)>AOm4RE%_x+>W~t(4oBY zN4K=w$8<~DB_0@YXs}}41BgbN>Pe_b>6q{#Du`*LmtNhqv_(d#;Q4=f0L0+H zOvwU9FjeT_*AWET57Quo?83?l+@MhYPO6nDeO{U5p_z+s6a+-y>{ zVMYGj>{{F(0)vf%w4D9>Kvx)iSaPW#Z|*EEuNAN5X4Uz!u$r;NPjsT;0n zzRMjGJ*}wj-`saFz3+6LJqsrtJ5ZQUo#iATw>nvp)VU;ePxgfeeAw-o5|dUA?qGR% zWt_s5_o5Do@wF{=ZQCPme|rl`MM-`eVNY2}VL<)`AIvbtizWqPqOJCm!-RFPZ-*){ z9rSHO-xG&sV}JcKMMp(;!A5l`zueF*v2yq%YNEdTE4i4_V(gLR7oycW+|YFKsnJb= zc7YIM6QNx+Knxr$1A8CI3|^)HOp5~cVQxvS18>bdZGy?6v#g^+J}R)m%7@8)jXJZs z(}5LJb_N%2q&r{UIE&l&h#Q7d5vnV-r1jq);R140+*6@fB3v6{WZcjl+FF(B{pn|n zLf}D7{` zP+^W7fOt7PN48&}?bviukZdyXGJuNhVAI!F>E}0A+D$7Uud` z$oqXpe9F|#LE6UGHU(gq&$5c1IDVW*lgldu*^67aP{S%s4M{vmdXAbQn(+r#@fx6B zn3cTHtAms&;~9_oens}uNQ})d?PW_m=)f3&p)3S(Qav0HAcnXlY2ztASoByf{Ma=y z-?7|2q~A-y4GnNv=9fi(y2f=CJay?jQa47Rz%7sL*|qHKv$XFTOy+0oHu>@D_$2Pt_r}DhJWM2#CVo6~2&OIQ2}E@gl#*U-VZVB8N%% z{<_t1w8Xj13I9lBEihjFxfRa;d71l= z+~(^k&3DI^qWLwooSh}!s33=lD96+rGr;E*0eaw)`GB~iZiBXuRk2eGAC%>P223TS z&>rjO$U^{Yipuet;D;>V+)tm7fBch-V;Q4K-!4wy-<@thU+xk{CEsH>GJLr=(cb&3 z>E-b%@-)8z{mxt<1H>~@em=*K?W|8QHYF4DYP|Tnvr!u*->;sb*i?#z3E!!`yv4^$ zOu8-WXx}R$nE=qOtcD6O{OfoJlG8dCM?Ed{EJ68DE`K|ima|@p2Y0v0LY!HD(Gy@1 zJs^~i=aTmp2sswS1Q9~GQAuzW5FZN1hlpvlbX%-ma18)ajv8Aw*(w}bA5JDw-*f95 z)#?RZ;9Vyl-HKa1?1)DTBp)Jnu|8Kxpn9d}l(5HSa=6R50;Hx;3j<#IJtsHR>V?C| z86|u)hFexy_9CEGNsBu+x(c`7EDXO*H{+_-%CRs!^nySMi7TwDSiSI_49-0XJ9wOO zH9DpNA3xkcs&wrjlw`nT%S3M%T??0Sa8Lbup_#RC`QOI)f7lqmmq(iS)4*|K)%%w7 zA3nTs#D7A`UrFUTND+C+Hg6%LpywGE_--ZtAcuIS_lp78*Mvi~OJwH)PPte)eb z3h9*q8Asj=Y884OCFHf<7TV^fq_UM)l$*)L_6O1 zbFedK&TbOmflnsxYWJQw!*WJh?v{>+=}OXt*OU!?XcCD_1VwAl`AKhHzMRJPYl57e zyQ?6Cyy3ya`kOe&pRyb*a_pgOq@O=)%683yY8W&W8UU?7 zPHdEDzvMo<9lzl1-@F{qbW{Zrz-iz}&|wf4rzi?F@$S#(BGbROB`7cg-2f(bGk3ywUi~ zK6h<z$_Uo5ujh!S^QY{sQFW{Kv~ zh`k>nrKc{nrDITd@0sNB!A7zLk6Ep;-%i!Ia=GK^xmxk}0e>DH7d-k$gD-3OIeK}E zhsBTQ)NMw}@(zAR_{TuJm~5* zJKoc;n0hHuUA#J4H9*gKu#s{Mtq&%N8!EPL10Pw=e@S&7bsb=Zoh_QvIeqjv0v6a= ztEt-k)#zj?@755mWSB?4*yC9b=2EAjB6%tv!|6l!joFS&_q8zsy(i0Jl&4XN;~YV( z>d;%>KU*M&ID?o`qN_73)Y6+hY|2%0+ey#V4YpUbRS^CYozUbr(WuYoULJRiT%17; zMNqZsE^l%hSQGD+GK^N~f7GA;Ye%mnoIxP%KUpRomp09{e!I4VGzd7$9@MgM9$zOb zHjJ7tHa$Xm*eC+h*VLb9G_zW@78@aR1Y7LOZE2zqDbD_;yUJ(s2h*vS3h60 z$i(^H#KZ5?V2YXe-JAiGr_#5NPtS9Rik74CRW0X#O-00!u`4L)>BUmld2QL+^kjsT z6V|lq`1#eAyA1>p(N_ystyV7aicLOemkT~9;j%wE*j@j0k4zJxRiy zxBBRvTEg_+QUSF|4x8J2#ZrGBq;9XTfP9SP?1}L_#o9&Gs|wbp9kove6e$8b;~P_W z$jhkWE@`888Y#RyMrAMP>nvKx3kFp6-yV;QAI&PqI<9DM(ug`HCVI}sJNGDadCK@r zM=HvBqg<}?yZIb$4G6d`!<>}(-R5tjhNpCecz-65ojpmj1k_+-F6^!gZpOV}f-ej{ebmWvaErM5rx-Ht}S2QklLs(K=c8g8lAij{Ldms@0;VT9 z8&nG3vf-JG+;(#*{8HV`j_ho6auhFCClD*Y8 z(_IhWErLhf@v2kl)Jc@|EE>3<=`FAby-itcP;5o%w~ypJFs3@W?JFH@*!__cI3Lt0 z?wzlKSCKpT(48sgd3(<|U&9Rn_>)NV)eC92i0SQbP|1yVvG?B+gWD0;JBAegNNSTiD!%ER9ml==rQo9 zln)Qpwf}HehI1gIZlu(X`bVD_`!2P&V=>U#6@>~-CVt`qoIn&?@Js;`i;=qjO05b<=Ja4k*7W+o%DEKY=(l!i3jze<^>@o- zQ}H1;e{sro9`e0X5VqS5<)O`>=U+PVuPlJKguiZcy?sBmx>~Y3;@Gt!l-Hz^1*YH^DEqto zz5yP@rgda9LOKRt#&B_IQQv)mGoXrL3Q}hA%5n8zxwuOuLBydtJaMgJj>$PZJl1Mr&8U3Lo^2VcCE=A=IZe5ZP`Wp}5PS4I#ZNsxK zG5R0;6u9@9pry5SeNw-`lt=B2&`-To{rJ|duATnXVYGQbxz&J)`zVJZ!=pg^(aJuF zu7ll;nP=3dKl%@PwrYhqxwsU?-CxQiX7BUcis3-a=`Q?kP@WP1YlwRFIYs(#;7X$K z&ui2s4{g4^jY7C?4_UWuE_}_jZ2QIhh0mbq^U_ui<^1t>d7WoerqTXoDG=JYtdl+8 zCA#z|k3}$hPLp*{D4DcKk3EHRbTX6uHYHLodU+OK->LQdD+>Qk>Z6seGpB(#A^SNzGduN>!S5PG=^}7toS)Ct& zU2-z_l5|LAh$|@Jd$gavGI5>jOk&EV6SfUR%`RlGlE@se>~F6`qfn?#9Tp3HT|Ei6 zW!6l0L+U6D-apxk!GCkz+#lP z{gaf^q+r9*y8Tb#L&L8j-2}0ac>dmi;Epq4thec*WVg`v&EQQ6?ogv>@<3Wru5w$+ z(8^S~aCW^@<9Tz-8JxD3k}m<27KZbfqHZ~~ef976UOEHbz2ET@O*s4+zukdDW313$ zdx8B5_~X4#^w>YT6U6e^obKYu%MiroH3W*%VF=AvNufqP|JX+Gg zjK7`0GdTEwiel^m4kWNb7HzK#{+&F_$r`^Ag zK{!ZHjss!&q(K}e0z(B@&Vt8!b#kYFegS+AZfXTCB%(bz3eO6ya~Nk1iXbl*7#<9K zPKEe?dHGDrz!;*Y$hl3$pwRJ|%Y(67Mf4V`eXY8ODNmY9KxNz$TIWNph_?Ust9i6B zEaIEP$;&~m7x?b)v@E66@UEden=W>OP%iSUe=4J&tHnk!nNycrSJ{V+tw-eyM&-$I zymfLU=rumTVruVlslB>Gu-Zv^6iH!viZ?j@C6cjOW`P1 zsbCg^vUhRo4{+L^`v6~A2PJrabUtt)8dZFXm++w*Z2w$ksjshqYTLMhO_fj&#kKUp z&3f=VMUoci8Oe5{HKebNlsQD_=2y1D1U@_j=0X13RZdSW*TrN&oq-hWuplT2v$QcD2@|x5;qi-9ogb;2 z@S)c|0hUwpBp^6Qfi2mD@2+856Y6f(?zuecMVT1wCHp7qsetw&Kb~SfzAELt9aG#X-ew&#{S4S{**|REa-+u}P@`7FD7Mq=JMOmRlu-6S ziSmRvtgxq&iK>{u;pCA>Ch0}&UzyhjwIqr??kN+J?Y3ouNk{2j!THBQ*_)>LuZI|W z?(eQ29z)EQxi|P$N_)m2QqHR>+>G8XGB{V)e2nNHbI_fHi63ZM5JE&i zsE7w?L^cS{IGs6ewBWA4ci8u~P*k zWHjb{iCbUZ`ch+h%fIc@-{PEQC0t6_^G)^9=dYQaG$0+Uw9J5TF|!<_C5qD)E7T7x z=N{upW`soJwspO@1yVt>F)&=?PGSV5k{j4Ih0|2gs)OmF4VdDq=n2s6|6ji-hZ(MR ztl`r4v%16vE8CuS7DCK8yOE-976rhE_)nck|J{XH*G3kErJV+^B0G%N8XrS=MFKoL z`)S;;d;>SI{@)hhyr9=j8*rb=7e*)IWEHS=Ux*^1^%>8~Gg4H^`;Vq)nMCLX|CZ(i zGz?PKjjZ%HjIw@qmVa^PqQW?HQPU8vJ%nj8+ zrH1R>z}s4HH3fqDp8`cc1~+&91;){LzxhkZl*7Ycs;(^6#$p!`Gb)^ywr-*?p=sDk zF!yp91VPdcg0>k;CT^X?J1>ZU#B_Bm$s7!Wgh(ms7b!5!4^KCyt9RSmK|C~NGi z)3{;9P6;e~=H7YYrI~DkcvIc~Zc*R@^!%y4rd@^I`j=%u!iR=R?c(geebC%|maYi8 z>njil#5|l775F?9*TRdWA2g-a@iEx;XwW=Zd8#qI4M&M2HqRHEkToe#Z~t{*$j0Sm zfFEwJjq~;8=u#YJzAJM5Os04RMTS64a#540N9X7sD-n|KY)7 z4ds6GBk$)9CBz_%%%sL131Feix8r6uYo8(&nXZANc%A7jK(E+;uW~VVtm^1%n*7Bz zdZ>dtSez$XKnhl-fVJ0WCTLS{pZxYD=ag~=S@qQ#%HjK8_{4D9_^y>tg1%?=K4@Ul zm|2(jYQ44=J?jWYN^GLh3X=90$S5y1TVS+ExmR0ndMn4vKd_VV1Ldzw3~^(i0eXG5 zj-!IT$wQRlGgE+H%g@do)z-WlIBj`8zjBC368P>sy9EkY5yQ!j2YvBD0K7p{bu@c` zpt6l7)XTB@kC6!~WE;?MJNw0- zQWXs0@QOr6FZ8(x!dO4HwCn0jQT!#Hn|MM!fnb12Frfse79a-{E__aN_aoV_+L0_$4>M?;kRO4N~xiX>;ij?JIi-!6!U;SyMK5??5zE1%- z+zFCSN$u&+6cE3ptmLy8Zi(Wh{t(II>gK&I{K@U*p{cwMDkHunE*UbhHA%Aidp|TC zR35E?JeMhP38CxK`27i4{q*M3^Y)^&4?$_p|K)NLF=qYj-opEo*i6;9*5jkKW3MIM z%yn4d?dig%P_x1e_(F=QPoYvUaW=}pBmWs3nUuS~MhzO{fa?GxJeKn=0yxNzX-TB8 zJlej*gc{}2Me{B(Z1m3t$i=2d#z{VY!IW=zK$j`arWhGU;5lBx^^WKOVs_Tx_%*beue@g6D{@PjnJ zTm)~hx+HQ^ecV{^zO=^?4B!17XOS$-VN^U(Mou-lj#L$-m0YS5^6L`l1wwOdoZNmcc@Xts2y-%`S&o#KQS zfgS={dwjIN{+U9fdDMN}ghtGHTB%|(6q50HuG5AL71!^>yX3wSvxwY^gKM|sdwP$T4BK!$E@HwVY3bAMR)RH&0P; zdY3!(tqx@eAZ$5>a1a_>~0qD7?wD;|r@tx_7c7tv%v1gcK&Dg?J%$7SR=S=aw)0S2L} zB22Gu(?oBtc<;30Cy@B;nx;EbE_8p0H}-U64& zNef&DXq(v73&ClC7{*$*#kM55k1br#=MKVY-D^Jlx>nXKu{6-SityE{=_aQ2b9JTt zHbWzZGIV8jM~bl$=p7gz+pW;i?vx{ooNt}ydutbCn{0}@6 zEZVy&RU#UF=JjK)A}qb*K3stTH23ue@8v^x@of;kfH$7RQbp+!YE>DR0e?~Z!Mpi2 z+lC9h+0hYElqAX}cj`&@w>@h}?5dzqZ#v37osnN_-fzmJ`8Mz|MGCUO8Yr^wNqa8b zGbnl#u!Ao=zHqIn{{e)^jtORzHx2#NRqlYaERAhDa)eaNtc{n|OuHq5tm$xxf)v>P~|5DZVrrnH#H`SADs#~l-g)=rEl}S}u z?kO_2PC;V5kImj23Rk3#Xk;peZ(pFMlR8WsU2lIgW9liTGhMLSqsF`V>P_8)58wRA zphj-SWGGPLx;T8dPgNj^eHJTGNDwPgakZG!ue`OJHL1lj%wn|jJTru3`HR?8FcBFv z($fqT1wNK)>5*+v!p)w4Sd^0I+`n>_cb)qO_j!!DZ=nEu?3;)eB;N5MzxtB z9H|695%2zq1|#YkldFFgwqBq@J=-uPU#aO~pF7I#DO7YHABj(K`H>to#9l8Kv?sdB;0n9!stOhl}gKtY?N#Uh#&fy|PpJl=32#FnW6jbqT7 zy%ft_pEqfTwHse`q?0Aktnk7IbF`vo6R0( zN1MMR(DMvBKP9Z43vcMubRPT>LzP#vR;=?O&4&e6w){>OTMsXL7`wN$B-!S=yh(4{ z=+tfgl^=-M;7p!=JkVeVWiTwwK*@~yPtGuVu&%VjA9Dd zO2Pc~-_vc9)}kI6*bRZ`Afj|AjFOS~P7r)SOweW!)MGVr+B`4~wPel$nV&8X{?Q>s zU4?lq-k}wFkp^#|Cq9tviatmC60$~WUOoHfLVXZH>_P zZcDOzVb2z8qxXEZzj$kK%A(UwEiIcA#ozV!{wV{7R#|c&*pIzxP7P(W`dV||6?T`z z1S*s@@zFyKYJi}u((4TZraYo5G=xpc@bX$;i}}w#%Lv737(ct06OZXl=LQ16ts&cE zP{l8UVU|bp6E|#FJM*6K+J>$vM6K~5TpS1Dre^Y1$9wu-SWJ*>87l}UA)H3&Ptx~a zF+q*Ioy9=kDkfpGhyf_b)lHE=O|+IU!)tX+kDWJpeEHxAq&vEqlvgVh>n$ypQE7sB zO_F|%;t@e>Dlom9399&<*EiuOK$7a%ZFsAMWb=Q~`+!>9~A zd<#KPIt||Sr`kW_nHfe&?@vIy*%y+<50HdCMJMuUNS_7I)3*VmZxqma1I*bzKoc6soRi!(%iz$ z22+2RxvWyLj(%o2_(d1vY<}a5Jce)tcq7<5ylXJc#Q$Nbv!QUCtxx>+^Kal4LJado zaB$&oGYz;5Wu)qzz@S&J&&MUIuKCota=z?HmL0+~_8By05^+&RhZ5uWXX|wsUDc@* zbY4)}7KhDL40se1nb3-WW}B8s1#LAha%;1G+tAfkHOA^s%>5bw+Tq(@0(6T)Tj)f- zVLPtj5@o|uTg%SZ7ZEcT<|o~&nPjB)${z5Dx-2bBL&d0Z+h%_Iz7ifQtdKT5(5B3!0(aU6<^P=Z0bB zCx8kx{0${C`&U;VthcStCOEY+x_^tjjG^;yK?1B^GvzuBi7Cza?u=(_njRiN$rb7k z&^Bx8o@H{H7{fZh8o(Ks@!$VjZ`#8PGiM}z5d~kU$!cDbyO@-h9h`qA@A83PMB3(4##jfTVmGcH}b%>5Dh0_UVnAUjNP@vEx_zG(1dpi`s zH|x3$4Ra-Tmo@e=c=DN7;$RaziJ+#Cxa^MZCxzlKK z`{;F+9g%h&jA4ayCRQ~CBq&y1VTL#m0BA)?IKOZ|x(Zy4+E{07*KbXf`w<8Qg0!W< z9bIViWqK4)Jt+YWR^C5*K@=u#@p{n-ohHOUFBakYp&*Spi!FrRpt%`XFwYQMu!m>Eyy2 zd6@H!yLC(5Yu<=uqDQG>L6-4&kX#EQdaE4xHUC3mEpN15f$54=g74mDBoHT+wfFua zgC&8m@@`)}fXy9F_wI=WzHgKdqQRl^EYGOW(|K{z&^h^~J3= zP6{uy%Gmuc^+EAa*o=*}9}XlM3!lu`=sL#ULVs&ljV}!at%;+tcbE%|>v?H-D+DIa z&Qs?8wqKR{VxMsJrbO~pX3Z50_nTrCYkJT^y=RU5dn+^bk6fpcZNy2Sx7;598_AMH zWEzdkQ;8PVoKF{LcpU;vYEA6jZ!!C2ej?_}&_BVzOmsDO|!SjfRpwWt`PS}i{==y`(_ zBOdc)``(fHPl;#a#|x7gmC^~Tk7(9zq7Uli1`4P>xBAW*)ObZ~E@;cD%b3UkZxUO( zy*A!X16l`vJ7*bkjI)ela4-K?T-B#n_LO!<-Q|He?2Py!E-cSb*r^8PI4ZZdO_^sD7Mzg~*t$D`K6T(R^V^OWTSd8+;g1T+exVHwtO%6@c^!Xy)$9_^L*l1R7)W<)< zX;U2QlvtB=YWj6>;M3CC8Otggqy&VaJ~4OH2}q25@{P(v4;D1o65MCnuq|LEvt`b$ ztv5xMJG=#Vw_0_lGpu;zWQ_Zr3f09p#KZ_U49HML#neuNKZ=$+*AvoTUU)nlt+n%L zirB|{X6M)B#Yho{0|je!2Jr5)bl}}Z51(lR*sgn_p-XxnRlT>EyZ-S!i3dmN#N!XQ z;C(sV>ziNu2qDF`BRlI8?g^IrV^U*X;sd#SO$=jqbM*6<5B=TTo+kPqIf`;?@Z45} z%O0u6fAGon`L$wIu)0E$%OxxB66v@_AGB&3r8^PEm(R{u=kp`}j!RM#(+Kb39;1h; zSdYfr+D^R5tD*oGVVLKw{&9O3t40M`fm?AQlzPHR@F#7f7drH40rZ|NiV3xm{jN*O z>4pu#59cwVU6D-C5y8Dh>fD*JV?UOq4RViL%mua+4@M@j*O|SC#2&w>w2Gl!*MlePzO^M<-Wx7r~nwrO-51d5M5{L@ig z38A`HYH}^HyU7K{b8IlgYd#Y%4-;ntq<%sKpy~AxCH8~pTUhC-0m$Jx1*RsIE(>h3 z!Nf>BBDxHoR7rcwbpLhb$Osu}8to$dTtneVNIt3Zl;pFLQbrkS1@ysP?y=g<{dN%e zUHRIu{pE-9RAPG5(OsHuUm?MT*S;e-o)g)~^>RxRq~}Q8uV>B2hi06Sg`*U))67d-B;aqJRp@(0-7=ETm+Ga3ZYV!O7W)fhUExB^s2OZDIpz zQFTXVa~~iT8p%+Bdvd>4uOo$LlTuWMF(wx=gfA^yJ3rUYGMA>*5FDoP2(p0|J(+?> z$k2K4u6JSMmSlEs4UvPsJD=f-KGKIw!u{JF6dS=zey(^Ktpv z2Eun!r(u^!5_nk0{f}#U^G%F$bh7V3UZ(=8gy&}nXkf~s>Vw{wJXl$Apvg3sMdm0v zR(*|zj2b( zc?3rzzjAAZJ)rR=x9gM@AR1~(p%Q%hDl8{V9!}dCRk>4nL#`x(GSj>sivlF^WGNOr z-fMaLD7_U2;10up8JwF@xq#D#yhF426n?@OvH=CkD_uGCJ$=F@^u&^eBoAnDXGa@P zS)pW7Cct`hv!4AoUCJNk20;p~Nh7A0{?#2Uuok9kiff$WkX55M?48+k!aQ2_u8cRi$EDcT?9v+CrKcpIVH?+Ibemki}v-(08nY@KTqFMB{FiiuK10_jI>6+ z3oYJC={iK;O9lu!d~E;+A|Xf(UY*wh1H%VQ8UHC$Mra7$VZfKjb)LVhJe60=OEXw~ zOgeZ$ywz~3)hUS-T9-lG2)HxB$Ei4oncGw^T)&$apFQP~3oI_g_TL*x9u*LCdQ@mG zYa*fQU8?1a!>YdtNAlTKZ?rY>jAoLeT&&+R49uAq-}>u1ph)242qy9ta$L;AOUaQ} zIm~}F6U-n5^SeqJF_GkCJ$oDM_%kTY(#LwM^MH&0&8C6A92Oo*OuyKbzuLpIP#<)w zl@bsmWt3sFNoLZH3%t+ZnG)w`K1hRI`XkTD)Iyh7WiyDB{B;AsGrXTR1Ywffdr} zTMXWfGyg)A0PNW0rpx?iiH!RZt0FYgfWKjWr4sn#znl+W91cWp!!xBIN?DcKGc0B? z@F$3M_{?A%f=Mjenvoeca~Muv&Ah;t$!*9;;`Cj)FD7*$1gIm8 zXQtJWsQSghGc@UBP!Jhcrp0HbOx=JkGCbS?eYNSasG z##Nf8D%)O#OhxnR8&YHaT5u^(jd-dRQ3_T?x84z=1p&Xom5 z^$Gvpe+yLluW@px>GTt-+@K;O58=U`0w3D0JHtvBYgv4DXX3E>L##?PXtLa4gcG#o za%i9K4d%}h<1&yq5WnM!CW?6_?WJ!W(){rZb23y96)BIHeb!&daXiarZRt*qT7rn_ zHy~WM1gvaNt*Mb7XX*T=Y?LbHogW#b5R#$rGP94TGm>4LPQVXwyn|WTXu-N zz_)CA$yfwp^*vbxw+6Q{=v3v=?L66==c+f(2gZNWW`$h~WbDlZn!77t(VtiYZ?nXJ z$Roe@VcNdFCy2;>Wtf9r)G-Fkh$K7#&i82s7l`lvV?g24$5kEp08mClkpd$p(!pajY;m(|oMJ3@acZh&@Xs z3sftY$liEX0M46-rP8sR0xuZ+YsOqywLzAal8iB zAg{0ym4Q%+RSumfS7zS8d4OQ$H|Z+wjm-{E5+^84Z(=c*=ILtrBF8ym67}P;~)s(lWCXP zr%dlKamvS-xDm(C)-EmPvZG(`dKbGCYRTXuW`ebT()?FvM8J_{jmQ;s`|cS=ETWSL z4sF9Z6L{J`)CkYNv_p~*nd1ghAdj|yeA=6%Jwi{u3~0^`shIMco>;I`!r|X;^JmA9 zycq5-I{h+<4dxZ=!H4yDk)S!*olifvyILjHQ|(Cvh}P-%GL+ZuPq-f=pFg|;DrZh= zjKH)5&|x|E>FT%qn5duW)z%P>xg-)3+|dZg$KQ&F9#&Xo88ZJ-X4`eFeke%2TGr6L zy-Zi~LU$$+J+DuCCDhpCI|3*c#@2}eP5tAj&Ppxvc;{G7++F?lGd5?HvE7L~R}hxX zBOe}3$@%Xl`fd*q#6C5ulm&$m9;gQjbS~LNqJRWGtP{M&E4gt~E>`Kbn)E%wAtR%E5&h=%g=;)9buwQ*LweCxJPUm#&#k(@({ppGd4?dT4}CG!@IR}UtEa}TpU*Jttz_A-wf`E-nJ9y} zqU~v5HqdjpW-Q^Nm*}UT;Q%#gsx#XQmXtOxa^IWUPhvfVz-azDdTb;p_EYK(K@9sjQ0-iSUepC8`u z?tLUf;T#-+dA#QLDSq7bK|~us+Zfxbo)h6BWuIN!^)~-KB2%`Cn}{LgLKZyxgHOG-z8KAK$?Yst&b9-PPrP^teK=uJum+E%!nqaS&%rfnLai zsl$$=!LJU(mbHy!o$MN;Hv{?XQ(no_-cI!_i}QP8 zq|gDu%Rs}eN3hZOH`z1pHCSaMl9wgtVn`Vf0m`n?@)0G77V9=+=KT+3$$5n;i@WhE zT)RiG!EudP-KKkZM9%OT+V1w3LjS zX+;rzk0aI|R9yx?It!G-RLu-H8@;bXdsCq+o@QZ6i$009oID>lZwOnCPn+l&+@JN01r`kqjcn@ZN zogg;0KhKSGjwcqdq3i0g%Ghh$MuvNgh%qXB$Id26z&?mh?E{4k%^g4kH2>vo{-dqj z#EG8VV}r7=pc|Fd0N%D_6iJLJSJJaT?BCanXjH4QWK5GB0sD7@9yB_is(+$~qW)A4 zRG83VI(-o>{4@x#D?2Jik=_)O(aZ$n-qdK(4SrjEES_^20NrCC#s4Miu0!bR>Ik*sq6RV&%+kXZTxvoG>WFacQF9cIe|GZEJLAfQI5B-d|i~`Ib5Ubgk zuYP8OtxkV(R|CqP^!0OqFv2SLA(3!a{RU5u2X|in(E?x@I%#{L6y3g4Ne*;A*s{fA z@Ddu>_K8%!l^k`)XsVT@!h%pwCz!}{Zr{dWwSfh;I&;N5++&cOjhpHwRuv4kU-u1I z{-+pV*V1nMhb2Lqh5@BaI|R(f30x|Wk{*y4IMvy-&xPAQ)w!S-69jG$ykP_8Cr)}- zY-@)te{wSb!g(&uFFVr^oyLz{+-b=fz;DhF=33kO`q_)x=A@?v(14@5O{ugRo<0K- z#MrsC%1g3MOrs85ZBOQ12=p#3y&re@DH7@DKZUoZXl{@Z15S|n5+IR1r_75v{uqM} zy3Fa&)cLU^6#%B4kVye2I=2PQbiq-W3IqU8G)|>MPcmp`p^9x*hKFfW2`cJwR#$p$Oj`wR%ZzV8xDV;}ti>wbqUYK<{s+NM0NuM zgOH2lWP?^+EjP2h>EGE7@&f^2?d~l7wX0WOVYvnXi>cIP-tn2^Vz0}V=0YHCC(j!5 zQ80_(K%N9mZCobM8+vQ%KWXD>yDr2xUlPXq>TyBEa5NrHo7wrtrTDoIR4}zo2ZP0MXXHW;tGy;vHPG@0&@+S8=>Wmx@k284geZs1RQDu zdIAhkX95;UtHOCEP`T@~yWj1rtOUT!UR}XamBY2$+g#{D83-Db*~jYub}fjQksIjE z@4UW+17S_O2O_JFX(kT~Ac2QLpP{-2oi~?dB>x7+%a#WV>*=Y$Y}HB&_YydDhjt|B z-LSAmWC%$DVSnj>DTIRa&MPJDVG;vG>}3{XLwvFCPZE=SV?j+6P@5 zva*p9aEoT<6sW;bTq*kxwtd`SBtJ-)`*g zcKP$xc<=BEhJn&O@@s(WD}A<#9wlt^259lZs)K=HVE`(eunU@=zu68qibm{si9y@v zx{fTk)Q^wn*Wb$=X7k_Ies?F5m{DBm_~?)fb!Ox`!u8C%ap8P0tul473cfJ9h@Jo{ zmNqa@xan9c85RSWlfTviBIgMV7|y4*T8=exjPyI)>kgoNNDlzLHh=(ZH&Ww*esimm zab$)hZ2a1{k-OAfeex=<5%qHT2;}p-zm6F|gd+xQ)FwSj29zewlObHKV1AYtOI!wB z+QowmDkLr-GVP49;kx|EgVXN8l9xpV2o?|JfsBD(WEn_yxD1Djb%(KoKx&`|Mv+?a z0D7*0+AId_Q!5x7xe7+dV#W_w-P_sj+};OFDRan@M(e`kFhG(3MiJm7f(%sM9(AUnd|F&1GE-;k`k$P*nAX!@tY| zQ*ZTzgAH54auVv<{J{-e_&FCrlKC1{Omuh&OGA}SdjZ9_SI}fH38v_GSZck3=~+WD zRX8A~JN&VV{S~4MZh#TG0DSY)%%*8znS?R}qf?nVVB-k%?!7Y)y@~!5lgGRStoC)>CDIE*P1kykdbKc$4I3@xfFC?4n9Ff( zvKNH#JORTsmaU}blH8!(`JdA0V<4qfv%nyjGfb*%of~P9nFfN#mV&|pivWkBCf!Q# z2eR7i^N#>u=XH#Qx3XOJlcmPAh(V{ZItnRr&O9nsD=H?5Ubc_S(RHW}QD+7UpWk%? z4&-{}HElU(XX5bv4kx+Bmy|Z+(m%xngxOjVTMJQ=Ej5oyfZv}27j4E__IAGU?r4;5v;pt=5O-@TF;C)a+x?jW;Suq%cseJ#6uoC@eF zT`a$>EGg)sTZb`BX#H?7s6{lKVSpBNWMT%<^-Y~cIT~W2>kZ6F{=8CtTP;@>KJ+)(n zwibHx(r~nEBdy4`-22!w2+Qd_qmplKBM$37>PhHT@u*+Ik)2v*;uop+?jNpJv2i7S z=M#xeOXGx50^`vb!>XI-G3&B69sMiL-9!n~8xBS_4-chtox=LH>YS0ESU;uB(Mr8> zDmr+mrhf@x$x`RKqzBrcHzjrh>b$kT?#Z^mWr09avhF}@`Z@bSF`$GTYx?|s-pK*| zQ4|lrIfqgR0k3Pl{j-S;%v2S*HMy;gKo40=BSZ{bGt5S0Wf*FH+>TUFS{8dNXN#4R z-Eaa-Lw?09ohD{)LBpS0bkrrfH&?$4l3i3kf%i1dET5Cw%(%(ja&K#dJwmE%)LruF z1na9h-(X3XDH?;SMM10*6i5Za#Atou&GwyC;!6Tq?|-sn&T`;i(W!tLcquTnc^EvzDGMAcOYp-VhT zZQ>I7d!AkCy>rIIO|(j|<1XG(wn0kklUs~mU)?I_qqV~H2hiD| zl&lC#0V?Y47vK<82WseKj=so5>_k>6{3MFaTgem$b4xdUz)uxKA(0$J^i1=~zDs%K zS42hiXWQf1fn;9AwYGW**zElsi7>Qljepw^qoPW|k#!3w)VQmuv<&HPNAc3>VFNs?&e-Dcg7Z2CpSk&PXMD}qU$@j&*XHZHaAV)CKIiGk zh5h977;f-W5|S?8G^C?6`Wek^U*!h~PXx`)r0a8fUN;Etiv&WLxUamGA8WXTh=d8# z;R{wBl{Uq*bpv9D7B@S8#3&1bJedIy@eWmL+Kvv&p^^nS!x9M4e+_(sdocF@QqAAo zj@x%0Uz^U{;gh_Ao>y5Fe<8HrFER6VXQTSYXqe;2=Mz|UqO3?7HJ!-sKHsk>3?R8K z{Gf1X4?}*V5G0hvK~M%kky-2rN*SBNYr8~mM3L7YGi`hEA1upf)i7hFct-sWKhzTe zer`^V^89Mu0%Vmn)mvclVt^uk@jRx8Oc8ysagXozG0OOb9NM^D1tHD~3qFU<90KmG zzNhlbfu-3HxOE{qf^@u$VE_uO1>e8WmW;# zUF{CgB?Azl{3%4(e-^garYB=NV9J#wCi380)`!b&?6ATO>q&HKE+W&jUpQYUXG@|g zm16Cx$Ypzvz;i@E4u9hm*HLIbpnQ$TA|Fwjb+YN{AlC3<$8ei$=p2Sz$IBPixM_AE6gYe3DkE!R3-~ zZe7q@{^sSIRGLLkxMW}dm6z^24;d-4o&%$@L#OZO3=-?_;{Z=UIWePRa9RKYmFy<9 zV>N9+HXx=Hu!!QCCMPY7M@dusdU!C6r%ut=zXW)u9 zvxtl!o;F~kmSO;Y!oh|&eMxl>ufCRERqUJznCR{QupSV>^g9+8X{O=lvH{dN?4*4Y z&_r*hZ(pA?fqfV-wgIc~fK}ve2Kh%3l$;eH9Q~LC{}C@Wk;nh)FLZkQ>i1@v6kZZHVh{*uPf6IQs$%DZs~8JptFT zwhs3FU+iP#1?(xU0fJEff#5h+Xbg%HqN7|&NDXs^#AyTObBTCPdd`0hNz0j_O9m8oXnM`6EmwdLEB+#Q^<3V&IkLgLd|Gb^F@$Zv zV1{Y_m}^6N`cY>A0exH>8yMdMLp$=j=2$VHN3$_GG%sar>RZcK3!p{t?!#8dE6|lb z=Lw}Ucnz3F92xV%Ze zkP|`d#LVxBb{Pf5l_WD>0#+zi4Q!+7H3&r6clzWjS7Fmh3Tk!4v#U z&K1z4Vt>4BcXZ89-zt|x1)YWl)!M-MKWFlf5TdAqllx#TC_g~RWzyq3?s2O5WoS(m zOAwKn|Dmhr(eB*L_J~v5aH*a5zCeGjKHmZYdCeJ2TpiExQ?+0nTN4mgYm(nMNP$|8 zkDJ6u!0J+v?{j|BLx_O=4e(1&VjJy(*dHOQHS&`8MsIqHAHJ2!a&7m~msEQSw(lc$ zjGc}V>0W!-S#NR=si>!6a=*A5@Ny&vd+&equbnG1)9N$2ed zxv-d*w1Ntq;!CKQO}I?~QsphvDIbgGf&>Ec{ExKYUtycQ9ZXu9LYDEiQeW=4+X-D%RCM~&AnE_7y)zGodVT-6bDE-asN_&6 z3eiDi$d;un(Tp{FA-iNNOV$V{rKH7n6lpObOOqw*G-s$ZII?Al#-W*#vhO6{`!i-v zbH3Fdzu)z{et(_6T-RJ?`8=QJxu560@Av!lK_5915{kc5ekP|+Z{v4#9TT! z2h*VbvDi-8XLrkDR>{3(3P*Dx655E47-NiJdZ%~&02Y9t)v|~Bf8sJOx43)e( zUd{%V2Q`CG4F%}aydAJ0{j~@pSNMc7h<_QK; z1eA8_U(OQF{1nBcw%2(%s|b zBWRa_xe{-Tx5p}SJnXswU+uc0($UEY{4rAwyb>li9cx=rQaqjI6O+~=kjOw}xvR6@ zQWskHVE9FV5WnpQ@wO;(#6irZ{p(`5{(J)Q0R;)H#^>_qiN+VI$Dc*ynrc(?izUgp z)C-?Jx(^go;fi^u^=X{V4o9^7nxJA@&HxM0?*jPXx~hU6sDVX|a#(A@=@`HQdr#DI zwL)X5gw_l;Vbv-F_oDag&F|H~Cq9K0RLrO3XW9lP>r1rqOGVh~) z_bb=;Ua}pYu!NjejK=h^FSTDBm?Gk`)nn1=L6i`R)+PV9jaNZbX5dpnOQC-YqD($p z+~DVzeQ!x{D=IJ8>@_$n8y`Nzam zdyi5z7F|d^7U6rEJ{0oIw`GQ(bu)*$C{~GO@uOXwz;o=^W~f94Fp|X_R|ojsINdqK z6(BG|yPda@{G)0^Bww|td_-hk(4&ibuea4@PEVd`vK?<5l>Gzg$ODf>Dx!!ZqyL<+ z&N|KNd!u_*hjNyRg2&fCej~rbgxJ=;E3V|yNilH~6O(OWklqNWCPvq8iV7f1dUi}L zM~nrE^7Dc4$zTo|*ys zu)QsZZ0VcNmdQa*iMgbFRJ29tVWDsnY8i1lRZ+taa)8pLqPw7((oLnz&%AQ?fhzC* zk)z?`x@oF`_o4JyYE7k*6LDtQMjjq2g=$`4RA6Kqr<@S!^^ACTY2Nc9SJ%|G)q27q zPa;MPcJ5!Fva11^;2@Ft(yo``NXe65!!50?y&xAr-uSEk?H2zRylLu3vh39tE960X z^fxmBFx4Hd@$1B zV2S>`(Y)Z_opRt8K+=hGaF$2|CB*@-{cTO-fn8Uk)ge!(h|WJ?ATPiW#b*d}U_0Zu zMW=%N^N{OBy71@bcG_n1LLh@U=VXMz>2;UHN>F4#L|CQ{_?)uEjT1XFgH=o9*YJxd zD2T;!NUZ~Yl02B_;^Vh#?L|v~n!_lIWEtl|M@Xp58Yd^HSN2H0J*EKiu_w(e#&fs? zmK%abF-+?Z_#EjD^Zyz>xQH)`5!5d08=VESR7o$e6ysnFjvitk`2N`GL*p%ee<+@l zD^4i?LM;qz;|3C16hH4LmLWZu+3!dW89HCkSr6$nfpY;Q#5JH~7o4 zSfDGKM0bxK(}%<67Cv=rH*n_h0}1YwixJ3e()D8sHu7>K%6;Ri!5`->nojgQ)!vNU zV~_9NV^e!%qT!G9X`tb#T5C}&2qzpr7H9@jbSZTyt?OHa3b01N$xQ-8uotHw0~rHi zh2ec`s1PzH$lpAvd<8eBQ3?Uk4(D1HTrVrXTi?O0x8*AS01a%aYnn=j+Ed_cDh<7B zY;Z;n3Y?M#|G@rquOv)jJd%eI!q?1jk3{}e3q0BbiEwLg7}r31hu(Hs=_>-{hW-YO zv-s4eZrCw!w{HEBrwhPV7k3GJ8IlOVzjCx=LUp`>?~w~P8!0e3 z73gERKsr@2hYrjAeXFsl&cCClRDCa#4AQ{bX8BZ5;p=b${5vfoabcoCmiAoqauUci zLO!H>QL0sTlj_^~V>rI|E;lEjM-+MYD1u|E2#S)%0Xy?RK(^MC>VAH=84|y~f5r5e zEJim9)@jZrxoowpJ25kOc7iKqSN1n9kS^15U2Ey}?3PU36=+&!Az9l$&i@R83d?%* zh<+MRn%e*y#T%IY_^yl1jX>fNb(UpaV<445+#`ek!Dbxc}VMFh@8sUhX#n(jlTeip`s zCG2_7egK2*^>N|SRGm17`D3=aT3-S)d_7Zh7l$5t=)0^DvQ*qj%h)p-Y+5-G277At zGDU6~+r2RG6ZyWK9yoJ^MWB30{l*A}yA2@jt-T}V+TzAHKY9}PWo8?0zUP-*rEH}* z+-tsBkSG7;vW>VfVbND5|B!b`aO3j9p3F~T{qtx!HaPulWef*vc5vB1ZE32l=tRF3 zLWZGIsafWDd%LCMjxQ|o?}KqlDO~j8(bKONO`*O(t!ZN?^A9(Tom2vT5)2nW$i5mb zJ@JW&32M&Wglh_+JaYK+y7<(bBHl+2wJtwh00WAs=JsSTv24Fi6pej-g^gG69I(-|W zAMkDQTX>=I=|On$TThk#boq-*Hlry7oN=B8`Tn|hXAwSY6sL#@fS)-ld;ap}C82i* z-e$+<9SPubY#C~c;nhq-_D2<|iXMlD*Q(Os;KQ=(UWo;@nFmy^#I3_)&N}d4_s_iz zC%2tIF`!2>j{uv+7q4C%h%@H~QcxBYn+}(@x^X}2AYHIn2Fje=MSPMiBqhhF5NjE@ zthB2jg`~%3P7i%xaFnjI%pbZ`BtX7$Q#%WTlZ>q*r<=f%@chn_sL#=}k*e@~@e&Aj zv9`%1XzK0pV~Adm)x&a@(o=T|<8C^vhL!mcV$*N`o5lsV08pY~HNOtTD_}oiH35e> z_z#vajmR;+l(?7z`*5ny{|ot#{!6~p#Qvw?z<=NVzh*A}W9Zr$_-wYQ=fJWRNyPY| z7^vePte|OD=n@@De>Mj!w+;MY8h1HFzQlY1q3LM+MnI&IgjpM1<9IYNYqqzz-eCq!{*w z@jBu4vcf1ttzmuFsh^_=%`qrHU-Prop1RZK#HorJlvH#x7(Skn&iHVa40-R_N89G;*i z8e?#nWUZv>c5{o!d37MyBe3dFbfweNpDN%2TtQU&G-CU`dy4&)^%9xkBFIw?xC9lq zS-WQW0LKyG3Wp5dK39|cmqLeS-#j)|CV6?OZ#fwlP`HQUwv}qYikL9Lnxz4AS!F2a zF7@6GpNUXs*bsLNR8KY~!qWyoQyu8FT3%rRNf3d2gI!vfmQUI@&_gM9zib=1G>tsB zfDF{!4f*IR1vbS8MhLU^AZ2lK!t0!$kz9VOM7&D;M3c3@jMkfjd)D8OHmfD95v~kc z+t-L9qKp!n*O;!-W+ExCZ6Od~?F3vOKL8%PilZ`v3J7wDLEOwp<>`kE$Mg7r6PXbU zxt&t4ZtY*yQi?ZH?nlvCHg11j*YI$+>~haM{gyoVuukZM`o;S9_wx#`!4SLgo!`*6 z3lwfts7GWC!xI=jObhOIVCxGL+ou#TXwtGN3~n|Jbh?Cq!DiB$y)kz*KhHTEca^@w z08jwGQQ|0Zw4uKK8bUiK*rK?CNZ4%?;njHlV$E!_{+n>)sAee|-<- z!<^B)32MA~(9+TLSnzI{8-GKfJdRq$z99QM>8h&2!|-{(%RPwn1$Op&2Z3>4J5A+| z(QUpJG`>+mB3QLS0BQ*?xubCrRE@A1FK2QiN96L-EDfgC*iBNG958$ybUpxrPudUL zsX>U3HVVoHS-G~a{a>h4lyqK|HaUu(fOdN*7|-so!JfGc+8USk9MiKrY$XM>ckjXo z^6NF`ZYg-QqFmN;AV*3{{2;qfFq`E`j(oeS4xZ*anR^DSBD?U8*D^A=iZ{Rl)Vh*& z4ctwic6b94-rh>J?K;n7tI+R2D8mAQw%TEdmaWaRz-0*-?v0t-YDEW0m|nJk^H}$s zAtg^$p2I|0)rse#v};(IgSN`rq5)m=@$yY$DP`86SsFYVYF>WdA}{5(PEBABhh_N$ z?Ij-xldiBeq8vQ;>qEHTznD5AoiKn>^nOJpR43mkG|TFH_GzJ$m;!Z+n0j^)S;&bk z-5UfQZgFRu)!hSJzJ}TRW7a(6)aM@r#E!1{@@u@Kb_Fn(k>W(0BTqjHLPVT`$=Vgp zC>!by0M#!XQmoj-d?6ix%3!6JWIUbV%)TU;!lw1&vp+Jy$UHzUm1y0!gUMDtzY%^1 zrkiTdeBlK0^bH+>92Ap7Zwlyo-Cu9?{>*&A2!=LYe^oM_+6|w(4Fk(^r)y$Z)C%T( z-ydt?$iw4tYa^4_tP{ru&NMGSS>_AM`vKrA!e#y=lLWsL4hDCU3`dw~_#Y(ThZ|)@ zVVL1@13V?fGO376V7~Czzk~7bU?5ZQ-f(- F{U0fKVS)ev diff --git a/test/image/mocks/point-selection.json b/test/image/mocks/point-selection.json index 47529ae6921..d7f6f2c2139 100644 --- a/test/image/mocks/point-selection.json +++ b/test/image/mocks/point-selection.json @@ -13,7 +13,8 @@ "selectedpoints": [1, 2, 3], "selected": { "marker": { - "color": "blue" + "color": "blue", + "size": 20 } }, "unselected": { From 54cc67bf4dcc33da28d44cf2fae68643f4bf0961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 15 Nov 2017 14:50:45 -0500 Subject: [PATCH 21/43] make hover AND select use same event data pipeline --- src/components/fx/helpers.js | 46 +++++++++++++++++++++++++++++++++++ src/components/fx/hover.js | 21 +--------------- src/plots/cartesian/select.js | 10 +++----- 3 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/components/fx/helpers.js b/src/components/fx/helpers.js index fd005f52824..bc33eb1bef5 100644 --- a/src/components/fx/helpers.js +++ b/src/components/fx/helpers.js @@ -85,6 +85,52 @@ exports.quadrature = function quadrature(dx, dy) { }; }; +/** Fill event data point object for hover and selection. + * Invokes _module.eventData if present. + * + * N.B. note that point 'index' corresponds to input data array index + * whereas 'number' is its post-transform version. + * + * If the hovered/selected pt corresponds to an multiple input points + * (e.g. for histogram and transformed traces), 'pointNumbers` and 'pointIndices' + * are include in the event data. + * + * @param {object} pt + * @param {object} trace + * @param {object} cd + * @return {object} + */ +exports.makeEventData = function makeEventData(pt, trace, cd) { + // hover uses 'index', select uses 'pointNumber' + var pointNumber = 'index' in pt ? pt.index : pt.pointNumber; + + var out = { + data: trace._input, + fullData: trace, + curveNumber: trace.index, + pointNumber: pointNumber + }; + + + if(trace._module.eventData) { + out = trace._module.eventData(out, pt, trace, cd, pointNumber); + } else { + if('xVal' in pt) out.x = pt.xVal; + else if('x' in pt) out.x = pt.x; + + if('yVal' in pt) out.y = pt.yVal; + else if('y' in pt) out.y = pt.y; + + if(pt.xa) out.xaxis = pt.xa; + if(pt.ya) out.yaxis = pt.ya; + if(pt.zLabelVal !== undefined) out.z = pt.zLabelVal; + } + + exports.appendArrayPointValue(out, trace, pointNumber); + + return out; +}; + /** Appends values inside array attributes corresponding to given point number * * @param {object} pointData : point data object (gets mutated here) diff --git a/src/components/fx/hover.js b/src/components/fx/hover.js index 37d80fbc126..3df5fd605ae 100644 --- a/src/components/fx/hover.js +++ b/src/components/fx/hover.js @@ -417,26 +417,7 @@ function _hover(gd, evt, subplot, noHoverEvent) { // other people and send it to the event for(itemnum = 0; itemnum < hoverData.length; itemnum++) { var pt = hoverData[itemnum]; - - var out = { - data: pt.trace._input, - fullData: pt.trace, - curveNumber: pt.trace.index, - pointNumber: pt.index - }; - - if(pt.trace._module.eventData) out = pt.trace._module.eventData(out, pt); - else { - out.x = pt.xVal; - out.y = pt.yVal; - out.xaxis = pt.xa; - out.yaxis = pt.ya; - - if(pt.zLabelVal !== undefined) out.z = pt.zLabelVal; - } - - helpers.appendArrayPointValue(out, pt.trace, pt.index); - newhoverdata.push(out); + newhoverdata.push(helpers.makeEventData(pt, pt.trace, pt.cd)); } gd._hoverdata = newhoverdata; diff --git a/src/plots/cartesian/select.js b/src/plots/cartesian/select.js index bae4c0315f6..b789f40f23e 100644 --- a/src/plots/cartesian/select.js +++ b/src/plots/cartesian/select.js @@ -13,7 +13,7 @@ var polybool = require('polybooljs'); var polygon = require('../../lib/polygon'); var throttle = require('../../lib/throttle'); var color = require('../../components/color'); -var appendArrayPointValue = require('../../components/fx/helpers').appendArrayPointValue; +var makeEventData = require('../../components/fx/helpers').makeEventData; var axes = require('./axes'); var constants = require('./constants'); @@ -355,15 +355,11 @@ function mergePolygons(list, poly, subtract) { function fillSelectionItem(selection, searchInfo) { if(Array.isArray(selection)) { + var cd = searchInfo.cd; var trace = searchInfo.cd[0].trace; for(var i = 0; i < selection.length; i++) { - var sel = selection[i]; - - sel.curveNumber = trace.index; - sel.data = trace._input; - sel.fullData = trace; - appendArrayPointValue(sel, trace, sel.pointNumber); + selection[i] = makeEventData(selection[i], trace, cd); } } From 638d03db45d0f00bff2f0666b782185d0e861095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 15 Nov 2017 14:52:54 -0500 Subject: [PATCH 22/43] adapt Histogram.eventData so that it works with selection pts --- src/traces/histogram/event_data.js | 24 +++++++++++++----------- src/traces/histogram/hover.js | 1 - src/traces/histogram2d/hover.js | 1 - 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/traces/histogram/event_data.js b/src/traces/histogram/event_data.js index 7c39678087d..7a963336aee 100644 --- a/src/traces/histogram/event_data.js +++ b/src/traces/histogram/event_data.js @@ -6,21 +6,23 @@ * LICENSE file in the root directory of this source tree. */ - 'use strict'; - -module.exports = function eventData(out, pt) { +module.exports = function eventData(out, pt, trace, cd, pointNumber) { // standard cartesian event data - out.x = pt.xVal; - out.y = pt.yVal; - out.xaxis = pt.xa; - out.yaxis = pt.ya; + out.x = 'xVal' in pt ? pt.xVal : pt.x; + out.y = 'yVal' in pt ? pt.yVal : pt.y; + + if(pt.xa) out.xaxis = pt.xa; + if(pt.ya) out.yaxis = pt.ya; + + // specific to histogram - CDFs do not have pts (yet?) + if(!(trace.cumulative || {}).enabled) { + var pts = Array.isArray(pointNumber) ? + cd[0].pts[pointNumber[0]][pointNumber[1]] : + cd[pointNumber].pts; - // specific to histogram - // CDFs do not have pts (yet?) - if(pt.pts) { - out.pointNumbers = pt.pts; + out.pointNumbers = pts; out.binNumber = out.pointNumber; delete out.pointNumber; } diff --git a/src/traces/histogram/hover.js b/src/traces/histogram/hover.js index 5bfe0317840..6fe0b2222b3 100644 --- a/src/traces/histogram/hover.js +++ b/src/traces/histogram/hover.js @@ -25,7 +25,6 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { var posLetter = trace.orientation === 'h' ? 'y' : 'x'; pointData[posLetter + 'Label'] = hoverLabelText(pointData[posLetter + 'a'], di.p0, di.p1); - pointData.pts = di.pts; } return pts; diff --git a/src/traces/histogram2d/hover.js b/src/traces/histogram2d/hover.js index ccce7d3d712..73bad554923 100644 --- a/src/traces/histogram2d/hover.js +++ b/src/traces/histogram2d/hover.js @@ -27,7 +27,6 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay pointData.xLabel = hoverLabelText(pointData.xa, xRange[0], xRange[1]); pointData.yLabel = hoverLabelText(pointData.ya, yRange[0], yRange[1]); - pointData.pts = cd0.pts[ny][nx]; return pts; }; From b30fab46a7fb8812d464c2da324167e0cf94ba18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 15 Nov 2017 14:54:33 -0500 Subject: [PATCH 23/43] add Scattercarpet.eventData method - :hocho: its select method and reuse Scatter.select instead which is much DRYer. --- src/traces/scattercarpet/event_data.js | 18 +++++++++++++++ src/traces/scattercarpet/index.js | 3 ++- src/traces/scattercarpet/select.js | 32 -------------------------- 3 files changed, 20 insertions(+), 33 deletions(-) create mode 100644 src/traces/scattercarpet/event_data.js delete mode 100644 src/traces/scattercarpet/select.js diff --git a/src/traces/scattercarpet/event_data.js b/src/traces/scattercarpet/event_data.js new file mode 100644 index 00000000000..829dcdaef20 --- /dev/null +++ b/src/traces/scattercarpet/event_data.js @@ -0,0 +1,18 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +module.exports = function eventData(out, pt, trace, cd, pointNumber) { + var cdi = cd[pointNumber]; + + out.a = cdi.a; + out.b = cdi.b; + + return out; +}; diff --git a/src/traces/scattercarpet/index.js b/src/traces/scattercarpet/index.js index a5d84296fd1..c7633f1f4f5 100644 --- a/src/traces/scattercarpet/index.js +++ b/src/traces/scattercarpet/index.js @@ -17,7 +17,8 @@ ScatterCarpet.calc = require('./calc'); ScatterCarpet.plot = require('./plot'); ScatterCarpet.style = require('./style'); ScatterCarpet.hoverPoints = require('./hover'); -ScatterCarpet.selectPoints = require('./select'); +ScatterCarpet.selectPoints = require('../scatter/select'); +ScatterCarpet.eventData = require('./event_data'); ScatterCarpet.moduleType = 'trace'; ScatterCarpet.name = 'scattercarpet'; diff --git a/src/traces/scattercarpet/select.js b/src/traces/scattercarpet/select.js deleted file mode 100644 index ff40c61a271..00000000000 --- a/src/traces/scattercarpet/select.js +++ /dev/null @@ -1,32 +0,0 @@ -/** -* Copyright 2012-2017, Plotly, Inc. -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. -*/ - - -'use strict'; - -var scatterSelect = require('../scatter/select'); - - -module.exports = function selectPoints(searchInfo, polygon) { - var selection = scatterSelect(searchInfo, polygon); - if(!selection) return; - - var cd = searchInfo.cd, - pt, cdi, i; - - for(i = 0; i < selection.length; i++) { - pt = selection[i]; - cdi = cd[pt.pointNumber]; - pt.a = cdi.a; - pt.b = cdi.b; - delete pt.x; - delete pt.y; - } - - return selection; -}; From 949b311f81b46caf1fad77139e13ab1d9369a461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 15 Nov 2017 14:56:25 -0500 Subject: [PATCH 24/43] add ScatterTernary.eventData method - :hocho: is select method, reuse Scatter.select instead - using same event-data pipeline for hover and select revealed an inconsistency: hover data includes the raw input coords whereas selection data includes the scaled coords (as in calcdata). --- src/traces/scatterternary/event_data.js | 37 +++++++++++++++++++++++++ src/traces/scatterternary/index.js | 3 +- src/traces/scatterternary/select.js | 33 ---------------------- 3 files changed, 39 insertions(+), 34 deletions(-) create mode 100644 src/traces/scatterternary/event_data.js delete mode 100644 src/traces/scatterternary/select.js diff --git a/src/traces/scatterternary/event_data.js b/src/traces/scatterternary/event_data.js new file mode 100644 index 00000000000..5ded7380d59 --- /dev/null +++ b/src/traces/scatterternary/event_data.js @@ -0,0 +1,37 @@ +/** +* Copyright 2012-2017, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +'use strict'; + +module.exports = function eventData(out, pt, trace, cd, pointNumber) { + if(pt.xa) out.xaxis = pt.xa; + if(pt.ya) out.yaxis = pt.ya; + + if(cd[pointNumber]) { + var cdi = cd[pointNumber]; + + // N.B. These are the scale coordinates !!! + // + // On master, hover events get the non-scaled coordinates + // whereas selection events get the scaled version. + // Note also that the hover labels show the scaled version. + // + // What about the 'raw' input coordinates? + // Should we include them in parallel here or replace a/b/c with them? + out.a = cdi.a; + out.b = cdi.b; + out.c = cdi.c; + } else { + // for fill-hover only + out.a = pt.a; + out.b = pt.b; + out.c = pt.c; + } + + return out; +}; diff --git a/src/traces/scatterternary/index.js b/src/traces/scatterternary/index.js index abbdc7f06b1..781cf0c10fe 100644 --- a/src/traces/scatterternary/index.js +++ b/src/traces/scatterternary/index.js @@ -17,7 +17,8 @@ ScatterTernary.calc = require('./calc'); ScatterTernary.plot = require('./plot'); ScatterTernary.style = require('./style'); ScatterTernary.hoverPoints = require('./hover'); -ScatterTernary.selectPoints = require('./select'); +ScatterTernary.selectPoints = require('../scatter/select'); +ScatterTernary.eventData = require('./event_data'); ScatterTernary.moduleType = 'trace'; ScatterTernary.name = 'scatterternary'; diff --git a/src/traces/scatterternary/select.js b/src/traces/scatterternary/select.js deleted file mode 100644 index 5682b0e1669..00000000000 --- a/src/traces/scatterternary/select.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* Copyright 2012-2017, Plotly, Inc. -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. -*/ - - -'use strict'; - -var scatterSelect = require('../scatter/select'); - - -module.exports = function selectPoints(searchInfo, polygon) { - var selection = scatterSelect(searchInfo, polygon); - if(!selection) return; - - var cd = searchInfo.cd, - pt, cdi, i; - - for(i = 0; i < selection.length; i++) { - pt = selection[i]; - cdi = cd[pt.pointNumber]; - pt.a = cdi.a; - pt.b = cdi.b; - pt.c = cdi.c; - delete pt.x; - delete pt.y; - } - - return selection; -}; From 315e6327bbd512b20cec61e651f6bb945c1521d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 15 Nov 2017 15:04:00 -0500 Subject: [PATCH 25/43] add Lib.tagSelected made to make selectedpoints work w/ transforms - tagSelected make heavy use of the transforms _indexToPoints map object to determine how input index (called pointIndex) are mapped to calcdata index (called pointNumber). - use pointIndex (not pointNumber) while filling up selectedpoints array to match input indices. - Use tagSelected in scatter, box, and histogram calcSelection methods taking care of all trace types that support selections. --- src/lib/index.js | 51 ++++++++++++++++++++++++++++ src/plots/cartesian/select.js | 25 +++++++------- src/plots/plots.js | 16 ++++++++- src/traces/box/calc.js | 13 +++---- src/traces/histogram/calc.js | 18 ++++++++-- src/traces/scatter/calc_selection.js | 18 +++------- 6 files changed, 106 insertions(+), 35 deletions(-) diff --git a/src/lib/index.js b/src/lib/index.js index b34099227d6..3a34443d06d 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -465,6 +465,57 @@ lib.extractOption = function(calcPt, trace, calcKey, traceKey) { if(!Array.isArray(traceVal)) return traceVal; }; +/** Tag selected calcdata items + * + * N.B. note that point 'index' corresponds to input data array index + * whereas 'number' is its post-transform version. + * + * @param {array} calcTrace + * @param {object} trace + * - selectedpoints {array} + * - _indexToPoints {object} + * @param {ptNumber2cdIndex} ptNumber2cdIndex (optional) + * optional map object for trace types that do not have 1-to-1 point number to + * calcdata item index correspondence (e.g. histogram) + */ +lib.tagSelected = function(calcTrace, trace, ptNumber2cdIndex) { + var selectedpoints = trace.selectedpoints; + var indexToPoints = trace._indexToPoints; + var ptIndex2ptNumber; + + // make pt index-to-number map object, which takes care of transformed traces + if(indexToPoints) { + ptIndex2ptNumber = {}; + for(var k in indexToPoints) { + var pts = indexToPoints[k]; + for(var j = 0; j < pts.length; j++) { + ptIndex2ptNumber[pts[j]] = k; + } + } + } + + function isPtIndexValid(v) { + return lib.validate(v, {valType: 'integer', min: 0}); + } + + function isCdIndexValid(v) { + return v !== undefined && v < calcTrace.length; + } + + for(var i = 0; i < selectedpoints.length; i++) { + var ptIndex = selectedpoints[i]; + + if(isPtIndexValid(ptIndex)) { + var ptNumber = ptIndex2ptNumber ? ptIndex2ptNumber[ptIndex] : ptIndex; + var cdIndex = ptNumber2cdIndex ? ptNumber2cdIndex[ptNumber] : ptNumber; + + if(isCdIndexValid(cdIndex)) { + calcTrace[cdIndex].selected = 1; + } + } + } +}; + /** Returns target as set by 'target' transform attribute * * @param {object} trace : full trace object diff --git a/src/plots/cartesian/select.js b/src/plots/cartesian/select.js index b789f40f23e..353ba900735 100644 --- a/src/plots/cartesian/select.js +++ b/src/plots/cartesian/select.js @@ -240,9 +240,7 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { traceSelection = searchInfo.selectPoints(searchInfo, testPoly); traceSelections.push(traceSelection); - var thisSelection = fillSelectionItem( - traceSelection, searchInfo - ); + var thisSelection = fillSelectionItem(traceSelection, searchInfo); if(selection.length) { for(var j = 0; j < thisSelection.length; j++) { selection.push(thisSelection[j]); @@ -294,30 +292,31 @@ module.exports = function prepSelect(e, startX, startY, dragOptions, mode) { }; function updateSelectedState(gd, searchTraces, eventData) { - var i, searchInfo; + var i, searchInfo, trace; if(eventData) { var pts = eventData.points || []; for(i = 0; i < searchTraces.length; i++) { - searchInfo = searchTraces[i]; - searchInfo.cd[0].trace.selectedpoints = []; - searchInfo.cd[0].trace._input.selectedpoints = []; + trace = searchTraces[i].cd[0].trace; + trace.selectedpoints = []; + trace._input.selectedpoints = []; } for(i = 0; i < pts.length; i++) { var pt = pts[i]; - var ptNumber = pt.pointNumber; + var data = pt.data; + var fullData = pt.fullData; - pt.data.selectedpoints.push(ptNumber); - pt.fullData.selectedpoints.push(ptNumber); + data.selectedpoints.push(pt.pointIndex); + fullData.selectedpoints.push(pt.pointIndex); } } else { for(i = 0; i < searchTraces.length; i++) { - searchInfo = searchTraces[i]; - delete searchInfo.cd[0].trace.selectedpoints; - delete searchInfo.cd[0].trace._input.selectedpoints; + trace = searchTraces[i].cd[0].trace; + delete trace.selectedpoints; + delete trace._input.selectedpoints; } } diff --git a/src/plots/plots.js b/src/plots/plots.js index a666aca97d7..de243c8a1c8 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -2241,7 +2241,21 @@ plots.doCalcdata = function(gd, traces) { if(trace.visible === true) { _module = trace._module; - if(_module && _module.calc) cd = _module.calc(gd, trace); + + // keep ref of index-to-points map object of the *last* enabled transform, + // this index-to-points map object is required to determine the calcdata indices + // that correspond to input indices (e.g. from 'selectedpoints') + var transforms = trace.transforms || []; + for(j = transforms.length - 1; j >= 0; j--) { + if(transforms[j].enabled) { + trace._indexToPoints = transforms[j]._indexToPoints; + break; + } + } + + if(_module && _module.calc) { + cd = _module.calc(gd, trace); + } } // Make sure there is a first point. diff --git a/src/traces/box/calc.js b/src/traces/box/calc.js index 2ded0b06d31..b1ad8c72d84 100644 --- a/src/traces/box/calc.js +++ b/src/traces/box/calc.js @@ -114,6 +114,7 @@ module.exports = function calc(gd, trace) { } } + calcSelection(cd, trace); Axes.expand(valAxis, val, {padded: true}); if(cd.length > 0) { @@ -193,13 +194,13 @@ function arraysToCalcdata(pt, trace, i) { pt[trace2calc[k]] = trace[k][i]; } } +} - var selectedpoints = trace.selectedpoints; - - // TODO this is slow - if(Array.isArray(selectedpoints)) { - if(selectedpoints.indexOf(pt.i) !== -1) { - pt.selected = 1; +function calcSelection(cd, trace) { + if(Array.isArray(trace.selectedpoints)) { + for(var i = 0; i < cd.length; i++) { + var pts = cd[i].pts || []; + Lib.tagSelected(pts, trace); } } } diff --git a/src/traces/histogram/calc.js b/src/traces/histogram/calc.js index 95a80db06b9..9722b0bf00d 100644 --- a/src/traces/histogram/calc.js +++ b/src/traces/histogram/calc.js @@ -15,7 +15,6 @@ var Lib = require('../../lib'); var Axes = require('../../plots/cartesian/axes'); var arraysToCalcdata = require('../bar/arrays_to_calcdata'); -var calcSelection = require('../scatter/calc_selection'); var binFunctions = require('./bin_functions'); var normFunctions = require('./norm_functions'); var doAvg = require('./average'); @@ -23,7 +22,6 @@ var cleanBins = require('./clean_bins'); var oneMonth = require('../../constants/numerical').ONEAVGMONTH; var getBinSpanLabelRound = require('./bin_label_vals'); - module.exports = function calc(gd, trace) { // ignore as much processing as possible (and including in autorange) if bar is not visible if(trace.visible !== true) return; @@ -512,3 +510,19 @@ function cdf(size, direction, currentBin) { } } } + +function calcSelection(cd, trace) { + if(Array.isArray(trace.selectedpoints)) { + var ptNumber2cdIndex = {}; + + // make histogram-specific pt-number-to-cd-index map object + for(var i = 0; i < cd.length; i++) { + var pts = cd[i].pts || []; + for(var j = 0; j < pts.length; j++) { + ptNumber2cdIndex[pts[j]] = i; + } + } + + Lib.tagSelected(cd, trace, ptNumber2cdIndex); + } +} diff --git a/src/traces/scatter/calc_selection.js b/src/traces/scatter/calc_selection.js index ef821498b3b..72279ee31eb 100644 --- a/src/traces/scatter/calc_selection.js +++ b/src/traces/scatter/calc_selection.js @@ -8,20 +8,12 @@ 'use strict'; -var isNumeric = require('fast-isnumeric'); +var Lib = require('../../lib'); -module.exports = function calcSelection(cd, trace) { - var selectedpoints = trace.selectedpoints; - - // TODO ids vs points?? +// TODO ids vs points?? - if(Array.isArray(selectedpoints)) { - for(var i = 0; i < selectedpoints.length; i++) { - var ptNumber = selectedpoints[i]; - - if(isNumeric(ptNumber)) { - cd[+ptNumber].selected = 1; - } - } +module.exports = function calcSelection(cd, trace) { + if(Array.isArray(trace.selectedpoints)) { + Lib.tagSelected(cd, trace); } }; From 9b79b3faa758f69edc36f1f2b12342bd9932fc6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 15 Nov 2017 15:06:05 -0500 Subject: [PATCH 26/43] add support for selection of aggregations - similar to pointNumber and pointNumbers, make the distinction between 1-to-1 input to selection/hovered pt and many-to-1 maps like for histogram traces and aggregation transforms. --- src/components/fx/helpers.js | 11 +++++++++++ src/plots/cartesian/select.js | 9 +++++++-- src/traces/histogram/event_data.js | 13 +++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/components/fx/helpers.js b/src/components/fx/helpers.js index bc33eb1bef5..4474c709613 100644 --- a/src/components/fx/helpers.js +++ b/src/components/fx/helpers.js @@ -111,6 +111,17 @@ exports.makeEventData = function makeEventData(pt, trace, cd) { pointNumber: pointNumber }; + if(trace._indexToPoints) { + var pointIndices = trace._indexToPoints[pointNumber]; + + if(pointIndices.length === 1) { + out.pointIndex = pointIndices[0]; + } else { + out.pointIndices = pointIndices; + } + } else { + out.pointIndex = pointNumber; + } if(trace._module.eventData) { out = trace._module.eventData(out, pt, trace, cd, pointNumber); diff --git a/src/plots/cartesian/select.js b/src/plots/cartesian/select.js index 353ba900735..be7226e5590 100644 --- a/src/plots/cartesian/select.js +++ b/src/plots/cartesian/select.js @@ -308,8 +308,13 @@ function updateSelectedState(gd, searchTraces, eventData) { var data = pt.data; var fullData = pt.fullData; - data.selectedpoints.push(pt.pointIndex); - fullData.selectedpoints.push(pt.pointIndex); + if(pt.pointIndices) { + data.selectedpoints = data.selectedpoints.concat(pt.pointIndices); + fullData.selectedpoints = fullData.selectedpoints.concat(pt.pointIndices); + } else { + data.selectedpoints.push(pt.pointIndex); + fullData.selectedpoints.push(pt.pointIndex); + } } } else { diff --git a/src/traces/histogram/event_data.js b/src/traces/histogram/event_data.js index 7a963336aee..c863695ac63 100644 --- a/src/traces/histogram/event_data.js +++ b/src/traces/histogram/event_data.js @@ -25,6 +25,19 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { out.pointNumbers = pts; out.binNumber = out.pointNumber; delete out.pointNumber; + delete out.pointIndex; + + var pointIndices; + if(trace._indexToPoints) { + pointIndices = []; + for(var i = 0; i < pts.length; i++) { + pointIndices = pointIndices.concat(trace._indexToPoints[pts[i]]); + } + } else { + pointIndices = pts; + } + + out.pointIndices = pointIndices; } return out; From 92102788e6dc0f95b10424205032798429f65296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 15 Nov 2017 15:06:16 -0500 Subject: [PATCH 27/43] update point-selection baseline --- test/image/baselines/point-selection.png | Bin 28115 -> 28216 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/image/baselines/point-selection.png b/test/image/baselines/point-selection.png index f161239eaae9d3dad05e8bd0268e3baf20381e51..396cf75cad1016e97425ee42043ae866d1d7ae31 100644 GIT binary patch literal 28216 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�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 Date: Wed, 15 Nov 2017 15:06:36 -0500 Subject: [PATCH 28/43] update event-data jasmine tests (mostly adding pointIndex) --- test/jasmine/tests/click_test.js | 10 ++++----- test/jasmine/tests/geo_test.js | 24 +++++++++++--------- test/jasmine/tests/mapbox_test.js | 6 ++--- test/jasmine/tests/scattermapbox_test.js | 8 +++---- test/jasmine/tests/select_test.js | 13 +++++++++++ test/jasmine/tests/ternary_test.js | 28 +++++++++--------------- 6 files changed, 49 insertions(+), 40 deletions(-) diff --git a/test/jasmine/tests/click_test.js b/test/jasmine/tests/click_test.js index deb54b228f4..0841b5ce895 100644 --- a/test/jasmine/tests/click_test.js +++ b/test/jasmine/tests/click_test.js @@ -86,7 +86,7 @@ describe('Test click interactions:', function() { var pt = futureData.points[0]; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'x', 'y', 'xaxis', 'yaxis' ]); expect(pt.curveNumber).toEqual(0); @@ -128,7 +128,7 @@ describe('Test click interactions:', function() { var pt = futureData.points[0]; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'x', 'y', 'xaxis', 'yaxis' ]); expect(pt.curveNumber).toEqual(0); @@ -208,7 +208,7 @@ describe('Test click interactions:', function() { var pt = futureData.points[0]; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'x', 'y', 'xaxis', 'yaxis' ]); expect(pt.curveNumber).toEqual(0); @@ -239,7 +239,7 @@ describe('Test click interactions:', function() { var pt = futureData.points[0]; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'x', 'y', 'xaxis', 'yaxis' ]); expect(pt.curveNumber).toEqual(0); @@ -274,7 +274,7 @@ describe('Test click interactions:', function() { var pt = futureData.points[0]; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'x', 'y', 'xaxis', 'yaxis' ]); expect(pt.curveNumber).toEqual(0); diff --git a/test/jasmine/tests/geo_test.js b/test/jasmine/tests/geo_test.js index bca4661146e..51f8b1e901a 100644 --- a/test/jasmine/tests/geo_test.js +++ b/test/jasmine/tests/geo_test.js @@ -569,7 +569,7 @@ describe('Test geo interactions', function() { it('should contain the correct fields', function() { expect(Object.keys(ptData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'lon', 'lat', 'location', 'marker.size' ]); expect(cnt).toEqual(1); @@ -632,7 +632,7 @@ describe('Test geo interactions', function() { it('should contain the correct fields', function() { expect(Object.keys(ptData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'lon', 'lat', 'location', 'marker.size' ]); }); @@ -664,7 +664,7 @@ describe('Test geo interactions', function() { it('should contain the correct fields', function() { expect(Object.keys(ptData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'lon', 'lat', 'location', 'marker.size' ]); }); @@ -693,7 +693,7 @@ describe('Test geo interactions', function() { it('should contain the correct fields', function() { expect(Object.keys(ptData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'location', 'z' ]); }); @@ -721,7 +721,7 @@ describe('Test geo interactions', function() { it('should contain the correct fields', function() { expect(Object.keys(ptData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'location', 'z' ]); }); @@ -753,7 +753,7 @@ describe('Test geo interactions', function() { it('should contain the correct fields', function() { expect(Object.keys(ptData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'location', 'z' ]); }); @@ -1303,7 +1303,8 @@ describe('Test event property of interactions on a geo plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', + 'lon', 'lat', 'location', 'text', 'marker.size' ]); @@ -1351,7 +1352,8 @@ describe('Test event property of interactions on a geo plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', + 'lon', 'lat', 'location', 'text', 'marker.size' ]); @@ -1392,7 +1394,8 @@ describe('Test event property of interactions on a geo plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', + 'lon', 'lat', 'location', 'text', 'marker.size' ]); @@ -1428,7 +1431,8 @@ describe('Test event property of interactions on a geo plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', + 'lon', 'lat', 'location', 'text', 'marker.size' ]); diff --git a/test/jasmine/tests/mapbox_test.js b/test/jasmine/tests/mapbox_test.js index ae7ec7a9cf3..68590653f1f 100644 --- a/test/jasmine/tests/mapbox_test.js +++ b/test/jasmine/tests/mapbox_test.js @@ -768,7 +768,7 @@ describe('@noCI, mapbox plots', function() { return _mouseEvent('mousemove', pointPos, function() { expect(hoverData).not.toBe(undefined, 'firing on data points'); expect(Object.keys(hoverData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat' + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'lon', 'lat' ], 'returning the correct event data keys'); expect(hoverData.curveNumber).toEqual(0, 'returning the correct curve number'); expect(hoverData.pointNumber).toEqual(0, 'returning the correct point number'); @@ -778,7 +778,7 @@ describe('@noCI, mapbox plots', function() { return _mouseEvent('mousemove', blankPos, function() { expect(unhoverData).not.toBe(undefined, 'firing on data points'); expect(Object.keys(unhoverData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat' + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'lon', 'lat' ], 'returning the correct event data keys'); expect(unhoverData.curveNumber).toEqual(0, 'returning the correct curve number'); expect(unhoverData.pointNumber).toEqual(0, 'returning the correct point number'); @@ -859,7 +859,7 @@ describe('@noCI, mapbox plots', function() { return _click(pointPos, function() { expect(ptData).not.toBe(undefined, 'firing on data points'); expect(Object.keys(ptData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat' + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'lon', 'lat' ], 'returning the correct event data keys'); expect(ptData.curveNumber).toEqual(0, 'returning the correct curve number'); expect(ptData.pointNumber).toEqual(0, 'returning the correct point number'); diff --git a/test/jasmine/tests/scattermapbox_test.js b/test/jasmine/tests/scattermapbox_test.js index f4efc19421b..729b4cd6abc 100644 --- a/test/jasmine/tests/scattermapbox_test.js +++ b/test/jasmine/tests/scattermapbox_test.js @@ -697,7 +697,7 @@ describe('@noCI Test plotly events on a scattermapbox plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat' + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'lon', 'lat' ]); expect(pt.curveNumber).toEqual(0, 'points[0].curveNumber'); @@ -741,7 +741,7 @@ describe('@noCI Test plotly events on a scattermapbox plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat' + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'lon', 'lat' ]); expect(pt.curveNumber).toEqual(0, 'points[0].curveNumber'); @@ -778,7 +778,7 @@ describe('@noCI Test plotly events on a scattermapbox plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat' + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'lon', 'lat' ]); expect(pt.curveNumber).toEqual(0, 'points[0].curveNumber'); @@ -810,7 +810,7 @@ describe('@noCI Test plotly events on a scattermapbox plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'lon', 'lat' + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'lon', 'lat' ]); expect(pt.curveNumber).toEqual(0, 'points[0].curveNumber'); diff --git a/test/jasmine/tests/select_test.js b/test/jasmine/tests/select_test.js index 196d99a6d74..31f26d2b408 100644 --- a/test/jasmine/tests/select_test.js +++ b/test/jasmine/tests/select_test.js @@ -162,6 +162,7 @@ describe('Test select box and lasso in general:', function() { assertEventData(selectedData.points, [{ curveNumber: 0, pointNumber: 0, + pointIndex: 0, x: 0.002, y: 16.25, id: 'id-0.002', @@ -169,6 +170,7 @@ describe('Test select box and lasso in general:', function() { }, { curveNumber: 0, pointNumber: 1, + pointIndex: 1, x: 0.004, y: 12.5, id: 'id-0.004', @@ -199,6 +201,7 @@ describe('Test select box and lasso in general:', function() { assertEventData(selectingData.points, [{ curveNumber: 0, pointNumber: 0, + pointIndex: 0, x: 0.002, y: 16.25, id: 'id-0.002', @@ -206,6 +209,7 @@ describe('Test select box and lasso in general:', function() { }, { curveNumber: 0, pointNumber: 1, + pointIndex: 1, x: 0.004, y: 12.5, id: 'id-0.004', @@ -225,6 +229,7 @@ describe('Test select box and lasso in general:', function() { assertEventData(selectingData.points, [{ curveNumber: 0, pointNumber: 0, + pointIndex: 0, x: 0.002, y: 16.25, id: 'id-0.002', @@ -232,6 +237,7 @@ describe('Test select box and lasso in general:', function() { }, { curveNumber: 0, pointNumber: 1, + pointIndex: 1, x: 0.004, y: 12.5, id: 'id-0.004', @@ -239,6 +245,7 @@ describe('Test select box and lasso in general:', function() { }, { curveNumber: 0, pointNumber: 4, + pointIndex: 4, x: 0.013, y: 6.875, id: 'id-0.013', @@ -252,6 +259,7 @@ describe('Test select box and lasso in general:', function() { assertEventData(selectingData.points, [{ curveNumber: 0, pointNumber: 0, + pointIndex: 0, x: 0.002, y: 16.25, id: 'id-0.002', @@ -259,6 +267,7 @@ describe('Test select box and lasso in general:', function() { }, { curveNumber: 0, pointNumber: 1, + pointIndex: 1, x: 0.004, y: 12.5, id: 'id-0.004', @@ -299,6 +308,7 @@ describe('Test select box and lasso in general:', function() { assertEventData(selectingData.points, [{ curveNumber: 0, pointNumber: 10, + pointIndex: 10, x: 0.099, y: 2.75 }], 'with the correct selecting points (1)'); @@ -307,6 +317,7 @@ describe('Test select box and lasso in general:', function() { assertEventData(selectedData.points, [{ curveNumber: 0, pointNumber: 10, + pointIndex: 10, x: 0.099, y: 2.75, }], 'with the correct selected points (2)'); @@ -374,6 +385,7 @@ describe('Test select box and lasso in general:', function() { assertEventData(selectingData.points, [{ curveNumber: 0, pointNumber: 10, + pointIndex: 10, x: 0.099, y: 2.75 }], 'with the correct selecting points (1)'); @@ -382,6 +394,7 @@ describe('Test select box and lasso in general:', function() { assertEventData(selectedData.points, [{ curveNumber: 0, pointNumber: 10, + pointIndex: 10, x: 0.099, y: 2.75, }], 'with the correct selected points (2)'); diff --git a/test/jasmine/tests/ternary_test.js b/test/jasmine/tests/ternary_test.js index 45a4ee75c86..780994cce37 100644 --- a/test/jasmine/tests/ternary_test.js +++ b/test/jasmine/tests/ternary_test.js @@ -184,8 +184,8 @@ describe('ternary plots', function() { mouseEvent('mousemove', pointPos[0], pointPos[1]); expect(hoverData).not.toBe(undefined, 'firing on data points'); expect(Object.keys(hoverData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', - 'x', 'y', 'xaxis', 'yaxis', 'a', 'b', 'c' + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', + 'xaxis', 'yaxis', 'a', 'b', 'c' ], 'returning the correct event data keys'); expect(hoverData.curveNumber).toEqual(0, 'returning the correct curve number'); expect(hoverData.pointNumber).toEqual(0, 'returning the correct point number'); @@ -193,8 +193,8 @@ describe('ternary plots', function() { mouseEvent('mouseout', pointPos[0], pointPos[1]); expect(unhoverData).not.toBe(undefined, 'firing on data points'); expect(Object.keys(unhoverData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', - 'x', 'y', 'xaxis', 'yaxis', 'a', 'b', 'c' + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', + 'xaxis', 'yaxis', 'a', 'b', 'c' ], 'returning the correct event data keys'); expect(unhoverData.curveNumber).toEqual(0, 'returning the correct curve number'); expect(unhoverData.pointNumber).toEqual(0, 'returning the correct point number'); @@ -216,8 +216,8 @@ describe('ternary plots', function() { click(pointPos[0], pointPos[1]); expect(ptData).not.toBe(undefined, 'firing on data points'); expect(Object.keys(ptData)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', - 'x', 'y', 'xaxis', 'yaxis', 'a', 'b', 'c' + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', + 'xaxis', 'yaxis', 'a', 'b', 'c' ], 'returning the correct event data keys'); expect(ptData.curveNumber).toEqual(0, 'returning the correct curve number'); expect(ptData.pointNumber).toEqual(0, 'returning the correct point number'); @@ -491,7 +491,7 @@ describe('Test event property of interactions on a ternary plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'x', 'y', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'xaxis', 'yaxis', 'a', 'b', 'c' ]); @@ -499,8 +499,6 @@ describe('Test event property of interactions on a ternary plot:', function() { expect(typeof pt.data).toEqual(typeof {}, 'points[0].data'); expect(typeof pt.fullData).toEqual(typeof {}, 'points[0].fullData'); expect(pt.pointNumber).toEqual(0, 'points[0].pointNumber'); - expect(pt.x).toEqual(undefined, 'points[0].x'); - expect(pt.y).toEqual(undefined, 'points[0].y'); expect(typeof pt.xaxis).toEqual(typeof {}, 'points[0].xaxis'); expect(typeof pt.yaxis).toEqual(typeof {}, 'points[0].yaxis'); expect(pt.a).toEqual(2, 'points[0].a'); @@ -541,7 +539,7 @@ describe('Test event property of interactions on a ternary plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'x', 'y', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'xaxis', 'yaxis', 'a', 'b', 'c' ]); @@ -549,8 +547,6 @@ describe('Test event property of interactions on a ternary plot:', function() { expect(typeof pt.data).toEqual(typeof {}, 'points[0].data'); expect(typeof pt.fullData).toEqual(typeof {}, 'points[0].fullData'); expect(pt.pointNumber).toEqual(0, 'points[0].pointNumber'); - expect(pt.x).toEqual(undefined, 'points[0].x'); - expect(pt.y).toEqual(undefined, 'points[0].y'); expect(typeof pt.xaxis).toEqual(typeof {}, 'points[0].xaxis'); expect(typeof pt.yaxis).toEqual(typeof {}, 'points[0].yaxis'); expect(pt.a).toEqual(2, 'points[0].a'); @@ -588,7 +584,7 @@ describe('Test event property of interactions on a ternary plot:', function() { yvals0 = futureData.yvals[0]; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'x', 'y', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'xaxis', 'yaxis', 'a', 'b', 'c' ]); @@ -596,8 +592,6 @@ describe('Test event property of interactions on a ternary plot:', function() { expect(typeof pt.data).toEqual(typeof {}, 'points[0].data'); expect(typeof pt.fullData).toEqual(typeof {}, 'points[0].fullData'); expect(pt.pointNumber).toEqual(0, 'points[0].pointNumber'); - expect(pt.x).toEqual(undefined, 'points[0].x'); - expect(pt.y).toEqual(undefined, 'points[0].y'); expect(typeof pt.xaxis).toEqual(typeof {}, 'points[0].xaxis'); expect(typeof pt.yaxis).toEqual(typeof {}, 'points[0].yaxis'); expect(pt.a).toEqual(2, 'points[0].a'); @@ -634,7 +628,7 @@ describe('Test event property of interactions on a ternary plot:', function() { evt = futureData.event; expect(Object.keys(pt)).toEqual([ - 'data', 'fullData', 'curveNumber', 'pointNumber', 'x', 'y', + 'data', 'fullData', 'curveNumber', 'pointNumber', 'pointIndex', 'xaxis', 'yaxis', 'a', 'b', 'c' ]); @@ -642,8 +636,6 @@ describe('Test event property of interactions on a ternary plot:', function() { expect(typeof pt.data).toEqual(typeof {}, 'points[0].data'); expect(typeof pt.fullData).toEqual(typeof {}, 'points[0].fullData'); expect(pt.pointNumber).toEqual(0, 'points[0].pointNumber'); - expect(pt.x).toEqual(undefined, 'points[0].x'); - expect(pt.y).toEqual(undefined, 'points[0].y'); expect(typeof pt.xaxis).toEqual(typeof {}, 'points[0].xaxis'); expect(typeof pt.yaxis).toEqual(typeof {}, 'points[0].yaxis'); expect(pt.a).toEqual(2, 'points[0].a'); From 1859256f25a70b5b773158c1983333bf400230d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Wed, 15 Nov 2017 18:18:04 -0500 Subject: [PATCH 29/43] add Lib.coerceSelectionMarkerOpacity - to centralize [un]selected.marker.opacity default logic - use it across in all trace types that support selections --- src/lib/coerce.js | 30 ++++++++++++++++ src/lib/index.js | 1 + src/traces/bar/defaults.js | 2 ++ src/traces/bar/style_defaults.js | 9 +---- src/traces/box/defaults.js | 7 ++-- src/traces/choropleth/defaults.js | 10 ++---- src/traces/scatter/defaults.js | 2 ++ src/traces/scatter/marker_defaults.js | 8 +---- src/traces/scattermapbox/defaults.js | 9 ++--- test/jasmine/tests/scatter_test.js | 51 +++++++++++++++++++++++++++ 10 files changed, 96 insertions(+), 33 deletions(-) diff --git a/src/lib/coerce.js b/src/lib/coerce.js index 5810311ed99..eb514de4a1c 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -17,6 +17,7 @@ var getColorscale = require('../components/colorscale/get_scale'); var colorscaleNames = Object.keys(require('../components/colorscale/scales')); var nestedProperty = require('./nested_property'); var counterRegex = require('./regex').counter; +var DESELECTDIM = require('../constants/interactions').DESELECTDIM; exports.valObjectMeta = { data_array: { @@ -376,6 +377,35 @@ exports.coerceHoverinfo = function(traceIn, traceOut, layoutOut) { return exports.coerce(traceIn, traceOut, attrs, 'hoverinfo', dflt); }; +/** Coerce shortcut for [un]selected.marker.opacity, + * which has special default logic, to ensure that it corresponds to the + * default selection behavior while allowing to be overtaken by any other + * [un]selected attribute. + * + * @param {object} traceOut : fullData item + * @param {function} coerce : lib.coerce wrapper with implied first three arguments + */ +exports.coerceSelectionMarkerOpacity = function(traceOut, coerce) { + if(!traceOut.marker) return; + + var mo = traceOut.marker.opacity; + var smoDflt; + var usmoDflt; + + // Don't give [un]selected.marker.opacity a default value if + // marker.opacity is an array: handle this during style step. + // + // Only give [un]selected.marker.opacity a default value if you don't + // set any other [un]selected attributes. + if(!Array.isArray(mo) && !traceOut.selected && !traceOut.unselected) { + smoDflt = mo; + usmoDflt = DESELECTDIM * mo; + } + + coerce('selected.marker.opacity', smoDflt); + coerce('unselected.marker.opacity', usmoDflt); +}; + exports.validate = function(value, opts) { var valObjectDef = exports.valObjectMeta[opts.valType]; diff --git a/src/lib/index.js b/src/lib/index.js index b34099227d6..7ba79ac9881 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -34,6 +34,7 @@ lib.coerce = coerceModule.coerce; lib.coerce2 = coerceModule.coerce2; lib.coerceFont = coerceModule.coerceFont; lib.coerceHoverinfo = coerceModule.coerceHoverinfo; +lib.coerceSelectionMarkerOpacity = coerceModule.coerceSelectionMarkerOpacity; lib.validate = coerceModule.validate; var datesModule = require('./dates'); diff --git a/src/traces/bar/defaults.js b/src/traces/bar/defaults.js index 259759ef3a4..0f85aa5f7dd 100644 --- a/src/traces/bar/defaults.js +++ b/src/traces/bar/defaults.js @@ -58,4 +58,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // override defaultColor for error bars with defaultLine errorBarsSupplyDefaults(traceIn, traceOut, Color.defaultLine, {axis: 'y'}); errorBarsSupplyDefaults(traceIn, traceOut, Color.defaultLine, {axis: 'x', inherit: 'y'}); + + Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; diff --git a/src/traces/bar/style_defaults.js b/src/traces/bar/style_defaults.js index 69bd8c09140..6b3681c9b84 100644 --- a/src/traces/bar/style_defaults.js +++ b/src/traces/bar/style_defaults.js @@ -12,7 +12,6 @@ var Color = require('../../components/color'); var hasColorscale = require('../../components/colorscale/has_colorscale'); var colorscaleDefaults = require('../../components/colorscale/defaults'); -var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout) { coerce('marker.color', defaultColor); @@ -32,13 +31,7 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, default } coerce('marker.line.width'); - - var mo = coerce('marker.opacity'); - var moEffective = Array.isArray(mo) ? 1 : mo; - - coerce('selected.marker.opacity', moEffective); - coerce('unselected.marker.opacity', DESELECTDIM * moEffective); - + coerce('marker.opacity'); coerce('selected.marker.color'); coerce('unselected.marker.color'); }; diff --git a/src/traces/box/defaults.js b/src/traces/box/defaults.js index d5d836fb956..68d530bc12a 100644 --- a/src/traces/box/defaults.js +++ b/src/traces/box/defaults.js @@ -11,7 +11,6 @@ var Lib = require('../../lib'); var Registry = require('../../registry'); var Color = require('../../components/color'); -var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; var attributes = require('./attributes'); @@ -72,7 +71,7 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) { coerce('pointpos', points === 'all' ? -1.5 : 0); coerce('marker.symbol'); - var mo = coerce('marker.opacity'); + coerce('marker.opacity'); coerce('marker.size'); coerce('marker.color', traceOut.line.color); coerce('marker.line.color'); @@ -83,8 +82,6 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) { coerce('marker.line.outlierwidth'); } - coerce('selected.marker.opacity', mo); - coerce('unselected.marker.opacity', DESELECTDIM * mo); coerce('selected.marker.color'); coerce('unselected.marker.color'); coerce('selected.marker.size'); @@ -96,6 +93,8 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) { } coerce('hoveron'); + + Lib.coerceSelectionMarkerOpacity(traceOut, coerce); } module.exports = { diff --git a/src/traces/choropleth/defaults.js b/src/traces/choropleth/defaults.js index 307d5948cbe..a280158df8b 100644 --- a/src/traces/choropleth/defaults.js +++ b/src/traces/choropleth/defaults.js @@ -12,7 +12,6 @@ var Lib = require('../../lib'); var colorscaleDefaults = require('../../components/colorscale/defaults'); var attributes = require('./attributes'); -var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { @@ -43,14 +42,11 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('marker.line.color'); coerce('marker.line.width'); - - var mo = coerce('marker.opacity'); - var moEffective = Array.isArray(mo) ? 1 : mo; - - coerce('selected.marker.opacity', moEffective); - coerce('unselected.marker.opacity', DESELECTDIM * moEffective); + coerce('marker.opacity'); colorscaleDefaults( traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'} ); + + Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; diff --git a/src/traces/scatter/defaults.js b/src/traces/scatter/defaults.js index 9293d452f79..e33b614a878 100644 --- a/src/traces/scatter/defaults.js +++ b/src/traces/scatter/defaults.js @@ -76,4 +76,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout errorBarsSupplyDefaults(traceIn, traceOut, defaultColor, {axis: 'x', inherit: 'y'}); coerce('cliponaxis'); + + Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; diff --git a/src/traces/scatter/marker_defaults.js b/src/traces/scatter/marker_defaults.js index 214c0105cc8..b5a58867e76 100644 --- a/src/traces/scatter/marker_defaults.js +++ b/src/traces/scatter/marker_defaults.js @@ -12,7 +12,6 @@ var Color = require('../../components/color'); var hasColorscale = require('../../components/colorscale/has_colorscale'); var colorscaleDefaults = require('../../components/colorscale/defaults'); -var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; var subTypes = require('./subtypes'); @@ -33,7 +32,7 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout if(lineColor) defaultColor = lineColor; coerce('marker.symbol'); - var mo = coerce('marker.opacity', isBubble ? 0.7 : 1); + coerce('marker.opacity', isBubble ? 0.7 : 1); coerce('marker.size'); coerce('marker.color', defaultColor); @@ -42,13 +41,8 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout } if(!opts.noSelect) { - var moEffective = Array.isArray(mo) ? 1 : mo; - coerce('selected.marker.opacity', moEffective); - coerce('unselected.marker.opacity', DESELECTDIM * moEffective); - coerce('selected.marker.color'); coerce('unselected.marker.color'); - coerce('selected.marker.size'); coerce('unselected.marker.size'); } diff --git a/src/traces/scattermapbox/defaults.js b/src/traces/scattermapbox/defaults.js index 6b6d4c1f6f5..9f0547ad1d2 100644 --- a/src/traces/scattermapbox/defaults.js +++ b/src/traces/scattermapbox/defaults.js @@ -16,7 +16,6 @@ var handleMarkerDefaults = require('../scatter/marker_defaults'); var handleLineDefaults = require('../scatter/line_defaults'); var handleTextDefaults = require('../scatter/text_defaults'); var handleFillColorDefaults = require('../scatter/fillcolor_defaults'); -var DESELECTDIM = require('../../constants/interactions').DESELECTDIM; var attributes = require('./attributes'); module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { @@ -52,12 +51,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout if(Array.isArray(marker.size)) marker.size = marker.size[0]; if(Array.isArray(marker.color)) marker.color = marker.color[0]; } - - // only marker.opacity for now - var mo = traceOut.marker.opacity; - var moEffective = Array.isArray(mo) ? 1 : mo; - coerce('selected.marker.opacity', moEffective); - coerce('unselected.marker.opacity', DESELECTDIM * moEffective); } if(subTypes.hasText(traceOut)) { @@ -68,6 +61,8 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout if(traceOut.fill !== 'none') { handleFillColorDefaults(traceIn, traceOut, defaultColor, coerce); } + + Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; function handleLonLatDefaults(traceIn, traceOut, coerce) { diff --git a/test/jasmine/tests/scatter_test.js b/test/jasmine/tests/scatter_test.js index d61a2e6ce62..bd25482b3da 100644 --- a/test/jasmine/tests/scatter_test.js +++ b/test/jasmine/tests/scatter_test.js @@ -128,6 +128,52 @@ describe('Test scatter', function() { expect(traceOut.xcalendar).toBe('coptic'); expect(traceOut.ycalendar).toBe('ethiopian'); }); + + describe('selected / unselected attribute containers', function() { + function _supply(patch) { traceIn = Lib.extendFlat({ + mode: 'markers', + x: [1, 2, 3], + y: [2, 1, 2] + }, patch); + traceOut = {visible: true}; + supplyDefaults(traceIn, traceOut, defaultColor, layout); + } + + it('should fill in [un]selected.marker.opacity default when no other [un]selected is set', function() { + _supply({}); + expect(traceOut.selected.marker.opacity).toBe(1); + expect(traceOut.unselected.marker.opacity).toBe(0.2); + + _supply({ marker: {opacity: 0.6} }); + expect(traceOut.selected.marker.opacity).toBe(0.6); + expect(traceOut.unselected.marker.opacity).toBe(0.12); + }); + + it('should not fill in [un]selected.marker.opacity default when some other [un]selected is set', function() { + _supply({ + selected: {marker: {size: 20}} + }); + expect(traceOut.selected.marker.opacity).toBeUndefined(); + expect(traceOut.selected.marker.size).toBe(20); + expect(traceOut.unselected).toBeUndefined(); + + _supply({ + unselected: {marker: {color: 'red'}} + }); + expect(traceOut.selected).toBeUndefined(); + expect(traceOut.unselected.marker.opacity).toBeUndefined(); + expect(traceOut.unselected.marker.color).toBe('red'); + + _supply({ + mode: 'markers+text', + selected: {textfont: {color: 'blue'}} + }); + expect(traceOut.selected.marker).toBeUndefined(); + expect(traceOut.selected.textfont.color).toBe('blue'); + expect(traceOut.unselected).toBeUndefined(); + }); + }); + }); describe('isBubble', function() { @@ -738,6 +784,11 @@ describe('scatter hoverPoints', function() { }); }); +describe('Test Scatter.style', function() { + + +}); + describe('Test scatter *clipnaxis*:', function() { afterEach(destroyGraphDiv); From d3cdd6f60249dc93125dbff478c9b052c5e4f277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 12:06:03 -0500 Subject: [PATCH 30/43] update Drawing.selectedPointStyle - to match current array marker.opacity behavior. - add mucho tests :lock: --- src/components/drawing/index.js | 80 ++++---- src/traces/choropleth/style.js | 11 +- test/jasmine/tests/scatter_test.js | 287 +++++++++++++++++++++++++++++ 3 files changed, 335 insertions(+), 43 deletions(-) diff --git a/src/components/drawing/index.js b/src/components/drawing/index.js index 21ba84470e6..2425366b387 100644 --- a/src/components/drawing/index.js +++ b/src/components/drawing/index.js @@ -435,55 +435,70 @@ drawing.selectedPointStyle = function(s, trace) { var selectedAttrs = trace.selected || {}; var unselectedAttrs = trace.unselected || {}; - s.style('opacity', function(d) { - return d.selected ? - (selectedAttrs.marker || {}).opacity : - (unselectedAttrs.marker || {}).opacity; - }); + var marker = trace.marker || {}; + var selectedMarker = selectedAttrs.marker || {}; + var unselectedMarker = unselectedAttrs.marker || {}; - // which is slightly different than: - // ((d.mo + 1 || opacity + 1) - 1) * (d.dim ? DESELECTDIM : 1); - // in https://github.com/plotly/plotly.js/blob/master/src/traces/scatter/select.js + var mo = marker.opacity; + var smo = selectedMarker.opacity; + var usmo = unselectedMarker.opacity; s.each(function(d) { var pt = d3.select(this); - var marker = trace.marker || {}; - var selectedMarker = selectedAttrs.marker || {}; - var unselectedMarker = unselectedAttrs.marker || {}; - - var smc = selectedMarker.color; - var usmc = unselectedMarker.color; + var mo2; - if(d.selected) { - if(smc) Color.fill(pt, smc); - } else { - if(usmc) Color.fill(pt, usmc); + if(d.mo + 1 || smo || usmo) { + if(d.selected) { + if(smo + 1) mo2 = smo; + } else { + if(usmo + 1) mo2 = usmo; + else mo2 = DESELECTDIM * ((d.mo + 1) ? d.mo : mo); + } } - if(Registry.traceIs(trace, 'symbols')) { - var sms = selectedMarker.size; - var smx = selectedMarker.symbol; - var usms = unselectedMarker.size; - var usmx = unselectedMarker.symbol; + if(mo2 + 1) pt.style('opacity', mo2); + }); + + var smc = selectedMarker.color; + var usmc = unselectedMarker.color; + + if(smc || usmc) { + s.each(function(d) { + var pt = d3.select(this); + var mc2; + + if(d.selected) { + if(smc) mc2 = smc; + } else { + if(usmc) mc2 = usmc; + } + + if(mc2) Color.fill(pt, mc2); + }); + } + + var sms = selectedMarker.size; + var usms = unselectedMarker.size; + + if(Registry.traceIs(trace, 'symbols') && (sms + 1 || usms + 1)) { + s.each(function(d) { + var pt = d3.select(this); var mrc = d.mrc; var mx = d.mx || marker.symbol || 0; var mrc2; - var mx2; if(d.selected) { mrc2 = (sms + 1) ? sms / 2 : mrc; - mx2 = smx || mx; } else { mrc2 = (usms + 1) ? usms / 2 : mrc; - mx2 = usmx || mx; } + pt.attr('d', makePointPath(drawing.symbolNumber(mx), mrc2)); + // save for selectedTextStyle d.mrc2 = mrc2; - - pt.attr('d', makePointPath(drawing.symbolNumber(mx2), mrc2)); - } - }); + }); + } }; drawing.tryColorscale = function(marker, prefix) { @@ -572,13 +587,12 @@ drawing.selectedTextStyle = function(s, trace) { if(d.selected) { if(stc) tc2 = stc; - else tc2 = Color.addOpacity(tc, 1); } else { if(utc) tc2 = utc; - else tc2 = Color.addOpacity(tc, DESELECTDIM); + else if(!stc) tc2 = Color.addOpacity(tc, DESELECTDIM); } - Color.fill(tx, tc2); + if(tc2) Color.fill(tx, tc2); textPointPosition(tx, tp, fontSize, d.mrc2 || d.mrc); }); }; diff --git a/src/traces/choropleth/style.js b/src/traces/choropleth/style.js index d351326e8cf..a3519cccdeb 100644 --- a/src/traces/choropleth/style.js +++ b/src/traces/choropleth/style.js @@ -40,14 +40,5 @@ function styleTrace(gd, calcTrace) { .style('opacity', marker.opacity); }); - if(trace.selectedpoints) { - var selectedAttrs = trace.selected || {}; - var unselectedAttrs = trace.unselected || {}; - - locs.style('opacity', function(d) { - return d.selected ? - selectedAttrs.marker.opacity : - unselectedAttrs.marker.opacity; - }); - } + Drawing.selectedPointStyle(locs, trace); } diff --git a/test/jasmine/tests/scatter_test.js b/test/jasmine/tests/scatter_test.js index bd25482b3da..812159df4ea 100644 --- a/test/jasmine/tests/scatter_test.js +++ b/test/jasmine/tests/scatter_test.js @@ -785,8 +785,295 @@ describe('scatter hoverPoints', function() { }); describe('Test Scatter.style', function() { + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(destroyGraphDiv); + + function makeCheckFn(attr, getterFn) { + return function(update, expectation, msg) { + var msg2 = ' (' + msg + ')'; + var promise = update ? Plotly.restyle(gd, update) : Promise.resolve(); + var selector = attr.indexOf('textfont') === 0 ? '.textpoint > text' : '.point'; + + return promise.then(function() { + d3.selectAll('.trace').each(function(_, i) { + var pts = d3.select(this).selectAll(selector); + var expi = expectation[i]; + + expect(pts.size()) + .toBe(expi.length, '# of pts for trace ' + i + msg2); + + pts.each(function(_, j) { + var msg3 = ' for pt ' + j + ' in trace ' + i + msg2; + expect(getterFn(this)).toBe(expi[j], attr + msg3); + }); + }); + }); + }; + } + + var getOpacity = function(node) { return Number(node.style.opacity); }; + var getFillOpacity = function(node) { return Number(node.style['fill-opacity']); }; + var getColor = function(node) { return node.style.fill; }; + var getMarkerSize = function(node) { + // find path arc multiply by 2 to get the corresponding marker.size value + // (works for circles only) + return d3.select(node).attr('d').split('A')[1].split(',')[0] * 2; + }; + + var r = 'rgb(255, 0, 0)'; + var g = 'rgb(0, 255, 0)'; + var b = 'rgb(0, 0, 255)'; + var y = 'rgb(255, 255, 0)'; + var c = 'rgb(0, 255, 255)'; + + it('should style selected point marker opacity correctly', function(done) { + var check = makeCheckFn('marker.opacity', getOpacity); + + Plotly.plot(gd, [{ + mode: 'markers', + y: [1, 2, 1], + marker: {opacity: 0.6} + }, { + mode: 'markers', + y: [2, 1, 2], + marker: {opacity: [0.5, 0.5, 0.5]} + }]) + .then(function() { + return check( + null, + [[0.6, 0.6, 0.6], [0.5, 0.5, 0.5]], + 'base case' + ); + }) + .then(function() { + return check( + {selectedpoints: [[1]]}, + [[0.12, 0.6, 0.12], [0.1, 0.5, 0.1]], + 'selected pt 1 w/o [un]selected setting' + ); + }) + .then(function() { + return check( + {'selected.marker.opacity': 1}, + [[0.12, 1, 0.12], [0.1, 1, 0.1]], + 'selected pt 1 w/ set selected.marker.opacity' + ); + }) + .then(function() { + return check( + {'unselected.marker.opacity': 0}, + [[0, 1, 0], [0, 1, 0]], + 'selected pt 1 w/ set [un]selected.marker.opacity' + ); + }) + .then(function() { + return check( + {'selected.marker.opacity': null}, + [[0, 0.6, 0], [0, 0.5, 0]], + 'selected pt 1 w/ set unselected.marker.opacity' + ); + }) + .catch(fail) + .then(done); + }); + + it('should style selected point marker color correctly', function(done) { + var check = makeCheckFn('marker.color', getColor); + var checkOpacity = makeCheckFn('marker.opacity', getOpacity); + + Plotly.plot(gd, [{ + mode: 'markers', + y: [1, 2, 1], + marker: {color: b} + }, { + mode: 'markers', + y: [2, 1, 2], + marker: {color: [r, g, b]} + }]) + .then(function() { + return check( + null, + [[b, b, b], [r, g, b]], + 'base case' + ); + }) + .then(function() { + return check( + {selectedpoints: [[0, 2]]}, + [[b, b, b], [r, g, b]], + 'selected pts 0-2 w/o [un]selected setting' + ); + }) + .then(function() { + return checkOpacity( + null, + [[1, 0.2, 1], [1, 0.2, 1]], + 'selected pts 0-2 w/o [un]selected setting [should just change opacity]' + ); + }) + .then(function() { + return check( + {'selected.marker.color': y}, + [[y, b, y], [y, g, y]], + 'selected pts 0-2 w/ set selected.marker.color' + ); + }) + .then(function() { + return checkOpacity( + null, + [[1, 1, 1], [1, 1, 1]], + 'selected pts 0-2 w/o [un]selected setting [should NOT change opacity]' + ); + }) + .then(function() { + return check( + {'unselected.marker.color': c}, + [[y, c, y], [y, c, y]], + 'selected pts 0-2 w/ set [un]selected.marker.color' + ); + }) + .then(function() { + return check( + {'selected.marker.color': null}, + [[b, c, b], [r, c, b]], + 'selected pts 0-2 w/ set selected.marker.color' + ); + }) + .catch(fail) + .then(done); + }); + + it('should style selected point marker size correctly', function(done) { + var check = makeCheckFn('marker.size', getMarkerSize); + + Plotly.plot(gd, [{ + mode: 'markers', + y: [1, 2, 1], + marker: {size: 20} + }, { + mode: 'markers', + y: [2, 1, 2], + marker: {size: [15, 25, 35]} + }]) + .then(function() { + return check( + null, + [[20, 20, 20], [15, 25, 35]], + 'base case' + ); + }) + .then(function() { + return check( + {selectedpoints: [[0]], 'selected.marker.size': 40}, + [[40, 20, 20], [40, 25, 35]], + 'selected pt 0 w/ set selected.marker.size' + ); + }) + .then(function() { + return check( + {'unselected.marker.size': 0}, + [[40, 0, 0], [40, 0, 0]], + 'selected pt 0 w/ set [un]selected.marker.size' + ); + }) + .then(function() { + return check( + {'selected.marker.size': null}, + [[20, 0, 0], [15, 0, 0]], + 'selected pt 0 w/ set unselected.marker.size' + ); + }) + .catch(fail) + .then(done); + }); + it('should style selected point textfont correctly', function(done) { + var checkFontColor = makeCheckFn('textfont.color', getColor); + var checkFontOpacity = makeCheckFn('textfont.color (alpha channel)', getFillOpacity); + var checkPtOpacity = makeCheckFn('marker.opacity', getOpacity); + Plotly.plot(gd, [{ + mode: 'markers+text', + y: [1, 2, 1], + text: 'TEXT', + textfont: {color: b} + }, { + mode: 'markers+text', + y: [2, 1, 2], + text: ['A', 'B', 'C'], + textfont: {color: [r, g, b]} + }]) + .then(function() { + return checkFontColor( + null, + [[b, b, b], [r, g, b]], + 'base case' + ); + }) + .then(function() { + return checkFontColor( + {selectedpoints: [[0, 2]]}, + [[b, b, b], [r, g, b]], + 'selected pts 0-2 w/o [un]selected setting' + ); + }) + .then(function() { + return checkFontOpacity( + null, + [[1, 0.2, 1], [1, 0.2, 1]], + 'selected pts 0-2 w/o [un]selected setting [should change font color alpha]' + ); + }) + .then(function() { + return checkPtOpacity( + null, + [[1, 0.2, 1], [1, 0.2, 1]], + 'selected pts 0-2 w/o [un]selected setting [should change pt opacity]' + ); + }) + .then(function() { + return checkFontColor( + {'selected.textfont.color': y}, + [[y, b, y], [y, g, y]], + 'selected pts 0-2 w/ set selected.textfont.color' + ); + }) + .then(function() { + return checkFontOpacity( + null, + [[1, 1, 1], [1, 1, 1]], + 'selected pts 0-2 w set selected.textfont.color [should NOT change font color alpha]' + ); + }) + .then(function() { + return checkPtOpacity( + null, + [[1, 1, 1], [1, 1, 1]], + 'selected pts 0-2 w/o [un]selected setting [should NOT change opacity]' + ); + }) + .then(function() { + return checkFontColor( + {'unselected.textfont.color': c}, + [[y, c, y], [y, c, y]], + 'selected pts 0-2 w/ set [un]selected.textfont.color' + ); + }) + .then(function() { + return checkFontColor( + {'selected.textfont.color': null}, + [[b, c, b], [r, c, b]], + 'selected pts 0-2 w/ set selected.textfont.color' + ); + }) + .catch(fail) + .then(done); + }); }); describe('Test scatter *clipnaxis*:', function() { From 451778b2adf7e4584bb5d55406712da9ef85eb7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 13:19:37 -0500 Subject: [PATCH 31/43] speed up is-pt-index-valid check --- src/lib/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/index.js b/src/lib/index.js index 3a34443d06d..55ce226f1fb 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -495,7 +495,7 @@ lib.tagSelected = function(calcTrace, trace, ptNumber2cdIndex) { } function isPtIndexValid(v) { - return lib.validate(v, {valType: 'integer', min: 0}); + return isNumeric(v) && v >= 0 && v % 1 === 0; } function isCdIndexValid(v) { From c8d715b98e26e88c2e6fdbfa5b39f3fbb353fcba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 13:20:30 -0500 Subject: [PATCH 32/43] emit 'normalized' a/b/c coords in scatterternary event data - fixup ternary hover event data test accordingly. --- src/traces/scatterternary/event_data.js | 9 +-------- test/jasmine/tests/ternary_test.js | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/traces/scatterternary/event_data.js b/src/traces/scatterternary/event_data.js index 5ded7380d59..ffec801c0cb 100644 --- a/src/traces/scatterternary/event_data.js +++ b/src/traces/scatterternary/event_data.js @@ -15,14 +15,7 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { if(cd[pointNumber]) { var cdi = cd[pointNumber]; - // N.B. These are the scale coordinates !!! - // - // On master, hover events get the non-scaled coordinates - // whereas selection events get the scaled version. - // Note also that the hover labels show the scaled version. - // - // What about the 'raw' input coordinates? - // Should we include them in parallel here or replace a/b/c with them? + // N.B. These are the normalized coordinates. out.a = cdi.a; out.b = cdi.b; out.c = cdi.c; diff --git a/test/jasmine/tests/ternary_test.js b/test/jasmine/tests/ternary_test.js index 780994cce37..5715e48499a 100644 --- a/test/jasmine/tests/ternary_test.js +++ b/test/jasmine/tests/ternary_test.js @@ -501,9 +501,9 @@ describe('Test event property of interactions on a ternary plot:', function() { expect(pt.pointNumber).toEqual(0, 'points[0].pointNumber'); expect(typeof pt.xaxis).toEqual(typeof {}, 'points[0].xaxis'); expect(typeof pt.yaxis).toEqual(typeof {}, 'points[0].yaxis'); - expect(pt.a).toEqual(2, 'points[0].a'); - expect(pt.b).toEqual(1, 'points[0].b'); - expect(pt.c).toEqual(1, 'points[0].c'); + expect(pt.a).toEqual(0.5, 'points[0].a'); + expect(pt.b).toEqual(0.25, 'points[0].b'); + expect(pt.c).toEqual(0.25, 'points[0].c'); expect(evt.clientX).toEqual(pointPos[0], 'event.clientX'); expect(evt.clientY).toEqual(pointPos[1], 'event.clientY'); @@ -549,9 +549,9 @@ describe('Test event property of interactions on a ternary plot:', function() { expect(pt.pointNumber).toEqual(0, 'points[0].pointNumber'); expect(typeof pt.xaxis).toEqual(typeof {}, 'points[0].xaxis'); expect(typeof pt.yaxis).toEqual(typeof {}, 'points[0].yaxis'); - expect(pt.a).toEqual(2, 'points[0].a'); - expect(pt.b).toEqual(1, 'points[0].b'); - expect(pt.c).toEqual(1, 'points[0].c'); + expect(pt.a).toEqual(0.5, 'points[0].a'); + expect(pt.b).toEqual(0.25, 'points[0].b'); + expect(pt.c).toEqual(0.25, 'points[0].c'); expect(evt.clientX).toEqual(pointPos[0], 'event.clientX'); expect(evt.clientY).toEqual(pointPos[1], 'event.clientY'); @@ -594,9 +594,9 @@ describe('Test event property of interactions on a ternary plot:', function() { expect(pt.pointNumber).toEqual(0, 'points[0].pointNumber'); expect(typeof pt.xaxis).toEqual(typeof {}, 'points[0].xaxis'); expect(typeof pt.yaxis).toEqual(typeof {}, 'points[0].yaxis'); - expect(pt.a).toEqual(2, 'points[0].a'); - expect(pt.b).toEqual(1, 'points[0].b'); - expect(pt.c).toEqual(1, 'points[0].c'); + expect(pt.a).toEqual(0.5, 'points[0].a'); + expect(pt.b).toEqual(0.25, 'points[0].b'); + expect(pt.c).toEqual(0.25, 'points[0].c'); expect(xaxes0).toEqual(pt.xaxis, 'xaxes[0]'); expect(xvals0).toEqual(-0.0016654247744483342, 'xaxes[0]'); @@ -638,9 +638,9 @@ describe('Test event property of interactions on a ternary plot:', function() { expect(pt.pointNumber).toEqual(0, 'points[0].pointNumber'); expect(typeof pt.xaxis).toEqual(typeof {}, 'points[0].xaxis'); expect(typeof pt.yaxis).toEqual(typeof {}, 'points[0].yaxis'); - expect(pt.a).toEqual(2, 'points[0].a'); - expect(pt.b).toEqual(1, 'points[0].b'); - expect(pt.c).toEqual(1, 'points[0].c'); + expect(pt.a).toEqual(0.5, 'points[0].a'); + expect(pt.b).toEqual(0.25, 'points[0].b'); + expect(pt.c).toEqual(0.25, 'points[0].c'); expect(evt.clientX).toEqual(pointPos[0], 'event.clientX'); expect(evt.clientY).toEqual(pointPos[1], 'event.clientY'); From 7543dc6a146d0438caa521036fa38cb220031b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 13:39:10 -0500 Subject: [PATCH 33/43] move ptNumber2cdIndex computation to main binning loop --- src/traces/histogram/calc.js | 26 ++++++++------------------ test/jasmine/tests/select_test.js | 8 +++++--- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/traces/histogram/calc.js b/src/traces/histogram/calc.js index 9722b0bf00d..c53587148da 100644 --- a/src/traces/histogram/calc.js +++ b/src/traces/histogram/calc.js @@ -112,11 +112,13 @@ module.exports = function calc(gd, trace) { }; } + // bin the data + // and make histogram-specific pt-number-to-cd-index map object var nMax = size.length; var uniqueValsPerBin = true; var leftGap = Infinity; var rightGap = Infinity; - // bin the data + var ptNumber2cdIndex = {}; for(i = 0; i < pos0.length; i++) { var posi = pos0[i]; n = Lib.findBin(posi, bins); @@ -126,6 +128,7 @@ module.exports = function calc(gd, trace) { uniqueValsPerBin = false; } inputPoints[n].push(i); + ptNumber2cdIndex[i] = n; leftGap = Math.min(leftGap, posi - binEdges[n]); rightGap = Math.min(rightGap, binEdges[n + 1] - posi); @@ -195,7 +198,10 @@ module.exports = function calc(gd, trace) { } arraysToCalcdata(cd, trace); - calcSelection(cd, trace); + + if(Array.isArray(trace.selectedpoints)) { + Lib.tagSelected(cd, trace, ptNumber2cdIndex); + } return cd; }; @@ -510,19 +516,3 @@ function cdf(size, direction, currentBin) { } } } - -function calcSelection(cd, trace) { - if(Array.isArray(trace.selectedpoints)) { - var ptNumber2cdIndex = {}; - - // make histogram-specific pt-number-to-cd-index map object - for(var i = 0; i < cd.length; i++) { - var pts = cd[i].pts || []; - for(var j = 0; j < pts.length; j++) { - ptNumber2cdIndex[pts[j]] = i; - } - } - - Lib.tagSelected(cd, trace, ptNumber2cdIndex); - } -} diff --git a/test/jasmine/tests/select_test.js b/test/jasmine/tests/select_test.js index 31f26d2b408..25b027410f8 100644 --- a/test/jasmine/tests/select_test.js +++ b/test/jasmine/tests/select_test.js @@ -554,6 +554,8 @@ describe('Test select box and lasso per trace:', function() { if(typeof e[j] === 'number') { expect(p[k]).toBeCloseTo(e[j], 1, msgFull); + } else if(Array.isArray(e[j])) { + expect(p[k]).toBeCloseToArray(e[j], 1, msgFull); } else { expect(p[k]).toBe(e[j], msgFull); } @@ -990,7 +992,7 @@ describe('Test select box and lasso per trace:', function() { }); it('should work for histogram traces', function(done) { - var assertPoints = makeAssertPoints(['curveNumber', 'x', 'y']); + var assertPoints = makeAssertPoints(['curveNumber', 'x', 'y', 'pointIndices']); var assertRanges = makeAssertRanges(); var assertLassoPoints = makeAssertLassoPoints(); @@ -1006,7 +1008,7 @@ describe('Test select box and lasso per trace:', function() { [[200, 200], [400, 200], [400, 350], [200, 350], [200, 200]], function() { assertPoints([ - [0, 1.8, 2], [1, 2.2, 1], [1, 3.2, 1] + [0, 1.8, 2, [3, 4]], [1, 2.2, 1, [1]], [1, 3.2, 1, [2]] ]); assertLassoPoints([ [1.66, 3.59, 3.59, 1.66, 1.66], @@ -1024,7 +1026,7 @@ describe('Test select box and lasso per trace:', function() { [[200, 200], [400, 350]], function() { assertPoints([ - [0, 1.8, 2], [1, 2.2, 1], [1, 3.2, 1] + [0, 1.8, 2, [3, 4]], [1, 2.2, 1, [1]], [1, 3.2, 1, [2]] ]); assertRanges([[1.66, 3.59], [0.69, 2.17]]); }, From 9d86a2fa3cc355f08696dd39e51bebdeb0d120cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 16:40:53 -0500 Subject: [PATCH 34/43] :hocho: selectedids (for now) --- src/plots/attributes.js | 12 +----------- src/plots/plots.js | 1 - src/traces/scatter/calc_selection.js | 2 -- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/src/plots/attributes.js b/src/plots/attributes.js index 575b194e811..051e45fd5df 100644 --- a/src/plots/attributes.js +++ b/src/plots/attributes.js @@ -98,7 +98,7 @@ module.exports = { // N.B. these cannot be 'data_array' as they do not have the same length as // other data arrays and arrayOk attributes in general // - // TODO maybe add another valType: + // Maybe add another valType: // https://github.com/plotly/plotly.js/issues/1894 selectedpoints: { valType: 'any', @@ -112,16 +112,6 @@ module.exports = { 'selection all where the `selected` and `unselected` styles have no effect.' ].join(' ') }, - selectedids: { - valType: 'any', - role: 'info', - editType: 'calc', - description: [ - 'Array containing `ids` of selected points.', - 'Has an effect only for traces that support selections.', - '...' - ].join(' ') - }, hoverinfo: { valType: 'flaglist', diff --git a/src/plots/plots.js b/src/plots/plots.js index de243c8a1c8..cb7264ee242 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -1024,7 +1024,6 @@ plots.supplyTraceDefaults = function(traceIn, traceOutIndex, layout, traceInInde if(_module && _module.selectPoints && traceOut.type !== 'scattergl') { coerce('selectedpoints'); - coerce('selectedids'); } plots.supplyTransformDefaults(traceIn, traceOut, layout); diff --git a/src/traces/scatter/calc_selection.js b/src/traces/scatter/calc_selection.js index 72279ee31eb..8076e21fa54 100644 --- a/src/traces/scatter/calc_selection.js +++ b/src/traces/scatter/calc_selection.js @@ -10,8 +10,6 @@ var Lib = require('../../lib'); -// TODO ids vs points?? - module.exports = function calcSelection(cd, trace) { if(Array.isArray(trace.selectedpoints)) { Lib.tagSelected(cd, trace); From 6437081d71ccaa5d144d9ee63b327625f643509e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 17:03:39 -0500 Subject: [PATCH 35/43] add delay in bar select test (to pass on CI) --- test/jasmine/tests/select_test.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/jasmine/tests/select_test.js b/test/jasmine/tests/select_test.js index 25b027410f8..1a9210d7aa6 100644 --- a/test/jasmine/tests/select_test.js +++ b/test/jasmine/tests/select_test.js @@ -916,6 +916,16 @@ describe('Test select box and lasso per trace:', function() { .then(function() { return Plotly.relayout(gd, 'dragmode', 'select'); }) + .then(function() { + // For some reason we need this to make the following tests pass + // on CI consistently. It appears that a double-click action + // is being confused with a mere click. See + // https://github.com/plotly/plotly.js/pull/2135#discussion_r148897529 + // for more info. + return new Promise(function(resolve) { + setTimeout(resolve, 100); + }); + }) .then(function() { return _run( [[350, 200], [370, 220]], From 9bbf55b53e63610ecf7141349465d5f77116db37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 18:11:40 -0500 Subject: [PATCH 36/43] assert gd.data[i].selectedpoints in per-trace-type select tests --- test/jasmine/tests/select_test.js | 139 ++++++++++++++++++++++++++++-- 1 file changed, 132 insertions(+), 7 deletions(-) diff --git a/test/jasmine/tests/select_test.js b/test/jasmine/tests/select_test.js index 1a9210d7aa6..ab770a9d5ab 100644 --- a/test/jasmine/tests/select_test.js +++ b/test/jasmine/tests/select_test.js @@ -566,6 +566,27 @@ describe('Test select box and lasso per trace:', function() { }; } + function makeAssertSelectedPoints() { + var callNumber = 0; + + return function(expected) { + var msg = '(call #' + callNumber + ') '; + + gd.data.forEach(function(trace, i) { + var msgFull = msg + 'selectedpoints array for trace ' + i; + var actual = trace.selectedpoints; + + if(expected[i]) { + expect(actual).toBeCloseToArray(expected[i], 1, msgFull); + } else { + expect(actual).toBe(undefined, 1, msgFull); + } + }); + + callNumber++; + }; + } + function makeAssertRanges(subplot, tol) { tol = tol || 1; var callNumber = 0; @@ -636,6 +657,7 @@ describe('Test select box and lasso per trace:', function() { it('should work on scatterternary traces', function(done) { var assertPoints = makeAssertPoints(['a', 'b', 'c']); + var assertSelectedPoints = makeAssertSelectedPoints(); var fig = Lib.extendDeep({}, require('@mocks/ternary_simple')); fig.layout.width = 800; @@ -647,6 +669,7 @@ describe('Test select box and lasso per trace:', function() { [[400, 200], [445, 235]], function() { assertPoints([[0.5, 0.25, 0.25]]); + assertSelectedPoints({0: [0]}); }, [380, 180], BOXEVENTS, 'scatterternary select' @@ -658,7 +681,10 @@ describe('Test select box and lasso per trace:', function() { .then(function() { return _run( [[400, 200], [445, 200], [445, 235], [400, 235], [400, 200]], - function() { assertPoints([[0.5, 0.25, 0.25]]); }, + function() { + assertPoints([[0.5, 0.25, 0.25]]); + assertSelectedPoints({0: [0]}); + }, [380, 180], LASSOEVENTS, 'scatterternary lasso' ); @@ -670,7 +696,10 @@ describe('Test select box and lasso per trace:', function() { .then(function() { return _run( [[200, 200], [230, 200], [230, 230], [200, 230], [200, 200]], - function() { assertPoints([[0.5, 0.25, 0.25]]); }, + function() { + assertPoints([[0.5, 0.25, 0.25]]); + assertSelectedPoints({0: [0]}); + }, [180, 180], LASSOEVENTS, 'scatterternary lasso after relayout' ); @@ -681,6 +710,7 @@ describe('Test select box and lasso per trace:', function() { it('should work on scattercarpet traces', function(done) { var assertPoints = makeAssertPoints(['a', 'b']); + var assertSelectedPoints = makeAssertSelectedPoints(); var fig = Lib.extendDeep({}, require('@mocks/scattercarpet')); fig.layout.dragmode = 'select'; @@ -689,7 +719,10 @@ describe('Test select box and lasso per trace:', function() { Plotly.plot(gd, fig).then(function() { return _run( [[300, 200], [400, 250]], - function() { assertPoints([[0.2, 1.5]]); }, + function() { + assertPoints([[0.2, 1.5]]); + assertSelectedPoints({1: [], 2: [], 3: [], 4: [], 5: [1], 6: []}); + }, null, BOXEVENTS, 'scattercarpet select' ); }) @@ -699,7 +732,10 @@ describe('Test select box and lasso per trace:', function() { .then(function() { return _run( [[300, 200], [400, 200], [400, 250], [300, 250], [300, 200]], - function() { assertPoints([[0.2, 1.5]]); }, + function() { + assertPoints([[0.2, 1.5]]); + assertSelectedPoints({1: [], 2: [], 3: [], 4: [], 5: [1], 6: []}); + }, null, LASSOEVENTS, 'scattercarpet lasso' ); }) @@ -711,6 +747,7 @@ describe('Test select box and lasso per trace:', function() { var assertPoints = makeAssertPoints(['lon', 'lat']); var assertRanges = makeAssertRanges('mapbox'); var assertLassoPoints = makeAssertLassoPoints('mapbox'); + var assertSelectedPoints = makeAssertSelectedPoints(); var fig = Lib.extendDeep({}, require('@mocks/mapbox_bubbles-text')); fig.layout.dragmode = 'select'; @@ -725,6 +762,7 @@ describe('Test select box and lasso per trace:', function() { function() { assertPoints([[30, 30]]); assertRanges([[21.99, 34.55], [38.14, 25.98]]); + assertSelectedPoints({0: [2]}); }, null, BOXEVENTS, 'scattermapbox select' ); @@ -737,6 +775,7 @@ describe('Test select box and lasso per trace:', function() { [[300, 200], [300, 300], [400, 300], [400, 200], [300, 200]], function() { assertPoints([[20, 20]]); + assertSelectedPoints({0: [1]}); assertLassoPoints([ [13.28, 25.97], [13.28, 14.33], [25.71, 14.33], [25.71, 25.97], [13.28, 25.97] ]); @@ -759,8 +798,10 @@ describe('Test select box and lasso per trace:', function() { it('should work on scattergeo traces', function(done) { var assertPoints = makeAssertPoints(['lon', 'lat']); + var assertSelectedPoints = makeAssertSelectedPoints(); var assertRanges = makeAssertRanges('geo'); var assertLassoPoints = makeAssertLassoPoints('geo'); + var fig = { data: [{ type: 'scattergeo', @@ -786,6 +827,7 @@ describe('Test select box and lasso per trace:', function() { [[350, 200], [450, 400]], function() { assertPoints([[10, 10], [20, 20], [-10, 10], [-20, 20]]); + assertSelectedPoints({0: [0, 1], 1: [0, 1]}); assertRanges([[-28.13, 61.88], [28.13, -50.64]]); }, null, BOXEVENTS, 'scattergeo select' @@ -799,6 +841,7 @@ describe('Test select box and lasso per trace:', function() { [[300, 200], [300, 300], [400, 300], [400, 200], [300, 200]], function() { assertPoints([[-10, 10], [-20, 20], [-30, 30]]); + assertSelectedPoints({0: [], 1: [0, 1, 2]}); assertLassoPoints([ [-56.25, 61.88], [-56.24, 5.63], [0, 5.63], [0, 61.88], [-56.25, 61.88] ]); @@ -806,10 +849,7 @@ describe('Test select box and lasso per trace:', function() { null, LASSOEVENTS, 'scattergeo lasso' ); }) - // .then(deselectPromise) .then(function() { - // assertEventCounts(4, 2, 1, 'de-lasso'); - // make sure selection handlers don't get called in 'pan' dragmode return Plotly.relayout(gd, 'dragmode', 'pan'); }) @@ -824,6 +864,7 @@ describe('Test select box and lasso per trace:', function() { it('should work on choropleth traces', function(done) { var assertPoints = makeAssertPoints(['location', 'z']); + var assertSelectedPoints = makeAssertSelectedPoints(); var assertRanges = makeAssertRanges('geo', -0.5); var assertLassoPoints = makeAssertLassoPoints('geo', -0.5); @@ -847,6 +888,7 @@ describe('Test select box and lasso per trace:', function() { [[350, 200], [400, 250]], function() { assertPoints([['GBR', 26.507354205352502], ['IRL', 86.4125147625692]]); + assertSelectedPoints({0: [54, 68]}); assertRanges([[-19.11, 63.06], [7.31, 53.72]]); }, [280, 190], @@ -861,6 +903,7 @@ describe('Test select box and lasso per trace:', function() { [[350, 200], [400, 200], [400, 250], [350, 250], [350, 200]], function() { assertPoints([['GBR', 26.507354205352502], ['IRL', 86.4125147625692]]); + assertSelectedPoints({0: [54, 68]}); assertLassoPoints([ [-19.11, 63.06], [5.50, 65.25], [7.31, 53.72], [-12.90, 51.70], [-19.11, 63.06] ]); @@ -884,6 +927,7 @@ describe('Test select box and lasso per trace:', function() { it('should work for bar traces', function(done) { var assertPoints = makeAssertPoints(['curveNumber', 'x', 'y']); + var assertSelectedPoints = makeAssertSelectedPoints(); var assertRanges = makeAssertRanges(); var assertLassoPoints = makeAssertLassoPoints(); @@ -905,6 +949,11 @@ describe('Test select box and lasso per trace:', function() { [2, 4.9, 0.473], [2, 5, 0.368], [2, 5.1, 0.258], [2, 5.2, 0.146], [2, 5.3, 0.036] ]); + assertSelectedPoints({ + 0: [49, 50, 51, 52, 53, 54, 55, 56, 57], + 1: [51, 52, 53, 54, 55, 56], + 2: [49, 50, 51, 52, 53] + }); assertLassoPoints([ [4.87, 5.74, 5.74, 4.87, 4.87], [0.53, 0.53, -0.02, -0.02, 0.53] @@ -935,6 +984,11 @@ describe('Test select box and lasso per trace:', function() { [1, 5.1, 0.485], [1, 5.2, 0.41], [2, 4.9, 0.473], [2, 5, 0.37] ]); + assertSelectedPoints({ + 0: [49, 50, 51, 52], + 1: [51, 52], + 2: [49, 50] + }); assertRanges([[4.87, 5.22], [0.31, 0.53]]); }, null, BOXEVENTS, 'bar select' @@ -946,6 +1000,7 @@ describe('Test select box and lasso per trace:', function() { it('should work for date/category traces', function(done) { var assertPoints = makeAssertPoints(['curveNumber', 'x', 'y']); + var assertSelectedPoints = makeAssertSelectedPoints(); var fig = { data: [{ @@ -978,6 +1033,7 @@ describe('Test select box and lasso per trace:', function() { [0, '2017-02-01', 'b'], [1, '2017-02-02', 'b'] ]); + assertSelectedPoints({0: [1], 1: [1]}); }, null, LASSOEVENTS, 'date/category lasso' ); @@ -993,6 +1049,7 @@ describe('Test select box and lasso per trace:', function() { [0, '2017-02-01', 'b'], [1, '2017-02-02', 'b'] ]); + assertSelectedPoints({0: [1], 1: [1]}); }, null, BOXEVENTS, 'date/category select' ); @@ -1003,6 +1060,7 @@ describe('Test select box and lasso per trace:', function() { it('should work for histogram traces', function(done) { var assertPoints = makeAssertPoints(['curveNumber', 'x', 'y', 'pointIndices']); + var assertSelectedPoints = makeAssertSelectedPoints(); var assertRanges = makeAssertRanges(); var assertLassoPoints = makeAssertLassoPoints(); @@ -1020,6 +1078,7 @@ describe('Test select box and lasso per trace:', function() { assertPoints([ [0, 1.8, 2, [3, 4]], [1, 2.2, 1, [1]], [1, 3.2, 1, [2]] ]); + assertSelectedPoints({0: [3, 4], 1: [1, 2]}); assertLassoPoints([ [1.66, 3.59, 3.59, 1.66, 1.66], [2.17, 2.17, 0.69, 0.69, 2.17] @@ -1038,6 +1097,7 @@ describe('Test select box and lasso per trace:', function() { assertPoints([ [0, 1.8, 2, [3, 4]], [1, 2.2, 1, [1]], [1, 3.2, 1, [2]] ]); + assertSelectedPoints({0: [3, 4], 1: [1, 2]}); assertRanges([[1.66, 3.59], [0.69, 2.17]]); }, null, BOXEVENTS, 'histogram select' @@ -1049,6 +1109,7 @@ describe('Test select box and lasso per trace:', function() { it('should work for box traces', function(done) { var assertPoints = makeAssertPoints(['curveNumber', 'y', 'x']); + var assertSelectedPoints = makeAssertSelectedPoints(); var assertRanges = makeAssertRanges(); var assertLassoPoints = makeAssertLassoPoints(); @@ -1071,6 +1132,11 @@ describe('Test select box and lasso per trace:', function() { [1, 0.2, 'day 2'], [1, 0.5, 'day 2'], [1, 0.7, 'day 2'], [1, 0.7, 'day 2'], [2, 0.3, 'day 1'], [2, 0.6, 'day 1'], [2, 0.6, 'day 1'] ]); + assertSelectedPoints({ + 0: [6, 11, 10, 7], + 1: [11, 8, 6, 10], + 2: [1, 4, 5] + }); assertLassoPoints([ ['day 1', 'day 2', 'day 2', 'day 1', 'day 1'], [0.71, 0.71, 0.1875, 0.1875, 0.71] @@ -1091,6 +1157,11 @@ describe('Test select box and lasso per trace:', function() { [1, 0.2, 'day 2'], [1, 0.5, 'day 2'], [1, 0.7, 'day 2'], [1, 0.7, 'day 2'], [2, 0.3, 'day 1'], [2, 0.6, 'day 1'], [2, 0.6, 'day 1'] ]); + assertSelectedPoints({ + 0: [6, 11, 10, 7], + 1: [11, 8, 6, 10], + 2: [1, 4, 5] + }); assertRanges([['day 1', 'day 2'], [0.1875, 0.71]]); }, null, BOXEVENTS, 'box select' @@ -1102,6 +1173,7 @@ describe('Test select box and lasso per trace:', function() { it('should work for violin traces', function(done) { var assertPoints = makeAssertPoints(['curveNumber', 'y', 'x']); + var assertSelectedPoints = makeAssertSelectedPoints(); var assertRanges = makeAssertRanges(); var assertLassoPoints = makeAssertLassoPoints(); @@ -1122,6 +1194,11 @@ describe('Test select box and lasso per trace:', function() { [1, 0.9, 'day 2'], [2, 0.3, 'day 1'], [2, 0.6, 'day 1'], [2, 0.6, 'day 1'], [2, 0.9, 'day 1'] ]); + assertSelectedPoints({ + 0: [11, 10, 7, 8], + 1: [8, 6, 10, 9, 7], + 2: [1, 4, 5, 3] + }); assertLassoPoints([ ['day 1', 'day 2', 'day 2', 'day 1', 'day 1'], [1.02, 1.02, 0.27, 0.27, 1.02] @@ -1143,6 +1220,11 @@ describe('Test select box and lasso per trace:', function() { [1, 0.9, 'day 2'], [2, 0.3, 'day 1'], [2, 0.6, 'day 1'], [2, 0.6, 'day 1'], [2, 0.9, 'day 1'] ]); + assertSelectedPoints({ + 0: [11, 10, 7, 8], + 1: [8, 6, 10, 9, 7], + 2: [1, 4, 5, 3] + }); assertRanges([['day 1', 'day 2'], [0.27, 1.02]]); }, null, BOXEVENTS, 'violin select' @@ -1151,6 +1233,49 @@ describe('Test select box and lasso per trace:', function() { .catch(fail) .then(done); }); + + it('should work on traces with enabled transforms', function(done) { + var assertSelectedPoints = makeAssertSelectedPoints(); + + Plotly.plot(gd, [{ + x: [1, 2, 3, 4, 5], + y: [2, 3, 1, 7, 9], + marker: {size: [10, 20, 20, 20, 10]}, + transforms: [{ + type: 'filter', + operation: '>', + value: 2, + target: 'y' + }, { + type: 'aggregate', + groups: 'marker.size', + aggregations: [ + // 20: 6, 10: 5 + {target: 'x', func: 'sum'}, + // 20: 5, 10: 9 + {target: 'y', func: 'avg'} + ] + }] + }], { + dragmode: 'select', + showlegend: false, + width: 400, + height: 400, + margin: {l: 0, t: 0, r: 0, b: 0} + }) + .then(function() { + return _run( + [[5, 5], [395, 395]], + function() { + assertSelectedPoints({0: [1, 3, 4]}); + }, + [380, 180], + BOXEVENTS, 'transformed trace select (all points selected)' + ); + }) + .catch(fail) + .then(done); + }); }); // to make sure none of the above tests fail with extraneous invisible traces, From 9ccccd3bc4498a28e09da58f79dd0f243c9b4154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 19:06:47 -0500 Subject: [PATCH 37/43] (fixup) Lib.coerceSelectionMarkerOpacity for all selectable traces --- src/traces/histogram/defaults.js | 3 ++- src/traces/scattercarpet/defaults.js | 3 ++- src/traces/scatterternary/defaults.js | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/traces/histogram/defaults.js b/src/traces/histogram/defaults.js index 534bddf3f8f..0476ba7877e 100644 --- a/src/traces/histogram/defaults.js +++ b/src/traces/histogram/defaults.js @@ -18,7 +18,6 @@ var handleStyleDefaults = require('../bar/style_defaults'); var errorBarsSupplyDefaults = require('../../components/errorbars/defaults'); var attributes = require('./attributes'); - module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); @@ -57,4 +56,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // override defaultColor for error bars with defaultLine errorBarsSupplyDefaults(traceIn, traceOut, Color.defaultLine, {axis: 'y'}); errorBarsSupplyDefaults(traceIn, traceOut, Color.defaultLine, {axis: 'x', inherit: 'y'}); + + Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; diff --git a/src/traces/scattercarpet/defaults.js b/src/traces/scattercarpet/defaults.js index 5bf92d1a02f..32715a00a4e 100644 --- a/src/traces/scattercarpet/defaults.js +++ b/src/traces/scattercarpet/defaults.js @@ -21,7 +21,6 @@ var handleFillColorDefaults = require('../scatter/fillcolor_defaults'); var attributes = require('./attributes'); - module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); @@ -84,4 +83,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout dfltHoverOn.push('fills'); } coerce('hoveron', dfltHoverOn.join('+') || 'points'); + + Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; diff --git a/src/traces/scatterternary/defaults.js b/src/traces/scatterternary/defaults.js index 9a1ca4f4fcd..6bc413f6976 100644 --- a/src/traces/scatterternary/defaults.js +++ b/src/traces/scatterternary/defaults.js @@ -101,4 +101,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('hoveron', dfltHoverOn.join('+') || 'points'); coerce('cliponaxis'); + + Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; From 3d2049c0c6ada1c741da27184704e1c477227a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 19:10:15 -0500 Subject: [PATCH 38/43] :lock: down [un]selected styles in mocks --- test/image/baselines/geo_point-selection.png | Bin 0 -> 60213 bytes test/image/baselines/mapbox_bubbles.png | Bin 45498 -> 46594 bytes test/image/baselines/point-selection2.png | Bin 0 -> 24319 bytes test/image/baselines/scattercarpet.png | Bin 47022 -> 47431 bytes test/image/baselines/ternary_array_styles.png | Bin 39026 -> 41198 bytes test/image/mocks/geo_point-selection.json | 51 ++++++++ test/image/mocks/mapbox_bubbles.json | 18 +++ test/image/mocks/point-selection2.json | 112 ++++++++++++++++++ test/image/mocks/scattercarpet.json | 15 +++ test/image/mocks/ternary_array_styles.json | 22 ++++ 10 files changed, 218 insertions(+) create mode 100644 test/image/baselines/geo_point-selection.png create mode 100644 test/image/baselines/point-selection2.png create mode 100644 test/image/mocks/geo_point-selection.json create mode 100644 test/image/mocks/point-selection2.json diff --git a/test/image/baselines/geo_point-selection.png b/test/image/baselines/geo_point-selection.png new file mode 100644 index 0000000000000000000000000000000000000000..c74d0b67fae2c39e87b2599c67a0cbdd3bee6e39 GIT binary patch literal 60213 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

L=D%<8%gU@G=P_Bb_F1Y^0#Q$7- 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 TM@1Pt@TVxRCRh3p`S$++TAUNP literal 45498 zcmeFYWm_CUyEPhuy9IYAxO;H-paTRLJh;0%1c%@d+-)G(;DbBC-QC^o@a+BWbKXC2 zzU@zSbys(Fb=_L)UKOdTEQ5+fi1g{xCsa9ENwrU(J_9~|g6c+q`?$mD++_Oc6Zt1O zNihu%gOhf|W*a$8+7>51I?f59iS2BARKU+vK!8?MM9{AYgoygaB4(F@1u0kcvF*uq zZ@=}VOB{~iQM2!>^sDqzh?;1j`9WLixy6EiJliZtud_yz($Dq0bNC1d2)t!ZvTHf7 zvs&H!d0bVbDTI z{&%H56!w30>VK{8zdXbLx`h9A3I83#{(p7}OEA{HzDki=^k39chIXBXIh0{lg$)f$ zzOBbtYRsID><(Gd7u77<;Ic%cSl$dOCO81zNa^0(+F~31wS`mvBaX_Hnb)w zcHeB(O}?4d=`_ENmKKbbRL4m05jXk`_?5Y%flE`u1P%^=-ml!-%z2U-A1|F}xGry} zDVA`DK^rwk1b6!ed^09^ToVJu| zxh&dhI&pS+bvgKSmHOng1o%#ldKZQdheOwAvhngy^y}*F5AB9SVL^6SiglU%{WDeA z8ibuXRqU!-tD-4O1QINQm;0ZFyuDV|QPjeM!kSYu0rVL2gHmmm7X~f z^WA<&UB{(`yT@DX_(z9M$)Vxpd?l+0DUq@Kr+y^@!Q6(M5Nx__&4pT|&9btx6^GZ9j7PdbnY=m2#F&6soq zVpp7j4?M$SEgD3nKzNP3&OXC zXG{?L0Yb!SlE6z2FuJ;gxm9Iyi*lE$T2-*Cx7~y(3A`(0D|Zw%giHiw-!VyfQMIVI zY*z(N)gz$p#!lULk++Zz;(2)!iz@oAoclcp!tE9-rvGY9o;7Oyv?~pF5kTeUz8gq5 zLCjy51i7rI+&h_30F(=n-^Y0fXN&jEjFW?bM(YYRI@%@XOxF=7hd(WYVpGhI=?Hkr zQL_f-9%sQ>tFC@iQvf~kBv`6tB3)L z)Na|(e#com`Z^QsrDzMy)JGYUEoTztR#c(V?&BI+*iQ%yno&>5HCq`P-M0DsxUjvv z^+<$71SNSY6l;#$)2R4Kc2iJsC>Qod0@JCr{}`4_!?IER&j^3s*D4qcZ1M>{Xi4Y%>;V-Rz$q88`EGVylTi>ZGCZ^ z&Tid;8XIv;qNpa~&7n7l9ex>4V&cuI==Q^XHaF5IfM5+Je;rf*dfoW2igT>i=SiON zr17S%Y!MqBpH3W=RC&6ppJq7p%$-9<8lu6lTiSl*bmw_0g2_}9ahN(!3m_somWLPm z^P}|Tw+l}OIpW;alYmQo{Q(t@=ulCED`0tvB|e%kWJwl3f0K=CW;S_-0jnBNIj39S z5}V%wk78)&Xokb%=B9AOsL6sF_&3-W7mS;82s`sqSlIn6u#{VtxAqi6QhykXl50NO zJ3T%3nOP|Y_KLTui2|G&G~W2Kq_-&Qd<|D#ncEJ=Y+2Hc+N&7%3q<8lAmHW9OR^ye zD&ojyCtl^!5&(G9h;sz>`6RRrPaWnQa%>G0X40yL`|x2h@p6{WvmgHPr^jOz-d&f# z9Y+Nl8cz`v%)ixLNrGM|ORDkkA;wCAt8VeORxJ!}w;-GApiG{~)sr5lhg;Q1czgRX zmMVa+RE#DQ;cnJ|vucj)!&%DD!?LonP!Az3**#)AI&*0_7GDgZyP+dY(@HDnVR?k=lDd?A34_16`vAMqv+cw|MgQ z2xel~n+7o2d*~|QO(Vq-6uQJ%Ndb=kTIvqwnnZvhXFKgpv; zGC|2B5ZH0}C`0ememV%vFEK}6Xa27Dc@0DOZ>P3uN*SrOV1D+BorAesWAQJ`l4GE8 z^Z_N74(2=Gsr&5qgb5(V&RvXw3F%bXcS7klesQCF zbq;=mZ(Z7_nFh~goHDhea#Voj<>iY|Rv)O2%NTnA#?AeGPy79v^((7zoX8uW&zW=1 zU&T6BpH1Y=F?&B}AQ|b0_u-@WbGk^`}Qj-($Jv9nR3~S+%WJ z&p*^d#bWv!F$|cf_NbPYkYigMoCGX(vva(ml?H-mbChqp66Bd95ayt1fkqZACLa;h zNPHA|aUxJdMDZ~V*P^9RDNH+?z{wF=DMfK^1dE(gVueZUH2Zs=&*V<&U&F;)q}PZx zAEDuhNV`@PY@3{Q==PsAF3;oJ=dN*g0;ILfi^Ptc_mMCoah9q@MNEN9k*5XkSN0!*0rb}iqm`vG25ZW*_h_SZ+DsJ^~t%glpo>Tl# z*TRVplsctqV=(E(?C3=+mn=f4Zu4HacgSP_8NifF{c(R+Nw#lo`r;1KpYI|ej z&wl6ke(1v2=@VUeoexqAi;IEYXW#(_ULGE}bMN)%jRLaQ(n&uyBQqMn0=0z}tJGAmZ$df(CRw!3mm76M z!~LPk?H%p#*WR84E`V5Pt?}b!PnzWx>wK|Am1x+DIvMK>5KLmH5~summmD)-WmMS2 zM=klaV181#Y^QaVPkmMslj&LY9#=ws)*Per`Z;&lP*E!0^>tJ+S^`fmJ)LckD3IZ5 zyHFErLa06~i-a)V0AIZ!FSv$`Gv6}Eb@zU~W?FOGZ2Xn%K1deC!^5*7LH2}^CE$u= zaNjZyfkqel)U@hG)V4#zTDv5}xyfkwDF1Mz-D%Y(LjMmRB4BJo_{JL@-~7nY?EA=m znu1OFvbPmRxCW9hKABX82x}Wa2Y4MyfJeL@$!8BUGy6nKI_wB8>ym8zQp7YWe#S`3A7^=va@e zp^>RIrfBxiu_VZWNw#{$0iq$0Z(i|*jA<3ID^+6Oo&6W+ER`Thf{;mMFjZ^7?KcUi zKE8q|69j5G!)L3{V}XL!CxJy3s47q}Ns66ZW!G(!zuq*{P~OC88{F8>o!1Mjtj2~+ z%~n1f+Q++UqNbc$op z?YKw)SvoT-L$zqNP1^QDXmd1P=jSUD=5HSTp`G8!|K5PEJR ztfjf){kL6bdkVH($};{UUz58Vvk2K9Urdwf!B>&bEy6(n<>;+Hboidvsp`#Pdtoh9 zw)Pm*3cS?8*xfI>+P*&`IW#s+hTpYr^<1W&GJRy8+S%2ol)PygH}2R6Q#FeUHt+4V zRNRmgUW+LKb=MM7AuHpmbf_6bq;~c_T#%Nh>S2t^zwcFPz*@)7yM~%jbpMAQ+(lg- zoj~5UP1HG+R93^r(XgC{Ub<05fY`4_IAlazkv#cyaz*8Mm?*N6Bz5YP%ND4SwV)*X z6s2l6Axs*@alPZjD28|)a)hc1i5w;i5$wi?5Ar>SI2*ZHh)jHhxJmgGS z)HY@LdUOFMq~|dn<|jUweuw`z$(rA5sl2P5HYN*6uSSL|34vHDCcFC-J-d@r79y_k z*I0=LizqTe<;w|4PSW?atig=TxIZWDCPWdP!;kuvjEptQJgtLy0tK~7HYMQ2A6>RC zPE81ND^~wTaz)>oo|ghJD-RDXyEswo5x1^CA{n;u+htsj1o}4^Ub~fmrnX&X+_LWV zNmD)n0i+uL*JJ3z8XkzQzCH^ZS($Of!OvRL%=CFZCV|ojVV$iYXJk?O;rUrC;5TY* zF#&_4=vDjlu&}TKBGdds>~~*ZFI4t|7>tJxr)Pv7@M_O6}%*Jk~~Oq7LMLm=qd&dWPdqq zL$5K@=pB~(qa2`&;wnHq4vOjzmv zI`1DE=X+w3@{aR_gN}*{v45Sj*O5fZq5I?US@>~CrTguzV>icj-S^%TO{Y-My#W!o z1|q(xZ1sH(WEf;N!ZI$UIov-mqHeq4hZlwLu(n28h(>bYYADT}EYU`UHeDL=+9Jg6 z`n&M=>)iAjlG5$1gRd7HhcZEBg=GM*rQtt*k_OcWzZ`;0jr@S{u8*xC@d$tV)+4lB zWAO_y{_r>CD07YG(ExVFuD;_`S$2hlS>ABBl_DQ>d>A1<%aEpaO6` zYY8b9==J^-N4^&2_aK0cc7g^K0q^L9TmM18G2`I*ZJm zFNWVW*-e{Li>zsdlwpvElFvS02_`7bB!!33|88sOtg%5-QZ9je0%CLavR3_ErPM?! z`m7oFX$_Z2$mVLvY!=debl97MWCcp5R5a+9*cnFFZM^M`q&~EgZck)dB^@3eH`eE^ z!eTt$)2La-)2gO~u{IjB=2c*Lull3KhY6z)79l}WgS{|eF-RmPFzVd z^R`$Jeka-BVB2_;C1-gy9l`86 z#oy89>KArICl+I3wOU$Bs?y9?WfUT8vT?`+nyZ7ur`FcAyJ7*do04vTo@@qE4zXmn z5ntD`36}g$abNcrW{Gd(hid=)k*6g#@|09=DFeWh(&)jbl<8>JFvuy`cF&(C^`{x$ zQ(l&C+?>T<94cscA_3{1M0V+%F1i?0{l_z38={kVhDI_jr{UKW2d!&V{}bUlkT5IX zouU!v-2eDsjiaLCw(FJPtF{Qs((1JSvf1n}R+qlF)`2l`Gs5hK9q-vya4q*h2wWwH zdoOe1&OK01nYinol3t;W7!=w*e>u&;JM81l)EkfQKlKrZVquQMPXFpx?~}FYZrohb z0#xL#ZEmA`RcR=bFwlU?h@D8-^ ziS5v=@Ui8UC+@Q{n&5q@GQQN-PP(#hYeInPm0y&8ExLNx&BvAS+c3xPRTz+#bAUDI zPZ05*5E08=lOuA+p;XeYsTRGN_|xJKPxZXfnIV;z$6cI-B_(lN>d&=5XN;6IM24K4 zy#~b0oOBj&w!FCKXT{uQGM&h}TINgkfA5xxULXL8D^rT$4o*P@#Hoqe%0-$}Br(6Z zhS2DFu?xrZ@|T;)hcO{YpEdnC7>oL@=Jn1SdK<_`{uuuO`XU&BGz?JZ*4-Ps4xjz@ zAD)1|`*PHPM-Q2oiao>>ragGZ3a7C7MJ`ugK|p5lNANx?3zb?BX*1F$s|W>ED7d3- zH8i9Y=Mv^*Q$NLmWsvvALh2-f9vAbbTOaYdb%G&FP11v7oXYH}4U`eCag!L%R-e;b=&&aQPEh$q#NJ&0- zCDA8`>7;60`l^0_5@QnF*i0lg_Kp02VUN`-#9yYr?Dx&70CuUupD6$%k1KseZHB8Y z{_B${B`TjGR+g3F)pK(}j;)rUtIS5{K|iMLFXLi+UFAzYnyf_{L7~38*o50L6;De` zRPau8N*H&7d1Ad9ujpI%HY~_P?LJ%PIz(loP$y(xo{SD}iokhjb4`s61>whog&cbr z5z^fbc6|PUQc|BKQIj+KO91&T>Z;yBbLMZit)N!L+YDbVcX71PV#jgIfM zJ_2T)u&85aL;lRJlhjbt*x0Xa3b}CLVRUaCoVJV|&B&mzkE!!I7lhFJJ$wTeha6CH z_6>@V3FWGn$Hbtbz)54jCUTfIo53I@wMH*n?zDbLpsxpOpe0AS=V_1D=8T$|ZgVc| zi3&9)6I>-s;T$r5=y+kKk+6zhMjxX&fH*oqBs zfH_bS9DYOJK8@o+P#P7Tj(L2bOa&^h<69;jfGiBJ^0!X#>>5hR+3V@{X>cgER2%bD6J9#0kcOIhqBcmJa`za)A*gc@jlFsuHFGit?Y=Ul+q* z5`N^4eQ)FpEml8SSD)`MDz;m}TS+wLBzAG!b@X=g8UEgrGm?+1pmd^qlr_NT{Sa|I zXxqkjfAQ_Y^}?Qgyam+Rc`mo-*oQZt@ZoFWKmI2r9r#LuRSE0i{r*2(fOj8kET)9Q zgF=K04jors)9=N@iW|6#`ouls)OrIXPCV}%ut4?p6jrPc#=j(!TK0fS6h@N zc7PZ4mMt*h=zg@vT~Pk*hg98#`=6iu>Dgwd2OSdG?rK9EftZ!EV|8f9=SvyNaF8vf zkciw&I0YH#!YROE2ThHng1h5U8cI`>`!6o%G8e+BtWGR1B`#{L4ZE<44hJ+h1MyGZ zLhvAPlgdz*E8Q+TV|a(tt9~{t8L}PP_8nC6ym=jW1R3$|t*cDIeuL&o=XX5^S1ZDC zG}LaWCS{G|g+tKv^0^pEM+;Rwp_rFdf_72g;F%5Y&q8 zK_;d@71SOf*^N6XOPhqz#{?BV)R{fE$~jNR(i-O zgUfJMdxqbZEgoYzsl1ee3wYXEMz+=inu=%`yqRC}3ZAPhq>*LWW53htNrP0w4%Rlz zP{e-Yh_pBwTrR21(T=k>`TlT^v$!%XmOwVK{sXs<`~9mezyao%>Y}@W!y5E~hTpia zyS(^4#|RDZ@C<^7t@AZi? zSLvVysIX&pGV4KesuwTsrzgpTGXBh=ZrJcl55HiH)+$FGvaJ4r@O;dXjq+1l``}`U zzom9)l9%z>S%v|H3M~wm#re||%(3Z~^;u&TvzC-DEeM-tuzZ%MS*FbmWt0{MPkn3p zG>VPJnSmIUt_|n8cx@VHor_Z*90*$K`kz~tqoxZyCS}tpb!q{BfQyDMeQ)G;to@9T zx@8bARY%pStzK|woGj>{OAzMDqYO1b)&ajvO^Ld*a74)(x5vjNAwunMm@gG}-VrLv z#JZz!0d3efp}fodA>;6WyOCcRqXRvT(-P3>oTk$v^n_KEZHFUL4nk`FR+sGI87*&0 z44f17zQp#lhZZZRPvEiU(8;9{7|+w-k`(i|cvt}zzxlo7OIKjQx778BL(K%$!EB$K(CM(H@0Dn?|BL}SNb1x-88nkjV*|U-b zu*#2h1cO{J~B+DcVB3RAc%k&Kp^c9Cn8PMD-PGOv6}j zNsxt-%{IRt!Bdq8tlQXyB&;${s;h6mdH_@nlb48EpM@J58gRi5%Z7|{b;Eh>3`CG8 zhfst$`8z5WTbs^`A)?Yqz*IwT7_WfUmx|>DtZGIb3JOTS)m57d^w;CJ% zBFC&GyCuOWRDrMH1f-nq!?eK)1qBZd_PjGB{Y==Ah^?rhnf!^LsEy#upu6seC&ZfK zaHC;eT{5>F0t9INU)cCWY}SSMc1xz=9emvkkZ_{Zsue(K7_)yI%$%0w?Xhoy3te+Z z&@Q_WprWAm3YjM(eM3!eS13}p@K+R#^1~ztECqi?dnjS|3?0sq`j1~IUr?s-^t;La zdi7n&JdMKRW9_Yb5EOQGMLeb=IR34dq{-rxY)BTW%d|~ciSGZ!&&FBspiG_o-9D2L zxI>LmIsNK8#k#UBUzY`FUp|R1yPHHGVT5cAeGOAsSXP00lE?#(A5P8!hoCc3c=qqn z(a2r#`N3Rr8iEKgb?Kv%sGPsglhX#DdacpfChu?4`PcPp;s$`Afe!K>k%?H9sI1ci ziyblisB)RD`@<3{kHPYKNxvO|SxCEabL(^q?EYQvHanvzqwu`>UNTt~y>`mGYATSQ zzb%uvwK}Oqk6*g6EkqtD85uWP&B+pN5n)HSOAXki)V3Rj`LI|j97=$_02JZJkF>+O zt;l0B`c0O0=&s_XktwAdOxKRXGR#Z@DeOEx(cY`a51Au%3jhrjP-ihYs$CxqC&WT z>#-g@_z@mo^L`LA@#MC6ptR^+dy+1$KfYZzvC-|}QWRX$&^UX!w{j0ygI+M0lAl9| zq4cTMwmQuS%VnvZ@LBqO$1YVJXme-1`KwY9EaUg9vBsQEeadmWY&`JfAW_%l4@ zAt^dGN>7HHX@_umwZ8OhVjS>}$CbP-M5XmKDLXtnKMp<;Yg3(64u3pLndQp8g z-HvRwDJ+n>dqpB^x^+fYUjFZ~u_=-B5q0nVUX`qEQ7~_@w5D%j>ZJWe;-d>c%F4dB zSsu8nu+IAcPc??ivfG{S{4z76hB^(IB7iuQc*A8`erO~9`$Hv_?^}qtdK!L)VMAWK zv;gDv`@1_M`-!_A@t{yYEV~_~A(c%TD>SUy1tZCmsd%xV&^&T3;h+Yh?qKe8W$V%c#z9tp*}#-H?BCvZerzT;-(5zz0nI~$JWXo#%m#rj4Ckr9$joRve}|weY=YWF zj8QsF&R)-phnPu(1pq=g}j|yLs9{p%&1_acEZu^sLgB^T(0p8fcAQ zbYYWWp4x>FP~2QaUpF@kB|s+21ud|;1&14Ps$7aWE zW4U5ADdnpc-+y0Ihl#u10)-uC66DN+#B#yHc~Z21<9ymE*i#=j8#TG;73qMTqq*q< zP<;!U!U`-#i9j>%$EGI)SZD+=SPtl$Z3udWWnCiAbEFLaFm|RfmB26^Oj!Myh_XQ# z5wt}mUJ`$5gD|E!>}QgO2xV%Vd-|CluI^tf<}nZvI&&h03w?CHkK`Aey0jo3ghAJU zvG%1lVL!QdwgI)&*woCpCo}NbY9lBsVquYi?EiIx=Yi>arlWn+dT_ zlbz#NCEsr-+0;RONeszfM_~fmP`-PIG8}rbr2Mw?=0h~2mfw9D8o`qzEN^y=Og}9w zpVup?0ZzxB)UCxkx2_46hp8ENn`e*dQR8j@b&hA59F69%7v%h`O=m%VDpnCST<;uC z<~X6OxLnNb{g`l5aeKvZq`t|#bW9tWWr|ET7glG3N04@6Clt~pa9Am#34gn>jju{u$|%b zcjlKoVGf#eI*gQIPLS*(&P^>5RuVX5?5ktBxn#$o2sup<(WKRcuhA7SWi1aw7Som(1HLO`a&8{O+V zKR5H~8_B7RuNd?B(_FP{%DUfK*81j`*&e+Rb+UK9m*v$ftV;WtY>Xfr#Lx{cyz)Q_ zrbJQ`d&R3;s>D=zEGBQ~@d}XRWp29aUK9<>idwxkz+EsMWriz4uC!_Bet1U%O+zcc z7%uD?ISKXIQWYmjUd0^k$e4ZMmfb(CacE32@@p&M@oARN$%dhUUbtB}@y})veW7T~ zJ#(}f{)Oz9)Rp>8j?vyL4$jQ+R#6V`XYh0^e3Ol$G9l9m-8<2F&Gybptn0(z(S!Y) zG?_iEOREz7S&`RuWxZOZ{Q@g>=nH^peXhMdi2kK0jYTPeahBMZa9Ra1vev2q^Wdjt z7`P}oUlGN9%}>vg+^K;%=r&SCBMjKSiTYvr#}0QSWfy%-SRa|@5UaF!iseXKDJW)) zK9al_YIdD6aEtrWi^CU!tH0@=1h0>>)B0YZR|jqHt*G98kYdDsgi~b5-|E z89{`ECO|pFT>Kd!c?{+t(E5FMDTkmSE;p!1UDv1?o@%u+8p*#-XYo#7iFc41w0@Fm_a$QQgDiu%V_+C{%u%)S(csV#amV|@$^7t1y-(N` zCfPYSKHsmplexIL>5_eB^obaI;N~W!Fdu2MNP1FEO6h6OV<@d?2g%C=4!58ketwwYO)CSAv*T!8=|%ZH?epr8 zh5QW9Fx%dG1LEIYZ0Q4v@Fj!JxQ}=qE(;pQ8^jxUjgkBe=RYzBG!g>Kkb1%xT>jD) z)z>Exy7?!;CM=A0?lB-(xqjAuZ}2cvBD{;oqH^nl$u!gPgSf#SdynqBvX|zPx;+|l z>nf?s^|jL!5X@|_8hK84Kx#*AkgwcoM3Y!a&J8dnyy3KFG%VpE3{{7|W2WewxGmF> zCAz}AT!vruYDQo6T8cdx_XmCx6sEa_pGED~Ju;d|k~qP$axsOGkpi*xhEzw+et;1| z?a>M@4ih5?I#8lgYJHuY(mWryK|KIK7qO9B*KFS6EYGwrb=|woh^4ja++USbem@}C z;7wpp4r5(23d8t^4zRUQW7vsy?m6MTft~XJqo|_N126I*=J7%AIfkWNH}l10vO)E& z9d{yFO$gxApS@iY6oFBY38py?AMbS^S>7{G>Ge9eV2N_y#ldEZqqgP+@AD_t&o{cM zeeG&Ob2_0 z-=`BPXb}=m!uM6DKvU~%X0s#I_@j3(Yg1$yzzyaW^TU9De%skrUX~U{KFgie598pc+?}*Ke%ZMfBwMAw6ry|e`i{<8bw@J>$@+B z?Y|kIpue{#?SClchHDzKvRisY$9bI<(?>@!$=r-y;CTyB>$E&4cT)&0x8O_Q!wg+c zVB@V!-Ww1OtF~M3U)|N55ebq+@vbr-z7OgS)+_E;;1W?~@Q$buAp7aeV%^C0uy7Re zAdSB-ds~X2_VuzW%?1b3Elf%J0uTNrRNB8wbC!k#J%@Wt^;V;7?CAI6x7K78Er3s9 z*(?+Z6$DiWX1b|w>RIZi-LQ4=WU}{s{ZEh z@ytK)R1C@PPwNvZL|!ar>TBcb?-+}{XV zv^o)t6co%vxF->MsXOu))^`k$j<6bOgLt{kwxL0b@0qI0ZUzD_tabg zNywktMNh`%@Dp|=kh$<}_{H|K`AeKDyB{TPc;GtI4A9ob2C#D!WA8(?;y6H}_MMZH zGeG$)=lx~hHS9|IPw3qw+mvi zL)YT3zb1nSBx&xu@f@Q!jxnJMTqBKHL_p19`u_EZ!8k6#duO0yPE_vn_z_D5*?N9Q zSz~cwZ-o~JshQCN8bV=^8`SN+mzOtOYrIKTT<7&;r+u89u>9Wd{nxK1khZ?21Nk3) zH?*<5O*11>SrM`W_wfpnC^cl{9SK->kgQviWh&j=+-`(9|;*U?5lY9+0|`3}*tL`MJg-w3wgDA3P0U$g%Ed!xgQ=#eL}R}<>ha8Bg)kMT|xbCn^m$UenV^7d}!H@ zmP*p8;s$aQ*tavch$91&r|ilg;a542@9BthhE$NJn0MeKFb@%1&m>mmG}4g;DEmE?Y4&X7Dw(lRS{GvMT&?AOSanpD3>yGG8Hh?8%M_K z+&di_v=^^?FsO5L;bFNe3Zr0d6UHT2N~-W|AMUo$$cuYV3a1I$7sK4UYKa9zu7 z2@xHg)ldCQ^RiLj31P*~O%<-U6+%0;j`JwnDzHH#JU#}VZ@r@~!U-ZZ#_B|OCiK5( zweyUV?M2&MEKwQ!N!pXL$T4;@4din?PkQXB>#QXodFhDjjZA=fF`P}`*g@KY{eWuw zMx33f5{3{HHHJ)|DF7{GTp!rB%ZJPH*H5AY#0fvq`)ojy(f`VR?1DxI7!e9zCBy+b zejkYVePl2_HLpuGILWsh6Dz}n6o7?*6QugoP#Y`JJM;ZlL7gH`aq!E0#zNQ`V3D@B zvtWj!vDMGj`mw^NZ$H%WH`L9CVjQ84{Ulo^eR)g&svYf=#800>94mma^7f zT+a03hxp96u|M&X{&$|63o;8@Ctc536bqVj;zB_hgeZHG;n=LL?*OaJ*h zI&+dHg{|YOPyBIu25EF&K+N?KTHcinT-5OuC-iCcTw*;&C51t{G)JcN0$wlJtZG*k zUrprZE5a;~Wz%V@=_MgKD?E5~wCIUk<23KY1bd7s!mCUTCymfQ5t00fz?cqr?g%S{WNsD4Da(5 ze5=4t1U9t+HwL|hv73S5Zd8soJKwuO#JS32*->k(?+9DYJu~OcNc`bDEVHLFAx*aL zDC-B_*Xa|1_hK&{>&lgE2W`@XRU568yYpO8nsBK=4lvYM`Z{~A%Q~V;(Hn8Un+#6l z^X+{&48rpt_#g_amLB0-1tgX2vPF<9yWE9t_r;!A7$3&d%}UcI zit{pS#lu`(?bN$M!))J4_H6bnD>s*gJJ>hbt>q_wj#IcnuB}eoPQJ=&PdfyIF(c+B zH)nwFm_P_C{68zp;m4fLfo;((?IZs>FE&L@1rhsPwR0ly`p^`< zol^vW1R~0!Pa>Wprb+uU5!=z0A{`cJ6}&rDPh;wMJcB|zqu3iS?AzAU^l6JvoBEr| zD3!|B+l}{1+9GJ4n`~6}dUOYu1f~+bP6qexSb$p4*#jSPTPfL~gU+hQ5;VA3h2l=dP00_vyN6tnK@g^@nJFtK<{ogL$n8aCE)2RddgeuTN?Axo9V1r6i~zfMmK(VPnP zU|*Tm)Q@VG7PBb@2#1C8>4}{*u2Xg5w9jDl9cH~#LcwPDS?A5@ND4n z+Mn$apODzQhd!5jSyGZYNwiD5?g;zZw$Zl+0{&xIFC~l;Aiq;yJ2Wz;#VGr71yL25 z)&`IVvld3-h`~yq->14pmyw~Zjsr!98nX|M(^qtn8jiA;u|QG!)ZnNRTU&Nv<(*%z zXD*`8{LSr@Z4K?nM9a$oMlx#QhKmNQz#Ari+@-q?i%0yW+SImii_4|+pVTOh6sdV6 zVrzbAEGy`Xb7X42%uL0Y1~aD|IM>T;=!hXsG~=chky{?o8ZA1vDEK*9;j! zLBY8JHzCsN!ak>NMMO7Pq}&v=cCM9r4dvBt*Nu5D`lK?X#gDp%mt*w@$*>b;_CqX+ zpo@{Gm%)FS5Ud(^c%}NRontJftme9a0@`_&1jeMFYd&>wEdogOj3`iy8J`BetsrRd z4<=7%dR`r+b(k||29y1G7J;hs#73x|Xn*xRHV$VJXpJP8RLzP1$Hy}4J%TR!w6)xj z(Vf{-9&Rb&kTYx@VIz)r(>nZovRKTQE{*igVt)F;u&PW_Jkv2EW=j;vsL*t5!&jcI zZ0L6U>l_wZ34~Fglc6Rm_|T!W*A9D4EZ2|14n(CV%6SdivSKc1`P`qNJg~#CJ(3%M zFb;H2O&%g`06gH-w>6@XR58OEiWdc(l-M<3FmWJ1d3tMv%ZTEhq{j8e5Y>})raI-d zf!m?gk(I&Fj|L$dcL_YDkK^_NZm8Q=MoxNyow)>KxX5g}EA$fv1@T^MJ-YEj_0q~X zkBo2mxX8PpfC3@ROK$dSX;uS~gaH{I0BOJMI&ycvBXkFd>3U>({QtNia#@p(hvM@1q~x#vuN!Y!)HZped`=;bYxx1zh6 zEyE=%M8A$-v`|-k@Y7BgUQxt^NLgjSFkAiOGIU#vik!nFM#ma>dTPl>&v;3*Q45n) zG?$(kBh24c0oQdPMpcaCi78@NK8ie{v^9T*skmQXb-sQA*6R4%{p>POokaMNGj6!5 zJTun?RB>O#gXaM_262B=u(W2l+EY<3sLh~{zPraojUZ{s4=Y%b5%xAg)SBllLTfoN z@bo@)C+E1PG3;4TDI!l+c1}1+5SmpmquA`ObG_t~F*v=TcMJI9gM_H{6e|+&BY#4D zT|<{rkmb)`m6Z0lU0=w9ULb8l3P%+Yr^(e4q5dgS22#Sy@^+8tpi${xBsp2|-1t5zj9VTQeUyPJV4#0MH#;AzVA#&8Oyp!dw+}3MsXhpsrsVEMUaIzDJ zfom1aOOe9ezv_sDKX(j|?h0Ipj8h)Q{)z!@{ z8hRUs2nz`c7x@R5@7RXGWKsV=RDFYc++Ead8k-Fp+cq29ns}l{jV898#%SEww$a#) zZQI73_j{i2-sjF=Fz5Wv*=Mi4*IFCe{gXj(>#6*X#wzm-kf%-Te>K`%4swUX-Gp6E zIZT;rp1()=jn%L+aqlv{zTvtD&wOE!7ZLZqI)OVTZvtl7j@Z3FQ)w$vBEA0x5Q`(L z=<4ZV0sdGUexnM-1oeei2bs@U2{hq8%#QHLNmijFaiV#)nqNxPJRuypMvQXy>OS>Z zY|}7&ukrNVUmSsBm};wc@O6i;Qk)_*|M&qHqDQG;T?@)|Zqo5RxUi;AeDXgyku zW7q*}40C3+Pv%MzBj-4|SiPXgfg|dutWlKL}G;G){2o)80RVA6+wbq5dM zi&Ttm7ko?;&be)d z>BL}6OKh9eZyd?=W;rko^cc|8%5DrIp!Hs|)ti$z7Jjq+p7i&m&S{X2BV0lFGH4(} zX+6+DAf7R)v7-y2JR>7UoUN+Y^QrzSfi_f{Zu9m@6x!2JnxKNb{~rkw%@=!etl5*K zAfRTSMA#4Mxt&_cr?aI3_Da#`BF09IO8Bh~{EO27>aYy^`4#)bcf@lg(TT^8DB1X! zI`qpsQCMr6JJhu~13!IGcZ&9+u_&mK__0qWAL0*JpXV^%l-hcFdMOVG=A^BC+!6`

_VxMl^2Vp0+392ym{!`2J()kRF`kJZ~mO#QC+3^WoyEfc!{`aBr8pJrbyth-ZI@ z>0gyOLmJ{#+Ud+~8SI(hDvmSt8J2kyaIX8RwVr&3SkKV=c4GXe7{s<)28D1YiE7<_ zpI+x;;bd`0%kORKlf{7__4pl(bvS3Li>qQroDvQ|(+e~3Lg(kBuI`^?Ed5en$2W=Z zJQ?C?0KTtVMgLZomzhcRmfYeU*o>Ipe#O&_NAU9Sz!4E;N!OPA#)%>kNx%{~@opgf zft|8%3h>}dRlsEA(MhE#PCn29)0Z$1v=r000LSpoSiSW6O@h7O6I@)Z4`}OuId_3P6aq7Rt{zGK$;<%MR6DLZ(?g4CeM`jp%bDH6uC&(y$(}P!%oyvuSM6 zC`7>7q|o^dd4S&C+-x!M$0SyvK12e6WKMtkGD2bvq+)@loPKr5ScrkiQM?w|p`!w4 zO4Lnf7&9(dLTm01tJgxCiQQ2{Nce?R9yqSg#@h*cx3SdVRsj|UReyuY22aP@rod`$uj1Baj z?|Bwsw`Oa4=ZQM}-n-w>J3s#Qz%@4pr79x^MQ{UpS)CS`Oh4GR{RYM|bUJc7-U1yT zrCz+47a4Xh~c= z6Qx<6tV#;cbcFlJ%l^IsJs5iq&yNnKly72he*TB|=2KFELMh~d`(0WfK3*O{_+6*l zlx`?5caA(d_1vSakFzJUe^RBoOM|{s`&)e_L_lmFB#<*t=vf3t@a@M#ec`&C02}Zt zG9_H&rY{pxIq?!Y8|{s#>Uf^M>fNLMJ8MDCt>Nyw`^_l05&{d~-+G(rRO}OyunpHo zQ>2Aa0YYcMA0}V!V=w77Es&R#tLacz`|*#Ew#hzHzg9T>#^q)51Zc#pJV`sFxUa{m zRMYk3Q3BuVIZ+*tmSX+Lx4wx4rY0d0LZ{KiryspxdU-)4 zu1D6|%Oxw`$BIC@*W>Jx{8NwqZgwLYKJLTiU@5^t#ti_YP0P@k=68`e8$p{67QCeA zlL9|=OL=i3AYzYH6vUHSDGyvMm z6X*TE6n71cU=jx^<;aMEkgQ!ErlnZ-``K}ZWj}FP`k2_c$OqzgWbhT z$v(l<_m`&4$0ZN@ft(Hy5&3qF`HPcR1r$D(7Rdp1Lx)2hUrA+zZtt(vjEsOn)qlrd z7NpC?o~FgMC>85ekcWN&uhSV6)`NU?-gc#GoExV6ue= zQ^a-Ms>elf!)(CaNe^`XJ2pNrQ%LD-YCTu#uhWULB(wTku#ooiffWof_9~`Nk-I^* zZmo<6(9nt3^_U6eXt^o>0t0Ss9b{xxrC#Z3e{pj@%0Wnj zyf;30*OiHbBhf32Ugi^zgRnO?{IB|ugSoZHk|so(axv=Gq2g>$?;4A2$c=f0me7X5a+qquNmnxhhw89~f;S=XL`BW`^@1 z@}y^@t@?DM7Q=c9-8UxnfqNPUBGl5Z7?6pQUdy;Hufcl-ovjFMt9poKzo!AE z%ZIVSBoqIlkyv%0ih+VWU6}2z;?ta{qi1@$B{aWYx`B@uIPr@B=NSoPNBmaM4E!!A zd7JMz!Bi{@={*n*4j-;En=kf)Q#t5+z>;D(YTP{|$&w0uY7QER?N z06ILx7r`D+f%yPRD9e|p$Z_KD=Wc%AfPP#xY`}5B1GqMWPyOGQ9YfYgEYIs8&pX<_ zHiWuu?rOKBsC-*%v%U{rIthA(RUF^4%B#oSjg~2PFe9S{R8Aq3^~jcG2l+vH}@CC zs053uPq_;b0;wppl?ozB+T9uSL!zRArG2a=W;>UL@F|I6-w$2_cXu6o*egD$qUSE+ z;K1GHT9ZSeU-)12hr#{dF}~#h)THb&Z=c6tbVlbvCGYcCvW`@=t)d_)R8Y;MdiP$M zS*h9X9>K{)9r>B(KNGfAq%j6b9vn?u*lPhjKvgh%c&O};c`^sjKWLcOfcg7VUKd*a zXC3${p9%NWe@3^u>o&k*)vDy~{k!me`LPbM%wsv}P9xMOH3{4SH(O%>+w(}?~P#pW2Bdgnr9v&+0 zustW!nlA9~JlK_n%=5SteWlyjEOR+UU~6kl4}#p$0mONEc@hj3?w3&l-~&y4#dF}d z;mD|S9&WGtBWcw02BoCASEn?gZM@uYQx>@)HnBd3D@c76T={)m1d0I})j$h2d@LAdYIXE zVE;f%TNeycdGGVjBh)5avgW6?WgsF zp_79mNm$3w(@ZPh;t;FA#<%WIctc&IuX}&(9~(}5Y-!+#s=*|xiYKEtdw6?WOO&Nj z6=vwTw-6&1*-!xfM9N_pk~q(if{cDk3%rHh(Q^X+d4m{$I~A%SHwXU=Oee6Nu}sE# zLj*SkcOL4KrgdOHZ$R+b?&P4a#SzK)gyX#iZdS1PiuU4WV1FLN4*~ddr7vbt_69nj ze8*ufLw|+CSn;OwurFfI`nlel2dP>>bJO}i?e3N))&vSn>c5~*k8O6tw#6nCLHHwL zzvKgFN5^zcq2(q2^lz%BjC&6Yr#G@Y5x!j3`NGJ8wO3~xQSz=T$KoQpQN?G|xLEbK zTC{PjsW}U4842=;!9cF0G@$Jv0!~%u|59vvrs*jtC>+3gd{K+y%0}!EF@oL9mE zH9GfgBqMlx-`fnRS9HXEPP!Knzt7jWr<=oH9jBe`MzG5debv2c(7R%ty!_sK`jK_c z@Hi=dC7;ihk}ma)wEE3BUBh}1m%>EhY{)UdYSow2k$`{$WlEi=3R}Crw;NqxVs4V# zcb5rL2kSp*C&Qm*5aZ4STVqBsx*1eCcv;wO?rccSn->%*L{ffJlw?T*OIl>Zk~ z9Uld5yk~`K4z^{yNYK{KV8W-b)vfnQleM64Cp$Hr?QRVsY&-h}rSb0u z(dyt}RS}z~gTdze_pep`PP;{kw43{U(oBWl)bsS9~~M?K&+5gPb?6@Vlfk;9o!&B$i4c!a{Ncoea^S zA0l1?#kJ*1+kMje_NnFuE{@O|1Ohz}9FVlZoH9%_>vCN@C9 zS?y<0R`O8Rq$o+#S#{z`F}5%g!A(L%FMjm`3Zw;Bo*OL5lK_lvWopg@sO~bqLbIwp zIMF@=dr#kPMPhp%T!&SILPGp54pB)}50(U$E*`66WUEK=S0SzE9sME(OtRrak6Q(~ z1(4cDlB{ZVZvdH$U`~kjh@noNDiV27k)a4X?`(IAV7QyY_Q#_YrwR6KwJS z>(&z_i&w2&L+tm}Wb?&_q`JCgw0Fx&X8qYz%8ZRHAKaGngH^8UhczpR+Ar+;%yN{a zAwB&mPLA416w*sti=sm;nIGhW{=XLM@m~^x zh*?nte)}dE8|2{^W@a$g{662WF5J3TZ+bls1vU|;{622CFWN7KJuzgOrj6va>2}Ry z|4{=zH$~ov`agHZ49x^m6xScb9ULzB{@Vf>=9P4UKZUuxze{6&ASHgEs;=k@uv;OF zrW6sRorrKZw;nuNat>JsmBd(lgRxV=YliDSn-+=A-VNya?ncwV$xRqLnUb42CHyUv zCdWCu`v~nVsvCfhwGEbp$+Z98m{tM#n$_f?UM5ol6kQOGPEV$1wyv8IT|g5T#WOK! z!W~NT$iE4yEAMp`%LOqjEC!1ZcU)>CTYuu%37H!GOlz-&K3#3sWmm*u2Ny`rkdny& zBA*N}1Qox2p+xC-f(^}r1uk0t1|s`ZPamEXviOwVU#_nkxZjr>8F-*9xOII}&iOn$ zNo|~ND1ShjeM7nh;A40n#m=wHK^Rn4Y6ZJ3Cyp%n4So0L;^JEHqv$QGtPHT3z15vO zeloX)@eyxa-VQ=`w{ctKsx2yY9Nhy7b1I-mqs@-jUJG#u@8ezb3=7BqyoB$!vDq3| z5k3odL!c>#Wv&%@pQZg%-+tz?am&sssE@Dye71uEHvMyi>8Q>}(M>04lnFiNp&8S& zY(wGkh(`zf>vvHIHqmFKfpb0xyB~ilV4Kiqjv^U9SRf?9_oYd59)}5sej8U2nUl!J zL8!+XPkuxQ1imXcd59d5tPhI`NY^wqH*ee8dwuJ;aH$Szzi2y!pJwqnmanO+gS2=5 z`>mqepv!xi{ac=&7J4kW4k@544AZ#z#xIe2Ab%pwOc1a)7Ij`gg^;Wnr*sySbSF^EEwIqt>Pky0JStmhGM$lbA>^DVbh^++i z9MoheN?#P0#%A3Jz-$_Fg}t4Qub$WI!w6*zzWD*EME}^`9)l_|MuiE)zryS4kI{#L zot#5q9wdvYbOU=|!yNT3)ufP9WD4ulSzM&WkGmZ;(jRCnPo!326K$xyJNu(~mAfD2 zuMP8k^`?oEJl7p}@>)2Xv#q(Jn2?wz)doX>PuKIdh!npg~mjuE*<+! zFryFYieqBG)BpZR3UfTa7F-iAp$eTQT?_1}O0 zRNdcCjj98R9?7%ewJg1`Fk?SiE-M|l)I^@VdGYv+5|CMv<1GjBRPioO>B^{?!!_t_ zt!kHWF)=G&+JYPT!jB0h&aw4ml5e_i0uhoc?Vyz)dv83Q6dr&5v<(5;PM~tGEJu*3 zIorVM*%^D_rz~c@Td)=prRQEDtdJm~IU!@IqoDcT8AsEA4Kt{V14Dooa0e+`(TNN{ zkyw7~;}P=*PDBN@<9TGQgZAEstCS{^3`9c6f|Sr!cyy~}#3HwVidYqzlmI3$o$3_d zQh@URacAT-LkbWlf|LcXp}lVsbAsRBeOhiO1uF4$#%D}DC)~*aOYReH-6&k9Q!gjd zMXlHmemmG*Cn>rJsaBl9N~zCJdhB8DI1Vwf-Q-BtGZiw-~2wi=T0)}H%nz!CqiXv@HuiK!buhkJtN1=>~igH}oG5F_Mv!99mk z4Y5ZHJM`(Hq1&4i#*SI!`}!go=x;_TD{k!H4S6G|R>b~iTKzXNcyUyzSFf17FSpHT z<~sAsixDSLKg>;`w0OqS7N_^vMC;060=74*0%@0g(M-GV-*z18u^6LIx?1WE;7Rz~ zNeX5cj4kLf?vf*{z>+&1-+a-vz#9SFCr|NpgK3pZp-|Y_Khqf0)KqX*-en1q7zI-^rR%K42B(T0&b6 zQs@m0D-u&U4w{S*X!l~Bv$5&afJW-BDLY;LN5ZU84ub!awv(bNU<>;>JU&-u=t%}J z9F07WJh)XeD;?CZ?LOpU(qT|qoVT(-aaERPm>c?O8yLaKpX>@;^uhhFowB-ov8)h& z1J-1bwHg)S8MYFxfqu6TL@*%fM)Hr;>(9AS0`fw~=yn9{-?wB_a()}Mxz~fnKT$q^ zm3lNK-mqc}A}nZ=gyz^z3>Dn1*o*9Ux4A;tig<~Ey@33uCt>?P_DM)P8b}8ySEu1i z1ug=AYP(1mNr`-+lv08dSENMFfA;}bZHo5AAgUCU+7IH?FgQi9qE0dyq4{;wE0DfY zlQ4B+wCkT`PX)O5LYuhSucdx%)j@p~> z%SBqzh?c$|+6v@RI7X%zOb6xrILOLUB~=QOmLUNpORS~ak!1eDq|MO>SwF{?G3Jd~ zx{p+k(A4b`up49(7L|^>kjBugwLW?yUcaROT-ue63TZuKrHVfBIeuu?-)BYVOu%gR zy@j>`xqeAda^xGGx2hsKTYVP)WHbyaT*Y24EE##0l!0-tugPyk0Q=(_JDSgPC53|_ z+r!bPe@-Ptul0MHkubh6pe^yFKY8p+^aHk3^dr{uSL7X*!LC7@Qgh*r?fAsmm!P#WDb_1+NTD5Q{Q3DfO5j@UlUq*ZN%EZW~n?-DL#Yda0d zp#?kf_0O_zGU&X5rCG*{4jZ~%MBJNe-d%yyz;}Hw4}=8@2C%(s)~2R92@hoS?~S!- z2&P~6G0*=1VUjx`5ru53974emu@IL@o61xBYhICmket~ zEWej?X*BWXxRby8M@MON@>;6IlQtS+U}^lN&*{Z+3xt9aC*;O_by1r6CVvb;TtR*j z%~|W8x7sdy%1v1H+~&@N{P^%Sj$yp5rl}PnLqL{6)JugrUv1DTk9pGmV5nfm1T2xz zbn&8mAZc_MmuTs1M?!IN!QpJH#q=Olojf_9W~{bP_t&O}di^Q+V|S-s$8Yz;HXT?= z(R)H$4{O7R!X!}xnIWx7_1lWvEDBXXx72J}69&^oDiT74d3+;SAIbEu|^`I3NG$Maead9MkPAGm+9M`|It&{bRa!>UP%JvX6~71?un zbKWXmjb}$Mh85PA8tfHB#%HX$T%U&Q+}tc?qn=37>u3$PPbw?!*GWp!K}7;`lm%~a zS12^Y@BU>aULkO?B_%ZhmSNaKL$fYxTg{e0f>fB&9W5rTS$pIUsl40N$u= z&)pH~9cMjT--5;r?)}i8;Snk6dF{#v2#ur|ymLE#FB=W*Fe|JORrms5q7^vsHryY6 z*5Ru305Yc*rv!lgX%(0mVfjhu#cKG+6lzk!fiV0LWvaYme+M3!ECWLV=-EnAM@3r+ zuJeSK;W;UHrWfgy)vBW6PatNK^VON(-f74(M_LkTVMa#RdHrbT0p4jQqkvQh)sYu$ zVPDT+e$c_fI!5maJ=o5WfhQc8>_w!l=mlkPp29)NT=T2a7ND=kv(l{34X1eTcy!+2 z^G&6b7&Qc35&yQsrpMqf43%b$#Ay08B#|z9U;{(?&_(@0ydm?g2NAWuln$P0l?1u& zuaP;iAb~a|WE#oSm!Z^>HpEK{Z$pdd@GzqIP5|O%tT|SAU-&tF!oav}1fUXozB`xM zk#e`dvWFGHF%JhSHk6Tkl(_$7@I?1d%%>4M z4oeIwuCKpE{Z$8vdyJ7x|mim>54?=uEIV zb{~pSQOI^y;{dk?CBxet2Mig0oS9W3eQxczQ;wcs{0$3A<}sG%#qI_mzee_%+>Z!=b@LLZ%pPJLlX^&?UFTZ;4_C40esHJ z8|utE(=w)`WWYrIy9{=_`HRWpH6A}u720kb`o1h*2sHKj=KAnJmN6nKZa}z_k&X!Z zc~1EVe1IL??G-1L_cg#y4{rlE1(d^n@}U&=;7a9Q_t)k6y)%EO&L1Brg32oFrN4$P zJnL~aLK@g+k?6+P@%bq8qIOdG6N147sC$uVO7MD(3&$mvuR+y-WLu^0E-9LGx(f}Y07)G@V*MHk{a6Bmpr+gN=rr$^$x^~9y4(W z!@&716{)#$dlE6FBD0K@I(a_y4<44L@a-(1aSHtT3`;Hknpe20v^PS-R#yae#2g|j znWR02Ewt-?PuaB(x_-Lp|4Pw%OTy1sQnGq3o|VLxI!L|UL#7zFd96`L`~sClM8F8Y ztTI8ZGB^I<>fF;8=?j3l^J+W43x~OF9Kn~NV-A9T7rr7i85z{k0}BJPZ>(!Reg?p6 zO*dcM54(6#b; zOJG=-?z@qb?CwZ{>Ow#Se!Y5;SeumzqSo1F&^~wO%`BD1@m4RMJr>9=SFa#9&#YRm zpKQTk)RNk#td{$D+ncYg(TJ`0?XUW25HS&k`s`V)71aonq8v zwlD~=T4vS(I3`M>l3PdxudFN&cf5y7b#Em{N$PZ+$5JC97)VgBC%`WZr1xV_3Lp`$ zv+(|btsLppegi{-gLifzIJ2NND{Ua{ zMB&`f^!0qUZMV#sZ?7!h=NU=+2x@7XG*;}gxEiPTWlW?Lx!3cW1%cXP#68=qYjs_rrw#GIxqN~9DEMbIQ}@DL25PeIgtHU zRZp+Fb0lU6YL%!M99_2bb5^1^tw>(`1NWumUI(BPa9?SF)>xKLo0EY)6mZ*AS=sPs z@NF2c*HhByKm7}TGn}GCO_^x|QM2KevGb3f1<*EZwp?N5XH{tg4n~FANb+y^ud9yy zM@??7#=gl0JR)`_#G4wCU)Gy2sf`r}DSyy^7V~5*>{J zP6oftJ3Yel%K(7lFAuD3qj!XkJeH+<#+V!B!-VNOtb*PdzgLYqhyeBXPV`?A72?=D z9ynX*JRrmT#hx(24_TwS zR$^dVWtnh~2UJwjn>lre1U`gK%3ps z-}2NorQG;uO?NjZ1dNsTT12pnmNYxAwun%%ZHKGKh?@%BrXhOpVHDXJmQ_Pz8bn}x zii2740j{+!Q*vVV-Uz~#^pQaxp~qg!FQsyj*o2Aj{;;sft**X=Zzcts!Sr+EP6F(n zi%{7-uRY-<#Ef~lrfs6lYM<+BJE6dMfN3_GQJ2r@iOCYrv~at!Z#^qtL?EGD2CvRy zN=!)%{a)&#Iw|#;4rx5Hl0QV;xL^LEJ$0kb&7Xwjo50W%^1gY6ow@mnvwEH4FnIV& z@PgE;pOvu{Ow;IlZrWc~T&RU?FR+82o6*$YKERBK^Qmq2DWB$dtnCFOzfy2jM6#Nk zgwfRgh8l}=X&K?VC2JD__iI$+Uz_TF7K>&*{X*-iwJl`}b}h`=JzvBJ_5UoaJz5sL z6FUJ=e+R0Mox}&&>N?^O&R{1~_ZwYKwaN`A+cP`X&u!r+#v#x4A{PF!+T_KZUj*oD z7YD?@V&z6fwfM@hJ$oF}HQ88I)3P<-E{z&;6QF{p?0lHwD5mYtm>DO9&xYAioGIXC zWQ7DNIBw}{3PF2TfLDRMxWwqmyc+4TAfq$0|_G;~xNBz~`0UkDn> z*0ih_Hf1a5fOM`WT`+<>* zid2Iv&E&C(!nzMDJj5)I%hqnM@*AVWY%iro8qO9;fyWI|h0Ag1p&(ny5ot>4|!s;`*o-Zl?!gBWJRC$dXeWdT}2y zX2vv|LftJgP^K%1e@3SeZ~@A7Ju3ulK-ab7?Cx&+fXGb*w3Os%p>=K&G-ejMc;Tb7 zQUW5PM-d~vf0~g2AkxtI$`uE+9quBU210-FE6e7b4fS}Znh7#5{BHZj* z}`<`>+ro zsbF9TAXmV zTJ3~b#>dB_8?f;ZLohcO8p)@~jed@>5ZBu}+2uHg*s|?!koD}Vj91~dTUtg;&8Q)- zgmye%Rv)!(9HtuBp+PGs&*}Lb#-GUPg02X|LCN=UA`$r0?pARQqA)6K6l6lanDC zvc7-I$}AYsNybW*f(@`>BayWs@WxFahM0B~AXRvJW!G{ELa&jxF-y*4XVCT@TEw54T z)9(?2{!-KHm)HvYVD|!=B^{*x!iK_SsyXoUAu%}c@1gg8H4pC{ZBV&-REKW4SgTsN zmjI0>`rQzLMq+-Na|;PbQ>f1_TMM5p$dGPb!PJKlttXk_Lwr&5vQa<&sAJl)87qk~OrqxHdS=gtrU7~Db! zn43K~J>h@+sa=c|`T1t_pnKhz9bf8Y@dtnIjMt-l zTggEPUvzbx zieggZM#Lzr5FApTe-4Kwzx8QgNso>FYbaG|Kx8a19=#U%z3mu}die$h) zQjt@f*GwWo$OxPf;+6Q9%q6!GQBBXVtjpt^U!2{GQQ8+u1!qNr6b61BIP=iSnP-Wn!+Q*~DSzs6_PE1_Xwb(miXwO{ z)C=)G3_tS-C%@MUjZ)81vC5G%qh!Ttz?Y)kpUlnGoOBm3s>p3AIF4Woc zu6NR9x{UhE&A&1yFM2$2jT<{)nMyvDOT2rCgJb33ZSyXQ>iKx>*KFoyLD!`727U~? z+jE%hSr#~uXCF7byi*W2JV%3)<$%}Shlx)xFfg1vJTxBla`N(2EUDPI&?(p&C{1)o zjQiDl*N&~oF+3*KYPqUWI$PBN@z)5)OSdn|oE+V=$V!OB9FpJ15XAn;{=CPlxC4&l zv{MNA=%v##F&3nQx&BON%IS*{G{DK z?``}AT|C;|xG=BA`!%VF;n{{`iiEVv5nuZm6`Q#x+oK0R;66pZxxh;10Z3I1CaMbW zkUo;UA4#V$3d1wX*AUofd}#J7kFBC{aMWw$((+qZ?4NniYdRc_uMwgsDwt1w2bM~Z zHZ@7Luj+84p_O#-xgKzKKXhY3Z+$A1~d*s z+Ju20F4OuX`|m&(H#d126#MRXSNR1b=oBizFYc3k1E$k27j->5?A(T%#0o`Jexg)< zbSS@m{TqiIJ;gIHP!ggcu~lB|E`w9wPi-A$E5LLefh^CjDsumBn2Q{}mO``Q@?;H0Ej89Sz>8LD|+-_&YTpZ5$@OInK_%z(yOaFo-?=;3$2 zB3*Y~wZ+VE;8noYclh$YZ}hQW)BzyZrh!h8NrzmaXAW2K(M+CG167KCnXoX&@&t`u zL1-^%9ZPJ+l@|EuAdK!yh228VsdXDZ$d>o0O?GCVV=>XH4fxV2H zm(#2hEcgt1c>{K9yTXti*e#v4hU^OGuaS!*BceXXmJ38JGmfC0^B$s!Q@B5SQ8vV7 zl7$N?$!fiWrB3^8d!8ZIP5<4+PdcA*@V`exs<>qqEhT*P;aoGt7y_OzFQhMp9j0r0 zdyv_*tB!gOB(I@)VZ<@5(z={x%O^L9jtQ<()$FAfq^R*(7tHOLR8T~wtc(4rEBH+> zC$Ax?uz3Z(cq|#*TuHd#sPy}ef_?O0)Af& z9z1I<_#gw!Jsmw-znJ^C-?dW_)5LU-ayb?{2Nl0?l~@q{`5H^C`>>{Gpe1KMaOweS zfM-~y{|70*><3ycy)iW>cdoOKOVQTmSP$*?ii7YA?4f=coR20K9`B$4`&R;J1dFDOSoW&dU_-s&Xc0P~O*Icf5BZsW3_7pJw_9VokkrhqNNfDQ@AW>)!$Zo(wbm|RqxxP{o zQ6kAy@XWWAH-s)LeAKx^r+h-a-iZ^O&-|O$)QuWIN3X`t#D28R1gXK+mb>ikz3`Bq z@yT9Xe~2=K=T0zE^nj%i45OuW6~Rv`N}Izil@we49;n+luWuPIny9^0aJ!o%h*~jsQD2qm{ zlIpTQJAsf^41$_9tq%+Rn^tCuH}dy@O@DXOX_Ey^;1q^*-Zvd(SCkdZfO+F;xYG-9 zbbxDRYQ=eRMN8ZXJ%gnOUt8&0=wi_N`NxfM0GBXV78{G=0&@W)TV{R7?fxJMhSZ{2 zo42?QI}__HJEU;r&_aQ&xU5^N8H*11dkH^rwB?yP3A2pF*>QS5=F%bNprED9XV!PU zpWLXGF*3zVfTsoLS#r|vA6;1sreGPdzrh>^uL_^y77u@+O(1I%1xE1ee+i%h#k-et z9+4a2w>f^_8t5JEEnBOx6HSiET=Q{7YOoE?Moz`Udof#CJJz(kOo?D1 zixCCARDt+D5ouX&rE4Q61Vqvu(K<;*Ig4N%<4i+9Amb9L>8nu=FP}WF8ide76$bCn zL7c-dPNH7i96ecpn?++35= z>YgvX-TRtVw-!gP|6DRs_l&IaeEgOEa{K0M^+?`UXEM@D2#)fxXfw%PW42lT?S>fz zR~cKqb=aOwZU>JTwl*d5-Vw1eG3t_%e9$Qo5y`hR(b38?{b!jGDOV-%kao+|d$pF> zZy^jeptroY?vZ=IZY@BnmqiySsRKN(*8z6&%aXw} zdIRn-w<^V+wb^k?kVE>i(E++fKRi7O+l_Qy`Y-zZ$cMHYo7U#7$QMuLE#lV8>^Q zuN^t*z+crEX^6HEYm`=i4xLitF`gFsq%Eaqz_ovPNP`&% z9-g2sD_hHePaBfBa_vPEj2)EFsXgTR8lil?1w#9>LA_UyZ`a}8Im)Ip0;f1rX+GEE zy!*3{nhUb88UFJQ-N)N6q_W2EZ4^3W10F4c|wz5g!K+n_Oys4%1FB zGvfEgS};K{em`O$3JRl2l@rjbbG8rnKm z!yO8GGob{EPI)S)O^6zROJVcU;{$VRxUnx9Yog*Do4<%Jgk89F7Ye9UK$ikodR2G4Y+;y@qp~$4*xK4=ZNgLa3)Ac~r(W zFH;x5(h5T-&CtOPSBt%^aG&-bSsd7U|F@sURA5E7>36Etd+9IfJ?`9;`^x=b#@Nf> z5hgn*^WY-;cF2zmbm^moWqYGeb(Mc9WU^)K`w=WAlR_Jsh{UoSeePKd_uuxIc2I0qPX`K*yjoiFCu*)P*V8 z8y_i2)tiz+X2nZE5CNnv>|ZPg)2`#m`7NEfhPnF*NV-)(SDV@F^sbm_R*kG?3C z$b=6V5Iy&5YLr`j9rZo97@p|E5(Gi>Lh``l$2)n&N{Mlw+%DkYigDkH>AqTZ89XH zjxIRN4Gz0)45qwUa;B3-^mLW5PVRxFwi%=Egclc7-6W9mcLbtd65s_=IB)#|FHoem z$CE@50GKvG=wC3=(EqJGZ(jJV+uf87YKsp_u$!_WlU2c@a3M8eDgMO9*4;a^=up|? z=}zcZdnIL0q2t3(`($V>Zo^|iqqpVXzteJSOYtYfZ&fqXd4~*mJNEG}qD~23NUJz+ z`+uzF99a#93E9Eh+LPOXL>K4hYSj;ikC64KC#9`WS}w?yc^Cg zN2tj5-SKh^@TY}*>)L`mWkP8Lua_Z~pQ7f$2pm&OU;xCe|i5adS(Zt zF{@=*rk*rX5T7S{wla3V5csA0ZW-xdpGpP(5m?*9Uq7iem&JmtiViuZb-=fZ|H*&6 zv>>LgKAS+pK&X`EoMc+RcXsLFp{LGg7HFwqMhBB}rZYB|n%zxuyp4SEv|JsQX7H$$ zf}?J09zp>rk6&VE)?w{vQ0;cF^8FCU5L|#wdAVDqUBmSg@47-}~$QKEFP$ z{cBz9y`H_+llOD)HPLS)ETxdVD36Ta^$qs948})%_Xt_w(?VAFosp2(>Gp&32v+ZW$y>r{Cn(F&rnpcOz zQ{X{%)q{|C-%(MJk}yp0i3R*WJ8_wp0c-wYu=LHHK)~a8 zRk(MXEQ%V?P!?s^+I8)R4&O#~y*5jxwteLiWkK%0ys>Per!O_(InKL12u|ZF&E8qm;eu1ljtBLu8Ky2xAWb((mD{^fqbE6x4v^tAl=Vm8)70$;DF03T;vd&HtR0*0osW1c$e!6k$l zgy-{yOJR2Nx1)~@s@sYv_zs9<#ZPBzsTx|UW#(8Sw>IvH?(nPTv^1(mbWyNXL>tr` zKdbZLAYZhZ3v?}+$Vnf(IN9lV7-7*NP@=eEr6h*yY5Vv&eci={%!^F8HI1?N>^)T7 z$=o|J#E|$2?VQK2=%aE+-^l5i8A>ysqY;Jm7}1>^D?a#Yw!eh$)nWFe%i}IWCKE$5 zkzaw_?WXU2#eO|TiCuerCoxa>{JC;1+HT}PvW8VDrgPM+UISGC3GKQ}_xwq}xt;(1 z#rnOQJ9Y6m{>K^huRqob41Q^P&cfPb0ssqRU*0s%+I-a4EV7ci;wZJ?Z8!a1*R zD5N3-%D|e@9_om!;IEQLTIvtc*duOmze(b0VD+zVrvTpMfHkmYFO)QcY|QAh{YSW=^Kea4*g9 zQf*-CG|Gj;YU@MK%b3+QwWU<}$17&pl_7|p^FP)qIbPgcy+waY`jY~VE#5S^6%Km| zki~6`;e)jGwH2RJEhka$Ssr~21KK*nxC-Ejj}-L(7k&sZ{UcXaSN}qBg@>QRDP0CQ z8;0H6&yAD{sX+r2WjoeM?Vo{zA>J_ZEmj{Fb!B`~4AQ@EQ&6|wT`of( zXxN~hq{}w<8|r`iBYtS#C;ch?LcEj4w>bVfsy|%WD|(}f0S}qzvS0_;l{5sgJL??r zSPwbpGNy8r($Esj)wu8m`~+eUD|QgJV|17E%g>Hc8MesXVm9uA^!|t-j6SvQ2KN(2 z+?^*h>PnAXL&rIB3CiZ&@6X@*W+ zRC`EkRFro;g;iNG!&jh4(91kP+EeM};ibR|mr}zaPUdn*r;nA{Yau7>k&-xPxny+> zeDK8|_6EUEbjVSw7qTxcL%{hNpMD}7{UJjv$_;ODD%-m^*h?O9kWaUGppKJdL7Q~< z#1XU?5)u-s{)dA8j67mKr)Zb{z27sA)ct%vJuqxCN{!8hBi$P}*||AYraG$-MH`e3 z5IqLG6dfLOIrYB47bCsgFXvVF*I~~W(}~_ZBm!kn+s=L5_*yPQo;F@b2>VR2D4Y8< zK=OeOwtew>ly!tkJm%}F_oJzJJtPS!sS=QoYwxqk%s-i}x4&=XI{rLQC1JV~lFN*k z8(aHbh|eAtRB*X`4BOtULLAi5U$hyYzV`A8fy1Nl;4F^h`arH-WNGE$9N}~EK)%ZA zWH^M`g7DR)a)rc#4ywzHvP%9f*A@KF^Js(&??7+jP()M{9G}S$N#~b-Tj(L$%_MFl zu*=N(xpwgL zLqQ;r;=H`sVa2jLh*nufzV;SatB;dss+5*JfASrO;tiKgf!wgE59tw4*g4qY!tr^a z_12G?&Wol`&330*Chlaz3TeQ2*fDUD=aHMGLIpT-ZZ&fI)Aqpo{VavYZX)WLt+np4V ztt9lY0Uaof4l^`cOv8bsU$7cux;wtL1xrrdjBOoFKZg%|DYW*VXA;J^bjXiHx@;+;aH!DprdiN$#FSI7VbB zoiet#d-m)+@y;wBirGdbhb|h7Kr*)rCE!7d>=(Qb4vsw0UkG8sy!Cd(*Sy4SiGiIo z3L!HsPcace`Du$d<{>s&`-EnXId=$@K1pnM{sqK4?Rpp!mrB%N$%`+k+{ zy75wLXvKUU0fX_p9w#g_48}9iS19-E};xa+j+)}NeG^(nwN-R zTu%;28=7Z9Jk2b8l$KBXtgywpFaIkOdZ}ERpPZGQS@!o=FwFfvs`Y;OQ~5~PK4|k^ zD0sqPp~HD5@3=%f-wrnPSYyb`|6oC-&p!^h%a=-aL* znmGJ;t<6mQv5}K_tBzU|gM5p9a8@+7$3q6?n`5AK;~WY-_Y^XvhRDV z<&drBq2odVbwAF&@Z8+NR>59e?%mvRV{R3@fdeuYc6Q3s6iZ6$RhpEDbx@Gr%Yr}N z&F#$XOo^|ZGimQG_MRAK2}Jn@NbH$o1Kc1w8HP#Mslikx{R?j8J=4+E zsV1iVd?a=XLbQ3ZMy*fZb-ku%Qr9q4EWSl0U)ybR=@8c=?o-MqH~xiNQ(W(_n_hex~ZB<0f>ioG+spL$lm{C^SRL zFN~CHTxq*m7kN4V5amiQhWMmQOQX#^JpWDVPVBRJw(nY9+~muWtdSg|V4do!OGZY% z*u+3Y7aQT7r=Pwdv^axe^~GKs{1!^JK6rRrozRhwAxjEIpMSaiuI4@Ks>>KhOOQ8O z6^)r@_S>`8-@2G1zv&SAw`y?fo^kY9l)E?k6$TuG(ak)@?Nb9AuXh6|8&+;F`s~I$ z<~zZr`$Dd@0>t-TG&f4`$$kNwRZPD#7PVj5+a@j5KFq-+4fDz7q&QV{y6soFk)2+ zHG;3Zy;j-1_eK1@!`{q%MPVq2sO*a=kwa9ewDH`+AB-X~@RNa_54~^*B5|ySPeeR= z{RXZI*kjJM*4!`G${NTf`^%+`vxWFS1k>+0-M|%&4%abQ+I6Yhb+iRfNQ>+V0EwC- z0+~sIDsa_UkoX1u28IySSxz$;N)A%1&Q$5ecX114K=>pYn*O|eZBMcsDq9$m-S6$% zSeokNvjw3hd`X1bsHP~XcqC|F?h1hD)-y+Z!)Na%AEJ+NI$Ku=U26GR>+$u3_WPuP zBWtZA)d%KV$>W(Sbj`@8wI_oK64ucQd(0XB$@C^0>(h8Q$t%LtgXkhiEw8hjDKjBeaTjcBB&DX4#}zxUY) z4&tXO(ALqmy9uwxh>Xsu`LGiMqB4+~=oQp;yoeyVtzl=HV5+2XfCpOQU@MgJC0XX@ zkK>kI@GO)#x@d(`vIR;9JxJu;;e-@vWYt*35Rl=r?4DLg75z zXs}xy-{|zTJ_Dz$vnQ=N??Ge_+^NgH-K#~Ze;}9`d_-YYURrpe_)<&SLfoDyvQ(DU zTb*Bu6hqr0C?Kw)q$VLdBH1Qa+nA9Skp0MU)h(js(5HWP+yDrl7RbM7E2v$t5Xhe+$8 zIdEj1djMqDFJJ;+C4-#=kL~)#ZtkAJ5V@+}J+snf1t<0!EEX14uUy`I6~5$qApoZ@ zbATYugX)S4a=)6i!#i{cVVq^JVxNJ0qTF?DwHP`c3HH#Jxqy_02%bCMnphlt;z}C* zmX?Zs$Q*?C6I#bF5NC{HCN9O|bGM_1^ReJLkIdxfThUMA#OPs{Ppo*{85TW z>|yF-Pqzhx(->H3NJ1H{vwxM}X*Gs9#GUMicC%>JZs!Yi5xv+()IxDU4ov8aqng^& zh5Y(7h*e3^;--XIvn1EUy8PlSnGR%LdFPyO_<@y|2pR};vWAAKDOD~K$4>xwv^M9H zxCP;sjWq*Ashaq0gU-q-wPv?T<{zq;%E~@Ld7+zMW&*2E;6rZ*!^$SrTqs8k*K?!2 zrE$O+P%_`2=K81pC&DAgg%UT)Nwj^oO++0+tx#0km%P3gnT}{zLrK2_=9~Q4w}CKv zOuGR~N>#8YaUBgy1}XhU6dV|aAD9ku!Ze14U)?6}Q3sw{9gq1Y`9rSuj%)Bbvq^Kv z#W8=(v}rU(q;rDj^0bc{K&hFt%rff)1=Nv@lS%2A(TL6{YT}t7eYRf`WH`92z{}@_ScgxhpsQwJ_VYW@u7T+D;Ji!7|2Ez${tU*iq2q~E|LBU3>hzZ4vta|>OwP-#eQ z@D`=IJidN17c+tnv{!V2_R2X0XmeDFyI^C(W|3(|)NL!L{c@(gpt>E(&AH3vjftEdmi?&T%)!_6Og;b7m;Jf>{&@V&cudx~8&;8>C`VvEsk)&iS2h zKTQ`nz6DNU^V#wAPXsLI z;kOEUY(zrWjlv;(NrGCx->$MB&ZawU;Pp!~UTy!EqZ$k5W)1~XV#Zc#xoSH`{*AJzWrUN5lguoUf z)Q}q{?a%nyt$Y>my&heja3@ygU@(a*52}EEtNr|AI?mb4(~ckv&4UN5SGyHPAKwSf z06aHRIx!D*k>^$?cqns0r^r8A_)U>yx^^pHE3Fz+MVu2VU(XEQ$u>Y& z%F>B@!jUAjd9kfCfE@t5myp|if&60aPYs!HaLDDK$w_OADVtpXnY6aD3X{nt+n)QF zTG6yZ1F-9cc^FLrb}$8S{Dh8a)m_)xI;Q?#VHAH+L(UM8P>d><2mzo=GRQxLyXrnZ znu-Q__t{$4OP7dO!X0$9yg!K}5-=hPT0im}npgK%DM3ow?--_mBu;wdr@-R=-E9Yc zR&>nK(KC=rg4Vv!{`LNuZ_FyW(_PMH;JJH*sHW@YM4i|Smu0J#J4@!rEm46X3_d(tYa53v;P};o0X&Np1GFc<>-p^T#n|PgIlpz!PXicm3Xl<?Q%pO(-2&=5&NR}|YeX^c9igdkkEff&-9AU5ymZ6=Nf>h7PGGW7Iu zLV5rpjRKY2*<*cmem&_#<4L!zeY9Rm+t3M2u4B-1oY>iJ5j>aYU0m`QD#^~`x6 zfMa}W2E_Od7Y`Mg86SP=QA-Kb1Onprr=DVjAZ%=vgSOEYtot{GKU#?z$ICt?4E`!M zm-aQ$i;5eqD#C=Wmqs?3%6s;PDLz)@r&_+lbE;&O+^Xw)xpXM(9?>N`hROxZ7fATW zcZ}1|V;@XA*ssm<7B84RsBZnCO$X3yJ6YGOiGNsZp6+-b32GyVfmb^+T#LffQSvR% z&86R7J`f6_?~(Xq;CHJ_|K4Z&`a za{%T-oOHDRH8*BT=L&7A8Y$7`jKLbMA%|0}dpAF!JJ3zfzXiUituNed+0RWBUm{&t%IQfZ z3LyX@M4Xh5d2-%RyA+UXN|nmyZ}OXr8R3!NY~AOJXt^9*s)P->G}vBo=_3bYjz$&c z9cwUumbJ7E$8PU-Z5tyhwAs6Fci^<{C$8pQ5OzV|GLmIy z=8wnoM5w7~_^`p-TEq^hsN>rU6F^kUhGY|l1h>UGjgiMA3iH>h1`4mQxwGFdrn3Oe zu;NuIOFH{aV_4hKO_-mBn_momPmy!Loshpu3yo8jYQ)fN=PUiV<}#3$+#6v1&`1L` zLf4FU%icq?X>3aBZ)wF2>m&5vx5YbE=6^cH+6@j^n-D-JFK-i-J@r7NKXs82;$M85 zpZzfXRtL3wa=unaIkz;VIaz-{QjSLcFJ-~ zGT;#r%0y+IbFG>e5H9RC;h<)jpvFj&;R5Q`9-X(O7mK>unsYb+)#jV{te$}{iTtM* zoqz)ClAbLz9qirg7{f#X#`4dVxGw${s>t#i`@P0{4W9?_Zc=~}j~H&2?Z3h%;R zI-i^_V)mqfvIDn0_EQIRkW;=d*6PN)50TqXYcc8c_w$sv01l$~#oc6`@s2=dH|r$_ z+wx=nq{=CVZwzRm555j4HIkTRE})S2$%Lx&tGR=yvaaE|w;(B)&z0z4Hi5=jaYy@1$;5izO=Dz5L!8t8UE< zPO*-&TDXIH$(?dRT?gEX2yOO4k^Y?v2V8cDjE)szLfb3=zvu^1kos-v6lcvxGpD^E ztoQOE+KAS@7L0Xb#t)&>f&5*d%^SN7R6|34S4!-qL0DSKDj-#{nL#9xq487QWx_Llbp9bAB;|SI*D*Bk*X~i$1k}830x&WBF%e zUt-x5pYQtiTA+@h#AOlegfN(66&T0@w&yD7w<@;Q0p{4lrpi+$Hw|eyoAj=ki_z*S z++6;@x8u$b0)-=2{h;5@T1U3zt-tPlEh_P1`}-8b7d}IB5C@)I!SqAxCT;K@s0f5Iva^miT zY~M&6b&w)#T{JgIC5~RRSAK{CLv}Z?Cr`b{o?YiMp=UXAdGbSzyJZjLyKQSyGtRPe z3pC)iv?#h%Ei92OIr12s;?ZpdL{uDbiy~m0=^3xUTApXk7!j8>GGE{~O!FQ6&u0?o zwq%(A2BbUkN=M1149_pOS1VTT`xfcCTXGcIWL&J%QS9vA&Sk^PPHHy0ps6L2j5P zcmEQCm&l6h??d7O6j93|KP4~rI$gG=cmUL??ds=)D^x}E2D`|wC|)~$a=?YmPPlf@ z1fis)0;vHs>rubWoLr7Mb`N_QK*p2^?1^0B*B6IJvDc@u;d+fL>9%XcCZ`}*7ndm! z-oGML)U*U-yYUIa>Cmhk;{p$_>6l-ay(6f-^-sLT*n&3KM)I-k>rrek*qR17Msw|N zvb@`p7!et1pGgCFKqrG4y?>D5D8M(^q<0rul=0)22V%n%VPjUnBo>qN-_Xj=8}j>I z6Rs6BBzAaf&gXCt;Ov1@wtLIB)s@`bzk|T72BOqfbl4S`RR!jb^vo7=dee3`=s4Qj zOITN1t2h(v>grmr_V+IPwa4^D%^Prbj(#7e<6}zkC9S@9=7Gs;AnXIAFfTyBha%PDDSOpM|qMSBv1=jUH8#7JUdl+vbr!#o-S#L}@whT4MSpv>pQfKO0*Ca5@j z%$%lcT7w~}sm1;tQ93%heXEkmN#B62C;Z1o6bPk|dZBcn0g?I&>$Jm{(%MZHB1po& zFC2mcPI1-B)kEr8g7opR7W~iUNFIPWnD8;>!z%ONiwl@^`OUKcqJKx`8Gw=Uv(Hx8 zSNMAwO5uP8@Dgz-{~c+O2SyAI!$2?LmMM$3fPofS>+Hq6H9$48ipl{PsTrLKirJk@iJ_e@7aC5l>qQ9-4obgPJS=b0{vHm0N3?j6Z?PjL8sS5C-q%jVhc$)z~3`@Rk;coB&YQqm>T(t;o&(y>6gLAp`8q*F?yLqd^WG}1^fB$QGl7D#uqknV=> zTe*h8WO!8_Z;TUbf`8~VjN+(&elnN|q#(zxmmh?& z-rhj|=%BG8HZcGG|J+Sf5?5N1I3+q1qTfH*g6F@l0vDbH+(4hkka|HZ8-VuvC#X;K zUr!aKBdCS?U+i}2R9g{dcrIY2dCYi;ihp7L^NzOx9$3Lli1OyM`&Y;Q*W_KXv|X=` zr)40=4wuOSzXuYaf(fqBueJN~hTJF&gU0j5@sx|o66RSK?M*K)aXBn_0shNgUh%FN z(KT$lTYv6JLOwO{R{sa?n;Hem(YGPjqb&j2Mjs8=tNL$k!G8QWwA}hLGf{e|0sKdI zw{K9sJ5P$^R9NBWTD!}SYAiiaH|8Mna5wun#m_}KW5zOz{I zIWx+Cs#4Q5iox02gA0rHT`qlq$b!wunp?=Om$p`eORgzaGokQcl0;F3FAD7qT&+~{ zpMAmL*R7`&;Tg?3G}#t;&-1#_M^_a-{d~Le8;R@eyF}cG8>m9@XS$^uX(eZrv7|jqu51Wq?a+oeaYNLO^+!&0BGlY+a$%HDZkx6H@w4NUV&F>jliQa2 zvWV?tslt29<18QLLVfa|DJG(EpayD>w4>HPd5w|t=>iQ;q$~kBHtLP) z{Sf3}XZ_(0){p{ph28c+qeq=x#AvCclr`Jg(hA)U&%*vK6l@sZucdGfHbe$1aROr? zU0^HraSZXcL={47q#wWKy?GPNU0M3pLI_jB`%p|(xX3e(pBj14R3rKo8PozSG_88R z*htAxr^TR_IeCxmBO+{=hpnZ-3W@8Y{MTSvCl(8rkZ_LBYsh!!{Ed=LL)$F^59Wl{7$>Li z-}x=2ZpHn#t6JA^&CSk_WhUt*f6>jmxH=+d%eQXvVuZw%;m6lpStwp$XGSJQ)G5`p z4|QnJR#OT^DmVJ{*x*BMB1|IweH>fdEO6hp+g)tfv5kdYCyDEGg|>ECI$0oH3E{`mChJrN)HgI9z^(lJr0W;51L(3?KiOf-_8w9(r5SWl9D5T&*n$o@DZ z;wFkdt+8zOiBOiVV%j!RIUVk|p`(v#u3x)=2&D}uFCWi-^fe%8X6Vt<(v9nVF}J2D zikk=PqtCW81T%xSK00%cV=}7p3*jd+;IeF<0SqjDNxGr6qqF?!hKcFqiNZa3h_;ma$-J$t zPK_HW^KoVr+s*t!Mg?Qwb(H8-_n&iQDb`^~IM?_P&)EvU3o0Y5ot1P7-a5vvdS%2! zFs7LQ`#j%280|-;wY3)UeCTaawtxTD?5Yyv_*M8J@7tiVSYC!WaaOeUq~Uh*k%dqu z20^xiI>&Zqo{r>oRp7`(8wA{%Gil^GtKDLN9SYPEt|kZ3I5Ani77>T8%xqGtcV_9j z7FT@2+t{1|?q%p0_pl;uk1-GUB6%n2THsw@jAoYdCA5Btx=mtUBCe=Tv=D-eBP6#Q z`enX^!`78k8W;nEIE1g9Iioi$Xls0s+liKVEM54vMAT$7)%eoKy;c^@4j0#5;q*{l z@K}rCwx8qRa2tv;Z%d*Edi1Aub!4^GJ1IHLAA5O?RGkD9GQjPfyb~@50`S5r5TQdLKjF>-;qAcp^X$C6QcfZug#Y95Q z)v%zl81r_YY^aPcIo*xdm}q2e9r)Mi*~C8Vy(Ng#)l!c^A4_xkeB*faSywVq6m0L4 z4bK${Ft-gNMw448l`oa-m~(8nr;|ynIh=UC?Mc;K61fD=Uw&6TH z;8({>%THJwF}5_cq5ICx^jE!YufUX#ZRb*Nvm%<=m?#%aQO&rgR@>qwueQ7jl|(P} z$dt*pRy_tK(O01&=+lt;xRsP38f#KZA0yeOoXxlN>Z^}C5JO+?`5t%Sj%4#!x=`VJV46h_Yn6W8TmDfR zRa8{;(4yx~iD4s|{X{jEh1bRyx8jF~C|oTUk5YJTL*nC!6f=Y=)X@Ro1i|91 zGgT%Xs4jhK>C*!$}=45$j;)GlF)@bQh_ zjq6Y0W%msEAg`jNBsJUo%GS&4Xx!3it`%jn zWy{F|&N}|V#)e&cM~74l)c=TLXFgQil>TL(K&y&B_JLO8c!U9ZS{1f$Se{gYvXz*7 ziA!MLjzO(CdyL-+%0hgCQ(wewdnbxQ&cHcLLxZ_SkL}w0sheFr$vjSz_I0MM0Vp+n zQ;i;6D?Q22qv8F6>m0%da7kHN*$TVv?(S~_5?I15mtJB1%trhJXQ81qsFjtK^cZ?o z7SV3K((Q@oS(4(N6cRr_G0|RjemJ7-Fui%;&^>Suj=~J z`0-@*$1*5BZA^D0*OBtT-R}qA{L5r^2lK4Pi^(T0HY_J5T^Fj-`HyCd;YHi%h+5Ov zM<+(Oclu}-qic9s5oUx_)E-lTY#RA!+712(12Ucfy6^V#&6+HBMt^v0O%%LSP*9*B zxf%>7CnH<9I^V9-Y8W*TUe#>v5%NVPIoKIr6XnUypTeg>^Se`sCctNVOED9#y=z^1 zTUI!IJA-fNMsvcJthJ=G-nz(vh|iJ9_jsn0qe(|FU3}ZKCfm`nv08gdaNI0PJ!2yx zzOI+I#PH2{w&`KfQd8TPdeaJfzLX8L-Vg&0X?y5#Hkx7Lvhg*l=*f+f6-ubj@h>T- z)y(bmAl~@3@0aKF%_aHk)B7Rn^FnJ|9xPiVtA4n?2`K2(LU~dA5d6gaPecScF0|Bv z+ZkPqO!N+84@dPnw{sgqMDKhE+WLDfU)~Ez;iq)`(_5_`{gNH3pBSWL|JCX-*g#q`<3|uC4e2Iw@quIYNkY4m@w>Pu}$8-`p~i$$~a^ z&3MGIA)49QC|^88`I$c{u({=D3I1+;bM}Qee7v)#nM)nSh;>X7l4o>v!`70PurmB)W zeyjm2JMO@Fk6Dz>NuTWW^DQ|kYX{EXu;ycCrGWPP%+{>c%&NUcIxhU)#l@)J zVXkmB_@%ns%?SvE4~nVyWfbl6qiGt}uW=i8iQD6^9o8b>K6K74w|y?L$ckWo_Ju`2 z75++H_DP%0zj6h#biu64vC7UB3fU52e~g%=rF)zL6sslQ9*P>5v&ce@z0q;IGlLvd zxj#g3VUhGHOMdT+w(?mfXvaf1`cevPmeoBaIq3AfUgm0D>22LzY>o9pySP{tcdeem z_F}z@J}uc{R+Pa=r&SkeeH^o>4(H&UA-3oL8_260Lu}OGltC8*GOhmC9-FhwOelP_ zC0QIZw;_;Yi|G$Fe3+j0FcI+@yB}IqmpeC=8*LF5BnKgMV%Nf|Iy%R7RTe0v`nIgm z#}XiS(dMz(phh)Hb-;gH${`XYx&Em1dfCRq@|+SqJ*ccCR1N+vE0=+&P_i`=n2EG+ zo#{3KgT$ZBHaCr)XIc1V1TER+nTT)EC=!q8DBAIjI68o40xE1Kls?aP4= zXt`LPZZHx4%|0cIT-#|9No;Qo#O{UKum#t8MM zbo2pr8Nj>?6fn>CeUi8Uy4;QFZbC!5>=fn8_R()H|46lik9SNv9XsmLq73oCuF&_3 zr9u(CBmu`0F>tf~K)vn}7W>xLk|}?Ke@i)8TRK)yAJqTm~CP6jiIt zil`0yY^kb_`gsTSgXfWI zVkPQtGDPdahM#CV?ZeQjPbIIWJFd2bQ=~zr`PeTeT?yiG+x|fpcurc4jMp;hobk0F z^^v96P0mI|pSxLTC8tGtjd2VND~n7W>mym&)g-@Jp4@A#gU~^Y6dQd7xX0F1c%DL1 zc76Sw@bGY11qI1aJnCQ3aqr%};hXg(W>HQ9Fz-x5@nAq%TIo&Ef-g1$_L zY^$b&8HVn>P;9ijqGEV{saX?prZz|Vq|yRvxgyx_&PPmykL_)4&eR!88*BYD-*m1u zkRYhZYu|!Hrvj>+fu#Ow9i}6ac`WbI(|-weNAzYDVTVOHKW0XsR{IQDMNW*OBSW0= zbCDJ;`mXNqLXX?X)s_VOO~pQDthg$Ce}BKyX81mbar4yPGfmAm+|N5rHYaMVe&#E| z8wsuw6G;H3BHE=nDdrRAz)h=hW8WE&5mzIG7n8p{93J++6nd!&rw-7IRltVP^hFKw z2M(qgY$zxlUKZQnsv$|P1vinc?U`zJCRRj4L&Hdz??{O*Bo+{hQZ_dC&yF@JFLWUg z6dL~vCj;Nzj+29*Dul$uuZ6Zh6O)G@3t#&Bo-$Rq+i#LZh*{;UV5IPB%s6AioO2Ha zbHT>e84Z7qmoi?q=vBRP zK55GtX%T0=xEBs{6CYM8zC-6>Q(4!zeV^7=CSEa?@8#vF=Xzw_OSx5rogTQQa5&SG zCnE`7JZmuX$uSH1)I-}x;i>x7_`3dyKxvX6g(C> z8vC!#4y?VU^S$R18$Z6YRyRs>b|ezbn0ksDR~r`voR9Wc{Xi7;$1{Ig64y%1tr(%L z)Sp~SX+*qrer_8!x_5v~wZd-vk!^?1vu7mjtcI9PCmvlf)TOIiyamgt@8dE0R%~r) zSmO;MNL&S!GwK9ggvK&N0(Tb;?X_|p7@uRLQ}&J#+MFCuv2psk$7Foh+=^Mi6)XT& zv|*DNgi6O#<$%pMb;H27()J^1`H%L%1J{$o)YbW*acVBpFB2!Q&c>Agz1;DeHM#^P}jx^E4bC}a`8VSg##+~2i zUR?>gQfx!rl?T;LJI!=+t8xcVKPh!>xUULd=C`iPhOR@D!90@Him-MxYvA6f#-=#Y zNM3+e+ap=XB;%lHbgKDg+ov8F8z zc_`juCt)~aU=FQsz^79EQ_?3`MkKCSvJM}>RjS94(4@pfoyjMwk^L&njB_B@>H-xI z9gKyu!}Z-k1+FZw{gshzB4Xl7-&1Fi3I<{9mLf7Ej5+PGr3N+lvaWRva4%mr$sxv{ zJu45V-#9IHny&Vx>(sxb*D5!PMj#M+blN34fwb2rUG=|;iVto);qBg>p&P{tanV5hUMFsMXtA6%KP4{Mbc@ukTrK8q;$ zL;Kb{`h0lSz^{x)g>D#=;LZ-VWXX@MlONl8f&Lm!Eeu>~c>SN@qoM+eJWJ_ljyU$oaZQhb;G29!%Uj!M zWFgIKXqfAJId4iT)J1ApCaLKq07?N+^W&{~fxS~*5?4taMWjuLVV+%Gp6~9o;p=N` z1TJ=v8$UHS&*Mcm-e=|Fs>{fX^l!I}Bj?Zw&@9%0Z&y>S&(t>EZ>X~!Rn8OgvsYqMdeg^>z&3rd(2XDDhk(=P=I1XgCmG|_ z9wb|4K+cagovM2MmLtg?d{yz=BW7e_kyM;MzalWZ8qqIEWxKjYsEPNeGcrEAHo!bL z^k9>upAors-!-fLl^%97FQ&c1H%OH}2Feot-L*!B>xUDz%~pQTo+S>tzYH!TDG;mOcCs^HzYxKG7oANSp>6!CrZhdn#wy~I z1@6wU_V5=xni3cX%3F}WSqR`(p{AsNAVMaXdGCG zHQX|N)h|ac8&20=(kU~e(ZlfIs4EG4h1nmhx&S>s{bA*=hvg}GoSMGdOE6fb}Qev z-fL)n6ai{D8OUKZVVxK-Zb zcc!>|Z3f$0h*Y`WNNOoDvLarAK=6qT!U|5M;IT9!Hcg?;ug=|V6GiPO9vgVC<*~A} zw{6zV#vB~D9{d`{F*|Imupa-!1an;r0@MnbgEdRn)9FPv(~cauEVM~1Io&3Lui*S%Ss76ktJ3GA)% zK_oPE$m*^wL+kM7FE!epZxw0I6HT1@*xvk?(LpqLybS$WP)c30S;iWMk7wh;1(Ut`|lGROc>j93x3NWK)XQT_PQmc+IQ&(>h6rWG0~C>@$D`Sd{F z>7Wh2zRpJkAs~TYC+4hXP`?x<7#rm9Ou+YDPoUHqYhTY(yXz|}p%-E06Dt=HI5*{_>3^Z))8KLOU0qU2JR;E_Rk+XsG4oy8_C3$0?w4&y2d*UoBBWnUoJE{wFC6|);5mZvGTVE!KBX%!33b$%*7?k=arEZeT9}-?#8ibTeP%!LU6z;5 z*M3x2rm*zwoJFgD^-+ATeJnBRkAS&;Q&QTlJyim&<9 zNb%v0sCUZ+wUG;e3jfjqD9*;Eu_0ni>|q+%-aje2J)zJasu4FRD}O%s7NpC_8Wrvn zqpe?l{}#pfG?j$ve2KW4QXoF_>~?a-6xLtH7m?h6SL#1zq`jqht)~XZEq#D)r~*n% z-uyoIx{a@~FP6D#G@1^zpemVff361Azm0q2D`E0F+2zqA0zM9brTt4!RP^nKq7V?osZeC?PT~sI)cb8G z__MbOGG52zvLato#vv9c*)JBlvg=e&$EBj8+LrS&*ue^!&;G_P0`b|vmNZjSe+*eD zK}JW9B_f_e@UgVVI!O*H2E6v$ze+%rDCy|GR9=9+%PL*2|8#(fSNfy6c676eTLJkz zknBAm_}4Zx(wMI*&u!KP4i5f$c6N**9rcp&0XB?5XPtkU=Kz*wi*?qQE>!8drcOdm z&cMx0Xl-qc0JQw;VM2GHpJ2&XPLIfv4E^=dEchwX;2t9lZZwBO{}z>qo=~)HIXY*H zftL-5>$2>+n=HifDV&|1o!jriQ!(`k?oAB5rywzS;y4q9jzjiXCtZfd3k|@~ww?Jl zHblhvLv%xK_^l~5usrU(-7`(Cv{$Np=#_cJV-uRYYVq&he61D;Q&xO>u`?gh^wSWC zKbi<3{r&x2MViGG7ol8uKv!Z4qP9+>`-6!vOJz$c0Re%NRk7=Etx~-#;}$=XgBzKS z%_z<;fg(OPxEtxEZzLHI?PA}D5gAyJS(dsVfYKVxci$0*@4Z?~ zwNdC4TN!v+Z*PtCQk6w7wqE$hgQ1~k2LP;(B!i^&t0cZiu=$VoriZ_V>k-+JtOyi| zg-&`0I^NiaqC4V{Q5OvW5a&0%6Sa-eYaPqeJ5P4S`!l*Va5k1_IAElL%AXY)`~^#x zTbrgR36Uj_jhUv&6lZ)Y9?QOV`?~26lm)KwyIoTaE>0i}>WcZFtrgf}dF$%xwjb3M z2BAJSZfRCNFXn7OBNe;$k~R1*X%^m^!QCIkCuis7yCdX|^YML2bIDo#-!iSr!Ij- zrSo9zXB^0MFUFA-i+<7bp1Tc^uY-(kf+YI1SjPzs8)gP|wIrN7hNo|1F1+L2{iO#) zEA0nDrD}aLPxt^y=dn5Qh9%RNh+Vs^`cr9PVJl)FCoVZTyuQBP1SfcId#v)Nnwr{3 zfA^0c1E0NI416|gYNU@>o{Z1;fGWg8lbS7o<+ArIO`61*C9biXv$Xc1x9Q0`02c%W zToCT7C(HMbwhTQW5c0^mt@=eg#pFj!_1%{_v7%o=F)zlk`ScbgpF?}DT*9yFgC0Vd zhZ<{lTI2#r;Lsw{hr8rTVR1y+4m1!?%nCmlOxgDIxrwvzS4|sG;2|=RVc?cGc}=0*SX}Dob%jUu{kzmUp+$NUa9XycpzGC3}ZFN5whK6Tp4%r~;T04T-u_8i@xWQY0b4wepiT!x5LKVm+ zTv~;k_KkC`12;$fXWiBeJ&(>T+vH6LFe2YxnF_{a@JH+mrNuIha(oG6JdK6@<(B7c zjw^OX1=uQJO}YkD05a>%N~}7ifD$2m2Ar!uNtCh-1Ek%{?cHYd z+Z?EZ2YXWpFrm-DEctn`>6#Oa9-5&klaXa_zLO*nf{Im+5fnDCQ;8+m%o-xOK!Zx) zTfh7(M^0Q>GBdWZIkdHV-sN0Hks9N~cy6D#%{Eu|GM*enLZU4yLGhKaI0-GE|yq8bxmMoDTt7vwCVe4_^?eoZ)WOo zPtQ}u7RIiz^8s#jk;I~{@tYTi<*nMrD3+PHw<%B$*2yCnr&tA&WL{^EvvaoYR$AT+^Uf_hfkN4DO#}!b*EA#S6Q~Y+ z#c|WP+>H%X%b~KDkkcZ={<)&Vea}8FjbJxEx?DGMP7nWXa0Zu!VE06SA3$NldC(v6 zdx_LY36-wf^M6k{c2~oLpLNTJZsuWv!EC~FxDtTRhD3AbE?l(TVOE}C|8WE{*`N~9v&kfaU} zHrmzfh-HxQ(e2gLyey>f0{XmfpPss^^Gb;bR`M-`UVrrvwuunXt}bQ=K8ac(FQcAS znXT_uIub5fB*HO=3{JP|M#tOh<~xpiJ0RTnrN(2r8t_fbh65k4dON?(oyipyJh0Z^ zzuIliJ_TN7GeN<7Y_(cjru1BQcKp9q7s76F5*0SAHjd7!m7kUgbW9~HOF=wBY!jM* zwM40QLvpda<>av5bLa+LT=+6F{s&jY+7ThWMNoJe1JjmD-%eRy6GFaSGDhML(t4T# zyiJ;XFg%VC0YKj!UK^4pc4Gu2JAj#*hpm^jndA8dFy;oq>mjILJcdMS zcW<|3Kq=VpEP zdzmYjzV{JZX}MFa3h&?6BPGke$B8GyNgY=7{y`c(m2~ij@@9$kbRjhg;@7VdnCG7! zJD7Uz9<#N84C&nyAY}Vb>Vrh?-*}gMUMtC#@a9)OQ{Xk8^1e!MLwC{i5;I$&qsB6m z+4p>Bo2l^*1ZL~g79%3y4bawZ+w);bwL()a-$goE#>apkz+(3TRVQKg()VCj>KWwV z9XtoA4lu0bWr2ui7!fXEdhEP88}>=};U6WE=)_=DX3#L6^BR)#Sg*qDJt zi7#p7i(7b9VI?ITb~B$TaL70c-JGqhKh~ghgb^~7ysI=D{TLL4+LJCcn)IPq^$qJ& zYez~DO+a}E#GdR>ag#U$AR|T!qH1!|61w6x>eQMGZv2rn^Q7OFnk7ODVsPC(%mXZ< z>FM6`i1k9cW+ip5XI>sCs^G%TF82FNHLC!iFL}yerBv%%g>Kzo{q4awspI-BtLaa? zqCy80@q$eA%|Eug?(;eG+vG?D!Bp*l~Oc z3YCXx;wC;i1(^k-z78`ieB^)^zs<6EeGn9sk(z27{mrsBh1BkF=%YqydLAfnP11z} z4bDx8A)rJu>i-FwTf?a+_SAm8IhObdOVS4)_hUMR7sZFOf{!(Q4Q2gqCqGO5ZHDl{ z0q-%TMEZy>Vq7NGeJ}6zFRuqIc1)I&BUV@bhV7Fn1A&i!0%&&11pq*RzMw`45)|*>qAqKhAwz{_0fExBj?IaMkz8 zDNh=)hw|&@zbP0V8(DN4%fBjHUp?j)l7WbfQ`*vs80#<5RWdXYO%)D``|L{ljbaV~ z1c!fX>AwY)f&VTTn_T*y!2RmXm2tQV-%(C3oM|P2S*eKWgydkN1H_wI0k;e}$f#Uu zr7OYTUV(07a~#DQWHQvm=dkpwF~&^36BGNa%&-wCT2#!IyWfp`G($fJc~|MH%*6#8 zF-pQlrEt=nx+!NI&Xx=3@2V@Q$&Z&EL`z{5WmBJsifhZhE?p&Xo41m1JqZ*@2ynz4 z0ubs?8F6;0c6e%{2Gn4~*j~}B5MW}%bkIDys69-&6WP9KZqdFvAVgLyf&1bct9Q!b zy({Lv@!=4HL4V|T4wcM_T;OcMC%%QyC$Ur}kLwQ(;_Q!j&j@`jZt}};xahdG=%{|_ zMOxK8Ng3ih3}~n|Gm^7ama#Qvmy?byQh*9ASvv+3Gn=fn*QvEju30b?wk2nu*RL+T z#5LL-2tCVRk^I&nt5Ij9&qEZVqz<&FTG0aM>Eb5Cjbrh=4r3J+sXj<@t*`r&`|HJ` zqY7?8?|U8*E+mdG1PY)sT2146jsye}pDo*EpS^$o#5&Nxgx-L>a(=9y#PPA{*H5`n z8J#cbcAV(ba)Olh|j<>|c(;Y>}sO8o?H1UG(}E$vb^)I|)%QN>(+m*= zpxOir@}(aNI6ek?#ArdUdjQ_Ebhk4yq>0Zpxi;e0g-N|MgBenhFD*MoYU3YJV#6>Z zmfn%DA&fqf>_@%$D>Sls#oqLsVLJii$Zi!w=krhff13m&N@QyvUnrznR zw}6Pi(KL%;yg~IR@1sm}Uv+Kd^T9%&PIcpXWQz@pGdERdROJfn%%2vR-s)ABL<)_f zdQyTMUg&-x0WBPK4>$c*>IT_=sLUbDy~>byImXCGfn5wK64a+B%1 zO5at5YbGsk`(w=bHI|M3Vg1~yD=sfRr(@ehM@xyX9jC4vNK>5TT9eRXmY3&$Bs#fG zbZ#0o={jJ;e!n#8zgIZ&aH_c08K0VmRDmWRSDtE0o8$LU!SMeAf=G`5P=25JBF zR0)IVDa`Km1JjU%1wZWlpZ2LDpsCX&&J+976h`zi5G(>Z;V?ZCp{V zvjmE2ohl1lQ0ET;s)20(>#Gmk&u?YtZ0!^p22w$&tYwkFvL zu}|iahv&h;XvkPfkaG$&EV?;});H{aM?)Ga^Tp-OpRUx&-6e86dRIWPxq{PsceJs7 zEo_$0U3l*sL;cZ&EfS7a2!h>@CLpNN1CXdSjzIZ;k2>NK^pcH#GUsXj)GHUe5Vl>}O zg~dd^N@gFdK|CO63)Piak`v@9*H_!uG*nrRpqdQm)(-+M%(rmwzQ{8Gk{>|-E@nq^ ze)X7r6$;`HHBb>t85mG8E2o8ls<-ZH();&%{&z@7Np;DOw*9Yt)}?n&7Gw1_&Vc&E zRfGqi{lmrD`Z?Et<4t`>k3#g8PBjx6sdnyvwd$`oYVk^DZi4jZB0y?6=ImFP z_*9wxR}F4TV*5QjBeCtSXNRN4u}D4F1HJ0PWoICd@&p#KdwD#o&x1zHtXTM*Vc>QO zD;?;dx-o#y`HR?0|5SznaPjq%0$fXqMlczUs4P>9lsT6=@J#VN*aG) zVq&66v)N@Q?&Iy2Z1xbI`CpFu>zerkb^Ju_X}ZS@L|Hk;jd&hg zSKr_<9q8*jLo+PVCmek-XN8z(nhU}ysd>17f0)AH%KfIr_jK>p^@#&!i{}>S$Q-8W zYE~vtD2ur;Fq8p7zTScRdTE{BX}Bcq`_9jy{}7>Gerk>SR|%)9`UMVOq; zgpqdbm_`>Je%F`B`u84amEicBkv8g7YwQz5?tQANVq1|uy3K4Z7xQ}y#IGOxwj}>#(Y5-pwyB~!t%m&pRIGi;PL&q&r@=Ay3{pxN4@HUSAwl9Zfln-!%MqtnxXs5}5e@{X+Bk zR$GZ~)!W3x;Ki<3h0`oTthWJoQMtLfZGf2g4WK_*(oZv5FHTo@cjIJoodrQ^jnwpf z23o$bh=@;pUVyQIXG`HIEP)Q{+>56$wRNUa2I@fj^VrLy52d)c0b^r2d3TUadxOc_ zSe`m?DSL;8WwIA9UO>TF*ZSCQb9{2*X?s5-lq#_BblCs)uGI(eVFu0iMO1L`ao`k# zZD_)r2;k2 zR9+ritIQxAoGKRQY!#x1NdS;fO;~kD1v%h@RI2|QR^(gsCMfhqtk@MlXY+{}5*CJq zhkpS9Gdz+L_AUGZ`FxO7@fFi>zL12}g)09xZmDlUS3s0&a&>VE8s?sq0mr@p&@sN) z#X}&6eja{4-xiwwEdfje6O}tw#NsIpZ$g-y3Lhtn7|T;gT{+0akq49>=L|%rO4GJm z9J-$vKlB6t^YVPNE(hoW3X6)I@2Q+If-f1|;g^U_;ZsTJ{ioJZ0Ep9dntdA%P9FoW zcGMK`AJeI*Aix(rf%4u1b$W{)ail8yU~Tbf%z+&03c*8F`0h7`L0_$ZXdQF=vrO&5 zYM;|U{xvzyc%)l#>g63Z0eZHv=2t?4KYu<5bR7SbM=UVNg7rbNbus7)krTTRLg`TP zG+o9MIfyA_;VZ2IQvu$=Y6x2KueZi38ITR7xw(uidpTeOA_Kb6FS9~vzRooHfC74; za=M`D#mVj+00?!XaQj1o9E|Dy_@b{wt}H}ZDnvVID6u%+US17{7X}wq_LEP5QvL>L z7nJ}crW5EoR7q^zWPDB==_Z7}xJY}x$-U_EnEuO{PR*@a6HehYQ3utO=y*_`n{4E#hFqh@Y+fY(YBts|Qid z@73U&$Z83NfGGsx5p@668Pa}RYTnsVpik3~{JW1=gtsEySmEpu+9qCk;3j4ve~#%N%Nz!o@((8<8+THF0RlIM+&_Z%#}EMfV;GPk zH!}BFV^M)Efj{Fc%{gAa2_N6--h@6PSDk_;_`c3 zT=>(C9tF@JYIs2Aw;A})Q}Aazce0_|lXdv9B1dc<=PKObI{+sd2`Ywb_IbX zj7aE9Bm#>+pGb1hWJTshtiUU+D%G74T?240?1=v^Hr&LBHF5 z7r-$s+c2;pKnr|V2rebOM3?8s_D78ZWSg{0zX*B1$T5|+JkLLNM$a0VY=pqHfHxMJqR>PdLI@E- zJ~VSJjlor5s`?WE_JwSSEvUuNTjb)s z1^od01M-w$2v3GcTs>5IY`!6F`5X96v&xGGL!h())BZm({8D9jWMrfh$ik6dWw;~g zS}63uZH+lSx(V>((ah*;r0%ou8+5P%%OBtB-gfJW)%Ukd-2TQT85S{l{Ge&+R4 z5CGxG{vnvq;l2kz?*^}s2l4OVf92zxf&6L*E{SgnNF|*nZ(dFq;@6M5#V zBMNm5jnbceBnN;-d$SNz8$w`pYNa6gNFZHWYPqd*`GuK8FG=qURk%_~8J|lwv{9q( zE&8jYjd75JVPt0)U8ityamnnj^g3d|ED5O%vEjF>}!XExI9tT}V9AYh~rm0EJz~M;6dyEuvfdE0+yH z!Qs#lu`*it<@P^siGfegI~ag1a$<^83Hx0*(nDIX$qME) zb0|yeY^tor*W(w3;A1MbLqmkf zHo_V2^#?D^&2=+HVq#;v0CeW|+%fr46aK2TO*0$;L_%AMnGCKT^_1kp?WqEFe(yGz z<3WXWJOng(=^0Dgjh0cn1Eu5a)lr@2@;hy0_KFQ-bVwNo>w<*QK|xz+n)qkn3sV(V zfr(7$P0eI6G$MDAB=AI?qYC8sCHcb#ZeUeNL63dgbUhf`qWrx~)jL6cdrNY*zb=2O zh;=-V73pO2@S3Pj1Z-MTz)}FHa-b9%xynI~&4&HH2|R^l3VS^Qr1DGf^^NC%qvgN8 z*hem5OZZ2m%QVyLTqYqV&Up+VntIxdn>6?y+UD2sGfhy#%7plV?=n=r_)e7O(kGDS z{Chx$&s#(+^yH;ih$$(HA9MZlF2VzG+n+ywmTGQ&|Nb46Gdxg!s)Ls5|1$o!ONl-} zLxM*w7z{qM^5Zzk*e`s%%2K}{?sI?uL4ZYB0oi=)0mB5|Y^zfWe2Ge%=rouSy{WJe z)9h)p0VzXi7$!?hp`^;CU=&r+D%dKo#79FoKaaWer)ElY+TZ{f|cI7WDVQ|J~S-?($!z zV*+$+_~iYWACYc`T?VoBl8^H~`gDE#H;|enSxPB90AtX52#yw>#XfLCz2$^52%0jr z;5^WiT=4(3bER=jo=Kc55@9WbQ^bQ3q6x~Oi2@4M1QG}#R=|n~@dp%Bv!MdYeH6`x z3K*e85ikNlAPDt9BrHM}5EO`lgkn8V6r$89f`EwDv-4)Hy8GMq!+z=qKj+PJ&CGx1 znP=ud1X}n((uSU@spH$L(g8E|*`Vs@BEADv|8=DjJ=nf7s|L|P6L1)a211-0OuuKW zM6-%b?W7QOK$|!?iGrRSu+SFT{LCDjzGdOU& z0_-mSj`GcJek1EISZ4g)2HQ={$~`ULpxAH6EME-#5|vY!*x=P#_fpg*u^7wZjr%3~j6%&*{%T%UjY*8D$piP#HDO{s5xWk; zE5^w3PZR%NM;(FYy}6zIIP~?4r_MX?p$DYgy^tK%g=WmR>}{c8i#F`p`^B^|BBqkv zYcQabQTLxIa18;I$tt6R8hk4irTf5v1AP??^N5@EbM(#a&qEuarw5e^PGft&HxIO1 zOQ;QXm%8GM4Wtw8BInf*TTGWLbYA=9U}=I@hQq)3@WAA!z(x0W7w_ggb9yOwja=HQ zvO(8CvxMMd%J$UB3+70RGGqzb3Gt?};v6eP1#0*;Zl>b(L$2wb_os7>3z zb+`JR?NKeCj{xe_>E-qux4npsEfR_ z5R#|gAT6i#+oUtNR_--3Unw~wO>i@@LVOdmQ}qlctdS9}6ZM`-CZNUJ-RBAOi1X>} zT>w>)hi@1SNxA#L*=2SaJK5?rrmjr%uldF#OC5egZgw3cceyTRYmIwfz3hVV}mOEzvDCrW~#3yF#0`EVH8MLi*3fD01e={|31iW+QQG$9G; zg%!#(*jr{#4CI|3s~5w=m=f51_}4?LV@I!Ewf9G%P{3(*GF*RJ1h|lWU7R`-C^u6%5hrOEFpa5ehnVMz0YQa= z?UFp$2mO|0_6y5MndavYA;og)qrtH;FWaK|_MI7ab?=e?=KmQ}7@>!T$%33YDaF)I;dh69IyiQo}pYtQE|%?u4=x)$@OnPe`mXvw)Q} zi`|F@x!asj4UC{!@bxWhD=aD*7WHO$sa(Xa*GU)~um*Q!NA`v`5xynNe$w^t;umh$-zD2 z$bCNM@SCvQl+`r9lmVY6>%gMJPr;%wAK4BzhVC)Hbg%x!nkVq{GBlKkoAktBhNMgB zTl%Dz)SsU9+zkgZleI(d-y?mR^be1Bk&+qupA2=jbNO(_zoQ#spCB#+^Mj%HCjonY zFw{u}km~B{TKAq-&OWn%U5ZFRzLd`m==gdg;B20tH2+)YsR{N|kkauWv{Sl6^K&g| zNFoD8g;J>m1I*x<%|j$Eqcp^AbA|3cd|!vD7HCqK!CgrWyJsHMD1%~P`j?TwesGED z(POKADFkFHV!xP;XqBr#q=jM$?Rwg*qo%I7hZdQ0mPj|(tm7OYsGpL&!A|MGT&gyU zq4RRx*z~EGBZu_OZF@@8uU1u%AI~qRlk;_`L>6eZxA3#O10x4tzQWTRNyJQzNIl`t z=)00uLOi{mq`wcrsEE+uCg=}r41c`hk^odUi689`fmCfp;AUiiF#Wp&6=Ht{E;&Dt z4O_YD4w`=|{)6UM&oN;&?b-gYq_nrh;f7Hv+qa<7VJ?=SwlQz8vH$WD$FeO@Zoxap zi#x#v)856qt=s@%-BE77T28xikaa#X9W()}dJi@Lmzf#Z=_s;A+(P&nRr=?~`6m)L z{50vOw z0#XnH3^QH5y`B_`);J_DgA<0+H(6yXaEblhhrqCdJlKLiZhr+B;(8HX0Gzs_DQI4E z!em&?*nlap9sc8ad&+QII+99)0xk&J8aV7P!3DcvFIj&ChM}#rSKC_N@ejSobx!@g z^RJ@uAQi60#N`rI_CEbn02q;~GG)RY%(%s!9T|+kvT?3rWx6b#z zo`2x1v(Eahwbyb6XYc*w9oKc;PpFEL3>NxxbT~LTEZO&xAK>5+n&9Bz&ry+qzpUsy ztiZuh!O2R#Q}+ZN{6KNl=)Udt@M8Z;DDWOjQAMl}-M!oo%QtM(7-_sf`?rUrkEY~! zK?wD0MJ9v?DMX9_YQ8JRm9=3Tko z*xufjkVTXf`}b;!^NU6-OS~*jp+lgi`tN0g`W|Xc72=2b&*jMtj|M6`0&y$-d#|Ke zfR^cB&ys8_LVFMOa=R*Y`u9;(2>4CUpZ)zEq$n0JQ`D#xNdS+B``_yuWQz2kFTe+= zHE&cD$_xGk0;65#nvgZu{?cP&A z+lx5<=`QdAGKEO%+1%hg#rJQUaDgsI{cZ^h-QC@~`^yEVlD2WL6G7b(7GvbSl@5|1arnp~gAu7EB7WBJSJj7+6GsPEz?gxbJdh^G^*{Vv#v{J|=OjRbD@sN@zP70~5 zpAcbBD3yJ~E`0=rU`+_bt?H$QuOaZtsZDS1Ps@y+^5kbkcumX8$JQAZ_`v=e0=uN@ zKHgug^h{LSF9|p@eU~?|NOM9yYJCJ>-`%Bpz2tXBOgmvWXdvwG@85ckUPqin8cEVK^~shnAsl;GaM0o$-fy&0gFs54SeoA5YeMBjv?f z!S{|+8d^k}Q)}ipsW~#yDRka8KHa^&skcjxomkL|3+_(|w4PUo3l=@S1M$pGJ7cdT zrKPiFqF>hSmp0-O5`LuwU$;j@4-E}s`jl5m=8x=TPt?Vi9LJN$JRyO9}7}@q84P*5NwSnzte;d~yw?;%@ ze(x=7eL%l-5fg)(ud*^tPxiXlBl@-d`SH&1tdxpjc_#DSGqr-sQIW>?{H>1Goa*c1w&7ZPUmT(HXphwIZp_Hxr+Y`~3?4>GJsRr$TuS@%DpY>GPE(%!g+ z2*#RK*niY&1^b@aA553%#WdVsuSe%M7n83v9?n<4z3&BADW>u|@Z6N>RQ5y=MQwk+ z-#6TuDoU&$O6Pb4-jM3`aI>9}U!1_Im*R15Rq#V|9=T`qzqGZ99V|C5!1O=gUu-=G z3*DULy>GnPN*x|dr=&vX-ZveHW_@h+y}R5JXgRnRe>kWd9SYA7zuinUGOUWPJ4%|>aU0`gWu{9VMhWc< z#!1Bytgrad6dmx5^7AFeUE<>?&JJ@~Q-IPBf#iwKGjiCZk=OebyT1|AmRF!lBF1#A0zydH~h2tVBDXq5ikbe3zSK=R-=X@hPmmHDve zM4N&MkmzlMpv|3}d_kXYcNrp{bE6v@8|N#C%)AgKU{K<^Sg)(_>D9SxJZ`ZmH74^Z z7&~pUo#Q+!))kL44IJexGbZPYV#;Njz42~wI3PRo(d6S7zCWK-)bW|V20=c4U4h%b zVP*3?Bs)v1`cAap;nZeQP!zKPBC+vpv^w`of3*t?i9E*dxt`^G_VB6!Kq!o zT*!4t<*f+QMoAYA-(Bc>@@N>HBO~YRaSaQTKA+O-3i!QW1?imG->%|m5f6!)szN3y z=j09u(79{o@GFMGFYrU0y215}%Hf!zel?-Q6w)s;-xybDLFZE`&o*R|#J^C2jvBUu zr+DJ&Jar6}gbrk@KIjrF?|-qvAxFnUC(-lox?`H%krO8&F6Eis@04dIVjw5nQ`q!{ zl~C-%5(A={F}ed8N`_#bdPR7Id@kD~-1ZbT{rJ08BjbCP%Gnx;0l@*8xgX0Qo7yZ# z(h|m!gDIP9olTbGxkV9nYu0eR@EK&ftnvg+uExL9P4~fJtkO}xB}rEphN3l1na76% zGTbV-(zkWcxmJrypaloF<*>KHxC1zai zxGH}3VKe-DOP>Bwt^+AS;!fSURXsIfZ%;IK3FW!Vxf~ zw+z$97Bz>ds8vl`GjfXtYN)8Eq zT<3*$(CIzsAqYV_4p&F}*X%7#*NAYLv>zCVi9 zoMeclWJ5;-6YjFhtoA1oi<;2U>AHFfi<;Xl)Nr$N4VrBHgj5&5^nqWn&;316Fcqhn zP=Q!hxn}_Db{O>gyp9stQeG1}n7Lu1<7t(=DicLnycP=f-5B~94cT7g?{QlC3K#~GnqXQYY_5w0L$kELzSFvD#M`nr}8o;#`>FxfOwI! z4Tq96b#-Wk(5;(Gnj^kh>P~h$?7&GP%gGNRo`CX*jLI;7qUVcnz>G5k<8a5I?CYgx zd^K~e=LPJ;9X2Jd8U+wKoYLQp9i0!gm+FqyebbToO&po6;bO8tvd+zxCfAm7s7L;- z*sOX@BtbK)3e`y`q0)=_gyyb~CYrDu>dc=c@}oxnM^j7giXPa`r~Rx`OZT-rRG?^i z6Ag5<#ct1^H;9zOp)Jy+UsLci=g~=r+})BW3y$?cm2DXe_$5(_975KqWqLy6gr&r;#8Vv;}uIBzA_dV%|WI z)%}Rbs*CC(`($B3b3kGO|MZfaE3?UuT?q#}Sf!6=|APCKX!lG0Nrq(dl-H)Ko7$PJ zZ|_5`R#}-;`JD5DzOSz_V>hLLC)2gG<9&B}MOffE?j#9~g?nbKtM!jLQ z!WviyJnGU=X9?O2j|MrF#Rd8YQHIWh&s+@Si%o;&CW7g+8Lk>xQfU|E9z%L&{F5Dn zLO0;-tnBNJ`CpW;%`|BM$Y;9G-a{$pCObzvN0cSezrJfEkx8Laf@=#D^qM~r}td~yYC~P}CQLw?vtlG!3K05Wi`p(Bo4;;zLh_LR&O($q)S_i!OxIOl2+tR<^1T&H?z6 zN?1raxG7Pvl=TV^%t#9VC4nc5R+rVTJ8f$Ja--Kw>5`ncU58x#+IS=O?PImLMZ7xw zAk(4x+rjOa!9GI8VsgF7D; zIOGSpKYgfjRQOHF(r%-e-j{x(_I1Kpdtx?=(VUbgjMct0%c!8}S;=~F^k$<~86+<- zV_IqJ9kZD%5QQ8<_#m?ommVm1QApa~9{69!jmi#-Si21uMVpT&j97%>KGSp3&XBGM z0_w{jo6ag^?KXBQCZGhf1iLlwPW;*fL*4D&k&b@n6UlLfA`zsw3{8ZA2kc5we9JHJ zn)E+xH-<4I=v%#_u|GFaM{5}cENN48#Lmlhv}B^}7&q6Tz(l)k!7t1&s!m)dci zzPKl18k@yQ;0~b_zr-4>bO$G@(|0>s1ti`}`FG*4ir${9=1WDJhOGAkhH@~7QomvB zcWeK*wGbyICNGv4^;p#P3Vzn+G}Q887{ujNEXEQI6!k3Z`7PcD7AGH<-C7_~8KgPe z$c>(Ho=aH^$ewo=GzMRygBrwC&h>f`5-&;Lex+ncs^Y4^cH5ukHcd-SIv{FFQyGu{ zVmvh~6EULl;RWcnE0(oh$1azWzl@a~yG)o3E8$q=zR-@Kmym`Un#^E`&aZ?y=Ril- zVlx|@_Fi@NM5HCL?k4mYaZ77j?rRB7S-dC`trk9C7UWE(71W~4$HA@$bzU3kkJ==b zq=92lesShQ8PEOlz{%?OUJntLv<{>(>Y)MCNxIx2)L>trR1&JQ>fIIgY2=FKZj5J6 zaO(%F=S@^rR)DWdy9QbU zZ8$kMwx>WsrF(b~ItyWR_U^2XHw$&GI#|0Jw@7PQa+P_V4s3g7p@=N`aQ@z4xA&oy z16m?e@_x+Lt`?brwHig5Qm;E_hZb#nImGs>V^R6U0XQ1ZxDv-i;o`vN@OCmQBa})pL?bix35b7H)BAM}LFn zP*eaUe>tvLnEN+Ko&z{X3c7;3zcFy303dplasB?9=`Rc%!U)W$O#iOP-;j4S6##ML zE#=CE{RMIJ$pK@e>fE6G7x>>s1E3yWlDxlS{|5K}r)MSUX+Z6GY;B>9(ZLqYqP4`_OD zX;sW(+^yGkt1>c3{kwo65wj zcpNWNcr1Uih*`aJnS18=>e!Fd7>u5IRGZ_1W1M-6WHEwV<6RuaixD*Xc;sZ zUxkT>J&btv%3|CbhTsRnK@e%V+@3nc&s-)e&{s|jvMFmO{(_7pZf*TK2#Y+Z{R>Kt zY43nej8?I>fAU+4gx8)0N9bX6C_= zrDpG|wKiMV={!&S8N#d1>$lV2mZI1EdSWktS&*mwkPcx5Pp0v^{08_3Q)73tScn^)0YIGn z<1wOe9m|1~^*OyllHcsCwpydrWd15JoNTpFVwrd2K*NsY67^o1pe>)G?jHYh8?_1r zqCRP!e?TJnOx;a{NE438HPun`6)5oUn2gatiEA2L|2_}`Myz{R0?af$7uouj^BHLlk2+8M#)O!v_Xz(s1Yi@9 zOpivAI64Ul@bHYOCG;KJk>Xiv7Vqdh2c>c`{tsW9?1$)p?cXjJgf(pMkM0{`6 zAxZ|X|Lr%miUHuInZ?qx-jZr3gW2($h~Nt3rNj{7Zj|8vs|EPq56yfIq*(K484NMS z0BwONm%m<(SoQ-MKwbK(oG@-ZqWu}XDPUeYOh-DNI*U*1|SqJ~0 zU#{*JWb^W#ra3lZXuNNVDC zv{-Mi#jd6CK43=UV|>|P{bPc+z*rtmT)=zrA_Ab&u%GtKLKP@r#;!q} z2=5;|8qbeAFEI{?EN|r9; zpfBAw(d&xh5<87r15{P zl{h6xiq4GDI!od5-ZSM~nd&_lpj*h^E2pXthP2K$8yQvV4q=7(s$xHI$-xUat z=lB}flmGAkl7s*<-XVlumrskfoH8+KT>z{|H8k7BIy^Kqw2-JMck7k`g{K6eFu<=8 z>3C~6^<*`e(gg6AfY<7An=uFm*um4d{9=PfVjSUfTm%FJ^hX}63EHoLf%R2$_)Tox zMMHoIYzl1y93e0llz!~)=u7Lp(W!5Da3Fu3cD*y*QRA^lLA;%^G=9^i$^ybzWTL~X{vU9-*JwRkjb!dNrK0I z%1Fx?c+K84bq0-U1Nriu02gLM5B>G)7b%Y|DKgH>2*9jq{!FJcNc;Z%i=IO>kwf!E z!l&A~{9kGXYk(+5+{h@?$u~2vo^~c!PAgmc$!gFS!hnfv3J}xPeZCC7vwPCj0D_## zK~Nv;&DeINi6;<3_UJ13E7)+bcDcsAA+0g4;wk~^Tn$%xeefnHWrR7A{f-bE!Cg{?mY zKsB?R$B7U(CXgB6cOapNI}LA)I}o3wE1tl*#KXt`z&hMFJlqY442GT8Rz5%46?eh1 z+>#Ou2dNc`TmS*Zc!in#x@a*ia61^WaIk~?(`sNII;dqIc7Kmm{CC{c=6zJZJ(Ro1 zbFnj?BgrvnV?L4=nkSzaP>Kr%gE!r~fcU9Rv90P&BPU?}VoOhn0d*WBLKV-GDg zFl%uc;qSHESH^$>vW21G5R+NwM5Dl68rx6^F{>^WpdFf*Y+OK4@0M&EMys0-PGrMM zn{^=ywF1N#=9~s(7{`Fww(tos^xCCs%-yU(ArTnx}|5<@>x z5m3R~pPa&?h9v(R+;uYlC%F69Xp02uxc+aWjaRMD(Re-~-=5U? z)_myAjHIMwQXejfzN3Fm_q=ZgV%gG9*DS#5)#8zgf`wXOr}6|;%}uxfM(z&wakraA zZM9O15#1-B{Oad*p>iA_gDSkwvX0(P1+7ALSg64g^f=-YEFk0kUW#isU&WzG0*-qc zE6KL+Pr6Cx<6lRBwZX>IZUr}&?@i#pYvs7D^HR&M4l=o%&6YyFv3zkFi@xUBgWXKx zBoUl2r;ctIX7sYc*e)q&|CvOtlWeS}k;D3?qHkFZ5XZ$S0QyWC2}H?EX}s&5oai@Z z1B8pNlZy0&QMGhIoOj+!USCI(Bhz+~27}r|Lw^c7(+21X(jV-))S3^ch~p_-MNcXT z4x<|C`Zc=leyE#VSnwLV~BJn zmJMxJ^x!hITBR*WNThaX7-?i*zP#mI6aV&k&ujU&v&;1g`GG0)Zm=AFP~IOl2TF{sHJSc z#`_6Ez%&;zA0l;m-#L~gF)YpEAm_@O=@w5t^ZCHLPcQ~yB?NW7fZS!Db!uAuWzxyr zaVt6Vn@FT{qH8<-b!{Ga6kwVobtL3GMUH$bnI$c)XFxXJs=v^$$yr$u zzFIVmI#vc%fHn$7)r-lVNzS{Db&O33C5x90W_2t ztZiKMW4D9D4i*`{HE8e404oQ~2dzpD61(y>#j(^3t?1?1|-do1dS2FQ9rXYgHI| zwVfWmW0CIf@O9fBe|?qmGwcNA0d}Um{xHT@&LL2}`xOu&kV$-vMXkf|@9TT-@hfak z^&JAYE>yR;Zn0+DDE+|F@7m=q^V;K^#zn`G*nb=`?q>n`0&bfPs+=j zNK46ssUngmrDmmZU2d0R341GybJ=qp%jG8)0nX6wLajqg(lQWu=O!Nr&`fE!H`>gw ztutsgy4!W0069=QuznqQ>c=L;W{__8CT1c;g)Gv4aJcQMSDyF$#F7K%eM;U4fOxda zO#;jJ(mm2Wv;|nR6EtRmk1)Q|CmSxj#L#cv_@Q=twA6UAP_y#pWK7alSe0rErRHVG zD~ez$YN$GgvN3E@Su{CBK(EG@qo8GcZ_rYZQ;e@bIWF8AuWz8QJ;4m+TXMn|kF9nVMA&KVD;myVr@wxT zbulDw%IILWyytVG{|-5~HDVB@>CTIuSfBfgnPG*%6V@l^H|7y#G34@W2-5xqkAPr3 z>_H_R=$|{Tc8zVa6SGONR?Ej`#e*bN%vKgoCpXq2`ytj^D)$|gvfq0z1>J|V-7F|l z0{a{3Q(u;mfN6esKuR%jjXF%S=FIGW9CA!tES&g1ECK1ZdqjRfhCwnT2 z8!jQ6@5J?$@}@$_R|MP-EECk(>o@RCf2!cadrTumog0l_%wXUvqJNd0m@S@11XDSd^qm zx@=arq-o%Nn>v_X^`2F?3Kiyenp?Zv>`h*aLWlQL3E?|PKdjR`41Kon=O~tPM&SI# zVANU%=^Phr6Ceh})(8!DA8+1SbQxuB%2-PrHLsI43Wk}kk_vp z?!bLN_-C&_uCgknNMkqX_}uOmDD5Hw$*7U~(}F3b78`5_Wa<%PhjWz$MPa`ZeCl7h zZ!gyWClt9l=5@=|NR)ZzEg|3u%`D#oXWR;#AEX$kNEWgAx)GQbY7V)4C+}vb5qVQZ z*o*J+mDh5tja;P&3-rD%UZg1^R_s+j)-@n}>>)`%LIEUe&D!;Nk;iZCsm#~Pk6c}T zkFYQ@WyG>H)yz0$5531W+cb8#_xyqAAZ59$3*+xI&PJsnr=QH!kxF^^UwiJxc86dP)<;Z; zNgyqaAY;F<7Y4&x914Ul;N;A^=oNK(s28sl3Guxx4QyjMMv8*BE7L+h)~#KbJxaBLY9C?^$zY-bJYKbJ!5_tstl(d{9iTSlRwc~gkCQW@a| z$iB>qhyf5of0XpXzhH)wO~BM_LAs^lVjEC}lAXqndua1M=i9;Y*)ORj4jt4Z^TKb6 z&noZ+((g1mKXM{VGROx$-h4psKmY4SkhSuUy0k1x2eW(HaVZwL6D*Hpwbr)&mz-rH z+s~_k_lSSWj;jhaw4`BuCr({4QIh8PZ4k7M_(w zr40i|cWzICv^T);x*b2L9s)5KZl(jBvcSjpOhNfhMRCb!#oF(Bxr~lMRDyROFZQOM z=~lrBxFcrg$QSdl5)1Z3_>XS%gKVY%F*cHj;5nHlrGXu3U6IC2x>NVC(D_xKpXl8| zWn`lS#$|ad@T%UYQij=5wQi|4Z&XLJ2>C%FSofh1)91$@Hg0fI4xe@pD*a6uTIfnZ zkzYoIFdnhUhn9qh`Bp=Fn>z|^ZuU5bX0`5GUY}3-77v>4%rqH(s#<(F#?xJc) zAX-0%zm*%gfif?CxcVSTmAkk_g1Y+VdImknu*3-Xhx75&1C}}ofc0$^X4q!l9iupc zTE$C#Ygz!reLi<+T?Is3@GnheNrHfUx3^2&Y(O9_Xz0tYKB2g< zG@9K$#ld&W{;nGg7M;9wWsB&O=n6KDDw8_{;j0=&e#uA${u*2q_nRaeup5R6aq*a? zCVu>M&kmd71|inNf(y~r@43pqS@R%Cf55}H#@9NX%_D_+pjL;K7K#Yr+x2MCl*vUv z6&?+U)8jo-pLh)wMF4p<d^m@=tkB#mznSwb|IRG?)@h3KWS{lS_<@V}7KNljvzD z{79)JG19`dVYbn>t-|w7qlOAwh!r241>YkT&@n42P-n{_dyKlnh&= zG7q9xfv!7#-;^2J%38bw*9ui~9_o|iZx`FR!RwwrKhCRfSS2D(;6mBl8u()KW)?dM z@}4rv%Kj3djndZ>r$w{~BUInwzdsW-Gz8!nYC(1!|CW}Kz8dMRSM7QotU!!5%*@xiDmMFcbs+ouBzXQI7;KEQanh>*tf1szqha3H-#3rsROIO>lf;=?9qjIH1=09{`%c5P0yyCDN zVUV2MhmI}nqyJ)l>em-|#S|(wM$`up5e-dB2SxzCC-+jd!-eN%Xp^A5?lfg65~#5P zd0|&vDpC_;u7cbX zF7`v9PgcYqR;7Msq3b3wDuB^4{mT)H9N`Oc{iowNP&3v7FQl`Y(qwt{(-yUko4k4V z^*E4_OTrqW@fx=zT*fORq)BUAh1u$0&)2ts!N0_PKiJn+sF(`vi6HA+^Zr`i(%GT( z@HHr9#X!4NBxt$>Ll)%ylUSdo-A0tz08myy;NTnHjIG2J908GNkN*pO4~%Yyt!08f zK1T$dh3}EL*pFrcun#yHAATw)iJneI(^#xvZ&=0aIVWf>Gwx zx^~@1q^J6$7s6hI0O3K0j7bV{j72Jemn0 z!Qdc(Ps)7alf=4Fp&PH$13_gV;U^rPsIgw441CDFaUc@0xWTePYe9V_N&GEA%_Q=a zGd3o}oz!?~)bFz`(>Qey4oZNsZb(t3)n#0>+m&X74hQmC^ayWaZJ3pr4-gIDAJ#Yb z=u6-=TI>sOE#C5HPk#oD9SI!z$xFj4dJ(O*@wE`PU~W#A8H%Ed~Rq{GPB2d;3$Pt9tnGi7PT$)#Ua znH^F;v>kPr&-fd7dYw#agMI3M;YTBx|K!kd3%|r=t*YANS>eQ9)q6nGlPR))yz&<~ zJUki+#2|UTnwp$!h1i~#2(rFvZWt3pbEI~=XnizLKlpGx|H?Dtmj=cUijZY7=KVM( zwIRM@jUwW7pHo=^t1ceJbfGzIQ#*n(-ycEnsa^Y|ffi$;-o!O_3qemg4ynk18~`tN z1GsS*!1lInQZWCw*U0ddtRZsxxddh%K2^XI%e6Ko^Gd^zz! z(?rNUY#D{pXDrK^+4=iFaWOtxv2OLi&^3_UJ0w&K3D~V*DU_z-z#Aj^L$>}|GqJ92%}x70!*qg5>SaNH_L?_N(RTO@U&NG|gh9k9zarajN~ zg*KB&^JBJA_+f$kB%{)wr2>;y|w#Ia)e;3N-OYV&I#)zNsTV;16cTJeVKCf8k%b!#S ztQb;d*Q+pOq=g0%X1Ii`Qoig-S+`NZ^L>8Fp=m%tr5bk))XsjZGG>~$fBB`YSsvqI z=VOt*)w3_;^CB>)#5&4o(v-)dlT5wodlF9(|H8}Fd!PjP1keqnycYm+wrgOKNANw> zn9&Vtgguo5YVRwM^V%aWy^uQ{He0lAXkPMMkK9>qZfurPzZF1RmZMQerdBya9lO1F zs#_FgJu2NS)pwA+yE^WDC`gyyX!?XIFYl&sFj00DEB``VT-0drK8pqZ#h(UZY61e> z3C6-M=gZuK_8=PaF_uEI6iM#(I*oN`EB7OF)n3#NKf*S*z-X3$*S=zv+;|~*r4{Ge zOr)UIRNkHV+NQ?*0TwwA1c(HYyLkisd1^G69$vE-7v^w{P5G^!GCJP8v`|Nqwsukn zimUl;XW!5`-w0=hcLGJALH^HB0_@-EqvdiZj*{~BI#mM70O6vzN<@eFHBDn`$PFSu z1X=i$&ez!O-#j#QH+)%jnviZrU!nZW_1WtBcmX#(MzvgNfBae9?^)^UuuYYXy;Hc*7Z!eFQ!k?ukWDVzgDCxQp zurouau-HC*Pz|-OzMBTf!gWAc#Y-I^2w6IW5;u}(V+_)%#5;LfRe1t{VEY#}YHDgn z0OVQ+0$WFIXoXXRNXHbK{pm&+rPc$$!2b5Su&(U=!r`?meF7A~cCM_nqT-;NHAvR| z!#1(gv?UUCMvbol+yU<=#eGgr&fjhqhEU48m!}CZWB~ByN`C|2UP9pC`nZ+a1X-#0 z;3L$AMb0LoID+4{yN^vy60#=Jrjzw4i2z2U8EoI-fLDZJ^Mc^Tmzfb?EQ3AI=>5>Q z$eCtSk$QsI)x653nnm_HhgsE$Swn09&O~rpRuw5WVw5dZ80@E{>%!`R2AVn5IHHDd zBa+qx1thMT3URjBGYPj7R5H5LJl?%_uC---?QVCR1zD;>n{6cFbI0r(MWLpF?EBuN$pi^=d0s6c43-Ax-^g#9+^~!0csrwT4cn^Z65XtVp$2>vf+lhiB7u zarfV{@FFg$31n(1S-2{TG{46*x_!9ijuz7%oDbPiL1}p<<-7M<4acJ;G1VrjI4N*T zPej0K>X4@n0vBq1KIQh6Y$@DRVZZg^f_+r5V<854rp>#;*%`9Ek6~zN`0?yFIf{~c zk^iimEl@ut9RRq2P(;#@v{yDeEsnt94qjMv>t&5@%mG()udYISV^V!On7fX`mYAVK zYZg$C+Z9WVqWI9Z-`X)dmpI#8EoX^COllIr+Zf)8fTA@RGR_>o`>PD7X@7 z)1HWS1COOZo6`Dx=j8hFr5;0%ea%0zqhj+Coe{HGhZEg(9G(?s9w!Oio<{x8-jB-5 zJmHj|Pp+L!_b09r!L3NCD^Vned39o6)5(sx*RBB6pRdV>KIQ)6IZW-6xT^ZfG#-Eg zB7>@b4FGj{z$pcWkTB-bHUP_BD)B0eMpYLC5^?Ke1Py?j4Ts|`;E<*4yO1S7Uuf?vJ&6BpAQF4RQSys?1X>caA z8qqPPwHJxHSS`TG8(KzmFj2!N=#ox#an&=0YRH3Ju9r{v(Xhb4zs&x}Uccjl^QW2B(X38Agf1Mf9;X!#2Fo{RB ztArG?jXQ%tlS1|?a*B#l9rM+E*F%;02I*|>yD1#tT~D8eeYM=J+-$>2u;(wWanpAc zyJC7LspS`>r*B=9%?U_C`aoE?V6T9MJJ{*Y1Wh0HBM6khCWLD(0w^ry||b77;<@$_f~ z@-#Ykd4$-9=mm+}6bY%WGKVuqg2Pw2cEt;!E5dp+uMX~HaDP<&%#_t|W%(_L#i(>j z3dv|`emXZqS5s|P$ipPN;g2n_%!m#?w@8v^hrVlzmuw?PRl$uS<>*LDy97?e@RsADYz&4p?7fb*V_4#BnTHaIEE?b{*%*}V3>I-dRH!%*Q|iA(V!vTIiIoWBHTO?-X8mH{V* zuWE;YOZ(E^#W2)kX>+>%X4Feq(3))ZW`aJjSZ5 z)SCHTw<#tzu=@kr45G5;%jW<_bF5(;StlE6k~nI8N$%hkIJ?QDU^`i7xBiB~DvC_~ ziC4K#xhgt^H?J2?yEfx>j-60Spj?fH)Kug7+UKC(-GQ4C@TJNqa=dM3EM|3$@Y7lz1thqYK?t=*HI8lLBxHbq$csjBU37D3eqah55l1z(w-s z72-F!8+}}q4l)CR!J9E4G?GzQZ=c%(4o7j{$ds3CyGMoo;X*F6pbf%cZ~CqKdS`nZ z#Y_46dIQi);()dsjLY?OWF8I$U&h5}cf^W+*PD3!TZH+b!14?7jOi+cQT{2gv_b2z03OT$ncSyGL&;uQwy*@hftgTO{96Jwm$Q%hefetFY1FIl% zHsVN3Cwt8PFjTCE0_W$TFnj?{B^fm)=gwPIvbCU9)++9ZOH2+wpF)YrNdMAiK8{*U z2@1?xF#Pkx`T^2|HGt`r1diZ10Zw571SxnxLT4AFPzw9^WCLmu)cI{zx41`?dLqeDz{Sj`uS&&K8`Kf?<^0&=fT)L@BxvM^U}IHrEGIi| zok-uneDt3`CGV9*10o{SKU!?R;^l=C5y69AMN2z6+DS@v(@;|n2-$4j5TAAT59=$g ztvNxC8i(5PTk!BKulpHL1%CsvyO_g zjn=+2(%qq;NT)C~N-B*?rvtVz(5be1U3diZ-sRPaG%M?_XNTm zp*GuL4%W{3=i*hJ==XleNsB;eGWdt83G_FNR#pneLA|WOD@)6{n?b12tf8g+>Mw!N`Lvn^-|%zt@F`2dufE+>gt9*6c8~H6Wt*55 z{MEg|+Fes};WmdkQ7j2TKSVBGx^;`-;yt^fL!`Y)l|{{{Qm%Jlp38G-A5;rj1JG29mk^ zYt2T=`w#JoIsoOVt7W9hT$MJ{&o2!hOUbt;^<_IY*5JY05w3dxpV|0Ap1d69Wxr45 zQLl(t5YmFLAo$hzG`yoFpH?~Pyzc&jw5mXMhOn9L zHfkBZk}$D6T8XDUv_->j_K$wG-Mn$=cO3~Hm}k~U@$ddrc)noUg{Mmf#E9GvFn61` zX8(Gw1V=>_KOzbSJZo3u*i#b~^)1^|@sO5MAu6h0Bq-ZZ`EsNYztk0hKb)^b@aa<| zdD(2Oje$6ous$;^-SZ1Ol3-`CZa#Io<|73U#k8Kh!YVSiQ_WsHq?ly=<@Kg^&wNJY z-&R$F=Ao<;D8uEULfR>T&fckh-Q@UBbdtzDpik(2x*9$So3J4BwzS`Ey1)8MK>x6! zvx%Vqwo+Zxld#jcg5>^NPEOA8sEmYxi$e0-=Ro0MPZ-z*R1Gu0^6cSQ_g(M#Bpd?r z53}XmU)fXZa14|Jj?B31+BRFpt;%TMUOm_Oruc=5W~mFYR<;^U@KUTG%4~vfSKgHO4541ihqD3Q5(W zS>;#5w#=`k9hXT}y0A94l~@3C%Q2Y$%sMy#udr(9H0o%akVD>@L_HvVOUVw}_!0 z<#w&p90VIt{4G%6>*>A5-`=Kv$rdGCCvopUS#|X5=Nb)dJ4%`WM4U1sXNr3%xh=;R zNLk^5T7}rr6zEi!j=QgIu4^ABZyQziY%#DhL?}ugZVJW%S1%qdq+++|48!u(@PLi^ROxM_`Xmjz3zBy>}IUGsalE5H(7$V z<)aeWme~=ge93)eyfh`1^>hUook<5nyGQIOMv;E7Vrf0!Gz^Kc+hToh&Z=5!Qe|`& z2;}rc+hoNPBYm=$$dRU@HcZ&x&VWCHi=Gi1*IEqTJ*)9?BIRn5TQ%nriTFj+$1%nd zBTrAx(J|`x(BhIYL@Qfc9$Q;@911OT_1nm7yQ#&V2jkG=@uJJnZ|UAWgS2z(wt^?T zR61v+xG+JX2oz~?MAvj@Hmgi+$T`2PCZwpLfA8V8O_Mm=DR#k8_fU@5Ry{es9@v)> zBSb2DROm(mqGH~syYBoJU6i5HX_cD+J$xgh@`*;Mxc6boW`@^-_<^3*2Ef}Y1Ue29g}aO!HLy!HnA$yX*If5h3vGDG*Xn<*JXv}TV^Z%((HWV2rUH68Hjr6 zNfI)67Uht<{$Gn|OT=^be*>ev_=+`K0!Z(_ehs#ot6W;7lfxw-gFawlU^@7`_{G%z zrsuDYaW>1BiMD)gR@8oD%W-N7w97`ztx^X~4Iq0vaaCXUV@ zPG5+?EOl?M`q4S2n4TWNXw9C)&4dtLo1a%d)|Q7H`o98YoT}E(c=uEE?6vMSf(9-T zxUjtp@?Z1bz23FoTz4jGfGJoN+W6K%Kn_%y1_wt z*1`L7H`nDc=k3jGSS!=#exde@Odauc$jO&qSjskR_pe9`LLL@CpEK_{!umi5rWCDY zIDI(BkWF8-qP>;LV$+t*-%94wcLY#=eG&%1sBr=x@nAu$AOm&kqjw5sEuS|v^X`_p zfE7yv^YxM^#mAW-4^0Ry3m<9F!$M?uB>}}ub?(3)=6?2hTAEe7=&3?--!`3h@_&z| zpD%=C=u(KJn`)7e_)V(pjh62cFZQ77QfIt4+b7qGQQISwSgqW>+?)0TjfqT`(+!d; zR{~>blIe-@RGH`CEng9Z)8DOI%f;2~AvE}ZsytOumO&>8+uKi(U62>?-7X7(g*|OV}a$@tJQ&rFCno@!zf_PLy-&lDHda+aOb5V?J z@)XMF+VsYd(4|(DvVZ)t0m=o?cQM&mJPN0J>WCQ{39384wYH(w zX>OsvLKzo*XZ;rbsw4vS*N~NlhVbavDKK66-BEb`WY!EzUHe0$KgsVgh~_Zy`!hS) zTkEzman{V9UetSsx>?>VCEw#o?NU3R?)3Bx4DnUfi0;fJKgKv^gvI)+*XMRu?bN|X zQfGvNpniAHJ+aSA0XiM%-8WMqBel{3>Bnz;vj!oWRcMm>*|*PicGup@ zOK0O}b8NxhZ=6*gwOEHYJ2!M^q;G81&enJ!P^G%F(tV?{ev3ZP@Rg1gived%Hu5oc*mEWV*m>LT^1iUu))+ix9Do-O+LBQK=X&&ef1f(tL_>kiHJ0MZOHQB7qk*BX*8$>{0!SdQWb8H%m@Z%vxalbQH|NG3p>Pih8RM zN*XMcg;&iWe zts%ZJ9ltcGvEX&*j79G_u(b18qPN?1(rj+uT9is~eIcQxMgiTmCJ(%%h@8o)>St!% zG(rBpc_=<}a=%f3XDuSGHBK;Mx%)$P(Cqpa44?g<=#eJ#^;I?sjDt?q8jP0;Sr}rH zHAr3e>l<(7b!wF&vJ;@n(lkp4;P{?z4EiF1dlmGo{c*UD(`5LCmdE)x^zS-}t?dD$ z>XGrc+vScBi>vDZAY?9II;+GKh)!8Y$*2uPHJL684oHCF{O(4dd$~mv6Xzp}>n_hm zeRuAqO9NrUKG&#vzd9z6?b7|1P?$ZZT+eB5$_Fr6X&q~FEx->r4WHlO%q0hGnz`um zU6CT;Mm4X>%=_=&?Z7e5R}jFyJH6z3gFn(b@*!MKyat&tNC0dkKW?kd8wK1#3oq3RPf5MZrCjA2E8Ra^hXcn^J4V&3|Lv9=+sWlXU!AgfF3ScLGJ-f?Wgf*XDk(!>F; zk?t8P5zpV?(%!VyWCy>1d?!Ok_1s2hiXFVZPR=x!n$Me2%#~3lnIcUHF)2NJQ)v>=wa=eA zHH=>1hx+54w^Rt{mf%pC2*CCVMk_IvSBOYBUU04^M<)_VK+SG)k4>3Rd zx*DYU!qMf+QE#c?1?s{~m6**&Qr6LB4I6Ta5PYpo5LX1Ybr@Iuk8K2t07~42!q4-^x*co`o3A&>@uA_} z7oc?chmi42SshU@1?<+}E;Gyya}l55#DKk=s0IU==)mr3PLW66(J|BYa|u`eD73#^ z`U$wCpC$={=LHuP5i7TzWhA;jTD&VvToSt7Bk>Qq@ua4 zzd*u%So$t>?_i*>Z`Lqnr`Y4o{<0eV)^=(kjXNZrA?yot1 zxM0#@G~9DDKEZV9dYiSL7_|!H2tM%@Fno42TX?dnwg`had|@-HOrvOoNCz+pped5b zwGYtLnnvsOzcMY>Hj2AqXbqxcT628OUy20fE{7iWl+Z5^jM_7BSd{d0DgLCD(|$7gnQ&Ms#m$*Mm`Pw&K&C{J;K<^c8bU z?3k01WjrBm5*k|C5$AP!z41*bo1>*>T+>AL0jI^7ZQ3hRbJpUy>a&EimK2T4P!;b>Za%yAK<#epSzrh=}XX!z&H0Qjqbx z$2UK@+D@1jW%E4L95C6n?0g+e8nbdPwTsos(iG|Pv&Cz9N%n1v2Z3FL)VI|t2WZuew{ zxp{;{>*N%{bd>d($~EaG6Iq|*x*r{sQ~LWL3=GeKo=P$-@HjZxlQ#NH)n{tm2hU+f zRVt2An{J*wQg%LgE++}e#UWg@(bIB?e8oz2A@v!%|BHJVweu33rEEo5GAkb313Y*MZT>M@yy2w^D|? zSDd6AIv1d!69q0<`ryJuxbiy;=()9IfLpK1Jr0KYLuTo5Rsee|zknOfN|gWkbDS6c zG>wJ%nfdhk2J8rxgf3GL=X&>U7d;-lfD3<#_;q3a$nGY(B|xKm`1p}SA7Xh* zv3r}-xG0C82Hv&7uF79>DK~9r+$gw53}E>SSEVM0 zkE1H?c>=^e_^R?1Tg}=<4xQ6t6hr5K5;B$6e11dgNUKr#ZhN6osn&$|nG|%(3;CJi^o2&(Rlm(yd_0miOh956^+5WoO@CLhNcKG8lZ$2A!{bbf5|Y;8sR*QXS& z8O^=c9n?ZxqX&R7x#ckI!8v_44D?Vx7-BC)>4cAi-o@g;vC)E>)CfI$c`C^J^B$)W z?rH6fXwH-oVsy#9!a$PWeWPoNsnT8-2AT5$gRzm3w}?0O-5nY&Q%Mn>(RrIo9>9ilG(p%ugwveWDV=F{ziX|1 z8n0vJ#_M@kiwj%tixYbrIVHKruX?#>QsQ-wr$*g?vMTI~4Rk~({Psu1g6#=SOb-62 zQ(@q+Xq?cjILCvRA7bq+E)jQBw+wgmD^M=1XLf8fpexKPvn6B7FXJv5rMM?Qcbes8edU?7TLX|lSsH%3=z_BdT$UZ3 zok;^Pvotq&J6KaNJ6ZGO(A$H6bbN7<+ERBr`1@^hF@c_AyIxQHSx1&wX zBMx0`Zqg06Y<_g@vMQXn<}zD!<|>%5O1w4i?ndzOX}Q>MY4UihfS{!G4DwM@65iAE z-MbdP`?2ir>FH1!*n`)@p>El1snD>6;z75;2v_s{g=RRl2o>PW!!2x2?&NjG-@zcA@kA+0rZT4t0Wc8xTF0muoHh2oNU=On=AmyPoAwM|Te3&Ha=_ zM<~LuNRQmp!T7;7K3#BahfD4D>UMa`j5}i8M` z)pFY-+QR2NiV+>E{$Q&-`43^?9ltDR75}JlbQ?=+kT9z-PNhMpA-j!0bx1clc+yfg z*wzw+DojxTPCfz*aPs*s7Z=V1KMP>ZframZE=czqW6%02qsaLm5h=_}j!_hRzJRHn zG=LZ2i%wbwv%mc0j}+*l{Cf%Xk;wbox09&gMMV{JJ;mnEj_|)pdc?;1n2vc9GCf0E z8CDG1%3X2@WtDVhaQ^%mjw<7a|Jl!19nDuXcZ|xMZ6ca`<*sBb80S=%A-9v`ADMNV zo-~u30k7&E_jh(ozfl0QH(5B95Lrk_NLQEm$Ux9@@UDICUh8SL_UG+`Kox`Kwg9>a zJR!IFdIy0+WW)y_fEQ{m$6tV0El>a-d+%c0=s5Gor7)1wAw})s526atRka=BUT<1o zWDdP?M9|k)gzl;JOE@NZc<0)XP7k6Da3Z}45{C_^SistCu&`H}OcOS6w5%$J zDE`9h`IO3$?Hiu^AHWC5{&Ahu$G{=~2>_N#_=Nlk#G(uh4i3K4rqmuBMSOB!spz_{ zMnImhIvTF5e_I7Qp|WPl4D>NgR@A=c6XF33pC1_LzowZ|0UQY6(6H-6+C^wJ_qzN$ z^}fU^<*U!#T9Q@@-f^0{I{t$ch)TSzKNX?pvF8o7%~21@=aMKHn|O!KhQzjy(cAkW zBtpW>f;rUCutmft;8nS|q_X$;A)Er+vuw7Szistje*&5Zx9L>9(_y+f`si|d(8%x4 zZw!L0T`x#YT+T+MILs%QA>p62fn##b-`f)Da5}n{JZaqasTj4p5(4oDS0L2pr17Vz zJkh6aS7JCx8!&z`q{<`%(ll+q{&kboX_CHQx!)4dstcxahmGtL^qo{sSU)T3d$oD~ zqt|JlBGF=@kCFKS6&WNwm*cg6rqq0g%&ZG7XY*Gs2=Ce9#{E)XNjth5e)8#P^l$Wc z-?b^VpVR_@r3128lp<(9vvQx9{5)wcph#MJ*y2^~ZOD)>l#<^g2@$ zn3132ai;ItS7byUgK=q3{?*6>Gky;rSX*9+9w4A3b4w^gAxuf{7rnH+JdZ%_btn@* zKmTT>Lm&$(vu5>xg}fX1S2n=ycGHo{fT+fQZeK<|lj&2&!7GiVnYTY%gAMkFG8nB* zPzYEs$;zDvq-$fN(Q{cs@>Ih9{(oep`pSAfASSQ`tyG!OzN!yz?*~aKuKak|)RHRh zf}yGW0ir>dydBWJuP^uzw$53t!>s0-i|5j0iF+WNPhFB@5TQ|P+lLgjJc}S1loS|! z{d?LZ%^)yHipm91F8OWm=SO~Z@Qd68TQ8jT7@9}D9}2c`Nl=1v0`SleQ2zn`bl*CX zw3sC@_}@sa|9hkk5As~NFL9gM)uI20$%=$6avyKd-$+J^8@t1c9@e3BE^HapZF7|O z)1bLq&!?4>r+M!9`=23d5jqeeb5r=2db9TrZlA#g85(9PZvK6DyuwRJ<{L|z7o8Xv zB0Ez?L#xEgh!zu9nEm0)$5)-5S&E|YqGMx9TfU- zj>zvmX3PydzbCSv=hZUGaFZj@o^HAnfFp)nr9>wJ0J*+hb_&rBAc~3{PFrsNP3svL zc$+e#R-`!S_M9M>O=s{sq6M3Cl1aLLg3>Gqim9s%c9-b<@b1f(AGob%H1FV3cq}=I zkTvuUYSbLc(2JJ9pByB%`7QF;(W**0-WAGY6}bgxr3oFW%#OzuUOdS1R@d8Yn;-Fx+okL|i_a=Glx3-?NnagzIb46UOGj3SH!lYyJ}GWd`` zNJvOYKm1QOhq{4qeF#Rp26Tb&T%t!*9^1JI19WEGhp(2xr`$HT-WG)6mR2pvefaRM zM5i(QU2pH_djxF3XOf6*SL<1H@ZQr)ZEOPoJwzNOazOq&h2F8QH!wz;@ zJW(weohJLz5t{?9gUJIBmc>;}riEoSi9Z8d3Y#SwxE?Tq6rqOWE-onYO^J!N-oFGL zkq36EZz?MB)7miGb?Mlu_i~6Iyf0C5I04OvOQQz5kFR(Y%FWG9xExETS?@|l><8Kc zf}VlIdm7O!j4+>U+V!an&fBXjDj0cf?J--2QA>EQqg@y&Z8RY? z>pe=e)(q~nzM{CKB#6!UZz!@aPx^gSiYUnE-T!d-p)uthTh7NS2yd57=l=ZZy~y2p z-Lk9?mQEV(QbO5YMKW-Q&Z2^2;N%<+KQu%8IuQ14Y;=^}{mL4@)5wf;L-r@Cagy9Y zeJ&f*8?TnRYK@(qT~tMar(BqP%^KFHF-Ts82KTKP4fx(e<+T*ka z(wOb40iEbrw@WnsqY05Jp7-)+eU!t-l<>`<4*kIz@y-=TVGsGDNX*uqe?|U^cHNr7 z`i}Q*MS+Iq1xXB?&(UfM8uhfj3xD&I?PX1ObF-R5hH>-rEl^^$W=!hXsrmh#Ok}jX z*qct|waK2|t2P^FJf(}_p?EsS8*odDmIldr(pccJ;L`-0c$!3JNZqsea|dT4ul``~OgU{cyKqffBY+W}Q$4%qQ$hU24lb7iinKXOH(VD;O##+TeBl5yXF7NV z32aMESyW3-6xDWf6^3?_$yG4gc7S2%8D889BJS}QjlM*8Tjo9;f(YdnzX zOA$C*ESGWfz-^8r?8rRIW5to{+aE#c_Y9J2Vmtdzd#fkOHC(@De$?>-ANI&D&F@K( z2U^Bcf76a~rXsYlUtpp>M`B!fhA8FTHt|JMMh@xwcM6g4vx~jwUrL~%pGz%{!KFJU zKGo2**!5n{ve?O4Ws~X-E?VVa8@AP;?8;U_@f+nq2^@SZYbQKMh zLV{0lw=O^>5T>y6>(Y3 ztFRRHHVwbZ6+0}hkqomfCkQ9AOyffNYS2YeMm~~_Bz<`h(I(MuHyWWz(Qn(zj2-!@ z<#bWVO0%rLyo$h$0LEKOm1vJ0Z3|yp%rd;CoM?uh0KK zu^$RNzcQZtkSb_9MWJ1N5La6`j~+}ahdpaKG?(#`2;<$jWN{$H{4RXMx(% z=g>>22 zeQ|YYNF-$Z6TPkta=S!HQ?^On4?Vy^0m=T?YsKfX-DmA$IxbDZ<= zkstnQYPh=cSD)>pG^kvH8tDF{UMgl0SRcX;EEg@8rE9Xh5pPS7G4u$g-bqdl`7WE!jB|n#tmT z@9BYxi~Hy3Pi^bhe09s5&V+BZt{z-2aC-<#p}uj#kB6aj>f;SazwgII=gkLYd~izu zpxy5*fCt3^fq}%K1Prz#^_PFgR-%5rI8YRfq?YeErv1oU4{1eRi47XHX5>E2c9;3V z_}gmECvV< z;v%nq+6Kj22*LJJtT@V1{j#MEZ|>zFf#G!-SF%1YgD_!`V_Hkh{2MvLtF7WS^b^)k z%){dT{p0k;G;IW(m9o5=l4ktz7fBHwQV6*IUw-hNp-Wq7>${YtL`Qoodlk2Z<8vLI zwq`_3-Pdk+=c_mTvOJK>n~Dex1x>_(W_?I)etVlD_#aMLI;JIoItqys^+?c$E;^`(fGcyFTU3?>8B4B~>L zWZv(|OSw#*R&6m#DAnsDIF0Wmf1pR#bbMzf6XXY4Bgg_qv0`(RlX4_~n&DnLBCS96 zfna1iOnzzV!SGeuhi3XcecsS`+Jno2aNObr%5XEzask6hoIA?L8U|d!f?j$}3CGyj z*odi!$Vf?h!{D4uM7wiMfB(?ico_8NRfk%aM+3nK#^%Iwy{aAmz)2WPhTF zoD2eW?_G8HkKCLJvYk~g{r8_+tYKo|TKR*Z0lSj$PRO^jt1nHif z#Uo|ncn|kHz8a2 zS0^jFbfxpqE-h>mR)Tdn2W@DSa@=QcF19(ftXlR-g2%Ka$mwN4mfnyCKH^(mZ` zHc@Dz8E)|JPw?wz1eeM5>|^;J6*uG!Rog7D(xoe_rgC*_>?fAJKyNzVRYQ2*;GlkB zdt@QHXQlS^npo+)fNQb%s0h6u2~0~<=(X!BVXQ@-U}0Lr7_Knq$*0u%1Ul7r z9ti8p;*xI7?%&w4s04#cZy;GRmj^Cea(PdoCoM_f8t))A71;uKr=ZdL>njKYjx7H} zWTgohy}wN}618B;3C!=8vzMVMxJc}f4yC(;S@(gTQUZ;9NY+VaxODKT#BhS9>#r~t z+2`yRANno;B+hSk<7+@zf0ep@b0QtehoYX}RPowt| zY>-46%$VGVh>5jLPe}UvDL_w7xWq!Q4Vp(MdU2c!H6}=qO9~%0XG>dQU=uU;)cbaJ zsSlrsyTq7~Q1=sQMXis60G%}u8V371(j;MQa&NU~Rk&lCT2YZN4uJhi#*lAHN)WN=3}l1uG&c8H z`vN$ZO9<0V^WW3>*Kaj+q@Rr;XqD^ZRy;4>iQ||~Sz1uP$NFWN82B&zi#W2xigQ7` zh=o*HN_@OA4eXcJQD04C^_S8-XfXicE~PmwaF9!-aGP)Z?$6f+ef|_MYpuG*)XUp; z+8TxfFn^@SDpvuU6-37xSF(o`p7rUPU3sDeyq4u$_-L&idf}ne@O#|Za<+Zd9&G%B zRBz-F%sD=alEW}{RC>oSLME{33V=?iY#KiyAW)-0L8pSEWD;=POWiJ^KmSU|yCUQ?Z_dS9zGb*|fd5)JVFt0L;>vZ8sh;re zGAI5pOC?0(prJwaG7cn2fS~JawP5PLV(Qi4J&jUO{J&HH5#mq%AQ1Hs2ucN-?)l-M zN06XOUUqxA=#{d^0jd8inC-m;Fj^i_!&^av<`S3lh8ca97 zQ#Wasi*iovyW0I@KLU;@foyE#l5%tz4DH;&a*Q%l5c0ERV`Tjl>!ES~Gk zBUIBqp(NSAzqMWa@PkS9@5$-nNjI6H@FcSO^ANg4==&?jQ?z402kNDHkp&57Gn-yLUve_1Y_WV0+^l67+lOo*rn>oYMlrjsYUU@_8B3xc$THQV>SI zifMRq1IpUg6BB^P2>1z|_YrwKV_byFw{+!ou12amC8C+V7L%cAVS5INYkaO&jMi){$oEGdK>8{I^cUny334#2MX9&KSEuDw;L!$ou>e_L=W1PC$=>D%>>w)!+l)SEjPrJO%2{)7DSv+N>AlAeQ^Idc%Gf zUSt=b#wCFgO{v0o@UA}2ffB5wu&0UHl&@)RF)n~h2mMwVFG``6DvFy0G1{f(8_b9i z_FrBUzWs*fYp#A6=5eIp$64XxJrGw%s9^OKpd?*!;*Fe)c2Wf{37*yM)b; z?EG=?a+f93@n9|_GonJtc;6&ws_2qrxa}r|o~<(>g*iz#L1z}SXm3$DAhX&|-FfhI zR{-o-{B5IZ^b74;>t(xoc?AU&mREo>ikl3viUcmi&Gi$0Rd9W61BU}!ne#wwFJ&t_ zG3#3|H71omCfR|1f`4v!{D=8-2O@G30mnbrqLsD=XFEe8kK)#c3q4a8kTxqA=6Y9T z+1!r{s_C$JbWIut+TQ)wer&Hi`zIL9cp8)&`RiLC4S=?Y;<+pAur_T}5i%twFOR%f z+0oIFxD$9_Hg|OKM8;pate%Co=R^s+>Xfhc0-6RcSo{qx1lys(~s&< zh*VU{V1vJtP#hJN;*pAuSDYq#3^Tpc11Qyyps;rLs6W?#=Zei1#Fnm(SGT6ha*lVZET%`@kmLJfN?pI4T#CG~^A@95 zAF1hw(0CAEc5b4G43$|y5~c=B<%if?zk~I{tBs@SgiStt;2?gt40LC@_p6awe!yWW($65jJ33B4%Al;lfJ_}}W zHYWG3i03;2;jzc@=lh;bCw2{Gtub_rB~9~l#lN{`+XIbmacV>uU@1MEt@&g56lU7g ztGNAQ78cBC9wWG~FWe27%K9y6-1}{xP!P#>iia0y`JR^BT2dbPQ3pYfl^efG z5q-mGR(ngLmFtVi53mjod~ubDJWT%O$MlA1Dn>}KkVNaDl>=8K798B8${|xe$98>_ zM9bphVhx>P&NR@Glum)riw*911CVqBrr`?#T=pM4aWZ)gyD&UQctF)H!n!?T&Mr#W z;7IxX@i&o?#3HLMZIlKdnjO|)uj(QcN*ov;6w!~Z*FJO`?JPKGFIHmJ$&_t8$Q)JhVH%9Zzu4!Kebz~;mIWrqFW~531RYj7^1SNytsv`B|O{x zeF5>PuEylpH6H72 zmBw!Y82 zR0LT-g|0z335Tc=Gy2hKdp@hK>Pi2^P6WBf7Dy-#c@jhWW%? zEI5l^UHIQu1JuZ#{?{xv#T~`3<3IWlz~S;nfXgHlMFtlTq)7pb&l^~&P(UxF;@{K| z6?0DZpPwqOo2;o@^auQR={*f=WxaW{$22TE%s{2>mjyKxMBMh^b^zf z#Nf4yeU{x>BY-7S+3V zb(=eHD)(E>i%(JNXz|FPB3M!er(dHP-`m76Ts@l*+x5P6nR7aYk`5p_j80At^;Xp> z`(u@W{et{q!CUpg6Y1FWIR0XP!?00gUl76OckW-l0P?wFDgf+E8$4FG_#M3tQ85v zksKR6BzL&CK?>K7Yz|&UUbnCBYBvWU7y;P-4I~5&K=RJ9?pHL2hmRkj_{aVVHS%KX>o0xoMX0gyucY?2tANCE z%g~`4$04VT*K8Ty(E; zQSd&K?0?$3Z9e}}8?6C4d33aeks!&{OR?tJz8W|ElhxoU4z})q*J>Rrc}be329_4p zN0!cBueC<5I8~u3@B)Dhr~FO_7F0X{)t(Da9>mK0RH1^zjMiP&?>pT^i1Do2W`eM@ z1Ax7TRUO_Pgm=C+LCAN1MHE!;$emD=Y&E$pq@!cPCp>c%13qdHafJA9-34$G@T19y z>!z=22D`Yc4$S)8YeuHniP7BI+>TW#WvP6LyzPs^r+4iC!C=5s@cU^i@n!>&3g-dJ zXJvfsVQ@mQxfgcblul}{jv%S84e0-sSlMy9(_Om0H)-cxUMViUY&c7yo%u$*c+kqd zn7wwF$F?&&*o#^3F^GG2*39yOH{MJ>>^EuTY{pq}gyq?uq`3H%`1C>QpNL2hEp}uH z-fL51Q+z6Avvq$0+aZ3_`(K~Xv9Kg1H~)eg1}A^oK|&-C)65ijk%mJ&{)3)VMqtkp zwlGiFYqip~gpg9+`JrWPMC1-%W%2WEx6yW&=OcP-fIyAY505)vp4J6gC zgT>-P2rH!eUeKJ0hebqB{yD1#Nd$FCV1X);>`o*2JHF)Off%GKI|TNr;3cA}1%mC- zD8BC!rQZG8_P?pC6B}#*207O<62^N{P7++1A6_Br%9V=oR`0uy6=(u@A9mNCn=74tHG|Q*WnOX4UMCfZ=Iz5IZf^P zF+aTu|A4`yAZ!)DR8sWmfex;(#(YQgsq~J{06W`hY<022dwAvwK#m?-$qJ$p1%Xj4 za-jlq+p{bw@sap!O?vJy4lsgVdAMcaD*5q);Ir1syBLJ6#x~(=N1#S7y-#3MwCv@I zta4q$&)i5-9v7?%uH>^e(9}3#023om4}xUD@28lye3XlzA}jmaj(oJ(($bQeUc3r+ zKJgYj@E9y*vP~jAAPA)0S=;S=$LPA3Y!NC+$LV^>*)$(a#DW7xSh*XZf8g~}=oKZU z=Pr0CHi$E+!i4AOC%c|Oy_)+vG{R;V_=o4WK7so_#(uVAa>YY@8H39k-38eijpcO* zr}}T?6WQUOI;9{MPBB~jd6ZUrK^jm7FN10bFqX`1fH3vRVW5&0+659DpMl11&3hmG ztHsBMAb|SR2c!!m;rIru7VvKPUC`u#$apE4Tj^^b0Rbyn`egCx{vFtDypu>>p<5wx zHYvkD-SNYl9PFF4n=@I(Zzcb&{6(F;ZEUZRVG@I@s<6b0BNNZ;ZBL+mHQ<3e1tKXB z!OQ1L*M{OL-zGfkgaQFTD@1|$f7-k5cdGxtj}##zG7>^5LbmLYQCXpk%y7)CjOh=0?i`SUtnG=Ct!T9W=G0_ zlAItPaedeAEpk@z2dl>Fz)|YAYTu8J%9rk=M4@D)vfS<*bkFWh+lBF0v+7hEdad zFiE;!gqs5W@;r(<&t`z^kN~YMi-m;+l7g!P(**zQCDzwNzB z+mjY>-0ksC`k3ANj%B7O&Sh8gEsl85$K#%DT^&I=I!+@2gN8%E)oL@Ty0sZB(fUe- z&ss`#R_>}}PuY6SoxEhHsB|x1DB&X9KB>TpBq2EvMI!9h2*oaIR_X=U)!z412=oh9 z_!jt)JeATUo&}+hI*(XX;oxIWX79Z(qXBN>^+pA+ERT_mpTrbo#`!z@q|FoNkjCu5O_Hv2Y zeAVE}vslvOt*OI3ja}NE+z#zqKSlBpT=LCSpyj z9VU#jqGk8L?D`;?evUFkGIy3xBR$BxmhaB8V9Ppp_r(bA81C>rsQ_+4A>#^nJI+UN z#T_2Gz=KhuRgdIa(qmas@#Z#GD`4)}gA9OOv?7w|*ZNV}bTGyVp`Po%e zW8#D+CnHlVEg8EvJ(6)Wv}SC7M5R7(L_7|+V!B~X?BagxpI_>F zL?G^TR|KNH6jM_TesSW9wu=rP;dh76F)~?y=l6LCMexTJ%JnX@%ZBn6C;x8W&(G-` zy&q-bUuoR?WM=G1^3tHIvod0ADAKE+AM0u`^9^hqS*!Z4O;vemxkeTyq;wp8(%xZ&u{hEEQD4~e2|ym+>gC=+#5AfrW$9KTG!Gbll)iM1 zPyF_E+EROVL=Uq*7WZStborR&sS;?gyc#VWMP~u_1ipa)+U)!;mk7x|g72AxN`k0Z z5J>X9^;%b(C-qo5yHO}S%&~AB6{V~4$ne_3#97<0)WHcA2Cff3;*!Qj{dCJ*?i$UG z%yNlZ|0uI)FsB=q9=Gv>eql!-08(}N%L0ENelV*IkPSHL&W!}gI48tLSIfpRj{ypa zV)ZZ(6m$jr_uY#HbD-xDm#AubOr56vO%iXf8ch`x(hAZT(lK;3bQnZZwoqlp#?3l6 zA^u92*q&!n;pS$-o5XItbjkwaErm~1AbZq)ugUV9 z^JU_+bRUwnyqq+6YU#BXAK!uUlNsk{tNK#uhjFDl7_X*8)3=u{waU~Pe>16YSAe>3 z`#kT3NO~68Hyf|TBa&}LoOS5a0);ZlKo5(c{b}k~?a?Myk5N;5vt1)x%h~{AY^e1aFU^C#)Ke(ZHCZCLxC)Fe)@<#m?w=rV|==TJ5Th9p$eeFiCNK_ zf}U?lnJ=vf=*;k5Xp!84IfM0#1I&us+xYk%EC?#6TDAO@85lQfb*>l=ic@X!W%p~p z*I znu{dM4w`+pUXyy%0yj}NlsMw`o6oq68q}vduj@6 zN(@A6jvZ0+Po4;?dHVeNPLCtdN|FQyuHVbrF|MFe+3}daM2&VrC3`&Z_n1=fV%IyW z1Z`>SVB7B0V48+_`*!YjilgK20v>9K`G@=yk;v#f?de!9{(0sn!ks3 z{(*GKSY2h+=iaS55~bIn1xCH+lZM_0zz|HPmAF3!UuT(6BfiJyHIQRyY04}d(k6#v zI9U}fv%@G0^?+s4{L5nmd!q3`mGbIKhIqXAFW|A&cpM7Mz*lMuW)>vdNvbRw$vA^v zu|{gkU~AEGqd?$1e=kH0gy23sJ)%sR`h!gMbLW76WoO!1QO;f(vD{Y=^P~4YU-{ev zjxCktIrk&y);RY)xf7BisScqZag4L6oj(nKv1^nt{UHP8F;UgBWcRyn|G2c z*UDQKfP7Ka-5q^-jD$6byw<>ug-OJg8ZhtDKDncwof;?^pDlrYdMB=8#qUn55@f6zLrQN-#W(-jgmKH|bZo)!gf=CPm~XH;=9cae%pi zau@|E*2<_&_Rc`reBst$0pUUOqj2|whHiNX*0t%k(AjS(2xUpRwQrC=j5MRRXSjgT zf2XajZ8OMR^_0nM?W;rkKqZ>20A#j022BhMSLPC(cZLg7I`K+rP*b}5b8ht9HHG5B zI+Zi+(oYgwM<3M2eZ zGu`8+48&_g;)G`2Pyp!vIXTae^Sb2tP5G^r5e81xC=sS}2twq!$yAiossPQc%-iW_ zKk20JrV||Aou(R$sUY;wU78y98JK#^?BvpN;E+*%KSw>dnI!wt)Lc4F>ngb2TZwEz zU&!KqM2;|TSa zwLjA@)TiT_jzu5yW2sPE7m)5`s&f*J^nL&n%T}npvEPw~GY#=!De?>LBrMtA(`!ty z&mes8R1=H`!aqyVDTXWK_XMVV->L*&9uJY(Y!{w;d;OpK&kyO4_*jlR3=4fI#RrE4 ziu8?LAVrOY%K%gFC?$0%mEtTne&9spCYC4qps1H^i9GTZTfpI-O^#{xa8;&f`1oiI z>t$Q62>Cdk(~op|osZ~f5|nNcJ1ySsZn%H2ZOET6m25{R(_;{KMMOkoq~C2{6a-SO z(<*G{_fTRHZTyw$%sw)OXTR%0%9jhypo`P1yx4yiH^~*=)}j70?JX%K1qH&GsXNQCWpi!{+G;lLXMKl*QrHIq-X67?WSrm zA05Ac>jN&I?e(Z3I)uC3KmfHd(_&sCF6F1W@w_(gJVY8uFMQQ9E16d*C?qQ1_VQfA zA^63}@t3zdm-`LACuHR>9Lzenlf42UPv0P0)!RZc7XQj^4q9sIhFCj{k|)#T_S>dX zjfiBS+Xewfnh7r-GtVScEaz3ONI0Ob=cvhe3kGATp zoS1>}ElwR?Z4rPYw!Y((s$OTT!Nxl_Dumi~GVW#UX5>Chj01JFxV4_9-hnTaH71!v z=|NRMyh;9!k?dKc%kyclQJ$Uiu~ZLJ0`{}^eu5-Iw`GdH$N#Qeog_|hc+sO)6EJ(p zHBM>{ki%vJI)go3SD?POnQ6!K<*85-ow%k>4l-|d>XKgjz@&iq`qvD#$dniPk}se5 z6A&;yS@%*x7 z;n%1h+u|x%-}JQrkOOUZwN@qGESF72_H{7MT4JY=Mu<$3St>(bA7HrEYfQ{`R=x_i zl?%xvmx@@sn%^$f$+&@{vV&2DRGedPW@IUa?lgp8fU1NnzAy6bC8Fu3NT~)JM#!-~ zs!8;=3;J9)%NKX5xf@ywg~|jC_j?g~#Z@i}$^=Q`l;UFAKa0#sm@oATe)p{qxZkYN z^cA~>PL6dRAn~u{ZLD^gRD90#$gaLB!&R7b+(*DcLrLjTOH^H$>K$VcU1oJ=%4}js zqE0|vkSI;~5i=%D@q4LIf|_TrcDjl;D*Sx-_EKIYzb`EdXAPMBMxfU2Kwp%N(%gJh8iZLY!d?yX_T0NV&flhzV(MP+tFm}8#RzTNBP{(g zVpT}=R-r{>L}Tz`nyv4}g(e|1g6It}Tiuy=f~oKywOm38iA_2!ynkss8ZxAGl(t=y zAeWNf{-(>NxSAVzd!Rqh#9_4ouqQAK9DtR)6{&^Q*V#yaZh(pNjRBep1Phf*~p?%58=5Rp7d$VPjh>EULr$XxSPgA01-` z=5q5HI&ZpvJ z9k3?n{0wBBdtPG_SDI<|1FW0e`{5K(eeHA@ zZloq$Lz2d7hxFK|K`W%)&8^aCzsA66RPe%S+3`9Iobb`JEjPSjrsva`q(eP^Z^n_m zNi55|0QU1F0$pQw9U{5N#QMbILA5i0QApeDD6CEGWP*(ECz=|hAmsfdA1rr%GD&YV3aXTm;#k~w zS9=%ys-D4f`@7y2y+BhyLpaBt+4uIwOCB%C<8Ef_@#QDVG?zhR-wy_2O~u7d08Scu zO!BZO%IqA8@Su2V^GDB>xuE+zzeD4{I~iu}##~*9M6YcOzE=+r)e{h3LO_5#{F5ih z(*)s}2LFO3^2M7xrwqFm_`hPBbNqZnJNpbFg6Q3E=0Ch7se{Zp=KNg%@1EIUSXTg z&k#|$z{qXllGpHfC8QOISTCc*{c})QnT(al(#5ZuZ~!b&MduAwz+KM70zwP;!1Ob{ zh})JxymD}>%(jPP8CyNFYa-Lfh+-ACj%bO)O+2JZ17Ij?IUU>p5mn~U3u*nVOlV2y zlu#400ho1ZnmlI_xcO;7P+Kk{zXY1VLst{8xN@|<;C@)STG2M$@C&G8JDNVddv{J6 zVne5VuO?D4nbwUJA3tsn`-KmwFHI=eqDZzAkfIAXs2ikvirBQ)mdm$LeLY}q&8D%Nz# zv9s4%MVf!xdwL;RV6ox;$RJ5?uB$Bg`xZxWNiF1jDq)VmnU*2AZ4w?db{x`Is{^;o zjUm`!3Ps34B94bP&`N<4(LOAjm$>*BqzZ3u2;V$s3+q`Dm z{6wG5Vf-r3-*_RASlStH8Nc_SIg;5XTo8aoUMD!6><=KD!NHbI_o%XYcpC%SjW|?_ zv+utjMin0BpkImeBw-uvME0-0&a1tyr$UfKz;x=_^d_MtNSWy(uZ*_!mCFQn8s=mr zIGhWj-xQC&)1D;7kaM=Vsvgo8?{ah}{!P)~sKLlG)E$DE&b;vrstY$WZk%H1`g)hc zT#KmvR(GMLs;)|cb}up>4FiHH8Ro!Ift?|@t|QZPkTSD0z1z77J&>+}H2OHAtU3g_ z8^i#8Igh(EjMauUeiAx5FmkST`8uuwqaIckh5>1`FhG-}K@76GD3Ia;BK2tdPXi_)an?B?_{*NxGZ$DKVJ#ru1fab8Is=4eU9|L zkVEeThu*DV3f3KzadlJ49H=LdYX*#BR%w;@5M>QR#hU%^*~`D<-alKg`tufO3P9%+ zdxjScn`ge*EluME&|P(JqkW|$M*u{6f%h&nuOnJ0xs#0h{`c=BBFM<05Qhq^RuJle z9m+gvV8p4C&ll5vQowae382D#2N&MboF)RxUd?T){q7o#E+!2C4;%ovfX%&004pUY zsNm-&V&KGBkU(_$8H|eaqx|AR+atZ+0MybX;FC88LL{z4q&|-6$ZemMa$mTq`&kj6 zi6Yz+utS%fO*Dx4ubVG^&Bz3@I0?7zDsQ)MIfk^)==tj5mf@h$l?Ewb{PI;2I$pv& z269J%P(xeW4@?y4n{<`G_qqbfJY6a(5KlW816Jzk%sE3hzU%+NX(_XuFjUbmqv!`W>En@ep)EJBv z#@p0F;gEt!h0Gz)qVD16cv$I4tw2Z>m z6vzP3<3@!S$g<>#r4dizcCW7(Ig$VU7ctD+ASpSd6-;@ee)&)JoD7wHDjsWY^uMV01^cgQqjT^ObW~iVerhF_e5uZ zweJJz_0O~)^z*SygU|o^i~8hAkcgo`LJ}CAZhdtq6<1HU4Ko=vVoGaGP{h748x#D_&+<+ zM@mdgY~c9i^qL&;y-QvQt_wy^EJn**j~z`f1=?`}7-IyJ_qH=xN`r^zZfH(++`seHE zzXORs_p2%e;pd3A2FuAPWJOBJCK~}L1xDW^;^~mxP{N#txVG_O9yG*Mh)IqeOM?lD z)a^;XJ)i2pa#6+qY-<43i-VV$%JJgB}MEvc#5$~-BM&Gey^mWcZ zdq6rE4JP+jzp?Ni3ygnBMu_k2yYEo+pOa@U2i9!I$gRTw9|zzK$vvdOt=E>@f)DNf zeB>`=z{0sh)bf98A_NB+CGe|PTRGxzU>z}pcphX0z9|8GWkSMKY; W_p^yXRwD%P=en|{Ql6rD$bSI@`W$7L4vyn*Wm7M!3Q7wYu@_a zC(n25-hXf1y7jA?KV~Sp`}FB^_Fj9fwfn1*f;0vy2`UT>42H~y_bM_+T0qWsnqO|>isBv*q9@(BZw=$E-!=~%?_}-{1k&#grQQr@ zIIWxy^RDh{sHmvG;bUXL{{29d;e2pfL?$7l`u9}GA0S^|{_E7p&^N$wU8 zoc{hmc;8-t@&R&t0V#6&I|eE^oR&2BfBzPd7Ympz2-V2M{ns#J*QUw-k6W|^juR1X z+0Xdr_JA)4JZtU9S-n!cEzs3aIG7r+fe|x0?$0=f#3o!g^YJjQY|7V_n zFaI-D&kyzgrKy4n`QP7r>4MgSLD2P3hugh^*`_w%hfBgN_Z{L$N>K_F6qMSsQ9XRQ z6b{%3LiXO~lU6G>Wx}J8fq@Qr-sPZ0yEgKN+e;^nS)rVj`D*jPNYSTzrx=SELDJKM z^0u@)^MxAAu!xA_GnHJaDDemaR{KSp`o?ORA{~S;@5KV@r5c>=y|Fc0z4)Py?q>rG zgFM+)tFsz{2j@-k^z!1)&TrV7532;Mq`Y+}Q%9zyAS*7jdJUV=f@Ase=~c2PbCvM8 z3<}-e*UO<{VaVobpBQ#O;kCGoA9r?&M-p?t(9n0M6L3A$WOyhkkAN1f)$;CI(SUAr zKPV{l-t2-63?y<7!rM8Y*D6y>K)Wpaub`Tm8e;@I)3)nyg~p0FJmQ-Cv2ZPofO?U# zJr*u=#FNK|JBMYL*>xZ$urPo!ZKURaKi@IDyE^*LVL4w#_jvO3h{=%Y{Ov|Ccxh)ieem*TT$-{cl+wrI`nn*~ zHI3i3BLLCtCQ7}uzyCvq_tiXfSM*71hE1fMDP{hVcLfA5dJlo$*xVd`YR*|M2~6rh zV{3qkBIWHBJZTBkYj#~<@jU5CHP6zzs^8c!k^_s70~eQ2QTc{llC0|})A(3s(6+*o z`OQg8494SfKiIGSYRm#Gm@Mi!e z8SknW_Xz(kS%&9vW1@bwa;}t_*Q)Q6H;Z-+GPn82dv*1s_1}-Bnw4;1pWB~5MTLcz z8xYV*-XJIIdsu3zvf4&h@Owckw5sZNG>nXLELVAEb>V$|eN_vDJDSZ$DY!*_o*vxD z`0Qbnm6iW2*0bCGx>OGe3R(kJD9<@9J9~MFUa591*QUkE_9&*`Pt}5rbh}ng;{krR z-%JIc|BPjC_xf)(cwXD0lkts_jh^NvHkglQ?JOilX_@jqG`SpbxSyGnXxE}z!{0rX z`#zvCfW4|xx$D?4@E2_y48g6Bw^l=7QOf!Gd5h(yS_j!bE5AJFO|=O5^_<5g&GfAo zY6faN+x=k8^kcP5OZcW8Fi&_!=zNr*H#doTp-b+f5dBKiQFy+Q;dI{e ztDEHXbgO;nUIDn>;Uy}n`0hyNuyFjhZz^S(PdB5!L)8HpApL5yVYze#;maw<*_-WT z0|@XKQ%}RAq9p5Wm*w;_B-9$;+~1#%LZO>6l`aSB2?+^AgA8EF8oz4IbN^#Xq3DMl z-L3mI?r*aui~VJmlleRIa|McEN1MCj<`X&J`L`l&&8|mZdSf;%blzIeecsn;bj(X- z&KP}y_KA+Q`T9Dg&^kRPYUpzw0hbXSu3f0Nv&$OqBX`qnysNiatb<;+J?WLjL=WB6 zTFs`J_w+`Q#-*lel|7WioGVHqWB>{C0G%h(7#XrYjKoEGpKRd69}pN=>9nhG?sPe= zk!}n<+Zs%!Il4V4=f(7F^<$hWNoF#ryMNk@5nUnc3ni!Qr}TpOyF*kzh~6Dm=ZoCN zRzkLaCujd!Ro(Ie&Hw@?W|)V`2#Vu=R69E)8_8}!(0Whld+$Iy#-sohe~E_1&5ou~ zlRmpvYh+{;$w$Ox66XGHqCP4I>}$Nrc*r!uh!IUB1?P-&QfO=Q01qpYbl;LFKn(4B zw9;v}hba1W{sHluBM$5C?5)roL%Fz*@5Gcxl35JSyt1nwGCZ#k*u6cNvX~wj;jWIC ztwb&u7xoUUqL2_rO0=rQ-nILj!N**qFS{@*K{Y= z%_nsPB9Vf1M#^JEZjqgKM|jSMa8gPl&g02!8@CCZ*vqx5dm~A~u$Usy&v_;DqpUi0 zL^Cazd{2AP7eH`J*$w0|zZvg*oJ2}E&qN2dv?VRajdGu_O^<_VMtFGmkThv9*W5}nxcI{ z=dqhzPSEUjqhTZwHxS0i`bpapg>hfBBnZ^dNPl8A0%lUpPq}i?*J|BtxdO6~ZS*=1 zR4#k_rhe6j`?`qkJ--Hs{ha8^|2#!JEg-XP_q;cbf7COWvVbAOKA@4{ghzxB%Gv4W z=klbE*AhMC?o$(wzu4*Cc{N64cp2=Jc7lwLZ65-F8SW|PXlk*8C43EC|AH)!-z^!3 ziNxGyDWTk@-qE(l>x1Bp;3Ps>Jk^w{PZ#U8*PbG;n5b^5s=G->^D0PqZ8NYZtRv{O zM+6Q^xC~7$JJgPLBC?WDb=E)Y1^VXpq_b-*Ci4Z~e4~?%{PWq6av+GEV9-d0T8#5) zOae2}rZeYr<9Y~bk&C5$jfgh7Wz-H-r9lM-5~@yLJlC90$L3D9D2J`ARwn#$Z&@txJ3;Lx69`sa;{&A@KW+c-*OUNFxsw+{97^Mvwm7ByfYzB@iFBN*$BRe zxYAC}Y$anbEA?R0oNYK8DrT|0X^;{4n*YxDWHZ1iGber&R;Q!$oH312K}#RBjyOrV za;KiXol1%Bv@_)J;ZXhUY%6pFjTYvHoi$!vuyMiYa$MlLsJM)4v&UD9v3=fWgkjO~ zdf6@guDObnmh>vBm@M(eBc6GevvESe4j)z2=aZxDV%ev$&H+qcRA*GXy11MaN}syT zzNcNMXi9W-NM$eVwOej3DyVb1$j$ zmCe2+9z_*Z)nVc8-JJ5fAdR=gLI8bAPPARfvosk_p@mg0Z|NDk)o!iNZX+Sc2heD=6qE%M$!Z4Dk zfwQ%2PiNaHqQ-cRbTQhU?6~{^NAjIz+&bD=-B?an7(5<5OEjv!^nr1v7mBI{q-Rj? z+N*LQsR)66aS#(z8nrYbsb|u|P@pqJJgBoro$AyJ^=;F)vEblhjObg)#K)c(3{;n- zef`IoXqQLXj=sd;@XmO3v(}chz$!&d{pyFh;GAf6C!fO#$W5=Yg-Z=9UT%vbGj7Wv z+JX7H&?|7bu@13@kM%_7Am&K;H5u5rrfTABs51A%7HX=^Iuf_<+}jZuRMV9h{JVBc z9g-I;@3fXP%Au#y_3(8)SH`1RYc3`uPLZWCA_pQlikuoajlad~@qlfc1Z>;tE$1w1 zF~dsxb@6kh?ZEifJl*3Tc0_2&e;O_<8)-gu_a?tArMz(3OcqL}xlzgG>Cx&KOn$=( z)~zaL6k%+=u`h_RR7>a3owl`dYb(v0H&U8kEg{5uc-5F8w=NZtu#IbzsfhiNIi_a@ z8`u%CxtFH`Ua6;&^5Y8Ny>Oetj}UbNxX8zEbs~#oC$!ShDXv<_^wAaTj!tTuCU@^X zD+W36KUR;5aF?MUGDtF&MrD-q;J4rfAL0hv^@yKJi8^YxYrbCmUd)M#dETbnYOKq>ufd3cFCfN>nz~vu(CR>9w}JMV`tnIKm*f_iaxbq_j)Cb zEhuzI*JC!l;nQaPX2Fx!#;3u+*ViAhsjCcGI1s!O=f&{hJ5TL?)EdQDd>e})`mLzy z_vBHCZ^4?e4s^U9le6jk6AvXL$WpA(!n^L*Zi#uO@T!@QmooDCLdIfC+u?9xc!=LV zf?ZFANz&SOcsPE@NY+~IC0#v{dd9gI(pYBLC|S5uRYCiXG$c=-b2p#qz^VL zYvd+(la0lnWN!-=lG0H1we2m2HzShS7?LV->7q96m_g)*60UeZ6SY8=D4P-0ImpIf z3-?^L_!&WM${UC7y7Bs&{D5Ri8==sg{2csm1p1F7RcFl~A&z7v!{8+o({doA?nS>F zY_rMkIf)T{WHevT3o|mXiP&EFlo>pW-7)CFWDUYt$z5via~CiEQR`mS6iV2a7Vs^7 zlu>h!Tk&z`w~Ra@d%1L*?Fg>V`+0&UiwY6xB_#{8?_%4bnAhmB?6Rik9oQXKjkur8 z*0-f!FT?ZI^S53Uln-@Ul{!xstkGeXRX_qmH|>sou6>CsC6#w^67wa5^?WXT*mXa) z-!9a@rP3Pwg73{z8ZklBZK~xntrN^Xe|OT>mJysh*m1E}qqo0xdgWtxQ+o#H)Y#5)*Kaf@HOXFt>|V2y=qyyk((Hm4+ZP8;DfUnkO{%ejUWUn{3m zDPJ?ByrhDzNoq5f1(Xkcn(3?^vV$zU^vP39{iP}n$M#M*qA#pVb%m0=^O|9OOQJG> zAnC(cwT$PH7$w*jbS){_CRdyZ{84*n&b4@~G|VO+^H=TZ=-E1*-Qw~Sp68Yv*u>VN zC@MJF$^UWWf+0V6RzKT*>m!C}G;X}7Opn{qhD!ggg_w=z?aOtGnGjArDD zPhhvysu7570ykbc**P11wXz1Eib~!A<)Te&*KwM{`8(-KDPK)Cc&D$Km<}RBH;&nK ziR{MOCx0TOtVkcY8khQ$kscH+d%mY^phe4iE#Z$MvAa1>{{8|y0OF{eRCZG~y9qu2 z8Srl(Me437HoPfoN>)T&g&)l@rHEc@8gwAN>EnF__J=6qR6llBZNbK+(J;iVcVG(w zZCwj&(*$^J^BWxFI}n?juFf&7mof+33sxIEnHuedaDJ;P@}Dt-8DzY+0o88{AwB(c z=8smvBUNtl`UO=bW=W&8$#G0+bNb;}ttOTO)%YzyWb4ByjVDuVrLsiaAls15G>T%; zd>zigmK)F6!@@edB{Sa1-{DY!P=0y({;C8_laM6g=@goiVmQZG*U%UekXiP!Cc0WU z=_EflAeq2NTTlzBG~o($m;0{6y}hyHE^_^$!95ag8NeUw{hq$Dw%RedeXtx3S&{>RM`RU!+ji&#?g^4?p4iR#iKQ%u@7MjKs;Gy|@bk?3N-4#NR^G9auVKIpq&fjSbICB_hx$j}srV^z!L~bNmN=YBZH$ z&gl9HO$N@+9I`1Nf+rp6^l{wy>nl&1$ibbOi!+HZ?;SKSB_`fiAQ=dKFU+Q-?!npR zP4+oL(buNXVi3Iru_Tu=u`w30*5l6X7Ov%?AxO3*5;RmTrcmEQ{bgin7sr0c;Bxmh zejNZn3Fhl2M~)JbzOZrP!=Cj#MV9$*>C@7;ap!aU8xVnwiO)C3ljRF__6nRda3}6( zd9j(wE~{g_Osf?0jLIJ}~#sqME#+Ft>@Tf1N2xAhTDlo9kaUYyx5E z54u?&i6I|k4U>ZL5pozgcmFi)W#66G@r6|54Uwt;sKD(3S2uA_E1hfUW&=)#XYeRC z^A10_noMGG<4=ZL?bJ5`HeTUI!p=})lol3XCc3f-97shWHjrgZi-%^EsDPn#F+kzw1z z`iHRX7l|{zWlQ<|^3%FZK(eyF#r&qDX#Bgeybx04#(RZ9it1Nic)I=HT~0{+nULy` z)gZG?`H`1wtGMJO=El|}I3_QfI@99pC;WXLr-gz8`HOhhD=KA;n}!Ja;ei8tCyPO#h;%*I1tKXJAk0-^6`6uu%{2yM9Q8|BD3YlLgpx zEk^;xe@J=`kZoKe*Bwe|DR$0&usoj z*ZH5d`Ty%J)DYc{NT}=gTz|XZdw}GDSSKR(CF^e}Xh`!DM6gp(c-b3G9`WrPj?m3k zylZ;Pm+99_o+rPMQBhyt-A(;e#ipP*-e*fHRt%Ue1*tXuJ)Td7iXB&z2e)4yUK;~O zrAbh0yt3e#m`)LND;wNjZ1WYR@I2&nK3*b5dP!FJ3Bm^O@@-F#g2xS;FO&5aUy2_G~DhN z$NaqeS&-E^Q>rug@R*>g(7{^2q;l*AaOHDVrf8_BsE~Pcu-a=7Q`O|e1cymKR`NyH z_($N9ba|V9FWIgIw;J_xKJ}m#?&@CaF~g7Q`_r-?xNXy=RuuCC|7ptR-h_P*zQ!|~ z-~an}r||VsARtj>dtNVS#U-;FL<0hq#%qxIP>O#lw>b?TA5nI8_V>J-Z?bF-Eusn( zOdSWW_%iALM*o+%plbFCx5Tc{=EHWw2>%~!u81cIOsZIfgyxS|04Gnw!-L-yidjCL zSB%@z)6>&GI?8M0c741Ixqcn&Pv>dLH`1gc**V$J`czfjL#jX$n=vQ2ZG`$eu zK)*@qzsYyjli=Up1L#Xw;MSu}CDH6K6ld4}4wMScMGlZ#L)z&; zR>*Rp|2!!W8ElB=!`UFaaGBommso`I=Kdo6zjFmqf-56vA$@Dz{wxs!EI-woH+avQ zDqG_gPR!mfgz`T0U=o_YTSgki1m9%cSLZ1-@*e#{;W%m}O0XGyRFY6HsL^S+sYJx~ z%xD zwIH1(gd-t<;V>}$0+S-rs;u#aTuEYjdPD?!E0KnQ_a&!`=;f5^T$77c<0{zkH&erQ zl1`B|QuU-`pl_ScgYLx2f;vryj!uAp!C#bCL=EYsw3`YWcN1*wN|Uhqor$|e8I&H~ zhT_8*MYjEcc+3l?>CLg@P`0yW!$vqWhw~pL6I0W5fQ#s;Fzk{W@n1*+)aGY){aIy- zi;Y!U+}Cw%MJSi$D8l(WmxUSa+fHnKw_OJZWaC4!W;x#0p3MPnzY~}Mft=g-?qX6g zE-fv5y(@IKDQf7W?6@Z&l}|UZX{Z5<@%6VN>AypMO}&PLW+#SayRXfScA~{PTJ#Ar zlFE(b@9&@AgGRv84k!j3U#1Ejg+Uu%8HS|ZEKbzht$yq|Je;qtbly`L!w+yr6Uqay z>F*DPSYfx?s;vcT0|d@Z-1{N!QL0z3x^sI~ z0%mhVB%=OVwOIZtaL17oVjY7~R!d$|lq-N&VDY`W{Yx5x z)q)WT!&`^}2(Cf&%uGzMT?w3D0;_|uDY&?})^^>TCG-Ft83N3UpiZ9bX#AQBlY-j6 z!ZXd9C9wO1ZQf5&{GDYi*yLw;{r~y@wC9G+Cop@x7NYVBMEd(fF&KCXY;+a2%L1?H z=&0%Gd-E=fxSnsT5bghY3w|?hs`@tuSp44@V8&J!(u80B8pt;gIyfM9_W&|DhR7U~ z^W@~D{L9-ve=NFtda@lhdx57c4e06ET}(_&7UMaH;^N|7D1o=Yj#iRJ2(PY+J>Aw| z9Qh!v2^K*grX#JBD!QpnSn>@{Hw<7e$W&uyH$+;t2BGmrwsNQ%eh0|iXNUhQ8 zS=ax+#}6bz{?AqfAnA3eY3Kz5M<$)}Ic_1lo~%SoO?^6CZYBg=2VKuDi?w#x^D$8` zC`V^!=kIQgV0*w4^1Is}5L-xvbYOwG;Y$)*Nn)MjbY?`o`jPa&xwjsQ<<^D4*1-dU zeAaau=1CFt6>)TOayacF+}tlN7s)>cWI9xxdRx}(J5>dK#QG&i*~Fv&WNW~k@ZF%z zXFEE#UqM#3E0$V9cLGzIId07*At4&b4HmHotxu1hE!Qiay+(pwP`XH^`^IgMlY#d_aJ+lb(T$?X>TNP3cnLQAecuTz_Sit=~8}K4nxKN0BK4q+y_Pu zL4gC17HB(Bqr&UPQ5W#{*m_c(_lSXc!`I0LU5TtX5xGixYOp3HJ7KytKL&->W*8aO;l`g?d zHbtZ}3E6hGjQrV4WS6sS3|nMKv$l?~bOgYy7d~@N_+PgHti?$=Sz8J5dAOYIWq<-k z8V67{n z`m-lr=5S}x_-Ona@0Ir{V&~OySJ|8{Qd5pShkzpl$@q9Ajc1Symzda+Mk2#y zMr%ZWX8jyMPEvXBK(_aaYX2b<4>|3lOo!Q<4xT&hZ9U(vHa-$S@Zy4}a}wdzL;fi9 z?zfXMmh0I-FMhzgHB0Q37I*GCyH#6P1#Vk7a}|+uo~`BVoR7 z+6wEmM;FgWy~&zrp^`Q&k~nZoVFbnVcBxdiu}ThM@?jG&u5ouJ6Rhd~@<=?oxZ=s$ zj{%;o9UvrMMmc<92QE@XUEy*0rRDMVKq`eZ&lK1T-r>ZX+7ootyUi!qXX~Mi3)Ovw z#kTVA?2R+%0`^|Mv*PN?8Hck*SqlpbOH(i2d`3_0HV7moYr{iB-GDnR?4q}|kv z_E>4F4S%pdj&>Layd5TNF-EoIbv|rMil@c`tO{*7^Z*f?g*V{ZeXfMDD;_Is;Tvzf z$C|lzw1eqE=>Cg&_x#2rw%GW1;|<#~&B~l1)S)mey!J@brDiv~U`Zz)=V`#$sYDBh zp$@1(F|bLE+#Ii7A%MNFQr$nt5OePk`7Jd*fS>M>#>dBb0*V8Hk?tqM1g6GNimtq} zB;qs*nh)ES4K72hDO1^c(R%YDJjSF`lxqUI*Sido_~nv_!tHajO=ygmU+LG{?(F~h z1I_V*$aaG2eyL4U1#*~J*Q>G5h;}{eW-TAh5ZwWHKujvitiESy<%`9T1&fqP$zKGp zC)DkJ`*P_69D;H*>sG;)E^cfF(Q~6B5*<0<{iPxu+$`sMC{UkNTF-OQ`pvuct{={n zrdK|G!PS+w*w+N2g*m|K!F^CveLmwfAMNA&bUWK7_fhfLBs@wh zCOQKk<({STntiUCB=*F^Lu=#do~1?zSY+9_q>0DS3$pf(MZcwC2u{uzuC#6G-gWWeQn0-?(DS4wxUiwud@mq~69) z00@Ji!-0Jt8^0ENUd@|tJ^^Myp5;Qug!VTqR(LZLHkSatN{0 z6kyFsQk#uAMpG?FGg!<=EHgMOYrGxF6g)lO0dsD*<5>%+yxs|QCJ9(y4yEOSYH}(X z-alNgriTfT^4h-9TD7<|tsy6-(&eTv>ZwNF+9fdBw7ZK<)(bNuH;xwXBUOE z!-Mwnk|WDJjvIG}%s!DIGbbsE+;qPmFiJ=T07!uxgo59(J1ErDk;*OM1vAK!2L!m{ zqn_B{$LlS|;m}2U$M_@Z_-&W?&ht8**|L_WGE8~fVo%MGNqV)tR#B8JoQva;Oj%lt??pBJJn&AL@- zR3LI~=3~r_$?)7TpDhM}l|S>|7YdlWezUY)tVTy($SJQW^*P5P-^;H-R;-8IZ!k?L zMp%s}o{C)mxJo%Cb8PGrRVzGK&u`xn)a0u##g0O^g+}TinqOWmc5XIk8%uT@hMy7Y zgF1fLmumva4%2yWqUSJuL*(^fr>w+Qae3?h+d!j0{1&!U)}r^ok{>}C^Y&-vSV}M( z^-$Wya9l^UJe_O$!t*iT2i;3#cIr@8eHrl4(mE5KXhzEXjE_yr{BopcL*vzHUt4qcGtE{nY-@Z9R|tOBuTJOv>j7;#0nOA!>_AR zyonn-cQzLz7CzD4{oa`4yINwLO-k@Ys`xB|lr}#=3JmQzTQwY34RW~I?l}$VHy)HV z4_&f!43jNw~3CX@(d^Epwz$_h++E?JAG^5xLM5-f-AU7WNOcNQr zcFtS4X?vnJn($;)V8stOrL~n_!r;9PQcEV7=K(yD#TVrqp1anQZ7&_jIjUwqgqAi% zNAf01TE=PDSYSipO!Mmj@`t1z2_L&q5l$7XA0F8J8*Q%1Vw5K)E3#LPcPSbJn)MI&bGRGl?2m9+_^jX#49azXIvKQ+5Fo zd_y8kSJZfwY{W8Ty=&Q{w5hD+`*#=}^)m7GP}McwYc!{uv1sz){F*TZ@`EORwl;l3 z!|bo5_lqm59EP(&T*b!~wq23sWrApW6Bajl&~0C^*V%v+^i~@W(~axXav80X0l~^! z2Koj376YG~yhh#z(XW)@oSdA!!IO1znF9C#*Pzz8It~YfWkBXH7(E6uhMkZ6y2rGd z#&mzDPTZR)GUsa0)5EnM7cx!@TSwtXAh|C|`XvPdq!UT@V!45+n_j;D{&vXRk%7-w zDO~y-lN0^P7uqhVBy)tnf$Aqp?K-{0j>D>tWs*+YWv_UVv&^^8By@QE%{MWP}q8{@A)VxLj=MTNyni=n=gzA@?8qj0~4#; z^@XokTI%{vB~s(aii*0%uTJ?;R?@~MDuK}BBIQRan+h98I!WOJH3ZDlQ}eaU-qg2M z6B@kNqN81Qd*wThttQiXPZS2~qDK!Xc6Pp`sfelcQ*)P@Wp2%CvvHN1gWiw#H#>Br z$U+5R9|1PNS1PSA%}JwFfUtxQguNGl1w9bEp~Zk$&A(WF1XaJugmVKBNb`g%D7wR^OE)Vj|YoyB({lM&*T z=oKH_Y#EQl@0xZQOwlb|b-h82WW!#w<5aDk;=9k~NSuX7ROR4KbgN!u>I;`2Yo-ZU z!Mx|UhH6M8i~v9RLIAQ~hYW&)HCys*bS_Kk^qG*e5C2yr+;C zG>mjhxM@1MZ|#j2dXo*L#zQILwB~y?cuj|h-e3 zWyE}VQ&jhqC(cLaUzv>@h9UXcI_xI7ZF5!VCmHmT_mG_X#bdEXvX%?61~1j`JJl6! z2N%(~3)of>h)b%Pn{(SZUv3X^)*EzN%Rxoa2a`@-&QBD%g1P`)wV1EU(<#gQ2!LH( zX+R-%VNr_*0&XBeO7Ax|^#1@xmQP9df%E-~;NTW`Ek>b)z??&IypzFqGE%Vj+!4j4 zsp_A#10}TkrizJH?hlE!gCT-SFk2d|VSzCb;$oVy4sqW(UPhw0 zG^TgQ;rklS2GS~5xkv1&0;z(^ryChuvF|7YCT*ZEO%GC373Fy_4&$Vc{gb#fxXyXe z1D~qA4`8CV=}X_@pkDzIQ59|6Kd`ke!3z{7){vQ1!#L_qz!m(2pK za4w2|oCH8fHpLBIf4ndv{)p*X1wYiG?>?*el+^ zD2&^~e}nunT0*%O`_Sjk#zY}Q(`?$bu(Bdv(bb*uAXnTcjegs04_oJbEzi*UHt6fxCoO-s<5qA)*N zgeoVe)4tnFki!hi7I(ABdju>Bp9=<-q5I>*e0k0s8Qc$N0^+q7L|Pzn^E_H$d1O$D z5x%$;Ywdug@9^^olA{gt<_#s9(mZa6X2g>(no(*FP}P$JnVzvyuKe9U#5 z4}ol6%|iif*xnvmVL#yL1+<~@0i@rv#Gvakt@d*IXCMhZtdy%(g$as202p%N>Tx<` zv6q-dC@_2a1}6^IoB@^&E8$teDI|t9D>GudNJzjFI_<{g5p2wg8ClGTzSonEt>%VD zZ01(35-tBt(4#*EN3Hiw4gtlEJ>Au|6S}?0`2_KrOauT;WVvl0-zwI583|?hoL;(m z?oB=>_OG3;i7)ZZaJx~6+L!EZ#J#6^5L3qbcY!ZtpiN(}yh^ejkY29kOH(k}jhBi; zR4(*WWBm?D)hM^~*_6g(9)4Y~aA)7$UZ2DOO3EaZVv#_~{pL?@4CHdwAn@leo!T#^ zk<>uDovmFCLir;00UXU31ers18b~Pq%;hZ;TjJNj;#T(i4JT`acxvu$;`i&TLg>`; zxme@Wtr^Tg1>B5`jO`cOlbjBN?}5Ef#L`-^*Q(TVgH)q`N(nVTWD)jQ3+ye@QM&5_bz!|O#-*26-~qyqb_VhN zcSCFtz=z2f()%oPvlf>pM2ePrh3;>OZTyav?gEf|ukvubXkU5}QBX=Upg`krQOx^pO?+gRjfG~1Bx2Vc;l3wWP z{u~5Q-OC~sI4!o)C1?QcKqc0u*u-Yfe*lQ0;y}CHsI%8e{p!XTJZ4IyrQt()sKI+r z=nWzbV=K%+ZW+q~gG2#w+vleDhisQB3;F``|2(a<*m2ByU#E% zFnWN_xJ^~cu(GvdD;JimQ{_CpF9{QHZbDZnssYzag^apxe_&L2%j$J}(r~SDXaOInDx&$pC$MFoIb>wjf=}m|JODb@^3j6Qov zL%ug%a~*YgujVi4JI_GHL+>m`nZ-iyt?gHCW*7 z8sT}D+zWsk4oM+0k<0RHcB$Ie80)@}!MFk3H&gQDfa+@@x6 zl%vM`d{D zb>N-Iu}G{gq@)nV6ZQY67Sa7$!Rp}P(5o?92YK47wrbq9?}<^Cd0h?RYUS-=tG3~K z>#2vQ1v&_*Dx-!I`M5R>?DCDCh+(!x{a;=To9a?hFY2PaDg3$3)8b@_&slQVe@(IG zTA-|{XoS7N zS_MG=mS%ED+yDRy{fxjM&}=Eji{#nb7^x#)Uk~u|1O*w6;kn6$mkxkHELDj5{`)%i z_satyj`8|vFX;{HHMXh%t!@#&VuZrKQ~EkL&*|9oxBk})P}>*zmCKs7JrQLsR-rO% zKP5w~6m6HRZ9AOfYw6fKLp*0V%kpbF%C{-yjE8Sv*ij%vH|r9 z4hKdwYYzxOr?8Dz8K9DHI6XF@$HWU?xkG)g^?rrvnImv``!%Al)u@u?G`~v!G_dJQ z8B?!8wtPuONfHC!h$MFjK!P?TpuH%{`@mOX_p+S4cHgz7VoHN|>QP!!Z)x~^ceL-h zYxq5aTf3+BSyI#IF{Lu)WCxIC4G3t#?&xNUi;H`2&S@0ev#oGS zjmLn1fC{4?)at%KPLDmQ)8EYHR2&=?OBE`NlXRV#k^!@s&T93@P$F275+c_~f&zen z7%}$%+E^pxnIFa1((S&321X$0mt(sn7{$1MGYZt4oKeyOp(i8ct1 zh`7_rq6i6=!@rgQL&~5=ZG_(_*5^4ARQ-^c(>!R?P>N(F=_PnqxyB)0IzrDge&7st zL{Add%Nj3?F3y+aG~H1}5S?^Qx1SoE+Kn$D?&c5AOqjE|pn>IVZ?k96Y=D+=tqWY5 zd2{%x^>Rk1SM-}~5249AHv7LfJ;)Wgl_?6 zNe@tXg@HdIGw#E`Gu3gh{n}rShaImV7#?kql}_wN=Sunlz&*@> z9~QuXOh*QC=MxAx_!DrRM!SvKHUN^fnD~Jbf=PL-di{gptSsj3Ha_0xj^Bw;v#uA1 z{eu!d7K}K!IAc8g#2U3t;}{ z`m#vZN8Arnx#eZtLx1$U-;_Rg9edFS*K?D3-DKQ%iX%Ypx>i>y5qo-&U1@UD*w25; ztp4xBBnD5@F1CfPC2<`LDB#QH9=7)`yf)&0vOeJn-(!VyMMHz;^je+xDRl0M>b9*V zLg!x6!*%u6MD4VdA9#_|1klJ4G?bWn9)*aWTj54a*%)I_|N1JOFIsklu%&Qubnqm8 z2(}|N(6g)FSD*2J{+YYJM|E{{ttTl5v{dA$|~&SPyyLdS5YG3qjS`b@!} z3v*2u4|%J0dpq?PXSoSjkrnYc-ct7zK+`)?@~~8To4(lRo#TntmtGa>mj1#P+Ufan zsa%MZ-WS- zq|1T*R-#7aoQvAk8@KvjMYn_{x_+ULp#JVzQ;#)`QBbXRrB0=Yl+SlaErNYx8v_Du zi}W`KPvl69($TUR=)w?Ht<5s(`}?;Pr=$hRS>UBwApG1wNoIHV7_3)Y$>m;jm1xym zWdZh-tQC`5MTGrGpc>^VOvMi3#A=lB%LAIw&5{M4)UaUxFAIMK=i#gB&7tlMo9|j8$UCdx?dhCw#-z03| zlb6y{6DdEWQ*Q*lin+cq-Jg(%V94D*FGHgL1;EXJr#L}Tf{aBARN+a-$ta9_Emzc6MD*K#IX_sjL-{cf!ztY+mip) z(W0ly`4jOW!M5Oam(D(1_D;9yi@iyQE)3q3AkNn`V@g2x z-puE%#`jl%7cSf7V8+9K$}j!pr7oQ4!v*ehyDwl9oh#@hafrw1VLO=)AT&5bsT^dH zJDltu#yyqXCp1$Lo;)E&{~}m8!jQ6kWxv&z$tX80;_=Wg7UXIfnF7nYzqESY-n$I} z^P)Q35hT|YzyeV@9ohHsreHoOEhQxkiPCHA$2Va8XyB&s+GWX54uvs3++Fh$!!nl< zIQICbGdC*!C@e&NeklY~7%mQu82Ao&9maRv1;bvSlgWY@*)*WP4MwWh#zd1IRevWG zkUw7KM^nDL+5|Swi9ie6^8t!&!oaKG@h{-iMrTNcg_%-)b#JOgPG{ z?lU13tc3=OrtC{)zCk6dY588KHhX)&ap8qmCM$hB;VmX*sO3$^L`^>-@%hdI8vJ7F zRv=NWozP;WlQ6Eu6$cKLOBn~}Ym4gfyGI$`=A*O~?NbR%VFVxa*7K3ofwwKSw3laUJR94$5C0`K*J(f8P+dte26!LB zn9CY+bn$iFjq#{Rv;bRoi35b)#2WZ)qHWwr?p#ZQD63|s<+e(yI77+)k;cAkvTb3&>Kk_ z4vrVu*-_Z!nPL6?7Ea}AyE;Qi47^UYA3t=rF52>ZrMsu49l!r|jWtmzk$F9dPxwR3 zu+7Y5q`gJ&91EMwzd+HQsiR? zm3PByUbJh0ZM2#psa$kCGbxwHm-DakK5=bnIFKw+)B*fD#)qzv2Y<#VM;zVz?_Dra z>mJFeVf}nn7>yLH{3|GAYHfWNo_eVq=RwBPJgrTEs|W)6pAI~{O9QS~eJSx+cfr1` z^DX%*z6e}9cE#g8PP1gw@{8^}FettvD|6=MafC zbk__G1`SeD=bq<1@9&&1&j&v|GsE8d-fLa!y8dgHlLDO!a=<&5Bii!A1GpN8TWzN6 zN3RH~2H;&z&opowFyu>18xZ2C0Vgd>KPk@m(aY(EJ3u#K`i4DzLTuEIGbv8ZjC3Kh zu^CA#V00cg&{NLft`if>;&8P+lJqVqEzLrPbFi8rWKl$bn;YqHg&2jW?S6c{nL?fM_c$4E?s>u<(H2f>2#gxFa@pQzW3Yl!B4e~moxrz8X4li-kqW3XVr1Dmo*fa zhMPdbp-Yx0{|^l)fh~B(WNZ=CN{WiSsjzk~;gQKQjjMB)1tWE`zWzLn$K z{p26j&qe;qG!k*VB`UGW6jSdxr!lfQZK(b2tplV1{d#oYg>!#OUy|D?8&{N3#_ zAM?Z^`UHBuiV+T@h1Lt2By&4!=L{AO1RMn~JH+oT8l?Nip z{N3AZo2!)+6a+9ZNa$WzI-o9wXX<&`8_<4E?#CxZ3kyeOaC=wrE(#WkhMT$D8M1@~ zeO$dC>f5)f*l4F&T+y#F_9WpYIh2_=^EaPgY8U-tMkBTG^HEw&m-DsAODU_L&v)K+ zKkbcNNTFG`)V6Nr(QzNeM!rgSVqi@kiX-FMA`4WOACCJbssH^B+z8X%rDhtIQ70Pxu z!cfz`e&OQ6l;4^z-nM)1p3`(B5~H*P8*K$e5)aa z_Fp1C3Gkr1sC{|TPH}hAk1Mw^v!1F(EVKY7aB>YMB0dw+?Ljkx!EBp%+9o?x?MhRb zqr~jG_T-%faPy|5b5nw*MZ2KW+YfPi?yVu^C^c-%6*%}Ol1P5}ofl_H*TcJMA2)O? z>FPB0MI6l)6rQ-a9LcLCb&sMr%E=*OV20vRP{iJeMNaeiQDTVaIrzDM$UUFHih{oC z!)Exc_Pf<_+F$N~*O!7&QRazno|mUZ;WUiSevRZyG4axcp0c<%9TL}dOJzIphKo*S zYP$ohJtJPCab%%%Dm*bsipF~HjxSU_W6AD6!8=QwZ=TGM-SbDjfr zCLV5YuO#nEAx&Kn7$CarPU<8EgnEzsy>k+`H1UB>FVp&=k zMNxQs*8{X}GUrzFqZ^uG5wDR_O>k+1fEB1;v3;)Ry^Wsta2=GKcMts*d-obW#(8HW zz>HQrEW5FP-b0XA9G@pzAxcsCwcBfY0^KG#D{T}4T^dUn7ZpVX1=h23YZwPMmnLPe zo+@5cT%6zaZ6t$`5QQ+MCxhiIC*dYtt-l~vM+dcusZx=Emr?;OCF+y3UN}3rl8lImtTH7NyYrHS0>|dlsTF;vcu<1_gYmn7{nx^9HIO(fr zZ95pZRYS2o&;0i0TkbzFSJb1Ob63H4B1Am;vU@fS+Iw?>YISyR9i634Yq9#7**ecr zrX36F-rz&MB==v&O(E%;8^xOT3HbfvBA#Mo9A4*VcX8&RrN9Ud zP8!i|Blm{jPy}w|Z;QpTG*iaDd2A?TVpVW(LV)Vb;A2jM*wspeDWhD zoH9W!k;Z_;H23@qUBRz4@Cn0d5F(CI<)}Utc`Sw!U+kFu1Pr$Yj9Wh@#ZI0nBT~8>V|Dc#9c8$Gr5G#MWsf^-j9h+Yb>+$OP zy>7=wx=d$h{9ypg3JjHr{X9FW&T$$&_r@~PUwPL%8?=H~5S38TUgXL0blE%FZ124c zCNaTn4?y8+8!nDC9|uM>LGdg=K75kQ!{Vzq?!6z^&Im4bONTo@z7ri?9BuYp>;RY=k;$zSolyH8| z*acOMFA)cJ7G`WxZ{EDTi;<4&c34}(BDx8u+X-7^wkFczv<5gnfspvs0tok9g`w_1 zt5Sx^)$jG()FsrhCuz{H()gXb$8pM`>j>>yG@_Seo0MCLQGA&h+Ff1R*UmCV1_5Kd zPhO#Zg<#x=v?WEmesO+J9ev#c`wMC|2~g)mOynf$?!xBf=Gl<`Uo08-nPgp$dfb@( z129w1>BU-+zg=x1)qA+3w)VZ+2;<9SknmL3vDt_b??CLGM#qYlRkgwjxvq&vFP(Js z@ObLtq6kjW$j^O}W)IC6;p8{F1Jx=1;~4G>Me@v<{H{{E^n$88!|36FBcWa-G^W1Om4^|A*>ilp6yYO%HcohSw$)nO^SD$T# z$!PJ{tnJ?%G)%@lvR9R1VQOlHFBnu4@MyGjzUCRT!dqA;zfFUjl7}eDqP$80GE7-Q z+zKPoJf86)D|w!%0?5Rqbn%GZ(V=O$a*V;UnM2)b(NsK@Krh z-J->L+^~|7c~R8*3_YW}N=C{@Trs2w584)4cc4qZD8S(yiBs@vY5E+cCPg@&mXSw+ zhwR^lYO)vyy%19JM9$8|@@#gFr*Ctm>;O~`-}_|peckOOSMbhRKw-jMPKz)#T3L;( zvu?oeO%-YUKq=9%=4j^~x5QUW930~VeC8YeL!4EtLfxXGJ?R~B89rc~R%E+a)b$St z77XIo8=<^fXbx6IqB4Nv1zo0^=Rj(LixzBtB04C4A`$L?l8Hwx&yw+u%ql8;e?mm8 z;jlTbJSuyMAG3jUZps#7y=nf7=Ydic59?9?*|TQ^Nd`Vh!AZl#Ow9w1$7=;qiC5C$ zCkYoZ5vkm|9^?ZOuQ)rD4@zZDzE!+i{u0vy{8nK%QAkCq+Th|lI zVV^tb&uzN}Hs7=tHZ01z8B=HtbsoYXEehAFdEp^xlpiy4g?M=C^k2=HkEUi|X~(6k z0OxqJrY5*v8Q^-oNK9B^Lh?YbG=MC$a>0p~Oai5rsW;5*ca9~T*v()NXr1w9OVWno z%vDh}9n-92H)NXp7ls03qH4FgP$db;J7QHK%!U$^-KBm=HSk?zABA3Sb29iTh1}yo*$@>- zeFGx6hs-QA2l#Cl($TSy(Qw>|Y;&lFiE6YA+*2|pH8)+OC>Nf4?3!Br%pgg1W=sLYmxsjFT-;(l<6Yow? zhy>nBS;&dk^PL@(GT~sw^V7E;e|5H66(^7?D7Z)n|5!x!I!38O^xTtTl(V7CJ!;<= zN=Bi0`EoUQ15NS|?Rx&cBg1A|ni{Le?;$*j!?V+^q2{=o)uc|lny--O^ax35&2q|V zri8k!cUy1OuYqB7yZiB;OT_(;88n&oJjcDzCM~Cr+ssYR7;5D3c6%68utM$cOcnfD z%7H&iiJw+p0DG?SHLb2r1P*n~C?{mBzpc2S_GG~Z)lo_cA%Tho_=HhHLJAcd%Bo;7 zg?9+oj4$O?Z;y7_JKRD?6uI0Z^Yvr`IDg2TSl{2DEIx|MsX6n!7jcstC2TLUzslu* zo35r;3(`8W01t`}$>I}Ci-zSYh@Ji+uMv1tr$m|!t?H&2t%eL%A6`#)3m%@UfJRD# z)h`iLIHMx;FE_17>Q)jw?I$f!K)6-coeR8MRy2PuoL?O*o4)U!(TJqwhL1PBX+Um3 z5N^YV>)e#D5QiW;F2Lox_WP7;aHjW%tlG4{#?a>Y=((WDq9U_YT~?<{GJfkrGzb3N zLzt;P1^X51{(4_X(EH7-4`H+K#{2)ipp{W@c5b_wVP?YlekfWfn?^WwRGb_2)-5rm zrnq?EdcR)vU}E_tnrR@lEjt98UxPdCw>5cjjl*boe=yW7e>=QqLl9=NTy-Fo)Mk}d zcTMt>ghDVfD0%A>Z)Pfv2O)Gs@=U*i+7mV@jOo%6JlV-C@&o&ds3-K2{f1f zodD>e=9ed{%C@4KkKxqc9{LjI*=hs#Np{TBbgwF3BWBN4BkOt`Ml`>;lvIA7tjjkJ zk39>5Mg=aWow}3z#FZ4p7;t)n1P%T;?nBU!gt+dH*4w5MlNK6`d*9hT2ToU4W}GYe zfsJiEPd~++mWYoXfahzm1vT_NY;q6qH&8{Ppa)j52%$fJ8W!==#eADj4^2&?fiKcm z1+qN#`Lo!_WZ*`+vaPT%w@Hgykq`<>7=!Qpw0iGY?q1$h2fL#5po(qE)3tzmdVI=# zkdEo9%96tGn2p-#t|01}&<-N^h%*rs7pDR7ERGi*z?l*O{L{Ykt!;&M`bR*tA#5kQ z3m$QlUw|w%9VUwjMi$#b=!ItPyVl*Fk^yw1!a+}KJGF?{gN2CJ7}`7?Qm!PZjtJ$X z?C}sqQPLH^Nd3$hegN&-w&(#lJmsd`KTkm3slpRQc^Kr$PJN zvOCPR0EvjWs;5ADJ1J{ay|<2;#q6?CgUOd-(7~!@ZMVK`exPsl>j$d$?_X0lABoJ! zV{F8CKiK&Nc~%?h9DV7TQhnZZ7&L%mfJcxQMd))OXJ%%Wv1ESP_&G^Zm5^yjH3dqx2Su z1HzGP@~QQ%np2btUp-58j8aoO^bj<_vY~ka@4LwIZIVo8YG{8No_5>V4J5-e4~KzYFl3p zCM3@DG{@Lz+=$2mp&70J>jg+_ZzJq9?w2#;%*1^RL)dxw5C0)2QM%439UlTPomd|i zy8K;br@Q=p55BLMzDF&yhsHQqvsghSp6HTB9<*isXMHcJdSBrQB+rI5=pw)}0h2CqrS0Z4&h z0*1m6091Tn$Q98BfvryXuYgaiC7a;kGK4PX4B7aufG*W$yX6o-(qQm7U#uFwq;!-7 zF2;fT^Sn15#|~ycIpi(&cz1sO6ngHJ5zWEEf~u0m)IT}d$%#dLqxX~%L>`qf=9?lH zR#b?y>jJq1?*8!!JhbnSt*@tlvH0b;k|9nP5E~N{hZ)-4EwK`2*&jG@SYomm|21TP zKbLta$Goyrvs9p)&~$3&^IMOq&M`@Wzz4quo8t32yK11A6Jb;7zrz(}dK`2?CIy=9jXR{@AalxSz zO#3(%6OUVyXY?Ei*%Xgrg=~5{Iw~ec%Gvqp-Tl7i!Av0};NB-JJUkJ*g8QH}h5dA@d_09j_QX zSdN6myGtKzpk$Tmy$tVYqDPEluKr+#bD^F@lqmg(UawsmvRZ8r^ucY1Zo_D1W@h4+ z>=!D@Ki75lMj6<;vFZ9E`w9#h6^Nb;4YW9cd86sI(_{>v{(a>fKK)cJ2%!m7o@zRZ zg$3<4DAnz=r5adJ7D1#|n;+NLyd~u|nhd-MXB6H9A+^+erwRFsyEGngLfBwk*S)op^_znKRz(8x0`bo-wWAGNE+WmyDTAPDd4PkdA zF6|RcMJIbqDnpzx>;0&MJ(I5+&~{JW!cI#kl4RU~NKqp{1kW{ZO9yQEMPfvJC-|^D zIo~ZEy)_o0foE#}r&6v#Og~nl?ZGb|ArYU(UShs{33?ju0fS#I#d+7)UJM@O-_0&w zYQ8l^&1R|e?R>v-h)|R$kuuk>OuIG0fhI;z+YD+TmdaQ$QPYk@Fxff#4TN<*kS#Q zHP9uqGOw*zGG}F(hzu~m$Z*~t`gpKXXCZ$7=R!L9Oa)9G!q1tRHuR8( zz=tcNI=wRNDKF!NVbf_o5T*BxqZGse#>+%@ED{50?A0!CVjMy)Gre&LjZvH6ieWL0 zY2z3v#ULGn0qCdr0}R+=4ffvc`Y|725VL-qz*|pKa|uX%nr_ zfcL2MYos1GYd>@y$O4@Wi$lh5dNJxZO2`;Q2ox_7X#A#5MSF^kiewqV(88>=CxoV_ z250klyd*^ICW8XlKnd8~Y;`y@L(%$b_caB~71NhL4UQ2&i{&tptFY{H6Alcq)#WN0=Fj(@ ziCg7Lu5imVAT$W4T5u1sN+$4dH(UW3X04#%co14Cui2aV8wcG*B?Wd34+K>J8R7)K^=URiTn!VUpFXfu_9FR#kQT8TK&wiry^-&cH zJ|Do}H4jT$KwTk!|ABfMR{T6WI#znCKzf9fJi4bKG&tNK$bFW>h*jttZ99OpZvbu! zcldLVHrix&Z*bXFgc}2Y0fE4~q2DHkowq;Ih#y2+vKfu_dPj4X{(ca!UzvNJVu_M4 zU$Ex0U!|m(uklS2Zl|NCr+4vi2S1SzPJGbz{|%gLLjW>m^1ICpOI-S3s5qMkmGS-6 zvAomn4`zPvGYM42O1^ObG};8FL%D;}n=6Hi$e?EbDF^Xs_ zj$)XOD`VuC6Yk#s=JxMz)0tX#Fl8JiDF&@rzW?pz5KhwOvSt1*9E&xU!3X13bf*JV zE(YQ%##$_$vmo!cUAT`r?Zg+j;ZH#k|I+w4MIn^ zta$5rh$NCTby$}wOwwMbO&i3(VBaAsQqjmy(Nw=0Gn$$@HRsEasI}iW#+5tvZH7ku z+Z8k(#7Oq1t5nvJ(X5QiFO;QDT8m@mLghNdDtpHuEI{&gIFW%}j5^>&0wN^|V&o-4 zo-#sADl&#|_lYN|s>9s&mE`Hx;3)vhn|;$0|D{=_OZ@KDsf>k0-1W>PfOeeNT~sB* zQ!g)`_1@w(!1KyPooVORJQ!m{vfsadw?Gp#a+Z~shrHFZTngzq+Z`R>YXos*YEPJZ z+Pkrg*Fhy8CP^U$O}3Pjp+)Mo?kk}A>s7HKf`}4&W{z-vE7Q?9FqC{4BY)mvANoNa zhhbB{oncqo?0HCRnq)7l20nqo*ye6Y2^~Liw0y#bzTc~}9I@C}@|Pk54hQ(pgt32} zB07~hLc1rRIm)CXg1qpB8YduOCF1&nIB|0oSuQdo;?vF7Wvd+1h)A&Rg8&;is5Bpe zswUIp4oYT(R_kza7)SsZEcB07DACc;?cpwD3%mB{$B`#(fT&m7TLa5$_F&+E$+(R& zN@o}RgBh<$+guoUAD+x0_e@M2u>e;*3d!-R8TyxO*&H8Ly!A-96YVgqN&dABl0#fO zKJq@6jJ9O@?w;F2ko3&Vr!r}@d}FC>Z0z2zjSX*Jr6stn)X_5}39@1&nU69UsegPv zI7s*IHPY)3ACi8a81CG=;^UFVx<-F}gUNyhRmZdjro%6R?^ARr#`vE|0K+kSYM$?3 z1*TNXxqrY*Bm(GK`Jg4v@OPd>=L?>i^mSfsvL&6FogFU~&}36TH$=Mm9jn#w9B~!X zkSVil$$YLEO!VGz&>N}o5a1CLo6FQ@qJQcE`)T6CgGtim*)-#E zoXgXSRb#p}v| z!Am6o7J?eT6#wpB|Mxkf?2;-vUIK5BvmwEYdQEq;;b}&DW~Yr#C5Dy#w5KhfpeOo+ zWHbSjijIgqp7=_-Or#OQI@Qxf_mJRwLA3*yWNZcqJ8Lh=d>1taScKBXZ|SWs4s|KJ1J;yRnyf;Ly$8$4 ze}B6MZ}4wj(IWcs92n)m8yck&B7ZyPRp0-QcBF*0;^L@EiKfk8wbo*vs8 zVcu8Q#@ooO>qAb`I+M8xx2rkv0&Vbp6Hy!-PA~|t@2ONTFnirh-F<(N$81?6N-FIi zjexL^QD8gdE(dsi$pufk;zry(UA)>8m^zT0gZ+O1N=R(sHDss z;JizDlq=@ChXrOB7KN?K9R1nRM7`_{-wj&+nzx;yjoE)IN$5yGklh6K@rXb3-?qV6 z^`iaM++5O+dK5eJ=7mag$CCL@j!9Y)%rn4un60AB+*~DFJkolo-OYJtyN z1+H)CjHV0Gi_uPZXpA3yo)4GN9~DcyrHw{@n;m3y$0CD*!od3sFTn4^CPNnI z`%4>Sd!+KgOKIpzUNn@eG0w_r=gU_ie#?Zfxg>nX2z|$Gt1hz*IZL}3j7&(gWysx+ zxfunU%1+#$@9yK5us8OaS~(=|5ap+%LsEh|lHRO!<2q*vZoL%idGWSKg6C-xpT)C6 zebmva+xaJB>ZZVofL_6pl^uEr&RzbDAYS%&e&xmC!MN#-xN6Xd$jGb~SrB^O( zsJa)7Mk5IV$BhLXXp2f|XJX(4>}n~^RKvl~f04K>n(jDDx&lJqcrBi^uhIU>|JdV5 zmj@AE!9v};AL4xVnq|LNEO5T+y)6J}#UZ7v)jTZ{ zv8~nopdbX(1{Sr#usW_24w<2>{-q`Dom?+`i_QR9&+on7~j zXkgzl~f%-EeYq7;hLFsuFxa(dmMazpxZK35I?Hb*H3LE z|IjB36W4#|InuE-mf*DRf0fZ_x;C{pkz*^+=zg$-F9>s+Wt85c!PlioClzN_!lJl2QzA%JT61&W(tV`bOf;d8sL#tjkHZk!L5G7U2$n&gRP+DZ zOFE%2+o?1)eIa_r^8K{`jpNmkzGO$=&_6gdwgL`A@REf~x8P zpbcdzRMZO+hR!In;mGT$4SI<>;#dN zNeBEg{04tvJ{`IF<2IQnLATz6SehTEp@e!aZidQFk`l#C9?Ut~PF6Si$GV6j;kB}M zoV|kv2Fo5AmtFQHu2wunEvzdh+J1k{kc}H7SRVJ=f zjtBFFpW1wnl;@9kp`mKqYiLs^%V`~%EP{*;U%1XI7t7W9*@k~$&ukCH^IbmC{AkLQ ze~$SM1p4PY6t<4%K*FaUWON06@7$W>(YbX8P|o~d+7;?7qmy?)YrpnAB?!Z%*&#GZ z`@MNrcpn$vYpI9|@k(<(CzK`XEC?8GMikXTto+h)P5O)<10BoR%*j~Pa{_-88y&%+ zo7(GuXE@NPAVE}cjeKQf{C7?M+S^dM0g zuB9LQ09U^@#G~pvX5O^+Ocw4UyIb-9oEZci%iCoQ_OFAihcV)b<}vh zbK`5Li@@vBYK2JF_flrs*-Zq1VBLA@QvAk82rjy(dCIC{4D zQ|Jmt`8sCl%0MaybQ+D@pPWxXy&CHa+m&P3Vl*)f;*3lZM;-h@J~6#0R;wHFswIFJ zU$!tuXtf~{c*xnx>SO@oPr=LOub=Agg(^x40lO$BmCSUdI_@X28Xb3Mqq!Z8U^1Zx zx~--`Ufa*hbUkjbfea>~#z2x*>tniOdpk_aa8i^wuFmXX`UIzTr?GW8K|&$?^VG%9 zYPkaemPHgt=-HD#J(aU|hV3_Q-f zF=Ak3nO>r*fX$;{y_^*LDEAHjyj&0fbbzyMY^&1c>Lp2qF^-`wkCh{{QCCNu88=!7 zydS&-O{_&?-o&Ld5)py4Z(x|-C@gV?IF=!>z&MN)L+;@<-Ja2d_SZVqArc<|G#EKE zNy|F?wF;wYr1sam;5jc?I@IdUOG$mMXIjE+60PrGW1>!&^%Kc;MT8#0pZ6p)VN~;R zQRK!&AQEEa5UJSY(7Eu{;r<@b8RJP)vu3r|R{zA4pv4%KJZt!;Xmhs)HYF}*X-b=( zvLgKr>smDzVnsFT{PkM3T%u4h?2#etk$50nF)X*IrFTL_f|47QC=$QA44kB6*?gIBARfLm zz!$Ze7xiVQ;f=U6N!hk_T!&9AD|tlzCj_DzvgjVwK%xhEs-I?V=}A2*_N#Q0xDwii z2WL`dAYiN=;2=EYNaeUUTVp8klI8eBY^8t)X=KDfMkcJtWa-AFYxiHMJ)NT)RJOc)_E1zov`OKvUs4-+o12Hb^TP z-`amFCaQ<}0k(>T*g@AmED7~~WbAd4r3Z1?>F+}_(pNPSGD@vSr zNNp(nFUE+&fHgh;ZSE`U!b~G3|LEgOKeSYgBSQ$JiXJi)+G!rU+-8&=E@k!6*lke> zH1mRgFEzR|?Qo!TLz`Fe{|CZ_Q?5j$6^5505HOXT zB42*^v^y|i6|-4ZkPauDl&6~7o3Q4XR5j6^yB*f=b`x+FD{()$gH)(q2{rkGc zEA|5klBj3J`AeHds&1y8V!6tug$AbfcBkH@4Ujhm;YAWzDPa4_t=D86dJTL{fD~1wDVuf(;~) zi6F|NB>w(K{!ZDgXM%Lb z@yZGLdU98MA3559g`Rret(VH2j6^Wl6ECa0eJfxhC?Y~JokW)qLNL~3i(lvapzHc! zHAZK4>=7e@ImlP9J0?bO-DQ0BBM^u7J~jdZqSaJ>FMr}9A}FNkop|8SF=6wI9u?J^ z?gtTFkoZEQ@#=AT_5Sk&y@$~&0j}kk@qMa*@8_$+2;K-`a!;Ny5a?I9%%N(cJ7&N1 zpIoncz+v!A9N66HFITVqT*tHYH6LY=(|>d@h8UuHP@gX|i`yw)@7s3!XQY~XXw}#4 z>h1Zyq9-)o*T~9!&asnoHDDH1#IW%MU3L7hiW`Ub=F_}YR09& zGGKwY2D{@Vm}FYfJ(#J{`wLA9R6;fS>Z6MTGd*e_yP015G!oK!oU*9;Fod~YeNu%v zirRfXAav`-4X6&QTz+=8-rl4#t&GkE#hu|&38`8Svp+5> z5aI~B-O?REB z<Pvd;<@VvnV{V_ zS~Z68xDt1G-e*&rHiykOb;HgM{ZGOcs^j-dl_$>3cnf=odTv{Cdop$~T~Tk*c7yAr z)Z=6_Y-I5bhB{?=neGG-83Yn*tCq|Kp7?l-KWUOya;Z{xN_EV)%O0^h7Cgr71DIGm z&3zBIgB5o5*iQ_9lrKR9sROz~p^3~ZzQj-gb_0}}7r@GaQkBudib;)qPu$IA_63KAY5 z*=Nz+uYdG$^6uu%0dz2KtNnX2p3i90hgas7BV)MP`1hTe2o@-<(2K!p>tLaPe?k~2 zq>^ca2DMg?^n8s07yp(kd?B!h!Vz(w(5= zM6=^!4tq6YP=74Sv$hc)zZCJOX!OmNhAUi&v_tEHG)+ae5LY3?bU+t_p8v?g~iM11}-Umh%nvT9TS`1suJxqAqBgZhJ$f5o!OUToHL-JcZD z);GE}9idB&O^zUPd6OdV2RYhttx|DPC%+^QBE3 zBgK|f{yS?p)LW-!KNi<0?qCo1RU|>Io?f%MlV)$d&q@q2+ZZz72ALZiMU+GUT(4Hc zcMf*;G4wUC%^>)`;=lFq;MPZ6#RuyfILQbEdeG<* zly9PJ3Hw4x_G^i~-3t#EW#PcR-U-EvMj(EsLzn%6;-j2)p1)O8>;vL`)Z@cd_mM9B z1)OSYibAw`QHMJ3_P|&RhPB(+W@rBZ6L|d03XXOz<}?VFc>K${Ud?8_Jvp$wmT{Gd zVG}Nm$J9&D|l&w9f^ zs3gAG^31=k2*9b^XDA8D+58@L03M2XV{9QS{{03#mRCVqY$%h{IzCYD)=rRg}v?QC~~cRik$2%m?5<8saFu%E1W_Afd?gTX|I+iTilwh zZWY9oJ}f(d!cK?tvfh4G;JkUyZy!lwpF_7%GEdxJwasNWyFJC78XRS@pd4&k3bAgT z!2bncqhB@WOJW)1t5Q}^w}*m&|vm7+u%r3!T26 z3@#0NL%ug>yV^}Q#9;hp#VN)0a(&|qs|H5gogtLDKBIF};_(KTRkPA+R|1&=0=gmr zaK=~==D)oXM~XuLJmyI|lRBRwLFd^-3HnM;$Kv4^`BsTE%u9FPqbmEiT^@)7l>NhPe89BMkH(U({wZ{OEY&hc%3?x=`H-Hd7 z4Yq>41VmfWw8b`XG?9P>4!-e&rn$;T=!Rf6cGIuh?q*HMZzlVk|Cr$fk0j=`NWj8*+Wij(uH13u*9{&=5skelsV6EW5MefIVs@I_y(6Cu` zr!w8vwP}C6)_J1$7|t-snWZw|;Nrr2UCIc+?dpPVTH6sV0QX5o)D2E2!CXLB8;yaT z*QC*XX$#f>qr0A5a5vV}9sP~;2Pheu!8qPsvh!`9dY+gu z=p2|~XmyMM00)Rc(;5TOBbO=$^z8U2CP3}uPm zH=x|hR!zOeh(L|8A(gHt#hDu5V*_G+3QpGfsLS~OYpPN>*}V@y!cB4#K9S|^Y|hOd z0VO_sg8|`1XDe8^@)4YpOsc(B=U~>i^}V3n5j;&?@Z}v_TL5h=$n@PCAhh*geTek^ zEV)>1F#hesKh&zV1S;W>eoBF7x~wiryWd3)Fo6`PAw*zCbIhHDoS5}&M4>hDp94d z=u^WNiyZyQmjL#W52igCmd+otbdT_j2mAqheke~XUosd<8AVy`w>L&^2TY&gdw%h= z4Ho3<4&QYe*wY--y5_6DwVQnCV}k1MSj2TN-ufl$1&U(n(p=tozjEDu&48?Wp8LMs zOKF;2-k&g$I_PnZsk9a)B)Oo+malfe^e z)ad?a?t8S7&tHl-Rn!{2#GSwjS)J*Y(Zvx4t@we1{sz~%maO^kg58g^F`-M>=K;@i zg-qKE7F*onnW1iu)@dDGW$&nl+9qivN4_7*9c+c)NdCRhq0Tg)*k)Q2T=ydct&3K5 z3=GQ{>$P$^H=^xACC~3s#Z-1{@>Gg)a1;ClHH={>hiArl;vT3ZV!&|5+ktVeK?$Xm zE(RYoUvRoGXU={+8sEEpougmJOVjmT1}i)kkK&ZlmqP4hZM&=EfBx}~_S43CZckl) z$S@${piKDFlE!`GU$gLj+tk^^k0El&{Od+3?aJ$e`t&D*z{mp)1ywA|w_jo|G!4x} ztm-4hpVj|s`Jb-YLXj({#a(vZ=-*M8f{-4oX+~@wt(^N!`)8wOP+$F$4it)2%3f<+ z{(R$+u@Si2p7N``iH+brAvD)f@Wo=f+Pb^arO7rI8ZV~a)RAguz|*`t$}$@ckzG@Q0U|H|NtT3i$PWmD+V% z_0~}?zIN4yd21&?xXZr|2^ZqG&onSV`y18*V{kv{@*d? zAgw-+5Bx_XYB0whXa3vLxWOfJ7Zm}yYTB5j~!uFpz=D1Zzm`py$zXNKli+gd~; z2+B0suadwc^#IfTz@_BxHLCzEPUYgk|8Bpcz0fimhc$Y|E}zHYkEQ$V#>1eK_ARwa z-$1Wb=#(@02YK^o^y|7LywpO!`Wb(kGhDHNEfPFTTNZP-LbF*c80 z+bR=H!01x!lU$}{0`^C|0kgawN=Nu-pnZxDbR3`z><+%>J59YjY_DH4a!XHW{X(CX z-G}Yqo|P(p8nf^=(UXxxS!~FTAH2z07VTAC&F|eR!ObfMPOueM7>D3KIG{5_uo`)_ zJDo!*7>Z~*YJN$u!XrmZ9WP<>c*3%N)O1vXee6E;&X>!t|C8XcaB+!n zVOJNkpLch?{s}169O{ey6Y+xP!Gob|KWHbkHW*798sZ6t9;JS@DSGflB{Aj+RD*R6 zurc+@y;T)JVRzLg>&8oNd3UL^ezbekutU6!Utf!PSqzKG2~I?K=w;WlAj<5Fu`>I~gq|xb*&c ztTtMk`h{vbkiSmi>VMZ{XAM56*?zTF*qP6#dfz&=f6*U8ex?88XkCSvKRKZCw|4#> zUm7%lMZuB_ziZbE`JB$aHKxoS;P14T!QDz_W0uJ z&oUtLKLPQ!;V68D4xj7^tRrBAF>b7!%C5l|^sZ<0ht$>8e|GReP)BCp0x94M=$o z|K>EiU<|Qx`6FD%2)#Gd;f#efo;M^WH0vp@o?AT&gnQ6W=z-Al*BW0c2zFhJgq@KF z9qLR5$K?3`Ytl|o;q%Gb7;ynK3!Z$-G)l9h&MQNu$s-`LFV%iTRz!KSbsfv4JJXW2 zDJD+kMV1rjDsy|VwJO$l=}VM*)u-VPsfOl@F3=3tKRU?vof5g~D(^Z$&$B)4?TRb~ z>FN7k{P2L(3y5ffdaeaL4gW6x>AHB_^>OIb7r(oHlA*`}h%naFBJhXpms^Dqt8TTO zHQV~pbmuC*!2Z)R@c;K)THsiYUGIW@oMPxY{XU>Ee*Ad7E%oFUC4g#9uo0`)Ucz`D|y=) z{5rn(9ugQhQsQ2Ws!qrC6#IaU8WZ7tkV)$K3e@r+u*?B~PuN4n;0^q{xBzpgO!5lY*a6ilx zJ@bM8NHZs9hy#fpK{7})a0-W0Z? zxt;Go6nh0R__=fgS`HLGKDYHH>a1-65I~6_b6+f{f&@4iL|w+04^rbb9|z*Bb5>!s z&2cshfB8xs9Pv&+@e}uztTCVxxB^JWqL)XTg8HEm5)lO4k;v<>>Q070IAd(J>_x8E z>vZ@{1V7;lF@Li4!lcR9B;nHt^)z~dy}HIrVvqd7O04CG^*}||t=2l)N-Xn|90i$n<3Oi1#w^A4vkqzaWGF^(%xBEciiwr3w?*(bAM zbl*l9#gUzvojo%`;T$UA93)X1$ljY!HjzEDB_k^meV=c2e?H%T;QPb(y6&#`4_#NC z_jrxx>p33J$0GudmoPc4rKKfcSdtU|HYd{=+>4`3ajt?1h9_J4KC6Fbl(u{WqgHTp zYiB2ID9jQ1wpOdm`6H+^#xAbBZ75xWk*b|)8<>(loI^;QyI zepKkmx4yb2)$oO+`BqvV%P9hFOOsA_01BxQt)7Sj-ybcgt)zPtE2@j-eV_wjv};7c zTUTY2x<>%Wsc4?-KCjAs%icb7``Lr%0_iMiEHiY~_5vZ1j6zoLL|iw+LPDmf&7z*L z(l##*hV~ba1^>v05>9wa|}6YLbg3qBBx*p|H`C@N-HV57ws0{!KVAi}EjwL{8kmkphN08MHq^sn?}>N7wGy?eSH=NjEX1$5UQJsX?ts8S`AJYIp4 z&ldQnI3$}+&a9zW^|%I39X!troz7h?w6#(MX)IprGycBwYwZ`%jiSF6^Q2KiSNQbj z?;cKSKRom;f`a8!G!Gc>ZCeg)d4OPFM16U2>R{fd_pUD4dOIFZO3#z(>_5EIAa#u{ zEJrnRMqh7}i+yM``U~6|&vaQ%SNb53150=l-fDI6a|S>gOf}%>{$z+H43eYJHRzW= zpNXU+)A*i+K3$KfP}%)LEzPjh<<+&<-IBi67NlLK1FaN7_8kGiI_Ba&P^CTgU4% zlrsfQO<8EJFZSow-#4Si?R8?+kE_$G8;~iBn3#8;ZEdtz$K&Jr%NUz>)?=N%-$<#P z`i{P{ZV(@B6q56FEI-Mqj}uP?u7( zv%4?hc-XBNQw!qj@;O?JX3Bv#vo!Uz`Bq3FhqaTNK3eWktlD(5w8zGxiw57L?>s(H z=1rB1{^jk%BKXZK91_d{i#v?Vm18YwTpreqY5VfLHSFMS`P84bITFWHLvTryazJ78 zI7SPo<_(I18`z@sGEKi8WjuZDLhR}5nrSMu*-z+{Wz#{>3PlXDU5aaoq47_aIB(?W>_^a*cOy(wxA|UpiQ|9sXyGxp!B5? znfn}H@kNwAmq?S3>CKqB$E~CXj|)hZbcIrVskF4lV#lW168m(w;nW}u$lKa;gvc4p zY~!82yA*Fj&djEn{QE*59prnOYp(`l_QfJcHDGSa`;0?}TTH*8ov8`|TFWvuXG7 znFKC*Hg%fD%)^Mj4Z>@(p#Gk~_kuH+mzbC?5M26ql(Ix~{Ml&R-ZvzU*TWpMuj7bB zo6I9kG@MNf)fJAI$%So??Q!MNlZURP)C6$5q!gNhxn820NnHX$Z8ofJmO@+K?=yVzGE#Ggo|QBfFaG-xXxPy5t8|j_4%1d;=>}44xL1F zF<6iG1cIKNwMy_UNzV;sIjq%FIYQ5T_{cBo_<`+!`8#JY$dxsRh`Fot26Yn zrIJmp(5CMQ?4Jb!0T*ty=A@e-_~2n&*b;mB5dRqFV~Z%ea;*DqV4JJ|VDS!|l_c!x zOw^3(r2j>lci{1eVT-@*8I(95N2ugf^?r{|MRH&k`7*d3HIx)44f$+cv1Cpex>>DJ zv-j`QsCoG8ewkT40IF0p0Rg{SwI1At%wTI6rqGUITqR>H;Ma&!(0s>pI--`GRS;yQ zi|Fh7Y+D6ekB}oy>{{DXK7QfD`CJL1D;GLq4XQp7<#v7BNjI0mrl#NT>?SHK4*7%H z3*mASUCdjFDh*Q!B2yR~3uo7Q5LNHTU(@Mu`{ABnIP#WIG-|UmS8?8^*i#Mu4jmbd zK%bV(`g!98JI~7*G0@j!C|#dfP5%W1N$O#t;7Rem%qel>oH=9+t_*#RdUWF}u4R)! zZb%e+e&8<=w{B+{`s3#E-JD&3b)L!-%cnyxRhWA>JNkzQ$;ZAcRaxb0S=qry-|79! z(XFfmx;>~x9N=qg#iWAO`AwXyI1AQ=vhMJVo z$;mL^$?cXAa~{6{3Nc>mH}n^i5}UypwaPp*tZo&m(v^5T5J>o^k_NaPfm$Z!Q3Tf~ zvTCvdlipFODkG~#0hWY5EyKEdYm437SC`K$Qnv1XwcPiLkN$dRav z?iAh(9>vk2pJ)ed-Z;$B!IAO6`1$E$PYtFv7p6S!`IR7Aa%~2$GaWIBqUK@ViZ!&h z_P`5Y4>=KQGPf$fZ48lj4BbiBHs`IW`CwZ(BRtTED&*eITh7+LzH7mKRJFd}G-~ul z%^UHe0l);GVda2AA4Q11A^KK79FEXmd_4vjq3rM!u`D+7+*q~-Zt|7r#5?aA9}`|B zYjYO&RFEUMP@Pc|p|)6aOKLd0`BnHmu_3aLQu@7p@9&BI zh(U^!oyF~xT>jPg|NOWliKz-Qi~77!f0fs*(LCz=c;tjNaP~m4D)z%* z%8UV7${fG0nU>A%Z_v{i+$FmrV+mBTI)*Y`V*a$>XzhDw!X z)O|YH)(NC4Oh!iL)xIIR|-JZd+|KX4r48 zM=|yaAfa&r5*jn~Z3rs{dOOcA`h!q|`ph8{C%~eDp!}pkdgsfL&(Nx~KB(94$70D= zx)9w)zK896=u|xU^g@o)bW1YyO$m6-i&{%ao?_=-zm+y_5T*TM4|*D9BXvbWS!vSM z6C|iIH?8h<{C#D$uMnO(jOf|;3-`u^f;01tak1C0AK>mW-^%lvNh54(oZ=gd{?&ej zE5}{?j67L)?qVf$pQSk!TUnrjU&@Nn65nI^DinIQio&~e(y3c+wNT}EJKyEdi6060 zwacvOFj7_+PKLGb@BA5{z|nnJB^$&|!BO?%gZSIYkdg4goNVhy;vJ=klM(6AZj$I` zF^lD@@7u}CI`>MXjg_w&coN;6KWamY*;Q`PYmaT9wz%b*Df$64YiPbjE1Ko9IJzLw z;n{7uRkIbO7wzd&;6L&Dy7ndt62nS0M&JXCC~NQHf)BV7#C$&VW&53McWD|XbK6_E zK`r}(6{K)o1|&2}rM1#yCK~^a*Z{z53dqJu%W%x_8v{S^x0uxpnKN`~i&m!Xf*Sq+SaXppR$PLeWka%gj6v@ikIoT(|kTH z0!*$C#74AL)F98-(42!hObG>w2Dy|yX z*Tu12q7y@Jt_wkRrB*!>6@uDx>CJPooxbIrf=fFS0=%|lu6hyTDv#3YP<}EHNlk7* zGpbzR^=xDLmvPI&6SxBhn5F+#x_GT^e!0k=H|!{^ zDC@gvKly#yF<@!tS4Y5}IqzNlTf(ueysV6Ip6dgC<@m?>IrX4Z;>0^OI*4}m0epop# zdCpAiON(Kiuw!kmcB|;6Ir~UZlrJ@QI;X&W=REBuJZ<=|4|P(ii_>49Je!1>RjToZ zW3@fM`=NqrpkT2Aq;e)n72Q#8PETY)PpnO?nk*4tny!9ooO4y_iKk<3U2Nva*0X#4 z`gLQmf#94#ot6COb3GLP<$yuE03eE{=EJ@V^3QG~(3A^TAbHUy*j*N-$6(s7Gf1BK ziO3i4afIoh7qkzY5&sD;U!#4Qc|swutWjK*-#~-tIEM8XLgE|>_Bf228EVfy#klb(BU z67@AQs6Jgr08%6dQX(a3^-Z&rk^iS+wQ`CUJv!*&%Sc-*`ssYD8y1-Y5~9D1(}|%! zXm>2-vM1Ctx4`YzgdDtjMt$42$njrmnonWQD{$#{oz6({lEuaOh z)o_HQpm?cY>4&yvf~y%iQU4sZ_HDwnHA_!+>`BL(nHZL!@_pG{h z$j39pf0RVl&IPi)i zf>T%D6@BpR@fylgk?N4f__)Z2Frc>1Ncor>6xbY$JG&XS3Ba^TD8j!3G05wNb?i(^ z=17|MB+QKgrkwu_s#GyhDg-*{haM|#Dw$grAz4*uT}AW|03ACS-g0i_l+b4={pQO3 zm`l6z^yMMM`osB#qy#GEdJ_R*$4CjW?jax$Zvtc(klWct$@p$&ZugCijb#nP$_)d5 z=_csbTbZ-x%S@@5TVRESk3fQ>gV3^&@OzYhAv_sbNDy@!W!;`6YUw5msZem>6BoKV zWSo-I9%2WxwEQLu0@;1224kw>TA<~{YrFXHVusFs z3gkAD0;#G=NT&2+4*~|e`mGy6*Iqr4E}#M>9bE3s66gV!R~Uxu@<)4n;3-CMW^9}EYg4a|Qg)i!!ZT@2ZLN&Je+xDpwCy1H! zc$xE%ap3pI>9X&bmPxk11faD3qRQ+(0*}%w5Qc^#<&7GBj%-jtL4kU}QX#I>fSrZK zE301a#||8&K}8V|HWfIHaY3B!x$RSM86i`LKIxE_*)L?scz{wg*!T@$lMM{2=tPZQ zIh3Bo5{ohM=JDHzdazxDD4^oKX!#s%4M68U*?Wc+A?LXgZC4X`FvZ#W`Her{vV(lf zSb~ibuce!13 zx{+Wd0vV@>dgnkxOg8=#f}nzn3r^sL6a8a%cG|9mvq5^gIaX+PN?%5u?CalwBx;CZ zt(z&uZIKN*0XDM;jR)l{l3%SbuGZEe-mX=s)f*8>k-pJWr_CdYNN3ZppkVf|2&2-l z2+08`sCSjRS_8U-IDho}(S5@UFs;XeI*sz2Gn!|i^GWC4Toid8f>X*GaBu4? zz|RQOEs#lYPB5X?A9{dcUhS%ff(of`&u@1u%K)35FKTF)OZ5H>;kZ;?9Q()qxr^zR zcb)u^-Y~c-5@E_|7U~V32#10^07?Sj9w@X9x*P;yV>`SQZ{0Q}eO`;aV!^8UpQrC_ zcA!%@B+;>q3PLw_Ajz{;%EmgBwV0hKOF~Q>E)2Pwn!9vui(IlT?>H4o+^SWC{vB*6 zpH$xs5;-b7JUsoc!`PzSBQ7chSQ?{wG>jt6u@nupwgj;AM!4b@s?naFYs@~K&v?h> zf}nmuQa=cpjZ4XL-blA0lGIvRTXU^q;1opWly_VTC9O}}?QmE3^8VAY!NRndn(k)< zyv`HvsA5=CzzyWDuZ2{SM$w`46(5Ks@_LJ}00wM-v6jQx?rzp_(#t6Dg<`(4DcF6Y zlmi?8l_ZeulTIUIg8&vqR*iMW6aESBe;(oCnI4%hR7!AjK(Q+ z;fn%(-2pmX8iclC{l*ysFZVoTWbOyH!Ezq7uaz`fK2?)fULYpYv;a`tC(@=?R74Ro z6eyca?8bCb(gyw7T@Fb1QidR0{a_@7m=XB>8(hF3tRCcZWzQ)M2?ruM-Ihl=vny63 z=&M)>%Iw7U46ubLn}aB*$YTdM28$eM933q&V~7APFVnsk&V!PM0|0C7yb12IGekIt(O!P+e}%WyzJkt z{M85VwjYy$tr zx=@sQd3iaS*~CvYpGKFs0G&|$SCjGM+o<_GF&66 zY97crSY+$qaMdUPMetONQ2{Im{xVQDyxz$x3i%>e1?80n2Vf)Vuk^)gYinylXXUVS zJuSvajpFwwokJo@=_@j-aMvcP6DLjte!6?4>%#;$a7xIIyD{t(wtA*Sa-_i<#`J-Ciq zpDnWKs@n>Jew!byjzFl;^+JuAF9c%y&zTiR0V{yxRX;7U z4{7+nj|%wb_@kzx525;NHe7O>l8%n~`0vd|2Oj2zh^af|&UjGF3@q|K5^NGS&Or?q zAOD_tIb@Js?R)e0_X)Ds;9`c|vJtG@dGz=H`S*YRzZoS+uzJD`y2>~$;nY5RDUqLa+3`z4WUp_ zHg8LioEs`$KIshmEflO64**mg#(R-&!+)*|?MHL6#z&wA58l$fhkTdWx)DDe6dR+E zY@bP$A9H8GAG#T96)#t-TW*Yh4EVn7_e6eflxGnhKIgIU=}gQdK&T@C`I-g}BXbU< z2L-8_F?cARJw9u~1-6ztH7#wV*2MpRZvd_uG0=g0`RDdpF2Lo@Z@ssHqqzY#U1Wl! zopGSNpdb}MkpEIss|OwxWGhcXE>f%sEPjBayf$MJ`=VG132Y+lVh}!pyFf>dr!(XkHoJ~!609Z_YgBuf{-M15Oz=!^G zB*PT#(B~A67mm5uHU97QOwWV;*)(u%1A4*VkAtQ*B-+(&$@+kF4gI-xk%QK$P15{- zQ=P+z#7<|5`9Z$?pM|#xX<55!$v*t=*a*30jV`z#4u!)B2p;gy)gKKm&F&{d@qZi! zxT^sIX6SXX%lq%mc>jI5e@E`$HTUm^_{TK;YfAoqGr~c?DE=;g#Pf!$di((V`CIvl K(%Va>!T$$8Utq%k diff --git a/test/image/baselines/ternary_array_styles.png b/test/image/baselines/ternary_array_styles.png index ab11c0f648d43077f9f7ac148d20f57e1e60558e..2ed0c033b92171f33bff8a7175d048bb3542e9c2 100644 GIT binary patch literal 41198 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�Y*)S5PaUlW*b3@Z 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 R01f_AR(zmPDrXY-{{fpB%W(hz diff --git a/test/image/mocks/geo_point-selection.json b/test/image/mocks/geo_point-selection.json new file mode 100644 index 00000000000..a74f498dcf0 --- /dev/null +++ b/test/image/mocks/geo_point-selection.json @@ -0,0 +1,51 @@ +{ + "data": [{ + "selectedpoints": [1, 2, 4], + "type": "choropleth", + "locations": ["CAN", "USA", "RUS", "AUS", "FRA"], + "z": [0, 1, 1, 0, 1], + "colorscale": [[0, "blue"], [1, "orange"]], + "showscale": false, + "selected": { + "marker": { + "opacity": 0.8 + } + }, + "unselected": { + "marker": { + "opacity": 0.5 + } + } + }, { + "selectedpoints": [0, 2], + "type": "scattergeo", + "mode": "markers+text", + "lon": [0, -75, 100], + "lat": [0, 45, -30], + "selected": { + "marker": { + "color": "green", + "opacity": 1, + "size": 20 + } + }, + "unselected": { + "marker": { + "color": "red", + "opacity": 0.5, + "size": 10 + } + } + }], + "layout": { + "dragmode": "lasso", + "showlegend": false, + "width": 700, + "height": 500, + "geo": { + "projection": { + "type": "miller" + } + } + } +} diff --git a/test/image/mocks/mapbox_bubbles.json b/test/image/mocks/mapbox_bubbles.json index 3f72cc2dbce..c35b8eb247f 100644 --- a/test/image/mocks/mapbox_bubbles.json +++ b/test/image/mocks/mapbox_bubbles.json @@ -28,6 +28,24 @@ [1, "rgb(178,10,28)"] ] } + }, + { + "type": "scattermapbox", + "selectedpoints": [1], + "mode": "markers", + "lon": [-10, -20, -30], + "lat": [10, 20, 30], + "marker": {"size": 20}, + "selected": { + "marker": { + "opacity": 0.8 + } + }, + "unselected": { + "marker": { + "opacity": 0.5 + } + } } ], "layout": { diff --git a/test/image/mocks/point-selection2.json b/test/image/mocks/point-selection2.json new file mode 100644 index 00000000000..3c4857bf620 --- /dev/null +++ b/test/image/mocks/point-selection2.json @@ -0,0 +1,112 @@ +{ + "data": [{ + "selectedpoints": [1, 2, 3], + "type": "bar", + "y": [1, 3, 2, 4, 5, 7], + "selected": { + "marker": { + "opacity": 1, + "color": "green" + } + }, + "unselected": { + "marker": { + "opacity": 0.5, + "color": "red" + } + } + }, { + "selectedpoints": [1, 2], + "type": "histogram", + "xaxis": "x2", + "yaxis": "y2", + "x": [0.2, 0.2, 0.6, 1, 0.5, 0.4, 0.2, 0.7, 0.9, 0.1, 0.5, 0.3], + "selected": { + "marker": { + "opacity": 1, + "color": "green" + } + }, + "unselected": { + "marker": { + "opacity": 0.5, + "color": "red" + } + } + }, { + "selectedpoints": [1, 2, 3], + "type": "box", + "y": [0.2, 0.2, 0.6, 1, 0.5, 0.4, 0.2, 0.7, 0.9, 0.1, 0.5, 0.3], + "boxpoints": "all", + "xaxis": "x3", + "yaxis": "y3", + "selected": { + "marker": { + "opacity": 1, + "color": "green" + } + }, + "unselected": { + "marker": { + "opacity": 0.5, + "color": "red" + } + } + }, { + "selectedpoints": [1, 2, 3], + "type": "violin", + "y": [0.2, 0.2, 0.6, 1, 0.5, 0.4, 0.2, 0.7, 0.9, 0.1, 0.5, 0.3], + "points": "all", + "xaxis": "x4", + "yaxis": "y4", + "selected": { + "marker": { + "opacity": 1, + "color": "green" + } + }, + "unselected": { + "marker": { + "opacity": 0.5, + "color": "red" + } + } + }], + "layout": { + "dragmode": "select", + "showlegend": false, + "width": 500, + "height": 500, + "margin": {"l": 20, "b": 0, "t": 0, "r": 20}, + "xaxis": { + "domain": [0, 0.48] + }, + "yaxis": { + "domain": [0, 0.48] + }, + "xaxis2": { + "domain": [0.52, 1], + "anchor": "y2" + }, + "yaxis2": { + "domain": [0, 0.48], + "anchor": "x2" + }, + "xaxis3": { + "domain": [0, 0.48], + "anchor": "y3" + }, + "yaxis3": { + "domain": [0.52, 1], + "anchor": "x3" + }, + "xaxis4": { + "domain": [0.52, 1], + "anchor": "y4" + }, + "yaxis4": { + "domain": [0.52, 1], + "anchor": "x4" + } + } +} diff --git a/test/image/mocks/scattercarpet.json b/test/image/mocks/scattercarpet.json index 09756b08a41..ea9f00b5ec5 100644 --- a/test/image/mocks/scattercarpet.json +++ b/test/image/mocks/scattercarpet.json @@ -75,6 +75,21 @@ "line": { "smoothing": 1, "shape": "spline" + }, + "selectedpoints": [1], + "selected": { + "marker": { + "size": 20, + "color": "green", + "opacity": 1 + } + }, + "unselected": { + "marker": { + "size": 20, + "color": "red", + "opacity": 0.5 + } } } ], diff --git a/test/image/mocks/ternary_array_styles.json b/test/image/mocks/ternary_array_styles.json index 755b8ebbde1..6b4f00d389e 100644 --- a/test/image/mocks/ternary_array_styles.json +++ b/test/image/mocks/ternary_array_styles.json @@ -84,6 +84,28 @@ "width": 3 }, "connectgaps": true + }, + { + "type": "scatterternary", + "mode": "markers", + "a": [0.1, 0.3, 0.2], + "b": [0.1, 0.9, 0.4], + "c": [0.1, 0.2, 0.1], + "selectedpoints": [0, 2], + "selected": { + "marker": { + "color": "green", + "opacity": 1, + "size": 20 + } + }, + "unselected": { + "marker": { + "color": "red", + "opacity": 0.5, + "size": 10 + } + } } ], "layout": { From a7f06fa5ec7479402fe1d54cdfb4726e74f7c172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 20:28:52 -0500 Subject: [PATCH 39/43] (fixup) rm selectedpoints from scattercarpet for select test --- test/jasmine/tests/select_test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/jasmine/tests/select_test.js b/test/jasmine/tests/select_test.js index ab770a9d5ab..980a550f644 100644 --- a/test/jasmine/tests/select_test.js +++ b/test/jasmine/tests/select_test.js @@ -713,6 +713,7 @@ describe('Test select box and lasso per trace:', function() { var assertSelectedPoints = makeAssertSelectedPoints(); var fig = Lib.extendDeep({}, require('@mocks/scattercarpet')); + delete fig.data[6].selectedpoints; fig.layout.dragmode = 'select'; addInvisible(fig); From 80eee22a29bb09c57764e978fd0432eb06041cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Thu, 16 Nov 2017 20:29:10 -0500 Subject: [PATCH 40/43] add selections persist test --- test/jasmine/tests/select_test.js | 141 ++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/test/jasmine/tests/select_test.js b/test/jasmine/tests/select_test.js index 980a550f644..e6fc5dac041 100644 --- a/test/jasmine/tests/select_test.js +++ b/test/jasmine/tests/select_test.js @@ -1279,6 +1279,147 @@ describe('Test select box and lasso per trace:', function() { }); }); +describe('Test that selections persist:', function() { + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(destroyGraphDiv); + + function assertPtOpacity(selector, expected) { + d3.selectAll(selector).each(function(_, i) { + var style = Number(this.style.opacity); + expect(style).toBe(expected.style[i], 'style for pt ' + i); + }); + } + + it('should persist for scatter', function(done) { + function _assert(expected) { + var selected = gd.calcdata[0].map(function(d) { return d.selected; }); + expect(selected).toBeCloseToArray(expected.selected, 'selected vals'); + assertPtOpacity('.point', expected); + } + + Plotly.plot(gd, [{ + x: [1, 2, 3], + y: [1, 2, 1] + }], { + dragmode: 'select', + width: 400, + height: 400, + margin: {l: 0, t: 0, r: 0, b: 0} + }) + .then(function() { + resetEvents(gd); + drag([[5, 5], [250, 350]]); + return selectedPromise; + }) + .then(function() { + _assert({ + selected: [0, 1, 0], + style: [0.2, 1, 0.2] + }); + + // trigger a recalc + Plotly.restyle(gd, 'x', [[10, 20, 30]]); + }) + .then(function() { + _assert({ + selected: [undefined, 1, undefined], + style: [0.2, 1, 0.2] + }); + }) + .catch(fail) + .then(done); + }); + + it('should persist for box', function(done) { + function _assert(expected) { + var selected = gd.calcdata[0][0].pts.map(function(d) { return d.selected; }); + expect(selected).toBeCloseToArray(expected.selected, 'selected vals'); + assertPtOpacity('.point', expected); + } + + Plotly.plot(gd, [{ + type: 'box', + x0: 0, + y: [1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5], + boxpoints: 'all' + }], { + dragmode: 'select', + width: 400, + height: 400, + margin: {l: 0, t: 0, r: 0, b: 0} + }) + .then(function() { + resetEvents(gd); + drag([[5, 5], [400, 150]]); + return selectedPromise; + }) + .then(function() { + _assert({ + selected: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], + style: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 1, 1, 1], + }); + + // trigger a recalc + Plotly.restyle(gd, 'x0', 1); + }) + .then(function() { + _assert({ + selected: [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 1, 1, 1], + style: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 1, 1, 1], + }); + }) + .catch(fail) + .then(done); + }); + + it('should persist for histogram', function(done) { + function _assert(expected) { + var selected = gd.calcdata[0].map(function(d) { return d.selected; }); + expect(selected).toBeCloseToArray(expected.selected, 'selected vals'); + assertPtOpacity('.point > path', expected); + } + + Plotly.plot(gd, [{ + type: 'histogram', + x: [1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5], + boxpoints: 'all' + }], { + dragmode: 'select', + width: 400, + height: 400, + margin: {l: 0, t: 0, r: 0, b: 0} + }) + .then(function() { + resetEvents(gd); + drag([[5, 5], [400, 150]]); + return selectedPromise; + }) + .then(function() { + _assert({ + selected: [0, 1, 0, 0, 0], + style: [0.2, 1, 0.2, 0.2, 0.2], + }); + + // trigger a recalc + Plotly.restyle(gd, 'histfunc', 'sum'); + }) + .then(done) + .then(function() { + _assert({ + selected: [undefined, 1, undefined, undefined, undefined], + style: [0.2, 1, 0.2, 0.2, 0.2], + }); + }) + .catch(fail) + .then(done); + }); +}); + // to make sure none of the above tests fail with extraneous invisible traces, // add a bunch of them here function addInvisible(fig, canHaveLegend) { From aff9dbf317d16add130880756ff10901f5832b47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Fri, 17 Nov 2017 14:48:40 -0500 Subject: [PATCH 41/43] fixup selectedpoints -> calcdata for box/violin - now works for unsorted sample arrays. --- src/traces/box/calc.js | 8 +++++++- test/jasmine/tests/select_test.js | 12 ++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/traces/box/calc.js b/src/traces/box/calc.js index b1ad8c72d84..f085eb9306b 100644 --- a/src/traces/box/calc.js +++ b/src/traces/box/calc.js @@ -200,7 +200,13 @@ function calcSelection(cd, trace) { if(Array.isArray(trace.selectedpoints)) { for(var i = 0; i < cd.length; i++) { var pts = cd[i].pts || []; - Lib.tagSelected(pts, trace); + var ptNumber2cdIndex = {}; + + for(var j = 0; j < pts.length; j++) { + ptNumber2cdIndex[pts[j].i] = j; + } + + Lib.tagSelected(pts, trace, ptNumber2cdIndex); } } } diff --git a/test/jasmine/tests/select_test.js b/test/jasmine/tests/select_test.js index e6fc5dac041..38bf19fb1ba 100644 --- a/test/jasmine/tests/select_test.js +++ b/test/jasmine/tests/select_test.js @@ -1338,14 +1338,15 @@ describe('Test that selections persist:', function() { it('should persist for box', function(done) { function _assert(expected) { var selected = gd.calcdata[0][0].pts.map(function(d) { return d.selected; }); - expect(selected).toBeCloseToArray(expected.selected, 'selected vals'); + expect(selected).toBeCloseToArray(expected.cd, 'selected calcdata vals'); + expect(gd.data[0].selectedpoints).toBeCloseToArray(expected.selectedpoints, 'selectedpoints array'); assertPtOpacity('.point', expected); } Plotly.plot(gd, [{ type: 'box', x0: 0, - y: [1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5], + y: [5, 4, 4, 1, 2, 2, 2, 2, 2, 3, 3, 3], boxpoints: 'all' }], { dragmode: 'select', @@ -1360,7 +1361,9 @@ describe('Test that selections persist:', function() { }) .then(function() { _assert({ - selected: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], + // N.B. pts in calcdata are sorted + cd: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], + selectedpoints: [1, 2, 0], style: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 1, 1, 1], }); @@ -1369,7 +1372,8 @@ describe('Test that selections persist:', function() { }) .then(function() { _assert({ - selected: [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 1, 1, 1], + cd: [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 1, 1, 1], + selectedpoints: [1, 2, 0], style: [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 1, 1, 1], }); }) From ab7b8f104d44016ad5698a09e47c0fb8e116e82c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20T=C3=A9treault-Pinard?= Date: Fri, 17 Nov 2017 15:07:42 -0500 Subject: [PATCH 42/43] update baseline (box/violin selectedpoints ordering) --- test/image/baselines/point-selection2.png | Bin 24319 -> 24385 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/image/baselines/point-selection2.png b/test/image/baselines/point-selection2.png index 64359edbaeb6573825daecbc78116d061ab468bc..8a898869141ecc56041793030a51cac013a2665d 100644 GIT binary patch literal 24385 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 Date: Mon, 20 Nov 2017 11:53:10 -0500 Subject: [PATCH 43/43] aj-proof [un]selected logic --- src/components/drawing/index.js | 22 +++++++++----- src/lib/coerce.js | 3 ++ test/jasmine/tests/scatter_test.js | 49 ++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/components/drawing/index.js b/src/components/drawing/index.js index 2425366b387..a95828cd11d 100644 --- a/src/components/drawing/index.js +++ b/src/components/drawing/index.js @@ -442,21 +442,25 @@ drawing.selectedPointStyle = function(s, trace) { var mo = marker.opacity; var smo = selectedMarker.opacity; var usmo = unselectedMarker.opacity; + var smoIsDefined = smo !== undefined; + var usmoIsDefined = usmo !== undefined; s.each(function(d) { var pt = d3.select(this); + var dmo = d.mo; + var dmoIsDefined = dmo !== undefined; var mo2; - if(d.mo + 1 || smo || usmo) { + if(dmoIsDefined || smoIsDefined || usmoIsDefined) { if(d.selected) { - if(smo + 1) mo2 = smo; + if(smoIsDefined) mo2 = smo; } else { - if(usmo + 1) mo2 = usmo; - else mo2 = DESELECTDIM * ((d.mo + 1) ? d.mo : mo); + if(usmoIsDefined) mo2 = usmo; + else mo2 = DESELECTDIM * (dmoIsDefined ? dmo : mo); } } - if(mo2 + 1) pt.style('opacity', mo2); + if(mo2 !== undefined) pt.style('opacity', mo2); }); var smc = selectedMarker.color; @@ -479,8 +483,10 @@ drawing.selectedPointStyle = function(s, trace) { var sms = selectedMarker.size; var usms = unselectedMarker.size; + var smsIsDefined = sms !== undefined; + var usmsIsDefined = usms !== undefined; - if(Registry.traceIs(trace, 'symbols') && (sms + 1 || usms + 1)) { + if(Registry.traceIs(trace, 'symbols') && (smsIsDefined || usmsIsDefined)) { s.each(function(d) { var pt = d3.select(this); var mrc = d.mrc; @@ -488,9 +494,9 @@ drawing.selectedPointStyle = function(s, trace) { var mrc2; if(d.selected) { - mrc2 = (sms + 1) ? sms / 2 : mrc; + mrc2 = (smsIsDefined) ? sms / 2 : mrc; } else { - mrc2 = (usms + 1) ? usms / 2 : mrc; + mrc2 = (usmsIsDefined) ? usms / 2 : mrc; } pt.attr('d', makePointPath(drawing.symbolNumber(mx), mrc2)); diff --git a/src/lib/coerce.js b/src/lib/coerce.js index eb514de4a1c..f6de4e51ae6 100644 --- a/src/lib/coerce.js +++ b/src/lib/coerce.js @@ -382,6 +382,9 @@ exports.coerceHoverinfo = function(traceIn, traceOut, layoutOut) { * default selection behavior while allowing to be overtaken by any other * [un]selected attribute. * + * N.B. This must be called *after* coercing all the other [un]selected attrs, + * to give the intended result. + * * @param {object} traceOut : fullData item * @param {function} coerce : lib.coerce wrapper with implied first three arguments */ diff --git a/test/jasmine/tests/scatter_test.js b/test/jasmine/tests/scatter_test.js index 812159df4ea..fed15714c31 100644 --- a/test/jasmine/tests/scatter_test.js +++ b/test/jasmine/tests/scatter_test.js @@ -864,6 +864,34 @@ describe('Test Scatter.style', function() { 'selected pt 1 w/ set selected.marker.opacity' ); }) + .then(function() { + return check( + {selectedpoints: [[1, 2]]}, + [[0.12, 1, 1], [0.1, 1, 1]], + 'selected pt 1-2 w/ set selected.marker.opacity' + ); + }) + .then(function() { + return check( + {selectedpoints: [[2]]}, + [[0.12, 0.12, 1], [0.1, 0.1, 1]], + 'selected pt 2 w/ set selected.marker.opacity' + ); + }) + .then(function() { + return check( + {selectedpoints: null}, + [[0.6, 0.6, 0.6], [0.5, 0.5, 0.5]], + 'no selected pts w/ set selected.marker.opacity' + ); + }) + .then(function() { + return check( + {selectedpoints: [[1]]}, + [[0.12, 1, 0.12], [0.1, 1, 0.1]], + 'selected pt 1 w/o [un]selected setting (take 2)' + ); + }) .then(function() { return check( {'unselected.marker.opacity': 0}, @@ -930,6 +958,27 @@ describe('Test Scatter.style', function() { 'selected pts 0-2 w/o [un]selected setting [should NOT change opacity]' ); }) + .then(function() { + return check( + {selectedpoints: [[1, 2]]}, + [[b, y, y], [r, y, y]], + 'selected pt 1-2 w/ set selected.marker.color' + ); + }) + .then(function() { + return check( + {selectedpoints: null}, + [[b, b, b], [r, g, b]], + 'no selected pts w/ set selected.marker.color' + ); + }) + .then(function() { + return check( + {selectedpoints: [[0, 2]]}, + [[y, b, y], [y, g, y]], + 'selected pts 0-2 w/ set selected.marker.color (take 2)' + ); + }) .then(function() { return check( {'unselected.marker.color': c},