From 27e8ab051998494a5ea7878526147ea283b6d605 Mon Sep 17 00:00:00 2001 From: "eko.zhan" Date: Fri, 24 Mar 2017 12:58:27 +0800 Subject: [PATCH] - init --- MIT-License.txt | 21 +++++ README.md | 23 +++++ example/checkbox.html | 57 +++++++++++++ js/attrchange.js | 124 +++++++++++++++++++++++++++ js/attrchange_ext.js | 97 +++++++++++++++++++++ js/jquery.kbase.checkbox.css | 56 ++++++++++++ js/jquery.kbase.checkbox.js | 159 +++++++++++++++++++++++++++++++++++ js/radio_checkbox.png | Bin 0 -> 61920 bytes 8 files changed, 537 insertions(+) create mode 100644 MIT-License.txt create mode 100644 README.md create mode 100644 example/checkbox.html create mode 100644 js/attrchange.js create mode 100644 js/attrchange_ext.js create mode 100644 js/jquery.kbase.checkbox.css create mode 100644 js/jquery.kbase.checkbox.js create mode 100644 js/radio_checkbox.png diff --git a/MIT-License.txt b/MIT-License.txt new file mode 100644 index 0000000..7b23031 --- /dev/null +++ b/MIT-License.txt @@ -0,0 +1,21 @@ +Copyright 2013 Selvakumar Arumugam +http://meetselva.github.io/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8533940 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +Checkbox/Radio 插件 +================================================= + 用于自定义checkbox/radio样式,支持IE8+,chrome,firefox + +使用方法 +------------------------------------------------- +该插件依赖于 [jquery](http://jquery.com/),[attrchange](http://meetselva.github.io/),attrchange插件无需独立引入,只引入jquery.kbase.checkbox.js即可 + +``` + +``` + +初始化 +-------------------------------------------------- + Dom加载完毕后调用 $(selector).kbsElem(); 控件只会初始化type=checkbox 和 type=radio 的元素 +``` +$(':checkbox').kbsElem(); +$(':radio').kbsElem(); +$('#btnRadio').kbsElem(); //不会做初始化 +``` +Demo +-------------------------------------------------- +[example/checkbox.html]() \ No newline at end of file diff --git a/example/checkbox.html b/example/checkbox.html new file mode 100644 index 0000000..fcaefec --- /dev/null +++ b/example/checkbox.html @@ -0,0 +1,57 @@ + + + + + checkbox-demo + + + + + + 苹果 + 葡萄 + + + +
+ 苹果 + + + +
+ 全选/全不选 +
+
+ + + + + \ No newline at end of file diff --git a/js/attrchange.js b/js/attrchange.js new file mode 100644 index 0000000..00878d3 --- /dev/null +++ b/js/attrchange.js @@ -0,0 +1,124 @@ +/* +A simple jQuery function that can add listeners on attribute change. +http://meetselva.github.io/attrchange/ + +About License: +Copyright (C) 2013-2014 Selvakumar Arumugam +You may use attrchange plugin under the terms of the MIT Licese. +https://github.com/meetselva/attrchange/blob/master/MIT-License.txt + */ +(function($) { + function isDOMAttrModifiedSupported() { + var p = document.createElement('p'); + var flag = false; + + if (p.addEventListener) { + p.addEventListener('DOMAttrModified', function() { + flag = true + }, false); + } else if (p.attachEvent) { + p.attachEvent('onDOMAttrModified', function() { + flag = true + }); + } else { return false; } + p.setAttribute('id', 'target'); + return flag; + } + + function checkAttributes(chkAttr, e) { + if (chkAttr) { + var attributes = this.data('attr-old-value'); + + if (e.attributeName.indexOf('style') >= 0) { + if (!attributes['style']) + attributes['style'] = {}; //initialize + var keys = e.attributeName.split('.'); + e.attributeName = keys[0]; + e.oldValue = attributes['style'][keys[1]]; //old value + e.newValue = keys[1] + ':' + + this.prop("style")[$.camelCase(keys[1])]; //new value + attributes['style'][keys[1]] = e.newValue; + } else { + e.oldValue = attributes[e.attributeName]; + e.newValue = this.attr(e.attributeName); + attributes[e.attributeName] = e.newValue; + } + + this.data('attr-old-value', attributes); //update the old value object + } + } + + //initialize Mutation Observer + var MutationObserver = window.MutationObserver + || window.WebKitMutationObserver; + + $.fn.attrchange = function(a, b) { + if (typeof a == 'object') {//core + var cfg = { + trackValues : false, + callback : $.noop + }; + //backward compatibility + if (typeof a === "function") { cfg.callback = a; } else { $.extend(cfg, a); } + + if (cfg.trackValues) { //get attributes old value + this.each(function(i, el) { + var attributes = {}; + for ( var attr, i = 0, attrs = el.attributes, l = attrs.length; i < l; i++) { + attr = attrs.item(i); + attributes[attr.nodeName] = attr.value; + } + $(this).data('attr-old-value', attributes); + }); + } + + if (MutationObserver) { //Modern Browsers supporting MutationObserver + var mOptions = { + subtree : false, + attributes : true, + attributeOldValue : cfg.trackValues + }; + var observer = new MutationObserver(function(mutations) { + mutations.forEach(function(e) { + var _this = e.target; + //get new value if trackValues is true + if (cfg.trackValues) { + e.newValue = $(_this).attr(e.attributeName); + } + if ($(_this).data('attrchange-status') === 'connected') { //execute if connected + cfg.callback.call(_this, e); + } + }); + }); + + return this.data('attrchange-method', 'Mutation Observer').data('attrchange-status', 'connected') + .data('attrchange-obs', observer).each(function() { + observer.observe(this, mOptions); + }); + } else if (isDOMAttrModifiedSupported()) { //Opera + //Good old Mutation Events + return this.data('attrchange-method', 'DOMAttrModified').data('attrchange-status', 'connected').on('DOMAttrModified', function(event) { + if (event.originalEvent) { event = event.originalEvent; }//jQuery normalization is not required + event.attributeName = event.attrName; //property names to be consistent with MutationObserver + event.oldValue = event.prevValue; //property names to be consistent with MutationObserver + if ($(this).data('attrchange-status') === 'connected') { //disconnected logically + cfg.callback.call(this, event); + } + }); + } else if ('onpropertychange' in document.body) { //works only in IE + return this.data('attrchange-method', 'propertychange').data('attrchange-status', 'connected').on('propertychange', function(e) { + e.attributeName = window.event.propertyName; + //to set the attr old value + checkAttributes.call($(this), cfg.trackValues, e); + if ($(this).data('attrchange-status') === 'connected') { //disconnected logically + cfg.callback.call(this, e); + } + }); + } + return this; + } else if (typeof a == 'string' && $.fn.attrchange.hasOwnProperty('extensions') && + $.fn.attrchange['extensions'].hasOwnProperty(a)) { //extensions/options + return $.fn.attrchange['extensions'][a].call(this, b); + } + } +})(jQuery); \ No newline at end of file diff --git a/js/attrchange_ext.js b/js/attrchange_ext.js new file mode 100644 index 0000000..d761892 --- /dev/null +++ b/js/attrchange_ext.js @@ -0,0 +1,97 @@ +/* +An extension for attrchange jQuery plugin +http://meetselva.github.io/attrchange/ + +About License: +Copyright (C) 2013-2014 Selvakumar Arumugam +You may use attrchange ext plugin under the terms of the MIT Licese. +https://github.com/meetselva/attrchange/blob/master/MIT-License.txt + */ +$.fn.attrchange.extensions = { /*attrchange option/extension*/ + disconnect: function (o) { + if (typeof o !== 'undefined' && o.isPhysicalDisconnect) { + return this.each(function() { + var attrchangeMethod = $(this).data('attrchange-method'); + if (attrchangeMethod == 'propertychange' || attrchangeMethod == 'DOMAttrModified') { + $(this).off(attrchangeMethod); + } else if (attrchangeMethod == 'Mutation Observer') { + $(this).data('attrchange-obs').disconnect(); + } else if (attrchangeMethod == 'polling') { + clearInterval($(this).data('attrchange-polling-timer')); + } + }).removeData(['attrchange-method', 'attrchange-status']); + } else { //logical disconnect + return this.data('attrchange-status', 'disconnected'); //set a flag that prevents triggering callback onattrchange + } + }, + remove: function (o) { + return $.fn.attrchange.extensions['disconnect'].call(this, {isPhysicalDisconnect: true}); + }, + getProperties: function (o) { + var attrchangeMethod = $(this).data('attrchange-method'); + var pollInterval = $(this).data('attrchange-pollInterval'); + return { + method: attrchangeMethod, + isPolling: (attrchangeMethod == 'polling'), + pollingInterval: (typeof pollInterval === 'undefined')?0:parseInt(pollInterval, 10), + status: (typeof attrchangeMethod === 'undefined')?'removed': $(this).data('attrchange-status') + } + }, + reconnect: function (o) {//reconnect possible only when there is a logical disconnect + return this.data('attrchange-status', 'connected'); + }, + polling: function (o) { + if (o.hasOwnProperty('isComputedStyle') && o.isComputedStyle == 'true') { /* extensive and slow - polling to check on computed style properties */ + return this.each(function(i, _this) { + if (!o.hasOwnProperty('properties') || + Object.prototype.toString.call(o.properties) !== '[object Array]' || + o.properties.length == 0) { return false; } //return if no properties found + var attributes = {}; //store computed properties + for (var i = 0; i < o.properties.length; i++) { + attributes[o.properties[i]] = $(this).css(o.properties[i]); + } + var _this = this; + $(this).data('attrchange-polling-timer', setInterval(function () { + var changes = {}, hasChanges = false; // attrName: { oldValue: xxx, newValue: yyy} + for (var comuptedVal, i = 0; i < o.properties.length; i++){ + comuptedVal = $(_this).css(o.properties[i]); + if (attributes[o.properties[i]] !== comuptedVal) { + hasChanges = true; + changes[o.properties[i]] = {oldValue: attributes[o.properties[i]], newValue: comuptedVal}; + attributes[o.properties[i]] = comuptedVal //add the attribute to the orig + } + } + if (hasChanges && $(_this).data('attrchange-status') === 'connected') { //disconnected logically + o.callback.call(_this, changes); + } + }, (o.pollInterval)?o.pollInterval: 1000)).data('attrchange-method', 'polling').data('attrchange-pollInterval', o.pollInterval).data('attrchange-status', 'connected'); + }); + } else { + return this.each(function(i, _this) { /* this one is programmatic polling */ + var attributes = {}; + for (var attr, i=0, attrs=_this.attributes, l=attrs.length; ix4T5&C?2o`K8 zU>8IX>;)8YS1hQ23Mi<6EK)@Hz3(JL3E(^v^8M%ciY|ai#0s0gWrYM=lSE*-;2Mm9@zSOUiRtT;llD*Y~O>$pWR{)K6F?t)}Ujl z=XLIUWm!d8`ITk8Tb$;3EqeDUOPBUY#bN`#9(_*#u6M6#Ts(hG>VWgzFIT)Uvd6Gk z%U0v-e{kT1j~)2$Sp3EV8?}FT_&*z*f5@Q+J=Ed6cdq}uL5I=*{Qi;SCwFsh`R7Hq zo_C4$Tk~(8dgZ!7%YXg#&oBO*y5ylH8$KC0`+%VbH9GFD#gAPTv%3s$Q}ku?J3DoF z=fi13>mAx*!5%FRTs-rwZhO8Pi>=sw;DEsu&$rvK+jC{Hda>T0w?3xP`wKVSFs1Wx z7sOiJ64ssmIi7|9b3-^M-Xfx!#PoVvme(-?H@{GbZjf^ukw_ zQ|k?#wr8y09bHEp(Ef_p&8K0?#OuqNiBl`coV!`)EfB#mG7uTUJ*h#h#=?B!oyzG%_h-Fv^k z+w*;=cOQ3g?CbMmSI%E|sXA|;M=omc>7aGD4zxD3KWfaQoj+*P?8pZD?)&SpiASeN zKipcpNnKdB;MT!^@Y{{^2Cax){b2hCCd?Rn!(Ug&d-a>x<&GsY_i*K2YnHUy`2O%A zf8BAyobR<4E;;$oTUK`c*W}JEJH9{gwJvx0M}K(l_l99+lzNg8V@70gR{6~hJ_`I|Ces3N!e#ZU}z1eK)j3)Ksd-?76J7z|k1KquT z9C~DfM-RKtIsDuiMPKgm%JaJ)@yJ0BES>_OCtN{D@oLd!&3$g?7NDL+^X6 z`h~wUGoLtmZKmSfW z*{rMC@6e_*#>AJ`Kc?QTLl6F?{$)2F_*ReWM~pbN>zQ4>r;q)m)ys{h)W2Y#8*Y@} z`bW#VpYHVXv4a||duKqR=!Fqo!|})ccJxt4k2&_Tf9!wo<#%^DX8#ZW{o`2;jy`sT za@xM9b?-2*L&4+cJYM|Sfu#?fdEBxQJwN>J$NDc09p7T)U6V!}Frw4H|NQXnA157B z^zJ{uKXaeQj_LCFJ&jJ+Q|%V*@x;T5`@kd5oc-~*G5@Xq%s-1BzUZ``kM!$Yc+Sn^ z4%YfUcLJ^wTEfe+4=zEGMz(Cz*M?k_v9>xqAyc z*T)$XKk3rH%blHPpMCk*H!lC{`t`|%FWxjfeB`DMW6w=adhhVtk8b>)l3Ll-o!jU9 z-Itx*{r--Li(g##%bET5{IhAl!fVbv$18s(JwAO`di3I}Ki+Ns_g+}A!v5-^(?2=- zlZKyMQ?PqMyMh-Veka=>p@??@pa6m*YSDXD6&ar`Ol=FB^Vo@XLe0?DebtNBoat z|LFP0>}Io$Y}9P-DHW$&+oz)MtbRRuPhIx-LhbEw?~Hr<=L@hYE8)_5AO*v)aCU-LrpoY(1*! zhnK$HcDeJv6>GYFfAy>%Mn5&`skc^*SWp%H<_u}`8>peW^;hW!h@{N}B+rH6i@Z7-<4BmUgm_JWhKl86U*G^wJ z@b|_m&)V~f-QL`7(Qea*9Wm^s-MjDJe2)kAcw%pT&)fHWeXqj(iVt=7+o$1$&HLP4 zHlxY!P1hyWZ@QiQ;G9E0sz3VBi<+*NW*v9tQF9NvUOQ#pRj>Bx z*KPb&J-YNr{xWLv(8KBf<)*60)qmeJRTXaJUw{ziPofbXSt7Ef+f4_0m z@J_)SkKO***)L3*e0rOIFCKmVy?qy=g?-;s_vzH-q=9!G{_odXt?GEb zKli)wv%k9fs{;F;hwgc3Y?p?m_q}}57t*BTCv{4nbkf}oe;l~D=SNNNzWJjyKek#| zzG~i~J%*n-XY9*eCU)Mx@tK8BpETg&!!8~$xx=&$7yVbApWe81U8{YsZ+z{v5zlv? z{QOH_P9AXK$^|W_2d_77b?Z4z`nQ%Z?J}igK-bvSApxry}o)2gCn)ttqUP~StzqjPP^v%g6T~|MbMQ z&xey2e}BPQmw$fk>VZAK{`$MqCw=tmvJT50U)F2&3HP9Y62)M~$(63>rP;(wXP~HR0JwZ+vy! z*K?L6w*RAgL*>Bf>d*=~}rcKy8f~b15f&_XnNoA1!H?Y()Q75%YV9U?C55f zH9PfDOYXdM#nj&aYq=&d@7PIaOlUi??Wu!%|Fy8ga~GE_ zORbst>jiBlR{XEyvQy?P|Id*1SIzjm{EM|;w7&G=fzy`1_e;}By^j0#$jQe}S-rO3 zAHO!~-{7}1zqxeKodcfR@W$7FE!}(l0ZWIxyzzz9jGhbDUNPf}*>7KX!1Dd~xp~aS zdp7;&=7pb~I_uQWTZOG|zjJi+=1m(OG41z~Pwrm$)Qe9YJo}@;=WiOgto+#}^Z)w( z&ogFs-SFj#eb?POd-}wI<5u-q{_MEtir#Pae)FlH3~amd$qf@enRngt$;+qAe}7u@ z2aey+eq-lVbJi!{f9lgtYl@d#yKzI|nj2UBdF*EotFhRE7NzHQt?1hE%%Wsj&(`sh zvP7!&fS$c^Lu0Wv?FRIYC%dOAS|n24N_(|!x%~C%EnAe9v~78T-cjn<+e=+p+F?+i z)H#FBIyX6}d(tjx*{--jn*l`(&@)vLZ!w@}k6z_P1KPICj9bKiiys%ZY>|0OMfbKX z9r1-Nx_0c`!Yk{OYN5B*3zCu|w=nJ2vaXw^a&ikrlC?rfE|k>**)GzwB1vjd^-s&< z2K-l>J|*d*E`C_`b^O1!Ew8Mo=v`D;*uQ`O*8SDiWqrC8%C>D6N=l)k6!4CM@`1f7 z;sXkLmA9%KBs-3uDo^$)?Ojn?)~kgWH=Zc#ThX>H-EBs-#$Gu0xn4wrh24$@}1>;PTt`&RFtN-EY3EMAbzvc zuS*Rm-O0zqZz?~QQH9DCYJ>h2d3{pxin2cEmX-A=uGF$E(G$Uw(5e>4cZ?@Xdx?HGSzsH6RG`K6 zctIkbh!<$KVoAChFOkw#<{`KJ_;y44Wy!um6BxR3>z9-z8Gf^36(!=ylC&Au3)GZp z6v(m}FR+r5USO+9JE=>2n`&miXsf}t`=U;L@Q!=Mdu;U{@hm0cSrU?EXeEh)q*bC9 zXp)sKi0hhCAe(AZji)t5O(n8lv4df@`>GD5<>=GEt@I3S%h;ZCQde*L)9f#LlxA#5 z?|7f`l-QbWTW0s>W}~y&rijmEws=uIDXdR%QYdh$q)p*AKix8|&7Z9LSm_RyGm;1@ z$KUGXJO7UUSEhRXo%&Y}m3i0B2PrR0SM-nfNjcrnkZ60ea@=h{Sp5sy6bgIYqxAn^ zDazyhc5xvh?W_M!7GjGgC$Eh6>Xs@gF3c)%_6O0{u5v}U-CfxoyZvr#v&Fh(t$~Ae z6PvbtTb;;kS~uQp+nn;!PgkQB_IW7xVY`I2QCs_#geBFni{tynTG$?y!_ z(`;FCRNoDJS+}*&4?^2kR6X|qRv37mV%nZ9X_~J1lHxOl>4f~qu)N#@c&=-xo@V)m z<0*=(cy4F~vV!B)}x@P)jpcp}DX_m)Xkb3|utfASqta-j2 zx{l-q9Gp7ix|(W+O6~!4%hfesa}`Q>+ejuVEVW%)TDL6Hqrlhx32HBWr0tg5b~ zpa7<-DS^US`u8@gSmB{fL$O^m)K~;bm5soWZO&t~OH*>oK(Q?+FbvN}bq&+-HQNk* z!%#d=GXm4HbI-u`gFw+;*|H@m^j#;g0!s@*&2=2bh@i@f9kKyTQw}^^)w-Ch#y^2 z0(ORKD7unc4@@bLoj~yvJ}&9Hr+6ygt(g**75kcdGnul7yd=xkec3ito*@h@U3C;R z$*?ph=OdUrr_1@OJDP$bJFaf&j_YWe%NEnr+%m8fTna@;9~Iydwx4ZaQVq@2LPznn z+^4f8)Lyc9ctb%JLL((6!r*=4y`!3rEr;%wz?3vJnye7r3oe-A@%D1L5(V(X5N?Xwgm zB;wRPAORJB#guH5P37c1ooyeL6B@`CKz*@d>|xmsW$c=4$+mVDtZySotzd04jQA}*2s$<YD>sHUTPvKxlBsq*BOuVI&s zP?mkXRXO)6IBZ7O4@}=j4!&lZzU^R1RLA#RRk3p0L?=)UgMFu(wrQBUYWkt@ZLp3Q z8C}V(%EJ8GlFMnJ!A^VQsY!Q+WNSJv@z3@OxDJ2ebsMe|itl~g~s9(Z2h+B%N8 z;R^99sxM1E1`$WY3PLaUUhsTP);Q8|sk}g8EBJ~jhe{wkJv1x#UJ%BYkVoNxZH{;> zvZgAI!mKc=QkZ)?`!X}dwZ;&$3!Fg0bJsNtj3nuSs^vZ#Q5;RtvEo=@RS)pB(J6~V zo(RUnW5~H1eRi>-;SpjzY+MCPQ58ZMnczt!2F!iDV@1##g$K5Lj#JJwHnbYB7`la* zmU}M*_{F}#foS9D;w=WU?3wsH5@%khL^xOiUFV@CTO3Rw3W0H#@l`{G_%DnS_60-+ zhKE0+D7dL?WW$ja$HKH)a=^3X6k_1Igq?iECH~YsRm4g7x|XU1IPZRLixdPROp#UF zl0w%Y_R@Vn&<$J!i~VHg_SS;{FH`ay+)6tnU^Oh6RlsNS*lOO{H|ww9|@I zP=Z$X&oPAjIEwOx=% z%0@vt4$6>7F!Mxi%eRxE3Q|Z)meVCxO3!T%b~1D-En})v z1tqGSVCa-lkgx?hZKgCSVWm?EBT++HtDyCXc&bDUEo5DbLu1wwN&@`6_61@jlcrKq zq7@`%vU6xiyuePyrGkVeV>!)4(ujap?O4`ETGrx{ge>%ujE0bBD2cO-il&s9@pRIX zk~NgIX^>w)u?v($I=f|*R2se3WJ^s-@uZTj;n3i7x|I-mXD8B?%16L07o^Ozl#=v> zQX;2nI<#T4fXM{QC|Q+5TeYOuHdZ3RLKcv8$t)uqU6Q1Nq>)Usj_iJ=rn8PKvXw|B zO9~{3zbbd5oo3(1)igS(*lH@bgRx@`iCdTn#b#(Qq1qKloRn4xuy28k1~YVtRS-82 zJ*lsh3AU^vs2VO~!m>@Y&nQU6Nup&epRL487#e{jQxa0i?KtmPAc?e8BHNb6DT6lG zstrk`WmYSlE|4rMBM`H|vdQb)an>Mdv5fJW&YIINZc5k?%x6YJYVRmW#sOU7DJC3G zR@so++KtJyjfJvG(2I0t%Wz66@nk_Vp5zyX3f7+6ZQb!Qa-3UMGM>VQq^l0F+M0Dr zNg0;H9xt(MVMByoYr2WO))PiLozjzLP5qEmGMU1CMb;@Rqt_e-U(CZRpt&(yU%Ufb5?F1I8hC`=S&KOxIk*(t0RGOz+I%RN?(j}NC zd?tgnlufH3fe_f}avJ=ZM=HsEfc5Q5J{*Gs)~jel#J2AX)aZF1kMHQ;KLxaju zG|liV%K?8je2-BASG5dTc8ODPwWE$=nBW{_hQOVCum%zWZs^D%c@`^F{M-?D|+!7j)V+T#XDE$*bJqN99~Z=m%)8k#Z4F1aJ?sNa~Bc6-Zz1U^X*~q7hIUwh>4G zi(;j1LO3EyC9r^>-H0m<7y{C#xt`{e2W2j@9QX*yS4m-z7l>~&8knAwf8(^}m<@RPO=R#O* z2F%^_guZx|DS3qYzJR~T6Xg!ssz&i7OR~V*P!?es1R$uoiUYhW6epT=RSCb>CfmuL z6r%vC0R~H+$eeQ!jGZ(UJd^HP2mMCLiK$C3Cvm6OM21bcE7vM-zJf!S(m4%iq z0Rh+q;3zNHXv96O@(~ipng$?=bODmUHkk})A6eZXqV8%EDYL)=PX_82x(hrA!b28S z2I-I^S}Bd(xuvD8Ow};ILhD=ySX>S@@)CgQR>U>Z0ef9tHpzy0nU!`;gVTiE z7VBoq5%opa0yY3pENNXaiY+5;U{Q~3n;%3y)pQfX0vZZa!xYkWh*V)Ns33|!T7OB%);i;S`xLPG-6Cw3peM~C;HzwLB zw&eKa9LP3UoXqe$IBRhdLH$ig3Q9z8l>{=V899AcM9jtYZQ=rv5VFZ6MDzh+KjZV_p@n!bBBuyi9no7Q(GXw?WCf;HM!GdR*~ml6hNa5}HYGEP z?<*GbV1twVjvC$A@P&wHNK8V3Li@ARWNAL< zoC+V$g`pVH-Z`qm$01|d!Y9Q0@bIUg1@eRvY5Ry;mkAwp7ZLfAPiVST12Y}n-E?Y{1INoTpS&iCKNphui3XFBwjMo z#a;j-9JTO?v)JE9NcYS8o?MH~XVV8KboOGL2z%aJ7PF8np9lx}E~ z5yJ#Wldd4cgo4B>=p4v}tTNV{SQxTO=<1P2VOXIEuuIpmLBhH1u z7k5kx6d4Z&HYG8=tJp*cL`(2^B97vlFm-U@CA0F0V6Nc;ljs$c6*XeK=0VBjei6`c{@ zDkv3{9yrG&e8|E?TWM%0U|E8Y0f9k8Hze|fXXr^P(O}dy3M`X_(FA`L+9so5Cpcks z6+$t37tz)UZc@kz0C&4`6mT8i(BV3$P&%E6UQh_yLafH|4i8>vo$Oh{V!}Owr4b>m zp0QG)rr4&-*<(1FxWtx(|LzMC9|j`=jkIzUr~q&#IozxaHU&ojXB=OI>^kJWh$jiw z)+9o6b}e?~YauLXzT~O!!C0fv5?maGV?hmNJK|}dj;HlR3580DxGM4&LjP;WlNucGEq5G!^%k57g<;r77sQD%!I(mt-_lJA{g0bAj#sfYy_=C<`)HT zIS8*i9Y|52Zj0ao0x4|pT^PuM3o215N(2U;QS*Ty8-ZX51lbm0{4Nb7$kyVNap1qy zd?0w@uH;GtnlcgeE(n`}Lg*`SpYep%+)>z0S1mL^VmbEk*kRx2HXMID5C}WQfNBIS zw~zmK1A!!<>9SxX@7jzou2>UJAjPctKu`cd7f8)|ps`*Ay3)=bO$-D)4L_9Z40Ecn z9*KcMGF=80A1=7it_|d1za2QEQEG^G`e=fu2x=qP^NJbPeEH$(Q9a;zHdz3mq?(%% zF%Xq8k_UU!jRMvE-J>}W&s2JDU*`(cDl}MiOuDihtx_jw})w!iw-{HD5I`kSMeZ z0#(!|)ZC1?#4mV&qBzDSl~Hro&qWjYgSUor2{KpXEdnwPj0F6Sm#msr%@q;^fLtNm zWR{PDyxd{$&X%9lct8XZhOU6~BNS2XbRbL!DH`HmB7EH1n#%}Rl%UP_P121~Sl3%- z3vtrWBIGg2+!Z9>dzwO z<^vDad`1ieylC)j6gcJM`t4vw0EA@D;A3cE&1IBv*riZ%ZJ<^)0%Em!uT`6o7|4VE z5Kw(XnQI>B+KvV?bcd6T$S(pHWT!KN8$gsDf;p*PAk}<}I2JiTo%$L;Y0i_H4-BWVCO9R3F<1BKFkcznI z18LjJ$P%kYnXdwugR$}eqN)ufOs#G6Q0Ngbb{?8teIQniz%PJH@8a9!p^()FB3=_k zm(*GkiOP8hyZS%`HI4*q>&b#dl*dV1Z6KE-LI^V;;*4)UIt~*g!@x*?5nk z;*qJU`9Na#>(GZ~;kgHSc>dLAB)kzzgOCc@Dhg?5^QPUwK-dqC5gGxIpQ-VqiQVr~ zC#$%oMWmg_*})i0Gc+hyY1YP3Vk7em%or#{tYIFJc-nhQXVu z84^JaFZAJ{6APR&5u8NVBeS-=5jsw7y=uZjl2WEc41K7aeC$!RfdJO%nWVy|fz^ob zmdB%QJ0s#y`ZVYi#rqhge4-^WTOMb>O#uO(FbzvG3?>+#EE+%ytxD)UlE*+qF7#-j309RJfz?8Hfjucx@E)Pv z$L3XYstH@@5&h9<{~(g|d4!_X1`-w$gdUg!ZG`p}efcR(uboGON^3#--@Ml_Bcx~q z;}9~vlE3aU`k$TO1Zs=&WMMJA~b9*s&42)FPLC`7^|$zvdT zJODe}BFB?CMIc7dJVU43f$7W9m!IYiwIgg0x>_2@G(>A78?4XEkRmjXb0vfzk0}6} zj4mU(!pNd&UY5#$>sKS#M|g@RVZS)5Gs4Etru+@hkG^_zAd5aDhlW*zidgy##Ojzd zb~8oQ7TH=ik8oXfi56+|Xh4$_GID@u0Y+#wNJAT_M$uBc1zUtoOHrHU z1B(idPd)=_RMFuXX;3=_X^HkJpuV&U3t`GfH?^{$nGh||GqI8vDezU1r30wv5%buz zp#}>w{%9qZnnEE9%o1DlGftP#YdDcANSoBuO9?rx#N&|% z1Gw_3u!AW;`7+WHEwdosfons}ga4DqKvdw+GRdHOPzKXRwW-Cz-7E8 zD-Y1e%0c)7{Xq@LLDQ2c`iv+Z05$a3Wt9~lzCjNZIwzt}VxvSK23 zTXe1Dh$P3#ITw8(L9wI_3+#C-05t~jH!-#p!%!asY@5eGu;$N@1 z<xnWJ%7b1as?13X{e&)(lIi*;WzNyhHI;G(LG7U_tttkhp(a&OtmnGn6H{Et2m zufw zXs6yQx*y5rcW4KL$6rNf0Pm-btRbVI)J^0uBVq-rkJuoUkLJ*}k4&Vh;Z4$rG5P^X zZ82qzBxnW9k8^|n36qHi79e&3C9{!NO#{5PsSF^2Q7LS3_A@2w9_jsUM1M5O@GP1d zZ(cRW#+p(71HeuxLxlFYSyM|tT2kq*Xi&U)`8_f}0!hRiRzJ@n{+cyKlN~QZ^oS@EFwz> z?TePF)E`DaX+^I{Vo`b{RLKbB4=0jnm!v;+d(mfPa2|1@@zKiqYF3?ijgJ3N5nvHT zABc>TK#}O+P_=5bjtoFpY4AktRrGL_QZYORL5|=ifvVt-R-iOWg*%u}@CW!nuN(O0 z)O%!35pZa7{j{_UKoTRAfNfrW$^~m@)u7@AqU1I!Bavaxba$s#L&>9zft(x$gF;4v zMxjRza4Q50__ex&*Ph4jr{$$f{}4)OD_4zpEs!w)r~|cA(E~r4dQ)pa`yFmc${dj5 zrUayoxn&vh&?9PSp{-%KHJX9&-`F4u+bO}K%9DsGx*q8wR3|AXI=y7|s78!vItaVeyAlQnu4PTEi0qh0)-NH8c;e)yOHQ-gghF7IahYz z@nr@QtxK^ZTpA$q+0jic^k4!{ab-xAun8e*~F-E#}*+fBdFo8T}+IdB2CO40Ca<@%tX*rL);QUAwPXSA{6*$g)Oe> zp-wo+p8b@93;a(ML}Og!=v#!w3V2u?v$)qnv$?SV)EA!(w1zM;`l`_*hmQ8Nd%#7? zpfyx^Q8d6+G8j&He~~w>X{7bEqEIqSb6hTKq+6>US7|G4S_w-_agk$5I{IJ~V$<>* zDqPh`g8K&;1?LN{CN5nb1Mz68A$pQ+Ic*^$!LS3p$s_R#7y|u`GC^{rVw+&CNoSe5 z!@Waf?V|@aFl;<=IZM`&pw$gwvDk!EAQA>fe>Bmgk{VI4wanQ@atm4l-F%vYW0 z!JkQ!?qmrq%M-fF%F(8u=IHe5P8#vFC8aoB?C8lTLbQ1k>>zsAwy+|ORypfoPlcT(eOWNW##DM zS4%SzTclQ2jq4TYK?S!a%xn|VM?}cn@I>Jl6x-;)CKNwzkYQ`MK$5H)UOUWDj3kr< zsP@sf30Hy<>T&l<7LI0*2yhG}mp~;C7Z8tMrN5A*1|)3+_-h1o-Lin--~i=QIB3yl z4(75TRb<-D+FS_;Cm!s@q|r$pWifC&k*P?Afg6j1l18yyaKdxh8qQ>N7%_tw0f^CW zh5RuCiDrxvmrjQCA#(Dli@;WR)Cl9tR^gEZ1oUU1X)?rEeja(R*^mz;&;)L@0u*6J z-0Q=YRJhy#+m;<2NDvLd416VS{mVp>INE@%WM1gfglS1hy*1IDmS-LluOH4&J)Oo2nlOP zp9d~IihckHu%57;?jY3Vh=EXO@}uISPEI>Bx`m|iCbTMwva3)VQS60(V^Mubt~(F- zhg(I-Inc)kaSItySSfHMQK3n1tvu>$Y`SpJmIyVh3b#bHFZIw=!$MDq(BLKOx#6<` zJJB70);*b3gFA}vhPX)lhk5iv5L_54YPjyq2TTwg9rTmNh|sk(QH&OSi)028y@Gdf zAo4X32B|xtxoyUb2yT>!;dO=f%n{nKW@Y3ELk~v286YRUg?Hl!4j)x^(Kjtu*Ma`i z+bs(u)D&zHU(FR-Fd3?#Rs;=|jed)c!|>7Vk!U3-?tlWd%cRFB@I|TUBT8!p(Wx-< zsyRk&J(@{7CZq~>%yEbw0n~@wbA~>^{m-M;AER1J!p7)}7VcEkR05kWSxEdYOf5&Ci;H@tW`EBg9Id6<eL&T!c8epG_BOBHLH+RvX1B3#!D)NlzeL}Mu4KgJC7(uomHo!louNQ|nyE%IB z2fbF%a=D1Hl8GqV7+}y;+Q>$`dTaBeiMz+}J?J9~^NXsUGZ z0J$s~E=Y9ErYM)ZD#ozN9&xp!sAGjqgsV+zI=YNVID?MCu&C^ai7x|J7L5Rn@bxe{ zKu)A!k!9n$fhu8>zvF^bs9zNCM7auKvmTMGfe1tOYBulBl6ka!(eRL^6OOKzhm5FL0-EJ~u9A^R zBA7ID#{N@265U}Z55b+)6jN~pfv}L`iUhJ;qCYS0X&$v~R6)_X6T;qBGlB&KHBk`1 zBiyr@RY;1BYDcpL$|rga3+_k8&xSTm&j2pIC$NCl5LqD+L+vOeX4XSxU}jQCE8;bg zsD~d-|4jhuJiJ=k;SxLWfK?}Lrv8`<5J0xcMdVSa4k%U zfJW>*WJE`|ZDvH~Ph9tci0F-+N3}0Ed2-zWO9cl#vuX;B!s+wHh27%P@H~V~DIOPz z(ru#Z6v3>BOEfBJZV_%D*u493vBZTPI3PePtQwCBI)Y~kMFAi$x*pLj6`%$PtI9%( zvKXodKoz;Z$cP?6iq_y*44^jJa3gm7KDucM3xb!BP=Ky`fQzwhL#wrj7v3f^nqy4 zOwAg*wMy7EJ+g5WX;s8!D_Kf|$V!2dLAeaDRnh$;JRwjpi@WG6X9Urcte8y4eAJy9 zg6NM%^E7Zim;JD7ZB=~el{^A@l7Gwa34&utB z=w<|NM=i}rTnNK`OEy;&XN*6}DSE|7Iw@_=sp!iuAU>`cpzX0D!YsJooNa-)nw_h4 zA~bx@8aB@RfKD@XJ%oxVLQ!(t^yGsDY(PiMgZ3esgAg;&Z=`Ck2_yoyi=;h_8815O zM`n$r53FOjYvR!eAVKa#l8jPRt{#dkqd?DA0WiS$O0i-0Nr`C!K4aG zp;IaK)ih8Qh7HobC5pzmwVhl3qHhr>KPGGzZm6o15#79Tm$x=*chs@L>4aqDWKtYgj4LkoOH5eEpU8u=z531&nV znxhv(1foTBoX7GLW#M%|NT@PwHHBC~*K27Y>K3-~j{u_Rf<%8WN(#vRL|-*BS((1D zS?(yOh-+io=zxwQ<)KG3m#ZBak?Rq6&uAyOWzMu0~sj8jr&Mlg;R zj15>ZnY*ka%ZLbH_(fc*SGD}eD4>4{`E@FjB3%EIwU7{>X}u38e=FFhMpfgYp?|Fi zo6v~lKBb+6L?T`j1@-XiiM=Q(;L6eHGE!=5Ml^ZbTC+2OA15p>0T*@Vfgf=a(a4`2 zkHe5L{={2ke7U<>w0F+~J%(Ndl**}?Mg2sl4=xP=7c(GPM|UDZ=uAfDT&+?_;jrUs zb9v^>2A!oSl@(W=T7ZvU#uVU?4g(siHjEhnl_%kH$p` zU`SNMkd4d(^xf{!Fl;!dboT{@AdOh_88HxeFR1`1q)Hy>@s4IhgC#-}0xck+n$HM@ zbj8)C1lwF=7(HIwZbsrbqFj@H4U~G?(c#1G2cn~aLFX}GY3h)opKIFP5aABeJHvgFYPwfaDr&H=Rfg8c;)l!sTlqk+Kb1Mt5tjzw=_XA{-03bS-eY;1agAsdQr-)VDJGN^BQAMZ|+i<6G z9xRRRW&}%v1cykiQ!2L$hK*(cIQ?j(3C>Apy_ySK&}_J}1PUStQXbWZ)gP_K$%E|% zGJv1BYKBYM;1T8F9&a}gH$wnui$jyMKM!v0b_0q29vZ|EP7zv$M5k75HxL&QQ&~ZY zJ~rFPgQmaTK%_`O$+?^g058h5i#t1Mx%P$wo8+pvA^@zt#(IQ{P2fht1^N)!d(CA; zU2TTLLNy8SSRPfZA*2y}Eh=K13-uS0_TIs2W^3`tnyxu)sWkoLdw3xcWdiqtHd^%%amBE1wXe`aqfNn7CaN zf@40_2gqn!g%o-OHCAvyptVK^#;Xq`yb&A;AX4BuE02!D+YJPZ zf&rrmU#}{HtZ8=!qFKN_CZSZ~*)-HX-TJo;MEw0V@19%g?6e2l;2S!s-LD{509an9!Y#8r0}|RBfP|FMsuc*tA@M zfDtEin@`svO4hcOQB4ctst;6iKfBtDxQPi!i)-EJJ0k-B=)w-FKN=7ONjfg#44~@f zu|=v6B$l79#auHY=#4cWNGv~jQcCS{0pV>$e>73BxV2#u$pf8R)*%zouqFDDortH@ zWL!zo_%NO*NSA2I0xMCHD4^9wNy12{;2$f&q#=8|aXp#M=O=0gV%PPvsuPp0b zt;Q)y7NyJj^o&;&m-dWzOBMF+)vZn8mLG2Q&Wh4>x~Nm1Ql2ATQCilkn9;ZUS@rjK z?UE`l>(Mv!evQku! zrRk!K_|NGbPo~79RsT`-cXuuwkm}LZFJ)cJGtv-leda^ef3w3+Uby9x2B6}W4{r5~ zst;Cbm!B$6_9^Y1k)-%VfO7rtF*Q#Fdpqq}MueMG{l?O?BeRN+Qy0owy>2Df^~6ab+bD>9tN=k;IgJ zQ=Pc7l8E$LC$30h%D$;iTv*R41;iBqF`mi7S$rvTv#rS5^{{UhBja zNle){)rl)BiAb+?;)*1u?3?Pum6b%K*E(@U5>xg~b>hlOBGPM}xFU%u`=&Z^WhD{m zwN6}-#FTwgow%}+i1b<~u1I3azNt=JSxH2CtrJ%yF=gLWC$6j{BE8m$E0UP9Z>kel zRuYk3>%t=Q(rcZ#B8e&c zraEzDB@yZMZ^hN1O}hb5`n#tpTBLfFv~AhHWxL|zPyffzSS;2e*`Z6vSZvU-vDnZX zVzG6bc>OsR>np`#ORtEWQ}cJyA?%sGAN{d-Kk zVtga%=u57+``AzKzwy0Cjz9PL@Ucd>jyUd}(|_`c{0INrYw6vy?A{C)c^Ppo=(ubXdbw_C|j|K3f?Zr2vSa?KZVvyB7hu6uaHYcCfax9*7s1`N_q!eqQAx!-*CnAV^19N(HkEU7ddW(5@#8@6ur2t0xt2`srV(vld@kbkDop)*muq@qBCf$BUo4{_@!FGqe@c zZfZJw@|^b@&saEpVsB;n?{6G+!_B?sU;EvtIh!`kns@TXf>+;|eb3BO_Sn$j{qBR5 z+ZNYr*Y?sxV&VGN-kbgK2`hiNtI@xV8-6+J)}cRtd;K$$rhopgZp~Va>AU}XFP$}i zO6leG#>863)-3sK=~ZtxUc2t475`n)p!uf18f<#7d|>jUMIU}~er)aPQ#-o%P1^VQ z?*OXZ|{S*`Pn4_+aU>mE+3~8qmM>gg1T|?p-s?yzH3uuQhw)nI+Q>|7*(P zo{fhLZ`5wdqGiikuXtzCxCeYaIpU5VdJnv6uLX~twQ1$mjUJx*`M8gUTzllN8ynBQ zyu6~x+8IA}Emn)}TRx%B#(ifr>ASx9b!{J7*!P(g^M+3NcK-M4y5Dj1n&AgNc=)<> zE3|Nn{-K2<>g{{|Azdr~KJf7w*Q2bJe+!k}v+<3K-+k%UqP=gv>Gh$7yFXlS{mi>h z9XfJYt8w4He%!SE8qY2owZ6P`(YWcKulk}vr->gNcH|M??OWmwerfEqk2}p6^6L>V zy!%AUm-anlR^fzMu{$5{w|vltWAB~RhlBsVVyy=&|!>*fhLE_mZWlQTFuz$n;yLY?$ z(qHeI*!7^1et-wLn3GkAMrhYLn~XI=Lx|M?Fdy6NYZmz>}(*4n6v_&j4+`=Ot7xc~Q&`}N#-?(#mLZ#?(8vENQF z-n4Y?Y-zv!-kz~!)r4KK-Sb%6Z}xiroTsL@Tl(zR^PB6h{Q1R_=PEW``nGh{eM3%~zV|xw z_s+vhFTe7~dOxgMH}|{M<~J)_mo@xo)gj9kT`td>vcBxS4X=d#hn?DZ^C>aI^9PI`a#EWQrr*`%#54aqtyPn?sP(|p zpJ+63S)a9+HQ#%E!=fHPJ-@L1^f$lw?T>|1T0ha{U*k?%6`TI~&+W#%^voZdj_y{v z=DFEJT3vN-)wIrAP+vN4<0(<)aqN8a-)sFlb8R&>>4pSN~(o?|1JRhJ`;J z6)xTFlMTPLz4flPlb-JQ*N`L12dpjJ?c2AnEEqlgsJE{i)9i!E%kG%e^xJul-T&lk zuO4{8kSoewls+E!(xyKuT5KA=rpfKY9zSo+kVInm>@hF5Z98JlGwZtFe!-+w)W<}>dXDlgOUvK0E-!J{}n1@>*@cALb{{yli>*EVj01X3>2f*;W9+oxEPtYV#r6LW(LrBs literal 0 HcmV?d00001