From f78a668ce37a693416a1660bed2d588c8e221bfa Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Fri, 10 Jan 2014 13:50:51 -0700 Subject: [PATCH 1/6] Handle case where resource has no imagery providers --- src/ol/source/bingmapssource.js | 63 +++++++++++++++++---------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/src/ol/source/bingmapssource.js b/src/ol/source/bingmapssource.js index 975c471d9f..ea61cf5f1d 100644 --- a/src/ol/source/bingmapssource.js +++ b/src/ol/source/bingmapssource.js @@ -115,37 +115,40 @@ ol.source.BingMaps.prototype.handleImageryMetadataResponse = }); }))); - var transform = ol.proj.getTransformFromProjections( - ol.proj.get('EPSG:4326'), this.getProjection()); - var attributions = goog.array.map( - resource.imageryProviders, - function(imageryProvider) { - var html = imageryProvider.attribution; - /** @type {Object.>} */ - var tileRanges = {}; - goog.array.forEach( - imageryProvider.coverageAreas, - function(coverageArea) { - var minZ = coverageArea.zoomMin; - var maxZ = coverageArea.zoomMax; - var bbox = coverageArea.bbox; - var epsg4326Extent = [bbox[1], bbox[0], bbox[3], bbox[2]]; - var extent = ol.extent.transform(epsg4326Extent, transform); - var tileRange, z, zKey; - for (z = minZ; z <= maxZ; ++z) { - zKey = z.toString(); - tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z); - if (zKey in tileRanges) { - tileRanges[zKey].push(tileRange); - } else { - tileRanges[zKey] = [tileRange]; + if (resource.imageryProviders) { + var transform = ol.proj.getTransformFromProjections( + ol.proj.get('EPSG:4326'), this.getProjection()); + + var attributions = goog.array.map( + resource.imageryProviders, + function(imageryProvider) { + var html = imageryProvider.attribution; + /** @type {Object.>} */ + var tileRanges = {}; + goog.array.forEach( + imageryProvider.coverageAreas, + function(coverageArea) { + var minZ = coverageArea.zoomMin; + var maxZ = coverageArea.zoomMax; + var bbox = coverageArea.bbox; + var epsg4326Extent = [bbox[1], bbox[0], bbox[3], bbox[2]]; + var extent = ol.extent.transform(epsg4326Extent, transform); + var tileRange, z, zKey; + for (z = minZ; z <= maxZ; ++z) { + zKey = z.toString(); + tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z); + if (zKey in tileRanges) { + tileRanges[zKey].push(tileRange); + } else { + tileRanges[zKey] = [tileRange]; + } } - } - }); - return new ol.Attribution({html: html, tileRanges: tileRanges}); - }); - attributions.push(ol.source.BingMaps.TOS_ATTRIBUTION); - this.setAttributions(attributions); + }); + return new ol.Attribution({html: html, tileRanges: tileRanges}); + }); + attributions.push(ol.source.BingMaps.TOS_ATTRIBUTION); + this.setAttributions(attributions); + } this.setLogo(brandLogoUri); From e4b815d4d6633ba3cd61e2715a630a53013632c2 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 10 Jan 2014 22:44:56 +0100 Subject: [PATCH 2/6] Add optional URL for logos --- src/ol/control/logocontrol.js | 24 +++++++++++++++++------- src/ol/framestate.js | 2 +- src/ol/renderer/layerrenderer.js | 2 +- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/ol/control/logocontrol.js b/src/ol/control/logocontrol.js index e1ebaa359a..a25d09ced9 100644 --- a/src/ol/control/logocontrol.js +++ b/src/ol/control/logocontrol.js @@ -90,15 +90,25 @@ ol.control.Logo.prototype.updateElement_ = function(frameState) { } } - var image, logoElement; - for (logo in logos) { - if (!(logo in logoElements)) { + var image, logoElement, logoKey; + for (logoKey in logos) { + if (!(logoKey in logoElements)) { image = new Image(); - image.src = logo; - logoElement = goog.dom.createElement(goog.dom.TagName.LI); - logoElement.appendChild(image); + image.src = logoKey; + var logoValue = logos[logoKey]; + var child; + if (logoValue === '') { + child = image; + } else { + child = goog.dom.createDom(goog.dom.TagName.A, { + 'href': logoValue, + 'target': '_blank' + }); + child.appendChild(image); + } + logoElement = goog.dom.createDom(goog.dom.TagName.LI, undefined, child); goog.dom.appendChild(this.ulElement_, logoElement); - logoElements[logo] = logoElement; + logoElements[logoKey] = logoElement; } } diff --git a/src/ol/framestate.js b/src/ol/framestate.js index b86c897ef9..027ff9ea60 100644 --- a/src/ol/framestate.js +++ b/src/ol/framestate.js @@ -25,7 +25,7 @@ goog.require('ol.layer.LayerState'); * index: number, * layersArray: Array., * layerStates: Object., - * logos: Object., + * logos: Object., * pixelToCoordinateMatrix: goog.vec.Mat4.Number, * postRenderFunctions: Array., * size: ol.Size, diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index bd7ecd8e07..de430d81a8 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -175,7 +175,7 @@ ol.renderer.Layer.prototype.updateAttributions = ol.renderer.Layer.prototype.updateLogos = function(frameState, source) { var logo = source.getLogo(); if (goog.isDef(logo)) { - frameState.logos[logo] = true; + frameState.logos[logo] = ''; } }; From b7e906fe0949002d799f752e5cfee98d682f440d Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 10 Jan 2014 22:45:19 +0100 Subject: [PATCH 3/6] Add ol3Logo option to ol.Map --- examples/simple.js | 1 + src/objectliterals.jsdoc | 1 + src/ol/map.js | 50 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/examples/simple.js b/examples/simple.js index d11dfd2633..6a3e3a4914 100644 --- a/examples/simple.js +++ b/examples/simple.js @@ -12,6 +12,7 @@ var map = new ol.Map({ }) ], renderers: ol.RendererHints.createFromQueryData(), + ol3Logo: false, target: 'map', view: new ol.View2D({ center: [0, 0], diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index 16e061f833..932043d972 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -60,6 +60,7 @@ * @property {ol.Collection|Array.|undefined} interactions * Interactions that are initially added to the map. * @property {Array.|ol.Collection|undefined} layers Layers. + * @property {boolean|undefined} ol3Logo Show ol3 logo. Default is `true`. * @property {ol.Collection|Array.|undefined} overlays * Overlays initially added to the map. * @property {ol.RendererHint|undefined} renderer Renderer. diff --git a/src/ol/map.js b/src/ol/map.js index cf57fa2855..dc5b984e85 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -65,6 +65,43 @@ goog.require('ol.structs.PriorityQueue'); goog.require('ol.vec.Mat4'); +/** + * @const + * @type {string} + */ +ol.OL3_URL = 'http://ol3js.org/'; + + +/** + * @const + * @type {string} + */ +ol.OL3_LOGO_URL = 'data:image/png;base64,' + + 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlw' + + 'SFlzAAABxgAAAcYBF8H6RgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoA' + + 'AAQySURBVFiF7ZddUJRVGMf/z3l332XZZYFVgfwAAcsPKGoyq5GLZBxnmElADWd1prEGwkht' + + 'ugjtopHWi7hxmpoJC5A+HBxkpeyDtBkjR2Z0EsVyJEQokAp0k1A+lv143/ecLrRakGV3gYYu' + + 'eu7e8/H//+bMc57zvCSEwGwGm1X3/wKAbjqbt5z5fr4gyTo0GNl5PHuJdyoaFG4O2AF288KV' + + 'YoJ4nUAJACBAGoCvhF4ueTcjpeNfA3j53E8WISlHCVg38Qrh0iA9V75yaX2omiHnwPaW1lQu' + + '+ZoDmwMAmSTwup3n2/eGqhvSCRQ3t2XpGDkImBOqMBdwuFzGbR8+tdgzLYCXmtte1En0DgTk' + + 'UM3/CgG0+AjrKx5dfj1sADvA+i+0v00Qu8I1HgfRxwXPK38s7XzIAMGT7Z/gAlAEh8oFtLta' + + 'RAQCwIggM4JE5OaggvKVy2qDAuw5czXKbeBnAaRPZurWNIxqGhQePIfuggiFi8K6zIwPxsyN' + + 'X+yS+cFA5gLAkKLC6fFiUFFDMr8DLODROGlCHNjYdHF5QAACiBGyJxLxco6bHh9GVA3TeL4M' + + 'EpNy/AfGlOI3ABoAIvwNuAAGFRVuTZu6rV9EMrL4f485gVKAJ0bo/3bShEC/1zdj5gzAxrio' + + 'e8b8Q5cba5QtEoMmBP7wKlBnsF/ImWfGg3pETAag9t5wKtvizTAzMWPmEgG2eAvWxprgOP2d' + + 'FBBgzRq77s2aY3q9pmHXglg8bjFO29wkMexcEIvMaCMaL7aiouFbd0CAU6dK1Y5e5+VXDhzC' + + 'iGsUzyZYkDfXDJqieYKsQ0miFfdHyjjZchn7aj6FEBhTEe+pA5z4jks/9/gK9lei6/rvWGs1' + + 'oWh+DAwsPIwVJgNeTbRijo6hoqERez86Cp+ift2TvvAz/3UTluLF+UXZRDgSaZAt+57Px+q0' + + 'B9DnVfF+320MKMFvRFZsJDbMi4LH54P90Cc4fekKABw3eLmt/fPq4aAAAJD0TFEaY+JLRpS8' + + 'I28dtmatxrDGUdV3G11uZcI9EhFscVF4MtoI561BlFQeRudvN0AQb3WnLSoRpaV8/J5Jn+Ol' + + 'W7fP9araMQJlPv3EI9htywFjDN/cGsXJARc8fqV4iVHGpjgzFhn0aO3+FXuqajEwPKIIoPia' + + 'o6o6kEfQfiB982bZJaIrQdj2cGoSygptiDGboAgBp0+DS+OIlyXE6O7crhPNP6Cs9gv4VLWf' + + 'kdjUVXewaTL9kHvC5PzC3SAqu88aw17bkotVy1LHzI+4PahoaER90zkA1Ma5tr6nvrormG5Y' + + 'TWly/gu5IBwGYHooJRErkhbCYjLiF2c/zv7YgaFRNwBxQid7bJ01NUOhaIbdlqfYCjIElz4G' + + 'RMa4KS8B+7sxWCocjpAfj7ABAIDsdpbU1ruBgFUCwsogrgqmr++ufe9a2Fr//5zONsCf36PQ' + + '/7qoH28AAAAASUVORK5CYII='; + + /** * @enum {string} * @todo stability experimental @@ -136,6 +173,12 @@ ol.Map = function(options) { var optionsInternal = ol.Map.createOptionsInternal(options); + /** + * @private + * @type {boolean} + */ + this.ol3Logo_ = optionsInternal.ol3Logo; + /** * @private * @type {goog.async.AnimationDelay} @@ -1096,6 +1139,9 @@ ol.Map.prototype.renderFrame_ = function(time) { viewHints: viewHints, wantedTiles: {} }; + if (this.ol3Logo_) { + frameState.logos[ol.OL3_LOGO_URL] = ol.OL3_URL; + } } var preRenderFunctions = this.preRenderFunctions_; @@ -1251,6 +1297,7 @@ ol.Map.prototype.withFrozenRendering = function(f, opt_obj) { /** * @typedef {{controls: ol.Collection, * interactions: ol.Collection, + * ol3Logo: boolean, * overlays: ol.Collection, * rendererConstructor: * function(new: ol.renderer.Map, Element, ol.Map), @@ -1270,6 +1317,8 @@ ol.Map.createOptionsInternal = function(options) { */ var values = {}; + var ol3Logo = goog.isDef(options.ol3Logo) ? options.ol3Logo : true; + var layerGroup = (options.layers instanceof ol.layer.Group) ? options.layers : new ol.layer.Group({layers: options.layers}); values[ol.MapProperty.LAYERGROUP] = layerGroup; @@ -1357,6 +1406,7 @@ ol.Map.createOptionsInternal = function(options) { return { controls: controls, interactions: interactions, + ol3Logo: ol3Logo, overlays: overlays, rendererConstructor: rendererConstructor, values: values From 36dc0b88e105797e56cd7b55928f923337ecbc9a Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Jan 2014 14:37:13 +0100 Subject: [PATCH 4/6] Add 32x32 pixel logo image --- resources/logo-32x32.png | Bin 0 -> 1205 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/logo-32x32.png diff --git a/resources/logo-32x32.png b/resources/logo-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..12382832d9dcd1fd9c81ac3651642c829985c084 GIT binary patch literal 1205 zcmV;m1WNmfP)PL@1C7bdyj% zmi>6&_na=YT99RTfrc)6?%wn9|NrL9bDs0OB!s|h2Afs){{nz+I-9qg`F_42$vQL` z*?ByBiFYa*6mAaK0e17km12T;oj?fyAV3;`uY_JMc{d}a<6i@K`P@$yAt^@*SU2$s z;nE;ISH5y-eW;ot=fL)s)>JO}ngg2y0GTB4x}E3S_lBw)(g_qdw`J)VIS7~&sxTLD zxLn3(pWp&e1c%B6w7XhF1OmW_ATxqQmE*6dpW>?t%z~i^96hj1R`ljbH4N`N2Tu0>F@>!s+p1P*FoNzXL4b(Ku;B z9N5@&ad|)h0*Dc^Clc{;j+-7IMpO;cc)ko0lXCnA#+2eW02%-y{0+DO1{D=?sC&lzLzf$Clr0j2CItTQDo|&zU&xtf z#)Eo9Oa`F#-f$}0;>|EKF=OTu0k(Jx*2bFPIQ^Xz5Ma$3yY9`JV|u-&Vb_9KJZ>>g z+uS5E>|79w%xEJTFSeqh;ahh=fK#VR)s9~0LrJ0) z_eaV&*>V~CYCeS!7*i4NsRNw&j!QrH_zLz{qU-waSZg(*XnqU~EIf=ACIengv|^5q zp`xJ?dp|k~pQ3)Gzz*+e)JX^<`Zp3leXv8g2(5B{m>^ked!7S95;Bmt^M=r;h+Ejkn~JZ8e`&1MwGlGZymN~t;Vp%QPp=F zU2bKZL6lS;M(1xgKoD8y-`pC-$pIHUex-PcQO2e?GZq>2Xzl(Ld#Y+NFg&6Np!k}jsydKI(0(9& z^Jdv4qANkz_Hb$v$_j0WF`J+W0jE!cOXG-_CB*3N+^!SNKcKAk3;0yEpOM(qRd=vy zGX0Qy!sPtI-5@Hv&lVat#<{k>r@p!?m~L22X>$Gx zxgZ<{V0tJe5i61w!eTPw7iT}t{@8(`Q8xf_LMMA{oi#N>p=gHPmZ#VXG6a`C21LfV zDK7#0yD?ZQ9FCA5kFWs%fb4db)YiL!fK>v*${?-^rmyd=eeYV>TL1r?&NjfG-=om~ Tx~Ly-00000NkvXXu0mjfVCE)f literal 0 HcmV?d00001 From 6e436924400f2bfb4e04b20c1708d5cebf8ebd06 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Jan 2014 14:38:16 +0100 Subject: [PATCH 5/6] Add optimized 32x32 pixel logo --- resources/logo-32x32-optimized.png | Bin 0 -> 1116 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/logo-32x32-optimized.png diff --git a/resources/logo-32x32-optimized.png b/resources/logo-32x32-optimized.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ae9071624c589dfc328c32835134ca1225d8f7 GIT binary patch literal 1116 zcmYjPe=yr;7!T5jlCHPW4LgFe`7zZNx6$@UMMZmlCErBo5&0zqr9wE}&QM)#dRAxS zbgK2U)9bNm+S8{uKO}M8u6J{~;kw#u+aG)Hc|XtdKF{-h-sidZxt^7A z4s+1&AOeBF5Ykd|fX41`v>U*b!L~V|+^TT|5*m#*S~AVx=uw$QtwtbRK*(jz<=vUx zRN(aG;d6P!OKcv$=rRkz=kudWD!A2*qDofurOU;=FHiX)5U%fJT_EB2_Vy4!8XFq{ zLQql?(0h>(L=YHh&(=Q3px25FNAvT`=Z#@hHe0UC6)j?OIRQjETdw9RSF>jp0*EY% zcqxcNFO_Km$c!K|gCo@jl2}+0GY|-wRSFwQVLe%>41|~^QY{zOfgCJ}K@uvtGJO!l zED$e^8%P6l!txXJ%1?@U37i^y)s+l>Q)XRrR$VioBF!owAVMWsr~s`|gvwlzGEbz;7b!1_ zRiLB7miEFq6-}ZplBnqtHDg}GlBn2H4X3TMM5Zm3X}R<2{npyMK!u0?n##;lecShQjhW6pHF7+-R88fJM9i28xH4&LyC1G!3^c`ax#br7gtv|BogJ0#$XN|^7i$^28V=&M@Ais zOFV-kWabb_R62vh<<;^(Yq@&$+V%GKj+?#x_a+_+9z7Atm1?cQWOx4h+wYrOTYvny zy}iA&v%CBHFRFD~3hVHWZ zf&?!nK0@fzojmA&{)Fo5&u@Q7>RWP)D(vdLfr>4P_Coa(bl-5{(a77eaaspmR{R2I zUk*+fmyTq{xAd5wP5KZM8eX76Mo)1KZE>eJHu2T*7nYiPXx~oN36GMF={{PCIZh53 zPKv;mylm~+N!$D`QeT6o9-ldzt~*_^(t4n)a_5&<@RtKok2`|T%EPDlLe-Hkc#B&Y z&&~m_?yS3=im>mCv@0G5l6D03{_IfXz5WsRTJ`9p*q^Mp{gf$eee)irB#Mw85?eKg z!shDUw_{u4vSszDLz8@p Date: Mon, 13 Jan 2014 14:45:13 +0100 Subject: [PATCH 6/6] Use compressed logo URL --- src/ol/map.js | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/ol/map.js b/src/ol/map.js index dc5b984e85..cd34273c4a 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -77,29 +77,27 @@ ol.OL3_URL = 'http://ol3js.org/'; * @type {string} */ ol.OL3_LOGO_URL = 'data:image/png;base64,' + - 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlw' + - 'SFlzAAABxgAAAcYBF8H6RgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoA' + - 'AAQySURBVFiF7ZddUJRVGMf/z3l332XZZYFVgfwAAcsPKGoyq5GLZBxnmElADWd1prEGwkht' + - 'ugjtopHWi7hxmpoJC5A+HBxkpeyDtBkjR2Z0EsVyJEQokAp0k1A+lv143/ecLrRakGV3gYYu' + - 'eu7e8/H//+bMc57zvCSEwGwGm1X3/wKAbjqbt5z5fr4gyTo0GNl5PHuJdyoaFG4O2AF288KV' + - 'YoJ4nUAJACBAGoCvhF4ueTcjpeNfA3j53E8WISlHCVg38Qrh0iA9V75yaX2omiHnwPaW1lQu' + - '+ZoDmwMAmSTwup3n2/eGqhvSCRQ3t2XpGDkImBOqMBdwuFzGbR8+tdgzLYCXmtte1En0DgTk' + - 'UM3/CgG0+AjrKx5dfj1sADvA+i+0v00Qu8I1HgfRxwXPK38s7XzIAMGT7Z/gAlAEh8oFtLta' + - 'RAQCwIggM4JE5OaggvKVy2qDAuw5czXKbeBnAaRPZurWNIxqGhQePIfuggiFi8K6zIwPxsyN' + - 'X+yS+cFA5gLAkKLC6fFiUFFDMr8DLODROGlCHNjYdHF5QAACiBGyJxLxco6bHh9GVA3TeL4M' + - 'EpNy/AfGlOI3ABoAIvwNuAAGFRVuTZu6rV9EMrL4f485gVKAJ0bo/3bShEC/1zdj5gzAxrio' + - 'e8b8Q5cba5QtEoMmBP7wKlBnsF/ImWfGg3pETAag9t5wKtvizTAzMWPmEgG2eAvWxprgOP2d' + - 'FBBgzRq77s2aY3q9pmHXglg8bjFO29wkMexcEIvMaCMaL7aiouFbd0CAU6dK1Y5e5+VXDhzC' + - 'iGsUzyZYkDfXDJqieYKsQ0miFfdHyjjZchn7aj6FEBhTEe+pA5z4jks/9/gK9lei6/rvWGs1' + - 'oWh+DAwsPIwVJgNeTbRijo6hoqERez86Cp+ift2TvvAz/3UTluLF+UXZRDgSaZAt+57Px+q0' + - 'B9DnVfF+320MKMFvRFZsJDbMi4LH54P90Cc4fekKABw3eLmt/fPq4aAAAJD0TFEaY+JLRpS8' + - 'I28dtmatxrDGUdV3G11uZcI9EhFscVF4MtoI561BlFQeRudvN0AQb3WnLSoRpaV8/J5Jn+Ol' + - 'W7fP9araMQJlPv3EI9htywFjDN/cGsXJARc8fqV4iVHGpjgzFhn0aO3+FXuqajEwPKIIoPia' + - 'o6o6kEfQfiB982bZJaIrQdj2cGoSygptiDGboAgBp0+DS+OIlyXE6O7crhPNP6Cs9gv4VLWf' + - 'kdjUVXewaTL9kHvC5PzC3SAqu88aw17bkotVy1LHzI+4PahoaER90zkA1Ma5tr6nvrormG5Y' + - 'TWly/gu5IBwGYHooJRErkhbCYjLiF2c/zv7YgaFRNwBxQid7bJ01NUOhaIbdlqfYCjIElz4G' + - 'RMa4KS8B+7sxWCocjpAfj7ABAIDsdpbU1ruBgFUCwsogrgqmr++ufe9a2Fr//5zONsCf36PQ' + - '/7qoH28AAAAASUVORK5CYII='; + 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBI' + + 'WXMAAAHGAAABxgEXwfpGAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAA' + + 'AhNQTFRF////AP//AICAgP//AFVVQECA////K1VVSbbbYL/fJ05idsTYJFtbbcjbJllmZszW' + + 'WMTOIFhoHlNiZszTa9DdUcHNHlNlV8XRIVdiasrUHlZjIVZjaMnVH1RlIFRkH1RkH1ZlasvY' + + 'asvXVsPQH1VkacnVa8vWIVZjIFRjVMPQa8rXIVVkXsXRsNveIFVkIFZlIVVj3eDeh6GmbMvX' + + 'H1ZkIFRka8rWbMvXIFVkIFVjIFVkbMvWH1VjbMvWIFVlbcvWIFVla8vVIFVkbMvWbMvVH1Vk' + + 'bMvWIFVlbcvWIFVkbcvVbMvWjNPbIFVkU8LPwMzNIFVkbczWIFVkbsvWbMvXIFVkRnB8bcvW' + + '2+TkW8XRIFVkIlZlJVloJlpoKlxrLl9tMmJwOWd0Omh1RXF8TneCT3iDUHiDU8LPVMLPVcLP' + + 'VcPQVsPPVsPQV8PQWMTQWsTQW8TQXMXSXsXRX4SNX8bSYMfTYcfTYsfTY8jUZcfSZsnUaIqT' + + 'acrVasrVa8jTa8rWbI2VbMvWbcvWdJObdcvUdszUd8vVeJaee87Yfc3WgJyjhqGnitDYjaar' + + 'ldPZnrK2oNbborW5o9bbo9fbpLa6q9ndrL3ArtndscDDutzfu8fJwN7gwt7gxc/QyuHhy+Hi' + + 'zeHi0NfX0+Pj19zb1+Tj2uXk29/e3uLg3+Lh3+bl4uXj4ufl4+fl5Ofl5ufl5ujm5+jmySDn' + + 'BAAAAFp0Uk5TAAECAgMEBAYHCA0NDg4UGRogIiMmKSssLzU7PkJJT1JTVFliY2hrdHZ3foSF' + + 'hYeJjY2QkpugqbG1tre5w8zQ09XY3uXn6+zx8vT09vf4+Pj5+fr6/P39/f3+gz7SsAAAAVVJ' + + 'REFUOMtjYKA7EBDnwCPLrObS1BRiLoJLnte6CQy8FLHLCzs2QUG4FjZ5GbcmBDDjxJBXDWxC' + + 'Brb8aM4zbkIDzpLYnAcE9VXlJSWlZRU13koIeW57mGx5XjoMZEUqwxWYQaQbSzLSkYGfKFSe' + + '0QMsX5WbjgY0YS4MBplemI4BdGBW+DQ11eZiymfqQuXZIjqwyadPNoSZ4L+0FVM6e+oGI6g8' + + 'a9iKNT3o8kVzNkzRg5lgl7p4wyRUL9Yt2jAxVh6mQCogae6GmflI8p0r13VFWTHBQ0rWPW7a' + + 'hgWVcPm+9cuLoyy4kCJDzCm6d8PSFoh0zvQNC5OjDJhQopPPJqph1doJBUD5tnkbZiUEqaCn' + + 'B3bTqLTFG1bPn71kw4b+GFdpLElKIzRxxgYgWNYc5SCENVHKeUaltHdXx0dZ8uBI1hJ2UUDg' + + 'q82CM2MwKeibqAvSO7MCABq0wXEPiqWEAAAAAElFTkSuQmCC'; /**