From 64a5349018d5fbf57abdefe3fc57b63403c1c2c5 Mon Sep 17 00:00:00 2001 From: StefanBruens Date: Thu, 20 Feb 2020 02:29:24 +0100 Subject: [PATCH 001/128] Avoid crash caused by KDE qqc2-desktop-style Workaround/fix for #5488 Also see https://bugs.kde.org/show_bug.cgi?id=417900 --- cura_app.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cura_app.py b/cura_app.py index 6149eeeb9a..3c2620bb38 100755 --- a/cura_app.py +++ b/cura_app.py @@ -207,5 +207,11 @@ if Platform.isLinux() and getattr(sys, "frozen", False): import trimesh.exchange.load os.environ["LD_LIBRARY_PATH"] = old_env +# WORKAROUND: CURA-5488 +# When using the KDE qqc2-desktop-style, the UI layout is completely broken, and +# even worse, it crashes when switching to the "Preview" pane. +if Platform.isLinux(): + os.environ["QT_QUICK_CONTROLS_STYLE"] = "material" + app = CuraApplication() app.run() From 757d7eee50aa20d01fde1681b257b4fd93800726 Mon Sep 17 00:00:00 2001 From: bas <38720940+BasF0@users.noreply.github.com> Date: Wed, 28 Oct 2020 09:49:26 +0100 Subject: [PATCH 002/128] layers3d.shader now detects and draws 'starts' as boxes Also adds a "show starts" option to the SimulationViewMenuComponent and corresponding logic SimulationPass.py adds a prev_line_types attribute to the shader, which the shader uses to compare with its line_type to detect starts. --- plugins/SimulationView/SimulationPass.py | 9 ++++++ plugins/SimulationView/SimulationView.py | 11 +++++++ .../SimulationViewMenuComponent.qml | 7 ++++ plugins/SimulationView/layers3d.shader | 32 ++++++++++++++++++- 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index f594fefbe5..e623be9b8d 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -18,6 +18,7 @@ from cura.Settings.ExtruderManager import ExtruderManager import os.path +import numpy ## RenderPass used to display g-code paths. from .NozzleNode import NozzleNode @@ -71,6 +72,7 @@ class SimulationPass(RenderPass): self._layer_shader.setUniformValue("u_show_helpers", self._layer_view.getShowHelpers()) self._layer_shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin()) self._layer_shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill()) + self._layer_shader.setUniformValue("u_show_starts", self._layer_view.getShowStarts()) else: #defaults self._layer_shader.setUniformValue("u_max_feedrate", 1) @@ -83,6 +85,7 @@ class SimulationPass(RenderPass): self._layer_shader.setUniformValue("u_show_helpers", 1) self._layer_shader.setUniformValue("u_show_skin", 1) self._layer_shader.setUniformValue("u_show_infill", 1) + self._layer_shader.setUniformValue("u_show_starts", 1) if not self._tool_handle_shader: self._tool_handle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "toolhandle.shader")) @@ -161,6 +164,12 @@ class SimulationPass(RenderPass): self._current_shader = self._layer_shader self._switching_layers = True + # The first line does not have a previous line: add a zero in front + prev_line_types = numpy.concatenate([numpy.asarray([0], dtype=numpy.float32), layer_data._attributes["line_types"]["value"]]) + # Remove the last element + prev_line_types = prev_line_types[0:layer_data._attributes["line_types"]["value"].size] + layer_data._attributes["prev_line_types"] = {'opengl_type': 'float', 'value': prev_line_types, 'opengl_name': 'a_prev_line_type'} + layers_batch = RenderBatch(self._current_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (start, end), backface_cull = True) layers_batch.addItem(node.getWorldTransformation(), layer_data) layers_batch.render(self._scene.getActiveCamera()) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 349426d463..d558852044 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -111,6 +111,7 @@ class SimulationView(CuraView): Application.getInstance().getPreferences().addPreference("layerview/show_helpers", True) Application.getInstance().getPreferences().addPreference("layerview/show_skin", True) Application.getInstance().getPreferences().addPreference("layerview/show_infill", True) + Application.getInstance().getPreferences().addPreference("layerview/show_starts", True) self._updateWithPreferences() @@ -146,6 +147,7 @@ class SimulationView(CuraView): self._show_helpers = True self._show_skin = True self._show_infill = True + self._show_starts = True self.resetLayerData() def getActivity(self) -> bool: @@ -355,6 +357,13 @@ class SimulationView(CuraView): def getShowInfill(self) -> bool: return self._show_infill + def setShowStarts(self, show: bool) -> None: + self._show_starts = show + self.currentLayerNumChanged.emit() + + def getShowStarts(self) -> bool: + return self._show_starts + def getCompatibilityMode(self) -> bool: return self._compatibility_mode @@ -638,6 +647,7 @@ class SimulationView(CuraView): self.setShowHelpers(bool(Application.getInstance().getPreferences().getValue("layerview/show_helpers"))) self.setShowSkin(bool(Application.getInstance().getPreferences().getValue("layerview/show_skin"))) self.setShowInfill(bool(Application.getInstance().getPreferences().getValue("layerview/show_infill"))) + self.setShowStarts(bool(Application.getInstance().getPreferences().getValue("layerview/show_starts"))) self._startUpdateTopLayers() self.preferencesChanged.emit() @@ -653,6 +663,7 @@ class SimulationView(CuraView): "layerview/show_helpers", "layerview/show_skin", "layerview/show_infill", + "layerview/show_starts", }: return diff --git a/plugins/SimulationView/SimulationViewMenuComponent.qml b/plugins/SimulationView/SimulationViewMenuComponent.qml index ffb7eebc95..1d5776ccef 100644 --- a/plugins/SimulationView/SimulationViewMenuComponent.qml +++ b/plugins/SimulationView/SimulationViewMenuComponent.qml @@ -82,6 +82,7 @@ Cura.ExpandableComponent property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") property bool show_skin: UM.Preferences.getValue("layerview/show_skin") property bool show_infill: UM.Preferences.getValue("layerview/show_infill") + property bool show_starts: UM.Preferences.getValue("layerview/show_starts") // If we are in compatibility mode, we only show the "line type" property bool show_legend: UM.SimulationView.compatibilityMode ? true : UM.Preferences.getValue("layerview/layer_view_type") == 1 @@ -250,6 +251,12 @@ Cura.ExpandableComponent preference: "layerview/show_infill", colorId: "layerview_infill" }); + typesLegendModel.append({ + label: catalog.i18nc("@label", "Starts"), + initialValue: viewSettings.show_starts, + preference: "layerview/show_starts", + colorId: "layerview_starts" + }); } } diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader index ceda09f9d5..c9c911ecaa 100644 --- a/plugins/SimulationView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -21,6 +21,7 @@ vertex41core = in highp vec4 a_normal; in highp vec2 a_line_dim; // line width and thickness in highp float a_extruder; + in highp float a_prev_line_type; in highp float a_line_type; in highp float a_feedrate; in highp float a_thickness; @@ -32,6 +33,7 @@ vertex41core = out lowp vec2 v_line_dim; out highp int v_extruder; out highp mat4 v_extruder_opacity; + out float v_prev_line_type; out float v_line_type; out lowp vec4 f_color; @@ -92,6 +94,7 @@ vertex41core = v_normal = (u_normalMatrix * normalize(a_normal)).xyz; v_line_dim = a_line_dim; v_extruder = int(a_extruder); + v_prev_line_type = a_prev_line_type; v_line_type = a_line_type; v_extruder_opacity = u_extruder_opacity; @@ -112,9 +115,10 @@ geometry41core = uniform int u_show_helpers; uniform int u_show_skin; uniform int u_show_infill; + uniform int u_show_starts; layout(lines) in; - layout(triangle_strip, max_vertices = 26) out; + layout(triangle_strip, max_vertices = 40) out; in vec4 v_color[]; in vec3 v_vertex[]; @@ -122,6 +126,7 @@ geometry41core = in vec2 v_line_dim[]; in int v_extruder[]; in mat4 v_extruder_opacity[]; + in float v_prev_line_type[]; in float v_line_type[]; out vec4 f_color; @@ -268,6 +273,29 @@ geometry41core = EndPrimitive(); } + + + if ((u_show_starts == 1) && (v_prev_line_type[0] != 1) && (v_line_type[0] == 1)) { + float w = v_line_dim[0].x / 2; + float h = v_line_dim[0].y / 2; + + myEmitVertex(v_vertex[0] + vec3( w, h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, w, 0.0))); // Front-top-left + myEmitVertex(v_vertex[0] + vec3(-w, h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, w, 0.0))); // Front-top-right + myEmitVertex(v_vertex[0] + vec3( w, -h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, -1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, -h, w, 0.0))); // Front-bottom-left + myEmitVertex(v_vertex[0] + vec3(-w, -h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, -1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, -h, w, 0.0))); // Front-bottom-right + myEmitVertex(v_vertex[0] + vec3(-w, -h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, -1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, -h, -w, 0.0))); // Back-bottom-right + myEmitVertex(v_vertex[0] + vec3(-w, h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, w, 0.0))); // Front-top-right + myEmitVertex(v_vertex[0] + vec3(-w, h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, -w, 0.0))); // Back-top-right + myEmitVertex(v_vertex[0] + vec3( w, h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, w, 0.0))); // Front-top-left + myEmitVertex(v_vertex[0] + vec3( w, h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, -w, 0.0))); // Back-top-left + myEmitVertex(v_vertex[0] + vec3( w, -h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, -1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, -h, w, 0.0))); // Front-bottom-left + myEmitVertex(v_vertex[0] + vec3( w, -h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, -1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, -h, -w, 0.0))); // Back-bottom-left + myEmitVertex(v_vertex[0] + vec3(-w, -h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, -1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, -h, -w, 0.0))); // Back-bottom-right + myEmitVertex(v_vertex[0] + vec3( w, h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, -w, 0.0))); // Back-top-left + myEmitVertex(v_vertex[0] + vec3(-w, h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, -w, 0.0))); // Back-top-right + + EndPrimitive(); + } } fragment41core = @@ -316,6 +344,7 @@ u_show_travel_moves = 0 u_show_helpers = 1 u_show_skin = 1 u_show_infill = 1 +u_show_starts = 1 u_min_feedrate = 0 u_max_feedrate = 1 @@ -337,6 +366,7 @@ a_normal = normal a_line_dim = line_dim a_extruder = extruder a_material_color = material_color +a_prev_line_type = prev_line_type a_line_type = line_type a_feedrate = feedrate a_thickness = thickness From 5a14ef2a56d96b3dbc697c949d0fb13834ac8c59 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 9 Nov 2020 14:14:32 +0100 Subject: [PATCH 003/128] Simplify and speed up the extending of the qualities list --- cura/Machines/MaterialNode.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cura/Machines/MaterialNode.py b/cura/Machines/MaterialNode.py index c78c6aff03..6820c7d740 100644 --- a/cura/Machines/MaterialNode.py +++ b/cura/Machines/MaterialNode.py @@ -88,8 +88,10 @@ class MaterialNode(ContainerNode): variant = self.variant.variant_name) else: qualities_any_material = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition) - for material_metadata in container_registry.findInstanceContainersMetadata(type = "material", material = my_material_type): - qualities.extend((quality for quality in qualities_any_material if quality.get("material") == material_metadata["base_file"])) + + all_material_base_files = [material_metadata["base_file"] for material_metadata in container_registry.findInstanceContainersMetadata(type = "material", material = my_material_type)] + + qualities.extend((quality for quality in qualities_any_material if quality.get("material") in all_material_base_files)) if not qualities: # No quality profiles found. Go by GUID then. my_guid = self.guid From 01648a329e225795b7fb7a4c74a0755da82df69b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 9 Nov 2020 15:28:13 +0100 Subject: [PATCH 004/128] Convert list of all base_files into set Co-authored-by: Ghostkeeper --- cura/Machines/MaterialNode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Machines/MaterialNode.py b/cura/Machines/MaterialNode.py index 6820c7d740..18db7d982d 100644 --- a/cura/Machines/MaterialNode.py +++ b/cura/Machines/MaterialNode.py @@ -89,7 +89,7 @@ class MaterialNode(ContainerNode): else: qualities_any_material = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition) - all_material_base_files = [material_metadata["base_file"] for material_metadata in container_registry.findInstanceContainersMetadata(type = "material", material = my_material_type)] + all_material_base_files = {material_metadata["base_file"] for material_metadata in container_registry.findInstanceContainersMetadata(type = "material", material = my_material_type)} qualities.extend((quality for quality in qualities_any_material if quality.get("material") in all_material_base_files)) From f6badcaecaf772fa52bd6872e71a41e959a6d123 Mon Sep 17 00:00:00 2001 From: bas <38720940+BasF0@users.noreply.github.com> Date: Wed, 11 Nov 2020 13:44:21 +0100 Subject: [PATCH 005/128] Added starts color to theme, and support in shader / simulationpass --- plugins/SimulationView/SimulationPass.py | 3 +++ plugins/SimulationView/layers3d.shader | 32 +++++++++++++----------- resources/themes/cura-light/theme.json | 1 + 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index e623be9b8d..f7f730bf61 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -61,6 +61,9 @@ class SimulationPass(RenderPass): self._current_shader = self._layer_shader # Use extruder 0 if the extruder manager reports extruder index -1 (for single extrusion printers) self._layer_shader.setUniformValue("u_active_extruder", float(max(0, self._extruder_manager.activeExtruderIndex))) + if not self._compatibility_mode: + self._layer_shader.setUniformValue("u_starts_color", Color(*Application.getInstance().getTheme().getColor("layerview_starts").getRgb())) + if self._layer_view: self._layer_shader.setUniformValue("u_max_feedrate", self._layer_view.getMaxFeedrate()) self._layer_shader.setUniformValue("u_min_feedrate", self._layer_view.getMinFeedrate()) diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader index c9c911ecaa..0a5cc23ce7 100644 --- a/plugins/SimulationView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -111,6 +111,8 @@ geometry41core = uniform highp mat4 u_viewMatrix; uniform highp mat4 u_projectionMatrix; + uniform lowp vec4 u_starts_color; + uniform int u_show_travel_moves; uniform int u_show_helpers; uniform int u_show_skin; @@ -279,20 +281,20 @@ geometry41core = float w = v_line_dim[0].x / 2; float h = v_line_dim[0].y / 2; - myEmitVertex(v_vertex[0] + vec3( w, h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, w, 0.0))); // Front-top-left - myEmitVertex(v_vertex[0] + vec3(-w, h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, w, 0.0))); // Front-top-right - myEmitVertex(v_vertex[0] + vec3( w, -h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, -1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, -h, w, 0.0))); // Front-bottom-left - myEmitVertex(v_vertex[0] + vec3(-w, -h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, -1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, -h, w, 0.0))); // Front-bottom-right - myEmitVertex(v_vertex[0] + vec3(-w, -h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, -1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, -h, -w, 0.0))); // Back-bottom-right - myEmitVertex(v_vertex[0] + vec3(-w, h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, w, 0.0))); // Front-top-right - myEmitVertex(v_vertex[0] + vec3(-w, h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, -w, 0.0))); // Back-top-right - myEmitVertex(v_vertex[0] + vec3( w, h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, w, 0.0))); // Front-top-left - myEmitVertex(v_vertex[0] + vec3( w, h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, -w, 0.0))); // Back-top-left - myEmitVertex(v_vertex[0] + vec3( w, -h, w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, -1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, -h, w, 0.0))); // Front-bottom-left - myEmitVertex(v_vertex[0] + vec3( w, -h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, -1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, -h, -w, 0.0))); // Back-bottom-left - myEmitVertex(v_vertex[0] + vec3(-w, -h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, -1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, -h, -w, 0.0))); // Back-bottom-right - myEmitVertex(v_vertex[0] + vec3( w, h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3( 1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, -w, 0.0))); // Back-top-left - myEmitVertex(v_vertex[0] + vec3(-w, h, -w), vec4(1.0, 1.0, 1.0, 1.0), normalize(vec3(-1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, -w, 0.0))); // Back-top-right + myEmitVertex(v_vertex[0] + vec3( w, h, w), u_starts_color, normalize(vec3( 1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, w, 0.0))); // Front-top-left + myEmitVertex(v_vertex[0] + vec3(-w, h, w), u_starts_color, normalize(vec3(-1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, w, 0.0))); // Front-top-right + myEmitVertex(v_vertex[0] + vec3( w, -h, w), u_starts_color, normalize(vec3( 1.0, -1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, -h, w, 0.0))); // Front-bottom-left + myEmitVertex(v_vertex[0] + vec3(-w, -h, w), u_starts_color, normalize(vec3(-1.0, -1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, -h, w, 0.0))); // Front-bottom-right + myEmitVertex(v_vertex[0] + vec3(-w, -h, -w), u_starts_color, normalize(vec3(-1.0, -1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, -h, -w, 0.0))); // Back-bottom-right + myEmitVertex(v_vertex[0] + vec3(-w, h, w), u_starts_color, normalize(vec3(-1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, w, 0.0))); // Front-top-right + myEmitVertex(v_vertex[0] + vec3(-w, h, -w), u_starts_color, normalize(vec3(-1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, -w, 0.0))); // Back-top-right + myEmitVertex(v_vertex[0] + vec3( w, h, w), u_starts_color, normalize(vec3( 1.0, 1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, w, 0.0))); // Front-top-left + myEmitVertex(v_vertex[0] + vec3( w, h, -w), u_starts_color, normalize(vec3( 1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, -w, 0.0))); // Back-top-left + myEmitVertex(v_vertex[0] + vec3( w, -h, w), u_starts_color, normalize(vec3( 1.0, -1.0, 1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, -h, w, 0.0))); // Front-bottom-left + myEmitVertex(v_vertex[0] + vec3( w, -h, -w), u_starts_color, normalize(vec3( 1.0, -1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, -h, -w, 0.0))); // Back-bottom-left + myEmitVertex(v_vertex[0] + vec3(-w, -h, -w), u_starts_color, normalize(vec3(-1.0, -1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, -h, -w, 0.0))); // Back-bottom-right + myEmitVertex(v_vertex[0] + vec3( w, h, -w), u_starts_color, normalize(vec3( 1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4( w, h, -w, 0.0))); // Back-top-left + myEmitVertex(v_vertex[0] + vec3(-w, h, -w), u_starts_color, normalize(vec3(-1.0, 1.0, -1.0)), viewProjectionMatrix * (gl_in[0].gl_Position + vec4(-w, h, -w, 0.0))); // Back-top-right EndPrimitive(); } @@ -340,6 +342,8 @@ u_diffuseColor = [1.0, 0.79, 0.14, 1.0] u_minimumAlbedo = [0.1, 0.1, 0.1, 1.0] u_shininess = 20.0 +u_starts_color = [1.0, 1.0, 1.0, 1.0] + u_show_travel_moves = 0 u_show_helpers = 1 u_show_skin = 1 diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 05a7109361..d0ae589d62 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -389,6 +389,7 @@ "layerview_support_interface": [63, 127, 255, 127], "layerview_prime_tower": [0, 255, 255, 255], "layerview_nozzle": [181, 166, 66, 50], + "layerview_starts": [255, 255, 255, 255], "tab_status_connected": [50, 130, 255, 255], "tab_status_disconnected": [200, 200, 200, 255], From efb79ae650359d183b73ac002a21e266cfbc1d8f Mon Sep 17 00:00:00 2001 From: Chris Racioppo Date: Sun, 6 Dec 2020 13:40:56 -0500 Subject: [PATCH 006/128] Create CreateThumbnail.py --- .../scripts/CreateThumbnail.py | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 plugins/PostProcessingPlugin/scripts/CreateThumbnail.py diff --git a/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py b/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py new file mode 100644 index 0000000000..c76c1684cf --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py @@ -0,0 +1,109 @@ +import base64 +import re + +from UM.Logger import Logger +from cura.Snapshot import Snapshot +from PyQt5.QtCore import QByteArray, QIODevice, QBuffer + +from ..Script import Script + + +class CreateThumbnail(Script): + def __init__(self): + super().__init__() + + def _createSnapshot(self, width, height): + Logger.log("d", "Creating thumbnail image...") + try: + return Snapshot.snapshot(width, height) + except Exception: + Logger.logException("w", "Failed to create snapshot image") + + def _encodeSnapshot(self, snapshot): + Logger.log("d", "Encoding thumbnail image...") + try: + thumbnail_buffer = QBuffer() + thumbnail_buffer.open(QBuffer.ReadWrite) + thumbnail_image = snapshot + thumbnail_image.save(thumbnail_buffer, "PNG") + base64_bytes = base64.b64encode(thumbnail_buffer.data()) + base64_message = base64_bytes.decode('ascii') + thumbnail_buffer.close() + return base64_message + except Exception: + Logger.logException("w", "Failed to encode snapshot image") + + def _convertSnapshotToGcode(self, encoded_snapshot, width, height, chunk_size=78): + gcode = [] + + encoded_snapshot_length = len(encoded_snapshot) + gcode.append(";") + gcode.append("; thumbnail begin {} {} {}".format( + width, height, encoded_snapshot_length)) + + chunks = ["; {}".format(encoded_snapshot[i:i+chunk_size]) + for i in range(0, len(encoded_snapshot), chunk_size)] + gcode.extend(chunks) + + gcode.append("; thumbnail end") + gcode.append(";") + gcode.append("") + + return gcode + + def getSettingDataString(self): + return """{ + "name": "Create Thumbnail", + "key": "CreateThumbnail", + "metadata": {}, + "version": 2, + "settings": + { + "width": + { + "label": "Width", + "description": "Width of the generated thumbnail", + "unit": "px", + "type": "int", + "default_value": 32, + "minimum_value": "0", + "minimum_value_warning": "12", + "maximum_value_warning": "800" + }, + "height": + { + "label": "Height", + "description": "Height of the generated thumbnail", + "unit": "px", + "type": "int", + "default_value": 32, + "minimum_value": "0", + "minimum_value_warning": "12", + "maximum_value_warning": "600" + } + } + }""" + + def execute(self, data): + width = self.getSettingValueByKey("width") + height = self.getSettingValueByKey("height") + + snapshot = self._createSnapshot(width, height) + if snapshot: + encoded_snapshot = self._encodeSnapshot(snapshot) + snapshot_gcode = self._convertSnapshotToGcode( + encoded_snapshot, width, height) + + for layer in data: + layer_index = data.index(layer) + lines = data[layer_index].split("\n") + for line in lines: + if line.startswith(";Generated with Cura"): + line_index = lines.index(line) + insert_index = line_index + 1 + lines[insert_index:insert_index] = snapshot_gcode + + final_lines = "\n".join(lines) + data[layer_index] = final_lines + + return data From cfed67076e5aaa79d3e4dbc1eb38d48a5b265d84 Mon Sep 17 00:00:00 2001 From: Chris Racioppo Date: Sun, 6 Dec 2020 13:46:37 -0500 Subject: [PATCH 007/128] Removing unused import --- plugins/PostProcessingPlugin/scripts/CreateThumbnail.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py b/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py index c76c1684cf..64e3722966 100644 --- a/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py +++ b/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py @@ -1,5 +1,4 @@ import base64 -import re from UM.Logger import Logger from cura.Snapshot import Snapshot From 4f8c4be34e7adfa53981f24cf953ccd83c38c860 Mon Sep 17 00:00:00 2001 From: Chris Racioppo Date: Sun, 6 Dec 2020 14:08:46 -0500 Subject: [PATCH 008/128] Added break from loop --- plugins/PostProcessingPlugin/scripts/CreateThumbnail.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py b/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py index 64e3722966..0ce6ac6eff 100644 --- a/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py +++ b/plugins/PostProcessingPlugin/scripts/CreateThumbnail.py @@ -101,6 +101,7 @@ class CreateThumbnail(Script): line_index = lines.index(line) insert_index = line_index + 1 lines[insert_index:insert_index] = snapshot_gcode + break final_lines = "\n".join(lines) data[layer_index] = final_lines From 0313b29dcf95bec65cbfdd721fde198154dceaa6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 7 Dec 2020 16:04:21 +0100 Subject: [PATCH 009/128] Fix validator for floats in Machine Settings dialog The DoubleValidator depends on the system locale, requiring users with certain locales to enter floats with a comma instead of a dot (though confusingly floats are always represented with a decimal a dot). Instead of configuring the DoubleValidator with a locale that only accepts decimal dots, this commit uses a RegExpValidator, like other numeric fields in Cura does. --- .../MachineSettingsExtruderTab.qml | 1 + .../NumericTextFieldWithUnit.qml | 22 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml b/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml index 902388b669..293e7386b2 100644 --- a/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml +++ b/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml @@ -137,6 +137,7 @@ Item labelWidth: base.labelWidth controlWidth: base.controlWidth unitText: "" + decimals: 0 forceUpdateOnChangeFunction: forceUpdateFunction } } diff --git a/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml b/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml index 031ef5241a..32e0e6dcaa 100644 --- a/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml +++ b/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml @@ -156,12 +156,24 @@ UM.TooltipArea const value = propertyProvider.properties.value return value ? value : "" } - validator: DoubleValidator + property string validatorString: { - bottom: numericTextFieldWithUnit.minimum - top: numericTextFieldWithUnit.maximum - decimals: numericTextFieldWithUnit.decimals - notation: DoubleValidator.StandardNotation + var digits = Math.min(8, 1 + Math.floor( + Math.log(Math.max(Math.abs(numericTextFieldWithUnit.maximum), Math.abs(numericTextFieldWithUnit.minimum)))/Math.log(10) + )) + var minus = numericTextFieldWithUnit.minimum < 0 ? "-?" : "" + if (numericTextFieldWithUnit.decimals == 0) + { + return "^%0\\d{1,%1}$".arg(minus).arg(digits) + } + else + { + return "^%0\\d{0,%1}[.,]?\\d{0,%2}$".arg(minus).arg(digits).arg(numericTextFieldWithUnit.decimals) + } + } + validator: RegExpValidator + { + regExp: new RegExp(textFieldWithUnit.validatorString) } //Enforce actual minimum and maximum values. From 000d7e90f511f1baae5b70bbaebe17aed6f8224c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 8 Dec 2020 12:18:23 +0100 Subject: [PATCH 010/128] Fix support density when using tree support on engineering materials These formulas were using a setting that didn't exist any more. Not sure how this got through QA. Oh well, this is what they are intending. This formula is a little bit weird in how it works with support meshes if support is disabled, but it's more or less as good as it gets. The formula is mirrored from how other Ultimaker printers write it down, but slightly simplified with the same outcome. --- .../ultimaker2_plus_connect/um2pc_cpep_0.4_draft.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_cpep_0.4_normal.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_cpep_0.6_draft.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_cpep_0.6_normal.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_cpep_0.8_draft.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_cpep_0.8_normal.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_nylon_0.25_high.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_nylon_0.25_normal.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_nylon_0.4_fast.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_nylon_0.4_normal.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_nylon_0.6_fast.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_nylon_0.6_normal.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_nylon_0.8_draft.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_nylon_0.8_normal.inst.cfg | 2 +- .../quality/ultimaker2_plus_connect/um2pc_pc_0.25_high.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_pc_0.25_normal.inst.cfg | 2 +- .../quality/ultimaker2_plus_connect/um2pc_pc_0.4_fast.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_pc_0.4_normal.inst.cfg | 2 +- .../quality/ultimaker2_plus_connect/um2pc_pc_0.6_fast.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_pc_0.6_normal.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_pc_0.8_normal.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_tpu_0.25_high.inst.cfg | 2 +- .../ultimaker2_plus_connect/um2pc_tpu_0.4_normal.inst.cfg | 2 +- 23 files changed, 23 insertions(+), 23 deletions(-) diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_draft.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_draft.inst.cfg index ed6f5a0c5e..0d39ffadac 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_draft.inst.cfg @@ -34,7 +34,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 25) speed_wall_x = =speed_print support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_pattern = lines support_z_distance = 0.26 top_bottom_thickness = 1.5 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_normal.inst.cfg index 2aebe1e918..7589c59364 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_normal.inst.cfg @@ -34,7 +34,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 35) speed_wall_x = =math.ceil(speed_print * 30 / 35) support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_pattern = lines support_z_distance = 0.26 top_bottom_thickness = 1.5 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_draft.inst.cfg index 78ffe10ce9..91f932df98 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_draft.inst.cfg @@ -36,7 +36,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 25) speed_wall_x = =speed_print support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_line_distance = 2.85 support_pattern = lines support_xy_distance = 0.6 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_normal.inst.cfg index 2099ea7cbf..d7989f9f3b 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_normal.inst.cfg @@ -36,7 +36,7 @@ speed_wall_0 = =math.ceil(speed_print * 30 / 35) speed_wall_x = =speed_print support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_line_distance = 2.85 support_pattern = lines support_xy_distance = 0.6 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_draft.inst.cfg index bf4be03a20..8d7471ccd1 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_draft.inst.cfg @@ -33,7 +33,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 25) speed_wall_x = =speed_print support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_pattern = lines support_z_distance = 0.26 top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_normal.inst.cfg index f1dd92db53..8a3ff137f1 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_normal.inst.cfg @@ -33,7 +33,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 30) speed_wall_x = =speed_print support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_pattern = lines support_z_distance = 0.26 top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.25_high.inst.cfg index 2fd638f0e9..7026181d38 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.25_high.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.25_high.inst.cfg @@ -34,7 +34,7 @@ speed_travel = 150 speed_wall_0 = =math.ceil(speed_print * 20 / 40) speed_wall_x = =speed_print support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_pattern = lines support_xy_distance = 0.6 support_z_distance = =layer_height * 2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.25_normal.inst.cfg index d7a64e12c8..d11a53640d 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.25_normal.inst.cfg @@ -34,7 +34,7 @@ speed_travel = 150 speed_wall_0 = =math.ceil(speed_print * 20 / 40) speed_wall_x = =speed_print support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_pattern = lines support_xy_distance = 0.6 support_z_distance = =layer_height * 2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.4_fast.inst.cfg index d62a4e79ee..5497712600 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.4_fast.inst.cfg @@ -33,7 +33,7 @@ speed_travel = 150 speed_wall = =math.ceil(speed_print * 40 / 45) support_angle = 45 support_enable = True -support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 25 support_pattern = lines support_xy_distance = 0.6 support_z_distance = =layer_height * 2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.4_normal.inst.cfg index a6161c2a07..b966c9132a 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.4_normal.inst.cfg @@ -32,7 +32,7 @@ speed_travel = 150 speed_wall = =math.ceil(speed_print * 40 / 45) support_angle = 45 support_enable = True -support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 25 support_pattern = lines support_xy_distance = 0.6 support_z_distance = =layer_height * 2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.6_fast.inst.cfg index dbb90918b8..55a067f3aa 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.6_fast.inst.cfg @@ -37,7 +37,7 @@ speed_wall_x = =math.ceil(speed_print * 40 / 55) support_angle = 45 support_bottom_distance = 0.55 support_enable = True -support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 25 support_pattern = lines support_top_distance = 0.55 support_xy_distance = 0.7 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.6_normal.inst.cfg index 172ef69c01..744985a7fc 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.6_normal.inst.cfg @@ -36,7 +36,7 @@ speed_wall_0 = =math.ceil(speed_print * 15 / 55) speed_wall_x = =math.ceil(speed_print * 40 / 55) support_angle = 45 support_enable = True -support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 25 support_pattern = lines support_xy_distance = 0.7 support_z_distance = =layer_height * 2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.8_draft.inst.cfg index c85bacb89e..f9510aa268 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.8_draft.inst.cfg @@ -36,7 +36,7 @@ speed_wall_x = =math.ceil(speed_print * 40 / 55) support_angle = 45 support_bottom_distance = 0.65 support_enable = True -support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 25 support_pattern = lines support_top_distance = 0.5 support_xy_distance = 0.75 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.8_normal.inst.cfg index 153f206b19..548f61df37 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_nylon_0.8_normal.inst.cfg @@ -36,7 +36,7 @@ speed_wall_x = =math.ceil(speed_print * 40 / 55) support_angle = 45 support_bottom_distance = 0.65 support_enable = True -support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 25 support_pattern = lines support_top_distance = 0.5 support_xy_distance = 0.75 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.25_high.inst.cfg index 062e7f97b5..43e6ffd774 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.25_high.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.25_high.inst.cfg @@ -30,7 +30,7 @@ raft_surface_line_width = 0.2 speed_layer_0 = =round(speed_print * 30 / 30) speed_print = 30 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_pattern = lines support_z_distance = 0.19 wall_thickness = 0.88 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.25_normal.inst.cfg index 20ab28f97b..cf67cdf35c 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.25_normal.inst.cfg @@ -30,7 +30,7 @@ raft_surface_line_width = 0.2 speed_layer_0 = =round(speed_print * 30 / 30) speed_print = 30 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_pattern = lines support_z_distance = 0.19 wall_thickness = 0.88 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.4_fast.inst.cfg index 249bfb9053..3c3b01cf4b 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.4_fast.inst.cfg @@ -31,7 +31,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 45) speed_wall_x = =math.ceil(speed_print * 30 / 45) support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_pattern = lines support_z_distance = 0.19 wall_thickness = 1.2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.4_normal.inst.cfg index 86a2dabb6f..2ef73c0ba6 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.4_normal.inst.cfg @@ -31,7 +31,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 45) speed_wall_x = =math.ceil(speed_print * 30 / 45) support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_pattern = lines support_z_distance = 0.19 wall_thickness = 1.2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.6_fast.inst.cfg index 95bbbff2d3..ed02c4d22a 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.6_fast.inst.cfg @@ -35,7 +35,7 @@ speed_wall_0 = =math.ceil(speed_print * 30 / 45) speed_wall_x = =math.ceil(speed_print * 40 / 45) support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_line_distance = 3.5333 support_pattern = lines support_z_distance = 0.21 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.6_normal.inst.cfg index c4f451d972..75edf9330b 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.6_normal.inst.cfg @@ -35,7 +35,7 @@ speed_wall_0 = =math.ceil(speed_print * 30 / 45) speed_wall_x = =math.ceil(speed_print * 40 / 45) support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 20 support_line_distance = 3.5333 support_pattern = lines support_z_distance = 0.21 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.8_normal.inst.cfg index c9fe800c7b..72ef057e7e 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_pc_0.8_normal.inst.cfg @@ -30,7 +30,7 @@ speed_layer_0 = =round(speed_print * 30 / 40) speed_print = 40 support_angle = 45 support_enable = True -support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20 +support_infill_rate = =0 if support_structure == 'tree' else 20 support_pattern = lines support_z_distance = 0.26 top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_tpu_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_tpu_0.25_high.inst.cfg index f03f8ca03d..0948aa2af5 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_tpu_0.25_high.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_tpu_0.25_high.inst.cfg @@ -35,7 +35,7 @@ speed_wall_0 = =math.ceil(speed_print * 15 / 40) speed_wall_x = =math.ceil(speed_print * 38 / 40) support_angle = 45 support_enable = True -support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 25 support_xy_distance = 0.6 support_z_distance = =layer_height * 2 top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_tpu_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_tpu_0.4_normal.inst.cfg index 40e8daa71f..c14808ccde 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_tpu_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_tpu_0.4_normal.inst.cfg @@ -33,7 +33,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 40) speed_wall_x = =math.ceil(speed_print * 35 / 40) support_angle = 45 support_enable = True -support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25 +support_infill_rate = =0 if support_enable and support_structure == 'tree' else 25 support_xy_distance = 0.65 support_z_distance = =layer_height * 2 top_bottom_thickness = 1.2 From caa9916cf00ec1c8daf15f1837da3a78e93c5a3c Mon Sep 17 00:00:00 2001 From: StefanBruens Date: Tue, 8 Dec 2020 14:01:18 +0100 Subject: [PATCH 011/128] Fix bug reference --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index 3c2620bb38..ad5f7b759d 100755 --- a/cura_app.py +++ b/cura_app.py @@ -207,7 +207,7 @@ if Platform.isLinux() and getattr(sys, "frozen", False): import trimesh.exchange.load os.environ["LD_LIBRARY_PATH"] = old_env -# WORKAROUND: CURA-5488 +# WORKAROUND: Cura#5488 # When using the KDE qqc2-desktop-style, the UI layout is completely broken, and # even worse, it crashes when switching to the "Preview" pane. if Platform.isLinux(): From bfe62514e2b8933df22ac361c88b5252ecfae5a2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 8 Dec 2020 14:14:14 +0100 Subject: [PATCH 012/128] Allow steps per mm to be float You could have 333.333 steps per mm, for instance. Not common, but it's possible. Fixes #8889. --- resources/definitions/fdmprinter.def.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index c17e0da9d8..63c7b25b0b 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -652,7 +652,7 @@ { "label": "Steps per Millimeter (X)", "description": "How many steps of the stepper motor will result in one millimeter of movement in the X direction.", - "type": "int", + "type": "float", "default_value": 50, "minimum_value": "0.0000001", "settable_per_mesh": false, @@ -662,7 +662,7 @@ { "label": "Steps per Millimeter (Y)", "description": "How many steps of the stepper motor will result in one millimeter of movement in the Y direction.", - "type": "int", + "type": "float", "default_value": 50, "minimum_value": "0.0000001", "settable_per_mesh": false, @@ -672,7 +672,7 @@ { "label": "Steps per Millimeter (Z)", "description": "How many steps of the stepper motor will result in one millimeter of movement in the Z direction.", - "type": "int", + "type": "float", "default_value": 50, "minimum_value": "0.0000001", "settable_per_mesh": false, @@ -682,7 +682,7 @@ { "label": "Steps per Millimeter (E)", "description": "How many steps of the stepper motors will result in one millimeter of extrusion.", - "type": "int", + "type": "float", "default_value": 1600, "minimum_value": "0.0000001", "settable_per_mesh": false, From 8023bee35a952f0ca9b5dce7d2b6aa0faebef9ec Mon Sep 17 00:00:00 2001 From: StefanBruens Date: Tue, 8 Dec 2020 14:53:48 +0100 Subject: [PATCH 013/128] Use 'default' theme instead of 'material' Using 'material' causes some layout issues, while 'default' shows no such issues and also fixes the preview pane crashes. --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index ad5f7b759d..4469098666 100755 --- a/cura_app.py +++ b/cura_app.py @@ -211,7 +211,7 @@ if Platform.isLinux() and getattr(sys, "frozen", False): # When using the KDE qqc2-desktop-style, the UI layout is completely broken, and # even worse, it crashes when switching to the "Preview" pane. if Platform.isLinux(): - os.environ["QT_QUICK_CONTROLS_STYLE"] = "material" + os.environ["QT_QUICK_CONTROLS_STYLE"] = "default" app = CuraApplication() app.run() From d53568c5dbe08bcc10dd633313bd752dcc4ce672 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 9 Dec 2020 12:16:56 +0100 Subject: [PATCH 014/128] Fix linear-scaling height map thickness Previously it was using this 'peak_height' which is the total height of the model in scale_vector.y. However it was then multiplying the height map with that scale vector and adding the base height again a second time. So the scaling part was too thick and included the base height, and the total height of the mesh was also too big. I also reduced an unnecessary re-calculation of the height_from_base parameter. And as a result we don't need the peak_height variable at all any more. Fixes #8902. --- plugins/ImageReader/ImageReader.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/plugins/ImageReader/ImageReader.py b/plugins/ImageReader/ImageReader.py index 1bab15e9d6..4a32ed71f1 100644 --- a/plugins/ImageReader/ImageReader.py +++ b/plugins/ImageReader/ImageReader.py @@ -52,11 +52,8 @@ class ImageReader(MeshReader): def _generateSceneNode(self, file_name, xz_size, height_from_base, base_height, blur_iterations, max_size, lighter_is_higher, use_transparency_model, transmittance_1mm): scene_node = SceneNode() - mesh = MeshBuilder() - img = QImage(file_name) - if img.isNull(): Logger.log("e", "Image is corrupt.") return None @@ -70,11 +67,10 @@ class ImageReader(MeshReader): height_from_base = max(height_from_base, 0) base_height = max(base_height, 0) - peak_height = base_height + height_from_base xz_size = max(xz_size, 1) - scale_vector = Vector(xz_size, peak_height, xz_size) + scale_vector = Vector(xz_size, height_from_base, xz_size) if width > height: scale_vector = scale_vector.set(z=scale_vector.z * aspect) @@ -132,7 +128,7 @@ class ImageReader(MeshReader): if use_transparency_model: divisor = 1.0 / math.log(transmittance_1mm / 100.0) # log-base doesn't matter here. Precompute this value for faster computation of each pixel. - min_luminance = (transmittance_1mm / 100.0) ** (peak_height - base_height) + min_luminance = (transmittance_1mm / 100.0) ** height_from_base for (y, x) in numpy.ndindex(height_data.shape): mapped_luminance = min_luminance + (1.0 - min_luminance) * height_data[y, x] height_data[y, x] = base_height + divisor * math.log(mapped_luminance) # use same base as a couple lines above this From 2dce2118f5deb20802819992bfc91549a6e5a1db Mon Sep 17 00:00:00 2001 From: Eryone <40707672+Eryone@users.noreply.github.com> Date: Thu, 10 Dec 2020 20:25:00 +0800 Subject: [PATCH 015/128] Added the eryone_er20 3d printer --- resources/definitions/eryone_er20.def.json | 92 ++++++++++++++++++ .../extruders/eryone_er20_extruder_0.def.json | 27 +++++ resources/meshes/eryone_er20_plateform.stl | Bin 0 -> 39684 bytes .../eryone_er20/eryone_er20_draft.inst.cfg | 66 +++++++++++++ .../eryone_er20/eryone_er20_high.inst.cfg | 79 +++++++++++++++ .../eryone_er20/eryone_er20_normal.inst.cfg | 66 +++++++++++++ 6 files changed, 330 insertions(+) create mode 100644 resources/definitions/eryone_er20.def.json create mode 100644 resources/extruders/eryone_er20_extruder_0.def.json create mode 100644 resources/meshes/eryone_er20_plateform.stl create mode 100644 resources/quality/eryone_er20/eryone_er20_draft.inst.cfg create mode 100644 resources/quality/eryone_er20/eryone_er20_high.inst.cfg create mode 100644 resources/quality/eryone_er20/eryone_er20_normal.inst.cfg diff --git a/resources/definitions/eryone_er20.def.json b/resources/definitions/eryone_er20.def.json new file mode 100644 index 0000000000..f16de9011e --- /dev/null +++ b/resources/definitions/eryone_er20.def.json @@ -0,0 +1,92 @@ +{ + "version": 2, + "name": "Eryone ER20", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "Tom", + "manufacturer": "Eryone", + "file_formats": "text/x-gcode", + "platform": "eryone_er20_plateform.stl", + "has_materials": true, + "has_machine_quality": true, + "preferred_quality_type": "high", + "machine_extruder_trains": + { + "0": "eryone_er20_extruder_0" + } + }, + + "overrides": + { + "machine_name": + { + "default_value": "Eryone ER20" + }, + "machine_heated_bed": + { + "default_value": true + }, + "machine_width": + { + "default_value": 250 + }, + "machine_height": + { + "default_value": 200 + }, + "machine_depth": + { + "default_value": 220 + }, + "machine_center_is_zero": + { + "default_value": false + }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-10, -10], + [-10, 10], + [10, 10], + [10, -10] + ] + }, + "gantry_height": + { + "value": "0" + }, + "machine_gcode_flavor": + { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": + { + "default_value": "G90 ; use absolute coordinates\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling/ABL\nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X150 F2400G1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 X150 F1000\nG1 Z0.2 F720\nG1 X80.0 E8.0 F900\nG1 X20.0 E10.0 F700\nG92 E0.0\nM221 S95 ; set flow\n" + }, + "machine_end_gcode": + { + "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" + } + } +} + + + + + + + + + + + + + + + + + + + diff --git a/resources/extruders/eryone_er20_extruder_0.def.json b/resources/extruders/eryone_er20_extruder_0.def.json new file mode 100644 index 0000000000..9b1c1fa435 --- /dev/null +++ b/resources/extruders/eryone_er20_extruder_0.def.json @@ -0,0 +1,27 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "eryone_er20", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0 + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_nozzle_offset_x": { + "default_value": -10.0 + }, + "machine_nozzle_offset_y": { + "default_value": 8.0 + } + } +} diff --git a/resources/meshes/eryone_er20_plateform.stl b/resources/meshes/eryone_er20_plateform.stl new file mode 100644 index 0000000000000000000000000000000000000000..a181d0f37eead1213a91a1d48f3d53b46a408753 GIT binary patch literal 39684 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 literal 0 HcmV?d00001 diff --git a/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg b/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg new file mode 100644 index 0000000000..b44797eae6 --- /dev/null +++ b/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg @@ -0,0 +1,66 @@ +[general] +version = 4 +name = Draft +definition = eryone_er20 + +[metadata] +setting_version = 15 +type = quality +quality_type = draft +weight = -2 +global_quality = True + +[values] +acceleration_enabled = True +acceleration_print = 1500 +acceleration_travel = 3000 +adhesion_type = brim +brim_width = 4.0 +cool_fan_full_at_height = 0.5 +cool_fan_speed = 100 +cool_fan_speed_0 = 100 +infill_overlap = 15 +infill_pattern = zigzag +infill_sparse_density = 25 +initial_layer_line_width_factor = 105 +jerk_enabled = True +jerk_print = 10 +jerk_travel = 12 +layer_height = 0.3 +layer_height_0 = 0.3 +material_bed_temperature = 60 +material_diameter = 1.75 +default_material_print_temperature = 205 +material_print_temperature = 205 +material_print_temperature_layer_0 = 205 +material_initial_print_temperature = 205 +material_final_print_temperature = 205 +retract_at_layer_change = False +retraction_amount = 6 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 55 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = =speed_print +speed_print = 80 +speed_support = 60 +speed_topbottom = =math.ceil(speed_print * 30 / 60) +speed_travel = 150 +speed_wall = =speed_print +speed_wall_x = =speed_print +support_angle = 50 +support_enable = True +support_interface_enable = True +support_pattern = triangles +support_roof_enable = True +support_type = everywhere +support_use_towers = False +support_z_distance = 0.3 +support_xy_distance = 0.7 +support_xy_distance_overhang = 0.2 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 diff --git a/resources/quality/eryone_er20/eryone_er20_high.inst.cfg b/resources/quality/eryone_er20/eryone_er20_high.inst.cfg new file mode 100644 index 0000000000..53fbe8a8d8 --- /dev/null +++ b/resources/quality/eryone_er20/eryone_er20_high.inst.cfg @@ -0,0 +1,79 @@ +[general] +version = 4 +name = High +definition = eryone_er20 + +[metadata] +setting_version = 15 +type = quality +quality_type = high +weight = 1 +global_quality = True + +[values] +acceleration_enabled = True +acceleration_print = 500 +acceleration_travel = 3000 +adhesion_type = brim +brim_width = 6.0 +cool_fan_full_at_height = 0.5 +cool_fan_speed = 100 +cool_fan_speed_0 = 100 +infill_overlap = 25 +infill_pattern = zigzag +infill_sparse_density = 25 +initial_layer_line_width_factor = 105 +jerk_enabled = True +jerk_print = 8 +jerk_travel = 10 +layer_height = 0.15 +layer_height_0 = 0.2 +line_width = 0.42 +material_bed_temperature = 60 +material_diameter = 1.75 +default_material_print_temperature = 205 +material_print_temperature = 205 +material_print_temperature_layer_0 = 205 +material_initial_print_temperature = 205 +material_final_print_temperature = 205 +optimize_wall_printing_order = True +outer_inset_first = True +retract_at_layer_change = False +retraction_amount = 6 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 55 +retraction_combing = noskin +skin_overlap = 10 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = =speed_print +speed_print = 50 +speed_support = 30 +speed_topbottom = =math.ceil(speed_print * 20 / 50) +speed_travel = 150 +speed_wall = =speed_print +speed_wall_x = =speed_print +support_angle = 50 +support_enable = True +support_interface_enable = True +support_pattern = triangles +support_roof_enable = True +support_type = everywhere +support_use_towers = False +support_z_distance = 0.3 +support_xy_distance = 0.7 +support_xy_distance_overhang = 0.2 +smooth_spiralized_contours = False +top_bottom_thickness = 1.2 +travel_retract_before_outer_wall = True +wall_thickness = 1.2 +z_seam_corner = z_seam_corner_weighted + + + + + diff --git a/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg b/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg new file mode 100644 index 0000000000..64764745ec --- /dev/null +++ b/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg @@ -0,0 +1,66 @@ +[general] +version = 4 +name = Normal +definition = eryone_er20 + +[metadata] +setting_version = 15 +type = quality +quality_type = normal +weight = 0 +global_quality = True + +[values] +acceleration_enabled = True +acceleration_print = 1000 +acceleration_travel = 3000 +adhesion_type = brim +brim_width = 5 +cool_fan_full_at_height = 0.5 +cool_fan_speed = 100 +cool_fan_speed_0 = 100 +infill_overlap = 15 +infill_pattern = zigzag +infill_sparse_density = 25 +initial_layer_line_width_factor = 105 +jerk_enabled = True +jerk_print = 8 +jerk_travel = 10 +layer_height = 0.2 +layer_height_0 = 0.2 +material_bed_temperature = 60 +material_diameter = 1.75 +default_material_print_temperature = 205 +material_print_temperature = 205 +material_print_temperature_layer_0 = 205 +material_initial_print_temperature = 205 +material_final_print_temperature = 205 +retract_at_layer_change = False +retraction_amount = 6 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 55 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = =speed_print +speed_print = 50 +speed_support = 30 +speed_topbottom = =math.ceil(speed_print * 20 / 50) +speed_travel = 150 +speed_wall = =speed_print +speed_wall_x = =speed_print +support_angle = 50 +support_enable = True +support_interface_enable = True +support_pattern = triangles +support_roof_enable = True +support_type = everywhere +support_use_towers = False +support_z_distance = 0.3 +support_xy_distance = 0.7 +support_xy_distance_overhang = 0.2 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 From 04418853e6940282a1b22c477b05f252a6a459a5 Mon Sep 17 00:00:00 2001 From: Eryone <40707672+Eryone@users.noreply.github.com> Date: Thu, 10 Dec 2020 20:56:25 +0800 Subject: [PATCH 016/128] --- resources/definitions/eryone_er20.def.json | 55 +++++----------------- 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/resources/definitions/eryone_er20.def.json b/resources/definitions/eryone_er20.def.json index f16de9011e..fc61574f06 100644 --- a/resources/definitions/eryone_er20.def.json +++ b/resources/definitions/eryone_er20.def.json @@ -5,11 +5,10 @@ "metadata": { "visible": true, - "author": "Tom", + "author": "Eryone3d", "manufacturer": "Eryone", "file_formats": "text/x-gcode", "platform": "eryone_er20_plateform.stl", - "has_materials": true, "has_machine_quality": true, "preferred_quality_type": "high", "machine_extruder_trains": @@ -18,34 +17,15 @@ } }, - "overrides": - { - "machine_name": - { - "default_value": "Eryone ER20" - }, - "machine_heated_bed": - { - "default_value": true - }, - "machine_width": - { - "default_value": 250 - }, - "machine_height": - { - "default_value": 200 - }, - "machine_depth": - { - "default_value": 220 - }, - "machine_center_is_zero": - { - "default_value": false - }, - "machine_head_with_fans_polygon": - { + "overrides":{ + "machine_name":{ "default_value": "Eryone ER20" }, + "machine_heated_bed":{ "default_value": true }, + "machine_width":{ "default_value": 250 }, + "machine_height":{ "default_value": 200 }, + "machine_depth":{ "default_value": 220 }, + "machine_center_is_zero":{ "default_value": false }, + "machine_gcode_flavor":{ "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_head_with_fans_polygon": { "default_value": [ [-10, -10], [-10, 10], @@ -53,20 +33,11 @@ [10, -10] ] }, - "gantry_height": - { - "value": "0" - }, - "machine_gcode_flavor": - { - "default_value": "RepRap (Marlin/Sprinter)" - }, - "machine_start_gcode": - { + "gantry_height":{ "value": "0" }, + "machine_start_gcode":{ "default_value": "G90 ; use absolute coordinates\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling/ABL\nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X150 F2400G1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 X150 F1000\nG1 Z0.2 F720\nG1 X80.0 E8.0 F900\nG1 X20.0 E10.0 F700\nG92 E0.0\nM221 S95 ; set flow\n" }, - "machine_end_gcode": - { + "machine_end_gcode":{ "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" } } From af5200afd32aed79c19f23d413e5982ff99e3eb1 Mon Sep 17 00:00:00 2001 From: Eryone <40707672+Eryone@users.noreply.github.com> Date: Thu, 10 Dec 2020 20:59:29 +0800 Subject: [PATCH 017/128] Update eryone_er20.def.json Delete the space tab --- resources/definitions/eryone_er20.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/eryone_er20.def.json b/resources/definitions/eryone_er20.def.json index fc61574f06..c9aac47d94 100644 --- a/resources/definitions/eryone_er20.def.json +++ b/resources/definitions/eryone_er20.def.json @@ -24,8 +24,8 @@ "machine_height":{ "default_value": 200 }, "machine_depth":{ "default_value": 220 }, "machine_center_is_zero":{ "default_value": false }, - "machine_gcode_flavor":{ "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_head_with_fans_polygon": { + "machine_gcode_flavor":{ "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_head_with_fans_polygon": { "default_value": [ [-10, -10], [-10, 10], From 008fc3ffd17828099d3828651e4b8d2b7562f54a Mon Sep 17 00:00:00 2001 From: Eryone <40707672+Eryone@users.noreply.github.com> Date: Thu, 10 Dec 2020 21:10:16 +0800 Subject: [PATCH 018/128] Delete the space tab --- resources/definitions/eryone_er20.def.json | 25 +++++++++++----------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/resources/definitions/eryone_er20.def.json b/resources/definitions/eryone_er20.def.json index c9aac47d94..66182790ef 100644 --- a/resources/definitions/eryone_er20.def.json +++ b/resources/definitions/eryone_er20.def.json @@ -2,8 +2,7 @@ "version": 2, "name": "Eryone ER20", "inherits": "fdmprinter", - "metadata": - { + "metadata": { "visible": true, "author": "Eryone3d", "manufacturer": "Eryone", @@ -17,15 +16,15 @@ } }, - "overrides":{ - "machine_name":{ "default_value": "Eryone ER20" }, - "machine_heated_bed":{ "default_value": true }, - "machine_width":{ "default_value": 250 }, - "machine_height":{ "default_value": 200 }, - "machine_depth":{ "default_value": 220 }, - "machine_center_is_zero":{ "default_value": false }, - "machine_gcode_flavor":{ "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_head_with_fans_polygon": { + "overrides": { + "machine_name": { "default_value": "Eryone ER20" }, + "machine_heated_bed": { "default_value": true }, + "machine_width": { "default_value": 250 }, + "machine_height": { "default_value": 200 }, + "machine_depth": { "default_value": 220 }, + "machine_center_is_zero": { "default_value": false }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_head_with_fans_polygon": { "default_value": [ [-10, -10], [-10, 10], @@ -34,10 +33,10 @@ ] }, "gantry_height":{ "value": "0" }, - "machine_start_gcode":{ + "machine_start_gcode": { "default_value": "G90 ; use absolute coordinates\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling/ABL\nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X150 F2400G1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 X150 F1000\nG1 Z0.2 F720\nG1 X80.0 E8.0 F900\nG1 X20.0 E10.0 F700\nG92 E0.0\nM221 S95 ; set flow\n" }, - "machine_end_gcode":{ + "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" } } From ba309f3cac8c8f059880fcd3d4a6c5484a408d65 Mon Sep 17 00:00:00 2001 From: Eryone <40707672+Eryone@users.noreply.github.com> Date: Thu, 10 Dec 2020 21:37:36 +0800 Subject: [PATCH 019/128] Update the setting version "15" to "16" --- resources/quality/eryone_er20/eryone_er20_draft.inst.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg b/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg index b44797eae6..008ed519a7 100644 --- a/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg +++ b/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg @@ -4,7 +4,7 @@ name = Draft definition = eryone_er20 [metadata] -setting_version = 15 +setting_version = 16 type = quality quality_type = draft weight = -2 From 894ec4232e915ac78a9088aaed934da937b21c31 Mon Sep 17 00:00:00 2001 From: Eryone <40707672+Eryone@users.noreply.github.com> Date: Thu, 10 Dec 2020 21:38:03 +0800 Subject: [PATCH 020/128] Update the setting version "15" to "16" --- resources/quality/eryone_er20/eryone_er20_high.inst.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/quality/eryone_er20/eryone_er20_high.inst.cfg b/resources/quality/eryone_er20/eryone_er20_high.inst.cfg index 53fbe8a8d8..d504bb5acd 100644 --- a/resources/quality/eryone_er20/eryone_er20_high.inst.cfg +++ b/resources/quality/eryone_er20/eryone_er20_high.inst.cfg @@ -4,7 +4,7 @@ name = High definition = eryone_er20 [metadata] -setting_version = 15 +setting_version = 16 type = quality quality_type = high weight = 1 From 42ef3fea313c69743a5837b4405d6eaf194108d5 Mon Sep 17 00:00:00 2001 From: Eryone <40707672+Eryone@users.noreply.github.com> Date: Thu, 10 Dec 2020 21:38:28 +0800 Subject: [PATCH 021/128] Update the setting version "15" to "16" --- resources/quality/eryone_er20/eryone_er20_normal.inst.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg b/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg index 64764745ec..33f7a4b619 100644 --- a/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg +++ b/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg @@ -4,7 +4,7 @@ name = Normal definition = eryone_er20 [metadata] -setting_version = 15 +setting_version = 16 type = quality quality_type = normal weight = 0 From 5e7eb2fc93d39bb42acff91ef5d1edd82ad482c6 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 11 Dec 2020 17:18:23 +0100 Subject: [PATCH 022/128] No need for leading 0 in load-image num-fields. fixes #8906 --- plugins/ImageReader/ConfigUI.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/ImageReader/ConfigUI.qml b/plugins/ImageReader/ConfigUI.qml index a7dbc5f748..a3dceed50d 100644 --- a/plugins/ImageReader/ConfigUI.qml +++ b/plugins/ImageReader/ConfigUI.qml @@ -43,7 +43,7 @@ UM.Dialog TextField { id: peak_height objectName: "Peak_Height" - validator: RegExpValidator {regExp: /^\d{1,3}([\,|\.]\d*)?$/} + validator: RegExpValidator {regExp: /^\d{0,3}([\,|\.]\d*)?$/} width: 180 * screenScaleFactor onTextChanged: { manager.onPeakHeightChanged(text) } } @@ -66,7 +66,7 @@ UM.Dialog TextField { id: base_height objectName: "Base_Height" - validator: RegExpValidator {regExp: /^\d{1,3}([\,|\.]\d*)?$/} + validator: RegExpValidator {regExp: /^\d{0,3}([\,|\.]\d*)?$/} width: 180 * screenScaleFactor onTextChanged: { manager.onBaseHeightChanged(text) } } From 35e3665a7822a81014ebf80578bffeda4f3f7a04 Mon Sep 17 00:00:00 2001 From: RPI News <44128563+mobilegmYT@users.noreply.github.com> Date: Mon, 14 Dec 2020 21:27:18 -0700 Subject: [PATCH 023/128] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ba2b3c277..a108994cb7 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Dependencies Build scripts ------------- -Please checkout [cura-build](https://github.com/Ultimaker/cura-build) for detailed building instructions. +Please check out [cura-build](https://github.com/Ultimaker/cura-build) for detailed building instructions. Running from Source ------------- From 430550452f80310435ba9859993f82456a24b7b8 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 15 Dec 2020 18:31:15 +0100 Subject: [PATCH 024/128] Add a new file menu option when there are multiple file providers CURA-7868 --- resources/qml/Menus/FileMenu.qml | 5 +++ resources/qml/Menus/OpenFilesMenu.qml | 45 +++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 resources/qml/Menus/OpenFilesMenu.qml diff --git a/resources/qml/Menus/FileMenu.qml b/resources/qml/Menus/FileMenu.qml index b9845678d6..24c081502a 100644 --- a/resources/qml/Menus/FileMenu.qml +++ b/resources/qml/Menus/FileMenu.qml @@ -22,6 +22,11 @@ Menu { id: openMenu action: Cura.Actions.open + visible: CuraApplication.fileProviders.length > 0 // DEBUG: It's > 0 so that both options are visible for debugging purposes + } + + OpenFilesMenu { + visible: CuraApplication.fileProviders.length > 0 // DEBUG: It's > 0 so that both options are visible for debugging purposes } RecentFilesMenu { } diff --git a/resources/qml/Menus/OpenFilesMenu.qml b/resources/qml/Menus/OpenFilesMenu.qml new file mode 100644 index 0000000000..a3afa9a598 --- /dev/null +++ b/resources/qml/Menus/OpenFilesMenu.qml @@ -0,0 +1,45 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.6 as UM +import Cura 1.0 as Cura + +import "../Dialogs" + +Menu +{ + id: menu + title: catalog.i18nc("@title:menu menubar:file", "Open File(s)...") + iconName: "document-open-recent"; + + + Instantiator + { + id: fileProviders + model: UM.FileProviderModel { } + MenuItem + { + text: + { + return model.displayText; + } + onTriggered: + { + if (model.index == 0) // The 0th element is the "From Disk" option, which should activate the open local file dialog + { + Cura.Actions.open.trigger() + } + else + { + fileProviders.model.trigger(model.name); + } + } + shortcut: model.shortcut + } + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem(object) + } +} From 49effbcd806f0cc3b99a226bc58bcc47614fb2d6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 17 Dec 2020 10:22:29 +0100 Subject: [PATCH 025/128] Disable survey button --- plugins/CuraDrive/src/qml/pages/BackupsPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraDrive/src/qml/pages/BackupsPage.qml b/plugins/CuraDrive/src/qml/pages/BackupsPage.qml index c337294744..bb17cea973 100644 --- a/plugins/CuraDrive/src/qml/pages/BackupsPage.qml +++ b/plugins/CuraDrive/src/qml/pages/BackupsPage.qml @@ -69,7 +69,7 @@ Item BackupListFooter { id: backupListFooter - showInfoButton: backupList.model.length > 4 + } } } From df414909403642dbbe90a5fc55398851151dc009 Mon Sep 17 00:00:00 2001 From: Eryone <40707672+Eryone@users.noreply.github.com> Date: Thu, 17 Dec 2020 18:06:20 +0800 Subject: [PATCH 026/128] Improved the setting --- resources/definitions/eryone_er20.def.json | 212 +++++++++++++++++- .../eryone_er20/eryone_er20_draft.inst.cfg | 48 ---- .../eryone_er20/eryone_er20_high.inst.cfg | 57 +---- .../eryone_er20/eryone_er20_normal.inst.cfg | 54 +---- 4 files changed, 212 insertions(+), 159 deletions(-) diff --git a/resources/definitions/eryone_er20.def.json b/resources/definitions/eryone_er20.def.json index 66182790ef..b1349edc0c 100644 --- a/resources/definitions/eryone_er20.def.json +++ b/resources/definitions/eryone_er20.def.json @@ -17,13 +17,27 @@ }, "overrides": { - "machine_name": { "default_value": "Eryone ER20" }, - "machine_heated_bed": { "default_value": true }, - "machine_width": { "default_value": 250 }, - "machine_height": { "default_value": 200 }, - "machine_depth": { "default_value": 220 }, - "machine_center_is_zero": { "default_value": false }, - "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_name": { + "default_value": "Eryone ER20" + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_width": { + "default_value": 250 + }, + "machine_height": { + "default_value": 200 + }, + "machine_depth": { + "default_value": 220 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, "machine_head_with_fans_polygon": { "default_value": [ [-10, -10], @@ -38,6 +52,190 @@ }, "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" + }, + "material_print_temperature": { + "value": 205 + }, + "material_print_temperature_layer_0": { + "value": 215 + }, + "material_initial_print_temperature": { + "value": 205 + }, + "material_final_print_temperature": { + "value": 205 + }, + "acceleration_enabled": { + "value": true + }, + "acceleration_travel": { + "value": 1800 + }, + "adhesion_type": { + "value": "'brim'" + }, + "brim_width": { + "value": 5 + }, + "cool_fan_full_at_height": { + "value": 0.5 + }, + "cool_fan_speed": { + "value": 100 + }, + "cool_fan_speed_0": { + "value": 100 + }, + "infill_overlap": { + "value": "25 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0", + "maximum_value_warning": 100, + "minimum_value_warning": -50 + }, + "infill_pattern": { + "value": "'grid'" + }, + "infill_sparse_density": { + "value": 20 + }, + "initial_layer_line_width_factor": { + "value": 105 + }, + "infill_before_walls": { + "value": false + }, + "material_bed_temperature": { + "value": 60 + }, + "material_bed_temperature_layer_0": { + "value": 65 + }, + "optimize_wall_printing_order": { + "default_value": true + }, + "retract_at_layer_change": { + "value": true + }, + "retraction_amount": { + "default_value": 4 + }, + "retraction_hop": { + "value": 0.075 + }, + "retraction_hop_enabled": { + "value": false + }, + "retraction_hop_only_when_collides": { + "value": true + }, + "retraction_min_travel": { + "value": 1.5 + }, + "retraction_speed": { + "default_value": 85, + "maximum_value_warning": 100 + }, + "retraction_retract_speed": { + "maximum_value_warning": 130 + }, + "retraction_prime_speed": { + "value": "math.ceil(retraction_speed * 0.4)", + "maximum_value_warning": 130 + }, + "retraction_combing": { + "value": "'noskin'" + }, + "skin_overlap": { + "value": 10 + }, + "skirt_brim_speed": { + "value": 40 + }, + "skirt_gap": { + "value": 5 + }, + "skirt_line_count": { + "value": 3 + }, + "speed_infill": { + "value": "speed_print" + }, + "speed_topbottom": { + "value": "math.ceil(speed_print * 20 / 50)" + }, + "speed_travel": { + "value": "150" + }, + "speed_layer_0": { + "value": "20" + }, + "speed_wall": { + "value": "speed_print" + }, + "speed_wall_0": { + "value": "math.ceil(speed_print * 30 / 50)" + }, + "speed_wall_x": { + "value": "speed_print" + }, + "support_angle": { + "value": 50 + }, + "support_enable": { + "default_value": false + }, + "support_interface_enable": { + "value": true + }, + "support_pattern": { + "value": "'triangles'" + }, + "support_roof_enable": { + "value": true + }, + "support_type": { + "value": "'everywhere'" + }, + "support_use_towers": { + "value": false + }, + "support_z_distance": { + "value": 0.3 + }, + "support_xy_distance": { + "value": 0.7 + }, + "support_xy_distance_overhang": { + "value": 0.2 + }, + "smooth_spiralized_contours": { + "value": false + }, + "travel_retract_before_outer_wall": { + "value": true + }, + "wall_line_count": { + "value": 3 + }, + "wall_thickness": { + "value": "1.2" + }, + "bottom_layers": { + "value": "4" + }, + "bottom_thickness":{ + "value": "layer_height * 4" + }, + "top_thickness":{ + "value": "layer_height * 5" + }, + "top_layers": { + "value": "5" + }, + "z_seam_type": { + "value": "'shortest'" + }, + "z_seam_corner": { + "value": "'z_seam_corner_inner'" } } } diff --git a/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg b/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg index 008ed519a7..6ba6af5aec 100644 --- a/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg +++ b/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg @@ -11,56 +11,8 @@ weight = -2 global_quality = True [values] -acceleration_enabled = True acceleration_print = 1500 -acceleration_travel = 3000 -adhesion_type = brim -brim_width = 4.0 -cool_fan_full_at_height = 0.5 -cool_fan_speed = 100 -cool_fan_speed_0 = 100 -infill_overlap = 15 -infill_pattern = zigzag -infill_sparse_density = 25 -initial_layer_line_width_factor = 105 -jerk_enabled = True -jerk_print = 10 -jerk_travel = 12 layer_height = 0.3 layer_height_0 = 0.3 -material_bed_temperature = 60 -material_diameter = 1.75 -default_material_print_temperature = 205 -material_print_temperature = 205 -material_print_temperature_layer_0 = 205 -material_initial_print_temperature = 205 -material_final_print_temperature = 205 -retract_at_layer_change = False -retraction_amount = 6 -retraction_hop = 0.075 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 1.5 -retraction_speed = 55 -skirt_brim_speed = 40 -skirt_gap = 5 -skirt_line_count = 3 -speed_infill = =speed_print speed_print = 80 speed_support = 60 -speed_topbottom = =math.ceil(speed_print * 30 / 60) -speed_travel = 150 -speed_wall = =speed_print -speed_wall_x = =speed_print -support_angle = 50 -support_enable = True -support_interface_enable = True -support_pattern = triangles -support_roof_enable = True -support_type = everywhere -support_use_towers = False -support_z_distance = 0.3 -support_xy_distance = 0.7 -support_xy_distance_overhang = 0.2 -top_bottom_thickness = 1.2 -wall_thickness = 1.2 diff --git a/resources/quality/eryone_er20/eryone_er20_high.inst.cfg b/resources/quality/eryone_er20/eryone_er20_high.inst.cfg index d504bb5acd..04822040a5 100644 --- a/resources/quality/eryone_er20/eryone_er20_high.inst.cfg +++ b/resources/quality/eryone_er20/eryone_er20_high.inst.cfg @@ -11,67 +11,12 @@ weight = 1 global_quality = True [values] -acceleration_enabled = True acceleration_print = 500 -acceleration_travel = 3000 -adhesion_type = brim -brim_width = 6.0 -cool_fan_full_at_height = 0.5 -cool_fan_speed = 100 -cool_fan_speed_0 = 100 -infill_overlap = 25 -infill_pattern = zigzag -infill_sparse_density = 25 -initial_layer_line_width_factor = 105 -jerk_enabled = True -jerk_print = 8 -jerk_travel = 10 layer_height = 0.15 layer_height_0 = 0.2 -line_width = 0.42 -material_bed_temperature = 60 -material_diameter = 1.75 -default_material_print_temperature = 205 -material_print_temperature = 205 -material_print_temperature_layer_0 = 205 -material_initial_print_temperature = 205 -material_final_print_temperature = 205 -optimize_wall_printing_order = True -outer_inset_first = True -retract_at_layer_change = False -retraction_amount = 6 -retraction_hop = 0.075 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 1.5 -retraction_speed = 55 -retraction_combing = noskin -skin_overlap = 10 -skirt_brim_speed = 40 -skirt_gap = 5 -skirt_line_count = 3 -speed_infill = =speed_print speed_print = 50 speed_support = 30 -speed_topbottom = =math.ceil(speed_print * 20 / 50) -speed_travel = 150 -speed_wall = =speed_print -speed_wall_x = =speed_print -support_angle = 50 -support_enable = True -support_interface_enable = True -support_pattern = triangles -support_roof_enable = True -support_type = everywhere -support_use_towers = False -support_z_distance = 0.3 -support_xy_distance = 0.7 -support_xy_distance_overhang = 0.2 -smooth_spiralized_contours = False -top_bottom_thickness = 1.2 -travel_retract_before_outer_wall = True -wall_thickness = 1.2 -z_seam_corner = z_seam_corner_weighted + diff --git a/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg b/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg index 33f7a4b619..1c29936cc0 100644 --- a/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg +++ b/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg @@ -11,56 +11,14 @@ weight = 0 global_quality = True [values] -acceleration_enabled = True acceleration_print = 1000 -acceleration_travel = 3000 -adhesion_type = brim -brim_width = 5 -cool_fan_full_at_height = 0.5 -cool_fan_speed = 100 -cool_fan_speed_0 = 100 -infill_overlap = 15 -infill_pattern = zigzag -infill_sparse_density = 25 -initial_layer_line_width_factor = 105 -jerk_enabled = True -jerk_print = 8 -jerk_travel = 10 layer_height = 0.2 layer_height_0 = 0.2 -material_bed_temperature = 60 -material_diameter = 1.75 -default_material_print_temperature = 205 -material_print_temperature = 205 -material_print_temperature_layer_0 = 205 -material_initial_print_temperature = 205 -material_final_print_temperature = 205 -retract_at_layer_change = False -retraction_amount = 6 -retraction_hop = 0.075 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 1.5 -retraction_speed = 55 -skirt_brim_speed = 40 -skirt_gap = 5 -skirt_line_count = 3 -speed_infill = =speed_print speed_print = 50 speed_support = 30 -speed_topbottom = =math.ceil(speed_print * 20 / 50) -speed_travel = 150 -speed_wall = =speed_print -speed_wall_x = =speed_print -support_angle = 50 -support_enable = True -support_interface_enable = True -support_pattern = triangles -support_roof_enable = True -support_type = everywhere -support_use_towers = False -support_z_distance = 0.3 -support_xy_distance = 0.7 -support_xy_distance_overhang = 0.2 -top_bottom_thickness = 1.2 -wall_thickness = 1.2 + + + + + + From b6ba0eac3533daba7f2a2d653ff8582564d13857 Mon Sep 17 00:00:00 2001 From: Eryone <40707672+Eryone@users.noreply.github.com> Date: Thu, 17 Dec 2020 18:16:07 +0800 Subject: [PATCH 027/128] DelDelete the space tab Deleted the space tab --- resources/definitions/eryone_er20.def.json | 19 ------------------- .../eryone_er20/eryone_er20_draft.inst.cfg | 2 +- .../eryone_er20/eryone_er20_high.inst.cfg | 8 +------- .../eryone_er20/eryone_er20_normal.inst.cfg | 8 +------- 4 files changed, 3 insertions(+), 34 deletions(-) diff --git a/resources/definitions/eryone_er20.def.json b/resources/definitions/eryone_er20.def.json index b1349edc0c..236ef63188 100644 --- a/resources/definitions/eryone_er20.def.json +++ b/resources/definitions/eryone_er20.def.json @@ -239,22 +239,3 @@ } } } - - - - - - - - - - - - - - - - - - - diff --git a/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg b/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg index 6ba6af5aec..64e4f2b180 100644 --- a/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg +++ b/resources/quality/eryone_er20/eryone_er20_draft.inst.cfg @@ -15,4 +15,4 @@ acceleration_print = 1500 layer_height = 0.3 layer_height_0 = 0.3 speed_print = 80 -speed_support = 60 +speed_support = 60 \ No newline at end of file diff --git a/resources/quality/eryone_er20/eryone_er20_high.inst.cfg b/resources/quality/eryone_er20/eryone_er20_high.inst.cfg index 04822040a5..db15abbeb4 100644 --- a/resources/quality/eryone_er20/eryone_er20_high.inst.cfg +++ b/resources/quality/eryone_er20/eryone_er20_high.inst.cfg @@ -15,10 +15,4 @@ acceleration_print = 500 layer_height = 0.15 layer_height_0 = 0.2 speed_print = 50 -speed_support = 30 - - - - - - +speed_support = 30 \ No newline at end of file diff --git a/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg b/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg index 1c29936cc0..ca29834126 100644 --- a/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg +++ b/resources/quality/eryone_er20/eryone_er20_normal.inst.cfg @@ -15,10 +15,4 @@ acceleration_print = 1000 layer_height = 0.2 layer_height_0 = 0.2 speed_print = 50 -speed_support = 30 - - - - - - +speed_support = 30 \ No newline at end of file From 037b5d5b44014dfead2a4a6fe336fe88da3b9dbc Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 18 Dec 2020 11:31:55 +0100 Subject: [PATCH 028/128] Ensure that the skirt_brim_line_width is selected from right extruder This fixes CURA-7835 and Fixes #8716 --- cura/BuildVolume.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 6bda2d94e3..fd953a838a 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1068,7 +1068,14 @@ class BuildVolume(SceneNode): adhesion_type = adhesion_override if adhesion_type is None: adhesion_type = container_stack.getProperty("adhesion_type", "value") - skirt_brim_line_width = self._global_container_stack.getProperty("skirt_brim_line_width", "value") + + # Skirt_brim_line_width is a bit of an odd one out. The primary bit of the skirt/brim is printed + # with the adhesion extruder, but it also prints one extra line by all other extruders. As such, the + # setting does *not* have a limit_to_extruder setting (which means that we can't ask the global extruder what + # the value is. + adhesion_extruder = self._global_container_stack.getProperty("adhesion_extruder_nr", "value") + skirt_brim_line_width = self._global_container_stack.extruderList[int(adhesion_extruder)].getProperty("skirt_brim_line_width", "value") + initial_layer_line_width_factor = self._global_container_stack.getProperty("initial_layer_line_width_factor", "value") # Use brim width if brim is enabled OR the prime tower has a brim. if adhesion_type == "brim": From cd76326fed2f8d6328dda9e66dbc7f43d53d6762 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 18 Dec 2020 11:52:53 +0100 Subject: [PATCH 029/128] Fix tests CURA-7835 --- tests/TestBuildVolume.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/TestBuildVolume.py b/tests/TestBuildVolume.py index c5d59b64d7..293b8e0270 100644 --- a/tests/TestBuildVolume.py +++ b/tests/TestBuildVolume.py @@ -66,9 +66,12 @@ class TestCalculateBedAdhesionSize: return properties.get(args[2]) def createAndSetGlobalStack(self, build_volume): - mocked_stack = MagicMock() + mocked_stack = MagicMock(name = "mocked_stack") mocked_stack.getProperty = MagicMock(side_effect=self.getPropertySideEffect) + mocked_extruder = MagicMock(name = "mocked_extruder") + mocked_extruder.getProperty = MagicMock(side_effect=self.getPropertySideEffect) + mocked_stack.extruderList = [mocked_extruder] build_volume._global_container_stack = mocked_stack def test_noGlobalStack(self, build_volume: BuildVolume): @@ -90,6 +93,7 @@ class TestCalculateBedAdhesionSize: self.createAndSetGlobalStack(build_volume) patched_dictionary = self.setting_property_dict.copy() patched_dictionary.update(setting_dict) + patched_dictionary.update({"adhesion_extruder_nr": {"value": 0}}) with patch.dict(self.setting_property_dict, patched_dictionary): assert build_volume._calculateBedAdhesionSize([]) == result From 561620336eab48a0554e4447e0e5ae1f10d1d602 Mon Sep 17 00:00:00 2001 From: StijnArntz <41779876+StijnArntz@users.noreply.github.com> Date: Fri, 18 Dec 2020 14:08:41 +0100 Subject: [PATCH 030/128] Update CPE settings for UM2C Combing settings for 0.4nozzle --- .../quality/ultimaker2_plus_connect/um2pc_cpe_0.4_fast.inst.cfg | 1 + .../quality/ultimaker2_plus_connect/um2pc_cpe_0.4_high.inst.cfg | 1 + .../ultimaker2_plus_connect/um2pc_cpe_0.4_normal.inst.cfg | 1 + 3 files changed, 3 insertions(+) diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_fast.inst.cfg index a45f1d3e6c..228b0fb853 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_fast.inst.cfg @@ -27,3 +27,4 @@ speed_wall_0 = =math.ceil(speed_print * 30 / 45) speed_topbottom = =math.ceil(speed_print * 30 / 45) speed_wall_x = =math.ceil(speed_print * 40 / 45) speed_infill = =math.ceil(speed_print * 45 / 45) +retraction_combing_max_distance = 50 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_high.inst.cfg index bcbc535fe0..b4f7f13a42 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_high.inst.cfg @@ -24,3 +24,4 @@ top_bottom_thickness = 0.72 wall_thickness = 1.05 speed_topbottom = =math.ceil(speed_print * 15 / 45) speed_infill = =math.ceil(speed_print * 45 / 45) +retraction_combing_max_distance = 50 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_normal.inst.cfg index 71f2916a3a..6d417fe0f1 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_normal.inst.cfg @@ -22,3 +22,4 @@ speed_print = 45 speed_wall = =math.ceil(speed_print * 30 / 45) top_bottom_thickness = 0.8 wall_thickness = 1.05 +retraction_combing_max_distance = 50 From 43615a57b61c2be31a439025f4bf6279b45a63a0 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 18 Dec 2020 14:34:29 +0100 Subject: [PATCH 031/128] Change client scope in the Account CURA-7868 --- cura/API/Account.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 15bccb71e1..d5ef2bfcb9 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -81,7 +81,8 @@ class Account(QObject): CLIENT_ID="um----------------------------ultimaker_cura", CLIENT_SCOPES="account.user.read drive.backup.read drive.backup.write packages.download " "packages.rating.read packages.rating.write connect.cluster.read connect.cluster.write " - "cura.printjob.read cura.printjob.write cura.mesh.read cura.mesh.write", + "library.project.read library.project.write cura.printjob.read cura.printjob.write " + "cura.mesh.read cura.mesh.write", AUTH_DATA_PREFERENCE_KEY="general/ultimaker_auth_data", AUTH_SUCCESS_REDIRECT="{}/app/auth-success".format(self._oauth_root), AUTH_FAILED_REDIRECT="{}/app/auth-error".format(self._oauth_root) From 19a8bd63ab55d095f82c63026784085b3bec6355 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 18 Dec 2020 15:31:48 +0100 Subject: [PATCH 032/128] Remove unused variable CURA-6682 --- plugins/Toolbox/src/Toolbox.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 98054c26e9..60c8f9107e 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -46,8 +46,6 @@ class Toolbox(QObject, Extension): self._application = application # type: CuraApplication - self._sdk_version = ApplicationMetadata.CuraSDKVersion # type: Union[str, int] - # Network: self._download_request_data = None # type: Optional[HttpRequestData] self._download_progress = 0 # type: float From 5b43c94c0b6e916d9ce8afe531db0315c7845ba4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 21 Dec 2020 13:15:32 +0100 Subject: [PATCH 033/128] Mark setting as disabled in perobject setting panel if it's enabled property requires it This is a bit different from the rest, since hiding would mean that the setting can't be removed. CURA-7569 --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index e834372ae9..cf3e182096 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -237,7 +237,7 @@ Item id: settingLoader width: UM.Theme.getSize("setting").width height: UM.Theme.getSize("section").height - + enabled: provider.properties.enabled === "True" property var definition: model property var settingDefinitionsModel: addedSettingsModel property var propertyProvider: provider From 9efe5dd5e29f36732148731c389c8bb280ab2402 Mon Sep 17 00:00:00 2001 From: FusedForm <69219710+FusedForm@users.noreply.github.com> Date: Tue, 22 Dec 2020 11:27:15 -0500 Subject: [PATCH 034/128] Small parameter update for printing improvement (#8961) * Add files via upload * Add files via upload * Add files via upload * Update fusedform_300_draft_abs.inst.cfg * Add files via upload * Delete fusedform_300_draft_abs.inst.cfg * Delete fusedform_300_draft_pla.inst.cfg * Deletion of old files * changes in STD quality profiles * Changes in mini quality files * Changes in FF600 quality files * changes in machine definition name * Changes in definition files * extruder and definition linking * ff300 inherits and extruder def * Update fusedform_300.def.json * category deprecation in definitions * inherits * ff300 extruder definition machine * extruder machine definitions * Fused form FF600plus machine profiles * PETG profiles * Update fusedform_300.def.json * changes in start gcode * machine configuration dynamics on definitions * speed adjustments * dynamics modification in petg and flex quality * Further adjustments on dynamics definitiosn * Modification of all files under inherits data structure. * Quality setting version 15 to 16 * These changes are for limiting quality types in the materials defined * Quality Modification under Global and Material specific structure Global quality structures and material specific definitions under the global structures * Addition of double extruder machine definitions * Machine definitions update according to structure * Doppia Base definitions erased, Doppia definitions updated to use a single base definition. * extruder 1 base definition fix * extruder train overrides * extruder modifications * Update fusedform_300_doppia.def.json * Base settings and extruder definitions * retraction modification to avoid filament damage * REdefinition test of second extruder train in doppia * Update fusedform_300_doppia.def.json * Update fusedform_base_extruder_1.def.json * Update fusedform_300_doppia.def.json * Update fusedform_300_doppia.def.json * Update fusedform_300_doppia.def.json * Update fusedform_base_extruder_1.def.json * Update fusedform_300_doppia.def.json * Update fusedform_600_doppia.def.json * Update fusedform_600_doppia.def.json * Additional updates in Doppia definitions * Creation of Doppia base definition, doppia extruders. Update in doppia machine definitions * correction in quality definitions to pull base definitions from a single base * more corrections * small parameter update Small changes in printing parameters to optimize retraction and other settings. --- resources/definitions/fusedform_300_doppia.def.json | 2 +- resources/definitions/fusedform_600plus_doppia.def.json | 3 +++ resources/definitions/fusedform_base.def.json | 2 +- resources/definitions/fusedform_doppia_base.def.json | 6 ++++-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/resources/definitions/fusedform_300_doppia.def.json b/resources/definitions/fusedform_300_doppia.def.json index ed8fa719a6..6b13bc02ea 100644 --- a/resources/definitions/fusedform_300_doppia.def.json +++ b/resources/definitions/fusedform_300_doppia.def.json @@ -10,7 +10,7 @@ "overrides": { "machine_extruder_count": { "value": 2 }, "machine_name": { "default_value": "FF300 Doppia" }, - "machine_width": { "default_value": 320 }, + "machine_width": { "default_value": 360 }, "machine_depth": { "default_value": 300 }, "machine_height": { "default_value": 320 }, "machine_max_feedrate_x": { "default_value": 100 }, diff --git a/resources/definitions/fusedform_600plus_doppia.def.json b/resources/definitions/fusedform_600plus_doppia.def.json index 18959e8084..de3889c1a8 100644 --- a/resources/definitions/fusedform_600plus_doppia.def.json +++ b/resources/definitions/fusedform_600plus_doppia.def.json @@ -25,6 +25,9 @@ "machine_max_jerk_z": { "default_value": 0.3 }, "machine_max_jerk_e": { "default_value": 5 }, "acceleration_travel": {"value":900} + + + } } diff --git a/resources/definitions/fusedform_base.def.json b/resources/definitions/fusedform_base.def.json index b68ab1a449..24b841f704 100644 --- a/resources/definitions/fusedform_base.def.json +++ b/resources/definitions/fusedform_base.def.json @@ -54,7 +54,7 @@ "retraction_amount": { "default_value": 4 }, "retraction_speed": { "default_value": 70}, "retraction_min_travel": {"value":5 }, - "retraction_count_max": {"value":10 }, + "retraction_count_max": {"default_value":10 }, "retraction_extrusion_window": {"value":4 }, "retraction_hop": {"default_value":0.2}, "retraction_hop_enabled": {"value":true}, diff --git a/resources/definitions/fusedform_doppia_base.def.json b/resources/definitions/fusedform_doppia_base.def.json index 7513ea9fb4..ddee568e28 100644 --- a/resources/definitions/fusedform_doppia_base.def.json +++ b/resources/definitions/fusedform_doppia_base.def.json @@ -54,7 +54,7 @@ "retraction_amount": { "default_value": 4 }, "retraction_speed": { "default_value": 70}, "retraction_min_travel": {"value":5 }, - "retraction_count_max": {"value":10 }, + "retraction_count_max": {"default_value":10 }, "retraction_extrusion_window": {"value":4 }, "retraction_hop": {"default_value":0.2}, "retraction_hop_enabled": {"value":true}, @@ -77,7 +77,9 @@ "support_xy_distance": {"value": 0.5}, "support_z_distance": {"value": 0.3 }, + "adhesion_type": {"default_value":"skirt"}, - "adhesion_type": {"default_value":"skirt"} + "switch_extruder_retraction_amount": { "value": 6 }, + "switch_extruder_retraction_speeds": { "value": 60 } } } From 71994eaaf90ca6302cbbc860ebb1366bf710b8fe Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 23 Dec 2020 17:13:14 +0100 Subject: [PATCH 035/128] Change the Open File(s) option according to the file providers count When there is only one file provider (i.e. the local file provider), the Open File(s) will be a simple item in the File menu. When there are more than one file providers, the Open File(s) will become a submenu in the File menu, which will contain all the file providers as submenu items. CURA-7868 --- cura/CuraApplication.py | 11 +++++++++++ resources/qml/Menus/FileMenu.qml | 18 +++++++++++++++--- resources/qml/Menus/OpenFilesMenu.qml | 11 +++++------ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index f0c69d5a61..ee347e7a4d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -30,6 +30,7 @@ from UM.Operations.SetTransformOperation import SetTransformOperation from UM.Platform import Platform from UM.PluginError import PluginNotFoundError from UM.Preferences import Preferences +from UM.Qt.Bindings.FileProviderModel import FileProviderModel from UM.Qt.QtApplication import QtApplication # The class we're inheriting from. from UM.Resources import Resources from UM.Scene.Camera import Camera @@ -822,6 +823,9 @@ class CuraApplication(QtApplication): self._add_printer_pages_model_without_cancel.initialize(cancellable = False) self._whats_new_pages_model.initialize() + # Initialize the FileProviderModel + self._file_provider_model.initialize(self._onFileProviderEnabledChanged) + # Detect in which mode to run and execute that mode if self._is_headless: self.runWithoutGUI() @@ -1051,6 +1055,13 @@ class CuraApplication(QtApplication): self._simple_mode_settings_manager = SimpleModeSettingsManager() return self._simple_mode_settings_manager + @pyqtSlot(result = QObject) + def getFileProviderModel(self) -> FileProviderModel: + return self._file_provider_model + + def _onFileProviderEnabledChanged(self): + self._file_provider_model.update() + def event(self, event): """Handle Qt events""" diff --git a/resources/qml/Menus/FileMenu.qml b/resources/qml/Menus/FileMenu.qml index 24c081502a..a1bd246763 100644 --- a/resources/qml/Menus/FileMenu.qml +++ b/resources/qml/Menus/FileMenu.qml @@ -22,11 +22,23 @@ Menu { id: openMenu action: Cura.Actions.open - visible: CuraApplication.fileProviders.length > 0 // DEBUG: It's > 0 so that both options are visible for debugging purposes + visible: (CuraApplication.getFileProviderModel().count == 1) } - OpenFilesMenu { - visible: CuraApplication.fileProviders.length > 0 // DEBUG: It's > 0 so that both options are visible for debugging purposes + OpenFilesMenu + { + id: openFilesMenu + visible: (CuraApplication.getFileProviderModel().count > 1) + } + + Connections + { + target: CuraApplication.getFileProviderModel() + onItemsChanged: + { + openMenu.visible = (CuraApplication.getFileProviderModel().count == 1) // 1 because the open local files menu should always exist in the model + openFilesMenu.visible = (CuraApplication.getFileProviderModel().count > 1) + } } RecentFilesMenu { } diff --git a/resources/qml/Menus/OpenFilesMenu.qml b/resources/qml/Menus/OpenFilesMenu.qml index a3afa9a598..226ea70680 100644 --- a/resources/qml/Menus/OpenFilesMenu.qml +++ b/resources/qml/Menus/OpenFilesMenu.qml @@ -11,15 +11,14 @@ import "../Dialogs" Menu { - id: menu + id: openFilesMenu title: catalog.i18nc("@title:menu menubar:file", "Open File(s)...") iconName: "document-open-recent"; - Instantiator { id: fileProviders - model: UM.FileProviderModel { } + model: CuraApplication.getFileProviderModel() MenuItem { text: @@ -34,12 +33,12 @@ Menu } else { - fileProviders.model.trigger(model.name); + CuraApplication.getFileProviderModel().trigger(model.name); } } shortcut: model.shortcut } - onObjectAdded: menu.insertItem(index, object) - onObjectRemoved: menu.removeItem(object) + onObjectAdded: openFilesMenu.insertItem(index, object) + onObjectRemoved: openFilesMenu.removeItem(object) } } From ba9e10cfd80623909eaa4217add4ba3665d2bee2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 24 Dec 2020 16:08:12 +0100 Subject: [PATCH 036/128] Round temperatures when displaying them These are long lines for some screens. It'll save a bit of space. No PID controller can really control down to fractional degrees. Fan speed and flow rates are already integer settings. For speeds and retraction lenghts the fractions can be important. Done for #8967. --- plugins/PostProcessingPlugin/scripts/ChangeAtZ.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py index b4036f7ff2..a23e52b750 100644 --- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py @@ -774,15 +774,15 @@ class ChangeAtZProcessor: # looking for wait for bed temp if "bedTemp" in values: - codes.append("BedTemp: " + str(values["bedTemp"])) + codes.append("BedTemp: " + str(round(values["bedTemp"]))) # set our extruder one temp (if specified) if "extruderOne" in values: - codes.append("Extruder 1 Temp: " + str(values["extruderOne"])) + codes.append("Extruder 1 Temp: " + str(round(values["extruderOne"]))) # set our extruder two temp (if specified) if "extruderTwo" in values: - codes.append("Extruder 2 Temp: " + str(values["extruderTwo"])) + codes.append("Extruder 2 Temp: " + str(round(values["extruderTwo"]))) # set global flow rate if "flowrate" in values: From cf7b0d9768e5e922a7abea42da7fd93244f1e96a Mon Sep 17 00:00:00 2001 From: Tim Gates Date: Tue, 29 Dec 2020 09:35:29 +1100 Subject: [PATCH 037/128] docs: fix simple typo, thier -> their There is a small typo in docs/How_to_use_the_flame_graph_profiler.md. Should read `their` rather than `thier`. --- docs/How_to_use_the_flame_graph_profiler.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/How_to_use_the_flame_graph_profiler.md b/docs/How_to_use_the_flame_graph_profiler.md index b1cdaf358e..b40a86bb24 100644 --- a/docs/How_to_use_the_flame_graph_profiler.md +++ b/docs/How_to_use_the_flame_graph_profiler.md @@ -27,7 +27,7 @@ Note: The profiler front-end itself is quite "heavy" (ok, not optimised). It run What the Profiler Sees ---------------------- -The profiler doesn't capture every function call in Cura. It hooks into a number of important systems which give a good picture of activity without too much run time overhead. The most important system is Uranium's signal mechanism and PyQt5 slots. Functions which are called via the signal mechanism are recorded and thier names appear in the results. PyQt5 slots appear in the results with the prefix `[SLOT]`. +The profiler doesn't capture every function call in Cura. It hooks into a number of important systems which give a good picture of activity without too much run time overhead. The most important system is Uranium's signal mechanism and PyQt5 slots. Functions which are called via the signal mechanism are recorded and their names appear in the results. PyQt5 slots appear in the results with the prefix `[SLOT]`. Note that not all slots are captured. Only those slots which belong to classes which use the `pyqtSlot` decorator from the `UM.FlameProfiler` module. From 47723e982341737443b41956e975b2303342fb0e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 3 Jan 2021 13:22:51 +0100 Subject: [PATCH 038/128] Fix definition of machine_gcode_flavor setting in PauseAtHeight --- plugins/PostProcessingPlugin/scripts/PauseAtHeight.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py index fc7bfec60a..69a67990fe 100644 --- a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py @@ -182,8 +182,7 @@ class PauseAtHeight(Script): "Repetier": "Repetier" }, "default_value": "RepRap (Marlin/Sprinter)", - "enabled": false, - "default_value": "" + "enabled": false }, "custom_gcode_before_pause": { From d7970673268597a1931115fafaca67a4ce85914c Mon Sep 17 00:00:00 2001 From: HUNIBEST-HyVISION Date: Mon, 4 Jan 2021 14:03:42 +0900 Subject: [PATCH 039/128] [CUBICON] Add device(Style NEO-A31) & Update start gcode. --- .../cubicon_style_neo_a22.def.json | 2 +- .../cubicon_style_neo_a31.def.json | 40 +++++++++++++++++++ .../cubicon_style_plus_a15.def.json | 2 +- .../cubicon_style_neo_a31_extruder_0.def.json | 26 ++++++++++++ 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 resources/definitions/cubicon_style_neo_a31.def.json create mode 100644 resources/extruders/cubicon_style_neo_a31_extruder_0.def.json diff --git a/resources/definitions/cubicon_style_neo_a22.def.json b/resources/definitions/cubicon_style_neo_a22.def.json index 95d6b5e933..01763524a4 100644 --- a/resources/definitions/cubicon_style_neo_a22.def.json +++ b/resources/definitions/cubicon_style_neo_a22.def.json @@ -22,7 +22,7 @@ "default_value": "Cubicon Style Neo-A22" }, "machine_start_gcode": { - "default_value": "M911 Style Neo-A22\nM201 X400 Y400\nM202 X400 Y400\nG28 ; Home\nG1 Z15.0 F6000 ;move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0" + "default_value": "M911 Style Neo-A22\nM201 X400 Y400\nM202 X400 Y400\nG28 ; Home\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0" }, "machine_width": { "default_value": 220 diff --git a/resources/definitions/cubicon_style_neo_a31.def.json b/resources/definitions/cubicon_style_neo_a31.def.json new file mode 100644 index 0000000000..d41b6fc17e --- /dev/null +++ b/resources/definitions/cubicon_style_neo_a31.def.json @@ -0,0 +1,40 @@ +{ + "version": 2, + "name": "Cubicon Style Neo-A31", + "inherits": "cubicon_common", + "metadata": { + "author": "Cubicon R&D Center", + "manufacturer": "Cubicon", + "visible": true, + "file_formats": "text/x-gcode", + "supports_usb_connection": false, + "machine_extruder_trains": { + "0": "cubicon_style_neo_a31_extruder_0" + }, + "platform_offset": [ + 0, + 0, + 0 + ] + }, + "overrides": { + "machine_name": { + "default_value": "Cubicon Style Neo-A31" + }, + "machine_start_gcode": { + "default_value": "M911 Style Neo-A31\nM201 X400 Y400\nM202 X400 Y400\nG28 ; Home\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0" + }, + "machine_width": { + "default_value": 310 + }, + "machine_depth": { + "default_value": 310 + }, + "machine_height": { + "default_value": 310 + }, + "material_bed_temp_wait":{ + "default_value": false + } + } +} diff --git a/resources/definitions/cubicon_style_plus_a15.def.json b/resources/definitions/cubicon_style_plus_a15.def.json index a55d5aa791..b7e3dfd123 100644 --- a/resources/definitions/cubicon_style_plus_a15.def.json +++ b/resources/definitions/cubicon_style_plus_a15.def.json @@ -22,7 +22,7 @@ "default_value": "Cubicon Style Plus-A15" }, "machine_start_gcode": { - "default_value": "M911 Style Plus-A15\nM201 X400 Y400\nM202 X400 Y400\nG28 ; Home\nG1 Z15.0 F6000 ;move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0" + "default_value": "M911 Style Plus-A15\nM201 X400 Y400\nM202 X400 Y400\nG28 ; Home\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0" }, "machine_width": { "default_value": 150 diff --git a/resources/extruders/cubicon_style_neo_a31_extruder_0.def.json b/resources/extruders/cubicon_style_neo_a31_extruder_0.def.json new file mode 100644 index 0000000000..4f6ced9818 --- /dev/null +++ b/resources/extruders/cubicon_style_neo_a31_extruder_0.def.json @@ -0,0 +1,26 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "cubicon_style_neo_a31", + "position": "0" + }, + "overrides": { + "extruder_nr": { + "default_value": 0 + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "machine_nozzle_offset_x": { + "default_value": -7.13 + }, + "machine_nozzle_offset_y": { + "default_value": -3.77 + }, + "material_diameter": { + "default_value": 1.75 + } + } +} From 70550594cd113bee4af662c1dd980738ed3dbe0d Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 4 Jan 2021 15:07:53 +0100 Subject: [PATCH 040/128] Connect the visibility of the components through their properties As Ghostkeeper suspected correctly in the review comment https://github.com/Ultimaker/Cura/pull/9012#discussion_r549707433 the binding wasn't working because the model was being retrieved using a function (CuraApplication.getFileProviderModel()). Separating this model into a variable allows us to properly bind the "visible" properties of the menu items with the count property of the model without a problem. CURA-7868 --- resources/qml/Menus/FileMenu.qml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/resources/qml/Menus/FileMenu.qml b/resources/qml/Menus/FileMenu.qml index a1bd246763..94fc2358e1 100644 --- a/resources/qml/Menus/FileMenu.qml +++ b/resources/qml/Menus/FileMenu.qml @@ -11,6 +11,7 @@ Menu { id: base title: catalog.i18nc("@title:menu menubar:toplevel", "&File") + property var fileProviderModel: CuraApplication.getFileProviderModel() MenuItem { @@ -22,23 +23,13 @@ Menu { id: openMenu action: Cura.Actions.open - visible: (CuraApplication.getFileProviderModel().count == 1) + visible: (base.fileProviderModel.count == 1) } OpenFilesMenu { id: openFilesMenu - visible: (CuraApplication.getFileProviderModel().count > 1) - } - - Connections - { - target: CuraApplication.getFileProviderModel() - onItemsChanged: - { - openMenu.visible = (CuraApplication.getFileProviderModel().count == 1) // 1 because the open local files menu should always exist in the model - openFilesMenu.visible = (CuraApplication.getFileProviderModel().count > 1) - } + visible: (base.fileProviderModel.count > 1) } RecentFilesMenu { } From e5038ab46dc6b5d43a3a9d575f74bbf3b21ee6f0 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 4 Jan 2021 15:12:53 +0100 Subject: [PATCH 041/128] Update year in the copyright comment. CURA-7868 --- resources/qml/Menus/OpenFilesMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/OpenFilesMenu.qml b/resources/qml/Menus/OpenFilesMenu.qml index 226ea70680..60fb507b34 100644 --- a/resources/qml/Menus/OpenFilesMenu.qml +++ b/resources/qml/Menus/OpenFilesMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Ultimaker B.V. +// Copyright (c) 2020 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 From 4b375ce2fe70815ba2e07024c132b2bd11e1c226 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 4 Jan 2021 15:19:17 +0100 Subject: [PATCH 042/128] Remove unused hasMesh signal This is logic that shouldn't be in QML anyway. It's not used by anything at this point. Let's remove it. Contributes to issue CURA-7868. --- resources/qml/Cura.qml | 11 +---------- .../Dialogs/AskOpenAsProjectOrModelsDialog.qml | 8 +------- .../Dialogs/OpenFilesIncludingProjectsDialog.qml | 16 ++++++++-------- resources/qml/Menus/RecentFilesMenu.qml | 10 ++-------- 4 files changed, 12 insertions(+), 33 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 9f24d91caf..bb7b5ac19c 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Ultimaker B.V. +// Copyright (c) 2021 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 @@ -149,15 +149,6 @@ UM.MainWindow id: backgroundItem anchors.fill: parent - signal hasMesh(string name) //this signal sends the filebase name so it can be used for the JobSpecs.qml - function getMeshName(path) - { - //takes the path the complete path of the meshname and returns only the filebase - var fileName = path.slice(path.lastIndexOf("/") + 1) - var fileBase = fileName.slice(0, fileName.indexOf(".")) - return fileBase - } - //DeleteSelection on the keypress backspace event Keys.onPressed: { diff --git a/resources/qml/Dialogs/AskOpenAsProjectOrModelsDialog.qml b/resources/qml/Dialogs/AskOpenAsProjectOrModelsDialog.qml index 8cdaeea5fa..68f58616f1 100644 --- a/resources/qml/Dialogs/AskOpenAsProjectOrModelsDialog.qml +++ b/resources/qml/Dialogs/AskOpenAsProjectOrModelsDialog.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Ultimaker B.V. +// Copyright (c) 2021 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -32,30 +32,24 @@ UM.Dialog // load the entire project function loadProjectFile() { - // update preference if (rememberChoiceCheckBox.checked) { UM.Preferences.setValue("cura/choice_on_open_project", "open_as_project") } UM.WorkspaceFileHandler.readLocalFile(base.fileUrl) - var meshName = backgroundItem.getMeshName(base.fileUrl.toString()) - backgroundItem.hasMesh(decodeURIComponent(meshName)) base.hide() } // load the project file as separated models function loadModelFiles() { - // update preference if (rememberChoiceCheckBox.checked) { UM.Preferences.setValue("cura/choice_on_open_project", "open_as_model") } CuraApplication.readLocalFile(base.fileUrl, "open_as_model") - var meshName = backgroundItem.getMeshName(base.fileUrl.toString()) - backgroundItem.hasMesh(decodeURIComponent(meshName)) base.hide() } diff --git a/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml b/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml index 187578f12c..62cded866c 100644 --- a/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml +++ b/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ultimaker B.V. +// Copyright (c) 2021 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -33,9 +33,6 @@ UM.Dialog function loadProjectFile(projectFile) { UM.WorkspaceFileHandler.readLocalFile(projectFile); - - var meshName = backgroundItem.getMeshName(projectFile.toString()); - backgroundItem.hasMesh(decodeURIComponent(meshName)); } function loadModelFiles(fileUrls) @@ -44,9 +41,6 @@ UM.Dialog { CuraApplication.readLocalFile(fileUrls[i], "open_as_model"); } - - var meshName = backgroundItem.getMeshName(fileUrls[0].toString()); - backgroundItem.hasMesh(decodeURIComponent(meshName)); } Column @@ -108,5 +102,11 @@ UM.Dialog } } } + + UM.I18nCatalog + { + id: catalog + name: "cura" + } } -} +} \ No newline at end of file diff --git a/resources/qml/Menus/RecentFilesMenu.qml b/resources/qml/Menus/RecentFilesMenu.qml index 9de523280c..de6d2e3817 100644 --- a/resources/qml/Menus/RecentFilesMenu.qml +++ b/resources/qml/Menus/RecentFilesMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Ultimaker B.V. +// Copyright (c) 2021 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -27,13 +27,7 @@ Menu var path = decodeURIComponent(modelData.toString()) return (index + 1) + ". " + path.slice(path.lastIndexOf("/") + 1); } - onTriggered: - { - CuraApplication.readLocalFile(modelData); - - var meshName = backgroundItem.getMeshName(modelData.toString()) - backgroundItem.hasMesh(decodeURIComponent(meshName)) - } + onTriggered: CuraApplication.readLocalFile(modelData) } onObjectAdded: menu.insertItem(index, object) onObjectRemoved: menu.removeItem(object) From 00de7497a4c2986cf8fd13be8f598a0f615f3d63 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 4 Jan 2021 15:48:51 +0100 Subject: [PATCH 043/128] Move open dialogue to separate file provider plug-in We can now define plug-ins that specify where to open files from. This is one of the places where you can open files. This breaks the main button to open files in the interface. It needs to be redirected to trigger the plug-in to show the open file dialogue. Contributest o issue CURA-7868. --- .../LocalFileProvider/LocalFileProvider.py | 47 +++++ plugins/LocalFileProvider/OpenLocalFile.qml | 171 ++++++++++++++++++ plugins/LocalFileProvider/__init__.py | 11 ++ plugins/LocalFileProvider/plugin.json | 8 + resources/qml/Cura.qml | 147 --------------- 5 files changed, 237 insertions(+), 147 deletions(-) create mode 100644 plugins/LocalFileProvider/LocalFileProvider.py create mode 100644 plugins/LocalFileProvider/OpenLocalFile.qml create mode 100644 plugins/LocalFileProvider/__init__.py create mode 100644 plugins/LocalFileProvider/plugin.json diff --git a/plugins/LocalFileProvider/LocalFileProvider.py b/plugins/LocalFileProvider/LocalFileProvider.py new file mode 100644 index 0000000000..7917b649c2 --- /dev/null +++ b/plugins/LocalFileProvider/LocalFileProvider.py @@ -0,0 +1,47 @@ +# Copyright (c) 2021 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +import os.path + +from UM.FileProvider import FileProvider # The plug-in type we're going to implement. +from UM.i18n import i18nCatalog +from UM.Logger import Logger +from UM.PluginRegistry import PluginRegistry # To get resources from the plug-in folder. +from cura.CuraApplication import CuraApplication # To create QML elements. + +i18n_catalog = i18nCatalog("cura") + + +class LocalFileProvider(FileProvider): + """ + Allows the user to open files from their local file system. + + These files will then be interpreted through the file handlers. + """ + + def __init__(self): + super().__init__() + self.menu_item_display_text = i18n_catalog.i18nc("@menu Open files from local disk", "Local disk") + self.shortcut = "Ctrl+O" + + self._dialog = None # Lazy-load this QML element. + + def _load_file_dialog(self): + """ + Loads the file dialog QML element into the QML context so that it can be shown. + :return: + """ + plugin_path = PluginRegistry.getInstance().getPluginPath(self.getPluginId()) + if plugin_path is None: + plugin_path = os.path.dirname(__file__) + path = os.path.join(plugin_path, "OpenLocalFile.qml") + self._dialog = CuraApplication.getInstance().createQmlComponent(path) + if self._dialog is None: + Logger.log("e", "Unable to create open file dialogue.") + + def run(self): + if self._dialog is None: + self._load_file_dialog() + if self._dialog is None: + return # Will already have logged an error in _load_file_dialog. + self._dialog.show() \ No newline at end of file diff --git a/plugins/LocalFileProvider/OpenLocalFile.qml b/plugins/LocalFileProvider/OpenLocalFile.qml new file mode 100644 index 0000000000..f78fe4b991 --- /dev/null +++ b/plugins/LocalFileProvider/OpenLocalFile.qml @@ -0,0 +1,171 @@ +// Copyright (c) 2021 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.7 +import QtQuick.Dialogs 1.2 + +import UM 1.3 as UM +import Cura 1.1 as Cura + +Item +{ + id: base + + function show() + { + openDialog.visible = true; + } + + UM.I18nCatalog + { + id: catalog + name: "cura" + } + + FileDialog + { + id: openDialog; + + //: File open dialog title + title: catalog.i18nc("@title:window","Open file(s)") + modality: Qt.WindowModal + selectMultiple: true + nameFilters: UM.MeshFileHandler.supportedReadFileTypes; + folder: + { + //Because several implementations of the file dialog only update the folder when it is explicitly set. + folder = CuraApplication.getDefaultPath("dialog_load_path"); + return CuraApplication.getDefaultPath("dialog_load_path"); + } + onAccepted: + { + // Because several implementations of the file dialog only update the folder + // when it is explicitly set. + var f = folder; + folder = f; + + CuraApplication.setDefaultPath("dialog_load_path", folder); + + handleOpenFileUrls(fileUrls); + } + + // Yeah... I know... it is a mess to put all those things here. + // There are lots of user interactions in this part of the logic, such as showing a warning dialog here and there, + // etc. This means it will come back and forth from time to time between QML and Python. So, separating the logic + // and view here may require more effort but make things more difficult to understand. + function handleOpenFileUrls(fileUrlList) + { + // look for valid project files + var projectFileUrlList = []; + var hasGcode = false; + var nonGcodeFileList = []; + for (var i in fileUrlList) + { + var endsWithG = /\.g$/; + var endsWithGcode = /\.gcode$/; + if (endsWithG.test(fileUrlList[i]) || endsWithGcode.test(fileUrlList[i])) + { + continue; + } + else if (CuraApplication.checkIsValidProjectFile(fileUrlList[i])) + { + projectFileUrlList.push(fileUrlList[i]); + } + nonGcodeFileList.push(fileUrlList[i]); + } + hasGcode = nonGcodeFileList.length < fileUrlList.length; + + // show a warning if selected multiple files together with Gcode + var hasProjectFile = projectFileUrlList.length > 0; + var selectedMultipleFiles = fileUrlList.length > 1; + if (selectedMultipleFiles && hasGcode) + { + infoMultipleFilesWithGcodeDialog.selectedMultipleFiles = selectedMultipleFiles; + infoMultipleFilesWithGcodeDialog.hasProjectFile = hasProjectFile; + infoMultipleFilesWithGcodeDialog.fileUrls = nonGcodeFileList.slice(); + infoMultipleFilesWithGcodeDialog.projectFileUrlList = projectFileUrlList.slice(); + infoMultipleFilesWithGcodeDialog.open(); + } + else + { + handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrlList, projectFileUrlList); + } + } + + function handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrlList, projectFileUrlList) + { + // we only allow opening one project file + if (selectedMultipleFiles && hasProjectFile) + { + openFilesIncludingProjectsDialog.fileUrls = fileUrlList.slice(); + openFilesIncludingProjectsDialog.show(); + return; + } + + if (hasProjectFile) + { + var projectFile = projectFileUrlList[0]; + + // check preference + var choice = UM.Preferences.getValue("cura/choice_on_open_project"); + if (choice == "open_as_project") + { + openFilesIncludingProjectsDialog.loadProjectFile(projectFile); + } + else if (choice == "open_as_model") + { + openFilesIncludingProjectsDialog.loadModelFiles([projectFile].slice()); + } + else // always ask + { + // ask whether to open as project or as models + askOpenAsProjectOrModelsDialog.fileUrl = projectFile; + askOpenAsProjectOrModelsDialog.show(); + } + } + else + { + openFilesIncludingProjectsDialog.loadModelFiles(fileUrlList.slice()); + } + } + } + + MessageDialog + { + id: infoMultipleFilesWithGcodeDialog + title: catalog.i18nc("@title:window", "Open File(s)") + icon: StandardIcon.Information + standardButtons: StandardButton.Ok + text: catalog.i18nc("@text:window", "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one.") + + property var selectedMultipleFiles + property var hasProjectFile + property var fileUrls + property var projectFileUrlList + + onAccepted: + { + openDialog.handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrls, projectFileUrlList); + } + } + + Cura.AskOpenAsProjectOrModelsDialog + { + id: askOpenAsProjectOrModelsDialog + } + + Connections + { + target: CuraApplication + onOpenProjectFile: + { + askOpenAsProjectOrModelsDialog.fileUrl = project_file; + askOpenAsProjectOrModelsDialog.show(); + } + } + + Cura.OpenFilesIncludingProjectsDialog + { + id: openFilesIncludingProjectsDialog + } +} \ No newline at end of file diff --git a/plugins/LocalFileProvider/__init__.py b/plugins/LocalFileProvider/__init__.py new file mode 100644 index 0000000000..63845d7820 --- /dev/null +++ b/plugins/LocalFileProvider/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) 2021 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import LocalFileProvider + + +def getMetaData(): + return {} + +def register(app): + return { "file_provider": LocalFileProvider.LocalFileProvider() } diff --git a/plugins/LocalFileProvider/plugin.json b/plugins/LocalFileProvider/plugin.json new file mode 100644 index 0000000000..cd4d77eb98 --- /dev/null +++ b/plugins/LocalFileProvider/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Local File Provider", + "description": "Enables opening files from the local file system.", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "api": "7.4.0", + "i18n-catalog": "cura" +} \ No newline at end of file diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index bb7b5ac19c..ea615b3c17 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -619,114 +619,6 @@ UM.MainWindow onTriggered: base.exitFullscreen() } - FileDialog - { - id: openDialog; - - //: File open dialog title - title: catalog.i18nc("@title:window","Open file(s)") - modality: Qt.WindowModal - selectMultiple: true - nameFilters: UM.MeshFileHandler.supportedReadFileTypes; - folder: - { - //Because several implementations of the file dialog only update the folder when it is explicitly set. - folder = CuraApplication.getDefaultPath("dialog_load_path"); - return CuraApplication.getDefaultPath("dialog_load_path"); - } - onAccepted: - { - // Because several implementations of the file dialog only update the folder - // when it is explicitly set. - var f = folder; - folder = f; - - CuraApplication.setDefaultPath("dialog_load_path", folder); - - handleOpenFileUrls(fileUrls); - } - - // Yeah... I know... it is a mess to put all those things here. - // There are lots of user interactions in this part of the logic, such as showing a warning dialog here and there, - // etc. This means it will come back and forth from time to time between QML and Python. So, separating the logic - // and view here may require more effort but make things more difficult to understand. - function handleOpenFileUrls(fileUrlList) - { - // look for valid project files - var projectFileUrlList = []; - var hasGcode = false; - var nonGcodeFileList = []; - for (var i in fileUrlList) - { - var endsWithG = /\.g$/; - var endsWithGcode = /\.gcode$/; - if (endsWithG.test(fileUrlList[i]) || endsWithGcode.test(fileUrlList[i])) - { - continue; - } - else if (CuraApplication.checkIsValidProjectFile(fileUrlList[i])) - { - projectFileUrlList.push(fileUrlList[i]); - } - nonGcodeFileList.push(fileUrlList[i]); - } - hasGcode = nonGcodeFileList.length < fileUrlList.length; - - // show a warning if selected multiple files together with Gcode - var hasProjectFile = projectFileUrlList.length > 0; - var selectedMultipleFiles = fileUrlList.length > 1; - if (selectedMultipleFiles && hasGcode) - { - infoMultipleFilesWithGcodeDialog.selectedMultipleFiles = selectedMultipleFiles; - infoMultipleFilesWithGcodeDialog.hasProjectFile = hasProjectFile; - infoMultipleFilesWithGcodeDialog.fileUrls = nonGcodeFileList.slice(); - infoMultipleFilesWithGcodeDialog.projectFileUrlList = projectFileUrlList.slice(); - infoMultipleFilesWithGcodeDialog.open(); - } - else - { - handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrlList, projectFileUrlList); - } - } - - function handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrlList, projectFileUrlList) - { - // we only allow opening one project file - if (selectedMultipleFiles && hasProjectFile) - { - openFilesIncludingProjectsDialog.fileUrls = fileUrlList.slice(); - openFilesIncludingProjectsDialog.show(); - return; - } - - if (hasProjectFile) - { - var projectFile = projectFileUrlList[0]; - - // check preference - var choice = UM.Preferences.getValue("cura/choice_on_open_project"); - if (choice == "open_as_project") - { - openFilesIncludingProjectsDialog.loadProjectFile(projectFile); - } - else if (choice == "open_as_model") - { - openFilesIncludingProjectsDialog.loadModelFiles([projectFile].slice()); - } - else // always ask - { - // ask whether to open as project or as models - askOpenAsProjectOrModelsDialog.fileUrl = projectFile; - askOpenAsProjectOrModelsDialog.show(); - } - } - else - { - openFilesIncludingProjectsDialog.loadModelFiles(fileUrlList.slice()); - } - } - } - MessageDialog { id: packageInstallDialog @@ -735,51 +627,12 @@ UM.MainWindow modality: Qt.ApplicationModal } - MessageDialog - { - id: infoMultipleFilesWithGcodeDialog - title: catalog.i18nc("@title:window", "Open File(s)") - icon: StandardIcon.Information - standardButtons: StandardButton.Ok - text: catalog.i18nc("@text:window", "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one.") - - property var selectedMultipleFiles - property var hasProjectFile - property var fileUrls - property var projectFileUrlList - - onAccepted: - { - openDialog.handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrls, projectFileUrlList); - } - } - Connections { target: Cura.Actions.open onTriggered: openDialog.open() } - OpenFilesIncludingProjectsDialog - { - id: openFilesIncludingProjectsDialog - } - - AskOpenAsProjectOrModelsDialog - { - id: askOpenAsProjectOrModelsDialog - } - - Connections - { - target: CuraApplication - onOpenProjectFile: - { - askOpenAsProjectOrModelsDialog.fileUrl = project_file; - askOpenAsProjectOrModelsDialog.show(); - } - } - Connections { target: Cura.Actions.showProfileFolder From de80461954fc91d32c95e1a56ef88f5c7f69796f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 4 Jan 2021 15:54:18 +0100 Subject: [PATCH 044/128] Remove open action, fixing ambiguous overload of Ctrl+O The action was no longer in the menu, but the hotkey still functioned. Then there were two actions for Ctrl+O, which was ambiguous to Qt. Contributes to issue CURA-7868. --- resources/qml/Actions.qml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index c62b0cb89a..5ad5337e78 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2018 Ultimaker B.V. +// Copyright (c) 2021 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. pragma Singleton @@ -12,7 +12,6 @@ import Cura 1.0 as Cura Item { property alias newProject: newProjectAction; - property alias open: openAction; property alias quit: quitAction; property alias undo: undoAction; @@ -413,14 +412,6 @@ Item onTriggered: CuraApplication.resetAll(); } - Action - { - id: openAction; - text: catalog.i18nc("@action:inmenu menubar:file","&Open File(s)..."); - iconName: "document-open"; - shortcut: StandardKey.Open; - } - Action { id: newProjectAction From b266904d76542216b5bdbdf6c2b628b784bd7d8f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 4 Jan 2021 17:45:16 +0100 Subject: [PATCH 045/128] Replace other references to the open action with the file provider model This adds a function 'triggerFirst' to the file provider that triggers the first file provider in the model. That should then be the local file provider, but if the plug-in is disabled for some reason it would use another plug-in. Contributes to issue CURA-7868. --- plugins/PrepareStage/PrepareMenu.qml | 4 ++-- resources/qml/Cura.qml | 6 ------ resources/qml/Menus/OpenFilesMenu.qml | 19 +++---------------- 3 files changed, 5 insertions(+), 24 deletions(-) diff --git a/plugins/PrepareStage/PrepareMenu.qml b/plugins/PrepareStage/PrepareMenu.qml index 87d7c5f35c..d1bb47cb35 100644 --- a/plugins/PrepareStage/PrepareMenu.qml +++ b/plugins/PrepareStage/PrepareMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2018 Ultimaker B.V. +// Copyright (c) 2021 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 @@ -96,7 +96,7 @@ Item id: openFileButton height: UM.Theme.getSize("stage_menu").height width: UM.Theme.getSize("stage_menu").height - onClicked: Cura.Actions.open.trigger() + onClicked: CuraApplication.getFileProviderModel().triggerFirst() hoverEnabled: true contentItem: Item diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index ea615b3c17..1a42f693a9 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -627,12 +627,6 @@ UM.MainWindow modality: Qt.ApplicationModal } - Connections - { - target: Cura.Actions.open - onTriggered: openDialog.open() - } - Connections { target: Cura.Actions.showProfileFolder diff --git a/resources/qml/Menus/OpenFilesMenu.qml b/resources/qml/Menus/OpenFilesMenu.qml index 60fb507b34..20d6fe453c 100644 --- a/resources/qml/Menus/OpenFilesMenu.qml +++ b/resources/qml/Menus/OpenFilesMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Ultimaker B.V. +// Copyright (c) 2021 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -21,21 +21,8 @@ Menu model: CuraApplication.getFileProviderModel() MenuItem { - text: - { - return model.displayText; - } - onTriggered: - { - if (model.index == 0) // The 0th element is the "From Disk" option, which should activate the open local file dialog - { - Cura.Actions.open.trigger() - } - else - { - CuraApplication.getFileProviderModel().trigger(model.name); - } - } + text: model.displayText + onTriggered: CuraApplication.getFileProviderModel().trigger(model.name) shortcut: model.shortcut } onObjectAdded: openFilesMenu.insertItem(index, object) From 5f6b3b52c1848416c98f7d276fe02f08d067f675 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 4 Jan 2021 18:10:50 +0100 Subject: [PATCH 046/128] Don't trigger open menu upon starting Cura That would be very annoying. Contributes to issue CURA-7868. --- resources/qml/Menus/FileMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/FileMenu.qml b/resources/qml/Menus/FileMenu.qml index 94fc2358e1..918b96c727 100644 --- a/resources/qml/Menus/FileMenu.qml +++ b/resources/qml/Menus/FileMenu.qml @@ -22,7 +22,7 @@ Menu MenuItem { id: openMenu - action: Cura.Actions.open + onTriggered: CuraApplication.getFileProviderModel().triggerFirst() visible: (base.fileProviderModel.count == 1) } From dc02038513090941be5d665a8013e6ded8f2103a Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 5 Jan 2021 14:47:46 +0100 Subject: [PATCH 047/128] Add a Cura-themed, re-usable TableView component CURA-7868 --- resources/qml/TableView.qml | 72 +++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 resources/qml/TableView.qml diff --git a/resources/qml/TableView.qml b/resources/qml/TableView.qml new file mode 100644 index 0000000000..4d9ca75f92 --- /dev/null +++ b/resources/qml/TableView.qml @@ -0,0 +1,72 @@ +// Copyright (C) 2021 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.10 +import QtQuick.Window 2.2 +import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one +import QtQuick.Controls 2.3 +import QtQuick.Controls.Styles 1.4 + +import UM 1.2 as UM +import Cura 1.6 as Cura + + +OldControls.TableView +{ + id: tableView + + itemDelegate: Item + { + height: tableCellLabel.implicitHeight + UM.Theme.getSize("thin_margin").height + + Label + { + id: tableCellLabel + color: UM.Theme.getColor("text") + elide: Text.ElideRight + text: styleData.value + anchors.fill: parent + anchors.leftMargin: 10 * screenScaleFactor + verticalAlignment: Text.AlignVCenter + } + } + + rowDelegate: Rectangle + { + color: styleData.selected ? UM.Theme.getColor("toolbar_button_hover") : UM.Theme.getColor("main_background") + } + + // Use the old styling technique since it's the only way to make the scrollbars themed in the TableView + style: TableViewStyle + { + backgroundColor: UM.Theme.getColor("main_background") + + handle: Rectangle + { + // both implicit width and height have to be set, since the handle is used by both the horizontal and the vertical scrollbars + implicitWidth: UM.Theme.getSize("scrollbar").width + implicitHeight: UM.Theme.getSize("scrollbar").width // + radius: width / 2 + color: UM.Theme.getColor(styleData.pressed ? "scrollbar_handle_down" : styleData.hovered ? "scrollbar_handle_hover" : "scrollbar_handle") + } + + scrollBarBackground: Rectangle + { + // both implicit width and height have to be set, since the handle is used by both the horizontal and the vertical scrollbars + implicitWidth: UM.Theme.getSize("scrollbar").width + implicitHeight: UM.Theme.getSize("scrollbar").width + color: UM.Theme.getColor("main_background") + } + + corner: Rectangle // The little rectangle between the vertical and horizontal scrollbars + { + color: UM.Theme.getColor("main_background") + } + + // Override the control arrows + incrementControl: Item { } + decrementControl: Item { } + } +} + + From adcdf7bad9b202c6bad8130615cd7b07bc8db21f Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 5 Jan 2021 14:54:28 +0100 Subject: [PATCH 048/128] Remove unnecessary QML imports CURA-7868 --- resources/qml/TableView.qml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/resources/qml/TableView.qml b/resources/qml/TableView.qml index 4d9ca75f92..b2ebee51c9 100644 --- a/resources/qml/TableView.qml +++ b/resources/qml/TableView.qml @@ -2,19 +2,15 @@ // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.10 -import QtQuick.Window 2.2 import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one import QtQuick.Controls 2.3 import QtQuick.Controls.Styles 1.4 import UM 1.2 as UM -import Cura 1.6 as Cura OldControls.TableView { - id: tableView - itemDelegate: Item { height: tableCellLabel.implicitHeight + UM.Theme.getSize("thin_margin").height @@ -43,22 +39,23 @@ OldControls.TableView handle: Rectangle { - // both implicit width and height have to be set, since the handle is used by both the horizontal and the vertical scrollbars + // Both implicit width and height have to be set, since the handle is used by both the horizontal and the vertical scrollbars implicitWidth: UM.Theme.getSize("scrollbar").width - implicitHeight: UM.Theme.getSize("scrollbar").width // + implicitHeight: UM.Theme.getSize("scrollbar").width radius: width / 2 - color: UM.Theme.getColor(styleData.pressed ? "scrollbar_handle_down" : styleData.hovered ? "scrollbar_handle_hover" : "scrollbar_handle") + color: UM.Theme.getColor(styleData.pressed ? "scrollbar_handle_down" : (styleData.hovered ? "scrollbar_handle_hover" : "scrollbar_handle")) } scrollBarBackground: Rectangle { - // both implicit width and height have to be set, since the handle is used by both the horizontal and the vertical scrollbars + // Both implicit width and height have to be set, since the handle is used by both the horizontal and the vertical scrollbars implicitWidth: UM.Theme.getSize("scrollbar").width implicitHeight: UM.Theme.getSize("scrollbar").width color: UM.Theme.getColor("main_background") } - corner: Rectangle // The little rectangle between the vertical and horizontal scrollbars + // The little rectangle between the vertical and horizontal scrollbars + corner: Rectangle { color: UM.Theme.getColor("main_background") } @@ -67,6 +64,4 @@ OldControls.TableView incrementControl: Item { } decrementControl: Item { } } -} - - +} \ No newline at end of file From 606ec587fe627945108d93dd23b1e39417d51904 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 6 Jan 2021 11:51:29 +0100 Subject: [PATCH 049/128] Change the row height in the table view CURA-7868 --- resources/qml/TableView.qml | 5 +++-- resources/themes/cura-light/theme.json | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/resources/qml/TableView.qml b/resources/qml/TableView.qml index b2ebee51c9..dd80304b83 100644 --- a/resources/qml/TableView.qml +++ b/resources/qml/TableView.qml @@ -13,7 +13,7 @@ OldControls.TableView { itemDelegate: Item { - height: tableCellLabel.implicitHeight + UM.Theme.getSize("thin_margin").height + height: tableCellLabel.implicitHeight Label { @@ -29,7 +29,8 @@ OldControls.TableView rowDelegate: Rectangle { - color: styleData.selected ? UM.Theme.getColor("toolbar_button_hover") : UM.Theme.getColor("main_background") + color: styleData.selected ? UM.Theme.getColor("secondary") : UM.Theme.getColor("main_background") + height: UM.Theme.getSize("table_row").height } // Use the old styling technique since it's the only way to make the scrollbars themed in the TableView diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 7bb8156458..e897969a5e 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -630,6 +630,8 @@ "monitor_external_link_icon": [1.16, 1.16], "monitor_column": [18.0, 1.0], "monitor_progress_bar": [16.5, 1.0], - "monitor_margin": [1.5, 1.5] + "monitor_margin": [1.5, 1.5], + + "table_row": [2.0, 2.0] } } From 0788df4797cfc85c26399de773a57f3a0f1231f5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 6 Jan 2021 14:11:15 +0100 Subject: [PATCH 050/128] Add log entry upon exporting container Quite a salient moment in the log. According to our log levels definitions this must be info since it's the direct result of a user interaction. --- cura/Settings/ContainerManager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 08fdf707cf..48d4cb3cbc 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -221,6 +221,7 @@ class ContainerManager(QObject): except OSError: return {"status": "error", "message": "Unable to write to this location.", "path": file_url} + Logger.info("Successfully exported container to {path}".format(path = file_url)) return {"status": "success", "message": "Successfully exported container", "path": file_url} @pyqtSlot(QUrl, result = "QVariantMap") From 96c4d66029011df9f70ac54ba023d3be53ea67d2 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Thu, 7 Jan 2021 16:35:40 +0100 Subject: [PATCH 051/128] Revert making the open file dialog a separate LocalFileProvider plugin This reverts commits 00de7497a4c2986cf8fd13be8f598a0f615f3d63 to 5f6b3b52c1848416c98f7d276fe02f08d067f675 CURA-7868 --- .../LocalFileProvider/LocalFileProvider.py | 47 ----- plugins/LocalFileProvider/OpenLocalFile.qml | 171 ------------------ plugins/LocalFileProvider/__init__.py | 11 -- plugins/LocalFileProvider/plugin.json | 8 - plugins/PrepareStage/PrepareMenu.qml | 4 +- resources/qml/Actions.qml | 11 +- resources/qml/Cura.qml | 153 ++++++++++++++++ resources/qml/Menus/FileMenu.qml | 2 +- resources/qml/Menus/OpenFilesMenu.qml | 19 +- 9 files changed, 182 insertions(+), 244 deletions(-) delete mode 100644 plugins/LocalFileProvider/LocalFileProvider.py delete mode 100644 plugins/LocalFileProvider/OpenLocalFile.qml delete mode 100644 plugins/LocalFileProvider/__init__.py delete mode 100644 plugins/LocalFileProvider/plugin.json diff --git a/plugins/LocalFileProvider/LocalFileProvider.py b/plugins/LocalFileProvider/LocalFileProvider.py deleted file mode 100644 index 7917b649c2..0000000000 --- a/plugins/LocalFileProvider/LocalFileProvider.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) 2021 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -import os.path - -from UM.FileProvider import FileProvider # The plug-in type we're going to implement. -from UM.i18n import i18nCatalog -from UM.Logger import Logger -from UM.PluginRegistry import PluginRegistry # To get resources from the plug-in folder. -from cura.CuraApplication import CuraApplication # To create QML elements. - -i18n_catalog = i18nCatalog("cura") - - -class LocalFileProvider(FileProvider): - """ - Allows the user to open files from their local file system. - - These files will then be interpreted through the file handlers. - """ - - def __init__(self): - super().__init__() - self.menu_item_display_text = i18n_catalog.i18nc("@menu Open files from local disk", "Local disk") - self.shortcut = "Ctrl+O" - - self._dialog = None # Lazy-load this QML element. - - def _load_file_dialog(self): - """ - Loads the file dialog QML element into the QML context so that it can be shown. - :return: - """ - plugin_path = PluginRegistry.getInstance().getPluginPath(self.getPluginId()) - if plugin_path is None: - plugin_path = os.path.dirname(__file__) - path = os.path.join(plugin_path, "OpenLocalFile.qml") - self._dialog = CuraApplication.getInstance().createQmlComponent(path) - if self._dialog is None: - Logger.log("e", "Unable to create open file dialogue.") - - def run(self): - if self._dialog is None: - self._load_file_dialog() - if self._dialog is None: - return # Will already have logged an error in _load_file_dialog. - self._dialog.show() \ No newline at end of file diff --git a/plugins/LocalFileProvider/OpenLocalFile.qml b/plugins/LocalFileProvider/OpenLocalFile.qml deleted file mode 100644 index f78fe4b991..0000000000 --- a/plugins/LocalFileProvider/OpenLocalFile.qml +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright (c) 2021 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.7 -import QtQuick.Dialogs 1.2 - -import UM 1.3 as UM -import Cura 1.1 as Cura - -Item -{ - id: base - - function show() - { - openDialog.visible = true; - } - - UM.I18nCatalog - { - id: catalog - name: "cura" - } - - FileDialog - { - id: openDialog; - - //: File open dialog title - title: catalog.i18nc("@title:window","Open file(s)") - modality: Qt.WindowModal - selectMultiple: true - nameFilters: UM.MeshFileHandler.supportedReadFileTypes; - folder: - { - //Because several implementations of the file dialog only update the folder when it is explicitly set. - folder = CuraApplication.getDefaultPath("dialog_load_path"); - return CuraApplication.getDefaultPath("dialog_load_path"); - } - onAccepted: - { - // Because several implementations of the file dialog only update the folder - // when it is explicitly set. - var f = folder; - folder = f; - - CuraApplication.setDefaultPath("dialog_load_path", folder); - - handleOpenFileUrls(fileUrls); - } - - // Yeah... I know... it is a mess to put all those things here. - // There are lots of user interactions in this part of the logic, such as showing a warning dialog here and there, - // etc. This means it will come back and forth from time to time between QML and Python. So, separating the logic - // and view here may require more effort but make things more difficult to understand. - function handleOpenFileUrls(fileUrlList) - { - // look for valid project files - var projectFileUrlList = []; - var hasGcode = false; - var nonGcodeFileList = []; - for (var i in fileUrlList) - { - var endsWithG = /\.g$/; - var endsWithGcode = /\.gcode$/; - if (endsWithG.test(fileUrlList[i]) || endsWithGcode.test(fileUrlList[i])) - { - continue; - } - else if (CuraApplication.checkIsValidProjectFile(fileUrlList[i])) - { - projectFileUrlList.push(fileUrlList[i]); - } - nonGcodeFileList.push(fileUrlList[i]); - } - hasGcode = nonGcodeFileList.length < fileUrlList.length; - - // show a warning if selected multiple files together with Gcode - var hasProjectFile = projectFileUrlList.length > 0; - var selectedMultipleFiles = fileUrlList.length > 1; - if (selectedMultipleFiles && hasGcode) - { - infoMultipleFilesWithGcodeDialog.selectedMultipleFiles = selectedMultipleFiles; - infoMultipleFilesWithGcodeDialog.hasProjectFile = hasProjectFile; - infoMultipleFilesWithGcodeDialog.fileUrls = nonGcodeFileList.slice(); - infoMultipleFilesWithGcodeDialog.projectFileUrlList = projectFileUrlList.slice(); - infoMultipleFilesWithGcodeDialog.open(); - } - else - { - handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrlList, projectFileUrlList); - } - } - - function handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrlList, projectFileUrlList) - { - // we only allow opening one project file - if (selectedMultipleFiles && hasProjectFile) - { - openFilesIncludingProjectsDialog.fileUrls = fileUrlList.slice(); - openFilesIncludingProjectsDialog.show(); - return; - } - - if (hasProjectFile) - { - var projectFile = projectFileUrlList[0]; - - // check preference - var choice = UM.Preferences.getValue("cura/choice_on_open_project"); - if (choice == "open_as_project") - { - openFilesIncludingProjectsDialog.loadProjectFile(projectFile); - } - else if (choice == "open_as_model") - { - openFilesIncludingProjectsDialog.loadModelFiles([projectFile].slice()); - } - else // always ask - { - // ask whether to open as project or as models - askOpenAsProjectOrModelsDialog.fileUrl = projectFile; - askOpenAsProjectOrModelsDialog.show(); - } - } - else - { - openFilesIncludingProjectsDialog.loadModelFiles(fileUrlList.slice()); - } - } - } - - MessageDialog - { - id: infoMultipleFilesWithGcodeDialog - title: catalog.i18nc("@title:window", "Open File(s)") - icon: StandardIcon.Information - standardButtons: StandardButton.Ok - text: catalog.i18nc("@text:window", "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one.") - - property var selectedMultipleFiles - property var hasProjectFile - property var fileUrls - property var projectFileUrlList - - onAccepted: - { - openDialog.handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrls, projectFileUrlList); - } - } - - Cura.AskOpenAsProjectOrModelsDialog - { - id: askOpenAsProjectOrModelsDialog - } - - Connections - { - target: CuraApplication - onOpenProjectFile: - { - askOpenAsProjectOrModelsDialog.fileUrl = project_file; - askOpenAsProjectOrModelsDialog.show(); - } - } - - Cura.OpenFilesIncludingProjectsDialog - { - id: openFilesIncludingProjectsDialog - } -} \ No newline at end of file diff --git a/plugins/LocalFileProvider/__init__.py b/plugins/LocalFileProvider/__init__.py deleted file mode 100644 index 63845d7820..0000000000 --- a/plugins/LocalFileProvider/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2021 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from . import LocalFileProvider - - -def getMetaData(): - return {} - -def register(app): - return { "file_provider": LocalFileProvider.LocalFileProvider() } diff --git a/plugins/LocalFileProvider/plugin.json b/plugins/LocalFileProvider/plugin.json deleted file mode 100644 index cd4d77eb98..0000000000 --- a/plugins/LocalFileProvider/plugin.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "Local File Provider", - "description": "Enables opening files from the local file system.", - "author": "Ultimaker B.V.", - "version": "1.0.0", - "api": "7.4.0", - "i18n-catalog": "cura" -} \ No newline at end of file diff --git a/plugins/PrepareStage/PrepareMenu.qml b/plugins/PrepareStage/PrepareMenu.qml index d1bb47cb35..87d7c5f35c 100644 --- a/plugins/PrepareStage/PrepareMenu.qml +++ b/plugins/PrepareStage/PrepareMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2021 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 @@ -96,7 +96,7 @@ Item id: openFileButton height: UM.Theme.getSize("stage_menu").height width: UM.Theme.getSize("stage_menu").height - onClicked: CuraApplication.getFileProviderModel().triggerFirst() + onClicked: Cura.Actions.open.trigger() hoverEnabled: true contentItem: Item diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 5ad5337e78..c62b0cb89a 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2021 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. pragma Singleton @@ -12,6 +12,7 @@ import Cura 1.0 as Cura Item { property alias newProject: newProjectAction; + property alias open: openAction; property alias quit: quitAction; property alias undo: undoAction; @@ -412,6 +413,14 @@ Item onTriggered: CuraApplication.resetAll(); } + Action + { + id: openAction; + text: catalog.i18nc("@action:inmenu menubar:file","&Open File(s)..."); + iconName: "document-open"; + shortcut: StandardKey.Open; + } + Action { id: newProjectAction diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 1a42f693a9..bb7b5ac19c 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -619,6 +619,114 @@ UM.MainWindow onTriggered: base.exitFullscreen() } + FileDialog + { + id: openDialog; + + //: File open dialog title + title: catalog.i18nc("@title:window","Open file(s)") + modality: Qt.WindowModal + selectMultiple: true + nameFilters: UM.MeshFileHandler.supportedReadFileTypes; + folder: + { + //Because several implementations of the file dialog only update the folder when it is explicitly set. + folder = CuraApplication.getDefaultPath("dialog_load_path"); + return CuraApplication.getDefaultPath("dialog_load_path"); + } + onAccepted: + { + // Because several implementations of the file dialog only update the folder + // when it is explicitly set. + var f = folder; + folder = f; + + CuraApplication.setDefaultPath("dialog_load_path", folder); + + handleOpenFileUrls(fileUrls); + } + + // Yeah... I know... it is a mess to put all those things here. + // There are lots of user interactions in this part of the logic, such as showing a warning dialog here and there, + // etc. This means it will come back and forth from time to time between QML and Python. So, separating the logic + // and view here may require more effort but make things more difficult to understand. + function handleOpenFileUrls(fileUrlList) + { + // look for valid project files + var projectFileUrlList = []; + var hasGcode = false; + var nonGcodeFileList = []; + for (var i in fileUrlList) + { + var endsWithG = /\.g$/; + var endsWithGcode = /\.gcode$/; + if (endsWithG.test(fileUrlList[i]) || endsWithGcode.test(fileUrlList[i])) + { + continue; + } + else if (CuraApplication.checkIsValidProjectFile(fileUrlList[i])) + { + projectFileUrlList.push(fileUrlList[i]); + } + nonGcodeFileList.push(fileUrlList[i]); + } + hasGcode = nonGcodeFileList.length < fileUrlList.length; + + // show a warning if selected multiple files together with Gcode + var hasProjectFile = projectFileUrlList.length > 0; + var selectedMultipleFiles = fileUrlList.length > 1; + if (selectedMultipleFiles && hasGcode) + { + infoMultipleFilesWithGcodeDialog.selectedMultipleFiles = selectedMultipleFiles; + infoMultipleFilesWithGcodeDialog.hasProjectFile = hasProjectFile; + infoMultipleFilesWithGcodeDialog.fileUrls = nonGcodeFileList.slice(); + infoMultipleFilesWithGcodeDialog.projectFileUrlList = projectFileUrlList.slice(); + infoMultipleFilesWithGcodeDialog.open(); + } + else + { + handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrlList, projectFileUrlList); + } + } + + function handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrlList, projectFileUrlList) + { + // we only allow opening one project file + if (selectedMultipleFiles && hasProjectFile) + { + openFilesIncludingProjectsDialog.fileUrls = fileUrlList.slice(); + openFilesIncludingProjectsDialog.show(); + return; + } + + if (hasProjectFile) + { + var projectFile = projectFileUrlList[0]; + + // check preference + var choice = UM.Preferences.getValue("cura/choice_on_open_project"); + if (choice == "open_as_project") + { + openFilesIncludingProjectsDialog.loadProjectFile(projectFile); + } + else if (choice == "open_as_model") + { + openFilesIncludingProjectsDialog.loadModelFiles([projectFile].slice()); + } + else // always ask + { + // ask whether to open as project or as models + askOpenAsProjectOrModelsDialog.fileUrl = projectFile; + askOpenAsProjectOrModelsDialog.show(); + } + } + else + { + openFilesIncludingProjectsDialog.loadModelFiles(fileUrlList.slice()); + } + } + } + MessageDialog { id: packageInstallDialog @@ -627,6 +735,51 @@ UM.MainWindow modality: Qt.ApplicationModal } + MessageDialog + { + id: infoMultipleFilesWithGcodeDialog + title: catalog.i18nc("@title:window", "Open File(s)") + icon: StandardIcon.Information + standardButtons: StandardButton.Ok + text: catalog.i18nc("@text:window", "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one.") + + property var selectedMultipleFiles + property var hasProjectFile + property var fileUrls + property var projectFileUrlList + + onAccepted: + { + openDialog.handleOpenFiles(selectedMultipleFiles, hasProjectFile, fileUrls, projectFileUrlList); + } + } + + Connections + { + target: Cura.Actions.open + onTriggered: openDialog.open() + } + + OpenFilesIncludingProjectsDialog + { + id: openFilesIncludingProjectsDialog + } + + AskOpenAsProjectOrModelsDialog + { + id: askOpenAsProjectOrModelsDialog + } + + Connections + { + target: CuraApplication + onOpenProjectFile: + { + askOpenAsProjectOrModelsDialog.fileUrl = project_file; + askOpenAsProjectOrModelsDialog.show(); + } + } + Connections { target: Cura.Actions.showProfileFolder diff --git a/resources/qml/Menus/FileMenu.qml b/resources/qml/Menus/FileMenu.qml index 918b96c727..94fc2358e1 100644 --- a/resources/qml/Menus/FileMenu.qml +++ b/resources/qml/Menus/FileMenu.qml @@ -22,7 +22,7 @@ Menu MenuItem { id: openMenu - onTriggered: CuraApplication.getFileProviderModel().triggerFirst() + action: Cura.Actions.open visible: (base.fileProviderModel.count == 1) } diff --git a/resources/qml/Menus/OpenFilesMenu.qml b/resources/qml/Menus/OpenFilesMenu.qml index 20d6fe453c..60fb507b34 100644 --- a/resources/qml/Menus/OpenFilesMenu.qml +++ b/resources/qml/Menus/OpenFilesMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2021 Ultimaker B.V. +// Copyright (c) 2020 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -21,8 +21,21 @@ Menu model: CuraApplication.getFileProviderModel() MenuItem { - text: model.displayText - onTriggered: CuraApplication.getFileProviderModel().trigger(model.name) + text: + { + return model.displayText; + } + onTriggered: + { + if (model.index == 0) // The 0th element is the "From Disk" option, which should activate the open local file dialog + { + Cura.Actions.open.trigger() + } + else + { + CuraApplication.getFileProviderModel().trigger(model.name); + } + } shortcut: model.shortcut } onObjectAdded: openFilesMenu.insertItem(index, object) From aa0a08500e959f29ae02dc31e901646e139407a0 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 8 Jan 2021 13:44:23 +0100 Subject: [PATCH 052/128] Temproray files shouldn't be in recent file list. CURA-7864 --- cura/CuraApplication.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ee347e7a4d..e1afb8a88f 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1735,7 +1735,7 @@ class CuraApplication(QtApplication): @pyqtSlot(QUrl, str) @pyqtSlot(QUrl) - def readLocalFile(self, file: QUrl, project_mode: Optional[str] = None): + def readLocalFile(self, file: QUrl, project_mode: Optional[str] = None, add_to_recent_files: str = True): """Open a local file :param project_mode: How to handle project files. Either None(default): Follow user preference, "open_as_model" @@ -1760,7 +1760,7 @@ class CuraApplication(QtApplication): if is_project_file and project_mode == "open_as_project": # open as project immediately without presenting a dialog workspace_handler = self.getWorkspaceFileHandler() - workspace_handler.readLocalFile(file) + workspace_handler.readLocalFile(file, add_to_recent_files = add_to_recent_files) return if is_project_file and project_mode == "always_ask": @@ -1801,7 +1801,7 @@ class CuraApplication(QtApplication): if extension in self._non_sliceable_extensions: self.deleteAll(only_selectable = False) - job = ReadMeshJob(f) + job = ReadMeshJob(f, add_to_recent_files = add_to_recent_files) job.finished.connect(self._readMeshFinished) job.start() From 13d45e3a55d72742ac220177248637820b288578 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 8 Jan 2021 13:51:03 +0100 Subject: [PATCH 053/128] Typing typo. CURA-7864 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e1afb8a88f..98e2e923d0 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1735,7 +1735,7 @@ class CuraApplication(QtApplication): @pyqtSlot(QUrl, str) @pyqtSlot(QUrl) - def readLocalFile(self, file: QUrl, project_mode: Optional[str] = None, add_to_recent_files: str = True): + def readLocalFile(self, file: QUrl, project_mode: Optional[str] = None, add_to_recent_files: bool = True): """Open a local file :param project_mode: How to handle project files. Either None(default): Follow user preference, "open_as_model" From 352fef3efa700b53f308a095c5faa85520d9a4c1 Mon Sep 17 00:00:00 2001 From: Philip Lorenz Date: Sun, 10 Jan 2021 20:21:40 +0100 Subject: [PATCH 054/128] Adapt to Python 3.9 API changes Python 3.9 now made the TreeBuilder.start() `attrs` parameter ([1]) mandatory on all implementations. Adapt the plugin accordingly. [1] https://bugs.python.org/issue39495 --- .../XmlMaterialProfile/XmlMaterialProfile.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 70e702d0bf..ce0bb06d8d 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -151,7 +151,7 @@ class XmlMaterialProfile(InstanceContainer): "version": self.CurrentFdmMaterialVersion}) ## Begin Metadata Block - builder.start("metadata") # type: ignore + builder.start("metadata", {}) # type: ignore metadata = copy.deepcopy(self.getMetaData()) # setting_version is derived from the "version" tag in the schema, so don't serialize it into a file @@ -165,21 +165,21 @@ class XmlMaterialProfile(InstanceContainer): properties = metadata.pop("properties", {}) ## Begin Name Block - builder.start("name") # type: ignore + builder.start("name", {}) # type: ignore - builder.start("brand") # type: ignore + builder.start("brand", {}) # type: ignore builder.data(metadata.pop("brand", "")) builder.end("brand") - builder.start("material") # type: ignore + builder.start("material", {}) # type: ignore builder.data(metadata.pop("material", "")) builder.end("material") - builder.start("color") # type: ignore + builder.start("color", {}) # type: ignore builder.data(metadata.pop("color_name", "")) builder.end("color") - builder.start("label") # type: ignore + builder.start("label", {}) # type: ignore builder.data(self.getName()) builder.end("label") @@ -190,7 +190,7 @@ class XmlMaterialProfile(InstanceContainer): key_to_use = key if key in self._metadata_tags_that_have_cura_namespace: key_to_use = "cura:" + key_to_use - builder.start(key_to_use) # type: ignore + builder.start(key_to_use, {}) # type: ignore if value is not None: #Nones get handled well by the builder. #Otherwise the builder always expects a string. #Deserialize expects the stringified version. @@ -202,10 +202,10 @@ class XmlMaterialProfile(InstanceContainer): ## End Metadata Block ## Begin Properties Block - builder.start("properties") # type: ignore + builder.start("properties", {}) # type: ignore for key, value in properties.items(): - builder.start(key) # type: ignore + builder.start(key, {}) # type: ignore builder.data(value) builder.end(key) @@ -213,7 +213,7 @@ class XmlMaterialProfile(InstanceContainer): ## End Properties Block ## Begin Settings Block - builder.start("settings") # type: ignore + builder.start("settings", {}) # type: ignore if self.getMetaDataEntry("definition") == "fdmprinter": for instance in self.findInstances(): @@ -258,7 +258,7 @@ class XmlMaterialProfile(InstanceContainer): product = product_name break - builder.start("machine") # type: ignore + builder.start("machine", {}) # type: ignore builder.start("machine_identifier", { "manufacturer": container.getMetaDataEntry("machine_manufacturer", definition_metadata.get("manufacturer", "Unknown")), From a2e5ce66806a46bf0d2ab66784ae8ec50c96352c Mon Sep 17 00:00:00 2001 From: cataclism <69798041+cataclism@users.noreply.github.com> Date: Mon, 11 Jan 2021 09:07:35 +0100 Subject: [PATCH 055/128] Adding the MINGDA D2 (#8872) * Added the configuration files for the Artillery Printers Added the configuration files for the Artillery Printers * Changed version file * Updated versions, removed machine_head_polygon * fixed version in some files * Added generic PLA,PETG,ABS,TPU * Update resources/definitions/artillery_base.def.json Co-authored-by: Konstantinos Karmas * Update resources/definitions/artillery_base.def.json Co-authored-by: Konstantinos Karmas * 1st batch of update * Apply suggestions from code review Co-authored-by: Konstantinos Karmas * 2nd batch of changes * Update resources/quality/artillery/PETG/artillery_0.2_PETG_super.inst.cfg Co-authored-by: Konstantinos Karmas * Update resources/quality/artillery/PETG/artillery_0.2_PETG_ultra.inst.cfg Co-authored-by: Konstantinos Karmas * Update resources/quality/artillery/PETG/artillery_0.3_PETG_low.inst.cfg Co-authored-by: Konstantinos Karmas * Update resources/quality/artillery/PETG/artillery_0.3_PETG_adaptive.inst.cfg Co-authored-by: Konstantinos Karmas * Added the MINDA definition and the MINGDA D2 * Update mingda_d2.def.json Inserted artillery genius plate for the moment * Update mingda_d2.def.json Updated machine dimension * Added the mesh for the D2 & updated the offsets * Update resources/definitions/mingda_base.def.json Co-authored-by: Konstantinos Karmas * Apply suggestions from code review Co-authored-by: Konstantinos Karmas * Apply suggestions from code review Co-authored-by: Konstantinos Karmas Co-authored-by: Konstantinos Karmas --- resources/definitions/mingda_base.def.json | 264 ++++++++++++++++++ resources/definitions/mingda_d2.def.json | 19 ++ .../extruders/mingda_base_extruder_0.def.json | 16 ++ resources/meshes/mingda_d2_base.stl | Bin 0 -> 270284 bytes .../mingda/ABS/mingda_0.2_ABS_super.inst.cfg | 14 + .../mingda/ABS/mingda_0.2_ABS_ultra.inst.cfg | 14 + .../ABS/mingda_0.3_ABS_adaptive.inst.cfg | 14 + .../mingda/ABS/mingda_0.3_ABS_low.inst.cfg | 14 + .../ABS/mingda_0.3_ABS_standard.inst.cfg | 14 + .../mingda/ABS/mingda_0.3_ABS_super.inst.cfg | 14 + .../ABS/mingda_0.4_ABS_adaptive.inst.cfg | 14 + .../mingda/ABS/mingda_0.4_ABS_low.inst.cfg | 14 + .../ABS/mingda_0.4_ABS_standard.inst.cfg | 14 + .../mingda/ABS/mingda_0.4_ABS_super.inst.cfg | 14 + .../ABS/mingda_0.5_ABS_adaptive.inst.cfg | 14 + .../mingda/ABS/mingda_0.5_ABS_low.inst.cfg | 14 + .../ABS/mingda_0.5_ABS_standard.inst.cfg | 14 + .../mingda/ABS/mingda_0.5_ABS_super.inst.cfg | 14 + .../ABS/mingda_0.6_ABS_standard.inst.cfg | 14 + .../mingda/ABS/mingda_0.8_ABS_draft.inst.cfg | 14 + .../mingda/ABS/mingda_1.0_ABS_draft.inst.cfg | 14 + .../PETG/mingda_0.2_PETG_super.inst.cfg | 15 + .../PETG/mingda_0.2_PETG_ultra.inst.cfg | 15 + .../PETG/mingda_0.3_PETG_adaptive.inst.cfg | 15 + .../mingda/PETG/mingda_0.3_PETG_low.inst.cfg | 15 + .../PETG/mingda_0.3_PETG_standard.inst.cfg | 15 + .../PETG/mingda_0.3_PETG_super.inst.cfg | 15 + .../PETG/mingda_0.4_PETG_adaptive.inst.cfg | 15 + .../mingda/PETG/mingda_0.4_PETG_low.inst.cfg | 15 + .../PETG/mingda_0.4_PETG_standard.inst.cfg | 15 + .../PETG/mingda_0.4_PETG_super.inst.cfg | 15 + .../PETG/mingda_0.5_PETG_adaptive.inst.cfg | 15 + .../mingda/PETG/mingda_0.5_PETG_low.inst.cfg | 15 + .../PETG/mingda_0.5_PETG_standard.inst.cfg | 15 + .../PETG/mingda_0.5_PETG_super.inst.cfg | 15 + .../PETG/mingda_0.6_PETG_standard.inst.cfg | 15 + .../PETG/mingda_0.8_PETG_draft.inst.cfg | 15 + .../PETG/mingda_1.0_PETG_draft.inst.cfg | 15 + .../mingda/PLA/mingda_0.2_PLA_super.inst.cfg | 13 + .../mingda/PLA/mingda_0.2_PLA_ultra.inst.cfg | 13 + .../PLA/mingda_0.3_PLA_adaptive.inst.cfg | 12 + .../mingda/PLA/mingda_0.3_PLA_low.inst.cfg | 13 + .../PLA/mingda_0.3_PLA_standard.inst.cfg | 13 + .../mingda/PLA/mingda_0.3_PLA_super.inst.cfg | 13 + .../PLA/mingda_0.4_PLA_adaptive.inst.cfg | 13 + .../mingda/PLA/mingda_0.4_PLA_low.inst.cfg | 13 + .../PLA/mingda_0.4_PLA_standard.inst.cfg | 13 + .../mingda/PLA/mingda_0.4_PLA_super.inst.cfg | 13 + .../PLA/mingda_0.5_PLA_adaptive.inst.cfg | 13 + .../mingda/PLA/mingda_0.5_PLA_low.inst.cfg | 13 + .../PLA/mingda_0.5_PLA_standard.inst.cfg | 13 + .../mingda/PLA/mingda_0.5_PLA_super.inst.cfg | 13 + .../mingda/PLA/mingda_0.6_PLA_draft.inst.cfg | 13 + .../mingda/PLA/mingda_0.6_PLA_low.inst.cfg | 13 + .../PLA/mingda_0.6_PLA_standard.inst.cfg | 13 + .../mingda/PLA/mingda_0.8_PLA_draft.inst.cfg | 13 + .../mingda/PLA/mingda_1.0_PLA_draft.inst.cfg | 13 + .../TPU/mingda_0.3_TPU_adaptive.inst.cfg | 13 + .../TPU/mingda_0.3_TPU_standard.inst.cfg | 13 + .../mingda/TPU/mingda_0.3_TPU_super.inst.cfg | 13 + .../TPU/mingda_0.4_TPU_adaptive.inst.cfg | 13 + .../TPU/mingda_0.4_TPU_standard.inst.cfg | 13 + .../mingda/TPU/mingda_0.4_TPU_super.inst.cfg | 13 + .../TPU/mingda_0.5_TPU_adaptive.inst.cfg | 13 + .../TPU/mingda_0.5_TPU_standard.inst.cfg | 13 + .../mingda/TPU/mingda_0.5_TPU_super.inst.cfg | 13 + .../TPU/mingda_0.6_TPU_standard.inst.cfg | 13 + .../mingda/TPU/mingda_0.8_TPU_draft.inst.cfg | 13 + .../mingda/TPU/mingda_1.0_TPU_draft.inst.cfg | 13 + .../mingda/mingda_global_adaptive.inst.cfg | 19 ++ .../mingda/mingda_global_draft.inst.cfg | 18 ++ .../quality/mingda/mingda_global_low.inst.cfg | 18 ++ .../mingda/mingda_global_standard.inst.cfg | 18 ++ .../mingda/mingda_global_super.inst.cfg | 18 ++ .../mingda/mingda_global_ultra.inst.cfg | 18 ++ resources/variants/mingda_base_0.2.inst.cfg | 12 + resources/variants/mingda_base_0.3.inst.cfg | 12 + resources/variants/mingda_base_0.4.inst.cfg | 12 + resources/variants/mingda_base_0.6.inst.cfg | 12 + resources/variants/mingda_base_0.8.inst.cfg | 12 + resources/variants/mingda_base_1.0.inst.cfg | 12 + resources/variants/mingda_d2_0.2.inst.cfg | 12 + resources/variants/mingda_d2_0.3.inst.cfg | 12 + resources/variants/mingda_d2_0.4.inst.cfg | 12 + resources/variants/mingda_d2_0.5.inst.cfg | 12 + resources/variants/mingda_d2_0.6.inst.cfg | 12 + resources/variants/mingda_d2_0.8.inst.cfg | 12 + resources/variants/mingda_d2_1.0.inst.cfg | 12 + 88 files changed, 1459 insertions(+) create mode 100644 resources/definitions/mingda_base.def.json create mode 100644 resources/definitions/mingda_d2.def.json create mode 100644 resources/extruders/mingda_base_extruder_0.def.json create mode 100644 resources/meshes/mingda_d2_base.stl create mode 100644 resources/quality/mingda/ABS/mingda_0.2_ABS_super.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.2_ABS_ultra.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.3_ABS_adaptive.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.3_ABS_low.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.3_ABS_standard.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.3_ABS_super.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.4_ABS_adaptive.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.4_ABS_low.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.4_ABS_standard.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.4_ABS_super.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.5_ABS_adaptive.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.5_ABS_low.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.5_ABS_standard.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.5_ABS_super.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.6_ABS_standard.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_0.8_ABS_draft.inst.cfg create mode 100644 resources/quality/mingda/ABS/mingda_1.0_ABS_draft.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.2_PETG_super.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.2_PETG_ultra.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.3_PETG_adaptive.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.3_PETG_low.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.3_PETG_standard.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.3_PETG_super.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.4_PETG_adaptive.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.4_PETG_low.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.4_PETG_standard.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.4_PETG_super.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.5_PETG_adaptive.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.5_PETG_low.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.5_PETG_standard.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.5_PETG_super.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.6_PETG_standard.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_0.8_PETG_draft.inst.cfg create mode 100644 resources/quality/mingda/PETG/mingda_1.0_PETG_draft.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.2_PLA_super.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.2_PLA_ultra.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.3_PLA_adaptive.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.3_PLA_low.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.3_PLA_standard.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.3_PLA_super.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.4_PLA_adaptive.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.4_PLA_low.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.4_PLA_standard.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.4_PLA_super.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.5_PLA_adaptive.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.5_PLA_low.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.5_PLA_standard.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.5_PLA_super.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.6_PLA_draft.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.6_PLA_low.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.6_PLA_standard.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_0.8_PLA_draft.inst.cfg create mode 100644 resources/quality/mingda/PLA/mingda_1.0_PLA_draft.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.3_TPU_adaptive.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.3_TPU_standard.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.3_TPU_super.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.4_TPU_adaptive.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.4_TPU_standard.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.4_TPU_super.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.5_TPU_adaptive.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.5_TPU_standard.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.5_TPU_super.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.6_TPU_standard.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_0.8_TPU_draft.inst.cfg create mode 100644 resources/quality/mingda/TPU/mingda_1.0_TPU_draft.inst.cfg create mode 100644 resources/quality/mingda/mingda_global_adaptive.inst.cfg create mode 100644 resources/quality/mingda/mingda_global_draft.inst.cfg create mode 100644 resources/quality/mingda/mingda_global_low.inst.cfg create mode 100644 resources/quality/mingda/mingda_global_standard.inst.cfg create mode 100644 resources/quality/mingda/mingda_global_super.inst.cfg create mode 100644 resources/quality/mingda/mingda_global_ultra.inst.cfg create mode 100644 resources/variants/mingda_base_0.2.inst.cfg create mode 100644 resources/variants/mingda_base_0.3.inst.cfg create mode 100644 resources/variants/mingda_base_0.4.inst.cfg create mode 100644 resources/variants/mingda_base_0.6.inst.cfg create mode 100644 resources/variants/mingda_base_0.8.inst.cfg create mode 100644 resources/variants/mingda_base_1.0.inst.cfg create mode 100644 resources/variants/mingda_d2_0.2.inst.cfg create mode 100644 resources/variants/mingda_d2_0.3.inst.cfg create mode 100644 resources/variants/mingda_d2_0.4.inst.cfg create mode 100644 resources/variants/mingda_d2_0.5.inst.cfg create mode 100644 resources/variants/mingda_d2_0.6.inst.cfg create mode 100644 resources/variants/mingda_d2_0.8.inst.cfg create mode 100644 resources/variants/mingda_d2_1.0.inst.cfg diff --git a/resources/definitions/mingda_base.def.json b/resources/definitions/mingda_base.def.json new file mode 100644 index 0000000000..a7daa76d97 --- /dev/null +++ b/resources/definitions/mingda_base.def.json @@ -0,0 +1,264 @@ +{ + "name": "MINGDA Base Printer", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": false, + "author": "cataclism", + "manufacturer": "MINGDA", + "file_formats": "text/x-gcode", + "first_start_actions": ["MachineSettingsAction"], + + "machine_extruder_trains": { + "0": "mingda_base_extruder_0" + }, + + "has_materials": true, + "has_variants": true, + "has_machine_quality": true, + "variants_name": "Nozzle Size", + + "preferred_variant_name": "0.4mm Nozzle", + "preferred_quality_type": "standard", + "preferred_material": "generic_pla", + "exclude_materials": [ + "Vertex_Delta_ABS", + "Vertex_Delta_PET", + "Vertex_Delta_PLA", + "Vertex_Delta_TPU", + "chromatik_pla", + "dsm_arnitel2045_175", + "dsm_novamid1070_175", + "fabtotum_abs", + "fabtotum_nylon", + "fabtotum_pla", + "fabtotum_tpu", + "fiberlogy_hd_pla", + "filo3d_pla", + "filo3d_pla_green", + "filo3d_pla_red", + "generic_bam", + "generic_cffcpe", + "generic_cffpa", + "generic_cpe", + "generic_cpe_plus", + "generic_gffcpe", + "generic_gffpa", + "generic_hips", + "generic_nylon", + "generic_pc", + "generic_pp", + "generic_pva", + "generic_tough_pla", + "imade3d_petg_green", + "imade3d_petg_pink", + "imade3d_pla_green", + "imade3d_pla_pink", + "innofill_innoflex60_175", + "octofiber_pla", + "polyflex_pla", + "polymax_pla", + "polyplus_pla", + "polywood_pla", + "structur3d_dap100silicone", + "tizyx_abs", + "tizyx_pla", + "tizyx_pla_bois", + "ultimaker_abs_black", + "ultimaker_abs_blue", + "ultimaker_abs_green", + "ultimaker_abs_grey", + "ultimaker_abs_orange", + "ultimaker_abs_pearl-gold", + "ultimaker_abs_red", + "ultimaker_abs_silver-metallic", + "ultimaker_abs_white", + "ultimaker_abs_yellow", + "ultimaker_bam", + "ultimaker_cpe_black", + "ultimaker_cpe_blue", + "ultimaker_cpe_dark-grey", + "ultimaker_cpe_green", + "ultimaker_cpe_light-grey", + "ultimaker_cpe_plus_black", + "ultimaker_cpe_plus_transparent", + "ultimaker_cpe_plus_white", + "ultimaker_cpe_red", + "ultimaker_cpe_transparent", + "ultimaker_cpe_white", + "ultimaker_cpe_yellow", + "ultimaker_nylon_black", + "ultimaker_nylon_transparent", + "ultimaker_pc_black", + "ultimaker_pc_transparent", + "ultimaker_pc_white", + "ultimaker_pla_black", + "ultimaker_pla_blue", + "ultimaker_pla_green", + "ultimaker_pla_magenta", + "ultimaker_pla_orange", + "ultimaker_pla_pearl-white", + "ultimaker_pla_red", + "ultimaker_pla_silver-metallic", + "ultimaker_pla_transparent", + "ultimaker_pla_white", + "ultimaker_pla_yellow", + "ultimaker_pp_transparent", + "ultimaker_pva", + "ultimaker_tough_pla_black", + "ultimaker_tough_pla_green", + "ultimaker_tough_pla_red", + "ultimaker_tough_pla_white", + "ultimaker_tpu_black", + "ultimaker_tpu_blue", + "ultimaker_tpu_red", + "ultimaker_tpu_white", + "verbatim_bvoh_175", + "zyyx_pro_flex", + "zyyx_pro_pla" + ] + }, + "overrides": { + "machine_name": { "default_value": "MINGDA Base Printer" }, + "machine_start_gcode": { "default_value": "G28 ; home all axes\n M117 Purge extruder\n G92 E0 ; reset extruder\n G1 Z1.0 F3000 ; move z up little to prevent scratching of surface\n G1 X2 Y20 Z0.3 F5000.0 ; move to start-line position\n G1 X2 Y200.0 Z0.3 F1500.0 E15 ; draw 1st line\n G1 X2 Y200.0 Z0.4 F5000.0 ; move to side a little\n G1 X2 Y20 Z0.4 F1500.0 E30 ; draw 2nd line\n G92 E0 ; reset extruder\n G1 Z1.0 F3000 ; move z up little to prevent scratching of surface"}, + "machine_end_gcode": { "default_value": "G91; relative positioning\n G1 Z1.0 F3000 ; move z up little to prevent scratching of print\n G90; absolute positioning\n G1 X0 Y200 F1000 ; prepare for part removal\n M104 S0; turn off extruder\n M140 S0 ; turn off bed\n G1 X0 Y300 F1000 ; prepare for part removal\n M84 ; disable motors\n M106 S0 ; turn off fan" }, + + "machine_max_feedrate_x": { "value": 500 }, + "machine_max_feedrate_y": { "value": 500 }, + "machine_max_feedrate_z": { "value": 10 }, + "machine_max_feedrate_e": { "value": 50 }, + + "machine_max_acceleration_x": { "value": 500 }, + "machine_max_acceleration_y": { "value": 500 }, + "machine_max_acceleration_z": { "value": 100 }, + "machine_max_acceleration_e": { "value": 5000 }, + "machine_acceleration": { "value": 500 }, + + "machine_max_jerk_xy": { "value": 10 }, + "machine_max_jerk_z": { "value": 0.4 }, + "machine_max_jerk_e": { "value": 5 }, + + "machine_heated_bed": { "default_value": true }, + + "material_diameter": { "default_value": 1.75 }, + + "acceleration_print": { "value": 500 }, + "acceleration_travel": { "value": 500 }, + "acceleration_travel_layer_0": { "value": "acceleration_travel" }, + "acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" }, + + "jerk_print": { "value": 8 }, + "jerk_travel": { "value": "jerk_print" }, + "jerk_travel_layer_0": { "value": "jerk_travel" }, + + "acceleration_enabled": { "value": false }, + "jerk_enabled": { "value": false }, + + "speed_print": { "value": 60.0 } , + "speed_infill": { "value": "speed_print" }, + "speed_wall": { "value": "speed_print / 2" }, + "speed_wall_0": { "value": "speed_wall" }, + "speed_wall_x": { "value": "speed_wall" }, + "speed_topbottom": { "value": "speed_print / 2" }, + "speed_roofing": { "value": "speed_topbottom" }, + "speed_travel": { "value": "150.0 if speed_print < 60 else 250.0 if speed_print > 100 else speed_print * 2.5" }, + "speed_layer_0": { "value": 20.0 }, + "speed_print_layer_0": { "value": "speed_layer_0" }, + "speed_travel_layer_0": { "value": "100 if speed_layer_0 < 20 else 150 if speed_layer_0 > 30 else speed_layer_0 * 5" }, + "speed_prime_tower": { "value": "speed_topbottom" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_z_hop": { "value": 5 }, + + "skirt_brim_speed": { "value": "speed_layer_0" }, + + "line_width": { "value": "machine_nozzle_size * 1.1" }, + + "optimize_wall_printing_order": { "value": true }, + + "material_initial_print_temperature": { "value": "material_print_temperature" }, + "material_final_print_temperature": { "value": "material_print_temperature" }, + "material_flow": { "value": 100 }, + "travel_compensate_overlapping_walls_0_enabled": { "value": false }, + + "z_seam_type": { "value": "'back'" }, + "z_seam_corner": { "value": "'z_seam_corner_none'" }, + + "infill_sparse_density": { "value": "15" }, + "infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'" }, + "infill_before_walls": { "value": false }, + "infill_overlap": { "value": 30.0 }, + "skin_overlap": { "value": 10.0 }, + "infill_wipe_dist": { "value": 0.0 }, + "wall_0_wipe_dist": { "value": 0.0 }, + + "fill_perimeter_gaps": { "value": "'everywhere'" }, + "fill_outline_gaps": { "value": false }, + "filter_out_tiny_gaps": { "value": false }, + + "retraction_speed": { + "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')", + "maximum_value": 200 + }, + "retraction_retract_speed": { + "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')", + "maximum_value": 200 + }, + "retraction_prime_speed": { + "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')", + "maximum_value": 200 + }, + + "retraction_hop_enabled": { "value": true }, + "retraction_hop": { "value": "layer_height*2" }, + "retraction_combing": { "value": "'off' if retraction_hop_enabled else 'infill'" }, + "retraction_combing_max_distance": { "value": 30 }, + "travel_avoid_other_parts": { "value": true }, + "travel_avoid_supports": { "value": true }, + "travel_retract_before_outer_wall": { "value": true }, + + "retraction_amount": { "value": 2 }, + "retraction_enable": { "value": true }, + "retraction_count_max": { "value": 100 }, + "retraction_extrusion_window": { "value": 10 }, + "retraction_min_travel": { "value": 1.5 }, + + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_fan_enabled": { "value": true }, + "cool_min_layer_time": { "value": 10 }, + + "adhesion_type": { "value": "'none' if support_enable else 'skirt'" }, + "brim_replaces_support": { "value": false }, + "skirt_gap": { "value": 10.0 }, + "skirt_line_count": { "value": 4 }, + + "adaptive_layer_height_variation": { "value": 0.04 }, + "adaptive_layer_height_variation_step": { "value": 0.04 }, + + "meshfix_maximum_resolution": { "value": "0.05" }, + "meshfix_maximum_travel_resolution": { "value": "meshfix_maximum_resolution" }, + + "support_angle": { "value": "math.floor(math.degrees(math.atan(line_width / 2.0 / layer_height)))" }, + "support_pattern": { "value": "'zigzag'" }, + "support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" }, + "support_use_towers": { "value": false }, + "support_xy_distance": { "value": "wall_line_width_0 * 2" }, + "support_xy_distance_overhang": { "value": "wall_line_width_0" }, + "support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height * 2" }, + "support_xy_overrides_z": { "value": "'xy_overrides_z'" }, + "support_wall_count": { "value": 1 }, + "support_brim_enable": { "value": true }, + "support_brim_width": { "value": 4 }, + + "support_interface_enable": { "value": true }, + "support_interface_height": { "value": "layer_height * 4" }, + "support_interface_density": { "value": 33.333 }, + "support_interface_pattern": { "value": "'grid'" }, + "support_interface_skip_height": { "value": 0.2 }, + "minimum_support_area": { "value": 2 }, + "minimum_interface_area": { "value": 10 }, + "top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3" }, + "wall_thickness": {"value": "line_width * 2" } + + } +} diff --git a/resources/definitions/mingda_d2.def.json b/resources/definitions/mingda_d2.def.json new file mode 100644 index 0000000000..a20ff53db1 --- /dev/null +++ b/resources/definitions/mingda_d2.def.json @@ -0,0 +1,19 @@ +{ + "name": "MINGDA D2", + "version": 2, + "inherits": "mingda_base", + "overrides": { + "machine_name": { "default_value": "MINGDA D2" }, + "machine_width": { "default_value": 230 }, + "machine_depth": { "default_value": 230 }, + "machine_height": { "default_value": 260 }, + "gantry_height": { "value": 25 } + + }, + "metadata": { + "quality_definition": "mingda_base", + "visible": true, + "platform": "mingda_d2_base.stl", + "platform_offset": [ -205, -77, 65] + } +} diff --git a/resources/extruders/mingda_base_extruder_0.def.json b/resources/extruders/mingda_base_extruder_0.def.json new file mode 100644 index 0000000000..034f6ce45f --- /dev/null +++ b/resources/extruders/mingda_base_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "mingda_base", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + + } +} diff --git a/resources/meshes/mingda_d2_base.stl b/resources/meshes/mingda_d2_base.stl new file mode 100644 index 0000000000000000000000000000000000000000..025900f243662db101ff16b284c421d0e80654f4 GIT binary patch literal 270284 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 Date: Mon, 11 Jan 2021 02:15:17 -0600 Subject: [PATCH 056/128] Added Maker Made 300x Printer (#8901) * Add files via upload * Add files via upload * Update maker_made_300x.def.json * Update maker_made_300x_extruder_0.json * Update maker_made_300x_extruder_0.json * Update maker_made_300x.def.json * Update maker_made_300x.def.json * Update maker_made_300x.def.json * Update resources/extruders/maker_made_300x_extruder_0.json Co-authored-by: Konstantinos Karmas * Update resources/definitions/maker_made_300x.def.json Co-authored-by: Konstantinos Karmas * Update resources/definitions/maker_made_300x.def.json Co-authored-by: Konstantinos Karmas * Update maker_made_300x.def.json * Rename maker_made_300x_extruder_0.json to maker_made_300x_extruder_0.def.json Co-authored-by: Konstantinos Karmas --- .../definitions/maker_made_300x.def.json | 150 ++++++++++++++++++ .../maker_made_300x_extruder_0.def.json | 15 ++ 2 files changed, 165 insertions(+) create mode 100644 resources/definitions/maker_made_300x.def.json create mode 100644 resources/extruders/maker_made_300x_extruder_0.def.json diff --git a/resources/definitions/maker_made_300x.def.json b/resources/definitions/maker_made_300x.def.json new file mode 100644 index 0000000000..9651aaf5f3 --- /dev/null +++ b/resources/definitions/maker_made_300x.def.json @@ -0,0 +1,150 @@ +{ + "version": 2, + "name": "Maker Made 300x", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "DragonJe", + "manufacturer": "Maker Made", + "file_formats": "text/x-gcode", + "platform_offset": [0, 0, 0], + "has_materials": true, + "has_variants": false, + "preferred_quality_type": "normal", + "has_machine_quality": false, + "preferred_material": "generic_pla", + "machine_extruder_trains": + { + "0": "maker_made_300x_extruder_0" + } + }, + + "overrides": { + "machine_name": {"default_value": "Maker Made 300x"}, + "machine_width": {"default_value": 300}, + "machine_height": {"default_value": 400}, + "machine_depth": {"default_value": 300}, + "machine_head_with_fans_polygon": {"default_value": [[-30, 34],[-30, -32],[30, -32],[30, 34]]}, + "gantry_height": {"value": "30"}, + "machine_heated_bed": {"default_value": true}, + "material_diameter": {"default_value": 1.75}, + "machine_gcode_flavor": {"default_value": " RepRap (Marlin/Sprinter)"}, + "machine_start_gcode": {"default_value": "G28 ;Home\n G29 ;Auto Level\n G92 E0 ;Reset Extruder\n G1 Z5.0 F3000 ;Move Z Axis up\n G1 X25 Y295.0 Z0.28 F3000.0 ;Move to extrude\n G1 X250 Y295.0 Z0.28 F1500.0 E15 ;Draw the first line\n G1 X25 Y290.0 Z0.28 F3000.0 ;Move to side a little\n G1 X250 Y290.0 Z0.28 F1500.0 E30 ;Draw the second line\n G92 E0 ;Reset Extruder\n G1 Z5.0 F3000 ;Move Z Axis up" }, + "machine_end_gcode": {"default_value": "M104 S0\n M140 S0\n ;Retract the filament\n G92 E1\n G1 E-1 F300\n G28 X0 Y0\n G1 Y300 F3000 ;Move bed forward\n M84" }, + + "layer_height": {"value": 0.16}, + "layer_height_0": {"value": 0.32}, + "line_width": {"value": 0.4}, + "wall_line_width_0": {"value": 0.4}, + "initial_layer_line_width_factor": {"value": 100}, + "wall_thickness": {"value": 0.8}, + "wall_0_wipe_dist": {"value": 0.2}, + "roofing_layer_count": {"value": 1}, + "top_bottom_thickness": {"value": 0.6}, + "top_thickness": {"value": 0.8}, + "top_layers": {"value": 5}, + "bottom_thickness": {"value": 0.6}, + "bottom_layers": {"value": 3}, + "top_bottom_pattern": {"value": "'lines'" }, + "top_bottom_pattern_0": {"value": "'lines'" }, + "wall_0_inset": {"value": 0}, + "optimize_wall_printing_order": {"value": false }, + "outer_inset_first": {"value": false }, + "alternate_extra_perimeter": {"value": false }, + "travel_compensate_overlapping_walls_enabled": {"value": true }, + "travel_compensate_overlapping_walls_0_enabled": {"value": true }, + "travel_compensate_overlapping_walls_x_enabled": {"value": true }, + "wall_min_flow": {"value": 0}, + "fill_perimeter_gaps": {"value": "'everywhere'" }, + "filter_out_tiny_gaps": {"value": true }, + "fill_outline_gaps": {"value": true }, + "xy_offset": {"value": 0}, + "skin_no_small_gaps_heuristic": {"value": true }, + "skin_outline_count": {"value": 1}, + "ironing_enabled": {"value": false }, + "infill_sparse_density": {"value": 20 }, + "zig_zaggify_infill": {"value": false }, + "infill_multiplier": {"value": 1}, + "infill_wall_line_count": {"value": 0}, + "infill_overlap": {"value": 10}, + "skin_overlap": {"value": 5}, + "infill_wipe_dist": {"value": 0.1}, + "gradual_infill_steps": {"value": 0}, + "infill_before_walls": {"value": false }, + "infill_support_enabled": {"value": false }, + "max_skin_angle_for_expansion": {"value": 90}, + "default_material_print_temperature": {"value": 220}, + "material_print_temperature": {"value": 220}, + "material_print_temperature_layer_0": {"value": 220}, + "material_initial_print_temperature": {"value": 220}, + "material_final_print_temperature": {"value": 220}, + "default_material_bed_temperature": {"value": 50}, + "material_bed_temperature": {"value": 50}, + "material_flow": {"value": 100}, + "retraction_enable": {"value": true }, + "retract_at_layer_change": {"value": false }, + "retraction_amount": {"value": 5}, + "retraction_speed": {"value": 45}, + "retraction_extra_prime_amount": {"value": 0}, + "retraction_min_travel": {"value": 0.8}, + "retraction_count_max": {"value": 90}, + "retraction_extrusion_window": {"value": 5}, + "limit_support_retractions": {"value": true }, + "switch_extruder_retraction_amount": {"value": 16}, + "switch_extruder_retraction_speeds": {"value": 20}, + "speed_print": {"value": 50}, + "speed_travel": {"value": 150}, + "speed_layer_0": {"value": 10}, + "speed_travel_layer_0": {"value": 50}, + "machine_max_feedrate_z": {"value": 0}, + "speed_slowdown_layers": {"value": 2}, + "speed_equalize_flow_enabled": {"value": false }, + "acceleration_enabled": {"value": false }, + "acceleration_roofing": {"value": 3000 }, + "jerk_enabled": {"value": false }, + "retraction_combing": {"value": "'within infill'" }, + "travel_retract_before_outer_wall": {"value": false }, + "travel_avoid_other_parts": {"value": true }, + "retraction_hop_enabled": {"value": false }, + "cool_fan_enabled": {"value": true }, + "cool_fan_speed": {"value": 100}, + "cool_fan_speed_0": {"value": 0}, + "cool_fan_full_at_height": {"value": 0.32 }, + "cool_lift_head": {"value": false }, + "support_enable": {"value": true }, + "support_type": {"value": "'everywhere'" }, + "support_angle": {"value": "50"}, + "support_pattern": {"value": "'grid'"}, + "support_wall_count": {"value": 0}, + "zig_zaggify_support": {"value": false }, + "support_infill_rate": {"value": "15 if support_enable else 0"}, + "support_brim_enable": {"value": true }, + "support_brim_line_count": {"value": 5}, + "support_z_distance": {"value": 0.2}, + "support_xy_distance": {"value": 0.7}, + "support_xy_distance_overhang": {"value": 0.2}, + "support_bottom_stair_step_height": {"value": 0.3}, + "support_bottom_stair_step_width": {"value": 5.0}, + "support_join_distance": {"value": 2.0}, + "support_offset": {"value": 0.2}, + "gradual_support_infill_steps": {"value": 0}, + "support_roof_enable": {"value": true }, + "support_bottom_enable": {"value": false }, + "support_roof_height": {"value": 0.45}, + "support_roof_density": {"value": 45}, + "support_roof_pattern": {"value": "'lines'" }, + "support_fan_enable": {"value": false }, + "support_use_towers": {"value": true }, + "support_tower_diameter": {"value": 3}, + "support_tower_roof_angle": {"value": "65"}, + "adhesion_type": {"value": "'skirt'"}, + "skirt_line_count": {"value": 2}, + "skirt_gap": {"value": 3}, + "meshfix_union_all": {"value": true }, + "meshfix_union_all_remove_holes": {"value": false }, + "meshfix_extensive_stitching": {"value": false }, + "meshfix_keep_open_polygons": {"value": false }, + "multiple_mesh_overlap": {"value": "0.16"}, + "carve_multiple_volumes": {"value": false } + } +} diff --git a/resources/extruders/maker_made_300x_extruder_0.def.json b/resources/extruders/maker_made_300x_extruder_0.def.json new file mode 100644 index 0000000000..a35c47b395 --- /dev/null +++ b/resources/extruders/maker_made_300x_extruder_0.def.json @@ -0,0 +1,15 @@ +{ + "name": "Extruder 1", + "version": 2, + "inherits": "fdmextruder", + "metadata": { + "machine": "maker_made_300x", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} From 3282ad7a4169cd76f160a84781d30603ed9c1d7e Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 11 Jan 2021 12:52:23 +0100 Subject: [PATCH 057/128] Don't add temporary files in the recent files list if F5 is pressed CURA-7864 --- cura/CuraApplication.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 98e2e923d0..76d48f9682 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -3,6 +3,7 @@ import os import sys +import tempfile import time from typing import cast, TYPE_CHECKING, Optional, Callable, List, Any, Dict @@ -1477,7 +1478,8 @@ class CuraApplication(QtApplication): for file_name, nodes in objects_in_filename.items(): for node in nodes: - job = ReadMeshJob(file_name) + file_path = os.path.normpath(os.path.dirname(file_name)) + job = ReadMeshJob(file_name, add_to_recent_files = file_path != tempfile.gettempdir()) # Don't add temp files to the recent files list job._node = node # type: ignore job.finished.connect(self._reloadMeshFinished) if has_merged_nodes: From fd3c9854406e9a655d7076307bf91d8ca4840a1f Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 11 Jan 2021 17:50:26 +0100 Subject: [PATCH 058/128] Fix ambiguous Ctrl+O shortcut not opening the local file dialog Ctrl+O was assigned as a shortcut in two places: 1. To the "File->Open File(s)" menu item, which is visible when only the local file provider is enabled (i.e. the DF file provider is disabled) 2. To the "File->Open File(s)->From Disk" menu item, which is visible when there are more than one file providers enabled. This was creating an ambiguous shortcut, thus never opening the local file dialog. This is now fixed by disabling the shortcuts when the respective items are not visible. CURA-7868 --- resources/qml/Actions.qml | 6 +++++- resources/qml/Menus/OpenFilesMenu.qml | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index c62b0cb89a..78c4958598 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -416,9 +416,13 @@ Item Action { id: openAction; + property var fileProviderModel: CuraApplication.getFileProviderModel() + text: catalog.i18nc("@action:inmenu menubar:file","&Open File(s)..."); iconName: "document-open"; - shortcut: StandardKey.Open; + // Unassign the shortcut when there are more than one file providers, since then the file provider's shortcut is + // enabled instead, and Ctrl+O is assigned to the local file provider + shortcut: fileProviderModel.count == 1 ? StandardKey.Open : ""; } Action diff --git a/resources/qml/Menus/OpenFilesMenu.qml b/resources/qml/Menus/OpenFilesMenu.qml index 60fb507b34..3c2b64ee62 100644 --- a/resources/qml/Menus/OpenFilesMenu.qml +++ b/resources/qml/Menus/OpenFilesMenu.qml @@ -36,7 +36,9 @@ Menu CuraApplication.getFileProviderModel().trigger(model.name); } } - shortcut: model.shortcut + // Unassign the shortcuts when the submenu is invisible (i.e. when there is only one file provider) to avoid ambiguous shortcuts. + // When there is a signle file provider, the openAction is assigned with the Ctrl+O shortcut instead. + shortcut: openFilesMenu.visible ? model.shortcut : "" } onObjectAdded: openFilesMenu.insertItem(index, object) onObjectRemoved: openFilesMenu.removeItem(object) From 263e1ae3a781dcb2e3991250a8b9c9b8d536e97e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 12 Jan 2021 11:18:42 +0100 Subject: [PATCH 059/128] Show 'connect top/bottom polygons' also when initial layer bottom pattern is concentric Fixes CURA-7962. Fixes #9106. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 63c7b25b0b..bb64e7f0dc 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1230,7 +1230,7 @@ "description": "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happen midway over infill this feature can reduce the top surface quality.", "type": "bool", "default_value": false, - "enabled": "((top_layers > 0 or bottom_layers > 0) and top_bottom_pattern == 'concentric') or (roofing_layer_count > 0 and roofing_pattern == 'concentric')", + "enabled": "((top_layers > 0 or bottom_layers > 0) and top_bottom_pattern == 'concentric') or (initial_bottom_layers > 0 and top_bottom_pattern_0 == 'concentric') or (roofing_layer_count > 0 and roofing_pattern == 'concentric')", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, From a45af1da25a475c874aec843dda384bda5814af3 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 15 Jan 2021 09:50:23 +0100 Subject: [PATCH 060/128] Add save projects submenu CURA-7866 --- resources/qml/Menus/FileMenu.qml | 14 ++++++- resources/qml/Menus/SaveProjectMenu.qml | 53 +++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 resources/qml/Menus/SaveProjectMenu.qml diff --git a/resources/qml/Menus/FileMenu.qml b/resources/qml/Menus/FileMenu.qml index 94fc2358e1..5ea1c9bc06 100644 --- a/resources/qml/Menus/FileMenu.qml +++ b/resources/qml/Menus/FileMenu.qml @@ -4,7 +4,7 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 -import UM 1.2 as UM +import UM 1.6 as UM import Cura 1.0 as Cura Menu @@ -37,8 +37,9 @@ Menu MenuItem { id: saveWorkspaceMenu - shortcut: StandardKey.Save + shortcut: visible ? StandardKey.Save : "" text: catalog.i18nc("@title:menu menubar:file", "&Save Project...") + visible: saveProjectMenu.model.count == 1 onTriggered: { var args = { "filter_by_machine": false, "file_type": "workspace", "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml" }; @@ -54,6 +55,15 @@ Menu } } + UM.ProjectOutputDevicesModel { id: projectOutputDevicesModel } + + SaveProjectMenu + { + id: saveProjectMenu + model: projectOutputDevicesModel + visible: model.count > 1 + } + MenuSeparator { } MenuItem diff --git a/resources/qml/Menus/SaveProjectMenu.qml b/resources/qml/Menus/SaveProjectMenu.qml new file mode 100644 index 0000000000..51894674f0 --- /dev/null +++ b/resources/qml/Menus/SaveProjectMenu.qml @@ -0,0 +1,53 @@ +// Copyright (c) 2021 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.6 as UM +import Cura 1.1 as Cura + +import "../Dialogs" + +Menu +{ + id: saveProjectMenu + title: catalog.i18nc("@title:menu menubar:file", "Save project...") + property alias model: projectOutputDevices.model + + Instantiator + { + id: projectOutputDevices + MenuItem + { + text: model.name + onTriggered: + { + var args = { "filter_by_machine": false, "file_type": "workspace", "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml" }; + if (UM.Preferences.getValue("cura/dialog_on_project_save")) + { + saveWorkspaceDialog.deviceId = model.id + saveWorkspaceDialog.args = args + saveWorkspaceDialog.open() + } + else + { + UM.OutputDeviceManager.requestWriteToDevice(model.id, PrintInformation.jobName, args) + } + } + // Unassign the shortcuts when the submenu is invisible (i.e. when there is only one file provider) to avoid ambiguous shortcuts. + // When there is a signle file provider, the openAction is assigned with the Ctrl+O shortcut instead. + shortcut: saveProjectMenu.visible ? model.shortcut : "" + } + onObjectAdded: saveProjectMenu.insertItem(index, object) + onObjectRemoved: saveProjectMenu.removeItem(object) + } + + WorkspaceSummaryDialog + { + id: saveWorkspaceDialog + property var args + property var deviceId + onYes: UM.OutputDeviceManager.requestWriteToDevice(deviceId, PrintInformation.jobName, args) + } +} From 5d9affc69074e754ec07c8734cb85326029ae558 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Jan 2021 15:21:57 +0100 Subject: [PATCH 061/128] Drop objects to buildplate that have been scaled Otherwise they could be floating very high above the buildplate. CURA-7855 --- cura/CuraApplication.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 76d48f9682..7302066550 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1918,6 +1918,11 @@ class CuraApplication(QtApplication): arrange(nodes_to_arrange, self.getBuildVolume(), fixed_nodes) except: Logger.logException("e", "Failed to arrange the models") + + # Ensure that we don't have any weird floaty objects (CURA-7855) + for node in nodes_to_arrange: + node.translate(Vector(0, -node.getBoundingBox().bottom, 0), SceneNode.TransformSpace.World) + self.fileCompleted.emit(file_name) def addNonSliceableExtension(self, extension): From 2774ec7bdf8b9c98beb9a244f1a2b90b57ddec1f Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 15 Jan 2021 17:42:42 +0100 Subject: [PATCH 062/128] Remove unnecessary kwargs CURA-7865 --- resources/qml/Menus/SaveProjectMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/SaveProjectMenu.qml b/resources/qml/Menus/SaveProjectMenu.qml index 51894674f0..f855af5120 100644 --- a/resources/qml/Menus/SaveProjectMenu.qml +++ b/resources/qml/Menus/SaveProjectMenu.qml @@ -23,7 +23,7 @@ Menu text: model.name onTriggered: { - var args = { "filter_by_machine": false, "file_type": "workspace", "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml" }; + var args = { "file_type": "workspace" }; if (UM.Preferences.getValue("cura/dialog_on_project_save")) { saveWorkspaceDialog.deviceId = model.id From fc718892d94226b29f97ae44801177586c9d61d0 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 18 Jan 2021 12:10:15 +0100 Subject: [PATCH 063/128] Add default text in the ComboBox The Cura.ComboBox component can now display a default text when there are no items in its model and another text when there is no item selected. CURA-7865 --- resources/qml/Widgets/ComboBox.qml | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/resources/qml/Widgets/ComboBox.qml b/resources/qml/Widgets/ComboBox.qml index d4c526e265..26324d7773 100644 --- a/resources/qml/Widgets/ComboBox.qml +++ b/resources/qml/Widgets/ComboBox.qml @@ -15,6 +15,18 @@ ComboBox { id: control + UM.I18nCatalog + { + id: catalog + name: "cura" + } + + property var defaultTextOnEmptyModel: catalog.i18nc("@label", "No items to select from") // Text displayed in the combobox when the model is empty + property var defaultTextOnEmptyIndex: "" // Text displayed in the combobox when the model has items but no item is selected + enabled: model.count > 0 + + onVisibleChanged: { popup.close() } + states: [ State { @@ -67,11 +79,22 @@ ComboBox anchors.verticalCenter: parent.verticalCenter anchors.right: downArrow.left - text: control.currentText + text: + { + if (control.model.count == 0) + { + return control.defaultTextOnEmptyModel != "" ? control.defaultTextOnEmptyModel : control.defaultTextOnEmptyIndex + } + else + { + return control.currentIndex == -1 ? control.defaultTextOnEmptyIndex : control.currentText + } + } + textFormat: Text.PlainText renderType: Text.NativeRendering font: UM.Theme.getFont("default") - color: UM.Theme.getColor("setting_control_text") + color: control.currentIndex == -1 ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") elide: Text.ElideRight verticalAlignment: Text.AlignVCenter } @@ -81,6 +104,7 @@ ComboBox y: control.height - UM.Theme.getSize("default_lining").height width: control.width implicitHeight: contentItem.implicitHeight + 2 * UM.Theme.getSize("default_lining").width + bottomMargin: UM.Theme.getSize("default_margin").height padding: UM.Theme.getSize("default_lining").width contentItem: ListView @@ -133,7 +157,7 @@ ComboBox text: delegateItem.text textFormat: Text.PlainText renderType: Text.NativeRendering - color: control.contentItem.color + color: UM.Theme.getColor("setting_control_text") font: UM.Theme.getFont("default") elide: Text.ElideRight verticalAlignment: Text.AlignVCenter From 770dcd1cf0ba69e98afa0f7fb7242adc6392c45f Mon Sep 17 00:00:00 2001 From: maihde Date: Sun, 17 Jan 2021 18:43:19 -0500 Subject: [PATCH 064/128] feat: add snapmaker 2.0 definitions --- resources/definitions/snapmaker2.def.json | 77 +++++++++++++++++++ .../definitions/snapmaker2_A150.def.json | 39 ++++++++++ .../definitions/snapmaker2_A250.def.json | 39 ++++++++++ .../definitions/snapmaker2_A350.def.json | 39 ++++++++++ .../extruders/snapmaker_extruder_0.def.json | 20 +++++ .../snapmaker2/snapmaker2_fast.inst.cfg | 66 ++++++++++++++++ .../snapmaker2/snapmaker2_high.inst.cfg | 65 ++++++++++++++++ .../snapmaker2/snapmaker2_normal.inst.cfg | 66 ++++++++++++++++ 8 files changed, 411 insertions(+) create mode 100644 resources/definitions/snapmaker2.def.json create mode 100644 resources/definitions/snapmaker2_A150.def.json create mode 100644 resources/definitions/snapmaker2_A250.def.json create mode 100644 resources/definitions/snapmaker2_A350.def.json create mode 100644 resources/extruders/snapmaker_extruder_0.def.json create mode 100644 resources/quality/snapmaker2/snapmaker2_fast.inst.cfg create mode 100644 resources/quality/snapmaker2/snapmaker2_high.inst.cfg create mode 100644 resources/quality/snapmaker2/snapmaker2_normal.inst.cfg diff --git a/resources/definitions/snapmaker2.def.json b/resources/definitions/snapmaker2.def.json new file mode 100644 index 0000000000..e4ad7e19df --- /dev/null +++ b/resources/definitions/snapmaker2.def.json @@ -0,0 +1,77 @@ +{ + "version": 2, + "name": "Snapmaker 2", + "inherits": "fdmprinter", + "metadata": { + "visible": false, + "manufacturer": "Snapmaker", + "file_formats": "text/x-gcode", + "machine_extruder_trains": { + "0": "snapmaker_extruder_0" + }, + "has_materials": true, + "has_machine_quality": true, + "preferred_quality_type": "normal", + "preferred_material": "generic_pla", + "exclude_materials": [ ] + }, + "overrides": { + "machine_name": { + "default_value": "Snapmaker" + }, + "machine_buildplate_type": { + "default_value": "aluminum" + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_start_gcode": { + "default_value": "M104 S{material_print_temperature} ;Set Hotend Temperature\nM140 S{material_bed_temperature} ;Set Bed Temperature\nG28 ;home\nG90 ;absolute positioning\nG1 X-10 Y-10 F3000 ;Move to corner \nG1 Z0 F1800 ;Go to zero offset\nM109 S{material_print_temperature} ;Wait for Hotend Temperature\nM190 S{material_bed_temperature} ;Wait for Bed Temperature\nG92 E0 ;Zero set extruder position\nG1 E20 F200 ;Feed filament to clear nozzle\nG92 E0 ;Zero set extruder position" + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;Extruder heater off\nM140 S0 ;Heated bed heater off\nG90 ;absolute positioning\nG92 E0 ;Retract the filament\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z{machine_width} E-1 F3000 ;move Z up a bit and retract filament even more\nG1 X0 F3000 ;move X to min endstops, so the head is out of the way\nG1 Y{machine_depth} F3000 ;so the head is out of the way and Plate is moved forward" + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_max_acceleration_x": { + "default_value": 1000 + }, + "machine_max_acceleration_y": { + "default_value": 1000 + }, + "machine_max_acceleration_z": { + "default_value": 1000 + }, + "machine_max_acceleration_e": { + "default_value": 1000 + }, + "machine_acceleration": { + "default_value": 1000 + }, + "material_print_temp_prepend": { + "default_value": false + }, + "material_bed_temp_prepend": { + "default_value": false + }, + "default_material_print_temperature": { + "default_value": 205 + }, + "retraction_enable": { + "default_value": true + }, + "retraction_amount": { + "default_value": 5 + }, + "retraction_speed": { + "default_value": 60 + }, + "retract_at_layer_change": { + "default_value": false + } + } +} diff --git a/resources/definitions/snapmaker2_A150.def.json b/resources/definitions/snapmaker2_A150.def.json new file mode 100644 index 0000000000..8baea05016 --- /dev/null +++ b/resources/definitions/snapmaker2_A150.def.json @@ -0,0 +1,39 @@ +{ + "version": 2, + "name": "Snapmaker 2 A150", + "inherits": "snapmaker2", + "metadata": { + "visible": true, + "manufacturer": "Snapmaker", + "file_formats": "text/x-gcode", + "machine_extruder_trains": { + "0": "snapmaker_extruder_0" + }, + "quality_definition": "snapmaker2" + }, + "overrides": { + "machine_name": { + "default_value": "Snapmaker A150" + }, + "machine_width": { + "default_value": 160 + }, + "machine_depth": { + "default_value": 160 + }, + "machine_height": { + "default_value": 145 + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [-67, 22], + [-67, -25], + [25.5, 22], + [25.5, -25] + ] + }, + "gantry_height": { + "value": 27 + } + } +} diff --git a/resources/definitions/snapmaker2_A250.def.json b/resources/definitions/snapmaker2_A250.def.json new file mode 100644 index 0000000000..a61d52c46f --- /dev/null +++ b/resources/definitions/snapmaker2_A250.def.json @@ -0,0 +1,39 @@ +{ + "version": 2, + "name": "Snapmaker 2 A250", + "inherits": "snapmaker2", + "metadata": { + "visible": true, + "manufacturer": "Snapmaker", + "file_formats": "text/x-gcode", + "machine_extruder_trains": { + "0": "snapmaker_extruder_0" + }, + "quality_definition": "snapmaker2" + }, + "overrides": { + "machine_name": { + "default_value": "Snapmaker A250" + }, + "machine_width": { + "default_value": 230 + }, + "machine_depth": { + "default_value": 250 + }, + "machine_height": { + "default_value": 235 + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [-67, 22], + [-67, -25], + [25.5, 22], + [25.5, -25] + ] + }, + "gantry_height": { + "value": 27 + } + } +} diff --git a/resources/definitions/snapmaker2_A350.def.json b/resources/definitions/snapmaker2_A350.def.json new file mode 100644 index 0000000000..944e9ebc3b --- /dev/null +++ b/resources/definitions/snapmaker2_A350.def.json @@ -0,0 +1,39 @@ +{ + "version": 2, + "name": "Snapmaker 2 A350", + "inherits": "snapmaker2", + "metadata": { + "visible": true, + "manufacturer": "Snapmaker", + "file_formats": "text/x-gcode", + "machine_extruder_trains": { + "0": "snapmaker_extruder_0" + }, + "quality_definition": "snapmaker2" + }, + "overrides": { + "machine_name": { + "default_value": "Snapmaker A350" + }, + "machine_width": { + "default_value": 320 + }, + "machine_depth": { + "default_value": 350 + }, + "machine_height": { + "default_value": 330 + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [-67, 22], + [-67, -25], + [25.5, 22], + [25.5, -25] + ] + }, + "gantry_height": { + "value": 27 + } + } +} diff --git a/resources/extruders/snapmaker_extruder_0.def.json b/resources/extruders/snapmaker_extruder_0.def.json new file mode 100644 index 0000000000..c9b69703a7 --- /dev/null +++ b/resources/extruders/snapmaker_extruder_0.def.json @@ -0,0 +1,20 @@ +{ + "name": "Extruder 1", + "version": 2, + "inherits": "fdmextruder", + "metadata": { + "machine": "snapmaker2", + "position": "0" + }, + "overrides": { + "extruder_nr": { + "default_value": 0 + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + } + } +} diff --git a/resources/quality/snapmaker2/snapmaker2_fast.inst.cfg b/resources/quality/snapmaker2/snapmaker2_fast.inst.cfg new file mode 100644 index 0000000000..a2249ac1cb --- /dev/null +++ b/resources/quality/snapmaker2/snapmaker2_fast.inst.cfg @@ -0,0 +1,66 @@ +[general] +version = 4 +name = Fast +definition = snapmaker2 + +[metadata] +setting_version = 16 +type = quality +quality_type = fast +weight = -2 +global_quality = True + +[values] +layer_height = 0.24 +layer_height_0 = 0.2 +initial_layer_line_width_factor = 100 + +wall_thickness = 0.8 +wall_line_count = 2 +top_thickness = 0.8 +top_layers = 4 +bottom_thickness = 0.8 +bottom_layers = 4 +outer_inset_first = False +skin_outline_count = 0 + +; infill_line_distance = 8 +infill_sparse_density = 15 +infill_sparse_thickness = 0.24 +skin_preshrink = 0.8 +top_skin_preshrink = 0.8 +bottom_skin_preshrink = 0.8 +expand_skins_expand_distance = 0.8 +top_skin_expand_distance = 0.8 +bottom_skin_expand_distance = 0.8 + +speed_travel = 80 +speed_topbottom = 30 +speed_wall_x = 25 +speed_wall_0 = 20 +speed_wall = 40 +speed_infill = 60 +speed_print = 60 +speed_print_layer_0 = 18 +speed_travel_layer_0 = 24 +skirt_brim_speed = 18 + +retraction_hop = 1 +retraction_hop_enabled = False + +magic_spiralize = False +magic_mesh_surface_mode = normal + +adhesion_type = skirt +skirt_line_count = 1 +brim_width = 8 +brim_line_count = 20 +raft_margin = 15 + +support_enable = False +support_type = everywhere +support_pattern = zigzag +support_angle = 50 +support_infill_rate = 15 +support_line_distance = 2.66 +support_initial_layer_line_distance = 2.66 \ No newline at end of file diff --git a/resources/quality/snapmaker2/snapmaker2_high.inst.cfg b/resources/quality/snapmaker2/snapmaker2_high.inst.cfg new file mode 100644 index 0000000000..7dc84e0378 --- /dev/null +++ b/resources/quality/snapmaker2/snapmaker2_high.inst.cfg @@ -0,0 +1,65 @@ +[general] +version = 4 +name = High +definition = snapmaker2 + +[metadata] +setting_version = 16 +type = quality +quality_type = high +weight = 1 +global_quality = True + +[values] +layer_height = 0.08 +layer_height_0 = 0.15 +initial_layer_line_width_factor = 100 + +wall_thickness = 1.2 +wall_line_count = 3 +top_thickness = 0.8 +top_layers = 10 +bottom_thickness = 0.8 +bottom_layers = 10 +outer_inset_first = False +skin_outline_count = 1 + +; infill_line_distance = 8 +infill_sparse_density = 15 +infill_sparse_thickness = 0.08 +skin_preshrink = 1.2 +top_skin_preshrink = 1.2 +bottom_skin_preshrink = 1.2 +expand_skins_expand_distance = 1.2 +top_skin_expand_distance = 1.2 +bottom_skin_expand_distance = 1.2 + +speed_travel = 60 +speed_topbottom = 20 +speed_wall_x = 15 +speed_wall_0 = 10 +speed_wall = 30 +speed_infill = 40 +speed_print = 40 +speed_print_layer_0 = 18 +speed_travel_layer_0 = 24 +skirt_brim_speed = 18 + +retraction_hop = 1 +retraction_hop_enabled = False + +magic_spiralize = False +magic_mesh_surface_mode = normal + +adhesion_type = skirt +skirt_line_count = 1 +brim_width = 8 +brim_line_count = 20 +raft_margin = 15 + +support_enable = False +support_type = everywhere +support_pattern = zigzag +support_angle = 50 +support_infill_rate = 15 +support_line_distance = 2.66 diff --git a/resources/quality/snapmaker2/snapmaker2_normal.inst.cfg b/resources/quality/snapmaker2/snapmaker2_normal.inst.cfg new file mode 100644 index 0000000000..5680725817 --- /dev/null +++ b/resources/quality/snapmaker2/snapmaker2_normal.inst.cfg @@ -0,0 +1,66 @@ +[general] +version = 4 +name = Normal +definition = snapmaker2 + +[metadata] +setting_version = 16 +type = quality +quality_type = normal +weight = 0 +global_quality = True + +[values] +layer_height = 0.16 +layer_height_0 = 0.2 +initial_layer_line_width_factor = 100 + +wall_thickness = 1.2 +wall_line_count = 3 +top_thickness = 0.8 +top_layers = 5 +bottom_thickness = 0.8 +bottom_layers = 5 +outer_inset_first = False +skin_outline_count = 0 + +; infill_line_distance = 8 +infill_sparse_density = 15 +infill_sparse_thickness = 0.16 +skin_preshrink = 1.2 +top_skin_preshrink = 1.2 +bottom_skin_preshrink = 1.2 +expand_skins_expand_distance = 1.2 +top_skin_expand_distance = 1.2 +bottom_skin_expand_distance = 1.2 + +speed_travel = 70 +speed_topbottom = 25 +speed_wall_x = 20 +speed_wall_0 = 15 +speed_wall = 30 +speed_infill = 50 +speed_print = 50 +speed_print_layer_0 = 18 +speed_travel_layer_0 = 24 +skirt_brim_speed = 18 + +retraction_hop = 1 +retraction_hop_enabled = False + +magic_spiralize = False +magic_mesh_surface_mode = normal + +adhesion_type = skirt +skirt_line_count = 1 +brim_width = 8 +brim_line_count = 20 +raft_margin = 15 + +support_enable = False +support_type = everywhere +support_pattern = zigzag +support_angle = 50 +support_infill_rate = 15 +support_line_distance = 2.66 +support_initial_layer_line_distance = 2.66 \ No newline at end of file From f1e152955c716977cdd6554f79b17b279cb6aaf7 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 18 Jan 2021 18:00:05 +0100 Subject: [PATCH 065/128] Correct the Menu title CURA-7865 --- resources/qml/Menus/SaveProjectMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/SaveProjectMenu.qml b/resources/qml/Menus/SaveProjectMenu.qml index f855af5120..35c511344b 100644 --- a/resources/qml/Menus/SaveProjectMenu.qml +++ b/resources/qml/Menus/SaveProjectMenu.qml @@ -12,7 +12,7 @@ import "../Dialogs" Menu { id: saveProjectMenu - title: catalog.i18nc("@title:menu menubar:file", "Save project...") + title: catalog.i18nc("@title:menu menubar:file", "Save Project...") property alias model: projectOutputDevices.model Instantiator From 0a7dc34a9c5dde1f71f1fb3977b444ea4de745e4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 18 Jan 2021 18:52:01 +0100 Subject: [PATCH 066/128] Update start g-code for BIBO2 Dual This is a correction supplied by braden0202 in the issue thread #8977. --- resources/definitions/bibo2_dual.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/bibo2_dual.def.json b/resources/definitions/bibo2_dual.def.json index b9b1164e9d..8c6dc4ec76 100644 --- a/resources/definitions/bibo2_dual.def.json +++ b/resources/definitions/bibo2_dual.def.json @@ -71,7 +71,7 @@ "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z2.0 F400 ;move the platform down 15mm\nT0\nG92 E0\nG28\nG1 Y0 F1200 E0\nG92 E0\nM117 BIBO Printing..." + "default_value": "M104 T0 165\nM104 T1 165\nM109 T{initial_extruder_nr} S{material_print_temperature_layer_0, initial_extruder_nr}\nG21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z2.0 F400 ;move the platform down 2mm\nT0\nG92 E0\nG28\nG1 Y0 F1200 E0\nG92 E0\nT{initial_extruder_nr}\nM117 BIBO Printing..." }, "machine_end_gcode": { "default_value": ";End GCode\nM104 T0 S0 ;extruder heater off\nM104 T1 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91\nG1 Z1 F100 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-2 X-20 Y-20 F300 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" From 640e038ce71bb4d4f637891941b324c73c4f1bf7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Jan 2021 11:05:55 +0100 Subject: [PATCH 067/128] Catch OSError when authorizing connection Fixes Sentry issue CURA-1GW. --- cura/OAuth2/AuthorizationHelpers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index f7fe6958a1..2534cdb808 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -69,7 +69,9 @@ class AuthorizationHelpers: try: return self.parseTokenResponse(requests.post(self._token_url, data = data)) # type: ignore except requests.exceptions.ConnectionError: - return AuthenticationResponse(success=False, err_message="Unable to connect to remote server") + return AuthenticationResponse(success = False, err_message = "Unable to connect to remote server") + except OSError as e: + return AuthenticationResponse(success = False, err_message = "Operating system is unable to set up a secure connection: {err}".format(err = str(e))) @staticmethod def parseTokenResponse(token_response: requests.models.Response) -> "AuthenticationResponse": From 1b8463ba30f76154d80811e44d931b2160ae2d44 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Jan 2021 14:09:46 +0100 Subject: [PATCH 068/128] Catch TypeError when parsing setting version Someone had a list in the setting version, which then crashed Cura. --- cura/Settings/CuraContainerRegistry.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 24b7436bad..00a0eedbf0 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -400,7 +400,9 @@ class CuraContainerRegistry(ContainerRegistry): try: if int(metadata["setting_version"]) != cura.CuraApplication.CuraApplication.SettingVersion: return False - except ValueError: #Not parsable as int. + except ValueError: # Not parsable as int. + return False + except TypeError: # Expecting string input here, not e.g. list or anything. return False return True From a9c8c634420c05c980d090127d49d2609f9eb51c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Jan 2021 14:49:47 +0100 Subject: [PATCH 069/128] Catch environment errors removing temporary package files Could be removed or not having access rights. Fixes Sentry issue CURA-1K6. --- plugins/Toolbox/src/CloudSync/SyncOrchestrator.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/Toolbox/src/CloudSync/SyncOrchestrator.py b/plugins/Toolbox/src/CloudSync/SyncOrchestrator.py index 5693b82ded..a85c13f639 100644 --- a/plugins/Toolbox/src/CloudSync/SyncOrchestrator.py +++ b/plugins/Toolbox/src/CloudSync/SyncOrchestrator.py @@ -1,3 +1,6 @@ +# Copyright (c) 2021 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + import os from typing import List, Dict, Any, cast @@ -96,7 +99,10 @@ class SyncOrchestrator(Extension): else: self._cloud_api.unsubscribe(item["package_id"]) # delete temp file - os.remove(item["package_path"]) + try: + os.remove(item["package_path"]) + except EnvironmentError as e: # File was already removed, no access rights, etc. + Logger.error("Can't delete temporary package file: {err}".format(err = str(e))) if has_changes: self._restart_presenter.present() From 4380cdbd86df87f547e0ba6acfbd0491d8d5eb0b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Jan 2021 16:31:31 +0100 Subject: [PATCH 070/128] Don't crash on malformed JSON structures JSON dictionaries need to have a certain structure such as strings as keys. If that's not correct it gives a TypeError. Don't crash on those; give a similar error message as when the values in the JSON are invalid. --- cura/OAuth2/AuthorizationService.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 9a5c81ae55..a96b05be5f 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019 Ultimaker B.V. +# Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import json @@ -241,7 +241,7 @@ class AuthorizationService: self._unable_to_get_data_message = Message(i18n_catalog.i18nc("@info", "Unable to reach the Ultimaker account server."), title = i18n_catalog.i18nc("@info:title", "Warning")) self._unable_to_get_data_message.show() - except ValueError: + except (ValueError, TypeError): Logger.logException("w", "Could not load auth data from preferences") def _storeAuthData(self, auth_data: Optional[AuthenticationResponse] = None) -> None: From b7e613a271c6294c91c1bcb861487aeee878ad72 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 19 Jan 2021 21:39:16 +0100 Subject: [PATCH 071/128] Remove file_type argument from the saveWorkspaceDialog Because we also want to export ufp files, which are not workspace files. CURA-7865 --- resources/qml/Menus/SaveProjectMenu.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/Menus/SaveProjectMenu.qml b/resources/qml/Menus/SaveProjectMenu.qml index 35c511344b..100e6f2ea4 100644 --- a/resources/qml/Menus/SaveProjectMenu.qml +++ b/resources/qml/Menus/SaveProjectMenu.qml @@ -23,7 +23,7 @@ Menu text: model.name onTriggered: { - var args = { "file_type": "workspace" }; + var args = {}; if (UM.Preferences.getValue("cura/dialog_on_project_save")) { saveWorkspaceDialog.deviceId = model.id @@ -35,8 +35,8 @@ Menu UM.OutputDeviceManager.requestWriteToDevice(model.id, PrintInformation.jobName, args) } } - // Unassign the shortcuts when the submenu is invisible (i.e. when there is only one file provider) to avoid ambiguous shortcuts. - // When there is a signle file provider, the openAction is assigned with the Ctrl+O shortcut instead. + // Unassign the shortcuts when the submenu is invisible (i.e. when there is only one project output device) to avoid ambiguous shortcuts. + // When there is only the LocalFileOutputDevice, the Ctrl+S shortcut is assigned to the saveWorkspaceMenu MenuItem shortcut: saveProjectMenu.visible ? model.shortcut : "" } onObjectAdded: saveProjectMenu.insertItem(index, object) From a72a58cca194c605d8894ba7f04cebeb359da991 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 20 Jan 2021 11:23:48 +0100 Subject: [PATCH 072/128] Comment out the generation of the snapshot While generating UFP files from outside the main thread, the snapshot generation crashes Cura due to the OpenGL context. To avoid that, for the time being, we comment out the generation of the snapshot. CURA-7865 --- plugins/UFPWriter/UFPWriter.py | 36 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 6179872b2d..08c2f3252f 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -72,24 +72,24 @@ class UFPWriter(MeshWriter): gcode.write(gcode_textio.getvalue().encode("UTF-8")) archive.addRelation(virtual_path = "/3D/model.gcode", relation_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") - self._createSnapshot() - - # Store the thumbnail. - if self._snapshot: - archive.addContentType(extension = "png", mime_type = "image/png") - thumbnail = archive.getStream("/Metadata/thumbnail.png") - - thumbnail_buffer = QBuffer() - thumbnail_buffer.open(QBuffer.ReadWrite) - thumbnail_image = self._snapshot - thumbnail_image.save(thumbnail_buffer, "PNG") - - thumbnail.write(thumbnail_buffer.data()) - archive.addRelation(virtual_path = "/Metadata/thumbnail.png", - relation_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail", - origin = "/3D/model.gcode") - else: - Logger.log("d", "Thumbnail not created, cannot save it") + # self._createSnapshot() + # + # # Store the thumbnail. + # if self._snapshot: + # archive.addContentType(extension = "png", mime_type = "image/png") + # thumbnail = archive.getStream("/Metadata/thumbnail.png") + # + # thumbnail_buffer = QBuffer() + # thumbnail_buffer.open(QBuffer.ReadWrite) + # thumbnail_image = self._snapshot + # thumbnail_image.save(thumbnail_buffer, "PNG") + # + # thumbnail.write(thumbnail_buffer.data()) + # archive.addRelation(virtual_path = "/Metadata/thumbnail.png", + # relation_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail", + # origin = "/3D/model.gcode") + # else: + # Logger.log("d", "Thumbnail not created, cannot save it") # Store the material. application = CuraApplication.getInstance() From 32df06c2801c78cd8375f45a975625805bb7da41 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 20 Jan 2021 12:51:13 +0100 Subject: [PATCH 073/128] Add TODO comment to explain the commenting out of the snapshot CURA-7865 --- plugins/UFPWriter/UFPWriter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 08c2f3252f..af208209e4 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -72,6 +72,7 @@ class UFPWriter(MeshWriter): gcode.write(gcode_textio.getvalue().encode("UTF-8")) archive.addRelation(virtual_path = "/3D/model.gcode", relation_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") + # TODO temporarily commented out, as is causes a crash whenever the UFPWriter is called outside of the main thread # self._createSnapshot() # # # Store the thumbnail. From cdedb56a9ae6db5479dc060b9254a0307b69ab55 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Wed, 20 Jan 2021 21:13:36 +0100 Subject: [PATCH 074/128] Restore arguments in the SaveProjectMenu Or else the LocalFileOutputDevice will output a mesh 3mf file and not a Cura 3mf project when being called from the 'File -> Save Project -> To Disk' submenu item. CURA-7865 --- resources/qml/Menus/SaveProjectMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/SaveProjectMenu.qml b/resources/qml/Menus/SaveProjectMenu.qml index 100e6f2ea4..dd17324e58 100644 --- a/resources/qml/Menus/SaveProjectMenu.qml +++ b/resources/qml/Menus/SaveProjectMenu.qml @@ -23,7 +23,7 @@ Menu text: model.name onTriggered: { - var args = {}; + var args = { "filter_by_machine": false, "file_type": "workspace", "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml" }; if (UM.Preferences.getValue("cura/dialog_on_project_save")) { saveWorkspaceDialog.deviceId = model.id From 10331333556804dd287862dd179a9683fca732b6 Mon Sep 17 00:00:00 2001 From: bas <38720940+BasF0@users.noreply.github.com> Date: Wed, 20 Jan 2021 20:21:08 +0100 Subject: [PATCH 075/128] undo irrelevant change --- resources/themes/cura-light/theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 7b208fc379..e51a5f88dc 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -388,7 +388,7 @@ "layerview_move_retraction": [128, 127, 255, 255], "layerview_support_interface": [63, 127, 255, 127], "layerview_prime_tower": [0, 255, 255, 255], - "layerview_nozzle": [181, 166, 66, 50], + "layerview_nozzle": [224, 192, 16, 64], "layerview_starts": [255, 255, 255, 255], "tab_status_connected": [50, 130, 255, 255], From 46933693a7f2637bb436327395265a1ebd696fd7 Mon Sep 17 00:00:00 2001 From: bas <38720940+BasF0@users.noreply.github.com> Date: Wed, 20 Jan 2021 20:55:25 +0100 Subject: [PATCH 076/128] removed hardcoded 0: now using LayerPolygon.MoveCombingType --- plugins/SimulationView/SimulationPass.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index 015b31175e..cbe75cc548 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -15,7 +15,7 @@ from UM.View.RenderBatch import RenderBatch from UM.View.GL.OpenGL import OpenGL from cura.Settings.ExtruderManager import ExtruderManager - +from cura.LayerPolygon import LayerPolygon import os.path import numpy @@ -167,8 +167,9 @@ class SimulationPass(RenderPass): self._current_shader = self._layer_shader self._switching_layers = True - # The first line does not have a previous line: add a zero in front - prev_line_types = numpy.concatenate([numpy.asarray([0], dtype=numpy.float32), layer_data._attributes["line_types"]["value"]]) + # The first line does not have a previous line: add a MoveCombingType in front for start detection + # this way the first start of the layer can also be drawn + prev_line_types = numpy.concatenate([numpy.asarray([LayerPolygon.MoveCombingType], dtype = numpy.float32), layer_data._attributes["line_types"]["value"]]) # Remove the last element prev_line_types = prev_line_types[0:layer_data._attributes["line_types"]["value"].size] layer_data._attributes["prev_line_types"] = {'opengl_type': 'float', 'value': prev_line_types, 'opengl_name': 'a_prev_line_type'} From 4fc0612806bf361c7e85bb43db87577feb71caf9 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 20 Jan 2021 20:15:33 +0100 Subject: [PATCH 077/128] Make a snapshot on slice instead of write. In some cases, UFP-writing is going to be done when the OpenGL-context is off the main window. This doesn't work. That unfortunately also goes for this commit, but it's a work in progress. --- .../CuraEngineBackend/CuraEngineBackend.py | 24 +++++++- plugins/UFPWriter/UFPWriter.py | 55 ++++++++----------- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 4b196f7b5d..7a88618a7e 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import argparse #To run the engine in debug mode if the front-end is in debug mode. @@ -9,6 +9,8 @@ import sys from time import time from typing import Any, cast, Dict, List, Optional, Set, TYPE_CHECKING +from PyQt5.QtGui import QImage + from UM.Backend.Backend import Backend, BackendState from UM.Scene.SceneNode import SceneNode from UM.Signal import Signal @@ -24,6 +26,8 @@ from UM.Tool import Tool #For typing. from cura.CuraApplication import CuraApplication from cura.Settings.ExtruderManager import ExtruderManager +from cura.Snapshot import Snapshot +from cura.Utils.Threading import call_on_qt_thread from .ProcessSlicedLayersJob import ProcessSlicedLayersJob from .StartSliceJob import StartSliceJob, StartJobResult @@ -153,6 +157,8 @@ class CuraEngineBackend(QObject, Backend): self.determineAutoSlicing() application.getPreferences().preferenceChanged.connect(self._onPreferencesChanged) + self._snapshot = None #type: Optional[QImage] + application.initializationFinished.connect(self.initialize) def initialize(self) -> None: @@ -241,9 +247,24 @@ class CuraEngineBackend(QObject, Backend): self.markSliceAll() self.slice() + @call_on_qt_thread # must be called from the main thread because of OpenGL + def _createSnapshot(self) -> None: + self._snapshot = None + Logger.log("i", "Creating thumbnail image (just before slice)...") + try: + self._snapshot = Snapshot.snapshot(width = 300, height = 300) + except: + Logger.logException("w", "Failed to create snapshot image") + self._snapshot = None # Failing to create thumbnail should not fail creation of UFP + + def getLatestSnapShot(self) -> Optional[QImage]: + return self._snapshot + def slice(self) -> None: """Perform a slice of the scene.""" + self._createSnapshot() + Logger.log("i", "Starting to slice...") self._slice_start_time = time() if not self._build_plates_to_be_sliced: @@ -331,7 +352,6 @@ class CuraEngineBackend(QObject, Backend): def _onStartSliceCompleted(self, job: StartSliceJob) -> None: """Event handler to call when the job to initiate the slicing process is - completed. When the start slice job is successfully completed, it will be happily diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index af208209e4..b7941c425f 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -7,19 +7,20 @@ from Charon.VirtualFile import VirtualFile # To open UFP files. from Charon.OpenMode import OpenMode # To indicate that we want to write to UFP files. from io import StringIO # For converting g-code to bytes. +from PyQt5.QtCore import QBuffer + from UM.Logger import Logger from UM.Mesh.MeshWriter import MeshWriter # The writer we need to implement. from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType from UM.PluginRegistry import PluginRegistry # To get the g-code writer. -from PyQt5.QtCore import QBuffer from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from cura.CuraApplication import CuraApplication -from cura.Snapshot import Snapshot from cura.Utils.Threading import call_on_qt_thread from UM.i18n import i18nCatalog +from plugins.CuraEngineBackend.CuraEngineBackend import CuraEngineBackend METADATA_OBJECTS_PATH = "metadata/objects" @@ -38,17 +39,6 @@ class UFPWriter(MeshWriter): ) ) - self._snapshot = None - - def _createSnapshot(self, *args): - # must be called from the main thread because of OpenGL - Logger.log("d", "Creating thumbnail image...") - try: - self._snapshot = Snapshot.snapshot(width = 300, height = 300) - except Exception: - Logger.logException("w", "Failed to create snapshot image") - self._snapshot = None # Failing to create thumbnail should not fail creation of UFP - # This needs to be called on the main thread (Qt thread) because the serialization of material containers can # trigger loading other containers. Because those loaded containers are QtObjects, they must be created on the # Qt thread. The File read/write operations right now are executed on separated threads because they are scheduled @@ -72,25 +62,26 @@ class UFPWriter(MeshWriter): gcode.write(gcode_textio.getvalue().encode("UTF-8")) archive.addRelation(virtual_path = "/3D/model.gcode", relation_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") - # TODO temporarily commented out, as is causes a crash whenever the UFPWriter is called outside of the main thread - # self._createSnapshot() - # - # # Store the thumbnail. - # if self._snapshot: - # archive.addContentType(extension = "png", mime_type = "image/png") - # thumbnail = archive.getStream("/Metadata/thumbnail.png") - # - # thumbnail_buffer = QBuffer() - # thumbnail_buffer.open(QBuffer.ReadWrite) - # thumbnail_image = self._snapshot - # thumbnail_image.save(thumbnail_buffer, "PNG") - # - # thumbnail.write(thumbnail_buffer.data()) - # archive.addRelation(virtual_path = "/Metadata/thumbnail.png", - # relation_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail", - # origin = "/3D/model.gcode") - # else: - # Logger.log("d", "Thumbnail not created, cannot save it") + snapshot = None + backend = CuraApplication.getInstance().getBackend() + if isinstance(backend, CuraEngineBackend): + snapshot = backend.getLatestSnapshot() + + # Store the thumbnail. + if snapshot: + archive.addContentType(extension = "png", mime_type = "image/png") + thumbnail = archive.getStream("/Metadata/thumbnail.png") + + thumbnail_buffer = QBuffer() + thumbnail_buffer.open(QBuffer.ReadWrite) + snapshot.save(thumbnail_buffer, "PNG") + + thumbnail.write(thumbnail_buffer.data()) + archive.addRelation(virtual_path = "/Metadata/thumbnail.png", + relation_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail", + origin = "/3D/model.gcode") + else: + Logger.log("w", "Thumbnail not created, cannot save it") # Store the material. application = CuraApplication.getInstance() From f4ef3b44e386238781cd0705edd9124d3eac5183 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 21 Jan 2021 08:55:45 +0100 Subject: [PATCH 078/128] Properly retrieve snapshot (now made on slice). Circumvents the snapshot/thumbnail not working when the focus is not on the main window, even if the thread is main. This was an issue when writing a file to Digital Factory becasue that workflow uses a modal window. Thanks for the idea Jelle! --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- plugins/UFPWriter/UFPWriter.py | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 7a88618a7e..eed9d56741 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -257,7 +257,7 @@ class CuraEngineBackend(QObject, Backend): Logger.logException("w", "Failed to create snapshot image") self._snapshot = None # Failing to create thumbnail should not fail creation of UFP - def getLatestSnapShot(self) -> Optional[QImage]: + def getLatestSnapshot(self) -> Optional[QImage]: return self._snapshot def slice(self) -> None: diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index b7941c425f..fe4d39059c 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -62,12 +62,9 @@ class UFPWriter(MeshWriter): gcode.write(gcode_textio.getvalue().encode("UTF-8")) archive.addRelation(virtual_path = "/3D/model.gcode", relation_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") - snapshot = None + # Attempt to store the thumbnail, if any: backend = CuraApplication.getInstance().getBackend() - if isinstance(backend, CuraEngineBackend): - snapshot = backend.getLatestSnapshot() - - # Store the thumbnail. + snapshot = None if getattr(backend, "getLatestSnapshot", None) is None else backend.getLatestSnapshot() if snapshot: archive.addContentType(extension = "png", mime_type = "image/png") thumbnail = archive.getStream("/Metadata/thumbnail.png") From 9144f38814b6534268b91003cd8b206a7087d289 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 21 Jan 2021 09:04:39 +0100 Subject: [PATCH 079/128] Fix wrong import. --- plugins/UFPWriter/UFPWriter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index fe4d39059c..f9b86be651 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020 Ultimaker B.V. +# Copyright (c) 2021 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from typing import cast, List, Dict @@ -20,7 +20,6 @@ from cura.CuraApplication import CuraApplication from cura.Utils.Threading import call_on_qt_thread from UM.i18n import i18nCatalog -from plugins.CuraEngineBackend.CuraEngineBackend import CuraEngineBackend METADATA_OBJECTS_PATH = "metadata/objects" From c55d4f7532f7edd424328c3793d9d0ba1f01affa Mon Sep 17 00:00:00 2001 From: Opus Date: Thu, 21 Jan 2021 21:43:54 +1300 Subject: [PATCH 080/128] Option for area check when using make overhang printable. Keeps recesses in the base of the model that are smaller than the given size --- .vs/slnx.sqlite | Bin 0 -> 1089536 bytes resources/definitions/fdmprinter.def.json | 12 ++++++++++++ 2 files changed, 12 insertions(+) create mode 100644 .vs/slnx.sqlite diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..88d80cf3ed9c83069383f612a365f2fb429adb7b GIT binary patch literal 1089536 zcmeFad0xBYDur_i5n&sRksAMB#UhHtPzOIQXu* zmRLkt+tAq-inmrN(Uw?CswEx^u#d5(nwD0jHWH}qO~_KYu)1PVby4m7s_Ns5mi;O} zmYWSlMfLN0N-r;(uq-#w<;7k7O}c_gh-78&k(?iFQ+kh@`M*T1+vP7t2*s8cRo2g& zhv}SOUs=&mUA(2AQCHw_@Mkupf}vI=KiT=;O=?sYRm_@K-AlU7h6$*XqMlZ@k>#M< zMb)#b7Zxp8SX)=IaB0!p>ZL^$jf?7Q=YzL()$~6`QNRJbZXMJ72&Xw zOtyqtS}`3NmF0`&m98FgIm*Fu-_V&%DQy|`;= zl_HW;41RM7NmtVBM5POMPJvAeW{PW?_?5MJQD-|eb?N3N9Ynf{Eox~~lBr-@`|=_z z;)`nQpgDv_2g}|hy{=$NF~8ABWiK5p`WHYWO|Xc`YPL4cuRX3Y({-d}GLABZD{Z4D z3p$B3!y=s5USw<+D~TjjtR9W`MqZ~YC@$tVO{Y?r_KbO-`%Rx)0&^|1%3sFI7xo&U8pO}osb_18GY94nJ_1=Wspj#2%|YU%Q@u`|_o- zeaPfwz7Tf!z4fn?p=Y89ud5~~&H!@FA#b=U%fi<*kYd5em|9SJISsdQ7LwmmiV3#)5q&!>?O)czwD zjqY|fdytc_!6S4||HFP9DpOq06}X1+U4?9js-#jav8Jrj)W8@qxA>`SmRzRPsa8j- z9>ohZQo*E2{8B1v$yG4sQ36S2RfiITQBdwzA*Z0_Sx$&S{hkaii@WCVx`JWD_>E2E zry2njG&z1OOUJIe`&F6$dqs0`u(boqT6bed1J6d7*7P%)!4&noIqN6ZN2~|nL*HMY z2KqG6r-42V^l6|^1AQ9!f2D!*jG~sCws$3thHJYQQybVSP133UIS})VZo8l>QeNiw zIznD=nZpHN9HEGh#3SXNP^seegdHw_dAU~!mpMv9t_TwfhCM;_6NG$a<-usF!xakp z-KC{v4!_e6PSB@dxw|Y^$nA5MmPW$vET76FzEGY}soUoYxpIPwM)HLq!sQVNw>wT4 z$6TL0iV}8~x*4^Tm}j#izq%vX?ZZ{EO+@G zA%7^Os=%+f)i{OALJH`kG+5^M`^uw^sNY)(K9zy){bgm2@={+2Vp-~OJKYYyACv^@ zca#OooocoOgI@G0Sneys%m_RDK_%jj_{tq_Hz?cdf(!};%N2(=>hhPl%3X>F;_DB2 zAVVV_N13P8?eMz&5eG!q>+pNsQMclD`${1<{L%7oxyS2qM7(9-UIC#{R4H>rOUs;o zmp2lQcoavO)93N~K*f<#mluMI`oO1hj{~CPi7KTYB?$T`iW7WKIx?4YL{va;Og@RdhE z1yEWYkWWrWRPlQi#ZAS)5pssTUN__qXfKMv1s%a?l=2QV9*jDjrI1l>r4%wN;wV-8 zYPJMDrR8b{hde=-Q*i*4ddnb3l@OEyuNR_I7J+Pux?H8@VPC{w>hd^3KF|^rFGp#_ z1uBR-A@4%YAe2mR82-wAZph%Ux7_7+20;Z1=z&$KFywMhy$hGR%SuU4{vgD@JX{L( z4)o^^DN%@9q%0KmJHnx;x6J2-d`#cVJ)K^v-iiV<2zuyrFl{r124M-i9rwEk8 zP+1Vd^p}2@R9a1wx7v^eCY5?l^^@ z^5w=U8ipF>DhEA7Al{HS42_uA=Wvz!BJNN)S{f~NITWWeRO&`$W_&6SL00GZq&WRb z*z18tEaZo3?)CVg20}U_!E$fdrIac`$OxqrROxj>Tcfz0AOr=uyc8-zS*bVTb9?vO)?mX|3ZXe&a|a%_4OD6G(ALA`T2-A-q?JXl)l zh`K$IkS_%FJp$#8l_$S59h}u2pSAG)E1WqGQjPImK*9CG*OOdnJ*mnyQqm)%Tsv}G?t_BC{)sD6oT_P zp^bq!MIF!|L7Z|T9)&i+2Mtnp-i6A_JUKoM5=3r_mHI(g#Kd23D&rlolxw_3#`O{V6De>X_UuSLO ztY2H-u|93xW4+ya27K-N>(fA=2KqG6r-42V^l6|^1AQ9k(?FjF`ZUm|fj$lNY2bgV zfdZZ2;k!3jEL5Tj?BED18oMMEXIWGQQ$gK8QE+HTIBR2~`079{(D_?t4Xf<}_>kV; z#5QLc2WrwjWbLgPFx1Ek!+3QQf`}XZMeB8(^)2fY*6XZa{7;kC=dMo!eH!S~K%WNs zG|;DkJ`MC~picvR8tBtNp9cCg(5Hd_?;02;OyiHR6;2!|OyPTM4G;zh4nBWlfTo`? zUe4JBfM@e(SvoL+4_SY-erx^0`l$}!N)>o|0S)YVc0ry+)wBBqzV7ZGSeIHGtaaAe)(Y!1tIs;cT5KI-9bql7+N?&a*7CFE2g}!% zzgrGlKD4}TdCl^Y&hvi($R!f)V6ibKxD7{|yq3(9w z4&8cPL^n%!l+G%BDZMK_EL|s^BehG7(o|`X_TSnMv`=WS)1Iq6LF>~F5dSH@B|a+d z6E})Mai%z0_)&OActF@IY!;Ra(}j_mpEVz7p3v;moT91F*!aKjPw;#A7Jeo_>=$xo z%&8LR<7H`fYdjQeg|o}ymC3qzL}@K)?`+k-@z9@N`u2yb$Dbl`(@{u)v!gBHI@o@Z zXbHCV6r8e7;_5)KrX`U~foF+S9h@|6i76FfJkZ+H!GunUn}H63tK$hcvvOpwi`Giq z6p*Z5n@V)RLFS%*6|a%F3XrI3NrvOAVbLkFAkh+osP+^sSuJsMb3`j!;~htqFYA!F z0LWK%BvbJ=I;x!NgoUUmoNr22CF1Q>@innJCDzeHb)!-e=K`0rI$ByI3tB;QJw(PP zCC-l`!Q?Nbe`rGD#(-2HfQRt|0mz?Y()lxDmBbZ;-Qpl*ODu(F26L?2bFAk>_U2f} znYEg%eCv@hiJJtTtJbp<@s9Rv=i}NWuDsj6vN;%QQj$Hy2DVDv5MD1)@{^gUk6g)o zPiK67=!GjJ&H=us?R)q;qJ_m?Eok}f$2GIqsn*qrL_AU1tb|u8iR?rSZ<4t25KJwU zmsl#_lfo#AL}fgd3PNd4EJ`RjDlAm;1oC|t8tIXHQ_{It6lNuR7Sz3t_GDc!7Hp!} zWh4fNB(4x*$0Q)$8JnTO9{xJg{tiExrKzDg*sfG062VSznXxSluqe-m6TI#!w1#ZU z78r99YZ+9l`p^m`oJt-W4`mCvmP_1m5VKsNiq_Wd@}BQx$cYj+s@qAnZ$p>$NX_x- z)C@g=*{N%~NpRO~x3q`5NojY3k4N3#VAIaZBoI>KSxrIu|qbWxA^7}D_>+Q96NUl{CM5KLld8M^@sC9VMC+L&r- zO)~aB8xM~-4of(&t#Al32nCngD%E<~pKJ>x&W6^t8EQm5bFnCxT*-=48R!L~nrUo2}+=7I%xSX38v!M zN@a3k;7pcr^%WhdX15w~a6E%KuIqpj(%#ycQ&lsL3yxtKq_%`=*pRn{)6-3CR#%-J z?8u{88$B=BsU#M}TRWTLv26RX(^&Xqk3Z{FDdBjJ$d8`Ns#`{inh0v>GI1PME^*_a zN@irTgDEJ(1gMtT7DN54;8u1df{US;WZM;$vVu!??DRiam$bw(VUG2&*rUV(Xo8`L zbvMBosZm~*`zTe>-rm~6uIR`PYJ`X7K8djLPPX+(H`8KeBA9HR6O2V#bJIS`rG@|p za3PEs)OBo=vb`ALWFe5|7URVqIaP4b6p0%KGI1YT!t?{BCf*QSo#SS(gEfz= z0f$1HaW!r-t5aF2ty5A#*n1nyj+1?o#Px?jD;B8j50t1$6D6)1a;hyJ34}T@rIA28 zQ*AP^B1wtTr5nVN#j0LFvx}fJN|uDNmCM*4H9_L0VKa^S)7sJ05~Jp)wKY#};CQSY zvJ`G9>1=BqoA!RxQB18-*gf2lPyz`&6rD_!v_(dxMTU=K9c8Ga$&panV!JsqtMWb2St8Hj#tPU)yu3LZ?20_Rfi4mhP zL!ooZk;qv0FM_6%(@QB-3x)cxg37`|@RgH^bhN}AkvI)zlFjL84IBx@09+-*iI(QHTI zi@}4S9R-W_PE-uk<(9O~z=163?Nm-!NI!fzec%A3q2;Kpte)Rcot7TbpQZU&B?irP z5(o2XtNwPT`Ia!`Dv{ug-6p|(ae4_fkl_aRV{xgXT*&qUCSAWfPzUC{*QUU{>sq}2 z?T%}Zx%ui-z`W_|abVtX)j}{2T)7I&Ypxs(=9O2R1m^xL@bhJtN5I^3`B7l*+#d(? zqW$RVf_*1~xqY7z%yTZA4d$7b*}y#G(z#%6x>NwOYp)y34SND$p1P+1%u{xw?b=-! zpN?HcU?z920CUw&l#E{z0<-lJ2be7vC%|mFxCqS1MN7d9UNjiYlXu|f6L+9*CtQf( z9)H0aFdHu@2Xo;C8ZZ}}kDupl$8;UL9WT?XJ~j?`tIr(@=B#tjpXujdTBe=7 z7|gP>P$#8lIl=Uv83faH<{&Ujw#@)@@>Yyn@m4LEFh_5WfmyhDIG7_h z9Si2LjVL*EqY2D`T_`gkqR|cF+}dT+;L8K1Z!9+H@6xlTsOe_oeCY6)>pEq<`6k`%a>V?Sd5v+X;Y;0_#wWGQ438Lg89I&IEk_%w z4Fly*CZ5avfQhmqc70jrTvRFWSwsCeJD(({%dq}!!^`a{xY`6r8H{?hWPX|}18-9k<>boKy(yBY1e z=My=0H;oXcYi6}VDS4X6}Z8uvtW%x3e)PG*sO6Su7imB70rF z;{zCv^oW!VG1GH-?%JV(pV=viJgaL)3Ds#UNO-iR2{eN}d&cqA=y7_2o9Fr}v`epf z)q=s@)L3SFC=3BkrS~m<1C%N%;=iCtWc;(Cy>Q3H_I=z3*$8lV8y7t z83s1Eu*B^hEO<2Yl@#`=b;mB4O#^$h*fUm`o3_ZT-!MZ zaOYuJ$gy0=20GpD&mAMw_A1gn80F6C5yl*)6_Sb59PaG=6mZdt_(q%;r=B?HYZP0i3ZLkAs>Hkn=p!3mRur5adTghj@9TPOhMW1SJW^)H~POL_rU zNkoa3-~dtlJ;?8K2+K9=f~y1VN~$Rki?3VPs(|-yU!WCdBKXmn38CL!aBro?x8JZBR6@pV=pkh`-00yNQFXXd9WCVs4Ou+;KqK#{{ zaCPVEQjjm})|c&BU7VYMMFLi7Td;Y?tn&n5jGE)29)}NM)N5-CjME~4)p3Y&U_tew z*?~Eb#Q}9)FcSk~neNY=0UVVNz)?svyRssSK_*uwTChR}+`VPK7JL8L6d|a|&G?*r z3_xVUD>I==o%+)_odZMU79AzjXO*+XHM6QQ>7=Wgj0^b_5Z#+DFj!(UCCryqV7fKd zZ!I|3{^UNv2{C1Z!rIc$z40HI%k6EH(UQXrynQO;n3(@EYYg# zCR%Z)^atUBRRt16Wh3L#+6gYs9wPWO>RHCd_ND}^mbl%ixZA6_0c>yUFBEI2@yzsF zd_wNzhGMta1jkNOO1L>t0g_RlKnEUImI+BsTRawrScdV6s8(3|3ber(Iua%nU_)=J#QXw7g6j_*KG;pcP5@&H zpFLPSSH_bNI14$`05~&6T{{2-D@%lcrlT#8^abF!cS#xLU_%GAM-;gLb;cQeSv~_N z+a?GN^xy(}nxnCc#5IE4 z3gPuGihF&~LutMPAs-5%x9}@T+gj$MI~M8oaRLZUnkX#ML|Z!{Vj(4nT}dewXl#+G zY-LhmxCX?RVWSmoO~T}O)v7?UyV2?{u;M!)cO%x;5VVtlkPAA&)=Z$n@us)9Vl4M+ z%MA@JwxF<_(w=I8C7F!U+QFNXu$+b3;mX2TJld+Pg}C+F)XD?Qb==S~EN{4d)>OiYLL8A*Q*RY5T!*ZB$Q!%(1gwG!@9G7mIsIP!V5IdI`UYg#T ziJ$ca^VQr$%>H0&G`OY(x}gqe{d%dv;(GA)VodTvSPpEXW+PG&X~rTGYoK-qx<@R9 zmsu=42RBe-Hsjx;*u%|_<6>1T3BTq+0q=CogT5wJl1fEw$ACxzlLk!~Of5q3R3O>X z)(&HXHdvo(&25+dW;ut0A6_rA?BOh74yVg=asJ71L$F}xb$ys4No-y+$<;3a(R;9t zcC@+M!+|hdUy1{qJgu1D1OF*|GmG@@>b0QX2;2_<3t!k&!kS2|Ns=v=KXL5evz+Bw z%ip*W5JF;rFbRgxN;~w4b?^%ls)fH5Ebhl%Ft59TO3Jc^+KDLi@R{gZf3l8Xxzjz& zs>0q6#!Q%*-PKxt-rCGro2~GFGdB~bC{&#x$hp|)hVjR88nXP?u?_riem7@*#`+9r zwO+yDLIU)XSeVuXW6eRRPNk3|9lh2W?WI<7hK|ROL+*4OuQ%3t)G|wj6)I`>Z`e4a z=c3q;_8gDQr?MJ=_71wzj8Y_rMl9hLr|;pQ)m8pHFty}D-I&)O{po9-1uskT!4vVMrXO*hZ@oarByuk}|8hvnrWr~gKp zuPrp~HixX|=%aeKhpkMLO4Nvi#ff6@NE>iPRxA znmaXLN+pt2^P=_}%VF&y?c@4l?X_~7`D63*me-Bn89z2YYrMs{%kqqHov}-A(w?RJ z&X~})>ORmOt9zDTV;-n`Nb{($Q#;AHSpS@6x8^kSJ=%fBTBE}_T+?FI89o<+mIn=Q z@(T@5!YuzfO|izre{R@lxk-1q?kw>eU5EILc!MEkxeWFrthIzKb+D2VvP`fH6Q&9y z3=MLvxKV$vVVa@XFx;TCh~^*U|Hz+;P4c_ClXY{=*UHa92Ow5!(sRDvXP&#bt4E6E znj_6?cX3ydHPjONIX`b|yNkPWoH$$aUuL(vxGU`97(RQ7U&CEKLM-Q5+~Aj^Tz_l0 z{li7SYMY+Prsv@`+`ew7Y0J#4vxd8Dlvt7HG-sk)!(BQ+91jxNQ{5VF?@-ahr{}cU zlieC_&r#ysjMb5*yEWWyvp9rTXNoo4E{evHr@S@X&LN_U?`6_k!(EcEu36m0q>x@G zzO%TCD1!fG>N|_uFbjKMXR;ba9R5$a9CZDxg2=G1}Js z-S`^#P~{Q>nj^Q{`7=q~r^a&0%nhV+(vZ%KfjmwP?kp4AejzfLwbYa64(5#Sn?z|P zH=szIuEAs<1*HN3{*9R+)@ky_w5x-G{4woB87HSR2a67kW>Eq!C2sDXdKG9!=-?L% zr?{Mazx-&iqqkhjn#a1Ffz?^PReBUCZI;f1U@q~BN;;!5vrU@HvWZI10f1i9ZzMRp zZ?f3f?GR`FFq&IXsZKVtM+|z6^;O;TTz^XaYW#trW`yWR-P8;e$7`S~PWl}9D@aLl zb(6-eSq?T=6o`|s_0JuySZKh~Tp}*jXjX*cfhM+DjA|LqD`;|z6WvU?GW^+qQ?}bF zvdt~+Su=1?_YB)^?0Itf&iNe{|y#fs9tu@4$Dx1F!AW5B9%Ay)cwb@AKYx5BsOSr zW|TPUs=+FeJDmjiHvQ|IWt2Dr%26}?A_uOgI>aR!O|qp4XF@m=p>a5rmN~Tx8Ui^3 zJ>B#AZL*UaNfoNsc_H}sh+kZp-RAX}HHP9XsPmiwzPX=yiu?fQpp<|o99M@00-DZP zXDHqoNWlG1nQ0B$;y-HbQp)OhAk+%O-8C(d_?ov`F$Em?Ve zf;DO=;o$!XZZSypX$)m~?zEFNe+gXMz{(6YIK9M1%^%hf+${)YB0ZxN28vgM^p3&e z6zF}}_QdWV{O59y8qTMg$PN(lQ*)o5zQVXae|5}wzVY`UH=k0)CVuIaxkU>aVM@(9 zqD+z3KdJxDIL3GyXP6Am=nap}EHMZhk}5V6Nh9q*kmn*Ly@<30Y6A zUnX|228WX+XmD{)8u*ai4fh|1!HpIxpqSH6)b4qAS$DDqig$rnieiN8DiNF^_pY83 zL2x$>wAZx6pv|T(vzb=>T~1%OmjlEV=Dpm=@#0);-Q4Yg7%i01ypq}v@aKB!tjJa! z3cyctFlTS=3{=v>P|s1pzsz@;U*k%s-sVkMLHD#kk~L#JD1T$jS5kGLXH6Gzts-sdx(7d)Pac*Vw*gm}L1g zXW0v(jv6ldG_ZIHE2z-gDXr1&PzMNqgiYcN9E$#l>pu>QRRJzGA!2nepg09%o#77n zbpTc?nu39K3bgZ332952S}hKM>{eXG`$e_IAvKY>++PgJevuKIak z8QkOHM`*BH$@~rOk7{?D#R83{9k(~~KK^JkP)75WxJq%Mb(wW6?9{)fAjob3#C|Z zeHqL057vKKzp;L9{lxkwcnk1#>&tMP-)O59_UC_Uc^&TTyA5{5pJiENiCB)a9AlXT zTTQg)ugve8pEuuczSg|Me7d>Ke1dtl*=rtUwwQi2ePVje^tkC()1{^}O{+~|(*o0U z(?nANoY?<|@jc^n#`}!d7%wz#Ft!?(8f%OmW0BEp_?O|Z;g5#L47V8e8nzia3?W0k z;b_=xKgb}+U&`;w&&v18SIZa3r^zejm0{dfA0^e^cj&>zt6&~MPM)GyIj z>Zj<3>2ZCGh zjAYUNp#50;lJ&1)24dM#15zhWk5(kOA z@R@K(cwD$y*d=TdV!~3PN|+)H6||Z!HE(O4(%i1ORI^o+&@9)?(Ref?H8TGV|33dL zoOrmL#~mi!fA%i8EJ(xi68D}U;KdrR%U8c*?}EF5hzNM1Vs#*3fxcP_3Ln^7gWq`d4F8d+!4V4tR5A0oVw-1qT zW|MH650S4k^0n`)zO{G39X>?9rjlP>KEvJx7xxhP$27U{b9)zD)kEZ~D*4`ZQF|9$ z&_m=ORPx1Zf3$bO?L0)jqLR<;IoI9=*YXhgvPvHO$A9cya3c?qFRA1s&G*^6;Qk#V zUr@=1zrMlV1sCuT`C^*9w#MEC7wr)FoJu};L!G?~Zr365`82t?$le84=@9u$n)LbX zU2u^Ok*Id*F1QMZ$VXN3;?QaKF1Y@N$j4Rk zqKOOaU2ypgk&mh5jv-U*U2x|Ok&me4u>;%eU2xkCkq@intS1`nU2w$>kq@b)Z{r|) z7hG&ZKxVU9a1_;1(Mq?^nsecS50s3v7tI zPbK?lzPES5^)*D^tCEHvYwcZdc@2^GF!GN-4gbpC1=rRPdACa5dDUWj7hGFI2nCGSX+qp!7h!O1+5yj>-C{kYHGWmd`C(&Q~C+Ph3Dd8l*zD!IXYzr9OV$(vL%VmI2m^eTCyN`|@j>|HvQyj~?kZ-SqaO5Ttr z?|_CytCH8MWbo|LTtUY91XxZU0*sN{h(soiDo(x~J$DtY4EH|<@}c#%S`R>?*E zpt0gq@+y^_-}-@lgUVg0a&?xd{WO)kLgkKq;#m87mAg#k=4d~(pQ>_~tK97K-?N{h za{IHmbt<`9foNac>w@3SXV?qZc2_q$#8RVueb<;GrLXm3}!3sr8+&h7TN z%AK!rqkr6BkEz@RY3{Y5_BNH+qsLE|)+^auL^V=1b+p2QkcWtppRPGFw z``a;B+QTZhMddzzL$QZcZnMfg|IdHfgDSU4<(@4&*M73fZB)6Z?iK6-mFrTuhb~xa zKS||ISGjxMInTCS;$SPRv_YlrUcbvuzop)~nRbEn{sbFzQs5x~~6X z+fqiIqEc6V`ZDHH>Ofsd@I1wrWO2Rch`Nqit1;QdFvDcCD?FQDK#;daS@U zi&2p@wMS#CU{pw@DnsYnW-{tzl`3m4was8uP^J9Om)VYCR6wO%cTTfSXVgh5HR0_~ zZAUX|xk`=u=O!Br3^6-SRH@;X5jGeWBDGAV%oiTA!JrVS6VlX(Cv7k!L~5x@nYwPV z!GI8{B`RgGMQkt}L~5~0>EE1WgTWwDjad{71(9lC)E|CIHP~Pvh}5DqRky|l!$73! zRO-ix*V$kYh}1ll`g+h*8w>%Fnxj%*p7yp427pLatJLS;@3z7452@K{>XqF#82lks zrBa8DYi%&}L#k4xUY$1E1_M8&Dpcy_XMHvp_8~PxrJfDf*kI6y)O3}4a^smc81f-? zv`Rg3>{1&H_>h{WQulv$$Ogkbq^72+C!e;#U=OKsmAZXkmkow`NR_G7t?w?g!9Wiw zZ<^X(YlC4PQht@X@z{Mf7~~=4Q>p9g=h|S1hm=R9CXd}}g8?2=Zj~C7`qBo&JEWY9 zdgUkAxi%QwA>~r3EB61<217ffN>u9drb}%wutREsp5`5|?4J_1!LSag$*R0k+mD;5}$p%9@q{ir&!;3GLY%rihs#x_4DHzTnHC~lEZ^bt@7|bDcl!iGxCw{XH zhH^-aQ>kqS3vDovLu#~2ZTxqQ4Tf<@6>6Eo)9$^>27@@HhO6;f|IJn#4B?O(rb?|X zzRd;$IHZQEQfmh9w88KVsX-F+YxVL&HW<7iC8-Wqm%eO+p&L>KY9wOqx7c9dhLllc z4qKYPu)(kmDU0fT^Jy>GV9kSbECagW$= zxQ3J^L-m8f8V}T9#*Fygx_&rPlV$J4Vq1tmr@k#|Yr>pD_FX1n&926W#&%AnUgOmFj)}OX0?U zyzjpO?)tBz+y0B`zW?5C`~MK``)9ZP{~qr9@9nn#Q{cY;4oizA4yWvwTb96@!d$pf zZ-%AZ;;}d^!z`mL<1GU%R*P&A%s-jGGylW&=VJbIcWHk9n$jvU!|&B%IwVFw3UDn>Da9@r~&( zruR*UOfQ)Z!urG`rh85MO$SUnP1{XdO&d&WOmR~a+g?vapEWa-wlpm2_l5d4IkpuF6d8fQx z-YRd9*T`|XNe;;M@)CK5JX`k5Q{?fmPEsISWgV=Q{H*^%e^`G=|30jl9MnIezg2%P zteouEZ`beCZ-w=fxPFbkNk2m$(9edIlzLc6@$1Ly3-pD0E3Bw|r~6s=h3>HK5Ui{m z)V&02E05@I)g937*X@KgmaV!Cx;45uth5Al^|~dx*|6T?*GF5i&dwSewMzI zUV@dEN2GhDTVWOEu=KukNZJYOFx#cAuo81X+91uA;?fc+Ak|A#q$X*GYu|@;nuFR$wD)Rn)gI99*KXDB)Na>q(8jfEv`yN8c8RuLJ6r45 z&d^SQ6`VqCf!36^#Y5uz;!EN|@e%P>@m}$OxL@2UZWp)0+Rhrd@gg8L ziA%(Kakl6eXNXh8@nWG^AX-J8@U!rp@P%+#cpp}MUJ?!pj|le)`-KC-t-?-WyRcPQ zBgBObLKD=bH?4oS{=xbeE8Gde=>&~Nb18od;U4~G!rlB$gnRiL33u@~5bor!C%lBe zj&KKmfbb&zTEdI@YX~pouO_^Jzl!jD{z}5_{1t@f@s|^x%kL*Vhu=qdHh&r6S^TAh zXYzXqxAA)jxAMCQ&)|0vZsB(lZsso`+{9l@*u`H&xRKvMcshR};c5H@gzNe92~Xj- z6Q0VSN4SnZm#~vRhj1-_HsKonEW*|NnS>quHo_FYl`zSlLAZ+FLYUw;6Sni42;=-l z!WiF0*vg+y*v4-lT*;qCxPo6#*utMmsPLx{M)-AvVZM`a3cr?cGQWm!62F?TnC~Dw zicb+v;FE;o_yplteih*uzMXIsA15s0V}v95Ho`)_m2d>Vl5i-$f^azBLO6_XCLF>y z5f0{~gay1pIEarB4&=jx1NabOe?Caqk3X5v&Ibr>{7HmXemS9qKatSHFC#SaCm_P} zC`$=H;*Tf%6TgJ;1AZ~#JA5PI`}`up_xJ|F*ZGBnZ}Z0yzR52je2cFqe3ze3_y%7` z_%c6_@DKc4!WZ~s37_L@2@mpf2%q6+6TZUN5I)9N6F$mU5kA6K5P@ryr1wMzLfAz-bZ)`?3iwUphClFr6k0-p6 zKZ@`QejMR`ek|eT{20Q${Aj{`{3ya*d=cRuzL4+|ek9?={0PDe_~C>X^1}$v=Z6xW z!w(@miyusQHeW!vl^;a7i62OK20wuC6uv*VKet1 z!Y1w~LWTP`VU+ukFv9(dFwFfx7~;Ms407KQp3MD|Fu;9FcoO#w;WF-P!sXmogiE=9 z5T3w&Nq9W>1>s`ubHYaM?}UrE&j=g1zY#9v{z`Zp_bK55?i0d#?l9qe?k|M%xIYut zaUT;N%Y8&x%l(OPF83i}4fg@z9PWL>+1z`CW!$@je(oK@QtoX+FZULqhkKLI&AmbB z;tml`;a(>!;a(%0%>9wj!M#d2iTeZLMD7*BV(w+a3EWGB~AJHofQ`w8FS?jwAQyO;0~cMstk+}(t4a(5BF&fQ7) z8g~cbAGzBJU*&Ei`~!C@;VaxNgfDY96TZaVMEC-CBjJnO4TR5e*AqU^T}Su~cYyF& z?png9xoZdya#s^R#a%`CBzGm@6WkSqzvnI|e3aWy_&B$Z@G*mAPtpoJzhOC=r=5uA`ekUIdIFlKEJbtO@o07~L38b5G}knuxq1RTg=YCU zG|R@K=^cZne>9rDQD}OK&~(FU1kXE1qUjoeX320gC&2mx&rcqT=ENarjv0(*aRHj+ z2cdb?Ks3htRI>~t!NIipedQrEHI&IG@@xSpb1L>P}X5JfS^c6 zV1acEo*%501ek+RCnGKqs^Ifqv4Ut|!hyg4kFnxX0dM%Opn{yx)Yf=^OLYD0{hGa`Alf zO(uzj3VX`~Uz$tieDQMIjE*`GoivGw<~^8`_tndtt}C3E4x8^KY`$KM+6< z@J_Zg`fa+xV}Hp5pIvs>f`H4_?LqE4Kj>91BUiO{Yh+06+H1qievALU^AnlSd7$@f76`egK(0+UeCGGi@5k zK=Q%6YV}T|yij_hWlvHbRh13`oM(K_e2_f}t*a75rc7ZWv|*uwSEMp2=t0PydU@2W z|KclLj#&XBRHh){bXiKH>=`MKoe2VC#&l`vAhSbOwRuQ(P6r!@Bkc+<sVS>Hfh(k_=8P74UZWl9*58nYgZ z?B<@3C;PL*fGh2iaB+(2BIg@OKPV3`1?eI1lq2aW+!}`~fXM{g`{jvn*ecWL1n@$n zlu`w6g~pq5zJTnta;X<&;R=`ToUMWjeBl+INIIJ!M{_A~ca=QT1MbpIBNc|6D@beN zt$5=X7KL7T@L|7P<^~@!`GGg|cC=T-B5-eHB30R{1Y>ZaP!A4V?v{^sfy?sp?9^8W z6Rn+8y3z?no#eCN`XYI{6I`dOvZ|1L!6VSJyGfoh1)Ni%rj`IMKkl5RKpra%P@bVo z=X{sl5xKYo98ed4bsugcOSOdIlH}%iB|QDtPyUtuAFnN(1foZ54cz7OQ4>L6+&Hy0$a*9#`@uAKnQnM7$YqtkU|TzsKQQ6m z#Y^R>6TsH*XZZsaq#EikTp=B7g+~&UNJGmyrB@Q%u9xSG2e;ML>AVfLhCA@y<~n#x zwk8p8TLPXe3`Sb;dafheflsY+)luM6MMb_(aCJStE>^v^9WJ(pTG{PSz76;ikr#{u zU+U`eeW`&$+6tr18Zy~Wt=SMT=VQ!3zB8FCRM^{FyyFow|4%JlU9)RTa>5 zB%wk=iG|zHj%+DAg)Q=eQ8}9GRU9s0Y*XN=pwJP#%h-dDC&}}Qz{lF!UyL1H=?G8T z^&UOd7JPHbM;C%`nO38t9UjrkPiml7R(5K>m1{x{=2M21utl- zJv0b(i{dAcI!m5BI4cg!o7st$EXnjYkdDe_1t6X73Bvd=FvU3uy#aeIs5cH=PL+=t z1TLv9#{oKJDZXY!&Vz|gdSv(rG~C?ztvq}nxKFoZ324BT1T(?*UAbrg*ro^MFzAEs zIMtj+khn`O>z@^Kwe(;F=0SsiSFa{}Z-MkJ+P@Ss$HKbRH{6rF$NxF&F`YE>eqwtsP2FMs^L8M_IrT4Vf*az7)SS~bYMGtJKcTc128YmZ=Kp@>af<-00ytybIZ_W84yXrHkNZ zWL~=i-lX7#9q@xYuelK4Dg60De9!Mc7vS?DKV2{r%pWhnIri7**MRxu_H|(XeR~O* zpPh%t>pwlOADD;Fod)K|=iptfADx4*34VBXC7AD@)e7djXW=EG@0>Xs%(u4T(>HH! z!yoit+lmj%y}FeL^OZ9^V7|NspFw(Y%Lp)^-&_yoGn-BU^WY}DWbvtuc%|d-yD$!q zcNK#9*l`+ov%+p(J{%GtS~gl%SVcGi5VqWJebl-een-E-T4K4_QV74hKW#qK{GH_k z?HuhS@q6)k_;u7LTq%?ZX3e*nzi75=YD^1F#rpf?QfrHKj^(f^Vz}KP$)Cyh^LOgb z7M>PvH$DMp2IgC482)KCnGVD6?N6IF8WYBM&8_AO%*Ptn8^0HI#^FYvd7^QSEa*Sd z9W=_ufTmHuO}EZ+(ENq@C25NAzG0%~LE&@5hq^lrFXC_R=DRGn2*cqKihcYS;@jdU zTAg*Z*iYfaNMuUa=*F40caE|H(o-3Tii z&HAC*4Wo4Okmd_H4tfFO|7}f68-edg(C_M9L z7Di~=*?YlB?hXq)cQzBQHKrv9?soi2PYq#j!rhi@dn-Ck*DvlCgHWKM%bU5I@r@y< z>9z0(7d}DF-DDHSX=c(}IBaCg-H4AL1tT!nizuOBqLOY(#V2pzN#!=~27CYs=LU5! zZpLYpIzwV(cbHRG#Nx5ews=PphrN~fa3M`ax$9XBVHpKy=G=AoQX2HQFvUp0<*Mkv z`r?`r;SQiB^&GWHXvA6~u=0Y>r`JG*9&0G_R3suugLv+xnAh6fms*_nUC3!P6j>f2g<65L}08R zhnuG>Ve}M_L1V&QmMeNGK5he|`Ep5aFUE%aOs_C;d+?tN_lxPSFyu&t(J=Mrvl1DFu^eYMOVsuO^Go*)$@NGfRSZh2_ zXFJG(O-UQz%GG3Z1AI|p+=cl1N=K|I5$|Ycs~(Vr^g3U+p3cW4=1OeOjr4i=juPvv z>ghS7`e>a3of2i7lH|_CmrWEL`op6zl`sHof>)1#Kc}bi&c-*RKv6VN$dx`TH_$Up z!Z3KnCJ~G^Dcm-zFe?28M&jJoT-h_&V{as@J`uhs4sw)53vi~Bs%L4P$_{5f_10!y9?) zM+vi!U{$5y1AviJM+h@`C}Z@@Xx31(0s6sM(|EnroAO$=KMdU_-^UT8q+|0b8T3S&?%Jq$?50&J344K;NYzG4VASpFfH z)zI)I$m{kTWyc2!Q&223MI)J5j!fG~p#o)KT1js?XI>>ql5lH|@JdWJEEOziNj1-I ztX+YsRKLbMQoz7=y>Y0@1#y_J;^Inkp-{;OVErxC*xmq{)Cx^7YslF=@r`56s)yDi>julrX$AIQI}w43iPlC#SjN8or_Tw z+5KqaBw-l~9hxENyKq&Gt@>BBBrp~Y@NinV8MU5Vglfz3T`iAU@oa)wNuqP%aA7)s zq#rGg>!Gj(CSe3b0X+@`>d`tK1^VG(J{A(Ha_#NVb5i3|m+fR8enA2J!C-E-&9PXI z(I$7@zm{aw#r`?iyg>2lZXaQEkg55za|%)o76gz@SFLQx>Kw@`tb{$5)GKpjW@SgU z0;@fxl4a#gtoF3JIYTcDB=rMeXTW_;XjTk0vT-d3qXV72FQrV?}x@$wKAn zUT`i)r9p0BD^1E~Ys6(FnX^#rHwZ&`wklkT*_N~R>njjEECIP|yIw3DM_RV^P&|8C zm33qNVL|1uq`IgfXB~dNofB1-zhpXvN+49m%ra>SCb{R@r=y49a+) z4_Kuv9wPXu5$>@tIiX0XhLjw6X>mNZ&D{d|YlcUS73#9AdtU||hlRS^kGz$?vDAz} zrl;GFyfwWs)Qse=cfn}?4SenmT;(jcV->|UL1@@nn-tOg2(n+{AP$BaDR_7UQOC;D|L0^e4!Q&T;>O@hgb)`REa0e|9utAy zjK;u1iIwBn|CYDu&5*Cat0yrkGubOHN?S_`LJ`IT|3uEHNO%gUf8&s`JrNJX3~06z zhxtpQ6CM?U!5nlyN=kPSWL{9`8SEi5_8eJK9d>Bmuv!OkIP>N?oJDl72V&D*YNq+s zt+$>5LQiK;s)Q@8)!g82wc$7&*UA+tbgVD<76!Yvh??du>gO-#}!!}t%GOWl}L}+>)!;imvFENJz+ila2CugGxPYM zRn8yW|Ih2PQ!2fW`~M~DePHrD?f-uV&iy}Oz0dkw)(L=3*7epku={@{?f+j2Cjjc; z3_yi-8twltwsxNYc+&ca^?o=(a5J1E&{}@B{9ySSUKBWN`A|I#@C@7|(A#N%F3Tx! z8Xykm0n(=d@D#v!I0Z257ft~jG(Tp3z1My#Wu6450Se7S%>B(~v(C(!elUGy`kU!v)4QhE;XJ_8rpHXb zGu>&r$#jirADjp{AMP&LXgbA|GPRkaa3jDz5$fZoW%T?k(rK7)s#-h-0@FB_gQJZ^ZvaF^j`!?kc$ zV3*+n!&!z+hEw5=gczI_IN7k&u+T8qP-U2ID24L^6AYsaLk;~6CW97UDEtoYPWV** zll->)NBIT$DL6H7pM1M~gM5{IseG|~9-JCDUG9_DCyrF+Z|E&J^`UmxQ>u-V61DES}>o3%wt>3I)uU`!( z2%7al{R#R8{XBiO{unqv;M5oEN5hQ_1N3IS1Sbf-*Zo8HSKUXtcXY4mUW9W5kLvE% z-2tmASL-g*T>|F_w&}Wb>vTz7t4`6K1m_4Az_Q*f-87w7=g=JmX9))DY;cFezol>C zP07R32ReiFrt}BtIq3=MA?Y4CS8$zlg|tW7A)O;_kxqkC1?^G`to1CD7QsCaHE^P! zOmayR;l79A(m=@~!4Vv|_u(t;-?SfV-_^bj`&6FRJ_dI{+^M|@?t$2+-3fO=oT=Ri z_d%qzZEz<Re839auYj20sIZbZ)7JZxQ*-t1t8l&xsjcqfbVPv-ilFE@W^4gYy||M}Sik49;b64#Fw?*$mENa3;b!ej9_W2%Y>H47M=XjIfs9 z#9$+XE(Wkq67680Bm(S{M1Xyg2(V8Q0rp8Ez&=S{vxbL#k_fO*5&`x}BEUXL1lT8u z0Q)3)&1xR@Ng}{LNnX>z!#+s_*eA(rQatRFM1Xyg2yF;S9`;Ehz&=R?*e8hq`y>%y zpCkh8lSF`hk_fO*5&`x}BEUXL1lT8u0Q)3)O*;?!BoSbrB*IAymNPh!!7_wZ{0Rtg zekp_F5n}uj28$UqBDC>~7&IWPQc3~UVgAuQvq3@ivI@MZ=kgr&TZfq{XH zu!Pq$&@qq@7V}yLB0?iCFwijI8E^#L&kX*<;3o$EX7D3}e=+!h!S@WlLulas$>3WC z-yqa+Uo-fM!9N&$$>0lwdEDm={*Ew*`;5Wg82lBXn){T&CkzfFRB?Y{@Mi`eGx&(X zpBQ|IP|1D3;C%+~F?biDf_sO-+YH`9n8Cft;0*?c5T%!C4H>WU!6FRt9G<*ur2lgG~%JGU#G(I&PEpZXokCGS`!N zDw(H{xsJ?EGS`y1hRoGuc95AOGf8HG%vEHzlNl#7MrIqCtz@nwa|M|#WHyu8L}rvs zh0F+a@X{#& zFP#GLE+iQ`1>mJq0A4x;;H6UlUOENfr&9oaItAdPQvg0X1>m7m03JF8;Gt6h9y$f! zp;G`JItAdNQve=11>m7m0B$-3;HFamZaM|vrc(fJItAdSQvhx{1>i2jxVh;RfSXPM zxakytn@$0^=@fw5O)_)}z)hzB+;j@SO{W0dbPB*trvTh^3cyXL0GxCRz)7b7oOBAn zNv8mubPB*prvRLE3cyLH0GxCRz)7b7oLQ#;oOBAnNv8mubPB*prvRLE3cxuS(fA=2KqG6 zr-42V^l6|^1AQ9k(?FjF`ZUm|fj$lNY2g2<28uK?C-a;iH*tj9f-991aSzlY*f^3b zq3_}Zo+RMFK(++i8%Uc7T3b~~oc|le2xs+KKC&cCtBoHR#~DV+N!?!QJ24`>C=_!u zFr>UcxQdOKEln0(0i07kt0RRwNN|^BLnj=vXY`=6NGvxSCYTLH@YkDdbu0y&U~41Gi)!aDs-9iFuxP=;+PaE`ON-`KFD zAA+c>p1-JQem(qaoHuWBk?LQ16KJ;cv{2E)>YD0>)$=Q>8;X{t1zBjzCu9h4S4aupjXsE2Hs-CO{RHeXifawR8DprV}A=LZhy&!_&kNU^^m}fTG=6{m!8;ZL|n{@?C9DEmS(T^x=8#>!U z@z(B5q5<|1&U!)>sEq__dlRy#1;2KFRrT>j%YKy~P!*_<^^jg(G+|k8pv#N9`kQnG zl@Q6w-Xl35j&b!KHS>RoTDQwzj1Y<~&&!D7E&YtT0yr#rChT*@-NSjR%l~f5Z65Ni zv)YDytLzf}E1CqgqNXc)w(I|2S_Gz?yn?H?PkA~^HzGA1t*xE3`#svCME(zZ?;Rgk zaqbWADZ6{NTkh6cmSkI!Wm~eUWdjCexd}JfvTRHfD`_nWt9e&)146cl9&$+`fl!h_ zAhZ-hNPvWd1PBmFNJ0uVm5@RTDcpo|^FA|k&YWp0$Zfye_hbJ7+L`Y>^Gttc&Qnwb z)T?AOj6XAlolVegaceJ9s~hYY9D;qcFie-poEnTFZv;+;bR4^t#c1oCMOV0ee`xwzco* zS`TXw9~};c7NV2O$+5)@O@S?CZWcg61)zUHBJi>jfe67o6Nx~~^4Xl*GfvEAO8(Ov zSLcqHcx$_;!rj`KokXn5%TFvZo0(c-)_-z}sSet=n_Gp3z&$q6HN-xF+tY~CGt1Vt zGglNlZ%ZOQzP$(Rr4A#| z>Mz6>bBAHCJz@_QIGp~I7ZF%YqlSM@eO$|w5)qYHmoc-+wy!Yx>1U@hI6CX>tU}A9 zxb!w$Xqf4>w7trtj=uG{Bz=QE!&T2+6>tL z(>WTaJKVW9T07-`Z)##+5vuzSj0U>@`$JE7Vq>w&=vCoY!=DN-fS%9FOCTBBgayRD1h|;9lSd9B2T@L9BzS(S7q_q)T4=qK7V@>>Cgm2IxJfG} z!Fih1)3dKP(c4p3lWb~9*3>sP_SUR!?Auq<(%jpU=v!G=-`BX(C4xUCjf|7Fxyh~> zKWd@frcQXOZ687Y0EUv|Nv92@VVe?Z?9CBU!ED}cEv5%G>>KPy&ku;y;gwA_nCY@5 zeZ)^owN3pUcPw1z!OA{KJCQJe9jw4>A9|(i8t+AQHPkiK*VNV5G}P~^TXkGR<8e)m zwRJ5`4NWVXPqQoClSsEA$70}xm~RhcAkRA+k#9wC+@b~%pElq*nrk(5g_r^3oQW9j zytDq_&$~_V#T}Lbdw#lEaI6Q8^}xSM4_r8{$Um#5#=30JLGagwv;vT}4E_iQjuOS+_6zjx_Vs(p z#JsXZIuhK|zH1Yx`?PiK>}=n?UdFU`+Ui$G(Wn#Do7#4ji5~{q`^s87%ho2+w#FCv zBG}%yysXeC2ZRSrHT12FK-?lo;^DH#2g)|=+`d(+)%`dOA4IorbAJ*p-QS4wj#>qK zJY+*>?LW`1L;|ya-g#wJXH=EJ|2k@EGoc-9tH%f2vZQ^&P$G1Pi)r7s4bBsdkb?}SNUwGeOe7{LVH z1bTSt$x_zdiNB<0mQC}|*;}n;z}+7xWVsDT*AIpI1^%|qqh|2mnE1>>BW{F%BsKNiEE(JzS$Upx`FZaMU;i2s1ZXDYvSqEi3K&q*$I%Ch^x()r@} zzxRC*Ur#{m)A>@*wu*j$W!Z6ngnRf{=_Ei&<_l**EzN&ki2$v2>0_GHQ-XE{S(>NY zAK<8JqtnX&L0v{z+sAZs3y%6R-CV3(jn2q|eZ=VsAJfg{l_81B3_S`&Mb!U0y17A+ zaQ)GzJ+XJkx?)SgW8c%@3E=jB6|wgiAIEy&SPvZQfnz;ztOt(uz_A`U)&s|S;8+hF z>w#lEaI6Ok_rOw9>(btl28^FT-^piqABMgotrIVSz7yRNlR)1I0|th^BlQEl8hRk` zjxun5_C)Ni*wwKMV;MsqE%!>Xh`dIYl=w;xU|Mcj_XhU>P)D!u2 z2S4szzTEJd;(f^bN$-2Sr+J&bGtJk`XU(sg z*PB`Jt$wn((0Idm-nifRh>x24#ZjMUD*$l-4j`5q-wKwd5JSR_?2cndv6Pn_@p(={1ri4#8XCk}E=aoUu+Oss zkWLT|x$^2mK2Iwk3WTm=tF1lg^K9mzZ9}6I5N-~InM%o|S55dl-GC>t1m7-D7h6;L zxX)7$CEXxGQXec%`#dcO0$&*mx4$^$^DF|C6AlR~Inf!Pk^??ZHRSD1px`0n=((TE z9^Xi240KPZdJhB zAfRHJQ=E|K);M(MpH14-Igl7jwnB`+BT$m&mUa`Cw}Az3!#b1=Ap}{#qO-`(U}xD8 z15X+4VL|n0`aC;;GakeT6%>lhJHzKGcZ;ypicgnXbE?yt;?qc;ZCI9ua&F#UsoXNB z+}u-9-&uHMQ~MIVNt&~8kI&NxjKHXlkQkq^V~tNB$`mtiH(}Nu8!oHMZbxq~3XsEQ z74MSx2|D}~capqQcP5T>B+{rhnm2Q&&oc*j?HV5(O4HPm9cYF_>JS(~f?{b3?^QIr zsKe(eLfP#!sbo7Tu`7|@Po@(JNJq10Z6iw&n%kdr>nYx9_wYz!45Esm7SSSQTgV*c zWA?F#Ih%c+5@5p_A6j(gDWp+2N+V63-;O4yz@zoj8>p14q(>z1;Yf zwAmCOMmj{65-H4Ei)M`Fqd_Iz1}|1vS%Av`bMAXPrz2ZaXNV z4m8l@#V3)%TTx`av7sZ}Ql+RlCz1iOcS5)B(lyQ&%N*5gwF^!ldo+%~+d<;_viXaT zC-vie^qGELvUgNse&KOsxlt5867fbyd5o|2c`9H@QVd(ooK>g+b|#xq+(ITUau9_g z{jqsvE6K#gdBpl3vTFxNXq}6j3HJ!WM+0Q(lsA#lN2pde+#m}nX(XeMAtY8Go4ufc z^dcJTG4RJxW-7ma*FPdMu#OFC4ZPRFcaNtkQxfjLFszQq+;OiZ% zJu*DB*dbqDNxF3(MBAK5B_S{{7)7VYYlr*F9mxC&a!`UTKusz+Hk#sc=Po8abZ9iS zf8WsPp|tLlTd;_5J~9f$(hxK`okUgB{IZ2)?zMMzcCGK;wSH>{a`gl?Q$$HQ8c;Z# zI0Vg}Q3hM5$MT^7c4?>9(o&%63E;$|cA$$!CsJUIPU+6I>B5K%LYR6uqSDA-!pWaA2NewXz>nIxt*G0ajJdO6 zABBvuBdB9wEe|?5vu2T|kC6beG7?fedtp?a#OXyo&n##O^Z-qpJB{$N4vzv$VkUTxn@7+vJ`Rm}QBr3w%;xUI7?Px& ztnvtKkiaF%g5d<027SYD5TJOQ4x}VZx*9|JlIi^rl^ELZWG@Jj9>v)}9Iw^G!}K0E zJxCgW@|`jz5dRR39yAofCihH?!ydr&^?ZxW8rKkn9ikZ!R18f}Yzp8|ob7{s8YuRl zkb=y-Eb_um0pQw$wD;ziWQd^`hT!Uz>UC($HAuJC_Cut_{t*b(?&QqU$q=KQfr%a` zIj+GPhDvM6^yJH+`+ui#lgIyYh`844KfzxDQPrOJJ?y(4;-+=`PWF}iyxt#szXZ|G zc6zJ4Uh_HgHi%<(M(ml`eX$R~Tfv4{arD*bci^4iKy*`dcI4H_(~;XF=SH?f7KL96 zKNo%=d}a9T@apjV(BDE&gzgUILT80e3e5=qHuzBR+TaDj?ZL{xTY+x{ZVsFe?*VH9 zaqB;#36l3c=CZO!rj(f@U`#Vj`dYJAhU$vD^8Z7ecOxXnKRxB2t*y?UMYy7n#Y z2JL{hPMhobmFE}ob$(7J;j77j+|&+xU?)U??n$J`b#*HQng(fNm|kl)JDpaY0l5iX znQftM_n_l13uK^l5=np*yEFsBQ=5z3elVFzK{f1IPr=JFAWNYWz$V;2G5{|I>K&|kAR%Jk-LvK+WY-f_hmu3kr%z$8L-|qWR|Ohm1f{Rg|=q2m*D3Kd+6xmuE@ZZ3O#O81lpNWqeJAt zpt!OOT(QtO0NHj#Ync?>v@j_OQ8HDLvF}}YGewUL+!0HwtjfT}3vGmJhd}h~gkAx` zO-Zph1J^NOk85}KxY7(Y`u$vJ_mDR7((PTQ-)V& z;F^Z&cSL|fbSpD(Uqe9W6fFd-$-uR3BLjRJ4vI5yj}r!9gVQ|~8Mx1(d7uZOL(TN#1%&$42~8$AW4za1BJCTx?L%`Pf1#mKmItf$O3B!GJPT zoq=m1V%+{1H5KFK8MrATxd^^T4IhFFRTsJvVOfvTE6%{3Q5c-H&fqN0z|9eLI*5(L zf{K+$DXcaFH%ZhufVs%_ABifgX zFCZ(6T#I%AsWhB*uujk@Q&h>jNIUJz6QaasSDa5cBH3-Qw);m@N2FFF{r~stuXbE12r8x3!?Il3rX6!}NwmB=%ZMK#Rys$U)YUqW~W1-K7 zJ{EdU=tw9T+7Vh4st(P9IQPE`J`;R6_}Sof!Al^TeImFuxH?!7EP_{oUkAP)crb8h z;A+qnH~^99+XKyk@<7D;yY&*ppZ~ITtMx%EV+~t-L2sbmDzO6ozk=?-lMqY(6aFjx z=j*Tf_e13PrT)3Tw|qZ@*zlk9Wqbp^4&OS6|GwN;=9}rWK$GB)-d}iso4*{RDlQwoCVDf6$)R?$fT;-mPuZ zZp3d6%goLavqjfi;SXI;^rX8-@D%K>t8K399!eZZrr^(pW_Xo?r@7vJ{jsW8<6N@_ zO5i8)wG-pu9i#TZ@Q@MrmzJ4pfC$cjCsh0l*jIzz+-lPY`}GEW$2@ZdDv7_a?HTOr zhc^i*>R;gBUToIWoOSRn4PVUctZmcGa!s=f!E9O96*J=$3)L=wh!Haj^IpgD-Y{i5 z>$!H;*PGo!pES9B(pc9G4eZ@dslzCxWa?ZAij7sq>ZYXL(9BYwVJ^~jMpIzMD>I9y zn~NY;HC*Zk$Gf|sTgqm<88T;Jel26#rWSL5Vcr|+x(^PfC*a)2!|IGJv|wy%t`uz^ zZ8DQn)|7+?NU@rcDLblx8M4Y)?UYTaZ!Xl7;VBt|aw^7#reutrACVuHK@^kyzx}{Ps96Mq6a=8CAn>^qta|gQ$BGR z{20TNT6gj=xJ2s1TP65Bsy!z?I%3Q+&x@OlEUcF1%`}!wH_O>PW4{043Ui~KG?p5K z>8T`oF5W0{-3Z0ftST}~83I7^A&z8Y0g^{Kl8r3MN{(bBko>y17wPvKhLm=n;gQnr z)!&lRzNo)0rF}tvO-j2*e^pBRy#6~W?QZ=yQrhSAm!-73^j}D6pVfaNrF}+!UP}A4 z{*09NDg6gh+MW7$rL;TrC#AI8^+%<&+w_N|v|IHDrL^nyPfBSQ=pU5Q2K0|eY5jUu zO53NOC#Ci1DJiX1AC}T0dR$D?Ueb%CwCl7xrL;ZTX;NC9wn|DXGp0*vrAAarTVVL4 zwE6mtQd(SJA*B`T%cQh((!829|1?wUmvDyGC#C6HLQ2!Lv!pbScB+`>`G>YcO8XCOo0RsJwpmJhQ>&NK z-q32LwAVFh{(1hcRY|xHdu|bBz#-42MIaVxj97T;=^|*S=O<#)4$t#qQitamF=@N! zTVm2S&l6(OX3yhd(kY(1#iVx6ZDP^}&qu|iwVn@(Nhf=*6q|TrN=#YNC#KXS#FS-w z#gyQ#X=bUWH*VcPUQK6tUUw46Bk3&9-)qc0y586~p6nd}fBeIP-DB|1isBNDjwFV< z$KcAl4?c?3HV*GI=J`H~CD4Ls^#OmR+T32a3ifcW!16^S{)#D9eZxYt6;VN7I13#6 zhq2g0AS~I%i_A7%udl1$luV5lD0>KtMmB~mylB4Jj0?lF;%JS~AJ<#v437r-0^X=u z3V%3S0%puCho4k8zzCah@*6Y)^db`!0XRJXbpP+wFZY-in4M-hd}V*kxXw7Bf6Pc2 z9Y(Ve*I(Cvsy`X~S?pV}J7X8cPLDOlilTqgFONPQy*>J#XkT=5v?}V4JQsN&a#Q3I zcneq^SrVBMek1&o@K@m#;L`9p;celD@a)j*p=U#13Vk$`4RwdwLRF!n;Gcqz1wR%% z6xU*MVljS>7hlOnBb>to}{?e$WfJT<_J7gM0cfwJ&QQ&<3=z;t1Tu8@oY5?oLm@0~)J>#XAo00oM5)^Rh<3K*ZhgGd*m4?U0=B}JxuVPYOr8o5V? zX1uSH$CQr5ND{rHl>MtcuuR<^<^ot1Ynl=(JS0tx<>>z3e7J%60FNpMmYO?Yl8hYb zo#+|t?H*3{C%TWK%@q`(hMh+kfchV^s>#HYp#y{c19Tk$a7nGXS4mTSs!WnKBGc_l zCH5hmJMy{*gsbrOFEh*T@~z~?C{cs^;bT?iW`?i*qv>=K4o2`8mpsCfIC;6*CF4MA zESX5bVFqgZ%x&4;+?@JsqUx6B$s;6>Wr>|gF2xRDu#pUia8}*S4}^mfN9<9nl5D0T zIexqzwJP}bI`q_S$nl-%fQ7Mo)LL9_p2T#bjbj_ThP+`2+`%|Ky4YOL6a`iB)aZyS zMU3{G0|Lw^cs^{9*azRR7V%wbWuO=zwon<@{h17~B36 zu#iJ%GXX&Jzk%f=n%*=FZ#lvYxQSmf4n$nE)=aC6?lny>YibhsAwW6U-=AczN$G0DAYc~iu0q1YZu4-5vxeS_jj@q_V~+RFb{>3a zSt-u@8||f$9B=F^ApXA_e=`DU1w+Q0yE%4_qr?$`aqf+BHD9ucFS)AJJRUW~rrU&W zS8PLDc*;#|-bya7ekGgN%;z<*c};v?9h=w4@{?F4ol6b&If(g9tYVASb6FfWbsW_O ziRucjD93EAy`7;7+1hHb7}~mZ1J&m7yrC_}w^y1t%ku`ly(Wf^Bt{N5_Kn#qwY#5~ z0i$`~3Ie|fzC{if0nH-bB#b%;mZ9bNOCPFAoL(QtH$BJH^!BS!=jdwc%gAl=Ae zS?*pZTZEmjUicS~2Afbb_@ zxB!*o-e4|8%(vn)|E{3+DbFq1fD!uxcmQ}h_DJl3*iEr3V#BdhW2<7N(Z59>iGCz{ zdG!3~aP-XR*65mOO|&E$j=T~14d?(o8u>!x=Ew&l`A9m_6WI|tIkFB%eu@;TOC%bRc-nFulZj9&43&ISNJFW z=lRp{qLA>P>fi3);9ui!@-Oo*^w0B8^ZT^{-;40ZaJjD+JPmlg&wFq4PI$L?i_PDf z_n7Z7&oY}$pYeimw{e-#qa851j15MuF-QNq{&W4i`WN(@^^5hSK1chT_MG+@bguo+ zGG?I9>eDtYF*?y7uwfwe6ka!gz0Nj6!D+@K_OtYiHzDoj1YIBO#I7zfD!99IkvZQu zzR*1Pe0za$5|b&;@=q@|Hlyq*r}(E(Q(TZczXi5u7B4h5BH$F0`;HQ04T7j=_U(uw znZiVqp}g2=u@mq`pPAFUTrAG=m(4P2Bn=CHDXOrbdc}^}#tMaQ#r8Qyy_3u;R&0wJ z<&0KER~X*SY$Xf-f++`_xtBLh1!OP#jZ*>{iVaf%+3(WzwMI8TDLGXOR(%59!c!7m z4o(k_Slv`~d9@5g_rO$i*&bNYWb7}96v@u5OjpS5y$QlnLQ?k#DOYKzb z7gE9)o{Ar(2FB1-{IJ7cGbKL-bT9T#Nu6o!atT;K>tflIK!)Pdseo+5s;2}p6qnfB zb8MddM_?h+I36cer&6U1TAE*B9Oi3#FBX-7rGgqScUCWs@a^^1r;F(Dx) zoFyilCMKLJChQOswuuRw#e`L2LcN$!D<+7OPOB0S9&sUi#D(k;7qaJDB8?}+gvZ5% zyTydt#DrVKgpY~|;{5PjDIzY78H-r`hm`QUPxze>exEM<-Yfjxg?40h0(>`=8m&%-;uXR?j81Yz7 zg@P{yza0EfFcsV!To#-i_*>xV!0m8@?+vsDmIcDr%b?GHHNLGkfFA#k{r6#y1gH6H z{g&@1zWaSQ`7ZHg^p(CLUngkqm-|fb%ic%5w|lSfj(U5%o!;f%8K4932k=kui1|75 zYV%UF&pgqbWBk#09QzH}1GjWbe^I|zf3LPnTc-Jm62J_j8dL&OSejx!;x}Q<0PZ7x zD;6dtjQj=vHrsZE8i3Ed^i# zwas#!3Kfv!)hL11aajC!)`S0>Xww5mK`$)LJ$w5;Io+s&oYd%{Zsg(xtYM0_pxu@v zrQqBCI8NMbFKxgLCE>d~0-l2JQn+l-C|KJJ5{(Xq9 zfn_;_8&PLTg#AuglFbwL@tHhfFM0_Be>o{|Wxy!z?<_V}Yijpb%h8$1WsOYWr}I8M zN{oXrG$NbO5e5#jmf_9G`JO!nUK5Bzk&%AyUoZ<|mj7|Q131a9A_)EToE{(Y-BM-j zcn8`dRyCfZGBLiVmMk;&s;H?XfJwZBWQxKE$tolh&~N9o6|M-r?3rDDu$4)O+c#JmB$aKJkaI#M122uavfz0IwYXW>ARWhY6l{I>8`{(s7Qz( zjtZ`I4kZ=SIj*xDq%ahV@fs4UbepyY?;S$6|Iu<|y*qxkZUt>GsDAi9!PRXe#O5yI z`ppLMtzC%E3#Wb?qH1iG>pB}Kw6&ZYMS^jgdIDald{zE$Ad#2ORQz3^wiAu(P27Zc z@};e)jOz{x?l!Clhr!rEBIIFbi}!l!j+1HStRqN)aEFb z`BJEI%#-<2>2b{EHWJJi->1`LI;z=|;U+YuBXoOACPY4H@wyvxWLq)w-Q;w#btyO< zjpH1eqJqY1t_-K0u?nBK1ynOyID(8`#!5DWRmy1QG8iR?CN6{d4Bp5vAn9T>kP}Bz z#HeS}87+)DmYAr5v4SncuvSa97+(3J27Sb&N*18gt}RDWAx-hTf!+k(k*+GS=ke|HwfdsoKX||Cz14e( zw;wFvO2{!(3q+#`j|1jeS1$q1e$_2iO1vqc26j6umM!X6yg|G;&|$y2yb@ zdt^C$|Nl++iSVbx9}J%tUKd^(_Jp1ZeI;}~c>Ws-Z3xW^z7hOh@D8x`?+8D z?*Z?H`~502Y`kndXxwN_8heeE#$5Oc|D671{RaIKeZRgzFW3HE`>A%ncAa*C)}ys+ zwc2dYU*XESAPa8es=-SQaR-aMAR!4=TkW_GnUw{vadULbH-@xBv}PxLZWcVnl|aE^ z@cD*|(5%^6@DeuqTlAyVZvf%Hn5ps8et50wPNg6}$DlTe97JR+Ufa*~LY1yhQICnc9%C1X+^#So6 zyZ$g}xghHsu9k&a@bp&iAX~=F`DWR>NH=VZ5 z$b!cy#AiCy>!!xD;AIMxA#O{tIWU`x-1kB*W2EJI!=V_@f?FxEEX|#t1!qzfP?qj4 z&}_Ca_>dAwzwVGO%Yxsi8YsML06fMzMox$Tg;Zz3d(=q`1l<3m!PBqnM#{y;v*1Tc zf+%$9$3SC_CkU*Ty5x6eD1 z!=ne0FFU+Jv7WGIp|(8bdud)g3r?IW0Bd`t2S1zrNhTM(Hrcsj;NObRU6ch^P0gt6 zXnGu65P|RIG;&Liog-r!D7eewEO=;YK`6(as0p~Xv(b$ z5s7EP8xzR|7d>`>4O(__7ThtRDr}EHP6b5UiNY3U!68#4z_x(FOYafj7Inqb@nVUHexfUZ8;Tg(golCOlxx!=}C0X>F7n5~_W(n-f z$s8um{d=KNwcr70x-)8XGlx(i+b#BB??{?v6=x2j0VP>AE1POTSDne6U^1Il37O+e zW@7`F8PBBAT(-&9H}FO0W>Q2tO80^qG20@rjh_7W%Ad-#Lxt0o|0OW*-s8(@XtgX z>UP5?3y2rRRX8(q4oH@Zs2Lwg3JI~7~p%J?Udm@3Ye4WN0S2t zRl5x|XK`j9S~AEfB5qw-C-_zAMSlL#h*DTpCP{o{$}qTu9~vB`$T^ulG7kqw`jUsC zVKk>X)9dr>g{n5;H~H=f(DEK1NOtcV0_V`({i(#*0JiOhK2EXaW@mc9VL6n;zUtEh zF{ek6!)_eU0?!uklTLGrGiQ_8$w+)VonrA!H<_JCDogYsZ|!48Xl_~NEVQhtn?=Y* zp4V8&{LGoenX0KFXhg0F=%&BC6_Y5S))7z4VcujT(wkWfQxSZRQ9D*B2QjIFf>?Ypi zcERP-bp}lr3__rFr0%Visn0p)<;M!`TkL`QbsxcJD|*3o@N# zMiU>kuI9bN?~=?;;_6R05EV>SW_H-F{Mblp3gE&_2jL9+s)bj}^Z+Q=L#PLq{mRUC zLJicAZ6$qmUlnJzNu#peVZSP~m8_@jBkK;F_%r=KiJhPch zWy~=WY=BjoTbwyXDoTajWtn!{!TjLx7;%8;2o)|D6pj44W}&HpfeVt&oM3clL^ zDfFGtJ)oKYF0j;J2R`~dppXBR;0?ii@a*6Qu+{elo&leH7YBMk@4nJ{-TEO|>tAD? zXPsr89PY3d`rq>Z$p0z-hy5x4F8@lf$pIWjB!a`>KbKD^KOfp8sI`fv2j^8O5>{oU-%d6V9a z-o@r&^E9);oN2sfJZ*dq^zes`^+uK9(|@HuuHUX-s`u;d`ZC?np4Gmj-K1Tp^=U1h zKR`o0o_G!<4dJGx1)N^5$$^-Gyw?hI&z=su5OQX>% zO0ysmpu>+m6nFPRG&^|u8FUfxEJy~zZBw%xwq|8PI6$uvIM|7s9?ybgAU1}Us?36P zfPD5AV2=VTvLGv<^K#uFb~l(v9ofEb-6(tX6s~IA-tFXpEV77Re2e%iPr6 z+_EeP4(P(nh^AfbsFx^#1zC_D(4!0k;Q;fqAVZ)VJM5L<)fkGSCk^MXs9CERq_4P(c#$EQk$aUztvG z;#m+KL^f$|MHVCm#3t@5TWoN-ptyJzt2k2C)vBTb-ST4#~H@29o<#p=%(? zEp!b;x$o>6Se6Aj1x;S=a)Y{@G91r>#3D9UcN>eO79hZ`4Vqh)1+j%8@Af5y#Iqo~ zh~zbwJcunKd74|71*v5#nhm_CXM2w$7frmBXpt3JkYzT%T@h$MEfLRxR3kFD$6;`J z7UUS@mK^PtJR5GnNsYp1WkF8P(7K*6J@grOVYY(2 zpwnku8wGF56jYsEOx~2Svv%}4W-nqYMzh#O>i1{5y|~!2>_V~w+0WSuNIY9E?J+Ka zIoUFD4Mm|lkwGeb*eK7IlEJ*!G!0F>|vE$OZV+#&x7>npKi5LH82Nx0?hg z>>7jXWFL9uLmPN;c0RBL`CXlBv6Ke4I$F3q8z*&lZEa*N8CgtawirqMObAhKUrbYC zbF=dZlU*A+gg2$R*|{`J;D3I04te<6m4bL>=>Z{oc6K(p0b4%wp4c;bnASEwJByU- zoESq<_tvLCW=zrSx!IYd#?Da)y~K6+g6s@*!GdU`C>jX5g$a+ECE4kuOFIWq#36J+ z;|RpFMd<2*!j(cik0V<~`yu2mtvQ~BTc^0u(;eF5DfAf!u9xBoMN6&7!sSvvZtSCB zD?H7T`;SIT)MnwT*)APWc8M*cqx*3nX1BnyEL=O=3Kg)wnNjjfvTz4oQwWU?ehQ6e z;SMVFhvy&8i51Vn#Zzdvo4Ys*H%|1PB|TR{6)r5EMfXjBF|w!UKin$d!YNika~Egf zk||W-u5Jp8XW_ajR`HfoMOhZEn@B)`hwaojo>!#DJQPx$g-a*;+68MHy`^JNAC6UO zYfrk^h1pGHtFy6KsuBstvm51R(drgwH@MB>o@i0eQCM+yJ^J)YI=FT$H99`(W|n5x z5h@E(9*D)az>0c*>V4dMm-kx#tDvEOkN-Uo zF>tkin(t-!9{&Mw&UKP+y5|MWt2Jn6Xm@KD>wfJy@F{S6>;mv6usmi&e-QmtG!xwu zT^2PXKZ<-hl8fwtxB)su3H)^U!tma3eb@vqfu9Op6gnL&27JM1Au7OR@YLXnpcQx? z?);6QhwxqF4!H3Tg4KPMq3O@V*ZxoF7lHM{srtzf3vjE}td)SfR>SieIN>M0V;r4g z?C?)k5^u4#5r0xL4!y|nYUeH1cH+850p{HZwpbm+0SAxV(%LO+c(1a~Du9(aSY@59 za5;$l19IBstE_GXNn~LlSHIdCCB8KzRs|jHRaU~|F%o*>V5)mCJ*LgquP6S#4?^VI z6u!5k*#$8OIyG5U9Bp`zk>xumm8c_}auopS|zS*RLf`Dj<{G?d^y~ znAkr51gQi^X`zx1_(Kj6R~};Y7CS17=ZeMVM)35(W=pYHJnyM6+tnZ@0*mKzxh5v= zisv%o=4Tw9JG;{mUlZJy9zJ|{$ko%CY3w8(V0Z|J*g^bnaR?63L3~NE0NB!8Jtfe0 z20vqW)R|}MdO}1|og$(jPaUGnGA~|Xo<3CptUS-)FCx=Vte^)yYEjrsV>_8rBCNR% z?8zBDu$jiTDS-7X#jR>!lSFaL6hMxm?ZZ;!u~DLUikcz@aunN%6C8mec#wL68UOyo zP~z~B?v-_nBGyb}6F~&c889C^+RJAAinyZUEFFrAwh*^PIMp?FC@$JO+pLCR#Oc)D zp}6Q2!jNe4P+Zhb=m_fg#YLM6ZHDr`(PG&{!tEOhyP0DyRbgOUx3jj*jj*}?kGNDN zF$bKwVIF>yxQtR5*1+EJ$rw0ob}eCoHN|GL^P9JYsX1$jxkJoSS;N$vNkYz0dzhLt zaL5_kBF6unKpC0$g^XhS4_QItor)qj6=KK_2>F}^3*=k02Bme3|Lc~YQcxJkK)z4N z=WF=7NIw>c=GkU?uh=tdc2)B$1({+$*$18Z1QHd23HsWrtaGGY1c1onuv~eI zwO7HY+ODq7+9Yw%Ozb9k>1(xhNFr(jC7Euub+7FF;b}v(8#4@!6!FeB%;P8z}YYYAam;D>Ja# zN+}pnPQIjqXram1Cv{YlYV!3KASv^?%Ic9OACOc|zFpEhagb71wOF0fxtn6_9u z3lWuhZLxMJ`cygj+7um7X!5O9^r>R<*`eZ?{gfD<%Y4>ZCrfobZ}0QwQqwe^Gww1jH+qeejM=egW1op#7E8pA10Mjti#`;+J~|QI z60MB91-}126S*{UcI5a-5or5A7`_gC{A~+Ygx(DOAao~a`kxtE9hw$=Irw1kn&5bF z8)yw^f#(9B4}2Ir_U(o!elx8;A1OI#ntZmjZ&ujXh^{4bZ^-C?o|DykX|NH$T z{&xQ&{cL@u9@c)QeNnr@AM*X&_pt94-$lN2e5Yvpv=e>R+B~pT=<)v6d%Sn1_xt9n z`ci$S_7Cl^&i}RFg8u(kwHvhawbQlZw0T+wwzDACcC^>QY3JZX8V<82YLHR%C2YNf z<#;f(h2XB>(fQy?gmK+Q6+MOxy?D^TIKi!AaF0%bW9fZ^w^vUO_9YJ?ZL3uG;rj0S zT882yQz7eWSGf&&cxvQI7x~cCNTzeXJ~gt@rTMj~kqs{LL2OqijtST3uPPy2Yrj$e z!Zh=N0uVQpK+%^)(|ocjW!Yt|Xy^Zb%x?tteK3lRh-lBFuo#LnB_Z~Sjgq$Mvmu1! zCG2&F0J$x?TTM*f_Q2+z_g4VK6z50>Kh1Cx)Y9g5+*sj$-p#*C;5sqHy{XHK`dfuz z?3#Yk`&&<%JjdA7aAjyKVYi4UBx)4KQv0Sa=&2yo_-%=$^*FW_8y^-Y=YMG+@W#n+ zb=3S9S=!%@O(=N)cw(S0LL0F88<+29t|x_Y06?HB84X9UxiSe5i1N7`pcNK!x!ai) zLYr@EdOrk^9%)U(H-~fJ^>KR&yZlYNpJM%|V~aq#4AO@V*Vm$k-Nr8uZc}z!unwOW zv~>T_Xb-#s3c*lTDnY`{p&1_*A|-k6X%hA^QX{v_8kO}4m$e3EeezPQ7wU5kO=h>h zzW{{U=I^upde|{|$kB`Y`BrSO>9!lwcRRR^XA?a)D!trXh$ku~gK^v`a<2lwogrUT z0++mf^7}ujR3T^8GYJ}fl5iPvI z3b4~J9Qe{2#fR=$xO63G>MAUUW8%3H*QT(3fs7?jDW`*=X? zW5uILznYlL+dgqVIgcFt_32b`G#r>TRrc_kD+Ku_6O`M5cNZWh^VcQ!9Ufesy^V5n z)l*=D+;<4bF}Ge#Oy+H!$eZ%nV_YOx=*=Uo2FmrO-YJ7<@>7d2k(H_MUF(aM9Q&0fSZs;e|S@PQRwfXZ-wp(T@^YH{Qhr% zNPvOh4}*6GFAeSst_c?K?k8RFw6RP>-*N{AQoWS>arTGBJoq zqqz%mpooJM$vYC`1E8@34-Hs3gaS%(poCKefNeNf!8T&>;}Te$v(<2L5cPC-dLYpU ziY@4W$&?E#&4C&Y(nrVoK&px=bD)cZY!wJ0aHUd^l&zBE0Hw-Ga-fofcqRxbKb`}< z96{Adqo!=7IZ(qvtg^~)Na2ej;yF;h5xbPh1+5#A`ZQ(E5PHqORcWG`lF>l%4c`8p(!Q}GXDx&GM zWpHHT@Y}-UxfZ#LsDWQ;ZY3E2)~FkCP7%jUZ^pa3QI9Z|FUL%8j+x#Z(f(UZZ%T8` z+ydO1B%h?+1z4JE;t`H79J)l~xkh<&VR9Sf4It|5k)^qMN}c*`K+~N;)Nu&PA%j@K zBODGXBA%<2Ib?EcWDc)$I9!%nPIQTpHH*rB1mc#WSLBuv<>sz*67OlF6X+4DC%HA5 zNP{&t*wSL7U+r3l{`}lhV&}FCRK~X?#z3zM2-580Ts2W@1%vM7c<%t0xhS`UNHm=g z`?GhTb)*kW(uTn642N2n1A_(Ru4iWwLJIeegVG(CxPwhQTTfZ8l4$*QB*37%b$nA2 zyH;f(l{qk4K*x6b2xzB|w~pfjzHJ~eg6&mZp38G!xUd3%8wQb0_{g{dQ607fOK{yAz<(nLMyqKzTdYx31f|9(54STap7K z1*EvHoR&!OmqM#@V6=exQVC@%T$lqJ1~gm1FT*%!9NNB8u#im2#dBcEAc{pyE|@cj z{S$Wjrz8i~3`k@f2P=qftV)dpaGGC{1Cs`1acJ8ycMSIKcOPzDTs#Ms4I&SeN>dK( z8oE$}1!pe12h)Q+gF}PkM_iRpm*|olm?GjX6^f;i%?6qUw1%ZQutY>g!D0=dIS$dN zv20DjyleH3rjGEqcrGk=Z^-H1crGM&3(YOf1<78? zI}Fx)?e$PEo{DrkyOOj*t( zn+JZ@cZ>?rgr|_woZ&F(`r$zhrHFV=mzku-;s0Hx<6nLW87|dkFCbR|!PFd_u%#y8 z_QcqllLFP*cM$^tp#WpQNm*TzJ)g{3H5S@Tq3Hg<)2#5so`-M!m&Zr?ZI1^5Ww}Zz1+^`;cK6GE`hEO&% z5b6NEeIxi>@b+LXczSR-eD(is;KsmMU`t?$^_KNb>jvvwYnQbY><1q4U++KY-|S!P z`@8Qc-=`qn-k@)*Z<)`6ulY}c55jkQcX?~PA@D(Xw|SA7fLnissT;pA9x-k)E-{9T zZN>_tNdKjNpMI^L)=$tE=pOAC+PAdNXxC_YZA5F+=7L&7fq$iWTgahKILaE4TNJ&{ znUYKLAmpHB&mhXMhdl6nAwogg;h_!7%HT{Lfe%eQbVeRTAAI{i*ss?(b+K4-8+@%C!jq|!dQ|IMDoZ(*xXkI)I!i>0QGPxkUh_w|vwKe5I zP(eFt*VgT}VP0o)2pSE_5}Xws-mPe{$~*`#NNP|NL+g`;Kz6*$t(zpU6Kb`1`UxK%U23Ajo9RQPLt>7L6AXm0JQ={9MkN09%LAi zW13r>2k`}&Bkdm?2Um+|YOqCZ155VVXs%l?NGEo^)P75&+3`GxCt|%!u0lGQDG-N8W|c*fS(vub=7&0XVA<9 z;S=1`I5BRIltJt%kv=IAb9};!4GHK&>*yw<1d~E5l0va z?ImZRi}N7Kpy_8Do1!76nPqv9UC=BLyWNG9=0RdX{X=YY=)ky$d3lgm&_;uKL<8>T zmE}Q3K@~XsJKgI-O7kG7pbCi1j-rCnye+JVHhaH!8d;eKVFmT4-N-F4N?`9xP4_5p zNgiYtv?bU;xWbSpU>UkN55fx?b{o1LtSP{~hiweVPy{K4q3BE!*KUwPEAk-HAc@wd zNUQ>7k`;LnYZx5q7#X)D53&tYwLQ-nA^CSs2d&J5kh9mV8V_b_xNF3I1BW%099I>r z%4_7p&<1{N!EBg_%qryKJg5^g{ROhj+6joZK|JQZ;&4))0}%+#XuA_S$?Gu^+9;+v zXG=Xc#<}sS=&i_s)PwGPHkOX)F1Y-WQvpYhb*V4OoyT<>R{|eel#%k>xg4{bz`>aP zT+U#Qau~+ml49y|M~F8LXXNdjB;7eMdI&iNLd^12FV7vey=TCM1B}G!ymE?&@Iz|& z#?)Y+Onpi2AlCNPTdqVDDDs#<|H$Cb`T(MJ}ztQK!tb>uPc-^2BX- z9XAi*K_Nw)I8%H@?f^#@8N$Nleqvadhs$$gT(ihjAv3IV{D?Rl@!TlcWNkKZAN|Ui z)U$FU3J-4^4~B&Fv=!#_0hP>&E>oRhm18 z?3Va_XJB*)%}4IT)xX5&Ep*xWuYBI>kxw-0jG!c!P(2*b{IcBHR(un7F%KbsVSFXtIASZxZ!$ELH(hV*P;q3|{Fgb%mOH}4Mh`7*6c}LDL;Fvjl z1ob5auE=dCqx*p!D}ChI|A)~>z*7IJ=q1tfqNCWu zzaDuZa&P2=krDWwUlGy5&wz)%E5d`}wc#@Op8tJpv)>y!AygdvbMV{2TfkS~8Nrs| zw7~BJ-+=r7d4aA#eIRK4%6ibc&YG}xT1zc2==p!i|3T0b&Aj602sj6S2)s5HF#OZwOK z>-2Z)XTjJ1V(rh`_q5MyS88$3>)M2Nwzge6PW=dg&8@L|AkrumVz>mq5PWihxmwpL zfKxez>?dZL6_A}w3{Q-857j~h95A4~bDCM=CV~y#lNhxY&UHuJ1?Pn4$ITW^!-?>m zmx2RE-7>~7Xt-OLARQpYA%SgCV#JT~*YIbFl)d{s=P`q zka-l_v@ux2g zC_6ysYi^Io@pT~oLAM=>$T|S{YOz^wPX)1wUvaxhsq-612JVm`yv8p;Zg*R1Q-R9} z?|K4Ix4C@UC{~>d0Jlmt@f{A3Pf9gOszZRf#qHC5L&?L6)$xGarx+pj%a^ffD;_(Z z2k6c(EjHKN-HC$zsE74_x3P-oLO|s{cYR86g&_N0mq9tA5afSxk=bT5p;n-UZn&Ap zAgwaKF@X7m+n55%vjDn@CxjHSBtkd37`5Uo(D^uzQ8M%~m!Semvq0#hJRv1RH@F)G zvh!6&Ck0a1^Dw3A9l)-0r<7wgEX>|(S)Np?vOwh{*a8qwD@;Xc&Ac&4!Cn_@*> z%~q*Wk_A#9W=R!Lkp&UXYbvfv3DoNX1i*oiUC^ zt2kq_>@YhZ#f-_YGe)8G3T(YwK}yBf1$Zail-r#CsnX#=&JoPMv^Me zVf$Pe=ottNDnJsY0lqfWG%U4IX&ngl%NU8yzOXrq2wnacgI{oed@qo6e|+0|82ct7 zj_cgl^AohTIpzv+Q1L5i?GK!4+)TU78tiO`Bm>VYdf=Kmp|>7P@eY!)2l4s( zb;N7Vf4k$gptjJ{>v`Q{o^Cdo5##s9H;j)Oml}N#?eC`8yCBxz!swgPZ$&>EJqnip z3nG7uJRZ3=axk(fQXGCQ{8;!S;ltt6!cF05=ntVsLmvxeJg*xkfL{N}p%RE2@Y~>1 z!Fz%?2d{+pfI-j)*chw{&I-I1cslTC;9htaxFV1b90l!w?Sa}r*!qq2nDt33ZzZi( ztIYp~|2gn5_yPZze}})u9|n7bhkQ5sF7Tc0JHZ$CzUKXb_p{#jdiQ&`c$awn=FiQq znAe*}jYWp8zX&=3SL+jchrU9eroEy)s@Tc}v97S*rk zFzOxuI%I@N=^zZZuU^aWp_I@+f{a+)@@nz?8jcav8u_++HB*yPF#j+^q>xnpAqgXI zw^wl$;a=ednGbSA*lwF*2C?SYKf#tb>`VhCx^B^TT)SdV3YB z1nPIoL}Xqr;Q9owQl6D}aSc*0;c}5($})ab^-YLNMR+X=eN!gft0K%p_3B$OmL1GB0CXpC~55 zDAyqMBpBiPM4ANHPlY{O8}SJ%^D)Hmp_GXCO8`OmJcsF3wJba+BLo@)TqUR>f)v~@ z0R#&B0>&)7GJ{`m{sPh2PO~0HL9vNM=!(5v2k&&xWGbc($pXNOg<Jv4Z;K$g!c)4-<6ll(gv3U_1HLe>FX|x5o^2v5(^;ptrko*7Hw?(sk^NiGk zsD47*`@Z12+IQ45GHLw|<2f}aB4 zfZbS6;IF~QgEs~*gLi?=U?&g`yb^dU@X5esfuX=Ih&^ChFIZo*ZnfTPoo1E#|KfiJ zd;)&RKW5G_erJ5!xYZa1|Nn9Q*ZRF+^}kau({=6V+UJ?eec?YBO@fv$(gkiCnm~^I zI8E9CM^`0237WowCar#flUq3n3cg6m)D8^Tc?2j8caA5hqulxm_x;V2zI{J#-3P zl?Nr`GZEB@YHbHn1N)rRATqRJ37{s>q7C^$pJ&HZMQuwhw$PmX08x{+t8vNA&i504 zJNST0yBTxy`%ptIpS>S4S&Q>YqHzjY0~>HSYWH5|QYg#!5jElUhf%CGWGhZ0)3}hO z`Cek5WFG{i)o}cdr$)hV5E^3_JSz`M%gEjvkFlFRKM(54=pc43F-Y-MKh+tr;yh?8 zBm10QFjP+^_{;@)&{IafdT>Z|bWy@;vu^3KJg6!o`2w8BV#jblfxH#ilPAL01_W_h6OZ zK1KOic~DnI-G(?%yKFDcgQ7ArC+S7!QO!O$`fA{V0jT?8Cx-btK%gCY~dwUvAr1mS=Db0hrGGdqvhXPTS2Tf(vC}sc%^x z6qC{U?nq8(8pD)Cy3CFZx{I#NgHkdh>+S|OQKQK9L;@SDyTGzMXeJ}xI74!<=3ybA zkjy}^Oo$$fTu5#H6x%L(bYyTG%&gEZ1FO*y1=l99k1Dso(tJBvnRc~q0g$bdILev} zuF7vBHcSGzEs?^uE-tb%ztNWH7(SAz4)9ybGrS_dfyk9C$z+O?%=r?P`SmK&G7qKs zbz~@Q((>Re&bQec9N`kF@vj}4NZ~l;ZeyzQYq@5(!vX_aW^8EA^H!H{CFV(Xl@4l( z<}A;jOfD{V5oR{IR$4AEmHCsn)-!OPl@<9DxsD|)YzHd~Fic9ic4sc>Mfo*EymdH9 zq`=t<(TaCb4fzwuxn!f(P7Dt9;SF_)MwaD|Co^|ras)KCdpkzQy2f~Z7v_&6n+lvF zNOu>av&utSkzY-0C6H+-vKWCQ*ggiiWl)x1Me1wAXMw6C%knJ*LXYOM&Su`+yez*` zf(Ul*K@doK!2e(DXR)urZ9WaR`6V%b^ttF)!JFT?(XQyq=)&ksh}ZW@tJX&v@6sWs@9(hY2exKQ{V|; zFMRj+1zrf;9k>Mi`n3dN)=T$Pcmw!~akX*4*l5hr{{XT7TJ`DR>HlkmFa7_2 z&cR_Jdf_-srUyrnS8?==Dr#&8ssm?WA;e#3E^hMtRX+#a!3#GUWaRD}^&<8(g>kko{+@6~<&k zXCWr|PFND?#4+(?oVpj51a=l^oY)OZ0y`8O^h%>u71)CH^mz_?1wN|+n`_KH;$ZdS zH*$Hbssg7d>lS&e3bZdZcL-F8`G#Nu5~vK2h&UXZ3R4gOw&AdZ3ZS}6D+6l_F(L9> z8EBPzUu6jrs0f@O_ke5>0=VPl@y9qdvlW5k3UDCuS`k<+uNQ@RL!dO!ATL+R%mHBa z@^VEmHKV10I(79TpQV8nBCx4@?4Z1@EDexoq|Cq)AituP2D%mWl-ty)V!MH!=D$y@Xbq9TK3or~*U(9Fn+weI zRdQRD^Snh|l}+7tV7`XBret;pm>M68bF+Qp}v=!ChZ9*R0nxlF>Rc z2%pBmQ4+iy1?#7q<>U31JDP4Af)=|kSC$7~-t^NblY&1y}< zcbVPD#{rJHT!$;fi5=+0$oV!jG+qKxDRnnvU9xx7amsUw=MKfHh4|Vepfq005RqyO zTvrZG40or&Xmbecz2RO?W4+8WufY-6)YyF~cyD0ASL0=@1iP@AMjz2sN7pr`espug zIs?Q4_a0@%!|(|Wcon()FczQ0ifypO=7;c9QKMNtNuWFtHACnXN9QnE|15(Bnf zn9uW6nJ^g0UuCd(^`>E(g$Lxbbski^y7AY<@(Vq;3PkuZXM+QH?7nIaz`-APdmu5Jg1 zdp|J|c5yC|nMQ(G<~o^d*4a1=UeAHOIgAag;m==8@dVlmoVEx}6ZHdl~{4w&K$mby5Un+8Hq%krr{Fm_0!ru>nBYYRc z{W}6)04u{9#QnP?bZKZGeA}N9{0C_Me>?ca;3tCb4IT}i1M&Y_g5|*(fj9LJ1b!I! zOyJT$PvH2#bnExlqt?f*qu|@W)(ZH4rXTS?;Qz3H$bX`L9%v#w;kyaq51ip^@lEr- z;(f&XaqoHhS>D~=rCy);6VO7q-0X+ffVswRjE9VCjYGy3quMa_7xd5QtKmK1QSIZ} zL5KmcTnl=B_pmlEQns@i~cHPxwrVD zzr>BzY$@gnU-W0B=EYJZLXx`cu*#M}nw1J4IEc z$X7eEFW{P2~v9%V%zc3*kX{H!Q<2w zi~OyY)`dz8Y>?K4ECSX`YZhVD%+)Dt6?t1Bpx_><*iX(Dcq1r&Y`bMjiq(IrOi5b( zdxUPa@5Re()#zlv8@$LhMPloqg{q8tZL$w*o=uK!rxGR zpF^7(M@HQZ|AtIoc$~}XS?CJDX1ZBt;srC--Lbp1dmHu(*1cmQfkHIU8$@6MUN8i+ z2||;|h!TcM8~$=BW9B;;Fm*0eQ{1TuFzT9$87hTpn&)8F?J?&=Ri2OQoKlt}M6xk7(16uoE4__Hhglj{ugH``+ zq07vC^r=uH)Et@<{9W*2xYr*Io)TObcq8xwu;M=lzUX_bA6VC0qt?mREdMM1Z}~q7 z{sXRq*nqoYD`T)BGv_E`JN$@ZSJigFAf}`nr9qd_~^hc)#ww z);r_>Xd%T-#^+Mc%)g)+KDR`xHD00>$s9d?c()9QwC{~HQGP$5lCDwkM zQ+xR&Xi_0XJ$_UX{}dCS1T`v=K9dWoQzHFa9r{(1pe3bfT|M+t1FD50izh)r3aNpD z%G*BV44TbcFbPUgIAmigxi6VY!gn*Q+e=HwCqV~FVIp>(mT-n0!|>!9rF50t!w~Xi;JtA1eK@N3S1rFRyF|e zpEGA!JPCSF3ig_STr;T_`5az63A#@TSR=riSXi?Xh8oex!kUyY7``Ud1n3h|X`>Q` znp)4o8dR`GnCeY+EUaD$gO)aOEv-|+prwsmOIIji(9%Y(rL{^JG@+4eLX8SWc2l+q z%at&^0kN=UN*G@IENrO~22E(-T3W4y;kD*ci%%|*7wq-UP{t>#NN#$3KUiiS#EX>X z7Ee}^MGE1?kXaR4Kr}NxY1=&@1^J=>kG=PfkE=M}NB8VGTh5*>-~t#KH(AA&Evwns zrn+Ga7!0n|WhJfTwaUu7k}MevB%p0H(?U%`LP?>7-oYURY=v zcjlCtbLOnLpL>7zcklf~f7yGUnR(}(a^}qYyzhHx5>ts;PbZ8_r}?`eTS?#2#oV(! zMj9rkP95 zDpxZSqq{9z4jinU9(pY!QJTYsN1A?IPy)^htGj{D&I;Br5}`cVvcx$7VSFmA3bGEevf_8I7xgyg>LUftoZkgAD`A6He? zh{A}d_gOI5H6xHF17E_V9vvrav0}vQ+#5QL#W-U`qCvQUy=w?gJwgl%yVt}{8SzjK z?h)y>1mq~90iRKP69Q+|0EqQpKTUjv{?||Qt84#P_-Rf*D{ZWHn^z~!Ma!vdq|!0* zrHRJGZy1?Ix1zPH7n6z4`+r&fp;nO@BUAOYA}j)pTiA+`DYS9s!^nC%d1SKC9l}Du zLK=70>3+|6IBg!<-`{5~v8s`M=nf$aL1NV~ePkllk|?@}1*;gTaA?VEI*(5s*_(b# z9GA?bag(-EHJO-cBNONj4T;9vja@4Vr`c39m z2*=xOA{3kB8It^R%oBYrdQ0@|Xh(EWbRw|*?}`+_+P^R|5x%hB4(|$IA3i&r4zCP1 zgvS8i|8?!x+BI5U+oY}54%B8zOQq?OA8rS}480TD1u_4A5jrn)YN$7~GSm>-L;Xg5 zM}0)SPCZ8*RF6{+P$vYx4!#z=9r*ue20Md?1?L3Afp-FT1kMhe1h)U({2%!r^Izw` z0`3NS{YU$oASd7(kP+}K$Ow3_uMTnoex&>kya8@fE>rrIbr833Z}}T(NNShghU|bh z$QR4o_x!0LJ|~-Buf6}CC*@w zcpgYDZ3F%BuH-O&T1^`J{$%9!kfSo* zI?w?hXQc4Epx?1dCA0?f04Vx+j2QdzxX2i#63SS=O&R+aDhhCv@SclABZ))ELG!{3 z=|CJD8+2}!*e+nVZY(rlPAx$jge<%}_?X-0ZI8IJc zZk_%ZI7}~&SL%R5mq}zdTArMtCPLq7%gi1UQ9I=E$~6Lj#q0pUPxXdo59yg4?%4}M zje2464km{Vg{TEb!nnfF9p<^2Q0J@%tc~F?&rRc$I*$b7+7CJG1|X?&C-9|ILcD?^ zhL;^W4uQK%=N`c2lkj&q_$D)JGD&RWzz+Urz2yUwdn?UEB8s+_{^6cGNw9rvl~jb` z6x+J8(6Z+P&qouW7&e00DDfz3oPq1s6J`)R=}2|zAta2{u7Qrg5FtD|o`TpNgbT$z z!KkX3H-&VpBe2C;v*Ei2H4hR36j$CJy25)J$(unjYgb^kQb5{l=n(`qGiFHdd83p* zX{2F++)C2N_MhfT3kXpPQ?Cemv1#=cK1A z0}qn5&83W%uBOfd>9#Z^*MR(gaO8{krw7_LT9cETdo*Bwn-kBjgpDmq5;qaH(jLr* z+mq-5JC)!TA7=H{lm_ckh^@X;fE3sHW4dD5I@yXk2wQInc|5xnrXe-9L8?o6Pv1Yt z0NQvEu&Q4etIY67OIAWxa3*Ez`-l32A!SckN!YyrS-tw}&p21cjgDs8{^$=slZk*LuA|2X}89p9<0Ti9k0~rUA8`Ey(5%2j!nXFLV{S5&n|F8 z;1)|Cx(eCJe-_=hNHMB?zN2Sa)q>`Y4^-GT!*qwog4~d_dV5`-M7(22m)o$6!x7)R zp1x(Rhc@?nFNEdZQ}4I8-rGtB9_niALic>|3uz_Ot1Xpj>rTeg1O46bTGSsU!pa0m zYD?7*_jFIMp(U;RGw-#uN!tglMOoxS7e5caKud!OH;i zx5o#1yLut@qh8TT^aXA_gqtwPXRJRvkuL}VB?%3iYU~8sZ=+zgFKPDic)rf;##9ms z-bB&I*@|sUf?GR%bS#-{ZAOhf@DI#Tr9a)k3)4eWF6$51lY@a-6q4b=n`vVbY_lX( z1L%DnFH;JR9%jR9d6_y=LtxsVGOgh&P7d{fOc)Z&lxwx_o}p{E9gM|#*<<)8@cuNO z98D&HDQ;^wYy&-s&QzOTauu(ML_4s^VaL{=9;H9k{cc$+J0t?Tn|C18(>1vmm;=wN z(|Jcu9WOKi1G;jq(uw{edfPgB8FA5dF$zPeX+oLY@l(lL)ojH)4m4Zu`|-+;TtE!t zVZ8D~7m!82hQrELE+Fo#bfw(`2po6?q{*3TyWKU60yn~BG`~O8nQEKepN+z>uTBrz znJUKUf8J8O!2!3OXrSJNKu!Tu?ti~mb_9Bq_58yFvHK2Q?#87_o3h4&9n3j4J`Xb)-IwTyP0)}W0Ey&HNgbXDlI(8-~Bp}o|v)#udP z)QchC-!W>7>W6%P4+XCdem}SYq6_>sc17&e*h#UL*dEb;1`m$j6}>Dt1|s|YA#fW+ z`R@oE8kiLD_}}*5<-ZJ~4;}^42gmyU;(O9}lkYrVpYIr7lP{wDLwQ=cR@thYpfo6B zB*InZz>JOu{G&VFI3O84RN+#ss{%D@9^TC)LT-lAq2R+^9kNf1{ zrf!A=OpJk6NTG^%KJ|Uc9`pJ59Nf~O<-iF^9jSg|D}t`5o@w$nWqXVen&f zd%&$E;v47pn&`c95M**P{Az5iRs(zIAi`uNJc5BtK_DFb4mHb7&W(kEf`@jdq=~4= zjd9#hN>hwm+=?6+;gBP+;h4lQ`D}-S3-c6gZZ-yi^>juKENhtC9@!}ydQ5|cMOKhQ zRy$x@voRv1$;Q)~9GKA17{k=E4lmcp^aP1aWOWWKXBdKrLF()sykxV0RXMPf;d*6& zmS7fcd=AWGCV|BIeOeAIVz~HVEwvA{^}}a-9Fkz;JhwpmbGz_`J2~m*) zJD6R6W?w3DVD+-=WRjtii8(NIVT7#>%}bA=8OEW1=HrSS*tzUgGf%;~WvkkIzfpBf z4lG(u0t#hyKnE;jMGmZ6wpQ4uV9&C*a-Y#k?Fd}IV=OBhcZ8Bcuo)9tF>;!-8RqFW zXEXO2&CD1%mCizYGn7+;?U>k#kyD)QFi*ES+quVRr)FeWs5B&M5N?x+tQZ+`wqic5 z8`f`o*r++pt=}s~vQAme zQgtI4S6Q1u))s8zZ-zAEN5HIPwQ-m6d(B9PP)fpt!5VHikQF0Ir!>sdcBd|GGs@PC zw24}wL>g?xL{^NnI$JTH){P|G`rJ&|HdxmiMynMgCp%@j)p%Mn5*Ny3)?*^akDSEn z&iuV%0p`e!Q@CLI%QKn8=EeCkmk3)ikrgBB zovkoW*Ew6c*=hyC^f_mGGod13D<-mH1Y-5sw=DDNf7zcrqUHU{jLkl5y;?7_q-MPZO&K<)nRWZ`z zZ2eAaU+NaN4!d6qgx4GPn#hWgE@vyu(@oA+?yy=(30onQQ*6aVR*YNk!&{{|zz!t_cr>SA_S` z{;IvIJ)m8t^=qrNTJZP(D)dU|_Rw~S<-a0yV5ly%cSu&>QlEf${+9=P)ts7A7lFkTA(BQPdH-T3Iw**RocCh#F<^Rn81myNR)xXw1$FKU{@jd9f6r%ne?yFM% z1D5_f1Cd|M&$}<#jM=i5Zes|PT3*~c1EwNAvx~vN1!rYLSVCvt?z%0qs z&&t3o(bP}Nz%1F+zlnQ*nY|d%NU9oV4-myj_L6&Dj9?_`jJPgFt``J#wa~G&S`5kV zD67Sg*BxcG7?Rvki>AAt(8JY=a3MMHJJ4=iKXJ#kBZu zcNEj&H)0fOf@$%os65%)3dZ!f7h(i>(jCPJ@C5%dAn62+Yt^`Qhps$a4rdvylwX&_ zS#~RBM>(8jD^MQdw{AYy*tuim8cQ$8K=VJ$sVeX?I);*&27&d3Z`TLWo8LfK@3wQy zg7Ho!dm1CzGiE_RSOqWLO|FFc%-d&q913Z&-H;mT`C|wIFazIl=`!EVn8$8uqCWv# zsBX$M%d#wnTgkdhbf$YCh-eZ_c3?0Sr2Tye{jb|?Fpwc>?Jf@rAqiksrhv;+-`3Ho zK46C!Gr{bh@&Gz$GYy$fF-&U$4Zhfo%7_hP>AwV z=T}W~=cvVa&D{K*if|gb3Bz!RG-ON$V{yrOwErLP+2w(3e)q(F5Zes#|E5L%9epu+ zQ#23$`uo8hz+WPdM6QI`f6F5k;ZMW&hV$WL!*jy2_MCRTHmt4GriMNV-5)B1)@g#xyjSw?US`bdLZrCl3a- z!wCY_+6!;9VW6#n>q<7BXcXD@>+@h(Tj40tn@qRaL5Qp8uMku+pUwDHDt4LV4_>57WJ++2j)B{R5TrGa$wIR!)wUUmYK)q ztTiXjj2u|_$dFmcrUtRB)j6>Dp>^HtSzAWPa+#TfE7?Unu(2U4uC+D?H?&;0+A;tZ zEsNS5m=K*%(J0j9;MUfr0jO0l0yA@PgX<8s2e=dh@QfT>=-SlP*wB+05@4%yaHVTg zSEKa~v8HWx4sLgCKyWW{uEpvcT=a54{_DUT)mb^X=Oqh)W#3cZ0ztivIk@;mmXMp* zfS^ou4$QVh7PbiiaB2>$wiqwN;0FpY^*ONJ;(lj~;Y4Fb3kuB1fjJkqRC@s$yGl@^ zJ_lx9Q4_XMQl<{4=fKj7PR|f{NDlxdT58jBVB$q4hzS!kUYi3;FHT%Gh!F%C7C>uq zVCuz*%RxmgSLML?i@PF=6x28~2WDWL;H}+*@t#ibG#O|G&oeHEwb|<#Ij{=j1n0ob zb4BxZMh@)4PHck+J1qxRVxp$h<^i|Hr{};}OjJ%ljd9rO1s$4_14}W|&sr%=0IAG@ zxfpqNt&m@?DNb0v&h<1g2WDd=(X@873M!eJ16wi9+}32GXP_@G+C8S`R&yAUyfbsh z&;j5Qi4SoJ)tLb}nkv->7FArETScc8j}<}db4StX&q48k;4%>!az|1JUPl3Y_Hk46 zhTO_>MXWD1YwK&s9pO^Mp5L2ktRPSL1@_s^Q z%Henx(xq)l^lfz)VC)t^Z zZxs_u=j0BiJHLtUN@pQ;Tf7f^FM*WlR7p$jAR4&CUILv)68PyZ>_BbqKz(r;V$p^K zEzHOrpzFnerkY771lZc#{|+xrXtpW`c6WTQn6r2;3V!lAMX}Ja-B$B@-H-~Q% z111V5;Iv#lU!ACzn(pC5?+|>x2|!bFb@Y{*0FW4h_Wy)b=?R_) zvHNxlO5lh8XyCfQ8G#LfI{!c5JAK5z-e2SU()YOUN?*!%sBfC`6~y+tGS(iO5&b&) zc=WPpD!MQl0H(lmkzYiH)#cJQ29VR zSvy!8ANnw~BXn`7E3`N?LH$(Sss2bEP>)b6AvVDC!Jh@UDGw?ak$iu9%Ad%OLWKXU zd>Dj~{ipXC@3r2o-c{Zj>09Y#=|<@sX|r?~bm4#1AMqrytUPGrj-%z5vFeWL8T+Ig zj4|v2>{^J+d}FnL3DC&&3vAbytYyPZ9$e``fONpLnT=fs6rb zSIAce$k=ywg%sjPEU3|D?cJ&Vy&RH}a;N%PIV2fc;Cga#|d^1DNQ zxeSnza)I)*E!wL-JEtdf@P45bM%K(|CcZH-fK*lt;E95By zWUO<$)c=TvMqm`)seV!p$#iF@`qy$urawE?kBRH1IW6U>V|u9IquiLos(gsJ8ymNU ztks0saODDVeHEhM;vK4auu+M7g?F;TtMkB1>TSd&kgd|V=f)D;9WkJ9EstiehXH*H zaRn6BZQOJ-cj(}oN8K6A;+Z$`c;zlvX^i?U<&9VFT%e@Iy3y~e;aw^)7D7LMMI0eT zau&k1s4~IOJw#%7X^s+yXd&dzTaUQBiiRQ0F3qI-mV(PN#t1RI$h!xK zKQP4;U;Wj|{sH1e4NiSmP%mpz85f{H4-+z6Zv8Ub%ue;Aa!6*M*{Oc$vLV@+8#~nJ z%K({OW{3J*86dOC>`z3|Z?z9is$+_38iL~$B53(;~3uW7>A8??I*<#`n>lg}oRYS@Q# zzt(3F?NAva2=wTF`axia+Pie03(VH1dz~;*r?^*vjTACYE|E|mdavkH+N~W;O2T*x zU_#c>s3Fk3dx+;e`_kdqB=&CJJqp~`-MdI)T4C)*xA_yweczz~w{q`w7szPAnh@ia zdlo92T{OfVHL~FP-JZy_n_MK&)SdH`)ORRq*VrB3v6xMBw>yqr=D6sBTHP8a7xDXl zoj2x*eHz;pyE?Wdc4Vw7`c3qu=#A0uMb|~^qMpd_A~#0Ph^&v)h5r+NC458pjPQo= zOzj)(d9eSVp{>Joq~QEuB=BC~ zzQBc$-EUD~y#HhWqyEeNJ^rQseSDumZoeP-hI}i1la()&CzT&68Ral#y8M;=JVf(5 zLtZa8KwiJsy?1yE-jgAQU+jO?hyH)-^&kPJqk9;f>%lsL2|Iy7Ew%| zP_E%y91ZIzTf@I{YdF!KfOva@7Sl6yGcy0U9z&Hd8_~Yy)X%jJom*&5(rZK#=+)YU z{b?Bqobvv}rDB1w7m9R>3yqWX0+CJ;WfOC|Tf=<&wxHKU?8>`dvT>2&06V4Us6szRKJjbm%5p7L_;Lr6V{8y+_5LDbF0uP<5~x_*;*XDm{&O_JOg#Cqbtjxonl?BP1UeM3#TDxmU{EB0XhwI4Ds`FBNmr~>fOe7o1ygm6 zNU7qfy4nruZ2cGq6f>>TgByH}Lg+BVRVQ?L8K`Y5z0A=kT5H@^W!?>Et1ssmB&-i- ziLJr`SD>xNei4w2rmaSjP?I~^Lerx8(JJZ-j*qRvqup>e30GkjR;%H_ACdomqUUK( z?0JaKw<*>X3q{|F?ucFz?TQ`{jYZyz+#M-K;*rLP9R5@I!SIj5Tf;|(XNCjXJCFh3 zaxJSJ2K@hjhh7cc7}^#(Dl{E(0zRq!6fF6R)ZK$01n&x-1N{HypcZ(W@c%ak4g&uF zXAs~28vn5WaQ_rw7Q74|0K??#{}bgA*YBR#s4kuectoE z8@-FYQ>4$ON2QCU4A}gqdAL4x3b1B#?fgRvzf3r)}KBv2jY!o;r40|^upPmOcC=V0S@Tcd270SYr-6CIzsyq-wagdEhZ5RH=q^ZmUIg}_RISkaT{$Zg~ zs`J1KMYeSp1aRCO-`o`MO!Tn#&_;FDd7y-Hz}BSDZDmp(2%$5e#!Um=DN#+ec_4tI zf;V+01~O@ga=I1BjLjkv?3_FhKaq`XLN|5d!pg+)>bOlXv!>^P_lZh0OC&@?Qk4g; zCo0i`2?dy*2ZASG9b>04Nu9NMAa!DwQjqTyrVQlhfS8QJ5SR6NAaml%0=LKZBn-?Z z2z)%;njVU0(ws%bP<&k;7@fGX90eHTk}1iIJa9UZI&DV_bk&dtO6N+%wkIK0WN-7* zcs9}32dqKrLnJ6tod<3w&Vm)qD`EJ%SEey8qyRWM4~$M+v>SV}EzKfUUUeRLoLCh` zeoil5wyZBRkQL7tpmCyd5s0QK82jEte1)LZx;$_=QCB?Fg{57S2mU59;th17J>8oU z&BG~qpll*Byfc#l-(k@nRGSB?CQ1ntbf}Sd2D!1rEAznA#Fc451%0W?14$F7XlF8+ zBr#US9#_?Q;Ao;AP28fUhBbl;tMfq8v;$WPfK_>&r^(hRz*Xmgr^#2?=+ZLKH0?lf z%fQs+`n*W^0-K!&t|oe=bqr*a?H!Pw8BXi%@%D6IpK!~m&I4-`1>o?4F4g39;-&?3 zc}>*kfw+n5*h13g-FWXcc_4A(Y_kfu?A){Sz~tn62V`&e-Zkcd&xu|(R?UD%@~3;5 znR%dh;v3jeMxd4IJTN_Z^@-W%v-80AobEzFL>VvQW5;Vr9OHuJVrV z>_BgP^JcM|M}E4WxPllcLFcRUmAaOa-KinydyC74R-K>50O5|h$pu)MpQ_8&-UCsf zA%bv5(C+m76#DY(Xzy_vB+XaOl>B76Id&vkhr~SXsrgBIFB7f(>HYzcGwYQ6KD3%- zW@`dYEJA@MQh~syAl;jcC&gZZ)%gml2IMF~gnDp>%|IZ3=P7q;es3yP`_O>fW<4=K zfx7YlMo`7%{9g1u*Pa?~5+2H@=J(VaL23n0d$8W|d(b&+(lj8BRdYi}_kf6PUzZ;* zLc5H0O@18Rclf#meW}Zjb=KR|=qkk+5!zLX-JMc2iOy1W`P~Hdy6Yk)Lc2;46-Xi4 zaBA`qJJMyHPtAv!@#R@D#`sRpYjonWbPnfytjdSz>yP6{IB|3HD$PkNWG6Un?1mV# z^Fg{ji^>TmL`yzE9b8zvK>>AdW>(%$_f$bKK`S9|zvl$c%S!Y=(bpmW-$?YhXkFwR z;PT%X*#Y-57~|DUW%QX>=n4aog3#jf%=(9JX= z9!9z2JqCVX4$8~$8l{us9%jVZYjlLD0|9>L)+JufS7Qzw+l!T0xVlFZ3!(MXtLUPA_6R(~tT zSX5BJJR-(eEKtDwMvSqjkbrqujImgdfcdqJE_sMBo*%IP$Cd#y9tyicW6A)nZbFT_ zmjPOR1>kNrTCORh!`tIu<&cb&JJqktAsI1us$Z2uGIH)z|LM{phquRDWq^#7JJdJJ z02v{7sDCO0WMtf-z99mFX>HA_wQMlC$3v6K0GS#e5A9P1XiZ1;@z6vUAjXShdc7+Y zD+6SDy(<(g17u{}6^fJrGBWN8h06e~bpvx!6U_?HqdofIPW8)jNTxeG)&D7nWcssH z{YN<@)1jT}7v+#lk9Mk`yL8<_Y5!vxAk&{6>L1DgneOaRUoQh>db30QeHkFrnH}nD zA|Mz)Y_SP&>X?lnHY8fEY^bYkEN;YNQ-}L*! zisaX9oz2E8Pmc;`ZXd@hPmKy^j{4)3Cr5=dXY%pN6SkL?;M++4fuKtK3b6XeN$~in za880<0tsy281f|!zefX4$608S2-x(iJgv_*F*&{u2^{glF{MZLVRr0+PP)$=%{dJo{m@S zCscGqwp|a%+nqCtetrmMlt@}KqfA|J(mo=PmWOlF{zfn;F7x%#a!`J#e_Ia954HWU zj_R_{*Yh3U8Q|M3_|8Bha|6Fn>Gu-929XcGo_Wz~6q+X|PRS#453Vsy)b@0Mq zdvH;3&%oaTj|F}h7=UE9wUFiS_x_vxIseK2{r!9RKJxwAcL_um*x$FO^0IQLa*5Kb z90lzEujQxYYr+1%POgT$ey@3dK+bfh%h^M&VG?(=_I0jx?G zkO=q@V1xr>C9~6;H!%e;DB(r<0Esg-8|;8RnK&A^nqbd$-uToMz`BISgZ?e)en`@u zjkk6W2y3n^=*Fdfi2VU!Vups9_qus!TV2p2fS9Nz@y%^z0jx`CtFnLs@oEcTT0-NO zfts65#Kl2pY71aovO^&zkD%7+1+Xun@s+7n0GnC>>k>v&GGGEsWkC-CqGQ?{n2p8M z%CrKQm2l|#Q(K3J;$5(sMMD9$Br+5PlpGv(yE>j$0ArF>9UukORTaRFgeEUYCkSTX z;dmw?yhff~0P_*f7y}2l?U_^;W~viLdYoPWBN9=bUT;zu^<;VhY)3pyG!#_@Fc%Ri zlVIM4HhaNVD(FpJ0W3vmfbA!^LT21F+TW8kiTXIaT&4 zfFVeKE}BXQ6~Ow_h0XM5AdTNZ239!nY8!0M3^&G&wAAr|o+h^_Ed{U);q1Ze@cqfO z&>}Lk0Hz@{<6-QkWSXYp>`yier_hW7n1_%Xz=6R)BG6)O0W3tQ@N93QkL+Si@kQcj zZM6k36WO6n!oY5|1uzxap^ZXlWdTe^xbav52*jLP0HYDE{cI1gCm_GH08?22s}ZTG zE0fv+rl7cJK&uL1G{PC4O+tpyw%)e*V6zA}qX0G|qC^9SIgopVw1LV3*p9H}Ou984 zhZ&F&O_izwn2@mLOsX^0j_-ihRHvXHQwzEw$-oIP)deslp{15!phXOJCF(|10c=QS zqdHJnAy|*t3VR0HQlbe{T>#?|3*4A)Z53~LU^il0cCo9}6m*M`(Us;*JCIZaGEOOg z#R%CMI#K|sE9hpTOtQBN_yTRoc&4KfOw+85l(6wS|G;E z0@#Xhxn>fO@)!6vM>auhwBF8c(Y&2g0HYC-pBOMP>bsVhT>$$Lz9Z}n)q=>4VU}WSh&zyM*(*so?c{ zjwYgly__uu-zpg1S7flBQIP0nVQ)(ySAD@l2_+U5_{zhOy&iUdQROxH)9KrjFCeIT zYW_4sElIc3%T@Vpx{8zOzI69+yeFLyy%;CvPo=NdG`JW$Pe)Vpr_iQ)w?MeBxR87| zEx(n%*>p^^XjiPx57Ygmr!S5aoH)6o5VTmAAEJvD!c3<@6|l7F$-7^)s2cNIC|AZp zLySM1$D|SA0&mO@mMtR^e_DQk_7SS>YzKEa(R7`j@29Io2f6HoQ}bD>(;l2>-3vqq zw3+z~-C25ILWANvGpY6#w}WX_els0w7A#P0eZG%QNd`xbD{d9f$fxOiw-*ppK0Dt_ zH>;J2OjlDJHs$zQG^J5!x(?A zH{Ju80tB*5&v)^#M&Vajb$*jRCkY1?96;gKpApnIC!eBQH*P7%!08v5jq&~jhGR^? zW+*68o!@9x4J9B@WmXuxuQuOF_iVCT!JY-NFn}{9=81IZD+9%ad67x>L5gvg-0Ri( zq$NR$kg?-EqH3%1?fUG2Y7L;EOI7(c2Tl}0HYDxx^hg0utQo%h{}{bHdQP;BME(DB zb%A2iQxE1iyh>fj5JX1@8`C85|0p5L^(P5cqrG z<-kpWV&J$yT_EcJyZ>4L1ODs%7x}mOTm6SYM!-q_kneNf+rDRj5%2@wR^JJ}1AWtc z3a|opDK{zG!CzpVGGCb}e=EN!|3>~9WDV$$kCt2Had2<&hW82YBJW<(7tqaee>OKP zow5f0?{HOY_^OP#%oWAnJY8DNyQkB-TCz|Xd!zdUcNlxAbcs6*PVS~?7spQUAUoS2 zzv>ola_iFz49!Hhi4DDoxn&rvdEI9%PUSQ7WMMF*A_{a>0^7T*Tv2T2u5?AQeY?UH z#one}K31OLUEZB;O?0mYmP8lkCwd5z5_Kl~;j6tf4z8K{zXlU@7@Ltz6=_h!kXqp@=))fY&{mdS(}j!&=x7GV5W-E1B;)ZN#V<}Z&>QZJYLJK-y}cg`&!-xpf#|d7eRsu zG7(QU%N~=2*BU9CGRxB6Bp;c`SlKEX70$vYF=r)dhkGO`W|1RO*?u#B7%rq+$@0V6 zmT$ELZpA!fq$1;2NoIgni*W|1%jdJq z&5}olS+d;3YZ{(Ah~~fIHO-OMZ{&-McM!($dZ4njr4t!Q`(nKO zLxY|D>@+N=G!NKUBMF6X5pIT2^C@CQO5I;PvC z9Kk$q%;cg{BG6vtS)wY5!?~@>tf)!?v{#uCbsJsNZ8auDO(V`;;mMBSf#74}kW_cr zJ_$&iGK6w5NN#sXs8?u{@HX4-Wkfv#yP06Gv#(bc%{6~Ld~jaNjSdZ_hSl06xK7k{ zoEpwBSN}K1UBmc)o!&N2>~9d&|Ch0IVr{X*fdk-=z7f44T8f?&T@h`H?gniA6~Na2 z46OK<2YLgC1SWzH|Kt82`}_Sz_@_aPz`sR)AGtqrVWd5>e`I|4qwvGw%fg$&i^CPb z6nH`VxpumCv^GQYhJF`%0wM*T8|nxx3r!2f)Nj;J)Hl>8)VtKn)U>)3vIc$?{6p}! z!K-{<`~K*A)b~T*fNza&rZ1wrr#uc{`+4PL z_3rZC=)K%~I&|m1fB)~%K!vieBps0$PG&GxEc*oz+HZo=%sg8>km{zN9-)O}lq%*4 zd@h6*R4C0}FWkz52RfdE%mYx+6Pw08Yo5zKo60}q%1z;(G4Cd*b29&oD>sRI1{?t6 zFb3uJ;h%BkCUVajxN;RyWgorE*xmW#lq#?Hh(v3$dvPLzCsw&4Fo#fkXe@>}z1WF& z(hCec^_pS?-qolliWmypF9QwzXOgnO>*b*A<8MizU;VM*wn!fD+k?c*r4Z{4K2H8U zAwpS^Aw*|rC_bJ<>}6oqIi4JsX_VU6iSjHI+t6#=Gvk;|%l)3PyqLffE>esm5rG*T z+raM#UmLUR#(RbmY~TQeomCyTb=0etTCse)usEzy0np%2aro>IVxtRw7OCPGf)C)Q9y-bn`dE z*ywK^bKwWx*T&Ed&w_MtF{$6zcBgLv3m|@pMD6voCbL$IU}$JJy2+dMusV5x_6?sw zPv55#mkq0f??;F5?`hN(vde*FkMe={v?!g74j3P``#mi}r;Y=MJ+^0Uc~7HWP0q$` z6X!jRdNuJtu@WQnUCs)?s_A)NF&IY3MKK|L(DcYeCeo%Dl~;@jvnwXZE5^i$6+=^4 znf*1<4#oHd{ShlBEI{ICC_P14^Z7l^C+ImMZ9P{6Jx7?m=dz&Zh!gjm=4j%3j%Y{E zC4Qh$MeIO7M~;t1J$mAaS9VkOfhDg`4p=Ae(H#N|QX3Q9@c(zGDhGMJBzTl{9^iIc zZ4YIJj$oU6mNa)*x^;D5vW=Lw;Ivv#Nb6>lCmLzWrQQ%({5CAx!ZRdCfeGMZQMuGf z=cc#_TlLdqBu!j`IgoLE50aM#gJUasioAx{hxGJGGl*HgH`9?HztQ zh;O^E)i>8CLG1sFm6Mbzi2Zk$e2RR8ypQ*D?{B;pcoW`w=_~0mX}ffiRPXr`#I^pK zi$J#@-JMKfk*0cfZ=AkBnfTfQ%K1z@4# zfHXEV9tsTo^61I}@K2ioy>%G8k|6M?!(-}HMME{#!0Fo(E#ZemY zd~jiMPALGj)M(1hK>`@1M!#@N5%g<%0a&D@wb?Y}te7`iQvlv5Q6`18bthmJhysqz zE&z2Dry1lo2PY3=Jcf9ZK(T6^%UFI*#m+7Ohg6J*yI6C#H1X35KqWO+fV@3C~gsYv+V;07j^DxmwIOvfIx~bGeHqS3)2d%oEYs31fZHiLe~@RefvE4 z_7oCrrxi}-s}m*Nt}MjqGBHGC&FZFtstYGkO%A5vRM!-5Bl#!=(oHX%NC#U7x=iBA z!U?oh9VYh6sw^DOqlDDw%EECRO6<5bvv4fk-N0e4KRFcdO~4Iw*L;ppV|I6DVFL&5 znh*Y+Zj|w=!g|UQ)@vqUfokds>*$uLa^@`iWw#i=YDN+-Gn7gX9%SZs@(P^7kS2xa7( z71JUD=*+@0x-uAOx;vW{hET39ETy{!1MU<#-8L4M(DNe$gtHe>gxlye7Z%f#s;G>s zNV5uyY$_*TYwjvP*rsyPt1IOFx#tA$Hc#x`*rN~u;3wWkVk5u-SQ4v?MWcU>J{i3h zA_1HjT^enUPKnBq&mzx6u7-F3M@JeWk?@D%$HG4ipB3&1FNZsUueH~;Teb7F4y_qt z0{l7jQ0R(KS7=43CKOWNR-aLCRZD6+L;&0)_+jvY;3dIL!NtMd0)GnJ95^MgG@$uk zgPZ`T_}BPn`xW1-zMuQf0L%YuUqE?FxmP(?i37(!0@42-md}R=h9mc6W~UvByEX3m8H6~tKjtBO_+e&0wX+P zF}O~*uLj2?jIRxr*TA;GStMtxSw~>sz&3ILXZ%8$;sy=ebD8Iw@k*T}8IO+ymMd6w z59}f-IE`O1mollpIk0J}vPklp4-&mV9tW4Bext^2&-eFGW?L05&!i#IGSs+fA7z16 zkVtN_(Yrn0BbQ3x<vq`3g(?Ccp z8&dL@h7ClAuBF&6|CI;~t{{dlmR*9k^}0Af9A5du{N=Nj*7D?v+*X&3kqNLIx%#%l zz*W2re4-qcj*#nOJDMEo9oVzTb*LR{yUPa&&Lp$Jj@!tZ>;d(CA&N6&0qT3gPCG<9 z!`Tg_4Ql)wU7qG1qH^i&WXGom#7`^m-j& zyDodRQ=I+BT6tymYFouHUYotzu(<0sb@pmQ`ns^XuG?bQ!NgpO^kxThAn=ja)2PJx zPU)rAqH0AYy5}oB!V+ufbaid2izMo0^`|$r8oA7_#WoRphM<^>ksUgfB1w(~MTFLN zD6rA3z#(9v6)B<9O>M5-=x_|9c%!1sC02H{Y6%uaQrqH~KnS(1iKI5@*jx}MUJ^-d zz_BV3Em{#tjgm?1vf39!Qp-BF4Xl%24@oT}MDfcZscjZ^x}Br%Ye}t-n0FY_*d6|3 z!U13&f<^BmZhXMCR(##%tLG}_U2x@(^y3li+TdJ=ez&dQVuvpWrUO4AA1-uj#5bj3r&jn`m@<(%;%%~F}rAQrhamO zp|h}TWgnPr87|4}ZKV7jIfSCn#$&edyY{E-MWy_XIS-(0&k(uEh&S~z_X*>DwIWO- za7WA=z45*pQ@2o0x3HRO0mN2Im8l7+g*e69M49dY*lMWMcP(3jG8|_I72!jz-32Wk z@@ZxV+>)QkZi&mcJxzfmAp}_u!KmLvI0QX_ z$8)YUSK3eiq@f3J)9H2Jz^P>8(@*BBsq<}CKPsm?e7NV~3T3YOn0!vI1=C*^bldGYBNV&c zbE>q^BOM|wjC~RNbLXuKESHz z!swjn^vKtd7a~88oF3T_nFIL&-+@d4*M+|y-VkmG`?Wu6cWLKBjDVxHeYG*6FGJ4* zN8qQBBXC2g7VZPyQlC}tSFck0)uYtf;JS@+rP{|$@fp+({ML%mhVL0BH!N17vL3et#XEPta79>SJ_kkTz*-; zQ@&2VL@q(>z;5|?`Czyy_`7$f_a^T}5S!pwZ;N+tuTOeYx*uW)4oW9TYo)d1nxGoI z_9-orA)4+bHv`Qs3qeY_ec1o|>GI*4Ji!Yg20N2kX(9TjuE2j&Kh(7=K)F&Dy%L3N z;@^?RMxzpI@I z_N?z?-|ns;rs3WAh6!=g|2w{6=0fyk_6bMXd)0qDQ zDbp`ufPyZQ1!;e6Xk*B{v7Yls&E3({m?zOb(;{J0isCz=Ux+P&pl#7+wcKP6sAPq=Nvb0~2b~f#2Bykq*L67=8!Y z`{{G`6JcCGA@D0~YR1?Qxe&wmQ+DaP)n+;8h**Yc)7>*7wwYx5Xt zJ!Bpc4eK~pC3jmLF5?Fg>#{oR>I4znWQkYK10t51Bp>8X#r0`pA>fTI&Fix`Sy>Wp zpdP(%O-`vh1J@VAE#C&TR>3oKh>{n)O9Nwz*Y1Ebp60>f7L44^mAglOO zczR%;z&*PEWnA#qk7BZ|FMzLY7G>4?BrlYZX6y6wLRse?`H7fZ$q{VPk$e+yQy4Ej zxWR9s*IC@Y7W$Zsl>pn5YzIcGX*vmggtJjpDPP}*ZuQwcum6Hei>nXsbx}%t%YVkX zD@5{5f8bi9z3ulgOu(jANPSF~D!Jz4EBh4BI}F73VhR0?OkJxAzVs)y(slv2_9M(8W5Q76`}r+?BBasqkTzI3b4F694EeKPgAjnF^n2nmpU(_gsOXm9&-Jk@PV z#1C8Ly9@sbHyU`V&sJN z4STQ0wP)mL=0B@mipZ0t6_^mSBhi-JFhSmz{I9ov4cKF|aN9`2X7vr9zPntbKheK| zJ4w4x(lVHyMn1~uPv&icXUE?10=?)GxV`L5XNC<6>o)R5M+(S$;aMG1b9Nt^973tD z!!s{B`6eI?SbMx}V-iA)LC_fKFL-uX(F-Qk{zd)7%X!JhL@xyXf-k`9aCmK5sYO?8 zJ|E6t8_?R49>)U*+|7U_5VY)F_*@O*$0q%?BTZu0^kFb0@(H>I8H#v&bEox%x_gE7 zZ+TDa-_i%j|3BPwlP9(-c0ug8*!1W>qK`!{jc$y#ME(ID{o5nSNMrch@Xqk|@Uh`Z z+B@3Mv`yLp+HRqDLU)CVp%X%LLSFFS->$Ax_X)lo{8?}?cnHM%e;XqD4F#42LjLFd zm-*xVYTsXdclb{6E%vF(bIPTV%WpqrjQkh)RzFi-3laYR>3zg|9()M%i~LYki(t4BMt65Y3P@ZM922 zGR+1>g_?`NJ3~6MEjo~B0$5Eo7lDLEO7US)%9pAy0w)dmyhbA1I6V%#l9Fc@fu4qh zS+juA7i-#?s%t6&OO15jNP$bQK8+$wbTX?WO+_HBl`ACDSyK_nYi1$f|3UyG*EB)~ zJ*ue)B(`#eL@m`7bw(RR@<)DcdHv2R0;3JdkbovBbj!o*ia=~bhOwSaw>)}I5h!lx zB*G-tEnlLs2!uD}tS8wVyXDJN7l8qXgi=hmYm6MrcresiT?8JS9Vl8+GmF56!#PB= z@0yju%hS4dH)@?#1Wp`kkWvRbM^X5^B2eRwHQ;*A%W^rhjCSS~fh#v!K~cBo6@f7~ zT0xN-<`scAH(EiFO6C=TLgy?v`h=fX1Tx)d1;s4_zs_E;TmmFZtH81wt)N(|z_}Z( zpjfNGzZ&omZ}qNSjT? zgUS~YX|kz!VEIC#KFul~z${m!x*A)CaCOfv?oWC3deY(Eee3%*NHkrw6^=j&4f2>m?}&?}W~OFLQ> zh`VobU+SO5ii?{yM8G!nB7AM`Tb%bDN{WP?Tb%36OKopcAnVLx3*E*kG2Rkyz7X6j z2Jb5bH;KUvncrLxGmDL4FvFZ?zzt$B<8#4)=ZL|gbvd(GF9wU&zi4IlnlQE&!t}*$eT^ z!-X3b$vnR}ifY}r zIF)V{ZRs`$1rjHHNJ4(7fwqn1mArp(3iY<*OZEUqxf`hgE-V`3G|*U_tgC=)xa=EZ zR&f%2p|l}Q2YmW02}R3rR&gIUxM(5HDo%8RisD^RD+!mOhKU9J@BQ zHMTr9G5TrrQMd^>8JPcSk81^@+i&82cdxkJSlE2FZve?)Yl(7EuQX*h9W*=X0)n72fdZ<;nir#88-g)A2sp zlG9?|kGX??VlnN<+|EC-nDt|B!>)Cw!CeKT8s9?ymuM&d%V4Zat0lPNC5f?hQ_8wj z7CyJli)R1qedW#WXx+vXU)0t%fLYS4aev&!%>^920p}*u{cuc~ zER88?@~BS53v&HegOg+jG_G8=#DbU_sidFnLOx~&R}IkgS1 zbcIhP6^%5uM}bC+d~N<{V@zGdN#dYOU5FR4wzA~9^MbIvkHL(}9*FnBI!eDHPBD$z zNm8DN>5vgx6-SZsoPpu;^_m!+{u;yG>p#QoFF4S*k=yMD@P1kUeOV@x&Md*3V&ZSJ zkr9CEj;Zf?rWs4`frfGNY@<3;-v^+uJ(L3$CwJ1=IIMNg-*B#Ur~AQYd?=o6i$mrB z2nE18n)u(qdw&Z8A!*GS&qtf^O~u=5F_H@|;hTcP&jPKL@fMontViOw1is091#Du6 zH~9*nL#DXatJ*h-uYk>o@F!H(5ot(Oq%RuN=PHHEjXW{DuJEG&478t+Uzfni983|^ zv1@5^5RzM21LnO9-xzK36|L;DV+Ei2=T4XcOO*0lsHV-s!rHm3iIQuR=EpuvO{h_yUP(L6OMfc z16(M^NzRHPlB26aPIM>)IScNBoZwIh;)RkN@2q;+n&s}I9M>SX@nb{Ys_wEJYkT8? z#<2mRFdLksv&3DL^-d)&DWjBiWRY{Dvm{QuLu_+ot)q)a4tK*>hwJdHX_S+^PG|vl zrL3MMA1^8))XFiAelA(H%w3wJ9V3cxcUe|BCJW+)k{sob1Zf?vdO6Y|3BuhaS?Q1j z@j^+Cur0NDah&0z(LCH%DMbn^CD|pIeFva8RYkR~u+3^6Dy;TU+hEU&FF)jvRW9q1 z)fS@t|0vIG9{BG6W$g6Wn%Io!f1)o%e-S+`x;k1L`8M(-WC4sv>LZ@; zi@@&BgcpQ8+Eeh=zZIDMwW0rnUJ2b4IxDm)RH44D-k=VsOVr(hZv=l5>*t zt`B4bivltKAN@D@hy928D|~PIuJvv7)hQn~3zx54i8gdRO!7VSY{O)9;4=ywz%?)1LXW|?A2$}qMtku;1 zCAjv*AakRXchSef5?lkL0Y^~WkUH+x_JR`J1|$8bTw#}n7nI;im@7-8r?IRRw|3{3 z;9eMmOq%UF%epi>v$O|YC*?9f80)pZG@e>?4R7}E zXe>qO`@ry1Ag(E+l?mI*5dRBvYKsJ$QPOD6=`tasjVaPx3ejE2BwoAI(XDy1u%yye zXO`mFWQ|)TnoB;a2^;0Jd}mrp z3f=sH^w5q$CO0L!yN6rTj73p2MDt2AePKI_jbb-$DtRe!B-Ne-*T&xFrSWW{uWw^2 zqg$;-tu>Y;I*C>^uLM7u?v-gI?UwIYb;&~+XB&I6EzK=p!Ay6@MeKv>;^|JHh+nhiVXnpYegy`V_ShT;HSVMdFI_H=J~_D@~0pB@G` zF77is23p5w|=t^e_@VXVL zsJWOPrIcvtH57ZPV$J-?9KS1ysyRHk3AK;4g3SP z#5Tm{#N_BJ(K{eRKstIvv@-H#VLw2HN*xy+CS4TL0-T+eCPR+zWsfBD1TKRQGVzh@UHPTd&fv0 zO3zBSNEdiMkV4WNX}vUPUK`N(B#;Ka9awx#=-y-Afk1S*hou=F=se^=gD9jX#7fQv zkl#p0di>rV2gowW1LzTGTP1ZkaF$6QaKGJKX=K|%x~QJC=sk}|4s&8Ovy%SWQE?Od zcn4pxwcn4E|3PEW(EjoKRCZ_ZEu;ZV7+hn$mBJ2$f5-u_g$jI70N~X0fB?Xa$Nd5T zr-u6k08SD2POMYbV$cgP;H47XhTR|FQJ0B5iyY?Fz5s5*ec>*o+?TJjgxjMA- zwOeaRpgRkRh7>2Tpk2*3JeOSZXSvMO+6CIPe04g?(e4G>Ga{fPEjHBnw7p%t$F{Y* zU3=JG9YHzT-LCzbhD9>^JD2E>bGP5F?GRPwlx@5A5RFg9R7TXyE9HFc7Jf9KO}Ekb z)pTWqt(#^R=6W)j8!mU%Sb!J2JSucm?gp_U^h(fgjm*hd@rag7!mEWlq@& z+Eu)4)VO0C*9)|#`08|&V_YxLo)iI{?OvcgVQ*JBpB}VV=Qf`n;B`Xn5S&i7Yxj#P zbIP_|yN{nwP?>N(-N;V>1Ln}m`PvQqeA1Dec;{=s6jtYy?|khScHIf*)0Ot_y3MC6 z?79=or^`i^Ib|zom+`VSi}$C;`Ra6(Lvt5syF@@|yBBCX?d=NZ)4lfU+~(6gyiS@$ z`_tW`%AB%o*Y4uy6I3RgPe11;fB|!8<$UdD{Cv`pw)u3uusWxF=WEy5btjxpm)g7Q zHlKcA*PUQKT_UQ?DO*9in3t`I41_J-=63B)5z4lUZP)JL#{ufXaj;c(zILq;W~=Rd z?HYTV*iBny1??gc%2roFyD+LuFkUzi_wHj7$8IGgn86rc-g<8b4TP7>Zaf5Y-1b{X zM0l8tC=(=a4?IjlT(1cv*(5T_vJe5TnWV(S|1n|RE)HBt1La|eZ{*?by?d4hI>dnO z-3xeH9wh60m(Dlisqk9Cw_t)Y2l}9c*z^78G~_Q_`@qd$XC~F&VqIm}jRU^TPd}q`!g|_7oMY^jd`d%&+F)!&f3xd? zx#@K1Vy;~m4A`!V7P~GOET@ZR@||XWehl}v=@Si^fgRofGK|LK?7CEP3*oSC3zW#0 zjrnBFa9@&-Lto^Jt_I_rUbMhJF$u)m0(t(48JuuiAV>ZGpQiTzEs*~&6n!=Nljx@C ze!%*F0>10lM{2_V3_laT7C8T_Aj<#e+Hc_~y;>U^`U8pYKOes0UsNww#zLS|qRMY4iL2yZxi71b46KRN22J4bhU4*?4RBz-Znqb4qXz zi`M;qNDnjgUEFzQm*7Gcvk3L4wn9#*uBK6(w`P~%Ue>}V2ZybtNoUPrtB*R;x<6_v z!JRDW2B{zMqB}!-A-In%S4h;-{1V*7qIIx8)eDw{;W+rWXHs1Wh+sLIM_OG;zmqkJ z3O6jn_R~;;J6SXg_a_I_aKWGHgNN^|}UTQxo;LwxnO$ z@=#GfYfJj2EkH-Hi5*_r81Q^gLYX0%UR(b_2Hs=D;dZb&Gu#L%V0!wxli=(-&_iDf z=BS7oZY;sQF7jcZGPnauLtSL!H`QjnE=+nsLkVtpagJJLaQ`n?q`m|sL zO3Tj{GQ7Z&v99>JA7~B-IY*it@T@C>>9GV!|OK-e^URV~T)C z?iaAeW;CyKEZxO2kgc~PooP$PGaZfKK0aD5*yhp(y0_R1mR&G&OY12kDU*PtlVIvS zvMHX0%O3EEEn9A3X&p7sGv&ys?Yk77Us_9FKlZ|+*B$?Mm|t4+U5bjPRdZ>zt{|(c zqc_-GI%bqoqPF%e9Zh|7`v!X3Hp2d3q_X0MQMAkMTUzxUN{ZT?Q#y)n{**!pxl>1* zG7Y68>GU*9^mH+_7f~Y(rIn5%qb%oHr6cGvGg~P;vkod9?)P-T7S@N!buzdtvnhNB zfLR;%vuqq9QtMMlz^(joy;v}kHd2Mds*`8%t05Y<`lmIUm_qtSw9mky-wQytzs z$}6R@bO1en^z@O;hH)D9sO&KAU)rD26MKN(2ICJqJ_H_zaPqWXZoCJZOZ(D&S6s~Yg>IB; zD9xjDTwF>tBU(yx9r7_McbBilAs;)fs+Cafq?%F|Ly)W{Tm>6pU3yS?`OVkv6mo=z$vk#V^z`ri9QwmX>>5U zJX#U?Fmhky+{p2f*$_wI1-Mff4zCDL&_34g)6Ul7T0Qs^ya-tWvZ3XnJ=AZ39q=3V zXAoO(vwEU>h&na+4Mgy7^&SDX{+RTU^o(?qbfuJ&Hc6|cC6Mzk?D@p=9QrAnXWpjx zA~rj#GS&W+%>=4Uu|I8`YmI|48U2o}n$7PAWfJ;yTMq)CqbF~+C!K~&L{@fCWgm*YqHkJygQu1&fr+miB~HP9uLhoDYa+9RK3w`yo8`FJwn=5^UAxKwmO!OreWikou&B+)DJi8I7nVGCS3Eh@;)`3MjSd~d; zll@keg=RS==o-1X&XN;=Q`GOFx1m!VZtye2a2i6_S^Mee+~urYtmo5Qz(N&oL$^n! z=D~UJ@z&B1KXk>a)#NRZ=zwz8Am-6iOMpiMfGq%UFo(WWE?6$=ZE&OIc}l~C&Jk-6M-yG`$Qb(GI0!1#9RY7g<)V)2UH(ceU!j+eH>q zz$VLGF0vq2Aj_R@vKTZiyDWFO$$|xJvfS<_i+Jb0&34EkJ2$A2Y@5PCx>dBq%@Q_g zZV~Ou23Vk)U%BCzh-b{rqJ07D2fR&`n?xHKg$e|@(M=GS>2iacAkGo`rJEqa$?^-A z0V12EaDaa9GC;J1O)Ech=_dgT^m4t++{N>ZP@3yp<}N8<6Xsf%x$AORx<*troCR@z zvA=76>T>i!EdQ$cNjW6tbw73y7k3G}xIc0c0s{Ly!#zlLmoL(#R-rf4kkapdvH^^r3p zCr1v5RD{0@zZ$+he15nqyc}Wx{zv=0b|D?R{6Y%&y_P^?Xh{Oo&^&dfe0ABMw;k(Oso$qvCt8baF*84r>bLAoB zJYW^flE0Q8k2BTqc9Lq>eh_j0Xbe0R%#$p`f+DyT*=9e$ zbA&160_WB%fJe%L*(D3$vq&awmztfM43s#NHte+BkjA|H0mSfXP*r|KoG-onA@Z^i8rUBwzMUvq?xuC7Te6 zxXkWOHbZu2HZ!wH76n9*HjO5tfS?pn5m5mV5iE!W1QhvxEmQ?XDI!HgMgE`noZHSV zv+M79{=et{e;)H#X772=d*1V&{#Ng4viTyZwn2<_fCEq>(a+~X^mXPcf$H;I%q-emB~@g+NV#O11Nj-=Hdlmrqipf~h}q@YQNg^D z;aCz$2>p{5*G%`dND+0iv4!c4f6EUwhzY zp^Tzd8f7;zbH=>7zYoBg1o=xLeO5VpCCd_>PbG8R`_)gEvmWFTb`f?9B=uCkUpCG= z7bC;IBTA+EwaT(mv#;uxia-q%r6lJsI7;#W_x?NKh-GdyJNhwsk-rfoHR*V8z#PHdZ+U3vm5E% zXde98^JdgrhxtPvMtS}m!5>lw{SiKalMjPAs3>TDo3@mLoH5W9=Lc8IOr z<_se=_627cp)KrP?HEa;Yt+^@v8`L2VT87Bc7_q!y2;9D5`PPW^?4@j)w=biEaXJ@SQyu5$zt8oJgIL}=(UR*-ck?bsyt=+llM zLPOU$f(Q+L$~uT`9c_&#i!E^%7ZZCqjL_64o$&~5U1c3edI|{4yV40lXy*zi2%(kB zZIrC*u=eOOXBeTSsxyqxRz+OfOG$7-yMzhR=4jak$b@Ngv_$s*r+I$iNj#FcEOAnz zF8+u3*W-owad9d3gIG0oYODdi{NIQUM%P4xkzYivjiizNZ&di%@Gap&xIKJS=vRpP zcUI_x(751B$o|(KToLpIo(g+G@mO1|)^A z7fR+7VO_X_<6xpL3yQln6myHPC9Kt$4p~=({h+xqy<|=iHi9)8yUS<{CV{mY(;@4M zFab0-rkBhq!ql%uW8W|ugMnYI#&pQKBJBFijp-$GiZJ1;(b(6G#$c&et1%t2t_b5i zb7OkRoFdHbYBcs$qcPan)oM(KtSiE>&fJ(@GN%X|x*Cn$VKk;%&biG-9kQ+n%Q=-jlLre-|k)J@33a0@43OwU3<*mVWvjk2MV1#cbmV%{!IP8PQU{zGxog?Zi!}i zn3K`>Okd}A;XCZb==*_e=N17EEW+qJ%VcZD1G6vs&eGbNzr(JJzV9FG+$7Ks%Pso8 zFW0$Izz_2*_C4LXakGJEZV|Rv>TGk^N(u(#(Z$8wYRhHxOrYb6i+E#jaoW&fpcq$N z$iMfbI@fP7zE3E^Fl(x@(+Q}K;Z?fxo$aR@RTdT(a4Y(=hT!9b{A|Nnf;ScCbJNwc zV7r4`p4wTaM{~_XI=48FbLXt&Ap_FU2();#1EgWQWcXOjFV5xhpU!Gzu@1FEz|mP? zX>krWvp<~9z*~R`%@CLh&$%V7hFh0@ei*GREzWkUxVUD;#^Nk)O3GV=xnHDy6DHs_nXsfdgIlW}*5H{5|1fo?Tk23x zYPYkjSkGl64wdrgsPT^Bo zYi%h{(^iuqjm61gBTH*HvamRbFEFiY`$HT+$3G0qK=ovXPRB)1e}w#H1m zhO6~+F=}hfRL!NamBk2O%?63cj{>7tGV!E*h&tb$__DMZ=Ci?}cFl?{#gMg+db2gA zYfCX$yPETWHx&bX6Vb^uF~*IbONxHJt2$M3<)+WVP1cabQ^l>tV~bwyz$Lb5sqNBq zb5XGjf71vCaAi@p5UkdMNHIhH4mC${Nl~(}sHthLpS}NC`&Fo9}QpP)|ZdkG~ z$ezcBm4hB%feh*h^!UDP7sAdJ;Mh%tr>E*rU@nR7hs3T zlm=tRkV!w4x1&K;i>V%X;b^k((+c%!yHZG|49x>IJW8*wAvMhZ#vTZAg2=cj8_ zur5LY!INI;or{vyA~mG4z)~C`#{?=q3AXR(!JdKM9PHp*ns;YgT0n;UrZYfuOCj6b zN&qi712ioIz+wV;(gk2?A=|W!03LGzXa&Gh0$|3DjL0NH0%i(oTDY;^uu>;8E+}FB zr~J0@^DoBFXN{jv7(X8|em<=Kl&&{^4jDi9Ci*>L*4lJ!uBd5HGe`h; z`pO(sJDCF6f{yv8Hl%DU$YF$n)qv|%_z$Bpo2%yJWhfsT(zvuUOM}TAQDCyMlewG# zK)RhQO^HjS+#=M7TY```R97a)4=UmsGTn_~%zLAixx9cfoi!01eJerR&!$F5gBnsz`=zl#(%7RW)6>3tGy>J{#(W<0uC~h5B0XW=n7?Uk*_!H2b`PQB zoU`PtLB0Mc`PvYn}G@Wo8*W>W$P)`IIg=o<8*e9^=rH}VA{zyU#`o9B7MeOn?lKuz1mN3i`nPVRRfoF|zP(RgGzGxHw%YSM@+hJ|8q=A^9%RV? zb@~1Eya_0F1@&WK1Lb_&oy;HL{GG7w!sh;c{sxrEU0_0vp1 zq5i7&&SSHiRFk^aay>H&uN_*$*GD`u#osV69!(fK5EBUdIgH53zG4?G1NyWBnp1RG zbLo;NQ4jKm3KVY>?>MH=^ap~<7<}xNo5*EN48vg@^1cK1QsX}DJCjj?Xdeb)bJYrt zuA;uQTES?+JBLyzb_@;-WOIcLIYhB#tLb?LX#OgVqY2e9*hPxlF3f54hN5n12aG(C zInhx<^gQun)ReVe!~y{y{tqL8`1Y?*21iZgxk?S|Bq@eS)r?MM?di&)Px4v z2zfjD@&Bl1s}WCi^ke@~&6XtwwLklhYBm|skVilIpVc(+_K_Clzz9dhn3c0>o4`~^ z52WA*!W`^Ig=xNYAjVSx7AM%izsMXH^;j=?HJ)GRViT)=>IP#3Cm#J1HyG1k{dkVD zgXqE9tr1to*Gtz%1B_l!`u$z+oNpg(W;&Gq-8(Cel*0P=z}rVD4fyjw>*B?S=zx{K zK$%`U^r$oVg`hJ+P+q^E_r)5RMt2H@36KA8&M;*oqdN`E z*jXo+XT;LkVUl3^y6JcoFu?}JKs1x>suo0STYrb`MU-iaxyW)W8tDYKf8r~wuW`C@ zKcdg@8HJCj{sDN7Qh2^kGxtsavcIlj&bRt3TDUxVg5}H7=w{28mguIiGEu^&j-72g z+oE&b@;1IZkB+ZlB=Lz{(T5Ib)$xu2#A9oiRZEUQm{ zvihG)C=F5v!u)W1m!WMmGjxAsM;>>v(b6IVHCgRqqiZal(EHQ9`}K_@dYq+H@Y{^8 zwv_(Y1DkHqY=*uKZFSu6z@|$C-H2e2MrPACBTX#xu@fyoP9}w8Cuk2;6_cZ3;Mh7^ z3Dll?`(=0f@htzJa)~GLzlrZ8u1uT>Il!Fw`|;n$zZJg>KKqF9k2rwO#qNn+7t6&q z#}>tW(Wj%|k6shaM)yP)L}k47?~0TW+kaDJcElI{bNHd~jo~BV?cv4YF`>V~I^g!u z;n0Ud$H3D6c|;XB65JY`7Wfn1`Q^YFf!076vHc(O-{!CQ2mL4ET|WhO0zdGb@7v-V z<9*!wN$(!K-5*yjQBF_-@{i?<nKUVD9=u7s~EL7jKd*08Cnd)7_8{iP-7{!Vd3;+R#_R1rEr=ZcPbGxdtc zm7oVqJGNLei>8iXRSD`rmfOw7vXO9nZ3#NVep~zP8ox)tv{fZ&673Y2vnkh_G3_Pj z6Z2LIc*#XAIZ$0P=eZWD(o3Z15ZJJlnL4Oe~sGf-Z746`6EXM$IWD zXdf-b%|`L~5|oS+QJc?FqoA$?RU(N%Gvlc%K_f^lpig4S(IqJUR-&L`>=6Qe$oj%099#F>1I#HkF{@JJAf;M3g}8Ln;@SN()L* z@3q@1xj@e=L9Mq&fIc2#@a_Zj=dM{~y_Z82t7V+qPR3aVN2-DSW}C_yntRyP!2ZQ+>%rs>>Ng4T^jg9mfM z6|qwv!6vLVN1n|qLEA?B-A2k_yfY}NunX+u5_D`0fK`)Birk-6f(~s4m8J`rUm|Uj zN>G+jAy3CA)|^~~VvO*r+1td@xkc!`h}--6hH$0rf=3ASfn1O*Le4Hi&$WyolU;>u zVX)r?ZblJGtwn(AIWp+Rmxkg;_})NvoShK+rE&u~M6ncGoKQT=Yy)MUj8lt4e$QMq zLI@l-jp@ZBeov#hys;Uta5IYf;$c2}x(B;x*Fmn3UJ+t?@sNguL)bT`S;axWrxoqA zXS=i6Ory)#&Mp=>?~<7z)*MV5c;G*=#fD;@^F@Pe>_+lN>y9|5n5$`B_@H(i%q<>N z2iL{0R)?%B4v5x;ddZw(wq|1w7>#9WH>N|@75l};^pZKnzM74F$7t+8?Z$M-y5gB) zV|vM)V!CEy_ZyAvuicmqSy${88`DeX6!+C^?Au0TsoIU{kafi#u`#`5PO-aYWA_=2 zb=7W6hpa0m#m4lKImI(-Huf!}vCi6!>5z5B4~vcIC3A|W*KF)wqp=UwZcK-)E1o7c zrkBhqo?5f9ZyJrAQoAu7vaWct*qB~2r?|IfW4aA|SRU=kOJhCq=j1Z-=$$TakQXOj zMfAS=q&bOCNv}%}OSefCDWAwCPEBl-Cnpvs;_<)6pN!uVzb5{%crv~|el#QmFH(d6 zX?N`7unkxrn;rcCF#^68y*T>e=+fv^NC|!y`6glnd^oZSz5~Av-w{49yg58I^ro~r z^uM8dLzjp8Lfb=2Lz9E=1)mK*fGmKO;Gy8Y;4XL*%nXJDZv-9*d?j!J%LX{z|9Agy z{onR~#eakU5`T}s#qag~-S?{eE#K3KJorQ3w|rmmeb#rD?|^T+Z@I6|CnMXyz0z3k zjou5rDQ`^qqjHb(3FUNUJ|qgimVYSE00S)lm{%E;uF&0+WN^}`i#96o=7d9*QT@`mpngbQdN^!X~X3z)+nD~2B>50k7GozL<#Xhprb ztd8^J%)?JB!TCa$HdUHAY1DZvx1U~0%0S5U3Z2PA$#frSu2lRVW42 zaMy;m^<&{=Ebrtt4_uEteatIkz4IgqaqK7%k{X>Tyn(qpsvk9%IVmCCEqsSb1F3fK z{Vwf0gq|rTE+r9uT>2Vwj|3k5`#33XhShP$r8^_uF|s^xC>eb)Hp=6XZj^SVNSnJC z9RtVTIOrv79Cryyk{OY~Jrm z_N22+PmU;zG*#eGx|R(;D={2R1KR=*PV=smWc4wxiam90VxQ-t`Q8q_Sd(|Ihdc0k zc$U*F(iD$AmT~e$~`Kb7Q|Ma2?B71Wxp%b700AHs|rD+$b;6 zeoHS(FYCV-ORZt=7)b`qL}hZqJHsOl3^8pwY>UQgOD6DgWTO82=b`y5>cWTvl>1H` z9$py!oy-x<0l#?)1jk`xkp~75H>A7sKnli7ss4$|B$j7M^%U`aTlk+bGW;&2900o3(Wt zizA>S#TOXiJ;;3a)lbtqRD%Hav>WC5L%nykPP3^HJ`#u1*-@UC)T1`r12X~&B?y%n zr4f+ol@N321YQco%M^w^%=RbG^@g7JrOm9e3c+lB^rB7bp@jRu-gE|eTZk$05_tz3 zAa-P8PZ}K94IN)0J)rJo$FTu2N;_C^?`&=pJGdBMR|l?PIk4cS5VT*MTAcTWp(!&1$nVd$d|+YGgKr ztfZSEBo;BpfB?^GrvdP7V#DuP!;IKtp^_nXX2bF7HmMB^ftpY$9~jqBHXm3yAOAnA zYaCU#Wnr6&Ak&!Vm_w`B?zxi&8*5_EKwmc5(=pghOG!v`_7N5qN`yOcFg2Lk2!k>K z@+`IoijY`(y$Bs5q8ws384++pE|<*-=#DrLxUP>3$a)00!?O|31J_yJ5%mVUxgQFA zG=7Leb7B_?Z!#7ex+~hgdam)@Iu)lrzbM;^H+pVh{MVW=n`?rXf$4#h**!ojXUqHu zi#wr(eZju6on22Ej0u4$fcW&l-bvnOl?W3EsNd=NrLphOR zpXGDqtBjo#5>0hOM73j$ofN@U1`7j&n1Xmlp%yrPi+U(v*sP@+J)bp(Lo3wHO*eY3 zXIC_pSc`RR_;?oMNGPNM(d{BPdah&PYXk^TyMo1I6268vntNvAR>l|&7gKU{@MdGc z+q1b8h%hY9*%rSqa27ks(PqD31qo`Ft1YuPn*O{>NcU*ZD|)-J@8hHd#s51)e!!D> zDe=?99f$$Yo7j?=mGH)&i+?qKVf@T^dweE50RA_2Z|t+Nq1b-d{m+jDqAx}tj9$$m z0M;h)U@5;~156CykpOnv&56NfBJLPrqQh5xb1w0Db z#V4dLX_YkD^N#6}Pxcb<8tm;!;>c+3Bvo17mI3x^GL^PK3E5vi>43(bUG*w5$I;O^ zrdGY%0VFSGuD*+Gu*_H-lB(Y91Y^N-lcg!@`d}Yy*>v-s$dwKt7A#jpl!+=efmg|H zO5IfR@;)-p!e90jswq~78Ivm$$sV58L_W|=rdagT^t`*4Q1;U^h{P{>GWf<{SpAly zss0zq)>9;6}C%8XQ~my#Ws{@I!b^%9|yo&@z`;j{iKxk&h|r$1$B1GFY^ zPbMoY5P;y7ES#8;|JU<<;;ROkUyr+Tx-Y*onc-2p1D_Cz*TKNO$DFkF0y5asYX{CY zGsAMW-84p7AZehgG~xgmHfrCtY0`l+X(s7klNsDuFwc!s^5bKbMjewTggDdOG^0}& znt0BmsRwl=M3o!+lJGG`lr+_#`^>q@iBxo;sk4@*((fh9SVuURJL@~l=zD8`nQU>t zSp&>uj(d+Qaf=t4t(Ms?>qMNfK3?Z@j{2!>CdL!n$BgYc0cGzHGR5TWPiBx>HQl)nw_hFs??{2WOXAYaoNbty;P0E1-Wsr4+oso!Z!z(}6}{2H z*N8~ij}0X=o&8Plo)#MZ9mgV+cESf`2=D2AMrw}8MQkS$u~<)$3n{F&rKL_}#33IJ z3%XCRy~cu$oj4Z23&a>30I( z&8MGBBL^shi$fzFbQ5!_b0!60cc>$p${EutO%dcB;F)2WtsnbcpqW{i4Z7EbNiL-C zvyPS1zOu-=BP6@>PBZ+lb#f4#Wr82F?g#|qJiiC6D~mv#rgy>G2?Dgv?!0xm6OcH$ zb50=Q+&<{k#U62E9H85;X?Tr|_f_)WFqH&eF;l+8*|poZ(2Ng22EJGLjl;zZ$gi+_ zAd|guDLGv` zDE`dH`#@?JELli2jr$esRG1uFIH6wP>&+3+snKINm!05^*8jxr`%&z&*xuL_ z`1ju&%|x3c??-+JE&ged#jx~$G<;3CC%h2;{7;2$4i!SHL-F7|9h;BNgOReGy#k^bKvi>wIURM=d&$K-~9o#h6#UkTpY^U;BiiVAdvAIwG^Rd8`!~lbi^W3UqRXwUY#8ZE?91DqDlgm_mqma$&yE2c^XO zOee}eDN_P}XEN&D5Q9OqpsSLkI(aHHUl0n$Np(zQkD<%t$;JTY99kS}=2oao8x>&! zJ_f;zR=EMlwM_G4>I8@m33v0K>cQjNu*b050e3^g-AxIYNDi9 zr4Lv~)e=pRZmui+n=K6$Vk-prc>HP)X6bb~#B}yrF|t->@+niK^VejBiP%*DmhX|= z>vkhx0e8D+nkrE8z8R4KM-L+a{L2x*L`u-yOG8;|X;{oPEzj?L7Z-x164hzxIP>Rm@H1f(|e zHvtQiK-ii64ilSe1nWR5inr~hCNh2YQcY3saYN(i*JUZ9ECzH-VZrazkivqk0 zvqNUfTL`xoDy^yA8MlZ}2iwv=g;i~~)$#-hBH zZ>u^6+EHym^?XAXGR)E$9E;D}iVdj@il4I;8@}Nve%4lO2y0OMjIFp?KOs^4w5_M+6t|D#4wGYO|)~K_w5Ah5gs2j7~+way6 ztFt46WcLmgM>B1@g+QHYT*jv|?Ql&{{y9k3qHC@RZ(nb7opw$gzvEJyW7)$+k{njq zY$rCE+i)1mL~Pb@%}_0!RalV?Vehq`BhpF_i@<-ZH=(?uJfhsD6qSBuz0#n_^8X}W zNj#OfFL8@>t8}&Z#>B;mAw&r{EwL;y4S53JfG5EB;j#mUxoGx96*#9R=DLiT4*!+@BmUF<>-=;5e&0*JhmaZYLSL_My>Ev14cHFcA>R$_fI)eW+=}=C??_Kc zcT0~$R`5wFhe!geq*+n~vH})@iE9Dd;jgGC9Qr&9(PGOsq>x%Jm!%L+rVK}A0#?7m z(rO4v$*B{C8R(!vM625!gpwiR1lVc zp7iVVVU2#+sl3f7KiyK!vWb||LVU=n+=Tx$r*aeiQ!V8ziHHgRDNf}k{3kn=oAB=? zk))m%q@|PR1u->n63I95ygvYKC0L!?w*;y#XB%JNDTK@ptKTfW2`2yq;ps{3W5%T3 zI0^Tx81(CdA++_KOu{`2pn)bvGh|n)KYNHgHrCS(0iLi3ic4>l`$<487Fvv#q;C_~ z+(D$HNPxX7)t&8U_7E`GV_~~AqbqtH1wKbIdJ~L#S%Lt8;^hgTH}2P@=%de@)>~w}^%SYDOy6OwhPXWIAznxqhJ*$_>l@?okg8oM4c|G3XWU|Si zk1QY~NgxJ>CXodb%WUDhpOiGa5Wlb|g@k9_up{f`@`pehmE;g;6NaavO5rV9i@7Wk z4uGdQ=Wu(c(|KgT7#qbzwv8ZMb`LZ%UFlvC^gb+HaX zxSgO*6Pf^&LE8kfw9yb4pX+FEVxQ69vr@TilStVcq}UM3jk@FY*3`O25sNCQRqG$@ zCe?@8lHxCBw5;5yJJwvbKik!1SVeosklIMYOMx#sA?&s2Goz~^(i&)(hUQ(ABv% z?s6cpuX9`)wRd*5ZS2+4$kN-XZg7_FPNB<=&|MXuy}y%fT~R@W4o|YNS%ngNJkhOP zdzV>cH-SW_{rFVdXwVbd!j)N$Ko*uX*jPuH?EIK%Tg?O~Fk^;oF%XEziRq5b+1XHU zJ_2a#Gq&;36fM!rp}?E$rKK*{=3GxN;+yDq^-=86#tV(FNAb%l#J1f9vf4{$2I-KO zzCcGXlpFATNs)SDaDcmjNlU47Q~+H@+W@zpKm=|$kmOnT5mc5ZsE;;&b(I^1KcyGN zKYuFx>G>0$qozA3yOo&3fESJwCJ;}MV0Bk=z-q49$2yrB$l^|o1Q!UY3!Q}L4T}E< zV-MpilA*p#@&8(sGd;eid{_87e51X;hNt{#-s#Hkl+P7Jn@MsrVW3 zsqpi^Id(>DM)cX}_0f}~lOn%DM!*k6W`|!7e>t2Bw}jpf-5!QtN^A2 zejT_Gk^ZLmpYeaje~N#svR3|={C)X$yvNU#S4;nv?w8J%+B_e4egH!L&;G3_AudTL zqNdOU%Vf_w3z@1GFGQAjJh5R%K~|th9!}o;q^_bo^#1)?tc5itL@GH@tL|b-XHSmO ztg;=$iV`B4)NFmRYwN2@2y#Lp<6J36%7;v^ThnVwhm=fZtj6ozY9QFQ5+Ng{zA(qNG`iisB_&lbB$SDL2b{Sunl@KN6G%yh{ zgz~MO$t1=e2{E^}xdn@xs5R48LKGDW7Uxz|ef~Ox?bC6zmJnctg1*^sFx7@BPUC+= zQD$jmn6OGz7CG=&kNfuDP?U!_+x{Cc3DX9{PBy*b+R`pN`%D!_KzmE+L^bi1rETlh zCbryC+UZ=4aov^RRiz#F!6Jf3Hdx1&wySxpEW~oXI-hPQiq`<0S<6b>j5DNp1ZRjI zBeSiv)tDnrHQo8F<7h2yG0qSHha;m+^-gf9=g4Wj-s;k3V@?X~)nv6^e`RTtn!gLI z7V6jFwO)H^>3CyCYqe_}*LuaZrH#gncBnW4PPddc7*o@XqBf&jO6#4g)#mf6QoAvu z&8>}$&BvD388g~keI#67Q)=T^Gun6b$|E>Lbat;St+kKx&SAnC>$TUF));4q*8T|3 z5FN>JrQ?htHhm&3lk?N79jfn^u$S)$d zL_QMP6`3A>2f6*O2=|6phr^*~LwAOTklSx&@b%#Lf>#7j4K4|W0>28}5%@S_b~V8A z|EKYI-#xxdeM#R6U(EYE@7KH+d3Sr~Deo)4P;Q3p!CGa!{F?k-`D(dW zULhx>=cTVp7fUBg^E~f+9-XJibL0TY4UJ3Ha(MACR=R~Re7or&`}7{>SjH{^x)dP( z4ylRFD0l_aU>mS+lXsOFmaRYXS#w1F205zOz}-n9jIfhqO(i=bVr_&Y=%4QBt-Z8vJ#bLZ{mp?J|R&6}M)d)x|U<)(P|> zC!$U82G5?M>}JBSjNra~nr+;zm5c_Swvp1#k9QlVe`{SP!(H4@wasVqP2V8lH#Ro6 zJ0B3gUZxxrm@&f3|0&{8(bDNu&!Fd5)=AC5oj0-nB^Ph=0CC`&^Xg>l^tRS9X!#%O zP;yYmx$>0tEEw6FV2|}IaHwVw^n{fl2JOt7$E~|IgRRM$-PY-7sbUcFn3ahP(vdMg zv+ivGwVdb3^j0yZc%03WfoPk@d?@>Avc9@(ytV1H!FnabQ>(NAjrXjH&P1~J_Ho+U1 z9~O62Xhh8#G8;F3D2@lfYg~mM689tmwp~XIN`7ER?S9~WUt|bS^DR|WLm0@vXCtN7 zKJZ-|H1XRF_k$YY&6*XY@!YX7@Bt0A4s3eu*r30ojiV0jM#TNvF|9*7@8;jO!Lb=? zYx%x#G~wBW`2UgjA}>U~k5_#;l8@|+B*H%nmlC7Hr-kPsi{IBn{h@i$?}lX9=HDJ1 zLR|i-fjZ4y;P73DiYz4g~%0`CssV7Z&-w{+0fi@3-*nulUaJ z9pnAL`xEcA-ahYfh{FG*a+5NsY*I$czlR6^5qXn55#IZEk}ZHVHgRwK8AKmEH@*=P zh~LHTik*$9gVUmaG29G;o7msJUa+`DZa#$eQ)cbS+{o zG!EcSyAjA*xWb#2WdYv4QXQGrVCR6nrkS)xdrzo>8^exajyE>ShGExC`<$Uhj9O-j z7O>m|wkBLy#ly1;(57w5dOFqlXV_V5f>(C{N7hcav({eI+>v?qj!*^1v$)P*ZyyL9 z+PX1eiX82XoUzp2>uL63Bjm;aIQDp|eb~fW=HAX_KB=~WFb$jae6I6Paqfhvj=6<7 ze8=J$EMXDDW5V&c7tfdnN3|<-KY+l$*(~_9O0HU=#vz0nv&_V*HCzrNKsT`H;39sv zMK#j_mJN-=xX&<;iAn|Mmjm#07B)d8LbHw34g28bJe38*>7myOm|9vee2{fo(UtXZ{8i(D+n@`>*=txwt8T6LY$xt?<>0wH68=tW^PXE1!LZDoG8_rR zadr|5+^x?zt<&ZS_gfZS#KwGVLND`8gREAOk%EHHQ<#*|(hpfM8+O%&F*XnLL;sh` zq3~h0iSR=BI#`Pz;`<-rg#Xq;z1k00d=g&G`1<|C$2^~uwi5KtY~N5Xojlnnr7D<>lEyivApFx{s{%|CXucebg7fLA0wCjVS!jlwKTJD10<<2sndETpsmulumuDrusS{!a&j4Gp=-enxq%lIb# zA7#b%AMMf+mwU@n7Vbdoi1ktLc>kK~z+h`db7xx3Hx%74((Ts4gK1dFGT7uu(j0dE zu+Jz&OU~!5^Xbl`yi@5JlR3crwkM4`$d@ob-#d3~+`15^`lIScwK#sCHfnm}MbC15 zMYNb_ePX7tBASKOGQ)hK(ivfN&CIlByo#sjZ8QsQOeg#QHqRZN$d*V5G5yNnlfw0( zr$aX(ZvX7yYr(sN2ZPHZ_XMXS3*V0emjsT-`~Fe?rT*=ShZ5%{+T#C?KM+4Jeq3CN zJ%rqU?J+6({pf|!_0eGDQUCJD4UtQHZ~DIKOZ(;^hX0M;GvHV7Yvq&5b|ozTMEE}pBg%f_A(NY z57!a5nW1A@TSk)d;Rtb@7&?mfGP0NtONh(7(6NjuBNw^mi!)gp?f<%BxlInYk<~rX z{{Q8Q_5T;AE73EdwS*kkj?P-_=46#B>h1xnOUQst+lSe9fGN<78<)dnQm?4EB)621 za@(m|Z9cCmAs;unBbxb41doi($Ci+#JLyn;BwSuoLgH@nWfa=BK1OQsYGnxtzOAD? zoZXGivN2_!;R&g4sAJ1slP9G9+1V3vMOo&qsBSl7`#F84zH^tQ+I8(`v|e{j*~3}q z)~?(6tYcVFI(L}XZD+GycU9>eK51&SZaT618*CyU==hiW-Dt)vz0gmUfUVTmJ zBf}8jau(|tjxC+V=RJ!{F|zx6S{wLdOGCp{wvW7Cd2Q(k-(g%^b{l#f#j&Ns!?kZ4 zd%g1N(jmSv*J|HB_KTg-|9c)-|VmR{Q;K$7y0)3j`sc&vH5QD9`SDTPM2g5@eX1Seg<*=HzEJqzac67 zw)|!J3b`PkBrlgI%Q8}3Ka7liMMUk}EiIKuuHo>HiIn&zuFA7(sL4J^a51$2UrS5& zL86YeDP1cMX3~_%fn-94OhuV7W&?{`ZIqfME+}2k0@kagCb_V87nAZ*K~t+KF%#4N z1p+!wDqOstKMMyky-J;b43l8**_Ll@)Z%W-P4ekXe79%Yjy*h;F%KyR+3~hy z_x^N74NlJl>yza9Om^-74B4_YNuI}o{SNkLHG>~FW$63y9+tn>1nMl4d_Uf81!Pwn zn=JYLco$Qjm@sar6;?X%emu#N?V2jMC{5pwpJDBnODJg|?PTl}R)-rCK1hsL@lqHD zb?G^?;e*6DJE$`wK1hsZqE3MXm!5r)7-NF%?q0lbDKkYgZjXjo^n=7`Q`Zbw(^b(7 zJcCKPwwaCd%-~0vHX$9H3_@JcCv523YoU+Z&;z^%`j|SGXkfa!5beE_ z0(=|WqUaYD_#hEw+CJW0qk?H)wAF~1xM|dI>2BCWKLNuAAN06StPm6X8{}|!x49KG zO#%bE^CSpZ$mW<`$o8AqNMS~nGjF3BZ1kDfXjG`hMz4t;qlODTiUWE)mTC|rGsQ1w zq=p_fYEdMacyFrWLXyWcvK)Hn&Kd;8Kd`YB@HNPZ|JyXUdIQeH#NW3gugRYHzibSp z$7d~a{%IR8s^LP}oY9&>OaXuo|^!`ipJMSQW<&BL2E<3}~ON!KJsH zx=?e}-gKhJZ4Uj_Mh_XR)u87!8$DE^7Jpu~(L*&{M(h>KoaVlgu3LHh&zAMe;hlN^ zCkr7Q)`gIl9SFfvR4K8^$o##`OwyRmswbgHxs$lZzt1uRjx|lUf%qRSTc}#WS%l_K zS(c0$+ICO;ApQquCUiUCVFk7z;{yX-#+hHKUTceh_w=Y??36*}+u-PP?{x0WE znCh5Yc+tio92(-lnZbW=*%fidJNjy3SNxrAb^_FeiWlru)S7QeW+P$d{KzD+{xfV7 z+g{P!-REtCMer_@t&{ZsTa?Q^i12?_;@HHP_-lCmSK?=?-v9T;E{t`?mdD0KUy9xx zy*he0+8&)1c{}nDV)>sLX^V^w|2h14_zU6l!h6HBL;nc<2)O`19_m6izzM-ugAWC- z4;F%3g7bqO!~wi6Fc{bwI3^JC|JMIS|B(Mg|04fUun%~`cZcs{-^sqYKFRxY?=6rA ztn=0>&novQmn(;q%}PT4BO(Tt5@ksGd43{kA;g4$VS2y6(UQ)FiYY<3w! znPmh<(Iye8SqM#Rz#Uyi^upC9IBP^_19W~F!3x_nP&FE|8=3RVh)ZY&w#P>{FwZR` z5Fz!RrQb|9lU*ppsd`Ro19DawF$byl8l*E=QyGB;Ph?=}Oo38|cIIKWg~*Kk$V%4N zImln<;utiS5l*nfy^?cNGs_4exJ0N0z#$R!>@p$>(r66iQaxn5W^|7UG_+~3tc(zY z6ijdj4O<43?qmr`!IEuTnmg!!jGDp(nqNj3LgIJ-Kxcm%Qkc}-WxC?jK(bhI)!djgq_Ws-3{q=;r(~bW@C7u8CI-;CW?eq1LEP zKbGkcSRIhcWVCR;^_ z+2!4QYNj)X5DVA5(uAqmSnl8qN>fH$Y-VSs`uc{Drq6{zi^{wFo-H8E2Jf~5E+`{> zT|3q2Ng--~rg?p5J~=S3A1S!d#$aBgdwLmB>ly*Qzu%PqS6G@e%7{?6h(JIpZE5|< z-b_;D-^?_Y#FiTk_3i{+_|K&wev`! zktjz*ub$3*gMEF|`;k_ouX9Q3;$@4MiT#;XMo>9wW8-dAG^Sok1e;q%3_05Q_w@~7 z!|6&TO$$rt{j@To#?51pc_c$Pc(BvL!8v7wg%Dg>q-W|RQ3xQs|?+YFGNbiO-_2;f*ONKe!S0eK(n zwS_82mk}F{ws;k*P(=h?R7MOmT6<>DR5Cx*1mV9U^0{S%J)>#mP(#GsP(GG#eB_kU zha@ntuY(17vj{c2j1Xot#5z=WZpq?2=7b10p^S)Sbg*{k8jpxYv&)D?#!%q$hulhT zv+0;JLXT|#3btnGoXKG;be&Xl%B_4dcOC3JoG!R;VDri?eD(owe`;Vqg%vmLG{V>{ zC^z%1OMo>k69Kxh+{CxiuD(N^{k=$3GT4P2<7O?A1s<`&=xh?<%~~D-eoA>UKNHq% zK5<_rYchav#H4Ym2)JgIkJiC3i`>S0QF$(3V9Cr71`lcK z`r#GEGNrf>*;t;VvOueWD=Mp`vp^WbW6HDntkzqAIt+==4fMj!JHI@OU(a;#7CM8R zaW|A3_!3TLaJgUV0yU#Nlb@c+z9F}J@vQO;m0bjraci)(Je}KdHTUrM99T;?tbHk@ z_{*}n;CS#fl@fKM1KN-6v zHVC`^@zFm;?~7g>JuSL0@uU_D;{zYl*k{L%2%a9!vRp?gE02<;Bd3BDEl zZt$|;X~B7ce*_*5Top(KmLN~x6aMS`=OIVmTK`Oc5HOCab;=A_1N=&USiVcXNv_Brk<;?&@`>^WSOql5 zap^tjW$EYAx1<}T^QENJB8~F=`3k1HrhS1jITf;<-F;c+=O+jOQq5q`5~Kvs(nG*~ zv4=Tu*}x2tvEBwIU=cvD2{>g+0={mR(%A}ZMmLkw>L{J?zr(cQ9VD-SOIUY`=b!Mr zFP*>~O6V!nNeR?aaP2zOJ8IIX&y4rZlV$cj)jv=eQa^v1IjYcS^}{t|y|ZN*h%-IO zTn{V?mIvOBo?!jB6dyNRKepiGrl@zKB%yk5Dj(j?^4sTg-O^-vq5gZk^pf`5^Dk*J z%g&r1K$>iof={tL-1z}YldOKanm3h&^V>=3)M3)XkCmQ2%3CkV9ooln(pZj)KB)CR zIm+7rYBI@z{QfLChK0AW6v%mep;u|nWpKLqU~5oKSi(6xcnxXVThTSl!B|JsB&Nd+ zycIpp3a}5yiy6aeD?l4gX7dD?VFR#OVsIyC6Af*+@S8F4SQrL?xojF|v))Je8NS6l z5cB=nY+--e$fcr;^-g655p1U6T8@l+`MuK(Sp;(a*+t=Yi`w1|oQzG@5Nf##ioLx;5FA>QgCv)Piv*oZUFaN0_yaK@;UV z9qeZ-R{E**l)BMs6n73J2l;YF;V&D!8yGQ=`;iYkvO^-ZPH%o&GJ}1C+()-~e!>#E zgEYXj?@x6fSeHFQGzFFfx|t%ubh$gUl=i8`OzWPfsIIvGL%L`zwnu~aF`>L$9UJ(! zm~zYooMu~6T+NRL?{y=JEErsf`lcIEtd5PSd)$a3a7Uu!a~zW!stxz7Hmf=Kbt* zHGzej#-qU-9Z6R)JCc5b8|k#w*h&Aa8#M%OCH?xEz!uW4b0gh#&%4%@bZkg=(m&%$ z4Zy9Wf4U~Hh4gD&Nq5^BKjpYkFivb|w9|gI<6_s~t;Bz_HnfHMs~i`hhTCz{TU2-McWh*Ya zO%}FG+9%7UZrxHl{szxDVB5S2gVd%<_V??T^+zWF|n_et-q-j8@YV3H^+ zzfC-z_)6lU#Gb_bL?Hfb{Cn|F$NS^$@rkilV?T&}Ds~{YJ~lP_x9DTh&qs%%yQ7Pu z;mFgGJ0c&0pTMl}-;g8V`tZ5o)5C4yhOiv^edxi^EwB^l32h9`3jQPbT=0j%Yl4~J zalr|Jw*pTDz8=uHN(LD7tWVRl#-~=G?IWd0$55slVg|f^=ux1T&#pkXN5cH$QyF0BbHh_#fmV+V z$RR|o$!&(}#DZx?MOEsxbwgv4DVRvsTbo%?m3k`7dWbpGeHN1IDp2Z8Ms`AuA+IoR zy(cz3c+r#!^mwzWB-Mx4TxustO^o6h6=>>6tw@ixJa<@tvIhO-Fpt0U-pvatP}7kv zlVD(*fVU-M8)YlaWjQGZ^t=jGb!+}>`9hXA(3Jky@`YB)|K}}VW>ug`BW*926>To0 z`i*_YnA|fe(4*0E*#^Zr>0SJpw`DlFtF6;<(t9lc{9)y*~$ zqxSR)6knw3-Q1l8frb6MahDM>Os+urMfMvTcXkku#M0>%sJaNj21qXkp-3e}BFM~& zs^8K;oH*D}fqskZQ8pYIAQ>@4cssKLg99R}#tPJ1bVe9Zx=d?RiXxPW@N+BBbJ6MJ z053w$uRy;=huQ{`V$-f?6Ra6rtE)h{MO!aFaZLk0p#nV?>4V!5l}~J8ZUtH^qD2!s zF?K^fT}WGcSzm$XiVl%=*&Mobd@gI{!{iF|Rx~F3?6VB&lbrq8WMC(2$$9Y)S=+CYq5Hyo5~CL>1+<3iL>1*TIUD zWM?4)Os-7gol^nC(utLceowtx9kTsGpJBIEUzxxeM>S#B$gFMzh{=^Y12-VV`bSsB za}$NL8hIo=vVC#Z#x1Cf;|HV)+T8~UCiJLo&|^9D;bdliGRxdJ$(2)w7L=h2Dr0QW zWclC*Jz9Wnf(~y~csg1%Espr7-2@RlGLXW*68w6@_z>+xrk+9jU;b`4yS(se3d6c4e7mE{_>2uD!Vx ziEocOR=4)&Ry-C+lc9>(tMa*)UN!Za%y0zQ+2wQiP!GM|#MQ zdvFGd8KH1a`J|oCbT2e8afL0{XY$UKKSwA>A}{ZFYsGr z`MV%+T3|)M>wh%ylf-q2Tw;5oKK@4hk@zj~bNsi(mqS|cX6*6Ut+7wUlCd?hiP5*B zKZ|||J_RTHKjuH#e~jPj`;G4_zM^lxZ>w*fFNnN=-}YYV?e(sNMZhb{kB~Fqh_YL0 zf=9rM@CdjbkpZ^LGo`;v&q?=7S4v${vosEo1Z(`8RmD+8SIqW7SYP$C2Q#jD{5TI> zrM*5US8=A%fxQc%PWzdSbx&ZmR(ebory3cE8P&B%n{nqcz!z3=#F6Q+9h_coc**gH zq>g`16{jAF2<#Q;24i5JUd5S5H;3)n%?y!t*E2xIS8>oyL{E5!je@yVoN09XQT^hz z9&AlRdrhqzt95r?73UdQO7V-o>AM-eMY(}>tNy> z5#PM3dPeE6h>@DG?{zqbS~3aGrNjoie9V~41GtYZ;0MN z8`G)29@f4NH>-*hiWajOt_@bCB3MHe#}my-4Xk4zozX^BM>eg3qls?8s$_6?vP(oW zy@KTA;kH^|}I1`AmMuh{mC%08OB*vQO1CK?0HT95xL>ZOfamka+_)cb!| z)Jp=U8lqk*{(no&AjAuO0&*~A~)yCLP+ZIyD&s2tCa2P*AKI?B~1S2h|L z07Glkz(2FHfgjhq@uW*9b3;xl)Y zIfKaAmE-uXWn9sSYc|Qz%*txwNYLRbXCRwiS*4vU(DbOc7?Idnm6g0t>fMFz3cC50 zfvLW7ES(@~bI2l)>O<$VCc>vyRuK1f2z~=IFwCed=UhQU{VoiiSy{@5c?YxU(;5*e zo>D1rp%aa;ew652_2NpN`>WXR1F$bk74r5f(QGh2nSL(Hi3bB>Y{(WR|vl|Fv?;Aso&Naj=y z@Eh~?6rRJm1Fo%2ubin}Gx+_@j%!vW&F9kAY`19UKe6Wx2hK`tk_4}v}Gq=*I-pk-rmc>PsQ0*8nl%P7~{K|*MIl4AFCmM^q6?qPlg9i}R z|I2bUa(kp2IVZ9&vNy6d(h`{+nH2t4_;=w)!gqx~i%0?c!aKvO!?Pey_*3X-p|6HY zp@WDRusO6SR2O_V`19Z`!E=Lqg3E)kz$<~D1il>jT%Zyd3UmhA15^C(_9WuU=^ri#wMrG~xt~ZnT%f zoK{Ca`WUD3rAGMzr*ab?<~x-eOc*_{{wSqE#>u@8?ssIRKQ?ChFy>E_l@)R~nE@k_ z4RXA64;DHPq=v{8dCVWCDy!8pxE8}zut!YhDhF zrU~?}Q@LsO{EhJz&tv9fN&VCNuB2m#xT($Zz>{N?1yVcmo$TL)_dFcnz{MuUeK=Jb zyfcjOy*JrQO`QEa$Icxx{r8Sn7Rfj@4yBH4f(!F@3>NTv?jZ7v&t^{n&sT^bOq@b4 z-8D!iJ;d0wegnhAG?%V@|b1>SxGLwjlF;k)q;*N>(nYFEXgz&={XLJi>!eb|Oj ze>NYQuC$9axdjumNCGYLIir->D!`u2bT&x`RX%}+ybcymz^95i7Lb=hUV7E?_lhaX zN}%ZT=e zq;Bd^ObjD^pshlPeBOpj{nE(@LDzlYswIQjoGUXo^@d;#U z$O*P&#b}q30jfxQrHYY1fq;+xsqZ2OkSu$_a-%tCi#-;)P;*DL@;SC)4TB^&#) zc+2JUBw9v6ezY=|6TBgZSRnN26XTRd{)re$ETH@GoqDHLo*Q%J0zQ#|TrDzp=zJX; zSgLPcQMRj6R|H09oIj7Ie!=~7u%~e!$ZyO;9akW~L3uAbw2Ttk5BpM(`m@rL!b%8_|rig9T*&;{J=turg8VPA?ql@0-hN>`xD@Uq@WInbn|c z4Q}rTjBv$!*!_pTtNxp3FmBKX^<7|+Dg+wX)~XgVzTVH90XTDnBWVm;HU6)s={;3ARjfcE0@(LcXo}!v$EoVa57IucqLYQz`?={A zE7{8~#9AeuS8#udr7@+pP7;Vnpj0*oZ*~y9d%feTv zA(po@pH;-vV;4L9x*nQEyE!bL1z^XRxuJ$8rPl_!p;o-<&`c*%T;fQFX0StCBSk+% zoAraz`&nm*CIjMnX9&|J^g3q<(?#@JIvjMC;P%c_wu(-_p`He1vmI(brj^0mZaR`| zn5bt-IBW{1dZ^2>RV!4|4#i>$2oA}i57}u0lt|lYcG>{rOxvks|G(Xv^&n1vUtm*U zmj6BfQ~q!GFY~A14=~O5j_+~bO}-)D8NSuNvEJW%@A6*l%_g2pd@XTqVpC!Yas_-N zUXJ(1+v1aB@5LU8-5fhNc6zKSCPyEQekPiUZi!BdychXpFO~IJp8^K3{UkDb1`-9tpO~J{5_X5ub?)N3UZ+V~c z-tWEKn}t8Za_>atAIdYz_mmryPbmGc2w0|!lV6b^lfNimDj$${$_wPt(!0|0(mhg1 zIs=&kqWWvT=8w6TK_^QZv*bW7%`8Pk&ITUR#6oi~gGyF}6dgr%$a$ARF-tl#!pSUX zY(6qSFt9>Ft6}A^!pH_pkWkZ#kYf8fdvYc0G3bgv+3hB`G_z z%)?vIC>nnm)URYR!0o_{f|-{=-%7&lL)>DEMMmm8uzdOA#RkxX%OLe5#AI1Tk4&xT z3wx(jp<*R7c-^81_D|+wC|E7U%|`LeDwM0#x=}l;#^^JECRL$jCHr0-NXPK8?Q^Tp zudXx~lARJP3cLBEPDAst?e$gYSxJtrqv4PS#H1>et3pFfM&bA>^r^%_Zjz)GoU&zH z6$(@`OJ?Rs#`n4^l%-_fshSoUCG}OPM~M=PU627Wu?j&uDV^yeUr1$}d$h8qjgzX7 zvJ;g?XaJ*dN)_^S;x`LW36nbWXf%M?Fm%~(P^ABhm)wA z)CV%MW?~hRbD~HsYF?sMi>&#t0gk@d|7(E5pIq!Ft6SIn*8pea1~~QAU0eraxl8cn zM*8Ln)f4$D)vhW=QGInM-&rhS&J2jL)gAok=t5*nh2EPim^!*ikfCYT13JK* zDm32A^^gIO`d!da>45cBsJ+P$iK)g7CBA`bRu%ehGQHZKEu{CU8adtiP)9VS3iUU6 z9zc}XMXD~5;we=qzFD#PQLERkuR`ffWb93!1;^)EyUD1ELl`p3fDY17 zg~FSxzxM7=7V_Iuhs|;c9cp$JYHzYuQa$uICSB~R!_BNhn@I+VDx4#-qpQ%5lW8A0 zIJWgd2u&h5N6@L&Rz9Z8F>yCEt&Br@d(G7r9$R-~8ewlCHOUoJ`!Utg#1ZSvYBQ&D zeJ(q&929seqg3PNf z;t9&m(RR9(o8r~xagy)6@5r?$D;$hl?I*pV}9xgFbStRBOCm{7|M z?AFTB)dhTb0dGj_5R67&aXLZu)%kn|>sAh`8ECsUgJ)Lf@ljAA_Nd|*lA7s2v#Lk) z)usZ88-NbBpgNbkd#GSsr=0AghdgJ&c8ya#XrAo~Gs|E(*YbW8SW)ye!&pd!;wt^!Q^C8D4dCKnfAFN>@xjHxNyrKCeBcLx z&jmgjI5lvbbc_@VjP}3c|Cv15f1Cdz+2cRp-wPf81m8b>&-)(oUE@0+egP-==6K)t z{>FQ+_tV}(-rds6-W7-!INdwi>s9`yysZ32c~p5oxl{SP^q}-9DXUzB_4JPW@?-;eLhb|w2*uXxco7TSx7w1saf z9Lr+XSstajunv*r=Cf#PRsiOX zf`Hc;Nleu&e=RM$vn{QFk>8fzb%SXJObfyMMSjx-rn#k%ZDx3$m0xgyX<7!D#f0Yx z`AIjJrG;$MGJ<(Te#{M~6);N)=3$vfL1X<&LhhX@s9NeVfBt{i`|j|#imUIvd+*(H z_wFt#wsAMu7*}c4TrefJY=d#d4b!s7(#jT=v_i#&UJ{ZJz}l5U8VMvo5(pha@0gCM zq1x2Y38DA)otayvUy<*R?|r`Kh35%DJHK=0oHO;#oO7n!NE$=J(5v7+5VBo-O#O9j z_&w^cE5k2Pe_a}Wl=|zE@PpJ}e-Gb7{?bP47WG$B`vdh?Oxr^J719p2j3FTn%QD9A zIPOeJB-VE`W^1^S+_pm(Sderb?SjyS`Ixe={K1E(Q@F-*E~UIHp7Ln9J<6EnF@ftz zDys$N@TK2XFb7B^(bL`01J09hC?aPz%gYXk1_Uh@cY+;+0pGcJ=2XT`)Hgo&l&iz6K+HAv#jcX9KO^Ir*^P* z$Vg+R!^NAiXq7(1X(ExCP$rl>OsKw1{njY^wmjlnp1_!Gp4Z0!Yx*kT6#=|SbFO{I zlzrfj0>2EcC;lDtn6meMoe;ubY?kLByL)#hN-+r&cL`zRyUehrdC#AxeHO0cOWE6H z-;p)TTg-?}fc-8*jVi}vcqv<*Z$-HsQ4jnN&LoM^!xmeEWJUZ9OxVZ(q$)Q6uY;IAo zY<2Qn5**EX0%px+s);Vg!xH_vv=dy~@bRp3NuCT3bF%kt>_$!@$b-p!(>Cg4%!SM8 zso`q8#I9JKsU|X!+b+m^x2J9`?tdphA<89z#}v8HoN70!c-uIIBoZPobLUf%fY_cnUIH;bx@X~aQN z->vkq|Bkq7rhg*{#En-S#A z=jOX+?Dv2YM*KHH+543+rYY~k4>9BMj;>>}aKEyiqz5O83^Lc@4G2ND=9=ZeW;}EH zK*FQk80TceCYL|akIRg)$gCUcGMSBNI}!e4_^&u0_6qQ-aGpSe|AOS_j7u6ksU2|@ z^iW_gN$7awQw6NLy@^OR$jm8VKV)2|GOok7=Sg%L_W#!z*OCAK25opK{Zjgl^m*xH z(}$(^P7hCg2|51mPhAI*`~9gCQ#p7Ia9r}c+wX=l^-pZtzGLt?d>0DDqI`yvU}= zfsx(8BjG{wTyryI2pDU8W;|&8SsM-~0ZWas;1jSNUJTf*FVS}oe-(Zt{Fm@C_{;wP z_Fp*nH@f@4H=~TtzrI_^`$92236#7i6cbl%p#G0gOgy!r_+7k4J9SrO;iMjFr)R8^ ze@g)LTvhUp1VGQ+C2varj0SH>0E`ZAN&t)&Z{SUnrv<0M>v*5dm=`C^ZD?wMSeT6@ z3ohh_{1nfVEEYX#*@cpT`)e5hKanuSKzH7!u}*e*ktsL{(y)&dEM;q zi-LZDGtA165=r03n^Xyy6ZJh6Q<<#)k=WGFqD&j$U5NoOP$KES@s!U>im;rZ?Ql4CP=sL%k}I6S0)Z z`7fdK0ZVD;dqwCc9#SId%R=XK!JMehv$J&5yEvJwFG_4G?R+mt44~?K&r577>3lmC zEM;=;5ag_pcfRKYrY=xo(PtG{nE=m71dw*VrzK2Po$o2ZP&K%taxMC#f~8E(e+r!s zSV}wJ6GG?nkP=fpE_6N@%!&G#im6Q2M22gdrhb1+(qkju~u8i7^sK?P7)9v=`|2{@uw5?J1^LJB z%JoB-9R=)*=)yHjVWxuF552|}GJBy{xk6?i^e?WE*#o`86*Bvum+_H_qX>PLq91G< zgTi4{0Jk2GxIJerJcEgR%E_q=MKj1aQwgIFZ;UhWsngmPj~i{E)%e_OZSz`E1w;Ew zd~OEiG|?*D6TZjOev!-ZnLMOST9kvp0me@Oo$qMF!p_l?90A|!!@}d8Ev5S=px`O{ zaBQ2iZ}tFeI`fBPci|&d&oN1%=IJ7+flEdIaO_UUR$fI-@Dfb7Kjxwj$L?Sy(YaYe{t~rp13D zf_PJGkKIC>qBYBzVtednR#M&++haG;reKEb3fdHI-p9zLv?;)aEV>;Zae#ZO8$2o zLqrHvEC}(SWo!x^8G14t`%~YGZ`{mA*s2LB9;V_J0=sQeUg@tq)E=m4$g=hI8Sc?`(&co@FzR*@XgnXp}!07*ogT3*91RlE}yxD4xTiXF&e> zH(4jl&VjIG_?t(gkU)_yk#5SK`awKER%u5Nj;b(^BBIy|NoA8!@S>BZGq-UIoOh7r zyYwl(jI7?JPx57C@h<%*Uq;sM(kJ*bvUHa|j@uQd40U7y_y1h?I(Br~uZgJUR>)+_ zj6wSu+{6s8hP7QB=s^^a<||K(QjG%q{NL?caSuhjqMxB)C$EpAWTpHHVc&vcTp0u_ z*v+{4sdT6O=(q_*U(yUvKGeupxHnT|MA|A8_v;Zb>G{8LuU6>{RlbS?_^Zx z>A{^$HmF&(ZU}|K|M5-c?5L<@&{@<({z9G{8w!~psL-g%Imwe_D)cM}jk3w2u7Njf zK6{~$BuCfiEh;$fEcjn}NODMI8WB*1Peb6tEA<9d6{x528tm$rU8;f5Gm}F?A>&b2 zU((<;XqsdT?c0FhT=E+ZvV)a}lfwR%9~Kac$FE=ZHz>$Z8YL#7%bDBk`~G?Ac}ywO65q#osP=zmh>e11Ah7d3kV&^exGeEEGa^H zb^8kl$r;RRYhQ^1%kjKRffzOIEAWzuvK3Ph*)VKJ0f;;=c3WXzjsmMW4CyqJP*g5o z3XWls&rwPQt|0me3du$O26C6MG_FcAE1-nTkuS00vQj_mONO2WWeRsQfU0SNb+1Db zdb3^*0IX%NrKe$3%o*z+D7u*4ifu!^^7bgXiu-#c_xBL)?{bvXgC5V*;Ccmx05UPV z_TxOv2?yoo5&Ls~7L!Dc+Mn?Q-2rj^;8TA3a!}Ig%jBmo3d{7qq=ACKX>}WK5!+Y$pJ6kDnNmRKoX;&?;9AXbWTjJEdkVx<_xRk~AzNft``F|l!l z_0fJ*6bym58Xw_nti`JxujMCvjSh@e@?*ZEI3Q_93G*F=!ZKWw8s89rl(qhwyuL1u z;by-fa+5ae4w0LrS)UWFCu^^VMeB*}wVek^;;ikDc(XYmY+^>yWQbP)km6u?T|`OL zd{z`ql>Z?fgx^}=X8sR(`5llbzx^GG|6dpSB9vO1nwA;{G5kB=oBPaUXL3z)Msm3Q zo&Ab^r+txqn%!XUZ%?ty6JI8tO5Bq86WsD21>fEy6Poq9b+7d|>z7vET5Q!=!{L3u z*W!1@e;Yq8esFw7d}!?3*t44Va<(l&S+T$cKE z>ZH_B(Vs5E>!_&j2_M~>6)~@ZX?V+VXoq_);>xICuG6=(i%f#q|UZ_Y}F9d?2U*YbA z{94`%VP7bS9vzmGpDTMI&}$(Cdiep1SvMyKd-zRLK)jcff;|N%6xF>D0d|nA4&hpn z5KZlc05J3{lOPyR1bqLbfYMIZ25XM8V&grNvVAIcs8`@ku^5DA8!Xz+o~epvyp=!Fn4^h5&(=XM1| zkUe`L1`Oq2@Ci6W`I1cNg%B`CJ0;WVUWf(5HuXYN{rFYEB=>tJ$@D^O*kX{x4@D(J z%v2TiNve7wPHd^1gj2(($@D_B7*mZKHY-SWpC?&GFNBXFqxzD0B&=LML1iyQlHp$H z>F*J6Qc)BTRmM;_k-CCV_j*E2?S%+4JTkmGTnbhuA79by#+vy`xOh$^pP;H2V$B%i zqR?R3Y9A~2gsSX?I5S2KpN0{OP-J=`+Kg!qpMn*PkW}|Vq#4t@91_VQA1m`D%k)C9 znWP?Ji6bOcy%2FGF#sarWb>=3?j0tR4f1CRpYE|zBHK`zY?z2On@>{JyQ@q#Ov1@V z(F~E%NH!p`lqXtc?_gPj3adGx$n*}9DT63D!Td`8mt?EKX$<7qYEY3hTMa50Fk6ko zSemT{6$NCgaf+4MYH;lXWvf9TWwshr`2DigAY^d18mA&fwi;9@%~pd7WZ7!a@A7Ol zs3bUB4MM20)u1wEwi;9zkgdikR%WX~#foe-s7RHq29=H8>SlN6KGaCUh6!6CyZb({ zrD@Bz=Q|)lcn;p>LQ(S0>vJ33tU!p_;H{A49c2ZAcj?wOH4q-dw?cAv^x9NgL+h4? z_G}xx|3^xPZiS5QC?y2S0lF3?AtYskx3)MeTfvo}#ZCN!>e_AV`Up;!u_)Kj(cGC| zmz@Kz6J#M$ix3aly3R>Dv;ne{<~LF$gSIw1X^J5AvX@Q>aou%m&PngFA=lP&boOXU zxglGdTxO8pbA1Dq_+$62jVQuB7J>H!nsVR{e-xzrgD2KDXDRYATh}^SId~8ecktE* zN7wajU9~l}q+sOMBb^)y%%o4shi%O|$vD=*LR?jcLPtp9(5*jqtlQkvm1{y#d!%gG z)*~Fk=GHCHWN034$-70$hipB}F$mm)peHp+$*x-ub*u;_-TCews>ZQf z4{_q(-Q6nvc06IQ$JRAYvI+;q?I#It_|}7+ewFLol5dBk*PYc=zZ$i5wG$c6t}ldq z=+;$^X>gt|NRGLdlnvgx(rJvQhIRQisxR-lb%mpxmrR<_l=YT7yMH+6kKW@gmF2x< z&ZianY^HxMb$&)`Gx>RHZwa@3!3f9h#9oW!oO2HR zcnkUY=`3wnD5vcjHcm9M#(u_V{X6|d{WiFxKS@7A-wQ6pKMp^Zem;F;`giG#>E-E) zw3T{2b!Y02sgqNUko9kL@*6lYxFPxLWKZ(oWL>h%{s3YEF13GYx7Y{Rd)kr2Yl&@% z^Ao2e)+P2&jJ3YAc7W4DADk5|v?{H1{Jr=i@B+Zrcplyq%*2zBC*a=L1+kN3KaS0c zjf#E~-5I?p`a8(}za~08IyCYb&P`Z|3U`CABjN6Uh zhrbBF6@DRnTliPujp0QQNT+MBYjMn8{HpK3I6p{bc^Htith|zO2{_U zWQfB6xx_av9vDp>)?b7!Ib^*3n*{wNoQl*H3Pv(4R;2JmbXerk*EDrxYpOEML@uhP zzo8?19!VITz%!~=G5Rad2q6ih<9SB#XsukLzwnHzs<1V@rfux3$~f;eP~HTZ0zx?z z{P3g$PDoxl@RJVUW8e=GWNmgBO+Z&rd^zQ4u_toEV9H4^*nmzt{W3fNYtX1+#_2*O zh^pm4bde@xS1Cu$rW!baT^abq0-2#tOAk2xEsD1%$FhwE{xff}iyrSuz!rH8Kh=lszgH z5XvGIc)=kS!4(mkbaC??xMeX0nI)Dp*4Rr{PMKn+tempL3|Tp4gz2(!$^z45<&^q$ z+)}?!0Y~>v!Y^ZV&<~+h@j00F1%*kOC-cjgtZ>Q;n4ZC_C*g1yDxXO$wka zG=`aR(N3YOj@5Hl8G=!Ch#Wy_I#`aNR2?KoP`Z}O5tOoJas;JqDYJSw+LGSTA=1~f zwkVMy7+dTjM^Ls%%Mp|n38=D#sDHTh+78@&5>L~;_u`QKrmWglvfPrL_r z|EDFECx%00|5err*8bL@_zRH1zbn39JP~^aZu#@EeIbJ2$>_P!_UMeL8F?h~$H@9f zT_kKiX8s;B_|+NT8TZ300!M;t(r1vv|Cjn2h}VBFd~^8t@V;R~dq6u&TdtLWNdH&= z>{|#&LM?FX*wwPG9fGOQ5=39h!O)+1~UtAr;wFO zFfeWJi7Hy>1Sdf7>Ai3xahSATbnP8TdAyPmjvxal_wGF|63R*I#D|juRJ?cZvBBiQ zwP$)EO+UV!^b$s+sR0M*vS)TNKfQRS7j8mW5*QDGBsIO8ovgCNnF4|noG@S^WRT<7r3 zBn`c$D(Vm`QUzgCRCyIupm=aE#EOSH9*Vc-I^GO#TFLanMG;GaI$jV-O)p#+t$@MB zc074hw_j03FWe?!w+nwzpzeyOXy+ezUlpDLLAN@YUbtZ5C36VW%D}x7Pf~~LVEvd# zEj7JxBgHG@k_esKm#v}~?x=WW94fgoHN9|kC9g(oPrsT>FI;T#`at>uu$fvPxbWgD za!G>pfy*#nABRe%4_u7Ns|nNx?#g(5oEU$#K5&c1SLBie=>vCbygm+r4H42dDM#6M&@Kp7}Wgbg|hjkE5Z7VpLUd?Z;OIV*!(~iEwko5C4d)(Nf{`KmmcAf1+rI=N&joeok~6sXfOQ71QT1=sa_ zJJj|r6|3@Sf^=FU>g1BCbXu&eC{U+GqE7PM5x!1Uy$h8zDm!F)59CKJ8iFXF1UCXR z-U!U}F5pSf2n-^r={-Q4gr;EYmj3aKnEXya13+zLmTy`G@2tKmY&rcELW%uD8e9;l%Ta>l1y6_QZn3 zIJnz?!Meffhr9g)tv#$zd`JAccpu#CFO2UQ*JCfn?uh*{wkftOHZc~C?ucF!Jrhm{ z7Dgw)8Nn-&+al*gwm`oBsz}0o&AiS0t=VNRHm90#xYNJG_=B;2Jjl6dWN=GyE+YRlioTE}$4J0$3E-sl!c6907Xt2JH9vBk1h_?N963?~+(I>u z94i6tK%C56)Po!?mFt_JSLAt{fZ-TLS4p*mjRLLZN(G2fafJfJ=(k(}Vw5`wC+*;r zqcz)z^W*RUIEdGWMsAeUz+Q2J`4&h)T%S5X0b=a8zXHVAZ@vP=*l(T!#Mp1H0>s#_ zUSdD$-m_fqVSA5w^$8}LBg1eOnk~mL2Ktd4!`Np(IfgOMzH$s>oqgmO#yET9WGa5& z;qF7r^=_PGmns*pM8P_>aujEu8WoDMP_+uh*r-Z{Vyu)=p%^<=s!)ujDsU<&-V*dU z?7|7c83c2#4~Cj0fpAvZOA293G*b#;>@!0OVT?0f3SlfWO$uSmQiqfEFiO)l>BK3% zsA9<#D%fST0>;^9loH0+XQUFw*l2_j#@K1N62{nSm=ea=YbbA0{$90QKN>%~A=u2# zs&xZDs`=YhFz0v~hO^}!atve0adHe}#j$b>W5V6#7{-3P$uW%a#<26f&1XG3pOifEfJ;DL{+?$`v5S0%ZyiV}eq4HRJDL%k>Tk7xpR^Y*ZozaW>jT0b*>F zR)82Ar4%5>Mo9&Tv5~C+F*Zs_Y((A9mg{+b)q^oa&sy!`SQc(+!HSjw#@R8hgfW(k zDPfE)qe>WKO(*X?Gl{sD$c#PV?Xd;a=LG6bE{w6LAB{?Jby0m!mj~ zg;glVV44cW*ej$$(dH`oPKBbaRr0M0MH{Q+8-AyNEkXCMR?(dNPGPD9!dYpG6vCKj zvJ}GDXOa{`8>e)l6hd33bb=H@o27J5ey31Hd0Lh08{lqy68S!B?3}upHrY`)XQ$Jj zc}5)4(#%jpXlDq%`%|e`QrD(VPyHA&0i=?zC+|;Qm^>No|7RqJ*zei*+UMFE?N#m?wOTsyvqUyA9bN(amvvoer*$^u1l-pujlZtFuidAe7r#CJyLfke z3A_Rrj_r(H8|#f76`LCy8T~Z+Nc3;flcR@4>!Rt%TamjWe}D}C2Z3L|X})OQU>3~{ z=3H|m@+Pymd`X5oZDlnS0~=m43> z7Jp5_4Z(zWvu~1UoBLz_M+${xAl5CR#C>idO0_y$d zh~Fs%%prg~q=4B3a63wmLe#{4ZJKkPPE@hV)F`5lRjNi2rK}P)ifCr-!nTqx7rLDy zg2lfIfDy^!Uk1R4Xz?!sU_`d~=W-3W?)b7AMM?IO8bt~Aq8dfXg%dS#ZCUI1gw$wRY80u_imOqiMk^*qA?Znt@n_U1Qe*sSHHy?2e+s1xBlbc&A-sz~ zK6?0Z;u?SVXlx${OOAt$hX%q@L5&X%ge4nX;{kTX@Z|M{)Xx@~sZ!?~_YZ`nD!xzL z9$~&{$4GDQb_C$)?bdSvIC{JFtf(-mmni%zlpvUGL7d_8E)=1|{q9F(^z*e>S4lUI z{|vy<+B^|}qqTXQ*T$)rXw%2<%&V*9JM+iH8l~;=XaJ7Z;E@0vt--^h25fs2`45Ha zD)B?%8GeHgAb#Wiv;sp*{geVjOZ+6?5vs}9(+h&y&iLnrxjz6$3nUDaYQm2e>Rx{6 zxj5OpGa#0lckUU8FVWq&dmt<|{JG6=Q==m<>A1Z@$5nh%-UFYXf1}4`wFC4urzE^f zln{4vA4^Gir`ST$0daQ#j&8|q$p3%3epV>GEq!Ksb$Vp#rPSY29jR%_uab8sw?a(+ z2>W$-<8QM)%hnSQCJKpFiBZ-Y)@4?wHOn&M4?^tzn)q(9H)EH;>j8Dq&!e|SPmIou z+Ti!!A2~cS+I+?Qo7rMcH9j`3HI6Z68@hh4einSa?*VW0Jrq7ayg9r$JXZS{Ztl<1 zegSv*V?*zSZbD!01O8K00M8%fJmx;DY%Y5Y&~eb z<{U975^(%M-iIQIs+RHsc>SOpgYeEpF8YY)(lMa`zC9>^ocA<{klXBG4?4a84m~J4 zo)2Zy-TA;N1#sg*+3|cJ>T3MMA3l7~0{HKsWOqKC^~Hk6PF(+!2?cQ6VT9$9lh9D` z)}f%X7fxKR;|t)WL+K^Hb>af26u>cu(#v`Egx71kC+(gEaLb|el00qV>jkbjjIg|3 zKGRtRaKUK=V^Q%Z8>b;FD>EnUT;T0n|8pMM5~UFhd9&p{vCW z%%%(RBVJ||rYl8851R}m@-(H$m|87zol;~(7%XzFT4c{_JHW~{YLOAOT4czR$%XcK zRz}~OK_c&6s1jmbd|Kb%Ray1)0_4u*qI+0!mC$j&r> zb%m*s(7}qDfmkK+jKY*i=m;fUu)LGi@($FM>k5<9@&~lKk1Rwy>MyG0jitE+M`i(WC5627%f-Ptu0u^QA!ojgc_jY zNTsZZP^sdGU^118!<8xyH1AI<3{$HJ6L5fvL)EeZp;EqakPl9_4j~2W1E-t10_28MsTa^sYYLD(P9>PsD;T9@2AwGwjuRYa4K?;`I+9*=QWM$5{Ezv7d8v6i z#P-iM#~5E4&l;B|7bK5?sDTSp<;nMxyV@Vwuh~!7*QZ~$d+l}hzII9Ct@NFVI}*Q1 zv=aqxd#>N3b*fllTHSS@9_n$Z$&Ii}iZ2&1P?&|lP(C-`{8d!Y-zx`6-1KDm`lj;J!S z1C#k*Udd!~xL2XP=``#p&exHs}b+-bim5khz~#9@bC?dtYlhD3GaI~{Vus1Gtb0-@x95ulF0AAX0+ z=Sugv$xfHy-U{P1h<;*UiT%I0_q=Z^LxKp-I?SJ6MrYQ(5X(cCx@LU+waSbO0_hJ|zuI8l3h?c#IlY(lZa-$+`3`fHZ zzr6}i_kN0>t>rj16sj(Xfk6wdy9v3Suxk{KHoqW3NRIttdOc<^Xj%`Dj za6c6$MhB>v7)@bfq~NR&cPEXh#=-0yM}av>?oR5$WCUpWjQEaBJK2o*Hg-Iur%snA zSNmP|TawxpQ{fAe+J&ib9XwO?yrgyv=w+lGgOJUpWj|6k79t(qgPDs#4`d-*w_UjU$ zRPkpeV#?HcNWjS+4%=pbD5#@+JM3=zJ3&eS%jSjGBtWS;&q&0Ssq^44ql%j9=!LKv zzYXutL9iXZHE9fS!LTHKhNB|9RaEwLGOUBQFzX-&G2Iv-H>Yf42rM43Dd-xik9PNh zl1InoyM`Wj6i5j8nr^@`PPD|dzEy6ENf>c+3J858vrE8wu`?84Zo(@lQyo0~3|pqJ zLi_?*QZkbNX_t~A{7>nU@4~Wi zQa7YdOf7;h_?MHHz}Nf%$uailu*eqdBkie)ZxYWXE=io2SeO`XePF#}J)kYpGFo}) zbK^K;Z)1%0SL<|ZgSFJ!+nQ+YYH9J0qf1~fv zp4RTwF4NA?vgGym4dCrZo4oV|zKqzr^m)FF7`t>QUq&olx`Ta@(ec@6=|m63GdxqgQzP$_jX|AGc$1au~_6U$VYd-$0$V z2#t$h80Iw?R;{lakce3cl0(_&(3z91j*Sgj_#ZK2O~_ain&+Fy$+yDlzl<@FgW%L( z%JykGg+=MhY#E$>__de51jmZw{K}m^$y;CvPfwz;N?+u<8ZtZ6ymPp&CY-7!XEWM4 z`B^yae#AhWgkr3JPI5n{9tXl&abF1&uAY6EPUN~MaTV>&vl092EEyZFs=YWi$Szz> zGdYz+)6I}D;p&-=-_^#G4t7NSCZP{?M{V?T{FZkoJQ?1#-v0s*k31E;Wjvjjy`VV-MHBoSXv6i~O#P4_iBQ|pveQbDTKHs{srK95Lw$|tY z=+Of7!?K3%^{YBs^X{|a;iJ(T=coW4oLbqic1}-sH@tlUB;n9tz0xaL0TXF{6Z%>E z4$ZYL!7_L_t25WtMX0oIQJ-~-7eOuXF4VGybvev2juIVvW$+SMdsog0D#N8Zn%3OX z1?`Y$sAL7ZK!@dWb?%AKBQ`z)6lq~KHu8Y zhWn=W0aY}+r+YosItHb;({r5OxuScE+cNKag9ExeuIN29R9#srI<|y&vGw8J-`Zfm zdo*;CejeT5XVQTCOLRWomcT&D;zx~OTcW)z{?yM->GW1R@-^PYv>XH1C1}gVuLjeQ z1GBRUM#b#PSBEDgpBBwU_>7zEwaqQaL*A$N_t!>kN*_&rw{J&pE0Mjn8&bCfz6T&# z^g&!!X!`-wu)QR7xDn#dR6O$8W z>OBKiB|FDVR(~HM#p}al)%T`jCCx~>8EZ$$sc3R{c1{q#48+s2 zYM{z|Lec;uk^ld``W>OjYKXko;61&I%oEHN=0v#1f6VxcvDG--n5ciE-@&{O(3fgR zO-g>6yd5G04oQx;-?wkHe`X(Kk4e0pxGr&0Vo72MWCOU=I?kGJmBpWr{}nO->AzO;R)L3+CA`pUobI0&Z4>qen{w1a}sCa8d*%_ z>Jv>Zf(sH>ofnM$!X%Yc7QyvMDi(WmN+_y};B+JvOU(D_iD&BzZ?Fcpo>>qub94^c4x-$%jJ6yWU)JgfTy6b@(=FK+nbr>5XOpF!pVk1A-? z72x>{cGMv%bS|lybZQFSGVw5pkTuvBucFZ9WDRD;Lsar4-UswP06s>0D?fSZ@` zolR5ii&k6caNG_#(a;H0z&u)6$n*0eHXS09t5jQPS5_3DQ>M@+Ya{V!i_DBQg;tsI zFiB7wZIHDQqLM3AQ#eXhO`tw4qCV2cSNtZbDXbSOQa!#xQLR%^1&Y@!6EAp3%RjMs4Q&tq9Q>L&~ z)<(gr#1fhD23#c;%i1VtNGwuS6R6KZQ6J|5O7#JiDIBOGQEg_d^xDvo`V%3D-d~dL zjMc?Tqwhx_ie41`S+p^_Uvzln^T-pC%Oa;onj$}nj5I$tpER#Fx0;>iQkiRD-(5z!PckN^TyRipV4KkfENaTX05jt;JAd3^e3!Q z5F7B%_&?x0;mr8v_+jzA;)7%F#qNz=5jz`v7Z&NG;2h!3a3S0nt_$1R3)_-&p;9P6U;%wFcD#|H>CF!SS1Z|y z^443cM08CCdEp>u98TmV);ZXZiV=cB3sNt!ejh|2%Cp4!ooGL&240xO*6AwI#ci>* z*!qPMEsC+&`Z;!H7ZgROh@4RtS)0Wkf<(qx!6b`tzTW0sYs=>DTw^V`giI$%Cn2ls z=|XuOQ~nE~yoT{d`nga}rF;SYKO^PP!qr0krwQe3{XZ4T+4_GXl(Y4pI@;Jz)8;p9 z%y+hQ=N5w#O=n9(YuDmDq+@~WuhuQt>x{{T0A7JRof)8E?Pk<1yE}6HNqTgLH3vJN zLo9)hVLSl%1dtzL_j!*AeM1HwcK0w+NY3+t!G4Ss2*XRUFCzs)2vY3h z%!;m{GLK%UX>XPf>TY~hvsi%oXBKqpYTweDZzTeg-`&#&qo_v^;W^7m z)(q4H#N0ncpR=Y6HLA4me7IoW1P*VjI-1ZRhOs+8boO9lvQRQe)3CEAOHjW)*9c4P zVsPL<9vU56w2-z6XYiKd7UlCBdO94~N^D6f?7;k52eSeP7)db>VEG7RIxng#(;zK` z<6`E6%fjMZdk?y%hs%)lLygKXsNLGo23~&PDbVi7eU5ek_F!&q$qsDKArvy zk8YLdRyZFQ&qoWuO0)oQbIg6t`sc3?vb)cty7KMNb)O4_GQIp+A`_bRd71u9WLkz6 z1z#q|v-n<85neL_WO^nL%E*mtgNiRP z@5FCLNhF6U?@xFdfHH6L=ljwXUSE>|pfi0CSbnSdpTP24%y$CIZ#LfyEWgQoEwKDX z^OeBz8_X92%da&mB$&a<{AS5eGrH*<4#k_ZIwlIIQF-XTwMs_&p4|-+4~$ zEOm2FYpYAVAyB$Y%sbHi|FY0!A$vbNo_IWQF1+P8BN4V9v3?I<-gQPgK{4N88Od@cF+ zB5dt-1&q{1hTKV%Id^BZMY`WPTh`?ZA4uk8n~#dPEAn zYKrb7oD>Q250rf;5b3Ilkn0Z}>dUAUHB}WM;U7mc!#QZ-yTcw{Lsb?b^&dLXr|NNO z*jjvw=|#u@h;pNd6!K>BDXWT*{ZB3*-%1n>B>v-QY6sK_68>>Ixiku$s*8~1kLwHA zNfXYfl%~rRA;BNl$2}rNJu`~6LLaZqHgvYbmwan=rdDtpjgRpfYFe?z$<;!coh4=K z^a(S?YC+5yvXG7VXs@n{VwEsQI3#QxKEbqNMi9;+kar26FjK5l2*>vbiljmy0YiwN zgS0+V1$`V6g+5iqDMGJC3>8hL2-&09yG=xcuCvr6VV(r#z6o|!(_|#U z%7l1jP%SuTsZz4SiLz>fl&LA4Al}YR8`#_Ecp24z*Sp7wSBKMZlhSuAq(L)JiLa`F#X} zl%SqKKro;{kOh?DKcGN$MK}2;>(f45&tJL$UZSa=B8St9G%G8Y1h*T)~YVtnFCD5DfPOeGrog9-i>^JQP?Q4vk z#%;!*ji1_Q*iH5U_7r2ivCyb6N^B#s6J8p;Ao1J8DTxkvd0;yD2YhI4x30I&vyQb^ zS+(%a;0N(X;+MqFh&Mun!NmCJ_@LOgu@_Iy&ULajmw17!ku?#< z2~r-6+8mDy|8j_N9w;3u@Y$BllxP-xAg&LBpL3g&N$)!_hHlK~aGqk3cuv^Y^6v(gfVwOdlqjk1>ONZ+#c@bJiSkH(~#x^)D!Qm(&Mj#3- zd>D%A=Rjcj(Al^-SO*bJ6FG`bAgfRk6_%q5A|4;AC<&7D#J>K4mU`UYvK z7An#AfFjE6V?FAFqR+<#C^ZUp_%N?RNfi{{9_OPnxvNJ6ztZN@WmP^E27aVag(D6X z#436-29!M(Q1);@*@FRP z_XU*Q9Z+^BUJ^vz^*`Yqj(m^TZC(+yr}`kM@IOI??*tXT8C3XMP~j^-ShLeQ)SV{EN=vC2Eqsyb?BcDJXzq2Db zI6a7%&q0QPW6cHT2;*(zCgXJD$Hr9sJN;q(4|-nTS1%2}9KJeya(HEUckLtXPVHfDP06+Uv~Iq&qbqR%^Sp$UYKEv(LuXM zfKPszFIj@F=qu;sk)9J1f{A^QpVs?qvl;36m{0<)?1MxEBKrXOC-*@r0><|EkXj*rMIWRg zV9X;u(k22;?1L->jO`JD%Jz_dKwusyJLDdqWS2#K5>YDpAoBplUJ>v~6F}ktfgn&G zNIJmC6WovCSrdl+fc+TmqbOU7!JV}1a1SLg50HIIAKXGw{n!i7RCI*OKA1+$wjz$Vr(DSkBe~O#F%HGeq4mRCdT#w{kRC%Oak*j z+2N9jl3f<6No-S5gu5k*y&_7JCV*=tfgn(xO`JS|{kXW1V?R(oF7`0C6eBWe*}Emo z17x34gv$=7=D`E{aS?I?Q2kgEeM!WxEJ88>k$r&tlZ%iCfawdt z{TOlpFiksPKZfXksvkR5qMxj%65rXqYpVQ!KGDV2Z7ky4Kk)oc; zB1GqNl7R&RT*RjqAu=B&5M$d%>4jcbgs^;+Z;r>y+s5}^uPiQ*OUAbhMR9;Y0agys z1-<{bEc{j|{dD^3^jYbn((}@zQ(vbZOrq2eSGf71=kEG+#8YG=FX$YF3(>@sx3?aiX!z7^i=!Kd7Ih zcj)usB=oKC`Q`ru><0_TEg%Nx*I}Oy@uUPo`L~Jz_Xv$br#^d+KdE}Btosr7dyTT$Mn*2PjZ+;PKA3@`E$>pU@)2Ico8NWH{5 zSL_*tfDwF&^~WIQqU=koKS*tj?&mpMFSgE7sVNz)i>))IwnmH@kr!KMDA|hgF1CIt zHwKzZ@%$RS(XHyvRC6%~+Iqk+nrCvomL~GB31_lCoCLFD+7; zW%J8=HDgicAM)QcbT;|Xde#s5Z-i-Sk+n(eP+qzmu|qAgHj0A);POGxEM=`61UWTa zlw_gRBu;rCiNvX|-dZWnO&(ORNWHZ}i5A7Ex0Z`&bo}6~8te%Zbim&Rp}DDgiS-*% zMTa+cbOoERpDCdn*TvRpViO{+Xg=lSU1asBu^it;R<{(3o15di&}vj;Ilc?6wNlkk zLvw8Ft%H z+;{Wtck;w|B_7FYOIAK7_da3*n`|)$mnc6-#K>z}tPdMt>E}N9RSy zL_Uo?68THyl*l2Gnuuk-Y~G~(#w@0H!ui6P>BjWF>GIUO5E*bDoGl!bngE#sp4E;^ zUXeTvJPr0vmf3G>N5b2;f3P>fdjgXo0^o(j^@(34+7bsO_OQOOp0TdB{$%~qYJ-Vq zvSr8Lir*hUKYmucB|bmCTkOl&ld;QUr^-J7|7U(hek&vx4^HL$wYvoS9nodv{j-t} zcsi1Tt>k^ajJ!`+g8h|fp5%SPlK=2@>Ke+{6o&*u8QT$Lk*CwdnIA z6W<{`wR4xnQ9ptlMty2%2^Yn$>#>KCE29XcKM7*n<;;X-KlTtWo9rqq_MjZaY48A# za_&nx)YGD9(reh*Q=*;-$msc`oSCTSKl$$9-JdewJFzFwgPp8x6%mw=Bd=2lk`eDQ z1v^o`M|nl+a44<_e4972%$Fqg7SB%MLlS#a4ixKsL#$W4YmdDyvXeLNYkcF1J|eMK z<;+Cc{>3-0=j6dQ?kjw2cramzz05bR#0Mnyl7gKm-;1K{#Jlp?3!=KxJM!4`qU{in z>3KWl%tYCC@UqE#I%3c9>=eEnv1jE#vEFA;fD#+ESTBDrEnbG3*MCT7i99SdUWyyd zhaDgbMva%Syi`^0;_?c5RVSWCp80_f>BLhsA5~>Z&9%`x^_q|yf!D>!y8*s@W5Icg*+3<(sMW#kuI-62hVgI%~dG!f?)v=!r?HHLx$sU zrN|*eaX1t$=W|-~jT=@#Vr599JU7>v?`-JKqhN~A-_fg~Yf)*gX{z_gV0Z;`n4h!Y zpjFuwD^}o_Mz3Ipq#FaxemBK!DTrNw;tAw%PG)YGlW0WLgOrUu*x3_ibq5gnuIyAOm@;#B#ej~A~Q7EaLjZTg|4B+ zv=H&Ih>{4Vv4SC9lH?EZkjP9FEcP8gAE{D2d@BOwE7v#t>?=v+@HH=+G&4b%7vN7sc5)kk%-h&`nui{Hv5(}; zMA<&%`;+`#oDcZc@L58(I77I+OH1@Zsy+s{LG!0YS_Av<8+KE$4HPq0f9-z5GGk^c{XXTe1f z`~Qo?mPAY9ki>$-%*4dR&_vw&!g|Yk7UBXh7ObpIJK)$y~zWO4HbxYd{bBW^?VZT-Rn{ z+Vnr|Aq)DCr6BsN8bC)VK;+{ZK!+lGlT53Eywm_E>q z&lovFB5U(z$SHxGDVhR+j5!(ufQ(7j1^^keGz0({(;OK9WXzLQcWFk%#cCWQ;UYDT z5pbaz$H;deK1ODn4-H|ur*D$P_H=dU+sK#D zbRza3<7z2n8V$Kh3ZdqKLB^F*2sIN7GOmz9s5xnnak&&yP0Mnb6yiKW?cUE^if=_6 zr3q=dern1X8V=WEV?_6f_LmrAHLV^Nu+=TOO|XDj(}x(9?k~Ac$d}s=Kf*F)O&bJx z^f7WJUYS3z^P*Yb$1WVCZt3>KN6( ztTW#XQPKyaCp_@i;dk27T|pHr98)+b^c_#NJlEie82VOQ#8WwigF@eqG-f##Sk~IJ zuBClJJAC*--ekuT6NW?ber%s*4UHSX7Kg@Z!h>|%^|n9l8N*_ay?`WinUfNX(`)Bub+ zp-~z);5x1wZS3Qq{lewBbuC@pom+7EwK(%VBA(sR0pHpUNIWR9YRip@j$X5Uk*ykh z`_~9)*vx>v;rNe{mkE&oA)q(UuNFL{C$aeJ7pl;P+yi9qg{*PNux~PJ#CD1nyvzlQ%Xah<1U6x z*wWbERT}!N+?eccZ<}&m8@lryFg4hNjH&LAunC5jHySE7x3wmmjTf}X)K)l7>z>+} zZ_RhEZEb09(#MpP;s!*Vol^Lz1i!L_f5K-uPH*}GzZ~NKI<=`POC*MN<*KLpK50~KYc=eaw;kfeT-)~Tu)WC3;QT;401HK zs*MI@!?j3c@EzL%TTHy8X{f3rYYjPufhRI9ah6*t2|ZJvQe|X$*6q1`wxPOO!TIm_ z>Yf$GrJxy~>@E$C%&qx#u0=m{P3`14+6#} z7vTqgWHr!&pM+D>dnkB1tqrCq?|=(-^CwO*RuPNUG<9Tasxr+)MyATY;dgC3W*(Sk zcY?sKTFvgS0y_kz*&Q#it5UQ3i@*+nX?Dlq2VNSxvh|0;`y-b))m7~#@^2zP zRk=Sk4l}A?9z`ERc#-MpaI=$Sv}%8s>U}3E>~r zZ|yf?SH(_=Esu?g#iGweFNvNIT^8LPd-`7<`EBIX$TE0A@NM%t^C#v(<|yMG<9g$# z#&Tn{{%`#T{WN_AWdDCRd?TDYtPJl4nfq?iex|L^Mu*-BT_@b#SM@zN4;QG z%(t!0uAV<<9_%`u%(Zjjn;E{R+)hq`J8AZgRn9OG(^#H;x3H*pT{i!64pE zBA81e7Yria)Fg7jAmEK9!9ymnk3qznnnd1|5b&lZkvAnoys1g#7K2bX2}xidgGe_u ziCi!UbW@Ya1%pU8HHo|_-8eVWVQ{;+y2zUn;@l*)1oklqbW@Ya1%p^OHHl2HvOWlN zLpg}yqA2>LH(QtWK`0yg6)pzIujPI401S#uMi)Wk=gEEZo$zL24)->XOzJdxo&rtg zOd35`fhJv8p!`j#i0_J{sWrZXmJu?W>K1TD}hxh4}mS)qGzD zay4f5RYyWuPJ&!R*OqF>HzBB_*7a36VY#%?XHc4iUNqrMUIXJ%spYPN@cv}Dkchh`@yIR70a^HAon#Fj9BZkj? za^D^t8r^%VWSP=8j!Frla?GHZkL8%7&7+F>rlQG6QBHE5LoJ{?w7FDap^1+aQbo;mHa1$M)@z zwSSF0F7bZiX1J+eofvDqZ{1>@ZXIlmgWUYL#(x=K6W=5DVeGcp8L>lRJQL3xNg-a>L>f}PY4OAE@lL}S%r zzf`SWoPSRfG`((ClpQD>$hiRtrW9z^cTU(ho}m%0C1$lc$-v%s$cQJmXF3 zcUJ-i&g9sj!R|`HfY}7%KIbX@uo5tWpxsk|Ag~a)N;+~QxKa>zDewhBV1*zR{je0E zY*Id0nwp!aIi(-gf_dQ|4yV4j;D^I0{xcY#&HaxbPF3~8>cAZ|dIzUyRU}`j@%y}? zUe!NDpz#h)5e@mqrfCKT(vUB0nr2WS4f)=tY03j>Wcp{4JB&d(|9Unv@7woto5}9CCeaG^1pLYR-zbdGS>|TE^ z?>i=thU#S$&6YqKsx>K^&4Dyjb5b;$q%^3Xp#;)$*)|5!$YtvZq>;+gw~jy>x!v-CG;+JOOKF1Jv@MWEE?a9Lja;@3fi&_q zJt~k!-li=)4Rcvd?VqU2>h*y%R6n3-)&c*+82hbeHR(W z8wVNV_0RPCA(wxrevm#{H^VQ6Z-8(5w(#um2<=0NBKTwIuJlv(McOg;N%p~Zg>8bL z|JB+eZB*#p^o8jy>4oVLaL%wZbyI3<>f}^g>X6jJR7Gk;@|)z-$?KCv@I{!H+ymYt zcw%kNKLp?t4Xs=oj8A?)pMuIgWz1AmO%v0=MW46k^Qlb;K{c0!3efYE z=*$c*uLq##I%yn8jxtAV$_2Gt|671+wTxyx5Nrk`V6Or-jX`Zypx72aOMzmIccucx8tx1QiZ$9V zar6MEBWyv30f_i?a4`d>2_i#r{^5T^;=pmS?=k`iYdW z$V=T{jq17oh1j^gP30!YANM%4!o^8E#q}X`yEsE0$@(07v)Yo9=F2)ot zn!f%3;MJnEE|8OUsdW`UHNvsF-ywvUuq0#AMO)J2Qr2#JKw4NjOv&I!5JAAS*M77!eh*}$Rg`xsSvnditVw` zI$A0OhBHDev^u0h$OlJW+7_r2i!#((S!r7!G$TU2^Lu3sQc+X`>CZu; zh_WxS{-k0r5qz;#l-gP{@(Q7l#=X+(Xvj~Ri>+Rz1fsnEYqRw7c6T?9C}k6~MLI_f zWcO0PR|DDY)bG?lc1QJFHIUs@{YDLB_f@~<=QnRNDyV(7lk%>oE7#Nv@j2P1d`Cx1 zLl*5d>3!Ih&J5tg0`{#hVo&vE21>KK!ja7{pO(qsr~#*D8tH_35l$|WhFt1wGihe7 z3N-5SQN~P2phu(V;!8LtHQ)^+O7nM)37}{u7vr!CzYfSI_yUg7n7?vrU3M*s14BE; z?wp$t@Imat-rSj;zZ_iHuP!sjLLR?mD;9L;+T1vwDflzi z)R_$Ptq^L}ooig5#dXQQCSGuM+ANlq|01W^$QKrp7S--XNPMd-&#yg79~yapUxEFv zKRCSLHgWJlcOXA^`S6-*Zl(kD0)E=}(bY4Ua z<=ENK)6vqDmxWW9gAre+obtqogpoiLkGGiiEvx`2AyJiQxJ zK&Jil7`lL(Lery}0*Yc3T~I}0ZPO!}0*Yb;U67$DhQpamvK12Lv@~Tm=Fx-Qtq^y( zwzH*aT`t?w){*b*h9JbUHzO_5M47FHiLsu8r4=2oRZ|H__v{rF=B!;0@Z1t$uB5G)FQZ0TITHqdi6L%Wa zMv%M+g_lC?qINgd5&Z}|;`I$p`AsNM1e9v`pk#}BUn)+Bf^Vw4MJlp z^74!p4DLf+X$ad1f=v(>TaRZuN@yD&sv6fLg|=Zyh#Y%n^hUPf5t3?~EH^!lkP1!_ z5Z>eQPQ}@f_`CnE?$*fjR13Jf>D9T;ElqgOD41%G3O(zI=%QDkq+AO4I7&bl&dxnV zz_HZy=R)PfV|NjVn@W&%H_GrXN5?b*atunx=+3C#uGHTKnIrKg1)I+QQGX$!4|PeR zZ;}6w4B1Ve7hcrT-m`gmt}VY2=4b(Z3OO1 z@{98A@Kp)zhPI)(rp39gE+@xHxEptGZ%2qy;&gXr*LP(%w~}psC(3%@8^Roc7rJ1Q z)?711F&upd_}fmp5}&L7JYIlAu3qb8IVpzWei?vgMHo6pua}5G>fg!8=xvShSHAxd zwDU*C$(m#n){Zx9o6%MaKW?eqe~+GRoU8{k$iZ06s(0`s2NnUHC94?>M|KwXk?wF2 zPH7XnGIsXuqH301@#Nw)iwI|1Wyk2#AXaG}=K>q);jR~PdT|%?A zTfei`S+!O)z9W8V{3OVrH!k)`?4H=KV(VkGVs`Y!=vC2EqpPEnB40y}|MMd~k^R$8 zq%TPKr1ytBe{ZF3PMrzy0kx?}^4a92$rB;VUzPoZeXD({y%=5!+?lvLaarOwi4zko zky7v;xX^5aul10z-T0Mpq%lGNNWUH84Nw+BU15p5X`S<<& ze@yEK_liT1n>IP>fo|wM;Ue6iE%be%`duFjDIs(A?$b=`2OkS%W#TEdPgv9690{%9 zrBppM6I128?_zok~7PX&}hwlBnf_ zqy{Sa#O_2HV~wOT7@SxyCbKDR49IODROS&0o!+l3)9)rYV2t6?$&FFh4+#!bRR!v` zQlgjl1d~#)6_Uz4BDG$1{ma#KfkGZ65fa8SGCntyeIr))FH;k7BiSeVA@B;tsQ(an z^*281lFZP}7msMwb2Eg@6`+CmAW5JD2l zF9kwLfP`WokU&fl0s%rN^j-tpXXdnNXV>?A|GD>m>_0#|^R($_W}fFeBsFb@M>}Z% zB5;uzBrUxbXdZF-00iLD7$0tM6T*5Y+;bmsZ7Cms5ZquE!aJ8>fgs#q7Q#8#W0^Jp zvAB7Hn+Qi+BDe`6a`W&Iju4vD>^)hr|RU|YV@JwLG z1Gf-6nfo9C5%|Nt4W=t8FnKped6FYG~=sf&#Fug6f_!0B|qP z`a?($GG@vEfV`08cq@9BTmuh+Zuxw;22z0>uhV5*l}gNU@92! zGcOahU;>L=n1x!sfkm>7%x4wB+XkkL&l~@(Qnwc3WO_N+`c;A2Lfb2hT*%ZqEeOxvL?td>`X8(kLu<{96ZNW~D;aS+d&Z!$r z$JEX}905~5zZVctHS{|H0aXci3kaxcxJy7lRm7dxW05EYSrs2+FG(j;jND{gX8e_< zLe6E(z~5^;guPA)S=ir%A-mN0H7g9=buv`v8$TkcpjHLQOkmiPES1o(2T8+_EU{s~ zVuc9}`yqDMbxIkCyacvA!4e|dxMNmhukpYqsH*3%uLJsK9?CBujLkk?3-^o`q z)BM|Bs=Lh2r=LJdAFO=ptYn>S@TOrSenJDh1m$V+3JlV|GDT#-owy-gfZ^!L^dXXg z=WaI*zG2bR4d@}rncAhK{GDPCRZY*^K|v~5KWbWTaYk|hE$ zgqFo*eXUG(_95|5U*DtB;ZY1H{d_Xr^*DzLyF`=@>KBR9r9h8ee=LHg$h~M*V}8iHJG@7tRaHP zF=jql(YBJ+Flm9SZE{gtGkONVHfkPz+r!n>46lm9#>mN=J6xSA%TAuJ9A4y@j)Nn- z9B}oA{ZnsJRG2yVRSEke4L;izg!U4jX>ysoHLebqKnZwu^ehSGO!y_)zvi_&-5IhL zZcC!g1u_i0(9d<6hsc28qD$vE!^KY@BI&pg9Y}stizB6H=T@LT??`pABtZ`Na(A}2 zCm~$He#@n&3B8a3#%h!BD;gcC=C(51=l?Z7VS5+6e-a5}-2INW?rwOc6yz3_{nPp_?DX4V zr$09FE$s1cPwa&V{iTUr(6)c&#r3Z}lyUjgKkOe}j+zRe(Cs7%h(ug;)BXfzya< zwKKKN;OjqDi$&gvJQ=wyawW9wEb#h2J~9hVB|Zu75C1a!qwwYMs=!X=u<-iuyzrFp zu&|_ls;p8fl(_tX{FM9~d9S=j-Yl&qZ) zBGcYMK1l(&!nG|tJC9moVfz%l%)63YywKdT0y%C`sW3(_KR<=6h>PJ!&?RnOMG-qUSuxJljNiUphE}0!5sT zQeIYx0s852Y-G_xo-7G_y=!EUI~GGlj$tD$5X0?ojRDG@3XFS2Pd>(N0usjL-=K>3 zi~%VKY=#kYy@-a9^J7L8+D0&9t`LwgQZ7dW)3!!?8x1?hTdzmnf+8;9*S00-bh@`5 za8vEq!{j99ft+NIGF(@N0Ts;9T4jkc5&!8gaN5R}{Pioon}PA{F}f zIdG%_(fI%lI;aPaj zwoj?JW0XPnu({N_^Lsv*sD|J1xkO>_=5vYS-o@t<1-=svGN)0H&3=(TCdO{SiOF9X z62Ym&L&QXaq==3re$9vxoJahKAPG1nd6FR!81o=uOwjqruNW}`V}3|Y)&ZE*#uE&c z_*motYGvTjr;Yn5dqj}a#vk$8ZudKMQiJQ5ALhSg3_>O2seVA|6Cp|)f1v~gyd!S> zSwO{43Xe1Da4k_jRmL9}LE?(MkE%%i?Qr8>ff(MNd#EnrJ_k-4^gmR6yENRQe=9L< z3f~JiZV?IMZMvDMBiwMbN!Kxj6SwWPOdTOAYNr3bKn!osHIzNm@sTC7?mR{ba!9xu z`jdc)SNABRPS8bu&j=ECk>63phd4nvsHBR2w?GVU&s|g(al#Fm^4~HpGi)KhwmF2^2^qE5`4jBtVx5LTprfE)`GVjXDxUk zJJ!mx1aOmp zGcJQC0eB)HXcFM(ZDPiOcLF$N_OiwxYz~LW2;WXQvzIAB3i`| z8^0oXjMLKapa62Yr}~G>NOcg8r!oyM3UDQJd6?niaaE^70u#{~D`eup83Ges#sCus zP8XQy@&uYVa9SP{`CjFft#aU0fjTtGaM|e3Mvtp{;1q#6kBjU49^8O1eH zJCe2ivwJ1qY;|FZ1Cm)*C9Qw;IdT@z{3N9jCt*Z*9SN|(a1)2G9SZURaOqb z`vZYo%-ANl-~|GX3q~n+31_;O7tA|-0Nx-Fjcv@uj%|;vdH|jw;A#Yh8)oCjw#PVa zzLwmfi=ixWRe zT$t!iv?kUkmgsjS$`gm{kHo)??~nf`o{OIw-x)tPUJEe;hnW90-!}hj-fiAsUIK3j zbVrT|e;R%y{QYoGcxm{M$Q_Yvq&KokdqulbyGT1ptJd`B3(?!v~P+a^E zqwj;W3_yT%RxWDlY3}OU*4B+4>V=Co0GR{t;3u&YOaKjR*IJWX%8(<8G9)Zx*Pj4V zpK!49VC315255H}^%5T0?d*{&2r+7J?npLm?QZVchOqJw21|EYM{9BDW$eMTtpmTmY-4NMel$;D zV<2OC<#dpgYHzCXjTsUSaoID7Z1r0%yPC}YhRY^iO&Fqn&1Fv~x&O;$SCZLZaoH7Q z_Lp2X;V3ag{Q`r4I^}lmXIJ4kDnK#9a8TYZQF~E;4ugQw)b$XuDx&?DK=Q&=b2l`R zK=QNL`NxrrFQmHV+%mz@rNlrLh?d_1w( zxGxBOue=Gv7s8(v1X$z@Ykq!W5^{2eHLn0MC3&uZ7?y6&4F6u(s-NnRB=#XHq`g2>!BqN(`WLt%MdTgH*0#P5uhD__b3CF&w5-(60;RHR@Q3=RxO9|M z^f`enW=;4&{{+u$LSov65A=_N<+4V6pnrs&$g$k^)Mh~6#9uR%NbP0)eeAnNP%+NP zK=K}TZB!w0xLmO7Q4 z;#!=ozgP9QoF?RHDLeI7^)~~hG6nGouMd;jLtZc#(Nq`z#hdMqv5oGrQyu(BWHQ9ELs2~eie?8WRKmO9dt0<+)ic=_Cs zYFdtvu78VX(H(8Qy-9n~9xfkACfRU=sMX$nxQBqA*WCw5u`oovd3H!R z5emsK5oCVeVCAp2S|kFDcnv7;0LqTGlbcS4X{x!SIY4F{FIf~NDHbkUmPjBy9*DA)LdgNDL_mtJT=zh{KO=pbB(pA05K(bVSZwA8LqMF z1jNJwPk{JaGpySD#H7tLtOd9tw>LK}TLXjVcDq`8n;O=^uiJ*HQzfaPv2p$4rge)~ z!fouj#qgaeA30c^$fnCj;P!0m>8e8>N&p&ot$YI>?rohr0bMZFjV@vAZ&Lev{wYfx z4N}0}zI#h^OLFqYk?IWlcW3Xq?&i)OAcxQE9+1_3Mu|G!&07TyevmeAt8E4FclKhZ zVMKWPFtt>Ykx)o%?u6dh4av(x_a3UwbOkH~*ZHlf?tYKyH0%=($il!hTsZ_!Ip|k= zeR4N&LrH#u-S!b8aC1BIT*sd6sMkubOaH;+xdDI_yL)SUF+TLdZOs5~2&~dI(ogIe zyc5rjUR{W%n=oEy+h|&Ha(Kj24})DpXDb+nKKNf5qK=p41~lr{!7c!;o!ScRHexJF zuSlyf7SB#huh@?}FN}J6!4ub)8Z??zc0h>gc!WgiX; z;zhzz@bVGrd>Kt#R1wH#d3{_Gau4;J3duRvQ}@eG3o*ua2G^T^t>vy{r9E z%WB&p^u~(39Jw>H7v2i2j+o(>0Xg8}@VfA!>Z|IF5M5BKTFO6^>y$P)O&BS^4X*^A zFRzzJ%TahG@NVfl(rRgV=+)4z);{YhD`nMLgA%VM{tKp7rr~r19df{TUEvQk_po|e z+Ih55#6^9D=&!mwm1#f~4AR7WlK5QH(*P-mj?O4efuC`%vWhgI3ZjF1AscPsD=yRY zG$0BF>S9gw*hDOduKGcdhsFS)`7rvWc;2ucO76hFB#?Vtg&eMk63=n5-O0~#Q@ z-sZTtZ$p=*EDcbA4I&n*^uA@~>5~F<~#G{F3!BisOW zfrXrq2AsdSz=*drc=OC0+WgjSs0nF+_VY;BY^Y^JdUcOcYpW6@+BsD6AJkgt5Hh&G_I%F=*!g(fU4)rR}YTM3iW0CR<4c?gC;J0_$7 z*vhLhTY7*Y6Vm`>d%O-L^w>Ht#)mFvj#{77h;Z!m%S=WCvrc3`V;18iwe?#|Z_ z0Jh4r64M4)IVKI5Rh6#lAOokQ0jkOyFesQlZ-q`s&mxL02-x>aH7*TERo;N%!t{N@ z@o9jl@`{8AgNz-V26!s;Er2RYd)}RLD$)Q$#d#ONWg>cwk&(69WvWaA7!`Lbbla(s`;X(iMVIIjVw6Rh6D5un$fE3fjkb ztGa%5`Rto2u+LEyY+qThef%9FQ5mHIWw7zb<)W_;J*KMk6oE3AiMv7f_{!6h1&!tK zi5sgbJtPogfaB3oZwYT&BPIa;wweYk)pEsSPB26a`#adD~os|5q7Z60-ggOR^t0#_(Vs=n1!V{S9jt+aHE^&74%WcI z8aP-3|BuuFzLDAtkA>Nn@g#_WazycmT(*y50NEd4U!~1mP3UNqp=i?9s z9e+L%JJchCFy2)Gj#p2_MtUlNEJ)=DQdY3a;U3xIb$L`C;;96(AeF;NS-~oYVqY+* zj0U*5Lx&UaogZA-A^1X&rVcV-ut0LK9VOTg1|%0a1b-qn2w$A}ltKE78HvHVi(H9y z8&=onDZPbn0YNjS3(}jQqy=k@WB<6iR5y5TECn#NF2{T5NbI_@xqW9-$JWlKmcGpa z9x3Xj*l~#>M5ip|W!>?%#iXoCdw)dUX8#Ib`cZ;_ij=cSAP3%ohm9R6=a&LG^gHm! zjaKJMa$P$B^up7}EdVJ&K0CZD^b35sxEbXqTT8L;DqK{9Uu)xFb*wDcH5|RZsj;!K z%*NdPAG@Z#xx(o>c!%ZP6+|D5nPNKH(;esx>d`wIIWkaZM<(*nd_3Jev(H301woCPAx79jjw4}B9_ z8v1i6nu%TzJw2L=E(PqpVcLh<-?iUpmuM$z$7pq0sdk8_MBa`3HF9(0GVrfo7b%a7 zh{)mh!_S5v3||{=53dT3S3gxB3jNvovz4<>vZf}!Ogx;pC~uo8~GrR z@e(-YJ-jN_n`#8_pGDwG1P)xK4d8Oq)>78nyQO$8dP|kfUkr|W%_~4oFF`p6VLJp< zVrjF{6RtvS2BA#4@`t_UQ=vSy0(F=A>E#uFvEf|IHHi{O=$S~iT&b|9OrYw_ zC&7ZpBU}$pAP~Aa_6r4|QNy%$<%E3nBUj-1F*F zJphR7z0bQ7q4C*As!c8EV+r2$kWTRv%i0Q#dm4xOMfBu!-g$yv_YUH7x=_>qXW?@u zyBBiU(o4_)AwfKW$c3+7OhA@;sM6mf6J1E@^NB&+mSjT)c@B7?<%q_r;o`)tl zmxu(7o{I*)lR*G#P9Luv?I#DrMbAMKgblb0PM@K@B>t}dcgZ*Y-}2UKB^5kY{n%b+ z#Qqn(>D>|ZDS+9SOB&;=yt4vkp+6tKEX+X9J745M=!GYWkhcj_jL$2TwmiiUJ}2{8 z-r2B=drRii{52f(kjy93l^uCa!&^0`JRj$;GX4pfkI>WG!R?6OkMW;)G(IduPB+L0 zg{q1%|NXpGW&7R;o{o4gZ)YTYhrA82@$O8eFSy(`3-+($USxV_hH`QtPEpgmowuvm z8rdQ9R^AS6^U!1F%>&?|+vq`a(?fIhOHS-oc0% z#DndHtmpCf^dHg=u zxo?h_nqR`5|6a4noNRn<+-F>3oB)yipX&GM7wMby@v;BLo{U`|OT}gYg8w_wzelf( zo)fLn-UQ_S)tVZ)J#t2*AyNV-1=odJ!&B5x)ZeLRsSWBN<)6y6N-KQXzc2qGPyWx$<|w-#x|10l%T>J0eXA)gMql!z~XF=u4J z=Z-gZVc|knWgNddTIIrk3k$DeD>LAChrIk)zPtsTo&nc83^?B*S8$4L zRew7`BNS}Lnhbd0ogii|(2ms^@WkWV!`7R(oHH`ujmNcz&6vNaH5u^7=m58-q z5y3l;DOJC_~#Mk zI=ls|wK4-9dcI{D+1lHM5*RuM| zh=O%?fTBt=!<{&*oz2=Cu7X*aL+n|eZ(*mCa94aj^We-d+u;*cj-OnT8ER_+%ly=7 znIU#K5+DKWgcAeXhrv;@jl3|>UU#jl$_%#076n2OXqd-WktwkqtVMiyK>MF99@C`E zAlnm^fDh=TV>h(dT+1e8ifs>5f_MvjZ~Jly(jty@b5ck;En_)#L;()qZp>KXxt5k? z5_W{l4vvSsFw;DSshPMPe8w}-KC&K1RmOChfm4CL`Po;=J-+gcVY{C5nwUoLSf*uk zrUo!lLV+5HF*V@v1l2&4sR556um&`y20V@eH4tHHz~c+9fv~6s1ltO~Ny{>-s0I*E zPz@-e8bAzzH6V*>0C5zk0ZCK?h%cxHDl#Ew^!9bNwW6g41v!y%$o?qv;%zI^01Ju2 zW_AdfK%anVTpDm8XR=HJ!m2btL83*zxxK%+b9ZHH*MV6zF%3wNC}fM}6X>W+1O6jg z+7aymYZ#y2W5*lOTmt#k>3-LF{lM^++_|nYz1ubnd($U7lkoC8@^2Bs9)0L?O-t{x z`>}|N>SVgdQ<>fwtf>V@<9Y@2xu&Q4?5`V2Q&2Sc2d;q?>0Z0X2-#>0J*MgDo;68XE#czA=fn68jQ2B`!|1Bo-u&NQC3>g6IEl42iy;bNgHdG+*FV#r(SN7s^waed^*MkR@KNls z*bT8gvBuaqI3sv5dM9`rbVM7XM`>S3W2Ij0HSMq3J=)K;jCQuxsU4>+(JHi2njZNy z@>1l_k-Okcg3BYPN47^cMCu}C;CT=Ue;9r~{Al=gc=zv;@SgCN@LG8FZ&G+@SXSRv zpHUxDf2CflepfwN-K18lN2xLECF=p@Kgwgu4a#@m%%M@4sf>_6k^c@DhCh|BlrNM| zmz&`PVyavseIz|3-6UO2oj+id4ENI2^%FqX-S{$ebn#;A^3X^boWgv32M-kvqm&R= zog<2OVlNVrIN~OGbn%iR^$1B?4M%)7EQwx+U%G^Z&Lsf7(c@lVX_ZfZe%P!_8A$??ONq*$h|yK61(G(Bl{uWp!t=wzqa& zTSpSEzrX@`{j#fHuN|sRmgLo&u~Zk%WKC#4#-^~78t!n(Ds-1-{()>#! zz}%|BuYs=Q&>Vt+VeDV;82=)EJsBH^+oN+A%tcMjRqUCT_P&|G z4yPUg{rU608ON@eUbf(L5Fj1r(=zDqqW4V`H-;;Nbi4Zs0}r`5fU)sD_ONpjDyMPw zzGoWvWm%tsHuyc$c3kuG#TL)QRZUQNGm`e68Dmt?<$2GH;wJQ%$pU?e-#hiPphWNC z3S8CKfhJspp|+$g+1`o()z-rc$M}YSn%0b=VpieZm;<3B4U+Z^0Vp4EU_g5`w*$3@ z&c)a-PO9_VFZAnnjErONo0`BSt-NSi(PLa%L(u@2R$p{HnFc;(i1$xiT0_wlTv~n6 zCOWMe@jl9>H56UWrPUW5N2gUG-bc8!hN8>3wECiB*);1Yi<4)Ku^KqK5mpVCHryId zr%kT{TOQ`p8jALEY4t@LnKV?6eOy{Y(WP8kebF&&8kB=6+w^iMM?FV3!kWRQ4Y$V8 zX_crP4{>P?MVD}C^+g+)G*pfUxwM9&i@CJ=qV;SVl!K|4N>q-e9Nh@3noApQjiu8n zP&ppp(i(~`;?nAi)-h?Q9QSi+4Mi7nY4t^o&LV^c9dg5!9+mcE?^SjY61ZcHE?#7h zcE(N4C3Tj-g&4w!l}Ea0jV`ty$YyCcXRXo2wb)5oOz7xafW35C64rrhbn$#V`3mVA zN%MrtsHND(8D)hm7C8crE}kP?-hE<6?QHDMDU`{0ZjCOUh5d&EX&s3(g^D?0HNvkM z&mnAd@eErlI>pO{!F0R6hj%zpTAULYH0xzOeJ}%3s;%QWODs?*>(JG^g z%Q4!U$L-QM5~kwS(90!z;;7;>%5>gea8z+A24M5p375f9#Z#ynvFe1!c?#kmy@FCJ}wg19-w!;43`&C5F%uGH>vjS%}2 zZjpE5Fb-$??zt59OQ#U&-q#a+@Vtvd99E@loIlTvajupg0w2UuXR5S2+0zBsfyuId z@Z%a|f3CJSty%%7hIiO?o$TF}>fV7b`;y(n$NP>EY9)LT+1V?Xty$WDut9PS}v2f4F#}5 zX%!stRV=FQ2FOFKr?d%w@vnrd>$a};e&_3cS!y%-;)l=R*^-R&>iWR3YYjw?5Fc*m z;K{S2s|j95=A>L1U8-uHP^IT>9yXdjzPA-Fz-;{P-9ks<3@>uxJ;^;&DK zNtT&-Bk?qx1>BzaNn!v{0J;;+i8YD&iL%6D2{Zmx{7vxbe;7^%ZiuG=o4*Hq1dfK& zfvNFP@i^e~zhypSK4RVhCj=SuJhRtqG1r>4X1O^Uumry}UW2oOUm8C$E|BNSM;aYQ zBj5&<=pXB^>3`9GtzV}1>Bs0R^jf_da0ZKGUjT~0qp_P}XUBHLj*l&imBxzTCBeVL z3BpCuc6d#&G+Ly6rM;>>qy0s@Tlg_ngFgsa0-!bgS=2`9p;`lb3loFQDJcB}R3 zDCG_19_2!1J$Nd74iN~K%iE~4f&b@!Aa{IW=Nhz+$?|*FpofryH=IjA(wdv-zFi6XD!DFcA` zSLUZAWUk0dNtSMTeo8{-vY0Xiw|h~8`5QtFLg=V*A{**aSB%3jR{IEzuJ9ugJOHUu~#NYm(jWsakI@d;n}{>uKBE z*520JU*Fu>ieBLW=-kUt@B~ZQvko5JK)HL-AQk3H=4hps&sx*mnQX`F>ZQop+hcXz z;H66_HsoIpUh~QB#$Gr`1dXBlDUB}pF_w7oAZ0v~*w(cT4i%Aop{tQMdsi~mm1^&A z>PR)WvFBrE3DQSVP?xgiAmlYqrvzZNm8Fga`BPiUeu1O8#k^^ zcBFPTZ*EU6>TcVaT+`mS6%Nv&KzB}2Hp#2I+u$c$s;%kn>uGLkt87}iys{Dfhx)FJ zynzg*PTc)RUc!sGO#g|OFpj{WIDMSua2?0#9prb0Yq?B6-a5PhwJnJCTl>EWZ zz7CBh?~LBt0Cb>n?j`3tx<3Jp^PqG4(Bs3E8IthSz7{pK^HuM*erP|6>~iN8|HNLa zMv*IaI(=NPRq4ub$v&%Jfch3bn>UAee;WVt{)~-7raB)D+yT9rK%Klo6g6zZcq##o&mU$J_Ob~Z>4fs4eQd&|Y{D^2f<>DSC*}1l#SAuK9F+hE zf<>1W&cc_n6xD3PSSkUIz#m`}E@Bhb(Fx^6_p=EX zvI&iLfT?%jy1Gpt<(sGZ)xLe-ED8!A;bOE|G!FALXlrZ`Xloq65Of}gpUs&ss2a(rMgR< zttt>1uoqAPN5PrEEs33Q3ZTXxiC-FD7aw81X#NZ$`ey+O;Dg5ZjH8Xg`qTQgdXs)c z?5)_XvEJD1=-1KvqUT4KM=kAX?Ha9Fn;3ap9iqId+@_qPtc1_sSL9pe)8rNMNa+pf zm(p%&iBuGNA#`itrn)o>PCE#k5&Ukz-=(Re!bUV{qNZsh<+@UoWx-!QoJ+t7d8j+;tFaI>*Hv4S5{Z8RrRCjzfGfYOrH3R-T!fIoh$K$BT zfbR}+rXq`hT($(QlXP3BECbFvtX+tSX&jHCDg%By$f=6eB5oUxuQCIUJ8b7cibPH0 zaZSyD=MGy7h>L9*kE1jLz@_XcKpfP@$ROwe|5QYe+vQ+14R*p03d1=VO%v>g|9@9B z&8*C3E^w%(Y26xtr$UjGc+P=+C%nYueY5+K7*&~OdrlyNO>E{xdAmOv5`;<%=1*6VuY*%Fu6Ljk&Cc`mMt8gSCctL z)Fl=kfW*V@(X%pZ1bqte9)QVJnbm@hTsRJHW@eSZU=&<-AO^1# z7>sxi$lw(Mg9}HsP0zpsEKCrcjdQjHg?9(fqsusTHe3D%t;)d5EJQRLn$R4yw7mMN zGw@Ce69?(=1CIgSR5b=JtslZvd7tF}OV=kQ1g$JY* zo_67s0%u{RHJODR>vX&>t_na7HB=Up3@Tq@FxjniodO~zo^f2wea0~xO?KbU3?P|adJWK1k1PZN6*D-(yuKZ5v! zC*lvp?}*ck}e}n1q3GqX7JD^zbL_0x>e!g*2Y`KerLsX;pj0a36%#NBo`92x zwA?GNlS|h3+ZV`Rh<&V>izj7NvF)KAboX?)wgG#`k#|e{ z_0!?ndhA0)QV};$Gqt_g8%BIPH(2=^1J;tc;QRG~t`_OsUB%`A1rYDyOm zhPP|!Th=9^tFc!gSv2-|LHocg!M%kdqD~ZmWY7cz6ibl^EjD5E# ziLGcyQ?)QKUPVPlX8JOMO$Pi4y4KB7vdRZ z)mv+7)Q&tVg8V$%B7OO76S{h|MSAnwM*2h4TdND$7U1yF7U?OVh47`Qw^j*=1Kd8A zS}O|>6Oxx&EAkVQgf}bI{loN^$+|XFX^xNWY6g<{G7kV_W3za#wPeVe~QlVa~_J8ct0W| zBj@@*Mnu|hO?VSSV=~xl#FQ?>Ua~B)=Qv_Ydk=*NvV8{-M;ay=BAIxu;JAJ75mUMp z`}2Avo&$*~U2=q4OGxH?NS250$L{e#OKkqjh|KT1xIF9MOpS-R4wV4@{dybizI6gZP^dQJ}+3 z=H5d4GJZ9YUoFVLipZZX$iLG5Y{T-W)3+QTJxAqkp};P_jA!vQXWIrNkT)*lPWwBD%Sd_YFY6zAf4`)^>e0NYKkxnh zoW9bd`CIH^Fa62bL@)hM(HbxPq3B@uZ&(4&^Zp(Y*=~P8g8LMTJh*c(1Y1gL!1EOa z0|Sx`>_PN}g4Hr$7t>%JQ-GN0Ck@ty{KVvB)?lqKKuk$qm!FvI+6`7?h1#6wyNsXX z+ah}e@&hLMdTVWd`TQ*37U|C~pRAdB>*xaVx%s*+vMc}RUeMCe7TJyN|JQ`>2mwC- z3yI$VLjN|i)Og>x)o3@$_4oCE>i6rH>znloJp_LEm&cl8Q=(r+ABpCo$!MAOiFUts zv39&R#d^ZJ*4k#3C%#QQstrw?ooGyqi+>z{FrJB@5pRn(MqUFPz;hz&BS%8y{=MPL z!0WzD{YrgYy-MA#&QLYw9}t<}r_?Hg;p-0CdQpIL)P60U>A)lu#3t(}Sk}CUrzlVAX z)n}NN1&BCGiOaw~gX;54$pShYdK%a>%;6ycQhf4hS%8ESso)+S@p;O!fCWdD1CEr? zJw6b<7%@Xo1D0k1!wui~+r3@|&?j-(bLiGG#@>oi$04QnL>&C4nhdy5!01b^QgUu3D20%#@D9Bp| zz(ymwMtNCffieJS8l}Ra&sPRORHMpZvjmj^u+#(!@|FQ$)TlC4;4(1dhiErIP!rGx z^}UiT;BcXrfuZ+kZ~KGfp!3;5=QA|D5YC6l?P{m%%Hf>__`X*MozF7)oX^|{KC;5P zoVAXrWo9k%yxU4LDF;6iupZxX2kYQWrwsv#PILX_xtWegXe-l(4sIj5XkR1-Wc9?( z%(UCr^kg4!_}2>o;eFi;GCLxn4zX_VMGnS;_eIRhY>$N6#3CAl;oyA%vodYAtAN1% zpvy_G@HLrj_PwTnS$sW7ux<@x#TS&ElbOdlGqWYI$_q7DRi@RxXzpmoCRD>?`3)~ zc}f=SGDgSUX=w9Ox86RF^FA*Jw=sS0K#NlgApHYB)V>VZBw%f?;4D_n2zgn zlx6`96MyM21)?tUe0p7eI&_{iE2PiR$LT}h9lnoZF9Dwaec-=;ZS3OMsStO6T&y8h z6B{2J8Vg51j=miIYxED%|A}4~y(D@X#Ncm=E{o2LPKXYRM&LZ)6>UFw0Q^$>fp)2O zy4C?_1Ix8p+C+FiPy;l-S0ib7L-3)uA*oBi5R{WFrzu^6XYvbp|li`;5BET**%=gScnKzi{m?wabK(XjR{Tx=TjF*tS zWcM-MZGf-X(=bUnM(%EI>q%BFYFbs%)C1iKP!a@J>)~Ti+z&_U6240!P#eI1IjtzF$gsePL>%t=6HKO4a}*+gGonr!xtXK+TPL2??cZ zQRibM`ubvMFs*HFZA&fOmTcLv8D5!$;i)Y^!vH7akY^msj@-o|N*_b-l)Qz8L>EeG z0stEOZNu-_9U0P~O`EpDdnL(sh?mE(80Vs(PfQQp*KTv1evUnuvFN6)_?>BlqH(r8 znC#@1RA(n3Z6;eW$62TqT}dtNslHZNBYK;fcQ&`RqgZQ9bS92&w=Hh6iD)Tj;31jn zX|l`Ej3ZaNQr*3n{d8P9$aTglGU+rtV?kO+sac8!3?LO*68vxTLCKo zEqF+xONj|jK>@m`qvBtCFnEX^7mjrF<643_v&#-ihk8VGQZ}lT$X%UV<#IzADFHh~ zj`s|~t%CnXFhOwRp+wOfU}xjmK`CMrG&VtH6C@@<{)SEXicR>OP56jSc$ZChi%ocg zO?Z_}c!^DTj!k%mP51|!@D!Wy7d8Qh=n_>Z<6u!T;g2lK@7aVOunAMxgb8fI7&c)v zn{X(TAic~cyucs zj0%EkYNh>9DPH2{pmk&oN(BJ8^>IAt|MbaWp)5xbPcqcc%a%&wBuPH*Zv3dkW4=S_z_EW0d8RD+fM7ceW*W zVJJP&xf3I#boJMxwb-Sx*K7|FBSJHzVN#WfIDvh17qIt88_@m7x#5MNAQ_LNJ>eCC$a#z1RVDAAi zmkaW(%|c%!*h2Rk$g9tv1ZQ1Ks3Bc-QJKF#LYZkdqbtz^G+gS{qnm|lyF1lx10jX3 z;XcT;ndnQKvTq4d46jByy^2oKPYQdbx!%*g5C8~4FFc$J?+SUHU=R9Y14SLp-Ted} zPK~p1LY)z+65}mOwQic3-2f;6PblA08k8_#>RkkT{Xx7TW3J6Y z*mC{*!GvwMnbvv7lux8gf-yrbYG@n3Gs&&|Sp1HM=Y>N>Uz=3vp| zUzCN5iN1UlXY-5O-xE`ph5Lz<3yTqT0Z+)hEL>FN9R{{7Y%lNx%*nzvMc!d(3!pm! z!48)c2f$AE1&@7h7Op7{pedN{;PKDT!d*q)F%)p=x8Lmyv$Jqzk#`Is2~1b;xa+cT zzMZ!X5x2M_ctRFr;pPKhHU;%ZBt+B=JP~uUa0!yP8ITCJ6L{>ivQD^t;8cLv=`KJp zL%4n3@r;=14&X7*&O*$6!Rlw4-{UUHLfAdJsew;r?H#vC2WKIm9^KU7`$R8!P!T%M){E~Y zJwdCo$AVef0Z3Yx_mV{2NsF@(KELY# zB-I1TBKJbI-;j&55K4a_a>Q4go;^#l5L|yCO<1Telw={!9`#um6~39JSqPuUmqBo3 z22PU53k=<1GClt?x8Ig#kEZC67g#>}^6VPMbEg{9_i(O3go@RSiYl9h_Nese%d@K( z6%Ku{it_AAAq#h-Xn0ymvnv>@>}X^>J^D@^9({RsIitd%&u7&#AxmDX8W^i83)EFT zqr#!jXVp?6OJ1v%P*$N%g+iN|PPNzXREsHk41bb`zC62#G0BDp;5(J4VsdsN<8NlO zkoVJuM_rnQm~~=QU>t!w29;(ZSe>E=2VJ0NI)^8}JPSeUls}t8&ozU`GC2#;=?l@k zWDnHxGMhzQfbuLvr3)1BjpivR%|b*vRR%k#Jh%)HhEAz)=<}5U0??^4*epS1m?cz@ zw+u6xGJs=l-gc;AR533wB2RB-bb6k}x->F$k`xUA*8K`~r1GZnM~L`uSLP{`l#vh@|F!k5^;hdQD{Gws z(fRYOL5a^3e^1<)I4jYVn3)(J|2+O!{6=^KV10aEd~94ZKQLdAqVl`uz2?p4)#mr$ z#9)az*&JkiXgp`!YYYJ1|5D>nK>L48|1lu_FV~NZeH?oPJPl5c)yED8WdBFNub>C; z0*}%@2P}abv{SToTA8Lqo{juEa(<*aGCNWfej|Ke_=n-M!%g8@z$yGzeO2A3UaRx~ zLjMe9xcrs;oP4kRL-`!JNuDhalRlC5Lma_{Qc{}l9Vg&8{O%MSZQ1u?BZ@Dulaf7c zd)%b&nNLXjaa@v32_Ktq{ST+7Ti_BK-&2h!z7WTx_rN=JJ-w~yndsVui`UhzTimqJ zTQtmivoVOOj-*-}L{&>t9gSbEAvJ=3Go@{fh=S6zT0}u5VULlT@nr~1H^qh~n&>EFsH z)ZwyoXAdvVEG2)ADy}SnsCxR+UT-K>kCDk+$IQ@R!toG zLy*92P`=B1kh%fC)+A=}F98OtM!9+dWh)jPbde5%*B=0bf1d#i>u?8VEuk**p@=#T zJS3>{n9ztZ1P~&4E4o$M+_qJ8fdi^H;g%)|$)X>EY89*(G-C zI|bO>+>>mAH-MPs#2jVL5!2Dj2++;O&%(K-_2hBiUO;L;O2(0rOC?a*kCJgzTT`i4 zZ>R!UjaV9$E#MGRbpVvZ0}bFR0jLk*4G`Rc!y<4T-&W|1kgh6ouz8f2 zj;<%58^c#AlE+mNkRHiT42YDhA)q>fA4rIbsvaOaT&$O?8z3D`tv+aCAQy*07|w|7 z=>TW+q5Vngw0>nbyzbFSG8JRcA%}^~D8kRLtxbXlX-hAFctekCV!!YFucP*WBG(+ttwar~i+M9Q#y4N&!_t?+tgr#=7N|NBo)&?bP11v8P2D;wI&tZdG zte?@*S{!<#Og$DpwK$jIfRC4B@kcUGPFB7pq}l1eTmoNK343B?)QZQ-MhuF;=p+@! zaW@His-;N!9q#dTK68~X6-jqvoR?s#AySdkJv;~9M%z8m^)SF57FTLN#8U?0$LoZP zfN#eZ@Zx2te}FeQ1U2>m0Q{Q1E=S&V!_{dL=@*PH`k^zg3H=RE&;&2|Y_zqvFG_Yo z|VQ(w@*R)D~%Ke#iw% zxO;K!n3{tVMj;2Yc8_v7Dsphjc(h0dzlwWIr8(!Eku!{1&prCG9Go+v7$T0IUfDf{ ziX5CW3a#STc#mmn4h|c+!i#o3ZsDiq;H*)|!Bp2Um!l#Fr;VIp0lOiWsWb;ij_7Ea zDn7q2a_P%*4sr)Wf6#U3pzBU&s;e6wFK+5dq9@7hM}>F7kxUDFetpn&hl0p7Jl~c7 z->y4lIY9Q{W;4M)#U0NTIl%ScCJn^E&t`*Nrji_hd!YMjIIYq?bW=hgR`531RaTyJ06nP5OSmC+S*GOx&;tR)h*+o%}ZJ6XocW zPsl;|HTsHi-s9s@zO1e{kcOBLeMouNWK53d4v;l5Nkc(msmNC`!aja z)jmE4q1Ll0T3WqFc~lOftg9%>r2jqYk&Vv*@ChxDHq)b=pVJCB$)QgGfyd+vuJN;T z5PRJMCIvb}@n1KF$6c3$K`v&J+*-AFFt7(bpcPt-0Ud@{7tb8whwsxv$J~& zwFD{&-3bWp{sZBrdx6KTOEW`fOCv(o53RGU7OT!W0`~bYB<@LkANKmkCT1jtLL~iD z@!J5&Zx_7zHw_?@-!UIEe_>u|?l70b-M(SG1+V}8#5m7L8cU4vMpS=Ye@Op{ey-l4 z*Xf7HzKQ)Sc6aQmSU=zh%#Ixz{VMuQ^v>v&(f;VMfEzGe`$GGtcBgiwwny8f&Cy0i zzKr}caz`W^*%?_EsfZLwBc%UGkA^=3H2%HPDdBg*FNL29{~`P<<(2T2;nTux(vI+& z@Qm;w>bvTG^=61HI7jVN8`N>CASfI##{}F#nI2m&z05sC&3z{~twrc{kv;ADq84H*Zp&4uQYKOu5I#SZ?Zq2;S7@ z?eN)(Pa3a4@fS{>9o2d{ifZjiHg~sd!xWdHc#NKwW{8tRN1-;`UKGM&Cw4UN#&nk^ zAd(y>;h&eFa4uKrPVYT%g-Siy+%SkT7pX;Vq3UTr@tTMUPE~_91pY9|g3a z!02;OS-kAzE}ZytWT}(5zH>)sYL^`^^)nQHg)_O$ZI=W;X4Pn z3$-q=#C@hR5=K34H0c`aK4?v+1<`Z>OwgK0?$s!A46>4NKD{jkNu65{L&Kp5j+K+B zSwBRta^qj2H)F~$sS#x?!)7+a>+9VqG-Y{X?PSz@=~-`PO>Gk~k^DkTLChsT7gG?E z=g-i{BDAd8P+QtaD!EZeK0z$?0LIOg?kC`bI`SB4I^&>$x zA^wMgY(n@C(1c7@5pv=qq+ch>C&XVX$|vN1pUJOpSVOhIHKKe%{?(#jv$*5em2#YK{y)Ag!HpS z`Goj0MfrsMGw`|yoignkb*(KUI`ZSaAxIk4HQq ze~&1ikl!!LC*<#D+Rz^Hgo0f{0z$)1ApxPH4}Ir&lWw)=%}Xfh4Im-Z^aPL)in^H& zgQgZj$;pCjLP3`xn-HF2i;1TeLVTx?fKbpOBp_6@Q_}*DeL+(TA!3J^f{?LYOyS>F znr)OB5KVxm7DCB3ApxOdtB`5M9>YbtJNzwVy zG4O)l3)*AaP1@J-e13d{`HA_2 zd6Rj**=p9Aha2A*PaD57E;6j#42Km z=$p}pqCbkB4zCXGQ+}eHqij_+DXU;tKT#Q`=<=8Hv+@J-jesVwU7jnCmOho9mG()u zO6N;0(h_L`APanmcJ|mm0(L40j*EObO{91#gaUR_;8NG*6kD*F0*9lK*j2_8lV?8#qE57f4uZB+AZ~=yGTg38 z8L8DddHlxe8tF#-vL0-S$i3A{?GM;<+D_)SS1YyqEOn&p?Xcp~HKsZ;M+UPY!!#zG~kE5-O`uY<_k7lmDV|a-3vk}D?(;N_zgLekRoLO($kqTaA91Ppp*hDNj_2&O+VLSds z)yL){drE?@UFX)-?=KK8w2;m9dnM%7vAKS!A-9&z_4^FuE+|sRfa7RiXH!RiS3gX< zhuWT`kkHoI)QZrky32aDjU22_w#ix$6rzpzGXlTL)ZN##c0Ihx^gG*qFV)uxc%)$uGn^mT2JY`%55&W|O`R{LV!{4RP)6Lk6vD;(cgLeUE#)_l=ftLZUjGi2A zuwI0ifgeXlYVTGPK&IL91;FFyf1uJxFftET%x|F-l<-so}^A! zqslYNP0H!Y8s$j&WBEZjBX5;w%7*kD#P6Rc9V<-?eF26B{VUD&+HS}NCQ#S=q%_wP zNKaH_gHI2@cF4_HAfKpGkA7kf!0eD47fDYa^AWTFUMHXx*)cH(Sakwgkqwh`fJuj( zYaFpqyiQA_JG&mu($dt)BKz4*HpZ zUS!Y29H5^u!+`lb_GYMwIeA4A!(0cej zr>f1?!`GX~HZ?b1Pz^R4RdF6id2XDbNo@|g<~)|^xv_z^@m1%sP0bx8unonf(Gdlv z7nC+NHzt6CsWy+JB6p-KP4jl`za*Ylo5j=EO z<1a9W<^Uy>$*v}|0Th(Up6+L(`~MT7l) zzlMALt;Rw?{QFdYLjO770-T^%>sIW|*h8`FAR?eKRuc2J__0 z$8wO#o`>|HJnb@Ki+S?*69TRXxp6g;n0Il5)hLx1_RASQb!K zlT>fZzX}z}eVdVwb18f~cL*42NQQUtF)YE*-Gr_|DryMew882;d`Z%~D+O>Wdnz&c(Mr zZjJRYvp^I&DCIQH;e;VFR^@D=Fixip??&iETN_U0Otz4Siq%-d+J%TXg){K=rLC~c z?)qP22u3>zpo>1|yTNp?U0@Ku!sl0#`7iVN6=eQPWXFYWNOtNfjP&AE2S#8+1z?_? zgxk_RbXje04tT(C>o!jl^oa=d+TK7dof!yFw~fpMAAS z=tHs?edp1=2OK+4ALA6BD<)$#oq6=vQd2`)0C8T02wv)9>+~W4lC{akkz_o8i85-919h^R4x7aQwW36way9LyQ zxLa&vs}<8RJ$5TsVMrKTfGsSQu!kjuRIK@}Y$?S(tc4zKRiY_nGh0F=inYC&)@Q#c zz<0uvXjwKHE31hvp-sdsxhJwz!pZ3b)-G`;Jf5xx`}%-s#7(U2NEB=PaU!cY+mGd} z5_Z*%bRTps6!=;_hO-QbW6a;cStja(>xGta1+bkEy#Wbl*`j5wkrgKHglpN#M`Vok zN3%r~b;31l5fKq*`)b-M`Vc=SwuP*t zt#Y{k|4(8ccmSLUyZgC-?*D20ukl;s7st277sZb-zcrtS{e9N#HP@PDrU`NX`;6<2 zvy2msImR&kBmFP>&H6?9Hhr;vq#lB(|2t#pSa)o7Y*H)|eF;1Rz8~EaJtkTiEz;hD z7=xd|F26;auZ@a)6?r=HTZk<NsG~*XXs+fUU7Q7lqDx%>KSuodY$Q_A(r){{Cdpe^GoB zoA2*W27M*U_xC4*zC_W&6u-AWK@rbx4muq2HW4MoVAT0;7CQHU?KVX*=nE8v!&CVC z??Io7Df}JypwGki1x3e=e_|8%ybABic5l71+rAWHhb z*n1B!tE#JS{N8iU?f0H53@8XFh>9@GFntCTkzS-X3*b1w03*W;Orh9YEV0)(w~Q?s zyC!yHqEVx7q9!rMlBh8;O-<7j6P3WX_9?rreeS&f=lQ;Wd*^u)_3qzVd$nE8-fQpu zDURSY{RBsFn*J3>aGL%_))aJMnl{O$yvGOsSuN!>{F7SBY4=C9l+)~EwUpE9Bej&% z=tFYn1Lr%YO(S_Y)h}T`H*iMsujLY+h{{}}BE(sC=4u2XO!6{Uk)wKEQ+c1r*jr3FF}###U!_V6@!R=bB+vqRry@_*-qvX zi3b_IrD`t5AYwJnv0<(n!bPa&E94Px9ze!osh$f_j9AeHT%;0xlnqB3$I=dAgvHy4I1| zBQrrU~U!tCOrTerlK*(oW7c*!|qOhX1++{pAu;viGEjC07CvcZ-$GF<{2bWJ1U z-1i}|5xcMLf=bwGMy3;kh}P?nWWikNoI2)YQCgdG>R1AZ!futTL7aUWiV?+a6P%4N zTx7Ngjn)GRt!cAt7$S}+@g@m^L`*9N5#`+|>4Zhh2BD>>%M_XQl0JlqC~S*R4Z1*) zIaT0-tWIQ_1%0rkiOeYy1nEE4NwQ!OwN_ABU6IJFk%T2oM3qlQB$0;ilVnMdpgU0r zD0~$nbAl`lVI&09YFQdJpjKhhND{A<*dRf-LSlnO)N;wZ1S5#MOj1aVsHKP`lCVnz zNzkQ+%wnM;WSt?iNT>)~WXLR(D#9Y_ctK@#c_Fhvl0=QD`S1}M>EU3`e)Ruc-(@8K z|Af%fA$aBQ>)D;z`Pq^7U+w4Y8|*E1y&ccIlX)O>er9!MLV9odN9kMAUFlir15s5t=QYKdtztC z7RN?M{}z2AdP8(mv=QDHct7$myy3SzGTQn(yx-SnwL|W~VDnw`8|HR%hB?&uJ$%#O zZCqjOGEOz-8@0wTI0tZhcs-l~_zQ^Z{7veE1Vxfg)zfzRp54u@JNLk+ZA~-Dq!8{( zOn=W$b7|^>REl*1g*T^Pj6WTm{;p5j&=AG~$224gS_eIc4rHucTXs9UnqVSTfsp;3@@LbAHnceZsiu4R4j z27>oKHv4r*AG~zdF9PZN*?X#p<86a$y{!K(x$O;!Ml_ogy*T_3ziKoYHd^rn{eU2R**orBftHN#Y* znm%}wfZU9Yl4&HX?SqF2R_KUy5|;OQZ=m{BwN^LiO*Os`o+Tj3$~;;l&xAgBkbpNU z;j9+}-Xh@5+FBjpvGINI2!SX@mDmX|7fk4b2M9zlsVs5Ar;lmf+1b1vuJhZv zt8HWFF2y4M^n<6O5AqzzL7^UrLbM9SSN1`YBe`&0#!Hr=1mpW4#Zkx)cR!=~J0pBy z#`i&DBZB45|14lw$Z15dTqZfiPV9qhM&ZPbBZGXSgwJ|nAEYtja7>bkeUQP3!!cpX z`yhEyNL0t}oA6~R?}MC06pe{e-Us=LC>oapQWX)jaPuHFVtF5AD57Xw639+O(U>IT z`yew>aweIJ;6VZji3k>xVtn6d6pP6)p$}dL5YCx+D;t;)6Z+sq01S*tF`*A03c$d) z81O)V1a{8z;9|hT02mk-16~8bz_=Lj4uAx9PTk;Qzykmn7#9O>{l~zV80CHN7=RQ; z?s*JeDj9i1wYS5S*<$bmWjY%@GFC+DN&eEE6VI728~M+(V#I&#`jrLSh=f>oa?DY#`l>h z7L#IppMhdA87B0FrIrpdkTn2IhzWfm9E?dZ;U>7xU+64hQcid2 zB(=zdo8Y#7iNA6?i0{S;H^HU+7#NovZr{hinB)^~f~)o=u+s^n2D}Mw*2loO7`t&W zCPw*9yOhXNZx->*QGU}-4H^@q{H9(F8k2;4|1S)^5X$~2TgYz7)@M!o$9CRsv+FZo zW`2;lA+tU+3BLVbN?(^gHC>+iEcJZq%G3(Dsqc@@JAccQqY@v%4FKmQ7AA(re;dC$ zzB4{Oo{ha1yEnEA-V+=g{blr?=dG ze&a>sA*0VY-)J|M8Apfz9eyf&X84%Ueh_Q`e@!_U|HQ9)=TY$u?JeEiZ5z}DflS&r z?UWphhAqzLi@${6ka}O}(C4Wi=Fj-VQ*$slZq^d(mJ}%c(K#3{H)!eSq3a49H4LA6 z>N)Ve9U%L0IT%pM%O`AAf>+$3UeeLNCxAs+4#rt$9bjimnu;|n2P3Mma6pU7axi@Q z3kUSqAvqW(>B0f`GmM9H;eh^JmVKP(T{07oGE2>AB@1Vd~Q?*$Oi+lET2oGk*~TBMq|7dIet0G zU{IE6+;|F*48~?zGM7dpSydm5&ty8p`^Tk_0+tgD25DI^H|_!i>rn-BX*7aO>g!f1 z+%VNrbg2|>glZ^i`gZs$lR^(lj>5{SJnu(mRo`~iVi29mGe>Dk($v=}5AsfU5)wQ< zDQQh#hbkh(S_u)isUmtrqA9p~+O_q_A<7YLRf!;YN(gtFDx6285w5zgO^rB@M2b>Q zwk@h`5OF1B+pNmw5ou(r>f5A}K%A0#v?Q%62?S~YNlo8IRhy<}vN54V>T@hoH>mY^ zM51Vvq^WN`7O74>c%)L&n!XlQ#D1)>3BS$JH+$kzieM#Zgsls_g z8sVz@)?$(B*iVX7PPR3wY;`4NJ6V;@BhtuL)pwFgQtQ^EB{@+gsR<;h?mI!XK$G(w zBX_BEYjaZHYPIKfX+*&&MPuJ8Y``bmr+AoB%IdzAs(cNl*k%=*Tp3S{t)o)J++WBz!GZBF=a{fx=_l1D|b6ex)(_<@tGH8`AV$}*9G{m{~QLHHr1@q+keRo1!^@`wryc5hDb?sbqYJxDGU zggZbk6?~eNO9eq~xs)YOgPAgNDa)RQ(zF_Yf{|13*jt&ORP0`cQ13jnzy+ccSMW|k z2YDsEs#1_`tQ;{CShV0_&fU%$)-)X-uKIS5Fv&oeg44q$pxYSdoRbO?3_n@}60|tf zISi$85~V-HIpxHm@VFhNg$aU<)WQVOMmP@SD&-9f*A#r|+;Jh5^QN5Ryy77Nfba{I zv3Hp|JS=JskA<9jVL3WiTb}jo@zxTd1#Rwh26OeIg7ch9JUC{Xg-bl#^J82wnG&d6 z&aJarh5E#<4<|ZD7E&PM)tOmtt-#r*Vod@vs4^dw#?Jv{=+cjbfk zqY%Eo9J~*O@JbH;4+`P+9K08W@Tv~}5{2;E4*sIVokXIsYUHUxL@no4Ewj{eUe7X9 zE$5XiGt_ck!?Lhi&Z}4EzFNf`#yfKgf4CS;CWgClKG%SFEeHQw1L9R3{4WiN*LUz| z8W6Aa;D2gByyk=df!`R_x~cLsn2W>2M7V;;QC~j!3F`k{smcWj>i1gK|tcsIk*(yY78VCvH{Rl{0V)pI%z=$ zP*?K3m51VwMF7Noq{>s*g9ztN0CPDa5t+#dSCL%?-?q}nLQ{#41>W~%hbO~RLpwtM z2*J1V@6DIZhs+zyGqbomZv5-aF3&b(541nC-?SgIZ?t#X>+Iv~v34}`QRWr6 z8Q|K?X_*C(isMtSXh2XK+4Y6&pb+K9Dj_{JuKO#3ocEt{hERGxr*#&P|55Y-; z??rRbuIQ?0Q?xAdW#ku;N30?_p-d(?{y(?1z(fpIM_Q^_G?yJU!8{@8Tb`M(Y?w7N zG`M$L&30#j1wO-?JIHH|qzcBG`#>riN6r#U#oPx?*^%UZa#~KdU10fuede+8x$KBw zBq!wI!AMT?v6ALe?Yy9ek>e|}pnShmHU>v# zrNeN-jMQN`aYm3cTv%PaKnF`k^gk-prJ%Cm+(BxXgVBD?ni6oIgH*(+aDY_Ay702B zRKzJ|OGT{PE+eTy*ZW;EOqf`QU6%eob9`x#c?2_fb9ZfQ-yrhHDfK}u`Dk!g+Sae< z8}X!Z<}w|OZ;+Kbc4D7Up<@Ryp54Tw%oS+01jk27xzq)T(oc|j5h&$r8Bd;jrZ#Bq zB-hAxw6r_NVOS73C)HFG11vbmtVYYg}A=>n09%QI)xYuZso*{0qwWE0fHY zU;?p%3x#fqMI4pXnors>Qn}k53k|{>(5PqF zohFeB1UE_}A4YJ#&pCx z=3*yzpro%L2-9iiL~{+w5*y2hmIQMn;*gSHPP4KKb6v0)dsiC7AGuCvWui@ql#|eE+P3&`_cV`Ty4K*uRL^}rN#!*1ZYPw+WoPf zv>NV5aq+QEER|LsYY#BTIyUx~9Zx2Yk&{?=)*K5_a}X>zE+xZ0zuagXZkva)U&6yZ z09|P`MtcDFm+&yhmjhg6j5wE-1g*=v|tf&p|LEY6f&*KETxdCRAwrL zOrJ7CDdb!fRth;6g~%j-Ug*1_?DN?RveUB>`vth$f2tkMJP+sor@@!~3+YSK3)6#B zKTTbcT9is9Ux7RR7ABL4?ep-A=JQaHf&iS7nn;#n<{W$tm^sCV| z(Td34$jgy@q&+evlC<8j?zhgg7FwgsKbcRPSD4LarLoU=6~6U5jAP)Pzjwm-h0hKz z3Xcl?83Y>8-^3i`F_D9!UhtA{aB`!Rw3gy0b5-OZgULCX>oy@DPWobgS%u*tc}c>P zLzMFBk&my;LFSTkl$Y^GZjp%n+b1Z`LD~{IFvrPH2*l+gA3ZS#`AU+u1g+H;a+MJ2 zb=p?uAW=z{UcJkNNk1tEX-ZC}ET=9ZP}anl29TsAYd|P)g)4H9p(JZS;2Mo9bC8#W zX`oZNA_qxHQU&A)qTa!fk|b3?@LGk-bC8cDIhYXO`cBM2CX!?xg4U>8k%KfOM0%aJ zl{v^k5~N3OQ(+FCn1ci)K_2946$Y=!LH3a#4|dNA!&l~xSL7+tToy>yRBvEm>?h{t zE7AuxmwAfx1g^8@q}*I7`gPa8vgn_q3KSImvsHltqkooaPJ-8IP??*l5R{1K8H)Xb zqItTaZeTPYr>INdI_WEN((0A~zLfuM?*-cZ_6A%`+XWf}_<6 z0^K_WuRteJMQ*ZE0Wqk&LE;NEG1sIRD9~SxD0`ha<8uw}Ial|T1YGVScbn;FeNo2c z>Z75f>4^%074sJ<@|awmd=kq!$F{Mpi{wUa>}uQD+Pr;d3;7?-RLTtUD{9Qu$~myY z(Lp`stXxer)JsM5@1toJEA~(JNCQOX0AGL^x$0M}J~iJpg4IB3+EnyVNXy+(s$auWv-3*ZtV7P7u8rsc{}11KJq z4L~_e%}qcRP&kMNp!73x;|JzPCl|gGj%PAIQYKS#M-5B}(TbG5F*h!_NoWl?C3hrx zn3ngy)^<&~Bji&PVoQW-HD;TdI~>)RuQ$kIO}ViptJWCnxZGjrFbTS)$^RtZO+J~tG1;A5k*rQ0koY9=jeu{$?EvS*R>sCf_ru-)4@NJHu8r2i4FMlSz8$$X zvN>{WFEZ9<-^xA+>67vBufvap zuMD?@>%*DQujFL|XZdxTv&jz!!e=g>-MoTaBkmm2XkOaY*3m zJ?(JlMd#%sM02}f+=_>b=60c&9mk6Hae=5M4-?}N+P6N+Mu}V8&oK&5jmt-i&LliB84p!-!JU4H=*Jn;7imQtF4jz-Sk1%4nh6Xw z&Ou_$q}S60+kv8S2o(3=P*Fqz#6%n-im2^y%lH-nAESZ&-e6uI00(q@gZS_z(17mr z0GX}6*T_2iUtYKY+u#;#OF{%iXGX#XIVZCgAp5nQ%=Sg2Y{41XJBKHq_aoLK|sGP&}lP7!r3JE5b)Ii$ukOB8P#(c=j|hp%LY_m=j|g7p{n~2&ToW=t%qAv`i+w-=X6Y7&9li)saDbt z+~Jw4-yQH3#=lln(kcHdX44JZTiuRN>KZdYXAYzoDWKj~*r@UJmcmBq{oYjAsNwX6 z!lq8TT{`nK0fKf3@56`eX176uPELy_YK!v~XBy(TPWnQv5$8z`&UJ+ZtS0;aD?-nQ zvOmt=lI?;FfI;@J?Qh!W+e__3Gk?iEles2yYNjd^O1}oT|8GxEOJ`H>r|wUknL0i- zD*316(~u3YCRv{NPvX@?G0_2c|EJ@>j6V=RJH9kNI`&EId$H?cn_>;I7<}j74d3~v zMvs9P{{9$w9=ZQ28g;7n+!zw!2v~{T5;87+(JRBCyCAiWycsMMQ zOK_zPF!+Q#tca5lD|Y^pZlHYnEa4vXp)B#ra3&OjA2B)g%E; z%%?EPb-VBt`J^B@Y3J%2j7;*1d;-U7EK{D33&Q*SaaAkwF@-x>1JSvuA|J)^T4^GR zG=x7cO=aGaGAz9J3UuOB=1mQOMxKdzLvR+cj`G$cZ~U;LE?IHW$y1RJ;dqTW<+*bd z^AP^Hc`9;eOWd*dA(`}*xw9neppQi|f{NUkN(F(@kUIm%Yt*gGovsK(_-mVOd2Wwn zANR_4+&-1L-70&M(4%u#Wp0;-K%>B<+)gRw%)6vrt3gGsS20mw1m${gyhftRT(_bE z;U6GSmsA1vb|s66%G?gA0`wtEMldnAU20-3fu{Sc$aO061jk$lj@KG!n<9USm}{3} z&RrJ9V{T$@tD-GouhF(LcbY0qaEP{P2sHXm%59NC)O#3H8xa$8n^hHvOt{7sxlO7A z0@CIxa;*wJxCLy)@fw9Ia~l*31-5|l+xXa!pKPD+r~A<7Gs(*B>cPZ;}OI9 zwe^g3x3$}vYYj1f8@?#KI(#^+1H8~&1)Ce>SZrN0TqsmywZLsg+u(pOIm-{f5d(3{ z9dL(z+lH-ll{`8uTIb%8peLc=*gm_x+G^(c!^Amg{|6|xx>r$A_CTTE1OohN?yX1y z9vbmtd`}+;+T1(dzzE*tkmVo9Yi+T;_9^bIfDFxLARzE{6Rc%KU&>r3$6kA_dwU#% z;>#|3?KLuR4oN~lDnHr18;o((ERyWCPoi2m=cCE{G}<%_Fv5w{WNwTEY;Xd4I2D7T z9g)TLGe8cb)?!F5_E;e8wGWa+AYrPv?SbyyXJ82y)H?GHg>^AFNGD*KxJWc=_YNVr zwn*&>qIYpn3ILF7Rs%R-7ZC_HsRTjR*k`v6wZ_3EWQ%Hdv+cwhW9=Agn)9pUmIa;b zm-NEMV$Y(^jjio)1DUbeIM2Cx2I$<9S*<(UHnhS~XE-uX0F}np;Z`+VWVWbwaVwm< z>)PsYYU|iMG(5tyo7>YkPs-_YcOVi@ppn1=QWFWQX(YIv7>QkdB&?#5z|gu#SV;qy zVOb>b(YQho7oH>r88qT9r%jE7qWi(fdK{%mETe{FaIVWy@Jp#A46l)7iNYHC$pBFn zdvWF`fH@s^kSvR+t$kUb0*x>WsTW-=^zi|r94{FW&_RMMppK->HDb({83&tWo@7EY zT?`UruH+qp*GMu)Hpt8%gUpuYo*5{|EINdE20?S2pdHSXeC~E$0iK!R4e)-DxCB8q zneNRWL<)^nj*|=yJ!4>?93#o^;De+&TJn%XfH(RnlFdmk9blPhs_20}I#!iL7b{aG zNl5n}AjxD&5&{phNs}ZA!E5}}C`4^wIweF`gU~KrG;Zs9K?E165ur{n27y8&(+>!> z3TJ@hLevQTna5cpMYRysFd}Gk>A((ELUVM$xCE0Vg8^4f{gsjmia5^@9vlu1ucHlapM@kL}=rl)2`Z-XI$lhJ>bS4hi zfQCFq<*be2(UP|bXWYhzs;cRl+#zKDe_80!Q1*w}%d%^-X z%bc58o;fo8@AS**VtPkt}e$jZp!*59n}Syx#tR<&iB zZsW+xS{)Q{a z?j_N6h&i2%e|g?paOe5U8=sVWc^($rITv}{H}UzGjQ7MmthRG@^w1lHTucV9%)?qc zIV{hM5)@(+^RU#;@kdkr82^cRSZSBw0hXMQhlO^|tw<6e&l?umCEkG{18eLO?|_hj z^>xmrc&;Fmr92M{?3|OZ#6gChl!xVY)=oQgS%i$DGVd+0yMAI6I>%1R!vecnMS$%q z^03IxRQ9Wok`0+ilk%|2uGSFXfr>mVv#T{|olupBRd({?oTzkAcvj|NnVrS6uLO{6 z;j^ci7E|-E(7u`0;Vm?l%2s6bb$M8LCyyPvGJ5p7(VI5vnmnw(`~fxgPRJS@*EHqoVY(aI|F&3t(1 za=JMDDJniNz}KnxfN(9(ujSjcD^EZ-y#_;Ty6MXN$$Xr;yn_S#B#8je?Bc9*qNFXF z+C}k|`4f-|0?oM^sX#x%SLRnC6$IG7BEJ%;KuPbS8dT(0@OWK*7l&W2;sX_4rs4zS zFV8RKBLYwHqSBP-mtbgZ{4C~;sZH{t>?hKD7ZX7LuRc8I7N@oPv?au ztmV<4V$1W#$(#etF-_*IHOIvKv0U)MhYxm2gO84>vOR)g?-(xj{MkW3-f%_!Xx8TG zsfZ>i)tyOGnV*7G5Mc9(`N^ENzC>EHSLT}#{sESsm~TY*YmGlC-@qnyR9|FZqJdD6 zuSYDTcfm3FI`{e#r-2T1zD296&DXLSiN7zbn{H96B>Da~dPCW_v-f2$%&yDUWRv!L za01{`d#zmsYXHB<+@HB1vodoeoB{Y*`tJ03>6PiD(&5w_se4lArB{^)Ks3)~(hqYcX7f_^J7Vd8N6*oNPvoU%-j~USqy-NciLMci^o5 z>TpFk68f3DAmAP)VVnOmmpXR|)6H~Pn&cPInx}8r(A!1sv2N>tqlX(dZH^x2o~mFh z1Oke)&vj2#2sn4fCvIuk=QNr-goK2}$o?rJ$h1ncxg;Hv=WO>>DwD^p2AwP0XVsc* z2ybVO?1+!ZbF6#hRIY&0Fj>xY4~EK6)I4W2n4N+s&Vrg4s)#g4yQf-N6$lvmJIII5Ra7VWy~I2fI3qgbC6k8_^L2HB5KCxlJ~Vw0ek$GF1)(s6e7((wvS+ zgD*MSdz_1;xpqYOG7S+)j*%OPNWrAojaUy|qO^C($_3`qy50(OF07RI|HgvB&P%Acop2gcNK zw9K?Y4hh0EFeK__mxvThvu*BKLs4F?mB>k4b(qi`o^fs$dsP^KgSOY~t)f2wuHOf< zPZRqj0@m-`*=;Io?VgdnMKlPo#zqmQ=4M5dpnhPJf+mg;`(Vbqb+9>3O1@d^yg{(2 z))_n0%$xI^i@`xO5s0)L{!uJus@e4T%6GI$ZnUhChY z;^FYoVvU4y;$NxrWd8;VkCz*o3hX3b4VE*c+Xc5zbi-#r`AGH&zRrv>+B#PICTICV zx+qxXwq-x_k|Ye_7Fy}+&Ums;f<@H|UPOHYlD*uwk)M*YN}DNQFY|50u-Y^Md#Nt~ z1EV%tA~S_HuJzJlw`KXMA;B3(_9EY=z6ih?m0_XpCl?5Pl2(G_MSB5MZ-NEBt0-Hv z_W2UaAOp-3twlOSef@Jq7wERz?KzVA`phDGwj^snT9G}=Z_A$g{Fed?)S047-F{eW z{u%Cg;|G9?)>~k@JCKQR)CtFlhK24uAP9~TWp==NA&wT^;GnT4J4LiD8DX?`n5Kvu z5C{Kr_nI33`ZOW?zjgN-?@ur52lHo561LVCgnnygU(WVtw`XT&%j{p+_u6OM%k9H5 z|IGXVa{f1E8q)ts|2TbHx;;HLoraeHZcp{5j!oHc=ijZc`@bN0VB(|1Q;G8vs}hIB zKZ}1aetmpXd~!Sy`$_E9SZ{1WY((_W(I=yqM^{IWihK?)0^}m6Myetvywvv%>vU_L zb&&b7`Gk3~c{0p0{%O2uTni`v>kKpediYM*|DPE?DD*Ih>HkTo!;qL8(7{2j@z))~ z@JQ~<%AwH(E|A<23Wd**@mQM#?Cq*N0lgy-+$NnT0AYfxCJ^*{=_Nu1NN@qPD5a7&d2`qR(-&&34g6^fpG4btK{a_VPl!q6 zcDfo1D-iTyD(JgcptuQ>2c2pF_-l$h zF(PXQWk7lnc79~d(1%^czN-jVt=@bP-yTZ%a<8=nn(8YmaQ9m0UL(3m2 z!2EKYxnogP>jm}JW<+ade^lf7h$BD&M#XD;nbb{q=HcQ;UN9IIorf#I(eO2VRq9j% z^I`YdmrA{&HY0YQeTfpCFoJ2MxLB1UDBk8aS=&U*tLqV{@#iRktrGIqxkzyq!E1tT zwqke+Mq=$NC~Hlq&8o9nRfSp1pvulv9iR=g3#G0f{0dmkTWXxmKo#Ifctc*$Xl<1g zkk^Dz9j2>+A=B~IoUh8H%Rt^|pQkh~VMhd&=QuU~(T^$UOwLu!ugP5AXP-00+98?; zTLnWUnkJ1&rP7}F*=H+_z^x2j-VeE(0&+V=bQgZ6p$JUg5DS*DQLkSR}p3OD~> zl3t!ZIQ6^KH&c63GvV9+tz>_)Em@z~pLi*8HSG5v7XL8*Nc_C`!uZhGuVVMbcE*m4 zC8KXeZ;753t%r92Uy588Sra)D?)87zI@_9QCCs0hIkUx_VEn~+*f`giYh=T}2;TxX z{nduP2tDV2?3ey$eF1W;PH@sV{WY|J#nISa|42YX0kW-5lIirHER?Xi09jY=-GN+% zXdgpq8VZnnB~=E~2<;aYC2TA}Ce|8JN+2A7m^B4R%W`vKshHx-g+(!~uD$@-S&}gW zRu3p$Ljf|iB>jR`5h!6*0g|@dOlB%2K5w8TO$A8ZS|^yq9T7`gb8-RlxZEoo{n}j8 z0ob#y0C`<*?yg8%%JY!mC0d5`%%x>*EI_uG=y^go07+{KkoYBfo=^tM*;s%CFr_;E z0yAq!O$EpV6a4|z1+B?ZSJo6DDNK}p^ND&iNB!mO9DCCNX zauUj5i`Ew)V~lT0?#hBV6GPfybpi6m`2NMEV?8-SQ&WK4FHBm3{2e z1-6p9!eO%MU8>+_QePM&3rV{Ck}bKmFj^Lp(3McFx^SrM074b0SWV#&IXDPSuv!g; zQF0FjL;=Ur{mETjVWezEhp>cVHH8s~kR`^W+QPwz4K*uzG(74H!)1>JeOOVt>cTMD z_PP%&N>fufNLEYxp+$-63kS*qk}+=pAvIJs2caur`Rc+DSuH|UBBaV>wMvi5jfKHt zM^GXkjLkdh3xh<11g3^Dx`x65Vh{&si7~?ZLRPJC0R3=N!4@ZErE3IET`T_t4aR!aL>d-f+hL;creEn{LEuzAWW&yH=2 zO^XeVz8k$i^mw$}I57NS^qBAy;ftc-@X6sxp)VspgF6AYMUIPP;10n1taHML!|&7K z|I5M#h)kC%>%H620*8hD_D`(2p)#Ylqpf*;OLuGK#@0=hr_n`jpGT=h?%~ms=^{5u z!=_UE?O)J!Fb;~2cKhw0)0Ju;>yG)lR=3}Nn=Vp`6nHPY-+qg(K#F**f8B4tNtfD0 zv_||l6k&q8jQ#e{6k!NnC;ID(Aqg56{HJum%om(sHDbR;#qhu9ov$Ahz0barD(Rzx zR+%7$goY@G*MDk4nhMpEBhU!*|G1nJSf*#b4y(#PO}Xz&Sj63SHpz zolC*G11!U%>!?+6BEHG~l5X|!Sk49VR^RaGT2uj!gy;Vr-Rh(K<ijlP66Z`ESDsJN@hH5ikp;(E7>o;zON0%!KtAxDsexN8p@J=+T zQY}+FO~J~>&3^m8P}YvaRMtxs?-JG}yt_p4mPo`a`jXPG5iA#^YQMG^Re&Sm`M)Sl zUtoS6xQ@8r{=VcY@``ux_$O{X$2I|O*jyO?@%vO0-ZGb?5FA6mxA%0cc1-j z73zdDBEnNNjwx3+$`I_69CpJ7as*$T05I?Dv!CEpV^}nR_t}rr9;&w41<#!`XQ`0o z!}ETO^9zL&-)q=Es<59K#QqV5J-`FlKg_wE9rj_7A|6hLo%CM%Y827vR^sXeZ`>K?EN@0v*0V&i^km_JpkCthD*Q`4GIn zw*<2AKQms*{w#ZQwl_OFJJSBxe%8Lh-fABU_W`_{c{p=fra4oWF<}+p&h#1SCF#Rc zpQWBjU7OmHnwA=z{4n`s^0H)0vL5=2%RlrZI7p$*AV%%-U9;3ym4LuE~0bUD# zBYYOz1~?-0k((9Zo-b+cW@CbO46$GEPpBtQ!ICNBxHCgY~1U{fNvsU}&`;W@n_?pr`A9?QgMT<_xVJ4eW2S zXk~CTt{-ADvjI;toZ1h%=Ojsf83Uv9H2VS81Q`@-g7=G}>PJ!gK4vjCzG*FXFS8g! z>n(N<6NAA~i`}g<4j4J@yZjz-V8f>U4Q69s5M7^iC-a>P4Old^?~ttrV7)oM&fG^? zqt>`xVH;$O+hp63{#Gx=t+G?J-SaJqDfCN(_RWgS0oi1BzkAxzPpX9DacBmCU6dW| ze&cBav>=WXC6A)ndDa!VK5;8R-I9|H4IP|5-O9dEmfeBt9dm>17zd9v@9Sk-lb%*< zlRiZ3fcUrx5d$B-zb1=8W-eMWu9L+eXuUPAmBk=%)GgPDVd~~l>3Z9%#Wv`IF&kec z*6#w*`ma>$hX$ybcP^4|QbN{UkSX6n(bQfdmQKkl#O}^Rqw`en<^jJU@=#^EaXHG? zF`hiVULfDkWnfX$& z6LYYbyqCx^2cra9`Nc}*`aqiNf55myAXLtx zyI=PM{{OlnFG2#3Y!z*f#^`E`kjbOSS;_}>MN@ShsjZX?48#T6euGI_R}3TdX%=1> zSxqs7cn+PlGosqUIfz9xnZGnhCKt~3&wQ{T3EteHw2g(cRIj_VC7Muu;Y`)*E@fbJ zHWbcK9ijh`_G}lqFQGE$mj^LFfV%tSjtN1BOrq2WV4a zr`inynRdmO>DN%`RZZ%UmQb*+(1VJK=L6HAsV{V+_Qa=YOwPsvyxJjmF+qFww8q-P z4%HL7-Fr$^SJ-oXp&OyI`C7Oc_%^xabmoBanc{GJgi z9bnhkRM><_Od4{@IA|)gBBTQfp_;-*f86LSb;tF8{Fz==VS|6fgc9K)$C0d8NStU> zW`&fbsnFtUMQaIuOoWnF7f$t)-zllv9qOyADKsmV&^;tVE2=M?;w++vHKu%@uqmy#0d;)B*!RaoO2pAzBz;z&+bNN|5qlIp@qzR_td8lzL1 zhQf)=4s6+;nNZsDrG$-z6Z}RxuswH5SyNceEXb-vM@vdnUs%Qb%og`cTE4ch((h?Y z?jNv21J#8U%#y4&taqjo))e505&ysR=9DI!>Aji~LSxV4D%l3$=xX%y+(|x`{uvOwzg|)M*+a>jvvg z>lFAlKg^1le=>grnE=1 z*QIu*R;MPXh9~#J9fHp!Z%&?{To304j!4E6A0}Q-+?%*E(UDk|s7?%t|0DiZ{PB1$ zetLWj+$lIB_C@Ty*mq+6u?u3&u_`!0@Ym>nMQ@Gnj;@N1il2kYZtI}&K`7kc9=sW zeTP_+DP%)$cTeXwRy@QyWu#S4i`lsaLOaA-cd%7W3v27En%B2(tgPL($s8WDM_9Fd z5zlii?A|}(t3g$*7bIVYYF8&<)}ol&dfsGfaE!p`WE4{)@Ht6P72LyA%?PSian>DT zt#RH_^}JdG7TVd_zM-X~v$?vmhLd5G)d+X^z{wC|jjBq~6mz6f(Fn7p(prw~n6g>J ztP0AR_rY?$W73DdW$s;;$Y1SIy7_M@A$7b`OXj!^5)ZoV~u?q8ln)kn? zR@NF7Hg>jjwY7BgbPqSj47Vm3#_G1#UEM2M+gmsEbaqwl*w${2h#l|5ASqeW)z;e4 z)6&z{*)g-Tqo=F0z1zbq7-LOysX5Gy-kzS$4i7PZh;;py%_^x0G39J>In&J?PC&ir&uFuAbK2 z%^jo-ZEb3RaKO8@o7|pHM)M(elG`?2$kwJhEw8T~Y0U>|c;H4zTxqW9*vR+|johe# zRl^f6T!(uDFPU2{;l?0CtP`D>z0!@X?L94Ei6*V|*So!&D?JD2S*~__ zHw9ykjE9}^VYOSdzPGJ?WApZwj@EXspHCfX9St$r+SLv5x@!C8u9l6hb&WlpbxoDq z_ZZ(c4X0gW<>67rw?|u372<{(pl&48PZ|3iLrByv0LY(m+k;qlLluxW)DZe7jlI6` zymTG{7(9syUr*=>`4h(HnD96u|3Gt)GpD<#l9Ecyqh^v9vG1()=M;NhF4#baO#Khp$q~?c>-($p1IS@aL z5Z4lGRuSTF8NWe@-EtuQ7Df!#gwY;|ziGUW5j*8T{7sA)tXb<=`yt~UjMym$;)gI| zux71e?FWswF=D42h#$m=!63Dc!5%Q)z=)l4AbtQLu7S1%Lm23MzwsJE?3M%Z{TOjW zPiKwOwC*!r!HAu5AifVH23OTM4dY(pC5+f92jY9NLNG{89TeV!afa}!al-Fz<5`T@ zDF@=a-QiPc@Wd4N7|##2#)qYDXlQuU5coB`+8usZ?%Cc7;A3~dT>AiiOy)t0$*>8a z?FU$+3}aPK8w|csL8Z~2vJMJ|ogb3Ro!)X)cWc*@?XB>P7xaA25FI-tw&Gx`Hf)fh znOj;qHn(;!0*39tqCIq})7g=t>6^P+Tera=PsVrnhchHEj6F8aIv(omZe7~dy0fjb zw|i+<=la$~tu5WXT@IXx5-x=A9c+z-I#$eZz8Bj%HV+MtbcQnjCy=YRXM1nYEMT*t zbx})4%VrpGfp(;Eo6}|DKo@cAU~3Fae70{S&y%?$deJ2!KeeoH2ZkHAv~@7mLZ62Z zcSMKTGrO+j-KXP7-{@@srylpbkr0O_~?Hf zo%H#v_=;B1(rs;|Hop>g@|$qR3{r_xD$jlw%EjVz^LV*foNq30BG_ln3$>DJPgRoU z7uTu?X=-r|t(<(RDHHeka?~^kCob&IgWU z@Hol;Zwr4Gg75pgvU{?}XUEu|+RxcH+O2lIoyokP`BvtV%t@K@i~+CzeItEldSQB0 z>hGx+Qa8ex|Cy;_$v-B)m%KK)G1-_*C4QOsR^pOGbE3g{`|s)amGKt%W+(an-;LcA z+a6mPn-Dt)ZUy{D^yksBy~-iz9m?TO%tYO_7n2 z5S;yg&brsS%IdaGu#U0Dm|vRjn$MX<^K7#N&MAyHhZ%o2-Y}jvzHa1<%i*lRR^vot zmQi7pg+GIgg6G0_gf9zsgjd4%{-`kd&?kQ*N0^hH4?YrOBh90wuB(;~5pN7P>(N5v z0hNpm4zH4YrLxFJ*!jO&w&mv?_p>g+t z<|N4;&~F*fmzm?GpTnaDo8zU>oSaJicU4fA0b2SiYMNk0cMp;C(mix`9(@k9!u~|OzaEG7D{DYM_6{eRL1p!WeZ635p_s)Op2AhmQ;Ga>yBKj z6!ZOdWAFWzjih?j2GP_x1j0~j(ZF82i>%PagC5sUe(NQp2Ym(3K5cmZaJMZ5sheF6C8 z8fzI906wM#0iu)@l!yWxCl>JnOcRTE0gj~t@D^B_Hb)S<~XQl=8!^lr3Yx zz*BD7!Auth#5S3-gZ%8y`jSVLvj;Ha(<4{9RGVy8W~@I(m9=HY0mrDa8Rk{Cf61c2 z`I4gB2HCWq*kA7)V1lz8aAcPY0|}mDhGWc8!zG!_Y`;+#F$q5f*_8qkZ*`9yX5-Aq zj4!hHnT?5}x;#-)qs(IdMxK6`GaF$RV`#m_EG7nnqhgpUUl7f9Wj4fo=RzT;Mi)W$e%X2e)=FXTWA3A@F>BcWQP>6;!`>^~j^tqKrT9{I ziY{f-{z5TDz%i=N6`6yMQT>~Bf1WAOgiQNivZLLUA+19`^G{g#f#Kry*7zsuid;eT z36Sw;vR@E;YBFajU1JeaUt|vkWzJH{+T!u5Cv=&!l&Y?{KvhqhIZMeJi}O`6 zgVG);Wqom;Y8XOU!Vk5@xvF}Eu0){CQPm?a6XpI0owxTy%wN%)mgN^Z#1lhzgCQ3<~vprkqr(G>HVBD^TU z&h-Sn#?Hj7DblwjNH()aE(AHmq4ut?G)6yfGLR z+N>y9L$QH%!u}N(LHASn17c&bp7(gkFFhGLysrT%k}5jGZU)hYwN4H;!qv4#&a z_ASRERQ&Q|q?3!)tlt?}b}cn-U9pPy39B~PCym8Pyq@g4uViS~7b{s$UOLB?3R+vN z;6skpSR&*m%IfJqJDEkBisigB+&MTo8aWVWOyHftNV)z(=g7L^cwSmY8|;k9#iOt) z1HR6frc;XJSVum z&r$e?Jz#A`Gqa*9HWd#;Djbk$Cl}#K3iquguELwphDg1e$ z?@c%|T{>)=iiaS227D~DN^6SnMg<$JJa3|3&WvbE5#FcpClJ1*?);&&utyi+m5L4C z>_a3TKr3q~!gCe=q+X;BZf8wJc(H=b16)PPw57DflZ)_Zg&YfnbO7?!6%SHlfzSp^ zJGpouTBUyBi1*G=)jLpSz&a8mt}6~f<;A~!xRzF?T9?f124da8s;Y!^0M<>0XM}pg z!$a8{vb(dVWT$7xWs~+N_UrbOcELU$vH*^^EA1hfe`VgwJe#>Qb7`hCvpmz38IcL6 zf1CaxyaI4dx+{G`dUE>Ew2}IK>PM;jQ|F~NrRJm#OYVdB0G>!*kvucGCAl&=JvlKs zEE!GwJ@MB#RR&qlrxxhm2TSrnNVNm(CTKd|ny&bQWD4b}nX$8fj6 zBj(kx!Z6P~+zc7-LN4J|#-{M_@L$6(8gqKh6Ci#lCVOq zdl}DG0m5!rTL^{_-?xX28EZbd-^y%djj#-rL z2?Fxld%MS)^ZgoqMaY>A-ZQ&2817t0*-j0HI|WeItHJQ{^k^{Lfrzqh9fq@emj=Tf zh$!1Z_7{cFWc#?MkZn}2Ox%86NA?Q65^`JwJq%H{U5nzQqf>(t?cbqA@gCTwMe+7+ zA8pPQq?et&6$9|~oQ45-H@9H`UWP3gfOqg_6u^0R69(X2+e%VhI45}r9bz^~bz#3V zf3M}O2m9l=SDoEtpIkukUUhbp5tQiF^_m*RhTNh>@fJOmw+E3+_G&W*;JtbZ2H?HA z4g>Hqti=GlSJ$8b&Z{S50N$%7@m>WreXnMCukyJFYdGtXvjwh7{97KvOAn8mJfSp2$%^zeQAs#{MC%*{ik9tUM z%TB189X`6#C!;5i?jSjR4u~B)`uY&F-2Kg+wKy5dw^MHPz|n1#mYp`bmHx(#8r?#2 z?3_Bhb4E8i^CS1POYkA1$W6|SLx!?`@gyfw-E!^mqR7{r(UwOkXNw{?;us-|>;_I6 zdPUp;AuNYGa=jChE*lQZn5}j~QUS!nWX1sB5#;oibc`sL zQgcD+86wjl(+MEtkMKALjErxS980N$ogUgx6h=#pr<@2DS#sxw_Ijf7HG0LylZdF0 z>gt{t`Wz9}DKwry$mm(2eWZk;wgZ_k&Ifcff2pMGE zx+jA^Ldcv#;}L|+IrBr3&3=!NIfcfLTZzk_gUYJ~yJT`e~;@^qa;0=Ha!e@q8g)8ChzBkQ% z=1 z+DKKzuzqemWPQb43FFrn#!uno(YeMlV_f(@;nzS3;m>&^!kfzapNHPzZ(*Ja=lb^q zV!1g5V0XKxOx=3|e7@4`24K5%Fm8?mu$?*>H`4)FFPzvn{mH*GL$0lIuIF?=$YE80 zezwPrtow?br#eN?UOBhf8?^mTe8Ap5-dX}@Yh85&ELm&dx!$Hn!h!&gywyD*i||Cn zy#-}F6A|`i=a`c$?966a)P5aK613>N#i8;;#VlZ8cez$IYupTnOspc&v_qM}gu4bJY z8pSyXNp~+CxYd)K&C3+L5Dpcbg`i!_DXYtX7W%ZH<#50XeVUI2`(b=fcb4a%evUHgv~Mel5i2|m#fTHWHWVYu zvjxS7p&(vTMV1kX%-l&Ru>B^Kj~E24{HXrlxM@nTt+49MU%xb_Y@;41`hSBCDEoiC z9w@q_MGqA1eX3w5WT_f#*^FYu3Qs{XqW}N@b^X?uvJ-hHI5SInPnYQb6Ldh?|Eu*t z(H*PwK+*pzdB4%wFSpwW{$GJ�rd+gQWPV$|0Os^7zY-U{Qp^@4??l! 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 =Z-1&X`;^FB>o*} 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