From 0d29b2ebfb28464b0c98e72565827d012547abcb Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 10 Feb 2022 11:45:08 +0100 Subject: [PATCH 1/6] Use scale defined in the chart when x/y ScaleID options are not set --- src/helpers/helpers.chart.js | 29 ++++++++++-- src/scale.js | 12 +++-- src/types/box.js | 4 +- src/types/ellipse.js | 4 +- src/types/label.js | 4 +- src/types/line.js | 10 ++-- src/types/point.js | 4 +- src/types/polygon.js | 4 +- test/fixtures/box/noDefaultScales.js | 53 +++++++++++++++++++++ test/fixtures/box/noDefaultScales.png | Bin 0 -> 13984 bytes test/fixtures/ellipse/noDefaultScales.js | 53 +++++++++++++++++++++ test/fixtures/ellipse/noDefaultScales.png | Bin 0 -> 29000 bytes test/fixtures/label/noDefaultScales.js | 49 ++++++++++++++++++++ test/fixtures/label/noDefaultScales.png | Bin 0 -> 21555 bytes test/fixtures/line/noDefaultScales.js | 54 ++++++++++++++++++++++ test/fixtures/line/noDefaultScales.png | Bin 0 -> 16043 bytes test/fixtures/point/noDefaultScales.js | 47 +++++++++++++++++++ test/fixtures/point/noDefaultScales.png | Bin 0 -> 14013 bytes test/fixtures/polygon/noDefaultScales.js | 47 +++++++++++++++++++ test/fixtures/polygon/noDefaultScales.png | Bin 0 -> 13393 bytes 20 files changed, 350 insertions(+), 24 deletions(-) create mode 100644 test/fixtures/box/noDefaultScales.js create mode 100644 test/fixtures/box/noDefaultScales.png create mode 100644 test/fixtures/ellipse/noDefaultScales.js create mode 100644 test/fixtures/ellipse/noDefaultScales.png create mode 100644 test/fixtures/label/noDefaultScales.js create mode 100644 test/fixtures/label/noDefaultScales.png create mode 100644 test/fixtures/line/noDefaultScales.js create mode 100644 test/fixtures/line/noDefaultScales.png create mode 100644 test/fixtures/point/noDefaultScales.js create mode 100644 test/fixtures/point/noDefaultScales.png create mode 100644 test/fixtures/polygon/noDefaultScales.js create mode 100644 test/fixtures/polygon/noDefaultScales.png diff --git a/src/helpers/helpers.chart.js b/src/helpers/helpers.chart.js index 059c2e933..0ede191b9 100644 --- a/src/helpers/helpers.chart.js +++ b/src/helpers/helpers.chart.js @@ -21,6 +21,26 @@ export function scaleValue(scale, value, fallback) { return isFinite(value) ? scale.getPixelForValue(value) : fallback; } +/** + * @param {Object} scales - chartjs object with all scales + * @param {Object} options - plugin options + * @param {string} key - annotation plugin scale id option key + * @returns {string} the unique scale defined in chartjs or the key passed as argument + */ + +export function retrieveScaleID(scales, options, key) { + const scaleID = options[key]; + if (scaleID) { + return scaleID; + } + const axis = key.charAt(0); + const axes = Object.values(scales).filter((scale) => scale.axis && scale.axis === axis); + if (axes.length === 1) { + return axes[0].id; + } + return axis; +} + /** * @param {Scale} scale * @param {{start: number, end: number}} options @@ -48,8 +68,8 @@ function getChartDimensionByScale(scale, options) { */ export function getChartPoint(chart, options) { const {chartArea, scales} = chart; - const xScale = scales[options.xScaleID]; - const yScale = scales[options.yScaleID]; + const xScale = scales[retrieveScaleID(scales, options, 'xScaleID')]; + const yScale = scales[retrieveScaleID(scales, options, 'yScaleID')]; let x = chartArea.width / 2; let y = chartArea.height / 2; @@ -69,8 +89,9 @@ export function getChartPoint(chart, options) { * @returns {{x?:number, y?: number, x2?: number, y2?: number, width?: number, height?: number}} */ export function getChartRect(chart, options) { - const xScale = chart.scales[options.xScaleID]; - const yScale = chart.scales[options.yScaleID]; + const scales = chart.scales; + const xScale = scales[retrieveScaleID(scales, options, 'xScaleID')]; + const yScale = scales[retrieveScaleID(scales, options, 'yScaleID')]; let {top: y, left: x, bottom: y2, right: x2} = chart.chartArea; if (!xScale && !yScale) { diff --git a/src/scale.js b/src/scale.js index 92db91722..65d524a29 100644 --- a/src/scale.js +++ b/src/scale.js @@ -1,7 +1,8 @@ import {isFinite, valueOrDefault, defined} from 'chart.js/helpers'; +import {retrieveScaleID} from './helpers'; export function adjustScaleRange(chart, scale, annotations) { - const range = getScaleLimits(scale, annotations); + const range = getScaleLimits(chart.scales, scale, annotations); let changed = changeScaleLimit(scale, range, 'min', 'suggestedMin'); changed = changeScaleLimit(scale, range, 'max', 'suggestedMax') || changed; if (changed && typeof scale.handleTickRangeOptions === 'function') { @@ -29,8 +30,9 @@ function scaleLimitDefined(scaleOptions, limit, suggestedLimit) { function verifyScaleIDs(annotation, scales) { for (const key of ['scaleID', 'xScaleID', 'yScaleID']) { - if (annotation[key] && !scales[annotation[key]] && verifyProperties(annotation, key)) { - console.warn(`No scale found with id '${annotation[key]}' for annotation '${annotation.id}'`); + const scaleID = key === 'scaleID' ? annotation[key] : retrieveScaleID(scales, annotation, key); + if (scaleID && !scales[scaleID] && verifyProperties(annotation, key)) { + console.warn(`No scale found with id '${scaleID}' for annotation '${annotation.id}'`); } } } @@ -48,7 +50,7 @@ function verifyProperties(annotation, key) { return false; } -function getScaleLimits(scale, annotations) { +function getScaleLimits(scales, scale, annotations) { const axis = scale.axis; const scaleID = scale.id; const scaleIDOption = axis + 'ScaleID'; @@ -59,7 +61,7 @@ function getScaleLimits(scale, annotations) { for (const annotation of annotations) { if (annotation.scaleID === scaleID) { updateLimits(annotation, scale, ['value', 'endValue'], limits); - } else if (annotation[scaleIDOption] === scaleID) { + } else if (retrieveScaleID(scales, annotation, scaleIDOption) === scaleID) { updateLimits(annotation, scale, [axis + 'Min', axis + 'Max', axis + 'Value'], limits); } } diff --git a/src/types/box.js b/src/types/box.js index 319927645..735e1068b 100644 --- a/src/types/box.js +++ b/src/types/box.js @@ -85,10 +85,10 @@ BoxAnnotation.defaults = { shadowOffsetY: 0, xMax: undefined, xMin: undefined, - xScaleID: 'x', + xScaleID: undefined, yMax: undefined, yMin: undefined, - yScaleID: 'y' + yScaleID: undefined }; BoxAnnotation.defaultRoutes = { diff --git a/src/types/ellipse.js b/src/types/ellipse.js index 19e0a9c6e..15e8f1245 100644 --- a/src/types/ellipse.js +++ b/src/types/ellipse.js @@ -53,10 +53,10 @@ EllipseAnnotation.defaults = { shadowOffsetY: 0, xMax: undefined, xMin: undefined, - xScaleID: 'x', + xScaleID: undefined, yMax: undefined, yMin: undefined, - yScaleID: 'y' + yScaleID: undefined }; EllipseAnnotation.defaultRoutes = { diff --git a/src/types/label.js b/src/types/label.js index a07c20df0..27db9cb9b 100644 --- a/src/types/label.js +++ b/src/types/label.js @@ -90,12 +90,12 @@ LabelAnnotation.defaults = { xAdjust: 0, xMax: undefined, xMin: undefined, - xScaleID: 'x', + xScaleID: undefined, xValue: undefined, yAdjust: 0, yMax: undefined, yMin: undefined, - yScaleID: 'y', + yScaleID: undefined, yValue: undefined }; diff --git a/src/types/line.js b/src/types/line.js index 24e90fab1..a95337e94 100644 --- a/src/types/line.js +++ b/src/types/line.js @@ -1,6 +1,6 @@ import {Element} from 'chart.js'; import {PI, toRadians, toPadding} from 'chart.js/helpers'; -import {clamp, scaleValue, rotated, drawBox, drawLabel, measureLabelSize, getRelativePosition, setBorderStyle, setShadowStyle} from '../helpers'; +import {clamp, scaleValue, rotated, drawBox, drawLabel, measureLabelSize, getRelativePosition, setBorderStyle, setShadowStyle, retrieveScaleID} from '../helpers'; const pointInLine = (p1, p2, t) => ({x: p1.x + t * (p2.x - p1.x), y: p1.y + t * (p2.y - p1.y)}); const interpolateX = (y, p1, p2) => pointInLine(p1, p2, Math.abs((y - p1.y) / (p2.y - p1.y))).x; @@ -176,8 +176,8 @@ export default class LineAnnotation extends Element { y2 = max; } } else { - const xScale = chart.scales[options.xScaleID]; - const yScale = chart.scales[options.yScaleID]; + const xScale = chart.scales[retrieveScaleID(chart.scales, options, 'xScaleID')]; + const yScale = chart.scales[retrieveScaleID(chart.scales, options, 'yScaleID')]; if (xScale) { x = scaleValue(xScale, options.xMin, x); @@ -281,10 +281,10 @@ LineAnnotation.defaults = { value: undefined, xMax: undefined, xMin: undefined, - xScaleID: 'x', + xScaleID: undefined, yMax: undefined, yMin: undefined, - yScaleID: 'y' + yScaleID: undefined }; LineAnnotation.descriptors = { diff --git a/src/types/point.js b/src/types/point.js index 4eb7d8250..fff75aafa 100644 --- a/src/types/point.js +++ b/src/types/point.js @@ -57,12 +57,12 @@ PointAnnotation.defaults = { xAdjust: 0, xMax: undefined, xMin: undefined, - xScaleID: 'x', + xScaleID: undefined, xValue: undefined, yAdjust: 0, yMax: undefined, yMin: undefined, - yScaleID: 'y', + yScaleID: undefined, yValue: undefined }; diff --git a/src/types/polygon.js b/src/types/polygon.js index 11421f0d1..38ed3c5a0 100644 --- a/src/types/polygon.js +++ b/src/types/polygon.js @@ -86,12 +86,12 @@ PolygonAnnotation.defaults = { xAdjust: 0, xMax: undefined, xMin: undefined, - xScaleID: 'x', + xScaleID: undefined, xValue: undefined, yAdjust: 0, yMax: undefined, yMin: undefined, - yScaleID: 'y', + yScaleID: undefined, yValue: undefined }; diff --git a/test/fixtures/box/noDefaultScales.js b/test/fixtures/box/noDefaultScales.js new file mode 100644 index 000000000..4f9487ef9 --- /dev/null +++ b/test/fixtures/box/noDefaultScales.js @@ -0,0 +1,53 @@ +module.exports = { + config: { + type: 'bar', + data: { + datasets: [{ + data: [0, 5, 10, 15, 20, 22] + }] + }, + options: { + scales: { + x1: { + display: false, + labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], + }, + y1: { + display: true + } + }, + plugins: { + legend: false, + annotation: { + annotations: { + box1: { + type: 'box', + adjustScaleRange: true, + xMin: 1, + xMax: 3, + yMin: -2.3, + yMax: 10, + backgroundColor: 'rgba(33, 101, 171, 0.5)', + borderColor: 'rgb(33, 101, 171)', + borderWidth: 2 + }, + box2: { + type: 'box', + adjustScaleRange: true, + xMin: 4, + xMax: 6, + yMin: 10, + yMax: 27, + backgroundColor: 'rgba(33, 101, 171, 0.5)', + borderColor: 'rgb(33, 101, 171)', + borderWidth: 2 + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/box/noDefaultScales.png b/test/fixtures/box/noDefaultScales.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec18a510baeb3535d0b3eadf6ab2f8b987e8737 GIT binary patch literal 13984 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≈+m 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/label/noDefaultScales.js b/test/fixtures/label/noDefaultScales.js new file mode 100644 index 000000000..dc6e33933 --- /dev/null +++ b/test/fixtures/label/noDefaultScales.js @@ -0,0 +1,49 @@ +module.exports = { + config: { + type: 'bar', + data: { + datasets: [{ + data: [0, 5, 10, 15, 20, 22] + }] + }, + options: { + scales: { + x1: { + display: false, + labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], + }, + y1: { + display: true + } + }, + plugins: { + legend: false, + annotation: { + annotations: { + label1: { + type: 'label', + xValue: 'February', + yValue: 10, + backgroundColor: 'rgba(33, 101, 171, 0.5)', + borderColor: 'rgb(33, 101, 171)', + borderWidth: 1, + content: ['Missing x and y scaleID options', 'located to', 'the center'] + }, + label2: { + type: 'label', + xValue: 'May', + yValue: 5, + backgroundColor: 'rgba(33, 101, 171, 0.5)', + borderColor: 'rgb(33, 101, 171)', + borderWidth: 1, + content: ['Missing x and y scaleID options', 'located to', 'the center'] + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/label/noDefaultScales.png b/test/fixtures/label/noDefaultScales.png new file mode 100644 index 0000000000000000000000000000000000000000..13859d69e15ad24c8536442a738b0fa2398502b0 GIT binary patch literal 21555 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%0ACV%qD1H zzGP5*7;%COac5fJ+2s2Srg_NotN0akg=_`prLS|v`jncRdnswM9_{poeDa-dS(m1x zZw>l>`*=Bh{TacmQ8j4Y$HkxOIy1Vz_NPKaxkV+aK@__ktV3(Uh>U&bP_(-B`0N@A zpT7IsDO6F7`4Q04+MI0i%m)>iq&vE0Xiav7h(ANilw#()(lO=zJDCvxT_URYyj#uu zKuK~+TOu(WWvd>=1E6V72ODS~f|vh>n*M zwo6mr3A(@0Hdr{be3l1M{``3XB4>*VKGVpH8RmFuL8o~7@$3`NF8w_X^}v_K>&v6A`Go_k28ImX4*A27yag$F zce*2EwuI5!LlW(vT;wBt$ z*dQ-#m9_9<;~Jig0|g)BT`Si`#!4V1Y`Jm}_Ec}nw|ls1v(`l!9tg*k%bqB&KY4sFsH{4Vc{4N2&{_y-q*_yn+K*dokYgO^)^D7%d`XC}7T3EN8URE0C(Pzn z4Bfd+d80ObC!2P0`q_tv;zfN~{tNZwB9*1joV%HK-_)iNvRy(Xk?zGsrAVVf%!J3S z>www;kT*aG2D4*A>pB3#PFK+3Su^!D^PXVf^sBvr+N|X@;dC!I#1V68UAf@tB#`!909*c&=^uH-rbti#H$|DGz$mqeM z?XK=7CiL3xt28)e5l5)y(d~n=hfH5k!;`TYt-Rj+%F41h+&F*7mk-B77B$|k{$jsV zk}OSs8)Qg^fN@%A_N<=Cnoq>{xIJw%*|)s>4o(^r#u`i8f5J1 zj)F`K&!fP5Pz^0~h?5x%CBi_$E0-mpG-`sK?h!~n%)ye1z#{;1xyq4CAeVdXmKHE8 zs0L04@v-Fx4F*_D)ms|ems{|D*<_5|`?HAzgFnXgo)8M>aXdFimhLV0P0Lw0j%G}R z0Q3Hk{iP(eW60Q=+Z`zF4ou zIu~rW9z2G>GI@|~5yjYm46^e!UU65&KcV;9?cjt6k7*J}iBoUv4MywRI?9IhpW~)iw&o1~*s@U5 zv-(A%E;lzfGq;Mwr1zYGns_6NyjQ@g{X0+v>2O#fA2z>lbYC1~@UMhUPXU_aY=F2P z)2-Jr6ZFT!rkJ5N|F$YaQXeZUKyTl0@*yk%3c3$1vimS2jtgA}rtWR<&c88F#XCiZ z!La08tANpg+={e}0Y&jxw}u})?SlPj_u4$j;zzRS=S2KI4qk5odIeuqap)_dgp-YE z`!B(L9#eq7@)k|@qC?BQVtJndRLeo%9sX)kS8f83L^TDjYlHK1LvkPdRcpNS_rp-f zUFEM&fP2KszuW&xyd&-`^qSr`Rsa}u$n7e;Kl0|UPeegloU_6z@c#7f@6SI2{bxo0 zCuQ_JIHvgF@#gIw##8Ul-~67!+G_ejsV=%Kn5S9ZcSfOPgM-hY$b2xXex*26a#VlD ztaw{FKTQok6nwev$!;sH^lF;SjmzzUJw(g3RU3zR!O%L$+hWal$Y<{b|Yy&7w1y`Np9;^c02K+ zR5bpMPPBLWMbdz8gicuh`Ze+8*k<1^v{!N79-3c`W~`&w?`uLlyumAENy$jOqM~A$ z<6#x=fjGOOOwmye!q8A>ruIUy;bCw#o_{tUGxv zaNg-$a?t8tb#7Jv@#x49C$6CZp(p&Ses!lOs{~QP?Hw6&bm%005JzchK;KVlK(8q@ z=b+by;Wkugpv%Tcpv!<%_yTdf4TWl0UDJ5=XrI<#?D{7>R-k2rx`?!qr}imX7jqu~ zU55?D_IsR>2c4EQ^z)vlx}0Li>sM^k!bnEes? zD+aWRK9mT#zdRnVzfUS_ZFysw3i^HfL;GK!HZ0CXd4T-6$M3#(YML8E-ZA6}>983J zerVzOD0iYB=YSA-Pp)b9(R<4U`+@cN1nIU1N3~(TP6bGESI!UD`0s;xnV0CWk9m;} zKeck*!F<3NeYPeN{Q(i?eGEZ;Z;7?y$34DkL$$5XnA)W;`)CVg7vu^(v%Pfse@&HM z*?qTQ7*zX2Dt&D)6JzhP^=k@7JEF(o^u1K=qNYE9%xX-{ZF_v@tSEKQ)b=*7Z2-V( zyY}}eo)Xihp=Tfr;Mumrkb*(n_hW$4egQJGyut0?eMx&umI7dsuGFx-Esxdd4wyGp zf^ztHmmVgidyF-N7g<-VrZfN?(Mk64Ua_eQZQql5!+~{E4y+agv#2Wi9aE~{NYdpP z&U3WhccJrGiu<_T?H|B7mplcTuXylM&Nw`9-VJ=>O&fh2YT1*0P|~)$&_j2_Rq(b zwGUZug95zDry|cLU{a_ z3VQ*}cN4@sRmO&@J*)+1qgZ?a@>WM0uBq@ekVm`#2NiNpap**XmFo$AnDYe3@;B6H z8s}7(zlvB3h+L6SyY}VLE$EN#<<-&ngv~|?>Uz;h5-6CHgG03`6Fe*=QH zvT8E9x!vdj^xgK(3nlL?AvXBjt{w~OB7zMrmvkAZY-!joNQbx>5gJY;CBbCA;f2tt z81X9vyiQPlnPKfwHQu441``9><#PZAm~WA7_rdSZd4^PhgUXjVP#;&{+9-WXvdN4| zzE8mG>tQ>E&lj6|akl}v{q3gwBB>a^el=6?QuS|KXu@P{ z*`Alo4tbPfm#~7d-{VD`4918+G#9wO!IeK3p!sT&lsa2#==RJ$<`{tw?M?Kol7~1V zL5ab4RtM$h@hE2o3o4tcQ8%dQD8$?CV^&b2ld3^-V)g)s)PkDvhvGX8MI|jgX4b7U z?lqmfcR}Fa#(GsKbn}%s7lYc8f%42z^^%UEq4llvaM1=Clq2jq6ohMGC;)YK6i|2Z zR2_g%5HR#yU06QwJ-X!+tNQOJK$WEV#?5y+ATMy*Gq+gL*BUwo0~KWuXa2dR_IoWLqTwYwvD9TYs_ySA7Eb^+WsKw7Y$X z4S*{0%0F0zRUNeRZk4~GR2)2XjSl<6?LS3rac8BS{K3Y4JNY#p6vphf^B!!b$7Y2| zSB@dWFlG^RR&Iq8?UlZh7V{g)0yzq}xV>E>ey=PDur!B3@uRcd-AzFEB>Tb0YdSZ{ z{k=Ut^u}|e5u9 zQncBevBY085~_|%d|m5exo)7;W64cfu2F5!y`)t+rI@E!3-Y0D7~NY}l(xz&hH;$} z$Eu&CpOi?GIqv`HDt$rkJ*!zmujetZpBO9l7&$_jQAb^(aTBc>)l&=Kv1rL`Q`IPi-P1ciQa0c6eVLJ&Z zxsKqvnvlQ)7qxC$J`zo^_y{UxGWCzR+J^TYm{w2S1ywxXxyjZBP-nSe$fY2;iJ}ri zTgNSsu2~2L*lD?IN>PCMRg1uuamB1T!^=c{#bG(px?xYE#Bu?TbZhB_G=PWG`U4ZY z-7K6btv^F@-vcGJN!(|9!hi#+sBXC|k@Po;mrjSy6oxPtVPWyzi` zK!C(q?!)N>yjk&yJ^+@tNOxL;3YgupVJ|%KYQ3xdWM&u4 zr4Y`^=1!F4@8&5!=Zim>QR1y%r7>ZvcV6jnB|l6gm{iZbt6O(zZ4eCl{bMAQJoj)8 zkPe7LU^hwGbG{+g#NTBs=#pcN#n+dvp0JkbZh6$J#l)x3Qe0&;>T?3!weCVTZc)tD zb3+)MS<+HxwwJU^?j;t)&}=d*^x=M|9=3AAS@JY$9m$eE^za(T^Ir$6Q;jgOT+F<3 z&Iv{)ZV|Ae7sh>}%;Oo64x0n#A*R^l&ny9v=mF%cYh_=roZo3Voa|O)c?puk1cP#} zZMW6*(Cu7n0N3q8ZxC;W7UWH>=bCF*7XTn#$Op*0_$=uUv2k3igvO*y?#1MH7GB>( zhlMDc+S%(f62{S7W#8>i8E@-m4WuL|@65ULZa$>WunKy((%7yGK>F(PGl-g)3{{`*3%X+VP2k2s4tZ|`x@7?Q=RFP8E>|%l(p$>dwxk% zuTigJ+r>;vGt)9fEbaEk3Z1Jb4*!LD4ps(fbRx>XCh*9ASs6Gq;u$qByx{VaI~B9> zyT5BR!8~|0?3N|76)(Ef*+6{Jmz+Qou8TJ;k}=OK9vbZtWaiy|W*+3zY8By>Sp#+3 zN#5`3ucu+H+W^d=4dbrBuo>|rS97v2kJJN#?~m&YwX10>UK=>l!ExMPbmXkNXF4ji z%1yXy*00q)mggZq1abDjT!3kh$j)%%MCtGE^w;fTQ5OM4xWcr>cQCDJID0PU_Vj7q zooLc!rk*U_UBlCP?aJi?rXGui-*fB6<8GQsJUf^44O>(uIBv#|*Gi6iUM+#MO!ks- zF5X+eYH`9m@wBrXJaYv`^kK_q)>)ld>!-3YTQGn9Uil>yvIi6l917#X@+`Sb;M<;w zvRFA+js%jnYPfueh~gd2F!!MFSagJlydEj3=Qoh zWfse3>(5MBSq+THc?Ni!eV0?L@R{i#lS*3;CEhx$JD4svA)daLP@H*VyJDD8HYxkG~{KU#=_4_@bWp7)X zJv#sh%F5s6?!z>)(jzxNcviFYU;?UB(D{o1hr6RHY1KW4%>=oJC;97T#NN_1z{H%T zL+c|KhrHXlOTV3epYENnYk_k9cIJCGsNBUuKFN@?-ZczW0jEeRU1o?WCl+p$0M=ig zz5&E241t6wL76;(qS7FfWgjUigat>;Ddzo(BvWcMD?KmBw~n%ER1~@3vE$hz+!Wi2 zP8V6exk#LKiw`;3!?Q~bQC)UUt3tyM3ZU&f_!`Ks5aJ<8E{l#6vU zB2JhojfhW-Ui7^+x?tf6{1(cbM_32}Z`!gcK3~#rE*j@b;|{1exoT%ZUqe_uUSs(Oe11b|H^E;1p93Wit%GG%+r*{I=sz*t@yFEV&qbH%dx;{B z7vin#dHQ^RZMod$b_^vJo?IdKch-tU-$*A!^ z%5p*KD1ZDDQw%eDW;A~-@(|Qq!5|AY#sO+<+w}}4Btd}%98?Jp(W=yF;%W@p5Xg1PnFkBkt1berq_q^n#Esb+VJ>2_w*We6 zIFB|}Q^`acVFqf4L?P8`3r0j4WK=>`J!hFn>qCz&p^r!5Za-A7dWkFX!$cI&(g9g_ z%Uv~T0Et+5QzoNgqxJ_C22GB9w-Js+OH=Ps^;r03fzTVG&UF>BXkDuuUIU z3bgtG*XooS%)&8QG-R5{gVa586!Gl{S`yX0!nS%+xb>uo6_t?{e*WSG9z?>v3ZeDu%o;9#q|h zp~@@7Z~9(*IF?Ke`;DKZkig{B??*u%S`MdSMMA9#rt-VQhRxL{;vV)kLe z15}0F1Y4?jKS>Gmu%HkPNMiIIY=j!RAjxk%gi~O-v5?8u{Ur&A?9bMYd|Sd$_9lQC z?BvV|czNj1Dng%L(1u;PLesD;(8`3?mxXvrznqdl%H8=3WQ_OI6Gos2*J0}_oUPPL zyI%aSg+&uv$_^S52Wxz0p4A!p3RvHTEF9oGr>Nn3a~hC7WyAi3BmidaDwir|D!*q3 z5c_IJ8?^l;X8^AC7ba++9FVTBf+0G5d;U8freULS4aR{U zH2kTTc2zB8+h+qD%eJjo9MePmh=tY_mSN)lr&VQ)7COT6^d_D+GtTwI+dP@>$xlqr zJnj*_&T$-5^8}M?h%vHHIP*&=`_0zCxD-~d^rM7ZJtOYPuoJrj<|Ihw0(&@BB0I`= zfVn3kSnjQ>u@H0RH>L(a3R_rcC4LG4#pdc1x%%tEFo|*aME1*ZA=I0wt!Ya{Ae+$< zy2hyPvEry5XLEF`oI5yyhx()E5IBuG7$R~O5$<^<#x$E7!G|e*Itaj}-Lv-}4tf+C zvO0HVoinemIfyh`tBHqkl)Pg)#~A-?)dUB6CN6BbL~tkLgH=qotxw0fUE^II3kL*6 zt3HBNtuHlTGRY(9M#8NK8fGs*zRnp0oDG;|JixC{-f|%d9^%T>mc$o%@;3(-W0L| ztKtGD#I+JZw~?-$GcrYzH|15rv((;E%Iq; zM56=%(a>Hi#}}y+u$wQI381)SD6U);69P~XJs4Av2zXZaw_378!+Q9YHWjk% zkuZIG!xg=(RlP7XUtZ^!Gs_p?gK;)#69m7B)_}CSTX<)}?imyh$buV=@%HZT8iPC5 zXY+a!fR6m1k3P082GdkVhj{xI#(Vy)ymWAp_y1u)usNU)pA@Xad$@XdybHMjFNUP? zdozYVyQv;8IU1rGbY=3<@_{wCf)d%0-b|;_6Kl#+)(B$s^-$6k@v)uHaOFGLdi7#D zwDnDZS$^Xp46-4^pv3i8R1!9qW9d|a3!()qJ&)49nz!bpz=ve-CWwD zZ+-T9k%*I*6jPEP}>YN;#5(LU^BytP3&8$;bir(m6vR7Tcj`+dER8tU3j zS#Vr0&uTSqkJ-*mk%80R$C`cT6iV8Q{m5_ZFe%HOlHNR7|IT`kkTU`W$fS20t4Uiu z+NvZ|d#4^*GDwl96^3)JDtCg3UjM=G!qC=(Q%JU4s5|yG)l2U!9%#xD zT;S0|*wFQyfvLp$QJaPCF==a9q$2Lq`cVzzOWv>HQL`gl%i98H`W;V)$2Cp!$b>*a`Fk zB;B0t@4~<>dbke7q697`k*K<}Um6Hsu5fc7vMSs+(%k>5*9*N94c^r2zV8u=;M6Q! zvA4`=1HZ{p9PY@A`tO>(*z~b|>92(65Sh@~K5-F$-@hol z7=~&=o^)uyegu~=TG=8Go^-&H0jk$ogutqU8^gfeV(=Y=4HD3&d(7heLBHR@;9dPU z7#~tuX_1A?tfC+vFE*t!f1UW&hGec3DWb@bOi{?Ri$XGoGFL(=V}=S_Mdl$X zW!xc>d7kaFzPn$)r=ItH&ikBmo$Ec+{7_WjeaW zTAl|!{Nqt?SSODYuUvTa@#wpwqdSh8S+FzHFc>>Hyc2x3c^-RY^r7zbYsY)Vd^p{w z5-$&**DVS)9%afadYDQdoYsv#wEgP#LShl^D?Q0ZnV53hh1Ck;ldsVYg?;NP#9`ID zeBL&fmA){baRh+j2dH7JXY(b!H-CM?9!da96_dlSt7ern1UX%}sZdxvK;y)4C`=lj zq_7JS!Q#^*F*t%++i>>}v8!m-Lu`ca-_Mgfh#N&p(^YJb#vAYKR+lU#U2D&EIDdZ7 z!D97fsN=?Tg#YH#XtCBg`M(C@*FxK)51X2fsIE=Dx!C8s_%JR}#rK8M5-DH@-KV@W z0gSv#C;XP)@MVNl##hVp{F<{Ove+UAY(DRk#Q9_Ckz7~z^-<+HcI_MKBNBZ!W>e!; z$;&M>-yTHNr)$Ryu8ii!UmE>bH&_?*^;F-A@%JZKywj8d{SWEGVrWPD%CXOd=Q^L+ z7g*Otx3jG)FLnzVW$0;}qdaGu!PEMj8eThy4UN_-A(4;QnCU!ypT z3p=;6_MygOdCZIbfK=Vei(Qjaca>UhR9qOncO77I7yZ{qE#fPDS9SQ&R5XlsMZ=_C z)$%Lz(aDM)Hr~|yxWK2ySJU|@Zk5-tY~4%TUo*QNf6Zc5P|7*UW0`zIe+`>XR|!X0 zlk%GmZOgaPdJYYFs_b*_$O08ger|P)`DUoPKG#0F5k$O}xL&rgGWw`vwIjzoabFbO>#khspRcS_h zhaQu?k4|FJ)&nf55hE1i@SyRIwSXT7m_$hnagA+)9>yEM08h&My3UW`pR837K*Ihd z9Y3&Xl+y<@&(7t5K|0yYtI#2bv2gVQS+@QL7=CXXZWP7IS^@-chm{3Wc}pQ*7n$TO zGRYQpwB_5RPcVo9$_fhyyG4(ZwlbhhNZ5_R0hxo>!JXZrm+265Y(dQNKn?1~_A(Go zWXXtv;~f!zI)s?3!JL%70pNI9P;97*VuLN}0FHMIin*PQM>6vkqQ>r>f7JM6jsLN+ zaW#+5oi!@_jMTO#CVrojZEr8|mhD-(wCD3uX9l$uaa*;Qim6*fuds_FQFa&pm@?2to3FuB*jmlvKHB|Uj9Dz^>pRm>P&vM07PJ>nz3_nQ%=H%yh zLLfXMWdXua4TOkrT7o$8AM)82er^s=fuH~U{r{hRDq_V!#pLSqsVOBXt|&3isHe}9 zf~+Wo%wOEqWF|Hq!iAD{3m)5spg%K2f9|x;?yws2S(~oeNZ9KznCrjp@VF*QNUJ_l zKs|i!rQiA$)BLlVp~L}tf__vQCxmQP2-!jbPT5VesHG-nzk!y!GFmiD+ipM3&CZS) zd7qiNoz&ye7kgL6w*FNBt&zXU(WB8T>!eo!)F>Av&1Wnq?43gp!d=e`OepAs$B!Sc zeaJRx7%%Bd*{``c(et%lJok1DpTF5qQ=({xnOoR}Pk93K9->Ju*BX-*O+*Zmf zE)J;^B1IuBrQmDkWgRPMNe?1aq6-QN+Sz=ka>=Yh2Wuz&78MoNR9=yM{VkU3O{~Ax z$71njnGF?)Ri5bss1FaUZwk&eSkHZXcd^T{q|VT9CWfS~a{cimz`da?g_2JZ>x!4X7-U zsP4+zN0%)RB^Fq|LMxEhW{sL`1;AZPS3ZJX;F342L@uDqHPU6rG#TA7v@VmPRs_gHN zQKNBoVF2A4O^+rmSqbZdk55boQZIMfKk8VgLVf$Vt5nVX+vqzjK7I48pI*#I65`_H z8>m>6_&dx!c+e!zU^_lE4P<;ApgNn-w=09L($Ig!i2U)Cb1aur>6hAaaBUp3X9`A? zZch2a$*ub?oH!r!YI5?$Xiod27n`MD(A&@a;OY~I9$5Uxd->}GS=1dxj~wzMkzB6X z0&6G#?=2fM@x!!@CyKdVsl}V=gM$m{JXe|8B`-+6}9$4$N3oW8* z+3XD9Mt~cZ6Z}AlJAoAsf-w;N(8!1`0>h^B!NB@@=vkNohY?{*JNE}&`_MR^Q^q#{ zrXQ9iuv(0HduI%T3a;b-L<56i2SpiKOA*O%7(RO!7*SYjUF5lfrd#v#Si-ze#sMrI zuYm&?0895f#jf4HZLpTiOUfvwM7S!VhnR~?>Y$XTQ$_f^!0(o6&CN) zwk0N+AMD4Kty!iZ=TO=DFxD`3lfn<4u=_`RumJ)lI_54$FXzt6;WZ`y1RsfcwIbe!lcMzcX zH$kdkfK-90yq;wHK?ohmE_oA@fjY%0_uhp$bz$-D7fiQ8pRiEOV7SeyfDOYh5@5*% zwNFPx`P&G0OXbm){q3J*pr3Xj&(-de`Pcy|F5(Ui98QJi(|MYuEolQROn=c4_YW=P zH(l~g#1c~2W1$|;DSC9z9en17;TO!4fSZu2n*dD!RXZbHKQW?lK|Atjq0`SJe#2dQ zd+QV*O4`Z#!WJ~H_A2t+Adc%L%Kz3jX>zmbj87m6{ z(=Yd-nDlK#Y|FNuZ^dCiqb4pE8hQyy2EtPMZV|-;;Ori3F%;FHI8Ko1PDrQ_5HSc- zRtM)&$XNL*qb=8i?Qv)v$p}2PA*521mei>rDglU+T38oqgkv?#`$W)bwwkb@ zwv#!5860y$q0@pwMHHTS*%P<4iW3c&C2 z7mh;UUH-Xq(26P)*Qwawsx!b5?l4|+grZTDH65a|>F>u9LX50hpo@zs&viAPu!sOB zRL^dM_5IRjeD+q7ElPf)6%V*sz_>c36EhTvo*;Cjqa*};Gd%*g1$QVp(x~sOp{NA} z(G3M~uqTvge}di`)Wi>5@1VV5wBHv&)_%mcv2>ml3>(u zUExj(k&6-vN*w=v$VD(jJxhS#OZbzXzo(~?KJe*VbW?~J_WB&G@jUoK(^n-*mkG9l z5WiWuk0~>v@;r*&A+GvRFv3$wR;V=tjCGY5ULNlh4xnMu;fdB0`C7i%>wuD8^3DN~ z;?VCyl%yJBZ6Yt6#Nw^29<;Z&*Q&E9Z-1YmAM+-c{+Nl0Ztm&wqvT8Do%6K@a!%dB zV9?(wi4{U!IFbj}@mpvgpTbtc{=?2}vmAVeJ zwYpGOUQKTm#57XU%tloHT2Bd%kfQ8eKR5FJT>b4G_UOE`)%4Go`a_K_;>;E%-#rMr z9ZSt8#GV5*q_@Pud{?8u$32?*8`USVm1SPD*8No>uVStwfNr-IZiSxy4U%Fod+S$eu|S4QQTR7$TeQu!+B^U_p|?t2Sc;wCK( zZTv3KB*%(<9Zy_4=e4msT=)X*^14cNcafNAeJ3J9uLn?KQ{Z-{b3AbW-mbkc*_Rp% z=E$An4-^;3i^=utN1&&zwMmuXCEiP6Oi^Z?O&7%#;=MJi!yfvoyi^>fPT=v(TPdHY z3s}{CeKPm(Xy9^rq2DB}`8J2e%Qx@G_e(0PcHQ&t`~0diER2afNm?k$)O1a;Y>GZD zI%eQ5=6LJ8Z(_%BhRTVam**yX%lBAT0((2V$Z#IT`cL^*=cfCsP3Z{1E~5BEHce+& z{#HYcTO0(Em%2vrb!?0rsyMKYg^GSRtW_Rz5MEBa(A_C6ehya51#ZL5?OLeemQ<++ z2gB5WUXqe`@m*LqUVH%~*>cuOC9}74GvSQ~V04;e^Px6eF;t#E_C1WidD`>LcMI|> za)8tXRV14?^ELc2BzW;LyK;b?n5o&D7IdCx>9ZlYy#%P%Kt5FK;et{c)W7$g2vW6) zrlOImZQ%cEgnxIYKhOR9Uio9IKeqZm$>Klp@+V&YC&UY68>F5a`7m2{LF2xeM)A-^ z-f(y@@`KRWHe>MWb^Wlp(Ep_^0qLJ&@N9nn^1Fn6)RvzM&Rtv`FKK{1xA13V*qEtr ze`I7t%zg6YcBteFv3ZBn=sbCWXEuTqZXD#GaAU@G0L!}unHD9X_nC(AutQ?OOx#7f z&Urf0b>MBCV@Xfk>)lpw8NJ5xYpj>1zF-N}sC#>bC_8eIQY_&{boJg{7)yBKxaZ28 z-Shd6r;Hr=I0&B$Z5y81zfaG|5Sbq~e|b69w9uw*S4sCZaDp3mQYIRy8ttxyQaJm) z8gMF`KKOhjBQd>9$+K`H6WvPm_y1h%*u^Sn*i>&8d0bZAI)7$5u^n@^z=AAd{(d`WzeDv4Sp-2kr8$4P}9= zWx2|`te~H6OIP7F&M?hbu9+@YHBX;^>_PAt<8;*l106NfT=iiMVy@oScaJ7R$m5s9 z)=S#}(n|kH@qXN(A zvs)D}OQ6#N^-aG~qL=IOlU(4w9uZYDr{p%5e!neepjsCb-=Mla6SKOFrCnm>o3l9Q zn3vTE^SFpwmOAWb;Lf_+(G^klFB283PNoIc+TSbb*hFdv{h5=d0N^!6?gG@sJbdy5 zHnbeMC2k8-V*B91UEtjCEyd!osxKYebzb^)&6dq|)W+2DFcoQq4zD>3%gCD^q6q6ku8uTqQSbCE+lJXBVgU%g62s}sQ+)azfJ3HDsf;NOO9wbJyB z52C)wtgW=T^STceg+w<$&@Ahp^Pdt`wOcA(d6%5c>sRK~^@60#b$vw*uA{Y}rUi{< z5@uj0Py*koBLmEB-96sk{8gPedP$6DBqZMMg(W5-sgY&!;mc;=vI&R#zMu#jj^!Pt|OcYQvIT%9o*gJUtc{Hw^0=>`k+0o zJ##n+3g4@i&2?;cq95cJ*89So%6R4a!YcgcXEGjmZ#nO0H5g?zxAu^t0fy& z&Ec_y%)X5~DlFjmxRd)?2@r!1qma%?wfE`GZ_=cCpR(jje3zSR zUg1BGy*Tdq<*EmLWS^Nq2-NubV8#b{sPwluJ{v=0VRSrhu3S51l8jf9D&5@{m5c5! z6KxElfiMynCyL>hy)AJJP`1GbNlV$;S2#q=cBCwI-1K~9_|jpf(IPK#F>o37hv2v~ zfxj&4C?-7n#AP2^DX#}h8+%iRFKPStFP7}(&GK?zv`AedQoryryaW4$u(`j>5IL+j z%|cGQYN$zpbjQ`#1Sf3_*Tgl;m`4oPW-6pEM##?jSr6QwrP^WF!9ukYUvWxN7*UZ! z^KTUi575$kL^Hl$optE#!CD0d~me}|i@37PKxEf2H=-p@?|ksXXq zG>$j`)YR+LsA0cNUIb8yKbAb?c`-ED<4nWHb(3hpLOC9f<@bBuJNV7=V$y{3NXnZ= zq~ZhT_$U19ZoOBGOWvS)-*AVh@x>TWD6W?smgY-=>&CgEjiyI`uRx0cG7pvyt%OT*zcF=Ppsc-y_ zOwH-z-6MBGq7Tj4FH~6!d-c9fpCn&+zqXs}B32f$)X#=%?s$&?;K1TL$XmShT4b~g zckUeDf4WSgWG-&4yuy>k%df6Qu94_|N)a6f18zJxA~{G9TyFjln}Y)Z)M;Z$t~GJV z@@oki_8rdNDIE$=W34X+r5@^znOf88O;)sV#$G*0fhX&ZO<02Ytou_gOeOw5Lc%lM z^}4tEOnfG)WwX`Pp`*nW3#WsBhz?lS9K{lN+}w*8FqQmJ^lay&j?u&W3znO_ zqwC(5aGfu1`CQ;LwCB-N=H73dYaJ=N8%=eHVYB;0yT-U+!(4<7w(xO;4GVHAdF+!z z>pTSxoI4CZ<|>qWHw2tAY4kHVpPkrSMvJoZE$*hv6Xt}pGT`9~F9f-8b1*ZEz<~ke^O~$j(f?dCnt=>r*y3*yX(*MJFrp+DAD%8R5f0BH(R7tZ zoO=gE7hy`9&b{k1mi#pPwv9)Dh8BkPvv&u;vvjx~ZPydrkO93o2zqjp_E|kL&MgkQ zynQ8pA1W@>&>&B;s{Q`tCh(!j+gSPN@e;?LtC82PK{Y$Y1b&-3n3}%LN5fcTZl9F8Da@>n_)8UU=D>xP5jmCt zPFnydMEB>(!^-D1jxgoa%Vu+sLR+H0nY5J|6-*jZK4XJHH1_&kV+AZeP;Qb=MhJob zCbr)UTB`smm!H_uSJ( zPv5uK{+r_BTFgX>KD>&#U`C`YMgRAuSnvD=Frb8NKkR@_){<1`Z3|e|A;c-Fw zr2dQ#nYQ0+JwbW8!z-mkdSq3#OV+=UhLvukLM)uB;jAHruo-^wSmhOX*zx^wN;RGH zP0@`a!PBNIxZi;-hNuosW)#H--+sHh%5=isA#PqvoMon6xN1IJ;sZH)Yo^Ce)#bY+ zmgwJ(=V0Er1URQHZ|vlZl2%WeTz9Kj!sQu*-#PN3f6T(VW5sY!{7*O(A3zQrnjmQZ zz42mxW|It(r0<;%wixUg3-Ny#+;MM&(buAvz2)Vp@7}vQOTVqXc+kiRLsgc={~!CB z{jCXmDFkUCCaGgEuPKR;n#EwM;6^gnVlCUu;FhK)Z^WFlQ(6GBe$D|P!J9+%bgL9t zCvK>cKj$x!Ca-An+$c$kC+i%wUdR}b^gn5H<#RVg!2dW`KKk&6g-3+Mh->$y)A!%l zKUJDmO`SWpkg;sF5jnuf3MXRY`As`hbn7GABg?`v2V>nQJ(5k1Danq{`%cHC)EY5` zh154OXc0S`KOQ<<9*+Sa7 z*=SNg7RDIBVXkHT<|1EAGt?KjKX?)ZDh>hZl zuTtdVCYA;#nfbx4w)$jn${z%Iv9Mz*uR2F-Ij|zfhc`<2#8G03w%z&X)GOS5@25AM zXqj!B+#jzuVfPzi+H|uL;tpsam|r3~fyom7@Prvv%gP;8eGM;xNo$!JRekT(dbdMF zXMY68^v(B@^P*gGdwtB-r<#vP9Q)vSic{%b$-;F6QE4}ufRhk5pN$;&3px)U{x7Mr z*&S9v&;}|M6kvg+y&0-DIQZHYHnCuk?$rDKCrcJi$ILr0PxQ`^KC&04#&n(^{}EZM z(y;smj>daF3V^MwM{rhXFLuI%p0XNe`Kino=3IPBF3S-n!<7sO%;q2Xr)S?W;BO=@ zF3r;#kM*rYC@2~?pX_2bpyV(M0_cU&`Oq8`eS-DCp5C%y(uT!&-%_W#;%QG(GH!`N z2?r@Kt@Cz2hF?gK{;VFqJF2#SNSQCNmKvGW6`|B$HM~cMXNK_3#_$(sK;u2J{(INZ zxeJV!!b0{0#Ud2kv=O%AK}WK(QtuXtEChiF{OA8gMhHRtGP45;ix9wB%0ekfhHRIx z_=6gotL_j^0>S^y$VY%+*}t5(^#vFl{+A=;6Tsl|zy7NZpm+ZlI``{Xwk|#1sC(=C z{-(~$a89XryBt&fE?Nv+P0-|9cl>%y*;%58wS!mXGbds#p_@pk{cSC$A3K7O__FH7 zbvn2s(Cf0;^ZdcR%PnQfxx2i4`c{sw_7^YiTL?hJvIG%65#KtBBisrW3ud^=CUT5v zI0Pq7+6LyiHiq`@V|X{T~Ipj{`YHvq9wteoWvU0Y-#hNND2QYwJaj-a`wYHI&J0Y)DQJ+4W&?UhnW>N+P)b%p;1=2d`ItJ+2v0zsX8zI`gJzrmS+NlwTX0*W-J;k39GK^35c1 zjR)Pj;<6HQ=*a0Ijvno6@ovS}OMRqRcQCn@tL;J(``$TtV+(GFzp6n`9p`!YCTF^T zRn9Ag(ZJ$O?qap~YlpeX&ODdK6=QhW00#OPju4k#uaO?gVY%Nqi%t7=$GI%I$?4xIl0#7wS&13Nmh86Q;eE)1 z=64Q8T!HNN8z*vK4n_j&6D1kNo7)9I^R4~FFy8UM_lXlxqJwq2$Deyq@FW1)!gM~7 zHwpssGT+x^6JWCby(4587*a+S#K0x-~6G%iQ{=kyzyZh(a8&vdmtp%iUta$2wgf>PcuU()bMhL=lf}S1ow%tTNnUvV_?r*ru>{PSrfWg<3A9 zb6zGjmwscrsm1DWC(Fjhw}s&epB;m4yqlv)#Jq|&zuPV+LWjJP2{jYAmd~d&ZmOB( z;&iD?f_u02hj<4c(heSFKfj~Nu&#aL>8WFVM*nD0?rS??u{h)%n!}yhbBy`Y0fSCA z-Dz$E`x=4sC_6ts0(?nAG{y7&6AL1|uDe{PmLEJ9wsMR-N|snUG9K=c(t~UQgPZ5` zgRN)T$l=9IuqA0A8Y#$y;cpaGgdZAprUpu1YD~*d{@t$l&d2s!Vfv4IW74+IyjTfJ zBs@5&rou1yQq4L7b~ur~k$_6o*a@9ofJk1ST<5g#IWoHmFS4hbUY_mVM=~$UuI{=x zFoR`5!p{_JN9Xx0UnIj9D{dPZC}^%MjEg(NKJ<5GP(~;1Y)av~Po-#hK~3M-laA7j zF9Pst#F9ftPAn;mpnii&isn7Jw|La}YrQ5%Hgupu!spfSmj3wB7^29T_v^sSNgC^gaL@w@M;Uy+5U|H$oA0pCRk{qwXK;{s{)upH%yU41aL<|0zvC zazx6~eiEfD-2q=k;gAV?ycgjv8>C45n{!oNg#fi73ZXA`q>}zgU)I9lrN?BPe&W7| zE{xprhp)_ii(1)h0%rbG;;w{O64!$G{7!I4n%#N5`^;<1T_vxA+p+LY_A(u%F&l#% z&HWrai`o+2h1*~^F%y8rf&LeH_{Ju3J8sYAu@e}6RTQO`XhRB*pA|q6ICkvV((G_c z{F_N?#@ghnm#E3>&485c$23AOxqYP`4ff%w%|=Jt!nM_kr_J`k>Wl%W~E^vvr$wtK6Jk31S*iwp?ozQKB!0q-JCI@b_a zhrG;lKEI&gsN{=p_uF#|*ESQ*1b>pG%#E*9L7URyPmK$K1?qrsigcwDe5a^q_MzgB zMZi-;9Ju!5B~zSBB-EALTD^gCGZUa3VDtay`)_bsN46#M2R>V~E!U4|0r*c_(?BCf I&GOp+0%if>zyJUM literal 0 HcmV?d00001 diff --git a/test/fixtures/point/noDefaultScales.js b/test/fixtures/point/noDefaultScales.js new file mode 100644 index 000000000..a28601eb3 --- /dev/null +++ b/test/fixtures/point/noDefaultScales.js @@ -0,0 +1,47 @@ +module.exports = { + config: { + type: 'bar', + data: { + datasets: [{ + data: [0, 5, 10, 15, 20, 22] + }] + }, + options: { + scales: { + x1: { + display: false, + labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], + }, + y1: { + display: true + } + }, + plugins: { + legend: false, + annotation: { + annotations: { + point1: { + type: 'point', + xValue: 'February', + yValue: 10, + backgroundColor: 'rgba(33, 101, 171, 0.5)', + borderColor: 'rgb(33, 101, 171)', + borderWidth: 1, + }, + point2: { + type: 'point', + xValue: 'May', + yValue: 5, + backgroundColor: 'rgba(33, 101, 171, 0.5)', + borderColor: 'rgb(33, 101, 171)', + borderWidth: 1 + } + } + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/point/noDefaultScales.png b/test/fixtures/point/noDefaultScales.png new file mode 100644 index 0000000000000000000000000000000000000000..a0715c6d31bf06844272ca9b66ba05b0fa1b3519 GIT binary patch literal 14013 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 Date: Thu, 10 Feb 2022 11:49:01 +0100 Subject: [PATCH 2/6] removes an empty line --- src/helpers/helpers.chart.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/helpers/helpers.chart.js b/src/helpers/helpers.chart.js index 0ede191b9..340042379 100644 --- a/src/helpers/helpers.chart.js +++ b/src/helpers/helpers.chart.js @@ -27,7 +27,6 @@ export function scaleValue(scale, value, fallback) { * @param {string} key - annotation plugin scale id option key * @returns {string} the unique scale defined in chartjs or the key passed as argument */ - export function retrieveScaleID(scales, options, key) { const scaleID = options[key]; if (scaleID) { From 115e4166cf8008a29f457d3ad39199ccd775d0cf Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 10 Feb 2022 11:58:39 +0100 Subject: [PATCH 3/6] fixes CC --- src/helpers/helpers.chart.js | 2 +- src/scale.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/helpers/helpers.chart.js b/src/helpers/helpers.chart.js index 340042379..9b333df73 100644 --- a/src/helpers/helpers.chart.js +++ b/src/helpers/helpers.chart.js @@ -29,7 +29,7 @@ export function scaleValue(scale, value, fallback) { */ export function retrieveScaleID(scales, options, key) { const scaleID = options[key]; - if (scaleID) { + if (scaleID || key === 'scaleID') { return scaleID; } const axis = key.charAt(0); diff --git a/src/scale.js b/src/scale.js index 65d524a29..d30c32c30 100644 --- a/src/scale.js +++ b/src/scale.js @@ -30,7 +30,7 @@ function scaleLimitDefined(scaleOptions, limit, suggestedLimit) { function verifyScaleIDs(annotation, scales) { for (const key of ['scaleID', 'xScaleID', 'yScaleID']) { - const scaleID = key === 'scaleID' ? annotation[key] : retrieveScaleID(scales, annotation, key); + const scaleID = retrieveScaleID(scales, annotation, key); if (scaleID && !scales[scaleID] && verifyProperties(annotation, key)) { console.warn(`No scale found with id '${scaleID}' for annotation '${annotation.id}'`); } From c1015244c16360e198c12221e923df7c6424874d Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 10 Feb 2022 13:36:20 +0100 Subject: [PATCH 4/6] updates documentation --- docs/guide/types/box.md | 8 ++++---- docs/guide/types/ellipse.md | 8 ++++---- docs/guide/types/label.md | 8 ++++---- docs/guide/types/line.md | 8 ++++---- docs/guide/types/point.md | 8 ++++---- docs/guide/types/polygon.md | 4 ++-- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/guide/types/box.md b/docs/guide/types/box.md index de9981cf8..cda7a19ad 100644 --- a/docs/guide/types/box.md +++ b/docs/guide/types/box.md @@ -70,10 +70,10 @@ The following options are available for box annotations. | [`shadowOffsetY`](#styling) | `number` | Yes | `0` | [`xMax`](#general) | `number` \| `string` | Yes | `undefined` | [`xMin`](#general) | `number` \| `string` | Yes | `undefined` -| [`xScaleID`](#general) | `string` | Yes | `'x'` +| [`xScaleID`](#general) | `string` | Yes | `undefined` | [`yMin`](#general) | `number` \| `string` | Yes | `undefined` | [`yMax`](#general) | `number` \| `string` | Yes | `undefined` -| [`yScaleID`](#general) | `string` | Yes | `'y'` +| [`yScaleID`](#general) | `string` | Yes | `undefined` ### General @@ -86,10 +86,10 @@ If one of the axes does not match an axis in the chart, the box will take the en | `drawTime` | See [drawTime](../options#draw-time). | `xMax` | Right edge of the box in units along the x axis. | `xMin` | Left edge of the box in units along the x axis. -| `xScaleID` | ID of the X scale to bind onto, default is 'x'. +| `xScaleID` | ID of the X scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'x'` axis. If more than one scale has been defined in the chart as `'x'` axis, the option is mandatory to select the right scale. | `yMax` | Bottom edge of the box in units along the y axis. | `yMin` | Top edge of the box in units along the y axis. -| `yScaleID` | ID of the Y scale to bind onto, default is 'y'. +| `yScaleID` | ID of the Y scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'y'` axis. If more than one scale has been defined in the chart as `'y'` axis, the option is mandatory to select the right scale. ### Styling diff --git a/docs/guide/types/ellipse.md b/docs/guide/types/ellipse.md index 737c86010..51c8b1f5c 100644 --- a/docs/guide/types/ellipse.md +++ b/docs/guide/types/ellipse.md @@ -67,10 +67,10 @@ The following options are available for ellipse annotations. | [`shadowOffsetY`](#styling) | `number` | Yes | `0` | [`xMax`](#general) | `number` \| `string` | Yes | `undefined` | [`xMin`](#general) | `number` \| `string` | Yes | `undefined` -| [`xScaleID`](#general) | `string` | Yes | `'x'` +| [`xScaleID`](#general) | `string` | Yes | `undefined` | [`yMax`](#general) | `number` \| `string` | Yes | `undefined` | [`yMin`](#general) | `number` \| `string` | Yes | `undefined` -| [`yScaleID`](#general) | `string` | Yes | `'y'` +| [`yScaleID`](#general) | `string` | Yes | `undefined` ### General @@ -84,10 +84,10 @@ If one of the axes does not match an axis in the chart, the ellipse will take th | `rotation` | Rotatation of the ellipse in degrees, default is 0. | `xMax` | Right edge of the ellipse in units along the x axis. | `xMin` | Left edge of the ellipse in units along the x axis. -| `xScaleID` | ID of the X scale to bind onto, default is 'x'. +| `xScaleID` | ID of the X scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'x'` axis. If more than one scale has been defined in the chart as `'x'` axis, the option is mandatory to select the right scale. | `yMax` | Bottom edge of the ellipse in units along the y axis. | `yMin` | Top edge of the ellipse in units along the y axis. -| `yScaleID` | ID of the Y scale to bind onto, default is 'y'. +| `yScaleID` | ID of the Y scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'y'` axis. If more than one scale has been defined in the chart as `'y'` axis, the option is mandatory to select the right scale. ### Styling diff --git a/docs/guide/types/label.md b/docs/guide/types/label.md index ee354140c..794543fa9 100644 --- a/docs/guide/types/label.md +++ b/docs/guide/types/label.md @@ -81,12 +81,12 @@ The following options are available for label annotations. | [`xAdjust`](#general) | `number` | Yes | `0` | [`xMax`](#general) | `number` \| `string` | Yes | `undefined` | [`xMin`](#general) | `number` \| `string` | Yes | `undefined` -| [`xScaleID`](#general) | `string` | Yes | `'x'` +| [`xScaleID`](#general) | `string` | Yes | `undefined` | [`xValue`](#general) | `number` \| `string` | Yes | `undefined` | [`yAdjust`](#general) | `number` | Yes | `0` | [`yMax`](#general) | `number` \| `string` | Yes | `undefined` | [`yMin`](#general) | `number` \| `string` | Yes | `undefined` -| [`yScaleID`](#general) | `string` | Yes | `'y'` +| [`yScaleID`](#general) | `string` | Yes | `undefined` | [`yValue`](#general) | `number` \| `string` | Yes | `undefined` ### General @@ -108,12 +108,12 @@ The 4 coordinates, xMin, xMax, yMin, yMax are optional. If not specified, the bo | `xAdjust` | Adjustment along x-axis (left-right) of label relative to computed position. Negative values move the label left, positive right. | `xMax` | Right edge of the box in units along the x axis. | `xMin` | Left edge of the box in units along the x axis. -| `xScaleID` | ID of the X scale to bind onto, default is 'x'. +| `xScaleID` | ID of the X scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'x'` axis. If more than one scale has been defined in the chart as `'x'` axis, the option is mandatory to select the right scale. | `xValue` | X coordinate of the point in units along the x axis. | `yAdjust` | Adjustment along y-axis (top-bottom) of label relative to computed position. Negative values move the label up, positive down. | `yMax` | Bottom edge of the box in units along the y axis. | `yMin` | Top edge of the box in units along the y axis. -| `yScaleID` | ID of the Y scale to bind onto, default is 'y'. +| `yScaleID` | ID of the Y scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'y'` axis. If more than one scale has been defined in the chart as `'y'` axis, the option is mandatory to select the right scale. | `yValue` | Y coordinate of the point in units along the y axis. ### Styling diff --git a/docs/guide/types/line.md b/docs/guide/types/line.md index e811822c2..b375e0064 100644 --- a/docs/guide/types/line.md +++ b/docs/guide/types/line.md @@ -68,10 +68,10 @@ The following options are available for line annotations. All of these options c | [`value`](#positioning) | `number` | Yes | `undefined` | [`xMax`](#general) | `number` \| `string` | Yes | `undefined` | [`xMin`](#general) | `number` \| `string` | Yes | `undefined` -| [`xScaleID`](#positioning) | `string` | Yes | `'x'` +| [`xScaleID`](#positioning) | `string` | Yes | `undefined` | [`yMax`](#general) | `number` \| `string` | Yes | `undefined` | [`yMin`](#general) | `number` \| `string` | Yes | `undefined` -| [`yScaleID`](#positioning) | `string` | Yes | `'y'` +| [`yScaleID`](#positioning) | `string` | Yes | `undefined` ### General @@ -103,10 +103,10 @@ If `scaleID` is unset, then `xScaleID` and `yScaleID` are used to draw a line fr | `value` | End one of the line when a single scale is specified. | `xMax` | X coordinate of end two of the line in units along the x axis. | `xMin` | X coordinate of end one of the line in units along the x axis. -| `xScaleID` | ID of the X scale to bind onto, default is 'x'. +| `xScaleID` | ID of the X scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'x'` axis. If more than one scale has been defined in the chart as `'x'` axis, the option is mandatory to select the right scale. | `yMax` | Y coordinate of end two of the line in units along the y axis. | `yMin` | Y coordinate of end one of the line in units along the y axis. -| `yScaleID` | ID of the Y scale to bind onto, default is 'y'. +| `yScaleID` | ID of the Y scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'y'` axis. If more than one scale has been defined in the chart as `'y'` axis, the option is mandatory to select the right scale. ### Styling diff --git a/docs/guide/types/point.md b/docs/guide/types/point.md index 4c0c602f6..60bbda283 100644 --- a/docs/guide/types/point.md +++ b/docs/guide/types/point.md @@ -68,12 +68,12 @@ The following options are available for point annotations. | [`xAdjust`](#general) | `number` | Yes | `0` | [`xMax`](#general) | `number` \| `string` | Yes | `undefined` | [`xMin`](#general) | `number` \| `string` | Yes | `undefined` -| [`xScaleID`](#general) | `string` | Yes | `'x'` +| [`xScaleID`](#general) | `string` | Yes | `undefined` | [`xValue`](#general) | `number` \| `string` | Yes | `undefined` | [`yAdjust`](#general) | `number` | Yes | `0` | [`yMax`](#general) | `number` \| `string` | Yes | `undefined` | [`yMin`](#general) | `number` \| `string` | Yes | `undefined` -| [`yScaleID`](#general) | `string` | Yes | `'y'` +| [`yScaleID`](#general) | `string` | Yes | `undefined` | [`yValue`](#general) | `number` \| `string` | Yes | `undefined` ### General @@ -92,12 +92,12 @@ The 4 coordinates, xMin, xMax, yMin, yMax are optional. If not specified, the bo | `xAdjust` | Adjustment along x-axis (left-right) of point relative to computed position. Negative values move the point left, positive right. | `xMax` | Right edge of the box in units along the x axis. | `xMin` | Left edge of the box in units along the x axis. -| `xScaleID` | ID of the X scale to bind onto, default is 'x'. +| `xScaleID` | ID of the X scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'x'` axis. If more than one scale has been defined in the chart as `'x'` axis, the option is mandatory to select the right scale. | `xValue` | X coordinate of the point in units along the x axis. | `yAdjust` | Adjustment along y-axis (top-bottom) of point relative to computed position. Negative values move the point up, positive down. | `yMax` | Bottom edge of the box in units along the y axis. | `yMin` | Top edge of the box in units along the y axis. -| `yScaleID` | ID of the Y scale to bind onto, default is 'y'. +| `yScaleID` | ID of the Y scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'y'` axis. If more than one scale has been defined in the chart as `'y'` axis, the option is mandatory to select the right scale. | `yValue` | Y coordinate of the point in units along the y axis. ### Styling diff --git a/docs/guide/types/polygon.md b/docs/guide/types/polygon.md index adabb37c9..0a866b0ca 100644 --- a/docs/guide/types/polygon.md +++ b/docs/guide/types/polygon.md @@ -98,12 +98,12 @@ The 4 coordinates, xMin, xMax, yMin, yMax are optional. If not specified, the bo | `xAdjust` | Adjustment along x-axis (left-right) of polygon relative to computed position. Negative values move the polygon left, positive right. | `xMax` | Right edge of the box in units along the x axis. | `xMin` | Left edge of the box in units along the x axis. -| `xScaleID` | ID of the X scale to bind onto, default is 'x'. +| `xScaleID` | ID of the X scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'x'` axis. If more than one scale has been defined in the chart as `'x'` axis, the option is mandatory to select the right scale. | `xValue` | X coordinate of the polygon in units along the x axis. | `yAdjust` | Adjustment along y-axis (top-bottom) of polygon relative to computed position. Negative values move the polygon up, positive down. | `yMax` | Bottom edge of the box in units along the y axis. | `yMin` | Top edge of the box in units along the y axis. -| `yScaleID` | ID of the Y scale to bind onto, default is 'y'. +| `yScaleID` | ID of the Y scale to bind onto. If missing, the plugin will try to use the scale of the chart, configured as `'y'` axis. If more than one scale has been defined in the chart as `'y'` axis, the option is mandatory to select the right scale. | `yValue` | Y coordinate of the polygon in units along the y axis. ### Styling From b37c4f42e91c073318a44f1e67cfaf1e9705c96f Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 17 Mar 2022 14:24:34 +0100 Subject: [PATCH 5/6] applies review --- src/helpers/helpers.chart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/helpers.chart.js b/src/helpers/helpers.chart.js index 9b333df73..723745d3c 100644 --- a/src/helpers/helpers.chart.js +++ b/src/helpers/helpers.chart.js @@ -34,7 +34,7 @@ export function retrieveScaleID(scales, options, key) { } const axis = key.charAt(0); const axes = Object.values(scales).filter((scale) => scale.axis && scale.axis === axis); - if (axes.length === 1) { + if (axes.length) { return axes[0].id; } return axis; From 9a4d7d89005ae30052f617c5449cfa0f80bca236 Mon Sep 17 00:00:00 2001 From: stockiNail Date: Mon, 4 Apr 2022 08:51:17 +0200 Subject: [PATCH 6/6] adds note about breaking changes to migration guide --- docs/guide/migrationV2.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/guide/migrationV2.md b/docs/guide/migrationV2.md index 5281c831a..6f304122a 100644 --- a/docs/guide/migrationV2.md +++ b/docs/guide/migrationV2.md @@ -1 +1,10 @@ # 2.x Migration guide + +`chartjs-plugin-annotation` plugin version 2 introduces a number of breaking changes. In order to improve performance, offer new features, and improve maintainability, it was necessary to break backwards compatibility, but we aimed to do so only when worth the benefit. + +## Options + +A number of changes were made to the configuration options passed to the plugin configuration. Those changes are documented below. + + * `xScaleID` option default has been changed, now set to `undefined`. If the option is missing, the plugin will try to use the first scale of the chart, configured as `'x'` axis. If more than one scale has been defined in the chart as `'x'` axis, the option is mandatory to select the right scale. + * `yScaleID` option default has been changed, now set to `undefined`. If the option is missing, the plugin will try to use the first scale of the chart, configured as `'y'` axis. If more than one scale has been defined in the chart as `'y'` axis, the option is mandatory to select the right scale.