From 55624bcff98eb36dce6d6634a0cd27532179dfdd Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 29 Jul 2016 00:49:58 -0700 Subject: [PATCH] Add custom panel example using React (#2651) --- .gitignore | 1 + .../custom_components/react_panel/__init__.py | 30 ++ .../custom_components/react_panel/panel.html | 415 ++++++++++++++++++ homeassistant/components/frontend/__init__.py | 30 +- homeassistant/components/frontend/version.py | 2 +- .../frontend/www_static/frontend.html | 2 +- .../frontend/www_static/frontend.html.gz | Bin 136431 -> 136434 bytes .../www_static/home-assistant-polymer | 2 +- .../frontend/www_static/service_worker.js | 2 +- .../frontend/www_static/service_worker.js.gz | Bin 2172 -> 2175 bytes 10 files changed, 471 insertions(+), 13 deletions(-) create mode 100644 config/custom_components/react_panel/__init__.py create mode 100644 config/custom_components/react_panel/panel.html diff --git a/.gitignore b/.gitignore index 2edbd42b839..64ab38f2da8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ config/custom_components/* !config/custom_components/example.py !config/custom_components/hello_world.py !config/custom_components/mqtt_example.py +!config/custom_components/react_panel tests/testing_config/deps tests/testing_config/home-assistant.log diff --git a/config/custom_components/react_panel/__init__.py b/config/custom_components/react_panel/__init__.py new file mode 100644 index 00000000000..57073b8cddc --- /dev/null +++ b/config/custom_components/react_panel/__init__.py @@ -0,0 +1,30 @@ +""" +Custom panel example showing TodoMVC using React. + +Will add a panel to control lights and switches using React. Allows configuring +the title via configuration.yaml: + +react_panel: + title: 'home' + +""" +import os + +from homeassistant.components.frontend import register_panel + +DOMAIN = 'react_panel' +DEPENDENCIES = ['frontend'] + +PANEL_PATH = os.path.join(os.path.dirname(__file__), 'panel.html') + + +def setup(hass, config): + """Initialize custom panel.""" + title = config.get(DOMAIN, {}).get('title') + + config = None if title is None else {'title': title} + + register_panel(hass, 'react', PANEL_PATH, + title='TodoMVC', icon='mdi:checkbox-marked-outline', + config=config) + return True diff --git a/config/custom_components/react_panel/panel.html b/config/custom_components/react_panel/panel.html new file mode 100644 index 00000000000..12b473cc466 --- /dev/null +++ b/config/custom_components/react_panel/panel.html @@ -0,0 +1,415 @@ + + + + + + + + + + + + + + diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 021f209a56f..3925170694e 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -1,4 +1,5 @@ """Handle the frontend for Home Assistant.""" +import hashlib import logging import os @@ -25,20 +26,27 @@ def register_built_in_panel(hass, component_name, title=None, icon=None, # pylint: disable=too-many-arguments path = 'panels/ha-panel-{}.html'.format(component_name) + if hass.wsgi.development: + url = ('/static/home-assistant-polymer/panels/' + '{0}/ha-panel-{0}.html'.format(component_name)) + else: + url = None # use default url generate mechanism + register_panel(hass, component_name, os.path.join(STATIC_PATH, path), - FINGERPRINTS[path], title, icon, url_name, config) + FINGERPRINTS[path], title, icon, url_name, url, config) -def register_panel(hass, component_name, path, md5, title=None, icon=None, - url_name=None, config=None): +def register_panel(hass, component_name, path, md5=None, title=None, icon=None, + url_name=None, url=None, config=None): """Register a panel for the frontend. component_name: name of the web component path: path to the HTML of the web component - md5: the md5 hash of the web component (for versioning) + md5: the md5 hash of the web component (for versioning, optional) title: title to show in the sidebar (optional) icon: icon to show next to title in sidebar (optional) url_name: name to use in the url (defaults to component_name) + url: for the web component (for dev environment, optional) config: config to be passed into the web component Warning: this API will probably change. Use at own risk. @@ -50,8 +58,13 @@ def register_panel(hass, component_name, path, md5, title=None, icon=None, if url_name in PANELS: _LOGGER.warning('Overwriting component %s', url_name) if not os.path.isfile(path): - _LOGGER.warning('Panel %s component does not exist: %s', - component_name, path) + _LOGGER.error('Panel %s component does not exist: %s', + component_name, path) + return + + if md5 is None: + with open(path) as fil: + md5 = hashlib.md5(fil.read().encode('utf-8')).hexdigest() data = { 'url_name': url_name, @@ -65,9 +78,8 @@ def register_panel(hass, component_name, path, md5, title=None, icon=None, if config is not None: data['config'] = config - if hass.wsgi.development: - data['url'] = ('/static/home-assistant-polymer/panels/' - '{0}/ha-panel-{0}.html'.format(component_name)) + if url is not None: + data['url'] = url else: url = URL_PANEL_COMPONENT.format(component_name) diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py index a1225558535..74e84e8c06d 100644 --- a/homeassistant/components/frontend/version.py +++ b/homeassistant/components/frontend/version.py @@ -2,7 +2,7 @@ FINGERPRINTS = { "core.js": "bc78f21f5280217aa2c78dfc5848134f", - "frontend.html": "6fdf8282937005d3e4395f456199b118", + "frontend.html": "6c52e8cb797bafa3124d936af5ce1fcc", "mdi.html": "f6c6cc64c2ec38a80e91f801b41119b3", "panels/ha-panel-dev-event.html": "20327fbd4fb0370aec9be4db26fd723f", "panels/ha-panel-dev-info.html": "28e0a19ceb95aa714fd53228d9983a49", diff --git a/homeassistant/components/frontend/www_static/frontend.html b/homeassistant/components/frontend/www_static/frontend.html index 77bd761fe78..9dafede2a71 100644 --- a/homeassistant/components/frontend/www_static/frontend.html +++ b/homeassistant/components/frontend/www_static/frontend.html @@ -3,4 +3,4 @@ e._bubble()}function Bn(e,t){return $n(this,e,t,1)}function Jn(e,t){return $n(th },_distributeDirtyRoots:function(){for(var e,t=this.shadyRoot._dirtyRoots,o=0,i=t.length;o0?~setTimeout(e,t):(this._twiddle.textContent=this._twiddleContent++,this._callbacks.push(e),this._currVal++)},cancel:function(e){if(e<0)clearTimeout(~e);else{var t=e-this._lastVal;if(t>=0){if(!this._callbacks[t])throw"invalid async handle: "+e;this._callbacks[t]=null}}},_atEndOfMicrotask:function(){for(var e=this._callbacks.length,t=0;t \ No newline at end of file +}var r=window.requestAnimationFrame;window.requestAnimationFrame=function(t){return r(function(e){window.document.timeline._updateAnimationsPromises(),t(e),window.document.timeline._updateAnimationsPromises()})},e.AnimationTimeline=function(){this._animations=[],this.currentTime=void 0},e.AnimationTimeline.prototype={getAnimations:function(){return this._discardAnimations(),this._animations.slice()},_updateAnimationsPromises:function(){e.animationsWithPromises=e.animationsWithPromises.filter(function(t){return t._updatePromises()})},_discardAnimations:function(){this._updateAnimationsPromises(),this._animations=this._animations.filter(function(t){return"finished"!=t.playState&&"idle"!=t.playState})},_play:function(t){var i=new e.Animation(t,this);return this._animations.push(i),e.restartWebAnimationsNextTick(),i._updatePromises(),i._animation.play(),i._updatePromises(),i},play:function(t){return t&&t.remove(),this._play(t)}};var o=!1;e.restartWebAnimationsNextTick=function(){o||(o=!0,requestAnimationFrame(n))};var a=new e.AnimationTimeline;e.timeline=a;try{Object.defineProperty(window.document,"timeline",{configurable:!0,get:function(){return a}})}catch(t){}try{window.document.timeline=a}catch(t){}}(c,e,f),function(t,e,i){e.animationsWithPromises=[],e.Animation=function(e,i){if(this.id="",e&&e._id&&(this.id=e._id),this.effect=e,e&&(e._animation=this),!i)throw new Error("Animation with null timeline is not supported");this._timeline=i,this._sequenceNumber=t.sequenceNumber++,this._holdTime=0,this._paused=!1,this._isGroup=!1,this._animation=null,this._childAnimations=[],this._callback=null,this._oldPlayState="idle",this._rebuildUnderlyingAnimation(),this._animation.cancel(),this._updatePromises()},e.Animation.prototype={_updatePromises:function(){var t=this._oldPlayState,e=this.playState;return this._readyPromise&&e!==t&&("idle"==e?(this._rejectReadyPromise(),this._readyPromise=void 0):"pending"==t?this._resolveReadyPromise():"pending"==e&&(this._readyPromise=void 0)),this._finishedPromise&&e!==t&&("idle"==e?(this._rejectFinishedPromise(),this._finishedPromise=void 0):"finished"==e?this._resolveFinishedPromise():"finished"==t&&(this._finishedPromise=void 0)),this._oldPlayState=this.playState,this._readyPromise||this._finishedPromise},_rebuildUnderlyingAnimation:function(){this._updatePromises();var t,i,n,r,o=!!this._animation;o&&(t=this.playbackRate,i=this._paused,n=this.startTime,r=this.currentTime,this._animation.cancel(),this._animation._wrapper=null,this._animation=null),(!this.effect||this.effect instanceof window.KeyframeEffect)&&(this._animation=e.newUnderlyingAnimationForKeyframeEffect(this.effect),e.bindAnimationForKeyframeEffect(this)),(this.effect instanceof window.SequenceEffect||this.effect instanceof window.GroupEffect)&&(this._animation=e.newUnderlyingAnimationForGroup(this.effect),e.bindAnimationForGroup(this)),this.effect&&this.effect._onsample&&e.bindAnimationForCustomEffect(this),o&&(1!=t&&(this.playbackRate=t),null!==n?this.startTime=n:null!==r?this.currentTime=r:null!==this._holdTime&&(this.currentTime=this._holdTime),i&&this.pause()),this._updatePromises()},_updateChildren:function(){if(this.effect&&"idle"!=this.playState){var t=this.effect._timing.delay;this._childAnimations.forEach(function(i){this._arrangeChildren(i,t),this.effect instanceof window.SequenceEffect&&(t+=e.groupChildDuration(i.effect))}.bind(this))}},_setExternalAnimation:function(t){if(this.effect&&this._isGroup)for(var e=0;e \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/frontend.html.gz b/homeassistant/components/frontend/www_static/frontend.html.gz index 54153e3662ff05a2ed772ab7152cdd391845facd..bbc4f6c09f9d08b01492106c6d4a391486936796 100644 GIT binary patch delta 15213 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 delta 15210 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 diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index 974c75b9ed7..519533a4af4 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit 974c75b9ed7a30b00c64aa8d163f120d3995d9e7 +Subproject commit 519533a4af4d5f16ec41dbc4d298d7566116fdad diff --git a/homeassistant/components/frontend/www_static/service_worker.js b/homeassistant/components/frontend/www_static/service_worker.js index 9b7a9f7a188..91866479afe 100644 --- a/homeassistant/components/frontend/www_static/service_worker.js +++ b/homeassistant/components/frontend/www_static/service_worker.js @@ -1 +1 @@ -"use strict";function deleteAllCaches(){return caches.keys().then(function(e){return Promise.all(e.map(function(e){return caches.delete(e)}))})}var PrecacheConfig=[["/","1dc05a9f1b8d47fce5cc5f8db49de8d8"],["/frontend/panels/dev-event-20327fbd4fb0370aec9be4db26fd723f.html","a9b6eced242c1934a331c05c30e22148"],["/frontend/panels/dev-info-28e0a19ceb95aa714fd53228d9983a49.html","75862082477c802a12d2bf8705990d85"],["/frontend/panels/dev-service-85fd5b48600418bb5a6187539a623c38.html","353e4d80fedbcde9b51e08a78a9ddb86"],["/frontend/panels/dev-state-25d84d7b7aea779bb3bb3cd6c155f8d9.html","7fc5b1880ba4a9d6e97238e8e5a44d69"],["/frontend/panels/dev-template-d079abf61cff9690f828cafb0d29b7e7.html","6e512a2ba0eb7aeba956ca51048e701e"],["/frontend/panels/map-dfe141a3fa5fd403be554def1dd039a9.html","f061ec88561705f7787a00289450c006"],["/static/core-bc78f21f5280217aa2c78dfc5848134f.js","a09b7ee4108fae1f93c10e14a4bfd675"],["/static/frontend-6fdf8282937005d3e4395f456199b118.html","fa094e1f884700a35ba5195bcd226dda"],["/static/mdi-f6c6cc64c2ec38a80e91f801b41119b3.html","e010f32322ed6f66916c7c09dbba4acd"],["static/fonts/roboto/Roboto-Bold.ttf","d329cc8b34667f114a95422aaad1b063"],["static/fonts/roboto/Roboto-Light.ttf","7b5fb88f12bec8143f00e21bc3222124"],["static/fonts/roboto/Roboto-Medium.ttf","fe13e4170719c2fc586501e777bde143"],["static/fonts/roboto/Roboto-Regular.ttf","ac3f799d5bbaf5196fab15ab8de8431c"],["static/icons/favicon-192x192.png","419903b8422586a7e28021bbe9011175"],["static/icons/favicon.ico","04235bda7843ec2fceb1cbe2bc696cf4"],["static/images/card_media_player_bg.png","a34281d1c1835d338a642e90930e61aa"],["static/webcomponents-lite.min.js","b0f32ad3c7749c40d486603f31c9d8b1"]],CacheNamePrefix="sw-precache-v1--"+(self.registration?self.registration.scope:"")+"-",IgnoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var a=new URL(e);return"/"===a.pathname.slice(-1)&&(a.pathname+=t),a.toString()},getCacheBustedUrl=function(e,t){t=t||Date.now();var a=new URL(e);return a.search+=(a.search?"&":"")+"sw-precache="+t,a.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var a=new URL(t).pathname;return e.some(function(e){return a.match(e)})},populateCurrentCacheNames=function(e,t,a){var n={},r={};return e.forEach(function(e){var c=new URL(e[0],a).toString(),o=t+c+"-"+e[1];r[o]=c,n[c]=o}),{absoluteUrlToCacheName:n,currentCacheNamesToAbsoluteUrl:r}},stripIgnoredUrlParameters=function(e,t){var a=new URL(e);return a.search=a.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),a.toString()},mappings=populateCurrentCacheNames(PrecacheConfig,CacheNamePrefix,self.location),AbsoluteUrlToCacheName=mappings.absoluteUrlToCacheName,CurrentCacheNamesToAbsoluteUrl=mappings.currentCacheNamesToAbsoluteUrl;self.addEventListener("install",function(e){e.waitUntil(Promise.all(Object.keys(CurrentCacheNamesToAbsoluteUrl).map(function(e){return caches.open(e).then(function(t){return t.keys().then(function(a){if(0===a.length){var n=e.split("-").pop(),r=getCacheBustedUrl(CurrentCacheNamesToAbsoluteUrl[e],n),c=new Request(r,{credentials:"same-origin"});return fetch(c).then(function(a){return a.ok?t.put(CurrentCacheNamesToAbsoluteUrl[e],a):(console.error("Request for %s returned a response status %d, so not attempting to cache it.",r,a.status),caches.delete(e))})}})})})).then(function(){return caches.keys().then(function(e){return Promise.all(e.filter(function(e){return 0===e.indexOf(CacheNamePrefix)&&!(e in CurrentCacheNamesToAbsoluteUrl)}).map(function(e){return caches.delete(e)}))})}).then(function(){"function"==typeof self.skipWaiting&&self.skipWaiting()}))}),self.clients&&"function"==typeof self.clients.claim&&self.addEventListener("activate",function(e){e.waitUntil(self.clients.claim())}),self.addEventListener("message",function(e){"delete_all"===e.data.command&&(console.log("About to delete all caches..."),deleteAllCaches().then(function(){console.log("Caches deleted."),e.ports[0].postMessage({error:null})}).catch(function(t){console.log("Caches not deleted:",t),e.ports[0].postMessage({error:t})}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t=stripIgnoredUrlParameters(e.request.url,IgnoreUrlParametersMatching),a=AbsoluteUrlToCacheName[t],n="index.html";!a&&n&&(t=addDirectoryIndex(t,n),a=AbsoluteUrlToCacheName[t]);var r="/";if(!a&&r&&e.request.headers.has("accept")&&e.request.headers.get("accept").includes("text/html")&&isPathWhitelisted(["^((?!(static|api|service_worker.js)).)*$"],e.request.url)){var c=new URL(r,self.location);a=AbsoluteUrlToCacheName[c.toString()]}a&&e.respondWith(caches.open(a).then(function(e){return e.keys().then(function(t){return e.match(t[0]).then(function(e){if(e)return e;throw Error("The cache "+a+" is empty.")})})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}); \ No newline at end of file +"use strict";function deleteAllCaches(){return caches.keys().then(function(e){return Promise.all(e.map(function(e){return caches.delete(e)}))})}var PrecacheConfig=[["/","2d9bbabfa2dc5f2a651ff1141d7e306c"],["/frontend/panels/dev-event-20327fbd4fb0370aec9be4db26fd723f.html","a9b6eced242c1934a331c05c30e22148"],["/frontend/panels/dev-info-28e0a19ceb95aa714fd53228d9983a49.html","75862082477c802a12d2bf8705990d85"],["/frontend/panels/dev-service-85fd5b48600418bb5a6187539a623c38.html","353e4d80fedbcde9b51e08a78a9ddb86"],["/frontend/panels/dev-state-25d84d7b7aea779bb3bb3cd6c155f8d9.html","7fc5b1880ba4a9d6e97238e8e5a44d69"],["/frontend/panels/dev-template-d079abf61cff9690f828cafb0d29b7e7.html","6e512a2ba0eb7aeba956ca51048e701e"],["/frontend/panels/map-dfe141a3fa5fd403be554def1dd039a9.html","f061ec88561705f7787a00289450c006"],["/static/core-bc78f21f5280217aa2c78dfc5848134f.js","a09b7ee4108fae1f93c10e14a4bfd675"],["/static/frontend-6c52e8cb797bafa3124d936af5ce1fcc.html","a460549fe50b2e7c9cadd94d682c9ed7"],["/static/mdi-f6c6cc64c2ec38a80e91f801b41119b3.html","e010f32322ed6f66916c7c09dbba4acd"],["static/fonts/roboto/Roboto-Bold.ttf","d329cc8b34667f114a95422aaad1b063"],["static/fonts/roboto/Roboto-Light.ttf","7b5fb88f12bec8143f00e21bc3222124"],["static/fonts/roboto/Roboto-Medium.ttf","fe13e4170719c2fc586501e777bde143"],["static/fonts/roboto/Roboto-Regular.ttf","ac3f799d5bbaf5196fab15ab8de8431c"],["static/icons/favicon-192x192.png","419903b8422586a7e28021bbe9011175"],["static/icons/favicon.ico","04235bda7843ec2fceb1cbe2bc696cf4"],["static/images/card_media_player_bg.png","a34281d1c1835d338a642e90930e61aa"],["static/webcomponents-lite.min.js","b0f32ad3c7749c40d486603f31c9d8b1"]],CacheNamePrefix="sw-precache-v1--"+(self.registration?self.registration.scope:"")+"-",IgnoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var a=new URL(e);return"/"===a.pathname.slice(-1)&&(a.pathname+=t),a.toString()},getCacheBustedUrl=function(e,t){t=t||Date.now();var a=new URL(e);return a.search+=(a.search?"&":"")+"sw-precache="+t,a.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var a=new URL(t).pathname;return e.some(function(e){return a.match(e)})},populateCurrentCacheNames=function(e,t,a){var n={},c={};return e.forEach(function(e){var r=new URL(e[0],a).toString(),o=t+r+"-"+e[1];c[o]=r,n[r]=o}),{absoluteUrlToCacheName:n,currentCacheNamesToAbsoluteUrl:c}},stripIgnoredUrlParameters=function(e,t){var a=new URL(e);return a.search=a.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),a.toString()},mappings=populateCurrentCacheNames(PrecacheConfig,CacheNamePrefix,self.location),AbsoluteUrlToCacheName=mappings.absoluteUrlToCacheName,CurrentCacheNamesToAbsoluteUrl=mappings.currentCacheNamesToAbsoluteUrl;self.addEventListener("install",function(e){e.waitUntil(Promise.all(Object.keys(CurrentCacheNamesToAbsoluteUrl).map(function(e){return caches.open(e).then(function(t){return t.keys().then(function(a){if(0===a.length){var n=e.split("-").pop(),c=getCacheBustedUrl(CurrentCacheNamesToAbsoluteUrl[e],n),r=new Request(c,{credentials:"same-origin"});return fetch(r).then(function(a){return a.ok?t.put(CurrentCacheNamesToAbsoluteUrl[e],a):(console.error("Request for %s returned a response status %d, so not attempting to cache it.",c,a.status),caches.delete(e))})}})})})).then(function(){return caches.keys().then(function(e){return Promise.all(e.filter(function(e){return 0===e.indexOf(CacheNamePrefix)&&!(e in CurrentCacheNamesToAbsoluteUrl)}).map(function(e){return caches.delete(e)}))})}).then(function(){"function"==typeof self.skipWaiting&&self.skipWaiting()}))}),self.clients&&"function"==typeof self.clients.claim&&self.addEventListener("activate",function(e){e.waitUntil(self.clients.claim())}),self.addEventListener("message",function(e){"delete_all"===e.data.command&&(console.log("About to delete all caches..."),deleteAllCaches().then(function(){console.log("Caches deleted."),e.ports[0].postMessage({error:null})}).catch(function(t){console.log("Caches not deleted:",t),e.ports[0].postMessage({error:t})}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t=stripIgnoredUrlParameters(e.request.url,IgnoreUrlParametersMatching),a=AbsoluteUrlToCacheName[t],n="index.html";!a&&n&&(t=addDirectoryIndex(t,n),a=AbsoluteUrlToCacheName[t]);var c="/";if(!a&&c&&e.request.headers.has("accept")&&e.request.headers.get("accept").includes("text/html")&&isPathWhitelisted(["^((?!(static|api|service_worker.js)).)*$"],e.request.url)){var r=new URL(c,self.location);a=AbsoluteUrlToCacheName[r.toString()]}a&&e.respondWith(caches.open(a).then(function(e){return e.keys().then(function(t){return e.match(t[0]).then(function(e){if(e)return e;throw Error("The cache "+a+" is empty.")})})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}); \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/service_worker.js.gz b/homeassistant/components/frontend/www_static/service_worker.js.gz index 25fd33f6c2203bd5c3bfbd51a664b46b5ff83672..787dd89c271f57170989ca3bf76020a55157af6e 100644 GIT binary patch literal 2175 zcmV-_2!Qt=iwFqi{+d?;19N3^c4=c}Uw3bEYh`jSYI6XkSZQzEI1>FUim-8{wOS^1 zQZ|GjlL;0BB%2_cARoLQgGaGjiCXHF*mex3|NEAtz7KmA3;3Yb047D6rGjf7(jZb# zf`D_bs31xB9Mt<_JTXhGRK!{^rfDEBSu_eYL6%Y>(a`{d^c>a)P{n+@1jEWeqF}mH zq;JqAE{U<0(liwcGxV%upJ6;Nd9y_0GSq37Aww}^G0hUq1&z623Rr}SvW-^Ax@s>p zzv~twngu`c+n-fq#EB^CK`0o82p!@n^yMW4WCT;RESO_BKK{V-BnrY=Y8TYYkQ#`NW-un9a zJvOhap{Ze`%JZE2Gj1joqWf)$O6`oOdv@k*9-rsN^|){9e_`XT#*Vx2#$fvU{x)w7 zD0FYnpvldzU%#V9`c-}JxK}3}u(;m>Z{*}WcUH^S_L)6ge=C5weQx$#DB4fx-?s@S zsw_G$_FO2mL-2Osmr#w(#2qZYAbY+TcYV*5Qy7PO3de>3j?)1Kziuz1#t8;VSbhU8~*YxH} zUe`By<5kzqO?OU{^)td6!;B$UWPTu2&v<TPH^|q>H1?`f)7noW1^Ps zSSTCT%hnoDL0KG^EjF(H)rgyUYrRyS)z(&38;hH6Ts2r9mZ^u>TZQp$PhznT+c8di zFE<@`7CnLXZ}We>TAil!pwvazx;|=Wk44yxUO4D=Wj#}I3-^C}dpo?Gy;@^qG!HYV zwbiqx{ZY)mAt5k~XJ`9QoB?hiyDW=tfH*rl1-0COzj-lTf*q2Ql@$4ZWw;lca3@C26k7Ll3R|;o~kjj7QC$($8fvaUt(X{*t4EN zH;e5g9)_)oLFUr??G(YDX|xos7#)yesTZ@Ys)AECoa^Omf*=S}6jdRxy+ zRsH*wvAU?jre$>9#D3Y@7QVhu2V0lc%a5;iW85)lXmIPtJz=o@{TI(fWQLRz0038h BA&me4 literal 2172 zcmV-?2!r<@iwFo6F`8Eb19N3^c4=c}Uw3bEYh`jSYI6XkSZi1RK?w%ll;vA4r_eg?Ljz{fRF>@j_J6=VKJ?8LDrbGjfz7T@O+71G z@OfD};LrH{)TWiG!4*DVy7;xcI*rHe^^b!DI1o=ue`G0!v=Ohu`d5K9?r zrbLt}V2at-9&Xf4T^Xp<`J7i!w&x0N$8Zak83!Z`QY}=Z1qoBaL1qFXC4xk&Gzhgn zHM0`^@Ju8iK?PADX%0AhMYAltx;`VGuBtWh~@T zwsw=oEC~n;qBNC^1e^vc5SpbV&N8A{{J5JIn%hFcn8j#XL@XgBqD+XGCzPdenDHbC zWysc^!Z^fxGNM5VsUQyZmo& zq-889V?^)>O(&3HS{X2ic@(K6d)$wK*}UvrDUxPf=!8nGvm_&$1x#`*mz%0taDdl3l*#BroRQ>6%IZgUw;5(<*B zIH6b)ou(}1gaj;$Vj>AyC9O+PA454uz;e=*^8g^qBiyU=l<9Dx4KlmF&a&&Fvz52B8-wG)fBIu#ZeG& z&J`6T37<3dzL-qS%2q03Ef~`@5Lhf4g_Fr&)#!65wLvtf0t7v!_1&k^xDGL#Y2$>`bFq90{F`=CA zTDt=w>)E`nP<`8RSr}{uMK#bsbZFu#lxZ4eG9n6PEFq!B#AJ#IYF}S_eed}vp8@s* zUHr`L_HI01wTAI69gpoZr-f4c4NMAbVZ3WFuaBPit*qy8VcYJRJ+{3+CKa;vYg2yW z4ca!)v>&*U)1tyobN=VT%x=!FJ+9R61^O~|bN@%B;Ag(=V4iUwx;Dl03hu10pWkEi zx*VDsHmW?&xj*M-TA_8nEm5hRF?B~HXZ!dpH?GHhQ~wJaZ#8k;r8fc7-}kpgYd~Rm z2M$ece*O9#HPWx@JIB3zBmj&1E$~K8&vIwId~J{H;rcrX%9p&f#^1HXi7Vy5ok@dY`E#kiY$u7kon)H66W1aO=VF!_D^UwZR;zUcbE+eOnL zXf^<7_agE5kpC)wSb7cq*t*em^9~Q~dFr;xZKkdWR@dFRxL4=qOm^5fgDZM{*<97v zx%8?ld7alw*L&cit;>b!F!QC}#B@=4@-WOV^_%V9i)Oj>y2)xjKu+yp?yuo#Q_g(7 zSRsnKemh4>Iapiwu?Y*-dvY7o>+7OK&!;vTA4jC-e*2MGfAj*C7FyG%tt-(JzP{H* zwRSbEF|-4S;o&(h+x*c=JNv`mp$K?Ay~|qm)ONi$Cu@_h{rIPA=e>Qha@*riSNO6I z2BqR%H(^jEU|6w<_Y{eUYM_yDN1K|KK>}aqs$Bw_0wUw&rH&&a^2H| zsod;T`Q+HnH_Ya1X0PbA!Os{mh807uH2INGJrng6Tzgokfq|dlKZ_1djrSmt5qPTL zWqV<_cx+rZ#iXe0H1?`f)7noW1&{zSSTCT z%hnpKg0eU+TWnnYs}VPg)_SQttF5i7HWoMCxM~m|mZ^u_TZQp$uR*X6+wr;wFE<@` zmOX(EZ}We>T0KtbL8*(bb$!&%0gJF3y>Kw<%6bNIOZR_!dpo|Iy*3ELa zh{x&c$-SRElp*^c@4gI)YX)xm*e<8F8YIc&kM>h%dt%X)PfdB)lk(GTn8Tg*0%8VeKz>IuwH(AwV&gTK|_PvJnjjD?eD({%aXv96951WXe^-s