From 5812d7bd75a5fc121dff44ed199acd5ccf55a0e0 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 18 Jun 2024 16:37:23 +0200 Subject: [PATCH 01/13] Fix type hints --- server_addon/nuke/client/ayon_nuke/api/lib.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/server_addon/nuke/client/ayon_nuke/api/lib.py b/server_addon/nuke/client/ayon_nuke/api/lib.py index 905521255f..876585bf21 100644 --- a/server_addon/nuke/client/ayon_nuke/api/lib.py +++ b/server_addon/nuke/client/ayon_nuke/api/lib.py @@ -561,7 +561,7 @@ def read_avalon_data(node): node (nuke.Node): Nuke node object Returns: - list: A list of nuke.Knob object + Dict[str, nuke.Knob]: A dictionary of knob name to nuke.Knob objects """ def compat_prefixed(knob_name): @@ -613,7 +613,7 @@ def get_node_path(path, padding=4): path (str): The path to render to. Returns: - tuple: head, padding, tail (extension) + Tuple[str, int, str]: head, padding, tail (extension) Examples: >>> get_frame_path("test.exr") @@ -957,14 +957,14 @@ def check_product_name_exists(nodes, product_name): def format_anatomy(data): - ''' Helping function for formatting of anatomy paths + """Helping function for formatting of anatomy paths Arguments: data (dict): dictionary with attributes used for formatting Return: - path (str) - ''' + str: Formatted path. + """ project_name = get_current_project_name() anatomy = Anatomy(project_name) @@ -1100,7 +1100,7 @@ def create_write_node( linked_knobs=None, **kwargs ): - ''' Creating write node which is group node + """Creating write node which is group node Arguments: name (str): name of node @@ -1134,8 +1134,8 @@ def create_write_node( Return: - node (obj): group node with avalon data as Knobs - ''' + node (nuke.Node): group node with avalon data as Knobs + """ # Ensure name does not contain any invalid characters. special_chars = re.escape("!@#$%^&*()=[]{}|\\;',.<>/?~+-") special_chars_regex = re.compile(f"[{special_chars}]") @@ -1402,6 +1402,9 @@ def create_backdrop(label="", color=None, layer=0, label (str): the message nodes (list): list of nodes to be wrapped into backdrop + Returns: + nuke.Node: The created backdrop node. + """ assert isinstance(nodes, list), "`nodes` should be a list of nodes" From 54f9e2698791d471e5306fe0f5beb5019c42a485 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 18 Jun 2024 16:37:54 +0200 Subject: [PATCH 02/13] Cosmetics --- server_addon/nuke/client/ayon_nuke/api/lib.py | 53 ++++++++----------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/server_addon/nuke/client/ayon_nuke/api/lib.py b/server_addon/nuke/client/ayon_nuke/api/lib.py index 876585bf21..6caaed3801 100644 --- a/server_addon/nuke/client/ayon_nuke/api/lib.py +++ b/server_addon/nuke/client/ayon_nuke/api/lib.py @@ -655,8 +655,7 @@ def get_nuke_imageio_settings(): def get_imageio_node_setting(node_class, plugin_name, product_name): - ''' Get preset data for dataflow (fileType, compression, bitDepth) - ''' + """Get preset data for dataflow (fileType, compression, bitDepth)""" imageio_nodes = get_nuke_imageio_settings()["nodes"] required_nodes = imageio_nodes["required_nodes"] @@ -686,8 +685,8 @@ def get_imageio_node_setting(node_class, plugin_name, product_name): def get_imageio_node_override_setting( node_class, plugin_name, product_name, knobs_settings ): - ''' Get imageio node overrides from settings - ''' + """ Get imageio node overrides from settings + """ imageio_nodes = get_nuke_imageio_settings()["nodes"] override_nodes = imageio_nodes["override_nodes"] @@ -745,8 +744,7 @@ def get_imageio_node_override_setting( def get_imageio_input_colorspace(filename): - ''' Get input file colorspace based on regex in settings. - ''' + """Get input file colorspace based on regex in settings.""" imageio_regex_inputs = ( get_nuke_imageio_settings()["regex_inputs"]["inputs"]) @@ -791,8 +789,7 @@ def get_view_process_node(): def on_script_load(): - ''' Callback for ffmpeg support - ''' + """Callback for ffmpeg support""" if nuke.env["LINUX"]: nuke.tcl('load ffmpegReader') nuke.tcl('load ffmpegWriter') @@ -815,7 +812,7 @@ def check_inventory_versions(): # get all Loader nodes by avalon attribute metadata node_with_repre_id = [] repre_ids = set() - # Find all containers and collect it's node and representation ids + # Find all containers and collect its node and representation ids for node in nuke.allNodes(): container = parse_container(node) @@ -896,8 +893,7 @@ def check_inventory_versions(): def writes_version_sync(): - ''' Callback synchronizing version of publishable write nodes - ''' + """Callback synchronizing version of publishable write nodes""" try: rootVersion = get_version_from_path(nuke.root().name()) padding = len(rootVersion) @@ -934,8 +930,7 @@ def writes_version_sync(): def version_up_script(): - ''' Raising working script's version - ''' + """Raising working script's version""" import nukescripts nukescripts.script_and_write_nodes_version_up() @@ -996,9 +991,8 @@ def format_anatomy(data): return anatomy.format(data) -def script_name(): - ''' Returns nuke script path - ''' +def script_name() -> str: + """Returns nuke script path""" return nuke.root().knob("name").value() @@ -1300,7 +1294,7 @@ def create_write_node( def set_node_knobs_from_settings(node, knob_settings, **kwargs): - """ Overriding knob values from settings + """Overriding knob values from settings Using `schema_nuke_knob_inputs` for knob type definitions. @@ -1393,8 +1387,7 @@ def color_gui_to_int(color_gui): def create_backdrop(label="", color=None, layer=0, nodes=None): - """ - Create Backdrop node + """Create Backdrop node Arguments: color (str): nuke compatible string with color code @@ -1494,12 +1487,12 @@ class WorkfileSettings(object): return [n for n in self._nodes if filter in n.Class()] def set_viewers_colorspace(self, imageio_nuke): - ''' Adds correct colorspace to viewer + """Adds correct colorspace to viewer Arguments: imageio_nuke (dict): nuke colorspace configurations - ''' + """ filter_knobs = [ "viewerProcess", "wipe_position", @@ -1563,12 +1556,12 @@ class WorkfileSettings(object): return StringTemplate(display_view).format_strict(self.formatting_data) def set_root_colorspace(self, imageio_host): - ''' Adds correct colorspace to root + """Adds correct colorspace to root Arguments: imageio_host (dict): host colorspace configurations - ''' + """ config_data = get_current_context_imageio_config_preset() workfile_settings = imageio_host["workfile"] @@ -1822,9 +1815,8 @@ Reopening Nuke should synchronize these paths and resolve any discrepancies. return new_path def set_writes_colorspace(self): - ''' Adds correct colorspace to write node dict - - ''' + """ Adds correct colorspace to write node dict + """ for node in nuke.allNodes(filter="Group", group=self._root_node): log.info("Setting colorspace to `{}`".format(node.name())) @@ -1946,8 +1938,8 @@ Reopening Nuke should synchronize these paths and resolve any discrepancies. knobs["to"])) def set_colorspace(self): - ''' Setting colorspace following presets - ''' + """ Setting colorspace following presets + """ # get imageio nuke_colorspace = get_nuke_imageio_settings() @@ -2155,9 +2147,8 @@ Reopening Nuke should synchronize these paths and resolve any discrepancies. def get_write_node_template_attr(node): - ''' Gets all defined data from presets - - ''' + """ Gets all defined data from presets + """ # TODO: add identifiers to settings and rename settings key plugin_names_mapping = { From 2a49064c0b1b4dec0379e1f379ef496be367520f Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 20 Jun 2024 12:27:27 +0200 Subject: [PATCH 03/13] Integrate Hero Version: Disable usage of hardlinks - but allow enabling via settings --- .../plugins/publish/integrate_hero_version.py | 30 +++++++++++-------- server/settings/publish_plugins.py | 11 ++++++- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/client/ayon_core/plugins/publish/integrate_hero_version.py b/client/ayon_core/plugins/publish/integrate_hero_version.py index 8c36719b77..95b9f418f9 100644 --- a/client/ayon_core/plugins/publish/integrate_hero_version.py +++ b/client/ayon_core/plugins/publish/integrate_hero_version.py @@ -87,7 +87,9 @@ class IntegrateHeroVersion( ] # QUESTION/TODO this process should happen on server if crashed due to # permissions error on files (files were used or user didn't have perms) - # *but all other plugins must be sucessfully completed + # *but all other plugins must be successfully completed + + use_hardlinks = False def process(self, instance): if not self.is_active(instance.data): @@ -621,19 +623,21 @@ class IntegrateHeroVersion( src_path, dst_path )) - # First try hardlink and copy if paths are cross drive - try: - create_hard_link(src_path, dst_path) - # Return when successful - return + if self.use_hardlinks: + # First try hardlink and copy if paths are cross drive + try: + create_hard_link(src_path, dst_path) + # Return when successful + return - except OSError as exc: - # re-raise exception if different than - # EXDEV - cross drive path - # EINVAL - wrong format, must be NTFS - self.log.debug("Hardlink failed with errno:'{}'".format(exc.errno)) - if exc.errno not in [errno.EXDEV, errno.EINVAL]: - raise + except OSError as exc: + # re-raise exception if different than + # EXDEV - cross drive path + # EINVAL - wrong format, must be NTFS + self.log.debug( + "Hardlink failed with errno:'{}'".format(exc.errno)) + if exc.errno not in [errno.EXDEV, errno.EINVAL]: + raise shutil.copy(src_path, dst_path) diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index b37be1afe6..1b3d382f01 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -743,6 +743,14 @@ class IntegrateHeroVersionModel(BaseSettingsModel): optional: bool = SettingsField(False, title="Optional") active: bool = SettingsField(True, title="Active") families: list[str] = SettingsField(default_factory=list, title="Families") + use_hardlinks: bool = SettingsField( + False, title="Use Hardlinks", + description="When enabled first try to make a hardlink of the version " + "instead of a copy. This helps reduce disk usage, but may " + "create issues.\nFor example there are known issues on " + "Windows being unable to delete any of the hardlinks if " + "any of the links is in use creating issues with updating " + "hero versions.") class CleanUpModel(BaseSettingsModel): @@ -1136,7 +1144,8 @@ DEFAULT_PUBLISH_VALUES = { "layout", "mayaScene", "simpleUnrealTexture" - ] + ], + "use_hardlinks": False }, "CleanUp": { "paterns": [], From 0ab3653f360e530402d17bc1c78fbeea4f2cd9fd Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 24 Jun 2024 10:45:33 +0200 Subject: [PATCH 04/13] Report whether it's hardlinking or copying; also report whether hardlinking failed. --- .../plugins/publish/integrate_hero_version.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/plugins/publish/integrate_hero_version.py b/client/ayon_core/plugins/publish/integrate_hero_version.py index 95b9f418f9..4fb8b886a9 100644 --- a/client/ayon_core/plugins/publish/integrate_hero_version.py +++ b/client/ayon_core/plugins/publish/integrate_hero_version.py @@ -619,12 +619,11 @@ class IntegrateHeroVersion( self.log.debug("Folder already exists: \"{}\"".format(dirname)) - self.log.debug("Copying file \"{}\" to \"{}\"".format( - src_path, dst_path - )) - if self.use_hardlinks: # First try hardlink and copy if paths are cross drive + self.log.debug("Hardlinking file \"{}\" to \"{}\"".format( + src_path, dst_path + )) try: create_hard_link(src_path, dst_path) # Return when successful @@ -639,6 +638,13 @@ class IntegrateHeroVersion( if exc.errno not in [errno.EXDEV, errno.EINVAL]: raise + self.log.debug( + "Hardlinking failed, falling back to regular copy...") + + self.log.debug("Copying file \"{}\" to \"{}\"".format( + src_path, dst_path + )) + shutil.copy(src_path, dst_path) def version_from_representations(self, project_name, repres): From b7ba0f0ee563229ab7076effeb1a5678533b581f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 26 Jun 2024 18:12:00 +0200 Subject: [PATCH 05/13] removed photoshop addon --- server_addon/photoshop/LICENSE | 202 --- server_addon/photoshop/README.md | 4 - .../client/ayon_photoshop/__init__.py | 15 - .../photoshop/client/ayon_photoshop/addon.py | 38 - .../client/ayon_photoshop/api/README.md | 257 ---- .../client/ayon_photoshop/api/__init__.py | 41 - .../client/ayon_photoshop/api/extension.zxp | Bin 55656 -> 0 bytes .../ayon_photoshop/api/extension/.debug | 9 - .../api/extension/CSXS/manifest.xml | 53 - .../api/extension/client/CSInterface.js | 1193 ----------------- .../api/extension/client/client.js | 300 ----- .../api/extension/client/loglevel.min.js | 2 - .../api/extension/client/wsrpc.js | 393 ------ .../api/extension/client/wsrpc.min.js | 1 - .../ayon_photoshop/api/extension/host/JSX.js | 774 ----------- .../api/extension/host/index.jsx | 484 ------- .../ayon_photoshop/api/extension/host/json.js | 530 -------- .../api/extension/icons/ayon_logo.png | Bin 3538 -> 0 bytes .../ayon_photoshop/api/extension/index.html | 95 -- .../client/ayon_photoshop/api/launch_logic.py | 406 ------ .../ayon_photoshop/api/launch_script.py | 93 -- .../client/ayon_photoshop/api/lib.py | 84 -- .../client/ayon_photoshop/api/panel.png | Bin 8756 -> 0 bytes .../ayon_photoshop/api/panel_failure.png | Bin 13115 -> 0 bytes .../client/ayon_photoshop/api/pipeline.py | 285 ---- .../client/ayon_photoshop/api/plugin.py | 37 - .../client/ayon_photoshop/api/webserver.py | 241 ---- .../client/ayon_photoshop/api/ws_stub.py | 571 -------- .../ayon_photoshop/hooks/pre_launch_args.py | 88 -- .../photoshop/client/ayon_photoshop/lib.py | 127 -- .../plugins/create/create_flatten_image.py | 156 --- .../plugins/create/create_image.py | 265 ---- .../plugins/create/create_review.py | 28 - .../plugins/create/create_workfile.py | 28 - .../ayon_photoshop/plugins/load/load_image.py | 86 -- .../plugins/load/load_image_from_sequence.py | 95 -- .../plugins/load/load_reference.py | 87 -- .../ayon_photoshop/plugins/publish/closePS.py | 27 - .../plugins/publish/collect_auto_image.py | 106 -- .../publish/collect_auto_image_refresh.py | 23 - .../plugins/publish/collect_auto_review.py | 96 -- .../plugins/publish/collect_auto_workfile.py | 104 -- .../plugins/publish/collect_batch_data.py | 78 -- .../publish/collect_color_coded_instances.py | 269 ---- .../plugins/publish/collect_current_file.py | 18 - .../publish/collect_extension_version.py | 57 - .../plugins/publish/collect_image.py | 20 - .../publish/collect_published_version.py | 63 - .../plugins/publish/collect_review.py | 26 - .../plugins/publish/collect_version.py | 30 - .../plugins/publish/collect_workfile.py | 30 - .../plugins/publish/extract_image.py | 102 -- .../plugins/publish/extract_review.py | 329 ----- .../plugins/publish/extract_save_scene.py | 14 - .../publish/help/validate_instance_asset.xml | 20 - .../plugins/publish/help/validate_naming.xml | 21 - .../plugins/publish/increment_workfile.py | 32 - .../publish/validate_instance_asset.py | 76 -- .../plugins/publish/validate_naming.py | 117 -- .../ayon_photoshop/resources/template.psd | Bin 159710 -> 0 bytes .../client/ayon_photoshop/version.py | 3 - server_addon/photoshop/client/pyproject.toml | 6 - server_addon/photoshop/package.py | 10 - server_addon/photoshop/server/__init__.py | 11 - .../photoshop/server/settings/__init__.py | 10 - .../server/settings/creator_plugins.py | 77 -- .../photoshop/server/settings/imageio.py | 79 -- .../photoshop/server/settings/main.py | 40 - .../server/settings/publish_plugins.py | 203 --- .../server/settings/workfile_builder.py | 31 - 70 files changed, 9196 deletions(-) delete mode 100644 server_addon/photoshop/LICENSE delete mode 100644 server_addon/photoshop/README.md delete mode 100644 server_addon/photoshop/client/ayon_photoshop/__init__.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/addon.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/README.md delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/__init__.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension.zxp delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/.debug delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/CSXS/manifest.xml delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/client/CSInterface.js delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/client/client.js delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/client/loglevel.min.js delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.js delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.min.js delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/host/JSX.js delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/host/index.jsx delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/host/json.js delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/icons/ayon_logo.png delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/extension/index.html delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/launch_script.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/lib.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/panel.png delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/panel_failure.png delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/pipeline.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/plugin.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/webserver.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/lib.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_batch_data.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_published_version.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_workfile.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_instance_asset.xml delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_naming.xml delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py delete mode 100644 server_addon/photoshop/client/ayon_photoshop/resources/template.psd delete mode 100644 server_addon/photoshop/client/ayon_photoshop/version.py delete mode 100644 server_addon/photoshop/client/pyproject.toml delete mode 100644 server_addon/photoshop/package.py delete mode 100644 server_addon/photoshop/server/__init__.py delete mode 100644 server_addon/photoshop/server/settings/__init__.py delete mode 100644 server_addon/photoshop/server/settings/creator_plugins.py delete mode 100644 server_addon/photoshop/server/settings/imageio.py delete mode 100644 server_addon/photoshop/server/settings/main.py delete mode 100644 server_addon/photoshop/server/settings/publish_plugins.py delete mode 100644 server_addon/photoshop/server/settings/workfile_builder.py diff --git a/server_addon/photoshop/LICENSE b/server_addon/photoshop/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/server_addon/photoshop/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/server_addon/photoshop/README.md b/server_addon/photoshop/README.md deleted file mode 100644 index 2d1e1c745c..0000000000 --- a/server_addon/photoshop/README.md +++ /dev/null @@ -1,4 +0,0 @@ -Photoshp Addon -=============== - -Integration with Adobe Photoshop. diff --git a/server_addon/photoshop/client/ayon_photoshop/__init__.py b/server_addon/photoshop/client/ayon_photoshop/__init__.py deleted file mode 100644 index e72c79c812..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from .version import __version__ -from .addon import ( - PHOTOSHOP_ADDON_ROOT, - PhotoshopAddon, - get_launch_script_path, -) - - -__all__ = ( - "__version__", - - "PHOTOSHOP_ADDON_ROOT", - "PhotoshopAddon", - "get_launch_script_path", -) diff --git a/server_addon/photoshop/client/ayon_photoshop/addon.py b/server_addon/photoshop/client/ayon_photoshop/addon.py deleted file mode 100644 index d0fe638f15..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/addon.py +++ /dev/null @@ -1,38 +0,0 @@ -import os -from ayon_core.addon import AYONAddon, IHostAddon - -from .version import __version__ - -PHOTOSHOP_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) - - -class PhotoshopAddon(AYONAddon, IHostAddon): - name = "photoshop" - version = __version__ - host_name = "photoshop" - - def add_implementation_envs(self, env, _app): - """Modify environments to contain all required for implementation.""" - defaults = { - "AYON_LOG_NO_COLORS": "1", - "WEBSOCKET_URL": "ws://localhost:8099/ws/" - } - for key, value in defaults.items(): - if not env.get(key): - env[key] = value - - def get_workfile_extensions(self): - return [".psd", ".psb"] - - def get_launch_hook_paths(self, app): - if app.host_name != self.host_name: - return [] - return [ - os.path.join(PHOTOSHOP_ADDON_ROOT, "hooks") - ] - - -def get_launch_script_path(): - return os.path.join( - PHOTOSHOP_ADDON_ROOT, "api", "launch_script.py" - ) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/README.md b/server_addon/photoshop/client/ayon_photoshop/api/README.md deleted file mode 100644 index ef458dea16..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/README.md +++ /dev/null @@ -1,257 +0,0 @@ -# Photoshop Integration - -## Setup - -The Photoshop integration requires two components to work; `extension` and `server`. - -### Extension - -To install the extension download [Extension Manager Command Line tool (ExManCmd)](https://github.com/Adobe-CEP/Getting-Started-guides/tree/master/Package%20Distribute%20Install#option-2---exmancmd). - -``` -ExManCmd /install {path to addon}/api/extension.zxp -``` - -### Server - -The easiest way to get the server and Photoshop launch is with: - -``` -python -c ^"import ayon_photoshop;ayon_photoshop.launch(""C:\Program Files\Adobe\Adobe Photoshop 2020\Photoshop.exe"")^" -``` - -`avalon.photoshop.launch` launches the application and server, and also closes the server when Photoshop exists. - -## Usage - -The Photoshop extension can be found under `Window > Extensions > Ayon`. Once launched you should be presented with a panel like this: - -![Ayon Panel](panel.png "AYON Panel") - - -## Developing - -### Extension -When developing the extension you can load it [unsigned](https://github.com/Adobe-CEP/CEP-Resources/blob/master/CEP_9.x/Documentation/CEP%209.0%20HTML%20Extension%20Cookbook.md#debugging-unsigned-extensions). - -When signing the extension you can use this [guide](https://github.com/Adobe-CEP/Getting-Started-guides/tree/master/Package%20Distribute%20Install#package-distribute-install-guide). - -``` -ZXPSignCmd -selfSignedCert NA NA Ayon Ayon-Photoshop Ayon extension.p12 -ZXPSignCmd -sign {path to avalon-core}\avalon\photoshop\extension {path to avalon-core}\avalon\photoshop\extension.zxp extension.p12 avalon -``` - -### Plugin Examples - -These plugins were made with the [polly config](https://github.com/mindbender-studio/config). To fully integrate and load, you will have to use this config and add `image` to the [integration plugin](https://github.com/mindbender-studio/config/blob/master/polly/plugins/publish/integrate_asset.py). - -#### Creator Plugin -```python -from avalon import photoshop - - -class CreateImage(photoshop.Creator): - """Image folder for publish.""" - - name = "imageDefault" - label = "Image" - product_type = "image" - - def __init__(self, *args, **kwargs): - super(CreateImage, self).__init__(*args, **kwargs) -``` - -#### Collector Plugin -```python -import pythoncom - -import pyblish.api - - -class CollectInstances(pyblish.api.ContextPlugin): - """Gather instances by LayerSet and file metadata - - This collector takes into account assets that are associated with - an LayerSet and marked with a unique identifier; - - Identifier: - id (str): "ayon.create.instance" - """ - - label = "Instances" - order = pyblish.api.CollectorOrder - hosts = ["photoshop"] - families_mapping = { - "image": [] - } - - def process(self, context): - # Necessary call when running in a different thread which pyblish-qml - # can be. - pythoncom.CoInitialize() - - photoshop_client = PhotoshopClientStub() - layers = photoshop_client.get_layers() - layers_meta = photoshop_client.get_layers_metadata() - for layer in layers: - layer_data = photoshop_client.read(layer, layers_meta) - - # Skip layers without metadata. - if layer_data is None: - continue - - # Skip containers. - if "container" in layer_data["id"]: - continue - - # child_layers = [*layer.Layers] - # self.log.debug("child_layers {}".format(child_layers)) - # if not child_layers: - # self.log.info("%s skipped, it was empty." % layer.Name) - # continue - - instance = context.create_instance(layer.name) - instance.append(layer) - instance.data.update(layer_data) - instance.data["families"] = self.families_mapping[ - layer_data["productType"] - ] - instance.data["publish"] = layer.visible - - # Produce diagnostic message for any graphical - # user interface interested in visualising it. - self.log.info("Found: \"%s\" " % instance.data["name"]) -``` - -#### Extractor Plugin -```python -import os - -from ayon_core.pipeline import publish -from ayon_photoshop import api as photoshop - - -class ExtractImage(publish.Extractor): - """Produce a flattened image file from instance - - This plug-in takes into account only the layers in the group. - """ - - label = "Extract Image" - hosts = ["photoshop"] - families = ["image"] - formats = ["png", "jpg"] - - def process(self, instance): - - staging_dir = self.staging_dir(instance) - self.log.info("Outputting image to {}".format(staging_dir)) - - # Perform extraction - stub = photoshop.stub() - files = {} - with photoshop.maintained_selection(): - self.log.info("Extracting %s" % str(list(instance))) - with photoshop.maintained_visibility(): - # Hide all other layers. - extract_ids = set([ll.id for ll in stub. - get_layers_in_layers([instance[0]])]) - - for layer in stub.get_layers(): - # limit unnecessary calls to client - if layer.visible and layer.id not in extract_ids: - stub.set_visible(layer.id, False) - - save_options = [] - if "png" in self.formats: - save_options.append('png') - if "jpg" in self.formats: - save_options.append('jpg') - - file_basename = os.path.splitext( - stub.get_active_document_name() - )[0] - for extension in save_options: - _filename = "{}.{}".format(file_basename, extension) - files[extension] = _filename - - full_filename = os.path.join(staging_dir, _filename) - stub.saveAs(full_filename, extension, True) - - representations = [] - for extension, filename in files.items(): - representations.append({ - "name": extension, - "ext": extension, - "files": filename, - "stagingDir": staging_dir - }) - instance.data["representations"] = representations - instance.data["stagingDir"] = staging_dir - - self.log.info(f"Extracted {instance} to {staging_dir}") -``` - -#### Loader Plugin -```python -from avalon import api, photoshop -from ayon_core.pipeline import load, get_representation_path - -stub = photoshop.stub() - - -class ImageLoader(load.LoaderPlugin): - """Load images - - Stores the imported asset in a container named after the asset. - """ - - families = ["image"] - representations = {"*"} - - def load(self, context, name=None, namespace=None, data=None): - path = self.filepath_from_context(context) - with photoshop.maintained_selection(): - layer = stub.import_smart_object(path) - - self[:] = [layer] - - return photoshop.containerise( - name, - namespace, - layer, - context, - self.__class__.__name__ - ) - - def update(self, container, context): - layer = container.pop("layer") - repre_entity = context["representation"] - with photoshop.maintained_selection(): - stub.replace_smart_object( - layer, get_representation_path(repre_entity) - ) - - stub.imprint( - layer, {"representation": repre_entity["id"]} - ) - - def remove(self, container): - container["layer"].Delete() - - def switch(self, container, context): - self.update(container, context) -``` -For easier debugging of Javascript: -https://community.adobe.com/t5/download-install/adobe-extension-debuger-problem/td-p/10911704?page=1 -Add --enable-blink-features=ShadowDOMV0,CustomElementsV0 when starting Chrome -then localhost:8078 (port set in `photoshop\extension\.debug`) - -Or use Visual Studio Code https://medium.com/adobetech/extendscript-debugger-for-visual-studio-code-public-release-a2ff6161fa01 - -Or install CEF client from https://github.com/Adobe-CEP/CEP-Resources/tree/master/CEP_9.x -## Resources - - https://github.com/lohriialo/photoshop-scripting-python - - https://www.adobe.com/devnet/photoshop/scripting.html - - https://github.com/Adobe-CEP/Getting-Started-guides - - https://github.com/Adobe-CEP/CEP-Resources diff --git a/server_addon/photoshop/client/ayon_photoshop/api/__init__.py b/server_addon/photoshop/client/ayon_photoshop/api/__init__.py deleted file mode 100644 index c5a12cba06..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/__init__.py +++ /dev/null @@ -1,41 +0,0 @@ -"""Public API - -Anything that isn't defined here is INTERNAL and unreliable for external use. - -""" - -from .launch_logic import stub - -from .pipeline import ( - PhotoshopHost, - ls, - containerise -) -from .plugin import ( - PhotoshopLoader, - get_unique_layer_name -) - - -from .lib import ( - maintained_selection, - maintained_visibility -) - -__all__ = [ - # launch_logic - "stub", - - # pipeline - "PhotoshopHost", - "ls", - "containerise", - - # Plugin - "PhotoshopLoader", - "get_unique_layer_name", - - # lib - "maintained_selection", - "maintained_visibility", -] diff --git a/server_addon/photoshop/client/ayon_photoshop/api/extension.zxp b/server_addon/photoshop/client/ayon_photoshop/api/extension.zxp deleted file mode 100644 index 26a73a37fdd2c064a8438f595e8612a7adbcb323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55656 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 - - - - - - - - diff --git a/server_addon/photoshop/client/ayon_photoshop/api/extension/CSXS/manifest.xml b/server_addon/photoshop/client/ayon_photoshop/api/extension/CSXS/manifest.xml deleted file mode 100644 index 16d85be9b4..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/extension/CSXS/manifest.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - ./index.html - - - - true - - - applicationActivate - com.adobe.csxs.events.ApplicationInitialized - - - - Panel - AYON - - - 300 - 140 - - - 400 - 200 - - - - ./icons/ayon_logo.png - - - - - - diff --git a/server_addon/photoshop/client/ayon_photoshop/api/extension/client/CSInterface.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/CSInterface.js deleted file mode 100644 index 4239391efd..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/extension/client/CSInterface.js +++ /dev/null @@ -1,1193 +0,0 @@ -/************************************************************************************************** -* -* ADOBE SYSTEMS INCORPORATED -* Copyright 2013 Adobe Systems Incorporated -* All Rights Reserved. -* -* NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the -* terms of the Adobe license agreement accompanying it. If you have received this file from a -* source other than Adobe, then your use, modification, or distribution of it requires the prior -* written permission of Adobe. -* -**************************************************************************************************/ - -/** CSInterface - v8.0.0 */ - -/** - * Stores constants for the window types supported by the CSXS infrastructure. - */ -function CSXSWindowType() -{ -} - -/** Constant for the CSXS window type Panel. */ -CSXSWindowType._PANEL = "Panel"; - -/** Constant for the CSXS window type Modeless. */ -CSXSWindowType._MODELESS = "Modeless"; - -/** Constant for the CSXS window type ModalDialog. */ -CSXSWindowType._MODAL_DIALOG = "ModalDialog"; - -/** EvalScript error message */ -EvalScript_ErrMessage = "EvalScript error."; - -/** - * @class Version - * Defines a version number with major, minor, micro, and special - * components. The major, minor and micro values are numeric; the special - * value can be any string. - * - * @param major The major version component, a positive integer up to nine digits long. - * @param minor The minor version component, a positive integer up to nine digits long. - * @param micro The micro version component, a positive integer up to nine digits long. - * @param special The special version component, an arbitrary string. - * - * @return A new \c Version object. - */ -function Version(major, minor, micro, special) -{ - this.major = major; - this.minor = minor; - this.micro = micro; - this.special = special; -} - -/** - * The maximum value allowed for a numeric version component. - * This reflects the maximum value allowed in PlugPlug and the manifest schema. - */ -Version.MAX_NUM = 999999999; - -/** - * @class VersionBound - * Defines a boundary for a version range, which associates a \c Version object - * with a flag for whether it is an inclusive or exclusive boundary. - * - * @param version The \c #Version object. - * @param inclusive True if this boundary is inclusive, false if it is exclusive. - * - * @return A new \c VersionBound object. - */ -function VersionBound(version, inclusive) -{ - this.version = version; - this.inclusive = inclusive; -} - -/** - * @class VersionRange - * Defines a range of versions using a lower boundary and optional upper boundary. - * - * @param lowerBound The \c #VersionBound object. - * @param upperBound The \c #VersionBound object, or null for a range with no upper boundary. - * - * @return A new \c VersionRange object. - */ -function VersionRange(lowerBound, upperBound) -{ - this.lowerBound = lowerBound; - this.upperBound = upperBound; -} - -/** - * @class Runtime - * Represents a runtime related to the CEP infrastructure. - * Extensions can declare dependencies on particular - * CEP runtime versions in the extension manifest. - * - * @param name The runtime name. - * @param version A \c #VersionRange object that defines a range of valid versions. - * - * @return A new \c Runtime object. - */ -function Runtime(name, versionRange) -{ - this.name = name; - this.versionRange = versionRange; -} - -/** -* @class Extension -* Encapsulates a CEP-based extension to an Adobe application. -* -* @param id The unique identifier of this extension. -* @param name The localizable display name of this extension. -* @param mainPath The path of the "index.html" file. -* @param basePath The base path of this extension. -* @param windowType The window type of the main window of this extension. - Valid values are defined by \c #CSXSWindowType. -* @param width The default width in pixels of the main window of this extension. -* @param height The default height in pixels of the main window of this extension. -* @param minWidth The minimum width in pixels of the main window of this extension. -* @param minHeight The minimum height in pixels of the main window of this extension. -* @param maxWidth The maximum width in pixels of the main window of this extension. -* @param maxHeight The maximum height in pixels of the main window of this extension. -* @param defaultExtensionDataXml The extension data contained in the default \c ExtensionDispatchInfo section of the extension manifest. -* @param specialExtensionDataXml The extension data contained in the application-specific \c ExtensionDispatchInfo section of the extension manifest. -* @param requiredRuntimeList An array of \c Runtime objects for runtimes required by this extension. -* @param isAutoVisible True if this extension is visible on loading. -* @param isPluginExtension True if this extension has been deployed in the Plugins folder of the host application. -* -* @return A new \c Extension object. -*/ -function Extension(id, name, mainPath, basePath, windowType, width, height, minWidth, minHeight, maxWidth, maxHeight, - defaultExtensionDataXml, specialExtensionDataXml, requiredRuntimeList, isAutoVisible, isPluginExtension) -{ - this.id = id; - this.name = name; - this.mainPath = mainPath; - this.basePath = basePath; - this.windowType = windowType; - this.width = width; - this.height = height; - this.minWidth = minWidth; - this.minHeight = minHeight; - this.maxWidth = maxWidth; - this.maxHeight = maxHeight; - this.defaultExtensionDataXml = defaultExtensionDataXml; - this.specialExtensionDataXml = specialExtensionDataXml; - this.requiredRuntimeList = requiredRuntimeList; - this.isAutoVisible = isAutoVisible; - this.isPluginExtension = isPluginExtension; -} - -/** - * @class CSEvent - * A standard JavaScript event, the base class for CEP events. - * - * @param type The name of the event type. - * @param scope The scope of event, can be "GLOBAL" or "APPLICATION". - * @param appId The unique identifier of the application that generated the event. - * @param extensionId The unique identifier of the extension that generated the event. - * - * @return A new \c CSEvent object - */ -function CSEvent(type, scope, appId, extensionId) -{ - this.type = type; - this.scope = scope; - this.appId = appId; - this.extensionId = extensionId; -} - -/** Event-specific data. */ -CSEvent.prototype.data = ""; - -/** - * @class SystemPath - * Stores operating-system-specific location constants for use in the - * \c #CSInterface.getSystemPath() method. - * @return A new \c SystemPath object. - */ -function SystemPath() -{ -} - -/** The path to user data. */ -SystemPath.USER_DATA = "userData"; - -/** The path to common files for Adobe applications. */ -SystemPath.COMMON_FILES = "commonFiles"; - -/** The path to the user's default document folder. */ -SystemPath.MY_DOCUMENTS = "myDocuments"; - -/** @deprecated. Use \c #SystemPath.Extension. */ -SystemPath.APPLICATION = "application"; - -/** The path to current extension. */ -SystemPath.EXTENSION = "extension"; - -/** The path to hosting application's executable. */ -SystemPath.HOST_APPLICATION = "hostApplication"; - -/** - * @class ColorType - * Stores color-type constants. - */ -function ColorType() -{ -} - -/** RGB color type. */ -ColorType.RGB = "rgb"; - -/** Gradient color type. */ -ColorType.GRADIENT = "gradient"; - -/** Null color type. */ -ColorType.NONE = "none"; - -/** - * @class RGBColor - * Stores an RGB color with red, green, blue, and alpha values. - * All values are in the range [0.0 to 255.0]. Invalid numeric values are - * converted to numbers within this range. - * - * @param red The red value, in the range [0.0 to 255.0]. - * @param green The green value, in the range [0.0 to 255.0]. - * @param blue The blue value, in the range [0.0 to 255.0]. - * @param alpha The alpha (transparency) value, in the range [0.0 to 255.0]. - * The default, 255.0, means that the color is fully opaque. - * - * @return A new RGBColor object. - */ -function RGBColor(red, green, blue, alpha) -{ - this.red = red; - this.green = green; - this.blue = blue; - this.alpha = alpha; -} - -/** - * @class Direction - * A point value in which the y component is 0 and the x component - * is positive or negative for a right or left direction, - * or the x component is 0 and the y component is positive or negative for - * an up or down direction. - * - * @param x The horizontal component of the point. - * @param y The vertical component of the point. - * - * @return A new \c Direction object. - */ -function Direction(x, y) -{ - this.x = x; - this.y = y; -} - -/** - * @class GradientStop - * Stores gradient stop information. - * - * @param offset The offset of the gradient stop, in the range [0.0 to 1.0]. - * @param rgbColor The color of the gradient at this point, an \c #RGBColor object. - * - * @return GradientStop object. - */ -function GradientStop(offset, rgbColor) -{ - this.offset = offset; - this.rgbColor = rgbColor; -} - -/** - * @class GradientColor - * Stores gradient color information. - * - * @param type The gradient type, must be "linear". - * @param direction A \c #Direction object for the direction of the gradient - (up, down, right, or left). - * @param numStops The number of stops in the gradient. - * @param gradientStopList An array of \c #GradientStop objects. - * - * @return A new \c GradientColor object. - */ -function GradientColor(type, direction, numStops, arrGradientStop) -{ - this.type = type; - this.direction = direction; - this.numStops = numStops; - this.arrGradientStop = arrGradientStop; -} - -/** - * @class UIColor - * Stores color information, including the type, anti-alias level, and specific color - * values in a color object of an appropriate type. - * - * @param type The color type, 1 for "rgb" and 2 for "gradient". - The supplied color object must correspond to this type. - * @param antialiasLevel The anti-alias level constant. - * @param color A \c #RGBColor or \c #GradientColor object containing specific color information. - * - * @return A new \c UIColor object. - */ -function UIColor(type, antialiasLevel, color) -{ - this.type = type; - this.antialiasLevel = antialiasLevel; - this.color = color; -} - -/** - * @class AppSkinInfo - * Stores window-skin properties, such as color and font. All color parameter values are \c #UIColor objects except that systemHighlightColor is \c #RGBColor object. - * - * @param baseFontFamily The base font family of the application. - * @param baseFontSize The base font size of the application. - * @param appBarBackgroundColor The application bar background color. - * @param panelBackgroundColor The background color of the extension panel. - * @param appBarBackgroundColorSRGB The application bar background color, as sRGB. - * @param panelBackgroundColorSRGB The background color of the extension panel, as sRGB. - * @param systemHighlightColor The highlight color of the extension panel, if provided by the host application. Otherwise, the operating-system highlight color. - * - * @return AppSkinInfo object. - */ -function AppSkinInfo(baseFontFamily, baseFontSize, appBarBackgroundColor, panelBackgroundColor, appBarBackgroundColorSRGB, panelBackgroundColorSRGB, systemHighlightColor) -{ - this.baseFontFamily = baseFontFamily; - this.baseFontSize = baseFontSize; - this.appBarBackgroundColor = appBarBackgroundColor; - this.panelBackgroundColor = panelBackgroundColor; - this.appBarBackgroundColorSRGB = appBarBackgroundColorSRGB; - this.panelBackgroundColorSRGB = panelBackgroundColorSRGB; - this.systemHighlightColor = systemHighlightColor; -} - -/** - * @class HostEnvironment - * Stores information about the environment in which the extension is loaded. - * - * @param appName The application's name. - * @param appVersion The application's version. - * @param appLocale The application's current license locale. - * @param appUILocale The application's current UI locale. - * @param appId The application's unique identifier. - * @param isAppOnline True if the application is currently online. - * @param appSkinInfo An \c #AppSkinInfo object containing the application's default color and font styles. - * - * @return A new \c HostEnvironment object. - */ -function HostEnvironment(appName, appVersion, appLocale, appUILocale, appId, isAppOnline, appSkinInfo) -{ - this.appName = appName; - this.appVersion = appVersion; - this.appLocale = appLocale; - this.appUILocale = appUILocale; - this.appId = appId; - this.isAppOnline = isAppOnline; - this.appSkinInfo = appSkinInfo; -} - -/** - * @class HostCapabilities - * Stores information about the host capabilities. - * - * @param EXTENDED_PANEL_MENU True if the application supports panel menu. - * @param EXTENDED_PANEL_ICONS True if the application supports panel icon. - * @param DELEGATE_APE_ENGINE True if the application supports delegated APE engine. - * @param SUPPORT_HTML_EXTENSIONS True if the application supports HTML extensions. - * @param DISABLE_FLASH_EXTENSIONS True if the application disables FLASH extensions. - * - * @return A new \c HostCapabilities object. - */ -function HostCapabilities(EXTENDED_PANEL_MENU, EXTENDED_PANEL_ICONS, DELEGATE_APE_ENGINE, SUPPORT_HTML_EXTENSIONS, DISABLE_FLASH_EXTENSIONS) -{ - this.EXTENDED_PANEL_MENU = EXTENDED_PANEL_MENU; - this.EXTENDED_PANEL_ICONS = EXTENDED_PANEL_ICONS; - this.DELEGATE_APE_ENGINE = DELEGATE_APE_ENGINE; - this.SUPPORT_HTML_EXTENSIONS = SUPPORT_HTML_EXTENSIONS; - this.DISABLE_FLASH_EXTENSIONS = DISABLE_FLASH_EXTENSIONS; // Since 5.0.0 -} - -/** - * @class ApiVersion - * Stores current api version. - * - * Since 4.2.0 - * - * @param major The major version - * @param minor The minor version. - * @param micro The micro version. - * - * @return ApiVersion object. - */ -function ApiVersion(major, minor, micro) -{ - this.major = major; - this.minor = minor; - this.micro = micro; -} - -/** - * @class MenuItemStatus - * Stores flyout menu item status - * - * Since 5.2.0 - * - * @param menuItemLabel The menu item label. - * @param enabled True if user wants to enable the menu item. - * @param checked True if user wants to check the menu item. - * - * @return MenuItemStatus object. - */ -function MenuItemStatus(menuItemLabel, enabled, checked) -{ - this.menuItemLabel = menuItemLabel; - this.enabled = enabled; - this.checked = checked; -} - -/** - * @class ContextMenuItemStatus - * Stores the status of the context menu item. - * - * Since 5.2.0 - * - * @param menuItemID The menu item id. - * @param enabled True if user wants to enable the menu item. - * @param checked True if user wants to check the menu item. - * - * @return MenuItemStatus object. - */ -function ContextMenuItemStatus(menuItemID, enabled, checked) -{ - this.menuItemID = menuItemID; - this.enabled = enabled; - this.checked = checked; -} -//------------------------------ CSInterface ---------------------------------- - -/** - * @class CSInterface - * This is the entry point to the CEP extensibility infrastructure. - * Instantiate this object and use it to: - *
    - *
  • Access information about the host application in which an extension is running
  • - *
  • Launch an extension
  • - *
  • Register interest in event notifications, and dispatch events
  • - *
- * - * @return A new \c CSInterface object - */ -function CSInterface() -{ -} - -/** - * User can add this event listener to handle native application theme color changes. - * Callback function gives extensions ability to fine-tune their theme color after the - * global theme color has been changed. - * The callback function should be like below: - * - * @example - * // event is a CSEvent object, but user can ignore it. - * function OnAppThemeColorChanged(event) - * { - * // Should get a latest HostEnvironment object from application. - * var skinInfo = JSON.parse(window.__adobe_cep__.getHostEnvironment()).appSkinInfo; - * // Gets the style information such as color info from the skinInfo, - * // and redraw all UI controls of your extension according to the style info. - * } - */ -CSInterface.THEME_COLOR_CHANGED_EVENT = "com.adobe.csxs.events.ThemeColorChanged"; - -/** The host environment data object. */ -CSInterface.prototype.hostEnvironment = window.__adobe_cep__ ? JSON.parse(window.__adobe_cep__.getHostEnvironment()) : null; - -/** Retrieves information about the host environment in which the - * extension is currently running. - * - * @return A \c #HostEnvironment object. - */ -CSInterface.prototype.getHostEnvironment = function() -{ - this.hostEnvironment = JSON.parse(window.__adobe_cep__.getHostEnvironment()); - return this.hostEnvironment; -}; - -/** Closes this extension. */ -CSInterface.prototype.closeExtension = function() -{ - window.__adobe_cep__.closeExtension(); -}; - -/** - * Retrieves a path for which a constant is defined in the system. - * - * @param pathType The path-type constant defined in \c #SystemPath , - * - * @return The platform-specific system path string. - */ -CSInterface.prototype.getSystemPath = function(pathType) -{ - var path = decodeURI(window.__adobe_cep__.getSystemPath(pathType)); - var OSVersion = this.getOSInformation(); - if (OSVersion.indexOf("Windows") >= 0) - { - path = path.replace("file:///", ""); - } - else if (OSVersion.indexOf("Mac") >= 0) - { - path = path.replace("file://", ""); - } - return path; -}; - -/** - * Evaluates a JavaScript script, which can use the JavaScript DOM - * of the host application. - * - * @param script The JavaScript script. - * @param callback Optional. A callback function that receives the result of execution. - * If execution fails, the callback function receives the error message \c EvalScript_ErrMessage. - */ -CSInterface.prototype.evalScript = function(script, callback) -{ - if(callback === null || callback === undefined) - { - callback = function(result){}; - } - window.__adobe_cep__.evalScript(script, callback); -}; - -/** - * Retrieves the unique identifier of the application. - * in which the extension is currently running. - * - * @return The unique ID string. - */ -CSInterface.prototype.getApplicationID = function() -{ - var appId = this.hostEnvironment.appId; - return appId; -}; - -/** - * Retrieves host capability information for the application - * in which the extension is currently running. - * - * @return A \c #HostCapabilities object. - */ -CSInterface.prototype.getHostCapabilities = function() -{ - var hostCapabilities = JSON.parse(window.__adobe_cep__.getHostCapabilities() ); - return hostCapabilities; -}; - -/** - * Triggers a CEP event programmatically. Yoy can use it to dispatch - * an event of a predefined type, or of a type you have defined. - * - * @param event A \c CSEvent object. - */ -CSInterface.prototype.dispatchEvent = function(event) -{ - if (typeof event.data == "object") - { - event.data = JSON.stringify(event.data); - } - - window.__adobe_cep__.dispatchEvent(event); -}; - -/** - * Registers an interest in a CEP event of a particular type, and - * assigns an event handler. - * The event infrastructure notifies your extension when events of this type occur, - * passing the event object to the registered handler function. - * - * @param type The name of the event type of interest. - * @param listener The JavaScript handler function or method. - * @param obj Optional, the object containing the handler method, if any. - * Default is null. - */ -CSInterface.prototype.addEventListener = function(type, listener, obj) -{ - window.__adobe_cep__.addEventListener(type, listener, obj); -}; - -/** - * Removes a registered event listener. - * - * @param type The name of the event type of interest. - * @param listener The JavaScript handler function or method that was registered. - * @param obj Optional, the object containing the handler method, if any. - * Default is null. - */ -CSInterface.prototype.removeEventListener = function(type, listener, obj) -{ - window.__adobe_cep__.removeEventListener(type, listener, obj); -}; - -/** - * Loads and launches another extension, or activates the extension if it is already loaded. - * - * @param extensionId The extension's unique identifier. - * @param startupParams Not currently used, pass "". - * - * @example - * To launch the extension "help" with ID "HLP" from this extension, call: - * requestOpenExtension("HLP", ""); - * - */ -CSInterface.prototype.requestOpenExtension = function(extensionId, params) -{ - window.__adobe_cep__.requestOpenExtension(extensionId, params); -}; - -/** - * Retrieves the list of extensions currently loaded in the current host application. - * The extension list is initialized once, and remains the same during the lifetime - * of the CEP session. - * - * @param extensionIds Optional, an array of unique identifiers for extensions of interest. - * If omitted, retrieves data for all extensions. - * - * @return Zero or more \c #Extension objects. - */ -CSInterface.prototype.getExtensions = function(extensionIds) -{ - var extensionIdsStr = JSON.stringify(extensionIds); - var extensionsStr = window.__adobe_cep__.getExtensions(extensionIdsStr); - - var extensions = JSON.parse(extensionsStr); - return extensions; -}; - -/** - * Retrieves network-related preferences. - * - * @return A JavaScript object containing network preferences. - */ -CSInterface.prototype.getNetworkPreferences = function() -{ - var result = window.__adobe_cep__.getNetworkPreferences(); - var networkPre = JSON.parse(result); - - return networkPre; -}; - -/** - * Initializes the resource bundle for this extension with property values - * for the current application and locale. - * To support multiple locales, you must define a property file for each locale, - * containing keyed display-string values for that locale. - * See localization documentation for Extension Builder and related products. - * - * Keys can be in the - * form key.value="localized string", for use in HTML text elements. - * For example, in this input element, the localized \c key.value string is displayed - * instead of the empty \c value string: - * - * - * - * @return An object containing the resource bundle information. - */ -CSInterface.prototype.initResourceBundle = function() -{ - var resourceBundle = JSON.parse(window.__adobe_cep__.initResourceBundle()); - var resElms = document.querySelectorAll('[data-locale]'); - for (var n = 0; n < resElms.length; n++) - { - var resEl = resElms[n]; - // Get the resource key from the element. - var resKey = resEl.getAttribute('data-locale'); - if (resKey) - { - // Get all the resources that start with the key. - for (var key in resourceBundle) - { - if (key.indexOf(resKey) === 0) - { - var resValue = resourceBundle[key]; - if (key.length == resKey.length) - { - resEl.innerHTML = resValue; - } - else if ('.' == key.charAt(resKey.length)) - { - var attrKey = key.substring(resKey.length + 1); - resEl[attrKey] = resValue; - } - } - } - } - } - return resourceBundle; -}; - -/** - * Writes installation information to a file. - * - * @return The file path. - */ -CSInterface.prototype.dumpInstallationInfo = function() -{ - return window.__adobe_cep__.dumpInstallationInfo(); -}; - -/** - * Retrieves version information for the current Operating System, - * See http://www.useragentstring.com/pages/Chrome/ for Chrome \c navigator.userAgent values. - * - * @return A string containing the OS version, or "unknown Operation System". - * If user customizes the User Agent by setting CEF command parameter "--user-agent", only - * "Mac OS X" or "Windows" will be returned. - */ -CSInterface.prototype.getOSInformation = function() -{ - var userAgent = navigator.userAgent; - - if ((navigator.platform == "Win32") || (navigator.platform == "Windows")) - { - var winVersion = "Windows"; - var winBit = ""; - if (userAgent.indexOf("Windows") > -1) - { - if (userAgent.indexOf("Windows NT 5.0") > -1) - { - winVersion = "Windows 2000"; - } - else if (userAgent.indexOf("Windows NT 5.1") > -1) - { - winVersion = "Windows XP"; - } - else if (userAgent.indexOf("Windows NT 5.2") > -1) - { - winVersion = "Windows Server 2003"; - } - else if (userAgent.indexOf("Windows NT 6.0") > -1) - { - winVersion = "Windows Vista"; - } - else if (userAgent.indexOf("Windows NT 6.1") > -1) - { - winVersion = "Windows 7"; - } - else if (userAgent.indexOf("Windows NT 6.2") > -1) - { - winVersion = "Windows 8"; - } - else if (userAgent.indexOf("Windows NT 6.3") > -1) - { - winVersion = "Windows 8.1"; - } - else if (userAgent.indexOf("Windows NT 10") > -1) - { - winVersion = "Windows 10"; - } - - if (userAgent.indexOf("WOW64") > -1 || userAgent.indexOf("Win64") > -1) - { - winBit = " 64-bit"; - } - else - { - winBit = " 32-bit"; - } - } - - return winVersion + winBit; - } - else if ((navigator.platform == "MacIntel") || (navigator.platform == "Macintosh")) - { - var result = "Mac OS X"; - - if (userAgent.indexOf("Mac OS X") > -1) - { - result = userAgent.substring(userAgent.indexOf("Mac OS X"), userAgent.indexOf(")")); - result = result.replace(/_/g, "."); - } - - return result; - } - - return "Unknown Operation System"; -}; - -/** - * Opens a page in the default system browser. - * - * Since 4.2.0 - * - * @param url The URL of the page/file to open, or the email address. - * Must use HTTP/HTTPS/file/mailto protocol. For example: - * "http://www.adobe.com" - * "https://github.com" - * "file:///C:/log.txt" - * "mailto:test@adobe.com" - * - * @return One of these error codes:\n - *
    \n - *
  • NO_ERROR - 0
  • \n - *
  • ERR_UNKNOWN - 1
  • \n - *
  • ERR_INVALID_PARAMS - 2
  • \n - *
  • ERR_INVALID_URL - 201
  • \n - *
\n - */ -CSInterface.prototype.openURLInDefaultBrowser = function(url) -{ - return cep.util.openURLInDefaultBrowser(url); -}; - -/** - * Retrieves extension ID. - * - * Since 4.2.0 - * - * @return extension ID. - */ -CSInterface.prototype.getExtensionID = function() -{ - return window.__adobe_cep__.getExtensionId(); -}; - -/** - * Retrieves the scale factor of screen. - * On Windows platform, the value of scale factor might be different from operating system's scale factor, - * since host application may use its self-defined scale factor. - * - * Since 4.2.0 - * - * @return One of the following float number. - *
    \n - *
  • -1.0 when error occurs
  • \n - *
  • 1.0 means normal screen
  • \n - *
  • >1.0 means HiDPI screen
  • \n - *
\n - */ -CSInterface.prototype.getScaleFactor = function() -{ - return window.__adobe_cep__.getScaleFactor(); -}; - -/** - * Set a handler to detect any changes of scale factor. This only works on Mac. - * - * Since 4.2.0 - * - * @param handler The function to be called when scale factor is changed. - * - */ -CSInterface.prototype.setScaleFactorChangedHandler = function(handler) -{ - window.__adobe_cep__.setScaleFactorChangedHandler(handler); -}; - -/** - * Retrieves current API version. - * - * Since 4.2.0 - * - * @return ApiVersion object. - * - */ -CSInterface.prototype.getCurrentApiVersion = function() -{ - var apiVersion = JSON.parse(window.__adobe_cep__.getCurrentApiVersion()); - return apiVersion; -}; - -/** - * Set panel flyout menu by an XML. - * - * Since 5.2.0 - * - * Register a callback function for "com.adobe.csxs.events.flyoutMenuClicked" to get notified when a - * menu item is clicked. - * The "data" attribute of event is an object which contains "menuId" and "menuName" attributes. - * - * Register callback functions for "com.adobe.csxs.events.flyoutMenuOpened" and "com.adobe.csxs.events.flyoutMenuClosed" - * respectively to get notified when flyout menu is opened or closed. - * - * @param menu A XML string which describes menu structure. - * An example menu XML: - * - * - * - * - * - * - * - * - * - * - * - * - */ -CSInterface.prototype.setPanelFlyoutMenu = function(menu) -{ - if ("string" != typeof menu) - { - return; - } - - window.__adobe_cep__.invokeSync("setPanelFlyoutMenu", menu); -}; - -/** - * Updates a menu item in the extension window's flyout menu, by setting the enabled - * and selection status. - * - * Since 5.2.0 - * - * @param menuItemLabel The menu item label. - * @param enabled True to enable the item, false to disable it (gray it out). - * @param checked True to select the item, false to deselect it. - * - * @return false when the host application does not support this functionality (HostCapabilities.EXTENDED_PANEL_MENU is false). - * Fails silently if menu label is invalid. - * - * @see HostCapabilities.EXTENDED_PANEL_MENU - */ -CSInterface.prototype.updatePanelMenuItem = function(menuItemLabel, enabled, checked) -{ - var ret = false; - if (this.getHostCapabilities().EXTENDED_PANEL_MENU) - { - var itemStatus = new MenuItemStatus(menuItemLabel, enabled, checked); - ret = window.__adobe_cep__.invokeSync("updatePanelMenuItem", JSON.stringify(itemStatus)); - } - return ret; -}; - - -/** - * Set context menu by XML string. - * - * Since 5.2.0 - * - * There are a number of conventions used to communicate what type of menu item to create and how it should be handled. - * - an item without menu ID or menu name is disabled and is not shown. - * - if the item name is "---" (three hyphens) then it is treated as a separator. The menu ID in this case will always be NULL. - * - Checkable attribute takes precedence over Checked attribute. - * - a PNG icon. For optimal display results please supply a 16 x 16px icon as larger dimensions will increase the size of the menu item. - The Chrome extension contextMenus API was taken as a reference. - https://developer.chrome.com/extensions/contextMenus - * - the items with icons and checkable items cannot coexist on the same menu level. The former take precedences over the latter. - * - * @param menu A XML string which describes menu structure. - * @param callback The callback function which is called when a menu item is clicked. The only parameter is the returned ID of clicked menu item. - * - * @description An example menu XML: - * - * - * - * - * - * - * - * - * - * - * - */ -CSInterface.prototype.setContextMenu = function(menu, callback) -{ - if ("string" != typeof menu) - { - return; - } - - window.__adobe_cep__.invokeAsync("setContextMenu", menu, callback); -}; - -/** - * Set context menu by JSON string. - * - * Since 6.0.0 - * - * There are a number of conventions used to communicate what type of menu item to create and how it should be handled. - * - an item without menu ID or menu name is disabled and is not shown. - * - if the item label is "---" (three hyphens) then it is treated as a separator. The menu ID in this case will always be NULL. - * - Checkable attribute takes precedence over Checked attribute. - * - a PNG icon. For optimal display results please supply a 16 x 16px icon as larger dimensions will increase the size of the menu item. - The Chrome extension contextMenus API was taken as a reference. - * - the items with icons and checkable items cannot coexist on the same menu level. The former take precedences over the latter. - https://developer.chrome.com/extensions/contextMenus - * - * @param menu A JSON string which describes menu structure. - * @param callback The callback function which is called when a menu item is clicked. The only parameter is the returned ID of clicked menu item. - * - * @description An example menu JSON: - * - * { - * "menu": [ - * { - * "id": "menuItemId1", - * "label": "testExample1", - * "enabled": true, - * "checkable": true, - * "checked": false, - * "icon": "./image/small_16X16.png" - * }, - * { - * "id": "menuItemId2", - * "label": "testExample2", - * "menu": [ - * { - * "id": "menuItemId2-1", - * "label": "testExample2-1", - * "menu": [ - * { - * "id": "menuItemId2-1-1", - * "label": "testExample2-1-1", - * "enabled": false, - * "checkable": true, - * "checked": true - * } - * ] - * }, - * { - * "id": "menuItemId2-2", - * "label": "testExample2-2", - * "enabled": true, - * "checkable": true, - * "checked": true - * } - * ] - * }, - * { - * "label": "---" - * }, - * { - * "id": "menuItemId3", - * "label": "testExample3", - * "enabled": false, - * "checkable": true, - * "checked": false - * } - * ] - * } - * - */ -CSInterface.prototype.setContextMenuByJSON = function(menu, callback) -{ - if ("string" != typeof menu) - { - return; - } - - window.__adobe_cep__.invokeAsync("setContextMenuByJSON", menu, callback); -}; - -/** - * Updates a context menu item by setting the enabled and selection status. - * - * Since 5.2.0 - * - * @param menuItemID The menu item ID. - * @param enabled True to enable the item, false to disable it (gray it out). - * @param checked True to select the item, false to deselect it. - */ -CSInterface.prototype.updateContextMenuItem = function(menuItemID, enabled, checked) -{ - var itemStatus = new ContextMenuItemStatus(menuItemID, enabled, checked); - ret = window.__adobe_cep__.invokeSync("updateContextMenuItem", JSON.stringify(itemStatus)); -}; - -/** - * Get the visibility status of an extension window. - * - * Since 6.0.0 - * - * @return true if the extension window is visible; false if the extension window is hidden. - */ -CSInterface.prototype.isWindowVisible = function() -{ - return window.__adobe_cep__.invokeSync("isWindowVisible", ""); -}; - -/** - * Resize extension's content to the specified dimensions. - * 1. Works with modal and modeless extensions in all Adobe products. - * 2. Extension's manifest min/max size constraints apply and take precedence. - * 3. For panel extensions - * 3.1 This works in all Adobe products except: - * * Premiere Pro - * * Prelude - * * After Effects - * 3.2 When the panel is in certain states (especially when being docked), - * it will not change to the desired dimensions even when the - * specified size satisfies min/max constraints. - * - * Since 6.0.0 - * - * @param width The new width - * @param height The new height - */ -CSInterface.prototype.resizeContent = function(width, height) -{ - window.__adobe_cep__.resizeContent(width, height); -}; - -/** - * Register the invalid certificate callback for an extension. - * This callback will be triggered when the extension tries to access the web site that contains the invalid certificate on the main frame. - * But if the extension does not call this function and tries to access the web site containing the invalid certificate, a default error page will be shown. - * - * Since 6.1.0 - * - * @param callback the callback function - */ -CSInterface.prototype.registerInvalidCertificateCallback = function(callback) -{ - return window.__adobe_cep__.registerInvalidCertificateCallback(callback); -}; - -/** - * Register an interest in some key events to prevent them from being sent to the host application. - * - * This function works with modeless extensions and panel extensions. - * Generally all the key events will be sent to the host application for these two extensions if the current focused element - * is not text input or dropdown, - * If you want to intercept some key events and want them to be handled in the extension, please call this function - * in advance to prevent them being sent to the host application. - * - * Since 6.1.0 - * - * @param keyEventsInterest A JSON string describing those key events you are interested in. A null object or - an empty string will lead to removing the interest - * - * This JSON string should be an array, each object has following keys: - * - * keyCode: [Required] represents an OS system dependent virtual key code identifying - * the unmodified value of the pressed key. - * ctrlKey: [optional] a Boolean that indicates if the control key was pressed (true) or not (false) when the event occurred. - * altKey: [optional] a Boolean that indicates if the alt key was pressed (true) or not (false) when the event occurred. - * shiftKey: [optional] a Boolean that indicates if the shift key was pressed (true) or not (false) when the event occurred. - * metaKey: [optional] (Mac Only) a Boolean that indicates if the Meta key was pressed (true) or not (false) when the event occurred. - * On Macintosh keyboards, this is the command key. To detect Windows key on Windows, please use keyCode instead. - * An example JSON string: - * - * [ - * { - * "keyCode": 48 - * }, - * { - * "keyCode": 123, - * "ctrlKey": true - * }, - * { - * "keyCode": 123, - * "ctrlKey": true, - * "metaKey": true - * } - * ] - * - */ -CSInterface.prototype.registerKeyEventsInterest = function(keyEventsInterest) -{ - return window.__adobe_cep__.registerKeyEventsInterest(keyEventsInterest); -}; - -/** - * Set the title of the extension window. - * This function works with modal and modeless extensions in all Adobe products, and panel extensions in Photoshop, InDesign, InCopy, Illustrator, Flash Pro and Dreamweaver. - * - * Since 6.1.0 - * - * @param title The window title. - */ -CSInterface.prototype.setWindowTitle = function(title) -{ - window.__adobe_cep__.invokeSync("setWindowTitle", title); -}; - -/** - * Get the title of the extension window. - * This function works with modal and modeless extensions in all Adobe products, and panel extensions in Photoshop, InDesign, InCopy, Illustrator, Flash Pro and Dreamweaver. - * - * Since 6.1.0 - * - * @return The window title. - */ -CSInterface.prototype.getWindowTitle = function() -{ - return window.__adobe_cep__.invokeSync("getWindowTitle", ""); -}; diff --git a/server_addon/photoshop/client/ayon_photoshop/api/extension/client/client.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/client.js deleted file mode 100644 index f4ba4cfe47..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/extension/client/client.js +++ /dev/null @@ -1,300 +0,0 @@ - // client facing part of extension, creates WSRPC client (jsx cannot - // do that) - // consumes RPC calls from server (OpenPype) calls ./host/index.jsx and - // returns values back (in json format) - - var logReturn = function(result){ log.warn('Result: ' + result);}; - - var csInterface = new CSInterface(); - - log.warn("script start"); - - WSRPC.DEBUG = false; - WSRPC.TRACE = false; - - function myCallBack(){ - log.warn("Triggered index.jsx"); - } - // importing through manifest.xml isn't working because relative paths - // possibly TODO - jsx.evalFile('./host/index.jsx', myCallBack); - - function runEvalScript(script) { - // because of asynchronous nature of functions in jsx - // this waits for response - return new Promise(function(resolve, reject){ - csInterface.evalScript(script, resolve); - }); - } - - /** main entry point **/ - startUp("WEBSOCKET_URL"); - - // get websocket server url from environment value - async function startUp(url){ - log.warn("url", url); - promis = runEvalScript("getEnv('" + url + "')"); - - var res = await promis; - // run rest only after resolved promise - main(res); - } - - function get_extension_version(){ - /** Returns version number from extension manifest.xml **/ - log.debug("get_extension_version") - var path = csInterface.getSystemPath(SystemPath.EXTENSION); - log.debug("extension path " + path); - - var result = window.cep.fs.readFile(path + "/CSXS/manifest.xml"); - var version = undefined; - if(result.err === 0){ - if (window.DOMParser) { - const parser = new DOMParser(); - const xmlDoc = parser.parseFromString(result.data.toString(), 'text/xml'); - const children = xmlDoc.children; - - for (let i = 0; i <= children.length; i++) { - if (children[i] && children[i].getAttribute('ExtensionBundleVersion')) { - version = children[i].getAttribute('ExtensionBundleVersion'); - } - } - } - } - return version - } - - function main(websocket_url){ - // creates connection to 'websocket_url', registers routes - log.warn("websocket_url", websocket_url); - var default_url = 'ws://localhost:8099/ws/'; - - if (websocket_url == ''){ - websocket_url = default_url; - } - log.warn("connecting to:", websocket_url); - RPC = new WSRPC(websocket_url, 5000); // spin connection - - RPC.connect(); - - log.warn("connected"); - - function EscapeStringForJSX(str){ - // Replaces: - // \ with \\ - // ' with \' - // " with \" - // See: https://stackoverflow.com/a/3967927/5285364 - return str.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/"/g, '\\"'); - } - - RPC.addRoute('Photoshop.open', function (data) { - log.warn('Server called client route "open":', data); - var escapedPath = EscapeStringForJSX(data.path); - return runEvalScript("fileOpen('" + escapedPath +"')") - .then(function(result){ - log.warn("open: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.read', function (data) { - log.warn('Server called client route "read":', data); - return runEvalScript("getHeadline()") - .then(function(result){ - log.warn("getHeadline: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.get_layers', function (data) { - log.warn('Server called client route "get_layers":', data); - return runEvalScript("getLayers()") - .then(function(result){ - log.warn("getLayers: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.set_visible', function (data) { - log.warn('Server called client route "set_visible":', data); - return runEvalScript("setVisible(" + data.layer_id + ", " + - data.visibility + ")") - .then(function(result){ - log.warn("setVisible: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.get_active_document_name', function (data) { - log.warn('Server called client route "get_active_document_name":', - data); - return runEvalScript("getActiveDocumentName()") - .then(function(result){ - log.warn("save: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.get_active_document_full_name', function (data) { - log.warn('Server called client route ' + - '"get_active_document_full_name":', data); - return runEvalScript("getActiveDocumentFullName()") - .then(function(result){ - log.warn("save: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.save', function (data) { - log.warn('Server called client route "save":', data); - - return runEvalScript("save()") - .then(function(result){ - log.warn("save: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.get_selected_layers', function (data) { - log.warn('Server called client route "get_selected_layers":', data); - - return runEvalScript("getSelectedLayers()") - .then(function(result){ - log.warn("get_selected_layers: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.create_group', function (data) { - log.warn('Server called client route "create_group":', data); - - return runEvalScript("createGroup('" + data.name + "')") - .then(function(result){ - log.warn("createGroup: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.group_selected_layers', function (data) { - log.warn('Server called client route "group_selected_layers":', - data); - - return runEvalScript("groupSelectedLayers(null, "+ - "'" + data.name +"')") - .then(function(result){ - log.warn("group_selected_layers: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.import_smart_object', function (data) { - log.warn('Server called client "import_smart_object":', data); - var escapedPath = EscapeStringForJSX(data.path); - return runEvalScript("importSmartObject('" + escapedPath +"', " + - "'"+ data.name +"',"+ - + data.as_reference +")") - .then(function(result){ - log.warn("import_smart_object: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.replace_smart_object', function (data) { - log.warn('Server called route "replace_smart_object":', data); - var escapedPath = EscapeStringForJSX(data.path); - return runEvalScript("replaceSmartObjects("+data.layer_id+"," + - "'" + escapedPath +"',"+ - "'"+ data.name +"')") - .then(function(result){ - log.warn("replaceSmartObjects: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.delete_layer', function (data) { - log.warn('Server called route "delete_layer":', data); - return runEvalScript("deleteLayer("+data.layer_id+")") - .then(function(result){ - log.warn("delete_layer: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.rename_layer', function (data) { - log.warn('Server called route "rename_layer":', data); - return runEvalScript("renameLayer("+data.layer_id+", " + - "'"+ data.name +"')") - .then(function(result){ - log.warn("rename_layer: " + result); - return result; - }); -}); - - RPC.addRoute('Photoshop.select_layers', function (data) { - log.warn('Server called client route "select_layers":', data); - - return runEvalScript("selectLayers('" + data.layers +"')") - .then(function(result){ - log.warn("select_layers: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.is_saved', function (data) { - log.warn('Server called client route "is_saved":', data); - - return runEvalScript("isSaved()") - .then(function(result){ - log.warn("is_saved: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.saveAs', function (data) { - log.warn('Server called client route "saveAsJPEG":', data); - var escapedPath = EscapeStringForJSX(data.image_path); - return runEvalScript("saveAs('" + escapedPath + "', " + - "'" + data.ext + "', " + - data.as_copy + ")") - .then(function(result){ - log.warn("save: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.imprint', function (data) { - log.warn('Server called client route "imprint":', data); - var escaped = data.payload.replace(/\n/g, "\\n"); - return runEvalScript("imprint('" + escaped + "')") - .then(function(result){ - log.warn("imprint: " + result); - return result; - }); - }); - - RPC.addRoute('Photoshop.get_extension_version', function (data) { - log.warn('Server called client route "get_extension_version":', data); - return get_extension_version(); - }); - - RPC.addRoute('Photoshop.close', function (data) { - log.warn('Server called client route "close":', data); - return runEvalScript("close()"); - }); - - RPC.call('Photoshop.ping').then(function (data) { - log.warn('Result for calling server route "ping": ', data); - return runEvalScript("ping()") - .then(function(result){ - log.warn("ping: " + result); - return result; - }); - - }, function (error) { - log.warn(error); - }); - - } - - log.warn("end script"); diff --git a/server_addon/photoshop/client/ayon_photoshop/api/extension/client/loglevel.min.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/loglevel.min.js deleted file mode 100644 index 648d7e9ff6..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/extension/client/loglevel.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! loglevel - v1.6.8 - https://github.com/pimterry/loglevel - (c) 2020 Tim Perry - licensed MIT */ -!function(a,b){"use strict";"function"==typeof define&&define.amd?define(b):"object"==typeof module&&module.exports?module.exports=b():a.log=b()}(this,function(){"use strict";function a(a,b){var c=a[b];if("function"==typeof c.bind)return c.bind(a);try{return Function.prototype.bind.call(c,a)}catch(b){return function(){return Function.prototype.apply.apply(c,[a,arguments])}}}function b(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function c(c){return"debug"===c&&(c="log"),typeof console!==i&&("trace"===c&&j?b:void 0!==console[c]?a(console,c):void 0!==console.log?a(console,"log"):h)}function d(a,b){for(var c=0;c=0&&b<=j.levels.SILENT))throw"log.setLevel() called with invalid level: "+b;if(h=b,!1!==c&&e(b),d.call(j,b,a),typeof console===i&&b 1 && arguments[1] !== undefined ? arguments[1] : 1000; - - _classCallCheck(this, WSRPC); - - var self = this; - URL = getAbsoluteWsUrl(URL); - self.id = 1; - self.eventId = 0; - self.socketStarted = false; - self.eventStore = { - onconnect: {}, - onerror: {}, - onclose: {}, - onchange: {} - }; - self.connectionNumber = 0; - self.oneTimeEventStore = { - onconnect: [], - onerror: [], - onclose: [], - onchange: [] - }; - self.callQueue = []; - - function createSocket() { - var ws = new WebSocket(URL); - - var rejectQueue = function rejectQueue() { - self.connectionNumber++; // rejects incoming calls - - var deferred; //reject all pending calls - - while (0 < self.callQueue.length) { - var callObj = self.callQueue.shift(); - deferred = self.store[callObj.id]; - delete self.store[callObj.id]; - - if (deferred && deferred.promise.isPending()) { - deferred.reject('WebSocket error occurred'); - } - } // reject all from the store - - - for (var key in self.store) { - if (!self.store.hasOwnProperty(key)) continue; - deferred = self.store[key]; - - if (deferred && deferred.promise.isPending()) { - deferred.reject('WebSocket error occurred'); - } - } - }; - - function reconnect(callEvents) { - setTimeout(function () { - try { - self.socket = createSocket(); - self.id = 1; - } catch (exc) { - callEvents('onerror', exc); - delete self.socket; - console.error(exc); - } - }, reconnectTimeout); - } - - ws.onclose = function (err) { - log('ONCLOSE CALLED', 'STATE', self.public.state()); - trace(err); - - for (var serial in self.store) { - if (!self.store.hasOwnProperty(serial)) continue; - - if (self.store[serial].hasOwnProperty('reject')) { - self.store[serial].reject('Connection closed'); - } - } - - rejectQueue(); - callEvents('onclose', err); - callEvents('onchange', err); - reconnect(callEvents); - }; - - ws.onerror = function (err) { - log('ONERROR CALLED', 'STATE', self.public.state()); - trace(err); - rejectQueue(); - callEvents('onerror', err); - callEvents('onchange', err); - log('WebSocket has been closed by error: ', err); - }; - - function tryCallEvent(func, event) { - try { - return func(event); - } catch (e) { - if (e.hasOwnProperty('stack')) { - log(e.stack); - } else { - log('Event function', func, 'raised unknown error:', e); - } - - console.error(e); - } - } - - function callEvents(evName, event) { - while (0 < self.oneTimeEventStore[evName].length) { - var deferred = self.oneTimeEventStore[evName].shift(); - if (deferred.hasOwnProperty('resolve') && deferred.promise.isPending()) deferred.resolve(); - } - - for (var i in self.eventStore[evName]) { - if (!self.eventStore[evName].hasOwnProperty(i)) continue; - var cur = self.eventStore[evName][i]; - tryCallEvent(cur, event); - } - } - - ws.onopen = function (ev) { - log('ONOPEN CALLED', 'STATE', self.public.state()); - trace(ev); - - while (0 < self.callQueue.length) { - // noinspection JSUnresolvedFunction - self.socket.send(JSON.stringify(self.callQueue.shift(), 0, 1)); - } - - callEvents('onconnect', ev); - callEvents('onchange', ev); - }; - - function handleCall(self, data) { - if (!self.routes.hasOwnProperty(data.method)) throw new Error('Route not found'); - var connectionNumber = self.connectionNumber; - var deferred = new Deferred(); - deferred.promise.then(function (result) { - if (connectionNumber !== self.connectionNumber) return; - self.socket.send(JSON.stringify({ - id: data.id, - result: result - })); - }, function (error) { - if (connectionNumber !== self.connectionNumber) return; - self.socket.send(JSON.stringify({ - id: data.id, - error: error - })); - }); - var func = self.routes[data.method]; - if (self.asyncRoutes[data.method]) return func.apply(deferred, [data.params]); - - function badPromise() { - throw new Error("You should register route with async flag."); - } - - var promiseMock = { - resolve: badPromise, - reject: badPromise - }; - - try { - deferred.resolve(func.apply(promiseMock, [data.params])); - } catch (e) { - deferred.reject(e); - console.error(e); - } - } - - function handleError(self, data) { - if (!self.store.hasOwnProperty(data.id)) return log('Unknown callback'); - var deferred = self.store[data.id]; - if (typeof deferred === 'undefined') return log('Confirmation without handler'); - delete self.store[data.id]; - log('REJECTING', data.error); - deferred.reject(data.error); - } - - function handleResult(self, data) { - var deferred = self.store[data.id]; - if (typeof deferred === 'undefined') return log('Confirmation without handler'); - delete self.store[data.id]; - - if (data.hasOwnProperty('result')) { - return deferred.resolve(data.result); - } - - return deferred.reject(data.error); - } - - ws.onmessage = function (message) { - log('ONMESSAGE CALLED', 'STATE', self.public.state()); - trace(message); - if (message.type !== 'message') return; - var data; - - try { - data = JSON.parse(message.data); - log(data); - - if (data.hasOwnProperty('method')) { - return handleCall(self, data); - } else if (data.hasOwnProperty('error') && data.error === null) { - return handleError(self, data); - } else { - return handleResult(self, data); - } - } catch (exception) { - var err = { - error: exception.message, - result: null, - id: data ? data.id : null - }; - self.socket.send(JSON.stringify(err)); - console.error(exception); - } - }; - - return ws; - } - - function makeCall(func, args, params) { - self.id += 2; - var deferred = new Deferred(); - var callObj = Object.freeze({ - id: self.id, - method: func, - params: args - }); - var state = self.public.state(); - - if (state === 'OPEN') { - self.store[self.id] = deferred; - self.socket.send(JSON.stringify(callObj)); - } else if (state === 'CONNECTING') { - log('SOCKET IS', state); - self.store[self.id] = deferred; - self.callQueue.push(callObj); - } else { - log('SOCKET IS', state); - - if (params && params['noWait']) { - deferred.reject("Socket is: ".concat(state)); - } else { - self.store[self.id] = deferred; - self.callQueue.push(callObj); - } - } - - return deferred.promise; - } - - self.asyncRoutes = {}; - self.routes = {}; - self.store = {}; - self.public = Object.freeze({ - call: function call(func, args, params) { - return makeCall(func, args, params); - }, - addRoute: function addRoute(route, callback, isAsync) { - self.asyncRoutes[route] = isAsync || false; - self.routes[route] = callback; - }, - deleteRoute: function deleteRoute(route) { - delete self.asyncRoutes[route]; - return delete self.routes[route]; - }, - addEventListener: function addEventListener(event, func) { - var eventId = self.eventId++; - self.eventStore[event][eventId] = func; - return eventId; - }, - removeEventListener: function removeEventListener(event, index) { - if (self.eventStore[event].hasOwnProperty(index)) { - delete self.eventStore[event][index]; - return true; - } else { - return false; - } - }, - onEvent: function onEvent(event) { - var deferred = new Deferred(); - self.oneTimeEventStore[event].push(deferred); - return deferred.promise; - }, - destroy: function destroy() { - return self.socket.close(); - }, - state: function state() { - return readyState[this.stateCode()]; - }, - stateCode: function stateCode() { - if (self.socketStarted && self.socket) return self.socket.readyState; - return 3; - }, - connect: function connect() { - self.socketStarted = true; - self.socket = createSocket(); - } - }); - self.public.addRoute('log', function (argsObj) { - //console.info("Websocket sent: ".concat(argsObj)); - }); - self.public.addRoute('ping', function (data) { - return data; - }); - return self.public; - }; - - WSRPC.DEBUG = false; - WSRPC.TRACE = false; - - return WSRPC; - -})); -//# sourceMappingURL=wsrpc.js.map diff --git a/server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.min.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.min.js deleted file mode 100644 index f1264b91c4..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?module.exports=factory():"function"==typeof define&&define.amd?define(factory):(global=global||self).WSRPC=factory()}(this,function(){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function Deferred(){_classCallCheck(this,Deferred);var self=this;function wrapper(func){return function(){if(!self.done)return self.done=!0,func.apply(this,arguments);console.error(new Error("Promise already done"))}}return self.resolve=null,self.reject=null,self.done=!1,self.promise=new Promise(function(resolve,reject){self.resolve=wrapper(resolve),self.reject=wrapper(reject)}),self.promise.isPending=function(){return!self.done},self}function logGroup(group,level,args){console.group(group),console[level].apply(this,args),console.groupEnd()}function log(){WSRPC.DEBUG&&logGroup("WSRPC.DEBUG","trace",arguments)}function trace(msg){if(WSRPC.TRACE){var payload=msg;"data"in msg&&(payload=JSON.parse(msg.data)),logGroup("WSRPC.TRACE","trace",[payload])}}var readyState=Object.freeze({0:"CONNECTING",1:"OPEN",2:"CLOSING",3:"CLOSED"}),WSRPC=function WSRPC(URL){var reconnectTimeout=1 // -// forceEval is now by default true // -// It wraps the scripts in a try catch and an eval providing useful error handling // -// One can set in the jsx engine $.includeStack = true to return the call stack in the event of an error // -/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////// -// JSX.js for calling jsx code from the js engine // -// 2 methods included // -// 1) jsx.evalScript AKA jsx.eval // -// 2) jsx.evalFile AKA jsx.file // -// Special features // -// 1) Allows all changes in your jsx code to be reloaded into your extension at the click of a button // -// 2) Can enable the $.fileName property to work and provides a $.__fileName() method as an alternative // -// 3) Can force a callBack result from InDesign // -// 4) No more csInterface.evalScript('alert("hello "' + title + " " + name + '");') // -// use jsx.evalScript('alert("hello __title__ __name__");', {title: title, name: name}); // -// 5) execute jsx files from your jsx folder like this jsx.evalFile('myFabJsxScript.jsx'); // -// or from a relative path jsx.evalFile('../myFabScripts/myFabJsxScript.jsx'); // -// or from an absolute url jsx.evalFile('/Path/to/my/FabJsxScript.jsx'); (mac) // -// or from an absolute url jsx.evalFile('C:Path/to/my/FabJsxScript.jsx'); (windows) // -// 6) Parameter can be entered in the from of a parameter list which can be in any order or as an object // -// 7) Not camelCase sensitive (very useful for the illiterate) // -// Dead easy to use BUT SPEND THE 3 TO 5 MINUTES IT SHOULD TAKE TO READ THE INSTRUCTIONS // -/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/* jshint undef:true, unused:true, esversion:6 */ - -////////////////////////////////////// -// jsx is the interface for the API // -////////////////////////////////////// - -var jsx; - -// Wrap everything in an anonymous function to prevent leeks -(function() { - ///////////////////////////////////////////////////////////////////// - // Substitute some CSInterface functions to avoid dependency on it // - ///////////////////////////////////////////////////////////////////// - - var __dirname = (function() { - var path, isMac; - path = decodeURI(window.__adobe_cep__.getSystemPath('extension')); - isMac = navigator.platform[0] === 'M'; // [M]ac - path = path.replace('file://' + (isMac ? '' : '/'), ''); - return path; - })(); - - var evalScript = function(script, callback) { - callback = callback || function() {}; - window.__adobe_cep__.evalScript(script, callback); - }; - - - //////////////////////////////////////////// - // In place of using the node path module // - //////////////////////////////////////////// - - // jshint undef: true, unused: true - - // A very minified version of the NodeJs Path module!! - // For use outside of NodeJs - // Majorly nicked by Trevor from Joyent - var path = (function() { - - var isString = function(arg) { - return typeof arg === 'string'; - }; - - // var isObject = function(arg) { - // return typeof arg === 'object' && arg !== null; - // }; - - var basename = function(path) { - if (!isString(path)) { - throw new TypeError('Argument to path.basename must be a string'); - } - var bits = path.split(/[\/\\]/g); - return bits[bits.length - 1]; - }; - - // jshint undef: true - // Regex to split a windows path into three parts: [*, device, slash, - // tail] windows-only - var splitDeviceRe = - /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - - // Regex to split the tail part of the above into [*, dir, basename, ext] - // var splitTailRe = - // /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; - - var win32 = {}; - // Function to split a filename into [root, dir, basename, ext] - // var win32SplitPath = function(filename) { - // // Separate device+slash from tail - // var result = splitDeviceRe.exec(filename), - // device = (result[1] || '') + (result[2] || ''), - // tail = result[3] || ''; - // // Split the tail into dir, basename and extension - // var result2 = splitTailRe.exec(tail), - // dir = result2[1], - // basename = result2[2], - // ext = result2[3]; - // return [device, dir, basename, ext]; - // }; - - var win32StatPath = function(path) { - var result = splitDeviceRe.exec(path), - device = result[1] || '', - isUnc = !!device && device[1] !== ':'; - return { - device: device, - isUnc: isUnc, - isAbsolute: isUnc || !!result[2], // UNC paths are always absolute - tail: result[3] - }; - }; - - var normalizeUNCRoot = function(device) { - return '\\\\' + device.replace(/^[\\\/]+/, '').replace(/[\\\/]+/g, '\\'); - }; - - var normalizeArray = function(parts, allowAboveRoot) { - var res = []; - for (var i = 0; i < parts.length; i++) { - var p = parts[i]; - - // ignore empty parts - if (!p || p === '.') - continue; - - if (p === '..') { - if (res.length && res[res.length - 1] !== '..') { - res.pop(); - } else if (allowAboveRoot) { - res.push('..'); - } - } else { - res.push(p); - } - } - - return res; - }; - - win32.normalize = function(path) { - var result = win32StatPath(path), - device = result.device, - isUnc = result.isUnc, - isAbsolute = result.isAbsolute, - tail = result.tail, - trailingSlash = /[\\\/]$/.test(tail); - - // Normalize the tail path - tail = normalizeArray(tail.split(/[\\\/]+/), !isAbsolute).join('\\'); - - if (!tail && !isAbsolute) { - tail = '.'; - } - if (tail && trailingSlash) { - tail += '\\'; - } - - // Convert slashes to backslashes when `device` points to an UNC root. - // Also squash multiple slashes into a single one where appropriate. - if (isUnc) { - device = normalizeUNCRoot(device); - } - - return device + (isAbsolute ? '\\' : '') + tail; - }; - win32.join = function() { - var paths = []; - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (!isString(arg)) { - throw new TypeError('Arguments to path.join must be strings'); - } - if (arg) { - paths.push(arg); - } - } - - var joined = paths.join('\\'); - - // Make sure that the joined path doesn't start with two slashes, because - // normalize() will mistake it for an UNC path then. - // - // This step is skipped when it is very clear that the user actually - // intended to point at an UNC path. This is assumed when the first - // non-empty string arguments starts with exactly two slashes followed by - // at least one more non-slash character. - // - // Note that for normalize() to treat a path as an UNC path it needs to - // have at least 2 components, so we don't filter for that here. - // This means that the user can use join to construct UNC paths from - // a server name and a share name; for example: - // path.join('//server', 'share') -> '\\\\server\\share\') - if (!/^[\\\/]{2}[^\\\/]/.test(paths[0])) { - joined = joined.replace(/^[\\\/]{2,}/, '\\'); - } - return win32.normalize(joined); - }; - - var posix = {}; - - // posix version - posix.join = function() { - var path = ''; - for (var i = 0; i < arguments.length; i++) { - var segment = arguments[i]; - if (!isString(segment)) { - throw new TypeError('Arguments to path.join must be strings'); - } - if (segment) { - if (!path) { - path += segment; - } else { - path += '/' + segment; - } - } - } - return posix.normalize(path); - }; - - // path.normalize(path) - // posix version - posix.normalize = function(path) { - var isAbsolute = path.charAt(0) === '/', - trailingSlash = path && path[path.length - 1] === '/'; - - // Normalize the path - path = normalizeArray(path.split('/'), !isAbsolute).join('/'); - - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } - - return (isAbsolute ? '/' : '') + path; - }; - - win32.basename = posix.basename = basename; - - this.win32 = win32; - this.posix = posix; - return (navigator.platform[0] === 'M') ? posix : win32; - })(); - - //////////////////////////////////////////////////////////////////////////////////////////////////////// - // The is the "main" function which is to be prototyped // - // It run a small snippet in the jsx engine that // - // 1) Assigns $.__dirname with the value of the extensions __dirname base path // - // 2) Sets up a method $.__fileName() for retrieving from within the jsx script it's $.fileName value // - // more on that method later // - // At the end of the script the global declaration jsx = new Jsx(); has been made. // - // If you like you can remove that and include in your relevant functions // - // var jsx = new Jsx(); You would never call the Jsx function without the "new" declaration // - //////////////////////////////////////////////////////////////////////////////////////////////////////// - var Jsx = function() { - var jsxScript; - // Setup jsx function to enable the jsx scripts to easily retrieve their file location - jsxScript = [ - '$.level = 0;', - 'if(!$.__fileNames){', - ' $.__fileNames = {};', - ' $.__dirname = "__dirname__";'.replace('__dirname__', __dirname), - ' $.__fileName = function(name){', - ' name = name || $.fileName;', - ' return ($.__fileNames && $.__fileNames[name]) || $.fileName;', - ' };', - '}' - ].join(''); - evalScript(jsxScript); - return this; - }; - - /** - * [evalScript] For calling jsx scripts from the js engine - * - * The jsx.evalScript method is used for calling jsx scripts directly from the js engine - * Allows for easy replacement i.e. variable insertions and for forcing eval. - * For convenience jsx.eval or jsx.script or jsx.evalscript can be used instead of calling jsx.evalScript - * - * @param {String} jsxScript - * The string that makes up the jsx script - * it can contain a simple template like syntax for replacements - * 'alert("__foo__");' - * the __foo__ will be replaced as per the replacements parameter - * - * @param {Function} callback - * The callback function you want the jsx script to trigger on completion - * The result of the jsx script is passed as the argument to that function - * The function can exist in some other file. - * Note that InDesign does not automatically pass the callBack as a string. - * Either write your InDesign in a way that it returns a sting the form of - * return 'this is my result surrounded by quotes' - * or use the force eval option - * [Optional DEFAULT no callBack] - * - * @param {Object} replacements - * The replacements to make on the jsx script - * given the following script (template) - * 'alert("__message__: " + __val__);' - * and we want to change the script to - * 'alert("I was born in the year: " + 1234);' - * we would pass the following object - * {"message": 'I was born in the year', "val": 1234} - * or if not using reserved words like do we can leave out the key quotes - * {message: 'I was born in the year', val: 1234} - * [Optional DEFAULT no replacements] - * - * @param {Bolean} forceEval - * If the script should be wrapped in an eval and try catch - * This will 1) provide useful error feedback if heaven forbid it is needed - * 2) The result will be a string which is required for callback results in InDesign - * [Optional DEFAULT true] - * - * Note 1) The order of the parameters is irrelevant - * Note 2) One can pass the arguments as an object if desired - * jsx.evalScript(myCallBackFunction, 'alert("__myMessage__");', true); - * is the same as - * jsx.evalScript({ - * script: 'alert("__myMessage__");', - * replacements: {myMessage: 'Hi there'}, - * callBack: myCallBackFunction, - * eval: true - * }); - * note that either lower or camelCase key names are valid - * i.e. both callback or callBack will work - * - * The following keys are the same jsx || script || jsxScript || jsxscript || file - * The following keys are the same callBack || callback - * The following keys are the same replacements || replace - * The following keys are the same eval || forceEval || forceeval - * The following keys are the same forceEvalScript || forceevalscript || evalScript || evalscript; - * - * @return {Boolean} if the jsxScript was executed or not - */ - - Jsx.prototype.evalScript = function() { - var arg, i, key, replaceThis, withThis, args, callback, forceEval, replacements, jsxScript, isBin; - - ////////////////////////////////////////////////////////////////////////////////////// - // sort out order which arguments into jsxScript, callback, replacements, forceEval // - ////////////////////////////////////////////////////////////////////////////////////// - - args = arguments; - - // Detect if the parameters were passed as an object and if so allow for various keys - if (args.length === 1 && (arg = args[0]) instanceof Object) { - jsxScript = arg.jsxScript || arg.jsx || arg.script || arg.file || arg.jsxscript; - callback = arg.callBack || arg.callback; - replacements = arg.replacements || arg.replace; - forceEval = arg.eval || arg.forceEval || arg.forceeval; - } else { - for (i = 0; i < 4; i++) { - arg = args[i]; - if (arg === undefined) { - continue; - } - if (arg.constructor === String) { - jsxScript = arg; - continue; - } - if (arg.constructor === Object) { - replacements = arg; - continue; - } - if (arg.constructor === Function) { - callback = arg; - continue; - } - if (arg === false) { - forceEval = false; - } - } - } - - // If no script provide then not too much to do! - if (!jsxScript) { - return false; - } - - // Have changed the forceEval default to be true as I prefer the error handling - if (forceEval !== false) { - forceEval = true; - } - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // On Illustrator and other apps the result of the jsx script is automatically passed as a string // - // if you have a "script" containing the single number 1 and nothing else then the callBack will register as "1" // - // On InDesign that same script will provide a blank callBack // - // Let's say we have a callBack function var callBack = function(result){alert(result);} // - // On Ai your see the 1 in the alert // - // On ID your just see a blank alert // - // To see the 1 in the alert you need to convert the result to a string and then it will show // - // So if we rewrite out 1 byte script to '1' i.e. surround the 1 in quotes then the call back alert will show 1 // - // If the scripts planed one can make sure that the results always passed as a string (including errors) // - // otherwise one can wrap the script in an eval and then have the result passed as a string // - // I have not gone through all the apps but can say // - // for Ai you never need to set the forceEval to true // - // for ID you if you have not coded your script appropriately and your want to send a result to the callBack then set forceEval to true // - // I changed this that even on Illustrator it applies the try catch, Note the try catch will fail if $.level is set to 1 // - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - if (forceEval) { - - isBin = (jsxScript.substring(0, 10) === '@JSXBIN@ES') ? '' : '\n'; - jsxScript = ( - // "\n''') + '';} catch(e){(function(e){var n, a=[]; for (n in e){a.push(n + ': ' + e[n])}; return a.join('\n')})(e)}"); - // "\n''') + '';} catch(e){e + (e.line ? ('\\nLine ' + (+e.line - 1)) : '')}"); - [ - "$.level = 0;", - "try{eval('''" + isBin, // need to add an extra line otherwise #targetengine doesn't work ;-] - jsxScript.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/"/g, '\\"') + "\n''') + '';", - "} catch (e) {", - " (function(e) {", - " var line, sourceLine, name, description, ErrorMessage, fileName, start, end, bug;", - " line = +e.line" + (isBin === '' ? ';' : ' - 1;'), // To take into account the extra line added - " fileName = File(e.fileName).fsName;", - " sourceLine = line && e.source.split(/[\\r\\n]/)[line];", - " name = e.name;", - " description = e.description;", - " ErrorMessage = name + ' ' + e.number + ': ' + description;", - " if (fileName.length && !(/[\\/\\\\]\\d+$/.test(fileName))) {", - " ErrorMessage += '\\nFile: ' + fileName;", - " line++;", - " }", - " if (line){", - " ErrorMessage += '\\nLine: ' + line +", - " '-> ' + ((sourceLine.length < 300) ? sourceLine : sourceLine.substring(0,300) + '...');", - " }", - " if (e.start) {ErrorMessage += '\\nBug: ' + e.source.substring(e.start - 1, e.end)}", - " if ($.includeStack) {ErrorMessage += '\\nStack:' + $.stack;}", - " return ErrorMessage;", - " })(e);", - "}" - ].join('') - ); - - } - - ///////////////////////////////////////////////////////////// - // deal with the replacements // - // Note it's probably better to use ${template} `literals` // - ///////////////////////////////////////////////////////////// - - if (replacements) { - for (key in replacements) { - if (replacements.hasOwnProperty(key)) { - replaceThis = new RegExp('__' + key + '__', 'g'); - withThis = replacements[key]; - jsxScript = jsxScript.replace(replaceThis, withThis + ''); - } - } - } - - - try { - evalScript(jsxScript, callback); - return true; - } catch (err) { - //////////////////////////////////////////////// - // Do whatever error handling you want here ! // - //////////////////////////////////////////////// - var newErr; - newErr = new Error(err); - alert('Error Eek: ' + newErr.stack); - return false; - } - - }; - - - /** - * [evalFile] For calling jsx scripts from the js engine - * - * The jsx.evalFiles method is used for executing saved jsx scripts - * where the jsxScript parameter is a string of the jsx scripts file location. - * For convenience jsx.file or jsx.evalfile can be used instead of jsx.evalFile - * - * @param {String} file - * The path to jsx script - * If only the base name is provided then the path will be presumed to be the - * To execute files stored in the jsx folder located in the __dirname folder use - * jsx.evalFile('myFabJsxScript.jsx'); - * To execute files stored in the a folder myFabScripts located in the __dirname folder use - * jsx.evalFile('./myFabScripts/myFabJsxScript.jsx'); - * To execute files stored in the a folder myFabScripts located at an absolute url use - * jsx.evalFile('/Path/to/my/FabJsxScript.jsx'); (mac) - * or jsx.evalFile('C:Path/to/my/FabJsxScript.jsx'); (windows) - * - * @param {Function} callback - * The callback function you want the jsx script to trigger on completion - * The result of the jsx script is passed as the argument to that function - * The function can exist in some other file. - * Note that InDesign does not automatically pass the callBack as a string. - * Either write your InDesign in a way that it returns a sting the form of - * return 'this is my result surrounded by quotes' - * or use the force eval option - * [Optional DEFAULT no callBack] - * - * @param {Object} replacements - * The replacements to make on the jsx script - * give the following script (template) - * 'alert("__message__: " + __val__);' - * and we want to change the script to - * 'alert("I was born in the year: " + 1234);' - * we would pass the following object - * {"message": 'I was born in the year', "val": 1234} - * or if not using reserved words like do we can leave out the key quotes - * {message: 'I was born in the year', val: 1234} - * By default when possible the forceEvalScript will be set to true - * The forceEvalScript option cannot be true when there are replacements - * To force the forceEvalScript to be false you can send a blank set of replacements - * jsx.evalFile('myFabScript.jsx', {}); Will NOT be executed using the $.evalScript method - * jsx.evalFile('myFabScript.jsx'); Will YES be executed using the $.evalScript method - * see the forceEvalScript parameter for details on this - * [Optional DEFAULT no replacements] - * - * @param {Bolean} forceEval - * If the script should be wrapped in an eval and try catch - * This will 1) provide useful error feedback if heaven forbid it is needed - * 2) The result will be a string which is required for callback results in InDesign - * [Optional DEFAULT true] - * - * If no replacements are needed then the jsx script is be executed by using the $.evalFile method - * This exposes the true value of the $.fileName property - * In such a case it's best to avoid using the $.__fileName() with no base name as it won't work - * BUT one can still use the $.__fileName('baseName') method which is more accurate than the standard $.fileName property - * Let's say you have a Drive called "Graphics" AND YOU HAVE a root folder on your "main" drive called "Graphics" - * You call a script jsx.evalFile('/Volumes/Graphics/myFabScript.jsx'); - * $.fileName will give you '/Graphics/myFabScript.jsx' which is wrong - * $.__fileName('myFabScript.jsx') will give you '/Volumes/Graphics/myFabScript.jsx' which is correct - * $.__fileName() will not give you a reliable result - * Note that if your calling multiple versions of myFabScript.jsx stored in multiple folders then you can get stuffed! - * i.e. if the fileName is important to you then don't do that. - * It also will force the result of the jsx file as a string which is particularly useful for InDesign callBacks - * - * Note 1) The order of the parameters is irrelevant - * Note 2) One can pass the arguments as an object if desired - * jsx.evalScript(myCallBackFunction, 'alert("__myMessage__");', true); - * is the same as - * jsx.evalScript({ - * script: 'alert("__myMessage__");', - * replacements: {myMessage: 'Hi there'}, - * callBack: myCallBackFunction, - * eval: false, - * }); - * note that either lower or camelCase key names or valid - * i.e. both callback or callBack will work - * - * The following keys are the same file || jsx || script || jsxScript || jsxscript - * The following keys are the same callBack || callback - * The following keys are the same replacements || replace - * The following keys are the same eval || forceEval || forceeval - * - * @return {Boolean} if the jsxScript was executed or not - */ - - Jsx.prototype.evalFile = function() { - var arg, args, callback, fileName, fileNameScript, forceEval, forceEvalScript, - i, jsxFolder, jsxScript, newLine, replacements, success; - - success = true; // optimistic - args = arguments; - - jsxFolder = path.join(__dirname, 'jsx'); - ////////////////////////////////////////////////////////////////////////////////////////////////////////// - // $.fileName does not return it's correct path in the jsx engine for files called from the js engine // - // In Illustrator it returns an integer in InDesign it returns an empty string // - // This script injection allows for the script to know it's path by calling // - // $.__fileName(); // - // on Illustrator this works pretty well // - // on InDesign it's best to use with a bit of care // - // If the a second script has been called the InDesing will "forget" the path to the first script // - // 2 work-arounds for this // - // 1) at the beginning of your script add var thePathToMeIs = $.fileName(); // - // thePathToMeIs will not be forgotten after running the second script // - // 2) $.__fileName('myBaseName.jsx'); // - // for example you have file with the following path // - // /path/to/me.jsx // - // Call $.__fileName('me.jsx') and you will get /path/to/me.jsx even after executing a second script // - // Note When the forceEvalScript option is used then you just use the regular $.fileName property // - ////////////////////////////////////////////////////////////////////////////////////////////////////////// - fileNameScript = [ - // The if statement should not normally be executed - 'if(!$.__fileNames){', - ' $.__fileNames = {};', - ' $.__dirname = "__dirname__";'.replace('__dirname__', __dirname), - ' $.__fileName = function(name){', - ' name = name || $.fileName;', - ' return ($.__fileNames && $.__fileNames[name]) || $.fileName;', - ' };', - '}', - '$.__fileNames["__basename__"] = $.__fileNames["" + $.fileName] = "__fileName__";' - ].join(''); - - ////////////////////////////////////////////////////////////////////////////////////// - // sort out order which arguments into jsxScript, callback, replacements, forceEval // - ////////////////////////////////////////////////////////////////////////////////////// - - - // Detect if the parameters were passed as an object and if so allow for various keys - if (args.length === 1 && (arg = args[0]) instanceof Object) { - jsxScript = arg.jsxScript || arg.jsx || arg.script || arg.file || arg.jsxscript; - callback = arg.callBack || arg.callback; - replacements = arg.replacements || arg.replace; - forceEval = arg.eval || arg.forceEval || arg.forceeval; - } else { - for (i = 0; i < 5; i++) { - arg = args[i]; - if (arg === undefined) { - continue; - } - if (arg.constructor.name === 'String') { - jsxScript = arg; - continue; - } - if (arg.constructor.name === 'Object') { - ////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // If no replacements are provided then the $.evalScript method will be used // - // This will allow directly for the $.fileName property to be used // - // If one does not want the $.evalScript method to be used then // - // either send a blank object as the replacements {} // - // or explicitly set the forceEvalScript option to false // - // This can only be done if the parameters are passed as an object // - // i.e. jsx.evalFile({file:'myFabScript.jsx', forceEvalScript: false}); // - // if the file was called using // - // i.e. jsx.evalFile('myFabScript.jsx'); // - // then the following jsx code is called $.evalFile(new File('Path/to/myFabScript.jsx', 10000000000)) + ''; // - // forceEval is never needed if the forceEvalScript is triggered // - ////////////////////////////////////////////////////////////////////////////////////////////////////////////// - replacements = arg; - continue; - } - if (arg.constructor === Function) { - callback = arg; - continue; - } - if (arg === false) { - forceEval = false; - } - } - } - - // If no script provide then not too much to do! - if (!jsxScript) { - return false; - } - - forceEvalScript = !replacements; - - - ////////////////////////////////////////////////////// - // Get path of script // - // Check if it's literal, relative or in jsx folder // - ////////////////////////////////////////////////////// - - if (/^\/|[a-zA-Z]+:/.test(jsxScript)) { // absolute path Mac | Windows - jsxScript = path.normalize(jsxScript); - } else if (/^\.+\//.test(jsxScript)) { - jsxScript = path.join(__dirname, jsxScript); // relative path - } else { - jsxScript = path.join(jsxFolder, jsxScript); // files in the jsxFolder - } - - if (forceEvalScript) { - jsxScript = jsxScript.replace(/"/g, '\\"'); - // Check that the path exist, should change this to asynchronous at some point - if (!window.cep.fs.stat(jsxScript).err) { - jsxScript = fileNameScript.replace(/__fileName__/, jsxScript).replace(/__basename__/, path.basename(jsxScript)) + - '$.evalFile(new File("' + jsxScript.replace(/\\/g, '\\\\') + '")) + "";'; - return this.evalScript(jsxScript, callback, forceEval); - } else { - throw new Error(`The file: {jsxScript} could not be found / read`); - } - } - - //////////////////////////////////////////////////////////////////////////////////////////////// - // Replacements made so we can't use $.evalFile and need to read the jsx script for ourselves // - //////////////////////////////////////////////////////////////////////////////////////////////// - - fileName = jsxScript.replace(/\\/g, '\\\\').replace(/"/g, '\\"'); - try { - jsxScript = window.cep.fs.readFile(jsxScript).data; - } catch (er) { - throw new Error(`The file: ${fileName} could not be read`); - } - // It is desirable that the injected fileNameScript is on the same line as the 1st line of the script - // This is so that the $.line or error.line returns the same value as the actual file - // However if the 1st line contains a # directive then we need to insert a new line and stuff the above problem - // When possible i.e. when there's no replacements then $.evalFile will be used and then the whole issue is avoided - newLine = /^\s*#/.test(jsxScript) ? '\n' : ''; - jsxScript = fileNameScript.replace(/__fileName__/, fileName).replace(/__basename__/, path.basename(fileName)) + newLine + jsxScript; - - try { - // evalScript(jsxScript, callback); - return this.evalScript(jsxScript, callback, replacements, forceEval); - } catch (err) { - //////////////////////////////////////////////// - // Do whatever error handling you want here ! // - //////////////////////////////////////////////// - var newErr; - newErr = new Error(err); - alert('Error Eek: ' + newErr.stack); - return false; - } - - return success; // success should be an array but for now it's a Boolean - }; - - - //////////////////////////////////// - // Setup alternative method names // - //////////////////////////////////// - Jsx.prototype.eval = Jsx.prototype.script = Jsx.prototype.evalscript = Jsx.prototype.evalScript; - Jsx.prototype.file = Jsx.prototype.evalfile = Jsx.prototype.evalFile; - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Examples // - // jsx.evalScript('alert("foo");'); // - // jsx.evalFile('foo.jsx'); // where foo.jsx is stored in the jsx folder at the base of the extensions directory // - // jsx.evalFile('../myFolder/foo.jsx'); // where a relative or absolute file path is given // - // // - // using conventional methods one would use in the case were the values to swap were supplied by variables // - // csInterface.evalScript('var q = "' + name + '"; alert("' + myString + '" ' + myOp + ' q);q;', callback); // - // Using all the '' + foo + '' is very error prone // - // jsx.evalScript('var q = "__name__"; alert(__string__ __opp__ q);q;',{'name':'Fred', 'string':'Hello ', 'opp':'+'}, callBack); // - // is much simpler and less error prone // - // // - // more readable to use object // - // jsx.evalFile({ // - // file: 'yetAnotherFabScript.jsx', // - // replacements: {"this": foo, That: bar, and: "&&", the: foo2, other: bar2}, // - // eval: true // - // }) // - // Enjoy // - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - jsx = new Jsx(); -})(); diff --git a/server_addon/photoshop/client/ayon_photoshop/api/extension/host/index.jsx b/server_addon/photoshop/client/ayon_photoshop/api/extension/host/index.jsx deleted file mode 100644 index b697ee65ab..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/extension/host/index.jsx +++ /dev/null @@ -1,484 +0,0 @@ -#include "json.js"; -#target photoshop - -var LogFactory=function(file,write,store,level,defaultStatus,continuing){if(file&&(file.constructor===String||file.constructor===File)){file={file:file};}else if(!file)file={file:{}};write=(file.write!==undefined)?file.write:write;if(write===undefined){write=true;}store=(file.store!==undefined)?file.store||false:store||false;level=(file.level!==undefined)?file.level:level;defaultStatus=(file.defaultStatus!==undefined)?file.defaultStatus:defaultStatus;if(defaultStatus===undefined){defaultStatus='LOG';}continuing=(file.continuing!==undefined)?file.continuing:continuing||false;file=file.file||{};var stack,times,logTime,logPoint,icons,statuses,LOG_LEVEL,LOG_STATUS;stack=[];times=[];logTime=new Date();logPoint='Log Factory Start';icons={"1":"\ud83d\udd50","130":"\ud83d\udd5c","2":"\ud83d\udd51","230":"\ud83d\udd5d","3":"\ud83d\udd52","330":"\ud83d\udd5e","4":"\ud83d\udd53","430":"\ud83d\udd5f","5":"\ud83d\udd54","530":"\ud83d\udd60","6":"\ud83d\udd55","630":"\ud83d\udd61","7":"\ud83d\udd56","730":"\ud83d\udd62","8":"\ud83d\udd57","830":"\ud83d\udd63","9":"\ud83d\udd58","930":"\ud83d\udd64","10":"\ud83d\udd59","1030":"\ud83d\udd65","11":"\ud83d\udd5a","1130":"\ud83d\udd66","12":"\ud83d\udd5b","1230":"\ud83d\udd67","AIRPLANE":"\ud83d\udee9","ALARM":"\u23f0","AMBULANCE":"\ud83d\ude91","ANCHOR":"\u2693","ANGRY":"\ud83d\ude20","ANGUISHED":"\ud83d\ude27","ANT":"\ud83d\udc1c","ANTENNA":"\ud83d\udce1","APPLE":"\ud83c\udf4f","APPLE2":"\ud83c\udf4e","ATM":"\ud83c\udfe7","ATOM":"\u269b","BABYBOTTLE":"\ud83c\udf7c","BAD:":"\ud83d\udc4e","BANANA":"\ud83c\udf4c","BANDAGE":"\ud83e\udd15","BANK":"\ud83c\udfe6","BATTERY":"\ud83d\udd0b","BED":"\ud83d\udecf","BEE":"\ud83d\udc1d","BEER":"\ud83c\udf7a","BELL":"\ud83d\udd14","BELLOFF":"\ud83d\udd15","BIRD":"\ud83d\udc26","BLACKFLAG":"\ud83c\udff4","BLUSH":"\ud83d\ude0a","BOMB":"\ud83d\udca3","BOOK":"\ud83d\udcd5","BOOKMARK":"\ud83d\udd16","BOOKS":"\ud83d\udcda","BOW":"\ud83c\udff9","BOWLING":"\ud83c\udfb3","BRIEFCASE":"\ud83d\udcbc","BROKEN":"\ud83d\udc94","BUG":"\ud83d\udc1b","BUILDING":"\ud83c\udfdb","BUILDINGS":"\ud83c\udfd8","BULB":"\ud83d\udca1","BUS":"\ud83d\ude8c","CACTUS":"\ud83c\udf35","CALENDAR":"\ud83d\udcc5","CAMEL":"\ud83d\udc2a","CAMERA":"\ud83d\udcf7","CANDLE":"\ud83d\udd6f","CAR":"\ud83d\ude98","CAROUSEL":"\ud83c\udfa0","CASTLE":"\ud83c\udff0","CATEYES":"\ud83d\ude3b","CATJOY":"\ud83d\ude39","CATMOUTH":"\ud83d\ude3a","CATSMILE":"\ud83d\ude3c","CD":"\ud83d\udcbf","CHECK":"\u2714","CHEQFLAG":"\ud83c\udfc1","CHICK":"\ud83d\udc25","CHICKEN":"\ud83d\udc14","CHICKHEAD":"\ud83d\udc24","CIRCLEBLACK":"\u26ab","CIRCLEBLUE":"\ud83d\udd35","CIRCLERED":"\ud83d\udd34","CIRCLEWHITE":"\u26aa","CIRCUS":"\ud83c\udfaa","CLAPPER":"\ud83c\udfac","CLAPPING":"\ud83d\udc4f","CLIP":"\ud83d\udcce","CLIPBOARD":"\ud83d\udccb","CLOUD":"\ud83c\udf28","CLOVER":"\ud83c\udf40","CLOWN":"\ud83e\udd21","COLDSWEAT":"\ud83d\ude13","COLDSWEAT2":"\ud83d\ude30","COMPRESS":"\ud83d\udddc","CONFOUNDED":"\ud83d\ude16","CONFUSED":"\ud83d\ude15","CONSTRUCTION":"\ud83d\udea7","CONTROL":"\ud83c\udf9b","COOKIE":"\ud83c\udf6a","COOKING":"\ud83c\udf73","COOL":"\ud83d\ude0e","COOLBOX":"\ud83c\udd92","COPYRIGHT":"\u00a9","CRANE":"\ud83c\udfd7","CRAYON":"\ud83d\udd8d","CREDITCARD":"\ud83d\udcb3","CROSS":"\u2716","CROSSBOX:":"\u274e","CRY":"\ud83d\ude22","CRYCAT":"\ud83d\ude3f","CRYSTALBALL":"\ud83d\udd2e","CUSTOMS":"\ud83d\udec3","DELICIOUS":"\ud83d\ude0b","DERELICT":"\ud83c\udfda","DESKTOP":"\ud83d\udda5","DIAMONDLB":"\ud83d\udd37","DIAMONDLO":"\ud83d\udd36","DIAMONDSB":"\ud83d\udd39","DIAMONDSO":"\ud83d\udd38","DICE":"\ud83c\udfb2","DISAPPOINTED":"\ud83d\ude1e","CRY2":"\ud83d\ude25","DIVISION":"\u2797","DIZZY":"\ud83d\ude35","DOLLAR":"\ud83d\udcb5","DOLLAR2":"\ud83d\udcb2","DOWNARROW":"\u2b07","DVD":"\ud83d\udcc0","EJECT":"\u23cf","ELEPHANT":"\ud83d\udc18","EMAIL":"\ud83d\udce7","ENVELOPE":"\ud83d\udce8","ENVELOPE2":"\u2709","ENVELOPE_DOWN":"\ud83d\udce9","EURO":"\ud83d\udcb6","EVIL":"\ud83d\ude08","EXPRESSIONLESS":"\ud83d\ude11","EYES":"\ud83d\udc40","FACTORY":"\ud83c\udfed","FAX":"\ud83d\udce0","FEARFUL":"\ud83d\ude28","FILEBOX":"\ud83d\uddc3","FILECABINET":"\ud83d\uddc4","FIRE":"\ud83d\udd25","FIREENGINE":"\ud83d\ude92","FIST":"\ud83d\udc4a","FLOWER":"\ud83c\udf37","FLOWER2":"\ud83c\udf38","FLUSHED":"\ud83d\ude33","FOLDER":"\ud83d\udcc1","FOLDER2":"\ud83d\udcc2","FREE":"\ud83c\udd93","FROG":"\ud83d\udc38","FROWN":"\ud83d\ude41","GEAR":"\u2699","GLOBE":"\ud83c\udf0d","GLOWINGSTAR":"\ud83c\udf1f","GOOD:":"\ud83d\udc4d","GRIMACING":"\ud83d\ude2c","GRIN":"\ud83d\ude00","GRINNINGCAT":"\ud83d\ude38","HALO":"\ud83d\ude07","HAMMER":"\ud83d\udd28","HAMSTER":"\ud83d\udc39","HAND":"\u270b","HANDDOWN":"\ud83d\udc47","HANDLEFT":"\ud83d\udc48","HANDRIGHT":"\ud83d\udc49","HANDUP":"\ud83d\udc46","HATCHING":"\ud83d\udc23","HAZARD":"\u2623","HEADPHONE":"\ud83c\udfa7","HEARNOEVIL":"\ud83d\ude49","HEARTBLUE":"\ud83d\udc99","HEARTEYES":"\ud83d\ude0d","HEARTGREEN":"\ud83d\udc9a","HEARTYELLOW":"\ud83d\udc9b","HELICOPTER":"\ud83d\ude81","HERB":"\ud83c\udf3f","HIGH_BRIGHTNESS":"\ud83d\udd06","HIGHVOLTAGE":"\u26a1","HIT":"\ud83c\udfaf","HONEY":"\ud83c\udf6f","HOT":"\ud83c\udf36","HOURGLASS":"\u23f3","HOUSE":"\ud83c\udfe0","HUGGINGFACE":"\ud83e\udd17","HUNDRED":"\ud83d\udcaf","HUSHED":"\ud83d\ude2f","ID":"\ud83c\udd94","INBOX":"\ud83d\udce5","INDEX":"\ud83d\uddc2","JOY":"\ud83d\ude02","KEY":"\ud83d\udd11","KISS":"\ud83d\ude18","KISS2":"\ud83d\ude17","KISS3":"\ud83d\ude19","KISS4":"\ud83d\ude1a","KISSINGCAT":"\ud83d\ude3d","KNIFE":"\ud83d\udd2a","LABEL":"\ud83c\udff7","LADYBIRD":"\ud83d\udc1e","LANDING":"\ud83d\udeec","LAPTOP":"\ud83d\udcbb","LEFTARROW":"\u2b05","LEMON":"\ud83c\udf4b","LIGHTNINGCLOUD":"\ud83c\udf29","LINK":"\ud83d\udd17","LITTER":"\ud83d\udeae","LOCK":"\ud83d\udd12","LOLLIPOP":"\ud83c\udf6d","LOUDSPEAKER":"\ud83d\udce2","LOW_BRIGHTNESS":"\ud83d\udd05","MAD":"\ud83d\ude1c","MAGNIFYING_GLASS":"\ud83d\udd0d","MASK":"\ud83d\ude37","MEDAL":"\ud83c\udf96","MEMO":"\ud83d\udcdd","MIC":"\ud83c\udfa4","MICROSCOPE":"\ud83d\udd2c","MINUS":"\u2796","MOBILE":"\ud83d\udcf1","MONEY":"\ud83d\udcb0","MONEYMOUTH":"\ud83e\udd11","MONKEY":"\ud83d\udc35","MOUSE":"\ud83d\udc2d","MOUSE2":"\ud83d\udc01","MOUTHLESS":"\ud83d\ude36","MOVIE":"\ud83c\udfa5","MUGS":"\ud83c\udf7b","NERD":"\ud83e\udd13","NEUTRAL":"\ud83d\ude10","NEW":"\ud83c\udd95","NOENTRY":"\ud83d\udeab","NOTEBOOK":"\ud83d\udcd4","NOTEPAD":"\ud83d\uddd2","NUTANDBOLT":"\ud83d\udd29","O":"\u2b55","OFFICE":"\ud83c\udfe2","OK":"\ud83c\udd97","OKHAND":"\ud83d\udc4c","OLDKEY":"\ud83d\udddd","OPENLOCK":"\ud83d\udd13","OPENMOUTH":"\ud83d\ude2e","OUTBOX":"\ud83d\udce4","PACKAGE":"\ud83d\udce6","PAGE":"\ud83d\udcc4","PAINTBRUSH":"\ud83d\udd8c","PALETTE":"\ud83c\udfa8","PANDA":"\ud83d\udc3c","PASSPORT":"\ud83d\udec2","PAWS":"\ud83d\udc3e","PEN":"\ud83d\udd8a","PEN2":"\ud83d\udd8b","PENSIVE":"\ud83d\ude14","PERFORMING":"\ud83c\udfad","PHONE":"\ud83d\udcde","PILL":"\ud83d\udc8a","PING":"\u2757","PLATE":"\ud83c\udf7d","PLUG":"\ud83d\udd0c","PLUS":"\u2795","POLICE":"\ud83d\ude93","POLICELIGHT":"\ud83d\udea8","POSTOFFICE":"\ud83c\udfe4","POUND":"\ud83d\udcb7","POUTING":"\ud83d\ude21","POUTINGCAT":"\ud83d\ude3e","PRESENT":"\ud83c\udf81","PRINTER":"\ud83d\udda8","PROJECTOR":"\ud83d\udcfd","PUSHPIN":"\ud83d\udccc","QUESTION":"\u2753","RABBIT":"\ud83d\udc30","RADIOACTIVE":"\u2622","RADIOBUTTON":"\ud83d\udd18","RAINCLOUD":"\ud83c\udf27","RAT":"\ud83d\udc00","RECYCLE":"\u267b","REGISTERED":"\u00ae","RELIEVED":"\ud83d\ude0c","ROBOT":"\ud83e\udd16","ROCKET":"\ud83d\ude80","ROLLING":"\ud83d\ude44","ROOSTER":"\ud83d\udc13","RULER":"\ud83d\udccf","SATELLITE":"\ud83d\udef0","SAVE":"\ud83d\udcbe","SCHOOL":"\ud83c\udfeb","SCISSORS":"\u2702","SCREAMING":"\ud83d\ude31","SCROLL":"\ud83d\udcdc","SEAT":"\ud83d\udcba","SEEDLING":"\ud83c\udf31","SEENOEVIL":"\ud83d\ude48","SHIELD":"\ud83d\udee1","SHIP":"\ud83d\udea2","SHOCKED":"\ud83d\ude32","SHOWER":"\ud83d\udebf","SLEEPING":"\ud83d\ude34","SLEEPY":"\ud83d\ude2a","SLIDER":"\ud83c\udf9a","SLOT":"\ud83c\udfb0","SMILE":"\ud83d\ude42","SMILING":"\ud83d\ude03","SMILINGCLOSEDEYES":"\ud83d\ude06","SMILINGEYES":"\ud83d\ude04","SMILINGSWEAT":"\ud83d\ude05","SMIRK":"\ud83d\ude0f","SNAIL":"\ud83d\udc0c","SNAKE":"\ud83d\udc0d","SOCCER":"\u26bd","SOS":"\ud83c\udd98","SPEAKER":"\ud83d\udd08","SPEAKEROFF":"\ud83d\udd07","SPEAKNOEVIL":"\ud83d\ude4a","SPIDER":"\ud83d\udd77","SPIDERWEB":"\ud83d\udd78","STAR":"\u2b50","STOP":"\u26d4","STOPWATCH":"\u23f1","SULK":"\ud83d\ude26","SUNFLOWER":"\ud83c\udf3b","SUNGLASSES":"\ud83d\udd76","SYRINGE":"\ud83d\udc89","TAKEOFF":"\ud83d\udeeb","TAXI":"\ud83d\ude95","TELESCOPE":"\ud83d\udd2d","TEMPORATURE":"\ud83e\udd12","TENNIS":"\ud83c\udfbe","THERMOMETER":"\ud83c\udf21","THINKING":"\ud83e\udd14","THUNDERCLOUD":"\u26c8","TICKBOX":"\u2705","TICKET":"\ud83c\udf9f","TIRED":"\ud83d\ude2b","TOILET":"\ud83d\udebd","TOMATO":"\ud83c\udf45","TONGUE":"\ud83d\ude1b","TOOLS":"\ud83d\udee0","TORCH":"\ud83d\udd26","TORNADO":"\ud83c\udf2a","TOUNG2":"\ud83d\ude1d","TRADEMARK":"\u2122","TRAFFICLIGHT":"\ud83d\udea6","TRASH":"\ud83d\uddd1","TREE":"\ud83c\udf32","TRIANGLE_LEFT":"\u25c0","TRIANGLE_RIGHT":"\u25b6","TRIANGLEDOWN":"\ud83d\udd3b","TRIANGLEUP":"\ud83d\udd3a","TRIANGULARFLAG":"\ud83d\udea9","TROPHY":"\ud83c\udfc6","TRUCK":"\ud83d\ude9a","TRUMPET":"\ud83c\udfba","TURKEY":"\ud83e\udd83","TURTLE":"\ud83d\udc22","UMBRELLA":"\u26f1","UNAMUSED":"\ud83d\ude12","UPARROW":"\u2b06","UPSIDEDOWN":"\ud83d\ude43","WARNING":"\u26a0","WATCH":"\u231a","WAVING":"\ud83d\udc4b","WEARY":"\ud83d\ude29","WEARYCAT":"\ud83d\ude40","WHITEFLAG":"\ud83c\udff3","WINEGLASS":"\ud83c\udf77","WINK":"\ud83d\ude09","WORRIED":"\ud83d\ude1f","WRENCH":"\ud83d\udd27","X":"\u274c","YEN":"\ud83d\udcb4","ZIPPERFACE":"\ud83e\udd10","UNDEFINED":"","":""};statuses={F:'FATAL',B:'BUG',C:'CRITICAL',E:'ERROR',W:'WARNING',I:'INFO',IM:'IMPORTANT',D:'DEBUG',L:'LOG',CO:'CONSTANT',FU:'FUNCTION',R:'RETURN',V:'VARIABLE',S:'STACK',RE:'RESULT',ST:'STOPPER',TI:'TIMER',T:'TRACE'};LOG_LEVEL={NONE:7,OFF:7,FATAL:6,ERROR:5,WARN:4,INFO:3,UNDEFINED:2,'':2,DEFAULT:2,DEBUG:2,TRACE:1,ON:0,ALL:0,};LOG_STATUS={OFF:LOG_LEVEL.OFF,NONE:LOG_LEVEL.OFF,NO:LOG_LEVEL.OFF,NOPE:LOG_LEVEL.OFF,FALSE:LOG_LEVEL.OFF,FATAL:LOG_LEVEL.FATAL,BUG:LOG_LEVEL.ERROR,CRITICAL:LOG_LEVEL.ERROR,ERROR:LOG_LEVEL.ERROR,WARNING:LOG_LEVEL.WARN,INFO:LOG_LEVEL.INFO,IMPORTANT:LOG_LEVEL.INFO,DEBUG:LOG_LEVEL.DEBUG,LOG:LOG_LEVEL.DEBUG,STACK:LOG_LEVEL.DEBUG,CONSTANT:LOG_LEVEL.DEBUG,FUNCTION:LOG_LEVEL.DEBUG,VARIABLE:LOG_LEVEL.DEBUG,RETURN:LOG_LEVEL.DEBUG,RESULT:LOG_LEVEL.TRACE,STOPPER:LOG_LEVEL.TRACE,TIMER:LOG_LEVEL.TRACE,TRACE:LOG_LEVEL.TRACE,ALL:LOG_LEVEL.ALL,YES:LOG_LEVEL.ALL,YEP:LOG_LEVEL.ALL,TRUE:LOG_LEVEL.ALL};var logFile,logFolder;var LOG=function(message,status,icon){if(LOG.level!==LOG_LEVEL.OFF&&(LOG.write||LOG.store)&&LOG.arguments.length)return LOG.addMessage(message,status,icon);};LOG.logDecodeLevel=function(level){if(level==~~level)return Math.abs(level);var lev;level+='';level=level.toUpperCase();if(level in statuses){level=statuses[level];}lev=LOG_LEVEL[level];if(lev!==undefined)return lev;lev=LOG_STATUS[level];if(lev!==undefined)return lev;return LOG_LEVEL.DEFAULT;};LOG.write=write;LOG.store=store;LOG.level=LOG.logDecodeLevel(level);LOG.status=defaultStatus;LOG.addMessage=function(message,status,icon){var date=new Date(),count,bool,logStatus;if(status&&status.constructor.name==='String'){status=status.toUpperCase();status=statuses[status]||status;}else status=LOG.status;logStatus=LOG_STATUS[status]||LOG_STATUS.ALL;if(logStatus999)?'['+LOG.count+'] ':(' ['+LOG.count+'] ').slice(-7);message=count+status+icon+(message instanceof Object?message.toSource():message)+date;if(LOG.store){stack.push(message);}if(LOG.write){bool=file&&file.writable&&logFile.writeln(message);if(!bool){file.writable=true;LOG.setFile(logFile);logFile.writeln(message);}}LOG.count++;return true;};var logNewFile=function(file,isCookie,overwrite){file.encoding='UTF-8';file.lineFeed=($.os[0]=='M')?'Macintosh':' Windows';if(isCookie)return file.open(overwrite?'w':'e')&&file;file.writable=LOG.write;logFile=file;logFolder=file.parent;if(continuing){LOG.count=LOG.setCount(file);}return(!LOG.write&&file||(file.open('a')&&file));};LOG.setFile=function(file,isCookie,overwrite){var bool,folder,fileName,suffix,newFileName,f,d,safeFileName;d=new Date();f=$.stack.split("\n")[0].replace(/^\[\(?/,'').replace(/\)?\]$/,'');if(f==~~f){f=$.fileName.replace(/[^\/]+\//g,'');}safeFileName=File.encode((isCookie?'/COOKIE_':'/LOG_')+f.replace(/^\//,'')+'_'+(1900+d.getYear())+(''+d).replace(/...(...)(..).+/,'_$1_$2')+(isCookie?'.txt':'.log'));if(file&&file.constructor.name=='String'){file=(file.match('/'))?new File(file):new File((logFolder||Folder.temp)+'/'+file);}if(file instanceof File){folder=file.parent;bool=folder.exists||folder.create();if(!bool)folder=Folder.temp;fileName=File.decode(file.name);suffix=fileName.match(/\.[^.]+$/);suffix=suffix?suffix[0]:'';fileName='/'+fileName;newFileName=fileName.replace(/\.[^.]+$/,'')+'_'+(+(new Date())+suffix);f=logNewFile(file,isCookie,overwrite);if(f)return f;f=logNewFile(new File(folder+newFileName),isCookie,overwrite);if(f)return f;f=logNewFile(new File(folder+safeFileName),isCookie,overwrite);if(f)return f;if(folder!=Folder.temp){f=logNewFile(new File(Folder.temp+fileName),isCookie,overwrite);if(f)return f;f=logNewFile(new File(Folder.temp+safeFileName),isCookie,overwrite);return f||new File(Folder.temp+safeFileName);}}return LOG.setFile(((logFile&&!isCookie)?new File(logFile):new File(Folder.temp+safeFileName)),isCookie,overwrite );};LOG.setCount=function(file){if(~~file===file){LOG.count=file;return LOG.count;}if(file===undefined){file=logFile;}if(file&&file.constructor===String){file=new File(file);}var logNumbers,contents;if(!file.length||!file.exists){LOG.count=1;return 1;}file.open('r');file.encoding='utf-8';file.seek(10000,2);contents='\n'+file.read();logNumbers=contents.match(/\n{0,3}\[\d+\] \[\w+\]+/g);if(logNumbers){logNumbers=+logNumbers[logNumbers.length-1].match(/\d+/)+1;file.close();LOG.count=logNumbers;return logNumbers;}if(file.length<10001){file.close();LOG.count=1;return 1;}file.seek(10000000,2);contents='\n'+file.read();logNumbers=contents.match(/\n{0,3}\[\d+\] \[\w+\]+/g);if(logNumbers){logNumbers=+logNumbers[logNumbers.length-1].match(/\d+/)+1;file.close();LOG.count=logNumbers;return logNumbers;}file.close();LOG.count=1;return 1;};LOG.setLevel=function(level){LOG.level=LOG.logDecodeLevel(level);return LOG.level;};LOG.setStatus=function(status){status=(''+status).toUpperCase();LOG.status=statuses[status]||status;return LOG.status;};LOG.cookie=function(file,level,overwrite,setLevel){var log,cookie;if(!file){file={file:file};}if(file&&(file.constructor===String||file.constructor===File)){file={file:file};}log=file;if(log.level===undefined){log.level=(level!==undefined)?level:'NONE';}if(log.overwrite===undefined){log.overwrite=(overwrite!==undefined)?overwrite:false;}if(log.setLevel===undefined){log.setLevel=(setLevel!==undefined)?setLevel:true;}setLevel=log.setLevel;overwrite=log.overwrite;level=log.level;file=log.file;file=LOG.setFile(file,true,overwrite);if(overwrite){file.write(level);}else{cookie=file.read();if(cookie.length){level=cookie;}else{file.write(level);}}file.close();if(setLevel){LOG.setLevel(level);}return{path:file,level:level};};LOG.args=function(args,funct,line){if(LOG.level>LOG_STATUS.FUNCTION)return;if(!(args&&(''+args.constructor).replace(/\s+/g,'')==='functionObject(){[nativecode]}'))return;if(!LOG.args.STRIP_COMMENTS){LOG.args.STRIP_COMMENTS=/((\/.*$)|(\/\*[\s\S]*?\*\/))/mg;}if(!LOG.args.ARGUMENT_NAMES){LOG.args.ARGUMENT_NAMES=/([^\s,]+)/g;}if(!LOG.args.OUTER_BRACKETS){LOG.args.OUTER_BRACKETS=/^\((.+)?\)$/;}if(!LOG.args.NEW_SOMETHING){LOG.args.NEW_SOMETHING=/^new \w+\((.+)?\)$/;}var functionString,argumentNames,stackInfo,report,functionName,arg,argsL,n,argName,argValue,argsTotal;if(funct===~~funct){line=funct;}if(!(funct instanceof Function)){funct=args.callee;}if(!(funct instanceof Function))return;functionName=funct.name;functionString=(''+funct).replace(LOG.args.STRIP_COMMENTS,'');argumentNames=functionString.slice(functionString.indexOf('(')+1,functionString.indexOf(')')).match(LOG.args.ARGUMENT_NAMES);argumentNames=argumentNames||[];report=[];report.push('--------------');report.push('Function Data:');report.push('--------------');report.push('Function Name:'+functionName);argsL=args.length;stackInfo=$.stack.split(/[\n\r]/);stackInfo.pop();stackInfo=stackInfo.join('\n ');report.push('Call stack:'+stackInfo);if(line){report.push('Function Line around:'+line);}report.push('Arguments Provided:'+argsL);report.push('Named Arguments:'+argumentNames.length);if(argumentNames.length){report.push('Arguments Names:'+argumentNames.join(','));}if(argsL){report.push('----------------');report.push('Argument Values:');report.push('----------------');}argsTotal=Math.max(argsL,argumentNames.length);for(n=0;n=argsL){argValue='NO VALUE PROVIDED';}else if(arg===undefined){argValue='undefined';}else if(arg===null){argValue='null';}else{argValue=arg.toSource().replace(LOG.args.OUTER_BRACKETS,'$1').replace(LOG.args.NEW_SOMETHING,'$1');}report.push((argName?argName:'arguments['+n+']')+':'+argValue);}report.push('');report=report.join('\n ');LOG(report,'f');return report;};LOG.stack=function(reverse){var st=$.stack.split('\n');st.pop();st.pop();if(reverse){st.reverse();}return LOG(st.join('\n '),'s');};LOG.values=function(values){var n,value,map=[];if(!(values instanceof Object||values instanceof Array)){return;}if(!LOG.values.OUTER_BRACKETS){LOG.values.OUTER_BRACKETS=/^\((.+)?\)$/;}if(!LOG.values.NEW_SOMETHING){LOG.values.NEW_SOMETHING=/^new \w+\((.+)?\)$/;}for(n in values){try{value=values[n];if(value===undefined){value='undefined';}else if(value===null){value='null';}else{value=value.toSource().replace(LOG.values.OUTER_BRACKETS,'$1').replace(LOG.values.NEW_SOMETHING,'$1');}}catch(e){value='\uD83D\uDEAB '+e;}map.push(n+':'+value);}if(map.length){map=map.join('\n ')+'\n ';return LOG(map,'v');}};LOG.reset=function(all){stack.length=0;LOG.count=1;if(all!==false){if(logFile instanceof File){logFile.close();}logFile=LOG.store=LOG.writeToFile=undefined;LOG.write=true;logFolder=Folder.temp;logTime=new Date();logPoint='After Log Reset';}};LOG.stopper=function(message){var newLogTime,t,m,newLogPoint;newLogTime=new Date();newLogPoint=(LOG.count!==undefined)?'LOG#'+LOG.count:'BEFORE LOG#1';LOG.time=t=newLogTime-logTime;if(message===false){return;}message=message||'Stopper start point';t=LOG.prettyTime(t);m=message+'\n '+'From '+logPoint+' to '+newLogPoint+' took '+t+' Starting '+logTime+' '+logTime.getMilliseconds()+'ms'+' Ending '+newLogTime+' '+newLogTime.getMilliseconds()+'ms';LOG(m,'st');logPoint=newLogPoint;logTime=newLogTime;return m;};LOG.start=function(message){var t=new Date();times.push([t,(message!==undefined)?message+'':'']);};LOG.stop=function(message){if(!times.length)return;message=(message)?message+' ':'';var nt,startLog,ot,om,td,m;nt=new Date();startLog=times.pop();ot=startLog[0];om=startLog[1];td=nt-ot;if(om.length){om+=' ';}m=om+'STARTED ['+ot+' '+ot.getMilliseconds()+'ms]\n '+message+'FINISHED ['+nt+' '+nt.getMilliseconds()+'ms]\n TOTAL TIME ['+LOG.prettyTime(td)+']';LOG(m,'ti');return m;};LOG.prettyTime=function(t){var h,m,s,ms;h=Math.floor(t / 3600000);m=Math.floor((t % 3600000)/ 60000);s=Math.floor((t % 60000)/ 1000);ms=t % 1000;t=(!t)?'<1ms':((h)?h+' hours ':'')+((m)?m+' minutes ':'')+((s)?s+' seconds ':'')+((ms&&(h||m||s))?'&':'')+((ms)?ms+'ms':'');return t;};LOG.get=function(){if(!stack.length)return 'THE LOG IS NOT SET TO STORE';var a=fetchLogLines(arguments);return a?'\n'+a.join('\n'):'NO LOGS AVAILABLE';};var fetchLogLines=function(){var args=arguments[0];if(!args.length)return stack;var c,n,l,a=[],ln,start,end,j,sl;l=args.length;sl=stack.length-1;n=0;for(c=0;cln)?sl+ln+1:ln-1;if(ln>=0&&ln<=sl)a[n++]=stack[ln];}else if(ln instanceof Array&&ln.length===2){start=ln[0];end=ln[1];if(!(~~start===start&&~~end===end))continue;start=(0>start)?sl+start+1:start-1;end=(0>end)?sl+end+1:end-1;start=Math.max(Math.min(sl,start),0);end=Math.min(Math.max(end,0),sl);if(start<=end)for(j=start;j<=end;j++)a[n++]=stack[j];else for(j=start;j>=end;j--)a[n++]=stack[j];}}return(n)?a:false;};LOG.file=function(){return logFile;};LOG.openFolder=function(){if(logFolder)return logFolder.execute();};LOG.show=LOG.execute=function(){if(logFile)return logFile.execute();};LOG.close=function(){if(logFile)return logFile.close();};LOG.setFile(file);if(!$.summary.difference){$.summary.difference=function(){return $.summary().replace(/ *([0-9]+)([^ ]+)(\n?)/g,$.summary.updateSnapshot );};}if(!$.summary.updateSnapshot){$.summary.updateSnapshot=function(full,count,name,lf){var snapshot=$.summary.snapshot;count=Number(count);var prev=snapshot[name]?snapshot[name]:0;snapshot[name]=count;var diff=count-prev;if(diff===0)return "";return " ".substring(String(diff).length)+diff+" "+name+lf;};}if(!$.summary.snapshot){$.summary.snapshot=[];$.summary.difference();}$.gc();$.gc();$.summary.difference();LOG.sumDiff=function(message){$.gc();$.gc();var diff=$.summary.difference();if(diff.length<8){diff=' - NONE -';}if(message===undefined){message='';}message+=diff;return LOG('$.summary.difference():'+message,'v');};return LOG;}; - -var log = new LogFactory('myLog.log'); // =>; creates the new log factory - put full path where - -function getEnv(variable){ - return $.getenv(variable); -} - -function fileOpen(path){ - return app.open(new File(path)); -} - -function getLayerTypeWithName(layerName) { - var type = 'NA'; - var nameParts = layerName.split('_'); - var namePrefix = nameParts[0]; - namePrefix = namePrefix.toLowerCase(); - switch (namePrefix) { - case 'guide': - case 'tl': - case 'tr': - case 'bl': - case 'br': - type = 'GUIDE'; - break; - case 'fg': - type = 'FG'; - break; - case 'bg': - type = 'BG'; - break; - case 'obj': - default: - type = 'OBJ'; - break; - } - - return type; -} - -function getLayers() { - /** - * Get json representation of list of layers. - * Much faster this way than in DOM traversal (2s vs 45s on same file) - * - * Format of single layer info: - * id : number - * name: string - * group: boolean - true if layer is a group - * parents:array - list of ids of parent groups, useful for selection - * all children layers from parent layerSet (eg. group) - * type: string - type of layer guessed from its name - * visible:boolean - true if visible - **/ - if (documents.length == 0){ - return '[]'; - } - var ref1 = new ActionReference(); - ref1.putEnumerated(charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), - charIDToTypeID('Trgt')); - var count = executeActionGet(ref1).getInteger(charIDToTypeID('NmbL')); - - // get all layer names - var layers = []; - var layer = {}; - - var parents = []; - for (var i = count; i >= 1; i--) { - var layer = {}; - var ref2 = new ActionReference(); - ref2.putIndex(charIDToTypeID('Lyr '), i); - - var desc = executeActionGet(ref2); // Access layer index #i - var layerSection = typeIDToStringID(desc.getEnumerationValue( - stringIDToTypeID('layerSection'))); - - layer.id = desc.getInteger(stringIDToTypeID("layerID")); - layer.name = desc.getString(stringIDToTypeID("name")); - layer.color_code = typeIDToStringID(desc.getEnumerationValue(stringIDToTypeID('color'))); - layer.group = false; - layer.parents = parents.slice(); - layer.type = getLayerTypeWithName(layer.name); - layer.visible = desc.getBoolean(stringIDToTypeID("visible")); - //log(" name: " + layer.name + " groupId " + layer.groupId + - //" group " + layer.group); - if (layerSection == 'layerSectionStart') { // Group start and end - parents.push(layer.id); - layer.group = true; - } - if (layerSection == 'layerSectionEnd') { - parents.pop(); - continue; - } - layers.push(JSON.stringify(layer)); - } - try{ - var bck = activeDocument.backgroundLayer; - layer.id = bck.id; - layer.name = bck.name; - layer.group = false; - layer.parents = []; - layer.type = 'background'; - layer.visible = bck.visible; - layers.push(JSON.stringify(layer)); - }catch(e){ - // do nothing, no background layer - }; - //log("layers " + layers); - return '[' + layers + ']'; -} - -function setVisible(layer_id, visibility){ - /** - * Sets particular 'layer_id' to 'visibility' if true > show - **/ - var desc = new ActionDescriptor(); - var ref = new ActionReference(); - ref.putIdentifier(stringIDToTypeID("layer"), layer_id); - desc.putReference(stringIDToTypeID("null"), ref); - - executeAction(visibility?stringIDToTypeID("show"):stringIDToTypeID("hide"), - desc, DialogModes.NO); - -} - -function getHeadline(){ - /** - * Returns headline of current document with metadata - * - **/ - if (documents.length == 0){ - return ''; - } - var headline = app.activeDocument.info.headline; - - return headline; -} - -function isSaved(){ - return app.activeDocument.saved; -} - -function save(){ - /** Saves active document **/ - return app.activeDocument.save(); -} - -function saveAs(output_path, ext, as_copy){ - /** Exports scene to various formats - * - * Currently implemented: 'jpg', 'png', 'psd' - * - * output_path - escaped file path on local system - * ext - extension for export - * as_copy - create copy, do not overwrite - * - * */ - var saveName = output_path; - var saveOptions; - if (ext == 'jpg'){ - saveOptions = new JPEGSaveOptions(); - saveOptions.quality = 12; - saveOptions.embedColorProfile = true; - saveOptions.formatOptions = FormatOptions.PROGRESSIVE; - if(saveOptions.formatOptions == FormatOptions.PROGRESSIVE){ - saveOptions.scans = 5}; - saveOptions.matte = MatteType.NONE; - } - if (ext == 'png'){ - saveOptions = new PNGSaveOptions(); - saveOptions.interlaced = true; - saveOptions.transparency = true; - } - if (ext == 'psd'){ - saveOptions = null; - return app.activeDocument.saveAs(new File(saveName)); - } - if (ext == 'psb'){ - return savePSB(output_path); - } - - return app.activeDocument.saveAs(new File(saveName), saveOptions, as_copy); - -} - -function getActiveDocumentName(){ - /** - * Returns file name of active document - * */ - if (documents.length == 0){ - return null; - } - return app.activeDocument.name; -} - -function getActiveDocumentFullName(){ - /** - * Returns file name of active document with file path. - * activeDocument.fullName returns path in URI (eg /c/.. instead of c:/) - * */ - if (documents.length == 0){ - return null; - } - var f = new File(app.activeDocument.fullName); - var path = f.fsName; - f.close(); - return path; -} - -function imprint(payload){ - /** - * Sets headline content of current document with metadata. Stores - * information about assets created through AYON. - * Content accessible in PS through File > File Info - * - **/ - app.activeDocument.info.headline = payload; -} - -function getSelectedLayers(doc) { - /** - * Returns json representation of currently selected layers. - * Works in three steps - 1) creates new group with selected layers - * 2) traverses this group - * 3) deletes newly created group, not needed - * Bit weird, but Adobe.. - **/ - if (doc == null){ - doc = app.activeDocument; - } - - var selLayers = []; - _grp = groupSelectedLayers(doc); - - var group = doc.activeLayer; - var layers = group.layers; - - // // group is fake at this point - // var itself_name = ''; - // if (layers){ - // itself_name = layers[0].name; - // } - - - for (var i = 0; i < layers.length; i++) { - var layer = {}; - layer.id = layers[i].id; - layer.name = layers[i].name; - long_names =_get_parents_names(group.parent, layers[i].name); - var t = layers[i].kind; - if ((typeof t !== 'undefined') && - (layers[i].kind.toString() == 'LayerKind.NORMAL')){ - layer.group = false; - }else{ - layer.group = true; - } - layer.long_name = long_names; - - selLayers.push(layer); - } - - _undo(); - - return JSON.stringify(selLayers); -}; - -function selectLayers(selectedLayers){ - /** - * Selects layers from list of ids - **/ - selectedLayers = JSON.parse(selectedLayers); - var layers = new Array(); - var id54 = charIDToTypeID( "slct" ); - var desc12 = new ActionDescriptor(); - var id55 = charIDToTypeID( "null" ); - var ref9 = new ActionReference(); - - var existing_layers = JSON.parse(getLayers()); - var existing_ids = []; - for (var y = 0; y < existing_layers.length; y++){ - existing_ids.push(existing_layers[y]["id"]); - } - for (var i = 0; i < selectedLayers.length; i++) { - // a check to see if the id still exists - var id = selectedLayers[i]; - if(existing_ids.toString().indexOf(id)>=0){ - layers[i] = charIDToTypeID( "Lyr " ); - ref9.putIdentifier(layers[i], id); - } - } - desc12.putReference( id55, ref9 ); - var id58 = charIDToTypeID( "MkVs" ); - desc12.putBoolean( id58, false ); - executeAction( id54, desc12, DialogModes.NO ); -} - -function groupSelectedLayers(doc, name) { - /** - * Groups selected layers into new group. - * Returns json representation of Layer for server to consume - * - * Args: - * doc(activeDocument) - * name (str): new name of created group - **/ - if (doc == null){ - doc = app.activeDocument; - } - - var desc = new ActionDescriptor(); - var ref = new ActionReference(); - ref.putClass( stringIDToTypeID('layerSection') ); - desc.putReference( charIDToTypeID('null'), ref ); - var lref = new ActionReference(); - lref.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), - charIDToTypeID('Trgt') ); - desc.putReference( charIDToTypeID('From'), lref); - executeAction( charIDToTypeID('Mk '), desc, DialogModes.NO ); - - var group = doc.activeLayer; - if (name){ - // Add special character to highlight group that will be published - group.name = name; - } - var layer = {}; - layer.id = group.id; - layer.name = name; // keep name clean - layer.group = true; - - layer.long_name = _get_parents_names(group, name); - - return JSON.stringify(layer); -}; - -function importSmartObject(path, name, link){ - /** - * Creates new layer with an image from 'path' - * - * path: absolute path to loaded file - * name: sets name of newly created laye - * - **/ - var desc1 = new ActionDescriptor(); - desc1.putPath( app.charIDToTypeID("null"), new File(path) ); - link = link || false; - if (link) { - desc1.putBoolean( app.charIDToTypeID('Lnkd'), true ); - } - - desc1.putEnumerated(app.charIDToTypeID("FTcs"), app.charIDToTypeID("QCSt"), - app.charIDToTypeID("Qcsa")); - var desc2 = new ActionDescriptor(); - desc2.putUnitDouble(app.charIDToTypeID("Hrzn"), - app.charIDToTypeID("#Pxl"), 0.0); - desc2.putUnitDouble(app.charIDToTypeID("Vrtc"), - app.charIDToTypeID("#Pxl"), 0.0); - - desc1.putObject(charIDToTypeID("Ofst"), charIDToTypeID("Ofst"), desc2); - executeAction(charIDToTypeID("Plc " ), desc1, DialogModes.NO); - - var docRef = app.activeDocument - var currentActivelayer = app.activeDocument.activeLayer; - if (name){ - currentActivelayer.name = name; - } - var layer = {} - layer.id = currentActivelayer.id; - layer.name = currentActivelayer.name; - return JSON.stringify(layer); -} - -function replaceSmartObjects(layer_id, path, name){ - /** - * Updates content of 'layer' with an image from 'path' - * - **/ - - var desc = new ActionDescriptor(); - var ref = new ActionReference(); - ref.putIdentifier(stringIDToTypeID("layer"), layer_id); - desc.putReference(stringIDToTypeID("null"), ref); - - desc.putPath(charIDToTypeID('null'), new File(path) ); - desc.putInteger(charIDToTypeID("PgNm"), 1); - - executeAction(stringIDToTypeID('placedLayerReplaceContents'), - desc, DialogModes.NO ); - var currentActivelayer = app.activeDocument.activeLayer; - if (name){ - currentActivelayer.name = name; - } -} - -function createGroup(name){ - /** - * Creates new group with a 'name' - * Because of asynchronous nature, only group.id is available - **/ - group = app.activeDocument.layerSets.add(); - // Add special character to highlight group that will be published - group.name = name; - - return group.id; // only id available at this time :| -} - -function deleteLayer(layer_id){ - /*** - * Deletes layer by its layer_id - * - * layer_id (int) - **/ - var d = new ActionDescriptor(); - var r = new ActionReference(); - - r.putIdentifier(stringIDToTypeID("layer"), layer_id); - d.putReference(stringIDToTypeID("null"), r); - executeAction(stringIDToTypeID("delete"), d, DialogModes.NO); -} - -function _undo() { - executeAction(charIDToTypeID("undo", undefined, DialogModes.NO)); -}; - -function savePSB(output_path){ - /*** - * Saves file as .psb to 'output_path' - * - * output_path (str) - **/ - var desc1 = new ActionDescriptor(); - var desc2 = new ActionDescriptor(); - desc2.putBoolean( stringIDToTypeID('maximizeCompatibility'), true ); - desc1.putObject( charIDToTypeID('As '), charIDToTypeID('Pht8'), desc2 ); - desc1.putPath( charIDToTypeID('In '), new File(output_path) ); - desc1.putBoolean( charIDToTypeID('LwCs'), true ); - executeAction( charIDToTypeID('save'), desc1, DialogModes.NO ); -} - -function close(){ - executeAction(stringIDToTypeID("quit"), undefined, DialogModes.NO ); -} - -function renameLayer(layer_id, new_name){ - /*** - * Renames 'layer_id' to 'new_name' - * - * Via Action (fast) - * - * Args: - * layer_id(int) - * new_name(str) - * - * output_path (str) - **/ - doc = app.activeDocument; - selectLayers('['+layer_id+']'); - - doc.activeLayer.name = new_name; -} - -function _get_parents_names(layer, itself_name){ - var long_names = [itself_name]; - while (layer.parent){ - if (layer.typename != "LayerSet"){ - break; - } - long_names.push(layer.name); - layer = layer.parent; - } - return long_names; -} - -// triggers when panel is opened, good for debugging -//log(getActiveDocumentName()); -// log.show(); -// var a = app.activeDocument.activeLayer; -// log(a); -//getSelectedLayers(); -// importSmartObject("c:/projects/test.jpg", "a aaNewLayer", true); -// log("dpc"); -// replaceSmartObjects(153, "â–¼Jungle_imageTest_001", "c:/projects/test_project_test_asset_TestTask_v001.png"); \ No newline at end of file diff --git a/server_addon/photoshop/client/ayon_photoshop/api/extension/host/json.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/host/json.js deleted file mode 100644 index 397349bbfd..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/extension/host/json.js +++ /dev/null @@ -1,530 +0,0 @@ -// json2.js -// 2017-06-12 -// Public Domain. -// NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - -// USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO -// NOT CONTROL. - -// This file creates a global JSON object containing two methods: stringify -// and parse. This file provides the ES5 JSON capability to ES3 systems. -// If a project might run on IE8 or earlier, then this file should be included. -// This file does nothing on ES5 systems. - -// JSON.stringify(value, replacer, space) -// value any JavaScript value, usually an object or array. -// replacer an optional parameter that determines how object -// values are stringified for objects. It can be a -// function or an array of strings. -// space an optional parameter that specifies the indentation -// of nested structures. If it is omitted, the text will -// be packed without extra whitespace. If it is a number, -// it will specify the number of spaces to indent at each -// level. If it is a string (such as "\t" or " "), -// it contains the characters used to indent at each level. -// This method produces a JSON text from a JavaScript value. -// When an object value is found, if the object contains a toJSON -// method, its toJSON method will be called and the result will be -// stringified. A toJSON method does not serialize: it returns the -// value represented by the name/value pair that should be serialized, -// or undefined if nothing should be serialized. The toJSON method -// will be passed the key associated with the value, and this will be -// bound to the value. - -// For example, this would serialize Dates as ISO strings. - -// Date.prototype.toJSON = function (key) { -// function f(n) { -// // Format integers to have at least two digits. -// return (n < 10) -// ? "0" + n -// : n; -// } -// return this.getUTCFullYear() + "-" + -// f(this.getUTCMonth() + 1) + "-" + -// f(this.getUTCDate()) + "T" + -// f(this.getUTCHours()) + ":" + -// f(this.getUTCMinutes()) + ":" + -// f(this.getUTCSeconds()) + "Z"; -// }; - -// You can provide an optional replacer method. It will be passed the -// key and value of each member, with this bound to the containing -// object. The value that is returned from your method will be -// serialized. If your method returns undefined, then the member will -// be excluded from the serialization. - -// If the replacer parameter is an array of strings, then it will be -// used to select the members to be serialized. It filters the results -// such that only members with keys listed in the replacer array are -// stringified. - -// Values that do not have JSON representations, such as undefined or -// functions, will not be serialized. Such values in objects will be -// dropped; in arrays they will be replaced with null. You can use -// a replacer function to replace those with JSON values. - -// JSON.stringify(undefined) returns undefined. - -// The optional space parameter produces a stringification of the -// value that is filled with line breaks and indentation to make it -// easier to read. - -// If the space parameter is a non-empty string, then that string will -// be used for indentation. If the space parameter is a number, then -// the indentation will be that many spaces. - -// Example: - -// text = JSON.stringify(["e", {pluribus: "unum"}]); -// // text is '["e",{"pluribus":"unum"}]' - -// text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t"); -// // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - -// text = JSON.stringify([new Date()], function (key, value) { -// return this[key] instanceof Date -// ? "Date(" + this[key] + ")" -// : value; -// }); -// // text is '["Date(---current time---)"]' - -// JSON.parse(text, reviver) -// This method parses a JSON text to produce an object or array. -// It can throw a SyntaxError exception. - -// The optional reviver parameter is a function that can filter and -// transform the results. It receives each of the keys and values, -// and its return value is used instead of the original value. -// If it returns what it received, then the structure is not modified. -// If it returns undefined then the member is deleted. - -// Example: - -// // Parse the text. Values that look like ISO date strings will -// // be converted to Date objects. - -// myData = JSON.parse(text, function (key, value) { -// var a; -// if (typeof value === "string") { -// a = -// /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); -// if (a) { -// return new Date(Date.UTC( -// +a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6] -// )); -// } -// return value; -// } -// }); - -// myData = JSON.parse( -// "[\"Date(09/09/2001)\"]", -// function (key, value) { -// var d; -// if ( -// typeof value === "string" -// && value.slice(0, 5) === "Date(" -// && value.slice(-1) === ")" -// ) { -// d = new Date(value.slice(5, -1)); -// if (d) { -// return d; -// } -// } -// return value; -// } -// ); - -// This is a reference implementation. You are free to copy, modify, or -// redistribute. - -/*jslint - eval, for, this -*/ - -/*property - JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -if (typeof JSON !== "object") { - JSON = {}; -} - -(function () { - "use strict"; - - var rx_one = /^[\],:{}\s]*$/; - var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; - var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; - var rx_four = /(?:^|:|,)(?:\s*\[)+/g; - var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; - var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; - - function f(n) { - // Format integers to have at least two digits. - return (n < 10) - ? "0" + n - : n; - } - - function this_value() { - return this.valueOf(); - } - - if (typeof Date.prototype.toJSON !== "function") { - - Date.prototype.toJSON = function () { - - return isFinite(this.valueOf()) - ? ( - this.getUTCFullYear() - + "-" - + f(this.getUTCMonth() + 1) - + "-" - + f(this.getUTCDate()) - + "T" - + f(this.getUTCHours()) - + ":" - + f(this.getUTCMinutes()) - + ":" - + f(this.getUTCSeconds()) - + "Z" - ) - : null; - }; - - Boolean.prototype.toJSON = this_value; - Number.prototype.toJSON = this_value; - String.prototype.toJSON = this_value; - } - - var gap; - var indent; - var meta; - var rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - rx_escapable.lastIndex = 0; - return rx_escapable.test(string) - ? "\"" + string.replace(rx_escapable, function (a) { - var c = meta[a]; - return typeof c === "string" - ? c - : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); - }) + "\"" - : "\"" + string + "\""; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i; // The loop counter. - var k; // The member key. - var v; // The member value. - var length; - var mind = gap; - var partial; - var value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if ( - value - && typeof value === "object" - && typeof value.toJSON === "function" - ) { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === "function") { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case "string": - return quote(value); - - case "number": - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return (isFinite(value)) - ? String(value) - : "null"; - - case "boolean": - case "null": - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce "null". The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is "object", we might be dealing with an object or an array or -// null. - - case "object": - -// Due to a specification blunder in ECMAScript, typeof null is "object", -// so watch out for that case. - - if (!value) { - return "null"; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === "[object Array]") { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || "null"; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 - ? "[]" - : gap - ? ( - "[\n" - + gap - + partial.join(",\n" + gap) - + "\n" - + mind - + "]" - ) - : "[" + partial.join(",") + "]"; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === "object") { - length = rep.length; - for (i = 0; i < length; i += 1) { - if (typeof rep[i] === "string") { - k = rep[i]; - v = str(k, value); - if (v) { - partial.push(quote(k) + ( - (gap) - ? ": " - : ":" - ) + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + ( - (gap) - ? ": " - : ":" - ) + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 - ? "{}" - : gap - ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" - : "{" + partial.join(",") + "}"; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== "function") { - meta = { // table of character substitutions - "\b": "\\b", - "\t": "\\t", - "\n": "\\n", - "\f": "\\f", - "\r": "\\r", - "\"": "\\\"", - "\\": "\\\\" - }; - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ""; - indent = ""; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === "number") { - for (i = 0; i < space; i += 1) { - indent += " "; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === "string") { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== "function" && ( - typeof replacer !== "object" - || typeof replacer.length !== "number" - )) { - throw new Error("JSON.stringify"); - } - -// Make a fake root object containing our value under the key of "". -// Return the result of stringifying the value. - - return str("", {"": value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== "function") { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k; - var v; - var value = holder[key]; - if (value && typeof value === "object") { - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - rx_dangerous.lastIndex = 0; - if (rx_dangerous.test(text)) { - text = text.replace(rx_dangerous, function (a) { - return ( - "\\u" - + ("0000" + a.charCodeAt(0).toString(16)).slice(-4) - ); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with "()" and "new" -// because they can cause invocation, and "=" because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with "@" (a non-JSON character). Second, we -// replace all simple value tokens with "]" characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or "]" or -// "," or ":" or "{" or "}". If that is so, then the text is safe for eval. - - if ( - rx_one.test( - text - .replace(rx_two, "@") - .replace(rx_three, "]") - .replace(rx_four, "") - ) - ) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The "{" operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval("(" + text + ")"); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return (typeof reviver === "function") - ? walk({"": j}, "") - : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError("JSON.parse"); - }; - } -}()); \ No newline at end of file diff --git a/server_addon/photoshop/client/ayon_photoshop/api/extension/icons/ayon_logo.png b/server_addon/photoshop/client/ayon_photoshop/api/extension/icons/ayon_logo.png deleted file mode 100644 index 3a96f8e2b499baa337cdc5a4d3cdf547f9ded972..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3538 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 E-zj>|X#fBK diff --git a/server_addon/photoshop/client/ayon_photoshop/api/extension/index.html b/server_addon/photoshop/client/ayon_photoshop/api/extension/index.html deleted file mode 100644 index 9d7363e62d..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/extension/index.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py b/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py deleted file mode 100644 index 04401a0972..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py +++ /dev/null @@ -1,406 +0,0 @@ -import os -import subprocess -import collections -import asyncio - -from wsrpc_aiohttp import ( - WebSocketRoute, - WebSocketAsync -) - -import ayon_api -from qtpy import QtCore - -from ayon_core.lib import Logger -from ayon_core.pipeline import ( - registered_host, - Anatomy, -) -from ayon_core.pipeline.workfile import ( - get_workfile_template_key_from_context, - get_last_workfile, -) -from ayon_core.pipeline.template_data import get_template_data_with_names -from ayon_core.tools.utils import host_tools -from ayon_core.pipeline.context_tools import change_current_context - -from .webserver import WebServerTool -from .ws_stub import PhotoshopServerStub - -log = Logger.get_logger(__name__) - - -class ConnectionNotEstablishedYet(Exception): - pass - - -class MainThreadItem: - """Structure to store information about callback in main thread. - - Item should be used to execute callback in main thread which may be needed - for execution of Qt objects. - - Item store callback (callable variable), arguments and keyword arguments - for the callback. Item hold information about it's process. - """ - not_set = object() - - def __init__(self, callback, *args, **kwargs): - self._done = False - self._exception = self.not_set - self._result = self.not_set - self._callback = callback - self._args = args - self._kwargs = kwargs - - @property - def done(self): - return self._done - - @property - def exception(self): - return self._exception - - @property - def result(self): - return self._result - - def execute(self): - """Execute callback and store its result. - - Method must be called from main thread. Item is marked as `done` - when callback execution finished. Store output of callback of exception - information when callback raises one. - """ - log.debug("Executing process in main thread") - if self.done: - log.warning("- item is already processed") - return - - log.info("Running callback: {}".format(str(self._callback))) - try: - result = self._callback(*self._args, **self._kwargs) - self._result = result - - except Exception as exc: - self._exception = exc - - finally: - self._done = True - - -def stub(): - """ - Convenience function to get server RPC stub to call methods directed - for host (Photoshop). - It expects already created connection, started from client. - Currently created when panel is opened (PS: Window>Extensions>Avalon) - :return: where functions could be called from - """ - ps_stub = PhotoshopServerStub() - if not ps_stub.client: - raise ConnectionNotEstablishedYet("Connection is not created yet") - - return ps_stub - - -def show_tool_by_name(tool_name): - kwargs = {} - if tool_name == "loader": - kwargs["use_context"] = True - - host_tools.show_tool_by_name(tool_name, **kwargs) - - -class ProcessLauncher(QtCore.QObject): - route_name = "Photoshop" - _main_thread_callbacks = collections.deque() - - def __init__(self, subprocess_args): - self._subprocess_args = subprocess_args - self._log = None - - super(ProcessLauncher, self).__init__() - - # Keep track if launcher was already started - self._started = False - - self._process = None - self._websocket_server = None - - start_process_timer = QtCore.QTimer() - start_process_timer.setInterval(100) - - loop_timer = QtCore.QTimer() - loop_timer.setInterval(200) - - start_process_timer.timeout.connect(self._on_start_process_timer) - loop_timer.timeout.connect(self._on_loop_timer) - - self._start_process_timer = start_process_timer - self._loop_timer = loop_timer - - @property - def log(self): - if self._log is None: - self._log = Logger.get_logger( - "{}-launcher".format(self.route_name) - ) - return self._log - - @property - def websocket_server_is_running(self): - if self._websocket_server is not None: - return self._websocket_server.is_running - return False - - @property - def is_process_running(self): - if self._process is not None: - return self._process.poll() is None - return False - - @property - def is_host_connected(self): - """Returns True if connected, False if app is not running at all.""" - if not self.is_process_running: - return False - - try: - _stub = stub() - if _stub: - return True - except Exception: - pass - - return None - - @classmethod - def execute_in_main_thread(cls, callback, *args, **kwargs): - item = MainThreadItem(callback, *args, **kwargs) - cls._main_thread_callbacks.append(item) - return item - - def start(self): - if self._started: - return - self.log.info("Started launch logic of Photoshop") - self._started = True - self._start_process_timer.start() - - def exit(self): - """ Exit whole application. """ - if self._start_process_timer.isActive(): - self._start_process_timer.stop() - if self._loop_timer.isActive(): - self._loop_timer.stop() - - if self._websocket_server is not None: - self._websocket_server.stop() - - if self._process: - self._process.kill() - self._process.wait() - - QtCore.QCoreApplication.exit() - - def _on_loop_timer(self): - # TODO find better way and catch errors - # Run only callbacks that are in queue at the moment - cls = self.__class__ - for _ in range(len(cls._main_thread_callbacks)): - if cls._main_thread_callbacks: - item = cls._main_thread_callbacks.popleft() - item.execute() - - if not self.is_process_running: - self.log.info("Host process is not running. Closing") - self.exit() - - elif not self.websocket_server_is_running: - self.log.info("Websocket server is not running. Closing") - self.exit() - - def _on_start_process_timer(self): - # TODO add try except validations for each part in this method - # Start server as first thing - if self._websocket_server is None: - self._init_server() - return - - # TODO add waiting time - # Wait for webserver - if not self.websocket_server_is_running: - return - - # Start application process - if self._process is None: - self._start_process() - self.log.info("Waiting for host to connect") - return - - # TODO add waiting time - # Wait until host is connected - if self.is_host_connected: - self._start_process_timer.stop() - self._loop_timer.start() - elif ( - not self.is_process_running - or not self.websocket_server_is_running - ): - self.exit() - - def _init_server(self): - if self._websocket_server is not None: - return - - self.log.debug( - "Initialization of websocket server for host communication" - ) - - self._websocket_server = websocket_server = WebServerTool() - if websocket_server.port_occupied( - websocket_server.host_name, - websocket_server.port - ): - self.log.info( - "Server already running, sending actual context and exit." - ) - asyncio.run(websocket_server.send_context_change(self.route_name)) - self.exit() - return - - # Add Websocket route - websocket_server.add_route("*", "/ws/", WebSocketAsync) - # Add after effects route to websocket handler - - print("Adding {} route".format(self.route_name)) - WebSocketAsync.add_route( - self.route_name, PhotoshopRoute - ) - self.log.info("Starting websocket server for host communication") - websocket_server.start_server() - - def _start_process(self): - if self._process is not None: - return - self.log.info("Starting host process") - try: - self._process = subprocess.Popen( - self._subprocess_args, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL - ) - except Exception: - self.log.info("exce", exc_info=True) - self.exit() - - -class PhotoshopRoute(WebSocketRoute): - """ - One route, mimicking external application (like Harmony, etc). - All functions could be called from client. - 'do_notify' function calls function on the client - mimicking - notification after long running job on the server or similar - """ - instance = None - - def init(self, **kwargs): - # Python __init__ must be return "self". - # This method might return anything. - log.debug("someone called Photoshop route") - self.instance = self - return kwargs - - # server functions - async def ping(self): - log.debug("someone called Photoshop route ping") - - # This method calls function on the client side - # client functions - async def set_context(self, project, folder, task): - """ - Sets 'project' and 'folder' to envs, eg. setting context. - - Opens last workile from that context if exists. - - Args: - project (str) - folder (str) - task (str - """ - log.info("Setting context change") - log.info(f"project {project} folder {folder} task {task}") - - folder_entity = ayon_api.get_folder_by_path(project, folder) - task_entity = ayon_api.get_task_by_name( - project, folder_entity["id"], task - ) - change_current_context(folder_entity, task_entity) - - last_workfile_path = self._get_last_workfile_path(project, - folder, - task) - if last_workfile_path and os.path.exists(last_workfile_path): - ProcessLauncher.execute_in_main_thread( - lambda: stub().open(last_workfile_path)) - - - async def read(self): - log.debug("photoshop.read client calls server server calls " - "photoshop client") - return await self.socket.call('photoshop.read') - - # panel routes for tools - async def workfiles_route(self): - self._tool_route("workfiles") - - async def loader_route(self): - self._tool_route("loader") - - async def publish_route(self): - self._tool_route("publisher") - - async def sceneinventory_route(self): - self._tool_route("sceneinventory") - - async def experimental_tools_route(self): - self._tool_route("experimental_tools") - - def _tool_route(self, _tool_name): - """The address accessed when clicking on the buttons.""" - - ProcessLauncher.execute_in_main_thread(show_tool_by_name, _tool_name) - - # Required return statement. - return "nothing" - - def _get_last_workfile_path(self, project_name, folder_path, task_name): - """Returns last workfile path if exists""" - host = registered_host() - host_name = "photoshop" - template_key = get_workfile_template_key_from_context( - project_name, - folder_path, - task_name, - host_name, - ) - anatomy = Anatomy(project_name) - - data = get_template_data_with_names( - project_name, folder_path, task_name, host_name - ) - data["root"] = anatomy.roots - - work_template = anatomy.get_template_item("work", template_key) - - # Define saving file extension - extensions = host.get_workfile_extensions() - - work_root = work_template["directory"].format_strict(data) - file_template = work_template["file"].template - last_workfile_path = get_last_workfile( - work_root, file_template, data, extensions, True - ) - - return last_workfile_path diff --git a/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py b/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py deleted file mode 100644 index de7fc8ba48..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py +++ /dev/null @@ -1,93 +0,0 @@ -"""Script wraps launch mechanism of Photoshop implementations. - -Arguments passed to the script are passed to launch function in host -implementation. In all cases requires host app executable and may contain -workfile or others. -""" - -import os -import sys - -from ayon_photoshop.api.lib import main as host_main - -# Get current file to locate start point of sys.argv -CURRENT_FILE = os.path.abspath(__file__) - - -def show_error_messagebox(title, message, detail_message=None): - """Function will show message and process ends after closing it.""" - from qtpy import QtWidgets, QtCore - from ayon_core import style - - app = QtWidgets.QApplication([]) - app.setStyleSheet(style.load_stylesheet()) - - msgbox = QtWidgets.QMessageBox() - msgbox.setWindowTitle(title) - msgbox.setText(message) - - if detail_message: - msgbox.setDetailedText(detail_message) - - msgbox.setWindowModality(QtCore.Qt.ApplicationModal) - msgbox.show() - - sys.exit(app.exec_()) - - -def on_invalid_args(script_not_found): - """Show to user message box saying that something went wrong. - - Tell user that arguments to launch implementation are invalid with - arguments details. - - Args: - script_not_found (bool): Use different message based on this value. - """ - - title = "Invalid arguments" - joined_args = ", ".join("\"{}\"".format(arg) for arg in sys.argv) - if script_not_found: - submsg = "Where couldn't find script path:\n\"{}\"" - else: - submsg = "Expected Host executable after script path:\n\"{}\"" - - message = "BUG: Got invalid arguments so can't launch Host application." - detail_message = "Process was launched with arguments:\n{}\n\n{}".format( - joined_args, - submsg.format(CURRENT_FILE) - ) - - show_error_messagebox(title, message, detail_message) - - -def main(argv): - # Modify current file path to find match in sys.argv which may be different - # on windows (different letter cases and slashes). - modified_current_file = CURRENT_FILE.replace("\\", "/").lower() - - # Create a copy of sys argv - sys_args = list(argv) - after_script_idx = None - # Find script path in sys.argv to know index of argv where host - # executable should be. - for idx, item in enumerate(sys_args): - if item.replace("\\", "/").lower() == modified_current_file: - after_script_idx = idx + 1 - break - - # Validate that there is at least one argument after script path - launch_args = None - if after_script_idx is not None: - launch_args = sys_args[after_script_idx:] - - if launch_args: - # Launch host implementation - host_main(*launch_args) - else: - # Show message box - on_invalid_args(after_script_idx is None) - - -if __name__ == "__main__": - main(sys.argv) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/lib.py b/server_addon/photoshop/client/ayon_photoshop/api/lib.py deleted file mode 100644 index fd003919ce..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/lib.py +++ /dev/null @@ -1,84 +0,0 @@ -import os -import sys -import contextlib -import traceback - -from ayon_core.lib import env_value_to_bool, Logger, is_in_tests -from ayon_core.addon import AddonsManager -from ayon_core.pipeline import install_host -from ayon_core.tools.utils import host_tools -from ayon_core.tools.utils import get_ayon_qt_app - -from .launch_logic import ProcessLauncher, stub - -log = Logger.get_logger(__name__) - - -def safe_excepthook(*args): - traceback.print_exception(*args) - - -def main(*subprocess_args): - from ayon_photoshop.api import PhotoshopHost - - host = PhotoshopHost() - install_host(host) - - sys.excepthook = safe_excepthook - - # coloring in StdOutBroker - os.environ["AYON_LOG_NO_COLORS"] = "0" - app = get_ayon_qt_app() - app.setQuitOnLastWindowClosed(False) - - launcher = ProcessLauncher(subprocess_args) - launcher.start() - - if env_value_to_bool("HEADLESS_PUBLISH"): - manager = AddonsManager() - webpublisher_addon = manager["webpublisher"] - launcher.execute_in_main_thread( - webpublisher_addon.headless_publish, - log, - "ClosePS", - is_in_tests() - ) - elif env_value_to_bool("AVALON_PHOTOSHOP_WORKFILES_ON_LAUNCH", - default=True): - - launcher.execute_in_main_thread( - host_tools.show_workfiles, - save=env_value_to_bool("WORKFILES_SAVE_AS") - ) - - sys.exit(app.exec_()) - - -@contextlib.contextmanager -def maintained_selection(): - """Maintain selection during context.""" - selection = stub().get_selected_layers() - try: - yield selection - finally: - stub().select_layers(selection) - - -@contextlib.contextmanager -def maintained_visibility(layers=None): - """Maintain visibility during context. - - Args: - layers (list) of PSItem (used for caching) - """ - visibility = {} - if not layers: - layers = stub().get_layers() - for layer in layers: - visibility[layer.id] = layer.visible - try: - yield - finally: - for layer in layers: - stub().set_visible(layer.id, visibility[layer.id]) - pass diff --git a/server_addon/photoshop/client/ayon_photoshop/api/panel.png b/server_addon/photoshop/client/ayon_photoshop/api/panel.png deleted file mode 100644 index be5db3b8df08aa426b92de61eacc9afd00e93d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8756 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 File Info - - Returns: - (list) of dictionaries matching instances format - """ - stub = _get_stub() - - if not stub: - return [] - - instances = [] - layers_meta = stub.get_layers_metadata() - if layers_meta: - for instance in layers_meta: - if instance.get("id") in { - AYON_INSTANCE_ID, AVALON_INSTANCE_ID - }: - instances.append(instance) - - return instances - - def remove_instance(self, instance): - """Remove instance from current workfile metadata. - - Updates metadata of current file in File > File Info and removes - icon highlight on group layer. - - Args: - instance (dict): instance representation from subsetmanager model - """ - stub = _get_stub() - - if not stub: - return - - inst_id = instance.get("instance_id") or instance.get("uuid") # legacy - if not inst_id: - log.warning("No instance identifier for {}".format(instance)) - return - - stub.remove_instance(inst_id) - - if instance.get("members"): - item = stub.get_layer(instance["members"][0]) - if item: - stub.rename_layer(item.id, - item.name.replace(stub.PUBLISH_ICON, '')) - - -def check_inventory(): - if not any_outdated_containers(): - return - - # Warn about outdated containers. - _app = get_ayon_qt_app() - - message_box = QtWidgets.QMessageBox() - message_box.setIcon(QtWidgets.QMessageBox.Warning) - msg = "There are outdated containers in the scene." - message_box.setText(msg) - message_box.exec_() - - -def on_application_launch(): - check_inventory() - - -def ls(): - """Yields containers from active Photoshop document - - This is the host-equivalent of api.ls(), but instead of listing - assets on disk, it lists assets already loaded in Photoshop; once loaded - they are called 'containers' - - Yields: - dict: container - - """ - try: - stub = lib.stub() # only after Photoshop is up - except lib.ConnectionNotEstablishedYet: - print("Not connected yet, ignoring") - return - - if not stub.get_active_document_name(): - return - - layers_meta = stub.get_layers_metadata() # minimalize calls to PS - for layer in stub.get_layers(): - data = stub.read(layer, layers_meta) - - # Skip non-tagged layers. - if not data: - continue - - # Filter to only containers. - if "container" not in data["id"]: - continue - - # Append transient data - data["objectName"] = layer.name.replace(stub.LOADED_ICON, '') - data["layer"] = layer - - yield data - - -def _get_stub(): - """Handle pulling stub from PS to run operations on host - - Returns: - (PhotoshopServerStub) or None - """ - try: - stub = lib.stub() # only after Photoshop is up - except lib.ConnectionNotEstablishedYet: - print("Not connected yet, ignoring") - return - - if not stub.get_active_document_name(): - return - - return stub - - -def containerise( - name, namespace, layer, context, loader=None, suffix="_CON" -): - """Imprint layer with metadata - - Containerisation enables a tracking of version, author and origin - for loaded assets. - - Arguments: - name (str): Name of resulting assembly - namespace (str): Namespace under which to host container - layer (PSItem): Layer to containerise - context (dict): Asset information - loader (str, optional): Name of loader used to produce this container. - suffix (str, optional): Suffix of container, defaults to `_CON`. - - Returns: - container (str): Name of container assembly - """ - layer.name = name + suffix - - data = { - "schema": "openpype:container-2.0", - "id": AVALON_CONTAINER_ID, - "name": name, - "namespace": namespace, - "loader": str(loader), - "representation": context["representation"]["id"], - "members": [str(layer.id)] - } - stub = lib.stub() - stub.imprint(layer.id, data) - - return layer - - -def cache_and_get_instances(creator): - """Cache instances in shared data. - - Storing all instances as a list as legacy instances might be still present. - Args: - creator (Creator): Plugin which would like to get instances from host. - Returns: - List[]: list of all instances stored in metadata - """ - shared_key = "openpype.photoshop.instances" - if shared_key not in creator.collection_shared_data: - creator.collection_shared_data[shared_key] = \ - creator.host.list_instances() - return creator.collection_shared_data[shared_key] diff --git a/server_addon/photoshop/client/ayon_photoshop/api/plugin.py b/server_addon/photoshop/client/ayon_photoshop/api/plugin.py deleted file mode 100644 index c11a206834..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/plugin.py +++ /dev/null @@ -1,37 +0,0 @@ -import re - -from ayon_core.pipeline import LoaderPlugin -from .launch_logic import stub - - -def get_unique_layer_name(layers, container_name, product_name): - """Prepare unique layer name. - - Gets all layer names and if '_' is present, - it adds suffix '1', or increases the suffix by 1. - - Args: - layers (list) of dict with layers info (name, id etc.) - container_name (str): - product_name (str): - - Returns: - str: name_00X (without version) - """ - name = "{}_{}".format(container_name, product_name) - names = {} - for layer in layers: - layer_name = re.sub(r'_\d{3}$', '', layer.name) - if layer_name in names.keys(): - names[layer_name] = names[layer_name] + 1 - else: - names[layer_name] = 1 - occurrences = names.get(name, 0) - - return "{}_{:0>3d}".format(name, occurrences + 1) - - -class PhotoshopLoader(LoaderPlugin): - @staticmethod - def get_stub(): - return stub() diff --git a/server_addon/photoshop/client/ayon_photoshop/api/webserver.py b/server_addon/photoshop/client/ayon_photoshop/api/webserver.py deleted file mode 100644 index cd229c65ad..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/webserver.py +++ /dev/null @@ -1,241 +0,0 @@ -"""Webserver for communication with photoshop. - -Aiohttp (Asyncio) based websocket server used for communication with host -application. - -This webserver is started in spawned Python process that opens DCC during -its launch, waits for connection from DCC and handles communication going -forward. Server is closed before Python process is killed. -""" -import os -import logging -import urllib -import threading -import asyncio -import socket - -from aiohttp import web - -from wsrpc_aiohttp import WSRPCClient - -from ayon_core.pipeline import get_global_context - -log = logging.getLogger(__name__) - - -class WebServerTool: - """ - Basic POC implementation of asychronic websocket RPC server. - Uses class in external_app_1.py to mimic implementation for single - external application. - 'test_client' folder contains two test implementations of client - """ - _instance = None - - def __init__(self): - WebServerTool._instance = self - - self.client = None - self.handlers = {} - self.on_stop_callbacks = [] - - port = None - host_name = "localhost" - websocket_url = os.getenv("WEBSOCKET_URL") - if websocket_url: - parsed = urllib.parse.urlparse(websocket_url) - port = parsed.port - host_name = parsed.netloc.split(":")[0] - if not port: - port = 8098 # fallback - - self.port = port - self.host_name = host_name - - self.app = web.Application() - - # add route with multiple methods for single "external app" - self.webserver_thread = WebServerThread(self, self.port) - - def add_route(self, *args, **kwargs): - self.app.router.add_route(*args, **kwargs) - - def add_static(self, *args, **kwargs): - self.app.router.add_static(*args, **kwargs) - - def start_server(self): - if self.webserver_thread and not self.webserver_thread.is_alive(): - self.webserver_thread.start() - - def stop_server(self): - self.stop() - - async def send_context_change(self, host): - """ - Calls running webserver to inform about context change - - Used when new PS/AE should be triggered, - but one already running, without - this publish would point to old context. - """ - client = WSRPCClient(os.getenv("WEBSOCKET_URL"), - loop=asyncio.get_event_loop()) - await client.connect() - - context = get_global_context() - project_name = context["project_name"] - folder_path = context["folder_path"] - task_name = context["task_name"] - log.info("Sending context change to {}{}/{}".format( - project_name, folder_path, task_name - )) - - await client.call( - '{}.set_context'.format(host), - project=project_name, - folder=folder_path, - task=task_name - ) - await client.close() - - def port_occupied(self, host_name, port): - """ - Check if 'url' is already occupied. - - This could mean, that app is already running and we are trying open it - again. In that case, use existing running webserver. - Check here is easier than capturing exception from thread. - """ - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as con: - result = con.connect_ex((host_name, port)) == 0 - - if result: - print(f"Port {port} is already in use") - return result - - def call(self, func): - log.debug("websocket.call {}".format(func)) - future = asyncio.run_coroutine_threadsafe( - func, - self.webserver_thread.loop - ) - result = future.result() - return result - - @staticmethod - def get_instance(): - if WebServerTool._instance is None: - WebServerTool() - return WebServerTool._instance - - @property - def is_running(self): - if not self.webserver_thread: - return False - return self.webserver_thread.is_running - - def stop(self): - if not self.is_running: - return - try: - log.debug("Stopping websocket server") - self.webserver_thread.is_running = False - self.webserver_thread.stop() - except Exception: - log.warning( - "Error has happened during Killing websocket server", - exc_info=True - ) - - def thread_stopped(self): - for callback in self.on_stop_callbacks: - callback() - - -class WebServerThread(threading.Thread): - """ Listener for websocket rpc requests. - - It would be probably better to "attach" this to main thread (as for - example Harmony needs to run something on main thread), but currently - it creates separate thread and separate asyncio event loop - """ - def __init__(self, module, port): - super(WebServerThread, self).__init__() - - self.is_running = False - self.port = port - self.module = module - self.loop = None - self.runner = None - self.site = None - self.tasks = [] - - def run(self): - self.is_running = True - - try: - log.info("Starting web server") - self.loop = asyncio.new_event_loop() # create new loop for thread - asyncio.set_event_loop(self.loop) - - self.loop.run_until_complete(self.start_server()) - - websocket_url = "ws://localhost:{}/ws".format(self.port) - - log.debug( - "Running Websocket server on URL: \"{}\"".format(websocket_url) - ) - - asyncio.ensure_future(self.check_shutdown(), loop=self.loop) - self.loop.run_forever() - except Exception: - self.is_running = False - log.warning( - "Websocket Server service has failed", exc_info=True - ) - raise - finally: - self.loop.close() # optional - - self.is_running = False - self.module.thread_stopped() - log.info("Websocket server stopped") - - async def start_server(self): - """ Starts runner and TCPsite """ - self.runner = web.AppRunner(self.module.app) - await self.runner.setup() - self.site = web.TCPSite(self.runner, 'localhost', self.port) - await self.site.start() - - def stop(self): - """Sets is_running flag to false, 'check_shutdown' shuts server down""" - self.is_running = False - - async def check_shutdown(self): - """ Future that is running and checks if server should be running - periodically. - """ - while self.is_running: - while self.tasks: - task = self.tasks.pop(0) - log.debug("waiting for task {}".format(task)) - await task - log.debug("returned value {}".format(task.result)) - - await asyncio.sleep(0.5) - - log.debug("Starting shutdown") - await self.site.stop() - log.debug("Site stopped") - await self.runner.cleanup() - log.debug("Runner stopped") - tasks = [task for task in asyncio.all_tasks() if - task is not asyncio.current_task()] - list(map(lambda task: task.cancel(), tasks)) # cancel all the tasks - results = await asyncio.gather(*tasks, return_exceptions=True) - log.debug(f'Finished awaiting cancelled tasks, results: {results}...') - await self.loop.shutdown_asyncgens() - # to really make sure everything else has time to stop - await asyncio.sleep(0.07) - self.loop.stop() diff --git a/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py b/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py deleted file mode 100644 index 3619fa4b7a..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py +++ /dev/null @@ -1,571 +0,0 @@ -""" - Stub handling connection from server to client. - Used anywhere solution is calling client methods. -""" -import json -import attr -from wsrpc_aiohttp import WebSocketAsync - -from .webserver import WebServerTool - - -@attr.s -class PSItem(object): - """ - Object denoting layer or group item in PS. Each item is created in - PS by any Loader, but contains same fields, which are being used - in later processing. - """ - # metadata - id = attr.ib() # id created by AE, could be used for querying - name = attr.ib() # name of item - group = attr.ib(default=None) # item type (footage, folder, comp) - parents = attr.ib(factory=list) - visible = attr.ib(default=True) - type = attr.ib(default=None) - # all imported elements, single for - members = attr.ib(factory=list) - long_name = attr.ib(default=None) - color_code = attr.ib(default=None) # color code of layer - instance_id = attr.ib(default=None) - - @property - def clean_name(self): - """Returns layer name without publish icon highlight - - Returns: - (str) - """ - return (self.name.replace(PhotoshopServerStub.PUBLISH_ICON, '') - .replace(PhotoshopServerStub.LOADED_ICON, '')) - - -class PhotoshopServerStub: - """ - Stub for calling function on client (Photoshop js) side. - Expects that client is already connected (started when avalon menu - is opened). - 'self.websocketserver.call' is used as async wrapper - """ - PUBLISH_ICON = '\u2117 ' - LOADED_ICON = '\u25bc' - - def __init__(self): - self.websocketserver = WebServerTool.get_instance() - self.client = self.get_client() - - @staticmethod - def get_client(): - """ - Return first connected client to WebSocket - TODO implement selection by Route - :return: client - """ - clients = WebSocketAsync.get_clients() - client = None - if len(clients) > 0: - key = list(clients.keys())[0] - client = clients.get(key) - - return client - - def open(self, path): - """Open file located at 'path' (local). - - Args: - path(string): file path locally - Returns: None - """ - self.websocketserver.call( - self.client.call('Photoshop.open', path=path) - ) - - def read(self, layer, layers_meta=None): - """Parses layer metadata from Headline field of active document. - - Args: - layer: (PSItem) - layers_meta: full list from Headline (for performance in loops) - Returns: - (dict) of layer metadata stored in PS file - - Example: - { - 'id': 'pyblish.avalon.container', - 'loader': 'ImageLoader', - 'members': ['64'], - 'name': 'imageMainMiddle', - 'namespace': 'Hero_imageMainMiddle_001', - 'representation': '6203dc91e80934d9f6ee7d96', - 'schema': 'openpype:container-2.0' - } - """ - if layers_meta is None: - layers_meta = self.get_layers_metadata() - - for layer_meta in layers_meta: - layer_id = layer_meta.get("uuid") # legacy - if layer_meta.get("members"): - layer_id = layer_meta["members"][0] - if str(layer.id) == str(layer_id): - return layer_meta - print("Unable to find layer metadata for {}".format(layer.id)) - - def imprint(self, item_id, data, all_layers=None, items_meta=None): - """Save layer metadata to Headline field of active document - - Stores metadata in format: - [{ - "active":true, - "productName":"imageBG", - "productType":"image", - "id":"ayon.create.instance", - "folderPath":"Town", - "uuid": "8" - }] - for created instances - OR - [{ - "schema": "openpype:container-2.0", - "id": "ayon.create.instance", - "name": "imageMG", - "namespace": "Jungle_imageMG_001", - "loader": "ImageLoader", - "representation": "5fbfc0ee30a946093c6ff18a", - "members": [ - "40" - ] - }] - for loaded instances - - Args: - item_id (str): - data(string): json representation for single layer - all_layers (list of PSItem): for performance, could be - injected for usage in loop, if not, single call will be - triggered - items_meta(string): json representation from Headline - (for performance - provide only if imprint is in - loop - value should be same) - Returns: None - """ - if not items_meta: - items_meta = self.get_layers_metadata() - - # json.dumps writes integer values in a dictionary to string, so - # anticipating it here. - item_id = str(item_id) - is_new = True - result_meta = [] - for item_meta in items_meta: - if ((item_meta.get('members') and - item_id == str(item_meta.get('members')[0])) or - item_meta.get("instance_id") == item_id): - is_new = False - if data: - item_meta.update(data) - result_meta.append(item_meta) - else: - result_meta.append(item_meta) - - if is_new: - result_meta.append(data) - - # Ensure only valid ids are stored. - if not all_layers: - all_layers = self.get_layers() - layer_ids = [layer.id for layer in all_layers] - cleaned_data = [] - - for item in result_meta: - if item.get("members"): - if int(item["members"][0]) not in layer_ids: - continue - - cleaned_data.append(item) - - payload = json.dumps(cleaned_data, indent=4) - self.websocketserver.call( - self.client.call('Photoshop.imprint', payload=payload) - ) - - def get_layers(self): - """Returns JSON document with all(?) layers in active document. - - Returns: - Format of tuple: { 'id':'123', - 'name': 'My Layer 1', - 'type': 'GUIDE'|'FG'|'BG'|'OBJ' - 'visible': 'true'|'false' - """ - res = self.websocketserver.call( - self.client.call('Photoshop.get_layers') - ) - - return self._to_records(res) - - def get_layer(self, layer_id): - """ - Returns PSItem for specific 'layer_id' or None if not found - Args: - layer_id (string): unique layer id, stored in 'uuid' field - - Returns: - (PSItem) or None - """ - layers = self.get_layers() - for layer in layers: - if str(layer.id) == str(layer_id): - return layer - - def get_layers_in_layers(self, layers): - """Return all layers that belong to layers (might be groups). - - Args: - layers : - - Returns: - - """ - parent_ids = set([lay.id for lay in layers]) - - return self._get_layers_in_layers(parent_ids) - - def get_layers_in_layers_ids(self, layers_ids, layers=None): - """Return all layers that belong to layers (might be groups). - - Args: - layers_ids - layers : - - Returns: - - """ - parent_ids = set(layers_ids) - - return self._get_layers_in_layers(parent_ids, layers) - - def _get_layers_in_layers(self, parent_ids, layers=None): - if not layers: - layers = self.get_layers() - - all_layers = layers - ret = [] - - for layer in all_layers: - parents = set(layer.parents) - if len(parent_ids & parents) > 0: - ret.append(layer) - if layer.id in parent_ids: - ret.append(layer) - - return ret - - def create_group(self, name): - """Create new group (eg. LayerSet) - - Returns: - - """ - enhanced_name = self.PUBLISH_ICON + name - ret = self.websocketserver.call( - self.client.call('Photoshop.create_group', name=enhanced_name) - ) - # create group on PS is asynchronous, returns only id - return PSItem(id=ret, name=name, group=True) - - def group_selected_layers(self, name): - """Group selected layers into new LayerSet (eg. group) - - Returns: - (Layer) - """ - enhanced_name = self.PUBLISH_ICON + name - res = self.websocketserver.call( - self.client.call( - 'Photoshop.group_selected_layers', name=enhanced_name - ) - ) - res = self._to_records(res) - if res: - rec = res.pop() - rec.name = rec.name.replace(self.PUBLISH_ICON, '') - return rec - raise ValueError("No group record returned") - - def get_selected_layers(self): - """Get a list of actually selected layers. - - Returns: - """ - res = self.websocketserver.call( - self.client.call('Photoshop.get_selected_layers') - ) - return self._to_records(res) - - def select_layers(self, layers): - """Selects specified layers in Photoshop by its ids. - - Args: - layers: - """ - layers_id = [str(lay.id) for lay in layers] - self.websocketserver.call( - self.client.call( - 'Photoshop.select_layers', - layers=json.dumps(layers_id) - ) - ) - - def get_active_document_full_name(self): - """Returns full name with path of active document via ws call - - Returns(string): - full path with name - """ - res = self.websocketserver.call( - self.client.call('Photoshop.get_active_document_full_name') - ) - - return res - - def get_active_document_name(self): - """Returns just a name of active document via ws call - - Returns(string): - file name - """ - return self.websocketserver.call( - self.client.call('Photoshop.get_active_document_name') - ) - - def is_saved(self): - """Returns true if no changes in active document - - Returns: - - """ - return self.websocketserver.call( - self.client.call('Photoshop.is_saved') - ) - - def save(self): - """Saves active document""" - self.websocketserver.call( - self.client.call('Photoshop.save') - ) - - def saveAs(self, image_path, ext, as_copy): - """Saves active document to psd (copy) or png or jpg - - Args: - image_path(string): full local path - ext: - as_copy: - Returns: None - """ - self.websocketserver.call( - self.client.call( - 'Photoshop.saveAs', - image_path=image_path, - ext=ext, - as_copy=as_copy - ) - ) - - def set_visible(self, layer_id, visibility): - """Set layer with 'layer_id' to 'visibility' - - Args: - layer_id: - visibility: - Returns: None - """ - self.websocketserver.call( - self.client.call( - 'Photoshop.set_visible', - layer_id=layer_id, - visibility=visibility - ) - ) - - def hide_all_others_layers(self, layers): - """hides all layers that are not part of the list or that are not - children of this list - - Args: - layers (list): list of PSItem - highest hierarchy - """ - extract_ids = set([ll.id for ll in self.get_layers_in_layers(layers)]) - - self.hide_all_others_layers_ids(extract_ids) - - def hide_all_others_layers_ids(self, extract_ids, layers=None): - """hides all layers that are not part of the list or that are not - children of this list - - Args: - extract_ids (list): list of integer that should be visible - layers (list) of PSItem (used for caching) - """ - if not layers: - layers = self.get_layers() - for layer in layers: - if layer.visible and layer.id not in extract_ids: - self.set_visible(layer.id, False) - - def get_layers_metadata(self): - """Reads layers metadata from Headline from active document in PS. - (Headline accessible by File > File Info) - - Returns: - (list) - example: - {"8":{"active":true,"productName":"imageBG", - "productType":"image","id":"ayon.create.instance", - "folderPath":"/Town"}} - 8 is layer(group) id - used for deletion, update etc. - """ - res = self.websocketserver.call(self.client.call('Photoshop.read')) - layers_data = [] - try: - if res: - layers_data = json.loads(res) - except json.decoder.JSONDecodeError: - raise ValueError("{} cannot be parsed, recreate meta".format(res)) - # format of metadata changed from {} to [] because of standardization - # keep current implementation logic as its working - if isinstance(layers_data, dict): - for layer_id, layer_meta in layers_data.items(): - if layer_meta.get("schema") != "openpype:container-2.0": - layer_meta["members"] = [str(layer_id)] - layers_data = list(layers_data.values()) - return layers_data - - def import_smart_object(self, path, layer_name, as_reference=False): - """Import the file at `path` as a smart object to active document. - - Args: - path (str): File path to import. - layer_name (str): Unique layer name to differentiate how many times - same smart object was loaded - as_reference (bool): pull in content or reference - """ - enhanced_name = self.LOADED_ICON + layer_name - res = self.websocketserver.call( - self.client.call( - 'Photoshop.import_smart_object', - path=path, - name=enhanced_name, - as_reference=as_reference - ) - ) - rec = self._to_records(res).pop() - if rec: - rec.name = rec.name.replace(self.LOADED_ICON, '') - return rec - - def replace_smart_object(self, layer, path, layer_name): - """Replace the smart object `layer` with file at `path` - - Args: - layer (PSItem): - path (str): File to import. - layer_name (str): Unique layer name to differentiate how many times - same smart object was loaded - """ - enhanced_name = self.LOADED_ICON + layer_name - self.websocketserver.call( - self.client.call( - 'Photoshop.replace_smart_object', - layer_id=layer.id, - path=path, - name=enhanced_name - ) - ) - - def delete_layer(self, layer_id): - """Deletes specific layer by it's id. - - Args: - layer_id (int): id of layer to delete - """ - self.websocketserver.call( - self.client.call('Photoshop.delete_layer', layer_id=layer_id) - ) - - def rename_layer(self, layer_id, name): - """Renames specific layer by it's id. - - Args: - layer_id (int): id of layer to delete - name (str): new name - """ - self.websocketserver.call( - self.client.call( - 'Photoshop.rename_layer', - layer_id=layer_id, - name=name - ) - ) - - def remove_instance(self, instance_id): - cleaned_data = [] - - for item in self.get_layers_metadata(): - inst_id = item.get("instance_id") or item.get("uuid") - if inst_id != instance_id: - cleaned_data.append(item) - - payload = json.dumps(cleaned_data, indent=4) - - self.websocketserver.call( - self.client.call('Photoshop.imprint', payload=payload) - ) - - def get_extension_version(self): - """Returns version number of installed extension.""" - return self.websocketserver.call( - self.client.call('Photoshop.get_extension_version') - ) - - def close(self): - """Shutting down PS and process too. - - For webpublishing only. - """ - # TODO change client.call to method with checks for client - self.websocketserver.call(self.client.call('Photoshop.close')) - - def _to_records(self, res): - """Converts string json representation into list of PSItem for - dot notation access to work. - - Args: - res (string): valid json - - Returns: - - """ - try: - layers_data = json.loads(res) - except json.decoder.JSONDecodeError: - raise ValueError("Received broken JSON {}".format(res)) - ret = [] - - # convert to AEItem to use dot donation - if isinstance(layers_data, dict): - layers_data = [layers_data] - for d in layers_data: - # currently implemented and expected fields - ret.append(PSItem( - d.get('id'), - d.get('name'), - d.get('group'), - d.get('parents'), - d.get('visible'), - d.get('type'), - d.get('members'), - d.get('long_name'), - d.get("color_code"), - d.get("instance_id") - )) - return ret diff --git a/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py b/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py deleted file mode 100644 index ff60c2f40d..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py +++ /dev/null @@ -1,88 +0,0 @@ -import os -import platform -import subprocess - -from ayon_core.lib import ( - get_ayon_launcher_args, - is_using_ayon_console, -) -from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_photoshop import get_launch_script_path - - -def get_launch_kwargs(kwargs): - """Explicit setting of kwargs for Popen for Photoshop. - - Expected behavior - - ayon_console opens window with logs - - ayon has stdout/stderr available for capturing - - Args: - kwargs (Union[dict, None]): Current kwargs or None. - - """ - if kwargs is None: - kwargs = {} - - if platform.system().lower() != "windows": - return kwargs - - if not is_using_ayon_console(): - kwargs.update({ - "creationflags": subprocess.CREATE_NEW_CONSOLE - }) - else: - kwargs.update({ - "creationflags": subprocess.CREATE_NO_WINDOW, - "stdout": subprocess.DEVNULL, - "stderr": subprocess.DEVNULL - }) - return kwargs - - -class PhotoshopPrelaunchHook(PreLaunchHook): - """Launch arguments preparation. - - Hook add python executable and script path to Photoshop implementation - before Photoshop executable and add last workfile path to launch arguments. - - Existence of last workfile is checked. If workfile does not exists tries - to copy templated workfile from predefined path. - """ - app_groups = {"photoshop"} - - order = 20 - launch_types = {LaunchTypes.local} - - def execute(self): - # Pop executable - executable_path = self.launch_context.launch_args.pop(0) - - # Pop rest of launch arguments - There should not be other arguments! - remainders = [] - while self.launch_context.launch_args: - remainders.append(self.launch_context.launch_args.pop(0)) - - script_path = get_launch_script_path() - - new_launch_args = get_ayon_launcher_args( - "run", script_path, executable_path - ) - # Add workfile path if exists - workfile_path = self.data["last_workfile_path"] - if ( - self.data.get("start_last_workfile") - and workfile_path - and os.path.exists(workfile_path) - ): - new_launch_args.append(workfile_path) - - # Append as whole list as these arguments should not be separated - self.launch_context.launch_args.append(new_launch_args) - - if remainders: - self.launch_context.launch_args.extend(remainders) - - self.launch_context.kwargs = get_launch_kwargs( - self.launch_context.kwargs - ) diff --git a/server_addon/photoshop/client/ayon_photoshop/lib.py b/server_addon/photoshop/client/ayon_photoshop/lib.py deleted file mode 100644 index 9dc90953c5..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/lib.py +++ /dev/null @@ -1,127 +0,0 @@ -import re - -import ayon_api - -from ayon_core.lib import prepare_template_data -from ayon_core.pipeline import ( - AutoCreator, - CreatedInstance -) -from ayon_photoshop import api -from ayon_photoshop.api.pipeline import cache_and_get_instances - - -class PSAutoCreator(AutoCreator): - """Generic autocreator to extend.""" - def get_instance_attr_defs(self): - return [] - - def collect_instances(self): - for instance_data in cache_and_get_instances(self): - creator_id = instance_data.get("creator_identifier") - - if creator_id == self.identifier: - instance = CreatedInstance.from_existing( - instance_data, self - ) - self._add_instance_to_context(instance) - - def update_instances(self, update_list): - self.log.debug("update_list:: {}".format(update_list)) - for created_inst, _changes in update_list: - api.stub().imprint(created_inst.get("instance_id"), - created_inst.data_to_store()) - - def create(self, options=None): - existing_instance = None - for instance in self.create_context.instances: - if instance.product_type == self.product_type: - existing_instance = instance - break - - context = self.create_context - project_name = context.get_current_project_name() - folder_path = context.get_current_folder_path() - task_name = context.get_current_task_name() - host_name = context.host_name - - if existing_instance is None: - existing_instance_folder = None - else: - existing_instance_folder = existing_instance["folderPath"] - - if existing_instance is None: - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - self.default_variant, - host_name, - ) - data = { - "folderPath": folder_path, - "task": task_name, - "variant": self.default_variant - } - data.update(self.get_dynamic_data( - project_name, - folder_entity, - task_entity, - self.default_variant, - host_name, - None - )) - - if not self.active_on_create: - data["active"] = False - - new_instance = CreatedInstance( - self.product_type, product_name, data, self - ) - self._add_instance_to_context(new_instance) - api.stub().imprint(new_instance.get("instance_id"), - new_instance.data_to_store()) - - elif ( - existing_instance_folder != folder_path - or existing_instance["task"] != task_name - ): - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - self.default_variant, - host_name, - ) - existing_instance["folderPath"] = folder_path - existing_instance["task"] = task_name - existing_instance["productName"] = product_name - - -def clean_product_name(product_name): - """Clean all variants leftover {layer} from product name.""" - dynamic_data = prepare_template_data({"layer": "{layer}"}) - for value in dynamic_data.values(): - if value in product_name: - product_name = ( - product_name - .replace(value, "") - .replace("__", "_") - .replace("..", ".") - ) - # clean trailing separator as Main_ - pattern = r'[\W_]+$' - replacement = '' - return re.sub(pattern, replacement, product_name) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py deleted file mode 100644 index a467a5ecaa..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py +++ /dev/null @@ -1,156 +0,0 @@ -import ayon_api - -from ayon_photoshop import api -from ayon_photoshop.lib import PSAutoCreator, clean_product_name -from ayon_core.lib import BoolDef, prepare_template_data -from ayon_core.pipeline.create import get_product_name, CreatedInstance - - -class AutoImageCreator(PSAutoCreator): - """Creates flatten image from all visible layers. - - Used in simplified publishing as auto created instance. - Must be enabled in Setting and template for product name provided - """ - identifier = "auto_image" - product_type = "image" - - # Settings - default_variant = "" - # - Mark by default instance for review - mark_for_review = True - active_on_create = True - - def create(self, options=None): - existing_instance = None - for instance in self.create_context.instances: - if instance.creator_identifier == self.identifier: - existing_instance = instance - break - - context = self.create_context - project_name = context.get_current_project_name() - folder_path = context.get_current_folder_path() - task_name = context.get_current_task_name() - host_name = context.host_name - folder_entity = ayon_api.get_folder_by_path(project_name, folder_path) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - - existing_folder_path = None - if existing_instance is not None: - existing_folder_path = existing_instance["folderPath"] - - if existing_instance is None: - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - self.default_variant, - host_name, - ) - - data = { - "folderPath": folder_path, - "task": task_name, - } - - if not self.active_on_create: - data["active"] = False - - creator_attributes = {"mark_for_review": self.mark_for_review} - data.update({"creator_attributes": creator_attributes}) - - new_instance = CreatedInstance( - self.product_type, product_name, data, self - ) - self._add_instance_to_context(new_instance) - api.stub().imprint(new_instance.get("instance_id"), - new_instance.data_to_store()) - - elif ( # existing instance from different context - existing_folder_path != folder_path - or existing_instance["task"] != task_name - ): - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - self.default_variant, - host_name, - ) - existing_instance["folderPath"] = folder_path - existing_instance["task"] = task_name - existing_instance["productName"] = product_name - - api.stub().imprint(existing_instance.get("instance_id"), - existing_instance.data_to_store()) - - def get_pre_create_attr_defs(self): - return [ - BoolDef( - "mark_for_review", - label="Review", - default=self.mark_for_review - ) - ] - - def get_instance_attr_defs(self): - return [ - BoolDef( - "mark_for_review", - label="Review" - ) - ] - - def apply_settings(self, project_settings): - plugin_settings = ( - project_settings["photoshop"]["create"]["AutoImageCreator"] - ) - - self.active_on_create = plugin_settings["active_on_create"] - self.default_variant = plugin_settings["default_variant"] - self.mark_for_review = plugin_settings["mark_for_review"] - self.enabled = plugin_settings["enabled"] - - def get_detail_description(self): - return """Creator for flatten image. - - Studio might configure simple publishing workflow. In that case - `image` instance is automatically created which will publish flat - image from all visible layers. - - Artist might disable this instance from publishing or from creating - review for it though. - """ - - def get_product_name( - self, - project_name, - folder_entity, - task_entity, - variant, - host_name=None, - instance=None - ): - if host_name is None: - host_name = self.create_context.host_name - - task_name = task_type = None - if task_entity: - task_name = task_entity["name"] - task_type = task_entity["taskType"] - - dynamic_data = prepare_template_data({"layer": "{layer}"}) - - product_name = get_product_name( - project_name, - task_name, - task_type, - host_name, - self.product_type, - variant, - dynamic_data=dynamic_data - ) - return clean_product_name(product_name) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py deleted file mode 100644 index 0170306301..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py +++ /dev/null @@ -1,265 +0,0 @@ -import re - -from ayon_core.lib import BoolDef -from ayon_core.pipeline import ( - Creator, - CreatedInstance, - CreatorError -) -from ayon_core.lib import prepare_template_data -from ayon_core.pipeline.create import PRODUCT_NAME_ALLOWED_SYMBOLS -from ayon_photoshop import api -from ayon_photoshop.api.pipeline import cache_and_get_instances -from ayon_photoshop.lib import clean_product_name - - -class ImageCreator(Creator): - """Creates image instance for publishing. - - Result of 'image' instance is image of all visible layers, or image(s) of - selected layers. - """ - identifier = "image" - label = "Image" - product_type = "image" - description = "Image creator" - - # Settings - default_variants = "" - mark_for_review = False - active_on_create = True - - def create(self, product_name_from_ui, data, pre_create_data): - groups_to_create = [] - top_layers_to_wrap = [] - create_empty_group = False - - stub = api.stub() # only after PS is up - if pre_create_data.get("use_selection"): - try: - top_level_selected_items = stub.get_selected_layers() - except ValueError: - raise CreatorError("Cannot group locked Background layer!") - - only_single_item_selected = len(top_level_selected_items) == 1 - if ( - only_single_item_selected or - pre_create_data.get("create_multiple")): - for selected_item in top_level_selected_items: - if selected_item.group: - groups_to_create.append(selected_item) - else: - top_layers_to_wrap.append(selected_item) - else: - group = stub.group_selected_layers(product_name_from_ui) - groups_to_create.append(group) - else: - try: - stub.select_layers(stub.get_layers()) - group = stub.group_selected_layers(product_name_from_ui) - except ValueError: - raise CreatorError("Cannot group locked Background layer!") - - groups_to_create.append(group) - - # create empty group if nothing selected - if not groups_to_create and not top_layers_to_wrap: - group = stub.create_group(product_name_from_ui) - groups_to_create.append(group) - - # wrap each top level layer into separate new group - for layer in top_layers_to_wrap: - stub.select_layers([layer]) - group = stub.group_selected_layers(layer.name) - groups_to_create.append(group) - - layer_name = '' - # use artist chosen option OR force layer if more products are created - # to differentiate them - use_layer_name = (pre_create_data.get("use_layer_name") or - len(groups_to_create) > 1) - for group in groups_to_create: - product_name = product_name_from_ui # reset to name from creator UI - layer_names_in_hierarchy = [] - created_group_name = self._clean_highlights(stub, group.name) - - if use_layer_name: - layer_name = re.sub( - "[^{}]+".format(PRODUCT_NAME_ALLOWED_SYMBOLS), - "", - group.name - ) - if "{layer}" not in product_name.lower(): - product_name += "{Layer}" - - layer_fill = prepare_template_data({"layer": layer_name}) - product_name = product_name.format(**layer_fill) - product_name = clean_product_name(product_name) - - if group.long_name: - for directory in group.long_name[::-1]: - name = self._clean_highlights(stub, directory) - layer_names_in_hierarchy.append(name) - - data_update = { - "productName": product_name, - "members": [str(group.id)], - "layer_name": layer_name, - "long_name": "_".join(layer_names_in_hierarchy) - } - data.update(data_update) - - mark_for_review = (pre_create_data.get("mark_for_review") or - self.mark_for_review) - creator_attributes = {"mark_for_review": mark_for_review} - data.update({"creator_attributes": creator_attributes}) - - if not self.active_on_create: - data["active"] = False - - new_instance = CreatedInstance( - self.product_type, product_name, data, self - ) - - stub.imprint(new_instance.get("instance_id"), - new_instance.data_to_store()) - self._add_instance_to_context(new_instance) - # reusing existing group, need to rename afterwards - if not create_empty_group: - stub.rename_layer(group.id, - stub.PUBLISH_ICON + created_group_name) - - def collect_instances(self): - for instance_data in cache_and_get_instances(self): - # legacy instances have family=='image' - creator_id = (instance_data.get("creator_identifier") or - instance_data.get("family")) - - if creator_id == self.identifier: - instance_data = self._handle_legacy(instance_data) - instance = CreatedInstance.from_existing( - instance_data, self - ) - self._add_instance_to_context(instance) - - def update_instances(self, update_list): - self.log.debug("update_list:: {}".format(update_list)) - for created_inst, _changes in update_list: - if created_inst.get("layer"): - # not storing PSItem layer to metadata - created_inst.pop("layer") - api.stub().imprint(created_inst.get("instance_id"), - created_inst.data_to_store()) - - def remove_instances(self, instances): - for instance in instances: - self.host.remove_instance(instance) - self._remove_instance_from_context(instance) - - def get_pre_create_attr_defs(self): - output = [ - BoolDef("use_selection", default=True, - label="Create only for selected"), - BoolDef("create_multiple", - default=True, - label="Create separate instance for each selected"), - BoolDef("use_layer_name", - default=False, - label="Use layer name in product"), - BoolDef( - "mark_for_review", - label="Create separate review", - default=False - ) - ] - return output - - def get_instance_attr_defs(self): - return [ - BoolDef( - "mark_for_review", - label="Review" - ) - ] - - def apply_settings(self, project_settings): - plugin_settings = ( - project_settings["photoshop"]["create"]["ImageCreator"] - ) - - self.active_on_create = plugin_settings["active_on_create"] - self.default_variants = plugin_settings["default_variants"] - self.mark_for_review = plugin_settings["mark_for_review"] - self.enabled = plugin_settings["enabled"] - - def get_detail_description(self): - return """Creator for Image instances - - Main publishable item in Photoshop will be of `image` product type. - Result of this item (instance) is picture that could be loaded and - used in another DCCs (for example as single layer in composition in - AfterEffects, reference in Maya etc). - - There are couple of options what to publish: - - separate image per selected layer (or group of layers) - - one image for all selected layers - - all visible layers (groups) flattened into single image - - In most cases you would like to keep `Create only for selected` - toggled on and select what you would like to publish. - Toggling this option off will allow you to create instance for all - visible layers without a need to select them explicitly. - - Use 'Create separate instance for each selected' to create separate - images per selected layer (group of layers). - - 'Use layer name in product' will explicitly add layer name into - product name. Position of this name is configurable in - `project_settings/global/tools/creator/product_name_profiles`. - If layer placeholder ({layer}) is not used in `product_name_profiles` - but layer name should be used (set explicitly in UI or implicitly if - multiple images should be created), it is added in capitalized form - as a suffix to product name. - - Each image could have its separate review created if necessary via - `Create separate review` toggle. - But more use case is to use separate `review` instance to create review - from all published items. - """ - - def _handle_legacy(self, instance_data): - """Converts old instances to new format.""" - if not instance_data.get("members"): - instance_data["members"] = [instance_data.get("uuid")] - - if instance_data.get("uuid"): - # uuid not needed, replaced with unique instance_id - api.stub().remove_instance(instance_data.get("uuid")) - instance_data.pop("uuid") - - if not instance_data.get("task"): - instance_data["task"] = self.create_context.get_current_task_name() - - if not instance_data.get("variant"): - instance_data["variant"] = '' - - return instance_data - - def _clean_highlights(self, stub, item): - return item.replace(stub.PUBLISH_ICON, '').replace(stub.LOADED_ICON, - '') - - def get_dynamic_data( - self, - project_name, - folder_entity, - task_entity, - variant, - host_name, - instance - ): - if instance is not None: - layer_name = instance.get("layer_name") - if layer_name: - return {"layer": layer_name} - return {"layer": "{layer}"} diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py deleted file mode 100644 index 60c64b3831..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py +++ /dev/null @@ -1,28 +0,0 @@ -from ayon_photoshop.lib import PSAutoCreator - - -class ReviewCreator(PSAutoCreator): - """Creates review instance which might be disabled from publishing.""" - identifier = "review" - product_type = "review" - - default_variant = "Main" - - def get_detail_description(self): - return """Auto creator for review. - - Photoshop review is created from all published images or from all - visible layers if no `image` instances got created. - - Review might be disabled by an artist (instance shouldn't be deleted as - it will get recreated in next publish either way). - """ - - def apply_settings(self, project_settings): - plugin_settings = ( - project_settings["photoshop"]["create"]["ReviewCreator"] - ) - - self.default_variant = plugin_settings["default_variant"] - self.active_on_create = plugin_settings["active_on_create"] - self.enabled = plugin_settings["enabled"] diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py deleted file mode 100644 index ce44a1ad2d..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py +++ /dev/null @@ -1,28 +0,0 @@ -from ayon_photoshop.lib import PSAutoCreator - - -class WorkfileCreator(PSAutoCreator): - identifier = "workfile" - product_type = "workfile" - - default_variant = "Main" - - def get_detail_description(self): - return """Auto creator for workfile. - - It is expected that each publish will also publish its source workfile - for safekeeping. This creator triggers automatically without need for - an artist to remember and trigger it explicitly. - - Workfile instance could be disabled if it is not required to publish - workfile. (Instance shouldn't be deleted though as it will be recreated - in next publish automatically). - """ - - def apply_settings(self, project_settings): - plugin_settings = ( - project_settings["photoshop"]["create"]["WorkfileCreator"] - ) - - self.active_on_create = plugin_settings["active_on_create"] - self.enabled = plugin_settings["enabled"] diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py deleted file mode 100644 index e3d80f6957..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py +++ /dev/null @@ -1,86 +0,0 @@ -import re - -from ayon_core.pipeline import get_representation_path -from ayon_photoshop import api as photoshop -from ayon_photoshop.api import get_unique_layer_name - - -class ImageLoader(photoshop.PhotoshopLoader): - """Load images - - Stores the imported asset in a container named after the asset. - """ - - product_types = {"image", "render"} - representations = {"*"} - - def load(self, context, name=None, namespace=None, data=None): - stub = self.get_stub() - layer_name = get_unique_layer_name( - stub.get_layers(), - context["folder"]["name"], - name - ) - with photoshop.maintained_selection(): - path = self.filepath_from_context(context) - layer = self.import_layer(path, layer_name, stub) - - self[:] = [layer] - namespace = namespace or layer_name - - return photoshop.containerise( - name, - namespace, - layer, - context, - self.__class__.__name__ - ) - - def update(self, container, context): - """ Switch asset or change version """ - stub = self.get_stub() - - layer = container.pop("layer") - - repre_entity = context["representation"] - folder_name = context["folder"]["name"] - product_name = context["product"]["name"] - - namespace_from_container = re.sub(r'_\d{3}$', '', - container["namespace"]) - layer_name = "{}_{}".format(folder_name, product_name) - # switching assets - if namespace_from_container != layer_name: - layer_name = get_unique_layer_name( - stub.get_layers(), folder_name, product_name - ) - else: # switching version - keep same name - layer_name = container["namespace"] - - path = get_representation_path(repre_entity) - with photoshop.maintained_selection(): - stub.replace_smart_object( - layer, path, layer_name - ) - - stub.imprint( - layer.id, {"representation": repre_entity["id"]} - ) - - def remove(self, container): - """ - Removes element from scene: deletes layer + removes from Headline - Args: - container (dict): container to be removed - used to get layer_id - """ - stub = self.get_stub() - - layer = container.pop("layer") - stub.imprint(layer.id, {}) - stub.delete_layer(layer.id) - - def switch(self, container, context): - self.update(container, context) - - def import_layer(self, file_name, layer_name, stub): - return stub.import_smart_object(file_name, layer_name) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py deleted file mode 100644 index f69dce26f6..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py +++ /dev/null @@ -1,95 +0,0 @@ -import os - -import qargparse - -from ayon_photoshop import api as photoshop -from ayon_photoshop.api import get_unique_layer_name - - -class ImageFromSequenceLoader(photoshop.PhotoshopLoader): - """ Load specific image from sequence - - Used only as quick load of reference file from a sequence. - - Plain ImageLoader picks first frame from sequence. - - Loads only existing files - currently not possible to limit loaders - to single select - multiselect. If user selects multiple repres, list - for all of them is provided, but selection is only single file. - This loader will be triggered multiple times, but selected name will - match only to proper path. - - Loader doesn't do containerization as there is currently no data model - of 'frame of rendered files' (only rendered sequence), update would be - difficult. - """ - - product_types = {"render"} - representations = {"*"} - options = [] - - def load(self, context, name=None, namespace=None, data=None): - - path = self.filepath_from_context(context) - if data.get("frame"): - path = os.path.join( - os.path.dirname(path), data["frame"] - ) - if not os.path.exists(path): - return - - stub = self.get_stub() - layer_name = get_unique_layer_name( - stub.get_layers(), context["folder"]["name"], name - ) - - with photoshop.maintained_selection(): - layer = stub.import_smart_object(path, layer_name) - - self[:] = [layer] - namespace = namespace or layer_name - - return namespace - - @classmethod - def get_options(cls, repre_contexts): - """ - Returns list of files for selected 'repre_contexts'. - - It returns only files with same extension as in context as it is - expected that context points to sequence of frames. - - Returns: - (list) of qargparse.Choice - """ - files = [] - for context in repre_contexts: - fname = cls.filepath_from_context(context) - _, file_extension = os.path.splitext(fname) - - for file_name in os.listdir(os.path.dirname(fname)): - if not file_name.endswith(file_extension): - continue - files.append(file_name) - - # return selection only if there is something - if not files or len(files) <= 1: - return [] - - return [ - qargparse.Choice( - "frame", - label="Select specific file", - items=files, - default=0, - help="Which frame should be loaded?" - ) - ] - - def update(self, container, context): - """No update possible, not containerized.""" - pass - - def remove(self, container): - """No update possible, not containerized.""" - pass diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py deleted file mode 100644 index 21076f6a4f..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py +++ /dev/null @@ -1,87 +0,0 @@ -import re - -from ayon_core.pipeline import get_representation_path -from ayon_photoshop import api as photoshop -from ayon_photoshop.api import get_unique_layer_name - - -class ReferenceLoader(photoshop.PhotoshopLoader): - """Load reference images - - Stores the imported asset in a container named after the asset. - - Inheriting from 'load_image' didn't work because of - "Cannot write to closing transport", possible refactor. - """ - - product_types = {"image", "render"} - representations = {"*"} - - def load(self, context, name=None, namespace=None, data=None): - stub = self.get_stub() - layer_name = get_unique_layer_name( - stub.get_layers(), context["folder"]["name"], name - ) - with photoshop.maintained_selection(): - path = self.filepath_from_context(context) - layer = self.import_layer(path, layer_name, stub) - - self[:] = [layer] - namespace = namespace or layer_name - - return photoshop.containerise( - name, - namespace, - layer, - context, - self.__class__.__name__ - ) - - def update(self, container, context): - """ Switch asset or change version.""" - stub = self.get_stub() - layer = container.pop("layer") - - folder_name = context["folder"]["name"] - product_name = context["product"]["name"] - repre_entity = context["representation"] - - namespace_from_container = re.sub(r'_\d{3}$', '', - container["namespace"]) - layer_name = "{}_{}".format(folder_name, product_name) - # switching assets - if namespace_from_container != layer_name: - layer_name = get_unique_layer_name( - stub.get_layers(), folder_name, product_name - ) - else: # switching version - keep same name - layer_name = container["namespace"] - - path = get_representation_path(repre_entity) - with photoshop.maintained_selection(): - stub.replace_smart_object( - layer, path, layer_name - ) - - stub.imprint( - layer.id, {"representation": repre_entity["id"]} - ) - - def remove(self, container): - """Removes element from scene: deletes layer + removes from Headline - - Args: - container (dict): container to be removed - used to get layer_id - """ - stub = self.get_stub() - layer = container.pop("layer") - stub.imprint(layer.id, {}) - stub.delete_layer(layer.id) - - def switch(self, container, context): - self.update(container, context) - - def import_layer(self, file_name, layer_name, stub): - return stub.import_smart_object( - file_name, layer_name, as_reference=True - ) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py deleted file mode 100644 index 2cdc9fa1e8..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -"""Close PS after publish. For Webpublishing only.""" -import pyblish.api - -from ayon_photoshop import api as photoshop - - -class ClosePS(pyblish.api.ContextPlugin): - """Close PS after publish. For Webpublishing only. - """ - - order = pyblish.api.IntegratorOrder + 14 - label = "Close PS" - optional = True - active = True - - hosts = ["photoshop"] - targets = ["automated"] - - def process(self, context): - self.log.info("ClosePS") - - stub = photoshop.stub() - self.log.info("Shutting down PS") - stub.save() - stub.close() - self.log.info("PS closed") diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py deleted file mode 100644 index 23a71bdf46..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py +++ /dev/null @@ -1,106 +0,0 @@ -import pyblish.api - -from ayon_photoshop import api as photoshop -from ayon_core.pipeline.create import get_product_name - - -class CollectAutoImage(pyblish.api.ContextPlugin): - """Creates auto image in non artist based publishes (Webpublisher). - """ - - label = "Collect Auto Image" - hosts = ["photoshop"] - order = pyblish.api.CollectorOrder + 0.2 - - targets = ["automated"] - - def process(self, context): - for instance in context: - creator_identifier = instance.data.get("creator_identifier") - if creator_identifier and creator_identifier == "auto_image": - self.log.debug("Auto image instance found, won't create new") - return - - project_name = context.data["projectName"] - proj_settings = context.data["project_settings"] - host_name = context.data["hostName"] - folder_entity = context.data["folderEntity"] - task_entity = context.data["taskEntity"] - task_name = task_type = None - if task_entity: - task_name = task_entity["name"] - task_type = task_entity["taskType"] - - auto_creator = proj_settings.get( - "photoshop", {}).get( - "create", {}).get( - "AutoImageCreator", {}) - - if not auto_creator or not auto_creator["enabled"]: - self.log.debug("Auto image creator disabled, won't create new") - return - - stub = photoshop.stub() - stored_items = stub.get_layers_metadata() - for item in stored_items: - if item.get("creator_identifier") == "auto_image": - if not item.get("active"): - self.log.debug("Auto_image instance disabled") - return - - layer_items = stub.get_layers() - - publishable_ids = [layer.id for layer in layer_items - if layer.visible] - - # collect stored image instances - instance_names = [] - for layer_item in layer_items: - layer_meta_data = stub.read(layer_item, stored_items) - - # Skip layers without metadata. - if layer_meta_data is None: - continue - - # Skip containers. - if "container" in layer_meta_data["id"]: - continue - - # active might not be in legacy meta - if layer_meta_data.get("active", True) and layer_item.visible: - instance_names.append(layer_meta_data["productName"]) - - if len(instance_names) == 0: - variants = proj_settings.get( - "photoshop", {}).get( - "create", {}).get( - "CreateImage", {}).get( - "default_variants", ['']) - product_type = "image" - - variant = context.data.get("variant") or variants[0] - - product_name = get_product_name( - project_name, - task_name, - task_type, - host_name, - product_type, - variant, - ) - - instance = context.create_instance(product_name) - instance.data["folderPath"] = folder_entity["path"] - instance.data["productType"] = product_type - instance.data["productName"] = product_name - instance.data["ids"] = publishable_ids - instance.data["publish"] = True - instance.data["creator_identifier"] = "auto_image" - instance.data["family"] = product_type - instance.data["families"] = [product_type] - - if auto_creator["mark_for_review"]: - instance.data["creator_attributes"] = {"mark_for_review": True} - instance.data["families"].append("review") - - self.log.info("auto image instance: {} ".format(instance.data)) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py deleted file mode 100644 index 108b65232a..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py +++ /dev/null @@ -1,23 +0,0 @@ -import pyblish.api - -from ayon_photoshop import api as photoshop - - -class CollectAutoImageRefresh(pyblish.api.ContextPlugin): - """Refreshes auto_image instance with currently visible layers.. - """ - - label = "Collect Auto Image Refresh" - hosts = ["photoshop"] - order = pyblish.api.CollectorOrder + 0.2 - - def process(self, context): - for instance in context: - creator_identifier = instance.data.get("creator_identifier") - if creator_identifier and creator_identifier == "auto_image": - self.log.debug("Auto image instance found, won't create new") - # refresh existing auto image instance with current visible - publishable_ids = [layer.id for layer in photoshop.stub().get_layers() # noqa - if layer.visible] - instance.data["ids"] = publishable_ids - return diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py deleted file mode 100644 index 8b84e69309..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py +++ /dev/null @@ -1,96 +0,0 @@ -""" -Requires: - None - -Provides: - instance -> productType ("review") -""" -import pyblish.api - -from ayon_photoshop import api as photoshop -from ayon_core.pipeline.create import get_product_name - - -class CollectAutoReview(pyblish.api.ContextPlugin): - """Create review instance in non artist based workflow. - - Called only if PS is triggered in Webpublisher or in tests. - """ - - label = "Collect Auto Review" - hosts = ["photoshop"] - order = pyblish.api.CollectorOrder + 0.2 - targets = ["automated"] - - publish = True - - def process(self, context): - product_type = "review" - has_review = False - for instance in context: - if instance.data["productType"] == product_type: - self.log.debug("Review instance found, won't create new") - has_review = True - - creator_attributes = instance.data.get("creator_attributes", {}) - if (creator_attributes.get("mark_for_review") and - "review" not in instance.data["families"]): - instance.data["families"].append("review") - - if has_review: - return - - stub = photoshop.stub() - stored_items = stub.get_layers_metadata() - for item in stored_items: - if item.get("creator_identifier") == product_type: - if not item.get("active"): - self.log.debug("Review instance disabled") - return - - auto_creator = context.data["project_settings"].get( - "photoshop", {}).get( - "create", {}).get( - "ReviewCreator", {}) - - if not auto_creator or not auto_creator["enabled"]: - self.log.debug("Review creator disabled, won't create new") - return - - variant = (context.data.get("variant") or - auto_creator["default_variant"]) - - project_name = context.data["projectName"] - proj_settings = context.data["project_settings"] - host_name = context.data["hostName"] - folder_entity = context.data["folderEntity"] - task_entity = context.data["taskEntity"] - task_name = task_type = None - if task_entity: - task_name = task_entity["name"] - task_type = task_entity["taskType"] - - product_name = get_product_name( - project_name, - task_name, - task_type, - host_name, - product_type, - variant, - project_settings=proj_settings - ) - - instance = context.create_instance(product_name) - instance.data.update({ - "label": product_name, - "name": product_name, - "productName": product_name, - "productType": product_type, - "family": product_type, - "families": [product_type], - "representations": [], - "folderPath": folder_entity["path"], - "publish": self.publish - }) - - self.log.debug("auto review created::{}".format(instance.data)) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py deleted file mode 100644 index 1bf7c1a600..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py +++ /dev/null @@ -1,104 +0,0 @@ -import os -import pyblish.api - -from ayon_photoshop import api as photoshop -from ayon_core.pipeline.create import get_product_name - - -class CollectAutoWorkfile(pyblish.api.ContextPlugin): - """Collect current script for publish.""" - - order = pyblish.api.CollectorOrder + 0.2 - label = "Collect Workfile" - hosts = ["photoshop"] - - targets = ["automated"] - - def process(self, context): - product_type = "workfile" - file_path = context.data["currentFile"] - _, ext = os.path.splitext(file_path) - staging_dir = os.path.dirname(file_path) - base_name = os.path.basename(file_path) - workfile_representation = { - "name": ext[1:], - "ext": ext[1:], - "files": base_name, - "stagingDir": staging_dir, - } - - for instance in context: - if instance.data["productType"] == product_type: - self.log.debug("Workfile instance found, won't create new") - instance.data.update({ - "label": base_name, - "name": base_name, - "representations": [], - }) - - # creating representation - _, ext = os.path.splitext(file_path) - instance.data["representations"].append( - workfile_representation) - - return - - stub = photoshop.stub() - stored_items = stub.get_layers_metadata() - for item in stored_items: - if item.get("creator_identifier") == product_type: - if not item.get("active"): - self.log.debug("Workfile instance disabled") - return - - project_name = context.data["projectName"] - proj_settings = context.data["project_settings"] - auto_creator = proj_settings.get( - "photoshop", {}).get( - "create", {}).get( - "WorkfileCreator", {}) - - if not auto_creator or not auto_creator["enabled"]: - self.log.debug("Workfile creator disabled, won't create new") - return - - # context.data["variant"] might come only from collect_batch_data - variant = (context.data.get("variant") or - auto_creator["default_variant"]) - - task_name = context.data["task"] - host_name = context.data["hostName"] - folder_entity = context.data["folderEntity"] - task_entity = context.data["taskEntity"] - task_name = task_type = None - if task_entity: - task_name = task_entity["name"] - task_type = task_entity["taskType"] - - product_name = get_product_name( - project_name, - task_name, - task_type, - host_name, - product_type, - variant, - project_settings=proj_settings - ) - - # Create instance - instance = context.create_instance(product_name) - instance.data.update({ - "label": base_name, - "name": base_name, - "productName": product_name, - "productType": product_type, - "family": product_type, - "families": [product_type], - "representations": [], - "folderPath": folder_entity["path"] - }) - - # creating representation - instance.data["representations"].append(workfile_representation) - - self.log.debug("auto workfile review created:{}".format(instance.data)) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_batch_data.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_batch_data.py deleted file mode 100644 index 527a7d516a..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_batch_data.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Parses batch context from json and continues in publish process. - -Provides: - context -> Loaded batch file. - - folderPath - - task (task name) - - taskType - - project_name - - variant - -Code is practically copy of `openype/hosts/webpublish/collect_batch_data` as -webpublisher should be eventually ejected as an addon, eg. mentioned plugin -shouldn't be pushed into general publish plugins. -""" - -import os - -import pyblish.api - -from ayon_webpublisher.lib import ( - get_batch_context_info, - parse_json -) -from ayon_core.lib import is_in_tests - - -class CollectBatchData(pyblish.api.ContextPlugin): - """Collect batch data from json stored in 'AYON_PUBLISH_DATA' env dir. - - The directory must contain 'manifest.json' file where batch data should be - stored. - """ - # must be really early, context values are only in json file - order = pyblish.api.CollectorOrder - 0.495 - label = "Collect batch data" - hosts = ["photoshop"] - targets = ["webpublish"] - - def process(self, context): - self.log.info("CollectBatchData") - batch_dir = ( - os.environ.get("AYON_PUBLISH_DATA") - or os.environ.get("OPENPYPE_PUBLISH_DATA") - ) - if is_in_tests(): - self.log.debug("Automatic testing, no batch data, skipping") - return - - assert batch_dir, ( - "Missing `AYON_PUBLISH_DATA`") - - assert os.path.exists(batch_dir), \ - "Folder {} doesn't exist".format(batch_dir) - - project_name = os.environ.get("AYON_PROJECT_NAME") - if project_name is None: - raise AssertionError( - "Environment `AYON_PROJECT_NAME` was not found." - "Could not set project `root` which may cause issues." - ) - - batch_data = parse_json(os.path.join(batch_dir, "manifest.json")) - - context.data["batchDir"] = batch_dir - context.data["batchData"] = batch_data - - folder_path, task_name, task_type = get_batch_context_info( - batch_data["context"] - ) - - os.environ["AYON_FOLDER_PATH"] = folder_path - os.environ["AYON_TASK_NAME"] = task_name - - context.data["folderPath"] = folder_path - context.data["task"] = task_name - context.data["taskType"] = task_type - context.data["project_name"] = project_name - context.data["variant"] = batch_data["variant"] diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py deleted file mode 100644 index 072eb82179..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py +++ /dev/null @@ -1,269 +0,0 @@ -import os -import re - -import pyblish.api - -from ayon_core.lib import prepare_template_data, is_in_tests -from ayon_core.settings import get_project_settings -from ayon_photoshop import api as photoshop - - -class CollectColorCodedInstances(pyblish.api.ContextPlugin): - """Creates instances for layers marked by configurable color. - - Used in remote publishing when artists marks publishable layers by color- - coding. Top level layers (group) must be marked by specific color to be - published as an instance of 'image' product type. - - Can add group for all publishable layers to allow creation of flattened - image. (Cannot contain special background layer as it cannot be grouped!) - - Based on value `create_flatten_image` from Settings: - - "yes": create flattened 'image' product of all publishable layers + create - 'image' product per publishable layer - - "only": create ONLY flattened 'image' product of all publishable layers - - "no": do not create flattened 'image' product at all, - only separate products per marked layer. - - Identifier: - id (str): "ayon.create.instance" - """ - - label = "Collect Color-coded Instances" - order = pyblish.api.CollectorOrder - hosts = ["photoshop"] - targets = ["automated"] - settings_category = "photoshop" - - # configurable by Settings - color_code_mapping = [] - create_flatten_image = "no" - flatten_product_name_template = "" - - def process(self, context): - self.log.info("CollectColorCodedInstances") - batch_dir = ( - os.environ.get("AYON_PUBLISH_DATA") - or os.environ.get("OPENPYPE_PUBLISH_DATA") - ) - if ( - is_in_tests() - and ( - not batch_dir or not os.path.exists(batch_dir) - ) - ): - self.log.debug("Automatic testing, no batch data, skipping") - return - - existing_product_names = self._get_existing_product_names(context) - - # from CollectBatchData - folder_path = context.data["folderPath"] - task_name = context.data["task"] - variant = context.data["variant"] - project_name = context.data["projectEntity"]["name"] - - naming_conventions = get_project_settings(project_name).get( - "photoshop", {}).get( - "publish", {}).get( - "ValidateNaming", {}) - - stub = photoshop.stub() - layers = stub.get_layers() - - publishable_layers = [] - created_instances = [] - product_type_from_settings = None - for layer in layers: - self.log.debug("Layer:: {}".format(layer)) - if layer.parents: - self.log.debug("!!! Not a top layer, skip") - continue - - if not layer.visible: - self.log.debug("Not visible, skip") - continue - - resolved_product_type, resolved_product_template = ( - self._resolve_mapping(layer) - ) - - if not resolved_product_template or not resolved_product_type: - self.log.debug("!!! Not found product type or template, skip") - continue - - if not product_type_from_settings: - product_type_from_settings = resolved_product_type - - fill_pairs = { - "variant": variant, - "family": resolved_product_type, - "product": {"type": resolved_product_type}, - "task": task_name, - "layer": layer.clean_name - } - - product_name = resolved_product_template.format( - **prepare_template_data(fill_pairs)) - - product_name = self._clean_product_name( - stub, naming_conventions, product_name, layer - ) - - if product_name in existing_product_names: - self.log.info(( - "Product {} already created, skipping." - ).format(product_name)) - continue - - if self.create_flatten_image != "flatten_only": - instance = self._create_instance( - context, - layer, - resolved_product_type, - folder_path, - product_name, - task_name - ) - created_instances.append(instance) - - existing_product_names.append(product_name) - publishable_layers.append(layer) - - if self.create_flatten_image != "no" and publishable_layers: - self.log.debug("create_flatten_image") - if not self.flatten_product_name_template: - self.log.warning("No template for flatten image") - return - - fill_pairs.pop("layer") - product_name = self.flatten_product_name_template.format( - **prepare_template_data(fill_pairs)) - - first_layer = publishable_layers[0] # dummy layer - first_layer.name = product_name - product_type = product_type_from_settings # inherit product type - instance = self._create_instance( - context, - first_layer, - product_type, - folder_path, - product_name, - task_name - ) - instance.data["ids"] = [layer.id for layer in publishable_layers] - created_instances.append(instance) - - for instance in created_instances: - # Produce diagnostic message for any graphical - # user interface interested in visualising it. - self.log.info("Found: \"%s\" " % instance.data["name"]) - self.log.info("instance: {} ".format(instance.data)) - - def _get_existing_product_names(self, context): - """Collect manually created instances from workfile. - - Shouldn't be any as Webpublisher bypass publishing via Openpype, but - might be some if workfile published through OP is reused. - """ - existing_product_names = [] - for instance in context: - if instance.data.get("publish") is not False: - existing_product_names.append(instance.data.get("productName")) - - return existing_product_names - - def _create_instance( - self, - context, - layer, - product_type, - folder_path, - product_name, - task_name - ): - instance = context.create_instance(layer.name) - instance.data["publish"] = True - instance.data["productType"] = product_type - instance.data["productName"] = product_name - instance.data["folderPath"] = folder_path - instance.data["task"] = task_name - instance.data["layer"] = layer - instance.data["family"] = product_type - instance.data["families"] = [product_type] - - return instance - - def _resolve_mapping(self, layer): - """Matches 'layer' color code and name to mapping. - - If both color code AND name regex is configured, BOTH must be valid - If layer matches to multiple mappings, only first is used! - """ - product_type_list = [] - product_name_list = [] - for mapping in self.color_code_mapping: - if ( - mapping["color_code"] - and layer.color_code not in mapping["color_code"] - ): - continue - - if ( - mapping["layer_name_regex"] - and not any( - re.search(pattern, layer.name) - for pattern in mapping["layer_name_regex"] - ) - ): - continue - - product_type_list.append(mapping["product_type"]) - product_name_list.append(mapping["product_name_template"]) - - if len(product_name_list) > 1: - self.log.warning( - "Multiple mappings found for '{}'".format(layer.name) - ) - self.log.warning("Only first product name template used!") - product_name_list[:] = product_name_list[0] - - if len(product_type_list) > 1: - self.log.warning( - "Multiple mappings found for '{}'".format(layer.name) - ) - self.log.warning("Only first product type used!") - product_type_list[:] = product_type_list[0] - - resolved_product_template = None - if product_name_list: - resolved_product_template = product_name_list.pop() - - product_type = None - if product_type_list: - product_type = product_type_list.pop() - - self.log.debug("resolved_product_type {}".format(product_type)) - self.log.debug("resolved_product_template {}".format( - resolved_product_template)) - return product_type, resolved_product_template - - def _clean_product_name( - self, stub, naming_conventions, product_name, layer - ): - """Cleans invalid characters from product name and layer name.""" - if re.search(naming_conventions["invalid_chars"], product_name): - product_name = re.sub( - naming_conventions["invalid_chars"], - naming_conventions["replace_char"], - product_name - ) - layer_name = re.sub( - naming_conventions["invalid_chars"], - naming_conventions["replace_char"], - layer.clean_name - ) - layer.name = layer_name - stub.rename_layer(layer.id, layer_name) - - return product_name diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py deleted file mode 100644 index 02f2217f75..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py +++ /dev/null @@ -1,18 +0,0 @@ -import os - -import pyblish.api - -from ayon_photoshop import api as photoshop - - -class CollectCurrentFile(pyblish.api.ContextPlugin): - """Inject the current working file into context""" - - order = pyblish.api.CollectorOrder - 0.49 - label = "Current File" - hosts = ["photoshop"] - - def process(self, context): - context.data["currentFile"] = os.path.normpath( - photoshop.stub().get_active_document_full_name() - ).replace("\\", "/") diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py deleted file mode 100644 index 90415e9245..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py +++ /dev/null @@ -1,57 +0,0 @@ -import os -import re -import pyblish.api - -from ayon_photoshop import api as photoshop - - -class CollectExtensionVersion(pyblish.api.ContextPlugin): - """ Pulls and compares version of installed extension. - - It is recommended to use same extension as in provided Openpype code. - - Please use Anastasiy’s Extension Manager or ZXPInstaller to update - extension in case of an error. - - You can locate extension.zxp in your installed Openpype code in - `repos/avalon-core/avalon/photoshop` - """ - # This technically should be a validator, but other collectors might be - # impacted with usage of obsolete extension, so collector that runs first - # was chosen - order = pyblish.api.CollectorOrder - 0.5 - label = "Collect extension version" - hosts = ["photoshop"] - - optional = True - active = True - - def process(self, context): - installed_version = photoshop.stub().get_extension_version() - - if not installed_version: - raise ValueError("Unknown version, probably old extension") - - manifest_url = os.path.join(os.path.dirname(photoshop.__file__), - "extension", "CSXS", "manifest.xml") - - if not os.path.exists(manifest_url): - self.log.debug("Unable to locate extension manifest, not checking") - return - - expected_version = None - with open(manifest_url) as fp: - content = fp.read() - - found = re.findall(r'(ExtensionBundleVersion=")([0-9\.]+)(")', - content) - if found: - expected_version = found[0][1] - - if expected_version != installed_version: - msg = "Expected version '{}' found '{}'\n".format( - expected_version, installed_version) - msg += "Please update your installed extension, it might not work " - msg += "properly." - - raise ValueError(msg) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py deleted file mode 100644 index ed6af6f7d3..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py +++ /dev/null @@ -1,20 +0,0 @@ -import pyblish.api - -from ayon_photoshop import api - - -class CollectImage(pyblish.api.InstancePlugin): - """Collect layer metadata into a instance. - - Used later in validation - """ - order = pyblish.api.CollectorOrder + 0.200 - label = 'Collect Image' - - hosts = ["photoshop"] - families = ["image"] - - def process(self, instance): - if instance.data.get("members"): - layer = api.stub().get_layer(instance.data["members"][0]) - instance.data["layer"] = layer diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_published_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_published_version.py deleted file mode 100644 index 84c9fa3e62..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_published_version.py +++ /dev/null @@ -1,63 +0,0 @@ -"""Collects published version of workfile and increments it. - -For synchronization of published image and workfile version it is required -to store workfile version from workfile file name in context.data["version"]. -In remote publishing this name is unreliable (artist might not follow naming -convention etc.), last published workfile version for particular workfile -product is used instead. - -This plugin runs only in remote publishing (eg. Webpublisher). - -Requires: - context.data["folderEntity"] - -Provides: - context["version"] - incremented latest published workfile version -""" - -import pyblish.api -import ayon_api - -from ayon_core.pipeline.version_start import get_versioning_start - - -class CollectPublishedVersion(pyblish.api.ContextPlugin): - """Collects published version of workfile and increments it.""" - - order = pyblish.api.CollectorOrder + 0.190 - label = "Collect published version" - hosts = ["photoshop"] - targets = ["automated"] - - def process(self, context): - workfile_product_name = None - for instance in context: - if instance.data["productType"] == "workfile": - workfile_product_name = instance.data["productName"] - break - - if not workfile_product_name: - self.log.warning("No workfile instance found, " - "synchronization of version will not work.") - return - - project_name = context.data["projectName"] - folder_id = context.data["folderEntity"]["id"] - - version_entity = ayon_api.get_last_version_by_product_name( - project_name, workfile_product_name, folder_id - ) - - if version_entity: - version_int = int(version_entity["version"]) + 1 - else: - version_int = get_versioning_start( - project_name, - "photoshop", - task_name=context.data["task"], - task_type=context.data["taskType"], - project_settings=context.data["project_settings"] - ) - - self.log.debug(f"Setting {version_int} to context.") - context.data["version"] = version_int diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py deleted file mode 100644 index d9a29f9b74..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -Requires: - None - -Provides: - instance -> family ("review") -""" - -import pyblish.api - - -class CollectReview(pyblish.api.ContextPlugin): - """Adds review to families for instances marked to be reviewable. - """ - - label = "Collect Review" - hosts = ["photoshop"] - order = pyblish.api.CollectorOrder + 0.1 - settings_category = "photoshop" - - def process(self, context): - for instance in context: - creator_attributes = instance.data["creator_attributes"] - if (creator_attributes.get("mark_for_review") and - "review" not in instance.data["families"]): - instance.data["families"].append("review") diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py deleted file mode 100644 index bc9f05ab50..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py +++ /dev/null @@ -1,30 +0,0 @@ -import pyblish.api - - -class CollectVersion(pyblish.api.InstancePlugin): - """Collect version for publishable instances. - - Used to synchronize version from workfile to all publishable instances: - - image (manually created or color coded) - - review - - workfile - - Dev comment: - Explicit collector created to control this from single place and not from - 3 different. - - Workfile set here explicitly as version might to be forced from latest + 1 - because of Webpublisher. - (This plugin must run after CollectPublishedVersion!) - """ - order = pyblish.api.CollectorOrder + 0.200 - label = 'Collect Version' - - hosts = ["photoshop"] - families = ["image", "review", "workfile"] - settings_category = "photoshop" - - def process(self, instance): - workfile_version = instance.context.data["version"] - self.log.debug(f"Applying version {workfile_version}") - instance.data["version"] = workfile_version diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_workfile.py deleted file mode 100644 index b9080a12ff..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_workfile.py +++ /dev/null @@ -1,30 +0,0 @@ -import os -import pyblish.api - - -class CollectWorkfile(pyblish.api.ContextPlugin): - """Collect current script for publish.""" - - order = pyblish.api.CollectorOrder + 0.1 - label = "Collect Workfile" - hosts = ["photoshop"] - - default_variant = "Main" - - def process(self, context): - for instance in context: - if instance.data["productType"] == "workfile": - file_path = context.data["currentFile"] - _, ext = os.path.splitext(file_path) - staging_dir = os.path.dirname(file_path) - base_name = os.path.basename(file_path) - - # creating representation - _, ext = os.path.splitext(file_path) - instance.data["representations"].append({ - "name": ext[1:], - "ext": ext[1:], - "files": base_name, - "stagingDir": staging_dir, - }) - return diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py deleted file mode 100644 index 33599d37bb..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py +++ /dev/null @@ -1,102 +0,0 @@ -import os - -import pyblish.api -from ayon_core.pipeline import publish -from ayon_photoshop import api as photoshop - - -class ExtractImage(pyblish.api.ContextPlugin): - """Extract all layers (groups) marked for publish. - - Usually publishable instance is created as a wrapper of layer(s). For each - publishable instance so many images as there is 'formats' is created. - - Logic tries to hide/unhide layers minimum times. - - Called once for all publishable instances. - """ - - order = publish.Extractor.order - 0.48 - label = "Extract Image" - hosts = ["photoshop"] - - families = ["image", "background"] - formats = ["png", "jpg"] - settings_category = "photoshop" - - def process(self, context): - stub = photoshop.stub() - hidden_layer_ids = set() - - all_layers = stub.get_layers() - for layer in all_layers: - if not layer.visible: - hidden_layer_ids.add(layer.id) - stub.hide_all_others_layers_ids([], layers=all_layers) - - with photoshop.maintained_selection(): - with photoshop.maintained_visibility(layers=all_layers): - for instance in context: - if instance.data["productType"] not in self.families: - continue - - staging_dir = self.staging_dir(instance) - self.log.info("Outputting image to {}".format(staging_dir)) - - # Perform extraction - files = {} - ids = set() - # real layers and groups - members = instance.data("members") - if members: - ids.update(set([int(member) for member in members])) - # virtual groups collected by color coding or auto_image - add_ids = instance.data.pop("ids", None) - if add_ids: - ids.update(set(add_ids)) - extract_ids = set([ll.id for ll in stub. - get_layers_in_layers_ids(ids, all_layers) - if ll.id not in hidden_layer_ids]) - - for extracted_id in extract_ids: - stub.set_visible(extracted_id, True) - - file_basename = os.path.splitext( - stub.get_active_document_name() - )[0] - for extension in self.formats: - _filename = "{}.{}".format(file_basename, - extension) - files[extension] = _filename - - full_filename = os.path.join(staging_dir, - _filename) - stub.saveAs(full_filename, extension, True) - self.log.info(f"Extracted: {extension}") - - representations = [] - for extension, filename in files.items(): - representations.append({ - "name": extension, - "ext": extension, - "files": filename, - "stagingDir": staging_dir - }) - instance.data["representations"] = representations - instance.data["stagingDir"] = staging_dir - - self.log.info(f"Extracted {instance} to {staging_dir}") - - for extracted_id in extract_ids: - stub.set_visible(extracted_id, False) - - def staging_dir(self, instance): - """Provide a temporary directory in which to store extracted files - - Upon calling this method the staging directory is stored inside - the instance.data['stagingDir'] - """ - - from ayon_core.pipeline.publish import get_instance_staging_dir - - return get_instance_staging_dir(instance) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py deleted file mode 100644 index 0f36d31648..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py +++ /dev/null @@ -1,329 +0,0 @@ -import os -import shutil -from PIL import Image - -from ayon_core.lib import ( - run_subprocess, - get_ffmpeg_tool_args, -) -from ayon_core.pipeline import publish -from ayon_photoshop import api as photoshop - - -class ExtractReview(publish.Extractor): - """ - Produce a flattened or sequence image files from all 'image' instances. - - If no 'image' instance is created, it produces flattened image from - all visible layers. - - It creates review, thumbnail and mov representations. - - 'review' family could be used in other steps as a reference, as it - contains flattened image by default. (Eg. artist could load this - review as a single item and see full image. In most cases 'image' - product type is separated by layers to better usage in animation - or comp.) - """ - - label = "Extract Review" - hosts = ["photoshop"] - families = ["review"] - settings_category = "photoshop" - - # Extract Options - jpg_options = None - mov_options = None - make_image_sequence = None - max_downscale_size = 8192 - - def process(self, instance): - staging_dir = self.staging_dir(instance) - self.log.info("Outputting image to {}".format(staging_dir)) - - fps = instance.data.get("fps", 25) - stub = photoshop.stub() - self.output_seq_filename = os.path.splitext( - stub.get_active_document_name())[0] + ".%04d.jpg" - - layers = self._get_layers_from_image_instances(instance) - self.log.info("Layers image instance found: {}".format(layers)) - - repre_name = "jpg" - repre_skeleton = { - "name": repre_name, - "ext": "jpg", - "stagingDir": staging_dir, - "tags": self.jpg_options['tags'], - } - - if instance.data["productType"] != "review": - self.log.debug( - "Existing extracted file from image product type used." - ) - # enable creation of review, without this jpg review would clash - # with jpg of the image product type - output_name = repre_name - repre_name = "{}_{}".format(repre_name, output_name) - repre_skeleton.update({"name": repre_name, - "outputName": output_name}) - - img_file = self.output_seq_filename % 0 - self._prepare_file_for_image_product_type( - img_file, instance, staging_dir - ) - repre_skeleton.update({ - "files": img_file, - }) - processed_img_names = [img_file] - elif self.make_image_sequence and len(layers) > 1: - self.log.debug("Extract layers to image sequence.") - img_list = self._save_sequence_images(staging_dir, layers) - - repre_skeleton.update({ - "frameStart": 0, - "frameEnd": len(img_list), - "fps": fps, - "files": img_list, - }) - processed_img_names = img_list - else: - self.log.debug("Extract layers to flatten image.") - img_file = self._save_flatten_image(staging_dir, layers) - - repre_skeleton.update({ - "files": img_file, - }) - processed_img_names = [img_file] - - instance.data["representations"].append(repre_skeleton) - - ffmpeg_args = get_ffmpeg_tool_args("ffmpeg") - - instance.data["stagingDir"] = staging_dir - - source_files_pattern = os.path.join(staging_dir, - self.output_seq_filename) - source_files_pattern = self._check_and_resize(processed_img_names, - source_files_pattern, - staging_dir) - self._generate_thumbnail( - list(ffmpeg_args), - instance, - source_files_pattern, - staging_dir) - - no_of_frames = len(processed_img_names) - if no_of_frames > 1: - self._generate_mov( - list(ffmpeg_args), - instance, - fps, - no_of_frames, - source_files_pattern, - staging_dir) - - self.log.info(f"Extracted {instance} to {staging_dir}") - - def _prepare_file_for_image_product_type( - self, img_file, instance, staging_dir - ): - """Converts existing file for image product type to .jpg - - Image instance could have its own separate review (instance per layer - for example). This uses extracted file instead of extracting again. - Args: - img_file (str): name of output file (with 0000 value for ffmpeg - later) - instance: - staging_dir (str): temporary folder where extracted file is located - """ - repre_file = instance.data["representations"][0] - source_file_path = os.path.join(repre_file["stagingDir"], - repre_file["files"]) - if not os.path.exists(source_file_path): - raise RuntimeError(f"{source_file_path} doesn't exist for " - "review to create from") - _, ext = os.path.splitext(repre_file["files"]) - if ext != ".jpg": - im = Image.open(source_file_path) - if (im.mode in ('RGBA', 'LA') or ( - im.mode == 'P' and 'transparency' in im.info)): - # without this it produces messy low quality jpg - rgb_im = Image.new("RGBA", (im.width, im.height), "#ffffff") - rgb_im.alpha_composite(im) - rgb_im.convert("RGB").save(os.path.join(staging_dir, img_file)) - else: - im.save(os.path.join(staging_dir, img_file)) - else: - # handles already .jpg - shutil.copy(source_file_path, - os.path.join(staging_dir, img_file)) - - def _generate_mov(self, ffmpeg_path, instance, fps, no_of_frames, - source_files_pattern, staging_dir): - """Generates .mov to upload to Ftrack. - - Args: - ffmpeg_path (str): path to ffmpeg - instance (Pyblish Instance) - fps (str) - no_of_frames (int): - source_files_pattern (str): name of source file - staging_dir (str): temporary location to store thumbnail - Updates: - instance - adds representation portion - """ - # Generate mov. - mov_path = os.path.join(staging_dir, "review.mov") - self.log.info(f"Generate mov review: {mov_path}") - args = ffmpeg_path + [ - "-y", - "-i", source_files_pattern, - "-vf", "pad=ceil(iw/2)*2:ceil(ih/2)*2", - "-vframes", str(no_of_frames), - mov_path - ] - self.log.debug("mov args:: {}".format(args)) - _output = run_subprocess(args) - instance.data["representations"].append({ - "name": "mov", - "ext": "mov", - "files": os.path.basename(mov_path), - "stagingDir": staging_dir, - "frameStart": 1, - "frameEnd": no_of_frames, - "fps": fps, - "tags": self.mov_options['tags'] - }) - - def _generate_thumbnail( - self, ffmpeg_args, instance, source_files_pattern, staging_dir - ): - """Generates scaled down thumbnail and adds it as representation. - - Args: - ffmpeg_path (str): path to ffmpeg - instance (Pyblish Instance) - source_files_pattern (str): name of source file - staging_dir (str): temporary location to store thumbnail - Updates: - instance - adds representation portion - """ - # Generate thumbnail - thumbnail_path = os.path.join(staging_dir, "thumbnail.jpg") - self.log.info(f"Generate thumbnail {thumbnail_path}") - args = ffmpeg_args + [ - "-y", - "-i", source_files_pattern, - "-vf", "scale=300:-1", - "-vframes", "1", - thumbnail_path - ] - self.log.debug("thumbnail args:: {}".format(args)) - _output = run_subprocess(args) - instance.data["representations"].append({ - "name": "thumbnail", - "ext": "jpg", - "outputName": "thumb", - "files": os.path.basename(thumbnail_path), - "stagingDir": staging_dir, - "tags": ["thumbnail", "delete"] - }) - instance.data["thumbnailPath"] = thumbnail_path - - def _check_and_resize(self, processed_img_names, source_files_pattern, - staging_dir): - """Check if saved image could be used in ffmpeg. - - Ffmpeg has max size 16384x16384. Saved image(s) must be resized to be - used as a source for thumbnail or review mov. - """ - Image.MAX_IMAGE_PIXELS = None - first_url = os.path.join(staging_dir, processed_img_names[0]) - with Image.open(first_url) as im: - width, height = im.size - - if width > self.max_downscale_size or height > self.max_downscale_size: - resized_dir = os.path.join(staging_dir, "resized") - os.mkdir(resized_dir) - source_files_pattern = os.path.join(resized_dir, - self.output_seq_filename) - for file_name in processed_img_names: - source_url = os.path.join(staging_dir, file_name) - with Image.open(source_url) as res_img: - # 'thumbnail' automatically keeps aspect ratio - res_img.thumbnail((self.max_downscale_size, - self.max_downscale_size), - Image.ANTIALIAS) - res_img.save(os.path.join(resized_dir, file_name)) - - return source_files_pattern - - def _get_layers_from_image_instances(self, instance): - """Collect all layers from 'instance'. - - Returns: - (list) of PSItem - """ - layers = [] - # creating review for existing 'image' instance - if ( - instance.data["productType"] == "image" - and instance.data.get("layer") - ): - layers.append(instance.data["layer"]) - return layers - - for image_instance in instance.context: - if image_instance.data["productType"] != "image": - continue - if not image_instance.data.get("layer"): - # dummy instance for flatten image - continue - layers.append(image_instance.data.get("layer")) - - return sorted(layers) - - def _save_flatten_image(self, staging_dir, layers): - """Creates flat image from 'layers' into 'staging_dir'. - - Returns: - (str): path to new image - """ - img_filename = self.output_seq_filename % 0 - output_image_path = os.path.join(staging_dir, img_filename) - stub = photoshop.stub() - - with photoshop.maintained_visibility(): - self.log.info("Extracting {}".format(layers)) - if layers: - stub.hide_all_others_layers(layers) - - stub.saveAs(output_image_path, 'jpg', True) - - return img_filename - - def _save_sequence_images(self, staging_dir, layers): - """Creates separate flat images from 'layers' into 'staging_dir'. - - Used as source for multi frames .mov to review at once. - Returns: - (list): paths to new images - """ - stub = photoshop.stub() - - list_img_filename = [] - with photoshop.maintained_visibility(): - for i, layer in enumerate(layers): - self.log.info("Extracting {}".format(layer)) - - img_filename = self.output_seq_filename % i - output_image_path = os.path.join(staging_dir, img_filename) - list_img_filename.append(img_filename) - - with photoshop.maintained_visibility(): - stub.hide_all_others_layers([layer]) - stub.saveAs(output_image_path, 'jpg', True) - - return list_img_filename diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py deleted file mode 100644 index 22ebbb739d..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py +++ /dev/null @@ -1,14 +0,0 @@ -from ayon_core.pipeline import publish -from ayon_photoshop import api as photoshop - - -class ExtractSaveScene(publish.Extractor): - """Save scene before extraction.""" - - order = publish.Extractor.order - 0.49 - label = "Extract Save Scene" - hosts = ["photoshop"] - families = ["workfile"] - - def process(self, instance): - photoshop.stub().save() diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_instance_asset.xml b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_instance_asset.xml deleted file mode 100644 index c033f922c6..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_instance_asset.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - -Folder does not match - -## Collected folder path is not same as in context - - {msg} -### How to repair? - {repair_msg} - Refresh Publish afterwards (circle arrow at the bottom right). - - If that's not correct value, close workfile and reopen via Workfiles to get - proper context folder path OR disable this validator and publish again - if you are publishing to different context deliberately. - - (Context means combination of project, folder path and task name.) - - - \ No newline at end of file diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_naming.xml b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_naming.xml deleted file mode 100644 index 28c2329c8a..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_naming.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - -Product name - -## Invalid product or layer name - -Product or layer name cannot contain specific characters (spaces etc) which could cause issue when product name is used in a published file name. - {msg} - -### How to repair? - -You can fix this with "repair" button on the right and press Refresh publishing button at the bottom right. - - -### __Detailed Info__ (optional) - -Not all characters are available in a file names on all OS. Wrong characters could be configured in Settings. - - - \ No newline at end of file diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py deleted file mode 100644 index b10645813a..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py +++ /dev/null @@ -1,32 +0,0 @@ -import os -import pyblish.api -from ayon_core.pipeline.publish import get_errored_plugins_from_context -from ayon_core.lib import version_up - -from ayon_photoshop import api as photoshop - - -class IncrementWorkfile(pyblish.api.InstancePlugin): - """Increment the current workfile. - - Saves the current scene with an increased version number. - """ - - label = "Increment Workfile" - order = pyblish.api.IntegratorOrder + 9.0 - hosts = ["photoshop"] - families = ["workfile"] - optional = True - - def process(self, instance): - errored_plugins = get_errored_plugins_from_context(instance.context) - if errored_plugins: - raise RuntimeError( - "Skipping incrementing current file because publishing failed." - ) - - scene_path = version_up(instance.context.data["currentFile"]) - _, ext = os.path.splitext(scene_path) - photoshop.stub().saveAs(scene_path, ext[1:], True) - - self.log.info("Incremented workfile to: {}".format(scene_path)) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py deleted file mode 100644 index 36ba621dc2..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py +++ /dev/null @@ -1,76 +0,0 @@ -import pyblish.api - -from ayon_core.pipeline import get_current_folder_path -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - PublishXmlValidationError, - OptionalPyblishPluginMixin -) -from ayon_photoshop import api as photoshop - - -class ValidateInstanceFolderRepair(pyblish.api.Action): - """Repair the instance folder.""" - - label = "Repair" - icon = "wrench" - on = "failed" - - def process(self, context, plugin): - - # Get the errored instances - failed = [] - for result in context.data["results"]: - if ( - result["error"] is not None - and result["instance"] is not None - and result["instance"] not in failed - ): - failed.append(result["instance"]) - - # Apply pyblish.logic to get the instances for the plug-in - instances = pyblish.api.instances_by_plugin(failed, plugin) - stub = photoshop.stub() - current_folder_path = get_current_folder_path() - for instance in instances: - data = stub.read(instance[0]) - data["folderPath"] = current_folder_path - stub.imprint(instance[0], data) - - -class ValidateInstanceAsset(OptionalPyblishPluginMixin, - pyblish.api.InstancePlugin): - """Validate the instance folder is the current selected context folder. - - As it might happen that multiple worfiles are opened, switching - between them would mess with selected context. - In that case outputs might be output under wrong folder! - - Repair action will use Context folder value (from Workfiles or Launcher) - Closing and reopening with Workfiles will refresh Context value. - """ - - label = "Validate Instance Folder" - hosts = ["photoshop"] - optional = True - actions = [ValidateInstanceFolderRepair] - order = ValidateContentsOrder - - def process(self, instance): - instance_folder_path = instance.data["folderPath"] - current_folder_path = get_current_folder_path() - - if instance_folder_path != current_folder_path: - msg = ( - f"Instance folder {instance_folder_path} is not the same" - f" as current context {current_folder_path}." - - ) - repair_msg = ( - "Repair with 'Repair' button" - f" to use '{current_folder_path}'.\n" - ) - formatting_data = {"msg": msg, - "repair_msg": repair_msg} - raise PublishXmlValidationError(self, msg, - formatting_data=formatting_data) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py deleted file mode 100644 index e5f826b07e..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py +++ /dev/null @@ -1,117 +0,0 @@ -import re - -import pyblish.api - -from ayon_photoshop import api as photoshop -from ayon_core.pipeline.create import PRODUCT_NAME_ALLOWED_SYMBOLS -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - PublishXmlValidationError, -) - - -class ValidateNamingRepair(pyblish.api.Action): - """Repair the instance folder.""" - - label = "Repair" - icon = "wrench" - on = "failed" - settings_category = "photoshop" - - def process(self, context, plugin): - - # Get the errored instances - failed = [] - for result in context.data["results"]: - if ( - result["error"] is not None - and result["instance"] is not None - and result["instance"] not in failed - ): - failed.append(result["instance"]) - - invalid_chars, replace_char = plugin.get_replace_chars() - self.log.debug("{} --- {}".format(invalid_chars, replace_char)) - - # Apply pyblish.logic to get the instances for the plug-in - instances = pyblish.api.instances_by_plugin(failed, plugin) - stub = photoshop.stub() - for instance in instances: - self.log.debug("validate_naming instance {}".format(instance)) - current_layer_state = stub.get_layer(instance.data["layer"].id) - self.log.debug("current_layer{}".format(current_layer_state)) - - layer_meta = stub.read(current_layer_state) - instance_id = (layer_meta.get("instance_id") or - layer_meta.get("uuid")) - if not instance_id: - self.log.warning("Unable to repair, cannot find layer") - continue - - layer_name = re.sub(invalid_chars, - replace_char, - current_layer_state.clean_name) - layer_name = stub.PUBLISH_ICON + layer_name - - stub.rename_layer(current_layer_state.id, layer_name) - - product_name = re.sub(invalid_chars, replace_char, - instance.data["productName"]) - - # format from Tool Creator - product_name = re.sub( - "[^{}]+".format(PRODUCT_NAME_ALLOWED_SYMBOLS), - "", - product_name - ) - - layer_meta["productName"] = product_name - stub.imprint(instance_id, layer_meta) - - return True - - -class ValidateNaming(pyblish.api.InstancePlugin): - """Validate the instance name. - - Spaces in names are not allowed. Will be replace with underscores. - """ - - label = "Validate Naming" - hosts = ["photoshop"] - order = ValidateContentsOrder - families = ["image"] - actions = [ValidateNamingRepair] - - # configured by Settings - invalid_chars = '' - replace_char = '' - - def process(self, instance): - help_msg = ' Use Repair button to fix it and then refresh publish.' - - layer = instance.data.get("layer") - if layer: - msg = "Name \"{}\" is not allowed.{}".format( - layer.clean_name, help_msg - ) - formatting_data = {"msg": msg} - if re.search(self.invalid_chars, layer.clean_name): - raise PublishXmlValidationError( - self, msg, formatting_data=formatting_data - ) - - product_name = instance.data["productName"] - msg = "Product \"{}\" is not allowed.{}".format( - product_name, help_msg - ) - formatting_data = {"msg": msg} - if re.search(self.invalid_chars, product_name): - raise PublishXmlValidationError( - self, msg, formatting_data=formatting_data - ) - - @classmethod - def get_replace_chars(cls): - """Pass values configured in Settings for Repair.""" - return cls.invalid_chars, cls.replace_char diff --git a/server_addon/photoshop/client/ayon_photoshop/resources/template.psd b/server_addon/photoshop/client/ayon_photoshop/resources/template.psd deleted file mode 100644 index 4c731771bac895ff672a86c1281cded9bfa0c049..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159710 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 Z009U<00Izz00bZa0SG_<0{;gE{tFxEb}Ik? diff --git a/server_addon/photoshop/client/ayon_photoshop/version.py b/server_addon/photoshop/client/ayon_photoshop/version.py deleted file mode 100644 index 7f6de51228..0000000000 --- a/server_addon/photoshop/client/ayon_photoshop/version.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -"""Package declaring AYON addon 'photoshop' version.""" -__version__ = "0.2.2" diff --git a/server_addon/photoshop/client/pyproject.toml b/server_addon/photoshop/client/pyproject.toml deleted file mode 100644 index 3beb76ba74..0000000000 --- a/server_addon/photoshop/client/pyproject.toml +++ /dev/null @@ -1,6 +0,0 @@ -[project] -name="photoshop" -description="AYON Phostoshop addon." - -[ayon.runtimeDependencies] -wsrpc_aiohttp = "^3.1.1" # websocket server diff --git a/server_addon/photoshop/package.py b/server_addon/photoshop/package.py deleted file mode 100644 index f4d2a98293..0000000000 --- a/server_addon/photoshop/package.py +++ /dev/null @@ -1,10 +0,0 @@ -name = "photoshop" -title = "Photoshop" -version = "0.2.2" - -client_dir = "ayon_photoshop" - -ayon_required_addons = { - "core": ">0.3.2", -} -ayon_compatible_addons = {} diff --git a/server_addon/photoshop/server/__init__.py b/server_addon/photoshop/server/__init__.py deleted file mode 100644 index 86d1025a2d..0000000000 --- a/server_addon/photoshop/server/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from ayon_server.addons import BaseServerAddon - -from .settings import PhotoshopSettings, DEFAULT_PHOTOSHOP_SETTING - - -class Photoshop(BaseServerAddon): - settings_model = PhotoshopSettings - - async def get_default_settings(self): - settings_model_cls = self.get_settings_model() - return settings_model_cls(**DEFAULT_PHOTOSHOP_SETTING) diff --git a/server_addon/photoshop/server/settings/__init__.py b/server_addon/photoshop/server/settings/__init__.py deleted file mode 100644 index 9ae5764362..0000000000 --- a/server_addon/photoshop/server/settings/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -from .main import ( - PhotoshopSettings, - DEFAULT_PHOTOSHOP_SETTING, -) - - -__all__ = ( - "PhotoshopSettings", - "DEFAULT_PHOTOSHOP_SETTING", -) diff --git a/server_addon/photoshop/server/settings/creator_plugins.py b/server_addon/photoshop/server/settings/creator_plugins.py deleted file mode 100644 index 8acc213866..0000000000 --- a/server_addon/photoshop/server/settings/creator_plugins.py +++ /dev/null @@ -1,77 +0,0 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField - - -class CreateImagePluginModel(BaseSettingsModel): - enabled: bool = SettingsField(True, title="Enabled") - active_on_create: bool = SettingsField(True, title="Active by default") - mark_for_review: bool = SettingsField(False, title="Review by default") - default_variants: list[str] = SettingsField( - default_factory=list, - title="Default Variants" - ) - - -class AutoImageCreatorPluginModel(BaseSettingsModel): - enabled: bool = SettingsField(False, title="Enabled") - active_on_create: bool = SettingsField(True, title="Active by default") - mark_for_review: bool = SettingsField(False, title="Review by default") - default_variant: str = SettingsField("", title="Default Variants") - - -class CreateReviewPlugin(BaseSettingsModel): - enabled: bool = SettingsField(True, title="Enabled") - active_on_create: bool = SettingsField(True, title="Active by default") - default_variant: str = SettingsField("", title="Default Variants") - - -class CreateWorkfilelugin(BaseSettingsModel): - enabled: bool = SettingsField(True, title="Enabled") - active_on_create: bool = SettingsField(True, title="Active by default") - default_variant: str = SettingsField("", title="Default Variants") - - -class PhotoshopCreatorPlugins(BaseSettingsModel): - ImageCreator: CreateImagePluginModel = SettingsField( - title="Create Image", - default_factory=CreateImagePluginModel, - ) - AutoImageCreator: AutoImageCreatorPluginModel = SettingsField( - title="Create Flatten Image", - default_factory=AutoImageCreatorPluginModel, - ) - ReviewCreator: CreateReviewPlugin = SettingsField( - title="Create Review", - default_factory=CreateReviewPlugin, - ) - WorkfileCreator: CreateWorkfilelugin = SettingsField( - title="Create Workfile", - default_factory=CreateWorkfilelugin, - ) - - -DEFAULT_CREATE_SETTINGS = { - "ImageCreator": { - "enabled": True, - "active_on_create": True, - "mark_for_review": False, - "default_variants": [ - "Main" - ] - }, - "AutoImageCreator": { - "enabled": False, - "active_on_create": True, - "mark_for_review": False, - "default_variant": "" - }, - "ReviewCreator": { - "enabled": True, - "active_on_create": True, - "default_variant": "" - }, - "WorkfileCreator": { - "enabled": True, - "active_on_create": True, - "default_variant": "Main" - } -} diff --git a/server_addon/photoshop/server/settings/imageio.py b/server_addon/photoshop/server/settings/imageio.py deleted file mode 100644 index c514f58173..0000000000 --- a/server_addon/photoshop/server/settings/imageio.py +++ /dev/null @@ -1,79 +0,0 @@ -from pydantic import validator -from ayon_server.settings import BaseSettingsModel, SettingsField -from ayon_server.settings.validators import ensure_unique_names - - -class ImageIOConfigModel(BaseSettingsModel): - """[DEPRECATED] Addon OCIO config settings. Please set the OCIO config - path in the Core addon profiles here - (ayon+settings://core/imageio/ocio_config_profiles). - """ - - override_global_config: bool = SettingsField( - False, - title="Override global OCIO config", - description=( - "DEPRECATED functionality. Please set the OCIO config path in the " - "Core addon profiles here (ayon+settings://core/imageio/" - "ocio_config_profiles)." - ), - ) - filepath: list[str] = SettingsField( - default_factory=list, - title="Config path", - description=( - "DEPRECATED functionality. Please set the OCIO config path in the " - "Core addon profiles here (ayon+settings://core/imageio/" - "ocio_config_profiles)." - ), - ) - - -class ImageIOFileRuleModel(BaseSettingsModel): - name: str = SettingsField("", title="Rule name") - pattern: str = SettingsField("", title="Regex pattern") - colorspace: str = SettingsField("", title="Colorspace name") - ext: str = SettingsField("", title="File extension") - - -class ImageIOFileRulesModel(BaseSettingsModel): - activate_host_rules: bool = SettingsField(False) - rules: list[ImageIOFileRuleModel] = SettingsField( - default_factory=list, - title="Rules" - ) - - @validator("rules") - def validate_unique_outputs(cls, value): - ensure_unique_names(value) - return value - - -class ImageIORemappingRulesModel(BaseSettingsModel): - host_native_name: str = SettingsField( - title="Application native colorspace name" - ) - ocio_name: str = SettingsField(title="OCIO colorspace name") - - -class ImageIORemappingModel(BaseSettingsModel): - rules: list[ImageIORemappingRulesModel] = SettingsField( - default_factory=list) - - -class PhotoshopImageIOModel(BaseSettingsModel): - activate_host_color_management: bool = SettingsField( - True, title="Enable Color Management" - ) - remapping: ImageIORemappingModel = SettingsField( - title="Remapping colorspace names", - default_factory=ImageIORemappingModel - ) - ocio_config: ImageIOConfigModel = SettingsField( - default_factory=ImageIOConfigModel, - title="OCIO config" - ) - file_rules: ImageIOFileRulesModel = SettingsField( - default_factory=ImageIOFileRulesModel, - title="File Rules" - ) diff --git a/server_addon/photoshop/server/settings/main.py b/server_addon/photoshop/server/settings/main.py deleted file mode 100644 index b6474d6d29..0000000000 --- a/server_addon/photoshop/server/settings/main.py +++ /dev/null @@ -1,40 +0,0 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField - -from .imageio import PhotoshopImageIOModel -from .creator_plugins import PhotoshopCreatorPlugins, DEFAULT_CREATE_SETTINGS -from .publish_plugins import PhotoshopPublishPlugins, DEFAULT_PUBLISH_SETTINGS -from .workfile_builder import WorkfileBuilderPlugin - - -class PhotoshopSettings(BaseSettingsModel): - """Photoshop Project Settings.""" - - imageio: PhotoshopImageIOModel = SettingsField( - default_factory=PhotoshopImageIOModel, - title="OCIO config" - ) - - create: PhotoshopCreatorPlugins = SettingsField( - default_factory=PhotoshopCreatorPlugins, - title="Creator plugins" - ) - - publish: PhotoshopPublishPlugins = SettingsField( - default_factory=PhotoshopPublishPlugins, - title="Publish plugins" - ) - - workfile_builder: WorkfileBuilderPlugin = SettingsField( - default_factory=WorkfileBuilderPlugin, - title="Workfile Builder" - ) - - -DEFAULT_PHOTOSHOP_SETTING = { - "create": DEFAULT_CREATE_SETTINGS, - "publish": DEFAULT_PUBLISH_SETTINGS, - "workfile_builder": { - "create_first_version": False, - "custom_templates": [] - } -} diff --git a/server_addon/photoshop/server/settings/publish_plugins.py b/server_addon/photoshop/server/settings/publish_plugins.py deleted file mode 100644 index 149b08beb4..0000000000 --- a/server_addon/photoshop/server/settings/publish_plugins.py +++ /dev/null @@ -1,203 +0,0 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField - - -create_flatten_image_enum = [ - {"value": "flatten_with_images", "label": "Flatten with images"}, - {"value": "flatten_only", "label": "Flatten only"}, - {"value": "no", "label": "No"}, -] - - -color_code_enum = [ - {"value": "red", "label": "Red"}, - {"value": "orange", "label": "Orange"}, - {"value": "yellowColor", "label": "Yellow"}, - {"value": "grain", "label": "Green"}, - {"value": "blue", "label": "Blue"}, - {"value": "violet", "label": "Violet"}, - {"value": "gray", "label": "Gray"}, -] - - -class ColorCodeMappings(BaseSettingsModel): - color_code: list[str] = SettingsField( - title="Color codes for layers", - default_factory=list, - enum_resolver=lambda: color_code_enum, - ) - - layer_name_regex: list[str] = SettingsField( - default_factory=list, - title="Layer name regex" - ) - - product_type: str = SettingsField( - "", - title="Resulting product type" - ) - - product_name_template: str = SettingsField( - "", - title="Product name template" - ) - - -class ExtractedOptions(BaseSettingsModel): - tags: list[str] = SettingsField( - title="Tags", - default_factory=list - ) - - -class CollectColorCodedInstancesPlugin(BaseSettingsModel): - """Set color for publishable layers, set its resulting product type - and template for product name. \n Can create flatten image from published - instances. - (Applicable only for remote publishing!)""" - - enabled: bool = SettingsField(True, title="Enabled") - create_flatten_image: str = SettingsField( - "", - title="Create flatten image", - enum_resolver=lambda: create_flatten_image_enum, - ) - - flatten_product_name_template: str = SettingsField( - "", - title="Product name template for flatten image" - ) - - color_code_mapping: list[ColorCodeMappings] = SettingsField( - title="Color code mappings", - default_factory=ColorCodeMappings, - ) - - -class CollectReviewPlugin(BaseSettingsModel): - """Should review product be created""" - enabled: bool = SettingsField(True, title="Enabled") - - -class CollectVersionPlugin(BaseSettingsModel): - """Synchronize version for image and review instances by workfile version""" # noqa - enabled: bool = SettingsField(True, title="Enabled") - - -class ValidateNamingPlugin(BaseSettingsModel): - """Validate naming of products and layers""" # noqa - invalid_chars: str = SettingsField( - '', - title="Regex pattern of invalid characters" - ) - - replace_char: str = SettingsField( - '', - title="Replacement character" - ) - - -class ExtractImagePlugin(BaseSettingsModel): - """Currently only jpg and png are supported""" - formats: list[str] = SettingsField( - title="Extract Formats", - default_factory=list, - ) - - -class ExtractReviewPlugin(BaseSettingsModel): - make_image_sequence: bool = SettingsField( - False, - title="Make an image sequence instead of flatten image" - ) - - max_downscale_size: int = SettingsField( - 8192, - title="Maximum size of sources for review", - description="FFMpeg can only handle limited resolution for creation of review and/or thumbnail", # noqa - gt=300, # greater than - le=16384, # less or equal - ) - - jpg_options: ExtractedOptions = SettingsField( - title="Extracted jpg Options", - default_factory=ExtractedOptions - ) - - mov_options: ExtractedOptions = SettingsField( - title="Extracted mov Options", - default_factory=ExtractedOptions - ) - - -class PhotoshopPublishPlugins(BaseSettingsModel): - CollectColorCodedInstances: CollectColorCodedInstancesPlugin = ( - SettingsField( - title="Collect Color Coded Instances", - default_factory=CollectColorCodedInstancesPlugin, - ) - ) - CollectReview: CollectReviewPlugin = SettingsField( - title="Collect Review", - default_factory=CollectReviewPlugin, - ) - - CollectVersion: CollectVersionPlugin = SettingsField( - title="Collect Version", - default_factory=CollectVersionPlugin, - ) - - ValidateNaming: ValidateNamingPlugin = SettingsField( - title="Validate naming of products and layers", - default_factory=ValidateNamingPlugin, - ) - - ExtractImage: ExtractImagePlugin = SettingsField( - title="Extract Image", - default_factory=ExtractImagePlugin, - ) - - ExtractReview: ExtractReviewPlugin = SettingsField( - title="Extract Review", - default_factory=ExtractReviewPlugin, - ) - - -DEFAULT_PUBLISH_SETTINGS = { - "CollectColorCodedInstances": { - "create_flatten_image": "no", - "flatten_product_name_template": "", - "color_code_mapping": [] - }, - "CollectReview": { - "enabled": True - }, - "CollectVersion": { - "enabled": False - }, - "ValidateNaming": { - "invalid_chars": "[ \\\\/+\\*\\?\\(\\)\\[\\]\\{\\}:,;]", - "replace_char": "_" - }, - "ExtractImage": { - "formats": [ - "png", - "jpg" - ] - }, - "ExtractReview": { - "make_image_sequence": False, - "max_downscale_size": 8192, - "jpg_options": { - "tags": [ - "review", - "ftrackreview" - ] - }, - "mov_options": { - "tags": [ - "review", - "ftrackreview" - ] - } - } -} diff --git a/server_addon/photoshop/server/settings/workfile_builder.py b/server_addon/photoshop/server/settings/workfile_builder.py deleted file mode 100644 index 4b00b99272..0000000000 --- a/server_addon/photoshop/server/settings/workfile_builder.py +++ /dev/null @@ -1,31 +0,0 @@ -from ayon_server.settings import ( - BaseSettingsModel, - SettingsField, - MultiplatformPathModel, -) - - -class CustomBuilderTemplate(BaseSettingsModel): - _layout = "expanded" - task_types: list[str] = SettingsField( - default_factory=list, - title="Task types", - ) - - path: MultiplatformPathModel = SettingsField( - default_factory=MultiplatformPathModel, - title="Template path" - ) - - -class WorkfileBuilderPlugin(BaseSettingsModel): - _title = "Workfile Builder" - create_first_version: bool = SettingsField( - False, - title="Create first workfile" - ) - - custom_templates: list[CustomBuilderTemplate] = SettingsField( - default_factory=CustomBuilderTemplate, - title="Template profiles" - ) From ac5f3b1024c90b3b8c7568b9a76f3cddd892b20e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 26 Jun 2024 18:25:46 +0200 Subject: [PATCH 06/13] removed clockify addon --- .../clockify/client/ayon_clockify/__init__.py | 5 - .../clockify/client/ayon_clockify/addon.py | 290 ------------ .../client/ayon_clockify/clockify_api.py | 447 ------------------ .../client/ayon_clockify/constants.py | 12 - .../server/action_clockify_sync_server.py | 146 ------ .../ftrack/user/action_clockify_sync_local.py | 123 ----- .../launcher_actions/ClockifyStart.py | 49 -- .../launcher_actions/ClockifySync.py | 81 ---- .../clockify/client/ayon_clockify/version.py | 3 - .../clockify/client/ayon_clockify/widgets.py | 207 -------- server_addon/clockify/package.py | 9 - server_addon/clockify/server/__init__.py | 9 - server_addon/clockify/server/settings.py | 9 - 13 files changed, 1390 deletions(-) delete mode 100644 server_addon/clockify/client/ayon_clockify/__init__.py delete mode 100644 server_addon/clockify/client/ayon_clockify/addon.py delete mode 100644 server_addon/clockify/client/ayon_clockify/clockify_api.py delete mode 100644 server_addon/clockify/client/ayon_clockify/constants.py delete mode 100644 server_addon/clockify/client/ayon_clockify/ftrack/server/action_clockify_sync_server.py delete mode 100644 server_addon/clockify/client/ayon_clockify/ftrack/user/action_clockify_sync_local.py delete mode 100644 server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifyStart.py delete mode 100644 server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifySync.py delete mode 100644 server_addon/clockify/client/ayon_clockify/version.py delete mode 100644 server_addon/clockify/client/ayon_clockify/widgets.py delete mode 100644 server_addon/clockify/package.py delete mode 100644 server_addon/clockify/server/__init__.py delete mode 100644 server_addon/clockify/server/settings.py diff --git a/server_addon/clockify/client/ayon_clockify/__init__.py b/server_addon/clockify/client/ayon_clockify/__init__.py deleted file mode 100644 index 75fb87494e..0000000000 --- a/server_addon/clockify/client/ayon_clockify/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .addon import ClockifyAddon - -__all__ = ( - "ClockifyAddon", -) diff --git a/server_addon/clockify/client/ayon_clockify/addon.py b/server_addon/clockify/client/ayon_clockify/addon.py deleted file mode 100644 index cf35e77ce4..0000000000 --- a/server_addon/clockify/client/ayon_clockify/addon.py +++ /dev/null @@ -1,290 +0,0 @@ -import os -import threading -import time - -from ayon_core.addon import AYONAddon, ITrayAddon, IPluginPaths - -from .version import __version__ -from .constants import CLOCKIFY_FTRACK_USER_PATH, CLOCKIFY_FTRACK_SERVER_PATH - - -class ClockifyAddon(AYONAddon, ITrayAddon, IPluginPaths): - name = "clockify" - version = __version__ - - def initialize(self, studio_settings): - enabled = self.name in studio_settings - workspace_name = None - if enabled: - clockify_settings = studio_settings[self.name] - workspace_name = clockify_settings["workspace_name"] - - if enabled and workspace_name: - self.log.warning("Clockify Workspace is not set in settings.") - enabled = False - self.enabled = enabled - self.workspace_name = workspace_name - - self.timer_manager = None - self.MessageWidgetClass = None - self.message_widget = None - self._clockify_api = None - - # TimersManager attributes - # - set `timers_manager_connector` only in `tray_init` - self.timers_manager_connector = None - self._timer_manager_addon = None - - @property - def clockify_api(self): - if self._clockify_api is None: - from .clockify_api import ClockifyAPI - - self._clockify_api = ClockifyAPI(master_parent=self) - return self._clockify_api - - def get_global_environments(self): - return {"CLOCKIFY_WORKSPACE": self.workspace_name} - - def tray_init(self): - from .widgets import ClockifySettings, MessageWidget - - self.MessageWidgetClass = MessageWidget - - self.message_widget = None - self.widget_settings = ClockifySettings(self.clockify_api) - self.widget_settings_required = None - - self.thread_timer_check = None - # Bools - self.bool_thread_check_running = False - self.bool_api_key_set = False - self.bool_workspace_set = False - self.bool_timer_run = False - self.bool_api_key_set = self.clockify_api.set_api() - - # Define itself as TimersManager connector - self.timers_manager_connector = self - - def tray_start(self): - if self.bool_api_key_set is False: - self.show_settings() - return - - self.bool_workspace_set = self.clockify_api.workspace_id is not None - if self.bool_workspace_set is False: - return - - self.start_timer_check() - self.set_menu_visibility() - - def tray_exit(self, *_a, **_kw): - return - - def get_plugin_paths(self): - """Implementation of IPluginPaths to get plugin paths.""" - actions_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "launcher_actions" - ) - return {"actions": [actions_path]} - - def get_ftrack_event_handler_paths(self): - """Function for ftrack addon to add ftrack event handler paths.""" - return { - "user": [CLOCKIFY_FTRACK_USER_PATH], - "server": [CLOCKIFY_FTRACK_SERVER_PATH], - } - - def clockify_timer_stopped(self): - self.bool_timer_run = False - self.timer_stopped() - - def start_timer_check(self): - self.bool_thread_check_running = True - if self.thread_timer_check is None: - self.thread_timer_check = threading.Thread( - target=self.check_running - ) - self.thread_timer_check.daemon = True - self.thread_timer_check.start() - - def stop_timer_check(self): - self.bool_thread_check_running = True - if self.thread_timer_check is not None: - self.thread_timer_check.join() - self.thread_timer_check = None - - def check_running(self): - while self.bool_thread_check_running is True: - bool_timer_run = False - if self.clockify_api.get_in_progress() is not None: - bool_timer_run = True - - if self.bool_timer_run != bool_timer_run: - if self.bool_timer_run is True: - self.clockify_timer_stopped() - elif self.bool_timer_run is False: - current_timer = self.clockify_api.get_in_progress() - if current_timer is None: - continue - current_proj_id = current_timer.get("projectId") - if not current_proj_id: - continue - - project = self.clockify_api.get_project_by_id( - current_proj_id - ) - if project and project.get("code") == 501: - continue - - project_name = project.get("name") - - current_timer_hierarchy = current_timer.get("description") - if not current_timer_hierarchy: - continue - hierarchy_items = current_timer_hierarchy.split("/") - # Each pype timer must have at least 2 items! - if len(hierarchy_items) < 2: - continue - - task_name = hierarchy_items[-1] - hierarchy = hierarchy_items[:-1] - - data = { - "task_name": task_name, - "hierarchy": hierarchy, - "project_name": project_name, - } - self.timer_started(data) - - self.bool_timer_run = bool_timer_run - self.set_menu_visibility() - time.sleep(5) - - def signed_in(self): - if not self.timer_manager: - return - - if not self.timer_manager.last_task: - return - - if self.timer_manager.is_running: - self.start_timer_manager(self.timer_manager.last_task) - - def on_message_widget_close(self): - self.message_widget = None - - # Definition of Tray menu - def tray_menu(self, parent_menu): - # Menu for Tray App - from qtpy import QtWidgets - - menu = QtWidgets.QMenu("Clockify", parent_menu) - menu.setProperty("submenu", "on") - - # Actions - action_show_settings = QtWidgets.QAction("Settings", menu) - action_stop_timer = QtWidgets.QAction("Stop timer", menu) - - menu.addAction(action_show_settings) - menu.addAction(action_stop_timer) - - action_show_settings.triggered.connect(self.show_settings) - action_stop_timer.triggered.connect(self.stop_timer) - - self.action_stop_timer = action_stop_timer - - self.set_menu_visibility() - - parent_menu.addMenu(menu) - - def show_settings(self): - self.widget_settings.input_api_key.setText( - self.clockify_api.get_api_key() - ) - self.widget_settings.show() - - def set_menu_visibility(self): - self.action_stop_timer.setVisible(self.bool_timer_run) - - # --- TimersManager connection methods --- - def register_timers_manager(self, timer_manager_addon): - """Store TimersManager for future use.""" - self._timer_manager_addon = timer_manager_addon - - def timer_started(self, data): - """Tell TimersManager that timer started.""" - if self._timer_manager_addon is not None: - self._timer_manager_addon.timer_started(self.id, data) - - def timer_stopped(self): - """Tell TimersManager that timer stopped.""" - if self._timer_manager_addon is not None: - self._timer_manager_addon.timer_stopped(self.id) - - def stop_timer(self): - """Called from TimersManager to stop timer.""" - self.clockify_api.finish_time_entry() - - def _verify_project_exists(self, project_name): - project_id = self.clockify_api.get_project_id(project_name) - if not project_id: - self.log.warning( - 'Project "{}" was not found in Clockify. Timer won\'t start.' - ).format(project_name) - - if not self.MessageWidgetClass: - return - - msg = ( - 'Project "{}" is not' - ' in Clockify Workspace "{}".' - "

Please inform your Project Manager." - ).format(project_name, str(self.clockify_api.workspace_name)) - - self.message_widget = self.MessageWidgetClass( - msg, "Clockify - Info Message" - ) - self.message_widget.closed.connect(self.on_message_widget_close) - self.message_widget.show() - return False - return project_id - - def start_timer(self, input_data): - """Called from TimersManager to start timer.""" - # If not api key is not entered then skip - if not self.clockify_api.get_api_key(): - return - - project_name = input_data.get("project_name") - folder_path = input_data.get("folder_path") - task_name = input_data.get("task_name") - task_type = input_data.get("task_type") - if not all((project_name, folder_path, task_name, task_type)): - return - - # Concatenate hierarchy and task to get description - description = "/".join([folder_path.lstrip("/"), task_name]) - - # Check project existence - project_id = self._verify_project_exists(project_name) - if not project_id: - return - - # Setup timer tags - if not task_type: - self.log.info("No tag information found for the timer") - - tag_ids = [] - task_tag_id = self.clockify_api.get_tag_id(task_type) - if task_tag_id is not None: - tag_ids.append(task_tag_id) - - # Start timer - self.clockify_api.start_time_entry( - description, - project_id, - tag_ids=tag_ids, - workspace_id=self.clockify_api.workspace_id, - user_id=self.clockify_api.user_id, - ) diff --git a/server_addon/clockify/client/ayon_clockify/clockify_api.py b/server_addon/clockify/client/ayon_clockify/clockify_api.py deleted file mode 100644 index 38ca6cdb66..0000000000 --- a/server_addon/clockify/client/ayon_clockify/clockify_api.py +++ /dev/null @@ -1,447 +0,0 @@ -import os -import json -import datetime - -import requests - -from ayon_core.lib.local_settings import AYONSecureRegistry -from ayon_core.lib import Logger - -from .constants import ( - CLOCKIFY_ENDPOINT, - ADMIN_PERMISSION_NAMES, -) - - -class ClockifyAPI: - log = Logger.get_logger(__name__) - - def __init__(self, api_key=None, master_parent=None): - self.workspace_name = None - self.master_parent = master_parent - self.api_key = api_key - self._workspace_id = None - self._user_id = None - self._secure_registry = None - - @property - def secure_registry(self): - if self._secure_registry is None: - self._secure_registry = AYONSecureRegistry("clockify") - return self._secure_registry - - @property - def headers(self): - return {"x-api-key": self.api_key} - - @property - def workspace_id(self): - return self._workspace_id - - @property - def user_id(self): - return self._user_id - - def verify_api(self): - for key, value in self.headers.items(): - if value is None or value.strip() == "": - return False - return True - - def set_api(self, api_key=None): - if api_key is None: - api_key = self.get_api_key() - - if api_key is not None and self.validate_api_key(api_key) is True: - self.api_key = api_key - self.set_workspace() - self.set_user_id() - if self.master_parent: - self.master_parent.signed_in() - return True - return False - - def validate_api_key(self, api_key): - test_headers = {"x-api-key": api_key} - action_url = "user" - response = requests.get( - CLOCKIFY_ENDPOINT + action_url, headers=test_headers - ) - if response.status_code != 200: - return False - return True - - def validate_workspace_permissions(self, workspace_id=None, user_id=None): - if user_id is None: - self.log.info("No user_id found during validation") - return False - if workspace_id is None: - workspace_id = self.workspace_id - action_url = f"workspaces/{workspace_id}/users?includeRoles=1" - response = requests.get( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers - ) - data = response.json() - for user in data: - if user.get("id") == user_id: - roles_data = user.get("roles") - for entities in roles_data: - if entities.get("role") in ADMIN_PERMISSION_NAMES: - return True - return False - - def get_user_id(self): - action_url = "user" - response = requests.get( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers - ) - result = response.json() - user_id = result.get("id", None) - - return user_id - - def set_workspace(self, name=None): - if name is None: - name = os.environ.get("CLOCKIFY_WORKSPACE", None) - self.workspace_name = name - if self.workspace_name is None: - return - try: - result = self.validate_workspace() - except Exception: - result = False - if result is not False: - self._workspace_id = result - if self.master_parent is not None: - self.master_parent.start_timer_check() - return True - return False - - def validate_workspace(self, name=None): - if name is None: - name = self.workspace_name - all_workspaces = self.get_workspaces() - if name in all_workspaces: - return all_workspaces[name] - return False - - def set_user_id(self): - try: - user_id = self.get_user_id() - except Exception: - user_id = None - if user_id is not None: - self._user_id = user_id - - def get_api_key(self): - return self.secure_registry.get_item("api_key", None) - - def save_api_key(self, api_key): - self.secure_registry.set_item("api_key", api_key) - - def get_workspaces(self): - action_url = "workspaces/" - response = requests.get( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers - ) - return { - workspace["name"]: workspace["id"] for workspace in response.json() - } - - def get_projects(self, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - action_url = f"workspaces/{workspace_id}/projects" - response = requests.get( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers - ) - if response.status_code != 403: - result = response.json() - return {project["name"]: project["id"] for project in result} - - def get_project_by_id(self, project_id, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - action_url = "workspaces/{}/projects/{}".format( - workspace_id, project_id - ) - response = requests.get( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers - ) - - return response.json() - - def get_tags(self, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - action_url = "workspaces/{}/tags".format(workspace_id) - response = requests.get( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers - ) - - return {tag["name"]: tag["id"] for tag in response.json()} - - def get_tasks(self, project_id, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - action_url = "workspaces/{}/projects/{}/tasks".format( - workspace_id, project_id - ) - response = requests.get( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers - ) - - return {task["name"]: task["id"] for task in response.json()} - - def get_workspace_id(self, workspace_name): - all_workspaces = self.get_workspaces() - if workspace_name not in all_workspaces: - return None - return all_workspaces[workspace_name] - - def get_project_id(self, project_name, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - all_projects = self.get_projects(workspace_id) - if project_name not in all_projects: - return None - return all_projects[project_name] - - def get_tag_id(self, tag_name, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - all_tasks = self.get_tags(workspace_id) - if tag_name not in all_tasks: - return None - return all_tasks[tag_name] - - def get_task_id(self, task_name, project_id, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - all_tasks = self.get_tasks(project_id, workspace_id) - if task_name not in all_tasks: - return None - return all_tasks[task_name] - - def get_current_time(self): - return str(datetime.datetime.utcnow().isoformat()) + "Z" - - def start_time_entry( - self, - description, - project_id, - task_id=None, - tag_ids=None, - workspace_id=None, - user_id=None, - billable=True, - ): - # Workspace - if workspace_id is None: - workspace_id = self.workspace_id - # User ID - if user_id is None: - user_id = self._user_id - - # get running timer to check if we need to start it - current_timer = self.get_in_progress() - - # Check if is currently run another times and has same values - # DO not restart the timer, if it is already running for current task - if current_timer: - current_timer_hierarchy = current_timer.get("description") - current_project_id = current_timer.get("projectId") - current_task_id = current_timer.get("taskId") - if ( - description == current_timer_hierarchy - and project_id == current_project_id - and task_id == current_task_id - ): - self.log.info( - "Timer for the current project is already running" - ) - self.bool_timer_run = True - return self.bool_timer_run - self.finish_time_entry() - - # Convert billable to strings - if billable: - billable = "true" - else: - billable = "false" - # Rest API Action - action_url = "workspaces/{}/user/{}/time-entries".format( - workspace_id, user_id - ) - start = self.get_current_time() - body = { - "start": start, - "billable": billable, - "description": description, - "projectId": project_id, - "taskId": task_id, - "tagIds": tag_ids, - } - response = requests.post( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers, json=body - ) - if response.status_code < 300: - return True - return False - - def _get_current_timer_values(self, response): - if response is None: - return - try: - output = response.json() - except json.decoder.JSONDecodeError: - return None - if output and isinstance(output, list): - return output[0] - return None - - def get_in_progress(self, user_id=None, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - if user_id is None: - user_id = self.user_id - - action_url = ( - f"workspaces/{workspace_id}/user/" - f"{user_id}/time-entries?in-progress=1" - ) - response = requests.get( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers - ) - return self._get_current_timer_values(response) - - def finish_time_entry(self, workspace_id=None, user_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - if user_id is None: - user_id = self.user_id - current_timer = self.get_in_progress() - if not current_timer: - return - action_url = "workspaces/{}/user/{}/time-entries".format( - workspace_id, user_id - ) - body = {"end": self.get_current_time()} - response = requests.patch( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers, json=body - ) - return response.json() - - def get_time_entries(self, workspace_id=None, user_id=None, quantity=10): - if workspace_id is None: - workspace_id = self.workspace_id - if user_id is None: - user_id = self.user_id - action_url = "workspaces/{}/user/{}/time-entries".format( - workspace_id, user_id - ) - response = requests.get( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers - ) - return response.json()[:quantity] - - def remove_time_entry(self, tid, workspace_id=None, user_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - action_url = "workspaces/{}/user/{}/time-entries/{}".format( - workspace_id, user_id, tid - ) - response = requests.delete( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers - ) - return response.json() - - def add_project(self, name, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - action_url = "workspaces/{}/projects".format(workspace_id) - body = { - "name": name, - "clientId": "", - "isPublic": "false", - "estimate": {"estimate": 0, "type": "AUTO"}, - "color": "#f44336", - "billable": "true", - } - response = requests.post( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers, json=body - ) - return response.json() - - def add_workspace(self, name): - action_url = "workspaces/" - body = {"name": name} - response = requests.post( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers, json=body - ) - return response.json() - - def add_task(self, name, project_id, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - action_url = "workspaces/{}/projects/{}/tasks".format( - workspace_id, project_id - ) - body = {"name": name, "projectId": project_id} - response = requests.post( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers, json=body - ) - return response.json() - - def add_tag(self, name, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - action_url = "workspaces/{}/tags".format(workspace_id) - body = {"name": name} - response = requests.post( - CLOCKIFY_ENDPOINT + action_url, headers=self.headers, json=body - ) - return response.json() - - def delete_project(self, project_id, workspace_id=None): - if workspace_id is None: - workspace_id = self.workspace_id - action_url = "/workspaces/{}/projects/{}".format( - workspace_id, project_id - ) - response = requests.delete( - CLOCKIFY_ENDPOINT + action_url, - headers=self.headers, - ) - return response.json() - - def convert_input( - self, entity_id, entity_name, mode="Workspace", project_id=None - ): - if entity_id is None: - error = False - error_msg = 'Missing information "{}"' - if mode.lower() == "workspace": - if entity_id is None and entity_name is None: - if self.workspace_id is not None: - entity_id = self.workspace_id - else: - error = True - else: - entity_id = self.get_workspace_id(entity_name) - else: - if entity_id is None and entity_name is None: - error = True - elif mode.lower() == "project": - entity_id = self.get_project_id(entity_name) - elif mode.lower() == "task": - entity_id = self.get_task_id( - task_name=entity_name, project_id=project_id - ) - else: - raise TypeError("Unknown type") - # Raise error - if error: - raise ValueError(error_msg.format(mode)) - - return entity_id diff --git a/server_addon/clockify/client/ayon_clockify/constants.py b/server_addon/clockify/client/ayon_clockify/constants.py deleted file mode 100644 index 4574f91be1..0000000000 --- a/server_addon/clockify/client/ayon_clockify/constants.py +++ /dev/null @@ -1,12 +0,0 @@ -import os - - -CLOCKIFY_FTRACK_SERVER_PATH = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "ftrack", "server" -) -CLOCKIFY_FTRACK_USER_PATH = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "ftrack", "user" -) - -ADMIN_PERMISSION_NAMES = ["WORKSPACE_OWN", "WORKSPACE_ADMIN"] -CLOCKIFY_ENDPOINT = "https://api.clockify.me/api/v1/" diff --git a/server_addon/clockify/client/ayon_clockify/ftrack/server/action_clockify_sync_server.py b/server_addon/clockify/client/ayon_clockify/ftrack/server/action_clockify_sync_server.py deleted file mode 100644 index ed83fed287..0000000000 --- a/server_addon/clockify/client/ayon_clockify/ftrack/server/action_clockify_sync_server.py +++ /dev/null @@ -1,146 +0,0 @@ -import os -import json - -from ayon_clockify.clockify_api import ClockifyAPI - -from ayon_ftrack.lib import ServerAction - - -class SyncClockifyServer(ServerAction): - '''Synchronise project names and task types.''' - - identifier = "clockify.sync.server" - label = "Sync To Clockify (server)" - description = "Synchronise data to Clockify workspace" - - role_list = ["Administrator", "project Manager"] - - def __init__(self, *args, **kwargs): - super(SyncClockifyServer, self).__init__(*args, **kwargs) - - workspace_name = os.environ.get("CLOCKIFY_WORKSPACE") - api_key = os.environ.get("CLOCKIFY_API_KEY") - self.clockify_api = ClockifyAPI(api_key) - self.clockify_api.set_workspace(workspace_name) - if api_key is None: - modified_key = "None" - else: - str_len = int(len(api_key) / 2) - start_replace = int(len(api_key) / 4) - modified_key = "" - for idx in range(len(api_key)): - if idx >= start_replace and idx < start_replace + str_len: - replacement = "X" - else: - replacement = api_key[idx] - modified_key += replacement - - self.log.info( - "Clockify info. Workspace: \"{}\" API key: \"{}\"".format( - str(workspace_name), str(modified_key) - ) - ) - - def discover(self, session, entities, event): - if ( - len(entities) != 1 - or entities[0].entity_type.lower() != "project" - ): - return False - return True - - def launch(self, session, entities, event): - self.clockify_api.set_api() - if self.clockify_api.workspace_id is None: - return { - "success": False, - "message": "Clockify Workspace or API key are not set!" - } - - if not self.clockify_api.validate_workspace_permissions( - self.clockify_api.workspace_id, self.clockify_api.user_id - ): - return { - "success": False, - "message": "Missing permissions for this action!" - } - - # JOB SETTINGS - user_id = event["source"]["user"]["id"] - user = session.query("User where id is " + user_id).one() - - job = session.create("Job", { - "user": user, - "status": "running", - "data": json.dumps({"description": "Sync Ftrack to Clockify"}) - }) - session.commit() - - project_entity = entities[0] - if project_entity.entity_type.lower() != "project": - project_entity = self.get_project_from_entity(project_entity) - - project_name = project_entity["full_name"] - self.log.info( - "Synchronization of project \"{}\" to clockify begins.".format( - project_name - ) - ) - task_types = ( - project_entity["project_schema"]["_task_type_schema"]["types"] - ) - task_type_names = [ - task_type["name"] for task_type in task_types - ] - try: - clockify_projects = self.clockify_api.get_projects() - if project_name not in clockify_projects: - response = self.clockify_api.add_project(project_name) - if "id" not in response: - self.log.warning( - "Project \"{}\" can't be created. Response: {}".format( - project_name, response - ) - ) - return { - "success": False, - "message": ( - "Can't create clockify project \"{}\"." - " Unexpected error." - ).format(project_name) - } - - clockify_workspace_tags = self.clockify_api.get_tags() - for task_type_name in task_type_names: - if task_type_name in clockify_workspace_tags: - self.log.debug( - "Task \"{}\" already exist".format(task_type_name) - ) - continue - - response = self.clockify_api.add_tag(task_type_name) - if "id" not in response: - self.log.warning( - "Task \"{}\" can't be created. Response: {}".format( - task_type_name, response - ) - ) - - job["status"] = "done" - - except Exception: - self.log.warning( - "Synchronization to clockify failed.", - exc_info=True - ) - - finally: - if job["status"] != "done": - job["status"] = "failed" - session.commit() - - return True - - -def register(session, **kw): - SyncClockifyServer(session).register() diff --git a/server_addon/clockify/client/ayon_clockify/ftrack/user/action_clockify_sync_local.py b/server_addon/clockify/client/ayon_clockify/ftrack/user/action_clockify_sync_local.py deleted file mode 100644 index 05a94e56fd..0000000000 --- a/server_addon/clockify/client/ayon_clockify/ftrack/user/action_clockify_sync_local.py +++ /dev/null @@ -1,123 +0,0 @@ -import json -from ayon_clockify.clockify_api import ClockifyAPI -from ayon_ftrack.lib import BaseAction, statics_icon - - -class SyncClockifyLocal(BaseAction): - """Synchronise project names and task types.""" - - identifier = "clockify.sync.local" - label = "Sync To Clockify" - description = "Synchronise data to Clockify workspace" - role_list = ["Administrator", "project Manager"] - icon = statics_icon("app_icons", "clockify-white.png") - - def __init__(self, *args, **kwargs): - super(SyncClockifyLocal, self).__init__(*args, **kwargs) - - self.clockify_api = ClockifyAPI() - - def discover(self, session, entities, event): - if ( - len(entities) == 1 - and entities[0].entity_type.lower() == "project" - ): - return True - return False - - def launch(self, session, entities, event): - self.clockify_api.set_api() - if self.clockify_api.workspace_id is None: - return { - "success": False, - "message": "Clockify Workspace or API key are not set!" - } - - if ( - self.clockify_api.validate_workspace_permissions( - self.clockify_api.workspace_id, self.clockify_api.user_id) - is False - ): - return { - "success": False, - "message": "Missing permissions for this action!" - } - - # JOB SETTINGS - userId = event['source']['user']['id'] - user = session.query('User where id is ' + userId).one() - - job = session.create('Job', { - 'user': user, - 'status': 'running', - 'data': json.dumps({ - 'description': 'Sync ftrack to Clockify' - }) - }) - session.commit() - - project_entity = entities[0] - if project_entity.entity_type.lower() != "project": - project_entity = self.get_project_from_entity(project_entity) - - project_name = project_entity["full_name"] - self.log.info( - "Synchronization of project \"{}\" to clockify begins.".format( - project_name - ) - ) - task_types = ( - project_entity["project_schema"]["_task_type_schema"]["types"] - ) - task_type_names = [ - task_type["name"] for task_type in task_types - ] - try: - clockify_projects = self.clockify_api.get_projects() - if project_name not in clockify_projects: - response = self.clockify_api.add_project(project_name) - if "id" not in response: - self.log.warning( - "Project \"{}\" can't be created. Response: {}".format( - project_name, response - ) - ) - return { - "success": False, - "message": ( - "Can't create clockify project \"{}\"." - " Unexpected error." - ).format(project_name) - } - - clockify_workspace_tags = self.clockify_api.get_tags() - for task_type_name in task_type_names: - if task_type_name in clockify_workspace_tags: - self.log.debug( - "Task \"{}\" already exist".format(task_type_name) - ) - continue - - response = self.clockify_api.add_tag(task_type_name) - if "id" not in response: - self.log.warning( - "Task \"{}\" can't be created. Response: {}".format( - task_type_name, response - ) - ) - - job["status"] = "done" - - except Exception: - pass - - finally: - if job["status"] != "done": - job["status"] = "failed" - session.commit() - - return True - - -def register(session, **kw): - SyncClockifyLocal(session).register() diff --git a/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifyStart.py b/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifyStart.py deleted file mode 100644 index d69d0371c0..0000000000 --- a/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifyStart.py +++ /dev/null @@ -1,49 +0,0 @@ -import ayon_api - -from ayon_clockify.clockify_api import ClockifyAPI - -from ayon_core.pipeline import LauncherAction - - -class ClockifyStart(LauncherAction): - name = "clockify_start_timer" - label = "Clockify - Start Timer" - icon = "app_icons/clockify.png" - order = 500 - clockify_api = ClockifyAPI() - - def is_compatible(self, selection): - """Return whether the action is compatible with the session""" - return selection.is_task_selected - - def process(self, selection, **kwargs): - self.clockify_api.set_api() - user_id = self.clockify_api.user_id - workspace_id = self.clockify_api.workspace_id - project_name = selection.project_name - folder_path = selection.folder_path - task_name = selection.task_name - description = "/".join([folder_path.lstrip("/"), task_name]) - - # fetch folder entity - folder_entity = ayon_api.get_folder_by_path(project_name, folder_path) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - - # get task type to fill the timer tag - task_type = task_entity["taskType"] - - project_id = self.clockify_api.get_project_id( - project_name, workspace_id - ) - tag_ids = [] - tag_name = task_type - tag_ids.append(self.clockify_api.get_tag_id(tag_name, workspace_id)) - self.clockify_api.start_time_entry( - description, - project_id, - tag_ids=tag_ids, - workspace_id=workspace_id, - user_id=user_id, - ) diff --git a/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifySync.py b/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifySync.py deleted file mode 100644 index a32f2a8082..0000000000 --- a/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifySync.py +++ /dev/null @@ -1,81 +0,0 @@ -import ayon_api - -from ayon_clockify.clockify_api import ClockifyAPI -from ayon_core.pipeline import LauncherAction - - -class ClockifyPermissionsCheckFailed(Exception): - """Timer start failed due to user permissions check. - Message should be self explanatory as traceback won't be shown. - """ - - pass - - -class ClockifySync(LauncherAction): - name = "sync_to_clockify" - label = "Sync to Clockify" - icon = "app_icons/clockify-white.png" - order = 500 - clockify_api = ClockifyAPI() - - def is_compatible(self, selection): - """Check if there's some projects to sync""" - if selection.is_project_selected: - return True - - try: - next(ayon_api.get_projects()) - return True - except StopIteration: - return False - - def process(self, selection, **kwargs): - self.clockify_api.set_api() - workspace_id = self.clockify_api.workspace_id - user_id = self.clockify_api.user_id - if not self.clockify_api.validate_workspace_permissions( - workspace_id, user_id - ): - raise ClockifyPermissionsCheckFailed( - "Current CLockify user is missing permissions for this action!" - ) - - if selection.is_project_selected: - projects_to_sync = [selection.project_entity] - else: - projects_to_sync = ayon_api.get_projects() - - projects_info = { - project["name"]: { - task_type["name"] - for task_type in project["taskTypes"] - } - for project in projects_to_sync - } - - clockify_projects = self.clockify_api.get_projects(workspace_id) - for project_name, task_types in projects_info.items(): - if project_name in clockify_projects: - continue - - response = self.clockify_api.add_project( - project_name, workspace_id - ) - if "id" not in response: - self.log.error( - "Project {} can't be created".format(project_name) - ) - continue - - clockify_workspace_tags = self.clockify_api.get_tags(workspace_id) - for task_type in task_types: - if task_type not in clockify_workspace_tags: - response = self.clockify_api.add_tag( - task_type, workspace_id - ) - if "id" not in response: - self.log.error( - "Task {} can't be created".format(task_type) - ) - continue diff --git a/server_addon/clockify/client/ayon_clockify/version.py b/server_addon/clockify/client/ayon_clockify/version.py deleted file mode 100644 index 36bfd79364..0000000000 --- a/server_addon/clockify/client/ayon_clockify/version.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -"""Package declaring AYON addon 'clockify' version.""" -__version__ = "0.2.1" diff --git a/server_addon/clockify/client/ayon_clockify/widgets.py b/server_addon/clockify/client/ayon_clockify/widgets.py deleted file mode 100644 index e64b64601d..0000000000 --- a/server_addon/clockify/client/ayon_clockify/widgets.py +++ /dev/null @@ -1,207 +0,0 @@ -from qtpy import QtCore, QtGui, QtWidgets -from ayon_core import resources, style - - -class MessageWidget(QtWidgets.QWidget): - - SIZE_W = 300 - SIZE_H = 130 - - closed = QtCore.Signal() - - def __init__(self, messages, title): - super(MessageWidget, self).__init__() - - # Icon - icon = QtGui.QIcon(resources.get_ayon_icon_filepath()) - self.setWindowIcon(icon) - - self.setWindowFlags( - QtCore.Qt.WindowCloseButtonHint | - QtCore.Qt.WindowMinimizeButtonHint - ) - - # Size setting - self.resize(self.SIZE_W, self.SIZE_H) - self.setMinimumSize(QtCore.QSize(self.SIZE_W, self.SIZE_H)) - self.setMaximumSize(QtCore.QSize(self.SIZE_W+100, self.SIZE_H+100)) - - # Style - self.setStyleSheet(style.load_stylesheet()) - - self.setLayout(self._ui_layout(messages)) - self.setWindowTitle(title) - - def _ui_layout(self, messages): - if not messages: - messages = ["*Missing messages (This is a bug)*", ] - - elif not isinstance(messages, (tuple, list)): - messages = [messages, ] - - main_layout = QtWidgets.QVBoxLayout(self) - - labels = [] - for message in messages: - label = QtWidgets.QLabel(message) - label.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) - label.setTextFormat(QtCore.Qt.RichText) - label.setWordWrap(True) - - labels.append(label) - main_layout.addWidget(label) - - btn_close = QtWidgets.QPushButton("Close") - btn_close.setToolTip('Close this window') - btn_close.clicked.connect(self.on_close_clicked) - - btn_group = QtWidgets.QHBoxLayout() - btn_group.addStretch(1) - btn_group.addWidget(btn_close) - - main_layout.addLayout(btn_group) - - self.labels = labels - self.btn_group = btn_group - self.btn_close = btn_close - self.main_layout = main_layout - - return main_layout - - def on_close_clicked(self): - self.close() - - def close(self, *args, **kwargs): - self.closed.emit() - super(MessageWidget, self).close(*args, **kwargs) - - -class ClockifySettings(QtWidgets.QWidget): - SIZE_W = 500 - SIZE_H = 130 - - loginSignal = QtCore.Signal(object, object, object) - - def __init__(self, clockify_api, optional=True): - super(ClockifySettings, self).__init__() - - self.clockify_api = clockify_api - self.optional = optional - self.validated = False - - # Icon - icon = QtGui.QIcon(resources.get_ayon_icon_filepath()) - self.setWindowIcon(icon) - - self.setWindowTitle("Clockify settings") - self.setWindowFlags( - QtCore.Qt.WindowCloseButtonHint | - QtCore.Qt.WindowMinimizeButtonHint - ) - - # Size setting - self.resize(self.SIZE_W, self.SIZE_H) - self.setMinimumSize(QtCore.QSize(self.SIZE_W, self.SIZE_H)) - self.setMaximumSize(QtCore.QSize(self.SIZE_W+100, self.SIZE_H+100)) - self.setStyleSheet(style.load_stylesheet()) - - self._ui_init() - - def _ui_init(self): - label_api_key = QtWidgets.QLabel("Clockify API key:") - - input_api_key = QtWidgets.QLineEdit() - input_api_key.setFrame(True) - input_api_key.setPlaceholderText("e.g. XX1XxXX2x3x4xXxx") - - error_label = QtWidgets.QLabel("") - error_label.setTextFormat(QtCore.Qt.RichText) - error_label.setWordWrap(True) - error_label.hide() - - form_layout = QtWidgets.QFormLayout() - form_layout.setContentsMargins(10, 15, 10, 5) - form_layout.addRow(label_api_key, input_api_key) - form_layout.addRow(error_label) - - btn_ok = QtWidgets.QPushButton("Ok") - btn_ok.setToolTip('Sets Clockify API Key so can Start/Stop timer') - - btn_cancel = QtWidgets.QPushButton("Cancel") - cancel_tooltip = 'Application won\'t start' - if self.optional: - cancel_tooltip = 'Close this window' - btn_cancel.setToolTip(cancel_tooltip) - - btn_group = QtWidgets.QHBoxLayout() - btn_group.addStretch(1) - btn_group.addWidget(btn_ok) - btn_group.addWidget(btn_cancel) - - main_layout = QtWidgets.QVBoxLayout(self) - main_layout.addLayout(form_layout) - main_layout.addLayout(btn_group) - - btn_ok.clicked.connect(self.click_ok) - btn_cancel.clicked.connect(self._close_widget) - - self.label_api_key = label_api_key - self.input_api_key = input_api_key - self.error_label = error_label - - self.btn_ok = btn_ok - self.btn_cancel = btn_cancel - - def setError(self, msg): - self.error_label.setText(msg) - self.error_label.show() - - def invalid_input(self, entity): - entity.setStyleSheet("border: 1px solid red;") - - def click_ok(self): - api_key = self.input_api_key.text().strip() - if self.optional is True and api_key == '': - self.clockify_api.save_api_key(None) - self.clockify_api.set_api(api_key) - self.validated = False - self._close_widget() - return - - validation = self.clockify_api.validate_api_key(api_key) - - if validation: - self.clockify_api.save_api_key(api_key) - self.clockify_api.set_api(api_key) - self.validated = True - self._close_widget() - else: - self.invalid_input(self.input_api_key) - self.validated = False - self.setError( - "Entered invalid API key" - ) - - def showEvent(self, event): - super(ClockifySettings, self).showEvent(event) - - # Make btns same width - max_width = max( - self.btn_ok.sizeHint().width(), - self.btn_cancel.sizeHint().width() - ) - self.btn_ok.setMinimumWidth(max_width) - self.btn_cancel.setMinimumWidth(max_width) - - def closeEvent(self, event): - if self.optional is True: - event.ignore() - self._close_widget() - else: - self.validated = False - - def _close_widget(self): - if self.optional is True: - self.hide() - else: - self.close() diff --git a/server_addon/clockify/package.py b/server_addon/clockify/package.py deleted file mode 100644 index 3245e61ca1..0000000000 --- a/server_addon/clockify/package.py +++ /dev/null @@ -1,9 +0,0 @@ -name = "clockify" -title = "Clockify" -version = "0.2.1" -client_dir = "ayon_clockify" - -ayon_required_addons = { - "core": ">0.3.2", -} -ayon_compatible_addons = {} diff --git a/server_addon/clockify/server/__init__.py b/server_addon/clockify/server/__init__.py deleted file mode 100644 index 11bbfed261..0000000000 --- a/server_addon/clockify/server/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from typing import Type - -from ayon_server.addons import BaseServerAddon - -from .settings import ClockifySettings - - -class ClockifyAddon(BaseServerAddon): - settings_model: Type[ClockifySettings] = ClockifySettings diff --git a/server_addon/clockify/server/settings.py b/server_addon/clockify/server/settings.py deleted file mode 100644 index c01d4c1545..0000000000 --- a/server_addon/clockify/server/settings.py +++ /dev/null @@ -1,9 +0,0 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField - - -class ClockifySettings(BaseSettingsModel): - workspace_name: str = SettingsField( - "", - title="Workspace name", - scope=["studio"] - ) From 2d6cf6d8d7b5fe92c11614e1290fefcf21e3ebf0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 26 Jun 2024 18:35:58 +0200 Subject: [PATCH 07/13] removed celaction addon --- .../client/ayon_celaction/__init__.py | 13 -- .../celaction/client/ayon_celaction/addon.py | 31 ---- .../hooks/pre_celaction_setup.py | 152 ------------------ .../publish/collect_celaction_cli_kwargs.py | 60 ------- .../publish/collect_celaction_instances.py | 96 ----------- .../plugins/publish/collect_render_path.py | 65 -------- .../plugins/publish/integrate_version_up.py | 22 --- .../resources/celaction_template_scene.scn | Bin 5151 -> 0 bytes .../client/ayon_celaction/scripts/__init__.py | 0 .../ayon_celaction/scripts/publish_cli.py | 36 ----- .../client/ayon_celaction/version.py | 3 - server_addon/celaction/package.py | 12 -- server_addon/celaction/server/__init__.py | 13 -- server_addon/celaction/server/imageio.py | 63 -------- server_addon/celaction/server/settings.py | 91 ----------- 15 files changed, 657 deletions(-) delete mode 100644 server_addon/celaction/client/ayon_celaction/__init__.py delete mode 100644 server_addon/celaction/client/ayon_celaction/addon.py delete mode 100644 server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py delete mode 100644 server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_cli_kwargs.py delete mode 100644 server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_instances.py delete mode 100644 server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py delete mode 100644 server_addon/celaction/client/ayon_celaction/plugins/publish/integrate_version_up.py delete mode 100644 server_addon/celaction/client/ayon_celaction/resources/celaction_template_scene.scn delete mode 100644 server_addon/celaction/client/ayon_celaction/scripts/__init__.py delete mode 100644 server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py delete mode 100644 server_addon/celaction/client/ayon_celaction/version.py delete mode 100644 server_addon/celaction/package.py delete mode 100644 server_addon/celaction/server/__init__.py delete mode 100644 server_addon/celaction/server/imageio.py delete mode 100644 server_addon/celaction/server/settings.py diff --git a/server_addon/celaction/client/ayon_celaction/__init__.py b/server_addon/celaction/client/ayon_celaction/__init__.py deleted file mode 100644 index 0df0224125..0000000000 --- a/server_addon/celaction/client/ayon_celaction/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from .version import __version__ -from .addon import ( - CELACTION_ROOT_DIR, - CelactionAddon, -) - - -__all__ = ( - "__version__", - - "CELACTION_ROOT_DIR", - "CelactionAddon", -) diff --git a/server_addon/celaction/client/ayon_celaction/addon.py b/server_addon/celaction/client/ayon_celaction/addon.py deleted file mode 100644 index ad04a54088..0000000000 --- a/server_addon/celaction/client/ayon_celaction/addon.py +++ /dev/null @@ -1,31 +0,0 @@ -import os -from ayon_core.addon import AYONAddon, IHostAddon - -from .version import __version__ - -CELACTION_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) - - -class CelactionAddon(AYONAddon, IHostAddon): - name = "celaction" - version = __version__ - host_name = "celaction" - - def get_launch_hook_paths(self, app): - if app.host_name != self.host_name: - return [] - return [ - os.path.join(CELACTION_ROOT_DIR, "hooks") - ] - - def add_implementation_envs(self, env, _app): - # Set default values if are not already set via settings - defaults = { - "LOGLEVEL": "DEBUG" - } - for key, value in defaults.items(): - if not env.get(key): - env[key] = value - - def get_workfile_extensions(self): - return [".scn"] diff --git a/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py deleted file mode 100644 index 52622d43b8..0000000000 --- a/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py +++ /dev/null @@ -1,152 +0,0 @@ -import os -import shutil -import winreg -import subprocess -from ayon_core.lib import get_ayon_launcher_args -from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_celaction import CELACTION_ROOT_DIR - - -class CelactionPrelaunchHook(PreLaunchHook): - """Bootstrap celacion with AYON""" - app_groups = {"celaction"} - platforms = {"windows"} - launch_types = {LaunchTypes.local} - - def execute(self): - folder_attributes = self.data["folder_entity"]["attrib"] - width = folder_attributes["resolutionWidth"] - height = folder_attributes["resolutionHeight"] - - # Add workfile path to launch arguments - workfile_path = self.workfile_path() - if workfile_path: - self.launch_context.launch_args.append(workfile_path) - - # setting output parameters - path_user_settings = "\\".join([ - "Software", "CelAction", "CelAction2D", "User Settings" - ]) - winreg.CreateKey(winreg.HKEY_CURRENT_USER, path_user_settings) - hKey = winreg.OpenKey( - winreg.HKEY_CURRENT_USER, path_user_settings, 0, - winreg.KEY_ALL_ACCESS - ) - - path_to_cli = os.path.join( - CELACTION_ROOT_DIR, "scripts", "publish_cli.py" - ) - subprocess_args = get_ayon_launcher_args("run", path_to_cli) - executable = subprocess_args.pop(0) - workfile_settings = self.get_workfile_settings() - - winreg.SetValueEx( - hKey, - "SubmitAppTitle", - 0, - winreg.REG_SZ, - executable - ) - - # add required arguments for workfile path - parameters = subprocess_args + [ - "--currentFile", "*SCENE*" - ] - - # Add custom parameters from workfile settings - if "render_chunk" in workfile_settings["submission_overrides"]: - parameters += [ - "--chunk", "*CHUNK*" - ] - if "resolution" in workfile_settings["submission_overrides"]: - parameters += [ - "--resolutionWidth", "*X*", - "--resolutionHeight", "*Y*" - ] - if "frame_range" in workfile_settings["submission_overrides"]: - parameters += [ - "--frameStart", "*START*", - "--frameEnd", "*END*" - ] - - winreg.SetValueEx( - hKey, "SubmitParametersTitle", 0, winreg.REG_SZ, - subprocess.list2cmdline(parameters) - ) - - self.log.debug(f"__ parameters: \"{parameters}\"") - - # setting resolution parameters - path_submit = "\\".join([ - path_user_settings, "Dialogs", "SubmitOutput" - ]) - winreg.CreateKey(winreg.HKEY_CURRENT_USER, path_submit) - hKey = winreg.OpenKey( - winreg.HKEY_CURRENT_USER, path_submit, 0, - winreg.KEY_ALL_ACCESS - ) - winreg.SetValueEx(hKey, "SaveScene", 0, winreg.REG_DWORD, 1) - winreg.SetValueEx(hKey, "CustomX", 0, winreg.REG_DWORD, width) - winreg.SetValueEx(hKey, "CustomY", 0, winreg.REG_DWORD, height) - - # making sure message dialogs don't appear when overwriting - path_overwrite_scene = "\\".join([ - path_user_settings, "Messages", "OverwriteScene" - ]) - winreg.CreateKey(winreg.HKEY_CURRENT_USER, path_overwrite_scene) - hKey = winreg.OpenKey( - winreg.HKEY_CURRENT_USER, path_overwrite_scene, 0, - winreg.KEY_ALL_ACCESS - ) - winreg.SetValueEx(hKey, "Result", 0, winreg.REG_DWORD, 6) - winreg.SetValueEx(hKey, "Valid", 0, winreg.REG_DWORD, 1) - - # set scane as not saved - path_scene_saved = "\\".join([ - path_user_settings, "Messages", "SceneSaved" - ]) - winreg.CreateKey(winreg.HKEY_CURRENT_USER, path_scene_saved) - hKey = winreg.OpenKey( - winreg.HKEY_CURRENT_USER, path_scene_saved, 0, - winreg.KEY_ALL_ACCESS - ) - winreg.SetValueEx(hKey, "Result", 0, winreg.REG_DWORD, 1) - winreg.SetValueEx(hKey, "Valid", 0, winreg.REG_DWORD, 1) - - def workfile_path(self): - workfile_path = self.data["last_workfile_path"] - - # copy workfile from template if doesn't exist any on path - if not os.path.exists(workfile_path): - # TODO add ability to set different template workfile path via - # settings - template_path = os.path.join( - CELACTION_ROOT_DIR, - "resources", - "celaction_template_scene.scn" - ) - - if not os.path.exists(template_path): - self.log.warning( - "Couldn't find workfile template file in {}".format( - template_path - ) - ) - return - - self.log.info( - f"Creating workfile from template: \"{template_path}\"" - ) - - # Copy template workfile to new destinantion - shutil.copy2( - os.path.normpath(template_path), - os.path.normpath(workfile_path) - ) - - self.log.info(f"Workfile to open: \"{workfile_path}\"") - - return workfile_path - - def get_workfile_settings(self): - return self.data["project_settings"]["celaction"]["workfile"] diff --git a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_cli_kwargs.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_cli_kwargs.py deleted file mode 100644 index 1820569918..0000000000 --- a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_cli_kwargs.py +++ /dev/null @@ -1,60 +0,0 @@ -import pyblish.api -import sys -from pprint import pformat - - -class CollectCelactionCliKwargs(pyblish.api.ContextPlugin): - """ Collects all keyword arguments passed from the terminal """ - - label = "Collect Celaction Cli Kwargs" - order = pyblish.api.CollectorOrder - 0.1 - - def process(self, context): - args = list(sys.argv[1:]) - self.log.info(str(args)) - missing_kwargs = [] - passing_kwargs = {} - for key in ( - "chunk", - "frameStart", - "frameEnd", - "resolutionWidth", - "resolutionHeight", - "currentFile", - ): - arg_key = f"--{key}" - if arg_key not in args: - missing_kwargs.append(key) - continue - arg_idx = args.index(arg_key) - args.pop(arg_idx) - if key != "currentFile": - value = args.pop(arg_idx) - else: - path_parts = [] - while arg_idx < len(args): - path_parts.append(args.pop(arg_idx)) - value = " ".join(path_parts).strip('"') - - passing_kwargs[key] = value - - if missing_kwargs: - self.log.debug("Missing arguments {}".format( - ", ".join( - [f'"{key}"' for key in missing_kwargs] - ) - )) - - self.log.info("Storing kwargs ...") - self.log.debug("_ passing_kwargs: {}".format(pformat(passing_kwargs))) - - # set kwargs to context data - context.set_data("passingKwargs", passing_kwargs) - - # get kwargs onto context data as keys with values - for k, v in passing_kwargs.items(): - self.log.info(f"Setting `{k}` to instance.data with value: `{v}`") - if k in ["frameStart", "frameEnd"]: - context.data[k] = passing_kwargs[k] = int(v) - else: - context.data[k] = v diff --git a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_instances.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_instances.py deleted file mode 100644 index 7c22201e3e..0000000000 --- a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_instances.py +++ /dev/null @@ -1,96 +0,0 @@ -import os -import pyblish.api - - -class CollectCelactionInstances(pyblish.api.ContextPlugin): - """ Adds the celaction render instances """ - - label = "Collect Celaction Instances" - order = pyblish.api.CollectorOrder + 0.1 - - def process(self, context): - task = context.data["task"] - current_file = context.data["currentFile"] - staging_dir = os.path.dirname(current_file) - scene_file = os.path.basename(current_file) - version = context.data["version"] - - folder_entity = context.data["folderEntity"] - - folder_attributes = folder_entity["attrib"] - - shared_instance_data = { - "folderPath": folder_entity["path"], - "frameStart": folder_attributes["frameStart"], - "frameEnd": folder_attributes["frameEnd"], - "handleStart": folder_attributes["handleStart"], - "handleEnd": folder_attributes["handleEnd"], - "fps": folder_attributes["fps"], - "resolutionWidth": folder_attributes["resolutionWidth"], - "resolutionHeight": folder_attributes["resolutionHeight"], - "pixelAspect": 1, - "step": 1, - "version": version - } - - celaction_kwargs = context.data.get( - "passingKwargs", {}) - - if celaction_kwargs: - shared_instance_data.update(celaction_kwargs) - - # workfile instance - product_type = "workfile" - product_name = product_type + task.capitalize() - # Create instance - instance = context.create_instance(product_name) - - # creating instance data - instance.data.update({ - "label": scene_file, - "productName": product_name, - "productType": product_type, - "family": product_type, - "families": [product_type], - "representations": [] - }) - - # adding basic script data - instance.data.update(shared_instance_data) - - # creating representation - representation = { - 'name': 'scn', - 'ext': 'scn', - 'files': scene_file, - "stagingDir": staging_dir, - } - - instance.data["representations"].append(representation) - - self.log.info('Publishing Celaction workfile') - - # render instance - product_name = f"render{task}Main" - product_type = "render.farm" - instance = context.create_instance(name=product_name) - # getting instance state - instance.data["publish"] = True - - # add folderEntity data into instance - instance.data.update({ - "label": "{} - farm".format(product_name), - "productType": product_type, - "family": product_type, - "families": [product_type], - "productName": product_name - }) - - # adding basic script data - instance.data.update(shared_instance_data) - - self.log.info('Publishing Celaction render instance') - self.log.debug(f"Instance data: `{instance.data}`") - - for i in context: - self.log.debug(f"{i.data['families']}") diff --git a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py deleted file mode 100644 index 3bcd1c69b3..0000000000 --- a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py +++ /dev/null @@ -1,65 +0,0 @@ -import os -import copy -import pyblish.api - - -class CollectRenderPath(pyblish.api.InstancePlugin): - """Generate file and directory path where rendered images will be""" - - label = "Collect Render Path" - order = pyblish.api.CollectorOrder + 0.495 - families = ["render.farm"] - - settings_category = "celaction" - - # Presets - output_extension = "png" - anatomy_template_key_render_files = None - anatomy_template_key_metadata = None - - def process(self, instance): - anatomy = instance.context.data["anatomy"] - anatomy_data = copy.deepcopy(instance.data["anatomyData"]) - padding = anatomy.templates_obj.frame_padding - product_type = "render" - anatomy_data.update({ - "frame": f"%0{padding}d", - "family": product_type, - "representation": self.output_extension, - "ext": self.output_extension - }) - anatomy_data["product"]["type"] = product_type - - # get anatomy rendering keys - r_anatomy_key = self.anatomy_template_key_render_files - m_anatomy_key = self.anatomy_template_key_metadata - - # get folder and path for rendering images from celaction - r_template_item = anatomy.get_template_item("publish", r_anatomy_key) - render_dir = r_template_item["directory"].format_strict(anatomy_data) - render_path = r_template_item["path"].format_strict(anatomy_data) - self.log.debug("__ render_path: `{}`".format(render_path)) - - # create dir if it doesn't exists - try: - if not os.path.isdir(render_dir): - os.makedirs(render_dir, exist_ok=True) - except OSError: - # directory is not available - self.log.warning("Path is unreachable: `{}`".format(render_dir)) - - # add rendering path to instance data - instance.data["path"] = render_path - - # get anatomy for published renders folder path - m_template_item = anatomy.get_template_item( - "publish", m_anatomy_key, default=None - ) - if m_template_item is not None: - metadata_path = m_template_item["directory"].format_strict( - anatomy_data - ) - instance.data["publishRenderMetadataFolder"] = metadata_path - self.log.info("Metadata render path: `{}`".format(metadata_path)) - - self.log.info(f"Render output path set to: `{render_path}`") diff --git a/server_addon/celaction/client/ayon_celaction/plugins/publish/integrate_version_up.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/integrate_version_up.py deleted file mode 100644 index c165b0c871..0000000000 --- a/server_addon/celaction/client/ayon_celaction/plugins/publish/integrate_version_up.py +++ /dev/null @@ -1,22 +0,0 @@ -import shutil - -import pyblish.api - -from ayon_core.lib import version_up - - -class VersionUpScene(pyblish.api.ContextPlugin): - order = pyblish.api.IntegratorOrder + 0.5 - label = 'Version Up Scene' - families = ['workfile'] - optional = True - active = True - - def process(self, context): - current_file = context.data.get('currentFile') - v_up = version_up(current_file) - self.log.debug('Current file is: {}'.format(current_file)) - self.log.debug('Version up: {}'.format(v_up)) - - shutil.copy2(current_file, v_up) - self.log.info('Scene saved into new version: {}'.format(v_up)) diff --git a/server_addon/celaction/client/ayon_celaction/resources/celaction_template_scene.scn b/server_addon/celaction/client/ayon_celaction/resources/celaction_template_scene.scn deleted file mode 100644 index 54e4497a31deb3dcbdac278364f13289386c2b62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5151 zcmeHLUuauZ7(b~sYqQFrjvAcRJ z+7Q@-h=_uF5fo&0F#N|55kX{uihCN2^+ni&e^Yx%ZxX7ZMNO8I7rt7-MWJxDCubjNw-!&CID8D?68eD9D3pE6qo;Ig@j3 zuJF=)_SqSW@6{gUH4qP5Q?<~h$}VGEI_ON5hGbp6HhL_*I zm^^ggk%5DnrqVihfi-_>%6u_Z$QI08HgBe;t@(83xs+wj7IJCJJetawxwI(!fuor` z~7e5z;b?W9d1?t zSE_X1uiU0F$-j}#fA#qDLA5z*`Y0pWUa*{5I@)I3L-b2XGSDgH$Uq}9K*zEOQ`>k!0 zZ69Cy!0v^94cL3C3C?#7Iti+_TWCw?=BE%p-LYivgXHKeQT{DUwgE{w3GbdWt%K%C z{&ycZZvA+@*QWVeTdZ=$1EGZF+_y>J~$3ps$FVOD@Lk$o4)OgGvG^f)q z1^F9hY7_$;EP76OIOEhf%-(u?+b=T;11=dIA9n= zga(XoY{+M%DGsfko;7Px0c`@w1N}l!8~_B0%~`->@O}{tK@%0rOsEmM(nQI7u*~(& z`nHoxg-2FMxUSv1A|!1Zr=xVZhqfMUU(F{V)n@eT{cf|R-*OdLU0oG>h4xGBlKXa1 z`Rq2vu0B;%_-jSw((Sk%JY7@<;V0Zirc1Mg8^jM{)0Gax0?R$f7{WJEvwP9{H;c+9 zVAWBZ8|F0pYEgLuW1W7os7xZ}P3Xq=&FAJt{D!?F`+ z!v#ojPlhC)y!S#CgohsM2(QsCm}of29Nm4Kce?8BI^p#-Zwaz{e9c>aV$C}MCPWul zj)y0!c-BLnp}B=74OI_DS)agMkz-PrILi`7Q^!LQHOjWb=VhO;9Y`kgQEqX}k3UKw zY&V$twpAsBAc-fV8NLj^8$&q8tg;X+UzLuvxs_|$+|%g!CtST>&V|kqk{WYKi_Rtz zEq%@!M0.3.2", -} -ayon_compatible_addons = { - "applications": ">=0.2.0", -} diff --git a/server_addon/celaction/server/__init__.py b/server_addon/celaction/server/__init__.py deleted file mode 100644 index e3769a4b7f..0000000000 --- a/server_addon/celaction/server/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Type - -from ayon_server.addons import BaseServerAddon - -from .settings import CelActionSettings, DEFAULT_VALUES - - -class CelActionAddon(BaseServerAddon): - settings_model: Type[CelActionSettings] = CelActionSettings - - async def get_default_settings(self): - settings_model_cls = self.get_settings_model() - return settings_model_cls(**DEFAULT_VALUES) diff --git a/server_addon/celaction/server/imageio.py b/server_addon/celaction/server/imageio.py deleted file mode 100644 index e0e685a244..0000000000 --- a/server_addon/celaction/server/imageio.py +++ /dev/null @@ -1,63 +0,0 @@ -from pydantic import validator -from ayon_server.settings import BaseSettingsModel, SettingsField -from ayon_server.settings.validators import ensure_unique_names - - -class ImageIOConfigModel(BaseSettingsModel): - """[DEPRECATED] Addon OCIO config settings. Please set the OCIO config - path in the Core addon profiles here - (ayon+settings://core/imageio/ocio_config_profiles). - """ - - override_global_config: bool = SettingsField( - False, - title="Override global OCIO config", - description=( - "DEPRECATED functionality. Please set the OCIO config path in the " - "Core addon profiles here (ayon+settings://core/imageio/" - "ocio_config_profiles)." - ), - ) - filepath: list[str] = SettingsField( - default_factory=list, - title="Config path", - description=( - "DEPRECATED functionality. Please set the OCIO config path in the " - "Core addon profiles here (ayon+settings://core/imageio/" - "ocio_config_profiles)." - ), - ) - - -class ImageIOFileRuleModel(BaseSettingsModel): - name: str = SettingsField("", title="Rule name") - pattern: str = SettingsField("", title="Regex pattern") - colorspace: str = SettingsField("", title="Colorspace name") - ext: str = SettingsField("", title="File extension") - - -class ImageIOFileRulesModel(BaseSettingsModel): - activate_host_rules: bool = SettingsField(False) - rules: list[ImageIOFileRuleModel] = SettingsField( - default_factory=list, - title="Rules" - ) - - @validator("rules") - def validate_unique_outputs(cls, value): - ensure_unique_names(value) - return value - - -class CelActionImageIOModel(BaseSettingsModel): - activate_host_color_management: bool = SettingsField( - True, title="Enable Color Management" - ) - ocio_config: ImageIOConfigModel = SettingsField( - default_factory=ImageIOConfigModel, - title="OCIO config" - ) - file_rules: ImageIOFileRulesModel = SettingsField( - default_factory=ImageIOFileRulesModel, - title="File Rules" - ) diff --git a/server_addon/celaction/server/settings.py b/server_addon/celaction/server/settings.py deleted file mode 100644 index afa9773477..0000000000 --- a/server_addon/celaction/server/settings.py +++ /dev/null @@ -1,91 +0,0 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField -from .imageio import CelActionImageIOModel - - -class CollectRenderPathModel(BaseSettingsModel): - output_extension: str = SettingsField( - "", - title="Output render file extension" - ) - anatomy_template_key_render_files: str = SettingsField( - "", - title="Anatomy template key: render files" - ) - anatomy_template_key_metadata: str = SettingsField( - "", - title="Anatomy template key: metadata job file" - ) - - -def _workfile_submit_overrides(): - return [ - { - "value": "render_chunk", - "label": "Pass chunk size" - }, - { - "value": "frame_range", - "label": "Pass frame range" - }, - { - "value": "resolution", - "label": "Pass resolution" - } - ] - - -class WorkfileModel(BaseSettingsModel): - submission_overrides: list[str] = SettingsField( - default_factory=list, - title="Submission workfile overrides", - enum_resolver=_workfile_submit_overrides - ) - - -class PublishPluginsModel(BaseSettingsModel): - CollectRenderPath: CollectRenderPathModel = SettingsField( - default_factory=CollectRenderPathModel, - title="Collect Render Path" - ) - - -class CelActionSettings(BaseSettingsModel): - imageio: CelActionImageIOModel = SettingsField( - default_factory=CelActionImageIOModel, - title="Color Management (ImageIO)" - ) - workfile: WorkfileModel = SettingsField( - title="Workfile" - ) - publish: PublishPluginsModel = SettingsField( - default_factory=PublishPluginsModel, - title="Publish plugins", - ) - - -DEFAULT_VALUES = { - "imageio": { - "ocio_config": { - "enabled": False, - "filepath": [] - }, - "file_rules": { - "enabled": False, - "rules": [] - } - }, - "workfile": { - "submission_overrides": [ - "render_chunk", - "frame_range", - "resolution" - ] - }, - "publish": { - "CollectRenderPath": { - "output_extension": "png", - "anatomy_template_key_render_files": "render", - "anatomy_template_key_metadata": "render" - } - } -} From f67845991f7a522fa41970dc6575fe5ff6104f1e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 26 Jun 2024 18:45:39 +0200 Subject: [PATCH 08/13] removed tvpaint addon --- .../tvpaint/client/ayon_tvpaint/__init__.py | 15 - .../tvpaint/client/ayon_tvpaint/addon.py | 40 - .../client/ayon_tvpaint/api/__init__.py | 11 - .../ayon_tvpaint/api/communication_server.py | 925 ------------- .../client/ayon_tvpaint/api/launch_script.py | 85 -- .../tvpaint/client/ayon_tvpaint/api/lib.py | 542 -------- .../client/ayon_tvpaint/api/pipeline.py | 518 ------- .../tvpaint/client/ayon_tvpaint/api/plugin.py | 205 --- .../ayon_tvpaint/hooks/pre_launch_args.py | 42 - .../tvpaint/client/ayon_tvpaint/lib.py | 684 ---------- .../plugins/create/convert_legacy.py | 150 -- .../plugins/create/create_render.py | 1208 ----------------- .../plugins/create/create_review.py | 92 -- .../plugins/create/create_workfile.py | 85 -- .../ayon_tvpaint/plugins/load/load_image.py | 87 -- .../plugins/load/load_reference_image.py | 319 ----- .../ayon_tvpaint/plugins/load/load_sound.py | 123 -- .../plugins/load/load_workfile.py | 115 -- .../publish/collect_instance_frames.py | 38 - .../publish/collect_render_instances.py | 115 -- .../plugins/publish/collect_workfile.py | 34 - .../plugins/publish/collect_workfile_data.py | 221 --- .../plugins/publish/extract_convert_to_exr.py | 103 -- .../plugins/publish/extract_sequence.py | 449 ------ .../publish/help/validate_asset_name.xml | 22 - .../help/validate_duplicated_layer_names.xml | 22 - .../help/validate_layers_visibility.xml | 20 - .../plugins/publish/help/validate_marks.xml | 21 - .../help/validate_missing_layer_names.xml | 18 - .../help/validate_render_layer_group.xml | 18 - .../help/validate_render_pass_group.xml | 14 - .../publish/help/validate_scene_settings.xml | 26 - .../publish/help/validate_start_frame.xml | 14 - .../help/validate_workfile_metadata.xml | 19 - .../help/validate_workfile_project_name.xml | 24 - .../publish/increment_workfile_version.py | 25 - .../plugins/publish/validate_asset_name.py | 79 -- .../validate_duplicated_layer_names.py | 55 - .../publish/validate_layers_visibility.py | 43 - .../plugins/publish/validate_marks.py | 118 -- .../publish/validate_missing_layer_names.py | 57 - .../publish/validate_render_layer_group.py | 78 -- .../publish/validate_render_pass_group.py | 91 -- .../publish/validate_scene_settings.py | 60 - .../plugins/publish/validate_start_frame.py | 48 - .../publish/validate_workfile_metadata.py | 65 - .../publish/validate_workfile_project_name.py | 55 - .../ayon_tvpaint/resources/template.tvpp | Bin 62370 -> 0 bytes .../ayon_tvpaint/tvpaint_plugin/__init__.py | 6 - .../tvpaint_plugin/plugin_code/CMakeLists.txt | 56 - .../tvpaint_plugin/plugin_code/README.md | 34 - .../tvpaint_plugin/plugin_code/library.cpp | 807 ----------- .../tvpaint_plugin/plugin_code/library.def | 10 - .../windows_x64/plugin/OpenPypePlugin.dll | Bin 5811200 -> 0 bytes .../windows_x86/plugin/OpenPypePlugin.dll | Bin 5571072 -> 0 bytes .../tvpaint/client/ayon_tvpaint/version.py | 3 - .../client/ayon_tvpaint/worker/__init__.py | 21 - .../client/ayon_tvpaint/worker/init_file.tvpp | Bin 59973 -> 0 bytes .../client/ayon_tvpaint/worker/worker.py | 156 --- .../client/ayon_tvpaint/worker/worker_job.py | 537 -------- server_addon/tvpaint/package.py | 11 - server_addon/tvpaint/pyproject.toml | 6 - server_addon/tvpaint/server/__init__.py | 13 - .../tvpaint/server/settings/__init__.py | 10 - .../tvpaint/server/settings/create_plugins.py | 136 -- .../tvpaint/server/settings/filters.py | 17 - .../tvpaint/server/settings/imageio.py | 63 - server_addon/tvpaint/server/settings/main.py | 64 - .../server/settings/publish_plugins.py | 133 -- .../server/settings/workfile_builder.py | 29 - 70 files changed, 9310 deletions(-) delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/__init__.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/addon.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/api/__init__.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/api/communication_server.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/api/launch_script.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/api/lib.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/lib.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/create/convert_legacy.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_render.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_review.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_workfile.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_workfile.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_instance_frames.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_render_instances.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_convert_to_exr.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_asset_name.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_duplicated_layer_names.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_layers_visibility.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_marks.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_missing_layer_names.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_layer_group.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_pass_group.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_scene_settings.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_start_frame.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_metadata.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_project_name.xml delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/increment_workfile_version.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_duplicated_layer_names.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_layers_visibility.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_missing_layer_names.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_layer_group.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_pass_group.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_scene_settings.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_metadata.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_project_name.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/resources/template.tvpp delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/__init__.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/CMakeLists.txt delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/README.md delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.cpp delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.def delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/version.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/worker/__init__.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/worker/init_file.tvpp delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/worker/worker.py delete mode 100644 server_addon/tvpaint/client/ayon_tvpaint/worker/worker_job.py delete mode 100644 server_addon/tvpaint/package.py delete mode 100644 server_addon/tvpaint/pyproject.toml delete mode 100644 server_addon/tvpaint/server/__init__.py delete mode 100644 server_addon/tvpaint/server/settings/__init__.py delete mode 100644 server_addon/tvpaint/server/settings/create_plugins.py delete mode 100644 server_addon/tvpaint/server/settings/filters.py delete mode 100644 server_addon/tvpaint/server/settings/imageio.py delete mode 100644 server_addon/tvpaint/server/settings/main.py delete mode 100644 server_addon/tvpaint/server/settings/publish_plugins.py delete mode 100644 server_addon/tvpaint/server/settings/workfile_builder.py diff --git a/server_addon/tvpaint/client/ayon_tvpaint/__init__.py b/server_addon/tvpaint/client/ayon_tvpaint/__init__.py deleted file mode 100644 index 2c4a052234..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from .version import __version__ -from .addon import ( - get_launch_script_path, - TVPaintAddon, - TVPAINT_ROOT_DIR, -) - - -__all__ = ( - "__version__", - - "get_launch_script_path", - "TVPaintAddon", - "TVPAINT_ROOT_DIR", -) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/addon.py b/server_addon/tvpaint/client/ayon_tvpaint/addon.py deleted file mode 100644 index c98c929a96..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/addon.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -from ayon_core.addon import AYONAddon, IHostAddon - -from .version import __version__ - -TVPAINT_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) - - -def get_launch_script_path(): - return os.path.join( - TVPAINT_ROOT_DIR, - "api", - "launch_script.py" - ) - - -class TVPaintAddon(AYONAddon, IHostAddon): - name = "tvpaint" - version = __version__ - host_name = "tvpaint" - - def add_implementation_envs(self, env, _app): - """Modify environments to contain all required for implementation.""" - - defaults = { - "AYON_LOG_NO_COLORS": "1" - } - for key, value in defaults.items(): - if not env.get(key): - env[key] = value - - def get_launch_hook_paths(self, app): - if app.host_name != self.host_name: - return [] - return [ - os.path.join(TVPAINT_ROOT_DIR, "hooks") - ] - - def get_workfile_extensions(self): - return [".tvpp"] diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/__init__.py b/server_addon/tvpaint/client/ayon_tvpaint/api/__init__.py deleted file mode 100644 index 7b53aad9a4..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from .communication_server import CommunicationWrapper -from .pipeline import ( - TVPaintHost, -) - - -__all__ = ( - "CommunicationWrapper", - - "TVPaintHost", -) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/communication_server.py b/server_addon/tvpaint/client/ayon_tvpaint/api/communication_server.py deleted file mode 100644 index 7ccb49f07e..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/communication_server.py +++ /dev/null @@ -1,925 +0,0 @@ -import os -import json -import time -import subprocess -import collections -import asyncio -import logging -import socket -import platform -import filecmp -import tempfile -import threading -import shutil - -from contextlib import closing - -from aiohttp import web -from aiohttp_json_rpc import JsonRpc -from aiohttp_json_rpc.protocol import ( - encode_request, encode_error, decode_msg, JsonRpcMsgTyp -) -from aiohttp_json_rpc.exceptions import RpcError - -from ayon_core.lib import emit_event -from ayon_tvpaint.tvpaint_plugin import get_plugin_files_path - -log = logging.getLogger(__name__) -log.setLevel(logging.DEBUG) - - -class CommunicationWrapper: - # TODO add logs and exceptions - communicator = None - - log = logging.getLogger("CommunicationWrapper") - - @classmethod - def create_qt_communicator(cls, *args, **kwargs): - """Create communicator for Artist usage.""" - communicator = QtCommunicator(*args, **kwargs) - cls.set_communicator(communicator) - return communicator - - @classmethod - def set_communicator(cls, communicator): - if not cls.communicator: - cls.communicator = communicator - else: - cls.log.warning("Communicator was set multiple times.") - - @classmethod - def client(cls): - if not cls.communicator: - return None - return cls.communicator.client() - - @classmethod - def execute_george(cls, george_script): - """Execute passed goerge script in TVPaint.""" - if not cls.communicator: - return - return cls.communicator.execute_george(george_script) - - -class WebSocketServer: - def __init__(self): - self.client = None - - self.loop = asyncio.new_event_loop() - self.app = web.Application(loop=self.loop) - self.port = self.find_free_port() - self.websocket_thread = WebsocketServerThread( - self, self.port, loop=self.loop - ) - - @property - def server_is_running(self): - return self.websocket_thread.server_is_running - - def add_route(self, *args, **kwargs): - self.app.router.add_route(*args, **kwargs) - - @staticmethod - def find_free_port(): - with closing( - socket.socket(socket.AF_INET, socket.SOCK_STREAM) - ) as sock: - sock.bind(("", 0)) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - port = sock.getsockname()[1] - return port - - def start(self): - self.websocket_thread.start() - - def stop(self): - try: - if self.websocket_thread.is_running: - log.debug("Stopping websocket server") - self.websocket_thread.is_running = False - self.websocket_thread.stop() - except Exception: - log.warning( - "Error has happened during Killing websocket server", - exc_info=True - ) - - -class WebsocketServerThread(threading.Thread): - """ Listener for websocket rpc requests. - - It would be probably better to "attach" this to main thread (as for - example Harmony needs to run something on main thread), but currently - it creates separate thread and separate asyncio event loop - """ - def __init__(self, module, port, loop): - super(WebsocketServerThread, self).__init__() - self.is_running = False - self.server_is_running = False - self.port = port - self.module = module - self.loop = loop - self.runner = None - self.site = None - self.tasks = [] - - def run(self): - self.is_running = True - - try: - log.debug("Starting websocket server") - - self.loop.run_until_complete(self.start_server()) - - log.info( - "Running Websocket server on URL:" - " \"ws://localhost:{}\"".format(self.port) - ) - - asyncio.ensure_future(self.check_shutdown(), loop=self.loop) - - self.server_is_running = True - self.loop.run_forever() - - except Exception: - log.warning( - "Websocket Server service has failed", exc_info=True - ) - finally: - self.server_is_running = False - # optional - self.loop.close() - - self.is_running = False - log.info("Websocket server stopped") - - async def start_server(self): - """ Starts runner and TCPsite """ - self.runner = web.AppRunner(self.module.app) - await self.runner.setup() - self.site = web.TCPSite(self.runner, "localhost", self.port) - await self.site.start() - - def stop(self): - """Sets is_running flag to false, 'check_shutdown' shuts server down""" - self.is_running = False - - async def check_shutdown(self): - """ Future that is running and checks if server should be running - periodically. - """ - while self.is_running: - while self.tasks: - task = self.tasks.pop(0) - log.debug("waiting for task {}".format(task)) - await task - log.debug("returned value {}".format(task.result)) - - await asyncio.sleep(0.5) - - log.debug("## Server shutdown started") - - await self.site.stop() - log.debug("# Site stopped") - await self.runner.cleanup() - log.debug("# Server runner stopped") - tasks = [ - task for task in asyncio.all_tasks() - if task is not asyncio.current_task() - ] - list(map(lambda task: task.cancel(), tasks)) # cancel all the tasks - results = await asyncio.gather(*tasks, return_exceptions=True) - log.debug(f"Finished awaiting cancelled tasks, results: {results}...") - await self.loop.shutdown_asyncgens() - # to really make sure everything else has time to stop - await asyncio.sleep(0.07) - self.loop.stop() - - -class BaseTVPaintRpc(JsonRpc): - def __init__(self, communication_obj, route_name="", **kwargs): - super().__init__(**kwargs) - self.requests_ids = collections.defaultdict(lambda: 0) - self.waiting_requests = collections.defaultdict(list) - self.responses = collections.defaultdict(list) - - self.route_name = route_name - self.communication_obj = communication_obj - - async def _handle_rpc_msg(self, http_request, raw_msg): - # This is duplicated code from super but there is no way how to do it - # to be able handle server->client requests - host = http_request.host - if host in self.waiting_requests: - try: - _raw_message = raw_msg.data - msg = decode_msg(_raw_message) - - except RpcError as error: - await self._ws_send_str(http_request, encode_error(error)) - return - - if msg.type in (JsonRpcMsgTyp.RESULT, JsonRpcMsgTyp.ERROR): - msg_data = json.loads(_raw_message) - if msg_data.get("id") in self.waiting_requests[host]: - self.responses[host].append(msg_data) - return - - return await super()._handle_rpc_msg(http_request, raw_msg) - - def client_connected(self): - # TODO This is poor check. Add check it is client from TVPaint - if self.clients: - return True - return False - - def send_notification(self, client, method, params=None): - if params is None: - params = [] - asyncio.run_coroutine_threadsafe( - client.ws.send_str(encode_request(method, params=params)), - loop=self.loop - ) - - def send_request(self, client, method, params=None, timeout=0): - if params is None: - params = [] - - client_host = client.host - - request_id = self.requests_ids[client_host] - self.requests_ids[client_host] += 1 - - self.waiting_requests[client_host].append(request_id) - - log.debug("Sending request to client {} ({}, {}) id: {}".format( - client_host, method, params, request_id - )) - future = asyncio.run_coroutine_threadsafe( - client.ws.send_str(encode_request(method, request_id, params)), - loop=self.loop - ) - result = future.result() - - not_found = object() - response = not_found - start = time.time() - while True: - if client.ws.closed: - return None - - for _response in self.responses[client_host]: - _id = _response.get("id") - if _id == request_id: - response = _response - break - - if response is not not_found: - break - - if timeout > 0 and (time.time() - start) > timeout: - raise Exception("Timeout passed") - return - - time.sleep(0.1) - - if response is not_found: - raise Exception("Connection closed") - - self.responses[client_host].remove(response) - - error = response.get("error") - result = response.get("result") - if error: - raise Exception("Error happened: {}".format(error)) - return result - - -class QtTVPaintRpc(BaseTVPaintRpc): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - from ayon_core.tools.utils import host_tools - self.tools_helper = host_tools.HostToolsHelper() - - route_name = self.route_name - - # Register methods - self.add_methods( - (route_name, self.workfiles_tool), - (route_name, self.loader_tool), - (route_name, self.publish_tool), - (route_name, self.scene_inventory_tool), - (route_name, self.library_loader_tool), - (route_name, self.experimental_tools) - ) - - # Panel routes for tools - async def workfiles_tool(self): - log.info("Triggering Workfile tool") - item = MainThreadItem(self.tools_helper.show_workfiles) - self._execute_in_main_thread(item, wait=False) - return - - async def loader_tool(self): - log.info("Triggering Loader tool") - item = MainThreadItem(self.tools_helper.show_loader) - self._execute_in_main_thread(item, wait=False) - return - - async def publish_tool(self): - log.info("Triggering Publish tool") - item = MainThreadItem(self.tools_helper.show_publisher_tool) - self._execute_in_main_thread(item, wait=False) - return - - async def scene_inventory_tool(self): - """Open Scene Inventory tool. - - Function can't confirm if tool was opened becauise one part of - SceneInventory initialization is calling websocket request to host but - host can't response because is waiting for response from this call. - """ - log.info("Triggering Scene inventory tool") - item = MainThreadItem(self.tools_helper.show_scene_inventory) - # Do not wait for result of callback - self._execute_in_main_thread(item, wait=False) - return - - async def library_loader_tool(self): - log.info("Triggering Library loader tool") - item = MainThreadItem(self.tools_helper.show_library_loader) - self._execute_in_main_thread(item, wait=False) - return - - async def experimental_tools(self): - log.info("Triggering Library loader tool") - item = MainThreadItem(self.tools_helper.show_experimental_tools_dialog) - self._execute_in_main_thread(item, wait=False) - return - - async def _async_execute_in_main_thread(self, item, **kwargs): - await self.communication_obj.async_execute_in_main_thread( - item, **kwargs - ) - - def _execute_in_main_thread(self, item, **kwargs): - return self.communication_obj.execute_in_main_thread(item, **kwargs) - - -class MainThreadItem: - """Structure to store information about callback in main thread. - - Item should be used to execute callback in main thread which may be needed - for execution of Qt objects. - - Item store callback (callable variable), arguments and keyword arguments - for the callback. Item hold information about it's process. - """ - not_set = object() - sleep_time = 0.1 - - def __init__(self, callback, *args, **kwargs): - self.done = False - self.exception = self.not_set - self.result = self.not_set - self.callback = callback - self.args = args - self.kwargs = kwargs - - def execute(self): - """Execute callback and store its result. - - Method must be called from main thread. Item is marked as `done` - when callback execution finished. Store output of callback of exception - information when callback raises one. - """ - log.debug("Executing process in main thread") - if self.done: - log.warning("- item is already processed") - return - - callback = self.callback - args = self.args - kwargs = self.kwargs - log.info("Running callback: {}".format(str(callback))) - try: - result = callback(*args, **kwargs) - self.result = result - - except Exception as exc: - self.exception = exc - - finally: - self.done = True - - def wait(self): - """Wait for result from main thread. - - This method stops current thread until callback is executed. - - Returns: - object: Output of callback. May be any type or object. - - Raises: - Exception: Reraise any exception that happened during callback - execution. - """ - while not self.done: - time.sleep(self.sleep_time) - - if self.exception is self.not_set: - return self.result - raise self.exception - - async def async_wait(self): - """Wait for result from main thread. - - Returns: - object: Output of callback. May be any type or object. - - Raises: - Exception: Reraise any exception that happened during callback - execution. - """ - while not self.done: - await asyncio.sleep(self.sleep_time) - - if self.exception is self.not_set: - return self.result - raise self.exception - - -class BaseCommunicator: - def __init__(self): - self.process = None - self.websocket_server = None - self.websocket_rpc = None - self.exit_code = None - self._connected_client = None - - @property - def server_is_running(self): - if self.websocket_server is None: - return False - return self.websocket_server.server_is_running - - def _windows_file_process(self, src_dst_mapping, to_remove): - """Windows specific file processing asking for admin permissions. - - It is required to have administration permissions to modify plugin - files in TVPaint installation folder. - - Method requires `pywin32` python module. - - Args: - src_dst_mapping (list, tuple, set): Mapping of source file to - destination. Both must be full path. Each item must be iterable - of size 2 `(C:/src/file.dll, C:/dst/file.dll)`. - to_remove (list): Fullpath to files that should be removed. - """ - - import pythoncom - from win32comext.shell import shell - - # Create temp folder where plugin files are temporary copied - # - reason is that copy to TVPaint requires administartion permissions - # but admin may not have access to source folder - tmp_dir = os.path.normpath( - tempfile.mkdtemp(prefix="tvpaint_copy_") - ) - - # Copy source to temp folder and create new mapping - dst_folders = collections.defaultdict(list) - new_src_dst_mapping = [] - for old_src, dst in src_dst_mapping: - new_src = os.path.join(tmp_dir, os.path.split(old_src)[1]) - shutil.copy(old_src, new_src) - new_src_dst_mapping.append((new_src, dst)) - - for src, dst in new_src_dst_mapping: - src = os.path.normpath(src) - dst = os.path.normpath(dst) - dst_filename = os.path.basename(dst) - dst_folder_path = os.path.dirname(dst) - dst_folders[dst_folder_path].append((dst_filename, src)) - - # create an instance of IFileOperation - fo = pythoncom.CoCreateInstance( - shell.CLSID_FileOperation, - None, - pythoncom.CLSCTX_ALL, - shell.IID_IFileOperation - ) - # Add delete command to file operation object - for filepath in to_remove: - item = shell.SHCreateItemFromParsingName( - filepath, None, shell.IID_IShellItem - ) - fo.DeleteItem(item) - - # here you can use SetOperationFlags, progress Sinks, etc. - for folder_path, items in dst_folders.items(): - # create an instance of IShellItem for the target folder - folder_item = shell.SHCreateItemFromParsingName( - folder_path, None, shell.IID_IShellItem - ) - for _dst_filename, source_file_path in items: - # create an instance of IShellItem for the source item - copy_item = shell.SHCreateItemFromParsingName( - source_file_path, None, shell.IID_IShellItem - ) - # queue the copy operation - fo.CopyItem(copy_item, folder_item, _dst_filename, None) - - # commit - fo.PerformOperations() - - # Remove temp folder - shutil.rmtree(tmp_dir) - - def _prepare_windows_plugin(self, launch_args): - """Copy plugin to TVPaint plugins and set PATH to dependencies. - - Check if plugin in TVPaint's plugins exist and match to plugin - version to current implementation version. Based on 64-bit or 32-bit - version of the plugin. Path to libraries required for plugin is added - to PATH variable. - """ - - host_executable = launch_args[0] - executable_file = os.path.basename(host_executable) - if "64bit" in executable_file: - subfolder = "windows_x64" - elif "32bit" in executable_file: - subfolder = "windows_x86" - else: - raise ValueError( - "Can't determine if executable " - "leads to 32-bit or 64-bit TVPaint!" - ) - - plugin_files_path = get_plugin_files_path() - # Folder for right windows plugin files - source_plugins_dir = os.path.join(plugin_files_path, subfolder) - - # Path to libraries (.dll) required for plugin library - # - additional libraries can be copied to TVPaint installation folder - # (next to executable) or added to PATH environment variable - additional_libs_folder = os.path.join( - source_plugins_dir, - "additional_libraries" - ) - additional_libs_folder = additional_libs_folder.replace("\\", "/") - if ( - os.path.exists(additional_libs_folder) - and additional_libs_folder not in os.environ["PATH"] - ): - os.environ["PATH"] += (os.pathsep + additional_libs_folder) - - # Path to TVPaint's plugins folder (where we want to add our plugin) - host_plugins_path = os.path.join( - os.path.dirname(host_executable), - "plugins" - ) - - # Files that must be copied to TVPaint's plugin folder - plugin_dir = os.path.join(source_plugins_dir, "plugin") - - to_copy = [] - to_remove = [] - # Remove old plugin name - deprecated_filepath = os.path.join( - host_plugins_path, "AvalonPlugin.dll" - ) - if os.path.exists(deprecated_filepath): - to_remove.append(deprecated_filepath) - - for filename in os.listdir(plugin_dir): - src_full_path = os.path.join(plugin_dir, filename) - dst_full_path = os.path.join(host_plugins_path, filename) - if dst_full_path in to_remove: - to_remove.remove(dst_full_path) - - if ( - not os.path.exists(dst_full_path) - or not filecmp.cmp(src_full_path, dst_full_path) - ): - to_copy.append((src_full_path, dst_full_path)) - - # Skip copy if everything is done - if not to_copy and not to_remove: - return - - # Try to copy - try: - self._windows_file_process(to_copy, to_remove) - except Exception: - log.error("Plugin copy failed", exc_info=True) - - # Validate copy was done - invalid_copy = [] - for src, dst in to_copy: - if not os.path.exists(dst) or not filecmp.cmp(src, dst): - invalid_copy.append((src, dst)) - - # Validate delete was dones - invalid_remove = [] - for filepath in to_remove: - if os.path.exists(filepath): - invalid_remove.append(filepath) - - if not invalid_remove and not invalid_copy: - return - - msg_parts = [] - if invalid_remove: - msg_parts.append( - "Failed to remove files: {}".format(", ".join(invalid_remove)) - ) - - if invalid_copy: - _invalid = [ - "\"{}\" -> \"{}\"".format(src, dst) - for src, dst in invalid_copy - ] - msg_parts.append( - "Failed to copy files: {}".format(", ".join(_invalid)) - ) - raise RuntimeError(" & ".join(msg_parts)) - - def _launch_tv_paint(self, launch_args): - flags = ( - subprocess.DETACHED_PROCESS - | subprocess.CREATE_NEW_PROCESS_GROUP - ) - env = os.environ.copy() - # Remove QuickTime from PATH on windows - # - quicktime overrides TVPaint's ffmpeg encode/decode which may - # cause issues on loading - if platform.system().lower() == "windows": - new_path = [] - for path in env["PATH"].split(os.pathsep): - if path and "quicktime" not in path.lower(): - new_path.append(path) - env["PATH"] = os.pathsep.join(new_path) - - kwargs = { - "env": env, - "creationflags": flags - } - self.process = subprocess.Popen(launch_args, **kwargs) - - def _create_routes(self): - self.websocket_rpc = BaseTVPaintRpc( - self, loop=self.websocket_server.loop - ) - self.websocket_server.add_route( - "*", "/", self.websocket_rpc.handle_request - ) - - def _start_webserver(self): - self.websocket_server.start() - # Make sure RPC is using same loop as websocket server - while not self.websocket_server.server_is_running: - time.sleep(0.1) - - def _stop_webserver(self): - self.websocket_server.stop() - - def _exit(self, exit_code=None): - self._stop_webserver() - if exit_code is not None: - self.exit_code = exit_code - - if self.exit_code is None: - self.exit_code = 0 - - def stop(self): - """Stop communication and currently running python process.""" - log.info("Stopping communication") - self._exit() - - def launch(self, launch_args): - """Prepare all required data and launch host. - - First is prepared websocket server as communication point for host, - when server is ready to use host is launched as subprocess. - """ - if platform.system().lower() == "windows": - self._prepare_windows_plugin(launch_args) - - # Launch TVPaint and the websocket server. - log.info("Launching TVPaint") - self.websocket_server = WebSocketServer() - - self._create_routes() - - os.environ["WEBSOCKET_URL"] = "ws://localhost:{}".format( - self.websocket_server.port - ) - - log.info("Added request handler for url: {}".format( - os.environ["WEBSOCKET_URL"] - )) - - self._start_webserver() - - # Start TVPaint when server is running - self._launch_tv_paint(launch_args) - - log.info("Waiting for client connection") - while True: - if self.process.poll() is not None: - log.debug("Host process is not alive. Exiting") - self._exit(1) - return - - if self.websocket_rpc.client_connected(): - log.info("Client has connected") - break - time.sleep(0.5) - - self._on_client_connect() - - emit_event("application.launched") - - def _on_client_connect(self): - self._initial_textfile_write() - - def _initial_textfile_write(self): - """Show popup about Write to file at start of TVPaint.""" - tmp_file = tempfile.NamedTemporaryFile( - mode="w", prefix="a_tvp_", suffix=".txt", delete=False - ) - tmp_file.close() - tmp_filepath = tmp_file.name.replace("\\", "/") - george_script = ( - "tv_writetextfile \"strict\" \"append\" \"{}\" \"empty\"" - ).format(tmp_filepath) - - result = CommunicationWrapper.execute_george(george_script) - - # Remote the file - os.remove(tmp_filepath) - - if result is None: - log.warning( - "Host was probably closed before plugin was initialized." - ) - elif result.lower() == "forbidden": - log.warning("User didn't confirm saving files.") - - def _client(self): - if not self.websocket_rpc: - log.warning("Communicator's server did not start yet.") - return None - - for client in self.websocket_rpc.clients: - if not client.ws.closed: - return client - log.warning("Client is not yet connected to Communicator.") - return None - - def client(self): - if not self._connected_client or self._connected_client.ws.closed: - self._connected_client = self._client() - return self._connected_client - - def send_request(self, method, params=None): - client = self.client() - if not client: - return - - return self.websocket_rpc.send_request( - client, method, params - ) - - def send_notification(self, method, params=None): - client = self.client() - if not client: - return - - self.websocket_rpc.send_notification( - client, method, params - ) - - def execute_george(self, george_script): - """Execute passed goerge script in TVPaint.""" - return self.send_request( - "execute_george", [george_script] - ) - - def execute_george_through_file(self, george_script): - """Execute george script with temp file. - - Allows to execute multiline george script without stopping websocket - client. - - On windows make sure script does not contain paths with backwards - slashes in paths, TVPaint won't execute properly in that case. - - Args: - george_script (str): George script to execute. May be multilined. - """ - temporary_file = tempfile.NamedTemporaryFile( - mode="w", prefix="a_tvp_", suffix=".grg", delete=False - ) - temporary_file.write(george_script) - temporary_file.close() - temp_file_path = temporary_file.name.replace("\\", "/") - self.execute_george("tv_runscript {}".format(temp_file_path)) - os.remove(temp_file_path) - - -class QtCommunicator(BaseCommunicator): - label = os.getenv("AYON_MENU_LABEL") or "AYON" - title = "{} Tools".format(label) - menu_definitions = { - "title": title, - "menu_items": [ - { - "callback": "workfiles_tool", - "label": "Workfiles", - "help": "Open workfiles tool" - }, { - "callback": "loader_tool", - "label": "Load", - "help": "Open loader tool" - }, { - "callback": "scene_inventory_tool", - "label": "Scene inventory", - "help": "Open scene inventory tool" - }, { - "callback": "publish_tool", - "label": "Publish", - "help": "Open publisher" - }, { - "callback": "library_loader_tool", - "label": "Library", - "help": "Open library loader tool" - }, { - "callback": "experimental_tools", - "label": "Experimental tools", - "help": "Open experimental tools dialog" - } - ] - } - - def __init__(self, qt_app): - super().__init__() - self.callback_queue = collections.deque() - self.qt_app = qt_app - - def _create_routes(self): - self.websocket_rpc = QtTVPaintRpc( - self, loop=self.websocket_server.loop - ) - self.websocket_server.add_route( - "*", "/", self.websocket_rpc.handle_request - ) - - def execute_in_main_thread(self, main_thread_item, wait=True): - """Add `MainThreadItem` to callback queue and wait for result.""" - self.callback_queue.append(main_thread_item) - if wait: - return main_thread_item.wait() - return - - async def async_execute_in_main_thread(self, main_thread_item, wait=True): - """Add `MainThreadItem` to callback queue and wait for result.""" - self.callback_queue.append(main_thread_item) - if wait: - return await main_thread_item.async_wait() - - def main_thread_listen(self): - """Get last `MainThreadItem` from queue. - - Must be called from main thread. - - Method checks if host process is still running as it may cause - issues if not. - """ - # check if host still running - if self.process.poll() is not None: - self._exit() - return None - - if self.callback_queue: - return self.callback_queue.popleft() - return None - - def _on_client_connect(self): - super()._on_client_connect() - self._build_menu() - - def _build_menu(self): - self.send_request( - "define_menu", [self.menu_definitions] - ) - - def _exit(self, *args, **kwargs): - super()._exit(*args, **kwargs) - emit_event("application.exit") - self.qt_app.exit(self.exit_code) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/launch_script.py b/server_addon/tvpaint/client/ayon_tvpaint/api/launch_script.py deleted file mode 100644 index 1e23e95572..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/launch_script.py +++ /dev/null @@ -1,85 +0,0 @@ -import os -import sys -import signal -import traceback -import ctypes -import platform -import logging - -from qtpy import QtWidgets, QtCore, QtGui - -from ayon_core import style -from ayon_core.pipeline import install_host -from ayon_tvpaint.api import ( - TVPaintHost, - CommunicationWrapper, -) - -log = logging.getLogger(__name__) - - -def safe_excepthook(*args): - traceback.print_exception(*args) - - -def main(launch_args): - # Be sure server won't crash at any moment but just print traceback - sys.excepthook = safe_excepthook - - # Create QtApplication for tools - # - QApplicaiton is also main thread/event loop of the server - qt_app = QtWidgets.QApplication([]) - - tvpaint_host = TVPaintHost() - # Execute pipeline installation - install_host(tvpaint_host) - - # Create Communicator object and trigger launch - # - this must be done before anything is processed - communicator = CommunicationWrapper.create_qt_communicator(qt_app) - communicator.launch(launch_args) - - def process_in_main_thread(): - """Execution of `MainThreadItem`.""" - item = communicator.main_thread_listen() - if item: - item.execute() - - timer = QtCore.QTimer() - timer.setInterval(100) - timer.timeout.connect(process_in_main_thread) - timer.start() - - # Register terminal signal handler - def signal_handler(*_args): - print("You pressed Ctrl+C. Process ended.") - communicator.stop() - - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) - - qt_app.setQuitOnLastWindowClosed(False) - qt_app.setStyleSheet(style.load_stylesheet()) - - # Load avalon icon - icon_path = style.app_icon_path() - if icon_path: - icon = QtGui.QIcon(icon_path) - qt_app.setWindowIcon(icon) - - # Set application name to be able show application icon in task bar - if platform.system().lower() == "windows": - ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID( - u"WebsocketServer" - ) - - # Run Qt application event processing - sys.exit(qt_app.exec_()) - - -if __name__ == "__main__": - args = list(sys.argv) - if os.path.abspath(__file__) == os.path.normpath(args[0]): - # Pop path to script - args.pop(0) - main(args) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/lib.py b/server_addon/tvpaint/client/ayon_tvpaint/api/lib.py deleted file mode 100644 index f8b8c29cdb..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/lib.py +++ /dev/null @@ -1,542 +0,0 @@ -import os -import logging -import tempfile - -from .communication_server import CommunicationWrapper - -log = logging.getLogger(__name__) - - -def execute_george(george_script, communicator=None): - if not communicator: - communicator = CommunicationWrapper.communicator - return communicator.execute_george(george_script) - - -def execute_george_through_file(george_script, communicator=None): - """Execute george script with temp file. - - Allows to execute multiline george script without stopping websocket - client. - - On windows make sure script does not contain paths with backwards - slashes in paths, TVPaint won't execute properly in that case. - - Args: - george_script (str): George script to execute. May be multilined. - """ - if not communicator: - communicator = CommunicationWrapper.communicator - - return communicator.execute_george_through_file(george_script) - - -def parse_layers_data(data): - """Parse layers data loaded in 'get_layers_data'.""" - layers = [] - layers_raw = data.split("\n") - for layer_raw in layers_raw: - layer_raw = layer_raw.strip() - if not layer_raw: - continue - ( - layer_id, group_id, visible, position, opacity, name, - layer_type, - frame_start, frame_end, prelighttable, postlighttable, - selected, editable, sencil_state, is_current - ) = layer_raw.split("|") - layer = { - "layer_id": int(layer_id), - "group_id": int(group_id), - "visible": visible == "ON", - "position": int(position), - # Opacity from 'tv_layerinfo' is always set to '0' so it's unusable - # "opacity": int(opacity), - "name": name, - "type": layer_type, - "frame_start": int(frame_start), - "frame_end": int(frame_end), - "prelighttable": prelighttable == "1", - "postlighttable": postlighttable == "1", - "selected": selected == "1", - "editable": editable == "1", - "sencil_state": sencil_state, - "is_current": is_current == "1" - } - layers.append(layer) - return layers - - -def get_layers_data_george_script(output_filepath, layer_ids=None): - """Prepare george script which will collect all layers from workfile.""" - output_filepath = output_filepath.replace("\\", "/") - george_script_lines = [ - # Variable containing full path to output file - "output_path = \"{}\"".format(output_filepath), - # Get Current Layer ID - "tv_LayerCurrentID", - "current_layer_id = result" - ] - # Script part for getting and storing layer information to temp - layer_data_getter = ( - # Get information about layer's group - "tv_layercolor \"get\" layer_id", - "group_id = result", - "tv_LayerInfo layer_id", - ( - "PARSE result visible position opacity name" - " type startFrame endFrame prelighttable postlighttable" - " selected editable sencilState" - ), - # Check if layer ID match `tv_LayerCurrentID` - "is_current=0", - "IF CMP(current_layer_id, layer_id)==1", - # - mark layer as selected if layer id match to current layer id - "is_current=1", - "selected=1", - "END", - # Prepare line with data separated by "|" - ( - "line = layer_id'|'group_id'|'visible'|'position'|'opacity'|'" - "name'|'type'|'startFrame'|'endFrame'|'prelighttable'|'" - "postlighttable'|'selected'|'editable'|'sencilState'|'is_current" - ), - # Write data to output file - "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' line", - ) - - # Collect data for all layers if layers are not specified - if layer_ids is None: - george_script_lines.extend(( - # Layer loop variables - "loop = 1", - "idx = 0", - # Layers loop - "WHILE loop", - "tv_LayerGetID idx", - "layer_id = result", - "idx = idx + 1", - # Stop loop if layer_id is "NONE" - "IF CMP(layer_id, \"NONE\")==1", - "loop = 0", - "ELSE", - *layer_data_getter, - "END", - "END" - )) - else: - for layer_id in layer_ids: - george_script_lines.append("layer_id = {}".format(layer_id)) - george_script_lines.extend(layer_data_getter) - - return "\n".join(george_script_lines) - - -def layers_data(layer_ids=None, communicator=None): - """Backwards compatible function of 'get_layers_data'.""" - return get_layers_data(layer_ids, communicator) - - -def get_layers_data(layer_ids=None, communicator=None): - """Collect all layers information from currently opened workfile.""" - output_file = tempfile.NamedTemporaryFile( - mode="w", prefix="a_tvp_", suffix=".txt", delete=False - ) - output_file.close() - if layer_ids is not None and isinstance(layer_ids, int): - layer_ids = [layer_ids] - - output_filepath = output_file.name - - george_script = get_layers_data_george_script(output_filepath, layer_ids) - - execute_george_through_file(george_script, communicator) - - with open(output_filepath, "r") as stream: - data = stream.read() - - output = parse_layers_data(data) - os.remove(output_filepath) - return output - - -def parse_group_data(data): - """Parse group data collected in 'get_groups_data'.""" - output = [] - groups_raw = data.split("\n") - for group_raw in groups_raw: - group_raw = group_raw.strip() - if not group_raw: - continue - - parts = group_raw.split("|") - # Check for length and concatenate 2 last items until length match - # - this happens if name contain spaces - while len(parts) > 6: - last_item = parts.pop(-1) - parts[-1] = "|".join([parts[-1], last_item]) - clip_id, group_id, red, green, blue, name = parts - - group = { - "group_id": int(group_id), - "name": name, - "clip_id": int(clip_id), - "red": int(red), - "green": int(green), - "blue": int(blue), - } - output.append(group) - return output - - -def groups_data(communicator=None): - """Backwards compatible function of 'get_groups_data'.""" - return get_groups_data(communicator) - - -def get_groups_data(communicator=None): - """Information about groups from current workfile.""" - output_file = tempfile.NamedTemporaryFile( - mode="w", prefix="a_tvp_", suffix=".txt", delete=False - ) - output_file.close() - - output_filepath = output_file.name.replace("\\", "/") - george_script_lines = ( - # Variable containing full path to output file - "output_path = \"{}\"".format(output_filepath), - "empty = 0", - # Loop over 26 groups which is ATM maximum possible (in 11.7) - # - ref: https://www.tvpaint.com/forum/viewtopic.php?t=13880 - "FOR idx = 1 TO 26", - # Receive information about groups - "tv_layercolor \"getcolor\" 0 idx", - "PARSE result clip_id group_index c_red c_green c_blue group_name", - # Create and add line to output file - "line = clip_id'|'group_index'|'c_red'|'c_green'|'c_blue'|'group_name", - "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' line", - "END", - ) - george_script = "\n".join(george_script_lines) - execute_george_through_file(george_script, communicator) - - with open(output_filepath, "r") as stream: - data = stream.read() - - output = parse_group_data(data) - os.remove(output_filepath) - return output - - -def get_layers_pre_post_behavior(layer_ids, communicator=None): - """Collect data about pre and post behavior of layer ids. - - Pre and Post behaviors is enumerator of possible values: - - "none" - - "repeat" - - "pingpong" - - "hold" - - Example output: - ```json - { - 0: { - "pre": "none", - "post": "repeat" - } - } - ``` - - Returns: - dict: Key is layer id value is dictionary with "pre" and "post" keys. - """ - # Skip if is empty - if not layer_ids: - return {} - - # Auto convert to list - if not isinstance(layer_ids, (list, set, tuple)): - layer_ids = [layer_ids] - - # Prepare temp file - output_file = tempfile.NamedTemporaryFile( - mode="w", prefix="a_tvp_", suffix=".txt", delete=False - ) - output_file.close() - - output_filepath = output_file.name.replace("\\", "/") - george_script_lines = [ - # Variable containing full path to output file - "output_path = \"{}\"".format(output_filepath), - ] - for layer_id in layer_ids: - george_script_lines.extend([ - "layer_id = {}".format(layer_id), - "tv_layerprebehavior layer_id", - "pre_beh = result", - "tv_layerpostbehavior layer_id", - "post_beh = result", - "line = layer_id'|'pre_beh'|'post_beh", - "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' line" - ]) - - george_script = "\n".join(george_script_lines) - execute_george_through_file(george_script, communicator) - - # Read data - with open(output_filepath, "r") as stream: - data = stream.read() - - # Remove temp file - os.remove(output_filepath) - - # Parse data - output = {} - raw_lines = data.split("\n") - for raw_line in raw_lines: - line = raw_line.strip() - if not line: - continue - parts = line.split("|") - if len(parts) != 3: - continue - layer_id, pre_beh, post_beh = parts - output[int(layer_id)] = { - "pre": pre_beh.lower(), - "post": post_beh.lower() - } - return output - - -def get_layers_exposure_frames(layer_ids, layers_data=None, communicator=None): - """Get exposure frames. - - Easily said returns frames where keyframes are. Recognized with george - function `tv_exposureinfo` returning "Head". - - Args: - layer_ids (list): Ids of a layers for which exposure frames should - look for. - layers_data (list): Precollected layers data. If are not passed then - 'get_layers_data' is used. - communicator (BaseCommunicator): Communicator used for communication - with TVPaint. - - Returns: - dict: Frames where exposure is set to "Head" by layer id. - """ - - if layers_data is None: - layers_data = get_layers_data(layer_ids) - _layers_by_id = { - layer["layer_id"]: layer - for layer in layers_data - } - layers_by_id = { - layer_id: _layers_by_id.get(layer_id) - for layer_id in layer_ids - } - tmp_file = tempfile.NamedTemporaryFile( - mode="w", prefix="a_tvp_", suffix=".txt", delete=False - ) - tmp_file.close() - tmp_output_path = tmp_file.name.replace("\\", "/") - george_script_lines = [ - "output_path = \"{}\"".format(tmp_output_path) - ] - - output = {} - layer_id_mapping = {} - for layer_id, layer_data in layers_by_id.items(): - layer_id_mapping[str(layer_id)] = layer_id - output[layer_id] = [] - if not layer_data: - continue - first_frame = layer_data["frame_start"] - last_frame = layer_data["frame_end"] - george_script_lines.extend([ - "line = \"\"", - "layer_id = {}".format(layer_id), - "line = line''layer_id", - "tv_layerset layer_id", - "frame = {}".format(first_frame), - "WHILE (frame <= {})".format(last_frame), - "tv_exposureinfo frame", - "exposure = result", - "IF (CMP(exposure, \"Head\") == 1)", - "line = line'|'frame", - "END", - "frame = frame + 1", - "END", - "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' line" - ]) - - execute_george_through_file("\n".join(george_script_lines), communicator) - - with open(tmp_output_path, "r") as stream: - data = stream.read() - - os.remove(tmp_output_path) - - lines = [] - for line in data.split("\n"): - line = line.strip() - if line: - lines.append(line) - - for line in lines: - line_items = list(line.split("|")) - layer_id = line_items.pop(0) - _layer_id = layer_id_mapping[layer_id] - output[_layer_id] = [int(frame) for frame in line_items] - - return output - - -def get_exposure_frames( - layer_id, first_frame=None, last_frame=None, communicator=None -): - """Get exposure frames. - - Easily said returns frames where keyframes are. Recognized with george - function `tv_exposureinfo` returning "Head". - - Args: - layer_id (int): Id of a layer for which exposure frames should - look for. - first_frame (int): From which frame will look for exposure frames. - Used layers first frame if not entered. - last_frame (int): Last frame where will look for exposure frames. - Used layers last frame if not entered. - - Returns: - list: Frames where exposure is set to "Head". - """ - if first_frame is None or last_frame is None: - layer = layers_data(layer_id)[0] - if first_frame is None: - first_frame = layer["frame_start"] - if last_frame is None: - last_frame = layer["frame_end"] - - tmp_file = tempfile.NamedTemporaryFile( - mode="w", prefix="a_tvp_", suffix=".txt", delete=False - ) - tmp_file.close() - tmp_output_path = tmp_file.name.replace("\\", "/") - george_script_lines = [ - "tv_layerset {}".format(layer_id), - "output_path = \"{}\"".format(tmp_output_path), - "output = \"\"", - "frame = {}".format(first_frame), - "WHILE (frame <= {})".format(last_frame), - "tv_exposureinfo frame", - "exposure = result", - "IF (CMP(exposure, \"Head\") == 1)", - "IF (CMP(output, \"\") == 1)", - "output = output''frame", - "ELSE", - "output = output'|'frame", - "END", - "END", - "frame = frame + 1", - "END", - "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' output" - ] - - execute_george_through_file("\n".join(george_script_lines), communicator) - - with open(tmp_output_path, "r") as stream: - data = stream.read() - - os.remove(tmp_output_path) - - lines = [] - for line in data.split("\n"): - line = line.strip() - if line: - lines.append(line) - - exposure_frames = [] - for line in lines: - for frame in line.split("|"): - exposure_frames.append(int(frame)) - return exposure_frames - - -def get_scene_data(communicator=None): - """Scene data of currently opened scene. - - Result contains resolution, pixel aspect, fps mark in/out with states, - frame start and background color. - - Returns: - dict: Scene data collected in many ways. - """ - workfile_info = execute_george("tv_projectinfo", communicator) - workfile_info_parts = workfile_info.split(" ") - - # Project frame start - not used - workfile_info_parts.pop(-1) - field_order = workfile_info_parts.pop(-1) - frame_rate = float(workfile_info_parts.pop(-1)) - pixel_apsect = float(workfile_info_parts.pop(-1)) - height = int(workfile_info_parts.pop(-1)) - width = int(workfile_info_parts.pop(-1)) - - # Marks return as "{frame - 1} {state} ", example "0 set". - result = execute_george("tv_markin", communicator) - mark_in_frame, mark_in_state, _ = result.split(" ") - - result = execute_george("tv_markout", communicator) - mark_out_frame, mark_out_state, _ = result.split(" ") - - start_frame = execute_george("tv_startframe", communicator) - return { - "width": width, - "height": height, - "pixel_aspect": pixel_apsect, - "fps": frame_rate, - "field_order": field_order, - "mark_in": int(mark_in_frame), - "mark_in_state": mark_in_state, - "mark_in_set": mark_in_state == "set", - "mark_out": int(mark_out_frame), - "mark_out_state": mark_out_state, - "mark_out_set": mark_out_state == "set", - "start_frame": int(start_frame), - "bg_color": get_scene_bg_color(communicator) - } - - -def get_scene_bg_color(communicator=None): - """Background color set on scene. - - Is important for review exporting where scene bg color is used as - background. - """ - output_file = tempfile.NamedTemporaryFile( - mode="w", prefix="a_tvp_", suffix=".txt", delete=False - ) - output_file.close() - output_filepath = output_file.name.replace("\\", "/") - george_script_lines = [ - # Variable containing full path to output file - "output_path = \"{}\"".format(output_filepath), - "tv_background", - "bg_color = result", - # Write data to output file - "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' bg_color" - ] - - george_script = "\n".join(george_script_lines) - execute_george_through_file(george_script, communicator) - - with open(output_filepath, "r") as stream: - data = stream.read() - - os.remove(output_filepath) - data = data.strip() - if not data: - return None - return data.split(" ") diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py b/server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py deleted file mode 100644 index 5ec6355138..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py +++ /dev/null @@ -1,518 +0,0 @@ -import os -import json -import tempfile -import logging - -import requests -import ayon_api -import pyblish.api - -from ayon_tvpaint import TVPAINT_ROOT_DIR - -from ayon_core.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost -from ayon_core.settings import get_current_project_settings -from ayon_core.lib import register_event_callback -from ayon_core.pipeline import ( - register_loader_plugin_path, - register_creator_plugin_path, - AVALON_CONTAINER_ID, -) -from ayon_core.pipeline.context_tools import get_global_context - -from .lib import ( - execute_george, - execute_george_through_file -) - -log = logging.getLogger(__name__) - - -METADATA_SECTION = "avalon" -SECTION_NAME_CONTEXT = "context" -SECTION_NAME_CREATE_CONTEXT = "create_context" -SECTION_NAME_INSTANCES = "instances" -SECTION_NAME_CONTAINERS = "containers" -# Maximum length of metadata chunk string -# TODO find out the max (500 is safe enough) -TVPAINT_CHUNK_LENGTH = 500 - -"""TVPaint's Metadata - -Metadata are stored to TVPaint's workfile. - -Workfile works similar to .ini file but has few limitation. Most important -limitation is that value under key has limited length. Due to this limitation -each metadata section/key stores number of "subkeys" that are related to -the section. - -Example: -Metadata key `"instances"` may have stored value "2". In that case it is -expected that there are also keys `["instances0", "instances1"]`. - -Workfile data looks like: -``` -[avalon] -instances0=[{{__dq__}id{__dq__}: {__dq__}ayon.create.instance{__dq__... -instances1=...more data... -instances=2 -``` -""" - - -class TVPaintHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost): - name = "tvpaint" - - def install(self): - """Install TVPaint-specific functionality.""" - - log.info("AYON - Installing TVPaint integration") - - # Create workdir folder if does not exist yet - workdir = os.getenv("AYON_WORKDIR") - if not os.path.exists(workdir): - os.makedirs(workdir) - - plugins_dir = os.path.join(TVPAINT_ROOT_DIR, "plugins") - publish_dir = os.path.join(plugins_dir, "publish") - load_dir = os.path.join(plugins_dir, "load") - create_dir = os.path.join(plugins_dir, "create") - - pyblish.api.register_host("tvpaint") - pyblish.api.register_plugin_path(publish_dir) - register_loader_plugin_path(load_dir) - register_creator_plugin_path(create_dir) - - register_event_callback("application.launched", self.initial_launch) - register_event_callback("application.exit", self.application_exit) - - def get_current_project_name(self): - """ - Returns: - Union[str, None]: Current project name. - """ - - return self.get_current_context().get("project_name") - - def get_current_folder_path(self): - """ - Returns: - Union[str, None]: Current folder path. - """ - - return self.get_current_context().get("folder_path") - - def get_current_task_name(self): - """ - Returns: - Union[str, None]: Current task name. - """ - - return self.get_current_context().get("task_name") - - def get_current_context(self): - context = get_current_workfile_context() - if not context: - return get_global_context() - - if "project_name" in context: - if "asset_name" in context: - context["folder_path"] = context["asset_name"] - return context - # This is legacy way how context was stored - return { - "project_name": context.get("project"), - "folder_path": context.get("asset"), - "task_name": context.get("task") - } - - # --- Create --- - def get_context_data(self): - return get_workfile_metadata(SECTION_NAME_CREATE_CONTEXT, {}) - - def update_context_data(self, data, changes): - return write_workfile_metadata(SECTION_NAME_CREATE_CONTEXT, data) - - def list_instances(self): - """List all created instances from current workfile.""" - return list_instances() - - def write_instances(self, data): - return write_instances(data) - - # --- Workfile --- - def open_workfile(self, filepath): - george_script = "tv_LoadProject '\"'\"{}\"'\"'".format( - filepath.replace("\\", "/") - ) - return execute_george_through_file(george_script) - - def save_workfile(self, filepath=None): - if not filepath: - filepath = self.get_current_workfile() - context = get_global_context() - save_current_workfile_context(context) - - # Execute george script to save workfile. - george_script = "tv_SaveProject {}".format(filepath.replace("\\", "/")) - return execute_george(george_script) - - def work_root(self, session): - return session["AYON_WORKDIR"] - - def get_current_workfile(self): - return execute_george("tv_GetProjectName") - - def workfile_has_unsaved_changes(self): - return None - - def get_workfile_extensions(self): - return [".tvpp"] - - # --- Load --- - def get_containers(self): - return get_containers() - - def initial_launch(self): - # Setup project settings if its the template that's launched. - # TODO also check for template creation when it's possible to define - # templates - last_workfile = os.environ.get("AYON_LAST_WORKFILE") - if not last_workfile or os.path.exists(last_workfile): - return - - log.info("Setting up project...") - global_context = get_global_context() - project_name = global_context.get("project_name") - folder_path = global_context.get("folder_path") - if not project_name or not folder_path: - return - - folder_entity = ayon_api.get_folder_by_path(project_name, folder_path) - - set_context_settings(project_name, folder_entity) - - def application_exit(self): - """Logic related to TimerManager. - - Todo: - This should be handled out of TVPaint integration logic. - """ - - data = get_current_project_settings() - stop_timer = data["tvpaint"]["stop_timer_on_application_exit"] - - if not stop_timer: - return - - # Stop application timer. - webserver_url = os.environ.get("AYON_WEBSERVER_URL") - rest_api_url = "{}/timers_manager/stop_timer".format(webserver_url) - requests.post(rest_api_url) - - -def containerise( - name, namespace, members, context, loader, current_containers=None -): - """Add new container to metadata. - - Args: - name (str): Container name. - namespace (str): Container namespace. - members (list): List of members that were loaded and belongs - to the container (layer names). - current_containers (list): Preloaded containers. Should be used only - on update/switch when containers were modified during the process. - - Returns: - dict: Container data stored to workfile metadata. - """ - - container_data = { - "schema": "openpype:container-2.0", - "id": AVALON_CONTAINER_ID, - "members": members, - "name": name, - "namespace": namespace, - "loader": str(loader), - "representation": context["representation"]["id"] - } - if current_containers is None: - current_containers = get_containers() - - # Add container to containers list - current_containers.append(container_data) - - # Store data to metadata - write_workfile_metadata(SECTION_NAME_CONTAINERS, current_containers) - - return container_data - - -def split_metadata_string(text, chunk_length=None): - """Split string by length. - - Split text to chunks by entered length. - Example: - ```python - text = "ABCDEFGHIJKLM" - result = split_metadata_string(text, 3) - print(result) - >>> ['ABC', 'DEF', 'GHI', 'JKL'] - ``` - - Args: - text (str): Text that will be split into chunks. - chunk_length (int): Single chunk size. Default chunk_length is - set to global variable `TVPAINT_CHUNK_LENGTH`. - - Returns: - list: List of strings with at least one item. - """ - if chunk_length is None: - chunk_length = TVPAINT_CHUNK_LENGTH - chunks = [] - for idx in range(chunk_length, len(text) + chunk_length, chunk_length): - start_idx = idx - chunk_length - chunks.append(text[start_idx:idx]) - return chunks - - -def get_workfile_metadata_string_for_keys(metadata_keys): - """Read metadata for specific keys from current project workfile. - - All values from entered keys are stored to single string without separator. - - Function is designed to help get all values for one metadata key at once. - So order of passed keys matteres. - - Args: - metadata_keys (list, str): Metadata keys for which data should be - retrieved. Order of keys matters! It is possible to enter only - single key as string. - """ - # Add ability to pass only single key - if isinstance(metadata_keys, str): - metadata_keys = [metadata_keys] - - output_file = tempfile.NamedTemporaryFile( - mode="w", prefix="a_tvp_", suffix=".txt", delete=False - ) - output_file.close() - output_filepath = output_file.name.replace("\\", "/") - - george_script_parts = [] - george_script_parts.append( - "output_path = \"{}\"".format(output_filepath) - ) - # Store data for each index of metadata key - for metadata_key in metadata_keys: - george_script_parts.append( - "tv_readprojectstring \"{}\" \"{}\" \"\"".format( - METADATA_SECTION, metadata_key - ) - ) - george_script_parts.append( - "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' result" - ) - - # Execute the script - george_script = "\n".join(george_script_parts) - execute_george_through_file(george_script) - - # Load data from temp file - with open(output_filepath, "r") as stream: - file_content = stream.read() - - # Remove `\n` from content - output_string = file_content.replace("\n", "") - - # Delete temp file - os.remove(output_filepath) - - return output_string - - -def get_workfile_metadata_string(metadata_key): - """Read metadata for specific key from current project workfile.""" - result = get_workfile_metadata_string_for_keys([metadata_key]) - if not result: - return None - - stripped_result = result.strip() - if not stripped_result: - return None - - # NOTE Backwards compatibility when metadata key did not store range of key - # indexes but the value itself - # NOTE We don't have to care about negative values with `isdecimal` check - if not stripped_result.isdecimal(): - metadata_string = result - else: - keys = [] - for idx in range(int(stripped_result)): - keys.append("{}{}".format(metadata_key, idx)) - metadata_string = get_workfile_metadata_string_for_keys(keys) - - # Replace quotes plaholders with their values - metadata_string = ( - metadata_string - .replace("{__sq__}", "'") - .replace("{__dq__}", "\"") - ) - return metadata_string - - -def get_workfile_metadata(metadata_key, default=None): - """Read and parse metadata for specific key from current project workfile. - - Pipeline use function to store loaded and created instances within keys - stored in `SECTION_NAME_INSTANCES` and `SECTION_NAME_CONTAINERS` - constants. - - Args: - metadata_key (str): Key defying which key should read. It is expected - value contain json serializable string. - """ - if default is None: - default = [] - - json_string = get_workfile_metadata_string(metadata_key) - if json_string: - try: - return json.loads(json_string) - except json.decoder.JSONDecodeError: - # TODO remove when backwards compatibility of storing metadata - # will be removed - print(( - "Fixed invalid metadata in workfile." - " Not serializable string was: {}" - ).format(json_string)) - write_workfile_metadata(metadata_key, default) - return default - - -def write_workfile_metadata(metadata_key, value): - """Write metadata for specific key into current project workfile. - - George script has specific way how to work with quotes which should be - solved automatically with this function. - - Args: - metadata_key (str): Key defying under which key value will be stored. - value (dict,list,str): Data to store they must be json serializable. - """ - if isinstance(value, (dict, list)): - value = json.dumps(value) - - if not value: - value = "" - - # Handle quotes in dumped json string - # - replace single and double quotes with placeholders - value = ( - value - .replace("'", "{__sq__}") - .replace("\"", "{__dq__}") - ) - chunks = split_metadata_string(value) - chunks_len = len(chunks) - - write_template = "tv_writeprojectstring \"{}\" \"{}\" \"{}\"" - george_script_parts = [] - # Add information about chunks length to metadata key itself - george_script_parts.append( - write_template.format(METADATA_SECTION, metadata_key, chunks_len) - ) - # Add chunk values to indexed metadata keys - for idx, chunk_value in enumerate(chunks): - sub_key = "{}{}".format(metadata_key, idx) - george_script_parts.append( - write_template.format(METADATA_SECTION, sub_key, chunk_value) - ) - - george_script = "\n".join(george_script_parts) - - return execute_george_through_file(george_script) - - -def get_current_workfile_context(): - """Return context in which was workfile saved.""" - return get_workfile_metadata(SECTION_NAME_CONTEXT, {}) - - -def save_current_workfile_context(context): - """Save context which was used to create a workfile.""" - return write_workfile_metadata(SECTION_NAME_CONTEXT, context) - - -def list_instances(): - """List all created instances from current workfile.""" - return get_workfile_metadata(SECTION_NAME_INSTANCES) - - -def write_instances(data): - return write_workfile_metadata(SECTION_NAME_INSTANCES, data) - - -def get_containers(): - output = get_workfile_metadata(SECTION_NAME_CONTAINERS) - if output: - for item in output: - if "objectName" not in item and "members" in item: - members = item["members"] - if isinstance(members, list): - members = "|".join([str(member) for member in members]) - item["objectName"] = members - return output - - -def set_context_settings(project_name, folder_entity): - """Set workfile settings by folder entity attributes. - - Change fps, resolution and frame start/end. - - Args: - project_name (str): Project name. - folder_entity (dict[str, Any]): Folder entity. - - """ - - if not folder_entity: - return - - folder_attributes = folder_entity["attrib"] - - width = folder_attributes.get("resolutionWidth") - height = folder_attributes.get("resolutionHeight") - if width is None or height is None: - print("Resolution was not found!") - else: - execute_george( - "tv_resizepage {} {} 0".format(width, height) - ) - - framerate = folder_attributes.get("fps") - - if framerate is not None: - execute_george( - "tv_framerate {} \"timestretch\"".format(framerate) - ) - else: - print("Framerate was not found!") - - frame_start = folder_attributes.get("frameStart") - frame_end = folder_attributes.get("frameEnd") - - if frame_start is None or frame_end is None: - print("Frame range was not found!") - return - - handle_start = folder_attributes.get("handleStart") - handle_end = folder_attributes.get("handleEnd") - - # Always start from 0 Mark In and set only Mark Out - mark_in = 0 - mark_out = mark_in + (frame_end - frame_start) + handle_start + handle_end - - execute_george("tv_markin {} set".format(mark_in)) - execute_george("tv_markout {} set".format(mark_out)) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py b/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py deleted file mode 100644 index 9dd6ae530a..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py +++ /dev/null @@ -1,205 +0,0 @@ -import re - -from ayon_core.pipeline import LoaderPlugin -from ayon_core.pipeline.create import ( - CreatedInstance, - get_product_name, - AutoCreator, - Creator, -) -from ayon_core.pipeline.create.creator_plugins import cache_and_get_instances - -from .lib import get_layers_data - - -SHARED_DATA_KEY = "ayon.tvpaint.instances" - - -class TVPaintCreatorCommon: - @property - def product_template_product_type(self): - return self.product_type - - def _cache_and_get_instances(self): - return cache_and_get_instances( - self, SHARED_DATA_KEY, self.host.list_instances - ) - - def _collect_create_instances(self): - instances_by_identifier = self._cache_and_get_instances() - for instance_data in instances_by_identifier[self.identifier]: - instance = CreatedInstance.from_existing(instance_data, self) - self._add_instance_to_context(instance) - - def _update_create_instances(self, update_list): - if not update_list: - return - - cur_instances = self.host.list_instances() - cur_instances_by_id = {} - for instance_data in cur_instances: - instance_id = instance_data.get("instance_id") - if instance_id: - cur_instances_by_id[instance_id] = instance_data - - for instance, changes in update_list: - instance_data = changes.new_value - cur_instance_data = cur_instances_by_id.get(instance.id) - if cur_instance_data is None: - cur_instances.append(instance_data) - continue - for key in set(cur_instance_data) - set(instance_data): - cur_instance_data.pop(key) - cur_instance_data.update(instance_data) - self.host.write_instances(cur_instances) - - def _custom_get_product_name( - self, - project_name, - folder_entity, - task_entity, - variant, - host_name=None, - instance=None - ): - dynamic_data = self.get_dynamic_data( - project_name, - folder_entity, - task_entity, - variant, - host_name, - instance - ) - task_name = task_type = None - if task_entity: - task_name = task_entity["name"] - task_type = task_entity["taskType"] - - return get_product_name( - project_name, - task_name, - task_type, - host_name, - self.product_type, - variant, - dynamic_data=dynamic_data, - project_settings=self.project_settings, - product_type_filter=self.product_template_product_type - ) - - -class TVPaintCreator(Creator, TVPaintCreatorCommon): - settings_category = "tvpaint" - - def collect_instances(self): - self._collect_create_instances() - - def update_instances(self, update_list): - self._update_create_instances(update_list) - - def remove_instances(self, instances): - ids_to_remove = { - instance.id - for instance in instances - } - cur_instances = self.host.list_instances() - changed = False - new_instances = [] - for instance_data in cur_instances: - if instance_data.get("instance_id") in ids_to_remove: - changed = True - else: - new_instances.append(instance_data) - - if changed: - self.host.write_instances(new_instances) - - for instance in instances: - self._remove_instance_from_context(instance) - - def get_dynamic_data(self, *args, **kwargs): - # Change folder and name by current workfile context - create_context = self.create_context - folder_path = create_context.get_current_folder_path() - task_name = create_context.get_current_task_name() - output = {} - if folder_path: - folder_name = folder_path.rsplit("/")[-1] - output["asset"] = folder_name - output["folder"] = {"name": folder_name} - if task_name: - output["task"] = task_name - return output - - def get_product_name(self, *args, **kwargs): - return self._custom_get_product_name(*args, **kwargs) - - def _store_new_instance(self, new_instance): - instances_data = self.host.list_instances() - instances_data.append(new_instance.data_to_store()) - self.host.write_instances(instances_data) - self._add_instance_to_context(new_instance) - - -class TVPaintAutoCreator(AutoCreator, TVPaintCreatorCommon): - settings_category = "tvpaint" - - def collect_instances(self): - self._collect_create_instances() - - def update_instances(self, update_list): - self._update_create_instances(update_list) - - def get_product_name(self, *args, **kwargs): - return self._custom_get_product_name(*args, **kwargs) - - -class Loader(LoaderPlugin): - hosts = ["tvpaint"] - settings_category = "tvpaint" - - @staticmethod - def get_members_from_container(container): - if "members" not in container and "objectName" in container: - # Backwards compatibility - layer_ids_str = container.get("objectName") - return [ - int(layer_id) for layer_id in layer_ids_str.split("|") - ] - return container["members"] - - def get_unique_layer_name(self, namespace, name): - """Layer name with counter as suffix. - - Find higher 3 digit suffix from all layer names in scene matching regex - `{namespace}_{name}_{suffix}`. Higher 3 digit suffix is used - as base for next number if scene does not contain layer matching regex - `0` is used ase base. - - Args: - namespace (str): Usually folder name. - name (str): Name of loaded product. - - Returns: - str: `{namespace}_{name}_{higher suffix + 1}` - """ - layer_name_base = "{}_{}".format(namespace, name) - - counter_regex = re.compile(r"_(\d{3})$") - - higher_counter = 0 - for layer in get_layers_data(): - layer_name = layer["name"] - if not layer_name.startswith(layer_name_base): - continue - number_subpart = layer_name[len(layer_name_base):] - groups = counter_regex.findall(number_subpart) - if len(groups) != 1: - continue - - counter = int(groups[0]) - if counter > higher_counter: - higher_counter = counter - continue - - return "{}_{:0>3d}".format(layer_name_base, higher_counter + 1) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py b/server_addon/tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py deleted file mode 100644 index 8ee91aa0e7..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py +++ /dev/null @@ -1,42 +0,0 @@ -from ayon_core.lib import get_ayon_launcher_args -from ayon_applications import PreLaunchHook, LaunchTypes - - -class TvpaintPrelaunchHook(PreLaunchHook): - """Launch arguments preparation. - - Hook add python executable and script path to tvpaint implementation before - tvpaint executable and add last workfile path to launch arguments. - - Existence of last workfile is checked. If workfile does not exists tries - to copy templated workfile from predefined path. - """ - app_groups = {"tvpaint"} - launch_types = {LaunchTypes.local} - - def execute(self): - # Pop tvpaint executable - executable_path = self.launch_context.launch_args.pop(0) - - # Pop rest of launch arguments - There should not be other arguments! - remainders = [] - while self.launch_context.launch_args: - remainders.append(self.launch_context.launch_args.pop(0)) - - new_launch_args = get_ayon_launcher_args( - "run", self.launch_script_path(), executable_path - ) - - # Append as whole list as these areguments should not be separated - self.launch_context.launch_args.append(new_launch_args) - - if remainders: - self.log.warning(( - "There are unexpected launch arguments in TVPaint launch. {}" - ).format(str(remainders))) - self.launch_context.launch_args.extend(remainders) - - def launch_script_path(self): - from ayon_tvpaint import get_launch_script_path - - return get_launch_script_path() diff --git a/server_addon/tvpaint/client/ayon_tvpaint/lib.py b/server_addon/tvpaint/client/ayon_tvpaint/lib.py deleted file mode 100644 index 97cf8d3633..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/lib.py +++ /dev/null @@ -1,684 +0,0 @@ -import os -import shutil -import collections -from PIL import Image, ImageDraw - - -def backwards_id_conversion(data_by_layer_id): - """Convert layer ids to strings from integers.""" - for key in tuple(data_by_layer_id.keys()): - if not isinstance(key, str): - data_by_layer_id[str(key)] = data_by_layer_id.pop(key) - - -def get_frame_filename_template(frame_end, filename_prefix=None, ext=None): - """Get file template with frame key for rendered files. - - This is simple template contains `{frame}{ext}` for sequential outputs - and `single_file{ext}` for single file output. Output is rendered to - temporary folder so filename should not matter as integrator change - them. - """ - frame_padding = 4 - frame_end_str_len = len(str(frame_end)) - if frame_end_str_len > frame_padding: - frame_padding = frame_end_str_len - - ext = ext or ".png" - filename_prefix = filename_prefix or "" - - return "{}{{frame:0>{}}}{}".format(filename_prefix, frame_padding, ext) - - -def get_layer_pos_filename_template(range_end, filename_prefix=None, ext=None): - filename_prefix = filename_prefix or "" - new_filename_prefix = filename_prefix + "pos_{pos}." - return get_frame_filename_template(range_end, new_filename_prefix, ext) - - -def _calculate_pre_behavior_copy( - range_start, exposure_frames, pre_beh, - layer_frame_start, layer_frame_end, - output_idx_by_frame_idx -): - """Calculate frames before first exposure frame based on pre behavior. - - Function may skip whole processing if first exposure frame is before - layer's first frame. In that case pre behavior does not make sense. - - Args: - range_start(int): First frame of range which should be rendered. - exposure_frames(list): List of all exposure frames on layer. - pre_beh(str): Pre behavior of layer (enum of 4 strings). - layer_frame_start(int): First frame of layer. - layer_frame_end(int): Last frame of layer. - output_idx_by_frame_idx(dict): References to already prepared frames - and where result will be stored. - """ - # Check if last layer frame is after range end - if layer_frame_start < range_start: - return - - first_exposure_frame = min(exposure_frames) - # Skip if last exposure frame is after range end - if first_exposure_frame < range_start: - return - - # Calculate frame count of layer - frame_count = layer_frame_end - layer_frame_start + 1 - - if pre_beh == "none": - # Just fill all frames from last exposure frame to range end with None - for frame_idx in range(range_start, layer_frame_start): - output_idx_by_frame_idx[frame_idx] = None - - elif pre_beh == "hold": - # Keep first frame for whole time - for frame_idx in range(range_start, layer_frame_start): - output_idx_by_frame_idx[frame_idx] = first_exposure_frame - - elif pre_beh == "repeat": - # Loop backwards from last frame of layer - for frame_idx in reversed(range(range_start, layer_frame_start)): - eq_frame_idx_offset = ( - (layer_frame_end - frame_idx) % frame_count - ) - eq_frame_idx = layer_frame_start + ( - layer_frame_end - eq_frame_idx_offset - ) - output_idx_by_frame_idx[frame_idx] = eq_frame_idx - - elif pre_beh == "pingpong": - half_seq_len = frame_count - 1 - seq_len = half_seq_len * 2 - for frame_idx in reversed(range(range_start, layer_frame_start)): - eq_frame_idx_offset = (layer_frame_start - frame_idx) % seq_len - if eq_frame_idx_offset > half_seq_len: - eq_frame_idx_offset = (seq_len - eq_frame_idx_offset) - eq_frame_idx = layer_frame_start + eq_frame_idx_offset - output_idx_by_frame_idx[frame_idx] = eq_frame_idx - - -def _calculate_post_behavior_copy( - range_end, exposure_frames, post_beh, - layer_frame_start, layer_frame_end, - output_idx_by_frame_idx -): - """Calculate frames after last frame of layer based on post behavior. - - Function may skip whole processing if last layer frame is after range_end. - In that case post behavior does not make sense. - - Args: - range_end(int): Last frame of range which should be rendered. - exposure_frames(list): List of all exposure frames on layer. - post_beh(str): Post behavior of layer (enum of 4 strings). - layer_frame_start(int): First frame of layer. - layer_frame_end(int): Last frame of layer. - output_idx_by_frame_idx(dict): References to already prepared frames - and where result will be stored. - """ - # Check if last layer frame is after range end - if layer_frame_end >= range_end: - return - - last_exposure_frame = max(exposure_frames) - # Skip if last exposure frame is after range end - # - this is probably irrelevant with layer frame end check? - if last_exposure_frame >= range_end: - return - - # Calculate frame count of layer - frame_count = layer_frame_end - layer_frame_start + 1 - - if post_beh == "none": - # Just fill all frames from last exposure frame to range end with None - for frame_idx in range(layer_frame_end + 1, range_end + 1): - output_idx_by_frame_idx[frame_idx] = None - - elif post_beh == "hold": - # Keep last exposure frame to the end - for frame_idx in range(layer_frame_end + 1, range_end + 1): - output_idx_by_frame_idx[frame_idx] = last_exposure_frame - - elif post_beh == "repeat": - # Loop backwards from last frame of layer - for frame_idx in range(layer_frame_end + 1, range_end + 1): - eq_frame_idx = layer_frame_start + (frame_idx % frame_count) - output_idx_by_frame_idx[frame_idx] = eq_frame_idx - - elif post_beh == "pingpong": - half_seq_len = frame_count - 1 - seq_len = half_seq_len * 2 - for frame_idx in range(layer_frame_end + 1, range_end + 1): - eq_frame_idx_offset = (frame_idx - layer_frame_end) % seq_len - if eq_frame_idx_offset > half_seq_len: - eq_frame_idx_offset = seq_len - eq_frame_idx_offset - eq_frame_idx = layer_frame_end - eq_frame_idx_offset - output_idx_by_frame_idx[frame_idx] = eq_frame_idx - - -def _calculate_in_range_frames( - range_start, range_end, - exposure_frames, layer_frame_end, - output_idx_by_frame_idx -): - """Calculate frame references in defined range. - - Function may skip whole processing if last layer frame is after range_end. - In that case post behavior does not make sense. - - Args: - range_start(int): First frame of range which should be rendered. - range_end(int): Last frame of range which should be rendered. - exposure_frames(list): List of all exposure frames on layer. - layer_frame_end(int): Last frame of layer. - output_idx_by_frame_idx(dict): References to already prepared frames - and where result will be stored. - """ - # Calculate in range frames - in_range_frames = [] - for frame_idx in exposure_frames: - if range_start <= frame_idx <= range_end: - output_idx_by_frame_idx[frame_idx] = frame_idx - in_range_frames.append(frame_idx) - - if in_range_frames: - first_in_range_frame = min(in_range_frames) - # Calculate frames from first exposure frames to range end or last - # frame of layer (post behavior should be calculated since that time) - previous_exposure = first_in_range_frame - for frame_idx in range(first_in_range_frame, range_end + 1): - if frame_idx > layer_frame_end: - break - - if frame_idx in exposure_frames: - previous_exposure = frame_idx - else: - output_idx_by_frame_idx[frame_idx] = previous_exposure - - # There can be frames before first exposure frame in range - # First check if we don't alreade have first range frame filled - if range_start in output_idx_by_frame_idx: - return - - first_exposure_frame = max(exposure_frames) - last_exposure_frame = max(exposure_frames) - # Check if is first exposure frame smaller than defined range - # if not then skip - if first_exposure_frame >= range_start: - return - - # Check is if last exposure frame is also before range start - # in that case we can't use fill frames before out range - if last_exposure_frame < range_start: - return - - closest_exposure_frame = first_exposure_frame - for frame_idx in exposure_frames: - if frame_idx >= range_start: - break - if frame_idx > closest_exposure_frame: - closest_exposure_frame = frame_idx - - output_idx_by_frame_idx[closest_exposure_frame] = closest_exposure_frame - for frame_idx in range(range_start, range_end + 1): - if frame_idx in output_idx_by_frame_idx: - break - output_idx_by_frame_idx[frame_idx] = closest_exposure_frame - - -def _cleanup_frame_references(output_idx_by_frame_idx): - """Cleanup frame references to frame reference. - - Cleanup not direct references to rendered frame. - ``` - // Example input - { - 1: 1, - 2: 1, - 3: 2 - } - // Result - { - 1: 1, - 2: 1, - 3: 1 // Changed reference to final rendered frame - } - ``` - Result is dictionary where keys leads to frame that should be rendered. - """ - for frame_idx in tuple(output_idx_by_frame_idx.keys()): - reference_idx = output_idx_by_frame_idx[frame_idx] - # Skip transparent frames - if reference_idx is None or reference_idx == frame_idx: - continue - - real_reference_idx = reference_idx - _tmp_reference_idx = reference_idx - while True: - _temp = output_idx_by_frame_idx[_tmp_reference_idx] - if _temp == _tmp_reference_idx: - real_reference_idx = _tmp_reference_idx - break - _tmp_reference_idx = _temp - - if real_reference_idx != reference_idx: - output_idx_by_frame_idx[frame_idx] = real_reference_idx - - -def _cleanup_out_range_frames(output_idx_by_frame_idx, range_start, range_end): - """Cleanup frame references to frames out of passed range. - - First available frame in range is used - ``` - // Example input. Range 2-3 - { - 1: 1, - 2: 1, - 3: 1 - } - // Result - { - 2: 2, // Redirect to self as is first that reference out range - 3: 2 // Redirect to first redirected frame - } - ``` - Result is dictionary where keys leads to frame that should be rendered. - """ - in_range_frames_by_out_frames = collections.defaultdict(set) - out_range_frames = set() - for frame_idx in tuple(output_idx_by_frame_idx.keys()): - # Skip frames that are already out of range - if frame_idx < range_start or frame_idx > range_end: - out_range_frames.add(frame_idx) - continue - - reference_idx = output_idx_by_frame_idx[frame_idx] - # Skip transparent frames - if reference_idx is None: - continue - - # Skip references in range - if reference_idx < range_start or reference_idx > range_end: - in_range_frames_by_out_frames[reference_idx].add(frame_idx) - - for reference_idx in tuple(in_range_frames_by_out_frames.keys()): - frame_indexes = in_range_frames_by_out_frames.pop(reference_idx) - new_reference = None - for frame_idx in frame_indexes: - if new_reference is None: - new_reference = frame_idx - output_idx_by_frame_idx[frame_idx] = new_reference - - # Finally remove out of range frames - for frame_idx in out_range_frames: - output_idx_by_frame_idx.pop(frame_idx) - - -def calculate_layer_frame_references( - range_start, range_end, - layer_frame_start, - layer_frame_end, - exposure_frames, - pre_beh, post_beh -): - """Calculate frame references for one layer based on it's data. - - Output is dictionary where key is frame index referencing to rendered frame - index. If frame index should be rendered then is referencing to self. - - ``` - // Example output - { - 1: 1, // Reference to self - will be rendered - 2: 1, // Reference to frame 1 - will be copied - 3: 1, // Reference to frame 1 - will be copied - 4: 4, // Reference to self - will be rendered - ... - 20: 4 // Reference to frame 4 - will be copied - 21: None // Has reference to None - transparent image - } - ``` - - Args: - range_start(int): First frame of range which should be rendered. - range_end(int): Last frame of range which should be rendered. - layer_frame_start(int)L First frame of layer. - layer_frame_end(int): Last frame of layer. - exposure_frames(list): List of all exposure frames on layer. - pre_beh(str): Pre behavior of layer (enum of 4 strings). - post_beh(str): Post behavior of layer (enum of 4 strings). - """ - # Output variable - output_idx_by_frame_idx = {} - # Skip if layer does not have any exposure frames - if not exposure_frames: - return output_idx_by_frame_idx - - # First calculate in range frames - _calculate_in_range_frames( - range_start, range_end, - exposure_frames, layer_frame_end, - output_idx_by_frame_idx - ) - # Calculate frames by pre behavior of layer - _calculate_pre_behavior_copy( - range_start, exposure_frames, pre_beh, - layer_frame_start, layer_frame_end, - output_idx_by_frame_idx - ) - # Calculate frames by post behavior of layer - _calculate_post_behavior_copy( - range_end, exposure_frames, post_beh, - layer_frame_start, layer_frame_end, - output_idx_by_frame_idx - ) - # Cleanup of referenced frames - _cleanup_frame_references(output_idx_by_frame_idx) - - # Remove frames out of range - _cleanup_out_range_frames(output_idx_by_frame_idx, range_start, range_end) - - return output_idx_by_frame_idx - - -def calculate_layers_extraction_data( - layers_data, - exposure_frames_by_layer_id, - behavior_by_layer_id, - range_start, - range_end, - skip_not_visible=True, - filename_prefix=None, - ext=None -): - """Calculate extraction data for passed layers data. - - ``` - { - : { - "frame_references": {...}, - "filenames_by_frame_index": {...} - }, - ... - } - ``` - - Frame references contains frame index reference to rendered frame index. - - Filename by frame index represents filename under which should be frame - stored. Directory is not handled here because each usage may need different - approach. - - Args: - layers_data(list): Layers data loaded from TVPaint. - exposure_frames_by_layer_id(dict): Exposure frames of layers stored by - layer id. - behavior_by_layer_id(dict): Pre and Post behavior of layers stored by - layer id. - range_start(int): First frame of rendered range. - range_end(int): Last frame of rendered range. - skip_not_visible(bool): Skip calculations for hidden layers (Skipped - by default). - filename_prefix(str): Prefix before filename. - ext(str): Extension which filenames will have ('.png' is default). - - Returns: - dict: Prepared data for rendering by layer position. - """ - # Make sure layer ids are strings - # backwards compatibility when layer ids were integers - backwards_id_conversion(exposure_frames_by_layer_id) - backwards_id_conversion(behavior_by_layer_id) - - layer_template = get_layer_pos_filename_template( - range_end, filename_prefix, ext - ) - output = {} - for layer_data in layers_data: - if skip_not_visible and not layer_data["visible"]: - continue - - orig_layer_id = layer_data["layer_id"] - layer_id = str(orig_layer_id) - - # Skip if does not have any exposure frames (empty layer) - exposure_frames = exposure_frames_by_layer_id[layer_id] - if not exposure_frames: - continue - - layer_position = layer_data["position"] - layer_frame_start = layer_data["frame_start"] - layer_frame_end = layer_data["frame_end"] - - layer_behavior = behavior_by_layer_id[layer_id] - - pre_behavior = layer_behavior["pre"] - post_behavior = layer_behavior["post"] - - frame_references = calculate_layer_frame_references( - range_start, range_end, - layer_frame_start, - layer_frame_end, - exposure_frames, - pre_behavior, post_behavior - ) - # All values in 'frame_references' reference to a frame that must be - # rendered out - frames_to_render = set(frame_references.values()) - # Remove 'None' reference (transparent image) - if None in frames_to_render: - frames_to_render.remove(None) - - # Skip layer if has nothing to render - if not frames_to_render: - continue - - # All filenames that should be as output (not final output) - filename_frames = ( - set(range(range_start, range_end + 1)) - | frames_to_render - ) - filenames_by_frame_index = {} - for frame_idx in filename_frames: - filenames_by_frame_index[frame_idx] = layer_template.format( - pos=layer_position, - frame=frame_idx - ) - - # Store objects under the layer id - output[orig_layer_id] = { - "frame_references": frame_references, - "filenames_by_frame_index": filenames_by_frame_index - } - return output - - -def create_transparent_image_from_source(src_filepath, dst_filepath): - """Create transparent image of same type and size as source image.""" - img_obj = Image.open(src_filepath) - painter = ImageDraw.Draw(img_obj) - painter.rectangle((0, 0, *img_obj.size), fill=(0, 0, 0, 0)) - img_obj.save(dst_filepath) - - -def fill_reference_frames(frame_references, filepaths_by_frame): - # Store path to first transparent image if there is any - for frame_idx, ref_idx in frame_references.items(): - # Frame referencing to self should be rendered and used as source - # and reference indexes with None can't be filled - if ref_idx is None or frame_idx == ref_idx: - continue - - # Get destination filepath - src_filepath = filepaths_by_frame[ref_idx] - dst_filepath = filepaths_by_frame[frame_idx] - - if hasattr(os, "link"): - os.link(src_filepath, dst_filepath) - else: - shutil.copy(src_filepath, dst_filepath) - - -def copy_render_file(src_path, dst_path): - """Create copy file of an image.""" - if hasattr(os, "link"): - os.link(src_path, dst_path) - else: - shutil.copy(src_path, dst_path) - - -def cleanup_rendered_layers(filepaths_by_layer_id): - """Delete all files for each individual layer files after compositing.""" - # Collect all filepaths from data - all_filepaths = [] - for filepaths_by_frame in filepaths_by_layer_id.values(): - all_filepaths.extend(filepaths_by_frame.values()) - - # Loop over loop - for filepath in set(all_filepaths): - if filepath is not None and os.path.exists(filepath): - os.remove(filepath) - - -def composite_rendered_layers( - layers_data, filepaths_by_layer_id, - range_start, range_end, - dst_filepaths_by_frame, cleanup=True -): - """Composite multiple rendered layers by their position. - - Result is single frame sequence with transparency matching content - created in TVPaint. Missing source filepaths are replaced with transparent - images but at least one image must be rendered and exist. - - Function can be used even if single layer was created to fill transparent - filepaths. - - Args: - layers_data(list): Layers data loaded from TVPaint. - filepaths_by_layer_id(dict): Rendered filepaths stored by frame index - per layer id. Used as source for compositing. - range_start(int): First frame of rendered range. - range_end(int): Last frame of rendered range. - dst_filepaths_by_frame(dict): Output filepaths by frame where final - image after compositing will be stored. Path must not clash with - source filepaths. - cleanup(bool): Remove all source filepaths when done with compositing. - """ - # Prepare layers by their position - # - position tells in which order will compositing happen - layer_ids_by_position = {} - for layer in layers_data: - layer_position = layer["position"] - layer_ids_by_position[layer_position] = layer["layer_id"] - - # Sort layer positions - sorted_positions = tuple(reversed(sorted(layer_ids_by_position.keys()))) - # Prepare variable where filepaths without any rendered content - # - transparent will be created - transparent_filepaths = set() - # Store first final filepath - first_dst_filepath = None - for frame_idx in range(range_start, range_end + 1): - dst_filepath = dst_filepaths_by_frame[frame_idx] - src_filepaths = [] - for layer_position in sorted_positions: - layer_id = layer_ids_by_position[layer_position] - filepaths_by_frame = filepaths_by_layer_id[layer_id] - src_filepath = filepaths_by_frame.get(frame_idx) - if src_filepath is not None: - src_filepaths.append(src_filepath) - - if not src_filepaths: - transparent_filepaths.add(dst_filepath) - continue - - # Store first destination filepath to be used for transparent images - if first_dst_filepath is None: - first_dst_filepath = dst_filepath - - if len(src_filepaths) == 1: - src_filepath = src_filepaths[0] - if cleanup: - os.rename(src_filepath, dst_filepath) - else: - copy_render_file(src_filepath, dst_filepath) - - else: - composite_images(src_filepaths, dst_filepath) - - # Store first transparent filepath to be able copy it - transparent_filepath = None - for dst_filepath in transparent_filepaths: - if transparent_filepath is None: - create_transparent_image_from_source( - first_dst_filepath, dst_filepath - ) - transparent_filepath = dst_filepath - else: - copy_render_file(transparent_filepath, dst_filepath) - - # Remove all files that were used as source for compositing - if cleanup: - cleanup_rendered_layers(filepaths_by_layer_id) - - -def composite_images(input_image_paths, output_filepath): - """Composite images in order from passed list. - - Raises: - ValueError: When entered list is empty. - """ - if not input_image_paths: - raise ValueError("Nothing to composite.") - - img_obj = None - for image_filepath in input_image_paths: - _img_obj = Image.open(image_filepath) - if img_obj is None: - img_obj = _img_obj - else: - img_obj.alpha_composite(_img_obj) - img_obj.save(output_filepath) - - -def rename_filepaths_by_frame_start( - filepaths_by_frame, range_start, range_end, new_frame_start -): - """Change frames in filenames of finished images to new frame start.""" - - # Calculate frame end - new_frame_end = range_end + (new_frame_start - range_start) - # Create filename template - filename_template = get_frame_filename_template( - max(range_end, new_frame_end) - ) - - # Use different ranges based on Mark In and output Frame Start values - # - this is to make sure that filename renaming won't affect files that - # are not renamed yet - if range_start < new_frame_start: - source_range = range(range_end, range_start - 1, -1) - output_range = range(new_frame_end, new_frame_start - 1, -1) - else: - # This is less possible situation as frame start will be in most - # cases higher than Mark In. - source_range = range(range_start, range_end + 1) - output_range = range(new_frame_start, new_frame_end + 1) - - # Skip if source first frame is same as destination first frame - new_dst_filepaths = {} - for src_frame, dst_frame in zip(source_range, output_range): - src_filepath = os.path.normpath(filepaths_by_frame[src_frame]) - dirpath, src_filename = os.path.split(src_filepath) - dst_filename = filename_template.format(frame=dst_frame) - dst_filepath = os.path.join(dirpath, dst_filename) - - if src_filename != dst_filename: - os.rename(src_filepath, dst_filepath) - - new_dst_filepaths[dst_frame] = dst_filepath - - return new_dst_filepaths diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/convert_legacy.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/convert_legacy.py deleted file mode 100644 index e79a6565e8..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/convert_legacy.py +++ /dev/null @@ -1,150 +0,0 @@ -import collections - -from ayon_core.pipeline.create.creator_plugins import ( - ProductConvertorPlugin, - cache_and_get_instances, -) -from ayon_tvpaint.api.plugin import SHARED_DATA_KEY -from ayon_tvpaint.api.lib import get_groups_data - - -class TVPaintLegacyConverted(ProductConvertorPlugin): - """Conversion of legacy instances in scene to new creators. - - This convertor handles only instances created by core creators. - - All instances that would be created using auto-creators are removed as at - the moment of finding them would there already be existing instances. - """ - - identifier = "tvpaint.legacy.converter" - - def find_instances(self): - instances_by_identifier = cache_and_get_instances( - self, SHARED_DATA_KEY, self.host.list_instances - ) - if instances_by_identifier[None]: - self.add_convertor_item("Convert legacy instances") - - def convert(self): - current_instances = self.host.list_instances() - to_convert = collections.defaultdict(list) - converted = False - for instance in current_instances: - if instance.get("creator_identifier") is not None: - continue - converted = True - - family = instance.get("family") - if family in ( - "renderLayer", - "renderPass", - "renderScene", - "review", - "workfile", - ): - to_convert[family].append(instance) - else: - instance["keep"] = False - - # Skip if nothing was changed - if not converted: - self.remove_convertor_item() - return - - self._convert_render_layers( - to_convert["renderLayer"], current_instances) - self._convert_render_passes( - to_convert["renderPass"], current_instances) - self._convert_render_scenes( - to_convert["renderScene"], current_instances) - self._convert_workfiles( - to_convert["workfile"], current_instances) - self._convert_reviews( - to_convert["review"], current_instances) - - new_instances = [ - instance - for instance in current_instances - if instance.get("keep") is not False - ] - self.host.write_instances(new_instances) - # remove legacy item if all is fine - self.remove_convertor_item() - - def _convert_render_layers(self, render_layers, current_instances): - if not render_layers: - return - - # Look for possible existing render layers in scene - render_layers_by_group_id = {} - for instance in current_instances: - if instance.get("creator_identifier") == "render.layer": - group_id = instance["creator_identifier"]["group_id"] - render_layers_by_group_id[group_id] = instance - - groups_by_id = { - group["group_id"]: group - for group in get_groups_data() - } - for render_layer in render_layers: - group_id = render_layer.pop("group_id") - # Just remove legacy instance if group is already occupied - if group_id in render_layers_by_group_id: - render_layer["keep"] = False - continue - # Add identifier - render_layer["creator_identifier"] = "render.layer" - # Change 'uuid' to 'instance_id' - render_layer["instance_id"] = render_layer.pop("uuid") - # Fill creator attributes - render_layer["creator_attributes"] = { - "group_id": group_id - } - render_layer["productType"] = "render" - group = groups_by_id[group_id] - # Use group name for variant - group["variant"] = group["name"] - - def _convert_render_passes(self, render_passes, current_instances): - if not render_passes: - return - - # Render passes must have available render layers so we look for render - # layers first - # - '_convert_render_layers' must be called before this method - render_layers_by_group_id = {} - for instance in current_instances: - if instance.get("creator_identifier") == "render.layer": - group_id = instance["creator_attributes"]["group_id"] - render_layers_by_group_id[group_id] = instance - - for render_pass in render_passes: - group_id = render_pass.pop("group_id") - render_layer = render_layers_by_group_id.get(group_id) - if not render_layer: - render_pass["keep"] = False - continue - - render_pass["creator_identifier"] = "render.pass" - render_pass["instance_id"] = render_pass.pop("uuid") - render_pass["productType"] = "render" - - render_pass["creator_attributes"] = { - "render_layer_instance_id": render_layer["instance_id"] - } - render_pass["variant"] = render_pass.pop("pass") - render_pass.pop("renderlayer") - - # Rest of instances are just marked for deletion - def _convert_render_scenes(self, render_scenes, current_instances): - for render_scene in render_scenes: - render_scene["keep"] = False - - def _convert_workfiles(self, workfiles, current_instances): - for render_scene in workfiles: - render_scene["keep"] = False - - def _convert_reviews(self, reviews, current_instances): - for render_scene in reviews: - render_scene["keep"] = False diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_render.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_render.py deleted file mode 100644 index 2286a4417a..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_render.py +++ /dev/null @@ -1,1208 +0,0 @@ -"""Render Layer and Passes creators. - -Render layer is main part which is represented by group in TVPaint. All TVPaint -layers marked with that group color are part of the render layer. To be more -specific about some parts of layer it is possible to create sub-sets of layer -which are named passes. Render pass consist of layers in same color group as -render layer but define more specific part. - -For example render layer could be 'Bob' which consist of 5 TVPaint layers. -- Bob has 'head' which consist of 2 TVPaint layers -> Render pass 'head' -- Bob has 'body' which consist of 1 TVPaint layer -> Render pass 'body' -- Bob has 'arm' which consist of 1 TVPaint layer -> Render pass 'arm' -- Last layer does not belong to render pass at all - -Bob will be rendered as 'beauty' of bob (all visible layers in group). -His head will be rendered too but without any other parts. The same for body -and arm. - -What is this good for? Compositing has more power how the renders are used. -Can do transforms on each render pass without need to modify a re-render them -using TVPaint. - -The workflow may hit issues when there are used other blending modes than -default 'color' blend more. In that case it is not recommended to use this -workflow at all as other blend modes may affect all layers in clip which can't -be done. - -There is special case for simple publishing of scene which is called -'render.scene'. That will use all visible layers and render them as one big -sequence. - -Todos: - Add option to extract marked layers and passes as json output format for - AfterEffects. -""" - -import collections -from typing import Any, Optional, Union - -import ayon_api - -from ayon_core.lib import ( - prepare_template_data, - AbstractAttrDef, - UILabelDef, - UISeparatorDef, - EnumDef, - TextDef, - BoolDef, -) -from ayon_core.pipeline.create import ( - CreatedInstance, - CreatorError, -) -from ayon_tvpaint.api.plugin import ( - TVPaintCreator, - TVPaintAutoCreator, -) -from ayon_tvpaint.api.lib import ( - get_layers_data, - get_groups_data, - execute_george_through_file, -) - -RENDER_LAYER_DETAILED_DESCRIPTIONS = ( - """Render Layer is "a group of TVPaint layers" - -Be aware Render Layer is not TVPaint layer. - -All TVPaint layers in the scene with the color group id are rendered in the -beauty pass. To create sub passes use Render Pass creator which is -dependent on existence of render layer instance. - -The group can represent an asset (tree) or different part of scene that consist -of one or more TVPaint layers that can be used as single item during -compositing (for example). - -In some cases may be needed to have sub parts of the layer. For example 'Bob' -could be Render Layer which has 'Arm', 'Head' and 'Body' as Render Passes. -""" -) - - -RENDER_PASS_DETAILED_DESCRIPTIONS = ( - """Render Pass is sub part of Render Layer. - -Render Pass can consist of one or more TVPaint layers. Render Pass must -belong to a Render Layer. Marked TVPaint layers will change it's group color -to match group color of Render Layer. -""" -) - - -AUTODETECT_RENDER_DETAILED_DESCRIPTION = ( - """Semi-automated Render Layer and Render Pass creation. - -Based on information in TVPaint scene will be created Render Layers and Render -Passes. All color groups used in scene will be used for Render Layer creation. -Name of the group is used as a variant. - -All TVPaint layers under the color group will be created as Render Pass where -layer name is used as variant. - -The plugin will use all used color groups and layers, or can skip those that -are not visible. - -There is option to auto-rename color groups before Render Layer creation. That -is based on settings template where is filled index of used group from bottom -to top. -""" -) - -class CreateRenderlayer(TVPaintCreator): - """Mark layer group as Render layer instance. - - All TVPaint layers in the scene with the color group id are rendered in the - beauty pass. To create sub passes use Render Layer creator which is - dependent on existence of render layer instance. - """ - - label = "Render Layer" - product_type = "render" - product_template_product_type = "renderLayer" - identifier = "render.layer" - icon = "fa5.images" - - # George script to change color group - rename_script_template = ( - "tv_layercolor \"setcolor\"" - " {clip_id} {group_id} {r} {g} {b} \"{name}\"" - ) - # Order to be executed before Render Pass creator - order = 90 - description = "Mark TVPaint color group as one Render Layer." - detailed_description = RENDER_LAYER_DETAILED_DESCRIPTIONS - - # Settings - # - Default render pass name for beauty - default_pass_name = "beauty" - # - Mark by default instance for review - mark_for_review = True - - def apply_settings(self, project_settings): - plugin_settings = ( - project_settings["tvpaint"]["create"]["create_render_layer"] - ) - self.default_variant = plugin_settings["default_variant"] - self.default_variants = plugin_settings["default_variants"] - self.default_pass_name = plugin_settings["default_pass_name"] - self.mark_for_review = plugin_settings["mark_for_review"] - - def get_dynamic_data( - self, - project_name, - folder_entity, - task_entity, - variant, - host_name, - instance - ): - dynamic_data = super().get_dynamic_data( - project_name, - folder_entity, - task_entity, - variant, - host_name, - instance - ) - dynamic_data["renderpass"] = self.default_pass_name - dynamic_data["renderlayer"] = variant - return dynamic_data - - def _get_selected_group_ids(self): - return { - layer["group_id"] - for layer in get_layers_data() - if layer["selected"] - } - - def create(self, product_name, instance_data, pre_create_data): - self.log.debug("Query data from workfile.") - - group_name = instance_data["variant"] - group_id = pre_create_data.get("group_id") - # This creator should run only on one group - if group_id is None or group_id == -1: - selected_groups = self._get_selected_group_ids() - selected_groups.discard(0) - if len(selected_groups) > 1: - raise CreatorError("You have selected more than one group") - - if len(selected_groups) == 0: - raise CreatorError("You don't have selected any group") - group_id = tuple(selected_groups)[0] - - self.log.debug("Querying groups data from workfile.") - groups_data = get_groups_data() - group_item = None - for group_data in groups_data: - if group_data["group_id"] == group_id: - group_item = group_data - - for instance in self.create_context.instances: - if ( - instance.creator_identifier == self.identifier - and instance["creator_attributes"]["group_id"] == group_id - ): - raise CreatorError(( - f"Group \"{group_item.get('name')}\" is already used" - f" by another render layer \"{instance['productName']}\"" - )) - - self.log.debug(f"Selected group id is \"{group_id}\".") - if "creator_attributes" not in instance_data: - instance_data["creator_attributes"] = {} - creator_attributes = instance_data["creator_attributes"] - mark_for_review = pre_create_data.get("mark_for_review") - if mark_for_review is None: - mark_for_review = self.mark_for_review - creator_attributes["group_id"] = group_id - creator_attributes["mark_for_review"] = mark_for_review - - self.log.info(f"Product name is {product_name}") - new_instance = CreatedInstance( - self.product_type, - product_name, - instance_data, - self - ) - self._store_new_instance(new_instance) - - if not group_id or group_item["name"] == group_name: - return new_instance - - self.log.debug("Changing name of the group.") - # Rename TVPaint group (keep color same) - # - groups can't contain spaces - rename_script = self.rename_script_template.format( - clip_id=group_item["clip_id"], - group_id=group_item["group_id"], - r=group_item["red"], - g=group_item["green"], - b=group_item["blue"], - name=group_name - ) - execute_george_through_file(rename_script) - - self.log.info(( - f"Name of group with index {group_id}" - f" was changed to \"{group_name}\"." - )) - return new_instance - - def _get_groups_enum(self): - groups_enum = [] - empty_groups = [] - for group in get_groups_data(): - group_name = group["name"] - item = { - "label": group_name, - "value": group["group_id"] - } - # TVPaint have defined how many color groups is available, but - # the count is not consistent across versions. It is not possible - # to know how many groups there is. - # - if group_name and group_name != "0": - if empty_groups: - groups_enum.extend(empty_groups) - empty_groups = [] - groups_enum.append(item) - else: - empty_groups.append(item) - return groups_enum - - def get_pre_create_attr_defs(self): - groups_enum = self._get_groups_enum() - groups_enum.insert(0, {"label": "", "value": -1}) - - return [ - EnumDef( - "group_id", - label="Group", - items=groups_enum - ), - BoolDef( - "mark_for_review", - label="Review", - default=self.mark_for_review - ) - ] - - def get_instance_attr_defs(self): - groups_enum = self._get_groups_enum() - return [ - EnumDef( - "group_id", - label="Group", - items=groups_enum - ), - BoolDef( - "mark_for_review", - label="Review", - default=self.mark_for_review - ) - ] - - def update_instances(self, update_list): - self._update_color_groups() - self._update_renderpass_groups() - - super().update_instances(update_list) - - def _update_color_groups(self): - render_layer_instances = [] - for instance in self.create_context.instances: - if instance.creator_identifier == self.identifier: - render_layer_instances.append(instance) - - if not render_layer_instances: - return - - groups_by_id = { - group["group_id"]: group - for group in get_groups_data() - } - grg_script_lines = [] - for instance in render_layer_instances: - group_id = instance["creator_attributes"]["group_id"] - variant = instance["variant"] - group = groups_by_id[group_id] - if group["name"] == variant: - continue - - grg_script_lines.append(self.rename_script_template.format( - clip_id=group["clip_id"], - group_id=group["group_id"], - r=group["red"], - g=group["green"], - b=group["blue"], - name=variant - )) - - if grg_script_lines: - execute_george_through_file("\n".join(grg_script_lines)) - - def _update_renderpass_groups(self): - render_layer_instances = {} - render_pass_instances = collections.defaultdict(list) - - for instance in self.create_context.instances: - if instance.creator_identifier == CreateRenderPass.identifier: - render_layer_id = ( - instance["creator_attributes"]["render_layer_instance_id"] - ) - render_pass_instances[render_layer_id].append(instance) - elif instance.creator_identifier == self.identifier: - render_layer_instances[instance.id] = instance - - if not render_pass_instances or not render_layer_instances: - return - - layers_data = get_layers_data() - layers_by_name = collections.defaultdict(list) - for layer in layers_data: - layers_by_name[layer["name"]].append(layer) - - george_lines = [] - for render_layer_id, instances in render_pass_instances.items(): - render_layer_inst = render_layer_instances.get(render_layer_id) - if render_layer_inst is None: - continue - group_id = render_layer_inst["creator_attributes"]["group_id"] - layer_names = set() - for instance in instances: - layer_names |= set(instance["layer_names"]) - - for layer_name in layer_names: - george_lines.extend( - f"tv_layercolor \"set\" {layer['layer_id']} {group_id}" - for layer in layers_by_name[layer_name] - if layer["group_id"] != group_id - ) - if george_lines: - execute_george_through_file("\n".join(george_lines)) - - -class CreateRenderPass(TVPaintCreator): - product_type = "render" - product_template_product_type = "renderPass" - identifier = "render.pass" - label = "Render Pass" - icon = "fa5.image" - description = "Mark selected TVPaint layers as pass of Render Layer." - detailed_description = RENDER_PASS_DETAILED_DESCRIPTIONS - - order = CreateRenderlayer.order + 10 - - # Settings - mark_for_review = True - - def apply_settings(self, project_settings): - plugin_settings = ( - project_settings["tvpaint"]["create"]["create_render_pass"] - ) - self.default_variant = plugin_settings["default_variant"] - self.default_variants = plugin_settings["default_variants"] - self.mark_for_review = plugin_settings["mark_for_review"] - - def collect_instances(self): - instances_by_identifier = self._cache_and_get_instances() - render_layers = { - instance_data["instance_id"]: { - "variant": instance_data["variant"], - "template_data": prepare_template_data({ - "renderlayer": instance_data["variant"] - }) - } - for instance_data in ( - instances_by_identifier[CreateRenderlayer.identifier] - ) - } - - for instance_data in instances_by_identifier[self.identifier]: - render_layer_instance_id = ( - instance_data - .get("creator_attributes", {}) - .get("render_layer_instance_id") - ) - render_layer_info = render_layers.get(render_layer_instance_id, {}) - self.update_instance_labels( - instance_data, - render_layer_info.get("variant"), - render_layer_info.get("template_data") - ) - instance = CreatedInstance.from_existing(instance_data, self) - self._add_instance_to_context(instance) - - def get_dynamic_data( - self, - project_name, - folder_entity, - task_entity, - variant, - host_name, - instance - ): - dynamic_data = super().get_dynamic_data( - project_name, - folder_entity, - task_entity, - variant, - host_name, - instance - ) - dynamic_data["renderpass"] = variant - dynamic_data["renderlayer"] = "{renderlayer}" - return dynamic_data - - def update_instance_labels( - self, instance, render_layer_variant, render_layer_data=None - ): - old_label = instance.get("label") - old_group = instance.get("group") - new_label = None - new_group = None - if render_layer_variant is not None: - if render_layer_data is None: - render_layer_data = prepare_template_data({ - "renderlayer": render_layer_variant - }) - try: - new_label = instance["productName"].format(**render_layer_data) - except (KeyError, ValueError): - pass - - new_group = f"{self.get_group_label()} ({render_layer_variant})" - - instance["label"] = new_label - instance["group"] = new_group - return old_group != new_group or old_label != new_label - - def create(self, product_name, instance_data, pre_create_data): - render_layer_instance_id = pre_create_data.get( - "render_layer_instance_id" - ) - if not render_layer_instance_id: - raise CreatorError(( - "You cannot create a Render Pass without a Render Layer." - " Please select one first" - )) - - render_layer_instance = self.create_context.instances_by_id.get( - render_layer_instance_id - ) - if render_layer_instance is None: - raise CreatorError(( - "RenderLayer instance was not found" - f" by id \"{render_layer_instance_id}\"" - )) - - group_id = render_layer_instance["creator_attributes"]["group_id"] - self.log.debug("Query data from workfile.") - layers_data = get_layers_data() - - self.log.debug("Checking selection.") - # Get all selected layers and their group ids - marked_layer_names = pre_create_data.get("layer_names") - if marked_layer_names is not None: - layers_by_name = {layer["name"]: layer for layer in layers_data} - marked_layers = [] - for layer_name in marked_layer_names: - layer = layers_by_name.get(layer_name) - if layer is None: - raise CreatorError( - f"Layer with name \"{layer_name}\" was not found") - marked_layers.append(layer) - - else: - marked_layers = [ - layer - for layer in layers_data - if layer["selected"] - ] - - # Raise if nothing is selected - if not marked_layers: - raise CreatorError( - "Nothing is selected. Please select layers.") - - marked_layer_names = {layer["name"] for layer in marked_layers} - - marked_layer_names = set(marked_layer_names) - - instances_to_remove = [] - for instance in self.create_context.instances: - if instance.creator_identifier != self.identifier: - continue - cur_layer_names = set(instance["layer_names"]) - if not cur_layer_names.intersection(marked_layer_names): - continue - new_layer_names = cur_layer_names - marked_layer_names - if new_layer_names: - instance["layer_names"] = list(new_layer_names) - else: - instances_to_remove.append(instance) - - render_layer = render_layer_instance["variant"] - product_name_fill_data = {"renderlayer": render_layer} - - # Format dynamic keys in product name - label = product_name - try: - label = label.format( - **prepare_template_data(product_name_fill_data) - ) - except (KeyError, ValueError): - pass - - self.log.info(f"New product name is \"{label}\".") - instance_data["label"] = label - instance_data["group"] = f"{self.get_group_label()} ({render_layer})" - instance_data["layer_names"] = list(marked_layer_names) - if "creator_attributes" not in instance_data: - instance_data["creator_attributes"] = {} - - creator_attributes = instance_data["creator_attributes"] - mark_for_review = pre_create_data.get("mark_for_review") - if mark_for_review is None: - mark_for_review = self.mark_for_review - creator_attributes["mark_for_review"] = mark_for_review - creator_attributes["render_layer_instance_id"] = ( - render_layer_instance_id - ) - - new_instance = CreatedInstance( - self.product_type, - product_name, - instance_data, - self - ) - instances_data = self._remove_and_filter_instances( - instances_to_remove - ) - instances_data.append(new_instance.data_to_store()) - - self.host.write_instances(instances_data) - self._add_instance_to_context(new_instance) - self._change_layers_group(marked_layers, group_id) - - return new_instance - - def _change_layers_group(self, layers, group_id): - filtered_layers = [ - layer - for layer in layers - if layer["group_id"] != group_id - ] - if filtered_layers: - self.log.info(( - "Changing group of " - f"{','.join([layer['name'] for layer in filtered_layers])}" - f" to {group_id}" - )) - george_lines = [ - f"tv_layercolor \"set\" {layer['layer_id']} {group_id}" - for layer in filtered_layers - ] - execute_george_through_file("\n".join(george_lines)) - - def _remove_and_filter_instances(self, instances_to_remove): - instances_data = self.host.list_instances() - if not instances_to_remove: - return instances_data - - removed_ids = set() - for instance in instances_to_remove: - removed_ids.add(instance.id) - self._remove_instance_from_context(instance) - - return [ - instance_data - for instance_data in instances_data - if instance_data.get("instance_id") not in removed_ids - ] - - def get_pre_create_attr_defs(self): - # Find available Render Layers - # - instances are created after creators reset - current_instances = self.host.list_instances() - render_layers = [ - { - "value": inst["instance_id"], - "label": inst["productName"] - } - for inst in current_instances - if inst.get("creator_identifier") == CreateRenderlayer.identifier - ] - if not render_layers: - render_layers.append({"value": None, "label": "N/A"}) - - return [ - EnumDef( - "render_layer_instance_id", - label="Render Layer", - items=render_layers - ), - UILabelDef( - "NOTE: Try to hit refresh if you don't see a Render Layer" - ), - BoolDef( - "mark_for_review", - label="Review", - default=self.mark_for_review - ) - ] - - def get_instance_attr_defs(self): - # Find available Render Layers - current_instances = self.create_context.instances - render_layers = [ - { - "value": instance.id, - "label": instance.label - } - for instance in current_instances - if instance.creator_identifier == CreateRenderlayer.identifier - ] - if not render_layers: - render_layers.append({"value": None, "label": "N/A"}) - - return [ - EnumDef( - "render_layer_instance_id", - label="Render Layer", - items=render_layers - ), - UILabelDef( - "NOTE: Try to hit refresh if you don't see a Render Layer" - ), - BoolDef( - "mark_for_review", - label="Review", - default=self.mark_for_review - ) - ] - - -class TVPaintAutoDetectRenderCreator(TVPaintCreator): - """Create Render Layer and Render Pass instances based on scene data. - - This is auto-detection creator which can be triggered by user to create - instances based on information in scene. Each used color group in scene - will be created as Render Layer where group name is used as variant and - each TVPaint layer as Render Pass where layer name is used as variant. - - Never will have any instances, all instances belong to different creators. - """ - - product_type = "render" - label = "Render Layer/Passes" - identifier = "render.auto.detect.creator" - order = CreateRenderPass.order + 10 - description = ( - "Create Render Layers and Render Passes based on scene setup" - ) - detailed_description = AUTODETECT_RENDER_DETAILED_DESCRIPTION - - # Settings - enabled = False - allow_group_rename = True - group_name_template = "L{group_index}" - group_idx_offset = 10 - group_idx_padding = 3 - - def apply_settings(self, project_settings): - plugin_settings = ( - project_settings - ["tvpaint"] - ["create"] - ["auto_detect_render"] - ) - self.enabled = plugin_settings.get("enabled", False) - self.allow_group_rename = plugin_settings["allow_group_rename"] - self.group_name_template = plugin_settings["group_name_template"] - self.group_idx_offset = plugin_settings["group_idx_offset"] - self.group_idx_padding = plugin_settings["group_idx_padding"] - - def _rename_groups( - self, - groups_order: list[int], - scene_groups: list[dict[str, Any]] - ): - new_group_name_by_id: dict[int, str] = {} - groups_by_id: dict[int, dict[str, Any]] = { - group["group_id"]: group - for group in scene_groups - } - # Count only renamed groups - for idx, group_id in enumerate(groups_order): - group_index_value: str = ( - "{{:0>{}}}" - .format(self.group_idx_padding) - .format((idx + 1) * self.group_idx_offset) - ) - group_name_fill_values: dict[str, str] = { - "groupIdx": group_index_value, - "groupidx": group_index_value, - "group_idx": group_index_value, - "group_index": group_index_value, - } - - group_name: str = self.group_name_template.format( - **group_name_fill_values - ) - group: dict[str, Any] = groups_by_id[group_id] - if group["name"] != group_name: - new_group_name_by_id[group_id] = group_name - - grg_lines: list[str] = [] - for group_id, group_name in new_group_name_by_id.items(): - group: dict[str, Any] = groups_by_id[group_id] - grg_line: str = ( - "tv_layercolor \"setcolor\" {} {} {} {} {} \"{}\"" - ).format( - group["clip_id"], - group_id, - group["red"], - group["green"], - group["blue"], - group_name - ) - grg_lines.append(grg_line) - group["name"] = group_name - - if grg_lines: - execute_george_through_file("\n".join(grg_lines)) - - def _prepare_render_layer( - self, - project_name: str, - folder_entity: dict[str, Any], - task_entity: dict[str, Any], - group_id: int, - groups: list[dict[str, Any]], - mark_for_review: bool, - existing_instance: Optional[CreatedInstance] = None, - ) -> Union[CreatedInstance, None]: - match_group: Union[dict[str, Any], None] = next( - ( - group - for group in groups - if group["group_id"] == group_id - ), - None - ) - if not match_group: - return None - - task_name = task_entity["name"] - variant: str = match_group["name"] - creator: CreateRenderlayer = ( - self.create_context.creators[CreateRenderlayer.identifier] - ) - - product_name: str = creator.get_product_name( - project_name, - folder_entity, - task_entity, - variant, - host_name=self.create_context.host_name, - ) - if existing_instance is not None: - existing_instance["folderPath"] = folder_entity["path"] - existing_instance["task"] = task_name - existing_instance["productName"] = product_name - return existing_instance - - instance_data: dict[str, str] = { - "folderPath": folder_entity["path"], - "task": task_name, - "productType": creator.product_type, - "variant": variant, - } - pre_create_data: dict[str, str] = { - "group_id": group_id, - "mark_for_review": mark_for_review - } - return creator.create(product_name, instance_data, pre_create_data) - - def _prepare_render_passes( - self, - project_name: str, - folder_entity: dict[str, Any], - task_entity: dict[str, Any], - render_layer_instance: CreatedInstance, - layers: list[dict[str, Any]], - mark_for_review: bool, - existing_render_passes: list[CreatedInstance] - ): - task_name = task_entity["name"] - creator: CreateRenderPass = ( - self.create_context.creators[CreateRenderPass.identifier] - ) - render_pass_by_layer_name = {} - for render_pass in existing_render_passes: - for layer_name in render_pass["layer_names"]: - render_pass_by_layer_name[layer_name] = render_pass - - for layer in layers: - layer_name = layer["name"] - variant = layer_name - render_pass = render_pass_by_layer_name.get(layer_name) - if render_pass is not None: - if (render_pass["layer_names"]) > 1: - variant = render_pass["variant"] - - product_name = creator.get_product_name( - project_name, - folder_entity, - task_entity, - variant, - host_name=self.create_context.host_name, - instance=render_pass - ) - - if render_pass is not None: - render_pass["folderPath"] = folder_entity["path"] - render_pass["task"] = task_name - render_pass["productName"] = product_name - continue - - instance_data: dict[str, str] = { - "folderPath": folder_entity["path"], - "task": task_name, - "productType": creator.product_type, - "variant": variant - } - - pre_create_data: dict[str, Any] = { - "render_layer_instance_id": render_layer_instance.id, - "layer_names": [layer_name], - "mark_for_review": mark_for_review - } - creator.create(product_name, instance_data, pre_create_data) - - def _filter_groups( - self, - layers_by_group_id, - groups_order, - only_visible_groups - ): - new_groups_order = [] - for group_id in groups_order: - layers: list[dict[str, Any]] = layers_by_group_id[group_id] - if not layers: - continue - - if ( - only_visible_groups - and not any( - layer - for layer in layers - if layer["visible"] - ) - ): - continue - new_groups_order.append(group_id) - return new_groups_order - - def create(self, product_name, instance_data, pre_create_data): - project_name: str = self.create_context.get_current_project_name() - folder_path: str = instance_data["folderPath"] - task_name: str = instance_data["task"] - folder_entity: dict[str, Any] = ayon_api.get_folder_by_path( - project_name, folder_path) - task_entity: dict[str, Any] = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - - render_layers_by_group_id: dict[int, CreatedInstance] = {} - render_passes_by_render_layer_id: dict[int, list[CreatedInstance]] = ( - collections.defaultdict(list) - ) - for instance in self.create_context.instances: - if instance.creator_identifier == CreateRenderlayer.identifier: - group_id = instance["creator_attributes"]["group_id"] - render_layers_by_group_id[group_id] = instance - elif instance.creator_identifier == CreateRenderPass.identifier: - render_layer_id = ( - instance - ["creator_attributes"] - ["render_layer_instance_id"] - ) - render_passes_by_render_layer_id[render_layer_id].append( - instance - ) - - layers_by_group_id: dict[int, list[dict[str, Any]]] = ( - collections.defaultdict(list) - ) - scene_layers: list[dict[str, Any]] = get_layers_data() - scene_groups: list[dict[str, Any]] = get_groups_data() - groups_order: list[int] = [] - for layer in scene_layers: - group_id: int = layer["group_id"] - # Skip 'default' group - if group_id == 0: - continue - - layers_by_group_id[group_id].append(layer) - if group_id not in groups_order: - groups_order.append(group_id) - - groups_order.reverse() - - mark_layers_for_review = pre_create_data.get( - "mark_layers_for_review", False - ) - mark_passes_for_review = pre_create_data.get( - "mark_passes_for_review", False - ) - rename_groups = pre_create_data.get("rename_groups", False) - only_visible_groups = pre_create_data.get("only_visible_groups", False) - groups_order = self._filter_groups( - layers_by_group_id, - groups_order, - only_visible_groups - ) - if not groups_order: - return - - if rename_groups: - self._rename_groups(groups_order, scene_groups) - - # Make sure all render layers are created - for group_id in groups_order: - instance: Union[CreatedInstance, None] = ( - self._prepare_render_layer( - project_name, - folder_entity, - task_entity, - group_id, - scene_groups, - mark_layers_for_review, - render_layers_by_group_id.get(group_id), - ) - ) - if instance is not None: - render_layers_by_group_id[group_id] = instance - - for group_id in groups_order: - layers: list[dict[str, Any]] = layers_by_group_id[group_id] - render_layer_instance: Union[CreatedInstance, None] = ( - render_layers_by_group_id.get(group_id) - ) - if not layers or render_layer_instance is None: - continue - - self._prepare_render_passes( - project_name, - folder_entity, - task_entity, - render_layer_instance, - layers, - mark_passes_for_review, - render_passes_by_render_layer_id[render_layer_instance.id] - ) - - def get_pre_create_attr_defs(self) -> list[AbstractAttrDef]: - render_layer_creator: CreateRenderlayer = ( - self.create_context.creators[CreateRenderlayer.identifier] - ) - render_pass_creator: CreateRenderPass = ( - self.create_context.creators[CreateRenderPass.identifier] - ) - output = [] - if self.allow_group_rename: - output.extend([ - BoolDef( - "rename_groups", - label="Rename color groups", - tooltip="Will rename color groups using studio template", - default=True - ), - BoolDef( - "only_visible_groups", - label="Only visible color groups", - tooltip=( - "Render Layers and rename will happen only on color" - " groups with visible layers." - ), - default=True - ), - UISeparatorDef() - ]) - output.extend([ - BoolDef( - "mark_layers_for_review", - label="Mark RenderLayers for review", - default=render_layer_creator.mark_for_review - ), - BoolDef( - "mark_passes_for_review", - label="Mark RenderPasses for review", - default=render_pass_creator.mark_for_review - ) - ]) - return output - - -class TVPaintSceneRenderCreator(TVPaintAutoCreator): - product_type = "render" - product_template_product_type = "renderScene" - identifier = "render.scene" - label = "Scene Render" - icon = "fa.file-image-o" - - # Settings - default_pass_name = "beauty" - mark_for_review = True - active_on_create = False - - def apply_settings(self, project_settings): - plugin_settings = ( - project_settings["tvpaint"]["create"]["create_render_scene"] - ) - self.default_variant = plugin_settings["default_variant"] - self.default_variants = plugin_settings["default_variants"] - self.mark_for_review = plugin_settings["mark_for_review"] - self.active_on_create = plugin_settings["active_on_create"] - self.default_pass_name = plugin_settings["default_pass_name"] - - def get_dynamic_data( - self, - project_name, - folder_entity, - task_entity, - variant, - host_name, - instance - ): - dynamic_data = super().get_dynamic_data( - project_name, - folder_entity, - task_entity, - variant, - host_name, - instance - ) - dynamic_data["renderpass"] = "{renderpass}" - dynamic_data["renderlayer"] = variant - return dynamic_data - - def _create_new_instance(self): - create_context = self.create_context - host_name = create_context.host_name - project_name = create_context.get_current_project_name() - folder_path = create_context.get_current_folder_path() - task_name = create_context.get_current_task_name() - - folder_entity = ayon_api.get_folder_by_path(project_name, folder_path) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - self.default_variant, - host_name, - ) - data = { - "folderPath": folder_path, - "task": task_name, - "variant": self.default_variant, - "creator_attributes": { - "render_pass_name": self.default_pass_name, - "mark_for_review": True - }, - "label": self._get_label( - product_name, - self.default_pass_name - ) - } - if not self.active_on_create: - data["active"] = False - - new_instance = CreatedInstance( - self.product_type, product_name, data, self - ) - instances_data = self.host.list_instances() - instances_data.append(new_instance.data_to_store()) - self.host.write_instances(instances_data) - self._add_instance_to_context(new_instance) - return new_instance - - def create(self): - existing_instance = None - for instance in self.create_context.instances: - if instance.creator_identifier == self.identifier: - existing_instance = instance - break - - if existing_instance is None: - return self._create_new_instance() - - create_context = self.create_context - host_name = create_context.host_name - project_name = create_context.get_current_project_name() - folder_path = create_context.get_current_folder_path() - task_name = create_context.get_current_task_name() - - existing_name = existing_instance.get("folderPath") - if ( - existing_name != folder_path - or existing_instance["task"] != task_name - ): - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - existing_instance["variant"], - host_name, - existing_instance - ) - existing_instance["folderPath"] = folder_path - existing_instance["task"] = task_name - existing_instance["productName"] = product_name - - existing_instance["label"] = self._get_label( - existing_instance["productName"], - existing_instance["creator_attributes"]["render_pass_name"] - ) - - def _get_label(self, product_name, render_pass_name): - try: - product_name = product_name.format(**prepare_template_data({ - "renderpass": render_pass_name - })) - except (KeyError, ValueError): - pass - - return product_name - - def get_instance_attr_defs(self): - return [ - TextDef( - "render_pass_name", - label="Pass Name", - default=self.default_pass_name, - tooltip=( - "Value is calculated during publishing and UI will update" - " label after refresh." - ) - ), - BoolDef( - "mark_for_review", - label="Review", - default=self.mark_for_review - ) - ] diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_review.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_review.py deleted file mode 100644 index 6068ffa1d8..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_review.py +++ /dev/null @@ -1,92 +0,0 @@ -import ayon_api - -from ayon_core.pipeline import CreatedInstance -from ayon_tvpaint.api.plugin import TVPaintAutoCreator - - -class TVPaintReviewCreator(TVPaintAutoCreator): - product_type = "review" - identifier = "scene.review" - label = "Review" - icon = "ei.video" - - # Settings - active_on_create = True - - def apply_settings(self, project_settings): - plugin_settings = ( - project_settings["tvpaint"]["create"]["create_review"] - ) - self.default_variant = plugin_settings["default_variant"] - self.default_variants = plugin_settings["default_variants"] - self.active_on_create = plugin_settings["active_on_create"] - - def create(self): - existing_instance = None - for instance in self.create_context.instances: - if instance.creator_identifier == self.identifier: - existing_instance = instance - break - - create_context = self.create_context - host_name = create_context.host_name - project_name = create_context.get_current_project_name() - folder_path = create_context.get_current_folder_path() - task_name = create_context.get_current_task_name() - - existing_folder_path = None - if existing_instance is not None: - existing_folder_path = existing_instance["folderPath"] - - if existing_instance is None: - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - self.default_variant, - host_name - ) - data = { - "folderPath": folder_path, - "task": task_name, - "variant": self.default_variant, - } - - if not self.active_on_create: - data["active"] = False - - new_instance = CreatedInstance( - self.product_type, product_name, data, self - ) - instances_data = self.host.list_instances() - instances_data.append(new_instance.data_to_store()) - self.host.write_instances(instances_data) - self._add_instance_to_context(new_instance) - - elif ( - existing_folder_path != folder_path - or existing_instance["task"] != task_name - ): - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - existing_instance["variant"], - host_name, - existing_instance - ) - existing_instance["folderPath"] = folder_path - existing_instance["task"] = task_name - existing_instance["productName"] = product_name diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_workfile.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_workfile.py deleted file mode 100644 index b08f731869..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_workfile.py +++ /dev/null @@ -1,85 +0,0 @@ -import ayon_api - -from ayon_core.pipeline import CreatedInstance -from ayon_tvpaint.api.plugin import TVPaintAutoCreator - - -class TVPaintWorkfileCreator(TVPaintAutoCreator): - product_type = "workfile" - identifier = "workfile" - label = "Workfile" - icon = "fa.file-o" - - def apply_settings(self, project_settings): - plugin_settings = ( - project_settings["tvpaint"]["create"]["create_workfile"] - ) - self.default_variant = plugin_settings["default_variant"] - self.default_variants = plugin_settings["default_variants"] - - def create(self): - existing_instance = None - for instance in self.create_context.instances: - if instance.creator_identifier == self.identifier: - existing_instance = instance - break - - create_context = self.create_context - host_name = create_context.host_name - project_name = create_context.get_current_project_name() - folder_path = create_context.get_current_folder_path() - task_name = create_context.get_current_task_name() - - existing_folder_path = None - if existing_instance is not None: - existing_folder_path = existing_instance["folderPath"] - - if existing_instance is None: - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - self.default_variant, - host_name - ) - data = { - "folderPath": folder_path, - "task": task_name, - "variant": self.default_variant - } - - new_instance = CreatedInstance( - self.product_type, product_name, data, self - ) - instances_data = self.host.list_instances() - instances_data.append(new_instance.data_to_store()) - self.host.write_instances(instances_data) - self._add_instance_to_context(new_instance) - - elif ( - existing_folder_path != folder_path - or existing_instance["task"] != task_name - ): - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - existing_instance["variant"], - host_name, - existing_instance - ) - existing_instance["folderPath"] = folder_path - existing_instance["task"] = task_name - existing_instance["productName"] = product_name diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py deleted file mode 100644 index 18b06c9632..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py +++ /dev/null @@ -1,87 +0,0 @@ -from ayon_core.lib.attribute_definitions import BoolDef -from ayon_tvpaint.api import plugin -from ayon_tvpaint.api.lib import execute_george_through_file - - -class ImportImage(plugin.Loader): - """Load image or image sequence to TVPaint as new layer.""" - - product_types = {"render", "image", "background", "plate", "review"} - representations = {"*"} - settings_category = "tvpaint" - - label = "Import Image" - order = 1 - icon = "image" - color = "white" - - import_script = ( - "filepath = \"{}\"\n" - "layer_name = \"{}\"\n" - "tv_loadsequence filepath {}PARSE layer_id\n" - "tv_layerrename layer_id layer_name" - ) - - defaults = { - "stretch": True, - "timestretch": True, - "preload": True - } - - @classmethod - def get_options(cls, contexts): - return [ - BoolDef( - "stretch", - label="Stretch to project size", - default=cls.defaults["stretch"], - tooltip="Stretch loaded image/s to project resolution?" - ), - BoolDef( - "timestretch", - label="Stretch to timeline length", - default=cls.defaults["timestretch"], - tooltip="Clip loaded image/s to timeline length?" - ), - BoolDef( - "preload", - label="Preload loaded image/s", - default=cls.defaults["preload"], - tooltip="Preload image/s?" - ) - ] - - def load(self, context, name, namespace, options): - stretch = options.get("stretch", self.defaults["stretch"]) - timestretch = options.get("timestretch", self.defaults["timestretch"]) - preload = options.get("preload", self.defaults["preload"]) - - load_options = [] - if stretch: - load_options.append("\"STRETCH\"") - if timestretch: - load_options.append("\"TIMESTRETCH\"") - if preload: - load_options.append("\"PRELOAD\"") - - load_options_str = "" - for load_option in load_options: - load_options_str += (load_option + " ") - - # Prepare layer name - folder_name = context["folder"]["name"] - version_name = context["version"]["name"] - layer_name = "{}_{}_v{:0>3}".format( - folder_name, - name, - version_name - ) - # Fill import script with filename and layer name - # - filename mus not contain backwards slashes - path = self.filepath_from_context(context).replace("\\", "/") - george_script = self.import_script.format( - path, - layer_name, - load_options_str - ) - return execute_george_through_file(george_script) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py deleted file mode 100644 index 88bf738999..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py +++ /dev/null @@ -1,319 +0,0 @@ -import collections - -from ayon_core.lib.attribute_definitions import BoolDef -from ayon_core.pipeline import registered_host -from ayon_tvpaint.api import plugin -from ayon_tvpaint.api.lib import ( - get_layers_data, - execute_george_through_file, -) -from ayon_tvpaint.api.pipeline import ( - write_workfile_metadata, - SECTION_NAME_CONTAINERS, - containerise, -) - - -class LoadImage(plugin.Loader): - """Load image or image sequence to TVPaint as new layer.""" - - product_types = {"render", "image", "background", "plate", "review"} - representations = {"*"} - settings_category = "tvpaint" - - label = "Load Image" - order = 1 - icon = "image" - color = "white" - - import_script = ( - "filepath = '\"'\"{}\"'\"'\n" - "layer_name = \"{}\"\n" - "tv_loadsequence filepath {}PARSE layer_id\n" - "tv_layerrename layer_id layer_name" - ) - - defaults = { - "stretch": True, - "timestretch": True, - "preload": True - } - - @classmethod - def get_options(cls, contexts): - return [ - BoolDef( - "stretch", - label="Stretch to project size", - default=cls.defaults["stretch"], - tooltip="Stretch loaded image/s to project resolution?" - ), - BoolDef( - "timestretch", - label="Stretch to timeline length", - default=cls.defaults["timestretch"], - tooltip="Clip loaded image/s to timeline length?" - ), - BoolDef( - "preload", - label="Preload loaded image/s", - default=cls.defaults["preload"], - tooltip="Preload image/s?" - ) - ] - - def load(self, context, name, namespace, options): - stretch = options.get("stretch", self.defaults["stretch"]) - timestretch = options.get("timestretch", self.defaults["timestretch"]) - preload = options.get("preload", self.defaults["preload"]) - - load_options = [] - if stretch: - load_options.append("\"STRETCH\"") - if timestretch: - load_options.append("\"TIMESTRETCH\"") - if preload: - load_options.append("\"PRELOAD\"") - - load_options_str = "" - for load_option in load_options: - load_options_str += (load_option + " ") - - # Prepare layer name - folder_name = context["folder"]["name"] - product_name = context["product"]["name"] - layer_name = self.get_unique_layer_name(folder_name, product_name) - - path = self.filepath_from_context(context) - - # Fill import script with filename and layer name - # - filename mus not contain backwards slashes - george_script = self.import_script.format( - path.replace("\\", "/"), - layer_name, - load_options_str - ) - - execute_george_through_file(george_script) - - loaded_layer = None - layers = get_layers_data() - for layer in layers: - if layer["name"] == layer_name: - loaded_layer = layer - break - - if loaded_layer is None: - raise AssertionError( - "Loading probably failed during execution of george script." - ) - - layer_names = [loaded_layer["name"]] - namespace = namespace or layer_name - return containerise( - name=name, - namespace=namespace, - members=layer_names, - context=context, - loader=self.__class__.__name__ - ) - - def _remove_layers(self, layer_names=None, layer_ids=None, layers=None): - if not layer_names and not layer_ids: - self.log.warning("Got empty layer names list.") - return - - if layers is None: - layers = get_layers_data() - - available_ids = set(layer["layer_id"] for layer in layers) - - if layer_ids is None: - # Backwards compatibility (layer ids were stored instead of names) - layer_names_are_ids = True - for layer_name in layer_names: - if ( - not isinstance(layer_name, int) - and not layer_name.isnumeric() - ): - layer_names_are_ids = False - break - - if layer_names_are_ids: - layer_ids = layer_names - - layer_ids_to_remove = [] - if layer_ids is not None: - for layer_id in layer_ids: - if layer_id in available_ids: - layer_ids_to_remove.append(layer_id) - - else: - layers_by_name = collections.defaultdict(list) - for layer in layers: - layers_by_name[layer["name"]].append(layer) - - for layer_name in layer_names: - layers = layers_by_name[layer_name] - if len(layers) == 1: - layer_ids_to_remove.append(layers[0]["layer_id"]) - - if not layer_ids_to_remove: - self.log.warning("No layers to delete.") - return - - george_script_lines = [] - for layer_id in layer_ids_to_remove: - line = "tv_layerkill {}".format(layer_id) - george_script_lines.append(line) - george_script = "\n".join(george_script_lines) - execute_george_through_file(george_script) - - def _remove_container(self, container): - if not container: - return - representation = container["representation"] - members = self.get_members_from_container(container) - host = registered_host() - current_containers = host.get_containers() - pop_idx = None - for idx, cur_con in enumerate(current_containers): - cur_members = self.get_members_from_container(cur_con) - if ( - cur_members == members - and cur_con["representation"] == representation - ): - pop_idx = idx - break - - if pop_idx is None: - self.log.warning( - "Didn't find container in workfile containers. {}".format( - container - ) - ) - return - - current_containers.pop(pop_idx) - write_workfile_metadata( - SECTION_NAME_CONTAINERS, current_containers - ) - - def remove(self, container): - members = self.get_members_from_container(container) - self.log.warning("Layers to delete {}".format(members)) - self._remove_layers(members) - self._remove_container(container) - - def switch(self, container, representation): - self.update(container, representation) - - def update(self, container, context): - """Replace container with different version. - - New layers are loaded as first step. Then is tried to change data in - new layers with data from old layers. When that is done old layers are - removed. - """ - - # Create new containers first - # Get layer ids from previous container - old_layer_names = self.get_members_from_container(container) - - # Backwards compatibility (layer ids were stored instead of names) - old_layers_are_ids = True - for name in old_layer_names: - if isinstance(name, int) or name.isnumeric(): - continue - old_layers_are_ids = False - break - - old_layers = [] - layers = get_layers_data() - previous_layer_ids = set(layer["layer_id"] for layer in layers) - if old_layers_are_ids: - for layer in layers: - if layer["layer_id"] in old_layer_names: - old_layers.append(layer) - else: - layers_by_name = collections.defaultdict(list) - for layer in layers: - layers_by_name[layer["name"]].append(layer) - - for layer_name in old_layer_names: - layers = layers_by_name[layer_name] - if len(layers) == 1: - old_layers.append(layers[0]) - - # Prepare few data - new_start_position = None - new_group_id = None - layer_ids_to_remove = set() - for layer in old_layers: - layer_ids_to_remove.add(layer["layer_id"]) - position = layer["position"] - group_id = layer["group_id"] - if new_start_position is None: - new_start_position = position - elif new_start_position > position: - new_start_position = position - - if new_group_id is None: - new_group_id = group_id - elif new_group_id < 0: - continue - elif new_group_id != group_id: - new_group_id = -1 - - # Remove old container - self._remove_container(container) - # Remove old layers - self._remove_layers(layer_ids=layer_ids_to_remove) - - name = container["name"] - namespace = container["namespace"] - new_container = self.load(context, name, namespace, {}) - new_layer_names = self.get_members_from_container(new_container) - - layers = get_layers_data() - - new_layers = [] - for layer in layers: - if layer["layer_id"] in previous_layer_ids: - continue - if layer["name"] in new_layer_names: - new_layers.append(layer) - - george_script_lines = [] - # Group new layers to same group as previous container layers had - # - all old layers must be under same group - if new_group_id is not None and new_group_id > 0: - for layer in new_layers: - line = "tv_layercolor \"set\" {} {}".format( - layer["layer_id"], new_group_id - ) - george_script_lines.append(line) - - # Rename new layer to have same name - # - only if both old and new have one layer - if len(old_layers) == 1 and len(new_layers) == 1: - layer_name = old_layers[0]["name"] - george_script_lines.append( - "tv_layerrename {} \"{}\"".format( - new_layers[0]["layer_id"], layer_name - ) - ) - - # Change position of new layer - # - this must be done before remove old layers - if len(new_layers) == 1 and new_start_position is not None: - new_layer = new_layers[0] - george_script_lines.extend([ - "tv_layerset {}".format(new_layer["layer_id"]), - "tv_layermove {}".format(new_start_position) - ]) - - # Execute george scripts if there are any - if george_script_lines: - george_script = "\n".join(george_script_lines) - execute_george_through_file(george_script) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py deleted file mode 100644 index 086afba079..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py +++ /dev/null @@ -1,123 +0,0 @@ -import os -import tempfile -from ayon_tvpaint.api import plugin -from ayon_tvpaint.api.lib import ( - execute_george_through_file, -) - - -class ImportSound(plugin.Loader): - """Load sound to TVPaint. - - Sound layers does not have ids but only position index so we can't - reference them as we can't say which is which input. - - We might do that (in future) by input path. Which may be identifier if - we'll allow only one loaded instance of the representation as an audio. - - This plugin does not work for all version of TVPaint. Known working - version is TVPaint 11.0.10 . - - It is allowed to load video files as sound but it does not check if video - file contain any audio. - """ - - product_types = {"audio", "review", "plate"} - representations = {"*"} - - label = "Import Sound" - order = 1 - icon = "image" - color = "white" - - import_script_lines = ( - "sound_path = '\"'\"{}\"'\"'", - "output_path = \"{}\"", - # Try to get sound clip info to check if we are in TVPaint that can - # load sound - "tv_clipcurrentid", - "clip_id = result", - "tv_soundclipinfo clip_id 0", - "IF CMP(result,\"\")==1", - ( - "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"'" - " 'success|'" - ), - "EXIT", - "END", - - "tv_soundclipnew sound_path", - "line = 'success|'result", - "tv_writetextfile \"strict\" \"append\" '\"'output_path'\"' line" - ) - - def load(self, context, name, namespace, options): - # Create temp file for output - output_file = tempfile.NamedTemporaryFile( - mode="w", prefix="ayon_tvp_", suffix=".txt", delete=False - ) - output_file.close() - output_filepath = output_file.name.replace("\\", "/") - - # Prepare george script - path = self.filepath_from_context(context).replace("\\", "/") - import_script = "\n".join(self.import_script_lines) - george_script = import_script.format( - path, - output_filepath - ) - self.log.info("*** George script:\n{}\n***".format(george_script)) - # Execute geoge script - execute_george_through_file(george_script) - - # Read output file - lines = [] - with open(output_filepath, "r") as file_stream: - for line in file_stream: - line = line.rstrip() - if line: - lines.append(line) - - # Clean up temp file - os.remove(output_filepath) - - output = {} - for line in lines: - key, value = line.split("|") - output[key] = value - - success = output.get("success") - # Successfully loaded sound - if success == "0": - return - - if success == "": - raise ValueError( - "Your TVPaint version does not support loading of" - " sound through George script. Please use manual load." - ) - - if success is None: - raise ValueError( - "Unknown error happened during load." - " Please report and try to use manual load." - ) - - # Possible errors by TVPaint documentation - # https://www.tvpaint.com/doc/tvpaint-animation-11/george-commands#tv_soundclipnew - if success == "-1": - raise ValueError( - "BUG: George command did not get enough arguments." - ) - - if success == "-2": - # Who know what does that mean? - raise ValueError("No current clip without mixer.") - - if success == "-3": - raise ValueError("TVPaint couldn't read the file.") - - if success == "-4": - raise ValueError("TVPaint couldn't add the track.") - - raise ValueError("BUG: Unknown success value {}.".format(success)) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_workfile.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_workfile.py deleted file mode 100644 index 045e22f188..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_workfile.py +++ /dev/null @@ -1,115 +0,0 @@ -import os - -from ayon_core.pipeline import ( - registered_host, - get_current_context, - Anatomy, -) -from ayon_core.pipeline.workfile import ( - get_workfile_template_key_from_context, - get_last_workfile_with_version, -) -from ayon_core.pipeline.template_data import get_template_data_with_names -from ayon_tvpaint.api import plugin -from ayon_tvpaint.api.lib import ( - execute_george_through_file, -) -from ayon_tvpaint.api.pipeline import ( - get_current_workfile_context, -) -from ayon_core.pipeline.version_start import get_versioning_start - - -class LoadWorkfile(plugin.Loader): - """Load workfile.""" - - product_types = {"workfile"} - representations = {"tvpp"} - - label = "Load Workfile" - - def load(self, context, name, namespace, options): - # Load context of current workfile as first thing - # - which context and extension has - filepath = self.filepath_from_context(context) - filepath = filepath.replace("\\", "/") - - if not os.path.exists(filepath): - raise FileExistsError( - "The loaded file does not exist. Try downloading it first." - ) - - host = registered_host() - current_file = host.get_current_workfile() - work_context = get_current_workfile_context() - - george_script = "tv_LoadProject '\"'\"{}\"'\"'".format( - filepath - ) - execute_george_through_file(george_script) - - # Save workfile. - host_name = "tvpaint" - if "project_name" in work_context: - project_name = context["project_name"] - folder_path = context["folder_path"] - task_name = context["task_name"] - else: - project_name = work_context.get("project") - folder_path = work_context.get("asset") - task_name = work_context.get("task") - - # Far cases when there is workfile without work_context - if not folder_path: - context = get_current_context() - project_name = context["project_name"] - folder_path = context["folder_path"] - task_name = context["task_name"] - - template_key = get_workfile_template_key_from_context( - project_name, - folder_path, - task_name, - host_name, - ) - anatomy = Anatomy(project_name) - - data = get_template_data_with_names( - project_name, folder_path, task_name, host_name - ) - data["root"] = anatomy.roots - - work_template = anatomy.get_template_item("work", template_key) - - # Define saving file extension - extensions = host.get_workfile_extensions() - if current_file: - # Match the extension of current file - _, extension = os.path.splitext(current_file) - else: - # Fall back to the first extension supported for this host. - extension = extensions[0] - - data["ext"] = extension.lstrip(".") - - work_root = work_template["directory"].format_strict(data) - version = get_last_workfile_with_version( - work_root, work_template["file"].template, data, extensions - )[1] - - if version is None: - version = get_versioning_start( - project_name, - "tvpaint", - task_name=task_name, - task_type=data["task"]["type"], - product_type="workfile" - ) - else: - version += 1 - - data["version"] = version - - filename = work_template["file"].format_strict(data) - path = os.path.join(work_root, filename) - host.save_workfile(path) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_instance_frames.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_instance_frames.py deleted file mode 100644 index a9e69166d7..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_instance_frames.py +++ /dev/null @@ -1,38 +0,0 @@ -import pyblish.api - - -class CollectOutputFrameRange(pyblish.api.InstancePlugin): - """Collect frame start/end from context. - - When instances are collected context does not contain `frameStart` and - `frameEnd` keys yet. They are collected in global plugin - `CollectContextEntities`. - """ - - label = "Collect output frame range" - order = pyblish.api.CollectorOrder + 0.4999 - hosts = ["tvpaint"] - families = ["review", "render"] - - settings_category = "tvpaint" - - def process(self, instance): - folder_entity = instance.data.get("folderEntity") - if not folder_entity: - return - - context = instance.context - - frame_start = folder_entity["attrib"]["frameStart"] - fps = folder_entity["attrib"]["fps"] - frame_end = frame_start + ( - context.data["sceneMarkOut"] - context.data["sceneMarkIn"] - ) - instance.data["fps"] = fps - instance.data["frameStart"] = frame_start - instance.data["frameEnd"] = frame_end - self.log.info( - "Set frames {}-{} on instance {} ".format( - frame_start, frame_end, instance.data["productName"] - ) - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_render_instances.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_render_instances.py deleted file mode 100644 index 00af624700..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_render_instances.py +++ /dev/null @@ -1,115 +0,0 @@ -import copy -import pyblish.api -from ayon_core.lib import prepare_template_data - - -class CollectRenderInstances(pyblish.api.InstancePlugin): - label = "Collect Render Instances" - order = pyblish.api.CollectorOrder - 0.4 - hosts = ["tvpaint"] - families = ["render", "review"] - - settings_category = "tvpaint" - ignore_render_pass_transparency = False - - def process(self, instance): - context = instance.context - creator_identifier = instance.data["creator_identifier"] - if creator_identifier == "render.layer": - self._collect_data_for_render_layer(instance) - - elif creator_identifier == "render.pass": - self._collect_data_for_render_pass(instance) - - elif creator_identifier == "render.scene": - self._collect_data_for_render_scene(instance) - - else: - if creator_identifier == "scene.review": - self._collect_data_for_review(instance) - return - - product_name = instance.data["productName"] - instance.data["name"] = product_name - instance.data["label"] = "{} [{}-{}]".format( - product_name, - context.data["sceneMarkIn"] + 1, - context.data["sceneMarkOut"] + 1 - ) - - def _collect_data_for_render_layer(self, instance): - instance.data["families"].append("renderLayer") - creator_attributes = instance.data["creator_attributes"] - group_id = creator_attributes["group_id"] - if creator_attributes["mark_for_review"]: - instance.data["families"].append("review") - - layers_data = instance.context.data["layersData"] - instance.data["layers"] = [ - copy.deepcopy(layer) - for layer in layers_data - if layer["group_id"] == group_id - ] - - def _collect_data_for_render_pass(self, instance): - instance.data["families"].append("renderPass") - - layer_names = set(instance.data["layer_names"]) - layers_data = instance.context.data["layersData"] - - creator_attributes = instance.data["creator_attributes"] - if creator_attributes["mark_for_review"]: - instance.data["families"].append("review") - - instance.data["layers"] = [ - copy.deepcopy(layer) - for layer in layers_data - if layer["name"] in layer_names - ] - instance.data["ignoreLayersTransparency"] = ( - self.ignore_render_pass_transparency - ) - - render_layer_data = None - render_layer_id = creator_attributes["render_layer_instance_id"] - for in_data in instance.context.data["workfileInstances"]: - if ( - in_data.get("creator_identifier") == "render.layer" - and in_data["instance_id"] == render_layer_id - ): - render_layer_data = in_data - break - - instance.data["renderLayerData"] = copy.deepcopy(render_layer_data) - # Invalid state - if render_layer_data is None: - return - render_layer_name = render_layer_data["variant"] - product_name = instance.data["productName"] - instance.data["productName"] = product_name.format( - **prepare_template_data({"renderlayer": render_layer_name}) - ) - - def _collect_data_for_render_scene(self, instance): - instance.data["families"].append("renderScene") - - creator_attributes = instance.data["creator_attributes"] - if creator_attributes["mark_for_review"]: - instance.data["families"].append("review") - - instance.data["layers"] = copy.deepcopy( - instance.context.data["layersData"] - ) - - render_pass_name = ( - instance.data["creator_attributes"]["render_pass_name"] - ) - product_name = instance.data["productName"] - instance.data["productName"] = product_name.format( - **prepare_template_data({"renderpass": render_pass_name}) - ) - - def _collect_data_for_review(self, instance): - instance.data["layers"] = copy.deepcopy( - instance.context.data["layersData"] - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile.py deleted file mode 100644 index 27de086a46..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile.py +++ /dev/null @@ -1,34 +0,0 @@ -import os -import json -import pyblish.api - - -class CollectWorkfile(pyblish.api.InstancePlugin): - label = "Collect Workfile" - order = pyblish.api.CollectorOrder - 0.4 - hosts = ["tvpaint"] - families = ["workfile"] - - settings_category = "tvpaint" - - def process(self, instance): - context = instance.context - current_file = context.data["currentFile"] - - self.log.info( - "Workfile path used for workfile product: {}".format(current_file) - ) - - dirpath, filename = os.path.split(current_file) - basename, ext = os.path.splitext(filename) - - instance.data["representations"].append({ - "name": ext.lstrip("."), - "ext": ext.lstrip("."), - "files": filename, - "stagingDir": dirpath - }) - - self.log.info("Collected workfile instance: {}".format( - json.dumps(instance.data, indent=4) - )) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py deleted file mode 100644 index a34a718ff5..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py +++ /dev/null @@ -1,221 +0,0 @@ -import os -import json -import tempfile - -import pyblish.api - -from ayon_tvpaint.api.lib import ( - execute_george, - execute_george_through_file, - get_layers_data, - get_groups_data, -) -from ayon_tvpaint.api.pipeline import ( - SECTION_NAME_CONTEXT, - SECTION_NAME_INSTANCES, - SECTION_NAME_CONTAINERS, - - get_workfile_metadata_string, - write_workfile_metadata, - get_current_workfile_context, - list_instances, -) - - -class ResetTVPaintWorkfileMetadata(pyblish.api.Action): - """Fix invalid metadata in workfile.""" - label = "Reset invalid workfile metadata" - on = "failed" - - def process(self, context, plugin): - metadata_keys = { - SECTION_NAME_CONTEXT: {}, - SECTION_NAME_INSTANCES: [], - SECTION_NAME_CONTAINERS: [] - } - for metadata_key, default in metadata_keys.items(): - json_string = get_workfile_metadata_string(metadata_key) - if not json_string: - continue - - try: - return json.loads(json_string) - except Exception: - self.log.warning( - ( - "Couldn't parse metadata from key \"{}\"." - " Will reset to default value \"{}\"." - " Loaded value was: {}" - ).format(metadata_key, default, json_string), - exc_info=True - ) - write_workfile_metadata(metadata_key, default) - - -class CollectWorkfileData(pyblish.api.ContextPlugin): - label = "Collect Workfile Data" - order = pyblish.api.CollectorOrder - 0.45 - hosts = ["tvpaint"] - actions = [ResetTVPaintWorkfileMetadata] - - settings_category = "tvpaint" - - def process(self, context): - current_project_id = execute_george("tv_projectcurrentid") - execute_george("tv_projectselect {}".format(current_project_id)) - - # Collect and store current context to have reference - current_context = { - "project_name": context.data["projectName"], - "folder_path": context.data["folderPath"], - "task_name": context.data["task"] - } - self.log.debug("Current context is: {}".format(current_context)) - - # Collect context from workfile metadata - self.log.info("Collecting workfile context") - - workfile_context = get_current_workfile_context() - if "project" in workfile_context: - workfile_context = { - "project_name": workfile_context.get("project"), - "folder_path": workfile_context.get("asset"), - "task_name": workfile_context.get("task"), - } - # Store workfile context to pyblish context - context.data["workfile_context"] = workfile_context - if workfile_context: - # Change current context with context from workfile - key_map = ( - ("AYON_FOLDER_PATH", "folder_path"), - ("AYON_TASK_NAME", "task_name") - ) - for env_key, key in key_map: - os.environ[env_key] = workfile_context[key] - self.log.info("Context changed to: {}".format(workfile_context)) - - folder_path = workfile_context["folder_path"] - task_name = workfile_context["task_name"] - - else: - folder_path = current_context["folder_path"] - task_name = current_context["task_name"] - # Handle older workfiles or workfiles without metadata - self.log.warning(( - "Workfile does not contain information about context." - " Using current Session context." - )) - - # Store context folder path - context.data["folderPath"] = folder_path - context.data["task"] = task_name - self.log.info( - "Context is set to Folder: \"{}\" and Task: \"{}\"".format( - folder_path, task_name - ) - ) - - # Collect instances - self.log.info("Collecting instance data from workfile") - instance_data = list_instances() - context.data["workfileInstances"] = instance_data - self.log.debug( - "Instance data:\"{}".format(json.dumps(instance_data, indent=4)) - ) - - # Collect information about layers - self.log.info("Collecting layers data from workfile") - layers_data = get_layers_data() - layers_by_name = {} - for layer in layers_data: - layer_name = layer["name"] - if layer_name not in layers_by_name: - layers_by_name[layer_name] = [] - layers_by_name[layer_name].append(layer) - context.data["layersData"] = layers_data - context.data["layersByName"] = layers_by_name - - self.log.debug( - "Layers data:\"{}".format(json.dumps(layers_data, indent=4)) - ) - - # Collect information about groups - self.log.info("Collecting groups data from workfile") - group_data = get_groups_data() - context.data["groupsData"] = group_data - self.log.debug( - "Group data:\"{}".format(json.dumps(group_data, indent=4)) - ) - - self.log.info("Collecting scene data from workfile") - workfile_info_parts = execute_george("tv_projectinfo").split(" ") - - # Project frame start - not used - workfile_info_parts.pop(-1) - field_order = workfile_info_parts.pop(-1) - frame_rate = float(workfile_info_parts.pop(-1)) - pixel_apsect = float(workfile_info_parts.pop(-1)) - height = int(workfile_info_parts.pop(-1)) - width = int(workfile_info_parts.pop(-1)) - workfile_path = " ".join(workfile_info_parts).replace("\"", "") - - # Marks return as "{frame - 1} {state} ", example "0 set". - result = execute_george("tv_markin") - mark_in_frame, mark_in_state, _ = result.split(" ") - - result = execute_george("tv_markout") - mark_out_frame, mark_out_state, _ = result.split(" ") - - scene_data = { - "currentFile": workfile_path, - "sceneWidth": width, - "sceneHeight": height, - "scenePixelAspect": pixel_apsect, - "sceneFps": frame_rate, - "sceneFieldOrder": field_order, - "sceneMarkIn": int(mark_in_frame), - "sceneMarkInState": mark_in_state == "set", - "sceneMarkOut": int(mark_out_frame), - "sceneMarkOutState": mark_out_state == "set", - "sceneStartFrame": int(execute_george("tv_startframe")), - "sceneBgColor": self._get_bg_color() - } - self.log.debug( - "Scene data: {}".format(json.dumps(scene_data, indent=4)) - ) - context.data.update(scene_data) - - def _get_bg_color(self): - """Background color set on scene. - - Is important for review exporting where scene bg color is used as - background. - """ - output_file = tempfile.NamedTemporaryFile( - mode="w", prefix="a_tvp_", suffix=".txt", delete=False - ) - output_file.close() - output_filepath = output_file.name.replace("\\", "/") - george_script_lines = [ - # Variable containing full path to output file - "output_path = \"{}\"".format(output_filepath), - "tv_background", - "bg_color = result", - # Write data to output file - ( - "tv_writetextfile" - " \"strict\" \"append\" '\"'output_path'\"' bg_color" - ) - ] - - george_script = "\n".join(george_script_lines) - execute_george_through_file(george_script) - - with open(output_filepath, "r") as stream: - data = stream.read() - - os.remove(output_filepath) - data = data.strip() - if not data: - return None - return data.split(" ") diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_convert_to_exr.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_convert_to_exr.py deleted file mode 100644 index 020ebc1a89..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_convert_to_exr.py +++ /dev/null @@ -1,103 +0,0 @@ -"""Plugin converting png files from ExtractSequence into exrs. - -Requires: - ExtractSequence - source of PNG - ExtractReview - review was already created so we can convert to any exr -""" -import os -import json - -import pyblish.api -from ayon_core.lib import ( - get_oiio_tool_args, - ToolNotFoundError, - run_subprocess, -) -from ayon_core.pipeline import KnownPublishError - - -class ExtractConvertToEXR(pyblish.api.InstancePlugin): - # Offset to get after ExtractSequence plugin. - order = pyblish.api.ExtractorOrder + 0.1 - label = "Extract Sequence EXR" - hosts = ["tvpaint"] - families = ["render"] - - settings_category = "tvpaint" - - enabled = False - - # Replace source PNG files or just add - replace_pngs = True - # EXR compression - exr_compression = "ZIP" - - def process(self, instance): - repres = instance.data.get("representations") - if not repres: - return - - try: - oiio_args = get_oiio_tool_args("oiiotool") - except ToolNotFoundError: - # Raise an exception when oiiotool is not available - # - this can currently happen on MacOS machines - raise KnownPublishError( - "OpenImageIO tool is not available on this machine." - ) - - new_repres = [] - for repre in repres: - if repre["name"] != "png": - continue - - self.log.info( - "Processing representation: {}".format( - json.dumps(repre, sort_keys=True, indent=4) - ) - ) - - src_filepaths = set() - new_filenames = [] - for src_filename in repre["files"]: - dst_filename = os.path.splitext(src_filename)[0] + ".exr" - new_filenames.append(dst_filename) - - src_filepath = os.path.join(repre["stagingDir"], src_filename) - dst_filepath = os.path.join(repre["stagingDir"], dst_filename) - - src_filepaths.add(src_filepath) - - args = oiio_args + [ - src_filepath, - "--compression", self.exr_compression, - # TODO how to define color conversion? - "--colorconvert", "sRGB", "linear", - "-o", dst_filepath - ] - run_subprocess(args) - - new_repres.append( - { - "name": "exr", - "ext": "exr", - "files": new_filenames, - "stagingDir": repre["stagingDir"], - "tags": list(repre["tags"]) - } - ) - - if self.replace_pngs: - instance.data["representations"].remove(repre) - - for filepath in src_filepaths: - instance.context.data["cleanupFullPaths"].append(filepath) - - instance.data["representations"].extend(new_repres) - self.log.info( - "Representations: {}".format( - json.dumps( - instance.data["representations"], sort_keys=True, indent=4 - ) - ) - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py deleted file mode 100644 index 86c20c6528..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py +++ /dev/null @@ -1,449 +0,0 @@ -import os -import copy -import tempfile - -from PIL import Image - -import pyblish.api - -from ayon_core.pipeline.publish import ( - KnownPublishError, - get_publish_instance_families, -) -from ayon_tvpaint.api.lib import ( - execute_george, - execute_george_through_file, - get_layers_pre_post_behavior, - get_layers_exposure_frames, -) -from ayon_tvpaint.lib import ( - calculate_layers_extraction_data, - get_frame_filename_template, - fill_reference_frames, - composite_rendered_layers, - rename_filepaths_by_frame_start, -) - - -class ExtractSequence(pyblish.api.InstancePlugin): - label = "Extract Sequence" - order = pyblish.api.ExtractorOrder - hosts = ["tvpaint"] - families = ["review", "render"] - - settings_category = "tvpaint" - - # Modifiable with settings - review_bg = [255, 255, 255, 1.0] - - def process(self, instance): - self.log.info( - "* Processing instance \"{}\"".format(instance.data["label"]) - ) - - # Get all layers and filter out not visible - layers = instance.data["layers"] - filtered_layers = [ - layer - for layer in layers - if layer["visible"] - ] - layer_names = [str(layer["name"]) for layer in filtered_layers] - if not layer_names: - self.log.info( - "None of the layers from the instance" - " are visible. Extraction skipped." - ) - return - - joined_layer_names = ", ".join( - ["\"{}\"".format(name) for name in layer_names] - ) - self.log.debug( - "Instance has {} layers with names: {}".format( - len(layer_names), joined_layer_names - ) - ) - - ignore_layers_transparency = instance.data.get( - "ignoreLayersTransparency", False - ) - - mark_in = instance.context.data["sceneMarkIn"] - mark_out = instance.context.data["sceneMarkOut"] - - # Change scene Start Frame to 0 to prevent frame index issues - # - issue is that TVPaint versions deal with frame indexes in a - # different way when Start Frame is not `0` - # NOTE It will be set back after rendering - scene_start_frame = instance.context.data["sceneStartFrame"] - execute_george("tv_startframe 0") - - # Frame start/end may be stored as float - frame_start = int(instance.data["frameStart"]) - - # Handles are not stored per instance but on Context - handle_start = instance.context.data["handleStart"] - - scene_bg_color = instance.context.data["sceneBgColor"] - - # Prepare output frames - output_frame_start = frame_start - handle_start - - # Change output frame start to 0 if handles cause it's negative number - if output_frame_start < 0: - self.log.warning(( - "Frame start with handles has negative value." - " Changed to \"0\". Frames start: {}, Handle Start: {}" - ).format(frame_start, handle_start)) - output_frame_start = 0 - - # Calculate frame end - output_frame_end = output_frame_start + (mark_out - mark_in) - - # Save to staging dir - output_dir = instance.data.get("stagingDir") - if not output_dir: - # Create temp folder if staging dir is not set - output_dir = ( - tempfile.mkdtemp(prefix="tvpaint_render_") - ).replace("\\", "/") - instance.data["stagingDir"] = output_dir - - self.log.debug( - "Files will be rendered to folder: {}".format(output_dir) - ) - - if instance.data["productType"] == "review": - result = self.render_review( - output_dir, mark_in, mark_out, scene_bg_color - ) - else: - # Render output - result = self.render( - output_dir, - mark_in, - mark_out, - filtered_layers, - ignore_layers_transparency - ) - - output_filepaths_by_frame_idx, thumbnail_fullpath = result - - # Change scene frame Start back to previous value - execute_george("tv_startframe {}".format(scene_start_frame)) - - # Sequence of one frame - if not output_filepaths_by_frame_idx: - self.log.warning("Extractor did not create any output.") - return - - repre_files = self._rename_output_files( - output_filepaths_by_frame_idx, - mark_in, - mark_out, - output_frame_start - ) - - # Fill tags and new families from project settings - instance_families = get_publish_instance_families(instance) - tags = [] - if "review" in instance_families: - tags.append("review") - - # Sequence of one frame - single_file = len(repre_files) == 1 - if single_file: - repre_files = repre_files[0] - - # Extension is hardcoded - # - changing extension would require change code - new_repre = { - "name": "png", - "ext": "png", - "files": repre_files, - "stagingDir": output_dir, - "tags": tags - } - - if not single_file: - new_repre["frameStart"] = output_frame_start - new_repre["frameEnd"] = output_frame_end - - self.log.debug("Creating new representation: {}".format(new_repre)) - - instance.data["representations"].append(new_repre) - - if not thumbnail_fullpath: - return - - thumbnail_ext = os.path.splitext( - thumbnail_fullpath - )[1].replace(".", "") - # Create thumbnail representation - thumbnail_repre = { - "name": "thumbnail", - "ext": thumbnail_ext, - "outputName": "thumb", - "files": os.path.basename(thumbnail_fullpath), - "stagingDir": output_dir, - "tags": ["thumbnail"] - } - instance.data["representations"].append(thumbnail_repre) - - def _rename_output_files( - self, filepaths_by_frame, mark_in, mark_out, output_frame_start - ): - new_filepaths_by_frame = rename_filepaths_by_frame_start( - filepaths_by_frame, mark_in, mark_out, output_frame_start - ) - - repre_filenames = [] - for filepath in new_filepaths_by_frame.values(): - repre_filenames.append(os.path.basename(filepath)) - - if mark_in < output_frame_start: - repre_filenames = list(reversed(repre_filenames)) - - return repre_filenames - - def render_review( - self, output_dir, mark_in, mark_out, scene_bg_color - ): - """ Export images from TVPaint using `tv_savesequence` command. - - Args: - output_dir (str): Directory where files will be stored. - mark_in (int): Starting frame index from which export will begin. - mark_out (int): On which frame index export will end. - scene_bg_color (list): Bg color set in scene. Result of george - script command `tv_background`. - - Returns: - tuple: With 2 items first is list of filenames second is path to - thumbnail. - """ - filename_template = get_frame_filename_template(mark_out) - - self.log.debug("Preparing data for rendering.") - first_frame_filepath = os.path.join( - output_dir, - filename_template.format(frame=mark_in) - ) - - bg_color = self._get_review_bg_color() - - george_script_lines = [ - # Change bg color to color from settings - "tv_background \"color\" {} {} {}".format(*bg_color), - "tv_SaveMode \"PNG\"", - "export_path = \"{}\"".format( - first_frame_filepath.replace("\\", "/") - ), - "tv_savesequence '\"'export_path'\"' {} {}".format( - mark_in, mark_out - ) - ] - if scene_bg_color: - # Change bg color back to previous scene bg color - _scene_bg_color = copy.deepcopy(scene_bg_color) - bg_type = _scene_bg_color.pop(0) - orig_color_command = [ - "tv_background", - "\"{}\"".format(bg_type) - ] - orig_color_command.extend(_scene_bg_color) - - george_script_lines.append(" ".join(orig_color_command)) - - execute_george_through_file("\n".join(george_script_lines)) - - first_frame_filepath = None - output_filepaths_by_frame_idx = {} - for frame_idx in range(mark_in, mark_out + 1): - filename = filename_template.format(frame=frame_idx) - filepath = os.path.join(output_dir, filename) - - output_filepaths_by_frame_idx[frame_idx] = filepath - - if not os.path.exists(filepath): - raise KnownPublishError( - "Output was not rendered. File was not found {}".format( - filepath - ) - ) - - if first_frame_filepath is None: - first_frame_filepath = filepath - - thumbnail_filepath = None - if first_frame_filepath and os.path.exists(first_frame_filepath): - thumbnail_filepath = os.path.join(output_dir, "thumbnail.jpg") - source_img = Image.open(first_frame_filepath) - if source_img.mode.lower() != "rgb": - source_img = source_img.convert("RGB") - source_img.save(thumbnail_filepath) - - return output_filepaths_by_frame_idx, thumbnail_filepath - - def render( - self, output_dir, mark_in, mark_out, layers, ignore_layer_opacity - ): - """ Export images from TVPaint. - - Args: - output_dir (str): Directory where files will be stored. - mark_in (int): Starting frame index from which export will begin. - mark_out (int): On which frame index export will end. - layers (list): List of layers to be exported. - ignore_layer_opacity (bool): Layer's opacity will be ignored. - - Returns: - tuple: With 2 items first is list of filenames second is path to - thumbnail. - """ - self.log.debug("Preparing data for rendering.") - - # Map layers by position - layers_by_position = {} - layers_by_id = {} - layer_ids = [] - for layer in layers: - layer_id = layer["layer_id"] - position = layer["position"] - layers_by_position[position] = layer - layers_by_id[layer_id] = layer - - layer_ids.append(layer_id) - - # Sort layer positions in reverse order - sorted_positions = list(reversed(sorted(layers_by_position.keys()))) - if not sorted_positions: - return [], None - - self.log.debug("Collecting pre/post behavior of individual layers.") - behavior_by_layer_id = get_layers_pre_post_behavior(layer_ids) - exposure_frames_by_layer_id = get_layers_exposure_frames( - layer_ids, layers - ) - extraction_data_by_layer_id = calculate_layers_extraction_data( - layers, - exposure_frames_by_layer_id, - behavior_by_layer_id, - mark_in, - mark_out - ) - # Render layers - filepaths_by_layer_id = {} - for layer_id, render_data in extraction_data_by_layer_id.items(): - layer = layers_by_id[layer_id] - filepaths_by_layer_id[layer_id] = self._render_layer( - render_data, layer, output_dir, ignore_layer_opacity - ) - - # Prepare final filepaths where compositing should store result - output_filepaths_by_frame = {} - thumbnail_src_filepath = None - finale_template = get_frame_filename_template(mark_out) - for frame_idx in range(mark_in, mark_out + 1): - filename = finale_template.format(frame=frame_idx) - - filepath = os.path.join(output_dir, filename) - output_filepaths_by_frame[frame_idx] = filepath - - if thumbnail_src_filepath is None: - thumbnail_src_filepath = filepath - - self.log.info("Started compositing of layer frames.") - composite_rendered_layers( - layers, filepaths_by_layer_id, - mark_in, mark_out, - output_filepaths_by_frame - ) - - self.log.info("Compositing finished") - thumbnail_filepath = None - if thumbnail_src_filepath and os.path.exists(thumbnail_src_filepath): - source_img = Image.open(thumbnail_src_filepath) - thumbnail_filepath = os.path.join(output_dir, "thumbnail.jpg") - # Composite background only on rgba images - # - just making sure - if source_img.mode.lower() == "rgba": - bg_color = self._get_review_bg_color() - self.log.debug("Adding thumbnail background color {}.".format( - " ".join([str(val) for val in bg_color]) - )) - bg_image = Image.new("RGBA", source_img.size, bg_color) - thumbnail_obj = Image.alpha_composite(bg_image, source_img) - thumbnail_obj.convert("RGB").save(thumbnail_filepath) - - else: - self.log.info(( - "Source for thumbnail has mode \"{}\" (Expected: RGBA)." - " Can't use thubmanail background color." - ).format(source_img.mode)) - source_img.save(thumbnail_filepath) - - return output_filepaths_by_frame, thumbnail_filepath - - def _get_review_bg_color(self): - red = green = blue = 255 - if self.review_bg: - if len(self.review_bg) == 4: - red, green, blue, _ = self.review_bg - elif len(self.review_bg) == 3: - red, green, blue = self.review_bg - return (red, green, blue) - - def _render_layer( - self, render_data, layer, output_dir, ignore_layer_opacity - ): - frame_references = render_data["frame_references"] - filenames_by_frame_index = render_data["filenames_by_frame_index"] - - layer_id = layer["layer_id"] - george_script_lines = [ - "tv_layerset {}".format(layer_id), - "tv_SaveMode \"PNG\"" - ] - # Set density to 100 and store previous opacity - if ignore_layer_opacity: - george_script_lines.extend([ - "tv_layerdensity 100", - "orig_opacity = result", - ]) - - filepaths_by_frame = {} - frames_to_render = [] - for frame_idx, ref_idx in frame_references.items(): - # None reference is skipped because does not have source - if ref_idx is None: - filepaths_by_frame[frame_idx] = None - continue - filename = filenames_by_frame_index[frame_idx] - dst_path = "/".join([output_dir, filename]) - filepaths_by_frame[frame_idx] = dst_path - if frame_idx != ref_idx: - continue - - frames_to_render.append(str(frame_idx)) - # Go to frame - george_script_lines.append("tv_layerImage {}".format(frame_idx)) - # Store image to output - george_script_lines.append("tv_saveimage \"{}\"".format(dst_path)) - - # Set density back to origin opacity - if ignore_layer_opacity: - george_script_lines.append("tv_layerdensity orig_opacity") - - self.log.debug("Rendering Exposure frames {} of layer {} ({})".format( - ",".join(frames_to_render), layer_id, layer["name"] - )) - # Let TVPaint render layer's image - execute_george_through_file("\n".join(george_script_lines)) - - # Fill frames between `frame_start_index` and `frame_end_index` - self.log.debug("Filling frames not rendered frames.") - fill_reference_frames(frame_references, filepaths_by_frame) - - return filepaths_by_frame diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_asset_name.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_asset_name.xml deleted file mode 100644 index bba0104c54..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_asset_name.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - -Product context -## Invalid product context - -Context of the given product doesn't match your current scene. - -### How to repair? - -Yout can fix this with "Repair" button on the right. This will use '{expected_folder}' folder path and overwrite '{found_folder}' folder path in scene metadata. - -After that restart publishing with Reload button. - - -### How could this happen? - -The product was created in different scene with different context -or the scene file was copy pasted from different context. - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_duplicated_layer_names.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_duplicated_layer_names.xml deleted file mode 100644 index 23c899cfc6..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_duplicated_layer_names.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - -Layer names -## Duplicated layer names - -Can't determine which layers should be published because there are duplicated layer names in the scene. - -### Duplicated layer names - -{layer_names} - -*Check layer names for all products in list on left side.* - -### How to repair? - -Hide/rename/remove layers that should not be published. - -If all of them should be published then you have duplicated product names in the scene. In that case you have to recrete them and use different variant name. - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_layers_visibility.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_layers_visibility.xml deleted file mode 100644 index 5013f38eca..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_layers_visibility.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - -Layers visibility -## All layers are not visible - -Layers visibility was changed during publishing which caused that all layers for product "{instance_name}" are hidden. - -### Layer names for **{instance_name}** - -{layer_names} - -*Check layer names for all products in the list on the left side.* - -### How to repair? - -Reset publishing and do not change visibility of layers after hitting publish button. - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_marks.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_marks.xml deleted file mode 100644 index f0e01ebaa7..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_marks.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - -Frame range -## Invalid render frame range - -Scene frame range which will be rendered is defined by MarkIn and MarkOut. Expected frame range is {expected_frame_range} and current frame range is {current_frame_range}. - -It is also required that MarkIn and MarkOut are enabled in the scene. Their color is highlighted on timeline when are enabled. - -- MarkIn is {mark_in_enable_state} -- MarkOut is {mark_out_enable_state} - -### How to repair? - -Yout can fix this with "Repair" button on the right. That will change MarkOut to {expected_mark_out}. - -Or you can manually modify MarkIn and MarkOut in the scene timeline. - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_missing_layer_names.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_missing_layer_names.xml deleted file mode 100644 index 000fe84844..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_missing_layer_names.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - -Missing layers -## Missing layers for render pass - -Render pass product "{instance_name}" has stored layer names that belong to it's rendering scope but layers were not found in scene. - -### Missing layer names - -{layer_names} - -### How to repair? - -Find layers that belong to product {instance_name} and rename them back to expected layer names or remove the product and create new with right layers. - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_layer_group.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_layer_group.xml deleted file mode 100644 index a95387356f..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_layer_group.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - -Overused Color group -## One Color group is used by multiple Render Layers - -Single color group used by multiple Render Layers would cause clashes of rendered TVPaint layers. The same layers would be used for output files of both groups. - -### Missing layer names - -{groups_information} - -### How to repair? - -Refresh, go to 'Publish' tab and go through Render Layers and change their groups to not clash each other. If you reach limit of TVPaint color groups there is nothing you can do about it to fix the issue. - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_pass_group.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_pass_group.xml deleted file mode 100644 index df7bdf36e5..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_pass_group.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - -Render pass group -## Invalid group of Render Pass layers - -Layers of Render Pass {instance_name} belong to Render Group which is defined by TVPaint color group {expected_group}. But the layers are not in the group. - -### How to repair? - -Change the color group to {expected_group} on layers {layer_names}. - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_scene_settings.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_scene_settings.xml deleted file mode 100644 index f741c71456..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_scene_settings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - -Scene settings -## Invalid scene settings - -Scene settings do not match to expected values. - -**FPS** -- Expected value: {expected_fps} -- Current value: {current_fps} - -**Resolution** -- Expected value: {expected_width}x{expected_height} -- Current value: {current_width}x{current_height} - -**Pixel ratio** -- Expected value: {expected_pixel_ratio} -- Current value: {current_pixel_ratio} - -### How to repair? - -FPS and Pixel ratio can be modified in scene setting. Wrong resolution can be fixed with changing resolution of scene but due to TVPaint limitations it is possible that you will need to create new scene. - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_start_frame.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_start_frame.xml deleted file mode 100644 index 9052abf66c..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_start_frame.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - -First frame -## MarkIn is not set to 0 - -MarkIn in your scene must start from 0 fram index but MarkIn is set to {current_start_frame}. - -### How to repair? - -You can modify MarkIn manually or hit the "Repair" button on the right which will change MarkIn to 0 (does not change MarkOut). - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_metadata.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_metadata.xml deleted file mode 100644 index 0fc03c2948..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_metadata.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - -Missing metadata -## Your scene miss context metadata - -Your scene does not contain metadata about {missing_metadata}. - -### How to repair? - -Resave the scene using Workfiles tool or hit the "Repair" button on the right. - - -### How this could happen? - -You're using scene file that was not created using Workfiles tool. - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_project_name.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_project_name.xml deleted file mode 100644 index bb57e93bf2..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_project_name.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - -Project name -## Your scene is from different project - -It is not possible to publish into project "{workfile_project_name}" when TVPaint was opened with project "{env_project_name}" in context. - -### How to repair? - -If the workfile belongs to project "{env_project_name}" then use Workfiles tool to resave it. - -Otherwise close TVPaint and launch it again from project you want to publish in. - - -### How this could happen? - -You've opened workfile from different project. You've opened TVPaint on a task from "{env_project_name}" then you've opened TVPaint again on task from "{workfile_project_name}" without closing the TVPaint. Because TVPaint can run only once the project didn't change. - -### Why it is important? -Because project may affect how TVPaint works or change publishing behavior it is dangerous to allow change project context in many ways. For example publishing will not run as expected. - - - diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/increment_workfile_version.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/increment_workfile_version.py deleted file mode 100644 index 601d276b97..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/increment_workfile_version.py +++ /dev/null @@ -1,25 +0,0 @@ -import pyblish.api - -from ayon_core.lib import version_up -from ayon_core.pipeline import registered_host - - -class IncrementWorkfileVersion(pyblish.api.ContextPlugin): - """Increment current workfile version.""" - - order = pyblish.api.IntegratorOrder + 1 - label = "Increment Workfile Version" - optional = True - hosts = ["tvpaint"] - - settings_category = "tvpaint" - - def process(self, context): - - assert all(result["success"] for result in context.data["results"]), ( - "Publishing not successful so version is not increased.") - - host = registered_host() - path = context.data["currentFile"] - host.save_workfile(version_up(path)) - self.log.info('Incrementing workfile version') diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py deleted file mode 100644 index 8763c005dc..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py +++ /dev/null @@ -1,79 +0,0 @@ -import pyblish.api -from ayon_core.pipeline import ( - PublishXmlValidationError, - OptionalPyblishPluginMixin, -) -from ayon_tvpaint.api.pipeline import ( - list_instances, - write_instances, -) - - -class FixFolderPaths(pyblish.api.Action): - """Repair the folder paths. - - Change instanace metadata in the workfile. - """ - - label = "Repair" - icon = "wrench" - on = "failed" - - def process(self, context, plugin): - context_folder_path = context.data["folderPath"] - old_instance_items = list_instances() - new_instance_items = [] - for instance_item in old_instance_items: - instance_folder_path = instance_item.get("folderPath") - if ( - instance_folder_path - and instance_folder_path != context_folder_path - ): - instance_item["folderPath"] = context_folder_path - new_instance_items.append(instance_item) - write_instances(new_instance_items) - - -class ValidateAssetName( - OptionalPyblishPluginMixin, - pyblish.api.ContextPlugin -): - """Validate folder path present on instance. - - Folder path on instance should be the same as context's. - """ - - label = "Validate Folder Paths" - order = pyblish.api.ValidatorOrder - hosts = ["tvpaint"] - actions = [FixFolderPaths] - - settings_category = "tvpaint" - - def process(self, context): - if not self.is_active(context.data): - return - context_folder_path = context.data["folderPath"] - for instance in context: - folder_path = instance.data.get("folderPath") - if folder_path and folder_path == context_folder_path: - continue - - instance_label = ( - instance.data.get("label") or instance.data["name"] - ) - - raise PublishXmlValidationError( - self, - ( - "Different folder path on instance then context's." - " Instance \"{}\" has folder path: \"{}\"" - " Context folder path is: \"{}\"" - ).format( - instance_label, folder_path, context_folder_path - ), - formatting_data={ - "expected_folder": context_folder_path, - "found_folder": folder_path - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_duplicated_layer_names.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_duplicated_layer_names.py deleted file mode 100644 index be4dc0f123..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_duplicated_layer_names.py +++ /dev/null @@ -1,55 +0,0 @@ -import pyblish.api -from ayon_core.pipeline import PublishXmlValidationError - - -class ValidateLayersGroup(pyblish.api.InstancePlugin): - """Validate layer names for publishing are unique for whole workfile.""" - - label = "Validate Duplicated Layers Names" - order = pyblish.api.ValidatorOrder - families = ["renderPass"] - - settings_category = "tvpaint" - - def process(self, instance): - # Prepare layers - layers_by_name = instance.context.data["layersByName"] - - # Layers ids of an instance - layer_names = instance.data["layer_names"] - - # Check if all layers from render pass are in right group - duplicated_layer_names = [] - for layer_name in layer_names: - layers = layers_by_name.get(layer_name) - # It is not job of this validator to handle missing layers - if layers is None: - continue - if len(layers) > 1: - duplicated_layer_names.append(layer_name) - - # Everything is OK and skip exception - if not duplicated_layer_names: - return - - layers_msg = ", ".join([ - "\"{}\"".format(layer_name) - for layer_name in duplicated_layer_names - ]) - detail_lines = [ - "- {}".format(layer_name) - for layer_name in set(duplicated_layer_names) - ] - raise PublishXmlValidationError( - self, - ( - "Layers have duplicated names for instance {}." - # Description what's wrong - " There are layers with same name and one of them is marked" - " for publishing so it is not possible to know which should" - " be published. Please look for layers with names: {}" - ).format(instance.data["label"], layers_msg), - formatting_data={ - "layer_names": "
".join(detail_lines) - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_layers_visibility.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_layers_visibility.py deleted file mode 100644 index f58b8a6973..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_layers_visibility.py +++ /dev/null @@ -1,43 +0,0 @@ -import pyblish.api -from ayon_core.pipeline import PublishXmlValidationError - - -# TODO @iLLiCiTiT add repair action to disable instances? -class ValidateLayersVisiblity(pyblish.api.InstancePlugin): - """Validate existence of renderPass layers.""" - - label = "Validate Layers Visibility" - order = pyblish.api.ValidatorOrder - families = ["review", "render"] - - settings_category = "tvpaint" - - def process(self, instance): - layers = instance.data.get("layers") - # Instance have empty layers - # - it is not job of this validator to check that - if not layers: - return - layer_names = set() - for layer in layers: - layer_names.add(layer["name"]) - if layer["visible"]: - return - - instance_label = ( - instance.data.get("label") or instance.data["name"] - ) - - raise PublishXmlValidationError( - self, - "All layers of instance \"{}\" are not visible.".format( - instance_label - ), - formatting_data={ - "instance_name": instance_label, - "layer_names": "
".join([ - "- {}".format(layer_name) - for layer_name in layer_names - ]) - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py deleted file mode 100644 index 0911beb4e8..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py +++ /dev/null @@ -1,118 +0,0 @@ -import json - -import pyblish.api -from ayon_core.pipeline import ( - PublishXmlValidationError, - OptionalPyblishPluginMixin, -) -from ayon_tvpaint.api.lib import execute_george - - -class ValidateMarksRepair(pyblish.api.Action): - """Repair the marks.""" - - label = "Repair" - icon = "wrench" - on = "failed" - - def process(self, context, plugin): - expected_data = ValidateMarks.get_expected_data(context) - - execute_george( - "tv_markin {} set".format(expected_data["markIn"]) - ) - execute_george( - "tv_markout {} set".format(expected_data["markOut"]) - ) - - -class ValidateMarks( - OptionalPyblishPluginMixin, - pyblish.api.ContextPlugin -): - """Validate mark in and out are enabled and it's duration. - - Mark In/Out does not have to match frameStart and frameEnd but duration is - important. - """ - - label = "Validate Mark In/Out" - order = pyblish.api.ValidatorOrder - optional = True - actions = [ValidateMarksRepair] - - settings_category = "tvpaint" - - @staticmethod - def get_expected_data(context): - scene_mark_in = context.data["sceneMarkIn"] - - # Data collected in `CollectContextEntities` - frame_end = context.data["frameEnd"] - frame_start = context.data["frameStart"] - handle_start = context.data["handleStart"] - handle_end = context.data["handleEnd"] - - # Calculate expected Mark out (Mark In + duration - 1) - expected_mark_out = ( - scene_mark_in - + (frame_end - frame_start) - + handle_start + handle_end - ) - return { - "markIn": scene_mark_in, - "markInState": True, - "markOut": expected_mark_out, - "markOutState": True - } - - def process(self, context): - if not self.is_active(context.data): - return - - current_data = { - "markIn": context.data["sceneMarkIn"], - "markInState": context.data["sceneMarkInState"], - "markOut": context.data["sceneMarkOut"], - "markOutState": context.data["sceneMarkOutState"] - } - expected_data = self.get_expected_data(context) - invalid = {} - for k in current_data.keys(): - if current_data[k] != expected_data[k]: - invalid[k] = { - "current": current_data[k], - "expected": expected_data[k] - } - - # Validation ends - if not invalid: - return - - current_frame_range = ( - (current_data["markOut"] - current_data["markIn"]) + 1 - ) - expected_frame_range = ( - (expected_data["markOut"] - expected_data["markIn"]) + 1 - ) - mark_in_enable_state = "disabled" - if current_data["markInState"]: - mark_in_enable_state = "enabled" - - mark_out_enable_state = "disabled" - if current_data["markOutState"]: - mark_out_enable_state = "enabled" - - raise PublishXmlValidationError( - self, - "Marks does not match database:\n{}".format( - json.dumps(invalid, sort_keys=True, indent=4) - ), - formatting_data={ - "current_frame_range": str(current_frame_range), - "expected_frame_range": str(expected_frame_range), - "mark_in_enable_state": mark_in_enable_state, - "mark_out_enable_state": mark_out_enable_state, - "expected_mark_out": expected_data["markOut"] - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_missing_layer_names.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_missing_layer_names.py deleted file mode 100644 index f340d3c10d..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_missing_layer_names.py +++ /dev/null @@ -1,57 +0,0 @@ -import pyblish.api -from ayon_core.pipeline import PublishXmlValidationError - - -class ValidateMissingLayers(pyblish.api.InstancePlugin): - """Validate existence of renderPass layers.""" - - label = "Validate Missing Layers Names" - order = pyblish.api.ValidatorOrder - families = ["renderPass"] - - settings_category = "tvpaint" - - def process(self, instance): - # Prepare layers - layers_by_name = instance.context.data["layersByName"] - - # Layers ids of an instance - layer_names = instance.data["layer_names"] - - # Check if all layers from render pass are in right group - missing_layer_names = [] - for layer_name in layer_names: - layers = layers_by_name.get(layer_name) - if not layers: - missing_layer_names.append(layer_name) - - # Everything is OK and skip exception - if not missing_layer_names: - return - - layers_msg = ", ".join([ - "\"{}\"".format(layer_name) - for layer_name in missing_layer_names - ]) - instance_label = ( - instance.data.get("label") or instance.data["name"] - ) - description_layer_names = "
".join([ - "- {}".format(layer_name) - for layer_name in missing_layer_names - ]) - - # Raise an error - raise PublishXmlValidationError( - self, - ( - "Layers were not found by name for instance \"{}\"." - # Description what's wrong - " Layer names marked for publishing are not available" - " in layers list. Missing layer names: {}" - ).format(instance.data["label"], layers_msg), - formatting_data={ - "instance_name": instance_label, - "layer_names": description_layer_names - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_layer_group.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_layer_group.py deleted file mode 100644 index b20ea3cac6..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_layer_group.py +++ /dev/null @@ -1,78 +0,0 @@ -import collections -import pyblish.api -from ayon_core.pipeline import PublishXmlValidationError - - -class ValidateRenderLayerGroups(pyblish.api.ContextPlugin): - """Validate group ids of renderLayer products. - - Validate that there are not 2 render layers using the same group. - """ - - label = "Validate Render Layers Group" - order = pyblish.api.ValidatorOrder + 0.1 - - settings_category = "tvpaint" - - def process(self, context): - # Prepare layers - render_layers_by_group_id = collections.defaultdict(list) - for instance in context: - families = instance.data.get("families") - if not families or "renderLayer" not in families: - continue - - group_id = instance.data["creator_attributes"]["group_id"] - render_layers_by_group_id[group_id].append(instance) - - duplicated_instances = [] - for group_id, instances in render_layers_by_group_id.items(): - if len(instances) > 1: - duplicated_instances.append((group_id, instances)) - - if not duplicated_instances: - return - - # Exception message preparations - groups_data = context.data["groupsData"] - groups_by_id = { - group["group_id"]: group - for group in groups_data - } - - per_group_msgs = [] - groups_information_lines = [] - for group_id, instances in duplicated_instances: - group = groups_by_id[group_id] - group_label = "Group \"{}\" ({})".format( - group["name"], - group["group_id"], - ) - line_join_product_names = "\n".join([ - f" - {instance['productName']}" - for instance in instances - ]) - joined_product_names = ", ".join([ - f"\"{instance['productName']}\"" - for instance in instances - ]) - per_group_msgs.append( - "{} < {} >".format(group_label, joined_product_names) - ) - groups_information_lines.append( - "{}\n{}".format( - group_label, line_join_product_names - ) - ) - - # Raise an error - raise PublishXmlValidationError( - self, - ( - "More than one Render Layer is using the same TVPaint" - " group color. {}" - ).format(" | ".join(per_group_msgs)), - formatting_data={ - "groups_information": "\n".join(groups_information_lines) - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_pass_group.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_pass_group.py deleted file mode 100644 index 3d00fd031f..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_pass_group.py +++ /dev/null @@ -1,91 +0,0 @@ -import collections -import pyblish.api -from ayon_core.pipeline import PublishXmlValidationError - - -class ValidateLayersGroup(pyblish.api.InstancePlugin): - """Validate group ids of renderPass layers. - - Validates that all layers are in same group as they were during creation. - """ - - label = "Validate Layers Group" - order = pyblish.api.ValidatorOrder + 0.1 - families = ["renderPass"] - - settings_category = "tvpaint" - - def process(self, instance): - # Prepare layers - layers_data = instance.context.data["layersData"] - layers_by_name = { - layer["name"]: layer - for layer in layers_data - } - - # Expected group id for instance layers - group_id = instance.data["group_id"] - # Layers ids of an instance - layer_names = instance.data["layer_names"] - # Check if all layers from render pass are in right group - invalid_layers_by_group_id = collections.defaultdict(list) - invalid_layer_names = set() - for layer_name in layer_names: - layer = layers_by_name.get(layer_name) - _group_id = layer["group_id"] - if _group_id != group_id: - invalid_layers_by_group_id[_group_id].append(layer) - invalid_layer_names.add(layer_name) - - # Everything is OK and skip exception - if not invalid_layers_by_group_id: - return - - # Exception message preparations - groups_data = instance.context.data["groupsData"] - groups_by_id = { - group["group_id"]: group - for group in groups_data - } - correct_group = groups_by_id[group_id] - - per_group_msgs = [] - for _group_id, layers in invalid_layers_by_group_id.items(): - _group = groups_by_id[_group_id] - layers_msgs = [] - for layer in layers: - layers_msgs.append( - "\"{}\" (id: {})".format(layer["name"], layer["layer_id"]) - ) - per_group_msgs.append( - "Group \"{}\" (id: {}) < {} >".format( - _group["name"], - _group["group_id"], - ", ".join(layers_msgs) - ) - ) - - # Raise an error - raise PublishXmlValidationError( - self, - ( - # Short message - "Layers in wrong group." - # Description what's wrong - " Layers from render pass \"{}\" must be in group {} (id: {})." - # Detailed message - " Layers in wrong group: {}" - ).format( - instance.data["label"], - correct_group["name"], - correct_group["group_id"], - " | ".join(per_group_msgs) - ), - formatting_data={ - "instance_name": ( - instance.data.get("label") or instance.data["name"] - ), - "expected_group": correct_group["name"], - "layer_names": ", ".join(invalid_layer_names) - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_scene_settings.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_scene_settings.py deleted file mode 100644 index 8bad5c43c8..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_scene_settings.py +++ /dev/null @@ -1,60 +0,0 @@ -import json - -import pyblish.api -from ayon_core.pipeline import ( - PublishXmlValidationError, - OptionalPyblishPluginMixin, -) - - -# TODO @iLliCiTiT add fix action for fps -class ValidateProjectSettings( - OptionalPyblishPluginMixin, - pyblish.api.ContextPlugin -): - """Validate scene settings against database.""" - - label = "Validate Scene Settings" - order = pyblish.api.ValidatorOrder - - settings_category = "tvpaint" - optional = True - - def process(self, context): - if not self.is_active(context.data): - return - - folder_attributes = context.data["folderEntity"]["attrib"] - scene_data = { - "fps": context.data.get("sceneFps"), - "resolutionWidth": context.data.get("sceneWidth"), - "resolutionHeight": context.data.get("sceneHeight"), - "pixelAspect": context.data.get("scenePixelAspect") - } - invalid = {} - for k in scene_data.keys(): - expected_value = folder_attributes[k] - if scene_data[k] != expected_value: - invalid[k] = { - "current": scene_data[k], "expected": expected_value - } - - if not invalid: - return - - raise PublishXmlValidationError( - self, - "Scene settings does not match database:\n{}".format( - json.dumps(invalid, sort_keys=True, indent=4) - ), - formatting_data={ - "expected_fps": folder_attributes["fps"], - "current_fps": scene_data["fps"], - "expected_width": folder_attributes["resolutionWidth"], - "expected_height": folder_attributes["resolutionHeight"], - "current_width": scene_data["resolutionWidth"], - "current_height": scene_data["resolutionHeight"], - "expected_pixel_ratio": folder_attributes["pixelAspect"], - "current_pixel_ratio": scene_data["pixelAspect"] - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py deleted file mode 100644 index 9669acf1b5..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py +++ /dev/null @@ -1,48 +0,0 @@ -import pyblish.api -from ayon_core.pipeline import ( - PublishXmlValidationError, - OptionalPyblishPluginMixin, -) -from ayon_tvpaint.api.lib import execute_george - - -class RepairStartFrame(pyblish.api.Action): - """Repair start frame.""" - - label = "Repair" - icon = "wrench" - on = "failed" - - def process(self, context, plugin): - execute_george("tv_startframe 0") - - -class ValidateStartFrame( - OptionalPyblishPluginMixin, - pyblish.api.ContextPlugin -): - """Validate start frame being at frame 0.""" - - label = "Validate Start Frame" - order = pyblish.api.ValidatorOrder - hosts = ["tvpaint"] - actions = [RepairStartFrame] - - settings_category = "tvpaint" - optional = True - - def process(self, context): - if not self.is_active(context.data): - return - - start_frame = execute_george("tv_startframe") - if start_frame == 0: - return - - raise PublishXmlValidationError( - self, - "Start frame has to be frame 0.", - formatting_data={ - "current_start_frame": start_frame - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_metadata.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_metadata.py deleted file mode 100644 index 34c02c78ed..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_metadata.py +++ /dev/null @@ -1,65 +0,0 @@ -import pyblish.api -from ayon_core.pipeline import ( - PublishXmlValidationError, - PublishValidationError, - registered_host, -) - - -class ValidateWorkfileMetadataRepair(pyblish.api.Action): - """Store current context into workfile metadata.""" - - label = "Use current context" - icon = "wrench" - on = "failed" - - def process(self, context, _plugin): - """Save current workfile which should trigger storing of metadata.""" - current_file = context.data["currentFile"] - host = registered_host() - # Save file should trigger - host.save_workfile(current_file) - - -class ValidateWorkfileMetadata(pyblish.api.ContextPlugin): - """Validate if wokrfile contain required metadata for publising.""" - - label = "Validate Workfile Metadata" - order = pyblish.api.ValidatorOrder - - families = ["workfile"] - - actions = [ValidateWorkfileMetadataRepair] - - settings_category = "tvpaint" - - required_keys = {"project_name", "folder_path", "task_name"} - - def process(self, context): - workfile_context = context.data["workfile_context"] - if not workfile_context: - raise PublishValidationError( - "Current workfile is missing whole metadata about context.", - "Missing context", - ( - "Current workfile is missing metadata about task." - " To fix this issue save the file using Workfiles tool." - ) - ) - - missing_keys = [] - for key in self.required_keys: - value = workfile_context.get(key) - if not value: - missing_keys.append(key) - - if missing_keys: - raise PublishXmlValidationError( - self, - "Current workfile is missing metadata about {}.".format( - ", ".join(missing_keys) - ), - formatting_data={ - "missing_metadata": ", ".join(missing_keys) - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_project_name.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_project_name.py deleted file mode 100644 index 868c7d44fc..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_project_name.py +++ /dev/null @@ -1,55 +0,0 @@ -import pyblish.api -from ayon_core.pipeline import PublishXmlValidationError - - -class ValidateWorkfileProjectName(pyblish.api.ContextPlugin): - """Validate project name stored in workfile metadata. - - It is not possible to publish from different project than is set in - environment variable "AYON_PROJECT_NAME". - """ - - label = "Validate Workfile Project Name" - order = pyblish.api.ValidatorOrder - - settings_category = "tvpaint" - - def process(self, context): - workfile_context = context.data.get("workfile_context") - # If workfile context is missing than project is matching to - # global project - if not workfile_context: - self.log.info( - "Workfile context (\"workfile_context\") is not filled." - ) - return - - workfile_project_name = workfile_context["project_name"] - env_project_name = context.data["projectName"] - if workfile_project_name == env_project_name: - self.log.info(( - "Both workfile project and environment project are same. {}" - ).format(env_project_name)) - return - - # Raise an error - raise PublishXmlValidationError( - self, - ( - # Short message - "Workfile from different Project ({})." - # Description what's wrong - " It is not possible to publish when TVPaint was launched in" - "context of different project. Current context project is" - " \"{}\". Launch TVPaint in context of project \"{}\"" - " and then publish." - ).format( - workfile_project_name, - env_project_name, - workfile_project_name, - ), - formatting_data={ - "workfile_project_name": workfile_project_name, - "expected_project_name": env_project_name - } - ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/resources/template.tvpp b/server_addon/tvpaint/client/ayon_tvpaint/resources/template.tvpp deleted file mode 100644 index 4bf05d35955c9e7c074a5af0f182d9f1b78bea8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62370 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 3.6 -- aiohttp -- aiohttp-json-rpc - -### Windows -- pywin32 - required only for plugin installation - -## Requirements - Plugin compilation -- TVPaint SDK - Ask for SDK on TVPaint support. -- Boost 1.72.0 - Boost is used across other plugins (Should be possible to use different version with CMakeLists modification) -- Websocket++/Websocketpp - Websocket library (https://github.com/zaphoyd/websocketpp) -- OpenSSL library - Required by Websocketpp -- jsonrpcpp - C++ library handling json-rpc 2.0 (https://github.com/badaix/jsonrpcpp) -- nlohmann/json - Required for jsonrpcpp (https://github.com/nlohmann/json) - -### jsonrpcpp -This library has `nlohmann/json` as it's part, but current `master` has old version which has bug and probably won't be possible to use library on windows without using last `nlohmann/json`. - -## TODO -- modify code and CMake to be able to compile on MacOS/Linux -- separate websocket logic from plugin logic -- hide buttons and show error message if server is closed diff --git a/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.cpp b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.cpp deleted file mode 100644 index c6c8ff244e..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.cpp +++ /dev/null @@ -1,807 +0,0 @@ -#ifdef _WIN32 -// Include before -#include -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include "plugdllx.h" - -#include - -#include -#include - -#include "json.hpp" -#include "jsonrpcpp.hpp" - - -// All functions not exported should be static. -// All global variables should be static. - -// mReq Identification of the requester. (=0 closed, !=0 requester ID) -static struct { - bool firstParams; - DWORD mReq; - void* mLocalFile; - PIFilter *current_filter; - // Id counter for client requests - int client_request_id; - // There are new menu items - bool newMenuItems; - // Menu item definitions received from connection - nlohmann::json menuItems; - // Menu items used in requester by their ID - nlohmann::json menuItemsById; - std::list menuItemsIds; - // Messages from server before processing. - // - messages can't be process at the moment of receive as client is running in thread - std::queue messages; - // Responses to requests mapped by request id - std::map responses; - -} Data = { - true, - 0, - nullptr, - nullptr, - 1, - false, - nlohmann::json::object(), - nlohmann::json::object() -}; - -// Json rpc 2.0 parser - for handling messages and callbacks -jsonrpcpp::Parser parser; -typedef websocketpp::client client; - - -class connection_metadata { -private: - websocketpp::connection_hdl m_hdl; - client *m_endpoint; - std::string m_status; -public: - typedef websocketpp::lib::shared_ptr ptr; - - connection_metadata(websocketpp::connection_hdl hdl, client *endpoint) - : m_hdl(hdl), m_status("Connecting") { - m_endpoint = endpoint; - } - - void on_open(client *c, websocketpp::connection_hdl hdl) { - m_status = "Open"; - } - - void on_fail(client *c, websocketpp::connection_hdl hdl) { - m_status = "Failed"; - } - - void on_close(client *c, websocketpp::connection_hdl hdl) { - m_status = "Closed"; - } - - void on_message(websocketpp::connection_hdl, client::message_ptr msg) { - std::string json_str; - if (msg->get_opcode() == websocketpp::frame::opcode::text) { - json_str = msg->get_payload(); - } else { - json_str = websocketpp::utility::to_hex(msg->get_payload()); - } - process_message(json_str); - } - - void process_message(std::string msg) { - std::cout << "--> " << msg << "\n"; - try { - jsonrpcpp::entity_ptr entity = parser.do_parse(msg); - if (!entity) { - // Return error code? - - } else if (entity->is_response()) { - jsonrpcpp::Response response = jsonrpcpp::Response(entity->to_json()); - Data.responses[response.id().int_id()] = response; - - } else if (entity->is_request() || entity->is_notification()) { - Data.messages.push(msg); - } - } - catch (const jsonrpcpp::RequestException &e) { - std::string message = e.to_json().dump(); - std::cout << "<-- " << e.to_json().dump() << "\n"; - send(message); - } - catch (const jsonrpcpp::ParseErrorException &e) { - std::string message = e.to_json().dump(); - std::cout << "<-- " << message << "\n"; - send(message); - } - catch (const jsonrpcpp::RpcException &e) { - std::cerr << "RpcException: " << e.what() << "\n"; - std::string message = jsonrpcpp::ParseErrorException(e.what()).to_json().dump(); - std::cout << "<-- " << message << "\n"; - send(message); - } - catch (const std::exception &e) { - std::cerr << "Exception: " << e.what() << "\n"; - } - } - - void send(std::string message) { - if (get_status() != "Open") { - return; - } - websocketpp::lib::error_code ec; - - m_endpoint->send(m_hdl, message, websocketpp::frame::opcode::text, ec); - if (ec) { - std::cout << "> Error sending message: " << ec.message() << std::endl; - return; - } - } - - void send_notification(jsonrpcpp::Notification *notification) { - send(notification->to_json().dump()); - } - - void send_response(jsonrpcpp::Response *response) { - send(response->to_json().dump()); - } - - void send_request(jsonrpcpp::Request *request) { - send(request->to_json().dump()); - } - - websocketpp::connection_hdl get_hdl() const { - return m_hdl; - } - - std::string get_status() const { - return m_status; - } -}; - - -class websocket_endpoint { -private: - client m_endpoint; - connection_metadata::ptr client_metadata; - websocketpp::lib::shared_ptr m_thread; - bool thread_is_running = false; - -public: - websocket_endpoint() { - m_endpoint.clear_access_channels(websocketpp::log::alevel::all); - m_endpoint.clear_error_channels(websocketpp::log::elevel::all); - } - - ~websocket_endpoint() { - close_connection(); - } - - void close_connection() { - m_endpoint.stop_perpetual(); - if (connected()) - { - // Close client - close(websocketpp::close::status::normal, ""); - } - if (thread_is_running) { - // Join thread - m_thread->join(); - thread_is_running = false; - } - } - - bool connected() - { - return (client_metadata && client_metadata->get_status() == "Open"); - } - int connect(std::string const &uri) { - if (client_metadata && client_metadata->get_status() == "Open") { - std::cout << "> Already connected" << std::endl; - return 0; - } - - m_endpoint.init_asio(); - m_endpoint.start_perpetual(); - - m_thread.reset(new websocketpp::lib::thread(&client::run, &m_endpoint)); - thread_is_running = true; - - websocketpp::lib::error_code ec; - - client::connection_ptr con = m_endpoint.get_connection(uri, ec); - - if (ec) { - std::cout << "> Connect initialization error: " << ec.message() << std::endl; - return -1; - } - - client_metadata = websocketpp::lib::make_shared(con->get_handle(), &m_endpoint); - - con->set_open_handler(websocketpp::lib::bind( - &connection_metadata::on_open, - client_metadata, - &m_endpoint, - websocketpp::lib::placeholders::_1 - )); - con->set_fail_handler(websocketpp::lib::bind( - &connection_metadata::on_fail, - client_metadata, - &m_endpoint, - websocketpp::lib::placeholders::_1 - )); - con->set_close_handler(websocketpp::lib::bind( - &connection_metadata::on_close, - client_metadata, - &m_endpoint, - websocketpp::lib::placeholders::_1 - )); - con->set_message_handler(websocketpp::lib::bind( - &connection_metadata::on_message, - client_metadata, - websocketpp::lib::placeholders::_1, - websocketpp::lib::placeholders::_2 - )); - - m_endpoint.connect(con); - - return 1; - } - - void close(websocketpp::close::status::value code, std::string reason) { - if (!client_metadata || client_metadata->get_status() != "Open") { - std::cout << "> Not connected yet" << std::endl; - return; - } - - websocketpp::lib::error_code ec; - - m_endpoint.close(client_metadata->get_hdl(), code, reason, ec); - if (ec) { - std::cout << "> Error initiating close: " << ec.message() << std::endl; - } - } - - void send(std::string message) { - if (!client_metadata || client_metadata->get_status() != "Open") { - std::cout << "> Not connected yet" << std::endl; - return; - } - - client_metadata->send(message); - } - - void send_notification(jsonrpcpp::Notification *notification) { - client_metadata->send_notification(notification); - } - - void send_response(jsonrpcpp::Response *response) { - client_metadata->send(response->to_json().dump()); - } - - void send_response(std::shared_ptr response) { - client_metadata->send(response->to_json().dump()); - } - - void send_request(jsonrpcpp::Request *request) { - client_metadata->send_request(request); - } -}; - -class Communicator { -private: - // URL to websocket server - std::string websocket_url; - // Should be avalon plugin available? - // - this may change during processing if websocketet url is not set or server is down - bool server_available; -public: - Communicator(std::string url); - Communicator(); - websocket_endpoint endpoint; - bool is_connected(); - bool is_usable(); - void connect(); - void process_requests(); - jsonrpcpp::Response call_method(std::string method_name, nlohmann::json params); - void call_notification(std::string method_name, nlohmann::json params); -}; - - -Communicator::Communicator(std::string url) { - // URL to websocket server - websocket_url = url; - // Should be avalon plugin available? - // - this may change during processing if websocketet url is not set or server is down - if (url == "") { - server_available = false; - } else { - server_available = true; - } -} - - -bool Communicator::is_connected(){ - return endpoint.connected(); -} - -bool Communicator::is_usable(){ - return server_available; -} - -void Communicator::connect() -{ - if (!server_available) { - return; - } - int con_result; - con_result = endpoint.connect(websocket_url); - if (con_result == -1) - { - server_available = false; - } else { - server_available = true; - } -} - -void Communicator::call_notification(std::string method_name, nlohmann::json params) { - if (!server_available || !is_connected()) {return;} - - jsonrpcpp::Notification notification = {method_name, params}; - endpoint.send_notification(¬ification); -} - -jsonrpcpp::Response Communicator::call_method(std::string method_name, nlohmann::json params) { - jsonrpcpp::Response response; - if (!server_available || !is_connected()) - { - return response; - } - int request_id = Data.client_request_id++; - jsonrpcpp::Request request = {request_id, method_name, params}; - endpoint.send_request(&request); - - bool found = false; - while (!found) { - std::map::iterator iter = Data.responses.find(request_id); - if (iter != Data.responses.end()) { - //element found == was found response - response = iter->second; - Data.responses.erase(request_id); - found = true; - } else { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - } - } - return response; -} - -void Communicator::process_requests() { - if (!server_available || !is_connected() || Data.messages.empty()) {return;} - - std::string msg = Data.messages.front(); - Data.messages.pop(); - std::cout << "Parsing: " << msg << std::endl; - // TODO: add try->except block - auto response = parser.parse(msg); - if (response->is_response()) { - endpoint.send_response(response); - } else { - jsonrpcpp::request_ptr request = std::dynamic_pointer_cast(response); - jsonrpcpp::Error error("Method \"" + request->method() + "\" not found", -32601); - jsonrpcpp::Response _response(request->id(), error); - endpoint.send_response(&_response); - } -} - -jsonrpcpp::response_ptr define_menu(const jsonrpcpp::Id &id, const jsonrpcpp::Parameter ¶ms) { - /* Define plugin menu. - - Menu is defined with json with "title" and "menu_items". - Each item in "menu_items" must have keys: - - "callback" - callback called with RPC when button is clicked - - "label" - label of button - - "help" - tooltip of button - ``` - { - "title": "< Menu title>", - "menu_items": [ - { - "callback": "workfiles_tool", - "label": "Workfiles", - "help": "Open workfiles tool" - }, - ... - ] - } - ``` - */ - Data.menuItems = params.to_json()[0]; - Data.newMenuItems = true; - - std::string output; - - return std::make_shared(id, output); -} - -jsonrpcpp::response_ptr execute_george(const jsonrpcpp::Id &id, const jsonrpcpp::Parameter ¶ms) { - const char *george_script; - char cmd_output[1024] = {0}; - char empty_char = {0}; - std::string std_george_script; - std::string output; - - nlohmann::json json_params = params.to_json(); - std_george_script = json_params[0]; - george_script = std_george_script.c_str(); - - // Result of `TVSendCmd` is int with length of output string - TVSendCmd(Data.current_filter, george_script, cmd_output); - - for (int i = 0; i < sizeof(cmd_output); i++) - { - if (cmd_output[i] == empty_char){ - break; - } - output += cmd_output[i]; - } - return std::make_shared(id, output); -} - -void register_callbacks(){ - parser.register_request_callback("define_menu", define_menu); - parser.register_request_callback("execute_george", execute_george); -} - -Communicator* communication = nullptr; - -//////////////////////////////////////////////////////////////////////////////////////// - -static char* GetLocalString( PIFilter* iFilter, int iNum, char* iDefault ) -{ - char* str; - - if( Data.mLocalFile == NULL ) - return iDefault; - - str = TVGetLocalString( iFilter, Data.mLocalFile, iNum ); - if( str == NULL || strlen( str ) == 0 ) - return iDefault; - - return str; -} - -/**************************************************************************************/ -// Localisation - -// numbers (like 10011) are IDs in the localized file. -// strings are the default values to use when the ID is not found -// in the localized file (or the localized file doesn't exist). -std::string label_from_evn() -{ - std::string _plugin_label = "OpenPype"; - if (std::getenv("AYON_MENU_LABEL") && std::getenv("AYON_MENU_LABEL") != "") - { - _plugin_label = std::getenv("AYON_MENU_LABEL"); - } - return _plugin_label; -} -std::string plugin_label = label_from_evn(); - -#define TXT_REQUESTER GetLocalString( iFilter, 100, "OpenPype Tools" ) - -#define TXT_REQUESTER_ERROR GetLocalString( iFilter, 30001, "Can't Open Requester !" ) - -//////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////// - -// The functions directly called by Aura through the plugin interface - - - -/**************************************************************************************/ -// "About" function. - - -void FAR PASCAL PI_About( PIFilter* iFilter ) -{ - char text[256]; - - sprintf( text, "%s %d,%d", iFilter->PIName, iFilter->PIVersion, iFilter->PIRevision ); - - // Just open a warning popup with the filter name and version. - // You can open a much nicer requester if you want. - TVWarning( iFilter, text ); -} - - -/**************************************************************************************/ -// Function called at Aura startup, when the filter is loaded. -// Should do as little as possible to keep Aura's startup time small. - -int FAR PASCAL PI_Open( PIFilter* iFilter ) -{ - Data.current_filter = iFilter; - char tmp[256]; - - strcpy( iFilter->PIName, plugin_label.c_str() ); - iFilter->PIVersion = 1; - iFilter->PIRevision = 0; - - // If this plugin was the one open at Aura shutdown, re-open it - TVReadUserString( iFilter, iFilter->PIName, "Open", tmp, "0", 255 ); - if( atoi( tmp ) ) - { - PI_Parameters( iFilter, NULL ); // NULL as iArg means "open the requester" - } - char *env_value = std::getenv("WEBSOCKET_URL"); - if (env_value != NULL) { - communication = new Communicator(env_value); - communication->connect(); - register_callbacks(); - } - return 1; // OK -} - - -/**************************************************************************************/ -// Aura shutdown: we make all the necessary cleanup - -void FAR PASCAL PI_Close( PIFilter* iFilter ) -{ - if( Data.mLocalFile ) - { - TVCloseLocalFile( iFilter, Data.mLocalFile ); - } - if( Data.mReq ) - { - TVCloseReq( iFilter, Data.mReq ); - } - if (communication != nullptr) { - communication->endpoint.close_connection(); - delete communication; - } -} - - -int newMenuItemsProcess(PIFilter* iFilter) { - // Menu items defined with `define_menu` should be propagated. - - // Change flag that there are new menu items (avoid infinite loop) - Data.newMenuItems = false; - // Skip if requester does not exists - if (Data.mReq == 0) { - return 0; - } - // Remove all previous menu items - for (int menu_id : Data.menuItemsIds) - { - TVRemoveButtonReq(iFilter, Data.mReq, menu_id); - } - // Clear caches - Data.menuItemsById.clear(); - Data.menuItemsIds.clear(); - - // We use a variable to contains the vertical position of the buttons. - // Each time we create a button, we add its size to this variable. - // This makes it very easy to add/remove/displace buttons in a requester. - int x_pos = 9; - int y_pos = 5; - - // Menu width - int menu_width = 185; - // Single menu item width - int btn_width = menu_width - 19; - // Single row height (btn height is 18) - int row_height = 20; - // Additional height to menu - int height_offset = 5; - - // This is a very simple requester, so we create it's content right here instead - // of waiting for the PICBREQ_OPEN message... - // Not recommended for more complex requesters. (see the other examples) - - const char *menu_title = TXT_REQUESTER; - if (Data.menuItems.contains("title")) - { - menu_title = Data.menuItems["title"].get()->c_str(); - } - // Sets the title of the requester. - TVSetReqTitle( iFilter, Data.mReq, menu_title ); - - // Resize menu - // First get current position and sizes (we only need the position) - int current_x = 0; - int current_y = 0; - int current_width = 0; - int current_height = 0; - TVInfoReq(iFilter, Data.mReq, ¤t_x, ¤t_y, ¤t_width, ¤t_height); - - // Calculate new height - int menu_height = (row_height * Data.menuItems["menu_items"].size()) + height_offset; - // Resize - TVResizeReq(iFilter, Data.mReq, current_x, current_y, menu_width, menu_height); - - // Add menu items - int item_counter = 1; - for (auto& item : Data.menuItems["menu_items"].items()) - { - int item_id = item_counter * 10; - item_counter ++; - std::string item_id_str = std::to_string(item_id); - nlohmann::json item_data = item.value(); - const char *item_label = item_data["label"].get()->c_str(); - const char *help_text = item_data["help"].get()->c_str(); - std::string item_callback = item_data["callback"].get(); - TVAddButtonReq(iFilter, Data.mReq, x_pos, y_pos, btn_width, 0, item_id, PIRBF_BUTTON_NORMAL|PIRBF_BUTTON_ACTION, item_label); - TVSetButtonInfoText( iFilter, Data.mReq, item_id, help_text ); - y_pos += row_height; - - Data.menuItemsById[std::to_string(item_id)] = item_callback; - Data.menuItemsIds.push_back(item_id); - } - - return 1; -} - -/**************************************************************************************/ -// we have something to do ! - -int FAR PASCAL PI_Parameters( PIFilter* iFilter, char* iArg ) -{ - if( !iArg ) - { - - // If the requester is not open, we open it. - if( Data.mReq == 0) - { - // Create empty requester because menu items are defined with - // `define_menu` callback - DWORD req = TVOpenFilterReqEx( - iFilter, - 185, - 20, - NULL, - NULL, - PIRF_STANDARD_REQ | PIRF_COLLAPSABLE_REQ, - FILTERREQ_NO_TBAR - ); - if( req == 0 ) - { - TVWarning( iFilter, TXT_REQUESTER_ERROR ); - return 0; - } - - Data.mReq = req; - - // This is a very simple requester, so we create it's content right here instead - // of waiting for the PICBREQ_OPEN message... - // Not recommended for more complex requesters. (see the other examples) - - // Sets the title of the requester. - TVSetReqTitle( iFilter, Data.mReq, TXT_REQUESTER ); - // Request to listen to ticks - TVGrabTicks(iFilter, req, PITICKS_FLAG_ON); - - if ( Data.firstParams == true ) { - Data.firstParams = false; - } else { - newMenuItemsProcess(iFilter); - } - } - else - { - // If it is already open, we just put it on front of all other requesters. - TVReqToFront( iFilter, Data.mReq ); - } - } - - return 1; -} - -/**************************************************************************************/ -// something happened that needs our attention. -// Global variable where current button up data are stored -std::string button_up_item_id_str; -int FAR PASCAL PI_Msg( PIFilter* iFilter, INTPTR iEvent, INTPTR iReq, INTPTR* iArgs ) -{ - Data.current_filter = iFilter; - // what did happen ? - switch( iEvent ) - { - // The user just 'clicked' on a normal button - case PICBREQ_BUTTON_UP: - button_up_item_id_str = std::to_string(iArgs[0]); - if (Data.menuItemsById.contains(button_up_item_id_str)) - { - std::string callback_name = Data.menuItemsById[button_up_item_id_str].get(); - communication->call_method(callback_name, nlohmann::json::array()); - } - TVExecute( iFilter ); - break; - - // The requester was just closed. - case PICBREQ_CLOSE: - // requester doesn't exists anymore - Data.mReq = 0; - - char tmp[256]; - // Save the requester state (opened or closed) - // iArgs[4] contains a flag which tells us if the requester - // has been closed by the user (flag=0) or by Aura's shutdown (flag=1). - // If it was by Aura's shutdown, that means this requester was the - // last one open, so we should reopen this one the next time Aura - // is started. Else we won't open it next time. - sprintf( tmp, "%d", (int)(iArgs[4]) ); - - // Save it in Aura's init file. - TVWriteUserString( iFilter, iFilter->PIName, "Open", tmp ); - break; - - case PICBREQ_TICKS: - if (Data.newMenuItems) - { - newMenuItemsProcess(iFilter); - } - if (communication != nullptr) { - communication->process_requests(); - } - } - - return 1; -} - - -/**************************************************************************************/ -// Start of the 'execution' of the filter for a new sequence. -// - iNumImages contains the total number of frames to be processed. -// Here you should allocate memory that is used for all frames, -// and precompute all the stuff that doesn't change from frame to frame. - - -int FAR PASCAL PI_SequenceStart( PIFilter* iFilter, int iNumImages ) -{ - // In this simple example we don't have anything to allocate/precompute. - - // 1 means 'continue', 0 means 'error, abort' (like 'not enough memory') - return 1; -} - - -// Here you should cleanup what you've done in PI_SequenceStart - -void FAR PASCAL PI_SequenceFinish( PIFilter* iFilter ) -{} - - -/**************************************************************************************/ -// This is called before each frame. -// Here you should allocate memory and precompute all the stuff you can. - -int FAR PASCAL PI_Start( PIFilter* iFilter, double iPos, double iSize ) -{ - return 1; -} - - -void FAR PASCAL PI_Finish( PIFilter* iFilter ) -{ - // nothing special to cleanup -} - - -/**************************************************************************************/ -// 'Execution' of the filter. -int FAR PASCAL PI_Work( PIFilter* iFilter ) -{ - return 1; -} diff --git a/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.def b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.def deleted file mode 100644 index 882f2b4719..0000000000 --- a/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.def +++ /dev/null @@ -1,10 +0,0 @@ -LIBRARY Avalonplugin -EXPORTS - PI_Msg - PI_Open - PI_About - PI_Parameters - PI_Start - PI_Work - PI_Finish - PI_Close diff --git a/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll deleted file mode 100644 index 9c6e969e24601f3686477dfe6d7127561f2a3d9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5811200 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 z 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≪^m|tZ(0>j${}VOuDEd2JucBW+Kf<1K;K<0= zg&-A)3jL=k862m|i?xt9NF?ta>E%cuE+@X%6Nu%cC-V!{gCU6Iwz8VLoR5Ayg%|nM z2TFe-RBUg7iZdZ|yH&Yu6QMS@1j!P`NIQfV=xR}J#rR;e`9*ZrXvn*)Fg8Oyn8)Pf#Wbihy-fMOMjf@My^-XiM92lH zC%MNe+!EkVamtf}ad%>t=CP?kdvon+(&xC2L z=lTiuG_54|eC;No0nx7Q;ii|bBi?K!S_B<#n!k|v({Q+HDvu|iL@F)eix@M5C#1aS zHZYd|6G$Xk2)Grd!1<;}(g{<D4@Ll05(kv6HYV!Sc8b!$y_I69VdbKx^(f_VRng!q@HMnU}Zj_`>8YF-H9cRwlQF+Aek_jCmDdpATu{IlJ3#QO&Y z5O0*nG$Nou9!HJTvCg8Z$>RWqSx0aybF?mxe|75exTZwNBew=;Ttxsb+Ct-m$Rn?( zw4nq3U=`VusQ%#V>BaEUpiEY%zzb29lNMj20$)Y0Q?OUK7Vl!4k{!b`IDlZ+(FhaS zE$|;w;mM^c&UMT~FSaI6S+>^XO zF@Cu^ezmd#AcBW^e53@oaTOoL4Fdj@b8igiDy{&uLj2FlCoT+j6+eD}I52^Z?_*U* znToD*xQv+g*fh+sS{ctn+gq^YtEPE}IE}w|3a3#yo#|IAy%rfbI?_=^FOiH?Nz!}F zFhtuRxA8;VY|au~q+BtOn3?@W)>;}9(ftCA)D80Ab96rT@h=BJd^!c1De#^LADRj8 z#N8tk)&wv=NOdp+zT@{$s389HTp^S~3mx_yCB;%Mq=I3=B-7p%V%tctE!sk}2=X0C zL{B4L;C_}^@F7-uToqmB@{r;4h1XkG9=>~r8#B<;|N^s!76n%Ai5vPNtVzJucfoq6C#u5Ty0`!9)z?l{aW2D;y$XhiqM4Uy4(H>&XaQ+_Cn zgzjl53F?wrbq=q|q@Cc0hYjp#o3Ze(;n`Xr${g}@4{PVVOCCnv;0cXN@> z-z%^Iq^XlkZoYw$e z8R6$LSS!azLinl23G7GkJUV|L2q65jr2&L*9ejI{~6ia^tmH+)ILkX;~{QW3DKL^jFqx<&BI)D3q7eIFbH~(VX zX`uU6djQ?1!{48vs=hyE3WjbMe}B6$BEs*Ejqo8s2>%^U@kc`VNCs=mb&(K$ED^z?Rks8A{NE# za&3^ln9EY{0xTGx=Wb|qGsv)AdXA)Smx|xI(-x|6!&D8xqSZh{tEii-7&;XYDW@n3 z^9;clsG?J%lwFH6fU-h-fsGENxyn7Nun7033>+J7ho4q4V%a+Ynd|DZ7yFJ>5Z0U2 zd-!)XRuG)GK8WPhMaN0bU3Q4%w0m*}!djC2h}h2oM$dg+ ztbiFGhEv@E6hhx=_58~T&^l|iS{u%!l|#gRZ`dx!ji$(w#&-F=DDCf0`9%`??hI^~ z(*Y*2^u-|(J{mc)d}ADL2Z(c@SG$Bh#5Z3kRg|G{)Ir|m-l+^71r#;?8?US zE6^KqlgcE|lGXU=lu_6ZHTynPzFSSY@aAbDl=+^@;Bt5;AP%d&*SDF=LhRb91{zD>HHY95my9hQ%}hX{5TI{y#k z+~GAF%%$te>AyHEd)&g9iBmQ$+eY4jYBrUV20g$ z9~uk4>6=S+zbR<|GagQEcez=`ENv8xGFpS2P!DYk$N&QqrH zbBpRcWh%wy5a$W@M%@1zj(*Qx5QcvLErcq%wPS>O`f4Mg`pphUsNS|VgnDT)5h~Xj zg-|1rg|6@GfS0WxA-E*zqM1R2T5B~D>Y3kkh)@szK0Ki&9MK82wueqAh=|q}}g{lI`GM@nj9>jWYpRP!NO1vCPk!aOQfwoNSTP_8Ttk{%X zp}co9qli`sp(XWX`wDDrreSaI6}+0E*v{hv6TGKg#p?x`^6EXjPioHKZNVz?>p>D% zInLI5saM%v?WrPH6}5wwntN7}JB%(@NM0||L&;$PP#14dRVGixo{BEPfG9rN_vKujo-0DbnrLK2g+ zuW2JD4Fn_?9qV&(crjUyBx!>_E2qv?eO92%5uj-LY%k1B+vFoJk&@PeGnbQvRcXCw z3-N#`WuWCBU2sSjm+G#%xX^iOa885ZoJ^H-GQ^VR`E;w`oQ>ydoWn+|W8x!Ngs99s zLh`Vz*vKUN0(BQ*@;DWdHky$%2$Hla{RXIPk_ql9q8G3Tw-*zGSixem!5xrQu!pM* z&x$-%<%D-UEe3ZmTcN8GP?}gtIh%*J?*n_p3HDIH9u{T~f{_z2i9hBJ7yLmyr~KfBtE}#cpE+^u@iiL*+AlRtV%<&?tXI<@wp-E?kQY0OIML#0ZRDg5@~IU z%bo{d0k_Bji?l=UN+a%{MeaVZ4(u4V=QEW{n{=js99wc^zXSQZ;pp*6{}6g;xjmtX z|NH#di1%HtBfbzvAc7G8grR*5#P^*?h<`Ub3gXvX7#{Keo)Lohb9mSoh<{~ryAgl* z+3<*e`x_nc{W=G<4f#)y0+u|3eV)-z#d@Wvr>Euj-2I>d$)aW;bOkAY2@Y%{{S~rJ zNyHN}Rcxbv{Pn`#l7S`m$QMx3u%Y(Wzz;q^W+nMD$ma)rHGaT}@V4@KDaMQ{pI$Ko zwpWoV3O8M*v&oA9JcvzPhV~IFmJ0biRz_^{#8qwBge;tp&qpr^&nEeyY_bRS-5~k=-Pbyse3uX^pW)~+G&O`Ck>s;C&mej!=MpS4 zRK<89<`RVXzoYIOTs-_MD-#INrKBw`pF%VxisojWoEentM zl&^HeKhUX-e3Cf~#E0dijc4id$)c;t=NtD2kTggYNV&pCQV02D=?lnbCqA(XGlcVx z6NP+oXOPcTPcf7p?@I{q0J6R=c~x=g{KtQ0jVe@ zuD|e#a62GA%vflga|RIO@1us2wgYklXL0E}Ag>M8yk10|Po@W0JIW3S5s(!7T~9FM zG~%ma5nrTS^`*+*MapwH0ZM^l^?$to!JMhvAFPn#s6RPrZ!eui8ZiZ|6ZQN&W&>Pv zuXMwX3KWCJ142FO`&#wfOy_|He9fZm5WxfT3h|hU4hh*uUp=zm0ew4U>tIk{-wvTJ zI!=G?vV+?plH!Nqm*hu;Wd(Z8j|06}R4{rLZ6UOUCIlMnXE=YV>P$^vhx)e?1+@M> zB!>NTaSkXS`3qf6>J{2wMJK8nzY9)zkQ(n1r9Ce^IWEQi?VI-yLr=P_jT$Ek2yPyC zc6c?umJ{WS{w?Qj#wgBSb5nrVBcEDg|MsEBn9oTG1=-K*zR=b9TexWmJRXA{KUhNO z5y^i3{cUD*;-iR&&m=|_3yUAH;0!|i6H(fSAbuE%`TJ8oy(9|a_w);o_>r72XF&Wp zJZucaO8^#dw`XC|V`+HAfAX1*_~Abr6--$FcA;6df4h`^PWh4L(ViT94eGE72Oxz*hPx;&6Hf%y#RLJKWso~jV8RwlD*klhQ zK8Bn1*!1?W3H!JI@-hLeq4N2c13H`ZIuRS6ov4U!z;axb&kv@B zApY;j@Mx!h`wT7vK>pvwQ4oJspYVu3mlL84h@Zy8#z1^3fQ>DmjQBer36J=p`*p-W zd%TT&TFBh%_Fqmq*iDyD;R&dD4{y8~KvHD?R+Z12FVf|6^3-7ewoYa!Y1j_Rr(J{0 z9#%d_V$7)Wd5$16c_~oisc=v0NvnA5h-Xq5mgMsUf(I&_oB_atA zT=`dKov?`05MQ3IBmT)7Ll8eRO8XGRpO{UEf9|3vh<~bAc*LJ73|W63UQJ-fK)lkf zz#Plxht=T`|Kuk+;(z)srhJYvg_qA!3~lgvOpU|U4a|W3JQKkWX7fyCASNKe&t+kU zpF2=M8BRVUtUuod>B6r+wfN%e=_Mklj-2A4kkXuFbux5^FqWYdRnoM41t}&HN(%3q zE0;oYl;MICd?ZDK>}e3;27H7FWAnWglYFl5zwwPF9@72zQg~rko@UW!TdY z3dbfoCXH5}sxo}UZV2SR5REC?T{XxM?Jh&G68#k@N5-;*k&>7h8o>O6z&(T2GZ-wb zj1_i#*|RR1MGX4W1#K9VJRD)Uf3SpS(9b7@Fz65-mL{}>HJMz92`wWRz;H}-ZF>Tk zUP3=DA_qOhJW6y5a;}eltn=vgM>QU0{|^2mlT_@J$VtnSbp9-$M_PPj;Tx<37)P)l zEd-@TzDjk`scyt$HAw6i*kM;Q63<5Tlu4RNQ3xWOGKhN35ZzH2BAbU)`$InxzEjy3 z*d;Bql1TjfflOkxlP4%ds>K_UuT|-ssXVBLPI(?cPWLKC4$YWN7xGDB)+^y+e1Uo~ z?wLgXpU)HIk9Pj63gMaKV{2#bLg*m-khL@W;T+NF9{$Pu`=c$t&f7IO0*)ZCC2VnGrc?xdfK)$qIw zy5AR-x+u}lTxmG})p{N@)#;!A;(;GYYbUz7C`suoF91dCYo7)npuqVU)3bO zuZ@d{aDQxs??7r=;C#$=OClruR55{7d2S?xf5Ff1!1L$`zb$}pGdt!2;mf)CCDgp5 z2$v8PJbnJYhzEZCoOYr+2X_xdP$x@=#N_X3u$lpMAFPUu?nh@3x>E?OuWGO6VL)V1?!HNBQ|Vcpe?yf4W#lw+}w0 zhVBAx{zc!@K)0iR0Np#Bat(R3rlz-2x#Tzel_>f8sZ@V4I6u5@3eD36K>maL*B=qD zT-roOXVw>!&cCq)UKAxpv`yD<20kLCBYS6LQ}qDy<*5dEqSk>t&GEd z)Y3r8z7@r{BBkuN+(^^9H#HLZ8uXG9nj54AsJ$I= z3vtssSLHn&{WFyNez#9-fnZ!;D@7EDU5x9f{$uxBjRNs+l#7bwKfZVaVKkk<3M&u` z_<46c4`4K0alzpMjK0A;>H?#qxcP@?1!J^b{$oADpr@~YYKv%IP7EAN-7~sB9TO4V z#e-t%pBIo(8Bq5NQ6wr7x-Vm}-cE^xZZkiB0nekOdwYhif2_QZF3{aDnPxqmnj09n zUFg06!A}j{QO-YDa6X9jjaVM(=Yy{2kw5Eg#CIAk1>2ORJvvXni0Q*NF$7i__$q|qFNuH?W5SpFI z@fP+60_1q|tRQmCnirWIXEDIfpBaf9KTe_vRpNPca!eSg3&z0l0dlP6=5}gs5RA5( zy)8K&>)n9=19%Uo|E~?;{f%(}ypQ7MA6kO(-Y$hCA=;}cr1r#Xg6qfBPM~=? zF>pWtqM-XzYeaOHToe=Ct{FyjFD#3U?#mdgx6P5zZRY1M;CXa(e|n+L=GN;1=x!KK zvz|`P4Q$>nbnovOKzG3Z%<8TApGeT3#8>K}Tr8s;zmac((G$H3`64So3}!DCK}Xad}3% zVBYc1f`6%Yn0JS2-VOHTJ6b8AVzw2v)i95-1u*jk%IEYeU$n)Ce9v%)+7(qpp*Z%2 z>j-Um1bA5e_98zYg69FMgz7hNjdELnD!Vw&EF7*G-28C2V5+1=GV^-^X1<&6@Mt5S6TpdNNRwtY(hqovr>oD%zmdtsd%RM%^Xnr#R0O`3D^?qtP zo}H%A<``;x^IId;w{p1FY_>FPwyE@=s1ZPzu}YrHC{2Tz#i}%8Cj$sUs#s8+*yi!L z87olz->Os~;0x)82=>@#B|S;i|MCCXCj7IIUhvG$q?-R+{r@saKEqJ`U-{vN&fp-L zt4woM@Bhf0foSp}TwnE3<;QN^7SQEQ^gx%@Wk~)s+?23Qs;EKNQ`0kT@<+57O|z{7 zE8_036J6)zJKi08!$aA7KDhHr)a9Q!=Sq~!S8%n%oD1>6G7ulm!ZqDCy8i6=Kct#( zyWy>_bN`M@7AkxR&0X-{PR$86zt0Za>%C@XQr9>~!glmLbIw$vMYgmdpcFYbMQ9DM@`OzZH}6z&W_t_W;zG^Y`B=w+Z$U%dBfwYZP;*Y>V&H$ zhF8Z^w{y49w6huZR9pdJe3Rd@ooY7O%4;(7svWpVrmMp{!Q!IIaJb+BGbik!Of#XT z*c5OX1^%|-j&{0dJrsvJ{tU=-Rc$qUl7L3X@%^^iT+1a6+*Uyd9qo9>h*0xl-lY;q zH80*ora&Opy!dt2u$w}WThHih06M=;By?_LbWRI{PW`^3Uj?7$#kBJn9;Z$7=@CfY zG{f)r6V;ngOx+Jio36uOnz?x~3LyDIXOC2QoK6!gHCSV*z7E{48p2WyO(yD)hVVn` zd59nBgHFqC4(~+Ja#IXi5><72e$-xiGVOj{VK|-;5C&FE24VPB2sYHv3@z)ujw6VCol5e4fxoTjJ*ssjF;*{T>UEE@XR<&N8~_>$c49UrMwAbkPntfTz5NX(KpWitcQz@M9PZ{lu3@N+p) z6o-j%K|1c|COJ*S`Nrl^?_NSHHWAjoR{88m^0ixZrwq z#lMk`nFOh%5H7p(ZewQvf%PZp5{p;}$j5MLI6N?@6=gM&nkbedG$<>K2SX9WO$R{Fi}b z_Pt3%_+6yjCJh&@02*4}A|>Ldt3{{7tlDqh@hzT7!*Ed{uFb+#j;YGfEp+j&H)*Ke zO>Wz6tdY7=VQ<(-KoabbuLAPj&VonphlQc(|4->D`F<{|Eugi1=^( zcL4u~__M%&`4ReE@c;Y#u`U0PxJdB-7H&uQ|Cm4J8}YwObQ%T!Lu&;7Kh(SVv~4&0 zB6XwjKlrbs_}?(|*TaAH`iS@+k6|L>Kkdf={)g~qmH+v(;D4T482+Dnp}>D4zsvkD zS{dY{zu;O>*3$DE+YOvx;YB|%bBl){(nU9 z80-Hu1OLAhf&U*&7xTyP4Ovo3cpVX#5ZU>nQ#= z-1O_=zj{qX{Ex>l5&1u(Il%u{@@K*S_54}zKTj`|{NsH8t#{b~Ij^cl0adiA+f22^`@AA%m2_-dra8N1w7O??PZ1=?-*)fyPP7FYgG#?a+HU(6*Pok$Mr3KMlSGMz8>NC6m|GTl1P+ z$(qyT!o24L?84)G$L^JM!LIB&NFg}&BHXi4*#MY#v`T|(qzWJ3vwLqc@;qB{gROGd zVFGU5M?kpaW+0)~evrul{BBf+PiG!LhXd*SMAIa^>lKB2;gVrfZLSp9SmP>4Vy#I3 z)z*JlOm70gK+zuYZ_#wRW#OEBSII*}mP|^+G;temZW?Xa;~zP@qAE{SW+CNdK4OhnVnx z`PVS;ubvtPKTDu+gW&%iYv360FACRxLAd^tL-BJ)d+>8!xc*xZ+#}fzqVKM+L*UF)#~*^n4UR8h zyR((G-%%-NTj|--;1k%zx*C_5Dk~kG;!t$Czf@6ck#fFseZ2X3 zD}07u4DxkAIr9ma@&0Lu-cK(qbg}C&7M~=x{ zg(91A%CegiFxzhBC*sYOl$2I}qLaDuAL!0&J2@iByyO_|Z&xf#jWbu>hxf}*B)E$t zd7ep{jYq|(OZW>7UejD%n9zd6J-)aY&pp5)|7O5_uZ~V4a13zO;%{TZ{ zmVO6SRer+co+3Io<4vf;5g5i|yz)C-@7VsYSCY}YrBxY7amWTH>*94RN);vUNT98>tG(!kD^ zhJlZsl^#_-`wTk*U_#njNbAxmPTXYvvkIA&X<4rkaqK4GlKmJL*VKbokoo%3p-rJ4qx#_!OsHr-_O11SKz4gjK>ko~s z&lauc8(YspYfVeAysDwa1M&%fihRTrM*&5o5qOhc{0nIpY)zP-%u7$FtL)O`I&;qi zu|d;zcSem@YW*P^^n z@+oOBqM@}A#ZC*(DIeLxom##izN`C8^P1~Am7nNRnpA!w&5c0N7)+!^%Gq4n+q~us z5#*775I@smtHVQIn9#X>|Pmw`3~q*0B)ts z04WG?)|ZoPg{(7i>Gytkw2j0-x<~uGxKUM3dS<)k(e`m7YL%^?EAY6M*xruMtG**W z(~;BQ?#7d>X?il5lBK>tKYP(#ob5ewv*7U_thLus@88g`vzFr1TKa^)8-*jb3Iev- zKu;KueXtnP;CiXz1kp2_=vgM{DFxB9C_&2kf{58onfa(j%+2`CeTcM2&KKs&Kf~pf za(;HN;&03G&0cx9G`Th}Ju|NP%<`NZbJciy#ZMsQ;e-4$D;|u$T^&D%#-As~9~(4& zE@-q*%Bd9~eEGW&5C9vP>1X$!s8f9DV;%rAV^*HlU#ufuJH!_r%=g>g7bv?kIj?&D z5u$8AoP}@>-b_61bsbSk`cf{{ohU~=A9)GCSmtCo5Ws}xc0r}-j&R>Fj<9*j8MuW( z`DP@ny2XA3tBX3+p!K81=w8V){~H%wk%EH!P&kEkj*62O$(&nw#05?1b*)lPq(ULd z_HR`DoF09)cten*(g%gD4D{Je#y960bJaH1r1RpJN-~^$Ob_(frP5;*(PN>Y$G9MR z18RWru1AwpHwmbAmgvjDckqbUgP>cggF1h`Ih zFJFL@LVfE{*CKIEgZi9MsDbTzC9w_AD9{oP=%?xDa6qFHD}a9QTLyY2sgDuqPI)1W zK4E4f7hdK8nr+gDGkG((DG6%Hn;*z(x zat^u7qd!pIC@{t0vd!MEoUi95ucIYYvnk7mZ{}sb8f5@{&CV`)p{2RAL-xDmQ9O(o z*R`tj8K=w;C8kR`t))(+5~exj2QUzvWf}+@crFcutuFZkSI$WcTBi)x2R#xr=n;KT z>?zn+VKMut6Gr}W6eV~RM!)CF2+YVkl#OQWvB5JT6N>>MUWLo(_sI{?CeQq3k{7|2 ziiJg%If=YeQI}spIH@H%3*MP?c^kf&6JFr=qoMNSaCkSQ22manjDG7uB+Wr@H{JUa z@RgF*1it{|E^)$VBuRf1^4H`ef~r4iqpIs|1GmnJwBFvXpi^Z&4IEb07akNcfU?#q zJAvOc8Hm`cn|mFIUYiCnU(Li1P!0n2(*QG_JKQrYJeZ^d&5JiOKNgaLJraP?yttIs z>)}{_3bA3z)^8Xzm0)+aC0JpY#`jv`|Dz%3p*HLQ&L>ktr3+047?C^!NVb)lk4XN3 zT~{CSbkC#(06bkz))jXFajx(*$`;n68Ug={oH}@3KCKh)&Uu+5&4q|;|7;QUd zk~8HbXDUkt3OQ;^vW5So!q8WR*Z8Y&0K@rHToj64+vlcg@-C4aZ1uv?BT3}hjSbr&RTdlNNS$ehdrEU$o6{+k82*zD&gVm zRr+99csS&roi2X9s??@ScnRR=L9)9#e(u7z@=-bNbjdp-o-71%n;{6~-aV?^^gYyy zoDH;?E1RHt0II-B(cjgTA}k{n`6J<8IU8$EVpK_zCz@bqpqsZ#!zNlvyDQZ@TguF=D!2>mH0HwOnU`48lgA(X*(Lt3E$|8(jfFC z>y193MmQT0V4_|hw`HOkvxtdQuTWA7R&`bx;a{!T8wdmBUBTlmyF%cT$zfj1fe6ND zdr0#8M#ASLbkXz#vtmSiw$2Tj<#{wJ$?%*KhnKB0cwgfH^J3&ThPTdE(#I)-F>JW0 zJsv#BdzbUn0F&g&fp8pG=3q_2OGDQHGN+qI2y@EHUDT2dV@_etw-n;Ilvr=ehhS4n zpswrH%_CU062uH}+Eq@v_&v=$vSAA!LGiQ@~0w~v@ zTQ{i4p+4Mw~yrk}%kEwmc(r}R3A36~E)zf^Sl)vnNP^TT&LI8wJ~ za<}h&L3s2&5DzW?&iPE|UCLp0MZQ4#q-3^Z0SyOr5i|I9=xSe3d=Hupvv4)gT;Wqm}+Pn_^p#J3u0aD#L3F0!_1P8l0&t_J0~ z4Rq4P)yVjQH!&EyMXm93unMvvW76J8gAg9knZ03FU83pyxaNKc7o?qUTMroHkitxd zO{l9D>;WQXio-ay#@U&JX6J-j#-wHpP>~DC}&Ct;x?SBX){D51^U;|NZ@a|6meLYywVmDqX*%%YROMnBF?p< zkd(gL2G>+~ObziiNX;D-YC|SHIfVrfp2O=@;h~*tA~*Z1i1Opm+A+9RrTx|OP!#w} zov+zy5%`;BzPra)IMM(rXT%{z4eNUHd-{?oWE&0i%X^ih$q9IRH=a^p6b{t~@G_8p z>;gP)ARaCq&FHmkQVdfm!SW8=(*n1$46bZ}n%5pVUg(rBcgPBXE1z=6(?u-&e4KPc z*PkepR-W|Jnila0tZ6w))t}?$UpN423aw!2SmF!(nmY+Dc5{Lg0ZjmssXEnG0tg;# zP)LxYmSP75?ml2}QCSaCd%=KQMmPsy;C%>yHvb_KKr{@z67)f!UFg8R2%u9s3D8nB z@1L%Zg?r7>_RS0`9FL$MiR6qg&GiRSA>4>EBheXdeZ8{M3S6sN1U!X>56_pqcEK_5;{2H!`o#cnvJW8iO9R+A zyOHB(S}<1~PegKYXaI{3M4Kt1iy44OcMt^vl%hqCT-*E)vM1{4+loWQxUF@aYDutk zpi_3jnmFYBAfp)ET=_I90`CJB9F(24lr9A*#f`(s<~14CYUT$CZLt7Bl)>pKHZ}K= zhV)TJT5(c;LdGgsY9y3ccNGnQvKF;zRHyHkUPTFw22qk z=aZ9;{!Nwr%Jda@@pxLOQ%v-$L4U6niaRb%W>Y7u7AKOJQSJ=_psc2BdjYaxc-g zkd|Kq{TXilZw1XCOXTul3GS;UI^&YFsq`$TJlYu9g4hg9K-UI%kHc@&;eBVB0p4o@ z@cz_dfOlwHco)CQ@IF37gZBtLq;T-sg5f1#vBgPeoN#cbqD(~Kc+px+j5(XMZ80D7 z2w>Q5gxF++SjMqq_;)^_PBKDV@j@F6H@w0Se>qr#_!@#Z_4p8TjwyhUyjgPXRZw|3L>saQv)ZQI4O)Lhlh#2MO#_28UKhf6h}n`e!Q}aJQ8@ znRh7}4(w75c$78IhfF3@Nf49itxhIWDaoP9w9Q{?LEK<*2PVof$qfjR0Iq_~-qIss~1c&?!J%zivR-&UY$Z(QJ zN%8=cYF$fNOKY(NHdm%nXKUO`$idU%y~vrdqUm1cf(@7|zNO*Yapl$z=vDjPYCF`C z{UCZAP>YQv+E2o9IZBF}Sck+TYc-#ya~-G1E?lAIa4Xg-ML3~>R?8Udg1Zwfr;{i`OLU;j!5U2d{LQqQ1weV*1`E;~{x1@VXIYkzC4~`vJ z`KQvu_|kkH|6(e?9}(^pZGQ=wLWn5Vi~VZCOI0gK0k`u}Ct}eTk(ad!HF3yn%JxSc zxMs}bdelLO0cHC#hbJG}+C|IwN0oBCrtWX!TUUn7br~t3i!wzD6VW%smk3#O)jeSgv~)VdIkCd9l%H)OA2$FP;krrIX&<0J2b54g{Svo35S zZEUg`uK3yS?xUO-V2VqChZY>P!_e?pGQDHtd2`_S(VX4h+3{w(LiVW^O|m{d{zJ~@ z`&!7>X0~mwPKuTVMgxTJQpoqBknf2>-=WxozI$z{A>U^QeQ#^udj3V%FDrm1U@YDy zH&lF^Xs&z;-z&b2FD<73WL5kGiKV00ntf{34V+QicYz14sT=)G)$AGH`|^^&d$w`~ z#;~=mF*G(x22jNWg?mpaP}+?6M582cQ?7Z2)O)fvD{)R&S$l#4fh=MqdB!ukVevQPPm%GL zuAZMHG-4Q}Zxix5xrb}W3$>Tqm31v-FN1JrA8f>3@}maaJq(1ZEVP8u`M^SqyTwno z!QHMEjJw7QG~A7V<7U)mJ9eN}L%PKvpvLvcemMCKnGb0vQ_89Z3eSf`PV<_4Q#DTg z5y-TDU|pqlOV-O~Dj&v@iGE>agZPzDVdP&3`;ep&2;JID=BGAgZLRzmPH0U4Agw=^ zU;M0nXR*U~abHSMx(Dz>4!|;%+24FsGyHux?u2|5iaWjG^w{6P$~bA;_g!dFZ2yJ~ zux%Y8{J?3-kY$8gn21kXVOt&Y{4`{dVaj!!!gZy-KS359F`T^)uPaS4-^NLRFb*M$ zSYXngMq9Cco!BT=uPIQz;zBr@uuv5c~V>{vUw(30l->i`1_zY>^TP^ zwRpr{gFTNFk2r4!h^_2C$AoOMyOaL;one}Q0Grd(@Xx)=QE`fPqIWy$HeuC*1DGzP zNSuhDbB)7mLmiF-j+{-BdGtOh;edH<()^`ekian9-7`DEotU+?IjR5FimmZT;_FI! zp{wNI-rOh+K0qGR0iXq&9H%TUbM9tikK06#^^Syk^!VvP^f+u9dW=VpAEU>QE4IZ~ zeO%hrkyB4SZf$Nvnj!Uwh6l`*A3&lU$iD0%&kP|An^uSE z<3E&EUNL_c=RN>&h)jVy-ls;K6y-!8#0WUfPA<+@P9xPi5XrxN8&U0?vni~oIdN(b z%IL&JBKi<+{zZR5^nYUwrlSJg?c#j}wY# zowYmtLC)T5eCiDfXb+QV@H+_Hdc7;~kQj_}S;kp#pK^R0)D!&7d>q_Nc6cZeqvP{E zTu<{|4w#4&-oOHj&=)k{IYWZxIwx#0>D84W&w<)O37X@SFpNP*E`os-r3bK?8SuUfZZz+5fV9R!%9u(6(E{K z){bB(U+<$o?yekEX;L5+G|R16dC@Gbwf0OXz!ba!Ei~^lR)Cqxf$v~4DYzkDEg@`& zU>mEz%T#|~=)X)labdx&+{PH*cakh(cyLaVrJR=1K2Gl#XgFK}fw%uLQ+pef^YKsBc^*4Pq8vQQi+RNcK4XY8b%=#}k3PRn`rF3&{jyx0AC!C2sK+oid@g); zHTY9nYCv@&7I8ibrKu680?CUY6Y`liu}+}Zad^e)9ohW(xW97LwRGpTifKV>X+j><$AJWOLgh*Qe)7=$Ahh;YPJw)Mag_!2^f*A@G_jEs(> z|Md?D{nPsh0lEtdEgj{wxr>cqp3AL(MuKZ`%lO0}^Ez2N!;eVkbqwv7XtPo0h6eOr zo_8@#F3*$KdjwBFK-#?x*L;zOtSSmaMR$sY-+^YDor6;}Z*91ou-7LFu1SU6@N zB9FKv9Yiz+gS#x|}X&?UEfD%bbz!&ZZAkVL(5 zZ!T|QdBr~l;OrVaa_pS_6hF7ObiB>$CjH$n2iV>t0@>s(yBlp)aqgZr=yylm7!%>F zsT|L0?Tu6e$?H;-owy!)Y2~NxYaKGo)L_IqYFZPZc9Xyr4*5|Iuc16y<*jJOv1nH# zD<5ov`3o$F;0O1fg4Yl^u{ef}Gr30~p45mqkwW7EDGC9AC=0d{s^hB*TWHbf^dJoB zvE%rFt5rGrH;Td}tM`ZDU>V%F737~!z%euEd9_N&dDL$;q8p!kcicd5c=vNU%A zh>c3tg{R;x=35Zu1pjcf(}V(WFvi!Jns0~FZ$av#RXNlhOA;Ax6`ADW{L8k^o$4u5H0%bGdmQhh5k;LSHu>`doJx=kwzJS;D#KPCSB)$d zE|w$X4Tpy|AXG)1smyze5CD@f73B^qsKyai3$5ijo!n#b0cgh=J4$moD^U9BX&QnO zUM$UczFleUO7TAp4c{^mU z!619R7sr&n2B3iD6z_(}UZ)W0@IpGWd|dZxb#k@65jxzi*ekcXuZtmlCGC?wGSkGV zx&&r-MEd6bRY)JwR)A}kKDXIceFn)3PNp?syNcrm*98gVIk5%twe#8~h_`eJ6+~M? zkRYNiX2%8bh1E2xFoIag526U-;qEMm9M8&x0b7MG^*K%z)gbv87Q`Fq|YOP%sBI(x8$^uU#9AO1+dNqTDnAk|s_;`xk7_ilMq2LhRWIJz>Tv|F4VH?^MH*}E z`?&DikRIgB?IULcKf_8)YavGxnrZ=}wM+56(OT&bCwBGWjov=h=+#FudPoj2h#iD* zA7CM)*9fTr18PQ3VN2w>fs9@Y3_^?Y%b(kA^!Bl=H438_=sjTc_9-LJjUj6ao4Dgi zp|bXgKM5!cHG2D?KnSabndnB3r=r?#F_p`CDnYUa8n_yjRDPiEI=3}?i@NAW&#G2F zf*S>IOz_=QWOR65PcH{5^@4veefOB$lh&u$w~i)-D@e$p(;yk&6&sQyG9wZ4-M&{ z;(|DXX=y&gDSyEAuXif*lf#?J=J8@C_eAT~_bSh1Tw2try!I!WiZGUClC0tl88KYr z=>H>o`7jH%OO9Ke1Z#=#C>zTOzn-xq^B80>uQWQ70jY)d2ys=%AXk7~)nDCM&hHmP zfQ8q3Ri{t^?)^)U0H2nzEI~#=SYtVvA4D;hz9db6!`jO$U@zGqI_0jap-f_b6tc=j z(glmD9HkxgP#c*aWF!0OHquaTQ#FvCI!7~*IR1=mE0lkR65x10tFB-pUBUnao5cSw z<)!ogHF-H})qj(`xcan9UOM{`lnGkpebxG(%Zv4o5#(hcKZqhPOFMN`UT~}q{$7y0 z)KF?bhvlWS@E4MlHxt_{FW5g)^$X2jWe{ zEuv%UodQsuusuL=rzB-mLNt*AM6^t6FI4|{iJ%IWuHgK#*zv~yb@`%W2Edr5T8)3v zeW?Fu0*>WKNBH#uj+-p)5~X?AzYjJ=HyjHRrPB&HzP&txDSDnCL@`B4zi6VwF@S(P zQQdb6b~w1cvKq}$p63fck#fPYa{NlvMTjwiXq|)M1EPf;3`vs9TFXauau-N^HXR}7 zVfhwZpQ0CW9*z;DihQwdLJHb0Y^f@5r)ZMJU1%X)V+bS&%pVZ3CShwYobDG@VN-L! z5v36!5!BzNjB>c4i{cQRN7%E~I(HaiKiFcxhO%Xr&AcbC#x%=3cb|#&B5G`&?llfS zzwC(jn9#-{nxY$b4bImhKL}fGTVBI`1Tg2Rd{{>E#7lKH4$%ivO&9>}{oWmXe-cuH zI?{hBk~}){{>qNNj~(E4_3ur3l@erBYydIA2m$K4#CU!KP!+Achc=_5^uIO6^ZkE_ z);{)qvDlZR)r*Y%yAqQ_K3DGX_}7z=gwXd72q_@tK-_R2<&LLUc9RO>J*?0x9IruL zM_hq`6Uh;;aO6!L>~W~PI#ZSHtFu^YeQEDnb(K2$F57JA2%dKsf6_c-ts0bcxj z01jR*qD@|jJ{54KXSv5a{9MBGrPx8tp!9NVM0BQCf^Ob==v}UAh^I<(BW*5-JD%oo z^DflfaPwALJMMV8@MRo`psO6EIv-pUzvTCokLVQVK8|}xBpgxq(1sADbxP;qiizC4&zEeKAXo+UxeMq&ratk?T2st6QTRW4INe5DpR%;cf zQuO>RT)svrT6D?U`0Xc=-Gl@1q)MqWHh$y+^VuVWvg4HHi{Jx@tY{{6Tx<#MtRy4LsZprE9Zh2&3#ypk z^jygIdB|&1-=#lI-B4iO_~f5^*d@$dlwui1|9&xW%46DzRIHK9dnfjeiHOAbP-^ zR1Hh1{#Wu9xbX?U5q|e0Krwfm@!6`8ia60afbT(7q^p->%(L%1C$bfOk zxGYV@X?A;Y`m^~-AKvA2o=;$fWYC$=x*>@rs?6X#Cyp3mTbTE1bX`OGiE zz1fn%^+2!^)#|P3Cl?*^2|BrmOl?#tLH6Thl^)I#YJbWCbY_!x%8EZ_ zE(Ts)gRsNKl0uQej5BsAuoP%l|eCJ-Yzdd#RtT;KX`= z%4g5R7zJ{oe5|+`f&LWh3vB189VbLxQgr@nFu<;aU~gUQ`mNQciX~w9fBwG+6mz3Vq$j*HpHe80wMhS>xA%IDc_G!+YR%F z8u_uNlly$6c~m>)I2ZgPXc;PfDO;R5_SH`FX#8jJrsj)&tVwha#%twH*@SE&Ds0KO ztXS~d)6QGs@RAF8PF`20vV1$T$Y?LmCbk3Ln2)uOJ`Xi1HnSZ{^!nvA4-@8r<{G^t z5Snf+m6+Pfu9eVZg6@-^C7N(1T+ip|BQe(u`ccgc+x;_;v}g+@hT(!yE*gYXOf|ne zDu0ik7mL5Iz9qolS?Xu20O6NsBJ+1Kz%$I(d&xI9$K>ys=nwpT4Zj(MzteBf_f0tnlu;zy)g1`6kJ6hXz@%L2@jlV0=iLwkm1o%QtPi_xi zjD!Z*p|t#)`I}Bbka0V)<$sF5H`WL9_pS#{lfUnU#@L}`U>*i~$L8-NFX{YUx=iQq z%b(Wxdm;U(^7nVGr_0~>l*Quj$;AQwo~V9S`TJ~u5J`WR)3bm)doM{w+Zg)0@+s!; zX*1}}DEyswy~f}FcpMxyl)q{`8qnY8h}Xd16DR5X{WQh^e;>Y6@b`&A>Plo4qs&o7*0^ZA$X z1~)6@b&Jn`DkNch%u1#~X~Eg-O;j$1t0Lg}DHFemUg4V!Z48s)uh1g6{)?;0_3O){C{3w{9ozte}w!muYK^pDnkAr@8*BB zNdCXl;(t}sZt*`Na9RA1O3bzid&>Wi7vTR7JW~Hi+|cwt#Q&?}_ z;eXa*$>l!Fgs9n8JR&Q0&S)C*^1Y#lni$d3UKy(=+xN%L`=e=hyW`~yf7r=hQ%;XtG=080+KqN2bEp7IKVMd=&p#&M%L@D9P&+Q)mlc9%ZB{tnviHJr?=}I;eiR0M3)&YtT4wocas%f`2!08=1r+UA zS%q$i3F{;Ct4>9=An^p-*LVPiqQ5DNfpJCKCM!8P2DDZ+6Vcn%@X6%R_% z*pCs&2w={=3eJ5lO&+U~ramhy|;!63Dg858lDW4;W`aj@lwK$0Hh& z3^VN3)Y@YWtj^&k>`qQ6^p2G87yNto8~%&F8~kVN5&W195N1e)b^}jhf?7$LWS;$3 zg?7v~YM4Hg2<89v--2>PhA@U|IuLmiW2s@d!h0K|%8$Psd)Pq~LFVbR&?3eouD+ru zZY~PQ=<6t|Qm;Y0)*`h*y;gTL$=u9U+MbNi0&9fU(JUB0LW43wo#Dyz7@QkzyF1+C zoe*>YycVYtcPKkN5T&qm++TntZa%^po+oxWY`YR6YSgb}xblQLGv}2XLrZ8e-j6;9 zKv@~k1=Dl6j=+W(pg0RzP>vx9?>Nj2@VtQ39@-rZ4UzLN+_8o5LQNXRaxefm)w~w; zGdHHHpeFNNFdsUNhC7Kver&?a8T9tllw!TIwj)@V0-WOVZS#g}85tKG9^^PbAtnRW zI1gw_?#E_=q1Km5368Z>ow^?w)-lX6#!(TZ(bKt&Km+hw=^8RJUaWYB*e3l_x#55G zw#8`-Y=(Jlc#na7(p=vCh^}N@KaIbFkhBds+tYyYFe3I5W7ZUo#tTSPHAZ{P-_99_ z8qVJU6Tu00tSkVe=4FIJQLUI-#`4Gvv0$*~0h zH#P@YJsl; zvS>ILE8YR&XzQ59(*~y0e{LN(*UY-7u;?Hv)9|04bbb~aLBMB7zb+>n8IQRNJND+W z4bV988suxh+)zse6hom}!UUWmkr}Yh(~m8Mw1r%pJhKIh6Vd?n6ZXH(OtbVX$|;`` z{7`ierjN(R|M)(!V~aCnpfCLAUh2j_XE!hYJKu`K|7VHt|K?1=KW9OFn}uXhwF;HmMsEV;~&p8y?528#+OVWSMZ2O>b} zw}`Oh22uNMB5-}MheVjYfJDegpWQ^LYUq^+!$rYPLWF*fcbVVn-XyL?a;x#qlkPpn z`+E&N$NNCaA;q6K>K#Ba9{CmlEbQw!e!KMyd)$L@^UW_0#j9)BUp)i9IGzGaoB|Aa zJ8o;dpeR5Im!SB?;}jHD?32Fagy3hAb*CV7P-p2UOPC!JA;i4k4F@r`A_x!0JkbL& z56`d=GY3N8`P@bzA=F-)iF5TCXJC^nj3_M7FEQ!(k&@z?d?c<#_VP1fBe@yZH+Vb$ z7^1pkCCL-ikqPvHny~)YlE6=KwrRZhI;*>TNagV%x3JyPo9y zm+xSnQ=-OUTq&l3T`RW$e)Fx@9YKIexwY;mJ@CJ)o_)5Kk#Cx39WD`YJWE8iN`p95 z`}YWJCiL&4{S|Eg+&{)@L`~4X?XRc8`z}$_Qxzs}72a1Zgs5Bz6q{co z7P>`W5>E6d;>0Tj5)8`O5QjJA=3_J!q^%6F8!b}77A-PAcM;xM5pa!_Sy;K`{bd@3 z7d`~Rx(K?Jaj9?;C-m?X;=AV>AZDlb|}i6pouNk`l6etgJls8>oLJ2sbPd52z6d{p~wN-Q%A)XaM#tQ-+4t z%t@Oa9#nE*8NT-5!)r1%@&JIW$oZ{ zVXRlPg(8ennvT*a7#W`f^N(9|b-a~EL&lh=KL%T&ex08)G#2+S)g2_USsc>_;(E}u zp;iDc+lgXKr9rt?qZWSp7#|J9&8eFl+$0&FJLvxr8=tRD=;!$8W&KeDY}CS;v8#f2 z>(EH2f@nRuk-*4IMnct%>Omy>k-%0!uIGZ^{QGrW=D%7&eR31+0Ok>A$0BIOW)bod z#tI|lOa(2c<1n$qOB8CtPu3Y?nM``Kj|t+w-QXaOvu*-dS6uHx+}*j2KsQ;*vWG$R znm;K|hD*_mT^1=fd|r`TMg6}T>$#ZyPT;#Z245xNJGKWdb7JthOmqXPlEG9(Z5yvdub4__`@ac*WCy` z7;zHbrNT}-0e5=7z>QcR`p#|T@8!5&s)LD#ScwO=mkfeuYz~``WY4}66pvI4GLQW& z=8Uj0JK&C1dCC>B`?M_oSg2;>1Ll+iZI{fR@hZo9;#I2r$E*C1B1mPt%GrTBC>NzN zPR@i!Zji@EaFMiJGUzLhq-VlV%nJtxAqdoRku(*Lm`m=0JFA`ROl?#FbSwnDdIz3i zhq=SO!OGgFd+lkkd%t3S`tl&CWxn|a&|!wF(&5hc$RR`xVtnF4P+phymM?1{etzi7 z8tcc+Szq|F#s`Sd^{^WYw%c)qD{#2nJnsQ&pvGjt$jdDErrk*{0r@Znk8j>TS$(4G zX5K_XH2c>LvgcW`N*jTWuXyZH`FFJTMVHq0B@n`BQ)g;vn*h>V3LFPI0%AjVtPLF@ zt3T8H)BP^kuAklmuIn#I0MiX)asLV7F=u;Xori!AYW=aHJ9MuwYcmP%|<< znq&C;q_*CtAe51PfYRO%$?7CDXd;I@^#cXB!aC4QiMumA*XGg-~YrzqlFZQ~>fS zHJuvP6VxIqF0%PGKx@I(m`^fBx;gY#tRI-R6OEg}W^SF`nrjjg=rY*?#ofwuQ~0v) zp4HLH060^@h^XVK41s#j>JUEDn5udJ$%cCbh&+(!8>+t`4G~70dyn-J9!Kutd` zLKe^oc{xUC#)F?bn75{!dw*PraC|S}fWyKuuUwxa{0JK?#^+lc{iOxP`kWwQArACq zm1@3a^K)B~ySWtWxC^_OoqBA-BbwbgjSdf7CM`X#4o5*#eJ`}?3%4LG*!*}W9?;)4^Iwev zQ}oiHbdu5o?%N{6@^M^1i4IfXmOaDq5f$X}+w9FLTf)k5`Ub_*yT5R}}uWE|2HN(E8p`L)uj9Vc+Zy zT;<8u*Z7gAzLN!fe&7lBObi7ofkFS|#a;ivXij`S2wu&kZ$C7z|5W z2(4giMr;T#JVX#w+rF%Y!f7xKQ{&Pi*q1TCnMM6Ia<}?qY>2)gNR$kq6FQSR@--e< z1D_HFm_dmedJC|EfH~wqsenJHos2tGEc^wS7hpQuUF`5~;%~0PAAu(Rgd{fpu(r4H zHyX#GaW3hK9{B6F@E1g0^UsqK~A11ehZU z3O2i=sqR$eh}6LSPoxi4GeTuvbB(pqY%%?sbOYC2AO6g3nm6$S^!rpe_kGLr^G0 zxNdF`^2;9dhEViP4774k&%-+G_hiY3ljC49DpnCe8U)$zab+gYITFn<3pyr22GC~L z^UbUGvp6i@+<1cLZZVQ9Mz0l$UinGr^;L;YFEViN^uo=iLNCqylcJZ5;o%Ep2vdA| z=@nA+qTs@OE%aKT=%vP82_}+6^a>&dLp1xn|LQ?6HS$TXzfRZ_dJR(ag72d>1t{8o+4+cUOmS+7E{U;d&9!47gP3 zxMZ-^y6gtqN+3b}N77r4xq^X;bJc-=PR}SCvnL|1^4nOTS0f(7B|xlkyC?%-NKGr; z$~(vC*s+iww;!hg2rlLc(QvrT7K1Sg*VG~MIlLPguM6_%Qv^bnGKla|l&OZxgz7kB zq!#`0Q`N9&fFA*mx<3edA}32@D@<-8AZ61$VE*i6l2k@5)}6DYFL_WN&>GwYpW_<9 zSc46Rp6-HEhBSR8PLqS^K*(XljlL$&{X%`WfA#-z`{VwX+rROY|6Tl_|G(V+=>O&R z5BkB|&s6(uJw{&2_u6tWZsbuq+4IraVu*+=;d%x-1R@nchbZA2JcpGE;TvAN4lA6? z&a|hcJeiiT2Sza1% z<6DSREh*Zfka6q6P1wN=r)`XG)714#j9al{>p(gl%zt$+y$nbk)=vs`Ln|7xA7F?3f>~}4qhJZ{*4B{=&zWEF7S~k~OwG8ns_;2(O zx_bZxEZ?UZ^Ms=Zs^*rcj9o?SehjQTURPk9VprH`SGbn~%m0xAE1O^q23TxC7DWLy z%WfP#Fs17gU=_>Lr#1mj%ntRKY%354VLwQJ#zDCKm<;PXZa}f(Krdx~<~KmTYlPj5i{9{N@BPZavJZ4Yd z{40mBWHC+8IA^b44pn^eVj!T|{P!zx^T{h&%-b-qQ7LzE5i{naQ6%^g@ya$5FzS^A z_jvt1M!;G}7Fpo03!B~7Sp?pv9#{B+Z{AfOx^Da?8g1ISmv2E6CPV^ug{detmG7be z75^q9CA2KH3ul(1<|DC+&XS7mwLgH({!QMEvDtI!ip>I26&k(T&I>mC#Qr$hf~5Ov zLbA7Sfp8@t`HKa~HiYOPYt5>tx5P+blG& z^4V%d z5h!rGcOlh%7qZcEtI-RsMim=46nT%byC+53`8g3q{(yvN_L;0&i`>&9Xa@5RJqxG` ztsI7Tgu7WWbugWBvCp*Z-|6->$B-p3EtGWAWQY*~d07qjnxJwF$1c$dh&_@sT4a&) z#<>HmGO#pCnd-PQGNKsSmAsp0{^BSv{bo*#r(cGMq1~t7gbRqu)ITWtWi@%}chvzN z`W3f%=yx(+IihNWepc*}${716-THj{d^URP?@=6LJTu(1(|^4mZnLNhQUg~C3_C4N z;!ez+r{IxcQEn_)0z@*mZ(ce)9;AdtsR#*XZYxYn37#13ItQbR!z$!1AA)^R=y3cb ziwZ89wMw-A7rr@$XdAOXu{YuqCnV2x#5?sPq?7X&EXdg=#PsNTErp@)GHnL!oER z6bj)!$0kJ~zwPhG3#`_gfB3AQN9u$9!SLDLL532kXe)AOk>bea&HG4L5w&FdjXNtkHC9YKjd4D#~>6xXlNY7sX zPd|G$F1JU|4(!ph;ohFz8&o|To8{@*;ohF@>-6jjl^@Vvh+kb#W3;hn58>zwePyhk zSrh+o9uZ*AmSU!$Dh8Ta6TkFq*T4JOv)Utj^z8Jqc$!@UEW2p-{F$m}*Z4g>D}ByG zvjV&-n%%1M1KN4`)%7-*gFSokCQr{G1vv*EcDmKGHyfRvF<2H<8tK_#{q5PkNA&2~ zrQ_mzb}MRj_3S-$3gFN?eV(3O`>dyD7voj+>`9d$J>&U-?PD*9lhdEWl1M8?&R(j%av()?nj z$QXptQ^RJIN*^cb>eHX&vK*kY9OcULL@W#E4)ZD4Xwk~Y&#)CW)7%!z!a;0qf@K+5 zw*5}B$fv1sS^l81yx_{BIavUEM5R9{>3AREPOMdlbM3^T?!-wd@iIGc2clBGaz)FH zm#3u^;qMast-#;w_`3&x1M#=?vb2<8_`CF4@85yfq&ZFz${udpA9A?j#(nK1Q%8xo zM8w%2{(hWof1r9Hn>4-IA0mcjf4C1-#_SIh9Q#9FQ&0QDqLn!YXy8AucI*#( zAyl+~rv#D|qr*ySsCGbmdsP_DH1B>2w9-ohQvO`KJeGvJz;f}Hhvma8%foRhV^`Q~ zd6=c6}RXZrB7K#c1Ftf zjjmPlJ@>*Aa0qg&vvQh&+VXV4M1S@5^sZ0d$D7m~rq)nuv*4%`fCV8PIO$3`_ zCW1}o!hiP5MBtmh6Rn#sT^wg7SfM_2y>6Ka=0kpnRD2vKd?@c*+e?;WWngKfSp^~$ zmzu4!lvG^m%+W2JqX&N)llR@u(i_Sfm)_m3rFY|@mQ=Ks-jyXH67y0U=M2ZXdngbg z@(@OlH{c-xF?Z;Ky*$FO`WcTfoQPKn!xr;5Du2aN^M3s5ssZDen=f+ueXg)&tNj61 z4Mb^8$j7fNb@B1-b^-A5uf$*hwcYGmA`epEByez~aj#-G^+SpK za|JcSTOLxH;k`I;L&oT2d|r^{(@YOpUV6$ymS^z_&cL;_uB9`2)u%CIiZq&KHF~(! zsBj~yTf*vm^Rh5mtEDsAu&eaV`;6LmqNVd+kPyvIXVskf*W>gGyJC^U(rG3m?v{|_ zFAWYkES(0}T5tXs7FgT7)GLoaaF9)or9zHt#(2nqyWY9yo4zk@IP|g@fB%c0&qFe=zk~k6;1L-#z9?CUBPjguXr{OhbgvfF) zfbWLUj7dw}_6a2mXCjH5z75Ah98O18O&KQ;OWRsX=Y!+(&2h*MvDMrI? z0*l62czv$k8X#hppuv5;IS5AGevOXV2iiEUmC-T&Ob?D50RpTA&6u^^-9lc>hQB&m zb!#sL--1TuYA>m!IGU2~!QyCGLtR)Lfmfo+bl15Fb#5}pTXil&R8mL2*;w_>`z_{0 zh4dB?4u>H-Q8gGmOjOOWidnJ*&;y$6YeN>QTIw8Gq85ddYl*F`ScdisTa|Gf892j( zt)Fs;?Ey#bDkVog_6x<4&;8WPk^7~2aQP{WZ!TQEi&u>Edq^U;bVtW*QJmDUHdopm zX|-FV+KrLXk|?&N0j=~| zXfbc#R~K(yWruRS9kQmZUrn|;G(6TJa0EDTvUKSBzxT64UHf@Ew6f6CA%w|yI&_8t z@X$|FJRN%JF;9n{#jEPjP^Uxb?9gU_#}1WZ>%c`JYxVu`u~vtwra2U{R^QU0hu`mK zhjQXNWRCW9NCy-)g|6k91yJZvZ-;im80Vr;7hY9|PFMLsp^^CIT6E_g<1D(DkO)|G zPkUG`y1BaRW6|Ah{ykmRx}V)Ai|%f7o-`@3>$}YkmAJ)DygZhO{X&)aoJ!0$HFsh} zB|c~;j)*1Jn)zwc=2gFyHfznHvBZ3Hk}7$bU2+HPc_0I<0GKmQQHiB?;-6!Qu#c<6 zqg7(Jx!j%jwQ6%8JMlgwzJhaoZ{eW*6Zm@(e;?!T8~nY4zk2)~jlW;irKN1W+57j$ zo6=GwiczJ>%A>-k(XmPS_NwEiW(f}FbbUs` z!8M7V?gi28nWtrPi5X1Qnq~#CKAFel!i)TMH^F;4pp7WW(b{&xWf&ob)Rimn5|Sg3 zlLPQ_&#UwK{P1q}Wew1pN&>v47EWf^?yJZ#m;Zu6ERk)*WYqCxx)yy|L*$3*f#5o$ z1dfu3pwv+mKzr&P;G&(X08R}0HDi8mBNIA;0X&caafIMLg_G5x0M0$*EGB)Gnr8V^ z>IZA1((0|~{s@AWj{t}8g+(rO_v&j-6p*1{Wb9h8Yg|Q9(>%LnT2z(ESTXuzEmXG+TC2V|MQTRb! zrR~4(TXsB-42DOng$y3!TXs@``S!jTp1x&oVjnA-{ns-H-Fn}$ZgaKz{)T*i5#NKO zyX*JWq8;JFZ|hgEH`u2dwf(?~!f)y_aLd8=yVW=BzGGPpcQpxLhXX}8=!qlXwkN!D z3vvEue>2HIpaKr1+9y^5a-^^gJj>iJN%bFS`eEA<`RPmo76cC1f=2v1LFDB8epA>F*ayRd zZSZK!+Y%2E*)!H3Vi|_$E#EW>SlT*gA3Es4NrGPW+e7BPw}YRq+S`8=xFl_zw&JO~ z-~5TW_iiD+=&26hhwyVf- z=9+2Kfs^6mcZJ+#o`|{_hZ?dLQ6LMmmF+idVX#{)F%0uShj1iR6xA8R!_Ev;ogw7z&M1E;o;OHAN{l85 z49OD|;GzWwdHN=9x0e4t$Py&+HFL=?5Q##3rE9Pn6JCIfD9bG70qQiIz^OaJiD!!L zItOc3m#3}Pnp*wHQU9Tw9>md#MuLp{FsyhkzGbDE&GXf{33!7OL-e~b({q`vw37L@ zNRiSi{_f;&eFnbIsKNjZ*qre6m%SkG=bPQgTX`{&hmKKfB0THa@X{W!S!;T)yB{j& z^OzJ~F|WIg1L0QT2jc%0D7Cb&6U~_FF(FJ3$Z-$)+xNgeys1eJBV*98eqjG-;De-- z;o!kPos*K{A4iK?D=_L~_=kYR(bq;GkpFPpjmV}VZ!SMC0XzQJu3j)&|C)tSA=Z@_ zeFuzQjS1)#^N@%aqbEVB=b;e6)ZDd1tegRW{oH+i#)>}S@bfbVIv5p}r`!MY>O4h^ zpSR$|!S~9~a-?Ct;8JYk;8WrSyqyEyUQBF9&J7UV)D6wN!-@XVYVxzmM57eyijpqi zYkZ$kJ>^BpMBIf|6H(@>NU{DHS0y;t!zDdFX9%1hyIA(A68 z^#?@0gTIeDpdZv2cMmX-guh#p^EW)|k$ zJ79Qr0WqBaGcSgDiGonzVCdIkGNegc8Mb{ z!G&XcYI7HPdi2O zm)vFN-wN{}8NvD&pa0fVCI8JWcK+Y>p8qcelK-DcIW0%50 zi4m|_FUixf;E+g1(Woy)Yy0RV?Z|bAc8l{8dPQqT$+`_+VZZ4hjiBQneE)EAUN32l z%zG6HddWIbL$XSiV#?zV+Lx&}q(7007#x^DN|qMmGN|&%{v~J}?qQQRg(4H9`s6M1 z8Id58z5si3@QN;38j6Iz#np82oGe+20?51+S9K$ybHvMpN_)LiV;nyIYec3_`nb00IQl!B;I`Fg z1G?x-u{tVH2T~#>o47C5ikD9KAasfv2!uh*mQY6_Oz=2^au|S4&a9p0s*}@Gim`SJ zt;F6;ln#Z)dPtrC4``e3ZKoOJ0Z~PKd0Ym~UE7ERTngp-hyASqt}`wif$gb-Vp%j} zfclo9zB%s$)w{Yj8>1HoWK_oVSYh(hrE%pi#eJG=!>MmC&~Q%L$ksL5ig!+0_SU?= z9bBZMj39`G9c83`pt$v|318Z(6>bU{t#bw#tEC-YKIxR-_{F66e{=uZfGUquD}9$& z@z`<2yk@*?9-qNU?scBSZ(19;0Be+EPk?}P|5N#&g$)VF-D*a@O~-SMWLNNDy@ext z(B!N`0dTNKL}Hw-#mqfMUCbFQF*1usX@Q$@JT2(oj{mXunj*J%np)x8b%El-vcOFT zVL^pu6vDcp1=ra@1i_>3sWBLIkZW*w;AT(wG&99a!8KHj(jzwHLF#hDj8!H0Y9Zj)e-}V>;5JySe5jLXOyKUSk;?cff+l@ruSKX zi&i+WZg_blXoEInBZDT^BM#JI&81*#EMqUst!8yRgPIV|*FOfF^KreH8}|;J7p%45 z)DZSQhI^+<8}ZiDhS!QLp|IZ#?3ZI@Zv4|B0PYIqV8$djDIj<6ZZuE$DmnhYsVhXp zq5`Z(ptl)UO9+yE*$piTr_nCb3jaF&e0CdJTphwr zfIKyb90~ILWjngP5AL5rG#H0GAizdpxnIAix?SxiPc6wq%2*-m8h%R-0P#|`ce?w( zXZ&}LYaUkhl&ybX{Z9)!o4){I_TQxnx&=`*W(~?5jT`*q`Td zm6w}fPJf!(`!}8<8KaIqJGLqhA{MLn1h%mQo1J8sX!e{D5=1KF)Tz*$F@kGw1#}s{ zMYEs5|2&@0aA$=LIn#0G5m!hWhwNhPiYpn0v#}vJrEWj7;b!QP%z=}XLFU-W93{&7 zgD(w$3`6c1G(?SE-O>wU`ji9XC-O1%I!%&M;zea_FzG21p9ZZATLp%JAS6 z1U%)}Jo7&Yg9Rr4X1>ys^31loL{Ad=pRW#0iGn%uHCX;3oXoT4L9HnMGz{Hu(YQ(ZeQRIkgWj{*@ z&%fr{@Mz0i@I1$x>vsd5$54%eCl%E=@YJ!I-Gb*%2cC7yUGR+9O?b*2c;=!S2cEzG zvUhlf^+5EAQc+nRFnub{a$7a6H}7Lj4uX=?`(KSjjFkT(2FZH!{C<{y59JlV>~!Pf zU{7(Sk6W`>LVmelz#zXo5rbl*`R50A7a#Lt{V8?h<7ceN!3T~o`(xaP_3|V&v(kyr z%g86j>hs`dw5L8X#jE~Nb5$o6#en>!&yQFx0}ulV0TKP-NEPl(NoyXHqeaFAFzaQS zPhb-o79$;}qxA_8ExZJ!v>H!n5;Q=R;k~Sq65!`$T;s}A9%NTs<7fBV_bn?*Z5}hs z0psX?gW*pAM$-173;})#WC0!Bg$Xo_fbuoaP2MmcgbvVxctX_>igm}V;v&ZAz>bi* z_P~7s&a5F#QSSvfubPeHh!)s91>bDX3Qyre(C))$!N$?}Erv`wiYJ$>77a(r|`Vgtmd|E+$a8WyyR~OUA&v zQ(sGoUEeKxP#-4ix4rPCoFzz8LFM+>u>VoWpmGw;&yFd#CT@}#7fHv05XyR+k|J1s zVwZ!LXe}Fq8?~@C7s|n30E;CoLqa)t2Jj4&>tpa8zl||@c+aydklsK5FMNQ<2GK1ZSw7aee#7T9?=24;Wi^Memb7uxwk94v zD@!so_5jlZpH+Bwz>II-7_+|~+P~k;d;6yf?@seE`k+Z+9w5gL4)D8>1i~O`Ob!VH zc!k|0i{h^wH>1Rt^$-)~9sLcQh-kfU3oq{i;;==%8Vrm_o8LSDJ}ojeVJezXWlc$# zii)Z*HQ^l#Cd^EF8Ggn^5mxpEse3EyZd%P6GtKlF6rV0bgA#YWzynwS)?ft|9smnR zmi7=Vt2Oq&+}2;+^R-M>=pd{eu%vK=6D1Z1&7r|sWEwEb;KUtc3osL)FXLptN<}Js zlX29>B0^A6r6l4iC6x)tij89Ko?&t~xN`8*gM>5QkkD%-1$L5zDJ{%dLof6vX6^XaxJ}~5OySBMWE^aZnd|Ck zg$074D2=TFL{JwT(MWbA4>DEuaF_!+ffM)IA-(+QC;!8_ychm=n7;^ZO5@bqI)H}w z>mC(<$Mp{}<2Zv@{d?UsrxQ2i2&W@SJ0S4)QJ*Gbtq6Ef_0{%*kVN&x<6i@OyN7?O zuVWK7n;icM#{2ECXZC{(F%23FA{sQB7Y!QkWk5p_Kv87E4=`DJ3-88^7T-QaIOJzPXE(^_1j1LE_hZJ(kx4N&_Iu2fh!@ZGTmU5?$1%vb zA;-zoQmZ1G-~9Gkm{asLtoIPGQ-fVaN43tx#I`0PzZ7M_EnJ$2?2f{RD?=>#uXG%{ zJs=%sBdbLi*8ltgG+y|A#cEb^C|UmhB+0LJa2E)0S}GNsY|g_0myQs9ODw=TLPONc zL_e%Q8JF~tzV(FO%Wvx=J(S;j`A{G24~9Q>Z}97IZSO68+vwiYNA(3?AL*lx@1=g5 zelh+syWUSs>bUuaJZY(0WJ~j3QVh3;!s!g|H((XG2^tf?ugY$Z2+c}rd1jTE{EV;f zy*;WgL4UUP-k&7;lai9+)Zq*f6>Ii%L}aZ$Mx*i(i~Fh;T}SY1{Gx075J+w4Qe&)v zW{EqcA!$0657~=hIb-bi;Tmh_46Lrvx0odaQVeX%CQi!eBML5r*=U?uRcg6Szk zdk@e73v=6A@HLvfb6=RbnMpRBai<*|nIO;L97&sV_VE403ZAB2s_}xR0a7}B7)2+( zMDD1C)kZ&i*w?&`u?jaQMzg1|LS#MlolIUKXl(dmbJMl~MtiZ*7HV3TnVVVcD{d<> z)`gm0@&_9~NH6gfuPf&v*4U*K##_9D@r)txJhvvi*q&I7nph7l8_*0=JH8j~h<@5J z#$pC!6#mYqKZ~->8C%;iTASK3ag|f+CRzVe_S@#|MDbXwsRm&B-63s}fw(eBWhk*h zzJ)}Zwg~3SUrqQriil#3>z?3=-gSs5hS;rgQ;TVUPq^p*kNL4j}d8A>d676%%X(#F!m;@_*X4^(@PZrR*}+M6%*k3pR5X5 z4-tOs!=e*o6GKWmBuTn4bEQBq`wAjsiyIl#&D3>Z7vU~L-?9lg&1E@w4C6i0a+R|f z`P@jEx->22Dg1qozfr*WMXtXF{I+?-xj)9fI>w1i`+)KmG%~VwOoG$qT6%mf0g7-N z@h04J12$2l#&#q6I+_5&lldg-M2!Ul>W^Z;OI#byo4vy$)@g0K(zT{t1L}RD#)7nZ zE?Way;TzjGoY=a3z|vI2&o7z(TK$g@Jm0shHPpCkfUjhoZ&@3DrPgQ8f5|uh$KWHL zaDE&hgxUwD;+h0(ZH;iLT zy`4@Y4Vl}a)zE*FbsU9*#q_X*8#i)>ZwFGPTQ z2<%yY_(H*5xttsBZ?W=M*Q0XY)-4;~w+aF1!1>}&S&>B|@6{&Q)w+_dkhZhrmpEjD zs29rJ@7ZHH906#hdDcH53L@E;*6eM4Sk-_XFg4#nC^lz_UE=vy*h@$KOJ*Mc$3wWu zE%Oj18c+ji+A7j?o+C|(v1s6cJlioL(?l=;mJ#cJWea|Dr5^HTM*eQkqzI*!1sGhmC6=$)X!x2(Qv4PyMbaY>@k}) zwFMGfwFhq_S5!Uv$I{j4WwYxv3jN3g*jhqnAGsmUPI9Q34MZ?Q~Cktl-N>38GY?(#wi46m1O$R+YUZBxpQu} zX#vK=5rNhD=DX+|ds>P8ph}bD+9tHqiKO*|A1gz=seKD(rWn+&#SZA2$EM5%)y#Ns z&+Fz?yy$0)Y}Lo6cfjieZyjTY$cZm~tRKQV2Y-+QWAm(;NF&R|>{G&7$Onoj%dpiq zFpM7zBVo*V4VbOJPyitNH8{FqFU-C~X}{>tSkN`yn1kQSp<^@$88GvWfBHUf7kz=u z2jlbh25lvV1^>;_jL)>D4L+@KhvqBYp+(Mt7V{r!w`F*5Eb`-Y&xmo?wmb>@E6 zlp=7T(EQd{?Y8Fq41273+m}P)is4qwI!fD^l(U~b>=g5D63Be zaG>#Y2vdRvEf0eB8khlXrQDJyHm70~#F&-L6)tSOJ}*3?6_;1QFJ+zdm%b|dhSPAH zN}KuhC`c(={+Qn$GQgR+)C}f~0ce4-njQ7emS;WN539?PFpc5FEN*+|6~pFj?$)G% z-rzT<^vI6!pZGk^NJJ`Cqg2yp`Z0&@3^tF#<=*ASG~jM)xbV#x;HX{Urf z2nT=43%h3w#h%QGG^Z7=(|lvPaTjN*cDnEc962@cgo@?K)Uhv{(ThM=h5|KMZKMHA z@gbO^bmw-4)33ulN9)XYn8(;j$P|pi2;c(qvFjC_(huBav3Jm4N#!$#7UTtl1y%$*qS?<6R4V%28@U!3XuST#YfbN^w!JsNSYy20^wNM_ zC@3!*YZ7VfjqfK`*y$M;NfCuz)U`OtVezx=KN6rr;jU=*NB~ld0nkxe1A>4e8L0p% z^u;Dk9~5fpObxYl0;Z6$PJqHMC{D)arkAmb@D*=1RyVEl10Y#{`HENTrL|rQUvKi$ zna?ZPGUxLVXnrrj2(+(^O!);_HMeaMGDNdCB5)!XN|kDA=e!Q)#=L%tVAGk`S8X6t z(_Qm=4LDlnb(z$2%+KH`&|*#Mf~P8L){^lhqLTBKV=%yi1&ozxUV8~dqMt@U(V07N zCsM5=i-_U4^1C>jp&)e~Ocmy_QXcXrNpVkk63Cod$QI>RlUOOaEy>fa&4BLqrTk;3 zN%?i8t<&m4d9`JzUDgXf<`?!KN<|hIcz$#Pa}%i1)RtpjUM;mYdTW(eZ>=$Sq(07< ziR#Oi`doNfn4m5%d~W)1aRm6B{j)bejYj)6T!WC+AYe5tKNdlIu&;+6F@A7uPN`veK)Q~LM^dp)B4?4q%-3)r5dLtr=(nQtO}Rm=S!#X$ zu?@HhX>3DSzl|C)9xZri#x3ei9(d!&ur3cx<;26v$>E1Ic|i2*xA7MRXaSj!_k`O2 zV)RzbV;UdAMc-f4F!Cj!x6Ar=D6;!4+5=(`o?7(3d2oHgxEy1zEJ&+K^}*1;Yw&r5*`HT{qb5IjJ8a{cC(n+Kc z1(YQfZdbDA_Qe9Gj0SL_H5%ljt}tr}A>FWY3cX_dsvC-cE*TYvZ#5|rB87PyuE_$I zNGn@XDVQvZCKgxEt8qV<61 zou==Hf9{fc9C&u0f2{dz)_j3yg~AUX_WcJk>*`9ia%6i_{EU=(9C%bk4nMDxdhJ1x zke@Ah)-MovS`|Ee0G>_qP~%-!De0Wm=Vszj zZv2dAWy5XT(#z9c4i|2&!`0Y3gVRTm+0$Cd>{o<*Zx*-0`ZRq@CXG&QA$>?|INHcs z!l})yC2Xj-!p-$gL)f6vWT`=j3N48m>ak zDdyuxh`lT0-G4G64X&Z^hR*1cHz2YoXxT+SlrO~x1?_Lekulv^J{@$Lthg3LvA6c7 zx$TA6=1{`5CK1pZ{8cXaE4ln5{7urfz+d~U1HY{J%zqxP;6Ka*|L`90AJs4T508i6 zUIPl@tp5_zk84mMRMxBndIOHnSxA3wWgO6>0W`8ql`Oz{#!UHzkT!yF+0(m0J{1qM z5U!QW4_z5JP!Un=ZDX6G}#i$##3=Xe{_iO!(Ebv z{P3{+^6=XF|DN+h`#&6hnDvB%bOrQ{ z2Ma%3Dp|-6)8vpYJijmbbg)&CL&A$d|sx z*BwvC;q!aphr6V0;fFvBeudgq2PycE_rO1@2mGh@3;xYd#lgSl{P4GJf@v!8Qy-U~ zRN@uTdjV*CpCwty54!yF@WU3ipg!_nGP?+QG%__^ti{5iJ~daAR;7-FHcT(XfR z5MCnV9C;&4)LKi7v*k!kmKYkYmX#&O>?h+;+Jhx_OFj_(fB(&a-|vB6 zVYhskVu@QNn+^ZH^5%yBZu!y|{4YEa2Y(Ni=zD!ZpwEZ_eZe2xNLN7rJV#h!%U_v9 zmiRz^6+!DF!exo^zI-YkW+7ab7}tPuaZ3!h{bd(w`gr>Q9s%G+*o1(l`|yB0d;)eO zCgkW7^2JR=FU_Ofm)l%=X@MCYON#^=R@)HRBU>oeA2D`2{y(U@@)N0BFGIz9!{-#m z%TRGyj$Vd};ex6c<(YebK;J3HLC9Uc_S1fpFHBy(<)8g1KP!3p{2l!$zuj9t&i=w} z^GL?>e@R8y8rH`H7eny?F2(~F<8$=!zy(eb!6U>xY;R(g`v@>f__A(UEac;^$}LOf zXS=f}V>{p^Y;VTD``6w>yWgIhKEeO=13zCKXtQ8|Ar9Q-7k}1|@>6lgdJ_KVM(kSo;nFAb}=X>$D-Gp=ixA43;4MPlC8!p!#-3? zV&5KWJnsH)+SwoYNA5BF{xACl|4Zu$aipvP@Hd!`nf-=8@KrzH|0)6eR^T8^D$ap^ zO&ln=2MVhZg4ygC`BGR>VcgdPus1n2FRTy6mrVTm@s|_AzzIiOWOxr}%FvB-K!&m! z^X^&>rCah~7xQH`@qsPS0zUL6KExl=S+^nput;wAPG{fxX*|F9zv&mgyY>g580JA= z7A$fR9Q2HwTWP+|ugUpFLF470+HZTsKTukPoiGY+?1vN;n6+raHI$@E&46RBmZ{?Y z&i%NNVx}W#-^>IFRg;6zsR0B4=Fa{y#+25Kr*m78uiV&BVYHj)!aj>Yw&2mRuoM3`@5f(%cYc}HFRf!?H-4sQCOjfn z?Zi*Ol(G*Tjw9y|FpoM_qN?9sX@59?ACR%Lf;lGm%{2w$J5`6{TsR;KALFzz%+itD zO=Li<=W=}}Jo}ef5jGK(U;-dP4t}w71u8wr z^vFXRACPEyE@xsm6yr?&tblT|{|SMUb6pb9MsrSgp{`n0SA%*qsz>u4%xw# zUNtRdLc44{vO5hET-D~WS`=zT7Sz^^hZHKRWmVEfM7#~m*{WHpGw4-br9AT0L&F1z zti(ehvH-uBtxBa=t49qU!RE(n)mwvlG~y9K5~04 zz+u7u42K2zIX`zD`-Htqysp5#R4G?r=MukB)e7e5SlEh(f_DjiF@2p%?^NlglfH@R z#rmplCPWT>`S7zb#Mi*Zd*|f{{S?{f34Abzo+NR<21T>)`#apdHT|KT$lks%Wuhva zj%WMAOupgF#%`=I_CTsHjy{q-bMoQE#2-MWJ?58|{#t3S3=sHJU2O8tlS>H;NlTz)j}`V;trs30M5-@@sG z)j5oXL2tH4)>-aiRan+kW6^|XDfEn@YCQ4Ia0~cUhM(M1b$jh3kDszrT&(4k10%$w ztr9H?2MWSzI01!$gSzO)?6r8=`X6B5O4M^v1rINCEqrq0=Vnq&^woaGE3oN^?lV*h zu|Nz&t^x@?aSO0D^&R3CR3UBwFa-qaK%~S3D5_@60{r2-bR6HkaSIgpS^b%WfQzC7 zRy#4;sqrD?`ZO>iBSGLGo<1!A_CMq$vOi{unc$rnnfUVBI)1^4&Kbxz1Nmlvv*`SM z5RM$n)Ks7X%oUg$Pj*6Z-F>YJ;Z>kvo_T9x8Yr{{T4j|MsR0v++wiN=>>IYi{g{Rr z?6Fg9fIR@vbMkZ4^ve2a7(OFk8~IW+`)lMx|0^LR>VF)~&VCyw6`|9>@%f(OTx_H6 zv)?ZXCQkI=(}H(d*NT*19bZAuYo3InkioVtI)zZ6IK>iL(Rmm29h?hd3Zl(dMzizS zM$;?}cX8Z;kLn1}L;3iKvu;)$6jCM7&;Vwwe`NsK%$u15$&2yAWIv$!$3{YfOjSAC z;RDbfT7l^o^=yKBt(kMtKwRyj8Q*HSCRJPTdEJ5FkIZPchW4M$VJ+}Ho+`D@(%>l` z%|2%fG#9GSO>3(enBpRa#mnyeJsOb%Q9r4)Pl$2|TQ#~m3n&(pH z;Twe>9!kv34X8I!+x5Bm>a75e=DEfAzhiC?{{xeAP()Lyw3OgY3COwCc+=Ux-r5b#f8PPlHl$p}9iUf(ACTpHblpVl#f{h2k#)DwvL9mPUl>&FBP9cbn4yA-I2JXaJCD4^0HlelKk3z_(mp!@7ps3zO>)kEo{Db z_u>0Thh6&L@@x0uyX!92kbu4yEBIcQbkg^PJ%BG`lMUZ~@@x0u`}dtm;Ctb8!C#pJ z-yOoKY@z@BS0d^SdpAjb?LK^ylEL>Q1>fGd`B#mP9l{B_2j8phcIkKI*KWdRp8nsm zqR*&TZ9{v&VN8a1@{G+YjL9lnlSDWk9np9q8EtFrwl~TzZg+UbCUr{DFQC_8EyLwW zB;&3Z6us!RI5B5UkMtvd*L(W?GG3toCMo}w;4^vpUH|Q=A4+&?bBNj7$D|^xM0+Te zFSfg*z>gDXp-jwBpc9v5u|(?skZXc@YQ&zBN~1>l;6Bn{>LY!kDAdX7=lRu&&D zAOIWVB>tI-()K!|v_Y(bN|5j>pm87aGp?TRHI#`UNY;yTzQ$UVZXFp78<@|!$%2D8 zJ@~2nVhNb$TQ)YcnQPO%WnPsu2|_KW6lP&TRfKeVhVZTv6*ZFj?}6zh)YUF7a!$}9 z=YeH8$><|-_%%~j6;u_*KM19qli3tdJ3;z!Ryx-^`iy*QLapSkkhSy3Vs@yvt<4iN zizT>T#?60MT*-5+P=v04R+fSjRC?JVGE>5IBBl-KFcJ|{EFMJxW$wVVsmv+`cm~79 zOsE~vx?=VyUvvwZ|4TEeLLj6paJn(-$NWD-=KsOg7Y0I*Bfc_(3&0_Wy0>c z;19ymj6?5XBOKFm_yW)vZa$yNFc3hE7%U2=+sH2gIe(2o@w9kM0G10-{2c{tWenOP z8(NSaN|2+i09yH?pao(@VvgA2EZJ^(;?#i0l~6W zIK|B$&fZ!d%%K97lm)>ZU}(#b!nklcwv?2y%sN2PQIrpj9yUn$73pG^Q%1KRkf+ea ztzdH}r|jv|revPiI26Xr38AuVAA)7%%bm zDNp$jj)f00GrjJtV_QEAQ^%92;*N?=)LIr!SvV+o78XkMLiDT}vn*(bPgE-)*yS;$K zarfd#DfGnb2t4Y{+%M%CFlZ9qJOCD13V((ysggw@%`wC!osS^RFx+vdjeyA(aHee0 z^JJ_o7L|c*ED%XUDG%S!Iyx4A+}0nThxa^pW_%nAy5b{uk;P;>Hs2Uiz)+^f7z~)P zK`nB=#sEW+@tWD4OE!b<Ibf(N^PwXMz3g;=r~2#*>C;QR zFYK}U+e102j_%6*BLDKS%N%+Fk!8=$4TP3*GT{}V0rTBwlu=v1z~5e!17o+X6|$uI zC-!wgqB07LRSv=FP@HBb1iHY+GlUw9G zKr=T~+AskRx8@`6+RKdW?+ER$>`@t4F35x{LnhF{A^FU*w{U&ppK5~SR>)k)mXY|egE*mREc z_L!LZ+aG0Jl#NQ)(n1C-^r;iXtFIT%}Sh-IMn8(YT z(zz`IoLj$<{lvYI2Me)4b7=r`Wgd2DFm^iHivlU+0$>U}=~8o&kiu^NPs`lxPkEeg zaqTB0rAAT$IUuD3hf-r1!xkgd4o9VVLpISop<|#owFS&`Zs$6Wx&ci^R36wHDiG+6 zc$`hZZ+QE~Pyfm0Pk+_#BE7i1Walyp-CT4@*7+j2u3#5nW^YlFori!JK`jPSvb z&p!|zOB#J$8bQ(KqNTNi>hJupH+juTKqwzi&qC8+@rI+Iq+D5H*C#Qs>|q+ zE&CKO>*0-D2#BCZwpLYWoqBA-Bbt5I8j+2Vj7yJ;$;K^63pPL2i3gN?&AjZjj1;{n z2%^b!0>oenu%f(U&qbyHP_Kb=o^9(U(uJSNJoX|T8t1O({HWH7KZO0b75hRUHg)*5 zrtPWqpKAJpN@fW=-o$SF6LzTxmR(VsFU!&Es7Az0b7*48zojodN)e^ z!b(qWlyJB$wqCOLzeS4oBY?zzIuq}YtNDrc3fWKR^g1yU`~xX)HU=mL9phoBahGrY zu}3ZT{MH|MPz#0!>^`fZI)?B>V2KOkYV^WG@h)Jbj%*d6V(>VQc~(XH#Z_eCED8N= z`NKi4mMm&M3}wnLI)?2u!WuV}uXl!Wu=#p~!bMmR@Y5J*57?rW1qmV)E*qmYV~$xi zCfpnf%M{bJy3)Mt5$;yk%0#q|jEA+5{;xS+HsO~r{rYqO+He_8)S*>KyX6D|0~UlKRl z!)G!k@T%c5xrpj2_SfMm3A>dk(oU>>(;$m8e$!3YP)L6m|MY3-6`dTW<>=G$^=Spc z=4tR4$k=uhMN=q<1dw-HrF1{082}?8pioc(75}^{4Hr)@1|i5;zN|DnG$5zUj~_vB zeG%F%gNtlszWJ8SYvO4-xzc=zZ`eAe)YBrjQ|f8P-MLHgH2?GvhuH(UToTZ2Fz7@qbMquaMka^SAa6W~(dn?F}-#D3fc?8mjl zQuosgr*IhyBb7b~*f&&}GqGW+b~>}=Mqt?LLb6?nWaLJJ;I0R9MdH&P!MZzAMN|FL zmFy$qsvdcZ%#7u@yKjm0G0z-|k2WW$=N{5`GCc0JKIoe|>xZK67k`kx(UTbT?c$qF zUyHD!nJg4iM{e&VDc}@rZv15*)FyEiwYiaufnURiak~&bj@rzToZ40@scjej{;9q3 za+}&G&v&T(to1R^4B(@e+Pp9PFJYWaaXgYL!yQFSIF!|ew!C@bDh$`FFkHDqauo-2 z=WQe;7KAh5ls*g0?)E$iN6K2wbFv)Aql3dP$D@mnO+(2+P|z~XF^8qmWhhU%3>^a} zoz4c<3)?n)iq2Un~?_T_iq$9zY9Tkd1KkMu<(Q8u&W6E?Gu^2}-_ zvF^-XCaqueXS-8vnRLuEr@&za9*RY^2<}zu7*ZBCk{FTOo8@sAALhx(i8w>u_>JRG ze0Y};4uX@mPY*q7eF!Ie?0b;K!Vx%jfz4%*=}6#5 zB>Ma%00T>ZqXc}b>^~8)w?jbWn9Y6yyP#2k6_`0WsK>lGuD zYRm~w3stPy9-1$9c(^p^xfIsadd0f?1Kq($3sVFiij*h)NsKq8Sg6Kr8bCRKyAs?CeOkoZyDH2`bz z0X7Kmq2D5pgo`wX+P&~wZ2d@ne(`RHpQ}ytbK&QuLLaNqg{^q&N29&t+x+X#6^0wo z!v=FzPZalFo}eDR$gToJy18c!uFmfPy};^zHM2<9}$pYzjdjh+G-C!T>Df#N@@6mTUtXX58E{!iFGdhhcwW2?b_r?!O zp1k@l8iT|QLgEH7O+uqV6~gZqu)2Za^GtNJ=zC z<>_3%S+1J0j9((cY}Cm!wqAhwE;0^YvSa=rX3+K`TrrPLZI87#w%(=v8urs@_I|x) z$NXg553#)H;h3&=oRvS68l2RB3fVe)~p0mCp%FXsU_=Z}019>dtXHTN1e2zHRC&c|=q$*b{z zcWL{xk{0|8E-HDfkx9m$n;ffYGJ#96+Gdco9~7_Rp)*usV6f(oW6NB5vU#xx? zeuz)vhmKxU)lR*)UufdhpNY<+*gh283bxP~*Gn6k-t>!@K1n=y=pLa30+($%_v!^X z_>~ivebuHu6||iST7s^Y5h4>W_z0r&BgFUdN2}#@T;#7}5i`yu}T|QY@=1{kX@3pymS` zo_Iz$t_N6s!DA22Jq0Ui{Ysxn%m>b;tGpW2+SEK5_l8+ln!YJln$l-M?ROre(b#QW z<-9!|iZnKCZR}ZyN?_^}GAA5Aj(qtRx<)VZ1tZ-NF|IuxH~;j}e`hG*!dW#2oW6VL zZjXYFB8{p8ww5a8+3RSqnZ(`qg#C?YlR=}KY4-~9AEI@-6WN_>rV+{K5a2^m27t=XUc%}xN1;qCm_$~qg`oJ~0qS;yZ7~2R; zI6fSC@ab*6$^%;%B%4S@USNhQ!wi*FUc~(GL|=FgXQ}$FFZ9$C6849fck2fS{&3w& zE)V|i(Fg1)B9R_ok7sM6Lk2TORZaq(mTEHol%Jx_Pr~VTVHr`Fz@>POON~*wc2fOV zjYrw*=Bll&7(?4q-U2HgyRuB_%=_uLKlVi9JF+heN3RKXTio?B)9=R%ypAMsT=Sen-nZZK!9|{H=ZqqlY|Y=TRQt&~oOjwjOxMy1HCWNhjdkUWkYF4@NBC#vpu5b_b51pf zJ(U`}#OXW2cdi${3kcufgz&-Kt{LY5pn+Q9>biq{hs`Gwz>W$-2(^A#ty=v^s>hB2 zB3&hb`;sRCxA?NpCz>6ed8)pQ)<}cKYH2TM5ORjNME4y3I4IH~z9*fC#-8*$|$9b{;f;rTo1Uk;k zcEbtf7&P+h=U0nCs~md}hd3YS;UnxNG3v84xauq&i;5lKHAc* zSA4+`j>9hEPaVlP>0KLNqwod%1kY;tP{MT*o|D1mnPjNyi!FwN6D9e}&&{e(C2S~F z$N{9a)zARE^0fqbgJv#vaXCX{#alAOLhi!bPTw*~Qh1A!zrdjzg}&r}A!*Q+4!&-6KK|^$RV|2T=vKJlVPoSVgdLqh(FEkl|DpvfI>J`6y$`c!FM4QzBM53-MNd= zKPB5Rb&9158(ZSiQfuFDqcMcL~0SHVe{yK?)%S^3W-$Ir1<{_XUezTjXpuMnN+71*k(0 zsM}zzXbK`PgJx-DptjU-!rMsDX~fQ{G|@5Le|GT z^AUWsMD}iurw_g_dU4XT#+12aYaa+F*INh|gc*hmkvK`tq{IlfQiyQ7;P;I1e-zmW zFZ(YC;hU_FdFCnjs1Uw;_#WEzL*P57FMN|hEqv#YK@Euk70=*IN{nwSh4_{M^8GV- z{TLhH?^HYZuC_krneF)K;9Jv`e_Vq30?RmAG1ywkb%;KjSRP@bP!k3vzt;&4c1W2G zf>1~_#GHrg>=kgHRr>Y zFaa(f;qHn^W1~nZGqwJ=majs@s01D8TpvOxVNNlNktOjIgN*hR1293Io%j+@R&Jdo zCaaYqQ;b#cy9^_dyWT10!Jtjn^eGNmb?alE`Ok}OvN{SU#?x-lcf%+DKhu}=vBjjK zFTcdoH!~@HtrQWHR>AL?zAwP@RjClU7diC(o%J!#^x>mJ**zJ*$05S<|Fh%wj+{Qm zFX>~^*H8LDeXz)6F9fNeGb!=-wNgl5yWsas-@lz^)3^8nhrTaaAM?!P@$oy+_clbp z{{NT0q>nxAD*6hUOxykk8-3y-1DU%g%G?+hu*sGbi944N6&F~Tcs{-3abW<;$s!9foR<&3Aqa!2%-{vK-3mvwG}0iD2l;=WP4r3D)p^c zYkgo9rR8ZgA(()mP_3=_uC4X1_(0nVsCB>p|IEF2@7?SsfPTO4lPpnt(FVc^7g5z;j-Zk0?!iLJ?Gh2D+~s}?lGwc=-w;oZJY;B629ocs`Y3{IuN zLw;tb^%n?FR^dzg{Ij7qnvssUXKhq2Q|DETMhYN$^D@cH;Z8=^$QAcVL7I^|oZxDC zl$Lz>3NEv}`LgA0kug6!;6S=kAf8V(P2LI*e|tfJX>5?)k@f zyInP8ALF9sB5|Hy$%--LY7)W=V)MG0K#CiGO$7e=FwN{rAl{yPb4obBrNqCos#C zPuPD0)Ykp6r3db?dmq}rwWZ_Kl*|BjJw*nh=xdfI|EbjGXVSk{g=|8b1Lk1D*1bJnd(1V4c^vS4c?Mf4aPn9*aaW!T=0>s z1%H_S6Y$c150ACmrTVW2+9myGtGrd6Ro)-vQ3jHy_21d!%>J{1t?djkq;@G}7W-u?Id)zUcH`ERg2 z6NWS?|K%RE6VLm}C+xq$a^>p3gXB@>{yW?*80=i|xU2<#kpBBuz1^-OQteXxw@xhz z^qeH$u>V4Gk20N)758kh3%=92;G0cS6fU^_YkQ}8nY%hrXCd?)T%^Cnzu=0lhn=os!4V2%eH+~B7*U<}3Fwd8l! zAn~~ty@OvQWXqmcJobwDop^-3O-YfA-F3cqmiD18G;^?OCVtRN&Oh&CGt=mqy?tzFpXRWt zupJY)`_@h~e_3d0bsUl-pdpdaf}<18$4NS*la*NQ{GMy}QiPY!k4yU;`H9G{bBupc zQT$wtpuVswLpGCD*A6Tu6kd?dkKIHW$FMbRyqXR#60i2ks=wFLaCvACz?u8^DPBSs z`iT~jd5k|`M#I@|E6n0*zrNM_d_k7av%)`FmR_gm+6{b9md~@oU!SEw7W@}y`8+H9 z!YB5MKL33@^XJ*uJzmn*BQ9F5)33$KG7=)|B#rl|#WKWIJaK{ZVs+y5_(9{Y&u&&ye^%G!h?sO4bxkOmewZ(-lXAU8) zO5VlPP8YG|>Prb}Y2;i$bRGecJzver&%`-fY;>Y_hV3 z5Ufl5lzsibD-TH0z|mfkE>{h?sD@nBG=~wGZLI}OYmM_R6uDqt4a8#^fAl7Gw@`j` z*>wqABky9%)jQc>FU2snTx4%=R(a_2*B@FQWdB52#|AE|K$A-gn&FnjWm$W`sHJj` zJ*^t@v}$rG+!V9DrL}frFT>NzYE#YZEEoSTZ0BRzx(mzNcm_bx*{4&pPFvN?!e(5TIJ(W%~HeLc3qg&w-!WJ}R z!wog95i}0N$)E^OoK*-l@`};6nX?CP_*U>9k^G?X%+Gq{%zvvM%i^%t#unp)yL)oo zcc;k;i*o80`-zx&58O$lg*m>F*m(t!*kw>!o?d5}vlZBwO$jqLA6XTNO@2cbV_;Jt zb1T2HW^59ECAJrtwE=%yfih4GQGs9*#(RN%6v!4xWPD+$~Q#Y77>P>SB{8u4;_&}WZZDT0FcyXB!l=#?l)I&!nI{Z+h&nsWv9eE*5qD*3NVu$yvwX()%LbL6W=uM@KE zm}SeKqfXhWUhSWP^S94TBgGJ#HYO=r)dNKeK?@^9W2DM)q`{mVGG4zxG?b|T93B+p ziy7iGAzZ6c!Zj-Z;d;Ev7OomK*#qHf!PHy;2hd?#o@K@f$D>&@d{=l@-0RJeqr$52 zI+PP$wLk4xJb%VHKweTV*FQ*#RDhHf*h?;c=zfCqu#Sp?M;c)bWQWDGkeYcN+(al5 zqK(aOjYAdQT(&``{*f>>QaI6d7H1zq&ertEE^P$8GvVy3ah~Ftv%sB3&le$eR6+qY z`+4jP&cF{dTcMuS9%m{pwE7jJ?*?0OnPqnU)TOwNzSmM*QMi5(kqujvh|GkD1aR^q z_ILhAYJE2513Pa#fTUgQkVe%?-U2~9-%OHz#?lyJEn}8Sd;}pdnRyU4YqWGFTrr0O zjFNw@O5>1X1q$3w4$;R9jD-h^+AadaVsBv_6FUHdZ2!0-2nn9So$o*S1e@Wi zQu|F5fk+tS9(R#cb~MRF0UU_70B^L1c!vv=^!@5MV9DCgx}W=*$42;8_~vh{_cV|9 zZ@)Gk{^qpY*;s(I#dzew?~<|7f$gRK9@{T!+?`i{y-a5F)z?cfC6A#(e0+hi|8vyt zXF(H^`%W>rFSrNX_m`REzMIzd%0V5_%7~0aF?IpB-1D-U0+&W3eT-W(KvWK-K!}~} zbCk%=n{9o~2P^*C%ht21KVp*xqD!hKO2?z{y~oOy{0!iLK3pM6B7izj{QzdFsP^0( zoBV=}0=|R}0FwWf zZetKJSJ;w+3&$`$boOMi@A1nEH)``fX%TeGpO&>ey64EK$r0s8RWdW4$p~7k@4*L^@jFJR~E@mNAW|_0FmP zirZa5-j6{ez$x{QQjvZ7Yf)t79qr{SQ)=u%VjiztX?%ANwOILkdF|yNv2kOCVC8@7 zDF0lkv9nj=yPd`gmHl`2gSZ=HR98cKakMiwi$aZ?j0R8!I_c~|cstCv=R#;C{cNAG z*vZ0Tl{@!;-TIjj(EC*mgq@fp4w%6qq$?(VLr8-crJc`Wx@=GB7y!GrhE<`=g++`$X?^FEn!G6LIw+qP#?jgBK z=LgQc2ehVZ3;gJ7`a1_08|X2`JyY$Hmt-ob>O?-}**Jspp%gE52ruEFMlIG5fLVJr zV)0akIsS`Pu4H%9kF9*cI2Yn4M(yu+C|-E4y?hIJfqDj#@i6&0Ub)5i@-E?pBzU1W z(Hkv^9OXMZ%6*TCNkbp7_n#0G78lMq)rg)0UXWve&qgP2F)jyH$P1_9+cS(?rVB5e z;N*otd(e3^E+;P(Jg<162#Avxj%qI-L|*vF$qQTd0Nfw}xA9M6ItB3;jDJrPZupC| zlH-97ygzZlzRCNIKVu)C zjJ8wW%YgXzlJ}7U?!&byc^^Q;;+`+1jTF!vN#SwH`#TttbSdw)KilPavKOFVB+zk& zWHsTW`}oHB;v?n<4Z??dTLl1pBOZd;jSDyb5wcW`Iv@r6}UT90P4NudE1>c zOB{_7j&bNO@37oCcha1xPptgEbpM?3RP!VSDl5@cFr#SMDa}H`6JaxHEYnS}X@`8n z8rf`Rj(Wfx84uk-#>5`8Tr@i$IuBN9q<9XUb}dioSDW5x_$kyBLY|$H?K6ybKS zv&GY^Ow)mL1|@&N(fVuc2j=+f@Ad;6psmJ@9H4!P1VwZ=BB1ff#cFH$EuVa2yZL6E z+iq_Ld8$>TGCFVciqY9X@_wM%whNtYeO zG*f4JvDZ@e|I0pN#s4iRQoZC#C#Bnejt}4ru7&~M3ZBzCOlJ_ogdB;Scm|BIjKrzp z5q<%W5C;6gywyNH$9QE0t-~9pH~4}Uy8!m-Z|vv*Z7=S{)60u1&A+9+`~_I|eyl5= z|3_v`(F+)On`r*eVcp?R#XaXsI!F0O9p%X~W!+!EcfF0xXG<@N=0D2##RPTNn~vo} zRQv5?i^-6`m*P}=YvpPzIB`M<4&g_}*Plz7L*JAaL$&znhFr}J!Yw!om7HMAo+2h= znA0sl72OVjC;o&cBNqgr$ry06G8u!!VbS4>rUo^YFYE!h90B+2A5$jd-E)9gY^WBS z3#EmL#mZCZ2CNc)-0ZJ;>)DO={&O}zr|BzGo+ucXf>97E5W3Y%76#poCb@#U!Po$X z#BHAm**p*1Up!-dkx`IM6_Ta?Do&|l0%kXA%2h&SA1cV1GC5X|JaqYSN?D|xD9Bfn z%vY*;W3bNMc4drLBg$4-ZAK>C#)ss!o%6=OMNf(`2st2BdNX zVvEkEp|5CQZgow2h@iif5uh5)pz z;7ShP9oSUJ4gx=U78MBhMw1}$^}k9pzUd0YrdK+@DEo^b3dV$AKn0RyJ429OJk=Vrn>eln{8T@8!gB${PQ=>H0(@P4(vr@#sBrD-{Sw+LjI2}lx0dKemj4RlN7R0eni%?*je$j_e&Pf0rSLPAee)(HNxCL z__)h|j0l6$Wq%i3sLMWAv;^+ZWuWm1+ZBzc3px44&lO>VTI?y+ES$V|lT3diuNEM+ z*iGhh(0vKe7P_m}+@e|ox?fV|qI>6App<{W*~Pf$`P03KX*-PapA=_s&ldP8Vu#}% zzaSt_kWmxR#}vlGh0$1~7=Iyz$q*jn5eegp5hlYk9L?G>Cd45^Su;Xs>RboJlA$}o zRd|H`nZ{M2278JRehBcuTRy364%dPp167^X`k0xq@XTl|MrOm0P{BW@0aZ5m{J-Q= z-vINa+-V&*$~UTdu-77FZm#&|J0@a=?P4KDV?kI z51il{x*2%<)@dSRbU0KPj)5juSV(CI?+|E+S7Ou<6&iSRVin@x-wmQ_cdDvS_{8$= ztBs#0(9;feaeY;~cfU4O04nB!XFIEy2+BBA%+I=1G1=rnO83+_Ne51pXeF2+`I;XrLm-LXF>7ibQbA`Zc3!ENY7hgjB`~j$vZ5Mvte6Q3 zK_NTCYl@C71)$?i&7`9!1By9271UgI5NYSOc6-#Gr-dzv!s5~C?fEA4Btv`NiAodf z4n0m#;4~xJ7yO8g-7|b>Z>uaP`jmGMA{v;Ya~(=Q9((V!!kLSE&JiN_#zLn8>?#~! z_z!#ZAisfU$1PCb95aY8kd2A`Ye>5EIYE%@uI4J;#{){>p0fhUKrkDAc1~e@(7Z{>p)_YAkh}p3g zaVMQC&;V70tjfj1wgeu-F+>t4&+>I(}9^6^c%ee*Z5S8SDId8DBXDRF*L&&tv2_&sdCI-Ncs=s z<6h$_e2%5{y)miUDkV$3(keD4xCVn4&}6*dxH$FMJ@VOjKR$!I3oRSMxsEx;RP_aC zjT>+YnZon|E5gAOj=m!a(GCHuw|0d0m3l-k4)u)aQ9m+SH`evi z%mZH>@p#bZAyOD{duO5#lu}tNSMPxx++;ccObMMOTe``{aau<%u~2(Nd69a=`78&8 z&Hi@GuW}RbtIz43!x1wSlbw&K0<!^E_fQ z7BoixD-R$C^>gs8<~2eHcB1Xa9mRJhCfs{m8VL^c{98(4J{x*lK2nTh(wD@w;19?I z|9!?RU!)K!bLGJ z0=NkA!r%CTukY5AT8g0^ng{q+Y{2K6B2BxlzuFg>w=0?Cg5x_|!i_C+!+keI^mXCp zajtOE<{4z56#Fo~blY&!BmyG1Fcb3f{e^+9-yeNo*Y7uqhRP0qqqB2ueib=_usDNN z@DLrS3xcWr>^n~?t3j-6A;pO@%x6ICyEzh5ythey@SmC|%S9{%aSQNjexG7^9{V9( zMPqh|K2dhG?_$#>M%6lvd7*QJ&al;FZCj2NwXr`nGo@RR_G{{`6#vBr=>3N*!g}NU zC6$<9iQ(XR<~Eo5_5OMC_%=RvYiC>Eahh-dd~vVdf6c9galXJ{;>>G$|3~G~q)g@I zSOIQOY1)g7`{&6#q^sx9aieIHzazirzu}Qr#lN2lM(R4;m{Wbc;p2_@2 z_(;dQ`Mijg_B2&HqkY)eZxx(d9OrJ9ueHi|l=h?+Y&s*i{t&$aGxrt96EF2LnNwK? zv$#rUh;X>CE+-7JFGr@H7W1ju0U`*FUIG7qu|N15`kz&Hk`Wpb>~3k1C*?l`z;ULs zj-USSEt9d8O9z-}zt?c~V!Z#0cwij<5ba|TS_H9J_OiUF^wugJ#W)trR`zYTk(M@SeWy3I0!3kuyflc8{0~`0eP2y3pKmwU( z3$M+#wCJr0KRFn`@YPBSbfgfMf^caxuw;Y3A`d}sIw}qkMF^}7n-}*yUZkpudmilP z&EWwJaqKq${Xx!z!ziog$0!%Xs9{tz?(yu$GOA87wSs?YJ%RE+CjwqJ|8tN6bgWbk zM|Vn*4mOOBFM{jMif0EbFZ5Fc3RUOEJ#j)by-+kb<%M?RU&lRdea%*;4-IZ%91>0X z00ShAi+LsjjmZVZ=#cQdimMyPns?QBS8WW%onG1yL+lGUxB??4(X--X#+$-mLGy@O z#T&2}f&d4~1;(Gwkjk<9GsZ*9%$sVJulx{hV{=h+SMj5i{4Z5H;c_o(nO!+xcy=P~G9Zf&W ztR6xg&6w|G4fQ<#_GanN=a;MgJXf5CRDb^L$J}_K6hRn_D`lYgt%A{3Uh9oNyqV&gBTqodbiE;0wRNvLcq`OkQsPrqvGQFl($KmMnVDow@M zQH(S-6Ed@4@E9JL5foTPkq>dw(zZ z<~R)4q-C_Qff4&&kCU6sV=CvZZ$z`qh<%p+gr!G_aJP$w4=KF~#R28UoGBg3PtPsW z^FTqB5^i-M?Ujm)XST1qR~G{XBM;beDhGU9%}vWr5{qsuGG2bJhn-p_EX)?=DzhMpUdbb#Qtk4Eam@aRp4*a_ z(*HP-mZ(B*cJs45es=K&hPFal-WG64D7=bh+!*i-TSdd<(1W)8!2X!}M69yqKS37B zY_^@UzHgtGL!e*)WtSkIeFi(`SKZbsH9mqJ!oZ9vbaG}bMLmOcgS~9}L?wRhhsbEy zPeT+gSR;HtsThYNpN8@p{;Ck=Bp32X^``ZyJ;XEUvoCs5)|^@hqG&hv)UPV}qf`QWihUKNc*gny z;2z^w7_Q*6Cg*4Ar&~Gw*OdOx%RsM1PYJyiOT42qy%0Q71_1lPu()t9c{}A70GEYQ z8v4)(D{y0-;Dlzj{D(TlJdDt{V(i9ypUpM?uoBnmjLpisftn?6_~_Sb{U$@-e()NWYkY;t`HvH7YhD) zUBMsyP%?=#y($XInvr0?V&dTD@q@Eg*KK`%wrBgDncBk~f?9K`d%KL>ydsSch24JgcD|#dK&HIEC8Dys-m6~TBHmrM2J=`?d^9wlv0!`{$ zv94*C*SGLh++tqmv$@|S!}`sQg*W!hiR5ia{@pm_Wo~Sb$#A%HH>*;xXFvK431q^Z zx1RM)Z(A*GdHUDAav1u7=K>=i)BM|8R44u#FH9y0kV$IEBs2LbB9P|Vh~|DOC_f^X zGPTM049h>z_F;+ZFfdSHCZ@xm5z`71Q}MpNcTNJCVY0B;ml$VV&41Om0B!?xL;lJU z01LZRYrOs=5LG&K&3_ocz{8+XLz5EEfBYURG5G!`kQh8;(QEU1<_yE%c>MhYf1B{f zXV%|RTw7h<%<)@Fe608&^nUma<|_`A#w~$y0Eti_$kWXzV|J{zg>@Cmpm#=Q~p2pt=QW&Ls;DG zN}K*RKNyF9A@=rm=Vw{$ZRYWH#K!N8?(xe}_&tIzP5i!;;@R=Lafjfy$@y6p`~tM! zwtPPGO$PpM{GHIJztrCif6pXPhk?O#Y;(yjfZtW+DDgYg3VW_z#zp0n!*O*jHEN{~KH`0{){`H#2n8U|2u)kOjaXJ4ydHOaqA^14|!_bn$gVHGyZ}PQCT$} zR^zt@zcqSkZA|UD0j$j-PS*OA525ytw8O8VX3T-&yb>r0&5?988*@Bl_1J76fjuER zDyo=<5NeivBCByuQZpfOW0u2OGVX452XkF)P)!}VZ|W_KylCPuPKp&v%|D1dRg(1 zs+3KmUqQXypz=2zTZ9&?wY0^?Pk&`^5qiu^@NnP`gPk`SKYt1?fCRg|#-t_b1L4ni z6Av{I9;ck~mN+|r-VChEfwnV_>Sg$EtooXHPNZ>FXAeC)65)OvT3+<5jUSA0Hwt3VDJ|@lerN zX$_7Kjg{82SMkYA<3jmF(xcFg>|S<`xrap466wE%@{=;8Du2rSNLO!T@~tkb&0|fE zp`5<(N&Fvc;{W74MrO3MjwU*-N-*c3gVzcN#`U}K)TnzLtIA?) zS({lyDkn=A#r)5fpOn6D{ci?+zi5dl&QrePyKeM-BLQUB_vH%I$5KsJeIJmS5uA5< zZ4tM5MFJn@ZGSxyrx(vpO3WQTj8HD9oC>o&!XH@T1&>E0ASf<>mVI-5R^)MrH7>LT z;;dV3ff(H35Qy`aQXnc|XOQT4#{D7@#S2<^(l8{m|2sk-%&X(kf&__=Toq&GSY{o{ zb_AYHrFaMd0eAKvc6BltKc~1XKDMV(5tDG_t(v&sp1<6X`fL}HUa+4RKFc!#@>y)< zB77EVUWqk9fVL9Le|h&9e&Q1fjFMlXvs4_bfpR!Oi_L^XHPauTfIXb}65H)I5<9#^ z25|ow$I!RICk+yOL39za-@3w+v;80pQ#l4vkDlTqblJOF>_OJ4EM65BVo_+D8BD>* zq1gD>u$=ZHh8(76X{7mvf^bxqd|MvSxo9}LDx zwj1mA*Ge|k^-1PG0bbDbJPjEJP1hCR7_U28nk!IF43f?4(3X!&%)~vv5}+A^^Uy|- zHlxZkPMCL>h>%31`96buJoIG-`IyPjVcc_pGYCZQO3Fj+q~aqNv3TbA2;)G)8^&P@ z-2P5*Vkc~WBq#xgZN}PrdSH@^426E2_MhJFL$8M*lu<-MF(Z@?{{|iQH->7^VFBZm z$IK2x8+P|57Twuf;{!|*5^|I4%yg`Wn-V@JY|39q)_C)vAuU#m@ZU_(ormZtaSOH3 z{Aex4N}a;C2?Oqz*C|;8&i#xXk3!b;HzKiKmGQY=tg?d&znpgIJB!)OYtW6H6+~-C z;SQ~}Pb0&uRIzc?T@Idn>5DX;94@T|=X7qcn>~w7yaL9rAF=SV^@&5f!@sEoLbQw) zE}RkomT}L063m1+k3oL`;ilH0(R^pR+CCCE5;D|w{b)Dsv{wMRmrz?;x@lH`XB zh~3QX6Vb}~`eR>#Pr8iz+@}v$R`VT;Dt5AXgqzGc)t@Mp063dk(;LLVLV52InIsM=G0yl2FIbCwJ_f~ zWk5cj|65oM@OXZ9tnaxjcYBYMTAIgR#PBmH&Zu(ma`bCF z|H5UGsxkz3#_YLPs!ATQXCwfs8uJCO7~_yQIwLl=rs+BW@ZHhcJmF%QI=H#85#VI~ zla8j&TTk{0Q>Rb6AhoSN*QbZi3ZE@3rhj5iTw|5nGNp=WnP);-%2M^C`k4$@z60I` z>@-%ots1#85}V);KgWSaWo$-4xOsm(2;#Ch+&m$G>ndDV<2r;t;P$3u_Hu#hkZAm8 zSQ%596Mlg+cpy*jtBUo!63K^6+IIzs&ucbPG#x!EN~o>t$U94JZBe%d|(lGBgbsb5gWxkI+ra2r(+z56urETWc^kBnZNB*rphDk@ywgso z_u{j}t++jHv~R%!01Ym0f@Tkm`~~#ZrpuB-I@4*blup9J^^0D zImKGZOS1~Gy;CkuF%CxJV*?_r$oL%_C~MviQ-Ta60s7+@LWJX0xq|QDkHPnNc!ym( zGY8LpKN|a~(R}vSa8okZx1f$lV_(FK_?&CwQyD4w%d8Pv9OrY#%HPKt%&n28Z~dCD zw0tWNK%TQ-5QyqOHLx+k``ee9h+vuHR%1~@5V2q04y=$3e_Jh+$=cC}FFYv{+JFbf z>(^Qmdf^C2Xh-=HU}%1Kr~0mn-~HbHZWO=6Mjwy)iprO8?feq0>H7C`>ho7sq2y{R z;Be#Ii?CL*ymfn&7~#D^hKRtWZRsqhYrPs=V+8;q%q5 z5249oPod`|8bYmWTGMg8T-G$Af1#|Ys5$uI%pobZP3cdVvq*NODV-u|jZJecQ+n#8 zY^HQ7{R1(jrDr=#>0gy8^%0KKlnS|a5B}b!^shxES~FOWmi{hm86vaX-`kYV6}Umb zjasI3B21}LRX&)q3*k9MQWo_{+*%g(U|yRR)z52}Mb$8yYXKSrKm`hrr~XGHH@fyi zUD2~I>}z;*nb$I~pEwO{?^Tqe?H-XS;rpmQQ5pRyz!WYC?2r#NSw_EUdkVz{UYjWX zoYyWCPZ1Oqgh7DdsXq$1b%T#-@WZh9rU*eC1p1jJ;Goch>zTPCS#7*PQFn|7!Fc1g2NJ35s|6&&q5f z)k`X+ce-PeL!@3)BK6!sX(ELRLdNg-^!s_IO~WZtr_5F&Rc@j8y+vw-z4`hz!aB?5d|C)>Os`NDGN1fi4|s(YDX(xMJTGYA6o>qV4zPaA?P4b4_lL+{JAX-SDm8W}F;o1V?Vf{{b+-SVI_KJbps+aXJzhAO>kO zxwP5m*z>A*zaI5FVZDvfRd%<(ZuHN0cl)Q~&2CruhK@mrPpV=tarZ>k?Zq6FNViuT zFAmJq?N9Tmv)gBi=vn)yA<*CLpycKw*zG^ASKU6rLa!EslIql;q{;;s5vgwBo-An~ahB!unXFe5gx22*PnwO7z$q7Tg^$-mzq9mt+ax%7-z;wyWeEK7W$it{~a z?>4^Yj*#oiKpN=Tn~}S?hADiSt|OTQxk^b-&LVC(u$;S(;)lDB;)lDB;)lDBhMJeF z-AC851pBn;Dl(?5JgdNEY&NzM-C`7|r(8yMA}$wc`dX~!kODievh2q#=<4e9j^8Ufc%-WK%!V)2S~(v(u0xY_tfw@hq!>{Lu%x6AC|ze zkmtnj&a{r8+W|1xm_HHb=5LC2YGYS#GGcd6+&Z-x3=i!bYiB<~^&bEH(== zRfAMa3_b~e14={n`{pmk#g1fYP$fCNgpNd-orKF66|Ib7!U2E&)d75GEahu}3-TT3 z8@`kDXT%Mw?fHf+#-s;0-vFo2ns3-*{FsmOBKmilE{NkijJiQQk3E@x84y-(F$Rja zNCm0cuA3z;LdWsG>xh}z*Ynns2h1@tBOmXY?pnY&`8MYL#q-z04`B}mjl=Pz>-kuU zp?iM$-M6#PFULKBTYF%mUNy&zU}P1_n^Vozn0Bs_sa!|=jB_KqF^DEQ0YuD4zA8># zz*tph&rMzbq>7gZIAPPWs7DSHkTDCwAYp7eICeV5_R|B#;u{?i*1B|>grt5{ zU^Z9H1VgJy{$rF%f=X{gi@8(?;GQ)`1U5EIjj)@%iLVWn7u5x+u$r8v8CgxV4W zPCz&)OZ_Jn`&LW|8V~!WgC}Am1uSNUmQhng2_4TJ7+LxTNf8U)s{0X>MuQ@edIyr5 zO09G!IF*}{Om~{IABL;-XstZqycG&K=0t3G1wRZtG~Szd6ej?iIFn!e=g1z0`qWzN zIgK=}eaBmWg_J2K{?ig+)?(qmZH-@O-N!im7m%n9#5+KGe3uF}2}bt!*de!=({%$i zbX&^t5mJU}0RV&UnT=`$1b@qeFsT=Y4NwPfJe5KV_3 z0RwHU>nCJ0KD%7ZA=jUs=clNC`ZGL$GNkGATqZ9ezkEnT`j)y#OGOg;YI+~hdWm}h z5>I$v1d=9nbuaXE$PY69^gfp481FujlA3-L^z#yvRXLNLtocfqEHzi*F8>*lF&3?< zVb^1;Zz+FZhVqcFZN^16!)??1t*PSI?4X2!hIWnLgl7rA(FuP!3R%dR?WNQw?p4p( z{uf_PB> zImJrUf+Lk&T4n2dXZc|>usPm*V9mhYfw22t&tZMa;y3a|89un2#bV(`=z>P$vO_s~nAn)i|Kb4Jvx&_q>S@X0bqAV= zm^|iNF+fyoU0-Duob;X7;KJvjj}$)Ysd}mKnXd5R3*uAf#OJL;EPO7^gwK6==wSEF ziMNihbs3*q{V_?Ld&W18gRTiNuxIVOpQ$%~&fci4rRFZBc<{HH5q;S-UY`t=uRx6t zbO-8if;v=z3Ywsb6{r9hjus)AUw)9;3>)8CYDEj*s_rTgd{==rfM<b?iqr<->g#wa&Xvz zNutB0N|Qcu&xmc{CXP9Bja5UaIXB6NV9`;22TQp45yzA{ zKKO+Eh%N6^@-d#3iG2Lomq9+}J1e*NFO-_g2F93EmdFI?V!V7c2mAW?5Oqawn0}=4 zz^%sC<_{lDZ>(v3$n7vB^ut~JojA`;f40~5ZyI2~zn357vfme;f|`Y%&h^N5FG7D| zhV=yy2^k)5)gA5d{0=q!JimIjACupmzTdQ3mN?2$0;%!YeZ}|$=v`SE#Qk!>7t<4) zPj-<5>)~2MiIu5`xUWh)nz~PnKh{+svDAIvxqVB%Px~77vVD*mcl$mW=|XpNqTd;= z2Z_tl?l+~~j|jQGxAco;pGI5usVi+Lw&~o9v)HEC0EfIK`sH`7&*fjiGM%6@%y4zO zTyfviO)CWwElp%;bI9Oi#hSNn0qrEU7$4#JV6nfkpG-Bti)W z&})!WPvK^MmPele3q!H{34y+RJ-{-#=eU!|zWB^>s(TM3*UFfD7)in84PL~*U2<_NOmQr!pxA>J%5z}gZ zu<_}<<53ChMR8)#?qt%W0q(WLC48g)S^fvMsn#PiyC1L%yhkzOOu;Ko^oDJB!-HEe zuXP7hmhlY^yMeZ1v;{-JPjP2{>8fA8XPna5K3u*Jsqg=k{=L+HXXg5({Jo=`<*!dK zpRyP8T9>fCx77D0ewFFpi~W@KbF!6pd`=bOO^(3E7Avq(p#mE^))!=rdSn;`+VltG zbX8QGMvx4>gpupUx`S5HKS2O0EKUerEiGB&MN*}luX=eQVt;jo1qyThHUs=;Ij|>d zdTcB2Q%>w58O990h4T^nrz0CYAC~e{tT!MOdd^yG>HD}0H7^x7`t2e8s z!*I(R_r6eEuSOxG8RDVow^tE>)u>|LbVsnsn4n;zlIKdJG?wXTA{?_l0!3dQ~tY3ZE1YF;y0ZLq7#OrcFS#Q8KxuX*3H}hHs>N~8VVdieWAF(`Q9Z^^d zjM&mf7LP3zC~;lGoq?b|=(0Q{mF!(_+#X~hi5iDaOthYzD#R>enT{sHF^MTq z^yPlO*gInC%X9Xn(2mNzt|`9!F&5IXK@YkGkru>4Uolli>=(u8zN-G9?5pRXjd4AP z*X?q>e93-YmRnxa&HF$%@89p&HT)&ryszozeW087@AvJd{%+pabopM_tNETZhmO2P zg7o(GlecSpM`jE{T?KiQV#b0Ds&Mx8l#ipQ2qT90eSGbXKKSWqA}Es|1(0bRR8L#R zfk*zv*Dhm;tnc9(sG*XqaHuN`sqr9s5m{JY^|Xd0;xBL+gsIx&t7{nNgZ%_#C~2F^ z+;s=!BW1WcKqTn5_03##uk+5X14u^iF(YO)~%W zZ$Lu*R@LZ@*iN8iTYY~`XK;8SA8tPeUN%Oyt#EQ$>W0r)q?NSQ`LIX`-5uhy`p>re z)b}{ar__rg5Jp0763Cm3gAq?sk`(tm%`q!TRIJ6oX_id6mdu*?*O{9nK#-6NVGe5Z7#WixwJe66<0^_3h11MUo*E0Y6MB(b_6yv7qtLYa?uB8l8a{ht*n_)^Ql_X zWr5uKp4j&i!!JZ&7i_FwsOeZi1ZFyp*>I`(0I55PL$&tXMN#d$CIGO;ErhusS^sww z7x(aZ34^qLkY}0xjD3t8-VMf?g3m1f8b2Tb1vIUnak@MlnHIf4VE6JIH-mLWzstI$ z-+rJUW=zn;6D(g=?Isbh#NK|KF8Q6wb(cl1;}yB=`IAocVk?blllGlnhqEkpD0R`R zzdX!9uhWvQ;inaEbou8{+tA;!$C0ZHetV{XKe5O86TcoI$i4EkVoQ~(UtT0omdelG zf(QyC%OyW1wp4!h3dE?TwSZ7}MyOaUK>d&4HHt+5lw%|~>iO;H$vKRk_QLwLZ$VHb zam+(J*3Rg7ZXzEpuOTLTRW}M%?MtD(ZzXEl2kPp}*|BVs3KOf*3^cxsT}_!?B;#2oA*1g;Grw{ z%er|#vzzz9Zr<-;zjxLCF5l~SKF0T^<8tdF-gIYjEXU;vc86Leu5~OV9ObggDsttR z=?^v&qRe;D+ftb>sre3hX6a!&*X6+mvyk#$I;Y3XvUUTqi@Te`nhLN3QbT#KI%o-+z>LUs33O z|ETNUpXh*|Pu1s7-07sxCpgBa%*rNGIbm=yb4R|K+{*djVwXG4{eEL@4tk5ch8z&K zHD2S*smB;V(orq|B+imG&MCl34ro{S%p19Ht30*t86B00Xe2G+HTDw0?#Y;mX2eu3 zkPC_x55~j?nVl||fB4gP*5#bPWB#2hWm=IwzuYG-&&ZUwaC^&P+;mh2Y;D-L=KVod8$8=NN9{MMSq%^7>Q>> z&@r9)(VhQ*RbPw1cH(T=YzK}IHcLE^Vg!?m(&)>T@fb04i?gYS;D`P3hP_Tgm{33_ zw?iw_AQF3#li;?_Z5i_$5q{D*y--DD^-*$iAy;NhEHa*i8vzlTh>Z5ccBV6qn%;nQ zr#g4W;4bJmZ5GIx53nDDJ{es6syql{PXg@nhBPsJTMAw!kS7I*KB1PyY=Y|30&LXr zFTiz3Irl0xDW zG~=rSpbqqDBCvavPqHt4m+rEgoTh$EeoJqk1jY6(=_Nj)+BoR{xAvvjb(0jfW z68SUk{ebySb7pcZk})2NJ?>2T4TC$Y(sCU$$99&X0>)B$h3RO|3gHg|G7It{(VV)| z0V$XUDPu(DXN1xMMT61-{6P|C1p&oN_9v7A1!Y&4ah*a!xmH2(0s=G%BTFv78?l@v zpP5dRgF{mK&zxvHV^1qRgq3uw~@RrUn;At(%RA>8sem4`|@$gw>n0X}RBTt+Q{{TDVE_b5;S6I2n0 z^zEg7@Q%_J2V3D&HPvD|y#dSVl{DQ4KDHU%)B(cp4u2b5T}2+PhNwpM0hO@TRXF#G zn?aqj<54(L2-9PUhX!Ru-{2G4yBAOnv6fcO-(MY6@2Vjc!g5d_miN-Q~Ab$ z?kIX0DXNu7=LAiPrjnYecG)>d{q5HsBuV}KZnQwcuuHl*J@xmfgiUq}U!LfPrAd0DJBMt`$th#So1H(u~RSwV`=?NYwM39b~B_{=f(BpK#iJf zI?Q71Bfz#8(CVK_MNWR|RzfA|d{?n>LBQmKl!TflF@TD!daPd=zt6@-pXLLre)5NA zJim(x-^$jh4znV*ofcM^I@xVRxP!w%S`=!t0@)-#^<;MiCpX5w`FL$iUY?`e;J z3`La+bNN{m4nrEfui5eg)B7<@^jP$EaBks*`AS>hB0*r0p^CDCg_Z0o!p?;G2 z5vj;z0qNN3+uZgiAkn?=+a#$WaW5!j*2N!({OMC`IH3F<)wq^Rog@{R^ovi0Im5C; zTTrt3Ar`%-$|wSikwU0gw4oz<=L}zGT2~L3enLo#Peavardszt5U`ZkiAt17{PYC3 z_}Tf?eI=bEQQrBz%rls;k4%5ECr)t8s>w zw^fS|JX34^pl8Zk*GqTF4s;{l061KJGi>$|+`b%j{P8%2FhVZa)gp%DOrd0pso3bL zzX#Gec%PSvk`Ft}!=AP0q4m-pEST=TJ=~bw-5$>#wdccQyK0ZGb9>VJyAtZki=7{h ze;kT^qA(n_mt((gBakVBRl5HYv-VEiPy3+=nYF&Wp=tGXtu3X#og=ca+mUvCPJIQQ zj?o99R1FobOg}~ zVh&>-_YY#8l*c&WTo3fbM6c0@7x9UHqvkrSCg#NyULXp11_BPIq26L#dkpo89n~}| zb@XpcGR2&<9$%}xzMZKtq4Rr53(NHVqaWFga(=%notF9%JTVejjReO+V>fpnq;e7q z*G~9eYs6xXPvSb`@J8&1g0E869K4AAm)_p7cgQ>O^{3+tc;9{xc)QZ!=~Z}QtfpIQ zPGNj6`sUDubN07_zww8H@68N<+YbfbpBaAQhk=iU*vb4uw?N3SFWzq)9-xb3ZHvEr zfU@|#;pjj5n(c+4aCn2nXK*!9u3W1lqw*-z>d3^EZIC*Ynu>$|RCduNa^))j6M2-e z{GYAzD!&DgE|DvDd3ltv{E4uatbd!V9OdfHkL)$1_Uh+<%A<_sZ!^nZW8=TDGye0l z~zUd3O9Ky{PcNP2~ds{|DvDwfgfud6a4OXW|(tk5jl4gZ^vlKMeB% ziQcJuQ~u+a&DSHM^1Aj}Q~Cn@Wjs$8%Z%rr0aI_z{&j77Wg_mnLS=eQH_tH<_r$A~ zttX>8>#H^<>~nqlWvy>?*7|CUcmKVw?Yr-YZ0&pL&)M2nYy4uL>pM1UedoIBL;w2| zD={!PwSbepMaG0dRLy%E+h2A#luQSvcJL3s>9YyjwmKT@tWU#yLdbZcP39BeG@H{) z-A;x`47Ws88Z;|SO@^4k>x)&bR(+E&Hb~94V9A8N8Y1HimQ?Y^VbZQ5vx=aa!74E0 z7Kl4I8)njzj*+$B5~ubTp|CMK2{ww44;kNKYey}9dh(ahh;dB4;{+Dt?Ng|tF(-zT zS!{PG(T=AC>4di%omXo-5hlGR*2>0J#>vDHnJC6T-eA{Fu|we)>vYpbnQ{0}0Oh6H zj*5V4XoZ>xzz)CGIA##6NQU+ipJHQ(!lzi_^IO7`J#;P4E)fA{W@&eO&>yWKfv>EM<(}jepv z8js@|Al6EyT>0&+05j}BFDB6r1YtFATd4dGX2xEDz@Xh0fgkroD2=gPGk=!y%UFUs zlvWniGwY$txatJ81tWdY10-IQwt8?HB6)kaQ4coW0kCXSCsxV?P`3JiFZG+u(C-3` zp|3mZx4oF5|Mn#}L6OPe*ZW`98@n|phbPy&UxMK3{g2f9_d36q_PFQ2;+{K&Ns)e{ zVr6MtS9nEjnQ0yA{C&p);qL(WyU4gQn2Ep7!&93lOnSyW_uh_zFd0aT*C)*s5ylpJ>2j-4t2 zDrkf1)~1~-^WO@T>hrj#em+`>v)70mjZk|j%$qq=l^BCyVKRTnMhAH;ev5nBZg$Ye z#sV?xZmf=AF?WcA^WvV*o4UZ_Im869|L+EcMMnJsan&R@X_TfXPsr_|l&^>YdL1m_0BX($fyb`k>K> z9bKHnm+&PhPmqb^@c#il1y2I{zq4+UkMGK-QUWwo0usOn$Q=;XbJR==&eaBfktAd# zm0^|8-?njM1y1?eEtSIuNao+)Ld>Qh@;#=OP*2eGUpA6hGCYrk1KW{!Go}HrXKJw< z`G#R$d>g|9DR*uIh|YsE$J8*21iAq11cF6(`k6g}&vqokK_lVg!G4x|;hG(SK4dJ_ zp+BI`!5YAHk`lU;fU{HR=lX;m&5Te@ z`8>TUkuCn0g&vP&gU5^tqjz?AiA_(s`p+p}*MRM}Q3V~U#c#cfg#85+1)R)~QI0H` zbb1N?HLUN>&m8!>B_#{~A7;Z};8i%`x%s1Oe4k?UkoYeCXBK>!)nR<}X;yp_Bi!^! z+?#fPu)Dw0wJIkYWMx7wEGcj z-0$_Y`w?s1?>D90kAE)hecJu_Ke^v;PrJYDdDnX}Nl<%z)vnX|2iTEJ)hP0->DueJ zt)kvA!vZH`a%TzeQ~pcW{@t1Zi10uN?UU1SERa2)^Ms$a(p*4e=Wo#KVQ>RlCq&Jlqi&o#Xb3nPOt5C+^uvs`Y%{^hYPV{S9za+%qK(e-<0%PCN`}muPXFX=yl4 zdkIXKkPAEXZ8v7@PkP12*W%4N8^xFSrWj7;WPbeQ;_XC4Y&vIAzJ9UsCpnsc%DH zrM(zmYvij7VN_&<4?o+&sdIbb-&BKyv)%#;=?R#J;P&pX$P3aHpfD)y2{FVZgPT-~ zo%UpE*}%9zmuvhMaxli$kFP|T6P6$rcj>6O27A>;F3PyM}Z0gvJg|mx-@_W?rp&P1xT3f zeRU3a8_|7Q%w9 zn7q%jVtsrSfkQ4@)IAnirEJ@id}iCWSNfj%Mh&HwJL1J&J|WdIgeh zWG)TI8X*%2huhdH$t|DgKzuqliZkc+9^qB6OgTD}<;Ho-^?u>k-Y;7Kxm#D)KkQq& ztvm)hj_=#TzU8SKi?!u9s^^wLVTSdb`LEXXEAuVg5a#l**0wU=a_iDrz|sd8pZ38b z3U72 w!mZ$*!AGXia6ypb5!7PqzIG>MKeROe7RVXq$)LF#l=Ul-B;Yuw{ifWed0~*X8oU(4XKYB=r~Vy-J+fgO}~s^gs8`>?ok= zWBnvI7T6(=tYfTSDia~a(MKQvm%_6~Kl!{MY@VuvwJ1Pz9BRh8Wdum1FNrPLVme~k z2&P#6l*41(Gk*#@a5<6U5lq(sQy>$bCVZ8NKaVtKJcxM+e{bJ_JfDA}-!}m1+L;!$ zWMI-1e}M1@%1O?t1aUv*jx<<4_sGR3wjopp|K$80f?2+tqCUmI1r8APAyL$4@OH` zsMIhoP_hXL)Huej7Q9uQxPyRV&lOVfRU#5L&icB3WJDJSX(sF%c6-242=Won)2n4o z0jnm+xY~kqJNU}{NMR+X3kHpqe?T3;X(lI6p5Tpsvw{UM157Y8Z7_BXi1nc@KprbX zQA3y~9)X-FEX~JpWc}g9^Ek5i*@}7VTkzxFfI;|A#t6O@@bhFTR2T~7B~HB1`)e*M z3>aTUDWQCiX*RI4*C-o8EF~C6UbYvuXS9#HrRfego-2fjq@LrdR;oHtb5M885Ot_J z@+5&e`EiJhC?pM4rRxQ>*f7e1eIx?xkPJL*@lx_-%0Gr9-HKIN+CXd%#mYR)Obx_D z44_6*Sfn(jgmYIewGFbfeHN99jDM{mbx9#w0+I&5P!pwohFKlSsZv$YQYN;(Gz|;* zgNp6|C{CU*SM%C8o%F14#Taihb&Pq!qu}FSZxrM=TKuX2zl&cQz%BIJ*Udb*XPZ8z zfZP9+d{&1H+?S2h@1>&Xh2x@eYV-tXiprGc>lmvt33_2kWd%5GqSjs!f*h-8EOQ5% zOYyi=(_-T>;~6b1YCfwFU5xRFarVR1?Xr`CG#TGz-ciBH&ulx;#Q)ofGY|&0$ovfu zW6Y1z_NJ?(Z{Gst<5R%s7z-J5@BWVSuOZ(GZ}WIO)4a`S^kfZk2ju`n2l!U_ja9!< zhDXG~Aq(tvlb+W6qax+C1wzUz3lu5031$Oh;elGo&bp(yH{E~lHWh9!rEn)?R=6@i zcJY8^FWGj$_1X;|h=!x9@Y9O!>fG==Hr%a?i9Zoefw9?yujHRtt)N30GcF+hFf?41 zMpH)OJ7C}r%`ed6*9M~4vM7os9~(iFzg)=!TlC%$?wwfy$6+j*P~pdK8q>!Sv}kIF zp8l?GIQ`B`1LAdKLZO$)23Eg7N$DsqIov$+B*ilt4PF(Mi!ylG`GrUVS8#nmA5#eG z6~)5%f%}(%dM|Dhwh^`s7!`L4+aMnXY=dVe+f*sGfxj(mGjB;QC7}lF*3evvpYaX2 zt!*x?)hlMkN~!NVvF8O+&z%y95)OU)*Q`oHQ>;x_Z&Zc1FM+z3I-7W9R@)cVniMgo zAgsRRukfp>FW-c|HSWETN`reVFc}{ED~N`TRp26%exsu@Dwlh#f&)i|z4dv^a@$U7 zv3=Hb_%t&*^c1uly}1#s+K6>9#q~wT^9RUb#KU|mN(+iB3hEES#o*$K!S(%@!Sl1H zi{$d87E1-fI}j42wt(`qHrrl7qY$K(7PX{DJ=CJNDUn+@xM_E89Y$ee3L>LI1>4~v zjPc{jza2QigB=y}`tE3toaMS z#ls@wnpq%tJpav{zUG5=LZEC2a*vP_>pPaEdRiRQJ2lkd}}MszCKQJOvzKVXb@OwW0>5pCLtziA`4 zYCG3q+92s$P(~P7%@M#s=k#DQtb z3@?Bw{POGQrGsVI^aaN;8pqnth;UKJ8Ih9reDl8r`MEW#)^tO$9}*V03OOb?h_h)9 zZ^sAVb_DqdS0xoe-vR^Q8{^?E@zhzULNt~}V0_4U6Z5jfvYihh2#pPcbLtK!xALm~ zK&_3%t*hn9jXb$c%$(ed^6a&pDvgegQX4f)R-|Cs&FII9VdZC~I8U87KQ#mjP|Fq1)wh?AJ|?xdEC?=<~PA+&hvWE!4l ze}L9>O#$5Hu-x^5eEJs5=0wjBgjh+ipW&u+r%~^Ri-mX7Q6O7K6yv79`ZDbEhrKg= z$B*&)emMYueGB?!1Rs%c?zNyYMzw=1Khjnqz6BIPV>W`XM3HAUL%kLhBcE{r+$-J; zE-oGHTkw0_bVj~$x2OJ~(|XtMkCSk}jQEZTdlNj*?6h9nuWj7jyIwoZQ(vG^^-bCM zrRF>n78-9giP@pUv_Xtam2JOd%Hsy56IetV0ICD2;jv zCq~)D8DB1ftwd0<)oc6>5jwO4%F_-~cD4^tPB0O+KI*K$bDOg0@3DKMzfXpoq%`<{ zd$=_C1P1s;gP(R+1`WRQ=c2(2zUd=h6&XFzFokhqJo?Z=UeQnUiWoz1UO07*|{3KsD|1v%+xeUYs{EvoKe|5=~A`)?59qUgWHuKvT$ z7X!3QH*g|3@xT^GDyX1@b!w4IxAG;&ruv4&TkcN~42)7yW8 z-TqblM5hm^+J9JkZVz?(dh|b@oRJ%~7#wWulONOQ8%i^K_!j(DO3j9*fEx}M91dOU zuAbPE>Z%J7(rw7$`R_^$jX$5y-7jIrqtHc&p=cw#TI=qfQGHW%#KuUnmGo`k@GrnX z1PuNw#=EB>3hi5Q7M@#BN*2?drTggB^4>!C!?@mDD9D4l{gd!hKwY-C6LniIvZ>o( zl-^-ew}ulQfKUI8{lXiiD|(p@at4k z%L{A7smHfy!$`Ej_-7jWRd^@p&j~8@@jw8zge+i6{#3lz^tXdb!5CvFvCtb@N$3UB_<9=p&m2(UHq^Ukv9_+7`d>++1qP{UN8ZA9(dg`mSlK;&*+w2D5%C=UcGPL!{ zsc7pvZEh~YUSX;m>PA}KAk93#u!iBITJ}YF+Vp8{4NFPX?H}$1KOF`+%hoA60wAr?O^H9M^_I zKi4;)$Co~T#Q&vlz&O7iE{Gv0Xn}|SgOLujvl{7WF?es#&oSGl5XEiQE%-KFQ=H?d z6oVv;&$Sq)YsPpvU(jbqI2nS8qw|dUr5*qm#VZRbi3dNp*tQ>y*Z6asWAvs`PUvh; z*e)ye187r=-vTG}YibFk?mPR_&&;;%Q6nW7Gk(4mIpHQFw{Aojvz7>_g9thGKjx5= zLEeb9;SVUc^$ufb=>S0~%$0w|~CF}cBJC*d#T@anCICi1C8UwFIdD0mb} z{FrkIB%(F{ho^6X`wgBi<_t4qFcH;Tqxv|1n30XTV>zG^Z{uL!urhpGQsu`+>jb{l zj)#1V`-tAs7Sa1;h_4`kWyeD*WAH4U8o|P6n{gvOe>fmbu1&nqIpFGD!)9UQMTjw_ zwiVyxqSsoj?NL+Iu-o6%f_!)(fXzAT!YpbR!F|w4Al#FhsrO1rK!mfx3pl@*`8GU3 z-Mh6Ur4=)gBb@u9?EDz}p#Xh*|Bz9W{Pi_j2L=luFU&pgLBc>s*eegLspWl1)gvrx zUN~cP81xbxfhRKmwGzZ1;Ma$NKlVF>8Uw)tz=WeL^!&QIgBSUr4hKNRA?0ayfBTb? zb@l&JRIvIJ?Z-TWgmbaCU7L#NCavv&wWd-(!i(%_#PqzzOSW{<=iU!Cp z5y<)jl)Paa2IpQr{C6Z>dQ$Sd&A2GL{6O_Vd^R}5=UX-iEH(@sYx6qkZRN}4no0(o z92o(@qn+f36*hf< zt(>9w&MNf!{5=c9!kFs|Qpf?{$Ym`%U@z)#F(H}NajD*MR44k@-c{i z8uIWWT=;(i2D}!sH$u4yatAsGf{%^$yj3vjgM%m z2IJM4Jm3t>XaLbzU$IyktE~|d!FMo3GoBusK2Te=a{IW_YAe->#79jCCgC9jtO8n< zqP1sCtz{h<5|JvuwoS94@c<=Xp{D3*>;XM z_M69?1 z#b;XbMivyUYqE6#Wwu;ViA_dh8R8 z@sqXei?|7^0uz#jBOc}v#|;_*4_p}?hjKQ0l>Zi1o4Be8nliBJrd#sm5T)GfSzXGo z%~%G&^)R*kIA_s%{IVGJgX7M@aZRY8)cn`YUw~yJ-LqP9XKQ*5*kl&A%NQqe%#CL3 zS!|-9LlC7x6~u7pjWi}q$0no=CAYIKzd5=YvJN^>4~T1r+QX>vA;+Nls}B`~_0Ay9 zLQjVzMl+e})||5L$}&|+%6RD;p7VjpMX&p-U?DMnY3lo{C=xHi?mhcc!c${mem%Z- z=kPMf%F*3FOE%ANm`cp40R%6U}-41d6fxS8et0-%ubPsDFn< zzYn7_5(el~(QmEQN;4BI`UUA8glgv@H!#Ap5pLTic_ueu7&8KTCU|%A+MFQvM~%>d zSo=^Li?;j$Cqxhn%(aN8ST#t}k}S=Fx12Z!z6*g~xLvI0f=*n*p0w6$e*PELKJ;NQ zPDx}!O_|hs_*p5BQOs9WP6Yv{jQGE#+F+1$RWmabL~V9l%adQi%ICbr#A(SmG!CNe z=+R|<0}aOmRa*#<_EUW(;!U3(Z+e#4Go}v@RcyzIhZ(>5?>Cbg5&71iWM5JTJ^hDu z)}E`fpfpG|T+4a%IHJ{pNdO%~T$Gep3cxyrNd8Ssv zH0;N4{y~+Ft1ASBR{q{0`AZmTJWYP%hfT;Ez2+g+WJv!Db=&p9o{E*^$-&5FFo9Z> zFS>373^s184H^}zf{_Y0vY03eS`BI>EgZOH293F^V%Q|W0tJgaha22xOYGHck8!uCRatK=6#Z zd5NZDj$d03m|6)F4zT~_xl{Dfkv7%?xW*|XW?kO(W~m+kR@26|M$^S5P9WxiPrU{U z*&Qs|qbz0dh#t<89@@6M_3WZbwj0E(pH;)wER$)x=oM%JatGTf6{!5M-K&%9p9W%7 z2H{1osAVQU=^mC^0v3)1MQ)NVA02vPn?5QKaGJZ?{(S$T$ z3x~-vg!vdkAIuu+NIL-a(j^#I0B|$@-B<(UtpW19C@_F>98hs(um*IE8qg&?7;^x# zIkufATTLjCbh4EM4%V}!D_N!SLn`ec$VPFuqGQ%0owSW~W@Gw>F)8WnC(>6~>GzIH zN$*hU%*OKPc$3nNrED1GIquO3kHlw|f^%s5V~2HkJ(%qfvpamR*Enwz}7p!$EQ{J5HAC#dY+bPtO`a`_yz--BD}TiY5Xn@(V$?% zG`DllWNx}DRut2OuHhVdJT)(I#~M7%=Vvq&0m-KJVJz1FGk{h4E-b%rEPO6>{;tEz zq1WV8^mvit$sJAWD_Dw|zq#nsSadTQG`C!u1sDcc5(V)HWpMjLyIwx&_-#-AK*M(L zM6G?oJ9nIPOYY-O@f9lL!=QODeop1y9EkPxXRXS_5_v97-V!bGGP!V*=~)e9O1e2z zl@e@S1G9kZF_#{%rVsXKDR%bRrdIgI-T?6k0U(w@?o2+i|u9BAZnpPdWN&D}LmC%}DZUX4@mk{C_ixKBD4 zm@@qqrnKfe+_0-#4qU83q_>QA`m-#U21`UwWhcskZvjI68yD!Km0xpo=14z|-vc%+`w;efb&rkXxh8STErq`*~73-?ijEhm< zVdhQCcqkOErnvQ;chnI*X%&pD7%LP+x_5C(N7fpr=j#jFK+yHbl#Za^y3!`-+5l$? z&5jR3&?T%YPS7Xe4Hw!U8bP0D5%l5@(h+pv{A7Y2r3m_Uvv)ZNx)%+aUtCOr9y}C+ z_BaT7OAeli`NNS+3Abi0j#>28U5cT>zZ1%U5hk+JEY%O8q(Xj z+-pYFUM*5}j~2Q8G=yVl;wSJ(7|Vj;&)ZA6rs}j1PwY_?AA&k4`t|71GBX3dY3DSK z)54Q2l|RP=GUY#{8Z7zjnabx$bL_ybR2 z)jbP5cUJv9q@NQqzEcMe7ATmmcp!uzTY=K&7=Na5Y(NE~$?Tud?&gHNaSKKeD)h*_ zM*;L>O1eY`balxoh0F2sLN_|;S@;JbSWC#x6HGSzcl6~R&+3b@DsC`8di#qQzXk zzelk^Jz#!uQ;rZAhY$n?KDo#r)Nj?uFRuz*8Mq>Fd5S!W@rNPDMKb(L|FME20B++? zjD20cHSSd<@5#W=B7#LBJu7+OXT=A8Tzufq)FR(6Py*I0EHBIC*}MdsnW*0y#mZ@4 zNgBqmz7CQ%h7s{HF^pQ-W=)215r*+&t?1)m*#O2B!w7XHCq|8@5K=it5-X#oe=TI( zf}w=fFQlh>jHSP-^cO?MGM{7l>sPF?gt=HK@~eU-bl%=BU)ke3%(Gt!L|)6zqz(ijr9uDtH$~|jI|o)%VEKiZho&U#lT{UuYe$cDeg@S zvzp>n`p01%hauU?SkBdC4?$t?4(sJL!TH`W)WT)2hCJmP0!3Q`5pPhR=?~7w z$q0^I%l$C3!%t}u|F4d?tEQb>K+f=HBfNhvERFivuuk*8>B#EE4;BjO5upvI0T?$~ z98SLsr#}?A-NZl0B(ejm8W8oY76}hpJ285Z;S{H8M_heR)9A*-U|sB0S;~5G`y>j$ zgQOHJWCt)>ZO%Y+EZAOS&lg^S`d0<@ckCwCs3tg`n7_R^U(9sWoxLNe=G~~d13aTI zgdh<(`U%oFWMOtt&kXA~d!ZN~y)ZirRz1}qEqJ_Dt2|R%I9?uaxC38T;Ss`IRUd@8 zmJap38s9l#@VOSbcd4)S_&R_`Plw;vgQ3k`RVJK_0o|Zl~2OtR-9*N;vZRtMw&Z|KDQtPc3V2S z-u!6{(mYDm(QOw_#H1p9F>vv$8jTh&dmRxxgd#6$eA9m*>mC-lBV>_V&OBV_T9_<5 z_$ogT#?LTS!(#U~al|WDmshg__}7~G>luV(Af%Usj9cp{ch}P!rJaS$qF=C{KCT=~ zz_PKtG&z`>y8d^9TBhjbLQ`4pGLRhv4~2`x*>Ef*3$O6CxghQh<`3WG2}>W`Hy3zb zuWD1%!gEJeE2seMHvHfo9HNuEt#8a(#pMfA1Af%4P?sceHxw}Dx`W0A@ZtIx@v0~h zks*y}!Ah1_R<7h}`qFaPv#a7<`zi9+-lIkAu+c?Fdxn4JfJgSfno3|#eMvU zhoSfz{CTY7$zk{#Br4%=`I!AppcwO--EkJT3#|+|SlnO|i*qNRj~-n}0C66_4Qn3g`vlDer4oV%pnA5P_@9mn{)t!o=Y?s zo0?g#WkQT%MYkhbR>L9)bQ;-Sy*}aT-xJblgfvps#OYTr{FAy6B>zN`zk=j8u)0F9 zx)rK$)k-K7vHJR@Kd+h|0M`ZyV}<$hZ^d_EUXwoIVk!OJbu4WdE0NV){9|mE>48Yi zSB7U9J-IBXZQM3ojT7m9m_8?Q{^PrnIsfgeI3DdjR(b|ja$)>cYZTw_7{d3*C;0xn zH6vyFW4AlmeqWsJ_gZX!$4J?JZ=CJ-^fOGMZjd8$UwjWGajXJl;|Ey9s1Iv>3e` zSNK@+G#bSjh%gUJXMO424xKg17pnTL^4I`pMBjJYI%TAnCbi$e^w-DQ=~&;OomB?} zFmsRt0<36QU+WU9nsI404psa(>;Yw;r%(9T2G)NK$683N>RUe{%li_;tCQh#zm|kaxB8wr{EcW6brq<$Oh#rvlUNvv| z8K)Jt+R!h&Vm`5zvq~yxD5%4{Y7jSjsFd{ymkU_C>o~1omd|-5Gp?GWhV*kKeFM@# z3}MVGY;>*C_66N&al2UvpxU@-6`J3DOy(6%^Ysaz|CYVhS=@2Z0a4{T>lEwOLeUfA zpj~F!Ud}Qoz@SmT=~~XN^%&AXQD4%LJ@oNQ|H0*leB7txiH8ehNOji(Gc8$SSwV)N z7kYXq9H=@q|Me)D;XNEqPwuh;6TiYfRO+v5(4cz!+HG*^yfZVSA*Xu=kgb1T)rD!$ zv;n6AI6sosmaZcdwwgu}AO08kgo2&$2}$X$y}>wq(gmI)*zmoIlR3cGXTdj^4BxjB z@O@_pd{P(S+qGW7C#@}AM<|BCH$wXLYWh@=uUp9X>%ZYZKDS_mV$xG*V{8}A$S+mT48FyVT188w)kKoH@m6V z@hn>kl7R0e&V$WSlQJ{(ao`P*<*|E@@r+|S0$WV?EyUsd^uqqbl+vwbeb`gg-S7<} zs2*-Q5TpO3SR-~H{OE^TYZZ2SZ6r7BdU#~XX|Y6fd#hx5#v2rSvF*|GK~Sn*v|Ksu zj4ITv>BnPb?4x`SxW4xy*FS9LPgFY}s(_4(wRYazWuA_64r}LwT}%TGIjqBGzvz;v zSWK*cvN;V)P0$4+skoAHD5b z+5Uz(BHutx^Dml#L!xl@`UT~l*DGJ?O~~%$k;+#(uj-(*EKj?%myP_+FUNRKD zz^@{SUVdL?)5`#A6SEbZm{29;55?&v!ZFof#n_pz9|3w9MS6iAm=TvKG=g5P5_-8R zK`$LbFW(fY5t0^lbl5RfhxC_Lur{Nr&88ZN7ZL;8p%88pqUlw;mqM%=X@^8YJum1aJuO+PUMeZo_Bn}+ zU?3^SAVNm@PBJ1X(?Km_><}`#KS4&XYh|A_gl!5M6{jGFc8e5*8LG+(1xYQ<-J~F? zS|~{7OW7wQp`gA51=YSsMI$B-|HE<(-$wI=`A{+I2FZX#^;VY<73sx6RPogb>l3U& zEM@X4iwV`+tLPv<=&son@l|RCz65o1C^u@DZE>R85aB@|M>eFjd^m&+c}qUD8BwLD z>g9&1LOrXK4@oH%mAC2A#7$wVgGRSaAATT`kO!x*QTKd@C%zBHk+NHZ>)W9M=s8>Ux@0A$J&_UoJVhPTIa2pw7Dnq|s z49{WuWNu_A8raMt7L{?bn=i+R6$cfhnpXB!LpAhiVT2Q_@T?w(Q`EC!d3StsREEA; zAB^QS;HhlzwlnbkFwg3eSl;}2(xoct7%kQnjCG@;#^?GG;N-2wF|15foeZ|ZM&K^( z=P7G7cA-8_g_P4a<*x#5h{y7;dJ2Z}z0N!D*?(nU?pY1(BOrU@>QOK%_vkxfd0X&U zwnH7`KHR}J(#YRqqAS0f2$9eIvK6Y)XI^zZMx!~&CegM}hE98DNe4_c%g@Ccet{!? z&^WQ9q|I3@Z}T_A>-q%Xc@3se2DZp0+wKWKlp0qB`*CC{#6A?6@Ih(|ptgqR3F&3( zKuXI*OAh}gIQPMX>gID%)J>-n<%4sImc2FM!V-+Yd_TzzCzy$4ql5l7Na_k^BOP%? zn61-v;WK=HvQ!?);8>qDBZuZN8PMno9O6F=7&5Im2gwmgqrYphH|ACyHog!=B8Z7o zfn(<0MJH+OJS_BJ)g5de6yMI@ zr-R2Xar`^to1Q>eV25UdE@iZ-$@tXv!h56h{~1fHae5ZX zzg;#0ywJ^XT|0F&_{Fkm^;Fs$7dC17J@PoenyHU}WpqZRaTmW-MwXp(Ju^jSG?_)$ zVDOMTmiLECL1)H=t+BlGh2plz#E@Bm2+U6-6%ZumlWL#qrl#7z@l@6Rl0^IRsM;@5 z?eh!UhsCgJ|MB^D`=`g-U(6>xx&4y#?aS^+wI4(a>_5XsS^bwstN$lR|M`XOUt_ml z6mS0zHFp1RNYnn)NJanS^lENHBqHE-)-h}qrmt#FCer7GB)w?3^ld7A+;Hi0!cxBf z=wa&LrqVYKmpDyGgF6qrp9LEG(5nAJaR(}lFtrr3g6@TAw-OU$9_0$7? zP2sm$KBc<|*jzbNAUPo!64gY!{zYL&{de#sx&B+_Q`-7XRe$GEEEFG!l=|n+a@2n% zUy|#;Og^Qpzfg_z)d#Hq>A8;j|HPN%`k$9iY3r|3^=BTi{t_pC&KruKvf=TwQq}*T z`2=b>{Cqmo0sp9>_{km~Kc=cbaKQS<1s(NI;!7le1s>M$ihhoePw6gVHVf5E`RkD^ z)v(_A~j;`W+b2LBt7#=_#Rz6Alvz@kaXxgBi z_R-L^V@F$c9)X9HI$<`d+Bg4;ODEsb&}MqBt5fN9ZNt#rcukz3{E^ZYT1 z=k1Q?SxWUS{d~#sT%yd#rOwB!XN4!}|9^WdSo`si(vKRim3AQ>Qqo?q)1Drh=F7Fp z9f^mOa?9+rTZg8ZcG^41X%=pRhod&>$N7B1I5tO%ql=D6JTIOo&q&&2$%U5nPMn|V zJNK+b3{o*5H;aEmAv#rZVCfn&gW+Q*!$`RLJ!}?c@JpUTzuOE4SF4v}i z)@)9+~ z`^?^7xia>2Wj0KBt`_$*c9VLsXI# zVs~i%*E14Z8~zl~k|$ggX62i=q0Kh`o}SEx!{owmo}R4&O|+2#Svy_7V;7o$SK;sS zfXGs>dASzOs8(ZGW5N7wRFpClspVf#<(H=|Kjq-%k1dz>=cO(G_g@~g{o7ReytL&X zJ9zoOsPeCQ()R!0<B)Ku43f&%{jy5l*uk=qc-nKX4;- z&aPXh0aG}*#H2AUEv$s6hH*h{Ebru*++y7)V59wVt!yWQD)S1QyZNynbPR{|=1zJh z!Oy3x3py4ARu>;2nwj)_RBnXEsBohIwvMd#FG1G3(QE*(LhBQb<2a2D?CEy0yqEsd zfh48qi3c`7zpSfK1Y3sr{Ht- zjAgcL2}$#7C>ZUD=qLC9dJ5pOC!!x1hL6{Q+SkM{i0z*>vi4^<+CM2x`;S2pdz(Aw9gvpVVj$l9ObX#b=%?LYSDA@zTyIQ&Te$BnH2Zb$#0 zPSgKGYrpzG;{6|4`!gKvpOmKk$9{fD{r8vI?XMQX;(khbvZl~~wa`BZ{P%5%)u-Mf z`ZI<$>fl)M{domiXcuFO&q5 z@GO%9cC3=caJ6#tVuVQxz-_Uvo&k89yJ~qC!bh|a)Gu@fbi=qKgw#fDZ!{&an=uig zG2uzNbbki$x)7^R#UMhLOwo$q*3gB=PbV)vPlEPtG&lVWF`PRLe6x~2(Fa^8brZo7QX-P2}hvFN@2#d?H=o+pSc|ynv;Z0V>bFGTe=``C5r#{zk zJphIRw2OSr`h>qIEnjH9pIYQc@F^Inbo(J4`1!5M&<3g^A@{lF+OuTT%SI81RLS&} zpAIwZj{X>~8z8GV+FwG^#nPf#?Kk4nFzxSF?LY5I*M4|J?Vkokjidciyr#5&CO!?* ze%9Hl|7qKQ<-rm49}AkJ{Ux%#CE>pjpN47wE2{nHbJF&IMD1@WO=^D!UQ_!28a@rv ze!12EwC%t0z)1SP_^hP%oA8>_{_XfQO#9!o`k$S)|08Pu+h0#=zaFn>AFFDh-lD(n z;uG7ix4+r+f4zB^)qiO}&CX!M{pnEPpnr>hdd-?R&*LIM?r>k)vgGoK@*o`SivP06 z=9kr0**U|OO;>(A4rUYsDYeQUe(>_#dc^%{0mstLHWW5H01FOc{N@aKI8%#}O#g9+ z3Gc_)O*D6wnm@*t9TwQ7vMV=_VVwsp3i}_ z$c_0J^5#yT`2qEF7TVs%v#Pb&s`Z=BT2qI|F<-EnJ^LBzmA$dl>^9rtwb|?PL}zV7 zuou@48?Fixw?jU5103`9AF+o{`E3aO!KC=i(+CIszLoqm*3rK&pq5kpv*+VoQl~AL zrjTE9|Bl4A0OZZ}9Ovt^>&3$3bZio84tjs|2LK;7BIZQ4)>Bc3SN_)HbReU~Qc(Kqs2{Sbd-;b_on}>6t*R?!bx>)jJH2P+JF3fvi=hZrbc8hc zI5>H6H6go2RaGce8Ls~Qz+q2CF>B-ozq=wIIL$U+{I$!Tz)ehoyys_0rEatID6m&K zUx`_X`2_ly3|{WQUmU{V$ROO&CY`k*3=RV!HH}FuW~2FYmP~S7}J$ygEWx%nE|2TBSqiM?NtqV zbgjgF0d}vHE`!aeYs^24Ut@mzt}J3W^&0d0h$>?qc1$?`5DZ2hUn%{KUt?Z__{zA( z{CbieG2Ou~&?=XM-L6(SI>qAWDLV$EgcbHe6$-zq8Vg8wVzg2VGVQ%u96=Q0P zIac7*XF~67JVLokqalu(QWDE@AJjh%&thiiQS^M|aP$yW z@#3mTW{4r5dDj}W))CyO98q^ZNQ@`MQD!)0gcI&5=cK?wQLgUB%}S1r4gaO)LD%Br zg7Z5t*ZUUkhf6;$U&P3V3o`C; z#Tw?YuL*u55e{+rdB97jgII^z1w|n4Y)o3)FhgYZ)rxlF{uVW^$CGV<^!7z;#?&)I zu&HG9SYBbNJ=)Ipp#1=gQ@RBV5C#eUs@odsG&%Z!qVGPEJf4{>JqxaMHpb(!JY3?A zUXrYZftoi>w+#do{SmgEgv|liomxBF#-H=GvaO46;?YVmV%{oq$E7jR`2flb6Hsmu zC?9DhUeZ80F_t$$po9Yu6qQ@dMa+rwhzO2dK?(kWk?g_ zN0@Ed&H;8|9G@QIv%q{~7P+J}f=WC8jytf*w8*VV_*f8c1V)u5+oEt+vL=~&zc~I* z6MP&C!3fs&muv6Cgfds&!>))!B7PAkF5>qt=<(;nEHueLHck0jmaqHr<*Qk~@XMEP zVtMoKLx7(QG?{0^%zO~!t?p}k*s2ThG2dix)*a$qhqJjQ80Mttft(+}=kWCv61LEx z)|VO|c&8epoOmDgBeVzz0RK~CJ`Qupi(x`IUxRI#;-aN3|2z@+@=Ge53MI6#@C{F7CF*x(P_2J`cpiK0wx&Evn7KVJ*( zHKB(*346XTojt5lbrj!WhWPr_ZOi7+eAF6eUEBC=S#Jp<7{6+_FF8$ zhtmFN)xPTh?TdWDh=^c!lqJ%MGT_~iW?**_r0dgu%4erwL+NE0BwII+e#=7U+(s6o zU9+SaL~Z1prbWsqrj-gaHge8Z$30?$9$z!Gpu&QSf|}0?*#`@JvmGN1ex9EN*P#gmP4vak0QK zA$)$!)4E%@xcVhNZ`nHxBf8P-ngM-Ta~CeHd54EG5IQbMI+S64`%uO?71W_jPP|iE znnM}11fIOnJbNkdOpZLu$hi|f4pG2KG8X^+tQThma1imj8dTic35C<(CO`b)Xe6)#-_Efc4f39`D3&7seB6omS3x!^3 zE#BBsSSON@e@+#E2#>720P!+31{!sI{%gv%>F18IiJB0 zw8#yplDM_-dKK{ck5e4Pj2V{b&mq#!)02dLaHw~1`f;+dksRvT^t1PlWcoo+*%bPb zFX`wf$LeQ#`T;+~rVR8mz&Qf?L5p*-x9KuB-S8=bF2F0xW+%H2PEOSXGg72=z7KHz z4XSc!kwv)2=W|6)GOEb}VJz>OlMh7S!^8JNDtsd#_f@ys@PW<=AMW-#7<}uB6nsj4 z*LMO(F7u&VT^UK*R?rXkr?`P@p-Ywz^Wk%B$yV)!{Z9 zqf)_O{|}V^P{BZbW8~N~wS7HsY^40yL#>YeX}>`5iJ&$XMuBe#<1z-Y7E25aKjx=& zkQQ*!#lMP2q>=X-zfOLi@?XjCqaRCt-|Kh>JaViVrzarR+gc7zh=X3Ve~3Lq|Nb*= zeW*6KwLDj<8*y)K{jyoI1T$#|a5DzWQ6*n24WgQF=1I=TT7O_#DOxjeXB7APg&47Ybc#J%YyQH!=qny?Ht)=e+z2I8K&e9@SzslMuhEne zi{rcVJ2m~ETJtN|q??G*Xd+ZYruHAUPC&0w(Ee4hLeepq zORqT@IT3dpkU*J$;5@x%KU9R2a!PUT3ZMy3N-{kfB@ErS6l%uxEbe zxJgddD?!Ce0w0W6duX;Qm#CmpNa}b^cdJdB#?W4}-77%O#O*weOT3nCgO>(%cF}u5 zQeB(;7lWgNgHk4^%ztSi(OT+Rjb-x9hO z8~o90{=F&|TlOZ5>FT857ISl>BEg|FFa-X3fuBJhG;{vaFIY5zNty;Dx z1lrd`4Tv#b;_TC@gpZ@G_Lpj^C;D@w-Jg1^KVLNb|LV{8D~IV%le0fp5vN-m3ftm?pr)8s$uG#rU360!2Xvq&|c zK7WMy75c6GPp0H|oHywTu=5yI#d5D0XUd+BFXTB zhu~HSpeVily={4~urMY8r7TtQ9}d%jIb2#HSD8d_-yVx4VK|X4OzdUgHaT5gJtlP= z!(%)iExqFdM^}wQ=Mil~A%IZGf&#xo_h{kgYuFRSS!pp%Vn>;QU*Nb%&MGmgC|`V8 zbh@gEiazTP=WFz_y!aXn{_o|tl5L2hV7KRk@xT&l$gKnaV6EeXKK+6JE|4R)vVXo2 zu)}Tuul!x24*YAuPUhCw)xk~XVDVq%R6tf+J)HIl=U-?zgn*?PXT{^8-Gwu1#tyk z++bpO2p_B$-0^^$xbrIr3l9mxhmTK&(5C;{bv8UuO~7b80Z;nzTmu-0wHyUgtp!t^ zf~lGVpv4EE*il{D?tPb4wcjA!^IKJEs;XjEg(F4F7Q}n7s=mUizNf14SydIPs&LUL z*%!v?{^M*cP`)clELuu!Pp&ujOfc4jzA3KrOAM_%vHUry<xH56 z|C9MSc@;;(((=ax=0CLr`4yxV7|T-fb11x&35&xFwFk7o!6{VWlN&_0;kG}9!;c_L z9$c3q7r0As1q2@G$8VZ>`9sj{Em`-`|k?;&A03f}G;cICV9bC`R>b>(bo(m!{=1?*R6p$my?{o-A~?lDy0muvkr^t0aC&wBK;&N}_& zZC7+cJHyVrCJ`~CE_K$%%gU@{M=q2U$PSNE?f}2d-Z%dK?^5q6^~cCOJ1LM__(v=D0wF^pA0T(zN8L zjD{0PEqrP`9r!D&_BKw%Vob+aN&c`OyC^RQx-pmd9m{i4eQVRrD2j6-Pf*8H!t%}! zjrknG1{~Y&>xcL45?s~Z<7s&up!0iBzslVRUHDa?^HHH`OWZIffDJ+aVWDYdh~F3~ z>qp|P-mpF@Jgv0xY`dyg`vDKUbGJ(i$0grK03ro2PzwpH9|w8g%%sq?TfCl@6;`v{ zFXA?mZ+N5k;fuz5dh{*QUl04!%P81V`d^qb-u~+~Sf8L@SXhH)8GuXQ(LY%cW{m|t zKt-52S{cX>v!f3;OMe3H{=`{Odt!#KuQ#y#Y5gJ^FIga!R4WJ7^x&|QSb6GxtbQ4IJOhk^-BG^BoE~46_ zZjI4%aoKt%uVf4WP5GG(H``B*M|PL9>8*eO;BPjcM4S?q_N+$8Q~lM}Kt5nX2KIk* zH;iY@&&Na4q;p^h`XmK9Ld0$+@a7Ftew>W+k&qccb!hoSj4>N-JX*B_3zRS9F6y#+ zx2FY{j>P&A9!_PMlmd}~_JFlifM5k-!GkC(R3Vmj&&bEe3ow#Bv{~{i&VYquv=#%; zy#PW9l`UXK0mo{#X_I9E7oTx)c@hYC!@P0|W^R%y;V1Kx2m(bjA<_vG7yf3kgEw#; zB`-uP`$qmE%r9^TJ!c1VpU@9IaF4(AmV$;!=H0c})|A!c;{=Q0;`MWPSQf^V+fuZx z(!RZP30!)ozO_p+HKzkgsEkKr^Ykq|D!QBHHbaT;VRi)6Y5Ef1 zrpY&WFzTLIpLr7AEFH-f^Mk9!;`MUS0;FJj(5*v%jdmvz;t&R@A$?!mL}zr+Q-u!$ z;i7?1*(ZpG-8|@CG?7biQ7@F=p1a=TJkIXuf0HADUCP9l*$1%3{J4GIWG2-Gm8~Fe zhx6ew(wksa($_!6J{_GR=7eP%f*#lre#&0p`lDq{s61rUO$j#tZC5Z-HQ1j=u?C!Y zgSj1fLb}?W*H}+Jk$94 z6!V?#Ph)@-MDRKe@j)Z6Xhm;p+3)Zm_cE#+jdO89>kYsr;8*oa)vVS01qy5WYv8@X zvbPtXglpW)DJT=xyMxB~b3;X4CEJ3XyRuDiBz#;K)L-eJfmZ)b2oNpV+z+LlfF^Lq z>(z{7&oig9?xIg=_?i6~O5*+ja|80vG{&EXvL)NhwNe^vSx3i|Ria22I5qH7K0Gx@ z!KHI|wvFJl`}`BRIp2B}=?H@tj@;l5XW|9~RN@1XXpHEI-TB}I?9LhX`q5*P4`(qW z4n{wo{~z@8{FMi%p9hfVe@Z`(t{a|yj-fX4K=kuX6i%U^zeD{ugno9&$D#D|9KH`n zKciT83jN%R{0aKGOG^K*(9aLAI0*f$8E4VYRYwn@AMkg#HZ9=wELV(Q-r++8?i}mj zD$fJ193F6S-gIq3M0>~S)22-*4mNpoJbox5jShJJFx%ZQR#F;2I-{d&m19kU;8+M= z=hoKzM%l!T4Hk81Wos8s2pTz%7?9FTGd5$w(eP|AAG|bqc@ujDRsLJhD&fzl;mW^( zuykfkYI#QFPpk%5U#K4;|H_wL8SX-XWE%hj*3FQ3Zv>YPV(W3I=br88KbW&;+3)ZG z^YZ3hqs|@WS@tO2unBD-=PL$FHShJ2zq}meeI>oPHqF$b60Fp>fHlK%YHnSn-W_QE zYfj@NtR4A9uWOOhAvrc#oD^s}CqvI_aCsi@?a%f+-HRP@^S;T8Tw1KNe<$=@ z&1-Y|A?R~GhGNQ+#^UR;2pg1t6n$9d+sJwjjgE?@QD*3jWr?v+_APF@kz5VIA>VO+ zUDOGy8P8q6#2Okjs$~%_Mx0^bhkH9PC*Hc&`2pl*C;_;-74u3!jO0eSjk4Gr*h&s1 z+V;jHVe$iNxSW16kSOD>GBi?dS${LGx9J308;+IVK87WR(Pj$*KW1n}eWG3I_cBc- z+-2?RF{%?!2O2?_Sf60-OmzgpBTwO;4Ao7>FXG2*dsAxcl_6)1G_iGI>Pn41hC&v7 z97Y;tInubIm%m9Bgo^t5VWQQ;vSDN5UF^3nq`%`S#LYH==65Fx0zfoSSA{tIct;9} zsFXxg9L6Y*36<^iEQ>;1=X#4_UEe>ZeKI;6Y>wtoOu?rO{bQa}pUfPQu3p_0XvxH# z#|>`J<9&fhM*lOOr{(u|K)ZQW-cbH%l>3tS1@#%8A1h`F`moOnu!Y^p*wRMccc7}E zS;5+Qu8iiv9JylEQ`Jit&7&{oW*$40uX-lqjEc}ZbJ?eD7(Mdg~3@R3ywmvFi_2tansR39mZn0+#YxC$K2TM3L;dt z*@|0elD&NG+Ba>2h(_zeP&OTufaqlY0}|M$^>l#&$2^mp1YfbP1 zM_@^-WbM6<{e0X^Jl+9~+gT_ojQL$|RQZ1vrYmomv<(NAvzi1x5N8{4 zZdvUR6Fp_3c1YD(_?naqAF9Y_H9!c~z9gG8bPP#>_?#7bvi7I@f%z8{rew5Ll|xF4=Sy}oT#q`+Np$qx=g51#sGZM$~L9ULouWc^t>0Y9Kfz;b@^axW$vILCMUPDwS15~-IxO+ zC?ACPOXFL-cvtTU>QG;c9Rx0JivGDznLH@sO$hManHe^y1V2vi01R3a?}hP2>@++= zcwwA@OmkA=`;qFq*ZklD$vYklmJ=cR1>T2F341=F{+SR>l(7y7l~*%C;vF)Dob!F3 zoFu4X)3ve+;mk(tXey z9QZmCTcVH-?r2I~@cn|U=~Y$X=Cf>K{akHI(sCLHY~ z>F2n=qxd}~q+g0np1nzI!0~S24@Tfv6d9ho@FUKg#n^xqlc#!$W9@4>O@J zLdZHCM#(&$sd7Qf9Cqvv_kV!>-I7`MLY}~neVJut;y%R{A}6?J?3|5zgw|2at+!7y zgQXaI2E;7K!&=<Pw17uf*Ts+6flp`=uP#bFjn^ZIexjR8aZMd!l zGq^56OAtmjnpflQ=r$=X=PvRFVYZG`4ehzA8Dy#m5d#nclqH+Yo!Fe=4VPB47faVQ z;U~W2fRm5;$Lz$M#QVMvlHY%`H~BsKujKb>gURpFl=t8KcXImreaY|B{+aw9`8fIg z=8ux!*PF@jzj;6TeSJ!Qe%kLyxA^h5W{PnAJoZ)@o~j+NQy2{lKaa0Aa(eWk>y!2bsreuNQF49--=07{sCj3@#bBS9o?=3W zQzM8H^S#&t_Ty;2qMFa#wP*7upSiHbKafA3pW4D-g5sH9S!#&p022tB1O5-Okw1Q0 zMc{6pU;hPUl{&>JV|l;Zmoi_5$Ok)1_Q+W>i1IevU&N-U|IhBllR63D6IwYJzi@`9 zAyP4zg~JXhy@k{&3>7=D8-pa4)|OYizx8ab`8r=FPx83Ml`G>L@6mL)V8apol+^P% zv>n@`>Ej1EZ^l07L$&68tg|K7_*WDcWS=Vgs)MOtq0i_w=LkHDz_NKFA$x`RF>x&K zw!vhC9SC379S~pRfiJAx=+bGnCE^UR3ioMn!$*V(Z~U_zvr|4}u^Nh=2W|A6s?ZbH zzscA*@#7_az8C!R_&I}RBg5h6^1aFUk@FSw2;`6D7wjAqgqV)li1y4-JH;{&4!*E# z68#Oco`J-%dl06u6iv5zR^J7iVmpXAQ$vTx9Td!xV97*Z z=W0x9*mlgB9OTe!g;FR;)f2Yqp|Wj@CctkSNA;ZzIYF+=*h5jdcGDze#*x}gV`7`N zM~?NLQ2v?lPxA~Ymo{yp;_GOrVQqazK+lA93Ef(-+01Oja3!{?!jaR*%fa=JcDxmY zY@m@6{wwApTFM3r67|b9&|A#Lw?Bt9Vh<)QPnj5&<$dnVfID=Qmr2@jWHfypN7JwM z_;=74$a%Llw3*^T2urGHD5CAcKNIKH1GGV$V(sU7V=Q$Eub59=_Zgc6RMKP@Ja6A_ z+?8lGeFz&m)}y*p;X_wdvTZ>dZdnVojtRnom|_lk=yg}N9v+I!!7N`3^M=00w-V0i zz!+X&xEIoK%NC5xIv}J6^^MW5{@J!#OrPEzPgm;^+-(WP`JhZ(p+=Trk5?!HB@lR~ zo^!Mo$%Z6$G=Qpr{5AgQP$YyG61b6bG*p?5uTsIKF0}slSyWA?*}}^F;e5d~#U@5( z665GVHCzmlOVpgQ7-PK6cYe!b5=_bMg67TU0;ucN1i&Ct&`jD}lYr9DPc56PV;AWT z3i_etA{mU(5Bu$R&<_%7WJEWbP49kAfeZ_daS1fc5JJsY7VpO=nz>2^9PY9&8aEK8 zS`ro)Qh!|d;`pHYV?#w7YdK=$Ls)6m528*_Wn1p|ZBe~(oYzWARWDv=msaK9gHJri| zb1#Togcnd6)Uyb4pvEt#Z^hwp^vp9Y0uoM*;a>|=FE#{$1u8u3oI3||_zvAgQv1SR zj0xd>2;ZNcpURz-JcYxXNB)BJH-}F@lj+Y7pMJ#~NPlSf^xwUW^rdOib=Rml;!4BH0@&b$3cR?_7#1a!1(RAs1xI>ThYE7>C6{0F@MRLe9F8xC z^UFkh$>WzJ@Z|`+$Z>?Xt9dZ15h~-(uBZ;C0zBD&NH^jN2Wv(M^Mn=(W~ytf&#>Z!dK8TmJ1R;YsB@ECF|v~Uc_Dg&;>2u9>D@3HQ=oNM5*L+3gq?|oG?>v2811p(Z%D_jmfmp7`X$E(MZUst-3d45 zU{NQwd$*q$qOz#7D@gl&{%Nw)`feX>rD1Kvu28bEz5sC1Sxo~}$602OI$MA}$Tnx#Pj)M7J!v7um0{x8z&C{|Pr|Q9+Sl&JV zz|KTZ}bt3apyM2EAUhU^i@WgrxQ-qy5*&#YfbB-htb{%S^@Zd((z#-^lrq z)-Kj4utyp3_%3I4!xMPckoK<`uKjD*_My{Sd)Xh3;NQ#O}I zl#kxwOtQv@@YD)C2f^RpzMjC}wY_z$@6=)HTQZXRmM7K6@#UsD`o@Gb{kyieo>ema zx%BC+cKM&BPj|ys1m(5pEh*{jzn6)+Upw%4yjQ~Uv&JJ|)mIb!TAKQNs=k^7*Y^|D zr{pVr!m{JBYt`R~<(>E!Gy<^(5^c4+KMUJ@>^@;0mh+~V%22$D9=YCD|5)d*`h-fm z{JU?aEq`s7LNJT(=#3YTm(Q`w|8ltUrXZN*A52qz-EkKD^V63%avlQw3^IiZE=g1n z@4sFC#PsE_?IMFv#q$%z#^9c%Z0xbkF>s`;8U<(JvzPaLlNu6X(UH03Mp^6&0U+y8632IA#+z`EV$ z!twsw<$syJyrREs)qx`u6*RRgmOGIrS7f>4x|a&e<*phsWAw>laE-(t=$_ljt)u@M zBh#Gk!usD$ypvL+uiEdK_9Tikb5+5`QZdUfVg6s*`M0*Wk~RG}@h+^d*?vz`AK71Y zRJ=ZUoonac+AgfF!hTOvp6o8#eHuGTcw{L&!paY$pLX)5XqJ4Syr56G|L8dxvAoh9 z>4qw>rVZJF=)&k}FDC}dLZK>uv6LU&p1!;_(+i^?!3;ftdU;aiCrSA=!<4sXdSUd* z;mW^$6yaYoO!*Zy{5K3&{(dQ6I!t-egX;fq4ni7hAV%+lrJ5o{4Trw(}pX5v6LTtEq(t7?D8M29j^aUe$6oD zHM{(2Y08tHxfVyykjvg_)YdK&_AB#-S6M@>8_sWRWid zaj7UV;q#gPElD?K``alCMW1q!fuQ~Bb|2qy`Kx-@+PT(8f27{^KzvnC)W`KcnrGEl z)6TU#`b|53eAQ0m=XxIfTM^)sI0aj|Cg(@JojAULK2pvLi=mH_1Bf8}cV@s_y#t|? zwX%W5=Tl|n#~$f)7#%_1)DvtT6ip#wuOABw7wAYgn&0)q$1JA=B7huX`ISCbw73Xo z!A5*I`J%C$zQrv4DGy($@Qtf^;~mC%O6V0*Iw^g3a>=Ara3Azr_}_NRe0r+}s^^}aPl{4Lp5S+ot_3zeQ= zM`defpn3n;MY(~dwZ+|m%;L({*)UHFWOw27HH(VYyn?<3_U`WdAloP}ZVhC5R#xHD&72EA z00s6XoN`(roR;DnQ(|+)`n~#I;i;WR5hG0CtSVepRz%>3y})-p=&8_V3PO* z)zI(zsq|;hP(K{in%4s7p#r}-{`qWtp^lywTNc&ev}55}Ks8J&q2JdGF#_A~)jSn^ z%HA1RgZYsG+xHJvj6!ML&+{K3or6^^h6fkBTg9PiXW4LKpx{j!(J73@mSXW*F|0cRH zp5Kd8Y>c83(0#KYSEO6p)$T#`9+MWh3MQ)WNe;Fq7~KbM4)*A~y0KpE3p? z@ty(oC(kF!fzHlq3B<_oi-$)q{nT+nCHnI?lkiD6m`l;?*|nf$T%WYbsomlvPFlaS`mg>_7m0Gr^) z$DTvxeRf7vgt?b+>cu~IYGr#p_k1F=9{grKqHAthJQ-(oTz9s9z}soc%*BUcu|mMK zeG*)=9OO9z&KW$9SMfJb6)k;o{LS?Rf>_V8AIMa%hsW^y@ED#h9>X2<816NHjXdyV zCfX5du$wkTL6}xVZbf%Co8N*uGSHoK7ML8matfU6HDg|;J>PI<6Tl=}JH;8F{;M?K z`Y~&bl<*V~6O_@iK^!>s;o=D2`m5+b`|LK(%D`WN+4T6V@~kE!C$W^hwirZ{j8Ivm zw_s`9Zf=0mQ1BWh5?>Om+Iaof|2|%CJki2y+wgb|Bae+&!U$-AP-U`pYrdHeh`$VC z&tbI(LF|=ViCFWU1j(xXq-aTYQkHvBc!>U@uez%c26 zl~?;iyIwx&_-#-AfXgio#lEJsPk85!lWxg<{3*U31IH&&Lae&DwE{MTx4IpNel6Sh z0nV*VN<9nYJXY)dMfQsSL_rPs8y5YQkOsA$DtpbJ@H=bGZ)w9OH%w6vX7q4)59uF- z^uLk|Xj){RKNP9bLJ^}5D_+SS%$ed!#AoB}L# zCzfATv;G(daaMP)uROnZYt;DV#BuwVl+2ZFW=zHAyje* zS%dmKEYxdP5J85q3L|J<^^&Z=&)||a5JQWJALxEFx?B42Br?@0dqk#cS%DATEp7a) zHNV)wUr&qd1N9@pwtSi)WoTi3v|6HV{*Sg;n|Z{3(4Dco1B(%?Y0a;%gt$k$DXCN| z>uSK^sKExzYu9`Mzgk37mL!iC@lkRO0w7bqr$X5UQjA-^gSA11@!WMg>6vnjp;|bo zB-8u~r}mkXT^Z2;%0?QSG~>9N#?ArZLVC&j)dd)KW5N~qU_N&&Ejbz?{!C{fEpkPx z=w!^Nj~5~oYNk%}YdwDM^fG$<q@=W;1&+2_o+^mdCPu&E5OK7Qhuf&(5yJhgjYlXrPVzkbR%1 zIg
~0wViexVWXQm9@U`u;Cvl>rFS4?~f>2$hp_zGTo@ruY%V6oMqG64*dl=>}N z+kfhw&YZ@xkZqS_1M67d013UNLzTkQAf7_=Ghkg2%7&w^!IsU3_dwPsS~+0IB)C%O zJ4#S-F!Z?=-WSIhDkb8~y<0e!^%{((I8ucW*`lZi#VN5>iCg*Ib^nHod8CmarNuCfQ19kel9sydm_E7J{nzc za+%}o^~}L#;+9CbV-T~cnhi!;YSd4y`l(Yt_3CE{e~jgQ9Av|2!kf8cjo7I!Z&Tk^ z@Y_0k<79f_qfuCh?zC!tMpgL?tHg561Xdf=mlf2Iy0G5+b$@lIId)~HXPJ)rSVtY| zfMTGf3Gdx4_4psE8ptkz=FL9Z+ZAj2i@T)lOC|#*W-#CTEf*MrMS#dw`4J5hHo^c|HrN7 z`%noYbBSmX5OM)KZ`sdox4Zpf3#A?Dc1V|IV1O+;fWgd#73elBz?|KtRbW!LF$(PV zYxk;dH=@Dr3Q)8mc(;1bOz8b8WJ2>aAGF*5545l3uogeZm`tLjSe`UeJ3o@z>p|^) z5d{3L#m%t2_JgK`ewtrgNt^*Fc@OC#yP$s7VxH0uPy0(cNDaPt{oX|V{FqXEVCm)# zz$=6TX2#6V@dQXzCT2+8Rc!FH`Q(#a2Cb%kVZ8`BEys&$7dn`regzTYCfR^uOEtrF z(o`(;krt%^aXqt?EEi&HSVau2rig4j2(+2sKWl$16#4Z4sU0kWKO}lB@{FI=fm1No zo^lLhq{aFq1?Rs11?h^72G+DPjGHm9j+FVvF*)cr7FIIJZ)h?hyYuVE!1AGm}5}(bKict&mgYrTa<^oruN^#AcuYzA5)fq(yGe$H-AF8J6{L0;BcF3-c+t zqspg6!U!qwtzxv?AuUswoZ2E|X3PUXh8M$UF8q~nop6Ww;D2G*g8K1cV?jQUDj9*) zI*=4|%5i{s;y=Nr^1(e8t?1d2QzLF6g|_!V(#fS%v0=^K(S>x*VUNDXHfu)tN^^fkiqaq~>$K zC(&U@z>7DVmp@G19`Q%5^#$@~7}ccC*-t3y~a029MXal*sRNBD6<)RNX@5{w%Vz%Oc zr*?_^Q|Nsh+tXUExJ&=Bg7Xkq)|5}n!vzEUpu4{H^Y}g$u!i-&hIP}r)=YmUgLxv) zlwt;yya{aiG<|6kMoHJIJELRwbYe;9lX>I%>fLIB0iUj~$TK7nBkacgV=n+sG|XL| z5<};;66y7^yxA{uO$Ra7Yf6CH(IT~suaAGUM9+)HUys^aV|f>&wvch=X~-CgG`2$0 zABbFmwLS0OJ5iKs(PMAhj}UPT<`K(ViQJn0C_(13^#@ZeTh#!iyTwm{2pHvKJv>Mu z@~fI&)oV$R2s&D|Qp87^sFzg@KzPJ|kQ`5<Yi z805qz%9)#o}`t%>@thMs|IHJoi+ZBrxCrVLckmhS#se#W zg^!hZ8a2m zv6gs^wAA5;ZUCjIp`M?5TAJ{~KRqq2)|01DYDX5be)NMa02D%HUcrVyHH9n#MaaoW zapm78c!vNa!Fy!0MV~aoV7unD09gnmdcGV>`0!Fpus!l3t_Vq71jV@uc4>W>sB5gXw1azb9~V>H znTJRx;JF%-@fqmGLocO(K0zOUI4Qx&Y{aoOtEFmT-R6=-8U5js^|8F4wIetxND-ri08Yn3 zucPmPzcs!RRnUsU9SB=H*S#n~cuOTZnnVVxh0noJmGr}Gy&QQ`5;Z+sE!v~?DQ-U=Lr^&FFi#PX)R5SaA%=GaT6!00kDTI!&7%T9U znCqd)9h4MgGGd;;JIMviShIEMI!Kf%q}rI1vAOHgzB}Q6dG`#TbZuND}GBp;%K|Iqc7gZus-6F%VUq z8iTSeHk+Gau{lECOb<)*cDM9V)7Qt!zi*v%$nFt1(vV)4#IkcvM!|N-Vypp^hzq zCB6pH@l@EUVH4hF2{ z)F-QH6*|#}B)@szYxX+YuoLSPJ%J3SZilSuH9K6NaqS9Mn-?>cgo}xDs0)|f3E(3$ zXfIsh$N~~Ghk=XMq=}UC9xmX(;ns;#+~WWwy(ryY~}v6g8*YBz{NJ31HZ6`@T(S^ z2EUXb$MGS2(4NZn5Z20e?Llh@SEwPxj|}0;_z>Q245lEDZfp#qry}BbS1mrK`{&#N z?R_ITBD%!Wf{`Un8?ZLQ#f`y95WfZ<#jXUk*gm50y> z9TKooep3Qg_V$nCX9-w2ekr3Pz@{fN80*E?MJH&f@hy9C0?JIG$XJ9gLl9jQRPW{P zurYoql92=`lkG7;sJyfT$DV_7^LIzXh0RNF=UI?C@KJ##SSMs5$U5dIUZ(NoO>*!H zVGGB&n04^Zrxi;r*i~$I?g2N=h$pVEGLh2JNKkkh_XU^eBAMX6vF{?^mM zwf_%u?*boXb?tvAB!O@VGb)kbr9_Py4Qdp%!HCX42A+`_2vsyHYP``c%pM6<-?X}lhdtC}apbY!349VAYDcc%n)rn_GWH2xqzaq1xX;=fV6Ke?5%0c6O zMb~o2#p6Yb-HSVl8n_^oYnHEhBUgO5w$&NX(p1#q-fe7nJFE5WY@WBbI@tp{TCOjO zxomdi%R!okL_eEsFSbu-vu^IO{H7QlG~Tu}3ZY2m@{W zGW+UVIPL-t%^&)jKLV1?ult%#716tp*E_Nn9^-4A$!%Lxb_0!akk_imS9g8`gnGfH z;oYoY>$^#)R1DZ!(Q=0imxlLz!PfVZP^lQOqoU>UA_JF(|2(;(LZ`X) znjdml6|fCJD)})0Ddhry9Q)q|NQQD_Cs5h`^XgwWewnrKv{hheM#&m`OPYUd8m#y0 z57x8VvvbF1bnO{@aC{o9@4QrdHeo`Z@+>Up3#HQqCuh0XR~c4-e@3f8)gjS=an zQMqlJ8Z`rUxD+4U3g@e%C1y-5a~?iTN0G2_=$1x;5eVNM_rO>cn9`e^u1pRI;j+c# ziAJ-s#Oe@mcq}sFlHjq5J$WsK#30Bjpl(kIp7!abI!Z9DWy)(y)YaI>T$Sf=kKR#5DU@=k(EA(L)1Ui zb^s_DCU1&q1^LKLp~?2wKCzTBvt(rMVFGGb_JC)#%$eYW>LiC;EnVKnR{To1ud7k@ zif}DwbA%@0S8tyyhQ!x&5A}`x5KYm-Iq;y3<%znJ#1JQE{MUPSF^dEtR^dF(brGz)jg6>cqy=x%Mnri$tL1l3Xix35#_B651sN zyA_?uKD$_*Y`#d$3c%4IG&$8WM}j14oIDoBRR+(s5(jU&t6R%Q*bVlA)ON*wFvR$4 z6B}lgpvZp>5z@#IypnxNt2DQqS>K|0)kmE|Wc0@Al&zIhtdq6sTrn zK_fXB|MgS+-M0`aNsdpiA+%wED6-oPv%k*ObP~eQyzbdS>2-L;CQHl%{(vq9hcRNO z#->B-gT(|JN{`orWuVzV@G75|$AO^Al73>d;`JypF8eW`Qbn@CWJF;PBxb+%y087x z;CDb?|HRgSQ7d%TLodZEp{k#zs6fUxFp!Lzyt8_fJchUb&MBf}UXbt7WGI>UjU5$M-Cw^&;X}z0W>|e=TOb%+@%dK?ZiXxFhU52IuK1(# zDWsj)bxCQbf#r$_Nn$$;z7}kW+B*zebx`Psa9&&%#qNFfBaoNN;;-L$?3SSY2A5;5 zIPDlezopyWegU@Pi@@AkQu_I=_*^*kiGgtWmdiQ8WZKi?L(%im$fiHYhS3?l`t97I z9eOe#b(O^x!f^J`j@T(*QN`TnOck2cLg&14wv+O|Ua`#LkPNjTBKgZw-(k7+Q)u96kQ|=519sVja-aus=Oj0zy ze({~)U;?^)QHIHdY0Qk~=O+v>y{%KX=IEb`^v_KFbDI8%=%0!T{s|B>=AR7Cl_kOJ zt6hLhr3&!B6d0miZkfE7y?V8i%f+6$@N;3}5RF;gNj9%(eu|FanJ-ytc(PQUDkyeK z4Wm>srG_R;4M~<7tWrg8sa#4GQEE`K)WBq^9F;0`OJ!54kWyL6Qsh;lU*_dxR)G(h zzCpu69-NR3FR*y6kkggpjTmpNx{VRG(M%a{3Qv1;U(qs=>ct-z1vH3QX=DaFXL(~1 zu`8(zF&>0=lW%Y!h|C<~503z`1Q~8z9Lp&>U(&8SIniy-O&o*~TTO_;Tv^Vae$BqQ zpb&2D5}mxoIVzkxH3N?eU(;DUu*bjAFg*ji=2*^)T(pH&kx}vB+GZU?UA(+4)H)!x zaIMamqR*K#rqGtQP=|Zmm4EvM1F10D;hg`1&H-Haf@){Y$@HMj7*3ITA?FS1vSQ84 z0G5ugT>Bqq_{~O^Z`Lu0;qwIhnwDm%9dudS(!5o#;yL@d->aZr%x^K)P|^fb*EXIy z2WHZsaGEW6#w|QWzQ}OCDj|TGZ$)TTOS9xGj>5IM^Psh*xtJ?Ev^Lf}h6_IG;GW%_3q5YbuG0Z*ig)+*uKJy;Dd!h!?n`K<>Ki^j*=qAZ1KN+iKE@LiQafK z0Dk=88(%)e8G5A2CzyBsBG5@@|3Nnk;Q{037cNAU4fwnGcZ=c#C{1A}9yWD3aG1cbtD@XLOSK1ZRbbr7fWy`~+G!z+W-ZY61zt(Z{;m)8<4Yw=@&&u$zFNC$$|F}ow=%kMn(D@}Ey z{m8JcYUCRM8r#7+HP zACfu!I5|>d$(|fXPa<~C%L}I~_X&L+z{Y5zVIM-Qv+_;eeC!oeZoayK<)24<5l(7b zlauqBc@g$iJkO`*yZzmK4CTyaE{8o7B*`Fi>dqzGtU{m9U_DwU*`O>2tz47&Z!fDn zNMvncD={!lgCBB(t&N_f(l<2Gec|WRmQpw*^HCCG={^rx^Ku!DbL%nSVtmFnDF_o2 z3=xVi<3s0|zhJkTmwffE`zmTVKYAY17Uqt*3^@DWBMK0hTG5Mh&RQ8Rp!N|pHMKV2YsoaMQt6~0e?blDY@KswT(yGr`Os-vkoipPa zkF0f2(XGxA&ziH-kfDB{GrB6X zHbezOpj1v#gXm@mL=!dSNC`qQpHB;&W4?k&CF$K#9+f%1Lm_sYgm30%EkNR*PMva<`&EH6OmWl4%J|abTik|oA4xh?I^R!5?mqlSwK@Z*70dxVin(*qL@#7oNa6zo^4NqEOMnY=cj4tvgsF^DNegU zl!w1^5rxUqDNzzhjC|wz4aLtamhNz!oj39gu)&$ zv{>VLb(aprtahM=0a1wOpJwjAz9mNtvPL!$j)60t#Ae2IL?VBTO2&^n&Z};`40Gy- zRKzYuA$IY*T_v&5RvkTt-tEHl(R(gDDPe)yA=vQyFlByrs`NU2KvpIMg5y z@{!CV815j_h(_WZ&!BiOek@c46l2zFVi(d;yk9?{;2VTYRn36>7KkAWcOOE@V4Rx zGxl|;!kcFe%qTl6w|-QtYFSIw9g$e=-9CR{nPzNkYv*i3S$-eN<3y%?PSj=c5|KER=ld?8o1YOp+^9t*Sgv%F^k=Gcoa}*Ae{wtw6 z;7?a;lgDdukd$BN0)sLG@rt4oT_-lzUSy9TGc`!!AGtIGg;tE>t@U^hkxMvM#r>K5 z=`;`-ZWxM_LUsfz@l4mR^ptLxo0z^Kj}<2|o18UQp^}5N@bWq5`2QN9NvzY|%d$PI zU|%uvi}*eqZzIrtgjOSOwHmw+qX2X5d?cLZCrevzQpvwZz!QlG4q{OLMCf75y; zRr40tvJ9t5R3tr@>q}KV)<`DDsIDhsJnv}~DT(~k7=gQD|IOS-xc64<1g+Si$pyPW z1zG=Ig}bw0t)87R3-)wx!Q!m%)P*gZ%-(71^~f7{dA%aydh0clk9KFh7Dw&pBjP~G zn)qXo0WD-}-3$@#!m+PYAqunr*m?@uigk7QB+LLc(e1gxV$UiJ8(gg_48!jT=SjyL zEbPL46~8c?=iK`0SBiR5W`lG1v6-%drFe}A*I1m!O?djXLXvloEdl2}n4wpr95p(tH`Nqb=*eRQ4lw696s7yk)VyRIm}Do*4d`U|6owlX0jr5+hE zRxF>*5PCyfx@}TQUDib5u{Sw~K)qQ1&k5+&q60Nj{+@^K_l=*ky{G-xi@pY+uef)? zI+)F|hRv~7nqGzn_ADfA? zrxsgT>!k~|Pbc%+({({p`Id4^oO_;`j_zYyHT z$JBgT-S`-ZUBG-*Ghfv_lxPa>5S?^lVHZ60=B~TEeF!1Uo#Ex8mbV<8nGsmYA!A!v zxbY*>m*bs}3<531cDdN;+&Um5(3Gefg7HTCWyq6=Yt^CBIs=T|1gs9EPrVbuU|nYKXclxPjT z@HPK{&UIGukBd+JQ%coCL-VcJ<8D3nCwM(q#Ez+GnVTJnkN?xD;-0T!3eNN^WkKTt zSe|{;XecI0hSw3{+^mko^I{i^aPGS_NjPVl`@M9}vN$n~&p9NKU%_M5k)oINFgW$^ zb`^CqI9O1557QZ(?uG|ej5|Kb*vw;rZtI7!$+@8qp)?irVQijr_H+~8z}Rg0nTCLr zW1uZ4p`mNgAXy}Wb~iiY@{cn9F?$j0N2s-XdAPizk@c^HkbfT`1u$L!f9Z0Le-Y<+ z$`8y|v;}4hVFkN5JG6Pc*g2okkaT+&%iPx*XXW~urAfhfq54|SGm-}H+w_s}P4kf;BimWj_uw^Vnl3WlvhIGi)v%K1#x+e2{O4wu z|D?WHeF`Mo;6EWT@So2)m*D@r)O>U_9}!9eNeNig;d1d%#sWMn`M<4iJ+8WRSbYP z5F-cGXcsWg5i{#i;3E1CXC-EbpvT%82Y8H}DA5paW4sDRZa(+(=^)z#Br#7LqvEY_ zWYKkVnBy()+7^Z8$aP&kwig?m&uewKYKVaaM)phzyNVRt-Px9OezmwkLnsN>ntfCn z8T(rI(F7i`Uv?ip2p%$7De3lj_wEU|KfwFmyyrg4yPxj2R^96c4?bMUHMhTyMk*_% zkxDx|H1KxoPloTOy?(#X{`T+Plym@8#8Nx$D#oe*8g%TaE&5x|BXt&efX*U^r5`cs z*hi`vb)d(Aq;4^kk^K%+lROh${CNXS&a0_AH?gkq^OJo`?&nr=-ulncsx%F`{`i3z z_Vw4!;fEbA@iwy0qioJdGpXOz-hJ|Sop=Ad_xq~%`?h`;f1UxB&pV;6lq*(xT_L}) zcy)e$B`cOv^JwpjP2TUy^n1$rDPO>EA-`BEr^^4?D>st8YR#;rt;Y?_=-_WNe_Qz5 z%AdpEHvWFVfHE=%4Hz_NP!@msFWdb|{hO1z>i=S(@Ig=;J#PvSJ8+!~G3)yVVq^G8 zLTsA)LqEUM@2sVt(8n+M8$eY<_}i1eefT?&zl_X*0|pKpn8ly|%XWWK|K_M~`fuzD zpjBqZxIKI!gUQm6Aafrj|V5rW9N~LkI{n&2=#McqP93Iq( z&ok7Gj6~=jkP(UTqJOau_*=8R(-$qVP9a0234Ax53_9IILUzLnTBgf1&h7w zsch<-oMmofh!#@|oeS?kar0QUuoo)(=3B;LQH}2zXl%v zo&Hs)_wRDkze=xvyyT>V%%DalRY9hqMR*7CRapvOTygwK0w`*PYd-v*Fy%GhkU* z@0CnowhZkxcS5cMvRl8~aUnmM8J>=?CCOzb9NwCawAjXk^fx zNMlDT-;kTE>W*tbyhe;MyMS z?08PbNUnDeg_5QgJHO2=f>`eALcSu@wMF*-`cn0{??D_Z-dw0@!i$VOs}@2yV{Dr z)q1^!zO92sJlctPsOk*mNnop$?_gPs>T_idqCyl8d2&&D(R_v|$BXsuKF zC!_qIQ7b-k%@+A+;ySKEX*%-SUC@!gCwMx)2J9wiOXJglaQtV>R8jf*y1jayr#X*3 zk}#g~*Wzg|zvc$Yx&1TjY&`!}>|ss+mQoU(eyEnHb2tIUXVl_huKvl&aYk*#Hs7lA zvrNg|>-^!S^KZQBD)>LZ!(F{vre2xDGypf48vs|PXnJ@obLV{eFn!Zm%b&du8uWp{ z{1l-aGD6I9Jb$H$90#P^R2nBmeX4P&&j&uB(d}NJuUI007khm!>(vD+y;}`w7QOf> zreU^nFZ0CC!sUI>)Vq0$3yZD)(FYb$Gp@IO*A0lShde+$`1HIlJ)2sd6heCm=cl|3a6kfZ(4-``I6^}^+#5)gqfcT^L zK{p`sT|iX*#zX9tDjIHVgXW<4QGl#94U6DZN@juXN_`eG7_#laM1r&~h+T`!QTbbz zeX`2cy%x3y;^a~{LZ+5Ue0tg~9ngX?y08c*2c^=2aR8D3y8s&~SQoh$-@Ld4vx*|r zig1~nzUjq51z6-l<0(9aI$TsGac~hHng)9aRKPH_^vpf0ZyEPa*K)?Pn`rz%lP2)| zmt8>rgq&091Y!3l@C;M$VCq%qf>o9D^HHUyZCG#tq%pJ_+mbt;_&hOd+{Eg7xWQ9_ zp}VTTuKQOa_!K2GI>}4RQF&8QsXdHcKsNmGoVzS0kn38=6Gnu!i*Sh&$weMP%g`!V z&ewTObt3;SdMAs#YRfoZA9uF-wr*H;>S4xyCcYS?u*G|^gni0FVzU=#Ve|=3`to4=oqPxEK_+wAt?f&}O z-k^H__yQ-~_7edX3U1(7q7L#k{ToX`t7gluQmZEF5Qpq)kTKY}$uB2S*}{6OrAE`v zYB^HxQwxKY_7bWmR$AI>sfaJ05BF8U!{v`mCbH=PF?eVd$b;lB?+Mv{lsN zuAU*5~StL3x2mK(rycVES#UgH>dvxoCFD%uO@$>ysM zDA&E8EZgt9;QL&+bfABHpNf2>ZR4vuc7pFO?y-CLek;}?OW9n+=b13geoR&{+z`#J zb>2MBWo|=%=!wgGpxw!QFw%VBZdx8){{x?~wQA10SjLg~6U!+bd|cGSw*vo(hy;4s z*@o>unWOIbxv12PL&pYZ{j)|yk|@;4tZ>>efN5Vb14 z2QxqKCU531#i)gGxeVoMd3~3!(NHQC)o>!_-wRy17(s<|uny-WQ-1e&&H<3&jm{&_ zxx{4c9o=0MR_;DAxrepC(V0oTGDWX)?l~OAj4UtSzJT$tgH~AtNfdyvsyPRi7xODg zN2y~VV_Rcg82k$Rzs_M4ObL5j^e0bBmZMTKt8;-esLJ^bvn5La_V!Atx37VgEQbso za+%1`WY$2=ULZV|mF%6C7z6{+P0sbdH>R37k7MT|s|CD@P! zaY7*ZtRg;P8^r7cVso9!`RnVJui|Cr$?@Q67c%A7GBCh@#vIDp-|puMCrH&q zK`~N!_v?*GI0&-^hg}^1#{S2Djof>@@sI0w{A0ZFk1!>ZjLYHFxRbpJ|?a>-fw6kH){g|M6cVQQVtHE6?2rsS|Rrj+Ic$?rV?Nz8JImPt+`%?LNtwbSC|6aM| zkEg#*`QMp9AMz>3e;h0A!Jc8L4)*Jg;gB1j&)H>l>{MsuM&gr;jo)X7bI2RwVWx4` zc7{J{(vmp;j`q>GyPra$8V+mf4P&ae5OcL8B`%!wf!RBLcGmmq}%L+I;r{raY zQog=I#Asuz#7a}vBkc8cMb$Jw0&CaFxZB=N@tLsG)`ZGVJK!2K{I*EkBtBku zR(g6@Tt32fCpLDzm00AU(2vbWtD0#&3W1Cv*arMv!C z!#81HjrB_v$Lp=g2dzCBHTcvj=a;t|*6#Lk^gJ$?Ha@ijh9|Rb zf}MBkis=~_TXy!rRW$gR5sU3%9jFuLJ}^DQ&K@!@=SnVoH@v`W23l%#nv%wJZeQ9p z>CyL@Am7TiStYAyHSQQZZx7$f)<@q)ob&zr>dUj2XLb!ZrnQ9`quYfTW6;G4N=xNo z>1^$hyRzKqmmx;J!MW|}R7Y2Exl{p?(B7huOlI$3QodCkdBa?>hQYOhCh7q(fHODg z#+#qTYa1AiLhxXY^PB&`8z2rN(>VTTTw)oNZ}4dRmE5ruj{)zjSk8s!F7MNeb26MY zTJ-U}YJK?+Sb)yIG5yJv;QmU#ZjN&L*r?6%Op3_j9`vnrOuB*}pdERkE>{s1joB7z zIPcc37*{Bqd@PZGb6+JmAUY-T@25Z_eLUVvwYvD& zHM6oCOmnZ$Ot9gQuhfTMa%~#GjgEL!D0DJjBdj}-ApDlLhsfL%n*ovg zd2SA0f_oR?(~SfYO*qF8nlkv9d*(9(houmI(UA&(8}?1yY&9Gisc5ok}R2bP_8*Ci~< z#|}d&6VJc=N|Gu_k$L!!jBe=k0+A2jwI&L!0_P9+8uDGcjXh4Wt(B7`TmsDtn#O$B z{e>5a{4fnJZ4a#kwygI3C)_)oH3-GXul-0Z zZ)xMgl^ON<=9S$B@pu^>(#_6KJ{QHeqqn1Bbr-xF$IM;u2N4kM_I}nomg{_xT<*~a zq@L}w-0g)c@e^sn2@DA2XUGE2&Kn0{ok+1%U|Xn!@$P|Dv%f+|JTpcI6VFStFd9Vp zzBz9j&5R!<+WtqK6vXpinCDGUtj0{x49xvf^gTLy7s&haIU?^DJZbg^cYf!NF}{q+ zxt+_T_nFsuEP@WFgwL$@Nq#e{?UURj3mRASWbG5j!qF?jl~xo+_gKWqN#k$0;+#VQ zn&Z{7yZ+c(VKn;iJ7YhL+8@i3UWrBQFX~D?UWfP=mdz?^bwgZqIOQ*j)$zgU1@;+EZW?7^8smA3KB`Q}D;? z`|cNd2S3`wT*J&yIzD0@U#dy^!fHGrQ3o^)$8DmlOmI;UeC%-kBnMStVNREz3^JOI zncir!>5+h4|l7>q6q5@qH`bKOHP-jj^+Y z`MlN2pB{lWOtH{#*R=8(QpaM^%|@oZp8st;7Lo_l@JyqmRhG6)57g%l{qW#0ABke20CK zju;DOxOUu3#}^p#r z#YA2Bxrpjw5El_H+CrbQG1l+EEpQuLP~*uN^_Q5yqj?l?jle(6bmNU44hPOjP;y;) zoT0x~ON;=dzvQ*puP-k$EFkvKs`jSPr(V_g2kb$3>XvgpO>0l{R4H^sy0{t!w{dNt zm;JN5o`Zx&WRyDs^=zxI8;jorb{nGZOmfG_l`NdQeB(Lj%BU~aD-D)KcHKel@@K3p ze{rORh?gcT+u3Wzmr*m5M*Z){47j0#+Baz;# zq#Dv>1iDS%!}gWA!FGtTfB`FuSIC&2Nw$b^J4hY|n@F?e=GdYFCDk$%MG5d^R*?S8 zMG{s|8gT3v_R7nniWe zKJB$+C|PI7QHo(jfD>bxW-ngGpt`jV@V}8*06gr$0FU$-V5pev#bHmr5EjRC7S>~( z6$`buhc*c~VWJ7kj|s+?0RIZrXYQjmz7`>3h2-2h7it&_y#ms-lfLCG0xulZ68cEI zGj7+!L7su82JS2t@_8X5?+V)urIo-PRu4f=#?e!#x1m_iVEK}-#r4@)3hcX5EEh#F zloqLv@gNp`3hoZ(4;C>#V`bQ0?;P|?Q5KB!5DgT3l38sRbIz7HG1vUcr8LE`_%Y!x zhGFT2zFvNFd5W`4>+Kj}A~(!+(j6i=z{ z{2uX?ZsJz)lxFaoil=@ymdxS~>AzWh%1ssBoZ;xn>1jMF{miSAE)K6l+h z(-XDaX4jt_w4X(A`bUU?rVC6%U4bcRKhrHS?S(5<7o4@J$*UK~vE7iI8UV79oQ`@p z+jw9d4p;R$eSn#tb1uyMqWz5MR5r)s%s-lmT;1CF68QCK0T|*u^bkysj0VwkJ!N() zu>4Xn5Ow*AD?rSHhcX>!Gdf+91>RY#4`QJmS`B+cttA}bLCXhYiLYX^97gSb;_|=4 zTRsJ1xrmr?$BM7;FF`*^3< z?GPU}x@_%db#A2aNk)$X9YrPbT*7ZuD3g*o@65Bx+(-TD&(#kiO9*P{w(#$1Qa$dQ z3wR@V(n%W7$=}r%;;a&zL^4w|&N`^NvI6|_0mFOB%JvUjwl(Vv5w&or#fmjoa{U;8 z>@0*$sOT=bz!a@=i$<4PF%$5rRS|F>6un;YJf_(0<^irZ1onN7~46$f(n@Q0W>gkuo0%4YrG|U;+aO6zDea> zg~vdF!DI^5r@J6lpLveN>Y>bRC&zj;c9AsUj}%p5@+IH*VWh$#;fwnqYTr>*$qV8v z-3wZ10^ba1?5UaEvIi*Z8ISs#dhET1kxay&1k+(V2MyixiC= z6^$Wv(EM;UZ&YIHS#30SXc%38n1l03Y&LEdZfII8?1QUhqsE*yV7urvVkAcL7Qd?r z1_wvF+EBA%QG!UTY0xVipX3K+q`Co#{QN{>=0}aYc?I01kLhKfrH|&&Tl(O0Xt|+2 z=uYPw-6=1l%RT)mc~~xnuZg)?@M5=ZQCDqS&6x$_vIFkD?RF;Cyj6u_amNhnrVjJt z=Dj%XuXsAR1_S66Gk?9I+$cZoE6!P^->l93muJrcXDjD>&q`KBk^OzpS1 zl=548B5F%d{Q8OCWWJ2Yw{qv)`)1#sZ1s9_yAlt5Q%}CfrU^_6OzpQ7>*w2GV#stX zZfJA-Ci7+7O*(QwKRsFI^(6mWdXoRC>B$U$**_%WIs4QYa%sT_5}GMQXs9ZFj&2E^ z$#!F~M**5Js`s!NNQWrg++d~+Kj;TfRF;JqmYFYSue&(_F{;7}soyyt5gwon4Ccxy zy%KGpUa%rc&5B^&mj6i1EZS&sCN+{Gs>vQ!YoO+RPgW_hl@XmG+;)rJ#B-iEN2$g@ zN~!hej&Fs@v(nPMOnt*-h9-m?wCZv*yN_5n&TYIGqECWo>laH z6@Sup<8gtD*NQ*vHV{fsFRpZOJO*4 zg2Ut$s}sed%$`4mZ{li+cV*f21$IVx&ermQ8TG>-&g_E3nL{5+AM<+fv(`+sY0{6D z8d{!q^rfWrN?u<=J>6RJ8_y6CpY%u6SS!}3O-owMb01-pXs5b$MpiqU0&@2RyrIPK zBTtc_>U7wA4y;n43m}L!1zrfh_-wGFX0v5Ko5+8;(gaipWJc`9YMcbaJnvU zcy(u1H0!yrz0O+w_CWISS*zb45YFmY_2`w~|DA$OWOYQwuCrFPzwi6h8aysPy!~xT zWD|{TwdT2`?~^UX?&*n=%rtlW=fNl(!U)e)l2&XKULFo zr)8g2AopBz`yEul@KD9XT~d$iP$l9eiK8Z$x|MRzvL%=f5mhKg6eJdaIXxtelXl{O zBt}KUcy20K*W*7cb9!OKUX8Axm>?vC8QDsh5%Nl`shi?c{7wb+r6>uqN!Aus%|Ml9TvSS)dlGzjDF%6D>gTm`Fb^XmgT!e)PK<~VYn;i)8{e{XIGlRD z?kJ;Vg{hio1hB&7nO5p?QU+t$DgnAc(KX7bP6WiW>C`zlEYIx3+7+_=wG}6mEY%*H z`aXF+e$Ea3S1mSH>hg{2wwCvmVKUDO~uJ9Avlo)*2maBGK-Ni&RK9sjFPulO_F!HVR zFS-`uXzgoWOc@YyuW0<({qV_(mT-)?V#X+mdCOKx;1ZHpK1GrEI$VNf?3ZMlWc63E z@++&YtXH(LE02(;c@V>PzPLvw8DEm50h5eQO$5bL$uE#_{|Q{sS5s=l<6#dg#M@`BTm* z+QPBA%ZTP|8RKpFp#td?W0G_~F^-hx5Nu{qjZ&k<4=$wJQG2a?6#_IBe*Ozo8N|fT zOVFK={gHF#?V=pMraRduCG}Y1-2$2>d&x4uAOXASFhqe+eDV;oulSnwlNeIoH5UcZ zqEaHA4C7v8gFH5@>dB?(@WLf8)txOuefk7qJ0A(Nka@+?9GVZP-=}3-fjP9|Ma7Ys zEt8q&_DF0|Y1fgYR%w|w3UXg+B>S%Y%?F+OKqv*_W*5+v^bwmPS)HOC&5OWS--MJF!2B2QXwVQuFc{`u_bfUo%>b5ZJR{v#Lh;J-Aw>l7!X z@$;d+#-Eyt+_}S>UYJkZKECdZ@rZE-V1$U_v7c%j%A>BjcrekpW8l0YsV5gSEE-Ht zCXcEc-qbq3K+k2s-E~S+>y@Sy#!netCwh}n$Yeae$q?{*8^n0wHg_7nC*U#-#a*VY zLHZ_Fb;-ub`Oy(Bmz`464-7V*#1zC>XYFRX1Rqz}1gHeTJYy7r*MY`0^#g-(>x-_T zCoVGJ5Bn-Qnow^Avn^j3Zq0#4PA=^{nu^S#Jc|oSN2kO`92qWo6Q7e(yyf_3@oK|Z zWNnh&K`gq=87@99^SrW1R+n`c1q@Owd6RYKTgfqSe5J~Nf*Bhrt!Az6%5C`DqECE# zz%Bvb`3+w#oJWx8HC+>=rl@WB@|ya>q(`Ed=LgXa`c`t4$UiAUu)dY8T?N5aE+vZQ zI=|pG6foC0e`X?~kM{v*7S1~WfK?3_z{U}d*oY-vCpLV!h)@dSWwg`vCbkm;e>y!w z%Yq|58BiQ0$Mble6Js($q}-o}D>jWp*@;}= zwX$|li(po+$*)@06)>|pcolugAfU}2CoZZVY#_r;_SjZg!!Wt=5d*D~PsGwOL2b_Y zrm1PAl2an^!toh*Gs}gz_&QJSn@M&7K!JpVq&|AEau(04<{C;2i|Z`Rkb-E6KOCFt zNAHg=^qkFIKjN%EK)Hb7i%rCxa&n_D8BDiKpjR@FybC)Jv8O?@XCPmh)~If3sy#>T zJ&-GTE!ox{ecRd=j!i1i#&${1-En6BJ7dUuj3(s-D{D%%Wx6%j&?vNYbSp}?F!6~` zsU-aK>URpQp_{GP8Eh)2vZYQ^V>Q9t`P|??xz;wk{HUMgoRdYrR2y5Jx)=emz zU+1(xOl&keS|AzcD)HWn*NSF$ZzqIL6(t}oqEU4bz9eF5Aq+g;S0Rc7B;W|-Xjx$Q}Jte0W9S;+O!sS?uKsk-xv0@ zGn0QRVoxno1<++-;jH$_@cNP1Q(E!7)7PD3e@n0&18T{+2S{i+S`w`*%}#@UI3%~DrJA~@?i6YHZIStY@mkf}J%t!)DmTUz`OYfN z2Cc?xsxs=^+OAV2nO#p1tfSUB`BJUr(=imi3cn>{BJGKGd1|dhiN-7C$rP3Wa?l^i zLLk8jy45OqS{vTgqY+%c_N~nOJCtJ9xFOi+;2n(}+nQP9hSvW>d*2oi1SdSoWm%b% zAj#L1Hk<@~Sn?}ofd-=X^a3&rxNU^9!UX1c6_qa|5HgJsy#tpTpVa)YuQ`uA#2DhI z4(NpZB%ISf^zNeEB}@65{!CdJ{oafl5!w;xAvPlxdyR)e+xLL+fy`LWotK*#H(PbY zzM?Q}U&EneoAC-SOV9rRYhNfk8OsE*dG6h>(>%l@aDASK_!g2O7AkDQKGFE3Lf1-H zQEzT@KNw_Q6XUo1ibArB#E-kPa60k3aY?TXvql|;$$aBt0BO zV?BC~u(M~00V=@^);L)vSnCe9f);1{_oXpnDEa$~wKX%W_e*umUx=Y^aMe<+Ib%Gn z81>hEW|-Q`ZZ=Hqa%b(m=17OC?lVqBn zRG|C6z^OB2|1Mf&**Pl?@K$_NQK5N4LObavh&OU!AUim2rau|wH};6hTf8*5DnkVs zNui7p@;3&gfdIcS-^cOYt{CUPdtkl)?#%jO8Pg3MI?-s}+S^Lgi-&8szCTazQ|N#E`(GIGP> z4=PnlI*Gg6RGae*cyEneYsJh_ayOMzsun}#?8W!dJ+_+qF~S0qb6lkEFUwp~XX;tJ zR`sWoI&D^i9N)?T8C~lm@!#J<9btP|k#o*$?R6uHyafP-i}HAv2%H6h%gLK80yjVe z?p2S#W%Wbg5GWQe@(A27;Iwv1;2xykB5=nU0=KF0DUCLx9{ywb0Jvk_fl$mZlvvaAjL40I3s8$wIhj7-u+7LEoY1B%`#iFyu|) zxk{|~>5#Ng00yJb`Rc7CMdPe^V8ll1JYG?}>Ilv=*-*4mE=42Dg351n%Y$&d6+xR< zNNa8TPS2>z4#!WYP_)`Pbgb5hO@?X_1~2$~U>7LZ@Cl+|t-o}AUN_^zl^PjbPAw-& z^~0>#O0#KiHUrJMm4RxzuB7FyiTucT86S&^^19pcy;=*pGLgSfug%6Tv_}>`&Ha2> zW$I!4=e2-3cG|E=D%mN-ADj9_{#_^P>v+zh9JftsodKC%INuoTRtJsLVwM`ko!=jC zJW6g>Z@uRCrg=G|UpPJcvx)&kl5KXQY0@`m!aH9lTnqq5z@Y3R*zB}OTP2vMm%NIL z6e{62!{u*YKB_mB-h`ZEsC3xg=v-KAbU-uar_Vw4F3iDCp(q=j6Mv!gwx$!S@czjA z6X*-Hz|zS3UVX@W*YIv)e$gzn9hnaZ7VgkQ^`{xCzc)=-@puEToFk4AC5QaRm+AI< z=2nFL@gX9>WRNJ~Q5yYq>AH~9_$)j3Z8Mbprk{(lyN}+3OJdgC8aE!DY{0blgt=7% ze;#ZasCL%#D6IjPz%$KWZByI^j!kReIyK~%d=^T!{VuD`al zyX#}9IZ0{V-=w|Qt9IUx7og(F|3?`p1w|R*>Nl0gfC!ucbadn~fP^;649rBPHdkri z?_s`wcsIXy9x)2iq@7u^mm+RwqrEOwpMHRpI7E43uR!F6LXWCw2^aWQOvr2rjxsVK zr_ZI#GqK|m9lS%a5-eS%l}ojh?^JnnuY%@zZx6bD{H-fJfAde!GO?X8YhbGTnY^B%u-;O z;{+zOmv@VM{y}f$N+i=Wc#I#6^0r(Ka>QMH9LG|z@r#A?vhBCJd^mMT+pr4FT83{D zZ0vgH(J8D)D5~Lmi$w$riDrcGLB-6Xbb+-THhbZ5xiaI%aCv-lgpA7N#C@*{JKUWM7xmfC|EsnP>Gr>ww(OlTxYx6CQV z$2#1qbkAXdm&sFp5qvPYPLGSk4v56g&*jf=a@0geYV_r>+mgXdor~A1t#rmDjNBfN zZg)nEF>v3b{1FKZ|-5-TK%H_cWXW3IKy z&Q-ehJm@3L=Hh%Z^h>1vtCc#A;NXf%K_xDkE|818H zTuJKgo6)32m!Lq4-erewkl|)~h?6=^LTHmY+Q2yo?-tHYqAQ(!*cq0}3Ck<-kz3*w zsf10w*XS$GXBSf@jL&OWndvL>_PLqB;A-YBnmNU9haMmvFSEs)mA*YD6mk-S{pl&C z!T8lhzKWKMSMuT&UIcjY9xp2GS9tnLnAG;wT_fR!ZkEl|N57NyXvRmDy>OF~F^GFP z+MFLpQQ)WKuTkdwxTpN(TOz%ZlVdY$jS2tUBM}_2H;b-J`wr{TK62ZPek-JXX(Ino zel{lZAJUz35sh_@ry5Q9A*?DSkn%X}eE!KFS zk1^hO-tkj0R1UCj#c~M<3f?dl!rog2?)KBY+_9%M{=bGNq6>vmmar7>AK@*bDk&Bm(ky1*j&Hbi0A*wllO|97cT@wlz9}<2%;tNt+t3z`4Jmh zolM?zvJlGda3-C@;`3)n#miZO<@fC&`wzNKtzc=u^={HAZY*lhBVj^P6t77G{mugW zg}yH)YI}>z$PP;Oem=dgp;lQcq*qzI3srt{ysEr|Dn*hlW8FXc{&5BxrKCgq`5SZF_z*KK$vNUihE`5Afk&Pfjm( z)|}r5AF2=B89p43R_T8gAC5atllR_rECgs+SS|#A2NQv%lHuYe=|PZNxmlo(IkD)u@?C7 zp$2b|{NeNZ;6o)km;UL)A!q(CWzx%lwjS^oq0@WL^wvWY6c86Vz}B$cEO zFMYTR_;90GoOsT-zo+owx}pCKd^pT>^!3I*_^|C~{osR_LDfw&LYBV{7`ifXCKB?! z-Q%+1Nk*=agJZNx74|z3`B`$J-C4CCpYQ z#^$gz1oIJ}(JG~aQ~W)By2EHH?aBgNyo};?$I!WBk$>6eBn=Q{SlVnU)Z+W)rfPj$ z!k@jtx&CIX&?gSf=sHjxH|MjFc;4@Li?%Zuuf(EulXKoS@gJUPKc|mA{~&Eq9PM#j z#THd7aR!rI&M?FzwTzBP7=aI;&;AkNw>Dg|nlqUz4wcM;jyGJsdhWi)0Ut*Re?*%_ zwY->~b1FJAGrC5mIJx7^IheE-C8vY>#(q)EoV!N`l6xeg6 z2PmA>^0^h4cm-V8rgW9{YS0z?;`uW_0GWVG-LC`};LDyC82dU&lms5bi^lW5PazjP z1GI<(&PjNXyPXRyHGK;;xLuR6evh6-flS!tQ=|6ruF-pgGj)cyu0zYb@0R!a4qodP zGn1ays$my)=BlH#@`fyS7xO-6xY)I{E!4me1)KD(KClZF4l)%!+Td2W?sShjRI+CW zOqH%uC&`dh??RQ29H~Ce@~XTdS!FF%R#WA7&(nCJsW9KG@L;z>Hv=ZsZAlw*v~?Hy zH^NlchNZ+(J}*e00=k!Cb$7;Zy>x_zw}j8}C|HI_vP#$Z?rEW2hP{5IFBbu`(gpXjmB$qHbwVIVX3*&pbQ$oA$X=xWb+o~Rq+KA)Vc%qF9?k8-}{_a2(U zDCx|@%G{;;09$`mE?Z&D0`O0h2bfHb@!+K^2l_@=U_WK-J*VZ?4K`2fKT;w#VsmbH zKbG4O!>*FAN{QQ6FJ~3+VbVy_^H!0R$;P+Axo<887;(9k0rN=g$E{)e1_#(_qD7AbG5!$Hb@7n@qvc{`X+Wjj=e9!%^0 zp#C_wH?6#q!9JBTo0N>B$J?%s!lvst!`~o zRt*!h4RmndCgFu=n%dF`(Lpj6Q&FURH3*<_8ufGBK&ZP00WS^W@{%!Ad4B^V75=Gx zihI*;X*QenjtOUH`TLRPmy6>-k? z8Z^ba8#E21H7K%}Y%t(9cz4eRRl+o=*EE>=f(B(p$<*qR^M0*6LQ|}}K~p@f!4}ox zjj)w#%^MB&TqY`%TqY_cz$U+AnN-s(Sa=Kb-E)~#nUqNL-dx3TReT4sGQe9cbTY&Q+2ReCaO-$B&=IIo^04dDDyT6 zFP4egN?RtXsP{545bB1wfmE^vM$?gm96ie5b0A)U3a%1BV4S`?zc_|kRL}J+-%jY8PD)1Tlh1_0IIaEHPXeY|ch|NWSPdFy` zK0yQ9>l4bO{C#>#d_(~I&MYs+8gaO6Yez3PwRt{)ST+G`i#vY{A|&$vilcU#a$Vo@IF)F-$#G*c(Zr8 zzL}=J-}PHxc=cBJ%%?dB%iusjb8*U!aARw_%iz2{nG30wyy?g@)lKVDof$9nWq-%| zo~RZ45?I>zoZe)8Ip49qADj9f=)b=2Sl0ojt_$6|Jbc6Ww;BA{bp(0iG7a#1eLB=# z-!tE-zUxhW&+XqEVBPCM__pi#aiXd3n!fdc7qd5udtj9_`<=GcBZR47IeRm1mC5&) z^!I*w_xmaRz2DOPzNGhiT7}9LG3{2TCZgKdtRWz8zDk6u=C&D0@@#JtF%uCvb_$t?*o0_zx!ji zgX#6tzCYQ1#m?Jr6`|-nDA~T?E4_<1#G&4Y-a2vNU(@}*Yf=vo^lD##W|;oYwO+Aa z?^z1i&owzYfB-FZn8zu|9kjlGPWSDDt{ z2YdA%-|Tj0_uD(JzxKAy=pNtIecFp>KLtEk# z46ixYU)qCbMp}En-Lp45T0(R+Ne+l@@Pd+p`)*WU6|yT=#lr@gJaKYusX^s^oUY3;p1WR#xkeRlh{-EZ&U z{@UC8gYNOo>C>J|U$Q)W87=yP=i4|UZzstMPR2=k!X}nZT~_?i8{Wn~gznbVD?{;N z(hU9DTlMc@>K}^RX7+#8W7{~nnGrQ&2id_Lq`A&<8G3hIX2 z1A>ijpA4c0hpz4#&if6ku#d}l(Fq>3IyQj&A^fc&Km&gH9c17hmBALFf#e2TNMTN8 zrq1~O@9fRt74-%iPsosmY45s+xb^OE>m^2Ds~%c9_FUU&D!`3hT2IZC&#bw9=oJUOlVVlW~hkT-#j+_zh!5 zWjtBF{_=x31ToIdX19_<+;lrksl1)Y6LtD0DYCnv^E z7;qr>N+xwb=8Ev!@d-oV8=;2iP72Z59>%72@Yol&f2P>gzk`bCdD7#@cu73#_^!$( zh$h;vY~wj@l{;bIp$*so0T}5JW(s#1!49A`moU%aj^tQSq~vi9tCF{ z;mos|2*`zD`w|5dRO||OD$RWMW3P(1PFkd(*{FjUC(XM6A=}=Dn2*Ehaam+Ua6@Sw zeWTF>ygv;+z+{zi6#*|W=B0|?aXDfs2ru~`=RXXDWMxV;hClLw8;xPpFHH?gRYOj9 z4NFZ8V~v8oZw;o~sedX6RKWRnj8ygJS@(X0cuWUA?+&VIioT{;n)~;Rr75qIpkyZn z)9e~3J%r*YA|v6gt1y}=s^G-~E`)_KA8c^mxJ?d^-B!o_z!Mc`os{#h(HlFjWU8#B zpB+kMzRx^@sK8aIqk^j})`D+^4wgeZfK05m5IxIpf~@D5Rcysdd4fWv7WHXuL9Dja zwP`D}Vq-D>MJf#Y3E{v~Mq)CTsZ{~J^RBZ7B;_{Kzv^yd1&(^eGqQFc`>=cMx}BAB z0JMQNfwxBc>tCwV`VQyi9~;M0vl^T$zxWD6&sN`xywP2i^gp8|XKyZoEd>3rfL@ND zJHn$`vHXF$ie*BP{La6@=8+CtOTru|%1@;&=au&>GcsiqaUlmm<^NVp6%)~eM> z$tK77*;jJs(Axa2i)1|8!baz#^R-CYQ|n|9!hp0c1`>^HtJAEQd)V(beh@I`0LeqL z1|S!?u#-u8f^H}Bmkef;v&TE!Sh2_5>J)cCe2JxtERn!g_&_?}jmVFt7V0+kpC92LnMQ6e`w!aNr z(0vlf5j-MMmmkGZCu)BkiT#ktez1G4>;V=7F-`~^-`pbGKvZ*I_xY*FJw!=#dl*k2kz*%OK@ z6fpqY8be2}*7+pP-`F9N1A_Gf-Fgvd*7KXJlik3bIbZW+5P(VVaD>-xRu2|hAWc(8 zES+lyN%lwHFH^mR&IH_eC{>n5e4$t=`_-g_cF?c$#(j{>#=elKtbVLm1A`es<~h6b z`13$iU8O29>$%Xf$3X({aadP(geYJs&KFI5s82IZ3>M2ivrwvJ+3Ii5$o{JbSxeDV z=CemUY2xq92%Z*n&7JHI7)~X&(VN{BP~}mh`2}pYIvVDXmorBvXum{sjcr`+2sV5* z01I!^6Z$xs%{|vDfnV8?tw}lDdX%Zue?ADaZ^;ZPoMk~yM99U%urLVQC!4QkY$FRY zdWN@rO-F+n*0>ovI8j}Z1zTmp=}yS4Xeo&h&E2vo+W0g>ov}?}SLK}VIL}=6g-C{8 zt-<;8t@BGt)+xnVrr|$)!DJ=CAcn_Noy+X-ckd#a_-&OgGH@{k8smVFf-eog=`86PZM5 zZt%&YFDL1hX63hZFEt-UJ?A6X2Ic90LVo?@WRIAThWYp&9;gY?6)73h=fk{ApO1zs zDbxRan6hc}L02O(1iJ>Dc+2>CAE%iil7e4{P^bOFoZ69{8YjmeVwS%2u}TB&P0rD0 zn?sK;8y3(txaENnu?6}mb#FLrz7&Xsw)j?PC2e)SkCBHvfx?1jqDCZu#>U3ZOkY!+ zTDhp3uYdMy{5;3k{BJx8+dijsJ3b=jtflih^N7`p!-)3WBaGGm&~EiMo&>$pugn__ z%iuJfMQ53Ptn?ILC=6nY`5g4-#3FT8+U_yWnPWoj5a6afsi$z35g0Y?Sh;E`V zMW{UrYxq+!geIv}q04AF1AnItWg7cvMJ5~8xbrFryJ9O2-sDQlo?-~Q_aIozBoxbQ zM-NJ&Eu<#Vx9t1+0|%i0;<%Ah+^B9lGPe{lf4^rw7llFoj)*A<;JG zQ0_JE2Jzb>X+~iI&-oi$rTnZzhZ+qaVV6Qg!+CJCirc^5qMtb7y(BCtT1af+Q!qLB zIi;*tmT311J(Vg&b`M;8lvig7nDCzSH{;BxG&X!g#AsQ%EJ@i6s6t||yk+OLPZ0kd z1tg;N!{wjIqb$_PL98?s$jD@mjUFmN@DPM6aVlmu z7O&MLX@MwnT59KaFZ!2X=D=!$vsES*0G??<&J+XwaJ;IRJUPt-8moBI&YK=I{-0md z6p&5x{{+iD_}Y16OrhtzLghpw%k3(&#?|E3{Y}tF6$cuua)b#6f02lMS^=_9|ybX>Oz#pNwGCfk@z*~C1Fg$k|Mr2v7T zIH_DWgji^xQw+9R5g<2y#q=3@?4ieuhah>nHb~qulkwyR@7aIy%m4=d(CCAbxyz8! z+@&wxum%w4T=15+^qY!0)R6stM8VX~Visl=(IL4<;atTpJwwTFtOQQYRfCpu#99Bs zaCBm=@35w#<@y>{8U%q#7+NheIbs?8Zkb*ILpMIS8(0u9xy0Kg=t+Y)^9v6G!6Mq^u-v5E&4Srj6x7Xs4Y1_rOvx}%y$ zyGzyg6Vv*BXj)C*xbeiN2At!lL5qToU|pTByYtTVW9Yeky$fnq{+M&60!pQoK$5$J zZL(Vn#QZ7#hoQsRf2K`dttRizH+xMUu|RrHUi!@WR!q!ok+p0bHij9jbQZj)$mSEF zAFlMob(O9q>cJCK@}u7>{W82hDxt_Bw!E{e{yMQzHKp;SmOZ6ds2+awo z&|8??nTa%Cp(-8{FK7=)+v7E|nYbDN@OLe9ga+xn`LCMCh^368*`O6Ch>g5|}cN;8GZANHV1 zOFjg|E=L|wcFIoSb!uk{Uh}Ce4PLXk{U&&gqtbMEor#jL z=YEg|ujKjU;t#Y|;mVh$apmG@Ui?c6T4qt}ScctTF1tY;ryQ|U8$dXITFlAib1>_h zWyLSOdkBRF*8KHHb0!jwpL&Z4PTe7H6#FK($br0~NXlAXbZ~xGj!shMlMV?rH-e$C zLM*I^bkvG3FqI=M@MU}I%SdcqnfY3(c5$dGJ=)z6<_jC3Ft;BlHTYlMJwYvLW5`cq zSAX`2fbPCY`Z`FmN?IYSVm?Z6BG%YWbFL`qmq^;3V}yRtw6{qon=YbhO^Sgbw0!NU z?xYx~yQhsk_{^jf1wMQ70_MN{ptPNH%!{cBy2U6DAm^PCCPX{V`1OVkIGYb6BeKtbU4UxEW;Uq$wAuKq?g$0YK6B3=xbAV3Ev7G< zoRS05IGvs(q4Hyc;$CY9=782|8|(3AgWgppAMFxiQA%P6kr6MoWXhZsd-UL(l6||O z(47WiM2%;hkQ@7~m zhF29;ZWaE7~zkz8&WP4hf^8&YNh@PygoVtYQX86GL^-33}f|$#+ z^x*nEcpB8|3D4C2Hhpsnrt=L+rwOVU0<|A6+byb6-%spge!xPkQ=wre>3m2|LNkJ z_CHz^M9tuVXl$AbQNgSa8@O|L8vM-J)EAb!BA@n^pI+Ru>+%y5QLTwsCYbyb{hrU? zsPhLQu31TTW1(giRIk==8jVTReb0*DaEm_t`A`89QMP6;E>cL{Ta-05fcg*ZmqvJc zin1%k|ED@M&eSXJ+(*Ss((Bq2Y}4lc<{dKbrw}8U-$msm3G2m?-mp&NYtr^l@z4Fh+pLFwZs-f^ zU0Dy^dV~!x?dCf8#pPxl6lfj5g;xn9?8ajKunubU+y6Sa62Zf)gKAOWovs5@1MA?P zQE5}!a~&Kd;VHEa4lwm<9Sm|QecC$6G4EIhANYFAO|p>?jij%G|AYq>&ndX~p!y#E zFV*mNhX3nRbJC(>yCTnAJhV5x->c4mx0o6PUbmxeN=v|NXlWXF-Oa$IPZCEYmt->3 zUDyoPpS07>V6-dqcstP1rebXdcd-Ujn}KOGKiTN@y!xiiU?!~z&;~MW23Ln&KntLK zHUky`@b>t}tqu!Z_6etM-4 zN$jlCqPN}1i(nv{dbSn+v*BQN$~D_lYNZu%+3Dw87wSmt^4cUv?=th^eniM#*gK7x z@1@}R%rShtr`Dy;{miM+ji!HT-25Y+F3N}k-^lQvU>N@Ryh;v2%=uBTULvRLbX?ui zK(g<9|3B{D1U{K~tMBrIWq5{)Zk1r6d71vMC#8OV@3Fp(gFaY5pS_^LI+j7AU% zP9hmEBeX81tyOBR(rOh^A)sOcn1n?LXfaAvuv%|AqS3YxpgO4#H zE`igf^*BEhJ#M0>%sdiolQBHoMi1bH<3LFoST9_{hOrPBY{81&V&WUw8eDu_A`6x+ zQoar=mAmMcm0{VT&B*UCs9g4w%NICgmvNPwiVjItY|C88Y)im#5Pm^%3va?AmX7S3 zd`*UsEqB;o+|vuU~HO-uSUc6Y(Tz@hbW2f!LKoPmXDR#)j1j%G; zBk#!yI-M&*WL34NhM}%a#yi+0tbC?Cch#PN%bBG*5r$#~e2_2DL8hv`&V)>vF$En% z@+%)I!?+YbIe>gUbF>WLvt4QcgRB7@rMC2RH-ZTm0ijHwklOAX-GSN=AnDm2D&aeE zit7OH-D_=l6D@}b@82nS3!MVq)VpzbkLd#M%YQ<6@BO$(cpIJIeZ%=(;VsI2D9FAe zymM}_;r;eMJHUGlewy%p2c`RC*+Fvv-NC!_2zH;R;4QQYcqffg@Fpz5-QB}m_`3~r zNr3j_gEI&nJ?-v#8`8V*NYDK3%)+UtoG4QX$mkG^6I`UO>Ba>Y3Zd7q0q{Bzz#F;7 z&$cD-x^=n47`xZxbx}q?hS#SXe?zRs|bg;dB1kP4%2Ldl$>N}aHHom$M~cLxE` z1N~iBXG4X6bFRSpQx|?0sb?~KiSfXCu26(3`8bGAW~SS#63VQxS0Q%cDOsdggfCdD zSj-PSv_yVYsSthmIr$0bTqXkJ(XAjHtUrjjxJ1us_;I1p-P4mifU z#-(I_m5C%1gX8a`?P69~dUPT(vB(qK+ypG@5l{8FEQilc-Nh5qt zf@IqpIFXsvy4er3v~(}TQmOQaX=PuJo^4g4858l-6m9Lta|FNopl6JA9zrh+ffy6E z1jbIeNMVdci}uiNp`Lm{ zXQ+2$Y{m6mULwDAg8!YXZ1@vRhY0`C3jPE*;V*#DLmV~qo{}q^dNBI94rSoIi zckk#C{w~4!2yOX8+_CKrcyMuq{{%=J8q>2MXm7-=u*ifQl31CM`MQXoMZ^Nc4@ceE zl+Z)u5h8^|Du%}rx$vA^@1$75&n@FkpiUVc|8DGPcpQH;5x3^uu81=Yk2<`b$T-7J zC*b0S2g=EsDh+6p@d~f3Z-Z568zRC^Kh6*l3dF02ZHP=a79AwNb~Hr(-C#5ANk?(& z>)z>^XgbgRtYM01ggQYq<6*&*Xh;n`5RFMMLS{YCOZ}@hy|AG} zj_`l??8Ab;`}^qsB^&-k(;?D-%GF}8Q9P6Wg%EX#Y7zb-?`(Tveix_a_o&|w`rpzc z{EbfVe`QFw@Rxo7f5iucf8RT7_-7@0G#N%x+@m=~x^H@0b>AKQJNG{V{geKMkRg9A zht*8_Ct!a-{+R0}EHT(s1nFsOU$nvBhQ_dy6Y+`t-9=@cD?Cg(p3vawjgX8Lm_2}_ z;E}k|0THO)YmC|rO$U{e4@hF@Utyb@+P)j`>X}2FLjRk41i<`Vc&i2px%XtLRJ`GX zfdFw#^M>!i2I0M4L>;j0i1o~|P(wr*cW@}VrrA&P1s53@E|X95p<~}L7YXH+$9G|r z`iGVG4#tUrChcV#$PgWQsP-)>k1&f;)BOZV; zWVv?C#8&|W=nE5Ht{(7p#0xgQvhc`Z<7=bB7X>UChfu)kYnCyCkmw0t!Aws7=uJK2 zizZegzCu6wUVM>`jY~{?aSUQa$XFg3TrQuA*o}>^nfQ`dHhHW^U}%bl|6Y8V`+rK1Y1qWo4#akH5ZiI7Wh!4}G)kk4Zf4mNl~%Y5 z#rv>wg+Qm)I7+bww(=AX$BVOf>6w`_>=!qvVIN~f&9k(TBZGaBw4zZb9HS!kCt<** zN~V!Hof)W-{D&kV22wp+WzkUXBI-UxKP0SU~u>i|~_uMfP>IzUPtsflIkR3X4N|Lf76(LJOWFLRwhj z5ZQB94dO!u4~pceIznh>7K8zg zBaam480Wkx2_sXmVRcR(Pkg|)$Q60G*KQnzdpKmP9k;Srm>=IFWAc&7R4T1Z))-!s zrKnulB!DA(@t$FPBxwPYvSbgeS+l?W5NfkDK+UIo33;%{zi1UgK)0}f7SpvxFO1V)uc>0^bHc!STfE~`N{k$G|Y^i({mm1Y? z2(lilQ5W)!059O|gi@d>U(+8`h$&uTJhzCk;E-%O}Y0>q+H_NGm;r*VjULZZ-mVU9o3! zeX`WPIM=xXE2Yq@ZY}a?CFT!ZROZ0WR1?g9hy06XNv?oWOTF)r9g)8g5M$bhvFT0! zjX?n8r9-Oy??M}6U78% zQw}~%*`!P!^$vubEt?4JZe&wyZ712(!V3wqNg)Zc$+^IiP3+BB!er(D8`*SIBQbFF zF+Wl^og%Ndu_KBAY}K zKsLPt`&JyV@0CrFJ51U1&xj?PW~ocH#%^5V`Z4mKE>|X!hM5ejk%!&r7Dz~ zlw(@3=*K&5A9vz=m-u8OWbsntS&7X<(+~B6!@Nsq8fcW*nsFhZQe6FM;5=$E7qpm* znN0M}up$hWxc5b9FG4Y zu!y~S461{5WLpO^wd-CZ!jXpsY<~vhRx}Zi1LqA|XeOYfs*GGSRTNRBvE+6^cBPTN zK#)x%e1Tl!w{LW+qK^1poRIU@8Q-TZvG5I0^^EVPAHp}S=O4f~HpM`Q0^vNHH0)gl z#KTsG9)00h`u2i&psxes|FQb}5kGucC&Vwmt`p*O{xiha8hM}ocMzY0sR8kl^7h4v zCYygB;-9_MM121TZNxt;*NFK2;RG9`Lp{03^MjWtBc!Z@5rX>vqASx*dBQS4s5SlE zxx639g0sxkf1VbLeIqbKJeBvs7!|h?CFm|KHD0@tM|q*=Xc|UB>mNg5 zwX{g_GULl{sCH#+UU;G2Wt0@tSwx}0r$1y3$+iJE87CkQMT&;qhCOrwD_HxfxIR@ga8i5qi*5BCV|UE+WXCE7Hz5vU3B~m3)Lwk{v6{(=+}5 zW+A{YQP-1scbF;anBnz_0T=>Mik1s?>^ zg2SZb-$pcKA{_#f*C9BO(mJ0VD7njneq=|h`7?u*(#Lu!1BA0DaGXz%bi%1GQas(z z&>L|+paVv~X{9w3At6(uK71UlMU&F!ttSImHJezLhRPz(xO6%hi{D;(z~rnvVCh5zcovTir-|U<1x}h;h4Heb|MS39gY(bpIIlC04wjZg(wkNkgeB)r3AL69cxnf+tv2!Bx{AvF#gE^Fe&sq$pC=2#c z-8c9)-i187;%1LtlpFT8z*5SCgxzI4jqQV$=7Uv!6O@9f{V1uX8#lg8b7_yWYA$ID zwsIb9e?l>Wj;aQuGT1N0#7CW9J9p#t+zr zp6=HxpjkTgGoYJ(o_UY6@4g=l(NdCm{N~m(PyH8}cEj>6Ok0P3$+UUK`X|Y>EqpFZl3w^5GIv5!54gMHvg00YwN< zmLt&fiBOx#ib!I1RxK4O@a{t2WgssDO-?uNd6;<7*-UkldSEHOQagY@mw~rv+mTJd zs{p+24L(5slAJTTw!=#6ly0Wk=oY|P}DA@Hg7#Cursyi8*{Ez)Shqr^6*J6TQu>2b8}XotAD$50C2>Ed1FF9x3l!GeIJlg4EgYs^u$dAZCM^59n1 z)w1-5m)MB;_`PVA6kdsIh7(h2eV-7ZU{#(M1bZ>!xe2Wfs9qwESgkJOuZUN`rqLIJ zn(;2tGwZ*kmbu~iL@fi7f5%fxE>>!0$}dgZ&aX zY_{&q&y|XwD?9OXo#N+HA{IYa940>tp(nUwo%opo^*`e0S9}&fQx6!`;y8H8&!lAV z^CBT~(GuP8vo$;${#%XvHyj>6yU@XE{vkg<`oSUbvveDY$dE64svCah9h;w*pmF0l z)Lj5Sb5@vKiQ;FOTv(mQ8hLaV2LbbukN^9(rY*@IFE;hW&yx~b9Z)Uoq*t4*){*49 z;peY$tU@gN;iX;q*@~^?8Ieaj^YgfE9r=0Z9;#mH68tP2tP4+S;f12zZGQe5smdT} zS{4#r>4BdGm~Zjf{}MlUq7~uiN$BtU`I!tueje6G@w0Fg{J!q^`SZypKVKTO`1xI2 zQv7^@d9B%~Q;#(pr{a>Sre!_VIv*giw5Ef4u2Jeap5x&hTHXXTJw9x)b-u7Q+&(cw z-B8ncSYRz7K_zHu32K%>OSkhz0#{o>O;|n76;C+OSPg2*;ve*MLSQpdombRMshsA# zuPxN>4xWs%xRB3vfh-;qALs)=BX7*9sMB@~zx@@UiaIYslCUFqA}m)WNgen10nMPua;t@{_yXobHEWr;G)%ES6Y299k_?A=_E*j1uc{U zmx|Un&ZDpItks<>rc`o{X3&(1y&c`I=D~g-Q)9sn2m&c-TS_z64Kw$4jDec{BzT-B zRqYhT&Ue7FGGZSEfrf`f5narNB9HP8V!wb2HG4Vk8oxcAivebEq?#uILbJ;R!_~R! zty-C`di)zx63Dx+!v1Xi6m7C(m#Nv^P#0~+xDKr@=D6%uMcX1OOaThI!0@5j7wMUw z|BaF${B)uukRU60k&68!qv~gtAXp4LaS5(tR%u^0o5El!y~j36&P~H)R_xe0Ky7W% zBhqnLujN~yLs%6U>DN0Tl zP2JCKEH&t}ai*NYK$?L;}gNQ69NT#6ojda+Q?(L8VXI;i=7C#ZSx(e?%g zb|#xi?@F+U>`0-pH%+a2Q2WQ1yJl-1XYR~4Yu!t#>jN?^#KxsQsWU^ zqWoBD94J@U>WoVDSe@}XE_E+IDwO+L#&Lk<_!HJx7Xi}0+7ci_w+V5hMDbBZ<9<5- zl+(gzn+dYRvIv5eu#{gT{}k5Dsp;On4=%#J#R*~qhkP8a*tqPb?!`uNxp69KaOkTp zpb#=6PngJCPO2|c&fR%Wo6(~Sa4%sM1gG?XSA|R?Xy?r*z{yARb()l~N;^nY!aA&Q z^7+P^)6h|FH9LaaTmnv$&f?zg5@R;nAmWx7cfJdr<$2t&KmB@Hu2Grr_JB@rdzaWu z>f$#|&-DD2T>94~UAVLbZK}}hM-h`txfLAvF2x=4X~PyvX)h5Yycc`U@|M^dyBN6b zpstq~Yu_>1(+xT3iM=b_DV$()C#F?y{EE-f{OX1Fqfg7MlO)_E5DOveZ%?0RVWSF}t54|UYPS!nG4K>zl>zI#Seo>gBId4&G004l&sHNpec zbtJ2<`q!FHg8uzt+hOb99Q3hTslzQszpaO)e=}rUYQ$Imx*Pq=5y$oKB0O%Kol7RD z=FAXM(g1AmuS_spUCLjPM_W|0@^~_u1^qeL_z5d;KYGSL(zqMLbf~Bkey%{C_ zW7)lb(}lBlVbn_hrasu6{{89ZF8cRs)jvCi{*@l}hWrIlseAp)qn;36+r@D-dd={07xlYvjwL^uKyVU9Mj%av zk#Um3Qzf|CIfzW*&|?r8DG4jdLCjO>K8TDU@m}7YZYyD|&K$lHetSw6*}-$R6-{l$C+ZUT~(Iiivr{t^}g?>;YOwOJ|hM6)7uYqxdH3Zmq zOc8;VUg6^@X(%c6HBCP3ivJ4=|HrbgUkouti-ZnDKEJtTc}UNEUG9&?{Y7%v2OG)L z^eZZ)OxX570Zy`~#h8OCH7+e&Q~{eWnC=g+B%=J`J6$*oCReIktYd_rnXk$#+k;Io zTk>Pscl`o=>qXOPETSg-LcYirQMTCQil$1Na=yTP)#TmNQTDl9)2E`VojioJs7y6< zE*nBD7^eu0!4Ti0tGDfMNf@|}v=2S=Yt+DxWzUuF2pFA!LHS^`1;B8VhDV+H%C)i# z!Yzwa&f%0@0$NPQgURqrQk0|BGec<61Zbo@*XJzUi~T<`3OO|?k7t*-vj~xIeEMD< ztb^MBI0y1E4s>q-gGw*VFE0xo*WfNovTxsx+c?W+j;5DqL^qnx1WrR$JoK+2(??)) zrNE{Xs4c|=%$Co=tI<&%S{ua9K)0c~3bTcbcnjDlgXuwbF@;Y*nn$A=Pkff-I0y5S zA~Uyfi4fV21QAcCbrD1$vfS0cQYF?WAC*&eGH|XZyY7b?SfTZ~>uUQGiTp+y^@E;r zCQZbiE!zmYZSZc0P|692&=*Op#kx_be}bw%o;N|sVE1#qSMvN<=OBlN`x9Q8S?a7l z8_eU6%!K?2A{}c>EPEvSZ}2*k%o)CeM!SVC{2(Ack;;dVM97ifv$9R|?FC9SB&MIZ`e}e#noJR*-A{TQM=pTn~ z>BWt}IEdkGEnM7)g92TJ;kkK!eJcu9@g&f3IKgbzBLcSnkvRnM!ymo_J*lxuP82r# zM6tmBni}$J95RIAn`Dw9q#ba_7%+?%%TUR-Lw;Ow&Y=B&4pMMB==-UJuIeL=~kBj*HoVip3uSEK=9bzMM+s?}Qv zLM=SQ<%1Ln2S0D{Mj@x>d?g2wdO!E++tpE|s!5z?TD?8^ip)6|U4e#@&~`X@2h#O! z#=p6EI(rB1=%d|*1-m@XQR_jPE~Kf?g?hOe1HD7xXZz3bOj|5_xeR#DTuC)xX~L){qmozqn8kz4UX>MMq9mhE0v>-VAQ&tx0#Tai9RylDZ8|B@mSaYLyABG8@I0%|TyIJ0S9xU@Z zRxzfAK-svw(0<7i-emmim=vBY*w{){T)j7V>_y4oyx=v6h9C}eKRO8q_ql6=2cuVW zrb%nqu(Rr?xS==9ADu5%r$&zeJgTn3wZi$c^Sxk{Q-PcWQeXHpA@u>V?3)18uy>!p z?_f0DY}^{<@H!bMN(E9X#Fta9p0dtuXMfA#s&0r3rpy2a2x5}fDm;3?TjFIhwpIsmA*SAl(Mm zD+4GE=KvVs>8<}ni{PBHVtq>?mZkMziM|8pIDVQ66|e8Y3GA_8Z-i-kwKm~FpMFJ# z0*R(ymh00u$Fg@W0v|vt04OB@PuOb+P`-%v#c=To(DwzX_oC64rvZy|+SoOq)5{aO z*bx|p5hOl_`wd<<9xpaL%UJ8ujXsRhA+cC=JRs#J;{D;1LtiEZ2B02TpjX4_3`evN z{z8M`Zx-@IvS1K--NUyV_2>LM)~Ru;b95``K@;Xs2~?PFK@)SkEmK53&3aLbAgm=V zg}6$n=M|h`TET%sgNCWd~lNDN;sLB;Q^0%HUmq%JA)|09Arp z#s~EK8E(e=kT2$GSa{a0gb$k}IrK&6Z8}QJq-wL`nuu zl}o9YEo=CF9H|S%dLB3@N9O&kG4tz%EyyHnCVKpAxNrz1!># z^4S=TPaGF+UO=ZLCS%Hc08?*da{_M|qZfRwj8UQp#%NB*W4YX-sktFF^hG%_Xj+p< zL`8d&@riob+1|U;@bVVpPdP|hrxcjNK}WKO+@-ERYF+o@`l>n(W%6g_5O@OW%rg2q zc+ZLZjqVKm#YaDWAiVX9`Di7aUL3g@$3{LaweCECenuMZ4WG$-se^qHKW(&oaBwP$ zyx~1}%}6N=nf=1}G=~v*6J-XtJ2Mx07mwx{PZgW)aV}rYGu9%oF6XP~s{7|W07?bj zRS@sF4epF&9F>?kBMnL?!(CI66|NYlMKqX9-E>*NE|a=+c~-nj+M}PtzgdApXPJ*I zLwK_~7DJS~pHJUGzFo8q^unXbF^(e44JX#}^xKBkd1RGHc5_exH~(l8=zRe%TwfMY z*InlI>VE(n>U7TCSfuF+^fv_Boq#^}f$o9c3qapt0iEWs4^)v$h`FAi`$LNVaFP z0#A~&R)B&g!%ex0EOnT_qi_J+%GCD>J* z&qgI}6y%U&VGxU%_upm(L&{Tl;Yy^Oak+|e|2NZtw&8mlB^`#$&pgu-wpkh(mjpUv zqy!h`K6}XnH-kN0v26Vzu`SZU9xvb-+;eN8gR$UIR1L?dmB^UijAle<)B0$@w zT!=?dp;+}MV&1hn76Zm=)3Z3jO|k56@u=Ps%l-{MtLxBX9zeeg%{d>%%BE;0X3^z2 z2NdPw7}3*oq#{D5_eGE=Pu4!8y*XN@^>uoh@eK445nw_tZ|6}Ud}(viF_8dU!ZvSb-@+!SOFDuH|_2IpKjap!=#Qk z`EI<)k%>);Zw#x<8Xiyw{N08q73NvMP6}MdA_T&YK7byFIP|@^(eX!@$+3@{6`9~WR@J)=ep>#tF6=(2x^$nLF}QFR#X`s>*-=jU5fxoie-MHzQ9J? zrXnw3upXB`GH{YGgYLuO!ga;N>izl$zWR3fvhNocG&@6&07TOk`G(c|B9|p;yiw2` z7~n&QCS?N>MmJ>nMy76kutLsT+N?%dd~a15LhR8?^fUss4g(&ij8# zOC6KWu#H6IL)aDu%Dz$}fOa%x(w9QJ;)G&7?b7KsNjmTdf}8t2x*^;ABzRR)h!VKd zamPFS(?Vq9;_&I~VF-*8L!hwcCzJsMmIplGGXC-xO7#}uTGH0gE&}(I5Jft&rqgbO zV$i~{22p=D3Sj+(O`#(Q4qoJLCSb(eVa<3Mf=;PzvC)8nM9*M1diAX^sT;{WNX|pl z*Z2j}zZdbz!z#1RiE&5jg281N091`MR=ua9H&cUQ??*HE2vQyD3@=6~9A9o6`$yWD z4Vn(a6z?(qSoFD)F$6bcj2oqOuts3*&QyUflj2~%13$F>N}MZ_5qI7%jJrS7-rG5U zcptnUzB)sToKUr{9d`Y#ImO`{T*cvAcNK?cw&+!%jG}ahma;Ck3n3AZEs6^xam26p z4j$#HRrY%JtUJ>jp4fzp)`s4|UlrK)1l+N2Pc?5B>Q4`*cq_yK%wp^6zbMCZMUm4- zc=fk@1Zr@8gIXyFj)T*daMIjKDi$}K#zUZmpm7mkkkyirp3VKBo zs`vv)E%sJr#W9Y+so<;(ehcO}2NmLpg3_!YVhJrAyF7u3v_$b3X3|o54<0;@ajCdG zMQ87WE#=v-Idy>m%H78{Xa%j#`}+uwV(2Sn!lC;JKuF3Y!tf|O+~cH|WmuDb;f_O` z^l!L+qC1ykYXBjrIuj71v-7+p+Z|?qh=Jmf)+On1r)GO%2u~4f7CBhtK?1`Jfy(2Y zRci%=-Qg$A9%^41Y67qYKL}je_@Ng8{2&8ahI+ahDm_FKCnwuD8Mx?w0UuIC$VA4) z3K`u{*l55(k&ExA1ok1!AkUnE3CYR5*urJPmf%isr8Y7-fieGeyUCbm;6Y(b?zOQQ z^8@p?1$he-U=1?nXfS4>zQv7Zfxxp5S`2n1hn@&Ab`@F&I!AY^ui#?>+$R+e%q9<@5#fO&RWHIi z@t)9w*%>z6hyI>rtUb_?w51J;w2u?ge#a#3DT=h;g2}i1Y9Z~(8T#`g<_J}aJtaSn z)j|d!(GnPC@v|jKK%|ARuw3R`y=LbYvEsZ(nID9(Y9R>Dx-5f`;$Wo}yM?VrFY|SC zV5sbc0ra-0P@l{fMb5n;cPtKTO;HbGI(~psXy)len)&&yB<fn-b-(CyH`U%2(Qt zqL!vVkXmr6yGShTn#rLfCfM@nNBJ#@1z~(9`>%!8!gQ2mg;A+{@b4Hxb+Q&~;^)Qj z_`h?-k))khXTUEM;oJzLza#CSiP$=6McxjgW&vB=>ReG0Gw!utT=PGCF|G*W<5Wb^ zX{Zm&<9!o`I!4L&{%9BCZL4t-nvNc&Ms=q=4d~kwvt+7t!-q(`#rk>0dLw|-QKtIA zuO?U`+2^pS7$VahK;t$+lWPLx={p4=%Pj)y3^6O)fI=BJbdO+rRB#x}s^Y~P#9<;R0BVL*>w7<`calX~#u6!VW z$6L3LkoBI>fg5Lx(B>U5fY}*C@Ffer=8U6!`dUw@E>+w2iB|vjz6d1tnfY$iiAyQb z-uRmwP4UF)yn3@QWh0usamHkAP4){#yJro2p@_}e>n+8ov!yrq_U-l$+vwZY>c`{t zt-XA=*5BwKhK*g#&J|S?fBQy1M~w&7!djF0a|wSYvDKONGGye%ZcBL1e#Y}%G{aL_ zpI2DpQ^b8mRxzAB;f!d3b0{2EnwS;Xsx>16TeT4A#k$R06hW%4yKl6@O8d=3Xq@mQ zz1I(yM)Sj9s}XD=0wAA=7W-uZk;|)7r^3mJOwDrU!j7HjhCgPwd^}3esSR5PhX#TS z8i|Hs^f_WUl3g!d#W^CnSX~cx8bY)Z>x6s8q&pU0nC>{so$k1DRJ!Ak+S^y#4oD6jf%r4jZg=lFpAO#%;X8ag zwhsA5PR?>Z@DFek0D#1f6Mk9?t5|O+)+guqSUn96M6XfK6(jP;z>Gi9vAiGjDk?L$ zoh!D4c3+~uRllp3-rCoQ4uFTV;SGc!9PjMG&4!Z^@?U|q*7_{1es?Oq*J~+FXyfT) z*oH^njAoowEK`6Loxl)p)t(^YxDAPYrsmfa4!VkxDz>(DD2KSP5`UR4uo0gTPmEUY zd?&sm+K6E6cAvAb5dkVJrf``EQL-zpLc@WfqZ(3^uNl=)n0|E-QP`~HY5YEA8o#H? z_o+AfBBi~e*?jOTdGJkn@C{r}sdbc%_ zV5t3a=lqqJ6=qzOGTon!sV)d<`1GZ0itW}ScVE?zdg3(=g@dlXUetN(P~tD)azI^H z#SY_7|5RN*NU}_LdYZcYX{XCG)aAE3UH*x>ETM>mMy^qppTyIlZwK8qlrT#ReLHvN zpe`6;-!-Wxig1bE$zSte4?7%py9%8v-^N1fiT+61Dbvy%t6}Upj71NmIBH>wIigFw*WM|ZiJ6d^RCG_qdEm1F-kU? zhf@D(D3SsxjUw3_`4q0V5Qf1~NI1f)f09?5d7b{E@vTR$bJc(~7uC9xF<-9gb*p7N zAO_|(9^wARNcQiW;UCL|q}^D7?J)K`nZ?SWbkkekAqt+OW^|lPqurXuz1WsrsBgkh zj+LQc<+sVWxr+Y1?BUHGZVsD1vvHyfyTd^Gs(~DD52RvOievMlFSK+=iZ9)9EdHI1 ze;WQx#lO4oFM@xLq~!FJ)bwutOY7#^pNHr9ElG|z{AgghaUkC-G?Es z^`$gv;XbNGP?$e57RzW!{;&t3I}g5k5TC?>7U2mlf7qAnE7%q|&9*;qM5LS!iJQ}$ zGg~sIY0mrV{3&&O3r`~PL9e&QN`Sd10#*PJAn^esUM^#n)YWLFg1_SrL;ytpdiT}l zOY%JMjj^JV1z-b=BUD<5KTyMvWT4u7)U8sl}D)HzHBpc|Z?Ue<|!DBTYp)-VYVEVS9wRYo8^=d|&1cnh7A~mlw&S?Ng zn*V7bPgeV~Bpc-1Plm%le~UQ&G7h-W`;{3xMRd|G6x@HJX});JOY{d=H(_+Az({}- z_HJ$PHUbd}V1&?5sjCSgq!dLaAq6T6z`584PVrXb`KfW(5HN&KP461;oR-lQHXq@9 ztvGD*UQ0sj69JZq8P2L_sXO$`+F^M(tA2$ah&O)MbRle#2=9a^Z8g)G-qR%e1hcI~ zy3FU!6@3cz`r$E8$Vduc`%ZgOun+QrK4!Y$ocBNmXHdc9&@e)x)SS3*a<}`#-m}d9&quFCm}`cj*(90F>c{aEoRcWRf7@8%deVDfRd?kDy#vDq7=s9mKtC;3 zhaNv~J)5y4nvj@x>tOzf6u)O|+KEhe97l`1km9qD-|-$YgwAJihR<0$qDbgI;>GYL zA*adLZfu%+Fvfso@pvlwZ<|#lnY7nswF>&}U&z}-H)k0mn79f$I&1X~Jc>*EjF$>H zgzO_WPzB<5?0slJ!@Dj{?4WtIK49jux@+UKJsk!v_ynnV`xRc?m}N;b>O{NYd-m31 zSPv} z-q!{zzc^(tmV0u?>ZxDjPKK|bE_eplB@u6yol;wopG$KG|Kq7};nzR~AIF!m;nc6A zmt4xP#kvD;@_^bFZRGT<01T%b2sK|pOYp0XtqtwmS}dKJT@Y+z^=sM?Y^VJ&5IaW~ zX^mrCm;i|sYfW`1C4v)EqrKhd#G>zW!2+%WGUk{ndJPQ{(+`v6R(M|`QR4E`7piap zhggNZjTJ2c#8ziD7m>7rE3=$c4@y5C7vx0_SCf2UWV7nYnm)nBr9Dl_Y)Io=ZRCX9 zz>!=IbvXw>dw5)UaDpp(1O+WLbbXF-%7*=rsFTpxBmm)Ut^Po&7TaiSJ(qCw;&EvZ z>r0KJUFcU`#00_8rRZ)7p1>fr#v=1BmRoQa?2SxGDr31) z8^qe_S~jRz4R+~%vn(~`QTN+v>u!_2P=$o$4NF0z=nS<;Q0-pR&-NGe3g-I@wgiW3 z2uvEcmVO798>CQ#Y?@u!YM2Ar+TiqQ%_c2<3kFIGHN!VaUeAb7Q7 zyj2?xdA$WA^644ft+!yY1=MG+x2$EW&^lw)!^5-!PgZaU>!IsDxfIwFMf6DB&0Li5 z@;~VdT!;fhQNc@#)Kp^B#@kpx!D00k&J~l(jmqmNP*EG`)F-};$teI#dq1ZR^oD6x zp9D(xh2e!ZlKeoNWHKx{moO+(O8k33y&zraB#X#>dMS7f)l{)$Tvs_83s5KHQU<>T zhfDmcV02axhz8kTEtfHT7&a-gL^S~MdXO?@Nj*Um_}Yhvm%hQc3rJ#KjX8^S%)+_i zigKjTR2ZwvIE(T5#&x)A&SI-^+nbn07**;KwR+%0DrgbfhdzLvn); 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¥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

2Zyes~KtquFk!+VL;n!KDbrd#-^8&;$C>yOM= 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

*1x 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Ð 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 diff --git a/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll deleted file mode 100644 index b573476a21d7fd73ea1e4b4a53794377954fd845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5571072 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�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

    nrVC9R^u61=qtp|q9R%ITiB8+X$~ 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
    eKZ*JI*alawC(=*bH#mFTpyL@?XF|BbWQBBB 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Ν~HLysx3OkGl4kPTJ|&q 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%0Ac7g<=Ric+ z=&1C)akT16LnTkf%$%(}X6Ykg<(b+>M1myBBDV@6Itmk#Vy?@%Gik1)MVP$_JPv)1 zVN>-fL4fdNBMHVTr1z|Ml;~9Qa$Wk84A~eAkytB0T6q{UL%6U*Tqu6#W7+me<|}2b zkIaFpFEPMp=E%VkpZy<}{jV3_`(cxCH3lo1O=k6H3|`x>*Q9;o2MOmN0vMh+-�#h_1tN|ATaG(0um^h5xkQp$)_i<&GIpk#H#m<69<*d@TA$ zLMNa7Bbw^k-<&Otjs1*PuiG#%Hn@h2JU?+O)kE2r-{0Q94?`(~mmhW;BB1bzNw=Ef z=zq7)^K#|b!|UN>z8WmYgPYmSdNT3W!}-Kpj^@M3a^PMM|DP3fPfNP8DjVy4fhW?^ zEcdss@OaMkWH!5T*Q51#v~s+g^>i|rI-~XSdhR+??e<3*9zFJFyqpfllbi8yIGC?p z{NHo0z0q(wyq=72mdk-|`=btz9{V$a5OW8svAgmn>zny#dOcsxN7s|(+!@T=wWHhq zsKcYj{!E?ObUh!AXY-rk*jbI2>+y0mg!=KW-Ib%Cd{c)7 z{c&JJkA^dEG+tq6*52gWT~C%b_+qqnyvba*{ZWTUkNsH z;VvT#ac>|uL{roR*Gge&j!0|`XVdZOX0UXIv$?aLIXB*HzI11k8~0{Dn5;$;S#9Xc z&=(>%$+d8-{A2oxZ#9@pUE&ot6l5qUhl1EGe`rmrOQ=ZQ8u~Kyl|x@fLa~hN+gNDF zg520pBpF?bniyT8gt}g@yx{-^kA|ab@}K3kOWa8}a2{RHouTXk!$>G2p^SuzT}K73 zCc)G+5~@WBWo#%CHDtU9MH7an2Sap%gTrkx)iLokv0$8_L*Fw4_~u7ePTn`7a1wx9;cfuDspqu;1)_ z>j4FzcBjMs=#z{4_2w%rT4B4}jfY=@uf&u#=d{^d(QB6Q*K3HQYjTc>BNE^m6Gsrb6Xl?oYBTV+ z2|)qfR-1`$+=uRXHk%`I2FIL{yGEFyhj?Aw!Oz#@^>QXT>6pD#s*Boct&`~BS{P|% zcB?nLCEn8vl{qg`0A??HvzH16k=d=@?3T!R)8+bRww@!N%$<(B`FgPOZe~-*@usWM zcs7>Zkea>h&0ZSLW7Hgwqz;WzBWqKg^Nh|Tbpxyq@M;*&3wkoNe?$^aWV#+!gR_CC z^H8c`z4m4<(v?<|5mI5Mv+;Ne)rUN$$!IN0`!hPvaGv433fIY1InU@k4RxOVv*UU` zS3pd150QE%cJ2nHJ^3dJ4P5?VN^9k&49JWhrEp4e2ZOv!?}slGC6`Q`@g%R5!t0KV zM+;n98E;iwN`Q=vL4&27Hvc7EL^Ut^71l7*9~!c0RiJsx#mWr6%GFm*;;WG+$0Y}a zOglK6qt*L%#+L|JEMz`?C&K@6Nvrq?M@0J*uh%{=?(VF={^y|Yk-&Ew(8*^#QEy6c-SRCkt#=k3a9 z8ODP0k#TeN;0vzI><57&g_@F#IALzdhJN&DOZ0eXd_m1v+B6+a@>&`np_&F>s+9(14g=Iwb`B&cq|PA2Q55Z1ZzLR1 zg?$czY@lcb))?R(e}sQaC#wen-hRs%jZj;Uxbqt!irbd|Y;z2!Nn<||IhriGv0aLo z*97~WH`uQh|3|x6p}Unp|8)jxo+isy?+#To*EFM+qHabw1E=P^#Gjap4mAmcwb|6A z+Nt0XZuS$d6JBszdlY=_A~R(^rp78<_Xl#69At}##FMbyq=z(Qfe=qeSferL@VIz? z`vsj22Fz2!{2ht6bB?Yq3U^*xaYTdXe_JPES>(ifIILJN;X*tR-Hwzqvs5oq3E z6c|v7I$`#R^dudb7L4}{PV3=xWaY|${3EYO-TBX^#pXl)3%Tpk{#ByytZ$w{_hPB@*k4Ga-TM3d>Rgw>RE~1iWR}m9Gmyv2V^B5h1iA$V=@& zEA9;`#FCi`R+{O+5G;ahcSu?XXFtn$^#0_0qhWkBVv{svz*H`6E+O2SkM7?;u1Qd* zMME|`*wgP3n(@0A`2IZG`{B6$mh=HNG4e{Ml`e9j>4^y4d%v(4oZnFcgf#U<7F%*&>W{g%Ah#@BNF97#r(;k>hDX7y^E$Q7md>nS)lngI3zbZZO&aMk99sC1``v zdMFJdc%pbdq+|uOiDxyo1MW^>olZBTcAZ!fte;dcac^wB- zFzC7)RS2%ad0mhq5w0o>l;Z3T>QB zdOMoD&VEST0EKwWdM6it$xG$d-K6`0iQUW*1>Uw7FFtZ9cPl17@G6T*4-HE8`?LQe z>-T#n{ptw`sP6ti91`}=FFP0YG95IYOEAmt9_n=Na3m&b`gm{;2ei$i+p~E8c(>xe z#uxX_(RoG{&7&0-*u2A9@dLSYBuOq9PCo6ItE)#guJRkge5vJ?8OA#v_eUUO<*_A{ zUr2I)$=+Z<{!nzEoO-WQ4^6Uq(R&p7U&<_U_+sQ9b(Z!P*?eNFncs=Yq_R z));$7%dIZ=`;#ATw=zB@3*nbhvOr0FJYw?BgkZVV+MhoDIXO7T6P$zJyq$0R*2+U0 z+bvfoo!dh#4CQek9aPE1{v@H7vS^eH(GJNy?*nIWtMc;d>bFHgVoD|!C8pv#keNwQ z6(hU)7@W9M97M8Zr57R@gJTz%rwxd_>fkg&fwiVTgVK_c9`lw z_Y2a6jakbT)>s)+?1U1B($UX~@H92)d0`JtOD)WjxH%+GdEM-n)`&Vcjjds6k$MN# z)zxCQct=h&yjshaFtBv;kEee{z5<>k3WZTk=6!e71w{SYHR1q>Jp=qny&rp^vOXT8 z`+e_KVfiK2r0f1@!p=e0TE2HH`?S3AV<@U80BUkqH(H}xTIgC2o4cpx? zt?_hzA`?Yx2j{}Jsi6yi`nGK<8b{EG-EM-)@_3ZK?1(b_)q%_6iQKqDq`&Mo|9SD~ zwJtvOwHF_CUP5>4+6t4=$WIGc4AH&WXV3fF_V;8*KKrCZIH^UAA{iS*C(zEO*pKj+ z&~*9CyRwD!4mJY`ytse=fhyO}xJSnbKeu)hNU{=W2?RC=j!v{WX+z$xARa>kMe=?S zc;e>_^%e^yupQU+4kT)zWK2O=!A%NfXG_S$LVUR@TOj>4``t`;7mJ&b>}$59$(<#M zCq|{x70WJuON|{|@v07fN4%>f;wMdE1XzCMuP5JowuE34m085svS&-tFXX@uWlV`v zxwuiV&}f*~MbafUKUXeX@{pmdm8G68HFl#n>#9p^YSL1WViTjFsY=mGs?gP$s4PUH z2!HlYCsJgZWIx)^r?2+2v%_c9j@lx9(F%SJ3rdMRkozN+l`Z4|Z;}R64AbVyGI4gv z@dz?vyij;^_E$oB*@P;MsmRu6(#PxYb|wckK2wY_azwF@-htS(_xLk3H>o7F9tRK< z?#uD$?c7&OkOvRW7Qu^Kq&lFVv;Vi2`G^G z+b9$T<5h!cZp zIN+k zo#86M(3(&bC0<+8RDv1RZVo7T!*sdrtegW$>mwzat2sxQxsb|lN*E9w%~}Z~$+AtM zA#Nje>-Z`)$5Tmm@2(`Z;42Ko(8m88>53jMvyy@L-tpZhKEG5TmDH~lw)B>yeP+&( z`nAFgpZ5M{y>T7tY~}-BdB)FrsKR`|d$?^xqDIzKlHaS(a{Gf^{SY^L!F19GE6tmg ziyRQYEE>GRJh8Q9BbgbZ&v*DNSd1urqQXp&t`4%gGaAVX1fTzCg}MDFt`2Of>T0{v_CFrBpH`MzYnRDeh~Ph3E=oGhT|GHjR@Nu3|Jk=&lH#T3B@c7LQxuH zf3P9TUOekAtWc0H5Rs2iuB$Ef{qFgBfAnc>P3zJAhqv>N8`lnk0uWUEbq|A@PP4Uzt7P5!{Ji|yv?j%K1-AFl@2*3csDarutAskuMXFoMFV<&PE4{2jd+F=cx} zLPQ@i(q+LG=?Mv+C2w6BYOB55)RjEl-D*pytR5jL>rLB{bXQ-e^hQt>Na@RMAvd~I ze1OyN$E!`PYLrsuJe$NAhJ}A5b%}QC%~$G(hbMo71GW`>CHfhu6pCKUvOFaW60If# zx6YMhF22jnRB&xrZl)S{dnG4o>ON0pr-)0c^8Hv@xM<|4^#KNlQpsvgWo3xA6gl+a z0;>S+U_Bv72t3o4t5PKZDNls+=xuF{stbs3M~dSN<7Y()r#e>;y?$kwK~kDe4RTI@ z1b%5&;;aG95DzVN1LZPJzPCnE3dub*x$~wxEQ(X*IZM=r;2b206{2YVmRP~Gbd0-y zK9DaEWe721|AAiH;f;K#ii10cl2Vr(-yo*9xQ-+v*SVw^kpW^qeR$ezxQY4IU=f(3 z48i0~d>+h&*dlIR>ydOnr@Z$V$P|i>YWQrmg+uRmTT{HU-G@)41cg2#pdNk##@N^x z8(+}iyr3>r#F3iOm>>vr1tQo`P9NvUn!=rgT5O@$uuSqLx(IXqh8K$ml4MQtOa5?< zUr|z)cH{|NEhLT0-t7Z&yl=Q}5YaS9VL_Qx{5uT`-QJ>#+51Pb412R%?=4o7tax=G zD*OFrw<57?XgagrA6+lFmARke*uhS}#RjBcHZu3B=&gv&8HHdBVKm|%6;gHx>Tv}^ zFtB)>l3xkS-#mrbP7v+%yxHL{0>=@@e>st|*l9V@FcueoPNsAo zz4_`(!_*Zhl&C~}2P_sjl^gLzGkq+Uct~g+W}T6OcqOT<*_D#{7mwGy)9KAZDYK8* z3HNLP{6IW}iC!eKc$^zT={)bGI-#7zocVky-7Lq&az&YF604;GvL(sy?N*2V2Dgk4 z%|d;7a)#Q+NQDZNgz{##eEjQj1Nnn=v*f~bfOtUDTP;b+W$}2^1GN!vBX_+6hQ*Sr zx?S)h7ivSiBw!Qq#4Vi_`;J*B(+o#SYS{Kfp>%mniV2V{wd%Ev{EiCN$y^ zP-Y0_&YGg=n5|3ueko=YAQic)##>ZmM%RrEMEYc6S+Zn&6-`|#8(xV>?QPWOy2ya zq>Xe*l_975qkRBJXGn54Hr?bGf3w~AiF!PlTV8*60`f=)26O^>D48{jAP70K9{SnI zP|nNsMvmUr46lY5QL}Gn5xo$^Y2D(_m_lwN1aaL&Lt-R7(}bt-!@=1c(PinU_Yp-P zh_RFn#KgF!d>WzaEV?i0`ERkF5IeyrZV+t~|-cZMj%`B=pbYeKwM7}lEi?TgXor{5s4~+Tnt8m0rh-H;@Ao3 z6o2r4=aMZffHi`mqZ?K+yI0(h{AX2|iO%|Y=ol<1C?24Ro_Kyl|?J9G*l$# zGAt*I-lff*+=DLXE{Te)RNy=ivfe428W*FDB{K;-ZLhq5lt=}k8ito}=s{}HhSU~o zWW3|%8AAmp5_**t6Tkh5XEw41Rv76aXb~2_n17VHUwpv-f_K*&ng|@sn19;1Um(um z?r!m3`fkLVMqRM5i+JZg5Sni_@0Owid zL?XhN_Qte7aOj zj38HwD71>xL6Kf8aCL|*P|A%$_Ba29oW;|MdWCD(hL%zyRKXXuA~F89UVD9`jbLIVvZ;wb_99j zyCm`26k<2)orFo9pa;oY4M3CW@xknzV=(hEiIC5Hwvx;!=UI{)$?+H}zN4ZsIKgSW zLuq2~Jb()VMBgppuRM5vXH2r@WL@uMou*KO(FQP@P*w(~^>9j5d6D8N@WBWgyWrWh z+AerOVRf4L6ht&>vS`VEX|nQS!oh~9vPNR0?Z6$Z*dc!kkQ z0A1Fhk+z#6uqzFfFc>NirlKh^ct;KeDVDmNJB`+kX0Nah5*J1x{<7Z5hg42vWP}VZtatI+&J6K ze^I6;Rx990^*jasG!vmZAzB!}_CQ3kg;W%f!pp@{t9$YIa)JrzItRxkHI<`H#8S01 z{IG68wP*-YcMOtiiOUT*aI2N{fb`*CSQf0|U&xLg+BkbUp zkhBGs3>U#oNY4wmX%Sj&0$ueYPvD%W(iNP{?Gz+z9;N6CxqKtzpiIqTi`Yh+I;FsqiS>V)sU7 ze!$sA|F}zF;u|$>khu)zitVRF?Lq#Xul`efGS8_z_!CDN!aMTP5p;2x@8lFx&wM8* zPB!x$eSmJ?P#T;qU-NWL5K0* zoMo+wjI5x7Br)*_%z8&*Co&I);(VEpNlEkQ&>*kR?5aZQ{S+=F!eio-zu%z%`3@eF z?Pe*q6Z!YT{>A=<`aO33{;BveXX)%#`<=Z%keHwi%E(*aH#>W?cMtf7cx!#{hc9dE zL5iu<9@qOr&|>5m7V6Xsf&f??(e0Oj?W~-Gk7bh(CISwDV6~xtL8QEFrJ#^G*vsTD&V4#do0QKBdgn%Z zw%CU~3V>MI%~?Qps~5IkmikfU&XhU##@oh>ofCv|TAqC>3A9SsW10qO{GIc3} z4nZcDiUr`OIX7&G#Ugy#q|@#acFj7LUQ;%dI#r7;-}ei ztn8<+2DgxpG4+Ih@>>RE+n*?!RTlRA;yX)3%?5{4exOJ3H-Zj=!C-d&$ums(d0~Ho zDo8Ie)X@>}Tr)9jj8u>E>)*SMPiVvb;H@3#T{|+I!`@>MG|_jlHmPPzGgU|b{mf^9 zmmO_nQIn>zb&V`$SZucy@bT)?I1rx-D*OA!f3i<6OaJvi+rb7-=NwNk7tF^Spdo@9 z9A1L721kd1ULA`KxFxWkZ*$+XGNw1GrQi#$UzhGcR` zCOD1PP-TI}*ZANqv8yyws%eEGs1374N*91#^!1a8XtO=N*`6$M7>kI&`3+A**m^Vg zjT|fE$AZ8-`q*vqoDe@2q)pPtK4w1_gy7M~0;h0%c8f>TJvfBIr!NrM`^Ujl_UzC3 z5R&LAJ5>6>njjtiUaIx5H40b^Qb%*=;Q&WdmhrUPuRQDH{o)I+SLsqEkEoAGyn)W< zXw^xJDqd7mvlPKalTs+A!Wl`9&&S8#z0&~~cAiCSsN=ys9KyVpthHAgsoMG?Gqo)9 zP;z}7hQXHQU}xLfhU z24CDeN9Wl?PA0v7k3uOrCWNj)>cx(I5zx-d{=fQxf7JyRVAFKkRXVIC)FmN-P<1k) z9GX)GpEdBAORM%z2$N#Bbcf^q$7|Y{O+Ar2UVel#zpMFAW*?JuY5c;&s!2$5Hqs;8 zR7;;H6(hQWps*;wtV`{A2HNRYVhR;I{BId2Vj=$rw9I-0p)Q~6b722ICK zrNp`=Z{*I$hl*vALFPlrjeOeg|BgeAXobV~o81cMlLz|&k$*=Q^>*mm@8<~h-S2kD z-6V&h2Osg+@TVL}^zd%I`AXMfyW0)qffao9-CMF~W$J37)E&Jh24W+8E`gWuxcc4M zuuw4?P?Zzp3ug~`HVl`_js_O67BQoRM%uzJFblCH@u);hbv~4umQEqZh{X3S#5xR( z{3``odx#`!Sv+3Tf9GUfK#P6Y~itsXLifT%a<{=1>p4x;sAhA~&!(wM4Voy0dTHTM~hQ z6|zJ;Ot$Lg3odI!Hj_KAj7YRj!r|d^HtWrc$P3%b#zdxZHTT`sZ2hHtC&8TNLI8mv z&nkGW>80&d>OHP&6C2Vqq({4+=GEttlU}>(%n+s_%sPZ=l(Xmvphs-+$YWv+P#IBK zua`WorPVwxb5Zi`B#lLgN+HTctj4vo^VF&9`MLtcP1JhH&K zk(GXk+yV#o{uG?ol{UZq|v z)DxjrU;YX%cCzADGoF_PGReNnr@pMg)#9+j)Ekn-OHz9?Gh(8IL9j^r@E;B%_h6Bw zJgkDg2H`~bFKaXug3JcaJKq?`|HV1}!_DWDPeEQ$^O~U9RY)`>UyJKU#D6WhrHVsb z4bj%j&%b2%QwdK$6Z9EGtDY`H1Y+R<((pi~su6)qXrV@h;Q_9OL~}e)Y;T3uMQ@Ch z??>lwK;!<{K`106m08zrW6|JB5shV0M)KB$k97gogTE+%})iQ7I> zPnzah)O&~#V{3z7*2x)|)-s$X9{3*Tyxrj6NgR6D8}&M=%oJ0@7M zZ-77WS!HdS7r5rP_R8CC;EC{$aLeOZX@8^j2wCo1EjNYe>p;^P`{=ESl@@n&2)eaW z`p>@}YEST~9{#ir0hOH4B-bk?4`+sc$ld%~qMttMYD0yF3WFX47pfP_8-96#7Dkh% zZ>ZHzK8lC-K;O1@bnlzcGbBpx(pqZ_Rm$O1nM93tFFvCfLVwGIu5wwBq7a;e<2wJT zUvb2)9yHmW#4)Yt8tUm6i|)l^Rx7%45}Wt=NHX#>gDKBx6pCK#ODU{$CI@{sA!XbX z$*cY!y_7IAq6)n;PdV*1#Xzhm9q{cm4=|#NbcH?n2j36_F)CeJE3bI;M;PBB&>L*%#7$aqU*v$ zS3^fY6Ya6_cD@xD(qi9^Ch|IUwxbkfPC-CY8Od|bd&J^2N1gXlW&+W0i^}ISBRP!Z zpl8Gfq*vTOSyzK0K9;JLVI+qRX-5+0TbqX`BUg-EF>>V#l=IuONT^(?f3o?0L`BQy ziXy$c`i9Eg`=j-UV*=_NA>R;nkHmN#KJ_sBv7o%|iBx>S2HTHxTvEvp!-iEj`Cq;{ zTZ`z|&l_T=+5YRnLl?WuW$@!$Q@%#icAG5Elybor-m__Lou4VBPIO$BvXACjNgi+L zOx2@ZYxE3dWE5nekx|x3==IYhYFG6B7#RgJ?n5<|K=*fdS~C*NNU;6NGZKs%?C)tJ zmi1si?AH6E>#Z0+-uL28w9s>{g9J0@!uZ74t8<~Aad?G10eaIe(xpqI&1`#bqHfK} zwEx~S!!EsH7b7KiE{VyuuC5ld#g{~wFL6#^q;ix=$(C+1&Dpq>v$2t(MutW`;cyz# z`_Qf90V7j}Ry>`TzlBWPiigdi6?MAAJ(|90566@Ni>FJZifad6llo9k;EM^lJY44# zRAOZYQy-^7ur~=uT0CCUe_JTDgm&Dh4Z|l$8VXC-KM~_?OnsbPM$c2ZhEwmoq}Dsz z5G-;`O+lyjL}CSk?OJntyVYU8LH5u?ly6Kz`D#~UkQGS8xH|+3ny%|dpqN}bD|xA4 ztTTh>=$-c4Z)jE-2U+^=!P*=ItwKIemizt5Cmt~6meh+l#II@!giv^q6iA@Uwg2|>hY1CfS@X>I^9(4h$WryGhgAKXNv*6`( zMH`k)8-6soXRN%IYJ6>lvZdcESJ{7)@=_R1eoi-Bf~2e5x%MI+2_gF#Zt-M4<`e8m zV!I-L>2UN8&e2;1sZ)6=Ojm>3Mdl19ud6s`!VtN76_41l8z12Y_>vGgu|`YTuxgI8 z4g7X{_h6rB|9IOl$yt&g4U?RkNsLL;NEWY&h-tv#nxzJ$jy-D>d3!C9iR3pg#w_YZ zy1QYN{xFI$t;h`njLS=`D`6Pz5*W>xXN{O=c||z0?6zi#tl)ap9M(;x zB6V_9Ev{dfT+VZ&5M$O|uvup`S(|-1n$u*}nb4SgXEOQBiK+7wQ_T)B znMJRR%@|aGhI2!+>XwEJwdBI;`c4+c@Y~`RVZVlp4Hq{U$=^We4{S3~r5L^mYo)!E zfbLor)jT>Tt=6OGz9L9=_tkc`=%MY@xNo%$Zi6{P?ZZ~mTO@?Mm z8Jdsjs>xxlhy3O?CZI3b#Wf#Nlx6$QSId8*9dC6(7 zbZ8`d#KzT2*qlkEE*`T|h#MeKVhuGU5yMO=q6mqe$xK5EDc52FbEOil$a)`E-r9ND z`q4y~aJ8YSZUJAif%8PPNnPrD>Qae(x@=)9;Sl5vX&}7~GaW3;~Gn^`IIGyqpU5-TW+4wSM%ZId(P?=rB09{Yq?Ly{jTo^2;!0C;Achl zy`-8{R0}IJzrQcnA%Wd{2v=&4&o7LiSZCvt4RnpI`}c|O$(N5b`4#PtZO6B_o`b%{e(2&L zKO;!?<>c?5+3h=D(>71TwP!}F#^mGDj9A?7v&o~+AsD4nl4YjVsxU%Y=!VTV4{<(12zUocJ==XLM^6-B%Y~ z4QEBN@<+VT?fv*TRM+-&QW5o-QtWF~`?$N@T_1&~DG3`s7-HE8^M#_t1T^+W=IYx*0-Z88v5*D}m z=4?rWBm48_`9LD_UJqVgccb7Egmo{S^3hb=?PUZ~Y3+V~8*x-d53P#zkevIC{; zLD_ep%{ZsvTmdJB=M-~LMJ{O1ZG($25QaG05C92~F{{RHlVBn*5s`7- zQP+Cx84p$0@QPAEIM=i5xt^8bs>}Lv@)9ZeQj}iSEJ#V4iYPPmab=43pP{$8amn0E zT4f}xW#orj6zXBp_&A(X%1aQ=v@V__z7q4VUhk7urn|mxuik7tB?zOWLr_r(nCJ=i zWZLNSIC3a%KuJHeJz1cmjQL%p1GJ|N%OK{VYQt-aetR34=GWz8u;v3sX_m=yo9(l2 z11R_)(kll|w+!zMlaFrDB<#CHkR3b6V-m1QKmF%LIYhHm5LZ2>BW0ovBknL$741N0+k6&Hx(y~{7umtN$nr_3 zs-q{EOL#{+R&{gtFcTpYp=cm%37KaB(^&vIIasuZ9GTlfYF%oB_OH@GJu4nW6;Zkg z+ClgySd!}WjUrbdQ*)>>J)4A5XoH%!70H~KxAVljB96-^jRssWeAc}=>*Hc)xNpei z)zfYi%+Debv}`TmaUOOhhF%FPJpGm5)p{kGmiNoDah1qlOB69ebe&7EUYjm3xe@Mm zf{=2+WB*rdcE$j9#jVH}cOKox*(8ic{#fqr!_B7?c7Pn517uf;YOs!(vijVlt#Zbc z&F^aaY(+$~h@FSQEOs6f7g{6WP_`_fR#Rob@Q0dnRN7frt*$#Kna*PKUOF~LViDW( zKA6=-Y$dgMlVojHS8PwX*hJakl=rO3&Gt4j&7;XrXe_B8T1wKJl3VSqp9!gPHp&*_Pz1DyG|cKDE*11;VvwU z0R7+dA3Ss&mH<`N4osl)F<0# ztltb?eg$cQvs<=MA} z-qu&LsT3$LA%Ro5yyrfra;;Os&S=`EyxBghsL-)gJ}&sSJyI}BWy9TI%b{q`=7oZe zqd&~N!adS-(<(Bq6K)Az+|IMv8>>BzYs_QV2?Mc`b>B$$mLltqPtA;Dr}>DcSuan` zrY71xtE@V*v}&QF4b#1$Cdo{yocxVqx-Y44va~|`oGv&am9%O!=*c~rOY~^2u2S_g zOQ6>Qy_z{}jYv5@_Crr$V|mH)G93HrD(*9S3d_qVHm$_QJQAIbS?8Gw_0`JiYSK!= zs>WL>X_(kjIX|7`jA=9IZJ(7f^1HpzN(b42rIa{@UC%OS3w6Ppo6s1!*3&Mi`*ckl zX6Ry1c6WZUsU-nI7d_g=QQG^bpo?fm=-h&&)_=1OBejVZb>N*l@~%Yn+VhPcatyIL zf`pA7$~GUg@_=Q)W8je#>8b^j)XOkr1!T&{c87zcZ_r8%FiL_S;3 z6}UYG(NpIX`Kp{8H8 zNdx?Jf>!L|^S_Zw<0iB}O#YUoGtHly$$Nk+x5yjLmqgbu2{H-x6n=BotJunlK~`lL zhL!H(5H_vlqTC-iHbf>ks=TDVE+=D|-kILJMejK!@uJ=5t2Y}@rMsy}IcU$#Vsq+n z-Bn96uvG){1%dg(ED1)oAq}fZ5>EHt<_uX~a@3G(NUiM5&`kS}2ulej@(Iu|M&a z)Aaoy&T+8f3bf_ma>&4@ytN@%na(*@4cKi_@12Bjatk&~sJ{<`Aq4LA zW^Z~i%61YP>W6f0R)uDHesJ=SJ6P48ZBY*Tm zqy@Y!V-W*?UQQ-{v~bT>GX%N|7tzm**M5UPY$^#srEn#6{VJ!lc*SAML@12)Ih6Lo zhCF2<#t)PTk4X4cR~lGc!o@TRUIYWVqiNvJYDKWj`co@bn$sXw&e2I$rf^-q4{41{ z)kI)#&zDcYe=;R-R}|ik*zOwqO_3+Nz0)kK5o~mEb(siNG_Fk%$<##3=TT78afqYp z*DDJ!v!7F;C06McE$QG%#heb49h1akf`t;;o}$n)!Il)N3&eoPF9{s#dF0Q%$RE4P zHR%ko_(iP#X}Bp*PCpME%@f(YKkOJ|ew4uc=(%X`gndK^R1|`$E6n{Cyv?c4 z#QWS|6x?6g@o@q}0XdIJxWMRfV|}qnWv`!Z++MpEa)Vwh?wJvgLwhuykz7XLE2GO- z#?e{M-LMBLBl_`mvd8O$nPeZ{C8_zA^nVK2OTKCj>#AXUrbTnUm8=xOhJ07`>aJog z>m`@1U3T%SNQDh%lh8%YrLTQM*`NpI&OV_Y>5O<3X&Zn0zg;5InJLrw>$jzC0(HV>U(22 zBM}H&;D63u<9Kccp|Rah*y&nFcA9zN+{Cg43oZ*`{R~+#}+zDWXtJ3xnxwPu+4|O5O6>xPzy(0G6p#?P)x(h&`-YRB*zf87ui|HOn!(E7 zLgqqJE*Ek5CSRdnC_)3b0x8>hbRQwSqme(BlY6*n)9yNoge_cj@}9{*<3l|+2qj9~ zxV3bpR9(681gNr`$-~xz8~Zuz37y8mpR14Op0xNmvuN89WV^{(>ZA|$=njxeg9U}Z z<6yRw2-aBx5{LYR~kF!R_a#C!rTCf|psciYCmXd#P0} z8XQ;|NKFo@4Wx$0G}mr1G0Bp>`(tpovLx%1PlLhTKpAp!p6jh2)RjmU$d~lagd+G7 zM(;@8Qd-3OY^3pzaM*33Qrt`3Y-cyK&R)sBa2W-rIq6)JuA2A?iV#t*GrJ|65?<_1 zeGj%on+h%M+C8Y^zSJ~H@XFpGf_>>=7q82B9R4IWh5(zvVhdozJtlWgBk5J@Y)kE9 z-uyDNljvH~zAnr?l`;k8z`66Nb zUy(PLzGKqEQ?=(l`*W;Qzwjjrmk2Mt_%SpBMC&F%kdwHs;e4U};ihelH?Lbpm*hi4 zv6Sz9cjs~BJjwS#Q8|M{CmGv$fJOHBkpKd&t}lgh0HNhyU%FU9IQC7&?N5p~XtB1H zwfu1VSs01*66gVu{{t9RewuQR`N@g?ar+s6m%Czrl(zeu&>(Di`|2BO-oAQ;aRO3N zxcw}Tv59f@nPPdfFb*c~E}{hA9o4}mqVUg;VC3gUeaWc(*CqYN#V*0wB3m)RxDk#T z|5uE{j^xBrGpN!F^aiItUj?izGfgpy{}PZ5=KfFQBgRO7K^#qon7<7F>7&?XhNC1^ zE1HietcW=D6hTSni#!VaC}j{T81#b3IXU_Jt^L>P{4Sl7QxpqIt4r&9@)&6%FQs5+<9w%k@SUxdC!p&RaT>#wNIj z(;EfwrGV6zaWDD5k926^YDb5HkG z$%T&IDE;2l9p8dI-7Mzpc5>J9IlDWzU{6WbP^Pp>zS%~rsWS9*vowD{wP+gkbZhci zbfEkswG8azq&H^H3JK24oYcYCn){v4oP2-QOsn4)i<-#|!iAZQw%9zVa;k9k-;cA7 zRebQ^Mc$i_?r#n`iE+7UUaBW{TfHUQ-GF?K>Be=olhyCs=rdPErA;YiWCy^V)V+df$FwB6yO5-r<85JK>VUu2_O6V05VwkJ}OoVIC{Fgei zd;32eVZyQPZrBof~L(<)h{{LfLLUT3uD|wuC*lo|S5Wl`c^ZZf}is zXA}>r(#i`;qgefw$}4|XqHFB`XDK4ybt1gk(04+sTWu&bGL9dUf(L&d?njw38nrQDwj<{6`yE275^~E6h@8664`PtSu)N1J?kr7 zE38(@Dk4GYOW~6$$4fkUU-%@rjTDB1EY=pwKg5QO|3cQhP@3oq zAcag;QKRI@>RO)8E zmm6b2hqbJnN(58pFfyoNBlH7#QBhDE8NCwoZijR%$tZO-fVELHd>m zniwO-(eaLA2P{R;#wMi*Tt;ebvZKjgwx)ePh9-_7V>jf;k9MkIapg&KaywyPq3+hc ztVELaOs6%Ntgnm6+UHyI{~;`%X>)-Z@~Rq1tEhAaZPpV~M?j%fk4{`Sb{V$SP^lWx z&{1tSi;cG^mb^;`=;{vd^4;l?=m=_6t7gZWmF4&xfoz!OS%0v((YcRhU$Om#S8DiO zte_^Z)mTUAI_AWLhLY@7Dq{vN=EkDsFZU0(k5t)ArO1wRj{;;{5i_BWJcr|Vc*ec) zdjV|j{q1M>tMD0wAwY|$5>K_d(Y@Fm&T~& z%+1d?&E0%DUBCG`jZ!#&^Kmr{fp(_*wg98axuT#QVL#v=0L#dmQ{tf!I5&=nJP%uT zgQeiR1@Rnr0>LKz>l@Gw{*NQQhcf(MG(mHL#uSIm^5@W zVoapYR!Y(UvhY3j5qw>IcSk`qawe4HY1R_|IRKj4=TnJ8SoZPs=>=8n&lZ5NK&M{k z)8O>i>BY_E<;CR2nNPiu{~At#BegKL>S8d!fqKyk>b}pAZi;ydlZ1921YX@d5z3%& z=?er1$nKE?1?+5frBB37SS^twJ+zzx`VSb*2vE!DlZ8;QKZ1PeLU55F`x=g&zlU#c z%UJ*fX=GbFQoXQc+txe2G3p}p-(H#L?f-xd*w95=bK-@-8^lF zZTk#c46XN3z>mBE-$k&M%%u^HJ_#&e}BGkX#E|#QTxh0a7SR$7gZF?{J zdLy&XHu-c%ww@Gb)Rh2oyW6vH7XB2mW-`wxx^CNR5=%trIAC||FGf)?r(VlrFZQ5- zDhQ*53Ks4XsU@TD)JNE9F^nI8W3^r^JCxd#N)w1Z0m?rgj7)^1Fo zk;#o*83h`Q@4dmUG0~DVaF}uVY#c*p^`)r`Rma()Y18_we#l-ncMwkNGtnCN>UO9f z*?ZA!_)&4LNY0yzay)X^)L+<8<1qTW48uE{drS~YB3T!Uu3;DA*PKX0-HveG@{Wp& zu52s2O^G!5l&jozIa-3j#T61O;Nr*;gOBJFHwOl1j5Y>czS+%{_hi!Lq*WrNdghQY zj-;=PsCYz)B`i6njP7UOrY#1lIMr>PW2w%Toat6WrNQM~;e!|KGTgm-61#kN_1*Z4 z9!an_NGK>2TS)*#tH}FJnYSAutE}N+zA*Q(Lh?+kCFP)8^(ZDJqB`ni{Uzkd!v&Ul zQIfVhBKkt@7)2MJ>~D-tCH5c7x{9@5&&KF)3AeMhIdWgCt1|64#MrcYs;B&Q&#nY0 zNdkP9F|I(f#B^!(l41`Fz@$#m*gqJnrrDlRT~_iW+brBInn!!dOb}Zl?>a4OI~;t0 zk$Ey(DHwWxG{AtonUZWGNMQYqwIE0P#)O~;uNnkX${kfFE8bQDm28T7dvb^Lj2}&f z;Q)k6LTSUT%H8^Uj)q)S3<5Q(!Cjy9q7 z>LDPDv?9u3^QLHWGj*oni<#twjgAlWnkd4J-p@$ff!^-h_X16OAJgEjI5s)J zTIhdsbe|FjHs%dr^awYf-P*VJ4bs+d^IeBz`c>hS68_yvw?2eMK)czb?lpJO*?Db} zM^BY{&5`w(1ID7EEnw87gIK+hlVA5twNAV)mJVs{vtiGPk)5R#oTa-FZYGwn@bhGY zMgO$47?dmk4UGY^HzI`ZTU?mOTZ~8CgDa!Ta!PM~KV9Z4;z2HAD-D>80^t%?YLoz8 zE6OyqJ+C!`I=E_9Rin;;X)t(Y%F26Gl(=dCMN!tK{TCZ@m&`R6=R_%rmhsx0xAi1n z$Xs?$CS79x`>NI&=h4?ilsliSdUGrw$%cGSV{X~4$V;eMrHnGa*(7)KtC-EVmCL}% zNkKH60EpMO{b~tab!LG^q*yw z3iaL=WjWeG2PbJd2XQ+)!&AIxv_u*3Y_!s@_%Y+G#jtBW+d4yM9J?ikR=Gv#-1oMB zQxC}1Vmce4FBE;#S)x{XHU^P?_faH*%AG|F8hCww4o*)U+aVe!=m2P#=m&Y=#^;YB zK_Q!VMX6dSw9&6nco45~Ja;b0XOd-;WfYjhIah>%|4Dc4!ryABZ}@eSiHuhQ!9nsx z{$76Iy>wJsg|YuB!X(MSa(j8hd)d@po?Y->R@lpMMok7#O^&*5DlDer7b)a|*(5|@ z>ff@!ZTRes0YNfGDmSiHh~?F)Kga(y^5+x}L{KXBf~ljbIdi`_Ien1-_utOIx&8cr zmLOsp5QILVf=GjOj}!dd%%l=@foz^}?yls1(ZY5$G_wZwDVQN`jR0Nz=tlssoABoh zUk{uFcGyf$0qhpB%)}3GfFRVwlflYQfPSHW0zD$Jt0XFgt%faG zgMk0Z&KoAT6{o_)>zRh)J=;4L$g=;3um)?`fUra}#wm5D1&D^4+HUQ4oc2%O112QE z+0wP-q0tKqnJmG}sgn z*iv8+T4qeBG3hXrA&8;kXgLxof(d|7GN#n?^45=>JIYd{uk-Pa#P$MYE+GF-a!jQm zM(_%m0+};JNraK?FcR*LD(ajI$T1VmjR5?R9f<_N>~yz6A^8Gnp@23U8}g6aJGG%| zik4Oy-v(ds*s0z&N&xk7x%s0dfe-1>Y;Gna2|7U|GD*~TgwiiC7nbqlhTsJQZX5}kW(QZ6}=9)n%Jw1WK6i{|0=l}yQ%6R(7zi-uEm}m(>Dir?|V-B1vuKARQO5X8u+){V^Y_UW&gWwSS4Fsf- zoD0y9v34Ei1brfoq%teA3O=661Ws}v%SM&)6W#huK5x`u4rR@pwFWakGgHC<2scN-wJAv@iD}TbM49BuXX& zJzrJDfM95LV7EE`>T8I65!_q*mEbd}f5MMK7&o&A`MG#?q7Y&u5N&SQpA8R5HuD1fq{f>I7U5H+cTbf@6*s5 zOJy{Dp{<4scJ3GVcR9r+G)E{l0udiK=stn^HKt6sVNNFgz7b)u+#7k={3~x8FD1&b zFlGOjx;1FUw{Jx*N-C$AE+G7SMfec(u>1AO5}g!(Sx&J5HYe+9 zxcJ)u29Qu9(O`n&%5*6ppQfgza3&a2&##q>K-^6A9>BF4}^yha-#k(hcXQ$^Oc2KrMCzpx&Tlx*f(D6T~=9Uz{inQBrF%IK} zE;vYWL%UVqShZUdVMK)6Do?u6x6|?)9Wc9*IvAX6&l2Ek+*o#9*^%KBQr^nU0Q8mkowsyrh=V0&(?0rL zrmIRIcEd@4C1oa4(XS;hYP#G-xjMD4iM)5`?&S1Beg&H!YN_pk%S{j5Y>>% zg{GJVx}bhmqI6nKG)r=)66YfOct*{FSn-v=j?_>0&YyVDI0;%rLU-%#GZ13QXOz(> z`-aR2NaPD>Uf-ss#;>{4 z0(nx9f}Ri|4cb9XB#Bhm%{qhY9oue+I*`q4l>>UeN8RLFonqshoD8nXg=X4r|J3m+;%fs)9merytd54RyPCrD)5&gE z*)kvOYB7Bv*kbgNZjxWMIq#I1%1*5gX}Euv;a>P1Q5pN|J!>_|zgujloF9qJS^KWW z?CMFH>{8YjQFCls>()cm+!AVM4YvVB>2Yj71JnmCmd_$0jVUP)L;;S;I+DN8yX2on)w{^eu- zCDbHt3#JvOl>%C+rxxgJ*q&ZVxQ|ose4<(P(t%a-=HLUf9rvsIoBR9M zVM-t8009{zKQ>LoN-uDXP^bdiZhLvjEA^Dmr8DPZlZYu5sGv6D!B5D9UAF|%CzYlr zpOmSrhRu*ZsqpRPlV6I)yq9b)pOm=&Ib$LVwx>clyTtykqUaPet3sAT^<;#c9jZE3 zF`CJo1tV6pehtBcXS1xDvB{`8j8Qn*gKN6clq+-ZGhEU z5b2k*wLDX0P#rUFFgkCWS5vRqytM72&1*zJ+q&IQ+fFeNnN?Xy%sn?Yot}n$IZeKH zPfPFhU9%GWZTYx*zg2r9v0a6|DoCQ5th>9oWJeCIYV|X6^kt_yp?*)m8rM#jtv{XFV73MbVsk=c(mDhF8}R15kqV=su!2IT`_bNZi*CH)f4oauHL~4dGx>MN1(L zmMD2ierDd^a8|FKt1LSD=>;)iaJg~tM$=lv0CIT8i%`_#WJ~O!>(R5i8Ycfiqn;?K zVRo*7l9jE>k-DU5(UIz%g;kTlE_ia~a}y!;ueGIN%XH=AW3nTSY$VMEh+pE*8=4pS zs2*MknSk^xsd}lMqK*+$S+4K$sS|z&aHNF=aiFIT1`VGH+a4ez6234+j4^57Ql+MA zuMHltJV)A)@Qw>^WEzW(OS06XF@pH1drKv?oehgt+a1-aAYZ#S4&_F~!sJpCb0C3~ z$SWSd)QvU%f^50C#AR(waYGZ_nl?$KJ`);$VJh+8_uoP45nCgCo+wNQkUqg z*0o<6t1JZx#nf_{+CEDzSSIArcRwZ=L#ef8Z7VHd`fon;kdVvX;?Kg=JY%yHrgPFc z>TnH^tmSN4$QH>5vL}>xfQl0+WX6nOqB$yyq7u;n5zBs$CU+*&ll+qvs*XQzC8LIvYrf`&&#TGw!qhemA5J|$ho+jT2NiC5 zgmyP~mEnsXVY4KC(o87jh;SNF1So!E=`*{bVb&N_Uc(08?3#ay#dKf9v>@?{s>f)# zh{HFTub&Nx_dMLxVSkUziq5%Xj8Xt2p<(OT6rXSd#Uzzn=}n$+1J@Q4K<^3QD1O^un>|a;jG? z2QD&nI1F%bVE}#j!V98=G45M5N_2y8Gjg2Y?Gl3}lDsqr=!LHCfSG0f?o2?{-Md{F2(@aoC>*}1I@-y=0 zbAO!rXn`sOunh-70Jl=?|B4N`1qe^pZ2ArHQjtF%gN2}kV7Bx`fm<+fqvdQyP}`~) zjw+dM=ns2wT+ie`bA$!7@PP9yDyvQPIpWAQEaougFj1|wj)Wq0vb}Iv8TBm!qML9n zY0w5}OTPD}%zJCbXBYocw0)mI0+cLaDn}D;XK?9&Clt>p@{2F&@Ix7-Kp;_ z03N4rTlyLm=)DZM_uFxQo)c}?Cu1D;x-%&9M?VBHndeP(u<}bLJK;VnX-03hA`hGF zq(CUIV_e|}oAUuywRomprxnyTre3Y;*P#h;} zPxdv2EY)R^-HHmq^h5rIW1^o9OoqiBANqeaR@eTDk}mi%T}K75LIGL<%1WB< z>dI}+fbW{vV-lsH+76l@nP`>Gk|32Aw%~o3Ii- zJzG=40t=Ca(@mQ`|FWqCxMF$?Sa#7;iYyB!hx*NfuT8&Od+y@Y;xkokYmCatJ9nFK zYQZLC*~PMJVJ)jIp9+vm!zCSLx#|5ZyADitHD(2J+DG8eVn^9fKmBJ3l(x|uSyq?o zvno|m>TJkNsv>*#8BN?=_t@vNv}r;0Of;4pEIEXk_=r-Ahgaw16z~zwHg52|oJN)$ zGk-*oSNpBcvji(zwVzn9uwY@q@`T&@_*4=hSeh_yenvpLYz`^u)5#BrV(RG$O99|V z5;4h4+{soV=0B!DKNkchiX(Q1Vq8Kv#IPEjGyBaCZ|cw$`z;`Ex*NaG{YAkvvg12f z*-GH)bQQCydbF+Q3VJ8pmz7kc8&;0crmO=_XT?_*WoTFcVKf8k5VepqAuHVr## z8ul|0b0b&uG38~KdK(}6VWwfSX4i^l$L!J>c3~+wlhMVKlfm`iX`5zOeY_lPnGkFq z_bLj(LX?H*D*#TWD4V7jTEFe?gA$@!8|c+zkt@-0-9WnJwQdjOo_U)esTm07vN&`Vn+ey2rA`7jiw)uAW~ zSeRT&ycgRA|y`El;kc5~%6A|5^IcyGUxa%odAl zR#jkn4ppiqc9yQV&I$S6&@(#EVy@+T>RnT-TA_Sc%=AB?X`+YxrxRw2&>c;;D;8lf zAL<5B`xEn9vqd|~O^)-c*41UlR;+$eH9oh^;-%YDFGm7g1hX;0e4qZf6{_AQ1lx_Q zy{ocqMHkR2NrOd2(>(I$UgVEeF;!7f)5+=QLGBy4(ra@S1rvFBXphvxYr;;UQbk-E zl{DFs9<*TQ2H|M#O7szzxnwW(kjy3f<`ULw8Y=DO6q%i;$eiZ@Pv#^K{A8Kmg&KHf zl^ z!+=~*SY;++%`RNT0`Th)H9O|QL+3))`u3*vvDvh9vnj8Y2&;`p3w+63*h?;Cy_5CM zB+(CkRc7NOW8-zjHS$OA$eNwKxZZRcjy!?t{OLruU3Zh5ERf5y0CYPekNiHJZ)WYs zp;Tk+DRV8qY;(BYa6(sqSkllz6Da{b<--F%u2Gg7doND>D!T9nKniqmqW#**Hf>O+}b2fyN-k6Di)7lB8rC;ZPLCP5`y% z#qQMi(BwGQz7G1juPGS_p;31HZ9akEi8b@OJ!>j2Ro_b0PNh<1n*ngI&(I)?4n@R; z*k_`LQsl>TgjFQ}=2WOlQ#?t0$?XTjMDNF5Fg0bNjp&a=bXT{q`o zuqEJpn2<@3N{c&{=OaypBEMIAs&!fIsMi)jS%+tj6n~~(Qv8{ElkW7C_-do`tiaKU z+=nkrtE(C;ex3RNBvyw^wW!pAD&$?0*UTW~ot26GK{#u=txYA5WfvHv(JP@@;^N%V zuIG+|l~&@bI!DqPd)Z%43d5mqbN#QcWK*O#FTK^KcUknaU1Y6_Z~^n=aV3eaQ!?|U zjVBwv_^`>MPEbq4nm(jM1k~!erPYbZH??c9+$NTQeHFieWyBrcPs}>p&S$ouTbc@? zC&7ydMb~Kpr%D4?$^lzp9lk~~?M4A8GDN|A7`Z>ZDRo0~zXfk|%F=tE`$esgR6s-) zY+hyatESV#NUiF19OXzdtA29Rt<6oh`kCy)?6-#;FXpH5W`1hcKhvIPyRndKH|(g& zVBZ!SiLI`*&gKvu7R;La2$e}&pk!<;x0!{_$-k#W3BCqfxdvGgZP8g`P3Ukga!M`s z%dD20nZ1`;j|xIU+AjnB5XEX~L@52HMUPGOdz5*bd7C;h3H(?j&HwGw*jM?}zVqp% z3fl3{F#7I}gT>s7N3W=@r}$_JfUG$of#9TSQcG>PQ8rpN#7aJ5#`;W(_C#6&BQ(`V zC$vTaZL#j1-;m67CCgJyHfYa#gSDyq_6A~k^X0Mc1=4;!!S8q0+63kK3R7h+}jvMd~#0Vb- zPb=p7T2B~@)crQV4~J(o1q`4J{!ut4V}IdCfj15QSK02Ez{vgg0;M~{H*YT8TtgLo z5=w4T!;Q*r=MG6oqgO9-G35ZbZ>sd#P}uIE9OFOttNWY#``2N*)^q348&BQL1ZLCl z_05~jvQ2M48-smTjyDXMKCEdW{p9b1&jb4J{B@O5UmPR=jKs3@)wIRGRyu3x1XN?{FF&wuC#r^n0*-B z>D9c=Q9rT3yx@5uoVKy^2p)OEXWomC;`_0n!dwSv@YBEu%#t7J;r8=Ak^;9~-L)gvCA+m~HAG*T?zeZ~HNLs(b1dv7jNVlk z>oz+b{fl$wOVNO>4J78Nu_zwxQ@bdh+rqk5#nST2;unC$_2R+NpH3)2&`I2DB2&;I z5)NlE&UiB_kyTtjLK2;v{4q$SI*Asw=fTW(-~8FqasC{DR!p<_pFT2CXXso-A|{%T zgdH!a8{Ba}&VGy!9=ynV^J6STk3J24Kwd6_ml-l3<^Mo{#3V$11S4Ndg6!P_;iq;4 zND+SI&+wS0RB%x^r4hBG((0W|kSkR@{{HrJhL@8uz+a$Cn|o9ES)YWP)tJL_f(b1$ zFUPSUevl&MW!G_M92Nx1;Py_B`4WIdA~6196a{nYPPg!<)LRLtHIy)F+ZVb{z_lbe zGCy=796d)|74BDgqNue9Ne044JVp;Zg`%2lxwrxdEm)wd>YJcxj8)qTY@gApuqcri z3o49--XO_dEXrI`Yuq6ZM(&(sA;?lI*WF{n>rdmzvS*LW%=%E$cu=;3vt0eOAKBrF z@8}X-rcBVY+n!eRuS>CnG%mP`Eqd;>x)0w1Y{os~k@c6ZynwU~N_ zg?}I;Ai$`nTMMP%;1i4Hf$Jr)EF=Ws(_fC#C(>E9#^yPfAc(}nHRHx1-8A*2{1;p` zkX(|!L)ROR^&yoyBa$4*HXtpwkTzi-Tz}9sDqkbOvfckIeaMQ0@G`oCg$cyl2E)uR zGkq$Fp-A(fl7*PWkNPV~Mr8@Dgb#}xnC(#-c5Fp!(dq(WgZCR2c~9A)P4!Q;30`5` zl6{-dXzDK@wG{lLO$r#iN{80{EKAd)uzmMQk1JwsWmO`YzX@G3|eMMDpU7;`%(w@z5O0@Lu zHY({k^{g0r@MlRa-{Nj*+XRaIwG-)ZrE-A`{X<5Ry&e**@E&6cmvh z?&j21oL)vxSBw}7ZTH*8yvXrRloX_m^hfKbW9l%^-6rE~pLIg+anp?aT<9X_QCZQ} zXYW}_0j4y;Cc4TL*~x8dg`2ObKA)vc0NFm}*Roc!xa{=MDI2VvOOt?`6&(-|BX(AxASZYRHG}xEzb#=mcnc3jZ3Ru z6^MdSXSj(Pwda5`)u@_U*vyQY+h%pSr27mCK;q9igqq)70(fHMm~(=u14l2mqWaBR zuR7l=b96WV zwx5p0erHwgw*hj~HasVoqr$B{-J)!WrQa-(=WH*jH8ql8z88Zb<({skDHmDh`zQB} z9$D}MuKe9w0H*GrF$K;NQ^2ab+mw7O#KZm-nXXZ4zwB-8Go`}%8MZxF<2s?m zVUK&PvvJ4x5*_3F=?Ckz6?A}ZFlMz9tk$gB+yhrcH}0@1QOHJWK3FlNen)1$q0EC7 zf5MOB4w3E_MwIx*wFg{#ppynNp2C`b@jmi#&-zps*;nk+>AFj&aspdvJJ9x^?X%sx z^Lxf%&8myck_X3nxBcpa|(R*$|2NWJg4OR_Cou*re zCS^M9RXySES_vcQS{{2}*kJB7mNkf8zo8pG|CSwwkz;3iE~fh z$%4|=DimnZVr+U^b25IFAe)utOv2mbLv@aXt4UoWU84%|Q@_`isXdsvK{%Sbssp#8 zPX%kHwLPxfUQt}yW8*_slbUhHF$2v_>xZPoeuXT#?Cf& zwoMIUtYls6{(6i2(GPLAy)9+u`{yOaa2M{`>MFRRFC2aMV`{S~x27gST))egHl;EF zIKC3)U*#apH)zJJD0YWH`PDD4erEmkn^$V4G-ONt4vww5R#~-AZ`)zlNolj4Nq7^| z+p6Xzg93{f8rU1uGdJ=lbh)P4hIb0#S8i?fOM!`gB{C!YQ#tw_6)Z{Un-Ybu)!bqk z9jNAZ9T`44YOlE?iPyv?UbD0!dzivqEeg}~obKiE$b z=`ahUm`kCGj9jVvsgRU4(xQx+q`|Lz~RMyt7=C;l;gh>CtJq-MBd` z*HkeFGY9*T3uD!dO&36Q4(6L#mW+{jcSqChn%q{hUmIx!(>W1<>(qnsy6~eP!N}KC znY}dsK0s3V_IcssU@`aN(JL;@O>Y_uKD%EB10cAoXGx)T&S=l@*-ss`2=42-Tw|JhYg`i zy&ChGrNgOQ8MUFZIf5lm?SAn2lYP{|;1OOf-xb>Yn?H-iT7_CK_u|W!FPPBPb+UFi z92UOwKz~NgzZc;wnvW?%T+VW+v^SA0oVWrj&Gy`Jzq-GR2Lf*z{4X|fHVt3jyxGhlJ4?Ovv$6EgN&&SUY)T&-P0bLMmFGk+nAA^Vw@`#92Ge@))m8-5w zV0Cvg4ZZk~_v)+W*&|pg?vwy(=S$>G>5jskKa0T~)HXr_g^>7qpLuU^dd2>N&Rqz4 zXLyRoN6RSkXQOvBTKDKp{U83+nT9W@Rs*dcJ9oc`IL&JnW`hOzd z7k=vhfdZ%R%tZWd#S6)=dm-#nQH`^n`iq70gj2y9Qq>b*%)KB29PHn>*T6NROfU6- zM2|i>MKn}WzW5Ugg8P*WHce35Dg5@ah~buRupCOnX>njZ^%`rPA#2dCZELy}3+x91 zNGeo4EKY+hHTKwtc|jCk zX*hD!*LuecQCs|_n8oVKcKPo7t$6houUO~Yxqrl;P|l?5;nPWKjw*B0icnsPE~c>J zM79LUzAfLgzJ*$t))_E=U&6Us_HYrr%y4PLEVnpzY@e<1TsoGhC~Rh=b^qA5)05tW zdc1~TCrs5H?#~qf$&z=;gxNjX@q1Gh1e4h1yNSVaPobQMS!1W}x@sO*m6$?jqWx}C zKY_PO-=jU#elhQq-1@tWLgiE)(jz$!T{!LGqwKN^(KwR6OuEbg90ZT_brF>gXj=zB zDoT=V+G?o$TS!}byS*3T%ynGir+#+cGXl|BVm&~Vy;ft z6#rOcb2dxAG_!u}p74FHK!?&f3ws_}*8mgY(D#hZG! zn#)SgUb)Pg;mAYVCC8e;&8(TbHTkT`cW2$QfxR%O39++QDPr@ON*X{y>-{+ENW}*z zKJniC7@09t4g#UBIjNpMphcJAr;~O!AfI0v@ekMASNwV>tIra4>%O(sHBshuN|)r? zQFT%MB+%mJ^o!g|ttF3mWH6&=t~z913lU54AW_V6aDpk_QkeWoLs2JnmqU|TmdY6Kw>rtx-P=9ZDiDHCE~x3No#I|_(UI#_=h#fTq{X7 zE1JdMQ%?^SVk>>v6=}XIypAJ$xD^H1a#PlxyO&p(c<#PnJm@aOni~4Am!e0@&{fZe zSo~owFms}~0%cA6JPLok(?ytyVEp4yPE=)Ir)R8XsuVUu^vfF-4P$=+}dD&f=9 zDVcuV*}JDyahFdjX*G|KAPs%RIt%o(HDUaC1S5!+iSoA@;q9Mv48Z;5J!$zcN9BN3V22^p^^HR>}c|r zM3`5ld_IOIjzP-FTxt2JN=zM<=*zLY9B6~Pn z^Zp?$o+(p6#dZiAEF%k{hu2XB51u}^RU%W1FxjH5hDz0kh7M}GS!5_Chn;s>BZMtA z_IH=>P7g%eo>lcZ%zmd6-gI_`5uU~8Ft<7Pv1Ts1Qo~zmFZY+*%)cg=<<2F$Nw!rK zSC%ED_MAG{p%lCSicsP!Si!7k$}yH*FN!>>1{PlHh4;%Hhi~o(13Y`9@2&vvj8faT zXIkUBCmU*)!tDXBtaa^&z2xxu-|#IR>3Q21f6xa$4*}zb0+CxeM_2A< zKB6n08!r{?wEG)2Q~VviA^+dzg+|C9GMfU|G!PQ?-Y2VmH-25qvAMGt>b4=>R@W{r4L z2XP7dy(f$l?4$tdmNQU;)(EZ-(m`b;{XZDf1%f!xxVls34LT5!EKr9mo=i7Rf1>^B z4V8Nfy;3+m(R=OoOS0V?wgwZF;$eqy|PtO&>A~|`a5K3n;HE-IjyZY$1Kk0HKIX#17pKDD#sToRaY~;XapA<+%54S@a+=K(idjn80E;L7>;Cp~A z4S{eY7AbxR_Rk>XpF5f`H~#QT=9juDeX`uVUrVs@=P(3{oMU_c#l{J&4`H2&O5=$D z$loEcvpaDkARC&f3oiuG$S@1cGQ!R9XV4~zkdp41Z8f8M2P5v@tay=sFC}E^znO`vE~s@1 z?2|pj#%`thM{H60l={-P;OeG6o^XA~_&u4|5lbVc7((q9)xV;1RiXq~nYh~&vsq)S zFWWk4@tulKO@UFa|EE{hquo9{1EU>KmH3vtI`xev{X%3hLvE=RB;3%mWE#vnO$G1kBC^uq z*pYO$C-Xx%eTvzvi6U2@`uNJ^SnJA6EkWM*MgX}K+SR)o>i{C)tPbg^4K8bQk zKdsA+B9zO0s$6S*s%ou&jr@5`fUj@hC-kchMJlx*t zEe7GNf#435v%f|;>c1}I@Vh_LCC*dSGe)vxvA66dQN%B=B&Qt{xe%v+lNj?B6+(Su zRUu5Id8q~|a$~|1eVnkjsUo7WYq2*eBsBrmBcVDWJb$!|efPx=BM2$y&q1SJc&Mnq z=0W6BqxPS^2ke_TqPjVpyZg3yao@ZdWTW^<%Si&(H@*|=an#qY!h|$hS{Hv=;`f4* z0Lr0IY%Ej8q-IdEAX!uQ70VCE|z ziG?5i2u412T9RNB;&T_T58{QBk7R-8e-iA(#s`h^a4pEQx2Ekg+@$va8xd{o-%v6x zf!^cyxi3L4MD~7ZB#jjmjZBI8LKbjSw<%3l*eSwcIh<`Gb);=zl1*DWi2znL3x8r` zC8-nbc+XQsg^kl$0&C!0T{{K^YM7j@h(}=N2u@zOnI-juRunwiRtq28=JR60I)qNv ztF36CGd6A;#OEl6fim`;(KLjuU|d3f4*pT2PD$KAKn=<;rxtYbwLo4%3l#f{#g$z{ zyT-f$GF9~U#qt@AE8=hz3OJJ2_vhgB)On<si22T@cH2>d8j z>+zj{pdzRV`>&NJ?-F2T2}GIHaU03ID}1SVkD5RNSXH&U z5}#`$w-_m`{{Cb=yP2cedSHmYO=P|G*n)nNU-v8ypxKsdAGr2mZ?z9K)X-fpwwYAZ zsJjU|ndZPmf^4NHa@MPG=Lmm0JWCmcqu##a*Xe;Y=O|clhrM{!jdHKAL)qMKF1%fXEMgt1^zC=ov$=@`ZL{yK=VjCw1_NL9a#UU zVAx>h2H|LqIji2$)u#S){r9UcQyX8)3k>l!CZBb;MB*wxHz5_1-P)0G&{8qk-W|Vp zuhMw+0C%)@DVtvW8L^!2hLed*LkJcW{~bGz;6}@dPv26Mqz}%7lne>e(FHi z@n;Aj%@$^ONXLD*BU?c@BnHJgf)N@oWx?zJ96%Xf2}7KT4lC==8_@~t4>LQ4H<`mG zv4xxnM%}QT(Dn4BtGybE{ud~WLV0~b8Vh0)53$OqgNYd~<4k@Z^{f}6KY)3trKDQ0 zR2s>ZX5lKQi=jIU+w%KAHMihS)amJ0IM{#>5KQjp|JLw(0 z(zaZ!`#Qr@tZKB3B7Zh|H>diDHVi-fsWS~vF+!=Cr8F_z*3)S}fC5y^u0mX%~%+ukOVb94|VMh+!*tu^yiC`!dCm@n+wXv#{3a(;&XK-jcJZH2-PqTq#rBG%#S!R9Ew>^etMU zts%(9u$rX)zQsUt&DlToW!J%3=G;@CXK@g}JCwi>%}4XOqkL>~CF|c>kL7C^2a^B> z3?-iD43+ncb-;hB1iPHEEMMmg17&=M6v*6h*1xw7lo2z^+AEt^FZXeq-*1=*%(fVn zP3YNZoLKs%%mdb;py+r=_{#DBXZgAKN$cS8EA+rd$e2s4DE00uT1|0b;#AP3xAmD;ik>21)&wZdp(}Inw01K z1zRe015ieg)$OM3oJ)7B{FG8lfK8Nq~hA6}`)XyTJMgev6~87cDLWW7$h z_v)NP4hSEDshJhJ1o95yDpM^bT_p!f^Kb@rfao(kaK=19A^Q#4_i7ppZw~8%V(OrBosGVYa(AYcI+~FZ{%ou|wKwaAkh-Et1+D6MYjXT>BofjP zE-q2Msnl3W4TIsw-AW9m6l8YANW6y?ArdUWFvW%8hAELoMpo-^8@#*9QwmED85gMQv4)#dWQ-kt}XVOSUFxV$IuU+~b8VL8h!|4Q8Z4^#+GyGEJ)%g`sX+ zeaBhHw~@@I6S)j9sABhKhII4|O>t)mZ&PCN#$=nSLYLBYACYC~EvF*uOS}j#90wvA zrdR_HZIF_D9e4dYuAs-Mz?V%fuG2aaylf9PB|w=A5Y%QjN^_3g($>tDTyP-5{%7RP z=Lk5zBFa7`@WA3QI$sa_L2qkNt*XcvkHLa8lQ@_yB^Y5aaiisIMtQ8M+Th$!2C(gd z;G2Y5jA{*5Qf3a=30GMIYm>z)UsK{>_US0;Z&67V`8dcb$ z1xYn-N}ntsb=~{%*rHoVwZ;-c);&Ke)nt8ANLN8%YEhPwg)*NGRy%~d(PCmr+jU91 zPE$IfluJ}SAoT4-_Gr0?(RM_zMe5k!Z~99EUY!n`Co*Rw$*DH)mwcVGU2Bxdpb2!F zoKiMx4rE<2I3{)nHzTN3R5!}}9)@V&;*`ii6ADZ}`TeNrpaR49^K=iF$!j@y_%L^V zHJ|5bXSjh>`_AHw&3+!)0ZZ2-WWau(W?c?kF(IG+l9_w3{Id?ADwrPYBbF~K(e4FK z+umiCJ`UTg2{@F>y~;^L%}1S>qB#W{FkQlyT#<|`W;)eHZ`AC!rsxVrQRhgOb3HlN zQ+N#X;2P@YdYa0P$aX4Uu*mF^+g!OQKak6E_I4+1!7df94?=$w<(3*Y0mUy{1Bnmc zma;bFc}cAv7A_#yE}VzkmCxzJq3}iEAr~#Frf5bUyRp{i=xe|__A-QbnD(hYndY(% znC=8Htw3YhEOdWPnW!C= zg$D_|=9*J@7KFCGBar9TiMpyNUZQSx>W=+sfbKLg`h~tg-E@BlFe2%>tfg_9YAf_k zG}xJt`j|Sz?^JoaR4aR4*Vkn#YrF_RD2Yr!q$D;5Mc)Gg>br=kekZa}GV?_Xvj{0? z&eq?+di9l5+mz^PPkHN_6k{4C7gMI2R-*Pd)BI{DG+IeeuAMkkrxX{G{o?EwcSf)1 z^sUNVjF3vlu$(0-_3lu4imqp_i|Tq^)Yeh>CcWJ(eS=xtv=fA*l6{Iw8tk-Q8Jh#1 zR$Q~k()VDcZ-dJ1n(&3ov7n_QEQ6vOzdftLCeIEhyK^tz@qC!{YMy~MgclRic1e{T zBcwLMeQOfSFxJ<;WqD?{G2My1+A%U@c}D$#7cmmr-rdm@={1Hwqr*+CIz~uZo;9O@ z2@9pW*%4Rn7JHz!Ni7%Rw?vh$tZdxHrFsGwU&1GRy-nnZD*0hqvc?Lm^Kts`*foo_E~EAv11L0#S4oUfmsK4iu>^DoSdS>&yfk%EMB58LiX6$ zR|)5RM)ylEfwJgOn=Gg``>K}HnghRG5B$Qbxvxg-)g+N|h1#^6^_6S_>(1*0R~%So znr50l&AVN9ukf+JJ}w}abup)t!du6WXMz3Ge_kYr0Jc1!_L4;)an>S`hmv))N1E0G zyFm}%&j=jZ99qk#lOO&_bk6~C0f0rKwiq!J>|a_)JIsAd89cJ{9F&})7?&z(Fl;JC z(rbvp#+(+w^QsX;US@4+YbQL$I*=q|^nqe_5RB)G#du;SLcB1aQ zk_+GlJfYcRqxPK_kL|f{u|ub3J&G*jHy%x8K}PVAEXWq`$k%$)2pSz?iINH_3o=4M zUDF=hyEMr$Jia##+cDRKdm`l4<&5BC!caFU?H^vY5kHohuW8Ljn8%w;An~%_om}; zI&0U{St}zWR=ae&s(3MB9ywvMNF>$-NX~Y}Y@9HfhK_={bEz7@RFI|zY}K-G?YeM< zHrtQFtX9P|hfVtyHtm3)o{6TXM8l%QaP(96diZuJlyYl)VdUd>*!x>In~h~jY~oOr ztwv$0nNs`evY-gn{kJ*k7ya?PG_rt7Tg(~S8#A;ysic9Vk}G@BTFn3tQ!i8RY(Y>1 zt#+P6wV6)gW8vCt#W7ojJGTnYbKq1pi8mQ~VgbETKr;t)jssZ8H!I|;TXL*(H=uKi zqO6j}Z*Dau`GZO8hEikc9Ro26b9&Uq5(5RHxH*r48m1W4R(vnuZrq9r!tkaO(hMA3{GR8D?&p=(5t)g_)vF#sCfaZO0K|uo?E}mN|+n%Xs`V~)kfGcry6EOMsE{m zSs%ILwO!D#^^Brw$a{@E${SK>N22jmJeoUDGK~CM|Cc{nQXeU_y~OV-6_=mmH;-d~ z;w`5l|DBpG(F@0c=((io^yI+Jrr@zfen=L1r98pB_N=z%ueSInh`cDu$&__)l$ApT zNhB6=@-6jjmcsKen8nUxV%;}V2E{Ejg;!)nNm!}&Cm4VdnXV6m;l(AA5me_T8G;)O zKN5OCjeJy=!bk4hsvM(1<^5%~#F$OewON(2Jy=kiIAgHi*ujod*m#?atNcuYlI12g z43UO3NG7E1ZYn6|W*$X*8%fwXvJ+uGA?;6VWVtq)qMf=kdX2)FvPN>87L;X~b!W&> zW+RGI$HVe|kae!Vn4KMZtpxxeOEU*YOZiqk5RIQzD#6 zbB*oama+GYw(_!}{lYyX$fk$eq4_y|I22ar#E)DrcBj6FcJ;BA+VnL@BJ$>QBwfFH zv+)%4GhEP5#tz}dRd%O5G8CL_?S(U!#!T{zRQM>*+mSi_=HvVEsMi)*nTY3~4bAyQ+ zEoZY}_M(ZM9BM4d4h+z=C0%O?N}9T3e;T~G&}cwKP`}(CBJe96OZe3H@Fmn_6rc?^ z1%6kxpzI*f!`#T9kUEu0;5!*H5n9+bYF1GMZvX1kMz?x5%c`n`QI!_dgzCg+xs?mk zjK0`4B)hJfvSAy6%Ty6!F|%EZm9n}Hiy528J0~P za-bVlN*rva(qRjIXQO{;eI=26QybS;!h$;pog^`nX&N;SHb)rU;Z4zW^Zve{5hIvy zL@;mm*6M-(vEKl;8DL*Rv)AYe_jmT|qkxe;efhID&X`kveE-yGW*1W*wNPtVtH~621sK@PE>wtbH z*!4M7lbdH%GQTd{dthrx$H(3oL=x8hCQ!SKloyrFA_597=5_hYS8Iz9bW$%e6~7v+q(<7=badr>)KqWW^!qTi-4xQ0b<=Y|H7?fC55 ztSm@td25_K^YdRK8NpIB^&Eza*g@gcU(k%rD0q90#k@ncrc0ExW0}7{Kj8>huJ>(f z_4`i?2hQ&%n;uHC%AO=pK12iy9#LPk5#(FihD?-gH%Y0I5W8my$oa2b&ws59@O4->cQxzEVj0_Y8QXnQ-+{E|+=XT?1Z(=1)uUH8 zzS<#I9}`dCh=(Q0;FvnX^v`VVr${+!jKUqrl$E$nBdH*J34YgG$cCLx0AHcma)w1y z85Y<~WcG*8|E2~|=@ut{%cc$6@`#LN%x{BFgKY)`mKB1Te5~6c>f4ehu$`Az1QGVv z-#)znM-DE81t8@DF9xP=a=889@(#zdw_yZ>+p_;Sa?a}TG53PgIDos804}qnKf_Ly$GvM zmvIrWG&x9VQrC^aWYKl9fWES?v>aBIL}`iXAZWEZ2s>`Rjg!mZrY+s<*_w4xTIqTY zW@A4R?M5`-4E0l+k@r8GTTvF%PJ6&huF9zt(|H{G6AwVl$&2v9aX`&6N26H<^{%Ld zHMA9rRk)`5nH0HE73grzg4C3A8VqdX5jj^-BkL;o7U^YLOJ};+dH(%*4o#HyFZA=w z`kmk`%-)=XV`c_a`??xX7V@y)gi)KD*+n>atQk%09NC|9q>4sC?&n5z66Ofz2)F@7 zV#i9g%WgP=lKM+)V@$0~t$U?bn`3S@C}S1Ts}E_LkSUrex(gIt!M)Wvl4ZZ}xfYXXpIoP25$ z1%RsZACqKqD%szyrBt%)Pu=W9FJs_A_GYM}8|)f7p0W z?RDyBx!kl|?x%9nYr{Mb@w+rjtd4e0P+%JD9sVU$rE-i|>{F-z%(V?Oe~Q>AUBPDGV2}@V%zEGW~GZ zR==2-J$uQXrEfNuVglXA@7(Aa>X3eqm`o75;q$){mvQ}H{%9$}KFQy*m9#eJ(39=M zZ-Y;RN&^$LC!)?>2WIWl!D2hXSLkY1lq!2D4AtSH<4SyB$-rj@Tg3ib4-g9a!*EXA5N>N_~rapPNT4kK| zI^-KbtG_DaL}1Z!kfNm#M+ehJ*J%Sf%)ZKeS$$GS?4~W(UN+4k-;jHx<7$c+N7Qy6 zQ7h`iwT%!uR}EhB^{6T#pd?bml(BQl$V-Jd2A1x3DIoLo)+nEol2?91Z6ev?KsOkF)!hKnJ~{a=qh$32i-xUnJ{zmK=|2@6x~MQ6PmK4zg-V?&GWlsMEVCSk5DnY&Y;ya8 z#$g(2lk>iXC&!+;9($^saKnOB3Q{KRVCYSS=STdxg1uA)kHBV8ThfK{{b`nm;d=gb(yVudMdPuH#?pyPOnBVUz>hppof(hj zPB1s%IO*S)D$-v;Q_aZOGdKr0py7|@9&k?s?rHGqoQNdlI!v+)6_`_Tn$fbA3TmpI z*2AxhF>g~(t7c*4>#kKt+ETG)vg;e!u`oKW9HL|LK=xA_9cJ!YNxHL(qZdDRU&HXb zo58EvFEGrZy582jitU9w%LJY=o%G0`$Qre%NeWts2_!*ig74Jy1e_B>*5Tag zklHIA>OqRfp7LDl;*x!BUH7$B$ZnQ_qgg=uglW0*HKmmzX zzsi`{nApk?8(++$?|wW-#}k>16Gz@`!4*q8s#vOW#Yg^PIgJ<2FsF*DKz#BI|FY7> zpa|F!QEzP6VMh73&>Wkp&f5{Kv#Q{a-FX}l4Ic{DRI(Jvz;OD*kK7>cv4n0!=jdnM zz{cd=4*Pcs6{LLW)_VMjDPiaJY(?rrMM|*WSA3?uInyJS=KZb$YmkYdpsc5XSmJCO zvd@I!(NETAQb^jB2!TMwKA9X5KGcQ~#VTMOY|G!<3-pzgs;9qHAjgyr6{|FI2F>UV zIZtenVXe(7bg7ul{88+NbF05;m{jqhu&t_fM*I6X_9q_PS;>p=!f_z_Whk*J2QEsG zV;BFyx%gX2)nlU0>1W<**)*iWVY*N&$MJ1Mosr&5o=l#UPfqvf%1w?Ne6?xRMh9AT z^4wnE=^W`Y*yM4AZYvXeNraahXrDH*4Hm6u=QGD_RW@MjJi*$_POgWV9Mfe*hi?nM zEt&vr7q`XsT2$nFW8rAg0sBRakKWuxNU2$y{VxWJ((r8=d(TtfeO^u`ezb4_k9^@g z+^&319}Y#X7anrG*q!>`B6eea>Cx9{CA3_`;hO|Bb6>sLcdt$k4%d~#G zqR;a(@GRkk+Uf|Cp5U>K>5oi$UNAM}Oy*u^B4Q#U)I(YPo-4l&@q(t0;#Orgg@p*8h} zKjjp3y( z%fr?zWTqjqkjomuhekuI_aRfm(NM#I-96QnCcdqz6^@oqPc5mWt2?b#6SQjrjmeZ^ zFERr+2xrb?V&_r1>~5VWjgV>AZ%`(OM30(b=8Kj57)khsfZ}36NJQwvHvSJ zVj|eYecqRcnr@42HJ7#v(U{-Or6XUQ<4OJbpU)2@-N~`7q3)WEnSvYmSX0Kz{Bnu}NP8$>SAb~bEW~|Y&Bl2?vmrzf;n*z5s?~Nub zXDIF5$<|tilFi`E!=vJJ@6NgJ+B9S#cGITEy=>&X-<1m&NtnWnnUz%F^3u_a5@_u; zV^O@jpvBm{`KFgdx>DRmxG^uOcrjVWKcX zR?gU0-1nE*DU0#ggTk(@qiCt&#Ik~A1eDCEe`2xw)^0n>as`2j@X zFmi_Qvjb~J0@RqfH(50*|1l-u1>OJ-*d2;-DJ2ubYJ@ea!PDRT@TLxuINWc++Z@n1 z@%!9IAFbSJWXE@|vN$=@=_*7{_4r!PHFM`LZ0zpyF;kr<%{D2i^W5YWPaKgw)uB_{ zi~Yp1Yz&N9mSqbWK+?IzEXyWgH1fyt#(U^Q)L~=!aK~j?g%B4@C6-FUW5H5szoky$b4`{@w2DV zESP{GM1P$)c;mY4jm8h9APt5e#GiSf5w&DbJ!!)9$Y?kx?!&8da#}g9#BvvA#5z+J zQ`WYW)s_3zpN;2XFpHZ8AeA05^LB+>ZH6?ycHmCeGS&{|F2};;QX+p5PJf`4Uz+|H zkLFG=H}Wg#-uID1tA-gsQ2lxS|N<>`opg&%dM*BRzMFV zs<+}i=6u@{`L;~J<#Rhy_vT7{lAVAJsn4>MW$8?y9JSijg=8sT`H|aV4JZfLcOGER z?J{oh$~WL|Vp+XWRx=ZHnh99-K>e#g3{Zb=sD)*6?hZM#`qHZU(rh@TJ#Rr{iS!*R z)hp=*&8;@7n@-0bkrEyeW{`b=P0M?_CWElrQ%&t*Qtt<;vr5!4m5A+yo!bjF`%SP; z)i2yU=CDKIFjmUiR?3)HddVwgwYtb3y^p5B?8QyXUu;p1$FV>0mQ!@D^&Z?f`8&di5gRpZHGwAnO~tL#6`$bHBR3xxarMret&OJbL4) zyYQpHn+E@j3CyP9>zg;5IW!gZ($5BUeO4}X3~4;9bI;viHebfBH}>W+27I`^({zPj zr~qC1!@=P5m#4q}_UXlsolhr+x(V1o_nSB`8&0wM#u}qm$Eo&QhA`A7Zr;xM)EoJ) z;dG31pc*Ij!_3DEqe9@@U@!nVdC`k_{K`pBCi5G7cUEnvGo&G;Lq+~%6at~%oyX|A zEn#?tT!Ql$7$7rD*8er~=Tr{jswwNTg}g8Rxc&Svu#W}&-}K#!Q8@R<;>|-akT)B< zgbI!A6@LdK{0K&+h2tLsytQZ?Vto6{e+Dx*2uE}LK_n6Tzhb?o*=h;fXY#GK0g7KI zuK?SKw$IYHsNb1`FK5AjmcHCbEwiwRl_Zjc@c#d%-rMuobI(4UUEYjOpD#{7UVofi zUiy=>n@j)s{O0WP`E>N*?ElwllQ`={P*#2EdFDV`ScLC=xV*mpIGUVKF3!iE|8a74 zd3xoYPo6*AjJ&H}EaKw%>g?k3CI$>|My29{PVM`vk#XSAD^F3d$EX1(9Gy` zd@&mPmy?e-=T{$Yo^Q@STt44;r`My2*Na75dDmByo3o4Sn~!G~-uU8qa`8Mq155ZH zMq{rhO`tS7-jH7v$tYjGmue`{x&9On>5Eei%(IpFiS*^NHtQ-t=M-N5L|1Wt2Jx%ASUyu(TkeWb)yI|G|46fybXuA%ZWks>`dJ@$=2c^;I=Ei&RBfxe*(DN3zn7S2s6T*OzA> zFK#}5xVb*{uf4PJ^W^IJdUA0+IkymDgR{t6DH&Q@s}xd?(OOW?EH~);Q-85=;FhBu zNNq!WG4}!(4kv%VJ6bba}8^zr8Oa(uqV zt4v)?U6g5JxJ**&$~Q@vaF}ok2*(slA0}h}?9}&0XXhX2f1W>#NZ0!a&F;gEceZZv zFm*9?6;Kz8rFd<3SX-hVe%25`dY_qM$v-_C!5MQp@yujle~-TQ+Sgu zSzAg%E=*k|s4HJA#Y^;ebf}M2dnhUQPk+JXkC59`beMf4XT7Wb0iVD+IQ*q<(fsK| z$79F-)Q^R)pwlxZbycvkcDQ$Sw)qsH0+@;U+B4hSu*dtl2z4)*m%`cE=;HeN2Cg97 z2$OXPPjdf3{^W+w^P=$~b>@&vcDs6>e7v6Az&ACzI`?lT zr(^%)^_A!OSL5@G>x*^MkWaERC&{-PDTQ54e6rqdNMD#t{Ob`yQ{&5XM0BpMFD|aY zb%nV3q2v-3*`PGKXn97$A>O5io zvuylh(~He46-l4gjI+izI0S`2aO<#W)jTb2d48h9PNR~P%9_yPGJXxCAbxk2QDF9D z1IdaXZkH-6-mTxFhCp_#Gl{%6-+a-ZgUgC4cjjJ%yh7*f zHIC=zk1+;Ct_>;m*x0u@!1fnH z#=hY%-V6M=@cX)Nix(Gl6Zm)Jh}+6hU%Sss*a9o!weU;a3hviL?qKXm6u!By<0;rR zacpDxcx}=&VWXTkB!o?HW9h~-V0LkX<~M4n_D-oUVcI`^@4Ltwe{wFV`+zI}Ad%4BFnId?VSxW0-TyoM{LlXy zJUo29LrTV9sCXcqUfeML8!jB7kh&t954Xu><~m9DyMq6J2b)?$huC-m)RLoHs|5*V zX>v{VE1;^eKMLNwDU=QBYjU(##oq^aTD%;~j_mBVF!q+he57Q#k4d$R6kC{14a+1+ zr7d4F11n`v7%8lgq zDqksMEULuM_PD6>MKQ*rO8l(cqBs?pQ-Rl#T~#Cro&htP;H-50i$SaLNAv6lE56Dt#I8jgTTud+Bwz~$sg*7CXX2CJvCXBvdv#HC*B#iPI!3JTJ z_!$#MuL+}k?y5l;C4N?hFtQnvd6)j$GaIj2+b_z@CMR*ya*^jenPoi$)U7%|-cQp! zH-F@0V*M&`gwQq;_(Ym!P7=|*$brj**TshFb<4C(nJETnKwCgsHZqm9}kEd(h*#_=7&rtBb!=LyZjU zAX~)vM&{5YU#Ccv$ZJW)*MD_?hS7KTW$8s@XDHL9)5ip#YY@!rKQL{i>8w6(e-k84 z`225w6w7oRT3mMg7hanY-+$;0l~g6!d!|BMzQ4?SGQX&O{!zbqU6_rdR4M7#ps z6!p+`62&BS897_VB|=GQ>D2^r6a)4*_8e#94`r%!tJ_~AEy`S^oNKFT+?eYnTJ@^5 zaY?JLw{YjvU=bH*kP`{j%O?@_6v~8$ZX-~?>WzqBHxN-mB0Z)f(8=me2MQtvNQ(&c zA{&4k|Lkz_ig!PXt(^E=66QnAIGd=|ICXWybwpK+9C1ya- z+CxIgmbq(GVv+ro$mP}fY&`>50Q$T@^Qe)Ghu@RhrzE%7Cc-uE>xPh#@fH6a)Pm}X z-iOE#t!qte(G z*Yak;Qb4tpUY@_OG;DC#@|irk>HU-VWzr+a#()I0jh(`a_p4n_+|3#)5!O~zjkx{x zOZoTm?Kv!nQMtbt2dUn?#dn|$R1Y4}52;7!cmLh~>raFKS)vU3;+%TfKpa!4Djb3q z*XiaNsu#K8WJ0h)*4Y+0Wpxlv#HtJ|1@ct1gtJfrr$GiG&4Tk5CnUVH|GGpYNWfo( zbAgE<_wo{GSjxqyw}ba8MdwNPgn*A~rL$OJFZB3L2Z>GPM8Bm0_@=$C0;pVLC-Q;f zmc}ky1;2U=7NgpLbTdC5KQ}PSuh^Y>?+~VGVB9I4vju@8G}t5{;d^hc1U|7QWuyuL z1tBg}hKSY$X1II^Rcji0M+|p?a90ASb0j;0TeErSErei|{*+d|SoRh=g-<9*$DF9= z{^{mWhPL$4z-2&2KYBHqMKxXDJgdZyRuWNOZHc(=IvPmB16M! z2&B0ehJ9e9WK$l<%8%`aoi-@|qWU6|A!}>T_0wozYui-EizLOuoa{}l%=NlCKh-8% zGb6tB$_Mt1XeH?H$l{-Bsv|RZVu2Yeg#3Y4UHeFN4yyB;2BcD_%cEh z<&~Mg&ykOO>fOPpro~Hj(&54Uf(aRsU7>+fiTe*jw%S%8>1zJZY*qMOuYZ9*h{b{Q?dDP<5pT z$%Z#6Q~UjRdQlk5-B~w^$bSoC-%Y@?TNZ?MnK|Krm1%Fq2K5_ZnCj|>#1NzC@iH3u zR&}+mj-2el;>Vdio>*8q7cG9AZ}+o{Eq=B@F=u4ohqR1YXS-wr`;>%5rAggOyV^EV zPTg9%x0>5}E94%d z?cxijc&zcw<{S&y_QT#v=m|T@{%HJAvVvhfWlR*f*9yI80YrC!j(#feoJ0gm5UVUJ zS|#o~nu5MLY3Km?vu|i!NL{*G44Q!swum} zj0MoGUl;>jw`uT>Y&>`^W5o8#rh=O#UMzx`>#6vu`Xe`iX4FIsv#A-`a==#izA5t$ zS`omI)(#GYmTFrlkfL_aAeRQtF6pAYGU|s~$!vL})=QDg8MP*@tc}_#x}Ne_P%GGA zHVGZ&bP4ARyXOd^Ka-#(?E|zG#hr1A{IO&h=Yf1oAE=4#)pe4_HTV5!Mt$Npy#+05 z;h{=e)IJRE5z?~1S(z&I@Rmbw9ypxCmJleXZtli>x&QoyTIpi0MFU2`VtHQNxE({> z4F+G%9>>A^WG?!)pP!3miXXdUWTeLK3rv&3{_mTHiNYluI~#}i;{JYic1Ew4pqYSP ze4mXdVBfA+2)&A*aDPmevysTjJ2@F#51t^`vgAi?=u!PA?~#@7q!Fsheng3&v4F+v zG9HINNo-|Yoeih{s6}KYzcwO&dO_?xPZeN>^9Ylf(j7)F_exW4IGeSPOY zXh74Y)lXN~Ci1Qvwba&PXRlH9YHYc&t!reVcQwIg<=xFCT+8m_s8$*6X9VMY7eu<5 z)2cEWXc^tZiR-`s-zBA!TgIe`ih3o)!U{!_5Xfws;%0iwG(gkx5{iSNJ;9JA!DI4l zRzy^ruuV3}3sH%qbiPRv&Mu@-c13MO$JVw``p)(z_O2KSD#WhI4rU?Ebkqj!eN|TvWXd%Yfq3J`esJ{&Iq!U z+!aE@yxjjEd+!1!SytBxMho2_DDn_!!AFC|!_kI#Wn^SlX622n%&N@lsv^6pGAp}h z^l~%eMrKfvaf5hdRx-{EK0roYMORwZ$Br_H471LM3a#Jnte_(;JD(3kK^EOvWfA#i zb>w3dcU?#K_dkz&&$)4KydyFqEBfnO8FAy@^Z1|t`Jey$udhD2>Q9j5(JMd1LJh`= zxkH5dl(C@-KS+`)0@q0GFapL?6)ag#KD#@f-WrW6c7*US8TtHJb~;RK#^y{WnX=D>8We$Wc z`u0_q5>9xa@rb}SND#fPCo#1;kHvAf#VxBM$o|%VL z5VkrHGzc8+>^2=dtEr6qLVpLSOH^;}HBPF;Z0wz2zd$@`I7p0KvyV%S1OHbbZrhsJ zd{MM)LfqnpF3<`U_JX~QK2zaRVS~~jW8S98nq#_mF}KNC z8gNap>oIQoq&t^WF+Sw;A+Ux{9t@*)5_#+p3R~jnVd1ihC5bFlRGG$R=AFSB9){xr z8%x8pkra)Ur7L@IKJ8>3dW5A155HPJpjtSc-o1R85Ey1y@LjAn9*nIFtx&*CCJOdF zvL-LE#o%>kLcAoAa-KEZ#$54jI;KLAB)P7a$LGXks8zQKp1T8C|IPO{jh>=a`bL0( zd+B9Tm1en2)Q;$;3D~B4VVv#QMlS=Z=MUUMvy60ceFCt313e8z57O>;Je^zVWl%nL zC_w^!j;!0J)Zs~5g>%kDQBoErA*pfSE7rM{U z;_PpD)s6=xoKQBlR>|*S^N}__7zP%4xPpn$8+WgLW9K_J4HQas@(L(e+X}Z@aEoQc za?znr*+}vpG`GUIDQ;=(sMY!^>en?~WC8^AL&-^4=v>&Rf|vdffEuB=AMz$55wb<1 z!wf4(5kVeiL$-^;xxt6LKS|EFa-NLiqmLXqxM0!M}VLYXB#lax|+Zr zjzou!@*iu&f32HYP*p=XdqQ*p-e^i8byPmghP*B$*iY&RLUctcJ;ntVP7ozx^n+by zwAH~alO>1tB0uCT1v6Co53~))22uEq^m-T3HumkC@Eg2j!C`Qh37!m+Wp5u@7b&K1 zR5(U78fRtL&x37JYbOrKB5y^_t>jPi{j%+p-6OYbVT9x}O@DOS%LMnnS_XU6w&j3Y zK@@J3j$Cn!TKqHx^8q2dl6P$snyx}&$7MnTOY{i*=oH9fu$ZoYDzj4U>>LN04ZEYm zCU<({L)N-#pejRg=@i! zWU}jA%T<{&xN;vI5V3RdoGjGMh!-{&(~~hIR9JU`mNrF7Vo~_dbyh5m=^g8ImsLm~ zLheJ0&xaWhqNy1K1y1F;#=I)A$soIqq!Nf5d*>wYH?}| za5!MkgR?~{Y?LCRKf`bL(bct)G%A=z0fG@&L>M`g$VNx<)e?E~fx%)(>)(-^nEh-d zi+x&YRMb~KgV|=^z&;DI+h_ZduM{9GV|qR%@3ToZFhC}VFdT465(#DyxFv}|JwP_cbk}| zVZYr20H6bUTA5>&Svg|(3zd;}OvpoxuX=#&djX>3B(ZPTAQiL2g@okbl-V?43o4f} z^@hJydTAji%3ur8yvw}2P^YO+f-!ShB~rlwH5{mEtd+#d%06rxrtCTq+FE0_9nwMW zK5nIV{Dxp8nqx+3Xm#3k6=f9YzMF1(8F((;bfRf-x*or=-I%<5qukLluz?u*bwty*HRIN8r&e>Q zb^{lDr%eCm=g=tCfpLxefwjf+j49}RGe@bsr~16dd9W7Dvx5PY$ckNe?%D?$TDdwAacOFym_7u6Rgs zLJ2o*Qn*;A45#+>b;cC&hmQ|%kkqRV7`E=-C>4oVksr}|rBP~}g!o3Ed|@QPqi6I? zCU){H97my|)l+|Hi1`q=&I?7Kl^H1occ*?z-rgI)0-c5JLzyuAc?kL66p;`(wm|mQ zymVEDowersQv32}d!d>&02>yt0-^zm{xDx;MyGi+6O;D^-Isxr?FqPi>WtEE1bOg+ z0-c~B9y_C85S68LZ!cfhNJ7XkDmVIEf#2PzJQCHNBsvqq7O^axXo@Y$lw|%?b(YG| zj6dQ&8)-02S+M{QLwF=}=R(PNtNJ?DHMhqj3{s{^o_cbRnKbhaR57Cnys4i}lf@Ub zk=~Ee7Nzl|;8-LCXjxyuuHz{mt%Me*&C|W`>L?u$#E(v!PEWYbaTOQ#ExDzlyeu?$ zbW5nbrxc6imJhUb@=lT!iI#djYb6)I8&74^=~OXmRm+gj4!kl&6KmL%f)6rmceQ;u zASRGP7D1G6fMVWi98ew=-vG$8+R6|1J`$H!WzQOV3KckenAi}}lF9v6d6cv?dZ$u- za>pg@{GzAk@$SWl@FV2vi+yY-B9{> zwfG`aX{@2mfX*(U=g1+RFWC&_%|;1Iuuuev=CFXN4a;M?GZ@=vrFI5AXZXU{Do9}~=W?oq|E1~2tSBQCp@{l~i*w&=w6z|uZ4;G5v?`%{p29`^%klX)LI zqR@nwKj~lWD;Nd)3~?oXF1~j4$|Kj{p5n7Es2ZbY?dK~81b~87XhPeRj@Sr=74szf zJWV*fn4B_=*JM5ebJRGrkfYze!cc{Z2Oy?34^?czW~BsnND@NWrF+)|5Ys*B3&dUr z=v@b9;zo@Kgrbn@oGeRo$rJJ%v2$o=Xvx+2?hB7}H?lXmU)dY>H3AEF_hP$Un|WKf zwLD3#Po;b`po16osm23z-O#W!%i(O$B+s@@?VtfwrpQ1PvR!mal)q-EZOY7S!yG3| zzCF}&9#g0@D`pZUL~ZQckUDc>Jw>(@dH8K`Y>7Po%x??kB|W0>$+n&Hqe&i6xz!E6 z_d5dua}+w@z9NXHUYeYQ$ksqk3om2etHWb<%HCKIpsf@cxrzFo8v_yxNtF2Bq9d5C z>fqaY@>W%_3KI}HJxG@FN1w@}HB$v$ds3``rV zJRx%Ur>xs)Sq+yrP-m4~Nm3uEQ7*r;4u{kti&ha$WoxQ5_-th zqh?@6M>gYpP**F|CQE!{Zqkpe)&1=vM(ID@9US@uL7U-fio%FNB5D)00Z6@~OOKqbx-P*C`zG+}AluQhQBvy%%$U~#-bs){v| z>K>=V;BJo%%QR^b4X^jzu)qj;0)|Jt(RagIT8>swZ1&wS@@$*|fwL7NQ#`MJu^NIV z&#YGQ3a*9Ne__OHzl$Q@8qP4#Jaf+)Bn?_$GZ}8jg8+jv(IPk#Ya+))**)8tr+S$1 zAdL@yQa&x|%NZiDQ49=#;SXfufHl=*`?MGMi~w%}k#Zc`wA06)@y>GMm$@4S)TAw1 zZ(|-{2^jw~;DNMqj*1ix*vPawpO8?aYAqwgHOW;C2%UQz#C;>UC`1vVe^VE*RZ83L z@N(aSI&hKR5-D6*_A4ckB(dP9~hJHCKqb)ckYn2^X4dWFvhK5(^jGIk)zKNo75!f8 zP>i*d%nB@=uPktL*e>BBPDa)B8%O06-@Y~&X`ti`25SktD;fxl6_QCELSdi4nbP1= zGe$T~qQh&8rD+sMGNsC+iAU@yg{vU6r?(lW6mAk9XCBHucqosFzR#Ru&y7RH3ofB0 z7Uz^!xV<`5?$wE9ioyunemcF7>}kzc7G{Nfw=CB=gj}byr_$9%6(D46y25jZ+Ca4I zfbCF;;@%P@8Aes0vb}>U$5m#1U@YhO)o!Tclz=rs1YgG4x39xD0E5-Z+t5a*IZ#Et zB4w#Td`h%lhtXiWiHb^1Yg(sr%Q20KVXES#b?qh1b1nL%-he84+SGc|JkFwfnqEIE zZMM@p4OPt(y-X6rF=?NM_fC89_PuO|)G%fSQ9!_utwsY9bJ1l4F7WLlLW%#mqF8=t zgSqWZgj#o<%!!I}x=n{uVs+DJJ|%2T#{X-y{6o;S@Wjt#)i>P^-jW^8M{RzrM}5~B3mez2DGvBRT~kxsibr? z)$#l>5rXVC4!nYOU9HeJigS|na)T7}pfw}tpj3wT*ahoV5H&Fjl@ZzQhz=Bg-KNw+ zs1e^R3+y4PXbdIBTx+LOj5&Ka6dfLlF*iNZ567iOT>Z`)wG?m%`xi5nZ+4`|J6;9A1cS5sl6-p;XRFP?T4ll|h zNL4U9$}k{m&9CymETwY=>9MR%3^eE)9q9bo_AIdasDE}Sr)4x>*XGSOJZPJ@`symo z0jll0ck^zQ<@soV?jw}TLh8x-(riE=Lb46Ui8DC&&bjzY)IG}*--HC#C_xaT6Jp$TsVPCBZ+TGJY0ARWH#$fyJQI=cMGH@cB@(H~ zm9>@aKX_uC?U65GivxwzoDfmCBSW&4SVkdYEvXL0tXA_Aw@9U#qT~joeIV*;JYwxSx69* zsy2g)qd37N6AF^w!cw3Z0#inlDz@a5OK(CX7x&Q-nryZx_Yk}QN&6)74Bw18UGEU6u5J-vqQdc`QIa6{B)sF1?q#4duC;8EXJC~N;1 zLk$JMRi8$j#k;rD)CwvAxs`^wXb_)V&|%#z1K99(bn=w4f$%HD=SsAFCak69)J zRAC|kLB&tJ3W~Bcv>cl)Z5WFs@p&J!wWxU&?-Z&FF`;JUx(g<_c*oe7D3pq7hOC&4 zss&=%@kW$|Pvjr0Q2$&2>8}5%XF-c1m0VXguUy{LN-W9Vo8>arnT|HQjs$v?`VUo- z%6m>8wThe?@M&rfK)FGKBN0YTUWUA4nD$wo?cpBI@M76>C{ypfwAj}NHTN=F*o=nX z*~FS*f(=PrT?#3`w-Aq)k%JbWc3uPs&L-|?GjCSvrTt2vxW7lv7@JG3eD$MXa7LG( zP2Jmj1IZ;)F+F9Xvq*|eoKK4ojC_c60#)~Qbi#Xr{FXk%cAOw zEJz|>E|J{SSsSHk)&M-e3Z_g;3vB}R=^a+fF0*k^KIxJNGqxhc7-TIm6#r?|Llh-O zNigENBQ#9q9LGEt>E{v&K?4|YYfN63Tq6v~Pyxv?LxwyTDc;0iv_Y1bSTjt6DF?Z4 zBRgkE|6=WM!Imhr~zurY1O(!hobjQ-7Y#sU6G(RCySh0l#;x z4JnVPBY^4G+^*kNPfxdI0#COe3kNY zfqFt&IG5q&CRmx-AlrXk>KcVIj9A-Rtyv{ax`9Z`!n$zds6qZDos#MgO99Be#rxolIx z$ng`7t=U;#J1mMcK7i90p;==3v7j~lgAVjz=!Q6!ncF8j8+Zo($QCCdw1Gs~Y)+?j zzOS_*&Y2G|R8Gd(AZ)gMSDi-wKy}6p!D1@*c%anvLCj~j9*+4qQ?t|SOrEK!MfoD1 zsY!wgh_avxAvjYrH1JkuY<|MY<;*T%HP26>b>Hh$nJV~i_1v7=vjXQK--z6`g&mJI zE5Ur`G?f*kW^ll(J_p>Nk1cV~BDUA}+mt+YUoE1&d(lHvx~O9Mf#zlgQ9!^DOrZg( zn;aZ-%ok4V1uI2$e#rqq+5S1Ov*a7Vw5mD+4G zlT~a@vjUD#`?8lwZPHa4!d)iM27TFxPD0`^6wl+DkCk&?RovV0buoc<*`VcMZ!$iV zkA+mLTo+x30BY#T&<1A5y|hlTdms!i9VfK~%)#wy39_YhZ)0ETs*ju8eS@Uo66OaM zj3@*iqL}@!L%F#RbSOJ}ZrK7N>zLZ3%878^V|p%faDy^PeyKTB=@+r=A6Qtu(`uea_81C5f-hpiofKppB3T0fO(Nqm_$_D0!2Ltct$ zg~%zP&seg?j$+G&6R0vrOw}@Z!)=v+1j%0A(bW^+n!!N`d6(2sJm=Rbkg4#jx=IT> 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.3.2", -} -ayon_compatible_addons = { - "jobqueue": ">=1.1.0", -} diff --git a/server_addon/tvpaint/pyproject.toml b/server_addon/tvpaint/pyproject.toml deleted file mode 100644 index 46d0611d74..0000000000 --- a/server_addon/tvpaint/pyproject.toml +++ /dev/null @@ -1,6 +0,0 @@ -[project] -name="tvpaint" -description="AYON TVPaint addon." - -[ayon.runtimeDependencies] -aiohttp_json_rpc = "*" diff --git a/server_addon/tvpaint/server/__init__.py b/server_addon/tvpaint/server/__init__.py deleted file mode 100644 index 658dcf0bb6..0000000000 --- a/server_addon/tvpaint/server/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Type - -from ayon_server.addons import BaseServerAddon - -from .settings import TvpaintSettings, DEFAULT_VALUES - - -class TvpaintAddon(BaseServerAddon): - settings_model: Type[TvpaintSettings] = TvpaintSettings - - async def get_default_settings(self): - settings_model_cls = self.get_settings_model() - return settings_model_cls(**DEFAULT_VALUES) diff --git a/server_addon/tvpaint/server/settings/__init__.py b/server_addon/tvpaint/server/settings/__init__.py deleted file mode 100644 index abee32e897..0000000000 --- a/server_addon/tvpaint/server/settings/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -from .main import ( - TvpaintSettings, - DEFAULT_VALUES, -) - - -__all__ = ( - "TvpaintSettings", - "DEFAULT_VALUES", -) diff --git a/server_addon/tvpaint/server/settings/create_plugins.py b/server_addon/tvpaint/server/settings/create_plugins.py deleted file mode 100644 index b3351dca28..0000000000 --- a/server_addon/tvpaint/server/settings/create_plugins.py +++ /dev/null @@ -1,136 +0,0 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField - - -class CreateWorkfileModel(BaseSettingsModel): - enabled: bool = SettingsField(True) - default_variant: str = SettingsField(title="Default variant") - default_variants: list[str] = SettingsField( - default_factory=list, title="Default variants") - - -class CreateReviewModel(BaseSettingsModel): - enabled: bool = SettingsField(True) - active_on_create: bool = SettingsField(True, title="Active by default") - default_variant: str = SettingsField(title="Default variant") - default_variants: list[str] = SettingsField( - default_factory=list, title="Default variants") - - -class CreateRenderSceneModel(BaseSettingsModel): - enabled: bool = SettingsField(True) - active_on_create: bool = SettingsField(True, title="Active by default") - mark_for_review: bool = SettingsField(True, title="Review by default") - default_pass_name: str = SettingsField(title="Default beauty pass") - default_variant: str = SettingsField(title="Default variant") - default_variants: list[str] = SettingsField( - default_factory=list, title="Default variants") - - -class CreateRenderLayerModel(BaseSettingsModel): - mark_for_review: bool = SettingsField(True, title="Review by default") - default_pass_name: str = SettingsField(title="Default beauty pass") - default_variant: str = SettingsField(title="Default variant") - default_variants: list[str] = SettingsField( - default_factory=list, title="Default variants") - - -class CreateRenderPassModel(BaseSettingsModel): - mark_for_review: bool = SettingsField(True, title="Review by default") - default_variant: str = SettingsField(title="Default variant") - default_variants: list[str] = SettingsField( - default_factory=list, title="Default variants") - - -class AutoDetectCreateRenderModel(BaseSettingsModel): - """The creator tries to auto-detect Render Layers and Render Passes in scene. - - For Render Layers is used group name as a variant and for Render Passes is - used TVPaint layer name. - - Group names can be renamed by their used order in scene. The renaming - template where can be used '{group_index}' formatting key which is - filled by "used position index of group". - - Template: 'L{group_index}' - - Group offset: '10' - - Group padding: '3' - - Would create group names "L010", "L020", ... - """ - - enabled: bool = SettingsField(True) - allow_group_rename: bool = SettingsField(title="Allow group rename") - group_name_template: str = SettingsField(title="Group name template") - group_idx_offset: int = SettingsField( - 1, title="Group index Offset", ge=1 - ) - group_idx_padding: int = SettingsField( - 4, title="Group index Padding", ge=1 - ) - - -class CreatePluginsModel(BaseSettingsModel): - create_workfile: CreateWorkfileModel = SettingsField( - default_factory=CreateWorkfileModel, - title="Create Workfile" - ) - create_review: CreateReviewModel = SettingsField( - default_factory=CreateReviewModel, - title="Create Review" - ) - create_render_scene: CreateRenderSceneModel = SettingsField( - default_factory=CreateReviewModel, - title="Create Render Scene" - ) - create_render_layer: CreateRenderLayerModel = SettingsField( - default_factory=CreateRenderLayerModel, - title="Create Render Layer" - ) - create_render_pass: CreateRenderPassModel = SettingsField( - default_factory=CreateRenderPassModel, - title="Create Render Pass" - ) - auto_detect_render: AutoDetectCreateRenderModel = SettingsField( - default_factory=AutoDetectCreateRenderModel, - title="Auto-Detect Create Render", - ) - - -DEFAULT_CREATE_SETTINGS = { - "create_workfile": { - "enabled": True, - "default_variant": "Main", - "default_variants": [] - }, - "create_review": { - "enabled": True, - "active_on_create": True, - "default_variant": "Main", - "default_variants": [] - }, - "create_render_scene": { - "enabled": True, - "active_on_create": False, - "mark_for_review": True, - "default_pass_name": "beauty", - "default_variant": "Main", - "default_variants": [] - }, - "create_render_layer": { - "mark_for_review": False, - "default_pass_name": "beauty", - "default_variant": "Main", - "default_variants": [] - }, - "create_render_pass": { - "mark_for_review": False, - "default_variant": "Main", - "default_variants": [] - }, - "auto_detect_render": { - "enabled": False, - "allow_group_rename": True, - "group_name_template": "L{group_index}", - "group_idx_offset": 10, - "group_idx_padding": 3 - } -} diff --git a/server_addon/tvpaint/server/settings/filters.py b/server_addon/tvpaint/server/settings/filters.py deleted file mode 100644 index 9720e82281..0000000000 --- a/server_addon/tvpaint/server/settings/filters.py +++ /dev/null @@ -1,17 +0,0 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField - - -class FiltersSubmodel(BaseSettingsModel): - _layout = "compact" - name: str = SettingsField(title="Name") - value: str = SettingsField( - "", - title="Textarea", - widget="textarea", - ) - - -class PublishFiltersModel(BaseSettingsModel): - env_search_replace_values: list[FiltersSubmodel] = SettingsField( - default_factory=list - ) diff --git a/server_addon/tvpaint/server/settings/imageio.py b/server_addon/tvpaint/server/settings/imageio.py deleted file mode 100644 index ec7ee19e13..0000000000 --- a/server_addon/tvpaint/server/settings/imageio.py +++ /dev/null @@ -1,63 +0,0 @@ -from pydantic import validator -from ayon_server.settings import BaseSettingsModel, SettingsField -from ayon_server.settings.validators import ensure_unique_names - - -class ImageIOConfigModel(BaseSettingsModel): - """[DEPRECATED] Addon OCIO config settings. Please set the OCIO config - path in the Core addon profiles here - (ayon+settings://core/imageio/ocio_config_profiles). - """ - - override_global_config: bool = SettingsField( - False, - title="Override global OCIO config", - description=( - "DEPRECATED functionality. Please set the OCIO config path in the " - "Core addon profiles here (ayon+settings://core/imageio/" - "ocio_config_profiles)." - ), - ) - filepath: list[str] = SettingsField( - default_factory=list, - title="Config path", - description=( - "DEPRECATED functionality. Please set the OCIO config path in the " - "Core addon profiles here (ayon+settings://core/imageio/" - "ocio_config_profiles)." - ), - ) - - -class ImageIOFileRuleModel(BaseSettingsModel): - name: str = SettingsField("", title="Rule name") - pattern: str = SettingsField("", title="Regex pattern") - colorspace: str = SettingsField("", title="Colorspace name") - ext: str = SettingsField("", title="File extension") - - -class ImageIOFileRulesModel(BaseSettingsModel): - activate_host_rules: bool = SettingsField(False) - rules: list[ImageIOFileRuleModel] = SettingsField( - default_factory=list, - title="Rules" - ) - - @validator("rules") - def validate_unique_outputs(cls, value): - ensure_unique_names(value) - return value - - -class TVPaintImageIOModel(BaseSettingsModel): - activate_host_color_management: bool = SettingsField( - True, title="Enable Color Management" - ) - ocio_config: ImageIOConfigModel = SettingsField( - default_factory=ImageIOConfigModel, - title="OCIO config" - ) - file_rules: ImageIOFileRulesModel = SettingsField( - default_factory=ImageIOFileRulesModel, - title="File Rules" - ) diff --git a/server_addon/tvpaint/server/settings/main.py b/server_addon/tvpaint/server/settings/main.py deleted file mode 100644 index f20e9ecc9c..0000000000 --- a/server_addon/tvpaint/server/settings/main.py +++ /dev/null @@ -1,64 +0,0 @@ -from ayon_server.settings import ( - BaseSettingsModel, - SettingsField, -) - -from .imageio import TVPaintImageIOModel -from .workfile_builder import WorkfileBuilderPlugin -from .create_plugins import CreatePluginsModel, DEFAULT_CREATE_SETTINGS -from .publish_plugins import ( - PublishPluginsModel, - LoadPluginsModel, - DEFAULT_PUBLISH_SETTINGS, -) - - -class TvpaintSettings(BaseSettingsModel): - imageio: TVPaintImageIOModel = SettingsField( - default_factory=TVPaintImageIOModel, - title="Color Management (ImageIO)" - ) - stop_timer_on_application_exit: bool = SettingsField( - title="Stop timer on application exit") - create: CreatePluginsModel = SettingsField( - default_factory=CreatePluginsModel, - title="Create plugins" - ) - publish: PublishPluginsModel = SettingsField( - default_factory=PublishPluginsModel, - title="Publish plugins") - load: LoadPluginsModel = SettingsField( - default_factory=LoadPluginsModel, - title="Load plugins") - workfile_builder: WorkfileBuilderPlugin = SettingsField( - default_factory=WorkfileBuilderPlugin, - title="Workfile Builder" - ) - - -DEFAULT_VALUES = { - "stop_timer_on_application_exit": False, - "create": DEFAULT_CREATE_SETTINGS, - "publish": DEFAULT_PUBLISH_SETTINGS, - "load": { - "LoadImage": { - "defaults": { - "stretch": True, - "timestretch": True, - "preload": True - } - }, - "ImportImage": { - "defaults": { - "stretch": True, - "timestretch": True, - "preload": True - } - } - }, - "workfile_builder": { - "create_first_version": False, - "custom_templates": [] - }, - "filters": [] -} diff --git a/server_addon/tvpaint/server/settings/publish_plugins.py b/server_addon/tvpaint/server/settings/publish_plugins.py deleted file mode 100644 index db1c7bd11a..0000000000 --- a/server_addon/tvpaint/server/settings/publish_plugins.py +++ /dev/null @@ -1,133 +0,0 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField -from ayon_server.types import ColorRGBA_uint8 - - -class CollectRenderInstancesModel(BaseSettingsModel): - ignore_render_pass_transparency: bool = SettingsField( - title="Ignore Render Pass opacity" - ) - - -class ExtractSequenceModel(BaseSettingsModel): - """Review BG color is used for whole scene review and for thumbnails.""" - review_bg: ColorRGBA_uint8 = SettingsField( - (255, 255, 255, 1.0), - title="Review BG color") - # review_bg: ColorRGB_uint8 = SettingsField( - # (255, 255, 255), - # title="Review BG color") - - -class ValidatePluginModel(BaseSettingsModel): - enabled: bool = True - optional: bool = SettingsField(True, title="Optional") - active: bool = SettingsField(True, title="Active") - - -def compression_enum(): - return [ - {"value": "ZIP", "label": "ZIP"}, - {"value": "ZIPS", "label": "ZIPS"}, - {"value": "DWAA", "label": "DWAA"}, - {"value": "DWAB", "label": "DWAB"}, - {"value": "PIZ", "label": "PIZ"}, - {"value": "RLE", "label": "RLE"}, - {"value": "PXR24", "label": "PXR24"}, - {"value": "B44", "label": "B44"}, - {"value": "B44A", "label": "B44A"}, - {"value": "none", "label": "None"} - ] - - -class ExtractConvertToEXRModel(BaseSettingsModel): - """WARNING: This plugin does not work on MacOS (using OIIO tool).""" - enabled: bool = False - replace_pngs: bool = True - - exr_compression: str = SettingsField( - "ZIP", - enum_resolver=compression_enum, - title="EXR Compression" - ) - - -class LoadImageDefaultModel(BaseSettingsModel): - _layout = "expanded" - stretch: bool = SettingsField(title="Stretch") - timestretch: bool = SettingsField(title="TimeStretch") - preload: bool = SettingsField(title="Preload") - - -class LoadImageModel(BaseSettingsModel): - defaults: LoadImageDefaultModel = SettingsField( - default_factory=LoadImageDefaultModel - ) - - -class PublishPluginsModel(BaseSettingsModel): - CollectRenderInstances: CollectRenderInstancesModel = SettingsField( - default_factory=CollectRenderInstancesModel, - title="Collect Render Instances") - ExtractSequence: ExtractSequenceModel = SettingsField( - default_factory=ExtractSequenceModel, - title="Extract Sequence") - ValidateProjectSettings: ValidatePluginModel = SettingsField( - default_factory=ValidatePluginModel, - title="Validate Project Settings") - ValidateMarks: ValidatePluginModel = SettingsField( - default_factory=ValidatePluginModel, - title="Validate MarkIn/Out") - ValidateStartFrame: ValidatePluginModel = SettingsField( - default_factory=ValidatePluginModel, - title="Validate Scene Start Frame") - ValidateAssetName: ValidatePluginModel = SettingsField( - default_factory=ValidatePluginModel, - title="Validate Folder Name") - ExtractConvertToEXR: ExtractConvertToEXRModel = SettingsField( - default_factory=ExtractConvertToEXRModel, - title="Extract Convert To EXR") - - -class LoadPluginsModel(BaseSettingsModel): - LoadImage: LoadImageModel = SettingsField( - default_factory=LoadImageModel, - title="Load Image") - ImportImage: LoadImageModel = SettingsField( - default_factory=LoadImageModel, - title="Import Image") - - -DEFAULT_PUBLISH_SETTINGS = { - "CollectRenderInstances": { - "ignore_render_pass_transparency": False - }, - "ExtractSequence": { - # "review_bg": [255, 255, 255] - "review_bg": [255, 255, 255, 1.0] - }, - "ValidateProjectSettings": { - "enabled": True, - "optional": True, - "active": True - }, - "ValidateMarks": { - "enabled": True, - "optional": True, - "active": True - }, - "ValidateStartFrame": { - "enabled": False, - "optional": True, - "active": True - }, - "ValidateAssetName": { - "enabled": True, - "optional": True, - "active": True - }, - "ExtractConvertToEXR": { - "enabled": False, - "replace_pngs": True, - "exr_compression": "ZIP" - } -} diff --git a/server_addon/tvpaint/server/settings/workfile_builder.py b/server_addon/tvpaint/server/settings/workfile_builder.py deleted file mode 100644 index 0799497bf9..0000000000 --- a/server_addon/tvpaint/server/settings/workfile_builder.py +++ /dev/null @@ -1,29 +0,0 @@ -from ayon_server.settings import ( - BaseSettingsModel, - SettingsField, - MultiplatformPathModel, - task_types_enum, -) - - -class CustomBuilderTemplate(BaseSettingsModel): - task_types: list[str] = SettingsField( - default_factory=list, - title="Task types", - enum_resolver=task_types_enum - ) - template_path: MultiplatformPathModel = SettingsField( - default_factory=MultiplatformPathModel - ) - - -class WorkfileBuilderPlugin(BaseSettingsModel): - _title = "Workfile Builder" - create_first_version: bool = SettingsField( - False, - title="Create first workfile" - ) - - custom_templates: list[CustomBuilderTemplate] = SettingsField( - default_factory=CustomBuilderTemplate - ) From c51f182c29d1f92a94a835d4570828977a138472 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 00:24:54 +0200 Subject: [PATCH 09/13] Houdini: Expose Extract Active View Thumbnail to settings --- .../houdini/server/settings/publish.py | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index 336de8e046..a5aef7e055 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -57,7 +57,7 @@ class ValidateWorkfilePathsModel(BaseSettingsModel): ) -class BasicValidateModel(BaseSettingsModel): +class BasicEnabledStatesModel(BaseSettingsModel): enabled: bool = SettingsField(title="Enabled") optional: bool = SettingsField(title="Optional") active: bool = SettingsField(title="Active") @@ -77,25 +77,29 @@ class PublishPluginsModel(BaseSettingsModel): default_factory=CollectLocalRenderInstancesModel, title="Collect Local Render Instances." ) - ValidateInstanceInContextHoudini: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, + ValidateInstanceInContextHoudini: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, title="Validate Instance is in same Context.", section="Validators") - ValidateMeshIsStatic: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, + ValidateMeshIsStatic: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, title="Validate Mesh is Static.") - ValidateReviewColorspace: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, + ValidateReviewColorspace: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, title="Validate Review Colorspace.") - ValidateSubsetName: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, + ValidateSubsetName: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, title="Validate Subset Name.") - ValidateUnrealStaticMeshName: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, + ValidateUnrealStaticMeshName: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, title="Validate Unreal Static Mesh Name.") ValidateWorkfilePaths: ValidateWorkfilePathsModel = SettingsField( default_factory=ValidateWorkfilePathsModel, title="Validate workfile paths settings.") + ExtractActiveViewThumbnail: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, + title="Extract Active View Thumbnail" + ) DEFAULT_HOUDINI_PUBLISH_SETTINGS = { @@ -152,5 +156,10 @@ DEFAULT_HOUDINI_PUBLISH_SETTINGS = { "$HIP", "$JOB" ] + }, + "ExtractActiveViewThumbnail": { + "enabled": True, + "optional": False, + "active": True } } From 300b9e3e3bb4eaec38d14cce54937e09b10e7b4c Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 00:27:20 +0200 Subject: [PATCH 10/13] Support optional state of plug-in --- .../plugins/publish/extract_active_view_thumbnail.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py index c4d51c0808..d4db87ec39 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py @@ -1,10 +1,13 @@ import tempfile import pyblish.api + +from ayon_core.pipeline import OptionalPyblishPluginMixin from ayon_houdini.api import lib, plugin from ayon_houdini.api.pipeline import IS_HEADLESS -class ExtractActiveViewThumbnail(plugin.HoudiniExtractorPlugin): +class ExtractActiveViewThumbnail(plugin.HoudiniExtractorPlugin, + OptionalPyblishPluginMixin): """Set instance thumbnail to a screengrab of current active viewport. This makes it so that if an instance does not have a thumbnail set yet that @@ -17,6 +20,9 @@ class ExtractActiveViewThumbnail(plugin.HoudiniExtractorPlugin): families = ["workfile"] def process(self, instance): + if not self.is_active(instance): + return + if IS_HEADLESS: self.log.debug( "Skip extraction of active view thumbnail, due to being in" From a74e1e852fd791a04837e778c11c41be0dd532ce Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 27 Jun 2024 11:20:55 +0200 Subject: [PATCH 11/13] removed flame addon --- .../flame/client/ayon_flame/__init__.py | 13 - server_addon/flame/client/ayon_flame/addon.py | 35 - .../flame/client/ayon_flame/api/__init__.py | 159 --- .../client/ayon_flame/api/batch_utils.py | 151 -- .../flame/client/ayon_flame/api/constants.py | 24 - .../flame/client/ayon_flame/api/lib.py | 1272 ----------------- .../flame/client/ayon_flame/api/menu.py | 256 ---- .../flame/client/ayon_flame/api/pipeline.py | 174 --- .../flame/client/ayon_flame/api/plugin.py | 1089 -------------- .../client/ayon_flame/api/render_utils.py | 185 --- .../ayon_flame/api/scripts/wiretap_com.py | 504 ------- .../flame/client/ayon_flame/api/utils.py | 143 -- .../flame/client/ayon_flame/api/workio.py | 37 - .../ayon_flame/hooks/pre_flame_setup.py | 239 ---- .../flame/client/ayon_flame/otio/__init__.py | 0 .../client/ayon_flame/otio/flame_export.py | 624 -------- .../flame/client/ayon_flame/otio/utils.py | 91 -- .../plugins/create/create_shot_clip.py | 307 ---- .../ayon_flame/plugins/load/load_clip.py | 274 ---- .../plugins/load/load_clip_batch.py | 180 --- .../plugins/publish/collect_test_selection.py | 64 - .../publish/collect_timeline_instances.py | 419 ------ .../plugins/publish/collect_timeline_otio.py | 67 - .../plugins/publish/extract_otio_file.py | 43 - .../publish/extract_subset_resources.py | 560 -------- .../plugins/publish/integrate_batch_group.py | 339 ----- .../openpype_seg_thumbnails_jpg.xml | 58 - .../export_preset/openpype_seg_video_h264.xml | 72 - .../modules/__init__.py | 0 .../modules/app_utils.py | 162 --- .../modules/ftrack_lib.py | 459 ------ .../modules/panel_app.py | 529 ------- .../modules/uiwidgets.py | 212 --- .../openpype_babypublisher.py | 43 - .../ayon_flame/startup/openpype_in_flame.py | 219 --- .../flame/client/ayon_flame/version.py | 3 - server_addon/flame/package.py | 10 - server_addon/flame/server/__init__.py | 13 - .../flame/server/settings/__init__.py | 10 - .../flame/server/settings/create_plugins.py | 119 -- server_addon/flame/server/settings/imageio.py | 149 -- .../flame/server/settings/loader_plugins.py | 103 -- server_addon/flame/server/settings/main.py | 33 - .../flame/server/settings/publish_plugins.py | 196 --- 44 files changed, 9639 deletions(-) delete mode 100644 server_addon/flame/client/ayon_flame/__init__.py delete mode 100644 server_addon/flame/client/ayon_flame/addon.py delete mode 100644 server_addon/flame/client/ayon_flame/api/__init__.py delete mode 100644 server_addon/flame/client/ayon_flame/api/batch_utils.py delete mode 100644 server_addon/flame/client/ayon_flame/api/constants.py delete mode 100644 server_addon/flame/client/ayon_flame/api/lib.py delete mode 100644 server_addon/flame/client/ayon_flame/api/menu.py delete mode 100644 server_addon/flame/client/ayon_flame/api/pipeline.py delete mode 100644 server_addon/flame/client/ayon_flame/api/plugin.py delete mode 100644 server_addon/flame/client/ayon_flame/api/render_utils.py delete mode 100644 server_addon/flame/client/ayon_flame/api/scripts/wiretap_com.py delete mode 100644 server_addon/flame/client/ayon_flame/api/utils.py delete mode 100644 server_addon/flame/client/ayon_flame/api/workio.py delete mode 100644 server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py delete mode 100644 server_addon/flame/client/ayon_flame/otio/__init__.py delete mode 100644 server_addon/flame/client/ayon_flame/otio/flame_export.py delete mode 100644 server_addon/flame/client/ayon_flame/otio/utils.py delete mode 100644 server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py delete mode 100644 server_addon/flame/client/ayon_flame/plugins/load/load_clip.py delete mode 100644 server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py delete mode 100644 server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py delete mode 100644 server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py delete mode 100644 server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py delete mode 100644 server_addon/flame/client/ayon_flame/plugins/publish/extract_otio_file.py delete mode 100644 server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py delete mode 100644 server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py delete mode 100644 server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml delete mode 100644 server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml delete mode 100644 server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/__init__.py delete mode 100644 server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/app_utils.py delete mode 100644 server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/ftrack_lib.py delete mode 100644 server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/panel_app.py delete mode 100644 server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/uiwidgets.py delete mode 100644 server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/openpype_babypublisher.py delete mode 100644 server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py delete mode 100644 server_addon/flame/client/ayon_flame/version.py delete mode 100644 server_addon/flame/package.py delete mode 100644 server_addon/flame/server/__init__.py delete mode 100644 server_addon/flame/server/settings/__init__.py delete mode 100644 server_addon/flame/server/settings/create_plugins.py delete mode 100644 server_addon/flame/server/settings/imageio.py delete mode 100644 server_addon/flame/server/settings/loader_plugins.py delete mode 100644 server_addon/flame/server/settings/main.py delete mode 100644 server_addon/flame/server/settings/publish_plugins.py diff --git a/server_addon/flame/client/ayon_flame/__init__.py b/server_addon/flame/client/ayon_flame/__init__.py deleted file mode 100644 index d2d89bdb01..0000000000 --- a/server_addon/flame/client/ayon_flame/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from .version import __version__ -from .addon import ( - FLAME_ADDON_ROOT, - FlameAddon, -) - - -__all__ = ( - "__version__", - - "FLAME_ADDON_ROOT", - "FlameAddon", -) diff --git a/server_addon/flame/client/ayon_flame/addon.py b/server_addon/flame/client/ayon_flame/addon.py deleted file mode 100644 index 5a96a9332e..0000000000 --- a/server_addon/flame/client/ayon_flame/addon.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -from ayon_core.addon import AYONAddon, IHostAddon - -from .version import __version__ - -FLAME_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) - - -class FlameAddon(AYONAddon, IHostAddon): - name = "flame" - version = __version__ - host_name = "flame" - - def add_implementation_envs(self, env, _app): - # Add requirements to DL_PYTHON_HOOK_PATH - env["DL_PYTHON_HOOK_PATH"] = os.path.join(FLAME_ADDON_ROOT, "startup") - env.pop("QT_AUTO_SCREEN_SCALE_FACTOR", None) - - # Set default values if are not already set via settings - defaults = { - "LOGLEVEL": "DEBUG" - } - for key, value in defaults.items(): - if not env.get(key): - env[key] = value - - def get_launch_hook_paths(self, app): - if app.host_name != self.host_name: - return [] - return [ - os.path.join(FLAME_ADDON_ROOT, "hooks") - ] - - def get_workfile_extensions(self): - return [".otoc"] diff --git a/server_addon/flame/client/ayon_flame/api/__init__.py b/server_addon/flame/client/ayon_flame/api/__init__.py deleted file mode 100644 index 8fcf0c92b0..0000000000 --- a/server_addon/flame/client/ayon_flame/api/__init__.py +++ /dev/null @@ -1,159 +0,0 @@ -""" -AYON Autodesk Flame api -""" -from .constants import ( - COLOR_MAP, - MARKER_NAME, - MARKER_COLOR, - MARKER_DURATION, - MARKER_PUBLISH_DEFAULT -) -from .lib import ( - CTX, - FlameAppFramework, - get_current_project, - get_current_sequence, - create_segment_data_marker, - get_segment_data_marker, - set_segment_data_marker, - set_publish_attribute, - get_publish_attribute, - get_sequence_segments, - maintained_segment_selection, - reset_segment_selection, - get_segment_attributes, - get_clips_in_reels, - get_reformatted_filename, - get_frame_from_filename, - get_padding_from_filename, - maintained_object_duplication, - maintained_temp_file_path, - get_clip_segment, - get_batch_group_from_desktop, - MediaInfoFile, - TimeEffectMetadata -) -from .utils import ( - setup, - get_flame_version, - get_flame_install_root -) -from .pipeline import ( - install, - uninstall, - ls, - containerise, - update_container, - remove_instance, - list_instances, - imprint, - maintained_selection -) -from .menu import ( - FlameMenuProjectConnect, - FlameMenuTimeline, - FlameMenuUniversal -) -from .plugin import ( - Creator, - PublishableClip, - ClipLoader, - OpenClipSolver -) -from .workio import ( - open_file, - save_file, - current_file, - has_unsaved_changes, - file_extensions, - work_root -) -from .render_utils import ( - export_clip, - get_preset_path_by_xml_name, - modify_preset_file -) -from .batch_utils import ( - create_batch_group, - create_batch_group_conent -) - -__all__ = [ - # constants - "COLOR_MAP", - "MARKER_NAME", - "MARKER_COLOR", - "MARKER_DURATION", - "MARKER_PUBLISH_DEFAULT", - - # lib - "CTX", - "FlameAppFramework", - "get_current_project", - "get_current_sequence", - "create_segment_data_marker", - "get_segment_data_marker", - "set_segment_data_marker", - "set_publish_attribute", - "get_publish_attribute", - "get_sequence_segments", - "maintained_segment_selection", - "reset_segment_selection", - "get_segment_attributes", - "get_clips_in_reels", - "get_reformatted_filename", - "get_frame_from_filename", - "get_padding_from_filename", - "maintained_object_duplication", - "maintained_temp_file_path", - "get_clip_segment", - "get_batch_group_from_desktop", - "MediaInfoFile", - "TimeEffectMetadata", - - # pipeline - "install", - "uninstall", - "ls", - "containerise", - "update_container", - "reload_pipeline", - "maintained_selection", - "remove_instance", - "list_instances", - "imprint", - "maintained_selection", - - # utils - "setup", - "get_flame_version", - "get_flame_install_root", - - # menu - "FlameMenuProjectConnect", - "FlameMenuTimeline", - "FlameMenuUniversal", - - # plugin - "Creator", - "PublishableClip", - "ClipLoader", - "OpenClipSolver", - - # workio - "open_file", - "save_file", - "current_file", - "has_unsaved_changes", - "file_extensions", - "work_root", - - # render utils - "export_clip", - "get_preset_path_by_xml_name", - "modify_preset_file", - - # batch utils - "create_batch_group", - "create_batch_group_conent" -] diff --git a/server_addon/flame/client/ayon_flame/api/batch_utils.py b/server_addon/flame/client/ayon_flame/api/batch_utils.py deleted file mode 100644 index 9d419a4a90..0000000000 --- a/server_addon/flame/client/ayon_flame/api/batch_utils.py +++ /dev/null @@ -1,151 +0,0 @@ -import flame - - -def create_batch_group( - name, - frame_start, - frame_duration, - update_batch_group=None, - **kwargs -): - """Create Batch Group in active project's Desktop - - Args: - name (str): name of batch group to be created - frame_start (int): start frame of batch - frame_end (int): end frame of batch - update_batch_group (PyBatch)[optional]: batch group to update - - Return: - PyBatch: active flame batch group - """ - # make sure some batch obj is present - batch_group = update_batch_group or flame.batch - - schematic_reels = kwargs.get("shematic_reels") or ['LoadedReel1'] - shelf_reels = kwargs.get("shelf_reels") or ['ShelfReel1'] - - handle_start = kwargs.get("handleStart") or 0 - handle_end = kwargs.get("handleEnd") or 0 - - frame_start -= handle_start - frame_duration += handle_start + handle_end - - if not update_batch_group: - # Create batch group with name, start_frame value, duration value, - # set of schematic reel names, set of shelf reel names - batch_group = batch_group.create_batch_group( - name, - start_frame=frame_start, - duration=frame_duration, - reels=schematic_reels, - shelf_reels=shelf_reels - ) - else: - batch_group.name = name - batch_group.start_frame = frame_start - batch_group.duration = frame_duration - - # add reels to batch group - _add_reels_to_batch_group( - batch_group, schematic_reels, shelf_reels) - - # TODO: also update write node if there is any - # TODO: also update loaders to start from correct frameStart - - if kwargs.get("switch_batch_tab"): - # use this command to switch to the batch tab - batch_group.go_to() - - return batch_group - - -def _add_reels_to_batch_group(batch_group, reels, shelf_reels): - # update or create defined reels - # helper variables - reel_names = [ - r.name.get_value() - for r in batch_group.reels - ] - shelf_reel_names = [ - r.name.get_value() - for r in batch_group.shelf_reels - ] - # add schematic reels - for _r in reels: - if _r in reel_names: - continue - batch_group.create_reel(_r) - - # add shelf reels - for _sr in shelf_reels: - if _sr in shelf_reel_names: - continue - batch_group.create_shelf_reel(_sr) - - -def create_batch_group_conent(batch_nodes, batch_links, batch_group=None): - """Creating batch group with links - - Args: - batch_nodes (list of dict): each dict is node definition - batch_links (list of dict): each dict is link definition - batch_group (PyBatch, optional): batch group. Defaults to None. - - Return: - dict: all batch nodes {name or id: PyNode} - """ - # make sure some batch obj is present - batch_group = batch_group or flame.batch - all_batch_nodes = { - b.name.get_value(): b - for b in batch_group.nodes - } - for node in batch_nodes: - # NOTE: node_props needs to be ideally OrederDict type - node_id, node_type, node_props = ( - node["id"], node["type"], node["properties"]) - - # get node name for checking if exists - node_name = node_props.pop("name", None) or node_id - - if all_batch_nodes.get(node_name): - # update existing batch node - batch_node = all_batch_nodes[node_name] - else: - # create new batch node - batch_node = batch_group.create_node(node_type) - - # set name - batch_node.name.set_value(node_name) - - # set attributes found in node props - for key, value in node_props.items(): - if not hasattr(batch_node, key): - continue - setattr(batch_node, key, value) - - # add created node for possible linking - all_batch_nodes[node_id] = batch_node - - # link nodes to each other - for link in batch_links: - _from_n, _to_n = link["from_node"], link["to_node"] - - # check if all linking nodes are available - if not all([ - all_batch_nodes.get(_from_n["id"]), - all_batch_nodes.get(_to_n["id"]) - ]): - continue - - # link nodes in defined link - batch_group.connect_nodes( - all_batch_nodes[_from_n["id"]], _from_n["connector"], - all_batch_nodes[_to_n["id"]], _to_n["connector"] - ) - - # sort batch nodes - batch_group.organize() - - return all_batch_nodes diff --git a/server_addon/flame/client/ayon_flame/api/constants.py b/server_addon/flame/client/ayon_flame/api/constants.py deleted file mode 100644 index 04191c539d..0000000000 --- a/server_addon/flame/client/ayon_flame/api/constants.py +++ /dev/null @@ -1,24 +0,0 @@ - -""" -AYON Flame api constances -""" -# AYON marker workflow variables -MARKER_NAME = "OpenPypeData" -MARKER_DURATION = 0 -MARKER_COLOR = "cyan" -MARKER_PUBLISH_DEFAULT = False - -# AYON color definitions -COLOR_MAP = { - "red": (1.0, 0.0, 0.0), - "orange": (1.0, 0.5, 0.0), - "yellow": (1.0, 1.0, 0.0), - "pink": (1.0, 0.5, 1.0), - "white": (1.0, 1.0, 1.0), - "green": (0.0, 1.0, 0.0), - "cyan": (0.0, 1.0, 1.0), - "blue": (0.0, 0.0, 1.0), - "purple": (0.5, 0.0, 0.5), - "magenta": (0.5, 0.0, 1.0), - "black": (0.0, 0.0, 0.0) -} diff --git a/server_addon/flame/client/ayon_flame/api/lib.py b/server_addon/flame/client/ayon_flame/api/lib.py deleted file mode 100644 index 8bfe6348ea..0000000000 --- a/server_addon/flame/client/ayon_flame/api/lib.py +++ /dev/null @@ -1,1272 +0,0 @@ -import sys -import os -import re -import json -import pickle -import clique -import tempfile -import traceback -import itertools -import contextlib -import xml.etree.cElementTree as cET -from copy import deepcopy, copy -from xml.etree import ElementTree as ET -from pprint import pformat - -from ayon_core.lib import Logger, run_subprocess - -from .constants import ( - MARKER_COLOR, - MARKER_DURATION, - MARKER_NAME, - COLOR_MAP, - MARKER_PUBLISH_DEFAULT -) - -log = Logger.get_logger(__name__) - -FRAME_PATTERN = re.compile(r"[\._](\d+)[\.]") - - -class CTX: - # singleton used for passing data between api modules - app_framework = None - flame_apps = [] - selection = None - - -@contextlib.contextmanager -def io_preferences_file(klass, filepath, write=False): - try: - flag = "w" if write else "r" - yield open(filepath, flag) - - except IOError as _error: - klass.log.info("Unable to work with preferences `{}`: {}".format( - filepath, _error)) - - -class FlameAppFramework(object): - # flameAppFramework class takes care of preferences - - class prefs_dict(dict): - - def __init__(self, master, name, **kwargs): - self.name = name - self.master = master - if not self.master.get(self.name): - self.master[self.name] = {} - self.master[self.name].__init__() - - def __getitem__(self, k): - return self.master[self.name].__getitem__(k) - - def __setitem__(self, k, v): - return self.master[self.name].__setitem__(k, v) - - def __delitem__(self, k): - return self.master[self.name].__delitem__(k) - - def get(self, k, default=None): - return self.master[self.name].get(k, default) - - def setdefault(self, k, default=None): - return self.master[self.name].setdefault(k, default) - - def pop(self, *args, **kwargs): - return self.master[self.name].pop(*args, **kwargs) - - def update(self, mapping=(), **kwargs): - self.master[self.name].update(mapping, **kwargs) - - def __contains__(self, k): - return self.master[self.name].__contains__(k) - - def copy(self): # don"t delegate w/ super - dict.copy() -> dict :( - return type(self)(self) - - def keys(self): - return self.master[self.name].keys() - - @classmethod - def fromkeys(cls, keys, v=None): - return cls.master[cls.name].fromkeys(keys, v) - - def __repr__(self): - return "{0}({1})".format( - type(self).__name__, self.master[self.name].__repr__()) - - def master_keys(self): - return self.master.keys() - - def __init__(self): - self.name = self.__class__.__name__ - self.bundle_name = "OpenPypeFlame" - # self.prefs scope is limited to flame project and user - self.prefs = {} - self.prefs_user = {} - self.prefs_global = {} - self.log = log - - try: - import flame - self.flame = flame - self.flame_project_name = self.flame.project.current_project.name - self.flame_user_name = flame.users.current_user.name - except Exception: - self.flame = None - self.flame_project_name = None - self.flame_user_name = None - - import socket - self.hostname = socket.gethostname() - - if sys.platform == "darwin": - self.prefs_folder = os.path.join( - os.path.expanduser("~"), - "Library", - "Caches", - "OpenPype", - self.bundle_name - ) - elif sys.platform.startswith("linux"): - self.prefs_folder = os.path.join( - os.path.expanduser("~"), - ".OpenPype", - self.bundle_name) - - self.prefs_folder = os.path.join( - self.prefs_folder, - self.hostname, - ) - - self.log.info("[{}] waking up".format(self.__class__.__name__)) - - try: - self.load_prefs() - except RuntimeError: - self.save_prefs() - - # menu auto-refresh defaults - if not self.prefs_global.get("menu_auto_refresh"): - self.prefs_global["menu_auto_refresh"] = { - "media_panel": True, - "batch": True, - "main_menu": True, - "timeline_menu": True - } - - self.apps = [] - - def get_pref_file_paths(self): - - prefix = self.prefs_folder + os.path.sep + self.bundle_name - prefs_file_path = "_".join([ - prefix, self.flame_user_name, - self.flame_project_name]) + ".prefs" - prefs_user_file_path = "_".join([ - prefix, self.flame_user_name]) + ".prefs" - prefs_global_file_path = prefix + ".prefs" - - return (prefs_file_path, prefs_user_file_path, prefs_global_file_path) - - def load_prefs(self): - - (proj_pref_path, user_pref_path, - glob_pref_path) = self.get_pref_file_paths() - - with io_preferences_file(self, proj_pref_path) as prefs_file: - self.prefs = pickle.load(prefs_file) - self.log.info( - "Project - preferences contents:\n{}".format( - pformat(self.prefs) - )) - - with io_preferences_file(self, user_pref_path) as prefs_file: - self.prefs_user = pickle.load(prefs_file) - self.log.info( - "User - preferences contents:\n{}".format( - pformat(self.prefs_user) - )) - - with io_preferences_file(self, glob_pref_path) as prefs_file: - self.prefs_global = pickle.load(prefs_file) - self.log.info( - "Global - preferences contents:\n{}".format( - pformat(self.prefs_global) - )) - - return True - - def save_prefs(self): - # make sure the preference folder is available - if not os.path.isdir(self.prefs_folder): - try: - os.makedirs(self.prefs_folder) - except Exception: - self.log.info("Unable to create folder {}".format( - self.prefs_folder)) - return False - - # get all pref file paths - (proj_pref_path, user_pref_path, - glob_pref_path) = self.get_pref_file_paths() - - with io_preferences_file(self, proj_pref_path, True) as prefs_file: - pickle.dump(self.prefs, prefs_file) - self.log.info( - "Project - preferences contents:\n{}".format( - pformat(self.prefs) - )) - - with io_preferences_file(self, user_pref_path, True) as prefs_file: - pickle.dump(self.prefs_user, prefs_file) - self.log.info( - "User - preferences contents:\n{}".format( - pformat(self.prefs_user) - )) - - with io_preferences_file(self, glob_pref_path, True) as prefs_file: - pickle.dump(self.prefs_global, prefs_file) - self.log.info( - "Global - preferences contents:\n{}".format( - pformat(self.prefs_global) - )) - - return True - - -def get_current_project(): - import flame - return flame.project.current_project - - -def get_current_sequence(selection): - import flame - - def segment_to_sequence(_segment): - track = _segment.parent - version = track.parent - return version.parent - - process_timeline = None - - if len(selection) == 1: - if isinstance(selection[0], flame.PySequence): - process_timeline = selection[0] - if isinstance(selection[0], flame.PySegment): - process_timeline = segment_to_sequence(selection[0]) - else: - for segment in selection: - if isinstance(segment, flame.PySegment): - process_timeline = segment_to_sequence(segment) - break - - return process_timeline - - -def rescan_hooks(): - import flame - try: - flame.execute_shortcut("Rescan Python Hooks") - except Exception: - pass - - -def get_metadata(project_name, _log=None): - # TODO: can be replaced by MediaInfoFile class method - from adsk.libwiretapPythonClientAPI import ( - WireTapClient, - WireTapServerHandle, - WireTapNodeHandle, - WireTapStr - ) - - class GetProjectColorPolicy(object): - def __init__(self, host_name=None, _log=None): - # Create a connection to the Backburner manager using the Wiretap - # python API. - # - self.log = _log or log - self.host_name = host_name or "localhost" - self._wiretap_client = WireTapClient() - if not self._wiretap_client.init(): - raise Exception("Could not initialize Wiretap Client") - self._server = WireTapServerHandle( - "{}:IFFFS".format(self.host_name)) - - def process(self, project_name): - policy_node_handle = WireTapNodeHandle( - self._server, - "/projects/{}/syncolor/policy".format(project_name) - ) - self.log.info(policy_node_handle) - - policy = WireTapStr() - if not policy_node_handle.getNodeTypeStr(policy): - self.log.warning( - "Could not retrieve policy of '%s': %s" % ( - policy_node_handle.getNodeId().id(), - policy_node_handle.lastError() - ) - ) - - return policy.c_str() - - policy_wiretap = GetProjectColorPolicy(_log=_log) - return policy_wiretap.process(project_name) - - -def get_segment_data_marker(segment, with_marker=None): - """ - Get openpype track item tag created by creator or loader plugin. - - Attributes: - segment (flame.PySegment): flame api object - with_marker (bool)[optional]: if true it will return also marker object - - Returns: - dict: openpype tag data - - Returns(with_marker=True): - flame.PyMarker, dict - """ - for marker in segment.markers: - comment = marker.comment.get_value() - color = marker.colour.get_value() - name = marker.name.get_value() - - if (name == MARKER_NAME) and ( - color == COLOR_MAP[MARKER_COLOR]): - if not with_marker: - return json.loads(comment) - else: - return marker, json.loads(comment) - - -def set_segment_data_marker(segment, data=None): - """ - Set openpype track item tag to input segment. - - Attributes: - segment (flame.PySegment): flame api object - - Returns: - dict: json loaded data - """ - data = data or dict() - - marker_data = get_segment_data_marker(segment, True) - - if marker_data: - # get available openpype tag if any - marker, tag_data = marker_data - # update tag data with new data - tag_data.update(data) - # update marker with tag data - marker.comment = json.dumps(tag_data) - else: - # update tag data with new data - marker = create_segment_data_marker(segment) - # add tag data to marker's comment - marker.comment = json.dumps(data) - - -def set_publish_attribute(segment, value): - """ Set Publish attribute in input Tag object - - Attribute: - segment (flame.PySegment)): flame api object - value (bool): True or False - """ - tag_data = get_segment_data_marker(segment) - tag_data["publish"] = value - - # set data to the publish attribute - set_segment_data_marker(segment, tag_data) - - -def get_publish_attribute(segment): - """ Get Publish attribute from input Tag object - - Attribute: - segment (flame.PySegment)): flame api object - - Returns: - bool: True or False - """ - tag_data = get_segment_data_marker(segment) - - if not tag_data: - set_publish_attribute(segment, MARKER_PUBLISH_DEFAULT) - return MARKER_PUBLISH_DEFAULT - - return tag_data["publish"] - - -def create_segment_data_marker(segment): - """ Create openpype marker on a segment. - - Attributes: - segment (flame.PySegment): flame api object - - Returns: - flame.PyMarker: flame api object - """ - # get duration of segment - duration = segment.record_duration.relative_frame - # calculate start frame of the new marker - start_frame = int(segment.record_in.relative_frame) + int(duration / 2) - # create marker - marker = segment.create_marker(start_frame) - # set marker name - marker.name = MARKER_NAME - # set duration - marker.duration = MARKER_DURATION - # set colour - marker.colour = COLOR_MAP[MARKER_COLOR] # Red - - return marker - - -def get_sequence_segments(sequence, selected=False): - segments = [] - # loop versions in sequence - for ver in sequence.versions: - # loop track in versions - for track in ver.tracks: - # ignore all empty tracks and hidden too - if len(track.segments) == 0 and track.hidden: - continue - # loop all segment in remaining tracks - for segment in track.segments: - if segment.name.get_value() == "": - continue - if segment.hidden.get_value() is True: - continue - if ( - selected is True - and segment.selected.get_value() is not True - ): - continue - # add it to original selection - segments.append(segment) - return segments - - -@contextlib.contextmanager -def maintained_segment_selection(sequence): - """Maintain selection during context - - Attributes: - sequence (flame.PySequence): python api object - - Yield: - list of flame.PySegment - - Example: - >>> with maintained_segment_selection(sequence) as selected_segments: - ... for segment in selected_segments: - ... segment.selected = False - >>> print(segment.selected) - True - """ - selected_segments = get_sequence_segments(sequence, True) - try: - # do the operation on selected segments - yield selected_segments - finally: - # reset all selected clips - reset_segment_selection(sequence) - # select only original selection of segments - for segment in selected_segments: - segment.selected = True - - -def reset_segment_selection(sequence): - """Deselect all selected nodes - """ - for ver in sequence.versions: - for track in ver.tracks: - if len(track.segments) == 0 and track.hidden: - continue - for segment in track.segments: - segment.selected = False - - -def _get_shot_tokens_values(clip, tokens): - old_value = None - output = {} - - if not clip.shot_name: - return output - - old_value = clip.shot_name.get_value() - - for token in tokens: - clip.shot_name.set_value(token) - _key = str(re.sub("[<>]", "", token)).replace(" ", "_") - - try: - output[_key] = int(clip.shot_name.get_value()) - except ValueError: - output[_key] = clip.shot_name.get_value() - - clip.shot_name.set_value(old_value) - - return output - - -def get_segment_attributes(segment): - if segment.name.get_value() == "": - return None - - # Add timeline segment to tree - clip_data = { - "shot_name": segment.shot_name.get_value(), - "segment_name": segment.name.get_value(), - "segment_comment": segment.comment.get_value(), - "tape_name": segment.tape_name, - "source_name": segment.source_name, - "fpath": segment.file_path, - "PySegment": segment - } - - # head and tail with forward compatibility - if segment.head: - # `infinite` can be also returned - if isinstance(segment.head, str): - clip_data["segment_head"] = 0 - else: - clip_data["segment_head"] = int(segment.head) - if segment.tail: - # `infinite` can be also returned - if isinstance(segment.tail, str): - clip_data["segment_tail"] = 0 - else: - clip_data["segment_tail"] = int(segment.tail) - - # add all available shot tokens - shot_tokens = _get_shot_tokens_values(segment, [ - "", "", "", "", "", - "", "" - ]) - clip_data.update(shot_tokens) - - # populate shot source metadata - segment_attrs = [ - "record_duration", "record_in", "record_out", - "source_duration", "source_in", "source_out" - ] - segment_attrs_data = {} - for attr_name in segment_attrs: - if not hasattr(segment, attr_name): - continue - attr = getattr(segment, attr_name) - segment_attrs_data[attr_name] = str(attr).replace("+", ":") - - if attr_name in ["record_in", "record_out"]: - clip_data[attr_name] = attr.relative_frame - else: - clip_data[attr_name] = attr.frame - - clip_data["segment_timecodes"] = segment_attrs_data - - return clip_data - - -def get_clips_in_reels(project): - output_clips = [] - project_desktop = project.current_workspace.desktop - - for reel_group in project_desktop.reel_groups: - for reel in reel_group.reels: - for clip in reel.clips: - clip_data = { - "PyClip": clip, - "fps": float(str(clip.frame_rate)[:-4]) - } - - attrs = [ - "name", "width", "height", - "ratio", "sample_rate", "bit_depth" - ] - - for attr in attrs: - val = getattr(clip, attr) - clip_data[attr] = val - - version = clip.versions[-1] - track = version.tracks[-1] - for segment in track.segments: - segment_data = get_segment_attributes(segment) - clip_data.update(segment_data) - - output_clips.append(clip_data) - - return output_clips - - -def get_reformatted_filename(filename, padded=True): - """ - Return fixed python expression path - - Args: - filename (str): file name - - Returns: - type: string with reformatted path - - Example: - get_reformatted_filename("plate.1001.exr") > plate.%04d.exr - - """ - found = FRAME_PATTERN.search(filename) - - if not found: - log.info("File name is not sequence: {}".format(filename)) - return filename - - padding = get_padding_from_filename(filename) - - replacement = "%0{}d".format(padding) if padded else "%d" - start_idx, end_idx = found.span(1) - - return replacement.join( - [filename[:start_idx], filename[end_idx:]] - ) - - -def get_padding_from_filename(filename): - """ - Return padding number from Flame path style - - Args: - filename (str): file name - - Returns: - int: padding number - - Example: - get_padding_from_filename("plate.0001.exr") > 4 - - """ - found = get_frame_from_filename(filename) - - return len(found) if found else None - - -def get_frame_from_filename(filename): - """ - Return sequence number from Flame path style - - Args: - filename (str): file name - - Returns: - int: sequence frame number - - Example: - def get_frame_from_filename(path): - ("plate.0001.exr") > 0001 - - """ - - found = re.findall(FRAME_PATTERN, filename) - - return found.pop() if found else None - - -@contextlib.contextmanager -def maintained_object_duplication(item): - """Maintain input item duplication - - Attributes: - item (any flame.PyObject): python api object - - Yield: - duplicate input PyObject type - """ - import flame - # Duplicate the clip to avoid modifying the original clip - duplicate = flame.duplicate(item) - - try: - # do the operation on selected segments - yield duplicate - finally: - # delete the item at the end - flame.delete(duplicate) - - -@contextlib.contextmanager -def maintained_temp_file_path(suffix=None): - _suffix = suffix or "" - - try: - # Store dumped json to temporary file - temporary_file = tempfile.mktemp( - suffix=_suffix, prefix="flame_maintained_") - yield temporary_file.replace("\\", "/") - - except IOError as _error: - raise IOError( - "Not able to create temp json file: {}".format(_error)) - - finally: - # Remove the temporary json - os.remove(temporary_file) - - -def get_clip_segment(flame_clip): - name = flame_clip.name.get_value() - version = flame_clip.versions[0] - track = version.tracks[0] - segments = track.segments - - if len(segments) < 1: - raise ValueError("Clip `{}` has no segments!".format(name)) - - if len(segments) > 1: - raise ValueError("Clip `{}` has too many segments!".format(name)) - - return segments[0] - - -def get_batch_group_from_desktop(name): - project = get_current_project() - project_desktop = project.current_workspace.desktop - - for bgroup in project_desktop.batch_groups: - if bgroup.name.get_value() in name: - return bgroup - - -class MediaInfoFile(object): - """Class to get media info file clip data - - Raises: - IOError: MEDIA_SCRIPT_PATH path doesn't exists - TypeError: Not able to generate clip xml data file - ET.ParseError: Missing clip in xml clip data - IOError: Not able to save xml clip data to file - - Attributes: - str: `MEDIA_SCRIPT_PATH` path to flame binary - logging.Logger: `log` logger - - TODO: add method for getting metadata to dict - """ - MEDIA_SCRIPT_PATH = "/opt/Autodesk/mio/current/dl_get_media_info" - - log = log - - _clip_data = None - _start_frame = None - _fps = None - _drop_mode = None - _file_pattern = None - - def __init__(self, path, logger=None): - - # replace log if any - if logger: - self.log = logger - - # test if `dl_get_media_info` path exists - self._validate_media_script_path() - - # derivate other feed variables - feed_basename = os.path.basename(path) - feed_dir = os.path.dirname(path) - feed_ext = os.path.splitext(feed_basename)[1][1:].lower() - - with maintained_temp_file_path(".clip") as tmp_path: - self.log.info("Temp File: {}".format(tmp_path)) - self._generate_media_info_file(tmp_path, feed_ext, feed_dir) - - # get collection containing feed_basename from path - self.file_pattern = self._get_collection( - feed_basename, feed_dir, feed_ext) - - if ( - not self.file_pattern - and os.path.exists(os.path.join(feed_dir, feed_basename)) - ): - self.file_pattern = feed_basename - - # get clip data and make them single if there is multiple - # clips data - xml_data = self._make_single_clip_media_info( - tmp_path, feed_basename, self.file_pattern) - self.log.debug("xml_data: {}".format(xml_data)) - self.log.debug("type: {}".format(type(xml_data))) - - # get all time related data and assign them - self._get_time_info_from_origin(xml_data) - self.log.debug("start_frame: {}".format(self.start_frame)) - self.log.debug("fps: {}".format(self.fps)) - self.log.debug("drop frame: {}".format(self.drop_mode)) - self.clip_data = xml_data - - def _get_collection(self, feed_basename, feed_dir, feed_ext): - """ Get collection string - - Args: - feed_basename (str): file base name - feed_dir (str): file's directory - feed_ext (str): file extension - - Raises: - AttributeError: feed_ext is not matching feed_basename - - Returns: - str: collection basename with range of sequence - """ - partialname = self._separate_file_head(feed_basename, feed_ext) - self.log.debug("__ partialname: {}".format(partialname)) - - # make sure partial input basename is having correct extensoon - if not partialname: - raise AttributeError( - "Wrong input attributes. Basename - {}, Ext - {}".format( - feed_basename, feed_ext - ) - ) - - # get all related files - files = [ - f for f in os.listdir(feed_dir) - if partialname == self._separate_file_head(f, feed_ext) - ] - - # ignore reminders as we dont need them - collections = clique.assemble(files)[0] - - # in case no collection found return None - # it is probably just single file - if not collections: - return - - # we expect only one collection - collection = collections[0] - - self.log.debug("__ collection: {}".format(collection)) - - if collection.is_contiguous(): - return self._format_collection(collection) - - # add `[` in front to make sure it want capture - # shot name with the same number - number_from_path = self._separate_number(feed_basename, feed_ext) - search_number_pattern = "[" + number_from_path - # convert to multiple collections - _continues_colls = collection.separate() - for _coll in _continues_colls: - coll_to_text = self._format_collection( - _coll, len(number_from_path)) - self.log.debug("__ coll_to_text: {}".format(coll_to_text)) - if search_number_pattern in coll_to_text: - return coll_to_text - - @staticmethod - def _format_collection(collection, padding=None): - padding = padding or collection.padding - # if no holes then return collection - head = collection.format("{head}") - tail = collection.format("{tail}") - range_template = "[{{:0{0}d}}-{{:0{0}d}}]".format( - padding) - ranges = range_template.format( - min(collection.indexes), - max(collection.indexes) - ) - # if no holes then return collection - return "{}{}{}".format(head, ranges, tail) - - def _separate_file_head(self, basename, extension): - """ Get only head with out sequence and extension - - Args: - basename (str): file base name - extension (str): file extension - - Returns: - str: file head - """ - # in case sequence file - found = re.findall( - r"(.*)[._][\d]*(?=.{})".format(extension), - basename, - ) - if found: - return found.pop() - - # in case single file - name, ext = os.path.splitext(basename) - - if extension == ext[1:]: - return name - - def _separate_number(self, basename, extension): - """ Get only sequence number as string - - Args: - basename (str): file base name - extension (str): file extension - - Returns: - str: number with padding - """ - # in case sequence file - found = re.findall( - r"[._]([\d]*)(?=.{})".format(extension), - basename, - ) - if found: - return found.pop() - - @property - def clip_data(self): - """Clip's xml clip data - - Returns: - xml.etree.ElementTree: xml data - """ - return self._clip_data - - @clip_data.setter - def clip_data(self, data): - self._clip_data = data - - @property - def start_frame(self): - """ Clip's starting frame found in timecode - - Returns: - int: number of frames - """ - return self._start_frame - - @start_frame.setter - def start_frame(self, number): - self._start_frame = int(number) - - @property - def fps(self): - """ Clip's frame rate - - Returns: - float: frame rate - """ - return self._fps - - @fps.setter - def fps(self, fl_number): - self._fps = float(fl_number) - - @property - def drop_mode(self): - """ Clip's drop frame mode - - Returns: - str: drop frame flag - """ - return self._drop_mode - - @drop_mode.setter - def drop_mode(self, text): - self._drop_mode = str(text) - - @property - def file_pattern(self): - """Clips file pattern. - - Returns: - str: file pattern. ex. file.[1-2].exr - """ - return self._file_pattern - - @file_pattern.setter - def file_pattern(self, fpattern): - self._file_pattern = fpattern - - def _validate_media_script_path(self): - if not os.path.isfile(self.MEDIA_SCRIPT_PATH): - raise IOError("Media Script does not exist: `{}`".format( - self.MEDIA_SCRIPT_PATH)) - - def _generate_media_info_file(self, fpath, feed_ext, feed_dir): - """ Generate media info xml .clip file - - Args: - fpath (str): .clip file path - feed_ext (str): file extension to be filtered - feed_dir (str): look up directory - - Raises: - TypeError: Type error if it fails - """ - # Create cmd arguments for gettig xml file info file - cmd_args = [ - self.MEDIA_SCRIPT_PATH, - "-e", feed_ext, - "-o", fpath, - feed_dir - ] - - try: - # execute creation of clip xml template data - run_subprocess(cmd_args) - except TypeError as error: - raise TypeError( - "Error creating `{}` due: {}".format(fpath, error)) - - def _make_single_clip_media_info(self, fpath, feed_basename, path_pattern): - """ Separate only relative clip object form .clip file - - Args: - fpath (str): clip file path - feed_basename (str): search basename - path_pattern (str): search file pattern (file.[1-2].exr) - - Raises: - ET.ParseError: if nothing found - - Returns: - ET.Element: xml element data of matching clip - """ - with open(fpath) as f: - lines = f.readlines() - _added_root = itertools.chain( - "", deepcopy(lines)[1:], "") - new_root = ET.fromstringlist(_added_root) - - # find the clip which is matching to my input name - xml_clips = new_root.findall("clip") - matching_clip = None - for xml_clip in xml_clips: - clip_name = xml_clip.find("name").text - self.log.debug("__ clip_name: `{}`".format(clip_name)) - if clip_name not in feed_basename: - continue - - # test path pattern - for out_track in xml_clip.iter("track"): - for out_feed in out_track.iter("feed"): - for span in out_feed.iter("span"): - # start frame - span_path = span.find("path") - self.log.debug( - "__ span_path.text: {}, path_pattern: {}".format( - span_path.text, path_pattern - ) - ) - if path_pattern in span_path.text: - matching_clip = xml_clip - - if matching_clip is None: - # return warning there is missing clip - raise ET.ParseError( - "Missing clip in `{}`. Available clips {}".format( - feed_basename, [ - xml_clip.find("name").text - for xml_clip in xml_clips - ] - )) - - return matching_clip - - def _get_time_info_from_origin(self, xml_data): - """Set time info to class attributes - - Args: - xml_data (ET.Element): clip data - """ - try: - for out_track in xml_data.iter("track"): - for out_feed in out_track.iter("feed"): - # start frame - out_feed_nb_ticks_obj = out_feed.find( - "startTimecode/nbTicks") - self.start_frame = out_feed_nb_ticks_obj.text - - # fps - out_feed_fps_obj = out_feed.find( - "startTimecode/rate") - self.fps = out_feed_fps_obj.text - - # drop frame mode - out_feed_drop_mode_obj = out_feed.find( - "startTimecode/dropMode") - self.drop_mode = out_feed_drop_mode_obj.text - break - except Exception as msg: - self.log.warning(msg) - - @staticmethod - def write_clip_data_to_file(fpath, xml_element_data): - """ Write xml element of clip data to file - - Args: - fpath (string): file path - xml_element_data (xml.etree.ElementTree.Element): xml data - - Raises: - IOError: If data could not be written to file - """ - try: - # save it as new file - tree = cET.ElementTree(xml_element_data) - tree.write( - fpath, xml_declaration=True, - method="xml", encoding="UTF-8" - ) - except IOError as error: - raise IOError( - "Not able to write data to file: {}".format(error)) - - -class TimeEffectMetadata(object): - log = log - _data = {} - _retime_modes = { - 0: "speed", - 1: "timewarp", - 2: "duration" - } - - def __init__(self, segment, logger=None): - if logger: - self.log = logger - - self._data = self._get_metadata(segment) - - @property - def data(self): - """ Returns timewarp effect data - - Returns: - dict: retime data - """ - return self._data - - def _get_metadata(self, segment): - effects = segment.effects or [] - for effect in effects: - if effect.type == "Timewarp": - with maintained_temp_file_path(".timewarp_node") as tmp_path: - self.log.info("Temp File: {}".format(tmp_path)) - effect.save_setup(tmp_path) - return self._get_attributes_from_xml(tmp_path) - - return {} - - def _get_attributes_from_xml(self, tmp_path): - with open(tmp_path, "r") as tw_setup_file: - tw_setup_string = tw_setup_file.read() - tw_setup_file.close() - - tw_setup_xml = ET.fromstring(tw_setup_string) - tw_setup = self._dictify(tw_setup_xml) - # pprint(tw_setup) - try: - tw_setup_state = tw_setup["Setup"]["State"][0] - mode = int( - tw_setup_state["TW_RetimerMode"][0]["_text"] - ) - r_data = { - "type": self._retime_modes[mode], - "effectStart": int( - tw_setup["Setup"]["Base"][0]["Range"][0]["Start"]), - "effectEnd": int( - tw_setup["Setup"]["Base"][0]["Range"][0]["End"]) - } - - if mode == 0: # speed - r_data[self._retime_modes[mode]] = float( - tw_setup_state["TW_Speed"] - [0]["Channel"][0]["Value"][0]["_text"] - ) / 100 - elif mode == 1: # timewarp - print("timing") - r_data[self._retime_modes[mode]] = self._get_anim_keys( - tw_setup_state["TW_Timing"] - ) - elif mode == 2: # duration - r_data[self._retime_modes[mode]] = { - "start": { - "source": int( - tw_setup_state["TW_DurationTiming"][0]["Channel"] - [0]["KFrames"][0]["Key"][0]["Value"][0]["_text"] - ), - "timeline": int( - tw_setup_state["TW_DurationTiming"][0]["Channel"] - [0]["KFrames"][0]["Key"][0]["Frame"][0]["_text"] - ) - }, - "end": { - "source": int( - tw_setup_state["TW_DurationTiming"][0]["Channel"] - [0]["KFrames"][0]["Key"][1]["Value"][0]["_text"] - ), - "timeline": int( - tw_setup_state["TW_DurationTiming"][0]["Channel"] - [0]["KFrames"][0]["Key"][1]["Frame"][0]["_text"] - ) - } - } - except Exception: - lines = traceback.format_exception(*sys.exc_info()) - self.log.error("\n".join(lines)) - return - - return r_data - - def _get_anim_keys(self, setup_cat, index=None): - return_data = { - "extrapolation": ( - setup_cat[0]["Channel"][0]["Extrap"][0]["_text"] - ), - "animKeys": [] - } - for key in setup_cat[0]["Channel"][0]["KFrames"][0]["Key"]: - if index and int(key["Index"]) != index: - continue - key_data = { - "source": float(key["Value"][0]["_text"]), - "timeline": float(key["Frame"][0]["_text"]), - "index": int(key["Index"]), - "curveMode": key["CurveMode"][0]["_text"], - "curveOrder": key["CurveOrder"][0]["_text"] - } - if key.get("TangentMode"): - key_data["tangentMode"] = key["TangentMode"][0]["_text"] - - return_data["animKeys"].append(key_data) - - return return_data - - def _dictify(self, xml_, root=True): - """ Convert xml object to dictionary - - Args: - xml_ (xml.etree.ElementTree.Element): xml data - root (bool, optional): is root available. Defaults to True. - - Returns: - dict: dictionarized xml - """ - - if root: - return {xml_.tag: self._dictify(xml_, False)} - - d = copy(xml_.attrib) - if xml_.text: - d["_text"] = xml_.text - - for x in xml_.findall("./*"): - if x.tag not in d: - d[x.tag] = [] - d[x.tag].append(self._dictify(x, False)) - return d diff --git a/server_addon/flame/client/ayon_flame/api/menu.py b/server_addon/flame/client/ayon_flame/api/menu.py deleted file mode 100644 index 83d75d18d3..0000000000 --- a/server_addon/flame/client/ayon_flame/api/menu.py +++ /dev/null @@ -1,256 +0,0 @@ -from copy import deepcopy -from pprint import pformat - -from qtpy import QtWidgets - -from ayon_core.pipeline import get_current_project_name -from ayon_core.tools.utils.host_tools import HostToolsHelper - -menu_group_name = 'OpenPype' - -default_flame_export_presets = { - 'Publish': { - 'PresetVisibility': 2, - 'PresetType': 0, - 'PresetFile': 'OpenEXR/OpenEXR (16-bit fp PIZ).xml' - }, - 'Preview': { - 'PresetVisibility': 3, - 'PresetType': 2, - 'PresetFile': 'Generate Preview.xml' - }, - 'Thumbnail': { - 'PresetVisibility': 3, - 'PresetType': 0, - 'PresetFile': 'Generate Thumbnail.xml' - } -} - - -def callback_selection(selection, function): - import ayon_flame.api as opfapi - opfapi.CTX.selection = selection - print("Hook Selection: \n\t{}".format( - pformat({ - index: (type(item), item.name) - for index, item in enumerate(opfapi.CTX.selection)}) - )) - function() - - -class _FlameMenuApp(object): - def __init__(self, framework): - self.name = self.__class__.__name__ - self.framework = framework - self.log = framework.log - self.menu_group_name = menu_group_name - self.dynamic_menu_data = {} - - # flame module is only available when a - # flame project is loaded and initialized - self.flame = None - try: - import flame - self.flame = flame - except ImportError: - self.flame = None - - self.flame_project_name = flame.project.current_project.name - self.prefs = self.framework.prefs_dict(self.framework.prefs, self.name) - self.prefs_user = self.framework.prefs_dict( - self.framework.prefs_user, self.name) - self.prefs_global = self.framework.prefs_dict( - self.framework.prefs_global, self.name) - - self.mbox = QtWidgets.QMessageBox() - project_name = get_current_project_name() - self.menu = { - "actions": [{ - 'name': project_name or "project", - 'isEnabled': False - }], - "name": self.menu_group_name - } - self.tools_helper = HostToolsHelper() - - def __getattr__(self, name): - def method(*args, **kwargs): - print('calling %s' % name) - return method - - def rescan(self, *args, **kwargs): - if not self.flame: - try: - import flame - self.flame = flame - except ImportError: - self.flame = None - - if self.flame: - self.flame.execute_shortcut('Rescan Python Hooks') - self.log.info('Rescan Python Hooks') - - -class FlameMenuProjectConnect(_FlameMenuApp): - - # flameMenuProjectconnect app takes care of the preferences dialog as well - - def __init__(self, framework): - _FlameMenuApp.__init__(self, framework) - - def __getattr__(self, name): - def method(*args, **kwargs): - project = self.dynamic_menu_data.get(name) - if project: - self.link_project(project) - return method - - def build_menu(self): - if not self.flame: - return [] - - menu = deepcopy(self.menu) - - menu['actions'].append({ - "name": "Workfiles...", - "execute": lambda x: self.tools_helper.show_workfiles() - }) - menu['actions'].append({ - "name": "Load...", - "execute": lambda x: self.tools_helper.show_loader() - }) - menu['actions'].append({ - "name": "Manage...", - "execute": lambda x: self.tools_helper.show_scene_inventory() - }) - menu['actions'].append({ - "name": "Library...", - "execute": lambda x: self.tools_helper.show_library_loader() - }) - return menu - - def refresh(self, *args, **kwargs): - self.rescan() - - def rescan(self, *args, **kwargs): - if not self.flame: - try: - import flame - self.flame = flame - except ImportError: - self.flame = None - - if self.flame: - self.flame.execute_shortcut('Rescan Python Hooks') - self.log.info('Rescan Python Hooks') - - -class FlameMenuTimeline(_FlameMenuApp): - - # flameMenuProjectconnect app takes care of the preferences dialog as well - - def __init__(self, framework): - _FlameMenuApp.__init__(self, framework) - - def __getattr__(self, name): - def method(*args, **kwargs): - project = self.dynamic_menu_data.get(name) - if project: - self.link_project(project) - return method - - def build_menu(self): - if not self.flame: - return [] - - menu = deepcopy(self.menu) - - menu['actions'].append({ - "name": "Create...", - "execute": lambda x: callback_selection( - x, self.tools_helper.show_creator) - }) - menu['actions'].append({ - "name": "Publish...", - "execute": lambda x: callback_selection( - x, self.tools_helper.show_publish) - }) - menu['actions'].append({ - "name": "Load...", - "execute": lambda x: self.tools_helper.show_loader() - }) - menu['actions'].append({ - "name": "Manage...", - "execute": lambda x: self.tools_helper.show_scene_inventory() - }) - menu['actions'].append({ - "name": "Library...", - "execute": lambda x: self.tools_helper.show_library_loader() - }) - return menu - - def refresh(self, *args, **kwargs): - self.rescan() - - def rescan(self, *args, **kwargs): - if not self.flame: - try: - import flame - self.flame = flame - except ImportError: - self.flame = None - - if self.flame: - self.flame.execute_shortcut('Rescan Python Hooks') - self.log.info('Rescan Python Hooks') - - -class FlameMenuUniversal(_FlameMenuApp): - - # flameMenuProjectconnect app takes care of the preferences dialog as well - - def __init__(self, framework): - _FlameMenuApp.__init__(self, framework) - - def __getattr__(self, name): - def method(*args, **kwargs): - project = self.dynamic_menu_data.get(name) - if project: - self.link_project(project) - return method - - def build_menu(self): - if not self.flame: - return [] - - menu = deepcopy(self.menu) - - menu['actions'].append({ - "name": "Load...", - "execute": lambda x: callback_selection( - x, self.tools_helper.show_loader) - }) - menu['actions'].append({ - "name": "Manage...", - "execute": lambda x: self.tools_helper.show_scene_inventory() - }) - menu['actions'].append({ - "name": "Library...", - "execute": lambda x: self.tools_helper.show_library_loader() - }) - return menu - - def refresh(self, *args, **kwargs): - self.rescan() - - def rescan(self, *args, **kwargs): - if not self.flame: - try: - import flame - self.flame = flame - except ImportError: - self.flame = None - - if self.flame: - self.flame.execute_shortcut('Rescan Python Hooks') - self.log.info('Rescan Python Hooks') diff --git a/server_addon/flame/client/ayon_flame/api/pipeline.py b/server_addon/flame/client/ayon_flame/api/pipeline.py deleted file mode 100644 index 121b925920..0000000000 --- a/server_addon/flame/client/ayon_flame/api/pipeline.py +++ /dev/null @@ -1,174 +0,0 @@ -""" -Basic avalon integration -""" -import os -import contextlib -from pyblish import api as pyblish - -from ayon_core.lib import Logger -from ayon_core.pipeline import ( - register_loader_plugin_path, - register_creator_plugin_path, - deregister_loader_plugin_path, - deregister_creator_plugin_path, - AVALON_CONTAINER_ID, -) -from ayon_flame import FLAME_ADDON_ROOT -from .lib import ( - set_segment_data_marker, - set_publish_attribute, - maintained_segment_selection, - get_current_sequence, - reset_segment_selection -) - -PLUGINS_DIR = os.path.join(FLAME_ADDON_ROOT, "plugins") -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "create") - -AVALON_CONTAINERS = "AVALON_CONTAINERS" - -log = Logger.get_logger(__name__) - - -def install(): - pyblish.register_host("flame") - pyblish.register_plugin_path(PUBLISH_PATH) - register_loader_plugin_path(LOAD_PATH) - register_creator_plugin_path(CREATE_PATH) - log.info("AYON Flame plug-ins registered ...") - - # register callback for switching publishable - pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) - - log.info("AYON Flame host installed ...") - - -def uninstall(): - pyblish.deregister_host("flame") - - log.info("Deregistering Flame plug-ins..") - pyblish.deregister_plugin_path(PUBLISH_PATH) - deregister_loader_plugin_path(LOAD_PATH) - deregister_creator_plugin_path(CREATE_PATH) - - # register callback for switching publishable - pyblish.deregister_callback("instanceToggled", on_pyblish_instance_toggled) - - log.info("AYON Flame host uninstalled ...") - - -def containerise(flame_clip_segment, - name, - namespace, - context, - loader=None, - data=None): - - data_imprint = { - "schema": "openpype:container-2.0", - "id": AVALON_CONTAINER_ID, - "name": str(name), - "namespace": str(namespace), - "loader": str(loader), - "representation": context["representation"]["id"], - } - - if data: - for k, v in data.items(): - data_imprint[k] = v - - log.debug("_ data_imprint: {}".format(data_imprint)) - - set_segment_data_marker(flame_clip_segment, data_imprint) - - return True - - -def ls(): - """List available containers. - """ - return [] - - -def parse_container(tl_segment, validate=True): - """Return container data from timeline_item's openpype tag. - """ - # TODO: parse_container - pass - - -def update_container(tl_segment, data=None): - """Update container data to input timeline_item's openpype tag. - """ - # TODO: update_container - pass - - -def on_pyblish_instance_toggled(instance, old_value, new_value): - """Toggle node passthrough states on instance toggles.""" - - log.info("instance toggle: {}, old_value: {}, new_value:{} ".format( - instance, old_value, new_value)) - - # # Whether instances should be passthrough based on new value - # timeline_item = instance.data["item"] - # set_publish_attribute(timeline_item, new_value) - - -def remove_instance(instance): - """Remove instance marker from track item.""" - # TODO: remove_instance - pass - - -def list_instances(): - """List all created instances from current workfile.""" - # TODO: list_instances - pass - - -def imprint(segment, data=None): - """ - Adding openpype data to Flame timeline segment. - - Also including publish attribute into tag. - - Arguments: - segment (flame.PySegment)): flame api object - data (dict): Any data which needst to be imprinted - - Examples: - data = { - 'asset': 'sq020sh0280', - 'productType': 'render', - 'productName': 'productMain' - } - """ - data = data or {} - - set_segment_data_marker(segment, data) - - # add publish attribute - set_publish_attribute(segment, True) - - -@contextlib.contextmanager -def maintained_selection(): - import flame - from .lib import CTX - - # check if segment is selected - if isinstance(CTX.selection[0], flame.PySegment): - sequence = get_current_sequence(CTX.selection) - - try: - with maintained_segment_selection(sequence) as selected: - yield - finally: - # reset all selected clips - reset_segment_selection(sequence) - # select only original selection of segments - for segment in selected: - segment.selected = True diff --git a/server_addon/flame/client/ayon_flame/api/plugin.py b/server_addon/flame/client/ayon_flame/api/plugin.py deleted file mode 100644 index e656f33052..0000000000 --- a/server_addon/flame/client/ayon_flame/api/plugin.py +++ /dev/null @@ -1,1089 +0,0 @@ -import os -import re -import shutil -from copy import deepcopy -from xml.etree import ElementTree as ET - -import qargparse -from qtpy import QtCore, QtWidgets - -from ayon_core import style -from ayon_core.lib import Logger, StringTemplate -from ayon_core.pipeline import LegacyCreator, LoaderPlugin -from ayon_core.pipeline.colorspace import get_remapped_colorspace_to_native -from ayon_core.settings import get_current_project_settings - -from . import constants -from . import lib as flib -from . import pipeline as fpipeline - -log = Logger.get_logger(__name__) - - -class CreatorWidget(QtWidgets.QDialog): - - # output items - items = dict() - _results_back = None - - def __init__(self, name, info, ui_inputs, parent=None): - super(CreatorWidget, self).__init__(parent) - - self.setObjectName(name) - - self.setWindowFlags( - QtCore.Qt.Window - | QtCore.Qt.CustomizeWindowHint - | QtCore.Qt.WindowTitleHint - | QtCore.Qt.WindowCloseButtonHint - | QtCore.Qt.WindowStaysOnTopHint - ) - self.setWindowTitle(name or "AYON Creator Input") - self.resize(500, 700) - - # Where inputs and labels are set - self.content_widget = [QtWidgets.QWidget(self)] - top_layout = QtWidgets.QFormLayout(self.content_widget[0]) - top_layout.setObjectName("ContentLayout") - top_layout.addWidget(Spacer(5, self)) - - # first add widget tag line - top_layout.addWidget(QtWidgets.QLabel(info)) - - # main dynamic layout - self.scroll_area = QtWidgets.QScrollArea(self, widgetResizable=True) - self.scroll_area.setVerticalScrollBarPolicy( - QtCore.Qt.ScrollBarAsNeeded) - self.scroll_area.setVerticalScrollBarPolicy( - QtCore.Qt.ScrollBarAlwaysOn) - self.scroll_area.setHorizontalScrollBarPolicy( - QtCore.Qt.ScrollBarAlwaysOff) - self.scroll_area.setWidgetResizable(True) - - self.content_widget.append(self.scroll_area) - - scroll_widget = QtWidgets.QWidget(self) - in_scroll_area = QtWidgets.QVBoxLayout(scroll_widget) - self.content_layout = [in_scroll_area] - - # add preset data into input widget layout - self.items = self.populate_widgets(ui_inputs) - self.scroll_area.setWidget(scroll_widget) - - # Confirmation buttons - btns_widget = QtWidgets.QWidget(self) - btns_layout = QtWidgets.QHBoxLayout(btns_widget) - - cancel_btn = QtWidgets.QPushButton("Cancel") - btns_layout.addWidget(cancel_btn) - - ok_btn = QtWidgets.QPushButton("Ok") - btns_layout.addWidget(ok_btn) - - # Main layout of the dialog - main_layout = QtWidgets.QVBoxLayout(self) - main_layout.setContentsMargins(10, 10, 10, 10) - main_layout.setSpacing(0) - - # adding content widget - for w in self.content_widget: - main_layout.addWidget(w) - - main_layout.addWidget(btns_widget) - - ok_btn.clicked.connect(self._on_ok_clicked) - cancel_btn.clicked.connect(self._on_cancel_clicked) - - self.setStyleSheet(style.load_stylesheet()) - - @classmethod - def set_results_back(cls, value): - cls._results_back = value - - @classmethod - def get_results_back(cls): - return cls._results_back - - def _on_ok_clicked(self): - log.debug("ok is clicked: {}".format(self.items)) - results_back = self._values(self.items) - self.set_results_back(results_back) - self.close() - - def _on_cancel_clicked(self): - self.set_results_back(None) - self.close() - - def showEvent(self, event): - self.set_results_back(None) - super(CreatorWidget, self).showEvent(event) - - def _values(self, data, new_data=None): - new_data = new_data or dict() - for k, v in data.items(): - new_data[k] = { - "target": None, - "value": None - } - if v["type"] == "dict": - new_data[k]["target"] = v["target"] - new_data[k]["value"] = self._values(v["value"]) - if v["type"] == "section": - new_data.pop(k) - new_data = self._values(v["value"], new_data) - elif getattr(v["value"], "currentText", None): - new_data[k]["target"] = v["target"] - new_data[k]["value"] = v["value"].currentText() - elif getattr(v["value"], "isChecked", None): - new_data[k]["target"] = v["target"] - new_data[k]["value"] = v["value"].isChecked() - elif getattr(v["value"], "value", None): - new_data[k]["target"] = v["target"] - new_data[k]["value"] = v["value"].value() - elif getattr(v["value"], "text", None): - new_data[k]["target"] = v["target"] - new_data[k]["value"] = v["value"].text() - - return new_data - - def camel_case_split(self, text): - matches = re.finditer( - '.+?(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|$)', text) - return " ".join([str(m.group(0)).capitalize() for m in matches]) - - def create_row(self, layout, type_name, text, **kwargs): - # get type attribute from qwidgets - attr = getattr(QtWidgets, type_name) - - # convert label text to normal capitalized text with spaces - label_text = self.camel_case_split(text) - - # assign the new text to label widget - label = QtWidgets.QLabel(label_text) - label.setObjectName("LineLabel") - - # create attribute name text strip of spaces - attr_name = text.replace(" ", "") - - # create attribute and assign default values - setattr( - self, - attr_name, - attr(parent=self)) - - # assign the created attribute to variable - item = getattr(self, attr_name) - for func, val in kwargs.items(): - if getattr(item, func): - func_attr = getattr(item, func) - func_attr(val) - - # add to layout - layout.addRow(label, item) - - return item - - def populate_widgets(self, data, content_layout=None): - """ - Populate widget from input dict. - - Each plugin has its own set of widget rows defined in dictionary - each row values should have following keys: `type`, `target`, - `label`, `order`, `value` and optionally also `toolTip`. - - Args: - data (dict): widget rows or organized groups defined - by types `dict` or `section` - content_layout (QtWidgets.QFormLayout)[optional]: used when nesting - - Returns: - dict: redefined data dict updated with created widgets - - """ - - content_layout = content_layout or self.content_layout[-1] - # fix order of process by defined order value - ordered_keys = list(data.keys()) - for k, v in data.items(): - try: - # try removing a key from index which should - # be filled with new - ordered_keys.pop(v["order"]) - except IndexError: - pass - # add key into correct order - ordered_keys.insert(v["order"], k) - - # process ordered - for k in ordered_keys: - v = data[k] - tool_tip = v.get("toolTip", "") - if v["type"] == "dict": - self.content_layout.append(QtWidgets.QWidget(self)) - content_layout.addWidget(self.content_layout[-1]) - self.content_layout[-1].setObjectName("sectionHeadline") - - headline = QtWidgets.QVBoxLayout(self.content_layout[-1]) - headline.addWidget(Spacer(20, self)) - headline.addWidget(QtWidgets.QLabel(v["label"])) - - # adding nested layout with label - self.content_layout.append(QtWidgets.QWidget(self)) - self.content_layout[-1].setObjectName("sectionContent") - - nested_content_layout = QtWidgets.QFormLayout( - self.content_layout[-1]) - nested_content_layout.setObjectName("NestedContentLayout") - content_layout.addWidget(self.content_layout[-1]) - - # add nested key as label - data[k]["value"] = self.populate_widgets( - v["value"], nested_content_layout) - - if v["type"] == "section": - self.content_layout.append(QtWidgets.QWidget(self)) - content_layout.addWidget(self.content_layout[-1]) - self.content_layout[-1].setObjectName("sectionHeadline") - - headline = QtWidgets.QVBoxLayout(self.content_layout[-1]) - headline.addWidget(Spacer(20, self)) - headline.addWidget(QtWidgets.QLabel(v["label"])) - - # adding nested layout with label - self.content_layout.append(QtWidgets.QWidget(self)) - self.content_layout[-1].setObjectName("sectionContent") - - nested_content_layout = QtWidgets.QFormLayout( - self.content_layout[-1]) - nested_content_layout.setObjectName("NestedContentLayout") - content_layout.addWidget(self.content_layout[-1]) - - # add nested key as label - data[k]["value"] = self.populate_widgets( - v["value"], nested_content_layout) - - elif v["type"] == "QLineEdit": - data[k]["value"] = self.create_row( - content_layout, "QLineEdit", v["label"], - setText=v["value"], setToolTip=tool_tip) - elif v["type"] == "QComboBox": - data[k]["value"] = self.create_row( - content_layout, "QComboBox", v["label"], - addItems=v["value"], setToolTip=tool_tip) - elif v["type"] == "QCheckBox": - data[k]["value"] = self.create_row( - content_layout, "QCheckBox", v["label"], - setChecked=v["value"], setToolTip=tool_tip) - elif v["type"] == "QSpinBox": - data[k]["value"] = self.create_row( - content_layout, "QSpinBox", v["label"], - setValue=v["value"], setMinimum=0, - setMaximum=100000, setToolTip=tool_tip) - return data - - -class Spacer(QtWidgets.QWidget): - def __init__(self, height, *args, **kwargs): - super(self.__class__, self).__init__(*args, **kwargs) - - self.setFixedHeight(height) - - real_spacer = QtWidgets.QWidget(self) - real_spacer.setObjectName("Spacer") - real_spacer.setFixedHeight(height) - - layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.addWidget(real_spacer) - - self.setLayout(layout) - - -class Creator(LegacyCreator): - """Creator class wrapper - """ - clip_color = constants.COLOR_MAP["purple"] - rename_index = None - - def __init__(self, *args, **kwargs): - super(Creator, self).__init__(*args, **kwargs) - self.presets = get_current_project_settings()[ - "flame"]["create"].get(self.__class__.__name__, {}) - - # adding basic current context flame objects - self.project = flib.get_current_project() - self.sequence = flib.get_current_sequence(flib.CTX.selection) - - if (self.options or {}).get("useSelection"): - self.selected = flib.get_sequence_segments(self.sequence, True) - else: - self.selected = flib.get_sequence_segments(self.sequence) - - def create_widget(self, *args, **kwargs): - widget = CreatorWidget(*args, **kwargs) - widget.exec_() - return widget.get_results_back() - - -class PublishableClip: - """ - Convert a segment to publishable instance - - Args: - segment (flame.PySegment): flame api object - kwargs (optional): additional data needed for rename=True (presets) - - Returns: - flame.PySegment: flame api object - """ - vertical_clip_match = {} - marker_data = {} - types = { - "shot": "shot", - "folder": "folder", - "episode": "episode", - "sequence": "sequence", - "track": "sequence", - } - - # parents search pattern - parents_search_pattern = r"\{([a-z]*?)\}" - - # default templates for non-ui use - rename_default = False - hierarchy_default = "{_folder_}/{_sequence_}/{_track_}" - clip_name_default = "shot_{_trackIndex_:0>3}_{_clipIndex_:0>4}" - review_track_default = "[ none ]" - base_product_name_default = "[ track name ]" - base_product_type_default = "plate" - count_from_default = 10 - count_steps_default = 10 - vertical_sync_default = False - driving_layer_default = "" - index_from_segment_default = False - use_shot_name_default = False - include_handles_default = False - retimed_handles_default = True - retimed_framerange_default = True - - def __init__(self, segment, **kwargs): - self.rename_index = kwargs["rename_index"] - self.product_type = kwargs["family"] - self.log = kwargs["log"] - - # get main parent objects - self.current_segment = segment - sequence_name = flib.get_current_sequence([segment]).name.get_value() - self.sequence_name = str(sequence_name).replace(" ", "_") - - self.clip_data = flib.get_segment_attributes(segment) - # segment (clip) main attributes - self.cs_name = self.clip_data["segment_name"] - self.cs_index = int(self.clip_data["segment"]) - self.shot_name = self.clip_data["shot_name"] - - # get track name and index - self.track_index = int(self.clip_data["track"]) - track_name = self.clip_data["track_name"] - self.track_name = str(track_name).replace(" ", "_").replace( - "*", "noname{}".format(self.track_index)) - - # adding tag.family into tag - if kwargs.get("avalon"): - self.marker_data.update(kwargs["avalon"]) - - # add publish attribute to marker data - self.marker_data.update({"publish": True}) - - # adding ui inputs if any - self.ui_inputs = kwargs.get("ui_inputs", {}) - - self.log.info("Inside of plugin: {}".format( - self.marker_data - )) - # populate default data before we get other attributes - self._populate_segment_default_data() - - # use all populated default data to create all important attributes - self._populate_attributes() - - # create parents with correct types - self._create_parents() - - def convert(self): - - # solve segment data and add them to marker data - self._convert_to_marker_data() - - # if track name is in review track name and also if driving track name - # is not in review track name: skip tag creation - if (self.track_name in self.review_layer) and ( - self.driving_layer not in self.review_layer): - return - - # deal with clip name - new_name = self.marker_data.pop("newClipName") - - if self.rename and not self.use_shot_name: - # rename segment - self.current_segment.name = str(new_name) - self.marker_data["asset"] = str(new_name) - elif self.use_shot_name: - self.marker_data["asset"] = self.shot_name - self.marker_data["hierarchyData"]["shot"] = self.shot_name - else: - self.marker_data["asset"] = self.cs_name - self.marker_data["hierarchyData"]["shot"] = self.cs_name - - if self.marker_data["heroTrack"] and self.review_layer: - self.marker_data["reviewTrack"] = self.review_layer - else: - self.marker_data["reviewTrack"] = None - - # create pype tag on track_item and add data - fpipeline.imprint(self.current_segment, self.marker_data) - - return self.current_segment - - def _populate_segment_default_data(self): - """ Populate default formatting data from segment. """ - - self.current_segment_default_data = { - "_folder_": "shots", - "_sequence_": self.sequence_name, - "_track_": self.track_name, - "_clip_": self.cs_name, - "_trackIndex_": self.track_index, - "_clipIndex_": self.cs_index - } - - def _populate_attributes(self): - """ Populate main object attributes. """ - # segment frame range and parent track name for vertical sync check - self.clip_in = int(self.clip_data["record_in"]) - self.clip_out = int(self.clip_data["record_out"]) - - # define ui inputs if non gui mode was used - self.shot_num = self.cs_index - self.log.debug( - "____ self.shot_num: {}".format(self.shot_num)) - - # ui_inputs data or default values if gui was not used - self.rename = self.ui_inputs.get( - "clipRename", {}).get("value") or self.rename_default - self.use_shot_name = self.ui_inputs.get( - "useShotName", {}).get("value") or self.use_shot_name_default - self.clip_name = self.ui_inputs.get( - "clipName", {}).get("value") or self.clip_name_default - self.hierarchy = self.ui_inputs.get( - "hierarchy", {}).get("value") or self.hierarchy_default - self.hierarchy_data = self.ui_inputs.get( - "hierarchyData", {}).get("value") or \ - self.current_segment_default_data.copy() - self.index_from_segment = self.ui_inputs.get( - "segmentIndex", {}).get("value") or self.index_from_segment_default - self.count_from = self.ui_inputs.get( - "countFrom", {}).get("value") or self.count_from_default - self.count_steps = self.ui_inputs.get( - "countSteps", {}).get("value") or self.count_steps_default - self.base_product_name = self.ui_inputs.get( - "productName", {}).get("value") or self.base_product_name_default - self.base_product_type = self.ui_inputs.get( - "productType", {}).get("value") or self.base_product_type_default - self.vertical_sync = self.ui_inputs.get( - "vSyncOn", {}).get("value") or self.vertical_sync_default - self.driving_layer = self.ui_inputs.get( - "vSyncTrack", {}).get("value") or self.driving_layer_default - self.review_track = self.ui_inputs.get( - "reviewTrack", {}).get("value") or self.review_track_default - self.audio = self.ui_inputs.get( - "audio", {}).get("value") or False - self.include_handles = self.ui_inputs.get( - "includeHandles", {}).get("value") or self.include_handles_default - self.retimed_handles = ( - self.ui_inputs.get("retimedHandles", {}).get("value") - or self.retimed_handles_default - ) - self.retimed_framerange = ( - self.ui_inputs.get("retimedFramerange", {}).get("value") - or self.retimed_framerange_default - ) - - # build product name from layer name - if self.base_product_name == "[ track name ]": - self.base_product_name = self.track_name - - # create product for publishing - self.product_name = ( - self.base_product_type + self.base_product_name.capitalize() - ) - - def _replace_hash_to_expression(self, name, text): - """ Replace hash with number in correct padding. """ - _spl = text.split("#") - _len = (len(_spl) - 1) - _repl = "{{{0}:0>{1}}}".format(name, _len) - return text.replace(("#" * _len), _repl) - - def _convert_to_marker_data(self): - """ Convert internal data to marker data. - - Populating the marker data into internal variable self.marker_data - """ - # define vertical sync attributes - hero_track = True - self.review_layer = "" - if self.vertical_sync and self.track_name not in self.driving_layer: - # if it is not then define vertical sync as None - hero_track = False - - # increasing steps by index of rename iteration - if not self.index_from_segment: - self.count_steps *= self.rename_index - - hierarchy_formatting_data = {} - hierarchy_data = deepcopy(self.hierarchy_data) - _data = self.current_segment_default_data.copy() - if self.ui_inputs: - # adding tag metadata from ui - for _k, _v in self.ui_inputs.items(): - if _v["target"] == "tag": - self.marker_data[_k] = _v["value"] - - # driving layer is set as positive match - if hero_track or self.vertical_sync: - # mark review layer - if self.review_track and ( - self.review_track not in self.review_track_default): - # if review layer is defined and not the same as default - self.review_layer = self.review_track - - # shot num calculate - if self.index_from_segment: - # use clip index from timeline - self.shot_num = self.count_steps * self.cs_index - else: - if self.rename_index == 0: - self.shot_num = self.count_from - else: - self.shot_num = self.count_from + self.count_steps - - # clip name sequence number - _data.update({"shot": self.shot_num}) - - # solve # in test to pythonic expression - for _k, _v in hierarchy_data.items(): - if "#" not in _v["value"]: - continue - hierarchy_data[ - _k]["value"] = self._replace_hash_to_expression( - _k, _v["value"]) - - # fill up pythonic expresisons in hierarchy data - for k, _v in hierarchy_data.items(): - hierarchy_formatting_data[k] = _v["value"].format(**_data) - else: - # if no gui mode then just pass default data - hierarchy_formatting_data = hierarchy_data - - tag_hierarchy_data = self._solve_tag_hierarchy_data( - hierarchy_formatting_data - ) - - tag_hierarchy_data.update({"heroTrack": True}) - if hero_track and self.vertical_sync: - self.vertical_clip_match.update({ - (self.clip_in, self.clip_out): tag_hierarchy_data - }) - - if not hero_track and self.vertical_sync: - # driving layer is set as negative match - for (_in, _out), hero_data in self.vertical_clip_match.items(): - """ - Since only one instance of hero clip is expected in - `self.vertical_clip_match`, this will loop only once - until none hero clip will be matched with hero clip. - - `tag_hierarchy_data` will be set only once for every - clip which is not hero clip. - """ - _hero_data = deepcopy(hero_data) - _hero_data.update({"heroTrack": False}) - if _in <= self.clip_in and _out >= self.clip_out: - data_product_name = hero_data["productName"] - # add track index in case duplicity of names in hero data - if self.product_name in data_product_name: - _hero_data["productName"] = self.product_name + str( - self.track_index) - # in case track name and product name is the same then add - if self.base_product_name == self.track_name: - _hero_data["productName"] = self.product_name - # assign data to return hierarchy data to tag - tag_hierarchy_data = _hero_data - break - - # add data to return data dict - self.marker_data.update(tag_hierarchy_data) - - def _solve_tag_hierarchy_data(self, hierarchy_formatting_data): - """ Solve marker data from hierarchy data and templates. """ - # fill up clip name and hierarchy keys - hierarchy_filled = self.hierarchy.format(**hierarchy_formatting_data) - clip_name_filled = self.clip_name.format(**hierarchy_formatting_data) - - # remove shot from hierarchy data: is not needed anymore - hierarchy_formatting_data.pop("shot") - - return { - "newClipName": clip_name_filled, - "hierarchy": hierarchy_filled, - "parents": self.parents, - "hierarchyData": hierarchy_formatting_data, - "productName": self.product_name, - "productType": self.base_product_type, - "families": [self.base_product_type, self.product_type] - } - - def _convert_to_entity(self, src_type, template): - """ Converting input key to key with type. """ - # convert to entity type - folder_type = self.types.get(src_type, None) - - assert folder_type, "Missing folder type for `{}`".format( - src_type - ) - - # first collect formatting data to use for formatting template - formatting_data = {} - for _k, _v in self.hierarchy_data.items(): - value = _v["value"].format( - **self.current_segment_default_data) - formatting_data[_k] = value - - return { - "folder_type": folder_type, - "entity_name": template.format( - **formatting_data - ) - } - - def _create_parents(self): - """ Create parents and return it in list. """ - self.parents = [] - - pattern = re.compile(self.parents_search_pattern) - - par_split = [(pattern.findall(t).pop(), t) - for t in self.hierarchy.split("/")] - - for type, template in par_split: - parent = self._convert_to_entity(type, template) - self.parents.append(parent) - - -# Publishing plugin functions - -# Loader plugin functions -class ClipLoader(LoaderPlugin): - """A basic clip loader for Flame - - This will implement the basic behavior for a loader to inherit from that - will containerize the reference and will implement the `remove` and - `update` logic. - - """ - log = log - - options = [ - qargparse.Boolean( - "handles", - label="Set handles", - default=0, - help="Also set handles to clip as In/Out marks" - ) - ] - - _mapping = None - _host_settings = None - - def apply_settings(cls, project_settings): - - plugin_type_settings = ( - project_settings - .get("flame", {}) - .get("load", {}) - ) - - if not plugin_type_settings: - return - - plugin_name = cls.__name__ - - plugin_settings = None - # Look for plugin settings in host specific settings - if plugin_name in plugin_type_settings: - plugin_settings = plugin_type_settings[plugin_name] - - if not plugin_settings: - return - - print(">>> We have preset for {}".format(plugin_name)) - for option, value in plugin_settings.items(): - if option == "enabled" and value is False: - print(" - is disabled by preset") - elif option == "representations": - continue - else: - print(" - setting `{}`: `{}`".format(option, value)) - setattr(cls, option, value) - - def get_colorspace(self, context): - """Get colorspace name - - Look either to version data or representation data. - - Args: - context (dict): version context data - - Returns: - str: colorspace name or None - """ - version_entity = context["version"] - version_attributes = version_entity["attrib"] - colorspace = version_attributes.get("colorSpace") - - if ( - not colorspace - or colorspace == "Unknown" - ): - colorspace = context["representation"]["data"].get( - "colorspace") - - return colorspace - - @classmethod - def get_native_colorspace(cls, input_colorspace): - """Return native colorspace name. - - Args: - input_colorspace (str | None): colorspace name - - Returns: - str: native colorspace name defined in mapping or None - """ - # TODO: rewrite to support only pipeline's remapping - if not cls._host_settings: - cls._host_settings = get_current_project_settings()["flame"] - - # [Deprecated] way of remapping - if not cls._mapping: - mapping = ( - cls._host_settings["imageio"]["profilesMapping"]["inputs"]) - cls._mapping = { - input["ocioName"]: input["flameName"] - for input in mapping - } - - native_name = cls._mapping.get(input_colorspace) - - if not native_name: - native_name = get_remapped_colorspace_to_native( - input_colorspace, "flame", cls._host_settings["imageio"]) - - return native_name - - -class OpenClipSolver(flib.MediaInfoFile): - create_new_clip = False - - log = log - - def __init__(self, openclip_file_path, feed_data, logger=None): - self.out_file = openclip_file_path - - # replace log if any - if logger: - self.log = logger - - # new feed variables: - feed_path = feed_data.pop("path") - - # initialize parent class - super(OpenClipSolver, self).__init__( - feed_path, - logger=logger - ) - - # get other metadata - self.feed_version_name = feed_data["version"] - self.feed_colorspace = feed_data.get("colorspace") - self.log.debug("feed_version_name: {}".format(self.feed_version_name)) - - # layer rename variables - self.layer_rename_template = feed_data["layer_rename_template"] - self.layer_rename_patterns = feed_data["layer_rename_patterns"] - self.context_data = feed_data["context_data"] - - # derivate other feed variables - self.feed_basename = os.path.basename(feed_path) - self.feed_dir = os.path.dirname(feed_path) - self.feed_ext = os.path.splitext(self.feed_basename)[1][1:].lower() - self.log.debug("feed_ext: {}".format(self.feed_ext)) - self.log.debug("out_file: {}".format(self.out_file)) - if not self._is_valid_tmp_file(self.out_file): - self.create_new_clip = True - - def _is_valid_tmp_file(self, file): - # check if file exists - if os.path.isfile(file): - # test also if file is not empty - with open(file) as f: - lines = f.readlines() - - if len(lines) > 2: - return True - - # file is probably corrupted - os.remove(file) - return False - - def make(self): - - if self.create_new_clip: - # New openClip - self._create_new_open_clip() - else: - self._update_open_clip() - - def _clear_handler(self, xml_object): - for handler in xml_object.findall("./handler"): - self.log.info("Handler found") - xml_object.remove(handler) - - def _create_new_open_clip(self): - self.log.info("Building new openClip") - - for tmp_xml_track in self.clip_data.iter("track"): - # solve track (layer) name - self._rename_track_name(tmp_xml_track) - - tmp_xml_feeds = tmp_xml_track.find('feeds') - tmp_xml_feeds.set('currentVersion', self.feed_version_name) - - for tmp_feed in tmp_xml_track.iter("feed"): - tmp_feed.set('vuid', self.feed_version_name) - - # add colorspace if any is set - if self.feed_colorspace: - self._add_colorspace(tmp_feed, self.feed_colorspace) - - self._clear_handler(tmp_feed) - - tmp_xml_versions_obj = self.clip_data.find('versions') - tmp_xml_versions_obj.set('currentVersion', self.feed_version_name) - for xml_new_version in tmp_xml_versions_obj: - xml_new_version.set('uid', self.feed_version_name) - xml_new_version.set('type', 'version') - - self._clear_handler(self.clip_data) - self.log.info("Adding feed version: {}".format(self.feed_basename)) - - self.write_clip_data_to_file(self.out_file, self.clip_data) - - def _get_xml_track_obj_by_uid(self, xml_data, uid): - # loop all tracks of input xml data - for xml_track in xml_data.iter("track"): - track_uid = xml_track.get("uid") - self.log.debug( - ">> track_uid:uid: {}:{}".format(track_uid, uid)) - - # get matching uids - if uid == track_uid: - return xml_track - - def _rename_track_name(self, xml_track_data): - layer_uid = xml_track_data.get("uid") - name_obj = xml_track_data.find("name") - layer_name = name_obj.text - - if ( - self.layer_rename_patterns - and not any( - re.search(lp_.lower(), layer_name.lower()) - for lp_ in self.layer_rename_patterns - ) - ): - return - - formatting_data = self._update_formatting_data( - layerName=layer_name, - layerUID=layer_uid - ) - name_obj.text = StringTemplate( - self.layer_rename_template - ).format(formatting_data) - - def _update_formatting_data(self, **kwargs): - """ Updating formatting data for layer rename - - Attributes: - key=value (optional): will be included to formatting data - as {key: value} - Returns: - dict: anatomy context data for formatting - """ - self.log.debug(">> self.clip_data: {}".format(self.clip_data)) - clip_name_obj = self.clip_data.find("name") - data = { - "originalBasename": clip_name_obj.text - } - # include version context data - data.update(self.context_data) - # include input kwargs data - data.update(kwargs) - return data - - def _update_open_clip(self): - self.log.info("Updating openClip ..") - - out_xml = ET.parse(self.out_file) - out_xml = out_xml.getroot() - - self.log.debug(">> out_xml: {}".format(out_xml)) - # loop tmp tracks - updated_any = False - for tmp_xml_track in self.clip_data.iter("track"): - # solve track (layer) name - self._rename_track_name(tmp_xml_track) - - # get tmp track uid - tmp_track_uid = tmp_xml_track.get("uid") - self.log.debug(">> tmp_track_uid: {}".format(tmp_track_uid)) - - # get out data track by uid - out_track_element = self._get_xml_track_obj_by_uid( - out_xml, tmp_track_uid) - self.log.debug( - ">> out_track_element: {}".format(out_track_element)) - - # loop tmp feeds - for tmp_xml_feed in tmp_xml_track.iter("feed"): - new_path_obj = tmp_xml_feed.find( - "spans/span/path") - new_path = new_path_obj.text - - # check if feed path already exists in track's feeds - if ( - out_track_element is not None - and self._feed_exists(out_track_element, new_path) - ): - continue - - # rename versions on feeds - tmp_xml_feed.set('vuid', self.feed_version_name) - self._clear_handler(tmp_xml_feed) - - # update fps from MediaInfoFile class - if self.fps is not None: - tmp_feed_fps_obj = tmp_xml_feed.find( - "startTimecode/rate") - tmp_feed_fps_obj.text = str(self.fps) - - # update start_frame from MediaInfoFile class - if self.start_frame is not None: - tmp_feed_nb_ticks_obj = tmp_xml_feed.find( - "startTimecode/nbTicks") - tmp_feed_nb_ticks_obj.text = str(self.start_frame) - - # update drop_mode from MediaInfoFile class - if self.drop_mode is not None: - tmp_feed_drop_mode_obj = tmp_xml_feed.find( - "startTimecode/dropMode") - tmp_feed_drop_mode_obj.text = str(self.drop_mode) - - # add colorspace if any is set - if self.feed_colorspace is not None: - self._add_colorspace(tmp_xml_feed, self.feed_colorspace) - - # then append/update feed to correct track in output - if out_track_element: - self.log.debug("updating track element ..") - # update already present track - out_feeds = out_track_element.find('feeds') - out_feeds.set('currentVersion', self.feed_version_name) - out_feeds.append(tmp_xml_feed) - - self.log.info( - "Appending new feed: {}".format( - self.feed_version_name)) - else: - self.log.debug("adding new track element ..") - # create new track as it doesn't exist yet - # set current version to feeds on tmp - tmp_xml_feeds = tmp_xml_track.find('feeds') - tmp_xml_feeds.set('currentVersion', self.feed_version_name) - out_tracks = out_xml.find("tracks") - out_tracks.append(tmp_xml_track) - - updated_any = True - - if updated_any: - # Append vUID to versions - out_xml_versions_obj = out_xml.find('versions') - out_xml_versions_obj.set( - 'currentVersion', self.feed_version_name) - new_version_obj = ET.Element( - "version", {"type": "version", "uid": self.feed_version_name}) - out_xml_versions_obj.insert(0, new_version_obj) - - self._clear_handler(out_xml) - - # fist create backup - self._create_openclip_backup_file(self.out_file) - - self.log.info("Adding feed version: {}".format( - self.feed_version_name)) - - self.write_clip_data_to_file(self.out_file, out_xml) - - self.log.debug("OpenClip Updated: {}".format(self.out_file)) - - def _feed_exists(self, xml_data, path): - # loop all available feed paths and check if - # the path is not already in file - for src_path in xml_data.iter('path'): - if path == src_path.text: - self.log.warning( - "Not appending file as it already is in .clip file") - return True - - def _create_openclip_backup_file(self, file): - bck_file = "{}.bak".format(file) - # if backup does not exist - if not os.path.isfile(bck_file): - shutil.copy2(file, bck_file) - else: - # in case it exists and is already multiplied - created = False - for _i in range(1, 99): - bck_file = "{name}.bak.{idx:0>2}".format( - name=file, - idx=_i) - # create numbered backup file - if not os.path.isfile(bck_file): - shutil.copy2(file, bck_file) - created = True - break - # in case numbered does not exists - if not created: - bck_file = "{}.bak.last".format(file) - shutil.copy2(file, bck_file) - - def _add_colorspace(self, feed_obj, profile_name): - feed_storage_obj = feed_obj.find("storageFormat") - feed_clr_obj = feed_storage_obj.find("colourSpace") - if feed_clr_obj is not None: - feed_clr_obj = ET.Element( - "colourSpace", {"type": "string"}) - feed_clr_obj.text = profile_name - feed_storage_obj.append(feed_clr_obj) diff --git a/server_addon/flame/client/ayon_flame/api/render_utils.py b/server_addon/flame/client/ayon_flame/api/render_utils.py deleted file mode 100644 index a0c77cb155..0000000000 --- a/server_addon/flame/client/ayon_flame/api/render_utils.py +++ /dev/null @@ -1,185 +0,0 @@ -import os -from xml.etree import ElementTree as ET -from ayon_core.lib import Logger - -log = Logger.get_logger(__name__) - - -def export_clip(export_path, clip, preset_path, **kwargs): - """Flame exported wrapper - - Args: - export_path (str): exporting directory path - clip (PyClip): flame api object - preset_path (str): full export path to xml file - - Kwargs: - thumb_frame_number (int)[optional]: source frame number - in_mark (int)[optional]: cut in mark - out_mark (int)[optional]: cut out mark - - Raises: - KeyError: Missing input kwarg `thumb_frame_number` - in case `thumbnail` in `export_preset` - FileExistsError: Missing export preset in shared folder - """ - import flame - - in_mark = out_mark = None - - # Set exporter - exporter = flame.PyExporter() - exporter.foreground = True - exporter.export_between_marks = True - - if kwargs.get("thumb_frame_number"): - thumb_frame_number = kwargs["thumb_frame_number"] - # make sure it exists in kwargs - if not thumb_frame_number: - raise KeyError( - "Missing key `thumb_frame_number` in input kwargs") - - in_mark = int(thumb_frame_number) - out_mark = int(thumb_frame_number) + 1 - - elif kwargs.get("in_mark") and kwargs.get("out_mark"): - in_mark = int(kwargs["in_mark"]) - out_mark = int(kwargs["out_mark"]) - else: - exporter.export_between_marks = False - - try: - # set in and out marks if they are available - if in_mark and out_mark: - clip.in_mark = in_mark - clip.out_mark = out_mark - - # export with exporter - exporter.export(clip, preset_path, export_path) - finally: - print('Exported: {} at {}-{}'.format( - clip.name.get_value(), - clip.in_mark, - clip.out_mark - )) - - -def get_preset_path_by_xml_name(xml_preset_name): - def _search_path(root): - output = [] - for root, _dirs, files in os.walk(root): - for f in files: - if f != xml_preset_name: - continue - file_path = os.path.join(root, f) - output.append(file_path) - return output - - def _validate_results(results): - if results and len(results) == 1: - return results.pop() - elif results and len(results) > 1: - print(( - "More matching presets for `{}`: /n" - "{}").format(xml_preset_name, results)) - return results.pop() - else: - return None - - from .utils import ( - get_flame_install_root, - get_flame_version - ) - - # get actual flame version and install path - _version = get_flame_version()["full"] - _install_root = get_flame_install_root() - - # search path templates - shared_search_root = "{install_root}/shared/export/presets" - install_search_root = ( - "{install_root}/presets/{version}/export/presets/flame") - - # fill templates - shared_search_root = shared_search_root.format( - install_root=_install_root - ) - install_search_root = install_search_root.format( - install_root=_install_root, - version=_version - ) - - # get search results - shared_results = _search_path(shared_search_root) - installed_results = _search_path(install_search_root) - - # first try to return shared results - shared_preset_path = _validate_results(shared_results) - - if shared_preset_path: - return os.path.dirname(shared_preset_path) - - # then try installed results - installed_preset_path = _validate_results(installed_results) - - if installed_preset_path: - return os.path.dirname(installed_preset_path) - - # if nothing found then return False - return False - - -def modify_preset_file(xml_path, staging_dir, data): - """Modify xml preset with input data - - Args: - xml_path (str ): path for input xml preset - staging_dir (str): staging dir path - data (dict): data where key is xmlTag and value as string - - Returns: - str: _description_ - """ - # create temp path - dirname, basename = os.path.split(xml_path) - temp_path = os.path.join(staging_dir, basename) - - # change xml following data keys - with open(xml_path, "r") as datafile: - _root = ET.parse(datafile) - - for key, value in data.items(): - try: - if "/" in key: - if not key.startswith("./"): - key = ".//" + key - - split_key_path = key.split("/") - element_key = split_key_path[-1] - parent_obj_path = "/".join(split_key_path[:-1]) - - parent_obj = _root.find(parent_obj_path) - element_obj = parent_obj.find(element_key) - if not element_obj: - append_element(parent_obj, element_key, value) - else: - finds = _root.findall(".//{}".format(key)) - if not finds: - raise AttributeError - for element in finds: - element.text = str(value) - except AttributeError: - log.warning( - "Cannot create attribute: {}: {}. Skipping".format( - key, value - )) - _root.write(temp_path) - - return temp_path - - -def append_element(root_element_obj, key, value): - new_element_obj = ET.Element(key) - log.debug("__ new_element_obj: {}".format(new_element_obj)) - new_element_obj.text = str(value) - root_element_obj.insert(0, new_element_obj) diff --git a/server_addon/flame/client/ayon_flame/api/scripts/wiretap_com.py b/server_addon/flame/client/ayon_flame/api/scripts/wiretap_com.py deleted file mode 100644 index 42b9257cbe..0000000000 --- a/server_addon/flame/client/ayon_flame/api/scripts/wiretap_com.py +++ /dev/null @@ -1,504 +0,0 @@ -#!/usr/bin/env python2.7 -# -*- coding: utf-8 -*- - -from __future__ import absolute_import -import os -import sys -import subprocess -import json -import xml.dom.minidom as minidom -from copy import deepcopy -import datetime -from libwiretapPythonClientAPI import ( # noqa - WireTapClientInit, - WireTapClientUninit, - WireTapNodeHandle, - WireTapServerHandle, - WireTapInt, - WireTapStr -) - - -class WireTapCom(object): - """ - Comunicator class wrapper for talking to WireTap db. - - This way we are able to set new project with settings and - correct colorspace policy. Also we are able to create new user - or get actual user with similar name (users are usually cloning - their profiles and adding date stamp into suffix). - """ - - def __init__(self, host_name=None, volume_name=None, group_name=None): - """Initialisation of WireTap communication class - - Args: - host_name (str, optional): Name of host server. Defaults to None. - volume_name (str, optional): Name of volume. Defaults to None. - group_name (str, optional): Name of user group. Defaults to None. - """ - # set main attributes of server - # if there are none set the default installation - self.host_name = host_name or "localhost" - self.volume_name = volume_name or "stonefs" - self.group_name = group_name or "staff" - - # wiretap tools dir path - self.wiretap_tools_dir = os.getenv("AYON_WIRETAP_TOOLS") - - # initialize WireTap client - WireTapClientInit() - - # add the server to shared variable - self._server = WireTapServerHandle("{}:IFFFS".format(self.host_name)) - print("WireTap connected at '{}'...".format( - self.host_name)) - - def close(self): - self._server = None - WireTapClientUninit() - print("WireTap closed...") - - def get_launch_args( - self, project_name, project_data, user_name, *args, **kwargs): - """Forming launch arguments for AYON launcher. - - Args: - project_name (str): name of project - project_data (dict): Flame compatible project data - user_name (str): name of user - - Returns: - list: arguments - """ - - workspace_name = kwargs.get("workspace_name") - color_policy = kwargs.get("color_policy") - - project_exists = self._project_prep(project_name) - if not project_exists: - self._set_project_settings(project_name, project_data) - self._set_project_colorspace(project_name, color_policy) - - user_name = self._user_prep(user_name) - - if workspace_name is None: - # default workspace - print("Using a default workspace") - return [ - "--start-project={}".format(project_name), - "--start-user={}".format(user_name), - "--create-workspace" - ] - - else: - print( - "Using a custom workspace '{}'".format(workspace_name)) - - self._workspace_prep(project_name, workspace_name) - return [ - "--start-project={}".format(project_name), - "--start-user={}".format(user_name), - "--create-workspace", - "--start-workspace={}".format(workspace_name) - ] - - def _workspace_prep(self, project_name, workspace_name): - """Preparing a workspace - - In case it doesn not exists it will create one - - Args: - project_name (str): project name - workspace_name (str): workspace name - - Raises: - AttributeError: unable to create workspace - """ - workspace_exists = self._child_is_in_parent_path( - "/projects/{}".format(project_name), workspace_name, "WORKSPACE" - ) - if not workspace_exists: - project = WireTapNodeHandle( - self._server, "/projects/{}".format(project_name)) - - workspace_node = WireTapNodeHandle() - created_workspace = project.createNode( - workspace_name, "WORKSPACE", workspace_node) - - if not created_workspace: - raise AttributeError( - "Cannot create workspace `{}` in " - "project `{}`: `{}`".format( - workspace_name, project_name, project.lastError()) - ) - - print( - "Workspace `{}` is successfully created".format(workspace_name)) - - def _project_prep(self, project_name): - """Preparing a project - - In case it doesn not exists it will create one - - Args: - project_name (str): project name - - Raises: - AttributeError: unable to create project - """ - # test if projeft exists - project_exists = self._child_is_in_parent_path( - "/projects", project_name, "PROJECT") - - if not project_exists: - volumes = self._get_all_volumes() - - if len(volumes) == 0: - raise AttributeError( - "Not able to create new project. No Volumes existing" - ) - - # check if volumes exists - if self.volume_name not in volumes: - raise AttributeError( - ("Volume '{}' does not exist in '{}'").format( - self.volume_name, volumes) - ) - - # form cmd arguments - project_create_cmd = [ - os.path.join( - self.wiretap_tools_dir, - "wiretap_create_node" - ), - '-n', - os.path.join("/volumes", self.volume_name), - '-d', - project_name, - '-g', - ] - - project_create_cmd.append(self.group_name) - - print(project_create_cmd) - - exit_code = subprocess.call( - project_create_cmd, - cwd=os.path.expanduser('~'), - preexec_fn=_subprocess_preexec_fn - ) - - if exit_code != 0: - RuntimeError("Cannot create project in flame db") - - print( - "A new project '{}' is created.".format(project_name)) - return project_exists - - def _get_all_volumes(self): - """Request all available volumens from WireTap - - Returns: - list: all available volumes in server - - Rises: - AttributeError: unable to get any volumes children from server - """ - root = WireTapNodeHandle(self._server, "/volumes") - children_num = WireTapInt(0) - - get_children_num = root.getNumChildren(children_num) - if not get_children_num: - raise AttributeError( - "Cannot get number of volumes: {}".format(root.lastError()) - ) - - volumes = [] - - # go through all children and get volume names - child_obj = WireTapNodeHandle() - for child_idx in range(children_num): - - # get a child - if not root.getChild(child_idx, child_obj): - raise AttributeError( - "Unable to get child: {}".format(root.lastError())) - - node_name = WireTapStr() - get_children_name = child_obj.getDisplayName(node_name) - - if not get_children_name: - raise AttributeError( - "Unable to get child name: {}".format( - child_obj.lastError()) - ) - - volumes.append(node_name.c_str()) - - return volumes - - def _user_prep(self, user_name): - """Ensuring user does exists in user's stack - - Args: - user_name (str): name of a user - - Raises: - AttributeError: unable to create user - """ - - # get all used usernames in db - used_names = self._get_usernames() - print(">> used_names: {}".format(used_names)) - - # filter only those which are sharing input user name - filtered_users = [user for user in used_names if user_name in user] - - if filtered_users: - # TODO: need to find lastly created following regex pattern for - # date used in name - return filtered_users.pop() - - # create new user name with date in suffix - now = datetime.datetime.now() # current date and time - date = now.strftime("%Y%m%d") - new_user_name = "{}_{}".format(user_name, date) - print(new_user_name) - - if not self._child_is_in_parent_path("/users", new_user_name, "USER"): - # Create the new user - users = WireTapNodeHandle(self._server, "/users") - - user_node = WireTapNodeHandle() - created_user = users.createNode(new_user_name, "USER", user_node) - if not created_user: - raise AttributeError( - "User {} cannot be created: {}".format( - new_user_name, users.lastError()) - ) - - print("User `{}` is created".format(new_user_name)) - return new_user_name - - def _get_usernames(self): - """Requesting all available users from WireTap - - Returns: - list: all available user names - - Raises: - AttributeError: there are no users in server - """ - root = WireTapNodeHandle(self._server, "/users") - children_num = WireTapInt(0) - - get_children_num = root.getNumChildren(children_num) - if not get_children_num: - raise AttributeError( - "Cannot get number of volumes: {}".format(root.lastError()) - ) - - usernames = [] - - # go through all children and get volume names - child_obj = WireTapNodeHandle() - for child_idx in range(children_num): - - # get a child - if not root.getChild(child_idx, child_obj): - raise AttributeError( - "Unable to get child: {}".format(root.lastError())) - - node_name = WireTapStr() - get_children_name = child_obj.getDisplayName(node_name) - - if not get_children_name: - raise AttributeError( - "Unable to get child name: {}".format( - child_obj.lastError()) - ) - - usernames.append(node_name.c_str()) - - return usernames - - def _child_is_in_parent_path(self, parent_path, child_name, child_type): - """Checking if a given child is in parent path. - - Args: - parent_path (str): db path to parent - child_name (str): name of child - child_type (str): type of child - - Raises: - AttributeError: Not able to get number of children - AttributeError: Not able to get children form parent - AttributeError: Not able to get children name - AttributeError: Not able to get children type - - Returns: - bool: True if child is in parent path - """ - parent = WireTapNodeHandle(self._server, parent_path) - - # iterate number of children - children_num = WireTapInt(0) - requested = parent.getNumChildren(children_num) - if not requested: - raise AttributeError(( - "Error: Cannot request number of " - "children from the node {}. Make sure your " - "wiretap service is running: {}").format( - parent_path, parent.lastError()) - ) - - # iterate children - child_obj = WireTapNodeHandle() - for child_idx in range(children_num): - if not parent.getChild(child_idx, child_obj): - raise AttributeError( - "Cannot get child: {}".format( - parent.lastError())) - - node_name = WireTapStr() - node_type = WireTapStr() - - if not child_obj.getDisplayName(node_name): - raise AttributeError( - "Unable to get child name: %s" % child_obj.lastError() - ) - if not child_obj.getNodeTypeStr(node_type): - raise AttributeError( - "Unable to obtain child type: %s" % child_obj.lastError() - ) - - if (node_name.c_str() == child_name) and ( - node_type.c_str() == child_type): - return True - - return False - - def _set_project_settings(self, project_name, project_data): - """Setting project attributes. - - Args: - project_name (str): name of project - project_data (dict): data with project attributes - (flame compatible) - - Raises: - AttributeError: Not able to set project attributes - """ - # generated xml from project_data dict - _xml = "" - for key, value in project_data.items(): - _xml += "<{}>{}".format(key, value, key) - _xml += "" - - pretty_xml = minidom.parseString(_xml).toprettyxml() - print("__ xml: {}".format(pretty_xml)) - - # set project data to wiretap - project_node = WireTapNodeHandle( - self._server, "/projects/{}".format(project_name)) - - if not project_node.setMetaData("XML", _xml): - raise AttributeError( - "Not able to set project attributes {}. Error: {}".format( - project_name, project_node.lastError()) - ) - - print("Project settings successfully set.") - - def _set_project_colorspace(self, project_name, color_policy): - """Set project's colorspace policy. - - Args: - project_name (str): name of project - color_policy (str): name of policy - - Raises: - RuntimeError: Not able to set colorspace policy - """ - color_policy = color_policy or "Legacy" - - # check if the colour policy in custom dir - if "/" in color_policy: - # if unlikelly full path was used make it redundant - color_policy = color_policy.replace("/syncolor/policies/", "") - # expecting input is `Shared/NameOfPolicy` - color_policy = "/syncolor/policies/{}".format( - color_policy) - else: - color_policy = "/syncolor/policies/Autodesk/{}".format( - color_policy) - - # create arguments - project_colorspace_cmd = [ - os.path.join( - self.wiretap_tools_dir, - "wiretap_duplicate_node" - ), - "-s", - color_policy, - "-n", - "/projects/{}/syncolor".format(project_name) - ] - - print(project_colorspace_cmd) - - exit_code = subprocess.call( - project_colorspace_cmd, - cwd=os.path.expanduser('~'), - preexec_fn=_subprocess_preexec_fn - ) - - if exit_code != 0: - RuntimeError("Cannot set colorspace {} on project {}".format( - color_policy, project_name - )) - - -def _subprocess_preexec_fn(): - """ Helper function - - Setting permission mask to 0777 - """ - os.setpgrp() - os.umask(0o000) - - -if __name__ == "__main__": - # get json exchange data - json_path = sys.argv[-1] - json_data = open(json_path).read() - in_data = json.loads(json_data) - out_data = deepcopy(in_data) - - # get main server attributes - host_name = in_data.pop("host_name") - volume_name = in_data.pop("volume_name") - group_name = in_data.pop("group_name") - - # initialize class - wiretap_handler = WireTapCom(host_name, volume_name, group_name) - - try: - app_args = wiretap_handler.get_launch_args( - project_name=in_data.pop("project_name"), - project_data=in_data.pop("project_data"), - user_name=in_data.pop("user_name"), - **in_data - ) - finally: - wiretap_handler.close() - - # set returned args back to out data - out_data.update({ - "app_args": app_args - }) - - # write it out back to the exchange json file - with open(json_path, "w") as file_stream: - json.dump(out_data, file_stream, indent=4) diff --git a/server_addon/flame/client/ayon_flame/api/utils.py b/server_addon/flame/client/ayon_flame/api/utils.py deleted file mode 100644 index 03a694c25c..0000000000 --- a/server_addon/flame/client/ayon_flame/api/utils.py +++ /dev/null @@ -1,143 +0,0 @@ -""" -Flame utils for syncing scripts -""" - -import os -import shutil -from ayon_core.lib import Logger -from ayon_flame import FLAME_ADDON_ROOT - -log = Logger.get_logger(__name__) - - -def _sync_utility_scripts(env=None): - """ Synchronizing basic utlility scripts for flame. - - To be able to run start AYON within Flame we have to copy - all utility_scripts and additional FLAME_SCRIPT_DIR into - `/opt/Autodesk/shared/python`. This will be always synchronizing those - folders. - """ - - env = env or os.environ - - # initiate inputs - scripts = {} - fsd_env = env.get("FLAME_SCRIPT_DIRS", "") - flame_shared_dir = "/opt/Autodesk/shared/python" - - fsd_paths = [os.path.join( - FLAME_ADDON_ROOT, - "api", - "utility_scripts" - )] - - # collect script dirs - log.info("FLAME_SCRIPT_DIRS: `{fsd_env}`".format(**locals())) - log.info("fsd_paths: `{fsd_paths}`".format(**locals())) - - # add application environment setting for FLAME_SCRIPT_DIR - # to script path search - for _dirpath in fsd_env.split(os.pathsep): - if not os.path.isdir(_dirpath): - log.warning("Path is not a valid dir: `{_dirpath}`".format( - **locals())) - continue - fsd_paths.append(_dirpath) - - # collect scripts from dirs - for path in fsd_paths: - scripts.update({path: os.listdir(path)}) - - remove_black_list = [] - for _k, s_list in scripts.items(): - remove_black_list += s_list - - log.info("remove_black_list: `{remove_black_list}`".format(**locals())) - log.info("Additional Flame script paths: `{fsd_paths}`".format(**locals())) - log.info("Flame Scripts: `{scripts}`".format(**locals())) - - # make sure no script file is in folder - if next(iter(os.listdir(flame_shared_dir)), None): - for _itm in os.listdir(flame_shared_dir): - skip = False - - # skip all scripts and folders which are not maintained - if _itm not in remove_black_list: - skip = True - - # do not skip if pyc in extension - if not os.path.isdir(_itm) and "pyc" in os.path.splitext(_itm)[-1]: - skip = False - - # continue if skip in true - if skip: - continue - - path = os.path.join(flame_shared_dir, _itm) - log.info("Removing `{path}`...".format(**locals())) - - try: - if os.path.isdir(path): - shutil.rmtree(path, onerror=None) - else: - os.remove(path) - except PermissionError as msg: - log.warning( - "Not able to remove: `{}`, Problem with: `{}`".format( - path, - msg - ) - ) - - # copy scripts into Resolve's utility scripts dir - for dirpath, scriptlist in scripts.items(): - # directory and scripts list - for _script in scriptlist: - # script in script list - src = os.path.join(dirpath, _script) - dst = os.path.join(flame_shared_dir, _script) - log.info("Copying `{src}` to `{dst}`...".format(**locals())) - - try: - if os.path.isdir(src): - shutil.copytree( - src, dst, symlinks=False, - ignore=None, ignore_dangling_symlinks=False - ) - else: - shutil.copy2(src, dst) - except (PermissionError, FileExistsError) as msg: - log.warning( - "Not able to copy to: `{}`, Problem with: `{}`".format( - dst, - msg - ) - ) - - -def setup(env=None): - """ Wrapper installer started from - `flame/hooks/pre_flame_setup.py` - """ - env = env or os.environ - - # synchronize resolve utility scripts - _sync_utility_scripts(env) - - log.info("Flame AYON wrapper has been installed") - - -def get_flame_version(): - import flame - - return { - "full": flame.get_version(), - "major": flame.get_version_major(), - "minor": flame.get_version_minor(), - "patch": flame.get_version_patch() - } - - -def get_flame_install_root(): - return "/opt/Autodesk" diff --git a/server_addon/flame/client/ayon_flame/api/workio.py b/server_addon/flame/client/ayon_flame/api/workio.py deleted file mode 100644 index eef10a4847..0000000000 --- a/server_addon/flame/client/ayon_flame/api/workio.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Host API required Work Files tool""" - -import os -from ayon_core.lib import Logger -# from .. import ( -# get_project_manager, -# get_current_project -# ) - - -log = Logger.get_logger(__name__) - -exported_projet_ext = ".otoc" - - -def file_extensions(): - return [exported_projet_ext] - - -def has_unsaved_changes(): - pass - - -def save_file(filepath): - pass - - -def open_file(filepath): - pass - - -def current_file(): - pass - - -def work_root(session): - return os.path.normpath(session["AYON_WORKDIR"]).replace("\\", "/") diff --git a/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py b/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py deleted file mode 100644 index e9e9aca3f4..0000000000 --- a/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py +++ /dev/null @@ -1,239 +0,0 @@ -import os -import json -import tempfile -import contextlib -import socket -from pprint import pformat - -from ayon_core.lib import ( - get_ayon_username, - run_subprocess, -) -from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_flame import FLAME_ADDON_ROOT - - -class FlamePrelaunch(PreLaunchHook): - """ Flame prelaunch hook - - Will make sure flame_script_dirs are copied to user's folder defined - in environment var FLAME_SCRIPT_DIR. - """ - app_groups = {"flame"} - permissions = 0o777 - - wtc_script_path = os.path.join( - FLAME_ADDON_ROOT, "api", "scripts", "wiretap_com.py" - ) - launch_types = {LaunchTypes.local} - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.signature = "( {} )".format(self.__class__.__name__) - - def execute(self): - _env = self.launch_context.env - self.flame_python_exe = _env["AYON_FLAME_PYTHON_EXEC"] - self.flame_pythonpath = _env["AYON_FLAME_PYTHONPATH"] - - """Hook entry method.""" - project_entity = self.data["project_entity"] - project_name = project_entity["name"] - volume_name = _env.get("FLAME_WIRETAP_VOLUME") - - # get image io - project_settings = self.data["project_settings"] - - imageio_flame = project_settings["flame"]["imageio"] - - # Check whether 'enabled' key from host imageio settings exists - # so we can tell if host is using the new colormanagement framework. - # If the 'enabled' isn't found we want 'colormanaged' set to True - # because prior to the key existing we always did colormanagement for - # Flame - colormanaged = imageio_flame.get("enabled") - # if key was not found, set to True - # ensuring backward compatibility - if colormanaged is None: - colormanaged = True - - # get user name and host name - user_name = get_ayon_username() - user_name = user_name.replace(".", "_") - - hostname = socket.gethostname() # not returning wiretap host name - - self.log.debug("Collected user \"{}\"".format(user_name)) - self.log.info(pformat(project_entity)) - project_attribs = project_entity["attrib"] - width = project_attribs["resolutionWidth"] - height = project_attribs["resolutionHeight"] - fps = float(project_attribs["fps"]) - - project_data = { - "Name": project_entity["name"], - "Nickname": project_entity["code"], - "Description": "Created by AYON", - "SetupDir": project_entity["name"], - "FrameWidth": int(width), - "FrameHeight": int(height), - "AspectRatio": float( - (width / height) * project_attribs["pixelAspect"] - ), - "FrameRate": self._get_flame_fps(fps) - } - - data_to_script = { - # from settings - "host_name": _env.get("FLAME_WIRETAP_HOSTNAME") or hostname, - "volume_name": volume_name, - "group_name": _env.get("FLAME_WIRETAP_GROUP"), - - # from project - "project_name": project_name, - "user_name": user_name, - "project_data": project_data - } - - # add color management data - if colormanaged: - project_data.update({ - "FrameDepth": str(imageio_flame["project"]["frameDepth"]), - "FieldDominance": str( - imageio_flame["project"]["fieldDominance"]) - }) - data_to_script["color_policy"] = str( - imageio_flame["project"]["colourPolicy"]) - - self.log.info(pformat(dict(_env))) - self.log.info(pformat(data_to_script)) - - # add to python path from settings - self._add_pythonpath() - - app_arguments = self._get_launch_arguments(data_to_script) - - # fix project data permission issue - self._fix_permissions(project_name, volume_name) - - self.launch_context.launch_args.extend(app_arguments) - - def _fix_permissions(self, project_name, volume_name): - """Work around for project data permissions - - Reported issue: when project is created locally on one machine, - it is impossible to migrate it to other machine. Autodesk Flame - is crating some unmanagable files which needs to be opened to 0o777. - - Args: - project_name (str): project name - volume_name (str): studio volume - """ - dirs_to_modify = [ - "/usr/discreet/project/{}".format(project_name), - "/opt/Autodesk/clip/{}/{}.prj".format(volume_name, project_name), - "/usr/discreet/clip/{}/{}.prj".format(volume_name, project_name) - ] - - for dirtm in dirs_to_modify: - for root, dirs, files in os.walk(dirtm): - try: - for name in set(dirs) | set(files): - path = os.path.join(root, name) - st = os.stat(path) - if oct(st.st_mode) != self.permissions: - os.chmod(path, self.permissions) - - except OSError as exc: - self.log.warning("Not able to open files: {}".format(exc)) - - def _get_flame_fps(self, fps_num): - fps_table = { - float(23.976): "23.976 fps", - int(25): "25 fps", - int(24): "24 fps", - float(29.97): "29.97 fps DF", - int(30): "30 fps", - int(50): "50 fps", - float(59.94): "59.94 fps DF", - int(60): "60 fps" - } - - match_key = min(fps_table.keys(), key=lambda x: abs(x - fps_num)) - - try: - return fps_table[match_key] - except KeyError as msg: - raise KeyError(( - "Missing FPS key in conversion table. " - "Following keys are available: {}".format(fps_table.keys()) - )) from msg - - def _add_pythonpath(self): - pythonpath = self.launch_context.env.get("PYTHONPATH") - - # separate it explicitly by `;` that is what we use in settings - new_pythonpath = self.flame_pythonpath.split(os.pathsep) - new_pythonpath += pythonpath.split(os.pathsep) - - self.launch_context.env["PYTHONPATH"] = os.pathsep.join(new_pythonpath) - - def _get_launch_arguments(self, script_data): - # Dump data to string - dumped_script_data = json.dumps(script_data) - - with make_temp_file(dumped_script_data) as tmp_json_path: - # Prepare subprocess arguments - args = [ - self.flame_python_exe.format( - **self.launch_context.env - ), - self.wtc_script_path, - tmp_json_path - ] - self.log.info("Executing: {}".format(" ".join(args))) - - process_kwargs = { - "logger": self.log, - "env": self.launch_context.env - } - - run_subprocess(args, **process_kwargs) - - # process returned json file to pass launch args - return_json_data = open(tmp_json_path).read() - returned_data = json.loads(return_json_data) - app_args = returned_data.get("app_args") - self.log.info("____ app_args: `{}`".format(app_args)) - - if not app_args: - RuntimeError("App arguments were not solved") - - return app_args - - -@contextlib.contextmanager -def make_temp_file(data): - try: - # Store dumped json to temporary file - temporary_json_file = tempfile.NamedTemporaryFile( - mode="w", suffix=".json", delete=False - ) - temporary_json_file.write(data) - temporary_json_file.close() - temporary_json_filepath = temporary_json_file.name.replace( - "\\", "/" - ) - - yield temporary_json_filepath - - except IOError as _error: - raise IOError( - "Not able to create temp json file: {}".format( - _error - ) - ) - - finally: - # Remove the temporary json - os.remove(temporary_json_filepath) diff --git a/server_addon/flame/client/ayon_flame/otio/__init__.py b/server_addon/flame/client/ayon_flame/otio/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/server_addon/flame/client/ayon_flame/otio/flame_export.py b/server_addon/flame/client/ayon_flame/otio/flame_export.py deleted file mode 100644 index bebe9be1c1..0000000000 --- a/server_addon/flame/client/ayon_flame/otio/flame_export.py +++ /dev/null @@ -1,624 +0,0 @@ -""" compatibility OpenTimelineIO 0.12.0 and newer -""" - -import os -import re -import json -import logging -import opentimelineio as otio -from . import utils - -import flame -from pprint import pformat - -log = logging.getLogger(__name__) - - -TRACK_TYPES = { - "video": otio.schema.TrackKind.Video, - "audio": otio.schema.TrackKind.Audio -} -MARKERS_COLOR_MAP = { - (1.0, 0.0, 0.0): otio.schema.MarkerColor.RED, - (1.0, 0.5, 0.0): otio.schema.MarkerColor.ORANGE, - (1.0, 1.0, 0.0): otio.schema.MarkerColor.YELLOW, - (1.0, 0.5, 1.0): otio.schema.MarkerColor.PINK, - (1.0, 1.0, 1.0): otio.schema.MarkerColor.WHITE, - (0.0, 1.0, 0.0): otio.schema.MarkerColor.GREEN, - (0.0, 1.0, 1.0): otio.schema.MarkerColor.CYAN, - (0.0, 0.0, 1.0): otio.schema.MarkerColor.BLUE, - (0.5, 0.0, 0.5): otio.schema.MarkerColor.PURPLE, - (0.5, 0.0, 1.0): otio.schema.MarkerColor.MAGENTA, - (0.0, 0.0, 0.0): otio.schema.MarkerColor.BLACK -} -MARKERS_INCLUDE = True - - -class CTX: - _fps = None - _tl_start_frame = None - project = None - clips = None - - @classmethod - def set_fps(cls, new_fps): - if not isinstance(new_fps, float): - raise TypeError("Invalid fps type {}".format(type(new_fps))) - if cls._fps != new_fps: - cls._fps = new_fps - - @classmethod - def get_fps(cls): - return cls._fps - - @classmethod - def set_tl_start_frame(cls, number): - if not isinstance(number, int): - raise TypeError("Invalid timeline start frame type {}".format( - type(number))) - if cls._tl_start_frame != number: - cls._tl_start_frame = number - - @classmethod - def get_tl_start_frame(cls): - return cls._tl_start_frame - - -def flatten(_list): - for item in _list: - if isinstance(item, (list, tuple)): - for sub_item in flatten(item): - yield sub_item - else: - yield item - - -def get_current_flame_project(): - project = flame.project.current_project - return project - - -def create_otio_rational_time(frame, fps): - return otio.opentime.RationalTime( - float(frame), - float(fps) - ) - - -def create_otio_time_range(start_frame, frame_duration, fps): - return otio.opentime.TimeRange( - start_time=create_otio_rational_time(start_frame, fps), - duration=create_otio_rational_time(frame_duration, fps) - ) - - -def _get_metadata(item): - if hasattr(item, 'metadata'): - return dict(item.metadata) if item.metadata else {} - return {} - - -def create_time_effects(otio_clip, speed): - otio_effect = None - - # retime on track item - if speed != 1.: - # make effect - otio_effect = otio.schema.LinearTimeWarp() - otio_effect.name = "Speed" - otio_effect.time_scalar = speed - otio_effect.metadata = {} - - # freeze frame effect - if speed == 0.: - otio_effect = otio.schema.FreezeFrame() - otio_effect.name = "FreezeFrame" - otio_effect.metadata = {} - - if otio_effect: - # add otio effect to clip effects - otio_clip.effects.append(otio_effect) - - -def _get_marker_color(flame_colour): - # clamp colors to closes half numbers - _flame_colour = [ - (lambda x: round(x * 2) / 2)(c) - for c in flame_colour] - - for color, otio_color_type in MARKERS_COLOR_MAP.items(): - if _flame_colour == list(color): - return otio_color_type - - return otio.schema.MarkerColor.RED - - -def _get_flame_markers(item): - output_markers = [] - - time_in = item.record_in.relative_frame - - for marker in item.markers: - log.debug(marker) - start_frame = marker.location.get_value().relative_frame - - start_frame = (start_frame - time_in) + 1 - - marker_data = { - "name": marker.name.get_value(), - "duration": marker.duration.get_value().relative_frame, - "comment": marker.comment.get_value(), - "start_frame": start_frame, - "colour": marker.colour.get_value() - } - - output_markers.append(marker_data) - - return output_markers - - -def create_otio_markers(otio_item, item): - markers = _get_flame_markers(item) - for marker in markers: - frame_rate = CTX.get_fps() - - marked_range = otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime( - marker["start_frame"], - frame_rate - ), - duration=otio.opentime.RationalTime( - marker["duration"], - frame_rate - ) - ) - - # testing the comment if it is not containing json string - check_if_json = re.findall( - re.compile(r"[{:}]"), - marker["comment"] - ) - - # to identify this as json, at least 3 items in the list should - # be present ["{", ":", "}"] - metadata = {} - if len(check_if_json) >= 3: - # this is json string - try: - # capture exceptions which are related to strings only - metadata.update( - json.loads(marker["comment"]) - ) - except ValueError as msg: - log.error("Marker json conversion: {}".format(msg)) - else: - metadata["comment"] = marker["comment"] - - otio_marker = otio.schema.Marker( - name=marker["name"], - color=_get_marker_color( - marker["colour"]), - marked_range=marked_range, - metadata=metadata - ) - - otio_item.markers.append(otio_marker) - - -def create_otio_reference(clip_data, fps=None): - metadata = _get_metadata(clip_data) - duration = int(clip_data["source_duration"]) - - # get file info for path and start frame - frame_start = 0 - fps = fps or CTX.get_fps() - - path = clip_data["fpath"] - - file_name = os.path.basename(path) - file_head, extension = os.path.splitext(file_name) - - # get padding and other file infos - log.debug("_ path: {}".format(path)) - - otio_ex_ref_item = None - - is_sequence = frame_number = utils.get_frame_from_filename(file_name) - if is_sequence: - file_head = file_name.split(frame_number)[:-1] - frame_start = int(frame_number) - padding = len(frame_number) - - metadata.update({ - "isSequence": True, - "padding": padding - }) - - # if it is file sequence try to create `ImageSequenceReference` - # the OTIO might not be compatible so return nothing and do it old way - try: - dirname = os.path.dirname(path) - otio_ex_ref_item = otio.schema.ImageSequenceReference( - target_url_base=dirname + os.sep, - name_prefix=file_head, - name_suffix=extension, - start_frame=frame_start, - frame_zero_padding=padding, - rate=fps, - available_range=create_otio_time_range( - frame_start, - duration, - fps - ) - ) - except AttributeError: - pass - - if not otio_ex_ref_item: - dirname, file_name = os.path.split(path) - file_name = utils.get_reformatted_filename(file_name, padded=False) - reformated_path = os.path.join(dirname, file_name) - # in case old OTIO or video file create `ExternalReference` - otio_ex_ref_item = otio.schema.ExternalReference( - target_url=reformated_path, - available_range=create_otio_time_range( - frame_start, - duration, - fps - ) - ) - - # add metadata to otio item - add_otio_metadata(otio_ex_ref_item, clip_data, **metadata) - - return otio_ex_ref_item - - -def create_otio_clip(clip_data): - from ayon_flame.api import MediaInfoFile, TimeEffectMetadata - - segment = clip_data["PySegment"] - - # calculate source in - media_info = MediaInfoFile(clip_data["fpath"], logger=log) - media_timecode_start = media_info.start_frame - media_fps = media_info.fps - - # Timewarp metadata - tw_data = TimeEffectMetadata(segment, logger=log).data - log.debug("__ tw_data: {}".format(tw_data)) - - # define first frame - file_first_frame = utils.get_frame_from_filename( - clip_data["fpath"]) - if file_first_frame: - file_first_frame = int(file_first_frame) - - first_frame = media_timecode_start or file_first_frame or 0 - - _clip_source_in = int(clip_data["source_in"]) - _clip_source_out = int(clip_data["source_out"]) - _clip_record_in = clip_data["record_in"] - _clip_record_out = clip_data["record_out"] - _clip_record_duration = int(clip_data["record_duration"]) - - log.debug("_ file_first_frame: {}".format(file_first_frame)) - log.debug("_ first_frame: {}".format(first_frame)) - log.debug("_ _clip_source_in: {}".format(_clip_source_in)) - log.debug("_ _clip_source_out: {}".format(_clip_source_out)) - log.debug("_ _clip_record_in: {}".format(_clip_record_in)) - log.debug("_ _clip_record_out: {}".format(_clip_record_out)) - - # first solve if the reverse timing - speed = 1 - if clip_data["source_in"] > clip_data["source_out"]: - source_in = _clip_source_out - int(first_frame) - source_out = _clip_source_in - int(first_frame) - speed = -1 - else: - source_in = _clip_source_in - int(first_frame) - source_out = _clip_source_out - int(first_frame) - - log.debug("_ source_in: {}".format(source_in)) - log.debug("_ source_out: {}".format(source_out)) - - if file_first_frame: - log.debug("_ file_source_in: {}".format( - file_first_frame + source_in)) - log.debug("_ file_source_in: {}".format( - file_first_frame + source_out)) - - source_duration = (source_out - source_in + 1) - - # secondly check if any change of speed - if source_duration != _clip_record_duration: - retime_speed = float(source_duration) / float(_clip_record_duration) - log.debug("_ calculated speed: {}".format(retime_speed)) - speed *= retime_speed - - # get speed from metadata if available - if tw_data.get("speed"): - speed = tw_data["speed"] - log.debug("_ metadata speed: {}".format(speed)) - - log.debug("_ speed: {}".format(speed)) - log.debug("_ source_duration: {}".format(source_duration)) - log.debug("_ _clip_record_duration: {}".format(_clip_record_duration)) - - # create media reference - media_reference = create_otio_reference( - clip_data, media_fps) - - # creatae source range - source_range = create_otio_time_range( - source_in, - _clip_record_duration, - CTX.get_fps() - ) - - otio_clip = otio.schema.Clip( - name=clip_data["segment_name"], - source_range=source_range, - media_reference=media_reference - ) - - # Add markers - if MARKERS_INCLUDE: - create_otio_markers(otio_clip, segment) - - if speed != 1: - create_time_effects(otio_clip, speed) - - return otio_clip - - -def create_otio_gap(gap_start, clip_start, tl_start_frame, fps): - return otio.schema.Gap( - source_range=create_otio_time_range( - gap_start, - (clip_start - tl_start_frame) - gap_start, - fps - ) - ) - - -def _get_colourspace_policy(): - - output = {} - # get policies project path - policy_dir = "/opt/Autodesk/project/{}/synColor/policy".format( - CTX.project.name - ) - log.debug(policy_dir) - policy_fp = os.path.join(policy_dir, "policy.cfg") - - if not os.path.exists(policy_fp): - return output - - with open(policy_fp) as file: - dict_conf = dict(line.strip().split(' = ', 1) for line in file) - output.update( - {"openpype.flame.{}".format(k): v for k, v in dict_conf.items()} - ) - return output - - -def _create_otio_timeline(sequence): - - metadata = _get_metadata(sequence) - - # find colour policy files and add them to metadata - colorspace_policy = _get_colourspace_policy() - metadata.update(colorspace_policy) - - metadata.update({ - "openpype.timeline.width": int(sequence.width), - "openpype.timeline.height": int(sequence.height), - "openpype.timeline.pixelAspect": 1 - }) - - rt_start_time = create_otio_rational_time( - CTX.get_tl_start_frame(), CTX.get_fps()) - - return otio.schema.Timeline( - name=str(sequence.name)[1:-1], - global_start_time=rt_start_time, - metadata=metadata - ) - - -def create_otio_track(track_type, track_name): - return otio.schema.Track( - name=track_name, - kind=TRACK_TYPES[track_type] - ) - - -def add_otio_gap(clip_data, otio_track, prev_out): - gap_length = clip_data["record_in"] - prev_out - if prev_out != 0: - gap_length -= 1 - - gap = otio.opentime.TimeRange( - duration=otio.opentime.RationalTime( - gap_length, - CTX.get_fps() - ) - ) - otio_gap = otio.schema.Gap(source_range=gap) - otio_track.append(otio_gap) - - -def add_otio_metadata(otio_item, item, **kwargs): - metadata = _get_metadata(item) - - # add additional metadata from kwargs - if kwargs: - metadata.update(kwargs) - - # add metadata to otio item metadata - for key, value in metadata.items(): - otio_item.metadata.update({key: value}) - - -def _get_shot_tokens_values(clip, tokens): - old_value = None - output = {} - - old_value = clip.shot_name.get_value() - - for token in tokens: - clip.shot_name.set_value(token) - _key = re.sub("[ <>]", "", token) - - try: - output[_key] = int(clip.shot_name.get_value()) - except ValueError: - output[_key] = clip.shot_name.get_value() - - clip.shot_name.set_value(old_value) - - return output - - -def _get_segment_attributes(segment): - - log.debug("Segment name|hidden: {}|{}".format( - segment.name.get_value(), segment.hidden - )) - if ( - segment.name.get_value() == "" - or segment.hidden.get_value() - ): - return None - - # Add timeline segment to tree - clip_data = { - "segment_name": segment.name.get_value(), - "segment_comment": segment.comment.get_value(), - "shot_name": segment.shot_name.get_value(), - "tape_name": segment.tape_name, - "source_name": segment.source_name, - "fpath": segment.file_path, - "PySegment": segment - } - - # add all available shot tokens - shot_tokens = _get_shot_tokens_values( - segment, - ["", "", "", ""] - ) - clip_data.update(shot_tokens) - - # populate shot source metadata - segment_attrs = [ - "record_duration", "record_in", "record_out", - "source_duration", "source_in", "source_out" - ] - segment_attrs_data = {} - for attr in segment_attrs: - if not hasattr(segment, attr): - continue - _value = getattr(segment, attr) - segment_attrs_data[attr] = str(_value).replace("+", ":") - - if attr in ["record_in", "record_out"]: - clip_data[attr] = _value.relative_frame - else: - clip_data[attr] = _value.frame - - clip_data["segment_timecodes"] = segment_attrs_data - - return clip_data - - -def create_otio_timeline(sequence): - log.info(dir(sequence)) - log.info(sequence.attributes) - - CTX.project = get_current_flame_project() - - # get current timeline - CTX.set_fps( - float(str(sequence.frame_rate)[:-4])) - - tl_start_frame = utils.timecode_to_frames( - str(sequence.start_time).replace("+", ":"), - CTX.get_fps() - ) - CTX.set_tl_start_frame(tl_start_frame) - - # convert timeline to otio - otio_timeline = _create_otio_timeline(sequence) - - # create otio tracks and clips - for ver in sequence.versions: - for track in ver.tracks: - # avoid all empty tracks - # or hidden tracks - if ( - len(track.segments) == 0 - or track.hidden.get_value() - ): - continue - - # convert track to otio - otio_track = create_otio_track( - "video", str(track.name)[1:-1]) - - all_segments = [] - for segment in track.segments: - clip_data = _get_segment_attributes(segment) - if not clip_data: - continue - all_segments.append(clip_data) - - segments_ordered = dict(enumerate(all_segments)) - log.debug("_ segments_ordered: {}".format( - pformat(segments_ordered) - )) - if not segments_ordered: - continue - - for itemindex, segment_data in segments_ordered.items(): - log.debug("_ itemindex: {}".format(itemindex)) - - # Add Gap if needed - prev_item = ( - segment_data - if itemindex == 0 - else segments_ordered[itemindex - 1] - ) - log.debug("_ segment_data: {}".format(segment_data)) - - # calculate clip frame range difference from each other - clip_diff = segment_data["record_in"] - prev_item["record_out"] - - # add gap if first track item is not starting - # at first timeline frame - if itemindex == 0 and segment_data["record_in"] > 0: - add_otio_gap(segment_data, otio_track, 0) - - # or add gap if following track items are having - # frame range differences from each other - elif itemindex and clip_diff != 1: - add_otio_gap( - segment_data, otio_track, prev_item["record_out"]) - - # create otio clip and add it to track - otio_clip = create_otio_clip(segment_data) - otio_track.append(otio_clip) - - log.debug("_ otio_clip: {}".format(otio_clip)) - - # create otio marker - # create otio metadata - - # add track to otio timeline - otio_timeline.tracks.append(otio_track) - - return otio_timeline - - -def write_to_file(otio_timeline, path): - otio.adapters.write_to_file(otio_timeline, path) diff --git a/server_addon/flame/client/ayon_flame/otio/utils.py b/server_addon/flame/client/ayon_flame/otio/utils.py deleted file mode 100644 index 5a28263fc2..0000000000 --- a/server_addon/flame/client/ayon_flame/otio/utils.py +++ /dev/null @@ -1,91 +0,0 @@ -import re -import opentimelineio as otio -import logging -log = logging.getLogger(__name__) - -FRAME_PATTERN = re.compile(r"[\._](\d+)[\.]") - - -def timecode_to_frames(timecode, framerate): - rt = otio.opentime.from_timecode(timecode, framerate) - return int(otio.opentime.to_frames(rt)) - - -def frames_to_timecode(frames, framerate): - rt = otio.opentime.from_frames(frames, framerate) - return otio.opentime.to_timecode(rt) - - -def frames_to_seconds(frames, framerate): - rt = otio.opentime.from_frames(frames, framerate) - return otio.opentime.to_seconds(rt) - - -def get_reformatted_filename(filename, padded=True): - """ - Return fixed python expression path - - Args: - filename (str): file name - - Returns: - type: string with reformatted path - - Example: - get_reformatted_filename("plate.1001.exr") > plate.%04d.exr - - """ - found = FRAME_PATTERN.search(filename) - - if not found: - log.info("File name is not sequence: {}".format(filename)) - return filename - - padding = get_padding_from_filename(filename) - - replacement = "%0{}d".format(padding) if padded else "%d" - start_idx, end_idx = found.span(1) - - return replacement.join( - [filename[:start_idx], filename[end_idx:]] - ) - - -def get_padding_from_filename(filename): - """ - Return padding number from Flame path style - - Args: - filename (str): file name - - Returns: - int: padding number - - Example: - get_padding_from_filename("plate.0001.exr") > 4 - - """ - found = get_frame_from_filename(filename) - - return len(found) if found else None - - -def get_frame_from_filename(filename): - """ - Return sequence number from Flame path style - - Args: - filename (str): file name - - Returns: - int: sequence frame number - - Example: - def get_frame_from_filename(path): - ("plate.0001.exr") > 0001 - - """ - - found = re.findall(FRAME_PATTERN, filename) - - return found.pop() if found else None diff --git a/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py b/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py deleted file mode 100644 index 120c8c559d..0000000000 --- a/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py +++ /dev/null @@ -1,307 +0,0 @@ -from copy import deepcopy -import ayon_flame.api as opfapi - - -class CreateShotClip(opfapi.Creator): - """Publishable clip""" - - label = "Create Publishable Clip" - product_type = "clip" - icon = "film" - defaults = ["Main"] - - presets = None - - def process(self): - # Creator copy of object attributes that are modified during `process` - presets = deepcopy(self.presets) - gui_inputs = self.get_gui_inputs() - - # get key pairs from presets and match it on ui inputs - for k, v in gui_inputs.items(): - if v["type"] in ("dict", "section"): - # nested dictionary (only one level allowed - # for sections and dict) - for _k, _v in v["value"].items(): - if presets.get(_k) is not None: - gui_inputs[k][ - "value"][_k]["value"] = presets[_k] - - if presets.get(k) is not None: - gui_inputs[k]["value"] = presets[k] - - # open widget for plugins inputs - results_back = self.create_widget( - "AYON publish attributes creator", - "Define sequential rename and fill hierarchy data.", - gui_inputs - ) - - if len(self.selected) < 1: - return - - if not results_back: - print("Operation aborted") - return - - # get ui output for track name for vertical sync - v_sync_track = results_back["vSyncTrack"]["value"] - - # sort selected trackItems by - sorted_selected_segments = [] - unsorted_selected_segments = [] - for _segment in self.selected: - if _segment.parent.name.get_value() in v_sync_track: - sorted_selected_segments.append(_segment) - else: - unsorted_selected_segments.append(_segment) - - sorted_selected_segments.extend(unsorted_selected_segments) - - kwargs = { - "log": self.log, - "ui_inputs": results_back, - "avalon": self.data, - "product_type": self.data["productType"] - } - - for i, segment in enumerate(sorted_selected_segments): - kwargs["rename_index"] = i - # convert track item to timeline media pool item - opfapi.PublishableClip(segment, **kwargs).convert() - - def get_gui_inputs(self): - gui_tracks = self._get_video_track_names( - opfapi.get_current_sequence(opfapi.CTX.selection) - ) - return deepcopy({ - "renameHierarchy": { - "type": "section", - "label": "Shot Hierarchy And Rename Settings", - "target": "ui", - "order": 0, - "value": { - "hierarchy": { - "value": "{folder}/{sequence}", - "type": "QLineEdit", - "label": "Shot Parent Hierarchy", - "target": "tag", - "toolTip": "Parents folder for shot root folder, Template filled with `Hierarchy Data` section", # noqa - "order": 0}, - "useShotName": { - "value": True, - "type": "QCheckBox", - "label": "Use Shot Name", - "target": "ui", - "toolTip": "Use name form Shot name clip attribute", # noqa - "order": 1}, - "clipRename": { - "value": False, - "type": "QCheckBox", - "label": "Rename clips", - "target": "ui", - "toolTip": "Renaming selected clips on fly", # noqa - "order": 2}, - "clipName": { - "value": "{sequence}{shot}", - "type": "QLineEdit", - "label": "Clip Name Template", - "target": "ui", - "toolTip": "template for creating shot namespaused for renaming (use rename: on)", # noqa - "order": 3}, - "segmentIndex": { - "value": True, - "type": "QCheckBox", - "label": "Segment index", - "target": "ui", - "toolTip": "Take number from segment index", # noqa - "order": 4}, - "countFrom": { - "value": 10, - "type": "QSpinBox", - "label": "Count sequence from", - "target": "ui", - "toolTip": "Set when the sequence number stafrom", # noqa - "order": 5}, - "countSteps": { - "value": 10, - "type": "QSpinBox", - "label": "Stepping number", - "target": "ui", - "toolTip": "What number is adding every new step", # noqa - "order": 6}, - } - }, - "hierarchyData": { - "type": "dict", - "label": "Shot Template Keywords", - "target": "tag", - "order": 1, - "value": { - "folder": { - "value": "shots", - "type": "QLineEdit", - "label": "{folder}", - "target": "tag", - "toolTip": "Name of folder used for root of generated shots.\nUsable tokens:\n\t{_clip_}: name of used clip\n\t{_track_}: name of parent track layer\n\t{_sequence_}: name of parent sequence (timeline)", # noqa - "order": 0}, - "episode": { - "value": "ep01", - "type": "QLineEdit", - "label": "{episode}", - "target": "tag", - "toolTip": "Name of episode.\nUsable tokens:\n\t{_clip_}: name of used clip\n\t{_track_}: name of parent track layer\n\t{_sequence_}: name of parent sequence (timeline)", # noqa - "order": 1}, - "sequence": { - "value": "sq01", - "type": "QLineEdit", - "label": "{sequence}", - "target": "tag", - "toolTip": "Name of sequence of shots.\nUsable tokens:\n\t{_clip_}: name of used clip\n\t{_track_}: name of parent track layer\n\t{_sequence_}: name of parent sequence (timeline)", # noqa - "order": 2}, - "track": { - "value": "{_track_}", - "type": "QLineEdit", - "label": "{track}", - "target": "tag", - "toolTip": "Name of sequence of shots.\nUsable tokens:\n\t{_clip_}: name of used clip\n\t{_track_}: name of parent track layer\n\t{_sequence_}: name of parent sequence (timeline)", # noqa - "order": 3}, - "shot": { - "value": "sh###", - "type": "QLineEdit", - "label": "{shot}", - "target": "tag", - "toolTip": "Name of shot. `#` is converted to paded number. \nAlso could be used with usable tokens:\n\t{_clip_}: name of used clip\n\t{_track_}: name of parent track layer\n\t{_sequence_}: name of parent sequence (timeline)", # noqa - "order": 4} - } - }, - "verticalSync": { - "type": "section", - "label": "Vertical Synchronization Of Attributes", - "target": "ui", - "order": 2, - "value": { - "vSyncOn": { - "value": True, - "type": "QCheckBox", - "label": "Enable Vertical Sync", - "target": "ui", - "toolTip": "Switch on if you want clips above each other to share its attributes", # noqa - "order": 0}, - "vSyncTrack": { - "value": gui_tracks, # noqa - "type": "QComboBox", - "label": "Hero track", - "target": "ui", - "toolTip": "Select driving track name which should be hero for all others", # noqa - "order": 1} - } - }, - "publishSettings": { - "type": "section", - "label": "Publish Settings", - "target": "ui", - "order": 3, - "value": { - "productName": { - "value": ["[ track name ]", "main", "bg", "fg", "bg", - "animatic"], - "type": "QComboBox", - "label": "Product Name", - "target": "ui", - "toolTip": "chose product name pattern, if [ track name ] is selected, name of track layer will be used", # noqa - "order": 0}, - "productType": { - "value": ["plate", "take"], - "type": "QComboBox", - "label": "Product Type", - "target": "ui", "toolTip": "What use of this product is for", # noqa - "order": 1}, - "reviewTrack": { - "value": ["< none >"] + gui_tracks, - "type": "QComboBox", - "label": "Use Review Track", - "target": "ui", - "toolTip": "Generate preview videos on fly, if `< none >` is defined nothing will be generated.", # noqa - "order": 2}, - "audio": { - "value": False, - "type": "QCheckBox", - "label": "Include audio", - "target": "tag", - "toolTip": "Process products with corresponding audio", # noqa - "order": 3}, - "sourceResolution": { - "value": False, - "type": "QCheckBox", - "label": "Source resolution", - "target": "tag", - "toolTip": "Is resolution taken from timeline or source?", # noqa - "order": 4}, - } - }, - "frameRangeAttr": { - "type": "section", - "label": "Shot Attributes", - "target": "ui", - "order": 4, - "value": { - "workfileFrameStart": { - "value": 1001, - "type": "QSpinBox", - "label": "Workfiles Start Frame", - "target": "tag", - "toolTip": "Set workfile starting frame number", # noqa - "order": 0 - }, - "handleStart": { - "value": 0, - "type": "QSpinBox", - "label": "Handle Start", - "target": "tag", - "toolTip": "Handle at start of clip", # noqa - "order": 1 - }, - "handleEnd": { - "value": 0, - "type": "QSpinBox", - "label": "Handle End", - "target": "tag", - "toolTip": "Handle at end of clip", # noqa - "order": 2 - }, - "includeHandles": { - "value": False, - "type": "QCheckBox", - "label": "Include handles", - "target": "tag", - "toolTip": "By default handles are excluded", # noqa - "order": 3 - }, - "retimedHandles": { - "value": True, - "type": "QCheckBox", - "label": "Retimed handles", - "target": "tag", - "toolTip": "By default handles are retimed.", # noqa - "order": 4 - }, - "retimedFramerange": { - "value": True, - "type": "QCheckBox", - "label": "Retimed framerange", - "target": "tag", - "toolTip": "By default framerange is retimed.", # noqa - "order": 5 - } - } - } - }) - - def _get_video_track_names(self, sequence): - track_names = [] - for ver in sequence.versions: - for track in ver.tracks: - track_names.append(track.name.get_value()) - - return track_names diff --git a/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py b/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py deleted file mode 100644 index c8ec7b36c9..0000000000 --- a/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py +++ /dev/null @@ -1,274 +0,0 @@ -from copy import deepcopy -import os -import flame -from pprint import pformat -import ayon_flame.api as opfapi -from ayon_core.lib import StringTemplate -from ayon_core.lib.transcoding import ( - VIDEO_EXTENSIONS, - IMAGE_EXTENSIONS -) - - -class LoadClip(opfapi.ClipLoader): - """Load a product to timeline as clip - - Place clip to timeline on its asset origin timings collected - during conforming to project - """ - - product_types = {"render2d", "source", "plate", "render", "review"} - representations = {"*"} - extensions = set( - ext.lstrip(".") for ext in IMAGE_EXTENSIONS.union(VIDEO_EXTENSIONS) - ) - - label = "Load as clip" - order = -10 - icon = "code-fork" - color = "orange" - - # settings - reel_group_name = "OpenPype_Reels" - reel_name = "Loaded" - clip_name_template = "{folder[name]}_{product[name]}<_{output}>" - - """ Anatomy keys from version context data and dynamically added: - - {layerName} - original layer name token - - {layerUID} - original layer UID token - - {originalBasename} - original clip name taken from file - """ - layer_rename_template = "{folder[name]}_{product[name]}<_{output}>" - layer_rename_patterns = [] - - def load(self, context, name, namespace, options): - - # get flame objects - fproject = flame.project.current_project - self.fpd = fproject.current_workspace.desktop - - # load clip to timeline and get main variables - version_entity = context["version"] - version_attributes = version_entity["attrib"] - version_name = version_entity["version"] - colorspace = self.get_colorspace(context) - - # in case output is not in context replace key to representation - if not context["representation"]["context"].get("output"): - self.clip_name_template = self.clip_name_template.replace( - "output", "representation") - self.layer_rename_template = self.layer_rename_template.replace( - "output", "representation") - - formatting_data = deepcopy(context["representation"]["context"]) - clip_name = StringTemplate(self.clip_name_template).format( - formatting_data) - - # convert colorspace with ocio to flame mapping - # in imageio flame section - colorspace = self.get_native_colorspace(colorspace) - self.log.info("Loading with colorspace: `{}`".format(colorspace)) - - # create workfile path - workfile_dir = os.environ["AYON_WORKDIR"] - openclip_dir = os.path.join( - workfile_dir, clip_name - ) - openclip_path = os.path.join( - openclip_dir, clip_name + ".clip" - ) - if not os.path.exists(openclip_dir): - os.makedirs(openclip_dir) - - # prepare clip data from context ad send it to openClipLoader - path = self.filepath_from_context(context) - loading_context = { - "path": path.replace("\\", "/"), - "colorspace": colorspace, - "version": "v{:0>3}".format(version_name), - "layer_rename_template": self.layer_rename_template, - "layer_rename_patterns": self.layer_rename_patterns, - "context_data": formatting_data - } - self.log.debug(pformat( - loading_context - )) - self.log.debug(openclip_path) - - # make openpype clip file - opfapi.OpenClipSolver( - openclip_path, loading_context, logger=self.log).make() - - # prepare Reel group in actual desktop - opc = self._get_clip( - clip_name, - openclip_path - ) - - # add additional metadata from the version to imprint Avalon knob - add_keys = [ - "frameStart", "frameEnd", "source", "author", - "fps", "handleStart", "handleEnd" - ] - - # move all version data keys to tag data - data_imprint = { - key: version_attributes.get(key, str(None)) - for key in add_keys - } - - # add variables related to version context - data_imprint.update({ - "version": version_name, - "colorspace": colorspace, - "objectName": clip_name - }) - - # TODO: finish the containerisation - # opc_segment = opfapi.get_clip_segment(opc) - - # return opfapi.containerise( - # opc_segment, - # name, namespace, context, - # self.__class__.__name__, - # data_imprint) - - return opc - - def _get_clip(self, name, clip_path): - reel = self._get_reel() - # with maintained openclip as opc - matching_clip = [cl for cl in reel.clips - if cl.name.get_value() == name] - if matching_clip: - return matching_clip.pop() - else: - created_clips = flame.import_clips(str(clip_path), reel) - return created_clips.pop() - - def _get_reel(self): - - matching_rgroup = [ - rg for rg in self.fpd.reel_groups - if rg.name.get_value() == self.reel_group_name - ] - - if not matching_rgroup: - reel_group = self.fpd.create_reel_group(str(self.reel_group_name)) - for _r in reel_group.reels: - if "reel" not in _r.name.get_value().lower(): - continue - self.log.debug("Removing: {}".format(_r.name)) - flame.delete(_r) - else: - reel_group = matching_rgroup.pop() - - matching_reel = [ - re for re in reel_group.reels - if re.name.get_value() == self.reel_name - ] - - if not matching_reel: - reel_group = reel_group.create_reel(str(self.reel_name)) - else: - reel_group = matching_reel.pop() - - return reel_group - - def _get_segment_from_clip(self, clip): - # unwrapping segment from input clip - pass - - # def switch(self, container, context): - # self.update(container, context) - - # def update(self, container, context): - # """ Updating previously loaded clips - # """ - # # load clip to timeline and get main variables - # repre_entity = context['representation'] - # name = container['name'] - # namespace = container['namespace'] - # track_item = phiero.get_track_items( - # track_item_name=namespace) - # version = io.find_one({ - # "type": "version", - # "id": repre_entity["versionId"] - # }) - # version_data = version.get("data", {}) - # version_name = version.get("name", None) - # colorspace = version_data.get("colorSpace", None) - # object_name = "{}_{}".format(name, namespace) - # file = get_representation_path(repre_entity).replace("\\", "/") - # clip = track_item.source() - - # # reconnect media to new path - # clip.reconnectMedia(file) - - # # set colorspace - # if colorspace: - # clip.setSourceMediaColourTransform(colorspace) - - # # add additional metadata from the version to imprint Avalon knob - # add_keys = [ - # "frameStart", "frameEnd", "source", "author", - # "fps", "handleStart", "handleEnd" - # ] - - # # move all version data keys to tag data - # data_imprint = {} - # for key in add_keys: - # data_imprint.update({ - # key: version_data.get(key, str(None)) - # }) - - # # add variables related to version context - # data_imprint.update({ - # "representation": repre_entity["id"], - # "version": version_name, - # "colorspace": colorspace, - # "objectName": object_name - # }) - - # # update color of clip regarding the version order - # self.set_item_color(track_item, version) - - # return phiero.update_container(track_item, data_imprint) - - # def remove(self, container): - # """ Removing previously loaded clips - # """ - # # load clip to timeline and get main variables - # namespace = container['namespace'] - # track_item = phiero.get_track_items( - # track_item_name=namespace) - # track = track_item.parent() - - # # remove track item from track - # track.removeItem(track_item) - - # @classmethod - # def multiselection(cls, track_item): - # if not cls.track: - # cls.track = track_item.parent() - # cls.sequence = cls.track.parent() - - # @classmethod - # def set_item_color(cls, track_item, version): - - # clip = track_item.source() - # # define version name - # version_name = version.get("name", None) - # # get all versions in list - # versions = io.find({ - # "type": "version", - # "parent": version["parent"] - # }).distinct('name') - - # max_version = max(versions) - - # # set clip colour - # if version_name == max_version: - # clip.binItem().setColor(cls.clip_color_last) - # else: - # clip.binItem().setColor(cls.clip_color) diff --git a/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py b/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py deleted file mode 100644 index 0d7a125af7..0000000000 --- a/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py +++ /dev/null @@ -1,180 +0,0 @@ -from copy import deepcopy -import os -import flame -from pprint import pformat -import ayon_flame.api as opfapi -from ayon_core.lib import StringTemplate -from ayon_core.lib.transcoding import ( - VIDEO_EXTENSIONS, - IMAGE_EXTENSIONS -) - -class LoadClipBatch(opfapi.ClipLoader): - """Load a product to timeline as clip - - Place clip to timeline on its asset origin timings collected - during conforming to project - """ - - product_types = {"render2d", "source", "plate", "render", "review"} - representations = {"*"} - extensions = set( - ext.lstrip(".") for ext in IMAGE_EXTENSIONS.union(VIDEO_EXTENSIONS) - ) - - label = "Load as clip to current batch" - order = -10 - icon = "code-fork" - color = "orange" - - # settings - reel_name = "OP_LoadedReel" - clip_name_template = "{batch}_{folder[name]}_{product[name]}<_{output}>" - - """ Anatomy keys from version context data and dynamically added: - - {layerName} - original layer name token - - {layerUID} - original layer UID token - - {originalBasename} - original clip name taken from file - """ - layer_rename_template = "{folder[name]}_{product[name]}<_{output}>" - layer_rename_patterns = [] - - def load(self, context, name, namespace, options): - - # get flame objects - self.batch = options.get("batch") or flame.batch - - # load clip to timeline and get main variables - version_entity = context["version"] - version_attributes =version_entity["attrib"] - version_name = version_entity["version"] - colorspace = self.get_colorspace(context) - - clip_name_template = self.clip_name_template - layer_rename_template = self.layer_rename_template - # in case output is not in context replace key to representation - if not context["representation"]["context"].get("output"): - clip_name_template = clip_name_template.replace( - "output", "representation") - layer_rename_template = layer_rename_template.replace( - "output", "representation") - - folder_entity = context["folder"] - product_entity = context["product"] - formatting_data = deepcopy(context["representation"]["context"]) - formatting_data["batch"] = self.batch.name.get_value() - formatting_data.update({ - "asset": folder_entity["name"], - "folder": { - "name": folder_entity["name"], - }, - "subset": product_entity["name"], - "family": product_entity["productType"], - "product": { - "name": product_entity["name"], - "type": product_entity["productType"], - } - }) - - clip_name = StringTemplate(clip_name_template).format( - formatting_data) - - # convert colorspace with ocio to flame mapping - # in imageio flame section - colorspace = self.get_native_colorspace(colorspace) - self.log.info("Loading with colorspace: `{}`".format(colorspace)) - - # create workfile path - workfile_dir = options.get("workdir") or os.environ["AYON_WORKDIR"] - openclip_dir = os.path.join( - workfile_dir, clip_name - ) - openclip_path = os.path.join( - openclip_dir, clip_name + ".clip" - ) - - if not os.path.exists(openclip_dir): - os.makedirs(openclip_dir) - - # prepare clip data from context and send it to openClipLoader - path = self.filepath_from_context(context) - loading_context = { - "path": path.replace("\\", "/"), - "colorspace": colorspace, - "version": "v{:0>3}".format(version_name), - "layer_rename_template": layer_rename_template, - "layer_rename_patterns": self.layer_rename_patterns, - "context_data": formatting_data - } - self.log.debug(pformat( - loading_context - )) - self.log.debug(openclip_path) - - # make openpype clip file - opfapi.OpenClipSolver( - openclip_path, loading_context, logger=self.log).make() - - # prepare Reel group in actual desktop - opc = self._get_clip( - clip_name, - openclip_path - ) - - # add additional metadata from the version to imprint Avalon knob - add_keys = [ - "frameStart", "frameEnd", "source", "author", - "fps", "handleStart", "handleEnd" - ] - - # move all version data keys to tag data - data_imprint = { - key: version_attributes.get(key, str(None)) - for key in add_keys - } - # add variables related to version context - data_imprint.update({ - "version": version_name, - "colorspace": colorspace, - "objectName": clip_name - }) - - # TODO: finish the containerisation - # opc_segment = opfapi.get_clip_segment(opc) - - # return opfapi.containerise( - # opc_segment, - # name, namespace, context, - # self.__class__.__name__, - # data_imprint) - - return opc - - def _get_clip(self, name, clip_path): - reel = self._get_reel() - - # with maintained openclip as opc - matching_clip = None - for cl in reel.clips: - if cl.name.get_value() != name: - continue - matching_clip = cl - - if not matching_clip: - created_clips = flame.import_clips(str(clip_path), reel) - return created_clips.pop() - - return matching_clip - - def _get_reel(self): - - matching_reel = [ - rg for rg in self.batch.reels - if rg.name.get_value() == self.reel_name - ] - - return ( - matching_reel.pop() - if matching_reel - else self.batch.create_reel(str(self.reel_name)) - ) diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py deleted file mode 100644 index dac2c862e6..0000000000 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py +++ /dev/null @@ -1,64 +0,0 @@ -import os -import pyblish.api -import tempfile -import ayon_flame.api as opfapi -from ayon_flame.otio import flame_export as otio_export -import opentimelineio as otio -from pprint import pformat -reload(otio_export) # noqa - - -@pyblish.api.log -class CollectTestSelection(pyblish.api.ContextPlugin): - """testing selection sharing - """ - - order = pyblish.api.CollectorOrder - label = "test selection" - hosts = ["flame"] - active = False - - def process(self, context): - self.log.info( - "Active Selection: {}".format(opfapi.CTX.selection)) - - sequence = opfapi.get_current_sequence(opfapi.CTX.selection) - - self.test_imprint_data(sequence) - self.test_otio_export(sequence) - - def test_otio_export(self, sequence): - test_dir = os.path.normpath( - tempfile.mkdtemp(prefix="test_pyblish_tmp_") - ) - export_path = os.path.normpath( - os.path.join( - test_dir, "otio_timeline_export.otio" - ) - ) - otio_timeline = otio_export.create_otio_timeline(sequence) - otio_export.write_to_file( - otio_timeline, export_path - ) - read_timeline_otio = otio.adapters.read_from_file(export_path) - - if otio_timeline != read_timeline_otio: - raise Exception("Exported timeline is different from original") - - self.log.info(pformat(otio_timeline)) - self.log.info("Otio exported to: {}".format(export_path)) - - def test_imprint_data(self, sequence): - with opfapi.maintained_segment_selection(sequence) as sel_segments: - for segment in sel_segments: - if str(segment.name)[1:-1] == "": - continue - - self.log.debug("Segment with OpenPypeData: {}".format( - segment.name)) - - opfapi.imprint(segment, { - 'asset': segment.name.get_value(), - 'productType': 'render', - 'productName': 'productMain' - }) diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py deleted file mode 100644 index 7680483db1..0000000000 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py +++ /dev/null @@ -1,419 +0,0 @@ -import re -from types import NoneType -import pyblish -import ayon_flame.api as opfapi -from ayon_flame.otio import flame_export -from ayon_core.pipeline import AYON_INSTANCE_ID, AVALON_INSTANCE_ID -from ayon_core.pipeline.editorial import ( - is_overlapping_otio_ranges, - get_media_range_with_retimes -) - -# # developer reload modules -from pprint import pformat - -# constatns -NUM_PATERN = re.compile(r"([0-9\.]+)") -TXT_PATERN = re.compile(r"([a-zA-Z]+)") - - -class CollectTimelineInstances(pyblish.api.ContextPlugin): - """Collect all Timeline segment selection.""" - - order = pyblish.api.CollectorOrder - 0.09 - label = "Collect timeline Instances" - hosts = ["flame"] - - settings_category = "flame" - - audio_track_items = [] - - # settings - xml_preset_attrs_from_comments = [] - add_tasks = [] - - def process(self, context): - selected_segments = context.data["flameSelectedSegments"] - self.log.debug("__ selected_segments: {}".format(selected_segments)) - - self.otio_timeline = context.data["otioTimeline"] - self.fps = context.data["fps"] - - # process all selected - for segment in selected_segments: - # get openpype tag data - marker_data = opfapi.get_segment_data_marker(segment) - - self.log.debug("__ marker_data: {}".format( - pformat(marker_data))) - - if not marker_data: - continue - - if marker_data.get("id") not in { - AYON_INSTANCE_ID, AVALON_INSTANCE_ID - }: - continue - - self.log.debug("__ segment.name: {}".format( - segment.name - )) - - comment_attributes = self._get_comment_attributes(segment) - - self.log.debug("_ comment_attributes: {}".format( - pformat(comment_attributes))) - - clip_data = opfapi.get_segment_attributes(segment) - clip_name = clip_data["segment_name"] - self.log.debug("clip_name: {}".format(clip_name)) - - # get otio clip data - otio_data = self._get_otio_clip_instance_data(clip_data) or {} - self.log.debug("__ otio_data: {}".format(pformat(otio_data))) - - # get file path - file_path = clip_data["fpath"] - - first_frame = opfapi.get_frame_from_filename(file_path) or 0 - - head, tail = self._get_head_tail( - clip_data, - otio_data["otioClip"], - marker_data["handleStart"], - marker_data["handleEnd"] - ) - - # make sure there is not NoneType rather 0 - if isinstance(head, NoneType): - head = 0 - if isinstance(tail, NoneType): - tail = 0 - - # make sure value is absolute - if head != 0: - head = abs(head) - if tail != 0: - tail = abs(tail) - - # solve handles length - marker_data["handleStart"] = min( - marker_data["handleStart"], head) - marker_data["handleEnd"] = min( - marker_data["handleEnd"], tail) - - # Backward compatibility fix of 'entity_type' > 'folder_type' - if "parents" in marker_data: - for parent in marker_data["parents"]: - if "entity_type" in parent: - parent["folder_type"] = parent.pop("entity_type") - - workfile_start = self._set_workfile_start(marker_data) - - with_audio = bool(marker_data.pop("audio")) - - # add marker data to instance data - inst_data = dict(marker_data.items()) - - # add ocio_data to instance data - inst_data.update(otio_data) - - folder_path = marker_data["folderPath"] - folder_name = folder_path.rsplit("/")[-1] - product_name = marker_data["productName"] - - # insert product type into families - product_type = marker_data["productType"] - families = [str(f) for f in marker_data["families"]] - families.insert(0, str(product_type)) - - # form label - label = folder_name - if folder_name != clip_name: - label += " ({})".format(clip_name) - label += " {} [{}]".format(product_name, ", ".join(families)) - - inst_data.update({ - "name": "{}_{}".format(folder_name, product_name), - "label": label, - "folderPath": folder_path, - "item": segment, - "families": families, - "publish": marker_data["publish"], - "fps": self.fps, - "workfileFrameStart": workfile_start, - "sourceFirstFrame": int(first_frame), - "retimedHandles": marker_data.get("retimedHandles"), - "shotDurationFromSource": ( - not marker_data.get("retimedFramerange")), - "path": file_path, - "flameAddTasks": self.add_tasks, - "tasks": { - task["name"]: {"type": task["type"]} - for task in self.add_tasks}, - "representations": [], - "newHierarchyIntegration": True, - # Backwards compatible (Deprecated since 24/06/06) - "newAssetPublishing": True, - }) - self.log.debug("__ inst_data: {}".format(pformat(inst_data))) - - # add resolution - self._get_resolution_to_data(inst_data, context) - - # add comment attributes if any - inst_data.update(comment_attributes) - - # create instance - instance = context.create_instance(**inst_data) - - # add colorspace data - instance.data.update({ - "versionData": { - "colorspace": clip_data["colour_space"], - } - }) - - # create shot instance for shot attributes create/update - self._create_shot_instance(context, clip_name, **inst_data) - - self.log.info("Creating instance: {}".format(instance)) - self.log.info( - "_ instance.data: {}".format(pformat(instance.data))) - - if not with_audio: - continue - - # add audioReview attribute to plate instance data - # if reviewTrack is on - if marker_data.get("reviewTrack") is not None: - instance.data["reviewAudio"] = True - - @staticmethod - def _set_workfile_start(data): - include_handles = data.get("includeHandles") - workfile_start = data["workfileFrameStart"] - handle_start = data["handleStart"] - - if include_handles: - workfile_start += handle_start - - return workfile_start - - def _get_comment_attributes(self, segment): - comment = segment.comment.get_value() - - # try to find attributes - attributes = { - "xml_overrides": { - "pixelRatio": 1.00} - } - # search for `:` - for split in self._split_comments(comment): - # make sure we ignore if not `:` in key - if ":" not in split: - continue - - self._get_xml_preset_attrs( - attributes, split) - - # add xml overrides resolution to instance data - xml_overrides = attributes["xml_overrides"] - if xml_overrides.get("width"): - attributes.update({ - "resolutionWidth": xml_overrides["width"], - "resolutionHeight": xml_overrides["height"], - "pixelAspect": xml_overrides["pixelRatio"] - }) - - return attributes - - def _get_xml_preset_attrs(self, attributes, split): - - # split to key and value - key, value = split.split(":") - - for attr_data in self.xml_preset_attrs_from_comments: - a_name = attr_data["name"] - a_type = attr_data["type"] - - # exclude all not related attributes - if a_name.lower() not in key.lower(): - continue - - # get pattern defined by type - pattern = TXT_PATERN - if a_type in ("number", "float"): - pattern = NUM_PATERN - - res_goup = pattern.findall(value) - - # raise if nothing is found as it is not correctly defined - if not res_goup: - raise ValueError(( - "Value for `{}` attribute is not " - "set correctly: `{}`").format(a_name, split)) - - if "string" in a_type: - _value = res_goup[0] - if "float" in a_type: - _value = float(res_goup[0]) - if "number" in a_type: - _value = int(res_goup[0]) - - attributes["xml_overrides"][a_name] = _value - - # condition for resolution in key - if "resolution" in key.lower(): - res_goup = NUM_PATERN.findall(value) - # check if axpect was also defined - # 1920x1080x1.5 - aspect = res_goup[2] if len(res_goup) > 2 else 1 - - width = int(res_goup[0]) - height = int(res_goup[1]) - pixel_ratio = float(aspect) - attributes["xml_overrides"].update({ - "width": width, - "height": height, - "pixelRatio": pixel_ratio - }) - - def _split_comments(self, comment_string): - # first split comment by comma - split_comments = [] - if "," in comment_string: - split_comments.extend(comment_string.split(",")) - elif ";" in comment_string: - split_comments.extend(comment_string.split(";")) - else: - split_comments.append(comment_string) - - return split_comments - - def _get_head_tail(self, clip_data, otio_clip, handle_start, handle_end): - # calculate head and tail with forward compatibility - head = clip_data.get("segment_head") - tail = clip_data.get("segment_tail") - self.log.debug("__ head: `{}`".format(head)) - self.log.debug("__ tail: `{}`".format(tail)) - - # HACK: it is here to serve for versions below 2021.1 - if not any([head, tail]): - retimed_attributes = get_media_range_with_retimes( - otio_clip, handle_start, handle_end) - self.log.debug( - ">> retimed_attributes: {}".format(retimed_attributes)) - - # retimed head and tail - head = int(retimed_attributes["handleStart"]) - tail = int(retimed_attributes["handleEnd"]) - - return head, tail - - def _get_resolution_to_data(self, data, context): - assert data.get("otioClip"), "Missing `otioClip` data" - - # solve source resolution option - if data.get("sourceResolution", None): - otio_clip_metadata = data[ - "otioClip"].media_reference.metadata - data.update({ - "resolutionWidth": otio_clip_metadata[ - "openpype.source.width"], - "resolutionHeight": otio_clip_metadata[ - "openpype.source.height"], - "pixelAspect": otio_clip_metadata[ - "openpype.source.pixelAspect"] - }) - else: - otio_tl_metadata = context.data["otioTimeline"].metadata - data.update({ - "resolutionWidth": otio_tl_metadata["openpype.timeline.width"], - "resolutionHeight": otio_tl_metadata[ - "openpype.timeline.height"], - "pixelAspect": otio_tl_metadata[ - "openpype.timeline.pixelAspect"] - }) - - def _create_shot_instance(self, context, clip_name, **data): - master_layer = data.get("heroTrack") - hierarchy_data = data.get("hierarchyData") - - if not master_layer: - return - - if not hierarchy_data: - return - - folder_path = data["folderPath"] - folder_name = folder_path.rsplit("/")[-1] - product_name = "shotMain" - - # insert product type into families - product_type = "shot" - - # form label - label = folder_name - if folder_name != clip_name: - label += " ({}) ".format(clip_name) - label += " {}".format(product_name) - label += " [{}]".format(product_type) - - data.update({ - "name": "{}_{}".format(folder_name, product_name), - "label": label, - "productName": product_name, - "folderPath": folder_path, - "productType": product_type, - "family": product_type, - "families": [product_type] - }) - - instance = context.create_instance(**data) - self.log.info("Creating instance: {}".format(instance)) - self.log.debug( - "_ instance.data: {}".format(pformat(instance.data))) - - def _get_otio_clip_instance_data(self, clip_data): - """ - Return otio objects for timeline, track and clip - - Args: - timeline_item_data (dict): timeline_item_data from list returned by - resolve.get_current_timeline_items() - otio_timeline (otio.schema.Timeline): otio object - - Returns: - dict: otio clip object - - """ - segment = clip_data["PySegment"] - s_track_name = segment.parent.name.get_value() - timeline_range = self._create_otio_time_range_from_timeline_item_data( - clip_data) - - for otio_clip in self.otio_timeline.each_clip(): - track_name = otio_clip.parent().name - parent_range = otio_clip.range_in_parent() - if s_track_name not in track_name: - continue - if otio_clip.name not in segment.name.get_value(): - continue - if is_overlapping_otio_ranges( - parent_range, timeline_range, strict=True): - - # add pypedata marker to otio_clip metadata - for marker in otio_clip.markers: - if opfapi.MARKER_NAME in marker.name: - otio_clip.metadata.update(marker.metadata) - return {"otioClip": otio_clip} - - return None - - def _create_otio_time_range_from_timeline_item_data(self, clip_data): - frame_start = int(clip_data["record_in"]) - frame_duration = int(clip_data["record_duration"]) - - return flame_export.create_otio_time_range( - frame_start, frame_duration, self.fps) diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py deleted file mode 100644 index 139ac5b875..0000000000 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py +++ /dev/null @@ -1,67 +0,0 @@ -import pyblish.api - -import ayon_flame.api as opfapi -from ayon_flame.otio import flame_export -from ayon_core.pipeline.create import get_product_name - - -class CollecTimelineOTIO(pyblish.api.ContextPlugin): - """Inject the current working context into publish context""" - - label = "Collect Timeline OTIO" - order = pyblish.api.CollectorOrder - 0.099 - - def process(self, context): - # plugin defined - product_type = "workfile" - variant = "otioTimeline" - - # main - folder_entity = context.data["folderEntity"] - project = opfapi.get_current_project() - sequence = opfapi.get_current_sequence(opfapi.CTX.selection) - - # create product name - task_entity = context.data["taskEntity"] - task_name = task_type = None - if task_entity: - task_name = task_entity["name"] - task_type = task_entity["taskType"] - product_name = get_product_name( - context.data["projectName"], - task_name, - task_type, - context.data["hostName"], - product_type, - variant, - project_settings=context.data["project_settings"] - ) - - # adding otio timeline to context - with opfapi.maintained_segment_selection(sequence) as selected_seg: - otio_timeline = flame_export.create_otio_timeline(sequence) - - instance_data = { - "name": product_name, - "folderPath": folder_entity["path"], - "productName": product_name, - "productType": product_type, - "family": product_type, - "families": [product_type] - } - - # create instance with workfile - instance = context.create_instance(**instance_data) - self.log.info("Creating instance: {}".format(instance)) - - # update context with main project attributes - context.data.update({ - "flameProject": project, - "flameSequence": sequence, - "otioTimeline": otio_timeline, - "currentFile": "Flame/{}/{}".format( - project.name, sequence.name - ), - "flameSelectedSegments": selected_seg, - "fps": float(str(sequence.frame_rate)[:-4]) - }) diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/extract_otio_file.py b/server_addon/flame/client/ayon_flame/plugins/publish/extract_otio_file.py deleted file mode 100644 index 41ae981cba..0000000000 --- a/server_addon/flame/client/ayon_flame/plugins/publish/extract_otio_file.py +++ /dev/null @@ -1,43 +0,0 @@ -import os -import pyblish.api -import opentimelineio as otio -from ayon_core.pipeline import publish - - -class ExtractOTIOFile(publish.Extractor): - """ - Extractor export OTIO file - """ - - label = "Extract OTIO file" - order = pyblish.api.ExtractorOrder - 0.45 - families = ["workfile"] - hosts = ["flame"] - - def process(self, instance): - # create representation data - if "representations" not in instance.data: - instance.data["representations"] = [] - - name = instance.data["name"] - staging_dir = self.staging_dir(instance) - - otio_timeline = instance.context.data["otioTimeline"] - # create otio timeline representation - otio_file_name = name + ".otio" - otio_file_path = os.path.join(staging_dir, otio_file_name) - - # export otio file to temp dir - otio.adapters.write_to_file(otio_timeline, otio_file_path) - - representation_otio = { - 'name': "otio", - 'ext': "otio", - 'files': otio_file_name, - "stagingDir": staging_dir, - } - - instance.data["representations"].append(representation_otio) - - self.log.info("Added OTIO file representation: {}".format( - representation_otio)) diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py deleted file mode 100644 index 66c6181ffb..0000000000 --- a/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py +++ /dev/null @@ -1,560 +0,0 @@ -import os -import re -from copy import deepcopy - -import pyblish.api - -from ayon_core.pipeline import publish -from ayon_flame import api as opfapi -from ayon_flame.api import MediaInfoFile -from ayon_core.pipeline.editorial import ( - get_media_range_with_retimes -) - -import flame - - -class ExtractProductResources(publish.Extractor): - """ - Extractor for transcoding files from Flame clip - """ - - label = "Extract product resources" - order = pyblish.api.ExtractorOrder - families = ["clip"] - hosts = ["flame"] - - settings_category = "flame" - - # plugin defaults - keep_original_representation = False - - default_presets = { - "thumbnail": { - "active": True, - "ext": "jpg", - "xml_preset_file": "Jpeg (8-bit).xml", - "xml_preset_dir": "", - "export_type": "File Sequence", - "parsed_comment_attrs": False, - "colorspace_out": "Output - sRGB", - "representation_add_range": False, - "representation_tags": ["thumbnail"], - "path_regex": ".*" - } - } - - # hide publisher during exporting - hide_ui_on_process = True - - # settings - export_presets_mapping = [] - - def process(self, instance): - if not self.keep_original_representation: - # remove previeous representation if not needed - instance.data["representations"] = [] - - # flame objects - segment = instance.data["item"] - folder_path = instance.data["folderPath"] - segment_name = segment.name.get_value() - clip_path = instance.data["path"] - sequence_clip = instance.context.data["flameSequence"] - - # segment's parent track name - s_track_name = segment.parent.name.get_value() - - # get configured workfile frame start/end (handles excluded) - frame_start = instance.data["frameStart"] - # get media source first frame - source_first_frame = instance.data["sourceFirstFrame"] - - self.log.debug("_ frame_start: {}".format(frame_start)) - self.log.debug("_ source_first_frame: {}".format(source_first_frame)) - - # get timeline in/out of segment - clip_in = instance.data["clipIn"] - clip_out = instance.data["clipOut"] - - # get retimed attributres - retimed_data = self._get_retimed_attributes(instance) - - # get individual keys - retimed_handle_start = retimed_data["handle_start"] - retimed_handle_end = retimed_data["handle_end"] - retimed_source_duration = retimed_data["source_duration"] - retimed_speed = retimed_data["speed"] - - # get handles value - take only the max from both - handle_start = instance.data["handleStart"] - handle_end = instance.data["handleEnd"] - handles = max(handle_start, handle_end) - include_handles = instance.data.get("includeHandles") - retimed_handles = instance.data.get("retimedHandles") - - # get media source range with handles - source_start_handles = instance.data["sourceStartH"] - source_end_handles = instance.data["sourceEndH"] - - # retime if needed - if retimed_speed != 1.0: - if retimed_handles: - # handles are retimed - source_start_handles = ( - instance.data["sourceStart"] - retimed_handle_start) - source_end_handles = ( - source_start_handles - + (retimed_source_duration - 1) - + retimed_handle_start - + retimed_handle_end - ) - - else: - # handles are not retimed - source_end_handles = ( - source_start_handles - + (retimed_source_duration - 1) - + handle_start - + handle_end - ) - - # get frame range with handles for representation range - frame_start_handle = frame_start - handle_start - repre_frame_start = frame_start_handle - if include_handles: - if retimed_speed == 1.0 or not retimed_handles: - frame_start_handle = frame_start - else: - frame_start_handle = ( - frame_start - handle_start) + retimed_handle_start - - self.log.debug("_ frame_start_handle: {}".format( - frame_start_handle)) - self.log.debug("_ repre_frame_start: {}".format( - repre_frame_start)) - - # calculate duration with handles - source_duration_handles = ( - source_end_handles - source_start_handles) + 1 - - self.log.debug("_ source_duration_handles: {}".format( - source_duration_handles)) - - # create staging dir path - staging_dir = self.staging_dir(instance) - - # append staging dir for later cleanup - instance.context.data["cleanupFullPaths"].append(staging_dir) - - export_presets_mapping = {} - for preset_mapping in deepcopy(self.export_presets_mapping): - name = preset_mapping.pop("name") - export_presets_mapping[name] = preset_mapping - - # add default preset type for thumbnail and reviewable video - # update them with settings and override in case the same - # are found in there - _preset_keys = [k.split('_')[0] for k in export_presets_mapping] - export_presets = { - k: v - for k, v in deepcopy(self.default_presets).items() - if k not in _preset_keys - } - export_presets.update(export_presets_mapping) - - if not instance.data.get("versionData"): - instance.data["versionData"] = {} - - # set versiondata if any retime - version_data = retimed_data.get("version_data") - self.log.debug("_ version_data: {}".format(version_data)) - - if version_data: - instance.data["versionData"].update(version_data) - - # version data start frame - version_frame_start = frame_start - if include_handles: - version_frame_start = frame_start_handle - if retimed_speed != 1.0: - if retimed_handles: - instance.data["versionData"].update({ - "frameStart": version_frame_start, - "frameEnd": ( - (version_frame_start + source_duration_handles - 1) - - (retimed_handle_start + retimed_handle_end) - ) - }) - else: - instance.data["versionData"].update({ - "handleStart": handle_start, - "handleEnd": handle_end, - "frameStart": version_frame_start, - "frameEnd": ( - (version_frame_start + source_duration_handles - 1) - - (handle_start + handle_end) - ) - }) - self.log.debug("_ version_data: {}".format( - instance.data["versionData"] - )) - - # loop all preset names and - for unique_name, preset_config in export_presets.items(): - modify_xml_data = {} - - if self._should_skip(preset_config, clip_path, unique_name): - continue - - # get all presets attributes - extension = preset_config["ext"] - preset_file = preset_config["xml_preset_file"] - preset_dir = preset_config["xml_preset_dir"] - export_type = preset_config["export_type"] - repre_tags = preset_config["representation_tags"] - parsed_comment_attrs = preset_config["parsed_comment_attrs"] - color_out = preset_config["colorspace_out"] - - self.log.info( - "Processing `{}` as `{}` to `{}` type...".format( - preset_file, export_type, extension - ) - ) - - exporting_clip = None - name_patern_xml = "_{}.".format( - unique_name) - - if export_type == "Sequence Publish": - # change export clip to sequence - exporting_clip = flame.duplicate(sequence_clip) - - # only keep visible layer where instance segment is child - self.hide_others( - exporting_clip, segment_name, s_track_name) - - # change name pattern - name_patern_xml = ( - "__{}.").format( - unique_name) - - # only for h264 with baked retime - in_mark = clip_in - out_mark = clip_out + 1 - modify_xml_data.update({ - "exportHandles": True, - "nbHandles": handles - }) - else: - in_mark = (source_start_handles - source_first_frame) + 1 - out_mark = in_mark + source_duration_handles - exporting_clip = self.import_clip(clip_path) - exporting_clip.name.set_value("{}_{}".format( - folder_path, segment_name)) - - # add xml tags modifications - modify_xml_data.update({ - # enum position low start from 0 - "frameIndex": 0, - "startFrame": repre_frame_start, - "namePattern": name_patern_xml - }) - - if parsed_comment_attrs: - # add any xml overrides collected form segment.comment - modify_xml_data.update(instance.data["xml_overrides"]) - - self.log.debug("_ in_mark: {}".format(in_mark)) - self.log.debug("_ out_mark: {}".format(out_mark)) - - export_kwargs = {} - # validate xml preset file is filled - if preset_file == "": - raise ValueError( - ("Check Settings for {} preset: " - "`XML preset file` is not filled").format( - unique_name) - ) - - # resolve xml preset dir if not filled - if preset_dir == "": - preset_dir = opfapi.get_preset_path_by_xml_name( - preset_file) - - if not preset_dir: - raise ValueError( - ("Check Settings for {} preset: " - "`XML preset file` {} is not found").format( - unique_name, preset_file) - ) - - # create preset path - preset_orig_xml_path = str(os.path.join( - preset_dir, preset_file - )) - - # define kwargs based on preset type - if "thumbnail" in unique_name: - modify_xml_data.update({ - "video/posterFrame": True, - "video/useFrameAsPoster": 1, - "namePattern": "__thumbnail" - }) - thumb_frame_number = int(in_mark + ( - (out_mark - in_mark + 1) / 2)) - - self.log.debug("__ thumb_frame_number: {}".format( - thumb_frame_number - )) - - export_kwargs["thumb_frame_number"] = thumb_frame_number - else: - export_kwargs.update({ - "in_mark": in_mark, - "out_mark": out_mark - }) - - preset_path = opfapi.modify_preset_file( - preset_orig_xml_path, staging_dir, modify_xml_data) - - # get and make export dir paths - export_dir_path = str(os.path.join( - staging_dir, unique_name - )) - os.makedirs(export_dir_path) - - # export - opfapi.export_clip( - export_dir_path, exporting_clip, preset_path, **export_kwargs) - - repr_name = unique_name - # make sure only first segment is used if underscore in name - # HACK: `ftrackreview_withLUT` will result only in `ftrackreview` - if ( - "thumbnail" in unique_name - or "ftrackreview" in unique_name - ): - repr_name = unique_name.split("_")[0] - - # create representation data - representation_data = { - "name": repr_name, - "outputName": repr_name, - "ext": extension, - "stagingDir": export_dir_path, - "tags": repre_tags, - "data": { - "colorspace": color_out - }, - "load_to_batch_group": preset_config.get( - "load_to_batch_group"), - "batch_group_loader_name": preset_config.get( - "batch_group_loader_name") or None - } - - # collect all available content of export dir - files = os.listdir(export_dir_path) - - # make sure no nested folders inside - n_stage_dir, n_files = self._unfolds_nested_folders( - export_dir_path, files, extension) - - # fix representation in case of nested folders - if n_stage_dir: - representation_data["stagingDir"] = n_stage_dir - files = n_files - - # add files to representation but add - # imagesequence as list - if ( - # first check if path in files is not mov extension - [ - f for f in files - if os.path.splitext(f)[-1] == ".mov" - ] - # then try if thumbnail is not in unique name - or repr_name == "thumbnail" - ): - representation_data["files"] = files.pop() - else: - representation_data["files"] = files - - # add frame range - if preset_config["representation_add_range"]: - representation_data.update({ - "frameStart": repre_frame_start, - "frameEnd": ( - repre_frame_start + source_duration_handles) - 1, - "fps": instance.data["fps"] - }) - - instance.data["representations"].append(representation_data) - - # add review family if found in tags - if "review" in repre_tags: - instance.data["families"].append("review") - - self.log.info("Added representation: {}".format( - representation_data)) - - if export_type == "Sequence Publish": - # at the end remove the duplicated clip - flame.delete(exporting_clip) - - def _get_retimed_attributes(self, instance): - handle_start = instance.data["handleStart"] - handle_end = instance.data["handleEnd"] - - # get basic variables - otio_clip = instance.data["otioClip"] - - # get available range trimmed with processed retimes - retimed_attributes = get_media_range_with_retimes( - otio_clip, handle_start, handle_end) - self.log.debug( - ">> retimed_attributes: {}".format(retimed_attributes)) - - r_media_in = int(retimed_attributes["mediaIn"]) - r_media_out = int(retimed_attributes["mediaOut"]) - version_data = retimed_attributes.get("versionData") - - return { - "version_data": version_data, - "handle_start": int(retimed_attributes["handleStart"]), - "handle_end": int(retimed_attributes["handleEnd"]), - "source_duration": ( - (r_media_out - r_media_in) + 1 - ), - "speed": float(retimed_attributes["speed"]) - } - - def _should_skip(self, preset_config, clip_path, unique_name): - # get activating attributes - activated_preset = preset_config["active"] - filter_path_regex = preset_config.get("filter_path_regex") - - self.log.info( - "Preset `{}` is active `{}` with filter `{}`".format( - unique_name, activated_preset, filter_path_regex - ) - ) - - # skip if not activated presete - if not activated_preset: - return True - - # exclude by regex filter if any - if ( - filter_path_regex - and not re.search(filter_path_regex, clip_path) - ): - return True - - def _unfolds_nested_folders(self, stage_dir, files_list, ext): - """Unfolds nested folders - - Args: - stage_dir (str): path string with directory - files_list (list): list of file names - ext (str): extension (jpg)[without dot] - - Raises: - IOError: in case no files were collected form any directory - - Returns: - str, list: new staging dir path, new list of file names - or - None, None: In case single file in `files_list` - """ - # exclude single files which are having extension - # the same as input ext attr - if ( - # only one file in list - len(files_list) == 1 - # file is having extension as input - and ext in os.path.splitext(files_list[0])[-1] - ): - return None, None - elif ( - # more then one file in list - len(files_list) >= 1 - # extension is correct - and ext in os.path.splitext(files_list[0])[-1] - # test file exists - and os.path.exists( - os.path.join(stage_dir, files_list[0]) - ) - ): - return None, None - - new_stage_dir = None - new_files_list = [] - for file in files_list: - search_path = os.path.join(stage_dir, file) - if not os.path.isdir(search_path): - continue - for root, _dirs, files in os.walk(search_path): - for _file in files: - _fn, _ext = os.path.splitext(_file) - if ext.lower() != _ext[1:].lower(): - continue - new_files_list.append(_file) - if not new_stage_dir: - new_stage_dir = root - - if not new_stage_dir: - raise AssertionError( - "Files in `{}` are not correct! Check `{}`".format( - files_list, stage_dir) - ) - - return new_stage_dir, new_files_list - - def hide_others(self, sequence_clip, segment_name, track_name): - """Helper method used only if sequence clip is used - - Args: - sequence_clip (flame.Clip): sequence clip - segment_name (str): segment name - track_name (str): track name - """ - # create otio tracks and clips - for ver in sequence_clip.versions: - for track in ver.tracks: - if len(track.segments) == 0 and track.hidden.get_value(): - continue - - # hide tracks which are not parent track - if track.name.get_value() != track_name: - track.hidden = True - continue - - # hidde all other segments - for segment in track.segments: - if segment.name.get_value() != segment_name: - segment.hidden = True - - def import_clip(self, path): - """ - Import clip from path - """ - dir_path = os.path.dirname(path) - media_info = MediaInfoFile(path, logger=self.log) - file_pattern = media_info.file_pattern - self.log.debug("__ file_pattern: {}".format(file_pattern)) - - # rejoin the pattern to dir path - new_path = os.path.join(dir_path, file_pattern) - - clips = flame.import_clips(new_path) - self.log.info("Clips [{}] imported from `{}`".format(clips, path)) - - if not clips: - self.log.warning("Path `{}` is not having any clips".format(path)) - return None - elif len(clips) > 1: - self.log.warning( - "Path `{}` is containing more that one clip".format(path) - ) - return clips[0] diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py deleted file mode 100644 index f77c9e9116..0000000000 --- a/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py +++ /dev/null @@ -1,339 +0,0 @@ -import os -import copy -from collections import OrderedDict -from pprint import pformat -import pyblish -import ayon_flame.api as opfapi -import ayon_core.pipeline as op_pipeline -from ayon_core.pipeline.workfile import get_workdir - - -class IntegrateBatchGroup(pyblish.api.InstancePlugin): - """Integrate published shot to batch group""" - - order = pyblish.api.IntegratorOrder + 0.45 - label = "Integrate Batch Groups" - hosts = ["flame"] - families = ["clip"] - - settings_category = "flame" - - # settings - default_loader = "LoadClip" - - def process(self, instance): - add_tasks = instance.data["flameAddTasks"] - - # iterate all tasks from settings - for task_data in add_tasks: - # exclude batch group - if not task_data["create_batch_group"]: - continue - - # create or get already created batch group - bgroup = self._get_batch_group(instance, task_data) - - # add batch group content - all_batch_nodes = self._add_nodes_to_batch_with_links( - instance, task_data, bgroup) - - for name, node in all_batch_nodes.items(): - self.log.debug("name: {}, dir: {}".format( - name, dir(node) - )) - self.log.debug("__ node.attributes: {}".format( - node.attributes - )) - - # load plate to batch group - self.log.info("Loading product `{}` into batch `{}`".format( - instance.data["productName"], bgroup.name.get_value() - )) - self._load_clip_to_context(instance, bgroup) - - def _add_nodes_to_batch_with_links(self, instance, task_data, batch_group): - # get write file node properties > OrederDict because order does matter - write_pref_data = self._get_write_prefs(instance, task_data) - - batch_nodes = [ - { - "type": "comp", - "properties": {}, - "id": "comp_node01" - }, - { - "type": "Write File", - "properties": write_pref_data, - "id": "write_file_node01" - } - ] - batch_links = [ - { - "from_node": { - "id": "comp_node01", - "connector": "Result" - }, - "to_node": { - "id": "write_file_node01", - "connector": "Front" - } - } - ] - - # add nodes into batch group - return opfapi.create_batch_group_conent( - batch_nodes, batch_links, batch_group) - - def _load_clip_to_context(self, instance, bgroup): - # get all loaders for host - loaders_by_name = { - loader.__name__: loader - for loader in op_pipeline.discover_loader_plugins() - } - - # get all published representations - published_representations = instance.data["published_representations"] - repres_db_id_by_name = { - repre_info["representation"]["name"]: repre_id - for repre_id, repre_info in published_representations.items() - } - - # get all loadable representations - repres_by_name = { - repre["name"]: repre for repre in instance.data["representations"] - } - - # get repre_id for the loadable representations - loader_name_by_repre_id = { - repres_db_id_by_name[repr_name]: { - "loader": repr_data["batch_group_loader_name"], - # add repre data for exception logging - "_repre_data": repr_data - } - for repr_name, repr_data in repres_by_name.items() - if repr_data.get("load_to_batch_group") - } - - self.log.debug("__ loader_name_by_repre_id: {}".format(pformat( - loader_name_by_repre_id))) - - # get representation context from the repre_id - repre_contexts = op_pipeline.load.get_repres_contexts( - loader_name_by_repre_id.keys()) - - self.log.debug("__ repre_contexts: {}".format(pformat( - repre_contexts))) - - # loop all returned repres from repre_context dict - for repre_id, repre_context in repre_contexts.items(): - self.log.debug("__ repre_id: {}".format(repre_id)) - # get loader name by representation id - loader_name = ( - loader_name_by_repre_id[repre_id]["loader"] - # if nothing was added to settings fallback to default - or self.default_loader - ) - - # get loader plugin - loader_plugin = loaders_by_name.get(loader_name) - if loader_plugin: - # load to flame by representation context - try: - op_pipeline.load.load_with_repre_context( - loader_plugin, repre_context, **{ - "data": { - "workdir": self.task_workdir, - "batch": bgroup - } - }) - except op_pipeline.load.IncompatibleLoaderError as msg: - self.log.error( - "Check allowed representations for Loader `{}` " - "in settings > error: {}".format( - loader_plugin.__name__, msg)) - self.log.error( - "Representaton context >>{}<< is not compatible " - "with loader `{}`".format( - pformat(repre_context), loader_plugin.__name__ - ) - ) - else: - self.log.warning( - "Something got wrong and there is not Loader found for " - "following data: {}".format( - pformat(loader_name_by_repre_id)) - ) - - def _get_batch_group(self, instance, task_data): - frame_start = instance.data["frameStart"] - frame_end = instance.data["frameEnd"] - handle_start = instance.data["handleStart"] - handle_end = instance.data["handleEnd"] - frame_duration = (frame_end - frame_start) + 1 - folder_path = instance.data["folderPath"] - - task_name = task_data["name"] - batchgroup_name = "{}_{}".format(folder_path, task_name) - - batch_data = { - "shematic_reels": [ - "OP_LoadedReel" - ], - "handleStart": handle_start, - "handleEnd": handle_end - } - self.log.debug( - "__ batch_data: {}".format(pformat(batch_data))) - - # check if the batch group already exists - bgroup = opfapi.get_batch_group_from_desktop(batchgroup_name) - - if not bgroup: - self.log.info( - "Creating new batch group: {}".format(batchgroup_name)) - # create batch with utils - bgroup = opfapi.create_batch_group( - batchgroup_name, - frame_start, - frame_duration, - **batch_data - ) - - else: - self.log.info( - "Updating batch group: {}".format(batchgroup_name)) - # update already created batch group - bgroup = opfapi.create_batch_group( - batchgroup_name, - frame_start, - frame_duration, - update_batch_group=bgroup, - **batch_data - ) - - return bgroup - - def _get_anamoty_data_with_current_task(self, instance, task_data): - anatomy_data = copy.deepcopy(instance.data["anatomyData"]) - task_name = task_data["name"] - task_type = task_data["type"] - anatomy_obj = instance.context.data["anatomy"] - - # update task data in anatomy data - project_task_types = anatomy_obj["tasks"] - task_code = project_task_types.get(task_type, {}).get("shortName") - anatomy_data.update({ - "task": { - "name": task_name, - "type": task_type, - "short": task_code - } - }) - return anatomy_data - - def _get_write_prefs(self, instance, task_data): - # update task in anatomy data - anatomy_data = self._get_anamoty_data_with_current_task( - instance, task_data) - - self.task_workdir = self._get_shot_task_dir_path( - instance, task_data) - self.log.debug("__ task_workdir: {}".format( - self.task_workdir)) - - # TODO: this might be done with template in settings - render_dir_path = os.path.join( - self.task_workdir, "render", "flame") - - if not os.path.exists(render_dir_path): - os.makedirs(render_dir_path, mode=0o777) - - # TODO: add most of these to `imageio/flame/batch/write_node` - name = "{project[code]}_{folder[name]}_{task[name]}".format( - **anatomy_data - ) - - # The path attribute where the rendered clip is exported - # /path/to/file.[0001-0010].exr - media_path = render_dir_path - # name of file represented by tokens - media_path_pattern = ( - "_v/_v.") - # The Create Open Clip attribute of the Write File node. \ - # Determines if an Open Clip is created by the Write File node. - create_clip = True - # The Include Setup attribute of the Write File node. - # Determines if a Batch Setup file is created by the Write File node. - include_setup = True - # The path attribute where the Open Clip file is exported by - # the Write File node. - create_clip_path = "" - # The path attribute where the Batch setup file - # is exported by the Write File node. - include_setup_path = "./_v" - # The file type for the files written by the Write File node. - # Setting this attribute also overwrites format_extension, - # bit_depth and compress_mode to match the defaults for - # this file type. - file_type = "OpenEXR" - # The file extension for the files written by the Write File node. - # This attribute resets to match file_type whenever file_type - # is set. If you require a specific extension, you must - # set format_extension after setting file_type. - format_extension = "exr" - # The bit depth for the files written by the Write File node. - # This attribute resets to match file_type whenever file_type is set. - bit_depth = "16" - # The compressing attribute for the files exported by the Write - # File node. Only relevant when file_type in 'OpenEXR', 'Sgi', 'Tiff' - compress = True - # The compression format attribute for the specific File Types - # export by the Write File node. You must set compress_mode - # after setting file_type. - compress_mode = "DWAB" - # The frame index mode attribute of the Write File node. - # Value range: `Use Timecode` or `Use Start Frame` - frame_index_mode = "Use Start Frame" - frame_padding = 6 - # The versioning mode of the Open Clip exported by the Write File node. - # Only available if create_clip = True. - version_mode = "Follow Iteration" - version_name = "v" - version_padding = 3 - - # need to make sure the order of keys is correct - return OrderedDict(( - ("name", name), - ("media_path", media_path), - ("media_path_pattern", media_path_pattern), - ("create_clip", create_clip), - ("include_setup", include_setup), - ("create_clip_path", create_clip_path), - ("include_setup_path", include_setup_path), - ("file_type", file_type), - ("format_extension", format_extension), - ("bit_depth", bit_depth), - ("compress", compress), - ("compress_mode", compress_mode), - ("frame_index_mode", frame_index_mode), - ("frame_padding", frame_padding), - ("version_mode", version_mode), - ("version_name", version_name), - ("version_padding", version_padding) - )) - - def _get_shot_task_dir_path(self, instance, task_data): - project_entity = instance.data["projectEntity"] - folder_entity = instance.data["folderEntity"] - task_entity = instance.data["taskEntity"] - anatomy = instance.context.data["anatomy"] - project_settings = instance.context.data["project_settings"] - - return get_workdir( - project_entity, - folder_entity, - task_entity, - "flame", - anatomy=anatomy, - project_settings=project_settings - ) diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml deleted file mode 100644 index 44a7bd9770..0000000000 --- a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - sequence - Creates a 8-bit Jpeg file per segment. - - NONE - - <name> - True - True - - image - FX - NoChange - False - 10 - - True - False - - audio - FX - FlattenTracks - True - 10 - - - - - 4 - 1 - 2 - - diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml deleted file mode 100644 index 1d2c5a28bb..0000000000 --- a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - sequence - Create MOV H264 files per segment with thumbnail - - NONE - - <name> - True - True - - movie - FX - FlattenTracks - True - 5 - - True - False - - audio - Original - NoChange - True - 5 - - - - QuickTime - <shot name> - 0 - PCS_709 - None - Autodesk - Flame - 2021 - - - - 4 - 1 - 2 - - \ No newline at end of file diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/__init__.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/app_utils.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/app_utils.py deleted file mode 100644 index e639c3f482..0000000000 --- a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/app_utils.py +++ /dev/null @@ -1,162 +0,0 @@ -import os -import io -import ConfigParser as CP -from xml.etree import ElementTree as ET -from contextlib import contextmanager - -PLUGIN_DIR = os.path.dirname(os.path.dirname(__file__)) -EXPORT_PRESETS_DIR = os.path.join(PLUGIN_DIR, "export_preset") - -CONFIG_DIR = os.path.join(os.path.expanduser( - "~/.openpype"), "openpype_babypublisher") - - -@contextmanager -def make_temp_dir(): - import tempfile - - try: - dirpath = tempfile.mkdtemp() - - yield dirpath - - except IOError as _error: - raise IOError("Not able to create temp dir file: {}".format(_error)) - - finally: - pass - - -@contextmanager -def get_config(section=None): - cfg_file_path = os.path.join(CONFIG_DIR, "settings.ini") - - # create config dir - if not os.path.exists(CONFIG_DIR): - print("making dirs at: `{}`".format(CONFIG_DIR)) - os.makedirs(CONFIG_DIR, mode=0o777) - - # write default data to settings.ini - if not os.path.exists(cfg_file_path): - default_cfg = cfg_default() - config = CP.RawConfigParser() - config.readfp(io.BytesIO(default_cfg)) - with open(cfg_file_path, 'wb') as cfg_file: - config.write(cfg_file) - - try: - config = CP.RawConfigParser() - config.read(cfg_file_path) - if section: - _cfg_data = { - k: v - for s in config.sections() - for k, v in config.items(s) - if s == section - } - else: - _cfg_data = {s: dict(config.items(s)) for s in config.sections()} - - yield _cfg_data - - except IOError as _error: - raise IOError('Not able to read settings.ini file: {}'.format(_error)) - - finally: - pass - - -def set_config(cfg_data, section=None): - cfg_file_path = os.path.join(CONFIG_DIR, "settings.ini") - - config = CP.RawConfigParser() - config.read(cfg_file_path) - - try: - if not section: - for section in cfg_data: - for key, value in cfg_data[section].items(): - config.set(section, key, value) - else: - for key, value in cfg_data.items(): - config.set(section, key, value) - - with open(cfg_file_path, 'wb') as cfg_file: - config.write(cfg_file) - - except IOError as _error: - raise IOError('Not able to write settings.ini file: {}'.format(_error)) - - -def cfg_default(): - return """ -[main] -workfile_start_frame = 1001 -shot_handles = 0 -shot_name_template = {sequence}_{shot} -hierarchy_template = shots[Folder]/{sequence}[Sequence] -create_task_type = Compositing -""" - - -def configure_preset(file_path, data): - split_fp = os.path.splitext(file_path) - new_file_path = split_fp[0] + "_tmp" + split_fp[-1] - with open(file_path, "r") as datafile: - tree = ET.parse(datafile) - for key, value in data.items(): - for element in tree.findall(".//{}".format(key)): - print(element) - element.text = str(value) - tree.write(new_file_path) - - return new_file_path - - -def export_thumbnail(sequence, tempdir_path, data): - import flame - export_preset = os.path.join( - EXPORT_PRESETS_DIR, - "openpype_seg_thumbnails_jpg.xml" - ) - new_path = configure_preset(export_preset, data) - poster_frame_exporter = flame.PyExporter() - poster_frame_exporter.foreground = True - poster_frame_exporter.export(sequence, new_path, tempdir_path) - - -def export_video(sequence, tempdir_path, data): - import flame - export_preset = os.path.join( - EXPORT_PRESETS_DIR, - "openpype_seg_video_h264.xml" - ) - new_path = configure_preset(export_preset, data) - poster_frame_exporter = flame.PyExporter() - poster_frame_exporter.foreground = True - poster_frame_exporter.export(sequence, new_path, tempdir_path) - - -def timecode_to_frames(timecode, framerate): - def _seconds(value): - if isinstance(value, str): - _zip_ft = zip((3600, 60, 1, 1 / framerate), value.split(':')) - return sum(f * float(t) for f, t in _zip_ft) - elif isinstance(value, (int, float)): - return value / framerate - return 0 - - def _frames(seconds): - return seconds * framerate - - def tc_to_frames(_timecode, start=None): - return _frames(_seconds(_timecode) - _seconds(start)) - - if '+' in timecode: - timecode = timecode.replace('+', ':') - elif '#' in timecode: - timecode = timecode.replace('#', ':') - - frames = int(round(tc_to_frames(timecode, start='00:00:00:00'))) - - return frames diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/ftrack_lib.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/ftrack_lib.py deleted file mode 100644 index a66980493e..0000000000 --- a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/ftrack_lib.py +++ /dev/null @@ -1,459 +0,0 @@ -import os -import sys -import six -import re -import json - -import app_utils - -# Fill following constants or set them via environment variable -FTRACK_MODULE_PATH = None -FTRACK_API_KEY = None -FTRACK_API_USER = None -FTRACK_SERVER = None - - -def import_ftrack_api(): - try: - import ftrack_api - return ftrack_api - except ImportError: - import sys - ftrk_m_p = FTRACK_MODULE_PATH or os.getenv("FTRACK_MODULE_PATH") - sys.path.append(ftrk_m_p) - import ftrack_api - return ftrack_api - - -def get_ftrack_session(): - import os - ftrack_api = import_ftrack_api() - - # fill your own credentials - url = FTRACK_SERVER or os.getenv("FTRACK_SERVER") or "" - user = FTRACK_API_USER or os.getenv("FTRACK_API_USER") or "" - api = FTRACK_API_KEY or os.getenv("FTRACK_API_KEY") or "" - - first_validation = True - if not user: - print('- Ftrack Username is not set') - first_validation = False - if not api: - print('- Ftrack API key is not set') - first_validation = False - if not first_validation: - return False - - try: - return ftrack_api.Session( - server_url=url, - api_user=user, - api_key=api - ) - except Exception as _e: - print("Can't log into Ftrack with used credentials: {}".format(_e)) - ftrack_cred = { - 'Ftrack server': str(url), - 'Username': str(user), - 'API key': str(api), - } - - item_lens = [len(key) + 1 for key in ftrack_cred] - justify_len = max(*item_lens) - for key, value in ftrack_cred.items(): - print('{} {}'.format((key + ':').ljust(justify_len, ' '), value)) - return False - - -def get_project_task_types(project_entity): - tasks = {} - proj_template = project_entity['project_schema'] - temp_task_types = proj_template['_task_type_schema']['types'] - - for type in temp_task_types: - if type['name'] not in tasks: - tasks[type['name']] = type - - return tasks - - -class FtrackComponentCreator: - default_location = "ftrack.server" - ftrack_locations = {} - thumbnails = [] - videos = [] - temp_dir = None - - def __init__(self, session): - self.session = session - self._get_ftrack_location() - - def generate_temp_data(self, selection, change_preset_data): - with app_utils.make_temp_dir() as tempdir_path: - for seq in selection: - app_utils.export_thumbnail( - seq, tempdir_path, change_preset_data) - app_utils.export_video(seq, tempdir_path, change_preset_data) - - return tempdir_path - - def collect_generated_data(self, tempdir_path): - temp_files = os.listdir(tempdir_path) - self.thumbnails = [f for f in temp_files if "jpg" in f] - self.videos = [f for f in temp_files if "mov" in f] - self.temp_dir = tempdir_path - - def get_thumb_path(self, shot_name): - # get component files - thumb_f = next((f for f in self.thumbnails if shot_name in f), None) - return os.path.join(self.temp_dir, thumb_f) - - def get_video_path(self, shot_name): - # get component files - video_f = next((f for f in self.videos if shot_name in f), None) - return os.path.join(self.temp_dir, video_f) - - def close(self): - self.ftrack_locations = {} - self.session = None - - def create_comonent(self, shot_entity, data, assetversion_entity=None): - self.shot_entity = shot_entity - location = self._get_ftrack_location() - - file_path = data["file_path"] - - # get extension - file = os.path.basename(file_path) - _n, ext = os.path.splitext(file) - - name = "ftrackreview-mp4" if "mov" in ext else "thumbnail" - - component_data = { - "name": name, - "file_path": file_path, - "file_type": ext, - "location": location - } - - if name == "ftrackreview-mp4": - duration = data["duration"] - handles = data["handles"] - fps = data["fps"] - component_data["metadata"] = { - 'ftr_meta': json.dumps({ - 'frameIn': int(0), - 'frameOut': int(duration + (handles * 2)), - 'frameRate': float(fps) - }) - } - if not assetversion_entity: - # get assettype entity from session - assettype_entity = self._get_assettype({"short": "reference"}) - - # get or create asset entity from session - asset_entity = self._get_asset({ - "name": "plateReference", - "type": assettype_entity, - "parent": self.shot_entity - }) - - # get or create assetversion entity from session - assetversion_entity = self._get_assetversion({ - "version": 0, - "asset": asset_entity - }) - - # get or create component entity - self._set_component(component_data, { - "name": name, - "version": assetversion_entity, - }) - - return assetversion_entity - - def _overwrite_members(self, entity, data): - origin_location = self._get_ftrack_location("ftrack.origin") - location = data.pop("location") - - self._remove_component_from_location(entity, location) - - entity["file_type"] = data["file_type"] - - try: - origin_location.add_component( - entity, data["file_path"] - ) - # Add components to location. - location.add_component( - entity, origin_location, recursive=True) - except Exception as __e: - print("Error: {}".format(__e)) - self._remove_component_from_location(entity, origin_location) - origin_location.add_component( - entity, data["file_path"] - ) - # Add components to location. - location.add_component( - entity, origin_location, recursive=True) - - def _remove_component_from_location(self, entity, location): - print(location) - # Removing existing members from location - components = list(entity.get("members", [])) - components += [entity] - for component in components: - for loc in component.get("component_locations", []): - if location["id"] == loc["location_id"]: - print("<< Removing component: {}".format(component)) - location.remove_component( - component, recursive=False - ) - - # Deleting existing members on component entity - for member in entity.get("members", []): - self.session.delete(member) - print("<< Deleting member: {}".format(member)) - del(member) - - self._commit() - - # Reset members in memory - if "members" in entity.keys(): - entity["members"] = [] - - def _get_assettype(self, data): - return self.session.query( - self._query("AssetType", data)).first() - - def _set_component(self, comp_data, base_data): - component_metadata = comp_data.pop("metadata", {}) - - component_entity = self.session.query( - self._query("Component", base_data) - ).first() - - if component_entity: - # overwrite existing members in component entity - # - get data for member from `ftrack.origin` location - self._overwrite_members(component_entity, comp_data) - - # Adding metadata - existing_component_metadata = component_entity["metadata"] - existing_component_metadata.update(component_metadata) - component_entity["metadata"] = existing_component_metadata - return - - assetversion_entity = base_data["version"] - location = comp_data.pop("location") - - component_entity = assetversion_entity.create_component( - comp_data["file_path"], - data=comp_data, - location=location - ) - - # Adding metadata - existing_component_metadata = component_entity["metadata"] - existing_component_metadata.update(component_metadata) - component_entity["metadata"] = existing_component_metadata - - if comp_data["name"] == "thumbnail": - self.shot_entity["thumbnail_id"] = component_entity["id"] - assetversion_entity["thumbnail_id"] = component_entity["id"] - - self._commit() - - def _get_asset(self, data): - # first find already created - asset_entity = self.session.query( - self._query("Asset", data) - ).first() - - if asset_entity: - return asset_entity - - asset_entity = self.session.create("Asset", data) - - # _commit if created - self._commit() - - return asset_entity - - def _get_assetversion(self, data): - assetversion_entity = self.session.query( - self._query("AssetVersion", data) - ).first() - - if assetversion_entity: - return assetversion_entity - - assetversion_entity = self.session.create("AssetVersion", data) - - # _commit if created - self._commit() - - return assetversion_entity - - def _commit(self): - try: - self.session.commit() - except Exception: - tp, value, tb = sys.exc_info() - # self.session.rollback() - # self.session._configure_locations() - six.reraise(tp, value, tb) - - def _get_ftrack_location(self, name=None): - name = name or self.default_location - - if name in self.ftrack_locations: - return self.ftrack_locations[name] - - location = self.session.query( - 'Location where name is "{}"'.format(name) - ).one() - self.ftrack_locations[name] = location - return location - - def _query(self, entitytype, data): - """ Generate a query expression from data supplied. - - If a value is not a string, we'll add the id of the entity to the - query. - - Args: - entitytype (str): The type of entity to query. - data (dict): The data to identify the entity. - exclusions (list): All keys to exclude from the query. - - Returns: - str: String query to use with "session.query" - """ - queries = [] - if sys.version_info[0] < 3: - for key, value in data.items(): - if not isinstance(value, (str, int)): - print("value: {}".format(value)) - if "id" in value.keys(): - queries.append( - "{0}.id is \"{1}\"".format(key, value["id"]) - ) - else: - queries.append("{0} is \"{1}\"".format(key, value)) - else: - for key, value in data.items(): - if not isinstance(value, (str, int)): - print("value: {}".format(value)) - if "id" in value.keys(): - queries.append( - "{0}.id is \"{1}\"".format(key, value["id"]) - ) - else: - queries.append("{0} is \"{1}\"".format(key, value)) - - query = ( - "select id from " + entitytype + " where " + " and ".join(queries) - ) - print(query) - return query - - -class FtrackEntityOperator: - existing_tasks = [] - - def __init__(self, session, project_entity): - self.session = session - self.project_entity = project_entity - - def commit(self): - try: - self.session.commit() - except Exception: - tp, value, tb = sys.exc_info() - self.session.rollback() - self.session._configure_locations() - six.reraise(tp, value, tb) - - def create_ftrack_entity(self, session, type, name, parent=None): - parent = parent or self.project_entity - entity = session.create(type, { - 'name': name, - 'parent': parent - }) - try: - session.commit() - except Exception: - tp, value, tb = sys.exc_info() - session.rollback() - session._configure_locations() - six.reraise(tp, value, tb) - return entity - - def get_ftrack_entity(self, session, type, name, parent): - query = '{} where name is "{}" and project_id is "{}"'.format( - type, name, self.project_entity["id"]) - - entity = session.query(query).first() - - # if entity doesn't exist then create one - if not entity: - entity = self.create_ftrack_entity( - session, - type, - name, - parent - ) - - return entity - - def create_parents(self, template): - parents = [] - t_split = template.split("/") - replace_patern = re.compile(r"(\[.*\])") - type_patern = re.compile(r"\[(.*)\]") - - for t_s in t_split: - match_type = type_patern.findall(t_s) - if not match_type: - raise Exception(( - "Missing correct type flag in : {}" - "/n Example: name[Type]").format( - t_s) - ) - new_name = re.sub(replace_patern, "", t_s) - f_type = match_type.pop() - - parents.append((new_name, f_type)) - - return parents - - def create_task(self, task_type, task_types, parent): - _exising_tasks = [ - child for child in parent['children'] - if child.entity_type.lower() == 'task' - ] - - # add task into existing tasks if they are not already there - for _t in _exising_tasks: - if _t in self.existing_tasks: - continue - self.existing_tasks.append(_t) - - existing_task = [ - task for task in self.existing_tasks - if task['name'].lower() in task_type.lower() - if task['parent'] == parent - ] - - if existing_task: - return existing_task.pop() - - task = self.session.create('Task', { - "name": task_type.lower(), - "parent": parent - }) - task["type"] = task_types[task_type] - - self.existing_tasks.append(task) - return task diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/panel_app.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/panel_app.py deleted file mode 100644 index ce023a9e4d..0000000000 --- a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/panel_app.py +++ /dev/null @@ -1,529 +0,0 @@ -from qtpy import QtWidgets, QtCore - -import uiwidgets -import app_utils -import ftrack_lib - - -def clear_inner_modules(): - import sys - - if "ftrack_lib" in sys.modules.keys(): - del sys.modules["ftrack_lib"] - print("Ftrack Lib module removed from sys.modules") - - if "app_utils" in sys.modules.keys(): - del sys.modules["app_utils"] - print("app_utils module removed from sys.modules") - - if "uiwidgets" in sys.modules.keys(): - del sys.modules["uiwidgets"] - print("uiwidgets module removed from sys.modules") - - -class MainWindow(QtWidgets.QWidget): - - def __init__(self, klass, *args, **kwargs): - super(MainWindow, self).__init__(*args, **kwargs) - self.panel_class = klass - - def closeEvent(self, event): - # clear all temp data - print("Removing temp data") - self.panel_class.clear_temp_data() - self.panel_class.close() - clear_inner_modules() - ftrack_lib.FtrackEntityOperator.existing_tasks = [] - # now the panel can be closed - event.accept() - - -class FlameBabyPublisherPanel(object): - session = None - temp_data_dir = None - processed_components = [] - project_entity = None - task_types = {} - all_task_types = {} - - # TreeWidget - columns = { - "Sequence name": { - "columnWidth": 200, - "order": 0 - }, - "Shot name": { - "columnWidth": 200, - "order": 1 - }, - "Clip duration": { - "columnWidth": 100, - "order": 2 - }, - "Shot description": { - "columnWidth": 500, - "order": 3 - }, - "Task description": { - "columnWidth": 500, - "order": 4 - }, - } - - def __init__(self, selection): - print(selection) - - self.session = ftrack_lib.get_ftrack_session() - self.selection = selection - self.window = MainWindow(self) - - # creating ui - self.window.setMinimumSize(1500, 600) - self.window.setWindowTitle('AYON: Baby-publisher') - self.window.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) - self.window.setAttribute(QtCore.Qt.WA_DeleteOnClose) - self.window.setFocusPolicy(QtCore.Qt.StrongFocus) - self.window.setStyleSheet('background-color: #313131') - - self._create_project_widget() - self._create_tree_widget() - self._set_sequence_params() - self._generate_widgets() - self._generate_layouts() - self._timeline_info() - self._fix_resolution() - - self.window.show() - - def _generate_widgets(self): - with app_utils.get_config("main") as cfg_data: - cfg_d = cfg_data - - self._create_task_type_widget(cfg_d) - - # input fields - self.shot_name_label = uiwidgets.FlameLabel( - 'Shot name template', 'normal', self.window) - self.shot_name_template_input = uiwidgets.FlameLineEdit( - cfg_d["shot_name_template"], self.window) - - self.hierarchy_label = uiwidgets.FlameLabel( - 'Parents template', 'normal', self.window) - self.hierarchy_template_input = uiwidgets.FlameLineEdit( - cfg_d["hierarchy_template"], self.window) - - self.start_frame_label = uiwidgets.FlameLabel( - 'Workfile start frame', 'normal', self.window) - self.start_frame_input = uiwidgets.FlameLineEdit( - cfg_d["workfile_start_frame"], self.window) - - self.handles_label = uiwidgets.FlameLabel( - 'Shot handles', 'normal', self.window) - self.handles_input = uiwidgets.FlameLineEdit( - cfg_d["shot_handles"], self.window) - - self.width_label = uiwidgets.FlameLabel( - 'Sequence width', 'normal', self.window) - self.width_input = uiwidgets.FlameLineEdit( - str(self.seq_width), self.window) - - self.height_label = uiwidgets.FlameLabel( - 'Sequence height', 'normal', self.window) - self.height_input = uiwidgets.FlameLineEdit( - str(self.seq_height), self.window) - - self.pixel_aspect_label = uiwidgets.FlameLabel( - 'Pixel aspect ratio', 'normal', self.window) - self.pixel_aspect_input = uiwidgets.FlameLineEdit( - str(1.00), self.window) - - self.fps_label = uiwidgets.FlameLabel( - 'Frame rate', 'normal', self.window) - self.fps_input = uiwidgets.FlameLineEdit( - str(self.fps), self.window) - - # Button - self.select_all_btn = uiwidgets.FlameButton( - 'Select All', self.select_all, self.window) - - self.remove_temp_data_btn = uiwidgets.FlameButton( - 'Remove temp data', self.clear_temp_data, self.window) - - self.ftrack_send_btn = uiwidgets.FlameButton( - 'Send to Ftrack', self._send_to_ftrack, self.window) - - def _generate_layouts(self): - # left props - v_shift = 0 - prop_layout_l = QtWidgets.QGridLayout() - prop_layout_l.setHorizontalSpacing(30) - if self.project_selector_enabled: - prop_layout_l.addWidget(self.project_select_label, v_shift, 0) - prop_layout_l.addWidget(self.project_select_input, v_shift, 1) - v_shift += 1 - prop_layout_l.addWidget(self.shot_name_label, (v_shift + 0), 0) - prop_layout_l.addWidget( - self.shot_name_template_input, (v_shift + 0), 1) - prop_layout_l.addWidget(self.hierarchy_label, (v_shift + 1), 0) - prop_layout_l.addWidget( - self.hierarchy_template_input, (v_shift + 1), 1) - prop_layout_l.addWidget(self.start_frame_label, (v_shift + 2), 0) - prop_layout_l.addWidget(self.start_frame_input, (v_shift + 2), 1) - prop_layout_l.addWidget(self.handles_label, (v_shift + 3), 0) - prop_layout_l.addWidget(self.handles_input, (v_shift + 3), 1) - prop_layout_l.addWidget(self.task_type_label, (v_shift + 4), 0) - prop_layout_l.addWidget( - self.task_type_input, (v_shift + 4), 1) - - # right props - prop_widget_r = QtWidgets.QWidget(self.window) - prop_layout_r = QtWidgets.QGridLayout(prop_widget_r) - prop_layout_r.setHorizontalSpacing(30) - prop_layout_r.setAlignment( - QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) - prop_layout_r.setContentsMargins(0, 0, 0, 0) - prop_layout_r.addWidget(self.width_label, 1, 0) - prop_layout_r.addWidget(self.width_input, 1, 1) - prop_layout_r.addWidget(self.height_label, 2, 0) - prop_layout_r.addWidget(self.height_input, 2, 1) - prop_layout_r.addWidget(self.pixel_aspect_label, 3, 0) - prop_layout_r.addWidget(self.pixel_aspect_input, 3, 1) - prop_layout_r.addWidget(self.fps_label, 4, 0) - prop_layout_r.addWidget(self.fps_input, 4, 1) - - # prop layout - prop_main_layout = QtWidgets.QHBoxLayout() - prop_main_layout.addLayout(prop_layout_l, 1) - prop_main_layout.addSpacing(20) - prop_main_layout.addWidget(prop_widget_r, 1) - - # buttons layout - hbox = QtWidgets.QHBoxLayout() - hbox.addWidget(self.remove_temp_data_btn) - hbox.addWidget(self.select_all_btn) - hbox.addWidget(self.ftrack_send_btn) - - # put all layouts together - main_frame = QtWidgets.QVBoxLayout(self.window) - main_frame.setMargin(20) - main_frame.addLayout(prop_main_layout) - main_frame.addWidget(self.tree) - main_frame.addLayout(hbox) - - def _set_sequence_params(self): - for select in self.selection: - self.seq_height = select.height - self.seq_width = select.width - self.fps = float(str(select.frame_rate)[:-4]) - break - - def _create_task_type_widget(self, cfg_d): - print(self.project_entity) - self.task_types = ftrack_lib.get_project_task_types( - self.project_entity) - - self.task_type_label = uiwidgets.FlameLabel( - 'Create Task (type)', 'normal', self.window) - self.task_type_input = uiwidgets.FlamePushButtonMenu( - cfg_d["create_task_type"], self.task_types.keys(), self.window) - - def _create_project_widget(self): - import flame - # get project name from flame current project - self.project_name = flame.project.current_project.name - - # get project from ftrack - - # ftrack project name has to be the same as flame project! - query = 'Project where full_name is "{}"'.format(self.project_name) - - # globally used variables - self.project_entity = self.session.query(query).first() - - self.project_selector_enabled = bool(not self.project_entity) - - if self.project_selector_enabled: - self.all_projects = self.session.query( - "Project where status is active").all() - self.project_entity = self.all_projects[0] - project_names = [p["full_name"] for p in self.all_projects] - self.all_task_types = { - p["full_name"]: ftrack_lib.get_project_task_types(p).keys() - for p in self.all_projects - } - self.project_select_label = uiwidgets.FlameLabel( - 'Select Ftrack project', 'normal', self.window) - self.project_select_input = uiwidgets.FlamePushButtonMenu( - self.project_entity["full_name"], project_names, self.window) - self.project_select_input.selection_changed.connect( - self._on_project_changed) - - def _create_tree_widget(self): - ordered_column_labels = self.columns.keys() - for _name, _value in self.columns.items(): - ordered_column_labels.pop(_value["order"]) - ordered_column_labels.insert(_value["order"], _name) - - self.tree = uiwidgets.FlameTreeWidget( - ordered_column_labels, self.window) - - # Allow multiple items in tree to be selected - self.tree.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) - - # Set tree column width - for _name, _val in self.columns.items(): - self.tree.setColumnWidth( - _val["order"], - _val["columnWidth"] - ) - - # Prevent weird characters when shrinking tree columns - self.tree.setTextElideMode(QtCore.Qt.ElideNone) - - def _resolve_project_entity(self): - if self.project_selector_enabled: - selected_project_name = self.project_select_input.text() - self.project_entity = next( - (p for p in self.all_projects - if p["full_name"] in selected_project_name), - None - ) - - def _save_ui_state_to_cfg(self): - _cfg_data_back = { - "shot_name_template": self.shot_name_template_input.text(), - "workfile_start_frame": self.start_frame_input.text(), - "shot_handles": self.handles_input.text(), - "hierarchy_template": self.hierarchy_template_input.text(), - "create_task_type": self.task_type_input.text() - } - - # add cfg data back to settings.ini - app_utils.set_config(_cfg_data_back, "main") - - def _send_to_ftrack(self): - # resolve active project and add it to self.project_entity - self._resolve_project_entity() - self._save_ui_state_to_cfg() - - # get handles from gui input - handles = self.handles_input.text() - - # get frame start from gui input - frame_start = int(self.start_frame_input.text()) - - # get task type from gui input - task_type = self.task_type_input.text() - - # get resolution from gui inputs - fps = self.fps_input.text() - - entity_operator = ftrack_lib.FtrackEntityOperator( - self.session, self.project_entity) - component_creator = ftrack_lib.FtrackComponentCreator(self.session) - - if not self.temp_data_dir: - self.window.hide() - self.temp_data_dir = component_creator.generate_temp_data( - self.selection, - { - "nbHandles": handles - } - ) - self.window.show() - - # collect generated files to list data for farther use - component_creator.collect_generated_data(self.temp_data_dir) - - # Get all selected items from treewidget - for item in self.tree.selectedItems(): - # frame ranges - frame_duration = int(item.text(2)) - frame_end = frame_start + frame_duration - - # description - shot_description = item.text(3) - task_description = item.text(4) - - # other - sequence_name = item.text(0) - shot_name = item.text(1) - - thumb_fp = component_creator.get_thumb_path(shot_name) - video_fp = component_creator.get_video_path(shot_name) - - print("processed comps: {}".format(self.processed_components)) - print("processed thumb_fp: {}".format(thumb_fp)) - - processed = False - if thumb_fp not in self.processed_components: - self.processed_components.append(thumb_fp) - else: - processed = True - - print("processed: {}".format(processed)) - - # populate full shot info - shot_attributes = { - "sequence": sequence_name, - "shot": shot_name, - "task": task_type - } - - # format shot name template - _shot_name = self.shot_name_template_input.text().format( - **shot_attributes) - - # format hierarchy template - _hierarchy_text = self.hierarchy_template_input.text().format( - **shot_attributes) - print(_hierarchy_text) - - # solve parents - parents = entity_operator.create_parents(_hierarchy_text) - print(parents) - - # obtain shot parents entities - _parent = None - for _name, _type in parents: - p_entity = entity_operator.get_ftrack_entity( - self.session, - _type, - _name, - _parent - ) - print(p_entity) - _parent = p_entity - - # obtain shot ftrack entity - f_s_entity = entity_operator.get_ftrack_entity( - self.session, - "Shot", - _shot_name, - _parent - ) - print("Shot entity is: {}".format(f_s_entity)) - - if not processed: - # first create thumbnail and get version entity - assetversion_entity = component_creator.create_comonent( - f_s_entity, { - "file_path": thumb_fp - } - ) - - # secondly add video to version entity - component_creator.create_comonent( - f_s_entity, { - "file_path": video_fp, - "duration": frame_duration, - "handles": int(handles), - "fps": float(fps) - }, assetversion_entity - ) - - # create custom attributtes - custom_attrs = { - "frameStart": frame_start, - "frameEnd": frame_end, - "handleStart": int(handles), - "handleEnd": int(handles), - "resolutionWidth": int(self.width_input.text()), - "resolutionHeight": int(self.height_input.text()), - "pixelAspect": float(self.pixel_aspect_input.text()), - "fps": float(fps) - } - - # update custom attributes on shot entity - for key in custom_attrs: - f_s_entity['custom_attributes'][key] = custom_attrs[key] - - task_entity = entity_operator.create_task( - task_type, self.task_types, f_s_entity) - - # Create notes. - user = self.session.query( - "User where username is \"{}\"".format(self.session.api_user) - ).first() - - f_s_entity.create_note(shot_description, author=user) - - if task_description: - task_entity.create_note(task_description, user) - - entity_operator.commit() - - component_creator.close() - - def _fix_resolution(self): - # Center window in linux - resolution = QtWidgets.QDesktopWidget().screenGeometry() - self.window.move( - (resolution.width() / 2) - (self.window.frameSize().width() / 2), - (resolution.height() / 2) - (self.window.frameSize().height() / 2)) - - def _on_project_changed(self): - task_types = self.all_task_types[self.project_name] - self.task_type_input.set_menu_options(task_types) - - def _timeline_info(self): - # identificar as informacoes dos segmentos na timeline - for sequence in self.selection: - frame_rate = float(str(sequence.frame_rate)[:-4]) - for ver in sequence.versions: - for track in ver.tracks: - if len(track.segments) == 0 and track.hidden: - continue - for segment in track.segments: - print(segment.attributes) - if segment.name.get_value() == "": - continue - if segment.hidden.get_value() is True: - continue - # get clip frame duration - record_duration = str(segment.record_duration)[1:-1] - clip_duration = app_utils.timecode_to_frames( - record_duration, frame_rate) - - # populate shot source metadata - shot_description = "" - for attr in ["tape_name", "source_name", "head", - "tail", "file_path"]: - if not hasattr(segment, attr): - continue - _value = getattr(segment, attr) - _label = attr.replace("_", " ").capitalize() - row = "{}: {}\n".format(_label, _value) - shot_description += row - - # Add timeline segment to tree - QtWidgets.QTreeWidgetItem(self.tree, [ - sequence.name.get_value(), # seq name - segment.shot_name.get_value(), # shot name - str(clip_duration), # clip duration - shot_description, # shot description - segment.comment.get_value() # task description - ]).setFlags( - QtCore.Qt.ItemIsEditable - | QtCore.Qt.ItemIsEnabled - | QtCore.Qt.ItemIsSelectable - ) - - # Select top item in tree - self.tree.setCurrentItem(self.tree.topLevelItem(0)) - - def select_all(self, ): - self.tree.selectAll() - - def clear_temp_data(self): - import shutil - - self.processed_components = [] - - if self.temp_data_dir: - shutil.rmtree(self.temp_data_dir) - self.temp_data_dir = None - print("All Temp data were destroyed ...") - - def close(self): - self._save_ui_state_to_cfg() - self.session.close() diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/uiwidgets.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/uiwidgets.py deleted file mode 100644 index 5498a49197..0000000000 --- a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/uiwidgets.py +++ /dev/null @@ -1,212 +0,0 @@ -from qtpy import QtWidgets, QtCore - - -class FlameLabel(QtWidgets.QLabel): - """ - Custom Qt Flame Label Widget - - For different label looks set label_type as: - 'normal', 'background', or 'outline' - - To use: - - label = FlameLabel('Label Name', 'normal', window) - """ - - def __init__(self, label_name, label_type, parent_window, *args, **kwargs): - super(FlameLabel, self).__init__(*args, **kwargs) - - self.setText(label_name) - self.setParent(parent_window) - self.setMinimumSize(130, 28) - self.setMaximumHeight(28) - self.setFocusPolicy(QtCore.Qt.NoFocus) - - # Set label stylesheet based on label_type - - if label_type == 'normal': - self.setStyleSheet( - 'QLabel {color: #9a9a9a; border-bottom: 1px inset #282828; font: 14px "Discreet"}' # noqa - 'QLabel:disabled {color: #6a6a6a}' - ) - elif label_type == 'background': - self.setAlignment(QtCore.Qt.AlignCenter) - self.setStyleSheet( - 'color: #9a9a9a; background-color: #393939; font: 14px "Discreet"' # noqa - ) - elif label_type == 'outline': - self.setAlignment(QtCore.Qt.AlignCenter) - self.setStyleSheet( - 'color: #9a9a9a; background-color: #212121; border: 1px solid #404040; font: 14px "Discreet"' # noqa - ) - - -class FlameLineEdit(QtWidgets.QLineEdit): - """ - Custom Qt Flame Line Edit Widget - - Main window should include this: - window.setFocusPolicy(QtCore.Qt.StrongFocus) - - To use: - - line_edit = FlameLineEdit('Some text here', window) - """ - - def __init__(self, text, parent_window, *args, **kwargs): - super(FlameLineEdit, self).__init__(*args, **kwargs) - - self.setText(text) - self.setParent(parent_window) - self.setMinimumHeight(28) - self.setMinimumWidth(110) - self.setStyleSheet( - 'QLineEdit {color: #9a9a9a; background-color: #373e47; selection-color: #262626; selection-background-color: #b8b1a7; font: 14px "Discreet"}' # noqa - 'QLineEdit:focus {background-color: #474e58}' # noqa - 'QLineEdit:disabled {color: #6a6a6a; background-color: #373737}' - ) - - -class FlameTreeWidget(QtWidgets.QTreeWidget): - """ - Custom Qt Flame Tree Widget - - To use: - - tree_headers = ['Header1', 'Header2', 'Header3', 'Header4'] - tree = FlameTreeWidget(tree_headers, window) - """ - - def __init__(self, tree_headers, parent_window, *args, **kwargs): - super(FlameTreeWidget, self).__init__(*args, **kwargs) - - self.setMinimumWidth(1000) - self.setMinimumHeight(300) - self.setSortingEnabled(True) - self.sortByColumn(0, QtCore.Qt.AscendingOrder) - self.setAlternatingRowColors(True) - self.setFocusPolicy(QtCore.Qt.NoFocus) - self.setStyleSheet( - 'QTreeWidget {color: #9a9a9a; background-color: #2a2a2a; alternate-background-color: #2d2d2d; font: 14px "Discreet"}' # noqa - 'QTreeWidget::item:selected {color: #d9d9d9; background-color: #474747; border: 1px solid #111111}' # noqa - 'QHeaderView {color: #9a9a9a; background-color: #393939; font: 14px "Discreet"}' # noqa - 'QTreeWidget::item:selected {selection-background-color: #111111}' - 'QMenu {color: #9a9a9a; background-color: #24303d; font: 14px "Discreet"}' # noqa - 'QMenu::item:selected {color: #d9d9d9; background-color: #3a4551}' - ) - self.verticalScrollBar().setStyleSheet('color: #818181') - self.horizontalScrollBar().setStyleSheet('color: #818181') - self.setHeaderLabels(tree_headers) - - -class FlameButton(QtWidgets.QPushButton): - """ - Custom Qt Flame Button Widget - - To use: - - button = FlameButton('Button Name', do_this_when_pressed, window) - """ - - def __init__(self, button_name, do_when_pressed, parent_window, - *args, **kwargs): - super(FlameButton, self).__init__(*args, **kwargs) - - self.setText(button_name) - self.setParent(parent_window) - self.setMinimumSize(QtCore.QSize(110, 28)) - self.setMaximumSize(QtCore.QSize(110, 28)) - self.setFocusPolicy(QtCore.Qt.NoFocus) - self.clicked.connect(do_when_pressed) - self.setStyleSheet( - 'QPushButton {color: #9a9a9a; background-color: #424142; border-top: 1px inset #555555; border-bottom: 1px inset black; font: 14px "Discreet"}' # noqa - 'QPushButton:pressed {color: #d9d9d9; background-color: #4f4f4f; border-top: 1px inset #666666; font: italic}' # noqa - 'QPushButton:disabled {color: #747474; background-color: #353535; border-top: 1px solid #444444; border-bottom: 1px solid #242424}' # noqa - ) - - -class FlamePushButton(QtWidgets.QPushButton): - """ - Custom Qt Flame Push Button Widget - - To use: - - pushbutton = FlamePushButton(' Button Name', True_or_False, window) - """ - - def __init__(self, button_name, button_checked, parent_window, - *args, **kwargs): - super(FlamePushButton, self).__init__(*args, **kwargs) - - self.setText(button_name) - self.setParent(parent_window) - self.setCheckable(True) - self.setChecked(button_checked) - self.setMinimumSize(155, 28) - self.setMaximumSize(155, 28) - self.setFocusPolicy(QtCore.Qt.NoFocus) - self.setStyleSheet( - 'QPushButton {color: #9a9a9a; background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: .93 #424142, stop: .94 #2e3b48); text-align: left; border-top: 1px inset #555555; border-bottom: 1px inset black; font: 14px "Discreet"}' # noqa - 'QPushButton:checked {color: #d9d9d9; background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: .93 #4f4f4f, stop: .94 #5a7fb4); font: italic; border: 1px inset black; border-bottom: 1px inset #404040; border-right: 1px inset #404040}' # noqa - 'QPushButton:disabled {color: #6a6a6a; background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: .93 #383838, stop: .94 #353535); font: light; border-top: 1px solid #575757; border-bottom: 1px solid #242424; border-right: 1px solid #353535; border-left: 1px solid #353535}' # noqa - 'QToolTip {color: black; background-color: #ffffde; border: black solid 1px}' # noqa - ) - - -class FlamePushButtonMenu(QtWidgets.QPushButton): - """ - Custom Qt Flame Menu Push Button Widget - - To use: - - push_button_menu_options = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] - menu_push_button = FlamePushButtonMenu('push_button_name', - push_button_menu_options, window) - - or - - push_button_menu_options = ['Item 1', 'Item 2', 'Item 3', 'Item 4'] - menu_push_button = FlamePushButtonMenu(push_button_menu_options[0], - push_button_menu_options, window) - """ - selection_changed = QtCore.Signal(str) - - def __init__(self, button_name, menu_options, parent_window, - *args, **kwargs): - super(FlamePushButtonMenu, self).__init__(*args, **kwargs) - - self.setParent(parent_window) - self.setMinimumHeight(28) - self.setMinimumWidth(110) - self.setFocusPolicy(QtCore.Qt.NoFocus) - self.setStyleSheet( - 'QPushButton {color: #9a9a9a; background-color: #24303d; font: 14px "Discreet"}' # noqa - 'QPushButton:disabled {color: #747474; background-color: #353535; border-top: 1px solid #444444; border-bottom: 1px solid #242424}' # noqa - ) - - pushbutton_menu = QtWidgets.QMenu(parent_window) - pushbutton_menu.setFocusPolicy(QtCore.Qt.NoFocus) - pushbutton_menu.setStyleSheet( - 'QMenu {color: #9a9a9a; background-color:#24303d; font: 14px "Discreet"}' # noqa - 'QMenu::item:selected {color: #d9d9d9; background-color: #3a4551}' - ) - - self._pushbutton_menu = pushbutton_menu - self.setMenu(pushbutton_menu) - self.set_menu_options(menu_options, button_name) - - def set_menu_options(self, menu_options, current_option=None): - self._pushbutton_menu.clear() - current_option = current_option or menu_options[0] - - for option in menu_options: - action = self._pushbutton_menu.addAction(option) - action.triggered.connect(self._on_action_trigger) - - if current_option is not None: - self.setText(current_option) - - def _on_action_trigger(self): - action = self.sender() - self.setText(action.text()) - self.selection_changed.emit(action.text()) diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/openpype_babypublisher.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/openpype_babypublisher.py deleted file mode 100644 index 76d74b5970..0000000000 --- a/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/openpype_babypublisher.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import print_function - -import os -import sys - -# only testing dependency for nested modules in package -import six # noqa - - -SCRIPT_DIR = os.path.dirname(__file__) -PACKAGE_DIR = os.path.join(SCRIPT_DIR, "modules") -sys.path.append(PACKAGE_DIR) - - -def flame_panel_executor(selection): - if "panel_app" in sys.modules.keys(): - print("panel_app module is already loaded") - del sys.modules["panel_app"] - import panel_app - reload(panel_app) # noqa - print("panel_app module removed from sys.modules") - - panel_app.FlameBabyPublisherPanel(selection) - - -def scope_sequence(selection): - import flame - return any(isinstance(item, flame.PySequence) for item in selection) - - -def get_media_panel_custom_ui_actions(): - return [ - { - "name": "AYON: Baby-publisher", - "actions": [ - { - "name": "Create Shots", - "isVisible": scope_sequence, - "execute": flame_panel_executor - } - ] - } - ] diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py b/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py deleted file mode 100644 index 8f319a88eb..0000000000 --- a/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py +++ /dev/null @@ -1,219 +0,0 @@ -from __future__ import print_function -import sys -from qtpy import QtWidgets -from pprint import pformat -import atexit - -import ayon_flame.api as opfapi -from ayon_core.pipeline import ( - install_host, - registered_host, -) - - -def openpype_install(): - """Registering AYON in context - """ - install_host(opfapi) - print("Registered host: {}".format(registered_host())) - - -# Exception handler -def exeption_handler(exctype, value, _traceback): - """Exception handler for improving UX - - Args: - exctype (str): type of exception - value (str): exception value - tb (str): traceback to show - """ - import traceback - msg = "AYON: Python exception {} in {}".format(value, exctype) - mbox = QtWidgets.QMessageBox() - mbox.setText(msg) - mbox.setDetailedText( - pformat(traceback.format_exception(exctype, value, _traceback))) - mbox.setStyleSheet('QLabel{min-width: 800px;}') - mbox.exec_() - sys.__excepthook__(exctype, value, _traceback) - - -# add exception handler into sys module -sys.excepthook = exeption_handler - - -# register clean up logic to be called at Flame exit -def cleanup(): - """Cleaning up Flame framework context - """ - if opfapi.CTX.flame_apps: - print('`{}` cleaning up flame_apps:\n {}\n'.format( - __file__, pformat(opfapi.CTX.flame_apps))) - while len(opfapi.CTX.flame_apps): - app = opfapi.CTX.flame_apps.pop() - print('`{}` removing : {}'.format(__file__, app.name)) - del app - opfapi.CTX.flame_apps = [] - - if opfapi.CTX.app_framework: - print('openpype\t: {} cleaning up'.format( - opfapi.CTX.app_framework.bundle_name) - ) - opfapi.CTX.app_framework.save_prefs() - opfapi.CTX.app_framework = None - - -atexit.register(cleanup) - - -def load_apps(): - """Load available flame_apps into Flame framework - """ - opfapi.CTX.flame_apps.append( - opfapi.FlameMenuProjectConnect(opfapi.CTX.app_framework)) - opfapi.CTX.flame_apps.append( - opfapi.FlameMenuTimeline(opfapi.CTX.app_framework)) - opfapi.CTX.flame_apps.append( - opfapi.FlameMenuUniversal(opfapi.CTX.app_framework)) - opfapi.CTX.app_framework.log.info("Apps are loaded") - - -def project_changed_dict(info): - """Hook for project change action - - Args: - info (str): info text - """ - cleanup() - - -def app_initialized(parent=None): - """Inicialization of Framework - - Args: - parent (obj, optional): Parent object. Defaults to None. - """ - opfapi.CTX.app_framework = opfapi.FlameAppFramework() - - print("{} initializing".format( - opfapi.CTX.app_framework.bundle_name)) - - load_apps() - - -""" -Initialisation of the hook is starting from here - -First it needs to test if it can import the flame module. -This will happen only in case a project has been loaded. -Then `app_initialized` will load main Framework which will load -all menu objects as flame_apps. -""" - -try: - import flame # noqa - app_initialized(parent=None) -except ImportError: - print("!!!! not able to import flame module !!!!") - - -def rescan_hooks(): - import flame # noqa - flame.execute_shortcut('Rescan Python Hooks') - - -def _build_app_menu(app_name): - """Flame menu object generator - - Args: - app_name (str): name of menu object app - - Returns: - list: menu object - """ - menu = [] - - # first find the relative appname - app = None - for _app in opfapi.CTX.flame_apps: - if _app.__class__.__name__ == app_name: - app = _app - - if app: - menu.append(app.build_menu()) - - if opfapi.CTX.app_framework: - menu_auto_refresh = opfapi.CTX.app_framework.prefs_global.get( - 'menu_auto_refresh', {}) - if menu_auto_refresh.get('timeline_menu', True): - try: - import flame # noqa - flame.schedule_idle_event(rescan_hooks) - except ImportError: - print("!-!!! not able to import flame module !!!!") - - return menu - - -""" Flame hooks are starting here -""" - - -def project_saved(project_name, save_time, is_auto_save): - """Hook to activate when project is saved - - Args: - project_name (str): name of project - save_time (str): time when it was saved - is_auto_save (bool): autosave is on or off - """ - if opfapi.CTX.app_framework: - opfapi.CTX.app_framework.save_prefs() - - -def get_main_menu_custom_ui_actions(): - """Hook to create submenu in start menu - - Returns: - list: menu object - """ - # install openpype and the host - openpype_install() - - return _build_app_menu("FlameMenuProjectConnect") - - -def get_timeline_custom_ui_actions(): - """Hook to create submenu in timeline - - Returns: - list: menu object - """ - # install openpype and the host - openpype_install() - - return _build_app_menu("FlameMenuTimeline") - - -def get_batch_custom_ui_actions(): - """Hook to create submenu in batch - - Returns: - list: menu object - """ - # install openpype and the host - openpype_install() - - return _build_app_menu("FlameMenuUniversal") - - -def get_media_panel_custom_ui_actions(): - """Hook to create submenu in desktop - - Returns: - list: menu object - """ - # install openpype and the host - openpype_install() - - return _build_app_menu("FlameMenuUniversal") diff --git a/server_addon/flame/client/ayon_flame/version.py b/server_addon/flame/client/ayon_flame/version.py deleted file mode 100644 index 68bdb6e6a0..0000000000 --- a/server_addon/flame/client/ayon_flame/version.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -"""Package declaring AYON addon 'flame' version.""" -__version__ = "0.2.1" diff --git a/server_addon/flame/package.py b/server_addon/flame/package.py deleted file mode 100644 index b25a514a9f..0000000000 --- a/server_addon/flame/package.py +++ /dev/null @@ -1,10 +0,0 @@ -name = "flame" -title = "Flame" -version = "0.2.1" - -client_dir = "ayon_flame" - -ayon_required_addons = { - "core": ">0.3.2", -} -ayon_compatible_addons = {} diff --git a/server_addon/flame/server/__init__.py b/server_addon/flame/server/__init__.py deleted file mode 100644 index 4aa46617ee..0000000000 --- a/server_addon/flame/server/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Type - -from ayon_server.addons import BaseServerAddon - -from .settings import FlameSettings, DEFAULT_VALUES - - -class FlameAddon(BaseServerAddon): - settings_model: Type[FlameSettings] = FlameSettings - - async def get_default_settings(self): - settings_model_cls = self.get_settings_model() - return settings_model_cls(**DEFAULT_VALUES) diff --git a/server_addon/flame/server/settings/__init__.py b/server_addon/flame/server/settings/__init__.py deleted file mode 100644 index 39b8220d40..0000000000 --- a/server_addon/flame/server/settings/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -from .main import ( - FlameSettings, - DEFAULT_VALUES, -) - - -__all__ = ( - "FlameSettings", - "DEFAULT_VALUES", -) diff --git a/server_addon/flame/server/settings/create_plugins.py b/server_addon/flame/server/settings/create_plugins.py deleted file mode 100644 index 2f17ec40c4..0000000000 --- a/server_addon/flame/server/settings/create_plugins.py +++ /dev/null @@ -1,119 +0,0 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField - - -class CreateShotClipModel(BaseSettingsModel): - hierarchy: str = SettingsField( - "shot", - title="Shot parent hierarchy", - section="Shot Hierarchy And Rename Settings" - ) - useShotName: bool = SettingsField( - True, - title="Use Shot Name", - ) - clipRename: bool = SettingsField( - False, - title="Rename clips", - ) - clipName: str = SettingsField( - "{sequence}{shot}", - title="Clip name template" - ) - segmentIndex: bool = SettingsField( - True, - title="Accept segment order" - ) - countFrom: int = SettingsField( - 10, - title="Count sequence from" - ) - countSteps: int = SettingsField( - 10, - title="Stepping number" - ) - - folder: str = SettingsField( - "shots", - title="{folder}", - section="Shot Template Keywords" - ) - episode: str = SettingsField( - "ep01", - title="{episode}" - ) - sequence: str = SettingsField( - "a", - title="{sequence}" - ) - track: str = SettingsField( - "{_track_}", - title="{track}" - ) - shot: str = SettingsField( - "####", - title="{shot}" - ) - - vSyncOn: bool = SettingsField( - False, - title="Enable Vertical Sync", - section="Vertical Synchronization Of Attributes" - ) - - workfileFrameStart: int = SettingsField( - 1001, - title="Workfiles Start Frame", - section="Shot Attributes" - ) - handleStart: int = SettingsField( - 10, - title="Handle start (head)" - ) - handleEnd: int = SettingsField( - 10, - title="Handle end (tail)" - ) - includeHandles: bool = SettingsField( - False, - title="Enable handles including" - ) - retimedHandles: bool = SettingsField( - True, - title="Enable retimed handles" - ) - retimedFramerange: bool = SettingsField( - True, - title="Enable retimed shot frameranges" - ) - - -class CreatePluginsModel(BaseSettingsModel): - CreateShotClip: CreateShotClipModel = SettingsField( - default_factory=CreateShotClipModel, - title="Create Shot Clip" - ) - - -DEFAULT_CREATE_SETTINGS = { - "CreateShotClip": { - "hierarchy": "{folder}/{sequence}", - "useShotName": True, - "clipRename": False, - "clipName": "{sequence}{shot}", - "segmentIndex": True, - "countFrom": 10, - "countSteps": 10, - "folder": "shots", - "episode": "ep01", - "sequence": "a", - "track": "{_track_}", - "shot": "####", - "vSyncOn": False, - "workfileFrameStart": 1001, - "handleStart": 5, - "handleEnd": 5, - "includeHandles": False, - "retimedHandles": True, - "retimedFramerange": True - } -} diff --git a/server_addon/flame/server/settings/imageio.py b/server_addon/flame/server/settings/imageio.py deleted file mode 100644 index abd058ee13..0000000000 --- a/server_addon/flame/server/settings/imageio.py +++ /dev/null @@ -1,149 +0,0 @@ -from pydantic import validator -from ayon_server.settings import ( - BaseSettingsModel, - SettingsField, - ensure_unique_names, -) - - -class ImageIOFileRuleModel(BaseSettingsModel): - name: str = SettingsField("", title="Rule name") - pattern: str = SettingsField("", title="Regex pattern") - colorspace: str = SettingsField("", title="Colorspace name") - ext: str = SettingsField("", title="File extension") - - -class ImageIOFileRulesModel(BaseSettingsModel): - activate_host_rules: bool = SettingsField(False) - rules: list[ImageIOFileRuleModel] = SettingsField( - default_factory=list, - title="Rules" - ) - - @validator("rules") - def validate_unique_outputs(cls, value): - ensure_unique_names(value) - return value - - -class ImageIORemappingRulesModel(BaseSettingsModel): - host_native_name: str = SettingsField( - title="Application native colorspace name" - ) - ocio_name: str = SettingsField(title="OCIO colorspace name") - - -class ImageIORemappingModel(BaseSettingsModel): - rules: list[ImageIORemappingRulesModel] = SettingsField( - default_factory=list - ) - - -class ImageIOConfigModel(BaseSettingsModel): - """[DEPRECATED] Addon OCIO config settings. Please set the OCIO config - path in the Core addon profiles here - (ayon+settings://core/imageio/ocio_config_profiles). - """ - - override_global_config: bool = SettingsField( - False, - title="Override global OCIO config", - description=( - "DEPRECATED functionality. Please set the OCIO config path in the " - "Core addon profiles here (ayon+settings://core/imageio/" - "ocio_config_profiles)." - ), - ) - filepath: list[str] = SettingsField( - default_factory=list, - title="Config path", - description=( - "DEPRECATED functionality. Please set the OCIO config path in the " - "Core addon profiles here (ayon+settings://core/imageio/" - "ocio_config_profiles)." - ), - ) - - -class ProfileNamesMappingInputsModel(BaseSettingsModel): - _layout = "expanded" - - flameName: str = SettingsField("", title="Flame name") - ocioName: str = SettingsField("", title="OCIO name") - - -class ProfileNamesMappingModel(BaseSettingsModel): - _layout = "expanded" - - inputs: list[ProfileNamesMappingInputsModel] = SettingsField( - default_factory=list, - title="Profile names mapping" - ) - - -class ImageIOProjectModel(BaseSettingsModel): - colourPolicy: str = SettingsField( - "ACES 1.1", - title="Colour Policy (name or path)", - section="Project" - ) - frameDepth: str = SettingsField( - "16-bit fp", - title="Image Depth" - ) - fieldDominance: str = SettingsField( - "PROGRESSIVE", - title="Field Dominance" - ) - - -class FlameImageIOModel(BaseSettingsModel): - _isGroup = True - activate_host_color_management: bool = SettingsField( - True, title="Enable Color Management" - ) - remapping: ImageIORemappingModel = SettingsField( - title="Remapping colorspace names", - default_factory=ImageIORemappingModel - ) - ocio_config: ImageIOConfigModel = SettingsField( - default_factory=ImageIOConfigModel, - title="OCIO config" - ) - file_rules: ImageIOFileRulesModel = SettingsField( - default_factory=ImageIOFileRulesModel, - title="File Rules" - ) - # NOTE 'project' attribute was expanded to this model but that caused - # inconsistency with v3 settings and harder conversion handling - # - it can be moved back but keep in mind that it must be handled in v3 - # conversion script too - project: ImageIOProjectModel = SettingsField( - default_factory=ImageIOProjectModel, - title="Project" - ) - profilesMapping: ProfileNamesMappingModel = SettingsField( - default_factory=ProfileNamesMappingModel, - title="Profile names mapping" - ) - - -DEFAULT_IMAGEIO_SETTINGS = { - "project": { - "colourPolicy": "ACES 1.1", - "frameDepth": "16-bit fp", - "fieldDominance": "PROGRESSIVE" - }, - "profilesMapping": { - "inputs": [ - { - "flameName": "ACEScg", - "ocioName": "ACES - ACEScg" - }, - { - "flameName": "Rec.709 video", - "ocioName": "Output - Rec.709" - } - ] - } -} diff --git a/server_addon/flame/server/settings/loader_plugins.py b/server_addon/flame/server/settings/loader_plugins.py deleted file mode 100644 index e616f442b5..0000000000 --- a/server_addon/flame/server/settings/loader_plugins.py +++ /dev/null @@ -1,103 +0,0 @@ -from ayon_server.settings import SettingsField, BaseSettingsModel - - -class LoadClipModel(BaseSettingsModel): - enabled: bool = SettingsField(True) - - product_types: list[str] = SettingsField( - default_factory=list, - title="Product types" - ) - reel_group_name: str = SettingsField( - "OpenPype_Reels", - title="Reel group name" - ) - reel_name: str = SettingsField( - "Loaded", - title="Reel name" - ) - - clip_name_template: str = SettingsField( - "{folder[name]}_{product[name]}<_{output}>", - title="Clip name template" - ) - layer_rename_template: str = SettingsField( - "", title="Layer name template" - ) - layer_rename_patterns: list[str] = SettingsField( - default_factory=list, - title="Layer rename patters", - ) - - -class LoadClipBatchModel(BaseSettingsModel): - enabled: bool = SettingsField(True) - product_types: list[str] = SettingsField( - default_factory=list, - title="Product types" - ) - reel_name: str = SettingsField( - "OP_LoadedReel", - title="Reel name" - ) - clip_name_template: str = SettingsField( - "{batch}_{folder[name]}_{product[name]}<_{output}>", - title="Clip name template" - ) - layer_rename_template: str = SettingsField( - "", title="Layer name template" - ) - layer_rename_patterns: list[str] = SettingsField( - default_factory=list, - title="Layer rename patters", - ) - - -class LoaderPluginsModel(BaseSettingsModel): - LoadClip: LoadClipModel = SettingsField( - default_factory=LoadClipModel, - title="Load Clip" - ) - LoadClipBatch: LoadClipBatchModel = SettingsField( - default_factory=LoadClipBatchModel, - title="Load as clip to current batch" - ) - - -DEFAULT_LOADER_SETTINGS = { - "LoadClip": { - "enabled": True, - "product_types": [ - "render2d", - "source", - "plate", - "render", - "review" - ], - "reel_group_name": "OpenPype_Reels", - "reel_name": "Loaded", - "clip_name_template": "{folder[name]}_{product[name]}<_{output}>", - "layer_rename_template": "{folder[name]}_{product[name]}<_{output}>", - "layer_rename_patterns": [ - "rgb", - "rgba" - ] - }, - "LoadClipBatch": { - "enabled": True, - "product_types": [ - "render2d", - "source", - "plate", - "render", - "review" - ], - "reel_name": "OP_LoadedReel", - "clip_name_template": "{batch}_{folder[name]}_{product[name]}<_{output}>", - "layer_rename_template": "{folder[name]}_{product[name]}<_{output}>", - "layer_rename_patterns": [ - "rgb", - "rgba" - ] - } -} diff --git a/server_addon/flame/server/settings/main.py b/server_addon/flame/server/settings/main.py deleted file mode 100644 index c838ee9646..0000000000 --- a/server_addon/flame/server/settings/main.py +++ /dev/null @@ -1,33 +0,0 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField - -from .imageio import FlameImageIOModel, DEFAULT_IMAGEIO_SETTINGS -from .create_plugins import CreatePluginsModel, DEFAULT_CREATE_SETTINGS -from .publish_plugins import PublishPluginsModel, DEFAULT_PUBLISH_SETTINGS -from .loader_plugins import LoaderPluginsModel, DEFAULT_LOADER_SETTINGS - - -class FlameSettings(BaseSettingsModel): - imageio: FlameImageIOModel = SettingsField( - default_factory=FlameImageIOModel, - title="Color Management (ImageIO)" - ) - create: CreatePluginsModel = SettingsField( - default_factory=CreatePluginsModel, - title="Create plugins" - ) - publish: PublishPluginsModel = SettingsField( - default_factory=PublishPluginsModel, - title="Publish plugins" - ) - load: LoaderPluginsModel = SettingsField( - default_factory=LoaderPluginsModel, - title="Loader plugins" - ) - - -DEFAULT_VALUES = { - "imageio": DEFAULT_IMAGEIO_SETTINGS, - "create": DEFAULT_CREATE_SETTINGS, - "publish": DEFAULT_PUBLISH_SETTINGS, - "load": DEFAULT_LOADER_SETTINGS -} diff --git a/server_addon/flame/server/settings/publish_plugins.py b/server_addon/flame/server/settings/publish_plugins.py deleted file mode 100644 index b34083b4e2..0000000000 --- a/server_addon/flame/server/settings/publish_plugins.py +++ /dev/null @@ -1,196 +0,0 @@ -from ayon_server.settings import ( - BaseSettingsModel, - SettingsField, - task_types_enum, -) - - -class XMLPresetAttrsFromCommentsModel(BaseSettingsModel): - _layout = "expanded" - name: str = SettingsField("", title="Attribute name") - type: str = SettingsField( - default_factory=str, - title="Attribute type", - enum_resolver=lambda: ["number", "float", "string"] - ) - - -class AddTasksModel(BaseSettingsModel): - _layout = "expanded" - name: str = SettingsField("", title="Task name") - type: str = SettingsField( - default_factory=str, - title="Task type", - enum_resolver=task_types_enum - ) - create_batch_group: bool = SettingsField( - True, - title="Create batch group" - ) - - -class CollectTimelineInstancesModel(BaseSettingsModel): - _isGroup = True - - xml_preset_attrs_from_comments: list[XMLPresetAttrsFromCommentsModel] = ( - SettingsField( - default_factory=list, - title="XML presets attributes parsable from segment comments" - ) - ) - add_tasks: list[AddTasksModel] = SettingsField( - default_factory=list, - title="Add tasks" - ) - - -class ExportPresetsMappingModel(BaseSettingsModel): - _layout = "expanded" - - name: str = SettingsField( - ..., - title="Name" - ) - active: bool = SettingsField(True, title="Is active") - export_type: str = SettingsField( - "File Sequence", - title="Eport clip type", - enum_resolver=lambda: ["Movie", "File Sequence", "Sequence Publish"] - ) - ext: str = SettingsField("exr", title="Output extension") - xml_preset_file: str = SettingsField( - "OpenEXR (16-bit fp DWAA).xml", - title="XML preset file (with ext)" - ) - colorspace_out: str = SettingsField( - "ACES - ACEScg", - title="Output color (imageio)" - ) - # TODO remove when resolved or v3 is not a thing anymore - # NOTE next 4 attributes were grouped under 'other_parameters' but that - # created inconsistency with v3 settings and harder conversion handling - # - it can be moved back but keep in mind that it must be handled in v3 - # conversion script too - xml_preset_dir: str = SettingsField( - "", - title="XML preset directory" - ) - parsed_comment_attrs: bool = SettingsField( - True, - title="Parsed comment attributes" - ) - representation_add_range: bool = SettingsField( - True, - title="Add range to representation name" - ) - representation_tags: list[str] = SettingsField( - default_factory=list, - title="Representation tags" - ) - load_to_batch_group: bool = SettingsField( - True, - title="Load to batch group reel" - ) - batch_group_loader_name: str = SettingsField( - "LoadClipBatch", - title="Use loader name" - ) - filter_path_regex: str = SettingsField( - ".*", - title="Regex in clip path" - ) - - -class ExtractProductResourcesModel(BaseSettingsModel): - _isGroup = True - - keep_original_representation: bool = SettingsField( - False, - title="Publish clip's original media" - ) - export_presets_mapping: list[ExportPresetsMappingModel] = SettingsField( - default_factory=list, - title="Export presets mapping" - ) - - -class IntegrateBatchGroupModel(BaseSettingsModel): - enabled: bool = SettingsField( - False, - title="Enabled" - ) - - -class PublishPluginsModel(BaseSettingsModel): - CollectTimelineInstances: CollectTimelineInstancesModel = SettingsField( - default_factory=CollectTimelineInstancesModel, - title="Collect Timeline Instances" - ) - - ExtractProductResources: ExtractProductResourcesModel = SettingsField( - default_factory=ExtractProductResourcesModel, - title="Extract Product Resources" - ) - - IntegrateBatchGroup: IntegrateBatchGroupModel = SettingsField( - default_factory=IntegrateBatchGroupModel, - title="IntegrateBatchGroup" - ) - - -DEFAULT_PUBLISH_SETTINGS = { - "CollectTimelineInstances": { - "xml_preset_attrs_from_comments": [ - { - "name": "width", - "type": "number" - }, - { - "name": "height", - "type": "number" - }, - { - "name": "pixelRatio", - "type": "float" - }, - { - "name": "resizeType", - "type": "string" - }, - { - "name": "resizeFilter", - "type": "string" - } - ], - "add_tasks": [ - { - "name": "compositing", - "type": "Compositing", - "create_batch_group": True - } - ] - }, - "ExtractProductResources": { - "keep_original_representation": False, - "export_presets_mapping": [ - { - "name": "exr16fpdwaa", - "active": True, - "export_type": "File Sequence", - "ext": "exr", - "xml_preset_file": "OpenEXR (16-bit fp DWAA).xml", - "colorspace_out": "ACES - ACEScg", - "xml_preset_dir": "", - "parsed_comment_attrs": True, - "representation_add_range": True, - "representation_tags": [], - "load_to_batch_group": True, - "batch_group_loader_name": "LoadClipBatch", - "filter_path_regex": ".*" - } - ] - }, - "IntegrateBatchGroup": { - "enabled": False - } -} From 31a8c67121a3ba758c5893ef6bc250bc4d1e685d Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 12:36:23 +0200 Subject: [PATCH 12/13] Update server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py Co-authored-by: Kayla Man <64118225+moonyuet@users.noreply.github.com> --- .../plugins/publish/extract_active_view_thumbnail.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py index d4db87ec39..e85df4ee81 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py @@ -20,7 +20,7 @@ class ExtractActiveViewThumbnail(plugin.HoudiniExtractorPlugin, families = ["workfile"] def process(self, instance): - if not self.is_active(instance): + if not self.is_active(instance.data): return if IS_HEADLESS: From c18d8fe90f560f8291c00326aa54e7352f21b3c8 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 12:45:19 +0200 Subject: [PATCH 13/13] Update server_addon/houdini/server/settings/publish.py Co-authored-by: Mustafa Taher --- server_addon/houdini/server/settings/publish.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index a50b17445c..2b88f96922 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -99,7 +99,8 @@ class PublishPluginsModel(BaseSettingsModel): title="Validate workfile paths settings") ExtractActiveViewThumbnail: BasicEnabledStatesModel = SettingsField( default_factory=BasicEnabledStatesModel, - title="Extract Active View Thumbnail" + title="Extract Active View Thumbnail", + section="Extractors" )

    T-R> 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 #@(m$_?9k(_cXqui^7Q)TV9%I8PpUGJ1Xgo%_ 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