diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/CustomContentManager.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/CustomContentManager.java index 9f1b5f9266..5b8908948c 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/CustomContentManager.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/CustomContentManager.java @@ -55,6 +55,7 @@ public class CustomContentManager { static { defaultExtensionLoaders.put("KHR_materials_pbrSpecularGlossiness", new PBRSpecGlossExtensionLoader()); + defaultExtensionLoaders.put("KHR_lights_punctual", new LightsPunctualExtensionLoader()); defaultExtensionLoaders.put("KHR_materials_unlit", new UnlitExtensionLoader()); } diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java index adbd6c685f..414edb7c14 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java @@ -167,7 +167,10 @@ protected Object loadFromStream(AssetInfo assetInfo, InputStream stream) throws //only one scene let's not return the root. if (rootNode.getChildren().size() == 1) { - rootNode = (Node) rootNode.getChild(0); + Node child = (Node) rootNode.getChild(0); + //Migrate lights that were in the parent to the child. + rootNode.getLocalLightList().forEach(child::addLight); + rootNode = child; } //no name for the scene... let's set the file name. if (rootNode.getName() == null) { diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/LightsPunctualExtensionLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/LightsPunctualExtensionLoader.java new file mode 100644 index 0000000000..a98c500fa7 --- /dev/null +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/LightsPunctualExtensionLoader.java @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2009-2021 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.scene.plugins.gltf; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.jme3.asset.AssetKey; +import com.jme3.asset.AssetLoadException; +import com.jme3.light.DirectionalLight; +import com.jme3.light.Light; +import com.jme3.light.PointLight; +import com.jme3.light.SpotLight; +import com.jme3.math.ColorRGBA; +import com.jme3.math.FastMath; +import com.jme3.math.Vector3f; +import com.jme3.scene.Node; +import com.jme3.scene.control.LightControl; + +import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; + +import static com.jme3.scene.plugins.gltf.GltfUtils.getAsColor; +import static com.jme3.scene.plugins.gltf.GltfUtils.getAsFloat; + +/** + * Extension loader for KHR_lights_punctual extension which allows + * for lights to be added to the node from the gltf model. + * + * Supports directional, point, and spot lights. + * + * Created by Trevor Flynn - 3/23/2021 + */ +public class LightsPunctualExtensionLoader implements ExtensionLoader { + + private final HashSet pendingNodes = new HashSet<>(); + private final HashMap lightDefinitions = new HashMap<>(); + + @Override + public Object handleExtension(GltfLoader loader, String parentName, JsonElement parent, JsonElement extension, Object input) { + if (input instanceof Node) { //We are processing a node + JsonObject jsonObject = extension.getAsJsonObject(); + if (jsonObject.has("light")) { //These will get run first when loading the gltf file + //Add node to queue + JsonElement indexElement = jsonObject.get("light"); + int index = indexElement.getAsInt(); + if (!lightDefinitions.containsKey(index)) { + pendingNodes.add(new NodeNeedingLight((Node) input, index)); + } else { + addLight((Node) input, (Node) input, index); + } + } else if (jsonObject.has("lights")) { //This will get run last + //Process the light definitions + JsonArray lights = jsonObject.getAsJsonArray("lights"); + + for (int i = 0; i < lights.size(); i++) { + //Create light definition + JsonObject light = lights.get(i).getAsJsonObject(); + String type = light.get("type").getAsString(); + + Light lightNode; + switch (type) { + case "point": + lightNode = buildPointLight(light); + break; + case "directional": + lightNode = buildDirectionalLight(light); + break; + case "spot": + lightNode = buildSpotLight(light); + break; + default: + throw new AssetLoadException("KHR_lights_punctual unsupported light type: " + type); + } + + lightDefinitions.put(i, lightNode); + } + + //Build any lights that are pending now that we have definitions + for (NodeNeedingLight nodeInNeed : pendingNodes) { + addLight((Node) input, nodeInNeed.getNode(), nodeInNeed.getLightIndex()); + } + pendingNodes.clear(); + } else { + throw new AssetLoadException("KHR_lights_punctual extension malformed json"); + } + + return input; + } else { + throw new AssetLoadException("KHR_lights_punctual extension added on unsupported element"); + } + } + + /** + * Build a spot light from gltf json. + * @param obj The gltf json object for the spot light + * @return A spot light representation of the gltf object + */ + private SpotLight buildSpotLight(JsonObject obj) { + //Get properties + String name = obj.has("name") ? obj.get("name").getAsString() : ""; + + float intensity = obj.has("intensity") ? obj.get("intensity").getAsFloat() : 1.0f; + ColorRGBA color = obj.has("color") ? GltfUtils.getAsColor(obj, "color") : new ColorRGBA(ColorRGBA.White); + color = lumensToColor(color, intensity); + float range = obj.has("range") ? obj.get("range").getAsFloat() : Float.POSITIVE_INFINITY; + + //Spot specific + JsonObject spot = obj.getAsJsonObject("spot"); + float innerConeAngle = spot != null && spot.has("innerConeAngle") ? spot.get("innerConeAngle").getAsFloat() : 0f; + float outerConeAngle = spot != null && spot.has("outerConeAngle") ? spot.get("outerConeAngle").getAsFloat() : ((float) Math.PI) / 4f; + + /* + Correct floating point error on half PI, GLTF spec says that the outerConeAngle + can be less or equal to PI/2, but JME requires less than PI/2. + We will bring the angle within PI/2 if it is equal or larger than PI/2 + */ + if (outerConeAngle >= FastMath.HALF_PI) { + outerConeAngle = FastMath.HALF_PI - 0.000001f; + } + + SpotLight spotLight = new SpotLight(); + spotLight.setName(name); + spotLight.setColor(color); + spotLight.setSpotRange(range); + spotLight.setSpotInnerAngle(innerConeAngle); + spotLight.setSpotOuterAngle(outerConeAngle); + spotLight.setDirection(Vector3f.UNIT_Z.negate()); + + return spotLight; + } + + /** + * Build a directional light from gltf json. + * @param obj The gltf json object for the directional light + * @return A directional light representation of the gltf object + */ + private DirectionalLight buildDirectionalLight(JsonObject obj) { + //Get properties + String name = obj.has("name") ? obj.get("name").getAsString() : ""; + + float intensity = obj.has("intensity") ? obj.get("intensity").getAsFloat() : 1.0f; + ColorRGBA color = obj.has("color") ? GltfUtils.getAsColor(obj, "color") : new ColorRGBA(ColorRGBA.White); + color = lumensToColor(color, intensity); + + DirectionalLight directionalLight = new DirectionalLight(); + directionalLight.setName(name); + directionalLight.setColor(color); + directionalLight.setDirection(Vector3f.UNIT_Z.negate()); + + return directionalLight; + } + + /** + * Build a point light from gltf json. + * @param obj The gltf json object for the point light + * @return A point light representation of the gltf object + */ + private PointLight buildPointLight(JsonObject obj) { + //Get properties + String name = obj.has("name") ? obj.get("name").getAsString() : ""; + + float intensity = obj.has("intensity") ? obj.get("intensity").getAsFloat() : 1.0f; + ColorRGBA color = obj.has("color") ? GltfUtils.getAsColor(obj, "color") : new ColorRGBA(ColorRGBA.White); + color = lumensToColor(color, intensity); + float range = obj.has("range") ? obj.get("range").getAsFloat() : Float.POSITIVE_INFINITY; + + PointLight pointLight = new PointLight(); + pointLight.setName(name); + pointLight.setColor(color); + pointLight.setRadius(range); + + return pointLight; + } + + /** + * Attach a light at the given index to the given parent node, + * and the control for the light to the given node. + * @param parent The node to attach the light to + * @param node The node to attach the light control to + * @param lightIndex The index of the light + */ + private void addLight(Node parent, Node node, int lightIndex) { + if (lightDefinitions.containsKey(lightIndex)) { + Light light = lightDefinitions.get(lightIndex); + parent.addLight(light); + LightControl control = new LightControl(light); + node.addControl(control); + } else { + throw new AssetLoadException("KHR_lights_punctual extension accessed undefined light at index " + lightIndex); + } + } + + /** + * Convert a floating point lumens value into a color that + * represents both color and brightness of the light. + * + * @param color The base color of the light + * @param lumens The lumnes value to convert to a color + * @return A color representing the intensity of the given lumens encoded into the given color + */ + private ColorRGBA lumensToColor(ColorRGBA color, float lumens) { + ColorRGBA brightnessModifier = lumensToColor(lumens); + return color.mult(brightnessModifier); + } + + /** + * Convert a floating point lumens value into a grayscale color that + * represents a brightness. + * + * @param lumens The lumnes value to convert to a color + * @return A color representing the intensity of the given lumens + */ + private ColorRGBA lumensToColor(float lumens) { + /* + Taken from /Common/ShaderLib/Hdr.glsllib + vec4 HDR_EncodeLum(in float lum){ + float Le = 2.0 * log2(lum + epsilon) + 127.0; + vec4 result = vec4(0.0); + result.a = fract(Le); + result.rgb = vec3((Le - (floor(result.a * 255.0)) / 255.0) / 255.0); + return result; + */ + float epsilon = 0.0001f; + + double Le = 2f * Math.log(lumens * epsilon) / Math.log(2) + 127.0; + ColorRGBA color = new ColorRGBA(); + color.a = (float) (Le - Math.floor(Le)); //Get fractional part + float val = (float) ((Le - (Math.floor(color.a * 255.0)) / 255.0) / 255.0); + color.r = val; + color.g = val; + color.b = val; + + return color; + } + + /** + * A bean to contain the relation between a node and a light index + */ + private static class NodeNeedingLight { + private Node node; + private int lightIndex; + + private NodeNeedingLight(Node node, int lightIndex) { + this.node = node; + this.lightIndex = lightIndex; + } + + private Node getNode() { + return node; + } + + private void setNode(Node node) { + this.node = node; + } + + private int getLightIndex() { + return lightIndex; + } + + private void setLightIndex(int lightIndex) { + this.lightIndex = lightIndex; + } + } +} diff --git a/jme3-plugins/src/test/java/com/jme3/scene/plugins/gltf/GltfLoaderTest.java b/jme3-plugins/src/test/java/com/jme3/scene/plugins/gltf/GltfLoaderTest.java index 952f3ae380..d9b873afa9 100644 --- a/jme3-plugins/src/test/java/com/jme3/scene/plugins/gltf/GltfLoaderTest.java +++ b/jme3-plugins/src/test/java/com/jme3/scene/plugins/gltf/GltfLoaderTest.java @@ -33,7 +33,12 @@ import com.jme3.asset.AssetLoadException; import com.jme3.asset.AssetManager; +import com.jme3.light.DirectionalLight; +import com.jme3.light.Light; +import com.jme3.light.PointLight; +import com.jme3.light.SpotLight; import com.jme3.material.plugin.TestMaterialWrite; +import com.jme3.math.Vector3f; import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.Spatial; @@ -79,16 +84,43 @@ public void testLoadEmptyScene() { } } + @Test + public void testLightsPunctualExtension() { + try { + Spatial scene = assetManager.loadModel("gltf/lights/lights.gltf"); + dumpScene(scene, 0); + } catch (AssetLoadException ex) { + ex.printStackTrace(); + Assert.fail("Failed to import gltf model with lights punctual extension"); + } + } + private void dumpScene(Spatial s, int indent) { System.err.print(indentString.substring(0, indent) + s.getName() + " (" + s.getClass().getSimpleName() + ") / " + s.getLocalTransform().getTranslation().toString() + ", " + s.getLocalTransform().getRotation().toString() + ", " + s.getLocalTransform().getScale().toString()); - if (s instanceof Geometry) - { + if (s instanceof Geometry) { System.err.print(" / " + ((Geometry) s).getMaterial()); } System.err.println(); + for (Light light : s.getLocalLightList()) { + System.err.print(indentString.substring(0, indent + 1) + " (" + light.getClass().getSimpleName() + ")"); + if (light instanceof SpotLight) { + Vector3f pos = ((SpotLight) light).getPosition(); + Vector3f dir = ((SpotLight) light).getDirection(); + System.err.println(" " + pos.toString() + ", " + dir.toString()); + } else if (light instanceof PointLight) { + Vector3f pos = ((PointLight) light).getPosition(); + System.err.println(" " + pos.toString()); + } else if (light instanceof DirectionalLight) { + Vector3f dir = ((DirectionalLight) light).getDirection(); + System.err.println(" " + dir.toString()); + } else { + System.err.println(); + } + } + if (s instanceof Node) { Node n = (Node) s; for (Spatial spatial : n.getChildren()) { diff --git a/jme3-plugins/src/test/resources/gltf/lights/MODEL_ROUNDED_CUBE_PART_1/indices.bin b/jme3-plugins/src/test/resources/gltf/lights/MODEL_ROUNDED_CUBE_PART_1/indices.bin new file mode 100644 index 0000000000..f178d8db9c Binary files /dev/null and b/jme3-plugins/src/test/resources/gltf/lights/MODEL_ROUNDED_CUBE_PART_1/indices.bin differ diff --git a/jme3-plugins/src/test/resources/gltf/lights/MODEL_ROUNDED_CUBE_PART_1/normals.bin b/jme3-plugins/src/test/resources/gltf/lights/MODEL_ROUNDED_CUBE_PART_1/normals.bin new file mode 100644 index 0000000000..bdbda393f8 --- /dev/null +++ b/jme3-plugins/src/test/resources/gltf/lights/MODEL_ROUNDED_CUBE_PART_1/normals.bin @@ -0,0 +1,385 @@ +���~����;Ϡ�,e}���;Ϡ�,e}�������~�����Ϡ�,e}���;v����u�6v�;v����u�6v��Ϡ�,e}����v����u�6v�;ʋԾ��h�k;ʋԾ��h�k�v����u�6v��ʋԾ��h�k;�\ +��bW�SM;�\ +��bW�SM�ʋԾ��h�k��\ +��bW�SM;��'�B{A��L?;��'�B{A��L?��\ +��bW�SM���'�B{A��L?;B{A���'��L?;B{A���'��L?���'�B{A��L?�B{A���'��L?;�bW��\ +�SM;�bW��\ +�SM�B{A���'��L?��bW��\ +�SM;��h���Ծk;��h���Ծk��bW��\ +�SM���h���Ծk;��u�v��6v�;��u�v��6v����h���Ծk���u�v��6v�;,e}�Ϡ���;,e}�Ϡ������u�v��6v��,e}�Ϡ���;~�������;~��������,e}�Ϡ����������~�?���Ϡ�,e}?��;Ϡ�,e}?��;���~�?���Ϡ�,e}?6v��v����u?6v�;v����u?��;Ϡ�,e}?6v��v����u?k���Ծ��h?k;��Ծ��h?6v�;v����u?k���Ծ��h?SM��\ +��bW?SM;�\ +��bW?k;��Ծ��h?SM��\ +��bW?�L?���'�B{A?�L?;��'�B{A?SM;�\ +��bW?�L?���'�B{A?�L?�B{A���'?�L?;B{A���'?�L?;��'�B{A?�L?�B{A���'?SM��bW��\ +?SM;�bW��\ +?�L?;B{A���'?SM��bW��\ +?k���h����>k;��h����>SM;�bW��\ +?k���h����>6v����u�v�>6v�;��u�v�>k;��h����>6v����u�v�>���,e}�Ϡ>��;,e}�Ϡ>6v�;��u�v�>���,e}�Ϡ>���~����;��;~����;��;,e}�Ϡ>~�������;,e}����Ϡ>,e}���;Ϡ>~����;��;,e}����Ϡ>��u�6v��v�>��u�6v�;v�>,e}���;Ϡ>��u�6v��v�>��h�k����>��h�k;���>��u�6v�;v�>��h�k����>�bW�SM��\ +?�bW�SM;�\ +?��h�k;���>�bW�SM��\ +?B{A��L?���'?B{A��L?;��'?�bW�SM;�\ +?B{A��L?���'?��'��L?�B{A?��'��L?;B{A?B{A��L?;��'?��'��L?�B{A?�\ +�SM��bW?�\ +�SM;�bW?��'��L?;B{A?�\ +�SM��bW?��Ծk���h?��Ծk;��h?�\ +�SM;�bW?��Ծk���h?v��6v����u?v��6v�;��u?��Ծk;��h?v��6v����u?�����,e}?����;,e}?v��6v�;��u?�����,e}?������~�?�����;~�?����;,e}?~�?�����;,e}?Ϡ���;,e}?Ϡ����~�?������,e}?Ϡ���;��u?v��6v�;��u?v��6v��,e}?Ϡ������u?v��6v�;��h?��Ծk;��h?��Ծk���u?v��6v����h?��Ծk;�bW?�\ +�SM;�bW?�\ +�SM���h?��Ծk��bW?�\ +�SM;B{A?��'��L?;B{A?��'��L?��bW?�\ +�SM�B{A?��'��L?;��'?B{A��L?;��'?B{A��L?�B{A?��'��L?���'?B{A��L?;�\ +?�bW�SM;�\ +?�bW�SM���'?B{A��L?��\ +?�bW�SM;ʋ�>��h�k;ʋ�>��h�k��\ +?�bW�SM�ʋ�>��h�k;v�>��u�6v�;v�>��u�6v��ʋ�>��h�k�v�>��u�6v�;Ϡ>,e}���;Ϡ>,e}����v�>��u�6v��Ϡ>,e}���;��;~����;��;~�����Ϡ>,e}������;���~�?�>���,e}?�>��;,e}?��;��;~�?�>���,e}?v�>6v����u?v�>6v�;��u?�>��;,e}?v�>6v����u?���>k���h?���>k;��h?v�>6v�;��u?���>k���h?�\ +?SM��bW?�\ +?SM;�bW?���>k;��h?�\ +?SM��bW?��'?�L?�B{A?��'?�L?;B{A?�\ +?SM;�bW?��'?�L?�B{A?B{A?�L?���'?B{A?�L?;��'?��'?�L?;B{A?B{A?�L?���'?�bW?SM��\ +?�bW?SM;�\ +?B{A?�L?;��'?�bW?SM��\ +?��h?k����>��h?k;���>�bW?SM;�\ +?��h?k����>��u?6v��v�>��u?6v�;v�>��h?k;���>��u?6v��v�>,e}?���Ϡ>,e}?��;Ϡ>��u?6v�;v�>,e}?���Ϡ>~�?�����;~�?��;��;,e}?��;Ϡ>~����;��;,e}�Ϡ>��;,e}�Ϡ>���~����;���,e}�Ϡ>��;��u�v�>6v�;��u�v�>6v��,e}�Ϡ>�����u�v�>6v�;��h����>k;��h����>k���u�v�>6v����h����>k;�bW��\ +?SM;�bW��\ +?SM���h����>k��bW��\ +?SM;B{A���'?�L?;B{A���'?�L?��bW��\ +?SM�B{A���'?�L?;¡'�1{A?�L?;¡'�1{A?�L?�B{A���'?�L?�¡'�1{A?�L?;�\ +��bW?SM;�\ +��bW?SM�¡'�1{A?�L?��\ +��bW?SM;��Ծ��h?k;��Ծ��h?k��\ +��bW?SM���Ծ��h?k;U����u?6v�;U����u?6v����Ծ��h?k�U����u?6v�;Ϡ�,e}?��;Ϡ�,e}?���U����u?6v��Ϡ�,e}?��;���~�?��;���~�?���Ϡ�,e}?������~�?��;���,e}?Ϡ>��;,e}?Ϡ>��;~�?��;���,e}?Ϡ>6v����u?U�>6v�;��u?U�>��;,e}?Ϡ>6v����u?U�>k���h?���>k;��h?���>6v�;��u?U�>k���h?���>SM��bW?�\ +?SM;�bW?�\ +?k;��h?���>SM��bW?�\ +?�L?�1{A?¡'?�L?;1{A?¡'?SM;�bW?�\ +?�L?�1{A?¡'?�L?���'?B{A?�L?;��'?B{A?�L?;1{A?¡'?�L?���'?B{A?SM��\ +?�bW?SM;�\ +?�bW?�L?;��'?B{A?SM��\ +?�bW?k����>��h?k;���>��h?SM;�\ +?�bW?k����>��h?6v��v�>��u?6v�;v�>��u?k;���>��h?6v��v�>��u?���Ϡ>,e}?��;Ϡ>,e}?6v�;v�>��u?���Ϡ>,e}?�����;~�?��;��;~�?��;Ϡ>,e}?��;~�?��;Ϡ>,e}?��;Ϡ>,e}?�����;~�?���Ϡ>,e}?��;U�>��u?6v�;U�>��u?6v��Ϡ>,e}?���U�>��u?6v�;���>��h?k;���>��h?k�U�>��u?6v�����>��h?k;�\ +?�bW?SM;�\ +?�bW?SM����>��h?k��\ +?�bW?SM;¡'?1{A?�L?;¡'?1{A?�L?��\ +?�bW?SM�¡'?1{A?�L?;B{A?��'?�L?;B{A?��'?�L?�¡'?1{A?�L?�B{A?��'?�L?;�bW?�\ +?SM;�bW?�\ +?SM�B{A?��'?�L?��bW?�\ +?SM;��h?���>k;��h?���>k��bW?�\ +?SM���h?���>k;��u?v�>6v�;��u?v�>6v����h?���>k���u?v�>6v�;,e}?Ϡ>��;,e}?Ϡ>�����u?v�>6v��,e}?Ϡ>��;~�?��;��;~�?��;���,e}?Ϡ>���~����;���,e}���;Ϡ�,e}����Ϡ�~��������,e}���;Ϡ���u�6v�;v����u�6v��v��,e}����Ϡ���u�6v�;v����h�k;��Ծ��h�k���Ծ��u�6v��v����h�k;��Ծ�bW�SM;�\ +��bW�SM��\ +���h�k���Ծ�bW�SM;�\ +�B{A��L?;��'�B{A��L?���'��bW�SM��\ +�B{A��L?;��'���'��L?;B{A���'��L?�B{A�B{A��L?���'���'��L?;B{A��\ +�SM;�bW��\ +�SM��bW���'��L?�B{A��\ +�SM;�bW���Ծk;��h���Ծk���h��\ +�SM��bW���Ծk;��h�v��6v�;��u�v��6v����u���Ծk���h�v��6v�;��u�����;,e}������,e}�v��6v����u�����;,e}������;~��������~�������,e}������;~�����Ϡ>,e}���;Ϡ>,e}���;��;~�����Ϡ>,e}�6v��v�>��u�6v�;v�>��u���;Ϡ>,e}�6v��v�>��u�k����>��h�k;���>��h�6v�;v�>��u�k����>��h�SM��\ +?�bW�SM;�\ +?�bW�k;���>��h�SM��\ +?�bW��L?���'?B{A��L?;��'?B{A�SM;�\ +?�bW��L?���'?B{A��L?�1{A?¡'��L?;1{A?¡'��L?;��'?B{A��L?�1{A?¡'�SM��bW?�\ +�SM;�bW?�\ +��L?;1{A?¡'�SM��bW?�\ +�k���h?��Ծk;��h?��ԾSM;�bW?�\ +�k���h?��Ծ6v����u?U��6v�;��u?U��k;��h?��Ծ6v����u?U�����,e}?Ϡ���;,e}?Ϡ�6v�;��u?U�����,e}?Ϡ����~�?�����;~�?�����;,e}?Ϡ���;��;~���>��;,e}��>���,e}���;���~���>��;,e}�v�>6v�;��u�v�>6v����u��>���,e}�v�>6v�;��u����>k;��h����>k���h�v�>6v����u����>k;��h��\ +?SM;�bW��\ +?SM��bW����>k���h��\ +?SM;�bW���'?�L?;B{A���'?�L?�B{A��\ +?SM��bW���'?�L?;B{A�B{A?�L?;��'�B{A?�L?���'���'?�L?�B{A�B{A?�L?;��'��bW?SM;�\ +��bW?SM��\ +�B{A?�L?���'��bW?SM;�\ +���h?k;��Ծ��h?k���Ծ�bW?SM��\ +���h?k;��Ծ��u?6v�;v����u?6v��v����h?k���Ծ��u?6v�;v��,e}?��;Ϡ�,e}?���Ϡ���u?6v��v��,e}?��;Ϡ�~�?��;���~�?������,e}?���Ϡ����~��������,e}�Ϡ���;,e}�Ϡ���;~��������,e}�Ϡ�6v����u�v��6v�;��u�v����;,e}�Ϡ�6v����u�v��k���h���Ծk;��h���Ծ6v�;��u�v��k���h���ԾSM��bW��\ +�SM;�bW��\ +�k;��h���ԾSM��bW��\ +��L?�B{A���'��L?;B{A���'�SM;�bW��\ +��L?�B{A���'��L?���'�B{A��L?;��'�B{A��L?;B{A���'��L?���'�B{A�SM��\ +��bW�SM;�\ +��bW��L?;��'�B{A�SM��\ +��bW�k���Ծ��h�k;��Ծ��h�SM;�\ +��bW�k���Ծ��h�6v��v����u�6v�;v����u�k;��Ծ��h�6v��v����u����Ϡ�,e}���;Ϡ�,e}�6v�;v����u����Ϡ�,e}�������~����;���~����;Ϡ�,e}�������~�?��;���~�?��;��;~�?�����;~�?���~�?��;��;~�?��;��;~�?������~�?��������;~����;��;~����;���~��������~�����~�������;~�������;~����;���~����;~�?�����;~�?������~�?��;���~�?��;��;~��������~�������;~����;��;~����;���,e}����Ϡ>~�������;,e}�Ϡ���;�z�d;��;>�z�d;��;>,e}�Ϡ���;��u�v��6v�;��s��y��� >��s��y��� >��u�v��6v�;��h���Ծk;��g�{оJ��=��g�{оJ��=��h���Ծk;�bW��\ +�SM;��V�?;�B"�=��V�?;�B"�=�bW��\ +�SM;B{A���'��L?;U�@��$&�;��=U�@��$&�;��=B{A���'��L?;��'�B{A��L?;�$&�U�@�;��=�$&�U�@�;��=��'�B{A��L?;�\ +��bW�SM;.;���V�B"�=.;���V�B"�=�\ +��bW�SM;ʋԾ��h�k;�о��g�J��=�о��g�J��=ʋԾ��h�k;v����u�6v�;z����s�� >z����s�� >v����u�6v�;Ϡ�,e}���;�;��z�d;>Ϡ�,e}���;���~����;���,e}�Ϡ>�;��z�d;>�;��z�d;>���,e}�Ϡ>6v����u�v�>� ���s�z�>� ���s�z�>6v����u�v�>k���h����>J�����g�{�>J�����g�{�>k���h����>SM��bW��\ +?B"����V�.;?B"����V�.;?SM��bW��\ +?�L?�B{A���'?;��U�@��$&?;��U�@��$&?�L?�B{A���'?�L?���'�B{A?;���$&�U�@?;���$&�U�@?�L?���'�B{A?SM��\ +��bW?B"��.;���V?B"��.;���V?SM��\ +��bW?k���Ծ��h?J����о��g?J����о��g?k���Ծ��h?6v��v����u?� �z����s?� �z����s?6v��v����u?���Ϡ�,e}?d;��;��z?���Ϡ�,e}?������~�?�����,e}?d;��;��z?d;��;��z?�����,e}?v��6v����u?z��� ���s?z��� ���s?v��6v����u?��Ծk���h?�оJ�����g?�оJ�����g?��Ծk���h?�\ +�SM��bW?.;�B"����V?.;�B"����V?�\ +�SM��bW?��'��L?�B{A?�$&�;��U�@?�$&�;��U�@?��'��L?�B{A?B{A��L?���'?U�@�;���$&?U�@�;���$&?B{A��L?���'?�bW�SM��\ +?��V�B"��.;?��V�B"��.;?�bW�SM��\ +?��h�k����>��g�J�����>��g�J�����>��h�k����>��u�6v��v�>��s�� �z�>��s�� �z�>��u�6v��v�>,e}����Ϡ>�z�d;��;>��s�� �z�>�z�d;��;>��s��y��� >OYm�r������>OYm�r������>��s��y��� >��g�{оJ��=#�b�shɾ�^|>#�b�shɾ�^|>��g�{оJ��=��V�?;�B"�=l�R���� l>l�R���� l>��V�?;�B"�=U�@��$&�;��=Na=���"��3b>Na=���"��3b>U�@��$&�;��=�$&�U�@�;��=��"�Na=��3b>��"�Na=��3b>�$&�U�@�;��=.;���V�B"�=��l�R�� l>��l�R�� l>.;���V�B"�=�о��g�J��=shɾ#�b��^|>shɾ#�b��^|>�о��g�J��=z����s�� >����OYm�r��>z����s�� >�;��z�d;>� ���s�z�>����OYm�r��>����OYm�r��>� ���s�z�>J�����g�{�>�^|�#�b�sh�>�^|�#�b�sh�>J�����g�{�>B"����V�.;?� l�l�R��?� l�l�R��?B"����V�.;?;��U�@��$&?�3b�Na=���"?�3b�Na=���"?;��U�@��$&?;���$&�U�@?�3b���"�Na=?�3b���"�Na=?;���$&�U�@?B"��.;���V?� l���l�R?� l���l�R?B"��.;���V?J����о��g?�^|�shɾ#�b?�^|�shɾ#�b?J����о��g?� �z����s?r�������>Ym?� �z����s?d;��;��z?z��� ���s?r�������>Ym?r�������>Ym?z��� ���s?�оJ�����g?shɾ�^|�#�b?shɾ�^|�#�b?�оJ�����g?.;�B"����V?��� l�l�R?��� l�l�R?.;�B"����V?�$&�;��U�@?��"��3b�Na=?��"��3b�Na=?�$&�;��U�@?U�@�;���$&?Na=��3b���"?Na=��3b���"?U�@�;���$&?��V�B"��.;?l�R�� l��?l�R�� l��?��V�B"��.;?��g�J�����>#�b��^|�sh�>#�b��^|�sh�>��g�J�����>��s�� �z�>OYm�r������>#�b��^|�sh�>OYm�r������>#�b�shɾ�^|>��Y��=���=�>��Y��=���=�>#�b�shɾ�^|>l�R���� l>rL�����Ư>rL�����Ư>l�R���� l>Na=���"��3b>�8����W�>�8����W�>Na=���"��3b>��"�Na=��3b>����8�5�>����8�5�>��"�Na=��3b>��l�R�� l>���rL��Ư>���rL��Ư>��l�R�� l>shɾ#�b��^|>�=����Y��=�>shɾ#�b��^|>����OYm�r��>�^|�#�b�sh�>�=����Y��=�>�=����Y��=�>�^|�#�b�sh�>� l�l�R��?�Ư�rL���>�Ư�rL���>� l�l�R��?�3b�Na=���"?W짾�8���?W짾�8���?�3b�Na=���"?�3b���"�Na=?5짾����8?5짾����8?�3b���"�Na=?� l���l�R?ǯ����rL?ǯ����rL?� l���l�R?�^|�shɾ#�b?�=���=����Y?�^|�shɾ#�b?r�������>Ym?shɾ�^|�#�b?�=���=����Y?�=���=����Y?shɾ�^|�#�b?��� l�l�R?����Ư�rL?����Ư�rL?��� l�l�R?��"��3b�Na=?���W짾�8?���W짾�8?��"��3b�Na=?Na=��3b���"?�8�5짾��?�8�5짾��?Na=��3b���"?l�R�� l��?rL��Ư���>rL��Ư���>l�R�� l��?#�b��^|�sh�>��Y��=���=�>rL��Ư���>��Y��=���=�>rL�����Ư>�"B���뾋��>�"B���뾋��>rL�����Ư>�8����W�>-z/�x���>-z/�x���>�8����W�>����8�5�>x�-z/���>x�-z/���>����8�5�>���rL��Ư>��뾒"B����>���rL��Ư>�=����Y��=�>�Ư�rL���>��뾒"B����>��뾒"B����>�Ư�rL���>W짾�8���?�޾-z/�x?�޾-z/�x?W짾�8���?5짾����8?�޾x�-z/?�޾x�-z/?5짾����8?ǯ����rL?��뾋�뾒"B?ǯ����rL?�=���=����Y?����Ư�rL?��뾋�뾒"B?��뾋�뾒"B?����Ư�rL?���W짾�8?x��޾-z/?x��޾-z/?���W짾�8?�8�5짾��?-z/��޾-x?-z/��޾-x?�8�5짾��?rL��Ư���>�"B���뾋��>-z/��޾-x?�"B���뾋��>-z/�x���>�%� +� +?�%� +� +?-z/�x���>x�-z/���> +� �%� +?x�-z/���>��뾒"B����>�޾-z/�x? +� �%� +? +� �%� +?�޾-z/�x?�޾x�-z/? +� +��%?�޾x�-z/?��뾋�뾒"B?x��޾-z/? +� +��%? +� +��%?x��޾-z/?-z/��޾-x?�%� +� +?�%� +� +? +� �%� +? +� +��%?��;,e}�Ϡ>��;~����;Ϡ>,e}���;�;>�z�d;>�;>�z�d;>Ϡ>,e}���;v�>��u�6v�;z�>��s�� >z�>��s�� >v�>��u�6v�;ʋ�>��h�k;��>��g�J��=��>��g�J��=ʋ�>��h�k;�\ +?�bW�SM;.;?��V�B"�=.;?��V�B"�=�\ +?�bW�SM;��'?B{A��L?;�$&?U�@�;��=�$&?U�@�;��=��'?B{A��L?;B{A?��'��L?;U�@?�$&�;��=U�@?�$&�;��=B{A?��'��L?;�bW?�\ +�SM;��V?.;�B"�=��V?.;�B"�=�bW?�\ +�SM;��h?��Ծk;��g?{оJ��=��g?{оJ��=��h?��Ծk;��u?v��6v�;��s?z��� >��s?z��� >��u?v��6v�;,e}?Ϡ���;�z?d;�d;>,e}?Ϡ���;~�?�����;,e}?���Ϡ>�z?d;�d;>�z?d;�d;>,e}?���Ϡ>��u?6v��v�>��s?� �z�>��s?� �z�>��u?6v��v�>��h?k����>��g?J�����>��g?J�����>��h?k����>�bW?SM��\ +?��V?B"��.;?��V?B"��.;?�bW?SM��\ +?B{A?�L?���'?U�@?;���$&?U�@?;���$&?B{A?�L?���'?��'?�L?�B{A?�$&?;��U�@?�$&?;��U�@?��'?�L?�B{A?�\ +?SM��bW?.;?B"����V?.;?B"����V?�\ +?SM��bW?���>k���h?��>J�����g?��>J�����g?���>k���h?v�>6v����u?z�>� ���s?z�>� ���s?v�>6v����u?�>���,e}?d;>�;��z?�>���,e}?��;���~�?��;Ϡ�,e}?d;>�;��z?d;>�;��z?��;Ϡ�,e}?6v�;v����u?� >z����s?� >z����s?6v�;v����u?k;��Ծ��h?J��=�о��g?J��=�о��g?k;��Ծ��h?SM;�\ +��bW?B"�=.;���V?B"�=.;���V?SM;�\ +��bW?�L?;��'�B{A?;��=�$&�U�@?;��=�$&�U�@?�L?;��'�B{A?�L?;B{A���'?;��=U�@��$&?;��=U�@��$&?�L?;B{A���'?SM;�bW��\ +?B"�=��V�.;?B"�=��V�.;?SM;�bW��\ +?k;��h����>J��=��g�{�>J��=��g�{�>k;��h����>6v�;��u�v�>� >��s�z�>� >��s�z�>6v�;��u�v�>��;,e}�Ϡ>�;>�z�d;>� >��s�z�>�;>�z�d;>z�>��s�� >���>OYm�r��>���>OYm�r��>z�>��s�� >��>��g�J��=sh�>#�b��^|>sh�>#�b��^|>��>��g�J��=.;?��V�B"�=�?l�R�� l>�?l�R�� l>.;?��V�B"�=�$&?U�@�;��=��"?Na=��3b>��"?Na=��3b>�$&?U�@�;��=U�@?�$&�;��=Na=?��"��3b>Na=?��"��3b>U�@?�$&�;��=��V?.;�B"�=l�R?��� l>l�R?��� l>��V?.;�B"�=��g?{оJ��=#�b?shɾ�^|>#�b?shɾ�^|>��g?{оJ��=��s?z��� >OYm?r������>��s?z��� >�z?d;�d;>��s?� �z�>OYm?r������>OYm?r������>��s?� �z�>��g?J�����>#�b?�^|�sh�>#�b?�^|�sh�>��g?J�����>��V?B"��.;?l�R?� l��?l�R?� l��?��V?B"��.;?U�@?;���$&?Na=?�3b���"?Na=?�3b���"?U�@?;���$&?�$&?;��U�@?��"?�3b�Na=?��"?�3b�Na=?�$&?;��U�@?.;?B"����V?�?� l�l�R?�?� l�l�R?.;?B"����V?��>J�����g?sh�>�^|�#�b?sh�>�^|�#�b?��>J�����g?z�>� ���s?r��>����OYm?z�>� ���s?d;>�;��z?� >z����s?r��>����OYm?r��>����OYm?� >z����s?J��=�о��g?�^|>shɾ#�b?�^|>shɾ#�b?J��=�о��g?B"�=.;���V?� l>��l�R?� l>��l�R?B"�=.;���V?;��=�$&�U�@?�3b>��"�Na=?�3b>��"�Na=?;��=�$&�U�@?;��=U�@��$&?�3b>Na=���"?�3b>Na=���"?;��=U�@��$&?B"�=��V�.;?� l>l�R��?� l>l�R��?B"�=��V�.;?J��=��g�{�>�^|>#�b�sh�>�^|>#�b�sh�>J��=��g�{�>� >��s�z�>���>OYm�r��>�^|>#�b�sh�>���>OYm�r��>sh�>#�b��^|>�=�>��Y��=�>�=�>��Y��=�>sh�>#�b��^|>�?l�R�� l>��>rL��Ư>��>rL��Ư>�?l�R�� l>��"?Na=��3b>��?�8�5�>��?�8�5�>��"?Na=��3b>Na=?��"��3b>�8?���W�>�8?���W�>Na=?��"��3b>l�R?��� l>rL?���ǯ>rL?���ǯ>l�R?��� l>#�b?shɾ�^|>��Y?�=���=�>#�b?shɾ�^|>OYm?r������>#�b?�^|�sh�>��Y?�=���=�>��Y?�=���=�>#�b?�^|�sh�>l�R?� l��?rL?ǯ���>rL?ǯ���>l�R?� l��?Na=?�3b���"?�8?5짾��?�8?5짾��?Na=?�3b���"?��"?�3b�Na=?��?W짾�8?��?W짾�8?��"?�3b�Na=?�?� l�l�R?��>ǯ�rL?��>ǯ�rL?�?� l�l�R?sh�>�^|�#�b?�=�>�=����Y?sh�>�^|�#�b?r��>����OYm?�^|>shɾ#�b?�=�>�=����Y?�=�>�=����Y?�^|>shɾ#�b?� l>��l�R?ǯ>���rL?ǯ>���rL?� l>��l�R?�3b>��"�Na=?5�>����8?5�>����8?�3b>��"�Na=?�3b>Na=���"?W�>�8���?W�>�8���?�3b>Na=���"?� l>l�R��?ǯ>rL���>ǯ>rL���>� l>l�R��?�^|>#�b�sh�>�=�>��Y��=�>ǯ>rL���>�=�>��Y��=�>��>rL��Ư>���>�"B����>���>�"B����>��>rL��Ư>��?�8�5�>-x?-z/���>-x?-z/���>��?�8�5�>�8?���W�>-z/?x���>-z/?x���>�8?���W�>rL?���ǯ>�"B?��뾋��>rL?���ǯ>��Y?�=���=�>rL?ǯ���>�"B?��뾋��>�"B?��뾋��>rL?ǯ���>�8?5짾��?-z/?�޾-x?-z/?�޾-x?�8?5짾��?��?W짾�8?x?�޾-z/?x?�޾-z/?��?W짾�8?��>ǯ�rL?���>��뾒"B?��>ǯ�rL?�=�>�=����Y?ǯ>���rL?���>��뾒"B?���>��뾒"B?ǯ>���rL?5�>����8?��>-x�-z/?��>-x�-z/?5�>����8?W�>�8���?��>-z/�x?��>-z/�x?W�>�8���?ǯ>rL���>���>�"B����>��>-z/�x?���>�"B����>-x?-z/���> +?�%�- +? +?�%�- +?-x?-z/���>-z/?x���>�%?- +� +?-z/?x���>�"B?��뾋��>-z/?�޾-x?�%?- +� +?�%?- +� +?-z/?�޾-x?x?�޾-z/?- +? +��%?x?�޾-z/?���>��뾒"B?��>-x�-z/?- +? +��%?- +? +��%?��>-x�-z/?��>-z/�x? +?�%�- +? +?�%�- +?�%?- +� +?- +? +��%?���,e}?Ϡ>���~�?��;Ϡ�,e}?��;d;��z?d;>d;��z?d;>Ϡ�,e}?��;U����u?6v�;z����s?� >z����s?� >U����u?6v�;��Ծ��h?k;{о��g?J��={о��g?J��=��Ծ��h?k;�\ +��bW?SM;.;���V?�"�=.;���V?�"�=�\ +��bW?SM;¡'�1{A?�L?;�$&�D�@?;��=�$&�D�@?;��=¡'�1{A?�L?;B{A���'?�L?;U�@��$&?;��=U�@��$&?;��=B{A���'?�L?;�bW��\ +?SM;��V�.;?B"�=��V�.;?B"�=�bW��\ +?SM;��h����>k;��g�{�>J��=��g�{�>J��=��h����>k;��u�v�>6v�;��s�z�>� >��s�z�>� >��u�v�>6v�;,e}�Ϡ>��;�z�d;>�;>,e}�Ϡ>��;~����;��;,e}���;Ϡ>�z�d;>�;>�z�d;>�;>,e}���;Ϡ>��u�6v�;v�>��s�� >z�>��s�� >z�>��u�6v�;v�>��h�k;���>��g�J��=��>��g�J��=��>��h�k;���>�bW�SM;�\ +?��V�B"�=.;?��V�B"�=.;?�bW�SM;�\ +?B{A��L?;��'?U�@�;��=�$&?U�@�;��=�$&?B{A��L?;��'?��'��L?;B{A?�$&�;��=U�@?�$&�;��=U�@?��'��L?;B{A?�\ +�SM;�bW??;�B"�=��V??;�B"�=��V?�\ +�SM;�bW?��Ծk;��h?�оJ��=��g?�оJ��=��g?��Ծk;��h?v��6v�;��u?�y��� >��s?�y��� >��s?v��6v�;��u?����;,e}?d;��;>�z?����;,e}?�����;~�?���Ϡ>,e}?d;��;>�z?d;��;>�z?���Ϡ>,e}?6v��v�>��u?� �z�>��s?� �z�>��s?6v��v�>��u?k����>��h?J���{�>��g?J���{�>��g?k����>��h?SM��\ +?�bW?�!��.;?��V?�!��.;?��V?SM��\ +?�bW?�L?���'?B{A?;���$&?U�@?;���$&?U�@?�L?���'?B{A?�L?�1{A?¡'?;��U�@?�$&?;��U�@?�$&?�L?�1{A?¡'?SM��bW?�\ +?B"����V?.;?B"����V?.;?SM��bW?�\ +?k���h?���>������g?{�>������g?{�>k���h?���>6v����u?U�>� ���s?z�>� ���s?z�>6v����u?U�>���,e}?Ϡ>d;��z?d;>� ���s?z�>d;��z?d;>z����s?� >����>Ym?r��>����>Ym?r��>z����s?� >{о��g?J��=shɾ#�b?�^|>shɾ#�b?�^|>{о��g?J��=.;���V?�"�=��l�R?� l>��l�R?� l>.;���V?�"�=�$&�D�@?;��=��"�Na=?�3b>��"�Na=?�3b>�$&�D�@?;��=U�@��$&?;��=Na=���"?�3b>Na=���"?�3b>U�@��$&?;��=��V�.;?B"�=l�R��?� l>l�R��?� l>��V�.;?B"�=��g�{�>J��=#�b�sh�>�^|>#�b�sh�>�^|>��g�{�>J��=��s�z�>� >OYm�r��>���>��s�z�>� >�z�d;>�;>��s�� >z�>OYm�r��>���>OYm�r��>���>��s�� >z�>��g�J��=��>#�b��^|>sh�>#�b��^|>sh�>��g�J��=��>��V�B"�=.;?l�R�� l>�?l�R�� l>�?��V�B"�=.;?U�@�;��=�$&?Na=��3b>��"?Na=��3b>��"?U�@�;��=�$&?�$&�;��=U�@?��"��3b>Na=?��"��3b>Na=?�$&�;��=U�@??;�B"�=��V?��� l>l�R?��� l>l�R??;�B"�=��V?�оJ��=��g?shɾ�^|>#�b?shɾ�^|>#�b?�оJ��=��g?�y��� >��s?r������>OYm?�y��� >��s?d;��;>�z?� �z�>��s?r������>OYm?r������>OYm?� �z�>��s?J���{�>��g?�^|�sh�>#�b?�^|�sh�>#�b?J���{�>��g?�!��.;?��V?� l��?l�R?� l��?l�R?�!��.;?��V?;���$&?U�@?�3b���"?Na=?�3b���"?Na=?;���$&?U�@?;��U�@?�$&?�3b�Na=?��"?�3b�Na=?��"?;��U�@?�$&?B"����V?.;?� l�l�R?�?� l�l�R?�?B"����V?.;?������g?{�>�^|�#�b?sh�>�^|�#�b?sh�>������g?{�>� ���s?z�>����>Ym?r��>�^|�#�b?sh�>����>Ym?r��>shɾ#�b?�^|>�=����Y?�=�>�=����Y?�=�>shɾ#�b?�^|>��l�R?� l>���rL?�Ư>���rL?�Ư>��l�R?� l>��"�Na=?�3b>����8?5�>����8?5�>��"�Na=?�3b>Na=���"?�3b>�8���?W�>�8���?W�>Na=���"?�3b>l�R��?� l>rL���>ǯ>rL���>ǯ>l�R��?� l>#�b�sh�>�^|>��Y��=�>�=�>#�b�sh�>�^|>OYm�r��>���>#�b��^|>sh�>��Y��=�>�=�>��Y��=�>�=�>#�b��^|>sh�>l�R�� l>�?rL�ǯ>��>rL�ǯ>��>l�R�� l>�?Na=��3b>��"?�8�5�>��?�8�5�>��?Na=��3b>��"?��"��3b>Na=?���5�>�8?���5�>�8?��"��3b>Na=?��� l>l�R?���ǯ>rL?���ǯ>rL?��� l>l�R?shɾ�^|>#�b?�=���=�>��Y?shɾ�^|>#�b?r������>OYm?�^|�sh�>#�b?�=���=�>��Y?�=���=�>��Y?�^|�sh�>#�b?� l��?l�R?ǯ���>rL?ǯ���>rL?� l��?l�R?�3b���"?Na=?5짾��?�8?5짾��?�8?�3b���"?Na=?�3b�Na=?��"?W짾�8?��?W짾�8?��?�3b�Na=?��"?� l�l�R?�?ǯ�rL?��>ǯ�rL?��>� l�l�R?�?�^|�#�b?sh�>�=����Y?�=�>ǯ�rL?��>�=����Y?�=�>���rL?�Ư>��뾒"B?���>��뾒"B?���>���rL?�Ư>����8?5�>-x�-z/?��>-x�-z/?��>����8?5�>�8���?W�>-z/�x?��>-z/�x?��>�8���?W�>rL���>ǯ>�"B����>���>rL���>ǯ>��Y��=�>�=�>rL�ǯ>��>�"B����>���>�"B����>���>rL�ǯ>��>�8�5�>��?-z/���>x?-z/���>x?�8�5�>��?���5�>�8?x���>-z/?x���>-z/?���5�>�8?���ǯ>rL?��뾋��>�"B?���ǯ>rL?�=���=�>��Y?ǯ���>rL?��뾋��>�"B?��뾋��>�"B?ǯ���>rL?5짾��?�8?�޾-x?-z/?�޾-x?-z/?5짾��?�8?W짾�8?��?�޾-z/?x?�޾-z/?x?W짾�8?��?ǯ�rL?��>��뾒"B?���>�޾-z/?x?��뾒"B?���>-x�-z/?��> +��%?- +? +��%?- +?-x�-z/?��>-z/�x?��>�%�- +? +?-z/�x?��>�"B����>���>-z/���>x?�%�- +? +?�%�- +? +?-z/���>x?x���>-z/?- +�- +?�%?x���>-z/?��뾋��>�"B?�޾-x?-z/?- +�- +?�%?- +�- +?�%?�޾-x?-z/?�޾-z/?x? +��%?- +? +��%?- +?�%�- +? +?- +�- +?�%?,e}?��;Ϡ>~�?��;��;,e}?Ϡ>��;�z?d;>�;>�z?d;>�;>,e}?Ϡ>��;��u?v�>6v�;��s?�y�>� >��s?�y�>� >��u?v�>6v�;��h?���>k;��g?{�>J��=��g?{�>J��=��h?���>k;�bW?�\ +?SM;��V?.;?B"�=��V?.;?B"�=�bW?�\ +?SM;B{A?��'?�L?;U�@?�$&?;��=U�@?�$&?;��=B{A?��'?�L?;¡'?1{A?�L?;�$&?D�@?;��=�$&?D�@?;��=¡'?1{A?�L?;�\ +?�bW?SM;.;?��V?�"�=.;?��V?�"�=�\ +?�bW?SM;���>��h?k;{�>��g?���={�>��g?���=���>��h?k;U�>��u?6v�;z�>��s?� >z�>��s?� >U�>��u?6v�;Ϡ>,e}?��;d;>�z?d;>Ϡ>,e}?��;��;~�?��;��;,e}?Ϡ>d;>�z?d;>d;>�z?d;>��;,e}?Ϡ>6v�;��u?U�>� >��s?z�>� >��s?z�>6v�;��u?U�>k;��h?���>���=��g?{�>���=��g?{�>k;��h?���>SM;�bW?�\ +?B"�=��V?.;?B"�=��V?.;?SM;�bW?�\ +?�L?;1{A?¡'?;��=D�@?�$&?;��=D�@?�$&?�L?;1{A?¡'?�L?;��'?B{A?;��=�$&?U�@?;��=�$&?U�@?�L?;��'?B{A?SM;�\ +?�bW?�!�=.;?��V?�!�=.;?��V?SM;�\ +?�bW?k;���>��h?J��=��>��g?J��=��>��g?k;���>��h?6v�;v�>��u?� >z�>��s?� >z�>��s?6v�;v�>��u?��;Ϡ>,e}?d;>�;>�z?��;Ϡ>,e}?��;��;~�?�>��;,e}?d;>�;>�z?d;>�;>�z?�>��;,e}?v�>6v�;��u?z�>� >��s?z�>� >��s?v�>6v�;��u?���>k;��h?��>J��=��g?��>J��=��g?���>k;��h?�\ +?SM;�bW?.;?B"�=��V?.;?B"�=��V?�\ +?SM;�bW?��'?�L?;B{A?�$&?;��=U�@?�$&?;��=U�@?��'?�L?;B{A?B{A?�L?;��'?U�@?;��=�$&?U�@?;��=�$&?B{A?�L?;��'?�bW?SM;�\ +?��V?B"�=.;?��V?B"�=.;?�bW?SM;�\ +?��h?k;���>��g?J��=��>��g?J��=��>��h?k;���>��u?6v�;v�>��s?� >z�>��s?� >z�>��u?6v�;v�>,e}?��;Ϡ>�z?d;>�;>��s?� >z�>�z?d;>�;>��s?�y�>� >OYm?r��>���>OYm?r��>���>��s?�y�>� >��g?{�>J��=#�b?sh�>�^|>#�b?sh�>�^|>��g?{�>J��=��V?.;?B"�=l�R?�?� l>l�R?�?� l>��V?.;?B"�=U�@?�$&?;��=Na=?��"?�3b>Na=?��"?�3b>U�@?�$&?;��=�$&?D�@?;��=��"?Na=?�3b>��"?Na=?�3b>�$&?D�@?;��=.;?��V?�"�=�?l�R?� l>�?l�R?� l>.;?��V?�"�={�>��g?���=sh�>#�b?�^|>sh�>#�b?�^|>{�>��g?���=z�>��s?� >���>OYm?r��>z�>��s?� >d;>�z?d;>� >��s?z�>���>OYm?r��>���>OYm?r��>� >��s?z�>���=��g?{�>�^|>#�b?sh�>�^|>#�b?sh�>���=��g?{�>B"�=��V?.;?� l>l�R?�?� l>l�R?�?B"�=��V?.;?;��=D�@?�$&?�3b>Na=?��"?�3b>Na=?��"?;��=D�@?�$&?;��=�$&?U�@?�3b>��"?Na=?�3b>��"?Na=?;��=�$&?U�@?�!�=.;?��V?� l>�?l�R?� l>�?l�R?�!�=.;?��V?J��=��>��g?�^|>sh�>#�b?�^|>sh�>#�b?J��=��>��g?� >z�>��s?r��>���>OYm?� >z�>��s?d;>�;>�z?z�>� >��s?r��>���>OYm?r��>���>OYm?z�>� >��s?��>J��=��g?sh�>�^|>#�b?sh�>�^|>#�b?��>J��=��g?.;?B"�=��V?�?� l>l�R?�?� l>l�R?.;?B"�=��V?�$&?;��=U�@?��"?�3b>Na=?��"?�3b>Na=?�$&?;��=U�@?U�@?;��=�$&?Na=?�3b>��"?Na=?�3b>��"?U�@?;��=�$&?��V?B"�=.;?l�R?� l>�?l�R?� l>�?��V?B"�=.;?��g?J��=��>#�b?�^|>sh�>#�b?�^|>sh�>��g?J��=��>��s?� >z�>OYm?r��>���>#�b?�^|>sh�>OYm?r��>���>#�b?sh�>�^|>��Y?�=�>�=�>��Y?�=�>�=�>#�b?sh�>�^|>l�R?�?� l>rL?��>ǯ>rL?��>ǯ>l�R?�?� l>Na=?��"?�3b>�8?��?W�>�8?��?W�>Na=?��"?�3b>��"?Na=?�3b>��?�8?5�>��?�8?5�>��"?Na=?�3b>�?l�R?� l>��>rL?�Ư>��>rL?�Ư>�?l�R?� l>sh�>#�b?�^|>�=�>��Y?�=�>sh�>#�b?�^|>���>OYm?r��>�^|>#�b?sh�>�=�>��Y?�=�>�=�>��Y?�=�>�^|>#�b?sh�>� l>l�R?�?�Ư>rL?��>�Ư>rL?��>� l>l�R?�?�3b>Na=?��"?W�>�8?��?W�>�8?��?�3b>Na=?��"?�3b>��"?Na=?5�>��?�8?5�>��?�8?�3b>��"?Na=?� l>�?l�R?�Ư>��>rL?�Ư>��>rL?� l>�?l�R?�^|>sh�>#�b?�=�>�=�>��Y?�^|>sh�>#�b?r��>���>OYm?sh�>�^|>#�b?�=�>�=�>��Y?�=�>�=�>��Y?sh�>�^|>#�b?�?� l>l�R?��>�Ư>*rL?��>�Ư>*rL?�?� l>l�R?��"?�3b>Na=?��?5�>�8?��?5�>�8?��"?�3b>Na=?Na=?�3b>��"?�8?5�>��?�8?5�>��?Na=?�3b>��"?l�R?� l>�?rL?�Ư>��>rL?�Ư>��>l�R?� l>�?#�b?�^|>sh�>��Y?�=�>�=�>rL?�Ư>��>��Y?�=�>�=�>rL?��>ǯ>�"B?���>���>�"B?���>���>rL?��>ǯ>�8?��?W�>-z/?x?��>-z/?x?��>�8?��?W�>��?�8?5�>-x?-z/?��>-x?-z/?��>��?�8?5�>��>rL?�Ư>���>�"B?���>��>rL?�Ư>�=�>��Y?�=�>�Ư>rL?��>���>�"B?���>���>�"B?���>�Ư>rL?��>W�>�8?��?��>-z/?x?��>-z/?x?W�>�8?��?5�>��?�8?��>x?-z/?��>x?-z/?5�>��?�8?�Ư>��>rL?���>���>�"B?�Ư>��>rL?�=�>�=�>��Y?��>�Ư>*rL?���>���>�"B?���>���>�"B?��>�Ư>*rL?��?5�>�8?x?��>-z/?x?��>-z/?��?5�>�8?�8?5�>��?-z/?��>x?-z/?��>x?�8?5�>��?rL?�Ư>��>�"B?���>���>-z/?��>x?�"B?���>���>-z/?x?��>�%? +? +?�%? +? +?-z/?x?��>-x?-z/?��>- +?�%? +?-x?-z/?��>���>�"B?���>��>-z/?x?- +?�%? +?- +?�%? +?��>-z/?x?��>x?-z/?- +? +?�%?��>x?-z/?���>���>�"B?x?��>-z/?- +? +?�%?- +? +?�%?x?��>-z/?-z/?��>x?�%? +? +?�%? +? +?- +?�%? +?- +? +?�%?���Ϡ>,e}������;~������;,e}�d;��;>�z�d;��;>�z�����;,e}�v��6v�;��u��y��� >��s��y��� >��s�v��6v�;��u���Ծk;��h��оJ��=��g��оJ��=��g���Ծk;��h��\ +�SM;�bW�.;�B"�=��V�.;�B"�=��V��\ +�SM;�bW���'��L?;B{A��$&�;��=U�@��$&�;��=U�@���'��L?;B{A�B{A��L?;��'�U�@�;��=�$&�U�@�;��=�$&�B{A��L?;��'��bW�SM;�\ +���V�B"�=.;���V�B"�=.;��bW�SM;�\ +���h�k;��Ծ��g�J��=�о��g�J��=�о��h�k;��Ծ��u�6v�;v����s�� >z����s�� >z����u�6v�;v��,e}���;Ϡ��z�d;>�;�,e}���;Ϡ�~����;���,e}�Ϡ>����z�d;>�;��z�d;>�;�,e}�Ϡ>�����u�v�>6v����s��y�>� ���s��y�>� ���u�v�>6v����h����>k���g�{�>J�����g�{�>J�����h����>k��bW��\ +?SM���V�.;?B"����V�.;?B"���bW��\ +?SM�B{A���'?�L?�U�@��$&?;��U�@��$&?;��B{A���'?�L?�¡'�1{A?�L?��$&�D�@?;���$&�D�@?;��¡'�1{A?�L?��\ +��bW?SM�.;���V?�"��.;���V?�"���\ +��bW?SM���Ծ��h?k�{о��g?����{о��g?������Ծ��h?k�U����u?6v��z����s?� �z����s?� �U����u?6v��Ϡ�,e}?���d;��z?d;�Ϡ�,e}?������~�?������,e}?Ϡ�d;��z?d;�d;��z?d;����,e}?Ϡ�6v����u?U��� ���s?z��� ���s?z��6v����u?U��k���h?��Ծ������g?{о������g?{оk���h?��ԾSM��bW?�\ +�B"����V?.;�B"����V?.;�SM��bW?�\ +��L?�1{A?¡'�;��D�@?�$&�;��D�@?�$&��L?�1{A?¡'��L?���'?B{A�;���$&?U�@�;���$&?U�@��L?���'?B{A�SM��\ +?�bW��!��.;?��V��!��.;?��V�SM��\ +?�bW�k����>��h�J�����>��g�J�����>��g�k����>��h�6v��v�>��u�� �z�>��s�� �z�>��s�6v��v�>��u����Ϡ>,e}�d;��;>�z�� �z�>��s�d;��;>�z��y��� >��s�r������>OYm�r������>OYm��y��� >��s��оJ��=��g�shɾ�^|>#�b�shɾ�^|>#�b��оJ��=��g�.;�B"�=��V���� l>l�R���� l>l�R�.;�B"�=��V��$&�;��=U�@���"��3b>Na=���"��3b>Na=��$&�;��=U�@�U�@�;��=�$&�Na=��3b>��"�Na=��3b>��"�U�@�;��=�$&���V�B"�=.;�l�R�� l>��l�R�� l>����V�B"�=.;���g�J��=�о#�b��^|>shɾ#�b��^|>shɾ��g�J��=�о��s�� >z��OYm�r��>������s�� >z���z�d;>�;���s��y�>� �OYm�r��>����OYm�r��>������s��y�>� ���g�{�>J���#�b�sh�>�^|�#�b�sh�>�^|���g�{�>J�����V�.;?B"��l�R��?� l�l�R��?� l���V�.;?B"��U�@��$&?;��Na=���"?�3b�Na=���"?�3b�U�@��$&?;���$&�D�@?;�彷�"�Na=?�3b���"�Na=?�3b��$&�D�@?;��.;���V?�"����l�R?� l���l�R?� l�.;���V?�"��{о��g?����shɾ#�b?�^|�shɾ#�b?�^|�{о��g?����z����s?� �����OYm?r���z����s?� �d;��z?d;�� ���s?z������OYm?r�������OYm?r���� ���s?z��������g?{о�^|�#�b?shɾ�^|�#�b?shɾ������g?{оB"����V?.;�� l�l�R?��� l�l�R?��B"����V?.;�;��D�@?�$&��3b�Na=?��"��3b�Na=?��"�;��D�@?�$&�;���$&?U�@��3b���"?Na=��3b���"?Na=�;���$&?U�@��!��.;?��V�� l��?l�R�� l��?l�R��!��.;?��V�J�����>��g��^|�sh�>#�b��^|�sh�>#�b�J�����>��g�� �z�>��s�r������>OYm��^|�sh�>#�b�r������>OYm�shɾ�^|>#�b��=���=�>��Y��=���=�>��Y�shɾ�^|>#�b���� l>l�R�����Ư>rL�����Ư>rL���� l>l�R���"��3b>Na=����W�>�8����W�>�8���"��3b>Na=�Na=��3b>��"��8�5�>����8�5�>���Na=��3b>��"�l�R�� l>��*rL��Ư>���*rL��Ư>���l�R�� l>��#�b��^|>shɾ��Y��=�>�=��#�b��^|>shɾOYm�r��>����#�b�sh�>�^|���Y��=�>�=����Y��=�>�=��#�b�sh�>�^|�l�R��?� l�rL���>ǯ�rL���>ǯ�l�R��?� l�Na=���"?�3b��8���?W짾�8���?W짾Na=���"?�3b���"�Na=?�3b�����8?5짾����8?5짾��"�Na=?�3b���l�R?� l����rL?�Ư����rL?�Ư���l�R?� l�shɾ#�b?�^|��=����Y?�=��shɾ#�b?�^|�����OYm?r����^|�#�b?shɾ�=����Y?�=���=����Y?�=���^|�#�b?shɾ� l�l�R?���Ư�rL?����Ư�rL?���� l�l�R?���3b�Na=?��"�W짾�8?���W짾�8?����3b�Na=?��"��3b���"?Na=�5짾��?�8�5짾��?�8��3b���"?Na=�� l��?l�R��Ư���>*rL��Ư���>*rL�� l��?l�R��^|�sh�>#�b��=���=�>��Y��Ư���>*rL��=���=�>��Y�����Ư>rL���뾋��>�"B���뾋��>�"B�����Ư>rL����W�>�8�x���>-z/�x���>-z/����W�>�8��8�5�>���-z/���>x�-z/���>x��8�5�>���*rL��Ư>����"B����>���*rL��Ư>�����Y��=�>�=��rL���>ǯ��"B����>��뾒"B����>���rL���>ǯ��8���?W짾-z/�x?�޾-z/�x?�޾�8���?W짾����8?5짾-x�-z/?�޾-x�-z/?�޾����8?5짾���rL?�Ư���뾒"B?��뾹��rL?�Ư��=����Y?�=���Ư�rL?�����뾒"B?��뾋�뾒"B?����Ư�rL?���W짾�8?����޾-z/?x��޾-z/?x�W짾�8?���5짾��?�8��޾x?-z/��޾x?-z/�5짾��?�8��Ư���>*rL���뾋��>�"B��޾x?-z/���뾋��>�"B�x���>-z/�- +� +?�%�- +� +?�%�x���>-z/�-z/���>x��%�- +?- +�-z/���>x��"B����>���-z/�x?�޾�%�- +?- +��%�- +?- +�-z/�x?�޾-x�-z/?�޾- +��%? +�-x�-z/?�޾��뾒"B?����޾-z/?x�- +��%? +�- +��%? +��޾-z/?x��޾x?-z/�- +� +?�%�- +� +?�%��%�- +?- +�- +��%? +�,e}?Ϡ>���~�?��;���,e}?��;Ϡ��z?d;>�;��z?d;>�;�,e}?��;Ϡ���u?6v�;v����s?� >z����s?� >z����u?6v�;v����h?k;��Ծ��g?J��=�о��g?J��=�о��h?k;��Ծ�bW?SM;�\ +���V?B"�=.;���V?B"�=.;��bW?SM;�\ +�B{A?�L?;��'�U�@?;��=�$&�U�@?;��=�$&�B{A?�L?;��'���'?�L?;B{A��$&?;��=U�@��$&?;��=U�@���'?�L?;B{A��\ +?SM;�bW�?;?B"�=��V�?;?B"�=��V��\ +?SM;�bW����>k;��h���>J��=��g���>J��=��g����>k;��h�v�>6v�;��u��y�>� >��s��y�>� >��s�v�>6v�;��u��>��;,e}�d;>�;>�z��>��;,e}���;��;~����;Ϡ>,e}�d;>�;>�z�d;>�;>�z���;Ϡ>,e}�6v�;v�>��u�� >z�>��s�� >z�>��s�6v�;v�>��u�k;���>��h�J��={�>��g�J��={�>��g�k;���>��h�SM;�\ +?�bW��!�=.;?��V��!�=.;?��V�SM;�\ +?�bW��L?;��'?B{A�;��=�$&?U�@�;��=�$&?U�@��L?;��'?B{A��L?;1{A?¡'�;��=U�@?�$&�;��=U�@?�$&��L?;1{A?¡'�SM;�bW?�\ +�B"�=��V?.;�B"�=��V?.;�SM;�bW?�\ +�k;��h?��Ծ���=��g?{о���=��g?{оk;��h?��Ծ6v�;��u?U��� >��s?z��� >��s?z��6v�;��u?U����;,e}?Ϡ�d;>�z?d;���;,e}?Ϡ���;~�?���Ϡ>,e}?���d;>�z?d;�d;>�z?d;�Ϡ>,e}?���U�>��u?6v��z�>��s?� �z�>��s?� �U�>��u?6v�����>��h?k�{�>��g?J���{�>��g?J������>��h?k��\ +?�bW?SM�.;?��V?�"��.;?��V?�"���\ +?�bW?SM�¡'?1{A?�L?��$&?D�@?;���$&?D�@?;��¡'?1{A?�L?�B{A?��'?�L?�U�@?�$&?;��U�@?�$&?;��B{A?��'?�L?��bW?�\ +?SM���V?.;?B"����V?.;?B"���bW?�\ +?SM���h?���>k���g?{�>J�����g?{�>J�����h?���>k���u?v�>6v����s?z�>� ���s?z�>� ���u?v�>6v��,e}?Ϡ>����z?d;>�;���s?z�>� ��z?d;>�;���s?� >z��OYm?r��>����OYm?r��>������s?� >z����g?J��=�о#�b?�^|>shɾ#�b?�^|>shɾ��g?J��=�о��V?B"�=.;�l�R?� l>��l�R?� l>����V?B"�=.;�U�@?;��=�$&�Na=?�3b>��"�Na=?�3b>��"�U�@?;��=�$&��$&?;��=U�@���"?�3b>Na=���"?�3b>Na=��$&?;��=U�@�?;?B"�=��V��?� l>l�R��?� l>l�R�?;?B"�=��V���>J��=��g�sh�>�^|>#�b�sh�>�^|>#�b���>J��=��g��y�>� >��s�r��>���>OYm��y�>� >��s�d;>�;>�z�� >z�>��s�r��>���>OYm�r��>���>OYm�� >z�>��s�J��={�>��g��^|>sh�>#�b��^|>sh�>#�b�J��={�>��g��!�=.;?��V�� l>�?l�R�� l>�?l�R��!�=.;?��V�;��=�$&?U�@��3b>��"?Na=��3b>��"?Na=�;��=�$&?U�@�;��=U�@?�$&��3b>Na=?��"��3b>Na=?��"�;��=U�@?�$&�B"�=��V?.;�� l>l�R?��� l>l�R?��B"�=��V?.;����=��g?{о�^|>#�b?shɾ�^|>#�b?shɾ���=��g?{о� >��s?z�����>OYm?r���� >��s?z��d;>�z?d;�z�>��s?� ����>OYm?r������>OYm?r���z�>��s?� �{�>��g?J���sh�>#�b?�^|�sh�>#�b?�^|�{�>��g?J���.;?��V?�"���?l�R?� l��?l�R?� l�.;?��V?�"���$&?D�@?;�彷�"?Na=?�3b���"?Na=?�3b��$&?D�@?;��U�@?�$&?;��Na=?��"?�3b�Na=?��"?�3b�U�@?�$&?;�彖�V?.;?B"��l�R?�?� l�l�R?�?� l���V?.;?B"����g?{�>J���#�b?sh�>�^|�#�b?sh�>�^|���g?{�>J�����s?z�>� �OYm?r��>����#�b?sh�>�^|�OYm?r��>����#�b?�^|>shɾ��Y?�=�>�=����Y?�=�>�=��#�b?�^|>shɾl�R?� l>��rL?�Ư>���rL?�Ư>���l�R?� l>��Na=?�3b>��"��8?5�>����8?5�>���Na=?�3b>��"���"?�3b>Na=���?5�>�8���?5�>�8���"?�3b>Na=��?� l>l�R���>ǯ>rL���>ǯ>rL��?� l>l�R�sh�>�^|>#�b��=�>�=�>��Y�sh�>�^|>#�b�r��>���>OYm��^|>sh�>#�b��=�>�=�>��Y��=�>�=�>��Y��^|>sh�>#�b�� l>�?l�R�ǯ>��>rL�ǯ>��>rL�� l>�?l�R��3b>��"?Na=�5�>��?�8�5�>��?�8��3b>��"?Na=��3b>Na=?��"�W�>�8?���W�>�8?����3b>Na=?��"�� l>l�R?��ǯ>rL?���ǯ>rL?���� l>l�R?���^|>#�b?shɾ�=�>��Y?�=���^|>#�b?shɾ���>OYm?r���sh�>#�b?�^|��=�>��Y?�=���=�>��Y?�=��sh�>#�b?�^|��?l�R?� l���>rL?ǯ���>rL?ǯ��?l�R?� l���"?Na=?�3b���?�8?5짾��?�8?5짾��"?Na=?�3b�Na=?��"?�3b��8?��?W짾�8?��?W짾Na=?��"?�3b�l�R?�?� l�rL?��>ǯ�rL?��>ǯ�l�R?�?� l�#�b?sh�>�^|���Y?�=�>�=��rL?��>ǯ���Y?�=�>�=��rL?�Ư>����"B?���>��뾒"B?���>���rL?�Ư>����8?5�>���-z/?���>-x�-z/?���>-x��8?5�>�����?5�>�8�x?��>-z/�x?��>-z/���?5�>�8���>ǯ>rL����>���>�"B���>ǯ>rL��=�>�=�>��Y�ǯ>��>rL����>���>�"B����>���>�"B�ǯ>��>rL�5�>��?�8���>-x?-z/���>-x?-z/�5�>��?�8�W�>�8?�����>-z/?x���>-z/?x�W�>�8?���ǯ>rL?������>�"B?���ǯ>rL?����=�>��Y?�=����>rL?ǯ����>�"B?��뾋��>�"B?��뾹�>rL?ǯ���?�8?5짾-x?-z/?�޾-x?-z/?�޾��?�8?5짾�8?��?W짾-z/?x?�޾-z/?x?�޾�8?��?W짾rL?��>ǯ��"B?���>���-z/?x?�޾�"B?���>���-z/?���>-x��%?- +?- +��%?- +?- +�-z/?���>-x�x?��>-z/�- +?- +?�%�x?��>-z/����>���>�"B���>-x?-z/�- +?- +?�%�- +?- +?�%���>-x?-z/���>-z/?x� +?�%?- +���>-z/?x����>�"B?���-x?-z/?�޾ +?�%?- +� +?�%?- +�-x?-z/?�޾-z/?x?�޾�%?- +?- +��%?- +?- +�- +?- +?�%� +?�%?- +����,e}�Ϡ����~�����Ϡ�,e}�����;��z�d;��;��z�d;�Ϡ�,e}����v����u�6v��z����s�� �z����s�� �v����u�6v��ʋԾ��h�k��о��g�J����о��g�J���ʋԾ��h�k��\ +��bW�SM�.;���V�B"��.;���V�B"���\ +��bW�SM���'�B{A��L?��$&�U�@�;���$&�U�@�;�彲�'�B{A��L?�B{A���'��L?�U�@��$&�;��U�@��$&�;��B{A���'��L?��bW��\ +�SM���V�.;�B"����V�.;�B"���bW��\ +�SM���h���Ծk���g�{оJ�����g�{оJ�����h���Ծk���u�v��6v����s�z��� ���s�z��� ���u�v��6v��,e}�Ϡ�����z�d;�d;�,e}�Ϡ����~��������,e}����Ϡ��z�d;�d;��z�d;�d;�,e}����Ϡ���u�6v��v����s�� �z����s�� �z����u�6v��v����h�k���Ծ��g�J����о��g�J����о��h�k���Ծ�bW�SM��\ +���V�B"��.;���V�B"��.;��bW�SM��\ +�B{A��L?���'�U�@�;���$&�U�@�;���$&�B{A��L?���'���'��L?�B{A��$&�;��U�@��$&�;��U�@���'��L?�B{A��\ +�SM��bW�.;�B"����V�.;�B"����V��\ +�SM��bW���Ծk���h��оJ�����g��оJ�����g���Ծk���h�v��6v����u�z��� ���s�z��� ���s�v��6v����u������,e}�d;��;��z������,e}�������~�����Ϡ�,e}�d;��;��z�d;��;��z����Ϡ�,e}�6v��v����u�� �z����s�� �z����s�6v��v����u�k���Ծ��h�J����о��g�J����о��g�k���Ծ��h�SM��\ +��bW�B"��.;���V�B"��.;���V�SM��\ +��bW��L?���'�B{A�;���$&�U�@�;���$&�U�@��L?���'�B{A��L?�B{A���'�;��U�@��$&�;��U�@��$&��L?�B{A���'�SM��bW��\ +�B"����V�.;�B"����V�.;�SM��bW��\ +�k���h���ԾJ�����g�{оJ�����g�{оk���h���Ծ6v����u�v��� ���s�z��� ���s�z��6v����u�v�����,e}�Ϡ��;��z�d;�� ���s�z���;��z�d;�z����s�� �����OYm�r�������OYm�r���z����s�� ��о��g�J���shɾ#�b��^|�shɾ#�b��^|��о��g�J���.;���V�B"����l�R�� l���l�R�� l�.;���V�B"���$&�U�@�;�彷�"�Na=��3b���"�Na=��3b��$&�U�@�;��U�@��$&�;��Na=���"��3b�Na=���"��3b�U�@��$&�;�彖�V�.;�B"��l�R���� l�l�R���� l���V�.;�B"����g�{оJ���#�b�shɾ�^|�#�b�shɾ�^|���g�{оJ�����s�z��� �OYm�r���������s�z��� ��z�d;�d;���s�� �z��OYm�r�������OYm�r���������s�� �z����g�J����о#�b��^|�shɾ#�b��^|�shɾ��g�J����о��V�B"��.;�l�R�� l���l�R�� l�����V�B"��.;�U�@�;���$&�Na=��3b���"�Na=��3b���"�U�@�;���$&��$&�;��U�@���"��3b�Na=���"��3b�Na=��$&�;��U�@�.;�B"����V���� l�l�R���� l�l�R�.;�B"����V��оJ�����g�shɾ�^|�#�b�shɾ�^|�#�b��оJ�����g�z��� ���s�r�������OYm�z��� ���s�d;��;��z�� �z����s�r�������OYm�r�������OYm�� �z����s�J����о��g��^|�shɾ#�b��^|�shɾ#�b�J����о��g�B"��.;���V�� l���l�R�� l���l�R�B"��.;���V�;���$&�U�@��3b���"�Na=��3b���"�Na=�;���$&�U�@�;��U�@��$&��3b�Na=���"��3b�Na=���"�;��U�@��$&�B"����V�.;�� l�l�R���� l�l�R���B"����V�.;�J�����g�{о�^|�#�b�shɾ�^|�#�b�shɾJ�����g�{о� ���s�z������OYm�r����^|�#�b�shɾ����OYm�r���shɾ#�b��^|��=����Y��=���=����Y��=��shɾ#�b��^|���l�R�� l����rL��Ư����rL��Ư���l�R�� l���"�Na=��3b�����8�5짾����8�5짾��"�Na=��3b�Na=���"��3b��8����W짾�8����W짾Na=���"��3b�l�R���� l�rL����ǯ�rL����ǯ�l�R���� l�#�b�shɾ�^|���Y��=���=��#�b�shɾ�^|�OYm�r�������#�b��^|�shɾ��Y��=���=����Y��=���=��#�b��^|�shɾl�R�� l���rL�ǯ����rL�ǯ����l�R�� l���Na=��3b���"��8�5짾����8�5짾���Na=��3b���"���"��3b�Na=����W짾�8����W짾�8���"��3b�Na=���� l�l�R����ǯ�rL����ǯ�rL���� l�l�R�shɾ�^|�#�b��=���=����Y�shɾ�^|�#�b�r�������OYm��^|�shɾ#�b��=���=����Y��=���=����Y��^|�shɾ#�b�� l���l�R�ǯ����rL�ǯ����rL�� l���l�R��3b���"�Na=�5짾����8�5짾����8��3b���"�Na=��3b�Na=���"�W짾�8����W짾�8�����3b�Na=���"�� l�l�R���ǯ�rL����ǯ�rL����� l�l�R����^|�#�b�shɾ�=����Y��=��ǯ�rL�����=����Y��=�����rL��Ư���뾒"B���뾋�뾒"B���뾹��rL��Ư�����8�5짾-x�-z/��޾-x�-z/��޾����8�5짾�8����W짾-z/�x��޾-z/�x��޾�8����W짾rL����ǯ��"B���뾋��rL����ǯ���Y��=���=��rL�ǯ�����"B���뾋�뾒"B���뾋��rL�ǯ�����8�5짾���-z/��޾-x�-z/��޾-x��8�5짾������W짾�8�x��޾-z/�x��޾-z/����W짾�8����ǯ�rL���뾋�뾒"B����ǯ�rL��=���=����Y�ǯ����rL���뾋�뾒"B���뾋�뾒"B�ǯ����rL�5짾����8��޾-x�-z/��޾-x�-z/�5짾����8�W짾�8�����޾-z/�x��޾-z/�x�W짾�8����ǯ�rL������뾒"B�����޾-z/�x���뾒"B����-x�-z/��޾ +��%�- +� +��%�- +�-x�-z/��޾-z/�x��޾�%�- +� +�-z/�x��޾�"B���뾋��-z/��޾-x��%�- +� +��%�- +� +�-z/��޾-x�x��޾-z/�- +� +��%�x��޾-z/���뾋�뾒"B��޾-x�-z/�- +� +��%�- +� +��%��޾-x�-z/��޾-z/�x� +��%�- +� +��%�- +��%�- +� +�- +� +��%�,e}?���Ϡ�~�?������,e}?Ϡ�����z?d;��;��z?d;��;�,e}?Ϡ������u?v��6v����s?�y��� ���s?�y��� ���u?v��6v����h?��Ծk���g?{оJ�����g?{оJ�����h?��Ծk��bW?�\ +�SM���V??;�B"����V??;�B"���bW?�\ +�SM�B{A?��'��L?�U�@?�$&�;��U�@?�$&�;��B{A?��'��L?���'?B{A��L?��$&?U�@�;���$&?U�@�;�彲�'?B{A��L?��\ +?�bW�SM�.;?��V�B"��.;?��V�B"���\ +?�bW�SM�ʋ�>��h�k���>��g�J�����>��g�J���ʋ�>��h�k�v�>��u�6v��z�>��s�� �z�>��s�� �v�>��u�6v��Ϡ>,e}�����;>�z�d;�Ϡ>,e}������;~�������;,e}�Ϡ��;>�z�d;��;>�z�d;���;,e}�Ϡ�6v�;��u�v��� >��s�z��� >��s�z��6v�;��u�v��k;��h���ԾJ��=��g�{оJ��=��g�{оk;��h���ԾSM;�bW��\ +�B"�=��V�.;�B"�=��V�.;�SM;�bW��\ +��L?;B{A���'�;��=U�@��$&�;��=U�@��$&��L?;B{A���'��L?;��'�B{A�;��=�$&�U�@�;��=�$&�U�@��L?;��'�B{A�SM;�\ +��bW�B"�=.;���V�B"�=.;���V�SM;�\ +��bW�k;��Ծ��h�J��=�о��g�J��=�о��g�k;��Ծ��h�6v�;v����u�� >z����s�� >z����s�6v�;v����u���;Ϡ�,e}�d;>�;��z���;Ϡ�,e}���;���~���>���,e}�d;>�;��z�d;>�;��z��>���,e}�v�>6v����u�z�>� ���s�z�>� ���s�v�>6v����u����>k���h���>J�����g���>J�����g����>k���h��\ +?SM��bW�.;?B"����V�.;?B"����V��\ +?SM��bW���'?�L?�B{A��$&?;��U�@��$&?;��U�@���'?�L?�B{A�B{A?�L?���'�U�@?;���$&�U�@?;���$&�B{A?�L?���'��bW?SM��\ +���V?B"��.;���V?B"��.;��bW?SM��\ +���h?k���Ծ��g?J����о��g?J����о��h?k���Ծ��u?6v��v����s?� �z����s?� �z����u?6v��v��,e}?���Ϡ��z?d;��;���s?� �z���z?d;��;���s?�y��� �OYm?r�������OYm?r���������s?�y��� ���g?{оJ���#�b?shɾ�^|�#�b?shɾ�^|���g?{оJ�����V??;�B"��l�R?��� l�l�R?��� l���V??;�B"��U�@?�$&�;��Na=?��"��3b�Na=?��"��3b�U�@?�$&�;���$&?U�@�;�彷�"?Na=��3b���"?Na=��3b��$&?U�@�;��.;?��V�B"���?l�R�� l��?l�R�� l�.;?��V�B"����>��g�J���sh�>#�b��^|�sh�>#�b��^|���>��g�J���z�>��s�� ����>OYm�r���z�>��s�� ��;>�z�d;�� >��s�z�����>OYm�r������>OYm�r���� >��s�z��J��=��g�{о�^|>#�b�shɾ�^|>#�b�shɾJ��=��g�{оB"�=��V�.;�� l>l�R���� l>l�R���B"�=��V�.;�;��=U�@��$&��3b>Na=���"��3b>Na=���"�;��=U�@��$&�;��=�$&�U�@��3b>��"�Na=��3b>��"�Na=�;��=�$&�U�@�B"�=.;���V�� l>��l�R�� l>��l�R�B"�=.;���V�J��=�о��g��^|>shɾ#�b��^|>shɾ#�b�J��=�о��g�� >z����s�r��>����>Ym�� >z����s�d;>�;��z�z�>� ���s�r��>����>Ym�r��>����>Ym�z�>� ���s���>J�����g�sh�>�^|�#�b�sh�>�^|�#�b���>J�����g�.;?B"����V��?� l�l�R��?� l�l�R�.;?B"����V��$&?;��U�@���"?�3b�Na=���"?�3b�Na=��$&?;��U�@�U�@?;���$&�Na=?�3b���"�Na=?�3b���"�U�@?;���$&���V?B"��.;�l�R?� l���l�R?� l�����V?B"��.;���g?J����о#�b?�^|�shɾ#�b?�^|�shɾ��g?J����о��s?� �z��OYm?r�������#�b?�^|�shɾOYm?r�������#�b?shɾ�^|���Y?�=���=����Y?�=���=��#�b?shɾ�^|�l�R?��� l�rL?����Ư�rL?����Ư�l�R?��� l�Na=?��"��3b��8?���W짾�8?���W짾Na=?��"��3b���"?Na=��3b���?�8�5짾��?�8�5짾��"?Na=��3b��?l�R�� l���>rL��Ư���>rL��Ư��?l�R�� l�sh�>#�b��^|��=�>��Y��=��sh�>#�b��^|����>OYm�r����^|>#�b�shɾ�=�>��Y��=���=�>��Y��=���^|>#�b�shɾ� l>l�R����Ư>rL�����Ư>rL����� l>l�R����3b>Na=���"�W�>�8����W�>�8�����3b>Na=���"��3b>��"�Na=�5�>����8�5�>����8��3b>��"�Na=�� l>��l�R�ǯ>���rL�ǯ>���rL�� l>��l�R��^|>shɾ#�b��=�>�=����Y��^|>shɾ#�b�r��>����>Ym�sh�>�^|�#�b��=�>�=����Y��=�>�=����Y�sh�>�^|�#�b��?� l�l�R���>�Ư�rL���>�Ư�rL��?� l�l�R���"?�3b�Na=���?W짾�8���?W짾�8���"?�3b�Na=�Na=?�3b���"��8?5짾����8?5짾���Na=?�3b���"�l�R?� l���rL?�Ư����rL?�Ư����l�R?� l���#�b?�^|�shɾ��Y?�=���=��rL?�Ư������Y?�=���=��rL?����Ư��"B?��뾋�뾒"B?��뾋��rL?����Ư��8?���W짾-z/?x��޾-z/?x��޾�8?���W짾��?�8�5짾x?-z/��޾x?-z/��޾��?�8�5짾��>rL��Ư����>�"B���뾹�>rL��Ư��=�>��Y��=���Ư>rL�������>�"B���뾋��>�"B�����Ư>rL����W�>�8������>-z/�x���>-z/�x�W�>�8����5�>����8���>x�-z/���>x�-z/�5�>����8�ǯ>���rL����>��뾒"B�ǯ>���rL��=�>�=����Y���>�Ư�rL����>��뾒"B����>��뾒"B���>�Ư�rL���?W짾�8�x?�޾-z/�x?�޾-z/���?W짾�8��8?5짾���-z/?�޾-x�-z/?�޾-x��8?5짾���rL?�Ư�����"B?��뾋��-z/?�޾-x��"B?��뾋��-z/?x��޾�%? +� +��%? +� +�-z/?x��޾x?-z/��޾ +? �%� +�x?-z/��޾���>�"B������>-z/�x� +? �%� +� +? �%� +���>-z/�x���>x�-z/� +? +��%���>x�-z/����>��뾒"B�x?�޾-z/� +? +��%� +? +��%�x?�޾-z/�-z/?�޾-x��%? +� +��%? +� +� +? �%� +� +? +��%� \ No newline at end of file diff --git a/jme3-plugins/src/test/resources/gltf/lights/MODEL_ROUNDED_CUBE_PART_1/positions.bin b/jme3-plugins/src/test/resources/gltf/lights/MODEL_ROUNDED_CUBE_PART_1/positions.bin new file mode 100644 index 0000000000..96c2a4e1b9 Binary files /dev/null and b/jme3-plugins/src/test/resources/gltf/lights/MODEL_ROUNDED_CUBE_PART_1/positions.bin differ diff --git a/jme3-plugins/src/test/resources/gltf/lights/lights.gltf b/jme3-plugins/src/test/resources/gltf/lights/lights.gltf new file mode 100644 index 0000000000..1fb7ee2ba8 --- /dev/null +++ b/jme3-plugins/src/test/resources/gltf/lights/lights.gltf @@ -0,0 +1,226 @@ +{ + "extensionsUsed": [ + "KHR_lights_punctual" + ], + "extensions": { + "KHR_lights_punctual": { + "lights": [ + { + "color": [ + 1.0, + 0.9, + 0.7 + ], + "name": "Directional", + "intensity": 3.0, + "type": "directional" + }, + { + "color": [ + 1.0, + 0.0, + 0.0 + ], + "name": "Point", + "intensity": 20.0, + "type": "point" + }, + { + "color": [ + 0.3, + 0.7, + 1.0 + ], + "name": "Spot", + "intensity": 40.0, + "type": "spot", + "spot": { + "innerConeAngle": 0.785398163397448, + "outerConeAngle": 1.57079632679 + } + } + ] + } + }, + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 3456, + "max": [ + 10, + 19.949111938476562, + 10 + ], + "min": [ + -10, + -0.050886999815702438, + -10 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 3456, + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 0, + "componentType": 5125, + "count": 5172, + "max": [ + 3455 + ], + "min": [ + 0 + ], + "type": "SCALAR" + } + ], + "asset": { + "copyright": "2017 (c) Adobe Corp", + "minVersion": "2.0", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 41472, + "byteOffset": 0 + }, + { + "buffer": 1, + "byteLength": 41472, + "byteOffset": 0 + }, + { + "buffer": 2, + "byteLength": 20688, + "byteOffset": 0, + "target": 34963 + } + ], + "buffers": [ + { + "byteLength": 41472, + "uri": "MODEL_ROUNDED_CUBE_PART_1/positions.bin" + }, + { + "byteLength": 41472, + "uri": "MODEL_ROUNDED_CUBE_PART_1/normals.bin" + }, + { + "byteLength": 20688, + "uri": "MODEL_ROUNDED_CUBE_PART_1/indices.bin" + } + ], + "cameras": [ + { + "name": "render_camera", + "perspective": { + "aspectRatio": 1.3333333730697632, + "yfov": 0.58904862403869629, + "zfar": 100, + "znear": 9.9999997473787516e-05 + }, + "type": "perspective" + }, + { + "name": "render_camera2", + "perspective": { + "aspectRatio": 1.3333333730697632, + "yfov": 0.58904862403869629, + "zfar": 100, + "znear": 9.9999997473787516e-05 + }, + "type": "perspective" + } + ], + "materials": [ + { + "doubleSided": true, + "name": "Rounded Cube Material", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.63075679540634155, + 0.63075679540634155, + 0.63075679540634155, + 1 + ], + "metallicFactor": 0, + "roughnessFactor": 0.50300002098083496 + } + } + ], + "meshes": [ + { + "name": "MODEL_ROUNDED_CUBE_PART_1", + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 0 + }, + "indices": 2, + "material": 0, + "mode": 4 + } + ] + } + ], + "nodes": [ + { + "extensions": { + "KHR_lights_punctual": { + "light": 1 + } + }, + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 22, + 0, + 1 + ], + "name": "point_light" + }, + { + "name": "directional_light", + "extensions": { + "KHR_lights_punctual": { + "light": 0 + } + } + }, + { + "mesh": 0, + "name": "MODEL_ROUNDED_CUBE_PART_1model_N3D" + } + ], + "scene": 0, + "scenes": [ + { + "name": "scene", + "nodes": [ + 0, + 1, + 2 + ] + } + ] +} \ No newline at end of file